From 76b3eab6d1aeb02ea96a40e1e9d5cd07c3b8e6f0 Mon Sep 17 00:00:00 2001 From: Rafael Gieschke Date: Wed, 22 Mar 2017 16:00:54 +0100 Subject: [PATCH 001/545] Make TreeUpdate constructible --- generate/input/descriptor.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index f1e26f1df..b9829aa19 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2593,6 +2593,10 @@ } } }, + "tree_update": { + "hasConstructor": true, + "ignoreInit": true + }, "writestream": { "cType": "git_writestream", "needsForwardDeclaration": false From bb4c0bd9720db7d30132a5fc0512b5e86080b429 Mon Sep 17 00:00:00 2001 From: Rafael Gieschke Date: Wed, 22 Mar 2017 18:38:23 +0100 Subject: [PATCH 002/545] Make Tree#createUpdated accept Array --- generate/input/descriptor.json | 10 ++++++++++ generate/templates/partials/convert_from_v8.cc | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index b9829aa19..7e035d283 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2527,6 +2527,16 @@ "tree": { "selfFreeing": true, "functions": { + "git_tree_create_updated": { + "args": { + "updates": { + "cType": "git_tree_update *", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitTreeUpdate" + } + } + }, "git_tree_entry_byid": { "return": { "ownedByThis": true diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index f7c4da469..6e707e1fe 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -48,12 +48,12 @@ {%elsif cppClassName == 'Array'%} Array *tmp_{{ name }} = Array::Cast(*info[{{ jsArg }}]); - from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|replace '**' '*' }})); + from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|unPointer }})); for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) { {%-- // FIXME: should recursively call convertFromv8. --%} - from_{{ name }}[i] = Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(tmp_{{ name }}->Get(Nan::New(static_cast(i)))->ToObject())->GetValue(); + from_{{ name }}[i] = {%if not cType|isDoublePointer %}*{%endif%}Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(tmp_{{ name }}->Get(Nan::New(static_cast(i)))->ToObject())->GetValue(); } {%elsif cppClassName == 'Function'%} {%elsif cppClassName == 'Buffer'%} From 8dae43af3b6941d99018693c44caa5146355e302 Mon Sep 17 00:00:00 2001 From: Rafael Gieschke Date: Wed, 10 May 2017 02:29:19 +0200 Subject: [PATCH 003/545] Add test for Tree#createUpdated --- test/tests/tree.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/tests/tree.js b/test/tests/tree.js index aa98d4f3d..259ca2f86 100644 --- a/test/tests/tree.js +++ b/test/tests/tree.js @@ -39,6 +39,24 @@ describe("Tree", function() { }).done(done); }); + it("updates a tree", function () { + var repo = this.existingRepo; + var update = new NodeGit.TreeUpdate(); + update.action = NodeGit.Tree.UPDATE.REMOVE; + update.path = "README.md"; + return this.commit.getTree().then(function(tree) { + return tree.createUpdated(repo, 1, [update]); + }) + .then(function(treeOid) { + return repo.getTree(treeOid); + }) + .then(function(updatedTree) { + assert.throws(function () { + updatedTree.entryByName("README.md"); + }); + }); + }); + it("walks its entries and returns the same entries on both progress and end", function() { var repo = this.repository; From 0f53a5199adc7ec0a326d56b7d625e6f5f12c884 Mon Sep 17 00:00:00 2001 From: Remy Suen Date: Thu, 21 Dec 2017 07:20:43 +0900 Subject: [PATCH 004/545] `ceiling_dirs` parameter in `Repository.discover` is optional libgit2's git_repository_discover function's ceiling_dirs parameter can be null. Flag the parameter as such in the JSON file so that the NodeGit wrapper API behaves the same way. Signed-off-by: Remy Suen --- generate/input/descriptor.json | 3 +++ test/tests/repository.js | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 54d611ac0..6457b6cab 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2245,6 +2245,9 @@ "isErrorCode": true }, "args": { + "ceiling_dirs": { + "isOptional": true + }, "out": { "isReturn": true, "isSelf": false, diff --git a/test/tests/repository.js b/test/tests/repository.js index be165b303..114c890be 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -200,13 +200,23 @@ describe("Repository", function() { }); }); - it("can discover if a path is part of a repository", function() { + function discover(ceiling) { var testPath = path.join(reposPath, "lib", "util", "normalize_oid.js"); var expectedPath = path.join(reposPath, ".git"); - return NodeGit.Repository.discover(testPath, 0, "") + return NodeGit.Repository.discover(testPath, 0, ceiling) .then(function(foundPath) { assert.equal(expectedPath, foundPath); }); + } + + it("can discover if a path is part of a repository, null ceiling", + function() { + return discover(null); + }); + + it("can discover if a path is part of a repository, empty ceiling", + function() { + return discover(""); }); it("can create a repo using initExt", function() { From 501210d3a4c1109342795a84e1bafe344fa4433f Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 24 Oct 2018 17:29:52 -0700 Subject: [PATCH 005/545] Clean up libssh2 configure step --- generate/templates/templates/binding.gyp | 6 +----- utils/configureLibssh2.js | 18 ++---------------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index dbe70ab5c..3ba0b1e3d 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -5,12 +5,10 @@ ["OS=='win'", { "variables": { "is_electron%": "1", - "openssl_include_dir%": "<(module_root_dir)\\vendor\\openssl" } }, { "variables": { "is_electron%": "1", - "openssl_include_dir%": "<(module_root_dir)/vendor/openssl" } }] ], @@ -19,12 +17,10 @@ ["OS=='win'", { "variables": { "is_electron%": "0", - "openssl_include_dir%": "<(node_root_dir)\\include\\node" } }, { "variables": { "is_electron%": "0", - "openssl_include_dir%": "<(node_root_dir)/include/node" } }] ] @@ -50,7 +46,7 @@ "target_name": "configureLibssh2", "actions": [{ "action_name": "configure", - "action": ["node", "utils/configureLibssh2.js", "<(openssl_include_dir)", "<(is_electron)"], + "action": ["node", "utils/configureLibssh2.js"], "inputs": [""], "outputs": [""] }], diff --git a/utils/configureLibssh2.js b/utils/configureLibssh2.js index 3ee8cd933..befdb4594 100644 --- a/utils/configureLibssh2.js +++ b/utils/configureLibssh2.js @@ -1,5 +1,5 @@ var cp = require("child_process"); -var fse = require('fs-extra'); +var fse = require("fs-extra"); var path = require("path"); const libssh2VendorDirectory = path.resolve(__dirname, "..", "vendor", "libssh2"); @@ -19,27 +19,13 @@ module.exports = function retrieveExternalDependencies() { // Run the `configure` script on Linux return new Promise(function(resolve, reject) { - - var opensslDir = process.argv[2]; - var isElectron = process.argv[3] === "1"; - var opensslIncludes = isElectron ? path.join(opensslDir, "includes") : opensslDir; - var newEnv = {}; Object.keys(process.env).forEach(function(key) { newEnv[key] = process.env[key]; }); - newEnv.CPPFLAGS = newEnv.CPPFLAGS || ""; - newEnv.CPPFLAGS += ` -I${opensslIncludes}`; - newEnv.CPPFLAGS = newEnv.CPPFLAGS.trim(); - - var maybeLibsslPrefix = ""; - if (isElectron) { - maybeLibsslPrefix = ` --with-libssl-prefix=${opensslDir}`; - } - cp.exec( - libssh2ConfigureScript + maybeLibsslPrefix, + libssh2ConfigureScript, { cwd: libssh2VendorDirectory, env: newEnv From caee388f4984ff461748b14fbc5ddb6a72108a7c Mon Sep 17 00:00:00 2001 From: dabutvin Date: Sat, 14 Apr 2018 11:43:10 -0700 Subject: [PATCH 006/545] adds support for gpg commit signing (fixes #1018) --- lib/repository.js | 68 +++++++++++++++++++ test/tests/commit.js | 156 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) diff --git a/lib/repository.js b/lib/repository.js index d5e941134..e7d3c296d 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -622,6 +622,74 @@ Repository.prototype.createCommitBuffer = function( }); }; +/** + * Create a commit that is digitally signed + * + * @async + * @param {Signature} author + * @param {Signature} committer + * @param {String} message + * @param {Tree|Oid|String} Tree + * @param {Array} parents + * @param {String} signature_field typically "gpgsig" + * @param {Function} onSignature Callback to be called with string to be signed + * @return {Oid} The oid of the commit + */ +Repository.prototype.createCommitWithSignature = function( + author, + committer, + message, + tree, + parents, + signature_field, + onSignature, + callback) { + + var repo = this; + var promises = []; + var commit_content; + + parents = parents || []; + + promises.push(repo.getTree(tree)); + + parents.forEach(function(parent) { + promises.push(repo.getCommit(parent)); + }); + + return Promise.all(promises).then(function(results) { + tree = results[0]; + + // Get the normalized values for our input into the function + var parentsLength = parents.length; + parents = []; + + for (var i = 0; i < parentsLength; i++) { + parents.push(results[i + 1]); + } + + return Commit.createBuffer( + repo, + author, + committer, + null /* use default message encoding */, + message, + tree, + parents.length, + parents + ); + }).then(function(commit_contentResult) { + commit_content = commit_contentResult; + return onSignature(commit_content); + }).then(function(signature) { + return Commit.createWithSignature( + repo, + commit_content, + signature, + signature_field); + }, callback); +}; + /** * Creates a new commit on HEAD from the list of passed in files * diff --git a/test/tests/commit.js b/test/tests/commit.js index d6e6a5ce7..79d62a118 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -791,6 +791,162 @@ describe("Commit", function() { }); describe("Commit's Signature", function() { + + it("Can create a signed commit in a repo", function() { + + var signature = "-----BEGIN PGP SIGNATURE-----\n" + + "Version: GnuPG v1.4.12 (Darwin)\n" + + "\n" + + "iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n" + + "o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8\n" + + "JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq\n" + + "AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq\n" + + "SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW\n" + + "who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok\n" + + "6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG\n" + + "cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu\n" + + "c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9\n" + + "ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J\n" + + "7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc\n" + + "cpxtDQQMGYFpXK/71stq\n" + + "=ozeK\n" + + "-----END PGP SIGNATURE-----"; + + function onSignature(dataToSign) { + return new Promise(function (resolve) { + return resolve(signature); + }); + } + + var test = this; + var expectedCommitId = "53bb69297148decb1d75e015f66a7e5f4e0476c9"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + author, + committer, + "message", + treeOid, + [parent], + "gpgsig", + onSignature); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signature, signatureInfo.signature); + + return undoCommit() + .then(function(){ + return reinitialize(test); + }); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); + + it("Can create a signed commit raw", function() { + var expectedCommitId = "cc1401eaac4e9e77190e98a9353b305f0c6313d8"; + + var signature = "-----BEGIN PGP SIGNATURE-----\n\n" + + "iQEcBAABCAAGBQJarBhIAAoJEE8pfTd/81lKQA4IAL8Mu5kc4B/MX9s4XB26Ahap\n" + + "n06kCx3RQ1KHMZIRomAjCnb48WieNVuy1y+Ut0RgfCxxrJ1ZnzFG3kF2bIKwIxNI\n" + + "tYIC76iWny+mrVnb2mjKYjn/3F4c4VJGENq9ITiV1WeE4yJ8dHw2ox2D+hACzTvQ\n" + + "KVroedk8BDFJxS6DFb20To35xbAVhwBnAGRcII4Wi5PPMFpqAhGLfq3Czv95ddSz\n" + + "BHlyp27+YWSpV0Og0dqOEhsdDYaPrOBGRcoRiqjue+l5tgK/QerLFZ4aovZzpuEP\n" + + "Xx1yZfqXIiy4Bo40qScSrdnmnp/kMq/NQGR3jYU+SleFHVKNFsya9UwurMaezY0=\n" + + "=eZzi\n-----END PGP SIGNATURE-----"; + + var commit_content = "tree f4661419a6fbbe865f78644fec722c023ce4b65f\n" + + "parent 32789a79e71fbc9e04d3eff7425e1771eb595150\n" + + "author Tyler Ang-Wanek 1521227848 -0700\n" + + "committer Tyler Ang-Wanek 1521227848 -0700\n\n" + + "GPG Signed commit\n"; + + var repo; + var commit; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return Commit.createWithSignature( + repo, + commit_content, + signature, + "gpgsig"); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getSignature(); + }) + .then(function(signatureInfoDefault) { + assert.equal(signature, signatureInfoDefault.signature); + assert.equal(commit_content, signatureInfoDefault.signedData); + + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signature, signatureInfo.signature); + assert.equal(commit_content, signatureInfo.signedData); + }); + }); + it("Can retrieve the gpg signature from a commit", function() { var expectedSignedData = "tree f4661419a6fbbe865f78644fec722c023ce4b65f\n" + From 6f6ff3b36fb6a4490a0de7278af4c8d9e1bccf52 Mon Sep 17 00:00:00 2001 From: Dan Butvinik Date: Thu, 13 Dec 2018 08:11:46 -0800 Subject: [PATCH 007/545] remove callback from createCommitWithSignature --- lib/repository.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index e7d3c296d..8a193c606 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -642,8 +642,7 @@ Repository.prototype.createCommitWithSignature = function( tree, parents, signature_field, - onSignature, - callback) { + onSignature) { var repo = this; var promises = []; @@ -687,7 +686,7 @@ Repository.prototype.createCommitWithSignature = function( commit_content, signature, signature_field); - }, callback); + }); }; /** From 90e9d892bee058aa99e7e972ebb9a9b18dcbc5b5 Mon Sep 17 00:00:00 2001 From: dabutvin Date: Sat, 15 Dec 2018 22:42:21 -0800 Subject: [PATCH 008/545] add final newline to commit buffer - the commit that gets created and the signed content have to match --- lib/repository.js | 2 +- test/tests/commit.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index 8a193c606..312811df8 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -678,7 +678,7 @@ Repository.prototype.createCommitWithSignature = function( parents ); }).then(function(commit_contentResult) { - commit_content = commit_contentResult; + commit_content = commit_contentResult + "\n"; return onSignature(commit_content); }).then(function(signature) { return Commit.createWithSignature( diff --git a/test/tests/commit.js b/test/tests/commit.js index 79d62a118..debefebc5 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -819,7 +819,7 @@ describe("Commit", function() { } var test = this; - var expectedCommitId = "53bb69297148decb1d75e015f66a7e5f4e0476c9"; + var expectedCommitId = "ccb99bb20716ef7c37e92c7b8db029a7af7f747b"; var fileName = "newfile.txt"; var fileContent = "hello world"; From 612f76fc6afae1f4da30e0d87232b2d3178c7679 Mon Sep 17 00:00:00 2001 From: Remy Suen Date: Tue, 18 Dec 2018 08:36:40 -0500 Subject: [PATCH 009/545] Check parameters before performing reset If a promise is passed down to the native C++ layer, v8 will crash. To ensure that this does not happen, a check will be performed in the JavaScript layer to verify that the repository is the same as the repository of the commit object. While logically the commit of one repository instance is the same as a commit of another repository instance (if they point to the same .git folder), programmatically they are not equivalent as a check is done on libgit2's side to ensure that they come from the same thing. As a result, the check on the JavaScript side purely compares the pointers over some other logical piece of information (such as its path or working directory). Signed-off-by: Remy Suen --- lib/reset.js | 6 +++++- test/tests/reset.js | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/reset.js b/lib/reset.js index 18a7ebfe1..ab257b7dd 100644 --- a/lib/reset.js +++ b/lib/reset.js @@ -45,7 +45,11 @@ Reset.default = function(repo, target, pathspecs) { */ Reset.reset = function(repo, target, resetType, opts) { opts = normalizeOptions(opts, NodeGit.CheckoutOptions); - + if (repo !== target.repo) { + // this is the same that is performed on libgit2's side + // https://github.com/nodegit/libgit2/blob/8d89e409616831b7b30a5ca7b89354957137b65e/src/reset.c#L120-L124 + throw new Error("Repository and target commit's repository does not match"); + } return _reset.call(this, repo, target, resetType, opts); }; diff --git a/test/tests/reset.js b/test/tests/reset.js index 47cd40779..214bf08fd 100644 --- a/test/tests/reset.js +++ b/test/tests/reset.js @@ -269,4 +269,43 @@ describe("Reset", function() { return Reset.reset(test.repo, test.currentCommit, Reset.TYPE.HARD); }); }); + + it("reset fails if parameter is not a Commit object", function() { + var test = this; + var commit = test.repo.getReferenceCommit("master"); + try { + Reset.reset(test.repo, commit, Reset.TYPE.HARD); + assert.fail( + "Should not be able to pass a Promise (Commit) into the function" + ); + } catch (err) { + // ok + assert.equal( + "Repository and target commit's repository does not match", + err.message + ); + } + }); + + it("reset fails if originating repository is not the same", function() { + var test = this; + var testCommit = null; + return test.repo.getReferenceCommit("master") + .then(function(commit) { + testCommit = commit; + return Repository.open(reposPath); + }) + .then(function(repo) { + return Reset.reset(repo, testCommit, Reset.TYPE.HARD); + }) + .then(function() { + assert.fail("Different source repository instance should fail"); + }) + .catch(function(err) { + assert.equal( + "Repository and target commit's repository does not match", + err.message + ); + }); + }); }); From 4b5d31307807b42e5d03c74b909d9e3eb57305d4 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 17 Dec 2018 09:27:35 -0700 Subject: [PATCH 010/545] Remove ssl and crypto dependency on non-electron builds --- generate/templates/templates/binding.gyp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index b1aada5cd..f576ed8bb 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -189,13 +189,17 @@ ], [ "OS=='linux' or OS.endswith('bsd')", { + "cflags": [ + "-std=c++11" + ] + } + ], + [ + "OS.endswith('bsd') or (node_root_dir.split('/')[-1].startswith('iojs') and OS=='linux')", { "libraries": [ "-lcrypto", "-lssl" ], - "cflags": [ - "-std=c++11" - ] } ] ] From ec5f1c95ae0935c134c0af63419307091c07e0b9 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 20 Dec 2018 14:48:39 -0700 Subject: [PATCH 011/545] Don't try to normalize mergeOpts unless mergeOpts is defined. --- lib/revert.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/revert.js b/lib/revert.js index 2dddb2cee..84c05b5c9 100644 --- a/lib/revert.js +++ b/lib/revert.js @@ -50,7 +50,7 @@ Revert.commit = function( /** * Reverts the given commit, producing changes in the index and * working directory. - * + * * @async * @param {Repository} repo the repository to perform the revert in * @param {Commit} commit the commit to revert @@ -71,7 +71,7 @@ Revert.revert = function(repo, commit, revertOpts) { revertOpts = normalizeOptions(revertOpts, NodeGit.RevertOptions); - if (revertOpts) { + if (mergeOpts) { revertOpts.mergeOpts = normalizeOptions(mergeOpts, NodeGit.MergeOptions); } From 6085c6c3ae661399b1c455cb645bbef2da80d323 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Mon, 7 Jan 2019 16:22:36 -0700 Subject: [PATCH 012/545] Simplify is_electron condition --- generate/templates/templates/binding.gyp | 28 +++++------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 3ba0b1e3d..a0d1a88d9 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -1,29 +1,13 @@ { "conditions": [ ["(OS=='win' and node_root_dir.split('\\\\')[-1].startswith('iojs')) or (OS=='mac' and node_root_dir.split('/')[-1].startswith('iojs'))", { - "conditions": [ - ["OS=='win'", { - "variables": { - "is_electron%": "1", - } - }, { - "variables": { - "is_electron%": "1", - } - }] - ], + "variables": { + "is_electron%": "1", + } }, { - "conditions": [ - ["OS=='win'", { - "variables": { - "is_electron%": "0", - } - }, { - "variables": { - "is_electron%": "0", - } - }] - ] + "variables": { + "is_electron%": "0", + } }] ], From 76deb93752ed93710d864fbd476d44b6d17fbb87 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 16 Jan 2019 10:40:06 -0700 Subject: [PATCH 013/545] Fix checkout bug in our fork of libgit2 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index e634ccf4b..1aae32d20 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit e634ccf4be1ed60b89f0f3582ca8611d47c400d4 +Subproject commit 1aae32d20abc736ca1818aedd34dd945b6508f72 From d99c32742f0c5825997df2f85094f3d69478b186 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 16 Jan 2019 12:20:23 -0700 Subject: [PATCH 014/545] Add test to prevent regression of Revert.revert options segfault --- test/tests/revert.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/tests/revert.js b/test/tests/revert.js index 8733c870f..46263e7b9 100644 --- a/test/tests/revert.js +++ b/test/tests/revert.js @@ -74,4 +74,11 @@ describe("Revert", function() { throw error; }); }); + + it("RevertOptions without MergeOptions should not segfault", function() { + return Revert.revert(test.repository, test.firstCommit, {}) + .catch(function(error) { + throw error; + }); + }); }); From f2519b8fed66762163581fda239628ffb5b29d2b Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 16 Jan 2019 13:26:37 -0700 Subject: [PATCH 015/545] Bump to v0.24.0 --- CHANGELOG.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24a325fce..35d8d9e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,78 @@ # Change Log +## v0.24.0 [(2019-01-16)](https://github.com/nodegit/nodegit/releases/tag/v0.24.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.23.0...v0.24.0) + +#### Summary of changes +- Garbage collect most of the library. +- All free functions have been removed. The expectation is that they will be collected by the GC. +- All init options methods have been removed. They were never supposed to be exposed in the first place. +- Added support for performing history walks on directories. +- Fix various bugs that led to segfaults or incorrect behavior. +- Removed ssl and crypto dependency from non-electron builds. + +##### Removed methods +Mostly due to missing support anyway, please report anything you were using as an issue. + - NodeGit.Blob.createFromStreamCommit + - NodeGit.Branch.Iterator.prototype.new + - NodeGit.Config.initBackend + - NodeGit.Config.prototype.snapshot + - NodeGit.Config.prototype.setBool + - NodeGit.Config.prototype.setInt32 + - NodeGit.Config.prototype.setInt64 + - NodeGit.Index.prototype.owner + - NodeGit.Note.iteratorNew + - NodeGit.Note.next + - NodeGit.Odb.prototype.addDiskAlternate + - NodeGit.Repository.prototype.configSnapshot + - NodeGit.Signature.prototype.dup + - NodeGit.Tag.foreach + - NodeGit.Transport.init + - NodeGit.Transport.sshWithPaths + - NodeGit.Transport.unregister + +##### Newly exposed methods: + - NodeGit.Config.prototype.getEntry + - NodeGit.Config.prototype.snapshot + - NodeGit.Config.prototype.refresh + - NodeGit.Config.prototype.setBool + - NodeGit.Config.prototype.setInt32 + - NodeGit.Config.prototype.setInt64 + - NodeGit.Diff.prototype.isSortedIcase + - NodeGit.DiffStats.prototype.deletions + - NodeGit.DiffStats.prototype.filesChanged + - NodeGit.DiffStats.prototype.insertions + - NodeGit.DiffStats.prototype.toBuf + - NodeGit.Odb.hashfile + - NodeGit.Odb.prototype.readPrefix + - NodeGit.OidShorten.prototype.add + - NodeGit.OidShorten.create + - NodeGit.PathspecMatchList.prototype.diffEntry + - NodeGit.PathspecMatchList.prototype.entry + - NodeGit.PathspecMatchList.prototype.entrycount + - NodeGit.PathspecMatchList.prototype.failedEntry + - NodeGit.PathspecMatchList.prototype.failedEntryCount + +##### Newly exposed types + - NodeGit.DescribeFormatOptions + - NodeGit.DiffStats + - NodeGit.OidShorten + - NodeGit.PathspecMatchList + +#### Merged PRs into NodeGit +- [Garbage collection: Free mostly everything automatically #1570](https://github.com/nodegit/nodegit/pull/1570) +- [Fix typo in GitHub issue template #1586](https://github.com/nodegit/nodegit/pull/1586) +- [More suitable example about Signature #1582](https://github.com/nodegit/nodegit/pull/1582) +- [Add support for directories when using `fileHistoryWalk` #1583](https://github.com/nodegit/nodegit/pull/1583) +- [Add a test for Repository's getReferenceCommit #1601](https://github.com/nodegit/nodegit/pull/1601) +- [Check parameters before performing reset #1603](https://github.com/nodegit/nodegit/pull/1603) +- [Remove ssl and crypto dependency on non-electron builds #1600](https://github.com/nodegit/nodegit/pull/1600) +- [Clean up libssh2 configure step #1574](https://github.com/nodegit/nodegit/pull/1574) +- [Fix checkout bug in our fork of libgit2 #1609](https://github.com/nodegit/nodegit/pull/1609) +- [Fix segfault in NodeGit.Revert.revert #1605](https://github.com/nodegit/nodegit/pull/1605) + + ## v0.24.0-alpha.1 [(2018-10-25)](https://github.com/nodegit/nodegit/releases/tag/v0.24.0-alpha.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.23.0...v0.24.0-alpha.1) diff --git a/package-lock.json b/package-lock.json index f98c11bc7..7f93cb65c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.24.0-alpha.1", + "version": "0.24.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b66f59619..8fc88751b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.24.0-alpha.1", + "version": "0.24.0", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From f70ddd103492ee188cf8e246df6a1aa2246bfc68 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Thu, 17 Jan 2019 14:00:41 -0700 Subject: [PATCH 016/545] Add `updateRef` functionality to Repository#createCommitWithSignature --- lib/repository.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/repository.js b/lib/repository.js index 312811df8..4d719cbd8 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -174,6 +174,22 @@ function getPathHunks(repo, index, filePath, isStaged, additionalDiffOptions) { }); } +function getReflogMessageForCommit(commit) { + var parentCount = commit.parentcount(); + var summary = commit.summary(); + var commitType; + + if (parentCount >= 2) { + commitType = " (merge)"; + } else if (parentCount == 0) { + commitType = " (initial)"; + } else { + commitType = ""; + } + + return `commit${commitType}: ${summary}`; +} + /** * Goes through a rebase's rebase operations and commits them if there are * no merge conflicts @@ -626,6 +642,7 @@ Repository.prototype.createCommitBuffer = function( * Create a commit that is digitally signed * * @async + * @param {String} updateRef * @param {Signature} author * @param {Signature} committer * @param {String} message @@ -636,6 +653,7 @@ Repository.prototype.createCommitBuffer = function( * @return {Oid} The oid of the commit */ Repository.prototype.createCommitWithSignature = function( + updateRef, author, committer, message, @@ -647,6 +665,8 @@ Repository.prototype.createCommitWithSignature = function( var repo = this; var promises = []; var commit_content; + var commit_oid; + var commit; parents = parents || []; @@ -686,6 +706,16 @@ Repository.prototype.createCommitWithSignature = function( commit_content, signature, signature_field); + }).then(function(commit_oidResult) { + commit_oid = commit_oidResult; + return repo.getCommit(commit_oid); + }).then(function(commitResult) { + commit = commitResult; + return repo.getReference(updateRef); + }).then(function(ref) { + return ref.setTarget(commit_oid, getReflogMessageForCommit(commit)); + }).then(function() { + return commit_oid; }); }; From e693f3239f1c7f44c9299e9cfdb6aa676b41ba0c Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Fri, 18 Jan 2019 09:18:10 -0700 Subject: [PATCH 017/545] Skip updating refs if `updateRefs` not given --- lib/repository.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index 4d719cbd8..cc726eae6 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -676,7 +676,7 @@ Repository.prototype.createCommitWithSignature = function( promises.push(repo.getCommit(parent)); }); - return Promise.all(promises).then(function(results) { + const createCommitPromise = Promise.all(promises).then(function(results) { tree = results[0]; // Get the normalized values for our input into the function @@ -706,7 +706,13 @@ Repository.prototype.createCommitWithSignature = function( commit_content, signature, signature_field); - }).then(function(commit_oidResult) { + }); + + if (!updateRef) { + return createCommitPromise; + } + + return createCommitPromise.then(function(commit_oidResult) { commit_oid = commit_oidResult; return repo.getCommit(commit_oid); }).then(function(commitResult) { From b7f542c00fee2c847cf37c3f37b5bfbc28d0e2da Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Tue, 22 Jan 2019 09:38:21 -0700 Subject: [PATCH 018/545] Adjust Repository#createCommitWithSignature to account for `updateRef` --- test/tests/commit.js | 106 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/test/tests/commit.js b/test/tests/commit.js index debefebc5..395b0eebe 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -867,6 +867,7 @@ describe("Commit", function() { var committer = signatures[1]; return repo.createCommitWithSignature( + null, author, committer, "message", @@ -884,7 +885,112 @@ describe("Commit", function() { }) .then(function(signatureInfo) { assert.equal(signature, signatureInfo.signature); + return reinitialize(test); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); + + it("Can create a signed commit in a repo and update refs", function() { + + var signature = "-----BEGIN PGP SIGNATURE-----\n" + + "Version: GnuPG v1.4.12 (Darwin)\n" + + "\n" + + "iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n" + + "o6IoMAhv0Z/LHlWhzBd9e7JeCnanRt12bAU7yvYp9+Z+z+dbwqLwDoFp8LVuigl8\n" + + "JGLcnwiUW3rSvhjdCp9irdb4+bhKUnKUzSdsR2CK4/hC0N2i/HOvMYX+BRsvqweq\n" + + "AsAkA6dAWh+gAfedrBUkCTGhlNYoetjdakWqlGL1TiKAefEZrtA1TpPkGn92vbLq\n" + + "SphFRUY9hVn1ZBWrT3hEpvAIcZag3rTOiRVT1X1flj8B2vGCEr3RrcwOIZikpdaW\n" + + "who/X3xh/DGbI2RbuxmmJpxxP/8dsVchRJJzBwG+yhwU/iN3MlV2c5D69tls/Dok\n" + + "6VbyU4lm/ae0y3yR83D9dUlkycOnmmlBAHKIZ9qUts9X7mWJf0+yy2QxJVpjaTGG\n" + + "cmnQKKPeNIhGJk2ENnnnzjEve7L7YJQF6itbx5VCOcsGh3Ocb3YR7DMdWjt7f8pu\n" + + "c6j+q1rP7EpE2afUN/geSlp5i3x8aXZPDj67jImbVCE/Q1X9voCtyzGJH7MXR0N9\n" + + "ZpRF8yzveRfMH8bwAJjSOGAFF5XkcR/RNY95o+J+QcgBLdX48h+ZdNmUf6jqlu3J\n" + + "7KmTXXQcOVpN6dD3CmRFsbjq+x6RHwa8u1iGn+oIkX908r97ckfB/kHKH7ZdXIJc\n" + + "cpxtDQQMGYFpXK/71stq\n" + + "=ozeK\n" + + "-----END PGP SIGNATURE-----"; + + function onSignature(dataToSign) { + return new Promise(function (resolve) { + return resolve(signature); + }); + } + + var test = this; + var expectedCommitId = "ccb99bb20716ef7c37e92c7b8db029a7af7f747b"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + return repo.createCommitWithSignature( + "HEAD", + author, + committer, + "message", + treeOid, + [parent], + "gpgsig", + onSignature); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signature, signatureInfo.signature); + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + assert.equal(expectedCommitId, headCommit.id()); return undoCommit() .then(function(){ return reinitialize(test); From 83c6cd78ede652d30865698ee84f87eea9176218 Mon Sep 17 00:00:00 2001 From: Jakub Kukul Date: Wed, 23 Jan 2019 13:57:52 +0800 Subject: [PATCH 019/545] Fix documentation reference. --- lib/repository.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/repository.js b/lib/repository.js index cc726eae6..9d621d67f 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -808,7 +808,7 @@ Repository.prototype.createLightweightTag = function(oid, name, callback) { * See also `Commit.prototype.history()` * * @param {String|Oid} String sha or Oid - * @return {RevWalk} + * @return {Revwalk} */ Repository.prototype.createRevWalk = function() { return Revwalk.create(this); From 63b41757e9372c6e031bb162261a6b0116cfab1e Mon Sep 17 00:00:00 2001 From: Jakub Kukul Date: Wed, 23 Jan 2019 13:58:08 +0800 Subject: [PATCH 020/545] Remove obsolete argument from documentation. --- lib/repository.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/repository.js b/lib/repository.js index 9d621d67f..1962d894d 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -807,7 +807,6 @@ Repository.prototype.createLightweightTag = function(oid, name, callback) { * Instantiate a new revision walker for browsing the Repository"s history. * See also `Commit.prototype.history()` * - * @param {String|Oid} String sha or Oid * @return {Revwalk} */ Repository.prototype.createRevWalk = function() { From 911ab17f799c0fcce2130aadf3e8a007268a6485 Mon Sep 17 00:00:00 2001 From: Andres Kalle Date: Sat, 26 Jan 2019 20:58:26 +0200 Subject: [PATCH 021/545] Marked Repository.createBlobFromBuffer as async It returns `Blob.createFromBuffer(...)` which calls [an async function](https://www.nodegit.org/api/blob/#createFromBuffer) --- lib/repository.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/repository.js b/lib/repository.js index 1962d894d..aa85eab9d 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -537,6 +537,7 @@ Repository.prototype.createBranch = function(name, commit, force) { /** * Create a blob from a buffer * + * @async * @param {Buffer} buffer * @return {Oid} */ From 2d439f44288150c7249a388c19f949e477d2c7f6 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 28 Jan 2019 07:21:14 -0700 Subject: [PATCH 022/545] WIP bump libgit2 vendor to pre v0.28.0 --- generate/input/libgit2-docs.json | 9307 +++++++++++++++++++++--------- vendor/libgit2 | 2 +- 2 files changed, 6570 insertions(+), 2739 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 75f9a46af..82bfd8a1a 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -1,33 +1,35 @@ { "files": [ { - "file": "annotated_commit.h", + "file": "git2/annotated_commit.h", "functions": [ "git_annotated_commit_from_ref", "git_annotated_commit_from_fetchhead", "git_annotated_commit_lookup", "git_annotated_commit_from_revspec", "git_annotated_commit_id", + "git_annotated_commit_ref", "git_annotated_commit_free" ], "meta": {}, - "lines": 112 + "lines": 121 }, { - "file": "attr.h", + "file": "git2/attr.h", "functions": [ "git_attr_value", "git_attr_get", "git_attr_get_many", + "git_attr_foreach_cb", "git_attr_foreach", "git_attr_cache_flush", "git_attr_add_macro" ], "meta": {}, - "lines": 240 + "lines": 251 }, { - "file": "blame.h", + "file": "git2/blame.h", "functions": [ "git_blame_init_options", "git_blame_get_hunk_count", @@ -38,10 +40,10 @@ "git_blame_free" ], "meta": {}, - "lines": 207 + "lines": 224 }, { - "file": "blob.h", + "file": "git2/blob.h", "functions": [ "git_blob_lookup", "git_blob_lookup_prefix", @@ -63,7 +65,7 @@ "lines": 228 }, { - "file": "branch.h", + "file": "git2/branch.h", "functions": [ "git_branch_create", "git_branch_create_from_annotated", @@ -76,15 +78,19 @@ "git_branch_name", "git_branch_upstream", "git_branch_set_upstream", + "git_branch_upstream_name", "git_branch_is_head", - "git_branch_is_checked_out" + "git_branch_is_checked_out", + "git_branch_remote_name", + "git_branch_upstream_remote" ], "meta": {}, - "lines": 258 + "lines": 288 }, { - "file": "buffer.h", + "file": "git2/buffer.h", "functions": [ + "git_buf_dispose", "git_buf_free", "git_buf_grow", "git_buf_set", @@ -92,10 +98,10 @@ "git_buf_contains_nul" ], "meta": {}, - "lines": 122 + "lines": 134 }, { - "file": "checkout.h", + "file": "git2/checkout.h", "functions": [ "git_checkout_notify_cb", "git_checkout_progress_cb", @@ -106,20 +112,20 @@ "git_checkout_tree" ], "meta": {}, - "lines": 361 + "lines": 362 }, { - "file": "cherrypick.h", + "file": "git2/cherrypick.h", "functions": [ "git_cherrypick_init_options", "git_cherrypick_commit", "git_cherrypick" ], "meta": {}, - "lines": 84 + "lines": 86 }, { - "file": "clone.h", + "file": "git2/clone.h", "functions": [ "git_remote_create_cb", "git_repository_create_cb", @@ -127,10 +133,10 @@ "git_clone" ], "meta": {}, - "lines": 203 + "lines": 205 }, { - "file": "commit.h", + "file": "git2/commit.h", "functions": [ "git_commit_lookup", "git_commit_lookup_prefix", @@ -146,6 +152,8 @@ "git_commit_time_offset", "git_commit_committer", "git_commit_author", + "git_commit_committer_with_mailmap", + "git_commit_author_with_mailmap", "git_commit_raw_header", "git_commit_tree", "git_commit_tree_id", @@ -163,22 +171,23 @@ "git_commit_dup" ], "meta": {}, - "lines": 474 + "lines": 502 }, { - "file": "common.h", + "file": "git2/common.h", "functions": [ "git_libgit2_version", "git_libgit2_features", "git_libgit2_opts" ], "meta": {}, - "lines": 352 + "lines": 393 }, { - "file": "config.h", + "file": "git2/config.h", "functions": [ "git_config_entry_free", + "git_config_foreach_cb", "git_config_find_global", "git_config_find_xdg", "git_config_find_system", @@ -223,10 +232,10 @@ "git_config_lock" ], "meta": {}, - "lines": 751 + "lines": 762 }, { - "file": "cred_helpers.h", + "file": "git2/cred_helpers.h", "functions": [ "git_cred_userpass" ], @@ -234,18 +243,20 @@ "lines": 48 }, { - "file": "describe.h", + "file": "git2/describe.h", "functions": [ + "git_describe_init_options", + "git_describe_init_format_options", "git_describe_commit", "git_describe_workdir", "git_describe_format", "git_describe_result_free" ], "meta": {}, - "lines": 161 + "lines": 184 }, { - "file": "diff.h", + "file": "git2/diff.h", "functions": [ "git_diff_notify_cb", "git_diff_progress_cb", @@ -289,10 +300,10 @@ "git_diff_patchid" ], "meta": {}, - "lines": 1452 + "lines": 1502 }, { - "file": "errors.h", + "file": "git2/errors.h", "functions": [ "giterr_last", "giterr_clear", @@ -300,10 +311,10 @@ "giterr_set_oom" ], "meta": {}, - "lines": 149 + "lines": 156 }, { - "file": "filter.h", + "file": "git2/filter.h", "functions": [ "git_filter_list_load", "git_filter_list_contains", @@ -319,7 +330,7 @@ "lines": 210 }, { - "file": "global.h", + "file": "git2/global.h", "functions": [ "git_libgit2_init", "git_libgit2_shutdown" @@ -328,7 +339,7 @@ "lines": 39 }, { - "file": "graph.h", + "file": "git2/graph.h", "functions": [ "git_graph_ahead_behind", "git_graph_descendant_of" @@ -337,7 +348,7 @@ "lines": 54 }, { - "file": "ignore.h", + "file": "git2/ignore.h", "functions": [ "git_ignore_add_rule", "git_ignore_clear_internal_rules", @@ -347,7 +358,7 @@ "lines": 74 }, { - "file": "index.h", + "file": "git2/index.h", "functions": [ "git_index_matched_path_cb", "git_index_open", @@ -395,8 +406,9 @@ "lines": 806 }, { - "file": "indexer.h", + "file": "git2/indexer.h", "functions": [ + "git_indexer_init_options", "git_indexer_new", "git_indexer_append", "git_indexer_commit", @@ -404,10 +416,32 @@ "git_indexer_free" ], "meta": {}, - "lines": 72 + "lines": 98 }, { - "file": "merge.h", + "file": "git2/inttypes.h", + "functions": [ + "imaxdiv" + ], + "meta": {}, + "lines": 298 + }, + { + "file": "git2/mailmap.h", + "functions": [ + "git_mailmap_new", + "git_mailmap_free", + "git_mailmap_add_entry", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ], + "meta": {}, + "lines": 111 + }, + { + "file": "git2/merge.h", "functions": [ "git_merge_file_init_input", "git_merge_file_init_options", @@ -426,10 +460,10 @@ "git_merge" ], "meta": {}, - "lines": 585 + "lines": 587 }, { - "file": "message.h", + "file": "git2/message.h", "functions": [ "git_message_prettify", "git_message_trailers", @@ -439,7 +473,7 @@ "lines": 79 }, { - "file": "net.h", + "file": "git2/net.h", "functions": [ "git_headlist_cb" ], @@ -447,7 +481,7 @@ "lines": 55 }, { - "file": "notes.h", + "file": "git2/notes.h", "functions": [ "git_note_foreach_cb", "git_note_iterator_new", @@ -465,13 +499,14 @@ "git_note_remove", "git_note_commit_remove", "git_note_free", + "git_note_default_ref", "git_note_foreach" ], "meta": {}, "lines": 302 }, { - "file": "object.h", + "file": "git2/object.h", "functions": [ "git_object_lookup", "git_object_lookup_prefix", @@ -492,7 +527,7 @@ "lines": 237 }, { - "file": "odb.h", + "file": "git2/odb.h", "functions": [ "git_odb_foreach_cb", "git_odb_new", @@ -532,7 +567,7 @@ "lines": 544 }, { - "file": "odb_backend.h", + "file": "git2/odb_backend.h", "functions": [ "git_odb_backend_pack", "git_odb_backend_loose", @@ -542,7 +577,7 @@ "lines": 130 }, { - "file": "oid.h", + "file": "git2/oid.h", "functions": [ "git_oid_fromstr", "git_oid_fromstrp", @@ -568,7 +603,7 @@ "lines": 264 }, { - "file": "oidarray.h", + "file": "git2/oidarray.h", "functions": [ "git_oidarray_free" ], @@ -576,7 +611,7 @@ "lines": 34 }, { - "file": "pack.h", + "file": "git2/pack.h", "functions": [ "git_packbuilder_new", "git_packbuilder_set_threads", @@ -585,8 +620,10 @@ "git_packbuilder_insert_commit", "git_packbuilder_insert_walk", "git_packbuilder_insert_recur", + "git_packbuilder_write_buf", "git_packbuilder_write", "git_packbuilder_hash", + "git_packbuilder_foreach_cb", "git_packbuilder_foreach", "git_packbuilder_object_count", "git_packbuilder_written", @@ -598,7 +635,7 @@ "lines": 236 }, { - "file": "patch.h", + "file": "git2/patch.h", "functions": [ "git_patch_from_diff", "git_patch_from_blobs", @@ -619,7 +656,7 @@ "lines": 268 }, { - "file": "pathspec.h", + "file": "git2/pathspec.h", "functions": [ "git_pathspec_new", "git_pathspec_free", @@ -639,15 +676,15 @@ "lines": 277 }, { - "file": "proxy.h", + "file": "git2/proxy.h", "functions": [ "git_proxy_init_options" ], "meta": {}, - "lines": 88 + "lines": 92 }, { - "file": "rebase.h", + "file": "git2/rebase.h", "functions": [ "git_rebase_init_options", "git_rebase_init", @@ -663,10 +700,10 @@ "git_rebase_free" ], "meta": {}, - "lines": 316 + "lines": 319 }, { - "file": "refdb.h", + "file": "git2/refdb.h", "functions": [ "git_refdb_new", "git_refdb_open", @@ -677,7 +714,7 @@ "lines": 63 }, { - "file": "reflog.h", + "file": "git2/reflog.h", "functions": [ "git_reflog_read", "git_reflog_write", @@ -697,7 +734,7 @@ "lines": 166 }, { - "file": "refs.h", + "file": "git2/refs.h", "functions": [ "git_reference_lookup", "git_reference_name_to_id", @@ -719,6 +756,8 @@ "git_reference_delete", "git_reference_remove", "git_reference_list", + "git_reference_foreach_cb", + "git_reference_foreach_name_cb", "git_reference_foreach", "git_reference_foreach_name", "git_reference_dup", @@ -745,8 +784,10 @@ "lines": 744 }, { - "file": "refspec.h", + "file": "git2/refspec.h", "functions": [ + "git_refspec_parse", + "git_refspec_free", "git_refspec_src", "git_refspec_dst", "git_refspec_string", @@ -758,10 +799,10 @@ "git_refspec_rtransform" ], "meta": {}, - "lines": 100 + "lines": 117 }, { - "file": "remote.h", + "file": "git2/remote.h", "functions": [ "git_remote_create", "git_remote_create_with_fetchspec", @@ -810,10 +851,10 @@ "git_remote_default_branch" ], "meta": {}, - "lines": 850 + "lines": 852 }, { - "file": "repository.h", + "file": "git2/repository.h", "functions": [ "git_repository_open", "git_repository_open_from_worktree", @@ -828,6 +869,7 @@ "git_repository_head", "git_repository_head_for_worktree", "git_repository_head_detached", + "git_repository_head_detached_for_worktree", "git_repository_head_unborn", "git_repository_is_empty", "git_repository_item_path", @@ -845,7 +887,9 @@ "git_repository_message", "git_repository_message_remove", "git_repository_state_cleanup", + "git_repository_fetchhead_foreach_cb", "git_repository_fetchhead_foreach", + "git_repository_mergehead_foreach_cb", "git_repository_mergehead_foreach", "git_repository_hashfile", "git_repository_set_head", @@ -860,10 +904,10 @@ "git_repository_set_ident" ], "meta": {}, - "lines": 862 + "lines": 864 }, { - "file": "reset.h", + "file": "git2/reset.h", "functions": [ "git_reset", "git_reset_from_annotated", @@ -873,17 +917,17 @@ "lines": 107 }, { - "file": "revert.h", + "file": "git2/revert.h", "functions": [ "git_revert_init_options", "git_revert_commit", "git_revert" ], "meta": {}, - "lines": 84 + "lines": 86 }, { - "file": "revparse.h", + "file": "git2/revparse.h", "functions": [ "git_revparse_single", "git_revparse_ext", @@ -893,7 +937,7 @@ "lines": 108 }, { - "file": "revwalk.h", + "file": "git2/revwalk.h", "functions": [ "git_revwalk_new", "git_revwalk_reset", @@ -918,7 +962,7 @@ "lines": 291 }, { - "file": "signature.h", + "file": "git2/signature.h", "functions": [ "git_signature_new", "git_signature_now", @@ -931,8 +975,9 @@ "lines": 99 }, { - "file": "stash.h", + "file": "git2/stash.h", "functions": [ + "git_stash_save", "git_stash_apply_progress_cb", "git_stash_apply_init_options", "git_stash_apply", @@ -942,10 +987,10 @@ "git_stash_pop" ], "meta": {}, - "lines": 253 + "lines": 256 }, { - "file": "status.h", + "file": "git2/status.h", "functions": [ "git_status_cb", "git_status_init_options", @@ -959,10 +1004,16 @@ "git_status_should_ignore" ], "meta": {}, - "lines": 370 + "lines": 374 + }, + { + "file": "git2/stdint.h", + "functions": [], + "meta": {}, + "lines": 124 }, { - "file": "strarray.h", + "file": "git2/strarray.h", "functions": [ "git_strarray_free", "git_strarray_copy" @@ -971,7 +1022,7 @@ "lines": 53 }, { - "file": "submodule.h", + "file": "git2/submodule.h", "functions": [ "git_submodule_cb", "git_submodule_update_init_options", @@ -1008,10 +1059,19 @@ "git_submodule_location" ], "meta": {}, - "lines": 632 + "lines": 633 }, { - "file": "sys/commit.h", + "file": "git2/sys/alloc.h", + "functions": [ + "git_stdalloc_init_allocator", + "git_win32_crtdbg_init_allocator" + ], + "meta": {}, + "lines": 97 + }, + { + "file": "git2/sys/commit.h", "functions": [ "git_commit_create_from_ids", "git_commit_create_from_callback" @@ -1020,7 +1080,7 @@ "lines": 76 }, { - "file": "sys/config.h", + "file": "git2/sys/config.h", "functions": [ "git_config_init_backend", "git_config_add_backend" @@ -1029,7 +1089,7 @@ "lines": 126 }, { - "file": "sys/diff.h", + "file": "git2/sys/diff.h", "functions": [ "git_diff_print_callback__to_buf", "git_diff_print_callback__to_file_handle", @@ -1040,7 +1100,7 @@ "lines": 90 }, { - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "functions": [ "git_filter_lookup", "git_filter_list_new", @@ -1056,6 +1116,7 @@ "git_filter_shutdown_fn", "git_filter_check_fn", "git_filter_apply_fn", + "git_filter_stream_fn", "git_filter_cleanup_fn", "git_filter_init", "git_filter_register", @@ -1065,7 +1126,7 @@ "lines": 328 }, { - "file": "sys/hashsig.h", + "file": "git2/sys/hashsig.h", "functions": [ "git_hashsig_create", "git_hashsig_create_fromfile", @@ -1076,7 +1137,25 @@ "lines": 102 }, { - "file": "sys/mempack.h", + "file": "git2/sys/index.h", + "functions": [ + "git_index_name_entrycount", + "git_index_name_get_byindex", + "git_index_name_add", + "git_index_name_clear", + "git_index_reuc_entrycount", + "git_index_reuc_find", + "git_index_reuc_get_bypath", + "git_index_reuc_get_byindex", + "git_index_reuc_add", + "git_index_reuc_remove", + "git_index_reuc_clear" + ], + "meta": {}, + "lines": 174 + }, + { + "file": "git2/sys/mempack.h", "functions": [ "git_mempack_new", "git_mempack_dump", @@ -1086,25 +1165,34 @@ "lines": 82 }, { - "file": "sys/merge.h", + "file": "git2/sys/merge.h", "functions": [ + "git_merge_driver_lookup", + "git_merge_driver_source_repo", + "git_merge_driver_source_ancestor", + "git_merge_driver_source_ours", + "git_merge_driver_source_theirs", + "git_merge_driver_source_file_options", "git_merge_driver_init_fn", "git_merge_driver_shutdown_fn", - "git_merge_driver_apply_fn" + "git_merge_driver_apply_fn", + "git_merge_driver_register", + "git_merge_driver_unregister" ], "meta": {}, - "lines": 135 + "lines": 178 }, { - "file": "sys/odb_backend.h", + "file": "git2/sys/odb_backend.h", "functions": [ - "git_odb_init_backend" + "git_odb_init_backend", + "git_odb_backend_malloc" ], "meta": {}, - "lines": 118 + "lines": 120 }, { - "file": "sys/openssl.h", + "file": "git2/sys/openssl.h", "functions": [ "git_openssl_set_locking" ], @@ -1112,7 +1200,15 @@ "lines": 34 }, { - "file": "sys/refdb_backend.h", + "file": "git2/sys/path.h", + "functions": [ + "git_path_is_gitfile" + ], + "meta": {}, + "lines": 60 + }, + { + "file": "git2/sys/refdb_backend.h", "functions": [ "git_refdb_init_backend", "git_refdb_backend_fs", @@ -1122,7 +1218,16 @@ "lines": 214 }, { - "file": "sys/refs.h", + "file": "git2/sys/reflog.h", + "functions": [ + "git_reflog_entry__alloc", + "git_reflog_entry__free" + ], + "meta": {}, + "lines": 17 + }, + { + "file": "git2/sys/refs.h", "functions": [ "git_reference__alloc", "git_reference__alloc_symbolic" @@ -1131,7 +1236,7 @@ "lines": 45 }, { - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "functions": [ "git_repository_new", "git_repository__cleanup", @@ -1148,15 +1253,16 @@ "lines": 165 }, { - "file": "sys/stream.h", + "file": "git2/sys/stream.h", "functions": [ + "git_stream_cb", "git_stream_register_tls" ], "meta": {}, "lines": 54 }, { - "file": "sys/time.h", + "file": "git2/sys/time.h", "functions": [ "git_time_monotonic" ], @@ -1164,7 +1270,7 @@ "lines": 27 }, { - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "functions": [ "git_transport_init", "git_transport_new", @@ -1177,6 +1283,7 @@ "git_transport_smart_certificate_check", "git_transport_smart_credentials", "git_transport_smart_proxy_options", + "git_smart_subtransport_cb", "git_smart_subtransport_http", "git_smart_subtransport_git", "git_smart_subtransport_ssh" @@ -1185,7 +1292,7 @@ "lines": 389 }, { - "file": "tag.h", + "file": "git2/tag.h", "functions": [ "git_tag_lookup", "git_tag_lookup_prefix", @@ -1205,6 +1312,7 @@ "git_tag_delete", "git_tag_list", "git_tag_list_match", + "git_tag_foreach_cb", "git_tag_foreach", "git_tag_peel", "git_tag_dup" @@ -1213,7 +1321,7 @@ "lines": 357 }, { - "file": "trace.h", + "file": "git2/trace.h", "functions": [ "git_trace_callback", "git_trace_set" @@ -1222,9 +1330,26 @@ "lines": 63 }, { - "file": "transport.h", + "file": "git2/transaction.h", + "functions": [ + "git_transaction_new", + "git_transaction_lock_ref", + "git_transaction_set_target", + "git_transaction_set_symbolic_target", + "git_transaction_set_reflog", + "git_transaction_remove", + "git_transaction_commit", + "git_transaction_free" + ], + "meta": {}, + "lines": 117 + }, + { + "file": "git2/transport.h", "functions": [ "git_transport_cb", + "git_cred_sign_callback", + "git_cred_ssh_interactive_callback", "git_cred_has_username", "git_cred_userpass_plaintext_new", "git_cred_ssh_key_new", @@ -1238,10 +1363,10 @@ "git_cred_acquire_cb" ], "meta": {}, - "lines": 338 + "lines": 367 }, { - "file": "tree.h", + "file": "git2/tree.h", "functions": [ "git_tree_lookup", "git_tree_lookup_prefix", @@ -1282,17 +1407,17 @@ "lines": 479 }, { - "file": "types.h", + "file": "git2/types.h", "functions": [ "git_transfer_progress_cb", "git_transport_message_cb", "git_transport_certificate_check_cb" ], "meta": {}, - "lines": 429 + "lines": 438 }, { - "file": "worktree.h", + "file": "git2/worktree.h", "functions": [ "git_worktree_list", "git_worktree_lookup", @@ -1304,18 +1429,20 @@ "git_worktree_lock", "git_worktree_unlock", "git_worktree_is_locked", + "git_worktree_name", + "git_worktree_path", "git_worktree_prune_init_options", "git_worktree_is_prunable", "git_worktree_prune" ], "meta": {}, - "lines": 216 + "lines": 251 } ], "functions": { "git_annotated_commit_from_ref": { "type": "function", - "file": "annotated_commit.h", + "file": "git2/annotated_commit.h", "line": 33, "lineto": 36, "args": [ @@ -1343,16 +1470,11 @@ }, "description": "

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", "comments": "", - "group": "annotated", - "examples": { - "merge.c": [ - "ex/HEAD/merge.html#git_annotated_commit_from_ref-1" - ] - } + "group": "annotated" }, "git_annotated_commit_from_fetchhead": { "type": "function", - "file": "annotated_commit.h", + "file": "git2/annotated_commit.h", "line": 50, "lineto": 55, "args": [ @@ -1394,7 +1516,7 @@ }, "git_annotated_commit_lookup": { "type": "function", - "file": "annotated_commit.h", + "file": "git2/annotated_commit.h", "line": 75, "lineto": 78, "args": [ @@ -1421,17 +1543,12 @@ "comment": " 0 on success or error code" }, "description": "

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "

An annotated commit contains information about how it was looked up, which may be useful for functions like merge or rebase to provide context to the operation. For example, conflict files will include the name of the source or target branches being merged. It is therefore preferable to use the most specific function (eg git_annotated_commit_from_ref) instead of this one when that data is known.

\n", - "group": "annotated", - "examples": { - "merge.c": [ - "ex/HEAD/merge.html#git_annotated_commit_lookup-2" - ] - } + "comments": "

An annotated commit contains information about how it was\n looked up, which may be useful for functions like merge or\n rebase to provide context to the operation. For example,\n conflict files will include the name of the source or target\n branches being merged. It is therefore preferable to use the\n most specific function (eg git_annotated_commit_from_ref)\n instead of this one when that data is known.

\n", + "group": "annotated" }, "git_annotated_commit_from_revspec": { "type": "function", - "file": "annotated_commit.h", + "file": "git2/annotated_commit.h", "line": 92, "lineto": 95, "args": [ @@ -1458,12 +1575,12 @@ "comment": " 0 on success or error code" }, "description": "

Creates a git_annotated_comit from a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "comments": "

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n", "group": "annotated" }, "git_annotated_commit_id": { "type": "function", - "file": "annotated_commit.h", + "file": "git2/annotated_commit.h", "line": 103, "lineto": 104, "args": [ @@ -1483,18 +1600,49 @@ "comments": "", "group": "annotated", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_annotated_commit_id-1" + ], "merge.c": [ - "ex/HEAD/merge.html#git_annotated_commit_id-3", - "ex/HEAD/merge.html#git_annotated_commit_id-4", - "ex/HEAD/merge.html#git_annotated_commit_id-5" + "ex/HEAD/merge.html#git_annotated_commit_id-1", + "ex/HEAD/merge.html#git_annotated_commit_id-2", + "ex/HEAD/merge.html#git_annotated_commit_id-3" + ] + } + }, + "git_annotated_commit_ref": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 112, + "lineto": 113, + "args": [ + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": "the given annotated commit" + } + ], + "argline": "const git_annotated_commit *commit", + "sig": "const git_annotated_commit *", + "return": { + "type": "const char *", + "comment": " ref name." + }, + "description": "

Get the refname that the given git_annotated_commit refers to.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_annotated_commit_ref-2", + "ex/HEAD/checkout.html#git_annotated_commit_ref-3" ] } }, "git_annotated_commit_free": { "type": "function", - "file": "annotated_commit.h", - "line": 111, - "lineto": 112, + "file": "git2/annotated_commit.h", + "line": 120, + "lineto": 121, "args": [ { "name": "commit", @@ -1510,11 +1658,16 @@ }, "description": "

Frees a git_annotated_commit.

\n", "comments": "", - "group": "annotated" + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_annotated_commit_free-4" + ] + } }, "git_attr_value": { "type": "function", - "file": "attr.h", + "file": "git2/attr.h", "line": 102, "lineto": 102, "args": [ @@ -1531,12 +1684,12 @@ "comment": " the value type for the attribute" }, "description": "

Return the value type for a given attribute.

\n", - "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute was not set at all), or VALUE, if the attribute was set to an actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally as a NULL-terminated C string.

\n", + "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute\n was not set at all), or VALUE, if the attribute was set to an\n actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally\n as a NULL-terminated C string.

\n", "group": "attr" }, "git_attr_get": { "type": "function", - "file": "attr.h", + "file": "git2/attr.h", "line": 145, "lineto": 150, "args": [ @@ -1578,7 +1731,7 @@ }, "git_attr_get_many": { "type": "function", - "file": "attr.h", + "file": "git2/attr.h", "line": 181, "lineto": 187, "args": [ @@ -1620,14 +1773,14 @@ "comment": null }, "description": "

Look up a list of git attributes for path.

\n", - "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", + "comments": "

Use this if you have a known list of attributes that you want to\n look up in a single call. This is somewhat more efficient than\n calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };\n const char **values[3];\n git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for\n the three attributes you asked about.

\n", "group": "attr" }, "git_attr_foreach": { "type": "function", - "file": "attr.h", - "line": 209, - "lineto": 214, + "file": "git2/attr.h", + "line": 220, + "lineto": 225, "args": [ { "name": "repo", @@ -1647,7 +1800,7 @@ { "name": "callback", "type": "git_attr_foreach_cb", - "comment": "Function to invoke on each attribute name and value. The\n value may be NULL is the attribute is explicitly set to\n UNSPECIFIED using the '!' sign. Callback will be invoked\n only once per attribute name, even if there are multiple\n rules for a given file. The highest priority rule will be\n used. Return a non-zero value from this to stop looping.\n The value will be returned from `git_attr_foreach`." + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." }, { "name": "payload", @@ -1667,9 +1820,9 @@ }, "git_attr_cache_flush": { "type": "function", - "file": "attr.h", - "line": 224, - "lineto": 225, + "file": "git2/attr.h", + "line": 235, + "lineto": 236, "args": [ { "name": "repo", @@ -1684,14 +1837,14 @@ "comment": null }, "description": "

Flush the gitattributes cache.

\n", - "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", + "comments": "

Call this if you have reason to believe that the attributes files on\n disk no longer match the cached contents of memory. This will cause\n the attributes files to be reloaded the next time that an attribute\n access function is called.

\n", "group": "attr" }, "git_attr_add_macro": { "type": "function", - "file": "attr.h", - "line": 237, - "lineto": 240, + "file": "git2/attr.h", + "line": 248, + "lineto": 251, "args": [ { "name": "repo", @@ -1716,24 +1869,24 @@ "comment": null }, "description": "

Add a macro definition.

\n", - "comments": "

Macros will automatically be loaded from the top level .gitattributes file of the repository (plus the build-in "binary" macro). This function allows you to add others. For example, to add the default macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", + "comments": "

Macros will automatically be loaded from the top level .gitattributes\n file of the repository (plus the build-in "binary" macro). This\n function allows you to add others. For example, to add the default\n macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", "group": "attr" }, "git_blame_init_options": { "type": "function", - "file": "blame.h", - "line": 92, - "lineto": 94, + "file": "git2/blame.h", + "line": 103, + "lineto": 105, "args": [ { "name": "opts", "type": "git_blame_options *", - "comment": "The `git_blame_options` struct to initialize" + "comment": "The `git_blame_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_BLAME_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_BLAME_OPTIONS_VERSION`." } ], "argline": "git_blame_options *opts, unsigned int version", @@ -1742,15 +1895,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_blame_options with default values. Equivalent to\n creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_blame_options structure

\n", + "comments": "

Initializes a git_blame_options with default values. Equivalent to creating\n an instance with GIT_BLAME_OPTIONS_INIT.

\n", "group": "blame" }, "git_blame_get_hunk_count": { "type": "function", - "file": "blame.h", - "line": 137, - "lineto": 137, + "file": "git2/blame.h", + "line": 154, + "lineto": 154, "args": [ { "name": "blame", @@ -1770,9 +1923,9 @@ }, "git_blame_get_hunk_byindex": { "type": "function", - "file": "blame.h", - "line": 146, - "lineto": 148, + "file": "git2/blame.h", + "line": 163, + "lineto": 165, "args": [ { "name": "blame", @@ -1797,9 +1950,9 @@ }, "git_blame_get_hunk_byline": { "type": "function", - "file": "blame.h", - "line": 157, - "lineto": 159, + "file": "git2/blame.h", + "line": 174, + "lineto": 176, "args": [ { "name": "blame", @@ -1829,9 +1982,9 @@ }, "git_blame_file": { "type": "function", - "file": "blame.h", - "line": 172, - "lineto": 176, + "file": "git2/blame.h", + "line": 189, + "lineto": 193, "args": [ { "name": "out", @@ -1871,9 +2024,9 @@ }, "git_blame_buffer": { "type": "function", - "file": "blame.h", - "line": 196, - "lineto": 200, + "file": "git2/blame.h", + "line": 213, + "lineto": 217, "args": [ { "name": "out", @@ -1903,14 +2056,14 @@ "comment": " 0 on success, or an error code. (use giterr_last for information\n about the error)" }, "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", - "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", + "comments": "

Lines that differ between the buffer and the committed version are marked as\n having a zero OID for their final_commit_id.

\n", "group": "blame" }, "git_blame_free": { "type": "function", - "file": "blame.h", - "line": 207, - "lineto": 207, + "file": "git2/blame.h", + "line": 224, + "lineto": 224, "args": [ { "name": "blame", @@ -1935,7 +2088,7 @@ }, "git_blob_lookup": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 33, "lineto": 33, "args": [ @@ -1975,7 +2128,7 @@ }, "git_blob_lookup_prefix": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 47, "lineto": 47, "args": [ @@ -2012,7 +2165,7 @@ }, "git_blob_free": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 60, "lineto": 60, "args": [ @@ -2029,7 +2182,7 @@ "comment": null }, "description": "

Close an open blob

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT:\n It is necessary to call this method when you stop\n using a blob. Failure to do so will cause a memory leak.

\n", "group": "blob", "examples": { "blame.c": [ @@ -2042,7 +2195,7 @@ }, "git_blob_id": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 68, "lineto": 68, "args": [ @@ -2064,7 +2217,7 @@ }, "git_blob_owner": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 76, "lineto": 76, "args": [ @@ -2086,7 +2239,7 @@ }, "git_blob_rawcontent": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 89, "lineto": 89, "args": [ @@ -2103,7 +2256,7 @@ "comment": " the pointer" }, "description": "

Get a read-only buffer with the raw content of a blob.

\n", - "comments": "

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.

\n", + "comments": "

A pointer to the raw content of a blob is returned;\n this pointer is owned internally by the object and shall\n not be free'd. The pointer may be invalidated at a later\n time.

\n", "group": "blob", "examples": { "blame.c": [ @@ -2119,7 +2272,7 @@ }, "git_blob_rawsize": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 97, "lineto": 97, "args": [ @@ -2153,7 +2306,7 @@ }, "git_blob_filtered_content": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 122, "lineto": 126, "args": [ @@ -2185,12 +2338,12 @@ "comment": " 0 on success or an error code" }, "description": "

Get a buffer with the filtered content of a blob.

\n", - "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_free).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", + "comments": "

This applies filters as if the blob was being checked out to the\n working directory under the specified filename. This may apply\n CRLF filtering or other types of changes depending on the file\n attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free\n when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just\n be populated with a pointer to the raw content of the blob. In\n that case, be careful to not free the blob until done with the\n buffer or copy it into memory you own.

\n", "group": "blob" }, "git_blob_create_fromworkdir": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 139, "lineto": 139, "args": [ @@ -2222,7 +2375,7 @@ }, "git_blob_create_fromdisk": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 151, "lineto": 151, "args": [ @@ -2254,7 +2407,7 @@ }, "git_blob_create_fromstream": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 178, "lineto": 181, "args": [ @@ -2281,12 +2434,12 @@ "comment": " 0 or error code" }, "description": "

Create a stream to write a new blob into the object db

\n", - "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_frombuffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_fromstream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", + "comments": "

This function may need to buffer the data on disk and will in\n general not be the right choice if you know the size of the data\n to write. If you have data in memory, use\n git_blob_create_frombuffer(). If you do not, but know the size of\n the contents (and don't want/need to perform filtering), use\n git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to\n git_blob_create_fromstream_commit() to commit the write to the\n object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine\n what git filters should be applied to the object before it is written\n to the object database.

\n", "group": "blob" }, "git_blob_create_fromstream_commit": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 192, "lineto": 194, "args": [ @@ -2313,7 +2466,7 @@ }, "git_blob_create_frombuffer": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 205, "lineto": 206, "args": [ @@ -2350,7 +2503,7 @@ }, "git_blob_is_binary": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 219, "lineto": 219, "args": [ @@ -2367,12 +2520,12 @@ "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." }, "description": "

Determine if the blob content is most certainly binary or not.

\n", - "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", + "comments": "

The heuristic used to guess if a file is binary is taken from core git:\n Searching for NUL bytes and looking for a reasonable ratio of printable\n to non-printable characters among the first 8000 bytes.

\n", "group": "blob" }, "git_blob_dup": { "type": "function", - "file": "blob.h", + "file": "git2/blob.h", "line": 228, "lineto": 228, "args": [ @@ -2399,7 +2552,7 @@ }, "git_branch_create": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 50, "lineto": 55, "args": [ @@ -2436,12 +2589,12 @@ "comment": " 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit." }, "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

A new direct reference will be created pointing to this target commit. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

A new direct reference will be created pointing to\n this target commit. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", "group": "branch" }, "git_branch_create_from_annotated": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 68, "lineto": 73, "args": [ @@ -2478,12 +2631,12 @@ "comment": null }, "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", + "comments": "

This behaves like git_branch_create() but takes an annotated\n commit, which lets you specify which extended sha syntax string was\n specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", "group": "branch" }, "git_branch_delete": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 85, "lineto": 85, "args": [ @@ -2500,12 +2653,12 @@ "comment": " 0 on success, or an error code." }, "description": "

Delete an existing branch reference.

\n", - "comments": "

If the branch is successfully deleted, the passed reference object will be invalidated. The reference must be freed manually by the user.

\n", + "comments": "

If the branch is successfully deleted, the passed reference\n object will be invalidated. The reference must be freed manually\n by the user.

\n", "group": "branch" }, "git_branch_iterator_new": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 101, "lineto": 104, "args": [ @@ -2537,7 +2690,7 @@ }, "git_branch_next": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 114, "lineto": 114, "args": [ @@ -2569,7 +2722,7 @@ }, "git_branch_iterator_free": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 121, "lineto": 121, "args": [ @@ -2591,7 +2744,7 @@ }, "git_branch_move": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 138, "lineto": 142, "args": [ @@ -2623,12 +2776,12 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." }, "description": "

Move/rename an existing local branch reference.

\n", - "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

The new branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", "group": "branch" }, "git_branch_lookup": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 165, "lineto": 169, "args": [ @@ -2660,12 +2813,12 @@ "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." }, "description": "

Lookup a branch by its name in a repository.

\n", - "comments": "

The generated reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

The generated reference must be freed by the user.

\n\n

The branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", "group": "branch" }, "git_branch_name": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 186, "lineto": 188, "args": [ @@ -2687,17 +2840,17 @@ "comment": " 0 on success; otherwise an error code (e.g., if the\n ref is no local or remote branch)." }, "description": "

Return the name of the given local or remote branch.

\n", - "comments": "

The name of the branch matches the definition of the name for git_branch_lookup. That is, if the returned name is given to git_branch_lookup() then the reference is returned that was given to this function.

\n", + "comments": "

The name of the branch matches the definition of the name\n for git_branch_lookup. That is, if the returned name is given\n to git_branch_lookup() then the reference is returned that\n was given to this function.

\n", "group": "branch", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_branch_name-6" + "ex/HEAD/merge.html#git_branch_name-4" ] } }, "git_branch_upstream": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 202, "lineto": 204, "args": [ @@ -2724,7 +2877,7 @@ }, "git_branch_set_upstream": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 216, "lineto": 216, "args": [ @@ -2749,9 +2902,41 @@ "comments": "", "group": "branch" }, + "git_branch_upstream_name": { + "type": "function", + "file": "git2/branch.h", + "line": 232, + "lineto": 235, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to the user-allocated git_buf which will be\n filled with the name of the reference." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the branches live" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference name of the local branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND when no remote tracking reference exists,\n otherwise an error code." + }, + "description": "

Return the name of the reference supporting the remote tracking branch,\n given the name of a local branch reference.

\n", + "comments": "", + "group": "branch" + }, "git_branch_is_head": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 245, "lineto": 246, "args": [ @@ -2773,7 +2958,7 @@ }, "git_branch_is_checked_out": { "type": "function", - "file": "branch.h", + "file": "git2/branch.h", "line": 257, "lineto": 258, "args": [ @@ -2793,9 +2978,73 @@ "comments": "", "group": "branch" }, - "git_buf_free": { + "git_branch_remote_name": { "type": "function", - "file": "buffer.h", + "file": "git2/branch.h", + "line": 274, + "lineto": 277, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to the user-allocated git_buf which will be filled with the name of the remote." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository where the branch lives." + }, + { + "name": "canonical_branch_name", + "type": "const char *", + "comment": "name of the remote tracking branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *canonical_branch_name", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND\n when no remote matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." + }, + "description": "

Return the name of remote that the remote tracking branch belongs to.

\n", + "comments": "", + "group": "branch" + }, + "git_branch_upstream_remote": { + "type": "function", + "file": "git2/branch.h", + "line": 288, + "lineto": 288, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Retrieve the name of the upstream remote of a local branch

\n", + "comments": "", + "group": "branch" + }, + "git_buf_dispose": { + "type": "function", + "file": "git2/buffer.h", "line": 72, "lineto": 72, "args": [ @@ -2812,25 +3061,47 @@ "comment": null }, "description": "

Free the memory referred to by the git_buf.

\n", - "comments": "

Note that this does not free the git_buf itself, just the memory pointed to by buffer->ptr. This will not free the memory if it looks like it was not allocated internally, but it will clear the buffer back to the empty state.

\n", + "comments": "

Note that this does not free the git_buf itself, just the memory\n pointed to by buffer->ptr. This will not free the memory if it looks\n like it was not allocated internally, but it will clear the buffer back\n to the empty state.

\n", "group": "buf", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_buf_free-1" + "ex/HEAD/diff.html#git_buf_dispose-1" ], "remote.c": [ - "ex/HEAD/remote.html#git_buf_free-1" + "ex/HEAD/remote.html#git_buf_dispose-1" ], "tag.c": [ - "ex/HEAD/tag.html#git_buf_free-1" + "ex/HEAD/tag.html#git_buf_dispose-1" ] } }, + "git_buf_free": { + "type": "function", + "file": "git2/buffer.h", + "line": 84, + "lineto": 84, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": null + } + ], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { + "type": "void", + "comment": null + }, + "description": "", + "comments": "", + "group": "buf" + }, "git_buf_grow": { "type": "function", - "file": "buffer.h", - "line": 95, - "lineto": 95, + "file": "git2/buffer.h", + "line": 107, + "lineto": 107, "args": [ { "name": "buffer", @@ -2850,14 +3121,14 @@ "comment": " 0 on success, -1 on allocation failure" }, "description": "

Resize the buffer allocation to make more space.

\n", - "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e. the asize field is zero), then ptr will be replaced with a newly allocated block of data. Be careful so that memory allocated by the caller is not lost. As a special variant, if you pass target_size as 0 and the memory is not allocated by libgit2, this will allocate a new buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be marked as invalid for future operations, invaliding the contents.

\n", + "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e.\n the asize field is zero), then ptr will be replaced with a newly\n allocated block of data. Be careful so that memory allocated by the\n caller is not lost. As a special variant, if you pass target_size as\n 0 and the memory is not allocated by libgit2, this will allocate a new\n buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be\n marked as invalid for future operations, invaliding the contents.

\n", "group": "buf" }, "git_buf_set": { "type": "function", - "file": "buffer.h", - "line": 105, - "lineto": 106, + "file": "git2/buffer.h", + "line": 117, + "lineto": 118, "args": [ { "name": "buffer", @@ -2887,9 +3158,9 @@ }, "git_buf_is_binary": { "type": "function", - "file": "buffer.h", - "line": 114, - "lineto": 114, + "file": "git2/buffer.h", + "line": 126, + "lineto": 126, "args": [ { "name": "buf", @@ -2909,9 +3180,9 @@ }, "git_buf_contains_nul": { "type": "function", - "file": "buffer.h", - "line": 122, - "lineto": 122, + "file": "git2/buffer.h", + "line": 134, + "lineto": 134, "args": [ { "name": "buf", @@ -2931,19 +3202,19 @@ }, "git_checkout_init_options": { "type": "function", - "file": "checkout.h", - "line": 308, - "lineto": 310, + "file": "git2/checkout.h", + "line": 309, + "lineto": 311, "args": [ { "name": "opts", "type": "git_checkout_options *", - "comment": "the `git_checkout_options` struct to initialize." + "comment": "The `git_checkout_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_CHECKOUT_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_CHECKOUT_OPTIONS_VERSION`." } ], "argline": "git_checkout_options *opts, unsigned int version", @@ -2952,15 +3223,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_checkout_options with default values. Equivalent to\n creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_checkout_options structure

\n", + "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating\n an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", "group": "checkout" }, "git_checkout_head": { "type": "function", - "file": "checkout.h", - "line": 329, - "lineto": 331, + "file": "git2/checkout.h", + "line": 330, + "lineto": 332, "args": [ { "name": "repo", @@ -2980,14 +3251,14 @@ "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use giterr_last for error details)" }, "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", - "comments": "

Note that this is not the correct mechanism used to switch branches; do not change your HEAD and then call this method, that would leave you with checkout conflicts since your working directory would then appear to be dirty. Instead, checkout the target of the branch and then update HEAD using git_repository_set_head to point to the branch you checked out.

\n", + "comments": "

Note that this is not the correct mechanism used to switch branches;\n do not change your HEAD and then call this method, that would leave\n you with checkout conflicts since your working directory would then\n appear to be dirty. Instead, checkout the target of the branch and\n then update HEAD using git_repository_set_head to point to the\n branch you checked out.

\n", "group": "checkout" }, "git_checkout_index": { "type": "function", - "file": "checkout.h", - "line": 342, - "lineto": 345, + "file": "git2/checkout.h", + "line": 343, + "lineto": 346, "args": [ { "name": "repo", @@ -3017,9 +3288,9 @@ }, "git_checkout_tree": { "type": "function", - "file": "checkout.h", - "line": 358, - "lineto": 361, + "file": "git2/checkout.h", + "line": 359, + "lineto": 362, "args": [ { "name": "repo", @@ -3047,26 +3318,29 @@ "comments": "", "group": "checkout", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_checkout_tree-5" + ], "merge.c": [ - "ex/HEAD/merge.html#git_checkout_tree-7" + "ex/HEAD/merge.html#git_checkout_tree-5" ] } }, "git_cherrypick_init_options": { "type": "function", - "file": "cherrypick.h", - "line": 47, - "lineto": 49, + "file": "git2/cherrypick.h", + "line": 49, + "lineto": 51, "args": [ { "name": "opts", "type": "git_cherrypick_options *", - "comment": "the `git_cherrypick_options` struct to initialize" + "comment": "The `git_cherrypick_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_CHERRYPICK_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_CHERRYPICK_OPTIONS_VERSION`." } ], "argline": "git_cherrypick_options *opts, unsigned int version", @@ -3075,15 +3349,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_cherrypick_options with default values. Equivalent to\n creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_cherrypick_options structure

\n", + "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating\n an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", "group": "cherrypick" }, "git_cherrypick_commit": { "type": "function", - "file": "cherrypick.h", - "line": 65, - "lineto": 71, + "file": "git2/cherrypick.h", + "line": 67, + "lineto": 73, "args": [ { "name": "out", @@ -3128,9 +3402,9 @@ }, "git_cherrypick": { "type": "function", - "file": "cherrypick.h", - "line": 81, - "lineto": 84, + "file": "git2/cherrypick.h", + "line": 83, + "lineto": 86, "args": [ { "name": "repo", @@ -3160,19 +3434,19 @@ }, "git_clone_init_options": { "type": "function", - "file": "clone.h", - "line": 179, - "lineto": 181, + "file": "git2/clone.h", + "line": 181, + "lineto": 183, "args": [ { "name": "opts", "type": "git_clone_options *", - "comment": "The `git_clone_options` struct to initialize" + "comment": "The `git_clone_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_CLONE_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_CLONE_OPTIONS_VERSION`." } ], "argline": "git_clone_options *opts, unsigned int version", @@ -3181,15 +3455,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_clone_options with default values. Equivalent to\n creating an instance with GIT_CLONE_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_clone_options structure

\n", + "comments": "

Initializes a git_clone_options with default values. Equivalent to creating\n an instance with GIT_CLONE_OPTIONS_INIT.

\n", "group": "clone" }, "git_clone": { "type": "function", - "file": "clone.h", - "line": 199, - "lineto": 203, + "file": "git2/clone.h", + "line": 201, + "lineto": 205, "args": [ { "name": "out", @@ -3219,17 +3493,12 @@ "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `giterr_last` for a detailed error message)" }, "description": "

Clone a remote repository.

\n", - "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n", - "group": "clone", - "examples": { - "network/clone.c": [ - "ex/HEAD/network/clone.html#git_clone-1" - ] - } + "comments": "

By default this creates its repository and initial remote to match\n git's defaults. You can use the options in the callback to\n customize how these are created.

\n", + "group": "clone" }, "git_commit_lookup": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 36, "lineto": 37, "args": [ @@ -3256,9 +3525,12 @@ "comment": " 0 or an error code" }, "description": "

Lookup a commit object from a repository.

\n", - "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "comments": "

The returned object should be released with git_commit_free when no\n longer needed.

\n", "group": "commit", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_commit_lookup-6" + ], "general.c": [ "ex/HEAD/general.html#git_commit_lookup-6", "ex/HEAD/general.html#git_commit_lookup-7", @@ -3268,13 +3540,13 @@ "ex/HEAD/log.html#git_commit_lookup-1" ], "merge.c": [ - "ex/HEAD/merge.html#git_commit_lookup-8" + "ex/HEAD/merge.html#git_commit_lookup-6" ] } }, "git_commit_lookup_prefix": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 55, "lineto": 56, "args": [ @@ -3306,12 +3578,12 @@ "comment": " 0 or an error code" }, "description": "

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n", - "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "comments": "

The returned object should be released with git_commit_free when no\n longer needed.

\n", "group": "commit" }, "git_commit_free": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 70, "lineto": 70, "args": [ @@ -3328,9 +3600,12 @@ "comment": null }, "description": "

Close an open commit

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT:\n It is necessary to call this method when you stop\n using a commit. Failure to do so will cause a memory leak.

\n", "group": "commit", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_commit_free-7" + ], "general.c": [ "ex/HEAD/general.html#git_commit_free-9", "ex/HEAD/general.html#git_commit_free-10", @@ -3348,7 +3623,7 @@ }, "git_commit_id": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 78, "lineto": 78, "args": [ @@ -3378,7 +3653,7 @@ }, "git_commit_owner": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 86, "lineto": 86, "args": [ @@ -3406,7 +3681,7 @@ }, "git_commit_message_encoding": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 98, "lineto": 98, "args": [ @@ -3423,12 +3698,12 @@ "comment": " NULL, or the encoding" }, "description": "

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n", - "comments": "

The encoding may be NULL if the encoding header in the commit is missing; in that case UTF-8 is assumed.

\n", + "comments": "

The encoding may be NULL if the encoding header\n in the commit is missing; in that case UTF-8 is assumed.

\n", "group": "commit" }, "git_commit_message": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 109, "lineto": 109, "args": [ @@ -3445,7 +3720,7 @@ "comment": " the message of a commit" }, "description": "

Get the full message of a commit.

\n", - "comments": "

The returned message will be slightly prettified by removing any potential leading newlines.

\n", + "comments": "

The returned message will be slightly prettified by removing any\n potential leading newlines.

\n", "group": "commit", "examples": { "cat-file.c": [ @@ -3469,7 +3744,7 @@ }, "git_commit_message_raw": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 117, "lineto": 117, "args": [ @@ -3491,7 +3766,7 @@ }, "git_commit_summary": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 128, "lineto": 128, "args": [ @@ -3508,12 +3783,12 @@ "comment": " the summary of a commit or NULL on error" }, "description": "

Get the short "summary" of the git commit message.

\n", - "comments": "

The returned message is the summary of the commit, comprising the first paragraph of the message with whitespace trimmed and squashed.

\n", + "comments": "

The returned message is the summary of the commit, comprising the\n first paragraph of the message with whitespace trimmed and squashed.

\n", "group": "commit" }, "git_commit_body": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 141, "lineto": 141, "args": [ @@ -3530,12 +3805,12 @@ "comment": " the body of a commit or NULL when no the message only\n consists of a summary" }, "description": "

Get the long "body" of the git commit message.

\n", - "comments": "

The returned message is the body of the commit, comprising everything but the first paragraph of the message. Leading and trailing whitespaces are trimmed.

\n", + "comments": "

The returned message is the body of the commit, comprising\n everything but the first paragraph of the message. Leading and\n trailing whitespaces are trimmed.

\n", "group": "commit" }, "git_commit_time": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 149, "lineto": 149, "args": [ @@ -3563,7 +3838,7 @@ }, "git_commit_time_offset": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 157, "lineto": 157, "args": [ @@ -3585,7 +3860,7 @@ }, "git_commit_committer": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 165, "lineto": 165, "args": [ @@ -3618,7 +3893,7 @@ }, "git_commit_author": { "type": "function", - "file": "commit.h", + "file": "git2/commit.h", "line": 173, "lineto": 173, "args": [ @@ -3651,11 +3926,75 @@ ] } }, + "git_commit_committer_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 186, + "lineto": 187, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the committer of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, + "git_commit_author_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 200, + "lineto": 201, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the author of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, "git_commit_raw_header": { "type": "function", - "file": "commit.h", - "line": 181, - "lineto": 181, + "file": "git2/commit.h", + "line": 209, + "lineto": 209, "args": [ { "name": "commit", @@ -3675,9 +4014,9 @@ }, "git_commit_tree": { "type": "function", - "file": "commit.h", - "line": 190, - "lineto": 190, + "file": "git2/commit.h", + "line": 218, + "lineto": 218, "args": [ { "name": "tree_out", @@ -3711,9 +4050,9 @@ }, "git_commit_tree_id": { "type": "function", - "file": "commit.h", - "line": 200, - "lineto": 200, + "file": "git2/commit.h", + "line": 228, + "lineto": 228, "args": [ { "name": "commit", @@ -3738,9 +4077,9 @@ }, "git_commit_parentcount": { "type": "function", - "file": "commit.h", - "line": 208, - "lineto": 208, + "file": "git2/commit.h", + "line": 236, + "lineto": 236, "args": [ { "name": "commit", @@ -3772,9 +4111,9 @@ }, "git_commit_parent": { "type": "function", - "file": "commit.h", - "line": 218, - "lineto": 221, + "file": "git2/commit.h", + "line": 246, + "lineto": 249, "args": [ { "name": "out", @@ -3813,9 +4152,9 @@ }, "git_commit_parent_id": { "type": "function", - "file": "commit.h", - "line": 232, - "lineto": 234, + "file": "git2/commit.h", + "line": 260, + "lineto": 262, "args": [ { "name": "commit", @@ -3848,9 +4187,9 @@ }, "git_commit_nth_gen_ancestor": { "type": "function", - "file": "commit.h", - "line": 250, - "lineto": 253, + "file": "git2/commit.h", + "line": 278, + "lineto": 281, "args": [ { "name": "ancestor", @@ -3875,14 +4214,14 @@ "comment": " 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code" }, "description": "

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n", - "comments": "

Passing 0 as the generation number returns another instance of the base commit itself.

\n", + "comments": "

Passing 0 as the generation number returns another instance of the\n base commit itself.

\n", "group": "commit" }, "git_commit_header_field": { "type": "function", - "file": "commit.h", - "line": 265, - "lineto": 265, + "file": "git2/commit.h", + "line": 293, + "lineto": 293, "args": [ { "name": "out", @@ -3912,9 +4251,9 @@ }, "git_commit_extract_signature": { "type": "function", - "file": "commit.h", - "line": 285, - "lineto": 285, + "file": "git2/commit.h", + "line": 313, + "lineto": 313, "args": [ { "name": "signature", @@ -3949,14 +4288,14 @@ "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." }, "description": "

Extract the signature from a commit

\n", - "comments": "

If the id is not for a commit, the error class will be GITERR_INVALID. If the commit does not have a signature, the error class will be GITERR_OBJECT.

\n", + "comments": "

If the id is not for a commit, the error class will be\n GITERR_INVALID. If the commit does not have a signature, the\n error class will be GITERR_OBJECT.

\n", "group": "commit" }, "git_commit_create": { "type": "function", - "file": "commit.h", - "line": 331, - "lineto": 341, + "file": "git2/commit.h", + "line": 359, + "lineto": 369, "args": [ { "name": "id", @@ -4016,19 +4355,19 @@ "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" }, "description": "

Create new commit in the repository from a list of git_object pointers

\n", - "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", + "comments": "

The message will not be cleaned up automatically. You can do that\n with the git_message_prettify() function.

\n", "group": "commit", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_commit_create-9" + "ex/HEAD/merge.html#git_commit_create-7" ] } }, "git_commit_create_v": { "type": "function", - "file": "commit.h", - "line": 357, - "lineto": 367, + "file": "git2/commit.h", + "line": 385, + "lineto": 395, "args": [ { "name": "id", @@ -4083,7 +4422,7 @@ "comment": null }, "description": "

Create new commit in the repository using a variable argument list.

\n", - "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", + "comments": "

The message will not be cleaned up automatically. You can do that\n with the git_message_prettify() function.

\n\n

The parents for the commit are specified as a variable list of pointers\n to const git_commit *. Note that this is a convenience method which may\n not be safe to export for certain languages or compilers

\n\n

All other parameters remain the same as git_commit_create().

\n", "group": "commit", "examples": { "general.c": [ @@ -4096,9 +4435,9 @@ }, "git_commit_amend": { "type": "function", - "file": "commit.h", - "line": 390, - "lineto": 398, + "file": "git2/commit.h", + "line": 418, + "lineto": 426, "args": [ { "name": "id", @@ -4148,14 +4487,14 @@ "comment": null }, "description": "

Amend an existing commit by replacing only non-NULL values.

\n", - "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", + "comments": "

This creates a new commit that is exactly the same as the old commit,\n except that any non-NULL values will be updated. The new commit has\n the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(),\n updating the ref to point to the newly rewritten commit. If you want\n to amend a commit that is not currently the tip of the branch and then\n rewrite the following commits to reach a ref, pass this as NULL and\n update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message,\n message_encoding, and tree parameters can be NULL in which case this\n will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", "group": "commit" }, "git_commit_create_buffer": { "type": "function", - "file": "commit.h", - "line": 435, - "lineto": 444, + "file": "git2/commit.h", + "line": 463, + "lineto": 472, "args": [ { "name": "out", @@ -4210,14 +4549,14 @@ "comment": " 0 or an error code" }, "description": "

Create a commit and write it into a buffer

\n", - "comments": "

Create a commit as with git_commit_create() but instead of writing it to the objectdb, write the contents of the object into a buffer.

\n", + "comments": "

Create a commit as with git_commit_create() but instead of\n writing it to the objectdb, write the contents of the object into a\n buffer.

\n", "group": "commit" }, "git_commit_create_with_signature": { "type": "function", - "file": "commit.h", - "line": 460, - "lineto": 465, + "file": "git2/commit.h", + "line": 488, + "lineto": 493, "args": [ { "name": "out", @@ -4252,14 +4591,14 @@ "comment": " 0 or an error code" }, "description": "

Create a commit object from the given buffer and signature

\n", - "comments": "

Given the unsigned commit object's contents, its signature and the header field in which to store the signature, attach the signature to the commit and write it into the given repository.

\n", + "comments": "

Given the unsigned commit object's contents, its signature and the\n header field in which to store the signature, attach the signature\n to the commit and write it into the given repository.

\n", "group": "commit" }, "git_commit_dup": { "type": "function", - "file": "commit.h", - "line": 474, - "lineto": 474, + "file": "git2/commit.h", + "line": 502, + "lineto": 502, "args": [ { "name": "out", @@ -4284,9 +4623,9 @@ }, "git_libgit2_version": { "type": "function", - "file": "common.h", - "line": 105, - "lineto": 105, + "file": "git2/common.h", + "line": 116, + "lineto": 116, "args": [ { "name": "major", @@ -4316,9 +4655,9 @@ }, "git_libgit2_features": { "type": "function", - "file": "common.h", - "line": 154, - "lineto": 154, + "file": "git2/common.h", + "line": 165, + "lineto": 165, "args": [], "argline": "", "sig": "", @@ -4327,14 +4666,14 @@ "comment": " A combination of GIT_FEATURE_* values." }, "description": "

Query compile time options for libgit2.

\n", - "comments": "
    \n
  • GIT_FEATURE_THREADS Libgit2 was compiled with thread support. Note that thread support is still to be seen as a 'work in progress' - basic object lookups are believed to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS Libgit2 supports the https:// protocol. This requires the openssl library to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH Libgit2 supports the SSH protocol for network operations. This requires the libssh2 library to be found when compiling libgit2

  • \n
\n", + "comments": "
    \n
  • GIT_FEATURE_THREADS\nLibgit2 was compiled with thread support. Note that thread support is\nstill to be seen as a 'work in progress' - basic object lookups are\nbelieved to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS\nLibgit2 supports the https:// protocol. This requires the openssl\nlibrary to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH\nLibgit2 supports the SSH protocol for network operations. This requires\nthe libssh2 library to be found when compiling libgit2

  • \n
\n", "group": "libgit2" }, "git_libgit2_opts": { "type": "function", - "file": "common.h", - "line": 352, - "lineto": 352, + "file": "git2/common.h", + "line": 393, + "lineto": 393, "args": [ { "name": "option", @@ -4349,14 +4688,14 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time        by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_otype type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJ_BLOB (i.e. won't cache blobs) and 4k        > for GIT_OBJ_COMMIT, GIT_OBJ_TREE, and GIT_OBJ_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n
\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time\n    by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must\n    > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,\n    > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n    > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path\n    > applied to shared attributes and ignore files, too.\n    >\n    > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.\n    >   Pass NULL to reset to the default (generally based on environment\n    >   variables).  Use magic path `$PATH` to include the old value\n    >   of the path (if you want to prepend or append, for instance).\n    >\n    > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,\n    >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or\n    >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_otype type, size_t size)\n\n    > Set the maximum data size for the given type of object to be\n    > considered eligible for caching in memory.  Setting to value to\n    > zero means that that type of object will not be cached.\n    > Defaults to 0 for GIT_OBJ_BLOB (i.e. won't cache blobs) and 4k\n    > for GIT_OBJ_COMMIT, GIT_OBJ_TREE, and GIT_OBJ_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory\n    > across all repositories before libgit2 starts evicting objects\n    > from the cache.  This is a soft limit, in that the library might\n    > briefly exceed it, but will start aggressively evicting objects\n    > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.\n    >\n    > Because caches are repository-specific, disabling the cache\n    > cannot immediately clear all cached objects, but each cache will\n    > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be\n    > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.\n    > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.\n    >\n    > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.\n    >\n    > - `file` is the location of a file containing several\n    >   certificates concatenated together.\n    > - `path` is the location of a directory holding several\n    >   certificates, one per file.\n    >\n    > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be\n    > appended to "git/1.0", for compatibility with other git clients.\n    >\n    > - `user_agent` is the value that will be delivered as the\n    >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.\n    > For more information, see the documentation for CreateFile.\n    > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is\n    > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects\n    > to ensure that all inputs to the new objects are valid.  For\n    > example, when this is enabled, the parent(s) and tree inputs\n    > will be validated when creating a new commit.  This defaults\n    > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For\n    > example, `foobar` is not a valid ref, therefore `foobar` is\n    > not a valid target for a symbolic ref by default, whereas\n    > `refs/heads/foobar` is.  Disabling this bypasses validation\n    > so that an arbitrary strings such as `foobar` can be used\n    > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.\n    >\n    > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,\n    > and the negotiation of them when talking to a remote server.\n    > Offset deltas store a delta base location as an offset into the\n    > packfile from the current location, which provides a shorter encoding\n    > and thus smaller resultant packfiles.\n    > Packfiles containing offset deltas can still be read.\n    > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`\n    > (or the platform equivalent) to ensure that new object data\n    > is written to permanent storage, not simply cached.  This\n    > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading\n    > objects from disk. This may impact performance due to an\n    > additional checksum calculation on each object. This defaults\n    > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This\n    > allocator will then be used to make all memory allocations for\n    > libgit2 operations.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before\n    > beginning any operation that reloads the index from disk (eg,\n    > checkout).  If there are unsaved changes, the instruction will\n    > fail.  (Using the FORCE flag to checkout will still overwrite\n    > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote. This can be\n    > used to limit maximum memory usage when fetching from an untrusted\n    > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote.\n
\n", "group": "libgit2" }, "git_config_entry_free": { "type": "function", - "file": "config.h", - "line": 75, - "lineto": 75, + "file": "git2/config.h", + "line": 76, + "lineto": 76, "args": [ { "name": "", @@ -4376,9 +4715,9 @@ }, "git_config_find_global": { "type": "function", - "file": "config.h", - "line": 116, - "lineto": 116, + "file": "git2/config.h", + "line": 127, + "lineto": 127, "args": [ { "name": "out", @@ -4393,14 +4732,14 @@ "comment": " 0 if a global configuration file has been found. Its path will be stored in `out`." }, "description": "

Locate the path to the global configuration file

\n", - "comments": "

The user or global configuration file is usually located in $HOME/.gitconfig.

\n\n

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.

\n\n

This method will not guess the path to the xdg compatible config file (.config/git/config).

\n", + "comments": "

The user or global configuration file is usually\n located in $HOME/.gitconfig.

\n\n

This method will try to guess the full path to that\n file, if the file exists. The returned path\n may be used on any git_config call to load the\n global configuration file.

\n\n

This method will not guess the path to the xdg compatible\n config file (.config/git/config).

\n", "group": "config" }, "git_config_find_xdg": { "type": "function", - "file": "config.h", - "line": 133, - "lineto": 133, + "file": "git2/config.h", + "line": 144, + "lineto": 144, "args": [ { "name": "out", @@ -4415,14 +4754,14 @@ "comment": " 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`." }, "description": "

Locate the path to the global xdg compatible configuration file

\n", - "comments": "

The xdg compatible configuration file is usually located in $HOME/.config/git/config.

\n\n

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 xdg compatible configuration file.

\n", + "comments": "

The xdg compatible configuration file is usually\n located in $HOME/.config/git/config.

\n\n

This method will try to guess the full path to that\n file, if the file exists. The returned path\n may be used on any git_config call to load the\n xdg compatible configuration file.

\n", "group": "config" }, "git_config_find_system": { "type": "function", - "file": "config.h", - "line": 145, - "lineto": 145, + "file": "git2/config.h", + "line": 156, + "lineto": 156, "args": [ { "name": "out", @@ -4437,14 +4776,14 @@ "comment": " 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`." }, "description": "

Locate the path to the system configuration file

\n", - "comments": "

If /etc/gitconfig doesn't exist, it will look for %PROGRAMFILES%.

\n", + "comments": "

If /etc/gitconfig doesn't exist, it will look for\n %PROGRAMFILES%

\n\n

.

\n", "group": "config" }, "git_config_find_programdata": { "type": "function", - "file": "config.h", - "line": 156, - "lineto": 156, + "file": "git2/config.h", + "line": 167, + "lineto": 167, "args": [ { "name": "out", @@ -4459,14 +4798,14 @@ "comment": " 0 if a ProgramData configuration file has been\n\tfound. Its path will be stored in `out`." }, "description": "

Locate the path to the configuration file in ProgramData

\n", - "comments": "

Look for the file in %PROGRAMDATA% used by portable git.

\n", + "comments": "

Look for the file in %PROGRAMDATA%

\n\n

used by portable git.

\n", "group": "config" }, "git_config_open_default": { "type": "function", - "file": "config.h", - "line": 168, - "lineto": 168, + "file": "git2/config.h", + "line": 179, + "lineto": 179, "args": [ { "name": "out", @@ -4481,14 +4820,14 @@ "comment": " 0 or an error code" }, "description": "

Open the global, XDG and system configuration files

\n", - "comments": "

Utility wrapper that finds the global, XDG and system configuration files and opens them into a single prioritized config object that can be used when accessing default config data outside a repository.

\n", + "comments": "

Utility wrapper that finds the global, XDG and system configuration files\n and opens them into a single prioritized config object that can be\n used when accessing default config data outside a repository.

\n", "group": "config" }, "git_config_new": { "type": "function", - "file": "config.h", - "line": 179, - "lineto": 179, + "file": "git2/config.h", + "line": 190, + "lineto": 190, "args": [ { "name": "out", @@ -4503,14 +4842,14 @@ "comment": " 0 or an error code" }, "description": "

Allocate a new configuration object

\n", - "comments": "

This object is empty, so you have to add a file to it before you can do anything with it.

\n", + "comments": "

This object is empty, so you have to add a file to it before you\n can do anything with it.

\n", "group": "config" }, "git_config_add_file_ondisk": { "type": "function", - "file": "config.h", - "line": 208, - "lineto": 213, + "file": "git2/config.h", + "line": 219, + "lineto": 224, "args": [ { "name": "cfg", @@ -4545,14 +4884,14 @@ "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code" }, "description": "

Add an on-disk config file instance to an existing config

\n", - "comments": "

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).

\n\n

If the file does not exist, the file will still be added and it will be created the first time we write to it.

\n\n

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", + "comments": "

The on-disk file pointed at by path will be opened and\n parsed; it's expected to be a native Git config file following\n the default Git config syntax (see man git-config).

\n\n

If the file does not exist, the file will still be added and it\n will be created the first time we write to it.

\n\n

Note that the configuration object will free the file\n automatically.

\n\n

Further queries on this config object will access each\n of the config file instances in order (instances with\n a higher priority level will be accessed first).

\n", "group": "config" }, "git_config_open_ondisk": { "type": "function", - "file": "config.h", - "line": 227, - "lineto": 227, + "file": "git2/config.h", + "line": 238, + "lineto": 238, "args": [ { "name": "out", @@ -4572,7 +4911,7 @@ "comment": " 0 on success, or an error code" }, "description": "

Create a new config instance containing a single on-disk file

\n", - "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", + "comments": "

This method is a simple utility wrapper for the following sequence\n of calls:\n - git_config_new\n - git_config_add_file_ondisk

\n", "group": "config", "examples": { "general.c": [ @@ -4582,9 +4921,9 @@ }, "git_config_open_level": { "type": "function", - "file": "config.h", - "line": 245, - "lineto": 248, + "file": "git2/config.h", + "line": 256, + "lineto": 259, "args": [ { "name": "out", @@ -4609,14 +4948,14 @@ "comment": " 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code" }, "description": "

Build a single-level focused config object from a multi-level one.

\n", - "comments": "

The returned config object can be used to perform get/set/delete operations on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config will return different config instances, but containing the same config_file instance.

\n", + "comments": "

The returned config object can be used to perform get/set/delete operations\n on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config\n will return different config instances, but containing the same config_file\n instance.

\n", "group": "config" }, "git_config_open_global": { "type": "function", - "file": "config.h", - "line": 262, - "lineto": 262, + "file": "git2/config.h", + "line": 273, + "lineto": 273, "args": [ { "name": "out", @@ -4636,14 +4975,14 @@ "comment": null }, "description": "

Open the global/XDG configuration file according to git's rules

\n", - "comments": "

Git allows you to store your global configuration at $HOME/.config or $XDG_CONFIG_HOME/git/config. For backwards compatability, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", + "comments": "

Git allows you to store your global configuration at\n $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards\n compatability, the XDG file shouldn't be used unless the use has\n created it explicitly. With this function you'll open the correct\n one to write to.

\n", "group": "config" }, "git_config_snapshot": { "type": "function", - "file": "config.h", - "line": 278, - "lineto": 278, + "file": "git2/config.h", + "line": 289, + "lineto": 289, "args": [ { "name": "out", @@ -4663,14 +5002,14 @@ "comment": " 0 or an error code" }, "description": "

Create a snapshot of the configuration

\n", - "comments": "

Create a snapshot of the current state of a configuration, which allows you to look into a consistent view of the configuration for looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid until it is freed.

\n", + "comments": "

Create a snapshot of the current state of a configuration, which\n allows you to look into a consistent view of the configuration for\n looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid\n until it is freed.

\n", "group": "config" }, "git_config_free": { "type": "function", - "file": "config.h", - "line": 285, - "lineto": 285, + "file": "git2/config.h", + "line": 296, + "lineto": 296, "args": [ { "name": "cfg", @@ -4696,9 +5035,9 @@ }, "git_config_get_entry": { "type": "function", - "file": "config.h", - "line": 297, - "lineto": 300, + "file": "git2/config.h", + "line": 308, + "lineto": 311, "args": [ { "name": "out", @@ -4728,9 +5067,9 @@ }, "git_config_get_int32": { "type": "function", - "file": "config.h", - "line": 314, - "lineto": 314, + "file": "git2/config.h", + "line": 325, + "lineto": 325, "args": [ { "name": "out", @@ -4755,7 +5094,7 @@ "comment": " 0 or an error code" }, "description": "

Get the value of an integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "comments": "

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", "group": "config", "examples": { "general.c": [ @@ -4766,9 +5105,9 @@ }, "git_config_get_int64": { "type": "function", - "file": "config.h", - "line": 328, - "lineto": 328, + "file": "git2/config.h", + "line": 339, + "lineto": 339, "args": [ { "name": "out", @@ -4793,14 +5132,14 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a long integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "comments": "

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_bool": { "type": "function", - "file": "config.h", - "line": 345, - "lineto": 345, + "file": "git2/config.h", + "line": 356, + "lineto": 356, "args": [ { "name": "out", @@ -4825,14 +5164,14 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a boolean config variable.

\n", - "comments": "

This function uses the usual C convention of 0 being false and anything else true.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "comments": "

This function uses the usual C convention of 0 being false and\n anything else true.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_path": { "type": "function", - "file": "config.h", - "line": 363, - "lineto": 363, + "file": "git2/config.h", + "line": 374, + "lineto": 374, "args": [ { "name": "out", @@ -4857,14 +5196,14 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a path config variable.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which\n defaults to the user's home directory but can be overridden via\n git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_string": { "type": "function", - "file": "config.h", - "line": 381, - "lineto": 381, + "file": "git2/config.h", + "line": 392, + "lineto": 392, "args": [ { "name": "out", @@ -4889,7 +5228,7 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a string config variable.

\n", - "comments": "

This function can only be used on snapshot config objects. The string is owned by the config and should not be freed by the user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "comments": "

This function can only be used on snapshot config objects. The\n string is owned by the config and should not be freed by the\n user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", "group": "config", "examples": { "general.c": [ @@ -4900,9 +5239,9 @@ }, "git_config_get_string_buf": { "type": "function", - "file": "config.h", - "line": 397, - "lineto": 397, + "file": "git2/config.h", + "line": 408, + "lineto": 408, "args": [ { "name": "out", @@ -4927,14 +5266,14 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a string config variable.

\n", - "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_multivar_foreach": { "type": "function", - "file": "config.h", - "line": 415, - "lineto": 415, + "file": "git2/config.h", + "line": 426, + "lineto": 426, "args": [ { "name": "cfg", @@ -4969,14 +5308,14 @@ "comment": null }, "description": "

Get each value of a multivar in a foreach callback

\n", - "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", "group": "config" }, "git_config_multivar_iterator_new": { "type": "function", - "file": "config.h", - "line": 430, - "lineto": 430, + "file": "git2/config.h", + "line": 441, + "lineto": 441, "args": [ { "name": "out", @@ -5006,14 +5345,14 @@ "comment": null }, "description": "

Get each value of a multivar

\n", - "comments": "

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "comments": "

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", "group": "config" }, "git_config_next": { "type": "function", - "file": "config.h", - "line": 442, - "lineto": 442, + "file": "git2/config.h", + "line": 453, + "lineto": 453, "args": [ { "name": "entry", @@ -5033,14 +5372,14 @@ "comment": " 0 or an error code. GIT_ITEROVER if the iteration has completed" }, "description": "

Return the current entry and advance the iterator

\n", - "comments": "

The pointers returned by this function are valid until the iterator is freed.

\n", + "comments": "

The pointers returned by this function are valid until the iterator\n is freed.

\n", "group": "config" }, "git_config_iterator_free": { "type": "function", - "file": "config.h", - "line": 449, - "lineto": 449, + "file": "git2/config.h", + "line": 460, + "lineto": 460, "args": [ { "name": "iter", @@ -5060,9 +5399,9 @@ }, "git_config_set_int32": { "type": "function", - "file": "config.h", - "line": 460, - "lineto": 460, + "file": "git2/config.h", + "line": 471, + "lineto": 471, "args": [ { "name": "cfg", @@ -5092,9 +5431,9 @@ }, "git_config_set_int64": { "type": "function", - "file": "config.h", - "line": 471, - "lineto": 471, + "file": "git2/config.h", + "line": 482, + "lineto": 482, "args": [ { "name": "cfg", @@ -5124,9 +5463,9 @@ }, "git_config_set_bool": { "type": "function", - "file": "config.h", - "line": 482, - "lineto": 482, + "file": "git2/config.h", + "line": 493, + "lineto": 493, "args": [ { "name": "cfg", @@ -5156,9 +5495,9 @@ }, "git_config_set_string": { "type": "function", - "file": "config.h", - "line": 496, - "lineto": 496, + "file": "git2/config.h", + "line": 507, + "lineto": 507, "args": [ { "name": "cfg", @@ -5183,14 +5522,14 @@ "comment": " 0 or an error code" }, "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", + "comments": "

A copy of the string is made and the user is free to use it\n afterwards.

\n", "group": "config" }, "git_config_set_multivar": { "type": "function", - "file": "config.h", - "line": 508, - "lineto": 508, + "file": "git2/config.h", + "line": 519, + "lineto": 519, "args": [ { "name": "cfg", @@ -5225,9 +5564,9 @@ }, "git_config_delete_entry": { "type": "function", - "file": "config.h", - "line": 517, - "lineto": 517, + "file": "git2/config.h", + "line": 528, + "lineto": 528, "args": [ { "name": "cfg", @@ -5252,9 +5591,9 @@ }, "git_config_delete_multivar": { "type": "function", - "file": "config.h", - "line": 530, - "lineto": 530, + "file": "git2/config.h", + "line": 541, + "lineto": 541, "args": [ { "name": "cfg", @@ -5284,9 +5623,9 @@ }, "git_config_foreach": { "type": "function", - "file": "config.h", - "line": 548, - "lineto": 551, + "file": "git2/config.h", + "line": 559, + "lineto": 562, "args": [ { "name": "cfg", @@ -5311,14 +5650,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Perform an operation on each config variable.

\n", - "comments": "

The callback receives the normalized name and value of each variable in the config backend, and the data pointer passed to this function. If the callback returns a non-zero value, the function stops iterating and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the iteration is ongoing.

\n", + "comments": "

The callback receives the normalized name and value of each variable\n in the config backend, and the data pointer passed to this function.\n If the callback returns a non-zero value, the function stops iterating\n and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the\n iteration is ongoing.

\n", "group": "config" }, "git_config_iterator_new": { "type": "function", - "file": "config.h", - "line": 562, - "lineto": 562, + "file": "git2/config.h", + "line": 573, + "lineto": 573, "args": [ { "name": "out", @@ -5338,14 +5677,14 @@ "comment": null }, "description": "

Iterate over all the config variables

\n", - "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n", + "comments": "

Use git_config_next to advance the iteration and\n git_config_iterator_free when done.

\n", "group": "config" }, "git_config_iterator_glob_new": { "type": "function", - "file": "config.h", - "line": 578, - "lineto": 578, + "file": "git2/config.h", + "line": 589, + "lineto": 589, "args": [ { "name": "out", @@ -5370,14 +5709,14 @@ "comment": null }, "description": "

Iterate over all the config variables whose name matches a pattern

\n", - "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "comments": "

Use git_config_next to advance the iteration and\n git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", "group": "config" }, "git_config_foreach_match": { "type": "function", - "file": "config.h", - "line": 600, - "lineto": 604, + "file": "git2/config.h", + "line": 611, + "lineto": 615, "args": [ { "name": "cfg", @@ -5407,14 +5746,14 @@ "comment": " 0 or the return value of the callback which didn't return 0" }, "description": "

Perform an operation on each config variable matching a regular expression.

\n", - "comments": "

This behaviors like git_config_foreach with an additional filter of a regular expression that filters which config keys are passed to the callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the case-insensitive parts are lower-case.

\n", + "comments": "

This behaves like git_config_foreach with an additional filter of a\n regular expression that filters which config keys are passed to the\n callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the case-insensitive parts are lower-case.

\n", "group": "config" }, "git_config_get_mapped": { "type": "function", - "file": "config.h", - "line": 640, - "lineto": 645, + "file": "git2/config.h", + "line": 651, + "lineto": 656, "args": [ { "name": "out", @@ -5449,14 +5788,14 @@ "comment": " 0 on success, error code otherwise" }, "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", - "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_cvar_map autocrlf_mapping[] = {     {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", + "comments": "

This is a helper method to easily map different possible values\n to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_cvar_map autocrlf_mapping[] = {\n    {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},\n    {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},\n    {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},\n    {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the\n mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing\n the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison),\n the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be\n returned.

\n", "group": "config" }, "git_config_lookup_map_value": { "type": "function", - "file": "config.h", - "line": 655, - "lineto": 659, + "file": "git2/config.h", + "line": 666, + "lineto": 670, "args": [ { "name": "out", @@ -5491,9 +5830,9 @@ }, "git_config_parse_bool": { "type": "function", - "file": "config.h", - "line": 671, - "lineto": 671, + "file": "git2/config.h", + "line": 682, + "lineto": 682, "args": [ { "name": "out", @@ -5513,14 +5852,14 @@ "comment": null }, "description": "

Parse a string value as a bool.

\n", - "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any number different from 0 Valid values for false are: 'false', 'no', 'off', 0

\n", + "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any\n number different from 0\n Valid values for false are: 'false', 'no', 'off', 0

\n", "group": "config" }, "git_config_parse_int32": { "type": "function", - "file": "config.h", - "line": 683, - "lineto": 683, + "file": "git2/config.h", + "line": 694, + "lineto": 694, "args": [ { "name": "out", @@ -5540,14 +5879,14 @@ "comment": null }, "description": "

Parse a string value as an int32.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will\n cause the value to be multiplied by 1024, 1048576,\n or 1073741824 prior to output.

\n", "group": "config" }, "git_config_parse_int64": { "type": "function", - "file": "config.h", - "line": 695, - "lineto": 695, + "file": "git2/config.h", + "line": 706, + "lineto": 706, "args": [ { "name": "out", @@ -5567,14 +5906,14 @@ "comment": null }, "description": "

Parse a string value as an int64.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will\n cause the value to be multiplied by 1024, 1048576,\n or 1073741824 prior to output.

\n", "group": "config" }, "git_config_parse_path": { "type": "function", - "file": "config.h", - "line": 710, - "lineto": 710, + "file": "git2/config.h", + "line": 721, + "lineto": 721, "args": [ { "name": "out", @@ -5594,14 +5933,14 @@ "comment": null }, "description": "

Parse a string value as a path.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be returned.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which\n defaults to the user's home directory but can be overridden via\n git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be\n returned.

\n", "group": "config" }, "git_config_backend_foreach_match": { "type": "function", - "file": "config.h", - "line": 728, - "lineto": 732, + "file": "git2/config.h", + "line": 739, + "lineto": 743, "args": [ { "name": "backend", @@ -5630,15 +5969,15 @@ "type": "int", "comment": null }, - "description": "

Perform an operation on each config variable in given config backend\n matching a regular expression.

\n", - "comments": "

This behaviors like git_config_foreach_match except instead of all config entries it just enumerates through the given backend entry.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "description": "

Perform an operation on each config variable in a given config backend,\n matching a regular expression.

\n", + "comments": "

This behaves like git_config_foreach_match except that only config\n entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", "group": "config" }, "git_config_lock": { "type": "function", - "file": "config.h", - "line": 751, - "lineto": 751, + "file": "git2/config.h", + "line": 762, + "lineto": 762, "args": [ { "name": "tx", @@ -5658,12 +5997,12 @@ "comment": " 0 or an error code" }, "description": "

Lock the backend with the highest priority

\n", - "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", + "comments": "

Locking disallows anybody else from writing to that backend. Any\n updates made after locking will not be visible to a reader until\n the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit()\n before freeing the transaction. Either of these actions will unlock\n the config.

\n", "group": "config" }, "git_cred_userpass": { "type": "function", - "file": "cred_helpers.h", + "file": "git2/cred_helpers.h", "line": 43, "lineto": 48, "args": [ @@ -5703,11 +6042,75 @@ "comments": "", "group": "cred" }, + "git_describe_init_options": { + "type": "function", + "file": "git2/describe.h", + "line": 82, + "lineto": 82, + "args": [ + { + "name": "opts", + "type": "git_describe_options *", + "comment": "The `git_describe_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_options *opts, unsigned int version", + "sig": "git_describe_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_options structure

\n", + "comments": "

Initializes a git_describe_options with default values. Equivalent to creating\n an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/HEAD/describe.html#git_describe_init_options-1" + ] + } + }, + "git_describe_init_format_options": { + "type": "function", + "file": "git2/describe.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "opts", + "type": "git_describe_format_options *", + "comment": "The `git_describe_format_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_FORMAT_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_format_options *opts, unsigned int version", + "sig": "git_describe_format_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_format_options structure

\n", + "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating\n an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/HEAD/describe.html#git_describe_init_format_options-2" + ] + } + }, "git_describe_commit": { "type": "function", - "file": "describe.h", - "line": 123, - "lineto": 126, + "file": "git2/describe.h", + "line": 146, + "lineto": 149, "args": [ { "name": "result", @@ -5722,7 +6125,7 @@ { "name": "opts", "type": "git_describe_options *", - "comment": "the lookup options" + "comment": "the lookup options (or NULL for defaults)" } ], "argline": "git_describe_result **result, git_object *committish, git_describe_options *opts", @@ -5736,15 +6139,15 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_commit-1" + "ex/HEAD/describe.html#git_describe_commit-3" ] } }, "git_describe_workdir": { "type": "function", - "file": "describe.h", - "line": 140, - "lineto": 143, + "file": "git2/describe.h", + "line": 163, + "lineto": 166, "args": [ { "name": "out", @@ -5759,7 +6162,7 @@ { "name": "opts", "type": "git_describe_options *", - "comment": "the lookup options" + "comment": "the lookup options (or NULL for defaults)" } ], "argline": "git_describe_result **out, git_repository *repo, git_describe_options *opts", @@ -5769,19 +6172,19 @@ "comment": null }, "description": "

Describe a commit

\n", - "comments": "

Perform the describe operation on the current commit and the worktree. After peforming describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", + "comments": "

Perform the describe operation on the current commit and the\n worktree. After peforming describe on HEAD, a status is run and the\n description is considered to be dirty if there are.

\n", "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_workdir-2" + "ex/HEAD/describe.html#git_describe_workdir-4" ] } }, "git_describe_format": { "type": "function", - "file": "describe.h", - "line": 153, - "lineto": 156, + "file": "git2/describe.h", + "line": 176, + "lineto": 179, "args": [ { "name": "out", @@ -5796,7 +6199,7 @@ { "name": "opts", "type": "const git_describe_format_options *", - "comment": "the formatting options" + "comment": "the formatting options (or NULL for defaults)" } ], "argline": "git_buf *out, const git_describe_result *result, const git_describe_format_options *opts", @@ -5810,15 +6213,15 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_format-3" + "ex/HEAD/describe.html#git_describe_format-5" ] } }, "git_describe_result_free": { "type": "function", - "file": "describe.h", - "line": 161, - "lineto": 161, + "file": "git2/describe.h", + "line": 184, + "lineto": 184, "args": [ { "name": "result", @@ -5838,19 +6241,19 @@ }, "git_diff_init_options": { "type": "function", - "file": "diff.h", - "line": 447, - "lineto": 449, + "file": "git2/diff.h", + "line": 454, + "lineto": 456, "args": [ { "name": "opts", "type": "git_diff_options *", - "comment": "The `git_diff_options` struct to initialize" + "comment": "The `git_diff_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_DIFF_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_DIFF_OPTIONS_VERSION`." } ], "argline": "git_diff_options *opts, unsigned int version", @@ -5859,25 +6262,25 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_diff_options with default values. Equivalent to\n creating an instance with GIT_DIFF_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_diff_options structure

\n", + "comments": "

Initializes a git_diff_options with default values. Equivalent to creating\n an instance with GIT_DIFF_OPTIONS_INIT.

\n", "group": "diff" }, "git_diff_find_init_options": { "type": "function", - "file": "diff.h", - "line": 742, - "lineto": 744, + "file": "git2/diff.h", + "line": 787, + "lineto": 789, "args": [ { "name": "opts", "type": "git_diff_find_options *", - "comment": "The `git_diff_find_options` struct to initialize" + "comment": "The `git_diff_find_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_DIFF_FIND_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_DIFF_FIND_OPTIONS_VERSION`." } ], "argline": "git_diff_find_options *opts, unsigned int version", @@ -5886,15 +6289,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_diff_find_options with default values. Equivalent to\n creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_diff_find_options structure

\n", + "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating\n an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", "group": "diff" }, "git_diff_free": { "type": "function", - "file": "diff.h", - "line": 758, - "lineto": 758, + "file": "git2/diff.h", + "line": 803, + "lineto": 803, "args": [ { "name": "diff", @@ -5923,9 +6326,9 @@ }, "git_diff_tree_to_tree": { "type": "function", - "file": "diff.h", - "line": 776, - "lineto": 781, + "file": "git2/diff.h", + "line": 821, + "lineto": 826, "args": [ { "name": "diff", @@ -5960,7 +6363,7 @@ "comment": null }, "description": "

Create a diff with the difference between two tree objects.

\n", - "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", + "comments": "

This is equivalent to git diff \n<old\n-tree> \n<new\n-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the\n second tree will be used for the "new_file" side of the delta. You can\n pass NULL to indicate an empty tree, although it is an error to pass\n NULL for both the old_tree and new_tree.

\n", "group": "diff", "examples": { "diff.c": [ @@ -5974,9 +6377,9 @@ }, "git_diff_tree_to_index": { "type": "function", - "file": "diff.h", - "line": 802, - "lineto": 807, + "file": "git2/diff.h", + "line": 847, + "lineto": 852, "args": [ { "name": "diff", @@ -6011,7 +6414,7 @@ "comment": null }, "description": "

Create a diff between a tree and repository index.

\n", - "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "comments": "

This is equivalent to `git diff --cached \n<treeish

\n\n
\n

or if you pass\n the HEAD tree, then likegit diff --cached`.

\n
\n\n

The tree you pass will be used for the "old_file" side of the delta, and\n the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo\n will be used. In this case, the index will be refreshed from disk\n (if it has changed) before the diff is generated.

\n", "group": "diff", "examples": { "diff.c": [ @@ -6021,9 +6424,9 @@ }, "git_diff_index_to_workdir": { "type": "function", - "file": "diff.h", - "line": 829, - "lineto": 833, + "file": "git2/diff.h", + "line": 874, + "lineto": 878, "args": [ { "name": "diff", @@ -6053,7 +6456,7 @@ "comment": null }, "description": "

Create a diff between the repository index and the workdir directory.

\n", - "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "comments": "

This matches the git diff command. See the note below on\n git_diff_tree_to_workdir for a discussion of the difference between\n git diff and git diff HEAD and how to emulate a `git diff \n<treeish

\n\n
\n

`\n using libgit2.

\n
\n\n

The index will be used for the "old_file" side of the delta, and the\n working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo\n will be used. In this case, the index will be refreshed from disk\n (if it has changed) before the diff is generated.

\n", "group": "diff", "examples": { "diff.c": [ @@ -6063,9 +6466,9 @@ }, "git_diff_tree_to_workdir": { "type": "function", - "file": "diff.h", - "line": 858, - "lineto": 862, + "file": "git2/diff.h", + "line": 903, + "lineto": 907, "args": [ { "name": "diff", @@ -6095,7 +6498,7 @@ "comment": null }, "description": "

Create a diff between a tree and the working directory.

\n", - "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", + "comments": "

The tree you provide will be used for the "old_file" side of the delta,\n and the working directory will be used for the "new_file" side.

\n\n

This is not the same as `git diff \n<treeish

\n\n
\n

orgit diff-index

\n
\n\n

<treeish

\n\n
\n

. Those commands use information from the index, whereas this\n function strictly returns the differences between the tree and the files\n in the working directory, regardless of the state of the index. Use\ngit_diff_tree_to_workdir_with_index` to emulate those commands.

\n
\n\n

To see difference between this and git_diff_tree_to_workdir_with_index,\n consider the example of a staged file deletion where the file has then\n been put back into the working dir and further modified. The\n tree-to-workdir diff for that file is 'modified', but git diff would\n show status 'deleted' since there is a staged delete.

\n", "group": "diff", "examples": { "diff.c": [ @@ -6105,9 +6508,9 @@ }, "git_diff_tree_to_workdir_with_index": { "type": "function", - "file": "diff.h", - "line": 877, - "lineto": 881, + "file": "git2/diff.h", + "line": 922, + "lineto": 926, "args": [ { "name": "diff", @@ -6137,7 +6540,7 @@ "comment": null }, "description": "

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n", - "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", + "comments": "

This emulates `git diff \n<tree

\n\n
\n

` by diffing the tree to the index and\n the index to the working directory and blending the results into a\n single diff that includes staged deleted, etc.

\n
\n", "group": "diff", "examples": { "diff.c": [ @@ -6147,9 +6550,9 @@ }, "git_diff_index_to_index": { "type": "function", - "file": "diff.h", - "line": 895, - "lineto": 900, + "file": "git2/diff.h", + "line": 940, + "lineto": 945, "args": [ { "name": "diff", @@ -6184,14 +6587,14 @@ "comment": null }, "description": "

Create a diff with the difference between two index objects.

\n", - "comments": "

The first index will be used for the "old_file" side of the delta and the second index will be used for the "new_file" side of the delta.

\n", + "comments": "

The first index will be used for the "old_file" side of the delta and the\n second index will be used for the "new_file" side of the delta.

\n", "group": "diff" }, "git_diff_merge": { "type": "function", - "file": "diff.h", - "line": 915, - "lineto": 917, + "file": "git2/diff.h", + "line": 960, + "lineto": 962, "args": [ { "name": "onto", @@ -6211,14 +6614,14 @@ "comment": null }, "description": "

Merge one diff into another.

\n", - "comments": "

This merges items from the "from" list into the "onto" list. The resulting diff will have all items that appear in either list. If an item appears in both lists, then it will be "merged" to appear as if the old version was from the "onto" list and the new version is from the "from" list (with the exception that if the item has a pending DELETE in the middle, then it will show as deleted).

\n", + "comments": "

This merges items from the "from" list into the "onto" list. The\n resulting diff will have all items that appear in either list.\n If an item appears in both lists, then it will be "merged" to appear\n as if the old version was from the "onto" list and the new version\n is from the "from" list (with the exception that if the item has a\n pending DELETE in the middle, then it will show as deleted).

\n", "group": "diff" }, "git_diff_find_similar": { "type": "function", - "file": "diff.h", - "line": 931, - "lineto": 933, + "file": "git2/diff.h", + "line": 976, + "lineto": 978, "args": [ { "name": "diff", @@ -6238,7 +6641,7 @@ "comment": " 0 on success, -1 on failure" }, "description": "

Transform a diff marking file renames, copies, etc.

\n", - "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", + "comments": "

This modifies a diff in place, replacing old entries that look\n like renames or copies with new entries reflecting those changes.\n This also will, if requested, break modified files into add/remove\n pairs if the amount of change is above a threshold.

\n", "group": "diff", "examples": { "diff.c": [ @@ -6248,9 +6651,9 @@ }, "git_diff_num_deltas": { "type": "function", - "file": "diff.h", - "line": 951, - "lineto": 951, + "file": "git2/diff.h", + "line": 996, + "lineto": 996, "args": [ { "name": "diff", @@ -6275,9 +6678,9 @@ }, "git_diff_num_deltas_of_type": { "type": "function", - "file": "diff.h", - "line": 964, - "lineto": 965, + "file": "git2/diff.h", + "line": 1009, + "lineto": 1010, "args": [ { "name": "diff", @@ -6297,14 +6700,14 @@ "comment": " Count of number of deltas matching delta_t type" }, "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", - "comments": "

This works just like git_diff_entrycount() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", + "comments": "

This works just like git_diff_entrycount() with an extra parameter\n that is a git_delta_t and returns just the count of how many deltas\n match that particular type.

\n", "group": "diff" }, "git_diff_get_delta": { "type": "function", - "file": "diff.h", - "line": 984, - "lineto": 985, + "file": "git2/diff.h", + "line": 1029, + "lineto": 1030, "args": [ { "name": "diff", @@ -6324,14 +6727,14 @@ "comment": " Pointer to git_diff_delta (or NULL if `idx` out of range)" }, "description": "

Return the diff delta for an entry in the diff list.

\n", - "comments": "

The git_diff_delta pointer points to internal data and you do not have to release it when you are done with it. It will go away when the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary content or not may not be set if there are no attributes set for the file and there has been no reason to load the file data at this point. For now, if you need those flags to be up to date, your only option is to either use git_diff_foreach or create a git_patch.

\n", + "comments": "

The git_diff_delta pointer points to internal data and you do not\n have to release it when you are done with it. It will go away when\n the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary\n content or not may not be set if there are no attributes set for the\n file and there has been no reason to load the file data at this point.\n For now, if you need those flags to be up to date, your only option is\n to either use git_diff_foreach or create a git_patch.

\n", "group": "diff" }, "git_diff_is_sorted_icase": { "type": "function", - "file": "diff.h", - "line": 993, - "lineto": 993, + "file": "git2/diff.h", + "line": 1038, + "lineto": 1038, "args": [ { "name": "diff", @@ -6351,9 +6754,9 @@ }, "git_diff_foreach": { "type": "function", - "file": "diff.h", - "line": 1021, - "lineto": 1027, + "file": "git2/diff.h", + "line": 1066, + "lineto": 1072, "args": [ { "name": "diff", @@ -6393,14 +6796,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Loop over all deltas in a diff issuing callbacks.

\n", - "comments": "

This will iterate through all of the files described in a diff. You should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the files will only be calculated if they are not NULL. Of course, these callbacks will not be invoked for binary files on the diff or for files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate the iteration and return the value to the user.

\n", + "comments": "

This will iterate through all of the files described in a diff. You\n should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the\n files will only be calculated if they are not NULL. Of course, these\n callbacks will not be invoked for binary files on the diff or for\n files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate\n the iteration and return the value to the user.

\n", "group": "diff" }, "git_diff_status_char": { "type": "function", - "file": "diff.h", - "line": 1040, - "lineto": 1040, + "file": "git2/diff.h", + "line": 1085, + "lineto": 1085, "args": [ { "name": "status", @@ -6415,14 +6818,14 @@ "comment": " The single character label for that code" }, "description": "

Look up the single character abbreviation for a delta status code.

\n", - "comments": "

When you run git diff --name-status it uses single letter codes in the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. This function converts a git_delta_t value into these letters for your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", + "comments": "

When you run git diff --name-status it uses single letter codes in\n the output such as 'A' for added, 'D' for deleted, 'M' for modified,\n etc. This function converts a git_delta_t value into these letters for\n your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", "group": "diff" }, "git_diff_print": { "type": "function", - "file": "diff.h", - "line": 1065, - "lineto": 1069, + "file": "git2/diff.h", + "line": 1110, + "lineto": 1114, "args": [ { "name": "diff", @@ -6452,7 +6855,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Iterate over a diff generating formatted text output.

\n", - "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", + "comments": "

Returning a non-zero value from the callbacks will terminate the\n iteration and return the non-zero value to the caller.

\n", "group": "diff", "examples": { "diff.c": [ @@ -6465,9 +6868,9 @@ }, "git_diff_to_buf": { "type": "function", - "file": "diff.h", - "line": 1081, - "lineto": 1084, + "file": "git2/diff.h", + "line": 1126, + "lineto": 1129, "args": [ { "name": "out", @@ -6497,9 +6900,9 @@ }, "git_diff_blobs": { "type": "function", - "file": "diff.h", - "line": 1121, - "lineto": 1131, + "file": "git2/diff.h", + "line": 1166, + "lineto": 1176, "args": [ { "name": "old_blob", @@ -6559,14 +6962,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Directly run a diff on two blobs.

\n", - "comments": "

Compared to a file, a blob lacks some contextual information. As such, the git_diff_file given to the callback will have some fake data; i.e. mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated as an empty blob, with the oid set to NULL in the git_diff_file data. Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob looks like binary data, the git_diff_delta binary attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass GIT_DIFF_FORCE_TEXT of course).

\n", + "comments": "

Compared to a file, a blob lacks some contextual information. As such,\n the git_diff_file given to the callback will have some fake data; i.e.\n mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated\n as an empty blob, with the oid set to NULL in the git_diff_file data.\n Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob\n looks like binary data, the git_diff_delta binary attribute will be set\n to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass\n GIT_DIFF_FORCE_TEXT of course).

\n", "group": "diff" }, "git_diff_blob_to_buffer": { "type": "function", - "file": "diff.h", - "line": 1158, - "lineto": 1169, + "file": "git2/diff.h", + "line": 1203, + "lineto": 1214, "args": [ { "name": "old_blob", @@ -6631,14 +7034,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Directly run a diff between a blob and a buffer.

\n", - "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the entire content of the buffer added). Passing NULL to the buffer will do the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", + "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context,\n so the git_diff_file parameters to the callbacks will be faked a la the\n rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the\n file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the\n entire content of the buffer added). Passing NULL to the buffer will do\n the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", "group": "diff" }, "git_diff_buffers": { "type": "function", - "file": "diff.h", - "line": 1192, - "lineto": 1204, + "file": "git2/diff.h", + "line": 1237, + "lineto": 1249, "args": [ { "name": "old_buffer", @@ -6708,14 +7111,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Directly run a diff between two buffers.

\n", - "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n", + "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks\n context, so the git_diff_file parameters to the callbacks will be\n faked a la the rules for git_diff_blobs().

\n", "group": "diff" }, "git_diff_from_buffer": { "type": "function", - "file": "diff.h", - "line": 1225, - "lineto": 1228, + "file": "git2/diff.h", + "line": 1270, + "lineto": 1273, "args": [ { "name": "out", @@ -6740,14 +7143,14 @@ "comment": " 0 or an error code" }, "description": "

Read the contents of a git patch file into a git_diff object.

\n", - "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", + "comments": "

The diff object produced is similar to the one that would be\n produced if you actually produced it computationally by comparing\n two trees, however there may be subtle differences. For example,\n a patch file likely contains abbreviated object IDs, so the\n object IDs in a git_diff_delta produced by this function will\n also be abbreviated.

\n\n

This function will only read patch files created by a git\n implementation, it will not read unified diffs produced by\n the diff program, nor any other types of patch files.

\n", "group": "diff" }, "git_diff_get_stats": { "type": "function", - "file": "diff.h", - "line": 1264, - "lineto": 1266, + "file": "git2/diff.h", + "line": 1309, + "lineto": 1311, "args": [ { "name": "out", @@ -6777,9 +7180,9 @@ }, "git_diff_stats_files_changed": { "type": "function", - "file": "diff.h", - "line": 1274, - "lineto": 1275, + "file": "git2/diff.h", + "line": 1319, + "lineto": 1320, "args": [ { "name": "stats", @@ -6799,9 +7202,9 @@ }, "git_diff_stats_insertions": { "type": "function", - "file": "diff.h", - "line": 1283, - "lineto": 1284, + "file": "git2/diff.h", + "line": 1328, + "lineto": 1329, "args": [ { "name": "stats", @@ -6821,9 +7224,9 @@ }, "git_diff_stats_deletions": { "type": "function", - "file": "diff.h", - "line": 1292, - "lineto": 1293, + "file": "git2/diff.h", + "line": 1337, + "lineto": 1338, "args": [ { "name": "stats", @@ -6843,9 +7246,9 @@ }, "git_diff_stats_to_buf": { "type": "function", - "file": "diff.h", - "line": 1304, - "lineto": 1308, + "file": "git2/diff.h", + "line": 1349, + "lineto": 1353, "args": [ { "name": "out", @@ -6885,9 +7288,9 @@ }, "git_diff_stats_free": { "type": "function", - "file": "diff.h", - "line": 1316, - "lineto": 1316, + "file": "git2/diff.h", + "line": 1361, + "lineto": 1361, "args": [ { "name": "stats", @@ -6912,9 +7315,9 @@ }, "git_diff_format_email": { "type": "function", - "file": "diff.h", - "line": 1368, - "lineto": 1371, + "file": "git2/diff.h", + "line": 1413, + "lineto": 1416, "args": [ { "name": "out", @@ -6944,9 +7347,9 @@ }, "git_diff_commit_as_email": { "type": "function", - "file": "diff.h", - "line": 1387, - "lineto": 1394, + "file": "git2/diff.h", + "line": 1432, + "lineto": 1439, "args": [ { "name": "out", @@ -6996,19 +7399,19 @@ }, "git_diff_format_email_init_options": { "type": "function", - "file": "diff.h", - "line": 1405, - "lineto": 1407, + "file": "git2/diff.h", + "line": 1451, + "lineto": 1453, "args": [ { "name": "opts", "type": "git_diff_format_email_options *", - "comment": "The `git_diff_format_email_options` struct to initialize" + "comment": "The `git_blame_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." } ], "argline": "git_diff_format_email_options *opts, unsigned int version", @@ -7017,47 +7420,47 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_diff_format_email_options with default values.

\n", - "comments": "

Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", + "description": "

Initialize git_diff_format_email_options structure

\n", + "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent\n to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", "group": "diff" }, "git_diff_patchid_init_options": { "type": "function", - "file": "diff.h", - "line": 1428, - "lineto": 1430, + "file": "git2/diff.h", + "line": 1479, + "lineto": 1481, "args": [ { "name": "opts", "type": "git_diff_patchid_options *", - "comment": null + "comment": "The `git_diff_patchid_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": null + "comment": "The struct version; pass `GIT_DIFF_PATCHID_OPTIONS_VERSION`." } ], "argline": "git_diff_patchid_options *opts, unsigned int version", "sig": "git_diff_patchid_options *::unsigned int", "return": { "type": "int", - "comment": null + "comment": " Zero on success; -1 on failure." }, - "description": "

Initialize git_diff_patchid_options structure.

\n", - "comments": "

Initializes the structure with default values. Equivalent to creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", + "description": "

Initialize git_diff_patchid_options structure

\n", + "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to\n creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", "group": "diff" }, "git_diff_patchid": { "type": "function", - "file": "diff.h", - "line": 1452, - "lineto": 1452, + "file": "git2/diff.h", + "line": 1502, + "lineto": 1502, "args": [ { "name": "out", "type": "git_oid *", - "comment": "Pointer where the calculated patch ID shoul be\n stored" + "comment": "Pointer where the calculated patch ID should be stored" }, { "name": "diff", @@ -7077,14 +7480,14 @@ "comment": " 0 on success, an error code otherwise." }, "description": "

Calculate the patch ID for the given patch.

\n", - "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", + "comments": "

Calculate a stable patch ID for the given patch by summing the\n hash of the file diffs, ignoring whitespace and line numbers.\n This can be used to derive whether two diffs are the same with\n a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as\n defined in git-patch-id(1), and should in fact generate the\n same IDs as the upstream git project does.

\n", "group": "diff" }, "giterr_last": { "type": "function", - "file": "errors.h", - "line": 115, - "lineto": 115, + "file": "git2/errors.h", + "line": 122, + "lineto": 122, "args": [], "argline": "", "sig": "", @@ -7092,27 +7495,30 @@ "type": "const git_error *", "comment": " A git_error object." }, - "description": "

Return the last git_error object that was generated for the\n current thread or NULL if no error has occurred.

\n", - "comments": "", + "description": "

Return the last git_error object that was generated for the\n current thread.

\n", + "comments": "

The default behaviour of this function is to return NULL if no previous error has occurred.\n However, libgit2's error strings are not cleared aggressively, so a prior\n (unrelated) error may be returned. This can be avoided by only calling\n this function if the prior call to a libgit2 API returned an error.

\n", "group": "giterr", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#giterr_last-8", + "ex/HEAD/checkout.html#giterr_last-9", + "ex/HEAD/checkout.html#giterr_last-10", + "ex/HEAD/checkout.html#giterr_last-11" + ], "general.c": [ "ex/HEAD/general.html#giterr_last-33" ], "merge.c": [ - "ex/HEAD/merge.html#giterr_last-10", - "ex/HEAD/merge.html#giterr_last-11" - ], - "network/clone.c": [ - "ex/HEAD/network/clone.html#giterr_last-2" + "ex/HEAD/merge.html#giterr_last-8", + "ex/HEAD/merge.html#giterr_last-9" ] } }, "giterr_clear": { "type": "function", - "file": "errors.h", - "line": 120, - "lineto": 120, + "file": "git2/errors.h", + "line": 127, + "lineto": 127, "args": [], "argline": "", "sig": "", @@ -7126,9 +7532,9 @@ }, "giterr_set_str": { "type": "function", - "file": "errors.h", - "line": 138, - "lineto": 138, + "file": "git2/errors.h", + "line": 145, + "lineto": 145, "args": [ { "name": "error_class", @@ -7148,14 +7554,14 @@ "comment": null }, "description": "

Set the error message string for this thread.

\n", - "comments": "

This function is public so that custom ODB backends and the like can relay an error message through libgit2. Most regular users of libgit2 will never need to call this function -- actually, calling it in most circumstances (for example, calling from within a callback function) will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies to the particular thread that this libgit2 call is made from.

\n", + "comments": "

This function is public so that custom ODB backends and the like can\n relay an error message through libgit2. Most regular users of libgit2\n will never need to call this function -- actually, calling it in most\n circumstances (for example, calling from within a callback function)\n will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies\n to the particular thread that this libgit2 call is made from.

\n", "group": "giterr" }, "giterr_set_oom": { "type": "function", - "file": "errors.h", - "line": 149, - "lineto": 149, + "file": "git2/errors.h", + "line": 156, + "lineto": 156, "args": [], "argline": "", "sig": "", @@ -7164,12 +7570,12 @@ "comment": null }, "description": "

Set the error message to a special value for memory allocation failure.

\n", - "comments": "

The normal giterr_set_str() function attempts to strdup() the string that is passed in. This is not a good idea when the error in question is a memory allocation failure. That circumstance has a special setter function that sets the error string to a known and statically allocated internal value.

\n", + "comments": "

The normal giterr_set_str() function attempts to strdup() the string\n that is passed in. This is not a good idea when the error in question\n is a memory allocation failure. That circumstance has a special setter\n function that sets the error string to a known and statically allocated\n internal value.

\n", "group": "giterr" }, "git_filter_list_load": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 90, "lineto": 96, "args": [ @@ -7211,12 +7617,12 @@ "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" }, "description": "

Load the filter list for a given path.

\n", - "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL\n if no filters are requested for the given file.

\n", "group": "filter" }, "git_filter_list_contains": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 110, "lineto": 112, "args": [ @@ -7238,12 +7644,12 @@ "comment": " 1 if the filter is in the list, 0 otherwise" }, "description": "

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n", - "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", + "comments": "

This will return 0 if the given filter is not in the list, or 1 if\n the filter will be applied.

\n", "group": "filter" }, "git_filter_list_apply_to_data": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 134, "lineto": 137, "args": [ @@ -7270,12 +7676,12 @@ "comment": " 0 on success, an error code otherwise" }, "description": "

Apply filter list to a data buffer.

\n", - "comments": "

See git2/buffer.h for background on git_buf objects.

\n\n

If the in buffer holds data allocated by libgit2 (i.e. in->asize is not zero), then it will be overwritten when applying the filters. If not, then it will be left untouched.

\n\n

If there are no filters to apply (or filters is NULL), then the out buffer will reference the in buffer data (with asize set to zero) instead of allocating data. This keeps allocations to a minimum, but it means you have to be careful about freeing the in data since out may be pointing to it!

\n", + "comments": "

See git2/buffer.h for background on git_buf objects.

\n\n

If the in buffer holds data allocated by libgit2 (i.e. in->asize is\n not zero), then it will be overwritten when applying the filters. If\n not, then it will be left untouched.

\n\n

If there are no filters to apply (or filters is NULL), then the out\n buffer will reference the in buffer data (with asize set to zero)\n instead of allocating data. This keeps allocations to a minimum, but\n it means you have to be careful about freeing the in data since out\n may be pointing to it!

\n", "group": "filter" }, "git_filter_list_apply_to_file": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 148, "lineto": 152, "args": [ @@ -7312,7 +7718,7 @@ }, "git_filter_list_apply_to_blob": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 161, "lineto": 164, "args": [ @@ -7344,7 +7750,7 @@ }, "git_filter_list_stream_data": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 173, "lineto": 176, "args": [ @@ -7376,7 +7782,7 @@ }, "git_filter_list_stream_file": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 187, "lineto": 191, "args": [ @@ -7413,7 +7819,7 @@ }, "git_filter_list_stream_blob": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 200, "lineto": 203, "args": [ @@ -7445,7 +7851,7 @@ }, "git_filter_list_free": { "type": "function", - "file": "filter.h", + "file": "git2/filter.h", "line": 210, "lineto": 210, "args": [ @@ -7467,7 +7873,7 @@ }, "git_libgit2_init": { "type": "function", - "file": "global.h", + "file": "git2/global.h", "line": 26, "lineto": 26, "args": [], @@ -7478,7 +7884,7 @@ "comment": " the number of initializations of the library, or an error code." }, "description": "

Init the global state

\n", - "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", + "comments": "

This function must be called before any other libgit2 function in\n order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number\n of times the initialization has been called (including this one) that have\n not subsequently been shutdown.

\n", "group": "libgit2", "examples": { "blame.c": [ @@ -7487,8 +7893,11 @@ "cat-file.c": [ "ex/HEAD/cat-file.html#git_libgit2_init-10" ], + "checkout.c": [ + "ex/HEAD/checkout.html#git_libgit2_init-12" + ], "describe.c": [ - "ex/HEAD/describe.html#git_libgit2_init-4" + "ex/HEAD/describe.html#git_libgit2_init-6" ], "diff.c": [ "ex/HEAD/diff.html#git_libgit2_init-13" @@ -7502,8 +7911,11 @@ "log.c": [ "ex/HEAD/log.html#git_libgit2_init-31" ], + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_libgit2_init-1" + ], "merge.c": [ - "ex/HEAD/merge.html#git_libgit2_init-12" + "ex/HEAD/merge.html#git_libgit2_init-10" ], "remote.c": [ "ex/HEAD/remote.html#git_libgit2_init-2" @@ -7521,7 +7933,7 @@ }, "git_libgit2_shutdown": { "type": "function", - "file": "global.h", + "file": "git2/global.h", "line": 39, "lineto": 39, "args": [], @@ -7532,7 +7944,7 @@ "comment": " the number of remaining initializations of the library, or an\n error code." }, "description": "

Shutdown the global state

\n", - "comments": "

Clean up the global state and threading context after calling it as many times as git_libgit2_init() was called - it will return the number of remainining initializations that have not been shutdown (after this one).

\n", + "comments": "

Clean up the global state and threading context after calling it as\n many times as git_libgit2_init() was called - it will return the\n number of remainining initializations that have not been shutdown\n (after this one).

\n", "group": "libgit2", "examples": { "blame.c": [ @@ -7541,8 +7953,11 @@ "cat-file.c": [ "ex/HEAD/cat-file.html#git_libgit2_shutdown-11" ], + "checkout.c": [ + "ex/HEAD/checkout.html#git_libgit2_shutdown-13" + ], "describe.c": [ - "ex/HEAD/describe.html#git_libgit2_shutdown-5" + "ex/HEAD/describe.html#git_libgit2_shutdown-7" ], "diff.c": [ "ex/HEAD/diff.html#git_libgit2_shutdown-14" @@ -7553,8 +7968,11 @@ "log.c": [ "ex/HEAD/log.html#git_libgit2_shutdown-32" ], + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_libgit2_shutdown-2" + ], "merge.c": [ - "ex/HEAD/merge.html#git_libgit2_shutdown-13" + "ex/HEAD/merge.html#git_libgit2_shutdown-11" ], "remote.c": [ "ex/HEAD/remote.html#git_libgit2_shutdown-3" @@ -7572,7 +7990,7 @@ }, "git_graph_ahead_behind": { "type": "function", - "file": "graph.h", + "file": "git2/graph.h", "line": 37, "lineto": 37, "args": [ @@ -7609,12 +8027,12 @@ "comment": null }, "description": "

Count the number of unique commits between two commit objects

\n", - "comments": "

There is no need for branches containing the commits to have any upstream relationship, but it helps to think of one as a branch and the other as its upstream, the ahead and behind values will be what git would report for the branches.

\n", + "comments": "

There is no need for branches containing the commits to have any\n upstream relationship, but it helps to think of one as a branch and\n the other as its upstream, the ahead and behind values will be\n what git would report for the branches.

\n", "group": "graph" }, "git_graph_descendant_of": { "type": "function", - "file": "graph.h", + "file": "git2/graph.h", "line": 51, "lineto": 54, "args": [ @@ -7641,12 +8059,12 @@ "comment": " 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise." }, "description": "

Determine if a commit is the descendant of another commit.

\n", - "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", + "comments": "

Note that a commit is not considered a descendant of itself, in contrast\n to git merge-base --is-ancestor.

\n", "group": "graph" }, "git_ignore_add_rule": { "type": "function", - "file": "ignore.h", + "file": "git2/ignore.h", "line": 37, "lineto": 39, "args": [ @@ -7668,12 +8086,12 @@ "comment": " 0 on success" }, "description": "

Add ignore rules for a repository.

\n", - "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from .gitignore files in the repository tree or from a shared system file only if a "core.excludesfile" config value is set. The library also keeps a set of per-repository internal ignores that can be configured in-memory and will not persist. This function allows you to add to that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c/ with space");\n
\n\n

This would add three rules to the ignores.

\n", + "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from\n .gitignore files in the repository tree or from a shared system file\n only if a "core.excludesfile" config value is set. The library also\n keeps a set of per-repository internal ignores that can be configured\n in-memory and will not persist. This function allows you to add to\n that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c\n
\n\n

/

\n\n

with space

\n\n

");

\n\n

This would add three rules to the ignores.

\n", "group": "ignore" }, "git_ignore_clear_internal_rules": { "type": "function", - "file": "ignore.h", + "file": "git2/ignore.h", "line": 52, "lineto": 53, "args": [ @@ -7690,12 +8108,12 @@ "comment": " 0 on success" }, "description": "

Clear ignore rules that were explicitly added.

\n", - "comments": "

Resets to the default internal ignore rules. This will not turn off rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", + "comments": "

Resets to the default internal ignore rules. This will not turn off\n rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", "group": "ignore" }, "git_ignore_path_is_ignored": { "type": "function", - "file": "ignore.h", + "file": "git2/ignore.h", "line": 71, "lineto": 74, "args": [ @@ -7722,12 +8140,12 @@ "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." }, "description": "

Test if the ignore rules apply to a given path.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the\n given file. This indicates if the file would be ignored regardless of\n whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index"\n on the given file, would it be shown or not?

\n", "group": "ignore" }, "git_index_open": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 203, "lineto": 203, "args": [ @@ -7749,12 +8167,12 @@ "comment": " 0 or an error code" }, "description": "

Create a new bare Git index object as a memory representation\n of the Git index file in 'index_path', without a repository\n to back it.

\n", - "comments": "

Since there is no ODB or working directory behind this index, any Index methods which rely on these (e.g. index_add_bypath) will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository, use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n", + "comments": "

Since there is no ODB or working directory behind this index,\n any Index methods which rely on these (e.g. index_add_bypath)\n will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository,\n use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n", "group": "index" }, "git_index_new": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 216, "lineto": 216, "args": [ @@ -7771,12 +8189,12 @@ "comment": " 0 or an error code" }, "description": "

Create an in-memory index object.

\n", - "comments": "

This index object cannot be read/written to the filesystem, but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n", + "comments": "

This index object cannot be read/written to the filesystem,\n but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n", "group": "index" }, "git_index_free": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 223, "lineto": 223, "args": [ @@ -7801,12 +8219,15 @@ ], "init.c": [ "ex/HEAD/init.html#git_index_free-4" + ], + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_index_free-3" ] } }, "git_index_owner": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 231, "lineto": 231, "args": [ @@ -7828,7 +8249,7 @@ }, "git_index_caps": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 239, "lineto": 239, "args": [ @@ -7850,7 +8271,7 @@ }, "git_index_set_caps": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 252, "lineto": 252, "args": [ @@ -7872,12 +8293,12 @@ "comment": " 0 on success, -1 on failure" }, "description": "

Set index capabilities flags.

\n", - "comments": "

If you pass GIT_INDEXCAP_FROM_OWNER for the caps, then the capabilities will be read from the config of the owner object, looking at core.ignorecase, core.filemode, core.symlinks.

\n", + "comments": "

If you pass GIT_INDEXCAP_FROM_OWNER for the caps, then the\n capabilities will be read from the config of the owner object,\n looking at core.ignorecase, core.filemode, core.symlinks.

\n", "group": "index" }, "git_index_version": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 264, "lineto": 264, "args": [ @@ -7894,12 +8315,12 @@ "comment": " the index version" }, "description": "

Get index on-disk version.

\n", - "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index with version 2 may be written instead, if the extension data in version 3 is not necessary.

\n", + "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index\n with version 2 may be written instead, if the extension data in\n version 3 is not necessary.

\n", "group": "index" }, "git_index_set_version": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 277, "lineto": 277, "args": [ @@ -7921,12 +8342,12 @@ "comment": " 0 on success, -1 on failure" }, "description": "

Set index on-disk version.

\n", - "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may write an index with version 3 instead, if necessary to accurately represent the index.

\n", + "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may\n write an index with version 3 instead, if necessary to accurately\n represent the index.

\n", "group": "index" }, "git_index_read": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 296, "lineto": 296, "args": [ @@ -7948,12 +8369,12 @@ "comment": " 0 or an error code" }, "description": "

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n", - "comments": "

If force is true, this performs a "hard" read that discards in-memory changes and always reloads the on-disk index data. If there is no on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index data from disk only if it has changed since the last time it was loaded. Purely in-memory index data will be untouched. Be aware: if there are changes on disk, unwritten in-memory changes are discarded.

\n", + "comments": "

If force is true, this performs a "hard" read that discards in-memory\n changes and always reloads the on-disk index data. If there is no\n on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index\n data from disk only if it has changed since the last time it was\n loaded. Purely in-memory index data will be untouched. Be aware: if\n there are changes on disk, unwritten in-memory changes are discarded.

\n", "group": "index" }, "git_index_write": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 305, "lineto": 305, "args": [ @@ -7975,7 +8396,7 @@ }, "git_index_path": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 313, "lineto": 313, "args": [ @@ -7997,7 +8418,7 @@ }, "git_index_checksum": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 325, "lineto": 325, "args": [ @@ -8014,12 +8435,12 @@ "comment": " a pointer to the checksum of the index" }, "description": "

Get the checksum of the index

\n", - "comments": "

This checksum is the SHA-1 hash over the index file (except the last 20 bytes which are the checksum itself). In cases where the index does not exist on-disk, it will be zeroed out.

\n", + "comments": "

This checksum is the SHA-1 hash over the index file (except the\n last 20 bytes which are the checksum itself). In cases where the\n index does not exist on-disk, it will be zeroed out.

\n", "group": "index" }, "git_index_read_tree": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 336, "lineto": 336, "args": [ @@ -8046,7 +8467,7 @@ }, "git_index_write_tree": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 357, "lineto": 357, "args": [ @@ -8068,20 +8489,20 @@ "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" }, "description": "

Write the index as a tree

\n", - "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", + "comments": "

This method will scan the index and write a representation\n of its current state back to disk; it recursively creates\n tree objects for each of the subtrees stored in the index,\n but only returns the OID of the root tree. This is the OID\n that can be used e.g. to create a commit.

\n\n

The index instance cannot be bare, and needs to be associated\n to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", "group": "index", "examples": { "init.c": [ "ex/HEAD/init.html#git_index_write_tree-5" ], "merge.c": [ - "ex/HEAD/merge.html#git_index_write_tree-14" + "ex/HEAD/merge.html#git_index_write_tree-12" ] } }, "git_index_write_tree_to": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 374, "lineto": 374, "args": [ @@ -8108,12 +8529,12 @@ "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" }, "description": "

Write the index as a tree to the given repository

\n", - "comments": "

This method will do the same as git_index_write_tree, but letting the user choose the repository where the tree will be written.

\n\n

The index must not contain any file in conflict.

\n", + "comments": "

This method will do the same as git_index_write_tree, but\n letting the user choose the repository where the tree will\n be written.

\n\n

The index must not contain any file in conflict.

\n", "group": "index" }, "git_index_entrycount": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 393, "lineto": 393, "args": [ @@ -8135,12 +8556,15 @@ "examples": { "general.c": [ "ex/HEAD/general.html#git_index_entrycount-36" + ], + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_index_entrycount-4" ] } }, "git_index_clear": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 404, "lineto": 404, "args": [ @@ -8157,12 +8581,12 @@ "comment": " 0 on success, error code \n<\n 0 on failure" }, "description": "

Clear the contents (all the entries) of an index object.

\n", - "comments": "

This clears the index object in memory; changes must be explicitly written to disk for them to take effect persistently.

\n", + "comments": "

This clears the index object in memory; changes must be explicitly\n written to disk for them to take effect persistently.

\n", "group": "index" }, "git_index_get_byindex": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 417, "lineto": 418, "args": [ @@ -8184,17 +8608,20 @@ "comment": " a pointer to the entry; NULL if out of bounds" }, "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n", "group": "index", "examples": { "general.c": [ "ex/HEAD/general.html#git_index_get_byindex-37" + ], + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_index_get_byindex-5" ] } }, "git_index_get_bypath": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 432, "lineto": 433, "args": [ @@ -8221,12 +8648,17 @@ "comment": " a pointer to the entry; NULL if it was not found" }, "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", - "group": "index" + "comments": "

The entry is not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n", + "group": "index", + "examples": { + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_index_get_bypath-6" + ] + } }, "git_index_remove": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 443, "lineto": 443, "args": [ @@ -8258,7 +8690,7 @@ }, "git_index_remove_directory": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 453, "lineto": 454, "args": [ @@ -8290,7 +8722,7 @@ }, "git_index_add": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 470, "lineto": 470, "args": [ @@ -8312,12 +8744,12 @@ "comment": " 0 or an error code" }, "description": "

Add or update an index entry from an in-memory struct

\n", - "comments": "

If a previous index entry exists that has the same path and stage as the given 'source_entry', it will be replaced. Otherwise, the 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given 'source_entry' will be inserted on the index.

\n", + "comments": "

If a previous index entry exists that has the same path and stage\n as the given 'source_entry', it will be replaced. Otherwise, the\n 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given\n 'source_entry' will be inserted on the index.

\n", "group": "index" }, "git_index_entry_stage": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 482, "lineto": 482, "args": [ @@ -8334,12 +8766,12 @@ "comment": " the stage number" }, "description": "

Return the stage number from a git index entry

\n", - "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT\n
\n", + "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags \n
\n\n

&\n GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT

\n", "group": "index" }, "git_index_entry_is_conflict": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 491, "lineto": 491, "args": [ @@ -8361,7 +8793,7 @@ }, "git_index_add_bypath": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 522, "lineto": 522, "args": [ @@ -8383,12 +8815,12 @@ "comment": " 0 or an error code" }, "description": "

Add or update an index entry from a file on disk

\n", - "comments": "

The file path must be relative to the repository's working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "comments": "

The file path must be relative to the repository's\n working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking\n at gitignore rules. Those rules can be evaluated through\n the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n", "group": "index" }, "git_index_add_frombuffer": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 551, "lineto": 554, "args": [ @@ -8420,12 +8852,12 @@ "comment": " 0 or an error code" }, "description": "

Add or update an index entry from a buffer in memory

\n", - "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added. The id and the file_size of the 'entry' are updated with the real value of the blob.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "comments": "

This method will create a blob in the repository that owns the\n index and then add the index entry to the index. The path of the\n entry represents the position of the blob relative to the\n repository's root folder.

\n\n

If a previous index entry exists that has the same path as the\n given 'entry', it will be replaced. Otherwise, the 'entry' will be\n added. The id and the file_size of the 'entry' are updated with the\n real value of the blob.

\n\n

This forces the file to be added to the index, not looking\n at gitignore rules. Those rules can be evaluated through\n the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n", "group": "index" }, "git_index_remove_bypath": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 570, "lineto": 570, "args": [ @@ -8447,12 +8879,12 @@ "comment": " 0 or an error code" }, "description": "

Remove an index entry corresponding to a file on disk

\n", - "comments": "

The file path must be relative to the repository's working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "comments": "

The file path must be relative to the repository's\n working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n", "group": "index" }, "git_index_add_all": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 618, "lineto": 623, "args": [ @@ -8489,12 +8921,12 @@ "comment": " 0 on success, negative callback return value, or error code" }, "description": "

Add or update index entries matching files in the working directory.

\n", - "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", + "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will\n be matched against files in the repository's working directory. Each\n file that matches will be added to the index (either updating an\n existing entry or adding a new entry). You can disable glob expansion\n and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\n flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath).\n If a file is already tracked in the index, then it will be updated\n even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip\n the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains\n the exact path of an ignored file (when not using FORCE), add the\n GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry\n in the pathspec that is an exact match to a filename on disk is\n either not ignored or already in the index. If this check fails, the\n function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback\n function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files\n will no longer be marked as conflicting. The data about the conflicts\n will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching\n item in the working directory immediately before it is added to /\n updated in the index. Returning zero will add the item to the index,\n greater than zero will skip the item, and less than zero will abort the\n scan and return that value to the caller.

\n", "group": "index" }, "git_index_remove_all": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 640, "lineto": 644, "args": [ @@ -8526,12 +8958,12 @@ "comment": " 0 on success, negative callback return value, or error code" }, "description": "

Remove all matching index entries.

\n", - "comments": "

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is removed. Return 0 to remove the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "comments": "

If you provide a callback function, it will be invoked on each matching\n item in the index immediately before it is removed. Return 0 to\n remove the item, > 0 to skip the item, and \n<\n 0 to abort the scan.

\n", "group": "index" }, "git_index_update_all": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 669, "lineto": 673, "args": [ @@ -8563,12 +8995,12 @@ "comment": " 0 on success, negative callback return value, or error code" }, "description": "

Update all index entries to match the working directory

\n", - "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the\n working directory, deleting them if the corresponding working directory\n file no longer exists otherwise updating the information (including\n adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching\n item in the index immediately before it is updated (either refreshed\n or removed depending on working directory state). Return 0 to proceed\n with updating the item, > 0 to skip the item, and \n<\n 0 to abort the scan.

\n", "group": "index" }, "git_index_find": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 684, "lineto": 684, "args": [ @@ -8600,7 +9032,7 @@ }, "git_index_find_prefix": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 695, "lineto": 695, "args": [ @@ -8632,7 +9064,7 @@ }, "git_index_conflict_add": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 720, "lineto": 724, "args": [ @@ -8664,12 +9096,12 @@ "comment": " 0 or an error code" }, "description": "

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n", - "comments": "

The entries are the entries from the tree included in the merge. Any entry may be null to indicate that that file was not present in the trees during the merge. For example, ancestor_entry may be NULL to indicate that a file was added in both branches and must be resolved.

\n", + "comments": "

The entries are the entries from the tree included in the merge. Any\n entry may be null to indicate that that file was not present in the\n trees during the merge. For example, ancestor_entry may be NULL to\n indicate that a file was added in both branches and must be resolved.

\n", "group": "index" }, "git_index_conflict_get": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 740, "lineto": 745, "args": [ @@ -8706,12 +9138,12 @@ "comment": " 0 or an error code" }, "description": "

Get the index entries that represent a conflict of a single file.

\n", - "comments": "

The entries are not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "comments": "

The entries are not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n", "group": "index" }, "git_index_conflict_remove": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 754, "lineto": 754, "args": [ @@ -8738,7 +9170,7 @@ }, "git_index_conflict_cleanup": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 762, "lineto": 762, "args": [ @@ -8760,7 +9192,7 @@ }, "git_index_has_conflicts": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 769, "lineto": 769, "args": [ @@ -8781,13 +9213,13 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_has_conflicts-15" + "ex/HEAD/merge.html#git_index_has_conflicts-13" ] } }, "git_index_conflict_iterator_new": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 780, "lineto": 782, "args": [ @@ -8813,13 +9245,13 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_new-16" + "ex/HEAD/merge.html#git_index_conflict_iterator_new-14" ] } }, "git_index_conflict_next": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 794, "lineto": 798, "args": [ @@ -8855,13 +9287,13 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_next-17" + "ex/HEAD/merge.html#git_index_conflict_next-15" ] } }, "git_index_conflict_iterator_free": { "type": "function", - "file": "index.h", + "file": "git2/index.h", "line": 805, "lineto": 806, "args": [ @@ -8882,15 +9314,42 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_free-18" + "ex/HEAD/merge.html#git_index_conflict_iterator_free-16" ] } }, + "git_indexer_init_options": { + "type": "function", + "file": "git2/indexer.h", + "line": 41, + "lineto": 43, + "args": [ + { + "name": "opts", + "type": "git_indexer_options *", + "comment": "the `git_indexer_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION`" + } + ], + "argline": "git_indexer_options *opts, unsigned int version", + "sig": "git_indexer_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_indexer_options with default values. Equivalent to\n creating an instance with GIT_INDEXER_OPTIONS_INIT.

\n", + "comments": "", + "group": "indexer" + }, "git_indexer_new": { "type": "function", - "file": "indexer.h", - "line": 30, - "lineto": 36, + "file": "git2/indexer.h", + "line": 57, + "lineto": 62, "args": [ { "name": "out", @@ -8913,36 +9372,26 @@ "comment": "object database from which to read base objects when\n fixing thin packs. Pass NULL if no thin pack is expected (an error\n will be returned if there are bases missing)" }, { - "name": "progress_cb", - "type": "git_transfer_progress_cb", - "comment": "function to call with progress information" - }, - { - "name": "progress_cb_payload", - "type": "void *", - "comment": "payload for the progress callback" + "name": "opts", + "type": "git_indexer_options *", + "comment": "Optional structure containing additional options. See\n `git_indexer_options` above." } ], - "argline": "git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_transfer_progress_cb progress_cb, void *progress_cb_payload", - "sig": "git_indexer **::const char *::unsigned int::git_odb *::git_transfer_progress_cb::void *", + "argline": "git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_indexer_options *opts", + "sig": "git_indexer **::const char *::unsigned int::git_odb *::git_indexer_options *", "return": { "type": "int", "comment": null }, "description": "

Create a new indexer instance

\n", "comments": "", - "group": "indexer", - "examples": { - "network/index-pack.c": [ - "ex/HEAD/network/index-pack.html#git_indexer_new-1" - ] - } + "group": "indexer" }, "git_indexer_append": { "type": "function", - "file": "indexer.h", - "line": 46, - "lineto": 46, + "file": "git2/indexer.h", + "line": 72, + "lineto": 72, "args": [ { "name": "idx", @@ -8973,18 +9422,13 @@ }, "description": "

Add data to the indexer

\n", "comments": "", - "group": "indexer", - "examples": { - "network/index-pack.c": [ - "ex/HEAD/network/index-pack.html#git_indexer_append-2" - ] - } + "group": "indexer" }, "git_indexer_commit": { "type": "function", - "file": "indexer.h", - "line": 55, - "lineto": 55, + "file": "git2/indexer.h", + "line": 81, + "lineto": 81, "args": [ { "name": "idx", @@ -9005,18 +9449,13 @@ }, "description": "

Finalize the pack and index

\n", "comments": "

Resolve any pending deltas and write out the index file

\n", - "group": "indexer", - "examples": { - "network/index-pack.c": [ - "ex/HEAD/network/index-pack.html#git_indexer_commit-3" - ] - } + "group": "indexer" }, "git_indexer_hash": { "type": "function", - "file": "indexer.h", - "line": 65, - "lineto": 65, + "file": "git2/indexer.h", + "line": 91, + "lineto": 91, "args": [ { "name": "idx", @@ -9031,19 +9470,14 @@ "comment": null }, "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the index has been finalized.

\n", - "group": "indexer", - "examples": { - "network/index-pack.c": [ - "ex/HEAD/network/index-pack.html#git_indexer_hash-4" - ] - } + "comments": "

A packfile's name is derived from the sorted hashing of all object\n names. This is only correct after the index has been finalized.

\n", + "group": "indexer" }, "git_indexer_free": { "type": "function", - "file": "indexer.h", - "line": 72, - "lineto": 72, + "file": "git2/indexer.h", + "line": 98, + "lineto": 98, "args": [ { "name": "idx", @@ -9059,16 +9493,257 @@ }, "description": "

Free the indexer and its resources

\n", "comments": "", - "group": "indexer", - "examples": { - "network/index-pack.c": [ - "ex/HEAD/network/index-pack.html#git_indexer_free-5" - ] - } + "group": "indexer" + }, + "imaxdiv": { + "type": "function", + "file": "git2/inttypes.h", + "line": 284, + "lineto": 298, + "args": [ + { + "name": "numer", + "type": "intmax_t", + "comment": null + }, + { + "name": "denom", + "type": "intmax_t", + "comment": null + } + ], + "argline": "intmax_t numer, intmax_t denom", + "sig": "intmax_t::intmax_t", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "", + "group": "imaxdiv" + }, + "git_mailmap_new": { + "type": "function", + "file": "git2/mailmap.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + } + ], + "argline": "git_mailmap **out", + "sig": "git_mailmap **", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Allocate a new mailmap object.

\n", + "comments": "

This object is empty, so you'll have to add a mailmap file before you can do\n anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", + "group": "mailmap" + }, + "git_mailmap_free": { + "type": "function", + "file": "git2/mailmap.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "the mailmap to free" + } + ], + "argline": "git_mailmap *mm", + "sig": "git_mailmap *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the mailmap and its associated memory.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_add_entry": { + "type": "function", + "file": "git2/mailmap.h", + "line": 52, + "lineto": 54, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "mailmap to add the entry to" + }, + { + "name": "real_name", + "type": "const char *", + "comment": "the real name to use, or NULL" + }, + { + "name": "real_email", + "type": "const char *", + "comment": "the real email to use, or NULL" + }, + { + "name": "replace_name", + "type": "const char *", + "comment": "the name to replace, or NULL" + }, + { + "name": "replace_email", + "type": "const char *", + "comment": "the email to replace" + } + ], + "argline": "git_mailmap *mm, const char *real_name, const char *real_email, const char *replace_name, const char *replace_email", + "sig": "git_mailmap *::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Add a single entry to the given mailmap object. If the entry already exists,\n it will be replaced with the new entry.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_buffer": { + "type": "function", + "file": "git2/mailmap.h", + "line": 64, + "lineto": 65, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "buf", + "type": "const char *", + "comment": "buffer to parse the mailmap from" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the input buffer" + } + ], + "argline": "git_mailmap **out, const char *buf, size_t len", + "sig": "git_mailmap **::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Create a new mailmap instance containing a single mailmap file

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_repository": { + "type": "function", + "file": "git2/mailmap.h", + "line": 81, + "lineto": 82, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to load mailmap information from" + } + ], + "argline": "git_mailmap **out, git_repository *repo", + "sig": "git_mailmap **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Create a new mailmap instance from a repository, loading mailmap files based\n on the repository's configuration.

\n", + "comments": "

Mailmaps are loaded in the following order:\n 1. '.mailmap' in the root of the repository's working directory, if present.\n 2. The blob object identified by the 'mailmap.blob' config entry, if set.\n [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories]\n 3. The path in the 'mailmap.file' config entry, if set.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve": { + "type": "function", + "file": "git2/mailmap.h", + "line": 96, + "lineto": 98, + "args": [ + { + "name": "real_name", + "type": "const char **", + "comment": "pointer to store the real name" + }, + { + "name": "real_email", + "type": "const char **", + "comment": "pointer to store the real email" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "the mailmap to perform a lookup with (may be NULL)" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name to look up" + }, + { + "name": "email", + "type": "const char *", + "comment": "the email to look up" + } + ], + "argline": "const char **real_name, const char **real_email, const git_mailmap *mm, const char *name, const char *email", + "sig": "const char **::const char **::const git_mailmap *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Resolve a name and email to the corresponding real name and email.

\n", + "comments": "

The lifetime of the strings are tied to mm, name, and email parameters.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve_signature": { + "type": "function", + "file": "git2/mailmap.h", + "line": 110, + "lineto": 111, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "mailmap to resolve with" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to resolve" + } + ], + "argline": "git_signature **out, const git_mailmap *mm, const git_signature *sig", + "sig": "git_signature **::const git_mailmap *::const git_signature *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Resolve a signature to use real names and emails with a mailmap.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "mailmap" }, "git_merge_file_init_input": { "type": "function", - "file": "merge.h", + "file": "git2/merge.h", "line": 60, "lineto": 62, "args": [ @@ -9095,19 +9770,19 @@ }, "git_merge_file_init_options": { "type": "function", - "file": "merge.h", - "line": 214, - "lineto": 216, + "file": "git2/merge.h", + "line": 215, + "lineto": 217, "args": [ { "name": "opts", "type": "git_merge_file_options *", - "comment": "the `git_merge_file_options` instance to initialize." + "comment": "The `git_merge_file_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_MERGE_FILE_OPTIONS_VERSION` here." + "comment": "The struct version; pass `GIT_MERGE_FILE_OPTIONS_VERSION`." } ], "argline": "git_merge_file_options *opts, unsigned int version", @@ -9116,25 +9791,25 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_merge_file_options with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_merge_file_options structure

\n", + "comments": "

Initializes a git_merge_file_options with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", "group": "merge" }, "git_merge_init_options": { "type": "function", - "file": "merge.h", - "line": 311, - "lineto": 313, + "file": "git2/merge.h", + "line": 313, + "lineto": 315, "args": [ { "name": "opts", "type": "git_merge_options *", - "comment": "the `git_merge_options` instance to initialize." + "comment": "The `git_merge_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_MERGE_OPTIONS_VERSION` here." + "comment": "The struct version; pass `GIT_MERGE_OPTIONS_VERSION`." } ], "argline": "git_merge_options *opts, unsigned int version", @@ -9143,15 +9818,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_merge_options with default values. Equivalent to\n creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_merge_options structure

\n", + "comments": "

Initializes a git_merge_options with default values. Equivalent to\n creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", "group": "merge" }, "git_merge_analysis": { "type": "function", - "file": "merge.h", - "line": 382, - "lineto": 387, + "file": "git2/merge.h", + "line": 384, + "lineto": 389, "args": [ { "name": "analysis_out", @@ -9190,15 +9865,15 @@ "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge_analysis-19" + "ex/HEAD/merge.html#git_merge_analysis-17" ] } }, "git_merge_base": { "type": "function", - "file": "merge.h", - "line": 398, - "lineto": 402, + "file": "git2/merge.h", + "line": 400, + "lineto": 404, "args": [ { "name": "out", @@ -9241,9 +9916,9 @@ }, "git_merge_bases": { "type": "function", - "file": "merge.h", - "line": 413, - "lineto": 417, + "file": "git2/merge.h", + "line": 415, + "lineto": 419, "args": [ { "name": "out", @@ -9278,9 +9953,9 @@ }, "git_merge_base_many": { "type": "function", - "file": "merge.h", - "line": 428, - "lineto": 432, + "file": "git2/merge.h", + "line": 430, + "lineto": 434, "args": [ { "name": "out", @@ -9315,9 +9990,9 @@ }, "git_merge_bases_many": { "type": "function", - "file": "merge.h", - "line": 443, - "lineto": 447, + "file": "git2/merge.h", + "line": 445, + "lineto": 449, "args": [ { "name": "out", @@ -9352,9 +10027,9 @@ }, "git_merge_base_octopus": { "type": "function", - "file": "merge.h", - "line": 458, - "lineto": 462, + "file": "git2/merge.h", + "line": 460, + "lineto": 464, "args": [ { "name": "out", @@ -9389,9 +10064,9 @@ }, "git_merge_file": { "type": "function", - "file": "merge.h", - "line": 480, - "lineto": 485, + "file": "git2/merge.h", + "line": 482, + "lineto": 487, "args": [ { "name": "out", @@ -9426,14 +10101,14 @@ "comment": " 0 on success or error code" }, "description": "

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n", - "comments": "

Note that this function does not reference a repository and any configuration must be passed as git_merge_file_options.

\n", + "comments": "

Note that this function does not reference a repository and any\n configuration must be passed as git_merge_file_options.

\n", "group": "merge" }, "git_merge_file_from_index": { "type": "function", - "file": "merge.h", - "line": 501, - "lineto": 507, + "file": "git2/merge.h", + "line": 503, + "lineto": 509, "args": [ { "name": "out", @@ -9478,9 +10153,9 @@ }, "git_merge_file_result_free": { "type": "function", - "file": "merge.h", - "line": 514, - "lineto": 514, + "file": "git2/merge.h", + "line": 516, + "lineto": 516, "args": [ { "name": "result", @@ -9500,9 +10175,9 @@ }, "git_merge_trees": { "type": "function", - "file": "merge.h", - "line": 532, - "lineto": 538, + "file": "git2/merge.h", + "line": 534, + "lineto": 540, "args": [ { "name": "out", @@ -9547,9 +10222,9 @@ }, "git_merge_commits": { "type": "function", - "file": "merge.h", - "line": 555, - "lineto": 560, + "file": "git2/merge.h", + "line": 557, + "lineto": 562, "args": [ { "name": "out", @@ -9589,9 +10264,9 @@ }, "git_merge": { "type": "function", - "file": "merge.h", - "line": 580, - "lineto": 585, + "file": "git2/merge.h", + "line": 582, + "lineto": 587, "args": [ { "name": "repo", @@ -9626,17 +10301,17 @@ "comment": " 0 on success or error code" }, "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", - "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the uses wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", + "comments": "

For compatibility with git, the repository is put into a merging\n state. Once the commit is done (or if the uses wishes to abort),\n you should clear this state by calling\n git_repository_state_cleanup().

\n", "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge-20" + "ex/HEAD/merge.html#git_merge-18" ] } }, "git_message_prettify": { "type": "function", - "file": "message.h", + "file": "git2/message.h", "line": 38, "lineto": 38, "args": [ @@ -9673,7 +10348,7 @@ }, "git_message_trailers": { "type": "function", - "file": "message.h", + "file": "git2/message.h", "line": 73, "lineto": 73, "args": [ @@ -9695,12 +10370,12 @@ "comment": " 0 on success, or non-zero on error." }, "description": "

Parse trailers out of a message, filling the array pointed to by +arr+.

\n", - "comments": "

Trailers are key/value pairs in the last paragraph of a message, not including any patches or conflicts that may be present.

\n", + "comments": "

Trailers are key/value pairs in the last paragraph of a message, not\n including any patches or conflicts that may be present.

\n", "group": "message" }, "git_message_trailer_array_free": { "type": "function", - "file": "message.h", + "file": "git2/message.h", "line": 79, "lineto": 79, "args": [ @@ -9722,7 +10397,7 @@ }, "git_note_iterator_new": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 49, "lineto": 52, "args": [ @@ -9754,7 +10429,7 @@ }, "git_note_commit_iterator_new": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 64, "lineto": 66, "args": [ @@ -9781,7 +10456,7 @@ }, "git_note_iterator_free": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 73, "lineto": 73, "args": [ @@ -9803,7 +10478,7 @@ }, "git_note_next": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 86, "lineto": 89, "args": [ @@ -9835,7 +10510,7 @@ }, "git_note_read": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 105, "lineto": 109, "args": [ @@ -9872,7 +10547,7 @@ }, "git_note_commit_read": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 124, "lineto": 128, "args": [ @@ -9909,7 +10584,7 @@ }, "git_note_author": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 136, "lineto": 136, "args": [ @@ -9931,7 +10606,7 @@ }, "git_note_committer": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 144, "lineto": 144, "args": [ @@ -9953,7 +10628,7 @@ }, "git_note_message": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 153, "lineto": 153, "args": [ @@ -9975,7 +10650,7 @@ }, "git_note_id": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 162, "lineto": 162, "args": [ @@ -9997,7 +10672,7 @@ }, "git_note_create": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 179, "lineto": 187, "args": [ @@ -10054,7 +10729,7 @@ }, "git_note_commit_create": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 209, "lineto": 218, "args": [ @@ -10111,12 +10786,12 @@ "comment": " 0 or an error code" }, "description": "

Add a note for an object from a commit

\n", - "comments": "

This function will create a notes commit for a given object, the commit is a dangling commit, no reference is created.

\n", + "comments": "

This function will create a notes commit for a given object,\n the commit is a dangling commit, no reference is created.

\n", "group": "note" }, "git_note_remove": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 232, "lineto": 237, "args": [ @@ -10158,7 +10833,7 @@ }, "git_note_commit_remove": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 257, "lineto": 263, "args": [ @@ -10205,7 +10880,7 @@ }, "git_note_free": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 270, "lineto": 270, "args": [ @@ -10225,9 +10900,36 @@ "comments": "", "group": "note" }, + "git_note_default_ref": { + "type": "function", + "file": "git2/notes.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer in which to store the name of the default notes reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The Git repository" + } + ], + "argline": "git_buf *out, git_repository *repo", + "sig": "git_buf *::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the default notes reference for a repository

\n", + "comments": "", + "group": "note" + }, "git_note_foreach": { "type": "function", - "file": "notes.h", + "file": "git2/notes.h", "line": 298, "lineto": 302, "args": [ @@ -10264,7 +10966,7 @@ }, "git_object_lookup": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 42, "lineto": 46, "args": [ @@ -10296,20 +10998,20 @@ "comment": " 0 or an error code" }, "description": "

Lookup a reference to one of the objects in a repository.

\n", - "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

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.

\n", + "comments": "

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJ_ANY' may be passed to let\n the method guess the object's type.

\n", "group": "object", "examples": { "log.c": [ "ex/HEAD/log.html#git_object_lookup-34" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_lookup-21" + "ex/HEAD/merge.html#git_object_lookup-19" ] } }, "git_object_lookup_prefix": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 75, "lineto": 80, "args": [ @@ -10346,12 +11048,12 @@ "comment": " 0 or an error code" }, "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

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.

\n", + "comments": "

The object obtained will be so that its identifier\n matches the first 'len' hexadecimal characters\n (packets of 4 bits) of the given 'id'.\n 'len' must be at least GIT_OID_MINPREFIXLEN, and\n long enough to identify a unique object matching\n the prefix; otherwise the method will fail.

\n\n

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJ_ANY' may be passed to let\n the method guess the object's type.

\n", "group": "object" }, "git_object_lookup_bypath": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 93, "lineto": 97, "args": [ @@ -10388,7 +11090,7 @@ }, "git_object_id": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 105, "lineto": 105, "args": [ @@ -10435,7 +11137,7 @@ }, "git_object_short_id": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 119, "lineto": 119, "args": [ @@ -10457,7 +11159,7 @@ "comment": " 0 on success, \n<\n0 for error" }, "description": "

Get a short abbreviated OID string for the object

\n", - "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", + "comments": "

This starts at the "core.abbrev" length (default 7 characters) and\n iteratively extends to a longer string if that length is ambiguous.\n The result will be unambiguous (at least until new objects are added to\n the repository).

\n", "group": "object", "examples": { "tag.c": [ @@ -10467,7 +11169,7 @@ }, "git_object_type": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 127, "lineto": 127, "args": [ @@ -10499,7 +11201,7 @@ }, "git_object_owner": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 141, "lineto": 141, "args": [ @@ -10516,12 +11218,12 @@ "comment": " the repository who owns this object" }, "description": "

Get the repository that owns this object

\n", - "comments": "

Freeing or calling git_repository_close on the returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without affecting the object.

\n", + "comments": "

Freeing or calling git_repository_close on the\n returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without\n affecting the object.

\n", "group": "object" }, "git_object_free": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 158, "lineto": 158, "args": [ @@ -10538,7 +11240,7 @@ "comment": null }, "description": "

Close an open object

\n", - "comments": "

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 aggressive is the caching mechanism used by the repository.

\n\n

IMPORTANT: It is necessary to call this method when you stop using an object. Failure to do so will cause a memory leak.

\n", + "comments": "

This method instructs the library to close an existing\n object; note that git_objects are owned and cached by the repository\n so the object may or may not be freed after this library call,\n depending on how aggressive is the caching mechanism used\n by the repository.

\n\n

IMPORTANT:\n It is necessary to call this method when you stop using\n an object. Failure to do so will cause a memory leak.

\n", "group": "object", "examples": { "blame.c": [ @@ -10557,7 +11259,7 @@ "ex/HEAD/log.html#git_object_free-39" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_free-22" + "ex/HEAD/merge.html#git_object_free-20" ], "rev-parse.c": [ "ex/HEAD/rev-parse.html#git_object_free-9", @@ -10574,7 +11276,7 @@ }, "git_object_type2string": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 169, "lineto": 169, "args": [ @@ -10591,7 +11293,7 @@ "comment": " the corresponding string representation." }, "description": "

Convert an object type to its string representation.

\n", - "comments": "

The result is a pointer to a string in static memory and should not be free()'ed.

\n", + "comments": "

The result is a pointer to a string in static memory and\n should not be free()'ed.

\n", "group": "object", "examples": { "cat-file.c": [ @@ -10608,7 +11310,7 @@ }, "git_object_string2type": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 177, "lineto": 177, "args": [ @@ -10630,7 +11332,7 @@ }, "git_object_typeisloose": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 186, "lineto": 186, "args": [ @@ -10652,7 +11354,7 @@ }, "git_object__size": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 200, "lineto": 200, "args": [ @@ -10669,12 +11371,12 @@ "comment": " size in bytes of the object" }, "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", - "comments": "

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.

\n", + "comments": "

For all the core types, this would the equivalent\n of calling sizeof(git_commit) if the core types\n were not opaque on the external API.

\n", "group": "object" }, "git_object_peel": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 225, "lineto": 228, "args": [ @@ -10701,12 +11403,12 @@ "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" }, "description": "

Recursively peel an object until an object of the specified type is met.

\n", - "comments": "

If the query cannot be satisfied due to the object model, GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a tree).

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object will be peeled until the type changes. A tag will be peeled until the referenced object is no longer a tag, and a commit will be peeled to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to the target type due to the object model, GIT_EPEEL will be returned.

\n\n

You must free the returned object.

\n", + "comments": "

If the query cannot be satisfied due to the object model,\n GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a\n tree).

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object will\n be peeled until the type changes. A tag will be peeled until the\n referenced object is no longer a tag, and a commit will be peeled\n to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to\n the target type due to the object model, GIT_EPEEL will be\n returned.

\n\n

You must free the returned object.

\n", "group": "object" }, "git_object_dup": { "type": "function", - "file": "object.h", + "file": "git2/object.h", "line": 237, "lineto": 237, "args": [ @@ -10733,7 +11435,7 @@ }, "git_odb_new": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 39, "lineto": 39, "args": [ @@ -10750,12 +11452,12 @@ "comment": " 0 or an error code" }, "description": "

Create a new object database with no backends.

\n", - "comments": "

Before the ODB can be used for read/writing, a custom database backend must be manually added using git_odb_add_backend()

\n", + "comments": "

Before the ODB can be used for read/writing, a custom database\n backend must be manually added using git_odb_add_backend()

\n", "group": "odb" }, "git_odb_open": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 57, "lineto": 57, "args": [ @@ -10777,12 +11479,12 @@ "comment": " 0 or an error code" }, "description": "

Create a new object database and automatically add\n the two default backends:

\n", - "comments": "
- git_odb_backend_loose: read and write loose object files      from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,        assuming `objects_dir` as the Objects folder which      contains a 'pack/' folder with the corresponding data\n
\n", + "comments": "
- git_odb_backend_loose: read and write loose object files\n    from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,\n    assuming `objects_dir` as the Objects folder which\n    contains a 'pack/' folder with the corresponding data\n
\n", "group": "odb" }, "git_odb_add_disk_alternate": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 74, "lineto": 74, "args": [ @@ -10804,12 +11506,12 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Add an on-disk alternate to an existing Object DB.

\n", - "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", + "comments": "

Note that the added path must point to an objects, not\n to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after\n all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", "group": "odb" }, "git_odb_free": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 81, "lineto": 81, "args": [ @@ -10839,7 +11541,7 @@ }, "git_odb_read": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 100, "lineto": 100, "args": [ @@ -10866,7 +11568,7 @@ "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database." }, "description": "

Read an object from the database.

\n", - "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "comments": "

This method queries all available ODB backends\n trying to read the given OID.

\n\n

The returned object is reference counted and\n internally cached, so it should be closed\n by the user once it's no longer in use.

\n", "group": "odb", "examples": { "cat-file.c": [ @@ -10879,7 +11581,7 @@ }, "git_odb_read_prefix": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 129, "lineto": 129, "args": [ @@ -10911,12 +11613,12 @@ "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database.\n - GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix)" }, "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", - "comments": "

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.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "comments": "

This method queries all available ODB backends\n trying to match the 'len' first hexadecimal\n characters of the 'short_id'.\n The remaining (GIT_OID_HEXSZ-len)*4 bits of\n 'short_id' must be 0s.\n 'len' must be at least GIT_OID_MINPREFIXLEN,\n and the prefix must be long enough to identify\n a unique object in all the backends; the\n method will fail otherwise.

\n\n

The returned object is reference counted and\n internally cached, so it should be closed\n by the user once it's no longer in use.

\n", "group": "odb" }, "git_odb_read_header": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 149, "lineto": 149, "args": [ @@ -10948,12 +11650,12 @@ "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database." }, "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", - "comments": "

The header includes the length and the type of an object.

\n\n

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.

\n", + "comments": "

The header includes the length and the type of an object.

\n\n

Note that most backends do not support reading only the header\n of an object, so the whole object will be read and then the\n header will be returned.

\n", "group": "odb" }, "git_odb_exists": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 160, "lineto": 160, "args": [ @@ -10980,7 +11682,7 @@ }, "git_odb_exists_prefix": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 173, "lineto": 174, "args": [ @@ -11017,7 +11719,7 @@ }, "git_odb_expand_ids": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 215, "lineto": 218, "args": [ @@ -11044,12 +11746,12 @@ "comment": " 0 on success or an error code on failure" }, "description": "

Determine if one or more objects can be found in the object database\n by their abbreviated object ID and type. The given array will be\n updated in place: for each abbreviated ID that is unique in the\n database, and of the given type (if specified), the full object ID,\n object ID length (GIT_OID_HEXSZ) and type will be written back to\n the array. For IDs that are not found (or are ambiguous), the\n array entry will be zeroed.

\n", - "comments": "

Note that since this function operates on multiple objects, the underlying database will not be asked to be reloaded if an object is not found (which is unlike other object database operations.)

\n", + "comments": "

Note that since this function operates on multiple objects, the\n underlying database will not be asked to be reloaded if an object is\n not found (which is unlike other object database operations.)

\n", "group": "odb" }, "git_odb_refresh": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 238, "lineto": 238, "args": [ @@ -11066,12 +11768,12 @@ "comment": " 0 on success, error code otherwise" }, "description": "

Refresh the object database to load newly added files.

\n", - "comments": "

If the object databases have changed on disk while the library is running, this function will force a reload of the underlying indexes.

\n\n

Use this function when you're confident that an external application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The library will automatically attempt to refresh the ODB when a lookup fails, to see if the looked up object exists on disk but hasn't been loaded yet.

\n", + "comments": "

If the object databases have changed on disk while the library\n is running, this function will force a reload of the underlying\n indexes.

\n\n

Use this function when you're confident that an external\n application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The\n library will automatically attempt to refresh the ODB\n when a lookup fails, to see if the looked up object exists\n on disk but hasn't been loaded yet.

\n", "group": "odb" }, "git_odb_foreach": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 253, "lineto": 253, "args": [ @@ -11098,12 +11800,12 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

List all objects available in the database

\n", - "comments": "

The callback will be called for each object available in the database. Note that the objects are likely to be returned in the index order, which would make accessing the objects in that order inefficient. Return a non-zero value from the callback to stop looping.

\n", + "comments": "

The callback will be called for each object available in the\n database. Note that the objects are likely to be returned in the index\n order, which would make accessing the objects in that order inefficient.\n Return a non-zero value from the callback to stop looping.

\n", "group": "odb" }, "git_odb_write": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 273, "lineto": 273, "args": [ @@ -11140,7 +11842,7 @@ "comment": " 0 or an error code" }, "description": "

Write an object directly into the ODB

\n", - "comments": "

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.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", + "comments": "

This method writes a full object straight into the ODB.\n For most cases, it is preferred to write objects through a write\n stream, which is both faster and less memory intensive, specially\n for big objects.

\n\n

This method is provided for compatibility with custom backends\n which are not able to support streaming writes

\n", "group": "odb", "examples": { "general.c": [ @@ -11150,7 +11852,7 @@ }, "git_odb_open_wstream": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 296, "lineto": 296, "args": [ @@ -11182,12 +11884,12 @@ "comment": " 0 if the stream was created; error code otherwise" }, "description": "

Open a stream to write an object into the ODB

\n", - "comments": "

The type and final length of the object must be specified when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it won't be effective until git_odb_stream_finalize_write is called and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or will leak memory.

\n", + "comments": "

The type and final length of the object must be specified\n when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it\n won't be effective until git_odb_stream_finalize_write is called\n and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or\n will leak memory.

\n", "group": "odb" }, "git_odb_stream_write": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 309, "lineto": 309, "args": [ @@ -11214,12 +11916,12 @@ "comment": " 0 if the write succeeded; error code otherwise" }, "description": "

Write to an odb stream

\n", - "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", + "comments": "

This method will fail if the total number of received bytes exceeds the\n size declared with git_odb_open_wstream()

\n", "group": "odb" }, "git_odb_stream_finalize_write": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 324, "lineto": 324, "args": [ @@ -11241,12 +11943,12 @@ "comment": " 0 on success; an error code otherwise" }, "description": "

Finish writing to an odb stream

\n", - "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", + "comments": "

The object will take its final name and will be available to the\n odb.

\n\n

This method will fail if the total number of received bytes\n differs from the size declared with git_odb_open_wstream()

\n", "group": "odb" }, "git_odb_stream_read": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 331, "lineto": 331, "args": [ @@ -11278,7 +11980,7 @@ }, "git_odb_stream_free": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 338, "lineto": 338, "args": [ @@ -11300,7 +12002,7 @@ }, "git_odb_open_rstream": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 366, "lineto": 371, "args": [ @@ -11337,12 +12039,12 @@ "comment": " 0 if the stream was created; error code otherwise" }, "description": "

Open a stream to read an object from the ODB

\n", - "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", + "comments": "

Note that most backends do not support streaming reads\n because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is\n assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and\n will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream\n    - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", "group": "odb" }, "git_odb_write_pack": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 391, "lineto": 395, "args": [ @@ -11374,12 +12076,12 @@ "comment": null }, "description": "

Open a stream for writing a pack file to the ODB.

\n", - "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", + "comments": "

If the ODB layer understands pack files, then the given\n packfile will likely be streamed directly to disk (and a\n corresponding index created). If the ODB layer does not\n understand pack files, the objects will be stored in whatever\n format the ODB layer uses.

\n", "group": "odb" }, "git_odb_hash": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 409, "lineto": 409, "args": [ @@ -11411,12 +12113,12 @@ "comment": " 0 or an error code" }, "description": "

Determine the object-ID (sha1 hash) of a data buffer

\n", - "comments": "

The resulting SHA-1 OID will be the identifier for the data buffer as if the data buffer it were to written to the ODB.

\n", + "comments": "

The resulting SHA-1 OID will be the identifier for the data\n buffer as if the data buffer it were to written to the ODB.

\n", "group": "odb" }, "git_odb_hashfile": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 424, "lineto": 424, "args": [ @@ -11448,7 +12150,7 @@ }, "git_odb_object_dup": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 438, "lineto": 438, "args": [ @@ -11470,12 +12172,12 @@ "comment": " 0 or an error code" }, "description": "

Create a copy of an odb_object

\n", - "comments": "

The returned copy must be manually freed with git_odb_object_free. Note that because of an implementation detail, the returned copy will be the same pointer as source: the object is internally refcounted, so the copy still needs to be freed twice.

\n", + "comments": "

The returned copy must be manually freed with git_odb_object_free.\n Note that because of an implementation detail, the returned copy will be\n the same pointer as source: the object is internally refcounted, so the\n copy still needs to be freed twice.

\n", "group": "odb" }, "git_odb_object_free": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 448, "lineto": 448, "args": [ @@ -11492,7 +12194,7 @@ "comment": null }, "description": "

Close an ODB object

\n", - "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", + "comments": "

This method must always be called once a git_odb_object is no\n longer needed, otherwise memory will leak.

\n", "group": "odb", "examples": { "cat-file.c": [ @@ -11505,7 +12207,7 @@ }, "git_odb_object_id": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 458, "lineto": 458, "args": [ @@ -11527,7 +12229,7 @@ }, "git_odb_object_data": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 471, "lineto": 471, "args": [ @@ -11544,7 +12246,7 @@ "comment": " a pointer to the data" }, "description": "

Return the data of an ODB object

\n", - "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", + "comments": "

This is the uncompressed, raw data as read from the ODB,\n without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", "group": "odb", "examples": { "general.c": [ @@ -11554,7 +12256,7 @@ }, "git_odb_object_size": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 482, "lineto": 482, "args": [ @@ -11571,7 +12273,7 @@ "comment": " the size" }, "description": "

Return the size of an ODB object

\n", - "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", + "comments": "

This is the real size of the data buffer, not the\n actual size of the object.

\n", "group": "odb", "examples": { "cat-file.c": [ @@ -11584,7 +12286,7 @@ }, "git_odb_object_type": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 490, "lineto": 490, "args": [ @@ -11611,7 +12313,7 @@ }, "git_odb_add_backend": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 505, "lineto": 505, "args": [ @@ -11638,12 +12340,12 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Add a custom backend to an existing Object DB

\n", - "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", + "comments": "

The backends are checked in relative ordering, based on the\n value of the priority parameter.

\n\n

Read \n for more information.

\n", "group": "odb" }, "git_odb_add_alternate": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 526, "lineto": 526, "args": [ @@ -11670,12 +12372,12 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", - "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", + "comments": "

Alternate backends are always checked for objects after\n all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the\n value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read \n for more information.

\n", "group": "odb" }, "git_odb_num_backends": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 534, "lineto": 534, "args": [ @@ -11697,7 +12399,7 @@ }, "git_odb_get_backend": { "type": "function", - "file": "odb.h", + "file": "git2/odb.h", "line": 544, "lineto": 544, "args": [ @@ -11729,7 +12431,7 @@ }, "git_odb_backend_pack": { "type": "function", - "file": "odb_backend.h", + "file": "git2/odb_backend.h", "line": 34, "lineto": 34, "args": [ @@ -11756,7 +12458,7 @@ }, "git_odb_backend_loose": { "type": "function", - "file": "odb_backend.h", + "file": "git2/odb_backend.h", "line": 48, "lineto": 54, "args": [ @@ -11803,7 +12505,7 @@ }, "git_odb_backend_one_pack": { "type": "function", - "file": "odb_backend.h", + "file": "git2/odb_backend.h", "line": 67, "lineto": 67, "args": [ @@ -11825,12 +12527,12 @@ "comment": " 0 or an error code" }, "description": "

Create a backend out of a single packfile

\n", - "comments": "

This can be useful for inspecting the contents of a single packfile.

\n", + "comments": "

This can be useful for inspecting the contents of a single\n packfile.

\n", "group": "odb" }, "git_oid_fromstr": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 47, "lineto": 47, "args": [ @@ -11864,15 +12566,12 @@ "ex/HEAD/general.html#git_oid_fromstr-53", "ex/HEAD/general.html#git_oid_fromstr-54", "ex/HEAD/general.html#git_oid_fromstr-55" - ], - "merge.c": [ - "ex/HEAD/merge.html#git_oid_fromstr-23" ] } }, "git_oid_fromstrp": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 56, "lineto": 56, "args": [ @@ -11899,7 +12598,7 @@ }, "git_oid_fromstrn": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 69, "lineto": 69, "args": [ @@ -11926,12 +12625,12 @@ "comment": " 0 or an error code" }, "description": "

Parse N characters of a hex formatted object id into a git_oid.

\n", - "comments": "

If N is odd, the last byte's high nibble will be read in and the low nibble set to zero.

\n", + "comments": "

If N is odd, the last byte's high nibble will be read in and the\n low nibble set to zero.

\n", "group": "oid" }, "git_oid_fromraw": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 77, "lineto": 77, "args": [ @@ -11958,7 +12657,7 @@ }, "git_oid_fmt": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 89, "lineto": 89, "args": [ @@ -11995,9 +12694,6 @@ "ex/HEAD/network/fetch.html#git_oid_fmt-1", "ex/HEAD/network/fetch.html#git_oid_fmt-2" ], - "network/index-pack.c": [ - "ex/HEAD/network/index-pack.html#git_oid_fmt-6" - ], "network/ls-remote.c": [ "ex/HEAD/network/ls-remote.html#git_oid_fmt-1" ] @@ -12005,7 +12701,7 @@ }, "git_oid_nfmt": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 100, "lineto": 100, "args": [ @@ -12037,7 +12733,7 @@ }, "git_oid_pathfmt": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 115, "lineto": 115, "args": [ @@ -12059,12 +12755,12 @@ "comment": null }, "description": "

Format a git_oid into a loose-object path string.

\n", - "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", + "comments": "

The resulting string is "aa/...", where "aa" is the first two\n hex digits of the oid and "..." is the remaining 38 digits.

\n", "group": "oid" }, "git_oid_tostr_s": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 128, "lineto": 128, "args": [ @@ -12081,18 +12777,18 @@ "comment": " the c-string" }, "description": "

Format a git_oid into a statically allocated c-string.

\n", - "comments": "

The c-string is owned by the library and should not be freed by the user. If libgit2 is built with thread support, the string will be stored in TLS (i.e. one buffer per thread) to allow for concurrent calls of the function.

\n", + "comments": "

The c-string is owned by the library and should not be freed\n by the user. If libgit2 is built with thread support, the string\n will be stored in TLS (i.e. one buffer per thread) to allow for\n concurrent calls of the function.

\n", "group": "oid", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_oid_tostr_s-24", - "ex/HEAD/merge.html#git_oid_tostr_s-25" + "ex/HEAD/merge.html#git_oid_tostr_s-21", + "ex/HEAD/merge.html#git_oid_tostr_s-22" ] } }, "git_oid_tostr": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 147, "lineto": 147, "args": [ @@ -12119,7 +12815,7 @@ "comment": " the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string." }, "description": "

Format a git_oid into a buffer as a hex format c-string.

\n", - "comments": "

If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting oid c-string will be truncated to n-1 characters (but will still be NUL-byte terminated).

\n\n

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.

\n", + "comments": "

If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting\n oid c-string will be truncated to n-1 characters (but will still be\n NUL-byte terminated).

\n\n

If there are any input parameter errors (out == NULL, n == 0, oid ==\n NULL), then a pointer to an empty string is returned, so that the\n return value can always be printed.

\n", "group": "oid", "examples": { "blame.c": [ @@ -12147,7 +12843,7 @@ }, "git_oid_cpy": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 155, "lineto": 155, "args": [ @@ -12181,7 +12877,7 @@ }, "git_oid_cmp": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 164, "lineto": 164, "args": [ @@ -12208,7 +12904,7 @@ }, "git_oid_equal": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 173, "lineto": 173, "args": [ @@ -12235,7 +12931,7 @@ }, "git_oid_ncmp": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 184, "lineto": 184, "args": [ @@ -12267,7 +12963,7 @@ }, "git_oid_streq": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 193, "lineto": 193, "args": [ @@ -12294,7 +12990,7 @@ }, "git_oid_strcmp": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 203, "lineto": 203, "args": [ @@ -12321,7 +13017,7 @@ }, "git_oid_iszero": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 210, "lineto": 210, "args": [ @@ -12351,7 +13047,7 @@ }, "git_oid_shorten_new": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 231, "lineto": 231, "args": [ @@ -12368,12 +13064,12 @@ "comment": " a `git_oid_shorten` instance, NULL if OOM" }, "description": "

Create a new OID shortener.

\n", - "comments": "

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.

\n\n

E.g. look at the result of git log --abbrev.

\n", + "comments": "

The OID shortener is used to process a list of OIDs\n in text form and return the shortest length that would\n uniquely identify all of them.

\n\n

E.g. look at the result of git log --abbrev.

\n", "group": "oid" }, "git_oid_shorten_add": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 257, "lineto": 257, "args": [ @@ -12395,12 +13091,12 @@ "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." }, "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", - "comments": "

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.

\n\n

For performance reasons, there is a hard-limit of how many OIDs can be added to a single set (around ~32000, assuming a mostly randomized distribution), which should be enough for any kind of program, and keeps the algorithm fast and memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a GITERR_INVALID error

\n", + "comments": "

The OID is expected to be a 40-char hexadecimal string.\n The OID is owned by the user and will not be modified\n or freed.

\n\n

For performance reasons, there is a hard-limit of how many\n OIDs can be added to a single set (around ~32000, assuming\n a mostly randomized distribution), which should be enough\n for any kind of program, and keeps the algorithm fast and\n memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a\n GITERR_INVALID error

\n", "group": "oid" }, "git_oid_shorten_free": { "type": "function", - "file": "oid.h", + "file": "git2/oid.h", "line": 264, "lineto": 264, "args": [ @@ -12422,7 +13118,7 @@ }, "git_oidarray_free": { "type": "function", - "file": "oidarray.h", + "file": "git2/oidarray.h", "line": 34, "lineto": 34, "args": [ @@ -12439,12 +13135,12 @@ "comment": null }, "description": "

Free the OID array

\n", - "comments": "

This method must (and must only) be called on git_oidarray objects where the array is allocated by the library. Not doing so, will result in a memory leak.

\n\n

This does not free the git_oidarray itself, since the library will never allocate that object directly itself (it is more commonly embedded inside another struct or created on the stack).

\n", + "comments": "

This method must (and must only) be called on git_oidarray\n objects where the array is allocated by the library. Not doing so,\n will result in a memory leak.

\n\n

This does not free the git_oidarray itself, since the library will\n never allocate that object directly itself (it is more commonly embedded\n inside another struct or created on the stack).

\n", "group": "oidarray" }, "git_packbuilder_new": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 64, "lineto": 64, "args": [ @@ -12471,7 +13167,7 @@ }, "git_packbuilder_set_threads": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 77, "lineto": 77, "args": [ @@ -12493,12 +13189,12 @@ "comment": " number of actual threads to be used" }, "description": "

Set number of threads to spawn

\n", - "comments": "

By default, libgit2 won't spawn any threads at all; when set to 0, libgit2 will autodetect the number of CPUs.

\n", + "comments": "

By default, libgit2 won't spawn any threads at all;\n when set to 0, libgit2 will autodetect the number of\n CPUs.

\n", "group": "packbuilder" }, "git_packbuilder_insert": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 91, "lineto": 91, "args": [ @@ -12525,12 +13221,12 @@ "comment": " 0 or an error code" }, "description": "

Insert a single object

\n", - "comments": "

For an optimal pack it's mandatory to insert objects in recency order, commits followed by trees and blobs.

\n", + "comments": "

For an optimal pack it's mandatory to insert objects in recency order,\n commits followed by trees and blobs.

\n", "group": "packbuilder" }, "git_packbuilder_insert_tree": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 103, "lineto": 103, "args": [ @@ -12557,7 +13253,7 @@ }, "git_packbuilder_insert_commit": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 115, "lineto": 115, "args": [ @@ -12584,7 +13280,7 @@ }, "git_packbuilder_insert_walk": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 128, "lineto": 128, "args": [ @@ -12606,12 +13302,12 @@ "comment": " 0 or an error code" }, "description": "

Insert objects as given by the walk

\n", - "comments": "

Those commits and all objects they reference will be inserted into the packbuilder.

\n", + "comments": "

Those commits and all objects they reference will be inserted into\n the packbuilder.

\n", "group": "packbuilder" }, "git_packbuilder_insert_recur": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 140, "lineto": 140, "args": [ @@ -12641,9 +13337,36 @@ "comments": "

Insert the object as well as any object it references.

\n", "group": "packbuilder" }, + "git_packbuilder_write_buf": { + "type": "function", + "file": "git2/pack.h", + "line": 151, + "lineto": 151, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "Buffer where to write the packfile" + }, + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + } + ], + "argline": "git_buf *buf, git_packbuilder *pb", + "sig": "git_buf *::git_packbuilder *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Write the contents of the packfile to an in-memory buffer

\n", + "comments": "

The contents of the buffer will become a valid packfile, even though there\n will be no attached index

\n", + "group": "packbuilder" + }, "git_packbuilder_write": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 164, "lineto": 169, "args": [ @@ -12685,7 +13408,7 @@ }, "git_packbuilder_hash": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 179, "lineto": 179, "args": [ @@ -12702,12 +13425,12 @@ "comment": null }, "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the packfile has been written.

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object\n names. This is only correct after the packfile has been written.

\n", "group": "packbuilder" }, "git_packbuilder_foreach": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 191, "lineto": 191, "args": [ @@ -12739,7 +13462,7 @@ }, "git_packbuilder_object_count": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 199, "lineto": 199, "args": [ @@ -12761,7 +13484,7 @@ }, "git_packbuilder_written": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 207, "lineto": 207, "args": [ @@ -12783,7 +13506,7 @@ }, "git_packbuilder_set_callbacks": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 226, "lineto": 229, "args": [ @@ -12815,7 +13538,7 @@ }, "git_packbuilder_free": { "type": "function", - "file": "pack.h", + "file": "git2/pack.h", "line": 236, "lineto": 236, "args": [ @@ -12837,7 +13560,7 @@ }, "git_patch_from_diff": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 51, "lineto": 52, "args": [ @@ -12864,12 +13587,12 @@ "comment": " 0 on success, other value \n<\n 0 on error" }, "description": "

Return a patch for an entry in the diff list.

\n", - "comments": "

The git_patch is a newly created object contains the text diffs for the delta. You have to call git_patch_free() when you are done with it. You can use the patch object to loop over all the hunks and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be created, the output will be set to NULL, and the binary flag will be set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass NULL for the git_patch, then the text diff will not be calculated.

\n", + "comments": "

The git_patch is a newly created object contains the text diffs\n for the delta. You have to call git_patch_free() when you are\n done with it. You can use the patch object to loop over all the hunks\n and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be\n created, the output will be set to NULL, and the binary flag will be\n set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass\n NULL for the git_patch, then the text diff will not be calculated.

\n", "group": "patch" }, "git_patch_from_blobs": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 70, "lineto": 76, "args": [ @@ -12911,12 +13634,12 @@ "comment": " 0 on success or error code \n<\n 0" }, "description": "

Directly generate a patch from the difference between two blobs.

\n", - "comments": "

This is just like git_diff_blobs() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "comments": "

This is just like git_diff_blobs() except it generates a patch object\n for the difference instead of directly making callbacks. You can use the\n standard git_patch accessor functions to read the patch data, and\n you must call git_patch_free() on the patch when done.

\n", "group": "patch" }, "git_patch_from_blob_and_buffer": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 95, "lineto": 102, "args": [ @@ -12963,12 +13686,12 @@ "comment": " 0 on success or error code \n<\n 0" }, "description": "

Directly generate a patch from the difference between a blob and a buffer.

\n", - "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch\n object for the difference instead of directly making callbacks. You can\n use the standard git_patch accessor functions to read the patch\n data, and you must call git_patch_free() on the patch when done.

\n", "group": "patch" }, "git_patch_from_buffers": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 122, "lineto": 130, "args": [ @@ -13020,12 +13743,12 @@ "comment": " 0 on success or error code \n<\n 0" }, "description": "

Directly generate a patch from the difference between two buffers.

\n", - "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "comments": "

This is just like git_diff_buffers() except it generates a patch\n object for the difference instead of directly making callbacks. You can\n use the standard git_patch accessor functions to read the patch\n data, and you must call git_patch_free() on the patch when done.

\n", "group": "patch" }, "git_patch_free": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 135, "lineto": 135, "args": [ @@ -13047,7 +13770,7 @@ }, "git_patch_get_delta": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 141, "lineto": 141, "args": [ @@ -13069,7 +13792,7 @@ }, "git_patch_num_hunks": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 146, "lineto": 146, "args": [ @@ -13091,7 +13814,7 @@ }, "git_patch_line_stats": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 164, "lineto": 168, "args": [ @@ -13123,12 +13846,12 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Get line counts of each type in a patch.

\n", - "comments": "

This helps imitate a diff --numstat type of output. For that purpose, you only need the total_additions and total_deletions values, but we include the total_context line count in case you want the total number of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", + "comments": "

This helps imitate a diff --numstat type of output. For that purpose,\n you only need the total_additions and total_deletions values, but we\n include the total_context line count in case you want the total number\n of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", "group": "patch" }, "git_patch_get_hunk": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 183, "lineto": 187, "args": [ @@ -13160,12 +13883,12 @@ "comment": " 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error" }, "description": "

Get the information about a hunk in a patch

\n", - "comments": "

Given a patch and a hunk index into the patch, this returns detailed information about that hunk. Any of the output pointers can be passed as NULL if you don't care about that particular piece of information.

\n", + "comments": "

Given a patch and a hunk index into the patch, this returns detailed\n information about that hunk. Any of the output pointers can be passed\n as NULL if you don't care about that particular piece of information.

\n", "group": "patch" }, "git_patch_num_lines_in_hunk": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 196, "lineto": 198, "args": [ @@ -13192,7 +13915,7 @@ }, "git_patch_get_line_in_hunk": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 214, "lineto": 218, "args": [ @@ -13224,12 +13947,12 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Get data about a line in a hunk of a patch.

\n", - "comments": "

Given a patch, a hunk index, and a line index in the hunk, this will return a lot of details about that line. If you pass a hunk index larger than the number of hunks or a line index larger than the number of lines in the hunk, this will return -1.

\n", + "comments": "

Given a patch, a hunk index, and a line index in the hunk, this\n will return a lot of details about that line. If you pass a hunk\n index larger than the number of hunks or a line index larger than\n the number of lines in the hunk, this will return -1.

\n", "group": "patch" }, "git_patch_size": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 236, "lineto": 240, "args": [ @@ -13261,12 +13984,12 @@ "comment": " The number of bytes of data" }, "description": "

Look up size of patch diff data in bytes

\n", - "comments": "

This returns the raw size of the patch data. This only includes the actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size of all of the diff output; if you pass it as false (zero), this will only include the actual changed lines (as if context_lines was 0).

\n", + "comments": "

This returns the raw size of the patch data. This only includes the\n actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size\n of all of the diff output; if you pass it as false (zero), this will\n only include the actual changed lines (as if context_lines was 0).

\n", "group": "patch" }, "git_patch_print": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 254, "lineto": 257, "args": [ @@ -13293,12 +14016,12 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Serialize the patch to text via callback.

\n", - "comments": "

Returning a non-zero value from the callback will terminate the iteration and return that value to the caller.

\n", + "comments": "

Returning a non-zero value from the callback will terminate the iteration\n and return that value to the caller.

\n", "group": "patch" }, "git_patch_to_buf": { "type": "function", - "file": "patch.h", + "file": "git2/patch.h", "line": 266, "lineto": 268, "args": [ @@ -13325,7 +14048,7 @@ }, "git_pathspec_new": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 82, "lineto": 83, "args": [ @@ -13357,7 +14080,7 @@ }, "git_pathspec_free": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 90, "lineto": 90, "args": [ @@ -13384,7 +14107,7 @@ }, "git_pathspec_matches_path": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 105, "lineto": 106, "args": [ @@ -13411,12 +14134,12 @@ "comment": " 1 is path matches spec, 0 if it does not" }, "description": "

Try to match a path against a pathspec

\n", - "comments": "

Unlike most of the other pathspec matching functions, this will not fall back on the native case-sensitivity for your platform. You must explicitly pass flags to control case sensitivity or else this will fall back on being case sensitive.

\n", + "comments": "

Unlike most of the other pathspec matching functions, this will not\n fall back on the native case-sensitivity for your platform. You must\n explicitly pass flags to control case sensitivity or else this will\n fall back on being case sensitive.

\n", "group": "pathspec" }, "git_pathspec_match_workdir": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 130, "lineto": 134, "args": [ @@ -13448,12 +14171,12 @@ "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" }, "description": "

Match a pathspec against the working directory of a repository.

\n", - "comments": "

This matches the pathspec against the current files in the working directory of the repository. It is an error to invoke this on a bare repo. This handles git ignores (i.e. ignored files will not be considered to match the pathspec unless the file is tracked in the index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "comments": "

This matches the pathspec against the current files in the working\n directory of the repository. It is an error to invoke this on a bare\n repo. This handles git ignores (i.e. ignored files will not be\n considered to match the pathspec unless the file is tracked in the\n index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec" }, "git_pathspec_match_index": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 159, "lineto": 163, "args": [ @@ -13485,12 +14208,12 @@ "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" }, "description": "

Match a pathspec against entries in an index.

\n", - "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled by the current case-sensitivity of the index object itself and the USE_CASE and IGNORE_CASE flags will have no effect. This behavior will be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled\n by the current case-sensitivity of the index object itself and the\n USE_CASE and IGNORE_CASE flags will have no effect. This behavior will\n be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec" }, "git_pathspec_match_tree": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 183, "lineto": 187, "args": [ @@ -13522,7 +14245,7 @@ "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" }, "description": "

Match a pathspec against files in a tree.

\n", - "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec", "examples": { "log.c": [ @@ -13532,7 +14255,7 @@ }, "git_pathspec_match_diff": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 207, "lineto": 211, "args": [ @@ -13564,12 +14287,12 @@ "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" }, "description": "

Match a pathspec against files in a diff list.

\n", - "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec" }, "git_pathspec_match_list_free": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 218, "lineto": 218, "args": [ @@ -13591,7 +14314,7 @@ }, "git_pathspec_match_list_entrycount": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 226, "lineto": 227, "args": [ @@ -13613,7 +14336,7 @@ }, "git_pathspec_match_list_entry": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 239, "lineto": 240, "args": [ @@ -13635,12 +14358,12 @@ "comment": " The filename of the match" }, "description": "

Get a matching filename by position.

\n", - "comments": "

This routine cannot be used if the match list was generated by git_pathspec_match_diff. If so, it will always return NULL.

\n", + "comments": "

This routine cannot be used if the match list was generated by\n git_pathspec_match_diff. If so, it will always return NULL.

\n", "group": "pathspec" }, "git_pathspec_match_list_diff_entry": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 252, "lineto": 253, "args": [ @@ -13662,12 +14385,12 @@ "comment": " The filename of the match" }, "description": "

Get a matching diff delta by position.

\n", - "comments": "

This routine can only be used if the match list was generated by git_pathspec_match_diff. Otherwise it will always return NULL.

\n", + "comments": "

This routine can only be used if the match list was generated by\n git_pathspec_match_diff. Otherwise it will always return NULL.

\n", "group": "pathspec" }, "git_pathspec_match_list_failed_entrycount": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 264, "lineto": 265, "args": [ @@ -13684,12 +14407,12 @@ "comment": " Number of items in original pathspec that had no matches" }, "description": "

Get the number of pathspec items that did not match.

\n", - "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when generating the git_pathspec_match_list.

\n", + "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when\n generating the git_pathspec_match_list.

\n", "group": "pathspec" }, "git_pathspec_match_list_failed_entry": { "type": "function", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 276, "lineto": 277, "args": [ @@ -13716,46 +14439,46 @@ }, "git_proxy_init_options": { "type": "function", - "file": "proxy.h", - "line": 88, - "lineto": 88, + "file": "git2/proxy.h", + "line": 92, + "lineto": 92, "args": [ { "name": "opts", "type": "git_proxy_options *", - "comment": "the options struct to initialize" + "comment": "The `git_proxy_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "the version of the struct, use `GIT_PROXY_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_PROXY_OPTIONS_VERSION`." } ], "argline": "git_proxy_options *opts, unsigned int version", "sig": "git_proxy_options *::unsigned int", "return": { "type": "int", - "comment": null + "comment": " Zero on success; -1 on failure." }, - "description": "

Initialize a proxy options structure

\n", - "comments": "", + "description": "

Initialize git_proxy_options structure

\n", + "comments": "

Initializes a git_proxy_options with default values. Equivalent to\n creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", "group": "proxy" }, "git_rebase_init_options": { "type": "function", - "file": "rebase.h", - "line": 156, - "lineto": 158, + "file": "git2/rebase.h", + "line": 159, + "lineto": 161, "args": [ { "name": "opts", "type": "git_rebase_options *", - "comment": "the `git_rebase_options` instance to initialize." + "comment": "The `git_rebase_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_REBASE_OPTIONS_VERSION` here." + "comment": "The struct version; pass `GIT_REBASE_OPTIONS_VERSION`." } ], "argline": "git_rebase_options *opts, unsigned int version", @@ -13764,15 +14487,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_rebase_options with default values. Equivalent to\n creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_rebase_options structure

\n", + "comments": "

Initializes a git_rebase_options with default values. Equivalent to\n creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", "group": "rebase" }, "git_rebase_init": { "type": "function", - "file": "rebase.h", - "line": 177, - "lineto": 183, + "file": "git2/rebase.h", + "line": 180, + "lineto": 186, "args": [ { "name": "out", @@ -13817,9 +14540,9 @@ }, "git_rebase_open": { "type": "function", - "file": "rebase.h", - "line": 194, - "lineto": 197, + "file": "git2/rebase.h", + "line": 197, + "lineto": 200, "args": [ { "name": "out", @@ -13849,9 +14572,9 @@ }, "git_rebase_operation_entrycount": { "type": "function", - "file": "rebase.h", - "line": 205, - "lineto": 205, + "file": "git2/rebase.h", + "line": 208, + "lineto": 208, "args": [ { "name": "rebase", @@ -13871,9 +14594,9 @@ }, "git_rebase_operation_current": { "type": "function", - "file": "rebase.h", - "line": 216, - "lineto": 216, + "file": "git2/rebase.h", + "line": 219, + "lineto": 219, "args": [ { "name": "rebase", @@ -13893,9 +14616,9 @@ }, "git_rebase_operation_byindex": { "type": "function", - "file": "rebase.h", - "line": 225, - "lineto": 227, + "file": "git2/rebase.h", + "line": 228, + "lineto": 230, "args": [ { "name": "rebase", @@ -13920,9 +14643,9 @@ }, "git_rebase_next": { "type": "function", - "file": "rebase.h", - "line": 240, - "lineto": 242, + "file": "git2/rebase.h", + "line": 243, + "lineto": 245, "args": [ { "name": "operation", @@ -13947,9 +14670,9 @@ }, "git_rebase_inmemory_index": { "type": "function", - "file": "rebase.h", - "line": 255, - "lineto": 257, + "file": "git2/rebase.h", + "line": 258, + "lineto": 260, "args": [ { "name": "index", @@ -13969,14 +14692,14 @@ "comment": null }, "description": "

Gets the index produced by the last operation, which is the result\n of git_rebase_next and which will be committed by the next\n invocation of git_rebase_commit. This is useful for resolving\n conflicts in an in-memory rebase before committing them. You must\n call git_index_free when you are finished with this.

\n", - "comments": "

This is only applicable for in-memory rebases; for rebases within a working directory, the changes were applied to the repository's index.

\n", + "comments": "

This is only applicable for in-memory rebases; for rebases within\n a working directory, the changes were applied to the repository's\n index.

\n", "group": "rebase" }, "git_rebase_commit": { "type": "function", - "file": "rebase.h", - "line": 281, - "lineto": 287, + "file": "git2/rebase.h", + "line": 284, + "lineto": 290, "args": [ { "name": "id", @@ -14021,9 +14744,9 @@ }, "git_rebase_abort": { "type": "function", - "file": "rebase.h", - "line": 297, - "lineto": 297, + "file": "git2/rebase.h", + "line": 300, + "lineto": 300, "args": [ { "name": "rebase", @@ -14043,9 +14766,9 @@ }, "git_rebase_finish": { "type": "function", - "file": "rebase.h", - "line": 307, - "lineto": 309, + "file": "git2/rebase.h", + "line": 310, + "lineto": 312, "args": [ { "name": "rebase", @@ -14070,9 +14793,9 @@ }, "git_rebase_free": { "type": "function", - "file": "rebase.h", - "line": 316, - "lineto": 316, + "file": "git2/rebase.h", + "line": 319, + "lineto": 319, "args": [ { "name": "rebase", @@ -14092,7 +14815,7 @@ }, "git_refdb_new": { "type": "function", - "file": "refdb.h", + "file": "git2/refdb.h", "line": 35, "lineto": 35, "args": [ @@ -14114,12 +14837,12 @@ "comment": " 0 or an error code" }, "description": "

Create a new reference database with no backends.

\n", - "comments": "

Before the Ref DB can be used for read/writing, a custom database backend must be manually set using git_refdb_set_backend()

\n", + "comments": "

Before the Ref DB can be used for read/writing, a custom database\n backend must be manually set using git_refdb_set_backend()

\n", "group": "refdb" }, "git_refdb_open": { "type": "function", - "file": "refdb.h", + "file": "git2/refdb.h", "line": 49, "lineto": 49, "args": [ @@ -14141,12 +14864,12 @@ "comment": " 0 or an error code" }, "description": "

Create a new reference database and automatically add\n the default backends:

\n", - "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs from disk, assuming the repository dir as the folder
  • \n
\n", + "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs\n from disk, assuming the repository dir as the folder
  • \n
\n", "group": "refdb" }, "git_refdb_compress": { "type": "function", - "file": "refdb.h", + "file": "git2/refdb.h", "line": 56, "lineto": 56, "args": [ @@ -14168,7 +14891,7 @@ }, "git_refdb_free": { "type": "function", - "file": "refdb.h", + "file": "git2/refdb.h", "line": 63, "lineto": 63, "args": [ @@ -14190,7 +14913,7 @@ }, "git_reflog_read": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 38, "lineto": 38, "args": [ @@ -14217,12 +14940,12 @@ "comment": " 0 or an error code" }, "description": "

Read the reflog for the given reference

\n", - "comments": "

If there is no reflog file for the given reference yet, an empty reflog object will be returned.

\n\n

The reflog must be freed manually by using git_reflog_free().

\n", + "comments": "

If there is no reflog file for the given\n reference yet, an empty reflog object will\n be returned.

\n\n

The reflog must be freed manually by using\n git_reflog_free().

\n", "group": "reflog" }, "git_reflog_write": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 47, "lineto": 47, "args": [ @@ -14244,7 +14967,7 @@ }, "git_reflog_append": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 60, "lineto": 60, "args": [ @@ -14281,7 +15004,7 @@ }, "git_reflog_rename": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 75, "lineto": 75, "args": [ @@ -14308,12 +15031,12 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" }, "description": "

Rename a reflog

\n", - "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity. See git_reference_create_symbolic() for rules about valid names.

\n", + "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity.\n See git_reference_create_symbolic() for rules about valid names.

\n", "group": "reflog" }, "git_reflog_delete": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 84, "lineto": 84, "args": [ @@ -14340,7 +15063,7 @@ }, "git_reflog_entrycount": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 92, "lineto": 92, "args": [ @@ -14362,7 +15085,7 @@ }, "git_reflog_entry_byindex": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 105, "lineto": 105, "args": [ @@ -14384,12 +15107,12 @@ "comment": " the entry; NULL if not found" }, "description": "

Lookup an entry by its index

\n", - "comments": "

Requesting the reflog entry with an index of 0 (zero) will return the most recently created entry.

\n", + "comments": "

Requesting the reflog entry with an index of 0 (zero) will\n return the most recently created entry.

\n", "group": "reflog" }, "git_reflog_drop": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 124, "lineto": 127, "args": [ @@ -14416,12 +15139,12 @@ "comment": " 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code." }, "description": "

Remove an entry from the reflog by its index

\n", - "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry param value to 1. When deleting entry n, member old_oid of entry n-1 (if any) will be updated with the value of member new_oid of entry n+1.

\n", + "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry\n param value to 1. When deleting entry n, member old_oid of entry n-1\n (if any) will be updated with the value of member new_oid of entry n+1.

\n", "group": "reflog" }, "git_reflog_entry_id_old": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 135, "lineto": 135, "args": [ @@ -14443,7 +15166,7 @@ }, "git_reflog_entry_id_new": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 143, "lineto": 143, "args": [ @@ -14465,7 +15188,7 @@ }, "git_reflog_entry_committer": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 151, "lineto": 151, "args": [ @@ -14487,7 +15210,7 @@ }, "git_reflog_entry_message": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 159, "lineto": 159, "args": [ @@ -14509,7 +15232,7 @@ }, "git_reflog_free": { "type": "function", - "file": "reflog.h", + "file": "git2/reflog.h", "line": 166, "lineto": 166, "args": [ @@ -14531,7 +15254,7 @@ }, "git_reference_lookup": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 37, "lineto": 37, "args": [ @@ -14558,20 +15281,20 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." }, "description": "

Lookup a reference by name in a repository.

\n", - "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference", "examples": { "general.c": [ "ex/HEAD/general.html#git_reference_lookup-62" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_lookup-26" + "ex/HEAD/merge.html#git_reference_lookup-23" ] } }, "git_reference_name_to_id": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 54, "lineto": 55, "args": [ @@ -14598,12 +15321,12 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." }, "description": "

Lookup a reference by name and resolve immediately to OID.

\n", - "comments": "

This function provides a quick way to resolve a reference name straight through to the object id that it refers to. This avoids having to allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "comments": "

This function provides a quick way to resolve a reference name straight\n through to the object id that it refers to. This avoids having to\n allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference" }, "git_reference_dwim": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 68, "lineto": 68, "args": [ @@ -14630,18 +15353,17 @@ "comment": " 0 or an error code" }, "description": "

Lookup a reference by DWIMing its short name

\n", - "comments": "

Apply the git precendence rules to the given shorthand to determine which reference the user is referring to.

\n", + "comments": "

Apply the git precendence rules to the given shorthand to determine\n which reference the user is referring to.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_dwim-27", - "ex/HEAD/merge.html#git_reference_dwim-28" + "ex/HEAD/merge.html#git_reference_dwim-24" ] } }, "git_reference_symbolic_create_matching": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 109, "lineto": 109, "args": [ @@ -14688,12 +15410,12 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" }, "description": "

Conditionally create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n", + "comments": "

A symbolic reference is a reference name that refers to another\n reference name. If the other name moves, the symbolic name will move,\n too. As a simple example, the "HEAD" reference might refer to\n "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time\n of updating does not match the one passed through current_value\n (i.e. if the ref has changed since the user read it).

\n", "group": "reference" }, "git_reference_symbolic_create": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 145, "lineto": 145, "args": [ @@ -14735,12 +15457,12 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "comments": "

A symbolic reference is a reference name that refers to another\n reference name. If the other name moves, the symbolic name will move,\n too. As a simple example, the "HEAD" reference might refer to\n "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and it does not have a reflog.

\n", "group": "reference" }, "git_reference_create": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 182, "lineto": 182, "args": [ @@ -14782,17 +15504,17 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new direct reference.

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n", + "comments": "

A direct reference (also called an object id reference) refers directly\n to a specific object id (a.k.a. OID or SHA) in the repository. The id\n permanently refers to the object (although the reference itself can be\n moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0"\n refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_create-29" + "ex/HEAD/merge.html#git_reference_create-25" ] } }, "git_reference_create_matching": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 225, "lineto": 225, "args": [ @@ -14839,12 +15561,12 @@ "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Conditionally create new direct reference

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", + "comments": "

A direct reference (also called an object id reference) refers directly\n to a specific object id (a.k.a. OID or SHA) in the repository. The id\n permanently refers to the object (although the reference itself can be\n moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0"\n refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time\n of updating does not match the one passed through current_id\n (i.e. if the ref has changed since the user read it).

\n", "group": "reference" }, "git_reference_target": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 240, "lineto": 240, "args": [ @@ -14861,7 +15583,7 @@ "comment": " a pointer to the oid if available, NULL otherwise" }, "description": "

Get the OID pointed to by a direct reference.

\n", - "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", + "comments": "

Only available if the reference is direct (i.e. an object id reference,\n not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and\n then this function (or maybe use git_reference_name_to_id() to\n directly resolve a reference name all the way through to an OID).

\n", "group": "reference", "examples": { "general.c": [ @@ -14871,7 +15593,7 @@ }, "git_reference_target_peel": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 251, "lineto": 251, "args": [ @@ -14888,12 +15610,12 @@ "comment": " a pointer to the oid if available, NULL otherwise" }, "description": "

Return the peeled OID target of this reference.

\n", - "comments": "

This peeled OID only applies to direct references that point to a hard Tag object: it is the result of peeling such Tag.

\n", + "comments": "

This peeled OID only applies to direct references that point to\n a hard Tag object: it is the result of peeling such Tag.

\n", "group": "reference" }, "git_reference_symbolic_target": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 261, "lineto": 261, "args": [ @@ -14917,13 +15639,13 @@ "ex/HEAD/general.html#git_reference_symbolic_target-64" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_symbolic_target-30" + "ex/HEAD/merge.html#git_reference_symbolic_target-26" ] } }, "git_reference_type": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 271, "lineto": 271, "args": [ @@ -14950,7 +15672,7 @@ }, "git_reference_name": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 281, "lineto": 281, "args": [ @@ -14971,13 +15693,13 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_name-31" + "ex/HEAD/merge.html#git_reference_name-27" ] } }, "git_reference_resolve": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 299, "lineto": 299, "args": [ @@ -14999,12 +15721,12 @@ "comment": " 0 or an error code" }, "description": "

Resolve a symbolic reference to a direct reference.

\n", - "comments": "

This method iteratively peels a symbolic reference until it resolves to a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that reference is returned. This copy must be manually freed too.

\n", + "comments": "

This method iteratively peels a symbolic reference until it resolves to\n a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and\n must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that\n reference is returned. This copy must be manually freed too.

\n", "group": "reference" }, "git_reference_owner": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 307, "lineto": 307, "args": [ @@ -15026,7 +15748,7 @@ }, "git_reference_symbolic_set_target": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 329, "lineto": 333, "args": [ @@ -15058,12 +15780,12 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", - "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n", "group": "reference" }, "git_reference_set_target": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 349, "lineto": 353, "args": [ @@ -15099,13 +15821,13 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_set_target-32" + "ex/HEAD/merge.html#git_reference_set_target-28" ] } }, "git_reference_rename": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 378, "lineto": 383, "args": [ @@ -15142,12 +15864,12 @@ "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" }, "description": "

Rename an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already a reference with the given name, the renaming will fail.

\n\n

IMPORTANT: The user needs to write a proper reflog entry if the reflog is enabled for the repository. We only rename the reflog if it exists.

\n", + "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already\n a reference with the given name, the renaming will fail.

\n\n

IMPORTANT:\n The user needs to write a proper reflog entry if the\n reflog is enabled for the repository. We only rename\n the reflog if it exists.

\n", "group": "reference" }, "git_reference_delete": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 398, "lineto": 398, "args": [ @@ -15164,12 +15886,12 @@ "comment": " 0, GIT_EMODIFIED or an error code" }, "description": "

Delete an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references. The reference will be immediately removed on disk but the memory will not be freed. Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed from the time it was looked up.

\n", + "comments": "

This method works for both direct and symbolic references. The reference\n will be immediately removed on disk but the memory will not be freed.\n Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed\n from the time it was looked up.

\n", "group": "reference" }, "git_reference_remove": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 409, "lineto": 409, "args": [ @@ -15191,12 +15913,12 @@ "comment": " 0 or an error code" }, "description": "

Delete an existing reference by name

\n", - "comments": "

This method removes the named reference from the repository without looking at its old value.

\n", + "comments": "

This method removes the named reference from the repository without\n looking at its old value.

\n", "group": "reference" }, "git_reference_list": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 423, "lineto": 423, "args": [ @@ -15218,7 +15940,7 @@ "comment": " 0 or an error code" }, "description": "

Fill a list with all the references that can be found in a repository.

\n", - "comments": "

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().

\n", + "comments": "

The string array will be filled with the names of all references; these\n values are owned by the user and should be free'd manually when no\n longer needed, using git_strarray_free().

\n", "group": "reference", "examples": { "general.c": [ @@ -15228,7 +15950,7 @@ }, "git_reference_foreach": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 444, "lineto": 447, "args": [ @@ -15255,12 +15977,12 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Perform a callback on each reference in the repository.

\n", - "comments": "

The callback function will be called for each reference in the repository, receiving the reference object and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free on each reference passed to it.

\n", + "comments": "

The callback function will be called for each reference in the\n repository, receiving the reference object and the payload value\n passed to this method. Returning a non-zero value from the callback\n will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free\n on each reference passed to it.

\n", "group": "reference" }, "git_reference_foreach_name": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 462, "lineto": 465, "args": [ @@ -15287,12 +16009,12 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Perform a callback on the fully-qualified name of each reference.

\n", - "comments": "

The callback function will be called for each reference in the repository, receiving the name of the reference and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n", + "comments": "

The callback function will be called for each reference in the\n repository, receiving the name of the reference and the payload value\n passed to this method. Returning a non-zero value from the callback\n will terminate the iteration.

\n", "group": "reference" }, "git_reference_dup": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 476, "lineto": 476, "args": [ @@ -15319,7 +16041,7 @@ }, "git_reference_free": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 483, "lineto": 483, "args": [ @@ -15343,10 +16065,9 @@ "ex/HEAD/general.html#git_reference_free-67" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_free-33", - "ex/HEAD/merge.html#git_reference_free-34", - "ex/HEAD/merge.html#git_reference_free-35", - "ex/HEAD/merge.html#git_reference_free-36" + "ex/HEAD/merge.html#git_reference_free-29", + "ex/HEAD/merge.html#git_reference_free-30", + "ex/HEAD/merge.html#git_reference_free-31" ], "status.c": [ "ex/HEAD/status.html#git_reference_free-3" @@ -15355,7 +16076,7 @@ }, "git_reference_cmp": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 492, "lineto": 494, "args": [ @@ -15382,7 +16103,7 @@ }, "git_reference_iterator_new": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 503, "lineto": 505, "args": [ @@ -15409,7 +16130,7 @@ }, "git_reference_iterator_glob_new": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 516, "lineto": 519, "args": [ @@ -15441,7 +16162,7 @@ }, "git_reference_next": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 528, "lineto": 528, "args": [ @@ -15468,7 +16189,7 @@ }, "git_reference_next_name": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 541, "lineto": 541, "args": [ @@ -15490,12 +16211,12 @@ "comment": " 0, GIT_ITEROVER if there are no more; or an error code" }, "description": "

Get the next reference's name

\n", - "comments": "

This function is provided for convenience in case only the names are interesting as it avoids the allocation of the git_reference object which git_reference_next() needs.

\n", + "comments": "

This function is provided for convenience in case only the names\n are interesting as it avoids the allocation of the git_reference\n object which git_reference_next() needs.

\n", "group": "reference" }, "git_reference_iterator_free": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 548, "lineto": 548, "args": [ @@ -15517,7 +16238,7 @@ }, "git_reference_foreach_glob": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 568, "lineto": 572, "args": [ @@ -15549,12 +16270,12 @@ "comment": " 0 on success, GIT_EUSER on non-zero callback, or error code" }, "description": "

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n", - "comments": "

This function acts like git_reference_foreach() with an additional pattern match being applied to the reference name before issuing the callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches any sequence of letters, a '?' matches any letter, and square brackets can be used to define character ranges (such as "[0-9]" for digits).

\n", + "comments": "

This function acts like git_reference_foreach() with an additional\n pattern match being applied to the reference name before issuing the\n callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches\n any sequence of letters, a '?' matches any letter, and square brackets\n can be used to define character ranges (such as "[0-9]" for digits).

\n", "group": "reference" }, "git_reference_has_log": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 582, "lineto": 582, "args": [ @@ -15581,7 +16302,7 @@ }, "git_reference_ensure_log": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 594, "lineto": 594, "args": [ @@ -15603,12 +16324,12 @@ "comment": " 0 or an error code." }, "description": "

Ensure there is a reflog for a particular reference.

\n", - "comments": "

Make sure that successive updates to the reference will append to its log.

\n", + "comments": "

Make sure that successive updates to the reference will append to\n its log.

\n", "group": "reference" }, "git_reference_is_branch": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 604, "lineto": 604, "args": [ @@ -15630,7 +16351,7 @@ }, "git_reference_is_remote": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 614, "lineto": 614, "args": [ @@ -15652,7 +16373,7 @@ }, "git_reference_is_tag": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 624, "lineto": 624, "args": [ @@ -15674,7 +16395,7 @@ }, "git_reference_is_note": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 634, "lineto": 634, "args": [ @@ -15696,7 +16417,7 @@ }, "git_reference_normalize_name": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 690, "lineto": 694, "args": [ @@ -15728,12 +16449,12 @@ "comment": " 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code." }, "description": "

Normalize reference name and check validity.

\n", - "comments": "

This will normalize the reference name by removing any leading slash '/' characters and collapsing runs of adjacent slashes between name components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", + "comments": "

This will normalize the reference name by removing any leading slash\n '/' characters and collapsing runs of adjacent slashes between name\n components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in\n the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference" }, "git_reference_peel": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 711, "lineto": 714, "args": [ @@ -15760,17 +16481,17 @@ "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" }, "description": "

Recursively peel reference until object of the specified type is found.

\n", - "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", + "comments": "

The retrieved peeled object is owned by the repository\n and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object\n will be peeled until a non-tag object is met.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_peel-37" + "ex/HEAD/merge.html#git_reference_peel-32" ] } }, "git_reference_is_valid_name": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 730, "lineto": 730, "args": [ @@ -15787,12 +16508,12 @@ "comment": " 1 if the reference name is acceptable; 0 if it isn't" }, "description": "

Ensure the reference name is well-formed.

\n", - "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n", "group": "reference" }, "git_reference_shorthand": { "type": "function", - "file": "refs.h", + "file": "git2/refs.h", "line": 744, "lineto": 744, "args": [ @@ -15809,7 +16530,7 @@ "comment": " the human-readable version of the name" }, "description": "

Get the reference's short name

\n", - "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", + "comments": "

This will transform the reference name into a name "human-readable"\n version. If no shortname is appropriate, it will return the full\n name.

\n\n

The memory is owned by the reference and must not be freed.

\n", "group": "reference", "examples": { "status.c": [ @@ -15817,11 +16538,65 @@ ] } }, + "git_refspec_parse": { + "type": "function", + "file": "git2/refspec.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "refspec", + "type": "git_refspec **", + "comment": "a pointer to hold the refspec handle" + }, + { + "name": "input", + "type": "const char *", + "comment": "the refspec string" + }, + { + "name": "is_fetch", + "type": "int", + "comment": "is this a refspec for a fetch" + } + ], + "argline": "git_refspec **refspec, const char *input, int is_fetch", + "sig": "git_refspec **::const char *::int", + "return": { + "type": "int", + "comment": " 0 if the refspec string could be parsed, -1 otherwise" + }, + "description": "

Parse a given refspec string

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_free": { + "type": "function", + "file": "git2/refspec.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "refspec", + "type": "git_refspec *", + "comment": "the refspec object" + } + ], + "argline": "git_refspec *refspec", + "sig": "git_refspec *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a refspec object which has been created by git_refspec_parse

\n", + "comments": "", + "group": "refspec" + }, "git_refspec_src": { "type": "function", - "file": "refspec.h", - "line": 30, - "lineto": 30, + "file": "git2/refspec.h", + "line": 47, + "lineto": 47, "args": [ { "name": "refspec", @@ -15841,9 +16616,9 @@ }, "git_refspec_dst": { "type": "function", - "file": "refspec.h", - "line": 38, - "lineto": 38, + "file": "git2/refspec.h", + "line": 55, + "lineto": 55, "args": [ { "name": "refspec", @@ -15863,9 +16638,9 @@ }, "git_refspec_string": { "type": "function", - "file": "refspec.h", - "line": 46, - "lineto": 46, + "file": "git2/refspec.h", + "line": 63, + "lineto": 63, "args": [ { "name": "refspec", @@ -15885,9 +16660,9 @@ }, "git_refspec_force": { "type": "function", - "file": "refspec.h", - "line": 54, - "lineto": 54, + "file": "git2/refspec.h", + "line": 71, + "lineto": 71, "args": [ { "name": "refspec", @@ -15907,9 +16682,9 @@ }, "git_refspec_direction": { "type": "function", - "file": "refspec.h", - "line": 62, - "lineto": 62, + "file": "git2/refspec.h", + "line": 79, + "lineto": 79, "args": [ { "name": "spec", @@ -15929,9 +16704,9 @@ }, "git_refspec_src_matches": { "type": "function", - "file": "refspec.h", - "line": 71, - "lineto": 71, + "file": "git2/refspec.h", + "line": 88, + "lineto": 88, "args": [ { "name": "refspec", @@ -15956,9 +16731,9 @@ }, "git_refspec_dst_matches": { "type": "function", - "file": "refspec.h", - "line": 80, - "lineto": 80, + "file": "git2/refspec.h", + "line": 97, + "lineto": 97, "args": [ { "name": "refspec", @@ -15983,9 +16758,9 @@ }, "git_refspec_transform": { "type": "function", - "file": "refspec.h", - "line": 90, - "lineto": 90, + "file": "git2/refspec.h", + "line": 107, + "lineto": 107, "args": [ { "name": "out", @@ -16015,9 +16790,9 @@ }, "git_refspec_rtransform": { "type": "function", - "file": "refspec.h", - "line": 100, - "lineto": 100, + "file": "git2/refspec.h", + "line": 117, + "lineto": 117, "args": [ { "name": "out", @@ -16047,7 +16822,7 @@ }, "git_remote_create": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 38, "lineto": 42, "args": [ @@ -16089,7 +16864,7 @@ }, "git_remote_create_with_fetchspec": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 55, "lineto": 60, "args": [ @@ -16131,7 +16906,7 @@ }, "git_remote_create_anonymous": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 73, "lineto": 76, "args": [ @@ -16158,7 +16933,7 @@ "comment": " 0 or an error code" }, "description": "

Create an anonymous remote

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when\n you have a URL instead of a remote's name.

\n", "group": "remote", "examples": { "network/fetch.c": [ @@ -16171,7 +16946,7 @@ }, "git_remote_create_detached": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 92, "lineto": 94, "args": [ @@ -16193,12 +16968,12 @@ "comment": " 0 or an error code" }, "description": "

Create a remote without a connected local repo

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote will not consider any repo configuration values (such as insteadof url substitutions).

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when\n you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote\n will not consider any repo configuration values (such as insteadof url\n substitutions).

\n", "group": "remote" }, "git_remote_lookup": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 107, "lineto": 107, "args": [ @@ -16225,7 +17000,7 @@ "comment": " 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code" }, "description": "

Get the information for a particular remote

\n", - "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

The name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", "group": "remote", "examples": { "network/fetch.c": [ @@ -16241,7 +17016,7 @@ }, "git_remote_dup": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 119, "lineto": 119, "args": [ @@ -16268,7 +17043,7 @@ }, "git_remote_owner": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 127, "lineto": 127, "args": [ @@ -16290,7 +17065,7 @@ }, "git_remote_name": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 135, "lineto": 135, "args": [ @@ -16312,7 +17087,7 @@ }, "git_remote_url": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 146, "lineto": 146, "args": [ @@ -16329,7 +17104,7 @@ "comment": " a pointer to the url" }, "description": "

Get the remote's url

\n", - "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL.

\n", + "comments": "

If url.*.insteadOf has been configured for this URL, it will\n return the modified URL.

\n", "group": "remote", "examples": { "remote.c": [ @@ -16339,7 +17114,7 @@ }, "git_remote_pushurl": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 157, "lineto": 157, "args": [ @@ -16356,7 +17131,7 @@ "comment": " a pointer to the url or NULL if no special url for pushing is set" }, "description": "

Get the remote's url for pushing

\n", - "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL.

\n", + "comments": "

If url.*.pushInsteadOf has been configured for this URL, it\n will return the modified URL.

\n", "group": "remote", "examples": { "remote.c": [ @@ -16366,7 +17141,7 @@ }, "git_remote_set_url": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 170, "lineto": 170, "args": [ @@ -16393,7 +17168,7 @@ "comment": " 0 or an error value" }, "description": "

Set the remote's url in the configuration

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes\n the common case of a single-url remote and will otherwise return an error.

\n", "group": "remote", "examples": { "remote.c": [ @@ -16403,7 +17178,7 @@ }, "git_remote_set_pushurl": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 183, "lineto": 183, "args": [ @@ -16430,7 +17205,7 @@ "comment": null }, "description": "

Set the remote's url for pushing in the configuration.

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes\n the common case of a single-url remote and will otherwise return an error.

\n", "group": "remote", "examples": { "remote.c": [ @@ -16440,7 +17215,7 @@ }, "git_remote_add_fetch": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 196, "lineto": 196, "args": [ @@ -16467,12 +17242,12 @@ "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" }, "description": "

Add a fetch refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the fetch list in the configuration. No loaded remote instances will be affected.

\n", + "comments": "

Add the given refspec to the fetch list in the configuration. No\n loaded remote instances will be affected.

\n", "group": "remote" }, "git_remote_get_fetch_refspecs": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 207, "lineto": 207, "args": [ @@ -16494,12 +17269,12 @@ "comment": null }, "description": "

Get the remote's list of fetch refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "comments": "

The memory is owned by the user and should be freed with\n git_strarray_free.

\n", "group": "remote" }, "git_remote_add_push": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 220, "lineto": 220, "args": [ @@ -16526,12 +17301,12 @@ "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" }, "description": "

Add a push refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the push list in the configuration. No loaded remote instances will be affected.

\n", + "comments": "

Add the given refspec to the push list in the configuration. No\n loaded remote instances will be affected.

\n", "group": "remote" }, "git_remote_get_push_refspecs": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 231, "lineto": 231, "args": [ @@ -16553,12 +17328,12 @@ "comment": null }, "description": "

Get the remote's list of push refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "comments": "

The memory is owned by the user and should be freed with\n git_strarray_free.

\n", "group": "remote" }, "git_remote_refspec_count": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 239, "lineto": 239, "args": [ @@ -16580,7 +17355,7 @@ }, "git_remote_get_refspec": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 248, "lineto": 248, "args": [ @@ -16607,7 +17382,7 @@ }, "git_remote_connect": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 265, "lineto": 265, "args": [ @@ -16644,7 +17419,7 @@ "comment": " 0 or an error code" }, "description": "

Open a connection to a remote

\n", - "comments": "

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.

\n", + "comments": "

The transport is selected based on the URL. The direction argument\n is due to a limitation of the git protocol (over TCP or SSH) which\n starts up a specific binary which can only do the one or the other.

\n", "group": "remote", "examples": { "network/ls-remote.c": [ @@ -16654,7 +17429,7 @@ }, "git_remote_ls": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 287, "lineto": 287, "args": [ @@ -16681,7 +17456,7 @@ "comment": " 0 on success, or an error code" }, "description": "

Get the remote repository's reference advertisement list

\n", - "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", + "comments": "

Get the list of references with which the server responds to a new\n connection.

\n\n

The remote (or more exactly its transport) must have connected to\n the remote repository. This list is available as soon as the\n connection to the remote is initiated and it remains available\n after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long\n as a new connection is not initiated, but it is recommended that\n you make a copy in order to make use of the data.

\n", "group": "remote", "examples": { "network/ls-remote.c": [ @@ -16691,7 +17466,7 @@ }, "git_remote_connected": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 298, "lineto": 298, "args": [ @@ -16708,12 +17483,12 @@ "comment": " 1 if it's connected, 0 otherwise." }, "description": "

Check whether the remote is connected

\n", - "comments": "

Check whether the remote's underlying transport is connected to the remote host.

\n", + "comments": "

Check whether the remote's underlying transport is connected to the\n remote host.

\n", "group": "remote" }, "git_remote_stop": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 308, "lineto": 308, "args": [ @@ -16730,12 +17505,12 @@ "comment": null }, "description": "

Cancel the operation

\n", - "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", + "comments": "

At certain points in its operation, the network code checks whether\n the operation has been cancelled and if so stops the operation.

\n", "group": "remote" }, "git_remote_disconnect": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 317, "lineto": 317, "args": [ @@ -16757,7 +17532,7 @@ }, "git_remote_free": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 327, "lineto": 327, "args": [ @@ -16774,7 +17549,7 @@ "comment": null }, "description": "

Free the memory associated with a remote

\n", - "comments": "

This also disconnects from the remote, if the connection has not been closed yet (using git_remote_disconnect).

\n", + "comments": "

This also disconnects from the remote, if the connection\n has not been closed yet (using git_remote_disconnect).

\n", "group": "remote", "examples": { "network/fetch.c": [ @@ -16791,7 +17566,7 @@ }, "git_remote_list": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 338, "lineto": 338, "args": [ @@ -16823,7 +17598,7 @@ }, "git_remote_init_callbacks": { "type": "function", - "file": "remote.h", + "file": "git2/remote.h", "line": 503, "lineto": 505, "args": [ @@ -16850,19 +17625,19 @@ }, "git_fetch_init_options": { "type": "function", - "file": "remote.h", - "line": 607, - "lineto": 609, + "file": "git2/remote.h", + "line": 608, + "lineto": 610, "args": [ { "name": "opts", "type": "git_fetch_options *", - "comment": "the `git_fetch_options` instance to initialize." + "comment": "The `git_fetch_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_FETCH_OPTIONS_VERSION` here." + "comment": "The struct version; pass `GIT_FETCH_OPTIONS_VERSION`." } ], "argline": "git_fetch_options *opts, unsigned int version", @@ -16871,25 +17646,25 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_fetch_options with default values. Equivalent to\n creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_fetch_options structure

\n", + "comments": "

Initializes a git_fetch_options with default values. Equivalent to\n creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", "group": "fetch" }, "git_push_init_options": { "type": "function", - "file": "remote.h", - "line": 656, - "lineto": 658, + "file": "git2/remote.h", + "line": 658, + "lineto": 660, "args": [ { "name": "opts", "type": "git_push_options *", - "comment": "the `git_push_options` instance to initialize." + "comment": "The `git_push_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_PUSH_OPTIONS_VERSION` here." + "comment": "The struct version; pass `GIT_PUSH_OPTIONS_VERSION`." } ], "argline": "git_push_options *opts, unsigned int version", @@ -16898,15 +17673,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_push_options with default values. Equivalent to\n creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_push_options structure

\n", + "comments": "

Initializes a git_push_options with default values. Equivalent to\n creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", "group": "push" }, "git_remote_download": { "type": "function", - "file": "remote.h", - "line": 676, - "lineto": 676, + "file": "git2/remote.h", + "line": 678, + "lineto": 678, "args": [ { "name": "remote", @@ -16931,14 +17706,14 @@ "comment": " 0 or an error code" }, "description": "

Download and index the packfile

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, download and index the packfile.

\n\n

The .idx file will be created and both it and the packfile with be renamed to their final name.

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with\n the remote git which objects are missing, download and index the\n packfile.

\n\n

The .idx file will be created and both it and the packfile with be\n renamed to their final name.

\n", "group": "remote" }, "git_remote_upload": { "type": "function", - "file": "remote.h", - "line": 690, - "lineto": 690, + "file": "git2/remote.h", + "line": 692, + "lineto": 692, "args": [ { "name": "remote", @@ -16963,14 +17738,14 @@ "comment": " 0 or an error code" }, "description": "

Create a packfile and send it to the server

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, create a packfile with the missing objects and send it.

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with\n the remote git which objects are missing, create a packfile with the missing objects and send it.

\n", "group": "remote" }, "git_remote_update_tips": { "type": "function", - "file": "remote.h", - "line": 706, - "lineto": 711, + "file": "git2/remote.h", + "line": 708, + "lineto": 713, "args": [ { "name": "remote", @@ -17010,9 +17785,9 @@ }, "git_remote_fetch": { "type": "function", - "file": "remote.h", - "line": 727, - "lineto": 731, + "file": "git2/remote.h", + "line": 729, + "lineto": 733, "args": [ { "name": "remote", @@ -17042,7 +17817,7 @@ "comment": " 0 or an error code" }, "description": "

Download new data and update tips

\n", - "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n", + "comments": "

Convenience function to connect to a remote, download the data,\n disconnect and update the remote-tracking branches.

\n", "group": "remote", "examples": { "network/fetch.c": [ @@ -17052,9 +17827,9 @@ }, "git_remote_prune": { "type": "function", - "file": "remote.h", - "line": 740, - "lineto": 740, + "file": "git2/remote.h", + "line": 742, + "lineto": 742, "args": [ { "name": "remote", @@ -17079,9 +17854,9 @@ }, "git_remote_push": { "type": "function", - "file": "remote.h", - "line": 752, - "lineto": 754, + "file": "git2/remote.h", + "line": 754, + "lineto": 756, "args": [ { "name": "remote", @@ -17111,9 +17886,9 @@ }, "git_remote_stats": { "type": "function", - "file": "remote.h", - "line": 759, - "lineto": 759, + "file": "git2/remote.h", + "line": 761, + "lineto": 761, "args": [ { "name": "remote", @@ -17138,9 +17913,9 @@ }, "git_remote_autotag": { "type": "function", - "file": "remote.h", - "line": 767, - "lineto": 767, + "file": "git2/remote.h", + "line": 769, + "lineto": 769, "args": [ { "name": "remote", @@ -17160,9 +17935,9 @@ }, "git_remote_set_autotag": { "type": "function", - "file": "remote.h", - "line": 779, - "lineto": 779, + "file": "git2/remote.h", + "line": 781, + "lineto": 781, "args": [ { "name": "repo", @@ -17187,14 +17962,14 @@ "comment": null }, "description": "

Set the remote's tag following setting.

\n", - "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", + "comments": "

The change will be made in the configuration. No loaded remotes\n will be affected.

\n", "group": "remote" }, "git_remote_prune_refs": { "type": "function", - "file": "remote.h", - "line": 786, - "lineto": 786, + "file": "git2/remote.h", + "line": 788, + "lineto": 788, "args": [ { "name": "remote", @@ -17214,9 +17989,9 @@ }, "git_remote_rename": { "type": "function", - "file": "remote.h", - "line": 808, - "lineto": 812, + "file": "git2/remote.h", + "line": 810, + "lineto": 814, "args": [ { "name": "problems", @@ -17246,7 +18021,7 @@ "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" }, "description": "

Give the remote a new name

\n", - "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", + "comments": "

All remote-tracking branches and configuration settings\n for the remote are updated.

\n\n

The new name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change\n their name or their list of refspecs.

\n", "group": "remote", "examples": { "remote.c": [ @@ -17256,9 +18031,9 @@ }, "git_remote_is_valid_name": { "type": "function", - "file": "remote.h", - "line": 820, - "lineto": 820, + "file": "git2/remote.h", + "line": 822, + "lineto": 822, "args": [ { "name": "remote_name", @@ -17278,9 +18053,9 @@ }, "git_remote_delete": { "type": "function", - "file": "remote.h", - "line": 832, - "lineto": 832, + "file": "git2/remote.h", + "line": 834, + "lineto": 834, "args": [ { "name": "repo", @@ -17300,7 +18075,7 @@ "comment": " 0 on success, or an error code." }, "description": "

Delete an existing persisted remote.

\n", - "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", + "comments": "

All remote-tracking branches and configuration settings\n for the remote will be removed.

\n", "group": "remote", "examples": { "remote.c": [ @@ -17310,9 +18085,9 @@ }, "git_remote_default_branch": { "type": "function", - "file": "remote.h", - "line": 850, - "lineto": 850, + "file": "git2/remote.h", + "line": 852, + "lineto": 852, "args": [ { "name": "out", @@ -17332,12 +18107,12 @@ "comment": " 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message." }, "description": "

Retrieve the name of the remote's default branch

\n", - "comments": "

The default branch of a repository is the branch which HEAD points to. If the remote does not support reporting this information directly, it performs the guess as git does; that is, if there are multiple branches which point to the same commit, the first one is chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", + "comments": "

The default branch of a repository is the branch which HEAD points\n to. If the remote does not support reporting this information\n directly, it performs the guess as git does; that is, if there are\n multiple branches which point to the same commit, the first one is\n chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", "group": "remote" }, "git_repository_open": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 37, "lineto": 37, "args": [ @@ -17359,7 +18134,7 @@ "comment": " 0 or an error code" }, "description": "

Open a git repository.

\n", - "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n", + "comments": "

The 'path' argument must point to either a git repository\n folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal\n or bare repository or fail is 'path' is neither.

\n", "group": "repository", "examples": { "general.c": [ @@ -17372,7 +18147,7 @@ }, "git_repository_open_from_worktree": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 48, "lineto": 48, "args": [ @@ -17394,12 +18169,12 @@ "comment": " 0 or an error code" }, "description": "

Open working tree as a repository

\n", - "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", + "comments": "

Open the working directory of the working tree as a normal\n repository that can then be worked on.

\n", "group": "repository" }, "git_repository_wrap_odb": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 61, "lineto": 61, "args": [ @@ -17421,12 +18196,12 @@ "comment": " 0 or an error code" }, "description": "

Create a "fake" repository to wrap an object database

\n", - "comments": "

Create a repository object to wrap an object database to be used with the API when all you have is an object database. This doesn't have any paths associated with it, so use with care.

\n", + "comments": "

Create a repository object to wrap an object database to be used\n with the API when all you have is an object database. This doesn't\n have any paths associated with it, so use with care.

\n", "group": "repository" }, "git_repository_discover": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 89, "lineto": 93, "args": [ @@ -17458,7 +18233,7 @@ "comment": " 0 or an error code" }, "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", - "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n", + "comments": "

The method will automatically detect if the repository is bare\n (if there is a repository).

\n", "group": "repository", "examples": { "remote.c": [ @@ -17468,7 +18243,7 @@ }, "git_repository_open_ext": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 152, "lineto": 156, "args": [ @@ -17509,8 +18284,11 @@ "cat-file.c": [ "ex/HEAD/cat-file.html#git_repository_open_ext-31" ], + "checkout.c": [ + "ex/HEAD/checkout.html#git_repository_open_ext-14" + ], "describe.c": [ - "ex/HEAD/describe.html#git_repository_open_ext-6" + "ex/HEAD/describe.html#git_repository_open_ext-8" ], "diff.c": [ "ex/HEAD/diff.html#git_repository_open_ext-15" @@ -17519,8 +18297,11 @@ "ex/HEAD/log.html#git_repository_open_ext-45", "ex/HEAD/log.html#git_repository_open_ext-46" ], + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_repository_open_ext-7" + ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_open_ext-38" + "ex/HEAD/merge.html#git_repository_open_ext-33" ], "rev-parse.c": [ "ex/HEAD/rev-parse.html#git_repository_open_ext-16" @@ -17535,7 +18316,7 @@ }, "git_repository_open_bare": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 169, "lineto": 169, "args": [ @@ -17557,12 +18338,12 @@ "comment": " 0 on success, or an error code" }, "description": "

Open a bare repository on the serverside.

\n", - "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n", + "comments": "

This is a fast open for bare repositories that will come in handy\n if you're e.g. hosting git repositories and need to access them\n efficiently

\n", "group": "repository" }, "git_repository_free": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 182, "lineto": 182, "args": [ @@ -17579,7 +18360,7 @@ "comment": null }, "description": "

Free a previously allocated repository

\n", - "comments": "

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_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", + "comments": "

Note that after a repository is free'd, all the objects it has spawned\n will still exist until they are manually closed by the user\n with git_object_free, but accessing any of the attributes of\n an object without a backing repository will result in undefined\n behavior

\n", "group": "repository", "examples": { "blame.c": [ @@ -17588,8 +18369,11 @@ "cat-file.c": [ "ex/HEAD/cat-file.html#git_repository_free-32" ], + "checkout.c": [ + "ex/HEAD/checkout.html#git_repository_free-15" + ], "describe.c": [ - "ex/HEAD/describe.html#git_repository_free-7" + "ex/HEAD/describe.html#git_repository_free-9" ], "diff.c": [ "ex/HEAD/diff.html#git_repository_free-16" @@ -17603,11 +18387,11 @@ "log.c": [ "ex/HEAD/log.html#git_repository_free-47" ], - "merge.c": [ - "ex/HEAD/merge.html#git_repository_free-39" + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_repository_free-8" ], - "network/clone.c": [ - "ex/HEAD/network/clone.html#git_repository_free-3" + "merge.c": [ + "ex/HEAD/merge.html#git_repository_free-34" ], "rev-parse.c": [ "ex/HEAD/rev-parse.html#git_repository_free-17" @@ -17622,7 +18406,7 @@ }, "git_repository_init": { "type": "function", - "file": "repository.h", + "file": "git2/repository.h", "line": 199, "lineto": 202, "args": [ @@ -17649,7 +18433,7 @@ "comment": " 0 or an error code" }, "description": "

Creates a new Git repository in the given folder.

\n", - "comments": "

TODO: - Reinit the repository

\n", + "comments": "

TODO:\n - Reinit the repository

\n", "group": "repository", "examples": { "init.c": [ @@ -17659,19 +18443,19 @@ }, "git_repository_init_init_options": { "type": "function", - "file": "repository.h", - "line": 311, - "lineto": 313, + "file": "git2/repository.h", + "line": 313, + "lineto": 315, "args": [ { "name": "opts", "type": "git_repository_init_options *", - "comment": "the `git_repository_init_options` struct to initialize" + "comment": "The `git_repository_init_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`." } ], "argline": "git_repository_init_options *opts, unsigned int version", @@ -17680,15 +18464,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_repository_init_options with default values. Equivalent\n to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_repository_init_options structure

\n", + "comments": "

Initializes a git_repository_init_options with default values. Equivalent to\n creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", "group": "repository" }, "git_repository_init_ext": { "type": "function", - "file": "repository.h", - "line": 328, - "lineto": 331, + "file": "git2/repository.h", + "line": 330, + "lineto": 333, "args": [ { "name": "out", @@ -17713,7 +18497,7 @@ "comment": " 0 or an error code on failure." }, "description": "

Create a new Git repository in the given folder with extended controls.

\n", - "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n", + "comments": "

This will initialize a new git repository (creating the repo_path\n if requested by flags) and working directory as needed. It will\n auto-detect the case sensitivity of the file system and if the\n file system supports file mode bits correctly.

\n", "group": "repository", "examples": { "init.c": [ @@ -17723,9 +18507,9 @@ }, "git_repository_head": { "type": "function", - "file": "repository.h", - "line": 346, - "lineto": 346, + "file": "git2/repository.h", + "line": 348, + "lineto": 348, "args": [ { "name": "out", @@ -17745,12 +18529,12 @@ "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise" }, "description": "

Retrieve and resolve the reference pointed at by HEAD.

\n", - "comments": "

The returned git_reference will be owned by caller and git_reference_free() must be called when done with it to release the allocated memory and prevent a leak.

\n", + "comments": "

The returned git_reference will be owned by caller and\n git_reference_free() must be called when done with it to release the\n allocated memory and prevent a leak.

\n", "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_head-40", - "ex/HEAD/merge.html#git_repository_head-41" + "ex/HEAD/merge.html#git_repository_head-35", + "ex/HEAD/merge.html#git_repository_head-36" ], "status.c": [ "ex/HEAD/status.html#git_repository_head-7" @@ -17759,9 +18543,9 @@ }, "git_repository_head_for_worktree": { "type": "function", - "file": "repository.h", - "line": 356, - "lineto": 357, + "file": "git2/repository.h", + "line": 358, + "lineto": 359, "args": [ { "name": "out", @@ -17791,9 +18575,9 @@ }, "git_repository_head_detached": { "type": "function", - "file": "repository.h", - "line": 369, - "lineto": 369, + "file": "git2/repository.h", + "line": 371, + "lineto": 371, "args": [ { "name": "repo", @@ -17808,14 +18592,41 @@ "comment": " 1 if HEAD is detached, 0 if it's not; error code if there\n was an error." }, "description": "

Check if a repository's HEAD is detached

\n", - "comments": "

A repository's HEAD is detached when it points directly to a commit instead of a branch.

\n", + "comments": "

A repository's HEAD is detached when it points directly to a commit\n instead of a branch.

\n", + "group": "repository" + }, + "git_repository_head_detached_for_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 384, + "lineto": 385, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the worktree to retrieve HEAD for" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 1 if HEAD is detached, 0 if its not; error code if\n there was an error" + }, + "description": "

Check if a worktree's HEAD is detached

\n", + "comments": "

A worktree's HEAD is detached when it points directly to a\n commit instead of a branch.

\n", "group": "repository" }, "git_repository_head_unborn": { "type": "function", - "file": "repository.h", - "line": 395, - "lineto": 395, + "file": "git2/repository.h", + "line": 397, + "lineto": 397, "args": [ { "name": "repo", @@ -17830,14 +18641,14 @@ "comment": " 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error" }, "description": "

Check if the current branch is unborn

\n", - "comments": "

An unborn 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.

\n", + "comments": "

An unborn branch is one named from HEAD but which doesn't exist in\n the refs namespace, because it doesn't have any commit to point to.

\n", "group": "repository" }, "git_repository_is_empty": { "type": "function", - "file": "repository.h", - "line": 407, - "lineto": 407, + "file": "git2/repository.h", + "line": 409, + "lineto": 409, "args": [ { "name": "repo", @@ -17852,14 +18663,14 @@ "comment": " 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted" }, "description": "

Check if a repository is empty

\n", - "comments": "

An empty repository has just been initialized and contains no references apart from HEAD, which must be pointing to the unborn master branch.

\n", + "comments": "

An empty repository has just been initialized and contains no references\n apart from HEAD, which must be pointing to the unborn master branch.

\n", "group": "repository" }, "git_repository_item_path": { "type": "function", - "file": "repository.h", - "line": 443, - "lineto": 443, + "file": "git2/repository.h", + "line": 445, + "lineto": 445, "args": [ { "name": "out", @@ -17884,14 +18695,14 @@ "comment": " 0, GIT_ENOTFOUND if the path cannot exist or an error code" }, "description": "

Get the location of a specific repository file or directory

\n", - "comments": "

This function will retrieve the path of a specific repository item. It will thereby honor things like the repository's common directory, gitdir, etc. In case a file path cannot exist for a given item (e.g. the working directory of a bare repository), GIT_ENOTFOUND is returned.

\n", + "comments": "

This function will retrieve the path of a specific repository\n item. It will thereby honor things like the repository's\n common directory, gitdir, etc. In case a file path cannot\n exist for a given item (e.g. the working directory of a bare\n repository), GIT_ENOTFOUND is returned.

\n", "group": "repository" }, "git_repository_path": { "type": "function", - "file": "repository.h", - "line": 454, - "lineto": 454, + "file": "git2/repository.h", + "line": 456, + "lineto": 456, "args": [ { "name": "repo", @@ -17906,7 +18717,7 @@ "comment": " the path to the repository" }, "description": "

Get the path of this repository

\n", - "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", + "comments": "

This is the path of the .git folder for normal repositories,\n or of the repository itself for bare repositories.

\n", "group": "repository", "examples": { "init.c": [ @@ -17919,9 +18730,9 @@ }, "git_repository_workdir": { "type": "function", - "file": "repository.h", - "line": 465, - "lineto": 465, + "file": "git2/repository.h", + "line": 467, + "lineto": 467, "args": [ { "name": "repo", @@ -17936,7 +18747,7 @@ "comment": " the path to the working dir, if it exists" }, "description": "

Get the path of the working directory for this repository

\n", - "comments": "

If the repository is bare, this function will always return NULL.

\n", + "comments": "

If the repository is bare, this function will always return\n NULL.

\n", "group": "repository", "examples": { "init.c": [ @@ -17946,9 +18757,9 @@ }, "git_repository_commondir": { "type": "function", - "file": "repository.h", - "line": 476, - "lineto": 476, + "file": "git2/repository.h", + "line": 478, + "lineto": 478, "args": [ { "name": "repo", @@ -17963,14 +18774,14 @@ "comment": " the path to the common dir" }, "description": "

Get the path of the shared common directory for this repository

\n", - "comments": "

If the repository is bare is not a worktree, the git directory path is returned.

\n", + "comments": "

If the repository is bare is not a worktree, the git directory\n path is returned.

\n", "group": "repository" }, "git_repository_set_workdir": { "type": "function", - "file": "repository.h", - "line": 495, - "lineto": 496, + "file": "git2/repository.h", + "line": 497, + "lineto": 498, "args": [ { "name": "repo", @@ -17995,14 +18806,14 @@ "comment": " 0, or an error code" }, "description": "

Set the path to the working directory for this repository

\n", - "comments": "

The working directory doesn't need to be the same one that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory will turn it into a normal repository, capable of performing all the common workdir operations (checkout, status, index manipulation, etc).

\n", + "comments": "

The working directory doesn't need to be the same one\n that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory\n will turn it into a normal repository, capable of performing\n all the common workdir operations (checkout, status, index\n manipulation, etc).

\n", "group": "repository" }, "git_repository_is_bare": { "type": "function", - "file": "repository.h", - "line": 504, - "lineto": 504, + "file": "git2/repository.h", + "line": 506, + "lineto": 506, "args": [ { "name": "repo", @@ -18027,9 +18838,9 @@ }, "git_repository_is_worktree": { "type": "function", - "file": "repository.h", - "line": 512, - "lineto": 512, + "file": "git2/repository.h", + "line": 514, + "lineto": 514, "args": [ { "name": "repo", @@ -18049,9 +18860,9 @@ }, "git_repository_config": { "type": "function", - "file": "repository.h", - "line": 528, - "lineto": 528, + "file": "git2/repository.h", + "line": 530, + "lineto": 530, "args": [ { "name": "out", @@ -18071,14 +18882,14 @@ "comment": " 0, or an error code" }, "description": "

Get the configuration file for this repository.

\n", - "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "comments": "

If a configuration file has not been set, the default\n config set for the repository will be returned, including\n global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer\n being used by the user.

\n", "group": "repository" }, "git_repository_config_snapshot": { "type": "function", - "file": "repository.h", - "line": 544, - "lineto": 544, + "file": "git2/repository.h", + "line": 546, + "lineto": 546, "args": [ { "name": "out", @@ -18098,7 +18909,7 @@ "comment": " 0, or an error code" }, "description": "

Get a snapshot of the repository's configuration

\n", - "comments": "

Convenience function to take a snapshot from the repository's configuration. The contents of this snapshot will not change, even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "comments": "

Convenience function to take a snapshot from the repository's\n configuration. The contents of this snapshot will not change,\n even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer\n being used by the user.

\n", "group": "repository", "examples": { "general.c": [ @@ -18109,9 +18920,9 @@ }, "git_repository_odb": { "type": "function", - "file": "repository.h", - "line": 560, - "lineto": 560, + "file": "git2/repository.h", + "line": 562, + "lineto": 562, "args": [ { "name": "out", @@ -18131,7 +18942,7 @@ "comment": " 0, or an error code" }, "description": "

Get the Object Database for this repository.

\n", - "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", + "comments": "

If a custom ODB has not been set, the default\n database for the repository will be returned (the one\n located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by\n the user.

\n", "group": "repository", "examples": { "cat-file.c": [ @@ -18144,9 +18955,9 @@ }, "git_repository_refdb": { "type": "function", - "file": "repository.h", - "line": 576, - "lineto": 576, + "file": "git2/repository.h", + "line": 578, + "lineto": 578, "args": [ { "name": "out", @@ -18166,14 +18977,14 @@ "comment": " 0, or an error code" }, "description": "

Get the Reference Database Backend for this repository.

\n", - "comments": "

If a custom refsdb has not been set, the default database for the repository will be returned (the one that manipulates loose and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by the user.

\n", + "comments": "

If a custom refsdb has not been set, the default database for\n the repository will be returned (the one that manipulates loose\n and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by\n the user.

\n", "group": "repository" }, "git_repository_index": { "type": "function", - "file": "repository.h", - "line": 592, - "lineto": 592, + "file": "git2/repository.h", + "line": 594, + "lineto": 594, "args": [ { "name": "out", @@ -18193,7 +19004,7 @@ "comment": " 0, or an error code" }, "description": "

Get the Index file for this repository.

\n", - "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", + "comments": "

If a custom index has not been set, the default\n index for the repository will be returned (the one\n located in .git/index).

\n\n

The index must be freed once it's no longer being used by\n the user.

\n", "group": "repository", "examples": { "general.c": [ @@ -18202,16 +19013,19 @@ "init.c": [ "ex/HEAD/init.html#git_repository_index-11" ], + "ls-files.c": [ + "ex/HEAD/ls-files.html#git_repository_index-9" + ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_index-42" + "ex/HEAD/merge.html#git_repository_index-37" ] } }, "git_repository_message": { "type": "function", - "file": "repository.h", - "line": 610, - "lineto": 610, + "file": "git2/repository.h", + "line": 612, + "lineto": 612, "args": [ { "name": "out", @@ -18231,14 +19045,14 @@ "comment": " 0, GIT_ENOTFOUND if no message exists or an error code" }, "description": "

Retrieve git's prepared message

\n", - "comments": "

Operations such as git revert/cherry-pick/merge with the -n option stop just short of creating a commit with the changes and save their prepared message in .git/MERGE_MSG so the next git-commit execution can present it to the user for them to amend if they wish.

\n\n

Use this function to get the contents of this file. Don't forget to remove the file after you create the commit.

\n", + "comments": "

Operations such as git revert/cherry-pick/merge with the -n option\n stop just short of creating a commit with the changes and save\n their prepared message in .git/MERGE_MSG so the next git-commit\n execution can present it to the user for them to amend if they\n wish.

\n\n

Use this function to get the contents of this file. Don't forget to\n remove the file after you create the commit.

\n", "group": "repository" }, "git_repository_message_remove": { "type": "function", - "file": "repository.h", - "line": 617, - "lineto": 617, + "file": "git2/repository.h", + "line": 619, + "lineto": 619, "args": [ { "name": "repo", @@ -18258,9 +19072,9 @@ }, "git_repository_state_cleanup": { "type": "function", - "file": "repository.h", - "line": 626, - "lineto": 626, + "file": "git2/repository.h", + "line": 628, + "lineto": 628, "args": [ { "name": "repo", @@ -18279,15 +19093,15 @@ "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_state_cleanup-43" + "ex/HEAD/merge.html#git_repository_state_cleanup-38" ] } }, "git_repository_fetchhead_foreach": { "type": "function", - "file": "repository.h", - "line": 645, - "lineto": 648, + "file": "git2/repository.h", + "line": 647, + "lineto": 650, "args": [ { "name": "repo", @@ -18317,9 +19131,9 @@ }, "git_repository_mergehead_foreach": { "type": "function", - "file": "repository.h", - "line": 665, - "lineto": 668, + "file": "git2/repository.h", + "line": 667, + "lineto": 670, "args": [ { "name": "repo", @@ -18349,9 +19163,9 @@ }, "git_repository_hashfile": { "type": "function", - "file": "repository.h", - "line": 693, - "lineto": 698, + "file": "git2/repository.h", + "line": 695, + "lineto": 700, "args": [ { "name": "out", @@ -18386,14 +19200,14 @@ "comment": " 0 on success, or an error code" }, "description": "

Calculate hash of file using repository filtering rules.

\n", - "comments": "

If you simply want to calculate the hash of a file on disk with no filters, you can just use the git_odb_hashfile() API. However, if you want to hash a file in the repository and you want to apply filtering rules (e.g. crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the filtering triggers that failure, then this function will return an error and not calculate the hash of the file.

\n", + "comments": "

If you simply want to calculate the hash of a file on disk with no filters,\n you can just use the git_odb_hashfile() API. However, if you want to\n hash a file in the repository and you want to apply filtering rules (e.g.\n crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the\n filtering triggers that failure, then this function will return an\n error and not calculate the hash of the file.

\n", "group": "repository" }, "git_repository_set_head": { "type": "function", - "file": "repository.h", - "line": 718, - "lineto": 720, + "file": "git2/repository.h", + "line": 720, + "lineto": 722, "args": [ { "name": "repo", @@ -18413,14 +19227,19 @@ "comment": " 0 on success, or an error code" }, "description": "

Make the repository HEAD point to the specified reference.

\n", - "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", - "group": "repository" + "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is\n unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point\n to that branch, staying attached, or become attached if it isn't yet.\n If the branch doesn't exist yet, no error will be return. The HEAD\n will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to\n the Commit.

\n", + "group": "repository", + "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_repository_set_head-16" + ] + } }, "git_repository_set_head_detached": { "type": "function", - "file": "repository.h", - "line": 738, - "lineto": 740, + "file": "git2/repository.h", + "line": 740, + "lineto": 742, "args": [ { "name": "repo", @@ -18440,14 +19259,14 @@ "comment": " 0 on success, or an error code" }, "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

If the provided committish cannot be found in the repository, the HEAD is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided commitish cannot be peeled into a commit, the HEAD is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to the peeled Commit.

\n", + "comments": "

If the provided committish cannot be found in the repository, the HEAD\n is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided commitish cannot be peeled into a commit, the HEAD\n is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to\n the peeled Commit.

\n", "group": "repository" }, "git_repository_set_head_detached_from_annotated": { "type": "function", - "file": "repository.h", - "line": 754, - "lineto": 756, + "file": "git2/repository.h", + "line": 756, + "lineto": 758, "args": [ { "name": "repo", @@ -18467,14 +19286,19 @@ "comment": null }, "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", - "group": "repository" + "comments": "

This behaves like git_repository_set_head_detached() but takes an\n annotated commit, which lets you specify which extended sha syntax\n string was specified by a user, allowing for more exact reflog\n messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", + "group": "repository", + "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-17" + ] + } }, "git_repository_detach_head": { "type": "function", - "file": "repository.h", - "line": 775, - "lineto": 776, + "file": "git2/repository.h", + "line": 777, + "lineto": 778, "args": [ { "name": "repo", @@ -18489,14 +19313,14 @@ "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code" }, "description": "

Detach the HEAD.

\n", - "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non commitish, the HEAD is unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", + "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is\n updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non commitish, the HEAD is\n unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", "group": "repository" }, "git_repository_state": { "type": "function", - "file": "repository.h", - "line": 806, - "lineto": 806, + "file": "git2/repository.h", + "line": 808, + "lineto": 808, "args": [ { "name": "repo", @@ -18514,16 +19338,19 @@ "comments": "", "group": "repository", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_repository_state-18" + ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_state-44" + "ex/HEAD/merge.html#git_repository_state-39" ] } }, "git_repository_set_namespace": { "type": "function", - "file": "repository.h", - "line": 820, - "lineto": 820, + "file": "git2/repository.h", + "line": 822, + "lineto": 822, "args": [ { "name": "repo", @@ -18543,14 +19370,14 @@ "comment": " 0 on success, -1 on error" }, "description": "

Sets the active namespace for this Git Repository

\n", - "comments": "

This namespace affects all reference operations for the repo. See man gitnamespaces

\n", + "comments": "

This namespace affects all reference operations for the repo.\n See man gitnamespaces

\n", "group": "repository" }, "git_repository_get_namespace": { "type": "function", - "file": "repository.h", - "line": 828, - "lineto": 828, + "file": "git2/repository.h", + "line": 830, + "lineto": 830, "args": [ { "name": "repo", @@ -18570,9 +19397,9 @@ }, "git_repository_is_shallow": { "type": "function", - "file": "repository.h", - "line": 837, - "lineto": 837, + "file": "git2/repository.h", + "line": 839, + "lineto": 839, "args": [ { "name": "repo", @@ -18592,9 +19419,9 @@ }, "git_repository_ident": { "type": "function", - "file": "repository.h", - "line": 849, - "lineto": 849, + "file": "git2/repository.h", + "line": 851, + "lineto": 851, "args": [ { "name": "name", @@ -18619,14 +19446,14 @@ "comment": null }, "description": "

Retrieve the configured identity to use for reflogs

\n", - "comments": "

The memory is owned by the repository and must not be freed by the user.

\n", + "comments": "

The memory is owned by the repository and must not be freed by the\n user.

\n", "group": "repository" }, "git_repository_set_ident": { "type": "function", - "file": "repository.h", - "line": 862, - "lineto": 862, + "file": "git2/repository.h", + "line": 864, + "lineto": 864, "args": [ { "name": "repo", @@ -18651,12 +19478,12 @@ "comment": null }, "description": "

Set the identity to be used for writing reflogs

\n", - "comments": "

If both are set, this name and email will be used to write to the reflog. Pass NULL to unset. When unset, the identity will be taken from the repository's configuration.

\n", + "comments": "

If both are set, this name and email will be used to write to the\n reflog. Pass NULL to unset. When unset, the identity will be taken\n from the repository's configuration.

\n", "group": "repository" }, "git_reset": { "type": "function", - "file": "reset.h", + "file": "git2/reset.h", "line": 62, "lineto": 66, "args": [ @@ -18688,12 +19515,12 @@ "comment": " 0 on success or an error code" }, "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be replaced with the content of the index. (Untracked and ignored files will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", + "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced\n with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be\n replaced with the content of the index. (Untracked and ignored files\n will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", "group": "reset" }, "git_reset_from_annotated": { "type": "function", - "file": "reset.h", + "file": "git2/reset.h", "line": 80, "lineto": 84, "args": [ @@ -18725,12 +19552,12 @@ "comment": null }, "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", + "comments": "

This behaves like git_reset() but takes an annotated commit,\n which lets you specify which extended sha syntax string was\n specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", "group": "reset" }, "git_reset_default": { "type": "function", - "file": "reset.h", + "file": "git2/reset.h", "line": 104, "lineto": 107, "args": [ @@ -18757,24 +19584,24 @@ "comment": " 0 on success or an error code \n<\n 0" }, "description": "

Updates some entries in the index from the target commit tree.

\n", - "comments": "

The scope of the updated entries is determined by the paths being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing entries in the index matching the provided pathspecs.

\n", + "comments": "

The scope of the updated entries is determined by the paths\n being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing\n entries in the index matching the provided pathspecs.

\n", "group": "reset" }, "git_revert_init_options": { "type": "function", - "file": "revert.h", - "line": 47, - "lineto": 49, + "file": "git2/revert.h", + "line": 49, + "lineto": 51, "args": [ { "name": "opts", "type": "git_revert_options *", - "comment": "the `git_revert_options` struct to initialize" + "comment": "The `git_revert_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_REVERT_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_REVERT_OPTIONS_VERSION`." } ], "argline": "git_revert_options *opts, unsigned int version", @@ -18783,15 +19610,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_revert_options with default values. Equivalent to\n creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_revert_options structure

\n", + "comments": "

Initializes a git_revert_options with default values. Equivalent to\n creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", "group": "revert" }, "git_revert_commit": { "type": "function", - "file": "revert.h", - "line": 65, - "lineto": 71, + "file": "git2/revert.h", + "line": 67, + "lineto": 73, "args": [ { "name": "out", @@ -18836,9 +19663,9 @@ }, "git_revert": { "type": "function", - "file": "revert.h", - "line": 81, - "lineto": 84, + "file": "git2/revert.h", + "line": 83, + "lineto": 86, "args": [ { "name": "repo", @@ -18868,7 +19695,7 @@ }, "git_revparse_single": { "type": "function", - "file": "revparse.h", + "file": "git2/revparse.h", "line": 37, "lineto": 38, "args": [ @@ -18895,7 +19722,7 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code" }, "description": "

Find a single object, as specified by a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", + "comments": "

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no\n longer needed.

\n", "group": "revparse", "examples": { "blame.c": [ @@ -18905,7 +19732,7 @@ "ex/HEAD/cat-file.html#git_revparse_single-34" ], "describe.c": [ - "ex/HEAD/describe.html#git_revparse_single-8" + "ex/HEAD/describe.html#git_revparse_single-10" ], "log.c": [ "ex/HEAD/log.html#git_revparse_single-48" @@ -18920,7 +19747,7 @@ }, "git_revparse_ext": { "type": "function", - "file": "revparse.h", + "file": "git2/revparse.h", "line": 61, "lineto": 65, "args": [ @@ -18952,12 +19779,12 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code" }, "description": "

Find a single object and intermediate reference by a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", + "comments": "

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n\n

In some cases (\n@\n{\n<\n-n>} or `\n<branchname

\n\n
\n

@\n{upstream}), the expression may\n point to an intermediate reference. When such expressions are being passed\n in,reference_out` will be valued as well.

\n
\n\n

The returned object should be released with git_object_free and the\n returned reference with git_reference_free when no longer needed.

\n", "group": "revparse" }, "git_revparse": { "type": "function", - "file": "revparse.h", + "file": "git2/revparse.h", "line": 105, "lineto": 108, "args": [ @@ -18984,7 +19811,7 @@ "comment": " 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code" }, "description": "

Parse a revision string for from, to, and intent.

\n", - "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "comments": "

See man gitrevisions or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n", "group": "revparse", "examples": { "blame.c": [ @@ -19001,7 +19828,7 @@ }, "git_revwalk_new": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 73, "lineto": 73, "args": [ @@ -19023,7 +19850,7 @@ "comment": " 0 or an error code" }, "description": "

Allocate a new revision walker to iterate through a repo.

\n", - "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

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.

\n", + "comments": "

This revision walker uses a custom memory pool and an internal\n commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be\n reused for different walks.

\n\n

This revision walker is not thread safe: it may only be\n used to walk a repository on a single thread; however,\n it is possible to have several revision walkers in\n several different threads walking the same repository.

\n", "group": "revwalk", "examples": { "general.c": [ @@ -19037,7 +19864,7 @@ }, "git_revwalk_reset": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 88, "lineto": 88, "args": [ @@ -19054,12 +19881,12 @@ "comment": null }, "description": "

Reset the revision walker for reuse.

\n", - "comments": "

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.

\n\n

The revision walk is automatically reset when a walk is over.

\n", + "comments": "

This will clear all the pushed and hidden commits, and\n leave the walker in a blank state (just like at\n creation) ready to receive new commit pushes and\n start a new walk.

\n\n

The revision walk is automatically reset when a walk\n is over.

\n", "group": "revwalk" }, "git_revwalk_push": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 107, "lineto": 107, "args": [ @@ -19081,7 +19908,7 @@ "comment": " 0 or an error code" }, "description": "

Add a new root for the traversal

\n", - "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", + "comments": "

The pushed commit will be marked as one of the roots from which to\n start the walk. This commit may not be walked if it or a child is\n hidden.

\n\n

At least one commit must be pushed onto the walker before a walk\n can be started.

\n\n

The given id must belong to a committish on the walked\n repository.

\n", "group": "revwalk", "examples": { "general.c": [ @@ -19094,7 +19921,7 @@ }, "git_revwalk_push_glob": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 125, "lineto": 125, "args": [ @@ -19116,12 +19943,12 @@ "comment": " 0 or an error code" }, "description": "

Push matching references

\n", - "comments": "

The OIDs pointed to by the references that match the given glob pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "comments": "

The OIDs pointed to by the references that match the given glob\n pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing\n '/\n\\\n*' if the glob lacks '?', '\n\\\n*' or '['.

\n\n

Any references matching this glob which do not point to a\n committish will be ignored.

\n", "group": "revwalk" }, "git_revwalk_push_head": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 133, "lineto": 133, "args": [ @@ -19148,7 +19975,7 @@ }, "git_revwalk_hide": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 148, "lineto": 148, "args": [ @@ -19170,7 +19997,7 @@ "comment": " 0 or an error code" }, "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", - "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", + "comments": "

The given id must belong to a committish on the walked\n repository.

\n\n

The resolved commit and all its parents will be hidden from the\n output on the revision walk.

\n", "group": "revwalk", "examples": { "log.c": [ @@ -19180,7 +20007,7 @@ }, "git_revwalk_hide_glob": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 167, "lineto": 167, "args": [ @@ -19202,12 +20029,12 @@ "comment": " 0 or an error code" }, "description": "

Hide matching references.

\n", - "comments": "

The OIDs pointed to by the references that match the given glob pattern and their ancestors will be hidden from the output on the revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "comments": "

The OIDs pointed to by the references that match the given glob\n pattern and their ancestors will be hidden from the output on the\n revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing\n '/\n\\\n*' if the glob lacks '?', '\n\\\n*' or '['.

\n\n

Any references matching this glob which do not point to a\n committish will be ignored.

\n", "group": "revwalk" }, "git_revwalk_hide_head": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 175, "lineto": 175, "args": [ @@ -19229,7 +20056,7 @@ }, "git_revwalk_push_ref": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 186, "lineto": 186, "args": [ @@ -19256,7 +20083,7 @@ }, "git_revwalk_hide_ref": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 197, "lineto": 197, "args": [ @@ -19283,7 +20110,7 @@ }, "git_revwalk_next": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 217, "lineto": 217, "args": [ @@ -19305,7 +20132,7 @@ "comment": " 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate" }, "description": "

Get the next commit from the revision walk.

\n", - "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

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).

\n\n

The revision walker is reset when the walk is over.

\n", + "comments": "

The initial call to this method is not blocking when\n iterating through a repo with a time-sorting mode.

\n\n

Iterating with Topological or inverted modes makes the initial\n call blocking to preprocess the commit list, but this block should be\n mostly unnoticeable on most repositories (topological preprocessing\n times at 0.3s on the git.git repo).

\n\n

The revision walker is reset when the walk is over.

\n", "group": "revwalk", "examples": { "general.c": [ @@ -19318,7 +20145,7 @@ }, "git_revwalk_sorting": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 228, "lineto": 228, "args": [ @@ -19354,7 +20181,7 @@ }, "git_revwalk_push_range": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 243, "lineto": 243, "args": [ @@ -19376,12 +20203,12 @@ "comment": " 0 or an error code" }, "description": "

Push and hide the respective endpoints of the given range.

\n", - "comments": "

The range should be of the form .. where each is in the form accepted by 'git_revparse_single'. The left-hand commit will be hidden and the right-hand commit pushed.

\n", + "comments": "

The range should be of the form

\n\n

<commit

\n\n
\n

..\n<commit

\n\n

where each \n<commit\nis in the form accepted by 'git_revparse_single'.\n The left-hand commit will be hidden and the right-hand commit pushed.

\n
\n", "group": "revwalk" }, "git_revwalk_simplify_first_parent": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 250, "lineto": 250, "args": [ @@ -19403,7 +20230,7 @@ }, "git_revwalk_free": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 258, "lineto": 258, "args": [ @@ -19433,7 +20260,7 @@ }, "git_revwalk_repository": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 267, "lineto": 267, "args": [ @@ -19455,7 +20282,7 @@ }, "git_revwalk_add_hide_cb": { "type": "function", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 288, "lineto": 291, "args": [ @@ -19487,7 +20314,7 @@ }, "git_signature_new": { "type": "function", - "file": "signature.h", + "file": "git2/signature.h", "line": 37, "lineto": 37, "args": [ @@ -19524,7 +20351,7 @@ "comment": " 0 or an error code" }, "description": "

Create a new action signature.

\n", - "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('<' and '>') characters are not allowed to be used in either the name or the email parameter.

\n", + "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('\n<\n' and '>') characters are not allowed\n to be used in either the name or the email parameter.

\n", "group": "signature", "examples": { "general.c": [ @@ -19535,7 +20362,7 @@ }, "git_signature_now": { "type": "function", - "file": "signature.h", + "file": "git2/signature.h", "line": 49, "lineto": 49, "args": [ @@ -19566,13 +20393,13 @@ "group": "signature", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_signature_now-45" + "ex/HEAD/merge.html#git_signature_now-40" ] } }, "git_signature_default": { "type": "function", - "file": "signature.h", + "file": "git2/signature.h", "line": 63, "lineto": 63, "args": [ @@ -19594,7 +20421,7 @@ "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" }, "description": "

Create a new action signature with default user and now timestamp.

\n", - "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", + "comments": "

This looks up the user.name and user.email from the configuration and\n uses the current time as the timestamp, and creates a new signature\n based on that information. It will return GIT_ENOTFOUND if either the\n user.name or user.email are not set.

\n", "group": "signature", "examples": { "init.c": [ @@ -19607,7 +20434,7 @@ }, "git_signature_from_buffer": { "type": "function", - "file": "signature.h", + "file": "git2/signature.h", "line": 76, "lineto": 76, "args": [ @@ -19634,7 +20461,7 @@ }, "git_signature_dup": { "type": "function", - "file": "signature.h", + "file": "git2/signature.h", "line": 88, "lineto": 88, "args": [ @@ -19661,7 +20488,7 @@ }, "git_signature_free": { "type": "function", - "file": "signature.h", + "file": "git2/signature.h", "line": 99, "lineto": 99, "args": [ @@ -19678,7 +20505,7 @@ "comment": null }, "description": "

Free an existing signature.

\n", - "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", + "comments": "

Because the signature is not an opaque structure, it is legal to free it\n manually, but be sure to free the "name" and "email" strings in addition\n to the structure itself.

\n", "group": "signature", "examples": { "general.c": [ @@ -19693,21 +20520,63 @@ ] } }, + "git_stash_save": { + "type": "function", + "file": "git2/stash.h", + "line": 67, + "lineto": 72, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "stasher", + "type": "const git_signature *", + "comment": "The identity of the person performing the stashing." + }, + { + "name": "message", + "type": "const char *", + "comment": "Optional description along with the stashed state." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" + } + ], + "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", + "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash.

\n", + "comments": "", + "group": "stash" + }, "git_stash_apply_init_options": { "type": "function", - "file": "stash.h", - "line": 153, - "lineto": 154, + "file": "git2/stash.h", + "line": 156, + "lineto": 157, "args": [ { "name": "opts", "type": "git_stash_apply_options *", - "comment": "the `git_stash_apply_options` instance to initialize." + "comment": "The `git_stash_apply_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_STASH_APPLY_OPTIONS_INIT` here." + "comment": "The struct version; pass `GIT_STASH_APPLY_OPTIONS_VERSION`." } ], "argline": "git_stash_apply_options *opts, unsigned int version", @@ -19716,15 +20585,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_stash_apply_options with default values. Equivalent to\n creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_stash_apply_options structure

\n", + "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to\n creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", "group": "stash" }, "git_stash_apply": { "type": "function", - "file": "stash.h", - "line": 182, - "lineto": 185, + "file": "git2/stash.h", + "line": 185, + "lineto": 188, "args": [ { "name": "repo", @@ -19749,14 +20618,14 @@ "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" }, "description": "

Apply a single stashed state from the stash list.

\n", - "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", + "comments": "

If local changes in the working directory conflict with changes in the\n stash then GIT_EMERGECONFLICT will be returned. In this case, the index\n will always remain unmodified and all files in the working directory will\n remain unmodified. However, if you are restoring untracked files or\n ignored files and there is a conflict when applying the modified files,\n then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be\n conflicts when reinstating the index, the function will return\n GIT_EMERGECONFLICT and both the working directory and index will be left\n unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", "group": "stash" }, "git_stash_foreach": { "type": "function", - "file": "stash.h", - "line": 218, - "lineto": 221, + "file": "git2/stash.h", + "line": 221, + "lineto": 224, "args": [ { "name": "repo", @@ -19786,9 +20655,9 @@ }, "git_stash_drop": { "type": "function", - "file": "stash.h", - "line": 234, - "lineto": 236, + "file": "git2/stash.h", + "line": 237, + "lineto": 239, "args": [ { "name": "repo", @@ -19813,9 +20682,9 @@ }, "git_stash_pop": { "type": "function", - "file": "stash.h", - "line": 250, - "lineto": 253, + "file": "git2/stash.h", + "line": 253, + "lineto": 256, "args": [ { "name": "repo", @@ -19845,19 +20714,19 @@ }, "git_status_init_options": { "type": "function", - "file": "status.h", - "line": 199, - "lineto": 201, + "file": "git2/status.h", + "line": 203, + "lineto": 205, "args": [ { "name": "opts", "type": "git_status_options *", - "comment": "The `git_status_options` instance to initialize." + "comment": "The `git_status_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_STATUS_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." } ], "argline": "git_status_options *opts, unsigned int version", @@ -19866,15 +20735,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_status_options with default values. Equivalent to\n creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_status_options structure

\n", + "comments": "

Initializes a git_status_options with default values. Equivalent to\n creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", "group": "status" }, "git_status_foreach": { "type": "function", - "file": "status.h", - "line": 239, - "lineto": 242, + "file": "git2/status.h", + "line": 243, + "lineto": 246, "args": [ { "name": "repo", @@ -19899,7 +20768,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Gather file statuses and run a callback for each one.

\n", - "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", + "comments": "

The callback is passed the path of the file, the status (a combination of\n the git_status_t values above) and the payload data pointer passed\n into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping\n and return that value to caller.

\n", "group": "status", "examples": { "status.c": [ @@ -19909,9 +20778,9 @@ }, "git_status_foreach_ext": { "type": "function", - "file": "status.h", - "line": 263, - "lineto": 267, + "file": "git2/status.h", + "line": 267, + "lineto": 271, "args": [ { "name": "repo", @@ -19941,7 +20810,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Gather file status information and run callbacks as requested.

\n", - "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "comments": "

This is an extended version of the git_status_foreach() API that\n allows for more granular control over which paths will be processed and\n in what order. See the git_status_options structure for details\n about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter\n the status, then the results from rename detection (if you enable it) may\n not be accurate. To do rename detection properly, this must be called\n with no pathspec so that all files can be considered.

\n", "group": "status", "examples": { "status.c": [ @@ -19951,9 +20820,9 @@ }, "git_status_file": { "type": "function", - "file": "status.h", - "line": 295, - "lineto": 298, + "file": "git2/status.h", + "line": 299, + "lineto": 302, "args": [ { "name": "status_flags", @@ -19978,14 +20847,14 @@ "comment": " 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors." }, "description": "

Get file status for a single file.

\n", - "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", + "comments": "

This tries to get status for the filename that you give. If no files\n match that name (in either the HEAD, index, or working directory), this\n returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a\n directory or if running on a case- insensitive filesystem and yet the\n HEAD has two entries that both match the path), then this returns\n GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of\n targets and because of the path filtering, there is not enough\n information to check renames correctly. To check file status with rename\n detection, there is no choice but to do a full git_status_list_new and\n scan through looking for the path that you are interested in.

\n", "group": "status" }, "git_status_list_new": { "type": "function", - "file": "status.h", - "line": 313, - "lineto": 316, + "file": "git2/status.h", + "line": 317, + "lineto": 320, "args": [ { "name": "out", @@ -20010,7 +20879,7 @@ "comment": " 0 on success or error code" }, "description": "

Gather file status information and populate the git_status_list.

\n", - "comments": "

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "comments": "

Note that if a pathspec is given in the git_status_options to filter\n the status, then the results from rename detection (if you enable it) may\n not be accurate. To do rename detection properly, this must be called\n with no pathspec so that all files can be considered.

\n", "group": "status", "examples": { "status.c": [ @@ -20021,9 +20890,9 @@ }, "git_status_list_entrycount": { "type": "function", - "file": "status.h", - "line": 327, - "lineto": 328, + "file": "git2/status.h", + "line": 331, + "lineto": 332, "args": [ { "name": "statuslist", @@ -20038,7 +20907,7 @@ "comment": " the number of status entries" }, "description": "

Gets the count of status entries in this list.

\n", - "comments": "

If there are no changes in status (at least according the options given when the status list was created), this can return 0.

\n", + "comments": "

If there are no changes in status (at least according the options given\n when the status list was created), this can return 0.

\n", "group": "status", "examples": { "status.c": [ @@ -20049,9 +20918,9 @@ }, "git_status_byindex": { "type": "function", - "file": "status.h", - "line": 339, - "lineto": 341, + "file": "git2/status.h", + "line": 343, + "lineto": 345, "args": [ { "name": "statuslist", @@ -20086,9 +20955,9 @@ }, "git_status_list_free": { "type": "function", - "file": "status.h", - "line": 348, - "lineto": 349, + "file": "git2/status.h", + "line": 352, + "lineto": 353, "args": [ { "name": "statuslist", @@ -20113,9 +20982,9 @@ }, "git_status_should_ignore": { "type": "function", - "file": "status.h", - "line": 367, - "lineto": 370, + "file": "git2/status.h", + "line": 371, + "lineto": 374, "args": [ { "name": "ignored", @@ -20140,12 +21009,12 @@ "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." }, "description": "

Test if the ignore rules apply to a given file.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the\n given file. This indicates if the file would be ignored regardless of\n whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the\n directory containing the file, would it be added or not?

\n", "group": "status" }, "git_strarray_free": { "type": "function", - "file": "strarray.h", + "file": "git2/strarray.h", "line": 41, "lineto": 41, "args": [ @@ -20162,7 +21031,7 @@ "comment": null }, "description": "

Close a string array object

\n", - "comments": "

This method should be called on git_strarray objects where the strings array is allocated and contains allocated strings, such as what you would get from git_strarray_copy(). Not doing so, will result in a memory leak.

\n\n

This does not free the git_strarray itself, since the library will never allocate that object directly itself (it is more commonly embedded inside another struct or created on the stack).

\n", + "comments": "

This method should be called on git_strarray objects where the strings\n array is allocated and contains allocated strings, such as what you\n would get from git_strarray_copy(). Not doing so, will result in a\n memory leak.

\n\n

This does not free the git_strarray itself, since the library will\n never allocate that object directly itself (it is more commonly embedded\n inside another struct or created on the stack).

\n", "group": "strarray", "examples": { "general.c": [ @@ -20179,7 +21048,7 @@ }, "git_strarray_copy": { "type": "function", - "file": "strarray.h", + "file": "git2/strarray.h", "line": 53, "lineto": 53, "args": [ @@ -20201,24 +21070,24 @@ "comment": " 0 on success, \n<\n 0 on allocation failure" }, "description": "

Copy a string array object from source to target.

\n", - "comments": "

Note: target is overwritten and hence should be empty, otherwise its contents are leaked. Call git_strarray_free() if necessary.

\n", + "comments": "

Note: target is overwritten and hence should be empty, otherwise its\n contents are leaked. Call git_strarray_free() if necessary.

\n", "group": "strarray" }, "git_submodule_update_init_options": { "type": "function", - "file": "submodule.h", - "line": 170, - "lineto": 171, + "file": "git2/submodule.h", + "line": 171, + "lineto": 172, "args": [ { "name": "opts", "type": "git_submodule_update_options *", - "comment": "The `git_submodule_update_options` instance to initialize." + "comment": "The `git_submodule_update_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Version of struct; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`." } ], "argline": "git_submodule_update_options *opts, unsigned int version", @@ -20227,15 +21096,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_submodule_update_options with default values.\n Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_submodule_update_options structure

\n", + "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to\n creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", "group": "submodule" }, "git_submodule_update": { "type": "function", - "file": "submodule.h", - "line": 191, - "lineto": 191, + "file": "git2/submodule.h", + "line": 192, + "lineto": 192, "args": [ { "name": "submodule", @@ -20265,9 +21134,9 @@ }, "git_submodule_lookup": { "type": "function", - "file": "submodule.h", - "line": 220, - "lineto": 223, + "file": "git2/submodule.h", + "line": 221, + "lineto": 224, "args": [ { "name": "out", @@ -20292,14 +21161,14 @@ "comment": " 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors." }, "description": "

Lookup submodule information by name or path.

\n", - "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config, but does "exist" in the working directory (i.e. there is a subdirectory that appears to be a Git repository). In this case, this function returns GIT_EEXISTS to indicate a sub-repository exists but not in a state where a git_submodule can be instantiated. - The submodule is not mentioned in the HEAD, index, or config and the working directory doesn't contain a value git repo at that path. There may or may not be anything else at that path, but nothing that looks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", + "comments": "

Given either the submodule name or path (they are usually the same), this\n returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config,\nbut does "exist" in the working directory (i.e. there is a subdirectory\nthat appears to be a Git repository). In this case, this function\nreturns GIT_EEXISTS to indicate a sub-repository exists but not in a\nstate where a git_submodule can be instantiated.
  • \n
  • The submodule is not mentioned in the HEAD, index, or config and the\nworking directory doesn't contain a value git repo at that path.\nThere may or may not be anything else at that path, but nothing that\nlooks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", "group": "submodule" }, "git_submodule_free": { "type": "function", - "file": "submodule.h", - "line": 230, - "lineto": 230, + "file": "git2/submodule.h", + "line": 231, + "lineto": 231, "args": [ { "name": "submodule", @@ -20319,9 +21188,9 @@ }, "git_submodule_foreach": { "type": "function", - "file": "submodule.h", - "line": 250, - "lineto": 253, + "file": "git2/submodule.h", + "line": 251, + "lineto": 254, "args": [ { "name": "repo", @@ -20346,7 +21215,7 @@ "comment": " 0 on success, -1 on error, or non-zero return value of callback" }, "description": "

Iterate over all tracked submodules of a repository.

\n", - "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", + "comments": "

See the note on git_submodule above. This iterates over the tracked\n submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like\n submodules but are not tracked, the diff API will generate a diff record\n for workdir items that look like submodules but are not tracked, showing\n them as added in the workdir. Also, the status API will treat the entire\n subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", "group": "submodule", "examples": { "status.c": [ @@ -20356,9 +21225,9 @@ }, "git_submodule_add_setup": { "type": "function", - "file": "submodule.h", - "line": 280, - "lineto": 285, + "file": "git2/submodule.h", + "line": 281, + "lineto": 286, "args": [ { "name": "out", @@ -20393,14 +21262,14 @@ "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." }, "description": "

Set up a new git submodule for checkout.

\n", - "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed. Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", + "comments": "

This does "git submodule add" up to the fetch and checkout of the\n submodule contents. It preps a new submodule, creates an entry in\n .gitmodules and creates an empty initialized repository either at the\n given path in the working directory or in .git/modules with a gitlink\n from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the\n submodule repo and perform the clone step as needed. Lastly, call\n git_submodule_add_finalize() to wrap up adding the new submodule and\n .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", "group": "submodule" }, "git_submodule_add_finalize": { "type": "function", - "file": "submodule.h", - "line": 297, - "lineto": 297, + "file": "git2/submodule.h", + "line": 298, + "lineto": 298, "args": [ { "name": "submodule", @@ -20415,14 +21284,14 @@ "comment": null }, "description": "

Resolve the setup of a new git submodule.

\n", - "comments": "

This should be called on a submodule once you have called add setup and done the clone of the submodule. This adds the .gitmodules file and the newly cloned submodule to the index to be ready to be committed (but doesn't actually do the commit).

\n", + "comments": "

This should be called on a submodule once you have called add setup\n and done the clone of the submodule. This adds the .gitmodules file\n and the newly cloned submodule to the index to be ready to be committed\n (but doesn't actually do the commit).

\n", "group": "submodule" }, "git_submodule_add_to_index": { "type": "function", - "file": "submodule.h", - "line": 309, - "lineto": 311, + "file": "git2/submodule.h", + "line": 310, + "lineto": 312, "args": [ { "name": "submodule", @@ -20447,9 +21316,9 @@ }, "git_submodule_owner": { "type": "function", - "file": "submodule.h", - "line": 324, - "lineto": 324, + "file": "git2/submodule.h", + "line": 325, + "lineto": 325, "args": [ { "name": "submodule", @@ -20464,14 +21333,14 @@ "comment": " Pointer to `git_repository`" }, "description": "

Get the containing repository for a submodule.

\n", - "comments": "

This returns a pointer to the repository that contains the submodule. This is a just a reference to the repository that was passed to the original git_submodule_lookup() call, so if that repository has been freed, then this may be a dangling reference.

\n", + "comments": "

This returns a pointer to the repository that contains the submodule.\n This is a just a reference to the repository that was passed to the\n original git_submodule_lookup() call, so if that repository has been\n freed, then this may be a dangling reference.

\n", "group": "submodule" }, "git_submodule_name": { "type": "function", - "file": "submodule.h", - "line": 332, - "lineto": 332, + "file": "git2/submodule.h", + "line": 333, + "lineto": 333, "args": [ { "name": "submodule", @@ -20496,9 +21365,9 @@ }, "git_submodule_path": { "type": "function", - "file": "submodule.h", - "line": 343, - "lineto": 343, + "file": "git2/submodule.h", + "line": 344, + "lineto": 344, "args": [ { "name": "submodule", @@ -20513,7 +21382,7 @@ "comment": " Pointer to the submodule path" }, "description": "

Get the path to the submodule.

\n", - "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", + "comments": "

The path is almost always the same as the submodule name, but the\n two are actually not required to match.

\n", "group": "submodule", "examples": { "status.c": [ @@ -20523,9 +21392,9 @@ }, "git_submodule_url": { "type": "function", - "file": "submodule.h", - "line": 351, - "lineto": 351, + "file": "git2/submodule.h", + "line": 352, + "lineto": 352, "args": [ { "name": "submodule", @@ -20545,9 +21414,9 @@ }, "git_submodule_resolve_url": { "type": "function", - "file": "submodule.h", - "line": 361, - "lineto": 361, + "file": "git2/submodule.h", + "line": 362, + "lineto": 362, "args": [ { "name": "out", @@ -20577,9 +21446,9 @@ }, "git_submodule_branch": { "type": "function", - "file": "submodule.h", - "line": 369, - "lineto": 369, + "file": "git2/submodule.h", + "line": 370, + "lineto": 370, "args": [ { "name": "submodule", @@ -20599,9 +21468,9 @@ }, "git_submodule_set_branch": { "type": "function", - "file": "submodule.h", - "line": 382, - "lineto": 382, + "file": "git2/submodule.h", + "line": 383, + "lineto": 383, "args": [ { "name": "repo", @@ -20626,14 +21495,14 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set the branch for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to\n write the changes to the checked out submodule repository.

\n", "group": "submodule" }, "git_submodule_set_url": { "type": "function", - "file": "submodule.h", - "line": 396, - "lineto": 396, + "file": "git2/submodule.h", + "line": 397, + "lineto": 397, "args": [ { "name": "repo", @@ -20658,14 +21527,14 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set the URL for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to\n write the changes to the checked out submodule repository.

\n", "group": "submodule" }, "git_submodule_index_id": { "type": "function", - "file": "submodule.h", - "line": 404, - "lineto": 404, + "file": "git2/submodule.h", + "line": 405, + "lineto": 405, "args": [ { "name": "submodule", @@ -20685,9 +21554,9 @@ }, "git_submodule_head_id": { "type": "function", - "file": "submodule.h", - "line": 412, - "lineto": 412, + "file": "git2/submodule.h", + "line": 413, + "lineto": 413, "args": [ { "name": "submodule", @@ -20707,9 +21576,9 @@ }, "git_submodule_wd_id": { "type": "function", - "file": "submodule.h", - "line": 425, - "lineto": 425, + "file": "git2/submodule.h", + "line": 426, + "lineto": 426, "args": [ { "name": "submodule", @@ -20724,14 +21593,14 @@ "comment": " Pointer to git_oid or NULL if submodule is not checked out." }, "description": "

Get the OID for the submodule in the current working directory.

\n", - "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked out submodule. If there are pending changes in the index or anything else, this won't notice that. You should call git_submodule_status() for a more complete picture about the state of the working directory.

\n", + "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked\n out submodule. If there are pending changes in the index or anything\n else, this won't notice that. You should call git_submodule_status()\n for a more complete picture about the state of the working directory.

\n", "group": "submodule" }, "git_submodule_ignore": { "type": "function", - "file": "submodule.h", - "line": 450, - "lineto": 451, + "file": "git2/submodule.h", + "line": 451, + "lineto": 452, "args": [ { "name": "submodule", @@ -20746,14 +21615,14 @@ "comment": " The current git_submodule_ignore_t valyue what will be used for\n this submodule." }, "description": "

Get the ignore rule that will be used for the submodule.

\n", - "comments": "

These values control the behavior of git_submodule_status() for this submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents of the submodule from a clean checkout to be dirty, including the addition of untracked files. This is the default if unspecified. - GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the working tree (i.e. call git_status_foreach() on the submodule) but UNTRACKED files will not count as making the submodule dirty. - GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the submodule has moved for status. This is fast since it does not need to scan the working tree of the submodule at all. - GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo. The working directory will be consider clean so long as there is a checked out version present.
  • \n
\n", + "comments": "

These values control the behavior of git_submodule_status() for this\n submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents\nof the submodule from a clean checkout to be dirty, including the\naddition of untracked files. This is the default if unspecified.
  • \n
  • GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the\nworking tree (i.e. call git_status_foreach() on the submodule) but\nUNTRACKED files will not count as making the submodule dirty.
  • \n
  • GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the\nsubmodule has moved for status. This is fast since it does not need to\nscan the working tree of the submodule at all.
  • \n
  • GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo.\nThe working directory will be consider clean so long as there is a\nchecked out version present.
  • \n
\n", "group": "submodule" }, "git_submodule_set_ignore": { "type": "function", - "file": "submodule.h", - "line": 463, - "lineto": 466, + "file": "git2/submodule.h", + "line": 464, + "lineto": 467, "args": [ { "name": "repo", @@ -20783,9 +21652,9 @@ }, "git_submodule_update_strategy": { "type": "function", - "file": "submodule.h", - "line": 478, - "lineto": 479, + "file": "git2/submodule.h", + "line": 479, + "lineto": 480, "args": [ { "name": "submodule", @@ -20800,14 +21669,14 @@ "comment": " The current git_submodule_update_t value that will be used\n for this submodule." }, "description": "

Get the update rule that will be used for the submodule.

\n", - "comments": "

This value controls the behavior of the git submodule update command. There are four useful values documented with git_submodule_update_t.

\n", + "comments": "

This value controls the behavior of the git submodule update command.\n There are four useful values documented with git_submodule_update_t.

\n", "group": "submodule" }, "git_submodule_set_update": { "type": "function", - "file": "submodule.h", - "line": 491, - "lineto": 494, + "file": "git2/submodule.h", + "line": 492, + "lineto": 495, "args": [ { "name": "repo", @@ -20837,9 +21706,9 @@ }, "git_submodule_fetch_recurse_submodules": { "type": "function", - "file": "submodule.h", - "line": 507, - "lineto": 508, + "file": "git2/submodule.h", + "line": 508, + "lineto": 509, "args": [ { "name": "submodule", @@ -20854,14 +21723,14 @@ "comment": " 0 if fetchRecurseSubmodules is false, 1 if true" }, "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", - "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", + "comments": "

This accesses the submodule.\n<name

\n\n
\n

.fetchRecurseSubmodules value for\n the submodule that controls fetching behavior for the submodule.

\n
\n\n

Note that at this time, libgit2 does not honor this setting and the\n fetch functionality current ignores submodules.

\n", "group": "submodule" }, "git_submodule_set_fetch_recurse_submodules": { "type": "function", - "file": "submodule.h", - "line": 520, - "lineto": 523, + "file": "git2/submodule.h", + "line": 521, + "lineto": 524, "args": [ { "name": "repo", @@ -20891,9 +21760,9 @@ }, "git_submodule_init": { "type": "function", - "file": "submodule.h", - "line": 538, - "lineto": 538, + "file": "git2/submodule.h", + "line": 539, + "lineto": 539, "args": [ { "name": "submodule", @@ -20913,14 +21782,14 @@ "comment": " 0 on success, \n<\n0 on failure." }, "description": "

Copy submodule info into ".git/config" file.

\n", - "comments": "

Just like "git submodule init", this copies information about the submodule into ".git/config". You can use the accessor functions above to alter the in-memory git_submodule object and control what is written to the config, overriding what is in .gitmodules.

\n", + "comments": "

Just like "git submodule init", this copies information about the\n submodule into ".git/config". You can use the accessor functions\n above to alter the in-memory git_submodule object and control what\n is written to the config, overriding what is in .gitmodules.

\n", "group": "submodule" }, "git_submodule_repo_init": { "type": "function", - "file": "submodule.h", - "line": 553, - "lineto": 556, + "file": "git2/submodule.h", + "line": 554, + "lineto": 557, "args": [ { "name": "out", @@ -20945,14 +21814,14 @@ "comment": " 0 on success, \n<\n0 on failure." }, "description": "

Set up the subrepository for a submodule in preparation for clone.

\n", - "comments": "

This function can be called to init and set up a submodule repository from a submodule in preparation to clone it from its remote.

\n", + "comments": "

This function can be called to init and set up a submodule\n repository from a submodule in preparation to clone it from\n its remote.

\n", "group": "submodule" }, "git_submodule_sync": { "type": "function", - "file": "submodule.h", - "line": 566, - "lineto": 566, + "file": "git2/submodule.h", + "line": 567, + "lineto": 567, "args": [ { "name": "submodule", @@ -20967,14 +21836,14 @@ "comment": null }, "description": "

Copy submodule remote info into submodule repo.

\n", - "comments": "

This copies the information about the submodules URL into the checked out submodule config, acting like "git submodule sync". This is useful if you have altered the URL for the submodule (or it has been altered by a fetch of upstream changes) and you need to update your local repo.

\n", + "comments": "

This copies the information about the submodules URL into the checked out\n submodule config, acting like "git submodule sync". This is useful if\n you have altered the URL for the submodule (or it has been altered by a\n fetch of upstream changes) and you need to update your local repo.

\n", "group": "submodule" }, "git_submodule_open": { "type": "function", - "file": "submodule.h", - "line": 580, - "lineto": 582, + "file": "git2/submodule.h", + "line": 581, + "lineto": 583, "args": [ { "name": "repo", @@ -20994,14 +21863,14 @@ "comment": " 0 on success, \n<\n0 if submodule repo could not be opened." }, "description": "

Open the repository for a submodule.

\n", - "comments": "

This is a newly opened repository object. The caller is responsible for calling git_repository_free() on it when done. Multiple calls to this function will return distinct git_repository objects. This will only work if the submodule is checked out into the working directory.

\n", + "comments": "

This is a newly opened repository object. The caller is responsible for\n calling git_repository_free() on it when done. Multiple calls to this\n function will return distinct git_repository objects. This will only\n work if the submodule is checked out into the working directory.

\n", "group": "submodule" }, "git_submodule_reload": { "type": "function", - "file": "submodule.h", - "line": 594, - "lineto": 594, + "file": "git2/submodule.h", + "line": 595, + "lineto": 595, "args": [ { "name": "submodule", @@ -21021,14 +21890,14 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Reread submodule info from config, index, and HEAD.

\n", - "comments": "

Call this to reread cached submodule information for this submodule if you have reason to believe that it has changed.

\n", + "comments": "

Call this to reread cached submodule information for this submodule if\n you have reason to believe that it has changed.

\n", "group": "submodule" }, "git_submodule_status": { "type": "function", - "file": "submodule.h", - "line": 610, - "lineto": 614, + "file": "git2/submodule.h", + "line": 611, + "lineto": 615, "args": [ { "name": "status", @@ -21058,7 +21927,7 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Get the status for a submodule.

\n", - "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", + "comments": "

This looks at a submodule and tries to determine the status. It\n will return a combination of the GIT_SUBMODULE_STATUS values above.\n How deeply it examines the working directory to do this will depend\n on the git_submodule_ignore_t value for the submodule.

\n", "group": "submodule", "examples": { "status.c": [ @@ -21068,9 +21937,9 @@ }, "git_submodule_location": { "type": "function", - "file": "submodule.h", - "line": 630, - "lineto": 632, + "file": "git2/submodule.h", + "line": 631, + "lineto": 633, "args": [ { "name": "location_status", @@ -21090,12 +21959,56 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Get the locations of submodule information.

\n", - "comments": "

This is a bit like a very lightweight version of git_submodule_status. It just returns a made of the first four submodule status values (i.e. the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). This can be useful if you want to know if the submodule is present in the working directory at this point in time, etc.

\n", + "comments": "

This is a bit like a very lightweight version of git_submodule_status.\n It just returns a made of the first four submodule status values (i.e.\n the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the\n submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.).\n This can be useful if you want to know if the submodule is present in the\n working directory at this point in time, etc.

\n", "group": "submodule" }, + "git_stdalloc_init_allocator": { + "type": "function", + "file": "git2/sys/alloc.h", + "line": 85, + "lineto": 85, + "args": [ + { + "name": "allocator", + "type": "git_allocator *", + "comment": "The allocator that is to be initialized." + } + ], + "argline": "git_allocator *allocator", + "sig": "git_allocator *", + "return": { + "type": "int", + "comment": " An error code or 0." + }, + "description": "

Initialize the allocator structure to use the stdalloc pointer.

\n", + "comments": "

Set up the structure so that all of its members are using the standard\n "stdalloc" allocator functions. The structure can then be used with\n git_allocator_setup.

\n", + "group": "stdalloc" + }, + "git_win32_crtdbg_init_allocator": { + "type": "function", + "file": "git2/sys/alloc.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "allocator", + "type": "git_allocator *", + "comment": "The allocator that is to be initialized." + } + ], + "argline": "git_allocator *allocator", + "sig": "git_allocator *", + "return": { + "type": "int", + "comment": " An error code or 0." + }, + "description": "

Initialize the allocator structure to use the crtdbg pointer.

\n", + "comments": "

Set up the structure so that all of its members are using the "crtdbg"\n allocator functions. Note that this allocator is only available on Windows\n platforms and only if libgit2 is being compiled with "-DMSVC_CRTDBG".

\n", + "group": "win32" + }, "git_commit_create_from_ids": { "type": "function", - "file": "sys/commit.h", + "file": "git2/sys/commit.h", "line": 34, "lineto": 44, "args": [ @@ -21157,12 +22070,12 @@ "comment": null }, "description": "

Create new commit in the repository from a list of git_oid values.

\n", - "comments": "

See documentation for git_commit_create() for information about the parameters, as the meaning is identical excepting that tree and parents now take git_oid. This is a dangerous API in that nor the tree, neither the parents list of git_oids are checked for validity.

\n", + "comments": "

See documentation for git_commit_create() for information about the\n parameters, as the meaning is identical excepting that tree and\n parents now take git_oid. This is a dangerous API in that nor\n the tree, neither the parents list of git_oids are checked for\n validity.

\n", "group": "commit" }, "git_commit_create_from_callback": { "type": "function", - "file": "sys/commit.h", + "file": "git2/sys/commit.h", "line": 66, "lineto": 76, "args": [ @@ -21224,12 +22137,12 @@ "comment": null }, "description": "

Create a new commit in the repository with an callback to supply parents.

\n", - "comments": "

See documentation for git_commit_create() for information about the parameters, as the meaning is identical excepting that tree takes a git_oid and doesn't check for validity, and parent_cb is invoked with parent_payload and should return git_oid values or NULL to indicate that all parents are accounted for.

\n", + "comments": "

See documentation for git_commit_create() for information about the\n parameters, as the meaning is identical excepting that tree takes a\n git_oid and doesn't check for validity, and parent_cb is invoked\n with parent_payload and should return git_oid values or NULL to\n indicate that all parents are accounted for.

\n", "group": "commit" }, "git_config_init_backend": { "type": "function", - "file": "sys/config.h", + "file": "git2/sys/config.h", "line": 97, "lineto": 99, "args": [ @@ -21256,7 +22169,7 @@ }, "git_config_add_backend": { "type": "function", - "file": "sys/config.h", + "file": "git2/sys/config.h", "line": 121, "lineto": 126, "args": [ @@ -21293,12 +22206,12 @@ "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0), or error code" }, "description": "

Add a generic config file instance to an existing config

\n", - "comments": "

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", + "comments": "

Note that the configuration object will free the file\n automatically.

\n\n

Further queries on this config object will access each\n of the config file instances in order (instances with\n a higher priority level will be accessed first).

\n", "group": "config" }, "git_diff_print_callback__to_buf": { "type": "function", - "file": "sys/diff.h", + "file": "git2/sys/diff.h", "line": 37, "lineto": 41, "args": [ @@ -21330,12 +22243,12 @@ "comment": null }, "description": "

Diff print callback that writes to a git_buf.

\n", - "comments": "

This function is provided not for you to call it directly, but instead so you can use it as a function pointer to the git_diff_print or git_patch_print APIs. When using those APIs, you specify a callback to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a git_buf buffer. You must pass a git_buf * value as the payload to the git_diff_print and/or git_patch_print function. The data will be appended to the buffer (after any existing content).

\n", + "comments": "

This function is provided not for you to call it directly, but instead\n so you can use it as a function pointer to the git_diff_print or\n git_patch_print APIs. When using those APIs, you specify a callback\n to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a git_buf buffer. You\n must pass a git_buf * value as the payload to the git_diff_print\n and/or git_patch_print function. The data will be appended to the\n buffer (after any existing content).

\n", "group": "diff" }, "git_diff_print_callback__to_file_handle": { "type": "function", - "file": "sys/diff.h", + "file": "git2/sys/diff.h", "line": 57, "lineto": 61, "args": [ @@ -21367,12 +22280,12 @@ "comment": null }, "description": "

Diff print callback that writes to stdio FILE handle.

\n", - "comments": "

This function is provided not for you to call it directly, but instead so you can use it as a function pointer to the git_diff_print or git_patch_print APIs. When using those APIs, you specify a callback to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a stdio FILE handle. You must pass a FILE * value (such as stdout or stderr or the return value from fopen()) as the payload to the git_diff_print and/or git_patch_print function. If you pass NULL, this will write data to stdout.

\n", + "comments": "

This function is provided not for you to call it directly, but instead\n so you can use it as a function pointer to the git_diff_print or\n git_patch_print APIs. When using those APIs, you specify a callback\n to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a stdio FILE handle. You\n must pass a FILE * value (such as stdout or stderr or the return\n value from fopen()) as the payload to the git_diff_print\n and/or git_patch_print function. If you pass NULL, this will write\n data to stdout.

\n", "group": "diff" }, "git_diff_get_perfdata": { "type": "function", - "file": "sys/diff.h", + "file": "git2/sys/diff.h", "line": 83, "lineto": 84, "args": [ @@ -21399,7 +22312,7 @@ }, "git_status_list_get_perfdata": { "type": "function", - "file": "sys/diff.h", + "file": "git2/sys/diff.h", "line": 89, "lineto": 90, "args": [ @@ -21426,7 +22339,7 @@ }, "git_filter_lookup": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 27, "lineto": 27, "args": [ @@ -21448,7 +22361,7 @@ }, "git_filter_list_new": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 57, "lineto": 61, "args": [ @@ -21480,12 +22393,12 @@ "comment": null }, "description": "

Create a new empty filter list

\n", - "comments": "

Normally you won't use this because git_filter_list_load will create the filter list for you, but you can use this in combination with the git_filter_lookup and git_filter_list_push functions to assemble your own chains of filters.

\n", + "comments": "

Normally you won't use this because git_filter_list_load will create\n the filter list for you, but you can use this in combination with the\n git_filter_lookup and git_filter_list_push functions to assemble\n your own chains of filters.

\n", "group": "filter" }, "git_filter_list_push": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 76, "lineto": 77, "args": [ @@ -21512,12 +22425,12 @@ "comment": null }, "description": "

Add a filter to a filter list with the given payload.

\n", - "comments": "

Normally you won't have to do this because the filter list is created by calling the "check" function on registered filters when the filter attributes are set, but this does allow more direct manipulation of filter lists when desired.

\n\n

Note that normally the "check" function can set up a payload for the filter. Using this function, you can either pass in a payload if you know the expected payload format, or you can pass NULL. Some filters may fail with a NULL payload. Good luck!

\n", + "comments": "

Normally you won't have to do this because the filter list is created\n by calling the "check" function on registered filters when the filter\n attributes are set, but this does allow more direct manipulation of\n filter lists when desired.

\n\n

Note that normally the "check" function can set up a payload for the\n filter. Using this function, you can either pass in a payload if you\n know the expected payload format, or you can pass NULL. Some filters\n may fail with a NULL payload. Good luck!

\n", "group": "filter" }, "git_filter_list_length": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 90, "lineto": 90, "args": [ @@ -21534,12 +22447,12 @@ "comment": " The number of filters in the list" }, "description": "

Look up how many filters are in the list

\n", - "comments": "

We will attempt to apply all of these filters to any data passed in, but note that the filter apply action still has the option of skipping data that is passed in (for example, the CRLF filter will skip data that appears to be binary).

\n", + "comments": "

We will attempt to apply all of these filters to any data passed in,\n but note that the filter apply action still has the option of skipping\n data that is passed in (for example, the CRLF filter will skip data\n that appears to be binary).

\n", "group": "filter" }, "git_filter_source_repo": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 100, "lineto": 100, "args": [ @@ -21561,7 +22474,7 @@ }, "git_filter_source_path": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 105, "lineto": 105, "args": [ @@ -21583,7 +22496,7 @@ }, "git_filter_source_filemode": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 111, "lineto": 111, "args": [ @@ -21605,7 +22518,7 @@ }, "git_filter_source_id": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 118, "lineto": 118, "args": [ @@ -21627,7 +22540,7 @@ }, "git_filter_source_mode": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 123, "lineto": 123, "args": [ @@ -21649,7 +22562,7 @@ }, "git_filter_source_flags": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 128, "lineto": 128, "args": [ @@ -21671,7 +22584,7 @@ }, "git_filter_init": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 284, "lineto": 284, "args": [ @@ -21698,7 +22611,7 @@ }, "git_filter_register": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 312, "lineto": 313, "args": [ @@ -21725,12 +22638,12 @@ "comment": " 0 on successful registry, error code \n<\n0 on failure" }, "description": "

Register a filter under a given name with a given priority.

\n", - "comments": "

As mentioned elsewhere, the initialize callback will not be invoked immediately. It is deferred until the filter is used in some way.

\n\n

A filter's attribute checks and check and apply callbacks will be issued in order of priority on smudge (to workdir), and in reverse order of priority on clean (to odb).

\n\n

Two filters are preregistered with libgit2: - GIT_FILTER_CRLF with priority 0 - GIT_FILTER_IDENT with priority 100

\n\n

Currently the filter registry is not thread safe, so any registering or deregistering of filters must be done outside of any possible usage of the filters (i.e. during application setup or shutdown).

\n", + "comments": "

As mentioned elsewhere, the initialize callback will not be invoked\n immediately. It is deferred until the filter is used in some way.

\n\n

A filter's attribute checks and check and apply callbacks will be\n issued in order of priority on smudge (to workdir), and in reverse\n order of priority on clean (to odb).

\n\n

Two filters are preregistered with libgit2:\n - GIT_FILTER_CRLF with priority 0\n - GIT_FILTER_IDENT with priority 100

\n\n

Currently the filter registry is not thread safe, so any registering or\n deregistering of filters must be done outside of any possible usage of\n the filters (i.e. during application setup or shutdown).

\n", "group": "filter" }, "git_filter_unregister": { "type": "function", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 328, "lineto": 328, "args": [ @@ -21747,12 +22660,12 @@ "comment": " 0 on success, error code \n<\n0 on failure" }, "description": "

Remove the filter with the given name

\n", - "comments": "

Attempting to remove the builtin libgit2 filters is not permitted and will return an error.

\n\n

Currently the filter registry is not thread safe, so any registering or deregistering of filters must be done outside of any possible usage of the filters (i.e. during application setup or shutdown).

\n", + "comments": "

Attempting to remove the builtin libgit2 filters is not permitted and\n will return an error.

\n\n

Currently the filter registry is not thread safe, so any registering or\n deregistering of filters must be done outside of any possible usage of\n the filters (i.e. during application setup or shutdown).

\n", "group": "filter" }, "git_hashsig_create": { "type": "function", - "file": "sys/hashsig.h", + "file": "git2/sys/hashsig.h", "line": 62, "lineto": 66, "args": [ @@ -21784,12 +22697,12 @@ "comment": " 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to\n compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or\n error code." }, "description": "

Compute a similarity signature for a text buffer

\n", - "comments": "

If you have passed the option GIT_HASHSIG_IGNORE_WHITESPACE, then the whitespace will be removed from the buffer while it is being processed, modifying the buffer in place. Sorry about that!

\n", + "comments": "

If you have passed the option GIT_HASHSIG_IGNORE_WHITESPACE, then the\n whitespace will be removed from the buffer while it is being processed,\n modifying the buffer in place. Sorry about that!

\n", "group": "hashsig" }, "git_hashsig_create_fromfile": { "type": "function", - "file": "sys/hashsig.h", + "file": "git2/sys/hashsig.h", "line": 81, "lineto": 84, "args": [ @@ -21816,12 +22729,12 @@ "comment": " 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to\n compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or\n error code." }, "description": "

Compute a similarity signature for a text file

\n", - "comments": "

This walks through the file, only loading a maximum of 4K of file data at a time. Otherwise, it acts just like git_hashsig_create.

\n", + "comments": "

This walks through the file, only loading a maximum of 4K of file data at\n a time. Otherwise, it acts just like git_hashsig_create.

\n", "group": "hashsig" }, "git_hashsig_free": { "type": "function", - "file": "sys/hashsig.h", + "file": "git2/sys/hashsig.h", "line": 91, "lineto": 91, "args": [ @@ -21843,7 +22756,7 @@ }, "git_hashsig_compare": { "type": "function", - "file": "sys/hashsig.h", + "file": "git2/sys/hashsig.h", "line": 100, "lineto": 102, "args": [ @@ -21868,9 +22781,331 @@ "comments": "", "group": "hashsig" }, + "git_index_name_entrycount": { + "type": "function", + "file": "git2/sys/index.h", + "line": 48, + "lineto": 48, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "size_t", + "comment": " integer of count of current filename conflict entries" + }, + "description": "

Get the count of filename conflict entries currently in the index.

\n", + "comments": "", + "group": "index" + }, + "git_index_name_get_byindex": { + "type": "function", + "file": "git2/sys/index.h", + "line": 60, + "lineto": 61, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "n", + "type": "size_t", + "comment": "the position of the entry" + } + ], + "argline": "git_index *index, size_t n", + "sig": "git_index *::size_t", + "return": { + "type": "const git_index_name_entry *", + "comment": " a pointer to the filename conflict entry; NULL if out of bounds" + }, + "description": "

Get a filename conflict entry from the index.

\n", + "comments": "

The returned entry is read-only and should not be modified\n or freed by the caller.

\n", + "group": "index" + }, + "git_index_name_add": { + "type": "function", + "file": "git2/sys/index.h", + "line": 71, + "lineto": 72, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "ancestor", + "type": "const char *", + "comment": "the path of the file as it existed in the ancestor" + }, + { + "name": "ours", + "type": "const char *", + "comment": "the path of the file as it existed in our tree" + }, + { + "name": "theirs", + "type": "const char *", + "comment": "the path of the file as it existed in their tree" + } + ], + "argline": "git_index *index, const char *ancestor, const char *ours, const char *theirs", + "sig": "git_index *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Record the filenames involved in a rename conflict.

\n", + "comments": "", + "group": "index" + }, + "git_index_name_clear": { + "type": "function", + "file": "git2/sys/index.h", + "line": 79, + "lineto": 79, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Remove all filename conflict entries.

\n", + "comments": "", + "group": "index" + }, + "git_index_reuc_entrycount": { + "type": "function", + "file": "git2/sys/index.h", + "line": 96, + "lineto": 96, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "size_t", + "comment": " integer of count of current resolve undo entries" + }, + "description": "

Get the count of resolve undo entries currently in the index.

\n", + "comments": "", + "group": "index" + }, + "git_index_reuc_find": { + "type": "function", + "file": "git2/sys/index.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "at_pos", + "type": "size_t *", + "comment": "the address to which the position of the reuc entry is written (optional)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to search" + } + ], + "argline": "size_t *at_pos, git_index *index, const char *path", + "sig": "size_t *::git_index *::const char *", + "return": { + "type": "int", + "comment": " 0 if found, \n<\n 0 otherwise (GIT_ENOTFOUND)" + }, + "description": "

Finds the resolve undo entry that points to the given path in the Git\n index.

\n", + "comments": "", + "group": "index" + }, + "git_index_reuc_get_bypath": { + "type": "function", + "file": "git2/sys/index.h", + "line": 119, + "lineto": 119, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to search" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { + "type": "const git_index_reuc_entry *", + "comment": " the resolve undo entry; NULL if not found" + }, + "description": "

Get a resolve undo entry from the index.

\n", + "comments": "

The returned entry is read-only and should not be modified\n or freed by the caller.

\n", + "group": "index" + }, + "git_index_reuc_get_byindex": { + "type": "function", + "file": "git2/sys/index.h", + "line": 131, + "lineto": 131, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "n", + "type": "size_t", + "comment": "the position of the entry" + } + ], + "argline": "git_index *index, size_t n", + "sig": "git_index *::size_t", + "return": { + "type": "const git_index_reuc_entry *", + "comment": " a pointer to the resolve undo entry; NULL if out of bounds" + }, + "description": "

Get a resolve undo entry from the index.

\n", + "comments": "

The returned entry is read-only and should not be modified\n or freed by the caller.

\n", + "group": "index" + }, + "git_index_reuc_add": { + "type": "function", + "file": "git2/sys/index.h", + "line": 155, + "lineto": 158, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "filename to add" + }, + { + "name": "ancestor_mode", + "type": "int", + "comment": "mode of the ancestor file" + }, + { + "name": "ancestor_id", + "type": "const git_oid *", + "comment": "oid of the ancestor file" + }, + { + "name": "our_mode", + "type": "int", + "comment": "mode of our file" + }, + { + "name": "our_id", + "type": "const git_oid *", + "comment": "oid of our file" + }, + { + "name": "their_mode", + "type": "int", + "comment": "mode of their file" + }, + { + "name": "their_id", + "type": "const git_oid *", + "comment": "oid of their file" + } + ], + "argline": "git_index *index, const char *path, int ancestor_mode, const git_oid *ancestor_id, int our_mode, const git_oid *our_id, int their_mode, const git_oid *their_id", + "sig": "git_index *::const char *::int::const git_oid *::int::const git_oid *::int::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Adds a resolve undo entry for a file based on the given parameters.

\n", + "comments": "

The resolve undo entry contains the OIDs of files that were involved\n in a merge conflict after the conflict has been resolved. This allows\n conflicts to be re-resolved later.

\n\n

If there exists a resolve undo entry for the given path in the index,\n it will be removed.

\n\n

This method will fail in bare index instances.

\n", + "group": "index" + }, + "git_index_reuc_remove": { + "type": "function", + "file": "git2/sys/index.h", + "line": 167, + "lineto": 167, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "n", + "type": "size_t", + "comment": "position of the resolve undo entry to remove" + } + ], + "argline": "git_index *index, size_t n", + "sig": "git_index *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove an resolve undo entry from the index

\n", + "comments": "", + "group": "index" + }, + "git_index_reuc_clear": { + "type": "function", + "file": "git2/sys/index.h", + "line": 174, + "lineto": 174, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Remove all resolve undo entries from the index

\n", + "comments": "", + "group": "index" + }, "git_mempack_new": { "type": "function", - "file": "sys/mempack.h", + "file": "git2/sys/mempack.h", "line": 45, "lineto": 45, "args": [ @@ -21886,13 +23121,13 @@ "type": "int", "comment": " 0 on success; error code otherwise" }, - "description": "
Instantiate a new mempack backend.\n
\n", - "comments": "
The backend must be added to an existing ODB with the highest   priority.\n\n    git_mempack_new(&mempacker);        git_repository_odb(&odb, repository);       git_odb_add_backend(odb, mempacker, 999);\n\nOnce the backend has been loaded, all writes to the ODB will    instead be queued in memory, and can be finalized with  `git_mempack_dump`.\n\nSubsequent reads will also be served from the in-memory store   to ensure consistency, until the memory store is dumped.\n
\n", + "description": "

Instantiate a new mempack backend.

\n", + "comments": "

The backend must be added to an existing ODB with the highest\n priority.

\n\n
 git_mempack_new(\n
\n\n

&mempacker\n);\n git_repository_odb(\n&odb\n, repository);\n git_odb_add_backend(odb, mempacker, 999);

\n\n

Once the backend has been loaded, all writes to the ODB will\n instead be queued in memory, and can be finalized with\n git_mempack_dump.

\n\n

Subsequent reads will also be served from the in-memory store\n to ensure consistency, until the memory store is dumped.

\n", "group": "mempack" }, "git_mempack_dump": { "type": "function", - "file": "sys/mempack.h", + "file": "git2/sys/mempack.h", "line": 68, "lineto": 68, "args": [ @@ -21918,13 +23153,13 @@ "type": "int", "comment": " 0 on success; error code otherwise" }, - "description": "
Dump all the queued in-memory writes to a packfile.\n
\n", - "comments": "
The contents of the packfile will be stored in the given buffer.    It is the caller's responsibility to ensure that the generated  packfile is available to the repository (e.g. by writing it to disk, or doing something crazy like distributing it across   several copies of the repository over a network).\n\nOnce the generated packfile is available to the repository, call `git_mempack_reset` to cleanup the memory store.\n\nCalling `git_mempack_reset` before the packfile has been    written to disk will result in an inconsistent repository   (the objects in the memory store won't be accessible).\n
\n", + "description": "

Dump all the queued in-memory writes to a packfile.

\n", + "comments": "

The contents of the packfile will be stored in the given buffer.\n It is the caller's responsibility to ensure that the generated\n packfile is available to the repository (e.g. by writing it\n to disk, or doing something crazy like distributing it across\n several copies of the repository over a network).

\n\n

Once the generated packfile is available to the repository,\n call git_mempack_reset to cleanup the memory store.

\n\n

Calling git_mempack_reset before the packfile has been\n written to disk will result in an inconsistent repository\n (the objects in the memory store won't be accessible).

\n", "group": "mempack" }, "git_mempack_reset": { "type": "function", - "file": "sys/mempack.h", + "file": "git2/sys/mempack.h", "line": 82, "lineto": 82, "args": [ @@ -21940,13 +23175,194 @@ "type": "void", "comment": null }, - "description": "
Reset the memory packer by clearing all the queued objects.\n
\n", - "comments": "
This assumes that `git_mempack_dump` has been called before to  store all the queued objects into a single packfile.\n\nAlternatively, call `reset` without a previous dump to "undo"   all the recently written objects, giving transaction-like   semantics to the Git repository.\n
\n", + "description": "

Reset the memory packer by clearing all the queued objects.

\n", + "comments": "

This assumes that git_mempack_dump has been called before to\n store all the queued objects into a single packfile.

\n\n

Alternatively, call reset without a previous dump to "undo"\n all the recently written objects, giving transaction-like\n semantics to the Git repository.

\n", "group": "mempack" }, + "git_merge_driver_lookup": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The name of the merge driver" + } + ], + "argline": "const char *name", + "sig": "const char *", + "return": { + "type": "git_merge_driver *", + "comment": " Pointer to the merge driver object or NULL if not found" + }, + "description": "

Look up a merge driver by name

\n", + "comments": "", + "group": "merge" + }, + "git_merge_driver_source_repo": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 44, + "lineto": 45, + "args": [ + { + "name": "src", + "type": "const git_merge_driver_source *", + "comment": null + } + ], + "argline": "const git_merge_driver_source *src", + "sig": "const git_merge_driver_source *", + "return": { + "type": "const git_repository *", + "comment": null + }, + "description": "

Get the repository that the source data is coming from.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_driver_source_ancestor": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 48, + "lineto": 49, + "args": [ + { + "name": "src", + "type": "const git_merge_driver_source *", + "comment": null + } + ], + "argline": "const git_merge_driver_source *src", + "sig": "const git_merge_driver_source *", + "return": { + "type": "const git_index_entry *", + "comment": null + }, + "description": "

Gets the ancestor of the file to merge.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_driver_source_ours": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 52, + "lineto": 53, + "args": [ + { + "name": "src", + "type": "const git_merge_driver_source *", + "comment": null + } + ], + "argline": "const git_merge_driver_source *src", + "sig": "const git_merge_driver_source *", + "return": { + "type": "const git_index_entry *", + "comment": null + }, + "description": "

Gets the ours side of the file to merge.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_driver_source_theirs": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 56, + "lineto": 57, + "args": [ + { + "name": "src", + "type": "const git_merge_driver_source *", + "comment": null + } + ], + "argline": "const git_merge_driver_source *src", + "sig": "const git_merge_driver_source *", + "return": { + "type": "const git_index_entry *", + "comment": null + }, + "description": "

Gets the theirs side of the file to merge.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_driver_source_file_options": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 60, + "lineto": 61, + "args": [ + { + "name": "src", + "type": "const git_merge_driver_source *", + "comment": null + } + ], + "argline": "const git_merge_driver_source *src", + "sig": "const git_merge_driver_source *", + "return": { + "type": "const git_merge_file_options *", + "comment": null + }, + "description": "

Gets the merge file options that the merge was invoked with

\n", + "comments": "", + "group": "merge" + }, + "git_merge_driver_register": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 162, + "lineto": 163, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The name of this driver to match an attribute. Attempting\n \t\t\tto register with an in-use name will return GIT_EEXISTS." + }, + { + "name": "driver", + "type": "git_merge_driver *", + "comment": "The merge driver definition. This pointer will be stored\n\t\t\tas is by libgit2 so it must be a durable allocation (either\n\t\t\tstatic or on the heap)." + } + ], + "argline": "const char *name, git_merge_driver *driver", + "sig": "const char *::git_merge_driver *", + "return": { + "type": "int", + "comment": " 0 on successful registry, error code \n<\n0 on failure" + }, + "description": "

Register a merge driver under a given name.

\n", + "comments": "

As mentioned elsewhere, the initialize callback will not be invoked\n immediately. It is deferred until the driver is used in some way.

\n\n

Currently the merge driver registry is not thread safe, so any\n registering or deregistering of merge drivers must be done outside of\n any possible usage of the drivers (i.e. during application setup or\n shutdown).

\n", + "group": "merge" + }, + "git_merge_driver_unregister": { + "type": "function", + "file": "git2/sys/merge.h", + "line": 178, + "lineto": 178, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The name under which the merge driver was registered" + } + ], + "argline": "const char *name", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 0 on success, error code \n<\n0 on failure" + }, + "description": "

Remove the merge driver with the given name.

\n", + "comments": "

Attempting to remove the builtin libgit2 merge drivers is not permitted\n and will return an error.

\n\n

Currently the merge driver registry is not thread safe, so any\n registering or deregistering of drivers must be done outside of any\n possible usage of the drivers (i.e. during application setup or shutdown).

\n", + "group": "merge" + }, "git_odb_init_backend": { "type": "function", - "file": "sys/odb_backend.h", + "file": "git2/sys/odb_backend.h", "line": 116, "lineto": 118, "args": [ @@ -21971,9 +23387,36 @@ "comments": "", "group": "odb" }, + "git_odb_backend_malloc": { + "type": "function", + "file": "git2/sys/odb_backend.h", + "line": 120, + "lineto": 120, + "args": [ + { + "name": "backend", + "type": "git_odb_backend *", + "comment": null + }, + { + "name": "len", + "type": "size_t", + "comment": null + } + ], + "argline": "git_odb_backend *backend, size_t len", + "sig": "git_odb_backend *::size_t", + "return": { + "type": "void *", + "comment": null + }, + "description": "", + "comments": "", + "group": "odb" + }, "git_openssl_set_locking": { "type": "function", - "file": "sys/openssl.h", + "file": "git2/sys/openssl.h", "line": 34, "lineto": 34, "args": [], @@ -21984,12 +23427,49 @@ "comment": " 0 on success, -1 if there are errors or if libgit2 was not\n built with OpenSSL and threading support." }, "description": "

Initialize the OpenSSL locks

\n", - "comments": "

OpenSSL requires the application to determine how it performs locking.

\n\n

This is a last-resort convenience function which libgit2 provides for allocating and initializing the locks as well as setting the locking function to use the system's native locking functions.

\n\n

The locking function will be cleared and the memory will be freed when you call git_threads_sutdown().

\n\n

If your programming language has an OpenSSL package/bindings, it likely sets up locking. You should very strongly prefer that over this function.

\n", + "comments": "

OpenSSL requires the application to determine how it performs\n locking.

\n\n

This is a last-resort convenience function which libgit2 provides for\n allocating and initializing the locks as well as setting the\n locking function to use the system's native locking functions.

\n\n

The locking function will be cleared and the memory will be freed\n when you call git_threads_sutdown().

\n\n

If your programming language has an OpenSSL package/bindings, it\n likely sets up locking. You should very strongly prefer that over\n this function.

\n", "group": "openssl" }, + "git_path_is_gitfile": { + "type": "function", + "file": "git2/sys/path.h", + "line": 60, + "lineto": 60, + "args": [ + { + "name": "path", + "type": "const char *", + "comment": "the path component to check" + }, + { + "name": "pathlen", + "type": "size_t", + "comment": "the length of `path` that is to be checked" + }, + { + "name": "gitfile", + "type": "git_path_gitfile", + "comment": "which file to check against" + }, + { + "name": "fs", + "type": "git_path_fs", + "comment": "which filesystem-specific checks to use" + } + ], + "argline": "const char *path, size_t pathlen, git_path_gitfile gitfile, git_path_fs fs", + "sig": "const char *::size_t::git_path_gitfile::git_path_fs", + "return": { + "type": "int", + "comment": " 0 in case the file does not match, a positive value if\n it does; -1 in case of an error" + }, + "description": "

Check whether a path component corresponds to a .git$SUFFIX\n file.

\n", + "comments": "

As some filesystems do special things to filenames when\n writing files to disk, you cannot always do a plain string\n comparison to verify whether a file name matches an expected\n path or not. This function can do the comparison for you,\n depending on the filesystem you're on.

\n", + "group": "path" + }, "git_refdb_init_backend": { "type": "function", - "file": "sys/refdb_backend.h", + "file": "git2/sys/refdb_backend.h", "line": 183, "lineto": 185, "args": [ @@ -22016,7 +23496,7 @@ }, "git_refdb_backend_fs": { "type": "function", - "file": "sys/refdb_backend.h", + "file": "git2/sys/refdb_backend.h", "line": 198, "lineto": 200, "args": [ @@ -22038,12 +23518,12 @@ "comment": " 0 on success, \n<\n0 error code on failure" }, "description": "

Constructors for default filesystem-based refdb backend

\n", - "comments": "

Under normal usage, this is called for you when the repository is opened / created, but you can use this to explicitly construct a filesystem refdb backend for a repository.

\n", + "comments": "

Under normal usage, this is called for you when the repository is\n opened / created, but you can use this to explicitly construct a\n filesystem refdb backend for a repository.

\n", "group": "refdb" }, "git_refdb_set_backend": { "type": "function", - "file": "sys/refdb_backend.h", + "file": "git2/sys/refdb_backend.h", "line": 212, "lineto": 214, "args": [ @@ -22065,12 +23545,50 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Sets the custom backend to an existing reference DB

\n", - "comments": "

The git_refdb will take ownership of the git_refdb_backend so you should NOT free it after calling this function.

\n", + "comments": "

The git_refdb will take ownership of the git_refdb_backend so you\n should NOT free it after calling this function.

\n", "group": "refdb" }, + "git_reflog_entry__alloc": { + "type": "function", + "file": "git2/sys/reflog.h", + "line": 16, + "lineto": 16, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "git_reflog_entry *", + "comment": null + }, + "description": "", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry__free": { + "type": "function", + "file": "git2/sys/reflog.h", + "line": 17, + "lineto": 17, + "args": [ + { + "name": "entry", + "type": "git_reflog_entry *", + "comment": null + } + ], + "argline": "git_reflog_entry *entry", + "sig": "git_reflog_entry *", + "return": { + "type": "void", + "comment": null + }, + "description": "", + "comments": "", + "group": "reflog" + }, "git_reference__alloc": { "type": "function", - "file": "sys/refs.h", + "file": "git2/sys/refs.h", "line": 31, "lineto": 34, "args": [ @@ -22102,7 +23620,7 @@ }, "git_reference__alloc_symbolic": { "type": "function", - "file": "sys/refs.h", + "file": "git2/sys/refs.h", "line": 43, "lineto": 45, "args": [ @@ -22129,7 +23647,7 @@ }, "git_repository_new": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 31, "lineto": 31, "args": [ @@ -22146,12 +23664,12 @@ "comment": " 0 on success, or an error code" }, "description": "

Create a new repository with neither backends nor config object

\n", - "comments": "

Note that this is only useful if you wish to associate the repository with a non-filesystem-backed object database and config store.

\n", + "comments": "

Note that this is only useful if you wish to associate the repository\n with a non-filesystem-backed object database and config store.

\n", "group": "repository" }, "git_repository__cleanup": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 44, "lineto": 44, "args": [ @@ -22168,12 +23686,12 @@ "comment": null }, "description": "

Reset all the internal state in a repository.

\n", - "comments": "

This will free all the mapped memory and internal objects of the repository and leave it in a "blank" state.

\n\n

There's no need to call this function directly unless you're trying to aggressively cleanup the repo before its deallocation. git_repository_free already performs this operation before deallocation the repo.

\n", + "comments": "

This will free all the mapped memory and internal objects\n of the repository and leave it in a "blank" state.

\n\n

There's no need to call this function directly unless you're\n trying to aggressively cleanup the repo before its\n deallocation. git_repository_free already performs this operation\n before deallocation the repo.

\n", "group": "repository" }, "git_repository_reinit_filesystem": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 61, "lineto": 63, "args": [ @@ -22195,12 +23713,12 @@ "comment": " 0 on success, \n<\n 0 on error" }, "description": "

Update the filesystem config settings for an open repository

\n", - "comments": "

When a repository is initialized, config values are set based on the properties of the filesystem that the repository is on, such as "core.ignorecase", "core.filemode", "core.symlinks", etc. If the repository is moved to a new filesystem, these properties may no longer be correct and API calls may not behave as expected. This call reruns the phase of repository initialization that sets those properties to compensate for the current filesystem of the repo.

\n", + "comments": "

When a repository is initialized, config values are set based on the\n properties of the filesystem that the repository is on, such as\n "core.ignorecase", "core.filemode", "core.symlinks", etc. If the\n repository is moved to a new filesystem, these properties may no\n longer be correct and API calls may not behave as expected. This\n call reruns the phase of repository initialization that sets those\n properties to compensate for the current filesystem of the repo.

\n", "group": "repository" }, "git_repository_set_config": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 78, "lineto": 78, "args": [ @@ -22222,12 +23740,12 @@ "comment": null }, "description": "

Set the configuration file for this repository

\n", - "comments": "

This configuration file will be used for all configuration queries involving this repository.

\n\n

The repository will keep a reference to the config file; the user must still free the config after setting it to the repository, or it will leak.

\n", + "comments": "

This configuration file will be used for all configuration\n queries involving this repository.

\n\n

The repository will keep a reference to the config file;\n the user must still free the config after setting it\n to the repository, or it will leak.

\n", "group": "repository" }, "git_repository_set_odb": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 93, "lineto": 93, "args": [ @@ -22249,12 +23767,12 @@ "comment": null }, "description": "

Set the Object Database for this repository

\n", - "comments": "

The ODB will be used for all object-related operations involving this repository.

\n\n

The repository will keep a reference to the ODB; the user must still free the ODB object after setting it to the repository, or it will leak.

\n", + "comments": "

The ODB will be used for all object-related operations\n involving this repository.

\n\n

The repository will keep a reference to the ODB; the user\n must still free the ODB object after setting it to the\n repository, or it will leak.

\n", "group": "repository" }, "git_repository_set_refdb": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 108, "lineto": 108, "args": [ @@ -22276,12 +23794,12 @@ "comment": null }, "description": "

Set the Reference Database Backend for this repository

\n", - "comments": "

The refdb will be used for all reference related operations involving this repository.

\n\n

The repository will keep a reference to the refdb; the user must still free the refdb object after setting it to the repository, or it will leak.

\n", + "comments": "

The refdb will be used for all reference related operations\n involving this repository.

\n\n

The repository will keep a reference to the refdb; the user\n must still free the refdb object after setting it to the\n repository, or it will leak.

\n", "group": "repository" }, "git_repository_set_index": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 123, "lineto": 123, "args": [ @@ -22303,12 +23821,12 @@ "comment": null }, "description": "

Set the index file for this repository

\n", - "comments": "

This index will be used for all index-related operations involving this repository.

\n\n

The repository will keep a reference to the index file; the user must still free the index after setting it to the repository, or it will leak.

\n", + "comments": "

This index will be used for all index-related operations\n involving this repository.

\n\n

The repository will keep a reference to the index file;\n the user must still free the index after setting it\n to the repository, or it will leak.

\n", "group": "repository" }, "git_repository_set_bare": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 136, "lineto": 136, "args": [ @@ -22325,12 +23843,12 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set a repository to be bare.

\n", - "comments": "

Clear the working directory and set core.bare to true. You may also want to call git_repository_set_index(repo, NULL) since a bare repo typically does not have an index, but this function will not do that for you.

\n", + "comments": "

Clear the working directory and set core.bare to true. You may also\n want to call git_repository_set_index(repo, NULL) since a bare repo\n typically does not have an index, but this function will not do that\n for you.

\n", "group": "repository" }, "git_repository_submodule_cache_all": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 149, "lineto": 150, "args": [ @@ -22347,12 +23865,12 @@ "comment": null }, "description": "

Load and cache all submodules.

\n", - "comments": "

Because the .gitmodules file is unstructured, loading submodules is an O(N) operation. Any operation (such as git_rebase_init) that requires accessing all submodules is O(N^2) in the number of submodules, if it has to look each one up individually. This function loads all submodules and caches them so that subsequent calls to git_submodule_lookup are O(1).

\n", + "comments": "

Because the .gitmodules file is unstructured, loading submodules is an\n O(N) operation. Any operation (such as git_rebase_init) that requires\n accessing all submodules is O(N^2) in the number of submodules, if it\n has to look each one up individually. This function loads all submodules\n and caches them so that subsequent calls to git_submodule_lookup are O(1).

\n", "group": "repository" }, "git_repository_submodule_cache_clear": { "type": "function", - "file": "sys/repository.h", + "file": "git2/sys/repository.h", "line": 164, "lineto": 165, "args": [ @@ -22369,12 +23887,12 @@ "comment": null }, "description": "

Clear the submodule cache.

\n", - "comments": "

Clear the submodule cache populated by git_repository_submodule_cache_all. If there is no cache, do nothing.

\n\n

The cache incorporates data from the repository's configuration, as well as the state of the working tree, the index, and HEAD. So any time any of these has changed, the cache might become invalid.

\n", + "comments": "

Clear the submodule cache populated by git_repository_submodule_cache_all.\n If there is no cache, do nothing.

\n\n

The cache incorporates data from the repository's configuration, as well\n as the state of the working tree, the index, and HEAD. So any time any\n of these has changed, the cache might become invalid.

\n", "group": "repository" }, "git_stream_register_tls": { "type": "function", - "file": "sys/stream.h", + "file": "git2/sys/stream.h", "line": 54, "lineto": 54, "args": [ @@ -22391,12 +23909,12 @@ "comment": " 0 or an error code" }, "description": "

Register a TLS stream constructor for the library to use

\n", - "comments": "

If a constructor is already set, it will be overwritten. Pass NULL in order to deregister the current constructor.

\n", + "comments": "

If a constructor is already set, it will be overwritten. Pass\n NULL in order to deregister the current constructor.

\n", "group": "stream" }, "git_time_monotonic": { "type": "function", - "file": "sys/time.h", + "file": "git2/sys/time.h", "line": 27, "lineto": 27, "args": [], @@ -22407,12 +23925,12 @@ "comment": null }, "description": "

Return a monotonic time value, useful for measuring running time\n and setting up timeouts.

\n", - "comments": "

The returned value is an arbitrary point in time -- it can only be used when comparing it to another git_time_monotonic call.

\n\n

The time is returned in seconds, with a decimal fraction that differs on accuracy based on the underlying system, but should be least accurate to Nanoseconds.

\n\n

This function cannot fail.

\n", + "comments": "

The returned value is an arbitrary point in time -- it can only be\n used when comparing it to another git_time_monotonic call.

\n\n

The time is returned in seconds, with a decimal fraction that differs\n on accuracy based on the underlying system, but should be least\n accurate to Nanoseconds.

\n\n

This function cannot fail.

\n", "group": "time" }, "git_transport_init": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 119, "lineto": 121, "args": [ @@ -22439,7 +23957,7 @@ }, "git_transport_new": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 133, "lineto": 133, "args": [ @@ -22471,7 +23989,7 @@ }, "git_transport_ssh_with_paths": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 149, "lineto": 149, "args": [ @@ -22498,12 +24016,12 @@ "comment": " 0 or an error code" }, "description": "

Create an ssh transport with custom git command paths

\n", - "comments": "

This is a factory function suitable for setting as the transport callback in a remote (or for a clone in the options).

\n\n

The payload argument must be a strarray pointer with the paths for the git-upload-pack and git-receive-pack at index 0 and 1.

\n", + "comments": "

This is a factory function suitable for setting as the transport\n callback in a remote (or for a clone in the options).

\n\n

The payload argument must be a strarray pointer with the paths for\n the git-upload-pack and git-receive-pack at index 0 and 1.

\n", "group": "transport" }, "git_transport_register": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 164, "lineto": 167, "args": [ @@ -22530,12 +24048,12 @@ "comment": " 0 or an error code" }, "description": "

Add a custom transport definition, to be used in addition to the built-in\n set of transports that come with libgit2.

\n", - "comments": "

The caller is responsible for synchronizing calls to git_transport_register and git_transport_unregister with other calls to the library that instantiate transports.

\n", + "comments": "

The caller is responsible for synchronizing calls to git_transport_register\n and git_transport_unregister with other calls to the library that\n instantiate transports.

\n", "group": "transport" }, "git_transport_unregister": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 177, "lineto": 178, "args": [ @@ -22557,7 +24075,7 @@ }, "git_transport_dummy": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 191, "lineto": 194, "args": [ @@ -22589,7 +24107,7 @@ }, "git_transport_local": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 204, "lineto": 207, "args": [ @@ -22621,7 +24139,7 @@ }, "git_transport_smart": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 217, "lineto": 220, "args": [ @@ -22653,7 +24171,7 @@ }, "git_transport_smart_certificate_check": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 231, "lineto": 231, "args": [ @@ -22690,7 +24208,7 @@ }, "git_transport_smart_credentials": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 242, "lineto": 242, "args": [ @@ -22727,7 +24245,7 @@ }, "git_transport_smart_proxy_options": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 252, "lineto": 252, "args": [ @@ -22754,7 +24272,7 @@ }, "git_smart_subtransport_http": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 362, "lineto": 365, "args": [ @@ -22786,7 +24304,7 @@ }, "git_smart_subtransport_git": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 374, "lineto": 377, "args": [ @@ -22818,7 +24336,7 @@ }, "git_smart_subtransport_ssh": { "type": "function", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 386, "lineto": 389, "args": [ @@ -22850,7 +24368,7 @@ }, "git_tag_lookup": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 33, "lineto": 34, "args": [ @@ -22887,7 +24405,7 @@ }, "git_tag_lookup_prefix": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 48, "lineto": 49, "args": [ @@ -22924,7 +24442,7 @@ }, "git_tag_free": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 61, "lineto": 61, "args": [ @@ -22941,7 +24459,7 @@ "comment": null }, "description": "

Close an open tag

\n", - "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", + "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to\n release memory. Failure to do so will cause a memory leak.

\n", "group": "tag", "examples": { "general.c": [ @@ -22951,7 +24469,7 @@ }, "git_tag_id": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 69, "lineto": 69, "args": [ @@ -22973,7 +24491,7 @@ }, "git_tag_owner": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 77, "lineto": 77, "args": [ @@ -22995,7 +24513,7 @@ }, "git_tag_target": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 89, "lineto": 89, "args": [ @@ -23017,7 +24535,7 @@ "comment": " 0 or an error code" }, "description": "

Get the tagged object of a tag

\n", - "comments": "

This method performs a repository lookup for the given object and returns it

\n", + "comments": "

This method performs a repository lookup for the\n given object and returns it

\n", "group": "tag", "examples": { "general.c": [ @@ -23027,7 +24545,7 @@ }, "git_tag_target_id": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 97, "lineto": 97, "args": [ @@ -23054,7 +24572,7 @@ }, "git_tag_target_type": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 105, "lineto": 105, "args": [ @@ -23084,7 +24602,7 @@ }, "git_tag_name": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 113, "lineto": 113, "args": [ @@ -23117,7 +24635,7 @@ }, "git_tag_tagger": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 121, "lineto": 121, "args": [ @@ -23144,7 +24662,7 @@ }, "git_tag_message": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 129, "lineto": 129, "args": [ @@ -23178,7 +24696,7 @@ }, "git_tag_create": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 171, "lineto": 178, "args": [ @@ -23225,7 +24743,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it" }, "description": "

Create a new tag in the repository from an object

\n", - "comments": "

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.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", + "comments": "

A new reference will also be created pointing to\n this tag object. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The message will not be cleaned up. This can be achieved\n through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid\n the characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\n sequences ".." and "\n@\n{" which have special meaning to revparse.

\n", "group": "tag", "examples": { "tag.c": [ @@ -23235,7 +24753,7 @@ }, "git_tag_annotation_create": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 203, "lineto": 209, "args": [ @@ -23277,12 +24795,12 @@ "comment": " 0 on success or an error code" }, "description": "

Create a new tag in the object database pointing to a git_object

\n", - "comments": "

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n", + "comments": "

The message will not be cleaned up. This can be achieved\n through git_message_prettify().

\n", "group": "tag" }, "git_tag_create_frombuffer": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 220, "lineto": 224, "args": [ @@ -23319,7 +24837,7 @@ }, "git_tag_create_lightweight": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 256, "lineto": 261, "args": [ @@ -23356,7 +24874,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object" }, "description": "

Create a new lightweight tag pointing at a target object

\n", - "comments": "

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.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

A new direct reference will be created pointing to\n this target object. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The tag name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", "group": "tag", "examples": { "tag.c": [ @@ -23366,7 +24884,7 @@ }, "git_tag_delete": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 276, "lineto": 278, "args": [ @@ -23388,7 +24906,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" }, "description": "

Delete an existing tag reference.

\n", - "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

The tag name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", "group": "tag", "examples": { "tag.c": [ @@ -23398,7 +24916,7 @@ }, "git_tag_list": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 293, "lineto": 295, "args": [ @@ -23420,12 +24938,12 @@ "comment": " 0 or an error code" }, "description": "

Fill a list with all the tags in the Repository

\n", - "comments": "

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.

\n", + "comments": "

The string array will be filled with the names of the\n matching tags; these values are owned by the user and\n should be free'd manually when no longer needed, using\n git_strarray_free.

\n", "group": "tag" }, "git_tag_list_match": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 315, "lineto": 318, "args": [ @@ -23452,7 +24970,7 @@ "comment": " 0 or an error code" }, "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", - "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

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.

\n", + "comments": "

If an empty pattern is provided, all the tags\n will be returned.

\n\n

The string array will be filled with the names of the\n matching tags; these values are owned by the user and\n should be free'd manually when no longer needed, using\n git_strarray_free.

\n", "group": "tag", "examples": { "tag.c": [ @@ -23462,7 +24980,7 @@ }, "git_tag_foreach": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 330, "lineto": 333, "args": [ @@ -23494,7 +25012,7 @@ }, "git_tag_peel": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 346, "lineto": 348, "args": [ @@ -23516,12 +25034,12 @@ "comment": " 0 or an error code" }, "description": "

Recursively peel a tag until a non tag git_object is found

\n", - "comments": "

The retrieved tag_target object is owned by the repository and should be closed with the git_object_free method.

\n", + "comments": "

The retrieved tag_target object is owned by the repository\n and should be closed with the git_object_free method.

\n", "group": "tag" }, "git_tag_dup": { "type": "function", - "file": "tag.h", + "file": "git2/tag.h", "line": 357, "lineto": 357, "args": [ @@ -23548,7 +25066,7 @@ }, "git_trace_set": { "type": "function", - "file": "trace.h", + "file": "git2/trace.h", "line": 63, "lineto": 63, "args": [ @@ -23573,11 +25091,252 @@ "comments": "", "group": "trace" }, + "git_transaction_new": { + "type": "function", + "file": "git2/transaction.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "out", + "type": "git_transaction **", + "comment": "the resulting transaction" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to lock" + } + ], + "argline": "git_transaction **out, git_repository *repo", + "sig": "git_transaction **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a new transaction object

\n", + "comments": "

This does not lock anything, but sets up the transaction object to\n know from which repository to lock.

\n", + "group": "transaction" + }, + "git_transaction_lock_ref": { + "type": "function", + "file": "git2/transaction.h", + "line": 44, + "lineto": 44, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to lock" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error message" + }, + "description": "

Lock a reference

\n", + "comments": "

Lock the specified reference. This is the first step to updating a\n reference.

\n", + "group": "transaction" + }, + "git_transaction_set_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 59, + "lineto": 59, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const git_oid *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const git_oid *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be\n locked.

\n", + "group": "transaction" + }, + "git_transaction_set_symbolic_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 74, + "lineto": 74, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const char *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const char *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be\n locked.

\n", + "group": "transaction" + }, + "git_transaction_set_reflog": { + "type": "function", + "file": "git2/transaction.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference whose reflog to set" + }, + { + "name": "reflog", + "type": "const git_reflog *", + "comment": "the reflog as it should be written out" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_reflog *reflog", + "sig": "git_transaction *::const char *::const git_reflog *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the reflog of a reference

\n", + "comments": "

Set the specified reference's reflog. If this is combined with\n setting the target, that update won't be written to the reflog.

\n", + "group": "transaction" + }, + "git_transaction_remove": { + "type": "function", + "file": "git2/transaction.h", + "line": 96, + "lineto": 96, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to remove" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Remove a reference

\n", + "comments": "", + "group": "transaction" + }, + "git_transaction_commit": { + "type": "function", + "file": "git2/transaction.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Commit the changes from the transaction

\n", + "comments": "

Perform the changes that have been queued. The updates will be made\n one by one, and the first failure will stop the processing.

\n", + "group": "transaction" + }, + "git_transaction_free": { + "type": "function", + "file": "git2/transaction.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the resources allocated by this transaction

\n", + "comments": "

If any references remain locked, they will be unlocked without any\n changes made to them.

\n", + "group": "transaction" + }, "git_cred_has_username": { "type": "function", - "file": "transport.h", - "line": 190, - "lineto": 190, + "file": "git2/transport.h", + "line": 219, + "lineto": 219, "args": [ { "name": "cred", @@ -23597,9 +25356,9 @@ }, "git_cred_userpass_plaintext_new": { "type": "function", - "file": "transport.h", - "line": 201, - "lineto": 204, + "file": "git2/transport.h", + "line": 230, + "lineto": 233, "args": [ { "name": "out", @@ -23629,9 +25388,9 @@ }, "git_cred_ssh_key_new": { "type": "function", - "file": "transport.h", - "line": 217, - "lineto": 222, + "file": "git2/transport.h", + "line": 246, + "lineto": 251, "args": [ { "name": "out", @@ -23671,9 +25430,9 @@ }, "git_cred_ssh_interactive_new": { "type": "function", - "file": "transport.h", - "line": 233, - "lineto": 237, + "file": "git2/transport.h", + "line": 262, + "lineto": 266, "args": [ { "name": "out", @@ -23708,9 +25467,9 @@ }, "git_cred_ssh_key_from_agent": { "type": "function", - "file": "transport.h", - "line": 247, - "lineto": 249, + "file": "git2/transport.h", + "line": 276, + "lineto": 278, "args": [ { "name": "out", @@ -23735,9 +25494,9 @@ }, "git_cred_ssh_custom_new": { "type": "function", - "file": "transport.h", - "line": 269, - "lineto": 275, + "file": "git2/transport.h", + "line": 298, + "lineto": 304, "args": [ { "name": "out", @@ -23777,14 +25536,14 @@ "comment": " 0 for success or an error code for failure" }, "description": "

Create an ssh key credential with a custom signing function.

\n", - "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", + "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness\n and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", "group": "cred" }, "git_cred_default_new": { "type": "function", - "file": "transport.h", - "line": 283, - "lineto": 283, + "file": "git2/transport.h", + "line": 312, + "lineto": 312, "args": [ { "name": "out", @@ -23804,9 +25563,9 @@ }, "git_cred_username_new": { "type": "function", - "file": "transport.h", - "line": 291, - "lineto": 291, + "file": "git2/transport.h", + "line": 320, + "lineto": 320, "args": [ { "name": "cred", @@ -23826,14 +25585,14 @@ "comment": null }, "description": "

Create a credential to specify a username.

\n", - "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", + "comments": "

This is used with ssh authentication to query for the username if\n none is specified in the url.

\n", "group": "cred" }, "git_cred_ssh_key_memory_new": { "type": "function", - "file": "transport.h", - "line": 303, - "lineto": 308, + "file": "git2/transport.h", + "line": 332, + "lineto": 337, "args": [ { "name": "out", @@ -23873,9 +25632,9 @@ }, "git_cred_free": { "type": "function", - "file": "transport.h", - "line": 319, - "lineto": 319, + "file": "git2/transport.h", + "line": 348, + "lineto": 348, "args": [ { "name": "cred", @@ -23890,12 +25649,12 @@ "comment": null }, "description": "

Free a credential.

\n", - "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", + "comments": "

This is only necessary if you own the object; that is, if you are a\n transport.

\n", "group": "cred" }, "git_tree_lookup": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 32, "lineto": 33, "args": [ @@ -23933,13 +25692,13 @@ "ex/HEAD/init.html#git_tree_lookup-14" ], "merge.c": [ - "ex/HEAD/merge.html#git_tree_lookup-46" + "ex/HEAD/merge.html#git_tree_lookup-41" ] } }, "git_tree_lookup_prefix": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 47, "lineto": 51, "args": [ @@ -23976,7 +25735,7 @@ }, "git_tree_free": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 63, "lineto": 63, "args": [ @@ -23993,7 +25752,7 @@ "comment": null }, "description": "

Close an open tree

\n", - "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", + "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to\n release memory. Failure to do so will cause a memory leak.

\n", "group": "tree", "examples": { "diff.c": [ @@ -24018,7 +25777,7 @@ }, "git_tree_id": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 71, "lineto": 71, "args": [ @@ -24040,7 +25799,7 @@ }, "git_tree_owner": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 79, "lineto": 79, "args": [ @@ -24062,7 +25821,7 @@ }, "git_tree_entrycount": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 87, "lineto": 87, "args": [ @@ -24092,7 +25851,7 @@ }, "git_tree_entry_byname": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 99, "lineto": 100, "args": [ @@ -24114,7 +25873,7 @@ "comment": " the tree entry; NULL if not found" }, "description": "

Lookup a tree entry by its filename

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n", "group": "tree", "examples": { "general.c": [ @@ -24124,7 +25883,7 @@ }, "git_tree_entry_byindex": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 112, "lineto": 113, "args": [ @@ -24146,7 +25905,7 @@ "comment": " the tree entry; NULL if not found" }, "description": "

Lookup a tree entry by its position in the tree

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n", "group": "tree", "examples": { "cat-file.c": [ @@ -24159,7 +25918,7 @@ }, "git_tree_entry_byid": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 127, "lineto": 128, "args": [ @@ -24181,12 +25940,12 @@ "comment": " the tree entry; NULL if not found" }, "description": "

Lookup a tree entry by SHA value.

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", "group": "tree" }, "git_tree_entry_bypath": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 142, "lineto": 145, "args": [ @@ -24213,12 +25972,12 @@ "comment": " 0 on success; GIT_ENOTFOUND if the path does not exist" }, "description": "

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n", - "comments": "

Unlike the other lookup functions, the returned tree entry is owned by the user and must be freed explicitly with git_tree_entry_free().

\n", + "comments": "

Unlike the other lookup functions, the returned tree entry is owned by\n the user and must be freed explicitly with git_tree_entry_free().

\n", "group": "tree" }, "git_tree_entry_dup": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 157, "lineto": 157, "args": [ @@ -24240,12 +25999,12 @@ "comment": " 0 or an error code" }, "description": "

Duplicate a tree entry

\n", - "comments": "

Create a copy of a tree entry. The returned copy is owned by the user, and must be freed explicitly with git_tree_entry_free().

\n", + "comments": "

Create a copy of a tree entry. The returned copy is owned by the user,\n and must be freed explicitly with git_tree_entry_free().

\n", "group": "tree" }, "git_tree_entry_free": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 168, "lineto": 168, "args": [ @@ -24262,12 +26021,12 @@ "comment": null }, "description": "

Free a user-owned tree entry

\n", - "comments": "

IMPORTANT: This function is only needed for tree entries owned by the user, such as the ones returned by git_tree_entry_dup() or git_tree_entry_bypath().

\n", + "comments": "

IMPORTANT: This function is only needed for tree entries owned by the\n user, such as the ones returned by git_tree_entry_dup() or\n git_tree_entry_bypath().

\n", "group": "tree" }, "git_tree_entry_name": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 176, "lineto": 176, "args": [ @@ -24298,7 +26057,7 @@ }, "git_tree_entry_id": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 184, "lineto": 184, "args": [ @@ -24325,7 +26084,7 @@ }, "git_tree_entry_type": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 192, "lineto": 192, "args": [ @@ -24352,7 +26111,7 @@ }, "git_tree_entry_filemode": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 200, "lineto": 200, "args": [ @@ -24379,7 +26138,7 @@ }, "git_tree_entry_filemode_raw": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 212, "lineto": 212, "args": [ @@ -24396,12 +26155,12 @@ "comment": " filemode as an integer" }, "description": "

Get the raw UNIX file attributes of a tree entry

\n", - "comments": "

This function does not perform any normalization and is only useful if you need to be able to recreate the original tree object.

\n", + "comments": "

This function does not perform any normalization and is only useful\n if you need to be able to recreate the original tree object.

\n", "group": "tree" }, "git_tree_entry_cmp": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 220, "lineto": 220, "args": [ @@ -24428,7 +26187,7 @@ }, "git_tree_entry_to_object": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 232, "lineto": 235, "args": [ @@ -24465,7 +26224,7 @@ }, "git_treebuilder_new": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 254, "lineto": 255, "args": [ @@ -24492,12 +26251,12 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Create a new tree builder.

\n", - "comments": "

The tree builder can be used to create or modify trees in memory and write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no entries and will have to be filled manually.

\n", + "comments": "

The tree builder can be used to create or modify trees in memory and\n write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be\n initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no\n entries and will have to be filled manually.

\n", "group": "treebuilder" }, "git_treebuilder_clear": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 262, "lineto": 262, "args": [ @@ -24519,7 +26278,7 @@ }, "git_treebuilder_entrycount": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 270, "lineto": 270, "args": [ @@ -24541,7 +26300,7 @@ }, "git_treebuilder_free": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 281, "lineto": 281, "args": [ @@ -24558,12 +26317,12 @@ "comment": null }, "description": "

Free a tree builder

\n", - "comments": "

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

\n", + "comments": "

This will clear all the entries and free to builder.\n Failing to free the builder after you're done using it\n will result in a memory leak

\n", "group": "treebuilder" }, "git_treebuilder_get": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 293, "lineto": 294, "args": [ @@ -24585,12 +26344,12 @@ "comment": " pointer to the entry; NULL if not found" }, "description": "

Get an entry from the builder from its filename

\n", - "comments": "

The returned entry is owned by the builder and should not be freed manually.

\n", + "comments": "

The returned entry is owned by the builder and should\n not be freed manually.

\n", "group": "treebuilder" }, "git_treebuilder_insert": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 324, "lineto": 329, "args": [ @@ -24627,12 +26386,12 @@ "comment": " 0 or an error code" }, "description": "

Add or update an entry to the builder

\n", - "comments": "

Insert a new entry for filename in the builder with the given attributes.

\n\n

If an entry named filename already exists, its attributes will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the newly created/updated entry. Pass NULL if you do not need it. The pointer may not be valid past the next operation in this builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for validity; that it exists in the object database and is of the correct type. If you do not want this behavior, set the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", + "comments": "

Insert a new entry for filename in the builder with the\n given attributes.

\n\n

If an entry named filename already exists, its attributes\n will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the\n newly created/updated entry. Pass NULL if you do not need it. The\n pointer may not be valid past the next operation in this\n builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for\n validity; that it exists in the object database and is of the\n correct type. If you do not want this behavior, set the\n GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", "group": "treebuilder" }, "git_treebuilder_remove": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 337, "lineto": 338, "args": [ @@ -24659,7 +26418,7 @@ }, "git_treebuilder_filter": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 361, "lineto": 364, "args": [ @@ -24686,12 +26445,12 @@ "comment": null }, "description": "

Selectively remove entries in the tree

\n", - "comments": "

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 non-zero, the entry will be filtered (removed from the builder).

\n", + "comments": "

The filter callback will be called for each entry in the tree with a\n pointer to the entry and the provided payload; if the callback returns\n non-zero, the entry will be filtered (removed from the builder).

\n", "group": "treebuilder" }, "git_treebuilder_write": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 376, "lineto": 377, "args": [ @@ -24713,12 +26472,12 @@ "comment": " 0 or an error code" }, "description": "

Write the contents of the tree builder as a tree object

\n", - "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", + "comments": "

The tree builder will be written to the given repo, and its\n identifying SHA1 hash will be stored in the id pointer.

\n", "group": "treebuilder" }, "git_treebuilder_write_with_buffer": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 390, "lineto": 391, "args": [ @@ -24750,7 +26509,7 @@ }, "git_tree_walk": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 420, "lineto": 424, "args": [ @@ -24782,12 +26541,12 @@ "comment": " 0 or an error code" }, "description": "

Traverse the entries in a tree and its subtrees in post or pre order.

\n", - "comments": "

The entries will be traversed in the specified order, children subtrees will be automatically loaded as required, and the callback will be called once per entry with the current (relative) root for the entry and the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be skipped on the traversal (in pre mode). A negative value stops the walk.

\n", + "comments": "

The entries will be traversed in the specified order, children subtrees\n will be automatically loaded as required, and the callback will be\n called once per entry with the current (relative) root for the entry and\n the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be\n skipped on the traversal (in pre mode). A negative value stops the walk.

\n", "group": "tree" }, "git_tree_dup": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 433, "lineto": 433, "args": [ @@ -24814,7 +26573,7 @@ }, "git_tree_create_updated": { "type": "function", - "file": "tree.h", + "file": "git2/tree.h", "line": 479, "lineto": 479, "args": [ @@ -24851,12 +26610,12 @@ "comment": null }, "description": "

Create a tree based on another one with the specified modifications

\n", - "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", + "comments": "

Given the baseline perform the changes described in the list of\n updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and\n replacement in trees. It is much more efficient than reading the tree into a\n git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing\n a tree to a blob or viceversa is not supported.

\n", "group": "tree" }, "git_worktree_list": { "type": "function", - "file": "worktree.h", + "file": "git2/worktree.h", "line": 34, "lineto": 34, "args": [ @@ -24878,12 +26637,12 @@ "comment": " 0 or an error code" }, "description": "

List names of linked working trees

\n", - "comments": "

The returned list should be released with git_strarray_free when no longer needed.

\n", + "comments": "

The returned list should be released with git_strarray_free\n when no longer needed.

\n", "group": "worktree" }, "git_worktree_lookup": { "type": "function", - "file": "worktree.h", + "file": "git2/worktree.h", "line": 44, "lineto": 44, "args": [ @@ -24915,7 +26674,7 @@ }, "git_worktree_open_from_repository": { "type": "function", - "file": "worktree.h", + "file": "git2/worktree.h", "line": 56, "lineto": 56, "args": [ @@ -24937,12 +26696,12 @@ "comment": null }, "description": "

Open a worktree of a given repository

\n", - "comments": "

If a repository is not the main tree but a worktree, this function will look up the worktree inside the parent repository and create a new git_worktree structure.

\n", + "comments": "

If a repository is not the main tree but a worktree, this\n function will look up the worktree inside the parent\n repository and create a new git_worktree structure.

\n", "group": "worktree" }, "git_worktree_free": { "type": "function", - "file": "worktree.h", + "file": "git2/worktree.h", "line": 63, "lineto": 63, "args": [ @@ -24964,7 +26723,7 @@ }, "git_worktree_validate": { "type": "function", - "file": "worktree.h", + "file": "git2/worktree.h", "line": 75, "lineto": 75, "args": [ @@ -24981,24 +26740,24 @@ "comment": " 0 when worktree is valid, error-code otherwise" }, "description": "

Check if worktree is valid

\n", - "comments": "

A valid worktree requires both the git data structures inside the linked parent repository and the linked working copy to be present.

\n", + "comments": "

A valid worktree requires both the git data structures inside\n the linked parent repository and the linked working copy to be\n present.

\n", "group": "worktree" }, "git_worktree_add_init_options": { "type": "function", - "file": "worktree.h", - "line": 95, - "lineto": 96, + "file": "git2/worktree.h", + "line": 104, + "lineto": 105, "args": [ { "name": "opts", "type": "git_worktree_add_options *", - "comment": "the struct to initialize" + "comment": "The `git_worktree_add_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Verison of struct; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`." } ], "argline": "git_worktree_add_options *opts, unsigned int version", @@ -25007,15 +26766,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_worktree_add_options with default vaules.\n Equivalent to creating an instance with\n GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_worktree_add_options structure

\n", + "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to\n creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", "group": "worktree" }, "git_worktree_add": { "type": "function", - "file": "worktree.h", - "line": 112, - "lineto": 114, + "file": "git2/worktree.h", + "line": 121, + "lineto": 123, "args": [ { "name": "out", @@ -25050,14 +26809,14 @@ "comment": " 0 or an error code" }, "description": "

Add a new working tree

\n", - "comments": "

Add a new working tree for the repository, that is create the required data structures inside the repository and check out the current HEAD at path

\n", + "comments": "

Add a new working tree for the repository, that is create the\n required data structures inside the repository and check out\n the current HEAD at path

\n", "group": "worktree" }, "git_worktree_lock": { "type": "function", - "file": "worktree.h", - "line": 126, - "lineto": 126, + "file": "git2/worktree.h", + "line": 135, + "lineto": 135, "args": [ { "name": "wt", @@ -25077,14 +26836,14 @@ "comment": " 0 on success, non-zero otherwise" }, "description": "

Lock worktree if not already locked

\n", - "comments": "

Lock a worktree, optionally specifying a reason why the linked working tree is being locked.

\n", + "comments": "

Lock a worktree, optionally specifying a reason why the linked\n working tree is being locked.

\n", "group": "worktree" }, "git_worktree_unlock": { "type": "function", - "file": "worktree.h", - "line": 135, - "lineto": 135, + "file": "git2/worktree.h", + "line": 144, + "lineto": 144, "args": [ { "name": "wt", @@ -25104,9 +26863,9 @@ }, "git_worktree_is_locked": { "type": "function", - "file": "worktree.h", - "line": 149, - "lineto": 149, + "file": "git2/worktree.h", + "line": 158, + "lineto": 158, "args": [ { "name": "reason", @@ -25126,24 +26885,68 @@ "comment": " 0 when the working tree not locked, a value greater\n than zero if it is locked, less than zero if there was an\n error" }, "description": "

Check if worktree is locked

\n", - "comments": "

A worktree may be locked if the linked working tree is stored on a portable device which is not available.

\n", + "comments": "

A worktree may be locked if the linked working tree is stored\n on a portable device which is not available.

\n", + "group": "worktree" + }, + "git_worktree_name": { + "type": "function", + "file": "git2/worktree.h", + "line": 167, + "lineto": 167, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the name for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's name. The pointer returned is valid for the\n lifetime of the git_worktree" + }, + "description": "

Retrieve the name of the worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_path": { + "type": "function", + "file": "git2/worktree.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the path for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's filesystem path. The pointer returned\n is valid for the lifetime of the git_worktree." + }, + "description": "

Retrieve the filesystem path for the worktree

\n", + "comments": "", "group": "worktree" }, "git_worktree_prune_init_options": { "type": "function", - "file": "worktree.h", - "line": 182, - "lineto": 184, + "file": "git2/worktree.h", + "line": 217, + "lineto": 219, "args": [ { "name": "opts", "type": "git_worktree_prune_options *", - "comment": "the struct to initialize" + "comment": "The `git_worktree_prune_options` struct to initialize." }, { "name": "version", "type": "unsigned int", - "comment": "Verison of struct; pass `GIT_WORKTREE_PRUNE_OPTIONS_VERSION`" + "comment": "The struct version; pass `GIT_WORKTREE_PRUNE_OPTIONS_VERSION`." } ], "argline": "git_worktree_prune_options *opts, unsigned int version", @@ -25152,15 +26955,15 @@ "type": "int", "comment": " Zero on success; -1 on failure." }, - "description": "

Initializes a git_worktree_prune_options with default vaules.\n Equivalent to creating an instance with\n GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", - "comments": "", + "description": "

Initialize git_worktree_prune_options structure

\n", + "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to\n creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", "group": "worktree" }, "git_worktree_is_prunable": { "type": "function", - "file": "worktree.h", - "line": 200, - "lineto": 201, + "file": "git2/worktree.h", + "line": 235, + "lineto": 236, "args": [ { "name": "wt", @@ -25180,14 +26983,14 @@ "comment": null }, "description": "

Is the worktree prunable with the given options?

\n", - "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The valid member will cause this check to be ignored. - the worktree is locked. The locked flag will cause this check to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above flags have been passed in, this function will return a positive value.

\n", + "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The\nvalid member will cause this check to be ignored.
  • \n
  • the worktree is locked. The locked flag will cause this\ncheck to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above\n flags have been passed in, this function will return a\n positive value.

\n", "group": "worktree" }, "git_worktree_prune": { "type": "function", - "file": "worktree.h", - "line": 215, - "lineto": 216, + "file": "git2/worktree.h", + "line": 250, + "lineto": 251, "args": [ { "name": "wt", @@ -25207,14 +27010,45 @@ "comment": " 0 or an error code" }, "description": "

Prune working tree

\n", - "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", + "comments": "

Prune the working tree, that is remove the git data\n structures on disk. The repository will only be pruned of\n git_worktree_is_prunable succeeds.

\n", "group": "worktree" } }, "callbacks": { + "git_attr_foreach_cb": { + "type": "callback", + "file": "git2/attr.h", + "line": 205, + "lineto": 205, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The attribute name." + }, + { + "name": "value", + "type": "const char *", + "comment": "The attribute value. May be NULL if the attribute is explicitly\n set to UNSPECIFIED using the '!' sign." + }, + { + "name": "payload", + "type": "void *", + "comment": "A user-specified pointer." + } + ], + "argline": "const char *name, const char *value, void *payload", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to continue looping, non-zero to stop. This value will be returned\n from git_attr_foreach." + }, + "description": "

The callback used with git_attr_foreach.

\n", + "comments": "

This callback will be invoked only once per attribute name, even if there\n are multiple rules for a given file. The highest priority rule will be\n used.

\n" + }, "git_checkout_notify_cb": { "type": "callback", - "file": "checkout.h", + "file": "git2/checkout.h", "line": 223, "lineto": 229, "args": [ @@ -25260,7 +27094,7 @@ }, "git_checkout_progress_cb": { "type": "callback", - "file": "checkout.h", + "file": "git2/checkout.h", "line": 232, "lineto": 236, "args": [ @@ -25296,7 +27130,7 @@ }, "git_checkout_perfdata_cb": { "type": "callback", - "file": "checkout.h", + "file": "git2/checkout.h", "line": 239, "lineto": 241, "args": [ @@ -25322,7 +27156,7 @@ }, "git_remote_create_cb": { "type": "callback", - "file": "clone.h", + "file": "git2/clone.h", "line": 69, "lineto": 74, "args": [ @@ -25359,11 +27193,11 @@ "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" }, "description": "

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n", - "comments": "

Callers of git_clone may provide a function matching this signature to override the remote creation and customization process during a clone operation.

\n" + "comments": "

Callers of git_clone may provide a function matching this signature to override\n the remote creation and customization process during a clone operation.

\n" }, "git_repository_create_cb": { "type": "callback", - "file": "clone.h", + "file": "git2/clone.h", "line": 90, "lineto": 94, "args": [ @@ -25395,13 +27229,39 @@ "comment": " 0, or a negative value to indicate error" }, "description": "

The signature of a function matchin git_repository_init, with an\n aditional void * as callback payload.

\n", - "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" + "comments": "

Callers of git_clone my provide a function matching this signature\n to override the repository creation and customization process\n during a clone operation.

\n" + }, + "git_config_foreach_cb": { + "type": "callback", + "file": "git2/config.h", + "line": 84, + "lineto": 84, + "args": [ + { + "name": "entry", + "type": "const git_config_entry *", + "comment": "the entry currently being enumerated" + }, + { + "name": "payload", + "type": "void *", + "comment": "a user-specified pointer" + } + ], + "argline": "const git_config_entry *entry, void *payload", + "sig": "const git_config_entry *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

A config enumeration callback

\n", + "comments": "" }, "git_diff_notify_cb": { "type": "callback", - "file": "diff.h", - "line": 359, - "lineto": 363, + "file": "git2/diff.h", + "line": 331, + "lineto": 335, "args": [ { "name": "diff_so_far", @@ -25431,13 +27291,13 @@ "comment": null }, "description": "

Diff notification callback function.

\n", - "comments": "

The callback will be called for each file, just before the git_delta_t gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" + "comments": "

The callback will be called for each file, just before the git_diff_delta\n gets inserted into the diff.

\n\n

When the callback:\n - returns \n<\n 0, the diff process will be aborted.\n - returns > 0, the delta will not be inserted into the diff, but the\n diff process continues.\n - returns 0, the delta is inserted into the diff, and the diff process\n continues.

\n" }, "git_diff_progress_cb": { "type": "callback", - "file": "diff.h", - "line": 375, - "lineto": 379, + "file": "git2/diff.h", + "line": 347, + "lineto": 351, "args": [ { "name": "diff_so_far", @@ -25471,9 +27331,9 @@ }, "git_diff_file_cb": { "type": "callback", - "file": "diff.h", - "line": 458, - "lineto": 461, + "file": "git2/diff.h", + "line": 465, + "lineto": 468, "args": [ { "name": "delta", @@ -25502,9 +27362,9 @@ }, "git_diff_binary_cb": { "type": "callback", - "file": "diff.h", - "line": 515, - "lineto": 518, + "file": "git2/diff.h", + "line": 531, + "lineto": 534, "args": [ { "name": "delta", @@ -25533,9 +27393,9 @@ }, "git_diff_hunk_cb": { "type": "callback", - "file": "diff.h", - "line": 535, - "lineto": 538, + "file": "git2/diff.h", + "line": 557, + "lineto": 560, "args": [ { "name": "delta", @@ -25564,9 +27424,9 @@ }, "git_diff_line_cb": { "type": "callback", - "file": "diff.h", - "line": 588, - "lineto": 592, + "file": "git2/diff.h", + "line": 618, + "lineto": 622, "args": [ { "name": "delta", @@ -25596,11 +27456,11 @@ "comment": null }, "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", - "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" + "comments": "

When printing a diff, callback that will be made to output each line\n of text. This uses some extra GIT_DIFF_LINE_... constants for output\n of lines of file and hunk headers.

\n" }, "git_index_matched_path_cb": { "type": "callback", - "file": "index.h", + "file": "git2/index.h", "line": 146, "lineto": 147, "args": [ @@ -25631,7 +27491,7 @@ }, "git_headlist_cb": { "type": "callback", - "file": "net.h", + "file": "git2/net.h", "line": 55, "lineto": 55, "args": [ @@ -25657,7 +27517,7 @@ }, "git_note_foreach_cb": { "type": "callback", - "file": "notes.h", + "file": "git2/notes.h", "line": 29, "lineto": 30, "args": [ @@ -25684,11 +27544,11 @@ "comment": null }, "description": "

Callback for git_note_foreach.

\n", - "comments": "

Receives: - blob_id: Oid of the blob containing the message - annotated_object_id: Oid of the git object being annotated - payload: Payload data passed to git_note_foreach

\n" + "comments": "

Receives:\n - blob_id: Oid of the blob containing the message\n - annotated_object_id: Oid of the git object being annotated\n - payload: Payload data passed to git_note_foreach

\n" }, "git_odb_foreach_cb": { "type": "callback", - "file": "odb.h", + "file": "git2/odb.h", "line": 27, "lineto": 27, "args": [ @@ -25712,9 +27572,40 @@ "description": "

Function type for callbacks from git_odb_foreach.

\n", "comments": "" }, + "git_packbuilder_foreach_cb": { + "type": "callback", + "file": "git2/pack.h", + "line": 181, + "lineto": 181, + "args": [ + { + "name": "buf", + "type": "void *", + "comment": null + }, + { + "name": "size", + "type": "size_t", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "void *buf, size_t size, void *payload", + "sig": "void *::size_t::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" + }, "git_packbuilder_progress": { "type": "callback", - "file": "pack.h", + "file": "git2/pack.h", "line": 210, "lineto": 214, "args": [ @@ -25748,9 +27639,61 @@ "description": "

Packbuilder progress notification function

\n", "comments": "" }, + "git_reference_foreach_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 425, + "lineto": 425, + "args": [ + { + "name": "reference", + "type": "git_reference *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_reference *reference, void *payload", + "sig": "git_reference *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" + }, + "git_reference_foreach_name_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 426, + "lineto": 426, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const char *name, void *payload", + "sig": "const char *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" + }, "git_push_transfer_progress": { "type": "callback", - "file": "remote.h", + "file": "git2/remote.h", "line": 351, "lineto": 355, "args": [ @@ -25786,7 +27729,7 @@ }, "git_push_negotiation": { "type": "callback", - "file": "remote.h", + "file": "git2/remote.h", "line": 386, "lineto": 386, "args": [ @@ -25817,7 +27760,7 @@ }, "git_push_update_reference_cb": { "type": "callback", - "file": "remote.h", + "file": "git2/remote.h", "line": 400, "lineto": 400, "args": [ @@ -25844,11 +27787,78 @@ "comment": " 0 on success, otherwise an error" }, "description": "

Callback used to inform of the update status from the remote.

\n", - "comments": "

Called for each updated reference on push. If status is not NULL, the update was rejected by the remote server and status contains the reason given.

\n" + "comments": "

Called for each updated reference on push. If status is\n not NULL, the update was rejected by the remote server\n and status contains the reason given.

\n" + }, + "git_repository_fetchhead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 630, + "lineto": 634, + "args": [ + { + "name": "ref_name", + "type": "const char *", + "comment": null + }, + { + "name": "remote_url", + "type": "const char *", + "comment": null + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": null + }, + { + "name": "is_merge", + "type": "unsigned int", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload", + "sig": "const char *::const char *::const git_oid *::unsigned int::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" + }, + "git_repository_mergehead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 652, + "lineto": 653, + "args": [ + { + "name": "oid", + "type": "const git_oid *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_oid *oid, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" }, "git_revwalk_hide_cb": { "type": "callback", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 277, "lineto": 279, "args": [ @@ -25874,9 +27884,9 @@ }, "git_stash_apply_progress_cb": { "type": "callback", - "file": "stash.h", - "line": 113, - "lineto": 115, + "file": "git2/stash.h", + "line": 115, + "lineto": 117, "args": [ { "name": "progress", @@ -25900,9 +27910,9 @@ }, "git_stash_cb": { "type": "callback", - "file": "stash.h", - "line": 198, - "lineto": 202, + "file": "git2/stash.h", + "line": 201, + "lineto": 205, "args": [ { "name": "index", @@ -25916,7 +27926,7 @@ }, { "name": "stash_id", - "type": "const int *", + "type": "const git_oid *", "comment": "The commit oid of the stashed state." }, { @@ -25925,8 +27935,8 @@ "comment": "Extra parameter to callback function." } ], - "argline": "size_t index, const char *message, const int *stash_id, void *payload", - "sig": "size_t::const char *::const int *::void *", + "argline": "size_t index, const char *message, const git_oid *stash_id, void *payload", + "sig": "size_t::const char *::const git_oid *::void *", "return": { "type": "int", "comment": " 0 to continue iterating or non-zero to stop." @@ -25936,9 +27946,9 @@ }, "git_status_cb": { "type": "callback", - "file": "status.h", - "line": 61, - "lineto": 62, + "file": "git2/status.h", + "line": 63, + "lineto": 64, "args": [ { "name": "path", @@ -25967,7 +27977,7 @@ }, "git_submodule_cb": { "type": "callback", - "file": "submodule.h", + "file": "git2/submodule.h", "line": 118, "lineto": 119, "args": [ @@ -25998,7 +28008,7 @@ }, "git_filter_init_fn": { "type": "callback", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 141, "lineto": 141, "args": [ @@ -26015,11 +28025,11 @@ "comment": null }, "description": "

Initialize callback on filter

\n", - "comments": "

Specified as filter.initialize, this is an optional callback invoked before a filter is first used. It will be called once at most.

\n\n

If non-NULL, the filter's initialize callback will be invoked right before the first use of the filter, so you can defer expensive initialization operations (in case libgit2 is being used in a way that doesn't need the filter).

\n" + "comments": "

Specified as filter.initialize, this is an optional callback invoked\n before a filter is first used. It will be called once at most.

\n\n

If non-NULL, the filter's initialize callback will be invoked right\n before the first use of the filter, so you can defer expensive\n initialization operations (in case libgit2 is being used in a way that\n doesn't need the filter).

\n" }, "git_filter_shutdown_fn": { "type": "callback", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 153, "lineto": 153, "args": [ @@ -26036,11 +28046,11 @@ "comment": null }, "description": "

Shutdown callback on filter

\n", - "comments": "

Specified as filter.shutdown, this is an optional callback invoked when the filter is unregistered or when libgit2 is shutting down. It will be called once at most and should release resources as needed. This may be called even if the initialize callback was not made.

\n\n

Typically this function will free the git_filter object itself.

\n" + "comments": "

Specified as filter.shutdown, this is an optional callback invoked\n when the filter is unregistered or when libgit2 is shutting down. It\n will be called once at most and should release resources as needed.\n This may be called even if the initialize callback was not made.

\n\n

Typically this function will free the git_filter object itself.

\n" }, "git_filter_check_fn": { "type": "callback", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 175, "lineto": 179, "args": [ @@ -26072,11 +28082,11 @@ "comment": null }, "description": "

Callback to decide if a given source needs this filter

\n", - "comments": "

Specified as filter.check, this is an optional callback that checks if filtering is needed for a given source.

\n\n

It should return 0 if the filter should be applied (i.e. success), GIT_PASSTHROUGH if the filter should not be applied, or an error code to fail out of the filter processing pipeline and return to the caller.

\n\n

The attr_values will be set to the values of any attributes given in the filter definition. See git_filter below for more detail.

\n\n

The payload will be a pointer to a reference payload for the filter. This will start as NULL, but check can assign to this pointer for later use by the apply callback. Note that the value should be heap allocated (not stack), so that it doesn't go away before the apply callback can use it. If a filter allocates and assigns a value to the payload, it will need a cleanup callback to free the payload.

\n" + "comments": "

Specified as filter.check, this is an optional callback that checks\n if filtering is needed for a given source.

\n\n

It should return 0 if the filter should be applied (i.e. success),\n GIT_PASSTHROUGH if the filter should not be applied, or an error code\n to fail out of the filter processing pipeline and return to the caller.

\n\n

The attr_values will be set to the values of any attributes given in\n the filter definition. See git_filter below for more detail.

\n\n

The payload will be a pointer to a reference payload for the filter.\n This will start as NULL, but check can assign to this pointer for\n later use by the apply callback. Note that the value should be heap\n allocated (not stack), so that it doesn't go away before the apply\n callback can use it. If a filter allocates and assigns a value to the\n payload, it will need a cleanup callback to free the payload.

\n" }, "git_filter_apply_fn": { "type": "callback", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 193, "lineto": 198, "args": [ @@ -26113,11 +28123,52 @@ "comment": null }, "description": "

Callback to actually perform the data filtering

\n", - "comments": "

Specified as filter.apply, this is the callback that actually filters data. If it successfully writes the output, it should return 0. Like check, it can return GIT_PASSTHROUGH to indicate that the filter doesn't want to run. Other error codes will stop filter processing and return to the caller.

\n\n

The payload value will refer to any payload that was set by the check callback. It may be read from or written to as needed.

\n" + "comments": "

Specified as filter.apply, this is the callback that actually filters\n data. If it successfully writes the output, it should return 0. Like\n check, it can return GIT_PASSTHROUGH to indicate that the filter\n doesn't want to run. Other error codes will stop filter processing and\n return to the caller.

\n\n

The payload value will refer to any payload that was set by the\n check callback. It may be read from or written to as needed.

\n" + }, + "git_filter_stream_fn": { + "type": "callback", + "file": "git2/sys/filter.h", + "line": 200, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_writestream **", + "comment": null + }, + { + "name": "self", + "type": "git_filter *", + "comment": null + }, + { + "name": "payload", + "type": "void **", + "comment": null + }, + { + "name": "src", + "type": "const git_filter_source *", + "comment": null + }, + { + "name": "next", + "type": "git_writestream *", + "comment": null + } + ], + "argline": "git_writestream **out, git_filter *self, void **payload, const git_filter_source *src, git_writestream *next", + "sig": "git_writestream **::git_filter *::void **::const git_filter_source *::git_writestream *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" }, "git_filter_cleanup_fn": { "type": "callback", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 215, "lineto": 217, "args": [ @@ -26139,59 +28190,59 @@ "comment": null }, "description": "

Callback to clean up after filtering has been applied

\n", - "comments": "

Specified as filter.cleanup, this is an optional callback invoked after the filter has been applied. If the check or apply callbacks allocated a payload to keep per-source filter state, use this callback to free that payload and release resources as required.

\n" + "comments": "

Specified as filter.cleanup, this is an optional callback invoked\n after the filter has been applied. If the check or apply callbacks\n allocated a payload to keep per-source filter state, use this\n callback to free that payload and release resources as required.

\n" }, "git_merge_driver_init_fn": { "type": "callback", - "file": "sys/merge.h", - "line": 71, - "lineto": 71, + "file": "git2/sys/merge.h", + "line": 76, + "lineto": 76, "args": [ { "name": "self", - "type": "int *", + "type": "git_merge_driver *", "comment": null } ], - "argline": "int *self", - "sig": "int *", + "argline": "git_merge_driver *self", + "sig": "git_merge_driver *", "return": { "type": "int", "comment": null }, "description": "

Initialize callback on merge driver

\n", - "comments": "

Specified as driver.initialize, this is an optional callback invoked before a merge driver is first used. It will be called once at most per library lifetime.

\n\n

If non-NULL, the merge driver's initialize callback will be invoked right before the first use of the driver, so you can defer expensive initialization operations (in case libgit2 is being used in a way that doesn't need the merge driver).

\n" + "comments": "

Specified as driver.initialize, this is an optional callback invoked\n before a merge driver is first used. It will be called once at most\n per library lifetime.

\n\n

If non-NULL, the merge driver's initialize callback will be invoked\n right before the first use of the driver, so you can defer expensive\n initialization operations (in case libgit2 is being used in a way that\n doesn't need the merge driver).

\n" }, "git_merge_driver_shutdown_fn": { "type": "callback", - "file": "sys/merge.h", - "line": 83, - "lineto": 83, + "file": "git2/sys/merge.h", + "line": 88, + "lineto": 88, "args": [ { "name": "self", - "type": "int *", + "type": "git_merge_driver *", "comment": null } ], - "argline": "int *self", - "sig": "int *", + "argline": "git_merge_driver *self", + "sig": "git_merge_driver *", "return": { "type": "void", "comment": null }, "description": "

Shutdown callback on merge driver

\n", - "comments": "

Specified as driver.shutdown, this is an optional callback invoked when the merge driver is unregistered or when libgit2 is shutting down. It will be called once at most and should release resources as needed. This may be called even if the initialize callback was not made.

\n\n

Typically this function will free the git_merge_driver object itself.

\n" + "comments": "

Specified as driver.shutdown, this is an optional callback invoked\n when the merge driver is unregistered or when libgit2 is shutting down.\n It will be called once at most and should release resources as needed.\n This may be called even if the initialize callback was not made.

\n\n

Typically this function will free the git_merge_driver object itself.

\n" }, "git_merge_driver_apply_fn": { "type": "callback", - "file": "sys/merge.h", - "line": 103, - "lineto": 109, + "file": "git2/sys/merge.h", + "line": 108, + "lineto": 114, "args": [ { "name": "self", - "type": "int *", + "type": "git_merge_driver *", "comment": null }, { @@ -26201,12 +28252,12 @@ }, { "name": "mode_out", - "type": "int *", + "type": "uint32_t *", "comment": null }, { "name": "merged_out", - "type": "int *", + "type": "git_buf *", "comment": null }, { @@ -26220,18 +28271,111 @@ "comment": null } ], - "argline": "int *self, const char **path_out, int *mode_out, int *merged_out, const char *filter_name, const git_merge_driver_source *src", - "sig": "int *::const char **::int *::int *::const char *::const git_merge_driver_source *", + "argline": "git_merge_driver *self, const char **path_out, uint32_t *mode_out, git_buf *merged_out, const char *filter_name, const git_merge_driver_source *src", + "sig": "git_merge_driver *::const char **::uint32_t *::git_buf *::const char *::const git_merge_driver_source *", "return": { "type": "int", "comment": null }, "description": "

Callback to perform the merge.

\n", - "comments": "

Specified as driver.apply, this is the callback that actually does the merge. If it can successfully perform a merge, it should populate path_out with a pointer to the filename to accept, mode_out with the resultant mode, and merged_out with the buffer of the merged file and then return 0. If the driver returns GIT_PASSTHROUGH, then the default merge driver should instead be run. It can also return GIT_EMERGECONFLICT if the driver is not able to produce a merge result, and the file will remain conflicted. Any other errors will fail and return to the caller.

\n\n

The filter_name contains the name of the filter that was invoked, as specified by the file's attributes.

\n\n

The src contains the data about the file to be merged.

\n" + "comments": "

Specified as driver.apply, this is the callback that actually does the\n merge. If it can successfully perform a merge, it should populate\n path_out with a pointer to the filename to accept, mode_out with\n the resultant mode, and merged_out with the buffer of the merged file\n and then return 0. If the driver returns GIT_PASSTHROUGH, then the\n default merge driver should instead be run. It can also return\n GIT_EMERGECONFLICT if the driver is not able to produce a merge result,\n and the file will remain conflicted. Any other errors will fail and\n return to the caller.

\n\n

The filter_name contains the name of the filter that was invoked, as\n specified by the file's attributes.

\n\n

The src contains the data about the file to be merged.

\n" + }, + "git_stream_cb": { + "type": "callback", + "file": "git2/sys/stream.h", + "line": 43, + "lineto": 43, + "args": [ + { + "name": "out", + "type": "git_stream **", + "comment": null + }, + { + "name": "host", + "type": "const char *", + "comment": null + }, + { + "name": "port", + "type": "const char *", + "comment": null + } + ], + "argline": "git_stream **out, const char *host, const char *port", + "sig": "git_stream **::const char *::const char *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" + }, + "git_smart_subtransport_cb": { + "type": "callback", + "file": "git2/sys/transport.h", + "line": 325, + "lineto": 328, + "args": [ + { + "name": "out", + "type": "git_smart_subtransport **", + "comment": null + }, + { + "name": "owner", + "type": "git_transport *", + "comment": null + }, + { + "name": "param", + "type": "void *", + "comment": null + } + ], + "argline": "git_smart_subtransport **out, git_transport *owner, void *param", + "sig": "git_smart_subtransport **::git_transport *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" + }, + "git_tag_foreach_cb": { + "type": "callback", + "file": "git2/tag.h", + "line": 321, + "lineto": 321, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": null + }, + { + "name": "oid", + "type": "git_oid *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const char *name, git_oid *oid, void *payload", + "sig": "const char *::git_oid *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" }, "git_trace_callback": { "type": "callback", - "file": "trace.h", + "file": "git2/trace.h", "line": 52, "lineto": 52, "args": [ @@ -26257,7 +28401,7 @@ }, "git_transport_cb": { "type": "callback", - "file": "transport.h", + "file": "git2/transport.h", "line": 24, "lineto": 24, "args": [ @@ -26286,11 +28430,113 @@ "description": "

Signature of a function which creates a transport

\n", "comments": "" }, + "git_cred_sign_callback": { + "type": "callback", + "file": "git2/transport.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "session", + "type": "LIBSSH2_SESSION *", + "comment": null + }, + { + "name": "sig", + "type": "unsigned char **", + "comment": null + }, + { + "name": "sig_len", + "type": "size_t *", + "comment": null + }, + { + "name": "data", + "type": "const unsigned char *", + "comment": null + }, + { + "name": "data_len", + "type": "size_t", + "comment": null + }, + { + "name": "abstract", + "type": "void **", + "comment": null + } + ], + "argline": "LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, const unsigned char *data, size_t data_len, void **abstract", + "sig": "LIBSSH2_SESSION *::unsigned char **::size_t *::const unsigned char *::size_t::void **", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "" + }, + "git_cred_ssh_interactive_callback": { + "type": "callback", + "file": "git2/transport.h", + "line": 169, + "lineto": 169, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": null + }, + { + "name": "name_len", + "type": "int", + "comment": null + }, + { + "name": "instruction", + "type": "const char *", + "comment": null + }, + { + "name": "instruction_len", + "type": "int", + "comment": null + }, + { + "name": "num_prompts", + "type": "int", + "comment": null + }, + { + "name": "prompts", + "type": "const LIBSSH2_USERAUTH_KBDINT_PROMPT *", + "comment": null + }, + { + "name": "responses", + "type": "LIBSSH2_USERAUTH_KBDINT_RESPONSE *", + "comment": null + }, + { + "name": "abstract", + "type": "void **", + "comment": null + } + ], + "argline": "const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract", + "sig": "const char *::int::const char *::int::int::const LIBSSH2_USERAUTH_KBDINT_PROMPT *::LIBSSH2_USERAUTH_KBDINT_RESPONSE *::void **", + "return": { + "type": "void", + "comment": null + }, + "description": "", + "comments": "" + }, "git_cred_acquire_cb": { "type": "callback", - "file": "transport.h", - "line": 333, - "lineto": 338, + "file": "git2/transport.h", + "line": 362, + "lineto": 367, "args": [ { "name": "cred", @@ -26329,7 +28575,7 @@ }, "git_treebuilder_filter_cb": { "type": "callback", - "file": "tree.h", + "file": "git2/tree.h", "line": 347, "lineto": 348, "args": [ @@ -26351,11 +28597,11 @@ "comment": null }, "description": "

Callback for git_treebuilder_filter

\n", - "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" + "comments": "

The return value is treated as a boolean, with zero indicating that the\n entry should be left alone and any non-zero value meaning that the\n entry should be removed from the treebuilder list (i.e. filtered out).

\n" }, "git_treewalk_cb": { "type": "callback", - "file": "tree.h", + "file": "git2/tree.h", "line": 394, "lineto": 395, "args": [ @@ -26386,7 +28632,7 @@ }, "git_transfer_progress_cb": { "type": "callback", - "file": "types.h", + "file": "git2/types.h", "line": 274, "lineto": 274, "args": [ @@ -26412,7 +28658,7 @@ }, "git_transport_message_cb": { "type": "callback", - "file": "types.h", + "file": "git2/types.h", "line": 284, "lineto": 284, "args": [ @@ -26443,7 +28689,7 @@ }, "git_transport_certificate_check_cb": { "type": "callback", - "file": "types.h", + "file": "git2/types.h", "line": 334, "lineto": 334, "args": [ @@ -26480,18 +28726,215 @@ }, "globals": {}, "types": [ + [ + "LIBSSH2_SESSION", + { + "decl": "LIBSSH2_SESSION", + "type": "struct", + "value": "LIBSSH2_SESSION", + "file": "git2/transport.h", + "line": 163, + "lineto": 163, + "tdef": "typedef", + "description": "", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_cred_sign_callback" + ] + } + } + ], + [ + "LIBSSH2_USERAUTH_KBDINT_PROMPT", + { + "decl": "LIBSSH2_USERAUTH_KBDINT_PROMPT", + "type": "struct", + "value": "LIBSSH2_USERAUTH_KBDINT_PROMPT", + "file": "git2/transport.h", + "line": 164, + "lineto": 164, + "tdef": "typedef", + "description": "", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_cred_ssh_interactive_callback" + ] + } + } + ], + [ + "LIBSSH2_USERAUTH_KBDINT_RESPONSE", + { + "decl": "LIBSSH2_USERAUTH_KBDINT_RESPONSE", + "type": "struct", + "value": "LIBSSH2_USERAUTH_KBDINT_RESPONSE", + "file": "git2/transport.h", + "line": 165, + "lineto": 165, + "tdef": "typedef", + "description": "", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_cred_ssh_interactive_callback" + ] + } + } + ], + [ + "_LIBSSH2_SESSION", + { + "decl": [], + "type": "struct", + "value": "_LIBSSH2_SESSION", + "file": "git2/transport.h", + "line": 163, + "lineto": 163, + "tdef": null, + "description": "", + "comments": "", + "fields": [], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "_LIBSSH2_USERAUTH_KBDINT_PROMPT", + { + "decl": [], + "type": "struct", + "value": "_LIBSSH2_USERAUTH_KBDINT_PROMPT", + "file": "git2/transport.h", + "line": 164, + "lineto": 164, + "tdef": null, + "description": "", + "comments": "", + "fields": [], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "_LIBSSH2_USERAUTH_KBDINT_RESPONSE", + { + "decl": [], + "type": "struct", + "value": "_LIBSSH2_USERAUTH_KBDINT_RESPONSE", + "file": "git2/transport.h", + "line": 165, + "lineto": 165, + "tdef": null, + "description": "", + "comments": "", + "fields": [], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_allocator", + { + "decl": [ + "void *(*)(size_t, const char *, int) gmalloc", + "void *(*)(size_t, size_t, const char *, int) gcalloc", + "char *(*)(const char *, const char *, int) gstrdup", + "char *(*)(const char *, size_t, const char *, int) gstrndup", + "char *(*)(const char *, size_t, const char *, int) gsubstrdup", + "void *(*)(void *, size_t, const char *, int) grealloc", + "void *(*)(void *, size_t, size_t, const char *, int) greallocarray", + "void *(*)(size_t, size_t, const char *, int) gmallocarray", + "void (*)(void *) gfree" + ], + "type": "struct", + "value": "git_allocator", + "file": "git2/sys/alloc.h", + "line": 23, + "lineto": 73, + "block": "void *(*)(size_t, const char *, int) gmalloc\nvoid *(*)(size_t, size_t, const char *, int) gcalloc\nchar *(*)(const char *, const char *, int) gstrdup\nchar *(*)(const char *, size_t, const char *, int) gstrndup\nchar *(*)(const char *, size_t, const char *, int) gsubstrdup\nvoid *(*)(void *, size_t, const char *, int) grealloc\nvoid *(*)(void *, size_t, size_t, const char *, int) greallocarray\nvoid *(*)(size_t, size_t, const char *, int) gmallocarray\nvoid (*)(void *) gfree", + "tdef": "typedef", + "description": " An instance for a custom memory allocator", + "comments": "

Setting the pointers of this structure allows the developer to implement\n custom memory allocators. The global memory allocator can be set by using\n "GIT_OPT_SET_ALLOCATOR" with the git_libgit2_opts function. Keep in mind\n that all fields need to be set to a proper function.

\n", + "fields": [ + { + "type": "void *(*)(size_t, const char *, int)", + "name": "gmalloc", + "comments": "" + }, + { + "type": "void *(*)(size_t, size_t, const char *, int)", + "name": "gcalloc", + "comments": "" + }, + { + "type": "char *(*)(const char *, const char *, int)", + "name": "gstrdup", + "comments": "" + }, + { + "type": "char *(*)(const char *, size_t, const char *, int)", + "name": "gstrndup", + "comments": "" + }, + { + "type": "char *(*)(const char *, size_t, const char *, int)", + "name": "gsubstrdup", + "comments": "" + }, + { + "type": "void *(*)(void *, size_t, const char *, int)", + "name": "grealloc", + "comments": "" + }, + { + "type": "void *(*)(void *, size_t, size_t, const char *, int)", + "name": "greallocarray", + "comments": "" + }, + { + "type": "void *(*)(size_t, size_t, const char *, int)", + "name": "gmallocarray", + "comments": "" + }, + { + "type": "void (*)(void *)", + "name": "gfree", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_stdalloc_init_allocator", + "git_win32_crtdbg_init_allocator" + ] + } + } + ], [ "git_annotated_commit", { "decl": "git_annotated_commit", "type": "struct", "value": "git_annotated_commit", - "file": "types.h", - "line": 182, - "lineto": 182, + "file": "git2/types.h", + "line": 185, + "lineto": 185, "tdef": "typedef", "description": " Annotated commits, the input to merge and rebase. ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -26501,6 +28944,7 @@ "git_annotated_commit_from_revspec", "git_annotated_commit_id", "git_annotated_commit_lookup", + "git_annotated_commit_ref", "git_branch_create_from_annotated", "git_merge", "git_merge_analysis", @@ -26521,7 +28965,7 @@ "GIT_ATTR_VALUE_T" ], "type": "enum", - "file": "attr.h", + "file": "git2/attr.h", "line": 82, "lineto": 87, "block": "GIT_ATTR_UNSPECIFIED_T\nGIT_ATTR_TRUE_T\nGIT_ATTR_FALSE_T\nGIT_ATTR_VALUE_T", @@ -26562,6 +29006,36 @@ } } ], + [ + "git_blame", + { + "decl": "git_blame", + "type": "struct", + "value": "git_blame", + "file": "git2/blame.h", + "line": 149, + "lineto": 149, + "tdef": "typedef", + "description": " Opaque structure to hold blame results ", + "comments": "", + "fields": [], + "used": { + "returns": [ + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline" + ], + "needs": [ + "git_blame_buffer", + "git_blame_file", + "git_blame_free", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_get_hunk_count", + "git_blame_init_options" + ] + } + } + ], [ "git_blame_flag_t", { @@ -26571,13 +29045,14 @@ "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", - "GIT_BLAME_FIRST_PARENT" + "GIT_BLAME_FIRST_PARENT", + "GIT_BLAME_USE_MAILMAP" ], "type": "enum", - "file": "blame.h", + "file": "git2/blame.h", "line": 26, - "lineto": 46, - "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT", + "lineto": 50, + "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP", "tdef": "typedef", "description": " Flags for indicating option behavior for git_blame APIs.", "comments": "", @@ -26617,6 +29092,12 @@ "name": "GIT_BLAME_FIRST_PARENT", "comments": "

Restrict the search of commits to those reachable following only the\n first parents.

\n", "value": 16 + }, + { + "type": "int", + "name": "GIT_BLAME_USE_MAILMAP", + "comments": "

Use mailmap file to map author and committer names and email addresses\n to canonical real names and email addresses. The mailmap will be read\n from the working directory, or HEAD in a bare repository.

\n", + "value": 32 } ], "used": { @@ -26641,13 +29122,13 @@ ], "type": "struct", "value": "git_blame_hunk", - "file": "blame.h", - "line": 115, - "lineto": 128, + "file": "git2/blame.h", + "line": 132, + "lineto": 145, "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", "tdef": "typedef", "description": " Structure that represents a blame hunk.", - "comments": "
    \n
  • lines_in_hunk is the number of lines in this hunk - final_commit_id is the OID of the commit where this line was last changed. - final_start_line_number is the 1-based line number where this hunk begins, in the final version of the file - orig_commit_id is the OID of the commit where this hunk was found. This will usually be the same as final_commit_id, except when GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES has been specified. - orig_path is the path to the file where this hunk originated, as of the commit specified by orig_commit_id. - orig_start_line_number is the 1-based line number where this hunk begins in the file named by orig_path in the commit specified by orig_commit_id. - boundary is 1 iff the hunk has been tracked to a boundary commit (the root, or the commit specified in git_blame_options.oldest_commit)
  • \n
\n", + "comments": "
    \n
  • lines_in_hunk is the number of lines in this hunk
  • \n
  • final_commit_id is the OID of the commit where this line was last\nchanged.
  • \n
  • final_start_line_number is the 1-based line number where this hunk\nbegins, in the final version of the file
  • \n
  • final_signature is the author of final_commit_id. If\nGIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical\nreal name and email address.
  • \n
  • orig_commit_id is the OID of the commit where this hunk was found. This\nwill usually be the same as final_commit_id, except when\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES has been specified.
  • \n
  • orig_path is the path to the file where this hunk originated, as of the\ncommit specified by orig_commit_id.
  • \n
  • orig_start_line_number is the 1-based line number where this hunk begins\nin the file named by orig_path in the commit specified by\norig_commit_id.
  • \n
  • orig_signature is the author of orig_commit_id. If\nGIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical\nreal name and email address.
  • \n
  • boundary is 1 iff the hunk has been tracked to a boundary commit (the\nroot, or the commit specified in git_blame_options.oldest_commit)
  • \n
\n", "fields": [ { "type": "size_t", @@ -26718,13 +29199,13 @@ ], "type": "struct", "value": "git_blame_options", - "file": "blame.h", - "line": 70, - "lineto": 79, + "file": "git2/blame.h", + "line": 59, + "lineto": 88, "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", "tdef": "typedef", "description": " Blame options structure", - "comments": "

Use zeros to indicate default settings. It's easiest to use the GIT_BLAME_OPTIONS_INIT macro: git_blame_options opts = GIT_BLAME_OPTIONS_INIT;

\n\n
    \n
  • flags is a combination of the git_blame_flag_t values above. - min_match_characters is the lower bound on the number of alphanumeric characters that must be detected as moving/copying within a file for it to associate those lines with the parent commit. The default value is 20. This value only takes effect if any of the GIT_BLAME_TRACK_COPIES_* flags are specified. - newest_commit is the id of the newest commit to consider. The default is HEAD. - oldest_commit is the id of the oldest commit to consider. The default is the first commit encountered with a NULL parent. - min_line is the first line in the file to blame. The default is 1 (line numbers start with 1). - max_line is the last line in the file to blame. The default is the last line of the file.
  • \n
\n", + "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can\n use git_blame_init_options.

\n", "fields": [ { "type": "unsigned int", @@ -26734,32 +29215,32 @@ { "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " A combination of `git_blame_flag_t` " }, { "type": "uint16_t", "name": "min_match_characters", - "comments": "" + "comments": " The lower bound on the number of alphanumeric\n characters that must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value is 20.\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." }, { "type": "git_oid", "name": "newest_commit", - "comments": "" + "comments": " The id of the newest commit to consider. The default is HEAD. " }, { "type": "git_oid", "name": "oldest_commit", - "comments": "" + "comments": " The id of the oldest commit to consider.\n The default is the first commit encountered with a NULL parent." }, { "type": "size_t", "name": "min_line", - "comments": "" + "comments": " The first line in the file to blame.\n The default is 1 (line numbers start with 1)." }, { "type": "size_t", "name": "max_line", - "comments": "" + "comments": " The last line in the file to blame.\n The default is the last line of the file." } ], "used": { @@ -26777,12 +29258,13 @@ "decl": "git_blob", "type": "struct", "value": "git_blob", - "file": "types.h", - "line": 120, - "lineto": 120, + "file": "git2/types.h", + "line": 123, + "lineto": 123, "tdef": "typedef", "description": " In-memory representation of a blob object. ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -26813,12 +29295,13 @@ "decl": "git_branch_iterator", "type": "struct", "value": "git_branch_iterator", - "file": "branch.h", + "file": "git2/branch.h", "line": 88, "lineto": 88, "tdef": "typedef", "description": " Iterator type for branches ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -26838,7 +29321,7 @@ "GIT_BRANCH_ALL" ], "type": "enum", - "file": "types.h", + "file": "git2/types.h", "line": 202, "lineto": 206, "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", @@ -26885,13 +29368,13 @@ ], "type": "struct", "value": "git_buf", - "file": "buffer.h", + "file": "git2/buffer.h", "line": 52, "lineto": 55, "block": "char * ptr\nsize_t asize\nsize_t size", "tdef": "typedef", "description": " A data buffer for exporting data from libgit2", - "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. This can be awkward if the caller does not have easy access to the same allocation functions that libgit2 is using. In those cases, libgit2 will fill in a git_buf and the caller can use git_buf_free() to release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to a block of memory they hold. In this case, libgit2 will not resize or free the memory, but will read from it as needed.

\n\n

A git_buf is a public structure with three fields:

\n\n
    \n
  • ptr points to the start of the allocated memory. If it is NULL, then the git_buf is considered empty and libgit2 will feel free to overwrite it with new data.

  • \n
  • size holds the size (in bytes) of the data that is actually used.

  • \n
  • asize holds the known total amount of allocated memory if the ptr was allocated by libgit2. It may be larger than size. If ptr was not allocated by libgit2 and should not be resized and/or freed, then asize will be set to zero.

  • \n
\n\n

Some APIs may occasionally do something slightly unusual with a buffer, such as setting ptr to a value that was passed in by the user. In those cases, the behavior will be clearly documented by the API.

\n", + "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the\n caller and have the caller take responsibility for freeing that memory.\n This can be awkward if the caller does not have easy access to the same\n allocation functions that libgit2 is using. In those cases, libgit2\n will fill in a git_buf and the caller can use git_buf_dispose() to\n release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to\n a block of memory they hold. In this case, libgit2 will not resize or\n free the memory, but will read from it as needed.

\n\n

A git_buf is a public structure with three fields:

\n\n
    \n
  • ptr points to the start of the allocated memory. If it is NULL,\nthen the git_buf is considered empty and libgit2 will feel free\nto overwrite it with new data.

  • \n
  • size holds the size (in bytes) of the data that is actually used.

  • \n
  • asize holds the known total amount of allocated memory if the ptr\nwas allocated by libgit2. It may be larger than size. If ptr\nwas not allocated by libgit2 and should not be resized and/or freed,\nthen asize will be set to zero.

  • \n
\n\n

Some APIs may occasionally do something slightly unusual with a buffer,\n such as setting ptr to a value that was passed in by the user. In\n those cases, the behavior will be clearly documented by the API.

\n", "fields": [ { "type": "char *", @@ -26913,7 +29396,11 @@ "returns": [], "needs": [ "git_blob_filtered_content", + "git_branch_remote_name", + "git_branch_upstream_name", + "git_branch_upstream_remote", "git_buf_contains_nul", + "git_buf_dispose", "git_buf_free", "git_buf_grow", "git_buf_is_binary", @@ -26939,8 +29426,11 @@ "git_filter_list_apply_to_file", "git_filter_list_stream_data", "git_mempack_dump", + "git_merge_driver_apply_fn", "git_message_prettify", + "git_note_default_ref", "git_object_short_id", + "git_packbuilder_write_buf", "git_patch_to_buf", "git_refspec_rtransform", "git_refspec_transform", @@ -26963,7 +29453,7 @@ ], "type": "struct", "value": "git_cert", - "file": "types.h", + "file": "git2/types.h", "line": 318, "lineto": 323, "block": "git_cert_t cert_type", @@ -26997,7 +29487,7 @@ ], "type": "struct", "value": "git_cert_hostkey", - "file": "transport.h", + "file": "git2/transport.h", "line": 39, "lineto": 59, "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1", @@ -27040,7 +29530,7 @@ "GIT_CERT_SSH_SHA1" ], "type": "enum", - "file": "transport.h", + "file": "git2/transport.h", "line": 29, "lineto": 34, "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1", @@ -27077,7 +29567,7 @@ "GIT_CERT_STRARRAY" ], "type": "enum", - "file": "types.h", + "file": "git2/types.h", "line": 290, "lineto": 313, "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", @@ -27126,7 +29616,7 @@ ], "type": "struct", "value": "git_cert_x509", - "file": "transport.h", + "file": "git2/transport.h", "line": 64, "lineto": 74, "block": "git_cert parent\nvoid * data\nsize_t len", @@ -27169,13 +29659,13 @@ "GIT_CHECKOUT_NOTIFY_ALL" ], "type": "enum", - "file": "checkout.h", + "file": "git2/checkout.h", "line": 205, "lineto": 214, "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", "tdef": "typedef", "description": " Checkout notification flags", - "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n
    \n
  • GIT_CHECKOUT_NOTIFY_CONFLICT invokes checkout on conflicting paths.

  • \n
  • GIT_CHECKOUT_NOTIFY_DIRTY notifies about "dirty" files, i.e. those that do not need an update but no longer match the baseline. Core git displays these files when checkout runs, but won't stop the checkout.

  • \n
  • GIT_CHECKOUT_NOTIFY_UPDATED sends notification for any file changed.

  • \n
  • GIT_CHECKOUT_NOTIFY_UNTRACKED notifies about untracked files.

  • \n
  • GIT_CHECKOUT_NOTIFY_IGNORED notifies about ignored files.

  • \n
\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", + "comments": "

Checkout will invoke an options notification callback (notify_cb) for\n certain cases - you pick which ones via notify_flags:

\n\n
    \n
  • GIT_CHECKOUT_NOTIFY_CONFLICT invokes checkout on conflicting paths.

  • \n
  • GIT_CHECKOUT_NOTIFY_DIRTY notifies about "dirty" files, i.e. those that\ndo not need an update but no longer match the baseline. Core git\ndisplays these files when checkout runs, but won't stop the checkout.

  • \n
  • GIT_CHECKOUT_NOTIFY_UPDATED sends notification for any file changed.

  • \n
  • GIT_CHECKOUT_NOTIFY_UNTRACKED notifies about untracked files.

  • \n
  • GIT_CHECKOUT_NOTIFY_IGNORED notifies about ignored files.

  • \n
\n\n

Returning a non-zero value from this callback will cancel the checkout.\n The non-zero return value will be propagated back and returned by the\n git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk,\n so canceling on any notification will still happen prior to any files\n being modified.

\n", "fields": [ { "type": "int", @@ -27255,13 +29745,13 @@ ], "type": "struct", "value": "git_checkout_options", - "file": "checkout.h", - "line": 251, - "lineto": 295, + "file": "git2/checkout.h", + "line": 250, + "lineto": 294, "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", "tdef": "typedef", "description": " Checkout options structure", - "comments": "

Zero out for defaults. Initialize with GIT_CHECKOUT_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;\n
\n", + "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can\n use git_checkout_init_options.

\n", "fields": [ { "type": "unsigned int", @@ -27271,7 +29761,7 @@ { "type": "unsigned int", "name": "checkout_strategy", - "comments": " default will be a dry run " + "comments": " default will be a safe checkout " }, { "type": "int", @@ -27378,6 +29868,48 @@ } } ], + [ + "git_checkout_perfdata", + { + "decl": [ + "size_t mkdir_calls", + "size_t stat_calls", + "size_t chmod_calls" + ], + "type": "struct", + "value": "git_checkout_perfdata", + "file": "git2/checkout.h", + "line": 216, + "lineto": 220, + "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "size_t", + "name": "mkdir_calls", + "comments": "" + }, + { + "type": "size_t", + "name": "stat_calls", + "comments": "" + }, + { + "type": "size_t", + "name": "chmod_calls", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_perfdata_cb" + ] + } + } + ], [ "git_checkout_strategy_t", { @@ -27406,13 +29938,13 @@ "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" ], "type": "enum", - "file": "checkout.h", + "file": "git2/checkout.h", "line": 106, "lineto": 177, "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", "tdef": "typedef", "description": " Checkout behavior flags", - "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modified the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", + "comments": "

In libgit2, checkout is used to update the working directory and index\n to match a target tree. Unlike git checkout, it does not move the HEAD\n commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to\n check out, the "baseline" tree of what was checked out previously, the\n working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts,\netc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to\nmake the working directory match the target (including potentially\ndiscarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make\nmodifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |\n
    \n\n

    ---------------------|-----------------------|----------------------|\n workdir == baseline | no action | create, update, or |\n | | delete file |\n---------------------|-----------------------|----------------------|\n workdir exists and | no action | conflict (notify |\n is != baseline | notify dirty MODIFIED | and cancel checkout) |\n---------------------|-----------------------|----------------------|\n workdir missing, | notify dirty DELETED | create file |\n baseline present | | |\n---------------------|-----------------------|----------------------|

  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout\n notification callback (see below) that displays information about dirty\n files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a\n notification callback that cancels the operation if a dirty-but-existing\n file is found in the working directory. This core git command isn't\n quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates\neven if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not\nin target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also\nuntracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that\nalready exist. Files will not be created nor deleted. This just skips\napplying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the\nupdated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk\nbefore any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips\nfiles with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and\nGIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the\nstage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being\noverwritten. Normally, files that are ignored in the working directory\nare not considered "precious" and may be overwritten if the checkout\ntarget contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing\nfiles or folders that fold to the same name on case insensitive\nfilesystems. This can cause files to retain their existing names\nand write through existing symbolic links.

  • \n
\n", "fields": [ { "type": "int", @@ -27564,7 +30096,7 @@ ], "type": "struct", "value": "git_cherrypick_options", - "file": "cherrypick.h", + "file": "git2/cherrypick.h", "line": 26, "lineto": 34, "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", @@ -27612,7 +30144,7 @@ "GIT_CLONE_LOCAL_NO_LINKS" ], "type": "enum", - "file": "clone.h", + "file": "git2/clone.h", "line": 33, "lineto": 53, "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", @@ -27668,13 +30200,13 @@ ], "type": "struct", "value": "git_clone_options", - "file": "clone.h", + "file": "git2/clone.h", "line": 103, "lineto": 164, "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", "tdef": "typedef", "description": " Clone options structure", - "comments": "

Use the GIT_CLONE_OPTIONS_INIT to get the default settings, like this:

\n\n
    git_clone_options opts = GIT_CLONE_OPTIONS_INIT;\n
\n", + "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can\n use git_clone_init_options.

\n", "fields": [ { "type": "unsigned int", @@ -27742,12 +30274,13 @@ "decl": "git_commit", "type": "struct", "value": "git_commit", - "file": "types.h", - "line": 123, - "lineto": 123, + "file": "git2/types.h", + "line": 126, + "lineto": 126, "tdef": "typedef", "description": " Parsed representation of a commit object. ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -27756,8 +30289,10 @@ "git_cherrypick_commit", "git_commit_amend", "git_commit_author", + "git_commit_author_with_mailmap", "git_commit_body", "git_commit_committer", + "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", "git_commit_create_from_callback", @@ -27799,12 +30334,13 @@ "decl": "git_config", "type": "struct", "value": "git_config", - "file": "types.h", - "line": 141, - "lineto": 141, + "file": "git2/types.h", + "line": 144, + "lineto": 144, "tdef": "typedef", "description": " Memory representation of a set of config files ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -27815,6 +30351,7 @@ "git_config_delete_multivar", "git_config_entry_free", "git_config_foreach", + "git_config_foreach_cb", "git_config_foreach_match", "git_config_free", "git_config_get_bool", @@ -27857,9 +30394,9 @@ "decl": "git_config_backend", "type": "struct", "value": "git_config_backend", - "file": "types.h", - "line": 144, - "lineto": 144, + "file": "git2/types.h", + "line": 147, + "lineto": 147, "block": "unsigned int version\nint readonly\nstruct git_config * cfg\nint (*)(struct git_config_backend *, git_config_level_t, const git_repository *) open\nint (*)(struct git_config_backend *, const char *, git_config_entry **) get\nint (*)(struct git_config_backend *, const char *, const char *) set\nint (*)(git_config_backend *, const char *, const char *, const char *) set_multivar\nint (*)(struct git_config_backend *, const char *) del\nint (*)(struct git_config_backend *, const char *, const char *) del_multivar\nint (*)(git_config_iterator **, struct git_config_backend *) iterator\nint (*)(struct git_config_backend **, struct git_config_backend *) snapshot\nint (*)(struct git_config_backend *) lock\nint (*)(struct git_config_backend *, int) unlock\nvoid (*)(struct git_config_backend *) free", "tdef": "typedef", "description": " Interface to access a configuration file ", @@ -27952,16 +30489,17 @@ "decl": [ "const char * name", "const char * value", + "unsigned int include_depth", "git_config_level_t level", "void (*)(struct git_config_entry *) free", "void * payload" ], "type": "struct", "value": "git_config_entry", - "file": "config.h", + "file": "git2/config.h", "line": 64, - "lineto": 70, - "block": "const char * name\nconst char * value\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free\nvoid * payload", + "lineto": 71, + "block": "const char * name\nconst char * value\nunsigned int include_depth\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free\nvoid * payload", "tdef": "typedef", "description": " An entry in a configuration file", "comments": "", @@ -27976,6 +30514,11 @@ "name": "value", "comments": " String value of the entry " }, + { + "type": "unsigned int", + "name": "include_depth", + "comments": " Depth of includes where this variable was found " + }, { "type": "git_config_level_t", "name": "level", @@ -27996,6 +30539,7 @@ "returns": [], "needs": [ "git_config_entry_free", + "git_config_foreach_cb", "git_config_get_entry", "git_config_next" ] @@ -28005,21 +30549,15 @@ [ "git_config_iterator", { - "decl": [ - "git_config_backend * backend", - "unsigned int flags", - "int (*)(git_config_entry **, git_config_iterator *) next", - "void (*)(git_config_iterator *) free" - ], + "decl": "git_config_iterator", "type": "struct", "value": "git_config_iterator", - "file": "sys/config.h", - "line": 34, - "lineto": 48, - "block": "git_config_backend * backend\nunsigned int flags\nint (*)(git_config_entry **, git_config_iterator *) next\nvoid (*)(git_config_iterator *) free", - "tdef": null, - "description": " Every iterator must have this struct as its first element, so the\n API can talk to it. You'd define your iterator as", - "comments": "
 struct my_iterator {             git_config_iterator parent;             ...     }\n
\n\n

and assign iter->parent.backend to your git_config_backend.

\n", + "file": "git2/config.h", + "line": 89, + "lineto": 89, + "tdef": "typedef", + "description": " An opaque structure for a configuration iterator", + "comments": "", "fields": [ { "type": "git_config_backend *", @@ -28067,13 +30605,13 @@ "GIT_CONFIG_HIGHEST_LEVEL" ], "type": "enum", - "file": "config.h", + "file": "git2/config.h", "line": 31, "lineto": 59, "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", "tdef": "typedef", "description": " Priority level of a config file.\n These priority levels correspond to the natural escalation logic\n (from higher to lower) when searching for config entries in git.git.", - "comments": "

git_config_open_default() and git_repository_config() honor those priority levels as well.

\n", + "comments": "

git_config_open_default() and git_repository_config() honor those\n priority levels as well.

\n", "fields": [ { "type": "int", @@ -28128,15 +30666,59 @@ } } ], + [ + "git_cred", + { + "decl": "git_cred", + "type": "struct", + "value": "git_cred", + "file": "git2/transport.h", + "line": 140, + "lineto": 140, + "tdef": "typedef", + "description": " The base structure for all credential types", + "comments": "", + "fields": [ + { + "type": "git_credtype_t", + "name": "credtype", + "comments": " A type of credential " + }, + { + "type": "void (*)(git_cred *)", + "name": "free", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_cred_acquire_cb", + "git_cred_default_new", + "git_cred_free", + "git_cred_has_username", + "git_cred_ssh_custom_new", + "git_cred_ssh_interactive_new", + "git_cred_ssh_key_from_agent", + "git_cred_ssh_key_memory_new", + "git_cred_ssh_key_new", + "git_cred_username_new", + "git_cred_userpass", + "git_cred_userpass_plaintext_new", + "git_transport_smart_credentials" + ] + } + } + ], [ "git_cred_default", { "decl": "git_cred_default", "type": "struct", "value": "git_cred_default", - "file": "transport.h", - "line": 176, - "lineto": 176, + "file": "git2/transport.h", + "line": 205, + "lineto": 205, "tdef": "typedef", "description": " A key for NTLM/Kerberos \"default\" credentials ", "comments": "", @@ -28159,9 +30741,9 @@ ], "type": "struct", "value": "git_cred_ssh_custom", - "file": "transport.h", - "line": 166, - "lineto": 173, + "file": "git2/transport.h", + "line": 195, + "lineto": 202, "block": "git_cred parent\nchar * username\nchar * publickey\nsize_t publickey_len\ngit_cred_sign_callback sign_callback\nvoid * payload", "tdef": "typedef", "description": " A key with a custom signature function", @@ -28215,9 +30797,9 @@ ], "type": "struct", "value": "git_cred_ssh_interactive", - "file": "transport.h", - "line": 156, - "lineto": 161, + "file": "git2/transport.h", + "line": 185, + "lineto": 190, "block": "git_cred parent\nchar * username\ngit_cred_ssh_interactive_callback prompt_callback\nvoid * payload", "tdef": "typedef", "description": " Keyboard-interactive based ssh authentication", @@ -28264,9 +30846,9 @@ ], "type": "struct", "value": "git_cred_ssh_key", - "file": "transport.h", - "line": 145, - "lineto": 151, + "file": "git2/transport.h", + "line": 174, + "lineto": 180, "block": "git_cred parent\nchar * username\nchar * publickey\nchar * privatekey\nchar * passphrase", "tdef": "typedef", "description": " A ssh key from disk", @@ -28313,9 +30895,9 @@ ], "type": "struct", "value": "git_cred_username", - "file": "transport.h", - "line": 179, - "lineto": 182, + "file": "git2/transport.h", + "line": 208, + "lineto": 211, "block": "git_cred parent\nchar [1] username", "tdef": "typedef", "description": " Username-only credential information ", @@ -28347,7 +30929,7 @@ ], "type": "struct", "value": "git_cred_userpass_payload", - "file": "cred_helpers.h", + "file": "git2/cred_helpers.h", "line": 24, "lineto": 27, "block": "const char * username\nconst char * password", @@ -28382,9 +30964,9 @@ ], "type": "struct", "value": "git_cred_userpass_plaintext", - "file": "transport.h", - "line": 122, - "lineto": 126, + "file": "git2/transport.h", + "line": 151, + "lineto": 155, "block": "git_cred parent\nchar * username\nchar * password", "tdef": "typedef", "description": " A plaintext username and password ", @@ -28425,54 +31007,54 @@ "GIT_CREDTYPE_SSH_MEMORY" ], "type": "enum", - "file": "transport.h", - "line": 81, - "lineto": 111, + "file": "git2/transport.h", + "line": 86, + "lineto": 138, "block": "GIT_CREDTYPE_USERPASS_PLAINTEXT\nGIT_CREDTYPE_SSH_KEY\nGIT_CREDTYPE_SSH_CUSTOM\nGIT_CREDTYPE_DEFAULT\nGIT_CREDTYPE_SSH_INTERACTIVE\nGIT_CREDTYPE_USERNAME\nGIT_CREDTYPE_SSH_MEMORY", "tdef": "typedef", - "description": " Authentication type requested ", - "comments": "", + "description": " Supported credential types", + "comments": "

This represents the various types of authentication methods supported by\n the library.

\n", "fields": [ { "type": "int", "name": "GIT_CREDTYPE_USERPASS_PLAINTEXT", - "comments": "", + "comments": "

A vanilla user/password request

\n", "value": 1 }, { "type": "int", "name": "GIT_CREDTYPE_SSH_KEY", - "comments": "", + "comments": "

An SSH key-based authentication request

\n", "value": 2 }, { "type": "int", "name": "GIT_CREDTYPE_SSH_CUSTOM", - "comments": "", + "comments": "

An SSH key-based authentication request, with a custom signature

\n", "value": 4 }, { "type": "int", "name": "GIT_CREDTYPE_DEFAULT", - "comments": "", + "comments": "

An NTLM/Negotiate-based authentication request.

\n", "value": 8 }, { "type": "int", "name": "GIT_CREDTYPE_SSH_INTERACTIVE", - "comments": "", + "comments": "

An SSH interactive authentication request

\n", "value": 16 }, { "type": "int", "name": "GIT_CREDTYPE_USERNAME", - "comments": "

Username-only information

\n\n

If the SSH transport does not know which username to use,\n it will ask via this credential type.

\n", + "comments": "

Username-only authentication request

\n\n

Used as a pre-authentication step if the underlying transport\n (eg. SSH, with no username in its URL) does not know which username\n to use.

\n", "value": 32 }, { "type": "int", "name": "GIT_CREDTYPE_SSH_MEMORY", - "comments": "

Credentials read from memory.

\n\n

Only available for libssh2+OpenSSL for now.

\n", + "comments": "

An SSH key-based authentication request

\n\n

Allows credentials to be read from memory instead of files.\n Note that because of differences in crypto backend support, it might\n not be functional.

\n", "value": 64 } ], @@ -28492,9 +31074,9 @@ ], "type": "struct", "value": "git_cvar_map", - "file": "config.h", - "line": 93, - "lineto": 97, + "file": "git2/config.h", + "line": 104, + "lineto": 108, "block": "git_cvar_t cvar_type\nconst char * str_match\nint map_value", "tdef": "typedef", "description": " Mapping from config variables to values.", @@ -28535,9 +31117,9 @@ "GIT_CVAR_STRING" ], "type": "enum", - "file": "config.h", - "line": 83, - "lineto": 88, + "file": "git2/config.h", + "line": 94, + "lineto": 99, "block": "GIT_CVAR_FALSE\nGIT_CVAR_TRUE\nGIT_CVAR_INT32\nGIT_CVAR_STRING", "tdef": "typedef", "description": " Config var type", @@ -28591,13 +31173,13 @@ "GIT_DELTA_CONFLICTED" ], "type": "enum", - "file": "diff.h", - "line": 252, - "lineto": 264, + "file": "git2/diff.h", + "line": 220, + "lineto": 232, "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", "tdef": "typedef", "description": " What type of change is described by a git_diff_delta?", - "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE in the option flags (otherwise type changes will be split into ADDED / DELETED pairs).

\n", + "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run\n git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE\n in the option flags (otherwise type changes will be split into ADDED /\n DELETED pairs).

\n", "fields": [ { "type": "int", @@ -28686,13 +31268,13 @@ ], "type": "struct", "value": "git_describe_format_options", - "file": "describe.h", - "line": 78, - "lineto": 98, + "file": "git2/describe.h", + "line": 91, + "lineto": 111, "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", "tdef": "typedef", - "description": " Options for formatting the describe string", - "comments": "", + "description": " Describe format options structure", + "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can\n use git_describe_format_init_options.

\n", "fields": [ { "type": "unsigned int", @@ -28718,7 +31300,8 @@ "used": { "returns": [], "needs": [ - "git_describe_format" + "git_describe_format", + "git_describe_init_format_options" ] } } @@ -28736,13 +31319,13 @@ ], "type": "struct", "value": "git_describe_options", - "file": "describe.h", - "line": 44, - "lineto": 62, + "file": "git2/describe.h", + "line": 43, + "lineto": 61, "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", "tdef": "typedef", "description": " Describe options structure", - "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT;\n
\n", + "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can\n use git_describe_init_options.

\n", "fields": [ { "type": "unsigned int", @@ -28779,6 +31362,7 @@ "returns": [], "needs": [ "git_describe_commit", + "git_describe_init_options", "git_describe_workdir" ] } @@ -28790,12 +31374,13 @@ "decl": "git_describe_result", "type": "struct", "value": "git_describe_result", - "file": "describe.h", - "line": 111, - "lineto": 111, + "file": "git2/describe.h", + "line": 134, + "lineto": 134, "tdef": "typedef", "description": " A struct that stores the result of a describe operation.", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -28816,13 +31401,13 @@ "GIT_DESCRIBE_ALL" ], "type": "enum", - "file": "describe.h", + "file": "git2/describe.h", "line": 30, "lineto": 34, "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", "tdef": "typedef", "description": " Reference lookup strategy", - "comments": "

These behave like the --tags and --all options to git-describe, namely they say to look for any reference in either refs/tags/ or refs/ respectively.

\n", + "comments": "

These behave like the --tags and --all options to git-describe,\n namely they say to look for any reference in either refs/tags/ or\n refs/ respectively.

\n", "fields": [ { "type": "int", @@ -28855,12 +31440,13 @@ "decl": "git_diff", "type": "struct", "value": "git_diff", - "file": "diff.h", - "line": 225, - "lineto": 225, + "file": "git2/diff.h", + "line": 193, + "lineto": 193, "tdef": "typedef", "description": " The diff object that contains all individual file deltas.", - "comments": "

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", + "comments": "

A diff represents the cumulative list of differences between two\n snapshots of a repository (possibly filtered by a set of file name\n patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of\n diffs then traversing it. This makes is easier to share logic across\n the various types of diffs (tree vs tree, workdir vs index, etc.), and\n also allows you to insert optional diff post-processing phases,\n such as rename detection, in between the steps. When you are done with\n a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff\n generator functions below (such as git_diff_tree_to_tree). You are\n responsible for releasing the object memory when done, using the\n git_diff_free() function.

\n", + "fields": [], "used": { "returns": [ "git_diff_get_delta", @@ -28934,18 +31520,18 @@ ], "type": "struct", "value": "git_diff_binary", - "file": "diff.h", - "line": 498, - "lineto": 509, + "file": "git2/diff.h", + "line": 513, + "lineto": 525, "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", "tdef": "typedef", - "description": " Structure describing the binary contents of a diff. ", - "comments": "", + "description": " Structure describing the binary contents of a diff.", + "comments": "

A binary file / delta is a file (or pair) for which no text diffs\n should be generated. A diff can contain delta entries that are\n binary, but no diff content will be output for those files. There is\n a base heuristic for binary detection and you can further tune the\n behavior with git attributes or diff flags and option settings.

\n", "fields": [ { "type": "unsigned int", "name": "contains_data", - "comments": " Whether there is data in this binary structure or not. If this\n is `1`, then this was produced and included binary content. If\n this is `0` then this was generated knowing only that a binary\n file changed but without providing the data, probably from a patch\n that said `Binary files a/file.txt and b/file.txt differ`." + "comments": " Whether there is data in this binary structure or not.\n\n If this is `1`, then this was produced and included binary content.\n If this is `0` then this was generated knowing only that a binary\n file changed but without providing the data, probably from a patch\n that said `Binary files a/file.txt and b/file.txt differ`." }, { "type": "git_diff_binary_file", @@ -28981,9 +31567,9 @@ ], "type": "struct", "value": "git_diff_binary_file", - "file": "diff.h", - "line": 483, - "lineto": 495, + "file": "git2/diff.h", + "line": 490, + "lineto": 502, "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", "tdef": "typedef", "description": " The contents of one of the files in a binary diff. ", @@ -29025,9 +31611,9 @@ "GIT_DIFF_BINARY_DELTA" ], "type": "enum", - "file": "diff.h", - "line": 471, - "lineto": 480, + "file": "git2/diff.h", + "line": 478, + "lineto": 487, "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", "tdef": "typedef", "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", @@ -29071,13 +31657,13 @@ ], "type": "struct", "value": "git_diff_delta", - "file": "diff.h", - "line": 337, - "lineto": 344, + "file": "git2/diff.h", + "line": 309, + "lineto": 316, "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", "tdef": "typedef", "description": " Description of changes to one entry.", - "comments": "

When iterating over a diff, this will be passed to most callbacks and you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file represents to "to" side of the diff. What those means depend on the function that was used to generate the diff and will be documented below. You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file", they actually may correspond to entries that represent a file, a symbolic link, a submodule commit id, or even a tree (if you are tracking type changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will be filled in, but we generally try to fill in as much as possible. One example is that the "flags" field may not have either the BINARY or the NOT_BINARY flag set to avoid examining file contents if you do not pass in hunk and/or line callbacks to the diff foreach iteration function. It will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar() which does a similarity analysis of files in the diff. Use that function to do rename and copy detection, and to split heavily modified files in add/delete pairs. After that call, deltas with a status of GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to break, but to not actually break the records, then GIT_DELTA_MODIFIED records may have a non-zero similarity score if the self-similarity is below the split threshold. To display this value like core Git, invert the score (a la printf("M%03d", 100 - delta->similarity)).

\n", + "comments": "

A delta is a file pair with an old and new revision. The old version\n may be absent if the file was just created and the new version may be\n absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and\n you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file\n represents to "to" side of the diff. What those means depend on the\n function that was used to generate the diff and will be documented below.\n You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file",\n they actually may correspond to entries that represent a file, a symbolic\n link, a submodule commit id, or even a tree (if you are tracking type\n changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will\n be filled in, but we generally try to fill in as much as possible. One\n example is that the "flags" field may not have either the BINARY or the\n NOT_BINARY flag set to avoid examining file contents if you do not pass\n in hunk and/or line callbacks to the diff foreach iteration function. It\n will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar()\n which does a similarity analysis of files in the diff. Use that\n function to do rename and copy detection, and to split heavily modified\n files in add/delete pairs. After that call, deltas with a status of\n GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score\n between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to\n break, but to not actually break the records, then GIT_DELTA_MODIFIED\n records may have a non-zero similarity score if the self-similarity is\n below the split threshold. To display this value like core Git, invert\n the score (a la printf("M%03d", 100 - delta->similarity)).

\n", "fields": [ { "type": "git_delta_t", @@ -29141,13 +31727,13 @@ ], "type": "struct", "value": "git_diff_file", - "file": "diff.h", - "line": 292, - "lineto": 299, + "file": "git2/diff.h", + "line": 260, + "lineto": 267, "block": "git_oid id\nconst char * path\ngit_off_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", "tdef": "typedef", "description": " Description of one side of a delta.", - "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n\n

The id is the git_oid of the item. If the entry represents an absent side of a diff (e.g. the old_file of a GIT_DELTA_ADDED delta), then the oid will be zeroes.

\n\n

path is the NUL-terminated path to the entry relative to the working directory of the repository.

\n\n

size is the size of the entry in bytes.

\n\n

flags is a combination of the git_diff_flag_t types

\n\n

mode is, roughly, the stat() st_mode value for the item. This will be restricted to one of the git_filemode_t values.

\n\n

The id_abbrev represents the known length of the id field, when converted to a hex string. It is generally GIT_OID_HEXSZ, unless this delta was created from reading a patch file, in which case it may be abbreviated to something reasonable, like 7 characters.

\n", + "comments": "

Although this is called a "file", it could represent a file, a symbolic\n link, a submodule commit id, or even a tree (although that only if you\n are tracking type changes or ignored/untracked directories).

\n\n

The id is the git_oid of the item. If the entry represents an\n absent side of a diff (e.g. the old_file of a GIT_DELTA_ADDED delta),\n then the oid will be zeroes.

\n\n

path is the NUL-terminated path to the entry relative to the working\n directory of the repository.

\n\n

size is the size of the entry in bytes.

\n\n

flags is a combination of the git_diff_flag_t types

\n\n

mode is, roughly, the stat() st_mode value for the item. This will\n be restricted to one of the git_filemode_t values.

\n\n

The id_abbrev represents the known length of the id field, when\n converted to a hex string. It is generally GIT_OID_HEXSZ, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters.

\n", "fields": [ { "type": "git_oid", @@ -29207,13 +31793,13 @@ ], "type": "struct", "value": "git_diff_find_options", - "file": "diff.h", - "line": 703, - "lineto": 729, + "file": "git2/diff.h", + "line": 718, + "lineto": 772, "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", "tdef": "typedef", "description": " Control behavior of rename and copy detection", - "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n\n
    \n
  • rename_threshold is the same as the -M option with a value - copy_threshold is the same as the -C option with a value - rename_from_rewrite_threshold matches the top of the -B option - break_rewrite_threshold matches the bottom of the -B option - rename_limit is the maximum number of matches to consider for a particular file. This is a little different from the -l option to regular Git because we will still process up to this many matches before abandoning the search.
  • \n
\n\n

The metric option allows you to plug in a custom similarity metric. Set it to NULL for the default internal metric which is based on sampling hashes of ranges of data in the file. The default metric is a pretty good similarity approximation that should work fairly well for both text and binary data, and is pretty fast with fixed memory overhead.

\n", + "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", "fields": [ { "type": "unsigned int", @@ -29228,32 +31814,32 @@ { "type": "uint16_t", "name": "rename_threshold", - "comments": " Similarity to consider a file renamed (default 50) " + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." }, { "type": "uint16_t", "name": "rename_from_rewrite_threshold", - "comments": " Similarity of modified to be eligible rename source (default 50) " + "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." }, { "type": "uint16_t", "name": "copy_threshold", - "comments": " Similarity to consider a file a copy (default 50) " + "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." }, { "type": "uint16_t", "name": "break_rewrite_threshold", - "comments": " Similarity to split modify into delete/add pair (default 60) " + "comments": " Treshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." }, { "type": "size_t", "name": "rename_limit", - "comments": " Maximum similarity sources to examine for a file (somewhat like\n git-diff's `-l` option or `diff.renameLimit` config) (default 200)" + "comments": " Maximum number of matches to consider for a particular file.\n\n This is a little different from the `-l` option from Git because we\n will still process up to this many matches before abandoning the search.\n Defaults to 200." }, { "type": "git_diff_similarity_metric *", "name": "metric", - "comments": " Pluggable similarity metric; pass NULL to use internal metric " + "comments": " The `metric` option allows you to plug in a custom similarity metric.\n\n Set it to NULL to use the default internal metric.\n\n The default metric is based on sampling hashes of ranges of data in\n the file, which is a pretty good similarity approximation that should\n work fairly well for both text and binary data while still being\n pretty fast with a fixed memory overhead." } ], "used": { @@ -29287,9 +31873,9 @@ "GIT_DIFF_FIND_REMOVE_UNMODIFIED" ], "type": "enum", - "file": "diff.h", - "line": 597, - "lineto": 666, + "file": "git2/diff.h", + "line": 627, + "lineto": 696, "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", "tdef": "typedef", "description": " Flags to control the behavior of diff rename/copy detection.", @@ -29408,13 +31994,13 @@ "GIT_DIFF_FLAG_EXISTS" ], "type": "enum", - "file": "diff.h", - "line": 235, - "lineto": 240, + "file": "git2/diff.h", + "line": 203, + "lineto": 208, "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS", "tdef": "typedef", "description": " Flags for the delta object and the file objects on each side.", - "comments": "

These flags are used for both the flags value of the git_diff_delta and the flags for the git_diff_file objects representing the old and new sides of the delta. Values outside of this public range should be considered reserved for internal or future use.

\n", + "comments": "

These flags are used for both the flags value of the git_diff_delta\n and the flags for the git_diff_file objects representing the old and\n new sides of the delta. Values outside of this public range should be\n considered reserved for internal or future use.

\n", "fields": [ { "type": "int", @@ -29455,9 +32041,9 @@ "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER" ], "type": "enum", - "file": "diff.h", - "line": 1321, - "lineto": 1328, + "file": "git2/diff.h", + "line": 1366, + "lineto": 1373, "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", "tdef": "typedef", "description": " Formatting options for diff e-mail generation", @@ -29499,9 +32085,9 @@ ], "type": "struct", "value": "git_diff_format_email_options", - "file": "diff.h", - "line": 1333, - "lineto": 1355, + "file": "git2/diff.h", + "line": 1378, + "lineto": 1400, "block": "unsigned int version\ngit_diff_format_email_flags_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", "tdef": "typedef", "description": " Options for controlling the formatting of the generated e-mail.", @@ -29568,9 +32154,9 @@ "GIT_DIFF_FORMAT_NAME_STATUS" ], "type": "enum", - "file": "diff.h", - "line": 1045, - "lineto": 1051, + "file": "git2/diff.h", + "line": 1090, + "lineto": 1096, "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS", "tdef": "typedef", "description": " Possible output formats for diff data", @@ -29629,13 +32215,13 @@ ], "type": "struct", "value": "git_diff_hunk", - "file": "diff.h", - "line": 523, - "lineto": 530, + "file": "git2/diff.h", + "line": 545, + "lineto": 552, "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", "tdef": "typedef", "description": " Structure describing a hunk of a diff.", - "comments": "", + "comments": "

A hunk is a span of modified lines in a delta along with some stable\n surrounding context. You can configure the amount of context and other\n properties of how hunks are generated. Each hunk also comes with a\n header that described where it starts and ends in both the old and new\n versions in the delta.

\n", "fields": [ { "type": "int", @@ -29698,13 +32284,13 @@ ], "type": "struct", "value": "git_diff_line", - "file": "diff.h", - "line": 570, - "lineto": 578, + "file": "git2/diff.h", + "line": 600, + "lineto": 608, "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", "tdef": "typedef", "description": " Structure describing a line (or data span) of a diff.", - "comments": "", + "comments": "

A line is a range of characters inside a hunk. It could be a context\n line (i.e. in both old and new versions), an added line (i.e. only in\n the new version), or a removed line (i.e. only in the old version).\n Unfortunately, we don't know anything about the encoding of data in the\n file being diffed, so we cannot tell you much about the line content.\n Line data will not be NUL-byte terminated, however, because it will be\n just a span of bytes inside the larger file.

\n", "fields": [ { "type": "char", @@ -29774,13 +32360,13 @@ "GIT_DIFF_LINE_BINARY" ], "type": "enum", - "file": "diff.h", - "line": 549, - "lineto": 565, + "file": "git2/diff.h", + "line": 571, + "lineto": 587, "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", "tdef": "typedef", "description": " Line origin constants.", - "comments": "

These values describe where a line came from and will be passed to the git_diff_line_cb when iterating over a diff. There are some special origin constants at the end that are used for the text output callbacks to demarcate lines that are actually part of the file or hunk headers.

\n", + "comments": "

These values describe where a line came from and will be passed to\n the git_diff_line_cb when iterating over a diff. There are some\n special origin constants at the end that are used for the text\n output callbacks to demarcate lines that are actually part of\n the file or hunk headers.

\n", "fields": [ { "type": "int", @@ -29866,6 +32452,7 @@ "GIT_DIFF_UPDATE_INDEX", "GIT_DIFF_INCLUDE_UNREADABLE", "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", + "GIT_DIFF_INDENT_HEURISTIC", "GIT_DIFF_FORCE_TEXT", "GIT_DIFF_FORCE_BINARY", "GIT_DIFF_IGNORE_WHITESPACE", @@ -29875,14 +32462,13 @@ "GIT_DIFF_SHOW_UNMODIFIED", "GIT_DIFF_PATIENCE", "GIT_DIFF_MINIMAL", - "GIT_DIFF_SHOW_BINARY", - "GIT_DIFF_INDENT_HEURISTIC" + "GIT_DIFF_SHOW_BINARY" ], "type": "enum", - "file": "diff.h", - "line": 72, - "lineto": 215, - "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY\nGIT_DIFF_INDENT_HEURISTIC", + "file": "git2/diff.h", + "line": 28, + "lineto": 171, + "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", "tdef": "typedef", "description": " Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.", "comments": "", @@ -30001,6 +32587,12 @@ "comments": "

Include unreadable files in the diff

\n", "value": 131072 }, + { + "type": "int", + "name": "GIT_DIFF_INDENT_HEURISTIC", + "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", + "value": 262144 + }, { "type": "int", "name": "GIT_DIFF_FORCE_TEXT", @@ -30060,12 +32652,6 @@ "name": "GIT_DIFF_SHOW_BINARY", "comments": "

Include the necessary deflate / delta information so that git-apply\n can apply given diff information to binary files.

\n", "value": 1073741824 - }, - { - "type": "unsigned int", - "name": "GIT_DIFF_INDENT_HEURISTIC", - "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", - "value": -2147483648 } ], "used": { @@ -30094,13 +32680,13 @@ ], "type": "struct", "value": "git_diff_options", - "file": "diff.h", - "line": 408, - "lineto": 428, + "file": "git2/diff.h", + "line": 361, + "lineto": 433, "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", "tdef": "typedef", "description": " Structure describing options about how the diff should be executed.", - "comments": "

Setting all values of the structure to zero will yield the default values. Similarly, passing NULL for the options structure will give the defaults. The default values are marked below.

\n\n
    \n
  • flags is a combination of the git_diff_option_t values above - context_lines is the number of unchanged lines that define the boundary of a hunk (and to display before and after) - interhunk_lines is the maximum number of unchanged lines between hunk boundaries before the hunks will be merged into a one. - old_prefix is the virtual "directory" to prefix to old file names in hunk headers (default "a") - new_prefix is the virtual "directory" to prefix to new file names in hunk headers (default "b") - pathspec is an array of paths / fnmatch patterns to constrain diff - max_size is a file size (in bytes) above which a blob will be marked as binary automatically; pass a negative value to disable. - notify_cb is an optional callback function, notifying the consumer of changes to the diff as new deltas are added. - progress_cb is an optional callback function, notifying the consumer of which files are being examined as the diff is generated. - payload is the payload to pass to the callback functions. - ignore_submodules overrides the submodule ignore setting for all submodules in the diff.
  • \n
\n", + "comments": "

Setting all values of the structure to zero will yield the default\n values. Similarly, passing NULL for the options structure will\n give the defaults. The default values are marked below.

\n", "fields": [ { "type": "unsigned int", @@ -30110,62 +32696,62 @@ { "type": "uint32_t", "name": "flags", - "comments": " defaults to GIT_DIFF_NORMAL " + "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" }, { "type": "git_submodule_ignore_t", "name": "ignore_submodules", - "comments": " submodule ignore rule " + "comments": " Overrides the submodule ignore setting for all submodules in the diff. " }, { "type": "git_strarray", "name": "pathspec", - "comments": " defaults to include all paths " + "comments": " An array of paths / fnmatch patterns to constrain diff.\n All paths are included by default." }, { "type": "git_diff_notify_cb", "name": "notify_cb", - "comments": "" + "comments": " An optional callback function, notifying the consumer of changes to\n the diff as new deltas are added." }, { "type": "git_diff_progress_cb", "name": "progress_cb", - "comments": "" + "comments": " An optional callback function, notifying the consumer of which files\n are being examined as the diff is generated." }, { "type": "void *", "name": "payload", - "comments": "" + "comments": " The payload to pass to the callback functions. " }, { "type": "uint32_t", "name": "context_lines", - "comments": " defaults to 3 " + "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." }, { "type": "uint32_t", "name": "interhunk_lines", - "comments": " defaults to 0 " + "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." }, { "type": "uint16_t", "name": "id_abbrev", - "comments": " default 'core.abbrev' or 7 if unset " + "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." }, { "type": "git_off_t", "name": "max_size", - "comments": " defaults to 512MB " + "comments": " A size (in bytes) above which a blob will be marked as binary\n automatically; pass a negative value to disable.\n Defaults to 512MB." }, { "type": "const char *", "name": "old_prefix", - "comments": " defaults to \"a\" " + "comments": " The virtual \"directory\" prefix for old file names in hunk headers.\n Default is \"a\"." }, { "type": "const char *", "name": "new_prefix", - "comments": " defaults to \"b\" " + "comments": " The virtual \"directory\" prefix for new file names in hunk headers.\n Defaults to \"b\"." } ], "used": { @@ -30197,13 +32783,13 @@ ], "type": "struct", "value": "git_diff_patchid_options", - "file": "diff.h", - "line": 1415, - "lineto": 1417, + "file": "git2/diff.h", + "line": 1462, + "lineto": 1464, "block": "unsigned int version", "tdef": "typedef", "description": " Patch ID options structure", - "comments": "

Initialize with GIT_DIFF_PATCHID_OPTIONS_INIT macro to correctly set the default values and version.

\n", + "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can\n use git_patchid_init_options.

\n", "fields": [ { "type": "unsigned int", @@ -30230,7 +32816,7 @@ ], "type": "struct", "value": "git_diff_perfdata", - "file": "sys/diff.h", + "file": "git2/sys/diff.h", "line": 67, "lineto": 71, "block": "unsigned int version\nsize_t stat_calls\nsize_t oid_calculations", @@ -30275,9 +32861,9 @@ ], "type": "struct", "value": "git_diff_similarity_metric", - "file": "diff.h", - "line": 671, - "lineto": 681, + "file": "git2/diff.h", + "line": 701, + "lineto": 711, "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", "tdef": "typedef", "description": " Pluggable similarity metric", @@ -30321,12 +32907,13 @@ "decl": "git_diff_stats", "type": "struct", "value": "git_diff_stats", - "file": "diff.h", - "line": 1235, - "lineto": 1235, + "file": "git2/diff.h", + "line": 1280, + "lineto": 1280, "tdef": "typedef", "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -30351,9 +32938,9 @@ "GIT_DIFF_STATS_INCLUDE_SUMMARY" ], "type": "enum", - "file": "diff.h", - "line": 1240, - "lineto": 1255, + "file": "git2/diff.h", + "line": 1285, + "lineto": 1300, "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", "tdef": "typedef", "description": " Formatting options for diff stats", @@ -30406,13 +32993,13 @@ "GIT_DIRECTION_PUSH" ], "type": "enum", - "file": "net.h", + "file": "git2/net.h", "line": 31, "lineto": 34, "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", "tdef": "typedef", "description": " Direction of the connection.", - "comments": "

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.

\n", + "comments": "

We need this because we need to know whether we should call\n git-upload-pack or git-receive-pack on the remote end when get_refs\n gets called.

\n", "fields": [ { "type": "int", @@ -30446,13 +33033,13 @@ ], "type": "struct", "value": "git_error", - "file": "errors.h", - "line": 66, - "lineto": 69, + "file": "git2/errors.h", + "line": 68, + "lineto": 71, "block": "char * message\nint klass", "tdef": "typedef", "description": " Structure to store extra details of the last error that occurred.", - "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", + "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the\n library was build, otherwise one is kept globally for the library

\n", "fields": [ { "type": "char *", @@ -30504,13 +33091,14 @@ "GIT_PASSTHROUGH", "GIT_ITEROVER", "GIT_RETRY", - "GIT_EMISMATCH" + "GIT_EMISMATCH", + "GIT_EINDEXDIRTY" ], "type": "enum", - "file": "errors.h", + "file": "git2/errors.h", "line": 21, - "lineto": 58, - "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH", + "lineto": 60, + "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY", "tdef": "typedef", "description": " Generic return codes ", "comments": "", @@ -30554,7 +33142,7 @@ { "type": "int", "name": "GIT_EUSER", - "comments": "", + "comments": "

GIT_EUSER is a special error that is never generated by libgit2\n code. You can return it from a callback (e.g to stop an iteration)\n to know that it was generated by the callback and not by libgit2.

\n", "value": -7 }, { @@ -30682,6 +33270,12 @@ "name": "GIT_EMISMATCH", "comments": "

Hashsum mismatch in object

\n", "value": -33 + }, + { + "type": "int", + "name": "GIT_EINDEXDIRTY", + "comments": "

Unsaved changes in the index would be overwritten

\n", + "value": -34 } ], "used": { @@ -30730,9 +33324,9 @@ "GITERR_SHA1" ], "type": "enum", - "file": "errors.h", - "line": 72, - "lineto": 107, + "file": "git2/errors.h", + "line": 74, + "lineto": 109, "block": "GITERR_NONE\nGITERR_NOMEMORY\nGITERR_OS\nGITERR_INVALID\nGITERR_REFERENCE\nGITERR_ZLIB\nGITERR_REPOSITORY\nGITERR_CONFIG\nGITERR_REGEX\nGITERR_ODB\nGITERR_INDEX\nGITERR_OBJECT\nGITERR_NET\nGITERR_TAG\nGITERR_TREE\nGITERR_INDEXER\nGITERR_SSL\nGITERR_SUBMODULE\nGITERR_THREAD\nGITERR_STASH\nGITERR_CHECKOUT\nGITERR_FETCHHEAD\nGITERR_MERGE\nGITERR_SSH\nGITERR_FILTER\nGITERR_REVERT\nGITERR_CALLBACK\nGITERR_CHERRYPICK\nGITERR_DESCRIBE\nGITERR_REBASE\nGITERR_FILESYSTEM\nGITERR_PATCH\nGITERR_WORKTREE\nGITERR_SHA1", "tdef": "typedef", "description": " Error classes ", @@ -30959,9 +33553,9 @@ "GIT_FEATURE_NSEC" ], "type": "enum", - "file": "common.h", - "line": 111, - "lineto": 134, + "file": "git2/common.h", + "line": 122, + "lineto": 145, "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", "tdef": "typedef", "description": " Combinations of these values describe the features with which libgit2\n was compiled", @@ -31012,13 +33606,13 @@ ], "type": "struct", "value": "git_fetch_options", - "file": "remote.h", + "file": "git2/remote.h", "line": 555, "lineto": 592, "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Fetch options structure.", - "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", + "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to\n correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", "fields": [ { "type": "int", @@ -31066,6 +33660,48 @@ } } ], + [ + "git_fetch_prune_t", + { + "decl": [ + "GIT_FETCH_PRUNE_UNSPECIFIED", + "GIT_FETCH_PRUNE", + "GIT_FETCH_NO_PRUNE" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 507, + "lineto": 520, + "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FETCH_PRUNE_UNSPECIFIED", + "comments": "

Use the setting from the configuration

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FETCH_PRUNE", + "comments": "

Force pruning on

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FETCH_NO_PRUNE", + "comments": "

Force pruning off

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_filemode_t", { @@ -31078,7 +33714,7 @@ "GIT_FILEMODE_COMMIT" ], "type": "enum", - "file": "types.h", + "file": "git2/types.h", "line": 209, "lineto": 216, "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", @@ -31137,25 +33773,15 @@ [ "git_filter", { - "decl": [ - "unsigned int version", - "const char * attributes", - "git_filter_init_fn initialize", - "git_filter_shutdown_fn shutdown", - "git_filter_check_fn check", - "git_filter_apply_fn apply", - "git_filter_stream_fn stream", - "git_filter_cleanup_fn cleanup" - ], + "decl": "git_filter", "type": "struct", "value": "git_filter", - "file": "sys/filter.h", - "line": 226, - "lineto": 271, - "tdef": null, - "description": " Filter structure used to register custom filters.", - "comments": "

To associate extra data with a filter, allocate extra data and put the git_filter struct at the start of your data buffer, then cast the self pointer to your larger structure when your callback is invoked.

\n", - "block": "unsigned int version\nconst char * attributes\ngit_filter_init_fn initialize\ngit_filter_shutdown_fn shutdown\ngit_filter_check_fn check\ngit_filter_apply_fn apply\ngit_filter_stream_fn stream\ngit_filter_cleanup_fn cleanup", + "file": "git2/filter.h", + "line": 61, + "lineto": 61, + "tdef": "typedef", + "description": " A filter that can transform file data", + "comments": "

This represents a filter that can be used to transform or even replace\n file data. Libgit2 includes one built in filter and it is possible to\n write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and\n"crlf" file attributes to decide how to convert between LF and CRLF\nline endings
  • \n
  • "ident" which replaces "$Id$" in a blob with "$Id: \n$" upon\ncheckout and replaced "$Id: \n$" with "$Id$" on checkin.
  • \n
\n", "fields": [ { "type": "unsigned int", @@ -31228,7 +33854,8 @@ "git_filter_source_id", "git_filter_source_mode", "git_filter_source_path", - "git_filter_source_repo" + "git_filter_source_repo", + "git_filter_stream_fn" ] } } @@ -31241,7 +33868,7 @@ "GIT_FILTER_ALLOW_UNSAFE" ], "type": "enum", - "file": "filter.h", + "file": "git2/filter.h", "line": 41, "lineto": 44, "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE", @@ -31274,12 +33901,13 @@ "decl": "git_filter_list", "type": "struct", "value": "git_filter_list", - "file": "filter.h", + "file": "git2/filter.h", "line": 73, "lineto": 73, "tdef": "typedef", "description": " List of filters to be applied", - "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", + "comments": "

This represents a list of filters to be applied to a file / blob. You\n can build the list with one call, apply it with another, and dispose it\n with a third. In typical usage, there are not many occasions where a\n git_filter_list is needed directly since the library will generally\n handle conversions for you, but it can be convenient to be able to\n build and apply the list sometimes.

\n", + "fields": [], "used": { "returns": [], "needs": [ @@ -31309,7 +33937,7 @@ "GIT_FILTER_CLEAN" ], "type": "enum", - "file": "filter.h", + "file": "git2/filter.h", "line": 31, "lineto": 36, "block": "GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN", @@ -31359,12 +33987,13 @@ "decl": "git_filter_source", "type": "struct", "value": "git_filter_source", - "file": "sys/filter.h", + "file": "git2/sys/filter.h", "line": 95, "lineto": 95, "tdef": "typedef", "description": " A filter source represents a file/blob to be processed", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -31375,7 +34004,8 @@ "git_filter_source_id", "git_filter_source_mode", "git_filter_source_path", - "git_filter_source_repo" + "git_filter_source_repo", + "git_filter_stream_fn" ] } } @@ -31386,12 +34016,13 @@ "decl": "git_hashsig", "type": "struct", "value": "git_hashsig", - "file": "sys/hashsig.h", + "file": "git2/sys/hashsig.h", "line": 17, "lineto": 17, "tdef": "typedef", "description": " Similarity signature of arbitrary text content based on line hashes", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -31413,13 +34044,13 @@ "GIT_HASHSIG_ALLOW_SMALL_FILES" ], "type": "enum", - "file": "sys/hashsig.h", + "file": "git2/sys/hashsig.h", "line": 25, "lineto": 45, "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", "tdef": "typedef", "description": " Options for hashsig computation", - "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", + "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE,\n GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", "fields": [ { "type": "int", @@ -31475,13 +34106,13 @@ "GIT_IDXENTRY_NEW_SKIP_WORKTREE" ], "type": "enum", - "file": "index.h", + "file": "git2/index.h", "line": 115, "lineto": 135, "block": "GIT_IDXENTRY_INTENT_TO_ADD\nGIT_IDXENTRY_SKIP_WORKTREE\nGIT_IDXENTRY_EXTENDED2\nGIT_IDXENTRY_EXTENDED_FLAGS\nGIT_IDXENTRY_UPDATE\nGIT_IDXENTRY_REMOVE\nGIT_IDXENTRY_UPTODATE\nGIT_IDXENTRY_ADDED\nGIT_IDXENTRY_HASHED\nGIT_IDXENTRY_UNHASHED\nGIT_IDXENTRY_WT_REMOVE\nGIT_IDXENTRY_CONFLICTED\nGIT_IDXENTRY_UNPACKED\nGIT_IDXENTRY_NEW_SKIP_WORKTREE", "tdef": "typedef", "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", - "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_IDXENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", + "comments": "

In memory, the flags_extended fields are divided into two parts: the\n fields that are read from and written to disk, and other fields that\n in-memory only and used by libgit2. Only the flags in\n GIT_IDXENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the\n git_index_entry flags_extended value that belong on disk. You\n can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry\n flags_extended value that are only used in-memory by libgit2.\n You can use them to interpret the data in the flags_extended.

\n", "fields": [ { "type": "int", @@ -31580,16 +34211,23 @@ "decl": "git_index", "type": "struct", "value": "git_index", - "file": "types.h", - "line": 135, - "lineto": 135, + "file": "git2/types.h", + "line": 138, + "lineto": 138, "tdef": "typedef", "description": " Memory representation of an index file. ", "comments": "", + "fields": [], "used": { "returns": [ "git_index_get_byindex", - "git_index_get_bypath" + "git_index_get_bypath", + "git_index_name_get_byindex", + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath", + "git_merge_driver_source_ancestor", + "git_merge_driver_source_ours", + "git_merge_driver_source_theirs" ], "needs": [ "git_checkout_index", @@ -31620,6 +34258,10 @@ "git_index_get_byindex", "git_index_get_bypath", "git_index_has_conflicts", + "git_index_name_add", + "git_index_name_clear", + "git_index_name_entrycount", + "git_index_name_get_byindex", "git_index_new", "git_index_open", "git_index_owner", @@ -31630,6 +34272,13 @@ "git_index_remove_all", "git_index_remove_bypath", "git_index_remove_directory", + "git_index_reuc_add", + "git_index_reuc_clear", + "git_index_reuc_entrycount", + "git_index_reuc_find", + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath", + "git_index_reuc_remove", "git_index_set_caps", "git_index_set_version", "git_index_update_all", @@ -31641,6 +34290,7 @@ "git_indexer_commit", "git_indexer_free", "git_indexer_hash", + "git_indexer_init_options", "git_indexer_new", "git_merge_commits", "git_merge_file_from_index", @@ -31664,7 +34314,7 @@ "GIT_INDEX_ADD_CHECK_PATHSPEC" ], "type": "enum", - "file": "index.h", + "file": "git2/index.h", "line": 150, "lineto": 155, "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", @@ -31709,12 +34359,13 @@ "decl": "git_index_conflict_iterator", "type": "struct", "value": "git_index_conflict_iterator", - "file": "types.h", - "line": 138, - "lineto": 138, + "file": "git2/types.h", + "line": 141, + "lineto": 141, "tdef": "typedef", "description": " An iterator for conflicts in the index. ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -31744,13 +34395,13 @@ ], "type": "struct", "value": "git_index_entry", - "file": "index.h", + "file": "git2/index.h", "line": 53, "lineto": 70, "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", "tdef": "typedef", "description": " In-memory representation of a file entry in the index.", - "comments": "

This is a public structure that represents a file entry in the index. The meaning of the fields corresponds to core Git's documentation (in "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be accessed via the first set of GIT_IDXENTRY_... bitmasks below. These flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be accessed via the later GIT_IDXENTRY_... bitmasks below. Some of these flags are read from and written to disk, but some are set aside for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This is enough to detect changes, which is enough for the index to function as a cache, but it should not be taken as an authoritative source for that data.

\n", + "comments": "

This is a public structure that represents a file entry in the index.\n The meaning of the fields corresponds to core Git's documentation (in\n "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be\n accessed via the first set of GIT_IDXENTRY_... bitmasks below. These\n flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be\n accessed via the later GIT_IDXENTRY_... bitmasks below. Some of\n these flags are read from and written to disk, but some are set aside\n for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This\n is enough to detect changes, which is enough for the index to\n function as a cache, but it should not be taken as an authoritative\n source for that data.

\n", "fields": [ { "type": "git_index_time", @@ -31816,7 +34467,10 @@ "used": { "returns": [ "git_index_get_byindex", - "git_index_get_bypath" + "git_index_get_bypath", + "git_merge_driver_source_ancestor", + "git_merge_driver_source_ours", + "git_merge_driver_source_theirs" ], "needs": [ "git_index_add", @@ -31831,6 +34485,147 @@ } } ], + [ + "git_index_name_entry", + { + "decl": [ + "char * ancestor", + "char * ours", + "char * theirs" + ], + "type": "struct", + "value": "git_index_name_entry", + "file": "git2/sys/index.h", + "line": 23, + "lineto": 27, + "block": "char * ancestor\nchar * ours\nchar * theirs", + "tdef": "typedef", + "description": " Representation of a rename conflict entry in the index. ", + "comments": "", + "fields": [ + { + "type": "char *", + "name": "ancestor", + "comments": "" + }, + { + "type": "char *", + "name": "ours", + "comments": "" + }, + { + "type": "char *", + "name": "theirs", + "comments": "" + } + ], + "used": { + "returns": [ + "git_index_name_get_byindex" + ], + "needs": [] + } + } + ], + [ + "git_index_reuc_entry", + { + "decl": [ + "uint32_t [3] mode", + "git_oid [3] oid", + "char * path" + ], + "type": "struct", + "value": "git_index_reuc_entry", + "file": "git2/sys/index.h", + "line": 30, + "lineto": 34, + "block": "uint32_t [3] mode\ngit_oid [3] oid\nchar * path", + "tdef": "typedef", + "description": " Representation of a resolve undo entry in the index. ", + "comments": "", + "fields": [ + { + "type": "uint32_t [3]", + "name": "mode", + "comments": "" + }, + { + "type": "git_oid [3]", + "name": "oid", + "comments": "" + }, + { + "type": "char *", + "name": "path", + "comments": "" + } + ], + "used": { + "returns": [ + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath" + ], + "needs": [] + } + } + ], + [ + "git_index_stage_t", + { + "decl": [ + "GIT_INDEX_STAGE_ANY", + "GIT_INDEX_STAGE_NORMAL", + "GIT_INDEX_STAGE_ANCESTOR", + "GIT_INDEX_STAGE_OURS", + "GIT_INDEX_STAGE_THEIRS" + ], + "type": "enum", + "file": "git2/index.h", + "line": 157, + "lineto": 177, + "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANY", + "comments": "

Match any index stage.

\n\n

Some index APIs take a stage to match; pass this value to match\n any entry matching the path regardless of stage.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_NORMAL", + "comments": "

A normal staged file in the index.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANCESTOR", + "comments": "

The ancestor side of a conflict.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_OURS", + "comments": "

The "ours" side of a conflict.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_THEIRS", + "comments": "

The "theirs" side of a conflict.

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_index_time", { @@ -31840,7 +34635,7 @@ ], "type": "struct", "value": "git_index_time", - "file": "index.h", + "file": "git2/index.h", "line": 26, "lineto": 30, "block": "int32_t seconds\nuint32_t nanoseconds", @@ -31875,7 +34670,7 @@ "GIT_INDEXCAP_FROM_OWNER" ], "type": "enum", - "file": "index.h", + "file": "git2/index.h", "line": 138, "lineto": 143, "block": "GIT_INDEXCAP_IGNORE_CASE\nGIT_INDEXCAP_NO_FILEMODE\nGIT_INDEXCAP_NO_SYMLINKS\nGIT_INDEXCAP_FROM_OWNER", @@ -31914,6 +34709,81 @@ } } ], + [ + "git_indexer", + { + "decl": "git_indexer", + "type": "struct", + "value": "git_indexer", + "file": "git2/indexer.h", + "line": 16, + "lineto": 16, + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [], + "used": { + "returns": [], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_init_options", + "git_indexer_new" + ] + } + } + ], + [ + "git_indexer_options", + { + "decl": [ + "unsigned int version", + "git_transfer_progress_cb progress_cb", + "void * progress_cb_payload", + "unsigned char verify" + ], + "type": "struct", + "value": "git_indexer_options", + "file": "git2/indexer.h", + "line": 18, + "lineto": 28, + "block": "unsigned int version\ngit_transfer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_transfer_progress_cb", + "name": "progress_cb", + "comments": " progress_cb function to call with progress information " + }, + { + "type": "void *", + "name": "progress_cb_payload", + "comments": " progress_cb_payload payload for the progress callback " + }, + { + "type": "unsigned char", + "name": "verify", + "comments": " Do connectivity checks for the received pack " + } + ], + "used": { + "returns": [], + "needs": [ + "git_indexer_init_options", + "git_indexer_new" + ] + } + } + ], [ "git_indxentry_flag_t", { @@ -31922,7 +34792,7 @@ "GIT_IDXENTRY_VALID" ], "type": "enum", - "file": "index.h", + "file": "git2/index.h", "line": 86, "lineto": 89, "block": "GIT_IDXENTRY_EXTENDED\nGIT_IDXENTRY_VALID", @@ -31949,6 +34819,25 @@ } } ], + [ + "git_iterator", + { + "decl": [], + "type": "struct", + "value": "git_iterator", + "file": "git2/notes.h", + "line": 35, + "lineto": 35, + "tdef": null, + "description": "", + "comments": "", + "fields": [], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_libgit2_opt_t", { @@ -31975,16 +34864,20 @@ "GIT_OPT_ENABLE_FSYNC_GITDIR", "GIT_OPT_GET_WINDOWS_SHAREMODE", "GIT_OPT_SET_WINDOWS_SHAREMODE", - "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION" + "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "GIT_OPT_SET_ALLOCATOR", + "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "GIT_OPT_GET_PACK_MAX_OBJECTS", + "GIT_OPT_SET_PACK_MAX_OBJECTS" ], "type": "enum", - "file": "common.h", - "line": 162, - "lineto": 186, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "file": "git2/common.h", + "line": 173, + "lineto": 201, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS", "tdef": "typedef", "description": " Global library options", - "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", + "comments": "

These are used to select which global option to set or get and are\n used in git_libgit2_opts().

\n", "fields": [ { "type": "int", @@ -32123,6 +35016,30 @@ "name": "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", "comments": "", "value": 22 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ALLOCATOR", + "comments": "", + "value": 23 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "comments": "", + "value": 24 + }, + { + "type": "int", + "name": "GIT_OPT_GET_PACK_MAX_OBJECTS", + "comments": "", + "value": 25 + }, + { + "type": "int", + "name": "GIT_OPT_SET_PACK_MAX_OBJECTS", + "comments": "", + "value": 26 } ], "used": { @@ -32131,6 +35048,35 @@ } } ], + [ + "git_mailmap", + { + "decl": "git_mailmap", + "type": "struct", + "value": "git_mailmap", + "file": "git2/types.h", + "line": 438, + "lineto": 438, + "tdef": "typedef", + "description": " Representation of .mailmap file state. ", + "comments": "", + "fields": [], + "used": { + "returns": [], + "needs": [ + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + } + } + ], [ "git_merge_analysis_t", { @@ -32142,9 +35088,9 @@ "GIT_MERGE_ANALYSIS_UNBORN" ], "type": "enum", - "file": "merge.h", - "line": 318, - "lineto": 347, + "file": "git2/merge.h", + "line": 320, + "lineto": 349, "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", "tdef": "typedef", "description": " The results of `git_merge_analysis` indicate the merge opportunities.", @@ -32192,21 +35138,15 @@ [ "git_merge_driver", { - "decl": [ - "unsigned int version", - "git_merge_driver_init_fn initialize", - "git_merge_driver_shutdown_fn shutdown", - "git_merge_driver_apply_fn apply" - ], + "decl": "git_merge_driver", "type": "struct", "value": "git_merge_driver", - "file": "sys/merge.h", - "line": 118, - "lineto": 135, - "block": "unsigned int version\ngit_merge_driver_init_fn initialize\ngit_merge_driver_shutdown_fn shutdown\ngit_merge_driver_apply_fn apply", - "tdef": null, - "description": " Merge driver structure used to register custom merge drivers.", - "comments": "

To associate extra data with a driver, allocate extra data and put the git_merge_driver struct at the start of your data buffer, then cast the self pointer to your larger structure when your callback is invoked.

\n", + "file": "git2/sys/merge.h", + "line": 24, + "lineto": 24, + "tdef": "typedef", + "description": " \n\n git2/sys/merge.h\n ", + "comments": "

@\n{

\n", "fields": [ { "type": "unsigned int", @@ -32230,9 +35170,19 @@ } ], "used": { - "returns": [], + "returns": [ + "git_merge_driver_lookup" + ], "needs": [ - "git_merge_driver_apply_fn" + "git_merge_driver_apply_fn", + "git_merge_driver_init_fn", + "git_merge_driver_register", + "git_merge_driver_shutdown_fn", + "git_merge_driver_source_ancestor", + "git_merge_driver_source_file_options", + "git_merge_driver_source_ours", + "git_merge_driver_source_repo", + "git_merge_driver_source_theirs" ] } } @@ -32243,16 +35193,22 @@ "decl": "git_merge_driver_source", "type": "struct", "value": "git_merge_driver_source", - "file": "sys/merge.h", - "line": 36, - "lineto": 36, + "file": "git2/sys/merge.h", + "line": 41, + "lineto": 41, "tdef": "typedef", "description": " A merge driver source represents the file to be merged", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ - "git_merge_driver_apply_fn" + "git_merge_driver_apply_fn", + "git_merge_driver_source_ancestor", + "git_merge_driver_source_file_options", + "git_merge_driver_source_ours", + "git_merge_driver_source_repo", + "git_merge_driver_source_theirs" ] } } @@ -32267,7 +35223,7 @@ "GIT_MERGE_FILE_FAVOR_UNION" ], "type": "enum", - "file": "merge.h", + "file": "git2/merge.h", "line": 101, "lineto": 131, "block": "GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION", @@ -32321,7 +35277,7 @@ "GIT_MERGE_FILE_DIFF_MINIMAL" ], "type": "enum", - "file": "merge.h", + "file": "git2/merge.h", "line": 136, "lineto": 163, "block": "GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL", @@ -32402,7 +35358,7 @@ ], "type": "struct", "value": "git_merge_file_input", - "file": "merge.h", + "file": "git2/merge.h", "line": 32, "lineto": 46, "block": "unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode", @@ -32459,7 +35415,7 @@ ], "type": "struct", "value": "git_merge_file_options", - "file": "merge.h", + "file": "git2/merge.h", "line": 170, "lineto": 200, "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\ngit_merge_file_flag_t flags\nunsigned short marker_size", @@ -32504,7 +35460,9 @@ } ], "used": { - "returns": [], + "returns": [ + "git_merge_driver_source_file_options" + ], "needs": [ "git_merge_file", "git_merge_file_from_index", @@ -32525,9 +35483,9 @@ ], "type": "struct", "value": "git_merge_file_result", - "file": "merge.h", - "line": 221, - "lineto": 242, + "file": "git2/merge.h", + "line": 222, + "lineto": 243, "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", "tdef": "typedef", "description": " Information about file-level merging", @@ -32579,7 +35537,7 @@ "GIT_MERGE_NO_RECURSIVE" ], "type": "enum", - "file": "merge.h", + "file": "git2/merge.h", "line": 68, "lineto": 95, "block": "GIT_MERGE_FIND_RENAMES\nGIT_MERGE_FAIL_ON_CONFLICT\nGIT_MERGE_SKIP_REUC\nGIT_MERGE_NO_RECURSIVE", @@ -32634,9 +35592,9 @@ ], "type": "struct", "value": "git_merge_options", - "file": "merge.h", - "line": 247, - "lineto": 296, + "file": "git2/merge.h", + "line": 248, + "lineto": 297, "block": "unsigned int version\ngit_merge_flag_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\ngit_merge_file_flag_t file_flags", "tdef": "typedef", "description": " Merging options", @@ -32710,9 +35668,9 @@ "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY" ], "type": "enum", - "file": "merge.h", - "line": 352, - "lineto": 370, + "file": "git2/merge.h", + "line": 354, + "lineto": 372, "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", "tdef": "typedef", "description": " The user's stated preference for merges.", @@ -32745,24 +35703,6 @@ } } ], - [ - "git_merge_result", - { - "decl": "git_merge_result", - "type": "struct", - "value": "git_merge_result", - "file": "types.h", - "line": 185, - "lineto": 185, - "tdef": "typedef", - "description": " Merge result ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_message_trailer", { @@ -32772,7 +35712,7 @@ ], "type": "struct", "value": "git_message_trailer", - "file": "message.h", + "file": "git2/message.h", "line": 43, "lineto": 46, "block": "const char * key\nconst char * value", @@ -32810,13 +35750,13 @@ ], "type": "struct", "value": "git_message_trailer_array", - "file": "message.h", + "file": "git2/message.h", "line": 54, "lineto": 60, "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", "tdef": "typedef", "description": " Represents an array of git message trailers.", - "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", + "comments": "

Struct members under the private comment are private, subject to change\n and should not be used by callers.

\n", "fields": [ { "type": "git_message_trailer *", @@ -32849,12 +35789,13 @@ "decl": "git_note", "type": "struct", "value": "git_note", - "file": "types.h", - "line": 153, - "lineto": 153, + "file": "git2/types.h", + "line": 156, + "lineto": 156, "tdef": "typedef", "description": " Representation of a git note ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -32880,7 +35821,7 @@ "decl": "git_note_iterator", "type": "struct", "value": "git_note_iterator", - "file": "notes.h", + "file": "git2/notes.h", "line": 35, "lineto": 35, "tdef": "typedef", @@ -32903,12 +35844,13 @@ "decl": "git_object", "type": "struct", "value": "git_object", - "file": "types.h", - "line": 111, - "lineto": 111, + "file": "git2/types.h", + "line": 114, + "lineto": 114, "tdef": "typedef", "description": " Representation of a generic object in a repository ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -32945,12 +35887,13 @@ "decl": "git_odb", "type": "struct", "value": "git_odb", - "file": "types.h", - "line": 81, - "lineto": 81, + "file": "git2/types.h", + "line": 84, + "lineto": 84, "tdef": "typedef", "description": " An open object database handle. ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -32962,6 +35905,7 @@ "git_odb_add_backend", "git_odb_add_disk_alternate", "git_odb_backend_loose", + "git_odb_backend_malloc", "git_odb_backend_one_pack", "git_odb_backend_pack", "git_odb_exists", @@ -33005,9 +35949,9 @@ "decl": "git_odb_backend", "type": "struct", "value": "git_odb_backend", - "file": "types.h", - "line": 84, - "lineto": 84, + "file": "git2/types.h", + "line": 87, + "lineto": 87, "block": "unsigned int version\ngit_odb * odb\nint (*)(void **, size_t *, git_otype *, git_odb_backend *, const git_oid *) read\nint (*)(git_oid *, void **, size_t *, git_otype *, git_odb_backend *, const git_oid *, size_t) read_prefix\nint (*)(size_t *, git_otype *, git_odb_backend *, const git_oid *) read_header\nint (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_otype) write\nint (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_otype) writestream\nint (*)(git_odb_stream **, size_t *, git_otype *, git_odb_backend *, const git_oid *) readstream\nint (*)(git_odb_backend *, const git_oid *) exists\nint (*)(git_oid *, git_odb_backend *, const git_oid *, size_t) exists_prefix\nint (*)(git_odb_backend *) refresh\nint (*)(git_odb_backend *, git_odb_foreach_cb, void *) foreach\nint (*)(git_odb_writepack **, git_odb_backend *, git_odb *, git_transfer_progress_cb, void *) writepack\nint (*)(git_odb_backend *, const git_oid *) freshen\nvoid (*)(git_odb_backend *) free", "tdef": "typedef", "description": " A custom backend in an ODB ", @@ -33098,6 +36042,7 @@ "git_odb_add_alternate", "git_odb_add_backend", "git_odb_backend_loose", + "git_odb_backend_malloc", "git_odb_backend_one_pack", "git_odb_backend_pack", "git_odb_get_backend", @@ -33116,7 +36061,7 @@ ], "type": "struct", "value": "git_odb_expand_id", - "file": "odb.h", + "file": "git2/odb.h", "line": 180, "lineto": 195, "block": "git_oid id\nunsigned short length\ngit_otype type", @@ -33154,12 +36099,13 @@ "decl": "git_odb_object", "type": "struct", "value": "git_odb_object", - "file": "types.h", - "line": 87, - "lineto": 87, + "file": "git2/types.h", + "line": 90, + "lineto": 90, "tdef": "typedef", "description": " An object read from the ODB ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -33181,10 +36127,10 @@ "decl": "git_odb_stream", "type": "struct", "value": "git_odb_stream", - "file": "types.h", - "line": 90, - "lineto": 90, - "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_off_t declared_size\ngit_off_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const int *) finalize_write\nvoid (*)(git_odb_stream *) free", + "file": "git2/types.h", + "line": 93, + "lineto": 93, + "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_off_t declared_size\ngit_off_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", "tdef": "typedef", "description": " A stream to read/write from the ODB ", "comments": "", @@ -33225,7 +36171,7 @@ "comments": " Write `len` bytes from `buffer` into the stream." }, { - "type": "int (*)(git_odb_stream *, const int *)", + "type": "int (*)(git_odb_stream *, const git_oid *)", "name": "finalize_write", "comments": " Store the contents of the stream as an object with the id\n specified in `oid`.\n\n This method might not be invoked if:\n - an error occurs earlier with the `write` callback,\n - the object referred to by `oid` already exists in any backend, or\n - the final number of received bytes differs from the size declared\n with `git_odb_open_wstream()`" }, @@ -33257,7 +36203,7 @@ "GIT_STREAM_RW" ], "type": "enum", - "file": "odb_backend.h", + "file": "git2/odb_backend.h", "line": 70, "lineto": 74, "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", @@ -33296,9 +36242,9 @@ "decl": "git_odb_writepack", "type": "struct", "value": "git_odb_writepack", - "file": "types.h", - "line": 93, - "lineto": 93, + "file": "git2/types.h", + "line": 96, + "lineto": 96, "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_transfer_progress *) append\nint (*)(git_odb_writepack *, git_transfer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "tdef": "typedef", "description": " A stream to write a packfile to the ODB ", @@ -33341,7 +36287,7 @@ ], "type": "struct", "value": "git_oid", - "file": "oid.h", + "file": "git2/oid.h", "line": 33, "lineto": 36, "block": "unsigned char [20] id", @@ -33403,6 +36349,7 @@ "git_diff_patchid", "git_graph_ahead_behind", "git_graph_descendant_of", + "git_index_reuc_add", "git_index_write_tree", "git_index_write_tree_to", "git_merge_base", @@ -33461,18 +36408,24 @@ "git_reference_name_to_id", "git_reference_set_target", "git_reflog_append", + "git_repository_fetchhead_foreach_cb", "git_repository_hashfile", + "git_repository_mergehead_foreach_cb", "git_repository_set_head_detached", "git_revwalk_hide", "git_revwalk_hide_cb", "git_revwalk_next", "git_revwalk_push", + "git_stash_cb", + "git_stash_save", "git_tag_annotation_create", "git_tag_create", "git_tag_create_frombuffer", "git_tag_create_lightweight", + "git_tag_foreach_cb", "git_tag_lookup", "git_tag_lookup_prefix", + "git_transaction_set_target", "git_tree_create_updated", "git_tree_entry_byid", "git_tree_lookup", @@ -33490,12 +36443,13 @@ "decl": "git_oid_shorten", "type": "struct", "value": "git_oid_shorten", - "file": "oid.h", + "file": "git2/oid.h", "line": 215, "lineto": 215, "tdef": "typedef", "description": " OID Shortener object", "comments": "", + "fields": [], "used": { "returns": [ "git_oid_shorten_new" @@ -33516,7 +36470,7 @@ ], "type": "struct", "value": "git_oidarray", - "file": "oidarray.h", + "file": "git2/oidarray.h", "line": 16, "lineto": 19, "block": "git_oid * ids\nsize_t count", @@ -33561,9 +36515,9 @@ "GIT_OBJ_REF_DELTA" ], "type": "enum", - "file": "types.h", - "line": 67, - "lineto": 78, + "file": "git2/types.h", + "line": 70, + "lineto": 81, "block": "GIT_OBJ_ANY\nGIT_OBJ_BAD\nGIT_OBJ__EXT1\nGIT_OBJ_COMMIT\nGIT_OBJ_TREE\nGIT_OBJ_BLOB\nGIT_OBJ_TAG\nGIT_OBJ__EXT2\nGIT_OBJ_OFS_DELTA\nGIT_OBJ_REF_DELTA", "tdef": "typedef", "description": " Basic type (loose or packed) of any Git object. ", @@ -33664,12 +36618,13 @@ "decl": "git_packbuilder", "type": "struct", "value": "git_packbuilder", - "file": "types.h", - "line": 156, - "lineto": 156, + "file": "git2/types.h", + "line": 159, + "lineto": 159, "tdef": "typedef", "description": " Representation of a git packbuilder ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -33686,6 +36641,7 @@ "git_packbuilder_set_callbacks", "git_packbuilder_set_threads", "git_packbuilder_write", + "git_packbuilder_write_buf", "git_packbuilder_written" ] } @@ -33699,7 +36655,7 @@ "GIT_PACKBUILDER_DELTAFICATION" ], "type": "enum", - "file": "pack.h", + "file": "git2/pack.h", "line": 51, "lineto": 54, "block": "GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION", @@ -33732,12 +36688,13 @@ "decl": "git_patch", "type": "struct", "value": "git_patch", - "file": "patch.h", + "file": "git2/patch.h", "line": 29, "lineto": 29, "tdef": "typedef", "description": " The diff patch is used to store all the text diffs for a delta.", - "comments": "

You can easily loop over the content of patches and get information about them.

\n", + "comments": "

You can easily loop over the content of patches and get information about\n them.

\n", + "fields": [], "used": { "returns": [], "needs": [ @@ -33759,18 +36716,107 @@ } } ], + [ + "git_path_fs", + { + "decl": [ + "GIT_PATH_FS_GENERIC", + "GIT_PATH_FS_NTFS", + "GIT_PATH_FS_HFS" + ], + "type": "enum", + "file": "git2/sys/path.h", + "line": 34, + "lineto": 41, + "block": "GIT_PATH_FS_GENERIC\nGIT_PATH_FS_NTFS\nGIT_PATH_FS_HFS", + "tdef": "typedef", + "description": " The kinds of checks to perform according to which filesystem we are trying to\n protect.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PATH_FS_GENERIC", + "comments": "

Do both NTFS- and HFS-specific checks

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATH_FS_NTFS", + "comments": "

Do NTFS-specific checks only

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATH_FS_HFS", + "comments": "

Do HFS-specific checks only

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [ + "git_path_is_gitfile" + ] + } + } + ], + [ + "git_path_gitfile", + { + "decl": [ + "GIT_PATH_GITFILE_GITIGNORE", + "GIT_PATH_GITFILE_GITMODULES", + "GIT_PATH_GITFILE_GITATTRIBUTES" + ], + "type": "enum", + "file": "git2/sys/path.h", + "line": 21, + "lineto": 28, + "block": "GIT_PATH_GITFILE_GITIGNORE\nGIT_PATH_GITFILE_GITMODULES\nGIT_PATH_GITFILE_GITATTRIBUTES", + "tdef": "typedef", + "description": " The kinds of git-specific files we know about.", + "comments": "

The order needs to stay the same to not break the gitfiles\n array in path.c

\n", + "fields": [ + { + "type": "int", + "name": "GIT_PATH_GITFILE_GITIGNORE", + "comments": "

Check for the .gitignore file

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATH_GITFILE_GITMODULES", + "comments": "

Check for the .gitmodules file

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATH_GITFILE_GITATTRIBUTES", + "comments": "

Check for the .gitattributes file

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [ + "git_path_is_gitfile" + ] + } + } + ], [ "git_pathspec", { "decl": "git_pathspec", "type": "struct", "value": "git_pathspec", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 20, "lineto": 20, "tdef": "typedef", "description": " Compiled pathspec", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -33804,7 +36850,7 @@ "GIT_PATHSPEC_FAILURES_ONLY" ], "type": "enum", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 30, "lineto": 73, "block": "GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY", @@ -33867,12 +36913,13 @@ "decl": "git_pathspec_match_list", "type": "struct", "value": "git_pathspec_match_list", - "file": "pathspec.h", + "file": "git2/pathspec.h", "line": 25, "lineto": 25, "tdef": "typedef", "description": " List of filenames matching a pathspec", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -33903,13 +36950,13 @@ ], "type": "struct", "value": "git_proxy_options", - "file": "proxy.h", + "file": "git2/proxy.h", "line": 42, "lineto": 77, "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "tdef": "typedef", "description": " Options for connecting through a proxy", - "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", + "comments": "

Note that not all types may be supported, depending on the platform\n and compilation options.

\n", "fields": [ { "type": "unsigned int", @@ -33934,7 +36981,7 @@ { "type": "git_transport_certificate_check_cb", "name": "certificate_check", - "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 1 to allow the connection, 0\n to disallow it or a negative value to indicate an error." + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." }, { "type": "void *", @@ -33961,7 +37008,7 @@ "GIT_PROXY_SPECIFIED" ], "type": "enum", - "file": "proxy.h", + "file": "git2/proxy.h", "line": 18, "lineto": 34, "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", @@ -34000,12 +37047,13 @@ "decl": "git_push", "type": "struct", "value": "git_push", - "file": "types.h", + "file": "git2/types.h", "line": 240, "lineto": 240, "tdef": "typedef", "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -34029,9 +37077,9 @@ ], "type": "struct", "value": "git_push_options", - "file": "remote.h", - "line": 615, - "lineto": 642, + "file": "git2/remote.h", + "line": 616, + "lineto": 643, "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", @@ -34084,7 +37132,7 @@ ], "type": "struct", "value": "git_push_update", - "file": "remote.h", + "file": "git2/remote.h", "line": 359, "lineto": 376, "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", @@ -34127,12 +37175,13 @@ "decl": "git_rebase", "type": "struct", "value": "git_rebase", - "file": "types.h", + "file": "git2/types.h", "line": 191, "lineto": 191, "tdef": "typedef", "description": " Representation of a rebase ", "comments": "", + "fields": [], "used": { "returns": [ "git_rebase_operation_byindex" @@ -34164,13 +37213,13 @@ ], "type": "struct", "value": "git_rebase_operation", - "file": "rebase.h", - "line": 130, - "lineto": 145, + "file": "git2/rebase.h", + "line": 132, + "lineto": 147, "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", "tdef": "typedef", "description": " A rebase operation", - "comments": "

Describes a single instruction/operation to be performed during the rebase.

\n", + "comments": "

Describes a single instruction/operation to be performed during the\n rebase.

\n", "fields": [ { "type": "git_rebase_operation_t", @@ -34210,9 +37259,9 @@ "GIT_REBASE_OPERATION_EXEC" ], "type": "enum", - "file": "rebase.h", - "line": 78, - "lineto": 114, + "file": "git2/rebase.h", + "line": 80, + "lineto": 116, "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "tdef": "typedef", "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", @@ -34261,6 +37310,68 @@ } } ], + [ + "git_rebase_options", + { + "decl": [ + "unsigned int version", + "int quiet", + "int inmemory", + "const char * rewrite_notes_ref", + "git_merge_options merge_options", + "git_checkout_options checkout_options" + ], + "type": "struct", + "value": "git_rebase_options", + "file": "git2/rebase.h", + "line": 31, + "lineto": 75, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options", + "tdef": "typedef", + "description": " Rebase options", + "comments": "

Use to tell the rebase machinery how to operate.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "int", + "name": "quiet", + "comments": " Used by `git_rebase_init`, this will instruct other clients working\n on this rebase that you want a quiet rebase experience, which they\n may choose to provide in an application-specific manner. This has no\n effect upon libgit2 directly, but is provided for interoperability\n between Git tools." + }, + { + "type": "int", + "name": "inmemory", + "comments": " Used by `git_rebase_init`, this will begin an in-memory rebase,\n which will allow callers to step through the rebase operations and\n commit the rebased changes, but will not rewind HEAD or update the\n repository to be in a rebasing state. This will not interfere with\n the working directory (if there is one)." + }, + { + "type": "const char *", + "name": "rewrite_notes_ref", + "comments": " Used by `git_rebase_finish`, this is the name of the notes reference\n used to rewrite notes for rebased commits when finishing the rebase;\n if NULL, the contents of the configuration option `notes.rewriteRef`\n is examined, unless the configuration option `notes.rewrite.rebase`\n is set to false. If `notes.rewriteRef` is also NULL, notes will\n not be rewritten." + }, + { + "type": "git_merge_options", + "name": "merge_options", + "comments": " Options to control how trees are merged during `git_rebase_next`." + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." + } + ], + "used": { + "returns": [], + "needs": [ + "git_rebase_init", + "git_rebase_init_options", + "git_rebase_open" + ] + } + } + ], [ "git_ref_t", { @@ -34271,7 +37382,7 @@ "GIT_REF_LISTALL" ], "type": "enum", - "file": "types.h", + "file": "git2/types.h", "line": 194, "lineto": 199, "block": "GIT_REF_INVALID\nGIT_REF_OID\nGIT_REF_SYMBOLIC\nGIT_REF_LISTALL", @@ -34318,12 +37429,13 @@ "decl": "git_refdb", "type": "struct", "value": "git_refdb", - "file": "types.h", - "line": 96, - "lineto": 96, + "file": "git2/types.h", + "line": 99, + "lineto": 99, "tdef": "typedef", "description": " An open refs database handle. ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -34346,9 +37458,9 @@ "decl": "git_refdb_backend", "type": "struct", "value": "git_refdb_backend", - "file": "types.h", - "line": 99, - "lineto": 99, + "file": "git2/types.h", + "line": 102, + "lineto": 102, "block": "unsigned int version\nint (*)(int *, git_refdb_backend *, const char *) exists\nint (*)(git_reference **, git_refdb_backend *, const char *) lookup\nint (*)(git_reference_iterator **, struct git_refdb_backend *, const char *) iterator\nint (*)(git_refdb_backend *, const git_reference *, int, const git_signature *, const char *, const git_oid *, const char *) write\nint (*)(git_reference **, git_refdb_backend *, const char *, const char *, int, const git_signature *, const char *) rename\nint (*)(git_refdb_backend *, const char *, const git_oid *, const char *) del\nint (*)(git_refdb_backend *) compress\nint (*)(git_refdb_backend *, const char *) has_log\nint (*)(git_refdb_backend *, const char *) ensure_log\nvoid (*)(git_refdb_backend *) free\nint (*)(git_reflog **, git_refdb_backend *, const char *) reflog_read\nint (*)(git_refdb_backend *, git_reflog *) reflog_write\nint (*)(git_refdb_backend *, const char *, const char *) reflog_rename\nint (*)(git_refdb_backend *, const char *) reflog_delete\nint (*)(void **, git_refdb_backend *, const char *) lock\nint (*)(git_refdb_backend *, void *, int, int, const git_reference *, const git_signature *, const char *) unlock", "tdef": "typedef", "description": " A custom backend for refs ", @@ -34456,12 +37568,13 @@ "decl": "git_reference", "type": "struct", "value": "git_reference", - "file": "types.h", - "line": 173, - "lineto": 173, + "file": "git2/types.h", + "line": 176, + "lineto": 176, "tdef": "typedef", "description": " In-memory representation of a reference. ", "comments": "", + "fields": [], "used": { "returns": [ "git_reference__alloc", @@ -34487,6 +37600,7 @@ "git_reference_dup", "git_reference_dwim", "git_reference_foreach", + "git_reference_foreach_cb", "git_reference_foreach_glob", "git_reference_foreach_name", "git_reference_free", @@ -34527,9 +37641,9 @@ "decl": "git_reference_iterator", "type": "struct", "value": "git_reference_iterator", - "file": "types.h", - "line": 176, - "lineto": 176, + "file": "git2/types.h", + "line": 179, + "lineto": 179, "block": "git_refdb * db\nint (*)(git_reference **, git_reference_iterator *) next\nint (*)(const char **, git_reference_iterator *) next_name\nvoid (*)(git_reference_iterator *) free", "tdef": "typedef", "description": " Iterator for references ", @@ -34578,7 +37692,7 @@ "GIT_REF_FORMAT_REFSPEC_SHORTHAND" ], "type": "enum", - "file": "refs.h", + "file": "git2/refs.h", "line": 639, "lineto": 668, "block": "GIT_REF_FORMAT_NORMAL\nGIT_REF_FORMAT_ALLOW_ONELEVEL\nGIT_REF_FORMAT_REFSPEC_PATTERN\nGIT_REF_FORMAT_REFSPEC_SHORTHAND", @@ -34623,19 +37737,22 @@ "decl": "git_reflog", "type": "struct", "value": "git_reflog", - "file": "types.h", - "line": 150, - "lineto": 150, + "file": "git2/types.h", + "line": 153, + "lineto": 153, "tdef": "typedef", "description": " Representation of a reference log ", "comments": "", + "fields": [], "used": { "returns": [ + "git_reflog_entry__alloc", "git_reflog_entry_byindex" ], "needs": [ "git_reflog_append", "git_reflog_drop", + "git_reflog_entry__free", "git_reflog_entry_byindex", "git_reflog_entry_committer", "git_reflog_entry_id_new", @@ -34644,7 +37761,8 @@ "git_reflog_entrycount", "git_reflog_free", "git_reflog_read", - "git_reflog_write" + "git_reflog_write", + "git_transaction_set_reflog" ] } } @@ -34655,17 +37773,20 @@ "decl": "git_reflog_entry", "type": "struct", "value": "git_reflog_entry", - "file": "types.h", - "line": 147, - "lineto": 147, + "file": "git2/types.h", + "line": 150, + "lineto": 150, "tdef": "typedef", "description": " Representation of a reference log entry ", "comments": "", + "fields": [], "used": { "returns": [ + "git_reflog_entry__alloc", "git_reflog_entry_byindex" ], "needs": [ + "git_reflog_entry__free", "git_reflog_entry_committer", "git_reflog_entry_id_new", "git_reflog_entry_id_old", @@ -34674,18 +37795,52 @@ } } ], + [ + "git_refspec", + { + "decl": "git_refspec", + "type": "struct", + "value": "git_refspec", + "file": "git2/types.h", + "line": 222, + "lineto": 222, + "tdef": "typedef", + "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", + "comments": "", + "fields": [], + "used": { + "returns": [ + "git_remote_get_refspec" + ], + "needs": [ + "git_refspec_direction", + "git_refspec_dst", + "git_refspec_dst_matches", + "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", + "git_refspec_rtransform", + "git_refspec_src", + "git_refspec_src_matches", + "git_refspec_string", + "git_refspec_transform" + ] + } + } + ], [ "git_remote", { "decl": "git_remote", "type": "struct", "value": "git_remote", - "file": "types.h", + "file": "git2/types.h", "line": 228, "lineto": 228, "tdef": "typedef", "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entires).", "comments": "", + "fields": [], "used": { "returns": [ "git_remote_autotag" @@ -34745,7 +37900,7 @@ "GIT_REMOTE_DOWNLOAD_TAGS_ALL" ], "type": "enum", - "file": "remote.h", + "file": "git2/remote.h", "line": 527, "lineto": 545, "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", @@ -34792,30 +37947,16 @@ [ "git_remote_callbacks", { - "decl": [ - "unsigned int version", - "git_transport_message_cb sideband_progress", - "int (*)(git_remote_completion_type, void *) completion", - "git_cred_acquire_cb credentials", - "git_transport_certificate_check_cb certificate_check", - "git_transfer_progress_cb transfer_progress", - "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", - "git_packbuilder_progress pack_progress", - "git_push_transfer_progress push_transfer_progress", - "git_push_update_reference_cb push_update_reference", - "git_push_negotiation push_negotiation", - "git_transport_cb transport", - "void * payload" - ], + "decl": "git_remote_callbacks", "type": "struct", "value": "git_remote_callbacks", - "file": "remote.h", - "line": 408, - "lineto": 490, + "file": "git2/types.h", + "line": 244, + "lineto": 244, "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_type, void *) completion\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_transfer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload", - "tdef": null, - "description": " The callback settings structure", - "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", + "tdef": "typedef", + "description": "", + "comments": "", "fields": [ { "type": "unsigned int", @@ -34840,7 +37981,7 @@ { "type": "git_transport_certificate_check_cb", "name": "certificate_check", - "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 1 to allow the connection, 0\n to disallow it or a negative value to indicate an error." + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." }, { "type": "git_transfer_progress_cb", @@ -34903,7 +38044,7 @@ "GIT_REMOTE_COMPLETION_ERROR" ], "type": "enum", - "file": "remote.h", + "file": "git2/remote.h", "line": 344, "lineto": 348, "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", @@ -34939,21 +38080,15 @@ [ "git_remote_head", { - "decl": [ - "int local", - "git_oid oid", - "git_oid loid", - "char * name", - "char * symref_target" - ], + "decl": "git_remote_head", "type": "struct", "value": "git_remote_head", - "file": "net.h", - "line": 40, - "lineto": 50, + "file": "git2/types.h", + "line": 243, + "lineto": 243, "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", - "tdef": null, - "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", + "tdef": "typedef", + "description": "", "comments": "", "fields": [ { @@ -34997,18 +38132,20 @@ "decl": "git_repository", "type": "struct", "value": "git_repository", - "file": "types.h", - "line": 105, - "lineto": 105, + "file": "git2/types.h", + "line": 108, + "lineto": 108, "tdef": "typedef", "description": " Representation of an existing git repository,\n including all its object contents", "comments": "", + "fields": [], "used": { "returns": [ "git_blob_owner", "git_commit_owner", "git_filter_source_repo", "git_index_owner", + "git_merge_driver_source_repo", "git_object_owner", "git_reference_owner", "git_remote_owner", @@ -35038,6 +38175,9 @@ "git_branch_create_from_annotated", "git_branch_iterator_new", "git_branch_lookup", + "git_branch_remote_name", + "git_branch_upstream_name", + "git_branch_upstream_remote", "git_checkout_head", "git_checkout_index", "git_checkout_tree", @@ -35073,6 +38213,7 @@ "git_ignore_clear_internal_rules", "git_ignore_path_is_ignored", "git_index_write_tree_to", + "git_mailmap_from_repository", "git_mempack_dump", "git_merge", "git_merge_analysis", @@ -35088,6 +38229,7 @@ "git_note_commit_read", "git_note_commit_remove", "git_note_create", + "git_note_default_ref", "git_note_foreach", "git_note_iterator_new", "git_note_read", @@ -35145,6 +38287,7 @@ "git_repository_hashfile", "git_repository_head", "git_repository_head_detached", + "git_repository_head_detached_for_worktree", "git_repository_head_for_worktree", "git_repository_head_unborn", "git_repository_ident", @@ -35200,6 +38343,7 @@ "git_stash_drop", "git_stash_foreach", "git_stash_pop", + "git_stash_save", "git_status_file", "git_status_foreach", "git_status_foreach_ext", @@ -35227,6 +38371,7 @@ "git_tag_list_match", "git_tag_lookup", "git_tag_lookup_prefix", + "git_transaction_new", "git_tree_create_updated", "git_tree_entry_to_object", "git_tree_lookup", @@ -35253,13 +38398,13 @@ "GIT_REPOSITORY_INIT_RELATIVE_GITLINK" ], "type": "enum", - "file": "repository.h", + "file": "git2/repository.h", "line": 232, "lineto": 240, "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", "tdef": "typedef", "description": " Option flags for `git_repository_init_ext`.", - "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo. Details of individual values are:

\n\n
    \n
  • BARE - Create a bare repository with no working directory. * NO_REINIT - Return an GIT_EEXISTS error if the repo_path appears to already be an git repository. * NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo path for non-bare repos (if it is not already there), but passing this flag prevents that behavior. * MKDIR - Make the repo_path (and workdir_path) as needed. Init is always willing to create the ".git" directory even without this flag. This flag tells init to create the trailing component of the repo and workdir paths as needed. * MKPATH - Recursively make all components of the repo and workdir paths as necessary. * EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to initialize a new repo. This flags enables external templates, looking the "template_path" from the options if set, or the init.templatedir global config if not, or falling back on "/usr/share/git-core/templates" if it exists. * GIT_REPOSITORY_INIT_RELATIVE_GITLINK - If an alternate workdir is specified, use relative paths for the gitdir and core.worktree.
  • \n
\n", + "comments": "

These flags configure extra behaviors to git_repository_init_ext.\n In every case, the default behavior is the zero value (i.e. flag is\n not set). Just OR the flag values together for the flags parameter\n when initializing a new repo. Details of individual values are:

\n\n
    \n
  • BARE - Create a bare repository with no working directory.
  • \n
  • NO_REINIT - Return an GIT_EEXISTS error if the repo_path appears to\n already be an git repository.
  • \n
  • NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo\n path for non-bare repos (if it is not already there), but\n passing this flag prevents that behavior.
  • \n
  • MKDIR - Make the repo_path (and workdir_path) as needed. Init is\n always willing to create the ".git" directory even without this\n flag. This flag tells init to create the trailing component of\n the repo and workdir paths as needed.
  • \n
  • MKPATH - Recursively make all components of the repo and workdir\n paths as necessary.
  • \n
  • EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to\n initialize a new repo. This flags enables external templates,\n looking the "template_path" from the options if set, or the\n init.templatedir global config if not, or falling back on\n "/usr/share/git-core/templates" if it exists.
  • \n
  • GIT_REPOSITORY_INIT_RELATIVE_GITLINK - If an alternate workdir is\n specified, use relative paths for the gitdir and core.worktree.
  • \n
\n", "fields": [ { "type": "int", @@ -35319,13 +38464,13 @@ "GIT_REPOSITORY_INIT_SHARED_ALL" ], "type": "enum", - "file": "repository.h", + "file": "git2/repository.h", "line": 255, "lineto": 259, "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", "tdef": "typedef", "description": " Mode options for `git_repository_init_ext`.", - "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the following modes:

\n\n
    \n
  • SHARED_UMASK - Use permissions configured by umask - the default. * SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo to be group writable and "g+sx" for sticky group assignment. * SHARED_ALL - Use "--shared=all" behavior, adding world readability. * Anything else - Set to custom value.
  • \n
\n", + "comments": "

Set the mode field of the git_repository_init_options structure\n either to the custom mode that you would like, or to one of the\n following modes:

\n\n
    \n
  • SHARED_UMASK - Use permissions configured by umask - the default.
  • \n
  • SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo\n to be group writable and "g+sx" for sticky group assignment.
  • \n
  • SHARED_ALL - Use "--shared=all" behavior, adding world readability.
  • \n
  • Anything else - Set to custom value.
  • \n
\n", "fields": [ { "type": "int", @@ -35367,13 +38512,13 @@ ], "type": "struct", "value": "git_repository_init_options", - "file": "repository.h", + "file": "git2/repository.h", "line": 289, "lineto": 298, "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", "tdef": "typedef", "description": " Extended options structure for `git_repository_init_ext`.", - "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features. The fields are:

\n\n
    \n
  • flags - Combination of GIT_REPOSITORY_INIT flags above. * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants above, or to a custom value that you would like. * workdir_path - The path to the working dir or NULL for default (i.e. repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not the "natural" working directory, a .git gitlink file will be created here linking to the repo_path. * description - If set, this will be used to initialize the "description" file in the repository, instead of using the template content. * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains the path to use for the template directory. If this is NULL, the config or default directory options will be used instead. * initial_head - The name of the head to point HEAD at. If NULL, then this will be treated as "master" and the HEAD ref will be set to "refs/heads/master". If this begins with "refs/" it will be used verbatim; otherwise "refs/heads/" will be prefixed. * origin_url - If this is non-NULL, then after the rest of the repository initialization is completed, an "origin" remote will be added pointing to this URL.
  • \n
\n", + "comments": "

This contains extra options for git_repository_init_ext that enable\n additional initialization features. The fields are:

\n\n
    \n
  • flags - Combination of GIT_REPOSITORY_INIT flags above.
  • \n
  • mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...\n constants above, or to a custom value that you would like.
  • \n
  • workdir_path - The path to the working dir or NULL for default (i.e.\n repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,\n IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not\n the "natural" working directory, a .git gitlink file will be\n created here linking to the repo_path.
  • \n
  • description - If set, this will be used to initialize the "description"\n file in the repository, instead of using the template content.
  • \n
  • template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,\n this contains the path to use for the template directory. If\n this is NULL, the config or default directory options will be\n used instead.
  • \n
  • initial_head - The name of the head to point HEAD at. If NULL, then\n this will be treated as "master" and the HEAD ref will be set\n to "refs/heads/master". If this begins with "refs/" it will be\n used verbatim; otherwise "refs/heads/" will be prefixed.
  • \n
  • origin_url - If this is non-NULL, then after the rest of the\n repository initialization is completed, an "origin" remote\n will be added pointing to this URL.
  • \n
\n", "fields": [ { "type": "unsigned int", @@ -35445,9 +38590,9 @@ "GIT_REPOSITORY_ITEM_WORKTREES" ], "type": "enum", - "file": "repository.h", - "line": 412, - "lineto": 427, + "file": "git2/repository.h", + "line": 414, + "lineto": 429, "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES", "tdef": "typedef", "description": " List of items which belong to the git repository layout", @@ -35557,13 +38702,13 @@ "GIT_REPOSITORY_OPEN_FROM_ENV" ], "type": "enum", - "file": "repository.h", + "file": "git2/repository.h", "line": 126, "lineto": 132, "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", "tdef": "typedef", "description": " Option flags for `git_repository_open_ext`.", - "comments": "
    \n
  • GIT_REPOSITORY_OPEN_NO_SEARCH - Only open the repository if it can be immediately found in the start_path. Do not walk up from the start_path looking at parent directories. * GIT_REPOSITORY_OPEN_CROSS_FS - Unless this flag is set, open will not continue searching across filesystem boundaries (i.e. when st_dev changes from the stat system call). (E.g. Searching in a user's home directory "/home/user/source/" will not return "/.git/" as the found repo if "/" is a different filesystem than "/home".) * GIT_REPOSITORY_OPEN_BARE - Open repository as a bare repo regardless of core.bare config, and defer loading config file for faster setup. Unlike git_repository_open_bare, this can follow gitlinks. * GIT_REPOSITORY_OPEN_NO_DOTGIT - Do not check for a repository by appending /.git to the start_path; only open the repository if start_path itself points to the git directory. * GIT_REPOSITORY_OPEN_FROM_ENV - Find and open a git repository, respecting the environment variables used by the git command-line tools. If set, git_repository_open_ext will ignore the other flags and the ceiling_dirs argument, and will allow a NULL path to use GIT_DIR or search from the current directory. The search for a repository will respect $GIT_CEILING_DIRECTORIES and $GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will respect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and $GIT_ALTERNATE_OBJECT_DIRECTORIES. In the future, this flag will also cause git_repository_open_ext to respect $GIT_WORK_TREE and $GIT_COMMON_DIR; currently, git_repository_open_ext with this flag will error out if either $GIT_WORK_TREE or $GIT_COMMON_DIR is set.
  • \n
\n", + "comments": "
    \n
  • GIT_REPOSITORY_OPEN_NO_SEARCH - Only open the repository if it can be\nimmediately found in the start_path. Do not walk up from the\nstart_path looking at parent directories.
  • \n
  • GIT_REPOSITORY_OPEN_CROSS_FS - Unless this flag is set, open will not\ncontinue searching across filesystem boundaries (i.e. when st_dev\nchanges from the stat system call). (E.g. Searching in a user's home\ndirectory "/home/user/source/" will not return "/.git/" as the found\nrepo if "/" is a different filesystem than "/home".)
  • \n
  • GIT_REPOSITORY_OPEN_BARE - Open repository as a bare repo regardless\nof core.bare config, and defer loading config file for faster setup.\nUnlike git_repository_open_bare, this can follow gitlinks.
  • \n
  • GIT_REPOSITORY_OPEN_NO_DOTGIT - Do not check for a repository by\nappending /.git to the start_path; only open the repository if\nstart_path itself points to the git directory.
  • \n
  • GIT_REPOSITORY_OPEN_FROM_ENV - Find and open a git repository,\nrespecting the environment variables used by the git command-line\ntools. If set, git_repository_open_ext will ignore the other\nflags and the ceiling_dirs argument, and will allow a NULL path\nto use GIT_DIR or search from the current directory. The search\nfor a repository will respect $GIT_CEILING_DIRECTORIES and\n$GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\nrespect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n$GIT_ALTERNATE_OBJECT_DIRECTORIES. In the future, this flag will\nalso cause git_repository_open_ext to respect $GIT_WORK_TREE and\n$GIT_COMMON_DIR; currently, git_repository_open_ext with this\nflag will error out if either $GIT_WORK_TREE or $GIT_COMMON_DIR is\nset.
  • \n
\n", "fields": [ { "type": "int", @@ -35620,13 +38765,13 @@ "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE" ], "type": "enum", - "file": "repository.h", - "line": 784, - "lineto": 797, + "file": "git2/repository.h", + "line": 786, + "lineto": 799, "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", "tdef": "typedef", "description": " Repository state", - "comments": "

These values represent possible states for the repository to be in, based on the current operation which is ongoing.

\n", + "comments": "

These values represent possible states for the repository to be in,\n based on the current operation which is ongoing.

\n", "fields": [ { "type": "int", @@ -35716,7 +38861,7 @@ "GIT_RESET_HARD" ], "type": "enum", - "file": "reset.h", + "file": "git2/reset.h", "line": 26, "lineto": 30, "block": "GIT_RESET_SOFT\nGIT_RESET_MIXED\nGIT_RESET_HARD", @@ -35763,7 +38908,7 @@ ], "type": "struct", "value": "git_revert_options", - "file": "revert.h", + "file": "git2/revert.h", "line": 26, "lineto": 34, "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", @@ -35810,7 +38955,7 @@ "GIT_REVPARSE_MERGE_BASE" ], "type": "enum", - "file": "revparse.h", + "file": "git2/revparse.h", "line": 71, "lineto": 78, "block": "GIT_REVPARSE_SINGLE\nGIT_REVPARSE_RANGE\nGIT_REVPARSE_MERGE_BASE", @@ -35853,7 +38998,7 @@ ], "type": "struct", "value": "git_revspec", - "file": "revparse.h", + "file": "git2/revparse.h", "line": 83, "lineto": 90, "block": "git_object * from\ngit_object * to\nunsigned int flags", @@ -35891,12 +39036,13 @@ "decl": "git_revwalk", "type": "struct", "value": "git_revwalk", - "file": "types.h", - "line": 114, - "lineto": 114, + "file": "git2/types.h", + "line": 117, + "lineto": 117, "tdef": "typedef", "description": " Representation of an in-progress walk through the commits in a repo ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -35932,9 +39078,9 @@ ], "type": "struct", "value": "git_signature", - "file": "types.h", - "line": 166, - "lineto": 170, + "file": "git2/types.h", + "line": 169, + "lineto": 173, "block": "char * name\nchar * email\ngit_time when", "tdef": "typedef", "description": " An action signature (e.g. for committers, taggers, etc) ", @@ -35967,11 +39113,14 @@ ], "needs": [ "git_commit_amend", + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", "git_commit_create_from_callback", "git_commit_create_from_ids", "git_commit_create_v", + "git_mailmap_resolve_signature", "git_note_commit_create", "git_note_commit_remove", "git_note_create", @@ -35985,8 +39134,100 @@ "git_signature_from_buffer", "git_signature_new", "git_signature_now", + "git_stash_save", "git_tag_annotation_create", - "git_tag_create" + "git_tag_create", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + } + } + ], + [ + "git_smart_service_t", + { + "decl": [ + "GIT_SERVICE_UPLOADPACK_LS", + "GIT_SERVICE_UPLOADPACK", + "GIT_SERVICE_RECEIVEPACK_LS", + "GIT_SERVICE_RECEIVEPACK" + ], + "type": "enum", + "file": "git2/sys/transport.h", + "line": 273, + "lineto": 278, + "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK_LS", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK_LS", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK", + "comments": "", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_smart_subtransport", + { + "decl": "git_smart_subtransport", + "type": "struct", + "value": "git_smart_subtransport", + "file": "git2/sys/transport.h", + "line": 280, + "lineto": 280, + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "int (*)(git_smart_subtransport_stream **, git_smart_subtransport *, const char *, git_smart_service_t)", + "name": "action", + "comments": "" + }, + { + "type": "int (*)(git_smart_subtransport *)", + "name": "close", + "comments": "" + }, + { + "type": "void (*)(git_smart_subtransport *)", + "name": "free", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_smart_subtransport_cb", + "git_smart_subtransport_git", + "git_smart_subtransport_http", + "git_smart_subtransport_ssh" ] } } @@ -36001,13 +39242,13 @@ ], "type": "struct", "value": "git_smart_subtransport_definition", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 336, "lineto": 349, "block": "git_smart_subtransport_cb callback\nunsigned int rpc\nvoid * param", "tdef": "typedef", "description": " Definition for a \"subtransport\"", - "comments": "

This is used to let the smart protocol code know about the protocol which you are implementing.

\n", + "comments": "

This is used to let the smart protocol code know about the protocol\n which you are implementing.

\n", "fields": [ { "type": "git_smart_subtransport_cb", @@ -36031,6 +39272,46 @@ } } ], + [ + "git_smart_subtransport_stream", + { + "decl": "git_smart_subtransport_stream", + "type": "struct", + "value": "git_smart_subtransport_stream", + "file": "git2/sys/transport.h", + "line": 281, + "lineto": 281, + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "git_smart_subtransport *", + "name": "subtransport", + "comments": "" + }, + { + "type": "int (*)(git_smart_subtransport_stream *, char *, size_t, size_t *)", + "name": "read", + "comments": "" + }, + { + "type": "int (*)(git_smart_subtransport_stream *, const char *, size_t)", + "name": "write", + "comments": "" + }, + { + "type": "void (*)(git_smart_subtransport_stream *)", + "name": "free", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_sort_t", { @@ -36041,7 +39322,7 @@ "GIT_SORT_REVERSE" ], "type": "enum", - "file": "revwalk.h", + "file": "git2/revwalk.h", "line": 26, "lineto": 53, "block": "GIT_SORT_NONE\nGIT_SORT_TOPOLOGICAL\nGIT_SORT_TIME\nGIT_SORT_REVERSE", @@ -36052,13 +39333,13 @@ { "type": "int", "name": "GIT_SORT_NONE", - "comments": "

Sort the output with the same default time-order method from git.\n This is the default sorting for new walkers.

\n", + "comments": "

Sort the output with the same default method from git: reverse\n chronological order. This is the default sorting for new walkers.

\n", "value": 0 }, { "type": "int", "name": "GIT_SORT_TOPOLOGICAL", - "comments": "

Sort the repository contents in topological order (parents before\n children); this sorting mode can be combined with time sorting to\n produce git's "time-order".

\n", + "comments": "

Sort the repository contents in topological order (no parents before\n all of its children are shown); this sorting mode can be combined\n with time sorting to produce git's --date-order`.

\n", "value": 1 }, { @@ -36088,9 +39369,9 @@ "GIT_STASH_APPLY_REINSTATE_INDEX" ], "type": "enum", - "file": "stash.h", - "line": 74, - "lineto": 81, + "file": "git2/stash.h", + "line": 75, + "lineto": 82, "block": "GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX", "tdef": "typedef", "description": " Stash application flags. ", @@ -36115,6 +39396,141 @@ } } ], + [ + "git_stash_apply_options", + { + "decl": [ + "unsigned int version", + "git_stash_apply_flags flags", + "git_checkout_options checkout_options", + "git_stash_apply_progress_cb progress_cb", + "void * progress_payload" + ], + "type": "struct", + "value": "git_stash_apply_options", + "file": "git2/stash.h", + "line": 126, + "lineto": 138, + "block": "unsigned int version\ngit_stash_apply_flags flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", + "tdef": "typedef", + "description": " Stash application options structure", + "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can\n use git_stash_apply_init_options.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_stash_apply_flags", + "name": "flags", + "comments": " See `git_stash_apply_flags_t`, above. " + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to use when writing files to the working directory. " + }, + { + "type": "git_stash_apply_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of application progress. " + }, + { + "type": "void *", + "name": "progress_payload", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_apply", + "git_stash_apply_init_options", + "git_stash_pop" + ] + } + } + ], + [ + "git_stash_apply_progress_t", + { + "decl": [ + "GIT_STASH_APPLY_PROGRESS_NONE", + "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_DONE" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 85, + "lineto": 108, + "block": "GIT_STASH_APPLY_PROGRESS_NONE\nGIT_STASH_APPLY_PROGRESS_LOADING_STASH\nGIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX\nGIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED\nGIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED\nGIT_STASH_APPLY_PROGRESS_DONE", + "tdef": "typedef", + "description": " Stash apply progression states ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "comments": "

Loading the stashed data from the object database.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "comments": "

The stored index is being analyzed.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "comments": "

The modified files are being analyzed.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "comments": "

The untracked and ignored files are being analyzed.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "comments": "

The untracked files are being written to disk.

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "comments": "

The modified files are being written to disk.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_DONE", + "comments": "

The stash was applied successfully.

\n", + "value": 7 + } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_apply_progress_cb" + ] + } + } + ], [ "git_stash_flags", { @@ -36125,9 +39541,9 @@ "GIT_STASH_INCLUDE_IGNORED" ], "type": "enum", - "file": "stash.h", - "line": 24, - "lineto": 47, + "file": "git2/stash.h", + "line": 25, + "lineto": 48, "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", "tdef": "typedef", "description": " Stash flags", @@ -36164,18 +39580,61 @@ } } ], + [ + "git_status_entry", + { + "decl": [ + "git_status_t status", + "git_diff_delta * head_to_index", + "git_diff_delta * index_to_workdir" + ], + "type": "struct", + "value": "git_status_entry", + "file": "git2/status.h", + "line": 221, + "lineto": 225, + "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", + "tdef": "typedef", + "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", + "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the\n differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the\n differences between the file in the index and the file in the\n working directory.

\n", + "fields": [ + { + "type": "git_status_t", + "name": "status", + "comments": "" + }, + { + "type": "git_diff_delta *", + "name": "head_to_index", + "comments": "" + }, + { + "type": "git_diff_delta *", + "name": "index_to_workdir", + "comments": "" + } + ], + "used": { + "returns": [ + "git_status_byindex" + ], + "needs": [] + } + } + ], [ "git_status_list", { "decl": "git_status_list", "type": "struct", "value": "git_status_list", - "file": "types.h", + "file": "git2/types.h", "line": 188, "lineto": 188, "tdef": "typedef", "description": " Representation of a status collection ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -36210,13 +39669,13 @@ "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED" ], "type": "enum", - "file": "status.h", - "line": 137, - "lineto": 154, + "file": "git2/status.h", + "line": 139, + "lineto": 156, "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", "tdef": "typedef", "description": " Flags to control status callbacks", - "comments": "
    \n
  • GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made on untracked files. These will only be made if the workdir files are included in the status "show" option. - GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files get callbacks. Again, these callbacks will only be made if the workdir files are included in the status "show" option. - GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be made even on unmodified files. - GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that submodules should be skipped. This only applies if there are no pending typechanges to the submodule (either from or to another type). - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that all files in untracked directories should be included. Normally if an entire directory is new, then just the top-level directory is included (with a trailing slash on the entry name). This flag says to include all of the individual files in the directory instead. - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path should be treated as a literal path, and not as a pathspec pattern. - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of ignored directories should be included in the status. This is like doing git ls-files -o -i --exclude-standard with core git. - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that rename detection should be processed between the head and the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status flag. - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that rename detection should be run between the index and the working directory and enabled GIT_STATUS_WT_RENAMED as a possible status flag. - GIT_STATUS_OPT_SORT_CASE_SENSITIVELY overrides the native case sensitivity for the file system and forces the output to be in case-sensitive order - GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY overrides the native case sensitivity for the file system and forces the output to be in case-insensitive order - GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection should include rewritten files - GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of doing a "soft" index reload (i.e. reloading the index data if the file on disk has been modified outside libgit2). - GIT_STATUS_OPT_UPDATE_INDEX tells libgit2 to refresh the stat cache in the index for files that are unchanged but have out of date stat information in the index. It will result in less work being done on subsequent calls to get status. This is mutually exclusive with the NO_REFRESH option.
  • \n
\n\n

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", + "comments": "
    \n
  • GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made\non untracked files. These will only be made if the workdir files are\nincluded in the status "show" option.
  • \n
  • GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files get callbacks.\nAgain, these callbacks will only be made if the workdir files are\nincluded in the status "show" option.
  • \n
  • GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be\nmade even on unmodified files.
  • \n
  • GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that submodules should be\nskipped. This only applies if there are no pending typechanges to\nthe submodule (either from or to another type).
  • \n
  • GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that all files in\nuntracked directories should be included. Normally if an entire\ndirectory is new, then just the top-level directory is included (with\na trailing slash on the entry name). This flag says to include all\nof the individual files in the directory instead.
  • \n
  • GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path\nshould be treated as a literal path, and not as a pathspec pattern.
  • \n
  • GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of\nignored directories should be included in the status. This is like\ndoing git ls-files -o -i --exclude-standard with core git.
  • \n
  • GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that rename detection\nshould be processed between the head and the index and enables\nthe GIT_STATUS_INDEX_RENAMED as a possible status flag.
  • \n
  • GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that rename\ndetection should be run between the index and the working directory\nand enabled GIT_STATUS_WT_RENAMED as a possible status flag.
  • \n
  • GIT_STATUS_OPT_SORT_CASE_SENSITIVELY overrides the native case\nsensitivity for the file system and forces the output to be in\ncase-sensitive order
  • \n
  • GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY overrides the native case\nsensitivity for the file system and forces the output to be in\ncase-insensitive order
  • \n
  • GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection\nshould include rewritten files
  • \n
  • GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of\ndoing a "soft" index reload (i.e. reloading the index data if the\nfile on disk has been modified outside libgit2).
  • \n
  • GIT_STATUS_OPT_UPDATE_INDEX tells libgit2 to refresh the stat cache\nin the index for files that are unchanged but have out of date stat\ninformation in the index. It will result in less work being done on\nsubsequent calls to get status. This is mutually exclusive with the\nNO_REFRESH option.
  • \n
\n\n

Calling git_status_foreach() is like calling the extended version\n with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED,\n and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled\n together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", "fields": [ { "type": "int", @@ -36321,6 +39780,62 @@ } } ], + [ + "git_status_options", + { + "decl": [ + "unsigned int version", + "git_status_show_t show", + "unsigned int flags", + "git_strarray pathspec", + "git_tree * baseline" + ], + "type": "struct", + "value": "git_status_options", + "file": "git2/status.h", + "line": 182, + "lineto": 188, + "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline", + "tdef": "typedef", + "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", + "comments": "

This structure is set so that zeroing it out will give you relatively\n sane defaults.

\n\n

The show value is one of the git_status_show_t constants that\n control which files to scan and in what order.

\n\n

The flags value is an OR'ed combination of the git_status_opt_t\n values above.

\n\n

The pathspec is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match exactly if\n GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH is specified in the flags.

\n\n

The baseline is the tree to be used for comparison to the working directory\n and index; defaults to HEAD.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_status_show_t", + "name": "show", + "comments": "" + }, + { + "type": "unsigned int", + "name": "flags", + "comments": "" + }, + { + "type": "git_strarray", + "name": "pathspec", + "comments": "" + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_status_foreach_ext", + "git_status_init_options", + "git_status_list_new" + ] + } + } + ], [ "git_status_show_t", { @@ -36330,13 +39845,13 @@ "GIT_STATUS_SHOW_WORKDIR_ONLY" ], "type": "enum", - "file": "status.h", - "line": 79, - "lineto": 83, + "file": "git2/status.h", + "line": 81, + "lineto": 85, "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", "tdef": "typedef", "description": " Select the files on which to report status.", - "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n\n
    \n
  • GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This roughly matches git status --porcelain regarding which files are included and in what order. - GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index comparison, not looking at working directory changes. - GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to working directory comparison, not comparing the index to the HEAD.
  • \n
\n", + "comments": "

With git_status_foreach_ext, this will control which changes get\n callbacks. With git_status_list_new, these will control which\n changes are included in the list.

\n\n
    \n
  • GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This roughly\nmatches git status --porcelain regarding which files are\nincluded and in what order.
  • \n
  • GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index\ncomparison, not looking at working directory changes.
  • \n
  • GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to\nworking directory comparison, not comparing the index to the HEAD.
  • \n
\n", "fields": [ { "type": "int", @@ -36383,13 +39898,13 @@ "GIT_STATUS_CONFLICTED" ], "type": "enum", - "file": "status.h", - "line": 32, - "lineto": 50, + "file": "git2/status.h", + "line": 34, + "lineto": 52, "block": "GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED", "tdef": "typedef", "description": " Status flags for a single file.", - "comments": "

A combination of these values will be returned to indicate the status of a file. Status compares the working directory, the index, and the current HEAD of the repository. The GIT_STATUS_INDEX set of flags represents the status of file in the index relative to the HEAD, and the GIT_STATUS_WT set of flags represent the status of the file in the working directory relative to the index.

\n", + "comments": "

A combination of these values will be returned to indicate the status of\n a file. Status compares the working directory, the index, and the\n current HEAD of the repository. The GIT_STATUS_INDEX set of flags\n represents the status of file in the index relative to the HEAD, and the\n GIT_STATUS_WT set of flags represent the status of the file in the\n working directory relative to the index.

\n", "fields": [ { "type": "int", @@ -36491,7 +40006,7 @@ ], "type": "struct", "value": "git_strarray", - "file": "strarray.h", + "file": "git2/strarray.h", "line": 22, "lineto": 25, "block": "char ** strings\nsize_t count", @@ -36554,13 +40069,13 @@ ], "type": "struct", "value": "git_stream", - "file": "sys/stream.h", + "file": "git2/sys/stream.h", "line": 29, "lineto": 41, "block": "int version\nint encrypted\nint proxy_support\nint (*)(struct git_stream *) connect\nint (*)(git_cert **, struct git_stream *) certificate\nint (*)(struct git_stream *, const git_proxy_options *) set_proxy\nssize_t (*)(struct git_stream *, void *, size_t) read\nssize_t (*)(struct git_stream *, const char *, size_t, int) write\nint (*)(struct git_stream *) close\nvoid (*)(struct git_stream *) free", "tdef": "typedef", "description": " Every stream must have this struct as its first element, so the\n API can talk to it. You'd define your stream as", - "comments": "
 struct my_stream {             git_stream parent;             ...     }\n
\n\n

and fill the functions

\n", + "comments": "
 struct my_stream {\n         git_stream parent;\n         ...\n }\n
\n\n

and fill the functions

\n", "fields": [ { "type": "int", @@ -36616,6 +40131,7 @@ "used": { "returns": [], "needs": [ + "git_stream_cb", "git_stream_register_tls" ] } @@ -36627,12 +40143,13 @@ "decl": "git_submodule", "type": "struct", "value": "git_submodule", - "file": "types.h", + "file": "git2/types.h", "line": 339, "lineto": 339, "tdef": "typedef", "description": " Opaque structure representing a submodule.", "comments": "", + "fields": [], "used": { "returns": [ "git_submodule_fetch_recurse_submodules", @@ -36685,13 +40202,13 @@ "GIT_SUBMODULE_IGNORE_ALL" ], "type": "enum", - "file": "types.h", + "file": "git2/types.h", "line": 403, "lineto": 410, "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", "tdef": "typedef", "description": " Submodule ignore values", - "comments": "

These values represent settings for the submodule.$name.ignore configuration value which says how deeply to look at the working directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with git_submodule_set_ignore() and can write the changed value to disk with git_submodule_save(). If you have overwritten the value, you can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an untracked file, will mark the submodule as dirty. Ignored files are still ignored, of course. - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes to tracked files, or the index or the HEAD commit will matter. - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory, only considering changes if the HEAD of submodule has moved from the value in the superproject. - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer when we don't want any particular ignore rule to be specified.
  • \n
\n", + "comments": "

These values represent settings for the submodule.$name.ignore\n configuration value which says how deeply to look at the working\n directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with\n git_submodule_set_ignore() and can write the changed value to disk\n with git_submodule_save(). If you have overwritten the value, you\n can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration
  • \n
  • GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an\nuntracked file, will mark the submodule as dirty. Ignored files are\nstill ignored, of course.
  • \n
  • GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes\nto tracked files, or the index or the HEAD commit will matter.
  • \n
  • GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory,\nonly considering changes if the HEAD of submodule has moved from the\nvalue in the superproject.
  • \n
  • GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty
  • \n
  • GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer\nwhen we don't want any particular ignore rule to be specified.
  • \n
\n", "fields": [ { "type": "int", @@ -36744,13 +40261,13 @@ "GIT_SUBMODULE_RECURSE_ONDEMAND" ], "type": "enum", - "file": "types.h", + "file": "git2/types.h", "line": 422, "lineto": 426, "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", "tdef": "typedef", "description": " Options for submodule recurse.", - "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules * GIT_SUBMODULE_RECURSE_YES - recurse into submodules * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when commit not already in local clone
  • \n
\n", + "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules
  • \n
  • GIT_SUBMODULE_RECURSE_YES - recurse into submodules
  • \n
  • GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when\n commit not already in local clone
  • \n
\n", "fields": [ { "type": "int", @@ -36801,13 +40318,13 @@ "GIT_SUBMODULE_STATUS_WD_UNTRACKED" ], "type": "enum", - "file": "submodule.h", + "file": "git2/submodule.h", "line": 74, "lineto": 89, "block": "GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED", "tdef": "typedef", "description": " Return codes for submodule status.", - "comments": "

A combination of these flags will be returned to describe the status of a submodule. Depending on the "ignore" property of the submodule, some of the flags may never be returned because they indicate changes that are supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config files (both .git/config and .gitmodules), and the working directory. Any or all of those places might be missing information about the submodule depending on what state the repo is in. We consider all four places to build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info about what sources of submodule data are available. These will be returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule * IN_INDEX - superproject index contains submodule * IN_CONFIG - superproject gitmodules has submodule * IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head * INDEX_DELETED - in head, not in index * INDEX_MODIFIED - index and head don't match * WD_UNINITIALIZED - workdir contains empty directory * WD_ADDED - in workdir, not index * WD_DELETED - in index, not workdir * WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty * WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", + "comments": "

A combination of these flags will be returned to describe the status of a\n submodule. Depending on the "ignore" property of the submodule, some of\n the flags may never be returned because they indicate changes that are\n supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config\n files (both .git/config and .gitmodules), and the working directory. Any\n or all of those places might be missing information about the submodule\n depending on what state the repo is in. We consider all four places to\n build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info\n about what sources of submodule data are available. These will be\n returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule
  • \n
  • IN_INDEX - superproject index contains submodule
  • \n
  • IN_CONFIG - superproject gitmodules has submodule
  • \n
  • IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head
  • \n
  • INDEX_DELETED - in head, not in index
  • \n
  • INDEX_MODIFIED - index and head don't match
  • \n
  • WD_UNINITIALIZED - workdir contains empty directory
  • \n
  • WD_ADDED - in workdir, not index
  • \n
  • WD_DELETED - in index, not workdir
  • \n
  • WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty
  • \n
  • WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", "fields": [ { "type": "int", @@ -36911,13 +40428,13 @@ ], "type": "struct", "value": "git_submodule_update_options", - "file": "submodule.h", - "line": 129, - "lineto": 154, + "file": "git2/submodule.h", + "line": 128, + "lineto": 153, "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", "tdef": "typedef", "description": " Submodule update options structure", - "comments": "

Use the GIT_SUBMODULE_UPDATE_OPTIONS_INIT to get the default settings, like this:

\n\n

git_submodule_update_options opts = GIT_SUBMODULE_UPDATE_OPTIONS_INIT;

\n", + "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can\n use git_submodule_update_init_options.

\n", "fields": [ { "type": "unsigned int", @@ -36960,13 +40477,13 @@ "GIT_SUBMODULE_UPDATE_DEFAULT" ], "type": "enum", - "file": "types.h", + "file": "git2/types.h", "line": 367, "lineto": 374, "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", "tdef": "typedef", "description": " Submodule update values", - "comments": "

These values represent settings for the submodule.$name.update configuration value which says how to handle git submodule update for this submodule. The value is usually set in the ".gitmodules" file and copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with git_submodule_set_update() and write the changed value to disk using git_submodule_save(). If you have overwritten the value, you can revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is updated, checkout the new detached HEAD to the submodule directory. - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked out branch onto the commit from the superproject. - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the superproject into the current checkout out branch of the submodule. - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when the commit in the superproject is updated. - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer when we don't want any particular update rule to be specified.
  • \n
\n", + "comments": "

These values represent settings for the submodule.$name.update\n configuration value which says how to handle git submodule update for\n this submodule. The value is usually set in the ".gitmodules" file and\n copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with\n git_submodule_set_update() and write the changed value to disk using\n git_submodule_save(). If you have overwritten the value, you can\n revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is\nupdated, checkout the new detached HEAD to the submodule directory.
  • \n
  • GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked\nout branch onto the commit from the superproject.
  • \n
  • GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the\nsuperproject into the current checkout out branch of the submodule.
  • \n
  • GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when\nthe commit in the superproject is updated.
  • \n
  • GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer\nwhen we don't want any particular update rule to be specified.
  • \n
\n", "fields": [ { "type": "int", @@ -37015,12 +40532,13 @@ "decl": "git_tag", "type": "struct", "value": "git_tag", - "file": "types.h", - "line": 117, - "lineto": 117, + "file": "git2/types.h", + "line": 120, + "lineto": 120, "tdef": "typedef", "description": " Parsed representation of a tag object. ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -37052,9 +40570,9 @@ ], "type": "struct", "value": "git_time", - "file": "types.h", - "line": 159, - "lineto": 163, + "file": "git2/types.h", + "line": 162, + "lineto": 166, "block": "git_time_t time\nint offset\nchar sign", "tdef": "typedef", "description": " Time in a signature ", @@ -37099,7 +40617,7 @@ "GIT_TRACE_TRACE" ], "type": "enum", - "file": "trace.h", + "file": "git2/trace.h", "line": 26, "lineto": 47, "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", @@ -37165,16 +40683,25 @@ "decl": "git_transaction", "type": "struct", "value": "git_transaction", - "file": "types.h", - "line": 179, - "lineto": 179, + "file": "git2/types.h", + "line": 182, + "lineto": 182, "tdef": "typedef", "description": " Transactional interface to references ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ - "git_config_lock" + "git_config_lock", + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" ] } } @@ -37193,13 +40720,13 @@ ], "type": "struct", "value": "git_transfer_progress", - "file": "types.h", + "file": "git2/types.h", "line": 257, "lineto": 265, "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", "tdef": "typedef", "description": " This is passed as the first argument to the callback to allow the\n user to see the progress.", - "comments": "
    \n
  • total_objects: number of objects in the packfile being downloaded - indexed_objects: received objects that have been hashed - received_objects: objects which have been downloaded - local_objects: locally-available objects that have been injected in order to fix a thin pack. - received-bytes: size of the packfile received up to now
  • \n
\n", + "comments": "
    \n
  • total_objects: number of objects in the packfile being downloaded
  • \n
  • indexed_objects: received objects that have been hashed
  • \n
  • received_objects: objects which have been downloaded
  • \n
  • local_objects: locally-available objects that have been injected\nin order to fix a thin pack.
  • \n
  • received-bytes: size of the packfile received up to now
  • \n
\n", "fields": [ { "type": "unsigned int", @@ -37244,7 +40771,6 @@ "needs": [ "git_indexer_append", "git_indexer_commit", - "git_indexer_new", "git_odb_write_pack", "git_packbuilder_write", "git_transfer_progress_cb" @@ -37258,15 +40784,84 @@ "decl": "git_transport", "type": "struct", "value": "git_transport", - "file": "types.h", + "file": "git2/types.h", "line": 234, "lineto": 234, + "block": "unsigned int version\nint (*)(git_transport *, git_transport_message_cb, git_transport_message_cb, git_transport_certificate_check_cb, void *) set_callbacks\nint (*)(git_transport *, const git_strarray *) set_custom_headers\nint (*)(git_transport *, const char *, git_cred_acquire_cb, void *, const git_proxy_options *, int, int) connect\nint (*)(const git_remote_head ***, size_t *, git_transport *) ls\nint (*)(git_transport *, git_push *, const git_remote_callbacks *) push\nint (*)(git_transport *, git_repository *, const git_remote_head *const *, size_t) negotiate_fetch\nint (*)(git_transport *, git_repository *, git_transfer_progress *, git_transfer_progress_cb, void *) download_pack\nint (*)(git_transport *) is_connected\nint (*)(git_transport *, int *) read_flags\nvoid (*)(git_transport *) cancel\nint (*)(git_transport *) close\nvoid (*)(git_transport *) free", "tdef": "typedef", "description": " Interface which represents a transport to communicate with a\n remote.", "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "int (*)(git_transport *, git_transport_message_cb, git_transport_message_cb, git_transport_certificate_check_cb, void *)", + "name": "set_callbacks", + "comments": "" + }, + { + "type": "int (*)(git_transport *, const git_strarray *)", + "name": "set_custom_headers", + "comments": "" + }, + { + "type": "int (*)(git_transport *, const char *, git_cred_acquire_cb, void *, const git_proxy_options *, int, int)", + "name": "connect", + "comments": "" + }, + { + "type": "int (*)(const git_remote_head ***, size_t *, git_transport *)", + "name": "ls", + "comments": "" + }, + { + "type": "int (*)(git_transport *, git_push *, const git_remote_callbacks *)", + "name": "push", + "comments": "" + }, + { + "type": "int (*)(git_transport *, git_repository *, const git_remote_head *const *, size_t)", + "name": "negotiate_fetch", + "comments": "" + }, + { + "type": "int (*)(git_transport *, git_repository *, git_transfer_progress *, git_transfer_progress_cb, void *)", + "name": "download_pack", + "comments": "" + }, + { + "type": "int (*)(git_transport *)", + "name": "is_connected", + "comments": "" + }, + { + "type": "int (*)(git_transport *, int *)", + "name": "read_flags", + "comments": "" + }, + { + "type": "void (*)(git_transport *)", + "name": "cancel", + "comments": "" + }, + { + "type": "int (*)(git_transport *)", + "name": "close", + "comments": "" + }, + { + "type": "void (*)(git_transport *)", + "name": "free", + "comments": "" + } + ], "used": { "returns": [], "needs": [ + "git_smart_subtransport_cb", "git_smart_subtransport_git", "git_smart_subtransport_http", "git_smart_subtransport_ssh", @@ -37292,7 +40887,7 @@ "GIT_TRANSPORTFLAGS_NONE" ], "type": "enum", - "file": "sys/transport.h", + "file": "git2/sys/transport.h", "line": 31, "lineto": 33, "block": "GIT_TRANSPORTFLAGS_NONE", @@ -37319,12 +40914,13 @@ "decl": "git_tree", "type": "struct", "value": "git_tree", - "file": "types.h", - "line": 129, - "lineto": 129, + "file": "git2/types.h", + "line": 132, + "lineto": 132, "tdef": "typedef", "description": " Representation of a tree object. ", "comments": "", + "fields": [], "used": { "returns": [ "git_tree_entry_byid", @@ -37389,12 +40985,13 @@ "decl": "git_tree_entry", "type": "struct", "value": "git_tree_entry", - "file": "types.h", - "line": 126, - "lineto": 126, + "file": "git2/types.h", + "line": 129, + "lineto": 129, "tdef": "typedef", "description": " Representation of each one of the entries in a tree object. ", "comments": "", + "fields": [], "used": { "returns": [ "git_tree_entry_byid", @@ -37431,7 +41028,7 @@ ], "type": "struct", "value": "git_tree_update", - "file": "tree.h", + "file": "git2/tree.h", "line": 448, "lineto": 457, "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", @@ -37476,7 +41073,7 @@ "GIT_TREE_UPDATE_REMOVE" ], "type": "enum", - "file": "tree.h", + "file": "git2/tree.h", "line": 438, "lineto": 443, "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", @@ -37509,12 +41106,13 @@ "decl": "git_treebuilder", "type": "struct", "value": "git_treebuilder", - "file": "types.h", - "line": 132, - "lineto": 132, + "file": "git2/types.h", + "line": 135, + "lineto": 135, "tdef": "typedef", "description": " Constructor for in-memory trees ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -37540,7 +41138,7 @@ "GIT_TREEWALK_POST" ], "type": "enum", - "file": "tree.h", + "file": "git2/tree.h", "line": 398, "lineto": 401, "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", @@ -37575,12 +41173,13 @@ "decl": "git_worktree", "type": "struct", "value": "git_worktree", - "file": "types.h", - "line": 108, - "lineto": 108, + "file": "git2/types.h", + "line": 111, + "lineto": 111, "tdef": "typedef", "description": " Representation of a working tree ", "comments": "", + "fields": [], "used": { "returns": [], "needs": [ @@ -37592,7 +41191,9 @@ "git_worktree_is_prunable", "git_worktree_lock", "git_worktree_lookup", + "git_worktree_name", "git_worktree_open_from_repository", + "git_worktree_path", "git_worktree_prune", "git_worktree_prune_init_options", "git_worktree_unlock", @@ -37601,6 +41202,87 @@ } } ], + [ + "git_worktree_add_options", + { + "decl": [ + "unsigned int version", + "int lock", + "git_reference * ref" + ], + "type": "struct", + "value": "git_worktree_add_options", + "file": "git2/worktree.h", + "line": 84, + "lineto": 89, + "block": "unsigned int version\nint lock\ngit_reference * ref", + "tdef": "typedef", + "description": " Worktree add options structure", + "comments": "

Initialize with GIT_WORKTREE_ADD_OPTIONS_INIT. Alternatively, you can\n use git_worktree_add_init_options.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "int", + "name": "lock", + "comments": " lock newly created worktree " + }, + { + "type": "git_reference *", + "name": "ref", + "comments": " reference to use for the new worktree HEAD " + } + ], + "used": { + "returns": [], + "needs": [ + "git_worktree_add", + "git_worktree_add_init_options" + ] + } + } + ], + [ + "git_worktree_prune_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags" + ], + "type": "struct", + "value": "git_worktree_prune_options", + "file": "git2/worktree.h", + "line": 198, + "lineto": 202, + "block": "unsigned int version\nuint32_t flags", + "tdef": "typedef", + "description": " Worktree prune options structure", + "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can\n use git_worktree_prune_init_options.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_worktree_is_prunable", + "git_worktree_prune", + "git_worktree_prune_init_options" + ] + } + } + ], [ "git_worktree_prune_t", { @@ -37610,9 +41292,9 @@ "GIT_WORKTREE_PRUNE_WORKING_TREE" ], "type": "enum", - "file": "worktree.h", - "line": 155, - "lineto": 162, + "file": "git2/worktree.h", + "line": 182, + "lineto": 189, "block": "GIT_WORKTREE_PRUNE_VALID\nGIT_WORKTREE_PRUNE_LOCKED\nGIT_WORKTREE_PRUNE_WORKING_TREE", "tdef": "typedef", "description": " Flags which can be passed to git_worktree_prune to alter its\n behavior.", @@ -37649,12 +41331,29 @@ "decl": "git_writestream", "type": "struct", "value": "git_writestream", - "file": "types.h", - "line": 429, - "lineto": 429, + "file": "git2/types.h", + "line": 428, + "lineto": 428, "tdef": "typedef", "description": " A type to write in a streaming fashion, for example, for filters. ", "comments": "", + "fields": [ + { + "type": "int (*)(git_writestream *, const char *, size_t)", + "name": "write", + "comments": "" + }, + { + "type": "int (*)(git_writestream *)", + "name": "close", + "comments": "" + }, + { + "type": "void (*)(git_writestream *)", + "name": "free", + "comments": "" + } + ], "used": { "returns": [], "needs": [ @@ -37662,13 +41361,48 @@ "git_blob_create_fromstream_commit", "git_filter_list_stream_blob", "git_filter_list_stream_data", - "git_filter_list_stream_file" + "git_filter_list_stream_file", + "git_filter_stream_fn" ] } } + ], + [ + "imaxdiv_t", + { + "decl": [ + "intmax_t quot", + "intmax_t rem" + ], + "type": "struct", + "value": "imaxdiv_t", + "file": "git2/inttypes.h", + "line": 51, + "lineto": 54, + "block": "intmax_t quot\nintmax_t rem", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "intmax_t", + "name": "quot", + "comments": "" + }, + { + "type": "intmax_t", + "name": "rem", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [] + } + } ] ], - "prefix": "include/git2", + "prefix": "include", "groups": [ [ "annotated", @@ -37678,7 +41412,8 @@ "git_annotated_commit_from_ref", "git_annotated_commit_from_revspec", "git_annotated_commit_id", - "git_annotated_commit_lookup" + "git_annotated_commit_lookup", + "git_annotated_commit_ref" ] ], [ @@ -37738,14 +41473,18 @@ "git_branch_move", "git_branch_name", "git_branch_next", + "git_branch_remote_name", "git_branch_set_upstream", - "git_branch_upstream" + "git_branch_upstream", + "git_branch_upstream_name", + "git_branch_upstream_remote" ] ], [ "buf", [ "git_buf_contains_nul", + "git_buf_dispose", "git_buf_free", "git_buf_grow", "git_buf_is_binary", @@ -37781,8 +41520,10 @@ [ "git_commit_amend", "git_commit_author", + "git_commit_author_with_mailmap", "git_commit_body", "git_commit_committer", + "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", "git_commit_create_from_callback", @@ -37883,6 +41624,8 @@ [ "git_describe_commit", "git_describe_format", + "git_describe_init_format_options", + "git_describe_init_options", "git_describe_result_free", "git_describe_workdir" ] @@ -37995,6 +41738,12 @@ "git_ignore_path_is_ignored" ] ], + [ + "imaxdiv", + [ + "imaxdiv" + ] + ], [ "index", [ @@ -38021,6 +41770,10 @@ "git_index_get_byindex", "git_index_get_bypath", "git_index_has_conflicts", + "git_index_name_add", + "git_index_name_clear", + "git_index_name_entrycount", + "git_index_name_get_byindex", "git_index_new", "git_index_open", "git_index_owner", @@ -38031,6 +41784,13 @@ "git_index_remove_all", "git_index_remove_bypath", "git_index_remove_directory", + "git_index_reuc_add", + "git_index_reuc_clear", + "git_index_reuc_entrycount", + "git_index_reuc_find", + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath", + "git_index_reuc_remove", "git_index_set_caps", "git_index_set_version", "git_index_update_all", @@ -38047,6 +41807,7 @@ "git_indexer_commit", "git_indexer_free", "git_indexer_hash", + "git_indexer_init_options", "git_indexer_new" ] ], @@ -38060,6 +41821,18 @@ "git_libgit2_version" ] ], + [ + "mailmap", + [ + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + ], [ "mempack", [ @@ -38079,6 +41852,14 @@ "git_merge_bases", "git_merge_bases_many", "git_merge_commits", + "git_merge_driver_lookup", + "git_merge_driver_register", + "git_merge_driver_source_ancestor", + "git_merge_driver_source_file_options", + "git_merge_driver_source_ours", + "git_merge_driver_source_repo", + "git_merge_driver_source_theirs", + "git_merge_driver_unregister", "git_merge_file", "git_merge_file_from_index", "git_merge_file_init_input", @@ -38106,6 +41887,7 @@ "git_note_commit_remove", "git_note_committer", "git_note_create", + "git_note_default_ref", "git_note_foreach", "git_note_free", "git_note_id", @@ -38143,6 +41925,7 @@ "git_odb_add_backend", "git_odb_add_disk_alternate", "git_odb_backend_loose", + "git_odb_backend_malloc", "git_odb_backend_one_pack", "git_odb_backend_pack", "git_odb_exists", @@ -38229,6 +42012,7 @@ "git_packbuilder_set_callbacks", "git_packbuilder_set_threads", "git_packbuilder_write", + "git_packbuilder_write_buf", "git_packbuilder_written" ] ], @@ -38251,6 +42035,12 @@ "git_patch_to_buf" ] ], + [ + "path", + [ + "git_path_is_gitfile" + ] + ], [ "pathspec", [ @@ -38364,6 +42154,8 @@ "git_reflog_append", "git_reflog_delete", "git_reflog_drop", + "git_reflog_entry__alloc", + "git_reflog_entry__free", "git_reflog_entry_byindex", "git_reflog_entry_committer", "git_reflog_entry_id_new", @@ -38383,6 +42175,8 @@ "git_refspec_dst", "git_refspec_dst_matches", "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", "git_refspec_rtransform", "git_refspec_src", "git_refspec_src_matches", @@ -38450,6 +42244,7 @@ "git_repository_hashfile", "git_repository_head", "git_repository_head_detached", + "git_repository_head_detached_for_worktree", "git_repository_head_for_worktree", "git_repository_head_unborn", "git_repository_ident", @@ -38565,7 +42360,8 @@ "git_stash_apply_init_options", "git_stash_drop", "git_stash_foreach", - "git_stash_pop" + "git_stash_pop", + "git_stash_save" ] ], [ @@ -38583,6 +42379,12 @@ "git_status_should_ignore" ] ], + [ + "stdalloc", + [ + "git_stdalloc_init_allocator" + ] + ], [ "strarray", [ @@ -38671,6 +42473,19 @@ "git_trace_set" ] ], + [ + "transaction", + [ + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + ], [ "transport", [ @@ -38729,6 +42544,12 @@ "git_treebuilder_write_with_buffer" ] ], + [ + "win32", + [ + "git_win32_crtdbg_init_allocator" + ] + ], [ "worktree", [ @@ -38740,7 +42561,9 @@ "git_worktree_list", "git_worktree_lock", "git_worktree_lookup", + "git_worktree_name", "git_worktree_open_from_repository", + "git_worktree_path", "git_worktree_prune", "git_worktree_prune_init_options", "git_worktree_unlock", @@ -38761,6 +42584,10 @@ "cat-file.c", "ex/HEAD/cat-file.html" ], + [ + "checkout.c", + "ex/HEAD/checkout.html" + ], [ "common.c", "ex/HEAD/common.html" @@ -38789,6 +42616,10 @@ "log.c", "ex/HEAD/log.html" ], + [ + "ls-files.c", + "ex/HEAD/ls-files.html" + ], [ "merge.c", "ex/HEAD/merge.html" diff --git a/vendor/libgit2 b/vendor/libgit2 index 1aae32d20..0a271d605 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 1aae32d20abc736ca1818aedd34dd945b6508f72 +Subproject commit 0a271d60550c7e14d2c883a57cec58b7f4c454a2 From 5964ef12a59718880d40613383f4c3e88d714287 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 28 Jan 2019 10:07:17 -0700 Subject: [PATCH 023/545] Get v0.28.0 compiling with new features - Added git_index_name_entry - Added git_index_reuc_entry - Added git_mailmap - Added git_path_is_gitfile --- generate/input/descriptor.json | 264 ++++++++++++++++-- generate/input/libgit2-supplement.json | 76 ++--- generate/scripts/generateNativeCode.js | 3 + generate/scripts/helpers.js | 1 + generate/scripts/utils.js | 1 + .../filters/array_type_to_plain_type.js | 3 + generate/templates/filters/is_array_type.js | 3 + .../templates/filters/to_size_of_array.js | 3 + generate/templates/manual/clone/clone.cc | 6 +- .../manual/commit/extract_signature.cc | 14 +- generate/templates/manual/filter_list/load.cc | 6 +- .../manual/patches/convenient_patches.cc | 6 +- generate/templates/manual/remote/ls.cc | 4 +- .../templates/manual/revwalk/fast_walk.cc | 4 +- .../manual/revwalk/file_history_walk.cc | 4 +- .../templates/manual/src/filter_registry.cc | 12 +- generate/templates/partials/async_function.cc | 12 +- .../templates/partials/convert_from_v8.cc | 4 +- generate/templates/partials/convert_to_v8.cc | 76 ++++- generate/templates/partials/fields.cc | 22 +- generate/templates/partials/sync_function.cc | 6 +- generate/templates/templates/binding.gyp | 7 - vendor/libgit2.gyp | 26 +- 23 files changed, 448 insertions(+), 115 deletions(-) create mode 100644 generate/templates/filters/array_type_to_plain_type.js create mode 100644 generate/templates/filters/is_array_type.js create mode 100644 generate/templates/filters/to_size_of_array.js diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 096d4df9b..dc55e7587 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -75,6 +75,9 @@ }, "types": { + "allocator": { + "ignore": true + }, "annotated_commit": { "selfFreeing": true, "functions": { @@ -378,6 +381,7 @@ ] }, "buf": { + "freeFunctionName": "git_buf_dispose", "functions": { "git_buf_free": { "ignore": true @@ -820,6 +824,9 @@ "isReturn": true, "ownedByThis": true } + }, + "return": { + "isErrorCode": true } }, "git_config_lookup_map_value": { @@ -911,8 +918,14 @@ "ignore": true }, "cred": { + "needsForwardDeclaration": false, "selfFreeing": true, "cType": "git_cred", + "fields": { + "free": { + "ignore": true + } + }, "functions": { "git_cred_default_new": { "isAsync": false @@ -1401,6 +1414,9 @@ "../include/filter_registry.h" ] }, + "giterr": { + "ignore": true + }, "graph": { "functions": { "git_graph_ahead_behind": { @@ -1454,6 +1470,12 @@ } } }, + "imaxdiv": { + "ignore": true + }, + "imaxdiv_t": { + "ignore": true + }, "index": { "selfFreeing": true, "ownerFn": { @@ -1667,12 +1689,6 @@ "isErrorCode": true } }, - "git_index_reuc_get_byindex": { - "ignore": true - }, - "git_index_reuc_get_bypath": { - "ignore": true - }, "git_index_update_all": { "args": { "pathspec": { @@ -1722,9 +1738,164 @@ "hasConstructor": true, "ignoreInit": true }, + "index_name_entry": { + "functions": { + "git_index_name_add": { + "cppFunctionName": "Add", + "jsFunctionName": "add", + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_name_clear": { + "cppFunctionName": "Clear", + "jsFunctionName": "clear", + "isAsync": true + }, + "git_index_name_entrycount": { + "cppFunctionName": "Entrycount", + "jsFunctionName": "entryCount" + }, + "git_index_name_get_byindex": { + "cppFunctionName": "GetByIndex", + "jsFunctionName": "getByIndex", + "isPrototypeMethod": false + } + }, + "cDependencies": [ + "git2/sys/index.h" + ] + }, + "index_reuc_entry": { + "functions": { + "git_index_reuc_add": { + "cppFunctionName": "Add", + "jsFunctionName": "add", + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_reuc_clear": { + "cppFunctionName": "Clear", + "jsFunctionName": "clear", + "isAsync": true + }, + "git_index_reuc_entrycount": { + "cppFunctionName": "Entrycount", + "jsFunctionName": "entryCount" + }, + "git_index_reuc_find": { + "args": { + "at_pos": { + "isReturn": true, + "shouldAlloc": true + } + }, + "cppFunctionName": "Find", + "jsFunctionName": "find", + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_index_reuc_get_byindex": { + "cppFunctionName": "GetByIndex", + "jsFunctionName": "getByIndex", + "isPrototypeMethod": false + }, + "git_index_reuc_get_bypath": { + "cppFunctionName": "GetByPath", + "jsFunctionName": "getByPath", + "isPrototypeMethod": false + }, + "git_index_reuc_remove": { + "cppFunctionName": "Remove", + "jsFunctionName": "remove", + "isAsync": true, + "return": { + "isErrorCode": true + } + } + }, + "cDependencies": [ + "git2/sys/index.h" + ] + }, "indexer": { "ignore": true }, + "indexer_options": { + "ignore": true + }, + "LIBSSH2_SESSION": { + "ignore": true + }, + "LIBSSH2_USERAUTH_KBDINT_PROMPT": { + "ignore": true + }, + "LIBSSH2_USERAUTH_KBDINT_RESPONSE": { + "ignore": true + }, + "_LIBSSH2_SESSION": { + "ignore": true + }, + "_LIBSSH2_USERAUTH_KBDINT_PROMPT": { + "ignore": true + }, + "_LIBSSH2_USERAUTH_KBDINT_RESPONSE": { + "ignore": true + }, + "mailmap": { + "selfFreeing": true, + "freeFunctionName": "git_mailmap_free", + "functions": { + "git_mailmap_add_entry": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_mailmap_free": { + "ignore": true + }, + "git_mailmap_from_buffer": { + "return": { + "isErrorCode": true + } + }, + "git_mailmap_from_repository": { + "args": { + "out": { + "ownedBy": ["repo"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_mailmap_resolve": { + "args": { + "real_name": { + "isReturn": true + }, + "real_email": { + "isReturn": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_mailmap_resolve_signature": { + "return": { + "isErrorCode": true + } + } + } + }, "mempack": { "ignore": true }, @@ -1933,15 +2104,6 @@ "git_odb_add_disk_alternate": { "ignore": true }, - "git_odb_backend_loose": { - "ignore": true - }, - "git_odb_backend_one_pack": { - "ignore": true - }, - "git_odb_backend_pack": { - "ignore": true - }, "git_odb_exists": { "ignore": true, "isAsync": true, @@ -2292,6 +2454,11 @@ } } }, + "path": { + "cDependencies": [ + "git2/sys/path.h" + ] + }, "pathspec": { "selfFreeing": true, "dependencies": [ @@ -2779,6 +2946,7 @@ }, "git_remote_get_refspec": { "return": { + "selfFreeing": false, "ownedByThis": true } }, @@ -3112,9 +3280,15 @@ } } }, + "smart_subtransport": { + "ignore": true + }, "smart_subtransport_definition": { "ignore": true }, + "smart_subtransport_stream": { + "ignore": true + }, "stash": { "functions": { "git_stash_apply": { @@ -3157,6 +3331,9 @@ } } }, + "stdalloc": { + "ignore": true + }, "status": { "cDependencies": [ "git2/sys/diff.h" @@ -3560,6 +3737,47 @@ "transport": { "cType": "git_transport", "needsForwardDeclaration": false, + "fields": { + "cancel": { + "ignore": true + }, + "close": { + "ignore": true + }, + "connect": { + "ignore": true + }, + "download_pack": { + "ignore": true + }, + "free": { + "ignore": true + }, + "is_connected": { + "ignore": true + }, + "ls": { + "ignore": true + }, + "negotiate_fetch": { + "ignore": true + }, + "push": { + "ignore": true + }, + "read_flags": { + "ignore": true + }, + "set_callbacks": { + "ignore": true + }, + "set_custom_headers": { + "ignore": true + }, + "version": { + "ignore": true + } + }, "functions": { "git_transport_dummy": { "ignore": true @@ -3722,6 +3940,9 @@ } } }, + "win32": { + "ignore": true + }, "worktree": { "selfFreeing": true, "cType": "git_worktree", @@ -3761,7 +3982,18 @@ }, "writestream": { "cType": "git_writestream", - "needsForwardDeclaration": false + "needsForwardDeclaration": false, + "fields": { + "close": { + "ignore": true + }, + "free": { + "ignore": true + }, + "write": { + "ignore": true + } + } } } } diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 3697a3485..cc073582b 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -86,30 +86,6 @@ }, "new" : { "functions": { - "git_branch_remote_name": { - "type": "function", - "file": "branch.h", - "args": [ - { - "name": "out", - "type": "git_buf *" - }, - { - "name": "repo", - "type": "git_repository *" - }, - { - "name": "canonical_branch_name", - "type": "const char *" - } - ], - "isAsync": true, - "return": { - "type": "int", - "isErrorCode": true - }, - "group": "branch" - }, "git_clone": { "isManual": true, "cFile": "generate/templates/manual/clone/clone.cc", @@ -376,6 +352,27 @@ "git_filter_source_flags" ] ], + [ + "index_name_entry", + [ + "git_index_name_add", + "git_index_name_clear", + "git_index_name_entrycount", + "git_index_name_get_byindex" + ] + ], + [ + "index_reuc_entry", + [ + "git_index_reuc_add", + "git_index_reuc_clear", + "git_index_reuc_entrycount", + "git_index_reuc_find", + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath", + "git_index_reuc_remove" + ] + ], [ "merge_file_result", [ @@ -1035,11 +1032,27 @@ "git_diff_stats_free" ] }, + "index": { + "functions": [ + "git_index_name_add", + "git_index_name_clear", + "git_index_name_entrycount", + "git_index_name_get_byindex", + "git_index_reuc_add", + "git_index_reuc_clear", + "git_index_reuc_entrycount", + "git_index_reuc_find", + "git_index_reuc_get_byindex", + "git_index_reuc_get_bypath", + "git_index_reuc_remove" + ] + }, "merge": { "functions": [ "git_merge_driver_lookup", "git_merge_driver_register", "git_merge_driver_source_ancestor", + "git_merge_driver_source_file_options", "git_merge_driver_source_ours", "git_merge_driver_source_repo", "git_merge_driver_source_theirs", @@ -1059,6 +1072,10 @@ }, "odb": { "functions": [ + "git_odb_backend_loose", + "git_odb_backend_malloc", + "git_odb_backend_one_pack", + "git_odb_backend_pack", "git_odb_object_data", "git_odb_object_dup", "git_odb_object_free", @@ -1090,6 +1107,8 @@ }, "reflog": { "functions": [ + "git_reflog_entry__alloc", + "git_reflog_entry__free", "git_reflog_entry_committer", "git_reflog_entry_id_new", "git_reflog_entry_id_old", @@ -1117,12 +1136,5 @@ ] } }, - "groups": { - "branch": [ - "git_branch_remote_name" - ], - "stash": [ - "git_stash_save" - ] - } + "groups": {} } diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index 95e0ab875..3ba5f6b02 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -50,11 +50,13 @@ module.exports = function generateNativeCode() { var filters = { and: require("../templates/filters/and"), argsInfo: require("../templates/filters/args_info"), + arrayTypeToPlainType: require("../templates/filters/array_type_to_plain_type"), cppToV8: require("../templates/filters/cpp_to_v8"), defaultValue: require("../templates/filters/default_value"), fieldsInfo: require("../templates/filters/fields_info"), hasReturnType: require("../templates/filters/has_return_type"), hasReturnValue: require("../templates/filters/has_return_value"), + isArrayType: require("../templates/filters/is_array_type"), isDoublePointer: require("../templates/filters/is_double_pointer"), isFixedLengthString: require("../templates/filters/is_fixed_length_string"), isOid: require("../templates/filters/is_oid"), @@ -70,6 +72,7 @@ module.exports = function generateNativeCode() { subtract: require("../templates/filters/subtract"), titleCase: require("../templates/filters/title_case"), toBool: require('../templates/filters/to_bool'), + toSizeOfArray: require("../templates/filters/to_size_of_array"), unPointer: require("../templates/filters/un_pointer"), setUnsigned: require("../templates/filters/unsigned"), upper: require("../templates/filters/upper") diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index b9a67dc06..f8e02f807 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -40,6 +40,7 @@ var Helpers = { .replace("struct", "") .replace(utils.doublePointerRegex, "") .replace(utils.pointerRegex, "") + .replace(utils.arrayTypeRegex, "") .trim(); }, diff --git a/generate/scripts/utils.js b/generate/scripts/utils.js index e618a954a..078ccf41e 100644 --- a/generate/scripts/utils.js +++ b/generate/scripts/utils.js @@ -9,6 +9,7 @@ const path = require("path"); var local = path.join.bind(null, __dirname, "../"); var util = { + arrayTypeRegex: /\s\[\d+\]\s*/, pointerRegex: /\s*\*\s*/, doublePointerRegex: /\s*\*\*\s*/, diff --git a/generate/templates/filters/array_type_to_plain_type.js b/generate/templates/filters/array_type_to_plain_type.js new file mode 100644 index 000000000..55f283350 --- /dev/null +++ b/generate/templates/filters/array_type_to_plain_type.js @@ -0,0 +1,3 @@ +module.exports = function(cType) { + return /(.*)\s\[\d+\]\s*/.exec(cType)[1]; +}; diff --git a/generate/templates/filters/is_array_type.js b/generate/templates/filters/is_array_type.js new file mode 100644 index 000000000..d633d9e40 --- /dev/null +++ b/generate/templates/filters/is_array_type.js @@ -0,0 +1,3 @@ +module.exports = function(cType) { + return /\s\[\d+\]\s*/.test(cType); +}; diff --git a/generate/templates/filters/to_size_of_array.js b/generate/templates/filters/to_size_of_array.js new file mode 100644 index 000000000..b56e9315f --- /dev/null +++ b/generate/templates/filters/to_size_of_array.js @@ -0,0 +1,3 @@ +module.exports = function(cType) { + return /\s\[(\d+)\]\s*/.exec(cType)[1]; +}; diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 7ddcd559b..144be221d 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -91,7 +91,7 @@ NAN_METHOD(GitClone::Clone) { } void GitClone::CloneWorker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster( @@ -113,8 +113,8 @@ void GitClone::CloneWorker::Execute() { baton->error_code = result; - if (result != GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (result != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } } diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index 911a31eef..c17749539 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -37,8 +37,8 @@ NAN_METHOD(GitCommit::ExtractSignature) if (git_oid_fromstr(baton->commit_id, (const char *)strdup(*oidString)) != GIT_OK) { free(baton->commit_id); - if (giterr_last()) { - return Nan::ThrowError(giterr_last()->message); + if (git_error_last()) { + return Nan::ThrowError(git_error_last()->message); } else { return Nan::ThrowError("Unknown Error"); } @@ -73,7 +73,7 @@ NAN_METHOD(GitCommit::ExtractSignature) void GitCommit::ExtractSignatureWorker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster( @@ -89,8 +89,8 @@ void GitCommit::ExtractSignatureWorker::Execute() (const char *)baton->field ); - if (baton->error_code != GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (baton->error_code != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } } @@ -145,8 +145,8 @@ void GitCommit::ExtractSignatureWorker::HandleOKCallback() callback->Call(0, NULL, async_resource); } - git_buf_free(&baton->signature); - git_buf_free(&baton->signed_data); + git_buf_dispose(&baton->signature); + git_buf_dispose(&baton->signed_data); if (baton->field != NULL) { free((void *)baton->field); diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 1e7788e65..6075fd59c 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -108,7 +108,7 @@ NAN_METHOD(GitFilterList::Load) { } void GitFilterList::LoadWorker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster( @@ -119,8 +119,8 @@ void GitFilterList::LoadWorker::Execute() { baton->error_code = result; - if (result != GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (result != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } } diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index c7facba4e..cc108a8ae 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -26,7 +26,7 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { } void GitPatch::ConvenientFromDiffWorker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster(true, baton->diff); @@ -50,8 +50,8 @@ void GitPatch::ConvenientFromDiffWorker::Execute() { baton->error_code = result; - if (giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } delete baton->out; diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 605447b10..f81728256 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -20,7 +20,7 @@ NAN_METHOD(GitRemote::ReferenceList) void GitRemote::ReferenceListWorker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster( @@ -37,7 +37,7 @@ void GitRemote::ReferenceListWorker::Execute() ); if (baton->error_code != GIT_OK) { - baton->error = git_error_dup(giterr_last()); + baton->error = git_error_dup(git_error_last()); delete baton->out; baton->out = NULL; return; diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 8969bcb0f..fbf5c09b5 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -30,7 +30,7 @@ void GitRevwalk::FastWalkWorker::Execute() for (int i = 0; i < baton->max_count; i++) { git_oid *nextCommit = (git_oid *)malloc(sizeof(git_oid)); - giterr_clear(); + git_error_clear(); baton->error_code = git_revwalk_next(nextCommit, baton->walk); if (baton->error_code != GIT_OK) @@ -40,7 +40,7 @@ void GitRevwalk::FastWalkWorker::Execute() free(nextCommit); if (baton->error_code != GIT_ITEROVER) { - baton->error = git_error_dup(giterr_last()); + baton->error = git_error_dup(git_error_last()); while(!baton->out->empty()) { diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 557cb38bc..c70b6856c 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -35,7 +35,7 @@ void GitRevwalk::FileHistoryWalkWorker::Execute() { git_repository *repo = git_revwalk_repository(baton->walk); git_oid *nextOid = (git_oid *)malloc(sizeof(git_oid)); - giterr_clear(); + git_error_clear(); for ( unsigned int i = 0; i < baton->max_count && (baton->error_code = git_revwalk_next(nextOid, baton->walk)) == GIT_OK; @@ -233,7 +233,7 @@ void GitRevwalk::FileHistoryWalkWorker::Execute() if (baton->error_code != GIT_OK) { if (baton->error_code != GIT_ITEROVER) { - baton->error = git_error_dup(giterr_last()); + baton->error = git_error_dup(git_error_last()); while(!baton->out->empty()) { diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index d2d2db933..410255289 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -77,15 +77,15 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { } void GitFilterRegistry::RegisterWorker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster(/*asyncAction: */true, baton->filter_name, baton->filter); int result = git_filter_register(baton->filter_name, baton->filter, baton->filter_priority); baton->error_code = result; - if (result != GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (result != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } } @@ -163,15 +163,15 @@ NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { } void GitFilterRegistry::UnregisterWorker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster(/*asyncAction: */true, baton->filter_name); int result = git_filter_unregister(baton->filter_name); baton->error_code = result; - if (result != GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (result != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } } diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index c4cdb115d..2fe854bec 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -79,7 +79,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { } void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { - giterr_clear(); + git_error_clear(); { LockMaster lockMaster( @@ -107,15 +107,15 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { {%if return.isResultOrError %} baton->error_code = result; - if (result < GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (result < GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } {%elsif return.isErrorCode %} baton->error_code = result; - if (result != GIT_OK && giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); + if (result != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } {%elsif not return.cType == 'void' %} @@ -283,7 +283,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%if arg.cppClassName == "GitBuf" %} {%if cppFunctionName == "Set" %} {%else%} - git_buf_free(baton->{{ arg.name }}); + git_buf_dispose(baton->{{ arg.name }}); free((void *)baton->{{ arg.name }}); {%endif%} {%endif%} diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index 7153b2a9a..c1486d5a6 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -75,8 +75,8 @@ if (git_oid_fromstr(oidOut, (const char *) strdup(*oidString)) != GIT_OK) { free(oidOut); - if (giterr_last()) { - return Nan::ThrowError(giterr_last()->message); + if (git_error_last()) { + return Nan::ThrowError(git_error_last()->message); } else { return Nan::ThrowError("Unknown Error"); } diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index 908f99018..85b220db9 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -18,8 +18,19 @@ {% endif %} {% elsif cppClassName|isV8Value %} - - {% if isCppClassIntType %} + {% if cType|isArrayType %} + v8::Local tmpArray = Nan::New({{ cType|toSizeOfArray }}); + for (unsigned int i = 0; i < {{ cType|toSizeOfArray }}; i++) { + v8::Local element; + {% if isCppClassIntType %} + element = Nan::New<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}[i]); + {% else %} + element = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}[i]); + {% endif %} + Nan::Set(tmpArray, Nan::New(i), element); + } + to = tmpArray; + {% elsif isCppClassIntType %} to = Nan::New<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}); {% else %} to = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}); @@ -53,6 +64,66 @@ to = Nan::Null(); } {% endif %} +{% elsif cType|isArrayType %} + v8::Local tmpArray = Nan::New({{ cType|toSizeOfArray }}); + for (unsigned int i = 0; i < {{ cType|toSizeOfArray }}; i++) { + v8::Local element; + {{ cType|arrayTypeToPlainType }} *rawElement = &{{= parsedName =}}[i]; + + {% if copy %} + if (rawElement != NULL) { + rawElement = {{ copy }}(rawElement); + } + {% endif %} + + if (rawElement != NULL) { + {% if hasOwner %} + v8::Local owners = Nan::New(0); + {% if ownedBy %} + {% if isAsync %} + {% each ownedBy as owner %} + Nan::Set(owners, Nan::New(owners->Length()), this->GetFromPersistent("{{= owner =}}")->ToObject()); + {% endeach %} + {% else %} + {% each ownedByIndices as ownedByIndex %} + Nan::Set(owners, Nan::New(owners->Length()), info[{{= ownedByIndex =}}]->ToObject()); + {% endeach %} + {% endif %} + {% endif %} + {%if isAsync %} + {% elsif ownedByThis %} + Nan::Set(owners, owners->Length(), info.This()); + {% endif %} + {% if ownerFn | toBool %} + Nan::Set( + owners, + Nan::New(owners->Length()), + {{= ownerFn.singletonCppClassName =}}::New( + {{= ownerFn.name =}}(rawElement), + true + )->ToObject() + ); + {% endif %} + {% endif %} + {% if cppClassName == 'Wrapper' %} + element = {{ cppClassName }}::New(rawElement); + {% else %} + element = {{ cppClassName }}::New( + rawElement, + {{ selfFreeing|toBool }} + {% if hasOwner %} + , owners + {% endif %} + ); + {% endif %} + } + else { + element = Nan::Null(); + } + + Nan::Set(tmpArray, Nan::New(i), element); + } + to = tmpArray; {% else %} {% if copy %} if ({{= parsedName =}} != NULL) { @@ -89,7 +160,6 @@ ); {% endif %} {% endif %} - // {{= cppClassName }} {{= parsedName }} {% if cppClassName == 'Wrapper' %} to = {{ cppClassName }}::New({{= parsedName =}}); {% else %} diff --git a/generate/templates/partials/fields.cc b/generate/templates/partials/fields.cc index 9d6e6e39d..437975084 100644 --- a/generate/templates/partials/fields.cc +++ b/generate/templates/partials/fields.cc @@ -1,21 +1,24 @@ {% each fields|fieldsInfo as field %} {% if not field.ignore %} + // start field block NAN_METHOD({{ cppClassName }}::{{ field.cppFunctionName }}) { v8::Local to; {% if field | isFixedLengthString %} char* {{ field.name }} = (char *)Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->GetValue()->{{ field.name }}; {% else %} - {{ field.cType }} - {% if not field.cppClassName|isV8Value %} - {% if not field.cType|isPointer %} - * + {% if field.cType|isArrayType %} + {{ field.cType|arrayTypeToPlainType }} *{{ field.name }} = + {% else %} + {{ field.cType }} + {% if not field.cppClassName|isV8Value %} + {% if not field.cType|isPointer %}*{% endif %} {% endif %} - {% endif %} - {{ field.name }} = - {% if not field.cppClassName|isV8Value %} - {% if not field.cType|isPointer %} - & + {{ field.name }} = + {% if not field.cppClassName|isV8Value %} + {% if field.cType|isArrayType %}{% elsif not field.cType|isPointer %} + & + {% endif %} {% endif %} {% endif %} Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->GetValue()->{{ field.name }}; @@ -24,5 +27,6 @@ {% partial convertToV8 field %} info.GetReturnValue().Set(to); } + // end field block {% endif %} {% endeach %} diff --git a/generate/templates/partials/sync_function.cc b/generate/templates/partials/sync_function.cc index 5f1306dae..3bda175b6 100644 --- a/generate/templates/partials/sync_function.cc +++ b/generate/templates/partials/sync_function.cc @@ -31,7 +31,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { if (Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->GetValue() != NULL) { {%endif%} - giterr_clear(); + git_error_clear(); { // lock master scope start LockMaster lockMaster( @@ -79,8 +79,8 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endif%} {%endeach%} - if (giterr_last()) { - return Nan::ThrowError(giterr_last()->message); + if (git_error_last()) { + return Nan::ThrowError(git_error_last()->message); } else { return Nan::ThrowError("Unknown Error"); } diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index dc0e203e7..e6f1141cb 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -160,13 +160,6 @@ ] } ], - [ - "OS=='linux' or OS=='mac' or OS.endswith('bsd')", { - "libraries": [ - " Date: Mon, 28 Jan 2019 10:08:11 -0700 Subject: [PATCH 024/545] Fix documentation and uses of certificateCheck since it works correctly certificateCheck used to require passing 1 to ignore certificate failures. Now we need to pass 0 to inform libgit2 that the certificate was deemed valid. --- examples/clone.js | 2 +- examples/cloneFromGithubWith2Factor.js | 2 +- examples/pull.js | 2 +- guides/cloning/README.md | 2 +- guides/cloning/gh-two-factor/README.md | 4 +-- guides/cloning/gh-two-factor/index.js | 2 +- guides/cloning/index.js | 2 +- guides/cloning/ssh-with-agent/README.md | 4 +-- guides/cloning/ssh-with-agent/index.js | 2 +- test/tests/clone.js | 28 +++++------------ test/tests/remote.js | 40 +++++++------------------ test/tests/repository.js | 4 +-- 12 files changed, 29 insertions(+), 65 deletions(-) diff --git a/examples/clone.js b/examples/clone.js index 2b9937949..459713d94 100644 --- a/examples/clone.js +++ b/examples/clone.js @@ -14,7 +14,7 @@ fse.remove(path).then(function() { certificateCheck: function() { // github will fail cert check on some OSX machines // this overrides that check - return 1; + return 0; } } } diff --git a/examples/cloneFromGithubWith2Factor.js b/examples/cloneFromGithubWith2Factor.js index 35b08432e..62e0df807 100644 --- a/examples/cloneFromGithubWith2Factor.js +++ b/examples/cloneFromGithubWith2Factor.js @@ -20,7 +20,7 @@ var opts = { return nodegit.Cred.userpassPlaintextNew(token, "x-oauth-basic"); }, certificateCheck: function() { - return 1; + return 0; } } } diff --git a/examples/pull.js b/examples/pull.js index 7f5fc9af0..fe2d83411 100644 --- a/examples/pull.js +++ b/examples/pull.js @@ -16,7 +16,7 @@ nodegit.Repository.open(path.resolve(__dirname, repoDir)) return nodegit.Cred.sshKeyFromAgent(userName); }, certificateCheck: function() { - return 1; + return 0; } } }); diff --git a/guides/cloning/README.md b/guides/cloning/README.md index 2b1fa508a..8b8390f23 100644 --- a/guides/cloning/README.md +++ b/guides/cloning/README.md @@ -85,7 +85,7 @@ to passthrough the certificate check. ``` javascript cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; } + certificateCheck: function() { return 0; } } }; ``` diff --git a/guides/cloning/gh-two-factor/README.md b/guides/cloning/gh-two-factor/README.md index a3b8bbb3f..a6d24d40d 100644 --- a/guides/cloning/gh-two-factor/README.md +++ b/guides/cloning/gh-two-factor/README.md @@ -101,7 +101,7 @@ to passthrough the certificate check. ``` javascript cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; } + certificateCheck: function() { return 0; } } }; ``` @@ -119,7 +119,7 @@ The `fetchOpts` object now looks like this: ``` javascript cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; }, + certificateCheck: function() { return 0; }, credentials: function() { return NodeGit.Cred.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); } diff --git a/guides/cloning/gh-two-factor/index.js b/guides/cloning/gh-two-factor/index.js index d723e52cc..1f34c5756 100644 --- a/guides/cloning/gh-two-factor/index.js +++ b/guides/cloning/gh-two-factor/index.js @@ -22,7 +22,7 @@ var cloneOptions = {}; // with libgit2 being able to verify certificates from GitHub. cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; }, + certificateCheck: function() { return 0; }, credentials: function() { return NodeGit.Cred.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); } diff --git a/guides/cloning/index.js b/guides/cloning/index.js index f6b7c7a37..ec455fbd7 100644 --- a/guides/cloning/index.js +++ b/guides/cloning/index.js @@ -18,7 +18,7 @@ var cloneOptions = {}; // with libgit2 being able to verify certificates from GitHub. cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; } + certificateCheck: function() { return 0; } } }; diff --git a/guides/cloning/ssh-with-agent/README.md b/guides/cloning/ssh-with-agent/README.md index b2cfbe8ce..46a72b823 100644 --- a/guides/cloning/ssh-with-agent/README.md +++ b/guides/cloning/ssh-with-agent/README.md @@ -83,7 +83,7 @@ to passthrough the certificate check. ``` javascript cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; } + certificateCheck: function() { return 0; } } }; ``` @@ -102,7 +102,7 @@ The `fetchOpts` object now looks like this: ``` javascript cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; }, + certificateCheck: function() { return 0; }, credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); } diff --git a/guides/cloning/ssh-with-agent/index.js b/guides/cloning/ssh-with-agent/index.js index f3926392c..b8f5a3aac 100644 --- a/guides/cloning/ssh-with-agent/index.js +++ b/guides/cloning/ssh-with-agent/index.js @@ -17,7 +17,7 @@ var cloneOptions = {}; // with libgit2 being able to verify certificates from GitHub. cloneOptions.fetchOpts = { callbacks: { - certificateCheck: function() { return 1; }, + certificateCheck: function() { return 0; }, // Credentials are passed two arguments, url and username. We forward the // `userName` argument to the `sshKeyFromAgent` function to validate diff --git a/test/tests/clone.js b/test/tests/clone.js index 03a03ade9..e86663e1c 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -43,9 +43,7 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } } }; @@ -202,9 +200,7 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } } }; @@ -221,9 +217,7 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); } @@ -243,9 +237,7 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, credentials: function(url, userName) { return NodeGit.Cred.sshKeyNew( userName, @@ -269,9 +261,7 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, credentials: function(url, userName) { return NodeGit.Cred.sshKeyNew( userName, @@ -296,9 +286,7 @@ describe("Clone", function() { var opts = { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } } }; @@ -328,9 +316,7 @@ describe("Clone", function() { return Clone(url, clonePath, { fetchOpts: { callbacks: { - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, credentials: function() { if (firstPass) { firstPass = false; diff --git a/test/tests/remote.js b/test/tests/remote.js index ff6004c66..27611dd15 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -120,9 +120,7 @@ describe("Remote", function() { return repo.getRemote("origin") .then(function(remote) { remoteCallbacks = { - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 }; return remote.connect(NodeGit.Enums.DIRECTION.FETCH, remoteCallbacks) @@ -201,9 +199,7 @@ describe("Remote", function() { credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); }, - certificateCheck: function() { - return 1; - }, + certificateCheck: () => 0, transferProgress: function() { wasCalled = true; @@ -222,9 +218,7 @@ describe("Remote", function() { it("can get the default branch of a remote", function() { var remoteCallbacks = { - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 }; var remote = this.remote; @@ -242,9 +236,7 @@ describe("Remote", function() { credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }); }); @@ -261,9 +253,7 @@ describe("Remote", function() { "" ); }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }; @@ -288,9 +278,7 @@ describe("Remote", function() { return NodeGit.Cred.sshKeyFromAgent(userName); } }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }; @@ -323,9 +311,7 @@ describe("Remote", function() { credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }); }); @@ -350,9 +336,7 @@ describe("Remote", function() { }); return test; }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }; return remote.push(refs, options); @@ -384,9 +368,7 @@ describe("Remote", function() { .then(Promise.reject.bind(Promise)); return test; }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }; return remote.push(refs, options); @@ -426,9 +408,7 @@ describe("Remote", function() { return Promise.reject(); } }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 } }; return remote.push(refs, options); diff --git a/test/tests/repository.js b/test/tests/repository.js index e960629ac..9427a8f9c 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -185,9 +185,7 @@ describe("Repository", function() { credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); }, - certificateCheck: function() { - return 1; - } + certificateCheck: () => 0 }) .then(function() { return repo.fetchheadForeach(function(refname, remoteUrl, oid, isMerge) { From a373d92cc05722341451bedd3b5eeb0d2dbf0973 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 28 Jan 2019 13:31:51 -0700 Subject: [PATCH 025/545] Convert Buf.prototype.set and Buf.prototype.grow to sync methods --- generate/input/descriptor.json | 4 +-- test/tests/filter.js | 54 ++++++++++++---------------------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index dc55e7587..ae8e0b1c4 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -401,7 +401,7 @@ "jsClassName": "Number", "isErrorCode": true }, - "isAsync": true + "isAsync": false }, "git_buf_set": { "cppFunctionName": "Set", @@ -422,7 +422,7 @@ "jsClassName": "Number", "isErrorCode": true }, - "isAsync": true + "isAsync": false } }, "dependencies": [ diff --git a/test/tests/filter.js b/test/tests/filter.js index 3a57acbef..ef1efc5c0 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -476,10 +476,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.PASSTHROUGH; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.PASSTHROUGH; }, check: function() { return NodeGit.Error.CODE.OK; @@ -522,10 +520,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return NodeGit.Error.CODE.OK; @@ -568,10 +564,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(largeBuffer, largeBufferSize) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(largeBuffer, largeBufferSize); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return NodeGit.Error.CODE.OK; @@ -626,10 +620,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return NodeGit.Error.CODE.OK; @@ -668,10 +660,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return src.path() === "README.md" ? @@ -725,10 +715,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return src.path() === "README.md" ? @@ -956,10 +944,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return NodeGit.Error.CODE.OK; @@ -999,10 +985,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return NodeGit.Error.CODE.OK; @@ -1044,10 +1028,8 @@ describe("Filter", function() { return Registry.register(filterName, { apply: function(to, from, source) { - return to.set(tempBuffer, length) - .then(function() { - return NodeGit.Error.CODE.OK; - }); + to.set(tempBuffer, length); + return NodeGit.Error.CODE.OK; }, check: function(src, attr) { return NodeGit.Error.CODE.OK; From a918cad8cc29c54ec073f867b2d35c8304753266 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 28 Jan 2019 13:32:07 -0700 Subject: [PATCH 026/545] Expose git_commit_signing_cb in rebase options --- generate/input/callbacks.json | 206 ++++++++++++++----------- generate/input/libgit2-supplement.json | 8 + lib/buf.js | 11 ++ lib/rebase.js | 48 +++--- test/tests/rebase.js | 191 +++++++++++++++++++++++ 5 files changed, 355 insertions(+), 109 deletions(-) create mode 100644 lib/buf.js diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index a94faa030..535ca08b7 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -118,6 +118,32 @@ "error": -1 } }, + "git_commit_signing_cb": { + "args": [ + { + "name": "signature", + "cType": "git_buf *" + }, + { + "name": "signature_field", + "cType": "git_buf *" + }, + { + "name": "commit_content", + "cType": "const char *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": -30, + "success": 0, + "error": -1 + } + }, "git_config_foreach_cb": { "args": [ { @@ -311,101 +337,101 @@ "error": -1 } }, - "git_filter_apply_fn": { - "args": [ - { - "name": "self", - "cType": "git_filter *" - }, - { - "name": "payload", - "cType": "void **" - }, - { - "name": "to", - "cType": "git_buf *" - }, - { - "name": "from", - "cType": "const git_buf *" - }, - { - "name": "src", - "cType": "const git_filter_source *" - } - ], - "return": { - "type": "int", - "noResults": -30, - "success": 0, - "error": -1 - } - }, - "git_filter_check_fn": { - "args": [ - { - "name": "self", - "cType": "git_filter *" - }, - { + "git_filter_apply_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + }, + { + "name": "payload", + "cType": "void **" + }, + { + "name": "to", + "cType": "git_buf *" + }, + { + "name": "from", + "cType": "const git_buf *" + }, + { + "name": "src", + "cType": "const git_filter_source *" + } + ], + "return": { + "type": "int", + "noResults": -30, + "success": 0, + "error": -1 + } + }, + "git_filter_check_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + }, + { "name": "payload", "cType": "void **" - }, - { + }, + { "name": "src", "cType": "const git_filter_source *" - }, - { - "name": "attr_values", - "cType": "const char **" - } - ], - "return": { - "type": "int", - "noResults": -30, - "success": 0, - "error": -1 - } - }, - "git_filter_cleanup_fn": { - "args": [ - { - "name": "self", - "cType": "git_filter *" - }, - { - "name": "payload", - "cType": "void *" - } - ], - "return": { - "type": "void" - } - }, - "git_filter_init_fn": { - "args": [ - { - "name": "self", - "cType": "git_filter *" - } - ], - "return": { - "type": "int", + }, + { + "name": "attr_values", + "cType": "const char **" + } + ], + "return": { + "type": "int", + "noResults": -30, + "success": 0, + "error": -1 + } + }, + "git_filter_cleanup_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "void" + } + }, + "git_filter_init_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + } + ], + "return": { + "type": "int", "noResults": 0, - "success": 0, - "error": -1 - } - }, - "git_filter_shutdown_fn": { - "args": [ - { - "name": "self", - "cType": "git_filter *" - } - ], - "return": { - "type": "void" - } + "success": 0, + "error": -1 + } + }, + "git_filter_shutdown_fn": { + "args": [ + { + "name": "self", + "cType": "git_filter *" + } + ], + "return": { + "type": "void" + } }, "git_index_matched_path_cb": { "args": [ diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index cc073582b..07b2b770e 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -777,6 +777,14 @@ { "type": "git_merge_options", "name": "merge_options" + }, + { + "type": "git_commit_signing_cb", + "name": "signing_cb" + }, + { + "type": "void *", + "name": "payload" } ], "used": { diff --git a/lib/buf.js b/lib/buf.js new file mode 100644 index 000000000..28f34c2a3 --- /dev/null +++ b/lib/buf.js @@ -0,0 +1,11 @@ +const { Buf } = require("../"); + +/** + * Sets the content of a GitBuf to a string. + * @param {string} The utf8 value to set in the buffer. + * The string will be null terminated. + */ +Buf.prototype.setString = function(content) { + const buf = Buffer.from(content + "\0", "utf8"); + this.set(buf, buf.length); +}; diff --git a/lib/rebase.js b/lib/rebase.js index 28882ea6c..0d9521760 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -7,21 +7,6 @@ var _init = Rebase.init; var _open = Rebase.open; var _abort = Rebase.prototype.abort; var _commit = Rebase.prototype.commit; -/** - * Initializes a rebase - * @async - * @param {Repository} repo The repository to perform the rebase - * @param {AnnotatedCommit} branch The terminal commit to rebase, or NULL to - * rebase the current branch - * @param {AnnotatedCommit} upstream The commit to begin rebasing from, or NULL - * to rebase all reachable commits - * @param {AnnotatedCommit} onto The branch to rebase onto, or NULL to rebase - * onto the given upstream - * @param {RebaseOptions} options Options to specify how rebase is performed, - * or NULL - * @param {Function} callback - * @return {Remote} - */ function defaultRebaseOptions(options, checkoutStrategy) { var checkoutOptions; @@ -61,12 +46,38 @@ function defaultRebaseOptions(options, checkoutStrategy) { return options; } +// Save options on the rebase object. If we don't do this, +// the options may be cleaned up and cause a segfault +// when Rebase.prototype.commit is called. +const lockOptionsOnRebase = (options) => (rebase) => { + Object.defineProperty(rebase, "options", { + value: options, + writable: false + }); + return rebase; +}; + +/** + * Initializes a rebase + * @async + * @param {Repository} repo The repository to perform the rebase + * @param {AnnotatedCommit} branch The terminal commit to rebase, or NULL to + * rebase the current branch + * @param {AnnotatedCommit} upstream The commit to begin rebasing from, or NULL + * to rebase all reachable commits + * @param {AnnotatedCommit} onto The branch to rebase onto, or NULL to rebase + * onto the given upstream + * @param {RebaseOptions} options Options to specify how rebase is performed, + * or NULL + * @return {Remote} + */ Rebase.init = function(repository, branch, upstream, onto, options) { options = defaultRebaseOptions( options, NodeGit.Checkout.STRATEGY.FORCE ); - return _init(repository, branch, upstream, onto, options); + return _init(repository, branch, upstream, onto, options) + .then(lockOptionsOnRebase(options)); }; /** @@ -75,7 +86,6 @@ Rebase.init = function(repository, branch, upstream, onto, options) { * @async * @param {Repository} repo The repository that has a rebase in-progress * @param {RebaseOptions} options Options to specify how rebase is performed - * @param {Function} callback * @return {Remote} */ Rebase.open = function(repository, options) { @@ -83,7 +93,8 @@ Rebase.open = function(repository, options) { options, NodeGit.Checkout.STRATEGY.SAFE ); - return _open(repository, options); + return _open(repository, options) + .then(lockOptionsOnRebase(options)); }; Rebase.prototype.commit = function(author, committer, encoding, message) { @@ -93,4 +104,3 @@ Rebase.prototype.commit = function(author, committer, encoding, message) { Rebase.prototype.abort = function() { return _abort.call(this); }; - diff --git a/test/tests/rebase.js b/test/tests/rebase.js index ae9aab1d1..f852a8651 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -3,6 +3,8 @@ var path = require("path"); var local = path.join.bind(path, __dirname); var fse = require("fs-extra"); +var garbageCollect = require("../utils/garbage_collect.js"); + describe("Rebase", function() { var NodeGit = require("../../"); var Checkout = NodeGit.Checkout; @@ -1534,4 +1536,193 @@ describe("Rebase", function() { "b3c355bb606ec7da87174dfa1a0b0c0e3dc97bc0"); }); }); + + it("can sign commits during the rebase", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: (signatureBuf, signatureFieldBuf, commitContent) => { + signatureBuf.setString("A moose was here."); + signatureFieldBuf.setString("moose-sig"); + return 0; + } + }); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed"); + + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); + + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); + + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), + "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed"); + + return Promise.all([ + commit.parent(0), + NodeGit.Commit.extractSignature( + repository, + "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed", + "moose-sig" + ) + ]); + }) + .then(function([parent, { signature }]) { + // verify that we are on top of "their commit" + assert.equal(parent.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + assert.equal(signature, "A moose was here."); + }); + }); }); From 2d2a29d60983fe6bcac2164044364bc80e8f57eb Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Mon, 28 Jan 2019 11:22:24 -0700 Subject: [PATCH 027/545] Add async method to Commit for amending with signature --- lib/commit.js | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/lib/commit.js b/lib/commit.js index 232d771b0..cf0918c0c 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -1,4 +1,5 @@ var events = require("events"); +var fp = require("lodash/fp"); var NodeGit = require("../"); var Commit = NodeGit.Commit; var LookupWrapper = NodeGit.Utils.lookupWrapper; @@ -50,6 +51,135 @@ Commit.prototype.amend = function ( }); }; +/** + * Amend a commit with the given signature + * @async + * @param {String} update_ref + * @param {Signature} author + * @param {Signature} committer + * @param {String} message_encoding + * @param {String} message + * @param {Tree|Oid} tree + * @param {String} signature_field + * @param {Function} onSignature + * @return {Oid} +*/ +Commit.prototype.amendWithSignature = function( + updateRef, + author, + committer, + message_encoding, + message, + tree, + signature_field, + onSignature +) { + var repo = this.repo; + var parentOids = this.parents(); + var _this = this; + var promises = []; + + if (tree instanceof NodeGit.Oid) { + promises.push(repo.getTree(tree)); + } else { + promises.push(Promise.resolve(tree)); + } + + parentOids.forEach(function (parentOid) { + promises.push(repo.getCommit(parentOid)); + }); + + var treeObject; + var parents; + var commitContent; + var commitOid; + var commit; + + var createCommitPromise = Promise.all(promises) + .then(function(results) { + treeObject = results[0]; + + parents = []; + for (var i = 0; i < parentOids.length; i++) { + parents.push(results[i+1]); + } + + return _this.getTree(); + }) + .then(function(commitTreeResult) { + var commitTree = commitTreeResult; + + var truthyArgs = fp.omitBy( + fp.isNil, + { + author, + committer, + message_encoding, + message, + tree: treeObject + } + ); + + var commitFields = { + author: _this.author(), + committer: _this.committer(), + message_encoding: _this.messageEncoding(), + message: _this.message(), + tree: commitTree + }; + + var { + author: resolvedAuthor, + committer: resolvedCommitter, + message_encoding: resolvedMessageEncoding, + message: resolvedMessage, + tree: resolvedTree + } = fp.assign( + truthyArgs, + commitFields + ); + + return Commit.createBuffer( + repo, + resolvedAuthor, + resolvedCommitter, + resolvedMessageEncoding, + resolvedMessage, + resolvedTree, + parents.length, + parents + ); + }) + .then(function(commitContentResult) { + commitContent = commitContentResult + "\n"; + return onSignature(commitContent); + }) + .then(function(signature) { + return Commit.createWithSignature( + repo, + commitContent, + signature, + signature_field + ); + }); + + if (!updateRef) { + return createCommitPromise; + } + + return createCommitPromise.then(function(commitOidResult) { + commitOid = commitOidResult; + return repo.getCommit(commitOid); + }).then(function(commitResult) { + commit = commitResult; + return repo.getReference(updateRef); + }).then(function(ref) { + return ref.setTarget(commitOid, `commit (amend): ${commit.summary()}`); + }).then(function() { + return commitOid; + }); +}; + /** * Retrieve the commit time as a Date object. * @return {Date} From 61a20de5d8ff4b1ac459ae873bef774bc52bd701 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Mon, 28 Jan 2019 11:23:48 -0700 Subject: [PATCH 028/545] Added test for Commit#amendWithSignature --- test/tests/commit.js | 69 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/test/tests/commit.js b/test/tests/commit.js index 395b0eebe..b340eb748 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -450,6 +450,73 @@ describe("Commit", function() { }); }); + + it("can amend commit with signature", function() { + const signature = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + + "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + + "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + + "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + + "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + + "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + + "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + + "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + + "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + + "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + + "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + + "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + + "ekgUBx+BX6nJOw==\n" + + "=4Hy5\n" + + "-----END PGP SIGNATURE-----"; + + function onSignature(dataToSign) { + return new Promise(function (resolve) { + return resolve(signature); + }); + } + + var repo; + var oid; + var commit; + var message; + var parents; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + message = headCommit.message().trim(); + parents = headCommit.parents(); + + return headCommit.amendWithSignature( + null, + null, + null, + null, + null, + null, + "gpgsig", + onSignature + ); + }) + .then(function(oidResult) { + oid = oidResult; + return NodeGit.Commit.lookup(repo, oid); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signatureInfo.signature, signature); + assert.equal(commit.message().trim(), message); + assert.deepEqual(commit.parents(), parents); + }); + }); + it("has an owner", function() { var owner = this.commit.owner(); assert.ok(owner instanceof Repository); @@ -887,7 +954,7 @@ describe("Commit", function() { assert.equal(signature, signatureInfo.signature); return reinitialize(test); }, function(reason) { - return reinitialize(test) + return reinitialize(test); .then(function() { return Promise.reject(reason); }); From 5963f09014a799dde19832054af82c7f3b18266a Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Mon, 28 Jan 2019 14:29:40 -0700 Subject: [PATCH 029/545] Fix linter + PR feedback --- lib/commit.js | 27 +++++++++++---------------- test/tests/commit.js | 2 +- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/lib/commit.js b/lib/commit.js index cf0918c0c..734cfc781 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -54,13 +54,13 @@ Commit.prototype.amend = function ( /** * Amend a commit with the given signature * @async - * @param {String} update_ref + * @param {String} updateRef * @param {Signature} author * @param {Signature} committer - * @param {String} message_encoding + * @param {String} messageEncoding * @param {String} message * @param {Tree|Oid} tree - * @param {String} signature_field + * @param {String} signatureField * @param {Function} onSignature * @return {Oid} */ @@ -68,10 +68,10 @@ Commit.prototype.amendWithSignature = function( updateRef, author, committer, - message_encoding, + messageEncoding, message, tree, - signature_field, + signatureField, onSignature ) { var repo = this.repo; @@ -97,13 +97,8 @@ Commit.prototype.amendWithSignature = function( var createCommitPromise = Promise.all(promises) .then(function(results) { - treeObject = results[0]; - - parents = []; - for (var i = 0; i < parentOids.length; i++) { - parents.push(results[i+1]); - } - + treeObject = fp.head(results); + parents = fp.tail(results); return _this.getTree(); }) .then(function(commitTreeResult) { @@ -114,7 +109,7 @@ Commit.prototype.amendWithSignature = function( { author, committer, - message_encoding, + messageEncoding, message, tree: treeObject } @@ -123,7 +118,7 @@ Commit.prototype.amendWithSignature = function( var commitFields = { author: _this.author(), committer: _this.committer(), - message_encoding: _this.messageEncoding(), + messageEncoding: _this.messageEncoding(), message: _this.message(), tree: commitTree }; @@ -131,7 +126,7 @@ Commit.prototype.amendWithSignature = function( var { author: resolvedAuthor, committer: resolvedCommitter, - message_encoding: resolvedMessageEncoding, + messageEncoding: resolvedMessageEncoding, message: resolvedMessage, tree: resolvedTree } = fp.assign( @@ -159,7 +154,7 @@ Commit.prototype.amendWithSignature = function( repo, commitContent, signature, - signature_field + signatureField ); }); diff --git a/test/tests/commit.js b/test/tests/commit.js index b340eb748..9bb0e4b2d 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -954,7 +954,7 @@ describe("Commit", function() { assert.equal(signature, signatureInfo.signature); return reinitialize(test); }, function(reason) { - return reinitialize(test); + return reinitialize(test) .then(function() { return Promise.reject(reason); }); From f41c963b14edd40271d775116e9f7897ad41fb10 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 29 Jan 2019 08:16:15 -0700 Subject: [PATCH 030/545] Fix several test pollution issues in stash test suite. --- test/tests/stash.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/tests/stash.js b/test/tests/stash.js index 5a65a9a16..6d1a20c04 100644 --- a/test/tests/stash.js +++ b/test/tests/stash.js @@ -57,7 +57,10 @@ describe("Stash", function() { .then(function() { assert.equal(stashes.length, 1); assert.equal(stashes[0].index, 0); - assert.equal(stashes[0].message, "On master: " + stashMessage); + const expectedMessage = !stashMessage ? + "WIP on master: 32789a7 Fixes EJS not being installed via NPM" : + "On master: " + stashMessage; + assert.equal(stashes[0].message, expectedMessage); assert.equal(stashes[0].oid.toString(), stashOid.toString()); return Stash.drop(repo, 0); @@ -82,11 +85,11 @@ describe("Stash", function() { } it("can save and drop a stash", function() { - saveDropStash(this.repository, "stash test"); + return saveDropStash(this.repository, "stash test"); }); it("can save a stash with no message and drop it", function() { - saveDropStash(this.repository, null); + return saveDropStash(this.repository, null); }); it("can save and pop a stash", function() { @@ -198,8 +201,8 @@ describe("Stash", function() { return Stash.drop(repo, 0); }) .catch(function(reason) { - if (reason.message !== "Reference 'refs/stash' not found") { - Promise.reject(); + if (reason.message !== "reference 'refs/stash' not found") { + throw reason; } }); }); From ef83aa300d73e1bfb8b62449fbfdbe76ee7bbe7d Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 29 Jan 2019 10:16:54 -0700 Subject: [PATCH 031/545] Add some comments for clarification on ownership --- generate/templates/partials/convert_to_v8.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index 85b220db9..95e38a377 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -82,6 +82,7 @@ {% if ownedBy %} {% if isAsync %} {% each ownedBy as owner %} + {%-- If the owner of this object is "this" in an async method, it will be stored in the persistent handle by name. --%} Nan::Set(owners, Nan::New(owners->Length()), this->GetFromPersistent("{{= owner =}}")->ToObject()); {% endeach %} {% else %} @@ -92,6 +93,7 @@ {% endif %} {%if isAsync %} {% elsif ownedByThis %} + {%-- If the owner of this object is "this", it will be retrievable from the info object in a sync method. --%} Nan::Set(owners, owners->Length(), info.This()); {% endif %} {% if ownerFn | toBool %} @@ -137,6 +139,7 @@ {% if ownedBy %} {% if isAsync %} {% each ownedBy as owner %} + {%-- If the owner of this object is "this" in an async method, it will be stored in the persistent handle by name. --%} Nan::Set(owners, Nan::New(owners->Length()), this->GetFromPersistent("{{= owner =}}")->ToObject()); {% endeach %} {% else %} @@ -147,6 +150,7 @@ {% endif %} {%if isAsync %} {% elsif ownedByThis %} + {%-- If the owner of this object is "this", it will be retrievable from the info object in a sync method. --%} Nan::Set(owners, owners->Length(), info.This()); {% endif %} {% if ownerFn | toBool %} From 05fd1455c455f2e70fe00adb9d90ba484964d226 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 29 Jan 2019 10:56:41 -0700 Subject: [PATCH 032/545] Combine array/single convertToV8 blocks --- generate/scripts/generateNativeCode.js | 1 + .../templates/filters/as_element_pointer.js | 7 ++ generate/templates/partials/convert_to_v8.cc | 84 +++---------------- 3 files changed, 20 insertions(+), 72 deletions(-) create mode 100644 generate/templates/filters/as_element_pointer.js diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index 3ba5f6b02..47a832419 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -51,6 +51,7 @@ module.exports = function generateNativeCode() { and: require("../templates/filters/and"), argsInfo: require("../templates/filters/args_info"), arrayTypeToPlainType: require("../templates/filters/array_type_to_plain_type"), + asElementPointer: require("../templates/filters/as_element_pointer"), cppToV8: require("../templates/filters/cpp_to_v8"), defaultValue: require("../templates/filters/default_value"), fieldsInfo: require("../templates/filters/fields_info"), diff --git a/generate/templates/filters/as_element_pointer.js b/generate/templates/filters/as_element_pointer.js new file mode 100644 index 000000000..8b34eed17 --- /dev/null +++ b/generate/templates/filters/as_element_pointer.js @@ -0,0 +1,7 @@ +const isArrayType = require("./is_array_type"); + +module.exports = function(cType, parsedName) { + return isArrayType(cType) ? + "&" + parsedName + "[i]" : + parsedName; +}; diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index 95e38a377..f3adc3c9b 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -64,76 +64,12 @@ to = Nan::Null(); } {% endif %} -{% elsif cType|isArrayType %} - v8::Local tmpArray = Nan::New({{ cType|toSizeOfArray }}); - for (unsigned int i = 0; i < {{ cType|toSizeOfArray }}; i++) { - v8::Local element; - {{ cType|arrayTypeToPlainType }} *rawElement = &{{= parsedName =}}[i]; - - {% if copy %} - if (rawElement != NULL) { - rawElement = {{ copy }}(rawElement); - } - {% endif %} - - if (rawElement != NULL) { - {% if hasOwner %} - v8::Local owners = Nan::New(0); - {% if ownedBy %} - {% if isAsync %} - {% each ownedBy as owner %} - {%-- If the owner of this object is "this" in an async method, it will be stored in the persistent handle by name. --%} - Nan::Set(owners, Nan::New(owners->Length()), this->GetFromPersistent("{{= owner =}}")->ToObject()); - {% endeach %} - {% else %} - {% each ownedByIndices as ownedByIndex %} - Nan::Set(owners, Nan::New(owners->Length()), info[{{= ownedByIndex =}}]->ToObject()); - {% endeach %} - {% endif %} - {% endif %} - {%if isAsync %} - {% elsif ownedByThis %} - {%-- If the owner of this object is "this", it will be retrievable from the info object in a sync method. --%} - Nan::Set(owners, owners->Length(), info.This()); - {% endif %} - {% if ownerFn | toBool %} - Nan::Set( - owners, - Nan::New(owners->Length()), - {{= ownerFn.singletonCppClassName =}}::New( - {{= ownerFn.name =}}(rawElement), - true - )->ToObject() - ); - {% endif %} - {% endif %} - {% if cppClassName == 'Wrapper' %} - element = {{ cppClassName }}::New(rawElement); - {% else %} - element = {{ cppClassName }}::New( - rawElement, - {{ selfFreeing|toBool }} - {% if hasOwner %} - , owners - {% endif %} - ); - {% endif %} - } - else { - element = Nan::Null(); - } - - Nan::Set(tmpArray, Nan::New(i), element); - } - to = tmpArray; {% else %} - {% if copy %} - if ({{= parsedName =}} != NULL) { - {{= parsedName =}} = ({{ cType|replace '**' '*' }} {% if not cType|isPointer %}*{% endif %}){{ copy }}({{= parsedName =}}); - } + {% if cType|isArrayType %} + v8::Local tmpArray = Nan::New({{ cType|toSizeOfArray }}); + for (unsigned int i = 0; i < {{ cType|toSizeOfArray }}; i++) { {% endif %} - - if ({{= parsedName =}} != NULL) { + if ({{ cType|asElementPointer parsedName }} != NULL) { {% if hasOwner %} v8::Local owners = Nan::New(0); {% if ownedBy %} @@ -158,17 +94,17 @@ owners, Nan::New(owners->Length()), {{= ownerFn.singletonCppClassName =}}::New( - {{= ownerFn.name =}}({{= parsedName =}}), + {{= ownerFn.name =}}({{ cType|asElementPointer parsedName }}), true )->ToObject() ); {% endif %} {% endif %} {% if cppClassName == 'Wrapper' %} - to = {{ cppClassName }}::New({{= parsedName =}}); + to = {{ cppClassName }}::New({{ cType|asElementPointer parsedName }}); {% else %} to = {{ cppClassName }}::New( - {{= parsedName =}}, + {{ cType|asElementPointer parsedName }}, {{ selfFreeing|toBool }} {% if hasOwner %} , owners @@ -179,6 +115,10 @@ else { to = Nan::Null(); } - + {% if cType|isArrayType %} + Nan::Set(tmpArray, Nan::New(i), to); + } + to = tmpArray; + {% endif %} {% endif %} // end convert_to_v8 block From 6fd42e2244d34e9e9c7320252365750a17f4a2f4 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Tue, 29 Jan 2019 14:26:16 -0700 Subject: [PATCH 033/545] Fix order of `fp.assign` args --- lib/commit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/commit.js b/lib/commit.js index 734cfc781..fe8802299 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -130,8 +130,8 @@ Commit.prototype.amendWithSignature = function( message: resolvedMessage, tree: resolvedTree } = fp.assign( - truthyArgs, - commitFields + commitFields, + truthyArgs ); return Commit.createBuffer( From 94313ea4447217e4c0283cd731f1e8b5ef2f8ec3 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Tue, 29 Jan 2019 14:43:02 -0700 Subject: [PATCH 034/545] Do not append an additional newline to `amend` commit buffers --- lib/commit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commit.js b/lib/commit.js index fe8802299..fe32b5e31 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -146,7 +146,7 @@ Commit.prototype.amendWithSignature = function( ); }) .then(function(commitContentResult) { - commitContent = commitContentResult + "\n"; + commitContent = commitContentResult; return onSignature(commitContent); }) .then(function(signature) { From b0c33bf51b88d00697b101d1f3677f5f72cf8881 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Tue, 29 Jan 2019 14:45:35 -0700 Subject: [PATCH 035/545] Update tests --- test/tests/commit.js | 92 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/test/tests/commit.js b/test/tests/commit.js index 9bb0e4b2d..522017bc7 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -488,7 +488,7 @@ describe("Commit", function() { return repo.getHeadCommit(); }) .then(function(headCommit) { - message = headCommit.message().trim(); + message = headCommit.message(); parents = headCommit.parents(); return headCommit.amendWithSignature( @@ -512,11 +512,99 @@ describe("Commit", function() { }) .then(function(signatureInfo) { assert.equal(signatureInfo.signature, signature); - assert.equal(commit.message().trim(), message); + assert.equal(commit.message(), message); assert.deepEqual(commit.parents(), parents); }); }); + it("amending with signature respects overridden arguments", function() { + const signature = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + + "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + + "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + + "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + + "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + + "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + + "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + + "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + + "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + + "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + + "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + + "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + + "ekgUBx+BX6nJOw==\n" + + "=4Hy5\n" + + "-----END PGP SIGNATURE-----"; + + function onSignature(dataToSign) { + return new Promise(function (resolve) { + return resolve(signature); + }); + } + + var repo; + var oid; + var commit; + var message; + var parents; + var commitTree; + + var author = NodeGit.Signature.create( + "Scooby Doo", + "scoob@mystery.com", + 123456789, + 60 + ); + var committer = NodeGit.Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + var tree = Oid.fromString("f4661419a6fbbe865f78644fec722c023ce4b65f"); + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + message = headCommit.message(); + parents = headCommit.parents(); + + return headCommit.amendWithSignature( + null, + author, + committer, + null, + null, + tree, + "gpgsig", + onSignature + ); + }) + .then(function(oidResult) { + oid = oidResult; + return NodeGit.Commit.lookup(repo, oid); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getTree(); + }) + .then(function(commitTreeResult) { + commitTree = commitTreeResult; + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signatureInfo.signature, signature); + assert.equal(commit.message(), message); + assert.deepEqual(commit.parents(), parents); + assert.deepEqual(commitTree.id(), tree); + assert.deepEqual(commit.author(), author); + assert.deepEqual(commit.committer(), committer); + }); + }); + it("has an owner", function() { var owner = this.commit.owner(); assert.ok(owner instanceof Repository); From b6498b0a2f69d2ac9ed78d48b521f4c0c2b1b637 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 30 Jan 2019 09:39:25 -0700 Subject: [PATCH 036/545] Pad commit buffer with newline only if it does not already end with newline --- lib/commit.js | 3 +++ lib/repository.js | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/commit.js b/lib/commit.js index fe32b5e31..02b3679d5 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -147,6 +147,9 @@ Commit.prototype.amendWithSignature = function( }) .then(function(commitContentResult) { commitContent = commitContentResult; + if (!commitContent.endsWith("\n")) { + commitContent += "\n"; + } return onSignature(commitContent); }) .then(function(signature) { diff --git a/lib/repository.js b/lib/repository.js index 1962d894d..d036486d4 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -698,7 +698,10 @@ Repository.prototype.createCommitWithSignature = function( parents ); }).then(function(commit_contentResult) { - commit_content = commit_contentResult + "\n"; + commit_content = commit_contentResult; + if (!commit_content.endsWith("\n")) { + commit_content += "\n"; + } return onSignature(commit_content); }).then(function(signature) { return Commit.createWithSignature( From 47107ae69aac8e9519c3d894fb3acd81f731b33c Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 30 Jan 2019 16:01:45 -0700 Subject: [PATCH 037/545] Expose `Tag.createFromBuffer` function --- generate/input/descriptor.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index ae8e0b1c4..d23255fde 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3597,7 +3597,16 @@ "isAsync": true }, "git_tag_create_frombuffer": { - "ignore": true + "jsFunctionName": "createFromBuffer", + "args": { + "oid": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + }, + "isAsync": true }, "git_tag_create_lightweight": { "args": { From cd0bc3b3a7dc65424c90151b57a60e629efdc662 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 30 Jan 2019 16:05:04 -0700 Subject: [PATCH 038/545] Expose `sign` field on Time --- generate/input/descriptor.json | 5 ----- generate/templates/partials/convert_to_v8.cc | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index d23255fde..de5eebf74 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3707,11 +3707,6 @@ "dependencies": [ "git2/sys/time.h" ], - "fields": { - "sign": { - "ignore": true - } - }, "functions": { "git_time_sign": { "ignore": true diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index f3adc3c9b..1227932a6 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -5,6 +5,9 @@ to = Nan::New({{= parsedName =}}, {{ size }}).ToLocalChecked(); {% elsif cType == 'char **' %} to = Nan::New(*{{= parsedName =}}).ToLocalChecked(); + {% elsif cType == 'char' %} + char convertToNullTerminated[2] = { {{= parsedName =}}, '\0' }; + to = Nan::New(convertToNullTerminated).ToLocalChecked(); {% else %} to = Nan::New({{= parsedName =}}).ToLocalChecked(); {% endif %} From ef3d9c7e9a6f279c3dbf050efcd22b4c78cccee9 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 30 Jan 2019 16:06:18 -0700 Subject: [PATCH 039/545] Extend `Signature.toString` to optionally include timestamps --- lib/signature.js | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/lib/signature.js b/lib/signature.js index 7fc8e274d..4dfe84a36 100644 --- a/lib/signature.js +++ b/lib/signature.js @@ -1,11 +1,38 @@ var NodeGit = require("../"); var Signature = NodeGit.Signature; +const toPaddedDoubleDigitString = (number) => { + if (number < 10) { + return `0${number}`; + } + + return `${number}`; +}; + /** * Standard string representation of an author. - * - * @return {string} Representation of the author. + * @param {Boolean} withTime Whether or not to include timestamp + * @return {String} Representation of the author. */ -Signature.prototype.toString = function() { - return this.name().toString() + " <" + this.email().toString() + ">"; +Signature.prototype.toString = function(withTime) { + const name = this.name().toString(); + const email = this.email().toString(); + + let stringifiedSignature = `${name} <${email}>`; + + if (!withTime) { + return stringifiedSignature; + } + + const when = this.when(); + const offset = when.offset(); + const offsetMagnitude = Math.abs(offset); + const time = when.time(); + + const sign = (offset < 0 || when.sign() === "-") ? "-" : "+"; + const hours = toPaddedDoubleDigitString(Math.floor(offsetMagnitude / 60)); + const minutes = toPaddedDoubleDigitString(offsetMagnitude % 60); + + stringifiedSignature += ` ${time} ${sign}${hours}${minutes}`; + return stringifiedSignature; }; From d9cdc8a25ba83145283c888862575ae195a52f6c Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 30 Jan 2019 16:07:40 -0700 Subject: [PATCH 040/545] Add a `Tag.createBuffer` function --- lib/tag.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/tag.js b/lib/tag.js index bf8ddff49..67027c005 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -10,3 +10,31 @@ var Tag = NodeGit.Tag; * @return {Tag} */ Tag.lookup = LookupWrapper(Tag); + +/** + * @async + * @param {Repository} repo + * @param {String} tagName + * @param {Oid} target + * @param {Signature} tagger + * @return {String} + */ +Tag.createBuffer = function(repo, tagName, target, tagger, message) { + return NodeGit.Object.lookup(repo, target, NodeGit.Object.TYPE.ANY) + .then((object) => { + if (!NodeGit.Object.typeisloose(object.type())) { + throw new Error("Object must be a loose type"); + } + + const id = object.id().toString(); + const objectType = NodeGit.Object.type2String(object.type()); + const lines = [ + `object ${id}`, + `type ${objectType}`, + `tag ${tagName}`, + `tagger ${tagger.toString(true)}\n`, + `${message}${message.endsWith("\n") ? "" : "\n"}` + ]; + return lines.join("\n"); + }); +}; From c28d9f19ba506a099c606a0f0d27eb9567168f53 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 30 Jan 2019 16:08:04 -0700 Subject: [PATCH 041/545] Add `Tag.createWithSignature` and `Tag.extractSignature` --- lib/tag.js | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/lib/tag.js b/lib/tag.js index 67027c005..b94872160 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -2,13 +2,23 @@ var NodeGit = require("../"); var LookupWrapper = NodeGit.Utils.lookupWrapper; var Tag = NodeGit.Tag; +const signatureRegexesBySignatureType = { + gpgsig: [ + /-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/gm, + /-----BEGIN PGP MESSAGE-----[\s\S]+?-----END PGP MESSAGE-----/gm, + ], + x509: [ + /-----BEGIN SIGNED MESSAGE-----[\s\S]+?-----END SIGNED MESSAGE-----/gm, + ] +}; + /** -* Retrieves the tag pointed to by the oid -* @async -* @param {Repository} repo The repo that the tag lives in -* @param {String|Oid|Tag} id The tag to lookup -* @return {Tag} -*/ + * Retrieves the tag pointed to by the oid + * @async + * @param {Repository} repo The repo that the tag lives in + * @param {String|Oid|Tag} id The tag to lookup + * @return {Tag} + */ Tag.lookup = LookupWrapper(Tag); /** @@ -38,3 +48,68 @@ Tag.createBuffer = function(repo, tagName, target, tagger, message) { return lines.join("\n"); }); }; + +/** + * @async + * @param {Repository} repo + * @param {String} tagName + * @param {Oid} target + * @param {Signature} tagger + * @param {String} message + * @param {Number} force + * @param {Function} signingCallback Takes a string and returns a string + * representing the signed message + * @return {Oid} + */ +Tag.createWithSignature = function( + repo, + tagName, + target, + tagger, + message, + force, + signingCallback +) { + let tagBuffer; + return Tag.createBuffer(repo, tagName, target, tagger, message) + .then((tagBufferResult) => { + tagBuffer = tagBufferResult; + return signingCallback(tagBuffer); + }) + .then((tagSignature) => { + const normalizedEnding = tagSignature.endsWith("\n") ? "" : "\n"; + const signedTagString = tagBuffer + tagSignature + normalizedEnding; + return Tag.createFromBuffer(repo, signedTagString, force); + }); +}; + +/** + * Retrieves the signature of an annotated tag + * @async + * @param {String} signatureType + * @return {String|null} + */ +Tag.prototype.extractSignature = function(signatureType = "gpgsig") { + const id = this.id(); + const repo = this.repo; + const signatureRegexes = signatureRegexesBySignatureType[signatureType]; + if (!signatureRegexes) { + throw new Error("Unsupported signature type"); + } + + return repo.odb().then((odb) => { + return odb.read(id); + }).then((odbObject) => { + const odbData = odbObject.toString(); + + for (const regex of signatureRegexes) { + const matchResult = regex.exec(odbData); + + if (matchResult !== null) { + return matchResult[0]; + } + } + + return null; + }); +}; From cb6338e24f231533bf722cc111b79768a905d157 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 30 Jan 2019 18:21:11 -0700 Subject: [PATCH 042/545] Add tests --- test/tests/signature.js | 25 +++++ test/tests/tag.js | 223 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 248 insertions(+) diff --git a/test/tests/signature.js b/test/tests/signature.js index bf5f99ef7..9a6b2119b 100644 --- a/test/tests/signature.js +++ b/test/tests/signature.js @@ -104,4 +104,29 @@ describe("Signature", function() { // the self-freeing time should get freed assert.equal(startSelfFreeingCount, endSelfFreeingCount); }); + + it("toString does not provide a timestamp by default", function () { + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + + assert.equal(signature.toString(), "Shaggy Rogers "); + }); + + it("toString provides the correct timestamp when requested", function() { + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + + assert.equal( + signature.toString(true), + "Shaggy Rogers 987654321 +0130" + ); + }); }); diff --git a/test/tests/tag.js b/test/tests/tag.js index 8d2c48f20..c43a618a1 100644 --- a/test/tests/tag.js +++ b/test/tests/tag.js @@ -207,6 +207,229 @@ describe("Tag", function() { }); }); + it("can create a Tag buffer", function() { + const targetOid = Oid.fromString(commitPointedTo); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + + return Tag.createBuffer(repository, name, targetOid, signature, message) + .then((tagBuffer) => { + const lines = tagBuffer.split("\n"); + assert.equal(7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + assert.equal(lines[6], ""); + }); + }); + + it("can create a Tag from a Tag buffer", function() { + const targetOid = Oid.fromString(commitPointedTo); + const otherTargetOid = Oid.fromString(commitPointedTo2); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + + let odb; + let buffer; + let otherBuffer; + + return repository.odb() + .then((odbResult) => { + odb = odbResult; + return Tag.createBuffer( + repository, + name, + targetOid, + signature, + message + ); + }) + .then((bufferResult) => { + buffer = bufferResult; + return Tag.createBuffer( + repository, + name, + otherTargetOid, + signature, + message + ); + }) + .then((bufferResult) => { + otherBuffer = bufferResult; + return Tag.createFromBuffer(repository, buffer, 1); + }) + .then((oid) => { + return odb.read(oid); + }) + .then((object) => { + const lines = object.toString().split("\n"); + assert(object.type(), Obj.TYPE.TAG); + assert.equal(7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + assert.equal(lines[6], ""); + }) + .then(() => { + // overwriting is okay + return Tag.createFromBuffer(repository, otherBuffer, 1); + }) + .then(() => { + // overwriting is not okay + return Tag.createFromBuffer(repository, buffer, 0); + }) + .then(() => { + return Promise.reject( + new Error("should not be able to create the '" + name + "' tag twice") + ); + }, + () => { + return Promise.resolve(); + }); + }); + + it("can create a tag with a signature and extract the signature", function() { + const targetOid = Oid.fromString(commitPointedTo); + const otherTargetOid = Oid.fromString(commitPointedTo2); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const signatureLines = [ + "-----BEGIN PGP SIGNATURE-----", + "iQIzBAABCAAdFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxR4JUACgkQURjJKedO", + "fEN+8A//cXmkRmhzQMdTEdrxty7tVKQ7lVhL7r7e+cB84hO7WrDn8549c7/Puflu", + "idanWfyoAEMSNWDgY84lx/t3I3YYKXsLDPT93HiMhCXmPVZcfLxlARRL1rrNZV4q", + "L9hhqb9bFrRNBn6YebhygeLXLHlDKEZzx8W9jnDLU8Px8UTkwdQIDnPDfT7UOPPU", + "MYDgP3OwWwoG8dUlZXaHjtFz29wPlJo177MwdLYwn4zpEIysoY1ev5IKWD+LPW4g", + "vdQnaK1x3dozmG8YLUZw5iW7ap9DpahbAGQgdy1z1ypiNUjNuhaP8zkG1ci6X88N", + "6MIoQ+YqfowRJJTIr1lzssxsRI1syjfS6smnI4ZNE6S+6mIKN96ES2OZF+rn4xnD", + "PofR9Qh2gPq++ULriPE/cX7ZkZ0/ZDZGDfIGvricB8JEJhISZn/VMX/KScJs+rFq", + "KWN5Au6Uc2pEqeq5OP4y2k0QUmKQT9sh9OepnPmfqF8hG6wI8nM67jT/FEOcpr0v", + "qoN2NRXrcq3iZAp07AGq9IdpYhBcEW7MFmOcNt+Zb8SbTMp6DawnREg9xzz1SIkZ", + "Cdp1XoJ6mkVvzBB4T/Esp7j1VztinTX2PpX7C1CE5LC76UfCiEjEWOmWrVuPuA5a", + "oRrJvgPJg8gpVj04r2m8nvUK1gwhxg9ZB+SK+nd3OAd0dnbJwTE=", + "=dW3g", + "-----END PGP SIGNATURE-----" + ]; + const message = "I'm a teapot"; + const signingCallback = (message) => { + return signatureLines.join("\n"); + }; + + let odb; + let oid; + let object; + + return repository.odb() + .then((odbResult) => { + odb = odbResult; + + return Tag.createWithSignature( + repository, + name, + targetOid, + signature, + message, + 1, + signingCallback + ); + }) + .then((oidResult) => { + oid = oidResult; + return odb.read(oid); + }) + .then((objectResult) => { + object = objectResult; + const lines = object.toString().split("\n"); + assert(object.type(), Obj.TYPE.TAG); + assert.equal(signatureLines.length + 7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + for (let i = 6; i < 6 + signatureLines.length; i++) { + assert.equal(lines[i], signatureLines[i - 6]); + } + assert.equal(lines[6 + signatureLines.length], ""); + + return Tag.lookup(repository, oid); + }) + .then((tag) => { + return tag.extractSignature(); + }) + .then((tagSignature) => { + assert.equal(tagSignature, signatureLines.join("\n")); + }) + .then(() => { + // overwriting is okay + return Tag.createWithSignature( + repository, + name, + targetOid, + signature, + message, + 1, + signingCallback + ); + }) + .then(() => { + // overwriting is not okay + return Tag.createWithSignature( + repository, + name, + otherTargetOid, + signature, + message, + 0, + signingCallback + ); + }) + .then(() => { + return Promise.reject( + new Error("should not be able to create the '" + name + "' tag twice") + ); + }, + () => { + return Promise.resolve(); + }); + }); + it("can create a new signed tag with Tag.annotationCreate", function() { var oid = Oid.fromString(commitPointedTo); var name = "created-signed-tag-annotationCreate"; From 0f752759ebd5660675d2f00465d18d202d9826d2 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 30 Jan 2019 23:29:42 -0700 Subject: [PATCH 043/545] Bump to v0.25.0-alpha.1 --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35d8d9e71..cc41c98f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Change Log +## v0.25.0-alpha.1 [(2019-01-30)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.24.0...v0.25.0-alpha.1) + +#### Summary of changes +- Bump Libgit2 to preview of v0.28.0 +- Add signing support for commits and annotated tags +- Updated Signature.prototype.toString to optionally include timestamps +- [BREAKING] Converted Buf.prototype.set and Buf.prototype.grow from async to sync +- Added complete support for libgit2 types: + - git_index_name_entry + - git_index_reuc_entry + - git_mailmap +- Exposed git_path_is_gitfile +- Exposed git_tag_create_frombuffer + +#### Merged PRs into NodeGit +- [adds support for gpg commit signing (fixes #1018) #1448](https://github.com/nodegit/nodegit/pull/1448) +- [Add `updateRef` parameter to Repository#createCommitWithSignature #1610](https://github.com/nodegit/nodegit/pull/1610) +- [Documentation fixes. #1611](https://github.com/nodegit/nodegit/pull/1611) +- [Add Commit#amendWithSignature #1616](https://github.com/nodegit/nodegit/pull/1616) +- [Bump libgit2 to a preview of v0.28 #1615](https://github.com/nodegit/nodegit/pull/1615) +- [Fix issues with Commit#amendWithSignature #1617](https://github.com/nodegit/nodegit/pull/1617) +- [Marked Repository.createBlobFromBuffer as async #1614](https://github.com/nodegit/nodegit/pull/1614) +- [Add functionality for creating Tags with signatures and extracting signatures from Tags #1618](https://github.com/nodegit/nodegit/pull/1618) + + ## v0.24.0 [(2019-01-16)](https://github.com/nodegit/nodegit/releases/tag/v0.24.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.23.0...v0.24.0) diff --git a/package-lock.json b/package-lock.json index 7f93cb65c..74f11e59e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.24.0", + "version": "0.25.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8fc88751b..c2ff8ba0c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.24.0", + "version": "0.25.0-alpha.1", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 8083f33c9e4659d1122cecdab19fa0b3f8625532 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Fri, 1 Feb 2019 12:40:27 -0700 Subject: [PATCH 044/545] Add a `rebaseOptions` parameter to `Repository.prototype.continueRebase` --- lib/repository.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index 77ba9d116..91422df97 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -455,13 +455,16 @@ Repository.prototype.checkoutRef = function(reference, opts) { * promise, finish() will be called when the * promise resolves. This callback will be * provided a detailed overview of the rebase + * @param {RebaseOptions} rebaseOptions Options to initialize the rebase object + * with * @return {Oid|Index} A commit id for a succesful merge or an index for a * rebase with conflicts */ Repository.prototype.continueRebase = function( signature, beforeNextFn, - beforeFinishFn + beforeFinishFn, + rebaseOptions ) { var repo = this; @@ -474,7 +477,7 @@ Repository.prototype.continueRebase = function( throw index; } - return NodeGit.Rebase.open(repo); + return NodeGit.Rebase.open(repo, rebaseOptions); }) .then(function(_rebase) { rebase = _rebase; @@ -1505,6 +1508,8 @@ Repository.prototype.isReverting = function() { * promise, finish() will be called when the * promise resolves. This callback will be * provided a detailed overview of the rebase + * @param {RebaseOptions} rebaseOptions Options to initialize the rebase object + * with * @return {Oid|Index} A commit id for a succesful merge or an index for a * rebase with conflicts */ From 74e7c1e89ab21801ca6ee13443ef813c05e04b93 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Fri, 1 Feb 2019 12:44:28 -0700 Subject: [PATCH 045/545] Only swallow EAPPLIED errors in `Repository.prototype.continueRebase` One example of a meaningful exception occurring in `continueRebase` is for the signing callback to throw because of an invalid key passphrase. In such chases, errors should not be swallowed. In #1348, EAPPLIED was mentioned specifically as en error that we would like to swallow. --- lib/repository.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/repository.js b/lib/repository.js index 91422df97..3636c9a6e 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -482,11 +482,17 @@ Repository.prototype.continueRebase = function( .then(function(_rebase) { rebase = _rebase; return rebase.commit(null, signature) - .catch(function() { + .catch(function(e) { // Ignore all errors to prevent // this routine from choking now // that we made rebase.commit // asynchronous + const errorno = fp.get(["errorno"], e); + if (errorno === NodeGit.Error.CODE.EAPPLIED) { + return; + } + + throw e; }); }) .then(function() { From 6640afad4371b3aeadee5d03cda689d5c6e2085c Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Fri, 1 Feb 2019 14:32:12 -0700 Subject: [PATCH 046/545] Bump to v0.25.0-alpha.2 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc41c98f2..d6817348b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.25.0-alpha.2 [(2019-02-01)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.1...v0.25.0-alpha.2) + +#### Summary of changes +- Added RebaseOptions to repository.prototype.rebaseContinue + +#### Merged PRs into NodeGit +- [Breaking: Repository.prototype.continueRebase enhancements #1619](https://github.com/nodegit/nodegit/pull/1619) + + ## v0.25.0-alpha.1 [(2019-01-30)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.24.0...v0.25.0-alpha.1) diff --git a/package-lock.json b/package-lock.json index 74f11e59e..a488d2837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.1", + "version": "0.25.0-alpha.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c2ff8ba0c..a169540bd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.1", + "version": "0.25.0-alpha.2", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 874e6530532edee61b699d57411bad33b7568b28 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 4 Feb 2019 17:19:55 -0700 Subject: [PATCH 047/545] Use same API for signingCb in all places that can be crypto signed Any place where we implement a callback pattern for signing commits/tags follows the same API: `type SigningCB = (content: string) => { code: number, field?: string, signedData?: string };` --- lib/commit.js | 108 +++++++---- lib/rebase.js | 25 ++- lib/repository.js | 95 +++++---- lib/tag.js | 30 ++- test/tests/commit.js | 447 +++++++++++++++++++++++++++++++++---------- test/tests/rebase.js | 361 +++++++++++++++++++++++++++++++++- test/tests/tag.js | 230 ++++++++++++++++++---- 7 files changed, 1071 insertions(+), 225 deletions(-) diff --git a/lib/commit.js b/lib/commit.js index 02b3679d5..701b944e0 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -60,8 +60,7 @@ Commit.prototype.amend = function ( * @param {String} messageEncoding * @param {String} message * @param {Tree|Oid} tree - * @param {String} signatureField - * @param {Function} onSignature + * @param {Function} onSignature Callback to be called with string to be signed * @return {Oid} */ Commit.prototype.amendWithSignature = function( @@ -71,13 +70,12 @@ Commit.prototype.amendWithSignature = function( messageEncoding, message, tree, - signatureField, onSignature ) { - var repo = this.repo; - var parentOids = this.parents(); - var _this = this; - var promises = []; + let repo = this.repo; + let parentOids = this.parents(); + let _this = this; + let promises = []; if (tree instanceof NodeGit.Oid) { promises.push(repo.getTree(tree)); @@ -89,22 +87,27 @@ Commit.prototype.amendWithSignature = function( promises.push(repo.getCommit(parentOid)); }); - var treeObject; - var parents; - var commitContent; - var commitOid; - var commit; - - var createCommitPromise = Promise.all(promises) + let treeObject; + let parents; + let commitContent; + let commit; + let skippedSigning; + let resolvedAuthor; + let resolvedCommitter; + let resolvedMessageEncoding; + let resolvedMessage; + let resolvedTree; + + let createCommitPromise = Promise.all(promises) .then(function(results) { treeObject = fp.head(results); parents = fp.tail(results); return _this.getTree(); }) .then(function(commitTreeResult) { - var commitTree = commitTreeResult; + let commitTree = commitTreeResult; - var truthyArgs = fp.omitBy( + let truthyArgs = fp.omitBy( fp.isNil, { author, @@ -115,7 +118,7 @@ Commit.prototype.amendWithSignature = function( } ); - var commitFields = { + let commitFields = { author: _this.author(), committer: _this.committer(), messageEncoding: _this.messageEncoding(), @@ -123,7 +126,7 @@ Commit.prototype.amendWithSignature = function( tree: commitTree }; - var { + ({ author: resolvedAuthor, committer: resolvedCommitter, messageEncoding: resolvedMessageEncoding, @@ -132,7 +135,7 @@ Commit.prototype.amendWithSignature = function( } = fp.assign( commitFields, truthyArgs - ); + )); return Commit.createBuffer( repo, @@ -152,30 +155,61 @@ Commit.prototype.amendWithSignature = function( } return onSignature(commitContent); }) - .then(function(signature) { - return Commit.createWithSignature( - repo, - commitContent, - signature, - signatureField - ); + .then(function({ code, field, signedData }) { + switch (code) { + case NodeGit.Error.CODE.OK: + return Commit.createWithSignature( + repo, + commitContent, + signedData, + field + ); + case NodeGit.Error.CODE.PASSTHROUGH: + skippedSigning = true; + return Commit.create( + repo, + updateRef, + resolvedAuthor, + resolvedCommitter, + resolvedMessageEncoding, + resolvedMessage, + resolvedTree, + parents.length, + parents + ); + default: { + const error = new Error( + `Commit.amendWithSignature threw with error code ${code}` + ); + error.errno = code; + throw error; + } + } }); if (!updateRef) { return createCommitPromise; } - return createCommitPromise.then(function(commitOidResult) { - commitOid = commitOidResult; - return repo.getCommit(commitOid); - }).then(function(commitResult) { - commit = commitResult; - return repo.getReference(updateRef); - }).then(function(ref) { - return ref.setTarget(commitOid, `commit (amend): ${commit.summary()}`); - }).then(function() { - return commitOid; - }); + return createCommitPromise + .then(function(commitOid) { + if (skippedSigning) { + return commitOid; + } + + return repo.getCommit(commitOid) + .then(function(commitResult) { + commit = commitResult; + return repo.getReference(updateRef); + }).then(function(ref) { + return ref.setTarget( + commitOid, + `commit (amend): ${commit.summary()}` + ); + }).then(function() { + return commitOid; + }); + }); }; /** diff --git a/lib/rebase.js b/lib/rebase.js index 0d9521760..e55f0ddde 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -9,8 +9,8 @@ var _abort = Rebase.prototype.abort; var _commit = Rebase.prototype.commit; function defaultRebaseOptions(options, checkoutStrategy) { - var checkoutOptions; - var mergeOptions; + let checkoutOptions; + let mergeOptions; if (options) { options = shallowClone(options); @@ -19,6 +19,27 @@ function defaultRebaseOptions(options, checkoutStrategy) { delete options.checkoutOptions; delete options.mergeOptions; + if (options.signingCb) { + let signingCb = options.signingCb; + options.signingCb = function ( + signatureBuf, + signatureFieldBuf, + commitContent + ) { + return Promise.resolve(signingCb(commitContent)) + .then(function({ code, field, signedData }) { + if (code === NodeGit.Error.CODE.OK) { + signatureBuf.setString(signedData); + if (field) { + signatureFieldBuf.setString(field); + } + } + + return code; + }); + }; + } + options = normalizeOptions(options, NodeGit.RebaseOptions); } else { options = normalizeOptions({}, NodeGit.RebaseOptions); diff --git a/lib/repository.js b/lib/repository.js index 3636c9a6e..ea3b7fb65 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -658,25 +658,24 @@ Repository.prototype.createCommitBuffer = function( * @param {String} message * @param {Tree|Oid|String} Tree * @param {Array} parents - * @param {String} signature_field typically "gpgsig" * @param {Function} onSignature Callback to be called with string to be signed * @return {Oid} The oid of the commit */ Repository.prototype.createCommitWithSignature = function( - updateRef, - author, - committer, - message, - tree, - parents, - signature_field, - onSignature) { + updateRef, + author, + committer, + message, + tree, + parents, + onSignature +) { var repo = this; var promises = []; - var commit_content; - var commit_oid; + var commitContent; var commit; + var skippedSigning; parents = parents || []; @@ -707,35 +706,65 @@ Repository.prototype.createCommitWithSignature = function( parents.length, parents ); - }).then(function(commit_contentResult) { - commit_content = commit_contentResult; - if (!commit_content.endsWith("\n")) { - commit_content += "\n"; + }).then(function(commitContentResult) { + commitContent = commitContentResult; + if (!commitContent.endsWith("\n")) { + commitContent += "\n"; + } + return onSignature(commitContent); + }).then(function({ code, field, signedData }) { + switch (code) { + case NodeGit.Error.CODE.OK: + return Commit.createWithSignature( + repo, + commitContent, + signedData, + field + ); + case NodeGit.Error.CODE.PASSTHROUGH: + skippedSigning = true; + return Commit.create( + repo, + updateRef, + author, + committer, + null /* use default message encoding */, + message, + tree, + parents.length, + parents + ); + default: { + const error = new Error( + "Repository.prototype.createCommitWithSignature " + + `threw with error code ${code}` + ); + error.errno = code; + throw error; + } } - return onSignature(commit_content); - }).then(function(signature) { - return Commit.createWithSignature( - repo, - commit_content, - signature, - signature_field); }); if (!updateRef) { return createCommitPromise; } - return createCommitPromise.then(function(commit_oidResult) { - commit_oid = commit_oidResult; - return repo.getCommit(commit_oid); - }).then(function(commitResult) { - commit = commitResult; - return repo.getReference(updateRef); - }).then(function(ref) { - return ref.setTarget(commit_oid, getReflogMessageForCommit(commit)); - }).then(function() { - return commit_oid; - }); + return createCommitPromise + .then(function(commitOid) { + if (skippedSigning) { + return commitOid; + } + + return repo.getCommit(commitOid) + .then(function(commitResult) { + commit = commitResult; + return repo.getReference(updateRef); + }).then(function(ref) { + return ref.setTarget(commitOid, getReflogMessageForCommit(commit)); + }).then(function() { + return commitOid; + }); + }); }; /** diff --git a/lib/tag.js b/lib/tag.js index b94872160..a1183bc85 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -76,10 +76,30 @@ Tag.createWithSignature = function( tagBuffer = tagBufferResult; return signingCallback(tagBuffer); }) - .then((tagSignature) => { - const normalizedEnding = tagSignature.endsWith("\n") ? "" : "\n"; - const signedTagString = tagBuffer + tagSignature + normalizedEnding; - return Tag.createFromBuffer(repo, signedTagString, force); + .then(({ code, signedData }) => { + switch (code) { + case NodeGit.Error.CODE.OK: { + const normalizedEnding = signedData.endsWith("\n") ? "" : "\n"; + const signedTagString = tagBuffer + signedData + normalizedEnding; + return Tag.createFromBuffer(repo, signedTagString, force); + } + case NodeGit.Error.CODE.PASSTHROUGH: + return Tag.create( + repo, + tagName, + target, + tagger, + message, + force + ); + default: { + const error = new Error( + `Tag.createWithSignature threw with error code ${code}` + ); + error.errno = code; + throw error; + } + } }); }; @@ -110,6 +130,6 @@ Tag.prototype.extractSignature = function(signatureType = "gpgsig") { } } - return null; + throw new Error("this tag is not signed"); }); }; diff --git a/test/tests/commit.js b/test/tests/commit.js index 522017bc7..6f212d6a4 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -450,45 +450,45 @@ describe("Commit", function() { }); }); - - it("can amend commit with signature", function() { - const signature = "-----BEGIN PGP SIGNATURE-----\n" + - "\n" + - "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + - "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + - "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + - "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + - "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + - "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + - "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + - "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + - "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + - "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + - "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + - "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + - "ekgUBx+BX6nJOw==\n" + - "=4Hy5\n" + - "-----END PGP SIGNATURE-----"; - - function onSignature(dataToSign) { - return new Promise(function (resolve) { - return resolve(signature); + describe("amendWithSignature", function() { + it("can amend with signature", function() { + const signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + + "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + + "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + + "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + + "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + + "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + + "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + + "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + + "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + + "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + + "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + + "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + + "ekgUBx+BX6nJOw==\n" + + "=4Hy5\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData }); - } - var repo; - var oid; - var commit; - var message; - var parents; + var repo; + var oid; + var commit; + var message; + var parents; - return NodeGit.Repository.open(reposPath) + return NodeGit.Repository.open(reposPath) .then(function(repoResult) { repo = repoResult; return repo.getHeadCommit(); }) .then(function(headCommit) { - message = headCommit.message(); + message = headCommit.message() + "\n"; parents = headCommit.parents(); return headCommit.amendWithSignature( @@ -498,7 +498,6 @@ describe("Commit", function() { null, null, null, - "gpgsig", onSignature ); }) @@ -511,65 +510,65 @@ describe("Commit", function() { return commit.getSignature("gpgsig"); }) .then(function(signatureInfo) { - assert.equal(signatureInfo.signature, signature); + assert.equal(signatureInfo.signature, signedData); assert.equal(commit.message(), message); assert.deepEqual(commit.parents(), parents); }); - }); + }); - it("amending with signature respects overridden arguments", function() { - const signature = "-----BEGIN PGP SIGNATURE-----\n" + - "\n" + - "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + - "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + - "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + - "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + - "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + - "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + - "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + - "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + - "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + - "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + - "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + - "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + - "ekgUBx+BX6nJOw==\n" + - "=4Hy5\n" + - "-----END PGP SIGNATURE-----"; - - function onSignature(dataToSign) { - return new Promise(function (resolve) { - return resolve(signature); + it("will respects overridden arguments", function() { + const signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQJHBAEBCAAxFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxPKUYTHHN0ZXZla0Bh\n" + + "eG9zb2Z0LmNvbQAKCRBRGMkp5058Q3vcD/0Uf6P68g98Kbvsgjg/aidM1ujruXaw\n" + + "X5WSsCAw+wWGICOj0n+KBnmQruI4HSFz3zykEshuOpcBv1X/+huwDeB/hBqonCU8\n" + + "QdexCdWR70YbT1bufesUwV9v1qwE4WOmFxWXgwh55K0wDRkc0u2aLcwrJkIEEVfs\n" + + "HqZyFzU4kwbGekY/m7d1DsBhWyKEGW9/25WMYmjWOWOiaFjeBaHLlxiEM8KGnMLH\n" + + "wx37NuFuaABgi23AAcBGdeWy04TEuU4S51+bHM3RotrZ2cryW2lEbkkXodhIJcq0\n" + + "RgrStCbvR0ehnOPdYSiRbxK8JNLZuNjHlK2g7wVi+C83vwMQuhU4H6OlYHGVr664\n" + + "4YzL83FdIo7wiMOFd2OOMLlCfHgTun60FvjCs4WHjrwH1fQl287FRPLa/4olBSQP\n" + + "yUXJaZdxm4cB4L/1pmbb/J/XUiOio3MpaN3GFm2hZloUlag1uPDBtCxTl5odvj4a\n" + + "GOmTBWznXxF/zrKnQVSvv+EccNxYFc0VVjAxGgNqPzIxDAKtw1lE5pbBkFpFpNHz\n" + + "StmwZkP9QIJY4hJYQfM+pzHLe8xjexL+Kh/TrYXgY1m/4vJe0HJSsnRnaR8Yfqhh\n" + + "LReqo94VHRYXR0rZQv4py0D9TrWaI8xHLve6ewhLPNRzyaI9fNrinbcPYZZOWnRi\n" + + "ekgUBx+BX6nJOw==\n" + + "=4Hy5\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData }); - } - var repo; - var oid; - var commit; - var message; - var parents; - var commitTree; - - var author = NodeGit.Signature.create( - "Scooby Doo", - "scoob@mystery.com", - 123456789, - 60 - ); - var committer = NodeGit.Signature.create( - "Shaggy Rogers", - "shaggy@mystery.com", - 987654321, - 90 - ); - var tree = Oid.fromString("f4661419a6fbbe865f78644fec722c023ce4b65f"); + var repo; + var oid; + var commit; + var message; + var parents; + var commitTree; + + var author = NodeGit.Signature.create( + "Scooby Doo", + "scoob@mystery.com", + 123456789, + 60 + ); + var committer = NodeGit.Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + var tree = Oid.fromString("f4661419a6fbbe865f78644fec722c023ce4b65f"); - return NodeGit.Repository.open(reposPath) + return NodeGit.Repository.open(reposPath) .then(function(repoResult) { repo = repoResult; return repo.getHeadCommit(); }) .then(function(headCommit) { - message = headCommit.message(); + message = headCommit.message() + "\n"; parents = headCommit.parents(); return headCommit.amendWithSignature( @@ -579,7 +578,6 @@ describe("Commit", function() { null, null, tree, - "gpgsig", onSignature ); }) @@ -596,13 +594,96 @@ describe("Commit", function() { return commit.getSignature("gpgsig"); }) .then(function(signatureInfo) { - assert.equal(signatureInfo.signature, signature); + assert.equal(signatureInfo.signature, signedData); assert.equal(commit.message(), message); assert.deepEqual(commit.parents(), parents); assert.deepEqual(commitTree.id(), tree); assert.deepEqual(commit.author(), author); assert.deepEqual(commit.committer(), committer); }); + }); + + it("can optionally skip signing process", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }); + + var repo; + var oid; + var commit; + var message; + var parents; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + message = headCommit.message(); + parents = headCommit.parents(); + + return headCommit.amendWithSignature( + null, + null, + null, + null, + null, + null, + onSignature + ); + }) + .then(function(oidResult) { + oid = oidResult; + return NodeGit.Commit.lookup(repo, oid); + }) + .then(function(commitResult) { + commit = commitResult; + return commit.getSignature("gpgsig") + .then(function() { + assert.fail("Should not have a signature"); + }, function(error) { + if (error && error.message === "this commit is not signed") { + return; + } + throw error; + }); + }) + .then(function(signatureInfo) { + assert.equal(commit.message(), message); + assert.deepEqual(commit.parents(), parents); + }); + }); + + it("will throw if signing callback returns an error code", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + return NodeGit.Repository.open(reposPath) + .then(function(repo) { + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + return headCommit.amendWithSignature( + null, + null, + null, + null, + null, + null, + onSignature + ); + }) + .then(function() { + assert.fail("amendWithSignature should have failed."); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); }); it("has an owner", function() { @@ -946,10 +1027,8 @@ describe("Commit", function() { }); describe("Commit's Signature", function() { - it("Can create a signed commit in a repo", function() { - - var signature = "-----BEGIN PGP SIGNATURE-----\n" + + var signedData = "-----BEGIN PGP SIGNATURE-----\n" + "Version: GnuPG v1.4.12 (Darwin)\n" + "\n" + "iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n" + @@ -967,11 +1046,11 @@ describe("Commit", function() { "=ozeK\n" + "-----END PGP SIGNATURE-----"; - function onSignature(dataToSign) { - return new Promise(function (resolve) { - return resolve(signature); - }); - } + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); var test = this; var expectedCommitId = "ccb99bb20716ef7c37e92c7b8db029a7af7f747b"; @@ -1028,8 +1107,8 @@ describe("Commit", function() { "message", treeOid, [parent], - "gpgsig", - onSignature); + onSignature + ); }) .then(function(commitId) { assert.equal(expectedCommitId, commitId); @@ -1039,7 +1118,7 @@ describe("Commit", function() { return commit.getSignature("gpgsig"); }) .then(function(signatureInfo) { - assert.equal(signature, signatureInfo.signature); + assert.equal(signedData, signatureInfo.signature); return reinitialize(test); }, function(reason) { return reinitialize(test) @@ -1050,8 +1129,7 @@ describe("Commit", function() { }); it("Can create a signed commit in a repo and update refs", function() { - - var signature = "-----BEGIN PGP SIGNATURE-----\n" + + var signedData = "-----BEGIN PGP SIGNATURE-----\n" + "Version: GnuPG v1.4.12 (Darwin)\n" + "\n" + "iQIcBAABAgAGBQJQ+FMIAAoJEH+LfPdZDSs1e3EQAJMjhqjWF+WkGLHju7pTw2al\n" + @@ -1069,11 +1147,11 @@ describe("Commit", function() { "=ozeK\n" + "-----END PGP SIGNATURE-----"; - function onSignature(dataToSign) { - return new Promise(function (resolve) { - return resolve(signature); - }); - } + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); var test = this; var expectedCommitId = "ccb99bb20716ef7c37e92c7b8db029a7af7f747b"; @@ -1130,7 +1208,6 @@ describe("Commit", function() { "message", treeOid, [parent], - "gpgsig", onSignature); }) .then(function(commitId) { @@ -1141,7 +1218,7 @@ describe("Commit", function() { return commit.getSignature("gpgsig"); }) .then(function(signatureInfo) { - assert.equal(signature, signatureInfo.signature); + assert.equal(signedData, signatureInfo.signature); return repo.getHeadCommit(); }) .then(function(headCommit) { @@ -1244,5 +1321,173 @@ describe("Commit", function() { ); }); }); + + it("Can be optionally skipped to create without signature", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }); + + var test = this; + var expectedCommitId = "c9bffe040519231d32431c101bca4efc0917f64c"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + null, + author, + committer, + "message", + treeOid, + [parent], + onSignature + ); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig") + .then(function() { + assert.fail("Should not have been able to retrieve gpgsig"); + }, function(error) { + if (error && error.message === "this commit is not signed") { + return; + } + throw error; + }); + }) + .then(function() { + return reinitialize(test); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); + + it("Will throw if the signing cb returns an error code", function() { + const onSignature = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + var test = this; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + var parent; + + return NodeGit.Repository.open(reposPath) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return NodeGit.Reference.nameToId(repo, "HEAD"); + }) + .then(function(head) { + return repo.getCommit(head); + }) + .then(function(parentResult) { + parent = parentResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + null, + author, + committer, + "message", + treeOid, + [parent], + onSignature + ); + }) + .then(function() { + assert.fail("createCommitWithSignature should have failed."); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }) + .then(function() { + return reinitialize(test); + }, function(reason) { + return reinitialize(test) + .then(function() { + return Promise.reject(reason); + }); + }); + }); }); }); diff --git a/test/tests/rebase.js b/test/tests/rebase.js index f852a8651..839b50582 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -1661,11 +1661,11 @@ describe("Rebase", function() { return NodeGit.Rebase.init(repository, ourAnnotatedCommit, theirAnnotatedCommit, null, { - signingCb: (signatureBuf, signatureFieldBuf, commitContent) => { - signatureBuf.setString("A moose was here."); - signatureFieldBuf.setString("moose-sig"); - return 0; - } + signingCb: (commitContent) => ({ + code: NodeGit.Error.CODE.OK, + field: "moose-sig", + signedData: "A moose was here." + }) }); }) .then(function(newRebase) { @@ -1725,4 +1725,355 @@ describe("Rebase", function() { assert.equal(signature, "A moose was here."); }); }); + + it("can optionally skip signing commits", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }) + }); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); + + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); + + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); + + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); + + return commit.parent(0); + }) + .then(function(parent) { + // verify that we are on top of "their commit" + assert.equal(parent.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + return NodeGit.Commit.extractSignature( + repository, + "b937100ee0ea17ef20525306763505a7fe2be29e", + "moose-sig" + ) + .then(function() { + assert.fail("This commit should not be signed."); + }, function (error) { + if (error && error.message === "this commit is not signed") { + return; + } + throw error; + }); + }); + }); + + it("will throw if commit signing cb returns an error code", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: () => ({ + code: NodeGit.Error.CODE.ERROR + }) + }); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + + return rebase.commit(null, ourSignature); + }) + .then(function() { + assert.fail("rebase.commit should have failed"); + }, function(error) { + if (error && error.errno === -1) { + return; + } + throw error; + }); + }); }); diff --git a/test/tests/tag.js b/test/tests/tag.js index c43a618a1..51268b40a 100644 --- a/test/tests/tag.js +++ b/test/tests/tag.js @@ -314,44 +314,150 @@ describe("Tag", function() { }); }); - it("can create a tag with a signature and extract the signature", function() { - const targetOid = Oid.fromString(commitPointedTo); - const otherTargetOid = Oid.fromString(commitPointedTo2); - const name = "created-signed-tag-annotationCreate"; - const repository = this.repository; - const signature = Signature.create( - "Shaggy Rogers", - "shaggy@mystery.com", - 987654321, - 90 + describe("createWithSignature and extractSignature", function() { + it( + "can create a tag with a signature and extract the signature", + function() { + const targetOid = Oid.fromString(commitPointedTo); + const otherTargetOid = Oid.fromString(commitPointedTo2); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const signatureLines = [ + "-----BEGIN PGP SIGNATURE-----", + "iQIzBAABCAAdFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxR4JUACgkQURjJKedO", + "fEN+8A//cXmkRmhzQMdTEdrxty7tVKQ7lVhL7r7e+cB84hO7WrDn8549c7/Puflu", + "idanWfyoAEMSNWDgY84lx/t3I3YYKXsLDPT93HiMhCXmPVZcfLxlARRL1rrNZV4q", + "L9hhqb9bFrRNBn6YebhygeLXLHlDKEZzx8W9jnDLU8Px8UTkwdQIDnPDfT7UOPPU", + "MYDgP3OwWwoG8dUlZXaHjtFz29wPlJo177MwdLYwn4zpEIysoY1ev5IKWD+LPW4g", + "vdQnaK1x3dozmG8YLUZw5iW7ap9DpahbAGQgdy1z1ypiNUjNuhaP8zkG1ci6X88N", + "6MIoQ+YqfowRJJTIr1lzssxsRI1syjfS6smnI4ZNE6S+6mIKN96ES2OZF+rn4xnD", + "PofR9Qh2gPq++ULriPE/cX7ZkZ0/ZDZGDfIGvricB8JEJhISZn/VMX/KScJs+rFq", + "KWN5Au6Uc2pEqeq5OP4y2k0QUmKQT9sh9OepnPmfqF8hG6wI8nM67jT/FEOcpr0v", + "qoN2NRXrcq3iZAp07AGq9IdpYhBcEW7MFmOcNt+Zb8SbTMp6DawnREg9xzz1SIkZ", + "Cdp1XoJ6mkVvzBB4T/Esp7j1VztinTX2PpX7C1CE5LC76UfCiEjEWOmWrVuPuA5a", + "oRrJvgPJg8gpVj04r2m8nvUK1gwhxg9ZB+SK+nd3OAd0dnbJwTE=", + "=dW3g", + "-----END PGP SIGNATURE-----" + ]; + const message = "I'm a teapot"; + const signingCallback = (message) => ({ + code: NodeGit.Error.CODE.OK, + signedData: signatureLines.join("\n") + }); + + let odb; + let oid; + let object; + + return repository.odb() + .then((odbResult) => { + odb = odbResult; + + return Tag.createWithSignature( + repository, + name, + targetOid, + signature, + message, + 1, + signingCallback + ); + }) + .then((oidResult) => { + oid = oidResult; + return odb.read(oid); + }) + .then((objectResult) => { + object = objectResult; + const lines = object.toString().split("\n"); + assert(object.type(), Obj.TYPE.TAG); + assert.equal(signatureLines.length + 7, lines.length); + assert.equal(lines[0], `object ${commitPointedTo}`); + assert.equal(lines[1], "type commit"); + assert.equal(lines[2], `tag ${name}`); + assert.equal( + lines[3], + "tagger Shaggy Rogers 987654321 +0130" + ); + assert.equal(lines[4], ""); + assert.equal(lines[5], message); + for (let i = 6; i < 6 + signatureLines.length; i++) { + assert.equal(lines[i], signatureLines[i - 6]); + } + assert.equal(lines[6 + signatureLines.length], ""); + + return Tag.lookup(repository, oid); + }) + .then((tag) => { + return tag.extractSignature(); + }) + .then((tagSignature) => { + assert.equal(tagSignature, signatureLines.join("\n")); + }) + .then(() => { + // overwriting is okay + return Tag.createWithSignature( + repository, + name, + targetOid, + signature, + message, + 1, + signingCallback + ); + }) + .then(() => { + // overwriting is not okay + return Tag.createWithSignature( + repository, + name, + otherTargetOid, + signature, + message, + 0, + signingCallback + ); + }) + .then(() => { + return Promise.reject( + new Error( + "should not be able to create the '" + name + "' tag twice" + ) + ); + }, + () => { + return Promise.resolve(); + }); + } ); - const signatureLines = [ - "-----BEGIN PGP SIGNATURE-----", - "iQIzBAABCAAdFiEEKdxGpJ93wnkLaBKfURjJKedOfEMFAlxR4JUACgkQURjJKedO", - "fEN+8A//cXmkRmhzQMdTEdrxty7tVKQ7lVhL7r7e+cB84hO7WrDn8549c7/Puflu", - "idanWfyoAEMSNWDgY84lx/t3I3YYKXsLDPT93HiMhCXmPVZcfLxlARRL1rrNZV4q", - "L9hhqb9bFrRNBn6YebhygeLXLHlDKEZzx8W9jnDLU8Px8UTkwdQIDnPDfT7UOPPU", - "MYDgP3OwWwoG8dUlZXaHjtFz29wPlJo177MwdLYwn4zpEIysoY1ev5IKWD+LPW4g", - "vdQnaK1x3dozmG8YLUZw5iW7ap9DpahbAGQgdy1z1ypiNUjNuhaP8zkG1ci6X88N", - "6MIoQ+YqfowRJJTIr1lzssxsRI1syjfS6smnI4ZNE6S+6mIKN96ES2OZF+rn4xnD", - "PofR9Qh2gPq++ULriPE/cX7ZkZ0/ZDZGDfIGvricB8JEJhISZn/VMX/KScJs+rFq", - "KWN5Au6Uc2pEqeq5OP4y2k0QUmKQT9sh9OepnPmfqF8hG6wI8nM67jT/FEOcpr0v", - "qoN2NRXrcq3iZAp07AGq9IdpYhBcEW7MFmOcNt+Zb8SbTMp6DawnREg9xzz1SIkZ", - "Cdp1XoJ6mkVvzBB4T/Esp7j1VztinTX2PpX7C1CE5LC76UfCiEjEWOmWrVuPuA5a", - "oRrJvgPJg8gpVj04r2m8nvUK1gwhxg9ZB+SK+nd3OAd0dnbJwTE=", - "=dW3g", - "-----END PGP SIGNATURE-----" - ]; - const message = "I'm a teapot"; - const signingCallback = (message) => { - return signatureLines.join("\n"); - }; - let odb; - let oid; - let object; + it("can optionally skip the signing process", function() { + const targetOid = Oid.fromString(commitPointedTo); + const otherTargetOid = Oid.fromString(commitPointedTo2); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + const signingCallback = () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }); - return repository.odb() + let odb; + let oid; + let object; + + return repository.odb() .then((odbResult) => { odb = odbResult; @@ -373,7 +479,7 @@ describe("Tag", function() { object = objectResult; const lines = object.toString().split("\n"); assert(object.type(), Obj.TYPE.TAG); - assert.equal(signatureLines.length + 7, lines.length); + assert.equal(7, lines.length); assert.equal(lines[0], `object ${commitPointedTo}`); assert.equal(lines[1], "type commit"); assert.equal(lines[2], `tag ${name}`); @@ -383,18 +489,21 @@ describe("Tag", function() { ); assert.equal(lines[4], ""); assert.equal(lines[5], message); - for (let i = 6; i < 6 + signatureLines.length; i++) { - assert.equal(lines[i], signatureLines[i - 6]); - } - assert.equal(lines[6 + signatureLines.length], ""); + assert.equal(lines[6], ""); return Tag.lookup(repository, oid); }) .then((tag) => { return tag.extractSignature(); }) - .then((tagSignature) => { - assert.equal(tagSignature, signatureLines.join("\n")); + .then(function() { + assert.fail("Tag should not have been signed."); + }, function(error) { + if (error && error.message === "this tag is not signed") { + return; + } + + throw error; }) .then(() => { // overwriting is okay @@ -428,8 +537,45 @@ describe("Tag", function() { () => { return Promise.resolve(); }); + }); + + it("will throw if signing callback returns an error code", function() { + const targetOid = Oid.fromString(commitPointedTo); + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + const signingCallback = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + + return Tag.createWithSignature( + repository, + name, + targetOid, + signature, + message, + 1, + signingCallback + ) + .then(function() { + assert.fail("Should not have been able to create tag"); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); }); + it("can create a new signed tag with Tag.annotationCreate", function() { var oid = Oid.fromString(commitPointedTo); var name = "created-signed-tag-annotationCreate"; From 4ee0ca9c7c5ca68a6e8893db3f6289354e64d5bd Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 5 Feb 2019 12:53:56 -0700 Subject: [PATCH 048/545] Use enum here for consistency in test --- test/tests/rebase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests/rebase.js b/test/tests/rebase.js index 839b50582..610721185 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -2070,7 +2070,7 @@ describe("Rebase", function() { .then(function() { assert.fail("rebase.commit should have failed"); }, function(error) { - if (error && error.errno === -1) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { return; } throw error; From 7c11a126d91ee98d572cf1285b9ff220a1a427b1 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 5 Feb 2019 13:53:51 -0700 Subject: [PATCH 049/545] Bump to v0.25.0-alpha.3 --- CHANGELOG.md | 16 ++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6817348b..9027a79dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Change Log +## v0.25.0-alpha.3 [(2019-02-05)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.2...v0.25.0-alpha.3) + +#### Summary of changes +- Enforced consistent use of signing callbacks within the application. Any object that implements the signingCallback + pattern for signing commits or tags should use the exact same callback type and with the same meaning. + `type SigningCallback = (content: string) => {| code: number, field?: string, signedData?: string |};` + If the code is `NodeGit.Error.CODE.OK` or 0, the operation will succeed and _at least_ signedData is expected to be filled out. + If the code is a negative number, except for `NodeGit.Error.CODE.PASSTHROUGH`, the signing operation will fail. + If the code is `NodeGit.Error.CODE.PASSTHROUGH`, the operation will continue without signing the object. + +#### Merged PRs into NodeGit +- [Use same API for signingCb in all places that can be crypto signed #1621](https://github.com/nodegit/nodegit/pull/1621) + + ## v0.25.0-alpha.2 [(2019-02-01)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.2) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.1...v0.25.0-alpha.2) diff --git a/package-lock.json b/package-lock.json index a488d2837..9576fb389 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.2", + "version": "0.25.0-alpha.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a169540bd..f5aef99c2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.2", + "version": "0.25.0-alpha.3", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 0438567022d8fd4299bfc13111b7e1d82e508c55 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Thu, 7 Feb 2019 14:40:39 -0700 Subject: [PATCH 050/545] =?UTF-8?q?Make=20`Signature.default`async=20?= =?UTF-8?q?=F0=9F=99=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generate/input/descriptor.json | 20 ++- generate/templates/partials/sync_function.cc | 12 +- lib/repository.js | 134 ++++++++------ test/tests/checkout.js | 39 ++-- test/tests/repository.js | 34 ++-- test/tests/signature.js | 20 ++- test/tests/stash.js | 176 ++++++++++--------- test/tests/tag.js | 16 +- 8 files changed, 261 insertions(+), 190 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index de5eebf74..e218348ff 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2269,13 +2269,14 @@ "ignore": true }, "git_oid_fromstr": { - "isAsync": false + "ignore": true }, "git_oid_fromstrn": { "ignore": true }, "git_oid_fromstrp": { - "ignore": true + "isAsync": false, + "jsFunctionName": "fromString" }, "git_oid_nfmt": { "ignore": true @@ -3251,7 +3252,10 @@ "dupFunction": "git_signature_dup", "functions": { "git_signature_default": { - "isAsync": false + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_signature_dup": { "ignore": true @@ -3263,7 +3267,15 @@ "isAsync": false }, "git_signature_now": { - "isAsync": false + "isAsync": false, + "args": { + "sig_out": { + "isReturn": true + } + }, + "return": { + "isErrorCode": true + } } } }, diff --git a/generate/templates/partials/sync_function.cc b/generate/templates/partials/sync_function.cc index 3bda175b6..89bb2e2dc 100644 --- a/generate/templates/partials/sync_function.cc +++ b/generate/templates/partials/sync_function.cc @@ -50,7 +50,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endeach%} ); - {%if .|hasReturnValue %} {{ return.cType }} result = {%endif%} + {%if .|hasReturnType %} {{ return.cType }} result = {%endif%} {{ cFunctionName }}( {%each args|argsInfo as arg %} {%if arg.isReturn %} @@ -67,15 +67,15 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endeach%} ); - {%if .|hasReturnValue |and return.isErrorCode %} + {%if .|hasReturnType |and return.isErrorCode %} if (result != GIT_OK) { {%each args|argsInfo as arg %} - {%if arg.shouldAlloc %} - free({{ arg.name }}); - {%elsif arg | isOid %} + {%if arg | isOid %} if (info[{{ arg.jsArg }}]->IsString()) { - free({{ arg.name }}); + free((void *)from_{{ arg.name }}); } + {%elsif arg.shouldAlloc %} + free({{ arg.name }}); {%endif%} {%endeach%} diff --git a/lib/repository.js b/lib/repository.js index ea3b7fb65..48d808ec8 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -466,23 +466,32 @@ Repository.prototype.continueRebase = function( beforeFinishFn, rebaseOptions ) { - var repo = this; + const repo = this; - signature = signature || repo.defaultSignature(); + let rebase; + let promiseChain = Promise.resolve(); - var rebase; - return repo.refreshIndex() - .then(function(index) { + if (!signature) { + promiseChain = promiseChain + .then(() => repo.defaultSignature()) + .then((signatureResult) => { + signature = signatureResult; + }); + } + + return promiseChain + .then(() => repo.refreshIndex()) + .then((index) => { if (index.hasConflicts()) { throw index; } return NodeGit.Rebase.open(repo, rebaseOptions); }) - .then(function(_rebase) { + .then((_rebase) => { rebase = _rebase; return rebase.commit(null, signature) - .catch(function(e) { + .catch((e) => { // Ignore all errors to prevent // this routine from choking now // that we made rebase.commit @@ -495,7 +504,7 @@ Repository.prototype.continueRebase = function( throw e; }); }) - .then(function() { + .then(() => { return performRebase( repo, rebase, @@ -504,7 +513,7 @@ Repository.prototype.continueRebase = function( beforeFinishFn ); }) - .then(function(error) { + .then((error) => { if (error) { throw error; } @@ -866,15 +875,19 @@ Repository.prototype.createRevWalk = function() { * @return {Tag} */ Repository.prototype.createTag = function(oid, name, message, callback) { - var repository = this; - var signature = repository.defaultSignature(); + const repository = this; + let signature = null; - return Commit.lookup(repository, oid) - .then(function(commit) { + return repository.defaultSignature() + .then((signatureResult) => { + signature = signatureResult; + return Commit.lookup(repository, oid); + }) + .then((commit) => { // Final argument is `force` which overwrites any previous tag return Tag.create(repository, name, commit, signature, message, 0); }) - .then(function(tagOid) { + .then((tagOid) => { return repository.getTag(tagOid, callback); }); }; @@ -884,13 +897,16 @@ Repository.prototype.createTag = function(oid, name, message, callback) { * @return {Signature} */ Repository.prototype.defaultSignature = function() { - var result = NodeGit.Signature.default(this); - - if (!result || !result.name()) { - result = NodeGit.Signature.now("unknown", "unknown@example.com"); - } - - return result; + return NodeGit.Signature.default(this) + .then((result) => { + if (!result || !result.name()) { + result = NodeGit.Signature.now("unknown", "unknown@example.com"); + } + return result; + }) + .catch(() => { + return NodeGit.Signature.now("unknown", "unknown@example.com"); + }); }; /** @@ -1558,12 +1574,21 @@ Repository.prototype.rebaseBranches = function( rebaseOptions ) { - var repo = this; - var branchCommit; - var upstreamCommit; - var ontoCommit; - var mergeOptions = (rebaseOptions || {}).mergeOptions; - signature = signature || repo.defaultSignature(); + const repo = this; + let branchCommit; + let upstreamCommit; + let ontoCommit; + let mergeOptions = (rebaseOptions || {}).mergeOptions; + + let promiseChain = Promise.resolve(); + + if (!signature) { + promiseChain = promiseChain + .then(() => repo.defaultSignature()) + .then((signatureResult) => { + signature = signatureResult; + }); + } return Promise.all([ repo.getReference(branch), @@ -1667,21 +1692,30 @@ Repository.prototype.mergeBranches = function( mergeOptions, processMergeMessageCallback ) { - var repo = this; - var fromBranch; - var toBranch; + const repo = this; + let fromBranch; + let toBranch; processMergeMessageCallback = processMergeMessageCallback || function (message) { return message; }; mergePreference = mergePreference || NodeGit.Merge.PREFERENCE.NONE; mergeOptions = normalizeOptions(mergeOptions, NodeGit.MergeOptions); - signature = signature || repo.defaultSignature(); + let promiseChain = Promise.resolve(); - return Promise.all([ - repo.getBranch(to), - repo.getBranch(from) - ]).then(function(objects) { + if (!signature) { + promiseChain = promiseChain + .then(() => repo.defaultSignature()) + .then((signatureResult) => { + signature = signatureResult; + }); + } + + return promiseChain.then(() => Promise.all([ + repo.getBranch(to), + repo.getBranch(from) + ])) + .then((objects) => { toBranch = objects[0]; fromBranch = objects[1]; @@ -1690,12 +1724,12 @@ Repository.prototype.mergeBranches = function( repo.getBranchCommit(fromBranch) ]); }) - .then(function(branchCommits) { + .then((branchCommits) => { var toCommitOid = branchCommits[0].toString(); var fromCommitOid = branchCommits[1].toString(); return NodeGit.Merge.base(repo, toCommitOid, fromCommitOid) - .then(function(baseCommit) { + .then((baseCommit) => { if (baseCommit.toString() == fromCommitOid) { // The commit we're merging to is already in our history. // nothing to do so just return the commit the branch is on @@ -1711,7 +1745,7 @@ Repository.prototype.mergeBranches = function( fromBranch.shorthand(); return branchCommits[1].getTree() - .then(function(tree) { + .then((tree) => { if (toBranch.isHead()) { // Checkout the tree if we're on the branch var opts = { @@ -1721,11 +1755,11 @@ Repository.prototype.mergeBranches = function( return NodeGit.Checkout.tree(repo, tree, opts); } }) - .then(function() { + .then(() => { return toBranch.setTarget( fromCommitOid, message) - .then(function() { + .then(() => { return fromCommitOid; }); }); @@ -1734,10 +1768,10 @@ Repository.prototype.mergeBranches = function( var updateHead; // We have to merge. Lets do it! return NodeGit.Reference.lookup(repo, "HEAD") - .then(function(headRef) { + .then((headRef) => { return headRef.resolve(); }) - .then(function(headRef) { + .then((headRef) => { updateHead = !!headRef && (headRef.name() === toBranch.name()); return NodeGit.Merge.commits( repo, @@ -1746,7 +1780,7 @@ Repository.prototype.mergeBranches = function( mergeOptions ); }) - .then(function(index) { + .then((index) => { // if we have conflicts then throw the index if (index.hasConflicts()) { throw index; @@ -1755,7 +1789,7 @@ Repository.prototype.mergeBranches = function( // No conflicts so just go ahead with the merge return index.writeTreeTo(repo); }) - .then(function(oid) { + .then((oid) => { var mergeDecorator; if (fromBranch.isTag()) { mergeDecorator = "tag"; @@ -1779,7 +1813,7 @@ Repository.prototype.mergeBranches = function( return Promise.all([oid, processMergeMessageCallback(message)]); }) - .then(function([oid, message]) { + .then(([oid, message]) => { return repo.createCommit( toBranch.name(), signature, @@ -1789,25 +1823,25 @@ Repository.prototype.mergeBranches = function( [toCommitOid, fromCommitOid] ); }) - .then(function(commit) { + .then((commit) => { // we've updated the checked out branch, so make sure we update // head so that our index isn't messed up if (updateHead) { return repo.getBranch(to) - .then(function(branch) { + .then((branch) => { return repo.getBranchCommit(branch); }) - .then(function(branchCommit) { + .then((branchCommit) => { return branchCommit.getTree(); }) - .then(function(tree) { + .then((tree) => { var opts = { checkoutStrategy: NodeGit.Checkout.STRATEGY.SAFE | NodeGit.Checkout.STRATEGY.RECREATE_MISSING }; return NodeGit.Checkout.tree(repo, tree, opts); }) - .then(function() { + .then(() => { return commit; }); } diff --git a/test/tests/checkout.js b/test/tests/checkout.js index e3815a35f..e821016da 100644 --- a/test/tests/checkout.js +++ b/test/tests/checkout.js @@ -109,60 +109,63 @@ describe("Checkout", function() { }); it("can checkout an index with conflicts", function() { - var test = this; + const test = this; - var testBranchName = "test"; - var ourCommit; + const testBranchName = "test"; + let ourCommit; + let signature; - return test.repository.getBranchCommit(checkoutBranchName) - .then(function(commit) { + return test.repository.defaultSignature() + .then((signatureResult) => { + signature = signatureResult; + return test.repository.getBranchCommit(checkoutBranchName); + }) + .then((commit) => { ourCommit = commit; return test.repository.createBranch(testBranchName, commit.id()); }) - .then(function() { + .then(() => { return test.repository.checkoutBranch(testBranchName); }) - .then(function(branch) { + .then((branch) => { fse.writeFileSync(packageJsonPath, "\n"); return test.repository.refreshIndex() - .then(function(index) { + .then((index) => { return index.addByPath(packageJsonName) - .then(function() { + .then(() => { return index.write(); }) - .then(function() { + .then(() => { return index.writeTree(); }); }); }) - .then(function(oid) { + .then((oid) => { assert.equal(oid.toString(), "85135ab398976a4d5be6a8704297a45f2b1e7ab2"); - var signature = test.repository.defaultSignature(); - return test.repository.createCommit("refs/heads/" + testBranchName, signature, signature, "we made breaking changes", oid, [ourCommit]); }) - .then(function(commit) { + .then((commit) => { return Promise.all([ test.repository.getBranchCommit(testBranchName), test.repository.getBranchCommit("master") ]); }) - .then(function(commits) { + .then((commits) => { return NodeGit.Merge.commits(test.repository, commits[0], commits[1], null); }) - .then(function(index) { + .then((index) => { assert.ok(index); assert.ok(index.hasConflicts && index.hasConflicts()); return NodeGit.Checkout.index(test.repository, index); }) - .then(function() { + .then(() => { // Verify that the conflict has been written to disk var conflictedContent = fse.readFileSync(packageJsonPath, "utf-8"); @@ -178,7 +181,7 @@ describe("Checkout", function() { return Checkout.head(test.repository, opts); }) - .then(function() { + .then(() => { var finalContent = fse.readFileSync(packageJsonPath, "utf-8"); assert.equal(finalContent, "\n"); }); diff --git a/test/tests/repository.js b/test/tests/repository.js index 9427a8f9c..3cce77889 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -120,9 +120,10 @@ describe("Repository", function() { }); it("can get the default signature", function() { - var sig = this.repository.defaultSignature(); - - assert(sig instanceof Signature); + this.repository.defaultSignature() + .then((sig) => { + assert(sig instanceof Signature); + }); }); it("gets statuses with StatusFile", function() { @@ -263,16 +264,21 @@ describe("Repository", function() { }); it("can commit on head on a empty repo with createCommitOnHead", function() { - var fileName = "my-new-file-that-shouldnt-exist.file"; - var fileContent = "new file from repository test"; - var repo = this.emptyRepo; - var filePath = path.join(repo.workdir(), fileName); - var authSig = repo.defaultSignature(); - var commitSig = repo.defaultSignature(); - var commitMsg = "Doug this has been commited"; - - return fse.writeFile(filePath, fileContent) - .then(function() { + const fileName = "my-new-file-that-shouldnt-exist.file"; + const fileContent = "new file from repository test"; + const repo = this.emptyRepo; + const filePath = path.join(repo.workdir(), fileName); + const commitMsg = "Doug this has been commited"; + let authSig; + let commitSig; + + return repo.defaultSignature() + .then((sig) => { + authSig = sig; + commitSig = sig; + return fse.writeFile(filePath, fileContent); + }) + .then(() => { return repo.createCommitOnHead( [fileName], authSig, @@ -280,7 +286,7 @@ describe("Repository", function() { commitMsg ); }) - .then(function(oidResult) { + .then((oidResult) => { return repo.getHeadCommit() .then(function(commit) { assert.equal( diff --git a/test/tests/signature.js b/test/tests/signature.js index 9a6b2119b..e0387c3d3 100644 --- a/test/tests/signature.js +++ b/test/tests/signature.js @@ -45,37 +45,39 @@ describe("Signature", function() { var savedUserName; var savedUserEmail; - var cleanUp = function() { + var cleanUp = () => { return exec("git config --global user.name \"" + savedUserName + "\"") - .then(function() { + .then(() => { exec("git config --global user.email \"" + savedUserEmail + "\""); }); }; return exec("git config --global user.name") - .then(function(userName) { + .then((userName) => { savedUserName = userName.trim(); return exec("git config --global user.email"); }) - .then(function(userEmail) { + .then((userEmail) => { savedUserEmail = userEmail.trim(); return exec("git config --global --unset user.name"); }) - .then(function() { + .then(() => { return exec("git config --global --unset user.email"); }) - .then(function() { + .then(() => { return Repository.open(reposPath); }) - .then(function(repo) { - var sig = repo.defaultSignature(); + .then((repo) => { + return repo.defaultSignature(); + }) + .then((sig) => { assert.equal(sig.name(), "unknown"); assert.equal(sig.email(), "unknown@example.com"); }) .then(cleanUp) - .catch(function(e) { + .catch((e) => { return cleanUp() .then(function() { return Promise.reject(e); diff --git a/test/tests/stash.js b/test/tests/stash.js index 6d1a20c04..a8720438b 100644 --- a/test/tests/stash.js +++ b/test/tests/stash.js @@ -31,22 +31,23 @@ describe("Stash", function() { }); function saveDropStash(repo, stashMessage) { - var fileName = "README.md"; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashes = []; - var stashOid; + const fileName = "README.md"; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + let stashes = []; + let stashOid; return fse.readFile(filePath) - .then(function(content) { + .then((content) => { oldContent = content; return fse.writeFile(filePath, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function(oid) { + .then((oid) => { stashOid = oid; var stashCb = function(index, message, oid) { stashes.push({index: index, message: message, oid: oid}); @@ -54,7 +55,7 @@ describe("Stash", function() { return Stash.foreach(repo, stashCb); }) - .then(function() { + .then(() => { assert.equal(stashes.length, 1); assert.equal(stashes[0].index, 0); const expectedMessage = !stashMessage ? @@ -65,20 +66,20 @@ describe("Stash", function() { return Stash.drop(repo, 0); }) - .then(function () { + .then(() => { stashes = []; - var stashCb = function(index, message, oid) { + var stashCb = (index, message, oid) => { stashes.push({index: index, message: message, oid: oid}); }; return Stash.foreach(repo, stashCb); }) - .then(function() { + .then(() => { assert.equal(stashes.length, 0); }) - .catch(function(e) { + .catch((e) => { return fse.writeFile(filePath, oldContent) - .then(function() { + .then(() => { return Promise.reject(e); }); }); @@ -93,78 +94,80 @@ describe("Stash", function() { }); it("can save and pop a stash", function() { - var fileNameA = "README.md"; - var fileNameB = "install.js"; - var oldContentA; - var oldContentB; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var repo = this.repository; - var filePathA = path.join(repo.workdir(), fileNameA); - var filePathB = path.join(repo.workdir(), fileNameB); - var stashMessage = "stash test"; + const fileNameA = "README.md"; + const fileNameB = "install.js"; + let oldContentA; + let oldContentB; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const repo = this.repository; + const filePathA = path.join(repo.workdir(), fileNameA); + const filePathB = path.join(repo.workdir(), fileNameB); + const stashMessage = "stash test"; return fse.readFile(filePathA, "utf-8") - .then(function(content) { + .then((content) => { oldContentA = content; return fse.writeFile(filePathA, fileContent); }) - .then(function() { + .then(() => { return fse.readFile(filePathB, "utf-8"); }) - .then(function(content) { + .then((content) => { oldContentB = content; return fse.writeFile(filePathB, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function() { + .then(() => { return fse.readFile(filePathA, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(oldContentA, content); return fse.readFile(filePathB, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(oldContentB, content); return Stash.pop(repo, 0); }) - .then(function() { + .then(() => { return fse.readFile(filePathA, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(fileContent, content); return fse.readFile(filePathB, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(fileContent, content); }); }); it("can save a stash, change files, and fail to pop stash", function() { - var fileName = "README.md"; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var fileContent2 = "Somewhere over the repo, changes were made."; - var repo = this.repository; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashMessage = "stash test"; + const fileName = "README.md"; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const fileContent2 = "Somewhere over the repo, changes were made."; + const repo = this.repository; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + const stashMessage = "stash test"; return fse.readFile(filePath) - .then(function(content) { + .then((content) => { oldContent = content; return fse.writeFile(filePath, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function() { + .then(() => { return fse.writeFile(filePath, fileContent2); }) - .then(function() { + .then(() => { return Stash.pop(repo, 0); }) - .catch(function(reason) { + .catch((reason) => { if (reason.message !== "1 conflict prevents checkout") { throw reason; } else { @@ -174,33 +177,34 @@ describe("Stash", function() { }); it("can save, apply, then drop the stash", function() { - var fileName = "README.md"; - var fileContent = "Cha-cha-cha-chaaaaaangessssss"; - var repo = this.repository; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashMessage = "stash test"; + const fileName = "README.md"; + const fileContent = "Cha-cha-cha-chaaaaaangessssss"; + const repo = this.repository; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + const stashMessage = "stash test"; return fse.readFile(filePath) - .then(function(content) { + .then((content) => { oldContent = content; return fse.writeFile(filePath, fileContent); }) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), stashMessage, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, stashMessage, 0); }) - .then(function() { + .then(() => { return Stash.apply(repo, 0); }) - .then(function() { + .then(() => { return Stash.drop(repo, 0); - }, function() { + }, () => { throw new Error("Unable to drop stash after apply."); }) - .then(function() { + .then(() => { return Stash.drop(repo, 0); }) - .catch(function(reason) { + .catch((reason) => { if (reason.message !== "reference 'refs/stash' not found") { throw reason; } @@ -208,46 +212,48 @@ describe("Stash", function() { }); it("can save multiple stashes and pop an arbitrary stash", function() { - var fileName = "README.md"; - var fileContentA = "Hi. It's me. I'm the dog. My name is the dog."; - var fileContentB = "Everyone likes me. I'm cute."; - var fileContentC = "I think I will bark at nothing now. Ba. Ba. Baba Baba."; - var repo = this.repository; - var filePath = path.join(repo.workdir(), fileName); - var oldContent; - var stashMessageA = "stash test A"; - var stashMessageB = "stash test B"; - var stashMessageC = "stash test C"; - - function writeAndStash(path, content, message) { + const fileName = "README.md"; + const fileContentA = "Hi. It's me. I'm the dog. My name is the dog."; + const fileContentB = "Everyone likes me. I'm cute."; + const fileContentC = + "I think I will bark at nothing now. Ba. Ba. Baba Baba."; + const repo = this.repository; + const filePath = path.join(repo.workdir(), fileName); + let oldContent; + const stashMessageA = "stash test A"; + const stashMessageB = "stash test B"; + const stashMessageC = "stash test C"; + + const writeAndStash = (path, content, message) => { return fse.writeFile(path, content) - .then(function() { - return Stash.save(repo, repo.defaultSignature(), message, 0); + .then(() => repo.defaultSignature()) + .then((signature) => { + return Stash.save(repo, signature, message, 0); }); - } + }; return fse.readFile(filePath, "utf-8") - .then(function (content) { + .then((content) => { oldContent = content; return writeAndStash(filePath, fileContentA, stashMessageA); }) - .then(function() { + .then(() => { return writeAndStash(filePath, fileContentB, stashMessageB); }) - .then(function() { + .then(() => { return writeAndStash(filePath, fileContentC, stashMessageC); }) - .then(function() { + .then(() => { return fse.readFile(filePath, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(oldContent, content); return Stash.pop(repo, 1); }) - .then(function() { + .then(() => { return fse.readFile(filePath, "utf-8"); }) - .then(function(content) { + .then((content) => { assert.equal(fileContentB, content); }); }); diff --git a/test/tests/tag.js b/test/tests/tag.js index 51268b40a..844fa43be 100644 --- a/test/tests/tag.js +++ b/test/tests/tag.js @@ -159,11 +159,15 @@ describe("Tag", function() { it("can create a new signed tag with Tag.create and delete it", function() { var name = "created-signed-tag-create"; var repository = this.repository; - var signature = Signature.default(repository); + var signature = null; var commit = null; var commit2 = null; - return repository.getCommit(commitPointedTo) + return Signature.default(repository) + .then(function(signatureResult) { + signature = signatureResult; + return repository.getCommit(commitPointedTo); + }) .then(function(theCommit) { commit = theCommit; return repository.getCommit(commitPointedTo2); @@ -580,10 +584,14 @@ describe("Tag", function() { var oid = Oid.fromString(commitPointedTo); var name = "created-signed-tag-annotationCreate"; var repository = this.repository; - var signature = Signature.default(repository); + var signature = null; var odb = null; - return repository.odb() + return Signature.default(repository) + .then(function(signatureResult) { + signature = signatureResult; + return repository.odb(); + }) .then(function(theOdb) { odb = theOdb; }) From edfa9ec6c486ffc374f236e08fab52beee55d783 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Thu, 7 Feb 2019 15:06:38 -0700 Subject: [PATCH 051/545] createCommitWithSignature can now handle dangling / non-existent refs --- generate/input/descriptor.json | 10 ++- lib/reference.js | 108 +++++++++++++++++++++++++++++++++ lib/repository.js | 17 +++--- 3 files changed, 127 insertions(+), 8 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index e218348ff..9e6a8a83e 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3068,7 +3068,15 @@ "ignore": true }, "git_repository_ident": { - "ignore": true + "args": { + "name": { + "isReturn": true + }, + "email": { + "isReturn": true + } + }, + "isAsync": false }, "git_repository_init_init_options": { "ignore": true diff --git a/lib/reference.js b/lib/reference.js index 821ace32f..958693d55 100644 --- a/lib/reference.js +++ b/lib/reference.js @@ -63,3 +63,111 @@ Reference.prototype.isValid = function() { Reference.prototype.toString = function() { return this.name(); }; + +const MAX_NESTING_LEVEL = 10; + +const getTerminal = (repo, refName, nesting, prevRef = null) => { + if (nesting > MAX_NESTING_LEVEL) { + return Promise.resolve({ + error: NodeGit.Error.CODE.ENOTFOUND, + out: prevRef + }); + } + + return NodeGit.Reference.lookup(repo, refName) + .then((ref) => { + if (ref.type() === NodeGit.Reference.TYPE.OID) { + return { + error: NodeGit.Error.CODE.OK, + out: ref + }; + } else { + return getTerminal(repo, ref.symbolicTarget(), nesting + 1, ref) + .then(({ error, out }) => { + if (error === NodeGit.Error.CODE.ENOTFOUND && !out) { + return { error, out: ref }; + } else { + return { error, out }; + } + }); + } + }) + .catch((error) => { + return { + error: error.errno, + out: null + }; + }); +}; + +const getSignatureForReflog = (repo) => { + const { email, name } = repo.ident(); + if (email && name) { + return Promise.resolve(NodeGit.Signature.now(name, email)); + } + + return NodeGit.Signature.default(repo) + .catch(() => NodeGit.Signature.now("unknown", "unknown")); +}; + +Reference.updateTerminal = function ( + repo, + refName, + oid, + signature, + logMessage +) { + let signatureToUse; + let promiseChain = Promise.resolve(); + + if (!signature) { + promiseChain = promiseChain + .then(() => getSignatureForReflog(repo)) + .then((sig) => { + signatureToUse = sig; + return Promise.resolve(); + }); + } else { + signatureToUse = signature; + } + + return promiseChain + .then(() => getTerminal(repo, refName, 0)) + .then(({ error, out }) => { + if (error === NodeGit.Error.CODE.ENOTFOUND && out) { + return NodeGit.Reference.create( + repo, + out.symbolicTarget(), + oid, + 0, + logMessage + ); + } else if (error === NodeGit.Error.CODE.ENOTFOUND) { + return NodeGit.Reference.create( + repo, + refName, + oid, + 0, + logMessage + ); + } else { + return NodeGit.Reference.createMatching( + repo, + out.name(), + oid, + 1, + out.target(), + logMessage + ); + } + }) + .then(() => NodeGit.Reflog.read(repo, refName)) + .then((reflog) => { + // We may want some kind of transactional logic for this + // There is a theoretical timing issue that could result in updating + // the wrong reflog + reflog.drop(0, 1); + reflog.append(oid, signatureToUse, logMessage); + return reflog.write(); + }); +}; diff --git a/lib/repository.js b/lib/repository.js index 48d808ec8..7c2326036 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -683,7 +683,6 @@ Repository.prototype.createCommitWithSignature = function( var repo = this; var promises = []; var commitContent; - var commit; var skippedSigning; parents = parents || []; @@ -766,14 +765,18 @@ Repository.prototype.createCommitWithSignature = function( return repo.getCommit(commitOid) .then(function(commitResult) { - commit = commitResult; - return repo.getReference(updateRef); - }).then(function(ref) { - return ref.setTarget(commitOid, getReflogMessageForCommit(commit)); - }).then(function() { + return Reference.updateTerminal( + repo, + updateRef, + commitOid, + committer, + getReflogMessageForCommit(commitResult) + ); + }) + .then(function() { return commitOid; }); - }); + }); }; /** From f8cdcf615f1d1b98bf4043c196c695f845cab23c Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Thu, 7 Feb 2019 12:24:44 -0700 Subject: [PATCH 052/545] Handle new gyp information for electron builds --- generate/templates/templates/binding.gyp | 18 ++++--------- package-lock.json | 25 +++++++++++++++--- package.json | 1 + utils/isBuildingForElectron.js | 32 ++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 utils/isBuildingForElectron.js diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index e6f1141cb..c15a7ec55 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -1,21 +1,13 @@ { - "conditions": [ - ["(OS=='win' and node_root_dir.split('\\\\')[-1].startswith('iojs')) or (OS=='mac' and node_root_dir.split('/')[-1].startswith('iojs'))", { - "variables": { - "is_electron%": "1", - } - }, { - "variables": { - "is_electron%": "0", - } - }] - ], + "variables": { + "is_electron%": " arr[arr.length - 1]; +const sep = process.platform === "win32" ? "\\\\" : "/"; +const [, , nodeRootDir] = process.argv; + +let isElectron = last(nodeRootDir.split(sep)).startsWith("iojs"); + +if (!isElectron) { + try { + // Not ideal, would love it if there were a full featured gyp package to do this operation instead. + const { variables: { built_with_electron } } = JSON5.parse( + fs.readFileSync( + path.resolve(nodeRootDir, "include", "node", "config.gypi"), + "utf8" + ) + ); + + if (built_with_electron) { + isElectron = true; + } + } catch (e) {} +} + +fs.writeFileSync("was_electron", isElectron ? "1" : "0"); +process.stdout.write(isElectron ? "1" : "0"); From c3e58f34e91127cffbe6006c06102f68c0c03588 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Thu, 7 Feb 2019 16:09:01 -0700 Subject: [PATCH 053/545] Add test case for updating non-existent refs with createCommitWithSignature --- test/tests/commit.js | 93 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/test/tests/commit.js b/test/tests/commit.js index 6f212d6a4..8104624c2 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -17,6 +17,7 @@ describe("Commit", function() { var Oid = NodeGit.Oid; var reposPath = local("../repos/workdir"); + var newRepoPath = local("../repos/new"); var oid = "fce88902e66c72b5b93e75bdb5ae717038b221f6"; function reinitialize(test) { @@ -1128,7 +1129,8 @@ describe("Commit", function() { }); }); - it("Can create a signed commit in a repo and update refs", function() { + it("Can create a signed commit in a repo and update existing ref", + function() { var signedData = "-----BEGIN PGP SIGNATURE-----\n" + "Version: GnuPG v1.4.12 (Darwin)\n" + "\n" + @@ -1235,6 +1237,95 @@ describe("Commit", function() { }); }); + it("Can create a signed commit in bare a repo and update non-existent ref", + function() { + var signedData = "-----BEGIN PGP SIGNATURE-----\n" + + "\n" + + "iQIzBAABCAAdFiEEHYpzGBSIRCy6QrNr0R10kNTwiG8FAlxcuSoACgkQ0R10kNTw\n" + + "iG9sZA//Z6mrX5l//gjtn7Fy3Cg5khasNMZA15JUPzfoSyVkaYM7g/iZrJr4uZmm\n" + + "lrhqxTDP4SUEL6dMOT0fjAudulP19Stv0mUMOoQ9cfvU0DAuFlI1z2Ny9IR+3hJK\n" + + "XpIQCHZAAY9KrGajJvDO+WqukrMwKh2dwaQLgB2+cS7ehBpbW45+l+Bq4hTlULiJ\n" + + "ohZ2SQhqj65knErdbfJ2B7yVlQbfG2vbD6qN4qJOkJpkFRdDhLmGnNjUj+vcmYO2\n" + + "Be5CLyjuhYszzUqys6ix4UHr10KihFk31N17CgA2ZsDSzE3VsMCPlVPV9jWuMceJ\n" + + "0IFsJEXFR4SOlRAq23BxD7aaYao6AF/YBhCQnDiuiQLCJ7WdUAmja6VPyEajAjoX\n" + + "CkdDs1P4N9IeIPvJECn8Df4NEEkzW8sV3i96ryk066m1ZmZWemJ2zdGVbfR+AuFZ\n" + + "7QwgBRidj3thIk0geh9g10+pbRuTzxNXklqxq4DQb3VEXIIJMUcqtN1bUPEPiLyA\n" + + "SU3uJ1THyYznAVZy6aqw+mNq7Lg9gV65LRd0WtNqgneknDZoH3zXyzlcJexjHkRF\n" + + "qt4K6w9TDA2Erda3wE4BM4MCgl1Hc629kH3ROCyWTFuJAEZtNDJPgIc2LTRDhHNd\n" + + "+K937RhWU8lUnI2jJLmKdQDk2dnS1ZepFqA5Ynwza1qDSOgUqVw=\n" + + "=M81P\n" + + "-----END PGP SIGNATURE-----"; + + const onSignature = () => ({ + code: NodeGit.Error.CODE.OK, + field: "gpgsig", + signedData + }); + + var expectedCommitId = "ef11571eb3590007712c7ee3b4a11cd9c6094e30"; + var fileName = "newfile.txt"; + var fileContent = "hello world"; + + var repo; + var index; + var treeOid; + + return NodeGit.Repository.init(newRepoPath, 0) + .then(function(repoResult) { + repo = repoResult; + return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); + }) + .then(function() { + return repo.refreshIndex(); + }) + .then(function(indexResult) { + index = indexResult; + }) + .then(function() { + return index.addByPath(fileName); + }) + .then(function() { + return index.write(); + }) + .then(function() { + return index.writeTree(); + }) + .then(function(oidResult) { + treeOid = oidResult; + return Promise.all([ + NodeGit.Signature.create("Foo Bar", "foo@bar.com", 123456789, 60), + NodeGit.Signature.create("Foo A Bar", "foo@bar.com", 987654321, 90) + ]); + }) + .then(function(signatures) { + var author = signatures[0]; + var committer = signatures[1]; + + return repo.createCommitWithSignature( + "HEAD", + author, + committer, + "message", + treeOid, + [], + onSignature); + }) + .then(function(commitId) { + assert.equal(expectedCommitId, commitId); + return NodeGit.Commit.lookup(repo, commitId); + }) + .then(function(commit) { + return commit.getSignature("gpgsig"); + }) + .then(function(signatureInfo) { + assert.equal(signedData, signatureInfo.signature); + return repo.getHeadCommit(); + }) + .then(function(headCommit) { + assert.equal(expectedCommitId, headCommit.id()); + }); + }); + it("Can create a signed commit raw", function() { var expectedCommitId = "cc1401eaac4e9e77190e98a9353b305f0c6313d8"; From 48bf6fa1ad998d308c29856c6d237eb43245e9fa Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Thu, 7 Feb 2019 16:20:39 -0700 Subject: [PATCH 054/545] Add warning comment for reflog critical section --- lib/reference.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/reference.js b/lib/reference.js index 958693d55..2b0e67733 100644 --- a/lib/reference.js +++ b/lib/reference.js @@ -163,9 +163,12 @@ Reference.updateTerminal = function ( }) .then(() => NodeGit.Reflog.read(repo, refName)) .then((reflog) => { - // We may want some kind of transactional logic for this - // There is a theoretical timing issue that could result in updating - // the wrong reflog + // Janky, but works. Ideally, we would want to generate the correct reflog + // entry in the first place, rather than drop the most recent entry and + // write the correct one. + // NOTE: There is a theoretical race condition that could happen here. + // We may want to consider some kind of transactional logic to make sure + // that the reflog on disk isn't modified before we can write back. reflog.drop(0, 1); reflog.append(oid, signatureToUse, logMessage); return reflog.write(); From 6e7032b6d28fec4468a66d50c35a59c36a636160 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Fri, 8 Feb 2019 09:56:16 -0700 Subject: [PATCH 055/545] Add documentation and update parameter order --- lib/reference.js | 25 +++++++++++++++++-------- lib/repository.js | 6 ++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/reference.js b/lib/reference.js index 2b0e67733..6fdc6fa19 100644 --- a/lib/reference.js +++ b/lib/reference.js @@ -64,10 +64,8 @@ Reference.prototype.toString = function() { return this.name(); }; -const MAX_NESTING_LEVEL = 10; - -const getTerminal = (repo, refName, nesting, prevRef = null) => { - if (nesting > MAX_NESTING_LEVEL) { +const getTerminal = (repo, refName, depth = 10, prevRef = null) => { + if (depth <= 0) { return Promise.resolve({ error: NodeGit.Error.CODE.ENOTFOUND, out: prevRef @@ -82,7 +80,7 @@ const getTerminal = (repo, refName, nesting, prevRef = null) => { out: ref }; } else { - return getTerminal(repo, ref.symbolicTarget(), nesting + 1, ref) + return getTerminal(repo, ref.symbolicTarget(), depth - 1, ref) .then(({ error, out }) => { if (error === NodeGit.Error.CODE.ENOTFOUND && !out) { return { error, out: ref }; @@ -110,12 +108,23 @@ const getSignatureForReflog = (repo) => { .catch(() => NodeGit.Signature.now("unknown", "unknown")); }; +/** + * Given a reference name, follows symbolic links and updates the direct + * reference to point to a given OID. Updates the reflog with a given message. + * + * @async + * @param {Repository} repo The repo where the reference and objects live + * @param {String} refName The reference name to update + * @param {Oid} oid The target OID that the reference will point to + * @param {String} logMessage The reflog message to be writted + * @param {Signature} signature Optional signature to use for the reflog entry + */ Reference.updateTerminal = function ( repo, refName, oid, - signature, - logMessage + logMessage, + signature ) { let signatureToUse; let promiseChain = Promise.resolve(); @@ -132,7 +141,7 @@ Reference.updateTerminal = function ( } return promiseChain - .then(() => getTerminal(repo, refName, 0)) + .then(() => getTerminal(repo, refName)) .then(({ error, out }) => { if (error === NodeGit.Error.CODE.ENOTFOUND && out) { return NodeGit.Reference.create( diff --git a/lib/repository.js b/lib/repository.js index 7c2326036..c4a0d8b44 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -769,8 +769,8 @@ Repository.prototype.createCommitWithSignature = function( repo, updateRef, commitOid, - committer, - getReflogMessageForCommit(commitResult) + getReflogMessageForCommit(commitResult), + committer ); }) .then(function() { @@ -897,6 +897,8 @@ Repository.prototype.createTag = function(oid, name, message, callback) { /** * Gets the default signature for the default user and now timestamp + * + * @async * @return {Signature} */ Repository.prototype.defaultSignature = function() { From e18a4fd5aa5503dcedd288cf70bb34104edc71fd Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Fri, 8 Feb 2019 10:57:29 -0700 Subject: [PATCH 056/545] Bump to v0.25.0-alpha.4 --- CHANGELOG.md | 18 ++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9027a79dc..ffcc10a37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Change Log +## v0.25.0-alpha.4 [(2019-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.4) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.3...v0.25.0-alpha.4) + +#### Summary of changes +- Fixed bug where signing the init commit failed due to being unable to update the `HEAD` ref. +- Changed `NodeGit.Signature.default` to async, because it actually ends up reading the config. +- Fixed bug where templates were not reporting errors for synchronous methods. It's a bit of a wide net, but in general, + it is now possible certain sync methods in NodeGit will begin failin that did not fail before. This is the correct + behavior. +- Switched `NodeGit.Oid.fromString`'s internal implementation from `git_oid_fromstr` to `git_oid_fromstrp` +- Fixed builds for Electron 4 +- Added `NodeGit.Reference.updateTerminal` + +#### Merged PRs into NodeGit +- [Fix non-existent / dangling refs cause Repository.prototype.createCommitWithSignature to fail #1624](https://github.com/nodegit/nodegit/pull/1624) +- [Handle new gyp information for electron builds #1623](https://github.com/nodegit/nodegit/pull/1623) + ## v0.25.0-alpha.3 [(2019-02-05)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.2...v0.25.0-alpha.3) diff --git a/package-lock.json b/package-lock.json index d7ab33817..d5532245a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.3", + "version": "0.25.0-alpha.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9597da832..ed9caf48d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.3", + "version": "0.25.0-alpha.4", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 4f3d123475ad8ca9868e3801ed5339c2067493a2 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Fri, 8 Feb 2019 16:32:41 -0700 Subject: [PATCH 057/545] This doesn't belong here --- utils/isBuildingForElectron.js | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/isBuildingForElectron.js b/utils/isBuildingForElectron.js index 58d32bd5e..338244487 100644 --- a/utils/isBuildingForElectron.js +++ b/utils/isBuildingForElectron.js @@ -28,5 +28,4 @@ if (!isElectron) { } catch (e) {} } -fs.writeFileSync("was_electron", isElectron ? "1" : "0"); process.stdout.write(isElectron ? "1" : "0"); From 8f78805acfe279bf37292b6fb6ba26d7a9001240 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 11 Feb 2019 09:16:10 -0700 Subject: [PATCH 058/545] Fix macOS and Windows Electron 4 builds --- generate/templates/templates/binding.gyp | 4 ++-- vendor/libgit2.gyp | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index c15a7ec55..f67cf2e31 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -94,7 +94,7 @@ [ "OS=='mac'", { "conditions": [ - ["node_root_dir.split('/')[-1].startswith('iojs')", { + ["<(is_electron) == 1", { "include_dirs": [ "vendor/openssl/include" ], @@ -122,7 +122,7 @@ [ "OS=='win'", { "conditions": [ - ["node_root_dir.split('\\\\')[-1].startswith('iojs')", { + ["<(is_electron) == 1", { "include_dirs": ["vendor/openssl/include"], "libraries": [ "<(module_root_dir)/vendor/openssl/lib/libcrypto.lib", diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index fd5f93cd3..0bfc49c45 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -7,6 +7,7 @@ "library%": "static_library", "openssl_enable_asm%": 0, # only supported with the Visual Studio 2012 (VC11) toolchain. "gcc_version%": 0, + "is_electron%": " Date: Mon, 11 Feb 2019 13:12:25 -0700 Subject: [PATCH 059/545] Use path.sep for windows electron detection in node --- utils/isBuildingForElectron.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utils/isBuildingForElectron.js b/utils/isBuildingForElectron.js index 338244487..295f6ab1f 100644 --- a/utils/isBuildingForElectron.js +++ b/utils/isBuildingForElectron.js @@ -7,10 +7,9 @@ if (process.argv.length < 3) { } const last = arr => arr[arr.length - 1]; -const sep = process.platform === "win32" ? "\\\\" : "/"; const [, , nodeRootDir] = process.argv; -let isElectron = last(nodeRootDir.split(sep)).startsWith("iojs"); +let isElectron = last(nodeRootDir.split(path.sep)).startsWith("iojs"); if (!isElectron) { try { From b3ad6a2a3beb39654f32116ee22e70014397461f Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 11 Feb 2019 13:12:38 -0700 Subject: [PATCH 060/545] Bump to v0.25.0-alpha.5 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffcc10a37..cee02161b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.25.0-alpha.5 [(2019-02-11)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.5) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.4...v0.25.0-alpha.5) + +#### Summary of changes +- Fixed builds for Electron 4 for real this time + +#### Merged PRs into NodeGit +- [Fix macOS and Windows Electron 4 builds #1626](https://github.com/nodegit/nodegit/pull/1626) + ## v0.25.0-alpha.4 [(2019-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.4) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.3...v0.25.0-alpha.4) diff --git a/package-lock.json b/package-lock.json index d5532245a..aa6cc812e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.4", + "version": "0.25.0-alpha.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ed9caf48d..66ff74038 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.4", + "version": "0.25.0-alpha.5", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From f6c80d6f51bd8b978c090b28e46c9c125f54fcf0 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 12 Feb 2019 09:49:46 -0700 Subject: [PATCH 061/545] Allow backport branch to build on appveyor CI --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 34f73e23d..368e911e8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -58,5 +58,6 @@ build: off branches: only: + - /backport\/.*/ - master - v0.3 From f14d3494c4acb9d7a9a1070a54e2359ebf1896bb Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 12 Feb 2019 12:18:12 -0700 Subject: [PATCH 062/545] Bump Libgit2 fork to v0.28.0 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 0a271d605..c59d5a2e9 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 0a271d60550c7e14d2c883a57cec58b7f4c454a2 +Subproject commit c59d5a2e9332c8256111de4cc8e69d9c2278ee46 From 704395c2a4cc5627482e99a0666fb7424400480f Mon Sep 17 00:00:00 2001 From: Jake Krammer Date: Tue, 12 Feb 2019 16:10:33 -0700 Subject: [PATCH 063/545] Fix "errorno" typo --- lib/repository.js | 12 ++-- test/tests/rebase.js | 154 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 6 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index c4a0d8b44..22f10668f 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -492,12 +492,12 @@ Repository.prototype.continueRebase = function( rebase = _rebase; return rebase.commit(null, signature) .catch((e) => { - // Ignore all errors to prevent - // this routine from choking now - // that we made rebase.commit - // asynchronous - const errorno = fp.get(["errorno"], e); - if (errorno === NodeGit.Error.CODE.EAPPLIED) { + // If the first commit on continueRebase is a + // "patch already applied" error, + // interpret that as an explicit "skip commit" + // and ignore the error. + const errno = fp.get(["errno"], e); + if (errno === NodeGit.Error.CODE.EAPPLIED) { return; } diff --git a/test/tests/rebase.js b/test/tests/rebase.js index 610721185..a801e991a 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -2076,4 +2076,158 @@ describe("Rebase", function() { throw error; }); }); + + it("will not throw on patch already applied errors", function() { + var baseFileName = "baseNewFile.txt"; + var theirFileName = "myFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var theirFileContent = "Hello there"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var initialCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + initialCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile( + path.join(repository.workdir(), theirFileName), + theirFileContent + ); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "6f14d06b24fa8ea26f511dd8a94a003fd37eadc5"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [initialCommit]) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "c4cc225184b9c9682cb48294358d9d65f8ec42c7"); + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [initialCommit]); + }); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "5814ffa17b8a677191d89d5372f1e46d50d976ae"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "5814ffa17b8a677191d89d5372f1e46d50d976ae"); + assert.equal(theirAnnotatedCommit.id().toString(), + "c4cc225184b9c9682cb48294358d9d65f8ec42c7"); + + return NodeGit.Rebase.init( + repository, + ourAnnotatedCommit, + theirAnnotatedCommit + ); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .catch(function(error) { + assert.fail(error); + + throw error; + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "5814ffa17b8a677191d89d5372f1e46d50d976ae"); + + return rebase.commit(null, ourSignature); + }) + .then(function() { + assert.fail("Rebase should have failed."); + }, function (error) { + if (error && error.errno === NodeGit.Error.CODE.EAPPLIED) { + return; + } + + assert.fail(error); + + throw error; + }) + .then(function() { + return repository.continueRebase(); + }) + .then(function() { + return rebase.next(); + }) + .catch(function(error) { + assert.equal(error.errno, NodeGit.Error.CODE.ITEROVER); + }); + }); }); From 177a71327aed614e2b3a306dbac3190d5affd415 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 13 Feb 2019 14:03:35 -0700 Subject: [PATCH 064/545] We should clear the persistent cell in structs when they are destroyed --- generate/templates/templates/struct_content.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index 9840cfe4f..0c7b9e4f1 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -67,6 +67,8 @@ using namespace std; this->raw->{{ fields|payloadFor field.name }} = NULL; {% endif %} } + {% elsif field.hasConstructor |or field.isLibgitType %} + this->{{ field.name }}.Reset(); {% endif %} {% endif %} {% endif %} From 3326e1dd839bc182ee1d86614634a6113a0f1a31 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Thu, 14 Feb 2019 08:48:17 -0700 Subject: [PATCH 065/545] Bump to v0.25.0-alpha.6 --- CHANGELOG.md | 17 +++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cee02161b..c70866e50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Change Log +## v0.25.0-alpha.6 [(2019-02-14)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.6) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.5...v0.25.0-alpha.6) + +#### Summary of changes +- Bumped LibGit2 to v0.28.0. +- Fixed problem with continue rebase preventing users from skipping commits +- Fixed leak where struct/option types were leaking libgit2 pointers + +#### Merged PRs into NodeGit +- [We should clear the persistent cell in structs when they are destroyed #1629](https://github.com/nodegit/nodegit/pull/1629) +- [Fix "errorno" typo #1628](https://github.com/nodegit/nodegit/pull/1628) +- [Bump Libgit2 fork to v0.28.0 #1627](https://github.com/nodegit/nodegit/pull/1627) + + ## v0.25.0-alpha.5 [(2019-02-11)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.5) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.4...v0.25.0-alpha.5) @@ -10,6 +25,7 @@ #### Merged PRs into NodeGit - [Fix macOS and Windows Electron 4 builds #1626](https://github.com/nodegit/nodegit/pull/1626) + ## v0.25.0-alpha.4 [(2019-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.4) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.3...v0.25.0-alpha.4) @@ -28,6 +44,7 @@ - [Fix non-existent / dangling refs cause Repository.prototype.createCommitWithSignature to fail #1624](https://github.com/nodegit/nodegit/pull/1624) - [Handle new gyp information for electron builds #1623](https://github.com/nodegit/nodegit/pull/1623) + ## v0.25.0-alpha.3 [(2019-02-05)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.2...v0.25.0-alpha.3) diff --git a/package-lock.json b/package-lock.json index aa6cc812e..b30eb273f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.5", + "version": "0.25.0-alpha.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 66ff74038..6b4d3ac15 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.5", + "version": "0.25.0-alpha.6", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 2f099c8573fec4234c6bee5d4e1a82b283e55e39 Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Thu, 14 Feb 2019 13:08:49 -0700 Subject: [PATCH 066/545] Fix regex state causing subsequent runs of Tag.extractSignature to fail --- lib/tag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tag.js b/lib/tag.js index a1183bc85..4c21f45aa 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -123,7 +123,7 @@ Tag.prototype.extractSignature = function(signatureType = "gpgsig") { const odbData = odbObject.toString(); for (const regex of signatureRegexes) { - const matchResult = regex.exec(odbData); + const matchResult = odbData.match(regex); if (matchResult !== null) { return matchResult[0]; From b3fd15b0cb069c62f06b26d9ad3b892b94bbe91c Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Thu, 14 Feb 2019 13:31:09 -0700 Subject: [PATCH 067/545] Update LibGit2 docs to v0.28.0 Callbacks added: - git_apply_delta_cb - git_apply_hunk_cb Methods added: - git_annotated_commit_ref - git_apply - git_apply_to_tree - git_merge_analysis - git merge_analysis_for_ref - git_remote_create_with_opts Exposed classes: - git_index_conflict_iterator - git_index_iterator --- generate/input/callbacks.json | 36 + generate/input/descriptor.json | 130 +- generate/input/libgit2-docs.json | 4562 ++++++++++++++---------- generate/input/libgit2-supplement.json | 218 +- lib/remote.js | 6 + 5 files changed, 2966 insertions(+), 1986 deletions(-) diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index 535ca08b7..c37a7c8ee 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -1,4 +1,40 @@ { + "git_apply_delta_cb": { + "args": [ + { + "name": "delta", + "cType": "const git_diff_delta *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 1, + "success": 0, + "error": -1 + } + }, + "git_apply_hunk_cb": { + "args": [ + { + "name": "hunk", + "cType": "const git_diff_hunk *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 1, + "success": 0, + "error": -1 + } + }, "git_attr_foreach_cb": { "args": [ { diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 9e6a8a83e..6daa52ce1 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -48,7 +48,7 @@ "repository_init_flag": { "removeString": "INIT_" }, - "otype": { + "object": { "JsName": "TYPE", "owner": "Object", "removeString": "OBJ_" @@ -57,7 +57,7 @@ "JsName": "PROXY", "isMask": false }, - "ref": { + "reference": { "owner": "Reference", "JsName": "TYPE" }, @@ -71,6 +71,9 @@ "status": { "JsName": "STATUS", "isMask": false + }, + "stream": { + "ignore": true } }, "types": @@ -111,6 +114,9 @@ } } }, + "apply_options": { + "hasConstructor": true + }, "attr": { "functions": { "git_attr_foreach": { @@ -1734,10 +1740,69 @@ "../include/str_array_converter.h" ] }, + "index_conflict_iterator": { + "selfFreeing": true, + "freeFunctionName": "git_index_conflict_iterator_free", + "functions": { + "git_index_conflict_iterator_free": { + "ignore": true + }, + "git_index_conflict_iterator_new": { + "args": { + "iterator_out": { + "ownedBy": ["index"] + } + } + }, + "git_index_conflict_next": { + "isAsync": false, + "jsFunctionName": "next", + "cppFunctionName": "Next", + "args": { + "ancestor_out": { + "isReturn": true, + "ownedByThis": true + }, + "our_out": { + "isReturn": true, + "ownedByThis": true + }, + "their_out": { + "isReturn": true, + "ownedByThis": true + } + } + } + } + }, "index_entry": { "hasConstructor": true, "ignoreInit": true }, + "index_iterator": { + "selfFreeing": true, + "freeFunctionName": "git_index_iterator_free", + "functions": { + "git_index_iterator_free": { + "ignore": true + }, + "git_index_iterator_new": { + "args": { + "iterator_out": { + "ownedBy": ["index"] + } + } + }, + "git_index_iterator_next": { + "isAsync": false, + "args": { + "out": { + "ownedByThis": true + } + } + } + } + }, "index_name_entry": { "functions": { "git_index_name_add": { @@ -1768,6 +1833,11 @@ ] }, "index_reuc_entry": { + "fields": { + "mode": { + "cType": "uint32_t [3]" + } + }, "functions": { "git_index_reuc_add": { "cppFunctionName": "Add", @@ -1934,7 +2004,51 @@ } }, "git_merge_analysis": { - "ignore": true + "isAsync": true, + "args": { + "analysis_out": { + "isReturn": true + }, + "preference_out": { + "isReturn": true + }, + "their_heads": { + "cType": "const git_annotated_commit **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitAnnotatedCommit" + }, + "their_heads_len": { + "cType": "size_t", + "cppClassName": "Number", + "jsClassName": "Number" + } + } + }, + "git_merge_analysis_for_ref": { + "isAsync": true, + "args": { + "analysis_out": { + "isReturn": true + }, + "preference_out": { + "isReturn": true + }, + "their_heads": { + "cType": "const git_annotated_commit **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitAnnotatedCommit" + }, + "their_heads_len": { + "cType": "size_t", + "cppClassName": "Number", + "jsClassName": "Number" + } + }, + "return": { + "isErrorCode": true + } }, "git_merge_base_many": { "ignore": true @@ -2854,6 +2968,13 @@ } } }, + "git_remote_create_with_opts": { + "args": { + "opts": { + "isOptional": true + } + } + }, "git_remote_connect": { "isAsync": true, "return": { @@ -3433,6 +3554,9 @@ "git2/sys/stream.h" ] }, + "stream_registration": { + "ignore": true + }, "submodule": { "selfFreeing": true, "ownerFn": { diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 82bfd8a1a..90392f122 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -14,6 +14,17 @@ "meta": {}, "lines": 121 }, + { + "file": "git2/apply.h", + "functions": [ + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_to_tree", + "git_apply" + ], + "meta": {}, + "lines": 125 + }, { "file": "git2/attr.h", "functions": [ @@ -91,14 +102,13 @@ "file": "git2/buffer.h", "functions": [ "git_buf_dispose", - "git_buf_free", "git_buf_grow", "git_buf_set", "git_buf_is_binary", "git_buf_contains_nul" ], "meta": {}, - "lines": 134 + "lines": 122 }, { "file": "git2/checkout.h", @@ -181,7 +191,7 @@ "git_libgit2_opts" ], "meta": {}, - "lines": 393 + "lines": 402 }, { "file": "git2/config.h", @@ -242,6 +252,18 @@ "meta": {}, "lines": 48 }, + { + "file": "git2/deprecated.h", + "functions": [ + "git_buf_free", + "giterr_last", + "giterr_clear", + "giterr_set_str", + "giterr_set_oom" + ], + "meta": {}, + "lines": 148 + }, { "file": "git2/describe.h", "functions": [ @@ -305,13 +327,13 @@ { "file": "git2/errors.h", "functions": [ - "giterr_last", - "giterr_clear", - "giterr_set_str", - "giterr_set_oom" + "git_error_last", + "git_error_clear", + "git_error_set_str", + "git_error_set_oom" ], "meta": {}, - "lines": 156 + "lines": 157 }, { "file": "git2/filter.h", @@ -385,6 +407,9 @@ "git_index_add", "git_index_entry_stage", "git_index_entry_is_conflict", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_iterator_free", "git_index_add_bypath", "git_index_add_frombuffer", "git_index_remove_bypath", @@ -403,7 +428,7 @@ "git_index_conflict_iterator_free" ], "meta": {}, - "lines": 806 + "lines": 829 }, { "file": "git2/indexer.h", @@ -447,6 +472,7 @@ "git_merge_file_init_options", "git_merge_init_options", "git_merge_analysis", + "git_merge_analysis_for_ref", "git_merge_base", "git_merge_bases", "git_merge_base_many", @@ -460,7 +486,7 @@ "git_merge" ], "meta": {}, - "lines": 587 + "lines": 606 }, { "file": "git2/message.h", @@ -805,6 +831,8 @@ "file": "git2/remote.h", "functions": [ "git_remote_create", + "git_remote_create_init_options", + "git_remote_create_with_opts", "git_remote_create_with_fetchspec", "git_remote_create_anonymous", "git_remote_create_detached", @@ -851,7 +879,7 @@ "git_remote_default_branch" ], "meta": {}, - "lines": 852 + "lines": 926 }, { "file": "git2/repository.h", @@ -904,7 +932,7 @@ "git_repository_set_ident" ], "meta": {}, - "lines": 864 + "lines": 877 }, { "file": "git2/reset.h", @@ -1255,11 +1283,12 @@ { "file": "git2/sys/stream.h", "functions": [ + "git_stream_register", "git_stream_cb", "git_stream_register_tls" ], "meta": {}, - "lines": 54 + "lines": 130 }, { "file": "git2/sys/time.h", @@ -1289,7 +1318,7 @@ "git_smart_subtransport_ssh" ], "meta": {}, - "lines": 389 + "lines": 435 }, { "file": "git2/tag.h", @@ -1414,7 +1443,7 @@ "git_transport_certificate_check_cb" ], "meta": {}, - "lines": 438 + "lines": 442 }, { "file": "git2/worktree.h", @@ -1601,12 +1630,12 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_id-1" + "ex/v0.28.0/checkout.html#git_annotated_commit_id-1" ], "merge.c": [ - "ex/HEAD/merge.html#git_annotated_commit_id-1", - "ex/HEAD/merge.html#git_annotated_commit_id-2", - "ex/HEAD/merge.html#git_annotated_commit_id-3" + "ex/v0.28.0/merge.html#git_annotated_commit_id-1", + "ex/v0.28.0/merge.html#git_annotated_commit_id-2", + "ex/v0.28.0/merge.html#git_annotated_commit_id-3" ] } }, @@ -1633,8 +1662,8 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_ref-2", - "ex/HEAD/checkout.html#git_annotated_commit_ref-3" + "ex/v0.28.0/checkout.html#git_annotated_commit_ref-2", + "ex/v0.28.0/checkout.html#git_annotated_commit_ref-3" ] } }, @@ -1661,10 +1690,89 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_free-4" + "ex/v0.28.0/checkout.html#git_annotated_commit_free-4" ] } }, + "git_apply_to_tree": { + "type": "function", + "file": "git2/apply.h", + "line": 85, + "lineto": 90, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "the postimage of the application" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply" + }, + { + "name": "preimage", + "type": "git_tree *", + "comment": "the tree to apply the diff to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_tree *preimage, git_diff *diff, const git_apply_options *options", + "sig": "git_index **::git_repository *::git_tree *::git_diff *::const git_apply_options *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Apply a git_diff to a git_tree, and return the resulting image\n as an index.

\n", + "comments": "", + "group": "apply" + }, + "git_apply": { + "type": "function", + "file": "git2/apply.h", + "line": 121, + "lineto": 125, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "location", + "type": "git_apply_location_t", + "comment": "the location to apply (workdir, index or both)" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_diff *diff, git_apply_location_t location, const git_apply_options *options", + "sig": "git_repository *::git_diff *::git_apply_location_t::const git_apply_options *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Apply a git_diff to the given repository, making changes directly\n in the working directory, the index, or both.

\n", + "comments": "", + "group": "apply" + }, "git_attr_value": { "type": "function", "file": "git2/attr.h", @@ -1696,36 +1804,36 @@ { "name": "value_out", "type": "const char **", - "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + "comment": null }, { "name": "repo", "type": "git_repository *", - "comment": "The repository containing the path." + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." + "type": "int", + "comment": null }, { "name": "path", "type": "const char *", - "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + "comment": null }, { "name": "name", "type": "const char *", - "comment": "The name of the attribute to look up." + "comment": null } ], - "argline": "const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name", - "sig": "const char **::git_repository *::uint32_t::const char *::const char *", + "argline": "const char **value_out, git_repository *repo, int flags, const char *path, const char *name", + "sig": "const char **::git_repository *::int::const char *::const char *", "return": { "type": "int", "comment": null }, - "description": "

Look up the value of one git attribute for path.

\n", + "description": "", "comments": "", "group": "attr" }, @@ -1738,42 +1846,42 @@ { "name": "values_out", "type": "const char **", - "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + "comment": null }, { "name": "repo", "type": "git_repository *", - "comment": "The repository containing the path." + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." + "type": "int", + "comment": null }, { "name": "path", "type": "const char *", - "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + "comment": null }, { "name": "num_attr", "type": "size_t", - "comment": "The number of attributes being looked up" + "comment": null }, { "name": "names", "type": "const char **", - "comment": "An array of num_attr strings containing attribute names." + "comment": null } ], - "argline": "const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names", - "sig": "const char **::git_repository *::uint32_t::const char *::size_t::const char **", + "argline": "const char **values_out, git_repository *repo, int flags, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::int::const char *::size_t::const char **", "return": { "type": "int", "comment": null }, - "description": "

Look up a list of git attributes for path.

\n", - "comments": "

Use this if you have a known list of attributes that you want to\n look up in a single call. This is somewhat more efficient than\n calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };\n const char **values[3];\n git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for\n the three attributes you asked about.

\n", + "description": "", + "comments": "", "group": "attr" }, "git_attr_foreach": { @@ -1785,36 +1893,36 @@ { "name": "repo", "type": "git_repository *", - "comment": "The repository containing the path." + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." + "type": "int", + "comment": null }, { "name": "path", "type": "const char *", - "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + "comment": null }, { "name": "callback", "type": "git_attr_foreach_cb", - "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + "comment": null }, { "name": "payload", "type": "void *", - "comment": "Passed on as extra parameter to callback function." + "comment": null } ], - "argline": "git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload", - "sig": "git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *", + "argline": "git_repository *repo, int flags, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::int::const char *::git_attr_foreach_cb::void *", "return": { "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" + "comment": null }, - "description": "

Loop over all the git attributes for a path.

\n", + "description": "", "comments": "", "group": "attr" }, @@ -1904,20 +2012,14 @@ "file": "git2/blame.h", "line": 154, "lineto": 154, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": null - } - ], - "argline": "git_blame *blame", - "sig": "git_blame *", + "args": [], + "argline": "", + "sig": "", "return": { - "type": "uint32_t", + "type": "int", "comment": null }, - "description": "

Gets the number of hunks that exist in the blame structure.

\n", + "description": "", "comments": "", "group": "blame" }, @@ -1930,21 +2032,21 @@ { "name": "blame", "type": "git_blame *", - "comment": "the blame structure to query" + "comment": null }, { "name": "index", - "type": "uint32_t", - "comment": "index of the hunk to retrieve" + "type": "int", + "comment": null } ], - "argline": "git_blame *blame, uint32_t index", - "sig": "git_blame *::uint32_t", + "argline": "git_blame *blame, int index", + "sig": "git_blame *::int", "return": { "type": "const git_blame_hunk *", - "comment": " the hunk at the given index, or NULL on error" + "comment": null }, - "description": "

Gets the blame hunk at the given index.

\n", + "description": "", "comments": "", "group": "blame" }, @@ -1976,7 +2078,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_get_hunk_byline-1" + "ex/v0.28.0/blame.html#git_blame_get_hunk_byline-1" ] } }, @@ -2011,14 +2113,14 @@ "sig": "git_blame **::git_repository *::const char *::git_blame_options *", "return": { "type": "int", - "comment": " 0 on success, or an error code. (use giterr_last for information\n about the error.)" + "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error.)" }, "description": "

Get the blame for a single file.

\n", "comments": "", "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_file-2" + "ex/v0.28.0/blame.html#git_blame_file-2" ] } }, @@ -2053,7 +2155,7 @@ "sig": "git_blame **::git_blame *::const char *::size_t", "return": { "type": "int", - "comment": " 0 on success, or an error code. (use giterr_last for information\n about the error)" + "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" }, "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", "comments": "

Lines that differ between the buffer and the committed version are marked as\n having a zero OID for their final_commit_id.

\n", @@ -2082,7 +2184,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_free-3" + "ex/v0.28.0/blame.html#git_blame_free-3" ] } }, @@ -2119,10 +2221,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_lookup-4" + "ex/v0.28.0/blame.html#git_blob_lookup-4" ], "general.c": [ - "ex/HEAD/general.html#git_blob_lookup-1" + "ex/v0.28.0/general.html#git_blob_lookup-1" ] } }, @@ -2186,10 +2288,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_free-5" + "ex/v0.28.0/blame.html#git_blob_free-5" ], "general.c": [ - "ex/HEAD/general.html#git_blob_free-2" + "ex/v0.28.0/general.html#git_blob_free-2" ] } }, @@ -2260,13 +2362,13 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_rawcontent-6" + "ex/v0.28.0/blame.html#git_blob_rawcontent-6" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_blob_rawcontent-1" + "ex/v0.28.0/cat-file.html#git_blob_rawcontent-1" ], "general.c": [ - "ex/HEAD/general.html#git_blob_rawcontent-3" + "ex/v0.28.0/general.html#git_blob_rawcontent-3" ] } }, @@ -2293,14 +2395,14 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_rawsize-7" + "ex/v0.28.0/blame.html#git_blob_rawsize-7" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_blob_rawsize-2" + "ex/v0.28.0/cat-file.html#git_blob_rawsize-2" ], "general.c": [ - "ex/HEAD/general.html#git_blob_rawsize-4", - "ex/HEAD/general.html#git_blob_rawsize-5" + "ex/v0.28.0/general.html#git_blob_rawsize-4", + "ex/v0.28.0/general.html#git_blob_rawsize-5" ] } }, @@ -2844,7 +2946,7 @@ "group": "branch", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_branch_name-4" + "ex/v0.28.0/merge.html#git_branch_name-4" ] } }, @@ -3065,43 +3167,21 @@ "group": "buf", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_buf_dispose-1" + "ex/v0.28.0/diff.html#git_buf_dispose-1" ], "remote.c": [ - "ex/HEAD/remote.html#git_buf_dispose-1" + "ex/v0.28.0/remote.html#git_buf_dispose-1" ], "tag.c": [ - "ex/HEAD/tag.html#git_buf_dispose-1" + "ex/v0.28.0/tag.html#git_buf_dispose-1" ] } }, - "git_buf_free": { - "type": "function", - "file": "git2/buffer.h", - "line": 84, - "lineto": 84, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": null - } - ], - "argline": "git_buf *buffer", - "sig": "git_buf *", - "return": { - "type": "void", - "comment": null - }, - "description": "", - "comments": "", - "group": "buf" - }, "git_buf_grow": { "type": "function", "file": "git2/buffer.h", - "line": 107, - "lineto": 107, + "line": 95, + "lineto": 95, "args": [ { "name": "buffer", @@ -3127,8 +3207,8 @@ "git_buf_set": { "type": "function", "file": "git2/buffer.h", - "line": 117, - "lineto": 118, + "line": 105, + "lineto": 106, "args": [ { "name": "buffer", @@ -3159,8 +3239,8 @@ "git_buf_is_binary": { "type": "function", "file": "git2/buffer.h", - "line": 126, - "lineto": 126, + "line": 114, + "lineto": 114, "args": [ { "name": "buf", @@ -3181,8 +3261,8 @@ "git_buf_contains_nul": { "type": "function", "file": "git2/buffer.h", - "line": 134, - "lineto": 134, + "line": 122, + "lineto": 122, "args": [ { "name": "buf", @@ -3248,7 +3328,7 @@ "sig": "git_repository *::const git_checkout_options *", "return": { "type": "int", - "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use giterr_last for error details)" + "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use git_error_last for error details)" }, "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", "comments": "

Note that this is not the correct mechanism used to switch branches;\n do not change your HEAD and then call this method, that would leave\n you with checkout conflicts since your working directory would then\n appear to be dirty. Instead, checkout the target of the branch and\n then update HEAD using git_repository_set_head to point to the\n branch you checked out.

\n", @@ -3280,7 +3360,7 @@ "sig": "git_repository *::git_index *::const git_checkout_options *", "return": { "type": "int", - "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use giterr_last for error details)" + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" }, "description": "

Updates files in the working tree to match the content of the index.

\n", "comments": "", @@ -3312,17 +3392,17 @@ "sig": "git_repository *::const git_object *::const git_checkout_options *", "return": { "type": "int", - "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use giterr_last for error details)" + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" }, "description": "

Updates files in the index and working tree to match the content of the\n tree pointed at by the treeish.

\n", "comments": "", "group": "checkout", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_checkout_tree-5" + "ex/v0.28.0/checkout.html#git_checkout_tree-5" ], "merge.c": [ - "ex/HEAD/merge.html#git_checkout_tree-5" + "ex/v0.28.0/merge.html#git_checkout_tree-5" ] } }, @@ -3490,7 +3570,7 @@ "sig": "git_repository **::const char *::const char *::const git_clone_options *", "return": { "type": "int", - "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `giterr_last` for a detailed error message)" + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" }, "description": "

Clone a remote repository.

\n", "comments": "

By default this creates its repository and initial remote to match\n git's defaults. You can use the options in the callback to\n customize how these are created.

\n", @@ -3529,18 +3609,18 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_lookup-6" + "ex/v0.28.0/checkout.html#git_commit_lookup-6" ], "general.c": [ - "ex/HEAD/general.html#git_commit_lookup-6", - "ex/HEAD/general.html#git_commit_lookup-7", - "ex/HEAD/general.html#git_commit_lookup-8" + "ex/v0.28.0/general.html#git_commit_lookup-6", + "ex/v0.28.0/general.html#git_commit_lookup-7", + "ex/v0.28.0/general.html#git_commit_lookup-8" ], "log.c": [ - "ex/HEAD/log.html#git_commit_lookup-1" + "ex/v0.28.0/log.html#git_commit_lookup-1" ], "merge.c": [ - "ex/HEAD/merge.html#git_commit_lookup-6" + "ex/v0.28.0/merge.html#git_commit_lookup-6" ] } }, @@ -3604,20 +3684,20 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_free-7" + "ex/v0.28.0/checkout.html#git_commit_free-7" ], "general.c": [ - "ex/HEAD/general.html#git_commit_free-9", - "ex/HEAD/general.html#git_commit_free-10", - "ex/HEAD/general.html#git_commit_free-11", - "ex/HEAD/general.html#git_commit_free-12", - "ex/HEAD/general.html#git_commit_free-13" + "ex/v0.28.0/general.html#git_commit_free-9", + "ex/v0.28.0/general.html#git_commit_free-10", + "ex/v0.28.0/general.html#git_commit_free-11", + "ex/v0.28.0/general.html#git_commit_free-12", + "ex/v0.28.0/general.html#git_commit_free-13" ], "log.c": [ - "ex/HEAD/log.html#git_commit_free-2", - "ex/HEAD/log.html#git_commit_free-3", - "ex/HEAD/log.html#git_commit_free-4", - "ex/HEAD/log.html#git_commit_free-5" + "ex/v0.28.0/log.html#git_commit_free-2", + "ex/v0.28.0/log.html#git_commit_free-3", + "ex/v0.28.0/log.html#git_commit_free-4", + "ex/v0.28.0/log.html#git_commit_free-5" ] } }, @@ -3644,10 +3724,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_id-14" + "ex/v0.28.0/general.html#git_commit_id-14" ], "log.c": [ - "ex/HEAD/log.html#git_commit_id-6" + "ex/v0.28.0/log.html#git_commit_id-6" ] } }, @@ -3674,8 +3754,8 @@ "group": "commit", "examples": { "log.c": [ - "ex/HEAD/log.html#git_commit_owner-7", - "ex/HEAD/log.html#git_commit_owner-8" + "ex/v0.28.0/log.html#git_commit_owner-7", + "ex/v0.28.0/log.html#git_commit_owner-8" ] } }, @@ -3724,21 +3804,21 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_message-3", - "ex/HEAD/cat-file.html#git_commit_message-4" + "ex/v0.28.0/cat-file.html#git_commit_message-3", + "ex/v0.28.0/cat-file.html#git_commit_message-4" ], "general.c": [ - "ex/HEAD/general.html#git_commit_message-15", - "ex/HEAD/general.html#git_commit_message-16", - "ex/HEAD/general.html#git_commit_message-17" + "ex/v0.28.0/general.html#git_commit_message-15", + "ex/v0.28.0/general.html#git_commit_message-16", + "ex/v0.28.0/general.html#git_commit_message-17" ], "log.c": [ - "ex/HEAD/log.html#git_commit_message-9", - "ex/HEAD/log.html#git_commit_message-10", - "ex/HEAD/log.html#git_commit_message-11" + "ex/v0.28.0/log.html#git_commit_message-9", + "ex/v0.28.0/log.html#git_commit_message-10", + "ex/v0.28.0/log.html#git_commit_message-11" ], "tag.c": [ - "ex/HEAD/tag.html#git_commit_message-2" + "ex/v0.28.0/tag.html#git_commit_message-2" ] } }, @@ -3831,8 +3911,8 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_time-18", - "ex/HEAD/general.html#git_commit_time-19" + "ex/v0.28.0/general.html#git_commit_time-18", + "ex/v0.28.0/general.html#git_commit_time-19" ] } }, @@ -3881,13 +3961,13 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_committer-5" + "ex/v0.28.0/cat-file.html#git_commit_committer-5" ], "general.c": [ - "ex/HEAD/general.html#git_commit_committer-20" + "ex/v0.28.0/general.html#git_commit_committer-20" ], "log.c": [ - "ex/HEAD/log.html#git_commit_committer-12" + "ex/v0.28.0/log.html#git_commit_committer-12" ] } }, @@ -3914,15 +3994,15 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_author-6" + "ex/v0.28.0/cat-file.html#git_commit_author-6" ], "general.c": [ - "ex/HEAD/general.html#git_commit_author-21", - "ex/HEAD/general.html#git_commit_author-22" + "ex/v0.28.0/general.html#git_commit_author-21", + "ex/v0.28.0/general.html#git_commit_author-22" ], "log.c": [ - "ex/HEAD/log.html#git_commit_author-13", - "ex/HEAD/log.html#git_commit_author-14" + "ex/v0.28.0/log.html#git_commit_author-13", + "ex/v0.28.0/log.html#git_commit_author-14" ] } }, @@ -4040,11 +4120,11 @@ "group": "commit", "examples": { "log.c": [ - "ex/HEAD/log.html#git_commit_tree-15", - "ex/HEAD/log.html#git_commit_tree-16", - "ex/HEAD/log.html#git_commit_tree-17", - "ex/HEAD/log.html#git_commit_tree-18", - "ex/HEAD/log.html#git_commit_tree-19" + "ex/v0.28.0/log.html#git_commit_tree-15", + "ex/v0.28.0/log.html#git_commit_tree-16", + "ex/v0.28.0/log.html#git_commit_tree-17", + "ex/v0.28.0/log.html#git_commit_tree-18", + "ex/v0.28.0/log.html#git_commit_tree-19" ] } }, @@ -4071,7 +4151,7 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_tree_id-7" + "ex/v0.28.0/cat-file.html#git_commit_tree_id-7" ] } }, @@ -4098,14 +4178,14 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_parentcount-8" + "ex/v0.28.0/cat-file.html#git_commit_parentcount-8" ], "general.c": [ - "ex/HEAD/general.html#git_commit_parentcount-23" + "ex/v0.28.0/general.html#git_commit_parentcount-23" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parentcount-20", - "ex/HEAD/log.html#git_commit_parentcount-21" + "ex/v0.28.0/log.html#git_commit_parentcount-20", + "ex/v0.28.0/log.html#git_commit_parentcount-21" ] } }, @@ -4142,11 +4222,11 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_parent-24" + "ex/v0.28.0/general.html#git_commit_parent-24" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parent-22", - "ex/HEAD/log.html#git_commit_parent-23" + "ex/v0.28.0/log.html#git_commit_parent-22", + "ex/v0.28.0/log.html#git_commit_parent-23" ] } }, @@ -4178,10 +4258,10 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_parent_id-9" + "ex/v0.28.0/cat-file.html#git_commit_parent_id-9" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parent_id-24" + "ex/v0.28.0/log.html#git_commit_parent_id-24" ] } }, @@ -4288,7 +4368,7 @@ "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." }, "description": "

Extract the signature from a commit

\n", - "comments": "

If the id is not for a commit, the error class will be\n GITERR_INVALID. If the commit does not have a signature, the\n error class will be GITERR_OBJECT.

\n", + "comments": "

If the id is not for a commit, the error class will be\n GIT_ERROR_INVALID. If the commit does not have a signature, the\n error class will be GIT_ERROR_OBJECT.

\n", "group": "commit" }, "git_commit_create": { @@ -4359,7 +4439,7 @@ "group": "commit", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_commit_create-7" + "ex/v0.28.0/merge.html#git_commit_create-7" ] } }, @@ -4426,10 +4506,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_create_v-25" + "ex/v0.28.0/general.html#git_commit_create_v-25" ], "init.c": [ - "ex/HEAD/init.html#git_commit_create_v-1" + "ex/v0.28.0/init.html#git_commit_create_v-1" ] } }, @@ -4624,8 +4704,8 @@ "git_libgit2_version": { "type": "function", "file": "git2/common.h", - "line": 116, - "lineto": 116, + "line": 124, + "lineto": 124, "args": [ { "name": "major", @@ -4656,8 +4736,8 @@ "git_libgit2_features": { "type": "function", "file": "git2/common.h", - "line": 165, - "lineto": 165, + "line": 173, + "lineto": 173, "args": [], "argline": "", "sig": "", @@ -4672,8 +4752,8 @@ "git_libgit2_opts": { "type": "function", "file": "git2/common.h", - "line": 393, - "lineto": 393, + "line": 402, + "lineto": 402, "args": [ { "name": "option", @@ -4688,7 +4768,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time\n    by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must\n    > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,\n    > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n    > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path\n    > applied to shared attributes and ignore files, too.\n    >\n    > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.\n    >   Pass NULL to reset to the default (generally based on environment\n    >   variables).  Use magic path `$PATH` to include the old value\n    >   of the path (if you want to prepend or append, for instance).\n    >\n    > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,\n    >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or\n    >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_otype type, size_t size)\n\n    > Set the maximum data size for the given type of object to be\n    > considered eligible for caching in memory.  Setting to value to\n    > zero means that that type of object will not be cached.\n    > Defaults to 0 for GIT_OBJ_BLOB (i.e. won't cache blobs) and 4k\n    > for GIT_OBJ_COMMIT, GIT_OBJ_TREE, and GIT_OBJ_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory\n    > across all repositories before libgit2 starts evicting objects\n    > from the cache.  This is a soft limit, in that the library might\n    > briefly exceed it, but will start aggressively evicting objects\n    > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.\n    >\n    > Because caches are repository-specific, disabling the cache\n    > cannot immediately clear all cached objects, but each cache will\n    > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be\n    > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.\n    > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.\n    >\n    > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.\n    >\n    > - `file` is the location of a file containing several\n    >   certificates concatenated together.\n    > - `path` is the location of a directory holding several\n    >   certificates, one per file.\n    >\n    > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be\n    > appended to "git/1.0", for compatibility with other git clients.\n    >\n    > - `user_agent` is the value that will be delivered as the\n    >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.\n    > For more information, see the documentation for CreateFile.\n    > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is\n    > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects\n    > to ensure that all inputs to the new objects are valid.  For\n    > example, when this is enabled, the parent(s) and tree inputs\n    > will be validated when creating a new commit.  This defaults\n    > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For\n    > example, `foobar` is not a valid ref, therefore `foobar` is\n    > not a valid target for a symbolic ref by default, whereas\n    > `refs/heads/foobar` is.  Disabling this bypasses validation\n    > so that an arbitrary strings such as `foobar` can be used\n    > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.\n    >\n    > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,\n    > and the negotiation of them when talking to a remote server.\n    > Offset deltas store a delta base location as an offset into the\n    > packfile from the current location, which provides a shorter encoding\n    > and thus smaller resultant packfiles.\n    > Packfiles containing offset deltas can still be read.\n    > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`\n    > (or the platform equivalent) to ensure that new object data\n    > is written to permanent storage, not simply cached.  This\n    > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading\n    > objects from disk. This may impact performance due to an\n    > additional checksum calculation on each object. This defaults\n    > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This\n    > allocator will then be used to make all memory allocations for\n    > libgit2 operations.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before\n    > beginning any operation that reloads the index from disk (eg,\n    > checkout).  If there are unsaved changes, the instruction will\n    > fail.  (Using the FORCE flag to checkout will still overwrite\n    > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote. This can be\n    > used to limit maximum memory usage when fetching from an untrusted\n    > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote.\n
\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time\n    by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must\n    > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,\n    > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n    > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path\n    > applied to shared attributes and ignore files, too.\n    >\n    > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.\n    >   Pass NULL to reset to the default (generally based on environment\n    >   variables).  Use magic path `$PATH` to include the old value\n    >   of the path (if you want to prepend or append, for instance).\n    >\n    > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,\n    >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or\n    >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be\n    > considered eligible for caching in memory.  Setting to value to\n    > zero means that that type of object will not be cached.\n    > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k\n    > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory\n    > across all repositories before libgit2 starts evicting objects\n    > from the cache.  This is a soft limit, in that the library might\n    > briefly exceed it, but will start aggressively evicting objects\n    > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.\n    >\n    > Because caches are repository-specific, disabling the cache\n    > cannot immediately clear all cached objects, but each cache will\n    > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be\n    > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.\n    > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.\n    >\n    > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.\n    >\n    > - `file` is the location of a file containing several\n    >   certificates concatenated together.\n    > - `path` is the location of a directory holding several\n    >   certificates, one per file.\n    >\n    > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be\n    > appended to "git/1.0", for compatibility with other git clients.\n    >\n    > - `user_agent` is the value that will be delivered as the\n    >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.\n    > For more information, see the documentation for CreateFile.\n    > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is\n    > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects\n    > to ensure that all inputs to the new objects are valid.  For\n    > example, when this is enabled, the parent(s) and tree inputs\n    > will be validated when creating a new commit.  This defaults\n    > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For\n    > example, `foobar` is not a valid ref, therefore `foobar` is\n    > not a valid target for a symbolic ref by default, whereas\n    > `refs/heads/foobar` is.  Disabling this bypasses validation\n    > so that an arbitrary strings such as `foobar` can be used\n    > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.\n    >\n    > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,\n    > and the negotiation of them when talking to a remote server.\n    > Offset deltas store a delta base location as an offset into the\n    > packfile from the current location, which provides a shorter encoding\n    > and thus smaller resultant packfiles.\n    > Packfiles containing offset deltas can still be read.\n    > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`\n    > (or the platform equivalent) to ensure that new object data\n    > is written to permanent storage, not simply cached.  This\n    > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading\n    > objects from disk. This may impact performance due to an\n    > additional checksum calculation on each object. This defaults\n    > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This\n    > allocator will then be used to make all memory allocations for\n    > libgit2 operations.  If the given `allocator` is NULL, then the\n    > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before\n    > beginning any operation that reloads the index from disk (eg,\n    > checkout).  If there are unsaved changes, the instruction will\n    > fail.  (Using the FORCE flag to checkout will still overwrite\n    > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote. This can be\n    > used to limit maximum memory usage when fetching from an untrusted\n    > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote.\n
\n", "group": "libgit2" }, "git_config_entry_free": { @@ -4915,7 +4995,7 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_open_ondisk-26" + "ex/v0.28.0/general.html#git_config_open_ondisk-26" ] } }, @@ -5028,8 +5108,8 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_free-27", - "ex/HEAD/general.html#git_config_free-28" + "ex/v0.28.0/general.html#git_config_free-27", + "ex/v0.28.0/general.html#git_config_free-28" ] } }, @@ -5073,33 +5153,33 @@ "args": [ { "name": "out", - "type": "int32_t *", - "comment": "pointer to the variable where the value should be stored" + "type": "int *", + "comment": null }, { "name": "cfg", "type": "const git_config *", - "comment": "where to look for the variable" + "comment": null }, { "name": "name", "type": "const char *", - "comment": "the variable's name" + "comment": null } ], - "argline": "int32_t *out, const git_config *cfg, const char *name", - "sig": "int32_t *::const git_config *::const char *", + "argline": "int *out, const git_config *cfg, const char *name", + "sig": "int *::const git_config *::const char *", "return": { "type": "int", - "comment": " 0 or an error code" + "comment": null }, - "description": "

Get the value of an integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", + "description": "", + "comments": "", "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_get_int32-29", - "ex/HEAD/general.html#git_config_get_int32-30" + "ex/v0.28.0/general.html#git_config_get_int32-29", + "ex/v0.28.0/general.html#git_config_get_int32-30" ] } }, @@ -5111,28 +5191,28 @@ "args": [ { "name": "out", - "type": "int64_t *", - "comment": "pointer to the variable where the value should be stored" + "type": "int *", + "comment": null }, { "name": "cfg", "type": "const git_config *", - "comment": "where to look for the variable" + "comment": null }, { "name": "name", "type": "const char *", - "comment": "the variable's name" + "comment": null } ], - "argline": "int64_t *out, const git_config *cfg, const char *name", - "sig": "int64_t *::const git_config *::const char *", + "argline": "int *out, const git_config *cfg, const char *name", + "sig": "int *::const git_config *::const char *", "return": { "type": "int", - "comment": " 0 or an error code" + "comment": null }, - "description": "

Get the value of a long integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", + "description": "", + "comments": "", "group": "config" }, "git_config_get_bool": { @@ -5232,8 +5312,8 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_get_string-31", - "ex/HEAD/general.html#git_config_get_string-32" + "ex/v0.28.0/general.html#git_config_get_string-31", + "ex/v0.28.0/general.html#git_config_get_string-32" ] } }, @@ -5406,26 +5486,26 @@ { "name": "cfg", "type": "git_config *", - "comment": "where to look for the variable" + "comment": null }, { "name": "name", "type": "const char *", - "comment": "the variable's name" + "comment": null }, { "name": "value", - "type": "int32_t", - "comment": "Integer value for the variable" + "type": "int", + "comment": null } ], - "argline": "git_config *cfg, const char *name, int32_t value", - "sig": "git_config *::const char *::int32_t", + "argline": "git_config *cfg, const char *name, int value", + "sig": "git_config *::const char *::int", "return": { "type": "int", - "comment": " 0 or an error code" + "comment": null }, - "description": "

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n", + "description": "", "comments": "", "group": "config" }, @@ -5438,26 +5518,26 @@ { "name": "cfg", "type": "git_config *", - "comment": "where to look for the variable" + "comment": null }, { "name": "name", "type": "const char *", - "comment": "the variable's name" + "comment": null }, { "name": "value", - "type": "int64_t", - "comment": "Long integer value for the variable" + "type": "int", + "comment": null } ], - "argline": "git_config *cfg, const char *name, int64_t value", - "sig": "git_config *::const char *::int64_t", + "argline": "git_config *cfg, const char *name, int value", + "sig": "git_config *::const char *::int", "return": { "type": "int", - "comment": " 0 or an error code" + "comment": null }, - "description": "

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n", + "description": "", "comments": "", "group": "config" }, @@ -5863,23 +5943,23 @@ "args": [ { "name": "out", - "type": "int32_t *", - "comment": "place to store the result of the parsing" + "type": "int *", + "comment": null }, { "name": "value", "type": "const char *", - "comment": "value to parse" + "comment": null } ], - "argline": "int32_t *out, const char *value", - "sig": "int32_t *::const char *", + "argline": "int *out, const char *value", + "sig": "int *::const char *", "return": { "type": "int", "comment": null }, - "description": "

Parse a string value as an int32.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will\n cause the value to be multiplied by 1024, 1048576,\n or 1073741824 prior to output.

\n", + "description": "", + "comments": "", "group": "config" }, "git_config_parse_int64": { @@ -5890,23 +5970,23 @@ "args": [ { "name": "out", - "type": "int64_t *", - "comment": "place to store the result of the parsing" + "type": "int *", + "comment": null }, { "name": "value", "type": "const char *", - "comment": "value to parse" + "comment": null } ], - "argline": "int64_t *out, const char *value", - "sig": "int64_t *::const char *", + "argline": "int *out, const char *value", + "sig": "int *::const char *", "return": { "type": "int", "comment": null }, - "description": "

Parse a string value as an int64.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will\n cause the value to be multiplied by 1024, 1048576,\n or 1073741824 prior to output.

\n", + "description": "", + "comments": "", "group": "config" }, "git_config_parse_path": { @@ -6042,6 +6122,103 @@ "comments": "", "group": "cred" }, + "git_buf_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 51, + "lineto": 51, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": null + } + ], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory referred to by the git_buf. This is an alias of\n git_buf_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "group": "buf" + }, + "giterr_last": { + "type": "function", + "file": "git2/deprecated.h", + "line": 112, + "lineto": 112, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const git_error *", + "comment": null + }, + "description": "

Return the last git_error object that was generated for the\n current thread. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "group": "giterr" + }, + "giterr_clear": { + "type": "function", + "file": "git2/deprecated.h", + "line": 124, + "lineto": 124, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "void", + "comment": null + }, + "description": "

Clear the last error. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "group": "giterr" + }, + "giterr_set_str": { + "type": "function", + "file": "git2/deprecated.h", + "line": 136, + "lineto": 136, + "args": [ + { + "name": "error_class", + "type": "int", + "comment": null + }, + { + "name": "string", + "type": "const char *", + "comment": null + } + ], + "argline": "int error_class, const char *string", + "sig": "int::const char *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Sets the error message to the given string. This is an alias of\n git_error_set_str and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "group": "giterr" + }, + "giterr_set_oom": { + "type": "function", + "file": "git2/deprecated.h", + "line": 148, + "lineto": 148, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "void", + "comment": null + }, + "description": "

Indicates that an out-of-memory situation occured. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "group": "giterr" + }, "git_describe_init_options": { "type": "function", "file": "git2/describe.h", @@ -6070,7 +6247,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_init_options-1" + "ex/v0.28.0/describe.html#git_describe_init_options-1" ] } }, @@ -6102,7 +6279,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_init_format_options-2" + "ex/v0.28.0/describe.html#git_describe_init_format_options-2" ] } }, @@ -6139,7 +6316,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_commit-3" + "ex/v0.28.0/describe.html#git_describe_commit-3" ] } }, @@ -6176,7 +6353,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_workdir-4" + "ex/v0.28.0/describe.html#git_describe_workdir-4" ] } }, @@ -6213,7 +6390,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_format-5" + "ex/v0.28.0/describe.html#git_describe_format-5" ] } }, @@ -6316,11 +6493,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_free-2" + "ex/v0.28.0/diff.html#git_diff_free-2" ], "log.c": [ - "ex/HEAD/log.html#git_diff_free-25", - "ex/HEAD/log.html#git_diff_free-26" + "ex/v0.28.0/log.html#git_diff_free-25", + "ex/v0.28.0/log.html#git_diff_free-26" ] } }, @@ -6367,11 +6544,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_tree-3" + "ex/v0.28.0/diff.html#git_diff_tree_to_tree-3" ], "log.c": [ - "ex/HEAD/log.html#git_diff_tree_to_tree-27", - "ex/HEAD/log.html#git_diff_tree_to_tree-28" + "ex/v0.28.0/log.html#git_diff_tree_to_tree-27", + "ex/v0.28.0/log.html#git_diff_tree_to_tree-28" ] } }, @@ -6418,7 +6595,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_index-4" + "ex/v0.28.0/diff.html#git_diff_tree_to_index-4" ] } }, @@ -6460,7 +6637,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_index_to_workdir-5" + "ex/v0.28.0/diff.html#git_diff_index_to_workdir-5" ] } }, @@ -6502,7 +6679,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir-6" + "ex/v0.28.0/diff.html#git_diff_tree_to_workdir-6" ] } }, @@ -6544,7 +6721,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir_with_index-7" + "ex/v0.28.0/diff.html#git_diff_tree_to_workdir_with_index-7" ] } }, @@ -6645,7 +6822,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_find_similar-8" + "ex/v0.28.0/diff.html#git_diff_find_similar-8" ] } }, @@ -6672,7 +6849,7 @@ "group": "diff", "examples": { "log.c": [ - "ex/HEAD/log.html#git_diff_num_deltas-29" + "ex/v0.28.0/log.html#git_diff_num_deltas-29" ] } }, @@ -6859,10 +7036,10 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_print-9" + "ex/v0.28.0/diff.html#git_diff_print-9" ], "log.c": [ - "ex/HEAD/log.html#git_diff_print-30" + "ex/v0.28.0/log.html#git_diff_print-30" ] } }, @@ -7174,7 +7351,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_get_stats-10" + "ex/v0.28.0/diff.html#git_diff_get_stats-10" ] } }, @@ -7282,7 +7459,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_to_buf-11" + "ex/v0.28.0/diff.html#git_diff_stats_to_buf-11" ] } }, @@ -7309,7 +7486,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_free-12" + "ex/v0.28.0/diff.html#git_diff_stats_free-12" ] } }, @@ -7483,11 +7660,11 @@ "comments": "

Calculate a stable patch ID for the given patch by summing the\n hash of the file diffs, ignoring whitespace and line numbers.\n This can be used to derive whether two diffs are the same with\n a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as\n defined in git-patch-id(1), and should in fact generate the\n same IDs as the upstream git project does.

\n", "group": "diff" }, - "giterr_last": { + "git_error_last": { "type": "function", "file": "git2/errors.h", - "line": 122, - "lineto": 122, + "line": 123, + "lineto": 123, "args": [], "argline": "", "sig": "", @@ -7497,28 +7674,28 @@ }, "description": "

Return the last git_error object that was generated for the\n current thread.

\n", "comments": "

The default behaviour of this function is to return NULL if no previous error has occurred.\n However, libgit2's error strings are not cleared aggressively, so a prior\n (unrelated) error may be returned. This can be avoided by only calling\n this function if the prior call to a libgit2 API returned an error.

\n", - "group": "giterr", + "group": "error", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#giterr_last-8", - "ex/HEAD/checkout.html#giterr_last-9", - "ex/HEAD/checkout.html#giterr_last-10", - "ex/HEAD/checkout.html#giterr_last-11" + "ex/v0.28.0/checkout.html#git_error_last-8", + "ex/v0.28.0/checkout.html#git_error_last-9", + "ex/v0.28.0/checkout.html#git_error_last-10", + "ex/v0.28.0/checkout.html#git_error_last-11" ], "general.c": [ - "ex/HEAD/general.html#giterr_last-33" + "ex/v0.28.0/general.html#git_error_last-33" ], "merge.c": [ - "ex/HEAD/merge.html#giterr_last-8", - "ex/HEAD/merge.html#giterr_last-9" + "ex/v0.28.0/merge.html#git_error_last-8", + "ex/v0.28.0/merge.html#git_error_last-9" ] } }, - "giterr_clear": { + "git_error_clear": { "type": "function", "file": "git2/errors.h", - "line": 127, - "lineto": 127, + "line": 128, + "lineto": 128, "args": [], "argline": "", "sig": "", @@ -7528,13 +7705,13 @@ }, "description": "

Clear the last library error that occurred for this thread.

\n", "comments": "", - "group": "giterr" + "group": "error" }, - "giterr_set_str": { + "git_error_set_str": { "type": "function", "file": "git2/errors.h", - "line": 145, - "lineto": 145, + "line": 146, + "lineto": 146, "args": [ { "name": "error_class", @@ -7555,13 +7732,13 @@ }, "description": "

Set the error message string for this thread.

\n", "comments": "

This function is public so that custom ODB backends and the like can\n relay an error message through libgit2. Most regular users of libgit2\n will never need to call this function -- actually, calling it in most\n circumstances (for example, calling from within a callback function)\n will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies\n to the particular thread that this libgit2 call is made from.

\n", - "group": "giterr" + "group": "error" }, - "giterr_set_oom": { + "git_error_set_oom": { "type": "function", "file": "git2/errors.h", - "line": 156, - "lineto": 156, + "line": 157, + "lineto": 157, "args": [], "argline": "", "sig": "", @@ -7570,8 +7747,8 @@ "comment": null }, "description": "

Set the error message to a special value for memory allocation failure.

\n", - "comments": "

The normal giterr_set_str() function attempts to strdup() the string\n that is passed in. This is not a good idea when the error in question\n is a memory allocation failure. That circumstance has a special setter\n function that sets the error string to a known and statically allocated\n internal value.

\n", - "group": "giterr" + "comments": "

The normal git_error_set_str() function attempts to strdup() the\n string that is passed in. This is not a good idea when the error in\n question is a memory allocation failure. That circumstance has a\n special setter function that sets the error string to a known and\n statically allocated internal value.

\n", + "group": "error" }, "git_filter_list_load": { "type": "function", @@ -7582,42 +7759,42 @@ { "name": "filters", "type": "git_filter_list **", - "comment": "Output newly created git_filter_list (or NULL)" + "comment": null }, { "name": "repo", "type": "git_repository *", - "comment": "Repository object that contains `path`" + "comment": null }, { "name": "blob", "type": "git_blob *", - "comment": "The blob to which the filter will be applied (if known)" + "comment": null }, { "name": "path", "type": "const char *", - "comment": "Relative path of the file to be filtered" + "comment": null }, { "name": "mode", "type": "git_filter_mode_t", - "comment": "Filtering direction (WT->ODB or ODB->WT)" + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "Combination of `git_filter_flag_t` flags" + "type": "int", + "comment": null } ], - "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags", - "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t", + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, int flags", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::int", "return": { "type": "int", - "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + "comment": null }, - "description": "

Load the filter list for a given path.

\n", - "comments": "

This will return 0 (success) but set the output git_filter_list to NULL\n if no filters are requested for the given file.

\n", + "description": "", + "comments": "", "group": "filter" }, "git_filter_list_contains": { @@ -7888,46 +8065,46 @@ "group": "libgit2", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_libgit2_init-8" + "ex/v0.28.0/blame.html#git_libgit2_init-8" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_libgit2_init-10" + "ex/v0.28.0/cat-file.html#git_libgit2_init-10" ], "checkout.c": [ - "ex/HEAD/checkout.html#git_libgit2_init-12" + "ex/v0.28.0/checkout.html#git_libgit2_init-12" ], "describe.c": [ - "ex/HEAD/describe.html#git_libgit2_init-6" + "ex/v0.28.0/describe.html#git_libgit2_init-6" ], "diff.c": [ - "ex/HEAD/diff.html#git_libgit2_init-13" + "ex/v0.28.0/diff.html#git_libgit2_init-13" ], "general.c": [ - "ex/HEAD/general.html#git_libgit2_init-34" + "ex/v0.28.0/general.html#git_libgit2_init-34" ], "init.c": [ - "ex/HEAD/init.html#git_libgit2_init-2" + "ex/v0.28.0/init.html#git_libgit2_init-2" ], "log.c": [ - "ex/HEAD/log.html#git_libgit2_init-31" + "ex/v0.28.0/log.html#git_libgit2_init-31" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_libgit2_init-1" + "ex/v0.28.0/ls-files.html#git_libgit2_init-1" ], "merge.c": [ - "ex/HEAD/merge.html#git_libgit2_init-10" + "ex/v0.28.0/merge.html#git_libgit2_init-10" ], "remote.c": [ - "ex/HEAD/remote.html#git_libgit2_init-2" + "ex/v0.28.0/remote.html#git_libgit2_init-2" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_libgit2_init-1" + "ex/v0.28.0/rev-parse.html#git_libgit2_init-1" ], "status.c": [ - "ex/HEAD/status.html#git_libgit2_init-1" + "ex/v0.28.0/status.html#git_libgit2_init-1" ], "tag.c": [ - "ex/HEAD/tag.html#git_libgit2_init-3" + "ex/v0.28.0/tag.html#git_libgit2_init-3" ] } }, @@ -7948,43 +8125,43 @@ "group": "libgit2", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_libgit2_shutdown-9" + "ex/v0.28.0/blame.html#git_libgit2_shutdown-9" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_libgit2_shutdown-11" + "ex/v0.28.0/cat-file.html#git_libgit2_shutdown-11" ], "checkout.c": [ - "ex/HEAD/checkout.html#git_libgit2_shutdown-13" + "ex/v0.28.0/checkout.html#git_libgit2_shutdown-13" ], "describe.c": [ - "ex/HEAD/describe.html#git_libgit2_shutdown-7" + "ex/v0.28.0/describe.html#git_libgit2_shutdown-7" ], "diff.c": [ - "ex/HEAD/diff.html#git_libgit2_shutdown-14" + "ex/v0.28.0/diff.html#git_libgit2_shutdown-14" ], "init.c": [ - "ex/HEAD/init.html#git_libgit2_shutdown-3" + "ex/v0.28.0/init.html#git_libgit2_shutdown-3" ], "log.c": [ - "ex/HEAD/log.html#git_libgit2_shutdown-32" + "ex/v0.28.0/log.html#git_libgit2_shutdown-32" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_libgit2_shutdown-2" + "ex/v0.28.0/ls-files.html#git_libgit2_shutdown-2" ], "merge.c": [ - "ex/HEAD/merge.html#git_libgit2_shutdown-11" + "ex/v0.28.0/merge.html#git_libgit2_shutdown-11" ], "remote.c": [ - "ex/HEAD/remote.html#git_libgit2_shutdown-3" + "ex/v0.28.0/remote.html#git_libgit2_shutdown-3" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_libgit2_shutdown-2" + "ex/v0.28.0/rev-parse.html#git_libgit2_shutdown-2" ], "status.c": [ - "ex/HEAD/status.html#git_libgit2_shutdown-2" + "ex/v0.28.0/status.html#git_libgit2_shutdown-2" ], "tag.c": [ - "ex/HEAD/tag.html#git_libgit2_shutdown-4" + "ex/v0.28.0/tag.html#git_libgit2_shutdown-4" ] } }, @@ -8146,8 +8323,8 @@ "git_index_open": { "type": "function", "file": "git2/index.h", - "line": 203, - "lineto": 203, + "line": 186, + "lineto": 186, "args": [ { "name": "out", @@ -8173,8 +8350,8 @@ "git_index_new": { "type": "function", "file": "git2/index.h", - "line": 216, - "lineto": 216, + "line": 199, + "lineto": 199, "args": [ { "name": "out", @@ -8195,8 +8372,8 @@ "git_index_free": { "type": "function", "file": "git2/index.h", - "line": 223, - "lineto": 223, + "line": 206, + "lineto": 206, "args": [ { "name": "index", @@ -8215,21 +8392,21 @@ "group": "index", "examples": { "general.c": [ - "ex/HEAD/general.html#git_index_free-35" + "ex/v0.28.0/general.html#git_index_free-35" ], "init.c": [ - "ex/HEAD/init.html#git_index_free-4" + "ex/v0.28.0/init.html#git_index_free-4" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_free-3" + "ex/v0.28.0/ls-files.html#git_index_free-3" ] } }, "git_index_owner": { "type": "function", "file": "git2/index.h", - "line": 231, - "lineto": 231, + "line": 214, + "lineto": 214, "args": [ { "name": "index", @@ -8250,8 +8427,8 @@ "git_index_caps": { "type": "function", "file": "git2/index.h", - "line": 239, - "lineto": 239, + "line": 222, + "lineto": 222, "args": [ { "name": "index", @@ -8263,7 +8440,7 @@ "sig": "const git_index *", "return": { "type": "int", - "comment": " A combination of GIT_INDEXCAP values" + "comment": " A combination of GIT_INDEX_CAPABILITY values" }, "description": "

Read index capabilities flags.

\n", "comments": "", @@ -8272,8 +8449,8 @@ "git_index_set_caps": { "type": "function", "file": "git2/index.h", - "line": 252, - "lineto": 252, + "line": 235, + "lineto": 235, "args": [ { "name": "index", @@ -8283,7 +8460,7 @@ { "name": "caps", "type": "int", - "comment": "A combination of GIT_INDEXCAP values" + "comment": "A combination of GIT_INDEX_CAPABILITY values" } ], "argline": "git_index *index, int caps", @@ -8293,14 +8470,14 @@ "comment": " 0 on success, -1 on failure" }, "description": "

Set index capabilities flags.

\n", - "comments": "

If you pass GIT_INDEXCAP_FROM_OWNER for the caps, then the\n capabilities will be read from the config of the owner object,\n looking at core.ignorecase, core.filemode, core.symlinks.

\n", + "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then\n capabilities will be read from the config of the owner object,\n looking at core.ignorecase, core.filemode, core.symlinks.

\n", "group": "index" }, "git_index_version": { "type": "function", "file": "git2/index.h", - "line": 264, - "lineto": 264, + "line": 247, + "lineto": 247, "args": [ { "name": "index", @@ -8321,8 +8498,8 @@ "git_index_set_version": { "type": "function", "file": "git2/index.h", - "line": 277, - "lineto": 277, + "line": 260, + "lineto": 260, "args": [ { "name": "index", @@ -8348,8 +8525,8 @@ "git_index_read": { "type": "function", "file": "git2/index.h", - "line": 296, - "lineto": 296, + "line": 279, + "lineto": 279, "args": [ { "name": "index", @@ -8375,8 +8552,8 @@ "git_index_write": { "type": "function", "file": "git2/index.h", - "line": 305, - "lineto": 305, + "line": 288, + "lineto": 288, "args": [ { "name": "index", @@ -8397,8 +8574,8 @@ "git_index_path": { "type": "function", "file": "git2/index.h", - "line": 313, - "lineto": 313, + "line": 296, + "lineto": 296, "args": [ { "name": "index", @@ -8419,8 +8596,8 @@ "git_index_checksum": { "type": "function", "file": "git2/index.h", - "line": 325, - "lineto": 325, + "line": 308, + "lineto": 308, "args": [ { "name": "index", @@ -8441,8 +8618,8 @@ "git_index_read_tree": { "type": "function", "file": "git2/index.h", - "line": 336, - "lineto": 336, + "line": 319, + "lineto": 319, "args": [ { "name": "index", @@ -8468,8 +8645,8 @@ "git_index_write_tree": { "type": "function", "file": "git2/index.h", - "line": 357, - "lineto": 357, + "line": 340, + "lineto": 340, "args": [ { "name": "out", @@ -8493,18 +8670,18 @@ "group": "index", "examples": { "init.c": [ - "ex/HEAD/init.html#git_index_write_tree-5" + "ex/v0.28.0/init.html#git_index_write_tree-5" ], "merge.c": [ - "ex/HEAD/merge.html#git_index_write_tree-12" + "ex/v0.28.0/merge.html#git_index_write_tree-12" ] } }, "git_index_write_tree_to": { "type": "function", "file": "git2/index.h", - "line": 374, - "lineto": 374, + "line": 357, + "lineto": 357, "args": [ { "name": "out", @@ -8535,8 +8712,8 @@ "git_index_entrycount": { "type": "function", "file": "git2/index.h", - "line": 393, - "lineto": 393, + "line": 376, + "lineto": 376, "args": [ { "name": "index", @@ -8555,18 +8732,18 @@ "group": "index", "examples": { "general.c": [ - "ex/HEAD/general.html#git_index_entrycount-36" + "ex/v0.28.0/general.html#git_index_entrycount-36" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_entrycount-4" + "ex/v0.28.0/ls-files.html#git_index_entrycount-4" ] } }, "git_index_clear": { "type": "function", "file": "git2/index.h", - "line": 404, - "lineto": 404, + "line": 387, + "lineto": 387, "args": [ { "name": "index", @@ -8587,8 +8764,8 @@ "git_index_get_byindex": { "type": "function", "file": "git2/index.h", - "line": 417, - "lineto": 418, + "line": 400, + "lineto": 401, "args": [ { "name": "index", @@ -8612,18 +8789,18 @@ "group": "index", "examples": { "general.c": [ - "ex/HEAD/general.html#git_index_get_byindex-37" + "ex/v0.28.0/general.html#git_index_get_byindex-37" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_get_byindex-5" + "ex/v0.28.0/ls-files.html#git_index_get_byindex-5" ] } }, "git_index_get_bypath": { "type": "function", "file": "git2/index.h", - "line": 432, - "lineto": 433, + "line": 415, + "lineto": 416, "args": [ { "name": "index", @@ -8652,15 +8829,15 @@ "group": "index", "examples": { "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_get_bypath-6" + "ex/v0.28.0/ls-files.html#git_index_get_bypath-6" ] } }, "git_index_remove": { "type": "function", "file": "git2/index.h", - "line": 443, - "lineto": 443, + "line": 426, + "lineto": 426, "args": [ { "name": "index", @@ -8691,8 +8868,8 @@ "git_index_remove_directory": { "type": "function", "file": "git2/index.h", - "line": 453, - "lineto": 454, + "line": 436, + "lineto": 437, "args": [ { "name": "index", @@ -8723,8 +8900,8 @@ "git_index_add": { "type": "function", "file": "git2/index.h", - "line": 470, - "lineto": 470, + "line": 453, + "lineto": 453, "args": [ { "name": "index", @@ -8750,8 +8927,8 @@ "git_index_entry_stage": { "type": "function", "file": "git2/index.h", - "line": 482, - "lineto": 482, + "line": 465, + "lineto": 465, "args": [ { "name": "entry", @@ -8766,14 +8943,14 @@ "comment": " the stage number" }, "description": "

Return the stage number from a git index entry

\n", - "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags \n
\n\n

&\n GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT

\n", + "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags \n
\n\n

&\n GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT

\n", "group": "index" }, "git_index_entry_is_conflict": { "type": "function", "file": "git2/index.h", - "line": 491, - "lineto": 491, + "line": 474, + "lineto": 474, "args": [ { "name": "entry", @@ -8791,11 +8968,87 @@ "comments": "", "group": "index" }, + "git_index_iterator_new": { + "type": "function", + "file": "git2/index.h", + "line": 494, + "lineto": 496, + "args": [ + { + "name": "iterator_out", + "type": "git_index_iterator **", + "comment": "The newly created iterator" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to iterate" + } + ], + "argline": "git_index_iterator **iterator_out, git_index *index", + "sig": "git_index_iterator **::git_index *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create an iterator that will return every entry contained in the\n index at the time of creation. Entries are returned in order,\n sorted by path. This iterator is backed by a snapshot that allows\n callers to modify the index while iterating without affecting the\n iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_next": { + "type": "function", + "file": "git2/index.h", + "line": 505, + "lineto": 507, + "args": [ + { + "name": "out", + "type": "const git_index_entry **", + "comment": "Pointer to store the index entry in" + }, + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator" + } + ], + "argline": "const git_index_entry **out, git_index_iterator *iterator", + "sig": "const git_index_entry **::git_index_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER on iteration completion or an error code" + }, + "description": "

Return the next index entry in-order from the iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_free": { + "type": "function", + "file": "git2/index.h", + "line": 514, + "lineto": 514, + "args": [ + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator to free" + } + ], + "argline": "git_index_iterator *iterator", + "sig": "git_index_iterator *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the index iterator

\n", + "comments": "", + "group": "index" + }, "git_index_add_bypath": { "type": "function", "file": "git2/index.h", - "line": 522, - "lineto": 522, + "line": 545, + "lineto": 545, "args": [ { "name": "index", @@ -8821,8 +9074,8 @@ "git_index_add_frombuffer": { "type": "function", "file": "git2/index.h", - "line": 551, - "lineto": 554, + "line": 574, + "lineto": 577, "args": [ { "name": "index", @@ -8858,8 +9111,8 @@ "git_index_remove_bypath": { "type": "function", "file": "git2/index.h", - "line": 570, - "lineto": 570, + "line": 593, + "lineto": 593, "args": [ { "name": "index", @@ -8885,8 +9138,8 @@ "git_index_add_all": { "type": "function", "file": "git2/index.h", - "line": 618, - "lineto": 623, + "line": 641, + "lineto": 646, "args": [ { "name": "index", @@ -8927,8 +9180,8 @@ "git_index_remove_all": { "type": "function", "file": "git2/index.h", - "line": 640, - "lineto": 644, + "line": 663, + "lineto": 667, "args": [ { "name": "index", @@ -8964,8 +9217,8 @@ "git_index_update_all": { "type": "function", "file": "git2/index.h", - "line": 669, - "lineto": 673, + "line": 692, + "lineto": 696, "args": [ { "name": "index", @@ -9001,8 +9254,8 @@ "git_index_find": { "type": "function", "file": "git2/index.h", - "line": 684, - "lineto": 684, + "line": 707, + "lineto": 707, "args": [ { "name": "at_pos", @@ -9033,8 +9286,8 @@ "git_index_find_prefix": { "type": "function", "file": "git2/index.h", - "line": 695, - "lineto": 695, + "line": 718, + "lineto": 718, "args": [ { "name": "at_pos", @@ -9065,8 +9318,8 @@ "git_index_conflict_add": { "type": "function", "file": "git2/index.h", - "line": 720, - "lineto": 724, + "line": 743, + "lineto": 747, "args": [ { "name": "index", @@ -9102,8 +9355,8 @@ "git_index_conflict_get": { "type": "function", "file": "git2/index.h", - "line": 740, - "lineto": 745, + "line": 763, + "lineto": 768, "args": [ { "name": "ancestor_out", @@ -9144,8 +9397,8 @@ "git_index_conflict_remove": { "type": "function", "file": "git2/index.h", - "line": 754, - "lineto": 754, + "line": 777, + "lineto": 777, "args": [ { "name": "index", @@ -9171,8 +9424,8 @@ "git_index_conflict_cleanup": { "type": "function", "file": "git2/index.h", - "line": 762, - "lineto": 762, + "line": 785, + "lineto": 785, "args": [ { "name": "index", @@ -9193,8 +9446,8 @@ "git_index_has_conflicts": { "type": "function", "file": "git2/index.h", - "line": 769, - "lineto": 769, + "line": 792, + "lineto": 792, "args": [ { "name": "index", @@ -9213,15 +9466,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_has_conflicts-13" + "ex/v0.28.0/merge.html#git_index_has_conflicts-13" ] } }, "git_index_conflict_iterator_new": { "type": "function", "file": "git2/index.h", - "line": 780, - "lineto": 782, + "line": 803, + "lineto": 805, "args": [ { "name": "iterator_out", @@ -9245,15 +9498,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_new-14" + "ex/v0.28.0/merge.html#git_index_conflict_iterator_new-14" ] } }, "git_index_conflict_next": { "type": "function", "file": "git2/index.h", - "line": 794, - "lineto": 798, + "line": 817, + "lineto": 821, "args": [ { "name": "ancestor_out", @@ -9287,15 +9540,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_next-15" + "ex/v0.28.0/merge.html#git_index_conflict_next-15" ] } }, "git_index_conflict_iterator_free": { "type": "function", "file": "git2/index.h", - "line": 805, - "lineto": 806, + "line": 828, + "lineto": 829, "args": [ { "name": "iterator", @@ -9314,7 +9567,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_free-16" + "ex/v0.28.0/merge.html#git_index_conflict_iterator_free-16" ] } }, @@ -9865,15 +10118,62 @@ "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge_analysis-17" + "ex/v0.28.0/merge.html#git_merge_analysis-17" ] } }, + "git_merge_analysis_for_ref": { + "type": "function", + "file": "git2/merge.h", + "line": 402, + "lineto": 408, + "args": [ + { + "name": "analysis_out", + "type": "git_merge_analysis_t *", + "comment": "analysis enumeration that the result is written into" + }, + { + "name": "preference_out", + "type": "git_merge_preference_t *", + "comment": null + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "our_ref", + "type": "git_reference *", + "comment": "the reference to perform the analysis from" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + } + ], + "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, git_reference *our_ref, const git_annotated_commit **their_heads, size_t their_heads_len", + "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::git_reference *::const git_annotated_commit **::size_t", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into a reference.

\n", + "comments": "", + "group": "merge" + }, "git_merge_base": { "type": "function", "file": "git2/merge.h", - "line": 400, - "lineto": 404, + "line": 419, + "lineto": 423, "args": [ { "name": "out", @@ -9907,18 +10207,18 @@ "group": "merge", "examples": { "log.c": [ - "ex/HEAD/log.html#git_merge_base-33" + "ex/v0.28.0/log.html#git_merge_base-33" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_merge_base-3" + "ex/v0.28.0/rev-parse.html#git_merge_base-3" ] } }, "git_merge_bases": { "type": "function", "file": "git2/merge.h", - "line": 415, - "lineto": 419, + "line": 434, + "lineto": 438, "args": [ { "name": "out", @@ -9954,8 +10254,8 @@ "git_merge_base_many": { "type": "function", "file": "git2/merge.h", - "line": 430, - "lineto": 434, + "line": 449, + "lineto": 453, "args": [ { "name": "out", @@ -9991,8 +10291,8 @@ "git_merge_bases_many": { "type": "function", "file": "git2/merge.h", - "line": 445, - "lineto": 449, + "line": 464, + "lineto": 468, "args": [ { "name": "out", @@ -10028,8 +10328,8 @@ "git_merge_base_octopus": { "type": "function", "file": "git2/merge.h", - "line": 460, - "lineto": 464, + "line": 479, + "lineto": 483, "args": [ { "name": "out", @@ -10065,8 +10365,8 @@ "git_merge_file": { "type": "function", "file": "git2/merge.h", - "line": 482, - "lineto": 487, + "line": 501, + "lineto": 506, "args": [ { "name": "out", @@ -10107,8 +10407,8 @@ "git_merge_file_from_index": { "type": "function", "file": "git2/merge.h", - "line": 503, - "lineto": 509, + "line": 522, + "lineto": 528, "args": [ { "name": "out", @@ -10154,8 +10454,8 @@ "git_merge_file_result_free": { "type": "function", "file": "git2/merge.h", - "line": 516, - "lineto": 516, + "line": 535, + "lineto": 535, "args": [ { "name": "result", @@ -10176,8 +10476,8 @@ "git_merge_trees": { "type": "function", "file": "git2/merge.h", - "line": 534, - "lineto": 540, + "line": 553, + "lineto": 559, "args": [ { "name": "out", @@ -10223,8 +10523,8 @@ "git_merge_commits": { "type": "function", "file": "git2/merge.h", - "line": 557, - "lineto": 562, + "line": 576, + "lineto": 581, "args": [ { "name": "out", @@ -10265,8 +10565,8 @@ "git_merge": { "type": "function", "file": "git2/merge.h", - "line": 582, - "lineto": 587, + "line": 601, + "lineto": 606, "args": [ { "name": "repo", @@ -10305,7 +10605,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge-18" + "ex/v0.28.0/merge.html#git_merge-18" ] } }, @@ -10987,25 +11287,25 @@ }, { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "the type of the object" } ], - "argline": "git_object **object, git_repository *repo, const git_oid *id, git_otype type", - "sig": "git_object **::git_repository *::const git_oid *::git_otype", + "argline": "git_object **object, git_repository *repo, const git_oid *id, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::git_object_t", "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Lookup a reference to one of the objects in a repository.

\n", - "comments": "

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJ_ANY' may be passed to let\n the method guess the object's type.

\n", + "comments": "

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJECT_ANY' may be passed to let\n the method guess the object's type.

\n", "group": "object", "examples": { "log.c": [ - "ex/HEAD/log.html#git_object_lookup-34" + "ex/v0.28.0/log.html#git_object_lookup-34" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_lookup-19" + "ex/v0.28.0/merge.html#git_object_lookup-19" ] } }, @@ -11037,18 +11337,18 @@ }, { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "the type of the object" } ], - "argline": "git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_otype type", - "sig": "git_object **::git_repository *::const git_oid *::size_t::git_otype", + "argline": "git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::size_t::git_object_t", "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "

The object obtained will be so that its identifier\n matches the first 'len' hexadecimal characters\n (packets of 4 bits) of the given 'id'.\n 'len' must be at least GIT_OID_MINPREFIXLEN, and\n long enough to identify a unique object matching\n the prefix; otherwise the method will fail.

\n\n

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJ_ANY' may be passed to let\n the method guess the object's type.

\n", + "comments": "

The object obtained will be so that its identifier\n matches the first 'len' hexadecimal characters\n (packets of 4 bits) of the given 'id'.\n 'len' must be at least GIT_OID_MINPREFIXLEN, and\n long enough to identify a unique object matching\n the prefix; otherwise the method will fail.

\n\n

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJECT_ANY' may be passed to let\n the method guess the object's type.

\n", "group": "object" }, "git_object_lookup_bypath": { @@ -11074,12 +11374,12 @@ }, { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "type of object desired" } ], - "argline": "git_object **out, const git_object *treeish, const char *path, git_otype type", - "sig": "git_object **::const git_object *::const char *::git_otype", + "argline": "git_object **out, const git_object *treeish, const char *path, git_object_t type", + "sig": "git_object **::const git_object *::const char *::git_object_t", "return": { "type": "int", "comment": " 0 on success, or an error code" @@ -11111,27 +11411,27 @@ "group": "object", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_object_id-10", - "ex/HEAD/blame.html#git_object_id-11", - "ex/HEAD/blame.html#git_object_id-12", - "ex/HEAD/blame.html#git_object_id-13" + "ex/v0.28.0/blame.html#git_object_id-10", + "ex/v0.28.0/blame.html#git_object_id-11", + "ex/v0.28.0/blame.html#git_object_id-12", + "ex/v0.28.0/blame.html#git_object_id-13" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_id-12", - "ex/HEAD/cat-file.html#git_object_id-13" + "ex/v0.28.0/cat-file.html#git_object_id-12", + "ex/v0.28.0/cat-file.html#git_object_id-13" ], "log.c": [ - "ex/HEAD/log.html#git_object_id-35", - "ex/HEAD/log.html#git_object_id-36", - "ex/HEAD/log.html#git_object_id-37", - "ex/HEAD/log.html#git_object_id-38" + "ex/v0.28.0/log.html#git_object_id-35", + "ex/v0.28.0/log.html#git_object_id-36", + "ex/v0.28.0/log.html#git_object_id-37", + "ex/v0.28.0/log.html#git_object_id-38" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_object_id-4", - "ex/HEAD/rev-parse.html#git_object_id-5", - "ex/HEAD/rev-parse.html#git_object_id-6", - "ex/HEAD/rev-parse.html#git_object_id-7", - "ex/HEAD/rev-parse.html#git_object_id-8" + "ex/v0.28.0/rev-parse.html#git_object_id-4", + "ex/v0.28.0/rev-parse.html#git_object_id-5", + "ex/v0.28.0/rev-parse.html#git_object_id-6", + "ex/v0.28.0/rev-parse.html#git_object_id-7", + "ex/v0.28.0/rev-parse.html#git_object_id-8" ] } }, @@ -11163,7 +11463,7 @@ "group": "object", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_object_short_id-5" + "ex/v0.28.0/tag.html#git_object_short_id-5" ] } }, @@ -11182,7 +11482,7 @@ "argline": "const git_object *obj", "sig": "const git_object *", "return": { - "type": "git_otype", + "type": "git_object_t", "comment": " the object's type" }, "description": "

Get the object type of an object

\n", @@ -11190,12 +11490,12 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_type-14", - "ex/HEAD/cat-file.html#git_object_type-15", - "ex/HEAD/cat-file.html#git_object_type-16" + "ex/v0.28.0/cat-file.html#git_object_type-14", + "ex/v0.28.0/cat-file.html#git_object_type-15", + "ex/v0.28.0/cat-file.html#git_object_type-16" ], "tag.c": [ - "ex/HEAD/tag.html#git_object_type-6" + "ex/v0.28.0/tag.html#git_object_type-6" ] } }, @@ -11244,33 +11544,33 @@ "group": "object", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_object_free-14", - "ex/HEAD/blame.html#git_object_free-15", - "ex/HEAD/blame.html#git_object_free-16", - "ex/HEAD/blame.html#git_object_free-17" + "ex/v0.28.0/blame.html#git_object_free-14", + "ex/v0.28.0/blame.html#git_object_free-15", + "ex/v0.28.0/blame.html#git_object_free-16", + "ex/v0.28.0/blame.html#git_object_free-17" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_free-17" + "ex/v0.28.0/cat-file.html#git_object_free-17" ], "general.c": [ - "ex/HEAD/general.html#git_object_free-38" + "ex/v0.28.0/general.html#git_object_free-38" ], "log.c": [ - "ex/HEAD/log.html#git_object_free-39" + "ex/v0.28.0/log.html#git_object_free-39" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_free-20" + "ex/v0.28.0/merge.html#git_object_free-20" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_object_free-9", - "ex/HEAD/rev-parse.html#git_object_free-10", - "ex/HEAD/rev-parse.html#git_object_free-11" + "ex/v0.28.0/rev-parse.html#git_object_free-9", + "ex/v0.28.0/rev-parse.html#git_object_free-10", + "ex/v0.28.0/rev-parse.html#git_object_free-11" ], "tag.c": [ - "ex/HEAD/tag.html#git_object_free-7", - "ex/HEAD/tag.html#git_object_free-8", - "ex/HEAD/tag.html#git_object_free-9", - "ex/HEAD/tag.html#git_object_free-10" + "ex/v0.28.0/tag.html#git_object_free-7", + "ex/v0.28.0/tag.html#git_object_free-8", + "ex/v0.28.0/tag.html#git_object_free-9", + "ex/v0.28.0/tag.html#git_object_free-10" ] } }, @@ -11282,12 +11582,12 @@ "args": [ { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "object type to convert." } ], - "argline": "git_otype type", - "sig": "git_otype", + "argline": "git_object_t type", + "sig": "git_object_t", "return": { "type": "const char *", "comment": " the corresponding string representation." @@ -11297,14 +11597,14 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_type2string-18", - "ex/HEAD/cat-file.html#git_object_type2string-19", - "ex/HEAD/cat-file.html#git_object_type2string-20", - "ex/HEAD/cat-file.html#git_object_type2string-21" + "ex/v0.28.0/cat-file.html#git_object_type2string-18", + "ex/v0.28.0/cat-file.html#git_object_type2string-19", + "ex/v0.28.0/cat-file.html#git_object_type2string-20", + "ex/v0.28.0/cat-file.html#git_object_type2string-21" ], "general.c": [ - "ex/HEAD/general.html#git_object_type2string-39", - "ex/HEAD/general.html#git_object_type2string-40" + "ex/v0.28.0/general.html#git_object_type2string-39", + "ex/v0.28.0/general.html#git_object_type2string-40" ] } }, @@ -11323,10 +11623,10 @@ "argline": "const char *str", "sig": "const char *", "return": { - "type": "git_otype", - "comment": " the corresponding git_otype." + "type": "git_object_t", + "comment": " the corresponding git_object_t." }, - "description": "

Convert a string object type representation to it's git_otype.

\n", + "description": "

Convert a string object type representation to it's git_object_t.

\n", "comments": "", "group": "object" }, @@ -11338,17 +11638,17 @@ "args": [ { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "object type to test." } ], - "argline": "git_otype type", - "sig": "git_otype", + "argline": "git_object_t type", + "sig": "git_object_t", "return": { "type": "int", "comment": " true if the type represents a valid loose object type,\n false otherwise." }, - "description": "

Determine if the given git_otype is a valid loose object type.

\n", + "description": "

Determine if the given git_object_t is a valid loose object type.

\n", "comments": "", "group": "object" }, @@ -11360,12 +11660,12 @@ "args": [ { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "object type to get its size" } ], - "argline": "git_otype type", - "sig": "git_otype", + "argline": "git_object_t type", + "sig": "git_object_t", "return": { "type": "size_t", "comment": " size in bytes of the object" @@ -11392,18 +11692,18 @@ }, { "name": "target_type", - "type": "git_otype", - "comment": "The type of the requested object (a GIT_OBJ_ value)" + "type": "git_object_t", + "comment": "The type of the requested object (a GIT_OBJECT_ value)" } ], - "argline": "git_object **peeled, const git_object *object, git_otype target_type", - "sig": "git_object **::const git_object *::git_otype", + "argline": "git_object **peeled, const git_object *object, git_object_t target_type", + "sig": "git_object **::const git_object *::git_object_t", "return": { "type": "int", "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" }, "description": "

Recursively peel an object until an object of the specified type is met.

\n", - "comments": "

If the query cannot be satisfied due to the object model,\n GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a\n tree).

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object will\n be peeled until the type changes. A tag will be peeled until the\n referenced object is no longer a tag, and a commit will be peeled\n to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to\n the target type due to the object model, GIT_EPEEL will be\n returned.

\n\n

You must free the returned object.

\n", + "comments": "

If the query cannot be satisfied due to the object model,\n GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a\n tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will\n be peeled until the type changes. A tag will be peeled until the\n referenced object is no longer a tag, and a commit will be peeled\n to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to\n the target type due to the object model, GIT_EPEEL will be\n returned.

\n\n

You must free the returned object.

\n", "group": "object" }, "git_object_dup": { @@ -11532,10 +11832,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_free-22" + "ex/v0.28.0/cat-file.html#git_odb_free-22" ], "general.c": [ - "ex/HEAD/general.html#git_odb_free-41" + "ex/v0.28.0/general.html#git_odb_free-41" ] } }, @@ -11572,10 +11872,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_read-23" + "ex/v0.28.0/cat-file.html#git_odb_read-23" ], "general.c": [ - "ex/HEAD/general.html#git_odb_read-42" + "ex/v0.28.0/general.html#git_odb_read-42" ] } }, @@ -11629,7 +11929,7 @@ }, { "name": "type_out", - "type": "git_otype *", + "type": "git_object_t *", "comment": "pointer where to store the type" }, { @@ -11643,8 +11943,8 @@ "comment": "identity of the object to read." } ], - "argline": "size_t *len_out, git_otype *type_out, git_odb *db, const git_oid *id", - "sig": "size_t *::git_otype *::git_odb *::const git_oid *", + "argline": "size_t *len_out, git_object_t *type_out, git_odb *db, const git_oid *id", + "sig": "size_t *::git_object_t *::git_odb *::const git_oid *", "return": { "type": "int", "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database." @@ -11831,12 +12131,12 @@ }, { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "type of the data to store" } ], - "argline": "git_oid *out, git_odb *odb, const void *data, size_t len, git_otype type", - "sig": "git_oid *::git_odb *::const void *::size_t::git_otype", + "argline": "git_oid *out, git_odb *odb, const void *data, size_t len, git_object_t type", + "sig": "git_oid *::git_odb *::const void *::size_t::git_object_t", "return": { "type": "int", "comment": " 0 or an error code" @@ -11846,7 +12146,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_write-43" + "ex/v0.28.0/general.html#git_odb_write-43" ] } }, @@ -11873,12 +12173,12 @@ }, { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "type of the object that will be written" } ], - "argline": "git_odb_stream **out, git_odb *db, git_off_t size, git_otype type", - "sig": "git_odb_stream **::git_odb *::git_off_t::git_otype", + "argline": "git_odb_stream **out, git_odb *db, git_off_t size, git_object_t type", + "sig": "git_odb_stream **::git_odb *::git_off_t::git_object_t", "return": { "type": "int", "comment": " 0 if the stream was created; error code otherwise" @@ -12018,7 +12318,7 @@ }, { "name": "type", - "type": "git_otype *", + "type": "git_object_t *", "comment": "pointer where to store the type of the object" }, { @@ -12032,8 +12332,8 @@ "comment": "oid of the object the stream will read from" } ], - "argline": "git_odb_stream **out, size_t *len, git_otype *type, git_odb *db, const git_oid *oid", - "sig": "git_odb_stream **::size_t *::git_otype *::git_odb *::const git_oid *", + "argline": "git_odb_stream **out, size_t *len, git_object_t *type, git_odb *db, const git_oid *oid", + "sig": "git_odb_stream **::size_t *::git_object_t *::git_odb *::const git_oid *", "return": { "type": "int", "comment": " 0 if the stream was created; error code otherwise" @@ -12102,12 +12402,12 @@ }, { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "of the data to hash" } ], - "argline": "git_oid *out, const void *data, size_t len, git_otype type", - "sig": "git_oid *::const void *::size_t::git_otype", + "argline": "git_oid *out, const void *data, size_t len, git_object_t type", + "sig": "git_oid *::const void *::size_t::git_object_t", "return": { "type": "int", "comment": " 0 or an error code" @@ -12134,12 +12434,12 @@ }, { "name": "type", - "type": "git_otype", + "type": "git_object_t", "comment": "the type of the object that will be hashed" } ], - "argline": "git_oid *out, const char *path, git_otype type", - "sig": "git_oid *::const char *::git_otype", + "argline": "git_oid *out, const char *path, git_object_t type", + "sig": "git_oid *::const char *::git_object_t", "return": { "type": "int", "comment": " 0 or an error code" @@ -12198,10 +12498,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_object_free-24" + "ex/v0.28.0/cat-file.html#git_odb_object_free-24" ], "general.c": [ - "ex/HEAD/general.html#git_odb_object_free-44" + "ex/v0.28.0/general.html#git_odb_object_free-44" ] } }, @@ -12250,7 +12550,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_object_data-45" + "ex/v0.28.0/general.html#git_odb_object_data-45" ] } }, @@ -12277,10 +12577,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_object_size-25" + "ex/v0.28.0/cat-file.html#git_odb_object_size-25" ], "general.c": [ - "ex/HEAD/general.html#git_odb_object_size-46" + "ex/v0.28.0/general.html#git_odb_object_size-46" ] } }, @@ -12299,7 +12599,7 @@ "argline": "git_odb_object *object", "sig": "git_odb_object *", "return": { - "type": "git_otype", + "type": "git_object_t", "comment": " the type" }, "description": "

Return the type of an ODB object

\n", @@ -12307,7 +12607,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_object_type-47" + "ex/v0.28.0/general.html#git_odb_object_type-47" ] } }, @@ -12558,14 +12858,14 @@ "group": "oid", "examples": { "general.c": [ - "ex/HEAD/general.html#git_oid_fromstr-48", - "ex/HEAD/general.html#git_oid_fromstr-49", - "ex/HEAD/general.html#git_oid_fromstr-50", - "ex/HEAD/general.html#git_oid_fromstr-51", - "ex/HEAD/general.html#git_oid_fromstr-52", - "ex/HEAD/general.html#git_oid_fromstr-53", - "ex/HEAD/general.html#git_oid_fromstr-54", - "ex/HEAD/general.html#git_oid_fromstr-55" + "ex/v0.28.0/general.html#git_oid_fromstr-48", + "ex/v0.28.0/general.html#git_oid_fromstr-49", + "ex/v0.28.0/general.html#git_oid_fromstr-50", + "ex/v0.28.0/general.html#git_oid_fromstr-51", + "ex/v0.28.0/general.html#git_oid_fromstr-52", + "ex/v0.28.0/general.html#git_oid_fromstr-53", + "ex/v0.28.0/general.html#git_oid_fromstr-54", + "ex/v0.28.0/general.html#git_oid_fromstr-55" ] } }, @@ -12683,19 +12983,19 @@ "group": "oid", "examples": { "general.c": [ - "ex/HEAD/general.html#git_oid_fmt-56", - "ex/HEAD/general.html#git_oid_fmt-57", - "ex/HEAD/general.html#git_oid_fmt-58", - "ex/HEAD/general.html#git_oid_fmt-59", - "ex/HEAD/general.html#git_oid_fmt-60", - "ex/HEAD/general.html#git_oid_fmt-61" + "ex/v0.28.0/general.html#git_oid_fmt-56", + "ex/v0.28.0/general.html#git_oid_fmt-57", + "ex/v0.28.0/general.html#git_oid_fmt-58", + "ex/v0.28.0/general.html#git_oid_fmt-59", + "ex/v0.28.0/general.html#git_oid_fmt-60", + "ex/v0.28.0/general.html#git_oid_fmt-61" ], "network/fetch.c": [ - "ex/HEAD/network/fetch.html#git_oid_fmt-1", - "ex/HEAD/network/fetch.html#git_oid_fmt-2" + "ex/v0.28.0/network/fetch.html#git_oid_fmt-1", + "ex/v0.28.0/network/fetch.html#git_oid_fmt-2" ], "network/ls-remote.c": [ - "ex/HEAD/network/ls-remote.html#git_oid_fmt-1" + "ex/v0.28.0/network/ls-remote.html#git_oid_fmt-1" ] } }, @@ -12781,8 +13081,8 @@ "group": "oid", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_oid_tostr_s-21", - "ex/HEAD/merge.html#git_oid_tostr_s-22" + "ex/v0.28.0/merge.html#git_oid_tostr_s-21", + "ex/v0.28.0/merge.html#git_oid_tostr_s-22" ] } }, @@ -12819,25 +13119,25 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_tostr-18", - "ex/HEAD/blame.html#git_oid_tostr-19" + "ex/v0.28.0/blame.html#git_oid_tostr-18", + "ex/v0.28.0/blame.html#git_oid_tostr-19" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_oid_tostr-26", - "ex/HEAD/cat-file.html#git_oid_tostr-27", - "ex/HEAD/cat-file.html#git_oid_tostr-28", - "ex/HEAD/cat-file.html#git_oid_tostr-29", - "ex/HEAD/cat-file.html#git_oid_tostr-30" + "ex/v0.28.0/cat-file.html#git_oid_tostr-26", + "ex/v0.28.0/cat-file.html#git_oid_tostr-27", + "ex/v0.28.0/cat-file.html#git_oid_tostr-28", + "ex/v0.28.0/cat-file.html#git_oid_tostr-29", + "ex/v0.28.0/cat-file.html#git_oid_tostr-30" ], "log.c": [ - "ex/HEAD/log.html#git_oid_tostr-40", - "ex/HEAD/log.html#git_oid_tostr-41" + "ex/v0.28.0/log.html#git_oid_tostr-40", + "ex/v0.28.0/log.html#git_oid_tostr-41" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_oid_tostr-12", - "ex/HEAD/rev-parse.html#git_oid_tostr-13", - "ex/HEAD/rev-parse.html#git_oid_tostr-14", - "ex/HEAD/rev-parse.html#git_oid_tostr-15" + "ex/v0.28.0/rev-parse.html#git_oid_tostr-12", + "ex/v0.28.0/rev-parse.html#git_oid_tostr-13", + "ex/v0.28.0/rev-parse.html#git_oid_tostr-14", + "ex/v0.28.0/rev-parse.html#git_oid_tostr-15" ] } }, @@ -12869,9 +13169,9 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_cpy-20", - "ex/HEAD/blame.html#git_oid_cpy-21", - "ex/HEAD/blame.html#git_oid_cpy-22" + "ex/v0.28.0/blame.html#git_oid_cpy-20", + "ex/v0.28.0/blame.html#git_oid_cpy-21", + "ex/v0.28.0/blame.html#git_oid_cpy-22" ] } }, @@ -13038,10 +13338,10 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_iszero-23" + "ex/v0.28.0/blame.html#git_oid_iszero-23" ], "network/fetch.c": [ - "ex/HEAD/network/fetch.html#git_oid_iszero-3" + "ex/v0.28.0/network/fetch.html#git_oid_iszero-3" ] } }, @@ -13091,7 +13391,7 @@ "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." }, "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", - "comments": "

The OID is expected to be a 40-char hexadecimal string.\n The OID is owned by the user and will not be modified\n or freed.

\n\n

For performance reasons, there is a hard-limit of how many\n OIDs can be added to a single set (around ~32000, assuming\n a mostly randomized distribution), which should be enough\n for any kind of program, and keeps the algorithm fast and\n memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a\n GITERR_INVALID error

\n", + "comments": "

The OID is expected to be a 40-char hexadecimal string.\n The OID is owned by the user and will not be modified\n or freed.

\n\n

For performance reasons, there is a hard-limit of how many\n OIDs can be added to a single set (around ~32000, assuming\n a mostly randomized distribution), which should be enough\n for any kind of program, and keeps the algorithm fast and\n memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a\n GIT_ERROR_INVALID error

\n", "group": "oid" }, "git_oid_shorten_free": { @@ -14074,7 +14374,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_new-42" + "ex/v0.28.0/log.html#git_pathspec_new-42" ] } }, @@ -14101,7 +14401,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_free-43" + "ex/v0.28.0/log.html#git_pathspec_free-43" ] } }, @@ -14114,27 +14414,27 @@ { "name": "ps", "type": "const git_pathspec *", - "comment": "The compiled pathspec" + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" + "type": "int", + "comment": null }, { "name": "path", "type": "const char *", - "comment": "The pathname to attempt to match" + "comment": null } ], - "argline": "const git_pathspec *ps, uint32_t flags, const char *path", - "sig": "const git_pathspec *::uint32_t::const char *", + "argline": "const git_pathspec *ps, int flags, const char *path", + "sig": "const git_pathspec *::int::const char *", "return": { "type": "int", - "comment": " 1 is path matches spec, 0 if it does not" + "comment": null }, - "description": "

Try to match a path against a pathspec

\n", - "comments": "

Unlike most of the other pathspec matching functions, this will not\n fall back on the native case-sensitivity for your platform. You must\n explicitly pass flags to control case sensitivity or else this will\n fall back on being case sensitive.

\n", + "description": "", + "comments": "", "group": "pathspec" }, "git_pathspec_match_workdir": { @@ -14146,32 +14446,32 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" + "comment": null }, { "name": "repo", "type": "git_repository *", - "comment": "The repository in which to match; bare repo is an error" + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" + "type": "int", + "comment": null }, { "name": "ps", "type": "git_pathspec *", - "comment": "Pathspec to be matched" + "comment": null } ], - "argline": "git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_repository *repo, int flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_repository *::int::git_pathspec *", "return": { "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" + "comment": null }, - "description": "

Match a pathspec against the working directory of a repository.

\n", - "comments": "

This matches the pathspec against the current files in the working\n directory of the repository. It is an error to invoke this on a bare\n repo. This handles git ignores (i.e. ignored files will not be\n considered to match the pathspec unless the file is tracked in the\n index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", + "description": "", + "comments": "", "group": "pathspec" }, "git_pathspec_match_index": { @@ -14183,32 +14483,32 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" + "comment": null }, { "name": "index", "type": "git_index *", - "comment": "The index to match against" + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" + "type": "int", + "comment": null }, { "name": "ps", "type": "git_pathspec *", - "comment": "Pathspec to be matched" + "comment": null } ], - "argline": "git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_index *index, int flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_index *::int::git_pathspec *", "return": { "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + "comment": null }, - "description": "

Match a pathspec against entries in an index.

\n", - "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled\n by the current case-sensitivity of the index object itself and the\n USE_CASE and IGNORE_CASE flags will have no effect. This behavior will\n be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", + "description": "", + "comments": "", "group": "pathspec" }, "git_pathspec_match_tree": { @@ -14220,36 +14520,36 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" + "comment": null }, { "name": "tree", "type": "git_tree *", - "comment": "The root-level tree to match against" + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" + "type": "int", + "comment": null }, { "name": "ps", "type": "git_pathspec *", - "comment": "Pathspec to be matched" + "comment": null } ], - "argline": "git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_tree *tree, int flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_tree *::int::git_pathspec *", "return": { "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + "comment": null }, - "description": "

Match a pathspec against files in a tree.

\n", - "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", + "description": "", + "comments": "", "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_match_tree-44" + "ex/v0.28.0/log.html#git_pathspec_match_tree-44" ] } }, @@ -14262,32 +14562,32 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" + "comment": null }, { "name": "diff", "type": "git_diff *", - "comment": "A generated diff list" + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" + "type": "int", + "comment": null }, { "name": "ps", "type": "git_pathspec *", - "comment": "Pathspec to be matched" + "comment": null } ], - "argline": "git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_diff *diff, int flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_diff *::int::git_pathspec *", "return": { "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + "comment": null }, - "description": "

Match a pathspec against files in a diff list.

\n", - "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That\n contains the list of all matched filenames (unless you pass the\n GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of\n pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES\n flag). You must call git_pathspec_match_list_free() on this object.

\n", + "description": "", + "comments": "", "group": "pathspec" }, "git_pathspec_match_list_free": { @@ -15285,10 +15585,10 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_lookup-62" + "ex/v0.28.0/general.html#git_reference_lookup-62" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_lookup-23" + "ex/v0.28.0/merge.html#git_reference_lookup-23" ] } }, @@ -15357,7 +15657,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_dwim-24" + "ex/v0.28.0/merge.html#git_reference_dwim-24" ] } }, @@ -15508,7 +15808,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_create-25" + "ex/v0.28.0/merge.html#git_reference_create-25" ] } }, @@ -15587,7 +15887,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_target-63" + "ex/v0.28.0/general.html#git_reference_target-63" ] } }, @@ -15636,10 +15936,10 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_symbolic_target-64" + "ex/v0.28.0/general.html#git_reference_symbolic_target-64" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_symbolic_target-26" + "ex/v0.28.0/merge.html#git_reference_symbolic_target-26" ] } }, @@ -15658,15 +15958,15 @@ "argline": "const git_reference *ref", "sig": "const git_reference *", "return": { - "type": "git_ref_t", + "type": "git_reference_t", "comment": " the type" }, "description": "

Get the type of a reference.

\n", - "comments": "

Either direct (GIT_REF_OID) or symbolic (GIT_REF_SYMBOLIC)

\n", + "comments": "

Either direct (GIT_REFERENCE_DIRECT) or symbolic (GIT_REFERENCE_SYMBOLIC)

\n", "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_type-65" + "ex/v0.28.0/general.html#git_reference_type-65" ] } }, @@ -15693,7 +15993,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_name-27" + "ex/v0.28.0/merge.html#git_reference_name-27" ] } }, @@ -15821,7 +16121,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_set_target-28" + "ex/v0.28.0/merge.html#git_reference_set_target-28" ] } }, @@ -15944,7 +16244,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_list-66" + "ex/v0.28.0/general.html#git_reference_list-66" ] } }, @@ -16062,15 +16362,15 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_free-67" + "ex/v0.28.0/general.html#git_reference_free-67" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_free-29", - "ex/HEAD/merge.html#git_reference_free-30", - "ex/HEAD/merge.html#git_reference_free-31" + "ex/v0.28.0/merge.html#git_reference_free-29", + "ex/v0.28.0/merge.html#git_reference_free-30", + "ex/v0.28.0/merge.html#git_reference_free-31" ], "status.c": [ - "ex/HEAD/status.html#git_reference_free-3" + "ex/v0.28.0/status.html#git_reference_free-3" ] } }, @@ -16439,7 +16739,7 @@ { "name": "flags", "type": "unsigned int", - "comment": "Flags to constrain name validation rules - see the\n GIT_REF_FORMAT constants above." + "comment": "Flags to constrain name validation rules - see the\n GIT_REFERENCE_FORMAT constants above." } ], "argline": "char *buffer_out, size_t buffer_size, const char *name, unsigned int flags", @@ -16465,27 +16765,27 @@ }, { "name": "ref", - "type": "git_reference *", + "type": "const git_reference *", "comment": "The reference to be processed" }, { "name": "type", - "type": "git_otype", - "comment": "The type of the requested object (GIT_OBJ_COMMIT,\n GIT_OBJ_TAG, GIT_OBJ_TREE, GIT_OBJ_BLOB or GIT_OBJ_ANY)." + "type": "git_object_t", + "comment": "The type of the requested object (GIT_OBJECT_COMMIT,\n GIT_OBJECT_TAG, GIT_OBJECT_TREE, GIT_OBJECT_BLOB or GIT_OBJECT_ANY)." } ], - "argline": "git_object **out, git_reference *ref, git_otype type", - "sig": "git_object **::git_reference *::git_otype", + "argline": "git_object **out, const git_reference *ref, git_object_t type", + "sig": "git_object **::const git_reference *::git_object_t", "return": { "type": "int", "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" }, "description": "

Recursively peel reference until object of the specified type is found.

\n", - "comments": "

The retrieved peeled object is owned by the repository\n and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJ_ANY as the target type, then the object\n will be peeled until a non-tag object is met.

\n", + "comments": "

The retrieved peeled object is owned by the repository\n and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object\n will be peeled until a non-tag object is met.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_peel-32" + "ex/v0.28.0/merge.html#git_reference_peel-32" ] } }, @@ -16534,7 +16834,7 @@ "group": "reference", "examples": { "status.c": [ - "ex/HEAD/status.html#git_reference_shorthand-4" + "ex/v0.28.0/status.html#git_reference_shorthand-4" ] } }, @@ -16858,15 +17158,74 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_create-4" + "ex/v0.28.0/remote.html#git_remote_create-4" ] } }, + "git_remote_create_init_options": { + "type": "function", + "file": "git2/remote.h", + "line": 97, + "lineto": 99, + "args": [ + { + "name": "opts", + "type": "git_remote_create_options *", + "comment": "The `git_remote_create_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REMOTE_CREATE_OPTIONS_VERSION`." + } + ], + "argline": "git_remote_create_options *opts, unsigned int version", + "sig": "git_remote_create_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_remote_create_options structure

\n", + "comments": "

Initializes a git_remote_create_options with default values. Equivalent to\n creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", + "group": "remote" + }, + "git_remote_create_with_opts": { + "type": "function", + "file": "git2/remote.h", + "line": 113, + "lineto": 116, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "opts", + "type": "const git_remote_create_options *", + "comment": "the remote creation options" + } + ], + "argline": "git_remote **out, const char *url, const git_remote_create_options *opts", + "sig": "git_remote **::const char *::const git_remote_create_options *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Create a remote, with options.

\n", + "comments": "

This function allows more fine-grained control over the remote creation.

\n\n

Passing NULL as the opts argument will result in a detached remote.

\n", + "group": "remote" + }, "git_remote_create_with_fetchspec": { "type": "function", "file": "git2/remote.h", - "line": 55, - "lineto": 60, + "line": 129, + "lineto": 134, "args": [ { "name": "out", @@ -16907,8 +17266,8 @@ "git_remote_create_anonymous": { "type": "function", "file": "git2/remote.h", - "line": 73, - "lineto": 76, + "line": 147, + "lineto": 150, "args": [ { "name": "out", @@ -16937,18 +17296,18 @@ "group": "remote", "examples": { "network/fetch.c": [ - "ex/HEAD/network/fetch.html#git_remote_create_anonymous-4" + "ex/v0.28.0/network/fetch.html#git_remote_create_anonymous-4" ], "network/ls-remote.c": [ - "ex/HEAD/network/ls-remote.html#git_remote_create_anonymous-2" + "ex/v0.28.0/network/ls-remote.html#git_remote_create_anonymous-2" ] } }, "git_remote_create_detached": { "type": "function", "file": "git2/remote.h", - "line": 92, - "lineto": 94, + "line": 166, + "lineto": 168, "args": [ { "name": "out", @@ -16974,8 +17333,8 @@ "git_remote_lookup": { "type": "function", "file": "git2/remote.h", - "line": 107, - "lineto": 107, + "line": 181, + "lineto": 181, "args": [ { "name": "out", @@ -17004,21 +17363,21 @@ "group": "remote", "examples": { "network/fetch.c": [ - "ex/HEAD/network/fetch.html#git_remote_lookup-5" + "ex/v0.28.0/network/fetch.html#git_remote_lookup-5" ], "network/ls-remote.c": [ - "ex/HEAD/network/ls-remote.html#git_remote_lookup-3" + "ex/v0.28.0/network/ls-remote.html#git_remote_lookup-3" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_lookup-5" + "ex/v0.28.0/remote.html#git_remote_lookup-5" ] } }, "git_remote_dup": { "type": "function", "file": "git2/remote.h", - "line": 119, - "lineto": 119, + "line": 193, + "lineto": 193, "args": [ { "name": "dest", @@ -17044,8 +17403,8 @@ "git_remote_owner": { "type": "function", "file": "git2/remote.h", - "line": 127, - "lineto": 127, + "line": 201, + "lineto": 201, "args": [ { "name": "remote", @@ -17066,8 +17425,8 @@ "git_remote_name": { "type": "function", "file": "git2/remote.h", - "line": 135, - "lineto": 135, + "line": 209, + "lineto": 209, "args": [ { "name": "remote", @@ -17088,8 +17447,8 @@ "git_remote_url": { "type": "function", "file": "git2/remote.h", - "line": 146, - "lineto": 146, + "line": 220, + "lineto": 220, "args": [ { "name": "remote", @@ -17108,15 +17467,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_url-6" + "ex/v0.28.0/remote.html#git_remote_url-6" ] } }, "git_remote_pushurl": { "type": "function", "file": "git2/remote.h", - "line": 157, - "lineto": 157, + "line": 231, + "lineto": 231, "args": [ { "name": "remote", @@ -17135,15 +17494,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_pushurl-7" + "ex/v0.28.0/remote.html#git_remote_pushurl-7" ] } }, "git_remote_set_url": { "type": "function", "file": "git2/remote.h", - "line": 170, - "lineto": 170, + "line": 244, + "lineto": 244, "args": [ { "name": "repo", @@ -17172,15 +17531,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_set_url-8" + "ex/v0.28.0/remote.html#git_remote_set_url-8" ] } }, "git_remote_set_pushurl": { "type": "function", "file": "git2/remote.h", - "line": 183, - "lineto": 183, + "line": 257, + "lineto": 257, "args": [ { "name": "repo", @@ -17209,15 +17568,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_set_pushurl-9" + "ex/v0.28.0/remote.html#git_remote_set_pushurl-9" ] } }, "git_remote_add_fetch": { "type": "function", "file": "git2/remote.h", - "line": 196, - "lineto": 196, + "line": 270, + "lineto": 270, "args": [ { "name": "repo", @@ -17248,8 +17607,8 @@ "git_remote_get_fetch_refspecs": { "type": "function", "file": "git2/remote.h", - "line": 207, - "lineto": 207, + "line": 281, + "lineto": 281, "args": [ { "name": "array", @@ -17275,8 +17634,8 @@ "git_remote_add_push": { "type": "function", "file": "git2/remote.h", - "line": 220, - "lineto": 220, + "line": 294, + "lineto": 294, "args": [ { "name": "repo", @@ -17307,8 +17666,8 @@ "git_remote_get_push_refspecs": { "type": "function", "file": "git2/remote.h", - "line": 231, - "lineto": 231, + "line": 305, + "lineto": 305, "args": [ { "name": "array", @@ -17334,8 +17693,8 @@ "git_remote_refspec_count": { "type": "function", "file": "git2/remote.h", - "line": 239, - "lineto": 239, + "line": 313, + "lineto": 313, "args": [ { "name": "remote", @@ -17356,8 +17715,8 @@ "git_remote_get_refspec": { "type": "function", "file": "git2/remote.h", - "line": 248, - "lineto": 248, + "line": 322, + "lineto": 322, "args": [ { "name": "remote", @@ -17383,8 +17742,8 @@ "git_remote_connect": { "type": "function", "file": "git2/remote.h", - "line": 265, - "lineto": 265, + "line": 339, + "lineto": 339, "args": [ { "name": "remote", @@ -17423,15 +17782,15 @@ "group": "remote", "examples": { "network/ls-remote.c": [ - "ex/HEAD/network/ls-remote.html#git_remote_connect-4" + "ex/v0.28.0/network/ls-remote.html#git_remote_connect-4" ] } }, "git_remote_ls": { "type": "function", "file": "git2/remote.h", - "line": 287, - "lineto": 287, + "line": 361, + "lineto": 361, "args": [ { "name": "out", @@ -17460,15 +17819,15 @@ "group": "remote", "examples": { "network/ls-remote.c": [ - "ex/HEAD/network/ls-remote.html#git_remote_ls-5" + "ex/v0.28.0/network/ls-remote.html#git_remote_ls-5" ] } }, "git_remote_connected": { "type": "function", "file": "git2/remote.h", - "line": 298, - "lineto": 298, + "line": 372, + "lineto": 372, "args": [ { "name": "remote", @@ -17489,8 +17848,8 @@ "git_remote_stop": { "type": "function", "file": "git2/remote.h", - "line": 308, - "lineto": 308, + "line": 382, + "lineto": 382, "args": [ { "name": "remote", @@ -17511,8 +17870,8 @@ "git_remote_disconnect": { "type": "function", "file": "git2/remote.h", - "line": 317, - "lineto": 317, + "line": 391, + "lineto": 391, "args": [ { "name": "remote", @@ -17533,8 +17892,8 @@ "git_remote_free": { "type": "function", "file": "git2/remote.h", - "line": 327, - "lineto": 327, + "line": 401, + "lineto": 401, "args": [ { "name": "remote", @@ -17553,22 +17912,22 @@ "group": "remote", "examples": { "network/fetch.c": [ - "ex/HEAD/network/fetch.html#git_remote_free-6", - "ex/HEAD/network/fetch.html#git_remote_free-7" + "ex/v0.28.0/network/fetch.html#git_remote_free-6", + "ex/v0.28.0/network/fetch.html#git_remote_free-7" ], "network/ls-remote.c": [ - "ex/HEAD/network/ls-remote.html#git_remote_free-6" + "ex/v0.28.0/network/ls-remote.html#git_remote_free-6" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_free-10" + "ex/v0.28.0/remote.html#git_remote_free-10" ] } }, "git_remote_list": { "type": "function", "file": "git2/remote.h", - "line": 338, - "lineto": 338, + "line": 412, + "lineto": 412, "args": [ { "name": "out", @@ -17592,15 +17951,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_list-11" + "ex/v0.28.0/remote.html#git_remote_list-11" ] } }, "git_remote_init_callbacks": { "type": "function", "file": "git2/remote.h", - "line": 503, - "lineto": 505, + "line": 577, + "lineto": 579, "args": [ { "name": "opts", @@ -17626,8 +17985,8 @@ "git_fetch_init_options": { "type": "function", "file": "git2/remote.h", - "line": 608, - "lineto": 610, + "line": 682, + "lineto": 684, "args": [ { "name": "opts", @@ -17653,8 +18012,8 @@ "git_push_init_options": { "type": "function", "file": "git2/remote.h", - "line": 658, - "lineto": 660, + "line": 732, + "lineto": 734, "args": [ { "name": "opts", @@ -17680,8 +18039,8 @@ "git_remote_download": { "type": "function", "file": "git2/remote.h", - "line": 678, - "lineto": 678, + "line": 752, + "lineto": 752, "args": [ { "name": "remote", @@ -17712,8 +18071,8 @@ "git_remote_upload": { "type": "function", "file": "git2/remote.h", - "line": 692, - "lineto": 692, + "line": 766, + "lineto": 766, "args": [ { "name": "remote", @@ -17744,8 +18103,8 @@ "git_remote_update_tips": { "type": "function", "file": "git2/remote.h", - "line": 708, - "lineto": 713, + "line": 782, + "lineto": 787, "args": [ { "name": "remote", @@ -17786,8 +18145,8 @@ "git_remote_fetch": { "type": "function", "file": "git2/remote.h", - "line": 729, - "lineto": 733, + "line": 803, + "lineto": 807, "args": [ { "name": "remote", @@ -17821,15 +18180,15 @@ "group": "remote", "examples": { "network/fetch.c": [ - "ex/HEAD/network/fetch.html#git_remote_fetch-8" + "ex/v0.28.0/network/fetch.html#git_remote_fetch-8" ] } }, "git_remote_prune": { "type": "function", "file": "git2/remote.h", - "line": 742, - "lineto": 742, + "line": 816, + "lineto": 816, "args": [ { "name": "remote", @@ -17855,8 +18214,8 @@ "git_remote_push": { "type": "function", "file": "git2/remote.h", - "line": 754, - "lineto": 756, + "line": 828, + "lineto": 830, "args": [ { "name": "remote", @@ -17887,8 +18246,8 @@ "git_remote_stats": { "type": "function", "file": "git2/remote.h", - "line": 761, - "lineto": 761, + "line": 835, + "lineto": 835, "args": [ { "name": "remote", @@ -17907,15 +18266,15 @@ "group": "remote", "examples": { "network/fetch.c": [ - "ex/HEAD/network/fetch.html#git_remote_stats-9" + "ex/v0.28.0/network/fetch.html#git_remote_stats-9" ] } }, "git_remote_autotag": { "type": "function", "file": "git2/remote.h", - "line": 769, - "lineto": 769, + "line": 843, + "lineto": 843, "args": [ { "name": "remote", @@ -17936,8 +18295,8 @@ "git_remote_set_autotag": { "type": "function", "file": "git2/remote.h", - "line": 781, - "lineto": 781, + "line": 855, + "lineto": 855, "args": [ { "name": "repo", @@ -17968,8 +18327,8 @@ "git_remote_prune_refs": { "type": "function", "file": "git2/remote.h", - "line": 788, - "lineto": 788, + "line": 862, + "lineto": 862, "args": [ { "name": "remote", @@ -17990,8 +18349,8 @@ "git_remote_rename": { "type": "function", "file": "git2/remote.h", - "line": 810, - "lineto": 814, + "line": 884, + "lineto": 888, "args": [ { "name": "problems", @@ -18025,15 +18384,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_rename-12" + "ex/v0.28.0/remote.html#git_remote_rename-12" ] } }, "git_remote_is_valid_name": { "type": "function", "file": "git2/remote.h", - "line": 822, - "lineto": 822, + "line": 896, + "lineto": 896, "args": [ { "name": "remote_name", @@ -18054,8 +18413,8 @@ "git_remote_delete": { "type": "function", "file": "git2/remote.h", - "line": 834, - "lineto": 834, + "line": 908, + "lineto": 908, "args": [ { "name": "repo", @@ -18079,15 +18438,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_delete-13" + "ex/v0.28.0/remote.html#git_remote_delete-13" ] } }, "git_remote_default_branch": { "type": "function", "file": "git2/remote.h", - "line": 852, - "lineto": 852, + "line": 926, + "lineto": 926, "args": [ { "name": "out", @@ -18138,10 +18497,10 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_open-68" + "ex/v0.28.0/general.html#git_repository_open-68" ], "remote.c": [ - "ex/HEAD/remote.html#git_repository_open-14" + "ex/v0.28.0/remote.html#git_repository_open-14" ] } }, @@ -18237,15 +18596,15 @@ "group": "repository", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_repository_discover-15" + "ex/v0.28.0/remote.html#git_repository_discover-15" ] } }, "git_repository_open_ext": { "type": "function", "file": "git2/repository.h", - "line": 152, - "lineto": 156, + "line": 165, + "lineto": 169, "args": [ { "name": "out", @@ -18279,46 +18638,46 @@ "group": "repository", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_repository_open_ext-24" + "ex/v0.28.0/blame.html#git_repository_open_ext-24" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_repository_open_ext-31" + "ex/v0.28.0/cat-file.html#git_repository_open_ext-31" ], "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_open_ext-14" + "ex/v0.28.0/checkout.html#git_repository_open_ext-14" ], "describe.c": [ - "ex/HEAD/describe.html#git_repository_open_ext-8" + "ex/v0.28.0/describe.html#git_repository_open_ext-8" ], "diff.c": [ - "ex/HEAD/diff.html#git_repository_open_ext-15" + "ex/v0.28.0/diff.html#git_repository_open_ext-15" ], "log.c": [ - "ex/HEAD/log.html#git_repository_open_ext-45", - "ex/HEAD/log.html#git_repository_open_ext-46" + "ex/v0.28.0/log.html#git_repository_open_ext-45", + "ex/v0.28.0/log.html#git_repository_open_ext-46" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_repository_open_ext-7" + "ex/v0.28.0/ls-files.html#git_repository_open_ext-7" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_open_ext-33" + "ex/v0.28.0/merge.html#git_repository_open_ext-33" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_repository_open_ext-16" + "ex/v0.28.0/rev-parse.html#git_repository_open_ext-16" ], "status.c": [ - "ex/HEAD/status.html#git_repository_open_ext-5" + "ex/v0.28.0/status.html#git_repository_open_ext-5" ], "tag.c": [ - "ex/HEAD/tag.html#git_repository_open_ext-11" + "ex/v0.28.0/tag.html#git_repository_open_ext-11" ] } }, "git_repository_open_bare": { "type": "function", "file": "git2/repository.h", - "line": 169, - "lineto": 169, + "line": 182, + "lineto": 182, "args": [ { "name": "out", @@ -18344,8 +18703,8 @@ "git_repository_free": { "type": "function", "file": "git2/repository.h", - "line": 182, - "lineto": 182, + "line": 195, + "lineto": 195, "args": [ { "name": "repo", @@ -18364,51 +18723,51 @@ "group": "repository", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_repository_free-25" + "ex/v0.28.0/blame.html#git_repository_free-25" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_repository_free-32" + "ex/v0.28.0/cat-file.html#git_repository_free-32" ], "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_free-15" + "ex/v0.28.0/checkout.html#git_repository_free-15" ], "describe.c": [ - "ex/HEAD/describe.html#git_repository_free-9" + "ex/v0.28.0/describe.html#git_repository_free-9" ], "diff.c": [ - "ex/HEAD/diff.html#git_repository_free-16" + "ex/v0.28.0/diff.html#git_repository_free-16" ], "general.c": [ - "ex/HEAD/general.html#git_repository_free-69" + "ex/v0.28.0/general.html#git_repository_free-69" ], "init.c": [ - "ex/HEAD/init.html#git_repository_free-6" + "ex/v0.28.0/init.html#git_repository_free-6" ], "log.c": [ - "ex/HEAD/log.html#git_repository_free-47" + "ex/v0.28.0/log.html#git_repository_free-47" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_repository_free-8" + "ex/v0.28.0/ls-files.html#git_repository_free-8" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_free-34" + "ex/v0.28.0/merge.html#git_repository_free-34" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_repository_free-17" + "ex/v0.28.0/rev-parse.html#git_repository_free-17" ], "status.c": [ - "ex/HEAD/status.html#git_repository_free-6" + "ex/v0.28.0/status.html#git_repository_free-6" ], "tag.c": [ - "ex/HEAD/tag.html#git_repository_free-12" + "ex/v0.28.0/tag.html#git_repository_free-12" ] } }, "git_repository_init": { "type": "function", "file": "git2/repository.h", - "line": 199, - "lineto": 202, + "line": 212, + "lineto": 215, "args": [ { "name": "out", @@ -18437,15 +18796,15 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_init-7" + "ex/v0.28.0/init.html#git_repository_init-7" ] } }, "git_repository_init_init_options": { "type": "function", "file": "git2/repository.h", - "line": 313, - "lineto": 315, + "line": 326, + "lineto": 328, "args": [ { "name": "opts", @@ -18471,8 +18830,8 @@ "git_repository_init_ext": { "type": "function", "file": "git2/repository.h", - "line": 330, - "lineto": 333, + "line": 343, + "lineto": 346, "args": [ { "name": "out", @@ -18501,15 +18860,15 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_init_ext-8" + "ex/v0.28.0/init.html#git_repository_init_ext-8" ] } }, "git_repository_head": { "type": "function", "file": "git2/repository.h", - "line": 348, - "lineto": 348, + "line": 361, + "lineto": 361, "args": [ { "name": "out", @@ -18533,19 +18892,19 @@ "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_head-35", - "ex/HEAD/merge.html#git_repository_head-36" + "ex/v0.28.0/merge.html#git_repository_head-35", + "ex/v0.28.0/merge.html#git_repository_head-36" ], "status.c": [ - "ex/HEAD/status.html#git_repository_head-7" + "ex/v0.28.0/status.html#git_repository_head-7" ] } }, "git_repository_head_for_worktree": { "type": "function", "file": "git2/repository.h", - "line": 358, - "lineto": 359, + "line": 371, + "lineto": 372, "args": [ { "name": "out", @@ -18576,8 +18935,8 @@ "git_repository_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 371, - "lineto": 371, + "line": 384, + "lineto": 384, "args": [ { "name": "repo", @@ -18598,8 +18957,8 @@ "git_repository_head_detached_for_worktree": { "type": "function", "file": "git2/repository.h", - "line": 384, - "lineto": 385, + "line": 397, + "lineto": 398, "args": [ { "name": "repo", @@ -18625,8 +18984,8 @@ "git_repository_head_unborn": { "type": "function", "file": "git2/repository.h", - "line": 397, - "lineto": 397, + "line": 410, + "lineto": 410, "args": [ { "name": "repo", @@ -18647,8 +19006,8 @@ "git_repository_is_empty": { "type": "function", "file": "git2/repository.h", - "line": 409, - "lineto": 409, + "line": 422, + "lineto": 422, "args": [ { "name": "repo", @@ -18669,8 +19028,8 @@ "git_repository_item_path": { "type": "function", "file": "git2/repository.h", - "line": 445, - "lineto": 445, + "line": 458, + "lineto": 458, "args": [ { "name": "out", @@ -18701,8 +19060,8 @@ "git_repository_path": { "type": "function", "file": "git2/repository.h", - "line": 456, - "lineto": 456, + "line": 469, + "lineto": 469, "args": [ { "name": "repo", @@ -18721,18 +19080,18 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_path-9" + "ex/v0.28.0/init.html#git_repository_path-9" ], "status.c": [ - "ex/HEAD/status.html#git_repository_path-8" + "ex/v0.28.0/status.html#git_repository_path-8" ] } }, "git_repository_workdir": { "type": "function", "file": "git2/repository.h", - "line": 467, - "lineto": 467, + "line": 480, + "lineto": 480, "args": [ { "name": "repo", @@ -18751,15 +19110,15 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_workdir-10" + "ex/v0.28.0/init.html#git_repository_workdir-10" ] } }, "git_repository_commondir": { "type": "function", "file": "git2/repository.h", - "line": 478, - "lineto": 478, + "line": 491, + "lineto": 491, "args": [ { "name": "repo", @@ -18780,8 +19139,8 @@ "git_repository_set_workdir": { "type": "function", "file": "git2/repository.h", - "line": 497, - "lineto": 498, + "line": 510, + "lineto": 511, "args": [ { "name": "repo", @@ -18812,8 +19171,8 @@ "git_repository_is_bare": { "type": "function", "file": "git2/repository.h", - "line": 506, - "lineto": 506, + "line": 519, + "lineto": 519, "args": [ { "name": "repo", @@ -18832,15 +19191,15 @@ "group": "repository", "examples": { "status.c": [ - "ex/HEAD/status.html#git_repository_is_bare-9" + "ex/v0.28.0/status.html#git_repository_is_bare-9" ] } }, "git_repository_is_worktree": { "type": "function", "file": "git2/repository.h", - "line": 514, - "lineto": 514, + "line": 527, + "lineto": 527, "args": [ { "name": "repo", @@ -18861,8 +19220,8 @@ "git_repository_config": { "type": "function", "file": "git2/repository.h", - "line": 530, - "lineto": 530, + "line": 543, + "lineto": 543, "args": [ { "name": "out", @@ -18888,8 +19247,8 @@ "git_repository_config_snapshot": { "type": "function", "file": "git2/repository.h", - "line": 546, - "lineto": 546, + "line": 559, + "lineto": 559, "args": [ { "name": "out", @@ -18913,16 +19272,16 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_config_snapshot-70", - "ex/HEAD/general.html#git_repository_config_snapshot-71" + "ex/v0.28.0/general.html#git_repository_config_snapshot-70", + "ex/v0.28.0/general.html#git_repository_config_snapshot-71" ] } }, "git_repository_odb": { "type": "function", "file": "git2/repository.h", - "line": 562, - "lineto": 562, + "line": 575, + "lineto": 575, "args": [ { "name": "out", @@ -18946,18 +19305,18 @@ "group": "repository", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_repository_odb-33" + "ex/v0.28.0/cat-file.html#git_repository_odb-33" ], "general.c": [ - "ex/HEAD/general.html#git_repository_odb-72" + "ex/v0.28.0/general.html#git_repository_odb-72" ] } }, "git_repository_refdb": { "type": "function", "file": "git2/repository.h", - "line": 578, - "lineto": 578, + "line": 591, + "lineto": 591, "args": [ { "name": "out", @@ -18983,8 +19342,8 @@ "git_repository_index": { "type": "function", "file": "git2/repository.h", - "line": 594, - "lineto": 594, + "line": 607, + "lineto": 607, "args": [ { "name": "out", @@ -19008,24 +19367,24 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_index-73" + "ex/v0.28.0/general.html#git_repository_index-73" ], "init.c": [ - "ex/HEAD/init.html#git_repository_index-11" + "ex/v0.28.0/init.html#git_repository_index-11" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_repository_index-9" + "ex/v0.28.0/ls-files.html#git_repository_index-9" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_index-37" + "ex/v0.28.0/merge.html#git_repository_index-37" ] } }, "git_repository_message": { "type": "function", "file": "git2/repository.h", - "line": 612, - "lineto": 612, + "line": 625, + "lineto": 625, "args": [ { "name": "out", @@ -19051,8 +19410,8 @@ "git_repository_message_remove": { "type": "function", "file": "git2/repository.h", - "line": 619, - "lineto": 619, + "line": 632, + "lineto": 632, "args": [ { "name": "repo", @@ -19073,8 +19432,8 @@ "git_repository_state_cleanup": { "type": "function", "file": "git2/repository.h", - "line": 628, - "lineto": 628, + "line": 641, + "lineto": 641, "args": [ { "name": "repo", @@ -19093,15 +19452,15 @@ "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_state_cleanup-38" + "ex/v0.28.0/merge.html#git_repository_state_cleanup-38" ] } }, "git_repository_fetchhead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 647, - "lineto": 650, + "line": 660, + "lineto": 663, "args": [ { "name": "repo", @@ -19132,8 +19491,8 @@ "git_repository_mergehead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 667, - "lineto": 670, + "line": 680, + "lineto": 683, "args": [ { "name": "repo", @@ -19164,8 +19523,8 @@ "git_repository_hashfile": { "type": "function", "file": "git2/repository.h", - "line": 695, - "lineto": 700, + "line": 708, + "lineto": 713, "args": [ { "name": "out", @@ -19184,8 +19543,8 @@ }, { "name": "type", - "type": "git_otype", - "comment": "The object type to hash as (e.g. GIT_OBJ_BLOB)" + "type": "git_object_t", + "comment": "The object type to hash as (e.g. GIT_OBJECT_BLOB)" }, { "name": "as_path", @@ -19193,8 +19552,8 @@ "comment": "The path to use to look up filtering rules. If this is\n NULL, then the `path` parameter will be used instead. If\n this is passed as the empty string, then no filters will be\n applied when calculating the hash." } ], - "argline": "git_oid *out, git_repository *repo, const char *path, git_otype type, const char *as_path", - "sig": "git_oid *::git_repository *::const char *::git_otype::const char *", + "argline": "git_oid *out, git_repository *repo, const char *path, git_object_t type, const char *as_path", + "sig": "git_oid *::git_repository *::const char *::git_object_t::const char *", "return": { "type": "int", "comment": " 0 on success, or an error code" @@ -19206,8 +19565,8 @@ "git_repository_set_head": { "type": "function", "file": "git2/repository.h", - "line": 720, - "lineto": 722, + "line": 733, + "lineto": 735, "args": [ { "name": "repo", @@ -19231,15 +19590,15 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head-16" + "ex/v0.28.0/checkout.html#git_repository_set_head-16" ] } }, "git_repository_set_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 740, - "lineto": 742, + "line": 753, + "lineto": 755, "args": [ { "name": "repo", @@ -19265,8 +19624,8 @@ "git_repository_set_head_detached_from_annotated": { "type": "function", "file": "git2/repository.h", - "line": 756, - "lineto": 758, + "line": 769, + "lineto": 771, "args": [ { "name": "repo", @@ -19290,15 +19649,15 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-17" + "ex/v0.28.0/checkout.html#git_repository_set_head_detached_from_annotated-17" ] } }, "git_repository_detach_head": { "type": "function", "file": "git2/repository.h", - "line": 777, - "lineto": 778, + "line": 790, + "lineto": 791, "args": [ { "name": "repo", @@ -19319,8 +19678,8 @@ "git_repository_state": { "type": "function", "file": "git2/repository.h", - "line": 808, - "lineto": 808, + "line": 821, + "lineto": 821, "args": [ { "name": "repo", @@ -19339,18 +19698,18 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_state-18" + "ex/v0.28.0/checkout.html#git_repository_state-18" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_state-39" + "ex/v0.28.0/merge.html#git_repository_state-39" ] } }, "git_repository_set_namespace": { "type": "function", "file": "git2/repository.h", - "line": 822, - "lineto": 822, + "line": 835, + "lineto": 835, "args": [ { "name": "repo", @@ -19376,8 +19735,8 @@ "git_repository_get_namespace": { "type": "function", "file": "git2/repository.h", - "line": 830, - "lineto": 830, + "line": 843, + "lineto": 843, "args": [ { "name": "repo", @@ -19398,8 +19757,8 @@ "git_repository_is_shallow": { "type": "function", "file": "git2/repository.h", - "line": 839, - "lineto": 839, + "line": 852, + "lineto": 852, "args": [ { "name": "repo", @@ -19420,8 +19779,8 @@ "git_repository_ident": { "type": "function", "file": "git2/repository.h", - "line": 851, - "lineto": 851, + "line": 864, + "lineto": 864, "args": [ { "name": "name", @@ -19452,8 +19811,8 @@ "git_repository_set_ident": { "type": "function", "file": "git2/repository.h", - "line": 864, - "lineto": 864, + "line": 877, + "lineto": 877, "args": [ { "name": "repo", @@ -19726,22 +20085,22 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_revparse_single-26" + "ex/v0.28.0/blame.html#git_revparse_single-26" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_revparse_single-34" + "ex/v0.28.0/cat-file.html#git_revparse_single-34" ], "describe.c": [ - "ex/HEAD/describe.html#git_revparse_single-10" + "ex/v0.28.0/describe.html#git_revparse_single-10" ], "log.c": [ - "ex/HEAD/log.html#git_revparse_single-48" + "ex/v0.28.0/log.html#git_revparse_single-48" ], "tag.c": [ - "ex/HEAD/tag.html#git_revparse_single-13", - "ex/HEAD/tag.html#git_revparse_single-14", - "ex/HEAD/tag.html#git_revparse_single-15", - "ex/HEAD/tag.html#git_revparse_single-16" + "ex/v0.28.0/tag.html#git_revparse_single-13", + "ex/v0.28.0/tag.html#git_revparse_single-14", + "ex/v0.28.0/tag.html#git_revparse_single-15", + "ex/v0.28.0/tag.html#git_revparse_single-16" ] } }, @@ -19815,14 +20174,14 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_revparse-27" + "ex/v0.28.0/blame.html#git_revparse-27" ], "log.c": [ - "ex/HEAD/log.html#git_revparse-49" + "ex/v0.28.0/log.html#git_revparse-49" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_revparse-18", - "ex/HEAD/rev-parse.html#git_revparse-19" + "ex/v0.28.0/rev-parse.html#git_revparse-18", + "ex/v0.28.0/rev-parse.html#git_revparse-19" ] } }, @@ -19854,11 +20213,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_new-74" + "ex/v0.28.0/general.html#git_revwalk_new-74" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_new-50", - "ex/HEAD/log.html#git_revwalk_new-51" + "ex/v0.28.0/log.html#git_revwalk_new-50", + "ex/v0.28.0/log.html#git_revwalk_new-51" ] } }, @@ -19912,10 +20271,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_push-75" + "ex/v0.28.0/general.html#git_revwalk_push-75" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_push-52" + "ex/v0.28.0/log.html#git_revwalk_push-52" ] } }, @@ -19969,7 +20328,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/HEAD/log.html#git_revwalk_push_head-53" + "ex/v0.28.0/log.html#git_revwalk_push_head-53" ] } }, @@ -20001,7 +20360,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/HEAD/log.html#git_revwalk_hide-54" + "ex/v0.28.0/log.html#git_revwalk_hide-54" ] } }, @@ -20136,10 +20495,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_next-76" + "ex/v0.28.0/general.html#git_revwalk_next-76" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_next-55" + "ex/v0.28.0/log.html#git_revwalk_next-55" ] } }, @@ -20171,11 +20530,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_sorting-77" + "ex/v0.28.0/general.html#git_revwalk_sorting-77" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_sorting-56", - "ex/HEAD/log.html#git_revwalk_sorting-57" + "ex/v0.28.0/log.html#git_revwalk_sorting-56", + "ex/v0.28.0/log.html#git_revwalk_sorting-57" ] } }, @@ -20251,10 +20610,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_free-78" + "ex/v0.28.0/general.html#git_revwalk_free-78" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_free-58" + "ex/v0.28.0/log.html#git_revwalk_free-58" ] } }, @@ -20308,7 +20667,7 @@ "type": "int", "comment": null }, - "description": "

Adds a callback function to hide a commit and its parents

\n", + "description": "

Adds, changes or removes a callback function to hide a commit and its parents

\n", "comments": "", "group": "revwalk" }, @@ -20336,12 +20695,12 @@ { "name": "time", "type": "git_time_t", - "comment": "time when the action happened" + "comment": "time (in seconds from epoch) when the action happened" }, { "name": "offset", "type": "int", - "comment": "timezone offset in minutes for the time" + "comment": "timezone offset (in minutes) for the time" } ], "argline": "git_signature **out, const char *name, const char *email, git_time_t time, int offset", @@ -20355,8 +20714,8 @@ "group": "signature", "examples": { "general.c": [ - "ex/HEAD/general.html#git_signature_new-79", - "ex/HEAD/general.html#git_signature_new-80" + "ex/v0.28.0/general.html#git_signature_new-79", + "ex/v0.28.0/general.html#git_signature_new-80" ] } }, @@ -20393,7 +20752,7 @@ "group": "signature", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_signature_now-40" + "ex/v0.28.0/merge.html#git_signature_now-40" ] } }, @@ -20425,10 +20784,10 @@ "group": "signature", "examples": { "init.c": [ - "ex/HEAD/init.html#git_signature_default-12" + "ex/v0.28.0/init.html#git_signature_default-12" ], "tag.c": [ - "ex/HEAD/tag.html#git_signature_default-17" + "ex/v0.28.0/tag.html#git_signature_default-17" ] } }, @@ -20509,14 +20868,14 @@ "group": "signature", "examples": { "general.c": [ - "ex/HEAD/general.html#git_signature_free-81", - "ex/HEAD/general.html#git_signature_free-82" + "ex/v0.28.0/general.html#git_signature_free-81", + "ex/v0.28.0/general.html#git_signature_free-82" ], "init.c": [ - "ex/HEAD/init.html#git_signature_free-13" + "ex/v0.28.0/init.html#git_signature_free-13" ], "tag.c": [ - "ex/HEAD/tag.html#git_signature_free-18" + "ex/v0.28.0/tag.html#git_signature_free-18" ] } }, @@ -20529,36 +20888,36 @@ { "name": "out", "type": "git_oid *", - "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + "comment": null }, { "name": "repo", "type": "git_repository *", - "comment": "The owning repository." + "comment": null }, { "name": "stasher", "type": "const git_signature *", - "comment": "The identity of the person performing the stashing." + "comment": null }, { "name": "message", "type": "const char *", - "comment": "Optional description along with the stashed state." + "comment": null }, { "name": "flags", - "type": "uint32_t", - "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" + "type": "int", + "comment": null } ], - "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", - "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", + "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, int flags", + "sig": "git_oid *::git_repository *::const git_signature *::const char *::int", "return": { "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + "comment": null }, - "description": "

Save the local modifications to a new stash.

\n", + "description": "", "comments": "", "group": "stash" }, @@ -20772,7 +21131,7 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_foreach-10" + "ex/v0.28.0/status.html#git_status_foreach-10" ] } }, @@ -20814,7 +21173,7 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_foreach_ext-11" + "ex/v0.28.0/status.html#git_status_foreach_ext-11" ] } }, @@ -20883,8 +21242,8 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_new-12", - "ex/HEAD/status.html#git_status_list_new-13" + "ex/v0.28.0/status.html#git_status_list_new-12", + "ex/v0.28.0/status.html#git_status_list_new-13" ] } }, @@ -20911,8 +21270,8 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_entrycount-14", - "ex/HEAD/status.html#git_status_list_entrycount-15" + "ex/v0.28.0/status.html#git_status_list_entrycount-14", + "ex/v0.28.0/status.html#git_status_list_entrycount-15" ] } }, @@ -20944,12 +21303,12 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_byindex-16", - "ex/HEAD/status.html#git_status_byindex-17", - "ex/HEAD/status.html#git_status_byindex-18", - "ex/HEAD/status.html#git_status_byindex-19", - "ex/HEAD/status.html#git_status_byindex-20", - "ex/HEAD/status.html#git_status_byindex-21" + "ex/v0.28.0/status.html#git_status_byindex-16", + "ex/v0.28.0/status.html#git_status_byindex-17", + "ex/v0.28.0/status.html#git_status_byindex-18", + "ex/v0.28.0/status.html#git_status_byindex-19", + "ex/v0.28.0/status.html#git_status_byindex-20", + "ex/v0.28.0/status.html#git_status_byindex-21" ] } }, @@ -20976,7 +21335,7 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_free-22" + "ex/v0.28.0/status.html#git_status_list_free-22" ] } }, @@ -21035,14 +21394,14 @@ "group": "strarray", "examples": { "general.c": [ - "ex/HEAD/general.html#git_strarray_free-83" + "ex/v0.28.0/general.html#git_strarray_free-83" ], "remote.c": [ - "ex/HEAD/remote.html#git_strarray_free-16", - "ex/HEAD/remote.html#git_strarray_free-17" + "ex/v0.28.0/remote.html#git_strarray_free-16", + "ex/v0.28.0/remote.html#git_strarray_free-17" ], "tag.c": [ - "ex/HEAD/tag.html#git_strarray_free-19" + "ex/v0.28.0/tag.html#git_strarray_free-19" ] } }, @@ -21126,7 +21485,7 @@ "sig": "git_submodule *::int::git_submodule_update_options *", "return": { "type": "int", - "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `giterr_last` for a detailed error message)." + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)." }, "description": "

Update a submodule. This will clone a missing submodule and\n checkout the subrepository to the commit specified in the index of\n the containing repository. If the submodule repository doesn't contain\n the target commit (e.g. because fetchRecurseSubmodules isn't set), then\n the submodule is fetched using the fetch options supplied in options.

\n", "comments": "", @@ -21219,7 +21578,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_foreach-23" + "ex/v0.28.0/status.html#git_submodule_foreach-23" ] } }, @@ -21359,7 +21718,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_name-24" + "ex/v0.28.0/status.html#git_submodule_name-24" ] } }, @@ -21386,7 +21745,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_path-25" + "ex/v0.28.0/status.html#git_submodule_path-25" ] } }, @@ -21931,7 +22290,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_status-26" + "ex/v0.28.0/status.html#git_submodule_status-26" ] } }, @@ -22382,18 +22741,18 @@ }, { "name": "options", - "type": "uint32_t", + "type": "int", "comment": null } ], - "argline": "git_filter_list **out, git_repository *repo, git_filter_mode_t mode, uint32_t options", - "sig": "git_filter_list **::git_repository *::git_filter_mode_t::uint32_t", + "argline": "git_filter_list **out, git_repository *repo, git_filter_mode_t mode, int options", + "sig": "git_filter_list **::git_repository *::git_filter_mode_t::int", "return": { "type": "int", "comment": null }, - "description": "

Create a new empty filter list

\n", - "comments": "

Normally you won't use this because git_filter_list_load will create\n the filter list for you, but you can use this in combination with the\n git_filter_lookup and git_filter_list_push functions to assemble\n your own chains of filters.

\n", + "description": "", + "comments": "", "group": "filter" }, "git_filter_list_push": { @@ -22499,20 +22858,14 @@ "file": "git2/sys/filter.h", "line": 111, "lineto": 111, - "args": [ - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - } - ], - "argline": "const git_filter_source *src", - "sig": "const git_filter_source *", + "args": [], + "argline": "", + "sig": "", "return": { - "type": "uint16_t", + "type": "int", "comment": null }, - "description": "

Get the file mode of the source file\n If the mode is unknown, this will return 0

\n", + "description": "", "comments": "", "group": "filter" }, @@ -22565,20 +22918,14 @@ "file": "git2/sys/filter.h", "line": 128, "lineto": 128, - "args": [ - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - } - ], - "argline": "const git_filter_source *src", - "sig": "const git_filter_source *", + "args": [], + "argline": "", + "sig": "", "return": { - "type": "uint32_t", + "type": "int", "comment": null }, - "description": "

Get the combination git_filter_flag_t options to be applied

\n", + "description": "", "comments": "", "group": "filter" }, @@ -23890,26 +24237,53 @@ "comments": "

Clear the submodule cache populated by git_repository_submodule_cache_all.\n If there is no cache, do nothing.

\n\n

The cache incorporates data from the repository's configuration, as well\n as the state of the working tree, the index, and HEAD. So any time any\n of these has changed, the cache might become invalid.

\n", "group": "repository" }, + "git_stream_register": { + "type": "function", + "file": "git2/sys/stream.h", + "line": 98, + "lineto": 99, + "args": [ + { + "name": "type", + "type": "git_stream_t", + "comment": "the type or types of stream to register" + }, + { + "name": "registration", + "type": "git_stream_registration *", + "comment": "the registration data" + } + ], + "argline": "git_stream_t type, git_stream_registration *registration", + "sig": "git_stream_t::git_stream_registration *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Register stream constructors for the library to use

\n", + "comments": "

If a registration structure is already set, it will be overwritten.\n Pass NULL in order to deregister the current constructor and return\n to the system defaults.

\n\n

The type parameter may be a bitwise AND of types.

\n", + "group": "stream" + }, "git_stream_register_tls": { "type": "function", "file": "git2/sys/stream.h", - "line": 54, - "lineto": 54, + "line": 130, + "lineto": 130, "args": [ { "name": "ctor", "type": "git_stream_cb", - "comment": "the constructor to use" + "comment": null } ], "argline": "git_stream_cb ctor", "sig": "git_stream_cb", "return": { "type": "int", - "comment": " 0 or an error code" + "comment": null }, - "description": "

Register a TLS stream constructor for the library to use

\n", - "comments": "

If a constructor is already set, it will be overwritten. Pass\n NULL in order to deregister the current constructor.

\n", + "description": "

Register a TLS stream constructor for the library to use. This stream\n will not support HTTP CONNECT proxies. This internally calls\n git_stream_register and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", "group": "stream" }, "git_time_monotonic": { @@ -23931,8 +24305,8 @@ "git_transport_init": { "type": "function", "file": "git2/sys/transport.h", - "line": 119, - "lineto": 121, + "line": 137, + "lineto": 139, "args": [ { "name": "opts", @@ -23958,8 +24332,8 @@ "git_transport_new": { "type": "function", "file": "git2/sys/transport.h", - "line": 133, - "lineto": 133, + "line": 151, + "lineto": 151, "args": [ { "name": "out", @@ -23990,8 +24364,8 @@ "git_transport_ssh_with_paths": { "type": "function", "file": "git2/sys/transport.h", - "line": 149, - "lineto": 149, + "line": 167, + "lineto": 167, "args": [ { "name": "out", @@ -24022,8 +24396,8 @@ "git_transport_register": { "type": "function", "file": "git2/sys/transport.h", - "line": 164, - "lineto": 167, + "line": 182, + "lineto": 185, "args": [ { "name": "prefix", @@ -24054,8 +24428,8 @@ "git_transport_unregister": { "type": "function", "file": "git2/sys/transport.h", - "line": 177, - "lineto": 178, + "line": 198, + "lineto": 199, "args": [ { "name": "prefix", @@ -24070,14 +24444,14 @@ "comment": " 0 or an error code" }, "description": "

Unregister a custom transport definition which was previously registered\n with git_transport_register.

\n", - "comments": "", + "comments": "

The caller is responsible for synchronizing calls to git_transport_register\n and git_transport_unregister with other calls to the library that\n instantiate transports.

\n", "group": "transport" }, "git_transport_dummy": { "type": "function", "file": "git2/sys/transport.h", - "line": 191, - "lineto": 194, + "line": 212, + "lineto": 215, "args": [ { "name": "out", @@ -24108,8 +24482,8 @@ "git_transport_local": { "type": "function", "file": "git2/sys/transport.h", - "line": 204, - "lineto": 207, + "line": 225, + "lineto": 228, "args": [ { "name": "out", @@ -24140,8 +24514,8 @@ "git_transport_smart": { "type": "function", "file": "git2/sys/transport.h", - "line": 217, - "lineto": 220, + "line": 238, + "lineto": 241, "args": [ { "name": "out", @@ -24172,8 +24546,8 @@ "git_transport_smart_certificate_check": { "type": "function", "file": "git2/sys/transport.h", - "line": 231, - "lineto": 231, + "line": 255, + "lineto": 255, "args": [ { "name": "transport", @@ -24200,7 +24574,7 @@ "sig": "git_transport *::git_cert *::int::const char *", "return": { "type": "int", - "comment": " the return value of the callback" + "comment": " the return value of the callback: 0 for no error, GIT_PASSTHROUGH\n to indicate that there is no callback registered (or the callback\n refused to validate the certificate and callers should behave as\n if no callback was set), or \n<\n 0 for an error" }, "description": "

Call the certificate check for this transport.

\n", "comments": "", @@ -24209,8 +24583,8 @@ "git_transport_smart_credentials": { "type": "function", "file": "git2/sys/transport.h", - "line": 242, - "lineto": 242, + "line": 269, + "lineto": 269, "args": [ { "name": "out", @@ -24237,7 +24611,7 @@ "sig": "git_cred **::git_transport *::const char *::int", "return": { "type": "int", - "comment": " the return value of the callback" + "comment": " the return value of the callback: 0 for no error, GIT_PASSTHROUGH\n to indicate that there is no callback registered (or the callback\n refused to provide credentials and callers should behave as if no\n callback was set), or \n<\n 0 for an error" }, "description": "

Call the credentials callback for this transport

\n", "comments": "", @@ -24246,8 +24620,8 @@ "git_transport_smart_proxy_options": { "type": "function", "file": "git2/sys/transport.h", - "line": 252, - "lineto": 252, + "line": 279, + "lineto": 279, "args": [ { "name": "out", @@ -24273,8 +24647,8 @@ "git_smart_subtransport_http": { "type": "function", "file": "git2/sys/transport.h", - "line": 362, - "lineto": 365, + "line": 408, + "lineto": 411, "args": [ { "name": "out", @@ -24298,15 +24672,15 @@ "type": "int", "comment": " 0 or an error code" }, - "description": "

Create an instance of the http subtransport. This subtransport\n also supports https. On Win32, this subtransport may be implemented\n using the WinHTTP library.

\n", - "comments": "", + "description": "

Create an instance of the http subtransport.

\n", + "comments": "

This subtransport also supports https.

\n", "group": "smart" }, "git_smart_subtransport_git": { "type": "function", "file": "git2/sys/transport.h", - "line": 374, - "lineto": 377, + "line": 420, + "lineto": 423, "args": [ { "name": "out", @@ -24337,8 +24711,8 @@ "git_smart_subtransport_ssh": { "type": "function", "file": "git2/sys/transport.h", - "line": 386, - "lineto": 389, + "line": 432, + "lineto": 435, "args": [ { "name": "out", @@ -24399,7 +24773,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_lookup-84" + "ex/v0.28.0/general.html#git_tag_lookup-84" ] } }, @@ -24463,7 +24837,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_free-85" + "ex/v0.28.0/general.html#git_tag_free-85" ] } }, @@ -24539,7 +24913,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_target-86" + "ex/v0.28.0/general.html#git_tag_target-86" ] } }, @@ -24566,7 +24940,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_target_id-35" + "ex/v0.28.0/cat-file.html#git_tag_target_id-35" ] } }, @@ -24585,7 +24959,7 @@ "argline": "const git_tag *tag", "sig": "const git_tag *", "return": { - "type": "git_otype", + "type": "git_object_t", "comment": " type of the tagged object" }, "description": "

Get the type of a tag's tagged object

\n", @@ -24593,10 +24967,10 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_target_type-36" + "ex/v0.28.0/cat-file.html#git_tag_target_type-36" ], "general.c": [ - "ex/HEAD/general.html#git_tag_target_type-87" + "ex/v0.28.0/general.html#git_tag_target_type-87" ] } }, @@ -24623,13 +24997,13 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_name-37" + "ex/v0.28.0/cat-file.html#git_tag_name-37" ], "general.c": [ - "ex/HEAD/general.html#git_tag_name-88" + "ex/v0.28.0/general.html#git_tag_name-88" ], "tag.c": [ - "ex/HEAD/tag.html#git_tag_name-20" + "ex/v0.28.0/tag.html#git_tag_name-20" ] } }, @@ -24656,7 +25030,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_tagger-38" + "ex/v0.28.0/cat-file.html#git_tag_tagger-38" ] } }, @@ -24683,14 +25057,14 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_message-39", - "ex/HEAD/cat-file.html#git_tag_message-40" + "ex/v0.28.0/cat-file.html#git_tag_message-39", + "ex/v0.28.0/cat-file.html#git_tag_message-40" ], "general.c": [ - "ex/HEAD/general.html#git_tag_message-89" + "ex/v0.28.0/general.html#git_tag_message-89" ], "tag.c": [ - "ex/HEAD/tag.html#git_tag_message-21" + "ex/v0.28.0/tag.html#git_tag_message-21" ] } }, @@ -24747,7 +25121,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_create-22" + "ex/v0.28.0/tag.html#git_tag_create-22" ] } }, @@ -24878,7 +25252,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_create_lightweight-23" + "ex/v0.28.0/tag.html#git_tag_create_lightweight-23" ] } }, @@ -24910,7 +25284,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_delete-24" + "ex/v0.28.0/tag.html#git_tag_delete-24" ] } }, @@ -24974,7 +25348,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_list_match-25" + "ex/v0.28.0/tag.html#git_tag_list_match-25" ] } }, @@ -25685,14 +26059,14 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_lookup-90", - "ex/HEAD/general.html#git_tree_lookup-91" + "ex/v0.28.0/general.html#git_tree_lookup-90", + "ex/v0.28.0/general.html#git_tree_lookup-91" ], "init.c": [ - "ex/HEAD/init.html#git_tree_lookup-14" + "ex/v0.28.0/init.html#git_tree_lookup-14" ], "merge.c": [ - "ex/HEAD/merge.html#git_tree_lookup-41" + "ex/v0.28.0/merge.html#git_tree_lookup-41" ] } }, @@ -25756,22 +26130,22 @@ "group": "tree", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_tree_free-17", - "ex/HEAD/diff.html#git_tree_free-18" + "ex/v0.28.0/diff.html#git_tree_free-17", + "ex/v0.28.0/diff.html#git_tree_free-18" ], "general.c": [ - "ex/HEAD/general.html#git_tree_free-92", - "ex/HEAD/general.html#git_tree_free-93" + "ex/v0.28.0/general.html#git_tree_free-92", + "ex/v0.28.0/general.html#git_tree_free-93" ], "init.c": [ - "ex/HEAD/init.html#git_tree_free-15" + "ex/v0.28.0/init.html#git_tree_free-15" ], "log.c": [ - "ex/HEAD/log.html#git_tree_free-59", - "ex/HEAD/log.html#git_tree_free-60", - "ex/HEAD/log.html#git_tree_free-61", - "ex/HEAD/log.html#git_tree_free-62", - "ex/HEAD/log.html#git_tree_free-63" + "ex/v0.28.0/log.html#git_tree_free-59", + "ex/v0.28.0/log.html#git_tree_free-60", + "ex/v0.28.0/log.html#git_tree_free-61", + "ex/v0.28.0/log.html#git_tree_free-62", + "ex/v0.28.0/log.html#git_tree_free-63" ] } }, @@ -25842,10 +26216,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entrycount-41" + "ex/v0.28.0/cat-file.html#git_tree_entrycount-41" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entrycount-94" + "ex/v0.28.0/general.html#git_tree_entrycount-94" ] } }, @@ -25877,7 +26251,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_entry_byname-95" + "ex/v0.28.0/general.html#git_tree_entry_byname-95" ] } }, @@ -25909,10 +26283,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_byindex-42" + "ex/v0.28.0/cat-file.html#git_tree_entry_byindex-42" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entry_byindex-96" + "ex/v0.28.0/general.html#git_tree_entry_byindex-96" ] } }, @@ -26047,11 +26421,11 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_name-43" + "ex/v0.28.0/cat-file.html#git_tree_entry_name-43" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entry_name-97", - "ex/HEAD/general.html#git_tree_entry_name-98" + "ex/v0.28.0/general.html#git_tree_entry_name-97", + "ex/v0.28.0/general.html#git_tree_entry_name-98" ] } }, @@ -26078,7 +26452,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_id-44" + "ex/v0.28.0/cat-file.html#git_tree_entry_id-44" ] } }, @@ -26097,7 +26471,7 @@ "argline": "const git_tree_entry *entry", "sig": "const git_tree_entry *", "return": { - "type": "git_otype", + "type": "git_object_t", "comment": " the type of the pointed object" }, "description": "

Get the type of the object pointed by the entry

\n", @@ -26105,7 +26479,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_type-45" + "ex/v0.28.0/cat-file.html#git_tree_entry_type-45" ] } }, @@ -26132,7 +26506,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_filemode-46" + "ex/v0.28.0/cat-file.html#git_tree_entry_filemode-46" ] } }, @@ -26218,7 +26592,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_entry_to_object-99" + "ex/v0.28.0/general.html#git_tree_entry_to_object-99" ] } }, @@ -27015,6 +27389,58 @@ } }, "callbacks": { + "git_apply_delta_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 36, + "lineto": 38, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "The delta to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_delta *delta, void *payload", + "sig": "const git_diff_delta *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

When applying a patch, callback that will be made per delta (file).

\n", + "comments": "

When the callback:\n - returns \n<\n 0, the apply process will be aborted.\n - returns > 0, the delta will not be applied, but the apply process\n continues\n - returns 0, the delta is applied, and the apply process continues.

\n" + }, + "git_apply_hunk_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 52, + "lineto": 54, + "args": [ + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "The hunk to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_hunk *hunk, void *payload", + "sig": "const git_diff_hunk *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

When applying a patch, callback that will be made per hunk.

\n", + "comments": "

When the callback:\n - returns \n<\n 0, the apply process will be aborted.\n - returns > 0, the hunk will not be applied, but the apply process\n continues\n - returns 0, the hunk is applied, and the apply process continues.

\n" + }, "git_attr_foreach_cb": { "type": "callback", "file": "git2/attr.h", @@ -27461,8 +27887,8 @@ "git_index_matched_path_cb": { "type": "callback", "file": "git2/index.h", - "line": 146, - "lineto": 147, + "line": 135, + "lineto": 136, "args": [ { "name": "path", @@ -27616,12 +28042,12 @@ }, { "name": "current", - "type": "uint32_t", + "type": "int", "comment": null }, { "name": "total", - "type": "uint32_t", + "type": "int", "comment": null }, { @@ -27630,8 +28056,8 @@ "comment": null } ], - "argline": "int stage, uint32_t current, uint32_t total, void *payload", - "sig": "int::uint32_t::uint32_t::void *", + "argline": "int stage, int current, int total, void *payload", + "sig": "int::int::int::void *", "return": { "type": "int", "comment": null @@ -27694,8 +28120,8 @@ "git_push_transfer_progress": { "type": "callback", "file": "git2/remote.h", - "line": 351, - "lineto": 355, + "line": 425, + "lineto": 429, "args": [ { "name": "current", @@ -27730,8 +28156,8 @@ "git_push_negotiation": { "type": "callback", "file": "git2/remote.h", - "line": 386, - "lineto": 386, + "line": 460, + "lineto": 460, "args": [ { "name": "updates", @@ -27761,8 +28187,8 @@ "git_push_update_reference_cb": { "type": "callback", "file": "git2/remote.h", - "line": 400, - "lineto": 400, + "line": 474, + "lineto": 474, "args": [ { "name": "refname", @@ -27792,8 +28218,8 @@ "git_repository_fetchhead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 630, - "lineto": 634, + "line": 643, + "lineto": 647, "args": [ { "name": "ref_name", @@ -27833,8 +28259,8 @@ "git_repository_mergehead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 652, - "lineto": 653, + "line": 665, + "lineto": 666, "args": [ { "name": "oid", @@ -28252,7 +28678,7 @@ }, { "name": "mode_out", - "type": "uint32_t *", + "type": "int *", "comment": null }, { @@ -28271,8 +28697,8 @@ "comment": null } ], - "argline": "git_merge_driver *self, const char **path_out, uint32_t *mode_out, git_buf *merged_out, const char *filter_name, const git_merge_driver_source *src", - "sig": "git_merge_driver *::const char **::uint32_t *::git_buf *::const char *::const git_merge_driver_source *", + "argline": "git_merge_driver *self, const char **path_out, int *mode_out, git_buf *merged_out, const char *filter_name, const git_merge_driver_source *src", + "sig": "git_merge_driver *::const char **::int *::git_buf *::const char *::const git_merge_driver_source *", "return": { "type": "int", "comment": null @@ -28283,8 +28709,8 @@ "git_stream_cb": { "type": "callback", "file": "git2/sys/stream.h", - "line": 43, - "lineto": 43, + "line": 117, + "lineto": 117, "args": [ { "name": "out", @@ -28314,8 +28740,8 @@ "git_smart_subtransport_cb": { "type": "callback", "file": "git2/sys/transport.h", - "line": 325, - "lineto": 328, + "line": 364, + "lineto": 367, "args": [ { "name": "out", @@ -28339,7 +28765,7 @@ "type": "int", "comment": null }, - "description": "", + "description": "

A function which creates a new subtransport for the smart transport

\n", "comments": "" }, "git_tag_foreach_cb": { @@ -28633,8 +29059,8 @@ "git_transfer_progress_cb": { "type": "callback", "file": "git2/types.h", - "line": 274, - "lineto": 274, + "line": 275, + "lineto": 275, "args": [ { "name": "stats", @@ -28659,8 +29085,8 @@ "git_transport_message_cb": { "type": "callback", "file": "git2/types.h", - "line": 284, - "lineto": 284, + "line": 285, + "lineto": 285, "args": [ { "name": "str", @@ -28690,8 +29116,8 @@ "git_transport_certificate_check_cb": { "type": "callback", "file": "git2/types.h", - "line": 334, - "lineto": 334, + "line": 338, + "lineto": 338, "args": [ { "name": "cert", @@ -28718,7 +29144,7 @@ "sig": "git_cert *::int::const char *::void *", "return": { "type": "int", - "comment": null + "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" }, "description": "

Callback for the user's custom certificate checks.

\n", "comments": "" @@ -28929,8 +29355,8 @@ "type": "struct", "value": "git_annotated_commit", "file": "git2/types.h", - "line": 185, - "lineto": 185, + "line": 186, + "lineto": 186, "tdef": "typedef", "description": " Annotated commits, the input to merge and rebase. ", "comments": "", @@ -28948,6 +29374,7 @@ "git_branch_create_from_annotated", "git_merge", "git_merge_analysis", + "git_merge_analysis_for_ref", "git_rebase_init", "git_repository_set_head_detached_from_annotated", "git_reset_from_annotated" @@ -28955,6 +29382,99 @@ } } ], + [ + "git_apply_location_t", + { + "decl": [ + "GIT_APPLY_LOCATION_WORKDIR", + "GIT_APPLY_LOCATION_INDEX", + "GIT_APPLY_LOCATION_BOTH" + ], + "type": "enum", + "file": "git2/apply.h", + "line": 92, + "lineto": 110, + "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_LOCATION_WORKDIR", + "comments": "

Apply the patch to the workdir, leaving the index untouched.\n This is the equivalent of git apply with no location argument.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_INDEX", + "comments": "

Apply the patch to the index, leaving the working directory\n untouched. This is the equivalent of git apply --cached.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_BOTH", + "comments": "

Apply the patch to both the working directory and the index.\n This is the equivalent of git apply --index.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [ + "git_apply" + ] + } + } + ], + [ + "git_apply_options", + { + "decl": [ + "unsigned int version", + "git_apply_delta_cb delta_cb", + "git_apply_hunk_cb hunk_cb", + "void * payload" + ], + "type": "struct", + "value": "git_apply_options", + "file": "git2/apply.h", + "line": 64, + "lineto": 70, + "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload", + "tdef": "typedef", + "description": " Apply options structure", + "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can\n use git_apply_init_options.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_apply_delta_cb", + "name": "delta_cb", + "comments": "" + }, + { + "type": "git_apply_hunk_cb", + "name": "hunk_cb", + "comments": "" + }, + { + "type": "void *", + "name": "payload", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_apply", + "git_apply_to_tree" + ] + } + } + ], [ "git_attr_t", { @@ -29030,7 +29550,6 @@ "git_blame_free", "git_blame_get_hunk_byindex", "git_blame_get_hunk_byline", - "git_blame_get_hunk_count", "git_blame_init_options" ] } @@ -29190,8 +29709,8 @@ { "decl": [ "unsigned int version", - "uint32_t flags", - "uint16_t min_match_characters", + "int flags", + "int min_match_characters", "git_oid newest_commit", "git_oid oldest_commit", "size_t min_line", @@ -29202,10 +29721,10 @@ "file": "git2/blame.h", "line": 59, "lineto": 88, - "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", + "block": "unsigned int version\nint flags\nint min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", "tdef": "typedef", - "description": " Blame options structure", - "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can\n use git_blame_init_options.

\n", + "description": "", + "comments": "", "fields": [ { "type": "unsigned int", @@ -29213,14 +29732,14 @@ "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "flags", - "comments": " A combination of `git_blame_flag_t` " + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "min_match_characters", - "comments": " The lower bound on the number of alphanumeric\n characters that must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value is 20.\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." + "comments": "" }, { "type": "git_oid", @@ -29259,8 +29778,8 @@ "type": "struct", "value": "git_blob", "file": "git2/types.h", - "line": 123, - "lineto": 123, + "line": 121, + "lineto": 121, "tdef": "typedef", "description": " In-memory representation of a blob object. ", "comments": "", @@ -29322,8 +29841,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 202, - "lineto": 206, + "line": 203, + "lineto": 207, "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", "tdef": "typedef", "description": " Basic type of any Git branch. ", @@ -29454,8 +29973,8 @@ "type": "struct", "value": "git_cert", "file": "git2/types.h", - "line": 318, - "lineto": 323, + "line": 319, + "lineto": 324, "block": "git_cert_t cert_type", "tdef": "typedef", "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", @@ -29568,8 +30087,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 290, - "lineto": 313, + "line": 291, + "lineto": 314, "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", "tdef": "typedef", "description": " Type of host certificate structure that is passed to the check callback", @@ -30275,8 +30794,8 @@ "type": "struct", "value": "git_commit", "file": "git2/types.h", - "line": 126, - "lineto": 126, + "line": 124, + "lineto": 124, "tdef": "typedef", "description": " Parsed representation of a commit object. ", "comments": "", @@ -30335,8 +30854,8 @@ "type": "struct", "value": "git_config", "file": "git2/types.h", - "line": 144, - "lineto": 144, + "line": 145, + "lineto": 145, "tdef": "typedef", "description": " Memory representation of a set of config files ", "comments": "", @@ -30395,8 +30914,8 @@ "type": "struct", "value": "git_config_backend", "file": "git2/types.h", - "line": 147, - "lineto": 147, + "line": 148, + "lineto": 148, "block": "unsigned int version\nint readonly\nstruct git_config * cfg\nint (*)(struct git_config_backend *, git_config_level_t, const git_repository *) open\nint (*)(struct git_config_backend *, const char *, git_config_entry **) get\nint (*)(struct git_config_backend *, const char *, const char *) set\nint (*)(git_config_backend *, const char *, const char *, const char *) set_multivar\nint (*)(struct git_config_backend *, const char *) del\nint (*)(struct git_config_backend *, const char *, const char *) del_multivar\nint (*)(git_config_iterator **, struct git_config_backend *) iterator\nint (*)(struct git_config_backend **, struct git_config_backend *) snapshot\nint (*)(struct git_config_backend *) lock\nint (*)(struct git_config_backend *, int) unlock\nvoid (*)(struct git_config_backend *) free", "tdef": "typedef", "description": " Interface to access a configuration file ", @@ -30455,17 +30974,17 @@ { "type": "int (*)(struct git_config_backend **, struct git_config_backend *)", "name": "snapshot", - "comments": " Produce a read-only version of this backend " + "comments": "" }, { "type": "int (*)(struct git_config_backend *)", "name": "lock", - "comments": " Lock this backend.\n\n Prevent any writes to the data store backing this\n backend. Any updates must not be visible to any other\n readers." + "comments": "" }, { "type": "int (*)(struct git_config_backend *, int)", "name": "unlock", - "comments": " Unlock the data store backing this backend. If success is\n true, the changes should be committed, otherwise rolled\n back." + "comments": "" }, { "type": "void (*)(struct git_config_backend *)", @@ -30527,7 +31046,7 @@ { "type": "void (*)(struct git_config_entry *)", "name": "free", - "comments": " Free function for this entry " + "comments": "" }, { "type": "void *", @@ -30572,12 +31091,12 @@ { "type": "int (*)(git_config_entry **, git_config_iterator *)", "name": "next", - "comments": " Return the current entry and advance the iterator. The\n memory belongs to the library." + "comments": "" }, { "type": "void (*)(git_config_iterator *)", "name": "free", - "comments": " Free the iterator" + "comments": "" } ], "used": { @@ -31454,6 +31973,10 @@ "git_pathspec_match_list_diff_entry" ], "needs": [ + "git_apply", + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_to_tree", "git_checkout_notify_cb", "git_diff_binary_cb", "git_diff_blob_to_buffer", @@ -31649,9 +32172,9 @@ { "decl": [ "git_delta_t status", - "uint32_t flags", - "uint16_t similarity", - "uint16_t nfiles", + "int flags", + "int similarity", + "int nfiles", "git_diff_file old_file", "git_diff_file new_file" ], @@ -31660,10 +32183,10 @@ "file": "git2/diff.h", "line": 309, "lineto": 316, - "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", + "block": "git_delta_t status\nint flags\nint similarity\nint nfiles\ngit_diff_file old_file\ngit_diff_file new_file", "tdef": "typedef", - "description": " Description of changes to one entry.", - "comments": "

A delta is a file pair with an old and new revision. The old version\n may be absent if the file was just created and the new version may be\n absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and\n you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file\n represents to "to" side of the diff. What those means depend on the\n function that was used to generate the diff and will be documented below.\n You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file",\n they actually may correspond to entries that represent a file, a symbolic\n link, a submodule commit id, or even a tree (if you are tracking type\n changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will\n be filled in, but we generally try to fill in as much as possible. One\n example is that the "flags" field may not have either the BINARY or the\n NOT_BINARY flag set to avoid examining file contents if you do not pass\n in hunk and/or line callbacks to the diff foreach iteration function. It\n will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar()\n which does a similarity analysis of files in the diff. Use that\n function to do rename and copy detection, and to split heavily modified\n files in add/delete pairs. After that call, deltas with a status of\n GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score\n between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to\n break, but to not actually break the records, then GIT_DELTA_MODIFIED\n records may have a non-zero similarity score if the self-similarity is\n below the split threshold. To display this value like core Git, invert\n the score (a la printf("M%03d", 100 - delta->similarity)).

\n", + "description": "", + "comments": "", "fields": [ { "type": "git_delta_t", @@ -31671,19 +32194,19 @@ "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "flags", - "comments": " git_diff_flag_t values " + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "similarity", - "comments": " for RENAMED and COPIED, value 0-100 " + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "nfiles", - "comments": " number of files in this delta " + "comments": "" }, { "type": "git_diff_file", @@ -31703,6 +32226,7 @@ "git_pathspec_match_list_diff_entry" ], "needs": [ + "git_apply_delta_cb", "git_diff_binary_cb", "git_diff_file_cb", "git_diff_hunk_cb", @@ -31721,19 +32245,19 @@ "git_oid id", "const char * path", "git_off_t size", - "uint32_t flags", - "uint16_t mode", - "uint16_t id_abbrev" + "int flags", + "int mode", + "int id_abbrev" ], "type": "struct", "value": "git_diff_file", "file": "git2/diff.h", "line": 260, "lineto": 267, - "block": "git_oid id\nconst char * path\ngit_off_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", + "block": "git_oid id\nconst char * path\ngit_off_t size\nint flags\nint mode\nint id_abbrev", "tdef": "typedef", - "description": " Description of one side of a delta.", - "comments": "

Although this is called a "file", it could represent a file, a symbolic\n link, a submodule commit id, or even a tree (although that only if you\n are tracking type changes or ignored/untracked directories).

\n\n

The id is the git_oid of the item. If the entry represents an\n absent side of a diff (e.g. the old_file of a GIT_DELTA_ADDED delta),\n then the oid will be zeroes.

\n\n

path is the NUL-terminated path to the entry relative to the working\n directory of the repository.

\n\n

size is the size of the entry in bytes.

\n\n

flags is a combination of the git_diff_flag_t types

\n\n

mode is, roughly, the stat() st_mode value for the item. This will\n be restricted to one of the git_filemode_t values.

\n\n

The id_abbrev represents the known length of the id field, when\n converted to a hex string. It is generally GIT_OID_HEXSZ, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters.

\n", + "description": "", + "comments": "", "fields": [ { "type": "git_oid", @@ -31751,17 +32275,17 @@ "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "flags", "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "mode", "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "id_abbrev", "comments": "" } @@ -31783,11 +32307,11 @@ { "decl": [ "unsigned int version", - "uint32_t flags", - "uint16_t rename_threshold", - "uint16_t rename_from_rewrite_threshold", - "uint16_t copy_threshold", - "uint16_t break_rewrite_threshold", + "int flags", + "int rename_threshold", + "int rename_from_rewrite_threshold", + "int copy_threshold", + "int break_rewrite_threshold", "size_t rename_limit", "git_diff_similarity_metric * metric" ], @@ -31796,10 +32320,10 @@ "file": "git2/diff.h", "line": 718, "lineto": 772, - "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", + "block": "unsigned int version\nint flags\nint rename_threshold\nint rename_from_rewrite_threshold\nint copy_threshold\nint break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", "tdef": "typedef", - "description": " Control behavior of rename and copy detection", - "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", + "description": "", + "comments": "", "fields": [ { "type": "unsigned int", @@ -31807,29 +32331,29 @@ "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "flags", - "comments": " Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing." + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "rename_threshold", - "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "rename_from_rewrite_threshold", - "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "copy_threshold", - "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "break_rewrite_threshold", - "comments": " Treshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." + "comments": "" }, { "type": "size_t", @@ -32257,6 +32781,7 @@ "used": { "returns": [], "needs": [ + "git_apply_hunk_cb", "git_diff_blob_to_buffer", "git_diff_blobs", "git_diff_buffers", @@ -32665,15 +33190,15 @@ { "decl": [ "unsigned int version", - "uint32_t flags", + "int flags", "git_submodule_ignore_t ignore_submodules", "git_strarray pathspec", "git_diff_notify_cb notify_cb", "git_diff_progress_cb progress_cb", "void * payload", - "uint32_t context_lines", - "uint32_t interhunk_lines", - "uint16_t id_abbrev", + "int context_lines", + "int interhunk_lines", + "int id_abbrev", "git_off_t max_size", "const char * old_prefix", "const char * new_prefix" @@ -32683,10 +33208,10 @@ "file": "git2/diff.h", "line": 361, "lineto": 433, - "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", + "block": "unsigned int version\nint flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nint context_lines\nint interhunk_lines\nint id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", "tdef": "typedef", - "description": " Structure describing options about how the diff should be executed.", - "comments": "

Setting all values of the structure to zero will yield the default\n values. Similarly, passing NULL for the options structure will\n give the defaults. The default values are marked below.

\n", + "description": "", + "comments": "", "fields": [ { "type": "unsigned int", @@ -32694,9 +33219,9 @@ "comments": " version for the struct " }, { - "type": "uint32_t", + "type": "int", "name": "flags", - "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" + "comments": "" }, { "type": "git_submodule_ignore_t", @@ -32724,19 +33249,19 @@ "comments": " The payload to pass to the callback functions. " }, { - "type": "uint32_t", + "type": "int", "name": "context_lines", - "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." + "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "interhunk_lines", - "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." + "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "id_abbrev", - "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." + "comments": "" }, { "type": "git_off_t", @@ -33034,8 +33559,8 @@ "type": "struct", "value": "git_error", "file": "git2/errors.h", - "line": 68, - "lineto": 71, + "line": 69, + "lineto": 72, "block": "char * message\nint klass", "tdef": "typedef", "description": " Structure to store extra details of the last error that occurred.", @@ -33054,6 +33579,7 @@ ], "used": { "returns": [ + "git_error_last", "giterr_last" ], "needs": [] @@ -33092,13 +33618,14 @@ "GIT_ITEROVER", "GIT_RETRY", "GIT_EMISMATCH", - "GIT_EINDEXDIRTY" + "GIT_EINDEXDIRTY", + "GIT_EAPPLYFAIL" ], "type": "enum", "file": "git2/errors.h", "line": 21, - "lineto": 60, - "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY", + "lineto": 61, + "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL", "tdef": "typedef", "description": " Generic return codes ", "comments": "", @@ -33250,7 +33777,7 @@ { "type": "int", "name": "GIT_PASSTHROUGH", - "comments": "

Internal only

\n", + "comments": "

A user-configured callback refused to act

\n", "value": -30 }, { @@ -33276,6 +33803,12 @@ "name": "GIT_EINDEXDIRTY", "comments": "

Unsaved changes in the index would be overwritten

\n", "value": -34 + }, + { + "type": "int", + "name": "GIT_EAPPLYFAIL", + "comments": "

Patch application failed

\n", + "value": -35 } ], "used": { @@ -33288,251 +33821,251 @@ "git_error_t", { "decl": [ - "GITERR_NONE", - "GITERR_NOMEMORY", - "GITERR_OS", - "GITERR_INVALID", - "GITERR_REFERENCE", - "GITERR_ZLIB", - "GITERR_REPOSITORY", - "GITERR_CONFIG", - "GITERR_REGEX", - "GITERR_ODB", - "GITERR_INDEX", - "GITERR_OBJECT", - "GITERR_NET", - "GITERR_TAG", - "GITERR_TREE", - "GITERR_INDEXER", - "GITERR_SSL", - "GITERR_SUBMODULE", - "GITERR_THREAD", - "GITERR_STASH", - "GITERR_CHECKOUT", - "GITERR_FETCHHEAD", - "GITERR_MERGE", - "GITERR_SSH", - "GITERR_FILTER", - "GITERR_REVERT", - "GITERR_CALLBACK", - "GITERR_CHERRYPICK", - "GITERR_DESCRIBE", - "GITERR_REBASE", - "GITERR_FILESYSTEM", - "GITERR_PATCH", - "GITERR_WORKTREE", - "GITERR_SHA1" + "GIT_ERROR_NONE", + "GIT_ERROR_NOMEMORY", + "GIT_ERROR_OS", + "GIT_ERROR_INVALID", + "GIT_ERROR_REFERENCE", + "GIT_ERROR_ZLIB", + "GIT_ERROR_REPOSITORY", + "GIT_ERROR_CONFIG", + "GIT_ERROR_REGEX", + "GIT_ERROR_ODB", + "GIT_ERROR_INDEX", + "GIT_ERROR_OBJECT", + "GIT_ERROR_NET", + "GIT_ERROR_TAG", + "GIT_ERROR_TREE", + "GIT_ERROR_INDEXER", + "GIT_ERROR_SSL", + "GIT_ERROR_SUBMODULE", + "GIT_ERROR_THREAD", + "GIT_ERROR_STASH", + "GIT_ERROR_CHECKOUT", + "GIT_ERROR_FETCHHEAD", + "GIT_ERROR_MERGE", + "GIT_ERROR_SSH", + "GIT_ERROR_FILTER", + "GIT_ERROR_REVERT", + "GIT_ERROR_CALLBACK", + "GIT_ERROR_CHERRYPICK", + "GIT_ERROR_DESCRIBE", + "GIT_ERROR_REBASE", + "GIT_ERROR_FILESYSTEM", + "GIT_ERROR_PATCH", + "GIT_ERROR_WORKTREE", + "GIT_ERROR_SHA1" ], "type": "enum", "file": "git2/errors.h", - "line": 74, - "lineto": 109, - "block": "GITERR_NONE\nGITERR_NOMEMORY\nGITERR_OS\nGITERR_INVALID\nGITERR_REFERENCE\nGITERR_ZLIB\nGITERR_REPOSITORY\nGITERR_CONFIG\nGITERR_REGEX\nGITERR_ODB\nGITERR_INDEX\nGITERR_OBJECT\nGITERR_NET\nGITERR_TAG\nGITERR_TREE\nGITERR_INDEXER\nGITERR_SSL\nGITERR_SUBMODULE\nGITERR_THREAD\nGITERR_STASH\nGITERR_CHECKOUT\nGITERR_FETCHHEAD\nGITERR_MERGE\nGITERR_SSH\nGITERR_FILTER\nGITERR_REVERT\nGITERR_CALLBACK\nGITERR_CHERRYPICK\nGITERR_DESCRIBE\nGITERR_REBASE\nGITERR_FILESYSTEM\nGITERR_PATCH\nGITERR_WORKTREE\nGITERR_SHA1", + "line": 75, + "lineto": 110, + "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA1", "tdef": "typedef", "description": " Error classes ", "comments": "", "fields": [ { "type": "int", - "name": "GITERR_NONE", + "name": "GIT_ERROR_NONE", "comments": "", "value": 0 }, { "type": "int", - "name": "GITERR_NOMEMORY", + "name": "GIT_ERROR_NOMEMORY", "comments": "", "value": 1 }, { "type": "int", - "name": "GITERR_OS", + "name": "GIT_ERROR_OS", "comments": "", "value": 2 }, { "type": "int", - "name": "GITERR_INVALID", + "name": "GIT_ERROR_INVALID", "comments": "", "value": 3 }, { "type": "int", - "name": "GITERR_REFERENCE", + "name": "GIT_ERROR_REFERENCE", "comments": "", "value": 4 }, { "type": "int", - "name": "GITERR_ZLIB", + "name": "GIT_ERROR_ZLIB", "comments": "", "value": 5 }, { "type": "int", - "name": "GITERR_REPOSITORY", + "name": "GIT_ERROR_REPOSITORY", "comments": "", "value": 6 }, { "type": "int", - "name": "GITERR_CONFIG", + "name": "GIT_ERROR_CONFIG", "comments": "", "value": 7 }, { "type": "int", - "name": "GITERR_REGEX", + "name": "GIT_ERROR_REGEX", "comments": "", "value": 8 }, { "type": "int", - "name": "GITERR_ODB", + "name": "GIT_ERROR_ODB", "comments": "", "value": 9 }, { "type": "int", - "name": "GITERR_INDEX", + "name": "GIT_ERROR_INDEX", "comments": "", "value": 10 }, { "type": "int", - "name": "GITERR_OBJECT", + "name": "GIT_ERROR_OBJECT", "comments": "", "value": 11 }, { "type": "int", - "name": "GITERR_NET", + "name": "GIT_ERROR_NET", "comments": "", "value": 12 }, { "type": "int", - "name": "GITERR_TAG", + "name": "GIT_ERROR_TAG", "comments": "", "value": 13 }, { "type": "int", - "name": "GITERR_TREE", + "name": "GIT_ERROR_TREE", "comments": "", "value": 14 }, { "type": "int", - "name": "GITERR_INDEXER", + "name": "GIT_ERROR_INDEXER", "comments": "", "value": 15 }, { "type": "int", - "name": "GITERR_SSL", + "name": "GIT_ERROR_SSL", "comments": "", "value": 16 }, { "type": "int", - "name": "GITERR_SUBMODULE", + "name": "GIT_ERROR_SUBMODULE", "comments": "", "value": 17 }, { "type": "int", - "name": "GITERR_THREAD", + "name": "GIT_ERROR_THREAD", "comments": "", "value": 18 }, { "type": "int", - "name": "GITERR_STASH", + "name": "GIT_ERROR_STASH", "comments": "", "value": 19 }, { "type": "int", - "name": "GITERR_CHECKOUT", + "name": "GIT_ERROR_CHECKOUT", "comments": "", "value": 20 }, { "type": "int", - "name": "GITERR_FETCHHEAD", + "name": "GIT_ERROR_FETCHHEAD", "comments": "", "value": 21 }, { "type": "int", - "name": "GITERR_MERGE", + "name": "GIT_ERROR_MERGE", "comments": "", "value": 22 }, { "type": "int", - "name": "GITERR_SSH", + "name": "GIT_ERROR_SSH", "comments": "", "value": 23 }, { "type": "int", - "name": "GITERR_FILTER", + "name": "GIT_ERROR_FILTER", "comments": "", "value": 24 }, { "type": "int", - "name": "GITERR_REVERT", + "name": "GIT_ERROR_REVERT", "comments": "", "value": 25 }, { "type": "int", - "name": "GITERR_CALLBACK", + "name": "GIT_ERROR_CALLBACK", "comments": "", "value": 26 }, { "type": "int", - "name": "GITERR_CHERRYPICK", + "name": "GIT_ERROR_CHERRYPICK", "comments": "", "value": 27 }, { "type": "int", - "name": "GITERR_DESCRIBE", + "name": "GIT_ERROR_DESCRIBE", "comments": "", "value": 28 }, { "type": "int", - "name": "GITERR_REBASE", + "name": "GIT_ERROR_REBASE", "comments": "", "value": 29 }, { "type": "int", - "name": "GITERR_FILESYSTEM", + "name": "GIT_ERROR_FILESYSTEM", "comments": "", "value": 30 }, { "type": "int", - "name": "GITERR_PATCH", + "name": "GIT_ERROR_PATCH", "comments": "", "value": 31 }, { "type": "int", - "name": "GITERR_WORKTREE", + "name": "GIT_ERROR_WORKTREE", "comments": "", "value": 32 }, { "type": "int", - "name": "GITERR_SHA1", + "name": "GIT_ERROR_SHA1", "comments": "", "value": 33 } @@ -33554,8 +34087,8 @@ ], "type": "enum", "file": "git2/common.h", - "line": 122, - "lineto": 145, + "line": 130, + "lineto": 153, "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", "tdef": "typedef", "description": " Combinations of these values describe the features with which libgit2\n was compiled", @@ -33607,8 +34140,8 @@ "type": "struct", "value": "git_fetch_options", "file": "git2/remote.h", - "line": 555, - "lineto": 592, + "line": 629, + "lineto": 666, "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Fetch options structure.", @@ -33670,8 +34203,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 507, - "lineto": 520, + "line": 581, + "lineto": 594, "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", "description": "", @@ -33715,8 +34248,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 209, - "lineto": 216, + "line": 210, + "lineto": 217, "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", "tdef": "typedef", "description": " Valid modes for index and tree entries. ", @@ -33849,8 +34382,6 @@ "git_filter_list_stream_file", "git_filter_register", "git_filter_shutdown_fn", - "git_filter_source_filemode", - "git_filter_source_flags", "git_filter_source_id", "git_filter_source_mode", "git_filter_source_path", @@ -33999,8 +34530,6 @@ "needs": [ "git_filter_apply_fn", "git_filter_check_fn", - "git_filter_source_filemode", - "git_filter_source_flags", "git_filter_source_id", "git_filter_source_mode", "git_filter_source_path", @@ -34086,125 +34615,6 @@ } } ], - [ - "git_idxentry_extended_flag_t", - { - "decl": [ - "GIT_IDXENTRY_INTENT_TO_ADD", - "GIT_IDXENTRY_SKIP_WORKTREE", - "GIT_IDXENTRY_EXTENDED2", - "GIT_IDXENTRY_EXTENDED_FLAGS", - "GIT_IDXENTRY_UPDATE", - "GIT_IDXENTRY_REMOVE", - "GIT_IDXENTRY_UPTODATE", - "GIT_IDXENTRY_ADDED", - "GIT_IDXENTRY_HASHED", - "GIT_IDXENTRY_UNHASHED", - "GIT_IDXENTRY_WT_REMOVE", - "GIT_IDXENTRY_CONFLICTED", - "GIT_IDXENTRY_UNPACKED", - "GIT_IDXENTRY_NEW_SKIP_WORKTREE" - ], - "type": "enum", - "file": "git2/index.h", - "line": 115, - "lineto": 135, - "block": "GIT_IDXENTRY_INTENT_TO_ADD\nGIT_IDXENTRY_SKIP_WORKTREE\nGIT_IDXENTRY_EXTENDED2\nGIT_IDXENTRY_EXTENDED_FLAGS\nGIT_IDXENTRY_UPDATE\nGIT_IDXENTRY_REMOVE\nGIT_IDXENTRY_UPTODATE\nGIT_IDXENTRY_ADDED\nGIT_IDXENTRY_HASHED\nGIT_IDXENTRY_UNHASHED\nGIT_IDXENTRY_WT_REMOVE\nGIT_IDXENTRY_CONFLICTED\nGIT_IDXENTRY_UNPACKED\nGIT_IDXENTRY_NEW_SKIP_WORKTREE", - "tdef": "typedef", - "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", - "comments": "

In memory, the flags_extended fields are divided into two parts: the\n fields that are read from and written to disk, and other fields that\n in-memory only and used by libgit2. Only the flags in\n GIT_IDXENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the\n git_index_entry flags_extended value that belong on disk. You\n can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry\n flags_extended value that are only used in-memory by libgit2.\n You can use them to interpret the data in the flags_extended.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_IDXENTRY_INTENT_TO_ADD", - "comments": "", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_SKIP_WORKTREE", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_EXTENDED2", - "comments": "

Reserved for future extension

\n", - "value": 32768 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_EXTENDED_FLAGS", - "comments": "

Reserved for future extension

\n", - "value": 24576 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_UPDATE", - "comments": "

Reserved for future extension

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_REMOVE", - "comments": "

Reserved for future extension

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_UPTODATE", - "comments": "

Reserved for future extension

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_ADDED", - "comments": "

Reserved for future extension

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_HASHED", - "comments": "

Reserved for future extension

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_UNHASHED", - "comments": "

Reserved for future extension

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_WT_REMOVE", - "comments": "

remove in work directory

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_CONFLICTED", - "comments": "", - "value": 128 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_UNPACKED", - "comments": "", - "value": 256 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_NEW_SKIP_WORKTREE", - "comments": "", - "value": 512 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_index", { @@ -34212,8 +34622,8 @@ "type": "struct", "value": "git_index", "file": "git2/types.h", - "line": 138, - "lineto": 138, + "line": 136, + "lineto": 136, "tdef": "typedef", "description": " Memory representation of an index file. ", "comments": "", @@ -34230,6 +34640,7 @@ "git_merge_driver_source_theirs" ], "needs": [ + "git_apply_to_tree", "git_checkout_index", "git_cherrypick_commit", "git_diff_index_to_index", @@ -34258,6 +34669,9 @@ "git_index_get_byindex", "git_index_get_bypath", "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", "git_index_name_add", "git_index_name_clear", "git_index_name_entrycount", @@ -34315,8 +34729,8 @@ ], "type": "enum", "file": "git2/index.h", - "line": 150, - "lineto": 155, + "line": 139, + "lineto": 144, "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", "tdef": "typedef", "description": " Flags for APIs that add files matching pathspec ", @@ -34353,6 +34767,55 @@ } } ], + [ + "git_index_capability_t", + { + "decl": [ + "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "GIT_INDEX_CAPABILITY_FROM_OWNER" + ], + "type": "enum", + "file": "git2/index.h", + "line": 126, + "lineto": 131, + "block": "GIT_INDEX_CAPABILITY_IGNORE_CASE\nGIT_INDEX_CAPABILITY_NO_FILEMODE\nGIT_INDEX_CAPABILITY_NO_SYMLINKS\nGIT_INDEX_CAPABILITY_FROM_OWNER", + "tdef": "typedef", + "description": " Capabilities of system that affect index actions. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_FROM_OWNER", + "comments": "", + "value": -1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_index_conflict_iterator", { @@ -34360,8 +34823,8 @@ "type": "struct", "value": "git_index_conflict_iterator", "file": "git2/types.h", - "line": 141, - "lineto": 141, + "line": 142, + "lineto": 142, "tdef": "typedef", "description": " An iterator for conflicts in the index. ", "comments": "", @@ -34382,15 +34845,15 @@ "decl": [ "git_index_time ctime", "git_index_time mtime", - "uint32_t dev", - "uint32_t ino", - "uint32_t mode", - "uint32_t uid", - "uint32_t gid", - "uint32_t file_size", + "int dev", + "int ino", + "int mode", + "int uid", + "int gid", + "int file_size", "git_oid id", - "uint16_t flags", - "uint16_t flags_extended", + "int flags", + "int flags_extended", "const char * path" ], "type": "struct", @@ -34398,10 +34861,10 @@ "file": "git2/index.h", "line": 53, "lineto": 70, - "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", + "block": "git_index_time ctime\ngit_index_time mtime\nint dev\nint ino\nint mode\nint uid\nint gid\nint file_size\ngit_oid id\nint flags\nint flags_extended\nconst char * path", "tdef": "typedef", - "description": " In-memory representation of a file entry in the index.", - "comments": "

This is a public structure that represents a file entry in the index.\n The meaning of the fields corresponds to core Git's documentation (in\n "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be\n accessed via the first set of GIT_IDXENTRY_... bitmasks below. These\n flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be\n accessed via the later GIT_IDXENTRY_... bitmasks below. Some of\n these flags are read from and written to disk, but some are set aside\n for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This\n is enough to detect changes, which is enough for the index to\n function as a cache, but it should not be taken as an authoritative\n source for that data.

\n", + "description": "", + "comments": "", "fields": [ { "type": "git_index_time", @@ -34414,32 +34877,32 @@ "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "dev", "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "ino", "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "mode", "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "uid", "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "gid", "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "file_size", "comments": "" }, @@ -34449,12 +34912,12 @@ "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "flags", "comments": "" }, { - "type": "uint16_t", + "type": "int", "name": "flags_extended", "comments": "" }, @@ -34480,11 +34943,119 @@ "git_index_conflict_next", "git_index_entry_is_conflict", "git_index_entry_stage", + "git_index_iterator_next", "git_merge_file_from_index" ] } } ], + [ + "git_index_entry_extended_flag_t", + { + "decl": [ + "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "GIT_INDEX_ENTRY_UPTODATE" + ], + "type": "enum", + "file": "git2/index.h", + "line": 116, + "lineto": 123, + "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", + "tdef": "typedef", + "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", + "comments": "

In memory, the flags_extended fields are divided into two parts: the\n fields that are read from and written to disk, and other fields that\n in-memory only and used by libgit2. Only the flags in\n GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the\n git_index_entry flags_extended value that belong on disk. You\n can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry\n flags_extended value that are only used in-memory by libgit2.\n You can use them to interpret the data in the flags_extended.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "comments": "", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "comments": "", + "value": 24576 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_UPTODATE", + "comments": "", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index_entry_flag_t", + { + "decl": [ + "GIT_INDEX_ENTRY_EXTENDED", + "GIT_INDEX_ENTRY_VALID" + ], + "type": "enum", + "file": "git2/index.h", + "line": 87, + "lineto": 90, + "block": "GIT_INDEX_ENTRY_EXTENDED\nGIT_INDEX_ENTRY_VALID", + "tdef": "typedef", + "description": " Flags for index entries", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_VALID", + "comments": "", + "value": 32768 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index_iterator", + { + "decl": "git_index_iterator", + "type": "struct", + "value": "git_index_iterator", + "file": "git2/types.h", + "line": 139, + "lineto": 139, + "tdef": "typedef", + "description": " An iterator for entries in the index. ", + "comments": "", + "fields": [], + "used": { + "returns": [], + "needs": [ + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next" + ] + } + } + ], [ "git_index_name_entry", { @@ -34531,7 +35102,7 @@ "git_index_reuc_entry", { "decl": [ - "uint32_t [3] mode", + "int [3] mode", "git_oid [3] oid", "char * path" ], @@ -34540,13 +35111,13 @@ "file": "git2/sys/index.h", "line": 30, "lineto": 34, - "block": "uint32_t [3] mode\ngit_oid [3] oid\nchar * path", + "block": "int [3] mode\ngit_oid [3] oid\nchar * path", "tdef": "typedef", - "description": " Representation of a resolve undo entry in the index. ", + "description": "", "comments": "", "fields": [ { - "type": "uint32_t [3]", + "type": "int [3]", "name": "mode", "comments": "" }, @@ -34582,8 +35153,8 @@ ], "type": "enum", "file": "git2/index.h", - "line": 157, - "lineto": 177, + "line": 146, + "lineto": 166, "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", "tdef": "typedef", "description": "", @@ -34630,26 +35201,26 @@ "git_index_time", { "decl": [ - "int32_t seconds", - "uint32_t nanoseconds" + "int seconds", + "int nanoseconds" ], "type": "struct", "value": "git_index_time", "file": "git2/index.h", "line": 26, "lineto": 30, - "block": "int32_t seconds\nuint32_t nanoseconds", + "block": "int seconds\nint nanoseconds", "tdef": "typedef", - "description": " Time structure used in a git index entry ", + "description": "", "comments": "", "fields": [ { - "type": "int32_t", + "type": "int", "name": "seconds", "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "nanoseconds", "comments": "" } @@ -34660,55 +35231,6 @@ } } ], - [ - "git_indexcap_t", - { - "decl": [ - "GIT_INDEXCAP_IGNORE_CASE", - "GIT_INDEXCAP_NO_FILEMODE", - "GIT_INDEXCAP_NO_SYMLINKS", - "GIT_INDEXCAP_FROM_OWNER" - ], - "type": "enum", - "file": "git2/index.h", - "line": 138, - "lineto": 143, - "block": "GIT_INDEXCAP_IGNORE_CASE\nGIT_INDEXCAP_NO_FILEMODE\nGIT_INDEXCAP_NO_SYMLINKS\nGIT_INDEXCAP_FROM_OWNER", - "tdef": "typedef", - "description": " Capabilities of system that affect index actions. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEXCAP_IGNORE_CASE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_INDEXCAP_NO_FILEMODE", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_INDEXCAP_NO_SYMLINKS", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_INDEXCAP_FROM_OWNER", - "comments": "", - "value": -1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_indexer", { @@ -34784,41 +35306,6 @@ } } ], - [ - "git_indxentry_flag_t", - { - "decl": [ - "GIT_IDXENTRY_EXTENDED", - "GIT_IDXENTRY_VALID" - ], - "type": "enum", - "file": "git2/index.h", - "line": 86, - "lineto": 89, - "block": "GIT_IDXENTRY_EXTENDED\nGIT_IDXENTRY_VALID", - "tdef": "typedef", - "description": " Flags for index entries", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_IDXENTRY_EXTENDED", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_IDXENTRY_VALID", - "comments": "", - "value": 32768 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_iterator", { @@ -34872,8 +35359,8 @@ ], "type": "enum", "file": "git2/common.h", - "line": 173, - "lineto": 201, + "line": 181, + "lineto": 209, "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS", "tdef": "typedef", "description": " Global library options", @@ -35055,8 +35542,8 @@ "type": "struct", "value": "git_mailmap", "file": "git2/types.h", - "line": 438, - "lineto": 438, + "line": 442, + "lineto": 442, "tdef": "typedef", "description": " Representation of .mailmap file state. ", "comments": "", @@ -35130,7 +35617,8 @@ "used": { "returns": [], "needs": [ - "git_merge_analysis" + "git_merge_analysis", + "git_merge_analysis_for_ref" ] } } @@ -35698,7 +36186,8 @@ "used": { "returns": [], "needs": [ - "git_merge_analysis" + "git_merge_analysis", + "git_merge_analysis_for_ref" ] } } @@ -35790,8 +36279,8 @@ "type": "struct", "value": "git_note", "file": "git2/types.h", - "line": 156, - "lineto": 156, + "line": 157, + "lineto": 157, "tdef": "typedef", "description": " Representation of a git note ", "comments": "", @@ -35845,17 +36334,24 @@ "type": "struct", "value": "git_object", "file": "git2/types.h", - "line": 114, - "lineto": 114, + "line": 112, + "lineto": 112, "tdef": "typedef", "description": " Representation of a generic object in a repository ", "comments": "", "fields": [], "used": { - "returns": [], + "returns": [ + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], "needs": [ "git_checkout_tree", "git_describe_commit", + "git_object__size", "git_object_dup", "git_object_free", "git_object_id", @@ -35866,7 +36362,16 @@ "git_object_peel", "git_object_short_id", "git_object_type", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", "git_reference_peel", + "git_repository_hashfile", "git_reset", "git_reset_default", "git_revparse_ext", @@ -35881,6 +36386,105 @@ } } ], + [ + "git_object_t", + { + "decl": [ + "GIT_OBJECT_ANY", + "GIT_OBJECT_INVALID", + "GIT_OBJECT_COMMIT", + "GIT_OBJECT_TREE", + "GIT_OBJECT_BLOB", + "GIT_OBJECT_TAG", + "GIT_OBJECT_OFS_DELTA", + "GIT_OBJECT_REF_DELTA" + ], + "type": "enum", + "file": "git2/types.h", + "line": 70, + "lineto": 79, + "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", + "tdef": "typedef", + "description": " Basic type (loose or packed) of any Git object. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OBJECT_ANY", + "comments": "

Object can be any of the following

\n", + "value": -2 + }, + { + "type": "int", + "name": "GIT_OBJECT_INVALID", + "comments": "

Object is invalid.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_OBJECT_COMMIT", + "comments": "

A commit object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_OBJECT_TREE", + "comments": "

A tree (directory listing) object.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_OBJECT_BLOB", + "comments": "

A file revision object.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_OBJECT_TAG", + "comments": "

An annotated tag object.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_OBJECT_OFS_DELTA", + "comments": "

A delta, base is given by an offset.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_OBJECT_REF_DELTA", + "comments": "

A delta, base is given by object id.

\n", + "value": 7 + } + ], + "used": { + "returns": [ + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_object__size", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_peel", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile" + ] + } + } + ], [ "git_odb", { @@ -35888,8 +36492,8 @@ "type": "struct", "value": "git_odb", "file": "git2/types.h", - "line": 84, - "lineto": 84, + "line": 82, + "lineto": 82, "tdef": "typedef", "description": " An open object database handle. ", "comments": "", @@ -35950,9 +36554,9 @@ "type": "struct", "value": "git_odb_backend", "file": "git2/types.h", - "line": 87, - "lineto": 87, - "block": "unsigned int version\ngit_odb * odb\nint (*)(void **, size_t *, git_otype *, git_odb_backend *, const git_oid *) read\nint (*)(git_oid *, void **, size_t *, git_otype *, git_odb_backend *, const git_oid *, size_t) read_prefix\nint (*)(size_t *, git_otype *, git_odb_backend *, const git_oid *) read_header\nint (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_otype) write\nint (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_otype) writestream\nint (*)(git_odb_stream **, size_t *, git_otype *, git_odb_backend *, const git_oid *) readstream\nint (*)(git_odb_backend *, const git_oid *) exists\nint (*)(git_oid *, git_odb_backend *, const git_oid *, size_t) exists_prefix\nint (*)(git_odb_backend *) refresh\nint (*)(git_odb_backend *, git_odb_foreach_cb, void *) foreach\nint (*)(git_odb_writepack **, git_odb_backend *, git_odb *, git_transfer_progress_cb, void *) writepack\nint (*)(git_odb_backend *, const git_oid *) freshen\nvoid (*)(git_odb_backend *) free", + "line": 85, + "lineto": 85, + "block": "unsigned int version\ngit_odb * odb\nint (*)(void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *) read\nint (*)(git_oid *, void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *, size_t) read_prefix\nint (*)(size_t *, git_object_t *, git_odb_backend *, const git_oid *) read_header\nint (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_object_t) write\nint (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_object_t) writestream\nint (*)(git_odb_stream **, size_t *, git_object_t *, git_odb_backend *, const git_oid *) readstream\nint (*)(git_odb_backend *, const git_oid *) exists\nint (*)(git_oid *, git_odb_backend *, const git_oid *, size_t) exists_prefix\nint (*)(git_odb_backend *) refresh\nint (*)(git_odb_backend *, git_odb_foreach_cb, void *) foreach\nint (*)(git_odb_writepack **, git_odb_backend *, git_odb *, git_transfer_progress_cb, void *) writepack\nint (*)(git_odb_backend *, const git_oid *) freshen\nvoid (*)(git_odb_backend *) free", "tdef": "typedef", "description": " A custom backend in an ODB ", "comments": "", @@ -35968,32 +36572,32 @@ "comments": "" }, { - "type": "int (*)(void **, size_t *, git_otype *, git_odb_backend *, const git_oid *)", + "type": "int (*)(void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *)", "name": "read", "comments": "" }, { - "type": "int (*)(git_oid *, void **, size_t *, git_otype *, git_odb_backend *, const git_oid *, size_t)", + "type": "int (*)(git_oid *, void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *, size_t)", "name": "read_prefix", "comments": "" }, { - "type": "int (*)(size_t *, git_otype *, git_odb_backend *, const git_oid *)", + "type": "int (*)(size_t *, git_object_t *, git_odb_backend *, const git_oid *)", "name": "read_header", "comments": "" }, { - "type": "int (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_otype)", + "type": "int (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_object_t)", "name": "write", - "comments": " Write an object into the backend. The id of the object has\n already been calculated and is passed in." + "comments": "" }, { - "type": "int (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_otype)", + "type": "int (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_object_t)", "name": "writestream", "comments": "" }, { - "type": "int (*)(git_odb_stream **, size_t *, git_otype *, git_odb_backend *, const git_oid *)", + "type": "int (*)(git_odb_stream **, size_t *, git_object_t *, git_odb_backend *, const git_oid *)", "name": "readstream", "comments": "" }, @@ -36010,7 +36614,7 @@ { "type": "int (*)(git_odb_backend *)", "name": "refresh", - "comments": " If the backend implements a refreshing mechanism, it should be exposed\n through this endpoint. Each call to `git_odb_refresh()` will invoke it.\n\n However, the backend implementation should try to stay up-to-date as much\n as possible by itself as libgit2 will not automatically invoke\n `git_odb_refresh()`. For instance, a potential strategy for the backend\n implementation to achieve this could be to internally invoke this\n endpoint on failed lookups (ie. `exists()`, `read()`, `read_header()`)." + "comments": "" }, { "type": "int (*)(git_odb_backend *, git_odb_foreach_cb, void *)", @@ -36025,12 +36629,12 @@ { "type": "int (*)(git_odb_backend *, const git_oid *)", "name": "freshen", - "comments": " \"Freshens\" an already existing object, updating its last-used\n time. This occurs when `git_odb_write` was called, but the\n object already existed (and will not be re-written). The\n underlying implementation may want to update last-used timestamps.\n\n If callers implement this, they should return `0` if the object\n exists and was freshened, and non-zero otherwise." + "comments": "" }, { "type": "void (*)(git_odb_backend *)", "name": "free", - "comments": " Frees any resources held by the odb (including the `git_odb_backend`\n itself). An odb backend implementation must provide this function." + "comments": "" } ], "used": { @@ -36057,14 +36661,14 @@ "decl": [ "git_oid id", "unsigned short length", - "git_otype type" + "git_object_t type" ], "type": "struct", "value": "git_odb_expand_id", "file": "git2/odb.h", "line": 180, "lineto": 195, - "block": "git_oid id\nunsigned short length\ngit_otype type", + "block": "git_oid id\nunsigned short length\ngit_object_t type", "tdef": "typedef", "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", "comments": "", @@ -36080,9 +36684,9 @@ "comments": " The length of the object ID (in nibbles, or packets of 4 bits; the\n number of hex characters)" }, { - "type": "git_otype", + "type": "git_object_t", "name": "type", - "comments": " The (optional) type of the object to search for; leave as `0` or set\n to `GIT_OBJ_ANY` to query for any object matching the ID." + "comments": " The (optional) type of the object to search for; leave as `0` or set\n to `GIT_OBJECT_ANY` to query for any object matching the ID." } ], "used": { @@ -36100,8 +36704,8 @@ "type": "struct", "value": "git_odb_object", "file": "git2/types.h", - "line": 90, - "lineto": 90, + "line": 88, + "lineto": 88, "tdef": "typedef", "description": " An object read from the ODB ", "comments": "", @@ -36128,8 +36732,8 @@ "type": "struct", "value": "git_odb_stream", "file": "git2/types.h", - "line": 93, - "lineto": 93, + "line": 91, + "lineto": 91, "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_off_t declared_size\ngit_off_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", "tdef": "typedef", "description": " A stream to read/write from the ODB ", @@ -36163,22 +36767,22 @@ { "type": "int (*)(git_odb_stream *, char *, size_t)", "name": "read", - "comments": " Write at most `len` bytes into `buffer` and advance the stream." + "comments": "" }, { "type": "int (*)(git_odb_stream *, const char *, size_t)", "name": "write", - "comments": " Write `len` bytes from `buffer` into the stream." + "comments": "" }, { "type": "int (*)(git_odb_stream *, const git_oid *)", "name": "finalize_write", - "comments": " Store the contents of the stream as an object with the id\n specified in `oid`.\n\n This method might not be invoked if:\n - an error occurs earlier with the `write` callback,\n - the object referred to by `oid` already exists in any backend, or\n - the final number of received bytes differs from the size declared\n with `git_odb_open_wstream()`" + "comments": "" }, { "type": "void (*)(git_odb_stream *)", "name": "free", - "comments": " Free the stream's memory.\n\n This method might be called without a call to `finalize_write` if\n an error occurs or if the object is already present in the ODB." + "comments": "" } ], "used": { @@ -36243,8 +36847,8 @@ "type": "struct", "value": "git_odb_writepack", "file": "git2/types.h", - "line": 96, - "lineto": 96, + "line": 94, + "lineto": 94, "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_transfer_progress *) append\nint (*)(git_odb_writepack *, git_transfer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "tdef": "typedef", "description": " A stream to write a packfile to the ODB ", @@ -36499,119 +37103,6 @@ } } ], - [ - "git_otype", - { - "decl": [ - "GIT_OBJ_ANY", - "GIT_OBJ_BAD", - "GIT_OBJ__EXT1", - "GIT_OBJ_COMMIT", - "GIT_OBJ_TREE", - "GIT_OBJ_BLOB", - "GIT_OBJ_TAG", - "GIT_OBJ__EXT2", - "GIT_OBJ_OFS_DELTA", - "GIT_OBJ_REF_DELTA" - ], - "type": "enum", - "file": "git2/types.h", - "line": 70, - "lineto": 81, - "block": "GIT_OBJ_ANY\nGIT_OBJ_BAD\nGIT_OBJ__EXT1\nGIT_OBJ_COMMIT\nGIT_OBJ_TREE\nGIT_OBJ_BLOB\nGIT_OBJ_TAG\nGIT_OBJ__EXT2\nGIT_OBJ_OFS_DELTA\nGIT_OBJ_REF_DELTA", - "tdef": "typedef", - "description": " Basic type (loose or packed) of any Git object. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_OBJ_ANY", - "comments": "

Object can be any of the following

\n", - "value": -2 - }, - { - "type": "int", - "name": "GIT_OBJ_BAD", - "comments": "

Object is invalid.

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_OBJ__EXT1", - "comments": "

Reserved for future use.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_OBJ_COMMIT", - "comments": "

A commit object.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_OBJ_TREE", - "comments": "

A tree (directory listing) object.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_OBJ_BLOB", - "comments": "

A file revision object.

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_OBJ_TAG", - "comments": "

An annotated tag object.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_OBJ__EXT2", - "comments": "

Reserved for future use.

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_OBJ_OFS_DELTA", - "comments": "

A delta, base is given by an offset.

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_OBJ_REF_DELTA", - "comments": "

A delta, base is given by object id.

\n", - "value": 7 - } - ], - "used": { - "returns": [ - "git_object_string2type", - "git_object_type", - "git_odb_object_type", - "git_tag_target_type", - "git_tree_entry_type" - ], - "needs": [ - "git_object__size", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_peel", - "git_object_type2string", - "git_object_typeisloose", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read_header", - "git_odb_write", - "git_reference_peel", - "git_repository_hashfile" - ] - } - } - ], [ "git_packbuilder", { @@ -36619,8 +37110,8 @@ "type": "struct", "value": "git_packbuilder", "file": "git2/types.h", - "line": 159, - "lineto": 159, + "line": 160, + "lineto": 160, "tdef": "typedef", "description": " Representation of a git packbuilder ", "comments": "", @@ -37048,8 +37539,8 @@ "type": "struct", "value": "git_push", "file": "git2/types.h", - "line": 240, - "lineto": 240, + "line": 241, + "lineto": 241, "tdef": "typedef", "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", "comments": "", @@ -37078,8 +37569,8 @@ "type": "struct", "value": "git_push_options", "file": "git2/remote.h", - "line": 616, - "lineto": 643, + "line": 690, + "lineto": 717, "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", @@ -37133,8 +37624,8 @@ "type": "struct", "value": "git_push_update", "file": "git2/remote.h", - "line": 359, - "lineto": 376, + "line": 433, + "lineto": 450, "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", "tdef": "typedef", "description": " Represents an update which will be performed on the remote during push", @@ -37176,8 +37667,8 @@ "type": "struct", "value": "git_rebase", "file": "git2/types.h", - "line": 191, - "lineto": 191, + "line": 192, + "lineto": 192, "tdef": "typedef", "description": " Representation of a rebase ", "comments": "", @@ -37372,57 +37863,6 @@ } } ], - [ - "git_ref_t", - { - "decl": [ - "GIT_REF_INVALID", - "GIT_REF_OID", - "GIT_REF_SYMBOLIC", - "GIT_REF_LISTALL" - ], - "type": "enum", - "file": "git2/types.h", - "line": 194, - "lineto": 199, - "block": "GIT_REF_INVALID\nGIT_REF_OID\nGIT_REF_SYMBOLIC\nGIT_REF_LISTALL", - "tdef": "typedef", - "description": " Basic type of any Git reference. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REF_INVALID", - "comments": "

Invalid reference

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REF_OID", - "comments": "

A reference which points at an object id

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REF_SYMBOLIC", - "comments": "

A reference which points at another reference

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REF_LISTALL", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [ - "git_reference_type" - ], - "needs": [] - } - } - ], [ "git_refdb", { @@ -37430,8 +37870,8 @@ "type": "struct", "value": "git_refdb", "file": "git2/types.h", - "line": 99, - "lineto": 99, + "line": 97, + "lineto": 97, "tdef": "typedef", "description": " An open refs database handle. ", "comments": "", @@ -37459,8 +37899,8 @@ "type": "struct", "value": "git_refdb_backend", "file": "git2/types.h", - "line": 102, - "lineto": 102, + "line": 100, + "lineto": 100, "block": "unsigned int version\nint (*)(int *, git_refdb_backend *, const char *) exists\nint (*)(git_reference **, git_refdb_backend *, const char *) lookup\nint (*)(git_reference_iterator **, struct git_refdb_backend *, const char *) iterator\nint (*)(git_refdb_backend *, const git_reference *, int, const git_signature *, const char *, const git_oid *, const char *) write\nint (*)(git_reference **, git_refdb_backend *, const char *, const char *, int, const git_signature *, const char *) rename\nint (*)(git_refdb_backend *, const char *, const git_oid *, const char *) del\nint (*)(git_refdb_backend *) compress\nint (*)(git_refdb_backend *, const char *) has_log\nint (*)(git_refdb_backend *, const char *) ensure_log\nvoid (*)(git_refdb_backend *) free\nint (*)(git_reflog **, git_refdb_backend *, const char *) reflog_read\nint (*)(git_refdb_backend *, git_reflog *) reflog_write\nint (*)(git_refdb_backend *, const char *, const char *) reflog_rename\nint (*)(git_refdb_backend *, const char *) reflog_delete\nint (*)(void **, git_refdb_backend *, const char *) lock\nint (*)(git_refdb_backend *, void *, int, int, const git_reference *, const git_signature *, const char *) unlock", "tdef": "typedef", "description": " A custom backend for refs ", @@ -37474,17 +37914,17 @@ { "type": "int (*)(int *, git_refdb_backend *, const char *)", "name": "exists", - "comments": " Queries the refdb backend to determine if the given ref_name\n exists. A refdb implementation must provide this function." + "comments": "" }, { "type": "int (*)(git_reference **, git_refdb_backend *, const char *)", "name": "lookup", - "comments": " Queries the refdb backend for a given reference. A refdb\n implementation must provide this function." + "comments": "" }, { "type": "int (*)(git_reference_iterator **, struct git_refdb_backend *, const char *)", "name": "iterator", - "comments": " Allocate an iterator object for the backend.\n\n A refdb implementation must provide this function." + "comments": "" }, { "type": "int (*)(git_refdb_backend *, const git_reference *, int, const git_signature *, const char *, const git_oid *, const char *)", @@ -37499,57 +37939,57 @@ { "type": "int (*)(git_refdb_backend *, const char *, const git_oid *, const char *)", "name": "del", - "comments": " Deletes the given reference (and if necessary its reflog)\n from the refdb. A refdb implementation must provide this\n function." + "comments": "" }, { "type": "int (*)(git_refdb_backend *)", "name": "compress", - "comments": " Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. (For on-disk reference\n databases, this may pack all loose references.) A refdb\n implementation may provide this function; if it is not provided,\n nothing will be done." + "comments": "" }, { "type": "int (*)(git_refdb_backend *, const char *)", "name": "has_log", - "comments": " Query whether a particular reference has a log (may be empty)" + "comments": "" }, { "type": "int (*)(git_refdb_backend *, const char *)", "name": "ensure_log", - "comments": " Make sure a particular reference will have a reflog which\n will be appended to on writes." + "comments": "" }, { "type": "void (*)(git_refdb_backend *)", "name": "free", - "comments": " Frees any resources held by the refdb (including the `git_refdb_backend`\n itself). A refdb backend implementation must provide this function." + "comments": "" }, { "type": "int (*)(git_reflog **, git_refdb_backend *, const char *)", "name": "reflog_read", - "comments": " Read the reflog for the given reference name." + "comments": "" }, { "type": "int (*)(git_refdb_backend *, git_reflog *)", "name": "reflog_write", - "comments": " Write a reflog to disk." + "comments": "" }, { "type": "int (*)(git_refdb_backend *, const char *, const char *)", "name": "reflog_rename", - "comments": " Rename a reflog" + "comments": "" }, { "type": "int (*)(git_refdb_backend *, const char *)", "name": "reflog_delete", - "comments": " Remove a reflog." + "comments": "" }, { "type": "int (*)(void **, git_refdb_backend *, const char *)", "name": "lock", - "comments": " Lock a reference. The opaque parameter will be passed to the unlock function" + "comments": "" }, { "type": "int (*)(git_refdb_backend *, void *, int, int, const git_reference *, const git_signature *, const char *)", "name": "unlock", - "comments": " Unlock a reference. Only one of target or symbolic_target\n will be set. success indicates whether to update the\n reference or discard the lock (if it's false)" + "comments": "" } ], "used": { @@ -37569,8 +38009,8 @@ "type": "struct", "value": "git_reference", "file": "git2/types.h", - "line": 176, - "lineto": 176, + "line": 177, + "lineto": 177, "tdef": "typedef", "description": " In-memory representation of a reference. ", "comments": "", @@ -37578,7 +38018,8 @@ "used": { "returns": [ "git_reference__alloc", - "git_reference__alloc_symbolic" + "git_reference__alloc_symbolic", + "git_reference_type" ], "needs": [ "git_annotated_commit_from_ref", @@ -37593,6 +38034,7 @@ "git_branch_next", "git_branch_set_upstream", "git_branch_upstream", + "git_merge_analysis_for_ref", "git_reference_cmp", "git_reference_create", "git_reference_create_matching", @@ -37635,6 +38077,55 @@ } } ], + [ + "git_reference_format_t", + { + "decl": [ + "GIT_REFERENCE_FORMAT_NORMAL", + "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND" + ], + "type": "enum", + "file": "git2/refs.h", + "line": 639, + "lineto": 668, + "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "tdef": "typedef", + "description": " Normalization options for reference lookup", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_NORMAL", + "comments": "

No particular normalization.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "comments": "

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "comments": "

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "comments": "

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_reference_iterator", { @@ -37642,8 +38133,8 @@ "type": "struct", "value": "git_reference_iterator", "file": "git2/types.h", - "line": 179, - "lineto": 179, + "line": 180, + "lineto": 180, "block": "git_refdb * db\nint (*)(git_reference **, git_reference_iterator *) next\nint (*)(const char **, git_reference_iterator *) next_name\nvoid (*)(git_reference_iterator *) free", "tdef": "typedef", "description": " Iterator for references ", @@ -37657,17 +38148,17 @@ { "type": "int (*)(git_reference **, git_reference_iterator *)", "name": "next", - "comments": " Return the current reference and advance the iterator." + "comments": "" }, { "type": "int (*)(const char **, git_reference_iterator *)", "name": "next_name", - "comments": " Return the name of the current reference and advance the iterator" + "comments": "" }, { "type": "void (*)(git_reference_iterator *)", "name": "free", - "comments": " Free the iterator" + "comments": "" } ], "used": { @@ -37683,50 +38174,52 @@ } ], [ - "git_reference_normalize_t", + "git_reference_t", { "decl": [ - "GIT_REF_FORMAT_NORMAL", - "GIT_REF_FORMAT_ALLOW_ONELEVEL", - "GIT_REF_FORMAT_REFSPEC_PATTERN", - "GIT_REF_FORMAT_REFSPEC_SHORTHAND" + "GIT_REFERENCE_INVALID", + "GIT_REFERENCE_DIRECT", + "GIT_REFERENCE_SYMBOLIC", + "GIT_REFERENCE_ALL" ], "type": "enum", - "file": "git2/refs.h", - "line": 639, - "lineto": 668, - "block": "GIT_REF_FORMAT_NORMAL\nGIT_REF_FORMAT_ALLOW_ONELEVEL\nGIT_REF_FORMAT_REFSPEC_PATTERN\nGIT_REF_FORMAT_REFSPEC_SHORTHAND", + "file": "git2/types.h", + "line": 195, + "lineto": 200, + "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", "tdef": "typedef", - "description": " Normalization options for reference lookup", + "description": " Basic type of any Git reference. ", "comments": "", "fields": [ { "type": "int", - "name": "GIT_REF_FORMAT_NORMAL", - "comments": "

No particular normalization.

\n", + "name": "GIT_REFERENCE_INVALID", + "comments": "

Invalid reference

\n", "value": 0 }, { "type": "int", - "name": "GIT_REF_FORMAT_ALLOW_ONELEVEL", - "comments": "

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n", + "name": "GIT_REFERENCE_DIRECT", + "comments": "

A reference that points at an object id

\n", "value": 1 }, { "type": "int", - "name": "GIT_REF_FORMAT_REFSPEC_PATTERN", - "comments": "

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n", + "name": "GIT_REFERENCE_SYMBOLIC", + "comments": "

A reference that points at another reference

\n", "value": 2 }, { "type": "int", - "name": "GIT_REF_FORMAT_REFSPEC_SHORTHAND", - "comments": "

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n", - "value": 4 + "name": "GIT_REFERENCE_ALL", + "comments": "", + "value": 3 } ], "used": { - "returns": [], + "returns": [ + "git_reference_type" + ], "needs": [] } } @@ -37738,8 +38231,8 @@ "type": "struct", "value": "git_reflog", "file": "git2/types.h", - "line": 153, - "lineto": 153, + "line": 154, + "lineto": 154, "tdef": "typedef", "description": " Representation of a reference log ", "comments": "", @@ -37774,8 +38267,8 @@ "type": "struct", "value": "git_reflog_entry", "file": "git2/types.h", - "line": 150, - "lineto": 150, + "line": 151, + "lineto": 151, "tdef": "typedef", "description": " Representation of a reference log entry ", "comments": "", @@ -37802,8 +38295,8 @@ "type": "struct", "value": "git_refspec", "file": "git2/types.h", - "line": 222, - "lineto": 222, + "line": 223, + "lineto": 223, "tdef": "typedef", "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", "comments": "", @@ -37835,8 +38328,8 @@ "type": "struct", "value": "git_remote", "file": "git2/types.h", - "line": 228, - "lineto": 228, + "line": 229, + "lineto": 229, "tdef": "typedef", "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entires).", "comments": "", @@ -37854,7 +38347,9 @@ "git_remote_create_anonymous", "git_remote_create_cb", "git_remote_create_detached", + "git_remote_create_init_options", "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", "git_remote_default_branch", "git_remote_disconnect", "git_remote_download", @@ -37901,8 +38396,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 527, - "lineto": 545, + "line": 601, + "lineto": 619, "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", "tdef": "typedef", "description": " Automatic tag following option", @@ -37951,8 +38446,8 @@ "type": "struct", "value": "git_remote_callbacks", "file": "git2/types.h", - "line": 244, - "lineto": 244, + "line": 245, + "lineto": 245, "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_type, void *) completion\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_transfer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload", "tdef": "typedef", "description": "", @@ -37971,7 +38466,7 @@ { "type": "int (*)(git_remote_completion_type, void *)", "name": "completion", - "comments": " Completion is called when different parts of the download\n process are done (currently unused)." + "comments": "" }, { "type": "git_cred_acquire_cb", @@ -37991,7 +38486,7 @@ { "type": "int (*)(const char *, const git_oid *, const git_oid *, void *)", "name": "update_tips", - "comments": " Each time a reference is updated locally, this function\n will be called with information about it." + "comments": "" }, { "type": "git_packbuilder_progress", @@ -38045,8 +38540,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 344, - "lineto": 348, + "line": 418, + "lineto": 422, "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", "tdef": "typedef", "description": " Argument to the completion callback which tells it which operation\n finished.", @@ -38077,6 +38572,96 @@ } } ], + [ + "git_remote_create_flags", + { + "decl": [ + "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 47, + "lineto": 53, + "block": "GIT_REMOTE_CREATE_SKIP_INSTEADOF\nGIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "tdef": "typedef", + "description": " Remote creation options flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "comments": "

Ignore the repository apply.insteadOf configuration

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "comments": "

Don't build a fetchspec from the name if none is set

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_remote_create_options", + { + "decl": [ + "unsigned int version", + "git_repository * repository", + "const char * name", + "const char * fetchspec", + "unsigned int flags" + ], + "type": "struct", + "value": "git_remote_create_options", + "file": "git2/remote.h", + "line": 62, + "lineto": 82, + "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", + "tdef": "typedef", + "description": " Remote creation options structure", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can\n use git_remote_create_init_options.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_repository *", + "name": "repository", + "comments": " The repository that should own the remote.\n Setting this to NULL results in a detached remote." + }, + { + "type": "const char *", + "name": "name", + "comments": " The remote's name.\n Setting this to NULL results in an in-memory/anonymous remote." + }, + { + "type": "const char *", + "name": "fetchspec", + "comments": " The fetchspec the remote should use. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Additional flags for the remote. See git_remote_create_flags. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_create_init_options", + "git_remote_create_with_opts" + ] + } + } + ], [ "git_remote_head", { @@ -38084,8 +38669,8 @@ "type": "struct", "value": "git_remote_head", "file": "git2/types.h", - "line": 243, - "lineto": 243, + "line": 244, + "lineto": 244, "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", "tdef": "typedef", "description": "", @@ -38133,8 +38718,8 @@ "type": "struct", "value": "git_repository", "file": "git2/types.h", - "line": 108, - "lineto": 108, + "line": 106, + "lineto": 106, "tdef": "typedef", "description": " Representation of an existing git repository,\n including all its object contents", "comments": "", @@ -38159,6 +38744,8 @@ "git_annotated_commit_from_ref", "git_annotated_commit_from_revspec", "git_annotated_commit_lookup", + "git_apply", + "git_apply_to_tree", "git_attr_add_macro", "git_attr_cache_flush", "git_attr_foreach", @@ -38217,6 +38804,7 @@ "git_mempack_dump", "git_merge", "git_merge_analysis", + "git_merge_analysis_for_ref", "git_merge_base", "git_merge_base_many", "git_merge_base_octopus", @@ -38399,8 +38987,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 232, - "lineto": 240, + "line": 245, + "lineto": 253, "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", "tdef": "typedef", "description": " Option flags for `git_repository_init_ext`.", @@ -38465,8 +39053,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 255, - "lineto": 259, + "line": 268, + "lineto": 272, "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", "tdef": "typedef", "description": " Mode options for `git_repository_init_ext`.", @@ -38502,8 +39090,8 @@ { "decl": [ "unsigned int version", - "uint32_t flags", - "uint32_t mode", + "int flags", + "int mode", "const char * workdir_path", "const char * description", "const char * template_path", @@ -38513,12 +39101,12 @@ "type": "struct", "value": "git_repository_init_options", "file": "git2/repository.h", - "line": 289, - "lineto": 298, - "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", + "line": 302, + "lineto": 311, + "block": "unsigned int version\nint flags\nint mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", "tdef": "typedef", - "description": " Extended options structure for `git_repository_init_ext`.", - "comments": "

This contains extra options for git_repository_init_ext that enable\n additional initialization features. The fields are:

\n\n
    \n
  • flags - Combination of GIT_REPOSITORY_INIT flags above.
  • \n
  • mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...\n constants above, or to a custom value that you would like.
  • \n
  • workdir_path - The path to the working dir or NULL for default (i.e.\n repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,\n IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not\n the "natural" working directory, a .git gitlink file will be\n created here linking to the repo_path.
  • \n
  • description - If set, this will be used to initialize the "description"\n file in the repository, instead of using the template content.
  • \n
  • template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,\n this contains the path to use for the template directory. If\n this is NULL, the config or default directory options will be\n used instead.
  • \n
  • initial_head - The name of the head to point HEAD at. If NULL, then\n this will be treated as "master" and the HEAD ref will be set\n to "refs/heads/master". If this begins with "refs/" it will be\n used verbatim; otherwise "refs/heads/" will be prefixed.
  • \n
  • origin_url - If this is non-NULL, then after the rest of the\n repository initialization is completed, an "origin" remote\n will be added pointing to this URL.
  • \n
\n", + "description": "", + "comments": "", "fields": [ { "type": "unsigned int", @@ -38526,12 +39114,12 @@ "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "flags", "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "mode", "comments": "" }, @@ -38591,8 +39179,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 414, - "lineto": 429, + "line": 427, + "lineto": 442, "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES", "tdef": "typedef", "description": " List of items which belong to the git repository layout", @@ -38703,41 +39291,41 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 126, - "lineto": 132, + "line": 98, + "lineto": 145, "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", "tdef": "typedef", "description": " Option flags for `git_repository_open_ext`.", - "comments": "
    \n
  • GIT_REPOSITORY_OPEN_NO_SEARCH - Only open the repository if it can be\nimmediately found in the start_path. Do not walk up from the\nstart_path looking at parent directories.
  • \n
  • GIT_REPOSITORY_OPEN_CROSS_FS - Unless this flag is set, open will not\ncontinue searching across filesystem boundaries (i.e. when st_dev\nchanges from the stat system call). (E.g. Searching in a user's home\ndirectory "/home/user/source/" will not return "/.git/" as the found\nrepo if "/" is a different filesystem than "/home".)
  • \n
  • GIT_REPOSITORY_OPEN_BARE - Open repository as a bare repo regardless\nof core.bare config, and defer loading config file for faster setup.\nUnlike git_repository_open_bare, this can follow gitlinks.
  • \n
  • GIT_REPOSITORY_OPEN_NO_DOTGIT - Do not check for a repository by\nappending /.git to the start_path; only open the repository if\nstart_path itself points to the git directory.
  • \n
  • GIT_REPOSITORY_OPEN_FROM_ENV - Find and open a git repository,\nrespecting the environment variables used by the git command-line\ntools. If set, git_repository_open_ext will ignore the other\nflags and the ceiling_dirs argument, and will allow a NULL path\nto use GIT_DIR or search from the current directory. The search\nfor a repository will respect $GIT_CEILING_DIRECTORIES and\n$GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\nrespect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n$GIT_ALTERNATE_OBJECT_DIRECTORIES. In the future, this flag will\nalso cause git_repository_open_ext to respect $GIT_WORK_TREE and\n$GIT_COMMON_DIR; currently, git_repository_open_ext with this\nflag will error out if either $GIT_WORK_TREE or $GIT_COMMON_DIR is\nset.
  • \n
\n", + "comments": "", "fields": [ { "type": "int", "name": "GIT_REPOSITORY_OPEN_NO_SEARCH", - "comments": "", + "comments": "

Only open the repository if it can be immediately found in the\n start_path. Do not walk up from the start_path looking at parent\n directories.

\n", "value": 1 }, { "type": "int", "name": "GIT_REPOSITORY_OPEN_CROSS_FS", - "comments": "", + "comments": "

Unless this flag is set, open will not continue searching across\n filesystem boundaries (i.e. when st_dev changes from the stat\n system call). For example, searching in a user's home directory at\n "/home/user/source/" will not return "/.git/" as the found repo if\n "/" is a different filesystem than "/home".

\n", "value": 2 }, { "type": "int", "name": "GIT_REPOSITORY_OPEN_BARE", - "comments": "", + "comments": "

Open repository as a bare repo regardless of core.bare config, and\n defer loading config file for faster setup.\n Unlike git_repository_open_bare, this can follow gitlinks.

\n", "value": 4 }, { "type": "int", "name": "GIT_REPOSITORY_OPEN_NO_DOTGIT", - "comments": "", + "comments": "

Do not check for a repository by appending /.git to the start_path;\n only open the repository if start_path itself points to the git\n directory.

\n", "value": 8 }, { "type": "int", "name": "GIT_REPOSITORY_OPEN_FROM_ENV", - "comments": "", + "comments": "

Find and open a git repository, respecting the environment variables\n used by the git command-line tools.\n If set, git_repository_open_ext will ignore the other flags and\n the ceiling_dirs argument, and will allow a NULL path to use\n GIT_DIR or search from the current directory.\n The search for a repository will respect $GIT_CEILING_DIRECTORIES and\n $GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\n respect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n $GIT_ALTERNATE_OBJECT_DIRECTORIES.\n In the future, this flag will also cause git_repository_open_ext\n to respect $GIT_WORK_TREE and $GIT_COMMON_DIR; currently,\n git_repository_open_ext with this flag will error out if either\n $GIT_WORK_TREE or $GIT_COMMON_DIR is set.

\n", "value": 16 } ], @@ -38766,8 +39354,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 786, - "lineto": 799, + "line": 799, + "lineto": 812, "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", "tdef": "typedef", "description": " Repository state", @@ -39037,8 +39625,8 @@ "type": "struct", "value": "git_revwalk", "file": "git2/types.h", - "line": 117, - "lineto": 117, + "line": 115, + "lineto": 115, "tdef": "typedef", "description": " Representation of an in-progress walk through the commits in a repo ", "comments": "", @@ -39079,8 +39667,8 @@ "type": "struct", "value": "git_signature", "file": "git2/types.h", - "line": 169, - "lineto": 173, + "line": 170, + "lineto": 174, "block": "char * name\nchar * email\ngit_time when", "tdef": "typedef", "description": " An action signature (e.g. for committers, taggers, etc) ", @@ -39154,11 +39742,11 @@ ], "type": "enum", "file": "git2/sys/transport.h", - "line": 273, - "lineto": 278, + "line": 287, + "lineto": 292, "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", "tdef": "typedef", - "description": "", + "description": " Actions that the smart transport can ask a subtransport to perform ", "comments": "", "fields": [ { @@ -39199,10 +39787,10 @@ "type": "struct", "value": "git_smart_subtransport", "file": "git2/sys/transport.h", - "line": 280, - "lineto": 280, + "line": 294, + "lineto": 294, "tdef": "typedef", - "description": "", + "description": " An implementation of a subtransport which carries data for the\n smart transport", "comments": "", "fields": [ { @@ -39243,12 +39831,12 @@ "type": "struct", "value": "git_smart_subtransport_definition", "file": "git2/sys/transport.h", - "line": 336, - "lineto": 349, + "line": 383, + "lineto": 395, "block": "git_smart_subtransport_cb callback\nunsigned int rpc\nvoid * param", "tdef": "typedef", "description": " Definition for a \"subtransport\"", - "comments": "

This is used to let the smart protocol code know about the protocol\n which you are implementing.

\n", + "comments": "

The smart transport knows how to speak the git protocol, but it has no\n knowledge of how to establish a connection between it and another endpoint,\n or how to move data back and forth. For this, a subtransport interface is\n declared, and the smart transport delegates this work to the subtransports.

\n\n

Three subtransports are provided by libgit2: ssh, git, http(s).

\n\n

Subtransports can either be RPC = 0 (persistent connection) or RPC = 1\n (request/response). The smart transport handles the differences in its own\n logic. The git subtransport is RPC = 0, while http is RPC = 1.

\n", "fields": [ { "type": "git_smart_subtransport_cb", @@ -39263,7 +39851,7 @@ { "type": "void *", "name": "param", - "comments": " Param of the callback" + "comments": " User-specified parameter passed to the callback " } ], "used": { @@ -39279,16 +39867,16 @@ "type": "struct", "value": "git_smart_subtransport_stream", "file": "git2/sys/transport.h", - "line": 281, - "lineto": 281, + "line": 295, + "lineto": 295, "tdef": "typedef", - "description": "", - "comments": "", + "description": " A stream used by the smart transport to read and write data\n from a subtransport.", + "comments": "

This provides a customization point in case you need to\n support some other communication method.

\n", "fields": [ { "type": "git_smart_subtransport *", "name": "subtransport", - "comments": "" + "comments": " The owning subtransport " }, { "type": "int (*)(git_smart_subtransport_stream *, char *, size_t, size_t *)", @@ -39629,8 +40217,8 @@ "type": "struct", "value": "git_status_list", "file": "git2/types.h", - "line": 188, - "lineto": 188, + "line": 189, + "lineto": 189, "tdef": "typedef", "description": " Representation of a status collection ", "comments": "", @@ -40062,8 +40650,7 @@ "int (*)(struct git_stream *) connect", "int (*)(git_cert **, struct git_stream *) certificate", "int (*)(struct git_stream *, const git_proxy_options *) set_proxy", - "ssize_t (*)(struct git_stream *, void *, size_t) read", - "ssize_t (*)(struct git_stream *, const char *, size_t, int) write", + "int ((int *))(struct git_stream *, void *, size_t) ssize_t", "int (*)(struct git_stream *) close", "void (*)(struct git_stream *) free" ], @@ -40072,10 +40659,10 @@ "file": "git2/sys/stream.h", "line": 29, "lineto": 41, - "block": "int version\nint encrypted\nint proxy_support\nint (*)(struct git_stream *) connect\nint (*)(git_cert **, struct git_stream *) certificate\nint (*)(struct git_stream *, const git_proxy_options *) set_proxy\nssize_t (*)(struct git_stream *, void *, size_t) read\nssize_t (*)(struct git_stream *, const char *, size_t, int) write\nint (*)(struct git_stream *) close\nvoid (*)(struct git_stream *) free", + "block": "int version\nint encrypted\nint proxy_support\nint (*)(struct git_stream *) connect\nint (*)(git_cert **, struct git_stream *) certificate\nint (*)(struct git_stream *, const git_proxy_options *) set_proxy\nint ((int *))(struct git_stream *, void *, size_t) ssize_t\nint (*)(struct git_stream *) close\nvoid (*)(struct git_stream *) free", "tdef": "typedef", - "description": " Every stream must have this struct as its first element, so the\n API can talk to it. You'd define your stream as", - "comments": "
 struct my_stream {\n         git_stream parent;\n         ...\n }\n
\n\n

and fill the functions

\n", + "description": "", + "comments": "", "fields": [ { "type": "int", @@ -40108,13 +40695,8 @@ "comments": "" }, { - "type": "ssize_t (*)(struct git_stream *, void *, size_t)", - "name": "read", - "comments": "" - }, - { - "type": "ssize_t (*)(struct git_stream *, const char *, size_t, int)", - "name": "write", + "type": "int ((int *))(struct git_stream *, void *, size_t)", + "name": "ssize_t", "comments": "" }, { @@ -40132,11 +40714,91 @@ "returns": [], "needs": [ "git_stream_cb", + "git_stream_register", "git_stream_register_tls" ] } } ], + [ + "git_stream_registration", + { + "decl": [ + "int version", + "int (*)(git_stream **, const char *, const char *) init", + "int (*)(git_stream **, git_stream *, const char *) wrap" + ], + "type": "struct", + "value": "git_stream_registration", + "file": "git2/sys/stream.h", + "line": 43, + "lineto": 72, + "block": "int version\nint (*)(git_stream **, const char *, const char *) init\nint (*)(git_stream **, git_stream *, const char *) wrap", + "tdef": "typedef", + "description": "", + "comments": "", + "fields": [ + { + "type": "int", + "name": "version", + "comments": " The `version` field should be set to `GIT_STREAM_VERSION`. " + }, + { + "type": "int (*)(git_stream **, const char *, const char *)", + "name": "init", + "comments": "" + }, + { + "type": "int (*)(git_stream **, git_stream *, const char *)", + "name": "wrap", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_stream_register" + ] + } + } + ], + [ + "git_stream_t", + { + "decl": [ + "GIT_STREAM_STANDARD", + "GIT_STREAM_TLS" + ], + "type": "enum", + "file": "git2/sys/stream.h", + "line": 77, + "lineto": 83, + "block": "GIT_STREAM_STANDARD\nGIT_STREAM_TLS", + "tdef": "typedef", + "description": " The type of stream to register.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STREAM_STANDARD", + "comments": "

A standard (non-TLS) socket.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STREAM_TLS", + "comments": "

A TLS-encrypted socket.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [ + "git_stream_register" + ] + } + } + ], [ "git_submodule", { @@ -40144,8 +40806,8 @@ "type": "struct", "value": "git_submodule", "file": "git2/types.h", - "line": 339, - "lineto": 339, + "line": 343, + "lineto": 343, "tdef": "typedef", "description": " Opaque structure representing a submodule.", "comments": "", @@ -40203,8 +40865,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 403, - "lineto": 410, + "line": 407, + "lineto": 414, "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", "tdef": "typedef", "description": " Submodule ignore values", @@ -40262,8 +40924,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 422, - "lineto": 426, + "line": 426, + "lineto": 430, "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", "tdef": "typedef", "description": " Options for submodule recurse.", @@ -40444,7 +41106,7 @@ { "type": "git_checkout_options", "name": "checkout_opts", - "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory. " + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory." }, { "type": "git_fetch_options", @@ -40478,8 +41140,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 367, - "lineto": 374, + "line": 371, + "lineto": 378, "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", "tdef": "typedef", "description": " Submodule update values", @@ -40533,8 +41195,8 @@ "type": "struct", "value": "git_tag", "file": "git2/types.h", - "line": 120, - "lineto": 120, + "line": 118, + "lineto": 118, "tdef": "typedef", "description": " Parsed representation of a tag object. ", "comments": "", @@ -40571,8 +41233,8 @@ "type": "struct", "value": "git_time", "file": "git2/types.h", - "line": 162, - "lineto": 166, + "line": 163, + "lineto": 167, "block": "git_time_t time\nint offset\nchar sign", "tdef": "typedef", "description": " Time in a signature ", @@ -40684,8 +41346,8 @@ "type": "struct", "value": "git_transaction", "file": "git2/types.h", - "line": 182, - "lineto": 182, + "line": 183, + "lineto": 183, "tdef": "typedef", "description": " Transactional interface to references ", "comments": "", @@ -40721,8 +41383,8 @@ "type": "struct", "value": "git_transfer_progress", "file": "git2/types.h", - "line": 257, - "lineto": 265, + "line": 258, + "lineto": 266, "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", "tdef": "typedef", "description": " This is passed as the first argument to the callback to allow the\n user to see the progress.", @@ -40785,8 +41447,8 @@ "type": "struct", "value": "git_transport", "file": "git2/types.h", - "line": 234, - "lineto": 234, + "line": 235, + "lineto": 235, "block": "unsigned int version\nint (*)(git_transport *, git_transport_message_cb, git_transport_message_cb, git_transport_certificate_check_cb, void *) set_callbacks\nint (*)(git_transport *, const git_strarray *) set_custom_headers\nint (*)(git_transport *, const char *, git_cred_acquire_cb, void *, const git_proxy_options *, int, int) connect\nint (*)(const git_remote_head ***, size_t *, git_transport *) ls\nint (*)(git_transport *, git_push *, const git_remote_callbacks *) push\nint (*)(git_transport *, git_repository *, const git_remote_head *const *, size_t) negotiate_fetch\nint (*)(git_transport *, git_repository *, git_transfer_progress *, git_transfer_progress_cb, void *) download_pack\nint (*)(git_transport *) is_connected\nint (*)(git_transport *, int *) read_flags\nvoid (*)(git_transport *) cancel\nint (*)(git_transport *) close\nvoid (*)(git_transport *) free", "tdef": "typedef", "description": " Interface which represents a transport to communicate with a\n remote.", @@ -40795,7 +41457,7 @@ { "type": "unsigned int", "name": "version", - "comments": "" + "comments": " The struct version " }, { "type": "int (*)(git_transport *, git_transport_message_cb, git_transport_message_cb, git_transport_certificate_check_cb, void *)", @@ -40915,8 +41577,8 @@ "type": "struct", "value": "git_tree", "file": "git2/types.h", - "line": 132, - "lineto": 132, + "line": 130, + "lineto": 130, "tdef": "typedef", "description": " Representation of a tree object. ", "comments": "", @@ -40929,6 +41591,7 @@ "git_treebuilder_get" ], "needs": [ + "git_apply_to_tree", "git_commit_amend", "git_commit_create", "git_commit_create_buffer", @@ -40986,8 +41649,8 @@ "type": "struct", "value": "git_tree_entry", "file": "git2/types.h", - "line": 129, - "lineto": 129, + "line": 127, + "lineto": 127, "tdef": "typedef", "description": " Representation of each one of the entries in a tree object. ", "comments": "", @@ -41107,8 +41770,8 @@ "type": "struct", "value": "git_treebuilder", "file": "git2/types.h", - "line": 135, - "lineto": 135, + "line": 133, + "lineto": 133, "tdef": "typedef", "description": " Constructor for in-memory trees ", "comments": "", @@ -41174,8 +41837,8 @@ "type": "struct", "value": "git_worktree", "file": "git2/types.h", - "line": 111, - "lineto": 111, + "line": 109, + "lineto": 109, "tdef": "typedef", "description": " Representation of a working tree ", "comments": "", @@ -41250,17 +41913,17 @@ { "decl": [ "unsigned int version", - "uint32_t flags" + "int flags" ], "type": "struct", "value": "git_worktree_prune_options", "file": "git2/worktree.h", "line": 198, "lineto": 202, - "block": "unsigned int version\nuint32_t flags", + "block": "unsigned int version\nint flags", "tdef": "typedef", - "description": " Worktree prune options structure", - "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can\n use git_worktree_prune_init_options.

\n", + "description": "", + "comments": "", "fields": [ { "type": "unsigned int", @@ -41268,7 +41931,7 @@ "comments": "" }, { - "type": "uint32_t", + "type": "int", "name": "flags", "comments": "" } @@ -41332,8 +41995,8 @@ "type": "struct", "value": "git_writestream", "file": "git2/types.h", - "line": 428, - "lineto": 428, + "line": 432, + "lineto": 432, "tdef": "typedef", "description": " A type to write in a streaming fashion, for example, for filters. ", "comments": "", @@ -41416,6 +42079,13 @@ "git_annotated_commit_ref" ] ], + [ + "apply", + [ + "git_apply", + "git_apply_to_tree" + ] + ], [ "attr", [ @@ -41672,6 +42342,15 @@ "git_diff_tree_to_workdir_with_index" ] ], + [ + "error", + [ + "git_error_clear", + "git_error_last", + "git_error_set_oom", + "git_error_set_str" + ] + ], [ "fetch", [ @@ -41770,6 +42449,9 @@ "git_index_get_byindex", "git_index_get_bypath", "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", "git_index_name_add", "git_index_name_clear", "git_index_name_entrycount", @@ -41846,6 +42528,7 @@ [ "git_merge", "git_merge_analysis", + "git_merge_analysis_for_ref", "git_merge_base", "git_merge_base_many", "git_merge_base_octopus", @@ -42195,7 +42878,9 @@ "git_remote_create", "git_remote_create_anonymous", "git_remote_create_detached", + "git_remote_create_init_options", "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", "git_remote_default_branch", "git_remote_delete", "git_remote_disconnect", @@ -42395,6 +43080,7 @@ [ "stream", [ + "git_stream_register", "git_stream_register_tls" ] ], @@ -42574,103 +43260,103 @@ "examples": [ [ "add.c", - "ex/HEAD/add.html" + "ex/v0.28.0/add.html" ], [ "blame.c", - "ex/HEAD/blame.html" + "ex/v0.28.0/blame.html" ], [ "cat-file.c", - "ex/HEAD/cat-file.html" + "ex/v0.28.0/cat-file.html" ], [ "checkout.c", - "ex/HEAD/checkout.html" + "ex/v0.28.0/checkout.html" ], [ "common.c", - "ex/HEAD/common.html" + "ex/v0.28.0/common.html" ], [ "describe.c", - "ex/HEAD/describe.html" + "ex/v0.28.0/describe.html" ], [ "diff.c", - "ex/HEAD/diff.html" + "ex/v0.28.0/diff.html" ], [ "for-each-ref.c", - "ex/HEAD/for-each-ref.html" + "ex/v0.28.0/for-each-ref.html" ], [ "general.c", - "ex/HEAD/general.html" + "ex/v0.28.0/general.html" ], [ "init.c", - "ex/HEAD/init.html" + "ex/v0.28.0/init.html" ], [ "log.c", - "ex/HEAD/log.html" + "ex/v0.28.0/log.html" ], [ "ls-files.c", - "ex/HEAD/ls-files.html" + "ex/v0.28.0/ls-files.html" ], [ "merge.c", - "ex/HEAD/merge.html" + "ex/v0.28.0/merge.html" ], [ "network/clone.c", - "ex/HEAD/network/clone.html" + "ex/v0.28.0/network/clone.html" ], [ "network/common.c", - "ex/HEAD/network/common.html" + "ex/v0.28.0/network/common.html" ], [ "network/fetch.c", - "ex/HEAD/network/fetch.html" + "ex/v0.28.0/network/fetch.html" ], [ "network/git2.c", - "ex/HEAD/network/git2.html" + "ex/v0.28.0/network/git2.html" ], [ "network/index-pack.c", - "ex/HEAD/network/index-pack.html" + "ex/v0.28.0/network/index-pack.html" ], [ "network/ls-remote.c", - "ex/HEAD/network/ls-remote.html" + "ex/v0.28.0/network/ls-remote.html" ], [ "remote.c", - "ex/HEAD/remote.html" + "ex/v0.28.0/remote.html" ], [ "rev-list.c", - "ex/HEAD/rev-list.html" + "ex/v0.28.0/rev-list.html" ], [ "rev-parse.c", - "ex/HEAD/rev-parse.html" + "ex/v0.28.0/rev-parse.html" ], [ "showindex.c", - "ex/HEAD/showindex.html" + "ex/v0.28.0/showindex.html" ], [ "status.c", - "ex/HEAD/status.html" + "ex/v0.28.0/status.html" ], [ "tag.c", - "ex/HEAD/tag.html" + "ex/v0.28.0/tag.html" ] ] } diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 07b2b770e..a93eb06a6 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -86,6 +86,20 @@ }, "new" : { "functions": { + "git_blame_get_hunk_count": { + "type": "function", + "file": "blame.h", + "args": [ + { + "name": "blame", + "type": "git_blame *" + } + ], + "return": { + "type": "int" + }, + "group": "blame" + }, "git_clone": { "isManual": true, "cFile": "generate/templates/manual/clone/clone.cc", @@ -134,6 +148,34 @@ "isPrototypeMethod": false, "group": "filter_list" }, + "git_filter_source_filemode": { + "type": "function", + "file": "filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "uint16_t" + }, + "group": "filter_source" + }, + "git_filter_source_flags": { + "type": "function", + "file": "filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "uint32_t" + }, + "group": "filter_source" + }, "git_patch_convenient_from_diff": { "args": [ { @@ -318,7 +360,8 @@ "git_annotated_commit_from_ref", "git_annotated_commit_from_revspec", "git_annotated_commit_id", - "git_annotated_commit_lookup" + "git_annotated_commit_lookup", + "git_annotated_commit_ref" ] ], [ @@ -352,6 +395,22 @@ "git_filter_source_flags" ] ], + [ + "index_conflict_iterator", + [ + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next" + ] + ], + [ + "index_iterator", + [ + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next" + ] + ], [ "index_name_entry", [ @@ -470,51 +529,32 @@ ], "types": [ [ - "git_stash_apply_progress_t", + "git_apply_options", { - "type": "enum", + "type": "sctruct", "fields": [ { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_NONE", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", - "value": 3 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", - "value": 4 + "type": "unsigned int", + "name": "version" }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", - "value": 5 + "type": "git_apply_delta_cb", + "name": "delta_cb" }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", - "value": 6 + "type": "git_apply_hunk_cb", + "name": "hunk_cb" }, { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_DONE", - "value": 7 + "type": "void *", + "name": "payload" } - ] + ], + "used": { + "needs": [ + "git_apply_init_options" + ] + } } ], [ @@ -853,6 +893,39 @@ } } ], + [ + "git_remote_create_options", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version" + }, + { + "type": "git_repository *", + "name": "repository" + }, + { + "type": "const char *", + "name": "name" + }, + { + "type": "const char *", + "name": "fetchspec" + }, + { + "type": "unsigned int", + "name": "flags" + } + ], + "used": { + "needs": [ + "git_remote_create_init_options" + ] + } + } + ], [ "git_remote_head", { @@ -887,15 +960,51 @@ } ], [ - "git_time_t", - { - "type": "enum" - } - ], - [ - "git_trace_level_t", + "git_stash_apply_progress_t", { - "type": "enum" + "type": "enum", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_NONE", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "value": 3 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "value": 5 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "value": 6 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_DONE", + "value": 7 + } + ] } ], [ @@ -963,6 +1072,18 @@ } } ], + [ + "git_time_t", + { + "type": "enum" + } + ], + [ + "git_trace_level_t", + { + "type": "enum" + } + ], [ "git_worktree_add_options", { @@ -1028,7 +1149,8 @@ "git_annotated_commit_from_ref", "git_annotated_commit_from_revspec", "git_annotated_commit_id", - "git_annotated_commit_lookup" + "git_annotated_commit_lookup", + "git_annotated_commit_ref" ] }, "diff": { @@ -1042,6 +1164,12 @@ }, "index": { "functions": [ + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", "git_index_name_add", "git_index_name_clear", "git_index_name_entrycount", diff --git a/lib/remote.js b/lib/remote.js index b7c897957..09db11c1a 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -6,6 +6,7 @@ var shallowClone = NodeGit.Utils.shallowClone; var Remote = NodeGit.Remote; var _connect = Remote.prototype.connect; +var _createWithOpts = Remote.createWithOpts; var _download = Remote.prototype.download; var _fetch = Remote.prototype.fetch; var _push = Remote.prototype.push; @@ -45,6 +46,11 @@ Remote.prototype.connect = function( return _connect.call(this, direction, callbacks, proxyOpts, customHeaders); }; +Remote.createWithOpts = function(url, options) { + return _createWithOpts(url, normalizeOptions( + options, NodeGit.RemoteCreateOptions)); +}; + /** * Connects to a remote * From a4844f6e6dee5db1ab9e63f488bee26ff3636688 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Fri, 15 Feb 2019 09:34:00 -0700 Subject: [PATCH 068/545] Deprecate enums/fields that are missing/deprecated in libgit2 now --- lib/error.js | 16 ++++++++++++ lib/index.js | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/object.js | 10 ++++++++ lib/reference.js | 27 ++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 lib/error.js diff --git a/lib/error.js b/lib/error.js new file mode 100644 index 000000000..9d1ecacb9 --- /dev/null +++ b/lib/error.js @@ -0,0 +1,16 @@ +var util = require("util"); +var NodeGit = require("../"); + +// Deprecated ----------------------------------------------------------------- + +// In 0.28.0 git_error was majorly refactored to have better naming in libgit2 +// We will continue to support the old enum entries but with a deprecation +// warning as they will go away soon. +Object.keys(NodeGit.Error.CODE).forEach((key) => { + Object.defineProperty(NodeGit.Error.CODE, `GITERR_${key}`, { + get: util.deprecate( + () => NodeGit.Error.CODE[key], + `Use NodeGit.Error.CODE.${key} instead.` + ) + }); +}); diff --git a/lib/index.js b/lib/index.js index cb87784d3..3426b1030 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,3 +1,4 @@ +var util = require("util"); var NodeGit = require("../"); var Index = NodeGit.Index; @@ -32,3 +33,67 @@ Index.prototype.removeAll = function(pathspec, matchedCallback) { Index.prototype.updateAll = function(pathspec, matchedCallback) { return _updateAll.call(this, pathspec || "*", matchedCallback, null); }; + +// Deprecated ----------------------------------------------------------------- + +NodeGit.Index.CAP = {}; +Object.keys(NodeGit.Index.CAPABILITY).forEach((key) => { + Object.defineProperty(NodeGit.Index.CAP, key, { + get: util.deprecate( + () => NodeGit.Index.CAPABILITY[key], + `Use NodeGit.Index.CAPABILITY.${key} instead.` + ) + }); +}); + +NodeGit.Enums.INDXENTRY_FLAG = {}; +Object.defineProperty(NodeGit.Enums.INDXENTRY_FLAG, "IDXENTRY_EXTENDED", { + get: util.deprecate( + () => NodeGit.Index.ENTRY_FLAG.ENTRY_EXTENDED, + "Use NodeGit.Index.ENTRY_FLAG.ENTRY_EXTENDED instead." + ) +}); +Object.defineProperty(NodeGit.Enums.INDXENTRY_FLAG, "IDXENTRY_VALID", { + get: util.deprecate( + () => NodeGit.Index.ENTRY_FLAG.ENTRY_VALID, + "Use NodeGit.Index.ENTRY_FLAG.ENTRY_VALID instead." + ) +}); + +NodeGit.Enums.IDXENTRY_EXTENDED_FLAG = {}; +var EXTENDED_FLAGS_MAP = { + IDXENTRY_INTENT_TO_ADD: "ENTRY_INTENT_TO_ADD", + IDXENTRY_SKIP_WORKTREE: "ENTRY_SKIP_WORKTREE", + S: "S", + IDXENTRY_UPTODATE: "ENTRY_UPTODATE" +}; +Object.keys(EXTENDED_FLAGS_MAP).forEach((key) => { + const newKey = EXTENDED_FLAGS_MAP[key]; + Object.defineProperty(NodeGit.Enums.IDXENTRY_EXTENDED_FLAG, key, { + get: util.deprecate( + () => NodeGit.Index.ENTRY_EXTENDED_FLAG[newKey], + `Use NodeGit.Index.ENTRY_EXTENDED_FLAG.${newKey} instead.` + ) + }); +}); + +var DEPRECATED_EXTENDED_FLAGS = { + IDXENTRY_EXTENDED2: 32768, + IDXENTRY_UPDATE: 1, + IDXENTRY_REMOVE: 2, + IDXENTRY_ADDED: 8, + IDXENTRY_HASHED: 16, + IDXENTRY_UNHASHED: 32, + IDXENTRY_WT_REMOVE: 64, + IDXENTRY_CONFLICTED: 128, + IDXENTRY_UNPACKED: 256, + IDXENTRY_NEW_SKIP_WORKTREE: 512, +}; +Object.keys(DEPRECATED_EXTENDED_FLAGS).forEach((key) => { + Object.defineProperty(NodeGit.Enums.IDXENTRY_EXTENDED_FLAG, key, { + get: util.deprecate( + () => DEPRECATED_EXTENDED_FLAGS[key], + "LibGit2 has removed this flag for public usage." + ) + }); +}); diff --git a/lib/object.js b/lib/object.js index 85917987a..8e65660d9 100644 --- a/lib/object.js +++ b/lib/object.js @@ -1,3 +1,4 @@ +var util = require("util"); var NodeGit = require("../"); var Obj = NodeGit.Object; @@ -33,3 +34,12 @@ Obj.prototype.isTag = function() { Obj.prototype.isTree = function() { return this.type() == Obj.TYPE.TREE; }; + +// Deprecated ----------------------------------------------------------------- + +Object.defineProperty(Obj.TYPE, "BAD", { + get: util.deprecate( + () => Obj.TYPE.INVALID, + "Use NodeGit.Object.TYPE.INVALID instead." + ) +}); diff --git a/lib/reference.js b/lib/reference.js index 6fdc6fa19..3d39d0c84 100644 --- a/lib/reference.js +++ b/lib/reference.js @@ -1,3 +1,4 @@ +var util = require("util"); var NodeGit = require("../"); var LookupWrapper = NodeGit.Utils.lookupWrapper; @@ -183,3 +184,29 @@ Reference.updateTerminal = function ( return reflog.write(); }); }; + +// Deprecated ----------------------------------------------------------------- + +Object.defineProperty(NodeGit.Reference.TYPE, "OID", { + get: util.deprecate( + () => NodeGit.Reference.TYPE.DIRECT, + "Use NodeGit.Reference.TYPE.DIRECT instead." + ) +}); + +Object.defineProperty(NodeGit.Reference.TYPE, "LISTALL", { + get: util.deprecate( + () => NodeGit.Reference.TYPE.ALL, + "Use NodeGit.Reference.TYPE.ALL instead." + ) +}); + +NodeGit.Reference.NORMALIZE = {}; +Object.keys(NodeGit.Reference.FORMAT).forEach((key) => { + Object.defineProperty(NodeGit.Reference.NORMALIZE, `REF_FORMAT_${key}`, { + get: util.deprecate( + () => NodeGit.Reference.FORMAT[key], + `Use NodeGit.Reference.FORMAT.${key} instead.` + ) + }); +}); From d2e3e14e36800d3b1d12e179a711da4f3a7ac6eb Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Fri, 15 Feb 2019 09:36:06 -0700 Subject: [PATCH 069/545] Fix deprecations in test suite --- lib/reference.js | 4 ++-- test/tests/diff.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/reference.js b/lib/reference.js index 3d39d0c84..af859c3cc 100644 --- a/lib/reference.js +++ b/lib/reference.js @@ -30,7 +30,7 @@ Reference.lookup = LookupWrapper(Reference); * @return {Boolean} */ Reference.prototype.isConcrete = function() { - return this.type() == Reference.TYPE.OID; + return this.type() == Reference.TYPE.DIRECT; }; /** @@ -75,7 +75,7 @@ const getTerminal = (repo, refName, depth = 10, prevRef = null) => { return NodeGit.Reference.lookup(repo, refName) .then((ref) => { - if (ref.type() === NodeGit.Reference.TYPE.OID) { + if (ref.type() === NodeGit.Reference.TYPE.DIRECT) { return { error: NodeGit.Error.CODE.OK, out: ref diff --git a/test/tests/diff.js b/test/tests/diff.js index d9dfec7bc..7eb243fc9 100644 --- a/test/tests/diff.js +++ b/test/tests/diff.js @@ -414,7 +414,7 @@ describe("Diff", function() { }) .then(function([headTree, index]) { const diffOptions = new NodeGit.DiffOptions(); - if (index.caps() & Index.CAP.IGNORE_CASE !== 0) { + if (index.caps() & Index.CAPABILITY.IGNORE_CASE !== 0) { diffOptions.flags |= Diff.OPTION.IGNORE_CASE; } From 75e363fd3dd7b3c936287782f2f7f72891d821d4 Mon Sep 17 00:00:00 2001 From: David Russo Date: Tue, 19 Feb 2019 12:59:55 -0500 Subject: [PATCH 070/545] Add support for building on IBM i PASE --- generate/templates/templates/binding.gyp | 17 ++++++++++++++--- utils/isBuildingForIBMi.js | 4 ++++ vendor/libgit2.gyp | 17 ++++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 utils/isBuildingForIBMi.js diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index f67cf2e31..70e516d13 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -1,6 +1,7 @@ { "variables": { - "is_electron%": " Date: Tue, 19 Feb 2019 15:26:52 -0700 Subject: [PATCH 071/545] Expose more config methods Exposes config methods: - git_config_delete_entry - git_config_delete_multivar - git_config_get_bool - git_config_get_int32 - git_config_get_int64 - git_config_set_multivar - git_config_snapshot Exposes git_config_iterator: - git_config_iterator_new -> ConfigIterator.create - git_config_iterator_glob_new -> ConfigIterator.createGlob - git_config_multivar_iterator_new -> ConfigIterator.createMultivar - git_config_next -> ConfigIterator.prototype.next --- generate/input/descriptor.json | 131 ++++++++++++++++++++----- generate/input/libgit2-supplement.json | 19 ++++ 2 files changed, 128 insertions(+), 22 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 6daa52ce1..18586d626 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -695,10 +695,14 @@ "ignore": true }, "git_config_delete_entry": { - "ignore": true + "return": { + "isErrorCode": true + } }, "git_config_delete_multivar": { - "ignore": true + "return": { + "isErrorCode": true + } }, "git_config_entry_free": { "ignore": true @@ -762,7 +766,14 @@ "ignore": true }, "git_config_get_bool": { - "ignore": true + "args": { + "out": { + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_get_entry": { "args": { @@ -773,10 +784,26 @@ } }, "git_config_get_int32": { - "ignore": true + "args": { + "out": { + "cType": "int32_t *", + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_get_int64": { - "ignore": true + "args": { + "out": { + "cType": "int64_t *", + "shouldAlloc": true + } + }, + "return": { + "isErrorCode": true + } }, "git_config_get_mapped": { "ignore": true @@ -814,15 +841,6 @@ "git_config_init_backend": { "ignore": true }, - "git_config_iterator_free": { - "ignore": true - }, - "git_config_iterator_glob_new": { - "ignore": true - }, - "git_config_iterator_new": { - "ignore": true - }, "git_config_lock": { "isAsync": true, "args": { @@ -838,15 +856,9 @@ "git_config_lookup_map_value": { "ignore": true }, - "git_config_multivar_iterator_new": { - "ignore": true - }, "git_config_new": { "ignore": true }, - "git_config_next": { - "ignore": true - }, "git_config_open_default": { "isAsync": true, "return": { @@ -900,6 +912,12 @@ "isErrorCode": true } }, + "git_config_set_multivar": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_config_set_string": { "isAsync": true, "return": { @@ -907,7 +925,14 @@ } }, "git_config_snapshot": { - "ignore": true + "args": { + "out": { + "ownedByThis": true + } + }, + "return": { + "isErrorCode": true + } } }, "dependencies": [ @@ -921,7 +946,69 @@ "selfFreeing": true }, "config_iterator": { - "ignore": true + "selfFreeing": true, + "fields": { + "backend": { + "ignore": true + }, + "flags": { + "ignore": true + }, + "free": { + "ignore": true + }, + "next": { + "ignore": true + } + }, + "functions": { + "git_config_iterator_free": { + "ignore": true + }, + "git_config_iterator_new": { + "args": { + "out": { + "ownedBy": ["cfg"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_config_iterator_glob_new": { + "jsFunctionName": "createGlob", + "args": { + "out": { + "ownedBy": ["cfg"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_config_multivar_iterator_new": { + "jsFunctionName": "createMultivar", + "args": { + "out": { + "ownedBy": ["cfg"] + } + }, + "return": { + "isErrorCode": true + } + }, + "git_config_next": { + "jsFunctionName": "next", + "args": { + "entry": { + "ownedByThis": true + } + }, + "return": { + "isErrorCode": true + } + } + } }, "cred": { "needsForwardDeclaration": false, diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index a93eb06a6..30cfc3f1a 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -364,6 +364,16 @@ "git_annotated_commit_ref" ] ], + [ + "config_iterator", + [ + "git_config_iterator_free", + "git_config_iterator_new", + "git_config_iterator_glob_new", + "git_config_multivar_iterator_new", + "git_config_next" + ] + ], [ "diff_stats", [ @@ -1153,6 +1163,15 @@ "git_annotated_commit_ref" ] }, + "config": { + "functions": [ + "git_config_iterator_free", + "git_config_iterator_new", + "git_config_iterator_glob_new", + "git_config_multivar_iterator_new", + "git_config_next" + ] + }, "diff": { "functions": [ "git_diff_stats_files_changed", From 5776100be7891abe7ab68d9ab431aaf1c05ce22f Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 19 Feb 2019 15:32:09 -0700 Subject: [PATCH 072/545] Catch errors and pass them to libgit2 as error codes in rebase signingcb --- lib/rebase.js | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/rebase.js b/lib/rebase.js index e55f0ddde..731f54bd5 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -26,17 +26,32 @@ function defaultRebaseOptions(options, checkoutStrategy) { signatureFieldBuf, commitContent ) { - return Promise.resolve(signingCb(commitContent)) - .then(function({ code, field, signedData }) { - if (code === NodeGit.Error.CODE.OK) { - signatureBuf.setString(signedData); - if (field) { - signatureFieldBuf.setString(field); + try { + const signingCbResult = signingCb(commitContent); + + return Promise.resolve(signingCbResult) + .then(function({ code, field, signedData }) { + if (code === NodeGit.Error.CODE.OK) { + signatureBuf.setString(signedData); + if (field) { + signatureFieldBuf.setString(field); + } } - } - return code; - }); + return code; + }) + .catch(function(error) { + if (error && error.code) { + return error.code; + } + return NodeGit.Error.CODE.ERROR; + }); + } catch (error) { + if (error && error.code) { + return error.code; + } + return NodeGit.Error.CODE.ERROR; + } }; } From f9179219d5db00c32dd152895616349595e6db77 Mon Sep 17 00:00:00 2001 From: David Russo Date: Tue, 19 Feb 2019 17:17:25 -0500 Subject: [PATCH 073/545] Simplify check for IBM i operating system --- generate/templates/templates/binding.gyp | 2 +- utils/isBuildingForIBMi.js | 4 ---- vendor/libgit2.gyp | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 utils/isBuildingForIBMi.js diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 70e516d13..3d2d80a0d 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -1,7 +1,7 @@ { "variables": { "is_electron%": " Date: Wed, 20 Feb 2019 09:33:09 -0700 Subject: [PATCH 074/545] Bump LibGit2 to nodegit-fork/maint/v0.28.1 Includes fix to error handling in for rebase signing_cb --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index c59d5a2e9..97e4179a7 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit c59d5a2e9332c8256111de4cc8e69d9c2278ee46 +Subproject commit 97e4179a76b935a15589a44662ce54a0ce0f3026 From b944ba8a12a1f3f1305aa0d3973ad7b1e4f94c60 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 20 Feb 2019 09:44:21 -0700 Subject: [PATCH 075/545] Fix npm high security advisory This only really affected our testing framework though, so shouldn't be of much concern --- package-lock.json | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index b30eb273f..045e7e51b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2583,10 +2583,9 @@ "dev": true }, "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", "requires": { "async": "^2.5.0", "optimist": "^0.6.1", @@ -2595,19 +2594,17 @@ }, "dependencies": { "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -3881,7 +3878,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -3890,8 +3886,7 @@ "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, @@ -5312,7 +5307,6 @@ "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, "optional": true, "requires": { "commander": "~2.17.1", @@ -5323,14 +5317,12 @@ "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, "optional": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "optional": true } } From cbc29fabf4c81b2f507da13a911f4b04406c5ad1 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 20 Feb 2019 12:08:43 -0700 Subject: [PATCH 076/545] Bump to v0.25.0-alpha.7 --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c70866e50..9e58245a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,47 @@ # Change Log +## v0.25.0-alpha.7 [(2019-02-20)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.7) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.6...v0.25.0-alpha.7) + +#### Summary of changes +- Fixed bug where repeated uses of extractSignature would fail because of the use of regex.prototype.match +- Added support for building on IBM i (PASE) machines +- Fixed bug where signingCb in rebases would not return error codes to LibGit2 if the signingCb threw or rejected +- Expoed AnnotatedCommit methods: + - AnnotatedCommit.prototype.ref +- Exposed Apply methods: + - Apply.apply applies a diff to the repository + - Apply.toTree applies a diff to a tree +- Exposed Config methods: + - Config.prototype.deleteEntry + - Config.prototype.deleteMultivar + - Config.prototype.getBool + - Config.prototype.getInt32 + - Config.prototype.getInt64 + - Config.prototype.setMultivar + - Config.prototype.snapshot +- Exposed ConfigIterator with methods: + - ConfigIterator.create + - ConfigIterator.createGlob + - ConfigIterator.createMultivar + - ConfigIterator.prototype.next +- Exposed Merge methods: + - Merge.analysis + - Merge.analysisForRef +- Expose Remote methods: + - Remote.createWithOpts + +#### Merged PRs into NodeGit +- [Fix regex state causing subsequent runs of Tag.extractSignature to fail #1630](https://github.com/nodegit/nodegit/pull/1630) +- [Update LibGit2 docs to v0.28.0 #1631](https://github.com/nodegit/nodegit/pull/1631) +- [Add support for building on IBM i (PASE) #1634](https://github.com/nodegit/nodegit/pull/1634) +- [Expose more config methods #1635](https://github.com/nodegit/nodegit/pull/1635) +- [Catch errors and pass them to libgit2 as error codes in rebase signingcb #1636](https://github.com/nodegit/nodegit/pull/1636) +- [Simplify check for IBM i operating system #1637](https://github.com/nodegit/nodegit/pull/1637) +- [Bump LibGit2 to fork of v0.28.1 #1638](https://github.com/nodegit/nodegit/pull/1638) + + ## v0.25.0-alpha.6 [(2019-02-14)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.6) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.5...v0.25.0-alpha.6) diff --git a/package-lock.json b/package-lock.json index 045e7e51b..d73f90805 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.6", + "version": "0.25.0-alpha.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6b4d3ac15..b58d00c80 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.6", + "version": "0.25.0-alpha.7", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 9ceaf70af2eaef8aad1a0446f15e528b846b37cf Mon Sep 17 00:00:00 2001 From: Steven King Jr Date: Wed, 27 Feb 2019 13:49:32 -0700 Subject: [PATCH 077/545] Add missing `shouldAlloc` declarations for git_merge_analysis* functions --- generate/input/descriptor.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 18586d626..f5c436b7e 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2094,10 +2094,12 @@ "isAsync": true, "args": { "analysis_out": { - "isReturn": true + "isReturn": true, + "shouldAlloc": true }, "preference_out": { - "isReturn": true + "isReturn": true, + "shouldAlloc": true }, "their_heads": { "cType": "const git_annotated_commit **", @@ -2116,10 +2118,12 @@ "isAsync": true, "args": { "analysis_out": { - "isReturn": true + "isReturn": true, + "shouldAlloc": true }, "preference_out": { - "isReturn": true + "isReturn": true, + "shouldAlloc": true }, "their_heads": { "cType": "const git_annotated_commit **", From c187a3de90ff44f6ae4f53fb4d64a3a72fea4577 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 27 Feb 2019 14:43:49 -0700 Subject: [PATCH 078/545] Bump to v0.25.0-alpha.8 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e58245a9..b57446911 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.25.0-alpha.8 [(2019-02-27)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.8) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.7...v0.25.0-alpha.8) + +#### Summary of changes +- Fixed segfault in NodeGit.Merge.analysis and NodeGit.Merge.analysisForRef + +#### Merged PRs into NodeGit +- [Add missing `shouldAlloc` declarations for git_merge_analysis* functions #1641](https://github.com/nodegit/nodegit/pull/1641) + + ## v0.25.0-alpha.7 [(2019-02-20)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.7) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.6...v0.25.0-alpha.7) diff --git a/package-lock.json b/package-lock.json index d73f90805..f498d4a9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.7", + "version": "0.25.0-alpha.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b58d00c80..d6afd5290 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.7", + "version": "0.25.0-alpha.8", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 2e891ce6288d7e838703f2b1d0338ba637764826 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 4 Mar 2019 08:31:48 -0700 Subject: [PATCH 079/545] Add ignorable callback arguments This is especially helpful right now, because certain parameters have difficult garbage collection patterns. At the very least, for cases where a garbage collection pattern has not been fully fleshed out, we can ignore certain callback parameters until we can safely handle their memory. --- generate/input/callbacks.json | 29 ++---- generate/scripts/generateNativeCode.js | 2 + .../templates/filters/callback_args_count.js | 18 ++++ .../templates/filters/callback_args_info.js | 27 +++++ generate/templates/filters/js_args_count.js | 4 +- .../templates/partials/callback_helpers.cc | 35 +++---- .../templates/partials/field_accessors.cc | 98 ++++--------------- 7 files changed, 91 insertions(+), 122 deletions(-) create mode 100644 generate/templates/filters/callback_args_count.js create mode 100644 generate/templates/filters/callback_args_info.js diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index c37a7c8ee..cb9f10079 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -57,24 +57,6 @@ "error": -1 } }, - "git_blob_chunk_cb": { - "args": [ - { - "name": "entry", - "cType": "const git_config_entry *" - }, - { - "name": "payload", - "cType": "void *" - } - ], - "return": { - "type": "int", - "noResults": 1, - "success": 0, - "error": -1 - } - }, "git_checkout_notify_cb": { "args": [ { @@ -326,7 +308,8 @@ "args": [ { "name": "diff_so_far", - "cType": "const git_diff *" + "cType": "const git_diff *", + "ignore": true }, { "name": "delta_to_add", @@ -347,11 +330,13 @@ "success": 0, "error": -1 } - },"git_diff_progress_cb": { + }, + "git_diff_progress_cb": { "args": [ { "name": "diff_so_far", - "cType": "const git_diff *" + "cType": "const git_diff *", + "ignore": true }, { "name": "old_path", @@ -551,7 +536,7 @@ "args": [ { "name": "out", - "cType": "git_repository **", + "cType": "git_remote **", "isReturn": true }, { diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index 47a832419..8ba821903 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -52,6 +52,8 @@ module.exports = function generateNativeCode() { argsInfo: require("../templates/filters/args_info"), arrayTypeToPlainType: require("../templates/filters/array_type_to_plain_type"), asElementPointer: require("../templates/filters/as_element_pointer"), + callbackArgsInfo: require("../templates/filters/callback_args_info"), + callbackArgsCount: require("../templates/filters/callback_args_count"), cppToV8: require("../templates/filters/cpp_to_v8"), defaultValue: require("../templates/filters/default_value"), fieldsInfo: require("../templates/filters/fields_info"), diff --git a/generate/templates/filters/callback_args_count.js b/generate/templates/filters/callback_args_count.js new file mode 100644 index 000000000..26c7762ea --- /dev/null +++ b/generate/templates/filters/callback_args_count.js @@ -0,0 +1,18 @@ +module.exports = function(args) { + if (!args) { + return 0; + } + + return args.reduce( + function(count, arg) { + var shouldCount = !arg.isReturn && + !arg.isSelf && + arg.name !== "payload" && + arg.name !== "self" && + !arg.ignore; + + return shouldCount ? count + 1 : count; + }, + 0 + ); +}; diff --git a/generate/templates/filters/callback_args_info.js b/generate/templates/filters/callback_args_info.js new file mode 100644 index 000000000..a7285c0b8 --- /dev/null +++ b/generate/templates/filters/callback_args_info.js @@ -0,0 +1,27 @@ +module.exports = function(args) { + var result = args.reduce( + function(argList, arg) { + var useArg = !arg.isReturn && + !arg.isSelf && + arg.name !== "payload" && + arg.name !== "self" && + !arg.ignore; + + if (!useArg) { + return argList; + } + + arg.firstArg = argList.length === 0; + argList.push(arg); + + return argList; + }, + [] + ); + + if (result.length) { + result[result.length - 1].lastArg = true; + } + + return result; +}; diff --git a/generate/templates/filters/js_args_count.js b/generate/templates/filters/js_args_count.js index 5be437f41..17a56a1c1 100644 --- a/generate/templates/filters/js_args_count.js +++ b/generate/templates/filters/js_args_count.js @@ -5,11 +5,11 @@ module.exports = function(args) { if (!args) { return 0; } - + for(cArg = 0, jsArg = 0; cArg < args.length; cArg++) { var arg = args[cArg]; - if (!arg.isReturn && !arg.isSelf && !arg.isPayload) { + if (!arg.isReturn && !arg.isSelf) { jsArg++; } } diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index 1abfaa991..7a40aed25 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -30,32 +30,27 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void {% endif %} {% endeach %} - v8::Local argv[{{ cbFunction.args|jsArgsCount }}] = { - {% each cbFunction.args|argsInfo as arg %} - {% if arg | isPayload %} - {%-- payload is always the last arg --%} - // payload is null because we can use closure scope in javascript - Nan::Undefined() - {% elsif arg.isJsArg %} - {% if arg.isEnum %} - Nan::New((int)baton->{{ arg.name }}), - {% elsif arg.isLibgitType %} - {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false), - {% elsif arg.cType == "size_t" %} - // HACK: NAN should really have an overload for Nan::New to support size_t - Nan::New((unsigned int)baton->{{ arg.name }}), - {% elsif arg.cppClassName == 'String' %} - Nan::New(baton->{{ arg.name }}).ToLocalChecked(), - {% else %} - Nan::New(baton->{{ arg.name }}), - {% endif %} + v8::Local argv[{{ cbFunction.args|callbackArgsCount }}] = { + {% each cbFunction.args|callbackArgsInfo as arg %} + {% if not arg.firstArg %}, {% endif %} + {% if arg.isEnum %} + Nan::New((int)baton->{{ arg.name }}) + {% elsif arg.isLibgitType %} + {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false) + {% elsif arg.cType == "size_t" %} + // HACK: NAN should really have an overload for Nan::New to support size_t + Nan::New((unsigned int)baton->{{ arg.name }}) + {% elsif arg.cppClassName == 'String' %} + Nan::New(baton->{{ arg.name }}).ToLocalChecked() + {% else %} + Nan::New(baton->{{ arg.name }}) {% endif %} {% endeach %} }; Nan::TryCatch tryCatch; // TODO This should take an async_resource, but we will need to figure out how to pipe the correct context into this - Nan::MaybeLocal maybeResult = Nan::Call(*callback, {{ cbFunction.args|jsArgsCount }}, argv); + Nan::MaybeLocal maybeResult = Nan::Call(*callback, {{ cbFunction.args|callbackArgsCount }}, argv); v8::Local result; if (!maybeResult.IsEmpty()) { result = maybeResult.ToLocalChecked(); diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 6325587d3..222034150 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -179,92 +179,34 @@ return; } - {% each field.args|argsInfo as arg %} - {% if arg.name == "payload" %} - {%-- Do nothing --%} - {% elsif arg.isJsArg %} - {% if arg.cType == "const char *" %} - if (baton->{{ arg.name }} == NULL) { - baton->{{ arg.name }} = ""; - } - {% elsif arg.cppClassName == "String" %} - v8::Local src; - if (baton->{{ arg.name }} == NULL) { - src = Nan::Null(); - } - else { - src = Nan::New(*baton->{{ arg.name }}).ToLocalChecked(); - } - {% endif %} - {% endif %} - {% endeach %} - - {% if field.isSelfReferential %} - {% if field.args|jsArgsCount|subtract 2| setUnsigned == 0 %} - v8::Local *argv = NULL; - {% else %} - v8::Local argv[{{ field.args|jsArgsCount|subtract 2| setUnsigned }}] = { - {% endif %} + {% if field.args|callbackArgsCount == 0 %} + v8::Local *argv = NULL; {% else %} - v8::Local argv[{{ field.args|jsArgsCount }}] = { - {% endif %} - {% each field.args|argsInfo as arg %} - {% if field.isSelfReferential %} - {% if not arg.firstArg %} - {% if field.args|jsArgsCount|subtract 1|or 0 %} - {% if arg.cppClassName == "String" %} - {%-- src is always the last arg --%} - src - {% elsif arg.isJsArg %} - {% if arg.isEnum %} - Nan::New((int)baton->{{ arg.name }}), - {% elsif arg.isLibgitType %} - {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false), - {% elsif arg.cType == "size_t" %} - Nan::New((unsigned int)baton->{{ arg.name }}), - {% elsif arg.name == "payload" %} - {%-- skip, filters should not have a payload --%} - {% else %} - Nan::New(baton->{{ arg.name }}), - {% endif %} - {% endif %} - {% endif %} - {% endif %} - {% else %} - {% if arg.name == "payload" %} - {%-- payload is always the last arg --%} - Nan::New(instance->{{ fields|payloadFor field.name }}) - {% elsif arg.isJsArg %} - {% if arg.isEnum %} - Nan::New((int)baton->{{ arg.name }}), - {% elsif arg.isLibgitType %} - {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false), - {% elsif arg.cType == "size_t" %} - // HACK: NAN should really have an overload for Nan::New to support size_t - Nan::New((unsigned int)baton->{{ arg.name }}), - {% elsif arg.cppClassName == "String" %} - Nan::New(baton->{{ arg.name }}).ToLocalChecked(), - {% else %} - Nan::New(baton->{{ arg.name }}), - {% endif %} + v8::Local argv[{{ field.args|callbackArgsCount }}] = { + {% each field.args|callbackArgsInfo as arg %} + {% if not arg.firstArg %},{% endif %} + {% if arg.isEnum %} + Nan::New((int)baton->{{ arg.name }}) + {% elsif arg.isLibgitType %} + {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false) + {% elsif arg.cType == "size_t" %} + // HACK: NAN should really have an overload for Nan::New to support size_t + Nan::New((unsigned int)baton->{{ arg.name }}) + {% elsif arg.cppClassName == "String" %} + baton->{{ arg.name }} == NULL + ? Nan::EmptyString() + : Nan::New({%if arg.cType | isDoublePointer %}*{% endif %}baton->{{ arg.name }}).ToLocalChecked() + {% else %} + Nan::New(baton->{{ arg.name }}) {% endif %} - {% endif %} - {% endeach %} - {% if not field.isSelfReferential %} - }; - {% elsif field.args|jsArgsCount|subtract 2| setUnsigned > 0 %} + {% endeach %} }; {% endif %} Nan::TryCatch tryCatch; // TODO This should take an async_resource, but we will need to figure out how to pipe the correct context into this - {% if field.isSelfReferential %} - Nan::MaybeLocal maybeResult = Nan::Call(*(instance->{{ field.name }}.GetCallback()), {{ field.args|jsArgsCount|subtract 2| setUnsigned }}, argv); - {% else %} - Nan::MaybeLocal maybeResult = Nan::Call(*(instance->{{ field.name }}.GetCallback()), {{ field.args|jsArgsCount }}, argv); - {% endif %} - + Nan::MaybeLocal maybeResult = Nan::Call(*(instance->{{ field.name }}.GetCallback()), {{ field.args|callbackArgsCount }}, argv); v8::Local result; if (!maybeResult.IsEmpty()) { result = maybeResult.ToLocalChecked(); From dc7e7cd2eb1801c6cd3b7679c0c4feefc906f84b Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 4 Mar 2019 08:35:13 -0700 Subject: [PATCH 080/545] Update FilterSource to have an async `repo` getter We discovered that after the garbage collection PR, that submodules can trigger the filter with a filter_source that has a repo that NodeGit has never seen before. This causes libgit2 to free their repo, and us to free what we thought was our repo. As a temporary stopgap to allow filter writers to user repos, I've converted the repo getter to async, and opened a nodegit owned repo. This should prevent any segfaults when pulling the repo out during a filter operation at a small perf penalty. --- generate/input/libgit2-supplement.json | 22 +++++ .../templates/manual/filter_source/repo.cc | 90 +++++++++++++++++++ test/tests/filter.js | 58 ++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 generate/templates/manual/filter_source/repo.cc diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 30cfc3f1a..7b19afba9 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -176,6 +176,28 @@ }, "group": "filter_source" }, + "git_filter_source_repo": { + "args": [ + { + "name": "out", + "type": "git_repository **" + }, + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "isManual": true, + "cFile": "generate/templates/manual/filter_source/repo.cc", + "isAsync": true, + "isPrototypeMethod": true, + "type": "function", + "group": "filter_source", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_patch_convenient_from_diff": { "args": [ { diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc new file mode 100644 index 000000000..cf9c1a833 --- /dev/null +++ b/generate/templates/manual/filter_source/repo.cc @@ -0,0 +1,90 @@ +// NOTE you may need to occasionally rebuild this method by calling the generators +// if major changes are made to the templates / generator. + +// Due to some garbage collection issues related to submodules and git_filters, we need to clone the repository +// pointer before giving it to a user. + +/* + * @param Repository callback + */ +NAN_METHOD(GitFilterSource::Repo) { + if (info.Length() == 0 || !info[0]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + RepoBaton *baton = new RepoBaton; + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->src = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[0])); + RepoWorker *worker = new RepoWorker(baton, callback); + + worker->SaveToPersistent("src", info.This()); + + AsyncLibgit2QueueWorker(worker); + return; +} + +void GitFilterSource::RepoWorker::Execute() { + git_error_clear(); + + { + LockMaster lockMaster(true, baton->src); + + git_repository *repo = git_filter_source_repo(baton->src); + baton->error_code = git_repository_open(&repo, git_repository_path(repo)); + + if (baton->error_code == GIT_OK) { + baton->out = repo; + } else if (git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); + } + } +} + +void GitFilterSource::RepoWorker::HandleOKCallback() { + if (baton->error_code == GIT_OK) { + v8::Local to; + + if (baton->out != NULL) { + to = GitRepository::New(baton->out, true); + } else { + to = Nan::Null(); + } + + v8::Local argv[2] = {Nan::Null(), to}; + callback->Call(2, argv, async_resource); + } else { + if (baton->error) { + v8::Local err; + if (baton->error->message) { + err = Nan::Error(baton->error->message)->ToObject(); + } else { + err = Nan::Error("Method repo has thrown an error.")->ToObject(); + } + err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::New("FilterSource.repo").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + if (baton->error->message) + free((void *)baton->error->message); + free((void *)baton->error); + } else if (baton->error_code < 0) { + v8::Local err = + Nan::Error("Method repo has thrown an error.")->ToObject(); + err->Set(Nan::New("errno").ToLocalChecked(), + Nan::New(baton->error_code)); + err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::New("FilterSource.repo").ToLocalChecked()); + v8::Local argv[1] = {err}; + callback->Call(1, argv, async_resource); + } else { + callback->Call(0, NULL, async_resource); + } + } + + delete baton; +} diff --git a/test/tests/filter.js b/test/tests/filter.js index ef1efc5c0..e31ecd4b5 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -1076,4 +1076,62 @@ describe("Filter", function() { }); }); }); + + describe("FilterSource", function() { + var message = "some new fancy filter"; + + before(function() { + var test = this; + return fse.readFile(readmePath, "utf8") + .then((function(content) { + test.originalReadmeContent = content; + })); + }); + + afterEach(function() { + this.timeout(15000); + return fse.writeFile(readmePath, this.originalReadmeContent); + }); + + it("a FilterSource has an async repo getter", function() { + var test = this; + + return Registry.register(filterName, { + apply: function(to, from, source) { + return source.repo() + .then(function() { + return NodeGit.Error.CODE.PASSTHROUGH; + }); + }, + check: function(source) { + return source.repo() + .then(function() { + return NodeGit.Error.CODE.OK; + }); + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + }) + .then(function() { + var readmeContent = fse.readFileSync( + packageJsonPath, + "utf-8" + ); + assert.notStrictEqual(readmeContent, message); + + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout" + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }); + }); + }); }); From e749e9063389cae9d98aaebf17660cdf941c7894 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 4 Mar 2019 08:47:16 -0700 Subject: [PATCH 081/545] Use more aggressive garbage collect routine in filter suite --- test/tests/filter.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/test/tests/filter.js b/test/tests/filter.js index e31ecd4b5..62aa4e863 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -2,6 +2,7 @@ var assert = require("assert"); var fse = require("fs-extra"); var path = require("path"); var local = path.join.bind(path, __dirname); +var garbageCollect = require("../utils/garbage_collect.js"); describe("Filter", function() { var NodeGit = require("../../"); @@ -216,7 +217,7 @@ describe("Filter", function() { }, 0) .then(function(result) { assert.strictEqual(result, NodeGit.Error.CODE.OK); - global.gc(); + garbageCollect(); return fse.writeFile( packageJsonPath, @@ -338,7 +339,8 @@ describe("Filter", function() { return Checkout.head(test.repository, opts); }) .then(function() { - global.gc(); + garbageCollect(); + return Registry.unregister(filterName); }) .then(function(result) { @@ -637,7 +639,7 @@ describe("Filter", function() { ); assert.notStrictEqual(readmeContent, message); fse.writeFileSync(readmePath, "whoa", "utf8"); - global.gc(); + garbageCollect(); var opts = { checkoutStrategy: Checkout.STRATEGY.FORCE, @@ -725,7 +727,7 @@ describe("Filter", function() { cleanup: function() {} }, 0) .then(function(result) { - global.gc(); + garbageCollect(); assert.strictEqual(result, NodeGit.Error.CODE.OK); }) .then(function() { @@ -742,7 +744,7 @@ describe("Filter", function() { ); }) .then(function(oid) { - global.gc(); + garbageCollect(); return test.repository.getHeadCommit(); }) .then(function(commit) { @@ -755,7 +757,7 @@ describe("Filter", function() { postInitializeReadmeContents, "testing commit contents" ); assert.strictEqual(commit.message(), "test commit"); - global.gc(); + garbageCollect(); return commit.getEntry("README.md"); }) @@ -842,7 +844,7 @@ describe("Filter", function() { ); assert.notEqual(packageContent, ""); - global.gc(); + garbageCollect(); return fse.writeFile( packageJsonPath, "Changing content to trigger checkout", @@ -1131,6 +1133,9 @@ describe("Filter", function() { paths: "package.json" }; return Checkout.head(test.repository, opts); + }) + .then(function() { + garbageCollect(); }); }); }); From e1df73650a72decc5244a58cc5c2c1c39aa2142d Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 4 Mar 2019 09:51:46 -0700 Subject: [PATCH 082/545] Output the item that was deprecated when giving deprecation notice --- lib/error.js | 3 ++- lib/index.js | 12 ++++++++---- lib/object.js | 2 +- lib/reference.js | 7 ++++--- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/error.js b/lib/error.js index 9d1ecacb9..819299681 100644 --- a/lib/error.js +++ b/lib/error.js @@ -10,7 +10,8 @@ Object.keys(NodeGit.Error.CODE).forEach((key) => { Object.defineProperty(NodeGit.Error.CODE, `GITERR_${key}`, { get: util.deprecate( () => NodeGit.Error.CODE[key], - `Use NodeGit.Error.CODE.${key} instead.` + `Use NodeGit.Error.CODE.${key} instead of ` + + `NodeGit.Error.CODE.GETERR_${key}.` ) }); }); diff --git a/lib/index.js b/lib/index.js index 3426b1030..ad37cea78 100644 --- a/lib/index.js +++ b/lib/index.js @@ -41,7 +41,8 @@ Object.keys(NodeGit.Index.CAPABILITY).forEach((key) => { Object.defineProperty(NodeGit.Index.CAP, key, { get: util.deprecate( () => NodeGit.Index.CAPABILITY[key], - `Use NodeGit.Index.CAPABILITY.${key} instead.` + `Use NodeGit.Index.CAPABILITY.${key} instead of ` + + `NodeGit.Index.CAP.${key}.` ) }); }); @@ -50,13 +51,15 @@ NodeGit.Enums.INDXENTRY_FLAG = {}; Object.defineProperty(NodeGit.Enums.INDXENTRY_FLAG, "IDXENTRY_EXTENDED", { get: util.deprecate( () => NodeGit.Index.ENTRY_FLAG.ENTRY_EXTENDED, - "Use NodeGit.Index.ENTRY_FLAG.ENTRY_EXTENDED instead." + "Use NodeGit.Index.ENTRY_FLAG.ENTRY_EXTENDED instead of " + + "NodeGit.Enums.INDXENTRY_FLAG.IDXENTRY_EXTENDED." ) }); Object.defineProperty(NodeGit.Enums.INDXENTRY_FLAG, "IDXENTRY_VALID", { get: util.deprecate( () => NodeGit.Index.ENTRY_FLAG.ENTRY_VALID, - "Use NodeGit.Index.ENTRY_FLAG.ENTRY_VALID instead." + "Use NodeGit.Index.ENTRY_FLAG.ENTRY_VALID instead of " + + "NodeGit.Enums.INDXENTRY_FLAG.IDXENTRY_VALID." ) }); @@ -72,7 +75,8 @@ Object.keys(EXTENDED_FLAGS_MAP).forEach((key) => { Object.defineProperty(NodeGit.Enums.IDXENTRY_EXTENDED_FLAG, key, { get: util.deprecate( () => NodeGit.Index.ENTRY_EXTENDED_FLAG[newKey], - `Use NodeGit.Index.ENTRY_EXTENDED_FLAG.${newKey} instead.` + `Use NodeGit.Index.ENTRY_EXTENDED_FLAG.${newKey} instead of ` + + `NodeGit.Enums.IDXENTRY_EXTENDED_FLAG.${key}.` ) }); }); diff --git a/lib/object.js b/lib/object.js index 8e65660d9..680aebd12 100644 --- a/lib/object.js +++ b/lib/object.js @@ -40,6 +40,6 @@ Obj.prototype.isTree = function() { Object.defineProperty(Obj.TYPE, "BAD", { get: util.deprecate( () => Obj.TYPE.INVALID, - "Use NodeGit.Object.TYPE.INVALID instead." + "Use NodeGit.Object.TYPE.INVALID instead of NodeGit.Object.TYPE.BAD." ) }); diff --git a/lib/reference.js b/lib/reference.js index af859c3cc..af3e00621 100644 --- a/lib/reference.js +++ b/lib/reference.js @@ -190,14 +190,14 @@ Reference.updateTerminal = function ( Object.defineProperty(NodeGit.Reference.TYPE, "OID", { get: util.deprecate( () => NodeGit.Reference.TYPE.DIRECT, - "Use NodeGit.Reference.TYPE.DIRECT instead." + "Use NodeGit.Reference.TYPE.DIRECT instead of NodeGit.Reference.TYPE.OID." ) }); Object.defineProperty(NodeGit.Reference.TYPE, "LISTALL", { get: util.deprecate( () => NodeGit.Reference.TYPE.ALL, - "Use NodeGit.Reference.TYPE.ALL instead." + "Use NodeGit.Reference.TYPE.ALL instead of NodeGit.Reference.TYPE.LISTALL." ) }); @@ -206,7 +206,8 @@ Object.keys(NodeGit.Reference.FORMAT).forEach((key) => { Object.defineProperty(NodeGit.Reference.NORMALIZE, `REF_FORMAT_${key}`, { get: util.deprecate( () => NodeGit.Reference.FORMAT[key], - `Use NodeGit.Reference.FORMAT.${key} instead.` + `Use NodeGit.Reference.FORMAT.${key} instead of ` + + `NodeGit.Reference.NORMALIZE.REF_FORMAT_${key}.` ) }); }); From e3c95e14e169c94d139ff27110b06a407354f42d Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Thu, 21 Feb 2019 10:30:22 -0700 Subject: [PATCH 083/545] If npm -v fails, we should assume we're in yarn and do nothing --- lifecycleScripts/preinstall.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lifecycleScripts/preinstall.js b/lifecycleScripts/preinstall.js index 6d481658b..870cf1558 100644 --- a/lifecycleScripts/preinstall.js +++ b/lifecycleScripts/preinstall.js @@ -8,14 +8,22 @@ module.exports = function prepareForBuild() { console.log("[nodegit] Running pre-install script"); return exec("npm -v") - .then(function(npmVersion) { - if (npmVersion.split(".")[0] < 3) { - console.log("[nodegit] npm@2 installed, pre-loading required packages"); - return exec("npm install --ignore-scripts"); - } + .then( + function(npmVersion) { + if (npmVersion.split(".")[0] < 3) { + console.log( + "[nodegit] npm@2 installed, pre-loading required packages" + ); + return exec("npm install --ignore-scripts"); + } - return Promise.resolve(); - }) + return Promise.resolve(); + }, + function() { + // We're installing via yarn, so don't + // care about compability with npm@2 + } + ) .then(function() { if (buildFlags.isGitRepo) { var submodules = require(local("submodules")); From 7851e931a54ca487fb6556ab8713c94ac1719efb Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Mon, 4 Mar 2019 12:38:20 -0700 Subject: [PATCH 084/545] Bump to v0.25.0-alpha.9 --- CHANGELOG.md | 18 ++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b57446911..00c78c1b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Change Log +## v0.25.0-alpha.9 [(2019-03-04)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.9) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.8...v0.25.0-alpha.9) + +#### Summary of changes +- Removed access to the diff_so_far param in git_diff_notify_cb and git_diff_progress_cb +- Changed FilterSource.prototype.repo to async to prevent segfaults on filters that run during Submodule.status +- Clean up deprecation messages to inform users of what was deprecated, not just what users should switch to +- When installing on a machine that has yarn and does not have npm, the preinstall script should succeed now +- ceiling_dirs is now an optional parameter to Repository.discover + +#### Merged PRs into NodeGit +- [Clean up some dangerous memory accesses in callbacks #1642](https://github.com/nodegit/nodegit/pull/1642) +- [Output the item that was deprecated when giving deprecation notice #1643](https://github.com/nodegit/nodegit/pull/1643) +- [Don't fail yarn installs when we can't find npm #1644](https://github.com/nodegit/nodegit/pull/1644) +- [`ceiling_dirs` parameter in `Repository.discover` is optional #1245](https://github.com/nodegit/nodegit/pull/1245) + + ## v0.25.0-alpha.8 [(2019-02-27)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.8) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.7...v0.25.0-alpha.8) diff --git a/package-lock.json b/package-lock.json index f498d4a9e..04dff435c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.8", + "version": "0.25.0-alpha.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d6afd5290..f523fdae1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.8", + "version": "0.25.0-alpha.9", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 6adcf4339fff222fa638bdee98b05be49d6be22f Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 18 Mar 2019 10:56:13 -0700 Subject: [PATCH 085/545] Bump CI to start using Xenial over Trusty Trusty is EOL in April. We will want to phase out trusty support before then --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2b2add2f6..5a80a97e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ sudo: false -# update to Xenial in April 2019; Trusty will be EOL, Xenial new minimum supported OS version -dist: trusty +dist: xenial branches: only: From 3bace9d1d2303a91cde24a26cfbf0b6c42225634 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 18 Mar 2019 10:57:42 -0700 Subject: [PATCH 086/545] Stop building for node 6 Node 6 is EOL in April 2019 --- .travis.yml | 1 - appveyor.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5a80a97e3..682ca1cf9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,6 @@ env: node_js: - "10" - "8" - - "6" os: - linux diff --git a/appveyor.yml b/appveyor.yml index 368e911e8..46fc6a1b5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,6 @@ environment: # Node.js - nodejs_version: "10" - nodejs_version: "8" - - nodejs_version: "6" matrix: fast_finish: true From a929d38364de3dfe4284b0f83e2fc00dd30d00a7 Mon Sep 17 00:00:00 2001 From: Remy Suen Date: Tue, 9 Apr 2019 20:45:55 -0400 Subject: [PATCH 087/545] Ensures that commits from parent(*) has a repository Commit has functions that requires a reference to a repository to run. Because parent(*) was simply calling out to libgit2's git_commit_parent directly, its repo field was not being set. Creating a wrapper in the Commit class and assigning a repository to the object before returning it will fix this problem. Signed-off-by: Remy Suen --- lib/commit.js | 16 ++++++++++++++++ test/tests/commit.js | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/commit.js b/lib/commit.js index 701b944e0..033ecdfa1 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -5,6 +5,7 @@ var Commit = NodeGit.Commit; var LookupWrapper = NodeGit.Utils.lookupWrapper; var _amend = Commit.prototype.amend; +var _parent = Commit.prototype.parent; /** * Retrieves the commit pointed to by the oid @@ -394,6 +395,21 @@ Commit.prototype.history = function() { return event; }; +/** + * Get the specified parent of the commit. + * + * @param {number} the position of the parent, starting from 0 + * @async + * @return {Commit} the parent commit at the specified position + */ +Commit.prototype.parent = function (id) { + var repository = this.repo; + return _parent.call(this, id).then(function(parent) { + parent.repo = repository; + return parent; + }); +}; + /** * Retrieve the commit's parent shas. * diff --git a/test/tests/commit.js b/test/tests/commit.js index 8104624c2..237471923 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -128,6 +128,18 @@ describe("Commit", function() { assert.equal(this.commit.timeOffset(), 780); }); + it("can call getTree on a parent commit", function() { + return this.commit.parent(0) + .then(function(parent) { + return parent.getTree(); + }) + .then(function(tree) { + assert.equal( + tree.id().toString(), "327ff68e59f94f0c25d2c62fb0938efa01e8a107" + ); + }); + }); + it("can create a commit", function() { var test = this; var expectedCommitId = "315e77328ef596f3bc065d8ac6dd2c72c09de8a5"; From d023d581cd702b43c83347c5f4e2efc65888b628 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 17 Apr 2019 08:58:28 -0700 Subject: [PATCH 088/545] Update openssl conan distributions Looks like the bintray URL format has changed, update to match new format. --- .../static_config/openssl_distributions.json | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/vendor/static_config/openssl_distributions.json b/vendor/static_config/openssl_distributions.json index f00384dd9..d42ecae15 100644 --- a/vendor/static_config/openssl_distributions.json +++ b/vendor/static_config/openssl_distributions.json @@ -1,18 +1,18 @@ { - "macOS-clang-8.1-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/bd3cca94af79c6a2c35b664c43f643582a13a9f2/conan_package.tgz", - "macOS-clang-8.1-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/0197c20e330042c026560da838f5b4c4bf094b8a/conan_package.tgz", - "macOS-clang-9-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/85d674b0f6705cafe6b2edb8689ffbe0f3c2e60b/conan_package.tgz", - "macOS-clang-9-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/227fb0ea22f4797212e72ba94ea89c7b3fbc2a0c/conan_package.tgz", - "win32-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/39d6fe009a278f733e97b59a4f9536bfc4e8f366/conan_package.tgz", - "win32-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/d16d8a16b4cef0046922b8d83d567689d36149d0/conan_package.tgz", - "win32-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/889fd4ea9ba89fd6dc7fa32e2f45bd9804b85481/conan_package.tgz", - "win32-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/253958a6ce15f1c9325eeea33ffc0a5cfc29212a/conan_package.tgz", - "win32-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/05f648ec4d066b206769d6314e859fdd97a18f8d/conan_package.tgz", - "win32-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/a075e3ffc3590d6a920a26b4218b20253dd68d57/conan_package.tgz", - "win64-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/6bc3be0f39fdc624b24ba9bb00e8af55928d74e7/conan_package.tgz", - "win64-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/e942631065059eabe964ca471ad35bb453c15b31/conan_package.tgz", - "win64-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/867ca54360ed234a8bc9a6aa63806599ea29b38e/conan_package.tgz", - "win64-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/c4aef4edbc33205e0cf9b55bfb116b38c90ec132/conan_package.tgz", - "win64-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/0bd0c413b56aaec57c0f222a89b4e565a6729027/conan_package.tgz", - "win64-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/fce9be1511a149a4af36b5997f7e611ab83b2f58/conan_package.tgz" -} \ No newline at end of file + "macOS-clang-8.1-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/bd3cca94af79c6a2c35b664c43f643582a13a9f2/0/conan_package.tgz", + "macOS-clang-8.1-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/0197c20e330042c026560da838f5b4c4bf094b8a/0/conan_package.tgz", + "macOS-clang-9-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/85d674b0f6705cafe6b2edb8689ffbe0f3c2e60b/0/conan_package.tgz", + "macOS-clang-9-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/227fb0ea22f4797212e72ba94ea89c7b3fbc2a0c/0/conan_package.tgz", + "win32-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/39d6fe009a278f733e97b59a4f9536bfc4e8f366/0/conan_package.tgz", + "win32-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/d16d8a16b4cef0046922b8d83d567689d36149d0/0/conan_package.tgz", + "win32-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/889fd4ea9ba89fd6dc7fa32e2f45bd9804b85481/0/conan_package.tgz", + "win32-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/253958a6ce15f1c9325eeea33ffc0a5cfc29212a/0/conan_package.tgz", + "win32-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/05f648ec4d066b206769d6314e859fdd97a18f8d/0/conan_package.tgz", + "win32-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/a075e3ffc3590d6a920a26b4218b20253dd68d57/0/conan_package.tgz", + "win64-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/6bc3be0f39fdc624b24ba9bb00e8af55928d74e7/0/conan_package.tgz", + "win64-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/e942631065059eabe964ca471ad35bb453c15b31/0/conan_package.tgz", + "win64-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/867ca54360ed234a8bc9a6aa63806599ea29b38e/0/conan_package.tgz", + "win64-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/c4aef4edbc33205e0cf9b55bfb116b38c90ec132/0/conan_package.tgz", + "win64-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/0bd0c413b56aaec57c0f222a89b4e565a6729027/0/conan_package.tgz", + "win64-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/fce9be1511a149a4af36b5997f7e611ab83b2f58/0/conan_package.tgz" +} From 7548684f193af1b1878c16f98cb464a3c74a016c Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 17 Apr 2019 09:29:29 -0700 Subject: [PATCH 089/545] Support signing in Repository#mergeBranches --- lib/repository.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index 22f10668f..f7ad2de5b 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -1686,6 +1686,7 @@ Repository.prototype.refreshIndex = function(callback) { * @param {Signature} signature * @param {Merge.PREFERENCE} mergePreference * @param {MergeOptions} mergeOptions + * @param {MergeBranchOptions} mergeBranchOptions * @return {Oid|Index} A commit id for a succesful merge or an index for a * merge with conflicts */ @@ -1695,13 +1696,19 @@ Repository.prototype.mergeBranches = function( signature, mergePreference, mergeOptions, - processMergeMessageCallback + mergeBranchOptions ) { const repo = this; let fromBranch; let toBranch; - processMergeMessageCallback = processMergeMessageCallback || + // Support old parameter `processMergeMessageCallback` + const isOldOptionParameter = typeof mergeBranchOptions === "function"; + const processMergeMessageCallback = mergeBranchOptions && + (isOldOptionParameter ? + mergeBranchOptions : + mergeBranchOptions.processMergeMessageCallback) || function (message) { return message; }; + const signingCallback = mergeBranchOptions && mergeBranchOptions.signingCb; mergePreference = mergePreference || NodeGit.Merge.PREFERENCE.NONE; mergeOptions = normalizeOptions(mergeOptions, NodeGit.MergeOptions); @@ -1819,6 +1826,17 @@ Repository.prototype.mergeBranches = function( return Promise.all([oid, processMergeMessageCallback(message)]); }) .then(([oid, message]) => { + if (signingCallback) { + return repo.createCommitWithSignature( + toBranch.name(), + signature, + signature, + message, + oid, + [toCommitOid, fromCommitOid], + signingCallback + ); + } return repo.createCommit( toBranch.name(), signature, From 4259208f653abfc48e4cad8581fbc9f5ee35e196 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 17 Apr 2019 15:23:07 -0700 Subject: [PATCH 090/545] Add deprecation warning for Repository#mergeBranches parameter --- lib/repository.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/repository.js b/lib/repository.js index f7ad2de5b..f311900eb 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -1703,6 +1703,10 @@ Repository.prototype.mergeBranches = function( let toBranch; // Support old parameter `processMergeMessageCallback` const isOldOptionParameter = typeof mergeBranchOptions === "function"; + if (isOldOptionParameter) { + console.error("DeprecationWarning: Repository#mergeBranches parameter " + + "processMergeMessageCallback, use MergeBranchOptions"); + } const processMergeMessageCallback = mergeBranchOptions && (isOldOptionParameter ? mergeBranchOptions : From 17aca8c2cb4983288c925dff278d8a9b3e86178e Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 17 Apr 2019 15:23:42 -0700 Subject: [PATCH 091/545] Don't use newly deprecated parameter in tests --- test/tests/merge.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/test/tests/merge.js b/test/tests/merge.js index 80bb0589d..00387da82 100644 --- a/test/tests/merge.js +++ b/test/tests/merge.js @@ -646,9 +646,11 @@ describe("Merge", function() { ourSignature, NodeGit.Merge.PREFERENCE.NO_FASTFORWARD, null, - function(message) { - assert(message === "Merge branch 'theirs' into ours"); - return "We manipulated the message, HAH."; + { + processMergeMessageCallback: function(message) { + assert(message === "Merge branch 'theirs' into ours"); + return "We manipulated the message, HAH."; + } } ); }) @@ -803,9 +805,11 @@ describe("Merge", function() { ourSignature, NodeGit.Merge.PREFERENCE.NO_FASTFORWARD, null, - function(message) { - assert(message === "Merge branch 'theirs' into ours"); - return Promise.resolve("We manipulated the message, HAH."); + { + processMergeMessageCallback: function(message) { + assert(message === "Merge branch 'theirs' into ours"); + return Promise.resolve("We manipulated the message, HAH."); + } } ); }) From 99cca732b8e704ab5e768ad42d6eb7b80b141ca5 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 23 Oct 2018 11:28:20 -0700 Subject: [PATCH 092/545] getRemotes should return the remote objects. getRemotes has been renamed to getRemotes and getRemotes is now a method that returns the remotes for a repository --- generate/input/descriptor.json | 10 +- generate/input/libgit2-supplement.json | 28 ++++ .../manual/repository/get_remotes.cc | 134 ++++++++++++++++++ lib/repository.js | 4 +- test/tests/remote.js | 2 +- test/tests/repository.js | 2 +- 6 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 generate/templates/manual/repository/get_remotes.cc diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 2909115b6..e846c62e6 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1504,6 +1504,7 @@ } }, "dependencies": [ + "../include/git_buf_converter.h", "../include/filter_registry.h" ] }, @@ -3241,7 +3242,9 @@ "selfFreeing": true, "isSingleton": true, "dependencies": [ - "git2/sys/repository.h" + "git2/sys/repository.h", + "../include/submodule.h", + "../include/remote.h" ], "functions": { "git_repository_config": { @@ -4220,7 +4223,10 @@ "git_worktree_prune_init_options": { "ignore": true } - } + }, + "dependencies": [ + "../include/git_buf_converter.h" + ] }, "writestream": { "cType": "git_writestream", diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 7b19afba9..a40107397 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -260,6 +260,28 @@ "isErrorCode": true } }, + "git_repository_get_remotes": { + "args": [ + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/get_remotes.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_reset": { "type": "function", "file": "reset.h", @@ -530,6 +552,12 @@ "git_remote_reference_list" ] ], + [ + "repository", + [ + "git_repository_get_remotes" + ] + ], [ "revwalk", [ diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc new file mode 100644 index 000000000..e16f1131c --- /dev/null +++ b/generate/templates/manual/repository/get_remotes.cc @@ -0,0 +1,134 @@ +NAN_METHOD(GitRepository::GetRemotes) +{ + if (info.Length() == 0 || !info[0]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetRemotesBaton* baton = new GetRemotesBaton; + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = new std::vector; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + GetRemotesWorker *worker = new GetRemotesWorker(baton, callback); + worker->SaveToPersistent("repo", info.This()); + Nan::AsyncQueueWorker(worker); + return; +} + +void GitRepository::GetRemotesWorker::Execute() +{ + giterr_clear(); + + git_repository *repo; + { + LockMaster lockMaster(true, baton->repo); + baton->error_code = git_repository_open(&repo, git_repository_workdir(baton->repo)); + } + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete baton->out; + baton->out = NULL; + return; + } + + git_strarray remote_names; + baton->error_code = git_remote_list(&remote_names, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete baton->out; + baton->out = NULL; + return; + } + + for (size_t remote_index = 0; remote_index < remote_names.count; ++remote_index) { + git_remote *remote; + baton->error_code = git_remote_lookup(&remote, repo, remote_names.strings[remote_index]); + + // stop execution and return if there is an error + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + // unwind and return + while (baton->out->size()) { + git_remote *remoteToFree = baton->out->back(); + baton->out->pop_back(); + git_remote_free(remoteToFree); + } + + git_strarray_free(&remote_names); + git_repository_free(repo); + delete baton->out; + baton->out = NULL; + return; + } + + baton->out->push_back(remote); + } +} + +void GitRepository::GetRemotesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + git_remote *remote = baton->out->at(i); + Nan::Set( + result, + Nan::New(i), + GitRemote::New( + remote, + true, + GitRepository::New(git_remote_owner(remote), true)->ToObject() + ) + ); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::Error("Repository refreshRemotes has thrown an error.")->ToObject(); + err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshRemotes").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } +} diff --git a/lib/repository.js b/lib/repository.js index f311900eb..0e8427c95 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -1068,7 +1068,7 @@ Repository.prototype.fetchAll = function( var certificateCheck = remoteCallbacks.certificateCheck; var transferProgress = remoteCallbacks.transferProgress; - return repo.getRemotes() + return repo.getRemoteNames() .then(function(remotes) { return remotes.reduce(function(fetchPromise, remote) { var wrappedFetchOptions = shallowClone(fetchOptions); @@ -1328,7 +1328,7 @@ Repository.prototype.getRemote = function(remote, callback) { * @param {Function} Optional callback * @return {Object} Promise object. */ -Repository.prototype.getRemotes = function(callback) { +Repository.prototype.getRemoteNames = function(callback) { return Remote.list(this).then(function(remotes) { if (typeof callback === "function") { callback(null, remotes); diff --git a/test/tests/remote.js b/test/tests/remote.js index 27611dd15..0aa502619 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -19,7 +19,7 @@ describe("Remote", function() { var privateUrl = "git@github.com:nodegit/private"; function removeNonOrigins(repo) { - return repo.getRemotes() + return repo.getRemoteNames() .then(function(remotes) { return remotes.reduce(function(promise, remote) { if (remote !== "origin") { diff --git a/test/tests/repository.js b/test/tests/repository.js index bcdfc2c3f..bce03a6cb 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -95,7 +95,7 @@ describe("Repository", function() { }); it("can list remotes", function() { - return this.repository.getRemotes() + return this.repository.getRemoteNames() .then(function(remotes) { assert.equal(remotes.length, 1); assert.equal(remotes[0], "origin"); From adcc5c520aae1a3351d9c463ee0ae7a207e666d1 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Tue, 23 Oct 2018 11:29:50 -0700 Subject: [PATCH 093/545] Move getReferences to C++ --- generate/input/libgit2-supplement.json | 23 +++ .../manual/repository/get_references.cc | 133 ++++++++++++++++++ lib/repository.js | 53 ++----- 3 files changed, 170 insertions(+), 39 deletions(-) create mode 100644 generate/templates/manual/repository/get_references.cc diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index a40107397..f9da58340 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -260,6 +260,28 @@ "isErrorCode": true } }, + "git_repository_get_references": { + "args": [ + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/get_references.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_repository_get_remotes": { "args": [ { @@ -555,6 +577,7 @@ [ "repository", [ + "git_repository_get_references", "git_repository_get_remotes" ] ], diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc new file mode 100644 index 000000000..d0e4fd987 --- /dev/null +++ b/generate/templates/manual/repository/get_references.cc @@ -0,0 +1,133 @@ +NAN_METHOD(GitRepository::GetReferences) +{ + if (info.Length() == 0 || !info[0]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetReferencesBaton* baton = new GetReferencesBaton; + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = new std::vector; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + GetReferencesWorker *worker = new GetReferencesWorker(baton, callback); + worker->SaveToPersistent("repo", info.This()); + Nan::AsyncQueueWorker(worker); + return; +} + +void GitRepository::GetReferencesWorker::Execute() +{ + giterr_clear(); + + LockMaster lockMaster(true, baton->repo); + git_repository *repo = baton->repo; + + git_strarray reference_names; + baton->error_code = git_reference_list(&reference_names, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete baton->out; + baton->out = NULL; + return; + } + + for (size_t reference_index = 0; reference_index < reference_names.count; ++reference_index) { + git_reference *reference; + baton->error_code = git_reference_lookup(&reference, repo, reference_names.strings[reference_index]); + + // stop execution and return if there is an error + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + // unwind and return + while (baton->out->size()) { + git_reference *referenceToFree = baton->out->back(); + baton->out->pop_back(); + git_reference_free(referenceToFree); + } + + git_strarray_free(&reference_names); + git_repository_free(repo); + delete baton->out; + baton->out = NULL; + return; + } + + if (git_reference_type(reference) == GIT_REF_SYMBOLIC) { + git_reference *resolved_reference; + int resolve_result = git_reference_resolve(&resolved_reference, reference); + git_reference_free(reference); + + // if we can't resolve the ref, then just ignore it + if (resolve_result == GIT_OK) { + baton->out->push_back(resolved_reference); + } + } else { + baton->out->push_back(reference); + } + } +} + +void GitRepository::GetReferencesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + git_reference *reference = baton->out->at(i); + Nan::Set( + result, + Nan::New(i), + GitRefs::New( + reference, + true, + GitRepository::New(git_reference_owner(reference), true)->ToObject() + ) + ); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::Error("Repository getReferences has thrown an error.")->ToObject(); + err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getReferences").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } +} diff --git a/lib/repository.js b/lib/repository.js index 0e8427c95..cdbad7054 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -24,6 +24,7 @@ var TreeBuilder = NodeGit.Treebuilder; var _discover = Repository.discover; var _initExt = Repository.initExt; var _fetchheadForeach = Repository.prototype.fetchheadForeach; +var _getReferences = Repository.prototype.getReferences; var _mergeheadForeach = Repository.prototype.mergeheadForeach; function applySelectedLinesToTarget @@ -349,44 +350,21 @@ Repository.initExt = function(repo_path, opts) { }; -Repository.getReferences = function(repo, type, refNamesOnly, callback) { - return Reference.list(repo).then(function(refList) { - var refFilterPromises = []; - var filteredRefs = []; - - refList.forEach(function(refName) { - refFilterPromises.push(Reference.lookup(repo, refName) - .then(function(ref) { - if (type == Reference.TYPE.LISTALL || ref.type() == type) { - if (refNamesOnly) { - filteredRefs.push(refName); - return; - } - - if (ref.isSymbolic()) { - return ref.resolve().then(function(resolvedRef) { - resolvedRef.repo = repo; - - filteredRefs.push(resolvedRef); - }) - .catch(function() { - // If we can't resolve the ref then just ignore it. - }); - } - else { - filteredRefs.push(ref); - } - } - }) - ); +Repository.getReferences = function(repo, type, refNamesOnly) { + return repo.getReferences().then(function(refList) { + var filteredRefList = refList; + + filteredRefList.filter(function(reference) { + return type == Reference.TYPE.LISTALL || ref.type === type }); - return Promise.all(refFilterPromises).then(function() { - if (typeof callback === "function") { - callback(null, filteredRefs); - } - return filteredRefs; - }, callback); + if (refNamesOnly) { + filteredRefList.map(function(reference) { + return reference.name(); + }); + } + + return filteredRefList; }); }; @@ -1289,9 +1267,6 @@ Repository.prototype.getReferenceNames = function(type, callback) { * @param {Reference.TYPE} type Type of reference to look up * @return {Array} */ -Repository.prototype.getReferences = function(type, callback) { - return Repository.getReferences(this, type, false, callback); -}; /** * Gets a remote from the repo From ac46386ab0c6e56607ccfbba95e40549169604b2 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 17 Apr 2019 14:07:28 -0700 Subject: [PATCH 094/545] add repository getSubmodules in C++ --- generate/input/libgit2-supplement.json | 23 ++++ .../manual/repository/get_submodules.cc | 115 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 generate/templates/manual/repository/get_submodules.cc diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index f9da58340..ca4a3c3f6 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -282,6 +282,28 @@ "isErrorCode": true } }, + "git_repository_get_submodules": { + "args": [ + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/get_submodules.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_repository_get_remotes": { "args": [ { @@ -578,6 +600,7 @@ "repository", [ "git_repository_get_references", + "git_repository_get_submodules", "git_repository_get_remotes" ] ], diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc new file mode 100644 index 000000000..d51d0a0fd --- /dev/null +++ b/generate/templates/manual/repository/get_submodules.cc @@ -0,0 +1,115 @@ +NAN_METHOD(GitRepository::GetSubmodules) +{ + if (info.Length() == 0 || !info[0]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetSubmodulesBaton* baton = new GetSubmodulesBaton; + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = new std::vector; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + GetSubmodulesWorker *worker = new GetSubmodulesWorker(baton, callback); + worker->SaveToPersistent("repo", info.This()); + Nan::AsyncQueueWorker(worker); + return; +} + +struct submodule_foreach_payload { + git_repository *repo; + std::vector *out; +}; + +int foreachSubmoduleCB(git_submodule *submodule, const char *name, void *void_payload) { + submodule_foreach_payload *payload = (submodule_foreach_payload *)void_payload; + git_submodule *out; + + int result = git_submodule_lookup(&out, payload->repo, name); + if (result == GIT_OK) { + payload->out->push_back(out); + } + + return result; +} + +void GitRepository::GetSubmodulesWorker::Execute() +{ + giterr_clear(); + + LockMaster lockMaster(true, baton->repo); + + submodule_foreach_payload payload { baton->repo, baton->out }; + baton->error_code = git_submodule_foreach(baton->repo, foreachSubmoduleCB, (void *)&payload); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + while (baton->out->size()) { + git_submodule_free(baton->out->back()); + baton->out->pop_back(); + } + delete baton->out; + baton->out = NULL; + } +} + +void GitRepository::GetSubmodulesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + git_submodule *submodule = baton->out->at(i); + Nan::Set( + result, + Nan::New(i), + GitSubmodule::New( + submodule, + true, + GitRepository::New(git_submodule_owner(submodule), true)->ToObject() + ) + ); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::Error("Repository getSubmodules has thrown an error.")->ToObject(); + err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getSubmodules").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } +} From 9be9da2dd4707e9a3abed53064a25d0f2daeae73 Mon Sep 17 00:00:00 2001 From: Tyler Wanek Date: Wed, 24 Oct 2018 11:55:43 -0700 Subject: [PATCH 095/545] Add commit walk in C++ --- generate/input/libgit2-supplement.json | 27 ++++ .../templates/manual/revwalk/commit_walk.cc | 123 ++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 generate/templates/manual/revwalk/commit_walk.cc diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index ca4a3c3f6..69a4717e6 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -352,6 +352,32 @@ }, "group": "reset" }, + "git_revwalk_commit_walk": { + "args": [ + { + "name": "max_count", + "type": "int" + }, + { + "name": "out", + "type": "std::vector *" + }, + { + "name": "walk", + "type": "git_revwalk *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/revwalk/commit_walk.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "revwalk", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_revwalk_fast_walk": { "args": [ { @@ -607,6 +633,7 @@ [ "revwalk", [ + "git_revwalk_commit_walk", "git_revwalk_fast_walk", "git_revwalk_file_history_walk" ] diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc new file mode 100644 index 000000000..af0ff112a --- /dev/null +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -0,0 +1,123 @@ +NAN_METHOD(GitRevwalk::CommitWalk) { + if (info.Length() == 0 || !info[0]->IsNumber()) { + return Nan::ThrowError("Max count is required and must be a number."); + } + + if (info.Length() == 1 || !info[1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + CommitWalkBaton* baton = new CommitWalkBaton; + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->max_count = Nan::To(info[0]).FromJust(); + baton->out = new std::vector; + baton->out->reserve(baton->max_count); + baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); + CommitWalkWorker *worker = new CommitWalkWorker(baton, callback); + worker->SaveToPersistent("fastWalk", info.This()); + + Nan::AsyncQueueWorker(worker); + return; +} + +void GitRevwalk::CommitWalkWorker::Execute() { + giterr_clear(); + + for (int i = 0; i < baton->max_count; i++) { + git_oid next_commit_id; + baton->error_code = git_revwalk_next(&next_commit_id, baton->walk); + + if (baton->error_code == GIT_ITEROVER) { + baton->error_code = GIT_OK; + return; + } + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + while (baton->out->size()) { + git_commit_free(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + baton->out = NULL; + + return; + } + + git_commit *commit; + baton->error_code = git_commit_lookup(&commit, git_revwalk_repository(baton->walk), &next_commit_id); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + + while (baton->out->size()) { + git_commit_free(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + baton->out = NULL; + + return; + } + + baton->out->push_back(commit); + } +} + +void GitRevwalk::CommitWalkWorker::HandleOKCallback() { + if (baton->out != NULL) { + unsigned int size = baton->out->size(); + Local result = Nan::New(size); + for (unsigned int i = 0; i < size; i++) { + git_commit *commit = baton->out->at(i); + Nan::Set( + result, + Nan::New(i), + GitCommit::New( + commit, + true, + GitRepository::New(git_commit_owner(commit), true)->ToObject() + ) + ); + } + + delete baton->out; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } else if (baton->error) { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } else if (baton->error_code < 0) { + Local err = Nan::Error("Revwalk commitWalk has thrown an error.")->ToObject(); + err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.commitWalk").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } else { + callback->Call(0, NULL, async_resource); + } +} From 4e039f589ecc41237207be1a3344fb0badb3a116 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 20 Dec 2018 13:56:36 -0700 Subject: [PATCH 096/545] Add refreshReferences for bulk lookup of critical references. --- generate/input/libgit2-supplement.json | 25 +- .../manual/repository/refresh_references.cc | 532 ++++++++++++++++++ 2 files changed, 556 insertions(+), 1 deletion(-) create mode 100644 generate/templates/manual/repository/refresh_references.cc diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 69a4717e6..42d9260b2 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -326,6 +326,28 @@ "isErrorCode": true } }, + "git_repository_refresh_references": { + "args": [ + { + "name": "out", + "type": "void *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/refresh_references.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_reset": { "type": "function", "file": "reset.h", @@ -627,7 +649,8 @@ [ "git_repository_get_references", "git_repository_get_submodules", - "git_repository_get_remotes" + "git_repository_get_remotes", + "git_repository_refresh_references" ] ], [ diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc new file mode 100644 index 000000000..2ee4c027d --- /dev/null +++ b/generate/templates/manual/repository/refresh_references.cc @@ -0,0 +1,532 @@ +int getOidOfReferenceCommit(git_oid *commitOid, git_reference *ref) { + git_object *commitObject; + int result = git_reference_peel(&commitObject, ref, GIT_OBJ_COMMIT); + + if (result != GIT_OK) { + return result; + } + + git_oid_cpy(commitOid, git_object_id(commitObject)); + git_object_free(commitObject); + return result; +} + +int asDirectReference(git_reference **out, git_reference *ref) { + if (git_reference_type(ref) != GIT_REF_SYMBOLIC) { + return git_reference_dup(out, ref); + } + + return git_reference_resolve(out, ref); +} + +int lookupDirectReferenceByShorthand(git_reference **out, git_repository *repo, const char *shorthand) { + git_reference *ref = NULL; + int result = git_reference_dwim(&ref, repo, shorthand); + + if (result != GIT_OK) { + return result; + } + + result = asDirectReference(out, ref); + git_reference_free(ref); + return result; +} + +int lookupDirectReferenceByFullName(git_reference **out, git_repository *repo, const char *fullName) { + git_reference *ref = NULL; + int result = git_reference_lookup(&ref, repo, fullName); + + if (result != GIT_OK) { + return result; + } + + result = asDirectReference(out, ref); + git_reference_free(ref); + return result; +} + +char *getRemoteNameOfReference(git_reference *remoteReference) { + return strtok(strdup(git_reference_shorthand(remoteReference)), "/"); +} + +bool gitStrArrayContains(git_strarray *strarray, const char *string) { + for (size_t i = 0; i < strarray->count; ++i) { + if (strcmp(strarray->strings[i], string) == 0) { + return true; + } + } + return false; +} + +class RefreshedRefModel { +public: + RefreshedRefModel(git_reference *ref): + fullName(strdup(git_reference_name(ref))), + message(NULL), + sha(new char[GIT_OID_HEXSZ + 1]), + shorthand(strdup(git_reference_shorthand(ref))), + type(NULL) + { + if (git_reference_is_branch(ref)) { + type = "branch"; + } else if (git_reference_is_remote(ref)) { + type = "remote"; + } else { + type = "tag"; + } + } + + static int fromReference(RefreshedRefModel **out, git_reference *ref) { + RefreshedRefModel *refModel = new RefreshedRefModel(ref); + git_oid referencedTargetOid; + + int result = getOidOfReferenceCommit(&referencedTargetOid, ref); + if (result != GIT_OK) { + delete refModel; + return result; + } + + if (git_reference_is_tag(ref)) { + git_repository *repo = git_reference_owner(ref); + + git_tag *referencedTag; + if (git_tag_lookup(&referencedTag, repo, &referencedTargetOid) == GIT_OK) { + refModel->message = strdup(git_tag_message(referencedTag)); + git_tag_free(referencedTag); + } + } + + git_oid_tostr(refModel->sha, GIT_OID_HEXSZ + 1, &referencedTargetOid); + + *out = refModel; + return GIT_OK; + } + + v8::Local toJavascript() { + v8::Local result = Nan::New(); + + v8::Local jsFullName; + if (fullName == NULL) { + jsFullName = Nan::Null(); + } else { + jsFullName = Nan::New(fullName).ToLocalChecked(); + } + Nan::Set(result, Nan::New("fullName").ToLocalChecked(), jsFullName); + + v8::Local jsMessage; + if (message == NULL) { + jsMessage = Nan::Null(); + } else { + jsMessage = Nan::New(message).ToLocalChecked(); + } + Nan::Set(result, Nan::New("message").ToLocalChecked(), jsMessage); + + Nan::Set( + result, + Nan::New("sha").ToLocalChecked(), + Nan::New(sha).ToLocalChecked() + ); + + v8::Local jsShorthand; + if (shorthand == NULL) { + jsShorthand = Nan::Null(); + } else { + jsShorthand = Nan::New(shorthand).ToLocalChecked(); + } + Nan::Set(result, Nan::New("shorthand").ToLocalChecked(), jsShorthand); + + v8::Local jsType; + if (type == NULL) { + jsType = Nan::Null(); + } else { + jsType = Nan::New(type).ToLocalChecked(); + } + Nan::Set(result, Nan::New("type").ToLocalChecked(), jsType); + + return result; + } + + ~RefreshedRefModel() { + if (fullName != NULL) { delete[] fullName; } + if (message != NULL) { delete[] message; } + delete[] sha; + if (shorthand != NULL) { delete[] shorthand; } + } + + char *fullName, *message, *sha, *shorthand; + const char *type; +}; + +class UpstreamModel { +public: + UpstreamModel(const char *inputDownstreamFullName, const char *inputUpstreamFullName): + downstreamFullName((char *)strdup(inputDownstreamFullName)), + upstreamFullName((char *)strdup(inputUpstreamFullName)), + ahead(0), + behind(0) {} + + static bool fromReference(UpstreamModel **out, git_reference *ref) { + if (!git_reference_is_branch(ref)) { + return false; + } + + git_reference *upstream; + int result = git_branch_upstream(&upstream, ref); + if (result != GIT_OK) { + return false; + } + + UpstreamModel *upstreamModel = new UpstreamModel( + git_reference_name(ref), + git_reference_name(upstream) + ); + + git_oid localCommitOid; + result = getOidOfReferenceCommit(&localCommitOid, ref); + if (result != GIT_OK) { + delete upstreamModel; + return false; + } + + git_oid upstreamCommitOid; + result = getOidOfReferenceCommit(&upstreamCommitOid, upstream); + if (result != GIT_OK) { + delete upstreamModel; + return false; + } + + result = git_graph_ahead_behind( + &upstreamModel->ahead, + &upstreamModel->behind, + git_reference_owner(ref), + &localCommitOid, + &upstreamCommitOid + ); + + if (result != GIT_OK) { + delete upstreamModel; + return false; + } + + *out = upstreamModel; + return true; + } + + v8::Local toJavascript() { + v8::Local result = Nan::New(); + + v8::Local jsDownstreamFullName; + if (downstreamFullName == NULL) { + jsDownstreamFullName = Nan::Null(); + } else { + jsDownstreamFullName = Nan::New(downstreamFullName).ToLocalChecked(); + } + Nan::Set(result, Nan::New("downstreamFullName").ToLocalChecked(), jsDownstreamFullName); + + v8::Local jsUpstreamFullName; + if (upstreamFullName == NULL) { + jsUpstreamFullName = Nan::Null(); + } else { + jsUpstreamFullName = Nan::New(upstreamFullName).ToLocalChecked(); + } + Nan::Set(result, Nan::New("upstreamFullName").ToLocalChecked(), jsUpstreamFullName); + + Nan::Set(result, Nan::New("ahead").ToLocalChecked(), Nan::New(ahead)); + Nan::Set(result, Nan::New("behind").ToLocalChecked(), Nan::New(behind)); + return result; + } + + ~UpstreamModel() { + if (downstreamFullName != NULL) { delete[] downstreamFullName; } + if (upstreamFullName != NULL) { delete[] upstreamFullName; } + } + + char *downstreamFullName; + char *upstreamFullName; + size_t ahead; + size_t behind; +}; + +class RefreshReferencesData { +public: + RefreshReferencesData(): + headRefFullName(NULL), + cherrypick(NULL), + merge(NULL) {} + + ~RefreshReferencesData() { + while(refs.size()) { + delete refs.back(); + refs.pop_back(); + } + while(upstreamInfo.size()) { + delete upstreamInfo.back(); + upstreamInfo.pop_back(); + } + if (headRefFullName != NULL) { delete[] headRefFullName; } + if (cherrypick != NULL) { delete cherrypick; } + if (merge != NULL) { delete merge; } + } + + std::vector refs; + std::vector upstreamInfo; + char *headRefFullName; + RefreshedRefModel *cherrypick; + RefreshedRefModel *merge; +}; + +NAN_METHOD(GitRepository::RefreshReferences) +{ + if (info.Length() == 0 || !info[0]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + RefreshReferencesBaton* baton = new RefreshReferencesBaton; + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->out = (void *)new RefreshReferencesData; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback); + worker->SaveToPersistent("repo", info.This()); + Nan::AsyncQueueWorker(worker); + return; +} + +void GitRepository::RefreshReferencesWorker::Execute() +{ + giterr_clear(); + + LockMaster lockMaster(true, baton->repo); + git_repository *repo = baton->repo; + RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; + + // START Refresh HEAD + git_reference *headRef = NULL; + baton->error_code = lookupDirectReferenceByShorthand(&headRef, repo, "HEAD"); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete refreshData; + baton->out = NULL; + return; + } + + RefreshedRefModel *headModel; + baton->error_code = RefreshedRefModel::fromReference(&headModel, headRef); + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_reference_free(headRef); + delete refreshData; + baton->out = NULL; + return; + } + refreshData->refs.push_back(headModel); + + refreshData->headRefFullName = strdup(git_reference_name(headRef)); + git_reference_free(headRef); + // END Refresh HEAD + + // START Refresh CHERRY_PICK_HEAD + git_reference *cherrypickRef = NULL; + if (lookupDirectReferenceByShorthand(&cherrypickRef, repo, "CHERRY_PICK_HEAD") == GIT_OK) { + baton->error_code = RefreshedRefModel::fromReference(&refreshData->cherrypick, cherrypickRef); + git_reference_free(cherrypickRef); + } else { + cherrypickRef = NULL; + } + // END Refresh CHERRY_PICK_HEAD + + // START Refresh MERGE_HEAD + git_reference *mergeRef = NULL; + // fall through if cherry pick failed + if (baton->error_code == GIT_OK && lookupDirectReferenceByShorthand(&mergeRef, repo, "MERGE_HEAD") == GIT_OK) { + baton->error_code = RefreshedRefModel::fromReference(&refreshData->merge, mergeRef); + git_reference_free(mergeRef); + } else { + mergeRef = NULL; + } + // END Refresh MERGE_HEAD + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete refreshData; + baton->out = NULL; + return; + } + + // Retrieve reference models and upstream info for each reference + git_strarray referenceNames; + baton->error_code = git_reference_list(&referenceNames, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete refreshData; + baton->out = NULL; + return; + } + + git_strarray remoteNames; + baton->error_code = git_remote_list(&remoteNames, repo); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_strarray_free(&referenceNames); + delete refreshData; + baton->out = NULL; + return; + } + + for (size_t referenceIndex = 0; referenceIndex < referenceNames.count; ++referenceIndex) { + git_reference *reference; + baton->error_code = lookupDirectReferenceByFullName(&reference, repo, referenceNames.strings[referenceIndex]); + + if (baton->error_code != GIT_OK) { + break; + } + + UpstreamModel *upstreamModel; + if (UpstreamModel::fromReference(&upstreamModel, reference)) { + refreshData->upstreamInfo.push_back(upstreamModel); + } + + bool isBranch = git_reference_is_branch(reference); + bool isRemote = git_reference_is_remote(reference); + bool isTag = git_reference_is_tag(reference); + if ( + strcmp(referenceNames.strings[referenceIndex], headModel->fullName) == 0 + || (!isBranch && !isRemote && !isTag) + ) { + git_reference_free(reference); + continue; + } + + if (isRemote) { + char *remoteNameOfRef = getRemoteNameOfReference(reference); + bool isFromExistingRemote = gitStrArrayContains(&remoteNames, remoteNameOfRef); + delete[] remoteNameOfRef; + if (!isFromExistingRemote) { + git_reference_free(reference); + continue; + } + } + + RefreshedRefModel *refreshedRefModel; + baton->error_code = RefreshedRefModel::fromReference(&refreshedRefModel, reference); + git_reference_free(reference); + + if (baton->error_code == GIT_OK) { + refreshData->refs.push_back(refreshedRefModel); + } + } + + git_strarray_free(&remoteNames); + git_strarray_free(&referenceNames); + + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete refreshData; + baton->out = NULL; + return; + } +} + +void GitRepository::RefreshReferencesWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; + v8::Local result = Nan::New(); + + Nan::Set( + result, + Nan::New("headRefFullName").ToLocalChecked(), + Nan::New(refreshData->headRefFullName).ToLocalChecked() + ); + + unsigned int numRefs = refreshData->refs.size(); + v8::Local refs = Nan::New(numRefs); + for (unsigned int i = 0; i < numRefs; ++i) { + RefreshedRefModel *refreshedRefModel = refreshData->refs[i]; + Nan::Set(refs, Nan::New(i), refreshedRefModel->toJavascript()); + } + Nan::Set(result, Nan::New("refs").ToLocalChecked(), refs); + + unsigned int numUpstreamInfo = refreshData->upstreamInfo.size(); + v8::Local upstreamInfo = Nan::New(numUpstreamInfo); + for (unsigned int i = 0; i < numUpstreamInfo; ++i) { + UpstreamModel *upstreamModel = refreshData->upstreamInfo[i]; + Nan::Set(upstreamInfo, Nan::New(i), upstreamModel->toJavascript()); + } + Nan::Set(result, Nan::New("upstreamInfo").ToLocalChecked(), upstreamInfo); + + if (refreshData->cherrypick != NULL) { + Nan::Set( + result, + Nan::New("cherrypick").ToLocalChecked(), + refreshData->cherrypick->toJavascript() + ); + } else { + Nan::Set(result, Nan::New("cherrypick").ToLocalChecked(), Nan::Null()); + } + + if (refreshData->merge != NULL) { + Nan::Set( + result, + Nan::New("merge").ToLocalChecked(), + refreshData->merge->toJavascript() + ); + } else { + Nan::Set(result, Nan::New("merge").ToLocalChecked(), Nan::Null()); + } + + delete refreshData; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local argv[1] = { + Nan::Error(baton->error->message) + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::Error("Repository refreshReferences has thrown an error.")->ToObject(); + err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshReferences").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } +} From 7139a9e996146c773c311d961745a49d961722c7 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 17 Apr 2019 14:29:31 -0700 Subject: [PATCH 097/545] Fix linter issues --- lib/repository.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index cdbad7054..29c429fad 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -24,7 +24,6 @@ var TreeBuilder = NodeGit.Treebuilder; var _discover = Repository.discover; var _initExt = Repository.initExt; var _fetchheadForeach = Repository.prototype.fetchheadForeach; -var _getReferences = Repository.prototype.getReferences; var _mergeheadForeach = Repository.prototype.mergeheadForeach; function applySelectedLinesToTarget @@ -355,7 +354,7 @@ Repository.getReferences = function(repo, type, refNamesOnly) { var filteredRefList = refList; filteredRefList.filter(function(reference) { - return type == Reference.TYPE.LISTALL || ref.type === type + return type == Reference.TYPE.LISTALL || reference.type === type; }); if (refNamesOnly) { From ea358d4e6145974beff21cbbc8b9e76740a387ff Mon Sep 17 00:00:00 2001 From: Jordan Wallet Date: Fri, 19 Apr 2019 17:23:19 -0700 Subject: [PATCH 098/545] Add tag gpg signatures to refreshReferences --- .../manual/repository/refresh_references.cc | 183 +++++++++++++++--- 1 file changed, 157 insertions(+), 26 deletions(-) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 2ee4c027d..a525cd691 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -65,6 +65,8 @@ class RefreshedRefModel { message(NULL), sha(new char[GIT_OID_HEXSZ + 1]), shorthand(strdup(git_reference_shorthand(ref))), + tagOdbBuffer(NULL), + tagOdbBufferLength(0), type(NULL) { if (git_reference_is_branch(ref)) { @@ -76,33 +78,89 @@ class RefreshedRefModel { } } - static int fromReference(RefreshedRefModel **out, git_reference *ref) { + static int fromReference(RefreshedRefModel **out, git_reference *ref, git_odb *odb) { RefreshedRefModel *refModel = new RefreshedRefModel(ref); - git_oid referencedTargetOid; + const git_oid *referencedTargetOid = git_reference_target(ref); - int result = getOidOfReferenceCommit(&referencedTargetOid, ref); - if (result != GIT_OK) { - delete refModel; - return result; + if (!git_reference_is_tag(ref)) { + git_oid_tostr(refModel->sha, GIT_OID_HEXSZ + 1, referencedTargetOid); + + *out = refModel; + return GIT_OK; } + git_repository *repo = git_reference_owner(ref); - if (git_reference_is_tag(ref)) { - git_repository *repo = git_reference_owner(ref); + git_tag *referencedTag; + if (git_tag_lookup(&referencedTag, repo, referencedTargetOid) == GIT_OK) { + refModel->message = strdup(git_tag_message(referencedTag)); - git_tag *referencedTag; - if (git_tag_lookup(&referencedTag, repo, &referencedTargetOid) == GIT_OK) { - refModel->message = strdup(git_tag_message(referencedTag)); - git_tag_free(referencedTag); + git_odb_object *tagOdbObject; + if (git_odb_read(&tagOdbObject, odb, git_tag_id(referencedTag)) == GIT_OK) { + refModel->tagOdbBufferLength = git_odb_object_size(tagOdbObject); + refModel->tagOdbBuffer = new char[refModel->tagOdbBufferLength]; + std::memcpy(refModel->tagOdbBuffer, git_odb_object_data(tagOdbObject), refModel->tagOdbBufferLength); + git_odb_object_free(tagOdbObject); } + + git_tag_free(referencedTag); + } + + git_oid peeledReferencedTargetOid; + int error = getOidOfReferenceCommit(&peeledReferencedTargetOid, ref); + if (error != GIT_OK) { + delete refModel; + return error; } - git_oid_tostr(refModel->sha, GIT_OID_HEXSZ + 1, &referencedTargetOid); + git_oid_tostr(refModel->sha, GIT_OID_HEXSZ + 1, &peeledReferencedTargetOid); *out = refModel; return GIT_OK; } - v8::Local toJavascript() { + static void ensureSignatureRegexes() { + if (!signatureRegexesBySignatureType.IsEmpty()) { + return; + } + + v8::Local gpgsigArray = Nan::New(2), + x509Array = Nan::New(1); + + Nan::Set( + gpgsigArray, + Nan::New(0), + Nan::New( + Nan::New("-----BEGIN PGP SIGNATURE-----[\\s\\S]+?-----END PGP SIGNATURE-----").ToLocalChecked(), + static_cast(v8::RegExp::Flags::kGlobal | v8::RegExp::Flags::kMultiline) + ).ToLocalChecked() + ); + + Nan::Set( + gpgsigArray, + Nan::New(1), + Nan::New( + Nan::New("-----BEGIN PGP MESSAGE-----[\\s\\S]+?-----END PGP MESSAGE-----").ToLocalChecked(), + static_cast(v8::RegExp::Flags::kGlobal | v8::RegExp::Flags::kMultiline) + ).ToLocalChecked() + ); + + Nan::Set( + x509Array, + Nan::New(0), + Nan::New( + Nan::New("-----BEGIN SIGNED MESSAGE-----[\s\S]+?-----END SIGNED MESSAGE-----").ToLocalChecked(), + static_cast(v8::RegExp::Flags::kGlobal | v8::RegExp::Flags::kMultiline) + ).ToLocalChecked() + ); + + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("gpgsig").ToLocalChecked(), gpgsigArray); + Nan::Set(result, Nan::New("x509").ToLocalChecked(), x509Array); + + signatureRegexesBySignatureType.Reset(result); + } + + v8::Local toJavascript(v8::Local signatureType) { v8::Local result = Nan::New(); v8::Local jsFullName; @@ -135,6 +193,34 @@ class RefreshedRefModel { } Nan::Set(result, Nan::New("shorthand").ToLocalChecked(), jsShorthand); + v8::Local jsTagSignature = Nan::Null(); + if (tagOdbBuffer != NULL && tagOdbBufferLength != 0) { + // tagOdbBuffer is already a copy, so we'd like to use NewBuffer instead, + // but we were getting segfaults and couldn't easily figure out why. :( + // We tried passing the tagOdbBuffer directly to NewBuffer and then nullifying tagOdbBuffer so that + // the destructor didn't double free, but that still segfaulted internally in Node. + v8::Local buffer = Nan::CopyBuffer(tagOdbBuffer, tagOdbBufferLength).ToLocalChecked(); + v8::Local toStringProp = Nan::Get(buffer, Nan::New("toString").ToLocalChecked()).ToLocalChecked(); + v8::Local jsTagOdbObjectString = Nan::CallAsFunction(toStringProp->ToObject(), buffer, 0, NULL).ToLocalChecked()->ToObject(); + + v8::Local _signatureRegexesBySignatureType = Nan::New(signatureRegexesBySignatureType); + v8::Local signatureRegexes = v8::Local::Cast(Nan::Get(_signatureRegexesBySignatureType, signatureType).ToLocalChecked()); + + for (uint32_t i = 0; i < signatureRegexes->Length(); ++i) { + v8::Local argv[] = { + Nan::Get(signatureRegexes, Nan::New(i)).ToLocalChecked() + }; + + v8::Local matchProp = Nan::Get(jsTagOdbObjectString, Nan::New("match").ToLocalChecked()).ToLocalChecked(); + v8::Local match = Nan::CallAsFunction(matchProp->ToObject(), jsTagOdbObjectString, 1, argv).ToLocalChecked(); + if (match->IsArray()) { + jsTagSignature = Nan::Get(match->ToObject(), 0).ToLocalChecked(); + break; + } + } + } + Nan::Set(result, Nan::New("tagSignature").ToLocalChecked(), jsTagSignature); + v8::Local jsType; if (type == NULL) { jsType = Nan::Null(); @@ -151,12 +237,17 @@ class RefreshedRefModel { if (message != NULL) { delete[] message; } delete[] sha; if (shorthand != NULL) { delete[] shorthand; } + if (tagOdbBuffer != NULL) { delete[] tagOdbBuffer; } } - char *fullName, *message, *sha, *shorthand; + char *fullName, *message, *sha, *shorthand, *tagOdbBuffer; + size_t tagOdbBufferLength; const char *type; + static Nan::Persistent signatureRegexesBySignatureType; }; +Nan::Persistent RefreshedRefModel::signatureRegexesBySignatureType; + class UpstreamModel { public: UpstreamModel(const char *inputDownstreamFullName, const char *inputUpstreamFullName): @@ -277,7 +368,25 @@ class RefreshReferencesData { NAN_METHOD(GitRepository::RefreshReferences) { - if (info.Length() == 0 || !info[0]->IsFunction()) { + v8::Local signatureType; + if (info.Length() == 2) { + if (!info[0]->IsString()) { + return Nan::ThrowError("Signature type must be \"gpgsig\" or \"x509\"."); + } + + v8::Local signatureTypeParam = info[0]->ToString(); + if ( + Nan::Equals(signatureTypeParam, Nan::New("gpgsig").ToLocalChecked()) != Nan::Just(true) + && Nan::Equals(signatureTypeParam, Nan::New("x509").ToLocalChecked()) != Nan::Just(true) + ) { + return Nan::ThrowError("Signature type must be \"gpgsig\" or \"x509\"."); + } + signatureType = signatureTypeParam; + } else { + signatureType = Nan::New("gpgsig").ToLocalChecked(); + } + + if (info.Length() == 0 || (info.Length() == 1 && !info[0]->IsFunction()) || (info.Length() == 2 && !info[1]->IsFunction())) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -291,6 +400,7 @@ NAN_METHOD(GitRepository::RefreshReferences) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback); worker->SaveToPersistent("repo", info.This()); + worker->SaveToPersistent("signatureType", signatureType); Nan::AsyncQueueWorker(worker); return; } @@ -302,6 +412,18 @@ void GitRepository::RefreshReferencesWorker::Execute() LockMaster lockMaster(true, baton->repo); git_repository *repo = baton->repo; RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; + git_odb *odb; + + baton->error_code = git_repository_odb(&odb, repo); + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + git_odb_free(odb); + delete refreshData; + baton->out = NULL; + return; + } // START Refresh HEAD git_reference *headRef = NULL; @@ -311,17 +433,19 @@ void GitRepository::RefreshReferencesWorker::Execute() if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); } + git_odb_free(odb); delete refreshData; baton->out = NULL; return; } RefreshedRefModel *headModel; - baton->error_code = RefreshedRefModel::fromReference(&headModel, headRef); + baton->error_code = RefreshedRefModel::fromReference(&headModel, headRef, odb); if (baton->error_code != GIT_OK) { if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); } + git_odb_free(odb); git_reference_free(headRef); delete refreshData; baton->out = NULL; @@ -336,7 +460,7 @@ void GitRepository::RefreshReferencesWorker::Execute() // START Refresh CHERRY_PICK_HEAD git_reference *cherrypickRef = NULL; if (lookupDirectReferenceByShorthand(&cherrypickRef, repo, "CHERRY_PICK_HEAD") == GIT_OK) { - baton->error_code = RefreshedRefModel::fromReference(&refreshData->cherrypick, cherrypickRef); + baton->error_code = RefreshedRefModel::fromReference(&refreshData->cherrypick, cherrypickRef, odb); git_reference_free(cherrypickRef); } else { cherrypickRef = NULL; @@ -347,7 +471,7 @@ void GitRepository::RefreshReferencesWorker::Execute() git_reference *mergeRef = NULL; // fall through if cherry pick failed if (baton->error_code == GIT_OK && lookupDirectReferenceByShorthand(&mergeRef, repo, "MERGE_HEAD") == GIT_OK) { - baton->error_code = RefreshedRefModel::fromReference(&refreshData->merge, mergeRef); + baton->error_code = RefreshedRefModel::fromReference(&refreshData->merge, mergeRef, odb); git_reference_free(mergeRef); } else { mergeRef = NULL; @@ -358,6 +482,7 @@ void GitRepository::RefreshReferencesWorker::Execute() if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); } + git_odb_free(odb); delete refreshData; baton->out = NULL; return; @@ -371,6 +496,7 @@ void GitRepository::RefreshReferencesWorker::Execute() if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); } + git_odb_free(odb); delete refreshData; baton->out = NULL; return; @@ -383,6 +509,7 @@ void GitRepository::RefreshReferencesWorker::Execute() if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); } + git_odb_free(odb); git_strarray_free(&referenceNames); delete refreshData; baton->out = NULL; @@ -424,7 +551,7 @@ void GitRepository::RefreshReferencesWorker::Execute() } RefreshedRefModel *refreshedRefModel; - baton->error_code = RefreshedRefModel::fromReference(&refreshedRefModel, reference); + baton->error_code = RefreshedRefModel::fromReference(&refreshedRefModel, reference, odb); git_reference_free(reference); if (baton->error_code == GIT_OK) { @@ -432,6 +559,7 @@ void GitRepository::RefreshReferencesWorker::Execute() } } + git_odb_free(odb); git_strarray_free(&remoteNames); git_strarray_free(&referenceNames); @@ -449,6 +577,7 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() { if (baton->out != NULL) { + RefreshedRefModel::ensureSignatureRegexes(); RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; v8::Local result = Nan::New(); @@ -458,19 +587,21 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() Nan::New(refreshData->headRefFullName).ToLocalChecked() ); + v8::Local signatureType = GetFromPersistent("signatureType")->ToString(); + unsigned int numRefs = refreshData->refs.size(); - v8::Local refs = Nan::New(numRefs); + v8::Local refs = Nan::New(numRefs); for (unsigned int i = 0; i < numRefs; ++i) { RefreshedRefModel *refreshedRefModel = refreshData->refs[i]; - Nan::Set(refs, Nan::New(i), refreshedRefModel->toJavascript()); + Nan::Set(refs, Nan::New(i), refreshedRefModel->toJavascript(signatureType)); } Nan::Set(result, Nan::New("refs").ToLocalChecked(), refs); unsigned int numUpstreamInfo = refreshData->upstreamInfo.size(); - v8::Local upstreamInfo = Nan::New(numUpstreamInfo); + v8::Local upstreamInfo = Nan::New(numUpstreamInfo); for (unsigned int i = 0; i < numUpstreamInfo; ++i) { UpstreamModel *upstreamModel = refreshData->upstreamInfo[i]; - Nan::Set(upstreamInfo, Nan::New(i), upstreamModel->toJavascript()); + Nan::Set(upstreamInfo, Nan::New(i), upstreamModel->toJavascript()); } Nan::Set(result, Nan::New("upstreamInfo").ToLocalChecked(), upstreamInfo); @@ -478,7 +609,7 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() Nan::Set( result, Nan::New("cherrypick").ToLocalChecked(), - refreshData->cherrypick->toJavascript() + refreshData->cherrypick->toJavascript(signatureType) ); } else { Nan::Set(result, Nan::New("cherrypick").ToLocalChecked(), Nan::Null()); @@ -488,7 +619,7 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() Nan::Set( result, Nan::New("merge").ToLocalChecked(), - refreshData->merge->toJavascript() + refreshData->merge->toJavascript(signatureType) ); } else { Nan::Set(result, Nan::New("merge").ToLocalChecked(), Nan::Null()); From f4926a0a534edbe3b2ae46606aff3289c7fbc0ea Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 23 Apr 2019 16:31:20 -0700 Subject: [PATCH 099/545] Fixup refreshReferences Reset baton->error_code to GIT_OK on clean loop exit. Use \\s instead of \s for regex string --- generate/templates/manual/repository/refresh_references.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index a525cd691..a13f3641c 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -148,7 +148,7 @@ class RefreshedRefModel { x509Array, Nan::New(0), Nan::New( - Nan::New("-----BEGIN SIGNED MESSAGE-----[\s\S]+?-----END SIGNED MESSAGE-----").ToLocalChecked(), + Nan::New("-----BEGIN SIGNED MESSAGE-----[\\s\\S]+?-----END SIGNED MESSAGE-----").ToLocalChecked(), static_cast(v8::RegExp::Flags::kGlobal | v8::RegExp::Flags::kMultiline) ).ToLocalChecked() ); @@ -556,6 +556,8 @@ void GitRepository::RefreshReferencesWorker::Execute() if (baton->error_code == GIT_OK) { refreshData->refs.push_back(refreshedRefModel); + } else { + baton->error_code = GIT_OK; } } From 5c63321b65ac1d0ce9f3b1f2560983937334e880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20S=C3=A1rk=C3=A1ny?= Date: Fri, 3 May 2019 02:50:15 +0200 Subject: [PATCH 100/545] node-gyp upgraded to 4.0.0 --- package-lock.json | 59 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04dff435c..ff74ee4ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -884,14 +884,6 @@ "safe-buffer": "^5.1.1" } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -2441,17 +2433,6 @@ } } }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3633,11 +3614,10 @@ } }, "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==", "requires": { - "fstream": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", "mkdirp": "^0.5.0", @@ -5105,13 +5085,32 @@ "dev": true }, "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "tar-fs": { diff --git a/package.json b/package.json index f523fdae1..0058729a1 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "json5": "^2.1.0", "lodash": "^4.17.11", "nan": "^2.11.1", - "node-gyp": "^3.8.0", + "node-gyp": "^4.0.0", "node-pre-gyp": "^0.11.0", "promisify-node": "~0.3.0", "ramda": "^0.25.0", From 764146ca8054cd2839685c423bc2e5ba727165e9 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 3 May 2019 09:51:46 -0700 Subject: [PATCH 101/545] Bump to v0.25.0-alpha.10 --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00c78c1b5..26400eda1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # Change Log +## v0.25.0-alpha.10 [(2019-05-03)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.10) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.9...v0.25.0-alpha.10) + +#### Summary of changes +- Drops support for Ubuntu 14 after EOL +- Fixes openssl prebuilt downloads for electron builds +- Fixes commits retrieved from Commit.prototype.parent +- *DEPRECATION* Support signing commits in Repository.prototype.mergeBranches. The last parameter `processMergeMessageCallback` is now deprecated, but will continue to work. Use the options object instead, which will contain the `processMergeMessageCallback`, as well as the `signingCb`. +- Bump Node-Gyp to 4.0.0 to fix tar security vulnerability +- *BREAKING* `getRemotes` no longer returns remote names, it now returns remote objects directly. Use `getRemoteNames` to get a list of remote names. +- Optimized a set of routines in NodeGit. These methods as written in Javascript require hundreds or thousands of requests to async workers to retrieve data. We've batched these requests and performed them on a single async worker. There are now native implementations of the following: + - Repository.prototype.getReferences: Retrieves all references on async worker. + - Repository.prototype.getRemotes: Retrieves all remotes on async worker. + - Repository.prototype.getSubmodules: Retrieves all submodules on async worker. + - Repository.prototype.refreshReferences: Open sourced function from GitKraken. Grabs a lot of information about references on an async worker. + - Revwalk.prototype.commitWalk: Retrieves up to N commits from a revwalk on an async worker. + +#### Merged PRs into NodeGit +- [EOL for Node 6 and Ubuntu 14.04 #1649](https://github.com/nodegit/nodegit/pull/1649) +- [Ensures that commits from parent(*) has a repository #1658](https://github.com/nodegit/nodegit/pull/1658) +- [Update openssl conan distributions #1663](https://github.com/nodegit/nodegit/pull/1663) +- [Support signing in Repository#mergeBranches #1664](https://github.com/nodegit/nodegit/pull/1664) +- [Dependency upgrade node-gyp upgraded to 4.0.0 #1672](https://github.com/nodegit/nodegit/pull/1672) +- [Add additional getters to streamline information gathering (breaking change) #1671](https://github.com/nodegit/nodegit/pull/1671) + + + ## v0.25.0-alpha.9 [(2019-03-04)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.9) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.8...v0.25.0-alpha.9) diff --git a/package-lock.json b/package-lock.json index ff74ee4ae..5153839cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.9", + "version": "0.25.0-alpha.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0058729a1..3ffdeb2db 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.9", + "version": "0.25.0-alpha.10", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 0eba0699fde7d9c0f13ddab1ad1e582881eaf7c8 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 16 May 2019 14:25:52 -0700 Subject: [PATCH 102/545] Implement faster file history walk Co-authored-by: Tyler Ang-Wanek --- generate/input/libgit2-supplement.json | 4 +- .../manual/revwalk/file_history_walk.cc | 522 +++++++++++------- 2 files changed, 338 insertions(+), 188 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 42d9260b2..1b3e66a21 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -434,11 +434,11 @@ }, { "name": "max_count", - "type": "int" + "type": "unsigned int" }, { "name": "out", - "type": "std::vector< std::pair > *> *" + "type": "std::vector *" }, { "name": "walk", diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index c70b6856c..555149e13 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -1,3 +1,182 @@ +// Note: commit is not owned by this class (must be freed elsewhere) +class FileHistoryEvent { +public: + FileHistoryEvent( + git_delta_t inputType, + bool inputExistsInCurrentTree, + bool inputIsMergeCommit, + git_commit *inputCommit, + const char *inputFrom, + const char *inputTo + ): + type(inputType), + existsInCurrentTree(inputExistsInCurrentTree), + isMergeCommit(inputIsMergeCommit), + from(inputFrom == NULL ? NULL : strdup(inputFrom)), + to(inputTo == NULL ? NULL : strdup(inputTo)), + commit(inputCommit) + { + if (inputCommit != NULL) { + const int error = git_commit_dup(&commit, inputCommit); + assert(error == GIT_OK); + } + } + + ~FileHistoryEvent() { + if (commit != NULL) { + git_commit_free(commit); + } + } + + v8::Local toJavascript() { + v8::Local historyEntry = Nan::New(); + v8::Local owners = Nan::New(1); + Nan::Set( + owners, + Nan::New(owners->Length()), + GitRepository::New( + git_commit_owner(commit), + true + )->ToObject() + ); + Nan::Set(historyEntry, Nan::New("commit").ToLocalChecked(), GitCommit::New(commit, true, owners)); + commit = NULL; + Nan::Set(historyEntry, Nan::New("status").ToLocalChecked(), Nan::New(type)); + Nan::Set(historyEntry, Nan::New("isMergeCommit").ToLocalChecked(), Nan::New(isMergeCommit)); + if (type == GIT_DELTA_RENAMED) { + if (existsInCurrentTree) { + Nan::Set(historyEntry, Nan::New("oldName").ToLocalChecked(), Nan::New(from).ToLocalChecked()); + } else { + Nan::Set(historyEntry, Nan::New("newName").ToLocalChecked(), Nan::New(to).ToLocalChecked()); + } + } + return historyEntry; + } + + static int buildHistoryEvent( + FileHistoryEvent **fileHistoryEvent, + git_repository *repo, + git_commit *currentCommit, + git_tree *currentTree, + git_tree *parentTree, + const char *filePath + ) { + int errorCode; + git_tree_entry *currentEntry; + if (git_tree_entry_bypath(¤tEntry, currentTree, filePath) != GIT_OK) { + currentEntry = NULL; + } + git_tree_entry *parentEntry; + if (git_tree_entry_bypath(&parentEntry, parentTree, filePath) != GIT_OK) { + parentEntry = NULL; + } + + if (!currentEntry && !parentEntry) { + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_UNMODIFIED, false, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + // The filePath was added + if (currentEntry && !parentEntry) { + git_diff *diff; + if ((errorCode = git_diff_tree_to_tree(&diff, repo, parentTree, currentTree, NULL)) != GIT_OK) { + git_tree_entry_free(currentEntry); + return errorCode; + } + if ((errorCode = git_diff_find_similar(diff, NULL)) != GIT_OK) { + git_diff_free(diff); + git_tree_entry_free(currentEntry); + return errorCode; + } + const size_t numDeltas = git_diff_num_deltas(diff); + for (size_t i = 0; i < numDeltas; ++i) { + const git_diff_delta *delta = git_diff_get_delta(diff, i); + if (delta->new_file.path != NULL && std::strcmp(delta->new_file.path, filePath) == 0) { + if (delta->status == GIT_DELTA_RENAMED + || (delta->old_file.path != NULL && std::strcmp(delta->old_file.path, filePath) != 0)) { + *fileHistoryEvent = new FileHistoryEvent( + GIT_DELTA_RENAMED, + true, + false, + currentCommit, + delta->old_file.path, + NULL + ); + git_diff_free(diff); + git_tree_entry_free(currentEntry); + return GIT_OK; + } + break; + } + } + git_diff_free(diff); + git_tree_entry_free(currentEntry); + + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_ADDED, true, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + // The filePath was deleted + if (!currentEntry && parentEntry) { + git_diff *diff; + if ((errorCode = git_diff_tree_to_tree(&diff, repo, parentTree, currentTree, NULL)) != GIT_OK) { + git_tree_entry_free(parentEntry); + return errorCode; + } + if ((errorCode = git_diff_find_similar(diff, NULL)) != GIT_OK) { + git_diff_free(diff); + git_tree_entry_free(parentEntry); + return errorCode; + } + const size_t numDeltas = git_diff_num_deltas(diff); + for (size_t i = 0; i < numDeltas; ++i) { + const git_diff_delta *delta = git_diff_get_delta(diff, i); + if (delta->old_file.path != NULL && std::strcmp(delta->old_file.path, filePath) == 0) { + if (delta->status == GIT_DELTA_RENAMED + || (delta->new_file.path != NULL && std::strcmp(delta->new_file.path, filePath) != 0)) { + *fileHistoryEvent = new FileHistoryEvent( + GIT_DELTA_RENAMED, + false, + false, + currentCommit, + NULL, + delta->new_file.path + ); + git_diff_free(diff); + git_tree_entry_free(parentEntry); + return GIT_OK; + } + break; + } + } + git_diff_free(diff); + git_tree_entry_free(parentEntry); + + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_DELETED, false, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + if (git_oid_cmp(git_tree_entry_id(currentEntry), git_tree_entry_id(parentEntry)) != 0 + || git_tree_entry_filemode(currentEntry) != git_tree_entry_filemode(parentEntry) + ) { + git_tree_entry_free(parentEntry); + git_tree_entry_free(currentEntry); + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_MODIFIED, true, false, currentCommit, NULL, NULL); + return GIT_OK; + } + + *fileHistoryEvent = new FileHistoryEvent(GIT_DELTA_UNMODIFIED, true, false, currentCommit, NULL, NULL); + git_tree_entry_free(parentEntry); + git_tree_entry_free(currentEntry); + return GIT_OK; + } + + git_delta_t type; + bool existsInCurrentTree, isMergeCommit; + const char *from, *to; + git_commit *commit; +}; + NAN_METHOD(GitRevwalk::FileHistoryWalk) { if (info.Length() == 0 || !info[0]->IsString()) { @@ -19,7 +198,7 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) String::Utf8Value from_js_file_path(info[0]->ToString()); baton->file_path = strdup(*from_js_file_path); baton->max_count = Nan::To(info[1]).FromJust(); - baton->out = new std::vector< std::pair > *>; + baton->out = new std::vector; baton->out->reserve(baton->max_count); baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); @@ -34,251 +213,222 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) void GitRevwalk::FileHistoryWalkWorker::Execute() { git_repository *repo = git_revwalk_repository(baton->walk); - git_oid *nextOid = (git_oid *)malloc(sizeof(git_oid)); + git_oid currentOid; git_error_clear(); for ( - unsigned int i = 0; - i < baton->max_count && (baton->error_code = git_revwalk_next(nextOid, baton->walk)) == GIT_OK; - ++i + unsigned int revwalkIterations = 0; + revwalkIterations < baton->max_count && (baton->error_code = git_revwalk_next(¤tOid, baton->walk)) == GIT_OK; + ++revwalkIterations ) { - // check if this commit has the file - git_commit *nextCommit; - - if ((baton->error_code = git_commit_lookup(&nextCommit, repo, nextOid)) != GIT_OK) { + git_commit *currentCommit; + if ((baton->error_code = git_commit_lookup(¤tCommit, repo, ¤tOid)) != GIT_OK) { break; } - git_tree *thisTree, *parentTree; - if ((baton->error_code = git_commit_tree(&thisTree, nextCommit)) != GIT_OK) { - git_commit_free(nextCommit); + git_tree *currentTree; + if ((baton->error_code = git_commit_tree(¤tTree, currentCommit)) != GIT_OK) { + git_commit_free(currentCommit); break; } - git_diff *diffs; - git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - char *file_path = strdup(baton->file_path); - opts.pathspec.strings = &file_path; - opts.pathspec.count = 1; - git_commit *parent; - unsigned int parents = git_commit_parentcount(nextCommit); - if (parents > 1) { - git_commit_free(nextCommit); - continue; - } else if (parents == 1) { - if ((baton->error_code = git_commit_parent(&parent, nextCommit, 0)) != GIT_OK) { - git_commit_free(nextCommit); - break; + const unsigned int parentCount = git_commit_parentcount(currentCommit); + if (parentCount == 0) { + git_tree_entry* entry; + if (git_tree_entry_bypath(&entry, currentTree, baton->file_path) == GIT_OK) { + baton->out->push_back(new FileHistoryEvent(GIT_DELTA_ADDED, false, false, currentCommit, NULL, NULL)); + git_tree_entry_free(entry); } - if ( - (baton->error_code = git_commit_tree(&parentTree, parent)) != GIT_OK || - (baton->error_code = git_diff_tree_to_tree(&diffs, repo, parentTree, thisTree, &opts)) != GIT_OK - ) { - git_commit_free(nextCommit); - git_commit_free(parent); + git_commit_free(currentCommit); + git_tree_free(currentTree); + continue; + } + + if (parentCount == 1) { + git_commit *parentCommit; + if ((baton->error_code = git_commit_parent(&parentCommit, currentCommit, 0)) != GIT_OK) { + git_commit_free(currentCommit); + git_tree_free(currentTree); break; } - } else { - if ((baton->error_code = git_diff_tree_to_tree(&diffs, repo, NULL, thisTree, &opts)) != GIT_OK) { - git_commit_free(nextCommit); + + git_tree *parentTree; + if ((baton->error_code = git_commit_tree(&parentTree, parentCommit)) != GIT_OK) { + git_commit_free(currentCommit); + git_commit_free(parentCommit); + git_tree_free(currentTree); break; } - } - free(file_path); - opts.pathspec.strings = NULL; - opts.pathspec.count = 0; - bool flag = false; - bool doRenamedPass = false; - unsigned int numDeltas = git_diff_num_deltas(diffs); - for (unsigned int j = 0; j < numDeltas; ++j) { - git_patch *nextPatch; - baton->error_code = git_patch_from_diff(&nextPatch, diffs, j); - - if (baton->error_code < GIT_OK) { + FileHistoryEvent *fileHistoryEvent; + if ((baton->error_code = FileHistoryEvent::buildHistoryEvent( + &fileHistoryEvent, + repo, + currentCommit, + currentTree, + parentTree, + baton->file_path + )) != GIT_OK) { + git_commit_free(currentCommit); + git_commit_free(parentCommit); + git_tree_free(currentTree); + git_tree_free(parentTree); break; } - if (nextPatch == NULL) { - continue; + if (fileHistoryEvent->type != GIT_DELTA_UNMODIFIED) { + baton->out->push_back(fileHistoryEvent); } - const git_diff_delta *delta = git_patch_get_delta(nextPatch); - bool isEqualOldFile = !strncmp(delta->old_file.path, baton->file_path, strlen(baton->file_path)); - bool isEqualNewFile = !strncmp(delta->new_file.path, baton->file_path, strlen(baton->file_path)); + git_commit_free(currentCommit); + git_commit_free(parentCommit); + git_tree_free(currentTree); + git_tree_free(parentTree); + continue; + } - if (isEqualNewFile) { - if (delta->status == GIT_DELTA_ADDED || delta->status == GIT_DELTA_DELETED) { - doRenamedPass = true; - break; - } - std::pair > *historyEntry; - if (!isEqualOldFile) { - historyEntry = new std::pair >( - nextCommit, - std::pair(strdup(delta->old_file.path), delta->status) - ); - } else { - historyEntry = new std::pair >( - nextCommit, - std::pair(strdup(delta->new_file.path), delta->status) - ); - } - baton->out->push_back(historyEntry); - flag = true; + std::pair firstMatchingParentIndex(false, 0); + bool fileExistsInCurrent = false, fileExistsInSomeParent = false; + for (unsigned int parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + git_commit *parentCommit; + if ((baton->error_code = git_commit_parent(&parentCommit, currentCommit, parentIndex)) != GIT_OK) { + break; } - git_patch_free(nextPatch); - - if (flag) { + git_tree *parentTree; + if ((baton->error_code = git_commit_tree(&parentTree, parentCommit)) != GIT_OK) { + git_commit_free(parentCommit); break; } - } - if (doRenamedPass) { - git_diff_free(diffs); + FileHistoryEvent *fileHistoryEvent; + if ((baton->error_code = FileHistoryEvent::buildHistoryEvent( + &fileHistoryEvent, + repo, + currentCommit, + currentTree, + parentTree, + baton->file_path + )) != GIT_OK) { + git_tree_free(parentTree); + git_commit_free(parentCommit); + break; + } - if (parents == 1) { - if ((baton->error_code = git_diff_tree_to_tree(&diffs, repo, parentTree, thisTree, NULL)) != GIT_OK) { - git_commit_free(nextCommit); + switch (fileHistoryEvent->type) { + case GIT_DELTA_ADDED: { + fileExistsInCurrent = true; break; } - if ((baton->error_code = git_diff_find_similar(diffs, NULL)) != GIT_OK) { - git_commit_free(nextCommit); - break; - } - } else { - if ((baton->error_code = git_diff_tree_to_tree(&diffs, repo, NULL, thisTree, NULL)) != GIT_OK) { - git_commit_free(nextCommit); + case GIT_DELTA_MODIFIED: { + fileExistsInCurrent = true; + fileExistsInSomeParent = true; break; } - if((baton->error_code = git_diff_find_similar(diffs, NULL)) != GIT_OK) { - git_commit_free(nextCommit); + case GIT_DELTA_DELETED: { + fileExistsInSomeParent = true; break; } - } - - flag = false; - numDeltas = git_diff_num_deltas(diffs); - for (unsigned int j = 0; j < numDeltas; ++j) { - git_patch *nextPatch; - baton->error_code = git_patch_from_diff(&nextPatch, diffs, j); - - if (baton->error_code < GIT_OK) { + case GIT_DELTA_RENAMED: { + if (fileHistoryEvent->existsInCurrentTree) { + fileExistsInCurrent = true; + } else { + fileExistsInSomeParent = true; + } break; } - - if (nextPatch == NULL) { - continue; - } - - const git_diff_delta *delta = git_patch_get_delta(nextPatch); - bool isEqualOldFile = !strncmp(delta->old_file.path, baton->file_path, strlen(baton->file_path)); - bool isEqualNewFile = !strncmp(delta->new_file.path, baton->file_path, strlen(baton->file_path)); - int oldLen = strlen(delta->old_file.path); - int newLen = strlen(delta->new_file.path); - char *outPair = new char[oldLen + newLen + 2]; - strcpy(outPair, delta->new_file.path); - outPair[newLen] = '\n'; - outPair[newLen + 1] = '\0'; - strcat(outPair, delta->old_file.path); - - if (isEqualNewFile) { - std::pair > *historyEntry; - if (!isEqualOldFile || delta->status == GIT_DELTA_RENAMED) { - historyEntry = new std::pair >( - nextCommit, - std::pair(strdup(outPair), delta->status) - ); - } else { - historyEntry = new std::pair >( - nextCommit, - std::pair(strdup(delta->new_file.path), delta->status) - ); + case GIT_DELTA_UNMODIFIED: { + if (fileHistoryEvent->existsInCurrentTree) { + fileExistsInCurrent = true; + fileExistsInSomeParent = true; } - baton->out->push_back(historyEntry); - flag = true; - } else if (isEqualOldFile) { - std::pair > *historyEntry; - historyEntry = new std::pair >( - nextCommit, - std::pair(strdup(outPair), delta->status) - ); - baton->out->push_back(historyEntry); - flag = true; + firstMatchingParentIndex = std::make_pair(true, parentIndex); + break; } - - delete[] outPair; - - git_patch_free(nextPatch); - - if (flag) { + default: { break; } } - } - git_diff_free(diffs); + delete fileHistoryEvent; - if (!flag && nextCommit != NULL) { - git_commit_free(nextCommit); + if (firstMatchingParentIndex.first) { + git_commit_free(parentCommit); + git_tree_free(parentTree); + break; + } } if (baton->error_code != GIT_OK) { + git_tree_free(currentTree); + git_commit_free(currentCommit); break; } - } - free(nextOid); + if (!firstMatchingParentIndex.first) { + assert(fileExistsInCurrent || fileExistsInSomeParent); + git_delta_t mergeType = GIT_DELTA_UNREADABLE; // It will never result in this case because of the assertion above. + if (fileExistsInCurrent && fileExistsInSomeParent) { + mergeType = GIT_DELTA_MODIFIED; + } else if (fileExistsInCurrent) { + mergeType = GIT_DELTA_ADDED; + } else if (fileExistsInSomeParent) { + mergeType = GIT_DELTA_DELETED; + } - if (baton->error_code != GIT_OK) { - if (baton->error_code != GIT_ITEROVER) { - baton->error = git_error_dup(git_error_last()); + FileHistoryEvent *fileHistoryEvent = new FileHistoryEvent( + mergeType, + mergeType != GIT_DELTA_DELETED, + true, + currentCommit, + NULL, + NULL + ); + baton->out->push_back(fileHistoryEvent); + git_tree_free(currentTree); + git_commit_free(currentCommit); + continue; + } - while(!baton->out->empty()) - { - std::pair > *pairToFree = baton->out->back(); - baton->out->pop_back(); - git_commit_free(pairToFree->first); - free(pairToFree->second.first); - free(pairToFree); + assert(firstMatchingParentIndex.first); + for (unsigned int parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + if (parentIndex == firstMatchingParentIndex.second) { + continue; } - delete baton->out; + const git_oid *parentOid = git_commit_parent_id(currentCommit, parentIndex); + assert(parentOid != NULL); + git_revwalk_hide(baton->walk, parentOid); + } + git_commit_free(currentCommit); + git_tree_free(currentTree); + } - baton->out = NULL; + if (baton->error_code != GIT_OK && baton->error_code != GIT_ITEROVER) { + // Something went wrong in our loop, discard everything in the async worker + for (unsigned int i = 0; i < baton->out->size(); ++i) { + delete static_cast(baton->out->at(i)); } - } else { - baton->error_code = GIT_OK; + delete baton->out; + baton->out = NULL; + baton->error = git_error_dup(git_error_last()); } } void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() { if (baton->out != NULL) { - unsigned int size = baton->out->size(); - Local result = Nan::New(size); + const unsigned int size = baton->out->size(); + v8::Local result = Nan::New(size); for (unsigned int i = 0; i < size; i++) { - Local historyEntry = Nan::New(); - std::pair > *batonResult = baton->out->at(i); - Nan::Set(historyEntry, Nan::New("commit").ToLocalChecked(), GitCommit::New(batonResult->first, true)); - Nan::Set(historyEntry, Nan::New("status").ToLocalChecked(), Nan::New(batonResult->second.second)); - if (batonResult->second.second == GIT_DELTA_RENAMED) { - char *namePair = batonResult->second.first; - char *split = strchr(namePair, '\n'); - *split = '\0'; - char *oldName = split + 1; - - Nan::Set(historyEntry, Nan::New("oldName").ToLocalChecked(), Nan::New(oldName).ToLocalChecked()); - Nan::Set(historyEntry, Nan::New("newName").ToLocalChecked(), Nan::New(namePair).ToLocalChecked()); - } - Nan::Set(result, Nan::New(i), historyEntry); - - free(batonResult->second.first); - free(batonResult); + FileHistoryEvent *batonResult = static_cast(baton->out->at(i)); + Nan::Set(result, Nan::New(i), batonResult->toJavascript()); + delete batonResult; } - Local argv[2] = { + Nan::Set(result, Nan::New("reachedEndOfHistory").ToLocalChecked(), Nan::New(baton->error_code == GIT_ITEROVER)); + + v8::Local argv[2] = { Nan::Null(), result }; @@ -289,7 +439,7 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() } if (baton->error) { - Local err; + v8::Local err; if (baton->error->message) { err = Nan::Error(baton->error->message)->ToObject(); } else { @@ -297,7 +447,7 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); - Local argv[1] = { + v8::Local argv[1] = { err }; callback->Call(1, argv, async_resource); @@ -311,10 +461,10 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() } if (baton->error_code < 0) { - Local err = Nan::Error("Method next has thrown an error.")->ToObject(); + v8::Local err = Nan::Error("Method next has thrown an error.")->ToObject(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); - Local argv[1] = { + v8::Local argv[1] = { err }; callback->Call(1, argv, async_resource); From 6231c50ae5064e98775e1eed1babeb3da4ec9c71 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 16 May 2019 17:46:25 -0700 Subject: [PATCH 103/545] File history walk: include both new and old file paths when renamed --- generate/templates/manual/revwalk/file_history_walk.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 555149e13..24b5ad16f 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -44,9 +44,10 @@ class FileHistoryEvent { Nan::Set(historyEntry, Nan::New("status").ToLocalChecked(), Nan::New(type)); Nan::Set(historyEntry, Nan::New("isMergeCommit").ToLocalChecked(), Nan::New(isMergeCommit)); if (type == GIT_DELTA_RENAMED) { - if (existsInCurrentTree) { + if (from != NULL) { Nan::Set(historyEntry, Nan::New("oldName").ToLocalChecked(), Nan::New(from).ToLocalChecked()); - } else { + } + if (to != NULL) { Nan::Set(historyEntry, Nan::New("newName").ToLocalChecked(), Nan::New(to).ToLocalChecked()); } } @@ -100,7 +101,7 @@ class FileHistoryEvent { false, currentCommit, delta->old_file.path, - NULL + delta->new_file.path ); git_diff_free(diff); git_tree_entry_free(currentEntry); @@ -139,7 +140,7 @@ class FileHistoryEvent { false, false, currentCommit, - NULL, + delta->old_file.path, delta->new_file.path ); git_diff_free(diff); From e3ed916e498c31ccb8a2ed84f44ae27d6d23d4c8 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 16 May 2019 17:47:02 -0700 Subject: [PATCH 104/545] File history walk: include merge commit if trees have changed --- test/tests/revwalk.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/tests/revwalk.js b/test/tests/revwalk.js index 6c5865193..702bf35cf 100644 --- a/test/tests/revwalk.js +++ b/test/tests/revwalk.js @@ -234,6 +234,7 @@ describe("Revwalk", function() { }); magicShas = [ + "be6905d459f1b236e44b2445df25aff1783993e9", "4a34168b80fe706f52417106821c9cbfec630e47", "f80e085e3118bbd6aad49dad7c53bdc37088bf9b", "694b2d703a02501f288269bea7d1a5d643a83cc8", From 24cb2bfbb0f886ddfc022e6535756b7dc30a679e Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 20 May 2019 10:21:42 -0700 Subject: [PATCH 105/545] File history walk: memory management --- generate/templates/manual/revwalk/file_history_walk.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 24b5ad16f..49c23445e 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -352,10 +352,10 @@ void GitRevwalk::FileHistoryWalkWorker::Execute() } delete fileHistoryEvent; + git_commit_free(parentCommit); + git_tree_free(parentTree); - if (firstMatchingParentIndex.first) { - git_commit_free(parentCommit); - git_tree_free(parentTree); + if (firstMatchingParentIndex.first) { break; } } @@ -414,6 +414,8 @@ void GitRevwalk::FileHistoryWalkWorker::Execute() baton->out = NULL; baton->error = git_error_dup(git_error_last()); } + free((void *)baton->file_path); + baton->file_path = NULL; } void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() From 7d277261b1e42883cf3df87710a103795a344c16 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 20 May 2019 12:12:51 -0700 Subject: [PATCH 106/545] Bump to v0.25.0-alpha.11 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26400eda1..f86432772 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.25.0-alpha.11 [(2019-05-20)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.11) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.10...v0.25.0-alpha.11) + +#### Summary of changes +- Improve speed and correctness of fileHistoryWalk. The API should not have changed; however, when the end of the walk has been reached, `reachedEndOfHistory` will be specified on the resulting array. + +#### Merged PRs into NodeGit +- [Implement faster file history walk #1676](https://github.com/nodegit/nodegit/pull/1676) + + ## v0.25.0-alpha.10 [(2019-05-03)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.10) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.9...v0.25.0-alpha.10) diff --git a/package-lock.json b/package-lock.json index 5153839cc..0553fc82e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.10", + "version": "0.25.0-alpha.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3ffdeb2db..24813d442 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.10", + "version": "0.25.0-alpha.11", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 86b6dcb373264a54e88b99fc09f2a60e9415c8cd Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 21 May 2019 12:31:24 -0700 Subject: [PATCH 107/545] Clean up risky npm packages --- package-lock.json | 144 +++++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0553fc82e..7b9825c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1334,9 +1334,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -1905,14 +1905,14 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -1933,7 +1933,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -1957,7 +1957,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -1984,16 +1984,16 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -2042,7 +2042,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -2062,12 +2062,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -2128,16 +2128,16 @@ "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -2154,35 +2154,42 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, "needle": { - "version": "2.2.0", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -2199,13 +2206,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -2280,12 +2287,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -2315,16 +2322,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true }, @@ -2341,7 +2348,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -2392,17 +2399,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -2413,12 +2420,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -2427,7 +2434,7 @@ "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true } @@ -2564,28 +2571,22 @@ "dev": true }, "handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "requires": { - "lodash": "^4.17.11" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -3135,9 +3136,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3613,6 +3614,12 @@ } } }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "node-gyp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz", @@ -3627,7 +3634,7 @@ "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", - "tar": "^2.0.0", + "tar": "^4.4.8", "which": "1" } }, @@ -3858,6 +3865,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -3866,7 +3874,8 @@ "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true } } }, @@ -5303,25 +5312,28 @@ "optional": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.5.15", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", + "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", + "dev": true, "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, "optional": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "optional": true } } From 7489e69c30125ecac2adee2549c0a231436ab627 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 21 May 2019 12:36:07 -0700 Subject: [PATCH 108/545] Bump libssh2 to 1.8.2 --- vendor/libssh2/Makefile.in | 23 +- vendor/libssh2/NEWS | 79 +- vendor/libssh2/RELEASE-NOTES | 31 +- vendor/libssh2/aclocal.m4 | 191 ++--- vendor/libssh2/compile | 13 +- vendor/libssh2/config.guess | 920 ++++++++++----------- vendor/libssh2/config.sub | 418 +++++----- vendor/libssh2/configure | 204 ++--- vendor/libssh2/depcomp | 10 +- vendor/libssh2/docs/Makefile.in | 13 +- vendor/libssh2/example/Makefile.in | 133 ++- vendor/libssh2/example/libssh2_config.h.in | 11 +- vendor/libssh2/include/libssh2.h | 8 +- vendor/libssh2/install-sh | 551 ++++++++---- vendor/libssh2/ltmain.sh | 213 +++-- vendor/libssh2/m4/libtool.m4 | 21 +- vendor/libssh2/missing | 16 +- vendor/libssh2/src/Makefile.in | 142 +++- vendor/libssh2/src/channel.c | 26 +- vendor/libssh2/src/comp.c | 9 +- vendor/libssh2/src/kex.c | 24 + vendor/libssh2/src/libssh2_priv.h | 12 + vendor/libssh2/src/packet.c | 25 +- vendor/libssh2/src/session.c | 5 + vendor/libssh2/src/sftp.c | 317 +++++-- vendor/libssh2/src/transport.c | 26 +- vendor/libssh2/src/userauth.c | 55 +- vendor/libssh2/test-driver | 41 +- vendor/libssh2/tests/Makefile.in | 38 +- vendor/libssh2/win32/libssh2_config.h | 3 +- 30 files changed, 2190 insertions(+), 1388 deletions(-) diff --git a/vendor/libssh2/Makefile.in b/vendor/libssh2/Makefile.in index d95397cf0..61f9b1585 100644 --- a/vendor/libssh2/Makefile.in +++ b/vendor/libssh2/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -174,7 +174,7 @@ am__recursive_targets = \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck + cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -469,8 +469,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/Makefile.inc $(am__empty): @@ -642,7 +642,10 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -710,7 +713,7 @@ distdir: $(DISTFILES) ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir @@ -736,7 +739,7 @@ dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir @@ -754,7 +757,7 @@ dist dist-all: distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ @@ -764,7 +767,7 @@ distcheck: dist *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac diff --git a/vendor/libssh2/NEWS b/vendor/libssh2/NEWS index e3caaece5..a9c0a3f1b 100644 --- a/vendor/libssh2/NEWS +++ b/vendor/libssh2/NEWS @@ -1,5 +1,68 @@ Changelog for the libssh2 project. Generated with git2news.pl +Version 1.8.2 (25 Mar 2019) + +Daniel Stenberg (25 Mar 2019) +- RELEASE-NOTES: version 1.8.2 + +- [Will Cosgrove brought this change] + + moved MAX size declarations #330 + +- [Will Cosgrove brought this change] + + Fixed misapplied patch (#327) + + Fixes for user auth + +Version 1.8.1 (14 Mar 2019) + +Will Cosgrove (14 Mar 2019) +- [Michael Buckley brought this change] + + More 1.8.0 security fixes (#316) + + * Defend against possible integer overflows in comp_method_zlib_decomp. + + * Defend against writing beyond the end of the payload in _libssh2_transport_read(). + + * Sanitize padding_length - _libssh2_transport_read(). https://libssh2.org/CVE-2019-3861.html + + This prevents an underflow resulting in a potential out-of-bounds read if a server sends a too-large padding_length, possibly with malicious intent. + + * Prevent zero-byte allocation in sftp_packet_read() which could lead to an out-of-bounds read. https://libssh2.org/CVE-2019-3858.html + + * Check the length of data passed to sftp_packet_add() to prevent out-of-bounds reads. + + * Add a required_size parameter to sftp_packet_require et. al. to require callers of these functions to handle packets that are too short. https://libssh2.org/CVE-2019-3860.html + + * Additional length checks to prevent out-of-bounds reads and writes in _libssh2_packet_add(). https://libssh2.org/CVE-2019-3862.html + +GitHub (14 Mar 2019) +- [Will Cosgrove brought this change] + + 1.8 Security fixes (#314) + + * fixed possible integer overflow in packet_length + + CVE https://www.libssh2.org/CVE-2019-3861.html + + * fixed possible interger overflow with userauth_keyboard_interactive + + CVE https://www.libssh2.org/CVE-2019-3856.html + + * fixed possible out zero byte/incorrect bounds allocation + + CVE https://www.libssh2.org/CVE-2019-3857.html + + * bounds checks for response packets + + * fixed integer overflow in userauth_keyboard_interactive + + CVE https://www.libssh2.org/CVE-2019-3863.html + + * 1.8.1 release notes + Version 1.8.0 (25 Oct 2016) Daniel Stenberg (25 Oct 2016) @@ -5473,19 +5536,3 @@ Simon Josefsson (16 Nov 2009) Reported by Steven Van Ingelgem in . - -- Mention libssh2-style.el. - -- Use memmove instead of memcpy on overlapping memory areas. - - Reported by Bob Alexander in - . - -- Add. - -- Protect against crash on too small SSH_MSG_IGNORE packets. - - Reported by Bob Alexander - in . - -- add copyright line diff --git a/vendor/libssh2/RELEASE-NOTES b/vendor/libssh2/RELEASE-NOTES index 5b78ede38..d566bafe0 100644 --- a/vendor/libssh2/RELEASE-NOTES +++ b/vendor/libssh2/RELEASE-NOTES @@ -1,31 +1,12 @@ -libssh2 1.8.0 - -This release includes the following changes: - - o added a basic dockerised test suite - o crypto: add support for the mbedTLS backend +libssh2 1.8.2 This release includes the following bugfixes: - o libgcrypt: fixed a NULL pointer dereference on OOM - o VMS: can't use %zd for off_t format - o VMS: update vms/libssh2_config.h - o windows: link with crypt32.lib - o libssh2_channel_open: speeling error fixed in channel error message - o msvc: fixed 14 compilation warnings - o tests: HAVE_NETINET_IN_H was not defined correctly - o openssl: add OpenSSL 1.1.0 compatibility - o cmake: Add CLEAR_MEMORY option, analogously to that for autoconf - o configure: make the --with-* options override the OpenSSL default - o libssh2_wait_socket: set err_msg on errors - o libssh2_wait_socket: Fix comparison with api_timeout to use milliseconds - + o Fixed the misapplied userauth patch that broke 1.8.1 + o moved the MAX size declarations from the public header + This release would not have looked like this without help, code, reports and advice from friends like these: - Alexander Lamaison, Antenore Gatta, Brad Harder, Charles Collicutt, - Craig A. Berry, Dan Fandrich, Daniel Stenberg, Kamil Dudka, Keno Fischer, - Taylor Holberton, Viktor Szakats, Will Cosgrove, Zenju - (12 contributors) - - Thanks! (and sorry if I forgot to mention someone) + Will Cosgrove + (1 contributors) diff --git a/vendor/libssh2/aclocal.m4 b/vendor/libssh2/aclocal.m4 index 41ad8c694..35a317296 100644 --- a/vendor/libssh2/aclocal.m4 +++ b/vendor/libssh2/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- +# generated automatically by aclocal 1.16.1 -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.15' +[am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.15], [], +m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15])dnl +[AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -332,13 +332,12 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. - # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], @@ -346,49 +345,41 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) shift - for mf + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf do # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -397,18 +388,17 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will -# need in order to bootstrap the dependency handling code. +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -495,8 +485,8 @@ AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: -# -# +# +# AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. @@ -563,7 +553,7 @@ END Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . +that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM @@ -605,7 +595,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -626,7 +616,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 2003-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -648,7 +638,7 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -683,7 +673,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -691,49 +681,42 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # AM_MAKE_INCLUDE() # ----------------- -# Check to see how make treats includes. +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' am__doit: - @echo this is the am__doit target + @echo this is the am__doit target >confinc.out .PHONY: am__doit END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -772,7 +755,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -801,7 +784,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -848,7 +831,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -867,7 +850,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -948,7 +931,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# Copyright (C) 2009-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1008,7 +991,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1036,7 +1019,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1055,7 +1038,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/vendor/libssh2/compile b/vendor/libssh2/compile index a85b723c7..99e50524b 100755 --- a/vendor/libssh2/compile +++ b/vendor/libssh2/compile @@ -1,9 +1,9 @@ #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. -scriptversion=2012-10-14.11; # UTC +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -17,7 +17,7 @@ scriptversion=2012-10-14.11; # UTC # 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, see . +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -255,7 +255,8 @@ EOF echo "compile $scriptversion" exit $? ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac @@ -339,9 +340,9 @@ exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/vendor/libssh2/config.guess b/vendor/libssh2/config.guess index d622a44e5..f50dcdb6d 100755 --- a/vendor/libssh2/config.guess +++ b/vendor/libssh2/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2018 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2018-02-24' # This file 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 +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,24 +15,22 @@ timestamp='2012-02-10' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + me=`echo "$0" | sed -e 's,.*/,,'` @@ -43,7 +39,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -113,9 +107,9 @@ trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; + ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; @@ -138,9 +132,37 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval "$set_cc_for_build" + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -153,21 +175,31 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -182,40 +214,67 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in + case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -232,63 +291,54 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos + echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos + echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition @@ -300,9 +350,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} + echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -327,38 +377,38 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} + echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" + eval "$set_cc_for_build" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in @@ -367,25 +417,25 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} + echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not @@ -396,44 +446,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} + echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} + echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} + echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} + echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} + echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} + echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} + echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} + echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -442,23 +492,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} + echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax @@ -484,17 +534,17 @@ EOF AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] then - echo m88k-dg-dgux${UNAME_RELEASE} + echo m88k-dg-dgux"$UNAME_RELEASE" else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else - echo i586-dg-dgux${UNAME_RELEASE} + echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) @@ -511,7 +561,7 @@ EOF echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id @@ -523,14 +573,14 @@ EOF if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -541,7 +591,7 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else @@ -555,26 +605,27 @@ EOF exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx @@ -589,28 +640,28 @@ EOF echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + if [ "$HP_ARCH" = "" ]; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include @@ -643,13 +694,13 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ "$HP_ARCH" = hppa2.0w ] then - eval $set_cc_for_build + eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -660,23 +711,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -701,11 +752,11 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) @@ -714,7 +765,7 @@ EOF *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) @@ -722,9 +773,9 @@ EOF exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + echo "$UNAME_MACHINE"-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) @@ -749,124 +800,109 @@ EOF echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} + echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in + case "$UNAME_PROCESSOR" in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin + echo "$UNAME_MACHINE"-pc-cygwin exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 + echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) - case ${UNAME_MACHINE} in + case "$UNAME_MACHINE" in x86) - echo i586-pc-interix${UNAME_RELEASE} + echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} + echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) - echo ia64-unknown-interix${UNAME_RELEASE} + echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin + echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix + echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -879,63 +915,64 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) - eval $set_cc_for_build + eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el @@ -949,55 +986,74 @@ EOF #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + if objdump -f /bin/sh | grep -q elf32-x86-64; then + echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 + else + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + fi exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1011,34 +1067,34 @@ EOF # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx + echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop + echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos + echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable + echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} + echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp + echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) @@ -1048,12 +1104,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1063,9 +1119,9 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv32 + echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) @@ -1073,7 +1129,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1085,9 +1141,9 @@ EOF exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) @@ -1107,9 +1163,9 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; @@ -1118,28 +1174,28 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} + echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} + echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} + echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} + echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} + echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 @@ -1150,7 +1206,7 @@ EOF *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi @@ -1170,23 +1226,23 @@ EOF exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos + echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} + echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + echo mips-nec-sysv"$UNAME_RELEASE" else - echo mips-unknown-sysv${UNAME_RELEASE} + echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. @@ -1201,66 +1257,97 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} + echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} + echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} + echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} + echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} + echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} + echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux @@ -1269,18 +1356,18 @@ EOF echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi - echo ${UNAME_MACHINE}-unknown-plan9 + echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 @@ -1301,14 +1388,14 @@ EOF echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} + echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in + case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; @@ -1317,185 +1404,48 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos + echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros + echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif +echo "$0: unable to guess system type" >&2 -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 < -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} +NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize +the system type. Please install a C compiler and try again. EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi + ;; +esac cat >&2 < in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. config.guess timestamp = $timestamp @@ -1514,16 +1464,16 @@ hostinfo = `(hostinfo) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/vendor/libssh2/config.sub b/vendor/libssh2/config.sub index c894da455..1d8e98bce 100755 --- a/vendor/libssh2/config.sub +++ b/vendor/libssh2/config.sub @@ -1,36 +1,31 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2018 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2018-02-22' -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file 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 +# This file 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 3 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. +# 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, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -38,7 +33,7 @@ timestamp='2012-02-10' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -58,12 +53,11 @@ timestamp='2012-02-10' me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -73,9 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -102,7 +94,7 @@ while test $# -gt 0 ; do *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -120,24 +112,24 @@ esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` + basic_machine=`echo "$1" | sed 's/-[^-]*$//'` + if [ "$basic_machine" != "$1" ] + then os=`echo "$1" | sed 's/.*-/-/'` else os=; fi ;; esac @@ -156,7 +148,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) + -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; @@ -186,53 +178,56 @@ case $os in ;; -sco6) os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ;; -psos*) os=-psos @@ -253,21 +248,25 @@ case $basic_machine in | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ | bfin \ - | c4x | clipper \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ - | i370 | i860 | i960 | ia64 \ + | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ + | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -281,26 +280,30 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ - | nios | nios2 \ + | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ @@ -308,7 +311,8 @@ case $basic_machine in | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ + | visium \ + | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown @@ -322,11 +326,14 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; ms1) basic_machine=mt-unknown @@ -355,7 +362,7 @@ case $basic_machine in ;; # Object if more than one company name word. *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. @@ -364,26 +371,29 @@ case $basic_machine in | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ + | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ + | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ + | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -397,28 +407,34 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ | pyramid-* \ + | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ @@ -426,6 +442,8 @@ case $basic_machine in | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ + | visium-* \ + | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -439,7 +457,7 @@ case $basic_machine in # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) - basic_machine=i386-unknown + basic_machine=i386-pc os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) @@ -473,7 +491,7 @@ case $basic_machine in basic_machine=x86_64-pc ;; amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl @@ -502,6 +520,9 @@ case $basic_machine in basic_machine=i386-pc os=-aros ;; + asmjs) + basic_machine=asmjs-unknown + ;; aux) basic_machine=m68k-apple os=-aux @@ -515,7 +536,7 @@ case $basic_machine in os=-linux ;; blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) @@ -523,13 +544,13 @@ case $basic_machine in os=-cnk ;; c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray @@ -618,10 +639,18 @@ case $basic_machine in basic_machine=rs6000-bull os=-bosx ;; - dpx2* | dpx2*-bull) + dpx2*) basic_machine=m68k-bull os=-sysv3 ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=$os"spe" + ;; ebmon29k) basic_machine=a29k-amd os=-ebmon @@ -711,9 +740,6 @@ case $basic_machine in hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; - hppa-next) - os=-nextstep3 - ;; hppaosf) basic_machine=hppa1.1-hp os=-osf @@ -726,26 +752,26 @@ case $basic_machine in basic_machine=i370-ibm ;; i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; - i386-vsta | vsta) + vsta) basic_machine=i386-unknown os=-vsta ;; @@ -763,17 +789,17 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` + ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; - m88k-omron*) - basic_machine=m88k-omron - ;; magnum | m3230) basic_machine=mips-mips os=-sysv @@ -782,11 +808,15 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; - microblaze) + microblaze*) basic_machine=microblaze-xilinx ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; mingw32) - basic_machine=i386-pc + basic_machine=i686-pc os=-mingw32 ;; mingw32ce) @@ -801,10 +831,10 @@ case $basic_machine in os=-mint ;; mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k @@ -814,15 +844,19 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) - basic_machine=i386-pc + basic_machine=i686-pc os=-msys ;; mvs) @@ -861,7 +895,7 @@ case $basic_machine in basic_machine=v70-nec os=-sysv ;; - next | m*-next ) + next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) @@ -906,6 +940,12 @@ case $basic_machine in nsr-tandem) basic_machine=nsr-tandem ;; + nsv-tandem) + basic_machine=nsv-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf @@ -938,7 +978,7 @@ case $basic_machine in os=-linux ;; parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) @@ -954,7 +994,7 @@ case $basic_machine in basic_machine=i386-pc ;; pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc @@ -969,16 +1009,16 @@ case $basic_machine in basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould @@ -988,23 +1028,23 @@ case $basic_machine in ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; - ppcle | powerpclittle | ppc-le | powerpc-little) + ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) + ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm @@ -1013,7 +1053,11 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) basic_machine=i386-pc os=-rdos ;; @@ -1054,17 +1098,10 @@ case $basic_machine in sequent) basic_machine=i386-sequent ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; sh5el) basic_machine=sh5le-unknown ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) + simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; @@ -1083,7 +1120,7 @@ case $basic_machine in os=-sysv4 ;; strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun @@ -1205,6 +1242,9 @@ case $basic_machine in basic_machine=hppa1.1-winbond os=-proelf ;; + x64) + basic_machine=x86_64-pc + ;; xbox) basic_machine=i686-pc os=-mingw32 @@ -1213,20 +1253,12 @@ case $basic_machine in basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; none) basic_machine=none-none os=-none @@ -1255,10 +1287,6 @@ case $basic_machine in vax) basic_machine=vax-dec ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; pdp11) basic_machine=pdp11-dec ;; @@ -1268,9 +1296,6 @@ case $basic_machine in sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; cydra) basic_machine=cydra-cydrome ;; @@ -1290,7 +1315,7 @@ case $basic_machine in # Make sure to match an already-canonicalized machine name. ;; *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac @@ -1298,10 +1323,10 @@ esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; @@ -1312,8 +1337,8 @@ esac if [ x"$os" != x"" ] then case $os in - # First match some system type aliases - # that might get confused with valid system types. + # First match some system type aliases that might get confused + # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux @@ -1324,45 +1349,48 @@ case $os in -solaris) os=-solaris2 ;; - -svr4*) - os=-sysv4 - ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; - # First accept the basic system types. + # es1800 is here to avoid being matched by es* (a different OS) + -es1800*) + os=-ose + ;; + # Now accept the basic system types. # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. + # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ + | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ + | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ + | -midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1379,12 +1407,12 @@ case $os in -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + -sim | -xray | -os68k* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) - os=`echo $os | sed -e 's|mac|macos|'` + os=`echo "$os" | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc @@ -1393,10 +1421,10 @@ case $os in os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition @@ -1407,12 +1435,6 @@ case $os in -wince*) os=-wince ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; -utek*) os=-bsd ;; @@ -1437,7 +1459,7 @@ case $os in -nova*) os=-rtmk-nova ;; - -ns2 ) + -ns2) os=-nextstep2 ;; -nsk*) @@ -1459,7 +1481,7 @@ case $os in -oss*) os=-sysv3 ;; - -svr4) + -svr4*) os=-sysv4 ;; -svr3) @@ -1474,35 +1496,38 @@ case $os in -ose*) os=-ose ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; -nacl*) ;; + -ios) + ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac @@ -1537,6 +1562,12 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; tic54x-*) os=-coff ;; @@ -1586,12 +1617,12 @@ case $basic_machine in sparc-* | *-sun) os=-sunos4.1.1 ;; + pru-*) + os=-elf + ;; *-be) os=-beos ;; - *-haiku) - os=-haiku - ;; *-ibm) os=-aix ;; @@ -1631,7 +1662,7 @@ case $basic_machine in m88k-omron*) os=-luna ;; - *-next ) + *-next) os=-nextstep ;; *-sequent) @@ -1646,9 +1677,6 @@ case $basic_machine in i370-*) os=-mvs ;; - *-next) - os=-nextstep3 - ;; *-gould) os=-sysv ;; @@ -1758,15 +1786,15 @@ case $basic_machine in vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$basic_machine$os" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/vendor/libssh2/configure b/vendor/libssh2/configure index d891378d0..ac4d4931c 100755 --- a/vendor/libssh2/configure +++ b/vendor/libssh2/configure @@ -709,7 +709,6 @@ am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE -am__quote am__include DEPDIR OBJEXT @@ -797,7 +796,8 @@ PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR -SHELL' +SHELL +am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking @@ -2544,7 +2544,7 @@ $as_echo "$as_me: WARNING: sed was not found, this may ruin your chances to buil fi LIBSSH2VER=`$SED -ne 's/^#define LIBSSH2_VERSION *"\(.*\)"/\1/p' ${srcdir}/include/libssh2.h` -am__api_version='1.15' +am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -3050,8 +3050,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: -# -# +# +# mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The @@ -3102,7 +3102,7 @@ END Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . +that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM @@ -3255,45 +3255,45 @@ DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" - -am_make=${MAKE-make} -cat > confinc << 'END' +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' am__doit: - @echo this is the am__doit target + @echo this is the am__doit target >confinc.out .PHONY: am__doit END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +$as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : @@ -7980,11 +7980,8 @@ _LT_EOF test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -10064,6 +10061,12 @@ lt_prog_compiler_static= lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; + # flang / f18. f95 an alias for gfortran or flang on Debian + flang* | f18* | f95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) @@ -19338,7 +19341,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout @@ -20242,29 +20245,35 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac shift - for mf + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf do # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -20282,53 +20291,48 @@ $as_echo X"$mf" | q } s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } - /^X\(\/\/\)$/{ + /^X\/\(\/\/\)$/{ s//\1/ q } - /^X\(\/\).*/{ + /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk } ;; "libtool":C) diff --git a/vendor/libssh2/depcomp b/vendor/libssh2/depcomp index fc98710e2..65cbf7093 100755 --- a/vendor/libssh2/depcomp +++ b/vendor/libssh2/depcomp @@ -1,9 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2013-05-30.07; # UTC +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2018 Free Software Foundation, Inc. # 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 @@ -16,7 +16,7 @@ scriptversion=2013-05-30.07; # UTC # 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, see . +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -783,9 +783,9 @@ exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/vendor/libssh2/docs/Makefile.in b/vendor/libssh2/docs/Makefile.in index 857a39315..7ba7369e9 100644 --- a/vendor/libssh2/docs/Makefile.in +++ b/vendor/libssh2/docs/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -498,8 +498,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -566,7 +566,10 @@ ctags CTAGS: cscope cscopelist: -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ diff --git a/vendor/libssh2/example/Makefile.in b/vendor/libssh2/example/Makefile.in index 87f9f1286..ca43d33ec 100644 --- a/vendor/libssh2/example/Makefile.in +++ b/vendor/libssh2/example/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -227,7 +227,19 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/direct_tcpip.Po ./$(DEPDIR)/scp.Po \ + ./$(DEPDIR)/scp_nonblock.Po ./$(DEPDIR)/scp_write.Po \ + ./$(DEPDIR)/scp_write_nonblock.Po ./$(DEPDIR)/sftp.Po \ + ./$(DEPDIR)/sftp_RW_nonblock.Po ./$(DEPDIR)/sftp_append.Po \ + ./$(DEPDIR)/sftp_mkdir.Po ./$(DEPDIR)/sftp_mkdir_nonblock.Po \ + ./$(DEPDIR)/sftp_nonblock.Po ./$(DEPDIR)/sftp_write.Po \ + ./$(DEPDIR)/sftp_write_nonblock.Po \ + ./$(DEPDIR)/sftp_write_sliding.Po ./$(DEPDIR)/sftpdir.Po \ + ./$(DEPDIR)/sftpdir_nonblock.Po ./$(DEPDIR)/ssh2.Po \ + ./$(DEPDIR)/ssh2_agent.Po ./$(DEPDIR)/ssh2_echo.Po \ + ./$(DEPDIR)/ssh2_exec.Po ./$(DEPDIR)/subsystem_netconf.Po \ + ./$(DEPDIR)/tcpip-forward.Po ./$(DEPDIR)/x11.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -459,8 +471,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -590,29 +602,35 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/direct_tcpip.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp_nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp_write.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp_write_nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_RW_nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_append.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_mkdir.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_mkdir_nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_write.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_write_nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_write_sliding.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpdir.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpdir_nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_agent.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_echo.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_exec.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subsystem_netconf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcpip-forward.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x11.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/direct_tcpip.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp_nonblock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp_write.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp_write_nonblock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_RW_nonblock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_append.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_mkdir.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_mkdir_nonblock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_nonblock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_write.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_write_nonblock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp_write_sliding.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpdir.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpdir_nonblock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_agent.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_echo.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_exec.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subsystem_netconf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcpip-forward.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x11.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -693,7 +711,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -763,7 +784,29 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/direct_tcpip.Po + -rm -f ./$(DEPDIR)/scp.Po + -rm -f ./$(DEPDIR)/scp_nonblock.Po + -rm -f ./$(DEPDIR)/scp_write.Po + -rm -f ./$(DEPDIR)/scp_write_nonblock.Po + -rm -f ./$(DEPDIR)/sftp.Po + -rm -f ./$(DEPDIR)/sftp_RW_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_append.Po + -rm -f ./$(DEPDIR)/sftp_mkdir.Po + -rm -f ./$(DEPDIR)/sftp_mkdir_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_write.Po + -rm -f ./$(DEPDIR)/sftp_write_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_write_sliding.Po + -rm -f ./$(DEPDIR)/sftpdir.Po + -rm -f ./$(DEPDIR)/sftpdir_nonblock.Po + -rm -f ./$(DEPDIR)/ssh2.Po + -rm -f ./$(DEPDIR)/ssh2_agent.Po + -rm -f ./$(DEPDIR)/ssh2_echo.Po + -rm -f ./$(DEPDIR)/ssh2_exec.Po + -rm -f ./$(DEPDIR)/subsystem_netconf.Po + -rm -f ./$(DEPDIR)/tcpip-forward.Po + -rm -f ./$(DEPDIR)/x11.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags @@ -809,7 +852,29 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/direct_tcpip.Po + -rm -f ./$(DEPDIR)/scp.Po + -rm -f ./$(DEPDIR)/scp_nonblock.Po + -rm -f ./$(DEPDIR)/scp_write.Po + -rm -f ./$(DEPDIR)/scp_write_nonblock.Po + -rm -f ./$(DEPDIR)/sftp.Po + -rm -f ./$(DEPDIR)/sftp_RW_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_append.Po + -rm -f ./$(DEPDIR)/sftp_mkdir.Po + -rm -f ./$(DEPDIR)/sftp_mkdir_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_write.Po + -rm -f ./$(DEPDIR)/sftp_write_nonblock.Po + -rm -f ./$(DEPDIR)/sftp_write_sliding.Po + -rm -f ./$(DEPDIR)/sftpdir.Po + -rm -f ./$(DEPDIR)/sftpdir_nonblock.Po + -rm -f ./$(DEPDIR)/ssh2.Po + -rm -f ./$(DEPDIR)/ssh2_agent.Po + -rm -f ./$(DEPDIR)/ssh2_echo.Po + -rm -f ./$(DEPDIR)/ssh2_exec.Po + -rm -f ./$(DEPDIR)/subsystem_netconf.Po + -rm -f ./$(DEPDIR)/tcpip-forward.Po + -rm -f ./$(DEPDIR)/x11.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -830,9 +895,9 @@ uninstall-am: .MAKE: all install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ diff --git a/vendor/libssh2/example/libssh2_config.h.in b/vendor/libssh2/example/libssh2_config.h.in index af4ab9ca0..307c62553 100644 --- a/vendor/libssh2/example/libssh2_config.h.in +++ b/vendor/libssh2/example/libssh2_config.h.in @@ -64,8 +64,8 @@ /* Define if you have the gcrypt library. */ #undef HAVE_LIBGCRYPT -/* Define if you have the mbedtls library. */ -#undef HAVE_LIBMBEDTLS +/* Define if you have the mbedcrypto library. */ +#undef HAVE_LIBMBEDCRYPTO /* Define if you have the ssl library. */ #undef HAVE_LIBSSL @@ -79,6 +79,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `memset_s' function. */ +#undef HAVE_MEMSET_S + /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H @@ -178,10 +181,10 @@ /* Use mbedtls */ #undef LIBSSH2_MBEDTLS -/* Use OpenSSL */ +/* Use openssl */ #undef LIBSSH2_OPENSSL -/* Use Windows CNG */ +/* Use wincng */ #undef LIBSSH2_WINCNG /* Define to the sub-directory where libtool stores uninstalled libraries. */ diff --git a/vendor/libssh2/include/libssh2.h b/vendor/libssh2/include/libssh2.h index 34d284210..fdcf6163d 100644 --- a/vendor/libssh2/include/libssh2.h +++ b/vendor/libssh2/include/libssh2.h @@ -46,13 +46,13 @@ to make the BANNER define (used by src/session.c) be a valid SSH banner. Release versions have no appended strings and may of course not have dashes either. */ -#define LIBSSH2_VERSION "1.8.0" +#define LIBSSH2_VERSION "1.8.2" /* The numeric version number is also available "in parts" by using these defines: */ #define LIBSSH2_VERSION_MAJOR 1 #define LIBSSH2_VERSION_MINOR 8 -#define LIBSSH2_VERSION_PATCH 0 +#define LIBSSH2_VERSION_PATCH 2 /* This is the numeric version of the libssh2 version number, meant for easier parsing and comparions by programs. The LIBSSH2_VERSION_NUM define will @@ -69,7 +69,7 @@ and it is always a greater number in a more recent release. It makes comparisons with greater than and less than work. */ -#define LIBSSH2_VERSION_NUM 0x010800 +#define LIBSSH2_VERSION_NUM 0x010802 /* * This is the date and time when the full source package was created. The @@ -80,7 +80,7 @@ * * "Mon Feb 12 11:35:33 UTC 2007" */ -#define LIBSSH2_TIMESTAMP "Tue Oct 25 06:44:33 UTC 2016" +#define LIBSSH2_TIMESTAMP "Mon Mar 25 19:29:57 UTC 2019" #ifndef RC_INVOKED diff --git a/vendor/libssh2/install-sh b/vendor/libssh2/install-sh index 4d4a9519e..8175c640f 100755 --- a/vendor/libssh2/install-sh +++ b/vendor/libssh2/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2005-05-14.22 +scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -35,42 +35,57 @@ scriptversion=2005-05-14.22 # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it +# 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. +# from scratch. -# set DOITPROG to echo to test this script +tab=' ' +nl=' +' +IFS=" $tab$nl" -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" +# Set DOITPROG to "echo" to test this script. -# put in absolute paths if you don't have them in your path; or use env. vars. +doit=${DOITPROG-} +doit_exec=${doit:-exec} -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 -chmodcmd="$chmodprog 0755" -chowncmd= chgrpcmd= -stripcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog rmcmd="$rmprog -f" -mvcmd="$mvprog" +stripcmd= + src= dst= dir_arg= -dstarg= -no_target_directory= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly -usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... @@ -80,108 +95,168 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --c (ignored) --d create directories instead of installing files. --g GROUP $chgrpprog installed files to GROUP. --m MODE $chmodprog installed files to MODE. --o USER $chownprog installed files to USER. --s $stripprog installed files. --t DIRECTORY install into DIRECTORY. --T report an error if DSTFILE is a directory. ---help display this help and exit. ---version display version info and exit. + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG " -while test -n "$1"; do +while test $# -ne 0; do case $1 in - -c) shift - continue;; + -c) ;; - -d) dir_arg=true - shift - continue;; + -C) copy_on_change=true;; + + -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; + shift;; --help) echo "$usage"; exit $?;; - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift - shift - continue;; + shift;; - -s) stripcmd=$stripprog - shift - continue;; + -s) stripcmd=$stripprog;; - -t) dstarg=$2 - shift - shift - continue;; + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; - -T) no_target_directory=true - shift - continue;; + -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; - *) # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - test -n "$dir_arg$dstarg" && break - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dstarg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dstarg" - shift # fnord - fi - shift # arg - dstarg=$arg - done - break;; + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; esac + shift done -if test -z "$1"; then +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi - # It's OK to call `install-sh -d' without argument. + # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + for src do - # Protect names starting with `-'. + # Protect names problematic for 'test' and other utilities. case $src in - -*) src=./$src ;; + -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src - src= - - if test -d "$dst"; then - mkdircmd=: - chmodcmd= - else - mkdircmd=$mkdirprog - fi + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. @@ -190,82 +265,193 @@ do exit 1 fi - if test -z "$dstarg"; then + if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi + dst=$dst_arg - dst=$dstarg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst ;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. + # If destination is a directory, append the input filename. if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dstarg: Is a directory" >&2 - exit 1 + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi - dst=$dst/`basename "$src"` + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? fi fi - # This sed command emulates the dirname command. - dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac - # Make sure that the destination directory exists. + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac - # Skip lots of stat calls in the usual case. - if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else - oIFS=$IFS - # Some sh's can't handle IFS=/ for some reason. - IFS='%' - set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` - shift - IFS=$oIFS + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. - pathcomp= + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac - while test $# -ne 0 ; do - pathcomp=$pathcomp$1 + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir shift - if test ! -d "$pathcomp"; then - $mkdirprog "$pathcomp" - # mkdir can fail with a `File exist' error in case several - # install-sh are creating the directory concurrently. This - # is OK. - test -d "$pathcomp" || exit + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi - pathcomp=$pathcomp/ - done + fi fi if test -n "$dir_arg"; then - $doit $mkdircmd "$dst" \ - && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } - + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else - dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. - $doit $cpprog "$src" "$dsttmp" && + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -273,51 +459,60 @@ do # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && - - # Now rename the file to the real destination. - { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ - || { - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - if test -f "$dstdir/$dstfile"; then - $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ - || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ - || { - echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 - (exit 1); exit 1 - } - else - : - fi - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" - } - } - fi || { (exit 1); exit 1; } + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi done -# The final little trick to "correctly" pass the exit status to the exit trap. -{ - (exit 0); exit 0 -} - # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" # End: diff --git a/vendor/libssh2/ltmain.sh b/vendor/libssh2/ltmain.sh index a736cf994..f402c9c17 100644 --- a/vendor/libssh2/ltmain.sh +++ b/vendor/libssh2/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-2" +VERSION="2.4.6 Debian-2.4.6-10" package_revision=2.4.6 @@ -1370,7 +1370,7 @@ func_lt_ver () #! /bin/sh # Set a version string for this script. -scriptversion=2014-01-07.03; # UTC +scriptversion=2015-10-07.11; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 @@ -1530,6 +1530,8 @@ func_run_hooks () { $debug_cmd + _G_rc_run_hooks=false + case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; @@ -1538,16 +1540,16 @@ func_run_hooks () eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do - eval $_G_hook '"$@"' - - # store returned options list back into positional - # parameters for next 'cmd' execution. - eval _G_hook_result=\$${_G_hook}_result - eval set dummy "$_G_hook_result"; shift + if eval $_G_hook '"$@"'; then + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + _G_rc_run_hooks=: + fi done - func_quote_for_eval ${1+"$@"} - func_run_hooks_result=$func_quote_for_eval_result + $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result } @@ -1557,10 +1559,16 @@ func_run_hooks () ## --------------- ## # In order to add your own option parsing hooks, you must accept the -# full positional parameter list in your hook function, remove any -# options that you action, and then pass back the remaining unprocessed +# full positional parameter list in your hook function, you may remove/edit +# any options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for -# 'eval'. Like this: +# 'eval'. In this case you also must return $EXIT_SUCCESS to let the +# hook's caller know that it should pay attention to +# '_result'. Returning $EXIT_FAILURE signalizes that +# arguments are left untouched by the hook and therefore caller will ignore the +# result variable. +# +# Like this: # # my_options_prep () # { @@ -1570,9 +1578,11 @@ func_run_hooks () # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' -# -# func_quote_for_eval ${1+"$@"} -# my_options_prep_result=$func_quote_for_eval_result +# # No change in '$@' (ignored completely by this hook). There is +# # no need to do the equivalent (but slower) action: +# # func_quote_for_eval ${1+"$@"} +# # my_options_prep_result=$func_quote_for_eval_result +# false # } # func_add_hook func_options_prep my_options_prep # @@ -1581,25 +1591,37 @@ func_run_hooks () # { # $debug_cmd # +# args_changed=false +# # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in -# --silent|-s) opt_silent=: ;; +# --silent|-s) opt_silent=: +# args_changed=: +# ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift +# args_changed=: # ;; -# *) set dummy "$_G_opt" "$*"; shift; break ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@", we could need that later +# # if $args_changed is true. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # -# func_quote_for_eval ${1+"$@"} -# my_silent_option_result=$func_quote_for_eval_result +# if $args_changed; then +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# fi +# +# $args_changed # } # func_add_hook func_parse_options my_silent_option # @@ -1611,16 +1633,32 @@ func_run_hooks () # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # -# func_quote_for_eval ${1+"$@"} -# my_option_validation_result=$func_quote_for_eval_result +# false # } # func_add_hook func_validate_options my_option_validation # -# You'll alse need to manually amend $usage_message to reflect the extra +# You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + _G_func_options_finish_exit=false + if func_run_hooks func_options ${1+"$@"}; then + func_options_finish_result=$func_run_hooks_result + _G_func_options_finish_exit=: + fi + + $_G_func_options_finish_exit +} + + # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the @@ -1630,17 +1668,28 @@ func_options () { $debug_cmd - func_options_prep ${1+"$@"} - eval func_parse_options \ - ${func_options_prep_result+"$func_options_prep_result"} - eval func_validate_options \ - ${func_parse_options_result+"$func_parse_options_result"} + _G_rc_options=false - eval func_run_hooks func_options \ - ${func_validate_options_result+"$func_validate_options_result"} + for my_func in options_prep parse_options validate_options options_finish + do + if eval func_$my_func '${1+"$@"}'; then + eval _G_res_var='$'"func_${my_func}_result" + eval set dummy "$_G_res_var" ; shift + _G_rc_options=: + fi + done + + # Save modified positional parameters for caller. As a top-level + # options-parser function we always need to set the 'func_options_result' + # variable (regardless the $_G_rc_options value). + if $_G_rc_options; then + func_options_result=$_G_res_var + else + func_quote_for_eval ${1+"$@"} + func_options_result=$func_quote_for_eval_result + fi - # save modified positional parameters for caller - func_options_result=$func_run_hooks_result + $_G_rc_options } @@ -1649,9 +1698,9 @@ func_options () # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and -# needs to propogate that back to rest of this script, then the complete +# needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before -# returning. +# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). func_hookable func_options_prep func_options_prep () { @@ -1661,10 +1710,14 @@ func_options_prep () opt_verbose=false opt_warning_types= - func_run_hooks func_options_prep ${1+"$@"} + _G_rc_options_prep=false + if func_run_hooks func_options_prep ${1+"$@"}; then + _G_rc_options_prep=: + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result + fi - # save modified positional parameters for caller - func_options_prep_result=$func_run_hooks_result + $_G_rc_options_prep } @@ -1678,18 +1731,20 @@ func_parse_options () func_parse_options_result= + _G_rc_parse_options=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. - func_run_hooks func_parse_options ${1+"$@"} - - # Adjust func_parse_options positional parameters to match - eval set dummy "$func_run_hooks_result"; shift + if func_run_hooks func_parse_options ${1+"$@"}; then + eval set dummy "$func_run_hooks_result"; shift + _G_rc_parse_options=: + fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break + _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in @@ -1704,7 +1759,10 @@ func_parse_options () ;; --warnings|--warning|-W) - test $# = 0 && func_missing_arg $_G_opt && break + if test $# = 0 && func_missing_arg $_G_opt; then + _G_rc_parse_options=: + break + fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above @@ -1757,15 +1815,25 @@ func_parse_options () shift ;; - --) break ;; + --) _G_rc_parse_options=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; esac + + $_G_match_parse_options && _G_rc_parse_options=: done - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - func_parse_options_result=$func_quote_for_eval_result + + if $_G_rc_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result + fi + + $_G_rc_parse_options } @@ -1778,16 +1846,21 @@ func_validate_options () { $debug_cmd + _G_rc_validate_options=false + # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" - func_run_hooks func_validate_options ${1+"$@"} + if func_run_hooks func_validate_options ${1+"$@"}; then + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result + _G_rc_validate_options=: + fi # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE - # save modified positional parameters for caller - func_validate_options_result=$func_run_hooks_result + $_G_rc_validate_options } @@ -2068,7 +2141,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.6-2 + version: $progname $scriptversion Debian-2.4.6-10 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` @@ -2270,6 +2343,8 @@ libtool_options_prep () nonopt= preserve_args= + _G_rc_lt_options_prep=: + # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) @@ -2293,11 +2368,18 @@ libtool_options_prep () uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; + *) + _G_rc_lt_options_prep=false + ;; esac - # Pass back the list of options. - func_quote_for_eval ${1+"$@"} - libtool_options_prep_result=$func_quote_for_eval_result + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result + fi + + $_G_rc_lt_options_prep } func_add_hook func_options_prep libtool_options_prep @@ -2309,9 +2391,12 @@ libtool_parse_options () { $debug_cmd + _G_rc_lt_parse_options=false + # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do + _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in @@ -2386,15 +2471,22 @@ libtool_parse_options () func_append preserve_args " $_G_opt" ;; - # An option not handled by this hook function: - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result + fi - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - libtool_parse_options_result=$func_quote_for_eval_result + $_G_rc_lt_parse_options } func_add_hook func_parse_options libtool_parse_options @@ -7275,10 +7367,11 @@ func_mode_link () # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ - -specs=*|-fsanitize=*) + -specs=*|-fsanitize=*|-fuse-ld=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" diff --git a/vendor/libssh2/m4/libtool.m4 b/vendor/libssh2/m4/libtool.m4 index ee80844b6..9d6dd9fce 100644 --- a/vendor/libssh2/m4/libtool.m4 +++ b/vendor/libssh2/m4/libtool.m4 @@ -4063,7 +4063,8 @@ _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -4703,6 +4704,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; + # flang / f18. f95 an alias for gfortran or flang on Debian + flang* | f18* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) @@ -6438,7 +6445,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no @@ -6813,7 +6820,7 @@ if test yes != "$_lt_caught_CXX_error"; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then @@ -6878,7 +6885,7 @@ if test yes != "$_lt_caught_CXX_error"; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then @@ -7217,7 +7224,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support @@ -7301,7 +7308,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. @@ -7312,7 +7319,7 @@ if test yes != "$_lt_caught_CXX_error"; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' diff --git a/vendor/libssh2/missing b/vendor/libssh2/missing index f62bbae30..625aeb118 100755 --- a/vendor/libssh2/missing +++ b/vendor/libssh2/missing @@ -1,9 +1,9 @@ #! /bin/sh # Common wrapper for a few potentially missing GNU programs. -scriptversion=2013-10-28.13; # UTC +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify @@ -17,7 +17,7 @@ scriptversion=2013-10-28.13; # UTC # 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, see . +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -101,9 +101,9 @@ else exit $st fi -perl_URL=http://www.perl.org/ -flex_URL=http://flex.sourceforge.net/ -gnu_software_URL=http://www.gnu.org/software +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software program_details () { @@ -207,9 +207,9 @@ give_advice "$1" | sed -e '1s/^/WARNING: /' \ exit $st # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/vendor/libssh2/src/Makefile.in b/vendor/libssh2/src/Makefile.in index 9e59967ee..44533bded 100644 --- a/vendor/libssh2/src/Makefile.in +++ b/vendor/libssh2/src/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -176,7 +176,20 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/agent.Plo ./$(DEPDIR)/channel.Plo \ + ./$(DEPDIR)/comp.Plo ./$(DEPDIR)/crypt.Plo \ + ./$(DEPDIR)/global.Plo ./$(DEPDIR)/hostkey.Plo \ + ./$(DEPDIR)/keepalive.Plo ./$(DEPDIR)/kex.Plo \ + ./$(DEPDIR)/knownhost.Plo ./$(DEPDIR)/libgcrypt.Plo \ + ./$(DEPDIR)/mac.Plo ./$(DEPDIR)/mbedtls.Plo \ + ./$(DEPDIR)/misc.Plo ./$(DEPDIR)/openssl.Plo \ + ./$(DEPDIR)/os400qc3.Plo ./$(DEPDIR)/packet.Plo \ + ./$(DEPDIR)/pem.Plo ./$(DEPDIR)/publickey.Plo \ + ./$(DEPDIR)/scp.Plo ./$(DEPDIR)/session.Plo \ + ./$(DEPDIR)/sftp.Plo ./$(DEPDIR)/transport.Plo \ + ./$(DEPDIR)/userauth.Plo ./$(DEPDIR)/version.Plo \ + ./$(DEPDIR)/wincng.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -463,8 +476,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../Makefile.OpenSSL.inc $(srcdir)/../Makefile.libgcrypt.inc $(srcdir)/../Makefile.WinCNG.inc $(srcdir)/../Makefile.os400qc3.inc $(srcdir)/../Makefile.mbedTLS.inc $(srcdir)/../Makefile.inc $(am__empty): @@ -536,31 +549,37 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/agent.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hostkey.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keepalive.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kex.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knownhost.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgcrypt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mac.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbedtls.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openssl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os400qc3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packet.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/publickey.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transport.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/userauth.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wincng.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/agent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hostkey.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keepalive.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kex.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knownhost.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgcrypt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbedtls.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openssl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os400qc3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packet.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/publickey.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transport.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/userauth.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wincng.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -641,7 +660,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -714,7 +736,31 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/agent.Plo + -rm -f ./$(DEPDIR)/channel.Plo + -rm -f ./$(DEPDIR)/comp.Plo + -rm -f ./$(DEPDIR)/crypt.Plo + -rm -f ./$(DEPDIR)/global.Plo + -rm -f ./$(DEPDIR)/hostkey.Plo + -rm -f ./$(DEPDIR)/keepalive.Plo + -rm -f ./$(DEPDIR)/kex.Plo + -rm -f ./$(DEPDIR)/knownhost.Plo + -rm -f ./$(DEPDIR)/libgcrypt.Plo + -rm -f ./$(DEPDIR)/mac.Plo + -rm -f ./$(DEPDIR)/mbedtls.Plo + -rm -f ./$(DEPDIR)/misc.Plo + -rm -f ./$(DEPDIR)/openssl.Plo + -rm -f ./$(DEPDIR)/os400qc3.Plo + -rm -f ./$(DEPDIR)/packet.Plo + -rm -f ./$(DEPDIR)/pem.Plo + -rm -f ./$(DEPDIR)/publickey.Plo + -rm -f ./$(DEPDIR)/scp.Plo + -rm -f ./$(DEPDIR)/session.Plo + -rm -f ./$(DEPDIR)/sftp.Plo + -rm -f ./$(DEPDIR)/transport.Plo + -rm -f ./$(DEPDIR)/userauth.Plo + -rm -f ./$(DEPDIR)/version.Plo + -rm -f ./$(DEPDIR)/wincng.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags @@ -760,7 +806,31 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/agent.Plo + -rm -f ./$(DEPDIR)/channel.Plo + -rm -f ./$(DEPDIR)/comp.Plo + -rm -f ./$(DEPDIR)/crypt.Plo + -rm -f ./$(DEPDIR)/global.Plo + -rm -f ./$(DEPDIR)/hostkey.Plo + -rm -f ./$(DEPDIR)/keepalive.Plo + -rm -f ./$(DEPDIR)/kex.Plo + -rm -f ./$(DEPDIR)/knownhost.Plo + -rm -f ./$(DEPDIR)/libgcrypt.Plo + -rm -f ./$(DEPDIR)/mac.Plo + -rm -f ./$(DEPDIR)/mbedtls.Plo + -rm -f ./$(DEPDIR)/misc.Plo + -rm -f ./$(DEPDIR)/openssl.Plo + -rm -f ./$(DEPDIR)/os400qc3.Plo + -rm -f ./$(DEPDIR)/packet.Plo + -rm -f ./$(DEPDIR)/pem.Plo + -rm -f ./$(DEPDIR)/publickey.Plo + -rm -f ./$(DEPDIR)/scp.Plo + -rm -f ./$(DEPDIR)/session.Plo + -rm -f ./$(DEPDIR)/sftp.Plo + -rm -f ./$(DEPDIR)/transport.Plo + -rm -f ./$(DEPDIR)/userauth.Plo + -rm -f ./$(DEPDIR)/version.Plo + -rm -f ./$(DEPDIR)/wincng.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -781,9 +851,9 @@ uninstall-am: uninstall-libLTLIBRARIES .MAKE: all install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ diff --git a/vendor/libssh2/src/channel.c b/vendor/libssh2/src/channel.c index 538a0ab0d..39ff05bf1 100644 --- a/vendor/libssh2/src/channel.c +++ b/vendor/libssh2/src/channel.c @@ -238,7 +238,20 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, goto channel_error; } + if(session->open_data_len < 1) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet size"); + goto channel_error; + } + if (session->open_data[0] == SSH_MSG_CHANNEL_OPEN_CONFIRMATION) { + + if(session->open_data_len < 17) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet size"); + goto channel_error; + } + session->open_channel->remote.id = _libssh2_ntohu32(session->open_data + 5); session->open_channel->local.window_size = @@ -518,7 +531,7 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, if (rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); return NULL; - } else if (rc) { + } else if (rc || data_len < 1) { _libssh2_error(session, LIBSSH2_ERROR_PROTO, "Unknown"); session->fwdLstn_state = libssh2_NB_state_idle; return NULL; @@ -855,6 +868,11 @@ static int channel_setenv(LIBSSH2_CHANNEL *channel, channel->setenv_state = libssh2_NB_state_idle; return rc; } + else if(data_len < 1) { + channel->setenv_state = libssh2_NB_state_idle; + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet size"); + } if (data[0] == SSH_MSG_CHANNEL_SUCCESS) { LIBSSH2_FREE(session, data); @@ -971,7 +989,7 @@ static int channel_request_pty(LIBSSH2_CHANNEL *channel, &channel->reqPTY_packet_requirev_state); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } else if (rc || data_len < 1) { channel->reqPTY_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_PROTO, "Failed to require the PTY package"); @@ -1197,7 +1215,7 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, &channel->reqX11_packet_requirev_state); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } else if (rc || data_len < 1) { channel->reqX11_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "waiting for x11-req response packet"); @@ -1324,7 +1342,7 @@ _libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel, &channel->process_packet_requirev_state); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } else if (rc || data_len < 1) { channel->process_state = libssh2_NB_state_end; return _libssh2_error(session, rc, "Failed waiting for channel success"); diff --git a/vendor/libssh2/src/comp.c b/vendor/libssh2/src/comp.c index 4560188bb..629319590 100644 --- a/vendor/libssh2/src/comp.c +++ b/vendor/libssh2/src/comp.c @@ -224,7 +224,12 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session, /* A short-term alloc of a full data chunk is better than a series of reallocs */ char *out; - int out_maxlen = 4 * src_len; + size_t out_maxlen = src_len; + + if (src_len <= SIZE_MAX / 4) + out_maxlen = src_len * 4; + else + out_maxlen = payload_limit; /* If strm is null, then we have not yet been initialized. */ if (strm == NULL) @@ -271,7 +276,7 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session, "decompression failure"); } - if (out_maxlen >= (int) payload_limit) { + if (out_maxlen > (int) payload_limit || out_maxlen > SIZE_MAX / 2) { LIBSSH2_FREE(session, out); return _libssh2_error(session, LIBSSH2_ERROR_ZLIB, "Excessive growth in decompression phase"); diff --git a/vendor/libssh2/src/kex.c b/vendor/libssh2/src/kex.c index 65b722f42..3634cb5a9 100644 --- a/vendor/libssh2/src/kex.c +++ b/vendor/libssh2/src/kex.c @@ -228,11 +228,23 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, } /* Parse KEXDH_REPLY */ + if(exchange_state->s_packet_len < 5) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet length"); + goto clean_exit; + } + exchange_state->s = exchange_state->s_packet + 1; session->server_hostkey_len = _libssh2_ntohu32(exchange_state->s); exchange_state->s += 4; + if(session->server_hostkey_len > exchange_state->s_packet_len - 5) { + ret = _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, + "Host key length out of bounds"); + goto clean_exit; + } + if (session->server_hostkey) LIBSSH2_FREE(session, session->server_hostkey); @@ -848,11 +860,23 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, } /* Parse KEXDH_REPLY */ + if(exchange_state->s_packet_len < 5) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet length"); + goto clean_exit; + } + exchange_state->s = exchange_state->s_packet + 1; session->server_hostkey_len = _libssh2_ntohu32(exchange_state->s); exchange_state->s += 4; + if(session->server_hostkey_len > exchange_state->s_packet_len - 5) { + ret = _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, + "Host key length out of bounds"); + goto clean_exit; + } + if (session->server_hostkey) LIBSSH2_FREE(session, session->server_hostkey); diff --git a/vendor/libssh2/src/libssh2_priv.h b/vendor/libssh2/src/libssh2_priv.h index b4296a221..bb5d1a50a 100644 --- a/vendor/libssh2/src/libssh2_priv.h +++ b/vendor/libssh2/src/libssh2_priv.h @@ -146,6 +146,18 @@ static inline int writev(int sock, struct iovec *iov, int nvecs) #endif +#ifndef SIZE_MAX +#if _WIN64 +#define SIZE_MAX 0xFFFFFFFFFFFFFFFF +#else +#define SIZE_MAX 0xFFFFFFFF +#endif +#endif + +#ifndef UINT_MAX +#define UINT_MAX 0xFFFFFFFF +#endif + /* RFC4253 section 6.1 Maximum Packet Length says: * * "All implementations MUST be able to process packets with diff --git a/vendor/libssh2/src/packet.c b/vendor/libssh2/src/packet.c index 5f1feb8c6..c950b5dcf 100644 --- a/vendor/libssh2/src/packet.c +++ b/vendor/libssh2/src/packet.c @@ -775,8 +775,8 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, uint32_t len = _libssh2_ntohu32(data + 5); unsigned char want_reply = 1; - if(len < (datalen - 10)) - want_reply = data[9 + len]; + if((len + 9) < datalen) + want_reply = data[len + 9]; _libssh2_debug(session, LIBSSH2_TRACE_CONN, @@ -784,6 +784,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, channel, len, data + 9, want_reply); if (len == sizeof("exit-status") - 1 + && (sizeof("exit-status") - 1 + 9) <= datalen && !memcmp("exit-status", data + 9, sizeof("exit-status") - 1)) { @@ -792,7 +793,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, channelp = _libssh2_channel_locate(session, channel); - if (channelp) { + if (channelp && (sizeof("exit-status") + 13) <= datalen) { channelp->exit_status = _libssh2_ntohu32(data + 9 + sizeof("exit-status")); _libssh2_debug(session, LIBSSH2_TRACE_CONN, @@ -805,24 +806,32 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, } else if (len == sizeof("exit-signal") - 1 + && (sizeof("exit-signal") - 1 + 9) <= datalen && !memcmp("exit-signal", data + 9, sizeof("exit-signal") - 1)) { /* command terminated due to signal */ if(datalen >= 20) channelp = _libssh2_channel_locate(session, channel); - if (channelp) { + if (channelp && (sizeof("exit-signal") + 13) <= datalen) { /* set signal name (without SIG prefix) */ uint32_t namelen = _libssh2_ntohu32(data + 9 + sizeof("exit-signal")); - channelp->exit_signal = - LIBSSH2_ALLOC(session, namelen + 1); + + if(namelen <= UINT_MAX - 1) { + channelp->exit_signal = + LIBSSH2_ALLOC(session, namelen + 1); + } + else { + channelp->exit_signal = NULL; + } + if (!channelp->exit_signal) rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "memory for signal name"); - else { + else if ((sizeof("exit-signal") + 13 + namelen <= datalen)) { memcpy(channelp->exit_signal, - data + 13 + sizeof("exit_signal"), namelen); + data + 13 + sizeof("exit-signal"), namelen); channelp->exit_signal[namelen] = '\0'; /* TODO: save error message and language tag */ _libssh2_debug(session, LIBSSH2_TRACE_CONN, diff --git a/vendor/libssh2/src/session.c b/vendor/libssh2/src/session.c index 6352d12ee..b5a83ddd6 100644 --- a/vendor/libssh2/src/session.c +++ b/vendor/libssh2/src/session.c @@ -765,6 +765,11 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) if (rc) return rc; + if(session->startup_data_len < 5) { + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet length"); + } + session->startup_service_length = _libssh2_ntohu32(session->startup_data + 1); diff --git a/vendor/libssh2/src/sftp.c b/vendor/libssh2/src/sftp.c index 7c4411640..fd94d3902 100644 --- a/vendor/libssh2/src/sftp.c +++ b/vendor/libssh2/src/sftp.c @@ -204,6 +204,10 @@ sftp_packet_add(LIBSSH2_SFTP *sftp, unsigned char *data, LIBSSH2_SFTP_PACKET *packet; uint32_t request_id; + if (data_len < 5) { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } + _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Received packet type %d (len %d)", (int) data[0], data_len); @@ -345,6 +349,10 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED, "SFTP packet too large"); + if (sftp->partial_len == 0) + return _libssh2_error(session, + LIBSSH2_ERROR_ALLOC, + "Unable to allocate empty SFTP packet"); _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Data begin - Packet Length: %lu", @@ -504,11 +512,15 @@ sftp_packet_ask(LIBSSH2_SFTP *sftp, unsigned char packet_type, static int sftp_packet_require(LIBSSH2_SFTP *sftp, unsigned char packet_type, uint32_t request_id, unsigned char **data, - size_t *data_len) + size_t *data_len, size_t required_size) { LIBSSH2_SESSION *session = sftp->channel->session; int rc; + if (data == NULL || data_len == NULL || required_size == 0) { + return LIBSSH2_ERROR_BAD_USE; + } + _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Requiring packet %d id %ld", (int) packet_type, request_id); @@ -516,6 +528,11 @@ sftp_packet_require(LIBSSH2_SFTP *sftp, unsigned char packet_type, /* The right packet was available in the packet brigade */ _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Got %d", (int) packet_type); + + if (*data_len < required_size) { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } + return LIBSSH2_ERROR_NONE; } @@ -529,6 +546,11 @@ sftp_packet_require(LIBSSH2_SFTP *sftp, unsigned char packet_type, /* The right packet was available in the packet brigade */ _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Got %d", (int) packet_type); + + if (*data_len < required_size) { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } + return LIBSSH2_ERROR_NONE; } } @@ -544,11 +566,15 @@ static int sftp_packet_requirev(LIBSSH2_SFTP *sftp, int num_valid_responses, const unsigned char *valid_responses, uint32_t request_id, unsigned char **data, - size_t *data_len) + size_t *data_len, size_t required_size) { int i; int rc; + if (data == NULL || data_len == NULL || required_size == 0) { + return LIBSSH2_ERROR_BAD_USE; + } + /* If no timeout is active, start a new one */ if (sftp->requirev_start == 0) sftp->requirev_start = time(NULL); @@ -562,6 +588,11 @@ sftp_packet_requirev(LIBSSH2_SFTP *sftp, int num_valid_responses, * the timeout is not active */ sftp->requirev_start = 0; + + if (*data_len < required_size) { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } + return LIBSSH2_ERROR_NONE; } } @@ -636,36 +667,65 @@ sftp_attr2bin(unsigned char *p, const LIBSSH2_SFTP_ATTRIBUTES * attrs) /* sftp_bin2attr */ static int -sftp_bin2attr(LIBSSH2_SFTP_ATTRIBUTES * attrs, const unsigned char *p) +sftp_bin2attr(LIBSSH2_SFTP_ATTRIBUTES * attrs, const unsigned char *p, size_t data_len) { const unsigned char *s = p; - memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); - attrs->flags = _libssh2_ntohu32(s); - s += 4; + if (data_len >= 4) { + memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); + attrs->flags = _libssh2_ntohu32(s); + s += 4; + data_len -= 4; + } + else { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } if (attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) { - attrs->filesize = _libssh2_ntohu64(s); - s += 8; + if (data_len >= 8) { + attrs->filesize = _libssh2_ntohu64(s); + s += 8; + data_len -= 8; + } + else { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } } if (attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) { - attrs->uid = _libssh2_ntohu32(s); - s += 4; - attrs->gid = _libssh2_ntohu32(s); - s += 4; + if (data_len >= 8) { + attrs->uid = _libssh2_ntohu32(s); + s += 4; + attrs->gid = _libssh2_ntohu32(s); + s += 4; + data_len -= 8; + } + else { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } } if (attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { - attrs->permissions = _libssh2_ntohu32(s); - s += 4; + if (data_len >= 4) { + attrs->permissions = _libssh2_ntohu32(s); + s += 4; + data_len -= 4; + } + else { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } } if (attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) { - attrs->atime = _libssh2_ntohu32(s); - s += 4; - attrs->mtime = _libssh2_ntohu32(s); - s += 4; + if (data_len >= 8) { + attrs->atime = _libssh2_ntohu32(s); + s += 4; + attrs->mtime = _libssh2_ntohu32(s); + s += 4; + } + else { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } } return (s - p); @@ -835,18 +895,23 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) } rc = sftp_packet_require(sftp_handle, SSH_FXP_VERSION, - 0, &data, &data_len); - if (rc == LIBSSH2_ERROR_EAGAIN) + 0, &data, &data_len, 5); + if (rc == LIBSSH2_ERROR_EAGAIN) { + _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block receiving SSH_FXP_VERSION"); return NULL; - else if (rc) { - _libssh2_error(session, rc, - "Timeout waiting for response from SFTP subsystem"); - goto sftp_init_error; } - if (data_len < 5) { + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Invalid SSH_FXP_VERSION response"); - LIBSSH2_FREE(session, data); + goto sftp_init_error; + } + else if (rc) { + _libssh2_error(session, rc, + "Timeout waiting for response from SFTP subsystem"); goto sftp_init_error; } @@ -1112,12 +1177,20 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, { SSH_FXP_HANDLE, SSH_FXP_STATUS }; rc = sftp_packet_requirev(sftp, 2, fopen_responses, sftp->open_request_id, &data, - &data_len); + &data_len, 1); if (rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for status message"); return NULL; } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Response too small"); + return NULL; + } sftp->open_state = libssh2_NB_state_idle; if (rc) { _libssh2_error(session, rc, "Timeout waiting for status message"); @@ -1148,12 +1221,20 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, /* silly situation, but check for a HANDLE */ rc = sftp_packet_require(sftp, SSH_FXP_HANDLE, sftp->open_request_id, &data, - &data_len); + &data_len, 10); if(rc == LIBSSH2_ERROR_EAGAIN) { /* go back to sent state and wait for something else */ sftp->open_state = libssh2_NB_state_sent; return NULL; } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Too small FXP_HANDLE"); + return NULL; + } else if(!rc) /* we got the handle so this is not a bad situation */ badness = 0; @@ -1480,15 +1561,21 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, } rc = sftp_packet_requirev(sftp, 2, read_responses, - chunk->request_id, &data, &data_len); - - if (rc==LIBSSH2_ERROR_EAGAIN && bytes_in_buffer != 0) { + chunk->request_id, &data, &data_len, 9); + if (rc == LIBSSH2_ERROR_EAGAIN && bytes_in_buffer != 0) { /* do not return EAGAIN if we have already * written data into the buffer */ return bytes_in_buffer; } - if (rc < 0) { + if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Response too small"); + } + else if(rc < 0) { sftp->read_state = libssh2_NB_state_sent2; return rc; } @@ -1698,7 +1785,7 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, if (attrs) memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); - s += sftp_bin2attr(attrs ? attrs : &attrs_dummy, s); + s += sftp_bin2attr(attrs ? attrs : &attrs_dummy, s, 32); handle->u.dir.next_name = (char *) s; end: @@ -1753,9 +1840,16 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, retcode = sftp_packet_requirev(sftp, 2, read_responses, sftp->readdir_request_id, &data, - &data_len); + &data_len, 9); if (retcode == LIBSSH2_ERROR_EAGAIN) return retcode; + else if (retcode == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Status message too short"); + } else if (retcode) { sftp->readdir_state = libssh2_NB_state_idle; return _libssh2_error(session, retcode, @@ -1981,8 +2075,15 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, /* we check the packets in order */ rc = sftp_packet_require(sftp, SSH_FXP_STATUS, - chunk->request_id, &data, &data_len); - if (rc < 0) { + chunk->request_id, &data, &data_len, 9); + if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "FXP write packet too short"); + } + else if (rc < 0) { if (rc == LIBSSH2_ERROR_EAGAIN) sftp->write_state = libssh2_NB_state_sent; return rc; @@ -2124,10 +2225,18 @@ static int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle) } rc = sftp_packet_require(sftp, SSH_FXP_STATUS, - sftp->fsync_request_id, &data, &data_len); + sftp->fsync_request_id, &data, &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP fsync packet too short"); + } + else if (rc) { sftp->fsync_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP EXTENDED REPLY"); @@ -2227,9 +2336,16 @@ static int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, rc = sftp_packet_requirev(sftp, 2, fstat_responses, sftp->fstat_request_id, &data, - &data_len); + &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) return rc; + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP fstat packet too short"); + } else if (rc) { sftp->fstat_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, @@ -2252,7 +2368,12 @@ static int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, } } - sftp_bin2attr(attrs, data + 5); + if (sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) { + LIBSSH2_FREE(session, data); + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Attributes too short in SFTP fstat"); + } + LIBSSH2_FREE(session, data); return 0; @@ -2429,11 +2550,19 @@ sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle) if (handle->close_state == libssh2_NB_state_sent) { rc = sftp_packet_require(sftp, SSH_FXP_STATUS, handle->close_request_id, &data, - &data_len); + &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - - } else if (rc) { + } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + data = NULL; + _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Packet too short in FXP_CLOSE command"); + } + else if (rc) { _libssh2_error(session, rc, "Error waiting for status message"); } @@ -2547,10 +2676,17 @@ static int sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename, rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->unlink_request_id, &data, - &data_len); + &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP unlink packet too short"); + } else if (rc) { sftp->unlink_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, @@ -2658,10 +2794,18 @@ static int sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename, rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->rename_request_id, &data, - &data_len); + &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP rename packet too short"); + } + else if (rc) { sftp->rename_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP STATUS"); @@ -2783,11 +2927,19 @@ static int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st) } rc = sftp_packet_requirev(sftp, 2, responses, sftp->fstatvfs_request_id, - &data, &data_len); + &data, &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP rename packet too short"); + } + else if (rc) { sftp->fstatvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP EXTENDED REPLY"); @@ -2910,10 +3062,18 @@ static int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path, } rc = sftp_packet_requirev(sftp, 2, responses, sftp->statvfs_request_id, - &data, &data_len); + &data, &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP fstat packet too short"); + } + else if (rc) { sftp->statvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP EXTENDED REPLY"); @@ -3040,10 +3200,18 @@ static int sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, } rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->mkdir_request_id, - &data, &data_len); + &data, &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP mkdir packet too short"); + } + else if (rc) { sftp->mkdir_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP STATUS"); @@ -3134,10 +3302,18 @@ static int sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path, } rc = sftp_packet_require(sftp, SSH_FXP_STATUS, - sftp->rmdir_request_id, &data, &data_len); + sftp->rmdir_request_id, &data, &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP rmdir packet too short"); + } + else if (rc) { sftp->rmdir_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP STATUS"); @@ -3247,9 +3423,16 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, } rc = sftp_packet_requirev(sftp, 2, stat_responses, - sftp->stat_request_id, &data, &data_len); + sftp->stat_request_id, &data, &data_len, 9); if (rc == LIBSSH2_ERROR_EAGAIN) return rc; + else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP stat packet too short"); + } else if (rc) { sftp->stat_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, @@ -3273,7 +3456,12 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, } memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); - sftp_bin2attr(attrs, data + 5); + if (sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) { + LIBSSH2_FREE(session, data); + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Attributes too short in SFTP fstat"); + } + LIBSSH2_FREE(session, data); return 0; @@ -3378,9 +3566,16 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, retcode = sftp_packet_requirev(sftp, 2, link_responses, sftp->symlink_request_id, &data, - &data_len); + &data_len, 9); if (retcode == LIBSSH2_ERROR_EAGAIN) return retcode; + else if (retcode == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP symlink packet too short"); + } else if (retcode) { sftp->symlink_state = libssh2_NB_state_idle; return _libssh2_error(session, retcode, @@ -3410,6 +3605,14 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, "no name entries"); } + if (data_len < 13) { + if (data_len > 0) { + LIBSSH2_FREE(session, data); + } + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "SFTP stat packet too short"); + } + /* this reads a u32 and stores it into a signed 32bit value */ link_len = _libssh2_ntohu32(data + 9); if (link_len < target_len) { diff --git a/vendor/libssh2/src/transport.c b/vendor/libssh2/src/transport.c index 8725da095..7317579f3 100644 --- a/vendor/libssh2/src/transport.c +++ b/vendor/libssh2/src/transport.c @@ -438,6 +438,16 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) return LIBSSH2_ERROR_DECRYPT; p->padding_length = block[4]; + if(p->packet_length < 1) { + return LIBSSH2_ERROR_DECRYPT; + } + else if(p->packet_length > LIBSSH2_PACKET_MAXPAYLOAD) { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } + else if ( p->padding_length > p->packet_length - 1 ) { + return LIBSSH2_ERROR_DECRYPT; + } + /* total_num is the number of bytes following the initial (5 bytes) packet length and padding length fields */ @@ -471,8 +481,12 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) /* copy the data from index 5 to the end of the blocksize from the temporary buffer to the start of the decrypted buffer */ - memcpy(p->wptr, &block[5], blocksize - 5); - p->wptr += blocksize - 5; /* advance write pointer */ + if (blocksize - 5 <= total_num) { + memcpy(p->wptr, &block[5], blocksize - 5); + p->wptr += blocksize - 5; /* advance write pointer */ + } else { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } } /* init the data_num field to the number of bytes of @@ -546,7 +560,13 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) /* if there are bytes to copy that aren't decrypted, simply copy them as-is to the target buffer */ if (numbytes > 0) { - memcpy(p->wptr, &p->buf[p->readidx], numbytes); + + if (numbytes <= total_num - (p->wptr - p->payload)) { + memcpy(p->wptr, &p->buf[p->readidx], numbytes); + } + else { + return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + } /* advance the read pointer */ p->readidx += numbytes; diff --git a/vendor/libssh2/src/userauth.c b/vendor/libssh2/src/userauth.c index cdfa25e66..c02d81d0e 100644 --- a/vendor/libssh2/src/userauth.c +++ b/vendor/libssh2/src/userauth.c @@ -127,7 +127,7 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting userauth list"); return NULL; - } else if (rc) { + } else if (rc || (session->userauth_list_data_len < 1)) { _libssh2_error(session, rc, "Failed getting response"); session->userauth_list_state = libssh2_NB_state_idle; return NULL; @@ -143,8 +143,20 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, return NULL; } - methods_len = _libssh2_ntohu32(session->userauth_list_data + 1); + if(session->userauth_list_data_len < 5) { + LIBSSH2_FREE(session, session->userauth_list_data); + session->userauth_list_data = NULL; + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet size"); + return NULL; + } + methods_len = _libssh2_ntohu32(session->userauth_list_data + 1); + if(methods_len >= session->userauth_list_data_len - 5) { + _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, + "Unexpected userauth list size"); + return NULL; + } /* Do note that the memory areas overlap! */ memmove(session->userauth_list_data, session->userauth_list_data + 5, methods_len); @@ -285,6 +297,11 @@ userauth_password(LIBSSH2_SESSION *session, return _libssh2_error(session, rc, "Waiting for password response"); } + else if(session->userauth_pswd_data_len < 1) { + session->userauth_pswd_state = libssh2_NB_state_idle; + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet size"); + } if (session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_SUCCESS) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, @@ -312,6 +329,12 @@ userauth_password(LIBSSH2_SESSION *session, session->userauth_pswd_state = libssh2_NB_state_sent1; } + if(session->userauth_pswd_data_len < 1) { + session->userauth_pswd_state = libssh2_NB_state_idle; + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet size"); + } + if ((session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_PASSWD_CHANGEREQ) || (session->userauth_pswd_data0 == @@ -976,7 +999,7 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, } session->userauth_host_state = libssh2_NB_state_idle; - if (rc) { + if (rc || data_len < 1) { return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED, "Auth failed"); } @@ -1172,7 +1195,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, if (rc == LIBSSH2_ERROR_EAGAIN) { return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); } - else if (rc) { + else if (rc || (session->userauth_pblc_data_len < 1)) { LIBSSH2_FREE(session, session->userauth_pblc_packet); session->userauth_pblc_packet = NULL; LIBSSH2_FREE(session, session->userauth_pblc_method); @@ -1332,7 +1355,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, if (rc == LIBSSH2_ERROR_EAGAIN) { return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting userauth list"); - } else if (rc) { + } else if (rc || session->userauth_pblc_data_len < 1) { session->userauth_pblc_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED, "Waiting for publickey USERAUTH response"); @@ -1654,7 +1677,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, if (rc == LIBSSH2_ERROR_EAGAIN) { return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); - } else if (rc) { + } else if (rc || session->userauth_kybd_data_len < 1) { session->userauth_kybd_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_AUTHENTICATION_FAILED, @@ -1734,6 +1757,13 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, /* int num-prompts */ session->userauth_kybd_num_prompts = _libssh2_ntohu32(s); s += 4; + if(session->userauth_kybd_num_prompts && + session->userauth_kybd_num_prompts > 100) { + _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, + "Too many replies for " + "keyboard-interactive prompts"); + goto cleanup; + } if(session->userauth_kybd_num_prompts) { session->userauth_kybd_prompts = @@ -1801,8 +1831,17 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, for(i = 0; i < session->userauth_kybd_num_prompts; i++) { /* string response[1] (ISO-10646 UTF-8) */ - session->userauth_kybd_packet_len += - 4 + session->userauth_kybd_responses[i].length; + if(session->userauth_kybd_responses[i].length <= + (SIZE_MAX - 4 - session->userauth_kybd_packet_len) ) { + session->userauth_kybd_packet_len += + 4 + session->userauth_kybd_responses[i].length; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for keyboard-" + "interactive response packet"); + goto cleanup; + } } /* A new userauth_kybd_data area is to be allocated, free the diff --git a/vendor/libssh2/test-driver b/vendor/libssh2/test-driver index 32bf39e83..b8521a482 100755 --- a/vendor/libssh2/test-driver +++ b/vendor/libssh2/test-driver @@ -1,9 +1,9 @@ #! /bin/sh # test-driver - basic testsuite driver script. -scriptversion=2012-06-27.10; # UTC +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# Copyright (C) 2011-2018 Free Software Foundation, Inc. # # 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 @@ -16,7 +16,7 @@ scriptversion=2012-06-27.10; # UTC # 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, see . +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -44,13 +44,12 @@ print_usage () Usage: test-driver --test-name=NAME --log-file=PATH --trs-file=PATH [--expect-failure={yes|no}] [--color-tests={yes|no}] - [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT + [--enable-hard-errors={yes|no}] [--] + TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS] The '--test-name', '--log-file' and '--trs-file' options are mandatory. END } -# TODO: better error handling in option parsing (in particular, ensure -# TODO: $log_file, $trs_file and $test_name are defined). test_name= # Used for reporting. log_file= # Where to save the output of the test script. trs_file= # Where to save the metadata of the test run. @@ -69,10 +68,23 @@ while test $# -gt 0; do --enable-hard-errors) enable_hard_errors=$2; shift;; --) shift; break;; -*) usage_error "invalid option: '$1'";; + *) break;; esac shift done +missing_opts= +test x"$test_name" = x && missing_opts="$missing_opts --test-name" +test x"$log_file" = x && missing_opts="$missing_opts --log-file" +test x"$trs_file" = x && missing_opts="$missing_opts --trs-file" +if test x"$missing_opts" != x; then + usage_error "the following mandatory options are missing:$missing_opts" +fi + +if test $# -eq 0; then + usage_error "missing argument" +fi + if test $color_tests = yes; then # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'. red='' # Red. @@ -94,11 +106,14 @@ trap "st=143; $do_exit" 15 # Test script is run here. "$@" >$log_file 2>&1 estatus=$? + if test $enable_hard_errors = no && test $estatus -eq 99; then - estatus=1 + tweaked_estatus=1 +else + tweaked_estatus=$estatus fi -case $estatus:$expect_failure in +case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; @@ -107,6 +122,12 @@ case $estatus:$expect_failure in *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + # Report outcome to console. echo "${col}${res}${std}: $test_name" @@ -119,9 +140,9 @@ echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/vendor/libssh2/tests/Makefile.in b/vendor/libssh2/tests/Makefile.in index b3e7d461b..3228129f4 100644 --- a/vendor/libssh2/tests/Makefile.in +++ b/vendor/libssh2/tests/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -134,7 +134,8 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/example depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/simple.Po ./$(DEPDIR)/ssh2.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -578,8 +579,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -623,8 +624,14 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -825,7 +832,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS) fi; \ $$success || exit 1 -check-TESTS: +check-TESTS: $(check_PROGRAMS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @@ -882,7 +889,10 @@ ssh2.sh.log: ssh2.sh @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -957,7 +967,8 @@ clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/simple.Po + -rm -f ./$(DEPDIR)/ssh2.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1003,7 +1014,8 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/simple.Po + -rm -f ./$(DEPDIR)/ssh2.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1024,8 +1036,8 @@ uninstall-am: .MAKE: check-am install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool \ +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ + check-am clean clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ diff --git a/vendor/libssh2/win32/libssh2_config.h b/vendor/libssh2/win32/libssh2_config.h index b6af97806..6ac2ef43e 100644 --- a/vendor/libssh2/win32/libssh2_config.h +++ b/vendor/libssh2/win32/libssh2_config.h @@ -18,7 +18,7 @@ #define HAVE_GETTIMEOFDAY #endif /* __MINGW32__ */ -#define LIBSSH2_OPENSSL +#define HAVE_LIBCRYPT32 #define HAVE_WINSOCK2_H #define HAVE_IOCTLSOCKET #define HAVE_SELECT @@ -44,3 +44,4 @@ #define LIBSSH2_DH_GEX_NEW 1 #endif /* LIBSSH2_CONFIG_H */ + From df2c3f3509ebaad7c627c815746d5a2fdcee343a Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 24 May 2019 15:10:29 -0700 Subject: [PATCH 109/545] Root functions should keep their function prototypes correctly Without treating the root of a nodegit collection as a function template when it is a function itself, when we do the importextension / fix the prototype dance, we were blowing away call, bind, and apply, as well as anything else on the prototype --- generate/input/descriptor.json | 1 + generate/scripts/generateNativeCode.js | 2 ++ .../filters/get_cpp_function_for_root_proto.js | 12 ++++++++++++ .../filters/has_function_on_root_proto.js | 7 +++++++ generate/templates/templates/class_content.cc | 16 ++++++++++++++-- 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 generate/templates/filters/get_cpp_function_for_root_proto.js create mode 100644 generate/templates/filters/has_function_on_root_proto.js diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index e846c62e6..7db3b4c05 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3408,6 +3408,7 @@ ], "functions": { "git_reset": { + "isCollectionRoot": true, "args": { "checkout_opts": { "isOptional": true diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index 8ba821903..44f0501a9 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -57,6 +57,8 @@ module.exports = function generateNativeCode() { cppToV8: require("../templates/filters/cpp_to_v8"), defaultValue: require("../templates/filters/default_value"), fieldsInfo: require("../templates/filters/fields_info"), + getCPPFunctionForRootProto: require("../templates/filters/get_cpp_function_for_root_proto"), + hasFunctionOnRootProto: require("../templates/filters/has_function_on_root_proto"), hasReturnType: require("../templates/filters/has_return_type"), hasReturnValue: require("../templates/filters/has_return_value"), isArrayType: require("../templates/filters/is_array_type"), diff --git a/generate/templates/filters/get_cpp_function_for_root_proto.js b/generate/templates/filters/get_cpp_function_for_root_proto.js new file mode 100644 index 000000000..6571af880 --- /dev/null +++ b/generate/templates/filters/get_cpp_function_for_root_proto.js @@ -0,0 +1,12 @@ +module.exports = function(functions) { + if (!functions || functions.length === 0) { + throw new Error("Should not be able to get function from empty function list"); + } + + const fun = functions.find(function(f) { return f.useAsOnRootProto; }); + if (!fun) { + throw new Error("There is no function on the root prototype for this collection"); + } + + return fun.cppFunctionName; +}; diff --git a/generate/templates/filters/has_function_on_root_proto.js b/generate/templates/filters/has_function_on_root_proto.js new file mode 100644 index 000000000..626ce0ff6 --- /dev/null +++ b/generate/templates/filters/has_function_on_root_proto.js @@ -0,0 +1,7 @@ +module.exports = function(functions) { + if (!functions || functions.length === 0) { + return false; + } + + return functions.some(function(f) { return f.useAsOnRootProto; }); +}; diff --git a/generate/templates/templates/class_content.cc b/generate/templates/templates/class_content.cc index 48e67b0eb..dbac5e097 100644 --- a/generate/templates/templates/class_content.cc +++ b/generate/templates/templates/class_content.cc @@ -79,7 +79,11 @@ using namespace node; void {{ cppClassName }}::InitializeComponent(v8::Local target) { Nan::HandleScope scope; - v8::Local object = Nan::New(); + {% if functions|hasFunctionOnRootProto %} + v8::Local object = Nan::New({{ functions|getCPPFunctionForRootProto }}); + {% else %} + v8::Local object = Nan::New(); + {% endif %} {% each functions as function %} {% if not function.ignore %} @@ -87,7 +91,15 @@ using namespace node; {% endif %} {% endeach %} - Nan::Set(target, Nan::New("{{ jsClassName }}").ToLocalChecked(), object); + Nan::Set( + target, + Nan::New("{{ jsClassName }}").ToLocalChecked(), + {% if functions|hasFunctionOnRootProto %} + Nan::GetFunction(object).ToLocalChecked() + {% else %} + object + {% endif %} + ); } {% endif %} From 138bccbb3ef0cc108b7ef00851f4b949aa32731c Mon Sep 17 00:00:00 2001 From: Jordan W Date: Thu, 30 May 2019 09:28:00 -0700 Subject: [PATCH 110/545] refresh_references.cc: bust LibGit2 remote list cache by reading config Also removed calling `git_odb_free` when `git_repository_odb` fails. --- .../manual/repository/refresh_references.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index a13f3641c..69cdeeb57 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -415,6 +415,17 @@ void GitRepository::RefreshReferencesWorker::Execute() git_odb *odb; baton->error_code = git_repository_odb(&odb, repo); + if (baton->error_code != GIT_OK) { + if (giterr_last() != NULL) { + baton->error = git_error_dup(giterr_last()); + } + delete refreshData; + baton->out = NULL; + return; + } + + git_config *config; + baton->error_code = git_repository_config_snapshot(&config, repo); if (baton->error_code != GIT_OK) { if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); @@ -424,6 +435,8 @@ void GitRepository::RefreshReferencesWorker::Execute() baton->out = NULL; return; } + git_config_free(config); + // START Refresh HEAD git_reference *headRef = NULL; From 8e431e9dd3cbaa749f37fbd70a4509621763218b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 3 Jun 2019 16:58:55 -0700 Subject: [PATCH 111/545] Bump to v0.25.0-alpha.12 --- CHANGELOG.md | 15 +++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f86432772..4194aa64d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Change Log +## v0.25.0-alpha.12 [(2019-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.12) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.11...v0.25.0-alpha.12) + +#### Summary of changes +- Fix bug in Repository.prototype.refreshReferences where new remote references from a new remote added/fetched on a separte repo instance do not show up in the result. +- Fixed a prototype problem with cherrypick, merge, and other collections that have a function at their root. call, apply, and bind should now be on NodeGit.Cherrypick. +- Bumped libssh2 to resolve security notice. + +#### Merged PRs into NodeGit +- [Bump libssh2 to 1.8.2 and fix some npm audit warnings #1678](https://github.com/nodegit/nodegit/pull/1678) +- [Root functions should keep their function prototypes correctly #1681](https://github.com/nodegit/nodegit/pull/1681) +- [refresh_references.cc: bust LibGit2 remote list cache by reading config #1685](https://github.com/nodegit/nodegit/pull/1685) + + ## v0.25.0-alpha.11 [(2019-05-20)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.11) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.10...v0.25.0-alpha.11) diff --git a/package-lock.json b/package-lock.json index 7b9825c72..679a52b8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.11", + "version": "0.25.0-alpha.12", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 24813d442..1a237dba0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.11", + "version": "0.25.0-alpha.12", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 2d2a1a895f2fb602f3bd24a036dd8337447e4294 Mon Sep 17 00:00:00 2001 From: Jordan W Date: Fri, 21 Jun 2019 09:25:18 -0700 Subject: [PATCH 112/545] refresh_references.cc: skip refs that can't be directly resolved --- .../manual/repository/refresh_references.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 69cdeeb57..65548812c 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -16,7 +16,12 @@ int asDirectReference(git_reference **out, git_reference *ref) { return git_reference_dup(out, ref); } - return git_reference_resolve(out, ref); + int error = git_reference_resolve(out, ref); + if (error != GIT_OK) { + *out = NULL; + } + + return GIT_OK; } int lookupDirectReferenceByShorthand(git_reference **out, git_repository *repo, const char *shorthand) { @@ -442,7 +447,7 @@ void GitRepository::RefreshReferencesWorker::Execute() git_reference *headRef = NULL; baton->error_code = lookupDirectReferenceByShorthand(&headRef, repo, "HEAD"); - if (baton->error_code != GIT_OK) { + if (baton->error_code != GIT_OK || headRef == NULL) { if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); } @@ -472,7 +477,7 @@ void GitRepository::RefreshReferencesWorker::Execute() // START Refresh CHERRY_PICK_HEAD git_reference *cherrypickRef = NULL; - if (lookupDirectReferenceByShorthand(&cherrypickRef, repo, "CHERRY_PICK_HEAD") == GIT_OK) { + if (lookupDirectReferenceByShorthand(&cherrypickRef, repo, "CHERRY_PICK_HEAD") == GIT_OK && cherrypickRef != NULL) { baton->error_code = RefreshedRefModel::fromReference(&refreshData->cherrypick, cherrypickRef, odb); git_reference_free(cherrypickRef); } else { @@ -483,7 +488,7 @@ void GitRepository::RefreshReferencesWorker::Execute() // START Refresh MERGE_HEAD git_reference *mergeRef = NULL; // fall through if cherry pick failed - if (baton->error_code == GIT_OK && lookupDirectReferenceByShorthand(&mergeRef, repo, "MERGE_HEAD") == GIT_OK) { + if (baton->error_code == GIT_OK && lookupDirectReferenceByShorthand(&mergeRef, repo, "MERGE_HEAD") == GIT_OK && mergeRef != NULL) { baton->error_code = RefreshedRefModel::fromReference(&refreshData->merge, mergeRef, odb); git_reference_free(mergeRef); } else { @@ -536,6 +541,10 @@ void GitRepository::RefreshReferencesWorker::Execute() if (baton->error_code != GIT_OK) { break; } + if (reference == NULL) { + // lookup found the reference but failed to resolve it directly + continue; + } UpstreamModel *upstreamModel; if (UpstreamModel::fromReference(&upstreamModel, reference)) { From 2dc4f2db56b54930e27c3e412ad9dd7959f1044a Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Jun 2019 16:02:15 -0700 Subject: [PATCH 113/545] Bump libgit2 to fork of latest master --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 97e4179a7..0cfb5596a 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 97e4179a76b935a15589a44662ce54a0ce0f3026 +Subproject commit 0cfb5596ac1d0a0a88c3a449f885ee84ec4a8fb3 From 885e5822d9ebcab8489d17616a426e69d1908f25 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 24 Jun 2019 10:12:03 -0700 Subject: [PATCH 114/545] Bump Libgit2 docs to HEAD --- generate/input/libgit2-docs.json | 9552 ++++++++---------------------- 1 file changed, 2551 insertions(+), 7001 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 90392f122..7717a3886 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -23,7 +23,7 @@ "git_apply" ], "meta": {}, - "lines": 125 + "lines": 128 }, { "file": "git2/attr.h", @@ -42,7 +42,7 @@ { "file": "git2/blame.h", "functions": [ - "git_blame_init_options", + "git_blame_options_init", "git_blame_get_hunk_count", "git_blame_get_hunk_byindex", "git_blame_get_hunk_byline", @@ -64,11 +64,11 @@ "git_blob_rawcontent", "git_blob_rawsize", "git_blob_filtered_content", - "git_blob_create_fromworkdir", - "git_blob_create_fromdisk", - "git_blob_create_fromstream", - "git_blob_create_fromstream_commit", - "git_blob_create_frombuffer", + "git_blob_create_from_workdir", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_buffer", "git_blob_is_binary", "git_blob_dup" ], @@ -116,18 +116,18 @@ "git_checkout_notify_cb", "git_checkout_progress_cb", "git_checkout_perfdata_cb", - "git_checkout_init_options", + "git_checkout_options_init", "git_checkout_head", "git_checkout_index", "git_checkout_tree" ], "meta": {}, - "lines": 362 + "lines": 375 }, { "file": "git2/cherrypick.h", "functions": [ - "git_cherrypick_init_options", + "git_cherrypick_options_init", "git_cherrypick_commit", "git_cherrypick" ], @@ -139,7 +139,7 @@ "functions": [ "git_remote_create_cb", "git_repository_create_cb", - "git_clone_init_options", + "git_clone_options_init", "git_clone" ], "meta": {}, @@ -191,7 +191,7 @@ "git_libgit2_opts" ], "meta": {}, - "lines": 402 + "lines": 404 }, { "file": "git2/config.h", @@ -255,20 +255,24 @@ { "file": "git2/deprecated.h", "functions": [ + "git_blob_create_fromworkdir", "git_buf_free", "giterr_last", "giterr_clear", "giterr_set_str", - "giterr_set_oom" + "giterr_set_oom", + "git_oid_iszero", + "git_headlist_cb", + "git_blame_init_options" ], "meta": {}, - "lines": 148 + "lines": 423 }, { "file": "git2/describe.h", "functions": [ - "git_describe_init_options", - "git_describe_init_format_options", + "git_describe_options_init", + "git_describe_format_options_init", "git_describe_commit", "git_describe_workdir", "git_describe_format", @@ -282,12 +286,12 @@ "functions": [ "git_diff_notify_cb", "git_diff_progress_cb", - "git_diff_init_options", + "git_diff_options_init", "git_diff_file_cb", "git_diff_binary_cb", "git_diff_hunk_cb", "git_diff_line_cb", - "git_diff_find_init_options", + "git_diff_find_options_init", "git_diff_free", "git_diff_tree_to_tree", "git_diff_tree_to_index", @@ -317,8 +321,8 @@ "git_diff_stats_free", "git_diff_format_email", "git_diff_commit_as_email", - "git_diff_format_email_init_options", - "git_diff_patchid_init_options", + "git_diff_format_email_options_init", + "git_diff_patchid_options_init", "git_diff_patchid" ], "meta": {}, @@ -411,7 +415,7 @@ "git_index_iterator_next", "git_index_iterator_free", "git_index_add_bypath", - "git_index_add_frombuffer", + "git_index_add_from_buffer", "git_index_remove_bypath", "git_index_add_all", "git_index_remove_all", @@ -428,12 +432,13 @@ "git_index_conflict_iterator_free" ], "meta": {}, - "lines": 829 + "lines": 830 }, { "file": "git2/indexer.h", "functions": [ - "git_indexer_init_options", + "git_indexer_progress_cb", + "git_indexer_options_init", "git_indexer_new", "git_indexer_append", "git_indexer_commit", @@ -441,15 +446,7 @@ "git_indexer_free" ], "meta": {}, - "lines": 98 - }, - { - "file": "git2/inttypes.h", - "functions": [ - "imaxdiv" - ], - "meta": {}, - "lines": 298 + "lines": 142 }, { "file": "git2/mailmap.h", @@ -468,9 +465,9 @@ { "file": "git2/merge.h", "functions": [ - "git_merge_file_init_input", - "git_merge_file_init_options", - "git_merge_init_options", + "git_merge_file_input_init", + "git_merge_file_options_init", + "git_merge_options_init", "git_merge_analysis", "git_merge_analysis_for_ref", "git_merge_base", @@ -486,7 +483,7 @@ "git_merge" ], "meta": {}, - "lines": 606 + "lines": 602 }, { "file": "git2/message.h", @@ -500,11 +497,9 @@ }, { "file": "git2/net.h", - "functions": [ - "git_headlist_cb" - ], + "functions": [], "meta": {}, - "lines": 55 + "lines": 50 }, { "file": "git2/notes.h", @@ -545,7 +540,7 @@ "git_object_type2string", "git_object_string2type", "git_object_typeisloose", - "git_object__size", + "git_object_size", "git_object_peel", "git_object_dup" ], @@ -590,7 +585,7 @@ "git_odb_get_backend" ], "meta": {}, - "lines": 544 + "lines": 545 }, { "file": "git2/odb_backend.h", @@ -600,7 +595,7 @@ "git_odb_backend_one_pack" ], "meta": {}, - "lines": 130 + "lines": 131 }, { "file": "git2/oid.h", @@ -620,7 +615,7 @@ "git_oid_ncmp", "git_oid_streq", "git_oid_strcmp", - "git_oid_iszero", + "git_oid_is_zero", "git_oid_shorten_new", "git_oid_shorten_add", "git_oid_shorten_free" @@ -658,7 +653,7 @@ "git_packbuilder_free" ], "meta": {}, - "lines": 236 + "lines": 247 }, { "file": "git2/patch.h", @@ -704,7 +699,7 @@ { "file": "git2/proxy.h", "functions": [ - "git_proxy_init_options" + "git_proxy_options_init" ], "meta": {}, "lines": 92 @@ -712,9 +707,13 @@ { "file": "git2/rebase.h", "functions": [ - "git_rebase_init_options", + "git_rebase_options_init", "git_rebase_init", "git_rebase_open", + "git_rebase_orig_head_name", + "git_rebase_orig_head_id", + "git_rebase_onto_name", + "git_rebase_onto_id", "git_rebase_operation_entrycount", "git_rebase_operation_current", "git_rebase_operation_byindex", @@ -726,7 +725,7 @@ "git_rebase_free" ], "meta": {}, - "lines": 319 + "lines": 347 }, { "file": "git2/refdb.h", @@ -807,7 +806,7 @@ "git_reference_shorthand" ], "meta": {}, - "lines": 744 + "lines": 763 }, { "file": "git2/refspec.h", @@ -831,7 +830,7 @@ "file": "git2/remote.h", "functions": [ "git_remote_create", - "git_remote_create_init_options", + "git_remote_create_options_init", "git_remote_create_with_opts", "git_remote_create_with_fetchspec", "git_remote_create_anonymous", @@ -857,12 +856,13 @@ "git_remote_disconnect", "git_remote_free", "git_remote_list", - "git_push_transfer_progress", + "git_push_transfer_progress_cb", "git_push_negotiation", "git_push_update_reference_cb", + "git_url_resolve_cb", "git_remote_init_callbacks", - "git_fetch_init_options", - "git_push_init_options", + "git_fetch_options_init", + "git_push_options_init", "git_remote_download", "git_remote_upload", "git_remote_update_tips", @@ -879,7 +879,7 @@ "git_remote_default_branch" ], "meta": {}, - "lines": 926 + "lines": 948 }, { "file": "git2/repository.h", @@ -892,7 +892,7 @@ "git_repository_open_bare", "git_repository_free", "git_repository_init", - "git_repository_init_init_options", + "git_repository_init_options_init", "git_repository_init_ext", "git_repository_head", "git_repository_head_for_worktree", @@ -932,7 +932,7 @@ "git_repository_set_ident" ], "meta": {}, - "lines": 877 + "lines": 898 }, { "file": "git2/reset.h", @@ -947,7 +947,7 @@ { "file": "git2/revert.h", "functions": [ - "git_revert_init_options", + "git_revert_options_init", "git_revert_commit", "git_revert" ], @@ -1007,7 +1007,7 @@ "functions": [ "git_stash_save", "git_stash_apply_progress_cb", - "git_stash_apply_init_options", + "git_stash_apply_options_init", "git_stash_apply", "git_stash_cb", "git_stash_foreach", @@ -1021,7 +1021,7 @@ "file": "git2/status.h", "functions": [ "git_status_cb", - "git_status_init_options", + "git_status_options_init", "git_status_foreach", "git_status_foreach_ext", "git_status_file", @@ -1034,12 +1034,6 @@ "meta": {}, "lines": 374 }, - { - "file": "git2/stdint.h", - "functions": [], - "meta": {}, - "lines": 124 - }, { "file": "git2/strarray.h", "functions": [ @@ -1053,7 +1047,7 @@ "file": "git2/submodule.h", "functions": [ "git_submodule_cb", - "git_submodule_update_init_options", + "git_submodule_update_options_init", "git_submodule_update", "git_submodule_lookup", "git_submodule_free", @@ -1089,236 +1083,41 @@ "meta": {}, "lines": 633 }, - { - "file": "git2/sys/alloc.h", - "functions": [ - "git_stdalloc_init_allocator", - "git_win32_crtdbg_init_allocator" - ], - "meta": {}, - "lines": 97 - }, - { - "file": "git2/sys/commit.h", - "functions": [ - "git_commit_create_from_ids", - "git_commit_create_from_callback" - ], - "meta": {}, - "lines": 76 - }, - { - "file": "git2/sys/config.h", - "functions": [ - "git_config_init_backend", - "git_config_add_backend" - ], - "meta": {}, - "lines": 126 - }, - { - "file": "git2/sys/diff.h", - "functions": [ - "git_diff_print_callback__to_buf", - "git_diff_print_callback__to_file_handle", - "git_diff_get_perfdata", - "git_status_list_get_perfdata" - ], - "meta": {}, - "lines": 90 - }, { "file": "git2/sys/filter.h", - "functions": [ - "git_filter_lookup", - "git_filter_list_new", - "git_filter_list_push", - "git_filter_list_length", - "git_filter_source_repo", - "git_filter_source_path", - "git_filter_source_filemode", - "git_filter_source_id", - "git_filter_source_mode", - "git_filter_source_flags", - "git_filter_init_fn", - "git_filter_shutdown_fn", - "git_filter_check_fn", - "git_filter_apply_fn", - "git_filter_stream_fn", - "git_filter_cleanup_fn", - "git_filter_init", - "git_filter_register", - "git_filter_unregister" - ], + "functions": [], "meta": {}, - "lines": 328 + "lines": 95 }, { "file": "git2/sys/hashsig.h", - "functions": [ - "git_hashsig_create", - "git_hashsig_create_fromfile", - "git_hashsig_free", - "git_hashsig_compare" - ], - "meta": {}, - "lines": 102 - }, - { - "file": "git2/sys/index.h", - "functions": [ - "git_index_name_entrycount", - "git_index_name_get_byindex", - "git_index_name_add", - "git_index_name_clear", - "git_index_reuc_entrycount", - "git_index_reuc_find", - "git_index_reuc_get_bypath", - "git_index_reuc_get_byindex", - "git_index_reuc_add", - "git_index_reuc_remove", - "git_index_reuc_clear" - ], - "meta": {}, - "lines": 174 - }, - { - "file": "git2/sys/mempack.h", - "functions": [ - "git_mempack_new", - "git_mempack_dump", - "git_mempack_reset" - ], + "functions": [], "meta": {}, - "lines": 82 + "lines": 45 }, { "file": "git2/sys/merge.h", - "functions": [ - "git_merge_driver_lookup", - "git_merge_driver_source_repo", - "git_merge_driver_source_ancestor", - "git_merge_driver_source_ours", - "git_merge_driver_source_theirs", - "git_merge_driver_source_file_options", - "git_merge_driver_init_fn", - "git_merge_driver_shutdown_fn", - "git_merge_driver_apply_fn", - "git_merge_driver_register", - "git_merge_driver_unregister" - ], - "meta": {}, - "lines": 178 - }, - { - "file": "git2/sys/odb_backend.h", - "functions": [ - "git_odb_init_backend", - "git_odb_backend_malloc" - ], - "meta": {}, - "lines": 120 - }, - { - "file": "git2/sys/openssl.h", - "functions": [ - "git_openssl_set_locking" - ], + "functions": [], "meta": {}, - "lines": 34 + "lines": 41 }, { "file": "git2/sys/path.h", - "functions": [ - "git_path_is_gitfile" - ], - "meta": {}, - "lines": 60 - }, - { - "file": "git2/sys/refdb_backend.h", - "functions": [ - "git_refdb_init_backend", - "git_refdb_backend_fs", - "git_refdb_set_backend" - ], - "meta": {}, - "lines": 214 - }, - { - "file": "git2/sys/reflog.h", - "functions": [ - "git_reflog_entry__alloc", - "git_reflog_entry__free" - ], - "meta": {}, - "lines": 17 - }, - { - "file": "git2/sys/refs.h", - "functions": [ - "git_reference__alloc", - "git_reference__alloc_symbolic" - ], - "meta": {}, - "lines": 45 - }, - { - "file": "git2/sys/repository.h", - "functions": [ - "git_repository_new", - "git_repository__cleanup", - "git_repository_reinit_filesystem", - "git_repository_set_config", - "git_repository_set_odb", - "git_repository_set_refdb", - "git_repository_set_index", - "git_repository_set_bare", - "git_repository_submodule_cache_all", - "git_repository_submodule_cache_clear" - ], + "functions": [], "meta": {}, - "lines": 165 + "lines": 41 }, { "file": "git2/sys/stream.h", - "functions": [ - "git_stream_register", - "git_stream_cb", - "git_stream_register_tls" - ], - "meta": {}, - "lines": 130 - }, - { - "file": "git2/sys/time.h", - "functions": [ - "git_time_monotonic" - ], + "functions": [], "meta": {}, - "lines": 27 + "lines": 83 }, { "file": "git2/sys/transport.h", - "functions": [ - "git_transport_init", - "git_transport_new", - "git_transport_ssh_with_paths", - "git_transport_register", - "git_transport_unregister", - "git_transport_dummy", - "git_transport_local", - "git_transport_smart", - "git_transport_smart_certificate_check", - "git_transport_smart_credentials", - "git_transport_smart_proxy_options", - "git_smart_subtransport_cb", - "git_smart_subtransport_http", - "git_smart_subtransport_git", - "git_smart_subtransport_ssh" - ], + "functions": [], "meta": {}, - "lines": 435 + "lines": 292 }, { "file": "git2/tag.h", @@ -1336,7 +1135,7 @@ "git_tag_message", "git_tag_create", "git_tag_annotation_create", - "git_tag_create_frombuffer", + "git_tag_create_from_buffer", "git_tag_create_lightweight", "git_tag_delete", "git_tag_list", @@ -1347,12 +1146,12 @@ "git_tag_dup" ], "meta": {}, - "lines": 357 + "lines": 366 }, { "file": "git2/trace.h", "functions": [ - "git_trace_callback", + "git_trace_cb", "git_trace_set" ], "meta": {}, @@ -1377,8 +1176,6 @@ "file": "git2/transport.h", "functions": [ "git_transport_cb", - "git_cred_sign_callback", - "git_cred_ssh_interactive_callback", "git_cred_has_username", "git_cred_userpass_plaintext_new", "git_cred_ssh_key_new", @@ -1438,12 +1235,11 @@ { "file": "git2/types.h", "functions": [ - "git_transfer_progress_cb", "git_transport_message_cb", "git_transport_certificate_check_cb" ], "meta": {}, - "lines": 442 + "lines": 412 }, { "file": "git2/worktree.h", @@ -1453,14 +1249,14 @@ "git_worktree_open_from_repository", "git_worktree_free", "git_worktree_validate", - "git_worktree_add_init_options", + "git_worktree_add_options_init", "git_worktree_add", "git_worktree_lock", "git_worktree_unlock", "git_worktree_is_locked", "git_worktree_name", "git_worktree_path", - "git_worktree_prune_init_options", + "git_worktree_prune_options_init", "git_worktree_is_prunable", "git_worktree_prune" ], @@ -1572,7 +1368,7 @@ "comment": " 0 on success or error code" }, "description": "

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "

An annotated commit contains information about how it was\n looked up, which may be useful for functions like merge or\n rebase to provide context to the operation. For example,\n conflict files will include the name of the source or target\n branches being merged. It is therefore preferable to use the\n most specific function (eg git_annotated_commit_from_ref)\n instead of this one when that data is known.

\n", + "comments": "

An annotated commit contains information about how it was looked up, which may be useful for functions like merge or rebase to provide context to the operation. For example, conflict files will include the name of the source or target branches being merged. It is therefore preferable to use the most specific function (eg git_annotated_commit_from_ref) instead of this one when that data is known.

\n", "group": "annotated" }, "git_annotated_commit_from_revspec": { @@ -1604,7 +1400,7 @@ "comment": " 0 on success or error code" }, "description": "

Creates a git_annotated_comit from a revision string.

\n", - "comments": "

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", "group": "annotated" }, "git_annotated_commit_id": { @@ -1630,12 +1426,12 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_annotated_commit_id-1" + "ex/HEAD/checkout.html#git_annotated_commit_id-1" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_annotated_commit_id-1", - "ex/v0.28.0/merge.html#git_annotated_commit_id-2", - "ex/v0.28.0/merge.html#git_annotated_commit_id-3" + "ex/HEAD/merge.html#git_annotated_commit_id-1", + "ex/HEAD/merge.html#git_annotated_commit_id-2", + "ex/HEAD/merge.html#git_annotated_commit_id-3" ] } }, @@ -1662,8 +1458,8 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_annotated_commit_ref-2", - "ex/v0.28.0/checkout.html#git_annotated_commit_ref-3" + "ex/HEAD/checkout.html#git_annotated_commit_ref-2", + "ex/HEAD/checkout.html#git_annotated_commit_ref-3" ] } }, @@ -1690,15 +1486,15 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_annotated_commit_free-4" + "ex/HEAD/checkout.html#git_annotated_commit_free-4" ] } }, "git_apply_to_tree": { "type": "function", "file": "git2/apply.h", - "line": 85, - "lineto": 90, + "line": 87, + "lineto": 92, "args": [ { "name": "out", @@ -1739,8 +1535,8 @@ "git_apply": { "type": "function", "file": "git2/apply.h", - "line": 121, - "lineto": 125, + "line": 124, + "lineto": 128, "args": [ { "name": "repo", @@ -1788,11 +1584,11 @@ "argline": "const char *attr", "sig": "const char *", "return": { - "type": "git_attr_t", + "type": "git_attr_value_t", "comment": " the value type for the attribute" }, "description": "

Return the value type for a given attribute.

\n", - "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute\n was not set at all), or VALUE, if the attribute was set to an\n actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally\n as a NULL-terminated C string.

\n", + "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute was not set at all), or VALUE, if the attribute was set to an actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally as a NULL-terminated C string.

\n", "group": "attr" }, "git_attr_get": { @@ -1804,36 +1600,36 @@ { "name": "value_out", "type": "const char **", - "comment": null + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." }, { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "The repository containing the path." }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." }, { "name": "path", "type": "const char *", - "comment": null + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." }, { "name": "name", "type": "const char *", - "comment": null + "comment": "The name of the attribute to look up." } ], - "argline": "const char **value_out, git_repository *repo, int flags, const char *path, const char *name", - "sig": "const char **::git_repository *::int::const char *::const char *", + "argline": "const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name", + "sig": "const char **::git_repository *::uint32_t::const char *::const char *", "return": { "type": "int", "comment": null }, - "description": "", + "description": "

Look up the value of one git attribute for path.

\n", "comments": "", "group": "attr" }, @@ -1846,42 +1642,42 @@ { "name": "values_out", "type": "const char **", - "comment": null + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." }, { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "The repository containing the path." }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." }, { "name": "path", "type": "const char *", - "comment": null + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." }, { "name": "num_attr", "type": "size_t", - "comment": null + "comment": "The number of attributes being looked up" }, { "name": "names", "type": "const char **", - "comment": null + "comment": "An array of num_attr strings containing attribute names." } ], - "argline": "const char **values_out, git_repository *repo, int flags, const char *path, size_t num_attr, const char **names", - "sig": "const char **::git_repository *::int::const char *::size_t::const char **", + "argline": "const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::uint32_t::const char *::size_t::const char **", "return": { "type": "int", "comment": null }, - "description": "", - "comments": "", + "description": "

Look up a list of git attributes for path.

\n", + "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", "group": "attr" }, "git_attr_foreach": { @@ -1893,36 +1689,36 @@ { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "The repository containing the path." }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." }, { "name": "path", "type": "const char *", - "comment": null + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." }, { "name": "callback", "type": "git_attr_foreach_cb", - "comment": null + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Passed on as extra parameter to callback function." } ], - "argline": "git_repository *repo, int flags, const char *path, git_attr_foreach_cb callback, void *payload", - "sig": "git_repository *::int::const char *::git_attr_foreach_cb::void *", + "argline": "git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *", "return": { "type": "int", - "comment": null + "comment": " 0 on success, non-zero callback return value, or error code" }, - "description": "", + "description": "

Loop over all the git attributes for a path.

\n", "comments": "", "group": "attr" }, @@ -1945,7 +1741,7 @@ "comment": null }, "description": "

Flush the gitattributes cache.

\n", - "comments": "

Call this if you have reason to believe that the attributes files on\n disk no longer match the cached contents of memory. This will cause\n the attributes files to be reloaded the next time that an attribute\n access function is called.

\n", + "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", "group": "attr" }, "git_attr_add_macro": { @@ -1977,10 +1773,10 @@ "comment": null }, "description": "

Add a macro definition.

\n", - "comments": "

Macros will automatically be loaded from the top level .gitattributes\n file of the repository (plus the build-in "binary" macro). This\n function allows you to add others. For example, to add the default\n macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", + "comments": "

Macros will automatically be loaded from the top level .gitattributes file of the repository (plus the build-in "binary" macro). This function allows you to add others. For example, to add the default macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", "group": "attr" }, - "git_blame_init_options": { + "git_blame_options_init": { "type": "function", "file": "git2/blame.h", "line": 103, @@ -2004,7 +1800,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_blame_options structure

\n", - "comments": "

Initializes a git_blame_options with default values. Equivalent to creating\n an instance with GIT_BLAME_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_blame_options with default values. Equivalent to creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", "group": "blame" }, "git_blame_get_hunk_count": { @@ -2012,14 +1808,20 @@ "file": "git2/blame.h", "line": 154, "lineto": 154, - "args": [], - "argline": "", - "sig": "", + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": null + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", "return": { - "type": "int", + "type": "uint32_t", "comment": null }, - "description": "", + "description": "

Gets the number of hunks that exist in the blame structure.

\n", "comments": "", "group": "blame" }, @@ -2032,21 +1834,21 @@ { "name": "blame", "type": "git_blame *", - "comment": null + "comment": "the blame structure to query" }, { "name": "index", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "index of the hunk to retrieve" } ], - "argline": "git_blame *blame, int index", - "sig": "git_blame *::int", + "argline": "git_blame *blame, uint32_t index", + "sig": "git_blame *::uint32_t", "return": { "type": "const git_blame_hunk *", - "comment": null + "comment": " the hunk at the given index, or NULL on error" }, - "description": "", + "description": "

Gets the blame hunk at the given index.

\n", "comments": "", "group": "blame" }, @@ -2078,7 +1880,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_blame_get_hunk_byline-1" + "ex/HEAD/blame.html#git_blame_get_hunk_byline-1" ] } }, @@ -2120,7 +1922,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_blame_file-2" + "ex/HEAD/blame.html#git_blame_file-2" ] } }, @@ -2158,7 +1960,7 @@ "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" }, "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", - "comments": "

Lines that differ between the buffer and the committed version are marked as\n having a zero OID for their final_commit_id.

\n", + "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", "group": "blame" }, "git_blame_free": { @@ -2184,7 +1986,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_blame_free-3" + "ex/HEAD/blame.html#git_blame_free-3" ] } }, @@ -2221,10 +2023,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_blob_lookup-4" + "ex/HEAD/blame.html#git_blob_lookup-4" ], "general.c": [ - "ex/v0.28.0/general.html#git_blob_lookup-1" + "ex/HEAD/general.html#git_blob_lookup-1" ] } }, @@ -2284,14 +2086,14 @@ "comment": null }, "description": "

Close an open blob

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT:\n It is necessary to call this method when you stop\n using a blob. Failure to do so will cause a memory leak.

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", "group": "blob", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_blob_free-5" + "ex/HEAD/blame.html#git_blob_free-5" ], "general.c": [ - "ex/v0.28.0/general.html#git_blob_free-2" + "ex/HEAD/general.html#git_blob_free-2" ] } }, @@ -2358,17 +2160,17 @@ "comment": " the pointer" }, "description": "

Get a read-only buffer with the raw content of a blob.

\n", - "comments": "

A pointer to the raw content of a blob is returned;\n this pointer is owned internally by the object and shall\n not be free'd. The pointer may be invalidated at a later\n time.

\n", + "comments": "

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.

\n", "group": "blob", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_blob_rawcontent-6" + "ex/HEAD/blame.html#git_blob_rawcontent-6" ], "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_blob_rawcontent-1" + "ex/HEAD/cat-file.html#git_blob_rawcontent-1" ], "general.c": [ - "ex/v0.28.0/general.html#git_blob_rawcontent-3" + "ex/HEAD/general.html#git_blob_rawcontent-3" ] } }, @@ -2395,14 +2197,14 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_blob_rawsize-7" + "ex/HEAD/blame.html#git_blob_rawsize-7" ], "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_blob_rawsize-2" + "ex/HEAD/cat-file.html#git_blob_rawsize-2" ], "general.c": [ - "ex/v0.28.0/general.html#git_blob_rawsize-4", - "ex/v0.28.0/general.html#git_blob_rawsize-5" + "ex/HEAD/general.html#git_blob_rawsize-4", + "ex/HEAD/general.html#git_blob_rawsize-5" ] } }, @@ -2440,10 +2242,10 @@ "comment": " 0 on success or an error code" }, "description": "

Get a buffer with the filtered content of a blob.

\n", - "comments": "

This applies filters as if the blob was being checked out to the\n working directory under the specified filename. This may apply\n CRLF filtering or other types of changes depending on the file\n attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free\n when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just\n be populated with a pointer to the raw content of the blob. In\n that case, be careful to not free the blob until done with the\n buffer or copy it into memory you own.

\n", + "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", "group": "blob" }, - "git_blob_create_fromworkdir": { + "git_blob_create_from_workdir": { "type": "function", "file": "git2/blob.h", "line": 139, @@ -2475,7 +2277,7 @@ "comments": "", "group": "blob" }, - "git_blob_create_fromdisk": { + "git_blob_create_from_disk": { "type": "function", "file": "git2/blob.h", "line": 151, @@ -2507,7 +2309,7 @@ "comments": "", "group": "blob" }, - "git_blob_create_fromstream": { + "git_blob_create_from_stream": { "type": "function", "file": "git2/blob.h", "line": 178, @@ -2536,10 +2338,10 @@ "comment": " 0 or error code" }, "description": "

Create a stream to write a new blob into the object db

\n", - "comments": "

This function may need to buffer the data on disk and will in\n general not be the right choice if you know the size of the data\n to write. If you have data in memory, use\n git_blob_create_frombuffer(). If you do not, but know the size of\n the contents (and don't want/need to perform filtering), use\n git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to\n git_blob_create_fromstream_commit() to commit the write to the\n object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine\n what git filters should be applied to the object before it is written\n to the object database.

\n", + "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_from_buffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_from_stream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", "group": "blob" }, - "git_blob_create_fromstream_commit": { + "git_blob_create_from_stream_commit": { "type": "function", "file": "git2/blob.h", "line": 192, @@ -2566,7 +2368,7 @@ "comments": "

The stream will be closed and freed.

\n", "group": "blob" }, - "git_blob_create_frombuffer": { + "git_blob_create_from_buffer": { "type": "function", "file": "git2/blob.h", "line": 205, @@ -2622,7 +2424,7 @@ "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." }, "description": "

Determine if the blob content is most certainly binary or not.

\n", - "comments": "

The heuristic used to guess if a file is binary is taken from core git:\n Searching for NUL bytes and looking for a reasonable ratio of printable\n to non-printable characters among the first 8000 bytes.

\n", + "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", "group": "blob" }, "git_blob_dup": { @@ -2691,7 +2493,7 @@ "comment": " 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit." }, "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

A new direct reference will be created pointing to\n this target commit. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", + "comments": "

A new direct reference will be created pointing to this target commit. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "branch" }, "git_branch_create_from_annotated": { @@ -2733,7 +2535,7 @@ "comment": null }, "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

This behaves like git_branch_create() but takes an annotated\n commit, which lets you specify which extended sha syntax string was\n specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", + "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", "group": "branch" }, "git_branch_delete": { @@ -2755,7 +2557,7 @@ "comment": " 0 on success, or an error code." }, "description": "

Delete an existing branch reference.

\n", - "comments": "

If the branch is successfully deleted, the passed reference\n object will be invalidated. The reference must be freed manually\n by the user.

\n", + "comments": "

If the branch is successfully deleted, the passed reference object will be invalidated. The reference must be freed manually by the user.

\n", "group": "branch" }, "git_branch_iterator_new": { @@ -2878,7 +2680,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." }, "description": "

Move/rename an existing local branch reference.

\n", - "comments": "

The new branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", + "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "branch" }, "git_branch_lookup": { @@ -2915,7 +2717,7 @@ "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." }, "description": "

Lookup a branch by its name in a repository.

\n", - "comments": "

The generated reference must be freed by the user.

\n\n

The branch name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", + "comments": "

The generated reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "branch" }, "git_branch_name": { @@ -2942,11 +2744,11 @@ "comment": " 0 on success; otherwise an error code (e.g., if the\n ref is no local or remote branch)." }, "description": "

Return the name of the given local or remote branch.

\n", - "comments": "

The name of the branch matches the definition of the name\n for git_branch_lookup. That is, if the returned name is given\n to git_branch_lookup() then the reference is returned that\n was given to this function.

\n", + "comments": "

The name of the branch matches the definition of the name for git_branch_lookup. That is, if the returned name is given to git_branch_lookup() then the reference is returned that was given to this function.

\n", "group": "branch", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_branch_name-4" + "ex/HEAD/merge.html#git_branch_name-4" ] } }, @@ -3163,17 +2965,14 @@ "comment": null }, "description": "

Free the memory referred to by the git_buf.

\n", - "comments": "

Note that this does not free the git_buf itself, just the memory\n pointed to by buffer->ptr. This will not free the memory if it looks\n like it was not allocated internally, but it will clear the buffer back\n to the empty state.

\n", + "comments": "

Note that this does not free the git_buf itself, just the memory pointed to by buffer->ptr. This will not free the memory if it looks like it was not allocated internally, but it will clear the buffer back to the empty state.

\n", "group": "buf", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_buf_dispose-1" - ], - "remote.c": [ - "ex/v0.28.0/remote.html#git_buf_dispose-1" + "ex/HEAD/diff.html#git_buf_dispose-1" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_buf_dispose-1" + "ex/HEAD/tag.html#git_buf_dispose-1" ] } }, @@ -3201,7 +3000,7 @@ "comment": " 0 on success, -1 on allocation failure" }, "description": "

Resize the buffer allocation to make more space.

\n", - "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e.\n the asize field is zero), then ptr will be replaced with a newly\n allocated block of data. Be careful so that memory allocated by the\n caller is not lost. As a special variant, if you pass target_size as\n 0 and the memory is not allocated by libgit2, this will allocate a new\n buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be\n marked as invalid for future operations, invaliding the contents.

\n", + "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e. the asize field is zero), then ptr will be replaced with a newly allocated block of data. Be careful so that memory allocated by the caller is not lost. As a special variant, if you pass target_size as 0 and the memory is not allocated by libgit2, this will allocate a new buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be marked as invalid for future operations, invaliding the contents.

\n", "group": "buf" }, "git_buf_set": { @@ -3280,11 +3079,11 @@ "comments": "", "group": "buf" }, - "git_checkout_init_options": { + "git_checkout_options_init": { "type": "function", "file": "git2/checkout.h", - "line": 309, - "lineto": 311, + "line": 322, + "lineto": 324, "args": [ { "name": "opts", @@ -3304,14 +3103,14 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_checkout_options structure

\n", - "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating\n an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", "group": "checkout" }, "git_checkout_head": { "type": "function", "file": "git2/checkout.h", - "line": 330, - "lineto": 332, + "line": 343, + "lineto": 345, "args": [ { "name": "repo", @@ -3331,14 +3130,14 @@ "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use git_error_last for error details)" }, "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", - "comments": "

Note that this is not the correct mechanism used to switch branches;\n do not change your HEAD and then call this method, that would leave\n you with checkout conflicts since your working directory would then\n appear to be dirty. Instead, checkout the target of the branch and\n then update HEAD using git_repository_set_head to point to the\n branch you checked out.

\n", + "comments": "

Note that this is not the correct mechanism used to switch branches; do not change your HEAD and then call this method, that would leave you with checkout conflicts since your working directory would then appear to be dirty. Instead, checkout the target of the branch and then update HEAD using git_repository_set_head to point to the branch you checked out.

\n", "group": "checkout" }, "git_checkout_index": { "type": "function", "file": "git2/checkout.h", - "line": 343, - "lineto": 346, + "line": 356, + "lineto": 359, "args": [ { "name": "repo", @@ -3369,8 +3168,8 @@ "git_checkout_tree": { "type": "function", "file": "git2/checkout.h", - "line": 359, - "lineto": 362, + "line": 372, + "lineto": 375, "args": [ { "name": "repo", @@ -3399,14 +3198,14 @@ "group": "checkout", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_checkout_tree-5" + "ex/HEAD/checkout.html#git_checkout_tree-5" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_checkout_tree-5" + "ex/HEAD/merge.html#git_checkout_tree-5" ] } }, - "git_cherrypick_init_options": { + "git_cherrypick_options_init": { "type": "function", "file": "git2/cherrypick.h", "line": 49, @@ -3430,7 +3229,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_cherrypick_options structure

\n", - "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating\n an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", "group": "cherrypick" }, "git_cherrypick_commit": { @@ -3512,7 +3311,7 @@ "comments": "", "group": "cherrypick" }, - "git_clone_init_options": { + "git_clone_options_init": { "type": "function", "file": "git2/clone.h", "line": 181, @@ -3536,7 +3335,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_clone_options structure

\n", - "comments": "

Initializes a git_clone_options with default values. Equivalent to creating\n an instance with GIT_CLONE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_clone_options with default values. Equivalent to creating an instance with GIT_CLONE_OPTIONS_INIT.

\n", "group": "clone" }, "git_clone": { @@ -3573,7 +3372,7 @@ "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" }, "description": "

Clone a remote repository.

\n", - "comments": "

By default this creates its repository and initial remote to match\n git's defaults. You can use the options in the callback to\n customize how these are created.

\n", + "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n", "group": "clone" }, "git_commit_lookup": { @@ -3605,22 +3404,22 @@ "comment": " 0 or an error code" }, "description": "

Lookup a commit object from a repository.

\n", - "comments": "

The returned object should be released with git_commit_free when no\n longer needed.

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", "group": "commit", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_commit_lookup-6" + "ex/HEAD/checkout.html#git_commit_lookup-6" ], "general.c": [ - "ex/v0.28.0/general.html#git_commit_lookup-6", - "ex/v0.28.0/general.html#git_commit_lookup-7", - "ex/v0.28.0/general.html#git_commit_lookup-8" + "ex/HEAD/general.html#git_commit_lookup-6", + "ex/HEAD/general.html#git_commit_lookup-7", + "ex/HEAD/general.html#git_commit_lookup-8" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_lookup-1" + "ex/HEAD/log.html#git_commit_lookup-1" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_commit_lookup-6" + "ex/HEAD/merge.html#git_commit_lookup-6" ] } }, @@ -3658,7 +3457,7 @@ "comment": " 0 or an error code" }, "description": "

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n", - "comments": "

The returned object should be released with git_commit_free when no\n longer needed.

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", "group": "commit" }, "git_commit_free": { @@ -3680,24 +3479,24 @@ "comment": null }, "description": "

Close an open commit

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT:\n It is necessary to call this method when you stop\n using a commit. Failure to do so will cause a memory leak.

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", "group": "commit", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_commit_free-7" + "ex/HEAD/checkout.html#git_commit_free-7" ], "general.c": [ - "ex/v0.28.0/general.html#git_commit_free-9", - "ex/v0.28.0/general.html#git_commit_free-10", - "ex/v0.28.0/general.html#git_commit_free-11", - "ex/v0.28.0/general.html#git_commit_free-12", - "ex/v0.28.0/general.html#git_commit_free-13" + "ex/HEAD/general.html#git_commit_free-9", + "ex/HEAD/general.html#git_commit_free-10", + "ex/HEAD/general.html#git_commit_free-11", + "ex/HEAD/general.html#git_commit_free-12", + "ex/HEAD/general.html#git_commit_free-13" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_free-2", - "ex/v0.28.0/log.html#git_commit_free-3", - "ex/v0.28.0/log.html#git_commit_free-4", - "ex/v0.28.0/log.html#git_commit_free-5" + "ex/HEAD/log.html#git_commit_free-2", + "ex/HEAD/log.html#git_commit_free-3", + "ex/HEAD/log.html#git_commit_free-4", + "ex/HEAD/log.html#git_commit_free-5" ] } }, @@ -3724,10 +3523,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_commit_id-14" + "ex/HEAD/general.html#git_commit_id-14" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_id-6" + "ex/HEAD/log.html#git_commit_id-6" ] } }, @@ -3754,8 +3553,8 @@ "group": "commit", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_commit_owner-7", - "ex/v0.28.0/log.html#git_commit_owner-8" + "ex/HEAD/log.html#git_commit_owner-7", + "ex/HEAD/log.html#git_commit_owner-8" ] } }, @@ -3778,7 +3577,7 @@ "comment": " NULL, or the encoding" }, "description": "

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n", - "comments": "

The encoding may be NULL if the encoding header\n in the commit is missing; in that case UTF-8 is assumed.

\n", + "comments": "

The encoding may be NULL if the encoding header in the commit is missing; in that case UTF-8 is assumed.

\n", "group": "commit" }, "git_commit_message": { @@ -3800,25 +3599,25 @@ "comment": " the message of a commit" }, "description": "

Get the full message of a commit.

\n", - "comments": "

The returned message will be slightly prettified by removing any\n potential leading newlines.

\n", + "comments": "

The returned message will be slightly prettified by removing any potential leading newlines.

\n", "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_commit_message-3", - "ex/v0.28.0/cat-file.html#git_commit_message-4" + "ex/HEAD/cat-file.html#git_commit_message-3", + "ex/HEAD/cat-file.html#git_commit_message-4" ], "general.c": [ - "ex/v0.28.0/general.html#git_commit_message-15", - "ex/v0.28.0/general.html#git_commit_message-16", - "ex/v0.28.0/general.html#git_commit_message-17" + "ex/HEAD/general.html#git_commit_message-15", + "ex/HEAD/general.html#git_commit_message-16", + "ex/HEAD/general.html#git_commit_message-17" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_message-9", - "ex/v0.28.0/log.html#git_commit_message-10", - "ex/v0.28.0/log.html#git_commit_message-11" + "ex/HEAD/log.html#git_commit_message-9", + "ex/HEAD/log.html#git_commit_message-10", + "ex/HEAD/log.html#git_commit_message-11" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_commit_message-2" + "ex/HEAD/tag.html#git_commit_message-2" ] } }, @@ -3863,7 +3662,7 @@ "comment": " the summary of a commit or NULL on error" }, "description": "

Get the short "summary" of the git commit message.

\n", - "comments": "

The returned message is the summary of the commit, comprising the\n first paragraph of the message with whitespace trimmed and squashed.

\n", + "comments": "

The returned message is the summary of the commit, comprising the first paragraph of the message with whitespace trimmed and squashed.

\n", "group": "commit" }, "git_commit_body": { @@ -3885,7 +3684,7 @@ "comment": " the body of a commit or NULL when no the message only\n consists of a summary" }, "description": "

Get the long "body" of the git commit message.

\n", - "comments": "

The returned message is the body of the commit, comprising\n everything but the first paragraph of the message. Leading and\n trailing whitespaces are trimmed.

\n", + "comments": "

The returned message is the body of the commit, comprising everything but the first paragraph of the message. Leading and trailing whitespaces are trimmed.

\n", "group": "commit" }, "git_commit_time": { @@ -3911,8 +3710,8 @@ "group": "commit", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_commit_time-18", - "ex/v0.28.0/general.html#git_commit_time-19" + "ex/HEAD/general.html#git_commit_time-18", + "ex/HEAD/general.html#git_commit_time-19" ] } }, @@ -3961,13 +3760,13 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_commit_committer-5" + "ex/HEAD/cat-file.html#git_commit_committer-5" ], "general.c": [ - "ex/v0.28.0/general.html#git_commit_committer-20" + "ex/HEAD/general.html#git_commit_committer-20" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_committer-12" + "ex/HEAD/log.html#git_commit_committer-12" ] } }, @@ -3994,15 +3793,15 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_commit_author-6" + "ex/HEAD/cat-file.html#git_commit_author-6" ], "general.c": [ - "ex/v0.28.0/general.html#git_commit_author-21", - "ex/v0.28.0/general.html#git_commit_author-22" + "ex/HEAD/general.html#git_commit_author-21", + "ex/HEAD/general.html#git_commit_author-22" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_author-13", - "ex/v0.28.0/log.html#git_commit_author-14" + "ex/HEAD/log.html#git_commit_author-13", + "ex/HEAD/log.html#git_commit_author-14" ] } }, @@ -4120,11 +3919,11 @@ "group": "commit", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_commit_tree-15", - "ex/v0.28.0/log.html#git_commit_tree-16", - "ex/v0.28.0/log.html#git_commit_tree-17", - "ex/v0.28.0/log.html#git_commit_tree-18", - "ex/v0.28.0/log.html#git_commit_tree-19" + "ex/HEAD/log.html#git_commit_tree-15", + "ex/HEAD/log.html#git_commit_tree-16", + "ex/HEAD/log.html#git_commit_tree-17", + "ex/HEAD/log.html#git_commit_tree-18", + "ex/HEAD/log.html#git_commit_tree-19" ] } }, @@ -4151,7 +3950,7 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_commit_tree_id-7" + "ex/HEAD/cat-file.html#git_commit_tree_id-7" ] } }, @@ -4178,14 +3977,14 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_commit_parentcount-8" + "ex/HEAD/cat-file.html#git_commit_parentcount-8" ], "general.c": [ - "ex/v0.28.0/general.html#git_commit_parentcount-23" + "ex/HEAD/general.html#git_commit_parentcount-23" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_parentcount-20", - "ex/v0.28.0/log.html#git_commit_parentcount-21" + "ex/HEAD/log.html#git_commit_parentcount-20", + "ex/HEAD/log.html#git_commit_parentcount-21" ] } }, @@ -4222,11 +4021,11 @@ "group": "commit", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_commit_parent-24" + "ex/HEAD/general.html#git_commit_parent-24" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_parent-22", - "ex/v0.28.0/log.html#git_commit_parent-23" + "ex/HEAD/log.html#git_commit_parent-22", + "ex/HEAD/log.html#git_commit_parent-23" ] } }, @@ -4258,10 +4057,10 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_commit_parent_id-9" + "ex/HEAD/cat-file.html#git_commit_parent_id-9" ], "log.c": [ - "ex/v0.28.0/log.html#git_commit_parent_id-24" + "ex/HEAD/log.html#git_commit_parent_id-24" ] } }, @@ -4294,7 +4093,7 @@ "comment": " 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code" }, "description": "

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n", - "comments": "

Passing 0 as the generation number returns another instance of the\n base commit itself.

\n", + "comments": "

Passing 0 as the generation number returns another instance of the base commit itself.

\n", "group": "commit" }, "git_commit_header_field": { @@ -4368,7 +4167,7 @@ "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." }, "description": "

Extract the signature from a commit

\n", - "comments": "

If the id is not for a commit, the error class will be\n GIT_ERROR_INVALID. If the commit does not have a signature, the\n error class will be GIT_ERROR_OBJECT.

\n", + "comments": "

If the id is not for a commit, the error class will be GIT_ERROR_INVALID. If the commit does not have a signature, the error class will be GIT_ERROR_OBJECT.

\n", "group": "commit" }, "git_commit_create": { @@ -4435,11 +4234,11 @@ "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" }, "description": "

Create new commit in the repository from a list of git_object pointers

\n", - "comments": "

The message will not be cleaned up automatically. You can do that\n with the git_message_prettify() function.

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", "group": "commit", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_commit_create-7" + "ex/HEAD/merge.html#git_commit_create-7" ] } }, @@ -4502,14 +4301,14 @@ "comment": null }, "description": "

Create new commit in the repository using a variable argument list.

\n", - "comments": "

The message will not be cleaned up automatically. You can do that\n with the git_message_prettify() function.

\n\n

The parents for the commit are specified as a variable list of pointers\n to const git_commit *. Note that this is a convenience method which may\n not be safe to export for certain languages or compilers

\n\n

All other parameters remain the same as git_commit_create().

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", "group": "commit", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_commit_create_v-25" + "ex/HEAD/general.html#git_commit_create_v-25" ], "init.c": [ - "ex/v0.28.0/init.html#git_commit_create_v-1" + "ex/HEAD/init.html#git_commit_create_v-1" ] } }, @@ -4567,7 +4366,7 @@ "comment": null }, "description": "

Amend an existing commit by replacing only non-NULL values.

\n", - "comments": "

This creates a new commit that is exactly the same as the old commit,\n except that any non-NULL values will be updated. The new commit has\n the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(),\n updating the ref to point to the newly rewritten commit. If you want\n to amend a commit that is not currently the tip of the branch and then\n rewrite the following commits to reach a ref, pass this as NULL and\n update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message,\n message_encoding, and tree parameters can be NULL in which case this\n will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", + "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", "group": "commit" }, "git_commit_create_buffer": { @@ -4629,7 +4428,7 @@ "comment": " 0 or an error code" }, "description": "

Create a commit and write it into a buffer

\n", - "comments": "

Create a commit as with git_commit_create() but instead of\n writing it to the objectdb, write the contents of the object into a\n buffer.

\n", + "comments": "

Create a commit as with git_commit_create() but instead of writing it to the objectdb, write the contents of the object into a buffer.

\n", "group": "commit" }, "git_commit_create_with_signature": { @@ -4671,7 +4470,7 @@ "comment": " 0 or an error code" }, "description": "

Create a commit object from the given buffer and signature

\n", - "comments": "

Given the unsigned commit object's contents, its signature and the\n header field in which to store the signature, attach the signature\n to the commit and write it into the given repository.

\n", + "comments": "

Given the unsigned commit object's contents, its signature and the header field in which to store the signature, attach the signature to the commit and write it into the given repository.

\n", "group": "commit" }, "git_commit_dup": { @@ -4704,8 +4503,8 @@ "git_libgit2_version": { "type": "function", "file": "git2/common.h", - "line": 124, - "lineto": 124, + "line": 121, + "lineto": 121, "args": [ { "name": "major", @@ -4736,8 +4535,8 @@ "git_libgit2_features": { "type": "function", "file": "git2/common.h", - "line": 173, - "lineto": 173, + "line": 170, + "lineto": 170, "args": [], "argline": "", "sig": "", @@ -4746,14 +4545,14 @@ "comment": " A combination of GIT_FEATURE_* values." }, "description": "

Query compile time options for libgit2.

\n", - "comments": "
    \n
  • GIT_FEATURE_THREADS\nLibgit2 was compiled with thread support. Note that thread support is\nstill to be seen as a 'work in progress' - basic object lookups are\nbelieved to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS\nLibgit2 supports the https:// protocol. This requires the openssl\nlibrary to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH\nLibgit2 supports the SSH protocol for network operations. This requires\nthe libssh2 library to be found when compiling libgit2

  • \n
\n", + "comments": "
    \n
  • GIT_FEATURE_THREADS Libgit2 was compiled with thread support. Note that thread support is still to be seen as a 'work in progress' - basic object lookups are believed to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS Libgit2 supports the https:// protocol. This requires the openssl library to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH Libgit2 supports the SSH protocol for network operations. This requires the libssh2 library to be found when compiling libgit2

  • \n
\n", "group": "libgit2" }, "git_libgit2_opts": { "type": "function", "file": "git2/common.h", - "line": 402, - "lineto": 402, + "line": 404, + "lineto": 404, "args": [ { "name": "option", @@ -4768,7 +4567,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time\n    by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must\n    > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,\n    > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n    > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path\n    > applied to shared attributes and ignore files, too.\n    >\n    > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.\n    >   Pass NULL to reset to the default (generally based on environment\n    >   variables).  Use magic path `$PATH` to include the old value\n    >   of the path (if you want to prepend or append, for instance).\n    >\n    > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,\n    >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or\n    >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be\n    > considered eligible for caching in memory.  Setting to value to\n    > zero means that that type of object will not be cached.\n    > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k\n    > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory\n    > across all repositories before libgit2 starts evicting objects\n    > from the cache.  This is a soft limit, in that the library might\n    > briefly exceed it, but will start aggressively evicting objects\n    > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.\n    >\n    > Because caches are repository-specific, disabling the cache\n    > cannot immediately clear all cached objects, but each cache will\n    > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be\n    > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.\n    > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.\n    >\n    > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.\n    >\n    > - `file` is the location of a file containing several\n    >   certificates concatenated together.\n    > - `path` is the location of a directory holding several\n    >   certificates, one per file.\n    >\n    > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be\n    > appended to "git/1.0", for compatibility with other git clients.\n    >\n    > - `user_agent` is the value that will be delivered as the\n    >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.\n    > For more information, see the documentation for CreateFile.\n    > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is\n    > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects\n    > to ensure that all inputs to the new objects are valid.  For\n    > example, when this is enabled, the parent(s) and tree inputs\n    > will be validated when creating a new commit.  This defaults\n    > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For\n    > example, `foobar` is not a valid ref, therefore `foobar` is\n    > not a valid target for a symbolic ref by default, whereas\n    > `refs/heads/foobar` is.  Disabling this bypasses validation\n    > so that an arbitrary strings such as `foobar` can be used\n    > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.\n    >\n    > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,\n    > and the negotiation of them when talking to a remote server.\n    > Offset deltas store a delta base location as an offset into the\n    > packfile from the current location, which provides a shorter encoding\n    > and thus smaller resultant packfiles.\n    > Packfiles containing offset deltas can still be read.\n    > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`\n    > (or the platform equivalent) to ensure that new object data\n    > is written to permanent storage, not simply cached.  This\n    > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading\n    > objects from disk. This may impact performance due to an\n    > additional checksum calculation on each object. This defaults\n    > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This\n    > allocator will then be used to make all memory allocations for\n    > libgit2 operations.  If the given `allocator` is NULL, then the\n    > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before\n    > beginning any operation that reloads the index from disk (eg,\n    > checkout).  If there are unsaved changes, the instruction will\n    > fail.  (Using the FORCE flag to checkout will still overwrite\n    > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote. This can be\n    > used to limit maximum memory usage when fetching from an untrusted\n    > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack\n    > file when downloading a pack file from a remote.\n
\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time        by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n
\n", "group": "libgit2" }, "git_config_entry_free": { @@ -4812,7 +4611,7 @@ "comment": " 0 if a global configuration file has been found. Its path will be stored in `out`." }, "description": "

Locate the path to the global configuration file

\n", - "comments": "

The user or global configuration file is usually\n located in $HOME/.gitconfig.

\n\n

This method will try to guess the full path to that\n file, if the file exists. The returned path\n may be used on any git_config call to load the\n global configuration file.

\n\n

This method will not guess the path to the xdg compatible\n config file (.config/git/config).

\n", + "comments": "

The user or global configuration file is usually located in $HOME/.gitconfig.

\n\n

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.

\n\n

This method will not guess the path to the xdg compatible config file (.config/git/config).

\n", "group": "config" }, "git_config_find_xdg": { @@ -4834,7 +4633,7 @@ "comment": " 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`." }, "description": "

Locate the path to the global xdg compatible configuration file

\n", - "comments": "

The xdg compatible configuration file is usually\n located in $HOME/.config/git/config.

\n\n

This method will try to guess the full path to that\n file, if the file exists. The returned path\n may be used on any git_config call to load the\n xdg compatible configuration file.

\n", + "comments": "

The xdg compatible configuration file is usually located in $HOME/.config/git/config.

\n\n

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 xdg compatible configuration file.

\n", "group": "config" }, "git_config_find_system": { @@ -4856,7 +4655,7 @@ "comment": " 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`." }, "description": "

Locate the path to the system configuration file

\n", - "comments": "

If /etc/gitconfig doesn't exist, it will look for\n %PROGRAMFILES%

\n\n

.

\n", + "comments": "

If /etc/gitconfig doesn't exist, it will look for %PROGRAMFILES%.

\n", "group": "config" }, "git_config_find_programdata": { @@ -4878,7 +4677,7 @@ "comment": " 0 if a ProgramData configuration file has been\n\tfound. Its path will be stored in `out`." }, "description": "

Locate the path to the configuration file in ProgramData

\n", - "comments": "

Look for the file in %PROGRAMDATA%

\n\n

used by portable git.

\n", + "comments": "

Look for the file in %PROGRAMDATA% used by portable git.

\n", "group": "config" }, "git_config_open_default": { @@ -4900,7 +4699,7 @@ "comment": " 0 or an error code" }, "description": "

Open the global, XDG and system configuration files

\n", - "comments": "

Utility wrapper that finds the global, XDG and system configuration files\n and opens them into a single prioritized config object that can be\n used when accessing default config data outside a repository.

\n", + "comments": "

Utility wrapper that finds the global, XDG and system configuration files and opens them into a single prioritized config object that can be used when accessing default config data outside a repository.

\n", "group": "config" }, "git_config_new": { @@ -4922,7 +4721,7 @@ "comment": " 0 or an error code" }, "description": "

Allocate a new configuration object

\n", - "comments": "

This object is empty, so you have to add a file to it before you\n can do anything with it.

\n", + "comments": "

This object is empty, so you have to add a file to it before you can do anything with it.

\n", "group": "config" }, "git_config_add_file_ondisk": { @@ -4964,7 +4763,7 @@ "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code" }, "description": "

Add an on-disk config file instance to an existing config

\n", - "comments": "

The on-disk file pointed at by path will be opened and\n parsed; it's expected to be a native Git config file following\n the default Git config syntax (see man git-config).

\n\n

If the file does not exist, the file will still be added and it\n will be created the first time we write to it.

\n\n

Note that the configuration object will free the file\n automatically.

\n\n

Further queries on this config object will access each\n of the config file instances in order (instances with\n a higher priority level will be accessed first).

\n", + "comments": "

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).

\n\n

If the file does not exist, the file will still be added and it will be created the first time we write to it.

\n\n

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", "group": "config" }, "git_config_open_ondisk": { @@ -4991,11 +4790,11 @@ "comment": " 0 on success, or an error code" }, "description": "

Create a new config instance containing a single on-disk file

\n", - "comments": "

This method is a simple utility wrapper for the following sequence\n of calls:\n - git_config_new\n - git_config_add_file_ondisk

\n", + "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", "group": "config", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_config_open_ondisk-26" + "ex/HEAD/general.html#git_config_open_ondisk-26" ] } }, @@ -5028,7 +4827,7 @@ "comment": " 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code" }, "description": "

Build a single-level focused config object from a multi-level one.

\n", - "comments": "

The returned config object can be used to perform get/set/delete operations\n on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config\n will return different config instances, but containing the same config_file\n instance.

\n", + "comments": "

The returned config object can be used to perform get/set/delete operations on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config will return different config instances, but containing the same config_file instance.

\n", "group": "config" }, "git_config_open_global": { @@ -5055,7 +4854,7 @@ "comment": null }, "description": "

Open the global/XDG configuration file according to git's rules

\n", - "comments": "

Git allows you to store your global configuration at\n $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards\n compatability, the XDG file shouldn't be used unless the use has\n created it explicitly. With this function you'll open the correct\n one to write to.

\n", + "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatability, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", "group": "config" }, "git_config_snapshot": { @@ -5082,7 +4881,7 @@ "comment": " 0 or an error code" }, "description": "

Create a snapshot of the configuration

\n", - "comments": "

Create a snapshot of the current state of a configuration, which\n allows you to look into a consistent view of the configuration for\n looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid\n until it is freed.

\n", + "comments": "

Create a snapshot of the current state of a configuration, which allows you to look into a consistent view of the configuration for looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid until it is freed.

\n", "group": "config" }, "git_config_free": { @@ -5108,8 +4907,8 @@ "group": "config", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_config_free-27", - "ex/v0.28.0/general.html#git_config_free-28" + "ex/HEAD/general.html#git_config_free-27", + "ex/HEAD/general.html#git_config_free-28" ] } }, @@ -5153,33 +4952,33 @@ "args": [ { "name": "out", - "type": "int *", - "comment": null + "type": "int32_t *", + "comment": "pointer to the variable where the value should be stored" }, { "name": "cfg", "type": "const git_config *", - "comment": null + "comment": "where to look for the variable" }, { "name": "name", "type": "const char *", - "comment": null + "comment": "the variable's name" } ], - "argline": "int *out, const git_config *cfg, const char *name", - "sig": "int *::const git_config *::const char *", + "argline": "int32_t *out, const git_config *cfg, const char *name", + "sig": "int32_t *::const git_config *::const char *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, - "description": "", - "comments": "", + "description": "

Get the value of an integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", "group": "config", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_config_get_int32-29", - "ex/v0.28.0/general.html#git_config_get_int32-30" + "ex/HEAD/general.html#git_config_get_int32-29", + "ex/HEAD/general.html#git_config_get_int32-30" ] } }, @@ -5191,28 +4990,28 @@ "args": [ { "name": "out", - "type": "int *", - "comment": null + "type": "int64_t *", + "comment": "pointer to the variable where the value should be stored" }, { "name": "cfg", "type": "const git_config *", - "comment": null + "comment": "where to look for the variable" }, { "name": "name", "type": "const char *", - "comment": null + "comment": "the variable's name" } ], - "argline": "int *out, const git_config *cfg, const char *name", - "sig": "int *::const git_config *::const char *", + "argline": "int64_t *out, const git_config *cfg, const char *name", + "sig": "int64_t *::const git_config *::const char *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, - "description": "", - "comments": "", + "description": "

Get the value of a long integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_bool": { @@ -5244,7 +5043,7 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a boolean config variable.

\n", - "comments": "

This function uses the usual C convention of 0 being false and\n anything else true.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", + "comments": "

This function uses the usual C convention of 0 being false and anything else true.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_path": { @@ -5276,7 +5075,7 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a path config variable.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which\n defaults to the user's home directory but can be overridden via\n git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_string": { @@ -5308,12 +5107,12 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a string config variable.

\n", - "comments": "

This function can only be used on snapshot config objects. The\n string is owned by the config and should not be freed by the\n user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", + "comments": "

This function can only be used on snapshot config objects. The string is owned by the config and should not be freed by the user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", "group": "config", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_config_get_string-31", - "ex/v0.28.0/general.html#git_config_get_string-32" + "ex/HEAD/general.html#git_config_get_string-31", + "ex/HEAD/general.html#git_config_get_string-32" ] } }, @@ -5346,7 +5145,7 @@ "comment": " 0 or an error code" }, "description": "

Get the value of a string config variable.

\n", - "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their\n defined level. A higher level means a higher priority. The\n first occurrence of the variable will be returned here.

\n", + "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", "group": "config" }, "git_config_get_multivar_foreach": { @@ -5388,7 +5187,7 @@ "comment": null }, "description": "

Get each value of a multivar in a foreach callback

\n", - "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", + "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", "group": "config" }, "git_config_multivar_iterator_new": { @@ -5425,7 +5224,7 @@ "comment": null }, "description": "

Get each value of a multivar

\n", - "comments": "

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", + "comments": "

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", "group": "config" }, "git_config_next": { @@ -5452,7 +5251,7 @@ "comment": " 0 or an error code. GIT_ITEROVER if the iteration has completed" }, "description": "

Return the current entry and advance the iterator

\n", - "comments": "

The pointers returned by this function are valid until the iterator\n is freed.

\n", + "comments": "

The pointers returned by this function are valid until the iterator is freed.

\n", "group": "config" }, "git_config_iterator_free": { @@ -5486,26 +5285,26 @@ { "name": "cfg", "type": "git_config *", - "comment": null + "comment": "where to look for the variable" }, { "name": "name", "type": "const char *", - "comment": null + "comment": "the variable's name" }, { "name": "value", - "type": "int", - "comment": null + "type": "int32_t", + "comment": "Integer value for the variable" } ], - "argline": "git_config *cfg, const char *name, int value", - "sig": "git_config *::const char *::int", + "argline": "git_config *cfg, const char *name, int32_t value", + "sig": "git_config *::const char *::int32_t", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, - "description": "", + "description": "

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n", "comments": "", "group": "config" }, @@ -5518,26 +5317,26 @@ { "name": "cfg", "type": "git_config *", - "comment": null + "comment": "where to look for the variable" }, { "name": "name", "type": "const char *", - "comment": null + "comment": "the variable's name" }, { "name": "value", - "type": "int", - "comment": null + "type": "int64_t", + "comment": "Long integer value for the variable" } ], - "argline": "git_config *cfg, const char *name, int value", - "sig": "git_config *::const char *::int", + "argline": "git_config *cfg, const char *name, int64_t value", + "sig": "git_config *::const char *::int64_t", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, - "description": "", + "description": "

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n", "comments": "", "group": "config" }, @@ -5602,7 +5401,7 @@ "comment": " 0 or an error code" }, "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "

A copy of the string is made and the user is free to use it\n afterwards.

\n", + "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", "group": "config" }, "git_config_set_multivar": { @@ -5730,7 +5529,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Perform an operation on each config variable.

\n", - "comments": "

The callback receives the normalized name and value of each variable\n in the config backend, and the data pointer passed to this function.\n If the callback returns a non-zero value, the function stops iterating\n and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the\n iteration is ongoing.

\n", + "comments": "

The callback receives the normalized name and value of each variable in the config backend, and the data pointer passed to this function. If the callback returns a non-zero value, the function stops iterating and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the iteration is ongoing.

\n", "group": "config" }, "git_config_iterator_new": { @@ -5757,7 +5556,7 @@ "comment": null }, "description": "

Iterate over all the config variables

\n", - "comments": "

Use git_config_next to advance the iteration and\n git_config_iterator_free when done.

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n", "group": "config" }, "git_config_iterator_glob_new": { @@ -5789,7 +5588,7 @@ "comment": null }, "description": "

Iterate over all the config variables whose name matches a pattern

\n", - "comments": "

Use git_config_next to advance the iteration and\n git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", "group": "config" }, "git_config_foreach_match": { @@ -5826,7 +5625,7 @@ "comment": " 0 or the return value of the callback which didn't return 0" }, "description": "

Perform an operation on each config variable matching a regular expression.

\n", - "comments": "

This behaves like git_config_foreach with an additional filter of a\n regular expression that filters which config keys are passed to the\n callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the case-insensitive parts are lower-case.

\n", + "comments": "

This behaves like git_config_foreach with an additional filter of a regular expression that filters which config keys are passed to the callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the case-insensitive parts are lower-case.

\n", "group": "config" }, "git_config_get_mapped": { @@ -5868,7 +5667,7 @@ "comment": " 0 on success, error code otherwise" }, "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", - "comments": "

This is a helper method to easily map different possible values\n to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_cvar_map autocrlf_mapping[] = {\n    {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},\n    {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},\n    {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},\n    {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the\n mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing\n the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison),\n the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be\n returned.

\n", + "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_cvar_map autocrlf_mapping[] = {     {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", "group": "config" }, "git_config_lookup_map_value": { @@ -5932,7 +5731,7 @@ "comment": null }, "description": "

Parse a string value as a bool.

\n", - "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any\n number different from 0\n Valid values for false are: 'false', 'no', 'off', 0

\n", + "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any number different from 0 Valid values for false are: 'false', 'no', 'off', 0

\n", "group": "config" }, "git_config_parse_int32": { @@ -5943,23 +5742,23 @@ "args": [ { "name": "out", - "type": "int *", - "comment": null + "type": "int32_t *", + "comment": "place to store the result of the parsing" }, { "name": "value", "type": "const char *", - "comment": null + "comment": "value to parse" } ], - "argline": "int *out, const char *value", - "sig": "int *::const char *", + "argline": "int32_t *out, const char *value", + "sig": "int32_t *::const char *", "return": { "type": "int", "comment": null }, - "description": "", - "comments": "", + "description": "

Parse a string value as an int32.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", "group": "config" }, "git_config_parse_int64": { @@ -5970,23 +5769,23 @@ "args": [ { "name": "out", - "type": "int *", - "comment": null + "type": "int64_t *", + "comment": "place to store the result of the parsing" }, { "name": "value", "type": "const char *", - "comment": null + "comment": "value to parse" } ], - "argline": "int *out, const char *value", - "sig": "int *::const char *", + "argline": "int64_t *out, const char *value", + "sig": "int64_t *::const char *", "return": { "type": "int", "comment": null }, - "description": "", - "comments": "", + "description": "

Parse a string value as an int64.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", "group": "config" }, "git_config_parse_path": { @@ -6013,7 +5812,7 @@ "comment": null }, "description": "

Parse a string value as a path.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which\n defaults to the user's home directory but can be overridden via\n git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be\n returned.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be returned.

\n", "group": "config" }, "git_config_backend_foreach_match": { @@ -6050,7 +5849,7 @@ "comment": null }, "description": "

Perform an operation on each config variable in a given config backend,\n matching a regular expression.

\n", - "comments": "

This behaves like git_config_foreach_match except that only config\n entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of\n the variable name: the section and variable parts are lower-cased. The\n subsection is left unchanged.

\n", + "comments": "

This behaves like git_config_foreach_match except that only config entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", "group": "config" }, "git_config_lock": { @@ -6077,7 +5876,7 @@ "comment": " 0 or an error code" }, "description": "

Lock the backend with the highest priority

\n", - "comments": "

Locking disallows anybody else from writing to that backend. Any\n updates made after locking will not be visible to a reader until\n the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit()\n before freeing the transaction. Either of these actions will unlock\n the config.

\n", + "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", "group": "config" }, "git_cred_userpass": { @@ -6122,11 +5921,43 @@ "comments": "", "group": "cred" }, + "git_blob_create_fromworkdir": { + "type": "function", + "file": "git2/deprecated.h", + "line": 80, + "lineto": 80, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": null + }, + { + "name": "repo", + "type": "git_repository *", + "comment": null + }, + { + "name": "relative_path", + "type": "const char *", + "comment": null + } + ], + "argline": "git_oid *id, git_repository *repo, const char *relative_path", + "sig": "git_oid *::git_repository *::const char *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility values at this time.

\n\n

@{

\n", + "group": "blob" + }, "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 51, - "lineto": 51, + "line": 115, + "lineto": 115, "args": [ { "name": "buffer", @@ -6141,14 +5972,14 @@ "comment": null }, "description": "

Free the memory referred to by the git_buf. This is an alias of\n git_buf_dispose and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "buf" }, "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 112, - "lineto": 112, + "line": 176, + "lineto": 176, "args": [], "argline": "", "sig": "", @@ -6157,14 +5988,14 @@ "comment": null }, "description": "

Return the last git_error object that was generated for the\n current thread. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "giterr" }, "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 124, - "lineto": 124, + "line": 188, + "lineto": 188, "args": [], "argline": "", "sig": "", @@ -6173,14 +6004,14 @@ "comment": null }, "description": "

Clear the last error. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "giterr" }, "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 136, - "lineto": 136, + "line": 200, + "lineto": 200, "args": [ { "name": "error_class", @@ -6200,14 +6031,14 @@ "comment": null }, "description": "

Sets the error message to the given string. This is an alias of\n git_error_set_str and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "giterr" }, "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 148, - "lineto": 148, + "line": 212, + "lineto": 212, "args": [], "argline": "", "sig": "", @@ -6216,10 +6047,59 @@ "comment": null }, "description": "

Indicates that an out-of-memory situation occured. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "giterr" }, - "git_describe_init_options": { + "git_oid_iszero": { + "type": "function", + "file": "git2/deprecated.h", + "line": 364, + "lineto": 364, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": null + } + ], + "argline": "const git_oid *id", + "sig": "const git_oid *", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "

These types are retained for backward compatibility. The newer versions of these values should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility values at this time.

\n\n

@{

\n", + "group": "oid" + }, + "git_blame_init_options": { + "type": "function", + "file": "git2/deprecated.h", + "line": 423, + "lineto": 423, + "args": [ + { + "name": "opts", + "type": "git_blame_options *", + "comment": null + }, + { + "name": "version", + "type": "unsigned int", + "comment": null + } + ], + "argline": "git_blame_options *opts, unsigned int version", + "sig": "git_blame_options *::unsigned int", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility functions at this time.

\n\n

@{

\n", + "group": "blame" + }, + "git_describe_options_init": { "type": "function", "file": "git2/describe.h", "line": 82, @@ -6243,15 +6123,15 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_describe_options structure

\n", - "comments": "

Initializes a git_describe_options with default values. Equivalent to creating\n an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_describe_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", "group": "describe", "examples": { "describe.c": [ - "ex/v0.28.0/describe.html#git_describe_init_options-1" + "ex/HEAD/describe.html#git_describe_options_init-1" ] } }, - "git_describe_init_format_options": { + "git_describe_format_options_init": { "type": "function", "file": "git2/describe.h", "line": 129, @@ -6275,11 +6155,11 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_describe_format_options structure

\n", - "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating\n an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", "group": "describe", "examples": { "describe.c": [ - "ex/v0.28.0/describe.html#git_describe_init_format_options-2" + "ex/HEAD/describe.html#git_describe_format_options_init-2" ] } }, @@ -6316,7 +6196,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v0.28.0/describe.html#git_describe_commit-3" + "ex/HEAD/describe.html#git_describe_commit-3" ] } }, @@ -6349,11 +6229,11 @@ "comment": null }, "description": "

Describe a commit

\n", - "comments": "

Perform the describe operation on the current commit and the\n worktree. After peforming describe on HEAD, a status is run and the\n description is considered to be dirty if there are.

\n", + "comments": "

Perform the describe operation on the current commit and the worktree. After peforming describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", "group": "describe", "examples": { "describe.c": [ - "ex/v0.28.0/describe.html#git_describe_workdir-4" + "ex/HEAD/describe.html#git_describe_workdir-4" ] } }, @@ -6390,7 +6270,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v0.28.0/describe.html#git_describe_format-5" + "ex/HEAD/describe.html#git_describe_format-5" ] } }, @@ -6416,7 +6296,7 @@ "comments": "", "group": "describe" }, - "git_diff_init_options": { + "git_diff_options_init": { "type": "function", "file": "git2/diff.h", "line": 454, @@ -6440,10 +6320,10 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_diff_options structure

\n", - "comments": "

Initializes a git_diff_options with default values. Equivalent to creating\n an instance with GIT_DIFF_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_diff_options with default values. Equivalent to creating an instance with GIT_DIFF_OPTIONS_INIT.

\n", "group": "diff" }, - "git_diff_find_init_options": { + "git_diff_find_options_init": { "type": "function", "file": "git2/diff.h", "line": 787, @@ -6467,7 +6347,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_diff_find_options structure

\n", - "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating\n an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", "group": "diff" }, "git_diff_free": { @@ -6493,11 +6373,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_free-2" + "ex/HEAD/diff.html#git_diff_free-2" ], "log.c": [ - "ex/v0.28.0/log.html#git_diff_free-25", - "ex/v0.28.0/log.html#git_diff_free-26" + "ex/HEAD/log.html#git_diff_free-25", + "ex/HEAD/log.html#git_diff_free-26" ] } }, @@ -6540,15 +6420,15 @@ "comment": null }, "description": "

Create a diff with the difference between two tree objects.

\n", - "comments": "

This is equivalent to git diff \n<old\n-tree> \n<new\n-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the\n second tree will be used for the "new_file" side of the delta. You can\n pass NULL to indicate an empty tree, although it is an error to pass\n NULL for both the old_tree and new_tree.

\n", + "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_tree_to_tree-3" + "ex/HEAD/diff.html#git_diff_tree_to_tree-3" ], "log.c": [ - "ex/v0.28.0/log.html#git_diff_tree_to_tree-27", - "ex/v0.28.0/log.html#git_diff_tree_to_tree-28" + "ex/HEAD/log.html#git_diff_tree_to_tree-27", + "ex/HEAD/log.html#git_diff_tree_to_tree-28" ] } }, @@ -6591,11 +6471,11 @@ "comment": null }, "description": "

Create a diff between a tree and repository index.

\n", - "comments": "

This is equivalent to `git diff --cached \n<treeish

\n\n
\n

or if you pass\n the HEAD tree, then likegit diff --cached`.

\n
\n\n

The tree you pass will be used for the "old_file" side of the delta, and\n the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo\n will be used. In this case, the index will be refreshed from disk\n (if it has changed) before the diff is generated.

\n", + "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_tree_to_index-4" + "ex/HEAD/diff.html#git_diff_tree_to_index-4" ] } }, @@ -6633,11 +6513,11 @@ "comment": null }, "description": "

Create a diff between the repository index and the workdir directory.

\n", - "comments": "

This matches the git diff command. See the note below on\n git_diff_tree_to_workdir for a discussion of the difference between\n git diff and git diff HEAD and how to emulate a `git diff \n<treeish

\n\n
\n

`\n using libgit2.

\n
\n\n

The index will be used for the "old_file" side of the delta, and the\n working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo\n will be used. In this case, the index will be refreshed from disk\n (if it has changed) before the diff is generated.

\n", + "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_index_to_workdir-5" + "ex/HEAD/diff.html#git_diff_index_to_workdir-5" ] } }, @@ -6675,11 +6555,11 @@ "comment": null }, "description": "

Create a diff between a tree and the working directory.

\n", - "comments": "

The tree you provide will be used for the "old_file" side of the delta,\n and the working directory will be used for the "new_file" side.

\n\n

This is not the same as `git diff \n<treeish

\n\n
\n

orgit diff-index

\n
\n\n

<treeish

\n\n
\n

. Those commands use information from the index, whereas this\n function strictly returns the differences between the tree and the files\n in the working directory, regardless of the state of the index. Use\ngit_diff_tree_to_workdir_with_index` to emulate those commands.

\n
\n\n

To see difference between this and git_diff_tree_to_workdir_with_index,\n consider the example of a staged file deletion where the file has then\n been put back into the working dir and further modified. The\n tree-to-workdir diff for that file is 'modified', but git diff would\n show status 'deleted' since there is a staged delete.

\n", + "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_tree_to_workdir-6" + "ex/HEAD/diff.html#git_diff_tree_to_workdir-6" ] } }, @@ -6717,11 +6597,11 @@ "comment": null }, "description": "

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n", - "comments": "

This emulates `git diff \n<tree

\n\n
\n

` by diffing the tree to the index and\n the index to the working directory and blending the results into a\n single diff that includes staged deleted, etc.

\n
\n", + "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_tree_to_workdir_with_index-7" + "ex/HEAD/diff.html#git_diff_tree_to_workdir_with_index-7" ] } }, @@ -6764,7 +6644,7 @@ "comment": null }, "description": "

Create a diff with the difference between two index objects.

\n", - "comments": "

The first index will be used for the "old_file" side of the delta and the\n second index will be used for the "new_file" side of the delta.

\n", + "comments": "

The first index will be used for the "old_file" side of the delta and the second index will be used for the "new_file" side of the delta.

\n", "group": "diff" }, "git_diff_merge": { @@ -6791,7 +6671,7 @@ "comment": null }, "description": "

Merge one diff into another.

\n", - "comments": "

This merges items from the "from" list into the "onto" list. The\n resulting diff will have all items that appear in either list.\n If an item appears in both lists, then it will be "merged" to appear\n as if the old version was from the "onto" list and the new version\n is from the "from" list (with the exception that if the item has a\n pending DELETE in the middle, then it will show as deleted).

\n", + "comments": "

This merges items from the "from" list into the "onto" list. The resulting diff will have all items that appear in either list. If an item appears in both lists, then it will be "merged" to appear as if the old version was from the "onto" list and the new version is from the "from" list (with the exception that if the item has a pending DELETE in the middle, then it will show as deleted).

\n", "group": "diff" }, "git_diff_find_similar": { @@ -6818,11 +6698,11 @@ "comment": " 0 on success, -1 on failure" }, "description": "

Transform a diff marking file renames, copies, etc.

\n", - "comments": "

This modifies a diff in place, replacing old entries that look\n like renames or copies with new entries reflecting those changes.\n This also will, if requested, break modified files into add/remove\n pairs if the amount of change is above a threshold.

\n", + "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_find_similar-8" + "ex/HEAD/diff.html#git_diff_find_similar-8" ] } }, @@ -6849,7 +6729,7 @@ "group": "diff", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_diff_num_deltas-29" + "ex/HEAD/log.html#git_diff_num_deltas-29" ] } }, @@ -6877,7 +6757,7 @@ "comment": " Count of number of deltas matching delta_t type" }, "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", - "comments": "

This works just like git_diff_entrycount() with an extra parameter\n that is a git_delta_t and returns just the count of how many deltas\n match that particular type.

\n", + "comments": "

This works just like git_diff_entrycount() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", "group": "diff" }, "git_diff_get_delta": { @@ -6904,7 +6784,7 @@ "comment": " Pointer to git_diff_delta (or NULL if `idx` out of range)" }, "description": "

Return the diff delta for an entry in the diff list.

\n", - "comments": "

The git_diff_delta pointer points to internal data and you do not\n have to release it when you are done with it. It will go away when\n the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary\n content or not may not be set if there are no attributes set for the\n file and there has been no reason to load the file data at this point.\n For now, if you need those flags to be up to date, your only option is\n to either use git_diff_foreach or create a git_patch.

\n", + "comments": "

The git_diff_delta pointer points to internal data and you do not have to release it when you are done with it. It will go away when the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary content or not may not be set if there are no attributes set for the file and there has been no reason to load the file data at this point. For now, if you need those flags to be up to date, your only option is to either use git_diff_foreach or create a git_patch.

\n", "group": "diff" }, "git_diff_is_sorted_icase": { @@ -6973,7 +6853,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Loop over all deltas in a diff issuing callbacks.

\n", - "comments": "

This will iterate through all of the files described in a diff. You\n should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the\n files will only be calculated if they are not NULL. Of course, these\n callbacks will not be invoked for binary files on the diff or for\n files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate\n the iteration and return the value to the user.

\n", + "comments": "

This will iterate through all of the files described in a diff. You should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the files will only be calculated if they are not NULL. Of course, these callbacks will not be invoked for binary files on the diff or for files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate the iteration and return the value to the user.

\n", "group": "diff" }, "git_diff_status_char": { @@ -6995,7 +6875,7 @@ "comment": " The single character label for that code" }, "description": "

Look up the single character abbreviation for a delta status code.

\n", - "comments": "

When you run git diff --name-status it uses single letter codes in\n the output such as 'A' for added, 'D' for deleted, 'M' for modified,\n etc. This function converts a git_delta_t value into these letters for\n your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", + "comments": "

When you run git diff --name-status it uses single letter codes in the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. This function converts a git_delta_t value into these letters for your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", "group": "diff" }, "git_diff_print": { @@ -7032,14 +6912,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Iterate over a diff generating formatted text output.

\n", - "comments": "

Returning a non-zero value from the callbacks will terminate the\n iteration and return the non-zero value to the caller.

\n", + "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_print-9" + "ex/HEAD/diff.html#git_diff_print-9" ], "log.c": [ - "ex/v0.28.0/log.html#git_diff_print-30" + "ex/HEAD/log.html#git_diff_print-30" ] } }, @@ -7139,7 +7019,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Directly run a diff on two blobs.

\n", - "comments": "

Compared to a file, a blob lacks some contextual information. As such,\n the git_diff_file given to the callback will have some fake data; i.e.\n mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated\n as an empty blob, with the oid set to NULL in the git_diff_file data.\n Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob\n looks like binary data, the git_diff_delta binary attribute will be set\n to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass\n GIT_DIFF_FORCE_TEXT of course).

\n", + "comments": "

Compared to a file, a blob lacks some contextual information. As such, the git_diff_file given to the callback will have some fake data; i.e. mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated as an empty blob, with the oid set to NULL in the git_diff_file data. Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob looks like binary data, the git_diff_delta binary attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass GIT_DIFF_FORCE_TEXT of course).

\n", "group": "diff" }, "git_diff_blob_to_buffer": { @@ -7211,7 +7091,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Directly run a diff between a blob and a buffer.

\n", - "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context,\n so the git_diff_file parameters to the callbacks will be faked a la the\n rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the\n file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the\n entire content of the buffer added). Passing NULL to the buffer will do\n the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", + "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the entire content of the buffer added). Passing NULL to the buffer will do the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", "group": "diff" }, "git_diff_buffers": { @@ -7288,7 +7168,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Directly run a diff between two buffers.

\n", - "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks\n context, so the git_diff_file parameters to the callbacks will be\n faked a la the rules for git_diff_blobs().

\n", + "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n", "group": "diff" }, "git_diff_from_buffer": { @@ -7320,7 +7200,7 @@ "comment": " 0 or an error code" }, "description": "

Read the contents of a git patch file into a git_diff object.

\n", - "comments": "

The diff object produced is similar to the one that would be\n produced if you actually produced it computationally by comparing\n two trees, however there may be subtle differences. For example,\n a patch file likely contains abbreviated object IDs, so the\n object IDs in a git_diff_delta produced by this function will\n also be abbreviated.

\n\n

This function will only read patch files created by a git\n implementation, it will not read unified diffs produced by\n the diff program, nor any other types of patch files.

\n", + "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", "group": "diff" }, "git_diff_get_stats": { @@ -7351,7 +7231,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_get_stats-10" + "ex/HEAD/diff.html#git_diff_get_stats-10" ] } }, @@ -7459,7 +7339,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_stats_to_buf-11" + "ex/HEAD/diff.html#git_diff_stats_to_buf-11" ] } }, @@ -7486,7 +7366,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_diff_stats_free-12" + "ex/HEAD/diff.html#git_diff_stats_free-12" ] } }, @@ -7574,7 +7454,7 @@ "comments": "

Does not support creating patches for merge commits (yet).

\n", "group": "diff" }, - "git_diff_format_email_init_options": { + "git_diff_format_email_options_init": { "type": "function", "file": "git2/diff.h", "line": 1451, @@ -7598,10 +7478,10 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_diff_format_email_options structure

\n", - "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent\n to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", "group": "diff" }, - "git_diff_patchid_init_options": { + "git_diff_patchid_options_init": { "type": "function", "file": "git2/diff.h", "line": 1479, @@ -7625,7 +7505,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_diff_patchid_options structure

\n", - "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to\n creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", "group": "diff" }, "git_diff_patchid": { @@ -7657,7 +7537,7 @@ "comment": " 0 on success, an error code otherwise." }, "description": "

Calculate the patch ID for the given patch.

\n", - "comments": "

Calculate a stable patch ID for the given patch by summing the\n hash of the file diffs, ignoring whitespace and line numbers.\n This can be used to derive whether two diffs are the same with\n a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as\n defined in git-patch-id(1), and should in fact generate the\n same IDs as the upstream git project does.

\n", + "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", "group": "diff" }, "git_error_last": { @@ -7673,21 +7553,21 @@ "comment": " A git_error object." }, "description": "

Return the last git_error object that was generated for the\n current thread.

\n", - "comments": "

The default behaviour of this function is to return NULL if no previous error has occurred.\n However, libgit2's error strings are not cleared aggressively, so a prior\n (unrelated) error may be returned. This can be avoided by only calling\n this function if the prior call to a libgit2 API returned an error.

\n", + "comments": "

The default behaviour of this function is to return NULL if no previous error has occurred. However, libgit2's error strings are not cleared aggressively, so a prior (unrelated) error may be returned. This can be avoided by only calling this function if the prior call to a libgit2 API returned an error.

\n", "group": "error", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_error_last-8", - "ex/v0.28.0/checkout.html#git_error_last-9", - "ex/v0.28.0/checkout.html#git_error_last-10", - "ex/v0.28.0/checkout.html#git_error_last-11" + "ex/HEAD/checkout.html#git_error_last-8", + "ex/HEAD/checkout.html#git_error_last-9", + "ex/HEAD/checkout.html#git_error_last-10", + "ex/HEAD/checkout.html#git_error_last-11" ], "general.c": [ - "ex/v0.28.0/general.html#git_error_last-33" + "ex/HEAD/general.html#git_error_last-33" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_error_last-8", - "ex/v0.28.0/merge.html#git_error_last-9" + "ex/HEAD/merge.html#git_error_last-8", + "ex/HEAD/merge.html#git_error_last-9" ] } }, @@ -7731,7 +7611,7 @@ "comment": null }, "description": "

Set the error message string for this thread.

\n", - "comments": "

This function is public so that custom ODB backends and the like can\n relay an error message through libgit2. Most regular users of libgit2\n will never need to call this function -- actually, calling it in most\n circumstances (for example, calling from within a callback function)\n will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies\n to the particular thread that this libgit2 call is made from.

\n", + "comments": "

This function is public so that custom ODB backends and the like can relay an error message through libgit2. Most regular users of libgit2 will never need to call this function -- actually, calling it in most circumstances (for example, calling from within a callback function) will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies to the particular thread that this libgit2 call is made from.

\n", "group": "error" }, "git_error_set_oom": { @@ -7747,7 +7627,7 @@ "comment": null }, "description": "

Set the error message to a special value for memory allocation failure.

\n", - "comments": "

The normal git_error_set_str() function attempts to strdup() the\n string that is passed in. This is not a good idea when the error in\n question is a memory allocation failure. That circumstance has a\n special setter function that sets the error string to a known and\n statically allocated internal value.

\n", + "comments": "

The normal git_error_set_str() function attempts to strdup() the string that is passed in. This is not a good idea when the error in question is a memory allocation failure. That circumstance has a special setter function that sets the error string to a known and statically allocated internal value.

\n", "group": "error" }, "git_filter_list_load": { @@ -7759,42 +7639,42 @@ { "name": "filters", "type": "git_filter_list **", - "comment": null + "comment": "Output newly created git_filter_list (or NULL)" }, { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "Repository object that contains `path`" }, { "name": "blob", "type": "git_blob *", - "comment": null + "comment": "The blob to which the filter will be applied (if known)" }, { "name": "path", "type": "const char *", - "comment": null + "comment": "Relative path of the file to be filtered" }, { "name": "mode", "type": "git_filter_mode_t", - "comment": null + "comment": "Filtering direction (WT->ODB or ODB->WT)" }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "Combination of `git_filter_flag_t` flags" } ], - "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, int flags", - "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::int", + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t", "return": { "type": "int", - "comment": null + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" }, - "description": "", - "comments": "", + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", "group": "filter" }, "git_filter_list_contains": { @@ -7821,7 +7701,7 @@ "comment": " 1 if the filter is in the list, 0 otherwise" }, "description": "

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n", - "comments": "

This will return 0 if the given filter is not in the list, or 1 if\n the filter will be applied.

\n", + "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", "group": "filter" }, "git_filter_list_apply_to_data": { @@ -7853,7 +7733,7 @@ "comment": " 0 on success, an error code otherwise" }, "description": "

Apply filter list to a data buffer.

\n", - "comments": "

See git2/buffer.h for background on git_buf objects.

\n\n

If the in buffer holds data allocated by libgit2 (i.e. in->asize is\n not zero), then it will be overwritten when applying the filters. If\n not, then it will be left untouched.

\n\n

If there are no filters to apply (or filters is NULL), then the out\n buffer will reference the in buffer data (with asize set to zero)\n instead of allocating data. This keeps allocations to a minimum, but\n it means you have to be careful about freeing the in data since out\n may be pointing to it!

\n", + "comments": "

See git2/buffer.h for background on git_buf objects.

\n\n

If the in buffer holds data allocated by libgit2 (i.e. in->asize is not zero), then it will be overwritten when applying the filters. If not, then it will be left untouched.

\n\n

If there are no filters to apply (or filters is NULL), then the out buffer will reference the in buffer data (with asize set to zero) instead of allocating data. This keeps allocations to a minimum, but it means you have to be careful about freeing the in data since out may be pointing to it!

\n", "group": "filter" }, "git_filter_list_apply_to_file": { @@ -8061,50 +7941,11 @@ "comment": " the number of initializations of the library, or an error code." }, "description": "

Init the global state

\n", - "comments": "

This function must be called before any other libgit2 function in\n order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number\n of times the initialization has been called (including this one) that have\n not subsequently been shutdown.

\n", + "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", "group": "libgit2", "examples": { - "blame.c": [ - "ex/v0.28.0/blame.html#git_libgit2_init-8" - ], - "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_libgit2_init-10" - ], - "checkout.c": [ - "ex/v0.28.0/checkout.html#git_libgit2_init-12" - ], - "describe.c": [ - "ex/v0.28.0/describe.html#git_libgit2_init-6" - ], - "diff.c": [ - "ex/v0.28.0/diff.html#git_libgit2_init-13" - ], "general.c": [ - "ex/v0.28.0/general.html#git_libgit2_init-34" - ], - "init.c": [ - "ex/v0.28.0/init.html#git_libgit2_init-2" - ], - "log.c": [ - "ex/v0.28.0/log.html#git_libgit2_init-31" - ], - "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_libgit2_init-1" - ], - "merge.c": [ - "ex/v0.28.0/merge.html#git_libgit2_init-10" - ], - "remote.c": [ - "ex/v0.28.0/remote.html#git_libgit2_init-2" - ], - "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_libgit2_init-1" - ], - "status.c": [ - "ex/v0.28.0/status.html#git_libgit2_init-1" - ], - "tag.c": [ - "ex/v0.28.0/tag.html#git_libgit2_init-3" + "ex/HEAD/general.html#git_libgit2_init-34" ] } }, @@ -8121,49 +7962,8 @@ "comment": " the number of remaining initializations of the library, or an\n error code." }, "description": "

Shutdown the global state

\n", - "comments": "

Clean up the global state and threading context after calling it as\n many times as git_libgit2_init() was called - it will return the\n number of remainining initializations that have not been shutdown\n (after this one).

\n", - "group": "libgit2", - "examples": { - "blame.c": [ - "ex/v0.28.0/blame.html#git_libgit2_shutdown-9" - ], - "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_libgit2_shutdown-11" - ], - "checkout.c": [ - "ex/v0.28.0/checkout.html#git_libgit2_shutdown-13" - ], - "describe.c": [ - "ex/v0.28.0/describe.html#git_libgit2_shutdown-7" - ], - "diff.c": [ - "ex/v0.28.0/diff.html#git_libgit2_shutdown-14" - ], - "init.c": [ - "ex/v0.28.0/init.html#git_libgit2_shutdown-3" - ], - "log.c": [ - "ex/v0.28.0/log.html#git_libgit2_shutdown-32" - ], - "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_libgit2_shutdown-2" - ], - "merge.c": [ - "ex/v0.28.0/merge.html#git_libgit2_shutdown-11" - ], - "remote.c": [ - "ex/v0.28.0/remote.html#git_libgit2_shutdown-3" - ], - "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_libgit2_shutdown-2" - ], - "status.c": [ - "ex/v0.28.0/status.html#git_libgit2_shutdown-2" - ], - "tag.c": [ - "ex/v0.28.0/tag.html#git_libgit2_shutdown-4" - ] - } + "comments": "

Clean up the global state and threading context after calling it as many times as git_libgit2_init() was called - it will return the number of remainining initializations that have not been shutdown (after this one).

\n", + "group": "libgit2" }, "git_graph_ahead_behind": { "type": "function", @@ -8204,7 +8004,7 @@ "comment": null }, "description": "

Count the number of unique commits between two commit objects

\n", - "comments": "

There is no need for branches containing the commits to have any\n upstream relationship, but it helps to think of one as a branch and\n the other as its upstream, the ahead and behind values will be\n what git would report for the branches.

\n", + "comments": "

There is no need for branches containing the commits to have any upstream relationship, but it helps to think of one as a branch and the other as its upstream, the ahead and behind values will be what git would report for the branches.

\n", "group": "graph" }, "git_graph_descendant_of": { @@ -8236,7 +8036,7 @@ "comment": " 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise." }, "description": "

Determine if a commit is the descendant of another commit.

\n", - "comments": "

Note that a commit is not considered a descendant of itself, in contrast\n to git merge-base --is-ancestor.

\n", + "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", "group": "graph" }, "git_ignore_add_rule": { @@ -8263,7 +8063,7 @@ "comment": " 0 on success" }, "description": "

Add ignore rules for a repository.

\n", - "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from\n .gitignore files in the repository tree or from a shared system file\n only if a "core.excludesfile" config value is set. The library also\n keeps a set of per-repository internal ignores that can be configured\n in-memory and will not persist. This function allows you to add to\n that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c\n
\n\n

/

\n\n

with space

\n\n

");

\n\n

This would add three rules to the ignores.

\n", + "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from .gitignore files in the repository tree or from a shared system file only if a "core.excludesfile" config value is set. The library also keeps a set of per-repository internal ignores that can be configured in-memory and will not persist. This function allows you to add to that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c/ with space");\n
\n\n

This would add three rules to the ignores.

\n", "group": "ignore" }, "git_ignore_clear_internal_rules": { @@ -8285,7 +8085,7 @@ "comment": " 0 on success" }, "description": "

Clear ignore rules that were explicitly added.

\n", - "comments": "

Resets to the default internal ignore rules. This will not turn off\n rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", + "comments": "

Resets to the default internal ignore rules. This will not turn off rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", "group": "ignore" }, "git_ignore_path_is_ignored": { @@ -8317,14 +8117,14 @@ "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." }, "description": "

Test if the ignore rules apply to a given path.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the\n given file. This indicates if the file would be ignored regardless of\n whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index"\n on the given file, would it be shown or not?

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index" on the given file, would it be shown or not?

\n", "group": "ignore" }, "git_index_open": { "type": "function", "file": "git2/index.h", - "line": 186, - "lineto": 186, + "line": 187, + "lineto": 187, "args": [ { "name": "out", @@ -8344,14 +8144,14 @@ "comment": " 0 or an error code" }, "description": "

Create a new bare Git index object as a memory representation\n of the Git index file in 'index_path', without a repository\n to back it.

\n", - "comments": "

Since there is no ODB or working directory behind this index,\n any Index methods which rely on these (e.g. index_add_bypath)\n will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository,\n use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n", + "comments": "

Since there is no ODB or working directory behind this index, any Index methods which rely on these (e.g. index_add_bypath) will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository, use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n", "group": "index" }, "git_index_new": { "type": "function", "file": "git2/index.h", - "line": 199, - "lineto": 199, + "line": 200, + "lineto": 200, "args": [ { "name": "out", @@ -8366,14 +8166,14 @@ "comment": " 0 or an error code" }, "description": "

Create an in-memory index object.

\n", - "comments": "

This index object cannot be read/written to the filesystem,\n but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n", + "comments": "

This index object cannot be read/written to the filesystem, but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n", "group": "index" }, "git_index_free": { "type": "function", "file": "git2/index.h", - "line": 206, - "lineto": 206, + "line": 207, + "lineto": 207, "args": [ { "name": "index", @@ -8391,22 +8191,25 @@ "comments": "", "group": "index", "examples": { + "add.c": [ + "ex/HEAD/add.html#git_index_free-1" + ], "general.c": [ - "ex/v0.28.0/general.html#git_index_free-35" + "ex/HEAD/general.html#git_index_free-35" ], "init.c": [ - "ex/v0.28.0/init.html#git_index_free-4" + "ex/HEAD/init.html#git_index_free-2" ], "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_index_free-3" + "ex/HEAD/ls-files.html#git_index_free-1" ] } }, "git_index_owner": { "type": "function", "file": "git2/index.h", - "line": 214, - "lineto": 214, + "line": 215, + "lineto": 215, "args": [ { "name": "index", @@ -8427,8 +8230,8 @@ "git_index_caps": { "type": "function", "file": "git2/index.h", - "line": 222, - "lineto": 222, + "line": 223, + "lineto": 223, "args": [ { "name": "index", @@ -8449,8 +8252,8 @@ "git_index_set_caps": { "type": "function", "file": "git2/index.h", - "line": 235, - "lineto": 235, + "line": 236, + "lineto": 236, "args": [ { "name": "index", @@ -8470,14 +8273,14 @@ "comment": " 0 on success, -1 on failure" }, "description": "

Set index capabilities flags.

\n", - "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then\n capabilities will be read from the config of the owner object,\n looking at core.ignorecase, core.filemode, core.symlinks.

\n", + "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then capabilities will be read from the config of the owner object, looking at core.ignorecase, core.filemode, core.symlinks.

\n", "group": "index" }, "git_index_version": { "type": "function", "file": "git2/index.h", - "line": 247, - "lineto": 247, + "line": 248, + "lineto": 248, "args": [ { "name": "index", @@ -8492,14 +8295,14 @@ "comment": " the index version" }, "description": "

Get index on-disk version.

\n", - "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index\n with version 2 may be written instead, if the extension data in\n version 3 is not necessary.

\n", + "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index with version 2 may be written instead, if the extension data in version 3 is not necessary.

\n", "group": "index" }, "git_index_set_version": { "type": "function", "file": "git2/index.h", - "line": 260, - "lineto": 260, + "line": 261, + "lineto": 261, "args": [ { "name": "index", @@ -8519,14 +8322,14 @@ "comment": " 0 on success, -1 on failure" }, "description": "

Set index on-disk version.

\n", - "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may\n write an index with version 3 instead, if necessary to accurately\n represent the index.

\n", + "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may write an index with version 3 instead, if necessary to accurately represent the index.

\n", "group": "index" }, "git_index_read": { "type": "function", "file": "git2/index.h", - "line": 279, - "lineto": 279, + "line": 280, + "lineto": 280, "args": [ { "name": "index", @@ -8546,14 +8349,14 @@ "comment": " 0 or an error code" }, "description": "

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n", - "comments": "

If force is true, this performs a "hard" read that discards in-memory\n changes and always reloads the on-disk index data. If there is no\n on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index\n data from disk only if it has changed since the last time it was\n loaded. Purely in-memory index data will be untouched. Be aware: if\n there are changes on disk, unwritten in-memory changes are discarded.

\n", + "comments": "

If force is true, this performs a "hard" read that discards in-memory changes and always reloads the on-disk index data. If there is no on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index data from disk only if it has changed since the last time it was loaded. Purely in-memory index data will be untouched. Be aware: if there are changes on disk, unwritten in-memory changes are discarded.

\n", "group": "index" }, "git_index_write": { "type": "function", "file": "git2/index.h", - "line": 288, - "lineto": 288, + "line": 289, + "lineto": 289, "args": [ { "name": "index", @@ -8569,13 +8372,18 @@ }, "description": "

Write an existing index object from memory back to disk\n using an atomic file lock.

\n", "comments": "", - "group": "index" + "group": "index", + "examples": { + "add.c": [ + "ex/HEAD/add.html#git_index_write-2" + ] + } }, "git_index_path": { "type": "function", "file": "git2/index.h", - "line": 296, - "lineto": 296, + "line": 297, + "lineto": 297, "args": [ { "name": "index", @@ -8596,8 +8404,8 @@ "git_index_checksum": { "type": "function", "file": "git2/index.h", - "line": 308, - "lineto": 308, + "line": 309, + "lineto": 309, "args": [ { "name": "index", @@ -8612,14 +8420,14 @@ "comment": " a pointer to the checksum of the index" }, "description": "

Get the checksum of the index

\n", - "comments": "

This checksum is the SHA-1 hash over the index file (except the\n last 20 bytes which are the checksum itself). In cases where the\n index does not exist on-disk, it will be zeroed out.

\n", + "comments": "

This checksum is the SHA-1 hash over the index file (except the last 20 bytes which are the checksum itself). In cases where the index does not exist on-disk, it will be zeroed out.

\n", "group": "index" }, "git_index_read_tree": { "type": "function", "file": "git2/index.h", - "line": 319, - "lineto": 319, + "line": 320, + "lineto": 320, "args": [ { "name": "index", @@ -8645,8 +8453,8 @@ "git_index_write_tree": { "type": "function", "file": "git2/index.h", - "line": 340, - "lineto": 340, + "line": 341, + "lineto": 341, "args": [ { "name": "out", @@ -8666,22 +8474,22 @@ "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" }, "description": "

Write the index as a tree

\n", - "comments": "

This method will scan the index and write a representation\n of its current state back to disk; it recursively creates\n tree objects for each of the subtrees stored in the index,\n but only returns the OID of the root tree. This is the OID\n that can be used e.g. to create a commit.

\n\n

The index instance cannot be bare, and needs to be associated\n to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", + "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", "group": "index", "examples": { "init.c": [ - "ex/v0.28.0/init.html#git_index_write_tree-5" + "ex/HEAD/init.html#git_index_write_tree-3" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_index_write_tree-12" + "ex/HEAD/merge.html#git_index_write_tree-10" ] } }, "git_index_write_tree_to": { "type": "function", "file": "git2/index.h", - "line": 357, - "lineto": 357, + "line": 358, + "lineto": 358, "args": [ { "name": "out", @@ -8706,14 +8514,14 @@ "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" }, "description": "

Write the index as a tree to the given repository

\n", - "comments": "

This method will do the same as git_index_write_tree, but\n letting the user choose the repository where the tree will\n be written.

\n\n

The index must not contain any file in conflict.

\n", + "comments": "

This method will do the same as git_index_write_tree, but letting the user choose the repository where the tree will be written.

\n\n

The index must not contain any file in conflict.

\n", "group": "index" }, "git_index_entrycount": { "type": "function", "file": "git2/index.h", - "line": 376, - "lineto": 376, + "line": 377, + "lineto": 377, "args": [ { "name": "index", @@ -8732,18 +8540,18 @@ "group": "index", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_index_entrycount-36" + "ex/HEAD/general.html#git_index_entrycount-36" ], "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_index_entrycount-4" + "ex/HEAD/ls-files.html#git_index_entrycount-2" ] } }, "git_index_clear": { "type": "function", "file": "git2/index.h", - "line": 387, - "lineto": 387, + "line": 388, + "lineto": 388, "args": [ { "name": "index", @@ -8758,14 +8566,14 @@ "comment": " 0 on success, error code \n<\n 0 on failure" }, "description": "

Clear the contents (all the entries) of an index object.

\n", - "comments": "

This clears the index object in memory; changes must be explicitly\n written to disk for them to take effect persistently.

\n", + "comments": "

This clears the index object in memory; changes must be explicitly written to disk for them to take effect persistently.

\n", "group": "index" }, "git_index_get_byindex": { "type": "function", "file": "git2/index.h", - "line": 400, - "lineto": 401, + "line": 401, + "lineto": 402, "args": [ { "name": "index", @@ -8785,22 +8593,22 @@ "comment": " a pointer to the entry; NULL if out of bounds" }, "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", "group": "index", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_index_get_byindex-37" + "ex/HEAD/general.html#git_index_get_byindex-37" ], "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_index_get_byindex-5" + "ex/HEAD/ls-files.html#git_index_get_byindex-3" ] } }, "git_index_get_bypath": { "type": "function", "file": "git2/index.h", - "line": 415, - "lineto": 416, + "line": 416, + "lineto": 417, "args": [ { "name": "index", @@ -8825,19 +8633,19 @@ "comment": " a pointer to the entry; NULL if it was not found" }, "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", "group": "index", "examples": { "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_index_get_bypath-6" + "ex/HEAD/ls-files.html#git_index_get_bypath-4" ] } }, "git_index_remove": { "type": "function", "file": "git2/index.h", - "line": 426, - "lineto": 426, + "line": 427, + "lineto": 427, "args": [ { "name": "index", @@ -8868,8 +8676,8 @@ "git_index_remove_directory": { "type": "function", "file": "git2/index.h", - "line": 436, - "lineto": 437, + "line": 437, + "lineto": 438, "args": [ { "name": "index", @@ -8900,8 +8708,8 @@ "git_index_add": { "type": "function", "file": "git2/index.h", - "line": 453, - "lineto": 453, + "line": 454, + "lineto": 454, "args": [ { "name": "index", @@ -8921,14 +8729,14 @@ "comment": " 0 or an error code" }, "description": "

Add or update an index entry from an in-memory struct

\n", - "comments": "

If a previous index entry exists that has the same path and stage\n as the given 'source_entry', it will be replaced. Otherwise, the\n 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given\n 'source_entry' will be inserted on the index.

\n", + "comments": "

If a previous index entry exists that has the same path and stage as the given 'source_entry', it will be replaced. Otherwise, the 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given 'source_entry' will be inserted on the index.

\n", "group": "index" }, "git_index_entry_stage": { "type": "function", "file": "git2/index.h", - "line": 465, - "lineto": 465, + "line": 466, + "lineto": 466, "args": [ { "name": "entry", @@ -8943,14 +8751,14 @@ "comment": " the stage number" }, "description": "

Return the stage number from a git index entry

\n", - "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags \n
\n\n

&\n GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT

\n", + "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags & GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT\n
\n", "group": "index" }, "git_index_entry_is_conflict": { "type": "function", "file": "git2/index.h", - "line": 474, - "lineto": 474, + "line": 475, + "lineto": 475, "args": [ { "name": "entry", @@ -8971,8 +8779,8 @@ "git_index_iterator_new": { "type": "function", "file": "git2/index.h", - "line": 494, - "lineto": 496, + "line": 495, + "lineto": 497, "args": [ { "name": "iterator_out", @@ -8998,8 +8806,8 @@ "git_index_iterator_next": { "type": "function", "file": "git2/index.h", - "line": 505, - "lineto": 507, + "line": 506, + "lineto": 508, "args": [ { "name": "out", @@ -9025,8 +8833,8 @@ "git_index_iterator_free": { "type": "function", "file": "git2/index.h", - "line": 514, - "lineto": 514, + "line": 515, + "lineto": 515, "args": [ { "name": "iterator", @@ -9047,8 +8855,8 @@ "git_index_add_bypath": { "type": "function", "file": "git2/index.h", - "line": 545, - "lineto": 545, + "line": 546, + "lineto": 546, "args": [ { "name": "index", @@ -9068,14 +8876,14 @@ "comment": " 0 or an error code" }, "description": "

Add or update an index entry from a file on disk

\n", - "comments": "

The file path must be relative to the repository's\n working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking\n at gitignore rules. Those rules can be evaluated through\n the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "comments": "

The file path must be relative to the repository's working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", "group": "index" }, - "git_index_add_frombuffer": { + "git_index_add_from_buffer": { "type": "function", "file": "git2/index.h", - "line": 574, - "lineto": 577, + "line": 575, + "lineto": 578, "args": [ { "name": "index", @@ -9105,14 +8913,14 @@ "comment": " 0 or an error code" }, "description": "

Add or update an index entry from a buffer in memory

\n", - "comments": "

This method will create a blob in the repository that owns the\n index and then add the index entry to the index. The path of the\n entry represents the position of the blob relative to the\n repository's root folder.

\n\n

If a previous index entry exists that has the same path as the\n given 'entry', it will be replaced. Otherwise, the 'entry' will be\n added. The id and the file_size of the 'entry' are updated with the\n real value of the blob.

\n\n

This forces the file to be added to the index, not looking\n at gitignore rules. Those rules can be evaluated through\n the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added. The id and the file_size of the 'entry' are updated with the real value of the blob.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", "group": "index" }, "git_index_remove_bypath": { "type": "function", "file": "git2/index.h", - "line": 593, - "lineto": 593, + "line": 594, + "lineto": 594, "args": [ { "name": "index", @@ -9132,14 +8940,14 @@ "comment": " 0 or an error code" }, "description": "

Remove an index entry corresponding to a file on disk

\n", - "comments": "

The file path must be relative to the repository's\n working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this\n file will no longer be marked as conflicting. The data about\n the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "comments": "

The file path must be relative to the repository's working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", "group": "index" }, "git_index_add_all": { "type": "function", "file": "git2/index.h", - "line": 641, - "lineto": 646, + "line": 642, + "lineto": 647, "args": [ { "name": "index", @@ -9174,14 +8982,19 @@ "comment": " 0 on success, negative callback return value, or error code" }, "description": "

Add or update index entries matching files in the working directory.

\n", - "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will\n be matched against files in the repository's working directory. Each\n file that matches will be added to the index (either updating an\n existing entry or adding a new entry). You can disable glob expansion\n and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\n flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath).\n If a file is already tracked in the index, then it will be updated\n even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip\n the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains\n the exact path of an ignored file (when not using FORCE), add the\n GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry\n in the pathspec that is an exact match to a filename on disk is\n either not ignored or already in the index. If this check fails, the\n function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback\n function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files\n will no longer be marked as conflicting. The data about the conflicts\n will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching\n item in the working directory immediately before it is added to /\n updated in the index. Returning zero will add the item to the index,\n greater than zero will skip the item, and less than zero will abort the\n scan and return that value to the caller.

\n", - "group": "index" + "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", + "group": "index", + "examples": { + "add.c": [ + "ex/HEAD/add.html#git_index_add_all-3" + ] + } }, "git_index_remove_all": { "type": "function", "file": "git2/index.h", - "line": 663, - "lineto": 667, + "line": 664, + "lineto": 668, "args": [ { "name": "index", @@ -9211,14 +9024,14 @@ "comment": " 0 on success, negative callback return value, or error code" }, "description": "

Remove all matching index entries.

\n", - "comments": "

If you provide a callback function, it will be invoked on each matching\n item in the index immediately before it is removed. Return 0 to\n remove the item, > 0 to skip the item, and \n<\n 0 to abort the scan.

\n", + "comments": "

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is removed. Return 0 to remove the item, > 0 to skip the item, and < 0 to abort the scan.

\n", "group": "index" }, "git_index_update_all": { "type": "function", "file": "git2/index.h", - "line": 692, - "lineto": 696, + "line": 693, + "lineto": 697, "args": [ { "name": "index", @@ -9248,14 +9061,19 @@ "comment": " 0 on success, negative callback return value, or error code" }, "description": "

Update all index entries to match the working directory

\n", - "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the\n working directory, deleting them if the corresponding working directory\n file no longer exists otherwise updating the information (including\n adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching\n item in the index immediately before it is updated (either refreshed\n or removed depending on working directory state). Return 0 to proceed\n with updating the item, > 0 to skip the item, and \n<\n 0 to abort the scan.

\n", - "group": "index" + "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "group": "index", + "examples": { + "add.c": [ + "ex/HEAD/add.html#git_index_update_all-4" + ] + } }, "git_index_find": { "type": "function", "file": "git2/index.h", - "line": 707, - "lineto": 707, + "line": 708, + "lineto": 708, "args": [ { "name": "at_pos", @@ -9286,8 +9104,8 @@ "git_index_find_prefix": { "type": "function", "file": "git2/index.h", - "line": 718, - "lineto": 718, + "line": 719, + "lineto": 719, "args": [ { "name": "at_pos", @@ -9318,8 +9136,8 @@ "git_index_conflict_add": { "type": "function", "file": "git2/index.h", - "line": 743, - "lineto": 747, + "line": 744, + "lineto": 748, "args": [ { "name": "index", @@ -9349,14 +9167,14 @@ "comment": " 0 or an error code" }, "description": "

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n", - "comments": "

The entries are the entries from the tree included in the merge. Any\n entry may be null to indicate that that file was not present in the\n trees during the merge. For example, ancestor_entry may be NULL to\n indicate that a file was added in both branches and must be resolved.

\n", + "comments": "

The entries are the entries from the tree included in the merge. Any entry may be null to indicate that that file was not present in the trees during the merge. For example, ancestor_entry may be NULL to indicate that a file was added in both branches and must be resolved.

\n", "group": "index" }, "git_index_conflict_get": { "type": "function", "file": "git2/index.h", - "line": 763, - "lineto": 768, + "line": 764, + "lineto": 769, "args": [ { "name": "ancestor_out", @@ -9391,14 +9209,14 @@ "comment": " 0 or an error code" }, "description": "

Get the index entries that represent a conflict of a single file.

\n", - "comments": "

The entries are not modifiable and should not be freed. Because the\n git_index_entry struct is a publicly defined struct, you should\n be able to make your own permanent copy of the data if necessary.

\n", + "comments": "

The entries are not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", "group": "index" }, "git_index_conflict_remove": { "type": "function", "file": "git2/index.h", - "line": 777, - "lineto": 777, + "line": 778, + "lineto": 778, "args": [ { "name": "index", @@ -9424,8 +9242,8 @@ "git_index_conflict_cleanup": { "type": "function", "file": "git2/index.h", - "line": 785, - "lineto": 785, + "line": 786, + "lineto": 786, "args": [ { "name": "index", @@ -9446,8 +9264,8 @@ "git_index_has_conflicts": { "type": "function", "file": "git2/index.h", - "line": 792, - "lineto": 792, + "line": 793, + "lineto": 793, "args": [ { "name": "index", @@ -9466,15 +9284,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_index_has_conflicts-13" + "ex/HEAD/merge.html#git_index_has_conflicts-11" ] } }, "git_index_conflict_iterator_new": { "type": "function", "file": "git2/index.h", - "line": 803, - "lineto": 805, + "line": 804, + "lineto": 806, "args": [ { "name": "iterator_out", @@ -9498,15 +9316,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_index_conflict_iterator_new-14" + "ex/HEAD/merge.html#git_index_conflict_iterator_new-12" ] } }, "git_index_conflict_next": { "type": "function", "file": "git2/index.h", - "line": 817, - "lineto": 821, + "line": 818, + "lineto": 822, "args": [ { "name": "ancestor_out", @@ -9540,15 +9358,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_index_conflict_next-15" + "ex/HEAD/merge.html#git_index_conflict_next-13" ] } }, "git_index_conflict_iterator_free": { "type": "function", "file": "git2/index.h", - "line": 828, - "lineto": 829, + "line": 829, + "lineto": 830, "args": [ { "name": "iterator", @@ -9567,15 +9385,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_index_conflict_iterator_free-16" + "ex/HEAD/merge.html#git_index_conflict_iterator_free-14" ] } }, - "git_indexer_init_options": { + "git_indexer_options_init": { "type": "function", "file": "git2/indexer.h", - "line": 41, - "lineto": 43, + "line": 85, + "lineto": 87, "args": [ { "name": "opts", @@ -9601,8 +9419,8 @@ "git_indexer_new": { "type": "function", "file": "git2/indexer.h", - "line": 57, - "lineto": 62, + "line": 101, + "lineto": 106, "args": [ { "name": "out", @@ -9643,8 +9461,8 @@ "git_indexer_append": { "type": "function", "file": "git2/indexer.h", - "line": 72, - "lineto": 72, + "line": 116, + "lineto": 116, "args": [ { "name": "idx", @@ -9663,12 +9481,12 @@ }, { "name": "stats", - "type": "git_transfer_progress *", + "type": "git_indexer_progress *", "comment": "stat storage" } ], - "argline": "git_indexer *idx, const void *data, size_t size, git_transfer_progress *stats", - "sig": "git_indexer *::const void *::size_t::git_transfer_progress *", + "argline": "git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats", + "sig": "git_indexer *::const void *::size_t::git_indexer_progress *", "return": { "type": "int", "comment": null @@ -9680,8 +9498,8 @@ "git_indexer_commit": { "type": "function", "file": "git2/indexer.h", - "line": 81, - "lineto": 81, + "line": 125, + "lineto": 125, "args": [ { "name": "idx", @@ -9690,12 +9508,12 @@ }, { "name": "stats", - "type": "git_transfer_progress *", + "type": "git_indexer_progress *", "comment": null } ], - "argline": "git_indexer *idx, git_transfer_progress *stats", - "sig": "git_indexer *::git_transfer_progress *", + "argline": "git_indexer *idx, git_indexer_progress *stats", + "sig": "git_indexer *::git_indexer_progress *", "return": { "type": "int", "comment": null @@ -9707,8 +9525,8 @@ "git_indexer_hash": { "type": "function", "file": "git2/indexer.h", - "line": 91, - "lineto": 91, + "line": 135, + "lineto": 135, "args": [ { "name": "idx", @@ -9723,14 +9541,14 @@ "comment": null }, "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object\n names. This is only correct after the index has been finalized.

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the index has been finalized.

\n", "group": "indexer" }, "git_indexer_free": { "type": "function", "file": "git2/indexer.h", - "line": 98, - "lineto": 98, + "line": 142, + "lineto": 142, "args": [ { "name": "idx", @@ -9748,33 +9566,6 @@ "comments": "", "group": "indexer" }, - "imaxdiv": { - "type": "function", - "file": "git2/inttypes.h", - "line": 284, - "lineto": 298, - "args": [ - { - "name": "numer", - "type": "intmax_t", - "comment": null - }, - { - "name": "denom", - "type": "intmax_t", - "comment": null - } - ], - "argline": "intmax_t numer, intmax_t denom", - "sig": "intmax_t::intmax_t", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "", - "group": "imaxdiv" - }, "git_mailmap_new": { "type": "function", "file": "git2/mailmap.h", @@ -9794,7 +9585,7 @@ "comment": " 0 on success, or an error code" }, "description": "

Allocate a new mailmap object.

\n", - "comments": "

This object is empty, so you'll have to add a mailmap file before you can do\n anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", + "comments": "

This object is empty, so you'll have to add a mailmap file before you can do anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", "group": "mailmap" }, "git_mailmap_free": { @@ -9917,7 +9708,7 @@ "comment": " 0 on success, or an error code" }, "description": "

Create a new mailmap instance from a repository, loading mailmap files based\n on the repository's configuration.

\n", - "comments": "

Mailmaps are loaded in the following order:\n 1. '.mailmap' in the root of the repository's working directory, if present.\n 2. The blob object identified by the 'mailmap.blob' config entry, if set.\n [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories]\n 3. The path in the 'mailmap.file' config entry, if set.

\n", + "comments": "

Mailmaps are loaded in the following order: 1. '.mailmap' in the root of the repository's working directory, if present. 2. The blob object identified by the 'mailmap.blob' config entry, if set. [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories] 3. The path in the 'mailmap.file' config entry, if set.

\n", "group": "mailmap" }, "git_mailmap_resolve": { @@ -9994,7 +9785,7 @@ "comments": "

Call git_signature_free() to free the data.

\n", "group": "mailmap" }, - "git_merge_file_init_input": { + "git_merge_file_input_init": { "type": "function", "file": "git2/merge.h", "line": 60, @@ -10021,11 +9812,11 @@ "comments": "", "group": "merge" }, - "git_merge_file_init_options": { + "git_merge_file_options_init": { "type": "function", "file": "git2/merge.h", "line": 215, - "lineto": 217, + "lineto": 215, "args": [ { "name": "opts", @@ -10045,14 +9836,14 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_merge_file_options structure

\n", - "comments": "

Initializes a git_merge_file_options with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_merge_file_options with default values. Equivalent to creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", "group": "merge" }, - "git_merge_init_options": { + "git_merge_options_init": { "type": "function", "file": "git2/merge.h", - "line": 313, - "lineto": 315, + "line": 311, + "lineto": 311, "args": [ { "name": "opts", @@ -10072,14 +9863,14 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_merge_options structure

\n", - "comments": "

Initializes a git_merge_options with default values. Equivalent to\n creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_merge_options with default values. Equivalent to creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", "group": "merge" }, "git_merge_analysis": { "type": "function", "file": "git2/merge.h", - "line": 384, - "lineto": 389, + "line": 380, + "lineto": 385, "args": [ { "name": "analysis_out", @@ -10118,15 +9909,15 @@ "group": "merge", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_merge_analysis-17" + "ex/HEAD/merge.html#git_merge_analysis-15" ] } }, "git_merge_analysis_for_ref": { "type": "function", "file": "git2/merge.h", - "line": 402, - "lineto": 408, + "line": 398, + "lineto": 404, "args": [ { "name": "analysis_out", @@ -10172,8 +9963,8 @@ "git_merge_base": { "type": "function", "file": "git2/merge.h", - "line": 419, - "lineto": 423, + "line": 415, + "lineto": 419, "args": [ { "name": "out", @@ -10207,18 +9998,18 @@ "group": "merge", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_merge_base-33" + "ex/HEAD/log.html#git_merge_base-31" ], "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_merge_base-3" + "ex/HEAD/rev-parse.html#git_merge_base-1" ] } }, "git_merge_bases": { "type": "function", "file": "git2/merge.h", - "line": 434, - "lineto": 438, + "line": 430, + "lineto": 434, "args": [ { "name": "out", @@ -10254,8 +10045,8 @@ "git_merge_base_many": { "type": "function", "file": "git2/merge.h", - "line": 449, - "lineto": 453, + "line": 445, + "lineto": 449, "args": [ { "name": "out", @@ -10291,8 +10082,8 @@ "git_merge_bases_many": { "type": "function", "file": "git2/merge.h", - "line": 464, - "lineto": 468, + "line": 460, + "lineto": 464, "args": [ { "name": "out", @@ -10328,8 +10119,8 @@ "git_merge_base_octopus": { "type": "function", "file": "git2/merge.h", - "line": 479, - "lineto": 483, + "line": 475, + "lineto": 479, "args": [ { "name": "out", @@ -10365,8 +10156,8 @@ "git_merge_file": { "type": "function", "file": "git2/merge.h", - "line": 501, - "lineto": 506, + "line": 497, + "lineto": 502, "args": [ { "name": "out", @@ -10401,14 +10192,14 @@ "comment": " 0 on success or error code" }, "description": "

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n", - "comments": "

Note that this function does not reference a repository and any\n configuration must be passed as git_merge_file_options.

\n", + "comments": "

Note that this function does not reference a repository and any configuration must be passed as git_merge_file_options.

\n", "group": "merge" }, "git_merge_file_from_index": { "type": "function", "file": "git2/merge.h", - "line": 522, - "lineto": 528, + "line": 518, + "lineto": 524, "args": [ { "name": "out", @@ -10454,8 +10245,8 @@ "git_merge_file_result_free": { "type": "function", "file": "git2/merge.h", - "line": 535, - "lineto": 535, + "line": 531, + "lineto": 531, "args": [ { "name": "result", @@ -10476,8 +10267,8 @@ "git_merge_trees": { "type": "function", "file": "git2/merge.h", - "line": 553, - "lineto": 559, + "line": 549, + "lineto": 555, "args": [ { "name": "out", @@ -10523,8 +10314,8 @@ "git_merge_commits": { "type": "function", "file": "git2/merge.h", - "line": 576, - "lineto": 581, + "line": 572, + "lineto": 577, "args": [ { "name": "out", @@ -10565,8 +10356,8 @@ "git_merge": { "type": "function", "file": "git2/merge.h", - "line": 601, - "lineto": 606, + "line": 597, + "lineto": 602, "args": [ { "name": "repo", @@ -10601,11 +10392,11 @@ "comment": " 0 on success or error code" }, "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", - "comments": "

For compatibility with git, the repository is put into a merging\n state. Once the commit is done (or if the uses wishes to abort),\n you should clear this state by calling\n git_repository_state_cleanup().

\n", + "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the uses wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", "group": "merge", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_merge-18" + "ex/HEAD/merge.html#git_merge-16" ] } }, @@ -10670,7 +10461,7 @@ "comment": " 0 on success, or non-zero on error." }, "description": "

Parse trailers out of a message, filling the array pointed to by +arr+.

\n", - "comments": "

Trailers are key/value pairs in the last paragraph of a message, not\n including any patches or conflicts that may be present.

\n", + "comments": "

Trailers are key/value pairs in the last paragraph of a message, not including any patches or conflicts that may be present.

\n", "group": "message" }, "git_message_trailer_array_free": { @@ -11086,7 +10877,7 @@ "comment": " 0 or an error code" }, "description": "

Add a note for an object from a commit

\n", - "comments": "

This function will create a notes commit for a given object,\n the commit is a dangling commit, no reference is created.

\n", + "comments": "

This function will create a notes commit for a given object, the commit is a dangling commit, no reference is created.

\n", "group": "note" }, "git_note_remove": { @@ -11298,14 +11089,14 @@ "comment": " 0 or an error code" }, "description": "

Lookup a reference to one of the objects in a repository.

\n", - "comments": "

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJECT_ANY' may be passed to let\n the method guess the object's type.

\n", + "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", "group": "object", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_object_lookup-34" + "ex/HEAD/log.html#git_object_lookup-32" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_object_lookup-19" + "ex/HEAD/merge.html#git_object_lookup-17" ] } }, @@ -11348,7 +11139,7 @@ "comment": " 0 or an error code" }, "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "

The object obtained will be so that its identifier\n matches the first 'len' hexadecimal characters\n (packets of 4 bits) of the given 'id'.\n 'len' must be at least GIT_OID_MINPREFIXLEN, and\n long enough to identify a unique object matching\n the prefix; otherwise the method will fail.

\n\n

The generated reference is owned by the repository and\n should be closed with the git_object_free method\n instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object\n in the odb; the method will fail otherwise.\n The special value 'GIT_OBJECT_ANY' may be passed to let\n the method guess the object's type.

\n", + "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", "group": "object" }, "git_object_lookup_bypath": { @@ -11411,27 +11202,27 @@ "group": "object", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_object_id-10", - "ex/v0.28.0/blame.html#git_object_id-11", - "ex/v0.28.0/blame.html#git_object_id-12", - "ex/v0.28.0/blame.html#git_object_id-13" + "ex/HEAD/blame.html#git_object_id-8", + "ex/HEAD/blame.html#git_object_id-9", + "ex/HEAD/blame.html#git_object_id-10", + "ex/HEAD/blame.html#git_object_id-11" ], "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_object_id-12", - "ex/v0.28.0/cat-file.html#git_object_id-13" + "ex/HEAD/cat-file.html#git_object_id-10", + "ex/HEAD/cat-file.html#git_object_id-11" ], "log.c": [ - "ex/v0.28.0/log.html#git_object_id-35", - "ex/v0.28.0/log.html#git_object_id-36", - "ex/v0.28.0/log.html#git_object_id-37", - "ex/v0.28.0/log.html#git_object_id-38" + "ex/HEAD/log.html#git_object_id-33", + "ex/HEAD/log.html#git_object_id-34", + "ex/HEAD/log.html#git_object_id-35", + "ex/HEAD/log.html#git_object_id-36" ], "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_object_id-4", - "ex/v0.28.0/rev-parse.html#git_object_id-5", - "ex/v0.28.0/rev-parse.html#git_object_id-6", - "ex/v0.28.0/rev-parse.html#git_object_id-7", - "ex/v0.28.0/rev-parse.html#git_object_id-8" + "ex/HEAD/rev-parse.html#git_object_id-2", + "ex/HEAD/rev-parse.html#git_object_id-3", + "ex/HEAD/rev-parse.html#git_object_id-4", + "ex/HEAD/rev-parse.html#git_object_id-5", + "ex/HEAD/rev-parse.html#git_object_id-6" ] } }, @@ -11459,11 +11250,11 @@ "comment": " 0 on success, \n<\n0 for error" }, "description": "

Get a short abbreviated OID string for the object

\n", - "comments": "

This starts at the "core.abbrev" length (default 7 characters) and\n iteratively extends to a longer string if that length is ambiguous.\n The result will be unambiguous (at least until new objects are added to\n the repository).

\n", + "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", "group": "object", "examples": { "tag.c": [ - "ex/v0.28.0/tag.html#git_object_short_id-5" + "ex/HEAD/tag.html#git_object_short_id-3" ] } }, @@ -11490,12 +11281,12 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_object_type-14", - "ex/v0.28.0/cat-file.html#git_object_type-15", - "ex/v0.28.0/cat-file.html#git_object_type-16" + "ex/HEAD/cat-file.html#git_object_type-12", + "ex/HEAD/cat-file.html#git_object_type-13", + "ex/HEAD/cat-file.html#git_object_type-14" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_object_type-6" + "ex/HEAD/tag.html#git_object_type-4" ] } }, @@ -11518,7 +11309,7 @@ "comment": " the repository who owns this object" }, "description": "

Get the repository that owns this object

\n", - "comments": "

Freeing or calling git_repository_close on the\n returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without\n affecting the object.

\n", + "comments": "

Freeing or calling git_repository_close on the returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without affecting the object.

\n", "group": "object" }, "git_object_free": { @@ -11540,37 +11331,37 @@ "comment": null }, "description": "

Close an open object

\n", - "comments": "

This method instructs the library to close an existing\n object; note that git_objects are owned and cached by the repository\n so the object may or may not be freed after this library call,\n depending on how aggressive is the caching mechanism used\n by the repository.

\n\n

IMPORTANT:\n It is necessary to call this method when you stop using\n an object. Failure to do so will cause a memory leak.

\n", + "comments": "

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 aggressive is the caching mechanism used by the repository.

\n\n

IMPORTANT: It is necessary to call this method when you stop using an object. Failure to do so will cause a memory leak.

\n", "group": "object", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_object_free-14", - "ex/v0.28.0/blame.html#git_object_free-15", - "ex/v0.28.0/blame.html#git_object_free-16", - "ex/v0.28.0/blame.html#git_object_free-17" + "ex/HEAD/blame.html#git_object_free-12", + "ex/HEAD/blame.html#git_object_free-13", + "ex/HEAD/blame.html#git_object_free-14", + "ex/HEAD/blame.html#git_object_free-15" ], "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_object_free-17" + "ex/HEAD/cat-file.html#git_object_free-15" ], "general.c": [ - "ex/v0.28.0/general.html#git_object_free-38" + "ex/HEAD/general.html#git_object_free-38" ], "log.c": [ - "ex/v0.28.0/log.html#git_object_free-39" + "ex/HEAD/log.html#git_object_free-37" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_object_free-20" + "ex/HEAD/merge.html#git_object_free-18" ], "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_object_free-9", - "ex/v0.28.0/rev-parse.html#git_object_free-10", - "ex/v0.28.0/rev-parse.html#git_object_free-11" + "ex/HEAD/rev-parse.html#git_object_free-7", + "ex/HEAD/rev-parse.html#git_object_free-8", + "ex/HEAD/rev-parse.html#git_object_free-9" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_object_free-7", - "ex/v0.28.0/tag.html#git_object_free-8", - "ex/v0.28.0/tag.html#git_object_free-9", - "ex/v0.28.0/tag.html#git_object_free-10" + "ex/HEAD/tag.html#git_object_free-5", + "ex/HEAD/tag.html#git_object_free-6", + "ex/HEAD/tag.html#git_object_free-7", + "ex/HEAD/tag.html#git_object_free-8" ] } }, @@ -11593,18 +11384,18 @@ "comment": " the corresponding string representation." }, "description": "

Convert an object type to its string representation.

\n", - "comments": "

The result is a pointer to a string in static memory and\n should not be free()'ed.

\n", + "comments": "

The result is a pointer to a string in static memory and should not be free()'ed.

\n", "group": "object", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_object_type2string-18", - "ex/v0.28.0/cat-file.html#git_object_type2string-19", - "ex/v0.28.0/cat-file.html#git_object_type2string-20", - "ex/v0.28.0/cat-file.html#git_object_type2string-21" + "ex/HEAD/cat-file.html#git_object_type2string-16", + "ex/HEAD/cat-file.html#git_object_type2string-17", + "ex/HEAD/cat-file.html#git_object_type2string-18", + "ex/HEAD/cat-file.html#git_object_type2string-19" ], "general.c": [ - "ex/v0.28.0/general.html#git_object_type2string-39", - "ex/v0.28.0/general.html#git_object_type2string-40" + "ex/HEAD/general.html#git_object_type2string-39", + "ex/HEAD/general.html#git_object_type2string-40" ] } }, @@ -11652,7 +11443,7 @@ "comments": "", "group": "object" }, - "git_object__size": { + "git_object_size": { "type": "function", "file": "git2/object.h", "line": 200, @@ -11671,7 +11462,7 @@ "comment": " size in bytes of the object" }, "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", - "comments": "

For all the core types, this would the equivalent\n of calling sizeof(git_commit) if the core types\n were not opaque on the external API.

\n", + "comments": "

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.

\n", "group": "object" }, "git_object_peel": { @@ -11703,7 +11494,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" }, "description": "

Recursively peel an object until an object of the specified type is met.

\n", - "comments": "

If the query cannot be satisfied due to the object model,\n GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a\n tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will\n be peeled until the type changes. A tag will be peeled until the\n referenced object is no longer a tag, and a commit will be peeled\n to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to\n the target type due to the object model, GIT_EPEEL will be\n returned.

\n\n

You must free the returned object.

\n", + "comments": "

If the query cannot be satisfied due to the object model, GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until the type changes. A tag will be peeled until the referenced object is no longer a tag, and a commit will be peeled to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to the target type due to the object model, GIT_EPEEL will be returned.

\n\n

You must free the returned object.

\n", "group": "object" }, "git_object_dup": { @@ -11736,8 +11527,8 @@ "git_odb_new": { "type": "function", "file": "git2/odb.h", - "line": 39, - "lineto": 39, + "line": 40, + "lineto": 40, "args": [ { "name": "out", @@ -11752,14 +11543,14 @@ "comment": " 0 or an error code" }, "description": "

Create a new object database with no backends.

\n", - "comments": "

Before the ODB can be used for read/writing, a custom database\n backend must be manually added using git_odb_add_backend()

\n", + "comments": "

Before the ODB can be used for read/writing, a custom database backend must be manually added using git_odb_add_backend()

\n", "group": "odb" }, "git_odb_open": { "type": "function", "file": "git2/odb.h", - "line": 57, - "lineto": 57, + "line": 58, + "lineto": 58, "args": [ { "name": "out", @@ -11779,14 +11570,14 @@ "comment": " 0 or an error code" }, "description": "

Create a new object database and automatically add\n the two default backends:

\n", - "comments": "
- git_odb_backend_loose: read and write loose object files\n    from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,\n    assuming `objects_dir` as the Objects folder which\n    contains a 'pack/' folder with the corresponding data\n
\n", + "comments": "
- git_odb_backend_loose: read and write loose object files      from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,        assuming `objects_dir` as the Objects folder which      contains a 'pack/' folder with the corresponding data\n
\n", "group": "odb" }, "git_odb_add_disk_alternate": { "type": "function", "file": "git2/odb.h", - "line": 74, - "lineto": 74, + "line": 75, + "lineto": 75, "args": [ { "name": "odb", @@ -11806,14 +11597,14 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Add an on-disk alternate to an existing Object DB.

\n", - "comments": "

Note that the added path must point to an objects, not\n to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after\n all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", + "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", "group": "odb" }, "git_odb_free": { "type": "function", "file": "git2/odb.h", - "line": 81, - "lineto": 81, + "line": 82, + "lineto": 82, "args": [ { "name": "db", @@ -11832,18 +11623,18 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_odb_free-22" + "ex/HEAD/cat-file.html#git_odb_free-20" ], "general.c": [ - "ex/v0.28.0/general.html#git_odb_free-41" + "ex/HEAD/general.html#git_odb_free-41" ] } }, "git_odb_read": { "type": "function", "file": "git2/odb.h", - "line": 100, - "lineto": 100, + "line": 101, + "lineto": 101, "args": [ { "name": "out", @@ -11868,22 +11659,22 @@ "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database." }, "description": "

Read an object from the database.

\n", - "comments": "

This method queries all available ODB backends\n trying to read the given OID.

\n\n

The returned object is reference counted and\n internally cached, so it should be closed\n by the user once it's no longer in use.

\n", + "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_odb_read-23" + "ex/HEAD/cat-file.html#git_odb_read-21" ], "general.c": [ - "ex/v0.28.0/general.html#git_odb_read-42" + "ex/HEAD/general.html#git_odb_read-42" ] } }, "git_odb_read_prefix": { "type": "function", "file": "git2/odb.h", - "line": 129, - "lineto": 129, + "line": 130, + "lineto": 130, "args": [ { "name": "out", @@ -11913,14 +11704,14 @@ "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database.\n - GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix)" }, "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", - "comments": "

This method queries all available ODB backends\n trying to match the 'len' first hexadecimal\n characters of the 'short_id'.\n The remaining (GIT_OID_HEXSZ-len)*4 bits of\n 'short_id' must be 0s.\n 'len' must be at least GIT_OID_MINPREFIXLEN,\n and the prefix must be long enough to identify\n a unique object in all the backends; the\n method will fail otherwise.

\n\n

The returned object is reference counted and\n internally cached, so it should be closed\n by the user once it's no longer in use.

\n", + "comments": "

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.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", "group": "odb" }, "git_odb_read_header": { "type": "function", "file": "git2/odb.h", - "line": 149, - "lineto": 149, + "line": 150, + "lineto": 150, "args": [ { "name": "len_out", @@ -11950,14 +11741,14 @@ "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database." }, "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", - "comments": "

The header includes the length and the type of an object.

\n\n

Note that most backends do not support reading only the header\n of an object, so the whole object will be read and then the\n header will be returned.

\n", + "comments": "

The header includes the length and the type of an object.

\n\n

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.

\n", "group": "odb" }, "git_odb_exists": { "type": "function", "file": "git2/odb.h", - "line": 160, - "lineto": 160, + "line": 161, + "lineto": 161, "args": [ { "name": "db", @@ -11983,8 +11774,8 @@ "git_odb_exists_prefix": { "type": "function", "file": "git2/odb.h", - "line": 173, - "lineto": 174, + "line": 174, + "lineto": 175, "args": [ { "name": "out", @@ -12020,8 +11811,8 @@ "git_odb_expand_ids": { "type": "function", "file": "git2/odb.h", - "line": 215, - "lineto": 218, + "line": 216, + "lineto": 219, "args": [ { "name": "db", @@ -12046,14 +11837,14 @@ "comment": " 0 on success or an error code on failure" }, "description": "

Determine if one or more objects can be found in the object database\n by their abbreviated object ID and type. The given array will be\n updated in place: for each abbreviated ID that is unique in the\n database, and of the given type (if specified), the full object ID,\n object ID length (GIT_OID_HEXSZ) and type will be written back to\n the array. For IDs that are not found (or are ambiguous), the\n array entry will be zeroed.

\n", - "comments": "

Note that since this function operates on multiple objects, the\n underlying database will not be asked to be reloaded if an object is\n not found (which is unlike other object database operations.)

\n", + "comments": "

Note that since this function operates on multiple objects, the underlying database will not be asked to be reloaded if an object is not found (which is unlike other object database operations.)

\n", "group": "odb" }, "git_odb_refresh": { "type": "function", "file": "git2/odb.h", - "line": 238, - "lineto": 238, + "line": 239, + "lineto": 239, "args": [ { "name": "db", @@ -12068,14 +11859,14 @@ "comment": " 0 on success, error code otherwise" }, "description": "

Refresh the object database to load newly added files.

\n", - "comments": "

If the object databases have changed on disk while the library\n is running, this function will force a reload of the underlying\n indexes.

\n\n

Use this function when you're confident that an external\n application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The\n library will automatically attempt to refresh the ODB\n when a lookup fails, to see if the looked up object exists\n on disk but hasn't been loaded yet.

\n", + "comments": "

If the object databases have changed on disk while the library is running, this function will force a reload of the underlying indexes.

\n\n

Use this function when you're confident that an external application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The library will automatically attempt to refresh the ODB when a lookup fails, to see if the looked up object exists on disk but hasn't been loaded yet.

\n", "group": "odb" }, "git_odb_foreach": { "type": "function", "file": "git2/odb.h", - "line": 253, - "lineto": 253, + "line": 254, + "lineto": 254, "args": [ { "name": "db", @@ -12100,14 +11891,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

List all objects available in the database

\n", - "comments": "

The callback will be called for each object available in the\n database. Note that the objects are likely to be returned in the index\n order, which would make accessing the objects in that order inefficient.\n Return a non-zero value from the callback to stop looping.

\n", + "comments": "

The callback will be called for each object available in the database. Note that the objects are likely to be returned in the index order, which would make accessing the objects in that order inefficient. Return a non-zero value from the callback to stop looping.

\n", "group": "odb" }, "git_odb_write": { "type": "function", "file": "git2/odb.h", - "line": 273, - "lineto": 273, + "line": 274, + "lineto": 274, "args": [ { "name": "out", @@ -12142,19 +11933,19 @@ "comment": " 0 or an error code" }, "description": "

Write an object directly into the ODB

\n", - "comments": "

This method writes a full object straight into the ODB.\n For most cases, it is preferred to write objects through a write\n stream, which is both faster and less memory intensive, specially\n for big objects.

\n\n

This method is provided for compatibility with custom backends\n which are not able to support streaming writes

\n", + "comments": "

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.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", "group": "odb", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_odb_write-43" + "ex/HEAD/general.html#git_odb_write-43" ] } }, "git_odb_open_wstream": { "type": "function", "file": "git2/odb.h", - "line": 296, - "lineto": 296, + "line": 297, + "lineto": 297, "args": [ { "name": "out", @@ -12184,14 +11975,14 @@ "comment": " 0 if the stream was created; error code otherwise" }, "description": "

Open a stream to write an object into the ODB

\n", - "comments": "

The type and final length of the object must be specified\n when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it\n won't be effective until git_odb_stream_finalize_write is called\n and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or\n will leak memory.

\n", + "comments": "

The type and final length of the object must be specified when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it won't be effective until git_odb_stream_finalize_write is called and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or will leak memory.

\n", "group": "odb" }, "git_odb_stream_write": { "type": "function", "file": "git2/odb.h", - "line": 309, - "lineto": 309, + "line": 310, + "lineto": 310, "args": [ { "name": "stream", @@ -12216,14 +12007,14 @@ "comment": " 0 if the write succeeded; error code otherwise" }, "description": "

Write to an odb stream

\n", - "comments": "

This method will fail if the total number of received bytes exceeds the\n size declared with git_odb_open_wstream()

\n", + "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", "group": "odb" }, "git_odb_stream_finalize_write": { "type": "function", "file": "git2/odb.h", - "line": 324, - "lineto": 324, + "line": 325, + "lineto": 325, "args": [ { "name": "out", @@ -12243,14 +12034,14 @@ "comment": " 0 on success; an error code otherwise" }, "description": "

Finish writing to an odb stream

\n", - "comments": "

The object will take its final name and will be available to the\n odb.

\n\n

This method will fail if the total number of received bytes\n differs from the size declared with git_odb_open_wstream()

\n", + "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", "group": "odb" }, "git_odb_stream_read": { "type": "function", "file": "git2/odb.h", - "line": 331, - "lineto": 331, + "line": 332, + "lineto": 332, "args": [ { "name": "stream", @@ -12281,8 +12072,8 @@ "git_odb_stream_free": { "type": "function", "file": "git2/odb.h", - "line": 338, - "lineto": 338, + "line": 339, + "lineto": 339, "args": [ { "name": "stream", @@ -12303,8 +12094,8 @@ "git_odb_open_rstream": { "type": "function", "file": "git2/odb.h", - "line": 366, - "lineto": 371, + "line": 367, + "lineto": 372, "args": [ { "name": "out", @@ -12339,14 +12130,14 @@ "comment": " 0 if the stream was created; error code otherwise" }, "description": "

Open a stream to read an object from the ODB

\n", - "comments": "

Note that most backends do not support streaming reads\n because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is\n assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and\n will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream\n    - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", + "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", "group": "odb" }, "git_odb_write_pack": { "type": "function", "file": "git2/odb.h", - "line": 391, - "lineto": 395, + "line": 392, + "lineto": 396, "args": [ { "name": "out", @@ -12360,7 +12151,7 @@ }, { "name": "progress_cb", - "type": "git_transfer_progress_cb", + "type": "git_indexer_progress_cb", "comment": "function to call with progress information.\n Be aware that this is called inline with network and indexing operations,\n so performance may be affected." }, { @@ -12369,21 +12160,21 @@ "comment": "payload for the progress callback" } ], - "argline": "git_odb_writepack **out, git_odb *db, git_transfer_progress_cb progress_cb, void *progress_payload", - "sig": "git_odb_writepack **::git_odb *::git_transfer_progress_cb::void *", + "argline": "git_odb_writepack **out, git_odb *db, git_indexer_progress_cb progress_cb, void *progress_payload", + "sig": "git_odb_writepack **::git_odb *::git_indexer_progress_cb::void *", "return": { "type": "int", "comment": null }, "description": "

Open a stream for writing a pack file to the ODB.

\n", - "comments": "

If the ODB layer understands pack files, then the given\n packfile will likely be streamed directly to disk (and a\n corresponding index created). If the ODB layer does not\n understand pack files, the objects will be stored in whatever\n format the ODB layer uses.

\n", + "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", "group": "odb" }, "git_odb_hash": { "type": "function", "file": "git2/odb.h", - "line": 409, - "lineto": 409, + "line": 410, + "lineto": 410, "args": [ { "name": "out", @@ -12413,14 +12204,14 @@ "comment": " 0 or an error code" }, "description": "

Determine the object-ID (sha1 hash) of a data buffer

\n", - "comments": "

The resulting SHA-1 OID will be the identifier for the data\n buffer as if the data buffer it were to written to the ODB.

\n", + "comments": "

The resulting SHA-1 OID will be the identifier for the data buffer as if the data buffer it were to written to the ODB.

\n", "group": "odb" }, "git_odb_hashfile": { "type": "function", "file": "git2/odb.h", - "line": 424, - "lineto": 424, + "line": 425, + "lineto": 425, "args": [ { "name": "out", @@ -12451,8 +12242,8 @@ "git_odb_object_dup": { "type": "function", "file": "git2/odb.h", - "line": 438, - "lineto": 438, + "line": 439, + "lineto": 439, "args": [ { "name": "dest", @@ -12472,14 +12263,14 @@ "comment": " 0 or an error code" }, "description": "

Create a copy of an odb_object

\n", - "comments": "

The returned copy must be manually freed with git_odb_object_free.\n Note that because of an implementation detail, the returned copy will be\n the same pointer as source: the object is internally refcounted, so the\n copy still needs to be freed twice.

\n", + "comments": "

The returned copy must be manually freed with git_odb_object_free. Note that because of an implementation detail, the returned copy will be the same pointer as source: the object is internally refcounted, so the copy still needs to be freed twice.

\n", "group": "odb" }, "git_odb_object_free": { "type": "function", "file": "git2/odb.h", - "line": 448, - "lineto": 448, + "line": 449, + "lineto": 449, "args": [ { "name": "object", @@ -12494,22 +12285,22 @@ "comment": null }, "description": "

Close an ODB object

\n", - "comments": "

This method must always be called once a git_odb_object is no\n longer needed, otherwise memory will leak.

\n", + "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_odb_object_free-24" + "ex/HEAD/cat-file.html#git_odb_object_free-22" ], "general.c": [ - "ex/v0.28.0/general.html#git_odb_object_free-44" + "ex/HEAD/general.html#git_odb_object_free-44" ] } }, "git_odb_object_id": { "type": "function", "file": "git2/odb.h", - "line": 458, - "lineto": 458, + "line": 459, + "lineto": 459, "args": [ { "name": "object", @@ -12530,8 +12321,8 @@ "git_odb_object_data": { "type": "function", "file": "git2/odb.h", - "line": 471, - "lineto": 471, + "line": 472, + "lineto": 472, "args": [ { "name": "object", @@ -12546,19 +12337,19 @@ "comment": " a pointer to the data" }, "description": "

Return the data of an ODB object

\n", - "comments": "

This is the uncompressed, raw data as read from the ODB,\n without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", + "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", "group": "odb", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_odb_object_data-45" + "ex/HEAD/general.html#git_odb_object_data-45" ] } }, "git_odb_object_size": { "type": "function", "file": "git2/odb.h", - "line": 482, - "lineto": 482, + "line": 483, + "lineto": 483, "args": [ { "name": "object", @@ -12573,22 +12364,22 @@ "comment": " the size" }, "description": "

Return the size of an ODB object

\n", - "comments": "

This is the real size of the data buffer, not the\n actual size of the object.

\n", + "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_odb_object_size-25" + "ex/HEAD/cat-file.html#git_odb_object_size-23" ], "general.c": [ - "ex/v0.28.0/general.html#git_odb_object_size-46" + "ex/HEAD/general.html#git_odb_object_size-46" ] } }, "git_odb_object_type": { "type": "function", "file": "git2/odb.h", - "line": 490, - "lineto": 490, + "line": 491, + "lineto": 491, "args": [ { "name": "object", @@ -12607,15 +12398,15 @@ "group": "odb", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_odb_object_type-47" + "ex/HEAD/general.html#git_odb_object_type-47" ] } }, "git_odb_add_backend": { "type": "function", "file": "git2/odb.h", - "line": 505, - "lineto": 505, + "line": 506, + "lineto": 506, "args": [ { "name": "odb", @@ -12640,14 +12431,14 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Add a custom backend to an existing Object DB

\n", - "comments": "

The backends are checked in relative ordering, based on the\n value of the priority parameter.

\n\n

Read \n for more information.

\n", + "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", "group": "odb" }, "git_odb_add_alternate": { "type": "function", "file": "git2/odb.h", - "line": 526, - "lineto": 526, + "line": 527, + "lineto": 527, "args": [ { "name": "odb", @@ -12672,14 +12463,14 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", - "comments": "

Alternate backends are always checked for objects after\n all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the\n value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read \n for more information.

\n", + "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", "group": "odb" }, "git_odb_num_backends": { "type": "function", "file": "git2/odb.h", - "line": 534, - "lineto": 534, + "line": 535, + "lineto": 535, "args": [ { "name": "odb", @@ -12700,8 +12491,8 @@ "git_odb_get_backend": { "type": "function", "file": "git2/odb.h", - "line": 544, - "lineto": 544, + "line": 545, + "lineto": 545, "args": [ { "name": "out", @@ -12732,8 +12523,8 @@ "git_odb_backend_pack": { "type": "function", "file": "git2/odb_backend.h", - "line": 34, - "lineto": 34, + "line": 35, + "lineto": 35, "args": [ { "name": "out", @@ -12759,8 +12550,8 @@ "git_odb_backend_loose": { "type": "function", "file": "git2/odb_backend.h", - "line": 48, - "lineto": 54, + "line": 49, + "lineto": 55, "args": [ { "name": "out", @@ -12806,8 +12597,8 @@ "git_odb_backend_one_pack": { "type": "function", "file": "git2/odb_backend.h", - "line": 67, - "lineto": 67, + "line": 68, + "lineto": 68, "args": [ { "name": "out", @@ -12827,7 +12618,7 @@ "comment": " 0 or an error code" }, "description": "

Create a backend out of a single packfile

\n", - "comments": "

This can be useful for inspecting the contents of a single\n packfile.

\n", + "comments": "

This can be useful for inspecting the contents of a single packfile.

\n", "group": "odb" }, "git_oid_fromstr": { @@ -12858,14 +12649,14 @@ "group": "oid", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_oid_fromstr-48", - "ex/v0.28.0/general.html#git_oid_fromstr-49", - "ex/v0.28.0/general.html#git_oid_fromstr-50", - "ex/v0.28.0/general.html#git_oid_fromstr-51", - "ex/v0.28.0/general.html#git_oid_fromstr-52", - "ex/v0.28.0/general.html#git_oid_fromstr-53", - "ex/v0.28.0/general.html#git_oid_fromstr-54", - "ex/v0.28.0/general.html#git_oid_fromstr-55" + "ex/HEAD/general.html#git_oid_fromstr-48", + "ex/HEAD/general.html#git_oid_fromstr-49", + "ex/HEAD/general.html#git_oid_fromstr-50", + "ex/HEAD/general.html#git_oid_fromstr-51", + "ex/HEAD/general.html#git_oid_fromstr-52", + "ex/HEAD/general.html#git_oid_fromstr-53", + "ex/HEAD/general.html#git_oid_fromstr-54", + "ex/HEAD/general.html#git_oid_fromstr-55" ] } }, @@ -12925,7 +12716,7 @@ "comment": " 0 or an error code" }, "description": "

Parse N characters of a hex formatted object id into a git_oid.

\n", - "comments": "

If N is odd, the last byte's high nibble will be read in and the\n low nibble set to zero.

\n", + "comments": "

If N is odd, the last byte's high nibble will be read in and the low nibble set to zero.

\n", "group": "oid" }, "git_oid_fromraw": { @@ -12982,20 +12773,20 @@ "comments": "", "group": "oid", "examples": { + "fetch.c": [ + "ex/HEAD/fetch.html#git_oid_fmt-1", + "ex/HEAD/fetch.html#git_oid_fmt-2" + ], "general.c": [ - "ex/v0.28.0/general.html#git_oid_fmt-56", - "ex/v0.28.0/general.html#git_oid_fmt-57", - "ex/v0.28.0/general.html#git_oid_fmt-58", - "ex/v0.28.0/general.html#git_oid_fmt-59", - "ex/v0.28.0/general.html#git_oid_fmt-60", - "ex/v0.28.0/general.html#git_oid_fmt-61" - ], - "network/fetch.c": [ - "ex/v0.28.0/network/fetch.html#git_oid_fmt-1", - "ex/v0.28.0/network/fetch.html#git_oid_fmt-2" - ], - "network/ls-remote.c": [ - "ex/v0.28.0/network/ls-remote.html#git_oid_fmt-1" + "ex/HEAD/general.html#git_oid_fmt-56", + "ex/HEAD/general.html#git_oid_fmt-57", + "ex/HEAD/general.html#git_oid_fmt-58", + "ex/HEAD/general.html#git_oid_fmt-59", + "ex/HEAD/general.html#git_oid_fmt-60", + "ex/HEAD/general.html#git_oid_fmt-61" + ], + "ls-remote.c": [ + "ex/HEAD/ls-remote.html#git_oid_fmt-1" ] } }, @@ -13055,7 +12846,7 @@ "comment": null }, "description": "

Format a git_oid into a loose-object path string.

\n", - "comments": "

The resulting string is "aa/...", where "aa" is the first two\n hex digits of the oid and "..." is the remaining 38 digits.

\n", + "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", "group": "oid" }, "git_oid_tostr_s": { @@ -13077,12 +12868,12 @@ "comment": " the c-string" }, "description": "

Format a git_oid into a statically allocated c-string.

\n", - "comments": "

The c-string is owned by the library and should not be freed\n by the user. If libgit2 is built with thread support, the string\n will be stored in TLS (i.e. one buffer per thread) to allow for\n concurrent calls of the function.

\n", + "comments": "

The c-string is owned by the library and should not be freed by the user. If libgit2 is built with thread support, the string will be stored in TLS (i.e. one buffer per thread) to allow for concurrent calls of the function.

\n", "group": "oid", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_oid_tostr_s-21", - "ex/v0.28.0/merge.html#git_oid_tostr_s-22" + "ex/HEAD/merge.html#git_oid_tostr_s-19", + "ex/HEAD/merge.html#git_oid_tostr_s-20" ] } }, @@ -13115,29 +12906,29 @@ "comment": " the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string." }, "description": "

Format a git_oid into a buffer as a hex format c-string.

\n", - "comments": "

If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting\n oid c-string will be truncated to n-1 characters (but will still be\n NUL-byte terminated).

\n\n

If there are any input parameter errors (out == NULL, n == 0, oid ==\n NULL), then a pointer to an empty string is returned, so that the\n return value can always be printed.

\n", + "comments": "

If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting oid c-string will be truncated to n-1 characters (but will still be NUL-byte terminated).

\n\n

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.

\n", "group": "oid", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_oid_tostr-18", - "ex/v0.28.0/blame.html#git_oid_tostr-19" + "ex/HEAD/blame.html#git_oid_tostr-16", + "ex/HEAD/blame.html#git_oid_tostr-17" ], "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_oid_tostr-26", - "ex/v0.28.0/cat-file.html#git_oid_tostr-27", - "ex/v0.28.0/cat-file.html#git_oid_tostr-28", - "ex/v0.28.0/cat-file.html#git_oid_tostr-29", - "ex/v0.28.0/cat-file.html#git_oid_tostr-30" + "ex/HEAD/cat-file.html#git_oid_tostr-24", + "ex/HEAD/cat-file.html#git_oid_tostr-25", + "ex/HEAD/cat-file.html#git_oid_tostr-26", + "ex/HEAD/cat-file.html#git_oid_tostr-27", + "ex/HEAD/cat-file.html#git_oid_tostr-28" ], "log.c": [ - "ex/v0.28.0/log.html#git_oid_tostr-40", - "ex/v0.28.0/log.html#git_oid_tostr-41" + "ex/HEAD/log.html#git_oid_tostr-38", + "ex/HEAD/log.html#git_oid_tostr-39" ], "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_oid_tostr-12", - "ex/v0.28.0/rev-parse.html#git_oid_tostr-13", - "ex/v0.28.0/rev-parse.html#git_oid_tostr-14", - "ex/v0.28.0/rev-parse.html#git_oid_tostr-15" + "ex/HEAD/rev-parse.html#git_oid_tostr-10", + "ex/HEAD/rev-parse.html#git_oid_tostr-11", + "ex/HEAD/rev-parse.html#git_oid_tostr-12", + "ex/HEAD/rev-parse.html#git_oid_tostr-13" ] } }, @@ -13169,9 +12960,9 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_oid_cpy-20", - "ex/v0.28.0/blame.html#git_oid_cpy-21", - "ex/v0.28.0/blame.html#git_oid_cpy-22" + "ex/HEAD/blame.html#git_oid_cpy-18", + "ex/HEAD/blame.html#git_oid_cpy-19", + "ex/HEAD/blame.html#git_oid_cpy-20" ] } }, @@ -13315,7 +13106,7 @@ "comments": "", "group": "oid" }, - "git_oid_iszero": { + "git_oid_is_zero": { "type": "function", "file": "git2/oid.h", "line": 210, @@ -13338,10 +13129,10 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_oid_iszero-23" + "ex/HEAD/blame.html#git_oid_is_zero-21" ], - "network/fetch.c": [ - "ex/v0.28.0/network/fetch.html#git_oid_iszero-3" + "fetch.c": [ + "ex/HEAD/fetch.html#git_oid_is_zero-3" ] } }, @@ -13364,7 +13155,7 @@ "comment": " a `git_oid_shorten` instance, NULL if OOM" }, "description": "

Create a new OID shortener.

\n", - "comments": "

The OID shortener is used to process a list of OIDs\n in text form and return the shortest length that would\n uniquely identify all of them.

\n\n

E.g. look at the result of git log --abbrev.

\n", + "comments": "

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.

\n\n

E.g. look at the result of git log --abbrev.

\n", "group": "oid" }, "git_oid_shorten_add": { @@ -13391,7 +13182,7 @@ "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." }, "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", - "comments": "

The OID is expected to be a 40-char hexadecimal string.\n The OID is owned by the user and will not be modified\n or freed.

\n\n

For performance reasons, there is a hard-limit of how many\n OIDs can be added to a single set (around ~32000, assuming\n a mostly randomized distribution), which should be enough\n for any kind of program, and keeps the algorithm fast and\n memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a\n GIT_ERROR_INVALID error

\n", + "comments": "

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.

\n\n

For performance reasons, there is a hard-limit of how many OIDs can be added to a single set (around ~32000, assuming a mostly randomized distribution), which should be enough for any kind of program, and keeps the algorithm fast and memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a GIT_ERROR_INVALID error

\n", "group": "oid" }, "git_oid_shorten_free": { @@ -13435,14 +13226,14 @@ "comment": null }, "description": "

Free the OID array

\n", - "comments": "

This method must (and must only) be called on git_oidarray\n objects where the array is allocated by the library. Not doing so,\n will result in a memory leak.

\n\n

This does not free the git_oidarray itself, since the library will\n never allocate that object directly itself (it is more commonly embedded\n inside another struct or created on the stack).

\n", + "comments": "

This method must (and must only) be called on git_oidarray objects where the array is allocated by the library. Not doing so, will result in a memory leak.

\n\n

This does not free the git_oidarray itself, since the library will never allocate that object directly itself (it is more commonly embedded inside another struct or created on the stack).

\n", "group": "oidarray" }, "git_packbuilder_new": { "type": "function", "file": "git2/pack.h", - "line": 64, - "lineto": 64, + "line": 65, + "lineto": 65, "args": [ { "name": "out", @@ -13468,8 +13259,8 @@ "git_packbuilder_set_threads": { "type": "function", "file": "git2/pack.h", - "line": 77, - "lineto": 77, + "line": 78, + "lineto": 78, "args": [ { "name": "pb", @@ -13489,14 +13280,14 @@ "comment": " number of actual threads to be used" }, "description": "

Set number of threads to spawn

\n", - "comments": "

By default, libgit2 won't spawn any threads at all;\n when set to 0, libgit2 will autodetect the number of\n CPUs.

\n", + "comments": "

By default, libgit2 won't spawn any threads at all; when set to 0, libgit2 will autodetect the number of CPUs.

\n", "group": "packbuilder" }, "git_packbuilder_insert": { "type": "function", "file": "git2/pack.h", - "line": 91, - "lineto": 91, + "line": 92, + "lineto": 92, "args": [ { "name": "pb", @@ -13521,14 +13312,14 @@ "comment": " 0 or an error code" }, "description": "

Insert a single object

\n", - "comments": "

For an optimal pack it's mandatory to insert objects in recency order,\n commits followed by trees and blobs.

\n", + "comments": "

For an optimal pack it's mandatory to insert objects in recency order, commits followed by trees and blobs.

\n", "group": "packbuilder" }, "git_packbuilder_insert_tree": { "type": "function", "file": "git2/pack.h", - "line": 103, - "lineto": 103, + "line": 104, + "lineto": 104, "args": [ { "name": "pb", @@ -13554,8 +13345,8 @@ "git_packbuilder_insert_commit": { "type": "function", "file": "git2/pack.h", - "line": 115, - "lineto": 115, + "line": 116, + "lineto": 116, "args": [ { "name": "pb", @@ -13581,8 +13372,8 @@ "git_packbuilder_insert_walk": { "type": "function", "file": "git2/pack.h", - "line": 128, - "lineto": 128, + "line": 129, + "lineto": 129, "args": [ { "name": "pb", @@ -13602,14 +13393,14 @@ "comment": " 0 or an error code" }, "description": "

Insert objects as given by the walk

\n", - "comments": "

Those commits and all objects they reference will be inserted into\n the packbuilder.

\n", + "comments": "

Those commits and all objects they reference will be inserted into the packbuilder.

\n", "group": "packbuilder" }, "git_packbuilder_insert_recur": { "type": "function", "file": "git2/pack.h", - "line": 140, - "lineto": 140, + "line": 141, + "lineto": 141, "args": [ { "name": "pb", @@ -13640,8 +13431,8 @@ "git_packbuilder_write_buf": { "type": "function", "file": "git2/pack.h", - "line": 151, - "lineto": 151, + "line": 152, + "lineto": 152, "args": [ { "name": "buf", @@ -13661,14 +13452,14 @@ "comment": null }, "description": "

Write the contents of the packfile to an in-memory buffer

\n", - "comments": "

The contents of the buffer will become a valid packfile, even though there\n will be no attached index

\n", + "comments": "

The contents of the buffer will become a valid packfile, even though there will be no attached index

\n", "group": "packbuilder" }, "git_packbuilder_write": { "type": "function", "file": "git2/pack.h", - "line": 164, - "lineto": 169, + "line": 165, + "lineto": 170, "args": [ { "name": "pb", @@ -13687,7 +13478,7 @@ }, { "name": "progress_cb", - "type": "git_transfer_progress_cb", + "type": "git_indexer_progress_cb", "comment": "function to call with progress information from the indexer (optional)" }, { @@ -13696,8 +13487,8 @@ "comment": "payload for the progress callback (optional)" } ], - "argline": "git_packbuilder *pb, const char *path, unsigned int mode, git_transfer_progress_cb progress_cb, void *progress_cb_payload", - "sig": "git_packbuilder *::const char *::unsigned int::git_transfer_progress_cb::void *", + "argline": "git_packbuilder *pb, const char *path, unsigned int mode, git_indexer_progress_cb progress_cb, void *progress_cb_payload", + "sig": "git_packbuilder *::const char *::unsigned int::git_indexer_progress_cb::void *", "return": { "type": "int", "comment": " 0 or an error code" @@ -13709,8 +13500,8 @@ "git_packbuilder_hash": { "type": "function", "file": "git2/pack.h", - "line": 179, - "lineto": 179, + "line": 180, + "lineto": 180, "args": [ { "name": "pb", @@ -13725,14 +13516,14 @@ "comment": null }, "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object\n names. This is only correct after the packfile has been written.

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the packfile has been written.

\n", "group": "packbuilder" }, "git_packbuilder_foreach": { "type": "function", "file": "git2/pack.h", - "line": 191, - "lineto": 191, + "line": 202, + "lineto": 202, "args": [ { "name": "pb", @@ -13763,8 +13554,8 @@ "git_packbuilder_object_count": { "type": "function", "file": "git2/pack.h", - "line": 199, - "lineto": 199, + "line": 210, + "lineto": 210, "args": [ { "name": "pb", @@ -13785,8 +13576,8 @@ "git_packbuilder_written": { "type": "function", "file": "git2/pack.h", - "line": 207, - "lineto": 207, + "line": 218, + "lineto": 218, "args": [ { "name": "pb", @@ -13807,8 +13598,8 @@ "git_packbuilder_set_callbacks": { "type": "function", "file": "git2/pack.h", - "line": 226, - "lineto": 229, + "line": 237, + "lineto": 240, "args": [ { "name": "pb", @@ -13839,8 +13630,8 @@ "git_packbuilder_free": { "type": "function", "file": "git2/pack.h", - "line": 236, - "lineto": 236, + "line": 247, + "lineto": 247, "args": [ { "name": "pb", @@ -13887,7 +13678,7 @@ "comment": " 0 on success, other value \n<\n 0 on error" }, "description": "

Return a patch for an entry in the diff list.

\n", - "comments": "

The git_patch is a newly created object contains the text diffs\n for the delta. You have to call git_patch_free() when you are\n done with it. You can use the patch object to loop over all the hunks\n and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be\n created, the output will be set to NULL, and the binary flag will be\n set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass\n NULL for the git_patch, then the text diff will not be calculated.

\n", + "comments": "

The git_patch is a newly created object contains the text diffs for the delta. You have to call git_patch_free() when you are done with it. You can use the patch object to loop over all the hunks and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be created, the output will be set to NULL, and the binary flag will be set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass NULL for the git_patch, then the text diff will not be calculated.

\n", "group": "patch" }, "git_patch_from_blobs": { @@ -13934,7 +13725,7 @@ "comment": " 0 on success or error code \n<\n 0" }, "description": "

Directly generate a patch from the difference between two blobs.

\n", - "comments": "

This is just like git_diff_blobs() except it generates a patch object\n for the difference instead of directly making callbacks. You can use the\n standard git_patch accessor functions to read the patch data, and\n you must call git_patch_free() on the patch when done.

\n", + "comments": "

This is just like git_diff_blobs() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", "group": "patch" }, "git_patch_from_blob_and_buffer": { @@ -13986,7 +13777,7 @@ "comment": " 0 on success or error code \n<\n 0" }, "description": "

Directly generate a patch from the difference between a blob and a buffer.

\n", - "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch\n object for the difference instead of directly making callbacks. You can\n use the standard git_patch accessor functions to read the patch\n data, and you must call git_patch_free() on the patch when done.

\n", + "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", "group": "patch" }, "git_patch_from_buffers": { @@ -14043,7 +13834,7 @@ "comment": " 0 on success or error code \n<\n 0" }, "description": "

Directly generate a patch from the difference between two buffers.

\n", - "comments": "

This is just like git_diff_buffers() except it generates a patch\n object for the difference instead of directly making callbacks. You can\n use the standard git_patch accessor functions to read the patch\n data, and you must call git_patch_free() on the patch when done.

\n", + "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", "group": "patch" }, "git_patch_free": { @@ -14146,7 +13937,7 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Get line counts of each type in a patch.

\n", - "comments": "

This helps imitate a diff --numstat type of output. For that purpose,\n you only need the total_additions and total_deletions values, but we\n include the total_context line count in case you want the total number\n of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", + "comments": "

This helps imitate a diff --numstat type of output. For that purpose, you only need the total_additions and total_deletions values, but we include the total_context line count in case you want the total number of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", "group": "patch" }, "git_patch_get_hunk": { @@ -14183,7 +13974,7 @@ "comment": " 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error" }, "description": "

Get the information about a hunk in a patch

\n", - "comments": "

Given a patch and a hunk index into the patch, this returns detailed\n information about that hunk. Any of the output pointers can be passed\n as NULL if you don't care about that particular piece of information.

\n", + "comments": "

Given a patch and a hunk index into the patch, this returns detailed information about that hunk. Any of the output pointers can be passed as NULL if you don't care about that particular piece of information.

\n", "group": "patch" }, "git_patch_num_lines_in_hunk": { @@ -14247,7 +14038,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Get data about a line in a hunk of a patch.

\n", - "comments": "

Given a patch, a hunk index, and a line index in the hunk, this\n will return a lot of details about that line. If you pass a hunk\n index larger than the number of hunks or a line index larger than\n the number of lines in the hunk, this will return -1.

\n", + "comments": "

Given a patch, a hunk index, and a line index in the hunk, this will return a lot of details about that line. If you pass a hunk index larger than the number of hunks or a line index larger than the number of lines in the hunk, this will return -1.

\n", "group": "patch" }, "git_patch_size": { @@ -14284,7 +14075,7 @@ "comment": " The number of bytes of data" }, "description": "

Look up size of patch diff data in bytes

\n", - "comments": "

This returns the raw size of the patch data. This only includes the\n actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size\n of all of the diff output; if you pass it as false (zero), this will\n only include the actual changed lines (as if context_lines was 0).

\n", + "comments": "

This returns the raw size of the patch data. This only includes the actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size of all of the diff output; if you pass it as false (zero), this will only include the actual changed lines (as if context_lines was 0).

\n", "group": "patch" }, "git_patch_print": { @@ -14316,7 +14107,7 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Serialize the patch to text via callback.

\n", - "comments": "

Returning a non-zero value from the callback will terminate the iteration\n and return that value to the caller.

\n", + "comments": "

Returning a non-zero value from the callback will terminate the iteration and return that value to the caller.

\n", "group": "patch" }, "git_patch_to_buf": { @@ -14374,7 +14165,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_pathspec_new-42" + "ex/HEAD/log.html#git_pathspec_new-40" ] } }, @@ -14401,7 +14192,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_pathspec_free-43" + "ex/HEAD/log.html#git_pathspec_free-41" ] } }, @@ -14414,27 +14205,27 @@ { "name": "ps", "type": "const git_pathspec *", - "comment": null + "comment": "The compiled pathspec" }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" }, { "name": "path", "type": "const char *", - "comment": null + "comment": "The pathname to attempt to match" } ], - "argline": "const git_pathspec *ps, int flags, const char *path", - "sig": "const git_pathspec *::int::const char *", + "argline": "const git_pathspec *ps, uint32_t flags, const char *path", + "sig": "const git_pathspec *::uint32_t::const char *", "return": { "type": "int", - "comment": null + "comment": " 1 is path matches spec, 0 if it does not" }, - "description": "", - "comments": "", + "description": "

Try to match a path against a pathspec

\n", + "comments": "

Unlike most of the other pathspec matching functions, this will not fall back on the native case-sensitivity for your platform. You must explicitly pass flags to control case sensitivity or else this will fall back on being case sensitive.

\n", "group": "pathspec" }, "git_pathspec_match_workdir": { @@ -14446,32 +14237,32 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": null + "comment": "Output list of matches; pass NULL to just get return value" }, { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "The repository in which to match; bare repo is an error" }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" }, { "name": "ps", "type": "git_pathspec *", - "comment": null + "comment": "Pathspec to be matched" } ], - "argline": "git_pathspec_match_list **out, git_repository *repo, int flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_repository *::int::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *", "return": { "type": "int", - "comment": null + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" }, - "description": "", - "comments": "", + "description": "

Match a pathspec against the working directory of a repository.

\n", + "comments": "

This matches the pathspec against the current files in the working directory of the repository. It is an error to invoke this on a bare repo. This handles git ignores (i.e. ignored files will not be considered to match the pathspec unless the file is tracked in the index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec" }, "git_pathspec_match_index": { @@ -14483,32 +14274,32 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": null + "comment": "Output list of matches; pass NULL to just get return value" }, { "name": "index", "type": "git_index *", - "comment": null + "comment": "The index to match against" }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" }, { "name": "ps", "type": "git_pathspec *", - "comment": null + "comment": "Pathspec to be matched" } ], - "argline": "git_pathspec_match_list **out, git_index *index, int flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_index *::int::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *", "return": { "type": "int", - "comment": null + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" }, - "description": "", - "comments": "", + "description": "

Match a pathspec against entries in an index.

\n", + "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled by the current case-sensitivity of the index object itself and the USE_CASE and IGNORE_CASE flags will have no effect. This behavior will be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec" }, "git_pathspec_match_tree": { @@ -14520,36 +14311,36 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": null + "comment": "Output list of matches; pass NULL to just get return value" }, { "name": "tree", "type": "git_tree *", - "comment": null + "comment": "The root-level tree to match against" }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" }, { "name": "ps", "type": "git_pathspec *", - "comment": null + "comment": "Pathspec to be matched" } ], - "argline": "git_pathspec_match_list **out, git_tree *tree, int flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_tree *::int::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *", "return": { "type": "int", - "comment": null + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" }, - "description": "", - "comments": "", + "description": "

Match a pathspec against files in a tree.

\n", + "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_pathspec_match_tree-44" + "ex/HEAD/log.html#git_pathspec_match_tree-42" ] } }, @@ -14562,32 +14353,32 @@ { "name": "out", "type": "git_pathspec_match_list **", - "comment": null + "comment": "Output list of matches; pass NULL to just get return value" }, { "name": "diff", "type": "git_diff *", - "comment": null + "comment": "A generated diff list" }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" }, { "name": "ps", "type": "git_pathspec *", - "comment": null + "comment": "Pathspec to be matched" } ], - "argline": "git_pathspec_match_list **out, git_diff *diff, int flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_diff *::int::git_pathspec *", + "argline": "git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *", "return": { "type": "int", - "comment": null + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" }, - "description": "", - "comments": "", + "description": "

Match a pathspec against files in a diff list.

\n", + "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec" }, "git_pathspec_match_list_free": { @@ -14658,7 +14449,7 @@ "comment": " The filename of the match" }, "description": "

Get a matching filename by position.

\n", - "comments": "

This routine cannot be used if the match list was generated by\n git_pathspec_match_diff. If so, it will always return NULL.

\n", + "comments": "

This routine cannot be used if the match list was generated by git_pathspec_match_diff. If so, it will always return NULL.

\n", "group": "pathspec" }, "git_pathspec_match_list_diff_entry": { @@ -14685,7 +14476,7 @@ "comment": " The filename of the match" }, "description": "

Get a matching diff delta by position.

\n", - "comments": "

This routine can only be used if the match list was generated by\n git_pathspec_match_diff. Otherwise it will always return NULL.

\n", + "comments": "

This routine can only be used if the match list was generated by git_pathspec_match_diff. Otherwise it will always return NULL.

\n", "group": "pathspec" }, "git_pathspec_match_list_failed_entrycount": { @@ -14707,7 +14498,7 @@ "comment": " Number of items in original pathspec that had no matches" }, "description": "

Get the number of pathspec items that did not match.

\n", - "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when\n generating the git_pathspec_match_list.

\n", + "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when generating the git_pathspec_match_list.

\n", "group": "pathspec" }, "git_pathspec_match_list_failed_entry": { @@ -14737,7 +14528,7 @@ "comments": "

This will be return NULL for positions out of range.

\n", "group": "pathspec" }, - "git_proxy_init_options": { + "git_proxy_options_init": { "type": "function", "file": "git2/proxy.h", "line": 92, @@ -14761,10 +14552,10 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_proxy_options structure

\n", - "comments": "

Initializes a git_proxy_options with default values. Equivalent to\n creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_proxy_options with default values. Equivalent to creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", "group": "proxy" }, - "git_rebase_init_options": { + "git_rebase_options_init": { "type": "function", "file": "git2/rebase.h", "line": 159, @@ -14788,7 +14579,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_rebase_options structure

\n", - "comments": "

Initializes a git_rebase_options with default values. Equivalent to\n creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_rebase_options with default values. Equivalent to creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", "group": "rebase" }, "git_rebase_init": { @@ -14870,11 +14661,99 @@ "comments": "", "group": "rebase" }, + "git_rebase_orig_head_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 207, + "lineto": 207, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": null + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const char *", + "comment": " The original `HEAD` ref name" + }, + "description": "

Gets the original HEAD ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_orig_head_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 214, + "lineto": 214, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": null + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const git_oid *", + "comment": " The original `HEAD` id" + }, + "description": "

Gets the original HEAD id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 221, + "lineto": 221, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": null + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const char *", + "comment": " The `onto` ref name" + }, + "description": "

Gets the onto ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": null + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const git_oid *", + "comment": " The `onto` id" + }, + "description": "

Gets the onto id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, "git_rebase_operation_entrycount": { "type": "function", "file": "git2/rebase.h", - "line": 208, - "lineto": 208, + "line": 236, + "lineto": 236, "args": [ { "name": "rebase", @@ -14895,8 +14774,8 @@ "git_rebase_operation_current": { "type": "function", "file": "git2/rebase.h", - "line": 219, - "lineto": 219, + "line": 247, + "lineto": 247, "args": [ { "name": "rebase", @@ -14917,8 +14796,8 @@ "git_rebase_operation_byindex": { "type": "function", "file": "git2/rebase.h", - "line": 228, - "lineto": 230, + "line": 256, + "lineto": 258, "args": [ { "name": "rebase", @@ -14944,8 +14823,8 @@ "git_rebase_next": { "type": "function", "file": "git2/rebase.h", - "line": 243, - "lineto": 245, + "line": 271, + "lineto": 273, "args": [ { "name": "operation", @@ -14971,8 +14850,8 @@ "git_rebase_inmemory_index": { "type": "function", "file": "git2/rebase.h", - "line": 258, - "lineto": 260, + "line": 286, + "lineto": 288, "args": [ { "name": "index", @@ -14992,14 +14871,14 @@ "comment": null }, "description": "

Gets the index produced by the last operation, which is the result\n of git_rebase_next and which will be committed by the next\n invocation of git_rebase_commit. This is useful for resolving\n conflicts in an in-memory rebase before committing them. You must\n call git_index_free when you are finished with this.

\n", - "comments": "

This is only applicable for in-memory rebases; for rebases within\n a working directory, the changes were applied to the repository's\n index.

\n", + "comments": "

This is only applicable for in-memory rebases; for rebases within a working directory, the changes were applied to the repository's index.

\n", "group": "rebase" }, "git_rebase_commit": { "type": "function", "file": "git2/rebase.h", - "line": 284, - "lineto": 290, + "line": 312, + "lineto": 318, "args": [ { "name": "id", @@ -15045,8 +14924,8 @@ "git_rebase_abort": { "type": "function", "file": "git2/rebase.h", - "line": 300, - "lineto": 300, + "line": 328, + "lineto": 328, "args": [ { "name": "rebase", @@ -15067,8 +14946,8 @@ "git_rebase_finish": { "type": "function", "file": "git2/rebase.h", - "line": 310, - "lineto": 312, + "line": 338, + "lineto": 340, "args": [ { "name": "rebase", @@ -15094,8 +14973,8 @@ "git_rebase_free": { "type": "function", "file": "git2/rebase.h", - "line": 319, - "lineto": 319, + "line": 347, + "lineto": 347, "args": [ { "name": "rebase", @@ -15137,7 +15016,7 @@ "comment": " 0 or an error code" }, "description": "

Create a new reference database with no backends.

\n", - "comments": "

Before the Ref DB can be used for read/writing, a custom database\n backend must be manually set using git_refdb_set_backend()

\n", + "comments": "

Before the Ref DB can be used for read/writing, a custom database backend must be manually set using git_refdb_set_backend()

\n", "group": "refdb" }, "git_refdb_open": { @@ -15164,7 +15043,7 @@ "comment": " 0 or an error code" }, "description": "

Create a new reference database and automatically add\n the default backends:

\n", - "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs\n from disk, assuming the repository dir as the folder
  • \n
\n", + "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs from disk, assuming the repository dir as the folder
  • \n
\n", "group": "refdb" }, "git_refdb_compress": { @@ -15240,7 +15119,7 @@ "comment": " 0 or an error code" }, "description": "

Read the reflog for the given reference

\n", - "comments": "

If there is no reflog file for the given\n reference yet, an empty reflog object will\n be returned.

\n\n

The reflog must be freed manually by using\n git_reflog_free().

\n", + "comments": "

If there is no reflog file for the given reference yet, an empty reflog object will be returned.

\n\n

The reflog must be freed manually by using git_reflog_free().

\n", "group": "reflog" }, "git_reflog_write": { @@ -15331,7 +15210,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" }, "description": "

Rename a reflog

\n", - "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity.\n See git_reference_create_symbolic() for rules about valid names.

\n", + "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity. See git_reference_create_symbolic() for rules about valid names.

\n", "group": "reflog" }, "git_reflog_delete": { @@ -15407,7 +15286,7 @@ "comment": " the entry; NULL if not found" }, "description": "

Lookup an entry by its index

\n", - "comments": "

Requesting the reflog entry with an index of 0 (zero) will\n return the most recently created entry.

\n", + "comments": "

Requesting the reflog entry with an index of 0 (zero) will return the most recently created entry.

\n", "group": "reflog" }, "git_reflog_drop": { @@ -15439,7 +15318,7 @@ "comment": " 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code." }, "description": "

Remove an entry from the reflog by its index

\n", - "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry\n param value to 1. When deleting entry n, member old_oid of entry n-1\n (if any) will be updated with the value of member new_oid of entry n+1.

\n", + "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry param value to 1. When deleting entry n, member old_oid of entry n-1 (if any) will be updated with the value of member new_oid of entry n+1.

\n", "group": "reflog" }, "git_reflog_entry_id_old": { @@ -15581,14 +15460,14 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." }, "description": "

Lookup a reference by name in a repository.

\n", - "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n", + "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_reference_lookup-62" + "ex/HEAD/general.html#git_reference_lookup-62" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_lookup-23" + "ex/HEAD/merge.html#git_reference_lookup-21" ] } }, @@ -15621,7 +15500,7 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." }, "description": "

Lookup a reference by name and resolve immediately to OID.

\n", - "comments": "

This function provides a quick way to resolve a reference name straight\n through to the object id that it refers to. This avoids having to\n allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n", + "comments": "

This function provides a quick way to resolve a reference name straight through to the object id that it refers to. This avoids having to allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference" }, "git_reference_dwim": { @@ -15653,11 +15532,11 @@ "comment": " 0 or an error code" }, "description": "

Lookup a reference by DWIMing its short name

\n", - "comments": "

Apply the git precendence rules to the given shorthand to determine\n which reference the user is referring to.

\n", + "comments": "

Apply the git precendence rules to the given shorthand to determine which reference the user is referring to.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_dwim-24" + "ex/HEAD/merge.html#git_reference_dwim-22" ] } }, @@ -15710,7 +15589,7 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" }, "description": "

Conditionally create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another\n reference name. If the other name moves, the symbolic name will move,\n too. As a simple example, the "HEAD" reference might refer to\n "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time\n of updating does not match the one passed through current_value\n (i.e. if the ref has changed since the user read it).

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n", "group": "reference" }, "git_reference_symbolic_create": { @@ -15757,7 +15636,7 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another\n reference name. If the other name moves, the symbolic name will move,\n too. As a simple example, the "HEAD" reference might refer to\n "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and it does not have a reflog.

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", "group": "reference" }, "git_reference_create": { @@ -15804,11 +15683,11 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new direct reference.

\n", - "comments": "

A direct reference (also called an object id reference) refers directly\n to a specific object id (a.k.a. OID or SHA) in the repository. The id\n permanently refers to the object (although the reference itself can be\n moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0"\n refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_create-25" + "ex/HEAD/merge.html#git_reference_create-23" ] } }, @@ -15861,7 +15740,7 @@ "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Conditionally create new direct reference

\n", - "comments": "

A direct reference (also called an object id reference) refers directly\n to a specific object id (a.k.a. OID or SHA) in the repository. The id\n permanently refers to the object (although the reference itself can be\n moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0"\n refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to\n the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n\n

This function will return an error if a reference already exists with the\n given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time\n of updating does not match the one passed through current_id\n (i.e. if the ref has changed since the user read it).

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", "group": "reference" }, "git_reference_target": { @@ -15883,11 +15762,11 @@ "comment": " a pointer to the oid if available, NULL otherwise" }, "description": "

Get the OID pointed to by a direct reference.

\n", - "comments": "

Only available if the reference is direct (i.e. an object id reference,\n not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and\n then this function (or maybe use git_reference_name_to_id() to\n directly resolve a reference name all the way through to an OID).

\n", + "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", "group": "reference", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_reference_target-63" + "ex/HEAD/general.html#git_reference_target-63" ] } }, @@ -15910,7 +15789,7 @@ "comment": " a pointer to the oid if available, NULL otherwise" }, "description": "

Return the peeled OID target of this reference.

\n", - "comments": "

This peeled OID only applies to direct references that point to\n a hard Tag object: it is the result of peeling such Tag.

\n", + "comments": "

This peeled OID only applies to direct references that point to a hard Tag object: it is the result of peeling such Tag.

\n", "group": "reference" }, "git_reference_symbolic_target": { @@ -15936,10 +15815,10 @@ "group": "reference", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_reference_symbolic_target-64" + "ex/HEAD/general.html#git_reference_symbolic_target-64" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_symbolic_target-26" + "ex/HEAD/merge.html#git_reference_symbolic_target-24" ] } }, @@ -15966,7 +15845,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_reference_type-65" + "ex/HEAD/general.html#git_reference_type-65" ] } }, @@ -15993,7 +15872,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_name-27" + "ex/HEAD/merge.html#git_reference_name-25" ] } }, @@ -16021,7 +15900,7 @@ "comment": " 0 or an error code" }, "description": "

Resolve a symbolic reference to a direct reference.

\n", - "comments": "

This method iteratively peels a symbolic reference until it resolves to\n a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and\n must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that\n reference is returned. This copy must be manually freed too.

\n", + "comments": "

This method iteratively peels a symbolic reference until it resolves to a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that reference is returned. This copy must be manually freed too.

\n", "group": "reference" }, "git_reference_owner": { @@ -16080,7 +15959,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", - "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does\n not belong in the standard set (HEAD, branches and remote-tracking\n branches) and and it does not have a reflog.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n", "group": "reference" }, "git_reference_set_target": { @@ -16121,7 +16000,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_set_target-28" + "ex/HEAD/merge.html#git_reference_set_target-26" ] } }, @@ -16164,7 +16043,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" }, "description": "

Rename an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity.\n See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already\n a reference with the given name, the renaming will fail.

\n\n

IMPORTANT:\n The user needs to write a proper reflog entry if the\n reflog is enabled for the repository. We only rename\n the reflog if it exists.

\n", + "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already a reference with the given name, the renaming will fail.

\n\n

IMPORTANT: The user needs to write a proper reflog entry if the reflog is enabled for the repository. We only rename the reflog if it exists.

\n", "group": "reference" }, "git_reference_delete": { @@ -16186,7 +16065,7 @@ "comment": " 0, GIT_EMODIFIED or an error code" }, "description": "

Delete an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references. The reference\n will be immediately removed on disk but the memory will not be freed.\n Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed\n from the time it was looked up.

\n", + "comments": "

This method works for both direct and symbolic references. The reference will be immediately removed on disk but the memory will not be freed. Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed from the time it was looked up.

\n", "group": "reference" }, "git_reference_remove": { @@ -16213,7 +16092,7 @@ "comment": " 0 or an error code" }, "description": "

Delete an existing reference by name

\n", - "comments": "

This method removes the named reference from the repository without\n looking at its old value.

\n", + "comments": "

This method removes the named reference from the repository without looking at its old value.

\n", "group": "reference" }, "git_reference_list": { @@ -16240,19 +16119,19 @@ "comment": " 0 or an error code" }, "description": "

Fill a list with all the references that can be found in a repository.

\n", - "comments": "

The string array will be filled with the names of all references; these\n values are owned by the user and should be free'd manually when no\n longer needed, using git_strarray_free().

\n", + "comments": "

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().

\n", "group": "reference", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_reference_list-66" + "ex/HEAD/general.html#git_reference_list-66" ] } }, "git_reference_foreach": { "type": "function", "file": "git2/refs.h", - "line": 444, - "lineto": 447, + "line": 463, + "lineto": 466, "args": [ { "name": "repo", @@ -16277,14 +16156,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Perform a callback on each reference in the repository.

\n", - "comments": "

The callback function will be called for each reference in the\n repository, receiving the reference object and the payload value\n passed to this method. Returning a non-zero value from the callback\n will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free\n on each reference passed to it.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the reference object and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free on each reference passed to it.

\n", "group": "reference" }, "git_reference_foreach_name": { "type": "function", "file": "git2/refs.h", - "line": 462, - "lineto": 465, + "line": 481, + "lineto": 484, "args": [ { "name": "repo", @@ -16309,14 +16188,14 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Perform a callback on the fully-qualified name of each reference.

\n", - "comments": "

The callback function will be called for each reference in the\n repository, receiving the name of the reference and the payload value\n passed to this method. Returning a non-zero value from the callback\n will terminate the iteration.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the name of the reference and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n", "group": "reference" }, "git_reference_dup": { "type": "function", "file": "git2/refs.h", - "line": 476, - "lineto": 476, + "line": 495, + "lineto": 495, "args": [ { "name": "dest", @@ -16342,8 +16221,8 @@ "git_reference_free": { "type": "function", "file": "git2/refs.h", - "line": 483, - "lineto": 483, + "line": 502, + "lineto": 502, "args": [ { "name": "ref", @@ -16362,23 +16241,23 @@ "group": "reference", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_reference_free-67" + "ex/HEAD/general.html#git_reference_free-67" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_free-29", - "ex/v0.28.0/merge.html#git_reference_free-30", - "ex/v0.28.0/merge.html#git_reference_free-31" + "ex/HEAD/merge.html#git_reference_free-27", + "ex/HEAD/merge.html#git_reference_free-28", + "ex/HEAD/merge.html#git_reference_free-29" ], "status.c": [ - "ex/v0.28.0/status.html#git_reference_free-3" + "ex/HEAD/status.html#git_reference_free-1" ] } }, "git_reference_cmp": { "type": "function", "file": "git2/refs.h", - "line": 492, - "lineto": 494, + "line": 511, + "lineto": 513, "args": [ { "name": "ref1", @@ -16404,8 +16283,8 @@ "git_reference_iterator_new": { "type": "function", "file": "git2/refs.h", - "line": 503, - "lineto": 505, + "line": 522, + "lineto": 524, "args": [ { "name": "out", @@ -16431,8 +16310,8 @@ "git_reference_iterator_glob_new": { "type": "function", "file": "git2/refs.h", - "line": 516, - "lineto": 519, + "line": 535, + "lineto": 538, "args": [ { "name": "out", @@ -16463,8 +16342,8 @@ "git_reference_next": { "type": "function", "file": "git2/refs.h", - "line": 528, - "lineto": 528, + "line": 547, + "lineto": 547, "args": [ { "name": "out", @@ -16490,8 +16369,8 @@ "git_reference_next_name": { "type": "function", "file": "git2/refs.h", - "line": 541, - "lineto": 541, + "line": 560, + "lineto": 560, "args": [ { "name": "out", @@ -16511,14 +16390,14 @@ "comment": " 0, GIT_ITEROVER if there are no more; or an error code" }, "description": "

Get the next reference's name

\n", - "comments": "

This function is provided for convenience in case only the names\n are interesting as it avoids the allocation of the git_reference\n object which git_reference_next() needs.

\n", + "comments": "

This function is provided for convenience in case only the names are interesting as it avoids the allocation of the git_reference object which git_reference_next() needs.

\n", "group": "reference" }, "git_reference_iterator_free": { "type": "function", "file": "git2/refs.h", - "line": 548, - "lineto": 548, + "line": 567, + "lineto": 567, "args": [ { "name": "iter", @@ -16539,8 +16418,8 @@ "git_reference_foreach_glob": { "type": "function", "file": "git2/refs.h", - "line": 568, - "lineto": 572, + "line": 587, + "lineto": 591, "args": [ { "name": "repo", @@ -16570,14 +16449,14 @@ "comment": " 0 on success, GIT_EUSER on non-zero callback, or error code" }, "description": "

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n", - "comments": "

This function acts like git_reference_foreach() with an additional\n pattern match being applied to the reference name before issuing the\n callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches\n any sequence of letters, a '?' matches any letter, and square brackets\n can be used to define character ranges (such as "[0-9]" for digits).

\n", + "comments": "

This function acts like git_reference_foreach() with an additional pattern match being applied to the reference name before issuing the callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches any sequence of letters, a '?' matches any letter, and square brackets can be used to define character ranges (such as "[0-9]" for digits).

\n", "group": "reference" }, "git_reference_has_log": { "type": "function", "file": "git2/refs.h", - "line": 582, - "lineto": 582, + "line": 601, + "lineto": 601, "args": [ { "name": "repo", @@ -16603,8 +16482,8 @@ "git_reference_ensure_log": { "type": "function", "file": "git2/refs.h", - "line": 594, - "lineto": 594, + "line": 613, + "lineto": 613, "args": [ { "name": "repo", @@ -16624,14 +16503,14 @@ "comment": " 0 or an error code." }, "description": "

Ensure there is a reflog for a particular reference.

\n", - "comments": "

Make sure that successive updates to the reference will append to\n its log.

\n", + "comments": "

Make sure that successive updates to the reference will append to its log.

\n", "group": "reference" }, "git_reference_is_branch": { "type": "function", "file": "git2/refs.h", - "line": 604, - "lineto": 604, + "line": 623, + "lineto": 623, "args": [ { "name": "ref", @@ -16652,8 +16531,8 @@ "git_reference_is_remote": { "type": "function", "file": "git2/refs.h", - "line": 614, - "lineto": 614, + "line": 633, + "lineto": 633, "args": [ { "name": "ref", @@ -16674,8 +16553,8 @@ "git_reference_is_tag": { "type": "function", "file": "git2/refs.h", - "line": 624, - "lineto": 624, + "line": 643, + "lineto": 643, "args": [ { "name": "ref", @@ -16696,8 +16575,8 @@ "git_reference_is_note": { "type": "function", "file": "git2/refs.h", - "line": 634, - "lineto": 634, + "line": 653, + "lineto": 653, "args": [ { "name": "ref", @@ -16718,8 +16597,8 @@ "git_reference_normalize_name": { "type": "function", "file": "git2/refs.h", - "line": 690, - "lineto": 694, + "line": 709, + "lineto": 713, "args": [ { "name": "buffer_out", @@ -16749,14 +16628,14 @@ "comment": " 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code." }, "description": "

Normalize reference name and check validity.

\n", - "comments": "

This will normalize the reference name by removing any leading slash\n '/' characters and collapsing runs of adjacent slashes between name\n components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in\n the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", + "comments": "

This will normalize the reference name by removing any leading slash '/' characters and collapsing runs of adjacent slashes between name components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference" }, "git_reference_peel": { "type": "function", "file": "git2/refs.h", - "line": 711, - "lineto": 714, + "line": 730, + "lineto": 733, "args": [ { "name": "out", @@ -16781,19 +16660,19 @@ "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" }, "description": "

Recursively peel reference until object of the specified type is found.

\n", - "comments": "

The retrieved peeled object is owned by the repository\n and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object\n will be peeled until a non-tag object is met.

\n", + "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_reference_peel-32" + "ex/HEAD/merge.html#git_reference_peel-30" ] } }, "git_reference_is_valid_name": { "type": "function", "file": "git2/refs.h", - "line": 730, - "lineto": 730, + "line": 749, + "lineto": 749, "args": [ { "name": "refname", @@ -16808,14 +16687,14 @@ "comment": " 1 if the reference name is acceptable; 0 if it isn't" }, "description": "

Ensure the reference name is well-formed.

\n", - "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores,\nand must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
  2. \n
  3. Names prefixed with "refs/" can be almost anything. You must avoid\nthe characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\nsequences ".." and "\n@\n{" which have special meaning to revparse.
  4. \n
\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", "group": "reference" }, "git_reference_shorthand": { "type": "function", "file": "git2/refs.h", - "line": 744, - "lineto": 744, + "line": 763, + "lineto": 763, "args": [ { "name": "ref", @@ -16830,11 +16709,11 @@ "comment": " the human-readable version of the name" }, "description": "

Get the reference's short name

\n", - "comments": "

This will transform the reference name into a name "human-readable"\n version. If no shortname is appropriate, it will return the full\n name.

\n\n

The memory is owned by the reference and must not be freed.

\n", + "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", "group": "reference", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_reference_shorthand-4" + "ex/HEAD/status.html#git_reference_shorthand-2" ] } }, @@ -17158,11 +17037,11 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_create-4" + "ex/HEAD/remote.html#git_remote_create-1" ] } }, - "git_remote_create_init_options": { + "git_remote_create_options_init": { "type": "function", "file": "git2/remote.h", "line": 97, @@ -17186,7 +17065,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_remote_create_options structure

\n", - "comments": "

Initializes a git_remote_create_options with default values. Equivalent to\n creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_remote_create_options with default values. Equivalent to creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", "group": "remote" }, "git_remote_create_with_opts": { @@ -17292,14 +17171,14 @@ "comment": " 0 or an error code" }, "description": "

Create an anonymous remote

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when\n you have a URL instead of a remote's name.

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", "group": "remote", "examples": { - "network/fetch.c": [ - "ex/v0.28.0/network/fetch.html#git_remote_create_anonymous-4" + "fetch.c": [ + "ex/HEAD/fetch.html#git_remote_create_anonymous-4" ], - "network/ls-remote.c": [ - "ex/v0.28.0/network/ls-remote.html#git_remote_create_anonymous-2" + "ls-remote.c": [ + "ex/HEAD/ls-remote.html#git_remote_create_anonymous-2" ] } }, @@ -17327,7 +17206,7 @@ "comment": " 0 or an error code" }, "description": "

Create a remote without a connected local repo

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when\n you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote\n will not consider any repo configuration values (such as insteadof url\n substitutions).

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote will not consider any repo configuration values (such as insteadof url substitutions).

\n", "group": "remote" }, "git_remote_lookup": { @@ -17359,17 +17238,17 @@ "comment": " 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code" }, "description": "

Get the information for a particular remote

\n", - "comments": "

The name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", + "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "remote", "examples": { - "network/fetch.c": [ - "ex/v0.28.0/network/fetch.html#git_remote_lookup-5" + "fetch.c": [ + "ex/HEAD/fetch.html#git_remote_lookup-5" ], - "network/ls-remote.c": [ - "ex/v0.28.0/network/ls-remote.html#git_remote_lookup-3" + "ls-remote.c": [ + "ex/HEAD/ls-remote.html#git_remote_lookup-3" ], "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_lookup-5" + "ex/HEAD/remote.html#git_remote_lookup-2" ] } }, @@ -17463,11 +17342,11 @@ "comment": " a pointer to the url" }, "description": "

Get the remote's url

\n", - "comments": "

If url.*.insteadOf has been configured for this URL, it will\n return the modified URL.

\n", + "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_url-6" + "ex/HEAD/remote.html#git_remote_url-3" ] } }, @@ -17490,11 +17369,11 @@ "comment": " a pointer to the url or NULL if no special url for pushing is set" }, "description": "

Get the remote's url for pushing

\n", - "comments": "

If url.*.pushInsteadOf has been configured for this URL, it\n will return the modified URL.

\n", + "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_pushurl-7" + "ex/HEAD/remote.html#git_remote_pushurl-4" ] } }, @@ -17527,11 +17406,11 @@ "comment": " 0 or an error value" }, "description": "

Set the remote's url in the configuration

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes\n the common case of a single-url remote and will otherwise return an error.

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_set_url-8" + "ex/HEAD/remote.html#git_remote_set_url-5" ] } }, @@ -17564,11 +17443,11 @@ "comment": null }, "description": "

Set the remote's url for pushing in the configuration.

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes\n the common case of a single-url remote and will otherwise return an error.

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_set_pushurl-9" + "ex/HEAD/remote.html#git_remote_set_pushurl-6" ] } }, @@ -17601,7 +17480,7 @@ "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" }, "description": "

Add a fetch refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the fetch list in the configuration. No\n loaded remote instances will be affected.

\n", + "comments": "

Add the given refspec to the fetch list in the configuration. No loaded remote instances will be affected.

\n", "group": "remote" }, "git_remote_get_fetch_refspecs": { @@ -17628,7 +17507,7 @@ "comment": null }, "description": "

Get the remote's list of fetch refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with\n git_strarray_free.

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", "group": "remote" }, "git_remote_add_push": { @@ -17660,7 +17539,7 @@ "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" }, "description": "

Add a push refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the push list in the configuration. No\n loaded remote instances will be affected.

\n", + "comments": "

Add the given refspec to the push list in the configuration. No loaded remote instances will be affected.

\n", "group": "remote" }, "git_remote_get_push_refspecs": { @@ -17687,7 +17566,7 @@ "comment": null }, "description": "

Get the remote's list of push refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with\n git_strarray_free.

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", "group": "remote" }, "git_remote_refspec_count": { @@ -17778,11 +17657,11 @@ "comment": " 0 or an error code" }, "description": "

Open a connection to a remote

\n", - "comments": "

The transport is selected based on the URL. The direction argument\n is due to a limitation of the git protocol (over TCP or SSH) which\n starts up a specific binary which can only do the one or the other.

\n", + "comments": "

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.

\n", "group": "remote", "examples": { - "network/ls-remote.c": [ - "ex/v0.28.0/network/ls-remote.html#git_remote_connect-4" + "ls-remote.c": [ + "ex/HEAD/ls-remote.html#git_remote_connect-4" ] } }, @@ -17815,11 +17694,11 @@ "comment": " 0 on success, or an error code" }, "description": "

Get the remote repository's reference advertisement list

\n", - "comments": "

Get the list of references with which the server responds to a new\n connection.

\n\n

The remote (or more exactly its transport) must have connected to\n the remote repository. This list is available as soon as the\n connection to the remote is initiated and it remains available\n after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long\n as a new connection is not initiated, but it is recommended that\n you make a copy in order to make use of the data.

\n", + "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", "group": "remote", "examples": { - "network/ls-remote.c": [ - "ex/v0.28.0/network/ls-remote.html#git_remote_ls-5" + "ls-remote.c": [ + "ex/HEAD/ls-remote.html#git_remote_ls-5" ] } }, @@ -17842,7 +17721,7 @@ "comment": " 1 if it's connected, 0 otherwise." }, "description": "

Check whether the remote is connected

\n", - "comments": "

Check whether the remote's underlying transport is connected to the\n remote host.

\n", + "comments": "

Check whether the remote's underlying transport is connected to the remote host.

\n", "group": "remote" }, "git_remote_stop": { @@ -17864,7 +17743,7 @@ "comment": null }, "description": "

Cancel the operation

\n", - "comments": "

At certain points in its operation, the network code checks whether\n the operation has been cancelled and if so stops the operation.

\n", + "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", "group": "remote" }, "git_remote_disconnect": { @@ -17908,18 +17787,18 @@ "comment": null }, "description": "

Free the memory associated with a remote

\n", - "comments": "

This also disconnects from the remote, if the connection\n has not been closed yet (using git_remote_disconnect).

\n", + "comments": "

This also disconnects from the remote, if the connection has not been closed yet (using git_remote_disconnect).

\n", "group": "remote", "examples": { - "network/fetch.c": [ - "ex/v0.28.0/network/fetch.html#git_remote_free-6", - "ex/v0.28.0/network/fetch.html#git_remote_free-7" + "fetch.c": [ + "ex/HEAD/fetch.html#git_remote_free-6", + "ex/HEAD/fetch.html#git_remote_free-7" ], - "network/ls-remote.c": [ - "ex/v0.28.0/network/ls-remote.html#git_remote_free-6" + "ls-remote.c": [ + "ex/HEAD/ls-remote.html#git_remote_free-6" ], "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_free-10" + "ex/HEAD/remote.html#git_remote_free-7" ] } }, @@ -17951,15 +17830,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_list-11" + "ex/HEAD/remote.html#git_remote_list-8" ] } }, "git_remote_init_callbacks": { "type": "function", "file": "git2/remote.h", - "line": 577, - "lineto": 579, + "line": 598, + "lineto": 600, "args": [ { "name": "opts", @@ -17982,11 +17861,11 @@ "comments": "", "group": "remote" }, - "git_fetch_init_options": { + "git_fetch_options_init": { "type": "function", "file": "git2/remote.h", - "line": 682, - "lineto": 684, + "line": 704, + "lineto": 706, "args": [ { "name": "opts", @@ -18006,14 +17885,14 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_fetch_options structure

\n", - "comments": "

Initializes a git_fetch_options with default values. Equivalent to\n creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_fetch_options with default values. Equivalent to creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", "group": "fetch" }, - "git_push_init_options": { + "git_push_options_init": { "type": "function", "file": "git2/remote.h", - "line": 732, - "lineto": 734, + "line": 754, + "lineto": 756, "args": [ { "name": "opts", @@ -18033,14 +17912,14 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_push_options structure

\n", - "comments": "

Initializes a git_push_options with default values. Equivalent to\n creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", "group": "push" }, "git_remote_download": { "type": "function", "file": "git2/remote.h", - "line": 752, - "lineto": 752, + "line": 774, + "lineto": 774, "args": [ { "name": "remote", @@ -18065,14 +17944,14 @@ "comment": " 0 or an error code" }, "description": "

Download and index the packfile

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with\n the remote git which objects are missing, download and index the\n packfile.

\n\n

The .idx file will be created and both it and the packfile with be\n renamed to their final name.

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, download and index the packfile.

\n\n

The .idx file will be created and both it and the packfile with be renamed to their final name.

\n", "group": "remote" }, "git_remote_upload": { "type": "function", "file": "git2/remote.h", - "line": 766, - "lineto": 766, + "line": 788, + "lineto": 788, "args": [ { "name": "remote", @@ -18097,14 +17976,14 @@ "comment": " 0 or an error code" }, "description": "

Create a packfile and send it to the server

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with\n the remote git which objects are missing, create a packfile with the missing objects and send it.

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, create a packfile with the missing objects and send it.

\n", "group": "remote" }, "git_remote_update_tips": { "type": "function", "file": "git2/remote.h", - "line": 782, - "lineto": 787, + "line": 804, + "lineto": 809, "args": [ { "name": "remote", @@ -18145,8 +18024,8 @@ "git_remote_fetch": { "type": "function", "file": "git2/remote.h", - "line": 803, - "lineto": 807, + "line": 825, + "lineto": 829, "args": [ { "name": "remote", @@ -18176,19 +18055,19 @@ "comment": " 0 or an error code" }, "description": "

Download new data and update tips

\n", - "comments": "

Convenience function to connect to a remote, download the data,\n disconnect and update the remote-tracking branches.

\n", + "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n", "group": "remote", "examples": { - "network/fetch.c": [ - "ex/v0.28.0/network/fetch.html#git_remote_fetch-8" + "fetch.c": [ + "ex/HEAD/fetch.html#git_remote_fetch-8" ] } }, "git_remote_prune": { "type": "function", "file": "git2/remote.h", - "line": 816, - "lineto": 816, + "line": 838, + "lineto": 838, "args": [ { "name": "remote", @@ -18214,8 +18093,8 @@ "git_remote_push": { "type": "function", "file": "git2/remote.h", - "line": 828, - "lineto": 830, + "line": 850, + "lineto": 852, "args": [ { "name": "remote", @@ -18246,8 +18125,8 @@ "git_remote_stats": { "type": "function", "file": "git2/remote.h", - "line": 835, - "lineto": 835, + "line": 857, + "lineto": 857, "args": [ { "name": "remote", @@ -18258,23 +18137,23 @@ "argline": "git_remote *remote", "sig": "git_remote *", "return": { - "type": "const git_transfer_progress *", + "type": "const git_indexer_progress *", "comment": null }, "description": "

Get the statistics structure that is filled in by the fetch operation.

\n", "comments": "", "group": "remote", "examples": { - "network/fetch.c": [ - "ex/v0.28.0/network/fetch.html#git_remote_stats-9" + "fetch.c": [ + "ex/HEAD/fetch.html#git_remote_stats-9" ] } }, "git_remote_autotag": { "type": "function", "file": "git2/remote.h", - "line": 843, - "lineto": 843, + "line": 865, + "lineto": 865, "args": [ { "name": "remote", @@ -18295,8 +18174,8 @@ "git_remote_set_autotag": { "type": "function", "file": "git2/remote.h", - "line": 855, - "lineto": 855, + "line": 877, + "lineto": 877, "args": [ { "name": "repo", @@ -18321,14 +18200,14 @@ "comment": null }, "description": "

Set the remote's tag following setting.

\n", - "comments": "

The change will be made in the configuration. No loaded remotes\n will be affected.

\n", + "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", "group": "remote" }, "git_remote_prune_refs": { "type": "function", "file": "git2/remote.h", - "line": 862, - "lineto": 862, + "line": 884, + "lineto": 884, "args": [ { "name": "remote", @@ -18349,8 +18228,8 @@ "git_remote_rename": { "type": "function", "file": "git2/remote.h", - "line": 884, - "lineto": 888, + "line": 906, + "lineto": 910, "args": [ { "name": "problems", @@ -18380,19 +18259,19 @@ "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" }, "description": "

Give the remote a new name

\n", - "comments": "

All remote-tracking branches and configuration settings\n for the remote are updated.

\n\n

The new name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change\n their name or their list of refspecs.

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_rename-12" + "ex/HEAD/remote.html#git_remote_rename-9" ] } }, "git_remote_is_valid_name": { "type": "function", "file": "git2/remote.h", - "line": 896, - "lineto": 896, + "line": 918, + "lineto": 918, "args": [ { "name": "remote_name", @@ -18413,8 +18292,8 @@ "git_remote_delete": { "type": "function", "file": "git2/remote.h", - "line": 908, - "lineto": 908, + "line": 930, + "lineto": 930, "args": [ { "name": "repo", @@ -18434,19 +18313,19 @@ "comment": " 0 on success, or an error code." }, "description": "

Delete an existing persisted remote.

\n", - "comments": "

All remote-tracking branches and configuration settings\n for the remote will be removed.

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/v0.28.0/remote.html#git_remote_delete-13" + "ex/HEAD/remote.html#git_remote_delete-10" ] } }, "git_remote_default_branch": { "type": "function", "file": "git2/remote.h", - "line": 926, - "lineto": 926, + "line": 948, + "lineto": 948, "args": [ { "name": "out", @@ -18466,7 +18345,7 @@ "comment": " 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message." }, "description": "

Retrieve the name of the remote's default branch

\n", - "comments": "

The default branch of a repository is the branch which HEAD points\n to. If the remote does not support reporting this information\n directly, it performs the guess as git does; that is, if there are\n multiple branches which point to the same commit, the first one is\n chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", + "comments": "

The default branch of a repository is the branch which HEAD points to. If the remote does not support reporting this information directly, it performs the guess as git does; that is, if there are multiple branches which point to the same commit, the first one is chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", "group": "remote" }, "git_repository_open": { @@ -18493,14 +18372,11 @@ "comment": " 0 or an error code" }, "description": "

Open a git repository.

\n", - "comments": "

The 'path' argument must point to either a git repository\n folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal\n or bare repository or fail is 'path' is neither.

\n", + "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n", "group": "repository", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_repository_open-68" - ], - "remote.c": [ - "ex/v0.28.0/remote.html#git_repository_open-14" + "ex/HEAD/general.html#git_repository_open-68" ] } }, @@ -18528,7 +18404,7 @@ "comment": " 0 or an error code" }, "description": "

Open working tree as a repository

\n", - "comments": "

Open the working directory of the working tree as a normal\n repository that can then be worked on.

\n", + "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", "group": "repository" }, "git_repository_wrap_odb": { @@ -18555,7 +18431,7 @@ "comment": " 0 or an error code" }, "description": "

Create a "fake" repository to wrap an object database

\n", - "comments": "

Create a repository object to wrap an object database to be used\n with the API when all you have is an object database. This doesn't\n have any paths associated with it, so use with care.

\n", + "comments": "

Create a repository object to wrap an object database to be used with the API when all you have is an object database. This doesn't have any paths associated with it, so use with care.

\n", "group": "repository" }, "git_repository_discover": { @@ -18592,13 +18468,8 @@ "comment": " 0 or an error code" }, "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", - "comments": "

The method will automatically detect if the repository is bare\n (if there is a repository).

\n", - "group": "repository", - "examples": { - "remote.c": [ - "ex/v0.28.0/remote.html#git_repository_discover-15" - ] - } + "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n", + "group": "repository" }, "git_repository_open_ext": { "type": "function", @@ -18637,39 +18508,8 @@ "comments": "", "group": "repository", "examples": { - "blame.c": [ - "ex/v0.28.0/blame.html#git_repository_open_ext-24" - ], - "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_repository_open_ext-31" - ], - "checkout.c": [ - "ex/v0.28.0/checkout.html#git_repository_open_ext-14" - ], - "describe.c": [ - "ex/v0.28.0/describe.html#git_repository_open_ext-8" - ], - "diff.c": [ - "ex/v0.28.0/diff.html#git_repository_open_ext-15" - ], "log.c": [ - "ex/v0.28.0/log.html#git_repository_open_ext-45", - "ex/v0.28.0/log.html#git_repository_open_ext-46" - ], - "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_repository_open_ext-7" - ], - "merge.c": [ - "ex/v0.28.0/merge.html#git_repository_open_ext-33" - ], - "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_repository_open_ext-16" - ], - "status.c": [ - "ex/v0.28.0/status.html#git_repository_open_ext-5" - ], - "tag.c": [ - "ex/v0.28.0/tag.html#git_repository_open_ext-11" + "ex/HEAD/log.html#git_repository_open_ext-43" ] } }, @@ -18697,7 +18537,7 @@ "comment": " 0 on success, or an error code" }, "description": "

Open a bare repository on the serverside.

\n", - "comments": "

This is a fast open for bare repositories that will come in handy\n if you're e.g. hosting git repositories and need to access them\n efficiently

\n", + "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n", "group": "repository" }, "git_repository_free": { @@ -18719,47 +18559,14 @@ "comment": null }, "description": "

Free a previously allocated repository

\n", - "comments": "

Note that after a repository is free'd, all the objects it has spawned\n will still exist until they are manually closed by the user\n with git_object_free, but accessing any of the attributes of\n an object without a backing repository will result in undefined\n behavior

\n", + "comments": "

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_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", "group": "repository", "examples": { - "blame.c": [ - "ex/v0.28.0/blame.html#git_repository_free-25" - ], - "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_repository_free-32" - ], - "checkout.c": [ - "ex/v0.28.0/checkout.html#git_repository_free-15" - ], - "describe.c": [ - "ex/v0.28.0/describe.html#git_repository_free-9" - ], - "diff.c": [ - "ex/v0.28.0/diff.html#git_repository_free-16" - ], "general.c": [ - "ex/v0.28.0/general.html#git_repository_free-69" + "ex/HEAD/general.html#git_repository_free-69" ], "init.c": [ - "ex/v0.28.0/init.html#git_repository_free-6" - ], - "log.c": [ - "ex/v0.28.0/log.html#git_repository_free-47" - ], - "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_repository_free-8" - ], - "merge.c": [ - "ex/v0.28.0/merge.html#git_repository_free-34" - ], - "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_repository_free-17" - ], - "status.c": [ - "ex/v0.28.0/status.html#git_repository_free-6" - ], - "tag.c": [ - "ex/v0.28.0/tag.html#git_repository_free-12" + "ex/HEAD/init.html#git_repository_free-4" ] } }, @@ -18792,15 +18599,15 @@ "comment": " 0 or an error code" }, "description": "

Creates a new Git repository in the given folder.

\n", - "comments": "

TODO:\n - Reinit the repository

\n", + "comments": "

TODO: - Reinit the repository

\n", "group": "repository", "examples": { "init.c": [ - "ex/v0.28.0/init.html#git_repository_init-7" + "ex/HEAD/init.html#git_repository_init-5" ] } }, - "git_repository_init_init_options": { + "git_repository_init_options_init": { "type": "function", "file": "git2/repository.h", "line": 326, @@ -18824,7 +18631,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_repository_init_options structure

\n", - "comments": "

Initializes a git_repository_init_options with default values. Equivalent to\n creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_repository_init_options with default values. Equivalent to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", "group": "repository" }, "git_repository_init_ext": { @@ -18856,11 +18663,11 @@ "comment": " 0 or an error code on failure." }, "description": "

Create a new Git repository in the given folder with extended controls.

\n", - "comments": "

This will initialize a new git repository (creating the repo_path\n if requested by flags) and working directory as needed. It will\n auto-detect the case sensitivity of the file system and if the\n file system supports file mode bits correctly.

\n", + "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n", "group": "repository", "examples": { "init.c": [ - "ex/v0.28.0/init.html#git_repository_init_ext-8" + "ex/HEAD/init.html#git_repository_init_ext-6" ] } }, @@ -18888,15 +18695,15 @@ "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise" }, "description": "

Retrieve and resolve the reference pointed at by HEAD.

\n", - "comments": "

The returned git_reference will be owned by caller and\n git_reference_free() must be called when done with it to release the\n allocated memory and prevent a leak.

\n", + "comments": "

The returned git_reference will be owned by caller and git_reference_free() must be called when done with it to release the allocated memory and prevent a leak.

\n", "group": "repository", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_repository_head-35", - "ex/v0.28.0/merge.html#git_repository_head-36" + "ex/HEAD/merge.html#git_repository_head-31", + "ex/HEAD/merge.html#git_repository_head-32" ], "status.c": [ - "ex/v0.28.0/status.html#git_repository_head-7" + "ex/HEAD/status.html#git_repository_head-3" ] } }, @@ -18951,7 +18758,7 @@ "comment": " 1 if HEAD is detached, 0 if it's not; error code if there\n was an error." }, "description": "

Check if a repository's HEAD is detached

\n", - "comments": "

A repository's HEAD is detached when it points directly to a commit\n instead of a branch.

\n", + "comments": "

A repository's HEAD is detached when it points directly to a commit instead of a branch.

\n", "group": "repository" }, "git_repository_head_detached_for_worktree": { @@ -18978,7 +18785,7 @@ "comment": " 1 if HEAD is detached, 0 if its not; error code if\n there was an error" }, "description": "

Check if a worktree's HEAD is detached

\n", - "comments": "

A worktree's HEAD is detached when it points directly to a\n commit instead of a branch.

\n", + "comments": "

A worktree's HEAD is detached when it points directly to a commit instead of a branch.

\n", "group": "repository" }, "git_repository_head_unborn": { @@ -19000,7 +18807,7 @@ "comment": " 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error" }, "description": "

Check if the current branch is unborn

\n", - "comments": "

An unborn branch is one named from HEAD but which doesn't exist in\n the refs namespace, because it doesn't have any commit to point to.

\n", + "comments": "

An unborn 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.

\n", "group": "repository" }, "git_repository_is_empty": { @@ -19022,7 +18829,7 @@ "comment": " 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted" }, "description": "

Check if a repository is empty

\n", - "comments": "

An empty repository has just been initialized and contains no references\n apart from HEAD, which must be pointing to the unborn master branch.

\n", + "comments": "

An empty repository has just been initialized and contains no references apart from HEAD, which must be pointing to the unborn master branch.

\n", "group": "repository" }, "git_repository_item_path": { @@ -19054,7 +18861,7 @@ "comment": " 0, GIT_ENOTFOUND if the path cannot exist or an error code" }, "description": "

Get the location of a specific repository file or directory

\n", - "comments": "

This function will retrieve the path of a specific repository\n item. It will thereby honor things like the repository's\n common directory, gitdir, etc. In case a file path cannot\n exist for a given item (e.g. the working directory of a bare\n repository), GIT_ENOTFOUND is returned.

\n", + "comments": "

This function will retrieve the path of a specific repository item. It will thereby honor things like the repository's common directory, gitdir, etc. In case a file path cannot exist for a given item (e.g. the working directory of a bare repository), GIT_ENOTFOUND is returned.

\n", "group": "repository" }, "git_repository_path": { @@ -19076,14 +18883,14 @@ "comment": " the path to the repository" }, "description": "

Get the path of this repository

\n", - "comments": "

This is the path of the .git folder for normal repositories,\n or of the repository itself for bare repositories.

\n", + "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", "group": "repository", "examples": { "init.c": [ - "ex/v0.28.0/init.html#git_repository_path-9" + "ex/HEAD/init.html#git_repository_path-7" ], "status.c": [ - "ex/v0.28.0/status.html#git_repository_path-8" + "ex/HEAD/status.html#git_repository_path-4" ] } }, @@ -19106,11 +18913,11 @@ "comment": " the path to the working dir, if it exists" }, "description": "

Get the path of the working directory for this repository

\n", - "comments": "

If the repository is bare, this function will always return\n NULL.

\n", + "comments": "

If the repository is bare, this function will always return NULL.

\n", "group": "repository", "examples": { "init.c": [ - "ex/v0.28.0/init.html#git_repository_workdir-10" + "ex/HEAD/init.html#git_repository_workdir-8" ] } }, @@ -19133,7 +18940,7 @@ "comment": " the path to the common dir" }, "description": "

Get the path of the shared common directory for this repository

\n", - "comments": "

If the repository is bare is not a worktree, the git directory\n path is returned.

\n", + "comments": "

If the repository is bare is not a worktree, the git directory path is returned.

\n", "group": "repository" }, "git_repository_set_workdir": { @@ -19165,7 +18972,7 @@ "comment": " 0, or an error code" }, "description": "

Set the path to the working directory for this repository

\n", - "comments": "

The working directory doesn't need to be the same one\n that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory\n will turn it into a normal repository, capable of performing\n all the common workdir operations (checkout, status, index\n manipulation, etc).

\n", + "comments": "

The working directory doesn't need to be the same one that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory will turn it into a normal repository, capable of performing all the common workdir operations (checkout, status, index manipulation, etc).

\n", "group": "repository" }, "git_repository_is_bare": { @@ -19191,7 +18998,7 @@ "group": "repository", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_repository_is_bare-9" + "ex/HEAD/status.html#git_repository_is_bare-5" ] } }, @@ -19241,7 +19048,7 @@ "comment": " 0, or an error code" }, "description": "

Get the configuration file for this repository.

\n", - "comments": "

If a configuration file has not been set, the default\n config set for the repository will be returned, including\n global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer\n being used by the user.

\n", + "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", "group": "repository" }, "git_repository_config_snapshot": { @@ -19268,12 +19075,12 @@ "comment": " 0, or an error code" }, "description": "

Get a snapshot of the repository's configuration

\n", - "comments": "

Convenience function to take a snapshot from the repository's\n configuration. The contents of this snapshot will not change,\n even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer\n being used by the user.

\n", + "comments": "

Convenience function to take a snapshot from the repository's configuration. The contents of this snapshot will not change, even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", "group": "repository", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_repository_config_snapshot-70", - "ex/v0.28.0/general.html#git_repository_config_snapshot-71" + "ex/HEAD/general.html#git_repository_config_snapshot-70", + "ex/HEAD/general.html#git_repository_config_snapshot-71" ] } }, @@ -19301,14 +19108,14 @@ "comment": " 0, or an error code" }, "description": "

Get the Object Database for this repository.

\n", - "comments": "

If a custom ODB has not been set, the default\n database for the repository will be returned (the one\n located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by\n the user.

\n", + "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", "group": "repository", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_repository_odb-33" + "ex/HEAD/cat-file.html#git_repository_odb-29" ], "general.c": [ - "ex/v0.28.0/general.html#git_repository_odb-72" + "ex/HEAD/general.html#git_repository_odb-72" ] } }, @@ -19336,7 +19143,7 @@ "comment": " 0, or an error code" }, "description": "

Get the Reference Database Backend for this repository.

\n", - "comments": "

If a custom refsdb has not been set, the default database for\n the repository will be returned (the one that manipulates loose\n and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by\n the user.

\n", + "comments": "

If a custom refsdb has not been set, the default database for the repository will be returned (the one that manipulates loose and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by the user.

\n", "group": "repository" }, "git_repository_index": { @@ -19363,20 +19170,23 @@ "comment": " 0, or an error code" }, "description": "

Get the Index file for this repository.

\n", - "comments": "

If a custom index has not been set, the default\n index for the repository will be returned (the one\n located in .git/index).

\n\n

The index must be freed once it's no longer being used by\n the user.

\n", + "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", "group": "repository", "examples": { + "add.c": [ + "ex/HEAD/add.html#git_repository_index-5" + ], "general.c": [ - "ex/v0.28.0/general.html#git_repository_index-73" + "ex/HEAD/general.html#git_repository_index-73" ], "init.c": [ - "ex/v0.28.0/init.html#git_repository_index-11" + "ex/HEAD/init.html#git_repository_index-9" ], "ls-files.c": [ - "ex/v0.28.0/ls-files.html#git_repository_index-9" + "ex/HEAD/ls-files.html#git_repository_index-5" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_repository_index-37" + "ex/HEAD/merge.html#git_repository_index-33" ] } }, @@ -19404,7 +19214,7 @@ "comment": " 0, GIT_ENOTFOUND if no message exists or an error code" }, "description": "

Retrieve git's prepared message

\n", - "comments": "

Operations such as git revert/cherry-pick/merge with the -n option\n stop just short of creating a commit with the changes and save\n their prepared message in .git/MERGE_MSG so the next git-commit\n execution can present it to the user for them to amend if they\n wish.

\n\n

Use this function to get the contents of this file. Don't forget to\n remove the file after you create the commit.

\n", + "comments": "

Operations such as git revert/cherry-pick/merge with the -n option stop just short of creating a commit with the changes and save their prepared message in .git/MERGE_MSG so the next git-commit execution can present it to the user for them to amend if they wish.

\n\n

Use this function to get the contents of this file. Don't forget to remove the file after you create the commit.

\n", "group": "repository" }, "git_repository_message_remove": { @@ -19452,15 +19262,15 @@ "group": "repository", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_repository_state_cleanup-38" + "ex/HEAD/merge.html#git_repository_state_cleanup-34" ] } }, "git_repository_fetchhead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 660, - "lineto": 663, + "line": 672, + "lineto": 675, "args": [ { "name": "repo", @@ -19491,8 +19301,8 @@ "git_repository_mergehead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 680, - "lineto": 683, + "line": 701, + "lineto": 704, "args": [ { "name": "repo", @@ -19523,8 +19333,8 @@ "git_repository_hashfile": { "type": "function", "file": "git2/repository.h", - "line": 708, - "lineto": 713, + "line": 729, + "lineto": 734, "args": [ { "name": "out", @@ -19559,14 +19369,14 @@ "comment": " 0 on success, or an error code" }, "description": "

Calculate hash of file using repository filtering rules.

\n", - "comments": "

If you simply want to calculate the hash of a file on disk with no filters,\n you can just use the git_odb_hashfile() API. However, if you want to\n hash a file in the repository and you want to apply filtering rules (e.g.\n crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the\n filtering triggers that failure, then this function will return an\n error and not calculate the hash of the file.

\n", + "comments": "

If you simply want to calculate the hash of a file on disk with no filters, you can just use the git_odb_hashfile() API. However, if you want to hash a file in the repository and you want to apply filtering rules (e.g. crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the filtering triggers that failure, then this function will return an error and not calculate the hash of the file.

\n", "group": "repository" }, "git_repository_set_head": { "type": "function", "file": "git2/repository.h", - "line": 733, - "lineto": 735, + "line": 754, + "lineto": 756, "args": [ { "name": "repo", @@ -19586,19 +19396,19 @@ "comment": " 0 on success, or an error code" }, "description": "

Make the repository HEAD point to the specified reference.

\n", - "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is\n unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point\n to that branch, staying attached, or become attached if it isn't yet.\n If the branch doesn't exist yet, no error will be return. The HEAD\n will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to\n the Commit.

\n", + "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", "group": "repository", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_repository_set_head-16" + "ex/HEAD/checkout.html#git_repository_set_head-12" ] } }, "git_repository_set_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 753, - "lineto": 755, + "line": 774, + "lineto": 776, "args": [ { "name": "repo", @@ -19618,14 +19428,14 @@ "comment": " 0 on success, or an error code" }, "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

If the provided committish cannot be found in the repository, the HEAD\n is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided commitish cannot be peeled into a commit, the HEAD\n is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to\n the peeled Commit.

\n", + "comments": "

If the provided committish cannot be found in the repository, the HEAD is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided commitish cannot be peeled into a commit, the HEAD is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to the peeled Commit.

\n", "group": "repository" }, "git_repository_set_head_detached_from_annotated": { "type": "function", "file": "git2/repository.h", - "line": 769, - "lineto": 771, + "line": 790, + "lineto": 792, "args": [ { "name": "repo", @@ -19645,19 +19455,19 @@ "comment": null }, "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

This behaves like git_repository_set_head_detached() but takes an\n annotated commit, which lets you specify which extended sha syntax\n string was specified by a user, allowing for more exact reflog\n messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", + "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", "group": "repository", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_repository_set_head_detached_from_annotated-17" + "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-13" ] } }, "git_repository_detach_head": { "type": "function", "file": "git2/repository.h", - "line": 790, - "lineto": 791, + "line": 811, + "lineto": 812, "args": [ { "name": "repo", @@ -19672,14 +19482,14 @@ "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code" }, "description": "

Detach the HEAD.

\n", - "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is\n updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non commitish, the HEAD is\n unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", + "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non commitish, the HEAD is unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", "group": "repository" }, "git_repository_state": { "type": "function", "file": "git2/repository.h", - "line": 821, - "lineto": 821, + "line": 842, + "lineto": 842, "args": [ { "name": "repo", @@ -19698,18 +19508,18 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/v0.28.0/checkout.html#git_repository_state-18" + "ex/HEAD/checkout.html#git_repository_state-14" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_repository_state-39" + "ex/HEAD/merge.html#git_repository_state-35" ] } }, "git_repository_set_namespace": { "type": "function", "file": "git2/repository.h", - "line": 835, - "lineto": 835, + "line": 856, + "lineto": 856, "args": [ { "name": "repo", @@ -19729,14 +19539,14 @@ "comment": " 0 on success, -1 on error" }, "description": "

Sets the active namespace for this Git Repository

\n", - "comments": "

This namespace affects all reference operations for the repo.\n See man gitnamespaces

\n", + "comments": "

This namespace affects all reference operations for the repo. See man gitnamespaces

\n", "group": "repository" }, "git_repository_get_namespace": { "type": "function", "file": "git2/repository.h", - "line": 843, - "lineto": 843, + "line": 864, + "lineto": 864, "args": [ { "name": "repo", @@ -19757,8 +19567,8 @@ "git_repository_is_shallow": { "type": "function", "file": "git2/repository.h", - "line": 852, - "lineto": 852, + "line": 873, + "lineto": 873, "args": [ { "name": "repo", @@ -19779,8 +19589,8 @@ "git_repository_ident": { "type": "function", "file": "git2/repository.h", - "line": 864, - "lineto": 864, + "line": 885, + "lineto": 885, "args": [ { "name": "name", @@ -19805,14 +19615,14 @@ "comment": null }, "description": "

Retrieve the configured identity to use for reflogs

\n", - "comments": "

The memory is owned by the repository and must not be freed by the\n user.

\n", + "comments": "

The memory is owned by the repository and must not be freed by the user.

\n", "group": "repository" }, "git_repository_set_ident": { "type": "function", "file": "git2/repository.h", - "line": 877, - "lineto": 877, + "line": 898, + "lineto": 898, "args": [ { "name": "repo", @@ -19837,7 +19647,7 @@ "comment": null }, "description": "

Set the identity to be used for writing reflogs

\n", - "comments": "

If both are set, this name and email will be used to write to the\n reflog. Pass NULL to unset. When unset, the identity will be taken\n from the repository's configuration.

\n", + "comments": "

If both are set, this name and email will be used to write to the reflog. Pass NULL to unset. When unset, the identity will be taken from the repository's configuration.

\n", "group": "repository" }, "git_reset": { @@ -19874,7 +19684,7 @@ "comment": " 0 on success or an error code" }, "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced\n with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be\n replaced with the content of the index. (Untracked and ignored files\n will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", + "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be replaced with the content of the index. (Untracked and ignored files will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", "group": "reset" }, "git_reset_from_annotated": { @@ -19911,7 +19721,7 @@ "comment": null }, "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

This behaves like git_reset() but takes an annotated commit,\n which lets you specify which extended sha syntax string was\n specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", + "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", "group": "reset" }, "git_reset_default": { @@ -19943,10 +19753,10 @@ "comment": " 0 on success or an error code \n<\n 0" }, "description": "

Updates some entries in the index from the target commit tree.

\n", - "comments": "

The scope of the updated entries is determined by the paths\n being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing\n entries in the index matching the provided pathspecs.

\n", + "comments": "

The scope of the updated entries is determined by the paths being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing entries in the index matching the provided pathspecs.

\n", "group": "reset" }, - "git_revert_init_options": { + "git_revert_options_init": { "type": "function", "file": "git2/revert.h", "line": 49, @@ -19970,7 +19780,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_revert_options structure

\n", - "comments": "

Initializes a git_revert_options with default values. Equivalent to\n creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_revert_options with default values. Equivalent to creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", "group": "revert" }, "git_revert_commit": { @@ -20081,26 +19891,26 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code" }, "description": "

Find a single object, as specified by a revision string.

\n", - "comments": "

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no\n longer needed.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", "group": "revparse", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_revparse_single-26" + "ex/HEAD/blame.html#git_revparse_single-22" ], "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_revparse_single-34" + "ex/HEAD/cat-file.html#git_revparse_single-30" ], "describe.c": [ - "ex/v0.28.0/describe.html#git_revparse_single-10" + "ex/HEAD/describe.html#git_revparse_single-6" ], "log.c": [ - "ex/v0.28.0/log.html#git_revparse_single-48" + "ex/HEAD/log.html#git_revparse_single-44" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_revparse_single-13", - "ex/v0.28.0/tag.html#git_revparse_single-14", - "ex/v0.28.0/tag.html#git_revparse_single-15", - "ex/v0.28.0/tag.html#git_revparse_single-16" + "ex/HEAD/tag.html#git_revparse_single-9", + "ex/HEAD/tag.html#git_revparse_single-10", + "ex/HEAD/tag.html#git_revparse_single-11", + "ex/HEAD/tag.html#git_revparse_single-12" ] } }, @@ -20138,7 +19948,7 @@ "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code" }, "description": "

Find a single object and intermediate reference by a revision string.

\n", - "comments": "

See man gitrevisions, or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n\n

In some cases (\n@\n{\n<\n-n>} or `\n<branchname

\n\n
\n

@\n{upstream}), the expression may\n point to an intermediate reference. When such expressions are being passed\n in,reference_out` will be valued as well.

\n
\n\n

The returned object should be released with git_object_free and the\n returned reference with git_reference_free when no longer needed.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", "group": "revparse" }, "git_revparse": { @@ -20170,18 +19980,18 @@ "comment": " 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code" }, "description": "

Parse a revision string for from, to, and intent.

\n", - "comments": "

See man gitrevisions or\n http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for\n information on the syntax accepted.

\n", + "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", "group": "revparse", "examples": { "blame.c": [ - "ex/v0.28.0/blame.html#git_revparse-27" + "ex/HEAD/blame.html#git_revparse-23" ], "log.c": [ - "ex/v0.28.0/log.html#git_revparse-49" + "ex/HEAD/log.html#git_revparse-45" ], "rev-parse.c": [ - "ex/v0.28.0/rev-parse.html#git_revparse-18", - "ex/v0.28.0/rev-parse.html#git_revparse-19" + "ex/HEAD/rev-parse.html#git_revparse-14", + "ex/HEAD/rev-parse.html#git_revparse-15" ] } }, @@ -20209,15 +20019,15 @@ "comment": " 0 or an error code" }, "description": "

Allocate a new revision walker to iterate through a repo.

\n", - "comments": "

This revision walker uses a custom memory pool and an internal\n commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be\n reused for different walks.

\n\n

This revision walker is not thread safe: it may only be\n used to walk a repository on a single thread; however,\n it is possible to have several revision walkers in\n several different threads walking the same repository.

\n", + "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

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.

\n", "group": "revwalk", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_revwalk_new-74" + "ex/HEAD/general.html#git_revwalk_new-74" ], "log.c": [ - "ex/v0.28.0/log.html#git_revwalk_new-50", - "ex/v0.28.0/log.html#git_revwalk_new-51" + "ex/HEAD/log.html#git_revwalk_new-46", + "ex/HEAD/log.html#git_revwalk_new-47" ] } }, @@ -20240,7 +20050,7 @@ "comment": null }, "description": "

Reset the revision walker for reuse.

\n", - "comments": "

This will clear all the pushed and hidden commits, and\n leave the walker in a blank state (just like at\n creation) ready to receive new commit pushes and\n start a new walk.

\n\n

The revision walk is automatically reset when a walk\n is over.

\n", + "comments": "

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.

\n\n

The revision walk is automatically reset when a walk is over.

\n", "group": "revwalk" }, "git_revwalk_push": { @@ -20267,14 +20077,14 @@ "comment": " 0 or an error code" }, "description": "

Add a new root for the traversal

\n", - "comments": "

The pushed commit will be marked as one of the roots from which to\n start the walk. This commit may not be walked if it or a child is\n hidden.

\n\n

At least one commit must be pushed onto the walker before a walk\n can be started.

\n\n

The given id must belong to a committish on the walked\n repository.

\n", + "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", "group": "revwalk", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_revwalk_push-75" + "ex/HEAD/general.html#git_revwalk_push-75" ], "log.c": [ - "ex/v0.28.0/log.html#git_revwalk_push-52" + "ex/HEAD/log.html#git_revwalk_push-48" ] } }, @@ -20302,7 +20112,7 @@ "comment": " 0 or an error code" }, "description": "

Push matching references

\n", - "comments": "

The OIDs pointed to by the references that match the given glob\n pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing\n '/\n\\\n*' if the glob lacks '?', '\n\\\n*' or '['.

\n\n

Any references matching this glob which do not point to a\n committish will be ignored.

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", "group": "revwalk" }, "git_revwalk_push_head": { @@ -20328,7 +20138,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_revwalk_push_head-53" + "ex/HEAD/log.html#git_revwalk_push_head-49" ] } }, @@ -20356,11 +20166,11 @@ "comment": " 0 or an error code" }, "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", - "comments": "

The given id must belong to a committish on the walked\n repository.

\n\n

The resolved commit and all its parents will be hidden from the\n output on the revision walk.

\n", + "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", "group": "revwalk", "examples": { "log.c": [ - "ex/v0.28.0/log.html#git_revwalk_hide-54" + "ex/HEAD/log.html#git_revwalk_hide-50" ] } }, @@ -20388,7 +20198,7 @@ "comment": " 0 or an error code" }, "description": "

Hide matching references.

\n", - "comments": "

The OIDs pointed to by the references that match the given glob\n pattern and their ancestors will be hidden from the output on the\n revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing\n '/\n\\\n*' if the glob lacks '?', '\n\\\n*' or '['.

\n\n

Any references matching this glob which do not point to a\n committish will be ignored.

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern and their ancestors will be hidden from the output on the revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", "group": "revwalk" }, "git_revwalk_hide_head": { @@ -20491,14 +20301,14 @@ "comment": " 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate" }, "description": "

Get the next commit from the revision walk.

\n", - "comments": "

The initial call to this method is not blocking when\n iterating through a repo with a time-sorting mode.

\n\n

Iterating with Topological or inverted modes makes the initial\n call blocking to preprocess the commit list, but this block should be\n mostly unnoticeable on most repositories (topological preprocessing\n times at 0.3s on the git.git repo).

\n\n

The revision walker is reset when the walk is over.

\n", + "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

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).

\n\n

The revision walker is reset when the walk is over.

\n", "group": "revwalk", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_revwalk_next-76" + "ex/HEAD/general.html#git_revwalk_next-76" ], "log.c": [ - "ex/v0.28.0/log.html#git_revwalk_next-55" + "ex/HEAD/log.html#git_revwalk_next-51" ] } }, @@ -20530,11 +20340,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_revwalk_sorting-77" + "ex/HEAD/general.html#git_revwalk_sorting-77" ], "log.c": [ - "ex/v0.28.0/log.html#git_revwalk_sorting-56", - "ex/v0.28.0/log.html#git_revwalk_sorting-57" + "ex/HEAD/log.html#git_revwalk_sorting-52", + "ex/HEAD/log.html#git_revwalk_sorting-53" ] } }, @@ -20562,7 +20372,7 @@ "comment": " 0 or an error code" }, "description": "

Push and hide the respective endpoints of the given range.

\n", - "comments": "

The range should be of the form

\n\n

<commit

\n\n
\n

..\n<commit

\n\n

where each \n<commit\nis in the form accepted by 'git_revparse_single'.\n The left-hand commit will be hidden and the right-hand commit pushed.

\n
\n", + "comments": "

The range should be of the form .. where each is in the form accepted by 'git_revparse_single'. The left-hand commit will be hidden and the right-hand commit pushed.

\n", "group": "revwalk" }, "git_revwalk_simplify_first_parent": { @@ -20610,10 +20420,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_revwalk_free-78" + "ex/HEAD/general.html#git_revwalk_free-78" ], "log.c": [ - "ex/v0.28.0/log.html#git_revwalk_free-58" + "ex/HEAD/log.html#git_revwalk_free-54" ] } }, @@ -20710,12 +20520,12 @@ "comment": " 0 or an error code" }, "description": "

Create a new action signature.

\n", - "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('\n<\n' and '>') characters are not allowed\n to be used in either the name or the email parameter.

\n", + "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('<' and '>') characters are not allowed to be used in either the name or the email parameter.

\n", "group": "signature", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_signature_new-79", - "ex/v0.28.0/general.html#git_signature_new-80" + "ex/HEAD/general.html#git_signature_new-79", + "ex/HEAD/general.html#git_signature_new-80" ] } }, @@ -20752,7 +20562,7 @@ "group": "signature", "examples": { "merge.c": [ - "ex/v0.28.0/merge.html#git_signature_now-40" + "ex/HEAD/merge.html#git_signature_now-36" ] } }, @@ -20780,14 +20590,14 @@ "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" }, "description": "

Create a new action signature with default user and now timestamp.

\n", - "comments": "

This looks up the user.name and user.email from the configuration and\n uses the current time as the timestamp, and creates a new signature\n based on that information. It will return GIT_ENOTFOUND if either the\n user.name or user.email are not set.

\n", + "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", "group": "signature", "examples": { "init.c": [ - "ex/v0.28.0/init.html#git_signature_default-12" + "ex/HEAD/init.html#git_signature_default-10" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_signature_default-17" + "ex/HEAD/tag.html#git_signature_default-13" ] } }, @@ -20864,18 +20674,18 @@ "comment": null }, "description": "

Free an existing signature.

\n", - "comments": "

Because the signature is not an opaque structure, it is legal to free it\n manually, but be sure to free the "name" and "email" strings in addition\n to the structure itself.

\n", + "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", "group": "signature", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_signature_free-81", - "ex/v0.28.0/general.html#git_signature_free-82" + "ex/HEAD/general.html#git_signature_free-81", + "ex/HEAD/general.html#git_signature_free-82" ], "init.c": [ - "ex/v0.28.0/init.html#git_signature_free-13" + "ex/HEAD/init.html#git_signature_free-11" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_signature_free-18" + "ex/HEAD/tag.html#git_signature_free-14" ] } }, @@ -20888,40 +20698,40 @@ { "name": "out", "type": "git_oid *", - "comment": null + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." }, { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "The owning repository." }, { "name": "stasher", "type": "const git_signature *", - "comment": null + "comment": "The identity of the person performing the stashing." }, { "name": "message", "type": "const char *", - "comment": null + "comment": "Optional description along with the stashed state." }, { "name": "flags", - "type": "int", - "comment": null + "type": "uint32_t", + "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" } ], - "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, int flags", - "sig": "git_oid *::git_repository *::const git_signature *::const char *::int", + "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", + "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", "return": { "type": "int", - "comment": null + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." }, - "description": "", + "description": "

Save the local modifications to a new stash.

\n", "comments": "", "group": "stash" }, - "git_stash_apply_init_options": { + "git_stash_apply_options_init": { "type": "function", "file": "git2/stash.h", "line": 156, @@ -20945,7 +20755,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_stash_apply_options structure

\n", - "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to\n creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", "group": "stash" }, "git_stash_apply": { @@ -20977,7 +20787,7 @@ "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" }, "description": "

Apply a single stashed state from the stash list.

\n", - "comments": "

If local changes in the working directory conflict with changes in the\n stash then GIT_EMERGECONFLICT will be returned. In this case, the index\n will always remain unmodified and all files in the working directory will\n remain unmodified. However, if you are restoring untracked files or\n ignored files and there is a conflict when applying the modified files,\n then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be\n conflicts when reinstating the index, the function will return\n GIT_EMERGECONFLICT and both the working directory and index will be left\n unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", + "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", "group": "stash" }, "git_stash_foreach": { @@ -21071,7 +20881,7 @@ "comments": "", "group": "stash" }, - "git_status_init_options": { + "git_status_options_init": { "type": "function", "file": "git2/status.h", "line": 203, @@ -21095,7 +20905,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_status_options structure

\n", - "comments": "

Initializes a git_status_options with default values. Equivalent to\n creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_status_options with default values. Equivalent to creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", "group": "status" }, "git_status_foreach": { @@ -21127,11 +20937,11 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Gather file statuses and run a callback for each one.

\n", - "comments": "

The callback is passed the path of the file, the status (a combination of\n the git_status_t values above) and the payload data pointer passed\n into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping\n and return that value to caller.

\n", + "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", "group": "status", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_status_foreach-10" + "ex/HEAD/status.html#git_status_foreach-6" ] } }, @@ -21169,11 +20979,11 @@ "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Gather file status information and run callbacks as requested.

\n", - "comments": "

This is an extended version of the git_status_foreach() API that\n allows for more granular control over which paths will be processed and\n in what order. See the git_status_options structure for details\n about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter\n the status, then the results from rename detection (if you enable it) may\n not be accurate. To do rename detection properly, this must be called\n with no pathspec so that all files can be considered.

\n", + "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", "group": "status", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_status_foreach_ext-11" + "ex/HEAD/status.html#git_status_foreach_ext-7" ] } }, @@ -21206,8 +21016,13 @@ "comment": " 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors." }, "description": "

Get file status for a single file.

\n", - "comments": "

This tries to get status for the filename that you give. If no files\n match that name (in either the HEAD, index, or working directory), this\n returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a\n directory or if running on a case- insensitive filesystem and yet the\n HEAD has two entries that both match the path), then this returns\n GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of\n targets and because of the path filtering, there is not enough\n information to check renames correctly. To check file status with rename\n detection, there is no choice but to do a full git_status_list_new and\n scan through looking for the path that you are interested in.

\n", - "group": "status" + "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", + "group": "status", + "examples": { + "add.c": [ + "ex/HEAD/add.html#git_status_file-6" + ] + } }, "git_status_list_new": { "type": "function", @@ -21238,12 +21053,12 @@ "comment": " 0 on success or error code" }, "description": "

Gather file status information and populate the git_status_list.

\n", - "comments": "

Note that if a pathspec is given in the git_status_options to filter\n the status, then the results from rename detection (if you enable it) may\n not be accurate. To do rename detection properly, this must be called\n with no pathspec so that all files can be considered.

\n", + "comments": "

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", "group": "status", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_status_list_new-12", - "ex/v0.28.0/status.html#git_status_list_new-13" + "ex/HEAD/status.html#git_status_list_new-8", + "ex/HEAD/status.html#git_status_list_new-9" ] } }, @@ -21266,12 +21081,12 @@ "comment": " the number of status entries" }, "description": "

Gets the count of status entries in this list.

\n", - "comments": "

If there are no changes in status (at least according the options given\n when the status list was created), this can return 0.

\n", + "comments": "

If there are no changes in status (at least according the options given when the status list was created), this can return 0.

\n", "group": "status", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_status_list_entrycount-14", - "ex/v0.28.0/status.html#git_status_list_entrycount-15" + "ex/HEAD/status.html#git_status_list_entrycount-10", + "ex/HEAD/status.html#git_status_list_entrycount-11" ] } }, @@ -21303,12 +21118,12 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_status_byindex-16", - "ex/v0.28.0/status.html#git_status_byindex-17", - "ex/v0.28.0/status.html#git_status_byindex-18", - "ex/v0.28.0/status.html#git_status_byindex-19", - "ex/v0.28.0/status.html#git_status_byindex-20", - "ex/v0.28.0/status.html#git_status_byindex-21" + "ex/HEAD/status.html#git_status_byindex-12", + "ex/HEAD/status.html#git_status_byindex-13", + "ex/HEAD/status.html#git_status_byindex-14", + "ex/HEAD/status.html#git_status_byindex-15", + "ex/HEAD/status.html#git_status_byindex-16", + "ex/HEAD/status.html#git_status_byindex-17" ] } }, @@ -21335,7 +21150,7 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_status_list_free-22" + "ex/HEAD/status.html#git_status_list_free-18" ] } }, @@ -21368,7 +21183,7 @@ "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." }, "description": "

Test if the ignore rules apply to a given file.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the\n given file. This indicates if the file would be ignored regardless of\n whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the\n directory containing the file, would it be added or not?

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", "group": "status" }, "git_strarray_free": { @@ -21390,18 +21205,18 @@ "comment": null }, "description": "

Close a string array object

\n", - "comments": "

This method should be called on git_strarray objects where the strings\n array is allocated and contains allocated strings, such as what you\n would get from git_strarray_copy(). Not doing so, will result in a\n memory leak.

\n\n

This does not free the git_strarray itself, since the library will\n never allocate that object directly itself (it is more commonly embedded\n inside another struct or created on the stack).

\n", + "comments": "

This method should be called on git_strarray objects where the strings array is allocated and contains allocated strings, such as what you would get from git_strarray_copy(). Not doing so, will result in a memory leak.

\n\n

This does not free the git_strarray itself, since the library will never allocate that object directly itself (it is more commonly embedded inside another struct or created on the stack).

\n", "group": "strarray", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_strarray_free-83" + "ex/HEAD/general.html#git_strarray_free-83" ], "remote.c": [ - "ex/v0.28.0/remote.html#git_strarray_free-16", - "ex/v0.28.0/remote.html#git_strarray_free-17" + "ex/HEAD/remote.html#git_strarray_free-11", + "ex/HEAD/remote.html#git_strarray_free-12" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_strarray_free-19" + "ex/HEAD/tag.html#git_strarray_free-15" ] } }, @@ -21429,10 +21244,10 @@ "comment": " 0 on success, \n<\n 0 on allocation failure" }, "description": "

Copy a string array object from source to target.

\n", - "comments": "

Note: target is overwritten and hence should be empty, otherwise its\n contents are leaked. Call git_strarray_free() if necessary.

\n", + "comments": "

Note: target is overwritten and hence should be empty, otherwise its contents are leaked. Call git_strarray_free() if necessary.

\n", "group": "strarray" }, - "git_submodule_update_init_options": { + "git_submodule_update_options_init": { "type": "function", "file": "git2/submodule.h", "line": 171, @@ -21456,7 +21271,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_submodule_update_options structure

\n", - "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to\n creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", "group": "submodule" }, "git_submodule_update": { @@ -21520,7 +21335,7 @@ "comment": " 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors." }, "description": "

Lookup submodule information by name or path.

\n", - "comments": "

Given either the submodule name or path (they are usually the same), this\n returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config,\nbut does "exist" in the working directory (i.e. there is a subdirectory\nthat appears to be a Git repository). In this case, this function\nreturns GIT_EEXISTS to indicate a sub-repository exists but not in a\nstate where a git_submodule can be instantiated.
  • \n
  • The submodule is not mentioned in the HEAD, index, or config and the\nworking directory doesn't contain a value git repo at that path.\nThere may or may not be anything else at that path, but nothing that\nlooks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", + "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config, but does "exist" in the working directory (i.e. there is a subdirectory that appears to be a Git repository). In this case, this function returns GIT_EEXISTS to indicate a sub-repository exists but not in a state where a git_submodule can be instantiated. - The submodule is not mentioned in the HEAD, index, or config and the working directory doesn't contain a value git repo at that path. There may or may not be anything else at that path, but nothing that looks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", "group": "submodule" }, "git_submodule_free": { @@ -21574,11 +21389,11 @@ "comment": " 0 on success, -1 on error, or non-zero return value of callback" }, "description": "

Iterate over all tracked submodules of a repository.

\n", - "comments": "

See the note on git_submodule above. This iterates over the tracked\n submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like\n submodules but are not tracked, the diff API will generate a diff record\n for workdir items that look like submodules but are not tracked, showing\n them as added in the workdir. Also, the status API will treat the entire\n subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", + "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", "group": "submodule", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_submodule_foreach-23" + "ex/HEAD/status.html#git_submodule_foreach-19" ] } }, @@ -21621,7 +21436,7 @@ "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." }, "description": "

Set up a new git submodule for checkout.

\n", - "comments": "

This does "git submodule add" up to the fetch and checkout of the\n submodule contents. It preps a new submodule, creates an entry in\n .gitmodules and creates an empty initialized repository either at the\n given path in the working directory or in .git/modules with a gitlink\n from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the\n submodule repo and perform the clone step as needed. Lastly, call\n git_submodule_add_finalize() to wrap up adding the new submodule and\n .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", + "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed. Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", "group": "submodule" }, "git_submodule_add_finalize": { @@ -21643,7 +21458,7 @@ "comment": null }, "description": "

Resolve the setup of a new git submodule.

\n", - "comments": "

This should be called on a submodule once you have called add setup\n and done the clone of the submodule. This adds the .gitmodules file\n and the newly cloned submodule to the index to be ready to be committed\n (but doesn't actually do the commit).

\n", + "comments": "

This should be called on a submodule once you have called add setup and done the clone of the submodule. This adds the .gitmodules file and the newly cloned submodule to the index to be ready to be committed (but doesn't actually do the commit).

\n", "group": "submodule" }, "git_submodule_add_to_index": { @@ -21692,7 +21507,7 @@ "comment": " Pointer to `git_repository`" }, "description": "

Get the containing repository for a submodule.

\n", - "comments": "

This returns a pointer to the repository that contains the submodule.\n This is a just a reference to the repository that was passed to the\n original git_submodule_lookup() call, so if that repository has been\n freed, then this may be a dangling reference.

\n", + "comments": "

This returns a pointer to the repository that contains the submodule. This is a just a reference to the repository that was passed to the original git_submodule_lookup() call, so if that repository has been freed, then this may be a dangling reference.

\n", "group": "submodule" }, "git_submodule_name": { @@ -21718,7 +21533,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_submodule_name-24" + "ex/HEAD/status.html#git_submodule_name-20" ] } }, @@ -21741,11 +21556,11 @@ "comment": " Pointer to the submodule path" }, "description": "

Get the path to the submodule.

\n", - "comments": "

The path is almost always the same as the submodule name, but the\n two are actually not required to match.

\n", + "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", "group": "submodule", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_submodule_path-25" + "ex/HEAD/status.html#git_submodule_path-21" ] } }, @@ -21854,7 +21669,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set the branch for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to\n write the changes to the checked out submodule repository.

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", "group": "submodule" }, "git_submodule_set_url": { @@ -21886,7 +21701,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set the URL for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to\n write the changes to the checked out submodule repository.

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", "group": "submodule" }, "git_submodule_index_id": { @@ -21952,7 +21767,7 @@ "comment": " Pointer to git_oid or NULL if submodule is not checked out." }, "description": "

Get the OID for the submodule in the current working directory.

\n", - "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked\n out submodule. If there are pending changes in the index or anything\n else, this won't notice that. You should call git_submodule_status()\n for a more complete picture about the state of the working directory.

\n", + "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked out submodule. If there are pending changes in the index or anything else, this won't notice that. You should call git_submodule_status() for a more complete picture about the state of the working directory.

\n", "group": "submodule" }, "git_submodule_ignore": { @@ -21974,7 +21789,7 @@ "comment": " The current git_submodule_ignore_t valyue what will be used for\n this submodule." }, "description": "

Get the ignore rule that will be used for the submodule.

\n", - "comments": "

These values control the behavior of git_submodule_status() for this\n submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents\nof the submodule from a clean checkout to be dirty, including the\naddition of untracked files. This is the default if unspecified.
  • \n
  • GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the\nworking tree (i.e. call git_status_foreach() on the submodule) but\nUNTRACKED files will not count as making the submodule dirty.
  • \n
  • GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the\nsubmodule has moved for status. This is fast since it does not need to\nscan the working tree of the submodule at all.
  • \n
  • GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo.\nThe working directory will be consider clean so long as there is a\nchecked out version present.
  • \n
\n", + "comments": "

These values control the behavior of git_submodule_status() for this submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents of the submodule from a clean checkout to be dirty, including the addition of untracked files. This is the default if unspecified. - GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the working tree (i.e. call git_status_foreach() on the submodule) but UNTRACKED files will not count as making the submodule dirty. - GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the submodule has moved for status. This is fast since it does not need to scan the working tree of the submodule at all. - GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo. The working directory will be consider clean so long as there is a checked out version present.
  • \n
\n", "group": "submodule" }, "git_submodule_set_ignore": { @@ -22028,7 +21843,7 @@ "comment": " The current git_submodule_update_t value that will be used\n for this submodule." }, "description": "

Get the update rule that will be used for the submodule.

\n", - "comments": "

This value controls the behavior of the git submodule update command.\n There are four useful values documented with git_submodule_update_t.

\n", + "comments": "

This value controls the behavior of the git submodule update command. There are four useful values documented with git_submodule_update_t.

\n", "group": "submodule" }, "git_submodule_set_update": { @@ -22082,7 +21897,7 @@ "comment": " 0 if fetchRecurseSubmodules is false, 1 if true" }, "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", - "comments": "

This accesses the submodule.\n<name

\n\n
\n

.fetchRecurseSubmodules value for\n the submodule that controls fetching behavior for the submodule.

\n
\n\n

Note that at this time, libgit2 does not honor this setting and the\n fetch functionality current ignores submodules.

\n", + "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", "group": "submodule" }, "git_submodule_set_fetch_recurse_submodules": { @@ -22141,7 +21956,7 @@ "comment": " 0 on success, \n<\n0 on failure." }, "description": "

Copy submodule info into ".git/config" file.

\n", - "comments": "

Just like "git submodule init", this copies information about the\n submodule into ".git/config". You can use the accessor functions\n above to alter the in-memory git_submodule object and control what\n is written to the config, overriding what is in .gitmodules.

\n", + "comments": "

Just like "git submodule init", this copies information about the submodule into ".git/config". You can use the accessor functions above to alter the in-memory git_submodule object and control what is written to the config, overriding what is in .gitmodules.

\n", "group": "submodule" }, "git_submodule_repo_init": { @@ -22173,7 +21988,7 @@ "comment": " 0 on success, \n<\n0 on failure." }, "description": "

Set up the subrepository for a submodule in preparation for clone.

\n", - "comments": "

This function can be called to init and set up a submodule\n repository from a submodule in preparation to clone it from\n its remote.

\n", + "comments": "

This function can be called to init and set up a submodule repository from a submodule in preparation to clone it from its remote.

\n", "group": "submodule" }, "git_submodule_sync": { @@ -22195,7 +22010,7 @@ "comment": null }, "description": "

Copy submodule remote info into submodule repo.

\n", - "comments": "

This copies the information about the submodules URL into the checked out\n submodule config, acting like "git submodule sync". This is useful if\n you have altered the URL for the submodule (or it has been altered by a\n fetch of upstream changes) and you need to update your local repo.

\n", + "comments": "

This copies the information about the submodules URL into the checked out submodule config, acting like "git submodule sync". This is useful if you have altered the URL for the submodule (or it has been altered by a fetch of upstream changes) and you need to update your local repo.

\n", "group": "submodule" }, "git_submodule_open": { @@ -22222,7 +22037,7 @@ "comment": " 0 on success, \n<\n0 if submodule repo could not be opened." }, "description": "

Open the repository for a submodule.

\n", - "comments": "

This is a newly opened repository object. The caller is responsible for\n calling git_repository_free() on it when done. Multiple calls to this\n function will return distinct git_repository objects. This will only\n work if the submodule is checked out into the working directory.

\n", + "comments": "

This is a newly opened repository object. The caller is responsible for calling git_repository_free() on it when done. Multiple calls to this function will return distinct git_repository objects. This will only work if the submodule is checked out into the working directory.

\n", "group": "submodule" }, "git_submodule_reload": { @@ -22249,7 +22064,7 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Reread submodule info from config, index, and HEAD.

\n", - "comments": "

Call this to reread cached submodule information for this submodule if\n you have reason to believe that it has changed.

\n", + "comments": "

Call this to reread cached submodule information for this submodule if you have reason to believe that it has changed.

\n", "group": "submodule" }, "git_submodule_status": { @@ -22286,11 +22101,11 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Get the status for a submodule.

\n", - "comments": "

This looks at a submodule and tries to determine the status. It\n will return a combination of the GIT_SUBMODULE_STATUS values above.\n How deeply it examines the working directory to do this will depend\n on the git_submodule_ignore_t value for the submodule.

\n", + "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", "group": "submodule", "examples": { "status.c": [ - "ex/v0.28.0/status.html#git_submodule_status-26" + "ex/HEAD/status.html#git_submodule_status-22" ] } }, @@ -22318,2696 +22133,277 @@ "comment": " 0 on success, \n<\n0 on error" }, "description": "

Get the locations of submodule information.

\n", - "comments": "

This is a bit like a very lightweight version of git_submodule_status.\n It just returns a made of the first four submodule status values (i.e.\n the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the\n submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.).\n This can be useful if you want to know if the submodule is present in the\n working directory at this point in time, etc.

\n", + "comments": "

This is a bit like a very lightweight version of git_submodule_status. It just returns a made of the first four submodule status values (i.e. the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). This can be useful if you want to know if the submodule is present in the working directory at this point in time, etc.

\n", "group": "submodule" }, - "git_stdalloc_init_allocator": { - "type": "function", - "file": "git2/sys/alloc.h", - "line": 85, - "lineto": 85, - "args": [ - { - "name": "allocator", - "type": "git_allocator *", - "comment": "The allocator that is to be initialized." - } - ], - "argline": "git_allocator *allocator", - "sig": "git_allocator *", - "return": { - "type": "int", - "comment": " An error code or 0." - }, - "description": "

Initialize the allocator structure to use the stdalloc pointer.

\n", - "comments": "

Set up the structure so that all of its members are using the standard\n "stdalloc" allocator functions. The structure can then be used with\n git_allocator_setup.

\n", - "group": "stdalloc" - }, - "git_win32_crtdbg_init_allocator": { - "type": "function", - "file": "git2/sys/alloc.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "allocator", - "type": "git_allocator *", - "comment": "The allocator that is to be initialized." - } - ], - "argline": "git_allocator *allocator", - "sig": "git_allocator *", - "return": { - "type": "int", - "comment": " An error code or 0." - }, - "description": "

Initialize the allocator structure to use the crtdbg pointer.

\n", - "comments": "

Set up the structure so that all of its members are using the "crtdbg"\n allocator functions. Note that this allocator is only available on Windows\n platforms and only if libgit2 is being compiled with "-DMSVC_CRTDBG".

\n", - "group": "win32" - }, - "git_commit_create_from_ids": { + "git_tag_lookup": { "type": "function", - "file": "git2/sys/commit.h", - "line": 34, - "lineto": 44, + "file": "git2/tag.h", + "line": 33, + "lineto": 34, "args": [ { - "name": "id", - "type": "git_oid *", - "comment": null + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" }, { "name": "repo", "type": "git_repository *", - "comment": null - }, - { - "name": "update_ref", - "type": "const char *", - "comment": null - }, - { - "name": "author", - "type": "const git_signature *", - "comment": null - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": null - }, - { - "name": "message", - "type": "const char *", - "comment": null + "comment": "the repo to use when locating the tag." }, { - "name": "tree", + "name": "id", "type": "const git_oid *", - "comment": null - }, - { - "name": "parent_count", - "type": "size_t", - "comment": null - }, - { - "name": "parents", - "type": "const git_oid *[]", - "comment": null + "comment": "identity of the tag to locate." } ], - "argline": "git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_oid *tree, size_t parent_count, const git_oid *[] parents", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_oid *::size_t::const git_oid *[]", + "argline": "git_tag **out, git_repository *repo, const git_oid *id", + "sig": "git_tag **::git_repository *::const git_oid *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, - "description": "

Create new commit in the repository from a list of git_oid values.

\n", - "comments": "

See documentation for git_commit_create() for information about the\n parameters, as the meaning is identical excepting that tree and\n parents now take git_oid. This is a dangerous API in that nor\n the tree, neither the parents list of git_oids are checked for\n validity.

\n", - "group": "commit" + "description": "

Lookup a tag object from the repository.

\n", + "comments": "", + "group": "tag", + "examples": { + "general.c": [ + "ex/HEAD/general.html#git_tag_lookup-84" + ] + } }, - "git_commit_create_from_callback": { + "git_tag_lookup_prefix": { "type": "function", - "file": "git2/sys/commit.h", - "line": 66, - "lineto": 76, + "file": "git2/tag.h", + "line": 48, + "lineto": 49, "args": [ { - "name": "id", - "type": "git_oid *", - "comment": null + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" }, { "name": "repo", "type": "git_repository *", - "comment": null - }, - { - "name": "update_ref", - "type": "const char *", - "comment": null - }, - { - "name": "author", - "type": "const git_signature *", - "comment": null - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": null - }, - { - "name": "message", - "type": "const char *", - "comment": null + "comment": "the repo to use when locating the tag." }, { - "name": "tree", + "name": "id", "type": "const git_oid *", - "comment": null - }, - { - "name": "parent_cb", - "type": "git_commit_parent_callback", - "comment": null + "comment": "identity of the tag to locate." }, { - "name": "parent_payload", - "type": "void *", - "comment": null + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" } ], - "argline": "git_oid *id, git_repository *repo, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_oid *tree, git_commit_parent_callback parent_cb, void *parent_payload", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_oid *::git_commit_parent_callback::void *", + "argline": "git_tag **out, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_tag **::git_repository *::const git_oid *::size_t", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, - "description": "

Create a new commit in the repository with an callback to supply parents.

\n", - "comments": "

See documentation for git_commit_create() for information about the\n parameters, as the meaning is identical excepting that tree takes a\n git_oid and doesn't check for validity, and parent_cb is invoked\n with parent_payload and should return git_oid values or NULL to\n indicate that all parents are accounted for.

\n", - "group": "commit" + "description": "

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "tag" }, - "git_config_init_backend": { + "git_tag_free": { "type": "function", - "file": "git2/sys/config.h", - "line": 97, - "lineto": 99, + "file": "git2/tag.h", + "line": 61, + "lineto": 61, "args": [ { - "name": "backend", - "type": "git_config_backend *", - "comment": "the `git_config_backend` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version of struct; pass `GIT_CONFIG_BACKEND_VERSION`" + "name": "tag", + "type": "git_tag *", + "comment": "the tag to close" } ], - "argline": "git_config_backend *backend, unsigned int version", - "sig": "git_config_backend *::unsigned int", + "argline": "git_tag *tag", + "sig": "git_tag *", "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." + "type": "void", + "comment": null }, - "description": "

Initializes a git_config_backend with default values. Equivalent to\n creating an instance with GIT_CONFIG_BACKEND_INIT.

\n", - "comments": "", - "group": "config" + "description": "

Close an open tag

\n", + "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", + "group": "tag", + "examples": { + "general.c": [ + "ex/HEAD/general.html#git_tag_free-85" + ] + } }, - "git_config_add_backend": { + "git_tag_id": { "type": "function", - "file": "git2/sys/config.h", - "line": 121, - "lineto": 126, + "file": "git2/tag.h", + "line": 69, + "lineto": 69, "args": [ { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration to add the file to" - }, - { - "name": "file", - "type": "git_config_backend *", - "comment": "the configuration file (backend) to add" - }, - { - "name": "level", - "type": "git_config_level_t", - "comment": "the priority level of the backend" - }, - { - "name": "repo", - "type": "const git_repository *", - "comment": "optional repository to allow parsing of\n conditional includes" - }, - { - "name": "force", - "type": "int", - "comment": "if a config file already exists for the given\n priority level, replace it" + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." } ], - "argline": "git_config *cfg, git_config_backend *file, git_config_level_t level, const git_repository *repo, int force", - "sig": "git_config *::git_config_backend *::git_config_level_t::const git_repository *::int", + "argline": "const git_tag *tag", + "sig": "const git_tag *", "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0), or error code" + "type": "const git_oid *", + "comment": " object identity for the tag." }, - "description": "

Add a generic config file instance to an existing config

\n", - "comments": "

Note that the configuration object will free the file\n automatically.

\n\n

Further queries on this config object will access each\n of the config file instances in order (instances with\n a higher priority level will be accessed first).

\n", - "group": "config" + "description": "

Get the id of a tag.

\n", + "comments": "", + "group": "tag" }, - "git_diff_print_callback__to_buf": { + "git_tag_owner": { "type": "function", - "file": "git2/sys/diff.h", - "line": 37, - "lineto": 41, + "file": "git2/tag.h", + "line": 77, + "lineto": 77, "args": [ { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": null - }, - { - "name": "line", - "type": "const git_diff_line *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null + "name": "tag", + "type": "const git_tag *", + "comment": "A previously loaded tag." } ], - "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", - "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", + "argline": "const git_tag *tag", + "sig": "const git_tag *", "return": { - "type": "int", - "comment": null + "type": "git_repository *", + "comment": " Repository that contains this tag." }, - "description": "

Diff print callback that writes to a git_buf.

\n", - "comments": "

This function is provided not for you to call it directly, but instead\n so you can use it as a function pointer to the git_diff_print or\n git_patch_print APIs. When using those APIs, you specify a callback\n to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a git_buf buffer. You\n must pass a git_buf * value as the payload to the git_diff_print\n and/or git_patch_print function. The data will be appended to the\n buffer (after any existing content).

\n", - "group": "diff" + "description": "

Get the repository that contains the tag.

\n", + "comments": "", + "group": "tag" }, - "git_diff_print_callback__to_file_handle": { + "git_tag_target": { "type": "function", - "file": "git2/sys/diff.h", - "line": 57, - "lineto": 61, + "file": "git2/tag.h", + "line": 89, + "lineto": 89, "args": [ { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": null - }, - { - "name": "line", - "type": "const git_diff_line *", - "comment": null + "name": "target_out", + "type": "git_object **", + "comment": "pointer where to store the target" }, { - "name": "payload", - "type": "void *", - "comment": null + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." } ], - "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", - "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", + "argline": "git_object **target_out, const git_tag *tag", + "sig": "git_object **::const git_tag *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, - "description": "

Diff print callback that writes to stdio FILE handle.

\n", - "comments": "

This function is provided not for you to call it directly, but instead\n so you can use it as a function pointer to the git_diff_print or\n git_patch_print APIs. When using those APIs, you specify a callback\n to actually handle the diff and/or patch data.

\n\n

Use this callback to easily write that data to a stdio FILE handle. You\n must pass a FILE * value (such as stdout or stderr or the return\n value from fopen()) as the payload to the git_diff_print\n and/or git_patch_print function. If you pass NULL, this will write\n data to stdout.

\n", - "group": "diff" + "description": "

Get the tagged object of a tag

\n", + "comments": "

This method performs a repository lookup for the given object and returns it

\n", + "group": "tag", + "examples": { + "general.c": [ + "ex/HEAD/general.html#git_tag_target-86" + ] + } }, - "git_diff_get_perfdata": { + "git_tag_target_id": { "type": "function", - "file": "git2/sys/diff.h", - "line": 83, - "lineto": 84, + "file": "git2/tag.h", + "line": 97, + "lineto": 97, "args": [ { - "name": "out", - "type": "git_diff_perfdata *", - "comment": "Structure to be filled with diff performance data" - }, - { - "name": "diff", - "type": "const git_diff *", - "comment": "Diff to read performance data from" + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." } ], - "argline": "git_diff_perfdata *out, const git_diff *diff", - "sig": "git_diff_perfdata *::const git_diff *", + "argline": "const git_tag *tag", + "sig": "const git_tag *", "return": { - "type": "int", - "comment": " 0 for success, \n<\n0 for error" + "type": "const git_oid *", + "comment": " pointer to the OID" }, - "description": "

Get performance data for a diff object.

\n", + "description": "

Get the OID of the tagged object of a tag

\n", "comments": "", - "group": "diff" + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/HEAD/cat-file.html#git_tag_target_id-31" + ] + } }, - "git_status_list_get_perfdata": { + "git_tag_target_type": { "type": "function", - "file": "git2/sys/diff.h", - "line": 89, - "lineto": 90, + "file": "git2/tag.h", + "line": 105, + "lineto": 105, "args": [ { - "name": "out", - "type": "git_diff_perfdata *", - "comment": null - }, - { - "name": "status", - "type": "const git_status_list *", - "comment": null + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." } ], - "argline": "git_diff_perfdata *out, const git_status_list *status", - "sig": "git_diff_perfdata *::const git_status_list *", + "argline": "const git_tag *tag", + "sig": "const git_tag *", "return": { - "type": "int", - "comment": null + "type": "git_object_t", + "comment": " type of the tagged object" }, - "description": "

Get performance data for diffs from a git_status_list

\n", + "description": "

Get the type of a tag's tagged object

\n", "comments": "", - "group": "status" + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/HEAD/cat-file.html#git_tag_target_type-32" + ], + "general.c": [ + "ex/HEAD/general.html#git_tag_target_type-87" + ] + } }, - "git_filter_lookup": { + "git_tag_name": { "type": "function", - "file": "git2/sys/filter.h", - "line": 27, - "lineto": 27, + "file": "git2/tag.h", + "line": 113, + "lineto": 113, "args": [ { - "name": "name", - "type": "const char *", - "comment": "The name of the filter" + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." } ], - "argline": "const char *name", - "sig": "const char *", + "argline": "const git_tag *tag", + "sig": "const git_tag *", "return": { - "type": "git_filter *", - "comment": " Pointer to the filter object or NULL if not found" + "type": "const char *", + "comment": " name of the tag" }, - "description": "

Look up a filter by name

\n", + "description": "

Get the name of a tag

\n", "comments": "", - "group": "filter" + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/HEAD/cat-file.html#git_tag_name-33" + ], + "general.c": [ + "ex/HEAD/general.html#git_tag_name-88" + ], + "tag.c": [ + "ex/HEAD/tag.html#git_tag_name-16" + ] + } }, - "git_filter_list_new": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 57, - "lineto": 61, - "args": [ - { - "name": "out", - "type": "git_filter_list **", - "comment": null - }, - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "mode", - "type": "git_filter_mode_t", - "comment": null - }, - { - "name": "options", - "type": "int", - "comment": null - } - ], - "argline": "git_filter_list **out, git_repository *repo, git_filter_mode_t mode, int options", - "sig": "git_filter_list **::git_repository *::git_filter_mode_t::int", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "", - "group": "filter" - }, - "git_filter_list_push": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 76, - "lineto": 77, - "args": [ - { - "name": "fl", - "type": "git_filter_list *", - "comment": null - }, - { - "name": "filter", - "type": "git_filter *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_filter_list *fl, git_filter *filter, void *payload", - "sig": "git_filter_list *::git_filter *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Add a filter to a filter list with the given payload.

\n", - "comments": "

Normally you won't have to do this because the filter list is created\n by calling the "check" function on registered filters when the filter\n attributes are set, but this does allow more direct manipulation of\n filter lists when desired.

\n\n

Note that normally the "check" function can set up a payload for the\n filter. Using this function, you can either pass in a payload if you\n know the expected payload format, or you can pass NULL. Some filters\n may fail with a NULL payload. Good luck!

\n", - "group": "filter" - }, - "git_filter_list_length": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 90, - "lineto": 90, - "args": [ - { - "name": "fl", - "type": "const git_filter_list *", - "comment": "A filter list" - } - ], - "argline": "const git_filter_list *fl", - "sig": "const git_filter_list *", - "return": { - "type": "size_t", - "comment": " The number of filters in the list" - }, - "description": "

Look up how many filters are in the list

\n", - "comments": "

We will attempt to apply all of these filters to any data passed in,\n but note that the filter apply action still has the option of skipping\n data that is passed in (for example, the CRLF filter will skip data\n that appears to be binary).

\n", - "group": "filter" - }, - "git_filter_source_repo": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 100, - "lineto": 100, - "args": [ - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - } - ], - "argline": "const git_filter_source *src", - "sig": "const git_filter_source *", - "return": { - "type": "git_repository *", - "comment": null - }, - "description": "

Get the repository that the source data is coming from.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_source_path": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 105, - "lineto": 105, - "args": [ - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - } - ], - "argline": "const git_filter_source *src", - "sig": "const git_filter_source *", - "return": { - "type": "const char *", - "comment": null - }, - "description": "

Get the path that the source data is coming from.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_source_filemode": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 111, - "lineto": 111, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "", - "group": "filter" - }, - "git_filter_source_id": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 118, - "lineto": 118, - "args": [ - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - } - ], - "argline": "const git_filter_source *src", - "sig": "const git_filter_source *", - "return": { - "type": "const git_oid *", - "comment": null - }, - "description": "

Get the OID of the source\n If the OID is unknown (often the case with GIT_FILTER_CLEAN) then\n this will return NULL.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_source_mode": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 123, - "lineto": 123, - "args": [ - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - } - ], - "argline": "const git_filter_source *src", - "sig": "const git_filter_source *", - "return": { - "type": "git_filter_mode_t", - "comment": null - }, - "description": "

Get the git_filter_mode_t to be used

\n", - "comments": "", - "group": "filter" - }, - "git_filter_source_flags": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 128, - "lineto": 128, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "", - "group": "filter" - }, - "git_filter_init": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 284, - "lineto": 284, - "args": [ - { - "name": "filter", - "type": "git_filter *", - "comment": "the `git_filter` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version the struct; pass `GIT_FILTER_VERSION`" - } - ], - "argline": "git_filter *filter, unsigned int version", - "sig": "git_filter *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_filter with default values. Equivalent to\n creating an instance with GIT_FILTER_INIT.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_register": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 312, - "lineto": 313, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "A name by which the filter can be referenced. Attempting\n \t\t\tto register with an in-use name will return GIT_EEXISTS." - }, - { - "name": "filter", - "type": "git_filter *", - "comment": "The filter definition. This pointer will be stored as is\n \t\t\tby libgit2 so it must be a durable allocation (either static\n \t\t\tor on the heap)." - }, - { - "name": "priority", - "type": "int", - "comment": "The priority for filter application" - } - ], - "argline": "const char *name, git_filter *filter, int priority", - "sig": "const char *::git_filter *::int", - "return": { - "type": "int", - "comment": " 0 on successful registry, error code \n<\n0 on failure" - }, - "description": "

Register a filter under a given name with a given priority.

\n", - "comments": "

As mentioned elsewhere, the initialize callback will not be invoked\n immediately. It is deferred until the filter is used in some way.

\n\n

A filter's attribute checks and check and apply callbacks will be\n issued in order of priority on smudge (to workdir), and in reverse\n order of priority on clean (to odb).

\n\n

Two filters are preregistered with libgit2:\n - GIT_FILTER_CRLF with priority 0\n - GIT_FILTER_IDENT with priority 100

\n\n

Currently the filter registry is not thread safe, so any registering or\n deregistering of filters must be done outside of any possible usage of\n the filters (i.e. during application setup or shutdown).

\n", - "group": "filter" - }, - "git_filter_unregister": { - "type": "function", - "file": "git2/sys/filter.h", - "line": 328, - "lineto": 328, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The name under which the filter was registered" - } - ], - "argline": "const char *name", - "sig": "const char *", - "return": { - "type": "int", - "comment": " 0 on success, error code \n<\n0 on failure" - }, - "description": "

Remove the filter with the given name

\n", - "comments": "

Attempting to remove the builtin libgit2 filters is not permitted and\n will return an error.

\n\n

Currently the filter registry is not thread safe, so any registering or\n deregistering of filters must be done outside of any possible usage of\n the filters (i.e. during application setup or shutdown).

\n", - "group": "filter" - }, - "git_hashsig_create": { - "type": "function", - "file": "git2/sys/hashsig.h", - "line": 62, - "lineto": 66, - "args": [ - { - "name": "out", - "type": "git_hashsig **", - "comment": "The computed similarity signature." - }, - { - "name": "buf", - "type": "const char *", - "comment": "The input buffer." - }, - { - "name": "buflen", - "type": "size_t", - "comment": "The input buffer size." - }, - { - "name": "opts", - "type": "git_hashsig_option_t", - "comment": "The signature computation options (see above)." - } - ], - "argline": "git_hashsig **out, const char *buf, size_t buflen, git_hashsig_option_t opts", - "sig": "git_hashsig **::const char *::size_t::git_hashsig_option_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to\n compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or\n error code." - }, - "description": "

Compute a similarity signature for a text buffer

\n", - "comments": "

If you have passed the option GIT_HASHSIG_IGNORE_WHITESPACE, then the\n whitespace will be removed from the buffer while it is being processed,\n modifying the buffer in place. Sorry about that!

\n", - "group": "hashsig" - }, - "git_hashsig_create_fromfile": { - "type": "function", - "file": "git2/sys/hashsig.h", - "line": 81, - "lineto": 84, - "args": [ - { - "name": "out", - "type": "git_hashsig **", - "comment": "The computed similarity signature." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path to the input file." - }, - { - "name": "opts", - "type": "git_hashsig_option_t", - "comment": "The signature computation options (see above)." - } - ], - "argline": "git_hashsig **out, const char *path, git_hashsig_option_t opts", - "sig": "git_hashsig **::const char *::git_hashsig_option_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EBUFS if the buffer doesn't contain enough data to\n compute a valid signature (unless GIT_HASHSIG_ALLOW_SMALL_FILES is set), or\n error code." - }, - "description": "

Compute a similarity signature for a text file

\n", - "comments": "

This walks through the file, only loading a maximum of 4K of file data at\n a time. Otherwise, it acts just like git_hashsig_create.

\n", - "group": "hashsig" - }, - "git_hashsig_free": { - "type": "function", - "file": "git2/sys/hashsig.h", - "line": 91, - "lineto": 91, - "args": [ - { - "name": "sig", - "type": "git_hashsig *", - "comment": "The similarity signature to free." - } - ], - "argline": "git_hashsig *sig", - "sig": "git_hashsig *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Release memory for a content similarity signature

\n", - "comments": "", - "group": "hashsig" - }, - "git_hashsig_compare": { - "type": "function", - "file": "git2/sys/hashsig.h", - "line": 100, - "lineto": 102, - "args": [ - { - "name": "a", - "type": "const git_hashsig *", - "comment": "The first similarity signature to compare." - }, - { - "name": "b", - "type": "const git_hashsig *", - "comment": "The second similarity signature to compare." - } - ], - "argline": "const git_hashsig *a, const git_hashsig *b", - "sig": "const git_hashsig *::const git_hashsig *", - "return": { - "type": "int", - "comment": " [0 to 100] on success as the similarity score, or error code." - }, - "description": "

Measure similarity score between two similarity signatures

\n", - "comments": "", - "group": "hashsig" - }, - "git_index_name_entrycount": { - "type": "function", - "file": "git2/sys/index.h", - "line": 48, - "lineto": 48, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "size_t", - "comment": " integer of count of current filename conflict entries" - }, - "description": "

Get the count of filename conflict entries currently in the index.

\n", - "comments": "", - "group": "index" - }, - "git_index_name_get_byindex": { - "type": "function", - "file": "git2/sys/index.h", - "line": 60, - "lineto": 61, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "n", - "type": "size_t", - "comment": "the position of the entry" - } - ], - "argline": "git_index *index, size_t n", - "sig": "git_index *::size_t", - "return": { - "type": "const git_index_name_entry *", - "comment": " a pointer to the filename conflict entry; NULL if out of bounds" - }, - "description": "

Get a filename conflict entry from the index.

\n", - "comments": "

The returned entry is read-only and should not be modified\n or freed by the caller.

\n", - "group": "index" - }, - "git_index_name_add": { - "type": "function", - "file": "git2/sys/index.h", - "line": 71, - "lineto": 72, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "ancestor", - "type": "const char *", - "comment": "the path of the file as it existed in the ancestor" - }, - { - "name": "ours", - "type": "const char *", - "comment": "the path of the file as it existed in our tree" - }, - { - "name": "theirs", - "type": "const char *", - "comment": "the path of the file as it existed in their tree" - } - ], - "argline": "git_index *index, const char *ancestor, const char *ours, const char *theirs", - "sig": "git_index *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Record the filenames involved in a rename conflict.

\n", - "comments": "", - "group": "index" - }, - "git_index_name_clear": { - "type": "function", - "file": "git2/sys/index.h", - "line": 79, - "lineto": 79, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Remove all filename conflict entries.

\n", - "comments": "", - "group": "index" - }, - "git_index_reuc_entrycount": { - "type": "function", - "file": "git2/sys/index.h", - "line": 96, - "lineto": 96, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "size_t", - "comment": " integer of count of current resolve undo entries" - }, - "description": "

Get the count of resolve undo entries currently in the index.

\n", - "comments": "", - "group": "index" - }, - "git_index_reuc_find": { - "type": "function", - "file": "git2/sys/index.h", - "line": 107, - "lineto": 107, - "args": [ - { - "name": "at_pos", - "type": "size_t *", - "comment": "the address to which the position of the reuc entry is written (optional)" - }, - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - } - ], - "argline": "size_t *at_pos, git_index *index, const char *path", - "sig": "size_t *::git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 if found, \n<\n 0 otherwise (GIT_ENOTFOUND)" - }, - "description": "

Finds the resolve undo entry that points to the given path in the Git\n index.

\n", - "comments": "", - "group": "index" - }, - "git_index_reuc_get_bypath": { - "type": "function", - "file": "git2/sys/index.h", - "line": 119, - "lineto": 119, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - } - ], - "argline": "git_index *index, const char *path", - "sig": "git_index *::const char *", - "return": { - "type": "const git_index_reuc_entry *", - "comment": " the resolve undo entry; NULL if not found" - }, - "description": "

Get a resolve undo entry from the index.

\n", - "comments": "

The returned entry is read-only and should not be modified\n or freed by the caller.

\n", - "group": "index" - }, - "git_index_reuc_get_byindex": { - "type": "function", - "file": "git2/sys/index.h", - "line": 131, - "lineto": 131, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "n", - "type": "size_t", - "comment": "the position of the entry" - } - ], - "argline": "git_index *index, size_t n", - "sig": "git_index *::size_t", - "return": { - "type": "const git_index_reuc_entry *", - "comment": " a pointer to the resolve undo entry; NULL if out of bounds" - }, - "description": "

Get a resolve undo entry from the index.

\n", - "comments": "

The returned entry is read-only and should not be modified\n or freed by the caller.

\n", - "group": "index" - }, - "git_index_reuc_add": { - "type": "function", - "file": "git2/sys/index.h", - "line": 155, - "lineto": 158, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "filename to add" - }, - { - "name": "ancestor_mode", - "type": "int", - "comment": "mode of the ancestor file" - }, - { - "name": "ancestor_id", - "type": "const git_oid *", - "comment": "oid of the ancestor file" - }, - { - "name": "our_mode", - "type": "int", - "comment": "mode of our file" - }, - { - "name": "our_id", - "type": "const git_oid *", - "comment": "oid of our file" - }, - { - "name": "their_mode", - "type": "int", - "comment": "mode of their file" - }, - { - "name": "their_id", - "type": "const git_oid *", - "comment": "oid of their file" - } - ], - "argline": "git_index *index, const char *path, int ancestor_mode, const git_oid *ancestor_id, int our_mode, const git_oid *our_id, int their_mode, const git_oid *their_id", - "sig": "git_index *::const char *::int::const git_oid *::int::const git_oid *::int::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Adds a resolve undo entry for a file based on the given parameters.

\n", - "comments": "

The resolve undo entry contains the OIDs of files that were involved\n in a merge conflict after the conflict has been resolved. This allows\n conflicts to be re-resolved later.

\n\n

If there exists a resolve undo entry for the given path in the index,\n it will be removed.

\n\n

This method will fail in bare index instances.

\n", - "group": "index" - }, - "git_index_reuc_remove": { - "type": "function", - "file": "git2/sys/index.h", - "line": 167, - "lineto": 167, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "n", - "type": "size_t", - "comment": "position of the resolve undo entry to remove" - } - ], - "argline": "git_index *index, size_t n", - "sig": "git_index *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove an resolve undo entry from the index

\n", - "comments": "", - "group": "index" - }, - "git_index_reuc_clear": { - "type": "function", - "file": "git2/sys/index.h", - "line": 174, - "lineto": 174, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Remove all resolve undo entries from the index

\n", - "comments": "", - "group": "index" - }, - "git_mempack_new": { - "type": "function", - "file": "git2/sys/mempack.h", - "line": 45, - "lineto": 45, - "args": [ - { - "name": "out", - "type": "git_odb_backend **", - "comment": "Pointer where to store the ODB backend" - } - ], - "argline": "git_odb_backend **out", - "sig": "git_odb_backend **", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Instantiate a new mempack backend.

\n", - "comments": "

The backend must be added to an existing ODB with the highest\n priority.

\n\n
 git_mempack_new(\n
\n\n

&mempacker\n);\n git_repository_odb(\n&odb\n, repository);\n git_odb_add_backend(odb, mempacker, 999);

\n\n

Once the backend has been loaded, all writes to the ODB will\n instead be queued in memory, and can be finalized with\n git_mempack_dump.

\n\n

Subsequent reads will also be served from the in-memory store\n to ensure consistency, until the memory store is dumped.

\n", - "group": "mempack" - }, - "git_mempack_dump": { - "type": "function", - "file": "git2/sys/mempack.h", - "line": 68, - "lineto": 68, - "args": [ - { - "name": "pack", - "type": "git_buf *", - "comment": "Buffer where to store the raw packfile" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The active repository where the backend is loaded" - }, - { - "name": "backend", - "type": "git_odb_backend *", - "comment": "The mempack backend" - } - ], - "argline": "git_buf *pack, git_repository *repo, git_odb_backend *backend", - "sig": "git_buf *::git_repository *::git_odb_backend *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Dump all the queued in-memory writes to a packfile.

\n", - "comments": "

The contents of the packfile will be stored in the given buffer.\n It is the caller's responsibility to ensure that the generated\n packfile is available to the repository (e.g. by writing it\n to disk, or doing something crazy like distributing it across\n several copies of the repository over a network).

\n\n

Once the generated packfile is available to the repository,\n call git_mempack_reset to cleanup the memory store.

\n\n

Calling git_mempack_reset before the packfile has been\n written to disk will result in an inconsistent repository\n (the objects in the memory store won't be accessible).

\n", - "group": "mempack" - }, - "git_mempack_reset": { - "type": "function", - "file": "git2/sys/mempack.h", - "line": 82, - "lineto": 82, - "args": [ - { - "name": "backend", - "type": "git_odb_backend *", - "comment": "The mempack backend" - } - ], - "argline": "git_odb_backend *backend", - "sig": "git_odb_backend *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Reset the memory packer by clearing all the queued objects.

\n", - "comments": "

This assumes that git_mempack_dump has been called before to\n store all the queued objects into a single packfile.

\n\n

Alternatively, call reset without a previous dump to "undo"\n all the recently written objects, giving transaction-like\n semantics to the Git repository.

\n", - "group": "mempack" - }, - "git_merge_driver_lookup": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 32, - "lineto": 32, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The name of the merge driver" - } - ], - "argline": "const char *name", - "sig": "const char *", - "return": { - "type": "git_merge_driver *", - "comment": " Pointer to the merge driver object or NULL if not found" - }, - "description": "

Look up a merge driver by name

\n", - "comments": "", - "group": "merge" - }, - "git_merge_driver_source_repo": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 44, - "lineto": 45, - "args": [ - { - "name": "src", - "type": "const git_merge_driver_source *", - "comment": null - } - ], - "argline": "const git_merge_driver_source *src", - "sig": "const git_merge_driver_source *", - "return": { - "type": "const git_repository *", - "comment": null - }, - "description": "

Get the repository that the source data is coming from.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_driver_source_ancestor": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 48, - "lineto": 49, - "args": [ - { - "name": "src", - "type": "const git_merge_driver_source *", - "comment": null - } - ], - "argline": "const git_merge_driver_source *src", - "sig": "const git_merge_driver_source *", - "return": { - "type": "const git_index_entry *", - "comment": null - }, - "description": "

Gets the ancestor of the file to merge.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_driver_source_ours": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 52, - "lineto": 53, - "args": [ - { - "name": "src", - "type": "const git_merge_driver_source *", - "comment": null - } - ], - "argline": "const git_merge_driver_source *src", - "sig": "const git_merge_driver_source *", - "return": { - "type": "const git_index_entry *", - "comment": null - }, - "description": "

Gets the ours side of the file to merge.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_driver_source_theirs": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 56, - "lineto": 57, - "args": [ - { - "name": "src", - "type": "const git_merge_driver_source *", - "comment": null - } - ], - "argline": "const git_merge_driver_source *src", - "sig": "const git_merge_driver_source *", - "return": { - "type": "const git_index_entry *", - "comment": null - }, - "description": "

Gets the theirs side of the file to merge.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_driver_source_file_options": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 60, - "lineto": 61, - "args": [ - { - "name": "src", - "type": "const git_merge_driver_source *", - "comment": null - } - ], - "argline": "const git_merge_driver_source *src", - "sig": "const git_merge_driver_source *", - "return": { - "type": "const git_merge_file_options *", - "comment": null - }, - "description": "

Gets the merge file options that the merge was invoked with

\n", - "comments": "", - "group": "merge" - }, - "git_merge_driver_register": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 162, - "lineto": 163, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The name of this driver to match an attribute. Attempting\n \t\t\tto register with an in-use name will return GIT_EEXISTS." - }, - { - "name": "driver", - "type": "git_merge_driver *", - "comment": "The merge driver definition. This pointer will be stored\n\t\t\tas is by libgit2 so it must be a durable allocation (either\n\t\t\tstatic or on the heap)." - } - ], - "argline": "const char *name, git_merge_driver *driver", - "sig": "const char *::git_merge_driver *", - "return": { - "type": "int", - "comment": " 0 on successful registry, error code \n<\n0 on failure" - }, - "description": "

Register a merge driver under a given name.

\n", - "comments": "

As mentioned elsewhere, the initialize callback will not be invoked\n immediately. It is deferred until the driver is used in some way.

\n\n

Currently the merge driver registry is not thread safe, so any\n registering or deregistering of merge drivers must be done outside of\n any possible usage of the drivers (i.e. during application setup or\n shutdown).

\n", - "group": "merge" - }, - "git_merge_driver_unregister": { - "type": "function", - "file": "git2/sys/merge.h", - "line": 178, - "lineto": 178, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The name under which the merge driver was registered" - } - ], - "argline": "const char *name", - "sig": "const char *", - "return": { - "type": "int", - "comment": " 0 on success, error code \n<\n0 on failure" - }, - "description": "

Remove the merge driver with the given name.

\n", - "comments": "

Attempting to remove the builtin libgit2 merge drivers is not permitted\n and will return an error.

\n\n

Currently the merge driver registry is not thread safe, so any\n registering or deregistering of drivers must be done outside of any\n possible usage of the drivers (i.e. during application setup or shutdown).

\n", - "group": "merge" - }, - "git_odb_init_backend": { - "type": "function", - "file": "git2/sys/odb_backend.h", - "line": 116, - "lineto": 118, - "args": [ - { - "name": "backend", - "type": "git_odb_backend *", - "comment": "the `git_odb_backend` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version the struct; pass `GIT_ODB_BACKEND_VERSION`" - } - ], - "argline": "git_odb_backend *backend, unsigned int version", - "sig": "git_odb_backend *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_odb_backend with default values. Equivalent to\n creating an instance with GIT_ODB_BACKEND_INIT.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_backend_malloc": { - "type": "function", - "file": "git2/sys/odb_backend.h", - "line": 120, - "lineto": 120, - "args": [ - { - "name": "backend", - "type": "git_odb_backend *", - "comment": null - }, - { - "name": "len", - "type": "size_t", - "comment": null - } - ], - "argline": "git_odb_backend *backend, size_t len", - "sig": "git_odb_backend *::size_t", - "return": { - "type": "void *", - "comment": null - }, - "description": "", - "comments": "", - "group": "odb" - }, - "git_openssl_set_locking": { - "type": "function", - "file": "git2/sys/openssl.h", - "line": 34, - "lineto": 34, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": " 0 on success, -1 if there are errors or if libgit2 was not\n built with OpenSSL and threading support." - }, - "description": "

Initialize the OpenSSL locks

\n", - "comments": "

OpenSSL requires the application to determine how it performs\n locking.

\n\n

This is a last-resort convenience function which libgit2 provides for\n allocating and initializing the locks as well as setting the\n locking function to use the system's native locking functions.

\n\n

The locking function will be cleared and the memory will be freed\n when you call git_threads_sutdown().

\n\n

If your programming language has an OpenSSL package/bindings, it\n likely sets up locking. You should very strongly prefer that over\n this function.

\n", - "group": "openssl" - }, - "git_path_is_gitfile": { - "type": "function", - "file": "git2/sys/path.h", - "line": 60, - "lineto": 60, - "args": [ - { - "name": "path", - "type": "const char *", - "comment": "the path component to check" - }, - { - "name": "pathlen", - "type": "size_t", - "comment": "the length of `path` that is to be checked" - }, - { - "name": "gitfile", - "type": "git_path_gitfile", - "comment": "which file to check against" - }, - { - "name": "fs", - "type": "git_path_fs", - "comment": "which filesystem-specific checks to use" - } - ], - "argline": "const char *path, size_t pathlen, git_path_gitfile gitfile, git_path_fs fs", - "sig": "const char *::size_t::git_path_gitfile::git_path_fs", - "return": { - "type": "int", - "comment": " 0 in case the file does not match, a positive value if\n it does; -1 in case of an error" - }, - "description": "

Check whether a path component corresponds to a .git$SUFFIX\n file.

\n", - "comments": "

As some filesystems do special things to filenames when\n writing files to disk, you cannot always do a plain string\n comparison to verify whether a file name matches an expected\n path or not. This function can do the comparison for you,\n depending on the filesystem you're on.

\n", - "group": "path" - }, - "git_refdb_init_backend": { - "type": "function", - "file": "git2/sys/refdb_backend.h", - "line": 183, - "lineto": 185, - "args": [ - { - "name": "backend", - "type": "git_refdb_backend *", - "comment": "the `git_refdb_backend` struct to initialize" - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version of struct; pass `GIT_REFDB_BACKEND_VERSION`" - } - ], - "argline": "git_refdb_backend *backend, unsigned int version", - "sig": "git_refdb_backend *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_refdb_backend with default values. Equivalent to\n creating an instance with GIT_REFDB_BACKEND_INIT.

\n", - "comments": "", - "group": "refdb" - }, - "git_refdb_backend_fs": { - "type": "function", - "file": "git2/sys/refdb_backend.h", - "line": 198, - "lineto": 200, - "args": [ - { - "name": "backend_out", - "type": "git_refdb_backend **", - "comment": "Output pointer to the git_refdb_backend object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Git repository to access" - } - ], - "argline": "git_refdb_backend **backend_out, git_repository *repo", - "sig": "git_refdb_backend **::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 error code on failure" - }, - "description": "

Constructors for default filesystem-based refdb backend

\n", - "comments": "

Under normal usage, this is called for you when the repository is\n opened / created, but you can use this to explicitly construct a\n filesystem refdb backend for a repository.

\n", - "group": "refdb" - }, - "git_refdb_set_backend": { - "type": "function", - "file": "git2/sys/refdb_backend.h", - "line": 212, - "lineto": 214, - "args": [ - { - "name": "refdb", - "type": "git_refdb *", - "comment": "database to add the backend to" - }, - { - "name": "backend", - "type": "git_refdb_backend *", - "comment": "pointer to a git_refdb_backend instance" - } - ], - "argline": "git_refdb *refdb, git_refdb_backend *backend", - "sig": "git_refdb *::git_refdb_backend *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Sets the custom backend to an existing reference DB

\n", - "comments": "

The git_refdb will take ownership of the git_refdb_backend so you\n should NOT free it after calling this function.

\n", - "group": "refdb" - }, - "git_reflog_entry__alloc": { - "type": "function", - "file": "git2/sys/reflog.h", - "line": 16, - "lineto": 16, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "git_reflog_entry *", - "comment": null - }, - "description": "", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry__free": { - "type": "function", - "file": "git2/sys/reflog.h", - "line": 17, - "lineto": 17, - "args": [ - { - "name": "entry", - "type": "git_reflog_entry *", - "comment": null - } - ], - "argline": "git_reflog_entry *entry", - "sig": "git_reflog_entry *", - "return": { - "type": "void", - "comment": null - }, - "description": "", - "comments": "", - "group": "reflog" - }, - "git_reference__alloc": { - "type": "function", - "file": "git2/sys/refs.h", - "line": 31, - "lineto": 34, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "the reference name" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "the object id for a direct reference" - }, - { - "name": "peel", - "type": "const git_oid *", - "comment": "the first non-tag object's OID, or NULL" - } - ], - "argline": "const char *name, const git_oid *oid, const git_oid *peel", - "sig": "const char *::const git_oid *::const git_oid *", - "return": { - "type": "git_reference *", - "comment": " the created git_reference or NULL on error" - }, - "description": "

Create a new direct reference from an OID.

\n", - "comments": "", - "group": "reference" - }, - "git_reference__alloc_symbolic": { - "type": "function", - "file": "git2/sys/refs.h", - "line": 43, - "lineto": 45, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "the reference name" - }, - { - "name": "target", - "type": "const char *", - "comment": "the target for a symbolic reference" - } - ], - "argline": "const char *name, const char *target", - "sig": "const char *::const char *", - "return": { - "type": "git_reference *", - "comment": " the created git_reference or NULL on error" - }, - "description": "

Create a new symbolic reference.

\n", - "comments": "", - "group": "reference" - }, - "git_repository_new": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 31, - "lineto": 31, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "The blank repository" - } - ], - "argline": "git_repository **out", - "sig": "git_repository **", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new repository with neither backends nor config object

\n", - "comments": "

Note that this is only useful if you wish to associate the repository\n with a non-filesystem-backed object database and config store.

\n", - "group": "repository" - }, - "git_repository__cleanup": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 44, - "lineto": 44, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Reset all the internal state in a repository.

\n", - "comments": "

This will free all the mapped memory and internal objects\n of the repository and leave it in a "blank" state.

\n\n

There's no need to call this function directly unless you're\n trying to aggressively cleanup the repo before its\n deallocation. git_repository_free already performs this operation\n before deallocation the repo.

\n", - "group": "repository" - }, - "git_repository_reinit_filesystem": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 61, - "lineto": 63, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "recurse_submodules", - "type": "int", - "comment": "Should submodules be updated recursively" - } - ], - "argline": "git_repository *repo, int recurse_submodules", - "sig": "git_repository *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n 0 on error" - }, - "description": "

Update the filesystem config settings for an open repository

\n", - "comments": "

When a repository is initialized, config values are set based on the\n properties of the filesystem that the repository is on, such as\n "core.ignorecase", "core.filemode", "core.symlinks", etc. If the\n repository is moved to a new filesystem, these properties may no\n longer be correct and API calls may not behave as expected. This\n call reruns the phase of repository initialization that sets those\n properties to compensate for the current filesystem of the repo.

\n", - "group": "repository" - }, - "git_repository_set_config": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "config", - "type": "git_config *", - "comment": "A Config object" - } - ], - "argline": "git_repository *repo, git_config *config", - "sig": "git_repository *::git_config *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Set the configuration file for this repository

\n", - "comments": "

This configuration file will be used for all configuration\n queries involving this repository.

\n\n

The repository will keep a reference to the config file;\n the user must still free the config after setting it\n to the repository, or it will leak.

\n", - "group": "repository" - }, - "git_repository_set_odb": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 93, - "lineto": 93, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "An ODB object" - } - ], - "argline": "git_repository *repo, git_odb *odb", - "sig": "git_repository *::git_odb *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Set the Object Database for this repository

\n", - "comments": "

The ODB will be used for all object-related operations\n involving this repository.

\n\n

The repository will keep a reference to the ODB; the user\n must still free the ODB object after setting it to the\n repository, or it will leak.

\n", - "group": "repository" - }, - "git_repository_set_refdb": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 108, - "lineto": 108, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "refdb", - "type": "git_refdb *", - "comment": "An refdb object" - } - ], - "argline": "git_repository *repo, git_refdb *refdb", - "sig": "git_repository *::git_refdb *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Set the Reference Database Backend for this repository

\n", - "comments": "

The refdb will be used for all reference related operations\n involving this repository.

\n\n

The repository will keep a reference to the refdb; the user\n must still free the refdb object after setting it to the\n repository, or it will leak.

\n", - "group": "repository" - }, - "git_repository_set_index": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 123, - "lineto": 123, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "index", - "type": "git_index *", - "comment": "An index object" - } - ], - "argline": "git_repository *repo, git_index *index", - "sig": "git_repository *::git_index *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Set the index file for this repository

\n", - "comments": "

This index will be used for all index-related operations\n involving this repository.

\n\n

The repository will keep a reference to the index file;\n the user must still free the index after setting it\n to the repository, or it will leak.

\n", - "group": "repository" - }, - "git_repository_set_bare": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 136, - "lineto": 136, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repo to make bare" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Set a repository to be bare.

\n", - "comments": "

Clear the working directory and set core.bare to true. You may also\n want to call git_repository_set_index(repo, NULL) since a bare repo\n typically does not have an index, but this function will not do that\n for you.

\n", - "group": "repository" - }, - "git_repository_submodule_cache_all": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 149, - "lineto": 150, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository whose submodules will be cached." - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Load and cache all submodules.

\n", - "comments": "

Because the .gitmodules file is unstructured, loading submodules is an\n O(N) operation. Any operation (such as git_rebase_init) that requires\n accessing all submodules is O(N^2) in the number of submodules, if it\n has to look each one up individually. This function loads all submodules\n and caches them so that subsequent calls to git_submodule_lookup are O(1).

\n", - "group": "repository" - }, - "git_repository_submodule_cache_clear": { - "type": "function", - "file": "git2/sys/repository.h", - "line": 164, - "lineto": 165, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository whose submodule cache will be cleared" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Clear the submodule cache.

\n", - "comments": "

Clear the submodule cache populated by git_repository_submodule_cache_all.\n If there is no cache, do nothing.

\n\n

The cache incorporates data from the repository's configuration, as well\n as the state of the working tree, the index, and HEAD. So any time any\n of these has changed, the cache might become invalid.

\n", - "group": "repository" - }, - "git_stream_register": { - "type": "function", - "file": "git2/sys/stream.h", - "line": 98, - "lineto": 99, - "args": [ - { - "name": "type", - "type": "git_stream_t", - "comment": "the type or types of stream to register" - }, - { - "name": "registration", - "type": "git_stream_registration *", - "comment": "the registration data" - } - ], - "argline": "git_stream_t type, git_stream_registration *registration", - "sig": "git_stream_t::git_stream_registration *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Register stream constructors for the library to use

\n", - "comments": "

If a registration structure is already set, it will be overwritten.\n Pass NULL in order to deregister the current constructor and return\n to the system defaults.

\n\n

The type parameter may be a bitwise AND of types.

\n", - "group": "stream" - }, - "git_stream_register_tls": { - "type": "function", - "file": "git2/sys/stream.h", - "line": 130, - "lineto": 130, - "args": [ - { - "name": "ctor", - "type": "git_stream_cb", - "comment": null - } - ], - "argline": "git_stream_cb ctor", - "sig": "git_stream_cb", - "return": { - "type": "int", - "comment": null - }, - "description": "

Register a TLS stream constructor for the library to use. This stream\n will not support HTTP CONNECT proxies. This internally calls\n git_stream_register and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this\n function at this time.

\n", - "group": "stream" - }, - "git_time_monotonic": { - "type": "function", - "file": "git2/sys/time.h", - "line": 27, - "lineto": 27, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "double", - "comment": null - }, - "description": "

Return a monotonic time value, useful for measuring running time\n and setting up timeouts.

\n", - "comments": "

The returned value is an arbitrary point in time -- it can only be\n used when comparing it to another git_time_monotonic call.

\n\n

The time is returned in seconds, with a decimal fraction that differs\n on accuracy based on the underlying system, but should be least\n accurate to Nanoseconds.

\n\n

This function cannot fail.

\n", - "group": "time" - }, - "git_transport_init": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 137, - "lineto": 139, - "args": [ - { - "name": "opts", - "type": "git_transport *", - "comment": "the `git_transport` struct to initialize" - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version of struct; pass `GIT_TRANSPORT_VERSION`" - } - ], - "argline": "git_transport *opts, unsigned int version", - "sig": "git_transport *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_transport with default values. Equivalent to\n creating an instance with GIT_TRANSPORT_INIT.

\n", - "comments": "", - "group": "transport" - }, - "git_transport_new": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 151, - "lineto": 151, - "args": [ - { - "name": "out", - "type": "git_transport **", - "comment": "The newly created transport (out)" - }, - { - "name": "owner", - "type": "git_remote *", - "comment": "The git_remote which will own this transport" - }, - { - "name": "url", - "type": "const char *", - "comment": "The URL to connect to" - } - ], - "argline": "git_transport **out, git_remote *owner, const char *url", - "sig": "git_transport **::git_remote *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Function to use to create a transport from a URL. The transport database\n is scanned to find a transport that implements the scheme of the URI (i.e.\n git:// or http://) and a transport object is returned to the caller.

\n", - "comments": "", - "group": "transport" - }, - "git_transport_ssh_with_paths": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 167, - "lineto": 167, - "args": [ - { - "name": "out", - "type": "git_transport **", - "comment": "the resulting transport" - }, - { - "name": "owner", - "type": "git_remote *", - "comment": "the owning remote" - }, - { - "name": "payload", - "type": "void *", - "comment": "a strarray with the paths" - } - ], - "argline": "git_transport **out, git_remote *owner, void *payload", - "sig": "git_transport **::git_remote *::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an ssh transport with custom git command paths

\n", - "comments": "

This is a factory function suitable for setting as the transport\n callback in a remote (or for a clone in the options).

\n\n

The payload argument must be a strarray pointer with the paths for\n the git-upload-pack and git-receive-pack at index 0 and 1.

\n", - "group": "transport" - }, - "git_transport_register": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 182, - "lineto": 185, - "args": [ - { - "name": "prefix", - "type": "const char *", - "comment": "The scheme (ending in \"://\") to match, i.e. \"git://\"" - }, - { - "name": "cb", - "type": "git_transport_cb", - "comment": "The callback used to create an instance of the transport" - }, - { - "name": "param", - "type": "void *", - "comment": "A fixed parameter to pass to cb at creation time" - } - ], - "argline": "const char *prefix, git_transport_cb cb, void *param", - "sig": "const char *::git_transport_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a custom transport definition, to be used in addition to the built-in\n set of transports that come with libgit2.

\n", - "comments": "

The caller is responsible for synchronizing calls to git_transport_register\n and git_transport_unregister with other calls to the library that\n instantiate transports.

\n", - "group": "transport" - }, - "git_transport_unregister": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 198, - "lineto": 199, - "args": [ - { - "name": "prefix", - "type": "const char *", - "comment": "From the previous call to git_transport_register" - } - ], - "argline": "const char *prefix", - "sig": "const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Unregister a custom transport definition which was previously registered\n with git_transport_register.

\n", - "comments": "

The caller is responsible for synchronizing calls to git_transport_register\n and git_transport_unregister with other calls to the library that\n instantiate transports.

\n", - "group": "transport" - }, - "git_transport_dummy": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 212, - "lineto": 215, - "args": [ - { - "name": "out", - "type": "git_transport **", - "comment": "The newly created transport (out)" - }, - { - "name": "owner", - "type": "git_remote *", - "comment": "The git_remote which will own this transport" - }, - { - "name": "payload", - "type": "void *", - "comment": "You must pass NULL for this parameter." - } - ], - "argline": "git_transport **out, git_remote *owner, void *payload", - "sig": "git_transport **::git_remote *::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an instance of the dummy transport.

\n", - "comments": "", - "group": "transport" - }, - "git_transport_local": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 225, - "lineto": 228, - "args": [ - { - "name": "out", - "type": "git_transport **", - "comment": "The newly created transport (out)" - }, - { - "name": "owner", - "type": "git_remote *", - "comment": "The git_remote which will own this transport" - }, - { - "name": "payload", - "type": "void *", - "comment": "You must pass NULL for this parameter." - } - ], - "argline": "git_transport **out, git_remote *owner, void *payload", - "sig": "git_transport **::git_remote *::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an instance of the local transport.

\n", - "comments": "", - "group": "transport" - }, - "git_transport_smart": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 238, - "lineto": 241, - "args": [ - { - "name": "out", - "type": "git_transport **", - "comment": "The newly created transport (out)" - }, - { - "name": "owner", - "type": "git_remote *", - "comment": "The git_remote which will own this transport" - }, - { - "name": "payload", - "type": "void *", - "comment": "A pointer to a git_smart_subtransport_definition" - } - ], - "argline": "git_transport **out, git_remote *owner, void *payload", - "sig": "git_transport **::git_remote *::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an instance of the smart transport.

\n", - "comments": "", - "group": "transport" - }, - "git_transport_smart_certificate_check": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 255, - "lineto": 255, - "args": [ - { - "name": "transport", - "type": "git_transport *", - "comment": "a smart transport" - }, - { - "name": "cert", - "type": "git_cert *", - "comment": "the certificate to pass to the caller" - }, - { - "name": "valid", - "type": "int", - "comment": "whether we believe the certificate is valid" - }, - { - "name": "hostname", - "type": "const char *", - "comment": "the hostname we connected to" - } - ], - "argline": "git_transport *transport, git_cert *cert, int valid, const char *hostname", - "sig": "git_transport *::git_cert *::int::const char *", - "return": { - "type": "int", - "comment": " the return value of the callback: 0 for no error, GIT_PASSTHROUGH\n to indicate that there is no callback registered (or the callback\n refused to validate the certificate and callers should behave as\n if no callback was set), or \n<\n 0 for an error" - }, - "description": "

Call the certificate check for this transport.

\n", - "comments": "", - "group": "transport" - }, - "git_transport_smart_credentials": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 269, - "lineto": 269, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": "the pointer where the creds are to be stored" - }, - { - "name": "transport", - "type": "git_transport *", - "comment": "a smart transport" - }, - { - "name": "user", - "type": "const char *", - "comment": "the user we saw on the url (if any)" - }, - { - "name": "methods", - "type": "int", - "comment": "available methods for authentication" - } - ], - "argline": "git_cred **out, git_transport *transport, const char *user, int methods", - "sig": "git_cred **::git_transport *::const char *::int", - "return": { - "type": "int", - "comment": " the return value of the callback: 0 for no error, GIT_PASSTHROUGH\n to indicate that there is no callback registered (or the callback\n refused to provide credentials and callers should behave as if no\n callback was set), or \n<\n 0 for an error" - }, - "description": "

Call the credentials callback for this transport

\n", - "comments": "", - "group": "transport" - }, - "git_transport_smart_proxy_options": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 279, - "lineto": 279, - "args": [ - { - "name": "out", - "type": "git_proxy_options *", - "comment": "options struct to fill" - }, - { - "name": "transport", - "type": "git_transport *", - "comment": "the transport to extract the data from." - } - ], - "argline": "git_proxy_options *out, git_transport *transport", - "sig": "git_proxy_options *::git_transport *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Get a copy of the proxy options

\n", - "comments": "

The url is copied and must be freed by the caller.

\n", - "group": "transport" - }, - "git_smart_subtransport_http": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 408, - "lineto": 411, - "args": [ - { - "name": "out", - "type": "git_smart_subtransport **", - "comment": "The newly created subtransport" - }, - { - "name": "owner", - "type": "git_transport *", - "comment": "The smart transport to own this subtransport" - }, - { - "name": "param", - "type": "void *", - "comment": null - } - ], - "argline": "git_smart_subtransport **out, git_transport *owner, void *param", - "sig": "git_smart_subtransport **::git_transport *::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an instance of the http subtransport.

\n", - "comments": "

This subtransport also supports https.

\n", - "group": "smart" - }, - "git_smart_subtransport_git": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 420, - "lineto": 423, - "args": [ - { - "name": "out", - "type": "git_smart_subtransport **", - "comment": "The newly created subtransport" - }, - { - "name": "owner", - "type": "git_transport *", - "comment": "The smart transport to own this subtransport" - }, - { - "name": "param", - "type": "void *", - "comment": null - } - ], - "argline": "git_smart_subtransport **out, git_transport *owner, void *param", - "sig": "git_smart_subtransport **::git_transport *::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an instance of the git subtransport.

\n", - "comments": "", - "group": "smart" - }, - "git_smart_subtransport_ssh": { - "type": "function", - "file": "git2/sys/transport.h", - "line": 432, - "lineto": 435, - "args": [ - { - "name": "out", - "type": "git_smart_subtransport **", - "comment": "The newly created subtransport" - }, - { - "name": "owner", - "type": "git_transport *", - "comment": "The smart transport to own this subtransport" - }, - { - "name": "param", - "type": "void *", - "comment": null - } - ], - "argline": "git_smart_subtransport **out, git_transport *owner, void *param", - "sig": "git_smart_subtransport **::git_transport *::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an instance of the ssh subtransport.

\n", - "comments": "", - "group": "smart" - }, - "git_tag_lookup": { - "type": "function", - "file": "git2/tag.h", - "line": 33, - "lineto": 34, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "pointer to the looked up tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tag." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tag to locate." - } - ], - "argline": "git_tag **out, git_repository *repo, const git_oid *id", - "sig": "git_tag **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tag object from the repository.

\n", - "comments": "", - "group": "tag", - "examples": { - "general.c": [ - "ex/v0.28.0/general.html#git_tag_lookup-84" - ] - } - }, - "git_tag_lookup_prefix": { - "type": "function", - "file": "git2/tag.h", - "line": 48, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "pointer to the looked up tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tag." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tag to locate." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_tag **out, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_tag **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n", - "comments": "", - "group": "tag" - }, - "git_tag_free": { - "type": "function", - "file": "git2/tag.h", - "line": 61, - "lineto": 61, - "args": [ - { - "name": "tag", - "type": "git_tag *", - "comment": "the tag to close" - } - ], - "argline": "git_tag *tag", - "sig": "git_tag *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open tag

\n", - "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to\n release memory. Failure to do so will cause a memory leak.

\n", - "group": "tag", - "examples": { - "general.c": [ - "ex/v0.28.0/general.html#git_tag_free-85" - ] - } - }, - "git_tag_id": { - "type": "function", - "file": "git2/tag.h", - "line": 69, - "lineto": 69, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_oid *", - "comment": " object identity for the tag." - }, - "description": "

Get the id of a tag.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_owner": { - "type": "function", - "file": "git2/tag.h", - "line": 77, - "lineto": 77, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "A previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this tag." - }, - "description": "

Get the repository that contains the tag.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_target": { - "type": "function", - "file": "git2/tag.h", - "line": 89, - "lineto": 89, - "args": [ - { - "name": "target_out", - "type": "git_object **", - "comment": "pointer where to store the target" - }, - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "git_object **target_out, const git_tag *tag", - "sig": "git_object **::const git_tag *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the tagged object of a tag

\n", - "comments": "

This method performs a repository lookup for the\n given object and returns it

\n", - "group": "tag", - "examples": { - "general.c": [ - "ex/v0.28.0/general.html#git_tag_target-86" - ] - } - }, - "git_tag_target_id": { - "type": "function", - "file": "git2/tag.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_oid *", - "comment": " pointer to the OID" - }, - "description": "

Get the OID of the tagged object of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tag_target_id-35" - ] - } - }, - "git_tag_target_type": { - "type": "function", - "file": "git2/tag.h", - "line": 105, - "lineto": 105, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "git_object_t", - "comment": " type of the tagged object" - }, - "description": "

Get the type of a tag's tagged object

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tag_target_type-36" - ], - "general.c": [ - "ex/v0.28.0/general.html#git_tag_target_type-87" - ] - } - }, - "git_tag_name": { - "type": "function", - "file": "git2/tag.h", - "line": 113, - "lineto": 113, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const char *", - "comment": " name of the tag" - }, - "description": "

Get the name of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tag_name-37" - ], - "general.c": [ - "ex/v0.28.0/general.html#git_tag_name-88" - ], - "tag.c": [ - "ex/v0.28.0/tag.html#git_tag_name-20" - ] - } - }, - "git_tag_tagger": { + "git_tag_tagger": { "type": "function", "file": "git2/tag.h", "line": 121, @@ -25030,7 +22426,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tag_tagger-38" + "ex/HEAD/cat-file.html#git_tag_tagger-34" ] } }, @@ -25057,14 +22453,14 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tag_message-39", - "ex/v0.28.0/cat-file.html#git_tag_message-40" + "ex/HEAD/cat-file.html#git_tag_message-35", + "ex/HEAD/cat-file.html#git_tag_message-36" ], "general.c": [ - "ex/v0.28.0/general.html#git_tag_message-89" + "ex/HEAD/general.html#git_tag_message-89" ], "tag.c": [ - "ex/v0.28.0/tag.html#git_tag_message-21" + "ex/HEAD/tag.html#git_tag_message-17" ] } }, @@ -25117,11 +22513,11 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it" }, "description": "

Create a new tag in the repository from an object

\n", - "comments": "

A new reference will also be created pointing to\n this tag object. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The message will not be cleaned up. This can be achieved\n through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid\n the characters '~', '^', ':', '\n\\\n', '?', '[', and '*', and the\n sequences ".." and "\n@\n{" which have special meaning to revparse.

\n", + "comments": "

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.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", "group": "tag", "examples": { "tag.c": [ - "ex/v0.28.0/tag.html#git_tag_create-22" + "ex/HEAD/tag.html#git_tag_create-18" ] } }, @@ -25169,10 +22565,10 @@ "comment": " 0 on success or an error code" }, "description": "

Create a new tag in the object database pointing to a git_object

\n", - "comments": "

The message will not be cleaned up. This can be achieved\n through git_message_prettify().

\n", + "comments": "

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n", "group": "tag" }, - "git_tag_create_frombuffer": { + "git_tag_create_from_buffer": { "type": "function", "file": "git2/tag.h", "line": 220, @@ -25248,11 +22644,11 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object" }, "description": "

Create a new lightweight tag pointing at a target object

\n", - "comments": "

A new direct reference will be created pointing to\n this target object. If force is true and a reference\n already exists with the given name, it'll be replaced.

\n\n

The tag name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", + "comments": "

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.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "tag", "examples": { "tag.c": [ - "ex/v0.28.0/tag.html#git_tag_create_lightweight-23" + "ex/HEAD/tag.html#git_tag_create_lightweight-19" ] } }, @@ -25280,11 +22676,11 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" }, "description": "

Delete an existing tag reference.

\n", - "comments": "

The tag name will be checked for validity.\n See git_tag_create() for rules about valid names.

\n", + "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "tag", "examples": { "tag.c": [ - "ex/v0.28.0/tag.html#git_tag_delete-24" + "ex/HEAD/tag.html#git_tag_delete-20" ] } }, @@ -25312,7 +22708,7 @@ "comment": " 0 or an error code" }, "description": "

Fill a list with all the tags in the Repository

\n", - "comments": "

The string array will be filled with the names of the\n matching tags; these values are owned by the user and\n should be free'd manually when no longer needed, using\n git_strarray_free.

\n", + "comments": "

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.

\n", "group": "tag" }, "git_tag_list_match": { @@ -25344,19 +22740,19 @@ "comment": " 0 or an error code" }, "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", - "comments": "

If an empty pattern is provided, all the tags\n will be returned.

\n\n

The string array will be filled with the names of the\n matching tags; these values are owned by the user and\n should be free'd manually when no longer needed, using\n git_strarray_free.

\n", + "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

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.

\n", "group": "tag", "examples": { "tag.c": [ - "ex/v0.28.0/tag.html#git_tag_list_match-25" + "ex/HEAD/tag.html#git_tag_list_match-21" ] } }, "git_tag_foreach": { "type": "function", "file": "git2/tag.h", - "line": 330, - "lineto": 333, + "line": 339, + "lineto": 342, "args": [ { "name": "repo", @@ -25387,8 +22783,8 @@ "git_tag_peel": { "type": "function", "file": "git2/tag.h", - "line": 346, - "lineto": 348, + "line": 355, + "lineto": 357, "args": [ { "name": "tag_target_out", @@ -25408,14 +22804,14 @@ "comment": " 0 or an error code" }, "description": "

Recursively peel a tag until a non tag git_object is found

\n", - "comments": "

The retrieved tag_target object is owned by the repository\n and should be closed with the git_object_free method.

\n", + "comments": "

The retrieved tag_target object is owned by the repository and should be closed with the git_object_free method.

\n", "group": "tag" }, "git_tag_dup": { "type": "function", "file": "git2/tag.h", - "line": 357, - "lineto": 357, + "line": 366, + "lineto": 366, "args": [ { "name": "out", @@ -25451,12 +22847,12 @@ }, { "name": "cb", - "type": "git_trace_callback", + "type": "git_trace_cb", "comment": "Function to call with trace data" } ], - "argline": "git_trace_level_t level, git_trace_callback cb", - "sig": "git_trace_level_t::git_trace_callback", + "argline": "git_trace_level_t level, git_trace_cb cb", + "sig": "git_trace_level_t::git_trace_cb", "return": { "type": "int", "comment": " 0 or an error code" @@ -25489,7 +22885,7 @@ "comment": " 0 or an error code" }, "description": "

Create a new transaction object

\n", - "comments": "

This does not lock anything, but sets up the transaction object to\n know from which repository to lock.

\n", + "comments": "

This does not lock anything, but sets up the transaction object to know from which repository to lock.

\n", "group": "transaction" }, "git_transaction_lock_ref": { @@ -25516,7 +22912,7 @@ "comment": " 0 or an error message" }, "description": "

Lock a reference

\n", - "comments": "

Lock the specified reference. This is the first step to updating a\n reference.

\n", + "comments": "

Lock the specified reference. This is the first step to updating a reference.

\n", "group": "transaction" }, "git_transaction_set_target": { @@ -25558,7 +22954,7 @@ "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" }, "description": "

Set the target of a reference

\n", - "comments": "

Set the target of the specified reference. This reference must be\n locked.

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", "group": "transaction" }, "git_transaction_set_symbolic_target": { @@ -25600,7 +22996,7 @@ "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" }, "description": "

Set the target of a reference

\n", - "comments": "

Set the target of the specified reference. This reference must be\n locked.

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", "group": "transaction" }, "git_transaction_set_reflog": { @@ -25632,7 +23028,7 @@ "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" }, "description": "

Set the reflog of a reference

\n", - "comments": "

Set the specified reference's reflog. If this is combined with\n setting the target, that update won't be written to the reflog.

\n", + "comments": "

Set the specified reference's reflog. If this is combined with setting the target, that update won't be written to the reflog.

\n", "group": "transaction" }, "git_transaction_remove": { @@ -25681,7 +23077,7 @@ "comment": " 0 or an error code" }, "description": "

Commit the changes from the transaction

\n", - "comments": "

Perform the changes that have been queued. The updates will be made\n one by one, and the first failure will stop the processing.

\n", + "comments": "

Perform the changes that have been queued. The updates will be made one by one, and the first failure will stop the processing.

\n", "group": "transaction" }, "git_transaction_free": { @@ -25703,7 +23099,7 @@ "comment": null }, "description": "

Free the resources allocated by this transaction

\n", - "comments": "

If any references remain locked, they will be unlocked without any\n changes made to them.

\n", + "comments": "

If any references remain locked, they will be unlocked without any changes made to them.

\n", "group": "transaction" }, "git_cred_has_username": { @@ -25820,7 +23216,7 @@ }, { "name": "prompt_callback", - "type": "git_cred_ssh_interactive_callback", + "type": "git_cred_ssh_interactive_cb", "comment": "The callback method used for prompts." }, { @@ -25829,8 +23225,8 @@ "comment": "Additional data to pass to the callback." } ], - "argline": "git_cred **out, const char *username, git_cred_ssh_interactive_callback prompt_callback, void *payload", - "sig": "git_cred **::const char *::git_cred_ssh_interactive_callback::void *", + "argline": "git_cred **out, const char *username, git_cred_ssh_interactive_cb prompt_callback, void *payload", + "sig": "git_cred **::const char *::git_cred_ssh_interactive_cb::void *", "return": { "type": "int", "comment": " 0 for success or an error code for failure." @@ -25894,7 +23290,7 @@ }, { "name": "sign_callback", - "type": "git_cred_sign_callback", + "type": "git_cred_sign_cb", "comment": "The callback method to sign the data during the challenge." }, { @@ -25903,14 +23299,14 @@ "comment": "Additional data to pass to the callback." } ], - "argline": "git_cred **out, const char *username, const char *publickey, size_t publickey_len, git_cred_sign_callback sign_callback, void *payload", - "sig": "git_cred **::const char *::const char *::size_t::git_cred_sign_callback::void *", + "argline": "git_cred **out, const char *username, const char *publickey, size_t publickey_len, git_cred_sign_cb sign_callback, void *payload", + "sig": "git_cred **::const char *::const char *::size_t::git_cred_sign_cb::void *", "return": { "type": "int", "comment": " 0 for success or an error code for failure" }, "description": "

Create an ssh key credential with a custom signing function.

\n", - "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness\n and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", + "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", "group": "cred" }, "git_cred_default_new": { @@ -25959,7 +23355,7 @@ "comment": null }, "description": "

Create a credential to specify a username.

\n", - "comments": "

This is used with ssh authentication to query for the username if\n none is specified in the url.

\n", + "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", "group": "cred" }, "git_cred_ssh_key_memory_new": { @@ -26023,7 +23419,7 @@ "comment": null }, "description": "

Free a credential.

\n", - "comments": "

This is only necessary if you own the object; that is, if you are a\n transport.

\n", + "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", "group": "cred" }, "git_tree_lookup": { @@ -26059,14 +23455,14 @@ "group": "tree", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_tree_lookup-90", - "ex/v0.28.0/general.html#git_tree_lookup-91" + "ex/HEAD/general.html#git_tree_lookup-90", + "ex/HEAD/general.html#git_tree_lookup-91" ], "init.c": [ - "ex/v0.28.0/init.html#git_tree_lookup-14" + "ex/HEAD/init.html#git_tree_lookup-12" ], "merge.c": [ - "ex/v0.28.0/merge.html#git_tree_lookup-41" + "ex/HEAD/merge.html#git_tree_lookup-37" ] } }, @@ -26126,26 +23522,26 @@ "comment": null }, "description": "

Close an open tree

\n", - "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to\n release memory. Failure to do so will cause a memory leak.

\n", + "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", "group": "tree", "examples": { "diff.c": [ - "ex/v0.28.0/diff.html#git_tree_free-17", - "ex/v0.28.0/diff.html#git_tree_free-18" + "ex/HEAD/diff.html#git_tree_free-13", + "ex/HEAD/diff.html#git_tree_free-14" ], "general.c": [ - "ex/v0.28.0/general.html#git_tree_free-92", - "ex/v0.28.0/general.html#git_tree_free-93" + "ex/HEAD/general.html#git_tree_free-92", + "ex/HEAD/general.html#git_tree_free-93" ], "init.c": [ - "ex/v0.28.0/init.html#git_tree_free-15" + "ex/HEAD/init.html#git_tree_free-13" ], "log.c": [ - "ex/v0.28.0/log.html#git_tree_free-59", - "ex/v0.28.0/log.html#git_tree_free-60", - "ex/v0.28.0/log.html#git_tree_free-61", - "ex/v0.28.0/log.html#git_tree_free-62", - "ex/v0.28.0/log.html#git_tree_free-63" + "ex/HEAD/log.html#git_tree_free-55", + "ex/HEAD/log.html#git_tree_free-56", + "ex/HEAD/log.html#git_tree_free-57", + "ex/HEAD/log.html#git_tree_free-58", + "ex/HEAD/log.html#git_tree_free-59" ] } }, @@ -26216,10 +23612,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tree_entrycount-41" + "ex/HEAD/cat-file.html#git_tree_entrycount-37" ], "general.c": [ - "ex/v0.28.0/general.html#git_tree_entrycount-94" + "ex/HEAD/general.html#git_tree_entrycount-94" ] } }, @@ -26247,11 +23643,11 @@ "comment": " the tree entry; NULL if not found" }, "description": "

Lookup a tree entry by its filename

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", "group": "tree", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_tree_entry_byname-95" + "ex/HEAD/general.html#git_tree_entry_byname-95" ] } }, @@ -26279,14 +23675,14 @@ "comment": " the tree entry; NULL if not found" }, "description": "

Lookup a tree entry by its position in the tree

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tree_entry_byindex-42" + "ex/HEAD/cat-file.html#git_tree_entry_byindex-38" ], "general.c": [ - "ex/v0.28.0/general.html#git_tree_entry_byindex-96" + "ex/HEAD/general.html#git_tree_entry_byindex-96" ] } }, @@ -26314,7 +23710,7 @@ "comment": " the tree entry; NULL if not found" }, "description": "

Lookup a tree entry by SHA value.

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't\n have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", "group": "tree" }, "git_tree_entry_bypath": { @@ -26346,7 +23742,7 @@ "comment": " 0 on success; GIT_ENOTFOUND if the path does not exist" }, "description": "

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n", - "comments": "

Unlike the other lookup functions, the returned tree entry is owned by\n the user and must be freed explicitly with git_tree_entry_free().

\n", + "comments": "

Unlike the other lookup functions, the returned tree entry is owned by the user and must be freed explicitly with git_tree_entry_free().

\n", "group": "tree" }, "git_tree_entry_dup": { @@ -26373,7 +23769,7 @@ "comment": " 0 or an error code" }, "description": "

Duplicate a tree entry

\n", - "comments": "

Create a copy of a tree entry. The returned copy is owned by the user,\n and must be freed explicitly with git_tree_entry_free().

\n", + "comments": "

Create a copy of a tree entry. The returned copy is owned by the user, and must be freed explicitly with git_tree_entry_free().

\n", "group": "tree" }, "git_tree_entry_free": { @@ -26395,7 +23791,7 @@ "comment": null }, "description": "

Free a user-owned tree entry

\n", - "comments": "

IMPORTANT: This function is only needed for tree entries owned by the\n user, such as the ones returned by git_tree_entry_dup() or\n git_tree_entry_bypath().

\n", + "comments": "

IMPORTANT: This function is only needed for tree entries owned by the user, such as the ones returned by git_tree_entry_dup() or git_tree_entry_bypath().

\n", "group": "tree" }, "git_tree_entry_name": { @@ -26421,11 +23817,11 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tree_entry_name-43" + "ex/HEAD/cat-file.html#git_tree_entry_name-39" ], "general.c": [ - "ex/v0.28.0/general.html#git_tree_entry_name-97", - "ex/v0.28.0/general.html#git_tree_entry_name-98" + "ex/HEAD/general.html#git_tree_entry_name-97", + "ex/HEAD/general.html#git_tree_entry_name-98" ] } }, @@ -26452,7 +23848,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tree_entry_id-44" + "ex/HEAD/cat-file.html#git_tree_entry_id-40" ] } }, @@ -26479,7 +23875,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tree_entry_type-45" + "ex/HEAD/cat-file.html#git_tree_entry_type-41" ] } }, @@ -26506,7 +23902,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.28.0/cat-file.html#git_tree_entry_filemode-46" + "ex/HEAD/cat-file.html#git_tree_entry_filemode-42" ] } }, @@ -26529,7 +23925,7 @@ "comment": " filemode as an integer" }, "description": "

Get the raw UNIX file attributes of a tree entry

\n", - "comments": "

This function does not perform any normalization and is only useful\n if you need to be able to recreate the original tree object.

\n", + "comments": "

This function does not perform any normalization and is only useful if you need to be able to recreate the original tree object.

\n", "group": "tree" }, "git_tree_entry_cmp": { @@ -26592,7 +23988,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/v0.28.0/general.html#git_tree_entry_to_object-99" + "ex/HEAD/general.html#git_tree_entry_to_object-99" ] } }, @@ -26625,7 +24021,7 @@ "comment": " 0 on success; error code otherwise" }, "description": "

Create a new tree builder.

\n", - "comments": "

The tree builder can be used to create or modify trees in memory and\n write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be\n initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no\n entries and will have to be filled manually.

\n", + "comments": "

The tree builder can be used to create or modify trees in memory and write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no entries and will have to be filled manually.

\n", "group": "treebuilder" }, "git_treebuilder_clear": { @@ -26691,7 +24087,7 @@ "comment": null }, "description": "

Free a tree builder

\n", - "comments": "

This will clear all the entries and free to builder.\n Failing to free the builder after you're done using it\n will result in a memory leak

\n", + "comments": "

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

\n", "group": "treebuilder" }, "git_treebuilder_get": { @@ -26718,7 +24114,7 @@ "comment": " pointer to the entry; NULL if not found" }, "description": "

Get an entry from the builder from its filename

\n", - "comments": "

The returned entry is owned by the builder and should\n not be freed manually.

\n", + "comments": "

The returned entry is owned by the builder and should not be freed manually.

\n", "group": "treebuilder" }, "git_treebuilder_insert": { @@ -26760,7 +24156,7 @@ "comment": " 0 or an error code" }, "description": "

Add or update an entry to the builder

\n", - "comments": "

Insert a new entry for filename in the builder with the\n given attributes.

\n\n

If an entry named filename already exists, its attributes\n will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the\n newly created/updated entry. Pass NULL if you do not need it. The\n pointer may not be valid past the next operation in this\n builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for\n validity; that it exists in the object database and is of the\n correct type. If you do not want this behavior, set the\n GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", + "comments": "

Insert a new entry for filename in the builder with the given attributes.

\n\n

If an entry named filename already exists, its attributes will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the newly created/updated entry. Pass NULL if you do not need it. The pointer may not be valid past the next operation in this builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for validity; that it exists in the object database and is of the correct type. If you do not want this behavior, set the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", "group": "treebuilder" }, "git_treebuilder_remove": { @@ -26819,7 +24215,7 @@ "comment": null }, "description": "

Selectively remove entries in the tree

\n", - "comments": "

The filter callback will be called for each entry in the tree with a\n pointer to the entry and the provided payload; if the callback returns\n non-zero, the entry will be filtered (removed from the builder).

\n", + "comments": "

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 non-zero, the entry will be filtered (removed from the builder).

\n", "group": "treebuilder" }, "git_treebuilder_write": { @@ -26846,7 +24242,7 @@ "comment": " 0 or an error code" }, "description": "

Write the contents of the tree builder as a tree object

\n", - "comments": "

The tree builder will be written to the given repo, and its\n identifying SHA1 hash will be stored in the id pointer.

\n", + "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", "group": "treebuilder" }, "git_treebuilder_write_with_buffer": { @@ -26915,7 +24311,7 @@ "comment": " 0 or an error code" }, "description": "

Traverse the entries in a tree and its subtrees in post or pre order.

\n", - "comments": "

The entries will be traversed in the specified order, children subtrees\n will be automatically loaded as required, and the callback will be\n called once per entry with the current (relative) root for the entry and\n the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be\n skipped on the traversal (in pre mode). A negative value stops the walk.

\n", + "comments": "

The entries will be traversed in the specified order, children subtrees will be automatically loaded as required, and the callback will be called once per entry with the current (relative) root for the entry and the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be skipped on the traversal (in pre mode). A negative value stops the walk.

\n", "group": "tree" }, "git_tree_dup": { @@ -26984,7 +24380,7 @@ "comment": null }, "description": "

Create a tree based on another one with the specified modifications

\n", - "comments": "

Given the baseline perform the changes described in the list of\n updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and\n replacement in trees. It is much more efficient than reading the tree into a\n git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing\n a tree to a blob or viceversa is not supported.

\n", + "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", "group": "tree" }, "git_worktree_list": { @@ -27011,7 +24407,7 @@ "comment": " 0 or an error code" }, "description": "

List names of linked working trees

\n", - "comments": "

The returned list should be released with git_strarray_free\n when no longer needed.

\n", + "comments": "

The returned list should be released with git_strarray_free when no longer needed.

\n", "group": "worktree" }, "git_worktree_lookup": { @@ -27070,7 +24466,7 @@ "comment": null }, "description": "

Open a worktree of a given repository

\n", - "comments": "

If a repository is not the main tree but a worktree, this\n function will look up the worktree inside the parent\n repository and create a new git_worktree structure.

\n", + "comments": "

If a repository is not the main tree but a worktree, this function will look up the worktree inside the parent repository and create a new git_worktree structure.

\n", "group": "worktree" }, "git_worktree_free": { @@ -27114,10 +24510,10 @@ "comment": " 0 when worktree is valid, error-code otherwise" }, "description": "

Check if worktree is valid

\n", - "comments": "

A valid worktree requires both the git data structures inside\n the linked parent repository and the linked working copy to be\n present.

\n", + "comments": "

A valid worktree requires both the git data structures inside the linked parent repository and the linked working copy to be present.

\n", "group": "worktree" }, - "git_worktree_add_init_options": { + "git_worktree_add_options_init": { "type": "function", "file": "git2/worktree.h", "line": 104, @@ -27141,7 +24537,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_worktree_add_options structure

\n", - "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to\n creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", "group": "worktree" }, "git_worktree_add": { @@ -27183,7 +24579,7 @@ "comment": " 0 or an error code" }, "description": "

Add a new working tree

\n", - "comments": "

Add a new working tree for the repository, that is create the\n required data structures inside the repository and check out\n the current HEAD at path

\n", + "comments": "

Add a new working tree for the repository, that is create the required data structures inside the repository and check out the current HEAD at path

\n", "group": "worktree" }, "git_worktree_lock": { @@ -27210,7 +24606,7 @@ "comment": " 0 on success, non-zero otherwise" }, "description": "

Lock worktree if not already locked

\n", - "comments": "

Lock a worktree, optionally specifying a reason why the linked\n working tree is being locked.

\n", + "comments": "

Lock a worktree, optionally specifying a reason why the linked working tree is being locked.

\n", "group": "worktree" }, "git_worktree_unlock": { @@ -27259,7 +24655,7 @@ "comment": " 0 when the working tree not locked, a value greater\n than zero if it is locked, less than zero if there was an\n error" }, "description": "

Check if worktree is locked

\n", - "comments": "

A worktree may be locked if the linked working tree is stored\n on a portable device which is not available.

\n", + "comments": "

A worktree may be locked if the linked working tree is stored on a portable device which is not available.

\n", "group": "worktree" }, "git_worktree_name": { @@ -27306,7 +24702,7 @@ "comments": "", "group": "worktree" }, - "git_worktree_prune_init_options": { + "git_worktree_prune_options_init": { "type": "function", "file": "git2/worktree.h", "line": 217, @@ -27330,7 +24726,7 @@ "comment": " Zero on success; -1 on failure." }, "description": "

Initialize git_worktree_prune_options structure

\n", - "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to\n creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", + "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", "group": "worktree" }, "git_worktree_is_prunable": { @@ -27357,7 +24753,7 @@ "comment": null }, "description": "

Is the worktree prunable with the given options?

\n", - "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The\nvalid member will cause this check to be ignored.
  • \n
  • the worktree is locked. The locked flag will cause this\ncheck to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above\n flags have been passed in, this function will return a\n positive value.

\n", + "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The valid member will cause this check to be ignored. - the worktree is locked. The locked flag will cause this check to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above flags have been passed in, this function will return a positive value.

\n", "group": "worktree" }, "git_worktree_prune": { @@ -27384,7 +24780,7 @@ "comment": " 0 or an error code" }, "description": "

Prune working tree

\n", - "comments": "

Prune the working tree, that is remove the git data\n structures on disk. The repository will only be pruned of\n git_worktree_is_prunable succeeds.

\n", + "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", "group": "worktree" } }, @@ -27413,7 +24809,7 @@ "comment": null }, "description": "

When applying a patch, callback that will be made per delta (file).

\n", - "comments": "

When the callback:\n - returns \n<\n 0, the apply process will be aborted.\n - returns > 0, the delta will not be applied, but the apply process\n continues\n - returns 0, the delta is applied, and the apply process continues.

\n" + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the delta will not be applied, but the apply process continues - returns 0, the delta is applied, and the apply process continues.

\n" }, "git_apply_hunk_cb": { "type": "callback", @@ -27439,7 +24835,7 @@ "comment": null }, "description": "

When applying a patch, callback that will be made per hunk.

\n", - "comments": "

When the callback:\n - returns \n<\n 0, the apply process will be aborted.\n - returns > 0, the hunk will not be applied, but the apply process\n continues\n - returns 0, the hunk is applied, and the apply process continues.

\n" + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n" }, "git_attr_foreach_cb": { "type": "callback", @@ -27470,13 +24866,13 @@ "comment": " 0 to continue looping, non-zero to stop. This value will be returned\n from git_attr_foreach." }, "description": "

The callback used with git_attr_foreach.

\n", - "comments": "

This callback will be invoked only once per attribute name, even if there\n are multiple rules for a given file. The highest priority rule will be\n used.

\n" + "comments": "

This callback will be invoked only once per attribute name, even if there are multiple rules for a given file. The highest priority rule will be used.

\n" }, "git_checkout_notify_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 223, - "lineto": 229, + "line": 236, + "lineto": 242, "args": [ { "name": "why", @@ -27521,8 +24917,8 @@ "git_checkout_progress_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 232, - "lineto": 236, + "line": 245, + "lineto": 249, "args": [ { "name": "path", @@ -27557,8 +24953,8 @@ "git_checkout_perfdata_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 239, - "lineto": 241, + "line": 252, + "lineto": 254, "args": [ { "name": "perfdata", @@ -27619,7 +25015,7 @@ "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" }, "description": "

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n", - "comments": "

Callers of git_clone may provide a function matching this signature to override\n the remote creation and customization process during a clone operation.

\n" + "comments": "

Callers of git_clone may provide a function matching this signature to override the remote creation and customization process during a clone operation.

\n" }, "git_repository_create_cb": { "type": "callback", @@ -27655,7 +25051,7 @@ "comment": " 0, or a negative value to indicate error" }, "description": "

The signature of a function matchin git_repository_init, with an\n aditional void * as callback payload.

\n", - "comments": "

Callers of git_clone my provide a function matching this signature\n to override the repository creation and customization process\n during a clone operation.

\n" + "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" }, "git_config_foreach_cb": { "type": "callback", @@ -27683,6 +25079,32 @@ "description": "

A config enumeration callback

\n", "comments": "" }, + "git_headlist_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 409, + "lineto": 409, + "args": [ + { + "name": "rhead", + "type": "git_remote_head *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_remote_head *rhead, void *payload", + "sig": "git_remote_head *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for listing the remote heads

\n", + "comments": "" + }, "git_diff_notify_cb": { "type": "callback", "file": "git2/diff.h", @@ -27717,7 +25139,7 @@ "comment": null }, "description": "

Diff notification callback function.

\n", - "comments": "

The callback will be called for each file, just before the git_diff_delta\n gets inserted into the diff.

\n\n

When the callback:\n - returns \n<\n 0, the diff process will be aborted.\n - returns > 0, the delta will not be inserted into the diff, but the\n diff process continues.\n - returns 0, the delta is inserted into the diff, and the diff process\n continues.

\n" + "comments": "

The callback will be called for each file, just before the git_diff_delta gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" }, "git_diff_progress_cb": { "type": "callback", @@ -27882,7 +25304,7 @@ "comment": null }, "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", - "comments": "

When printing a diff, callback that will be made to output each line\n of text. This uses some extra GIT_DIFF_LINE_... constants for output\n of lines of file and hunk headers.

\n" + "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" }, "git_index_matched_path_cb": { "type": "callback", @@ -27915,30 +25337,30 @@ "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", "comments": "" }, - "git_headlist_cb": { + "git_indexer_progress_cb": { "type": "callback", - "file": "git2/net.h", - "line": 55, - "lineto": 55, + "file": "git2/indexer.h", + "line": 57, + "lineto": 57, "args": [ { - "name": "rhead", - "type": "git_remote_head *", - "comment": null + "name": "stats", + "type": "const git_indexer_progress *", + "comment": "Structure containing information about the state of the tran sfer" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Payload provided by caller" } ], - "argline": "git_remote_head *rhead, void *payload", - "sig": "git_remote_head *::void *", + "argline": "const git_indexer_progress *stats, void *payload", + "sig": "const git_indexer_progress *::void *", "return": { "type": "int", "comment": null }, - "description": "

Callback for listing the remote heads

\n", + "description": "

Type for progress callbacks during indexing. Return a value less\n than zero to cancel the indexing or download.

\n", "comments": "" }, "git_note_foreach_cb": { @@ -27970,13 +25392,13 @@ "comment": null }, "description": "

Callback for git_note_foreach.

\n", - "comments": "

Receives:\n - blob_id: Oid of the blob containing the message\n - annotated_object_id: Oid of the git object being annotated\n - payload: Payload data passed to git_note_foreach

\n" + "comments": "

Receives: - blob_id: Oid of the blob containing the message - annotated_object_id: Oid of the git object being annotated - payload: Payload data passed to git_note_foreach

\n" }, "git_odb_foreach_cb": { "type": "callback", "file": "git2/odb.h", - "line": 27, - "lineto": 27, + "line": 28, + "lineto": 28, "args": [ { "name": "id", @@ -28001,39 +25423,39 @@ "git_packbuilder_foreach_cb": { "type": "callback", "file": "git2/pack.h", - "line": 181, - "lineto": 181, + "line": 192, + "lineto": 192, "args": [ { "name": "buf", "type": "void *", - "comment": null + "comment": "A pointer to the object's data" }, { "name": "size", "type": "size_t", - "comment": null + "comment": "The size of the underlying object" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Payload passed to git_packbuilder_foreach" } ], "argline": "void *buf, size_t size, void *payload", "sig": "void *::size_t::void *", "return": { "type": "int", - "comment": null + "comment": " non-zero to terminate the iteration" }, - "description": "", + "description": "

Callback used to iterate over packed objects

\n", "comments": "" }, "git_packbuilder_progress": { "type": "callback", "file": "git2/pack.h", - "line": 210, - "lineto": 214, + "line": 221, + "lineto": 225, "args": [ { "name": "stage", @@ -28042,12 +25464,12 @@ }, { "name": "current", - "type": "int", + "type": "uint32_t", "comment": null }, { "name": "total", - "type": "int", + "type": "uint32_t", "comment": null }, { @@ -28056,8 +25478,8 @@ "comment": null } ], - "argline": "int stage, int current, int total, void *payload", - "sig": "int::int::int::void *", + "argline": "int stage, uint32_t current, uint32_t total, void *payload", + "sig": "int::uint32_t::uint32_t::void *", "return": { "type": "int", "comment": null @@ -28068,56 +25490,56 @@ "git_reference_foreach_cb": { "type": "callback", "file": "git2/refs.h", - "line": 425, - "lineto": 425, + "line": 434, + "lineto": 434, "args": [ { "name": "reference", "type": "git_reference *", - "comment": null + "comment": "The reference object" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Payload passed to git_reference_foreach" } ], "argline": "git_reference *reference, void *payload", "sig": "git_reference *::void *", "return": { "type": "int", - "comment": null + "comment": " non-zero to terminate the iteration" }, - "description": "", + "description": "

Callback used to iterate over references

\n", "comments": "" }, "git_reference_foreach_name_cb": { "type": "callback", "file": "git2/refs.h", - "line": 426, - "lineto": 426, + "line": 445, + "lineto": 445, "args": [ { "name": "name", "type": "const char *", - "comment": null + "comment": "The reference name" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Payload passed to git_reference_foreach_name" } ], "argline": "const char *name, void *payload", "sig": "const char *::void *", "return": { "type": "int", - "comment": null + "comment": " non-zero to terminate the iteration" }, - "description": "", + "description": "

Callback used to iterate over reference names

\n", "comments": "" }, - "git_push_transfer_progress": { + "git_push_transfer_progress_cb": { "type": "callback", "file": "git2/remote.h", "line": 425, @@ -28156,8 +25578,8 @@ "git_push_negotiation": { "type": "callback", "file": "git2/remote.h", - "line": 460, - "lineto": 460, + "line": 461, + "lineto": 461, "args": [ { "name": "updates", @@ -28187,8 +25609,8 @@ "git_push_update_reference_cb": { "type": "callback", "file": "git2/remote.h", - "line": 474, - "lineto": 474, + "line": 475, + "lineto": 475, "args": [ { "name": "refname", @@ -28213,73 +25635,109 @@ "comment": " 0 on success, otherwise an error" }, "description": "

Callback used to inform of the update status from the remote.

\n", - "comments": "

Called for each updated reference on push. If status is\n not NULL, the update was rejected by the remote server\n and status contains the reason given.

\n" + "comments": "

Called for each updated reference on push. If status is not NULL, the update was rejected by the remote server and status contains the reason given.

\n" + }, + "git_url_resolve_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 489, + "lineto": 489, + "args": [ + { + "name": "url_resolved", + "type": "git_buf *", + "comment": "The buffer to write the resolved URL to" + }, + { + "name": "url", + "type": "const char *", + "comment": "The URL to resolve" + }, + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_buf *url_resolved, const char *url, int direction, void *payload", + "sig": "git_buf *::const char *::int::void *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_PASSTHROUGH or an error" + }, + "description": "

Callback to resolve URLs before connecting to remote

\n", + "comments": "

If you return GIT_PASSTHROUGH, you don't need to write anything to url_resolved.

\n" }, "git_repository_fetchhead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 643, - "lineto": 647, + "line": 655, + "lineto": 659, "args": [ { "name": "ref_name", "type": "const char *", - "comment": null + "comment": "The reference name" }, { "name": "remote_url", "type": "const char *", - "comment": null + "comment": "The remote URL" }, { "name": "oid", "type": "const git_oid *", - "comment": null + "comment": "The reference target OID" }, { "name": "is_merge", "type": "unsigned int", - "comment": null + "comment": "Was the reference the result of a merge" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Payload passed to git_repository_fetchhead_foreach" } ], "argline": "const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload", "sig": "const char *::const char *::const git_oid *::unsigned int::void *", "return": { "type": "int", - "comment": null + "comment": " non-zero to terminate the iteration" }, - "description": "", + "description": "

Callback used to iterate over each FETCH_HEAD entry

\n", "comments": "" }, "git_repository_mergehead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 665, - "lineto": 666, + "line": 686, + "lineto": 687, "args": [ { "name": "oid", "type": "const git_oid *", - "comment": null + "comment": "The merge OID" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Payload passed to git_repository_mergehead_foreach" } ], "argline": "const git_oid *oid, void *payload", "sig": "const git_oid *::void *", "return": { "type": "int", - "comment": null + "comment": " non-zero to terminate the iteration" }, - "description": "", + "description": "

Callback used to iterate over each MERGE_HEAD entry

\n", "comments": "" }, "git_revwalk_hide_cb": { @@ -28432,374 +25890,38 @@ "description": "

Function pointer to receive each submodule

\n", "comments": "" }, - "git_filter_init_fn": { - "type": "callback", - "file": "git2/sys/filter.h", - "line": 141, - "lineto": 141, - "args": [ - { - "name": "self", - "type": "git_filter *", - "comment": null - } - ], - "argline": "git_filter *self", - "sig": "git_filter *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Initialize callback on filter

\n", - "comments": "

Specified as filter.initialize, this is an optional callback invoked\n before a filter is first used. It will be called once at most.

\n\n

If non-NULL, the filter's initialize callback will be invoked right\n before the first use of the filter, so you can defer expensive\n initialization operations (in case libgit2 is being used in a way that\n doesn't need the filter).

\n" - }, - "git_filter_shutdown_fn": { - "type": "callback", - "file": "git2/sys/filter.h", - "line": 153, - "lineto": 153, - "args": [ - { - "name": "self", - "type": "git_filter *", - "comment": null - } - ], - "argline": "git_filter *self", - "sig": "git_filter *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Shutdown callback on filter

\n", - "comments": "

Specified as filter.shutdown, this is an optional callback invoked\n when the filter is unregistered or when libgit2 is shutting down. It\n will be called once at most and should release resources as needed.\n This may be called even if the initialize callback was not made.

\n\n

Typically this function will free the git_filter object itself.

\n" - }, - "git_filter_check_fn": { - "type": "callback", - "file": "git2/sys/filter.h", - "line": 175, - "lineto": 179, - "args": [ - { - "name": "self", - "type": "git_filter *", - "comment": null - }, - { - "name": "payload", - "type": "void **", - "comment": null - }, - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - }, - { - "name": "attr_values", - "type": "const char **", - "comment": null - } - ], - "argline": "git_filter *self, void **payload, const git_filter_source *src, const char **attr_values", - "sig": "git_filter *::void **::const git_filter_source *::const char **", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback to decide if a given source needs this filter

\n", - "comments": "

Specified as filter.check, this is an optional callback that checks\n if filtering is needed for a given source.

\n\n

It should return 0 if the filter should be applied (i.e. success),\n GIT_PASSTHROUGH if the filter should not be applied, or an error code\n to fail out of the filter processing pipeline and return to the caller.

\n\n

The attr_values will be set to the values of any attributes given in\n the filter definition. See git_filter below for more detail.

\n\n

The payload will be a pointer to a reference payload for the filter.\n This will start as NULL, but check can assign to this pointer for\n later use by the apply callback. Note that the value should be heap\n allocated (not stack), so that it doesn't go away before the apply\n callback can use it. If a filter allocates and assigns a value to the\n payload, it will need a cleanup callback to free the payload.

\n" - }, - "git_filter_apply_fn": { - "type": "callback", - "file": "git2/sys/filter.h", - "line": 193, - "lineto": 198, - "args": [ - { - "name": "self", - "type": "git_filter *", - "comment": null - }, - { - "name": "payload", - "type": "void **", - "comment": null - }, - { - "name": "to", - "type": "git_buf *", - "comment": null - }, - { - "name": "from", - "type": "const git_buf *", - "comment": null - }, - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - } - ], - "argline": "git_filter *self, void **payload, git_buf *to, const git_buf *from, const git_filter_source *src", - "sig": "git_filter *::void **::git_buf *::const git_buf *::const git_filter_source *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback to actually perform the data filtering

\n", - "comments": "

Specified as filter.apply, this is the callback that actually filters\n data. If it successfully writes the output, it should return 0. Like\n check, it can return GIT_PASSTHROUGH to indicate that the filter\n doesn't want to run. Other error codes will stop filter processing and\n return to the caller.

\n\n

The payload value will refer to any payload that was set by the\n check callback. It may be read from or written to as needed.

\n" - }, - "git_filter_stream_fn": { - "type": "callback", - "file": "git2/sys/filter.h", - "line": 200, - "lineto": 205, - "args": [ - { - "name": "out", - "type": "git_writestream **", - "comment": null - }, - { - "name": "self", - "type": "git_filter *", - "comment": null - }, - { - "name": "payload", - "type": "void **", - "comment": null - }, - { - "name": "src", - "type": "const git_filter_source *", - "comment": null - }, - { - "name": "next", - "type": "git_writestream *", - "comment": null - } - ], - "argline": "git_writestream **out, git_filter *self, void **payload, const git_filter_source *src, git_writestream *next", - "sig": "git_writestream **::git_filter *::void **::const git_filter_source *::git_writestream *", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "" - }, - "git_filter_cleanup_fn": { - "type": "callback", - "file": "git2/sys/filter.h", - "line": 215, - "lineto": 217, - "args": [ - { - "name": "self", - "type": "git_filter *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_filter *self, void *payload", - "sig": "git_filter *::void *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Callback to clean up after filtering has been applied

\n", - "comments": "

Specified as filter.cleanup, this is an optional callback invoked\n after the filter has been applied. If the check or apply callbacks\n allocated a payload to keep per-source filter state, use this\n callback to free that payload and release resources as required.

\n" - }, - "git_merge_driver_init_fn": { - "type": "callback", - "file": "git2/sys/merge.h", - "line": 76, - "lineto": 76, - "args": [ - { - "name": "self", - "type": "git_merge_driver *", - "comment": null - } - ], - "argline": "git_merge_driver *self", - "sig": "git_merge_driver *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Initialize callback on merge driver

\n", - "comments": "

Specified as driver.initialize, this is an optional callback invoked\n before a merge driver is first used. It will be called once at most\n per library lifetime.

\n\n

If non-NULL, the merge driver's initialize callback will be invoked\n right before the first use of the driver, so you can defer expensive\n initialization operations (in case libgit2 is being used in a way that\n doesn't need the merge driver).

\n" - }, - "git_merge_driver_shutdown_fn": { - "type": "callback", - "file": "git2/sys/merge.h", - "line": 88, - "lineto": 88, - "args": [ - { - "name": "self", - "type": "git_merge_driver *", - "comment": null - } - ], - "argline": "git_merge_driver *self", - "sig": "git_merge_driver *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Shutdown callback on merge driver

\n", - "comments": "

Specified as driver.shutdown, this is an optional callback invoked\n when the merge driver is unregistered or when libgit2 is shutting down.\n It will be called once at most and should release resources as needed.\n This may be called even if the initialize callback was not made.

\n\n

Typically this function will free the git_merge_driver object itself.

\n" - }, - "git_merge_driver_apply_fn": { - "type": "callback", - "file": "git2/sys/merge.h", - "line": 108, - "lineto": 114, - "args": [ - { - "name": "self", - "type": "git_merge_driver *", - "comment": null - }, - { - "name": "path_out", - "type": "const char **", - "comment": null - }, - { - "name": "mode_out", - "type": "int *", - "comment": null - }, - { - "name": "merged_out", - "type": "git_buf *", - "comment": null - }, - { - "name": "filter_name", - "type": "const char *", - "comment": null - }, - { - "name": "src", - "type": "const git_merge_driver_source *", - "comment": null - } - ], - "argline": "git_merge_driver *self, const char **path_out, int *mode_out, git_buf *merged_out, const char *filter_name, const git_merge_driver_source *src", - "sig": "git_merge_driver *::const char **::int *::git_buf *::const char *::const git_merge_driver_source *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback to perform the merge.

\n", - "comments": "

Specified as driver.apply, this is the callback that actually does the\n merge. If it can successfully perform a merge, it should populate\n path_out with a pointer to the filename to accept, mode_out with\n the resultant mode, and merged_out with the buffer of the merged file\n and then return 0. If the driver returns GIT_PASSTHROUGH, then the\n default merge driver should instead be run. It can also return\n GIT_EMERGECONFLICT if the driver is not able to produce a merge result,\n and the file will remain conflicted. Any other errors will fail and\n return to the caller.

\n\n

The filter_name contains the name of the filter that was invoked, as\n specified by the file's attributes.

\n\n

The src contains the data about the file to be merged.

\n" - }, - "git_stream_cb": { - "type": "callback", - "file": "git2/sys/stream.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "out", - "type": "git_stream **", - "comment": null - }, - { - "name": "host", - "type": "const char *", - "comment": null - }, - { - "name": "port", - "type": "const char *", - "comment": null - } - ], - "argline": "git_stream **out, const char *host, const char *port", - "sig": "git_stream **::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "" - }, - "git_smart_subtransport_cb": { - "type": "callback", - "file": "git2/sys/transport.h", - "line": 364, - "lineto": 367, - "args": [ - { - "name": "out", - "type": "git_smart_subtransport **", - "comment": null - }, - { - "name": "owner", - "type": "git_transport *", - "comment": null - }, - { - "name": "param", - "type": "void *", - "comment": null - } - ], - "argline": "git_smart_subtransport **out, git_transport *owner, void *param", - "sig": "git_smart_subtransport **::git_transport *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

A function which creates a new subtransport for the smart transport

\n", - "comments": "" - }, "git_tag_foreach_cb": { "type": "callback", "file": "git2/tag.h", - "line": 321, - "lineto": 321, + "line": 330, + "lineto": 330, "args": [ { "name": "name", "type": "const char *", - "comment": null + "comment": "The tag name" }, { "name": "oid", "type": "git_oid *", - "comment": null + "comment": "The tag's OID" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "Payload passed to git_tag_foreach" } ], "argline": "const char *name, git_oid *oid, void *payload", "sig": "const char *::git_oid *::void *", "return": { "type": "int", - "comment": null + "comment": " non-zero to terminate the iteration" }, - "description": "", + "description": "

Callback used to iterate over tag names

\n", "comments": "" }, - "git_trace_callback": { + "git_trace_cb": { "type": "callback", "file": "git2/trace.h", "line": 52, @@ -28856,108 +25978,6 @@ "description": "

Signature of a function which creates a transport

\n", "comments": "" }, - "git_cred_sign_callback": { - "type": "callback", - "file": "git2/transport.h", - "line": 168, - "lineto": 168, - "args": [ - { - "name": "session", - "type": "LIBSSH2_SESSION *", - "comment": null - }, - { - "name": "sig", - "type": "unsigned char **", - "comment": null - }, - { - "name": "sig_len", - "type": "size_t *", - "comment": null - }, - { - "name": "data", - "type": "const unsigned char *", - "comment": null - }, - { - "name": "data_len", - "type": "size_t", - "comment": null - }, - { - "name": "abstract", - "type": "void **", - "comment": null - } - ], - "argline": "LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, const unsigned char *data, size_t data_len, void **abstract", - "sig": "LIBSSH2_SESSION *::unsigned char **::size_t *::const unsigned char *::size_t::void **", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "" - }, - "git_cred_ssh_interactive_callback": { - "type": "callback", - "file": "git2/transport.h", - "line": 169, - "lineto": 169, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": null - }, - { - "name": "name_len", - "type": "int", - "comment": null - }, - { - "name": "instruction", - "type": "const char *", - "comment": null - }, - { - "name": "instruction_len", - "type": "int", - "comment": null - }, - { - "name": "num_prompts", - "type": "int", - "comment": null - }, - { - "name": "prompts", - "type": "const LIBSSH2_USERAUTH_KBDINT_PROMPT *", - "comment": null - }, - { - "name": "responses", - "type": "LIBSSH2_USERAUTH_KBDINT_RESPONSE *", - "comment": null - }, - { - "name": "abstract", - "type": "void **", - "comment": null - } - ], - "argline": "const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract", - "sig": "const char *::int::const char *::int::int::const LIBSSH2_USERAUTH_KBDINT_PROMPT *::LIBSSH2_USERAUTH_KBDINT_RESPONSE *::void **", - "return": { - "type": "void", - "comment": null - }, - "description": "", - "comments": "" - }, "git_cred_acquire_cb": { "type": "callback", "file": "git2/transport.h", @@ -29023,7 +26043,7 @@ "comment": null }, "description": "

Callback for git_treebuilder_filter

\n", - "comments": "

The return value is treated as a boolean, with zero indicating that the\n entry should be left alone and any non-zero value meaning that the\n entry should be removed from the treebuilder list (i.e. filtered out).

\n" + "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" }, "git_treewalk_cb": { "type": "callback", @@ -29056,37 +26076,11 @@ "description": "

Callback for the tree traversal method

\n", "comments": "" }, - "git_transfer_progress_cb": { - "type": "callback", - "file": "git2/types.h", - "line": 275, - "lineto": 275, - "args": [ - { - "name": "stats", - "type": "const git_transfer_progress *", - "comment": "Structure containing information about the state of the transfer" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by caller" - } - ], - "argline": "const git_transfer_progress *stats, void *payload", - "sig": "const git_transfer_progress *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Type for progress callbacks during indexing. Return a value less than zero\n to cancel the transfer.

\n", - "comments": "" - }, "git_transport_message_cb": { "type": "callback", "file": "git2/types.h", - "line": 285, - "lineto": 285, + "line": 255, + "lineto": 255, "args": [ { "name": "str", @@ -29116,8 +26110,8 @@ "git_transport_certificate_check_cb": { "type": "callback", "file": "git2/types.h", - "line": 338, - "lineto": 338, + "line": 308, + "lineto": 308, "args": [ { "name": "cert", @@ -29152,202 +26146,6 @@ }, "globals": {}, "types": [ - [ - "LIBSSH2_SESSION", - { - "decl": "LIBSSH2_SESSION", - "type": "struct", - "value": "LIBSSH2_SESSION", - "file": "git2/transport.h", - "line": 163, - "lineto": 163, - "tdef": "typedef", - "description": "", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_cred_sign_callback" - ] - } - } - ], - [ - "LIBSSH2_USERAUTH_KBDINT_PROMPT", - { - "decl": "LIBSSH2_USERAUTH_KBDINT_PROMPT", - "type": "struct", - "value": "LIBSSH2_USERAUTH_KBDINT_PROMPT", - "file": "git2/transport.h", - "line": 164, - "lineto": 164, - "tdef": "typedef", - "description": "", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_cred_ssh_interactive_callback" - ] - } - } - ], - [ - "LIBSSH2_USERAUTH_KBDINT_RESPONSE", - { - "decl": "LIBSSH2_USERAUTH_KBDINT_RESPONSE", - "type": "struct", - "value": "LIBSSH2_USERAUTH_KBDINT_RESPONSE", - "file": "git2/transport.h", - "line": 165, - "lineto": 165, - "tdef": "typedef", - "description": "", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_cred_ssh_interactive_callback" - ] - } - } - ], - [ - "_LIBSSH2_SESSION", - { - "decl": [], - "type": "struct", - "value": "_LIBSSH2_SESSION", - "file": "git2/transport.h", - "line": 163, - "lineto": 163, - "tdef": null, - "description": "", - "comments": "", - "fields": [], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "_LIBSSH2_USERAUTH_KBDINT_PROMPT", - { - "decl": [], - "type": "struct", - "value": "_LIBSSH2_USERAUTH_KBDINT_PROMPT", - "file": "git2/transport.h", - "line": 164, - "lineto": 164, - "tdef": null, - "description": "", - "comments": "", - "fields": [], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "_LIBSSH2_USERAUTH_KBDINT_RESPONSE", - { - "decl": [], - "type": "struct", - "value": "_LIBSSH2_USERAUTH_KBDINT_RESPONSE", - "file": "git2/transport.h", - "line": 165, - "lineto": 165, - "tdef": null, - "description": "", - "comments": "", - "fields": [], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_allocator", - { - "decl": [ - "void *(*)(size_t, const char *, int) gmalloc", - "void *(*)(size_t, size_t, const char *, int) gcalloc", - "char *(*)(const char *, const char *, int) gstrdup", - "char *(*)(const char *, size_t, const char *, int) gstrndup", - "char *(*)(const char *, size_t, const char *, int) gsubstrdup", - "void *(*)(void *, size_t, const char *, int) grealloc", - "void *(*)(void *, size_t, size_t, const char *, int) greallocarray", - "void *(*)(size_t, size_t, const char *, int) gmallocarray", - "void (*)(void *) gfree" - ], - "type": "struct", - "value": "git_allocator", - "file": "git2/sys/alloc.h", - "line": 23, - "lineto": 73, - "block": "void *(*)(size_t, const char *, int) gmalloc\nvoid *(*)(size_t, size_t, const char *, int) gcalloc\nchar *(*)(const char *, const char *, int) gstrdup\nchar *(*)(const char *, size_t, const char *, int) gstrndup\nchar *(*)(const char *, size_t, const char *, int) gsubstrdup\nvoid *(*)(void *, size_t, const char *, int) grealloc\nvoid *(*)(void *, size_t, size_t, const char *, int) greallocarray\nvoid *(*)(size_t, size_t, const char *, int) gmallocarray\nvoid (*)(void *) gfree", - "tdef": "typedef", - "description": " An instance for a custom memory allocator", - "comments": "

Setting the pointers of this structure allows the developer to implement\n custom memory allocators. The global memory allocator can be set by using\n "GIT_OPT_SET_ALLOCATOR" with the git_libgit2_opts function. Keep in mind\n that all fields need to be set to a proper function.

\n", - "fields": [ - { - "type": "void *(*)(size_t, const char *, int)", - "name": "gmalloc", - "comments": "" - }, - { - "type": "void *(*)(size_t, size_t, const char *, int)", - "name": "gcalloc", - "comments": "" - }, - { - "type": "char *(*)(const char *, const char *, int)", - "name": "gstrdup", - "comments": "" - }, - { - "type": "char *(*)(const char *, size_t, const char *, int)", - "name": "gstrndup", - "comments": "" - }, - { - "type": "char *(*)(const char *, size_t, const char *, int)", - "name": "gsubstrdup", - "comments": "" - }, - { - "type": "void *(*)(void *, size_t, const char *, int)", - "name": "grealloc", - "comments": "" - }, - { - "type": "void *(*)(void *, size_t, size_t, const char *, int)", - "name": "greallocarray", - "comments": "" - }, - { - "type": "void *(*)(size_t, size_t, const char *, int)", - "name": "gmallocarray", - "comments": "" - }, - { - "type": "void (*)(void *)", - "name": "gfree", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_stdalloc_init_allocator", - "git_win32_crtdbg_init_allocator" - ] - } - } - ], [ "git_annotated_commit", { @@ -29360,7 +26158,6 @@ "tdef": "typedef", "description": " Annotated commits, the input to merge and rebase. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -29392,11 +26189,11 @@ ], "type": "enum", "file": "git2/apply.h", - "line": 92, - "lineto": 110, + "line": 95, + "lineto": 113, "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", "tdef": "typedef", - "description": "", + "description": " Possible application locations for git_apply ", "comments": "", "fields": [ { @@ -29443,7 +26240,7 @@ "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload", "tdef": "typedef", "description": " Apply options structure", - "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can\n use git_apply_init_options.

\n", + "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -29476,44 +26273,44 @@ } ], [ - "git_attr_t", + "git_attr_value_t", { "decl": [ - "GIT_ATTR_UNSPECIFIED_T", - "GIT_ATTR_TRUE_T", - "GIT_ATTR_FALSE_T", - "GIT_ATTR_VALUE_T" + "GIT_ATTR_VALUE_UNSPECIFIED", + "GIT_ATTR_VALUE_TRUE", + "GIT_ATTR_VALUE_FALSE", + "GIT_ATTR_VALUE_STRING" ], "type": "enum", "file": "git2/attr.h", "line": 82, "lineto": 87, - "block": "GIT_ATTR_UNSPECIFIED_T\nGIT_ATTR_TRUE_T\nGIT_ATTR_FALSE_T\nGIT_ATTR_VALUE_T", + "block": "GIT_ATTR_VALUE_UNSPECIFIED\nGIT_ATTR_VALUE_TRUE\nGIT_ATTR_VALUE_FALSE\nGIT_ATTR_VALUE_STRING", "tdef": "typedef", "description": " Possible states for an attribute", "comments": "", "fields": [ { "type": "int", - "name": "GIT_ATTR_UNSPECIFIED_T", + "name": "GIT_ATTR_VALUE_UNSPECIFIED", "comments": "

The attribute has been left unspecified

\n", "value": 0 }, { "type": "int", - "name": "GIT_ATTR_TRUE_T", + "name": "GIT_ATTR_VALUE_TRUE", "comments": "

The attribute has been set

\n", "value": 1 }, { "type": "int", - "name": "GIT_ATTR_FALSE_T", + "name": "GIT_ATTR_VALUE_FALSE", "comments": "

The attribute has been unset

\n", "value": 2 }, { "type": "int", - "name": "GIT_ATTR_VALUE_T", + "name": "GIT_ATTR_VALUE_STRING", "comments": "

This attribute has a value

\n", "value": 3 } @@ -29538,7 +26335,6 @@ "tdef": "typedef", "description": " Opaque structure to hold blame results ", "comments": "", - "fields": [], "used": { "returns": [ "git_blame_get_hunk_byindex", @@ -29550,7 +26346,9 @@ "git_blame_free", "git_blame_get_hunk_byindex", "git_blame_get_hunk_byline", - "git_blame_init_options" + "git_blame_get_hunk_count", + "git_blame_init_options", + "git_blame_options_init" ] } } @@ -29647,7 +26445,7 @@ "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", "tdef": "typedef", "description": " Structure that represents a blame hunk.", - "comments": "
    \n
  • lines_in_hunk is the number of lines in this hunk
  • \n
  • final_commit_id is the OID of the commit where this line was last\nchanged.
  • \n
  • final_start_line_number is the 1-based line number where this hunk\nbegins, in the final version of the file
  • \n
  • final_signature is the author of final_commit_id. If\nGIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical\nreal name and email address.
  • \n
  • orig_commit_id is the OID of the commit where this hunk was found. This\nwill usually be the same as final_commit_id, except when\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES has been specified.
  • \n
  • orig_path is the path to the file where this hunk originated, as of the\ncommit specified by orig_commit_id.
  • \n
  • orig_start_line_number is the 1-based line number where this hunk begins\nin the file named by orig_path in the commit specified by\norig_commit_id.
  • \n
  • orig_signature is the author of orig_commit_id. If\nGIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical\nreal name and email address.
  • \n
  • boundary is 1 iff the hunk has been tracked to a boundary commit (the\nroot, or the commit specified in git_blame_options.oldest_commit)
  • \n
\n", + "comments": "
    \n
  • lines_in_hunk is the number of lines in this hunk - final_commit_id is the OID of the commit where this line was last changed. - final_start_line_number is the 1-based line number where this hunk begins, in the final version of the file - final_signature is the author of final_commit_id. If GIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical real name and email address. - orig_commit_id is the OID of the commit where this hunk was found. This will usually be the same as final_commit_id, except when GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES has been specified. - orig_path is the path to the file where this hunk originated, as of the commit specified by orig_commit_id. - orig_start_line_number is the 1-based line number where this hunk begins in the file named by orig_path in the commit specified by orig_commit_id. - orig_signature is the author of orig_commit_id. If GIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical real name and email address. - boundary is 1 iff the hunk has been tracked to a boundary commit (the root, or the commit specified in git_blame_options.oldest_commit)
  • \n
\n", "fields": [ { "type": "size_t", @@ -29709,8 +26507,8 @@ { "decl": [ "unsigned int version", - "int flags", - "int min_match_characters", + "uint32_t flags", + "uint16_t min_match_characters", "git_oid newest_commit", "git_oid oldest_commit", "size_t min_line", @@ -29721,10 +26519,10 @@ "file": "git2/blame.h", "line": 59, "lineto": 88, - "block": "unsigned int version\nint flags\nint min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", + "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", "tdef": "typedef", - "description": "", - "comments": "", + "description": " Blame options structure", + "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can use git_blame_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -29732,14 +26530,14 @@ "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " A combination of `git_blame_flag_t` " }, { - "type": "int", + "type": "uint16_t", "name": "min_match_characters", - "comments": "" + "comments": " The lower bound on the number of alphanumeric\n characters that must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value is 20.\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." }, { "type": "git_oid", @@ -29766,7 +26564,8 @@ "returns": [], "needs": [ "git_blame_file", - "git_blame_init_options" + "git_blame_init_options", + "git_blame_options_init" ] } } @@ -29783,7 +26582,6 @@ "tdef": "typedef", "description": " In-memory representation of a blob object. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -29820,7 +26618,6 @@ "tdef": "typedef", "description": " Iterator type for branches ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -29893,7 +26690,7 @@ "block": "char * ptr\nsize_t asize\nsize_t size", "tdef": "typedef", "description": " A data buffer for exporting data from libgit2", - "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the\n caller and have the caller take responsibility for freeing that memory.\n This can be awkward if the caller does not have easy access to the same\n allocation functions that libgit2 is using. In those cases, libgit2\n will fill in a git_buf and the caller can use git_buf_dispose() to\n release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to\n a block of memory they hold. In this case, libgit2 will not resize or\n free the memory, but will read from it as needed.

\n\n

A git_buf is a public structure with three fields:

\n\n
    \n
  • ptr points to the start of the allocated memory. If it is NULL,\nthen the git_buf is considered empty and libgit2 will feel free\nto overwrite it with new data.

  • \n
  • size holds the size (in bytes) of the data that is actually used.

  • \n
  • asize holds the known total amount of allocated memory if the ptr\nwas allocated by libgit2. It may be larger than size. If ptr\nwas not allocated by libgit2 and should not be resized and/or freed,\nthen asize will be set to zero.

  • \n
\n\n

Some APIs may occasionally do something slightly unusual with a buffer,\n such as setting ptr to a value that was passed in by the user. In\n those cases, the behavior will be clearly documented by the API.

\n", + "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. This can be awkward if the caller does not have easy access to the same allocation functions that libgit2 is using. In those cases, libgit2 will fill in a git_buf and the caller can use git_buf_dispose() to release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to a block of memory they hold. In this case, libgit2 will not resize or free the memory, but will read from it as needed.

\n\n

A git_buf is a public structure with three fields:

\n\n
    \n
  • ptr points to the start of the allocated memory. If it is NULL, then the git_buf is considered empty and libgit2 will feel free to overwrite it with new data.

  • \n
  • size holds the size (in bytes) of the data that is actually used.

  • \n
  • asize holds the known total amount of allocated memory if the ptr was allocated by libgit2. It may be larger than size. If ptr was not allocated by libgit2 and should not be resized and/or freed, then asize will be set to zero.

  • \n
\n\n

Some APIs may occasionally do something slightly unusual with a buffer, such as setting ptr to a value that was passed in by the user. In those cases, the behavior will be clearly documented by the API.

\n", "fields": [ { "type": "char *", @@ -29939,13 +26736,10 @@ "git_diff_format_email", "git_diff_stats_to_buf", "git_diff_to_buf", - "git_filter_apply_fn", "git_filter_list_apply_to_blob", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_stream_data", - "git_mempack_dump", - "git_merge_driver_apply_fn", "git_message_prettify", "git_note_default_ref", "git_object_short_id", @@ -29959,6 +26753,7 @@ "git_repository_message", "git_submodule_resolve_url", "git_treebuilder_write_with_buffer", + "git_url_resolve_cb", "git_worktree_is_locked" ] } @@ -29973,8 +26768,8 @@ "type": "struct", "value": "git_cert", "file": "git2/types.h", - "line": 319, - "lineto": 324, + "line": 289, + "lineto": 294, "block": "git_cert_t cert_type", "tdef": "typedef", "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", @@ -29989,8 +26784,7 @@ "used": { "returns": [], "needs": [ - "git_transport_certificate_check_cb", - "git_transport_smart_certificate_check" + "git_transport_certificate_check_cb" ] } } @@ -30087,8 +26881,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 291, - "lineto": 314, + "line": 261, + "lineto": 284, "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", "tdef": "typedef", "description": " Type of host certificate structure that is passed to the check callback", @@ -30179,12 +26973,12 @@ ], "type": "enum", "file": "git2/checkout.h", - "line": 205, - "lineto": 214, + "line": 217, + "lineto": 226, "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", "tdef": "typedef", "description": " Checkout notification flags", - "comments": "

Checkout will invoke an options notification callback (notify_cb) for\n certain cases - you pick which ones via notify_flags:

\n\n
    \n
  • GIT_CHECKOUT_NOTIFY_CONFLICT invokes checkout on conflicting paths.

  • \n
  • GIT_CHECKOUT_NOTIFY_DIRTY notifies about "dirty" files, i.e. those that\ndo not need an update but no longer match the baseline. Core git\ndisplays these files when checkout runs, but won't stop the checkout.

  • \n
  • GIT_CHECKOUT_NOTIFY_UPDATED sends notification for any file changed.

  • \n
  • GIT_CHECKOUT_NOTIFY_UNTRACKED notifies about untracked files.

  • \n
  • GIT_CHECKOUT_NOTIFY_IGNORED notifies about ignored files.

  • \n
\n\n

Returning a non-zero value from this callback will cancel the checkout.\n The non-zero return value will be propagated back and returned by the\n git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk,\n so canceling on any notification will still happen prior to any files\n being modified.

\n", + "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n
    \n
  • GIT_CHECKOUT_NOTIFY_CONFLICT invokes checkout on conflicting paths.

  • \n
  • GIT_CHECKOUT_NOTIFY_DIRTY notifies about "dirty" files, i.e. those that do not need an update but no longer match the baseline. Core git displays these files when checkout runs, but won't stop the checkout.

  • \n
  • GIT_CHECKOUT_NOTIFY_UPDATED sends notification for any file changed.

  • \n
  • GIT_CHECKOUT_NOTIFY_UNTRACKED notifies about untracked files.

  • \n
  • GIT_CHECKOUT_NOTIFY_IGNORED notifies about ignored files.

  • \n
\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", "fields": [ { "type": "int", @@ -30265,12 +27059,12 @@ "type": "struct", "value": "git_checkout_options", "file": "git2/checkout.h", - "line": 250, - "lineto": 294, + "line": 263, + "lineto": 307, "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", "tdef": "typedef", "description": " Checkout options structure", - "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can\n use git_checkout_init_options.

\n", + "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -30378,7 +27172,7 @@ "needs": [ "git_checkout_head", "git_checkout_index", - "git_checkout_init_options", + "git_checkout_options_init", "git_checkout_tree", "git_merge", "git_reset", @@ -30398,11 +27192,11 @@ "type": "struct", "value": "git_checkout_perfdata", "file": "git2/checkout.h", - "line": 216, - "lineto": 220, + "line": 229, + "lineto": 233, "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", "tdef": "typedef", - "description": "", + "description": " Checkout performance-reporting structure ", "comments": "", "fields": [ { @@ -30459,11 +27253,11 @@ "type": "enum", "file": "git2/checkout.h", "line": 106, - "lineto": 177, + "lineto": 189, "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", "tdef": "typedef", "description": " Checkout behavior flags", - "comments": "

In libgit2, checkout is used to update the working directory and index\n to match a target tree. Unlike git checkout, it does not move the HEAD\n commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to\n check out, the "baseline" tree of what was checked out previously, the\n working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts,\netc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to\nmake the working directory match the target (including potentially\ndiscarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make\nmodifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |\n
    \n\n

    ---------------------|-----------------------|----------------------|\n workdir == baseline | no action | create, update, or |\n | | delete file |\n---------------------|-----------------------|----------------------|\n workdir exists and | no action | conflict (notify |\n is != baseline | notify dirty MODIFIED | and cancel checkout) |\n---------------------|-----------------------|----------------------|\n workdir missing, | notify dirty DELETED | create file |\n baseline present | | |\n---------------------|-----------------------|----------------------|

  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout\n notification callback (see below) that displays information about dirty\n files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a\n notification callback that cancels the operation if a dirty-but-existing\n file is found in the working directory. This core git command isn't\n quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates\neven if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not\nin target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also\nuntracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that\nalready exist. Files will not be created nor deleted. This just skips\napplying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the\nupdated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk\nbefore any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips\nfiles with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and\nGIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the\nstage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being\noverwritten. Normally, files that are ignored in the working directory\nare not considered "precious" and may be overwritten if the checkout\ntarget contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing\nfiles or folders that fold to the same name on case insensitive\nfilesystems. This can cause files to retain their existing names\nand write through existing symbolic links.

  • \n
\n", + "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", "fields": [ { "type": "int", @@ -30474,13 +27268,13 @@ { "type": "int", "name": "GIT_CHECKOUT_SAFE", - "comments": "

Allow safe updates that cannot overwrite uncommitted data

\n", + "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked out files,\n the checkout will still proceed, leaving the changes intact.

\n\n

Mutually exclusive with GIT_CHECKOUT_FORCE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", "value": 1 }, { "type": "int", "name": "GIT_CHECKOUT_FORCE", - "comments": "

Allow all updates to force working directory to look like index

\n", + "comments": "

Allow all updates to force working directory to look like index.

\n\n

Mutually exclusive with GIT_CHECKOUT_SAFE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", "value": 2 }, { @@ -30648,7 +27442,7 @@ "returns": [], "needs": [ "git_cherrypick", - "git_cherrypick_init_options" + "git_cherrypick_options_init" ] } } @@ -30725,7 +27519,7 @@ "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", "tdef": "typedef", "description": " Clone options structure", - "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can\n use git_clone_init_options.

\n", + "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -30782,7 +27576,7 @@ "returns": [], "needs": [ "git_clone", - "git_clone_init_options" + "git_clone_options_init" ] } } @@ -30799,7 +27593,6 @@ "tdef": "typedef", "description": " Parsed representation of a commit object. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -30814,7 +27607,6 @@ "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", - "git_commit_create_from_callback", "git_commit_dup", "git_commit_free", "git_commit_header_field", @@ -30859,11 +27651,9 @@ "tdef": "typedef", "description": " Memory representation of a set of config files ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ - "git_config_add_backend", "git_config_add_file_ondisk", "git_config_backend_foreach_match", "git_config_delete_entry", @@ -30882,7 +27672,6 @@ "git_config_get_path", "git_config_get_string", "git_config_get_string_buf", - "git_config_init_backend", "git_config_iterator_free", "git_config_iterator_glob_new", "git_config_iterator_new", @@ -30901,8 +27690,7 @@ "git_config_set_string", "git_config_snapshot", "git_repository_config", - "git_repository_config_snapshot", - "git_repository_set_config" + "git_repository_config_snapshot" ] } } @@ -30916,88 +27704,13 @@ "file": "git2/types.h", "line": 148, "lineto": 148, - "block": "unsigned int version\nint readonly\nstruct git_config * cfg\nint (*)(struct git_config_backend *, git_config_level_t, const git_repository *) open\nint (*)(struct git_config_backend *, const char *, git_config_entry **) get\nint (*)(struct git_config_backend *, const char *, const char *) set\nint (*)(git_config_backend *, const char *, const char *, const char *) set_multivar\nint (*)(struct git_config_backend *, const char *) del\nint (*)(struct git_config_backend *, const char *, const char *) del_multivar\nint (*)(git_config_iterator **, struct git_config_backend *) iterator\nint (*)(struct git_config_backend **, struct git_config_backend *) snapshot\nint (*)(struct git_config_backend *) lock\nint (*)(struct git_config_backend *, int) unlock\nvoid (*)(struct git_config_backend *) free", "tdef": "typedef", "description": " Interface to access a configuration file ", "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "int", - "name": "readonly", - "comments": " True if this backend is for a snapshot " - }, - { - "type": "struct git_config *", - "name": "cfg", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend *, git_config_level_t, const git_repository *)", - "name": "open", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend *, const char *, git_config_entry **)", - "name": "get", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend *, const char *, const char *)", - "name": "set", - "comments": "" - }, - { - "type": "int (*)(git_config_backend *, const char *, const char *, const char *)", - "name": "set_multivar", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend *, const char *)", - "name": "del", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend *, const char *, const char *)", - "name": "del_multivar", - "comments": "" - }, - { - "type": "int (*)(git_config_iterator **, struct git_config_backend *)", - "name": "iterator", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend **, struct git_config_backend *)", - "name": "snapshot", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend *)", - "name": "lock", - "comments": "" - }, - { - "type": "int (*)(struct git_config_backend *, int)", - "name": "unlock", - "comments": "" - }, - { - "type": "void (*)(struct git_config_backend *)", - "name": "free", - "comments": "" - } - ], "used": { "returns": [], "needs": [ - "git_config_add_backend", - "git_config_backend_foreach_match", - "git_config_init_backend" + "git_config_backend_foreach_match" ] } } @@ -31077,28 +27790,6 @@ "tdef": "typedef", "description": " An opaque structure for a configuration iterator", "comments": "", - "fields": [ - { - "type": "git_config_backend *", - "name": "backend", - "comments": "" - }, - { - "type": "unsigned int", - "name": "flags", - "comments": "" - }, - { - "type": "int (*)(git_config_entry **, git_config_iterator *)", - "name": "next", - "comments": "" - }, - { - "type": "void (*)(git_config_iterator *)", - "name": "free", - "comments": "" - } - ], "used": { "returns": [], "needs": [ @@ -31130,7 +27821,7 @@ "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", "tdef": "typedef", "description": " Priority level of a config file.\n These priority levels correspond to the natural escalation logic\n (from higher to lower) when searching for config entries in git.git.", - "comments": "

git_config_open_default() and git_repository_config() honor those\n priority levels as well.

\n", + "comments": "

git_config_open_default() and git_repository_config() honor those priority levels as well.

\n", "fields": [ { "type": "int", @@ -31178,7 +27869,6 @@ "used": { "returns": [], "needs": [ - "git_config_add_backend", "git_config_add_file_ondisk", "git_config_open_level" ] @@ -31188,13 +27878,16 @@ [ "git_cred", { - "decl": "git_cred", + "decl": [ + "git_credtype_t credtype", + "void (*)(git_cred *) free" + ], "type": "struct", "value": "git_cred", "file": "git2/transport.h", - "line": 140, - "lineto": 140, - "tdef": "typedef", + "line": 145, + "lineto": 148, + "tdef": null, "description": " The base structure for all credential types", "comments": "", "fields": [ @@ -31209,6 +27902,7 @@ "comments": "" } ], + "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", "used": { "returns": [], "needs": [ @@ -31223,8 +27917,7 @@ "git_cred_ssh_key_new", "git_cred_username_new", "git_cred_userpass", - "git_cred_userpass_plaintext_new", - "git_transport_smart_credentials" + "git_cred_userpass_plaintext_new" ] } } @@ -31255,7 +27948,7 @@ "char * username", "char * publickey", "size_t publickey_len", - "git_cred_sign_callback sign_callback", + "git_cred_sign_cb sign_callback", "void * payload" ], "type": "struct", @@ -31263,7 +27956,7 @@ "file": "git2/transport.h", "line": 195, "lineto": 202, - "block": "git_cred parent\nchar * username\nchar * publickey\nsize_t publickey_len\ngit_cred_sign_callback sign_callback\nvoid * payload", + "block": "git_cred parent\nchar * username\nchar * publickey\nsize_t publickey_len\ngit_cred_sign_cb sign_callback\nvoid * payload", "tdef": "typedef", "description": " A key with a custom signature function", "comments": "", @@ -31289,7 +27982,7 @@ "comments": "" }, { - "type": "git_cred_sign_callback", + "type": "git_cred_sign_cb", "name": "sign_callback", "comments": "" }, @@ -31311,7 +28004,7 @@ "decl": [ "git_cred parent", "char * username", - "git_cred_ssh_interactive_callback prompt_callback", + "git_cred_ssh_interactive_cb prompt_callback", "void * payload" ], "type": "struct", @@ -31319,7 +28012,7 @@ "file": "git2/transport.h", "line": 185, "lineto": 190, - "block": "git_cred parent\nchar * username\ngit_cred_ssh_interactive_callback prompt_callback\nvoid * payload", + "block": "git_cred parent\nchar * username\ngit_cred_ssh_interactive_cb prompt_callback\nvoid * payload", "tdef": "typedef", "description": " Keyboard-interactive based ssh authentication", "comments": "", @@ -31335,7 +28028,7 @@ "comments": "" }, { - "type": "git_cred_ssh_interactive_callback", + "type": "git_cred_ssh_interactive_cb", "name": "prompt_callback", "comments": "" }, @@ -31532,7 +28225,7 @@ "block": "GIT_CREDTYPE_USERPASS_PLAINTEXT\nGIT_CREDTYPE_SSH_KEY\nGIT_CREDTYPE_SSH_CUSTOM\nGIT_CREDTYPE_DEFAULT\nGIT_CREDTYPE_SSH_INTERACTIVE\nGIT_CREDTYPE_USERNAME\nGIT_CREDTYPE_SSH_MEMORY", "tdef": "typedef", "description": " Supported credential types", - "comments": "

This represents the various types of authentication methods supported by\n the library.

\n", + "comments": "

This represents the various types of authentication methods supported by the library.

\n", "fields": [ { "type": "int", @@ -31698,7 +28391,7 @@ "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", "tdef": "typedef", "description": " What type of change is described by a git_diff_delta?", - "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run\n git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE\n in the option flags (otherwise type changes will be split into ADDED /\n DELETED pairs).

\n", + "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE in the option flags (otherwise type changes will be split into ADDED / DELETED pairs).

\n", "fields": [ { "type": "int", @@ -31793,7 +28486,7 @@ "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", "tdef": "typedef", "description": " Describe format options structure", - "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can\n use git_describe_format_init_options.

\n", + "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -31820,7 +28513,7 @@ "returns": [], "needs": [ "git_describe_format", - "git_describe_init_format_options" + "git_describe_format_options_init" ] } } @@ -31844,7 +28537,7 @@ "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", "tdef": "typedef", "description": " Describe options structure", - "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can\n use git_describe_init_options.

\n", + "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can use git_describe_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -31881,7 +28574,7 @@ "returns": [], "needs": [ "git_describe_commit", - "git_describe_init_options", + "git_describe_options_init", "git_describe_workdir" ] } @@ -31899,7 +28592,6 @@ "tdef": "typedef", "description": " A struct that stores the result of a describe operation.", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -31926,7 +28618,7 @@ "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", "tdef": "typedef", "description": " Reference lookup strategy", - "comments": "

These behave like the --tags and --all options to git-describe,\n namely they say to look for any reference in either refs/tags/ or\n refs/ respectively.

\n", + "comments": "

These behave like the --tags and --all options to git-describe, namely they say to look for any reference in either refs/tags/ or refs/ respectively.

\n", "fields": [ { "type": "int", @@ -31964,8 +28656,7 @@ "lineto": 193, "tdef": "typedef", "description": " The diff object that contains all individual file deltas.", - "comments": "

A diff represents the cumulative list of differences between two\n snapshots of a repository (possibly filtered by a set of file name\n patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of\n diffs then traversing it. This makes is easier to share logic across\n the various types of diffs (tree vs tree, workdir vs index, etc.), and\n also allows you to insert optional diff post-processing phases,\n such as rename detection, in between the steps. When you are done with\n a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff\n generator functions below (such as git_diff_tree_to_tree). You are\n responsible for releasing the object memory when done, using the\n git_diff_free() function.

\n", - "fields": [], + "comments": "

A diff represents the cumulative list of differences between two snapshots of a repository (possibly filtered by a set of file name patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of diffs then traversing it. This makes is easier to share logic across the various types of diffs (tree vs tree, workdir vs index, etc.), and also allows you to insert optional diff post-processing phases, such as rename detection, in between the steps. When you are done with a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", "used": { "returns": [ "git_diff_get_delta", @@ -31984,31 +28675,28 @@ "git_diff_buffers", "git_diff_commit_as_email", "git_diff_file_cb", - "git_diff_find_init_options", + "git_diff_find_options_init", "git_diff_find_similar", "git_diff_foreach", "git_diff_format_email", - "git_diff_format_email_init_options", + "git_diff_format_email_options_init", "git_diff_free", "git_diff_from_buffer", "git_diff_get_delta", - "git_diff_get_perfdata", "git_diff_get_stats", "git_diff_hunk_cb", "git_diff_index_to_index", "git_diff_index_to_workdir", - "git_diff_init_options", "git_diff_is_sorted_icase", "git_diff_line_cb", "git_diff_merge", "git_diff_notify_cb", "git_diff_num_deltas", "git_diff_num_deltas_of_type", + "git_diff_options_init", "git_diff_patchid", - "git_diff_patchid_init_options", + "git_diff_patchid_options_init", "git_diff_print", - "git_diff_print_callback__to_buf", - "git_diff_print_callback__to_file_handle", "git_diff_progress_cb", "git_diff_stats_deletions", "git_diff_stats_files_changed", @@ -32027,8 +28715,7 @@ "git_patch_get_hunk", "git_patch_get_line_in_hunk", "git_patch_print", - "git_pathspec_match_diff", - "git_status_list_get_perfdata" + "git_pathspec_match_diff" ] } } @@ -32049,7 +28736,7 @@ "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", "tdef": "typedef", "description": " Structure describing the binary contents of a diff.", - "comments": "

A binary file / delta is a file (or pair) for which no text diffs\n should be generated. A diff can contain delta entries that are\n binary, but no diff content will be output for those files. There is\n a base heuristic for binary detection and you can further tune the\n behavior with git attributes or diff flags and option settings.

\n", + "comments": "

A binary file / delta is a file (or pair) for which no text diffs should be generated. A diff can contain delta entries that are binary, but no diff content will be output for those files. There is a base heuristic for binary detection and you can further tune the behavior with git attributes or diff flags and option settings.

\n", "fields": [ { "type": "unsigned int", @@ -32172,9 +28859,9 @@ { "decl": [ "git_delta_t status", - "int flags", - "int similarity", - "int nfiles", + "uint32_t flags", + "uint16_t similarity", + "uint16_t nfiles", "git_diff_file old_file", "git_diff_file new_file" ], @@ -32183,10 +28870,10 @@ "file": "git2/diff.h", "line": 309, "lineto": 316, - "block": "git_delta_t status\nint flags\nint similarity\nint nfiles\ngit_diff_file old_file\ngit_diff_file new_file", + "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", "tdef": "typedef", - "description": "", - "comments": "", + "description": " Description of changes to one entry.", + "comments": "

A delta is a file pair with an old and new revision. The old version may be absent if the file was just created and the new version may be absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file represents to "to" side of the diff. What those means depend on the function that was used to generate the diff and will be documented below. You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file", they actually may correspond to entries that represent a file, a symbolic link, a submodule commit id, or even a tree (if you are tracking type changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will be filled in, but we generally try to fill in as much as possible. One example is that the "flags" field may not have either the BINARY or the NOT_BINARY flag set to avoid examining file contents if you do not pass in hunk and/or line callbacks to the diff foreach iteration function. It will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar() which does a similarity analysis of files in the diff. Use that function to do rename and copy detection, and to split heavily modified files in add/delete pairs. After that call, deltas with a status of GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to break, but to not actually break the records, then GIT_DELTA_MODIFIED records may have a non-zero similarity score if the self-similarity is below the split threshold. To display this value like core Git, invert the score (a la printf("M%03d", 100 - delta->similarity)).

\n", "fields": [ { "type": "git_delta_t", @@ -32194,19 +28881,19 @@ "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " git_diff_flag_t values " }, { - "type": "int", + "type": "uint16_t", "name": "similarity", - "comments": "" + "comments": " for RENAMED and COPIED, value 0-100 " }, { - "type": "int", + "type": "uint16_t", "name": "nfiles", - "comments": "" + "comments": " number of files in this delta " }, { "type": "git_diff_file", @@ -32231,9 +28918,7 @@ "git_diff_file_cb", "git_diff_hunk_cb", "git_diff_line_cb", - "git_diff_notify_cb", - "git_diff_print_callback__to_buf", - "git_diff_print_callback__to_file_handle" + "git_diff_notify_cb" ] } } @@ -32245,19 +28930,19 @@ "git_oid id", "const char * path", "git_off_t size", - "int flags", - "int mode", - "int id_abbrev" + "uint32_t flags", + "uint16_t mode", + "uint16_t id_abbrev" ], "type": "struct", "value": "git_diff_file", "file": "git2/diff.h", "line": 260, "lineto": 267, - "block": "git_oid id\nconst char * path\ngit_off_t size\nint flags\nint mode\nint id_abbrev", + "block": "git_oid id\nconst char * path\ngit_off_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", "tdef": "typedef", - "description": "", - "comments": "", + "description": " Description of one side of a delta.", + "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n\n

The id is the git_oid of the item. If the entry represents an absent side of a diff (e.g. the old_file of a GIT_DELTA_ADDED delta), then the oid will be zeroes.

\n\n

path is the NUL-terminated path to the entry relative to the working directory of the repository.

\n\n

size is the size of the entry in bytes.

\n\n

flags is a combination of the git_diff_flag_t types

\n\n

mode is, roughly, the stat() st_mode value for the item. This will be restricted to one of the git_filemode_t values.

\n\n

The id_abbrev represents the known length of the id field, when converted to a hex string. It is generally GIT_OID_HEXSZ, unless this delta was created from reading a patch file, in which case it may be abbreviated to something reasonable, like 7 characters.

\n", "fields": [ { "type": "git_oid", @@ -32275,17 +28960,17 @@ "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "flags", "comments": "" }, { - "type": "int", + "type": "uint16_t", "name": "mode", "comments": "" }, { - "type": "int", + "type": "uint16_t", "name": "id_abbrev", "comments": "" } @@ -32307,11 +28992,11 @@ { "decl": [ "unsigned int version", - "int flags", - "int rename_threshold", - "int rename_from_rewrite_threshold", - "int copy_threshold", - "int break_rewrite_threshold", + "uint32_t flags", + "uint16_t rename_threshold", + "uint16_t rename_from_rewrite_threshold", + "uint16_t copy_threshold", + "uint16_t break_rewrite_threshold", "size_t rename_limit", "git_diff_similarity_metric * metric" ], @@ -32320,10 +29005,10 @@ "file": "git2/diff.h", "line": 718, "lineto": 772, - "block": "unsigned int version\nint flags\nint rename_threshold\nint rename_from_rewrite_threshold\nint copy_threshold\nint break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", + "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", "tdef": "typedef", - "description": "", - "comments": "", + "description": " Control behavior of rename and copy detection", + "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", "fields": [ { "type": "unsigned int", @@ -32331,29 +29016,29 @@ "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing." }, { - "type": "int", + "type": "uint16_t", "name": "rename_threshold", - "comments": "" + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." }, { - "type": "int", + "type": "uint16_t", "name": "rename_from_rewrite_threshold", - "comments": "" + "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." }, { - "type": "int", + "type": "uint16_t", "name": "copy_threshold", - "comments": "" + "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." }, { - "type": "int", + "type": "uint16_t", "name": "break_rewrite_threshold", - "comments": "" + "comments": " Treshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." }, { "type": "size_t", @@ -32369,7 +29054,7 @@ "used": { "returns": [], "needs": [ - "git_diff_find_init_options", + "git_diff_find_options_init", "git_diff_find_similar" ] } @@ -32524,7 +29209,7 @@ "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS", "tdef": "typedef", "description": " Flags for the delta object and the file objects on each side.", - "comments": "

These flags are used for both the flags value of the git_diff_delta\n and the flags for the git_diff_file objects representing the old and\n new sides of the delta. Values outside of this public range should be\n considered reserved for internal or future use.

\n", + "comments": "

These flags are used for both the flags value of the git_diff_delta and the flags for the git_diff_file objects representing the old and new sides of the delta. Values outside of this public range should be considered reserved for internal or future use.

\n", "fields": [ { "type": "int", @@ -32662,7 +29347,7 @@ "returns": [], "needs": [ "git_diff_format_email", - "git_diff_format_email_init_options" + "git_diff_format_email_options_init" ] } } @@ -32745,7 +29430,7 @@ "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", "tdef": "typedef", "description": " Structure describing a hunk of a diff.", - "comments": "

A hunk is a span of modified lines in a delta along with some stable\n surrounding context. You can configure the amount of context and other\n properties of how hunks are generated. Each hunk also comes with a\n header that described where it starts and ends in both the old and new\n versions in the delta.

\n", + "comments": "

A hunk is a span of modified lines in a delta along with some stable surrounding context. You can configure the amount of context and other properties of how hunks are generated. Each hunk also comes with a header that described where it starts and ends in both the old and new versions in the delta.

\n", "fields": [ { "type": "int", @@ -32788,8 +29473,6 @@ "git_diff_foreach", "git_diff_hunk_cb", "git_diff_line_cb", - "git_diff_print_callback__to_buf", - "git_diff_print_callback__to_file_handle", "git_patch_get_hunk" ] } @@ -32815,7 +29498,7 @@ "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", "tdef": "typedef", "description": " Structure describing a line (or data span) of a diff.", - "comments": "

A line is a range of characters inside a hunk. It could be a context\n line (i.e. in both old and new versions), an added line (i.e. only in\n the new version), or a removed line (i.e. only in the old version).\n Unfortunately, we don't know anything about the encoding of data in the\n file being diffed, so we cannot tell you much about the line content.\n Line data will not be NUL-byte terminated, however, because it will be\n just a span of bytes inside the larger file.

\n", + "comments": "

A line is a range of characters inside a hunk. It could be a context line (i.e. in both old and new versions), an added line (i.e. only in the new version), or a removed line (i.e. only in the old version). Unfortunately, we don't know anything about the encoding of data in the file being diffed, so we cannot tell you much about the line content. Line data will not be NUL-byte terminated, however, because it will be just a span of bytes inside the larger file.

\n", "fields": [ { "type": "char", @@ -32862,8 +29545,6 @@ "git_diff_foreach", "git_diff_line_cb", "git_diff_print", - "git_diff_print_callback__to_buf", - "git_diff_print_callback__to_file_handle", "git_patch_get_line_in_hunk", "git_patch_print" ] @@ -32891,7 +29572,7 @@ "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", "tdef": "typedef", "description": " Line origin constants.", - "comments": "

These values describe where a line came from and will be passed to\n the git_diff_line_cb when iterating over a diff. There are some\n special origin constants at the end that are used for the text\n output callbacks to demarcate lines that are actually part of\n the file or hunk headers.

\n", + "comments": "

These values describe where a line came from and will be passed to the git_diff_line_cb when iterating over a diff. There are some special origin constants at the end that are used for the text output callbacks to demarcate lines that are actually part of the file or hunk headers.

\n", "fields": [ { "type": "int", @@ -33190,15 +29871,15 @@ { "decl": [ "unsigned int version", - "int flags", + "uint32_t flags", "git_submodule_ignore_t ignore_submodules", "git_strarray pathspec", "git_diff_notify_cb notify_cb", "git_diff_progress_cb progress_cb", "void * payload", - "int context_lines", - "int interhunk_lines", - "int id_abbrev", + "uint32_t context_lines", + "uint32_t interhunk_lines", + "uint16_t id_abbrev", "git_off_t max_size", "const char * old_prefix", "const char * new_prefix" @@ -33208,10 +29889,10 @@ "file": "git2/diff.h", "line": 361, "lineto": 433, - "block": "unsigned int version\nint flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nint context_lines\nint interhunk_lines\nint id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", + "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", "tdef": "typedef", - "description": "", - "comments": "", + "description": " Structure describing options about how the diff should be executed.", + "comments": "

Setting all values of the structure to zero will yield the default values. Similarly, passing NULL for the options structure will give the defaults. The default values are marked below.

\n", "fields": [ { "type": "unsigned int", @@ -33219,9 +29900,9 @@ "comments": " version for the struct " }, { - "type": "int", + "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" }, { "type": "git_submodule_ignore_t", @@ -33249,19 +29930,19 @@ "comments": " The payload to pass to the callback functions. " }, { - "type": "int", + "type": "uint32_t", "name": "context_lines", - "comments": "" + "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." }, { - "type": "int", + "type": "uint32_t", "name": "interhunk_lines", - "comments": "" + "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." }, { - "type": "int", + "type": "uint16_t", "name": "id_abbrev", - "comments": "" + "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." }, { "type": "git_off_t", @@ -33288,7 +29969,7 @@ "git_diff_commit_as_email", "git_diff_index_to_index", "git_diff_index_to_workdir", - "git_diff_init_options", + "git_diff_options_init", "git_diff_tree_to_index", "git_diff_tree_to_tree", "git_diff_tree_to_workdir", @@ -33314,7 +29995,7 @@ "block": "unsigned int version", "tdef": "typedef", "description": " Patch ID options structure", - "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can\n use git_patchid_init_options.

\n", + "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -33326,50 +30007,7 @@ "returns": [], "needs": [ "git_diff_patchid", - "git_diff_patchid_init_options" - ] - } - } - ], - [ - "git_diff_perfdata", - { - "decl": [ - "unsigned int version", - "size_t stat_calls", - "size_t oid_calculations" - ], - "type": "struct", - "value": "git_diff_perfdata", - "file": "git2/sys/diff.h", - "line": 67, - "lineto": 71, - "block": "unsigned int version\nsize_t stat_calls\nsize_t oid_calculations", - "tdef": "typedef", - "description": " Performance data from diffing", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "size_t", - "name": "stat_calls", - "comments": " Number of stat() calls performed " - }, - { - "type": "size_t", - "name": "oid_calculations", - "comments": " Number of ID calculations " - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_get_perfdata", - "git_status_list_get_perfdata" + "git_diff_patchid_options_init" ] } } @@ -33438,7 +30076,6 @@ "tdef": "typedef", "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -33524,7 +30161,7 @@ "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", "tdef": "typedef", "description": " Direction of the connection.", - "comments": "

We need this because we need to know whether we should call\n git-upload-pack or git-receive-pack on the remote end when get_refs\n gets called.

\n", + "comments": "

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.

\n", "fields": [ { "type": "int", @@ -33564,7 +30201,7 @@ "block": "char * message\nint klass", "tdef": "typedef", "description": " Structure to store extra details of the last error that occurred.", - "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the\n library was build, otherwise one is kept globally for the library

\n", + "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", "fields": [ { "type": "char *", @@ -34087,8 +30724,8 @@ ], "type": "enum", "file": "git2/common.h", - "line": 130, - "lineto": 153, + "line": 127, + "lineto": 150, "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", "tdef": "typedef", "description": " Combinations of these values describe the features with which libgit2\n was compiled", @@ -34140,12 +30777,12 @@ "type": "struct", "value": "git_fetch_options", "file": "git2/remote.h", - "line": 629, - "lineto": 666, + "line": 651, + "lineto": 688, "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Fetch options structure.", - "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to\n correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", + "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", "fields": [ { "type": "int", @@ -34186,7 +30823,7 @@ "used": { "returns": [], "needs": [ - "git_fetch_init_options", + "git_fetch_options_init", "git_remote_download", "git_remote_fetch" ] @@ -34203,11 +30840,11 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 581, - "lineto": 594, + "line": 603, + "lineto": 616, "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", - "description": "", + "description": " Acceptable prune settings when fetching ", "comments": "", "fields": [ { @@ -34314,79 +30951,19 @@ "lineto": 61, "tdef": "typedef", "description": " A filter that can transform file data", - "comments": "

This represents a filter that can be used to transform or even replace\n file data. Libgit2 includes one built in filter and it is possible to\n write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and\n"crlf" file attributes to decide how to convert between LF and CRLF\nline endings
  • \n
  • "ident" which replaces "$Id$" in a blob with "$Id: \n$" upon\ncheckout and replaced "$Id: \n$" with "$Id$" on checkin.
  • \n
\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The `version` field should be set to `GIT_FILTER_VERSION`. " - }, - { - "type": "const char *", - "name": "attributes", - "comments": " A whitespace-separated list of attribute names to check for this\n filter (e.g. \"eol crlf text\"). If the attribute name is bare, it\n will be simply loaded and passed to the `check` callback. If it\n has a value (i.e. \"name=value\"), the attribute must match that\n value for the filter to be applied. The value may be a wildcard\n (eg, \"name=*\"), in which case the filter will be invoked for any\n value for the given attribute name. See the attribute parameter\n of the `check` callback for the attribute value that was specified." - }, - { - "type": "git_filter_init_fn", - "name": "initialize", - "comments": " Called when the filter is first used for any file. " - }, - { - "type": "git_filter_shutdown_fn", - "name": "shutdown", - "comments": " Called when the filter is removed or unregistered from the system. " - }, - { - "type": "git_filter_check_fn", - "name": "check", - "comments": " Called to determine whether the filter should be invoked for a\n given file. If this function returns `GIT_PASSTHROUGH` then the\n `apply` function will not be invoked and the contents will be passed\n through unmodified." - }, - { - "type": "git_filter_apply_fn", - "name": "apply", - "comments": " Called to actually apply the filter to file contents. If this\n function returns `GIT_PASSTHROUGH` then the contents will be passed\n through unmodified." - }, - { - "type": "git_filter_stream_fn", - "name": "stream", - "comments": " Called to apply the filter in a streaming manner. If this is not\n specified then the system will call `apply` with the whole buffer." - }, - { - "type": "git_filter_cleanup_fn", - "name": "cleanup", - "comments": " Called when the system is done filtering for a file. " - } - ], + "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", "used": { - "returns": [ - "git_filter_lookup", - "git_filter_source_mode" - ], + "returns": [], "needs": [ - "git_filter_apply_fn", - "git_filter_check_fn", - "git_filter_cleanup_fn", - "git_filter_init", - "git_filter_init_fn", "git_filter_list_apply_to_blob", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_contains", "git_filter_list_free", - "git_filter_list_length", "git_filter_list_load", - "git_filter_list_new", - "git_filter_list_push", "git_filter_list_stream_blob", "git_filter_list_stream_data", - "git_filter_list_stream_file", - "git_filter_register", - "git_filter_shutdown_fn", - "git_filter_source_id", - "git_filter_source_mode", - "git_filter_source_path", - "git_filter_source_repo", - "git_filter_stream_fn" + "git_filter_list_stream_file" ] } } @@ -34437,8 +31014,7 @@ "lineto": 73, "tdef": "typedef", "description": " List of filters to be applied", - "comments": "

This represents a list of filters to be applied to a file / blob. You\n can build the list with one call, apply it with another, and dispose it\n with a third. In typical usage, there are not many occasions where a\n git_filter_list is needed directly since the library will generally\n handle conversions for you, but it can be convenient to be able to\n build and apply the list sometimes.

\n", - "fields": [], + "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", "used": { "returns": [], "needs": [ @@ -34447,10 +31023,7 @@ "git_filter_list_apply_to_file", "git_filter_list_contains", "git_filter_list_free", - "git_filter_list_length", "git_filter_list_load", - "git_filter_list_new", - "git_filter_list_push", "git_filter_list_stream_blob", "git_filter_list_stream_data", "git_filter_list_stream_file" @@ -34502,12 +31075,9 @@ } ], "used": { - "returns": [ - "git_filter_source_mode" - ], + "returns": [], "needs": [ - "git_filter_list_load", - "git_filter_list_new" + "git_filter_list_load" ] } } @@ -34524,42 +31094,9 @@ "tdef": "typedef", "description": " A filter source represents a file/blob to be processed", "comments": "", - "fields": [], - "used": { - "returns": [], - "needs": [ - "git_filter_apply_fn", - "git_filter_check_fn", - "git_filter_source_id", - "git_filter_source_mode", - "git_filter_source_path", - "git_filter_source_repo", - "git_filter_stream_fn" - ] - } - } - ], - [ - "git_hashsig", - { - "decl": "git_hashsig", - "type": "struct", - "value": "git_hashsig", - "file": "git2/sys/hashsig.h", - "line": 17, - "lineto": 17, - "tdef": "typedef", - "description": " Similarity signature of arbitrary text content based on line hashes", - "comments": "", - "fields": [], "used": { "returns": [], - "needs": [ - "git_hashsig_compare", - "git_hashsig_create", - "git_hashsig_create_fromfile", - "git_hashsig_free" - ] + "needs": [] } } ], @@ -34579,7 +31116,7 @@ "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", "tdef": "typedef", "description": " Options for hashsig computation", - "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE,\n GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", + "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", "fields": [ { "type": "int", @@ -34608,10 +31145,7 @@ ], "used": { "returns": [], - "needs": [ - "git_hashsig_create", - "git_hashsig_create_fromfile" - ] + "needs": [] } } ], @@ -34627,17 +31161,11 @@ "tdef": "typedef", "description": " Memory representation of an index file. ", "comments": "", - "fields": [], "used": { "returns": [ "git_index_get_byindex", "git_index_get_bypath", - "git_index_name_get_byindex", - "git_index_reuc_get_byindex", - "git_index_reuc_get_bypath", - "git_merge_driver_source_ancestor", - "git_merge_driver_source_ours", - "git_merge_driver_source_theirs" + "git_remote_stats" ], "needs": [ "git_apply_to_tree", @@ -34649,7 +31177,7 @@ "git_index_add", "git_index_add_all", "git_index_add_bypath", - "git_index_add_frombuffer", + "git_index_add_from_buffer", "git_index_caps", "git_index_checksum", "git_index_clear", @@ -34672,10 +31200,6 @@ "git_index_iterator_free", "git_index_iterator_new", "git_index_iterator_next", - "git_index_name_add", - "git_index_name_clear", - "git_index_name_entrycount", - "git_index_name_get_byindex", "git_index_new", "git_index_open", "git_index_owner", @@ -34686,13 +31210,6 @@ "git_index_remove_all", "git_index_remove_bypath", "git_index_remove_directory", - "git_index_reuc_add", - "git_index_reuc_clear", - "git_index_reuc_entrycount", - "git_index_reuc_find", - "git_index_reuc_get_byindex", - "git_index_reuc_get_bypath", - "git_index_reuc_remove", "git_index_set_caps", "git_index_set_version", "git_index_update_all", @@ -34704,15 +31221,17 @@ "git_indexer_commit", "git_indexer_free", "git_indexer_hash", - "git_indexer_init_options", "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", "git_merge_commits", "git_merge_file_from_index", "git_merge_trees", + "git_odb_write_pack", + "git_packbuilder_write", "git_pathspec_match_index", "git_rebase_inmemory_index", "git_repository_index", - "git_repository_set_index", "git_revert_commit" ] } @@ -34828,7 +31347,6 @@ "tdef": "typedef", "description": " An iterator for conflicts in the index. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -34845,15 +31363,15 @@ "decl": [ "git_index_time ctime", "git_index_time mtime", - "int dev", - "int ino", - "int mode", - "int uid", - "int gid", - "int file_size", + "uint32_t dev", + "uint32_t ino", + "uint32_t mode", + "uint32_t uid", + "uint32_t gid", + "uint32_t file_size", "git_oid id", - "int flags", - "int flags_extended", + "uint16_t flags", + "uint16_t flags_extended", "const char * path" ], "type": "struct", @@ -34861,10 +31379,10 @@ "file": "git2/index.h", "line": 53, "lineto": 70, - "block": "git_index_time ctime\ngit_index_time mtime\nint dev\nint ino\nint mode\nint uid\nint gid\nint file_size\ngit_oid id\nint flags\nint flags_extended\nconst char * path", + "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", "tdef": "typedef", - "description": "", - "comments": "", + "description": " In-memory representation of a file entry in the index.", + "comments": "

This is a public structure that represents a file entry in the index. The meaning of the fields corresponds to core Git's documentation (in "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be accessed via the first set of GIT_INDEX_ENTRY_... bitmasks below. These flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be accessed via the later GIT_INDEX_ENTRY_... bitmasks below. Some of these flags are read from and written to disk, but some are set aside for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This is enough to detect changes, which is enough for the index to function as a cache, but it should not be taken as an authoritative source for that data.

\n", "fields": [ { "type": "git_index_time", @@ -34877,32 +31395,32 @@ "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "dev", "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "ino", "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "mode", "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "uid", "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "gid", "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "file_size", "comments": "" }, @@ -34912,12 +31430,12 @@ "comments": "" }, { - "type": "int", + "type": "uint16_t", "name": "flags", "comments": "" }, { - "type": "int", + "type": "uint16_t", "name": "flags_extended", "comments": "" }, @@ -34930,14 +31448,11 @@ "used": { "returns": [ "git_index_get_byindex", - "git_index_get_bypath", - "git_merge_driver_source_ancestor", - "git_merge_driver_source_ours", - "git_merge_driver_source_theirs" + "git_index_get_bypath" ], "needs": [ "git_index_add", - "git_index_add_frombuffer", + "git_index_add_from_buffer", "git_index_conflict_add", "git_index_conflict_get", "git_index_conflict_next", @@ -34965,7 +31480,7 @@ "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", "tdef": "typedef", "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", - "comments": "

In memory, the flags_extended fields are divided into two parts: the\n fields that are read from and written to disk, and other fields that\n in-memory only and used by libgit2. Only the flags in\n GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the\n git_index_entry flags_extended value that belong on disk. You\n can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry\n flags_extended value that are only used in-memory by libgit2.\n You can use them to interpret the data in the flags_extended.

\n", + "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", "fields": [ { "type": "int", @@ -35045,7 +31560,6 @@ "tdef": "typedef", "description": " An iterator for entries in the index. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -35056,91 +31570,6 @@ } } ], - [ - "git_index_name_entry", - { - "decl": [ - "char * ancestor", - "char * ours", - "char * theirs" - ], - "type": "struct", - "value": "git_index_name_entry", - "file": "git2/sys/index.h", - "line": 23, - "lineto": 27, - "block": "char * ancestor\nchar * ours\nchar * theirs", - "tdef": "typedef", - "description": " Representation of a rename conflict entry in the index. ", - "comments": "", - "fields": [ - { - "type": "char *", - "name": "ancestor", - "comments": "" - }, - { - "type": "char *", - "name": "ours", - "comments": "" - }, - { - "type": "char *", - "name": "theirs", - "comments": "" - } - ], - "used": { - "returns": [ - "git_index_name_get_byindex" - ], - "needs": [] - } - } - ], - [ - "git_index_reuc_entry", - { - "decl": [ - "int [3] mode", - "git_oid [3] oid", - "char * path" - ], - "type": "struct", - "value": "git_index_reuc_entry", - "file": "git2/sys/index.h", - "line": 30, - "lineto": 34, - "block": "int [3] mode\ngit_oid [3] oid\nchar * path", - "tdef": "typedef", - "description": "", - "comments": "", - "fields": [ - { - "type": "int [3]", - "name": "mode", - "comments": "" - }, - { - "type": "git_oid [3]", - "name": "oid", - "comments": "" - }, - { - "type": "char *", - "name": "path", - "comments": "" - } - ], - "used": { - "returns": [ - "git_index_reuc_get_byindex", - "git_index_reuc_get_bypath" - ], - "needs": [] - } - } - ], [ "git_index_stage_t", { @@ -35153,11 +31582,11 @@ ], "type": "enum", "file": "git2/index.h", - "line": 146, - "lineto": 166, + "line": 147, + "lineto": 167, "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", "tdef": "typedef", - "description": "", + "description": " Git index stage states ", "comments": "", "fields": [ { @@ -35201,26 +31630,26 @@ "git_index_time", { "decl": [ - "int seconds", - "int nanoseconds" + "int32_t seconds", + "uint32_t nanoseconds" ], "type": "struct", "value": "git_index_time", "file": "git2/index.h", "line": 26, "lineto": 30, - "block": "int seconds\nint nanoseconds", + "block": "int32_t seconds\nuint32_t nanoseconds", "tdef": "typedef", - "description": "", + "description": " Time structure used in a git index entry ", "comments": "", "fields": [ { - "type": "int", + "type": "int32_t", "name": "seconds", "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "nanoseconds", "comments": "" } @@ -35238,21 +31667,25 @@ "type": "struct", "value": "git_indexer", "file": "git2/indexer.h", - "line": 16, - "lineto": 16, + "line": 17, + "lineto": 17, "tdef": "typedef", - "description": "", + "description": " A git indexer object ", "comments": "", - "fields": [], "used": { - "returns": [], + "returns": [ + "git_remote_stats" + ], "needs": [ "git_indexer_append", "git_indexer_commit", "git_indexer_free", "git_indexer_hash", - "git_indexer_init_options", - "git_indexer_new" + "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" ] } } @@ -35262,18 +31695,18 @@ { "decl": [ "unsigned int version", - "git_transfer_progress_cb progress_cb", + "git_indexer_progress_cb progress_cb", "void * progress_cb_payload", "unsigned char verify" ], "type": "struct", "value": "git_indexer_options", "file": "git2/indexer.h", - "line": 18, - "lineto": 28, - "block": "unsigned int version\ngit_transfer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", + "line": 62, + "lineto": 72, + "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", "tdef": "typedef", - "description": "", + "description": " Options for indexer configuration", "comments": "", "fields": [ { @@ -35282,7 +31715,7 @@ "comments": "" }, { - "type": "git_transfer_progress_cb", + "type": "git_indexer_progress_cb", "name": "progress_cb", "comments": " progress_cb function to call with progress information " }, @@ -35300,28 +31733,81 @@ "used": { "returns": [], "needs": [ - "git_indexer_init_options", - "git_indexer_new" + "git_indexer_new", + "git_indexer_options_init" ] } } ], [ - "git_iterator", + "git_indexer_progress", { - "decl": [], + "decl": [ + "unsigned int total_objects", + "unsigned int indexed_objects", + "unsigned int received_objects", + "unsigned int local_objects", + "unsigned int total_deltas", + "unsigned int indexed_deltas", + "size_t received_bytes" + ], "type": "struct", - "value": "git_iterator", - "file": "git2/notes.h", - "line": 35, - "lineto": 35, - "tdef": null, - "description": "", + "value": "git_indexer_progress", + "file": "git2/indexer.h", + "line": 24, + "lineto": 48, + "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", + "tdef": "typedef", + "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", "comments": "", - "fields": [], + "fields": [ + { + "type": "unsigned int", + "name": "total_objects", + "comments": " number of objects in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_objects", + "comments": " received objects that have been hashed " + }, + { + "type": "unsigned int", + "name": "received_objects", + "comments": " received_objects: objects which have been downloaded " + }, + { + "type": "unsigned int", + "name": "local_objects", + "comments": " locally-available objects that have been injected in order\n to fix a thin pack" + }, + { + "type": "unsigned int", + "name": "total_deltas", + "comments": " number of deltas in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_deltas", + "comments": " received deltas that have been indexed " + }, + { + "type": "size_t", + "name": "received_bytes", + "comments": " size of the packfile received up to now " + } + ], "used": { - "returns": [], - "needs": [] + "returns": [ + "git_remote_stats" + ], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] } } ], @@ -35355,16 +31841,17 @@ "GIT_OPT_SET_ALLOCATOR", "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", "GIT_OPT_GET_PACK_MAX_OBJECTS", - "GIT_OPT_SET_PACK_MAX_OBJECTS" + "GIT_OPT_SET_PACK_MAX_OBJECTS", + "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS" ], "type": "enum", "file": "git2/common.h", - "line": 181, - "lineto": 209, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS", + "line": 178, + "lineto": 207, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", "tdef": "typedef", "description": " Global library options", - "comments": "

These are used to select which global option to set or get and are\n used in git_libgit2_opts().

\n", + "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", "fields": [ { "type": "int", @@ -35527,6 +32014,12 @@ "name": "GIT_OPT_SET_PACK_MAX_OBJECTS", "comments": "", "value": 26 + }, + { + "type": "int", + "name": "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "comments": "", + "value": 27 } ], "used": { @@ -35542,12 +32035,11 @@ "type": "struct", "value": "git_mailmap", "file": "git2/types.h", - "line": 442, - "lineto": 442, + "line": 412, + "lineto": 412, "tdef": "typedef", "description": " Representation of .mailmap file state. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -35576,8 +32068,8 @@ ], "type": "enum", "file": "git2/merge.h", - "line": 320, - "lineto": 349, + "line": 316, + "lineto": 345, "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", "tdef": "typedef", "description": " The results of `git_merge_analysis` indicate the merge opportunities.", @@ -35623,58 +32115,6 @@ } } ], - [ - "git_merge_driver", - { - "decl": "git_merge_driver", - "type": "struct", - "value": "git_merge_driver", - "file": "git2/sys/merge.h", - "line": 24, - "lineto": 24, - "tdef": "typedef", - "description": " \n\n git2/sys/merge.h\n ", - "comments": "

@\n{

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The `version` should be set to `GIT_MERGE_DRIVER_VERSION`. " - }, - { - "type": "git_merge_driver_init_fn", - "name": "initialize", - "comments": " Called when the merge driver is first used for any file. " - }, - { - "type": "git_merge_driver_shutdown_fn", - "name": "shutdown", - "comments": " Called when the merge driver is unregistered from the system. " - }, - { - "type": "git_merge_driver_apply_fn", - "name": "apply", - "comments": " Called to merge the contents of a conflict. If this function\n returns `GIT_PASSTHROUGH` then the default (`text`) merge driver\n will instead be invoked. If this function returns\n `GIT_EMERGECONFLICT` then the file will remain conflicted." - } - ], - "used": { - "returns": [ - "git_merge_driver_lookup" - ], - "needs": [ - "git_merge_driver_apply_fn", - "git_merge_driver_init_fn", - "git_merge_driver_register", - "git_merge_driver_shutdown_fn", - "git_merge_driver_source_ancestor", - "git_merge_driver_source_file_options", - "git_merge_driver_source_ours", - "git_merge_driver_source_repo", - "git_merge_driver_source_theirs" - ] - } - } - ], [ "git_merge_driver_source", { @@ -35687,17 +32127,9 @@ "tdef": "typedef", "description": " A merge driver source represents the file to be merged", "comments": "", - "fields": [], "used": { "returns": [], - "needs": [ - "git_merge_driver_apply_fn", - "git_merge_driver_source_ancestor", - "git_merge_driver_source_file_options", - "git_merge_driver_source_ours", - "git_merge_driver_source_repo", - "git_merge_driver_source_theirs" - ] + "needs": [] } } ], @@ -35884,7 +32316,7 @@ "returns": [], "needs": [ "git_merge_file", - "git_merge_file_init_input" + "git_merge_file_input_init" ] } } @@ -35948,13 +32380,11 @@ } ], "used": { - "returns": [ - "git_merge_driver_source_file_options" - ], + "returns": [], "needs": [ "git_merge_file", "git_merge_file_from_index", - "git_merge_file_init_options" + "git_merge_file_options_init" ] } } @@ -35972,8 +32402,8 @@ "type": "struct", "value": "git_merge_file_result", "file": "git2/merge.h", - "line": 222, - "lineto": 243, + "line": 220, + "lineto": 241, "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", "tdef": "typedef", "description": " Information about file-level merging", @@ -36081,8 +32511,8 @@ "type": "struct", "value": "git_merge_options", "file": "git2/merge.h", - "line": 248, - "lineto": 297, + "line": 246, + "lineto": 295, "block": "unsigned int version\ngit_merge_flag_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\ngit_merge_file_flag_t file_flags", "tdef": "typedef", "description": " Merging options", @@ -36140,7 +32570,7 @@ "git_cherrypick_commit", "git_merge", "git_merge_commits", - "git_merge_init_options", + "git_merge_options_init", "git_merge_trees", "git_revert_commit" ] @@ -36157,8 +32587,8 @@ ], "type": "enum", "file": "git2/merge.h", - "line": 354, - "lineto": 372, + "line": 350, + "lineto": 368, "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", "tdef": "typedef", "description": " The user's stated preference for merges.", @@ -36245,7 +32675,7 @@ "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", "tdef": "typedef", "description": " Represents an array of git message trailers.", - "comments": "

Struct members under the private comment are private, subject to change\n and should not be used by callers.

\n", + "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", "fields": [ { "type": "git_message_trailer *", @@ -36284,7 +32714,6 @@ "tdef": "typedef", "description": " Representation of a git note ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -36339,7 +32768,6 @@ "tdef": "typedef", "description": " Representation of a generic object in a repository ", "comments": "", - "fields": [], "used": { "returns": [ "git_object_string2type", @@ -36351,7 +32779,6 @@ "needs": [ "git_checkout_tree", "git_describe_commit", - "git_object__size", "git_object_dup", "git_object_free", "git_object_id", @@ -36361,6 +32788,7 @@ "git_object_owner", "git_object_peel", "git_object_short_id", + "git_object_size", "git_object_type", "git_object_type2string", "git_object_typeisloose", @@ -36466,11 +32894,11 @@ "git_tree_entry_type" ], "needs": [ - "git_object__size", "git_object_lookup", "git_object_lookup_bypath", "git_object_lookup_prefix", "git_object_peel", + "git_object_size", "git_object_type2string", "git_object_typeisloose", "git_odb_hash", @@ -36497,19 +32925,14 @@ "tdef": "typedef", "description": " An open object database handle. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ "git_indexer_new", - "git_mempack_dump", - "git_mempack_new", - "git_mempack_reset", "git_odb_add_alternate", "git_odb_add_backend", "git_odb_add_disk_alternate", "git_odb_backend_loose", - "git_odb_backend_malloc", "git_odb_backend_one_pack", "git_odb_backend_pack", "git_odb_exists", @@ -36518,7 +32941,6 @@ "git_odb_foreach", "git_odb_free", "git_odb_get_backend", - "git_odb_init_backend", "git_odb_new", "git_odb_num_backends", "git_odb_object_data", @@ -36541,7 +32963,6 @@ "git_odb_write", "git_odb_write_pack", "git_repository_odb", - "git_repository_set_odb", "git_repository_wrap_odb" ] } @@ -36556,101 +32977,18 @@ "file": "git2/types.h", "line": 85, "lineto": 85, - "block": "unsigned int version\ngit_odb * odb\nint (*)(void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *) read\nint (*)(git_oid *, void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *, size_t) read_prefix\nint (*)(size_t *, git_object_t *, git_odb_backend *, const git_oid *) read_header\nint (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_object_t) write\nint (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_object_t) writestream\nint (*)(git_odb_stream **, size_t *, git_object_t *, git_odb_backend *, const git_oid *) readstream\nint (*)(git_odb_backend *, const git_oid *) exists\nint (*)(git_oid *, git_odb_backend *, const git_oid *, size_t) exists_prefix\nint (*)(git_odb_backend *) refresh\nint (*)(git_odb_backend *, git_odb_foreach_cb, void *) foreach\nint (*)(git_odb_writepack **, git_odb_backend *, git_odb *, git_transfer_progress_cb, void *) writepack\nint (*)(git_odb_backend *, const git_oid *) freshen\nvoid (*)(git_odb_backend *) free", "tdef": "typedef", "description": " A custom backend in an ODB ", "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_odb *", - "name": "odb", - "comments": "" - }, - { - "type": "int (*)(void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *)", - "name": "read", - "comments": "" - }, - { - "type": "int (*)(git_oid *, void **, size_t *, git_object_t *, git_odb_backend *, const git_oid *, size_t)", - "name": "read_prefix", - "comments": "" - }, - { - "type": "int (*)(size_t *, git_object_t *, git_odb_backend *, const git_oid *)", - "name": "read_header", - "comments": "" - }, - { - "type": "int (*)(git_odb_backend *, const git_oid *, const void *, size_t, git_object_t)", - "name": "write", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream **, git_odb_backend *, git_off_t, git_object_t)", - "name": "writestream", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream **, size_t *, git_object_t *, git_odb_backend *, const git_oid *)", - "name": "readstream", - "comments": "" - }, - { - "type": "int (*)(git_odb_backend *, const git_oid *)", - "name": "exists", - "comments": "" - }, - { - "type": "int (*)(git_oid *, git_odb_backend *, const git_oid *, size_t)", - "name": "exists_prefix", - "comments": "" - }, - { - "type": "int (*)(git_odb_backend *)", - "name": "refresh", - "comments": "" - }, - { - "type": "int (*)(git_odb_backend *, git_odb_foreach_cb, void *)", - "name": "foreach", - "comments": "" - }, - { - "type": "int (*)(git_odb_writepack **, git_odb_backend *, git_odb *, git_transfer_progress_cb, void *)", - "name": "writepack", - "comments": "" - }, - { - "type": "int (*)(git_odb_backend *, const git_oid *)", - "name": "freshen", - "comments": "" - }, - { - "type": "void (*)(git_odb_backend *)", - "name": "free", - "comments": "" - } - ], "used": { "returns": [], "needs": [ - "git_mempack_dump", - "git_mempack_new", - "git_mempack_reset", "git_odb_add_alternate", "git_odb_add_backend", "git_odb_backend_loose", - "git_odb_backend_malloc", "git_odb_backend_one_pack", "git_odb_backend_pack", - "git_odb_get_backend", - "git_odb_init_backend" + "git_odb_get_backend" ] } } @@ -36666,8 +33004,8 @@ "type": "struct", "value": "git_odb_expand_id", "file": "git2/odb.h", - "line": 180, - "lineto": 195, + "line": 181, + "lineto": 196, "block": "git_oid id\nunsigned short length\ngit_object_t type", "tdef": "typedef", "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", @@ -36709,7 +33047,6 @@ "tdef": "typedef", "description": " An object read from the ODB ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -36808,8 +33145,8 @@ ], "type": "enum", "file": "git2/odb_backend.h", - "line": 70, - "lineto": 74, + "line": 71, + "lineto": 75, "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", "tdef": "typedef", "description": " Streaming mode ", @@ -36849,7 +33186,7 @@ "file": "git2/types.h", "line": 94, "lineto": 94, - "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_transfer_progress *) append\nint (*)(git_odb_writepack *, git_transfer_progress *) commit\nvoid (*)(git_odb_writepack *) free", + "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "tdef": "typedef", "description": " A stream to write a packfile to the ODB ", "comments": "", @@ -36860,12 +33197,12 @@ "comments": "" }, { - "type": "int (*)(git_odb_writepack *, const void *, size_t, git_transfer_progress *)", + "type": "int (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *)", "name": "append", "comments": "" }, { - "type": "int (*)(git_odb_writepack *, git_transfer_progress *)", + "type": "int (*)(git_odb_writepack *, git_indexer_progress *)", "name": "commit", "comments": "" }, @@ -36912,7 +33249,6 @@ "git_commit_id", "git_commit_parent_id", "git_commit_tree_id", - "git_filter_source_id", "git_index_checksum", "git_indexer_hash", "git_note_id", @@ -36920,6 +33256,8 @@ "git_odb_object_id", "git_oid_shorten_new", "git_packbuilder_hash", + "git_rebase_onto_id", + "git_rebase_orig_head_id", "git_reference_target", "git_reference_target_peel", "git_reflog_entry_id_new", @@ -36935,16 +33273,15 @@ "needs": [ "git_annotated_commit_from_fetchhead", "git_annotated_commit_lookup", - "git_blob_create_frombuffer", - "git_blob_create_fromdisk", - "git_blob_create_fromstream_commit", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", "git_blob_create_fromworkdir", "git_blob_lookup", "git_blob_lookup_prefix", "git_commit_amend", "git_commit_create", - "git_commit_create_from_callback", - "git_commit_create_from_ids", "git_commit_create_v", "git_commit_create_with_signature", "git_commit_extract_signature", @@ -36953,7 +33290,6 @@ "git_diff_patchid", "git_graph_ahead_behind", "git_graph_descendant_of", - "git_index_reuc_add", "git_index_write_tree", "git_index_write_tree_to", "git_merge_base", @@ -36990,6 +33326,7 @@ "git_oid_fromstr", "git_oid_fromstrn", "git_oid_fromstrp", + "git_oid_is_zero", "git_oid_iszero", "git_oid_ncmp", "git_oid_nfmt", @@ -37006,7 +33343,6 @@ "git_packbuilder_insert_recur", "git_packbuilder_insert_tree", "git_rebase_commit", - "git_reference__alloc", "git_reference_create", "git_reference_create_matching", "git_reference_name_to_id", @@ -37024,7 +33360,7 @@ "git_stash_save", "git_tag_annotation_create", "git_tag_create", - "git_tag_create_frombuffer", + "git_tag_create_from_buffer", "git_tag_create_lightweight", "git_tag_foreach_cb", "git_tag_lookup", @@ -37053,7 +33389,6 @@ "tdef": "typedef", "description": " OID Shortener object", "comments": "", - "fields": [], "used": { "returns": [ "git_oid_shorten_new" @@ -37115,7 +33450,6 @@ "tdef": "typedef", "description": " Representation of a git packbuilder ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -37147,8 +33481,8 @@ ], "type": "enum", "file": "git2/pack.h", - "line": 51, - "lineto": 54, + "line": 52, + "lineto": 55, "block": "GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION", "tdef": "typedef", "description": " Stages that are reported by the packbuilder progress callback.", @@ -37184,8 +33518,7 @@ "lineto": 29, "tdef": "typedef", "description": " The diff patch is used to store all the text diffs for a delta.", - "comments": "

You can easily loop over the content of patches and get information about\n them.

\n", - "fields": [], + "comments": "

You can easily loop over the content of patches and get information about them.

\n", "used": { "returns": [], "needs": [ @@ -37245,53 +33578,7 @@ ], "used": { "returns": [], - "needs": [ - "git_path_is_gitfile" - ] - } - } - ], - [ - "git_path_gitfile", - { - "decl": [ - "GIT_PATH_GITFILE_GITIGNORE", - "GIT_PATH_GITFILE_GITMODULES", - "GIT_PATH_GITFILE_GITATTRIBUTES" - ], - "type": "enum", - "file": "git2/sys/path.h", - "line": 21, - "lineto": 28, - "block": "GIT_PATH_GITFILE_GITIGNORE\nGIT_PATH_GITFILE_GITMODULES\nGIT_PATH_GITFILE_GITATTRIBUTES", - "tdef": "typedef", - "description": " The kinds of git-specific files we know about.", - "comments": "

The order needs to stay the same to not break the gitfiles\n array in path.c

\n", - "fields": [ - { - "type": "int", - "name": "GIT_PATH_GITFILE_GITIGNORE", - "comments": "

Check for the .gitignore file

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PATH_GITFILE_GITMODULES", - "comments": "

Check for the .gitmodules file

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_PATH_GITFILE_GITATTRIBUTES", - "comments": "

Check for the .gitattributes file

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [ - "git_path_is_gitfile" - ] + "needs": [] } } ], @@ -37307,7 +33594,6 @@ "tdef": "typedef", "description": " Compiled pathspec", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -37410,7 +33696,6 @@ "tdef": "typedef", "description": " List of filenames matching a pathspec", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -37447,7 +33732,7 @@ "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "tdef": "typedef", "description": " Options for connecting through a proxy", - "comments": "

Note that not all types may be supported, depending on the platform\n and compilation options.

\n", + "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", "fields": [ { "type": "unsigned int", @@ -37483,9 +33768,8 @@ "used": { "returns": [], "needs": [ - "git_proxy_init_options", - "git_remote_connect", - "git_transport_smart_proxy_options" + "git_proxy_options_init", + "git_remote_connect" ] } } @@ -37544,12 +33828,11 @@ "tdef": "typedef", "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ - "git_push_init_options", "git_push_negotiation", + "git_push_options_init", "git_remote_push", "git_remote_upload" ] @@ -37569,8 +33852,8 @@ "type": "struct", "value": "git_push_options", "file": "git2/remote.h", - "line": 690, - "lineto": 717, + "line": 712, + "lineto": 739, "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", @@ -37605,7 +33888,7 @@ "used": { "returns": [], "needs": [ - "git_push_init_options", + "git_push_options_init", "git_remote_push", "git_remote_upload" ] @@ -37624,8 +33907,8 @@ "type": "struct", "value": "git_push_update", "file": "git2/remote.h", - "line": 433, - "lineto": 450, + "line": 434, + "lineto": 451, "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", "tdef": "typedef", "description": " Represents an update which will be performed on the remote during push", @@ -37672,7 +33955,6 @@ "tdef": "typedef", "description": " Representation of a rebase ", "comments": "", - "fields": [], "used": { "returns": [ "git_rebase_operation_byindex" @@ -37683,13 +33965,17 @@ "git_rebase_finish", "git_rebase_free", "git_rebase_init", - "git_rebase_init_options", "git_rebase_inmemory_index", "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", "git_rebase_open", "git_rebase_operation_byindex", "git_rebase_operation_current", - "git_rebase_operation_entrycount" + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" ] } } @@ -37710,7 +33996,7 @@ "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", "tdef": "typedef", "description": " A rebase operation", - "comments": "

Describes a single instruction/operation to be performed during the\n rebase.

\n", + "comments": "

Describes a single instruction/operation to be performed during the rebase.

\n", "fields": [ { "type": "git_rebase_operation_t", @@ -37857,8 +34143,8 @@ "returns": [], "needs": [ "git_rebase_init", - "git_rebase_init_options", - "git_rebase_open" + "git_rebase_open", + "git_rebase_options_init" ] } } @@ -37875,19 +34161,14 @@ "tdef": "typedef", "description": " An open refs database handle. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ - "git_refdb_backend_fs", "git_refdb_compress", "git_refdb_free", - "git_refdb_init_backend", "git_refdb_new", "git_refdb_open", - "git_refdb_set_backend", - "git_repository_refdb", - "git_repository_set_refdb" + "git_repository_refdb" ] } } @@ -37901,104 +34182,12 @@ "file": "git2/types.h", "line": 100, "lineto": 100, - "block": "unsigned int version\nint (*)(int *, git_refdb_backend *, const char *) exists\nint (*)(git_reference **, git_refdb_backend *, const char *) lookup\nint (*)(git_reference_iterator **, struct git_refdb_backend *, const char *) iterator\nint (*)(git_refdb_backend *, const git_reference *, int, const git_signature *, const char *, const git_oid *, const char *) write\nint (*)(git_reference **, git_refdb_backend *, const char *, const char *, int, const git_signature *, const char *) rename\nint (*)(git_refdb_backend *, const char *, const git_oid *, const char *) del\nint (*)(git_refdb_backend *) compress\nint (*)(git_refdb_backend *, const char *) has_log\nint (*)(git_refdb_backend *, const char *) ensure_log\nvoid (*)(git_refdb_backend *) free\nint (*)(git_reflog **, git_refdb_backend *, const char *) reflog_read\nint (*)(git_refdb_backend *, git_reflog *) reflog_write\nint (*)(git_refdb_backend *, const char *, const char *) reflog_rename\nint (*)(git_refdb_backend *, const char *) reflog_delete\nint (*)(void **, git_refdb_backend *, const char *) lock\nint (*)(git_refdb_backend *, void *, int, int, const git_reference *, const git_signature *, const char *) unlock", "tdef": "typedef", "description": " A custom backend for refs ", "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "int (*)(int *, git_refdb_backend *, const char *)", - "name": "exists", - "comments": "" - }, - { - "type": "int (*)(git_reference **, git_refdb_backend *, const char *)", - "name": "lookup", - "comments": "" - }, - { - "type": "int (*)(git_reference_iterator **, struct git_refdb_backend *, const char *)", - "name": "iterator", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, const git_reference *, int, const git_signature *, const char *, const git_oid *, const char *)", - "name": "write", - "comments": "" - }, - { - "type": "int (*)(git_reference **, git_refdb_backend *, const char *, const char *, int, const git_signature *, const char *)", - "name": "rename", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, const char *, const git_oid *, const char *)", - "name": "del", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *)", - "name": "compress", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, const char *)", - "name": "has_log", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, const char *)", - "name": "ensure_log", - "comments": "" - }, - { - "type": "void (*)(git_refdb_backend *)", - "name": "free", - "comments": "" - }, - { - "type": "int (*)(git_reflog **, git_refdb_backend *, const char *)", - "name": "reflog_read", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, git_reflog *)", - "name": "reflog_write", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, const char *, const char *)", - "name": "reflog_rename", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, const char *)", - "name": "reflog_delete", - "comments": "" - }, - { - "type": "int (*)(void **, git_refdb_backend *, const char *)", - "name": "lock", - "comments": "" - }, - { - "type": "int (*)(git_refdb_backend *, void *, int, int, const git_reference *, const git_signature *, const char *)", - "name": "unlock", - "comments": "" - } - ], "used": { "returns": [], - "needs": [ - "git_refdb_backend_fs", - "git_refdb_init_backend", - "git_refdb_set_backend" - ] + "needs": [] } } ], @@ -38014,11 +34203,8 @@ "tdef": "typedef", "description": " In-memory representation of a reference. ", "comments": "", - "fields": [], "used": { "returns": [ - "git_reference__alloc", - "git_reference__alloc_symbolic", "git_reference_type" ], "needs": [ @@ -38088,8 +34274,8 @@ ], "type": "enum", "file": "git2/refs.h", - "line": 639, - "lineto": 668, + "line": 658, + "lineto": 687, "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", "tdef": "typedef", "description": " Normalization options for reference lookup", @@ -38135,32 +34321,9 @@ "file": "git2/types.h", "line": 180, "lineto": 180, - "block": "git_refdb * db\nint (*)(git_reference **, git_reference_iterator *) next\nint (*)(const char **, git_reference_iterator *) next_name\nvoid (*)(git_reference_iterator *) free", "tdef": "typedef", "description": " Iterator for references ", "comments": "", - "fields": [ - { - "type": "git_refdb *", - "name": "db", - "comments": "" - }, - { - "type": "int (*)(git_reference **, git_reference_iterator *)", - "name": "next", - "comments": "" - }, - { - "type": "int (*)(const char **, git_reference_iterator *)", - "name": "next_name", - "comments": "" - }, - { - "type": "void (*)(git_reference_iterator *)", - "name": "free", - "comments": "" - } - ], "used": { "returns": [], "needs": [ @@ -38236,16 +34399,13 @@ "tdef": "typedef", "description": " Representation of a reference log ", "comments": "", - "fields": [], "used": { "returns": [ - "git_reflog_entry__alloc", "git_reflog_entry_byindex" ], "needs": [ "git_reflog_append", "git_reflog_drop", - "git_reflog_entry__free", "git_reflog_entry_byindex", "git_reflog_entry_committer", "git_reflog_entry_id_new", @@ -38272,14 +34432,11 @@ "tdef": "typedef", "description": " Representation of a reference log entry ", "comments": "", - "fields": [], "used": { "returns": [ - "git_reflog_entry__alloc", "git_reflog_entry_byindex" ], "needs": [ - "git_reflog_entry__free", "git_reflog_entry_committer", "git_reflog_entry_id_new", "git_reflog_entry_id_old", @@ -38300,7 +34457,6 @@ "tdef": "typedef", "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", "comments": "", - "fields": [], "used": { "returns": [ "git_remote_get_refspec" @@ -38333,7 +34489,6 @@ "tdef": "typedef", "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entires).", "comments": "", - "fields": [], "used": { "returns": [ "git_remote_autotag" @@ -38347,7 +34502,7 @@ "git_remote_create_anonymous", "git_remote_create_cb", "git_remote_create_detached", - "git_remote_create_init_options", + "git_remote_create_options_init", "git_remote_create_with_fetchspec", "git_remote_create_with_opts", "git_remote_default_branch", @@ -38375,12 +34530,7 @@ "git_remote_update_tips", "git_remote_upload", "git_remote_url", - "git_transport_cb", - "git_transport_dummy", - "git_transport_local", - "git_transport_new", - "git_transport_smart", - "git_transport_ssh_with_paths" + "git_transport_cb" ] } } @@ -38396,8 +34546,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 601, - "lineto": 619, + "line": 623, + "lineto": 641, "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", "tdef": "typedef", "description": " Automatic tag following option", @@ -38442,16 +34592,31 @@ [ "git_remote_callbacks", { - "decl": "git_remote_callbacks", + "decl": [ + "unsigned int version", + "git_transport_message_cb sideband_progress", + "int (*)(git_remote_completion_t, void *) completion", + "git_cred_acquire_cb credentials", + "git_transport_certificate_check_cb certificate_check", + "git_indexer_progress_cb transfer_progress", + "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", + "git_packbuilder_progress pack_progress", + "git_push_transfer_progress_cb push_transfer_progress", + "git_push_update_reference_cb push_update_reference", + "git_push_negotiation push_negotiation", + "git_transport_cb transport", + "void * payload", + "git_url_resolve_cb resolve_url" + ], "type": "struct", "value": "git_remote_callbacks", - "file": "git2/types.h", - "line": 245, - "lineto": 245, - "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_type, void *) completion\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_transfer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload", - "tdef": "typedef", - "description": "", - "comments": "", + "file": "git2/remote.h", + "line": 497, + "lineto": 585, + "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload\ngit_url_resolve_cb resolve_url", + "tdef": null, + "description": " The callback settings structure", + "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", "fields": [ { "type": "unsigned int", @@ -38464,7 +34629,7 @@ "comments": " Textual progress from the remote. Text send over the\n progress side-band will be passed to this function (this is\n the 'counting objects' output)." }, { - "type": "int (*)(git_remote_completion_type, void *)", + "type": "int (*)(git_remote_completion_t, void *)", "name": "completion", "comments": "" }, @@ -38479,7 +34644,7 @@ "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." }, { - "type": "git_transfer_progress_cb", + "type": "git_indexer_progress_cb", "name": "transfer_progress", "comments": " During the download of new data, this will be regularly\n called with the current count of progress done by the\n indexer." }, @@ -38494,7 +34659,7 @@ "comments": " Function to call with progress information during pack\n building. Be aware that this is called inline with pack\n building operations, so performance may be affected." }, { - "type": "git_push_transfer_progress", + "type": "git_push_transfer_progress_cb", "name": "push_transfer_progress", "comments": " Function to call with progress information during the\n upload portion of a push. Be aware that this is called\n inline with pack building operations, so performance may be\n affected." }, @@ -38517,6 +34682,11 @@ "type": "void *", "name": "payload", "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." + }, + { + "type": "git_url_resolve_cb", + "name": "resolve_url", + "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead." } ], "used": { @@ -38531,7 +34701,7 @@ } ], [ - "git_remote_completion_type", + "git_remote_completion_t", { "decl": [ "GIT_REMOTE_COMPLETION_DOWNLOAD", @@ -38625,7 +34795,7 @@ "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", "tdef": "typedef", "description": " Remote creation options structure", - "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can\n use git_remote_create_init_options.

\n", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -38656,7 +34826,7 @@ "used": { "returns": [], "needs": [ - "git_remote_create_init_options", + "git_remote_create_options_init", "git_remote_create_with_opts" ] } @@ -38665,15 +34835,21 @@ [ "git_remote_head", { - "decl": "git_remote_head", + "decl": [ + "int local", + "git_oid oid", + "git_oid loid", + "char * name", + "char * symref_target" + ], "type": "struct", "value": "git_remote_head", - "file": "git2/types.h", - "line": 244, - "lineto": 244, + "file": "git2/net.h", + "line": 40, + "lineto": 50, "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", - "tdef": "typedef", - "description": "", + "tdef": null, + "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", "comments": "", "fields": [ { @@ -38723,14 +34899,11 @@ "tdef": "typedef", "description": " Representation of an existing git repository,\n including all its object contents", "comments": "", - "fields": [], "used": { "returns": [ "git_blob_owner", "git_commit_owner", - "git_filter_source_repo", "git_index_owner", - "git_merge_driver_source_repo", "git_object_owner", "git_reference_owner", "git_remote_owner", @@ -38752,9 +34925,10 @@ "git_attr_get", "git_attr_get_many", "git_blame_file", - "git_blob_create_frombuffer", - "git_blob_create_fromdisk", - "git_blob_create_fromstream", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_workdir", "git_blob_create_fromworkdir", "git_blob_lookup", "git_blob_lookup_prefix", @@ -38773,14 +34947,11 @@ "git_clone", "git_commit_create", "git_commit_create_buffer", - "git_commit_create_from_callback", - "git_commit_create_from_ids", "git_commit_create_v", "git_commit_create_with_signature", "git_commit_extract_signature", "git_commit_lookup", "git_commit_lookup_prefix", - "git_config_add_backend", "git_config_add_file_ondisk", "git_describe_workdir", "git_diff_commit_as_email", @@ -38792,7 +34963,6 @@ "git_diff_tree_to_workdir_with_index", "git_filter_list_apply_to_file", "git_filter_list_load", - "git_filter_list_new", "git_filter_list_stream_file", "git_graph_ahead_behind", "git_graph_descendant_of", @@ -38801,7 +34971,6 @@ "git_ignore_path_is_ignored", "git_index_write_tree_to", "git_mailmap_from_repository", - "git_mempack_dump", "git_merge", "git_merge_analysis", "git_merge_analysis_for_ref", @@ -38828,7 +34997,6 @@ "git_pathspec_match_workdir", "git_rebase_init", "git_rebase_open", - "git_refdb_backend_fs", "git_refdb_new", "git_refdb_open", "git_reference_create", @@ -38863,7 +35031,6 @@ "git_remote_set_autotag", "git_remote_set_pushurl", "git_remote_set_url", - "git_repository__cleanup", "git_repository_commondir", "git_repository_config", "git_repository_config_snapshot", @@ -38882,7 +35049,7 @@ "git_repository_index", "git_repository_init", "git_repository_init_ext", - "git_repository_init_init_options", + "git_repository_init_options_init", "git_repository_is_bare", "git_repository_is_empty", "git_repository_is_shallow", @@ -38891,7 +35058,6 @@ "git_repository_mergehead_foreach", "git_repository_message", "git_repository_message_remove", - "git_repository_new", "git_repository_odb", "git_repository_open", "git_repository_open_bare", @@ -38899,22 +35065,14 @@ "git_repository_open_from_worktree", "git_repository_path", "git_repository_refdb", - "git_repository_reinit_filesystem", - "git_repository_set_bare", - "git_repository_set_config", "git_repository_set_head", "git_repository_set_head_detached", "git_repository_set_head_detached_from_annotated", "git_repository_set_ident", - "git_repository_set_index", "git_repository_set_namespace", - "git_repository_set_odb", - "git_repository_set_refdb", "git_repository_set_workdir", "git_repository_state", "git_repository_state_cleanup", - "git_repository_submodule_cache_all", - "git_repository_submodule_cache_clear", "git_repository_workdir", "git_repository_wrap_odb", "git_reset", @@ -38951,7 +35109,7 @@ "git_submodule_status", "git_tag_annotation_create", "git_tag_create", - "git_tag_create_frombuffer", + "git_tag_create_from_buffer", "git_tag_create_lightweight", "git_tag_delete", "git_tag_foreach", @@ -38992,7 +35150,7 @@ "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", "tdef": "typedef", "description": " Option flags for `git_repository_init_ext`.", - "comments": "

These flags configure extra behaviors to git_repository_init_ext.\n In every case, the default behavior is the zero value (i.e. flag is\n not set). Just OR the flag values together for the flags parameter\n when initializing a new repo. Details of individual values are:

\n\n
    \n
  • BARE - Create a bare repository with no working directory.
  • \n
  • NO_REINIT - Return an GIT_EEXISTS error if the repo_path appears to\n already be an git repository.
  • \n
  • NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo\n path for non-bare repos (if it is not already there), but\n passing this flag prevents that behavior.
  • \n
  • MKDIR - Make the repo_path (and workdir_path) as needed. Init is\n always willing to create the ".git" directory even without this\n flag. This flag tells init to create the trailing component of\n the repo and workdir paths as needed.
  • \n
  • MKPATH - Recursively make all components of the repo and workdir\n paths as necessary.
  • \n
  • EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to\n initialize a new repo. This flags enables external templates,\n looking the "template_path" from the options if set, or the\n init.templatedir global config if not, or falling back on\n "/usr/share/git-core/templates" if it exists.
  • \n
  • GIT_REPOSITORY_INIT_RELATIVE_GITLINK - If an alternate workdir is\n specified, use relative paths for the gitdir and core.worktree.
  • \n
\n", + "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo. Details of individual values are:

\n\n
    \n
  • BARE - Create a bare repository with no working directory. * NO_REINIT - Return an GIT_EEXISTS error if the repo_path appears to already be an git repository. * NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo path for non-bare repos (if it is not already there), but passing this flag prevents that behavior. * MKDIR - Make the repo_path (and workdir_path) as needed. Init is always willing to create the ".git" directory even without this flag. This flag tells init to create the trailing component of the repo and workdir paths as needed. * MKPATH - Recursively make all components of the repo and workdir paths as necessary. * EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to initialize a new repo. This flags enables external templates, looking the "template_path" from the options if set, or the init.templatedir global config if not, or falling back on "/usr/share/git-core/templates" if it exists. * GIT_REPOSITORY_INIT_RELATIVE_GITLINK - If an alternate workdir is specified, use relative paths for the gitdir and core.worktree.
  • \n
\n", "fields": [ { "type": "int", @@ -39058,7 +35216,7 @@ "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", "tdef": "typedef", "description": " Mode options for `git_repository_init_ext`.", - "comments": "

Set the mode field of the git_repository_init_options structure\n either to the custom mode that you would like, or to one of the\n following modes:

\n\n
    \n
  • SHARED_UMASK - Use permissions configured by umask - the default.
  • \n
  • SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo\n to be group writable and "g+sx" for sticky group assignment.
  • \n
  • SHARED_ALL - Use "--shared=all" behavior, adding world readability.
  • \n
  • Anything else - Set to custom value.
  • \n
\n", + "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the following modes:

\n\n
    \n
  • SHARED_UMASK - Use permissions configured by umask - the default. * SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo to be group writable and "g+sx" for sticky group assignment. * SHARED_ALL - Use "--shared=all" behavior, adding world readability. * Anything else - Set to custom value.
  • \n
\n", "fields": [ { "type": "int", @@ -39090,8 +35248,8 @@ { "decl": [ "unsigned int version", - "int flags", - "int mode", + "uint32_t flags", + "uint32_t mode", "const char * workdir_path", "const char * description", "const char * template_path", @@ -39103,10 +35261,10 @@ "file": "git2/repository.h", "line": 302, "lineto": 311, - "block": "unsigned int version\nint flags\nint mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", + "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", "tdef": "typedef", - "description": "", - "comments": "", + "description": " Extended options structure for `git_repository_init_ext`.", + "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features. The fields are:

\n\n
    \n
  • flags - Combination of GIT_REPOSITORY_INIT flags above. * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants above, or to a custom value that you would like. * workdir_path - The path to the working dir or NULL for default (i.e. repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not the "natural" working directory, a .git gitlink file will be created here linking to the repo_path. * description - If set, this will be used to initialize the "description" file in the repository, instead of using the template content. * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains the path to use for the template directory. If this is NULL, the config or default directory options will be used instead. * initial_head - The name of the head to point HEAD at. If NULL, then this will be treated as "master" and the HEAD ref will be set to "refs/heads/master". If this begins with "refs/" it will be used verbatim; otherwise "refs/heads/" will be prefixed. * origin_url - If this is non-NULL, then after the rest of the repository initialization is completed, an "origin" remote will be added pointing to this URL.
  • \n
\n", "fields": [ { "type": "unsigned int", @@ -39114,12 +35272,12 @@ "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "flags", "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "mode", "comments": "" }, @@ -39153,7 +35311,7 @@ "returns": [], "needs": [ "git_repository_init_ext", - "git_repository_init_init_options" + "git_repository_init_options_init" ] } } @@ -39354,12 +35512,12 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 799, - "lineto": 812, + "line": 820, + "lineto": 833, "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", "tdef": "typedef", "description": " Repository state", - "comments": "

These values represent possible states for the repository to be in,\n based on the current operation which is ongoing.

\n", + "comments": "

These values represent possible states for the repository to be in, based on the current operation which is ongoing.

\n", "fields": [ { "type": "int", @@ -39529,7 +35687,7 @@ "returns": [], "needs": [ "git_revert", - "git_revert_init_options" + "git_revert_options_init" ] } } @@ -39630,7 +35788,6 @@ "tdef": "typedef", "description": " Representation of an in-progress walk through the commits in a repo ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -39705,8 +35862,6 @@ "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", - "git_commit_create_from_callback", - "git_commit_create_from_ids", "git_commit_create_v", "git_mailmap_resolve_signature", "git_note_commit_create", @@ -39780,126 +35935,6 @@ } } ], - [ - "git_smart_subtransport", - { - "decl": "git_smart_subtransport", - "type": "struct", - "value": "git_smart_subtransport", - "file": "git2/sys/transport.h", - "line": 294, - "lineto": 294, - "tdef": "typedef", - "description": " An implementation of a subtransport which carries data for the\n smart transport", - "comments": "", - "fields": [ - { - "type": "int (*)(git_smart_subtransport_stream **, git_smart_subtransport *, const char *, git_smart_service_t)", - "name": "action", - "comments": "" - }, - { - "type": "int (*)(git_smart_subtransport *)", - "name": "close", - "comments": "" - }, - { - "type": "void (*)(git_smart_subtransport *)", - "name": "free", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_smart_subtransport_cb", - "git_smart_subtransport_git", - "git_smart_subtransport_http", - "git_smart_subtransport_ssh" - ] - } - } - ], - [ - "git_smart_subtransport_definition", - { - "decl": [ - "git_smart_subtransport_cb callback", - "unsigned int rpc", - "void * param" - ], - "type": "struct", - "value": "git_smart_subtransport_definition", - "file": "git2/sys/transport.h", - "line": 383, - "lineto": 395, - "block": "git_smart_subtransport_cb callback\nunsigned int rpc\nvoid * param", - "tdef": "typedef", - "description": " Definition for a \"subtransport\"", - "comments": "

The smart transport knows how to speak the git protocol, but it has no\n knowledge of how to establish a connection between it and another endpoint,\n or how to move data back and forth. For this, a subtransport interface is\n declared, and the smart transport delegates this work to the subtransports.

\n\n

Three subtransports are provided by libgit2: ssh, git, http(s).

\n\n

Subtransports can either be RPC = 0 (persistent connection) or RPC = 1\n (request/response). The smart transport handles the differences in its own\n logic. The git subtransport is RPC = 0, while http is RPC = 1.

\n", - "fields": [ - { - "type": "git_smart_subtransport_cb", - "name": "callback", - "comments": " The function to use to create the git_smart_subtransport " - }, - { - "type": "unsigned int", - "name": "rpc", - "comments": " True if the protocol is stateless; false otherwise. For example,\n http:// is stateless, but git:// is not." - }, - { - "type": "void *", - "name": "param", - "comments": " User-specified parameter passed to the callback " - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_smart_subtransport_stream", - { - "decl": "git_smart_subtransport_stream", - "type": "struct", - "value": "git_smart_subtransport_stream", - "file": "git2/sys/transport.h", - "line": 295, - "lineto": 295, - "tdef": "typedef", - "description": " A stream used by the smart transport to read and write data\n from a subtransport.", - "comments": "

This provides a customization point in case you need to\n support some other communication method.

\n", - "fields": [ - { - "type": "git_smart_subtransport *", - "name": "subtransport", - "comments": " The owning subtransport " - }, - { - "type": "int (*)(git_smart_subtransport_stream *, char *, size_t, size_t *)", - "name": "read", - "comments": "" - }, - { - "type": "int (*)(git_smart_subtransport_stream *, const char *, size_t)", - "name": "write", - "comments": "" - }, - { - "type": "void (*)(git_smart_subtransport_stream *)", - "name": "free", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_sort_t", { @@ -40002,7 +36037,7 @@ "block": "unsigned int version\ngit_stash_apply_flags flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", "tdef": "typedef", "description": " Stash application options structure", - "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can\n use git_stash_apply_init_options.

\n", + "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can use git_stash_apply_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -40034,7 +36069,7 @@ "returns": [], "needs": [ "git_stash_apply", - "git_stash_apply_init_options", + "git_stash_apply_options_init", "git_stash_pop" ] } @@ -40184,7 +36219,7 @@ "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", "tdef": "typedef", "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", - "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the\n differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the\n differences between the file in the index and the file in the\n working directory.

\n", + "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the differences between the file in the index and the file in the working directory.

\n", "fields": [ { "type": "git_status_t", @@ -40222,14 +36257,12 @@ "tdef": "typedef", "description": " Representation of a status collection ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ "git_status_byindex", "git_status_list_entrycount", "git_status_list_free", - "git_status_list_get_perfdata", "git_status_list_new" ] } @@ -40263,7 +36296,7 @@ "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", "tdef": "typedef", "description": " Flags to control status callbacks", - "comments": "
    \n
  • GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made\non untracked files. These will only be made if the workdir files are\nincluded in the status "show" option.
  • \n
  • GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files get callbacks.\nAgain, these callbacks will only be made if the workdir files are\nincluded in the status "show" option.
  • \n
  • GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be\nmade even on unmodified files.
  • \n
  • GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that submodules should be\nskipped. This only applies if there are no pending typechanges to\nthe submodule (either from or to another type).
  • \n
  • GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that all files in\nuntracked directories should be included. Normally if an entire\ndirectory is new, then just the top-level directory is included (with\na trailing slash on the entry name). This flag says to include all\nof the individual files in the directory instead.
  • \n
  • GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path\nshould be treated as a literal path, and not as a pathspec pattern.
  • \n
  • GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of\nignored directories should be included in the status. This is like\ndoing git ls-files -o -i --exclude-standard with core git.
  • \n
  • GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that rename detection\nshould be processed between the head and the index and enables\nthe GIT_STATUS_INDEX_RENAMED as a possible status flag.
  • \n
  • GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that rename\ndetection should be run between the index and the working directory\nand enabled GIT_STATUS_WT_RENAMED as a possible status flag.
  • \n
  • GIT_STATUS_OPT_SORT_CASE_SENSITIVELY overrides the native case\nsensitivity for the file system and forces the output to be in\ncase-sensitive order
  • \n
  • GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY overrides the native case\nsensitivity for the file system and forces the output to be in\ncase-insensitive order
  • \n
  • GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection\nshould include rewritten files
  • \n
  • GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of\ndoing a "soft" index reload (i.e. reloading the index data if the\nfile on disk has been modified outside libgit2).
  • \n
  • GIT_STATUS_OPT_UPDATE_INDEX tells libgit2 to refresh the stat cache\nin the index for files that are unchanged but have out of date stat\ninformation in the index. It will result in less work being done on\nsubsequent calls to get status. This is mutually exclusive with the\nNO_REFRESH option.
  • \n
\n\n

Calling git_status_foreach() is like calling the extended version\n with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED,\n and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled\n together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", + "comments": "
    \n
  • GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made on untracked files. These will only be made if the workdir files are included in the status "show" option. - GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files get callbacks. Again, these callbacks will only be made if the workdir files are included in the status "show" option. - GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be made even on unmodified files. - GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that submodules should be skipped. This only applies if there are no pending typechanges to the submodule (either from or to another type). - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that all files in untracked directories should be included. Normally if an entire directory is new, then just the top-level directory is included (with a trailing slash on the entry name). This flag says to include all of the individual files in the directory instead. - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path should be treated as a literal path, and not as a pathspec pattern. - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of ignored directories should be included in the status. This is like doing git ls-files -o -i --exclude-standard with core git. - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that rename detection should be processed between the head and the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status flag. - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that rename detection should be run between the index and the working directory and enabled GIT_STATUS_WT_RENAMED as a possible status flag. - GIT_STATUS_OPT_SORT_CASE_SENSITIVELY overrides the native case sensitivity for the file system and forces the output to be in case-sensitive order - GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY overrides the native case sensitivity for the file system and forces the output to be in case-insensitive order - GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection should include rewritten files - GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of doing a "soft" index reload (i.e. reloading the index data if the file on disk has been modified outside libgit2). - GIT_STATUS_OPT_UPDATE_INDEX tells libgit2 to refresh the stat cache in the index for files that are unchanged but have out of date stat information in the index. It will result in less work being done on subsequent calls to get status. This is mutually exclusive with the NO_REFRESH option.
  • \n
\n\n

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", "fields": [ { "type": "int", @@ -40386,7 +36419,7 @@ "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline", "tdef": "typedef", "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", - "comments": "

This structure is set so that zeroing it out will give you relatively\n sane defaults.

\n\n

The show value is one of the git_status_show_t constants that\n control which files to scan and in what order.

\n\n

The flags value is an OR'ed combination of the git_status_opt_t\n values above.

\n\n

The pathspec is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match exactly if\n GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH is specified in the flags.

\n\n

The baseline is the tree to be used for comparison to the working directory\n and index; defaults to HEAD.

\n", + "comments": "

This structure is set so that zeroing it out will give you relatively sane defaults.

\n\n

The show value is one of the git_status_show_t constants that control which files to scan and in what order.

\n\n

The flags value is an OR'ed combination of the git_status_opt_t values above.

\n\n

The pathspec is an array of path patterns to match (using fnmatch-style matching), or just an array of paths to match exactly if GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH is specified in the flags.

\n\n

The baseline is the tree to be used for comparison to the working directory and index; defaults to HEAD.

\n", "fields": [ { "type": "unsigned int", @@ -40418,8 +36451,8 @@ "returns": [], "needs": [ "git_status_foreach_ext", - "git_status_init_options", - "git_status_list_new" + "git_status_list_new", + "git_status_options_init" ] } } @@ -40439,7 +36472,7 @@ "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", "tdef": "typedef", "description": " Select the files on which to report status.", - "comments": "

With git_status_foreach_ext, this will control which changes get\n callbacks. With git_status_list_new, these will control which\n changes are included in the list.

\n\n
    \n
  • GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This roughly\nmatches git status --porcelain regarding which files are\nincluded and in what order.
  • \n
  • GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index\ncomparison, not looking at working directory changes.
  • \n
  • GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to\nworking directory comparison, not comparing the index to the HEAD.
  • \n
\n", + "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n\n
    \n
  • GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This roughly matches git status --porcelain regarding which files are included and in what order. - GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index comparison, not looking at working directory changes. - GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to working directory comparison, not comparing the index to the HEAD.
  • \n
\n", "fields": [ { "type": "int", @@ -40492,7 +36525,7 @@ "block": "GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED", "tdef": "typedef", "description": " Status flags for a single file.", - "comments": "

A combination of these values will be returned to indicate the status of\n a file. Status compares the working directory, the index, and the\n current HEAD of the repository. The GIT_STATUS_INDEX set of flags\n represents the status of file in the index relative to the HEAD, and the\n GIT_STATUS_WT set of flags represent the status of the file in the\n working directory relative to the index.

\n", + "comments": "

A combination of these values will be returned to indicate the status of a file. Status compares the working directory, the index, and the current HEAD of the repository. The GIT_STATUS_INDEX set of flags represents the status of file in the index relative to the HEAD, and the GIT_STATUS_WT set of flags represent the status of the file in the working directory relative to the index.

\n", "fields": [ { "type": "int", @@ -40640,128 +36673,6 @@ } } ], - [ - "git_stream", - { - "decl": [ - "int version", - "int encrypted", - "int proxy_support", - "int (*)(struct git_stream *) connect", - "int (*)(git_cert **, struct git_stream *) certificate", - "int (*)(struct git_stream *, const git_proxy_options *) set_proxy", - "int ((int *))(struct git_stream *, void *, size_t) ssize_t", - "int (*)(struct git_stream *) close", - "void (*)(struct git_stream *) free" - ], - "type": "struct", - "value": "git_stream", - "file": "git2/sys/stream.h", - "line": 29, - "lineto": 41, - "block": "int version\nint encrypted\nint proxy_support\nint (*)(struct git_stream *) connect\nint (*)(git_cert **, struct git_stream *) certificate\nint (*)(struct git_stream *, const git_proxy_options *) set_proxy\nint ((int *))(struct git_stream *, void *, size_t) ssize_t\nint (*)(struct git_stream *) close\nvoid (*)(struct git_stream *) free", - "tdef": "typedef", - "description": "", - "comments": "", - "fields": [ - { - "type": "int", - "name": "version", - "comments": "" - }, - { - "type": "int", - "name": "encrypted", - "comments": "" - }, - { - "type": "int", - "name": "proxy_support", - "comments": "" - }, - { - "type": "int (*)(struct git_stream *)", - "name": "connect", - "comments": "" - }, - { - "type": "int (*)(git_cert **, struct git_stream *)", - "name": "certificate", - "comments": "" - }, - { - "type": "int (*)(struct git_stream *, const git_proxy_options *)", - "name": "set_proxy", - "comments": "" - }, - { - "type": "int ((int *))(struct git_stream *, void *, size_t)", - "name": "ssize_t", - "comments": "" - }, - { - "type": "int (*)(struct git_stream *)", - "name": "close", - "comments": "" - }, - { - "type": "void (*)(struct git_stream *)", - "name": "free", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_stream_cb", - "git_stream_register", - "git_stream_register_tls" - ] - } - } - ], - [ - "git_stream_registration", - { - "decl": [ - "int version", - "int (*)(git_stream **, const char *, const char *) init", - "int (*)(git_stream **, git_stream *, const char *) wrap" - ], - "type": "struct", - "value": "git_stream_registration", - "file": "git2/sys/stream.h", - "line": 43, - "lineto": 72, - "block": "int version\nint (*)(git_stream **, const char *, const char *) init\nint (*)(git_stream **, git_stream *, const char *) wrap", - "tdef": "typedef", - "description": "", - "comments": "", - "fields": [ - { - "type": "int", - "name": "version", - "comments": " The `version` field should be set to `GIT_STREAM_VERSION`. " - }, - { - "type": "int (*)(git_stream **, const char *, const char *)", - "name": "init", - "comments": "" - }, - { - "type": "int (*)(git_stream **, git_stream *, const char *)", - "name": "wrap", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_stream_register" - ] - } - } - ], [ "git_stream_t", { @@ -40793,9 +36704,7 @@ ], "used": { "returns": [], - "needs": [ - "git_stream_register" - ] + "needs": [] } } ], @@ -40806,12 +36715,11 @@ "type": "struct", "value": "git_submodule", "file": "git2/types.h", - "line": 343, - "lineto": 343, + "line": 313, + "lineto": 313, "tdef": "typedef", "description": " Opaque structure representing a submodule.", "comments": "", - "fields": [], "used": { "returns": [ "git_submodule_fetch_recurse_submodules", @@ -40845,7 +36753,7 @@ "git_submodule_status", "git_submodule_sync", "git_submodule_update", - "git_submodule_update_init_options", + "git_submodule_update_options_init", "git_submodule_update_strategy", "git_submodule_url", "git_submodule_wd_id" @@ -40865,12 +36773,12 @@ ], "type": "enum", "file": "git2/types.h", - "line": 407, - "lineto": 414, + "line": 377, + "lineto": 384, "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", "tdef": "typedef", "description": " Submodule ignore values", - "comments": "

These values represent settings for the submodule.$name.ignore\n configuration value which says how deeply to look at the working\n directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with\n git_submodule_set_ignore() and can write the changed value to disk\n with git_submodule_save(). If you have overwritten the value, you\n can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration
  • \n
  • GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an\nuntracked file, will mark the submodule as dirty. Ignored files are\nstill ignored, of course.
  • \n
  • GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes\nto tracked files, or the index or the HEAD commit will matter.
  • \n
  • GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory,\nonly considering changes if the HEAD of submodule has moved from the\nvalue in the superproject.
  • \n
  • GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty
  • \n
  • GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer\nwhen we don't want any particular ignore rule to be specified.
  • \n
\n", + "comments": "

These values represent settings for the submodule.$name.ignore configuration value which says how deeply to look at the working directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with git_submodule_set_ignore() and can write the changed value to disk with git_submodule_save(). If you have overwritten the value, you can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an untracked file, will mark the submodule as dirty. Ignored files are still ignored, of course. - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes to tracked files, or the index or the HEAD commit will matter. - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory, only considering changes if the HEAD of submodule has moved from the value in the superproject. - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer when we don't want any particular ignore rule to be specified.
  • \n
\n", "fields": [ { "type": "int", @@ -40924,12 +36832,12 @@ ], "type": "enum", "file": "git2/types.h", - "line": 426, - "lineto": 430, + "line": 396, + "lineto": 400, "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", "tdef": "typedef", "description": " Options for submodule recurse.", - "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules
  • \n
  • GIT_SUBMODULE_RECURSE_YES - recurse into submodules
  • \n
  • GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when\n commit not already in local clone
  • \n
\n", + "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules * GIT_SUBMODULE_RECURSE_YES - recurse into submodules * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when commit not already in local clone
  • \n
\n", "fields": [ { "type": "int", @@ -40986,7 +36894,7 @@ "block": "GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED", "tdef": "typedef", "description": " Return codes for submodule status.", - "comments": "

A combination of these flags will be returned to describe the status of a\n submodule. Depending on the "ignore" property of the submodule, some of\n the flags may never be returned because they indicate changes that are\n supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config\n files (both .git/config and .gitmodules), and the working directory. Any\n or all of those places might be missing information about the submodule\n depending on what state the repo is in. We consider all four places to\n build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info\n about what sources of submodule data are available. These will be\n returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule
  • \n
  • IN_INDEX - superproject index contains submodule
  • \n
  • IN_CONFIG - superproject gitmodules has submodule
  • \n
  • IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head
  • \n
  • INDEX_DELETED - in head, not in index
  • \n
  • INDEX_MODIFIED - index and head don't match
  • \n
  • WD_UNINITIALIZED - workdir contains empty directory
  • \n
  • WD_ADDED - in workdir, not index
  • \n
  • WD_DELETED - in index, not workdir
  • \n
  • WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty
  • \n
  • WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", + "comments": "

A combination of these flags will be returned to describe the status of a submodule. Depending on the "ignore" property of the submodule, some of the flags may never be returned because they indicate changes that are supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config files (both .git/config and .gitmodules), and the working directory. Any or all of those places might be missing information about the submodule depending on what state the repo is in. We consider all four places to build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info about what sources of submodule data are available. These will be returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule * IN_INDEX - superproject index contains submodule * IN_CONFIG - superproject gitmodules has submodule * IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head * INDEX_DELETED - in head, not in index * INDEX_MODIFIED - index and head don't match * WD_UNINITIALIZED - workdir contains empty directory * WD_ADDED - in workdir, not index * WD_DELETED - in index, not workdir * WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty * WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", "fields": [ { "type": "int", @@ -41096,7 +37004,7 @@ "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", "tdef": "typedef", "description": " Submodule update options structure", - "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can\n use git_submodule_update_init_options.

\n", + "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -41123,7 +37031,7 @@ "returns": [], "needs": [ "git_submodule_update", - "git_submodule_update_init_options" + "git_submodule_update_options_init" ] } } @@ -41140,12 +37048,12 @@ ], "type": "enum", "file": "git2/types.h", - "line": 371, - "lineto": 378, + "line": 341, + "lineto": 348, "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", "tdef": "typedef", "description": " Submodule update values", - "comments": "

These values represent settings for the submodule.$name.update\n configuration value which says how to handle git submodule update for\n this submodule. The value is usually set in the ".gitmodules" file and\n copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with\n git_submodule_set_update() and write the changed value to disk using\n git_submodule_save(). If you have overwritten the value, you can\n revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is\nupdated, checkout the new detached HEAD to the submodule directory.
  • \n
  • GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked\nout branch onto the commit from the superproject.
  • \n
  • GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the\nsuperproject into the current checkout out branch of the submodule.
  • \n
  • GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when\nthe commit in the superproject is updated.
  • \n
  • GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer\nwhen we don't want any particular update rule to be specified.
  • \n
\n", + "comments": "

These values represent settings for the submodule.$name.update configuration value which says how to handle git submodule update for this submodule. The value is usually set in the ".gitmodules" file and copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with git_submodule_set_update() and write the changed value to disk using git_submodule_save(). If you have overwritten the value, you can revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is updated, checkout the new detached HEAD to the submodule directory. - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked out branch onto the commit from the superproject. - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the superproject into the current checkout out branch of the submodule. - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when the commit in the superproject is updated. - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer when we don't want any particular update rule to be specified.
  • \n
\n", "fields": [ { "type": "int", @@ -41200,7 +37108,6 @@ "tdef": "typedef", "description": " Parsed representation of a tag object. ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -41333,7 +37240,7 @@ "used": { "returns": [], "needs": [ - "git_trace_callback", + "git_trace_cb", "git_trace_set" ] } @@ -41351,7 +37258,6 @@ "tdef": "typedef", "description": " Transactional interface to references ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -41368,78 +37274,6 @@ } } ], - [ - "git_transfer_progress", - { - "decl": [ - "unsigned int total_objects", - "unsigned int indexed_objects", - "unsigned int received_objects", - "unsigned int local_objects", - "unsigned int total_deltas", - "unsigned int indexed_deltas", - "size_t received_bytes" - ], - "type": "struct", - "value": "git_transfer_progress", - "file": "git2/types.h", - "line": 258, - "lineto": 266, - "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", - "tdef": "typedef", - "description": " This is passed as the first argument to the callback to allow the\n user to see the progress.", - "comments": "
    \n
  • total_objects: number of objects in the packfile being downloaded
  • \n
  • indexed_objects: received objects that have been hashed
  • \n
  • received_objects: objects which have been downloaded
  • \n
  • local_objects: locally-available objects that have been injected\nin order to fix a thin pack.
  • \n
  • received-bytes: size of the packfile received up to now
  • \n
\n", - "fields": [ - { - "type": "unsigned int", - "name": "total_objects", - "comments": "" - }, - { - "type": "unsigned int", - "name": "indexed_objects", - "comments": "" - }, - { - "type": "unsigned int", - "name": "received_objects", - "comments": "" - }, - { - "type": "unsigned int", - "name": "local_objects", - "comments": "" - }, - { - "type": "unsigned int", - "name": "total_deltas", - "comments": "" - }, - { - "type": "unsigned int", - "name": "indexed_deltas", - "comments": "" - }, - { - "type": "size_t", - "name": "received_bytes", - "comments": "" - } - ], - "used": { - "returns": [ - "git_remote_stats" - ], - "needs": [ - "git_indexer_append", - "git_indexer_commit", - "git_odb_write_pack", - "git_packbuilder_write", - "git_transfer_progress_cb" - ] - } - } - ], [ "git_transport", { @@ -41449,127 +37283,17 @@ "file": "git2/types.h", "line": 235, "lineto": 235, - "block": "unsigned int version\nint (*)(git_transport *, git_transport_message_cb, git_transport_message_cb, git_transport_certificate_check_cb, void *) set_callbacks\nint (*)(git_transport *, const git_strarray *) set_custom_headers\nint (*)(git_transport *, const char *, git_cred_acquire_cb, void *, const git_proxy_options *, int, int) connect\nint (*)(const git_remote_head ***, size_t *, git_transport *) ls\nint (*)(git_transport *, git_push *, const git_remote_callbacks *) push\nint (*)(git_transport *, git_repository *, const git_remote_head *const *, size_t) negotiate_fetch\nint (*)(git_transport *, git_repository *, git_transfer_progress *, git_transfer_progress_cb, void *) download_pack\nint (*)(git_transport *) is_connected\nint (*)(git_transport *, int *) read_flags\nvoid (*)(git_transport *) cancel\nint (*)(git_transport *) close\nvoid (*)(git_transport *) free", "tdef": "typedef", "description": " Interface which represents a transport to communicate with a\n remote.", "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The struct version " - }, - { - "type": "int (*)(git_transport *, git_transport_message_cb, git_transport_message_cb, git_transport_certificate_check_cb, void *)", - "name": "set_callbacks", - "comments": "" - }, - { - "type": "int (*)(git_transport *, const git_strarray *)", - "name": "set_custom_headers", - "comments": "" - }, - { - "type": "int (*)(git_transport *, const char *, git_cred_acquire_cb, void *, const git_proxy_options *, int, int)", - "name": "connect", - "comments": "" - }, - { - "type": "int (*)(const git_remote_head ***, size_t *, git_transport *)", - "name": "ls", - "comments": "" - }, - { - "type": "int (*)(git_transport *, git_push *, const git_remote_callbacks *)", - "name": "push", - "comments": "" - }, - { - "type": "int (*)(git_transport *, git_repository *, const git_remote_head *const *, size_t)", - "name": "negotiate_fetch", - "comments": "" - }, - { - "type": "int (*)(git_transport *, git_repository *, git_transfer_progress *, git_transfer_progress_cb, void *)", - "name": "download_pack", - "comments": "" - }, - { - "type": "int (*)(git_transport *)", - "name": "is_connected", - "comments": "" - }, - { - "type": "int (*)(git_transport *, int *)", - "name": "read_flags", - "comments": "" - }, - { - "type": "void (*)(git_transport *)", - "name": "cancel", - "comments": "" - }, - { - "type": "int (*)(git_transport *)", - "name": "close", - "comments": "" - }, - { - "type": "void (*)(git_transport *)", - "name": "free", - "comments": "" - } - ], "used": { "returns": [], "needs": [ - "git_smart_subtransport_cb", - "git_smart_subtransport_git", - "git_smart_subtransport_http", - "git_smart_subtransport_ssh", - "git_transport_cb", - "git_transport_dummy", - "git_transport_init", - "git_transport_local", - "git_transport_new", - "git_transport_register", - "git_transport_smart", - "git_transport_smart_certificate_check", - "git_transport_smart_credentials", - "git_transport_smart_proxy_options", - "git_transport_ssh_with_paths" + "git_transport_cb" ] } } ], - [ - "git_transport_flags_t", - { - "decl": [ - "GIT_TRANSPORTFLAGS_NONE" - ], - "type": "enum", - "file": "git2/sys/transport.h", - "line": 31, - "lineto": 33, - "block": "GIT_TRANSPORTFLAGS_NONE", - "tdef": "typedef", - "description": " Flags to pass to transport", - "comments": "

Currently unused.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_TRANSPORTFLAGS_NONE", - "comments": "", - "value": 0 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_tree", { @@ -41582,7 +37306,6 @@ "tdef": "typedef", "description": " Representation of a tree object. ", "comments": "", - "fields": [], "used": { "returns": [ "git_tree_entry_byid", @@ -41654,7 +37377,6 @@ "tdef": "typedef", "description": " Representation of each one of the entries in a tree object. ", "comments": "", - "fields": [], "used": { "returns": [ "git_tree_entry_byid", @@ -41775,7 +37497,6 @@ "tdef": "typedef", "description": " Constructor for in-memory trees ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ @@ -41842,13 +37563,12 @@ "tdef": "typedef", "description": " Representation of a working tree ", "comments": "", - "fields": [], "used": { "returns": [], "needs": [ "git_repository_open_from_worktree", "git_worktree_add", - "git_worktree_add_init_options", + "git_worktree_add_options_init", "git_worktree_free", "git_worktree_is_locked", "git_worktree_is_prunable", @@ -41858,7 +37578,7 @@ "git_worktree_open_from_repository", "git_worktree_path", "git_worktree_prune", - "git_worktree_prune_init_options", + "git_worktree_prune_options_init", "git_worktree_unlock", "git_worktree_validate" ] @@ -41881,7 +37601,7 @@ "block": "unsigned int version\nint lock\ngit_reference * ref", "tdef": "typedef", "description": " Worktree add options structure", - "comments": "

Initialize with GIT_WORKTREE_ADD_OPTIONS_INIT. Alternatively, you can\n use git_worktree_add_init_options.

\n", + "comments": "

Initialize with GIT_WORKTREE_ADD_OPTIONS_INIT. Alternatively, you can use git_worktree_add_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -41903,7 +37623,7 @@ "returns": [], "needs": [ "git_worktree_add", - "git_worktree_add_init_options" + "git_worktree_add_options_init" ] } } @@ -41913,17 +37633,17 @@ { "decl": [ "unsigned int version", - "int flags" + "uint32_t flags" ], "type": "struct", "value": "git_worktree_prune_options", "file": "git2/worktree.h", "line": 198, "lineto": 202, - "block": "unsigned int version\nint flags", + "block": "unsigned int version\nuint32_t flags", "tdef": "typedef", - "description": "", - "comments": "", + "description": " Worktree prune options structure", + "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -41931,7 +37651,7 @@ "comments": "" }, { - "type": "int", + "type": "uint32_t", "name": "flags", "comments": "" } @@ -41941,7 +37661,7 @@ "needs": [ "git_worktree_is_prunable", "git_worktree_prune", - "git_worktree_prune_init_options" + "git_worktree_prune_options_init" ] } } @@ -41991,13 +37711,17 @@ [ "git_writestream", { - "decl": "git_writestream", + "decl": [ + "int (*)(git_writestream *, const char *, size_t) write", + "int (*)(git_writestream *) close", + "void (*)(git_writestream *) free" + ], "type": "struct", "value": "git_writestream", "file": "git2/types.h", - "line": 432, - "lineto": 432, - "tdef": "typedef", + "line": 405, + "lineto": 409, + "tdef": null, "description": " A type to write in a streaming fashion, for example, for filters. ", "comments": "", "fields": [ @@ -42017,52 +37741,18 @@ "comments": "" } ], + "block": "int (*)(git_writestream *, const char *, size_t) write\nint (*)(git_writestream *) close\nvoid (*)(git_writestream *) free", "used": { "returns": [], "needs": [ - "git_blob_create_fromstream", - "git_blob_create_fromstream_commit", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", "git_filter_list_stream_blob", "git_filter_list_stream_data", - "git_filter_list_stream_file", - "git_filter_stream_fn" + "git_filter_list_stream_file" ] } } - ], - [ - "imaxdiv_t", - { - "decl": [ - "intmax_t quot", - "intmax_t rem" - ], - "type": "struct", - "value": "imaxdiv_t", - "file": "git2/inttypes.h", - "line": 51, - "lineto": 54, - "block": "intmax_t quot\nintmax_t rem", - "tdef": "typedef", - "description": "", - "comments": "", - "fields": [ - { - "type": "intmax_t", - "name": "quot", - "comments": "" - }, - { - "type": "intmax_t", - "name": "rem", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } ] ], "prefix": "include", @@ -42106,16 +37796,18 @@ "git_blame_get_hunk_byindex", "git_blame_get_hunk_byline", "git_blame_get_hunk_count", - "git_blame_init_options" + "git_blame_init_options", + "git_blame_options_init" ] ], [ "blob", [ - "git_blob_create_frombuffer", - "git_blob_create_fromdisk", - "git_blob_create_fromstream", - "git_blob_create_fromstream_commit", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", "git_blob_create_fromworkdir", "git_blob_dup", "git_blob_filtered_content", @@ -42166,7 +37858,7 @@ [ "git_checkout_head", "git_checkout_index", - "git_checkout_init_options", + "git_checkout_options_init", "git_checkout_tree" ] ], @@ -42175,14 +37867,14 @@ [ "git_cherrypick", "git_cherrypick_commit", - "git_cherrypick_init_options" + "git_cherrypick_options_init" ] ], [ "clone", [ "git_clone", - "git_clone_init_options" + "git_clone_options_init" ] ], [ @@ -42196,8 +37888,6 @@ "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", - "git_commit_create_from_callback", - "git_commit_create_from_ids", "git_commit_create_v", "git_commit_create_with_signature", "git_commit_dup", @@ -42226,7 +37916,6 @@ [ "config", [ - "git_config_add_backend", "git_config_add_file_ondisk", "git_config_backend_foreach_match", "git_config_delete_entry", @@ -42248,7 +37937,6 @@ "git_config_get_path", "git_config_get_string", "git_config_get_string_buf", - "git_config_init_backend", "git_config_iterator_free", "git_config_iterator_glob_new", "git_config_iterator_new", @@ -42294,8 +37982,8 @@ [ "git_describe_commit", "git_describe_format", - "git_describe_init_format_options", - "git_describe_init_options", + "git_describe_format_options_init", + "git_describe_options_init", "git_describe_result_free", "git_describe_workdir" ] @@ -42307,28 +37995,25 @@ "git_diff_blobs", "git_diff_buffers", "git_diff_commit_as_email", - "git_diff_find_init_options", + "git_diff_find_options_init", "git_diff_find_similar", "git_diff_foreach", "git_diff_format_email", - "git_diff_format_email_init_options", + "git_diff_format_email_options_init", "git_diff_free", "git_diff_from_buffer", "git_diff_get_delta", - "git_diff_get_perfdata", "git_diff_get_stats", "git_diff_index_to_index", "git_diff_index_to_workdir", - "git_diff_init_options", "git_diff_is_sorted_icase", "git_diff_merge", "git_diff_num_deltas", "git_diff_num_deltas_of_type", + "git_diff_options_init", "git_diff_patchid", - "git_diff_patchid_init_options", + "git_diff_patchid_options_init", "git_diff_print", - "git_diff_print_callback__to_buf", - "git_diff_print_callback__to_file_handle", "git_diff_stats_deletions", "git_diff_stats_files_changed", "git_diff_stats_free", @@ -42354,34 +38039,21 @@ [ "fetch", [ - "git_fetch_init_options" + "git_fetch_options_init" ] ], [ "filter", [ - "git_filter_init", "git_filter_list_apply_to_blob", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_contains", "git_filter_list_free", - "git_filter_list_length", "git_filter_list_load", - "git_filter_list_new", - "git_filter_list_push", "git_filter_list_stream_blob", "git_filter_list_stream_data", - "git_filter_list_stream_file", - "git_filter_lookup", - "git_filter_register", - "git_filter_source_filemode", - "git_filter_source_flags", - "git_filter_source_id", - "git_filter_source_mode", - "git_filter_source_path", - "git_filter_source_repo", - "git_filter_unregister" + "git_filter_list_stream_file" ] ], [ @@ -42400,15 +38072,6 @@ "git_graph_descendant_of" ] ], - [ - "hashsig", - [ - "git_hashsig_compare", - "git_hashsig_create", - "git_hashsig_create_fromfile", - "git_hashsig_free" - ] - ], [ "ignore", [ @@ -42417,19 +38080,13 @@ "git_ignore_path_is_ignored" ] ], - [ - "imaxdiv", - [ - "imaxdiv" - ] - ], [ "index", [ "git_index_add", "git_index_add_all", "git_index_add_bypath", - "git_index_add_frombuffer", + "git_index_add_from_buffer", "git_index_caps", "git_index_checksum", "git_index_clear", @@ -42452,10 +38109,6 @@ "git_index_iterator_free", "git_index_iterator_new", "git_index_iterator_next", - "git_index_name_add", - "git_index_name_clear", - "git_index_name_entrycount", - "git_index_name_get_byindex", "git_index_new", "git_index_open", "git_index_owner", @@ -42466,13 +38119,6 @@ "git_index_remove_all", "git_index_remove_bypath", "git_index_remove_directory", - "git_index_reuc_add", - "git_index_reuc_clear", - "git_index_reuc_entrycount", - "git_index_reuc_find", - "git_index_reuc_get_byindex", - "git_index_reuc_get_bypath", - "git_index_reuc_remove", "git_index_set_caps", "git_index_set_version", "git_index_update_all", @@ -42489,8 +38135,8 @@ "git_indexer_commit", "git_indexer_free", "git_indexer_hash", - "git_indexer_init_options", - "git_indexer_new" + "git_indexer_new", + "git_indexer_options_init" ] ], [ @@ -42515,14 +38161,6 @@ "git_mailmap_resolve_signature" ] ], - [ - "mempack", - [ - "git_mempack_dump", - "git_mempack_new", - "git_mempack_reset" - ] - ], [ "merge", [ @@ -42535,20 +38173,12 @@ "git_merge_bases", "git_merge_bases_many", "git_merge_commits", - "git_merge_driver_lookup", - "git_merge_driver_register", - "git_merge_driver_source_ancestor", - "git_merge_driver_source_file_options", - "git_merge_driver_source_ours", - "git_merge_driver_source_repo", - "git_merge_driver_source_theirs", - "git_merge_driver_unregister", "git_merge_file", "git_merge_file_from_index", - "git_merge_file_init_input", - "git_merge_file_init_options", + "git_merge_file_input_init", + "git_merge_file_options_init", "git_merge_file_result_free", - "git_merge_init_options", + "git_merge_options_init", "git_merge_trees" ] ], @@ -42585,7 +38215,6 @@ [ "object", [ - "git_object__size", "git_object_dup", "git_object_free", "git_object_id", @@ -42595,6 +38224,7 @@ "git_object_owner", "git_object_peel", "git_object_short_id", + "git_object_size", "git_object_string2type", "git_object_type", "git_object_type2string", @@ -42608,7 +38238,6 @@ "git_odb_add_backend", "git_odb_add_disk_alternate", "git_odb_backend_loose", - "git_odb_backend_malloc", "git_odb_backend_one_pack", "git_odb_backend_pack", "git_odb_exists", @@ -42619,7 +38248,6 @@ "git_odb_get_backend", "git_odb_hash", "git_odb_hashfile", - "git_odb_init_backend", "git_odb_new", "git_odb_num_backends", "git_odb_object_data", @@ -42654,6 +38282,7 @@ "git_oid_fromstr", "git_oid_fromstrn", "git_oid_fromstrp", + "git_oid_is_zero", "git_oid_iszero", "git_oid_ncmp", "git_oid_nfmt", @@ -42673,12 +38302,6 @@ "git_oidarray_free" ] ], - [ - "openssl", - [ - "git_openssl_set_locking" - ] - ], [ "packbuilder", [ @@ -42718,12 +38341,6 @@ "git_patch_to_buf" ] ], - [ - "path", - [ - "git_path_is_gitfile" - ] - ], [ "pathspec", [ @@ -42745,13 +38362,13 @@ [ "proxy", [ - "git_proxy_init_options" + "git_proxy_options_init" ] ], [ "push", [ - "git_push_init_options" + "git_push_options_init" ] ], [ @@ -42762,32 +38379,31 @@ "git_rebase_finish", "git_rebase_free", "git_rebase_init", - "git_rebase_init_options", "git_rebase_inmemory_index", "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", "git_rebase_open", "git_rebase_operation_byindex", "git_rebase_operation_current", - "git_rebase_operation_entrycount" + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" ] ], [ "refdb", [ - "git_refdb_backend_fs", "git_refdb_compress", "git_refdb_free", - "git_refdb_init_backend", "git_refdb_new", - "git_refdb_open", - "git_refdb_set_backend" + "git_refdb_open" ] ], [ "reference", [ - "git_reference__alloc", - "git_reference__alloc_symbolic", "git_reference_cmp", "git_reference_create", "git_reference_create_matching", @@ -42837,8 +38453,6 @@ "git_reflog_append", "git_reflog_delete", "git_reflog_drop", - "git_reflog_entry__alloc", - "git_reflog_entry__free", "git_reflog_entry_byindex", "git_reflog_entry_committer", "git_reflog_entry_id_new", @@ -42878,7 +38492,7 @@ "git_remote_create", "git_remote_create_anonymous", "git_remote_create_detached", - "git_remote_create_init_options", + "git_remote_create_options_init", "git_remote_create_with_fetchspec", "git_remote_create_with_opts", "git_remote_default_branch", @@ -42917,7 +38531,6 @@ [ "repository", [ - "git_repository__cleanup", "git_repository_commondir", "git_repository_config", "git_repository_config_snapshot", @@ -42936,7 +38549,7 @@ "git_repository_index", "git_repository_init", "git_repository_init_ext", - "git_repository_init_init_options", + "git_repository_init_options_init", "git_repository_is_bare", "git_repository_is_empty", "git_repository_is_shallow", @@ -42945,7 +38558,6 @@ "git_repository_mergehead_foreach", "git_repository_message", "git_repository_message_remove", - "git_repository_new", "git_repository_odb", "git_repository_open", "git_repository_open_bare", @@ -42953,22 +38565,14 @@ "git_repository_open_from_worktree", "git_repository_path", "git_repository_refdb", - "git_repository_reinit_filesystem", - "git_repository_set_bare", - "git_repository_set_config", "git_repository_set_head", "git_repository_set_head_detached", "git_repository_set_head_detached_from_annotated", "git_repository_set_ident", - "git_repository_set_index", "git_repository_set_namespace", - "git_repository_set_odb", - "git_repository_set_refdb", "git_repository_set_workdir", "git_repository_state", "git_repository_state_cleanup", - "git_repository_submodule_cache_all", - "git_repository_submodule_cache_clear", "git_repository_workdir", "git_repository_wrap_odb" ] @@ -42986,7 +38590,7 @@ [ "git_revert", "git_revert_commit", - "git_revert_init_options" + "git_revert_options_init" ] ], [ @@ -43030,19 +38634,11 @@ "git_signature_now" ] ], - [ - "smart", - [ - "git_smart_subtransport_git", - "git_smart_subtransport_http", - "git_smart_subtransport_ssh" - ] - ], [ "stash", [ "git_stash_apply", - "git_stash_apply_init_options", + "git_stash_apply_options_init", "git_stash_drop", "git_stash_foreach", "git_stash_pop", @@ -43056,20 +38652,13 @@ "git_status_file", "git_status_foreach", "git_status_foreach_ext", - "git_status_init_options", "git_status_list_entrycount", "git_status_list_free", - "git_status_list_get_perfdata", "git_status_list_new", + "git_status_options_init", "git_status_should_ignore" ] ], - [ - "stdalloc", - [ - "git_stdalloc_init_allocator" - ] - ], [ "strarray", [ @@ -43077,13 +38666,6 @@ "git_strarray_free" ] ], - [ - "stream", - [ - "git_stream_register", - "git_stream_register_tls" - ] - ], [ "submodule", [ @@ -43115,7 +38697,7 @@ "git_submodule_status", "git_submodule_sync", "git_submodule_update", - "git_submodule_update_init_options", + "git_submodule_update_options_init", "git_submodule_update_strategy", "git_submodule_url", "git_submodule_wd_id" @@ -43126,7 +38708,7 @@ [ "git_tag_annotation_create", "git_tag_create", - "git_tag_create_frombuffer", + "git_tag_create_from_buffer", "git_tag_create_lightweight", "git_tag_delete", "git_tag_dup", @@ -43147,12 +38729,6 @@ "git_tag_target_type" ] ], - [ - "time", - [ - "git_time_monotonic" - ] - ], [ "trace", [ @@ -43172,22 +38748,6 @@ "git_transaction_set_target" ] ], - [ - "transport", - [ - "git_transport_dummy", - "git_transport_init", - "git_transport_local", - "git_transport_new", - "git_transport_register", - "git_transport_smart", - "git_transport_smart_certificate_check", - "git_transport_smart_credentials", - "git_transport_smart_proxy_options", - "git_transport_ssh_with_paths", - "git_transport_unregister" - ] - ], [ "tree", [ @@ -43230,17 +38790,11 @@ "git_treebuilder_write_with_buffer" ] ], - [ - "win32", - [ - "git_win32_crtdbg_init_allocator" - ] - ], [ "worktree", [ "git_worktree_add", - "git_worktree_add_init_options", + "git_worktree_add_options_init", "git_worktree_free", "git_worktree_is_locked", "git_worktree_is_prunable", @@ -43251,7 +38805,7 @@ "git_worktree_open_from_repository", "git_worktree_path", "git_worktree_prune", - "git_worktree_prune_init_options", + "git_worktree_prune_options_init", "git_worktree_unlock", "git_worktree_validate" ] @@ -43260,103 +38814,99 @@ "examples": [ [ "add.c", - "ex/v0.28.0/add.html" + "ex/HEAD/add.html" ], [ "blame.c", - "ex/v0.28.0/blame.html" + "ex/HEAD/blame.html" ], [ "cat-file.c", - "ex/v0.28.0/cat-file.html" + "ex/HEAD/cat-file.html" ], [ "checkout.c", - "ex/v0.28.0/checkout.html" + "ex/HEAD/checkout.html" + ], + [ + "clone.c", + "ex/HEAD/clone.html" ], [ "common.c", - "ex/v0.28.0/common.html" + "ex/HEAD/common.html" ], [ "describe.c", - "ex/v0.28.0/describe.html" + "ex/HEAD/describe.html" ], [ "diff.c", - "ex/v0.28.0/diff.html" - ], - [ - "for-each-ref.c", - "ex/v0.28.0/for-each-ref.html" + "ex/HEAD/diff.html" ], [ - "general.c", - "ex/v0.28.0/general.html" - ], - [ - "init.c", - "ex/v0.28.0/init.html" + "fetch.c", + "ex/HEAD/fetch.html" ], [ - "log.c", - "ex/v0.28.0/log.html" + "for-each-ref.c", + "ex/HEAD/for-each-ref.html" ], [ - "ls-files.c", - "ex/v0.28.0/ls-files.html" + "general.c", + "ex/HEAD/general.html" ], [ - "merge.c", - "ex/v0.28.0/merge.html" + "index-pack.c", + "ex/HEAD/index-pack.html" ], [ - "network/clone.c", - "ex/v0.28.0/network/clone.html" + "init.c", + "ex/HEAD/init.html" ], [ - "network/common.c", - "ex/v0.28.0/network/common.html" + "lg2.c", + "ex/HEAD/lg2.html" ], [ - "network/fetch.c", - "ex/v0.28.0/network/fetch.html" + "log.c", + "ex/HEAD/log.html" ], [ - "network/git2.c", - "ex/v0.28.0/network/git2.html" + "ls-files.c", + "ex/HEAD/ls-files.html" ], [ - "network/index-pack.c", - "ex/v0.28.0/network/index-pack.html" + "ls-remote.c", + "ex/HEAD/ls-remote.html" ], [ - "network/ls-remote.c", - "ex/v0.28.0/network/ls-remote.html" + "merge.c", + "ex/HEAD/merge.html" ], [ "remote.c", - "ex/v0.28.0/remote.html" + "ex/HEAD/remote.html" ], [ "rev-list.c", - "ex/v0.28.0/rev-list.html" + "ex/HEAD/rev-list.html" ], [ "rev-parse.c", - "ex/v0.28.0/rev-parse.html" + "ex/HEAD/rev-parse.html" ], [ - "showindex.c", - "ex/v0.28.0/showindex.html" + "show-index.c", + "ex/HEAD/show-index.html" ], [ "status.c", - "ex/v0.28.0/status.html" + "ex/HEAD/status.html" ], [ "tag.c", - "ex/v0.28.0/tag.html" + "ex/HEAD/tag.html" ] ] } From 8d44cab68ef5b861ee5d55f2fe6c999f0714023e Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 24 Jun 2019 10:12:15 -0700 Subject: [PATCH 115/545] Supplement missing documentation --- generate/input/descriptor.json | 45 +- generate/input/libgit2-supplement.json | 651 ++++++++++++++++++++++--- 2 files changed, 613 insertions(+), 83 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 7db3b4c05..0e15fb204 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1539,7 +1539,20 @@ }, "hashsig": { "selfFreeing": true, + "freeFunctionName": "git_hashsig_free", "functions": { + "git_hashsig_create": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_hashsig_create_fromfile": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_hashsig_free": { "ignore": true } @@ -2527,9 +2540,7 @@ } }, "openssl": { - "cDependencies": [ - "git2/sys/openssl.h" - ] + "ignore": true }, "packbuilder": { "selfFreeing": true, @@ -3247,6 +3258,9 @@ "../include/remote.h" ], "functions": { + "git_repository__cleanup": { + "isAsync": true + }, "git_repository_config": { "args": { "out": { @@ -3366,6 +3380,16 @@ }, "git_repository_set_refdb": { "ignore": true + }, + "git_repository_submodule_cache_all": { + "return": { + "isErrorCode": true + } + }, + "git_repository_submodule_cache_clear": { + "return": { + "isErrorCode": true + } } } }, @@ -3619,6 +3643,21 @@ "git_status_list_free": { "ignore": true }, + "git_status_list_get_perfdata": { + "isAsync": false, + "args": { + "out": { + "isReturn": true, + "shouldAlloc": true + }, + "status": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } + }, "git_status_list_new": { "isAsync": true, "args": { diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 1b3e66a21..d22df8cbb 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -141,6 +141,23 @@ "isErrorCode": true } }, + "git_diff_get_perfdata": { + "file": "sys/diff.h", + "args": [ + { + "name": "out", + "type": "git_diff_perfdata *" + }, + { + "name": "diff", + "type": "const git_diff *" + } + ], + "return": { + "type": "int" + }, + "group": "diff" + }, "git_filter_list_load": { "isManual": true, "cFile": "generate/templates/manual/filter_list/load.cc", @@ -150,7 +167,7 @@ }, "git_filter_source_filemode": { "type": "function", - "file": "filter.h", + "file": "sys/filter.h", "args": [ { "name": "src", @@ -164,7 +181,7 @@ }, "git_filter_source_flags": { "type": "function", - "file": "filter.h", + "file": "sys/filter.h", "args": [ { "name": "src", @@ -176,6 +193,48 @@ }, "group": "filter_source" }, + "git_filter_source_id": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "const git_oid *" + }, + "group": "filter_source" + }, + "git_filter_source_mode": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "git_filter_mode_t" + }, + "group": "filter_source" + }, + "git_filter_source_path": { + "type": "function", + "file": "sys/filter.h", + "args": [ + { + "name": "src", + "type": "const git_filter_source *" + } + ], + "return": { + "type": "const char *" + }, + "group": "filter_source" + }, "git_filter_source_repo": { "args": [ { @@ -198,6 +257,290 @@ "isErrorCode": true } }, + "git_hashsig_compare": { + "type": "function", + "file": "sys/hashsig.h", + "args": [ + { + "name": "a", + "type": "const git_hashsig *" + }, + { + "name": "b", + "type": "const git_hashsig *" + } + ], + "return": { + "type": "int" + }, + "group": "hashsig" + }, + "git_hashsig_create": { + "type": "function", + "file": "sys/hashsig.h", + "args": [ + { + "name": "out", + "type": "git_hashsig **" + }, + { + "name": "buf", + "type": "const char *" + }, + { + "name": "buflen", + "type": "size_t" + }, + { + "name": "opts", + "type": "git_hashsig_option_t" + } + ], + "return": { + "type": "int" + }, + "group": "hashsig" + }, + "git_hashsig_create_fromfile": { + "type": "function", + "file": "sys/hashsig.h", + "args": [ + { + "name": "out", + "type": "git_hashsig **" + }, + { + "name": "path", + "type": "const char *" + }, + { + "name": "opts", + "type": "git_hashsig_option_t" + } + ], + "return": { + "type": "int" + }, + "group": "hashsig" + }, + "git_index_name_add": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "ancestor", + "type": "const char *" + }, + { + "name": "ours", + "type": "const char *" + }, + { + "name": "theirs", + "type": "const char *" + } + ], + "return": { + "type": "int" + }, + "group": "index_name_entry" + }, + "git_index_name_clear": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "void" + }, + "group": "index_name_entry" + }, + "git_index_name_entrycount": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "size_t" + }, + "group": "index_name_entry" + }, + "git_index_name_get_byindex": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "n", + "type": "size_t" + } + ], + "return": { + "type": "const git_index_name_entry *" + }, + "group": "index_name_entry" + }, + "git_index_reuc_add": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "path", + "type": "const char *" + }, + { + "name": "ancestor_mode", + "type": "int" + }, + { + "name": "ancestor_id", + "type": "const git_oid *" + }, + { + "name": "our_mode", + "type": "int" + }, + { + "name": "our_id", + "type": "const git_oid *" + }, + { + "name": "their_mode", + "type": "int" + }, + { + "name": "their_id", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_clear": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "const git_index_reuc_entry *" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_entrycount": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "size_t" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_find": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "at_pos", + "type": "size_t *" + }, + { + "name": "index", + "type": "git_index *" + }, + { + "name": "path", + "type": "const char *" + } + ], + "return": { + "type": "int" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_get_byindex": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "n", + "type": "size_t" + } + ], + "return": { + "type": "const git_index_reuc_entry *" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_get_bypath": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "path", + "type": "const char *" + } + ], + "return": { + "type": "const git_index_reuc_entry *" + }, + "group": "index_reuc_entry" + }, + "git_index_reuc_remove": { + "type": "function", + "file": "sys/index.h", + "args": [ + { + "name": "index", + "type": "git_index *" + }, + { + "name": "n", + "type": "size_t" + } + ], + "return": { + "type": "const git_index_reuc_entry *" + }, + "group": "index_reuc_entry" + }, "git_patch_convenient_from_diff": { "args": [ { @@ -220,6 +563,32 @@ "isErrorCode": true } }, + "git_path_is_gitfile": { + "type": "function", + "file": "sys/path.h", + "args": [ + { + "name": "path", + "type": "const char *" + }, + { + "name": "pathlen", + "type": "size_t" + }, + { + "name": "gitfile", + "type": "git_path_gitfile" + }, + { + "name": "fs", + "type": "git_path_fs" + } + ], + "return": { + "type": "int" + }, + "group": "path" + }, "git_rebase_next": { "type": "function", "file": "rebase.h", @@ -260,6 +629,20 @@ "isErrorCode": true } }, + "git_repository__cleanup": { + "type": "function", + "file": "sys/repository.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + } + ], + "return": { + "type": "void" + }, + "group": "repository" + }, "git_repository_get_references": { "args": [ { @@ -348,6 +731,52 @@ "isErrorCode": true } }, + "git_repository_set_index": { + "type": "function", + "file": "sys/repository.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "index", + "type": "git_index *" + } + ], + "return": { + "type": "void" + }, + "group": "repository" + }, + "git_repository_submodule_cache_all": { + "type": "function", + "file": "sys/repository.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + } + ], + "return": { + "type": "int" + }, + "group": "repository" + }, + "git_repository_submodule_cache_clear": { + "type": "function", + "file": "sys/repository.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + } + ], + "return": { + "type": "int" + }, + "group": "repository" + }, "git_reset": { "type": "function", "file": "reset.h", @@ -485,6 +914,23 @@ "type": "int" }, "group": "stash" + }, + "git_status_list_get_perfdata": { + "file": "sys/diff.h", + "args": [ + { + "name": "out", + "type": "git_diff_perfdata *" + }, + { + "name": "status", + "type": "const git_status_list *" + } + ], + "return": { + "type": "int" + }, + "group": "status_list" } }, "groups": [ @@ -803,6 +1249,27 @@ } } ], + [ + "git_diff_perfdata", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "ignore": true + }, + { + "type": "size_t", + "name": "stat_calls" + }, + { + "type": "size_t", + "name": "oid_calculations" + } + ] + } + ], [ "git_filter", { @@ -839,45 +1306,6 @@ ] } ], - [ - "git_status_entry", - { - "fields": [ - { - "type": "git_status_t", - "name": "status" - }, - { - "type": "git_diff_delta *", - "name": "head_to_index" - }, - { - "type": "git_diff_delta *", - "name": "index_to_workdir" - } - ] - } - ], - [ - "git_diff_perfdata", - { - "type": "struct", - "fields": [ - { - "type": "unsigned int", - "name": "version" - }, - { - "type": "size_t", - "name": "stat_calls" - }, - { - "type": "size_t", - "name": "oid_calculations" - } - ] - } - ], [ "git_fetch_options", { @@ -943,6 +1371,46 @@ ] } ], + [ + "git_index_name_entry", + { + "type": "struct", + "fields": [ + { + "type": "char *", + "name": "ancestor" + }, + { + "type": "char *", + "name": "ours" + }, + { + "type": "char *", + "name": "theirs" + } + ] + } + ], + [ + "git_index_reuc_entry", + { + "type": "struct", + "fields": [ + { + "type": "uint32_t [3]", + "name": "mode" + }, + { + "type": "git_oid [3]", + "name": "oid" + }, + { + "type": "char *", + "name": "path" + } + ] + } + ], [ "git_off_t", { @@ -1115,6 +1583,29 @@ } } ], + [ + "git_path_gitfile", + { + "type": "enum", + "fields": [ + { + "type": "int", + "name": "GIT_PATH_GITFILE_GITIGNORE", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATH_GITFILE_GITMODULES", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATH_GITFILE_GITATTRIBUTES", + "value": 1 + } + ] + } + ], [ "git_stash_apply_progress_t", { @@ -1164,7 +1655,7 @@ } ], [ - "git_status_options", + "git_stash_apply_options", { "type": "struct", "fields": [ @@ -1173,29 +1664,32 @@ "name": "version" }, { - "type": "git_status_show_t", - "name": "show" + "type": "git_stash_apply_flags", + "name": "flags" }, { - "type": "git_status_opt_t", - "name": "flags" + "type": "git_checkout_options", + "name": "checkout_options" }, { - "type": "git_strarray", - "name": "pathspec" + "type": "git_stash_apply_progress_cb", + "name": "progress_cb" + }, + { + "type": "void *", + "name": "progress_payload" } ], "used": { "needs": [ - "git_status_init_options", - "git_status_foreach_ext", - "git_status_list_new" + "git_stash_apply_init_options", + "git_checkout_init_options" ] } } ], [ - "git_stash_apply_options", + "git_status_options", { "type": "struct", "fields": [ @@ -1204,26 +1698,23 @@ "name": "version" }, { - "type": "git_stash_apply_flags", - "name": "flags" - }, - { - "type": "git_checkout_options", - "name": "checkout_options" + "type": "git_status_show_t", + "name": "show" }, { - "type": "git_stash_apply_progress_cb", - "name": "progress_cb" + "type": "git_status_opt_t", + "name": "flags" }, { - "type": "void *", - "name": "progress_payload" + "type": "git_strarray", + "name": "pathspec" } ], "used": { "needs": [ - "git_stash_apply_init_options", - "git_checkout_init_options" + "git_status_init_options", + "git_status_foreach_ext", + "git_status_list_new" ] } } @@ -1256,6 +1747,22 @@ ] } ], + [ + "git_worktree_prune_options", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version" + }, + { + "type": "uint32_t", + "name": "flags" + } + ] + } + ], [ "git_worktree_prune_t", { @@ -1278,22 +1785,6 @@ } ] } - ], - [ - "git_worktree_prune_options", - { - "type": "struct", - "fields": [ - { - "type": "unsigned int", - "name": "version" - }, - { - "type": "uint32_t", - "name": "flags" - } - ] - } ] ] }, From eb463b8002c7c0f3135f358cb515087d24432272 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 24 Jun 2019 10:12:46 -0700 Subject: [PATCH 116/545] Remove supplements that are no longer needed --- generate/input/libgit2-supplement.json | 88 -------------------------- 1 file changed, 88 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index d22df8cbb..5bd03f158 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -86,20 +86,6 @@ }, "new" : { "functions": { - "git_blame_get_hunk_count": { - "type": "function", - "file": "blame.h", - "args": [ - { - "name": "blame", - "type": "git_blame *" - } - ], - "return": { - "type": "int" - }, - "group": "blame" - }, "git_clone": { "isManual": true, "cFile": "generate/templates/manual/clone/clone.cc", @@ -589,24 +575,6 @@ }, "group": "path" }, - "git_rebase_next": { - "type": "function", - "file": "rebase.h", - "args": [ - { - "name": "out", - "type": "git_rebase_operation **" - }, - { - "name": "rebase", - "type": "git_rebase *" - } - ], - "return": { - "type": "int" - }, - "group": "rebase" - }, "git_remote_reference_list": { "args": [ { @@ -777,32 +745,6 @@ }, "group": "repository" }, - "git_reset": { - "type": "function", - "file": "reset.h", - "args": [ - { - "name": "repo", - "type": "git_repository *" - }, - { - "name": "target", - "type": "git_object *" - }, - { - "name": "reset_type", - "type": "git_reset_t" - }, - { - "name": "checkout_opts", - "type": "git_checkout_options *" - } - ], - "return": { - "type": "int" - }, - "group": "reset" - }, "git_revwalk_commit_walk": { "args": [ { @@ -885,36 +827,6 @@ "isErrorCode": true } }, - "git_stash_save": { - "type": "function", - "file": "stash.h", - "args": [ - { - "name": "out", - "type": "git_oid *" - }, - { - "name": "repo", - "type": "git_repository *" - }, - { - "name": "stasher", - "type": "const git_signature *" - }, - { - "name": "message", - "type": "const char *" - }, - { - "name": "flags", - "type": "unsigned int" - } - ], - "return": { - "type": "int" - }, - "group": "stash" - }, "git_status_list_get_perfdata": { "file": "sys/diff.h", "args": [ From be6cc4331775179f02bca5d51b923e11aff319fe Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 24 Jun 2019 13:35:39 -0700 Subject: [PATCH 117/545] Address major changes to constructors, fix missing methods/structs --- generate/input/callbacks.json | 101 +++++++++++++------------ generate/input/descriptor.json | 101 ++++++++++++++++++++++--- generate/input/libgit2-supplement.json | 45 +++++++++-- generate/scripts/helpers.js | 9 ++- 4 files changed, 187 insertions(+), 69 deletions(-) diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index cb9f10079..0d8720b79 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -476,6 +476,25 @@ "error": -1 } }, + "git_indexer_progress_cb": { + "args": [ + { + "name": "stats", + "cType": "const git_indexer_progress *" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "throttle": 100 + } + }, "git_note_foreach_cb": { "args": [ { @@ -532,6 +551,28 @@ "error": -1 } }, + "git_push_update_reference_cb": { + "args": [ + { + "name": "refname", + "cType": "const char *" + }, + { + "name": "status", + "cType": "const char *" + }, + { + "name": "data", + "cType": "void *" + } + ], + "return": { + "type": "int", + "noResults": 1, + "success": 0, + "error": -1 + } + }, "git_remote_create_cb": { "args": [ { @@ -692,29 +733,6 @@ "error": -1 } }, - "git_smart_subtransport_cb": { - "args": [ - { - "name": "out", - "cType": "git_smart_subtransport **", - "isReturn": true - }, - { - "name": "owner", - "cType": "git_transport*" - }, - { - "name": "param", - "cType": "void *" - } - ], - "return": { - "type": "int", - "noResults": 0, - "success": 0, - "error": -1 - } - }, "git_stash_apply_progress_cb": { "args": [ { @@ -826,26 +844,7 @@ "error": -1 } }, - "git_transfer_progress_cb": { - "args": [ - { - "name": "stats", - "cType": "const git_transfer_progress *" - }, - { - "name": "payload", - "cType": "void *" - } - ], - "return": { - "type": "int", - "noResults": 0, - "success": 0, - "error": -1, - "throttle": 100 - } - }, - "git_push_transfer_progress": { + "git_push_transfer_progress_cb": { "args": [ { "name": "current", @@ -983,24 +982,28 @@ "error": -1 } }, - "git_push_update_reference_cb": { + "git_url_resolve_cb": { "args": [ { - "name": "refname", - "cType": "const char *" + "name": "url_resolved", + "cType": "git_buf *" }, { - "name": "status", + "name": "url", "cType": "const char *" }, { - "name": "data", + "name": "direction", + "cType": "int" + }, + { + "name": "payload", "cType": "void *" } ], "return": { "type": "int", - "noResults": 1, + "noResults": -30, "success": 0, "error": -1 } diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 0e15fb204..0d34b7a3d 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -183,6 +183,9 @@ }, "git_blame_init_options": { "ignore": true + }, + "git_blame_options_init": { + "ignore": true } } }, @@ -200,7 +203,7 @@ "singletonCppClassName": "GitRepository" }, "functions": { - "git_blob_create_frombuffer": { + "git_blob_create_from_buffer": { "isAsync": true, "args": { "id": { @@ -215,7 +218,7 @@ "isErrorCode": true } }, - "git_blob_create_fromworkdir": { + "git_blob_create_from_workdir": { "isAsync": true, "args": { "id": { @@ -226,7 +229,10 @@ "isErrorCode": true } }, - "git_blob_create_fromdisk": { + "git_blob_create_fromworkdir": { + "ignore": true + }, + "git_blob_create_from_disk": { "isAsync": true, "args": { "id": { @@ -237,10 +243,10 @@ "isErrorCode": true } }, - "git_blob_create_fromstream": { + "git_blob_create_from_stream": { "ignore": true }, - "git_blob_create_fromstream_commit": { + "git_blob_create_from_stream_commit": { "ignore": true }, "git_blob_filtered_content": { @@ -486,6 +492,9 @@ "git_checkout_init_options": { "ignore": true }, + "git_checkout_options_init": { + "ignore": true + }, "git_checkout_tree": { "args": { "treeish": { @@ -512,6 +521,9 @@ }, "git_cherrypick_init_options": { "ignore": true + }, + "git_cherrypick_options_init": { + "ignore": true } } }, @@ -526,6 +538,9 @@ }, "git_clone_init_options": { "ignore": true + }, + "git_clone_options_init": { + "ignore": true } } }, @@ -1129,6 +1144,9 @@ "git_diff_find_init_options": { "ignore": true }, + "git_diff_find_options_init": { + "ignore": true + }, "git_diff_find_similar": { "args": { "diff": { @@ -1154,6 +1172,9 @@ "git_diff_format_email_init_options": { "ignore": true }, + "git_diff_format_email_options_init": { + "ignore": true + }, "git_diff_free": { "ignore": true }, @@ -1227,9 +1248,15 @@ "git_diff_num_deltas_of_type": { "ignore": true }, + "git_diff_options_init": { + "ignore": true + }, "git_diff_patchid_init_options": { "ignore": true }, + "git_diff_patchid_options_init": { + "ignore": true + }, "git_diff_print": { "ignore": true }, @@ -1384,6 +1411,9 @@ "functions": { "git_fetch_init_options": { "ignore": true + }, + "git_fetch_options_init": { + "ignore": true } } }, @@ -1951,7 +1981,8 @@ "git_index_reuc_clear": { "cppFunctionName": "Clear", "jsFunctionName": "clear", - "isAsync": true + "isAsync": true, + "isPrototypeMethod": false }, "git_index_reuc_entrycount": { "cppFunctionName": "Entrycount", @@ -1985,6 +2016,7 @@ "cppFunctionName": "Remove", "jsFunctionName": "remove", "isAsync": true, + "isPrototypeMethod": false, "return": { "isErrorCode": true } @@ -2177,12 +2209,24 @@ "git_merge_file_from_index": { "ignore": true }, + "git_merge_file_input_init": { + "ignore": true + }, + "git_merge_file_init_input": { + "ignore": true + }, "git_merge_file_init_options": { "ignore": true }, + "git_merge_file_options_init": { + "ignore": true + }, "git_merge_init_options": { "ignore": true }, + "git_merge_options_init": { + "ignore": true + }, "git_merge_trees": { "args": { "ancestor_tree": { @@ -2744,6 +2788,9 @@ "functions": { "git_proxy_init_options": { "ignore": true + }, + "git_proxy_options_init": { + "ignore": true } } }, @@ -2751,6 +2798,7 @@ "ignore": true }, "rebase": { + "hasConstructor": false, "selfFreeing": true, "functions": { "git_rebase_abort": { @@ -2857,6 +2905,9 @@ "return": { "ownedByThis": true } + }, + "git_rebase_options_init": { + "ignore": true } } }, @@ -3071,6 +3122,12 @@ } } }, + "git_remote_create_init_options": { + "ignore": true + }, + "git_remote_create_options_init": { + "ignore": true + }, "git_remote_create_with_opts": { "args": { "opts": { @@ -3250,6 +3307,7 @@ "selfFreeing": true }, "repository": { + "hasConstructor": false, "selfFreeing": true, "isSingleton": true, "dependencies": [ @@ -3313,6 +3371,9 @@ "git_repository_init_init_options": { "ignore": true }, + "git_repository_init_options_init": { + "ignore": true + }, "git_repository_mergehead_foreach": { "isAsync": true, "return": { @@ -3416,6 +3477,9 @@ }, "git_revert_init_options": { "ignore": true + }, + "git_revert_options_init": { + "ignore": true } } }, @@ -3560,6 +3624,12 @@ "isErrorCode": true } }, + "git_stash_apply_init_options": { + "ignore": true + }, + "git_stash_apply_options_init": { + "ignore": true + }, "git_stash_drop": { "isAsync": true, "return": { @@ -3572,9 +3642,6 @@ "isErrorCode": true } }, - "git_stash_apply_init_options": { - "ignore": true - }, "git_stash_pop": { "isAsync": true, "return": { @@ -3634,6 +3701,9 @@ }, "git_status_init_options": { "ignore": true + }, + "git_status_options_init": { + "ignore": true } } }, @@ -3695,6 +3765,7 @@ "ignore": true }, "submodule": { + "hasConstructor": false, "selfFreeing": true, "ownerFn": { "name": "git_submodule_owner", @@ -3842,6 +3913,9 @@ }, "git_submodule_update_init_options": { "ignore": true + }, + "git_submodule_update_options_init": { + "ignore": true } } }, @@ -3877,8 +3951,7 @@ }, "isAsync": true }, - "git_tag_create_frombuffer": { - "jsFunctionName": "createFromBuffer", + "git_tag_create_from_buffer": { "args": { "oid": { "isReturn": true @@ -4243,6 +4316,9 @@ "git_worktree_add_init_options": { "ignore": true }, + "git_worktree_add_options_init": { + "ignore": true + }, "git_worktree_free": { "ignore": true }, @@ -4262,6 +4338,9 @@ }, "git_worktree_prune_init_options": { "ignore": true + }, + "git_worktree_prune_options_init": { + "ignore": true } }, "dependencies": [ diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 5bd03f158..e6f5c4d05 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -433,7 +433,7 @@ } ], "return": { - "type": "const git_index_reuc_entry *" + "type": "void" }, "group": "index_reuc_entry" }, @@ -523,7 +523,7 @@ } ], "return": { - "type": "const git_index_reuc_entry *" + "type": "int" }, "group": "index_reuc_entry" }, @@ -868,6 +868,12 @@ "git_config_next" ] ], + [ + "diff", + [ + "git_diff_get_perfdata" + ] + ], [ "diff_stats", [ @@ -899,6 +905,14 @@ "git_filter_source_flags" ] ], + [ + "hashsig", + [ + "git_hashsig_compare", + "git_hashsig_create", + "git_hashsig_create_fromfile" + ] + ], [ "index_conflict_iterator", [ @@ -976,6 +990,12 @@ "git_patch_convenient_from_diff" ] ], + [ + "path", + [ + "git_path_is_gitfile" + ] + ], [ "pathspec_match_list", [ @@ -1005,10 +1025,14 @@ [ "repository", [ + "git_repository__cleanup", "git_repository_get_references", "git_repository_get_submodules", "git_repository_get_remotes", - "git_repository_refresh_references" + "git_repository_refresh_references", + "git_repository_set_index", + "git_repository_submodule_cache_all", + "git_repository_submodule_cache_clear" ] ], [ @@ -1283,6 +1307,13 @@ ] } ], + [ + "git_hashsig", + { + "type": "struct", + "fields": [] + } + ], [ "git_index_name_entry", { @@ -1400,11 +1431,11 @@ "name": "certificate_check" }, { - "type": "git_transfer_progress_cb", + "type": "git_indexer_progress_cb", "name": "transfer_progress" }, { - "type": "git_push_transfer_progress", + "type": "git_push_transfer_progress_cb", "name": "push_transfer_progress", "isCallback": true }, @@ -1420,6 +1451,10 @@ { "type": "void *", "name": "payload" + }, + { + "type": "git_url_resolve_cb", + "name": "resolve_url" } ], "used": { diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index f8e02f807..3a8daaaa2 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -69,12 +69,13 @@ var Helpers = { }, isConstructorFunction: function(cType, fnName) { - var initFnName = cType.split('_'); + var deprecatedInitFnName = cType.split("_"); + deprecatedInitFnName.splice(-1, 0, "init"); + deprecatedInitFnName = deprecatedInitFnName.join("_"); - initFnName.splice(-1, 0, "init"); - initFnName = initFnName.join('_'); + var initFnName = cType + "_init"; - return initFnName === fnName; + return initFnName === fnName || deprecatedInitFnName === fnName; }, hasConstructor: function(type, normalizedType) { From 148503fdaac5c95b0dd5483fd047c77b4127de11 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Jun 2019 16:02:01 -0700 Subject: [PATCH 118/545] Update libgit2.gyp / binding.gyp with new libraries / code --- generate/input/descriptor.json | 20 ++- generate/templates/templates/binding.gyp | 11 ++ vendor/libgit2.gyp | 190 +++++++++++++++++++---- 3 files changed, 191 insertions(+), 30 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 0d34b7a3d..5306e16b2 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1417,6 +1417,11 @@ } } }, + "fetch_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, "filter": { "selfFreeing": false, "hasConstructor": true, @@ -1652,6 +1657,9 @@ "git_index_add_frombuffer": { "ignore": true }, + "git_index_add_from_buffer": { + "ignore": true + }, "git_index_checksum": { "return": { "ownedByThis": true @@ -2797,6 +2805,11 @@ "push": { "ignore": true }, + "push_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, "rebase": { "hasConstructor": false, "selfFreeing": true, @@ -2881,11 +2894,15 @@ } }, "git_rebase_next": { + "isAsync": true, "args": { "operation": { "isReturn": true, "ownedByThis": true } + }, + "return": { + "isErrorCode": true } }, "git_rebase_open": { @@ -4058,9 +4075,6 @@ }, "time": { "dupFunction": "git_time_dup", - "dependencies": [ - "git2/sys/time.h" - ], "functions": { "git_time_sign": { "ignore": true diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 3d2d80a0d..cd1b763d5 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -94,6 +94,9 @@ ], [ "OS=='mac'", { + "libraries": [ + "-liconv", + ], "conditions": [ ["<(is_electron) == 1", { "include_dirs": [ @@ -153,8 +156,16 @@ ] } ], + ["OS=='mac' or OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { + "libraries": [ + " Date: Tue, 25 Jun 2019 16:18:58 -0700 Subject: [PATCH 119/545] Openssl streams should always be included --- vendor/libgit2.gyp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index f21ba123c..87c459a09 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -178,6 +178,8 @@ "libgit2/src/oidmap.h", "libgit2/src/streams/mbedtls.c", "libgit2/src/streams/mbedtls.h", + "libgit2/src/streams/openssl.c", + "libgit2/src/streams/openssl.h", "libgit2/src/streams/registry.c", "libgit2/src/streams/registry.h", "libgit2/src/pack-objects.c", @@ -380,10 +382,6 @@ "GIT_OPENSSL", "GIT_USE_STAT_MTIM", "GIT_REGEX_PCRE" - ], - "sources": [ - "libgit2/src/streams/openssl.c", - "libgit2/src/streams/openssl.h" ] }], ["<(is_IBMi) == 1", { From 77d3d39e7317f8861f46d537101e45b9d77516ee Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Jun 2019 16:53:47 -0700 Subject: [PATCH 120/545] futimens is not available before osx 10.13 --- vendor/libgit2.gyp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 87c459a09..ca7d288a2 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -348,7 +348,6 @@ ], "include_dirs": ["libgit2/deps/ntlmclient"], "defines": [ - "GIT_USE_FUTIMENS", "GIT_NTLM", "GIT_GSSAPI" ], @@ -380,8 +379,9 @@ ], "defines": [ "GIT_OPENSSL", - "GIT_USE_STAT_MTIM", - "GIT_REGEX_PCRE" + "GIT_REGEX_PCRE", + "GIT_USE_FUTIMENS", + "GIT_USE_STAT_MTIM" ] }], ["<(is_IBMi) == 1", { From ba19611bbcd95fe6e570ddcb91e61ca0739ee222 Mon Sep 17 00:00:00 2001 From: Simone Fumagalli Date: Wed, 26 Jun 2019 11:38:33 +0200 Subject: [PATCH 121/545] Fixed typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4194aa64d..d7d1aa830 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,7 +91,7 @@ - Fixed bug where repeated uses of extractSignature would fail because of the use of regex.prototype.match - Added support for building on IBM i (PASE) machines - Fixed bug where signingCb in rebases would not return error codes to LibGit2 if the signingCb threw or rejected -- Expoed AnnotatedCommit methods: +- Exposed AnnotatedCommit methods: - AnnotatedCommit.prototype.ref - Exposed Apply methods: - Apply.apply applies a diff to the repository From 6f665bc5439c2e853fb48dbaadaae577949b854a Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 26 Jun 2019 17:00:21 -0700 Subject: [PATCH 122/545] Update README.md with additional library dependencies --- README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ddd922d4c..c547e32e7 100644 --- a/README.md +++ b/README.md @@ -76,10 +76,17 @@ In Ubuntu: sudo apt-get install libssl-dev ``` -Additionally, you need `curl-config` on your system. You need one of these packages: - * libcurl4-gnutls-dev - * libcurl4-nss-dev - * libcurl4-openssl-dev +You will need the following libraries installed on your linux machine: + - libpcre + - libpcreposix + - libkrb5 + - libk5crypto + - libcom_err + +When building locally, you will also need development packages for kerberos and pcre, so both of these utilities must be present on your machine: + - pcre-config + - krb5-config + If you are still encountering problems while installing, you should try the [Building from source](http://www.nodegit.org/guides/install/from-source/) From a769e9accaac295ad5d5ea7a15147934fde0d5d8 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 26 Jun 2019 17:33:04 -0700 Subject: [PATCH 123/545] Bump to v0.25.0-alpha.13 --- CHANGELOG.md | 104 ++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 106 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d1aa830..fe70b64ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,109 @@ # Change Log +## v0.25.0-alpha.13 [(2019-06-26)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.13) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.12...v0.25.0-alpha.13) + +#### Summary of changes +- Turn on GIT_USE_NSEC on all platforms +- Use Iconv on OSX for better internationalization support. +- Bump libgit2 to bring in: + - NTLM proxy support + - Negotiate/Kerberos proxy support + - Various git config fixes + - Various git ignore fixes + - Various libgit2 performance improvements + - Windows/Linux now use PCRE for regex, OSX uses regcomp_l, this should address collation issues in diffing +- Fixed bug with Repository.prototype.refreshReferences dying on corrupted reference. We now ignore corrupted references + +#### Merged PRs into NodeGit +- [refresh_references.cc: skip refs that can't be directly resolved #1689](https://github.com/nodegit/nodegit/pull/1689) +- [Bump libgit2 to fork of latest master #1690](https://github.com/nodegit/nodegit/pull/1690) + +#### Merged PRs into LibGit2 +- [errors: use lowercase](https://github.com/libgit2/libgit2/pull/5137) +- [largefile tests: only write 2GB on 32-bit platforms](https://github.com/libgit2/libgit2/pull/5136) +- [Fix broken link in README](https://github.com/libgit2/libgit2/pull/5129) +- [net: remove unused `git_headlist_cb`](https://github.com/libgit2/libgit2/pull/5122) +- [cmake: default NTLM client to off if no HTTPS support](https://github.com/libgit2/libgit2/pull/5124) +- [attr: rename constants and macros for consistency](https://github.com/libgit2/libgit2/pull/5119) +- [Change API instances of `fromnoun` to `from_noun` (with an underscore)](https://github.com/libgit2/libgit2/pull/5117) +- [object: rename git_object__size to git_object_size](https://github.com/libgit2/libgit2/pull/5118) +- [Replace fnmatch with wildmatch](https://github.com/libgit2/libgit2/pull/5110) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/5111) +- [Removal of `p_fallocate`](https://github.com/libgit2/libgit2/pull/5114) +- [Modularize our TLS & hash detection](https://github.com/libgit2/libgit2/pull/5055) +- [tests: merge::analysis: use test variants to avoid duplicated test suites](https://github.com/libgit2/libgit2/pull/5109) +- [Rename options initialization functions](https://github.com/libgit2/libgit2/pull/5101) +- [deps: ntlmclient: disable implicit fallthrough warnings](https://github.com/libgit2/libgit2/pull/5112) +- [gitignore with escapes](https://github.com/libgit2/libgit2/pull/5097) +- [Handle URLs with a colon after host but no port](https://github.com/libgit2/libgit2/pull/5108) +- [Merge analysis support for bare repos](https://github.com/libgit2/libgit2/pull/5022) +- [Add memleak check docs](https://github.com/libgit2/libgit2/pull/5104) +- [Data-driven tests](https://github.com/libgit2/libgit2/pull/5098) +- [sha1dc: update to fix endianess issues on AIX/HP-UX](https://github.com/libgit2/libgit2/pull/5107) +- [Add NTLM support for HTTP(s) servers and proxies](https://github.com/libgit2/libgit2/pull/5052) +- [Callback type names should be suffixed with `_cb`](https://github.com/libgit2/libgit2/pull/5102) +- [tests: checkout: fix symlink.git being created outside of sandbox](https://github.com/libgit2/libgit2/pull/5099) +- [ignore: handle escaped trailing whitespace](https://github.com/libgit2/libgit2/pull/5095) +- [Ignore: only treat one leading slash as a root identifier](https://github.com/libgit2/libgit2/pull/5074) +- [online tests: use gitlab for auth failures](https://github.com/libgit2/libgit2/pull/5094) +- [Ignore files: don't ignore whitespace](https://github.com/libgit2/libgit2/pull/5076) +- [cache: fix cache eviction using deallocated key](https://github.com/libgit2/libgit2/pull/5088) +- [SECURITY.md: split out security-relevant bits from readme](https://github.com/libgit2/libgit2/pull/5085) +- [Restore NetBSD support](https://github.com/libgit2/libgit2/pull/5086) +- [repository: fix garbage return value](https://github.com/libgit2/libgit2/pull/5084) +- [cmake: disable fallthrough warnings for PCRE](https://github.com/libgit2/libgit2/pull/5083) +- [Configuration parsing: validate section headers with quotes](https://github.com/libgit2/libgit2/pull/5073) +- [Loosen restriction on wildcard "*" refspecs](https://github.com/libgit2/libgit2/pull/5060) +- [Use PCRE for our fallback regex engine when regcomp_l is unavailable](https://github.com/libgit2/libgit2/pull/4935) +- [Remote URL last-chance resolution](https://github.com/libgit2/libgit2/pull/5062) +- [Skip UTF8 BOM in ignore files](https://github.com/libgit2/libgit2/pull/5075) +- [We've already added `ZLIB_LIBRARIES` to `LIBGIT2_LIBS` so don't also add the `z` library](https://github.com/libgit2/libgit2/pull/5080) +- [Define SYMBOLIC_LINK_FLAG_DIRECTORY if required](https://github.com/libgit2/libgit2/pull/5077) +- [Support symlinks for directories in win32](https://github.com/libgit2/libgit2/pull/5065) +- [rebase: orig_head and onto accessors](https://github.com/libgit2/libgit2/pull/5057) +- [cmake: correctly detect if system provides `regcomp`](https://github.com/libgit2/libgit2/pull/5063) +- [Correctly write to missing locked global config](https://github.com/libgit2/libgit2/pull/5023) +- [[RFC] util: introduce GIT_DOWNCAST macro](https://github.com/libgit2/libgit2/pull/4561) +- [examples: implement SSH authentication](https://github.com/libgit2/libgit2/pull/5051) +- [git_repository_init: stop traversing at windows root](https://github.com/libgit2/libgit2/pull/5050) +- [config_file: check result of git_array_alloc](https://github.com/libgit2/libgit2/pull/5053) +- [patch_parse.c: Handle CRLF in parse_header_start](https://github.com/libgit2/libgit2/pull/5027) +- [fix typo](https://github.com/libgit2/libgit2/pull/5045) +- [sha1: don't inline `git_hash_global_init` for win32](https://github.com/libgit2/libgit2/pull/5039) +- [ignore: treat paths with trailing "/" as directories](https://github.com/libgit2/libgit2/pull/5040) +- [Test that largefiles can be read through the tree API](https://github.com/libgit2/libgit2/pull/4874) +- [Tests for symlinked user config](https://github.com/libgit2/libgit2/pull/5034) +- [patch_parse: fix parsing addition/deletion of file with space](https://github.com/libgit2/libgit2/pull/5035) +- [Optimize string comparisons](https://github.com/libgit2/libgit2/pull/5018) +- [Negation of subdir ignore causes other subdirs to be unignored](https://github.com/libgit2/libgit2/pull/5020) +- [xdiff: fix typo](https://github.com/libgit2/libgit2/pull/5024) +- [docs: clarify relation of safe and forced checkout strategy](https://github.com/libgit2/libgit2/pull/5032) +- [Each hash implementation should define `git_hash_global_init`](https://github.com/libgit2/libgit2/pull/5026) +- [[Doc] Update URL to git2-rs](https://github.com/libgit2/libgit2/pull/5012) +- [remote: Rename git_remote_completion_type to _t](https://github.com/libgit2/libgit2/pull/5008) +- [odb: provide a free function for custom backends](https://github.com/libgit2/libgit2/pull/5005) +- [Have git_branch_lookup accept GIT_BRANCH_ALL](https://github.com/libgit2/libgit2/pull/5000) +- [Rename git_transfer_progress to git_indexer_progress](https://github.com/libgit2/libgit2/pull/4997) +- [High-level map APIs](https://github.com/libgit2/libgit2/pull/4901) +- [refdb_fs: fix loose/packed refs lookup racing with repacks](https://github.com/libgit2/libgit2/pull/4984) +- [Allocator restructuring](https://github.com/libgit2/libgit2/pull/4998) +- [cache: fix misnaming of `git_cache_free`](https://github.com/libgit2/libgit2/pull/4992) +- [examples: produce single cgit2 binary](https://github.com/libgit2/libgit2/pull/4956) +- [Remove public 'inttypes.h' header](https://github.com/libgit2/libgit2/pull/4991) +- [Prevent reading out of bounds memory](https://github.com/libgit2/libgit2/pull/4996) +- [Fix a memory leak in odb_otype_fast()](https://github.com/libgit2/libgit2/pull/4987) +- [Make stdalloc__reallocarray call stdalloc__realloc](https://github.com/libgit2/libgit2/pull/4986) +- [Remove `git_time_monotonic`](https://github.com/libgit2/libgit2/pull/4990) +- [Fix a _very_ improbable memory leak in git_odb_new()](https://github.com/libgit2/libgit2/pull/4988) +- [ci: publish documentation on merge](https://github.com/libgit2/libgit2/pull/4989) +- [Enable creation of worktree from bare repo's default branch](https://github.com/libgit2/libgit2/pull/4982) +- [Allow bypassing check for '.keep' file](https://github.com/libgit2/libgit2/pull/4965) +- [Release v0.28.1](https://github.com/libgit2/libgit2/pull/4983) + + + ## v0.25.0-alpha.12 [(2019-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.12) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.11...v0.25.0-alpha.12) diff --git a/package-lock.json b/package-lock.json index 679a52b8d..b9bb5b4f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.12", + "version": "0.25.0-alpha.13", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1a237dba0..7850b1255 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.12", + "version": "0.25.0-alpha.13", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 3d4eed17a1f7c3c0487db00fd6c2cdc85ad8b228 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 28 Jun 2019 10:13:40 -0700 Subject: [PATCH 124/545] Use builtin regex library for linux for better portability CentOS 7 seems to segfault when built against its system PCRE library --- vendor/libgit2.gyp | 101 +++++++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 36 deletions(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index ca7d288a2..e15ffc247 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -370,16 +370,18 @@ " Date: Fri, 28 Jun 2019 15:45:14 -0700 Subject: [PATCH 125/545] Remove pcre-config from binding.gyp --- generate/templates/templates/binding.gyp | 3 --- 1 file changed, 3 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index cd1b763d5..1b23ed2fd 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -163,9 +163,6 @@ }], [ "OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { - "libraries": [ - " Date: Fri, 28 Jun 2019 13:47:27 -0700 Subject: [PATCH 126/545] Bump to v0.25.0-alpha.14 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe70b64ae..85c7163e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.25.0-alpha.14 [(2019-07-01)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.14) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.13...v0.25.0-alpha.14) + +#### Summary of changes +- Always use builtin regex for linux for portability + +#### Merged PRs into NodeGit +- [Use builtin regex library for linux for better portability #1693](https://github.com/nodegit/nodegit/pull/1693) +- [Remove pcre-config from binding.gyp #1694](https://github.com/nodegit/nodegit/pull/1694) + ## v0.25.0-alpha.13 [(2019-06-26)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.13) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.12...v0.25.0-alpha.13) diff --git a/package-lock.json b/package-lock.json index b9bb5b4f4..04529b8d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.13", + "version": "0.25.0-alpha.14", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7850b1255..a2ab166b5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.13", + "version": "0.25.0-alpha.14", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From c7d9e100516d00ec91ba99d5285d1b0fc9a70444 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 10 Jul 2019 09:23:44 +0100 Subject: [PATCH 127/545] :arrow_up: Make templates compatible with Node 12 --- generate/templates/manual/clone/clone.cc | 24 ++++++------- .../manual/commit/extract_signature.cc | 14 ++++---- generate/templates/manual/filter_list/load.cc | 36 +++++++++---------- .../templates/manual/filter_source/repo.cc | 6 ++-- .../manual/patches/convenient_patches.cc | 8 ++--- generate/templates/manual/remote/ls.cc | 2 +- .../manual/repository/get_references.cc | 4 +-- .../manual/repository/get_remotes.cc | 4 +-- .../manual/repository/get_submodules.cc | 4 +-- .../manual/repository/refresh_references.cc | 12 +++---- .../templates/manual/revwalk/commit_walk.cc | 4 +-- .../templates/manual/revwalk/fast_walk.cc | 12 +++---- .../manual/revwalk/file_history_walk.cc | 12 +++---- .../templates/manual/src/filter_registry.cc | 24 ++++++------- .../templates/manual/src/git_buf_converter.cc | 2 +- .../templates/manual/src/nodegit_wrapper.cc | 2 +- .../manual/src/promise_completion.cc | 14 ++++---- .../manual/src/str_array_converter.cc | 2 +- generate/templates/partials/async_function.cc | 14 ++++---- .../templates/partials/callback_helpers.cc | 4 +-- .../templates/partials/convert_from_v8.cc | 14 ++++---- generate/templates/partials/convert_to_v8.cc | 8 ++--- .../templates/partials/field_accessors.cc | 10 +++--- generate/templates/partials/sync_function.cc | 2 +- .../templates/templates/struct_content.cc | 4 +-- 25 files changed, 121 insertions(+), 121 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 144be221d..2cab928bf 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -33,7 +33,7 @@ NAN_METHOD(GitClone::Clone) { // start convert_from_v8 block const char *from_url = NULL; - String::Utf8Value url(info[0]->ToString()); + Nan::Utf8String url(Nan::To(info[0]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character // C-strings expect: from_url = (const char *)malloc(url.length() + 1); @@ -50,7 +50,7 @@ NAN_METHOD(GitClone::Clone) { // start convert_from_v8 block const char *from_local_path = NULL; - String::Utf8Value local_path(info[1]->ToString()); + Nan::Utf8String local_path(Nan::To(info[1]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character // C-strings expect: from_local_path = (const char *)malloc(local_path.length() + 1); @@ -67,7 +67,7 @@ NAN_METHOD(GitClone::Clone) { // start convert_from_v8 block const git_clone_options *from_options = NULL; if (info[2]->IsObject()) { - from_options = Nan::ObjectWrap::Unwrap(info[2]->ToObject()) + from_options = Nan::ObjectWrap::Unwrap(Nan::To(info[2]).ToLocalChecked()) ->GetValue(); } else { from_options = 0; @@ -80,11 +80,11 @@ NAN_METHOD(GitClone::Clone) { CloneWorker *worker = new CloneWorker(baton, callback); if (!info[0]->IsUndefined() && !info[0]->IsNull()) - worker->SaveToPersistent("url", info[0]->ToObject()); + worker->SaveToPersistent("url", Nan::To(info[0]).ToLocalChecked()); if (!info[1]->IsUndefined() && !info[1]->IsNull()) - worker->SaveToPersistent("local_path", info[1]->ToObject()); + worker->SaveToPersistent("local_path", Nan::To(info[1]).ToLocalChecked()); if (!info[2]->IsUndefined() && !info[2]->IsNull()) - worker->SaveToPersistent("options", info[2]->ToObject()); + worker->SaveToPersistent("options", Nan::To(info[2]).ToLocalChecked()); AsyncLibgit2QueueWorker(worker); return; @@ -140,9 +140,9 @@ void GitClone::CloneWorker::HandleOKCallback() { if (baton->error) { v8::Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method clone has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), @@ -168,13 +168,13 @@ void GitClone::CloneWorker::HandleOKCallback() { continue; } - v8::Local nodeObj = node->ToObject(); + v8::Local nodeObj = Nan::To(node).ToLocalChecked(); v8::Local checkValue = GetPrivate( nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); if (!checkValue.IsEmpty() && !checkValue->IsNull() && !checkValue->IsUndefined()) { - v8::Local argv[1] = {checkValue->ToObject()}; + v8::Local argv[1] = {Nan::To(checkValue).ToLocalChecked()}; callback->Call(1, argv, async_resource); callbackFired = true; break; @@ -184,7 +184,7 @@ void GitClone::CloneWorker::HandleOKCallback() { for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { v8::Local propName = - properties->Get(propIndex)->ToString(); + Nan::To(properties->Get(propIndex)).ToLocalChecked(); v8::Local nodeToQueue = nodeObj->Get(propName); if (!nodeToQueue->IsUndefined()) { workerArguments.push(nodeToQueue); @@ -194,7 +194,7 @@ void GitClone::CloneWorker::HandleOKCallback() { if (!callbackFired) { v8::Local err = - Nan::Error("Method clone has thrown an error.")->ToObject(); + Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index c17749539..ebcb78fe0 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -28,11 +28,11 @@ NAN_METHOD(GitCommit::ExtractSignature) baton->error = NULL; baton->signature = GIT_BUF_INIT_CONST(NULL, 0); baton->signed_data = GIT_BUF_INIT_CONST(NULL, 0); - baton->repo = Nan::ObjectWrap::Unwrap(info[0]->ToObject())->GetValue(); + baton->repo = Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked())->GetValue(); // baton->commit_id if (info[1]->IsString()) { - String::Utf8Value oidString(info[1]->ToString()); + Nan::Utf8String oidString(Nan::To(info[1]).ToLocalChecked()); baton->commit_id = (git_oid *)malloc(sizeof(git_oid)); if (git_oid_fromstr(baton->commit_id, (const char *)strdup(*oidString)) != GIT_OK) { free(baton->commit_id); @@ -44,12 +44,12 @@ NAN_METHOD(GitCommit::ExtractSignature) } } } else { - baton->commit_id = Nan::ObjectWrap::Unwrap(info[1]->ToObject())->GetValue(); + baton->commit_id = Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); } // baton->field if (info[2]->IsString()) { - String::Utf8Value field(info[2]->ToString()); + Nan::Utf8String field(Nan::To(info[2]).ToLocalChecked()); baton->field = (char *)malloc(field.length() + 1); memcpy((void *)baton->field, *field, field.length()); baton->field[field.length()] = 0; @@ -65,8 +65,8 @@ NAN_METHOD(GitCommit::ExtractSignature) } ExtractSignatureWorker *worker = new ExtractSignatureWorker(baton, callback); - worker->SaveToPersistent("repo", info[0]->ToObject()); - worker->SaveToPersistent("commit_id", info[1]->ToObject()); + worker->SaveToPersistent("repo", Nan::To(info[0]).ToLocalChecked()); + worker->SaveToPersistent("commit_id", Nan::To(info[1]).ToLocalChecked()); Nan::AsyncQueueWorker(worker); return; } @@ -132,7 +132,7 @@ void GitCommit::ExtractSignatureWorker::HandleOKCallback() } else if (baton->error_code < 0) { - Local err = Nan::Error("Extract Signature has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Extract Signature has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Commit.extractSignature").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 6075fd59c..9a3e1ba25 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -47,14 +47,14 @@ NAN_METHOD(GitFilterList::Load) { // start convert_from_v8 block git_repository *from_repo = NULL; from_repo = - Nan::ObjectWrap::Unwrap(info[0]->ToObject())->GetValue(); + Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked())->GetValue(); // end convert_from_v8 block baton->repo = from_repo; // start convert_from_v8 block git_blob *from_blob = NULL; if (info[1]->IsObject()) { from_blob = - Nan::ObjectWrap::Unwrap(info[1]->ToObject())->GetValue(); + Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); } else { from_blob = 0; } @@ -63,7 +63,7 @@ NAN_METHOD(GitFilterList::Load) { // start convert_from_v8 block const char *from_path = NULL; - String::Utf8Value path(info[2]->ToString()); + Nan::Utf8String path(Nan::To(info[2]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character // C-strings expect: from_path = (const char *)malloc(path.length() + 1); @@ -93,15 +93,15 @@ NAN_METHOD(GitFilterList::Load) { LoadWorker *worker = new LoadWorker(baton, callback); if (!info[0]->IsUndefined() && !info[0]->IsNull()) - worker->SaveToPersistent("repo", info[0]->ToObject()); + worker->SaveToPersistent("repo", Nan::To(info[0]).ToLocalChecked()); if (!info[1]->IsUndefined() && !info[1]->IsNull()) - worker->SaveToPersistent("blob", info[1]->ToObject()); + worker->SaveToPersistent("blob", Nan::To(info[1]).ToLocalChecked()); if (!info[2]->IsUndefined() && !info[2]->IsNull()) - worker->SaveToPersistent("path", info[2]->ToObject()); + worker->SaveToPersistent("path", Nan::To(info[2]).ToLocalChecked()); if (!info[3]->IsUndefined() && !info[3]->IsNull()) - worker->SaveToPersistent("mode", info[3]->ToObject()); + worker->SaveToPersistent("mode", Nan::To(info[3]).ToLocalChecked()); if (!info[4]->IsUndefined() && !info[4]->IsNull()) - worker->SaveToPersistent("flags", info[4]->ToObject()); + worker->SaveToPersistent("flags", Nan::To(info[4]).ToLocalChecked()); AsyncLibgit2QueueWorker(worker); return; @@ -139,12 +139,12 @@ void GitFilterList::LoadWorker::HandleOKCallback() { Nan::Set( owners, Nan::New(0), - this->GetFromPersistent("repo")->ToObject() + Nan::To(this->GetFromPersistent("repo")).ToLocalChecked() ); for (uint32_t index = 0; index < propertyNames->Length(); ++index) { - v8::Local propertyName = propertyNames->Get(index)->ToString(); - String::Utf8Value propertyNameAsUtf8Value(propertyName); + v8::Local propertyName = Nan::To(propertyNames->Get(index)).ToLocalChecked(); + Nan::Utf8String propertyNameAsUtf8Value(propertyName); const char *propertyNameAsCString = *propertyNameAsUtf8Value; bool isNotMethodOnRegistry = strcmp("register", propertyNameAsCString) @@ -158,7 +158,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { } } - to = GitFilterList::New(baton->filters, true, owners->ToObject()); + to = GitFilterList::New(baton->filters, true, Nan::To(owners).ToLocalChecked()); } else { to = Nan::Null(); } @@ -172,9 +172,9 @@ void GitFilterList::LoadWorker::HandleOKCallback() { if (baton->error) { v8::Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method load has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), @@ -202,13 +202,13 @@ void GitFilterList::LoadWorker::HandleOKCallback() { continue; } - v8::Local nodeObj = node->ToObject(); + v8::Local nodeObj = Nan::To(node).ToLocalChecked(); v8::Local checkValue = GetPrivate( nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); if (!checkValue.IsEmpty() && !checkValue->IsNull() && !checkValue->IsUndefined()) { - v8::Local argv[1] = {checkValue->ToObject()}; + v8::Local argv[1] = {Nan::To(checkValue).ToLocalChecked()}; callback->Call(1, argv, async_resource); callbackFired = true; break; @@ -218,7 +218,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { v8::Local propName = - properties->Get(propIndex)->ToString(); + Nan::To(properties->Get(propIndex)).ToLocalChecked(); v8::Local nodeToQueue = nodeObj->Get(propName); if (!nodeToQueue->IsUndefined()) { workerArguments.push(nodeToQueue); @@ -228,7 +228,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { if (!callbackFired) { v8::Local err = - Nan::Error("Method load has thrown an error.")->ToObject(); + Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index cf9c1a833..f35fb33a4 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -60,9 +60,9 @@ void GitFilterSource::RepoWorker::HandleOKCallback() { if (baton->error) { v8::Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method repo has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), @@ -74,7 +74,7 @@ void GitFilterSource::RepoWorker::HandleOKCallback() { free((void *)baton->error); } else if (baton->error_code < 0) { v8::Local err = - Nan::Error("Method repo has thrown an error.")->ToObject(); + Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index cc108a8ae..ef9322a43 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -12,7 +12,7 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { baton->error_code = GIT_OK; baton->error = NULL; - baton->diff = Nan::ObjectWrap::Unwrap(info[0]->ToObject())->GetValue(); + baton->diff = Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked())->GetValue(); baton->out = new std::vector; baton->out->reserve(git_diff_num_deltas(baton->diff)); @@ -97,9 +97,9 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { if (baton->error) { Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method convenientFromDiff has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method convenientFromDiff has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); @@ -118,7 +118,7 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { } if (baton->error_code < 0) { - Local err = Nan::Error("method convenientFromDiff has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("method convenientFromDiff has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index f81728256..9fccf4af3 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -85,7 +85,7 @@ void GitRemote::ReferenceListWorker::HandleOKCallback() } else if (baton->error_code < 0) { - Local err = Nan::Error("Reference List has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Reference List has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Remote.referenceList").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index d0e4fd987..910352b52 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -90,7 +90,7 @@ void GitRepository::GetReferencesWorker::HandleOKCallback() GitRefs::New( reference, true, - GitRepository::New(git_reference_owner(reference), true)->ToObject() + Nan::To(GitRepository::New(git_reference_owner(reference), true)).ToLocalChecked() ) ); } @@ -118,7 +118,7 @@ void GitRepository::GetReferencesWorker::HandleOKCallback() } else if (baton->error_code < 0) { - Local err = Nan::Error("Repository getReferences has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Repository getReferences has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getReferences").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index e16f1131c..457ea3ebe 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -91,7 +91,7 @@ void GitRepository::GetRemotesWorker::HandleOKCallback() GitRemote::New( remote, true, - GitRepository::New(git_remote_owner(remote), true)->ToObject() + Nan::To(GitRepository::New(git_remote_owner(remote), true)).ToLocalChecked() ) ); } @@ -119,7 +119,7 @@ void GitRepository::GetRemotesWorker::HandleOKCallback() } else if (baton->error_code < 0) { - Local err = Nan::Error("Repository refreshRemotes has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Repository refreshRemotes has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshRemotes").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index d51d0a0fd..0d73424b1 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -72,7 +72,7 @@ void GitRepository::GetSubmodulesWorker::HandleOKCallback() GitSubmodule::New( submodule, true, - GitRepository::New(git_submodule_owner(submodule), true)->ToObject() + Nan::To(GitRepository::New(git_submodule_owner(submodule), true)).ToLocalChecked() ) ); } @@ -100,7 +100,7 @@ void GitRepository::GetSubmodulesWorker::HandleOKCallback() } else if (baton->error_code < 0) { - Local err = Nan::Error("Repository getSubmodules has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Repository getSubmodules has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getSubmodules").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 65548812c..8db164fb5 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -206,7 +206,7 @@ class RefreshedRefModel { // the destructor didn't double free, but that still segfaulted internally in Node. v8::Local buffer = Nan::CopyBuffer(tagOdbBuffer, tagOdbBufferLength).ToLocalChecked(); v8::Local toStringProp = Nan::Get(buffer, Nan::New("toString").ToLocalChecked()).ToLocalChecked(); - v8::Local jsTagOdbObjectString = Nan::CallAsFunction(toStringProp->ToObject(), buffer, 0, NULL).ToLocalChecked()->ToObject(); + v8::Local jsTagOdbObjectString = Nan::To(Nan::CallAsFunction(Nan::To(toStringProp).ToLocalChecked(), buffer, 0, NULL).ToLocalChecked()).ToLocalChecked(); v8::Local _signatureRegexesBySignatureType = Nan::New(signatureRegexesBySignatureType); v8::Local signatureRegexes = v8::Local::Cast(Nan::Get(_signatureRegexesBySignatureType, signatureType).ToLocalChecked()); @@ -217,9 +217,9 @@ class RefreshedRefModel { }; v8::Local matchProp = Nan::Get(jsTagOdbObjectString, Nan::New("match").ToLocalChecked()).ToLocalChecked(); - v8::Local match = Nan::CallAsFunction(matchProp->ToObject(), jsTagOdbObjectString, 1, argv).ToLocalChecked(); + v8::Local match = Nan::CallAsFunction(Nan::To(matchProp).ToLocalChecked(), jsTagOdbObjectString, 1, argv).ToLocalChecked(); if (match->IsArray()) { - jsTagSignature = Nan::Get(match->ToObject(), 0).ToLocalChecked(); + jsTagSignature = Nan::Get(Nan::To(match).ToLocalChecked(), 0).ToLocalChecked(); break; } } @@ -379,7 +379,7 @@ NAN_METHOD(GitRepository::RefreshReferences) return Nan::ThrowError("Signature type must be \"gpgsig\" or \"x509\"."); } - v8::Local signatureTypeParam = info[0]->ToString(); + v8::Local signatureTypeParam = Nan::To(info[0]).ToLocalChecked(); if ( Nan::Equals(signatureTypeParam, Nan::New("gpgsig").ToLocalChecked()) != Nan::Just(true) && Nan::Equals(signatureTypeParam, Nan::New("x509").ToLocalChecked()) != Nan::Just(true) @@ -611,7 +611,7 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() Nan::New(refreshData->headRefFullName).ToLocalChecked() ); - v8::Local signatureType = GetFromPersistent("signatureType")->ToString(); + v8::Local signatureType = Nan::To(GetFromPersistent("signatureType")).ToLocalChecked(); unsigned int numRefs = refreshData->refs.size(); v8::Local refs = Nan::New(numRefs); @@ -672,7 +672,7 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() } else if (baton->error_code < 0) { - Local err = Nan::Error("Repository refreshReferences has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Repository refreshReferences has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshReferences").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index af0ff112a..1c7bed6fc 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -87,7 +87,7 @@ void GitRevwalk::CommitWalkWorker::HandleOKCallback() { GitCommit::New( commit, true, - GitRepository::New(git_commit_owner(commit), true)->ToObject() + Nan::To(GitRepository::New(git_commit_owner(commit), true)).ToLocalChecked() ) ); } @@ -110,7 +110,7 @@ void GitRevwalk::CommitWalkWorker::HandleOKCallback() { free((void *)baton->error); } else if (baton->error_code < 0) { - Local err = Nan::Error("Revwalk commitWalk has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Revwalk commitWalk has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.commitWalk").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index fbf5c09b5..619f8c6c8 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -90,9 +90,9 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() { Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method fastWalk has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method fastWalk has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); @@ -131,13 +131,13 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() continue; } - Local nodeObj = node->ToObject(); + Local nodeObj = Nan::To(node).ToLocalChecked(); Local checkValue = GetPrivate(nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); if (!checkValue.IsEmpty() && !checkValue->IsNull() && !checkValue->IsUndefined()) { Local argv[1] = { - checkValue->ToObject() + Nan::To(checkValue).ToLocalChecked() }; callback->Call(1, argv, async_resource); callbackFired = true; @@ -147,7 +147,7 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() Local properties = nodeObj->GetPropertyNames(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { - Local propName = properties->Get(propIndex)->ToString(); + Local propName = Nan::To(properties->Get(propIndex)).ToLocalChecked(); Local nodeToQueue = nodeObj->Get(propName); if (!nodeToQueue->IsUndefined()) { @@ -158,7 +158,7 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() if (!callbackFired) { - Local err = Nan::Error("Method next has thrown an error.")->ToObject(); + Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); Local argv[1] = { diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 49c23445e..f7cec692a 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -34,10 +34,10 @@ class FileHistoryEvent { Nan::Set( owners, Nan::New(owners->Length()), - GitRepository::New( + Nan::To(GitRepository::New( git_commit_owner(commit), true - )->ToObject() + )).ToLocalChecked() ); Nan::Set(historyEntry, Nan::New("commit").ToLocalChecked(), GitCommit::New(commit, true, owners)); commit = NULL; @@ -196,7 +196,7 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) baton->error_code = GIT_OK; baton->error = NULL; - String::Utf8Value from_js_file_path(info[0]->ToString()); + Nan::Utf8String from_js_file_path(Nan::To(info[0]).ToLocalChecked()); baton->file_path = strdup(*from_js_file_path); baton->max_count = Nan::To(info[1]).FromJust(); baton->out = new std::vector; @@ -444,9 +444,9 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() if (baton->error) { v8::Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method fileHistoryWalk has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method fileHistoryWalk has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); @@ -464,7 +464,7 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() } if (baton->error_code < 0) { - v8::Local err = Nan::Error("Method next has thrown an error.")->ToObject(); + v8::Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); v8::Local argv[1] = { diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 410255289..62de8f80a 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -54,8 +54,8 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { FilterRegisterBaton *baton = new FilterRegisterBaton; - baton->filter = Nan::ObjectWrap::Unwrap(info[1]->ToObject())->GetValue(); - String::Utf8Value name(info[0]->ToString()); + baton->filter = Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); + Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); baton->filter_name = (char *)malloc(name.length() + 1); memcpy((void *)baton->filter_name, *name, name.length()); @@ -64,13 +64,13 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { baton->error_code = GIT_OK; baton->filter_priority = Nan::To(info[2]).FromJust(); - Nan::New(GitFilterRegistry::persistentHandle)->Set(info[0]->ToString(), info[1]->ToObject()); + Nan::New(GitFilterRegistry::persistentHandle)->Set(Nan::To(Nan::To(info[0]).ToLocalChecked(), info[1]).ToLocalChecked()); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); RegisterWorker *worker = new RegisterWorker(baton, callback); - worker->SaveToPersistent("filter_name", info[0]->ToObject()); - worker->SaveToPersistent("filter_priority", info[2]->ToObject()); + worker->SaveToPersistent("filter_name", Nan::To(info[0]).ToLocalChecked()); + worker->SaveToPersistent("filter_priority", Nan::To(info[2]).ToLocalChecked()); AsyncLibgit2QueueWorker(worker); return; @@ -102,9 +102,9 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { else if (baton->error) { v8::Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method register has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); @@ -117,7 +117,7 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { free((void *)baton->error); } else if (baton->error_code < 0) { - v8::Local err = Nan::Error("Method register has thrown an error.")->ToObject(); + v8::Local err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); v8::Local argv[1] = { @@ -144,7 +144,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { } FilterUnregisterBaton *baton = new FilterUnregisterBaton; - String::Utf8Value name(info[0]->ToString()); + Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); baton->filter_name = (char *)malloc(name.length() + 1); memcpy((void *)baton->filter_name, *name, name.length()); @@ -188,9 +188,9 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { else if (baton->error) { v8::Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method register has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); @@ -203,7 +203,7 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { free((void *)baton->error); } else if (baton->error_code < 0) { - v8::Local err = Nan::Error("Method unregister has thrown an error.")->ToObject(); + v8::Local err = Nan::To(Nan::Error("Method unregister has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); v8::Local argv[1] = { diff --git a/generate/templates/manual/src/git_buf_converter.cc b/generate/templates/manual/src/git_buf_converter.cc index 0c1969504..1413168af 100644 --- a/generate/templates/manual/src/git_buf_converter.cc +++ b/generate/templates/manual/src/git_buf_converter.cc @@ -10,7 +10,7 @@ using namespace node; git_buf *GitBufConverter::Convert(Local val) { if (val->IsString() || val->IsStringObject()) { - v8::String::Utf8Value param1(val->ToString()); + v8::String::Utf8Value param1(Nan::To(val).ToLocalChecked()); std::string v8String = std::string(*param1); const size_t size = sizeof(git_buf); diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index 26ead60da..e9fb8ebdb 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -67,7 +67,7 @@ NAN_METHOD(NodeGitWrapper::JSNewFunction) { instance = new cppClass(static_cast( Local::Cast(info[0])->Value()), Nan::To(info[1]).FromJust(), - info.Length() >= 3 && !info[2].IsEmpty() && info[2]->IsObject() ? info[2]->ToObject() : Local() + info.Length() >= 3 && !Nan::To(info[2].IsEmpty() && info[2]->IsObject() ? info[2]).ToLocalChecked() : Local() ); } diff --git a/generate/templates/manual/src/promise_completion.cc b/generate/templates/manual/src/promise_completion.cc index fd34dfa77..88bde47da 100644 --- a/generate/templates/manual/src/promise_completion.cc +++ b/generate/templates/manual/src/promise_completion.cc @@ -9,10 +9,10 @@ Nan::Persistent PromiseCompletion::promiseRejected; void PromiseCompletion::InitializeComponent() { v8::Local newTemplate = Nan::New(New); newTemplate->InstanceTemplate()->SetInternalFieldCount(1); - newFn.Reset(newTemplate->GetFunction()); + newFn.Reset(Nan::GetFunction(newTemplate).ToLocalChecked()); - promiseFulfilled.Reset(Nan::New(PromiseFulfilled)->GetFunction()); - promiseRejected.Reset(Nan::New(PromiseRejected)->GetFunction()); + promiseFulfilled.Reset(Nan::GetFunction(Nan::New(PromiseFulfilled)).ToLocalChecked()); + promiseRejected.Reset(Nan::GetFunction(Nan::New(PromiseRejected)).ToLocalChecked()); } bool PromiseCompletion::ForwardIfPromise(v8::Local result, AsyncBaton *baton, Callback callback) @@ -21,7 +21,7 @@ bool PromiseCompletion::ForwardIfPromise(v8::Local result, AsyncBaton // check if the result is a promise if (!result.IsEmpty() && result->IsObject()) { - Nan::MaybeLocal maybeThenProp = Nan::Get(result->ToObject(), Nan::New("then").ToLocalChecked()); + Nan::MaybeLocal maybeThenProp = Nan::Get(Nan::To(result).ToLocalChecked(), Nan::New("then").ToLocalChecked()); if (!maybeThenProp.IsEmpty()) { v8::Local thenProp = maybeThenProp.ToLocalChecked(); if(thenProp->IsFunction()) { @@ -54,7 +54,7 @@ void PromiseCompletion::Setup(v8::Local thenFn, v8::Localcallback = callback; this->baton = baton; - v8::Local promise = result->ToObject(); + v8::Local promise = Nan::To(result).ToLocalChecked(); v8::Local thisHandle = handle(); @@ -78,7 +78,7 @@ v8::Local PromiseCompletion::Bind(Nan::Persistent &func v8::Local argv[1] = { object }; - return scope.Escape(bind->Call(Nan::New(function), 1, argv)); + return scope.Escape(Nan::Call(bind, Nan::To(Nan::New(function)).ToLocalChecked(), 1, argv)); } // calls the callback stored in the PromiseCompletion, passing the baton that @@ -90,7 +90,7 @@ void PromiseCompletion::CallCallback(bool isFulfilled, const Nan::FunctionCallba resultOfPromise = info[0]; } - PromiseCompletion *promiseCompletion = ObjectWrap::Unwrap(info.This()->ToObject()); + PromiseCompletion *promiseCompletion = ObjectWrap::Unwrap(Nan::To(info.This()).ToLocalChecked()); (*promiseCompletion->callback)(isFulfilled, promiseCompletion->baton, resultOfPromise); } diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index c66f901c3..ed0e93e2b 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -17,7 +17,7 @@ git_strarray *StrArrayConverter::Convert(Local val) { return ConvertArray(Array::Cast(*val)); } else if (val->IsString() || val->IsStringObject()) { - return ConvertString(val->ToString()); + return ConvertString(Nan::To(val).ToLocalChecked()); } else { return NULL; diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 2fe854bec..ea7c43037 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -69,7 +69,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { worker->SaveToPersistent("{{ arg.name }}", info.This()); {%elsif not arg.isCallbackFunction %} if (!info[{{ arg.jsArg }}]->IsUndefined() && !info[{{ arg.jsArg }}]->IsNull()) - worker->SaveToPersistent("{{ arg.name }}", info[{{ arg.jsArg }}]->ToObject()); + worker->SaveToPersistent("{{ arg.name }}", Nan::To(info[{{ arg.jsArg }}]).ToLocalChecked()); {%endif%} {%endif%} {%endeach%} @@ -163,9 +163,9 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { if (baton->error) { v8::Local err; if (baton->error->message) { - err = Nan::Error(baton->error->message)->ToObject(); + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); } else { - err = Nan::Error("Method {{ jsFunctionName }} has thrown an error.")->ToObject(); + err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); } err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); @@ -205,12 +205,12 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { continue; } - v8::Local nodeObj = node->ToObject(); + v8::Local nodeObj = Nan::To(node).ToLocalChecked(); v8::Local checkValue = GetPrivate(nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); if (!checkValue.IsEmpty() && !checkValue->IsNull() && !checkValue->IsUndefined()) { v8::Local argv[1] = { - checkValue->ToObject() + Nan::To(checkValue).ToLocalChecked() }; callback->Call(1, argv, async_resource); callbackFired = true; @@ -219,7 +219,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { v8::Local properties = nodeObj->GetPropertyNames(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { - v8::Local propName = properties->Get(propIndex)->ToString(); + v8::Local propName = Nan::To(properties->Get(propIndex)).ToLocalChecked(); v8::Local nodeToQueue = nodeObj->Get(propName); if (!nodeToQueue->IsUndefined()) { workerArguments.push(nodeToQueue); @@ -228,7 +228,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { } if (!callbackFired) { - v8::Local err = Nan::Error("Method {{ jsFunctionName }} has thrown an error.")->ToObject(); + v8::Local err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); v8::Local argv[1] = { diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index 7a40aed25..c3810371c 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -66,7 +66,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); wrapper->selfFreeing = false; *baton->{{ _return.name }} = wrapper->GetValue(); @@ -100,7 +100,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_promiseComp } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); wrapper->selfFreeing = false; *baton->{{ _return.name }} = wrapper->GetValue(); diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index c1486d5a6..4f6a146d4 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -19,7 +19,7 @@ {%endif%} {%if cppClassName == 'String'%} - String::Utf8Value {{ name }}(info[{{ jsArg }}]->ToString()); + Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character C-strings expect: from_{{ name }} = ({{ cType }}) malloc({{ name }}.length() + 1); // copy the characters from the nodejs string into our C-string (used instead of strdup or strcpy because nulls in @@ -36,7 +36,7 @@ from_{{ name }} = GitBufConverter::Convert(info[{{ jsArg }}]); {%elsif cppClassName == 'Wrapper'%} - String::Utf8Value {{ name }}(info[{{ jsArg }}]->ToString()); + Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character C-strings expect: from_{{ name }} = ({{ cType }}) malloc({{ name }}.length() + 1); // copy the characters from the nodejs string into our C-string (used instead of strdup or strcpy because nulls in @@ -53,12 +53,12 @@ {%-- // FIXME: should recursively call convertFromv8. --%} - from_{{ name }}[i] = Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(tmp_{{ name }}->Get(Nan::New(static_cast(i)))->ToObject())->GetValue(); + from_{{ name }}[i] = Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(Nan::To(tmp_{{ name }}->Get(Nan::New(static_cast(i)))).ToLocalChecked())->GetValue(); } {%elsif cppClassName == 'Function'%} {%elsif cppClassName == 'Buffer'%} - from_{{ name }} = Buffer::Data(info[{{ jsArg }}]->ToObject()); + from_{{ name }} = Buffer::Data(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); {%elsif cppClassName|isV8Value %} {%if cType|isPointer %} @@ -69,7 +69,7 @@ {%elsif cppClassName == 'GitOid'%} if (info[{{ jsArg }}]->IsString()) { // Try and parse in a string to a git_oid - String::Utf8Value oidString(info[{{ jsArg }}]->ToString()); + Nan::Utf8String oidString(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); git_oid *oidOut = (git_oid *)malloc(sizeof(git_oid)); if (git_oid_fromstr(oidOut, (const char *) strdup(*oidString)) != GIT_OK) { @@ -89,10 +89,10 @@ {%endif%} } else { - {%if cType|isDoublePointer %}*{%endif%}from_{{ name }} = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info[{{ jsArg }}]->ToObject())->GetValue(); + {%if cType|isDoublePointer %}*{%endif%}from_{{ name }} = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(Nan::To(info[{{ jsArg }}]).ToLocalChecked())->GetValue(); } {%else%} - {%if cType|isDoublePointer %}*{%endif%}from_{{ name }} = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info[{{ jsArg }}]->ToObject())->GetValue(); + {%if cType|isDoublePointer %}*{%endif%}from_{{ name }} = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(Nan::To(info[{{ jsArg }}]).ToLocalChecked())->GetValue(); {%endif%} {%if isBoolean %} diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index 1227932a6..a7a251938 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -79,11 +79,11 @@ {% if isAsync %} {% each ownedBy as owner %} {%-- If the owner of this object is "this" in an async method, it will be stored in the persistent handle by name. --%} - Nan::Set(owners, Nan::New(owners->Length()), this->GetFromPersistent("{{= owner =}}")->ToObject()); + Nan::Set(owners, Nan::New(owners->Length()), Nan::To(this->GetFromPersistent("{{= owner =}}")).ToLocalChecked()); {% endeach %} {% else %} {% each ownedByIndices as ownedByIndex %} - Nan::Set(owners, Nan::New(owners->Length()), info[{{= ownedByIndex =}}]->ToObject()); + Nan::Set(owners, Nan::New(owners->Length()), Nan::To(info[{{= ownedByIndex =}}]).ToLocalChecked()); {% endeach %} {% endif %} {% endif %} @@ -96,10 +96,10 @@ Nan::Set( owners, Nan::New(owners->Length()), - {{= ownerFn.singletonCppClassName =}}::New( + Nan::To({{= ownerFn.singletonCppClassName =}}::New( {{= ownerFn.name =}}({{ cType|asElementPointer parsedName }}), true - )->ToObject() + )).ToLocalChecked() ); {% endif %} {% endif %} diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 222034150..8ed8858fa 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -39,11 +39,11 @@ } {% elsif field.isLibgitType %} - v8::Local {{ field.name }}(value->ToObject()); + v8::Local {{ field.name }}(Nan::To(value).ToLocalChecked()); wrapper->{{ field.name }}.Reset({{ field.name }}); - wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}{% if field.cppClassName == 'GitStrarray' %}StrArrayConverter::Convert({{ field.name }}->ToObject()){% else %}Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>({{ field.name }}->ToObject())->GetValue(){% endif %}; + wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}{% if field.cppClassName == 'GitStrarray' %}StrArrayConverter::Convert(Nan::To({{ field.name }}).ToLocalChecked())){% else %}Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(Nan::To({{ field.name }}).ToLocalChecked())->GetValue(){% endif %}; {% elsif field.isCallbackFunction %} Nan::Callback *callback = NULL; @@ -92,7 +92,7 @@ if (wrapper->GetValue()->{{ field.name }}) { } - String::Utf8Value str(value); + Nan::Utf8String str(value); wrapper->GetValue()->{{ field.name }} = strdup(*str); {% elsif field.isCppClassIntType %} @@ -225,7 +225,7 @@ } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); wrapper->selfFreeing = false; *baton->{{ _return.name }} = wrapper->GetValue(); @@ -261,7 +261,7 @@ } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(result->ToObject()); + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); wrapper->selfFreeing = false; *baton->{{ _return.name }} = wrapper->GetValue(); diff --git a/generate/templates/partials/sync_function.cc b/generate/templates/partials/sync_function.cc index 89bb2e2dc..4a76463ed 100644 --- a/generate/templates/partials/sync_function.cc +++ b/generate/templates/partials/sync_function.cc @@ -17,7 +17,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%if not arg.isReturn %} {%partial convertFromV8 arg %} {%if arg.saveArg %} - v8::Local {{ arg.name }}(info[{{ arg.jsArg }}]->ToObject()); + v8::Local {{ arg.name }}(Nan::To(info[{{ arg.jsArg }}]).ToLocalChecked()); {{ cppClassName }} *thisObj = Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This()); thisObj->{{ cppFunctionName }}_{{ arg.name }}.Reset({{ arg.name }}); diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index 0c7b9e4f1..0450447ac 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -80,10 +80,10 @@ void {{ cppClassName }}::ConstructFields() { {% if not field.ignore %} {% if not field.isEnum %} {% if field.hasConstructor |or field.isLibgitType %} - v8::Local {{ field.name }}Temp = {{ field.cppClassName }}::New( + v8::Local {{ field.name }}Temp = Nan::To({{ field.cppClassName }}::New( {%if not field.cType|isPointer %}&{%endif%}this->raw->{{ field.name }}, false - )->ToObject(); + )).ToLocalChecked(); this->{{ field.name }}.Reset({{ field.name }}Temp); {% elsif field.isCallbackFunction %} From 59bad990829711ee4e499ed27892ecb6cef5900a Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 10 Jul 2019 09:52:45 +0100 Subject: [PATCH 128/545] :arrow_up: GetPropertyNames also needs to be changed for Node 12 --- generate/templates/manual/clone/clone.cc | 2 +- generate/templates/manual/filter_list/load.cc | 4 ++-- generate/templates/manual/revwalk/fast_walk.cc | 2 +- generate/templates/partials/async_function.cc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 2cab928bf..19c44af21 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -180,7 +180,7 @@ void GitClone::CloneWorker::HandleOKCallback() { break; } - v8::Local properties = nodeObj->GetPropertyNames(); + v8::Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { v8::Local propName = diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 9a3e1ba25..9075b5ead 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -134,7 +134,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { // GitFilterList baton->filters v8::Local owners = Nan::New(0); v8::Local filterRegistry = Nan::New(GitFilterRegistry::persistentHandle); - v8::Local propertyNames = filterRegistry->GetPropertyNames(); + v8::Local propertyNames = Nan::GetPropertyNames(filterRegistry).ToLocalChecked(); Nan::Set( owners, @@ -214,7 +214,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { break; } - v8::Local properties = nodeObj->GetPropertyNames(); + v8::Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { v8::Local propName = diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 619f8c6c8..bf4f70710 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -144,7 +144,7 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() break; } - Local properties = nodeObj->GetPropertyNames(); + Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { Local propName = Nan::To(properties->Get(propIndex)).ToLocalChecked(); diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index ea7c43037..8cd11d0f9 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -217,7 +217,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { break; } - v8::Local properties = nodeObj->GetPropertyNames(); + v8::Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { v8::Local propName = Nan::To(properties->Get(propIndex)).ToLocalChecked(); v8::Local nodeToQueue = nodeObj->Get(propName); From eb2df373ec490679b2b9aa69e26b5d85f56feadf Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 10 Jul 2019 09:56:59 +0100 Subject: [PATCH 129/545] :art: Extra space for Utf8Strings to line up better --- generate/templates/manual/clone/clone.cc | 4 ++-- generate/templates/manual/commit/extract_signature.cc | 4 ++-- generate/templates/manual/filter_list/load.cc | 4 ++-- generate/templates/manual/revwalk/file_history_walk.cc | 2 +- generate/templates/manual/src/filter_registry.cc | 4 ++-- generate/templates/manual/src/str_array_converter.cc | 4 ++-- generate/templates/partials/convert_from_v8.cc | 6 +++--- generate/templates/partials/field_accessors.cc | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 19c44af21..e0921e700 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -33,7 +33,7 @@ NAN_METHOD(GitClone::Clone) { // start convert_from_v8 block const char *from_url = NULL; - Nan::Utf8String url(Nan::To(info[0]).ToLocalChecked()); + Nan::Utf8String url(Nan::To(info[0]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character // C-strings expect: from_url = (const char *)malloc(url.length() + 1); @@ -50,7 +50,7 @@ NAN_METHOD(GitClone::Clone) { // start convert_from_v8 block const char *from_local_path = NULL; - Nan::Utf8String local_path(Nan::To(info[1]).ToLocalChecked()); + Nan::Utf8String local_path(Nan::To(info[1]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character // C-strings expect: from_local_path = (const char *)malloc(local_path.length() + 1); diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index ebcb78fe0..a5bd9f8b1 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -32,7 +32,7 @@ NAN_METHOD(GitCommit::ExtractSignature) // baton->commit_id if (info[1]->IsString()) { - Nan::Utf8String oidString(Nan::To(info[1]).ToLocalChecked()); + Nan::Utf8String oidString(Nan::To(info[1]).ToLocalChecked()); baton->commit_id = (git_oid *)malloc(sizeof(git_oid)); if (git_oid_fromstr(baton->commit_id, (const char *)strdup(*oidString)) != GIT_OK) { free(baton->commit_id); @@ -49,7 +49,7 @@ NAN_METHOD(GitCommit::ExtractSignature) // baton->field if (info[2]->IsString()) { - Nan::Utf8String field(Nan::To(info[2]).ToLocalChecked()); + Nan::Utf8String field(Nan::To(info[2]).ToLocalChecked()); baton->field = (char *)malloc(field.length() + 1); memcpy((void *)baton->field, *field, field.length()); baton->field[field.length()] = 0; diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 9075b5ead..082cfe212 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -63,7 +63,7 @@ NAN_METHOD(GitFilterList::Load) { // start convert_from_v8 block const char *from_path = NULL; - Nan::Utf8String path(Nan::To(info[2]).ToLocalChecked()); + Nan::Utf8String path(Nan::To(info[2]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character // C-strings expect: from_path = (const char *)malloc(path.length() + 1); @@ -144,7 +144,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { for (uint32_t index = 0; index < propertyNames->Length(); ++index) { v8::Local propertyName = Nan::To(propertyNames->Get(index)).ToLocalChecked(); - Nan::Utf8String propertyNameAsUtf8Value(propertyName); + Nan::Utf8String propertyNameAsUtf8Value(propertyName); const char *propertyNameAsCString = *propertyNameAsUtf8Value; bool isNotMethodOnRegistry = strcmp("register", propertyNameAsCString) diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index f7cec692a..a3d9764d6 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -196,7 +196,7 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) baton->error_code = GIT_OK; baton->error = NULL; - Nan::Utf8String from_js_file_path(Nan::To(info[0]).ToLocalChecked()); + Nan::Utf8String from_js_file_path(Nan::To(info[0]).ToLocalChecked()); baton->file_path = strdup(*from_js_file_path); baton->max_count = Nan::To(info[1]).FromJust(); baton->out = new std::vector; diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 62de8f80a..bf69012d4 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -55,7 +55,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { FilterRegisterBaton *baton = new FilterRegisterBaton; baton->filter = Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); - Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); + Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); baton->filter_name = (char *)malloc(name.length() + 1); memcpy((void *)baton->filter_name, *name, name.length()); @@ -144,7 +144,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { } FilterUnregisterBaton *baton = new FilterUnregisterBaton; - Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); + Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); baton->filter_name = (char *)malloc(name.length() + 1); memcpy((void *)baton->filter_name, *name, name.length()); diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index ed0e93e2b..56e7d7dda 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -37,7 +37,7 @@ git_strarray *StrArrayConverter::ConvertArray(Array *val) { git_strarray *result = AllocStrArray(val->Length()); for(size_t i = 0; i < result->count; i++) { - Nan::Utf8String entry(val->Get(i)); + Nan::Utf8String entry(val->Get(i)); result->strings[i] = strdup(*entry); } @@ -46,7 +46,7 @@ git_strarray *StrArrayConverter::ConvertArray(Array *val) { git_strarray* StrArrayConverter::ConvertString(Local val) { char *strings[1]; - Nan::Utf8String utf8String(val); + Nan::Utf8String utf8String(val); strings[0] = *utf8String; diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index 4f6a146d4..a3ea193a5 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -19,7 +19,7 @@ {%endif%} {%if cppClassName == 'String'%} - Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); + Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character C-strings expect: from_{{ name }} = ({{ cType }}) malloc({{ name }}.length() + 1); // copy the characters from the nodejs string into our C-string (used instead of strdup or strcpy because nulls in @@ -36,7 +36,7 @@ from_{{ name }} = GitBufConverter::Convert(info[{{ jsArg }}]); {%elsif cppClassName == 'Wrapper'%} - Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); + Nan::Utf8String {{ name }}(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); // malloc with one extra byte so we can add the terminating null character C-strings expect: from_{{ name }} = ({{ cType }}) malloc({{ name }}.length() + 1); // copy the characters from the nodejs string into our C-string (used instead of strdup or strcpy because nulls in @@ -69,7 +69,7 @@ {%elsif cppClassName == 'GitOid'%} if (info[{{ jsArg }}]->IsString()) { // Try and parse in a string to a git_oid - Nan::Utf8String oidString(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); + Nan::Utf8String oidString(Nan::To(info[{{ jsArg }}]).ToLocalChecked()); git_oid *oidOut = (git_oid *)malloc(sizeof(git_oid)); if (git_oid_fromstr(oidOut, (const char *) strdup(*oidString)) != GIT_OK) { diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 8ed8858fa..c805d8d13 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -92,7 +92,7 @@ if (wrapper->GetValue()->{{ field.name }}) { } - Nan::Utf8String str(value); + Nan::Utf8String str(value); wrapper->GetValue()->{{ field.name }} = strdup(*str); {% elsif field.isCppClassIntType %} From 8e723ef46635b912c5d47a3b389f075a58547fe4 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 10 Jul 2019 10:03:55 +0100 Subject: [PATCH 130/545] :arrow_up: BooleanValue also needs changing for Node 12 --- generate/templates/manual/src/str_array_converter.cc | 2 +- generate/templates/partials/field_accessors.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index 56e7d7dda..afca4bd06 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -10,7 +10,7 @@ using namespace v8; using namespace node; git_strarray *StrArrayConverter::Convert(Local val) { - if (!val->BooleanValue()) { + if (!Nan::To(val).FromJust()) { return NULL; } else if (val->IsArray()) { diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index c805d8d13..fd785828c 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -72,7 +72,7 @@ Nan::MaybeLocal maybeObjectWaitForResult = Nan::Get(object, Nan::New("waitForResult").ToLocalChecked()); if(!maybeObjectWaitForResult.IsEmpty()) { Local objectWaitForResult = maybeObjectWaitForResult.ToLocalChecked(); - waitForResult = (bool)objectWaitForResult->BooleanValue(); + waitForResult = Nan::To(objectWaitForResult).FromJust(); } } } From 77b615a6ebd0f910a816b76142eabea830dc9a2e Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 10 Jul 2019 10:10:06 +0100 Subject: [PATCH 131/545] :arrow_up: Minor amends for a few manual templates --- generate/templates/manual/src/filter_registry.cc | 2 +- generate/templates/manual/src/git_buf_converter.cc | 2 +- generate/templates/manual/src/nodegit_wrapper.cc | 2 +- generate/templates/partials/field_accessors.cc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index bf69012d4..59124ab41 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -64,7 +64,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { baton->error_code = GIT_OK; baton->filter_priority = Nan::To(info[2]).FromJust(); - Nan::New(GitFilterRegistry::persistentHandle)->Set(Nan::To(Nan::To(info[0]).ToLocalChecked(), info[1]).ToLocalChecked()); + Nan::New(GitFilterRegistry::persistentHandle)->Set(Nan::To(info[0]).ToLocalChecked(), Nan::To(info[1]).ToLocalChecked()); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); RegisterWorker *worker = new RegisterWorker(baton, callback); diff --git a/generate/templates/manual/src/git_buf_converter.cc b/generate/templates/manual/src/git_buf_converter.cc index 1413168af..1558d39fe 100644 --- a/generate/templates/manual/src/git_buf_converter.cc +++ b/generate/templates/manual/src/git_buf_converter.cc @@ -10,7 +10,7 @@ using namespace node; git_buf *GitBufConverter::Convert(Local val) { if (val->IsString() || val->IsStringObject()) { - v8::String::Utf8Value param1(Nan::To(val).ToLocalChecked()); + Nan::Utf8String param1(Nan::To(val).ToLocalChecked()); std::string v8String = std::string(*param1); const size_t size = sizeof(git_buf); diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index e9fb8ebdb..69aed4f94 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -67,7 +67,7 @@ NAN_METHOD(NodeGitWrapper::JSNewFunction) { instance = new cppClass(static_cast( Local::Cast(info[0])->Value()), Nan::To(info[1]).FromJust(), - info.Length() >= 3 && !Nan::To(info[2].IsEmpty() && info[2]->IsObject() ? info[2]).ToLocalChecked() : Local() + info.Length() >= 3 && !info[2].IsEmpty() && info[2]->IsObject() ? Nan::To(info[2]).ToLocalChecked() : Local() ); } diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index fd785828c..35b583bdc 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -43,7 +43,7 @@ wrapper->{{ field.name }}.Reset({{ field.name }}); - wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}{% if field.cppClassName == 'GitStrarray' %}StrArrayConverter::Convert(Nan::To({{ field.name }}).ToLocalChecked())){% else %}Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(Nan::To({{ field.name }}).ToLocalChecked())->GetValue(){% endif %}; + wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}{% if field.cppClassName == 'GitStrarray' %}StrArrayConverter::Convert(Nan::To({{ field.name }}).ToLocalChecked()){% else %}Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(Nan::To({{ field.name }}).ToLocalChecked())->GetValue(){% endif %}; {% elsif field.isCallbackFunction %} Nan::Callback *callback = NULL; From a470a678b4204f28b4e4de607a103ae2b254b5a1 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 10 Jul 2019 10:16:26 +0100 Subject: [PATCH 132/545] :arrow_up: Nan::Call requires ToLocalChecked --- generate/templates/manual/src/promise_completion.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate/templates/manual/src/promise_completion.cc b/generate/templates/manual/src/promise_completion.cc index 88bde47da..1e503ac72 100644 --- a/generate/templates/manual/src/promise_completion.cc +++ b/generate/templates/manual/src/promise_completion.cc @@ -78,7 +78,7 @@ v8::Local PromiseCompletion::Bind(Nan::Persistent &func v8::Local argv[1] = { object }; - return scope.Escape(Nan::Call(bind, Nan::To(Nan::New(function)).ToLocalChecked(), 1, argv)); + return scope.Escape(Nan::Call(bind, Nan::To(Nan::New(function)).ToLocalChecked(), 1, argv).ToLocalChecked()); } // calls the callback stored in the PromiseCompletion, passing the baton that From a10a61677a479d5e83b9d7b4ff962f2dd8439098 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Wed, 10 Jul 2019 10:25:15 +0100 Subject: [PATCH 133/545] :art: Final spacing amends for manual str_array_converter --- generate/templates/manual/src/str_array_converter.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index afca4bd06..6100fd01d 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -37,7 +37,7 @@ git_strarray *StrArrayConverter::ConvertArray(Array *val) { git_strarray *result = AllocStrArray(val->Length()); for(size_t i = 0; i < result->count; i++) { - Nan::Utf8String entry(val->Get(i)); + Nan::Utf8String entry(val->Get(i)); result->strings[i] = strdup(*entry); } @@ -46,7 +46,7 @@ git_strarray *StrArrayConverter::ConvertArray(Array *val) { git_strarray* StrArrayConverter::ConvertString(Local val) { char *strings[1]; - Nan::Utf8String utf8String(val); + Nan::Utf8String utf8String(val); strings[0] = *utf8String; From 4db16704391f058e11c8fd7cab00a7cfc315200f Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Fri, 12 Jul 2019 08:29:02 +0100 Subject: [PATCH 134/545] :white_check_mark: Start building for Node 12 --- .travis.yml | 1 + appveyor.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 682ca1cf9..e1d7ff047 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ env: - TARGET_ARCH="ia32" node_js: + - "12" - "10" - "8" diff --git a/appveyor.yml b/appveyor.yml index 46fc6a1b5..891225fd7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -26,6 +26,7 @@ environment: GYP_MSVS_VERSION: 2015 matrix: # Node.js + - nodejs_version: "12" - nodejs_version: "10" - nodejs_version: "8" From 9bc65c6d242bb0e3cd1350408925c79c8426bdd7 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Fri, 12 Jul 2019 09:12:50 +0100 Subject: [PATCH 135/545] :arrow_up: Update versions of nan and node-pre-gyp --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a2ab166b5..c071d62c7 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,9 @@ "fs-extra": "^7.0.0", "json5": "^2.1.0", "lodash": "^4.17.11", - "nan": "^2.11.1", + "nan": "^2.14.0", "node-gyp": "^4.0.0", - "node-pre-gyp": "^0.11.0", + "node-pre-gyp": "^0.13.0", "promisify-node": "~0.3.0", "ramda": "^0.25.0", "request-promise-native": "^1.0.5", From 658936e8faa97eb555ea58f21c888e1925299861 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Fri, 12 Jul 2019 11:48:46 +0100 Subject: [PATCH 136/545] :recycle: Remove last depreciated warnings so everything is now clean --- generate/templates/manual/clone/clone.cc | 12 +++++----- .../manual/commit/extract_signature.cc | 4 ++-- generate/templates/manual/filter_list/load.cc | 16 ++++++------- .../templates/manual/filter_source/repo.cc | 8 +++---- .../manual/include/str_array_converter.h | 4 ++-- .../manual/patches/convenient_patches.cc | 8 +++---- generate/templates/manual/remote/ls.cc | 4 ++-- .../manual/repository/get_references.cc | 4 ++-- .../manual/repository/get_remotes.cc | 4 ++-- .../manual/repository/get_submodules.cc | 4 ++-- .../manual/repository/refresh_references.cc | 4 ++-- .../templates/manual/revwalk/commit_walk.cc | 4 ++-- .../templates/manual/revwalk/fast_walk.cc | 12 +++++----- .../manual/revwalk/file_history_walk.cc | 8 +++---- .../templates/manual/src/filter_registry.cc | 18 +++++++------- .../manual/src/promise_completion.cc | 2 +- .../manual/src/str_array_converter.cc | 10 ++++---- generate/templates/partials/async_function.cc | 12 +++++----- .../templates/partials/convert_from_v8.cc | 4 ++-- generate/templates/templates/nodegit.cc | 24 +++++++------------ 20 files changed, 80 insertions(+), 86 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index e0921e700..6f5f79769 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -144,8 +144,8 @@ void GitClone::CloneWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Clone.clone").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); @@ -184,8 +184,8 @@ void GitClone::CloneWorker::HandleOKCallback() { for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { v8::Local propName = - Nan::To(properties->Get(propIndex)).ToLocalChecked(); - v8::Local nodeToQueue = nodeObj->Get(propName); + Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); + v8::Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); if (!nodeToQueue->IsUndefined()) { workerArguments.push(nodeToQueue); } @@ -195,9 +195,9 @@ void GitClone::CloneWorker::HandleOKCallback() { if (!callbackFired) { v8::Local err = Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Clone.clone").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index a5bd9f8b1..0fea1bc0a 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -133,8 +133,8 @@ void GitCommit::ExtractSignatureWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Extract Signature has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Commit.extractSignature").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Commit.extractSignature").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 082cfe212..40ce79433 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -143,7 +143,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { ); for (uint32_t index = 0; index < propertyNames->Length(); ++index) { - v8::Local propertyName = Nan::To(propertyNames->Get(index)).ToLocalChecked(); + v8::Local propertyName = Nan::To(Nan::Get(propertyNames, index).ToLocalChecked()).ToLocalChecked(); Nan::Utf8String propertyNameAsUtf8Value(propertyName); const char *propertyNameAsCString = *propertyNameAsUtf8Value; @@ -153,7 +153,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { Nan::Set( owners, Nan::New(owners->Length()), - filterRegistry->Get(propertyName) + Nan::Get(filterRegistry, propertyName).ToLocalChecked() ); } } @@ -176,8 +176,8 @@ void GitFilterList::LoadWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterList.load").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); @@ -218,8 +218,8 @@ void GitFilterList::LoadWorker::HandleOKCallback() { for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { v8::Local propName = - Nan::To(properties->Get(propIndex)).ToLocalChecked(); - v8::Local nodeToQueue = nodeObj->Get(propName); + Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); + v8::Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); if (!nodeToQueue->IsUndefined()) { workerArguments.push(nodeToQueue); } @@ -229,9 +229,9 @@ void GitFilterList::LoadWorker::HandleOKCallback() { if (!callbackFired) { v8::Local err = Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterList.load").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index f35fb33a4..fca66a754 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -64,8 +64,8 @@ void GitFilterSource::RepoWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterSource.repo").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); @@ -75,9 +75,9 @@ void GitFilterSource::RepoWorker::HandleOKCallback() { } else if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterSource.repo").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); diff --git a/generate/templates/manual/include/str_array_converter.h b/generate/templates/manual/include/str_array_converter.h index 37f1bcc1d..26a82479d 100644 --- a/generate/templates/manual/include/str_array_converter.h +++ b/generate/templates/manual/include/str_array_converter.h @@ -14,8 +14,8 @@ class StrArrayConverter { static git_strarray *Convert (v8::Local val); private: - static git_strarray *ConvertArray(Array *val); - static git_strarray *ConvertString(v8::Local val); + static git_strarray *ConvertArray(v8::Local val); + static git_strarray *ConvertString(v8::Local val); static git_strarray *AllocStrArray(const size_t count); static git_strarray *ConstructStrArray(int argc, char** argv); }; diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index ef9322a43..b27b1b66e 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -101,8 +101,8 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method convenientFromDiff has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); Local argv[1] = { err }; @@ -119,8 +119,8 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("method convenientFromDiff has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 9fccf4af3..5afcb8840 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -86,8 +86,8 @@ void GitRemote::ReferenceListWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Reference List has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Remote.referenceList").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Remote.referenceList").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index 910352b52..aab66d035 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -119,8 +119,8 @@ void GitRepository::GetReferencesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository getReferences has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getReferences").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getReferences").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 457ea3ebe..cfb4e0b26 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -120,8 +120,8 @@ void GitRepository::GetRemotesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository refreshRemotes has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshRemotes").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshRemotes").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 0d73424b1..e97fa6184 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -101,8 +101,8 @@ void GitRepository::GetSubmodulesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository getSubmodules has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getSubmodules").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getSubmodules").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 8db164fb5..93d85c247 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -673,8 +673,8 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository refreshReferences has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshReferences").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshReferences").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index 1c7bed6fc..99f011475 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -111,8 +111,8 @@ void GitRevwalk::CommitWalkWorker::HandleOKCallback() { free((void *)baton->error); } else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Revwalk commitWalk has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.commitWalk").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.commitWalk").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index bf4f70710..191bc6b4f 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -94,8 +94,8 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() } else { err = Nan::To(Nan::Error("Method fastWalk has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); Local argv[1] = { err }; @@ -147,8 +147,8 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { - Local propName = Nan::To(properties->Get(propIndex)).ToLocalChecked(); - Local nodeToQueue = nodeObj->Get(propName); + Local propName = Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); + Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); if (!nodeToQueue->IsUndefined()) { workerArguments.push(nodeToQueue); @@ -159,8 +159,8 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() if (!callbackFired) { Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index a3d9764d6..e55d86e9f 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -448,8 +448,8 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() } else { err = Nan::To(Nan::Error("Method fileHistoryWalk has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -465,8 +465,8 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); v8::Local argv[1] = { err }; diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 59124ab41..4014b4abe 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -64,7 +64,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { baton->error_code = GIT_OK; baton->filter_priority = Nan::To(info[2]).FromJust(); - Nan::New(GitFilterRegistry::persistentHandle)->Set(Nan::To(info[0]).ToLocalChecked(), Nan::To(info[1]).ToLocalChecked()); + Nan::Set(Nan::New(GitFilterRegistry::persistentHandle), Nan::To(info[0]).ToLocalChecked(), Nan::To(info[1]).ToLocalChecked()); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); RegisterWorker *worker = new RegisterWorker(baton, callback); @@ -106,8 +106,8 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -118,8 +118,8 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { } else if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -192,8 +192,8 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -204,8 +204,8 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { } else if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method unregister has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); v8::Local argv[1] = { err }; diff --git a/generate/templates/manual/src/promise_completion.cc b/generate/templates/manual/src/promise_completion.cc index 1e503ac72..22203b41d 100644 --- a/generate/templates/manual/src/promise_completion.cc +++ b/generate/templates/manual/src/promise_completion.cc @@ -64,7 +64,7 @@ void PromiseCompletion::Setup(v8::Local thenFn, v8::Local val) { +git_strarray *StrArrayConverter::Convert(v8::Local val) { if (!Nan::To(val).FromJust()) { return NULL; } else if (val->IsArray()) { - return ConvertArray(Array::Cast(*val)); + return ConvertArray(v8::Local::Cast(val)); } else if (val->IsString() || val->IsStringObject()) { return ConvertString(Nan::To(val).ToLocalChecked()); @@ -33,18 +33,18 @@ git_strarray * StrArrayConverter::AllocStrArray(const size_t count) { return result; } -git_strarray *StrArrayConverter::ConvertArray(Array *val) { +git_strarray *StrArrayConverter::ConvertArray(v8::Local val) { git_strarray *result = AllocStrArray(val->Length()); for(size_t i = 0; i < result->count; i++) { - Nan::Utf8String entry(val->Get(i)); + Nan::Utf8String entry(Nan::Get(val, i).ToLocalChecked()); result->strings[i] = strdup(*entry); } return result; } -git_strarray* StrArrayConverter::ConvertString(Local val) { +git_strarray* StrArrayConverter::ConvertString(v8::Local val) { char *strings[1]; Nan::Utf8String utf8String(val); diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 8cd11d0f9..f5c4c8918 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -167,8 +167,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); } - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -219,8 +219,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { v8::Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { - v8::Local propName = Nan::To(properties->Get(propIndex)).ToLocalChecked(); - v8::Local nodeToQueue = nodeObj->Get(propName); + v8::Local propName = Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); + v8::Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); if (!nodeToQueue->IsUndefined()) { workerArguments.push(nodeToQueue); } @@ -229,8 +229,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { if (!callbackFired) { v8::Local err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); - err->Set(Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - err->Set(Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); v8::Local argv[1] = { err }; diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index a3ea193a5..7fc74a29b 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -47,13 +47,13 @@ memset((void *)(((char *)from_{{ name }}) + {{ name }}.length()), 0, 1); {%elsif cppClassName == 'Array'%} - Array *tmp_{{ name }} = Array::Cast(*info[{{ jsArg }}]); + v8::Local tmp_{{ name }} = v8::Local::Cast(info[{{ jsArg }}]); from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|replace '**' '*' }})); for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) { {%-- // FIXME: should recursively call convertFromv8. --%} - from_{{ name }}[i] = Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(Nan::To(tmp_{{ name }}->Get(Nan::New(static_cast(i)))).ToLocalChecked())->GetValue(); + from_{{ name }}[i] = Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(Nan::To(Nan::Get(tmp_{{ name }}, Nan::New(static_cast(i))).ToLocalChecked()).ToLocalChecked())->GetValue(); } {%elsif cppClassName == 'Function'%} {%elsif cppClassName == 'Buffer'%} diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index c1eddd328..a9d22ce6d 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -26,14 +26,11 @@ #if (NODE_MODULE_VERSION > 48) v8::Local GetPrivate(v8::Local object, v8::Local key) { - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::Local context = isolate->GetCurrentContext(); - v8::Local privateKey = v8::Private::ForApi(isolate, key); v8::Local value; - v8::Maybe result = object->HasPrivate(context, privateKey); + Nan::Maybe result = Nan::HasPrivate(object, key); if (!(result.IsJust() && result.FromJust())) return v8::Local(); - if (object->GetPrivate(context, privateKey).ToLocal(&value)) + if (Nan::GetPrivate(object, key).ToLocal(&value)) return value; return v8::Local(); } @@ -43,10 +40,7 @@ v8::Local value) { if (value.IsEmpty()) return; - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::Local context = isolate->GetCurrentContext(); - v8::Local privateKey = v8::Private::ForApi(isolate, key); - object->SetPrivate(context, privateKey, value); + Nan::SetPrivate(object, key, value); } #else v8::Local GetPrivate(v8::Local object, @@ -70,7 +64,7 @@ void LockMasterSetStatus(const FunctionCallbackInfo& info) { // convert the first argument to Status if(info.Length() >= 0 && info[0]->IsNumber()) { - v8::Local value = info[0]->ToInt32(v8::Isolate::GetCurrent()); + v8::Local value = Nan::To(info[0]).ToLocalChecked(); LockMaster::Status status = static_cast(value->Value()); if(status >= LockMaster::Disabled && status <= LockMaster::Enabled) { LockMaster::SetStatus(status); @@ -91,7 +85,7 @@ void LockMasterGetDiagnostics(const FunctionCallbackInfo& info) { // return a plain JS object with properties v8::Local result = Nan::New(); - result->Set(Nan::New("storedMutexesCount").ToLocalChecked(), Nan::New(diagnostics.storedMutexesCount)); + Nan::Set(result,Nan::New("storedMutexesCount").ToLocalChecked(), Nan::New(diagnostics.storedMutexesCount)); info.GetReturnValue().Set(result); } @@ -149,11 +143,11 @@ extern "C" void init(v8::Local target) { NODE_SET_METHOD(target, "getThreadSafetyDiagnostics", LockMasterGetDiagnostics); v8::Local threadSafety = Nan::New(); - threadSafety->Set(Nan::New("DISABLED").ToLocalChecked(), Nan::New((int)LockMaster::Disabled)); - threadSafety->Set(Nan::New("ENABLED_FOR_ASYNC_ONLY").ToLocalChecked(), Nan::New((int)LockMaster::EnabledForAsyncOnly)); - threadSafety->Set(Nan::New("ENABLED").ToLocalChecked(), Nan::New((int)LockMaster::Enabled)); + Nan::Set(threadSafety,Nan::New("DISABLED").ToLocalChecked(), Nan::New((int)LockMaster::Disabled)); + Nan::Set(threadSafety,Nan::New("ENABLED_FOR_ASYNC_ONLY").ToLocalChecked(), Nan::New((int)LockMaster::EnabledForAsyncOnly)); + Nan::Set(threadSafety,Nan::New("ENABLED").ToLocalChecked(), Nan::New((int)LockMaster::Enabled)); - target->Set(Nan::New("THREAD_SAFETY").ToLocalChecked(), threadSafety); + Nan::Set(target,Nan::New("THREAD_SAFETY").ToLocalChecked(), threadSafety); LockMaster::Initialize(); } From a0f0c608a2594e9c99dbd08e4dbd15b96b905e86 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Fri, 12 Jul 2019 11:54:10 +0100 Subject: [PATCH 137/545] :art: Minor spacing for parameters in Nan::Set --- generate/templates/manual/clone/clone.cc | 8 ++++---- .../templates/manual/commit/extract_signature.cc | 4 ++-- generate/templates/manual/filter_list/load.cc | 8 ++++---- generate/templates/manual/filter_source/repo.cc | 8 ++++---- .../manual/patches/convenient_patches.cc | 8 ++++---- generate/templates/manual/remote/ls.cc | 4 ++-- .../manual/repository/get_references.cc | 4 ++-- .../templates/manual/repository/get_remotes.cc | 4 ++-- .../manual/repository/get_submodules.cc | 4 ++-- .../manual/repository/refresh_references.cc | 4 ++-- generate/templates/manual/revwalk/commit_walk.cc | 4 ++-- generate/templates/manual/revwalk/fast_walk.cc | 8 ++++---- .../manual/revwalk/file_history_walk.cc | 8 ++++---- generate/templates/manual/src/filter_registry.cc | 16 ++++++++-------- generate/templates/partials/async_function.cc | 8 ++++---- generate/templates/templates/nodegit.cc | 10 +++++----- 16 files changed, 55 insertions(+), 55 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 6f5f79769..a7ac262dc 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -144,8 +144,8 @@ void GitClone::CloneWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Clone.clone").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); @@ -195,9 +195,9 @@ void GitClone::CloneWorker::HandleOKCallback() { if (!callbackFired) { v8::Local err = Nan::To(Nan::Error("Method clone has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Clone.clone").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index 0fea1bc0a..e96d0cc7f 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -133,8 +133,8 @@ void GitCommit::ExtractSignatureWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Extract Signature has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Commit.extractSignature").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Commit.extractSignature").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 40ce79433..fd02a44e6 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -176,8 +176,8 @@ void GitFilterList::LoadWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterList.load").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); @@ -229,9 +229,9 @@ void GitFilterList::LoadWorker::HandleOKCallback() { if (!callbackFired) { v8::Local err = Nan::To(Nan::Error("Method load has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterList.load").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index fca66a754..57c2a07f7 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -64,8 +64,8 @@ void GitFilterSource::RepoWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterSource.repo").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); @@ -75,9 +75,9 @@ void GitFilterSource::RepoWorker::HandleOKCallback() { } else if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method repo has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterSource.repo").ToLocalChecked()); v8::Local argv[1] = {err}; callback->Call(1, argv, async_resource); diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index b27b1b66e..c2403467a 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -101,8 +101,8 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method convenientFromDiff has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); Local argv[1] = { err }; @@ -119,8 +119,8 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("method convenientFromDiff has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Patch.convenientFromDiff").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 5afcb8840..8816e0150 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -86,8 +86,8 @@ void GitRemote::ReferenceListWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Reference List has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Remote.referenceList").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Remote.referenceList").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index aab66d035..8f03d60e1 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -119,8 +119,8 @@ void GitRepository::GetReferencesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository getReferences has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getReferences").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getReferences").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index cfb4e0b26..9cad189a2 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -120,8 +120,8 @@ void GitRepository::GetRemotesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository refreshRemotes has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshRemotes").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshRemotes").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index e97fa6184..71de6948c 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -101,8 +101,8 @@ void GitRepository::GetSubmodulesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository getSubmodules has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getSubmodules").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.getSubmodules").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 93d85c247..8d0fe36d6 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -673,8 +673,8 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Repository refreshReferences has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshReferences").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Repository.refreshReferences").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index 99f011475..91fe7f38c 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -111,8 +111,8 @@ void GitRevwalk::CommitWalkWorker::HandleOKCallback() { free((void *)baton->error); } else if (baton->error_code < 0) { Local err = Nan::To(Nan::Error("Revwalk commitWalk has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.commitWalk").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.commitWalk").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 191bc6b4f..002251852 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -94,8 +94,8 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() } else { err = Nan::To(Nan::Error("Method fastWalk has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); Local argv[1] = { err }; @@ -159,8 +159,8 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() if (!callbackFired) { Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fastWalk").ToLocalChecked()); Local argv[1] = { err }; diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index e55d86e9f..d8d2935df 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -448,8 +448,8 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() } else { err = Nan::To(Nan::Error("Method fileHistoryWalk has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -465,8 +465,8 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method next has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.fileHistoryWalk").ToLocalChecked()); v8::Local argv[1] = { err }; diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 4014b4abe..67e958d03 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -106,8 +106,8 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -118,8 +118,8 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { } else if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.register").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -192,8 +192,8 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method register has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -204,8 +204,8 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { } else if (baton->error_code < 0) { v8::Local err = Nan::To(Nan::Error("Method unregister has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("FilterRegistry.unregister").ToLocalChecked()); v8::Local argv[1] = { err }; diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index f5c4c8918..9a1ce26fe 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -167,8 +167,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { } else { err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); } - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); v8::Local argv[1] = { err }; @@ -229,8 +229,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { if (!callbackFired) { v8::Local err = Nan::To(Nan::Error("Method {{ jsFunctionName }} has thrown an error.")).ToLocalChecked(); - Nan::Set(err,Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); - Nan::Set(err,Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); v8::Local argv[1] = { err }; diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index a9d22ce6d..6a3fa8ef4 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -85,7 +85,7 @@ void LockMasterGetDiagnostics(const FunctionCallbackInfo& info) { // return a plain JS object with properties v8::Local result = Nan::New(); - Nan::Set(result,Nan::New("storedMutexesCount").ToLocalChecked(), Nan::New(diagnostics.storedMutexesCount)); + Nan::Set(result, Nan::New("storedMutexesCount").ToLocalChecked(), Nan::New(diagnostics.storedMutexesCount)); info.GetReturnValue().Set(result); } @@ -143,11 +143,11 @@ extern "C" void init(v8::Local target) { NODE_SET_METHOD(target, "getThreadSafetyDiagnostics", LockMasterGetDiagnostics); v8::Local threadSafety = Nan::New(); - Nan::Set(threadSafety,Nan::New("DISABLED").ToLocalChecked(), Nan::New((int)LockMaster::Disabled)); - Nan::Set(threadSafety,Nan::New("ENABLED_FOR_ASYNC_ONLY").ToLocalChecked(), Nan::New((int)LockMaster::EnabledForAsyncOnly)); - Nan::Set(threadSafety,Nan::New("ENABLED").ToLocalChecked(), Nan::New((int)LockMaster::Enabled)); + Nan::Set(threadSafety, Nan::New("DISABLED").ToLocalChecked(), Nan::New((int)LockMaster::Disabled)); + Nan::Set(threadSafety, Nan::New("ENABLED_FOR_ASYNC_ONLY").ToLocalChecked(), Nan::New((int)LockMaster::EnabledForAsyncOnly)); + Nan::Set(threadSafety, Nan::New("ENABLED").ToLocalChecked(), Nan::New((int)LockMaster::Enabled)); - Nan::Set(target,Nan::New("THREAD_SAFETY").ToLocalChecked(), threadSafety); + Nan::Set(target, Nan::New("THREAD_SAFETY").ToLocalChecked(), threadSafety); LockMaster::Initialize(); } From 04558820578180cae9ae9446569e70ac22eb97ee Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Fri, 12 Jul 2019 12:02:41 +0100 Subject: [PATCH 138/545] :recycle: Missed one Callback->Call without async_resource --- generate/templates/manual/patches/convenient_patches.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index c2403467a..542623f7e 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -129,5 +129,5 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { return; } - callback->Call(0, NULL); + Nan::Call(callback, 0, NULL); } From e82db052c4ed9f23ba0117cea08e0eed513f1b23 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Fri, 12 Jul 2019 12:12:21 +0100 Subject: [PATCH 139/545] :bug: Needs the reference to callback, not the pointer --- generate/templates/manual/patches/convenient_patches.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index 542623f7e..795dca506 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -129,5 +129,5 @@ void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { return; } - Nan::Call(callback, 0, NULL); + Nan::Call(*callback, 0, NULL); } From d89446c2d6c7767a6a827cd0d92c5246787eafa3 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 12 Jul 2019 14:30:57 -0700 Subject: [PATCH 140/545] Remove NSEC It seems that since we've been building without NSEC, if you operate on a repository that had been cloned without NSEC, using NSEC to perform working directory diffs can be incredibly slow. To mitigate massive slow downs, we'll turn this off for now. It can still be enabled and recompiled on a fork of NodeGit fairly easily. --- vendor/libgit2.gyp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index e15ffc247..3f714cdd1 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -21,7 +21,11 @@ "GIT_SSH_MEMORY_CREDENTIALS", "LIBGIT2_NO_FEATURES_H", "GIT_SHA1_COLLISIONDETECT", - "GIT_USE_NSEC", + # "GIT_USE_NSEC", We've been shipping without NSEC for awhile + # Turning NSEC on should be left up to application maintainer + # There may be negative performance impacts using nodegit with + # NSEC turned on in a repository that was cloned with nodegit + # with NSEC turned off "GIT_HTTPS", # Node's util.h may be accidentally included so use this to guard # against compilation error. From 3155eaf60402ba5041bdd795742fed0f27aee793 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 15 Jul 2019 08:45:15 -0700 Subject: [PATCH 141/545] Bump to v0.25.0-alpha.15 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85c7163e7..5074972b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.25.0-alpha.15 [(2019-07-15)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.15) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.14...v0.25.0-alpha.15) + +#### Summary of changes +- Removed NSEC optimization due to performance regressions in repositories that did not use NSEC optimization cloned via NodeGit. + +#### Merged PRs into NodeGit +- [Remove NSEC #1699](https://github.com/nodegit/nodegit/pull/1699) + + ## v0.25.0-alpha.14 [(2019-07-01)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.14) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.13...v0.25.0-alpha.14) diff --git a/package-lock.json b/package-lock.json index 04529b8d2..9bb1cc6ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.14", + "version": "0.25.0-alpha.15", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a2ab166b5..fa51fb6ba 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.14", + "version": "0.25.0-alpha.15", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 134ad1a398684163fd22703216f8062538235f09 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 17 Jul 2019 12:29:05 -0700 Subject: [PATCH 142/545] Audit lodash and fix package-lock.json --- package-lock.json | 125 +++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 46 insertions(+), 81 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bb1cc6ea..943e5f4a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1394,6 +1394,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -3337,9 +3338,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" }, "log-driver": { "version": "1.2.7", @@ -3442,18 +3443,10 @@ } } }, - "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "requires": { - "minipass": "^2.2.1" - } - }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3547,12 +3540,13 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", @@ -3598,15 +3592,28 @@ } }, "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "requires": { - "debug": "^2.1.2", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" }, "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -3639,9 +3646,9 @@ } }, "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", + "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", @@ -3663,25 +3670,6 @@ "abbrev": "1", "osenv": "^0.1.4" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "tar": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", - "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } } } }, @@ -3720,14 +3708,14 @@ } }, "npm-bundled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" }, "npm-packlist": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", - "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", + "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" @@ -4788,9 +4776,9 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -5351,38 +5339,15 @@ "dev": true }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-stream": { diff --git a/package.json b/package.json index 215a0ca51..bc8815c6a 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "dependencies": { "fs-extra": "^7.0.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "nan": "^2.14.0", "node-gyp": "^4.0.0", "node-pre-gyp": "^0.13.0", From ac30e06996401c6335614709b31f0fbc476fb9bd Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 23 Jul 2019 07:58:12 -0700 Subject: [PATCH 143/545] Skip these tests on node 8 due to strange instability These code paths usually work, but are randomly failing in Node 8 environments since we updated to NaN 2.14.0. We're going to skip these tests on Node 8, because the diagnosis is very tricky. For the 3 rebase tests, as far as I can tell, they: 1. Get to rebase.commit 2. The signingCb gets called and completed 3. Freeze 4. The tests timeout 5. rebase.commit finishes executing and the rest of the promise chain completes. Increasing the timeout did not help, and exhibited the same behavior, strangely enough. --- test/tests/rebase.js | 740 ++++++++++++++++++++++--------------------- test/tests/remote.js | 204 ++++++------ 2 files changed, 478 insertions(+), 466 deletions(-) diff --git a/test/tests/rebase.js b/test/tests/rebase.js index a801e991a..87749f539 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -5,6 +5,8 @@ var fse = require("fs-extra"); var garbageCollect = require("../utils/garbage_collect.js"); +const isNode8 = process.versions.node.split(".")[0] === "8"; + describe("Rebase", function() { var NodeGit = require("../../"); var Checkout = NodeGit.Checkout; @@ -1537,27 +1539,28 @@ describe("Rebase", function() { }); }); - it("can sign commits during the rebase", function() { - var baseFileName = "baseNewFile.txt"; - var ourFileName = "ourNewFile.txt"; - var theirFileName = "theirNewFile.txt"; + if (!isNode8) { + it("can sign commits during the rebase", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; - var baseFileContent = "How do you feel about Toll Roads?"; - var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; - var theirFileContent = "I'm skeptical about Toll Roads"; + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; - var ourSignature = NodeGit.Signature.create - ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); - var theirSignature = NodeGit.Signature.create - ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); - var repository = this.repository; - var ourCommit; - var ourBranch; - var theirBranch; - var rebase; + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; - return fse.writeFile(path.join(repository.workdir(), baseFileName), + return fse.writeFile(path.join(repository.workdir(), baseFileName), baseFileContent) // Load up the repository index and make our initial commit to HEAD .then(function() { @@ -1565,43 +1568,43 @@ describe("Rebase", function() { }) .then(function(oid) { assert.equal(oid.toString(), - "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); return repository.createCommit("HEAD", ourSignature, - ourSignature, "initial commit", oid, []); + ourSignature, "initial commit", oid, []); }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); return repository.getCommit(commitOid).then(function(commit) { ourCommit = commit; }).then(function() { return repository.createBranch(ourBranchName, commitOid) - .then(function(branch) { - ourBranch = branch; - return repository.createBranch(theirBranchName, commitOid); - }); + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); }); }) .then(function(branch) { theirBranch = branch; return fse.writeFile(path.join(repository.workdir(), theirFileName), - theirFileContent); + theirFileContent); }) .then(function() { return RepoUtils.addFileToIndex(repository, theirFileName); }) .then(function(oid) { assert.equal(oid.toString(), - "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); return repository.createCommit(theirBranch.name(), theirSignature, - theirSignature, "they made a commit", oid, [ourCommit]); + theirSignature, "they made a commit", oid, [ourCommit]); }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); return removeFileFromIndex(repository, theirFileName); }) @@ -1610,21 +1613,21 @@ describe("Rebase", function() { }) .then(function() { return fse.writeFile(path.join(repository.workdir(), ourFileName), - ourFileContent); + ourFileContent); }) .then(function() { return RepoUtils.addFileToIndex(repository, ourFileName); }) .then(function(oid) { assert.equal(oid.toString(), - "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); - return repository.createCommit(ourBranch.name(), ourSignature, - ourSignature, "we made a commit", oid, [ourCommit]); + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); return removeFileFromIndex(repository, ourFileName); }) @@ -1655,9 +1658,9 @@ describe("Rebase", function() { var theirAnnotatedCommit = annotatedCommits[1]; assert.equal(ourAnnotatedCommit.id().toString(), - "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); assert.equal(theirAnnotatedCommit.id().toString(), - "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); return NodeGit.Rebase.init(repository, ourAnnotatedCommit, theirAnnotatedCommit, null, { @@ -1667,415 +1670,416 @@ describe("Rebase", function() { signedData: "A moose was here." }) }); - }) - .then(function(newRebase) { - rebase = newRebase; + }) + .then(function(newRebase) { + rebase = newRebase; - // there should only be 1 rebase operation to perform - assert.equal(rebase.operationEntrycount(), 1); + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); - return rebase.next(); - }) - .then(function(rebaseOperation) { - assert.equal(rebaseOperation.type(), + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), NodeGit.RebaseOperation.REBASE_OPERATION.PICK); - assert.equal(rebaseOperation.id().toString(), + assert.equal(rebaseOperation.id().toString(), "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - // Make sure we don't crash calling the signature CB - // after collecting garbage. - garbageCollect(); + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); - return rebase.commit(null, ourSignature); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed"); - // git_rebase_operation_current returns the index of the rebase - // operation that was last applied, so after the first operation, it - // should be 0. - assert.equal(rebase.operationCurrent(), 0); + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); - return rebase.finish(ourSignature, {}); - }) - .then(function(result) { - assert.equal(result, 0); + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); - return repository.getBranchCommit(ourBranchName); - }) - .then(function(commit) { - // verify that the "ours" branch has moved to the correct place - assert.equal(commit.id().toString(), + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed"); - return Promise.all([ - commit.parent(0), - NodeGit.Commit.extractSignature( - repository, - "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed", - "moose-sig" - ) - ]); - }) - .then(function([parent, { signature }]) { - // verify that we are on top of "their commit" - assert.equal(parent.id().toString(), + return Promise.all([ + commit.parent(0), + NodeGit.Commit.extractSignature( + repository, + "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed", + "moose-sig" + ) + ]); + }) + .then(function([parent, { signature }]) { + // verify that we are on top of "their commit" + assert.equal(parent.id().toString(), "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); - assert.equal(signature, "A moose was here."); + assert.equal(signature, "A moose was here."); + }); }); - }); - it("can optionally skip signing commits", function() { - var baseFileName = "baseNewFile.txt"; - var ourFileName = "ourNewFile.txt"; - var theirFileName = "theirNewFile.txt"; + it("can optionally skip signing commits", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; - var baseFileContent = "How do you feel about Toll Roads?"; - var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; - var theirFileContent = "I'm skeptical about Toll Roads"; + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; - var ourSignature = NodeGit.Signature.create - ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); - var theirSignature = NodeGit.Signature.create - ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); - var repository = this.repository; - var ourCommit; - var ourBranch; - var theirBranch; - var rebase; + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; - return fse.writeFile(path.join(repository.workdir(), baseFileName), - baseFileContent) - // Load up the repository index and make our initial commit to HEAD - .then(function() { - return RepoUtils.addFileToIndex(repository, baseFileName); - }) - .then(function(oid) { - assert.equal(oid.toString(), + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), "b5cdc109d437c4541a13fb7509116b5f03d5039a"); - return repository.createCommit("HEAD", ourSignature, + return repository.createCommit("HEAD", ourSignature, ourSignature, "initial commit", oid, []); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), "be03abdf0353d05924c53bebeb0e5bb129cda44a"); - return repository.getCommit(commitOid).then(function(commit) { - ourCommit = commit; - }).then(function() { - return repository.createBranch(ourBranchName, commitOid) + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) .then(function(branch) { ourBranch = branch; return repository.createBranch(theirBranchName, commitOid); }); - }); - }) - .then(function(branch) { - theirBranch = branch; - return fse.writeFile(path.join(repository.workdir(), theirFileName), + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), theirFileContent); - }) - .then(function() { - return RepoUtils.addFileToIndex(repository, theirFileName); - }) - .then(function(oid) { - assert.equal(oid.toString(), + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); - return repository.createCommit(theirBranch.name(), theirSignature, + return repository.createCommit(theirBranch.name(), theirSignature, theirSignature, "they made a commit", oid, [ourCommit]); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); - return removeFileFromIndex(repository, theirFileName); - }) - .then(function() { - return fse.remove(path.join(repository.workdir(), theirFileName)); - }) - .then(function() { - return fse.writeFile(path.join(repository.workdir(), ourFileName), + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), ourFileContent); - }) - .then(function() { - return RepoUtils.addFileToIndex(repository, ourFileName); - }) - .then(function(oid) { - assert.equal(oid.toString(), + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); return repository.createCommit(ourBranch.name(), ourSignature, - ourSignature, "we made a commit", oid, [ourCommit]); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - return removeFileFromIndex(repository, ourFileName); - }) - .then(function() { - return fse.remove(path.join(repository.workdir(), ourFileName)); - }) - .then(function() { - return repository.checkoutBranch(ourBranchName); - }) - .then(function() { - return Promise.all([ - repository.getReference(ourBranchName), - repository.getReference(theirBranchName) - ]); - }) - .then(function(refs) { - assert.equal(refs.length, 2); + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); - return Promise.all([ - NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), - NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) - ]); - }) - .then(function(annotatedCommits) { - assert.equal(annotatedCommits.length, 2); + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); - var ourAnnotatedCommit = annotatedCommits[0]; - var theirAnnotatedCommit = annotatedCommits[1]; + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; - assert.equal(ourAnnotatedCommit.id().toString(), + assert.equal(ourAnnotatedCommit.id().toString(), "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - assert.equal(theirAnnotatedCommit.id().toString(), + assert.equal(theirAnnotatedCommit.id().toString(), "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); - return NodeGit.Rebase.init(repository, ourAnnotatedCommit, - theirAnnotatedCommit, null, { - signingCb: () => ({ - code: NodeGit.Error.CODE.PASSTHROUGH - }) - }); - }) - .then(function(newRebase) { - rebase = newRebase; + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: () => ({ + code: NodeGit.Error.CODE.PASSTHROUGH + }) + }); + }) + .then(function(newRebase) { + rebase = newRebase; - // there should only be 1 rebase operation to perform - assert.equal(rebase.operationEntrycount(), 1); + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); - return rebase.next(); - }) - .then(function(rebaseOperation) { - assert.equal(rebaseOperation.type(), - NodeGit.RebaseOperation.REBASE_OPERATION.PICK); - assert.equal(rebaseOperation.id().toString(), - "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - // Make sure we don't crash calling the signature CB - // after collecting garbage. - garbageCollect(); + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); - return rebase.commit(null, ourSignature); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), - "b937100ee0ea17ef20525306763505a7fe2be29e"); + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); - // git_rebase_operation_current returns the index of the rebase - // operation that was last applied, so after the first operation, it - // should be 0. - assert.equal(rebase.operationCurrent(), 0); + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); - return rebase.finish(ourSignature, {}); - }) - .then(function(result) { - assert.equal(result, 0); + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); - return repository.getBranchCommit(ourBranchName); - }) - .then(function(commit) { - // verify that the "ours" branch has moved to the correct place - assert.equal(commit.id().toString(), - "b937100ee0ea17ef20525306763505a7fe2be29e"); + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has moved to the correct place + assert.equal(commit.id().toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); - return commit.parent(0); - }) - .then(function(parent) { - // verify that we are on top of "their commit" - assert.equal(parent.id().toString(), - "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); - return NodeGit.Commit.extractSignature( - repository, - "b937100ee0ea17ef20525306763505a7fe2be29e", - "moose-sig" - ) - .then(function() { - assert.fail("This commit should not be signed."); - }, function (error) { - if (error && error.message === "this commit is not signed") { - return; - } - throw error; + return commit.parent(0); + }) + .then(function(parent) { + // verify that we are on top of "their commit" + assert.equal(parent.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + return NodeGit.Commit.extractSignature( + repository, + "b937100ee0ea17ef20525306763505a7fe2be29e", + "moose-sig" + ) + .then(function() { + assert.fail("This commit should not be signed."); + }, function (error) { + if (error && error.message === "this commit is not signed") { + return; + } + throw error; + }); }); - }); - }); + }); - it("will throw if commit signing cb returns an error code", function() { - var baseFileName = "baseNewFile.txt"; - var ourFileName = "ourNewFile.txt"; - var theirFileName = "theirNewFile.txt"; + it("will throw if commit signing cb returns an error code", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; - var baseFileContent = "How do you feel about Toll Roads?"; - var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; - var theirFileContent = "I'm skeptical about Toll Roads"; + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; - var ourSignature = NodeGit.Signature.create + var ourSignature = NodeGit.Signature.create ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); - var theirSignature = NodeGit.Signature.create + var theirSignature = NodeGit.Signature.create ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); - var repository = this.repository; - var ourCommit; - var ourBranch; - var theirBranch; - var rebase; + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; - return fse.writeFile(path.join(repository.workdir(), baseFileName), - baseFileContent) - // Load up the repository index and make our initial commit to HEAD - .then(function() { - return RepoUtils.addFileToIndex(repository, baseFileName); - }) - .then(function(oid) { - assert.equal(oid.toString(), - "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); - return repository.createCommit("HEAD", ourSignature, - ourSignature, "initial commit", oid, []); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), - "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); - return repository.getCommit(commitOid).then(function(commit) { - ourCommit = commit; - }).then(function() { - return repository.createBranch(ourBranchName, commitOid) - .then(function(branch) { - ourBranch = branch; - return repository.createBranch(theirBranchName, commitOid); + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); }); - }); - }) - .then(function(branch) { - theirBranch = branch; - return fse.writeFile(path.join(repository.workdir(), theirFileName), - theirFileContent); - }) - .then(function() { - return RepoUtils.addFileToIndex(repository, theirFileName); - }) - .then(function(oid) { - assert.equal(oid.toString(), - "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); - return repository.createCommit(theirBranch.name(), theirSignature, - theirSignature, "they made a commit", oid, [ourCommit]); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), - "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); - return removeFileFromIndex(repository, theirFileName); - }) - .then(function() { - return fse.remove(path.join(repository.workdir(), theirFileName)); - }) - .then(function() { - return fse.writeFile(path.join(repository.workdir(), ourFileName), - ourFileContent); - }) - .then(function() { - return RepoUtils.addFileToIndex(repository, ourFileName); - }) - .then(function(oid) { - assert.equal(oid.toString(), - "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); - return repository.createCommit(ourBranch.name(), ourSignature, + return repository.createCommit(ourBranch.name(), ourSignature, ourSignature, "we made a commit", oid, [ourCommit]); - }) - .then(function(commitOid) { - assert.equal(commitOid.toString(), - "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - - return removeFileFromIndex(repository, ourFileName); - }) - .then(function() { - return fse.remove(path.join(repository.workdir(), ourFileName)); - }) - .then(function() { - return repository.checkoutBranch(ourBranchName); - }) - .then(function() { - return Promise.all([ - repository.getReference(ourBranchName), - repository.getReference(theirBranchName) - ]); - }) - .then(function(refs) { - assert.equal(refs.length, 2); - - return Promise.all([ - NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), - NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) - ]); - }) - .then(function(annotatedCommits) { - assert.equal(annotatedCommits.length, 2); - - var ourAnnotatedCommit = annotatedCommits[0]; - var theirAnnotatedCommit = annotatedCommits[1]; + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - assert.equal(ourAnnotatedCommit.id().toString(), - "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - assert.equal(theirAnnotatedCommit.id().toString(), - "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); - return NodeGit.Rebase.init(repository, ourAnnotatedCommit, - theirAnnotatedCommit, null, { - signingCb: () => ({ - code: NodeGit.Error.CODE.ERROR + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, null, { + signingCb: () => ({ + code: NodeGit.Error.CODE.ERROR + }) + }); }) - }); - }) - .then(function(newRebase) { - rebase = newRebase; + .then(function(newRebase) { + rebase = newRebase; - // there should only be 1 rebase operation to perform - assert.equal(rebase.operationEntrycount(), 1); + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); - return rebase.next(); - }) - .then(function(rebaseOperation) { - assert.equal(rebaseOperation.type(), - NodeGit.RebaseOperation.REBASE_OPERATION.PICK); - assert.equal(rebaseOperation.id().toString(), - "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); - // Make sure we don't crash calling the signature CB - // after collecting garbage. - garbageCollect(); + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); - return rebase.commit(null, ourSignature); - }) - .then(function() { - assert.fail("rebase.commit should have failed"); - }, function(error) { - if (error && error.errno === NodeGit.Error.CODE.ERROR) { - return; - } - throw error; - }); - }); + return rebase.commit(null, ourSignature); + }) + .then(function() { + assert.fail("rebase.commit should have failed"); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); + } it("will not throw on patch already applied errors", function() { var baseFileName = "baseNewFile.txt"; diff --git a/test/tests/remote.js b/test/tests/remote.js index 0aa502619..e5d4eed1f 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -7,6 +7,8 @@ var fp = require("lodash/fp"); var garbageCollect = require("../utils/garbage_collect.js"); var RepoUtils = require("../utils/repository_setup"); +const isNode8 = process.versions.node.split(".")[0] === "8"; + describe("Remote", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; @@ -317,10 +319,11 @@ describe("Remote", function() { }); }); - it("will reject if credentials promise rejects", function() { - var repo = this.repository; - var branch = "should-not-exist"; - return Remote.lookup(repo, "origin") + if (!isNode8) { + it("will reject if credentials promise rejects", function() { + var repo = this.repository; + var branch = "should-not-exist"; + return Remote.lookup(repo, "origin") .then(function(remote) { var ref = "refs/heads/" + branch; var refs = [ref + ":" + ref]; @@ -328,12 +331,12 @@ describe("Remote", function() { callbacks: { credentials: function(url, userName) { var test = Promise.resolve("test") - .then(function() { return; }) - .then(function() { return; }) - .then(function() { return; }) - .then(function() { - return Promise.reject(new Error("failure case")); - }); + .then(function() { return; }) + .then(function() { return; }) + .then(function() { return; }) + .then(function() { + return Promise.reject(new Error("failure case")); + }); return test; }, certificateCheck: () => 0 @@ -344,101 +347,106 @@ describe("Remote", function() { .then(function() { return Promise.reject( new Error("should not be able to push to the repository")); - }, function(err) { - if (err.message === "failure case") - { - return Promise.resolve(); - } else { - throw err; - } - }) - .then(function() { - return Remote.lookup(repo, "origin"); - }) - .then(function(remote) { - var ref = "refs/heads/" + branch; - var refs = [ref + ":" + ref]; - var options = { - callbacks: { - credentials: function(url, userName) { - var test = Promise.resolve() + }, function(err) { + if (err.message === "failure case") + { + return Promise.resolve(); + } else { + throw err; + } + }) + .then(function() { + return Remote.lookup(repo, "origin"); + }) + .then(function(remote) { + var ref = "refs/heads/" + branch; + var refs = [ref + ":" + ref]; + var options = { + callbacks: { + credentials: function(url, userName) { + var test = Promise.resolve() .then(Promise.resolve.bind(Promise)) .then(Promise.resolve.bind(Promise)) .then(Promise.resolve.bind(Promise)) .then(Promise.reject.bind(Promise)); - return test; - }, - certificateCheck: () => 0 - } - }; - return remote.push(refs, options); - }) - .then(function() { - return Promise.reject( - new Error("should not be able to push to the repository")); - }, function(err) { - if (err.message === "Method push has thrown an error.") - { - return Promise.resolve(); - } else { - throw err; - } - }); - }); + return test; + }, + certificateCheck: () => 0 + } + }; + return remote.push(refs, options); + }) + .then(function() { + return Promise.reject( + new Error("should not be able to push to the repository")); + }, function(err) { + if (err.message === "Method push has thrown an error.") + { + return Promise.resolve(); + } else { + throw err; + } + }); + }); - it("cannot push to a repository with invalid credentials", function() { - var repo = this.repository; - var branch = "should-not-exist"; - return Remote.lookup(repo, "origin") - .then(function(remote) { - var ref = "refs/heads/" + branch; - var refs = [ref + ":" + ref]; - var firstPass = true; - var options = { - callbacks: { - credentials: function(url, userName) { - if (firstPass) { - firstPass = false; - if (url.indexOf("https") === -1) { - return NodeGit.Cred.sshKeyFromAgent(userName); - } else { - return NodeGit.Cred.userpassPlaintextNew(userName, ""); - } + it("cannot push to a repository with invalid credentials", function() { + var repo = this.repository; + var branch = "should-not-exist"; + return Remote.lookup(repo, "origin") + .then(function(remote) { + var ref = "refs/heads/" + branch; + var refs = [ref + ":" + ref]; + var firstPass = true; + var options = { + callbacks: { + credentials: function(url, userName) { + if (firstPass) { + firstPass = false; + if (url.indexOf("https") === -1) { + return NodeGit.Cred.sshKeyFromAgent(userName); + } else { + return NodeGit.Cred.userpassPlaintextNew(userName, ""); + } + } else { + return Promise.reject(); + } + }, + certificateCheck: () => 0 + } + }; + return remote.push(refs, options); + }) + // takes care of windows bug, see the .catch for the proper pathway + // that this flow should take (cred cb doesn't run twice -> + // throws error) + .then(function() { + return Promise.reject( + new Error("should not be able to push to the repository")); + }, function(err) { + if (err.message.indexOf(401) === -1) { + throw err; } else { - return Promise.reject(); + return Promise.resolve(); } - }, - certificateCheck: () => 0 - } - }; - return remote.push(refs, options); - }) - // takes care of windows bug, see the .catch for the proper pathway - // that this flow should take (cred cb doesn't run twice -> throws error) - .then(function() { - return Promise.reject( - new Error("should not be able to push to the repository")); - }, function(err) { - if (err.message.indexOf(401) === -1) { - throw err; - } else { - return Promise.resolve(); - } - }) - // catches linux / osx failure to use anonymous credentials - // stops callback infinite loop - .catch(function (reason) { - const messageWithoutNewlines = reason.message.replace(/\n|\r/g, ""); - const validErrors = [ - "Method push has thrown an error.", - "failed to set credentials: The parameter is incorrect." - ]; - assert.ok( - _.includes(validErrors, messageWithoutNewlines), - "Unexpected error: " + reason.message - ); - }); - }); + }) + // catches linux / osx failure to use anonymous credentials + // stops callback infinite loop + .catch(function (reason) { + const messageWithoutNewlines = reason.message.replace( + /\n|\r/g, + "" + ); + const validErrors = [ + "Method push has thrown an error.", + "failed to set credentials: The parameter is incorrect." + ]; + assert.ok( + _.includes(validErrors, messageWithoutNewlines), + "Unexpected error: " + reason.message + ); + }); + }); + } it("is kept alive by refspec", function() { var repo = this.repository; From 1afb333157891a8a22322e8065f3c27e2d692c53 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 22 Jul 2019 10:28:05 -0700 Subject: [PATCH 144/545] Bump libgit2 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 0cfb5596a..6abd07fcc 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 0cfb5596ac1d0a0a88c3a449f885ee84ec4a8fb3 +Subproject commit 6abd07fccde53babc0835dcdd05607313aa72bec From a5680b68ced14fbd6aa58be1c907e011865fac29 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 22 Jul 2019 10:41:23 -0700 Subject: [PATCH 145/545] Update libgit2 docs / gyp for compilation --- generate/input/libgit2-docs.json | 758 ++++++++++++++++--------------- vendor/libgit2.gyp | 16 +- 2 files changed, 394 insertions(+), 380 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 7717a3886..6f40724ce 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -23,7 +23,7 @@ "git_apply" ], "meta": {}, - "lines": 128 + "lines": 133 }, { "file": "git2/attr.h", @@ -108,7 +108,7 @@ "git_buf_contains_nul" ], "meta": {}, - "lines": 122 + "lines": 128 }, { "file": "git2/checkout.h", @@ -122,7 +122,7 @@ "git_checkout_tree" ], "meta": {}, - "lines": 375 + "lines": 394 }, { "file": "git2/cherrypick.h", @@ -266,7 +266,7 @@ "git_blame_init_options" ], "meta": {}, - "lines": 423 + "lines": 437 }, { "file": "git2/describe.h", @@ -879,7 +879,7 @@ "git_remote_default_branch" ], "meta": {}, - "lines": 948 + "lines": 949 }, { "file": "git2/repository.h", @@ -932,7 +932,7 @@ "git_repository_set_ident" ], "meta": {}, - "lines": 898 + "lines": 899 }, { "file": "git2/reset.h", @@ -1032,7 +1032,7 @@ "git_status_should_ignore" ], "meta": {}, - "lines": 374 + "lines": 383 }, { "file": "git2/strarray.h", @@ -1189,7 +1189,7 @@ "git_cred_acquire_cb" ], "meta": {}, - "lines": 367 + "lines": 381 }, { "file": "git2/tree.h", @@ -1493,8 +1493,8 @@ "git_apply_to_tree": { "type": "function", "file": "git2/apply.h", - "line": 87, - "lineto": 92, + "line": 92, + "lineto": 97, "args": [ { "name": "out", @@ -1535,8 +1535,8 @@ "git_apply": { "type": "function", "file": "git2/apply.h", - "line": 124, - "lineto": 128, + "line": 129, + "lineto": 133, "args": [ { "name": "repo", @@ -2949,8 +2949,8 @@ "git_buf_dispose": { "type": "function", "file": "git2/buffer.h", - "line": 72, - "lineto": 72, + "line": 78, + "lineto": 78, "args": [ { "name": "buffer", @@ -2979,8 +2979,8 @@ "git_buf_grow": { "type": "function", "file": "git2/buffer.h", - "line": 95, - "lineto": 95, + "line": 101, + "lineto": 101, "args": [ { "name": "buffer", @@ -3006,8 +3006,8 @@ "git_buf_set": { "type": "function", "file": "git2/buffer.h", - "line": 105, - "lineto": 106, + "line": 111, + "lineto": 112, "args": [ { "name": "buffer", @@ -3038,8 +3038,8 @@ "git_buf_is_binary": { "type": "function", "file": "git2/buffer.h", - "line": 114, - "lineto": 114, + "line": 120, + "lineto": 120, "args": [ { "name": "buf", @@ -3060,8 +3060,8 @@ "git_buf_contains_nul": { "type": "function", "file": "git2/buffer.h", - "line": 122, - "lineto": 122, + "line": 128, + "lineto": 128, "args": [ { "name": "buf", @@ -3082,8 +3082,8 @@ "git_checkout_options_init": { "type": "function", "file": "git2/checkout.h", - "line": 322, - "lineto": 324, + "line": 341, + "lineto": 343, "args": [ { "name": "opts", @@ -3109,8 +3109,8 @@ "git_checkout_head": { "type": "function", "file": "git2/checkout.h", - "line": 343, - "lineto": 345, + "line": 362, + "lineto": 364, "args": [ { "name": "repo", @@ -3136,8 +3136,8 @@ "git_checkout_index": { "type": "function", "file": "git2/checkout.h", - "line": 356, - "lineto": 359, + "line": 375, + "lineto": 378, "args": [ { "name": "repo", @@ -3168,8 +3168,8 @@ "git_checkout_tree": { "type": "function", "file": "git2/checkout.h", - "line": 372, - "lineto": 375, + "line": 391, + "lineto": 394, "args": [ { "name": "repo", @@ -5651,8 +5651,8 @@ }, { "name": "maps", - "type": "const git_cvar_map *", - "comment": "array of `git_cvar_map` objects specifying the possible mappings" + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" }, { "name": "map_n", @@ -5660,14 +5660,14 @@ "comment": "number of mapping objects in `maps`" } ], - "argline": "int *out, const git_config *cfg, const char *name, const git_cvar_map *maps, size_t map_n", - "sig": "int *::const git_config *::const char *::const git_cvar_map *::size_t", + "argline": "int *out, const git_config *cfg, const char *name, const git_configmap *maps, size_t map_n", + "sig": "int *::const git_config *::const char *::const git_configmap *::size_t", "return": { "type": "int", "comment": " 0 on success, error code otherwise" }, "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", - "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_cvar_map autocrlf_mapping[] = {     {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", + "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_configmap autocrlf_mapping[] = {        {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", "group": "config" }, "git_config_lookup_map_value": { @@ -5683,8 +5683,8 @@ }, { "name": "maps", - "type": "const git_cvar_map *", - "comment": "array of `git_cvar_map` objects specifying the possible mappings" + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" }, { "name": "map_n", @@ -5697,8 +5697,8 @@ "comment": "value to parse" } ], - "argline": "int *out, const git_cvar_map *maps, size_t map_n, const char *value", - "sig": "int *::const git_cvar_map *::size_t::const char *", + "argline": "int *out, const git_configmap *maps, size_t map_n, const char *value", + "sig": "int *::const git_configmap *::size_t::const char *", "return": { "type": "int", "comment": null @@ -5924,8 +5924,8 @@ "git_blob_create_fromworkdir": { "type": "function", "file": "git2/deprecated.h", - "line": 80, - "lineto": 80, + "line": 81, + "lineto": 81, "args": [ { "name": "id", @@ -5956,8 +5956,8 @@ "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 115, - "lineto": 115, + "line": 116, + "lineto": 116, "args": [ { "name": "buffer", @@ -5978,8 +5978,8 @@ "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 176, - "lineto": 176, + "line": 190, + "lineto": 190, "args": [], "argline": "", "sig": "", @@ -5994,8 +5994,8 @@ "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 188, - "lineto": 188, + "line": 202, + "lineto": 202, "args": [], "argline": "", "sig": "", @@ -6010,8 +6010,8 @@ "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 200, - "lineto": 200, + "line": 214, + "lineto": 214, "args": [ { "name": "error_class", @@ -6037,8 +6037,8 @@ "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 212, - "lineto": 212, + "line": 226, + "lineto": 226, "args": [], "argline": "", "sig": "", @@ -6053,8 +6053,8 @@ "git_oid_iszero": { "type": "function", "file": "git2/deprecated.h", - "line": 364, - "lineto": 364, + "line": 378, + "lineto": 378, "args": [ { "name": "id", @@ -6075,8 +6075,8 @@ "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 423, - "lineto": 423, + "line": 437, + "lineto": 437, "args": [ { "name": "opts", @@ -17837,8 +17837,8 @@ "git_remote_init_callbacks": { "type": "function", "file": "git2/remote.h", - "line": 598, - "lineto": 600, + "line": 599, + "lineto": 601, "args": [ { "name": "opts", @@ -17864,8 +17864,8 @@ "git_fetch_options_init": { "type": "function", "file": "git2/remote.h", - "line": 704, - "lineto": 706, + "line": 705, + "lineto": 707, "args": [ { "name": "opts", @@ -17891,8 +17891,8 @@ "git_push_options_init": { "type": "function", "file": "git2/remote.h", - "line": 754, - "lineto": 756, + "line": 755, + "lineto": 757, "args": [ { "name": "opts", @@ -17918,8 +17918,8 @@ "git_remote_download": { "type": "function", "file": "git2/remote.h", - "line": 774, - "lineto": 774, + "line": 775, + "lineto": 775, "args": [ { "name": "remote", @@ -17950,8 +17950,8 @@ "git_remote_upload": { "type": "function", "file": "git2/remote.h", - "line": 788, - "lineto": 788, + "line": 789, + "lineto": 789, "args": [ { "name": "remote", @@ -17982,8 +17982,8 @@ "git_remote_update_tips": { "type": "function", "file": "git2/remote.h", - "line": 804, - "lineto": 809, + "line": 805, + "lineto": 810, "args": [ { "name": "remote", @@ -18024,8 +18024,8 @@ "git_remote_fetch": { "type": "function", "file": "git2/remote.h", - "line": 825, - "lineto": 829, + "line": 826, + "lineto": 830, "args": [ { "name": "remote", @@ -18066,8 +18066,8 @@ "git_remote_prune": { "type": "function", "file": "git2/remote.h", - "line": 838, - "lineto": 838, + "line": 839, + "lineto": 839, "args": [ { "name": "remote", @@ -18093,8 +18093,8 @@ "git_remote_push": { "type": "function", "file": "git2/remote.h", - "line": 850, - "lineto": 852, + "line": 851, + "lineto": 853, "args": [ { "name": "remote", @@ -18125,8 +18125,8 @@ "git_remote_stats": { "type": "function", "file": "git2/remote.h", - "line": 857, - "lineto": 857, + "line": 858, + "lineto": 858, "args": [ { "name": "remote", @@ -18152,8 +18152,8 @@ "git_remote_autotag": { "type": "function", "file": "git2/remote.h", - "line": 865, - "lineto": 865, + "line": 866, + "lineto": 866, "args": [ { "name": "remote", @@ -18174,8 +18174,8 @@ "git_remote_set_autotag": { "type": "function", "file": "git2/remote.h", - "line": 877, - "lineto": 877, + "line": 878, + "lineto": 878, "args": [ { "name": "repo", @@ -18206,8 +18206,8 @@ "git_remote_prune_refs": { "type": "function", "file": "git2/remote.h", - "line": 884, - "lineto": 884, + "line": 885, + "lineto": 885, "args": [ { "name": "remote", @@ -18228,8 +18228,8 @@ "git_remote_rename": { "type": "function", "file": "git2/remote.h", - "line": 906, - "lineto": 910, + "line": 907, + "lineto": 911, "args": [ { "name": "problems", @@ -18270,8 +18270,8 @@ "git_remote_is_valid_name": { "type": "function", "file": "git2/remote.h", - "line": 918, - "lineto": 918, + "line": 919, + "lineto": 919, "args": [ { "name": "remote_name", @@ -18292,8 +18292,8 @@ "git_remote_delete": { "type": "function", "file": "git2/remote.h", - "line": 930, - "lineto": 930, + "line": 931, + "lineto": 931, "args": [ { "name": "repo", @@ -18324,8 +18324,8 @@ "git_remote_default_branch": { "type": "function", "file": "git2/remote.h", - "line": 948, - "lineto": 948, + "line": 949, + "lineto": 949, "args": [ { "name": "out", @@ -18835,8 +18835,8 @@ "git_repository_item_path": { "type": "function", "file": "git2/repository.h", - "line": 458, - "lineto": 458, + "line": 459, + "lineto": 459, "args": [ { "name": "out", @@ -18867,8 +18867,8 @@ "git_repository_path": { "type": "function", "file": "git2/repository.h", - "line": 469, - "lineto": 469, + "line": 470, + "lineto": 470, "args": [ { "name": "repo", @@ -18897,8 +18897,8 @@ "git_repository_workdir": { "type": "function", "file": "git2/repository.h", - "line": 480, - "lineto": 480, + "line": 481, + "lineto": 481, "args": [ { "name": "repo", @@ -18924,8 +18924,8 @@ "git_repository_commondir": { "type": "function", "file": "git2/repository.h", - "line": 491, - "lineto": 491, + "line": 492, + "lineto": 492, "args": [ { "name": "repo", @@ -18946,8 +18946,8 @@ "git_repository_set_workdir": { "type": "function", "file": "git2/repository.h", - "line": 510, - "lineto": 511, + "line": 511, + "lineto": 512, "args": [ { "name": "repo", @@ -18978,8 +18978,8 @@ "git_repository_is_bare": { "type": "function", "file": "git2/repository.h", - "line": 519, - "lineto": 519, + "line": 520, + "lineto": 520, "args": [ { "name": "repo", @@ -19005,8 +19005,8 @@ "git_repository_is_worktree": { "type": "function", "file": "git2/repository.h", - "line": 527, - "lineto": 527, + "line": 528, + "lineto": 528, "args": [ { "name": "repo", @@ -19027,8 +19027,8 @@ "git_repository_config": { "type": "function", "file": "git2/repository.h", - "line": 543, - "lineto": 543, + "line": 544, + "lineto": 544, "args": [ { "name": "out", @@ -19054,8 +19054,8 @@ "git_repository_config_snapshot": { "type": "function", "file": "git2/repository.h", - "line": 559, - "lineto": 559, + "line": 560, + "lineto": 560, "args": [ { "name": "out", @@ -19087,8 +19087,8 @@ "git_repository_odb": { "type": "function", "file": "git2/repository.h", - "line": 575, - "lineto": 575, + "line": 576, + "lineto": 576, "args": [ { "name": "out", @@ -19122,8 +19122,8 @@ "git_repository_refdb": { "type": "function", "file": "git2/repository.h", - "line": 591, - "lineto": 591, + "line": 592, + "lineto": 592, "args": [ { "name": "out", @@ -19149,8 +19149,8 @@ "git_repository_index": { "type": "function", "file": "git2/repository.h", - "line": 607, - "lineto": 607, + "line": 608, + "lineto": 608, "args": [ { "name": "out", @@ -19193,8 +19193,8 @@ "git_repository_message": { "type": "function", "file": "git2/repository.h", - "line": 625, - "lineto": 625, + "line": 626, + "lineto": 626, "args": [ { "name": "out", @@ -19220,8 +19220,8 @@ "git_repository_message_remove": { "type": "function", "file": "git2/repository.h", - "line": 632, - "lineto": 632, + "line": 633, + "lineto": 633, "args": [ { "name": "repo", @@ -19242,8 +19242,8 @@ "git_repository_state_cleanup": { "type": "function", "file": "git2/repository.h", - "line": 641, - "lineto": 641, + "line": 642, + "lineto": 642, "args": [ { "name": "repo", @@ -19269,8 +19269,8 @@ "git_repository_fetchhead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 672, - "lineto": 675, + "line": 673, + "lineto": 676, "args": [ { "name": "repo", @@ -19301,8 +19301,8 @@ "git_repository_mergehead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 701, - "lineto": 704, + "line": 702, + "lineto": 705, "args": [ { "name": "repo", @@ -19333,8 +19333,8 @@ "git_repository_hashfile": { "type": "function", "file": "git2/repository.h", - "line": 729, - "lineto": 734, + "line": 730, + "lineto": 735, "args": [ { "name": "out", @@ -19375,8 +19375,8 @@ "git_repository_set_head": { "type": "function", "file": "git2/repository.h", - "line": 754, - "lineto": 756, + "line": 755, + "lineto": 757, "args": [ { "name": "repo", @@ -19407,8 +19407,8 @@ "git_repository_set_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 774, - "lineto": 776, + "line": 775, + "lineto": 777, "args": [ { "name": "repo", @@ -19434,8 +19434,8 @@ "git_repository_set_head_detached_from_annotated": { "type": "function", "file": "git2/repository.h", - "line": 790, - "lineto": 792, + "line": 791, + "lineto": 793, "args": [ { "name": "repo", @@ -19466,8 +19466,8 @@ "git_repository_detach_head": { "type": "function", "file": "git2/repository.h", - "line": 811, - "lineto": 812, + "line": 812, + "lineto": 813, "args": [ { "name": "repo", @@ -19488,8 +19488,8 @@ "git_repository_state": { "type": "function", "file": "git2/repository.h", - "line": 842, - "lineto": 842, + "line": 843, + "lineto": 843, "args": [ { "name": "repo", @@ -19518,8 +19518,8 @@ "git_repository_set_namespace": { "type": "function", "file": "git2/repository.h", - "line": 856, - "lineto": 856, + "line": 857, + "lineto": 857, "args": [ { "name": "repo", @@ -19545,8 +19545,8 @@ "git_repository_get_namespace": { "type": "function", "file": "git2/repository.h", - "line": 864, - "lineto": 864, + "line": 865, + "lineto": 865, "args": [ { "name": "repo", @@ -19567,8 +19567,8 @@ "git_repository_is_shallow": { "type": "function", "file": "git2/repository.h", - "line": 873, - "lineto": 873, + "line": 874, + "lineto": 874, "args": [ { "name": "repo", @@ -19589,8 +19589,8 @@ "git_repository_ident": { "type": "function", "file": "git2/repository.h", - "line": 885, - "lineto": 885, + "line": 886, + "lineto": 886, "args": [ { "name": "name", @@ -19621,8 +19621,8 @@ "git_repository_set_ident": { "type": "function", "file": "git2/repository.h", - "line": 898, - "lineto": 898, + "line": 899, + "lineto": 899, "args": [ { "name": "repo", @@ -20884,8 +20884,8 @@ "git_status_options_init": { "type": "function", "file": "git2/status.h", - "line": 203, - "lineto": 205, + "line": 212, + "lineto": 214, "args": [ { "name": "opts", @@ -20911,8 +20911,8 @@ "git_status_foreach": { "type": "function", "file": "git2/status.h", - "line": 243, - "lineto": 246, + "line": 252, + "lineto": 255, "args": [ { "name": "repo", @@ -20948,8 +20948,8 @@ "git_status_foreach_ext": { "type": "function", "file": "git2/status.h", - "line": 267, - "lineto": 271, + "line": 276, + "lineto": 280, "args": [ { "name": "repo", @@ -20990,8 +20990,8 @@ "git_status_file": { "type": "function", "file": "git2/status.h", - "line": 299, - "lineto": 302, + "line": 308, + "lineto": 311, "args": [ { "name": "status_flags", @@ -21027,8 +21027,8 @@ "git_status_list_new": { "type": "function", "file": "git2/status.h", - "line": 317, - "lineto": 320, + "line": 326, + "lineto": 329, "args": [ { "name": "out", @@ -21065,8 +21065,8 @@ "git_status_list_entrycount": { "type": "function", "file": "git2/status.h", - "line": 331, - "lineto": 332, + "line": 340, + "lineto": 341, "args": [ { "name": "statuslist", @@ -21093,8 +21093,8 @@ "git_status_byindex": { "type": "function", "file": "git2/status.h", - "line": 343, - "lineto": 345, + "line": 352, + "lineto": 354, "args": [ { "name": "statuslist", @@ -21130,8 +21130,8 @@ "git_status_list_free": { "type": "function", "file": "git2/status.h", - "line": 352, - "lineto": 353, + "line": 361, + "lineto": 362, "args": [ { "name": "statuslist", @@ -21157,8 +21157,8 @@ "git_status_should_ignore": { "type": "function", "file": "git2/status.h", - "line": 371, - "lineto": 374, + "line": 380, + "lineto": 383, "args": [ { "name": "ignored", @@ -23105,8 +23105,8 @@ "git_cred_has_username": { "type": "function", "file": "git2/transport.h", - "line": 219, - "lineto": 219, + "line": 233, + "lineto": 233, "args": [ { "name": "cred", @@ -23127,8 +23127,8 @@ "git_cred_userpass_plaintext_new": { "type": "function", "file": "git2/transport.h", - "line": 230, - "lineto": 233, + "line": 244, + "lineto": 247, "args": [ { "name": "out", @@ -23159,8 +23159,8 @@ "git_cred_ssh_key_new": { "type": "function", "file": "git2/transport.h", - "line": 246, - "lineto": 251, + "line": 260, + "lineto": 265, "args": [ { "name": "out", @@ -23201,8 +23201,8 @@ "git_cred_ssh_interactive_new": { "type": "function", "file": "git2/transport.h", - "line": 262, - "lineto": 266, + "line": 276, + "lineto": 280, "args": [ { "name": "out", @@ -23238,8 +23238,8 @@ "git_cred_ssh_key_from_agent": { "type": "function", "file": "git2/transport.h", - "line": 276, - "lineto": 278, + "line": 290, + "lineto": 292, "args": [ { "name": "out", @@ -23265,8 +23265,8 @@ "git_cred_ssh_custom_new": { "type": "function", "file": "git2/transport.h", - "line": 298, - "lineto": 304, + "line": 312, + "lineto": 318, "args": [ { "name": "out", @@ -23312,8 +23312,8 @@ "git_cred_default_new": { "type": "function", "file": "git2/transport.h", - "line": 312, - "lineto": 312, + "line": 326, + "lineto": 326, "args": [ { "name": "out", @@ -23334,8 +23334,8 @@ "git_cred_username_new": { "type": "function", "file": "git2/transport.h", - "line": 320, - "lineto": 320, + "line": 334, + "lineto": 334, "args": [ { "name": "cred", @@ -23361,8 +23361,8 @@ "git_cred_ssh_key_memory_new": { "type": "function", "file": "git2/transport.h", - "line": 332, - "lineto": 337, + "line": 346, + "lineto": 351, "args": [ { "name": "out", @@ -23403,8 +23403,8 @@ "git_cred_free": { "type": "function", "file": "git2/transport.h", - "line": 348, - "lineto": 348, + "line": 362, + "lineto": 362, "args": [ { "name": "cred", @@ -24061,7 +24061,7 @@ "argline": "git_treebuilder *bld", "sig": "git_treebuilder *", "return": { - "type": "unsigned int", + "type": "size_t", "comment": " the number of entries in the treebuilder" }, "description": "

Get the number of entries listed in a treebuilder

\n", @@ -25082,8 +25082,8 @@ "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 409, - "lineto": 409, + "line": 423, + "lineto": 423, "args": [ { "name": "rhead", @@ -25676,8 +25676,8 @@ "git_repository_fetchhead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 655, - "lineto": 659, + "line": 656, + "lineto": 660, "args": [ { "name": "ref_name", @@ -25717,8 +25717,8 @@ "git_repository_mergehead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 686, - "lineto": 687, + "line": 687, + "lineto": 688, "args": [ { "name": "oid", @@ -25981,8 +25981,8 @@ "git_cred_acquire_cb": { "type": "callback", "file": "git2/transport.h", - "line": 362, - "lineto": 367, + "line": 376, + "lineto": 381, "args": [ { "name": "cred", @@ -26189,8 +26189,8 @@ ], "type": "enum", "file": "git2/apply.h", - "line": 95, - "lineto": 113, + "line": 100, + "lineto": 118, "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", "tdef": "typedef", "description": " Possible application locations for git_apply ", @@ -26236,7 +26236,7 @@ "value": "git_apply_options", "file": "git2/apply.h", "line": 64, - "lineto": 70, + "lineto": 75, "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload", "tdef": "typedef", "description": " Apply options structure", @@ -26245,22 +26245,22 @@ { "type": "unsigned int", "name": "version", - "comments": "" + "comments": " The version " }, { "type": "git_apply_delta_cb", "name": "delta_cb", - "comments": "" + "comments": " When applying a patch, callback that will be made per delta (file). " }, { "type": "git_apply_hunk_cb", "name": "hunk_cb", - "comments": "" + "comments": " When applying a patch, callback that will be made per hunk. " }, { "type": "void *", "name": "payload", - "comments": "" + "comments": " Payload passed to both delta_cb \n&\n hunk_cb. " } ], "used": { @@ -26685,27 +26685,27 @@ "type": "struct", "value": "git_buf", "file": "git2/buffer.h", - "line": 52, - "lineto": 55, + "line": 39, + "lineto": 61, "block": "char * ptr\nsize_t asize\nsize_t size", "tdef": "typedef", "description": " A data buffer for exporting data from libgit2", - "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. This can be awkward if the caller does not have easy access to the same allocation functions that libgit2 is using. In those cases, libgit2 will fill in a git_buf and the caller can use git_buf_dispose() to release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to a block of memory they hold. In this case, libgit2 will not resize or free the memory, but will read from it as needed.

\n\n

A git_buf is a public structure with three fields:

\n\n
    \n
  • ptr points to the start of the allocated memory. If it is NULL, then the git_buf is considered empty and libgit2 will feel free to overwrite it with new data.

  • \n
  • size holds the size (in bytes) of the data that is actually used.

  • \n
  • asize holds the known total amount of allocated memory if the ptr was allocated by libgit2. It may be larger than size. If ptr was not allocated by libgit2 and should not be resized and/or freed, then asize will be set to zero.

  • \n
\n\n

Some APIs may occasionally do something slightly unusual with a buffer, such as setting ptr to a value that was passed in by the user. In those cases, the behavior will be clearly documented by the API.

\n", + "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. This can be awkward if the caller does not have easy access to the same allocation functions that libgit2 is using. In those cases, libgit2 will fill in a git_buf and the caller can use git_buf_dispose() to release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to a block of memory they hold. In this case, libgit2 will not resize or free the memory, but will read from it as needed.

\n\n

Some APIs may occasionally do something slightly unusual with a buffer, such as setting ptr to a value that was passed in by the user. In those cases, the behavior will be clearly documented by the API.

\n", "fields": [ { "type": "char *", "name": "ptr", - "comments": "" + "comments": " The buffer contents.\n\n `ptr` points to the start of the allocated memory. If it is NULL,\n then the `git_buf` is considered empty and libgit2 will feel free\n to overwrite it with new data." }, { "type": "size_t", "name": "asize", - "comments": "" + "comments": " `asize` holds the known total amount of allocated memory if the `ptr`\n was allocated by libgit2. It may be larger than `size`. If `ptr`\n was not allocated by libgit2 and should not be resized and/or freed,\n then `asize` will be set to zero." }, { "type": "size_t", "name": "size", - "comments": "" + "comments": " `size` holds the size (in bytes) of the data that is actually used." } ], "used": { @@ -26811,7 +26811,7 @@ { "type": "git_cert", "name": "parent", - "comments": "" + "comments": " The parent cert " }, { "type": "git_cert_ssh_t", @@ -26931,7 +26931,7 @@ "value": "git_cert_x509", "file": "git2/transport.h", "line": 64, - "lineto": 74, + "lineto": 76, "block": "git_cert parent\nvoid * data\nsize_t len", "tdef": "typedef", "description": " X.509 certificate information", @@ -26940,7 +26940,7 @@ { "type": "git_cert", "name": "parent", - "comments": "" + "comments": " The parent cert " }, { "type": "void *", @@ -27060,7 +27060,7 @@ "value": "git_checkout_options", "file": "git2/checkout.h", "line": 263, - "lineto": 307, + "lineto": 326, "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", "tdef": "typedef", "description": " Checkout options structure", @@ -27069,7 +27069,7 @@ { "type": "unsigned int", "name": "version", - "comments": "" + "comments": " The version " }, { "type": "unsigned int", @@ -27104,12 +27104,12 @@ { "type": "git_checkout_notify_cb", "name": "notify_cb", - "comments": "" + "comments": " Optional callback to get notifications on specific file states.\n " }, { "type": "void *", "name": "notify_payload", - "comments": "" + "comments": " Payload passed to notify_cb " }, { "type": "git_checkout_progress_cb", @@ -27119,22 +27119,22 @@ { "type": "void *", "name": "progress_payload", - "comments": "" + "comments": " Payload passed to progress_cb " }, { "type": "git_strarray", "name": "paths", - "comments": " When not zeroed out, array of fnmatch patterns specifying which\n paths should be taken into account, otherwise all files. Use\n GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as simple list." + "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." }, { "type": "git_tree *", "name": "baseline", - "comments": " The expected content of the working directory; defaults to HEAD.\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." + "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." }, { "type": "git_index *", "name": "baseline_index", - "comments": " expected content of workdir, expressed as an index. " + "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." }, { "type": "const char *", @@ -27164,7 +27164,7 @@ { "type": "void *", "name": "perfdata_payload", - "comments": "" + "comments": " Payload passed to perfdata_cb " } ], "used": { @@ -27676,6 +27676,7 @@ "git_config_iterator_glob_new", "git_config_iterator_new", "git_config_lock", + "git_config_lookup_map_value", "git_config_multivar_iterator_new", "git_config_new", "git_config_next", @@ -27875,6 +27876,98 @@ } } ], + [ + "git_configmap", + { + "decl": [ + "git_configmap_t type", + "const char * str_match", + "int map_value" + ], + "type": "struct", + "value": "git_configmap", + "file": "git2/config.h", + "line": 104, + "lineto": 108, + "tdef": "typedef", + "description": " Mapping from config variables to values.", + "comments": "", + "fields": [ + { + "type": "git_configmap_t", + "name": "type", + "comments": "" + }, + { + "type": "const char *", + "name": "str_match", + "comments": "" + }, + { + "type": "int", + "name": "map_value", + "comments": "" + } + ], + "block": "git_configmap_t type\nconst char * str_match\nint map_value", + "used": { + "returns": [], + "needs": [ + "git_config_get_mapped", + "git_config_lookup_map_value" + ] + } + } + ], + [ + "git_configmap_t", + { + "decl": [ + "GIT_CONFIGMAP_FALSE", + "GIT_CONFIGMAP_TRUE", + "GIT_CONFIGMAP_INT32", + "GIT_CONFIGMAP_STRING" + ], + "type": "enum", + "file": "git2/config.h", + "line": 94, + "lineto": 99, + "tdef": "typedef", + "description": " Config var type", + "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", + "fields": [ + { + "type": "int", + "name": "GIT_CONFIGMAP_FALSE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_TRUE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_INT32", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_STRING", + "comments": "", + "value": 3 + } + ] + } + ], [ "git_cred", { @@ -27885,8 +27978,9 @@ "type": "struct", "value": "git_cred", "file": "git2/transport.h", - "line": 145, - "lineto": 148, + "line": 147, + "lineto": 152, + "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", "tdef": null, "description": " The base structure for all credential types", "comments": "", @@ -27902,7 +27996,6 @@ "comments": "" } ], - "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", "used": { "returns": [], "needs": [ @@ -27929,8 +28022,8 @@ "type": "struct", "value": "git_cred_default", "file": "git2/transport.h", - "line": 205, - "lineto": 205, + "line": 219, + "lineto": 219, "tdef": "typedef", "description": " A key for NTLM/Kerberos \"default\" credentials ", "comments": "", @@ -27954,8 +28047,8 @@ "type": "struct", "value": "git_cred_ssh_custom", "file": "git2/transport.h", - "line": 195, - "lineto": 202, + "line": 204, + "lineto": 216, "block": "git_cred parent\nchar * username\nchar * publickey\nsize_t publickey_len\ngit_cred_sign_cb sign_callback\nvoid * payload", "tdef": "typedef", "description": " A key with a custom signature function", @@ -27964,32 +28057,32 @@ { "type": "git_cred", "name": "parent", - "comments": "" + "comments": " The parent cred " }, { "type": "char *", "name": "username", - "comments": "" + "comments": " The username to authenticate as " }, { "type": "char *", "name": "publickey", - "comments": "" + "comments": " The public key data " }, { "type": "size_t", "name": "publickey_len", - "comments": "" + "comments": " Length of the public key " }, { "type": "git_cred_sign_cb", "name": "sign_callback", - "comments": "" + "comments": " Callback used to sign the data." }, { "type": "void *", "name": "payload", - "comments": "" + "comments": " Payload passed to prompt_callback " } ], "used": { @@ -28010,8 +28103,8 @@ "type": "struct", "value": "git_cred_ssh_interactive", "file": "git2/transport.h", - "line": 185, - "lineto": 190, + "line": 189, + "lineto": 199, "block": "git_cred parent\nchar * username\ngit_cred_ssh_interactive_cb prompt_callback\nvoid * payload", "tdef": "typedef", "description": " Keyboard-interactive based ssh authentication", @@ -28020,22 +28113,22 @@ { "type": "git_cred", "name": "parent", - "comments": "" + "comments": " The parent cred " }, { "type": "char *", "name": "username", - "comments": "" + "comments": " The username to authenticate as " }, { "type": "git_cred_ssh_interactive_cb", "name": "prompt_callback", - "comments": "" + "comments": " Callback used for authentication." }, { "type": "void *", "name": "payload", - "comments": "" + "comments": " Payload passed to prompt_callback " } ], "used": { @@ -28059,8 +28152,8 @@ "type": "struct", "value": "git_cred_ssh_key", "file": "git2/transport.h", - "line": 174, - "lineto": 180, + "line": 178, + "lineto": 184, "block": "git_cred parent\nchar * username\nchar * publickey\nchar * privatekey\nchar * passphrase", "tdef": "typedef", "description": " A ssh key from disk", @@ -28069,27 +28162,27 @@ { "type": "git_cred", "name": "parent", - "comments": "" + "comments": " The parent cred " }, { "type": "char *", "name": "username", - "comments": "" + "comments": " The username to authenticate as " }, { "type": "char *", "name": "publickey", - "comments": "" + "comments": " The path to a public key " }, { "type": "char *", "name": "privatekey", - "comments": "" + "comments": " The path to a private key " }, { "type": "char *", "name": "passphrase", - "comments": "" + "comments": " Passphrase used to decrypt the private key " } ], "used": { @@ -28108,8 +28201,8 @@ "type": "struct", "value": "git_cred_username", "file": "git2/transport.h", - "line": 208, - "lineto": 211, + "line": 222, + "lineto": 225, "block": "git_cred parent\nchar [1] username", "tdef": "typedef", "description": " Username-only credential information ", @@ -28118,12 +28211,12 @@ { "type": "git_cred", "name": "parent", - "comments": "" + "comments": " The parent cred " }, { "type": "char [1]", "name": "username", - "comments": "" + "comments": " The username to authenticate as " } ], "used": { @@ -28140,7 +28233,6 @@ "const char * password" ], "type": "struct", - "value": "git_cred_userpass_payload", "file": "git2/cred_helpers.h", "line": 24, "lineto": 27, @@ -28163,7 +28255,8 @@ "used": { "returns": [], "needs": [] - } + }, + "value": "git_cred_userpass_payload" } ], [ @@ -28177,8 +28270,8 @@ "type": "struct", "value": "git_cred_userpass_plaintext", "file": "git2/transport.h", - "line": 151, - "lineto": 155, + "line": 155, + "lineto": 159, "block": "git_cred parent\nchar * username\nchar * password", "tdef": "typedef", "description": " A plaintext username and password ", @@ -28187,17 +28280,17 @@ { "type": "git_cred", "name": "parent", - "comments": "" + "comments": " The parent cred " }, { "type": "char *", "name": "username", - "comments": "" + "comments": " The username to authenticate as " }, { "type": "char *", "name": "password", - "comments": "" + "comments": " The password to use " } ], "used": { @@ -28220,8 +28313,8 @@ ], "type": "enum", "file": "git2/transport.h", - "line": 86, - "lineto": 138, + "line": 88, + "lineto": 140, "block": "GIT_CREDTYPE_USERPASS_PLAINTEXT\nGIT_CREDTYPE_SSH_KEY\nGIT_CREDTYPE_SSH_CUSTOM\nGIT_CREDTYPE_DEFAULT\nGIT_CREDTYPE_SSH_INTERACTIVE\nGIT_CREDTYPE_USERNAME\nGIT_CREDTYPE_SSH_MEMORY", "tdef": "typedef", "description": " Supported credential types", @@ -28276,98 +28369,6 @@ } } ], - [ - "git_cvar_map", - { - "decl": [ - "git_cvar_t cvar_type", - "const char * str_match", - "int map_value" - ], - "type": "struct", - "value": "git_cvar_map", - "file": "git2/config.h", - "line": 104, - "lineto": 108, - "block": "git_cvar_t cvar_type\nconst char * str_match\nint map_value", - "tdef": "typedef", - "description": " Mapping from config variables to values.", - "comments": "", - "fields": [ - { - "type": "git_cvar_t", - "name": "cvar_type", - "comments": "" - }, - { - "type": "const char *", - "name": "str_match", - "comments": "" - }, - { - "type": "int", - "name": "map_value", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_config_get_mapped", - "git_config_lookup_map_value" - ] - } - } - ], - [ - "git_cvar_t", - { - "decl": [ - "GIT_CVAR_FALSE", - "GIT_CVAR_TRUE", - "GIT_CVAR_INT32", - "GIT_CVAR_STRING" - ], - "type": "enum", - "file": "git2/config.h", - "line": 94, - "lineto": 99, - "block": "GIT_CVAR_FALSE\nGIT_CVAR_TRUE\nGIT_CVAR_INT32\nGIT_CVAR_STRING", - "tdef": "typedef", - "description": " Config var type", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CVAR_FALSE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CVAR_TRUE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CVAR_INT32", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CVAR_STRING", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_delta_t", { @@ -30777,8 +30778,8 @@ "type": "struct", "value": "git_fetch_options", "file": "git2/remote.h", - "line": 651, - "lineto": 688, + "line": 652, + "lineto": 689, "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Fetch options structure.", @@ -30840,8 +30841,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 603, - "lineto": 616, + "line": 604, + "lineto": 617, "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", "description": " Acceptable prune settings when fetching ", @@ -33852,8 +33853,8 @@ "type": "struct", "value": "git_push_options", "file": "git2/remote.h", - "line": 712, - "lineto": 739, + "line": 713, + "lineto": 740, "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", @@ -34546,8 +34547,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 623, - "lineto": 641, + "line": 624, + "lineto": 642, "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", "tdef": "typedef", "description": " Automatic tag following option", @@ -34612,7 +34613,7 @@ "value": "git_remote_callbacks", "file": "git2/remote.h", "line": 497, - "lineto": 585, + "lineto": 586, "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload\ngit_url_resolve_cb resolve_url", "tdef": null, "description": " The callback settings structure", @@ -34621,7 +34622,7 @@ { "type": "unsigned int", "name": "version", - "comments": "" + "comments": " The version " }, { "type": "git_transport_message_cb", @@ -35333,13 +35334,14 @@ "GIT_REPOSITORY_ITEM_HOOKS", "GIT_REPOSITORY_ITEM_LOGS", "GIT_REPOSITORY_ITEM_MODULES", - "GIT_REPOSITORY_ITEM_WORKTREES" + "GIT_REPOSITORY_ITEM_WORKTREES", + "GIT_REPOSITORY_ITEM__LAST" ], "type": "enum", "file": "git2/repository.h", "line": 427, - "lineto": 442, - "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES", + "lineto": 443, + "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM__LAST", "tdef": "typedef", "description": " List of items which belong to the git repository layout", "comments": "", @@ -35427,6 +35429,12 @@ "name": "GIT_REPOSITORY_ITEM_WORKTREES", "comments": "", "value": 13 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM__LAST", + "comments": "", + "value": 14 } ], "used": { @@ -35512,8 +35520,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 820, - "lineto": 833, + "line": 821, + "lineto": 834, "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", "tdef": "typedef", "description": " Repository state", @@ -36214,8 +36222,8 @@ "type": "struct", "value": "git_status_entry", "file": "git2/status.h", - "line": 221, - "lineto": 225, + "line": 230, + "lineto": 234, "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", "tdef": "typedef", "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", @@ -36414,37 +36422,37 @@ "type": "struct", "value": "git_status_options", "file": "git2/status.h", - "line": 182, - "lineto": 188, + "line": 170, + "lineto": 197, "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline", "tdef": "typedef", "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", - "comments": "

This structure is set so that zeroing it out will give you relatively sane defaults.

\n\n

The show value is one of the git_status_show_t constants that control which files to scan and in what order.

\n\n

The flags value is an OR'ed combination of the git_status_opt_t values above.

\n\n

The pathspec is an array of path patterns to match (using fnmatch-style matching), or just an array of paths to match exactly if GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH is specified in the flags.

\n\n

The baseline is the tree to be used for comparison to the working directory and index; defaults to HEAD.

\n", + "comments": "

Initialize with GIT_STATUS_OPTIONS_INIT. Alternatively, you can use git_status_options_init.

\n", "fields": [ { "type": "unsigned int", "name": "version", - "comments": "" + "comments": " The version " }, { "type": "git_status_show_t", "name": "show", - "comments": "" + "comments": " The `show` value is one of the `git_status_show_t` constants that\n control which files to scan and in what order." }, { "type": "unsigned int", "name": "flags", - "comments": "" + "comments": " The `flags` value is an OR'ed combination of the `git_status_opt_t`\n values above." }, { "type": "git_strarray", "name": "pathspec", - "comments": "" + "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match exactly if\n `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified in the flags." }, { "type": "git_tree *", "name": "baseline", - "comments": "" + "comments": " The `baseline` is the tree to be used for comparison to the working directory\n and index; defaults to HEAD." } ], "used": { @@ -38836,6 +38844,10 @@ "common.c", "ex/HEAD/common.html" ], + [ + "config.c", + "ex/HEAD/config.html" + ], [ "describe.c", "ex/HEAD/describe.html" diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 3f714cdd1..6444228ea 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -120,8 +120,8 @@ "libgit2/src/fetchhead.h", "libgit2/src/filebuf.c", "libgit2/src/filebuf.h", - "libgit2/src/fileops.c", - "libgit2/src/fileops.h", + "libgit2/src/futils.c", + "libgit2/src/futils.h", "libgit2/src/filter.c", "libgit2/src/filter.h", "libgit2/src/global.c", @@ -129,11 +129,13 @@ "libgit2/src/graph.c", "libgit2/src/hash.c", "libgit2/src/hash.h", - "libgit2/src/hash/sha1dc/sha1.c", - "libgit2/src/hash/sha1dc/sha1.h", - "libgit2/src/hash/sha1dc/ubc_check.c", - "libgit2/src/hash/sha1dc/ubc_check.h", - "libgit2/src/hash/hash_collisiondetect.h", + "libgit2/src/hash/sha1.h", + "libgit2/src/hash/sha1/sha1dc/sha1.c", + "libgit2/src/hash/sha1/sha1dc/sha1.h", + "libgit2/src/hash/sha1/sha1dc/ubc_check.c", + "libgit2/src/hash/sha1/sha1dc/ubc_check.h", + "libgit2/src/hash/sha1/collisiondetect.c", + "libgit2/src/hash/sha1/collisiondetect.h", "libgit2/src/hashsig.c", "libgit2/src/ident.c", "libgit2/src/idxmap.c", From b05db5f4ab69e436e1ab94f548fee8478aaf9642 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 23 Jul 2019 14:08:53 -0700 Subject: [PATCH 146/545] Remove config_snapshot hack from refresh_references We needed to perform this hack to get libgit2 to re-read the config on git_remote_list. Now that git_remote_list always reads the config, we don't need to force the config to update via a config_snapshot request --- .../manual/repository/refresh_references.cc | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 8d0fe36d6..730afadbc 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -429,20 +429,6 @@ void GitRepository::RefreshReferencesWorker::Execute() return; } - git_config *config; - baton->error_code = git_repository_config_snapshot(&config, repo); - if (baton->error_code != GIT_OK) { - if (giterr_last() != NULL) { - baton->error = git_error_dup(giterr_last()); - } - git_odb_free(odb); - delete refreshData; - baton->out = NULL; - return; - } - git_config_free(config); - - // START Refresh HEAD git_reference *headRef = NULL; baton->error_code = lookupDirectReferenceByShorthand(&headRef, repo, "HEAD"); @@ -544,7 +530,7 @@ void GitRepository::RefreshReferencesWorker::Execute() if (reference == NULL) { // lookup found the reference but failed to resolve it directly continue; - } + } UpstreamModel *upstreamModel; if (UpstreamModel::fromReference(&upstreamModel, reference)) { From 3a8881d6f3feee67561b5bd03a54c29e93af7fa2 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 23 Jul 2019 15:42:22 -0700 Subject: [PATCH 147/545] Bump to v0.25.0-alpha.16 --- CHANGELOG.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5074972b1..9ba0c518f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,57 @@ # Change Log +## v0.25.0-alpha.16 [(2019-07-23)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.16) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.15...v0.25.0-alpha.16) + +#### Summary of changes +- Adds support for Node 12 +- Updates lodash dependency to address security notice +- Expose Tree.prototype.createUpdated(repo, numUpdates, updates) +- Bumps libgit2 + - Fixes gitignore issue with pattern negation + - Remote.list now gets the correct list of remotes if remotes are changed by external process + +#### Merged PRs into NodeGit +- [Bump libgit2 #1705](https://github.com/nodegit/nodegit/pull/1705) +- [Fix Tree#createUpdated #1704](https://github.com/nodegit/nodegit/pull/1704) +- [Fix failing tests on CI #1703](https://github.com/nodegit/nodegit/pull/1703) +- [Audit lodash and fix package-lock.json #1702](https://github.com/nodegit/nodegit/pull/1702) +- [Implement support for Node 12 #1696](https://github.com/nodegit/nodegit/pull/1696) + +#### Merged PRs into LibGit2 +- [config_file: refresh when creating an iterator #5181](https://github.com/libgit2/libgit2/pull/5181) +- [azure: drop powershell #5141](https://github.com/libgit2/libgit2/pull/5141) +- [fuzzer: use futils instead of fileops #5180](https://github.com/libgit2/libgit2/pull/5180) +- [w32: fix unlinking of directory symlinks #5151](https://github.com/libgit2/libgit2/pull/5151) +- [patch_parse: fix segfault due to line containing static contents #5179](https://github.com/libgit2/libgit2/pull/5179) +- [ignore: fix determining whether a shorter pattern negates another #5173](https://github.com/libgit2/libgit2/pull/5173) +- [patch_parse: handle missing newline indicator in old file #5159](https://github.com/libgit2/libgit2/pull/5159) +- [patch_parse: do not depend on parsed buffer's lifetime #5158](https://github.com/libgit2/libgit2/pull/5158) +- [sha1: fix compilation of WinHTTP backend #5174](https://github.com/libgit2/libgit2/pull/5174) +- [repository: do not initialize HEAD if it's provided by templates #5176](https://github.com/libgit2/libgit2/pull/5176) +- [configuration: cvar -> configmap #5138](https://github.com/libgit2/libgit2/pull/5138) +- [Evict cache items more efficiently #5172](https://github.com/libgit2/libgit2/pull/5172) +- [clar: fix suite count #5175](https://github.com/libgit2/libgit2/pull/5175) +- [Ignore VS2017 specific files and folders #5163](https://github.com/libgit2/libgit2/pull/5163) +- [gitattributes: ignore macros defined in subdirectories #5156](https://github.com/libgit2/libgit2/pull/5156) +- [clar: correctly account for "data" suites when counting #5168](https://github.com/libgit2/libgit2/pull/5168) +- [Allocate memory more efficiently when packing objects #5170](https://github.com/libgit2/libgit2/pull/5170) +- [fileops: fix creation of directory in filesystem root #5131](https://github.com/libgit2/libgit2/pull/5131) +- [win32: fix fuzzers and have CI build them #5160](https://github.com/libgit2/libgit2/pull/5160) +- [Config parser separation #5134](https://github.com/libgit2/libgit2/pull/5134) +- [config_file: implement stat cache to avoid repeated rehashing #5132](https://github.com/libgit2/libgit2/pull/5132) +- [ci: build with ENABLE_WERROR on Windows #5143](https://github.com/libgit2/libgit2/pull/5143) +- [Fix Regression: attr: Correctly load system attr file (on Windows) #5152](https://github.com/libgit2/libgit2/pull/5152) +- [hash: fix missing error return on production builds #5145](https://github.com/libgit2/libgit2/pull/5145) +- [Resolve static check warnings in example code #5142](https://github.com/libgit2/libgit2/pull/5142) +- [Multiple hash algorithms #4438](https://github.com/libgit2/libgit2/pull/4438) +- [More documentation #5128](https://github.com/libgit2/libgit2/pull/5128) +- [Incomplete commondir support #4967](https://github.com/libgit2/libgit2/pull/4967) +- [Remove warnings #5078](https://github.com/libgit2/libgit2/pull/5078) +- [Re-run flaky tests #5140](https://github.com/libgit2/libgit2/pull/5140) + + ## v0.25.0-alpha.15 [(2019-07-15)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.15) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.14...v0.25.0-alpha.15) diff --git a/package-lock.json b/package-lock.json index 943e5f4a8..91993080b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.15", + "version": "0.25.0-alpha.16", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bc8815c6a..f334970ca 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.15", + "version": "0.25.0-alpha.16", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From f516b424489bbf0a7bb1a1026116228855c90e13 Mon Sep 17 00:00:00 2001 From: Julian Kotrba Date: Wed, 24 Jul 2019 14:35:13 +0900 Subject: [PATCH 148/545] Add missing return type to Blame.file --- lib/blame.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/blame.js b/lib/blame.js index 7893d0c87..520bb8ce7 100644 --- a/lib/blame.js +++ b/lib/blame.js @@ -11,6 +11,7 @@ var _file = Blame.file; * @param {Repository} repo that contains the file * @param {String} path to the file to get the blame of * @param {BlameOptions} [options] Options for the blame + * @return {Blame} the blame */ Blame.file = function(repo, path, options) { options = normalizeOptions(options, NodeGit.BlameOptions); From d0bb116f9e4946ce85fa77e6d2540f334ec69ee0 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Thu, 25 Jul 2019 08:38:20 +0100 Subject: [PATCH 149/545] :bug: Fix behaviour of Repository#getReferences; filter and map do not work in-place --- lib/repository.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index 29c429fad..45669e698 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -351,14 +351,12 @@ Repository.initExt = function(repo_path, opts) { Repository.getReferences = function(repo, type, refNamesOnly) { return repo.getReferences().then(function(refList) { - var filteredRefList = refList; - - filteredRefList.filter(function(reference) { - return type == Reference.TYPE.LISTALL || reference.type === type; + var filteredRefList = refList.filter(function(reference) { + return type === Reference.TYPE.LISTALL || reference.type === type; }); if (refNamesOnly) { - filteredRefList.map(function(reference) { + return filteredRefList.map(function(reference) { return reference.name(); }); } @@ -1255,8 +1253,8 @@ Repository.prototype.getReferenceCommit = function(name, callback) { * @param {Reference.TYPE} type Type of reference to look up * @return {Array} */ -Repository.prototype.getReferenceNames = function(type, callback) { - return Repository.getReferences(this, type, true, callback); +Repository.prototype.getReferenceNames = function(type) { + return Repository.getReferences(this, type, true); }; /** From 58ab918c65cb5e86096c3dbce462685b20efb179 Mon Sep 17 00:00:00 2001 From: Peter Hunt Date: Thu, 25 Jul 2019 13:59:36 +0100 Subject: [PATCH 150/545] Reference.TYPE.LISTALL is depreciated in favour of TYPE.ALL --- lib/repository.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/repository.js b/lib/repository.js index 45669e698..aa7c406e4 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -352,7 +352,7 @@ Repository.initExt = function(repo_path, opts) { Repository.getReferences = function(repo, type, refNamesOnly) { return repo.getReferences().then(function(refList) { var filteredRefList = refList.filter(function(reference) { - return type === Reference.TYPE.LISTALL || reference.type === type; + return type === Reference.TYPE.ALL || reference.type === type; }); if (refNamesOnly) { From e74a129b1e3584d50c924e1cff3f43d5131c8267 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 1 Jul 2019 09:12:09 -0700 Subject: [PATCH 151/545] Reintroduce Odb.prototype.addDiskAlternate --- generate/input/descriptor.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 3d0562e77..b61702214 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2373,7 +2373,10 @@ "ignore": true }, "git_odb_add_disk_alternate": { - "ignore": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_odb_exists": { "ignore": true, From c69e193cf7519b7781b619a47663aa7daf79e6f9 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 8 Aug 2019 14:24:42 -0700 Subject: [PATCH 152/545] Add deprecation warnings for enums that need them. --- lib/attr.js | 20 ++++++++++++++++++++ lib/config.js | 17 +++++++++++++++++ lib/remote.js | 20 ++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 lib/attr.js diff --git a/lib/attr.js b/lib/attr.js new file mode 100644 index 000000000..8ecdd5eee --- /dev/null +++ b/lib/attr.js @@ -0,0 +1,20 @@ +var util = require("util"); +var NodeGit = require("../"); + +NodeGit.Attr.STATES = {}; +var DEPRECATED_STATES = { + UNSPECIFIED_T: "UNSPECIFIED", + TRUE_T: "TRUE", + FALSE_T: "FALSE", + VALUE_T: "STRING" +}; + +Object.keys(DEPRECATED_STATES).forEach((key) => { + const newKey = DEPRECATED_STATES[key]; + Object.defineProperty(NodeGit.Attr.STATES, key, { + get: util.deprecate( + () => NodeGit.Attr.VALUE[newKey], + `Use NodeGit.Attr.VALUE.${newKey} instead of NodeGit.Attr.STATES.${key}.` + ) + }); +}); diff --git a/lib/config.js b/lib/config.js index 1527ede7b..10838522a 100644 --- a/lib/config.js +++ b/lib/config.js @@ -1,3 +1,4 @@ +var util = require("util"); var NodeGit = require("../"); var Config = NodeGit.Config; @@ -6,3 +7,19 @@ var Config = NodeGit.Config; Config.prototype.getString = function() { return this.getStringBuf.apply(this, arguments); }; + +NodeGit.Enums.CVAR = {}; +var DEPRECATED_CVAR_ENUMS = [ + "FALSE", + "TRUE", + "INT32", + "STRING" +]; +DEPRECATED_CVAR_ENUMS.forEach((key) => { + Object.defineProperty(NodeGit.Enums.CVAR, key, { + get: util.deprecate( + () => Config.MAP[key], + `Use NodeGit.Config.MAP.${key} instead of NodeGit.Enums.CVAR.${key}.` + ) + }); +}); diff --git a/lib/remote.js b/lib/remote.js index 09db11c1a..510ce9b8b 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -1,3 +1,4 @@ +var util = require("util"); var NodeGit = require("../"); var normalizeFetchOptions = NodeGit.Utils.normalizeFetchOptions; var normalizeOptions = NodeGit.Utils.normalizeOptions; @@ -182,3 +183,22 @@ Remote.prototype.upload = function(refSpecs, opts) { return _upload.call(this, refSpecs, opts); }; + + +NodeGit.Remote.COMPLETION_TYPE = {}; +var DEPRECATED_STATES = { + COMPLETION_DOWNLOAD: "DOWNLOAD", + COMPLETION_INDEXING: "INDEXING", + COMPLETION_ERROR: "ERROR" +}; + +Object.keys(DEPRECATED_STATES).forEach((key) => { + const newKey = DEPRECATED_STATES[key]; + Object.defineProperty(NodeGit.Remote.COMPLETION_TYPE, key, { + get: util.deprecate( + () => NodeGit.Remote.COMPLETION[newKey], + `Use NodeGit.Remote.COMPLETION.${newKey} instead of ` + + `NodeGit.Remote.COMPLETION_TYPE.${key}.` + ) + }); +}); From 90c3c153b0d54a8d49619094a08913c8dfa4ebbd Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 8 Aug 2019 15:45:32 -0700 Subject: [PATCH 153/545] Bump to v0.25.0 --- CHANGELOG.md | 526 ++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 528 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ba0c518f..d7cfe392a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,531 @@ # Change Log +## v0.25.0 [(2019-08-09)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.24.3...v0.25.0) + +#### Summary of changes +##### BREAKING +- `getRemotes` no longer returns remote names, it now returns remote objects directly. Use `getRemoteNames` to get a list of remote names. +- Converted Buf.prototype.set and Buf.prototype.grow from async to sync +- `Repository.prototype.continueRebase` will now throw on any error except for EAPPLIED on the first call to `Rebase.prototype.next` +- Drops support for Ubuntu 14 after EOL +- Removed access to the `diff_so_far` param in `git_diff_notify_cb` and `git_diff_progress_cb` +- Changed `FilterSource.prototype.repo` to async to prevent segfaults on filters that run during `Submodule.status` +- Changed `NodeGit.Signature.default` to async, because it actually ends up reading the config. +- Fixed bug where templates were not reporting errors for synchronous methods. It's a bit of a wide net, but in general, + it is now possible certain sync methods in NodeGit will begin failing that did not fail before. This is the correct + behavior. + +##### Deprecations +- Support signing commits in `Repository.prototype.mergeBranches`. The last parameter `processMergeMessageCallback` is now deprecated, but will continue to work. Use the options object instead, which will contain the `processMergeMessageCallback`, as well as the `signingCb`. + +##### New +- Support for Node 12 +- Add signing support for commits and annotated tags + - Enforced consistent use of signing callbacks within the application. Any object that implements the signingCallback + pattern for signing commits or tags should use the exact same callback type and with the same meaning. + `type SigningCallback = (content: string) => {| code: number, field?: string, signedData?: string |};` + If the code is `NodeGit.Error.CODE.OK` or 0, the operation will succeed and _at least_ signedData is expected to be filled out. + If the code is a negative number, except for `NodeGit.Error.CODE.PASSTHROUGH`, the signing operation will fail. + If the code is `NodeGit.Error.CODE.PASSTHROUGH`, the operation will continue without signing the object. +- Exposed `AnnotatedCommit` methods: + - `AnnotatedCommit.prototype.ref` +- Exposed `Apply` methods: + - `Apply.apply` applies a diff to the repository + - `Apply.toTree` applies a diff to a tree +- Exposed `Config` methods: + - `Config.prototype.deleteEntry` + - `Config.prototype.deleteMultivar` + - `Config.prototype.getBool` + - `Config.prototype.getInt32` + - `Config.prototype.getInt64` + - `Config.prototype.setMultivar` + - `Config.prototype.snapshot` +- Exposed `ConfigIterator` with methods: + - `ConfigIterator.create` + - `ConfigIterator.createGlob` + - `ConfigIterator.createMultivar` + - `ConfigIterator.prototype.next` +- Exposed `IndexNameEntry`: + - `IndexNameEntry.add` + - `IndexNameEntry.clear` + - `IndexNameEntry.entryCount` + - `IndexNameEntry.getByIndex` + - `IndexNameEntry.prototype.ancestor` + - `IndexNameEntry.prototype.ours` + - `IndexNameEntry.prototype.theirs` +- Exposed `IndexReucEntry`: + - `IndexReucEntry.add` + - `IndexReucEntry.clear` + - `IndexReucEntry.entryCount` + - `IndexReucEntry.find` + - `IndexReucEntry.getByIndex` + - `IndexReucEntry.getByPath` + - `IndexReucEntry.remove` + - `IndexReucEntry.prototype.mode` + - `IndexReucEntry.prototype.oid` + - `IndexReucEntry.prototype.path` +- Exposed `Mailmap`: + - `Mailmap.prototype.addEntry` + - `Mailmap.fromBuffer` + - `Mailmap.fromRepository` + - `Mailmap.create` + - `Mailmap.prototype.resolve` + - `Mailmap.prototype.resolveSignature` +- Exposed `Merge` methods: + - `Merge.analysis` + - `Merge.analysisForRef` +- Exposed `Path.isGitfile` +- Added `RebaseOptions` to `Repository.prototype.rebaseContinue` +- Added `NodeGit.Reference.updateTerminal` +- Exposed `Remote` methods: + - `Remote.createWithOpts` +- Exposed `Tag.createFromBuffer` +- Expose `Tree.prototype.createUpdated(repo, numUpdates, updates)` + +##### Fixed +- Updates lodash dependency to address security notice +- Fixed a prototype problem with cherrypick, merge, and other collections that have a function at their root. call, apply, and bind should now be on NodeGit.Cherrypick. +- Bumped libssh2 to resolve security notice. +- Improve speed and correctness of fileHistoryWalk. The API should not have changed; however, when the end of the walk has been reached, `reachedEndOfHistory` will be specified on the resulting array. +- Fixes openssl prebuilt downloads for electron builds +- Fixes commits retrieved from `Commit.prototype.parent` +- Bump Node-Gyp to 4.0.0 to fix tar security vulnerability +- Optimized a set of routines in NodeGit. These methods as written in Javascript require hundreds or thousands of requests to async workers to retrieve data. We've batched these requests and performed them on a single async worker. There are now native implementations of the following: + - `Repository.prototype.getReferences`: Retrieves all references on async worker. + - `Repository.prototype.getRemotes`: Retrieves all remotes on async worker. + - `Repository.prototype.getSubmodules`: Retrieves all submodules on async worker. + - `Repository.prototype.refreshReferences`: Open sourced function from GitKraken. Grabs a lot of information about references on an async worker. + - `Revwalk.prototype.commitWalk`: Retrieves up to N commits from a revwalk on an async worker. +- When installing on a machine that has yarn and does not have npm, the preinstall script should succeed now +- `ceiling_dirs` is now an optional parameter to `Repository.discover` +- Added support for building on IBM i (PASE) machines +- Fixed leak where struct/option types were leaking libgit2 pointers +- Switched `NodeGit.Oid.fromString`'s internal implementation from `git_oid_fromstr` to `git_oid_fromstrp` +- Fixed builds for Electron 4 +- Updated `Signature.prototype.toString` to optionally include timestamps + +##### LibGit2 Bump +- Fixes gitignore issue with pattern negation +- `Remote.list` now gets the correct list of remotes if remotes are changed by external process +- Always use builtin regex for linux for portability +- Use Iconv on OSX for better internationalization support. +- Removed LibCurl from LibGit2: + - Now with built-in NTLM proxy support + - Now with built-in Negotiate/Kerberos proxy support + - Working with proxy URLs may be different as curl could auto detect scheme for proxies +- Various git config fixes +- Various git ignore fixes +- Various libgit2 performance improvements +- Windows/Linux now use PCRE for regex, OSX uses regcomp_l, this should address collation issues in diffing + +#### Merged PRs into NodeGit +- [Add deprecation warnings for enums that need them. #1711](https://github.com/nodegit/nodegit/pull/1711) +- [https://github.com/nodegit/nodegit/pull/1706](https://github.com/nodegit/nodegit/pull/1706) +- [Reintroduce Odb.prototype.addDiskAlternate #1695](https://github.com/nodegit/nodegit/pull/1695) +- [Fix behaviour of Repository#getReferences #1708](https://github.com/nodegit/nodegit/pull/1708) +- [Bump libgit2 #1705](https://github.com/nodegit/nodegit/pull/1705) +- [Fix Tree#createUpdated #1704](https://github.com/nodegit/nodegit/pull/1704) +- [Fix failing tests on CI #1703](https://github.com/nodegit/nodegit/pull/1703) +- [Audit lodash and fix package-lock.json #1702](https://github.com/nodegit/nodegit/pull/1702) +- [Implement support for Node 12 #1696](https://github.com/nodegit/nodegit/pull/1696) +- [Remove NSEC #1699](https://github.com/nodegit/nodegit/pull/1699) +- [Use builtin regex library for linux for better portability #1693](https://github.com/nodegit/nodegit/pull/1693) +- [Remove pcre-config from binding.gyp #1694](https://github.com/nodegit/nodegit/pull/1694) +- [refresh_references.cc: skip refs that can't be directly resolved #1689](https://github.com/nodegit/nodegit/pull/1689) +- [Bump libgit2 to fork of latest master #1690](https://github.com/nodegit/nodegit/pull/1690) +- [Bump libssh2 to 1.8.2 and fix some npm audit warnings #1678](https://github.com/nodegit/nodegit/pull/1678) +- [Root functions should keep their function prototypes correctly #1681](https://github.com/nodegit/nodegit/pull/1681) +- [refresh_references.cc: bust LibGit2 remote list cache by reading config #1685](https://github.com/nodegit/nodegit/pull/1685) +- [Implement faster file history walk #1676](https://github.com/nodegit/nodegit/pull/1676) +- [EOL for Node 6 and Ubuntu 14.04 #1649](https://github.com/nodegit/nodegit/pull/1649) +- [Ensures that commits from parent(*) has a repository #1658](https://github.com/nodegit/nodegit/pull/1658) +- [Update openssl conan distributions #1663](https://github.com/nodegit/nodegit/pull/1663) +- [Support signing in Repository#mergeBranches #1664](https://github.com/nodegit/nodegit/pull/1664) +- [Dependency upgrade node-gyp upgraded to 4.0.0 #1672](https://github.com/nodegit/nodegit/pull/1672) +- [Add additional getters to streamline information gathering (breaking change) #1671](https://github.com/nodegit/nodegit/pull/1671) +- [Clean up some dangerous memory accesses in callbacks #1642](https://github.com/nodegit/nodegit/pull/1642) +- [Output the item that was deprecated when giving deprecation notice #1643](https://github.com/nodegit/nodegit/pull/1643) +- [Don't fail yarn installs when we can't find npm #1644](https://github.com/nodegit/nodegit/pull/1644) +- [`ceiling_dirs` parameter in `Repository.discover` is optional #1245](https://github.com/nodegit/nodegit/pull/1245) +- [Add missing `shouldAlloc` declarations for git_merge_analysis* functions #1641](https://github.com/nodegit/nodegit/pull/1641) +- [Fix regex state causing subsequent runs of Tag.extractSignature to fail #1630](https://github.com/nodegit/nodegit/pull/1630) +- [Update LibGit2 docs to v0.28.0 #1631](https://github.com/nodegit/nodegit/pull/1631) +- [Add support for building on IBM i (PASE) #1634](https://github.com/nodegit/nodegit/pull/1634) +- [Expose more config methods #1635](https://github.com/nodegit/nodegit/pull/1635) +- [Catch errors and pass them to libgit2 as error codes in rebase signingcb #1636](https://github.com/nodegit/nodegit/pull/1636) +- [Simplify check for IBM i operating system #1637](https://github.com/nodegit/nodegit/pull/1637) +- [Bump LibGit2 to fork of v0.28.1 #1638](https://github.com/nodegit/nodegit/pull/1638) +- [We should clear the persistent cell in structs when they are destroyed #1629](https://github.com/nodegit/nodegit/pull/1629) +- [Fix "errorno" typo #1628](https://github.com/nodegit/nodegit/pull/1628) +- [Bump Libgit2 fork to v0.28.0 #1627](https://github.com/nodegit/nodegit/pull/1627) +- [Fix macOS and Windows Electron 4 builds #1626](https://github.com/nodegit/nodegit/pull/1626) +- [Fix non-existent / dangling refs cause Repository.prototype.createCommitWithSignature to fail #1624](https://github.com/nodegit/nodegit/pull/1624) +- [Handle new gyp information for electron builds #1623](https://github.com/nodegit/nodegit/pull/1623) +- [Use same API for signingCb in all places that can be crypto signed #1621](https://github.com/nodegit/nodegit/pull/1621) +- [Breaking: Repository.prototype.continueRebase enhancements #1619](https://github.com/nodegit/nodegit/pull/1619) +- [adds support for gpg commit signing (fixes #1018) #1448](https://github.com/nodegit/nodegit/pull/1448) +- [Add `updateRef` parameter to Repository#createCommitWithSignature #1610](https://github.com/nodegit/nodegit/pull/1610) +- [Documentation fixes. #1611](https://github.com/nodegit/nodegit/pull/1611) +- [Add Commit#amendWithSignature #1616](https://github.com/nodegit/nodegit/pull/1616) +- [Bump libgit2 to a preview of v0.28 #1615](https://github.com/nodegit/nodegit/pull/1615) +- [Fix issues with Commit#amendWithSignature #1617](https://github.com/nodegit/nodegit/pull/1617) +- [Marked Repository.createBlobFromBuffer as async #1614](https://github.com/nodegit/nodegit/pull/1614) +- [Add functionality for creating Tags with signatures and extracting signatures from Tags #1618](https://github.com/nodegit/nodegit/pull/1618) + +#### Merged PRs into LibGit2 +- [Add sign capability to git_rebase_commit #4913](https://github.com/libgit2/libgit2/pull/4913) +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [config_file: refresh when creating an iterator](https://github.com/libgit2/libgit2/pull/5181) +- [azure: drop powershell](https://github.com/libgit2/libgit2/pull/5141) +- [fuzzer: use futils instead of fileops](https://github.com/libgit2/libgit2/pull/5180) +- [w32: fix unlinking of directory symlinks](https://github.com/libgit2/libgit2/pull/5151) +- [patch_parse: fix segfault due to line containing static contents](https://github.com/libgit2/libgit2/pull/5179) +- [ignore: fix determining whether a shorter pattern negates another](https://github.com/libgit2/libgit2/pull/5173) +- [patch_parse: handle missing newline indicator in old file](https://github.com/libgit2/libgit2/pull/5159) +- [patch_parse: do not depend on parsed buffer's lifetime](https://github.com/libgit2/libgit2/pull/5158) +- [sha1: fix compilation of WinHTTP backend](https://github.com/libgit2/libgit2/pull/5174) +- [repository: do not initialize HEAD if it's provided by templates](https://github.com/libgit2/libgit2/pull/5176) +- [configuration: cvar -> configmap](https://github.com/libgit2/libgit2/pull/5138) +- [Evict cache items more efficiently](https://github.com/libgit2/libgit2/pull/5172) +- [clar: fix suite count](https://github.com/libgit2/libgit2/pull/5175) +- [Ignore VS2017 specific files and folders](https://github.com/libgit2/libgit2/pull/5163) +- [gitattributes: ignore macros defined in subdirectories](https://github.com/libgit2/libgit2/pull/5156) +- [clar: correctly account for "data" suites when counting](https://github.com/libgit2/libgit2/pull/5168) +- [Allocate memory more efficiently when packing objects](https://github.com/libgit2/libgit2/pull/5170) +- [fileops: fix creation of directory in filesystem root](https://github.com/libgit2/libgit2/pull/5131) +- [win32: fix fuzzers and have CI build them](https://github.com/libgit2/libgit2/pull/5160) +- [Config parser separation](https://github.com/libgit2/libgit2/pull/5134) +- [config_file: implement stat cache to avoid repeated rehashing](https://github.com/libgit2/libgit2/pull/5132) +- [ci: build with ENABLE_WERROR on Windows](https://github.com/libgit2/libgit2/pull/5143) +- [Fix Regression: attr: Correctly load system attr file (on Windows)](https://github.com/libgit2/libgit2/pull/5152) +- [hash: fix missing error return on production builds](https://github.com/libgit2/libgit2/pull/5145) +- [Resolve static check warnings in example code](https://github.com/libgit2/libgit2/pull/5142) +- [Multiple hash algorithms](https://github.com/libgit2/libgit2/pull/4438) +- [More documentation](https://github.com/libgit2/libgit2/pull/5128) +- [Incomplete commondir support](https://github.com/libgit2/libgit2/pull/4967) +- [Remove warnings](https://github.com/libgit2/libgit2/pull/5078) +- [Re-run flaky tests](https://github.com/libgit2/libgit2/pull/5140) +- [errors: use lowercase](https://github.com/libgit2/libgit2/pull/5137) +- [largefile tests: only write 2GB on 32-bit platforms](https://github.com/libgit2/libgit2/pull/5136) +- [Fix broken link in README](https://github.com/libgit2/libgit2/pull/5129) +- [net: remove unused `git_headlist_cb`](https://github.com/libgit2/libgit2/pull/5122) +- [cmake: default NTLM client to off if no HTTPS support](https://github.com/libgit2/libgit2/pull/5124) +- [attr: rename constants and macros for consistency](https://github.com/libgit2/libgit2/pull/5119) +- [Change API instances of `fromnoun` to `from_noun` (with an underscore)](https://github.com/libgit2/libgit2/pull/5117) +- [object: rename git_object__size to git_object_size](https://github.com/libgit2/libgit2/pull/5118) +- [Replace fnmatch with wildmatch](https://github.com/libgit2/libgit2/pull/5110) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/5111) +- [Removal of `p_fallocate`](https://github.com/libgit2/libgit2/pull/5114) +- [Modularize our TLS & hash detection](https://github.com/libgit2/libgit2/pull/5055) +- [tests: merge::analysis: use test variants to avoid duplicated test suites](https://github.com/libgit2/libgit2/pull/5109) +- [Rename options initialization functions](https://github.com/libgit2/libgit2/pull/5101) +- [deps: ntlmclient: disable implicit fallthrough warnings](https://github.com/libgit2/libgit2/pull/5112) +- [gitignore with escapes](https://github.com/libgit2/libgit2/pull/5097) +- [Handle URLs with a colon after host but no port](https://github.com/libgit2/libgit2/pull/5108) +- [Merge analysis support for bare repos](https://github.com/libgit2/libgit2/pull/5022) +- [Add memleak check docs](https://github.com/libgit2/libgit2/pull/5104) +- [Data-driven tests](https://github.com/libgit2/libgit2/pull/5098) +- [sha1dc: update to fix endianess issues on AIX/HP-UX](https://github.com/libgit2/libgit2/pull/5107) +- [Add NTLM support for HTTP(s) servers and proxies](https://github.com/libgit2/libgit2/pull/5052) +- [Callback type names should be suffixed with `_cb`](https://github.com/libgit2/libgit2/pull/5102) +- [tests: checkout: fix symlink.git being created outside of sandbox](https://github.com/libgit2/libgit2/pull/5099) +- [ignore: handle escaped trailing whitespace](https://github.com/libgit2/libgit2/pull/5095) +- [Ignore: only treat one leading slash as a root identifier](https://github.com/libgit2/libgit2/pull/5074) +- [online tests: use gitlab for auth failures](https://github.com/libgit2/libgit2/pull/5094) +- [Ignore files: don't ignore whitespace](https://github.com/libgit2/libgit2/pull/5076) +- [cache: fix cache eviction using deallocated key](https://github.com/libgit2/libgit2/pull/5088) +- [SECURITY.md: split out security-relevant bits from readme](https://github.com/libgit2/libgit2/pull/5085) +- [Restore NetBSD support](https://github.com/libgit2/libgit2/pull/5086) +- [repository: fix garbage return value](https://github.com/libgit2/libgit2/pull/5084) +- [cmake: disable fallthrough warnings for PCRE](https://github.com/libgit2/libgit2/pull/5083) +- [Configuration parsing: validate section headers with quotes](https://github.com/libgit2/libgit2/pull/5073) +- [Loosen restriction on wildcard "*" refspecs](https://github.com/libgit2/libgit2/pull/5060) +- [Use PCRE for our fallback regex engine when regcomp_l is unavailable](https://github.com/libgit2/libgit2/pull/4935) +- [Remote URL last-chance resolution](https://github.com/libgit2/libgit2/pull/5062) +- [Skip UTF8 BOM in ignore files](https://github.com/libgit2/libgit2/pull/5075) +- [We've already added `ZLIB_LIBRARIES` to `LIBGIT2_LIBS` so don't also add the `z` library](https://github.com/libgit2/libgit2/pull/5080) +- [Define SYMBOLIC_LINK_FLAG_DIRECTORY if required](https://github.com/libgit2/libgit2/pull/5077) +- [Support symlinks for directories in win32](https://github.com/libgit2/libgit2/pull/5065) +- [rebase: orig_head and onto accessors](https://github.com/libgit2/libgit2/pull/5057) +- [cmake: correctly detect if system provides `regcomp`](https://github.com/libgit2/libgit2/pull/5063) +- [Correctly write to missing locked global config](https://github.com/libgit2/libgit2/pull/5023) +- [[RFC] util: introduce GIT_DOWNCAST macro](https://github.com/libgit2/libgit2/pull/4561) +- [examples: implement SSH authentication](https://github.com/libgit2/libgit2/pull/5051) +- [git_repository_init: stop traversing at windows root](https://github.com/libgit2/libgit2/pull/5050) +- [config_file: check result of git_array_alloc](https://github.com/libgit2/libgit2/pull/5053) +- [patch_parse.c: Handle CRLF in parse_header_start](https://github.com/libgit2/libgit2/pull/5027) +- [fix typo](https://github.com/libgit2/libgit2/pull/5045) +- [sha1: don't inline `git_hash_global_init` for win32](https://github.com/libgit2/libgit2/pull/5039) +- [ignore: treat paths with trailing "/" as directories](https://github.com/libgit2/libgit2/pull/5040) +- [Test that largefiles can be read through the tree API](https://github.com/libgit2/libgit2/pull/4874) +- [Tests for symlinked user config](https://github.com/libgit2/libgit2/pull/5034) +- [patch_parse: fix parsing addition/deletion of file with space](https://github.com/libgit2/libgit2/pull/5035) +- [Optimize string comparisons](https://github.com/libgit2/libgit2/pull/5018) +- [Negation of subdir ignore causes other subdirs to be unignored](https://github.com/libgit2/libgit2/pull/5020) +- [xdiff: fix typo](https://github.com/libgit2/libgit2/pull/5024) +- [docs: clarify relation of safe and forced checkout strategy](https://github.com/libgit2/libgit2/pull/5032) +- [Each hash implementation should define `git_hash_global_init`](https://github.com/libgit2/libgit2/pull/5026) +- [[Doc] Update URL to git2-rs](https://github.com/libgit2/libgit2/pull/5012) +- [remote: Rename git_remote_completion_type to _t](https://github.com/libgit2/libgit2/pull/5008) +- [odb: provide a free function for custom backends](https://github.com/libgit2/libgit2/pull/5005) +- [Have git_branch_lookup accept GIT_BRANCH_ALL](https://github.com/libgit2/libgit2/pull/5000) +- [Rename git_transfer_progress to git_indexer_progress](https://github.com/libgit2/libgit2/pull/4997) +- [High-level map APIs](https://github.com/libgit2/libgit2/pull/4901) +- [refdb_fs: fix loose/packed refs lookup racing with repacks](https://github.com/libgit2/libgit2/pull/4984) +- [Allocator restructuring](https://github.com/libgit2/libgit2/pull/4998) +- [cache: fix misnaming of `git_cache_free`](https://github.com/libgit2/libgit2/pull/4992) +- [examples: produce single cgit2 binary](https://github.com/libgit2/libgit2/pull/4956) +- [Remove public 'inttypes.h' header](https://github.com/libgit2/libgit2/pull/4991) +- [Prevent reading out of bounds memory](https://github.com/libgit2/libgit2/pull/4996) +- [Fix a memory leak in odb_otype_fast()](https://github.com/libgit2/libgit2/pull/4987) +- [Make stdalloc__reallocarray call stdalloc__realloc](https://github.com/libgit2/libgit2/pull/4986) +- [Remove `git_time_monotonic`](https://github.com/libgit2/libgit2/pull/4990) +- [Fix a _very_ improbable memory leak in git_odb_new()](https://github.com/libgit2/libgit2/pull/4988) +- [ci: publish documentation on merge](https://github.com/libgit2/libgit2/pull/4989) +- [Enable creation of worktree from bare repo's default branch](https://github.com/libgit2/libgit2/pull/4982) +- [Allow bypassing check for '.keep' file](https://github.com/libgit2/libgit2/pull/4965) +- [Deprecation: export the deprecated functions properly](https://github.com/libgit2/libgit2/pull/4979) +- [ci: skip ssh tests on macOS nightly](https://github.com/libgit2/libgit2/pull/4980) +- [CI build fixups](https://github.com/libgit2/libgit2/pull/4976) +- [v0.28 rc1](https://github.com/libgit2/libgit2/pull/4970) +- [Docs](https://github.com/libgit2/libgit2/pull/4968) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/4954) +- [ci: add an individual coverity pipeline](https://github.com/libgit2/libgit2/pull/4964) +- [ci: run docurium to create documentation](https://github.com/libgit2/libgit2/pull/4961) +- [ci: return coverity to the nightlies](https://github.com/libgit2/libgit2/pull/4962) +- [Clean up some warnings](https://github.com/libgit2/libgit2/pull/4950) +- [Nightlies: use `latest` docker images](https://github.com/libgit2/libgit2/pull/4869) +- [index: preserve extension parsing errors](https://github.com/libgit2/libgit2/pull/4858) +- [Deprecate functions and constants more gently](https://github.com/libgit2/libgit2/pull/4952) +- [Don't use deprecated constants](https://github.com/libgit2/libgit2/pull/4957) +- [Fix VS warning C4098: 'giterr_set_str' : void function returning a value](https://github.com/libgit2/libgit2/pull/4955) +- [Move `giterr` to `git_error`](https://github.com/libgit2/libgit2/pull/4917) +- [odb: Fix odb foreach to also close on positive error code](https://github.com/libgit2/libgit2/pull/4949) +- [repository: free memory in symlink detection function](https://github.com/libgit2/libgit2/pull/4948) +- [ci: update poxyproxy, run in quiet mode](https://github.com/libgit2/libgit2/pull/4947) +- [Add/multiply with overflow tweaks](https://github.com/libgit2/libgit2/pull/4945) +- [Improve deprecation of old enums](https://github.com/libgit2/libgit2/pull/4944) +- [Move `git_ref_t` to `git_reference_t`](https://github.com/libgit2/libgit2/pull/4939) +- [More `git_obj` to `git_object` updates](https://github.com/libgit2/libgit2/pull/4940) +- [ci: only run invasive tests in nightly](https://github.com/libgit2/libgit2/pull/4943) +- [Always build a cdecl library](https://github.com/libgit2/libgit2/pull/4930) +- [changelog: document changes since 0.27](https://github.com/libgit2/libgit2/pull/4932) +- [Fix a bunch of warnings](https://github.com/libgit2/libgit2/pull/4925) +- [mailmap: prefer ethomson@edwardthomson.com](https://github.com/libgit2/libgit2/pull/4941) +- [Convert tests/resources/push.sh to LF endings](https://github.com/libgit2/libgit2/pull/4937) +- [Get rid of some test files that were accidentally committed](https://github.com/libgit2/libgit2/pull/4936) +- [Fix crash on remote connection when GIT_PROXY_AUTO is set but no proxy is detected](https://github.com/libgit2/libgit2/pull/4934) +- [Make ENABLE_WERROR actually work](https://github.com/libgit2/libgit2/pull/4924) +- [Remove unconditional -Wno-deprecated-declaration on macOS](https://github.com/libgit2/libgit2/pull/4931) +- [Fix warning 'function': incompatible types - from 'git_cvar_value *' to 'int *' (C4133) on VS](https://github.com/libgit2/libgit2/pull/4926) +- [Fix Linux warnings](https://github.com/libgit2/libgit2/pull/4928) +- [Coverity fixes](https://github.com/libgit2/libgit2/pull/4922) +- [Shutdown callback count](https://github.com/libgit2/libgit2/pull/4919) +- [Update CRLF filtering to match modern git](https://github.com/libgit2/libgit2/pull/4904) +- [refdb_fs: refactor error handling in `refdb_reflog_fs__delete`](https://github.com/libgit2/libgit2/pull/4915) +- [Remove empty (sub-)directories when deleting refs](https://github.com/libgit2/libgit2/pull/4833) +- [Support creating annotated commits from annotated tags](https://github.com/libgit2/libgit2/pull/4910) +- [Fix segfault in loose_backend__readstream](https://github.com/libgit2/libgit2/pull/4906) +- [make proxy_stream_close close target stream even on errors](https://github.com/libgit2/libgit2/pull/4905) +- [Index API updates for consistency](https://github.com/libgit2/libgit2/pull/4807) +- [Allow merge analysis against any reference](https://github.com/libgit2/libgit2/pull/4770) +- [revwalk: Allow changing hide_cb](https://github.com/libgit2/libgit2/pull/4888) +- [Unused function warnings](https://github.com/libgit2/libgit2/pull/4895) +- [Add builtin proxy support for the http transport](https://github.com/libgit2/libgit2/pull/4870) +- [config: fix adding files if their parent directory is a file](https://github.com/libgit2/libgit2/pull/4898) +- [Allow certificate and credential callbacks to decline to act](https://github.com/libgit2/libgit2/pull/4879) +- [Fix warning C4133 incompatible types in MSVC](https://github.com/libgit2/libgit2/pull/4896) +- [index: introduce git_index_iterator](https://github.com/libgit2/libgit2/pull/4884) +- [commit: fix out-of-bound reads when parsing truncated author fields](https://github.com/libgit2/libgit2/pull/4894) +- [tests: 🌀 address two null argument instances #4847](https://github.com/libgit2/libgit2/pull/4847) +- [Some OpenSSL issues](https://github.com/libgit2/libgit2/pull/4875) +- [worktree: Expose git_worktree_add_init_options](https://github.com/libgit2/libgit2/pull/4892) +- [transport/http: Include non-default ports in Host header](https://github.com/libgit2/libgit2/pull/4882) +- [Support symlinks on Windows when core.symlinks=true](https://github.com/libgit2/libgit2/pull/4713) +- [strntol: fix out-of-bounds reads when parsing numbers with leading sign](https://github.com/libgit2/libgit2/pull/4886) +- [apply: small fixups in the test suite](https://github.com/libgit2/libgit2/pull/4885) +- [signature: fix out-of-bounds read when parsing timezone offset](https://github.com/libgit2/libgit2/pull/4883) +- [Remote creation API](https://github.com/libgit2/libgit2/pull/4667) +- [Index collision fixes](https://github.com/libgit2/libgit2/pull/4818) +- [Patch (diff) application](https://github.com/libgit2/libgit2/pull/4705) +- [smart transport: only clear url on hard reset (regression)](https://github.com/libgit2/libgit2/pull/4880) +- [Tree parsing fixes](https://github.com/libgit2/libgit2/pull/4871) +- [CI: Fix macOS leak detection](https://github.com/libgit2/libgit2/pull/4860) +- [README: more CI status badges](https://github.com/libgit2/libgit2/pull/4800) +- [ci: Fix some minor issues](https://github.com/libgit2/libgit2/pull/4867) +- [Object parse fixes](https://github.com/libgit2/libgit2/pull/4864) +- [Windows CI: fail build on test failure](https://github.com/libgit2/libgit2/pull/4862) +- [ci: run all the jobs during nightly builds](https://github.com/libgit2/libgit2/pull/4863) +- [strtol removal](https://github.com/libgit2/libgit2/pull/4851) +- [ buf::oom tests: use custom allocator for oom failures](https://github.com/libgit2/libgit2/pull/4854) +- [ci: arm docker builds](https://github.com/libgit2/libgit2/pull/4804) +- [Win32 path canonicalization refactoring](https://github.com/libgit2/libgit2/pull/4852) +- [Check object existence when creating a tree from an index](https://github.com/libgit2/libgit2/pull/4840) +- [Ninja build](https://github.com/libgit2/libgit2/pull/4841) +- [docs: fix transparent/opaque confusion in the conventions file](https://github.com/libgit2/libgit2/pull/4853) +- [Configuration variables can appear on the same line as the section header](https://github.com/libgit2/libgit2/pull/4819) +- [path: export the dotgit-checking functions](https://github.com/libgit2/libgit2/pull/4849) +- [cmake: correct comment from libssh to libssh2](https://github.com/libgit2/libgit2/pull/4850) +- [Object parsing fuzzer](https://github.com/libgit2/libgit2/pull/4845) +- [config: Port config_file_fuzzer to the new in-memory backend.](https://github.com/libgit2/libgit2/pull/4842) +- [Add some more tests for git_futils_rmdir_r and some cleanup](https://github.com/libgit2/libgit2/pull/4828) +- [diff_stats: use git's formatting of renames with common directories](https://github.com/libgit2/libgit2/pull/4830) +- [ignore unsupported http authentication contexts](https://github.com/libgit2/libgit2/pull/4839) +- [submodule: ignore path and url attributes if they look like options](https://github.com/libgit2/libgit2/pull/4837) +- [Smart packet security fixes](https://github.com/libgit2/libgit2/pull/4836) +- [config_file: properly ignore includes without "path" value](https://github.com/libgit2/libgit2/pull/4832) +- [int-conversion](https://github.com/libgit2/libgit2/pull/4831) +- [cmake: enable new quoted argument policy CMP0054](https://github.com/libgit2/libgit2/pull/4829) +- [fix check if blob is uninteresting when inserting tree to packbuilder](https://github.com/libgit2/libgit2/pull/4824) +- [Documentation fixups](https://github.com/libgit2/libgit2/pull/4827) +- [CI: refactoring](https://github.com/libgit2/libgit2/pull/4812) +- [In-memory configuration](https://github.com/libgit2/libgit2/pull/4767) +- [Some warnings](https://github.com/libgit2/libgit2/pull/4784) +- [index: release the snapshot instead of freeing the index](https://github.com/libgit2/libgit2/pull/4803) +- [online::clone: free url and username before resetting](https://github.com/libgit2/libgit2/pull/4816) +- [git_remote_prune to be O(n * logn)](https://github.com/libgit2/libgit2/pull/4794) +- [Rename "VSTS" to "Azure DevOps" and "Azure Pipelines"](https://github.com/libgit2/libgit2/pull/4813) +- [cmake: enable -Wformat and -Wformat-security](https://github.com/libgit2/libgit2/pull/4810) +- [Fix revwalk limiting regression](https://github.com/libgit2/libgit2/pull/4809) +- [path validation: `char` is not signed by default.](https://github.com/libgit2/libgit2/pull/4805) +- [revwalk: refer the sorting modes more to git's options](https://github.com/libgit2/libgit2/pull/4811) +- [Clar XML output redux](https://github.com/libgit2/libgit2/pull/4778) +- [remote: store the connection data in a private struct](https://github.com/libgit2/libgit2/pull/4785) +- [docs: clarify and include licenses of dependencies](https://github.com/libgit2/libgit2/pull/4789) +- [config_file: fix quadratic behaviour when adding config multivars](https://github.com/libgit2/libgit2/pull/4799) +- [config: Fix a leak parsing multi-line config entries](https://github.com/libgit2/libgit2/pull/4792) +- [Prevent heap-buffer-overflow](https://github.com/libgit2/libgit2/pull/4797) +- [ci: remove travis](https://github.com/libgit2/libgit2/pull/4790) +- [Update VSTS YAML files with the latest syntax](https://github.com/libgit2/libgit2/pull/4791) +- [Documentation fixes](https://github.com/libgit2/libgit2/pull/4788) +- [config: convert unbounded recursion into a loop](https://github.com/libgit2/libgit2/pull/4781) +- [Document giterr_last() use only after error. #4772](https://github.com/libgit2/libgit2/pull/4773) +- [util: make the qsort_r check work on macOS](https://github.com/libgit2/libgit2/pull/4765) +- [fuzzer: update for indexer changes](https://github.com/libgit2/libgit2/pull/4782) +- [tree: accept null ids in existing trees when updating](https://github.com/libgit2/libgit2/pull/4727) +- [Pack file verification](https://github.com/libgit2/libgit2/pull/4374) +- [cmake: detect and use libc-provided iconv](https://github.com/libgit2/libgit2/pull/4777) +- [Coverity flavored clang analyzer fixes](https://github.com/libgit2/libgit2/pull/4774) +- [tests: verify adding index conflicts with invalid filemodes fails](https://github.com/libgit2/libgit2/pull/4776) +- [worktree: unlock should return 1 when the worktree isn't locked](https://github.com/libgit2/libgit2/pull/4769) +- [Add a fuzzer for config files](https://github.com/libgit2/libgit2/pull/4752) +- [Fix 'invalid packet line' for ng packets containing errors](https://github.com/libgit2/libgit2/pull/4763) +- [Fix leak in index.c](https://github.com/libgit2/libgit2/pull/4768) +- [threads::diff: use separate git_repository objects](https://github.com/libgit2/libgit2/pull/4754) +- [travis: remove Coverity cron job](https://github.com/libgit2/libgit2/pull/4766) +- [parse: Do not initialize the content in context to NULL](https://github.com/libgit2/libgit2/pull/4749) +- [config_file: Don't crash on options without a section](https://github.com/libgit2/libgit2/pull/4750) +- [ci: Correct the status code check so Coverity doesn't force-fail Travis](https://github.com/libgit2/libgit2/pull/4764) +- [ci: remove appveyor](https://github.com/libgit2/libgit2/pull/4760) +- [diff: fix OOM on AIX when finding similar deltas in empty diff](https://github.com/libgit2/libgit2/pull/4761) +- [travis: do not execute Coverity analysis for all cron jobs](https://github.com/libgit2/libgit2/pull/4755) +- [ci: enable compilation with "-Werror"](https://github.com/libgit2/libgit2/pull/4759) +- [smart_pkt: fix potential OOB-read when processing ng packet](https://github.com/libgit2/libgit2/pull/4758) +- [Fix a double-free in config parsing](https://github.com/libgit2/libgit2/pull/4751) +- [Fuzzers](https://github.com/libgit2/libgit2/pull/4728) +- [ci: run VSTS builds on master and maint branches](https://github.com/libgit2/libgit2/pull/4746) +- [Windows: default credentials / fallback credential handling](https://github.com/libgit2/libgit2/pull/4743) +- [ci: add VSTS build badge to README](https://github.com/libgit2/libgit2/pull/4745) +- [ci: set PKG_CONFIG_PATH for travis](https://github.com/libgit2/libgit2/pull/4744) +- [CI: Refactor and introduce VSTS builds](https://github.com/libgit2/libgit2/pull/4723) +- [revwalk: remove tautologic condition for hiding a commit](https://github.com/libgit2/libgit2/pull/4742) +- [winhttp: retry erroneously failing requests](https://github.com/libgit2/libgit2/pull/4731) +- [Add a configurable limit to the max pack size that will be indexed](https://github.com/libgit2/libgit2/pull/4721) +- [mbedtls: remove unused variable "cacert"](https://github.com/libgit2/libgit2/pull/4739) +- [Squash some leaks](https://github.com/libgit2/libgit2/pull/4732) +- [Add a checkout example](https://github.com/libgit2/libgit2/pull/4692) +- [Assorted Coverity fixes](https://github.com/libgit2/libgit2/pull/4702) +- [Remove GIT_PKT_PACK entirely](https://github.com/libgit2/libgit2/pull/4704) +- [ ignore: improve `git_ignore_path_is_ignored` description Git analogy](https://github.com/libgit2/libgit2/pull/4722) +- [alloc: don't overwrite allocator during init if set](https://github.com/libgit2/libgit2/pull/4724) +- [C90 standard compliance](https://github.com/libgit2/libgit2/pull/4700) +- [Delta OOB access](https://github.com/libgit2/libgit2/pull/4719) +- [Release v0.27.3](https://github.com/libgit2/libgit2/pull/4717) +- [streams: report OpenSSL errors if global init fails](https://github.com/libgit2/libgit2/pull/4710) +- [patch_parse: populate line numbers while parsing diffs](https://github.com/libgit2/libgit2/pull/4687) +- [Fix git_worktree_validate failing on bare repositories](https://github.com/libgit2/libgit2/pull/4686) +- [git_refspec_transform: Handle NULL dst](https://github.com/libgit2/libgit2/pull/4699) +- [Add a "dirty" state to the index when it has unsaved changes](https://github.com/libgit2/libgit2/pull/4536) +- [refspec: rename `git_refspec__free` to `git_refspec__dispose`](https://github.com/libgit2/libgit2/pull/4709) +- [streams: openssl: Handle error in SSL_CTX_new](https://github.com/libgit2/libgit2/pull/4701) +- [refspec: add public parsing api](https://github.com/libgit2/libgit2/pull/4519) +- [Fix interaction between limited flag and sorting over resets](https://github.com/libgit2/libgit2/pull/4688) +- [deps: fix implicit fallthrough warning in http-parser](https://github.com/libgit2/libgit2/pull/4691) +- [Fix assorted leaks found via fuzzing](https://github.com/libgit2/libgit2/pull/4698) +- [Fix type confusion in git_smart__connect](https://github.com/libgit2/libgit2/pull/4695) +- [Verify ref_pkt's are long enough](https://github.com/libgit2/libgit2/pull/4696) +- [Config parser cleanups](https://github.com/libgit2/libgit2/pull/4411) +- [Fix last references to deprecated git_buf_free](https://github.com/libgit2/libgit2/pull/4685) +- [revwalk: avoid walking the entire history when output is unsorted](https://github.com/libgit2/libgit2/pull/4606) +- [Add mailmap support.](https://github.com/libgit2/libgit2/pull/4586) +- [tree: remove unused functions](https://github.com/libgit2/libgit2/pull/4683) +- [Link `mbedTLS` libraries in when `SHA1_BACKEND` == "mbedTLS"](https://github.com/libgit2/libgit2/pull/4678) +- [editorconfig: allow trailing whitespace in markdown](https://github.com/libgit2/libgit2/pull/4676) +- [docs: fix statement about tab width](https://github.com/libgit2/libgit2/pull/4681) +- [diff: fix enum value being out of allowed range](https://github.com/libgit2/libgit2/pull/4680) +- [pack: rename `git_packfile_stream_free`](https://github.com/libgit2/libgit2/pull/4436) +- [Stop leaking the memory](https://github.com/libgit2/libgit2/pull/4677) +- [Bugfix release v0.27.2](https://github.com/libgit2/libgit2/pull/4632) +- [Fix stash save bug with fast path index check](https://github.com/libgit2/libgit2/pull/4668) +- [path: unify `git_path_is_*` APIs](https://github.com/libgit2/libgit2/pull/4662) +- [Fix negative gitignore rules with leading directories ](https://github.com/libgit2/libgit2/pull/4670) +- [Custom memory allocators](https://github.com/libgit2/libgit2/pull/4576) +- [index: Fix alignment issues in write_disk_entry()](https://github.com/libgit2/libgit2/pull/4655) +- [travis: war on leaks](https://github.com/libgit2/libgit2/pull/4558) +- [refdb_fs: fix regression: failure when globbing for non-existant references](https://github.com/libgit2/libgit2/pull/4665) +- [tests: submodule: do not rely on config iteration order](https://github.com/libgit2/libgit2/pull/4673) +- [Detect duplicated submodules for the same path](https://github.com/libgit2/libgit2/pull/4641) +- [Fix docurium missing includes](https://github.com/libgit2/libgit2/pull/4530) +- [github: update issue template](https://github.com/libgit2/libgit2/pull/4627) +- [streams: openssl: add missing check on OPENSSL_LEGACY_API](https://github.com/libgit2/libgit2/pull/4661) +- [mbedtls: don't require mbedtls from our pkgconfig file](https://github.com/libgit2/libgit2/pull/4656) +- [Fixes for CVE 2018-11235](https://github.com/libgit2/libgit2/pull/4660) +- [Backport fixes for CVE 2018-11235](https://github.com/libgit2/libgit2/pull/4659) +- [Added note about Windows junction points to the differences from git document](https://github.com/libgit2/libgit2/pull/4653) +- [cmake: resolve libraries found by pkg-config ](https://github.com/libgit2/libgit2/pull/4642) +- [refdb_fs: enhance performance of globbing](https://github.com/libgit2/libgit2/pull/4629) +- [global: adjust init count under lock](https://github.com/libgit2/libgit2/pull/4645) +- [Fix GCC 8.1 warnings](https://github.com/libgit2/libgit2/pull/4646) +- [Worktrees can be made from bare repositories](https://github.com/libgit2/libgit2/pull/4630) +- [docs: add documentation to state differences from the git cli](https://github.com/libgit2/libgit2/pull/4605) +- [Sanitize the hunk header to ensure it contains UTF-8 valid data](https://github.com/libgit2/libgit2/pull/4542) +- [examples: ls-files: add ls-files to list paths in the index](https://github.com/libgit2/libgit2/pull/4380) +- [OpenSSL legacy API cleanups](https://github.com/libgit2/libgit2/pull/4608) +- [worktree: add functions to get name and path](https://github.com/libgit2/libgit2/pull/4640) +- [Fix deletion of unrelated branch on worktree](https://github.com/libgit2/libgit2/pull/4633) +- [mbedTLS support](https://github.com/libgit2/libgit2/pull/4173) +- [Configuration entry iteration in order](https://github.com/libgit2/libgit2/pull/4525) +- [blame_git: fix coalescing step never being executed](https://github.com/libgit2/libgit2/pull/4580) +- [Fix leaks in master](https://github.com/libgit2/libgit2/pull/4636) +- [Leak fixes for v0.27.1](https://github.com/libgit2/libgit2/pull/4635) +- [worktree: Read worktree specific reflog for HEAD](https://github.com/libgit2/libgit2/pull/4577) +- [fixed stack smashing due to wrong size of struct stat on the stack](https://github.com/libgit2/libgit2/pull/4631) +- [scripts: add backporting script](https://github.com/libgit2/libgit2/pull/4476) +- [worktree: add ability to create worktree with pre-existing branch](https://github.com/libgit2/libgit2/pull/4524) +- [refs: preserve the owning refdb when duping reference](https://github.com/libgit2/libgit2/pull/4618) +- [Submodules-API should report .gitmodules parse errors instead of ignoring them](https://github.com/libgit2/libgit2/pull/4522) +- [Typedef git_pkt_type and clarify recv_pkt return type](https://github.com/libgit2/libgit2/pull/4514) +- [online::clone: validate user:pass in HTTP_PROXY](https://github.com/libgit2/libgit2/pull/4556) +- [ transports: ssh: disconnect session before freeing it ](https://github.com/libgit2/libgit2/pull/4596) +- [revwalk: fix uninteresting revs sometimes not limiting graphwalk](https://github.com/libgit2/libgit2/pull/4622) +- [attr_file: fix handling of directory patterns with trailing spaces](https://github.com/libgit2/libgit2/pull/4614) +- [transports: local: fix assert when fetching into repo with symrefs](https://github.com/libgit2/libgit2/pull/4613) +- [remote/proxy: fix git_transport_certificate_check_db description](https://github.com/libgit2/libgit2/pull/4597) +- [Flag options in describe.h as being optional](https://github.com/libgit2/libgit2/pull/4587) +- [diff: Add missing GIT_DELTA_TYPECHANGE -> 'T' mapping.](https://github.com/libgit2/libgit2/pull/4611) +- [appveyor: fix typo in registry key to disable DHE](https://github.com/libgit2/libgit2/pull/4609) +- [Fix build with LibreSSL 2.7](https://github.com/libgit2/libgit2/pull/4607) +- [appveyor: workaround for intermittent test failures](https://github.com/libgit2/libgit2/pull/4603) +- [sha1dc: update to fix errors with endianess](https://github.com/libgit2/libgit2/pull/4601) +- [submodule: check index for path and prefix before adding submodule](https://github.com/libgit2/libgit2/pull/4378) +- [odb: mempack: fix leaking objects when freeing mempacks](https://github.com/libgit2/libgit2/pull/4602) +- [types: remove unused git_merge_result](https://github.com/libgit2/libgit2/pull/4598) +- [checkout: change default strategy to SAFE](https://github.com/libgit2/libgit2/pull/4531) +- [Add myself to git.git-authors](https://github.com/libgit2/libgit2/pull/4570) + + ## v0.25.0-alpha.16 [(2019-07-23)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0-alpha.16) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0-alpha.15...v0.25.0-alpha.16) diff --git a/package-lock.json b/package-lock.json index 91993080b..a54150f19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0-alpha.16", + "version": "0.25.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f334970ca..b055e829f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0-alpha.16", + "version": "0.25.0", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From a0057b5dff038e6d1436ef3d09226b404dca2a1d Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 12 Aug 2019 09:08:36 -0700 Subject: [PATCH 154/545] Bump libgit2 to fork of master with v0.28.3 patches --- generate/input/libgit2-docs.json | 303 +++++++++++++++++++------------ vendor/libgit2 | 2 +- vendor/libgit2.gyp | 1 + 3 files changed, 191 insertions(+), 115 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 6f40724ce..b4f82110a 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -178,10 +178,11 @@ "git_commit_amend", "git_commit_create_buffer", "git_commit_create_with_signature", - "git_commit_dup" + "git_commit_dup", + "git_commit_signing_cb" ], "meta": {}, - "lines": 502 + "lines": 524 }, { "file": "git2/common.h", @@ -261,12 +262,13 @@ "giterr_clear", "giterr_set_str", "giterr_set_oom", + "git_object__size", "git_oid_iszero", "git_headlist_cb", "git_blame_init_options" ], "meta": {}, - "lines": 437 + "lines": 449 }, { "file": "git2/describe.h", @@ -540,12 +542,11 @@ "git_object_type2string", "git_object_string2type", "git_object_typeisloose", - "git_object_size", "git_object_peel", "git_object_dup" ], "meta": {}, - "lines": 237 + "lines": 223 }, { "file": "git2/odb.h", @@ -725,7 +726,7 @@ "git_rebase_free" ], "meta": {}, - "lines": 347 + "lines": 363 }, { "file": "git2/refdb.h", @@ -2969,7 +2970,8 @@ "group": "buf", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_buf_dispose-1" + "ex/HEAD/diff.html#git_buf_dispose-1", + "ex/HEAD/diff.html#git_buf_dispose-2" ], "tag.c": [ "ex/HEAD/tag.html#git_buf_dispose-1" @@ -4434,8 +4436,8 @@ "git_commit_create_with_signature": { "type": "function", "file": "git2/commit.h", - "line": 488, - "lineto": 493, + "line": 489, + "lineto": 494, "args": [ { "name": "out", @@ -4455,7 +4457,7 @@ { "name": "signature", "type": "const char *", - "comment": "the signature to add to the commit" + "comment": "the signature to add to the commit. Leave `NULL`\n to create a commit without adding a signature field." }, { "name": "signature_field", @@ -4476,8 +4478,8 @@ "git_commit_dup": { "type": "function", "file": "git2/commit.h", - "line": 502, - "lineto": 502, + "line": 503, + "lineto": 503, "args": [ { "name": "out", @@ -6053,8 +6055,8 @@ "git_oid_iszero": { "type": "function", "file": "git2/deprecated.h", - "line": 378, - "lineto": 378, + "line": 390, + "lineto": 390, "args": [ { "name": "id", @@ -6075,8 +6077,8 @@ "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 437, - "lineto": 437, + "line": 449, + "lineto": 449, "args": [ { "name": "opts", @@ -6373,7 +6375,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_free-2" + "ex/HEAD/diff.html#git_diff_free-3" ], "log.c": [ "ex/HEAD/log.html#git_diff_free-25", @@ -6424,7 +6426,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_tree-3" + "ex/HEAD/diff.html#git_diff_tree_to_tree-4" ], "log.c": [ "ex/HEAD/log.html#git_diff_tree_to_tree-27", @@ -6475,7 +6477,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_index-4" + "ex/HEAD/diff.html#git_diff_tree_to_index-5" ] } }, @@ -6517,7 +6519,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_index_to_workdir-5" + "ex/HEAD/diff.html#git_diff_index_to_workdir-6" ] } }, @@ -6559,7 +6561,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir-6" + "ex/HEAD/diff.html#git_diff_tree_to_workdir-7" ] } }, @@ -6601,7 +6603,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir_with_index-7" + "ex/HEAD/diff.html#git_diff_tree_to_workdir_with_index-8" ] } }, @@ -6702,7 +6704,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_find_similar-8" + "ex/HEAD/diff.html#git_diff_find_similar-9" ] } }, @@ -6916,7 +6918,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_print-9" + "ex/HEAD/diff.html#git_diff_print-10" ], "log.c": [ "ex/HEAD/log.html#git_diff_print-30" @@ -7201,7 +7203,12 @@ }, "description": "

Read the contents of a git patch file into a git_diff object.

\n", "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", - "group": "diff" + "group": "diff", + "examples": { + "diff.c": [ + "ex/HEAD/diff.html#git_diff_from_buffer-11" + ] + } }, "git_diff_get_stats": { "type": "function", @@ -7231,7 +7238,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_get_stats-10" + "ex/HEAD/diff.html#git_diff_get_stats-12" ] } }, @@ -7339,7 +7346,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_to_buf-11" + "ex/HEAD/diff.html#git_diff_stats_to_buf-13" ] } }, @@ -7366,7 +7373,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_free-12" + "ex/HEAD/diff.html#git_diff_stats_free-14" ] } }, @@ -11443,33 +11450,11 @@ "comments": "", "group": "object" }, - "git_object_size": { - "type": "function", - "file": "git2/object.h", - "line": 200, - "lineto": 200, - "args": [ - { - "name": "type", - "type": "git_object_t", - "comment": "object type to get its size" - } - ], - "argline": "git_object_t type", - "sig": "git_object_t", - "return": { - "type": "size_t", - "comment": " size in bytes of the object" - }, - "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", - "comments": "

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.

\n", - "group": "object" - }, "git_object_peel": { "type": "function", "file": "git2/object.h", - "line": 225, - "lineto": 228, + "line": 211, + "lineto": 214, "args": [ { "name": "peeled", @@ -11500,8 +11485,8 @@ "git_object_dup": { "type": "function", "file": "git2/object.h", - "line": 237, - "lineto": 237, + "line": 223, + "lineto": 223, "args": [ { "name": "dest", @@ -13835,7 +13820,12 @@ }, "description": "

Directly generate a patch from the difference between two buffers.

\n", "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", - "group": "patch" + "group": "patch", + "examples": { + "diff.c": [ + "ex/HEAD/diff.html#git_patch_from_buffers-15" + ] + } }, "git_patch_free": { "type": "function", @@ -13857,7 +13847,12 @@ }, "description": "

Free a git_patch object.

\n", "comments": "", - "group": "patch" + "group": "patch", + "examples": { + "diff.c": [ + "ex/HEAD/diff.html#git_patch_free-16" + ] + } }, "git_patch_get_delta": { "type": "function", @@ -14135,7 +14130,12 @@ }, "description": "

Get the content of a patch as a single diff text.

\n", "comments": "", - "group": "patch" + "group": "patch", + "examples": { + "diff.c": [ + "ex/HEAD/diff.html#git_patch_to_buf-17" + ] + } }, "git_pathspec_new": { "type": "function", @@ -14558,8 +14558,8 @@ "git_rebase_options_init": { "type": "function", "file": "git2/rebase.h", - "line": 159, - "lineto": 161, + "line": 175, + "lineto": 177, "args": [ { "name": "opts", @@ -14585,8 +14585,8 @@ "git_rebase_init": { "type": "function", "file": "git2/rebase.h", - "line": 180, - "lineto": 186, + "line": 196, + "lineto": 202, "args": [ { "name": "out", @@ -14632,8 +14632,8 @@ "git_rebase_open": { "type": "function", "file": "git2/rebase.h", - "line": 197, - "lineto": 200, + "line": 213, + "lineto": 216, "args": [ { "name": "out", @@ -14664,8 +14664,8 @@ "git_rebase_orig_head_name": { "type": "function", "file": "git2/rebase.h", - "line": 207, - "lineto": 207, + "line": 223, + "lineto": 223, "args": [ { "name": "rebase", @@ -14686,8 +14686,8 @@ "git_rebase_orig_head_id": { "type": "function", "file": "git2/rebase.h", - "line": 214, - "lineto": 214, + "line": 230, + "lineto": 230, "args": [ { "name": "rebase", @@ -14708,8 +14708,8 @@ "git_rebase_onto_name": { "type": "function", "file": "git2/rebase.h", - "line": 221, - "lineto": 221, + "line": 237, + "lineto": 237, "args": [ { "name": "rebase", @@ -14730,8 +14730,8 @@ "git_rebase_onto_id": { "type": "function", "file": "git2/rebase.h", - "line": 228, - "lineto": 228, + "line": 244, + "lineto": 244, "args": [ { "name": "rebase", @@ -14752,8 +14752,8 @@ "git_rebase_operation_entrycount": { "type": "function", "file": "git2/rebase.h", - "line": 236, - "lineto": 236, + "line": 252, + "lineto": 252, "args": [ { "name": "rebase", @@ -14774,8 +14774,8 @@ "git_rebase_operation_current": { "type": "function", "file": "git2/rebase.h", - "line": 247, - "lineto": 247, + "line": 263, + "lineto": 263, "args": [ { "name": "rebase", @@ -14796,8 +14796,8 @@ "git_rebase_operation_byindex": { "type": "function", "file": "git2/rebase.h", - "line": 256, - "lineto": 258, + "line": 272, + "lineto": 274, "args": [ { "name": "rebase", @@ -14823,8 +14823,8 @@ "git_rebase_next": { "type": "function", "file": "git2/rebase.h", - "line": 271, - "lineto": 273, + "line": 287, + "lineto": 289, "args": [ { "name": "operation", @@ -14850,8 +14850,8 @@ "git_rebase_inmemory_index": { "type": "function", "file": "git2/rebase.h", - "line": 286, - "lineto": 288, + "line": 302, + "lineto": 304, "args": [ { "name": "index", @@ -14877,8 +14877,8 @@ "git_rebase_commit": { "type": "function", "file": "git2/rebase.h", - "line": 312, - "lineto": 318, + "line": 328, + "lineto": 334, "args": [ { "name": "id", @@ -14924,8 +14924,8 @@ "git_rebase_abort": { "type": "function", "file": "git2/rebase.h", - "line": 328, - "lineto": 328, + "line": 344, + "lineto": 344, "args": [ { "name": "rebase", @@ -14946,8 +14946,8 @@ "git_rebase_finish": { "type": "function", "file": "git2/rebase.h", - "line": 338, - "lineto": 340, + "line": 354, + "lineto": 356, "args": [ { "name": "rebase", @@ -14973,8 +14973,8 @@ "git_rebase_free": { "type": "function", "file": "git2/rebase.h", - "line": 347, - "lineto": 347, + "line": 363, + "lineto": 363, "args": [ { "name": "rebase", @@ -23526,8 +23526,8 @@ "group": "tree", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_tree_free-13", - "ex/HEAD/diff.html#git_tree_free-14" + "ex/HEAD/diff.html#git_tree_free-18", + "ex/HEAD/diff.html#git_tree_free-19" ], "general.c": [ "ex/HEAD/general.html#git_tree_free-92", @@ -24782,6 +24782,28 @@ "description": "

Prune working tree

\n", "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", "group": "worktree" + }, + "git_object__size": { + "type": "function", + "file": "git2/deprecated.h", + "line": 316, + "lineto": 316, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to get its size" + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "size_t", + "comment": " size in bytes of the object" + }, + "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", + "comments": "

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.

\n", + "group": "object" } }, "callbacks": { @@ -25082,8 +25104,8 @@ "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 423, - "lineto": 423, + "line": 435, + "lineto": 435, "args": [ { "name": "rhead", @@ -26142,6 +26164,42 @@ }, "description": "

Callback for the user's custom certificate checks.

\n", "comments": "" + }, + "git_commit_signing_cb": { + "type": "callback", + "file": "git2/commit.h", + "line": 523, + "lineto": 524, + "args": [ + { + "name": "signature", + "type": "git_buf *", + "comment": null + }, + { + "name": "signature_field", + "type": "git_buf *", + "comment": null + }, + { + "name": "commit_content", + "type": "const char *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", + "sig": "git_buf *::git_buf *::const char *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Commit signing callback.

\n", + "comments": "

The callback will be called with the commit content, giving a user an opportunity to sign the commit content. The signature_field buf may be left empty to specify the default field "gpgsig".

\n\n

Signatures can take the form of any string, and can be created on an arbitrary header field. Signatures are most commonly used for verifying authorship of a commit using GPG or a similar cryptographically secure signing algorithm. See https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work for more details.

\n\n

When the callback: - returns GIT_PASSTHROUGH, no signature will be added to the commit. - returns < 0, commit creation will be aborted. - returns GIT_OK, the signature parameter is expected to be filled.

\n" } }, "globals": {}, @@ -26724,6 +26782,7 @@ "git_commit_create_buffer", "git_commit_extract_signature", "git_commit_header_field", + "git_commit_signing_cb", "git_config_find_global", "git_config_find_programdata", "git_config_find_system", @@ -27889,6 +27948,7 @@ "file": "git2/config.h", "line": 104, "lineto": 108, + "block": "git_configmap_t type\nconst char * str_match\nint map_value", "tdef": "typedef", "description": " Mapping from config variables to values.", "comments": "", @@ -27909,7 +27969,6 @@ "comments": "" } ], - "block": "git_configmap_t type\nconst char * str_match\nint map_value", "used": { "returns": [], "needs": [ @@ -27932,14 +27991,10 @@ "file": "git2/config.h", "line": 94, "lineto": 99, + "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", "tdef": "typedef", "description": " Config var type", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", "fields": [ { "type": "int", @@ -27965,7 +28020,11 @@ "comments": "", "value": 3 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -27980,7 +28039,6 @@ "file": "git2/transport.h", "line": 147, "lineto": 152, - "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", "tdef": null, "description": " The base structure for all credential types", "comments": "", @@ -27996,6 +28054,7 @@ "comments": "" } ], + "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", "used": { "returns": [], "needs": [ @@ -28233,6 +28292,7 @@ "const char * password" ], "type": "struct", + "value": "git_cred_userpass_payload", "file": "git2/cred_helpers.h", "line": 24, "lineto": 27, @@ -28255,8 +28315,7 @@ "used": { "returns": [], "needs": [] - }, - "value": "git_cred_userpass_payload" + } } ], [ @@ -32780,6 +32839,7 @@ "needs": [ "git_checkout_tree", "git_describe_commit", + "git_object__size", "git_object_dup", "git_object_free", "git_object_id", @@ -32789,7 +32849,6 @@ "git_object_owner", "git_object_peel", "git_object_short_id", - "git_object_size", "git_object_type", "git_object_type2string", "git_object_typeisloose", @@ -32895,11 +32954,11 @@ "git_tree_entry_type" ], "needs": [ + "git_object__size", "git_object_lookup", "git_object_lookup_bypath", "git_object_lookup_prefix", "git_object_peel", - "git_object_size", "git_object_type2string", "git_object_typeisloose", "git_odb_hash", @@ -33992,8 +34051,8 @@ "type": "struct", "value": "git_rebase_operation", "file": "git2/rebase.h", - "line": 132, - "lineto": 147, + "line": 148, + "lineto": 163, "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", "tdef": "typedef", "description": " A rebase operation", @@ -34038,8 +34097,8 @@ ], "type": "enum", "file": "git2/rebase.h", - "line": 80, - "lineto": 116, + "line": 96, + "lineto": 132, "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "tdef": "typedef", "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", @@ -34097,14 +34156,16 @@ "int inmemory", "const char * rewrite_notes_ref", "git_merge_options merge_options", - "git_checkout_options checkout_options" + "git_checkout_options checkout_options", + "git_commit_signing_cb signing_cb", + "void * payload" ], "type": "struct", "value": "git_rebase_options", "file": "git2/rebase.h", - "line": 31, - "lineto": 75, - "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options", + "line": 32, + "lineto": 91, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_signing_cb signing_cb\nvoid * payload", "tdef": "typedef", "description": " Rebase options", "comments": "

Use to tell the rebase machinery how to operate.

\n", @@ -34138,6 +34199,16 @@ "type": "git_checkout_options", "name": "checkout_options", "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." + }, + { + "type": "git_commit_signing_cb", + "name": "signing_cb", + "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n This field is only used when performing git_rebase_commit." + }, + { + "type": "void *", + "name": "payload", + "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." } ], "used": { @@ -38223,6 +38294,7 @@ [ "object", [ + "git_object__size", "git_object_dup", "git_object_free", "git_object_id", @@ -38232,7 +38304,6 @@ "git_object_owner", "git_object_peel", "git_object_short_id", - "git_object_size", "git_object_string2type", "git_object_type", "git_object_type2string", @@ -38912,6 +38983,10 @@ "show-index.c", "ex/HEAD/show-index.html" ], + [ + "stash.c", + "ex/HEAD/stash.html" + ], [ "status.c", "ex/HEAD/status.html" diff --git a/vendor/libgit2 b/vendor/libgit2 index 6abd07fcc..fb173ba7f 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 6abd07fccde53babc0835dcdd05607313aa72bec +Subproject commit fb173ba7f8dae6bb6d723b1b587f9a2ffbdbd5b9 diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 6444228ea..ac7a466de 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -90,6 +90,7 @@ "libgit2/src/config_mem.c", "libgit2/src/config_parse.c", "libgit2/src/config_parse.h", + "libgit2/src/config_snapshot.c", "libgit2/src/config.c", "libgit2/src/config.h", "libgit2/src/crlf.c", From fc9b483248d22e80278a4a671f4b2893f0af0627 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 13 Aug 2019 10:12:23 -0700 Subject: [PATCH 155/545] Bump to v0.25.1 --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7cfe392a..25834346d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,40 @@ # Change Log +## v0.25.1 [(2019-08-13)](https://github.com/nodegit/nodegit/releases/tag/v0.25.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0...v0.25.1) + +#### Summary of changes +Security patch for LibGit2: +- A carefully constructed commit object with a very large number + of parents may lead to potential out-of-bounds writes or + potential denial of service. + +- The ProgramData configuration file is always read for compatibility + with Git for Windows and Portable Git installations. The ProgramData + location is not necessarily writable only by administrators, so we + now ensure that the configuration file is owned by the administrator + or the current user. + +Additionally: +- Stash should run much faster now. + +#### Merged PRs into LibGit2 +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [stash: avoid recomputing tree when committing worktree](https://github.com/libgit2/libgit2/pull/5113) +- [Variadic macros](https://github.com/libgit2/libgit2/pull/5121) +- [Add sign capability to git_rebase_commit](https://github.com/libgit2/libgit2/pull/4913) +- [remote: remove unused block of code](https://github.com/libgit2/libgit2/pull/5197) +- [Adjust printf specifiers in examples code](https://github.com/libgit2/libgit2/pull/5146) +- [config: check if we are running in a sandboxed environment](https://github.com/libgit2/libgit2/pull/5191) +- [Fix example checkout to forbid rather than require --](https://github.com/libgit2/libgit2/pull/5184) +- [editorconfig: update to match our coding style](https://github.com/libgit2/libgit2/pull/5183) +- [Compare buffers in diff example](https://github.com/libgit2/libgit2/pull/5125) +- [Include ahead_behind in the test suite](https://github.com/libgit2/libgit2/pull/5135) +- [config: separate file and snapshot backends](https://github.com/libgit2/libgit2/pull/5186) +- [object: deprecate git_object__size for removal](https://github.com/libgit2/libgit2/pull/5192) + + ## v0.25.0 [(2019-08-09)](https://github.com/nodegit/nodegit/releases/tag/v0.25.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.24.3...v0.25.0) diff --git a/package-lock.json b/package-lock.json index a54150f19..a5c2bbf88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.0", + "version": "0.25.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b055e829f..6492e7f64 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.0", + "version": "0.25.1", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From c67b43687909c0cd5841276a9d20f3f364907d65 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 26 Aug 2019 15:43:19 -0700 Subject: [PATCH 156/545] Use GitHub Actions for CI --- .github/workflows/tests.yml | 126 ++++++++++++++++++++++++++++++++++++ generate/index.js | 24 +++++-- test/index.js | 2 +- utils/retry.js | 51 +++++++++++++++ 4 files changed, 197 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/tests.yml create mode 100644 utils/retry.js diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 000000000..6d516db9a --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,126 @@ +on: + push: + branches: + - master + - backport/* + tags: + - v*.*.* + pull_request: + +name: Testing + +jobs: + nix-tests: + name: "*nix Tests" + strategy: + matrix: + node: [8, 10, 12] + os: [ubuntu-16.04, macOS-10.14] + runs-on: ${{ matrix.os }} + steps: + - name: Setup Environment + run: | + mkdir ~/.ssh + chmod 700 ~/.ssh + echo -e "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh/config + echo -e "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R" > ~/.ssh/id_rsa.pub + echo -e "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa* + git config --global user.name "John Doe" + git config --global user.email johndoe@example.com + + - uses: actions/checkout@master + + - name: Use Node.js 8.x + uses: actions/setup-node@master + with: + node-version: ${{ matrix.node }} + + - name: Install Dependencies for Ubuntu + if: startsWith(matrix.os, 'ubuntu') + run: sudo apt install build-essential libssl-dev libkrb5-dev libc++-dev + + - name: Install + env: + CC: clang + CXX: clang++ + npm_config_clang: 1 + GYP_DEFINES: use_obsolete_asm=true + run: npm install + + - name: Test + run: | + set -e + eval `ssh-agent -s` + ssh-add ~/.ssh/id_rsa + node utils/retry npm test + + - name: Deploy + if: startsWith(github.ref, 'refs/tags/test-v') + env: + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} + node_pre_gyp_secretAccessKey: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: | + npm install -g node-pre-gyp aws-sdk + node lifecycleScripts/clean + node-pre-gyp package + node-pre-gyp publish + + windows-tests: + name: Windows Tests + strategy: + matrix: + node: [8, 10, 12] + arch: [x86, x64] + runs-on: windows-2016 + steps: + - name: Setup Environment + run: | + git config --file C:\ProgramData\Git\config core.autocrlf input + git config --system core.autocrlf input + git config --global core.autocrlf input + git config --global user.name "John Doe" + git config --global user.email johndoe@example.com + npm install -g node-pre-gyp aws-sdk + + - uses: actions/checkout@master + + - name: Use Node.js 8.x + uses: implausible/setup-node@feature/expose-architecture-override + with: + node-version: ${{ matrix.node }} + node-arch: ${{ matrix.arch }} + + - name: Install + run: npm install + + - name: Test + env: + GIT_SSH: ${{ github.workspace }}\vendor\plink.exe + run: | + powershell -command "Start-Process ${{ github.workspace }}\vendor\pageant.exe ${{ github.workspace }}\vendor\private.ppk" + node utils/retry npm test + + # You're probably wondering why this isn't a single `run: |` step, it certainly is for *nix, + # but it's not, because the CI runner for windows doesn't wait for each step as listed here + # and it treats each additional step past the first as an orphaned process. + - name: Deploy (Dependencies) + if: startsWith(github.ref, 'refs/tags/test-v') + run: npm install -g node-pre-gyp aws-sdk + + - name: Deploy (Clean) + if: startsWith(github.ref, 'refs/tags/test-v') + run: node lifecycleScripts\clean + + - name: Deploy (Package) + if: startsWith(github.ref, 'refs/tags/test-v') + run: node-pre-gyp package + + - name: Deploy (Publish) + if: startsWith(github.ref, 'refs/tags/test-v') + env: + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} + node_pre_gyp_secretAccessKey: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: node-pre-gyp publish diff --git a/generate/index.js b/generate/index.js index 6bdaa42ef..753897d5b 100644 --- a/generate/index.js +++ b/generate/index.js @@ -6,6 +6,23 @@ var submoduleStatus = require("../lifecycleScripts/submodules/getStatus"); module.exports = function generate() { console.log("[nodegit] Generating native code"); + function tryGenerate(numRetries = 3) { + // There appears to be a race condition in the generate code somewhere + // Until we fix that, we should try to generate a few times before + try { + generateJson(); + generateNativeCode(); + generateMissingTests(); + } catch (error) { + if (numRetries > 0) { + console.log("[nodegit] WARNING - Failed to generate native code, trying again"); + tryGenerate(numRetries - 1); + } else { + throw error; + } + } + } + return submoduleStatus() .then(function(statuses) { var dirtySubmodules = statuses @@ -22,14 +39,11 @@ module.exports = function generate() { }); } }) - .then(function() { - generateJson(); - generateNativeCode(); - generateMissingTests(); - }) + .then(tryGenerate) .catch(function(e) { console.error("[nodegit] ERROR - Could not generate native code"); console.error(e); + throw e; }); } diff --git a/test/index.js b/test/index.js index 5b3269f36..4891a0dba 100644 --- a/test/index.js +++ b/test/index.js @@ -18,7 +18,7 @@ var args = cov.concat([ "15000" ]); -if (!process.env.APPVEYOR && !process.env.TRAVIS) { +if (!process.env.APPVEYOR && !process.env.TRAVIS && !process.env.GITHUB_ACTION) { var local = path.join.bind(path, __dirname); var dummyPath = local("home"); process.env.HOME = dummyPath; diff --git a/utils/retry.js b/utils/retry.js new file mode 100644 index 000000000..c7a57fb06 --- /dev/null +++ b/utils/retry.js @@ -0,0 +1,51 @@ +const { spawn } = require('child_process'); + +const [, , cmd, ...args] = process.argv; +if (!cmd) { + process.exit(-1); +} + +const once = (fn) => { + let runOnce = false; + return (...args) => { + if (runOnce) { + return; + } + + runOnce = true; + fn(...args); + } +}; + +const retry = (numRetries = 3) => { + const child = spawn(cmd, args, { + shell: process.platform === 'win32', + stdio: [0, 'pipe', 'pipe'] + }); + + child.setMaxListeners(0); + + child.stdout.setEncoding('utf8'); + child.stderr.setEncoding('utf8'); + + child.stdout.pipe(process.stdout); + child.stderr.pipe(process.stderr); + + const cleanupAndExit = once((error, status) => { + child.kill(); + if (numRetries > 0 && (error || status !== 0)) { + retry(numRetries - 1); + } else if (error) { + console.log(error); + process.exit(-1); + } else { + process.exit(status); + } + }); + const onClose = status => cleanupAndExit(null, status); + + child.on('close', onClose); + child.on('error', cleanupAndExit); +}; + +retry(); From b4957159ff2b6e5f6e630662f7192f5ea54425ef Mon Sep 17 00:00:00 2001 From: Sebastian Henke Date: Fri, 30 Aug 2019 16:51:38 +0200 Subject: [PATCH 157/545] Fix rebase using in-memory index --- generate/input/libgit2-supplement.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index e6f5c4d05..6d7809833 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1392,6 +1392,10 @@ { "type": "void *", "name": "payload" + }, + { + "type": "int", + "name": "inmemory" } ], "used": { From ee79dcb08e953834207afb912f79ddf009a95cd4 Mon Sep 17 00:00:00 2001 From: Sebastian Henke Date: Tue, 3 Sep 2019 22:42:10 +0200 Subject: [PATCH 158/545] Add test for in-memory rebase --- test/tests/rebase.js | 183 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 182 insertions(+), 1 deletion(-) diff --git a/test/tests/rebase.js b/test/tests/rebase.js index 87749f539..8e6e7ec2d 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -149,7 +149,7 @@ describe("Rebase", function() { }); }); - it("can cleanly rebase a branch onto another branch", function() { + it("can cleanly rebase a branch in-memory", function() { var baseFileName = "baseNewFile.txt"; var ourFileName = "ourNewFile.txt"; var theirFileName = "theirNewFile.txt"; @@ -266,6 +266,187 @@ describe("Rebase", function() { var ourAnnotatedCommit = annotatedCommits[0]; var theirAnnotatedCommit = annotatedCommits[1]; + assert.equal(ourAnnotatedCommit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + assert.equal(theirAnnotatedCommit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + var rebaseOptions = new NodeGit.RebaseOptions(); + rebaseOptions.inmemory = 1; + + return NodeGit.Rebase.init(repository, ourAnnotatedCommit, + theirAnnotatedCommit, undefined, rebaseOptions); + }) + .then(function(newRebase) { + rebase = newRebase; + + // there should only be 1 rebase operation to perform + assert.equal(rebase.operationEntrycount(), 1); + + return rebase.next(); + }) + .then(function(rebaseOperation) { + assert.equal(rebaseOperation.type(), + NodeGit.RebaseOperation.REBASE_OPERATION.PICK); + assert.equal(rebaseOperation.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return rebase.commit(null, ourSignature); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "b937100ee0ea17ef20525306763505a7fe2be29e"); + + // git_rebase_operation_current returns the index of the rebase + // operation that was last applied, so after the first operation, it + // should be 0. + assert.equal(rebase.operationCurrent(), 0); + + return rebase.finish(ourSignature, {}); + }) + .then(function(result) { + assert.equal(result, 0); + + return repository.getBranchCommit(ourBranchName); + }) + .then(function(commit) { + // verify that the "ours" branch has NOT moved. + // In-memory rebase does not touch refs. + assert.equal(commit.id().toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + // Lookup the new commit + return NodeGit.Commit.lookup(repository, + "b937100ee0ea17ef20525306763505a7fe2be29e"); + }) + .then(function(commit) { + // Lookup the parent of our new commit + return commit.parent(0); + }) + .then(function(commit) { + // verify that we are on top of "their commit" + assert.equal(commit.id().toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + }); + }); + + it("can cleanly rebase a branch onto another branch", function() { + var baseFileName = "baseNewFile.txt"; + var ourFileName = "ourNewFile.txt"; + var theirFileName = "theirNewFile.txt"; + + var baseFileContent = "How do you feel about Toll Roads?"; + var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + var theirFileContent = "I'm skeptical about Toll Roads"; + + var ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + var theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + var repository = this.repository; + var ourCommit; + var ourBranch; + var theirBranch; + var rebase; + + return fse.writeFile(path.join(repository.workdir(), baseFileName), + baseFileContent) + // Load up the repository index and make our initial commit to HEAD + .then(function() { + return RepoUtils.addFileToIndex(repository, baseFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "b5cdc109d437c4541a13fb7509116b5f03d5039a"); + + return repository.createCommit("HEAD", ourSignature, + ourSignature, "initial commit", oid, []); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "be03abdf0353d05924c53bebeb0e5bb129cda44a"); + + return repository.getCommit(commitOid).then(function(commit) { + ourCommit = commit; + }).then(function() { + return repository.createBranch(ourBranchName, commitOid) + .then(function(branch) { + ourBranch = branch; + return repository.createBranch(theirBranchName, commitOid); + }); + }); + }) + .then(function(branch) { + theirBranch = branch; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, theirFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); + + return repository.createCommit(theirBranch.name(), theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e9ebd92f2f4778baf6fa8e92f0c68642f931a554"); + + return removeFileFromIndex(repository, theirFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), theirFileName)); + }) + .then(function() { + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent); + }) + .then(function() { + return RepoUtils.addFileToIndex(repository, ourFileName); + }) + .then(function(oid) { + assert.equal(oid.toString(), + "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); + + return repository.createCommit(ourBranch.name(), ourSignature, + ourSignature, "we made a commit", oid, [ourCommit]); + }) + .then(function(commitOid) { + assert.equal(commitOid.toString(), + "e7f37ee070837052937e24ad8ba66f6d83ae7941"); + + return removeFileFromIndex(repository, ourFileName); + }) + .then(function() { + return fse.remove(path.join(repository.workdir(), ourFileName)); + }) + .then(function() { + return repository.checkoutBranch(ourBranchName); + }) + .then(function() { + return Promise.all([ + repository.getReference(ourBranchName), + repository.getReference(theirBranchName) + ]); + }) + .then(function(refs) { + assert.equal(refs.length, 2); + + return Promise.all([ + NodeGit.AnnotatedCommit.fromRef(repository, refs[0]), + NodeGit.AnnotatedCommit.fromRef(repository, refs[1]) + ]); + }) + .then(function(annotatedCommits) { + assert.equal(annotatedCommits.length, 2); + + var ourAnnotatedCommit = annotatedCommits[0]; + var theirAnnotatedCommit = annotatedCommits[1]; + assert.equal(ourAnnotatedCommit.id().toString(), "e7f37ee070837052937e24ad8ba66f6d83ae7941"); assert.equal(theirAnnotatedCommit.id().toString(), From 129492dc0921ba1d707b68ce180e2626ae2bdb5b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 6 Sep 2019 14:57:29 -0700 Subject: [PATCH 159/545] Update libssh2 to 1.9 --- vendor/libgit2.gyp | 2 + vendor/libssh2/Makefile.OpenSSL.inc | 1 + vendor/libssh2/Makefile.WinCNG.inc | 1 + vendor/libssh2/Makefile.am | 3 + vendor/libssh2/Makefile.in | 16 +- vendor/libssh2/Makefile.inc | 5 +- vendor/libssh2/Makefile.libgcrypt.inc | 1 + vendor/libssh2/Makefile.mbedTLS.inc | 1 + vendor/libssh2/NEWS | 8047 +++++++++-------- vendor/libssh2/RELEASE-NOTES | 48 +- vendor/libssh2/acinclude.m4 | 166 +- vendor/libssh2/configure | 1048 ++- vendor/libssh2/configure.ac | 143 +- vendor/libssh2/docs/CMakeLists.txt | 4 + vendor/libssh2/docs/HACKING.CRYPTO | 108 +- vendor/libssh2/docs/INSTALL_AUTOTOOLS | 16 + vendor/libssh2/docs/INSTALL_CMAKE | 2 +- vendor/libssh2/docs/Makefile.am | 2 + vendor/libssh2/docs/Makefile.in | 10 +- vendor/libssh2/docs/SECURITY.md | 4 +- .../docs/libssh2_agent_get_identity_path.3 | 22 + .../docs/libssh2_agent_set_identity_path.3 | 22 + .../libssh2/docs/libssh2_channel_wait_eof.3 | 2 +- vendor/libssh2/docs/libssh2_hostkey_hash.3 | 6 +- .../docs/libssh2_session_supported_algs.3 | 10 +- vendor/libssh2/example/Makefile.in | 8 +- vendor/libssh2/example/direct_tcpip.c | 108 +- vendor/libssh2/example/scp.c | 54 +- vendor/libssh2/example/scp_nonblock.c | 85 +- vendor/libssh2/example/scp_write.c | 65 +- vendor/libssh2/example/scp_write_nonblock.c | 92 +- vendor/libssh2/example/sftp.c | 98 +- vendor/libssh2/example/sftp_RW_nonblock.c | 78 +- vendor/libssh2/example/sftp_append.c | 59 +- vendor/libssh2/example/sftp_mkdir.c | 36 +- vendor/libssh2/example/sftp_mkdir_nonblock.c | 38 +- vendor/libssh2/example/sftp_nonblock.c | 86 +- vendor/libssh2/example/sftp_write.c | 55 +- vendor/libssh2/example/sftp_write_nonblock.c | 95 +- vendor/libssh2/example/sftp_write_sliding.c | 98 +- vendor/libssh2/example/sftpdir.c | 112 +- vendor/libssh2/example/sftpdir_nonblock.c | 103 +- vendor/libssh2/example/ssh2.c | 84 +- vendor/libssh2/example/ssh2_agent.c | 61 +- vendor/libssh2/example/ssh2_echo.c | 98 +- vendor/libssh2/example/ssh2_exec.c | 99 +- vendor/libssh2/example/subsystem_netconf.c | 82 +- vendor/libssh2/example/tcpip-forward.c | 97 +- vendor/libssh2/example/x11.c | 163 +- vendor/libssh2/include/libssh2.h | 164 +- vendor/libssh2/include/libssh2_publickey.h | 27 +- vendor/libssh2/include/libssh2_sftp.h | 19 +- vendor/libssh2/os400/initscript.sh | 4 +- vendor/libssh2/src/CMakeLists.txt | 18 +- vendor/libssh2/src/Makefile.am | 7 +- vendor/libssh2/src/Makefile.in | 71 +- vendor/libssh2/src/agent.c | 193 +- vendor/libssh2/src/bcrypt_pbkdf.c | 180 + vendor/libssh2/src/blf.h | 90 + vendor/libssh2/src/blowfish.c | 697 ++ vendor/libssh2/src/channel.c | 559 +- vendor/libssh2/src/comp.c | 51 +- vendor/libssh2/src/crypt.c | 35 +- vendor/libssh2/src/crypto.h | 108 +- vendor/libssh2/src/global.c | 9 +- vendor/libssh2/src/hostkey.c | 708 +- vendor/libssh2/src/keepalive.c | 19 +- vendor/libssh2/src/kex.c | 2726 ++++-- vendor/libssh2/src/knownhost.c | 116 +- vendor/libssh2/src/libgcrypt.c | 184 +- vendor/libssh2/src/libgcrypt.h | 113 +- vendor/libssh2/src/libssh2_config.h.in | 11 +- vendor/libssh2/src/libssh2_priv.h | 118 +- vendor/libssh2/src/mac.c | 12 +- vendor/libssh2/src/mbedtls.c | 283 +- vendor/libssh2/src/mbedtls.h | 104 +- vendor/libssh2/src/misc.c | 431 +- vendor/libssh2/src/misc.h | 39 +- vendor/libssh2/src/openssl.c | 2796 +++++- vendor/libssh2/src/openssl.h | 140 +- vendor/libssh2/src/os400qc3.c | 2513 ----- vendor/libssh2/src/os400qc3.h | 358 - vendor/libssh2/src/packet.c | 208 +- vendor/libssh2/src/pem.c | 658 +- vendor/libssh2/src/publickey.c | 523 +- vendor/libssh2/src/scp.c | 277 +- vendor/libssh2/src/session.c | 435 +- vendor/libssh2/src/session.h | 8 +- vendor/libssh2/src/sftp.c | 846 +- vendor/libssh2/src/sftp.h | 1 + vendor/libssh2/src/transport.c | 178 +- vendor/libssh2/src/userauth.c | 600 +- vendor/libssh2/src/userauth.h | 3 +- vendor/libssh2/src/wincng.c | 492 +- vendor/libssh2/src/wincng.h | 70 +- vendor/libssh2/tests/CMakeLists.txt | 77 +- vendor/libssh2/tests/Makefile.am | 8 + vendor/libssh2/tests/Makefile.in | 17 +- .../libssh2/tests/libssh2_config_cmake.h.in | 1 + vendor/libssh2/tests/openssh_fixture.c | 246 +- .../libssh2/tests/openssh_server/Dockerfile | 8 + .../tests/openssh_server/authorized_keys | 4 + vendor/libssh2/tests/runner.c | 2 +- vendor/libssh2/tests/session_fixture.c | 100 +- vendor/libssh2/tests/simple.c | 33 +- vendor/libssh2/tests/ssh2.c | 53 +- vendor/libssh2/tests/test_hostkey.c | 31 +- vendor/libssh2/tests/test_hostkey_hash.c | 151 +- ...teractive_auth_fails_with_wrong_response.c | 14 +- ...tive_auth_succeeds_with_correct_response.c | 14 +- ..._password_auth_fails_with_wrong_password.c | 10 +- ..._password_auth_fails_with_wrong_username.c | 10 +- ...d_auth_succeeds_with_correct_credentials.c | 12 +- ...est_public_key_auth_fails_with_wrong_key.c | 12 +- ...c_key_auth_succeeds_with_correct_dsa_key.c | 12 +- ..._succeeds_with_correct_encrypted_rsa_key.c | 38 + ...c_key_auth_succeeds_with_correct_rsa_key.c | 12 +- ...th_succeeds_with_correct_rsa_openssh_key.c | 37 + vendor/libssh2/win32/GNUmakefile | 41 +- vendor/libssh2/win32/libssh2.dsp | 12 + 120 files changed, 17775 insertions(+), 12026 deletions(-) create mode 100644 vendor/libssh2/docs/libssh2_agent_get_identity_path.3 create mode 100644 vendor/libssh2/docs/libssh2_agent_set_identity_path.3 create mode 100644 vendor/libssh2/src/bcrypt_pbkdf.c create mode 100644 vendor/libssh2/src/blf.h create mode 100644 vendor/libssh2/src/blowfish.c delete mode 100644 vendor/libssh2/src/os400qc3.c delete mode 100644 vendor/libssh2/src/os400qc3.h create mode 100644 vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c create mode 100644 vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index ac7a466de..6a8d9449b 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -559,6 +559,8 @@ ], "sources": [ "libssh2/src/agent.c", + "libssh2/src/bcrypt_pbkdf.c", + "libssh2/src/blowfish.c", "libssh2/src/crypt.c", "libssh2/src/keepalive.c", "libssh2/src/libgcrypt.c", diff --git a/vendor/libssh2/Makefile.OpenSSL.inc b/vendor/libssh2/Makefile.OpenSSL.inc index 76f3e85ca..1e4e8f0bb 100644 --- a/vendor/libssh2/Makefile.OpenSSL.inc +++ b/vendor/libssh2/Makefile.OpenSSL.inc @@ -1,2 +1,3 @@ CRYPTO_CSOURCES = openssl.c CRYPTO_HHEADERS = openssl.h +CRYPTO_LTLIBS = $(LTLIBSSL) diff --git a/vendor/libssh2/Makefile.WinCNG.inc b/vendor/libssh2/Makefile.WinCNG.inc index c18350eed..bbcb82bfd 100644 --- a/vendor/libssh2/Makefile.WinCNG.inc +++ b/vendor/libssh2/Makefile.WinCNG.inc @@ -1,2 +1,3 @@ CRYPTO_CSOURCES = wincng.c CRYPTO_HHEADERS = wincng.h +CRYPTO_LTLIBS = $(LTLIBBCRYPT) $(LTLIBCRYPT32) diff --git a/vendor/libssh2/Makefile.am b/vendor/libssh2/Makefile.am index f7451e814..6411e8a04 100644 --- a/vendor/libssh2/Makefile.am +++ b/vendor/libssh2/Makefile.am @@ -147,3 +147,6 @@ $(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am done; \ cat $(srcdir)/vc8proj.foot) | \ awk '{printf("%s\r\n", gensub("\r", "", "g"))}' > $@ ) + +checksrc: + perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c diff --git a/vendor/libssh2/Makefile.in b/vendor/libssh2/Makefile.in index 61f9b1585..32d97cba7 100644 --- a/vendor/libssh2/Makefile.in +++ b/vendor/libssh2/Makefile.in @@ -273,7 +273,7 @@ GREP = @GREP@ HAVE_LIBBCRYPT = @HAVE_LIBBCRYPT@ HAVE_LIBCRYPT32 = @HAVE_LIBCRYPT32@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ -HAVE_LIBMBEDTLS = @HAVE_LIBMBEDTLS@ +HAVE_LIBMBEDCRYPTO = @HAVE_LIBMBEDCRYPTO@ HAVE_LIBSSL = @HAVE_LIBSSL@ HAVE_LIBZ = @HAVE_LIBZ@ INSTALL = @INSTALL@ @@ -289,8 +289,8 @@ LIBCRYPT32 = @LIBCRYPT32@ LIBCRYPT32_PREFIX = @LIBCRYPT32_PREFIX@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ -LIBMBEDTLS = @LIBMBEDTLS@ -LIBMBEDTLS_PREFIX = @LIBMBEDTLS_PREFIX@ +LIBMBEDCRYPTO = @LIBMBEDCRYPTO@ +LIBMBEDCRYPTO_PREFIX = @LIBMBEDCRYPTO_PREFIX@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSREQUIRED = @LIBSREQUIRED@ @@ -305,7 +305,7 @@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ LTLIBCRYPT32 = @LTLIBCRYPT32@ LTLIBGCRYPT = @LTLIBGCRYPT@ -LTLIBMBEDTLS = @LTLIBMBEDTLS@ +LTLIBMBEDCRYPTO = @LTLIBMBEDCRYPTO@ LTLIBOBJS = @LTLIBOBJS@ LTLIBSSL = @LTLIBSSL@ LTLIBZ = @LTLIBZ@ @@ -437,10 +437,11 @@ CRYPTO_CSOURCES = openssl.c wincng.c mbedtls.c CRYPTO_HHEADERS = openssl.h wincng.h mbedtls.h CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ - version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c + version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ + blowfish.c bcrypt_pbkdf.c HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h # Makefile.inc provides the CSOURCES and HHEADERS defines WIN32SOURCES = $(CSOURCES) @@ -1056,6 +1057,9 @@ $(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am cat $(srcdir)/vc8proj.foot) | \ awk '{printf("%s\r\n", gensub("\r", "", "g"))}' > $@ ) +checksrc: + perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/vendor/libssh2/Makefile.inc b/vendor/libssh2/Makefile.inc index 8f2e570cb..ff8e6efa8 100644 --- a/vendor/libssh2/Makefile.inc +++ b/vendor/libssh2/Makefile.inc @@ -1,6 +1,7 @@ CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ - version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c + version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ + blowfish.c bcrypt_pbkdf.c HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h diff --git a/vendor/libssh2/Makefile.libgcrypt.inc b/vendor/libssh2/Makefile.libgcrypt.inc index 5d56292ce..0a3aae9aa 100644 --- a/vendor/libssh2/Makefile.libgcrypt.inc +++ b/vendor/libssh2/Makefile.libgcrypt.inc @@ -1,2 +1,3 @@ CRYPTO_CSOURCES = libgcrypt.c CRYPTO_HHEADERS = libgcrypt.h +CRYPTO_LTLIBS = $(LTLIBGCRYPT) diff --git a/vendor/libssh2/Makefile.mbedTLS.inc b/vendor/libssh2/Makefile.mbedTLS.inc index 7e9786429..b9f19fce1 100644 --- a/vendor/libssh2/Makefile.mbedTLS.inc +++ b/vendor/libssh2/Makefile.mbedTLS.inc @@ -1,2 +1,3 @@ CRYPTO_CSOURCES = mbedtls.c CRYPTO_HHEADERS = mbedtls.h +CRYPTO_LTLIBS = $(LTLIBMBEDCRYPTO) diff --git a/vendor/libssh2/NEWS b/vendor/libssh2/NEWS index a9c0a3f1b..4c7f1eacf 100644 --- a/vendor/libssh2/NEWS +++ b/vendor/libssh2/NEWS @@ -1,5538 +1,5941 @@ Changelog for the libssh2 project. Generated with git2news.pl -Version 1.8.2 (25 Mar 2019) - -Daniel Stenberg (25 Mar 2019) -- RELEASE-NOTES: version 1.8.2 - +GitHub (19 Jun 2019) - [Will Cosgrove brought this change] - moved MAX size declarations #330 + 1.9 Formatting - [Will Cosgrove brought this change] - Fixed misapplied patch (#327) - - Fixes for user auth - -Version 1.8.1 (14 Mar 2019) + 1.9 Release notes -Will Cosgrove (14 Mar 2019) -- [Michael Buckley brought this change] +Will Cosgrove (17 May 2019) +- [Alexander Curtiss brought this change] - More 1.8.0 security fixes (#316) - - * Defend against possible integer overflows in comp_method_zlib_decomp. + libgcrypt.c : Fixed _libssh2_rsa_sha1_sign memory leak. (#370) - * Defend against writing beyond the end of the payload in _libssh2_transport_read(). + File: libgcrypt.c - * Sanitize padding_length - _libssh2_transport_read(). https://libssh2.org/CVE-2019-3861.html + Notes : Added calls to gcry_sexp_release to free memory allocated by gcry_sexp_find_token - This prevents an underflow resulting in a potential out-of-bounds read if a server sends a too-large padding_length, possibly with malicious intent. + Credit : + Reporter : beckmi + PR by: Alexander Curtiss + +- [Orivej Desh brought this change] + + libssh2_priv.h : Fix musl build warning on sys/poll.h (#346) - * Prevent zero-byte allocation in sftp_packet_read() which could lead to an out-of-bounds read. https://libssh2.org/CVE-2019-3858.html + File : libssh2_priv.h - * Check the length of data passed to sftp_packet_add() to prevent out-of-bounds reads. + Notes : + musl prints `redirecting incorrect #include to ` + http://git.musl-libc.org/cgit/musl/commit/include/sys/poll.h?id=54446d730cfb17c5f7bcf57f139458678f5066cc - * Add a required_size parameter to sftp_packet_require et. al. to require callers of these functions to handle packets that are too short. https://libssh2.org/CVE-2019-3860.html + poll is defined by POSIX to be in poll.h: + http://pubs.opengroup.org/onlinepubs/7908799/xsh/poll.html - * Additional length checks to prevent out-of-bounds reads and writes in _libssh2_packet_add(). https://libssh2.org/CVE-2019-3862.html + Credit : Orivej Desh -GitHub (14 Mar 2019) +GitHub (1 May 2019) - [Will Cosgrove brought this change] - 1.8 Security fixes (#314) + kex.c : additional bounds checks in diffie_hellman_sha1/256 (#361) - * fixed possible integer overflow in packet_length + Files : kex.c, misc.c, misc.h - CVE https://www.libssh2.org/CVE-2019-3861.html + Notes : + Fixed possible out of bounds memory access when reading malformed data in diffie_hellman_sha1() and diffie_hellman_sha256(). - * fixed possible interger overflow with userauth_keyboard_interactive + Added _libssh2_copy_string() to misc.c to return an allocated and filled char buffer from a string_buf offset. Removed no longer needed s var in kmdhgGPshakex_state_t. + +Will Cosgrove (26 Apr 2019) +- [Tseng Jun brought this change] + + sftp.c : sftp_bin2attr() Correct attrs->gid assignment (#366) - CVE https://www.libssh2.org/CVE-2019-3856.html + Regression with fix for #339 - * fixed possible out zero byte/incorrect bounds allocation + Credit : Tseng Jun + +- [Tseng Jun brought this change] + + kex.c : Correct type cast in curve25519_sha256() (#365) + +GitHub (24 Apr 2019) +- [Will Cosgrove brought this change] + + transport.c : scope local total_num var (#364) - CVE https://www.libssh2.org/CVE-2019-3857.html + file : transport.c + notes : move local `total_num` variable inside of if block to prevent scope access issues which caused #360. + +Will Cosgrove (24 Apr 2019) +- [doublex brought this change] + + transport.c : fixes bounds check if partial packet is read - * bounds checks for response packets + Files : transport.c - * fixed integer overflow in userauth_keyboard_interactive + Issue : #360 - CVE https://www.libssh2.org/CVE-2019-3863.html + Notes : + 'p->total_num' instead of local value total_num when doing bounds check. - * 1.8.1 release notes - -Version 1.8.0 (25 Oct 2016) + Credit : Doublex -Daniel Stenberg (25 Oct 2016) -- RELEASE-NOTES: adjusted for 1.8.0 +GitHub (23 Apr 2019) +- [Will Cosgrove brought this change] -Kamil Dudka (20 Oct 2016) -- Revert "aes: the init function fails when OpenSSL has AES support" - - This partially reverts commit f4f2298ef3635acd031cc2ee0e71026cdcda5864 - because it caused the compatibility code to call initialization routines - redundantly, leading to memory leakage with OpenSSL 1.1 and broken curl - test-suite in Fedora: + Editor config file for source files (#322) - 88 bytes in 1 blocks are definitely lost in loss record 5 of 8 - at 0x4C2DB8D: malloc (vg_replace_malloc.c:299) - by 0x72C607D: CRYPTO_zalloc (mem.c:100) - by 0x72A2480: EVP_CIPHER_meth_new (cmeth_lib.c:18) - by 0x4E5A550: make_ctr_evp.isra.0 (openssl.c:407) - by 0x4E5A8E8: _libssh2_init_aes_ctr (openssl.c:471) - by 0x4E5BB5A: libssh2_init (global.c:49) + Simple start to an editor config file when editing source files to make sure they are configured correctly. -Daniel Stenberg (19 Oct 2016) -- [Charles Collicutt brought this change] +- [Will Cosgrove brought this change] - libssh2_wait_socket: Fix comparison with api_timeout to use milliseconds (#134) + misc.c : String buffer API improvements (#332) - Fixes #74 - -- [Charles Collicutt brought this change] - - Set err_msg on _libssh2_wait_socket errors (#135) - -- Revert "travis: Test mbedtls too" + Files : misc.c, hostkey.c, kex.c, misc.h, openssl.c, sftp.c - This reverts commit 3e6de50a24815e72ec5597947f1831f6083b7da8. + Notes : + * updated _libssh2_get_bignum_bytes and _libssh2_get_string. Now pass in length as an argument instead of returning it to keep signedness correct. Now returns -1 for failure, 0 for success. - Travis doesn't seem to support the mbedtls-dev package - -- maketgz: support "only" to only update version number locally + _libssh2_check_length now returns 0 on success and -1 on failure to match the other string_buf functions. Added comment to _libssh2_check_length. - and fix the date output locale + Credit : Will Cosgrove -- configure: make the --with-* options override the OpenSSL default +Will Cosgrove (19 Apr 2019) +- [doublex brought this change] + + mbedtls.c : _libssh2_mbedtls_rsa_new_private_frommemory() allow private-key from memory (#359) - ... previously it would default to OpenSSL even with the --with-[crypto] - options used unless you specificly disabled OpenSSL. Now, enabling another - backend will automatically disable OpenSSL if the other one is found. + File : mbedtls.c + + Notes: _libssh2_mbedtls_rsa_new_private_frommemory() fixes private-key from memory reading to by adding NULL terminator before parsing; adds passphrase support. + + Credit: doublex -- [Keno Fischer brought this change] +- [Ryan Kelley brought this change] - docs: Add documentation on new cmake/configure options + Session.c : banner_receive() from leaking when accessing non ssh ports (#356) + + File : session.c + + Release previous banner in banner_receive() if the session is reused after a failed connection. + + Credit : Ryan Kelley -- [Keno Fischer brought this change] +GitHub (11 Apr 2019) +- [Will Cosgrove brought this change] - configure: Add support for building with mbedtls + Formatting in agent.c + + Removed whitespace. -- [wildart brought this change] +- [Will Cosgrove brought this change] - travis: Test mbedtls too + Fixed formatting in agent.c + + Quiet linter around a couple if blocks and pointer. -- [wildart brought this change] +Will Cosgrove (11 Apr 2019) +- [Zhen-Huan HWANG brought this change] - crypto: add support for the mbedTLS backend + sftp.c : discard and reset oversized packet in sftp_packet_read() (#269) - Closes #132 - -- [wildart brought this change] + file : sftp.c + + notes : when sftp_packet_read() encounters an sftp packet which exceeds SFTP max packet size it now resets the reading state so it can continue reading. + + credit : Zhen-Huan HWANG - cmake: Add CLEAR_MEMORY option, analogously to that for autoconf +GitHub (11 Apr 2019) +- [Will Cosgrove brought this change] -- README.md: fix link typo + Add agent functions libssh2_agent_get_identity_path() and libssh2_agent_set_identity_path() (#308) + + File : agent.c + + Notes : + Libssh2 uses the SSH_AUTH_SOCK env variable to read the system agent location. However, when using a custom agent path you have to set this value using setenv which is not thread-safe. The new functions allow for a way to set a custom agent socket path in a thread safe manor. -- README: markdown version to look nicer on github +- [Will Cosgrove brought this change] -Viktor Szakats (5 Sep 2016) -- [Taylor Holberton brought this change] + Simplified _libssh2_check_length (#350) + + * Simplified _libssh2_check_length + + misc.c : _libssh2_check_length() + + Removed cast and improved bounds checking and format. + + Credit : Yuriy M. Kaminskiy - openssl: add OpenSSL 1.1.0 compatibility +- [Will Cosgrove brought this change] -Daniel Stenberg (4 Sep 2016) -- [Antenore Gatta brought this change] + _libssh2_check_length() : additional bounds check (#348) + + Misc.c : _libssh2_check_length() + + Ensure the requested length is less than the total length before doing the additional bounds check - tests: HAVE_NETINET_IN_H was not defined correctly (#127) +Daniel Stenberg (25 Mar 2019) +- misc: remove 'offset' from string_buf - Fixes #125 + It isn't necessary. + + Closes #343 -- SECURITY: fix web site typo +- sftp: repair mtime from e1ead35e475 + + A regression from e1ead35e4759 broke the SFTP mtime logic in + sftp_bin2attr + + Also simplified the _libssh2_get_u32/u64 functions slightly. + + Closes #342 -- SECURITY: security process +- session_disconnect: don't zero state, just clear the right bit + + If we clear the entire field, the freeing of data in session_free() is + skipped. Instead just clear the bit that risk making the code get stuck + in the transport functions. + + Regression from 4d66f6762ca3fc45d9. + + Reported-by: dimmaq on github + Fixes #338 + Closes #340 -GitHub (14 Aug 2016) -- [Alexander Lamaison brought this change] +- libssh2_sftp.h: restore broken ABI + + Commit 41fbd44 changed variable sizes/types in a public struct which + broke the ABI, which breaks applications! + + This reverts that change. + + Closes #339 - Basic dockerised test suite. +- style: make includes and examples code style strict - This introduces a test suite for libssh2. It runs OpenSSH in a Docker - container because that works well on Windows (via docker-machine) as - well as Linux. Presumably it works on Mac too with docker-machine, but - I've not tested that. + make travis and the makefile rule verify them too - Because the test suite is docker-machine aware, you can also run it - against a cloud provider, for more realistic network testing, by setting - your cloud provider as your active docker machine. The Appveyor CI setup - in this commit does that because Appveyor doesn't support docker - locally. + Closes #334 -Kamil Dudka (3 Aug 2016) -- [Viktor Szakats brought this change] +GitHub (21 Mar 2019) +- [Daniel Stenberg brought this change] - misc.c: Delete unused static variables - - Closes #114 + create a github issue template -Daniel Stenberg (9 Apr 2016) -- [Will Cosgrove brought this change] +Daniel Stenberg (21 Mar 2019) +- stale-bot: activated + + The stale bot will automatically mark stale issues (inactive for 90 + days) and if still untouched after 21 more days, close them. + + See https://probot.github.io/apps/stale/ - Merge pull request #103 from willco007/patch-2 +- libssh2_session_supported_algs.3: fix formatting mistakes - Fix for security issue CVE-2016-0787 + Reported-by: Max Horn + Fixes #57 -Alexander Lamaison (2 Apr 2016) - [Zenju brought this change] - Fix MSVC 14 compilation errors - - For _MSC_VER == 1900 these macros are not needed and create problems: - + libssh2.h: Fix Error C2371 'ssize_t': redefinition + Closes #331 + +- travis: add code style check - 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1925): warning C4005: 'snprintf': macro redefinition (compiling source file libssh2-files\src\mac.c) - - 1> \win32\libssh2_config.h(27): note: see previous definition of 'snprintf' (compiling source file libssh2-files\src\mac.c) + Closes #324 + +- code style: unify code style - 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1927): fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration (compiling source file libssh2-files\src\mac.c) + Indent-level: 4 + Max columns: 79 + No spaces after if/for/while + Unified brace positions + Unified white spaces -Daniel Stenberg (26 Mar 2016) -- [Brad Harder brought this change] +- src/checksrc.pl: code style checker + + imported as-is from curl - _libssh2_channel_open: speeling error fixed in channel error message +Will Cosgrove (19 Mar 2019) +- Merge branch 'MichaelBuckley-michaelbuckley-security-fixes' -Alexander Lamaison (15 Mar 2016) -- Link with crypt32.lib on Windows. +- Silence unused var warnings (#329) - Makes linking with static OpenSSL work again. Although it's not - required for dynamic OpenSSL, it does no harm. + Silence warnings about unused variables in this test + +- Removed unneeded > 0 check - Fixes #98. + When checking `userauth_kybd_num_prompts > 100` we don't care if it's also above zero. -- [Craig A. Berry brought this change] +- [Matthew D. Fuller brought this change] - Tweak VMS help file building. + Spell OpenSS_H_ right when talking about their specific private key (#321) - Primarily this is handling cases where top-level files moved into - the docs/ directory. I also corrected a typo and removed the - claim that libssh2 is public domain. + Good catch, thanks. -- [Craig A. Berry brought this change] +GitHub (19 Mar 2019) +- [Will Cosgrove brought this change] - Build with standard stat structure on VMS. + Silence unused var warnings (#329) - This gets us large file support, is available on any VMS release - in the last decade and more, and gives stat other modern features - such as 64-bit ino_t. + Silence warnings about unused variables in this test -- [Craig A. Berry brought this change] +Michael Buckley (19 Mar 2019) +- Fix more scope and printf warning errors - Update vms/libssh2_config.h. - - VMS does have stdlib.h, gettimeofday(), and OpenSSL. The latter - is appropriate to hard-wire in the configuration because it's - installed by default as part of the base operating system and - there is currently no libgcrypt port. +- Silence unused variable warning -- [Craig A. Berry brought this change] +GitHub (19 Mar 2019) +- [Will Cosgrove brought this change] - VMS can't use %zd for off_t format. + Removed unneeded > 0 check - %z is a C99-ism that VMS doesn't currently have; even though the - compiler is C99-compliant, the library isn't quite. The off_t used - for the st_size element of the stat can be 32-bit or 64-bit, so - detect what we've got and pick a format accordingly. + When checking `userauth_kybd_num_prompts > 100` we don't care if it's also above zero. -- [Craig A. Berry brought this change] +Will Cosgrove (19 Mar 2019) +- [Matthew D. Fuller brought this change] - Normalize line endings in libssh2_sftp_get_channel.3. + Spell OpenSS_H_ right when talking about their specific private key (#321) - Somehow it got Windows-style CRLF endings so convert to just LF, - for consistency as well as not to confuse tools that will regard - the \r as content (e.g. the OpenVMS help librarian). + Good catch, thanks. -Dan Fandrich (29 Feb 2016) -- libgcrypt: Fixed a NULL pointer dereference on OOM +Michael Buckley (18 Mar 2019) +- Fix errors identified by the build process -Daniel Stenberg (24 Feb 2016) -- [Viktor Szakats brought this change] +- Fix casting errors after merge - url updates, HTTP => HTTPS - - Closes #87 +GitHub (18 Mar 2019) +- [Michael Buckley brought this change] -Dan Fandrich (23 Feb 2016) -- RELEASE-NOTES: removed some duplicated names + Merge branch 'master' into michaelbuckley-security-fixes -Version 1.7.0 (23 Feb 2016) +Michael Buckley (18 Mar 2019) +- Move fallback SIZE_MAX and UINT_MAX to libssh2_priv.h -Daniel Stenberg (23 Feb 2016) -- web: the site is now HTTPS +- Fix type and logic issues with _libssh2_get_u64 -- RELEASE-NOTES: 1.7.0 release +Daniel Stenberg (17 Mar 2019) +- examples: fix various compiler warnings -- diffie_hellman_sha256: convert bytes to bits - - As otherwise we get far too small numbers. - - Reported-by: Andreas Schneider - - CVE-2016-0787 +- lib: fix various compiler warnings -Alexander Lamaison (18 Feb 2016) -- Allow CI failures with VS 2008 x64. +- session: ignore pedantic warnings for funcpointer <=> void * + +- travis: add a build using configure - Appveyor doesn't support this combination. + Closes #320 -Daniel Stenberg (16 Feb 2016) -- [Viktor Szakats brought this change] +- configure: provide --enable-werror - GNUmakefile: list system libs after user libs +- appveyor: remove old builds that mostly cause failures - Otherwise some referenced WinSock functions will fail to - resolve when linking against LibreSSL 2.3.x static libraries - with mingw. + ... and only run on master branch. - Closes #80 + Closes #323 -- [Viktor Szakats brought this change] +- cmake: add two missing man pages to get installed too + + Both libssh2_session_handshake.3 and + libssh2_userauth_publickey_frommemory.3 were installed by the configure + build already. + + Reported-by: Arfrever on github + Fixes #278 - openssl: apply new HAVE_OPAQUE_STRUCTS macro +- include/libssh2.h: warning: "_WIN64" is not defined, evaluates to 0 - Closes #81 + We don't use #if for defines that might not be defined. -- [Viktor Szakats brought this change] +- pem: //-comments are not allowed - openssl: fix LibreSSL support after OpenSSL 1.1.0-pre1/2 support +Will Cosgrove (14 Mar 2019) +- [Daniel Stenberg brought this change] -Alexander Lamaison (14 Feb 2016) -- sftp.h: Fix non-C90 type. + userauth: fix "Function call argument is an uninitialized value" (#318) - uint64_t does not exist in C90. Use libssh2_uint64_t instead. + Detected by scan-build. -- Exclude sshd tests from AppVeyor. +- fixed unsigned/signed issue + +Daniel Stenberg (15 Mar 2019) +- session_disconnect: clear state - They fail complaining that sshd wasn't invoked with an absolute path. + If authentication is started but not completed before the application + gives up and instead wants to shut down the session, the '->state' field + might still be set and thus effectively dead-lock session_disconnect. + + This happens because both _libssh2_transport_send() and + _libssh2_transport_read() refuse to do anything as long as state is set + without the LIBSSH2_STATE_KEX_ACTIVE bit. + + Reported in curl bug https://github.com/curl/curl/issues/3650 + + Closes #310 -- Test on more versions of Visual Studio. +Will Cosgrove (14 Mar 2019) +- Release notes from 1.8.1 -- Fix Appveyor builds. +Michael Buckley (14 Mar 2019) +- Use string_buf in sftp_init(). -Daniel Stenberg (14 Feb 2016) -- [Viktor Szakats brought this change] +- Guard against out-of-bounds reads in publickey.c - openssl: add OpenSSL 1.1.0-pre3-dev compatibility - - by using API instead of accessing an internal structure. - - Closes #83 +- Guard against out-of-bounds reads in session.c -- RELEASE-NOTES: synced with 996b04ececdf +- Guard against out-of-bounds reads in userauth.c -- include/libssh2.h: next version is 1.7.0 +- Use LIBSSH2_ERROR_BUFFER_TOO_SMALL instead of LIBSSH2_ERROR_OUT_OF_BOUNDARY in sftp.c -- configure: build "silent" if possible +- Additional bounds checking in sftp.c -- sftp: re-indented some minor stuff +- Additional length checks to prevent out-of-bounds reads and writes in _libssh2_packet_add(). https://libssh2.org/CVE-2019-3862.html -- [Jakob Egger brought this change] - - sftp.c: ensure minimum read packet size - - For optimum performance we need to ensure we don't request tiny packets. - -- [Jakob Egger brought this change] +- Add a required_size parameter to sftp_packet_require et. al. to require callers of these functions to handle packets that are too short. https://libssh2.org/CVE-2019-3860.html - sftp.c: Explicit return values & sanity checks +- Check the length of data passed to sftp_packet_add() to prevent out-of-bounds reads. -- [Jakob Egger brought this change] +- Prevent zero-byte allocation in sftp_packet_read() which could lead to an out-of-bounds read. https://libssh2.org/CVE-2019-3858.html - sftp.c: Check Read Packet File Offset - - This commit adds a simple check to see if the offset of the read - request matches the expected file offset. +- Sanitize padding_length - _libssh2_transport_read(). https://libssh2.org/CVE-2019-3861.html - We could try to recover, from this condition at some point in the future. - Right now it is better to return an error instead of corrupted data. + This prevents an underflow resulting in a potential out-of-bounds read if a server sends a too-large padding_length, possibly with malicious intent. -- [Jakob Egger brought this change] +- Defend against writing beyond the end of the payload in _libssh2_transport_read(). - sftp.c: Don't return EAGAIN if data was written to buffer +- Defend against possible integer overflows in comp_method_zlib_decomp. -- [Jakob Egger brought this change] +GitHub (14 Mar 2019) +- [Will Cosgrove brought this change] - sftp.c: Send at least one read request before reading + Security fixes (#315) - This commit ensures that we have sent at least one read request before - we try to read data in sftp_read(). + * Bounds checks - Otherwise sftp_read() would return 0 bytes (indicating EOF) if the - socket is not ready for writing. - -- [Jakob Egger brought this change] - - sftp.c: stop reading when buffer is full + Fixes for CVEs + https://www.libssh2.org/CVE-2019-3863.html + https://www.libssh2.org/CVE-2019-3856.html - Since we can only store data from a single chunk in filep, - we have to stop receiving data as soon as the buffer is full. + * Packet length bounds check - This adresses the following bug report: - https://github.com/libssh2/libssh2/issues/50 - -Salvador Fandiño (21 Jan 2016) -- agent_disconnect_unix: unset the agent fd after closing it + CVE + https://www.libssh2.org/CVE-2019-3855.html - "agent_disconnect_unix", called by "libssh2_agent_disconnect", was - leaving the file descriptor in the agent structure unchanged. Later, - "libssh2_agent_free" would call again "libssh2_agent_disconnect" under - the hood and it would try to close again the same file descriptor. In - most cases that resulted in just a harmless error, but it is also - possible that the file descriptor had been reused between the two - calls resulting in the closing of an unrelated file descriptor. + * Response length check - This patch sets agent->fd to LIBSSH2_INVALID_SOCKET avoiding that - issue. + CVE + https://www.libssh2.org/CVE-2019-3859.html - Signed-off-by: Salvador Fandiño - -Daniel Stenberg (18 Jan 2016) -- [Patrick Monnerat brought this change] - - os400qc3: support encrypted private keys + * Bounds check - PKCS#8 EncryptedPrivateKeyinfo structures are recognized and decoded to get - values accepted by the Qc3 crypto library. - -- [Patrick Monnerat brought this change] - - os400qc3: New PKCS#5 decoder + CVE + https://www.libssh2.org/CVE-2019-3857.html - The Qc3 library is not able to handle PKCS#8 EncryptedPrivateKeyInfo structures - by itself. It is only capable of decrypting the (encrypted) PrivateKeyInfo - part, providing a key encryption key and an encryption algorithm are given. - Since the encryption key and algorithm description part in a PKCS#8 - EncryptedPrivateKeyInfo is a PKCS#5 structure, such a decoder is needed to - get the derived key method and hash, as well as encryption algorith and - initialisation vector. + * Bounds checking + + CVE + https://www.libssh2.org/CVE-2019-3859.html + + and additional data validation + + * Check bounds before reading into buffers + + * Bounds checking + + CVE + https://www.libssh2.org/CVE-2019-3859.html + + * declare SIZE_MAX and UINT_MAX if needed -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - os400qc3: force continuous update on non-final hash/hmac computation + fixed type warnings (#309) -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - os400qc3: Be sure hmac keys have a minimum length - - The Qc3 library requires a minimum key length depending on the target - hash algorithm. Append binary zeroes to the given key if not long enough. - This matches RFC 2104 specifications. + Bumping version number for pending 1.8.1 release -- [Patrick Monnerat brought this change] +Will Cosgrove (4 Mar 2019) +- [Daniel Stenberg brought this change] - os400qc3: Slave descriptor for key encryption key + _libssh2_string_buf_free: use correct free (#304) - The Qc3 library requires the key encryption key to exist as long as - the encrypted key is used. Its descriptor token is then kept as an - "encrypted key slave" for recursive release. + Use LIBSSH2_FREE() here, not free(). We allow memory function + replacements so free() is rarely the right choice... -- [Patrick Monnerat brought this change] +GitHub (26 Feb 2019) +- [Will Cosgrove brought this change] - os400qc3.c: comment PEM/DER decoding + Fix for building against libreSSL #302 + + Changed to use the check we use elsewhere. -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - os400qc3.c: improve ASN.1 header byte checks + Fix for when building against LibreSSL #302 -- [Patrick Monnerat brought this change] +Will Cosgrove (25 Feb 2019) +- [gartens brought this change] - os400qc3.c: improve OID matching + docs: update libssh2_hostkey_hash.3 [ci skip] (#301) -- [Patrick Monnerat brought this change] +GitHub (21 Feb 2019) +- [Will Cosgrove brought this change] - os400: os400qc3.c: replace malloc by LIBSSH2_ALLOC or alloca where possible + fix malloc/free mismatches #296 (#297) -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - os400: asn1_new_from_bytes(): use data from a single element only + Replaced malloc with calloc #295 -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - os400: fix an ILE/RPG prototype + Abstracted OpenSSL calls out of hostkey.c (#294) -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - os400: implement character encoding conversion support + Fix memory dealloc impedance mis-match #292 (#293) + + When using ed25519 host keys and a custom memory allocator. -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - os400: do not miss some external prototypes + Added call to OpenSSL_add_all_digests() #288 - Build procedure extproto() did not strip braces from header files, thus - possibly prepended them to true prototypes. This prevented the prototype to - be recognized as such. - The solution implemented here is to map braces to semicolons, effectively - considering them as potential prototype delimiters. + For OpenSSL 1.0.x we need to call OpenSSL_add_all_digests(). -- [Patrick Monnerat brought this change] +Will Cosgrove (12 Feb 2019) +- [Zhen-Huan HWANG brought this change] - os400: Really add specific README + SFTP: increase maximum packet size to 256K (#268) + + to match implementations like OpenSSH. -- [Patrick Monnerat brought this change] +- [Zenju brought this change] - os400: Add specific README and include new files in dist tarball + Fix https://github.com/libssh2/libssh2/pull/271 (#284) -- [Patrick Monnerat brought this change] +GitHub (16 Jan 2019) +- [Will Cosgrove brought this change] - os400: add compilation scripts + Agent NULL check in shutdown #281 -- [Patrick Monnerat brought this change] +Will Cosgrove (15 Jan 2019) +- [Adrian Moran brought this change] - os400: include files for ILE/RPG + mbedtls: Fix leak of 12 bytes by each key exchange. (#280) - In addition, file os400/macros.h declares all procedures originally - defined as macros. It must not be used for real inclusion and is only - intended to be used as a `database' for macro wrapping procedures generation. + Correctly free ducts by calling _libssh2_mbedtls_bignum_free() in dtor. -- [Patrick Monnerat brought this change] +- [alex-weaver brought this change] - os400: add supplementary header files/wrappers. Define configuration. + Fix error compiling on Win32 with STDCALL=ON (#275) -- [Patrick Monnerat brought this change] +GitHub (8 Nov 2018) +- [Will Cosgrove brought this change] - Protect callback function calls from macro substitution + Allow default permissions to be used in sftp_mkdir (#271) - Some structure fields holding callback addresses have the same name as the - underlying system function (connect, send, recv). Set parentheses around - their reference to suppress a possible macro substitution. - - Use a macro for connect() on OS/400 to resolve a const/nonconst parameter - problem. + Added constant LIBSSH2_SFTP_DEFAULT_MODE to use the server default permissions when making a new directory -- [Patrick Monnerat brought this change] +Will Cosgrove (13 Sep 2018) +- [Giulio Benetti brought this change] - Add interface for OS/400 crypto library QC3 + openssl: fix dereferencing ambiguity potentially causing build failure (#267) + + When dereferencing from *aes_ctr_cipher, being a pointer itself, + ambiguity can occur; fixed possible build errors. -- [Patrick Monnerat brought this change] +Viktor Szakats (12 Sep 2018) +- win32/GNUmakefile: define HAVE_WINDOWS_H + + This macro was only used in test/example code before, now it is + also used in library code, but only defined automatically by + automake/cmake, so let's do the same for the standalone win32 + make file. + + It'd be probably better to just rely on the built-in _WIN32 macro + to detect the presence of windows.h though. It's already used + in most of libssh2 library code. There is a 3rd, similar macro + named LIBSSH2_WIN32, which might also be replaced with _WIN32. + + Ref: https://github.com/libssh2/libssh2/commit/8b870ad771cbd9cd29edbb3dbb0878e950f868ab + Closes https://github.com/libssh2/libssh2/pull/266 - misc: include stdarg.h for debug code +Marc Hoersken (2 Sep 2018) +- Fix conditional check for HAVE_DECL_SECUREZEROMEMORY + + "Unlike the other `AC_CHECK_*S' macros, when a symbol is not declared, + HAVE_DECL_symbol is defined to `0' instead of leaving HAVE_DECL_symbol + undeclared. When you are sure that the check was performed, + use HAVE_DECL_symbol in #if." + + Source: autoconf documentation for AC_CHECK_DECLS. -- [Patrick Monnerat brought this change] +- Fix implicit declaration of function 'SecureZeroMemory' + + Include window.h in order to use SecureZeroMemory on Windows. - Document crypto library interface +- Fix implicit declaration of function 'free' by including stdlib.h -- [Patrick Monnerat brought this change] +GitHub (27 Aug 2018) +- [Will Cosgrove brought this change] - Feature an optional crypto-specific macro to rsa sign a data fragment vector - - OS/400 crypto library is unable to sign a precomputed SHA1 hash: however - it does support a procedure that hashes data fragments and rsa signs. - If defined, the new macro _libssh2_rsa_sha1_signv() implements this function - and disables use of _libssh2_rsa_sha1_sign(). + Use malloc abstraction function in pem parse - The function described above requires that the struct iovec unused slacks are - cleared: for this reason, macro libssh2_prepare_iovec() has been introduced. - It should be defined as empty for crypto backends that are not sensitive - to struct iovec unused slack values. + Fix warning on WinCNG build. -- [Patrick Monnerat brought this change] +- [Will Cosgrove brought this change] - Fold long lines in include files + Fixed possible junk memory read in sftp_stat #258 -- [Viktor Szakats brought this change] +- [Will Cosgrove brought this change] - kex.c: fix indentation + removed INT64_C define (#260) - Closes #71 + No longer used. -- [Viktor Szakats brought this change] +- [Will Cosgrove brought this change] - add OpenSSL-1.1.0-pre2 compatibility - - Closes #70 + Added conditional around engine.h include -- [Viktor Szakats brought this change] +Will Cosgrove (6 Aug 2018) +- [Alex Crichton brought this change] - add OpenSSL 1.1.0-pre1 compatibility + Fix OpenSSL link error with `no-engine` support (#259) - * close https://github.com/libssh2/libssh2/issues/69 - * sync a declaration with the rest of similar ones - * handle EVP_MD_CTX_new() returning NULL with OpenSSL 1.1.0 - * fix potential memory leak with OpenSSL 1.1.0 in - _libssh2_*_init() functions, when EVP_MD_CTX_new() succeeds, - but EVP_DigestInit() fails. + This commit fixes linking against an OpenSSL library that was compiled with + `no-engine` support by bypassing the initialization routines as they won't be + available anyway. -Marc Hoersken (22 Dec 2015) -- wincng.c: fixed _libssh2_wincng_hash_final return value +GitHub (2 Aug 2018) +- [Will Cosgrove brought this change] + + ED25519 Key Support #39 (#248) - _libssh2_wincng_hash_final was returning the internal BCRYPT - status code instead of a valid libssh2 return value (0 or -1). + OpenSSH Key and ED25519 support #39 + Added _libssh2_explicit_zero() to explicitly zero sensitive data in memory #120 - This also means that _libssh2_wincng_hash never returned 0. + * ED25519 Key file support - Requires OpenSSL 1.1.1 or later + * OpenSSH Key format reading support - Supports RSA/DSA/ECDSA/ED25519 types + * New string buffer reading functions - These add build-in bounds checking and convenance methods. Used for OpenSSL PEM file reading. + * Added new tests for OpenSSH formatted Keys -- wincng.c: fixed possible memory leak in _libssh2_wincng_hash +- [Will Cosgrove brought this change] + + ECDSA key types are now explicit (#251) - If _libssh2_wincng_hash_update failed _libssh2_wincng_hash_final - would never have been called before. + * ECDSA key types are now explicit - Reported by Zenju. + Issue was brough up in pull request #248 -Kamil Dudka (15 Dec 2015) -- [Paul Howarth brought this change] +Will Cosgrove (2 May 2018) +- [Jakob Egger brought this change] - libssh2.pc.in: fix the output of pkg-config --libs + Add Instructions for building from Master (#249) + +GitHub (27 Apr 2018) +- [Will Cosgrove brought this change] + + Initialize sb_intl #226 + +Will Cosgrove (19 Apr 2018) +- [doublex brought this change] + + buffer overflow (valgrind) (#159) + +- [Brendan Shanks brought this change] + + mbedTLS: Remove some C99-style intermingled variable declarations (#196) + +GitHub (18 Apr 2018) +- [Will Cosgrove brought this change] + + fix for #160 + +Will Cosgrove (18 Apr 2018) +- [doublex brought this change] + + fix memory leak when using mbedtls backend (#158) - ... such that it does not include LDFLAGS used to build libssh2 itself. - There was a similar fix in the curl project long time ago: + _libssh2_bn_init_from_bin/_libssh2_bn_free would leak bignum from mbedtls_calloc(). + +- [Brendan Shanks brought this change] + + mbedTLS: Avoid multiple definition errors for context handles (#197) + +- [Tseng Jun brought this change] + + Fix the EVP cipher meth memory leakage problem (#244) - https://github.com/bagder/curl/commit/curl-7_19_7-56-g4c8adc8 + * Fix the EVP cipher meth memory leakage problem - Bug: https://bugzilla.redhat.com/1279966 - Signed-off-by: Kamil Dudka + Looks good, thanks for the fixes. -Marc Hoersken (6 Dec 2015) -- hostkey.c: align code path of ssh_rsa_init to ssh_dss_init +Marc Hörsken (31 Mar 2018) +- [Will Cosgrove brought this change] -- hostkey.c: fix invalid memory access if libssh2_dsa_new fails + Added ECDSA defines for WinCNG (#245) - Reported by dimmaq, fixes #66 + Fixed missing defines preventing building using WinCNG -Daniel Stenberg (3 Nov 2015) +GitHub (30 Mar 2018) - [Will Cosgrove brought this change] - gcrypt: define libssh2_sha256_ctx + Fix for _libssh2_rsa_new with OpenSSL 1.0.x - Looks like it didn't make it into the latest commit for whatever reason. - - Closes #58 + missing d value assignment. -- [Salvador Fandino brought this change] +Will Cosgrove (20 Mar 2018) +- [Etienne Samson brought this change] - libssh2_session_set_last_error: Add function + A collection of small fixes (#198) - Net::SSH2, the Perl wrapping module for libssh2 implements several features* - on top of libssh2 that can fail and so need some mechanism to report the error - condition to the user. + * tests: Remove if-pyramids - Until now, besides the error state maintained internally by libssh2, another - error state was maintained at the Perl level for every session object and then - additional logic was used to merge both error states. That is a maintenance - nighmare, and actually there is no way to do it correctly and consistently. + * tests: Switch run_command arguments - In order to allow the high level language to add new features to the library - but still rely in its error reporting features the new function - libssh2_session_set_last_error (that just exposses _libssh2_error_flags) is - introduced. + * tests: Make run_command a vararg function - *) For instance, connecting to a remote SSH service giving the hostname and - port. + * tests: Xcode doesn't obey CMake's test working directory - Signed-off-by: Salvador Fandino - Signed-off-by: Salvador Fandiño + * openssl: move manual AES-CTR cipher into crypto init + + * cmake: Move our include dir before all other include paths -- [Salvador Fandino brought this change] +GitHub (15 Mar 2018) +- [Will Cosgrove brought this change] - _libssh2_error: Support allocating the error message + Fixes incorrect indexing of KEX prefs string - Before this patch "_libssh2_error" required the error message to be a - static string. + After stripping out an invalid KEX pref entry, it would incorrectly advance again leaving invalid values in the list. + +Viktor Szakats (13 Mar 2018) +- tests: fix checksrc warnings - This patch adds a new function "_libssh2_error_flags" accepting an - additional "flags" argument and specifically the flag - "LIBSSH2_ERR_FLAG_DUP" indicating that the passed string must be - duplicated into the heap. + Also: + * add 'static' qualifier to file-wide const buffers + * fix a non-ANSI C89 comment + * silence a mismatched fprintf() mask warning by adding a cast + +- cmake: recognize OpenSSL 1.1 .dll names - Then, the method "_libssh2_error" has been rewritten to use that new - function under the hood. + Also fix some comment typos and a stray tab. + +- docs: update an URL [ci skip] + +Daniel Stenberg (12 Mar 2018) +- docs/SECURITY: the max embargo is 14 days now + +Viktor Szakats (12 Mar 2018) +- docs: spelling fixes [ci skip] - Signed-off-by: Salvador Fandino - Signed-off-by: Salvador Fandiño + Closes https://github.com/libssh2/libssh2/pull/222 +GitHub (12 Mar 2018) - [Will Cosgrove brought this change] - added engine.h include to fix warning + Fixed minor tabs/spacing issues -- [sune brought this change] +- [Will Cosgrove brought this change] - kex.c: removed dupe entry from libssh2_kex_methods[] + Update kex.c + +- [Will Cosgrove brought this change] + + Added basic bounds checking #206 - Closes #51 + Basic bounds checking in ecdh_sha2_nistp() -- [Salvador Fandiño brought this change] +- [Will Cosgrove brought this change] - userauth: Fix off by one error when reading public key file + Fixed Clang warning #206 - After reading the public key from file the size was incorrectly - decremented by one. + Fixed possible garbage value for secret in an error case + +- [Will Cosgrove brought this change] + + Fixed incorrect #if to #ifdef #206 - This was usually a harmless error as the last character on the public - key file is an unimportant EOL. But if due to some error the public key - file is empty, the public key size becomes (uint)(0 - 1), resulting in - an unrecoverable out of memory error later. + When checking HAVE_OPAQUE_STRUCTS. + +Viktor Szakats (12 Mar 2018) +- src: suppress two checksrc warnings - Signed-off-by: Salvador Fandi??o + Ref: https://github.com/libssh2/libssh2/pull/235 -- [Salvador Fandino brought this change] +- src: address fopen() warnings, add missing copyright headers + + Ref: https://github.com/libssh2/libssh2/pull/235 - channel: Detect bad usage of libssh2_channel_process_startup +- src: replace sprintf() with snprintf() - A common novice programmer error (at least among those using the - wrapping Perl module Net::SSH2), is to try to reuse channels. + Ref: https://github.com/libssh2/libssh2/pull/235 + +- src: fix checksrc warnings - This patchs detects that incorrect usage and fails with a - LIBSSH2_ERROR_BAD_USE error instead of hanging. + Use checksrc.pl from the curl project, with (for now) + suppressed long line warnings and indentation set to + 4 spaces. Fixes are whitespace for the most part. - Signed-off-by: Salvador Fandino + Warning count went down from 2704 to 12. + + Also fix codespell typos, two non-ANSI C89 comments + and a stray tab in include/libssh2.h. + + Ref: https://github.com/libssh2/libssh2/pull/235 -- [Will Cosgrove brought this change] +- checksrc: add source style checker + + This is a slightly extended version of this original source + from the curl project: + https://github.com/curl/curl/blob/8b754c430b9a4c51aa606c687ee5014faf7c7b06/lib/checksrc.pl + + This version adds the following options to customize it for + libssh2 (plus some whitespace formatting): + + `-i` to override indentation spaces (2) + `-m` to override maximum line length (79) + + Command-line used to check libssh2 sources: + + $ ./checksrc.pl -i4 -m500 *.c *.h + + Closes https://github.com/libssh2/libssh2/pull/236 - kex: Added diffie-hellman-group-exchange-sha256 support +- src: add static qualifier - ... and fixed HMAC_Init depricated usage + To private, const strings. - Closes #48 + Closes https://github.com/libssh2/libssh2/pull/237 -Alexander Lamaison (21 Sep 2015) -- Prefixed new #defines to prevent collisions. +- [Will Cosgrove brought this change] + + Add support for ECDSA keys and host keys (#41) - Other libraries might have their own USE_WIN32_*FILES. + This commit lands full ECDSA key support when using the OpenSSL + backend. Which includes: + + New KEX methods: + ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521 + + Can now read OpenSSL formatted ECDSA key files. + + Now supports known host keys of type ecdsa-sha2-nistp256. + + New curve types: + NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1 + + Default host key preferred ordering is now nistp256, nistp384, + nistp521, rsa, dss. + + Ref: https://github.com/libssh2/libssh2/issues/41 + + Closes https://github.com/libssh2/libssh2/pull/206 -- [keith-daigle brought this change] +GitHub (15 Dec 2017) +- [Will Cosgrove brought this change] - Update examples/scp.c to fix bug where large files on win32 would cause got to wrap and go negative + Fixed possible crash when decoding invalid data + + When trying to decode invalid data, it frees the buffer but doesn't nil it so the caller gets a junk memory pointer which they could potentially double free. -- [David Byron brought this change] +- [Will Cosgrove brought this change] - add libssh2_scp_recv2 to support large (> 2GB) files on windows + Remove call to OpenSSL_add_all_ciphers() + + Now lives in libssh2 init() from PR #189 -Daniel Stenberg (17 Sep 2015) -- [sune brought this change] +- [Will Cosgrove brought this change] - WinCNG: support for SHA256/512 HMAC + Fixed incorrect reference to decrypted block - Closes #47 + Fixed incorrectly copied memory from p->buf into init instead of from the decrypted buffer block. The only reason this worked was because the crypt() function decrypts the value in-place and overwrites p->buf. I'm working on a fork that no longer does this and exposed this bug. -- [brian m. carlson brought this change] +Will Cosgrove (20 Oct 2017) +- [Pan brought this change] - Add support for HMAC-SHA-256 and HMAC-SHA-512. + Fix typo in crypt.c (#218) + +Kamil Dudka (17 Oct 2017) +- session: avoid printing misleading debug messages - Implement support for these algorithms and wire them up to the libgcrypt - and OpenSSL backends. Increase the maximum MAC buffer size to 64 bytes - to prevent buffer overflows. Prefer HMAC-SHA-256 over HMAC-SHA-512, and - that over HMAC-SHA-1, as OpenSSH does. + ... while throwing LIBSSH2_ERROR_EAGAIN out of session_startup() - Closes #40 + If the session runs in blocking mode, LIBSSH2_ERROR_EAGAIN never reaches + the libssh2 API boundary and, in non-blocking mode, these messages are + suppressed by the condition in _libssh2_error_flags() anyway. + + Closes #211 -- [Zenju brought this change] +Viktor Szakats (15 Oct 2017) +- win32/GNUmakefile: allow customizing dll suffixes + + - New `LIBSSH2_DLL_SUFFIX` envvar will add a suffix to the generated + libssh2 dll name. Useful to add `-x64` to 64-bit builds so that + it can live in the same directory as the 32-bit one. By default + this is empty. + + - New `LIBSSH2_DLL_A_SUFFIX` envvar to customize the suffix of the + generated import library (implib) for libssh2 .dll. It defaults + to `dll`, and it's useful to modify that to `.dll` to have the + standard naming scheme for mingw-built .dlls, i.e. `libssh2.dll.a`. + + Ref: https://github.com/curl/curl/commit/aaa16f80256abc1463fd9374815130a165222257 + + Closes https://github.com/libssh2/libssh2/pull/215 - kex: free server host key before allocating it (again) +- makefile.m32: allow to override gcc, ar and ranlib - Fixes a memory leak when Synology server requests key exchange + Allow to ovverride certain build tools, making it possible to + use LLVM/Clang to build libssh2. The default behavior is unchanged. + To build with clang (as offered by MSYS2), these settings can + be used: - Closes #43 + LIBSSH2_CC=clang + LIBSSH2_AR=llvm-ar + LIBSSH2_RANLIB=llvm-ranlib + + Also adjust ranlib parameters to be compatible with LLVM/Clang's + ranlib tool. + + Closes https://github.com/libssh2/libssh2/pull/214 -- [Viktor Szakats brought this change] +GitHub (27 Sep 2017) +- [Will Cosgrove brought this change] - GNUmakefile: up OpenSSL version + Fixes out of bounds memory access (#210) - closes #23 + If an invalid PEM file is read and the lines are longer than 128 characters it will go out of bounds and crash on line 91. -- [Viktor Szakats brought this change] +Will Cosgrove (11 Sep 2017) +- [Kamil Dudka brought this change] - GNUmakefile: add -m64 CFLAGS when targeting mingw64, add -m32/-m64 to LDFLAGS + scp: do not NUL-terminate the command for remote exec (#208) - libssh2 equivalent of curl patch https://github.com/bagder/curl/commit/d21b66835f2af781a3c2a685abc92ef9f0cd86be + It breaks SCP download/upload from/to certain server implementations. - This allows to build for the non-default target when using a multi-target mingw distro. - Also bump default OpenSSL dependency path to 1.0.2c. + The bug does not manifest with OpenSSH, which silently drops the NUL + byte (eventually with any garbage that follows the NUL byte) before + executing it. + + Bug: https://bugzilla.redhat.com/1489736 +GitHub (21 Aug 2017) - [Viktor Szakats brought this change] - GNUmakefile: add support for LIBSSH2_LDFLAG_EXTRAS + openssl.c: remove no longer used variable (#204) - It is similar to existing LIBSSH2_CFLAG_EXTRAS, but for - extra linker options. + after e378d2e30a40bd9bcee06dc3a4250f269098e200 + +- [Will Cosgrove brought this change] + + Fix for #188 (#189) - Also delete some line/file ending whitespace. + * Update openssl.c - closes #27 + * Create openssl.h -- [nasacj brought this change] +Will Cosgrove (24 May 2017) +- [Marcel Raad brought this change] - hostkey.c: Fix compiling error when OPENSSL_NO_MD5 is defined + openssl: fix build with OpenSSL 1.1 API (#176) - Closes #32 + When building with OPENSSL_API_COMPAT=0x10100000L, OpenSSL_add_all_algorithms + and OpenSSL_add_all_ciphers don't exist. The corresponding functionality is + handled automatically with OpenSSL 1.1. -- [Mizunashi Mana brought this change] +- [Sune Bredahl brought this change] - openssl.h: adjust the rsa/dsa includes - - ... to work when built without DSA support. + Add support for SHA256 hostkey fingerprints (#180) - Closes #36 + Looks good, thanks! -Alexander Lamaison (26 Jul 2015) -- Let CMake build work as a subproject. +GitHub (12 May 2017) +- [Will Cosgrove brought this change] + + Fix memory leak of crypt_ctx->h using openSSL 1.1+ (#177) - Patch contributed by JasonHaslam. + Need to use EVP_CIPHER_CTX_free instead of EVP_CIPHER_CTX_reset. -- Fix builds with Visual Studio 2015. +Marc Hoersken (2 Mar 2017) +- tests/openssh_server/authorized_keys: add key_rsa_encrypted.pub + +- tests: add simple test for passphrase-protected PEM file support + +- os400qc3: enable passphrase-protected PEM file support using pem.c + +- pem: fix indentation and replace assert after 386e012292 + +- [Keno Fischer brought this change] + + pem: add passphrase-protected PEM file support for libgcrypt and wincng - VS2015 moved stdio functions to the header files as inline function. That means check_function_exists can't detect them because it doesn't use header files - just does a link check. Instead we need to use check_symbol_exists with the correct headers. + Since they use our own PEM parser which did not support encrypted + PEM files, trying to use such files on these backends failed. + Fix that by augmenting the PEM parser to support encrypted PEM files. -Kamil Dudka (2 Jul 2015) -- cmake: include CMake files in the release tarballs +- [Thomas brought this change] + + misc: use time constant implementation for AES CTR increment + +- [Thomas brought this change] + + wincng: add AES CTR mode support (aes128-ctr, aes192-ctr, aes256-ctr) + +- [Thomas brought this change] + + openssl: move shared AES-CTR code into misc + +Daniel Stenberg (20 Dec 2016) +- [Alex Crichton brought this change] + + kex: acknowledge error code from libssh2_dh_key_pair() - Despite we announced the CMake support in libssh2-1.6.0 release notes, - the files required by the CMake build system were not included in the - release tarballs. Hence, the only way to use CMake for build was the - upstream git repository. + Fixes a segfault using ssh-agent on Windows - This commit makes CMake actually supported in the release tarballs. - -- tests/mansyntax.sh: fix 'make distcheck' with recent autotools + This commit fixes a segfault seen dereferencing a null pointer on + Windows when using ssh-agent. The problem ended up being that errors + weren't being communicated all the way through, causing null pointers to + be used when functions should have bailed out sooner. - Do not create symbolic links off the build directory. Recent autotools - verify that out-of-source build works even if the source directory tree - is not writable. + The `_libssh2_dh_key_pair` function for WinCNG was modified to propagate + errors, and then the two callsites in kex.c of + `diffie_hellman_sha{1,256}` were updated to recognize this error and + bail out. + + Fixes #162 + Closes #163 -- openssl: fix memleak in _libssh2_dsa_sha1_verify() +Alexander Lamaison (27 Nov 2016) +- [monnerat brought this change] -Daniel Stenberg (12 Jun 2015) -- openssl: make libssh2_sha1 return error code + Implement Diffie-Hellman computations in crypto backends. (#149) - - use the internal prefix _libssh2_ for non-exported functions + Not all backends feature the low level API needed to compute a Diffie-Hellman + secret, but some of them directly implement Diffie-Hellman support with opaque + private data. The later approach is now generalized and backends are + responsible for all Diffie Hellman computations. + As a side effect, procedures/macros _libssh2_bn_rand and _libssh2_bn_mod_exp + are no longer needed outside the backends. + +Peter Stuge (16 Nov 2016) +- acinclude.m4: The mbedtls crypto backend actually requires libmbedcrypto - - removed libssh2_md5() since it wasn't used + Examples can't be linked with libmbedtls but need libmbedcrypto, and + any users of libssh2 which use libtool and libssh2.la would encounter + the same problem. - Reported-by: Kamil Dudka - -- [LarsNordin-LNdata brought this change] + This changes the mbedtls detection to search for libmbedcrypto, which + is the actual dependency for the backend. - SFTP: Increase speed and datasize in SFTP read +- acinclude.m4: Add CPPFLAGS=-I$prefix-dir/include in LIBSSH2_LIB_HAVE_LINKFLAGS - The function sftp_read never return more then 2000 bytes (as it should - when I asked Daniel). I increased the MAX_SFTP_READ_SIZE to 30000 but - didn't get the same speed as a sftp read in SecureSSH. I analyzed the - code and found that a return always was dona when a chunk has been read. - I changed it to a sliding buffer and worked on all available chunks. I - got an increase in speed and non of the test I have done has failed - (both local net and over Internet). Please review and test. I think - 30000 is still not the optimal MAX_SFTP_READ_SIZE, my next goal is to - make an API to enable changing this value (The SecureSSH sftp_read has - more complete filled packages when comparing the network traffic) + This is absolutely neccessary for header files to be found when + AC_LIB_HAVE_LINKFLAGS searches for libraries. -- bump: start working on 1.6.1 +- acinclude.m4: Make saved variables in LIBSSH2_LIB_HAVE_LINKFLAGS uniform -Version 1.6.0 (5 Jun 2015) +- docs/HACKING.CRYPTO: Improve documentation for autoconf build system -Daniel Stenberg (5 Jun 2015) -- RELEASE-NOTES: synced with 858930cae5c6a +Alexander Lamaison (16 Nov 2016) +- [Alex Arslan brought this change] -Marc Hoersken (19 May 2015) -- wincng.c: fixed indentation + Check for netinet/in.h in the tests cmake file (#148) -- [sbredahl brought this change] +- [Patrick Monnerat brought this change] - wincng.c: fixed memleak in (block) cipher destructor + Define new Diffie-Hellman context for mbedTLS -Alexander Lamaison (6 May 2015) -- [Jakob Egger brought this change] +- [monnerat brought this change] - libssh2_channel_open: more detailed error message + Make libssh2 work again on os400. (#118) - The error message returned by libssh2_channel_open in case of a server side channel open failure is now more detailed and includes the four standard error conditions in RFC 4254. + * os400: minimum supported OS version is now V6R1. + Do not log compiler informational messages. + + * Implement crypto backend specific Diffie-Hellman computation. + + This feature is now needed on os400 because the QC3 library does not + implement bn_mod_exp() natively. Up to now, this function was emulated using + an RSA encryption, but commits ca5222ea819cc5ed797860070b4c6c1aeeb28420 and + 7934c9ce2a029c43e3642a492d3b9e494d1542be (CVE-2016-0787) broke the emulation + because QC3 only supports RSA exponents up to 512 bits. + + Happily, QC3 supports a native API for Diffie-Hellman computation, with + opaque random value: this commit implements the use of this API and, as a + side effect, enables support of this feature for any other crypto backend that + would use it. + + A "generic" Diffie-Hellman computation internal API supports crypto backends + not implementing their own: this generic API uses the same functions as before. + + * Fix typos in docs/HACKING.CRYPTO. -- [Hannes Domani brought this change] +- [Peter Stuge brought this change] - kex: fix libgcrypt memory leaks of bignum - - Fixes #168. + acinclude.m4: Fixup OpenSSL EVP_aes_128_ctr() detection -Marc Hoersken (3 Apr 2015) -- configure.ac: check for SecureZeroMemory for clear memory feature +- [Peter Stuge brought this change] -- Revert "wincng.c: fix clear memory feature compilation with mingw" + configure.ac: Add --with-crypto= instead of many different --with-$backend - This reverts commit 2d2744efdd0497b72b3e1ff6e732aa4c0037fc43. + The new --with-crypto option replaces the previous backend-specific + --with-{openssl,libgcrypt,mbedtls,wincng} options and fixes some issues. - Autobuilds show that this did not solve the issue. - And it seems like RtlFillMemory is defined to memset, - which would be optimized out by some compilers. - -- wincng.c: fix clear memory feature compilation with mingw + * libgcrypt or mbedtls would previously be used whenever found, even + if configure was passed --without-libgcrypt or --without-mbedtls. + + * If --with-$backend was specified then configure would not fail even + if that library could not be found, and would instead use whichever + crypto library was found first. + + The new option defaults to `auto`, which makes configure check for all + supported crypto libraries in turn, choosing the first one found, or + exiting with an error if none can be found. -Alexander Lamaison (1 Apr 2015) -- [LarsNordin-LNdata brought this change] +- [Tony Kelman brought this change] - Enable use of OpenSSL that doesn't have DSA. + Build mbedtls from source on Travis (#133) - Added #if LIBSSH2_DSA for all DSA functions. + * Revert "Revert "travis: Test mbedtls too"" + + This reverts commit c4c60eac5ca756333034b07dd9e0b97741493ed3. + + * travis: Build mbedtls from source on Travis + + Use TOOLCHAIN_OPTION when calling cmake on mbedtls + + * tests: only run DSA tests for non-mbedtls + + crypto backends -- [LarsNordin-LNdata brought this change] +- [Peter Stuge brought this change] - Use correct no-blowfish #define with OpenSSL. + configure.ac src/Makefile.am: Remove dead AM_CONDITIONAL(OS400QC3) - The OpenSSL define is OPENSSL_NO_BF, not OPENSSL_NO_BLOWFISH. + According to os400/README400 this backend can not be built + with configure+make, and the conditional is hard coded to false. -Marc Hoersken (25 Mar 2015) -- configure: error if explicitly enabled clear-memory is not supported - - This takes 22bd8d81d8fab956085e2079bf8c29872455ce59 and - b8289b625e291bbb785ed4add31f4759241067f3 into account, - but still makes it enabled by default if it is supported - and error out in case it is unsupported and was requested. +- [Peter Stuge brought this change] -Daniel Stenberg (25 Mar 2015) -- configure: make clear-memory default but only WARN if backend unsupported + configure.ac: Add -DNDEBUG to CPPFLAGS in non-debug builds - ... instead of previous ERROR. + There are a few uses of assert() in channel.c, sftp.c and transport.c. -Marc Hoersken (24 Mar 2015) -- wincng.h: fix warning about computed return value not being used +- [Peter Stuge brought this change] -- nonblocking examples: fix warning about unused tvdiff on Mac OS X + src/global.c: Fix conditional AES-CTR support + + Most of libssh2 already has conditional support for AES-CTR according to + the LIBSSH2_AES_CTR crypto backend #define, but global.c needed fixing. -Daniel Stenberg (24 Mar 2015) -- openssl: fix compiler warnings +- [Peter Stuge brought this change] -- cofigure: fix --disable-clear-memory check + src/crypto.h src/userauth.c: Fix conditional RSA support + + Most of libssh2 already has conditional support for RSA according to + the LIBSSH2_RSA crypto backend #define, but crypto.h and userauth.c + needed a few small fixes. -Marc Hoersken (23 Mar 2015) -- scp.c: improved command length calculation +- [Peter Stuge brought this change] + + src/kex.c: Cast libssh2_sha{1,256}_update data arguments properly - Reduced number of calls to strlen, because shell_quotearg already - returns the length of the resulting string (e.q. quoted path) - which we can add to the existing and known cmd_len. - Removed obsolete call to memset again, because we can put a final - NULL-byte at the end of the string using the calculated length. + The update functions take a const unsigned char * but were called + with (const) char * in some places, causing unneccessary warnings. -- scp.c: improved and streamlined formatting +- [Peter Stuge brought this change] -- scp.c: fix that scp_recv may transmit not initialised memory + docs/HACKING.CRYPTO: Fix two type typos -- scp.c: fix that scp_send may transmit not initialised memory - - Fixes ticket 244. Thanks Torsten. +- [Sergei Trofimovich brought this change] -- kex: do not ignore failure of libssh2_sha1_init() + acinclude.m4: fix ./configure --with-libgcrypt - Based upon 43b730ce56f010e9d33573fcb020df49798c1ed8. - Fixes ticket 290. Thanks for the suggestion, mstrsn. - -- wincng.h: fix return code of libssh2_md5_init() - -- openssl.c: fix possible segfault in case EVP_DigestInit fails - -- wincng.c: fix possible use of uninitialized variables - -- wincng.c: fix unused argument warning if clear memory is not enabled - -- wincng: Added explicit clear memory feature to WinCNG backend + The change fixes passing of bogus gcrypt prefix. + Reproducible as: - This re-introduces the original feature proposed during - the development of the WinCNG crypto backend. It still needs - to be added to libssh2 itself and probably other backends. + $ ./configure --with-libgcrypt + $ make V=1 + ... + /bin/sh ../libtool --tag=CC --mode=link gcc -g -O2 -Iyes/include -version-info 1:1:0 -no-undefined -export-symbols-regex '^libssh2_.*' -lgcrypt -lz -Lyes/lib -o libssh2.la -rpath /usr/local/lib channel.lo comp.lo crypt.lo hostkey.lo kex.lo mac.lo misc.lo packet.lo publickey.lo scp.lo session.lo sftp.lo userauth.lo transport.lo version.lo knownhost.lo agent.lo libgcrypt.lo pem.lo keepalive.lo global.lo -lgcrypt + ../libtool: line 7475: cd: yes/lib: No such file or directory + libtool: error: cannot determine absolute directory name of 'yes/lib' - Memory is cleared using the function SecureZeroMemory which is - available on Windows systems, just like the WinCNG backend. - -- wincng.c: fixed mixed line-endings - -- wincng.c: fixed use of invalid parameter types in a8d14c5dcf - -- wincng.c: only try to load keys corresponding to the algorithm - -- wincng.c: moved PEM headers into definitions - -- wincng.h: fixed invalid parameter name - -- wincng: fixed mismatch with declarations in crypto.h - -- userauth.c: fixed warning C6001: using uninitialized sig and sig_len - -- pem.c: fixed warning C6269: possible incorrect order of operations - -- wincng: add support for authentication keys to be passed in memory + These + -Iyes/include + -Lyes/lib + come from libgcrypt code autodetection: + if test -n "$use_libgcrypt" && test "$use_libgcrypt" != "no"; then + LDFLAGS="$LDFLAGS -L$use_libgcrypt/lib" + CFLAGS="$CFLAGS -I$use_libgcrypt/include" - Based upon 18cfec8336e and daa2dfa2db. - -- pem.c: add _libssh2_pem_parse_memory to parse PEM from memory + I assume it's a typo to use yes/no flag as a prefix and changed + it to '$with_libgcrypt_prefix'. - Requirement to implement 18cfec8336e for Libgcrypt and WinCNG. - -- pem.c: fix copy and paste mistake from 55d030089b8 - -- userauth.c: fix another possible dereference of a null pointer - -- userauth.c: fix possible dereference of a null pointer + Reported-by: Mikhail Pukhlikov + Signed-off-by: Sergei Trofimovich -- pem.c: reduce number of calls to strlen in readline - -Alexander Lamaison (17 Mar 2015) -- [Will Cosgrove brought this change] +- [Zenju brought this change] - Initialise HMAC_CTX in more places. + libssh2_sftp_init hang: last error not set - Missed a couple more places we init ctx to avoid openssl threading crash. - -- Build build breakage in WinCNG backend caused when adding libssh2_userauth_publickey_frommemory. + The problem is that the original if statement simply returns NULL, but does not set the session last error code. The consequence is that libssh2_sftp_init() also returns NULL and libssh2_session_last_errno(sshSession) == LIBSSH2_ERROR_NONE. - The new feature isn't implemented for the WinCNG backend currently, but the WinCNG backend didn't contain any implementation of the required backend functions - even ones that returns an error. That caused link errors. + In my test the LIBSSH2_ERROR_EAGAIN is coming from sftp.c row 337: + if(4 != sftp->partial_size_len) + /* we got a short read for the length part */ + return LIBSSH2_ERROR_EAGAIN; - This change fixes the problem by providing an implementation of the backend functions that returns an error. + with "partial_size_len == 0". Not sure if this is expected. -- Fix breakage in WinCNG backend caused by introducing libssh2_hmac_ctx_init. - - The macro was defined to nothing for the libgcrypt backend, but not for WinCNG. This brings the latter into line with the former. +- [Aidan Hobson Sayers brought this change] -Daniel Stenberg (15 Mar 2015) -- userauth_publickey_frommemory.3: add AVAILABILITY + docs: correctly describe channel_wait_eof - ... it will be added in 1.6.0 + channel_wait_eof waits for channel->remote.eof, which is set on + receiving a `SSH_MSG_CHANNEL_EOF` message. This message is sent + when a party has no more data to send on a channel. -- libssh2: next version will be called 1.6.0 - - ... since we just added a new function. +- [Zenju brought this change] -- docs: add libssh2_userauth_publickey_frommemory.3 to dist + Fix MSVC 14 compilation warning (#92) - The function and man page were added in commit 18cfec8336e + 1> sftp.c + 1>libssh2-files\src\sftp.c(3393): warning C4456: declaration of 'retcode' hides previous local declaration + 1> libssh2-files\src\sftp.c(3315): note: see declaration of 'retcode' -- [Jakob Egger brought this change] +- [Salvador Fandino brought this change] - direct_tcpip: Fixed channel write + LIBSSH2_ERROR_CHANNEL_WINDOW_FULL: add new error code - There were 3 bugs in this loop: - 1) Started from beginning after partial writes - 2) Aborted when 0 bytes were sent - 3) Ignored LIBSSH2_ERROR_EAGAIN + In order to signal that the requested operation can not succeed + because the receiving window had been exhausted, the error code + LIBSSH2_ERROR_BUFFER_TOO_SMALL has been reused but I have found + that in certain context it may be ambigous. - See also: - https://trac.libssh2.org/ticket/281 - https://trac.libssh2.org/ticket/293 + This patch introduces a new error code, + LIBSSH2_ERROR_CHANNEL_WINDOW_FULL, exclusive to signal that condition. -Alexander Lamaison (15 Mar 2015) -- [Will Cosgrove brought this change] +- [Salvador Fandino brought this change] - Must init HMAC_CTX before using it. + channel_wait_eof: handle receive window exhaustion - Must init ctx before using it or openssl will reuse the hmac which is not thread safe and causes a crash. - Added libssh2_hmac_ctx_init macro. - -- Add continuous integration configurations. + Until now, in blocking mode, if the remote receiving window is + exhausted this function hangs forever as data is not read and the + remote side just keeps waiting for the window to grow before sending + more data. - Linux-based CI is done by Travis CI. Windows-based CI is done by Appveyor. + This patch, makes this function check for that condition and abort + with an error when it happens. -- [David Calavera brought this change] +- [Salvador Fandino brought this change] - Allow authentication keys to be passed in memory. + channel_wait_closed: don't fail when unread data is queued - All credits go to Joe Turpin, I'm just reaplying and cleaning his patch: - http://www.libssh2.org/mail/libssh2-devel-archive-2012-01/0015.shtml + This function was calling channel_wait_eof to ensure that the EOF + packet has already been received, but that function also checks that + the read data queue is empty before reporting the EOF. That caused + channel_wait_closed to fail with a LIBSSH2_ERROR_INVAL when some data + was queued even after a successful call to libssh2_channel_wait_eof. - * Use an unimplemented error for extracting keys from memory with libgcrypt. + This patch changes libssh2_channel_wait_closed to look directly into + channel->remote.eof so that both libssh2_channel_wait_eof and + libssh2_channel_wait_closed bahave consistently. -Daniel Stenberg (14 Mar 2015) -- docs: include the renamed INSTALL* files in dist +- [Salvador Fandino brought this change] -Alexander Lamaison (13 Mar 2015) -- Prevent collisions between CMake and Autotools in examples/ and tests/. + channel_wait_eof: fix debug message -- Avoid clash between CMake build and Autotools. - - Autotools expects a configuration template file at src/libssh2_config.h.in, which buildconf generates. But the CMake build system has its CMake-specific version of the file at this path. This means that, if you don't run buildconf, the Autotools build will fail because it configured the wrong header template. - - See https://github.com/libssh2/libssh2/pull/8. +Daniel Stenberg (25 Oct 2016) +- libssh2.h: start working on 1.8.1 -- Merge pull request #8 from alamaison/cmake - - CMake build system. +Version 1.8.0 (25 Oct 2016) -- CMake build system. +Daniel Stenberg (25 Oct 2016) +- RELEASE-NOTES: adjusted for 1.8.0 + +Kamil Dudka (20 Oct 2016) +- Revert "aes: the init function fails when OpenSSL has AES support" - Tested: - - Windows: - - Visual C++ 2005/2008/2010/2012/2013/MinGW-w64 - - static/shared - - 32/64-bit - - OpenSSL/WinCNG - - Without zlib - - Linux: - - GCC 4.6.3/Clang 3.4 - - static/shared - - 32/64-bit - - OpenSSL/Libgcrypt - - With/Without zlib - - MacOS X - - AppleClang 6.0.0 - - static - - 64-bit - - OpenSSL - - Without zlib + This partially reverts commit f4f2298ef3635acd031cc2ee0e71026cdcda5864 + because it caused the compatibility code to call initialization routines + redundantly, leading to memory leakage with OpenSSL 1.1 and broken curl + test-suite in Fedora: - Conflicts: - README + 88 bytes in 1 blocks are definitely lost in loss record 5 of 8 + at 0x4C2DB8D: malloc (vg_replace_malloc.c:299) + by 0x72C607D: CRYPTO_zalloc (mem.c:100) + by 0x72A2480: EVP_CIPHER_meth_new (cmeth_lib.c:18) + by 0x4E5A550: make_ctr_evp.isra.0 (openssl.c:407) + by 0x4E5A8E8: _libssh2_init_aes_ctr (openssl.c:471) + by 0x4E5BB5A: libssh2_init (global.c:49) -- Man man syntax tests fail gracefully if man version is not suitable. +Daniel Stenberg (19 Oct 2016) +- [Charles Collicutt brought this change] -- Return valid code from test fixture on failure. + libssh2_wait_socket: Fix comparison with api_timeout to use milliseconds (#134) - The sshd test fixture was returning -1 if an error occurred, but negative error codes aren't technically valid (google it). Bash on Windows converted them to 0 which made setup failure look as though all tests were passing. + Fixes #74 -- Let mansyntax.sh work regardless of where it is called from. +- [Charles Collicutt brought this change] -Daniel Stenberg (12 Mar 2015) -- [Viktor Szakáts brought this change] + Set err_msg on _libssh2_wait_socket errors (#135) - mingw build: allow to pass custom CFLAGS +- Revert "travis: Test mbedtls too" - Allow to pass custom `CFLAGS` options via environment variable - `LIBSSH2_CFLAG_EXTRAS`. Default and automatically added options of - `GNUmakefile` have preference over custom ones. This addition is useful - for passing f.e. custom CPU tuning or LTO optimization (`-flto - -ffat-lto-objects`) options. The only current way to do this is to edit - `GNUmakefile`. This patch makes it unnecessary. + This reverts commit 3e6de50a24815e72ec5597947f1831f6083b7da8. - This is a mirror of similar libcurl patch: - https://github.com/bagder/curl/pull/136 + Travis doesn't seem to support the mbedtls-dev package -- [Will Cosgrove brought this change] +- maketgz: support "only" to only update version number locally + + and fix the date output locale - userauth: Fixed prompt text no longer being copied to the prompts struct +- configure: make the --with-* options override the OpenSSL default - Regression from 031566f9c + ... previously it would default to OpenSSL even with the --with-[crypto] + options used unless you specificly disabled OpenSSL. Now, enabling another + backend will automatically disable OpenSSL if the other one is found. -- README: update the git repo locations +- [Keno Fischer brought this change] -- wait_socket: wrong use of difftime() - - With reversed arguments it would always return a negative value... - - Bug: https://github.com/bagder/libssh2/issues/1 + docs: Add documentation on new cmake/configure options -- bump: start working toward 1.5.1 now +- [Keno Fischer brought this change] -Version 1.5.0 (11 Mar 2015) + configure: Add support for building with mbedtls -Daniel Stenberg (11 Mar 2015) -- RELEASE-NOTES: 1.5.0 release +- [wildart brought this change] -- [Mariusz Ziulek brought this change] + travis: Test mbedtls too - kex: bail out on rubbish in the incoming packet - - CVE-2015-1782 - - Bug: http://www.libssh2.org/adv_20150311.html +- [wildart brought this change] -- docs: move INSTALL, AUTHORS, HACKING and TODO to docs/ + crypto: add support for the mbedTLS backend - And with this, cleanup README to be shorter and mention the new source - code home. + Closes #132 -- .gitignore: don't ignore INSTALL +- [wildart brought this change] -Dan Fandrich (4 Mar 2015) -- examples/x11.c: include sys/select.h for improved portability + cmake: Add CLEAR_MEMORY option, analogously to that for autoconf -Daniel Stenberg (4 Mar 2015) -- RELEASE-NOTES: synced with a8473c819bc068 - - In preparation for the upcoming 1.5.0 release. +- README.md: fix link typo -Guenter Knauf (8 Jan 2015) -- NetWare build: added some missing exports. +- README: markdown version to look nicer on github -Marc Hoersken (29 Dec 2014) -- knownhost.c: fix use of uninitialized argument variable wrote - - Detected by clang scan in line 1195, column 18. +Viktor Szakats (5 Sep 2016) +- [Taylor Holberton brought this change] -- examples/x11.c: fix result of operation is garbage or undefined - - Fix use of uninitialized structure w_size_bck. - Detected by clang scan in line 386, column 28. + openssl: add OpenSSL 1.1.0 compatibility -- examples/x11.c: remove dead assigments of some return values - - Detected by clang scan in line 212, column 9. - Detected by clang scan in line 222, column 13. - Detected by clang scan in line 410, column 13. +Daniel Stenberg (4 Sep 2016) +- [Antenore Gatta brought this change] -- examples/x11.c: fix possible memory leak if read fails + tests: HAVE_NETINET_IN_H was not defined correctly (#127) - Detected by clang scan in line 224, column 21. + Fixes #125 -- examples/x11.c: fix invalid removal of first list element - - Fix use of memory after it was being freed. - Detected by clang scan in line 56, column 12. +- SECURITY: fix web site typo -- userauth.c: make sure that sp_len is positive and avoid overflows - - ... if the pointer subtraction of sp1 - pubkey - 1 resulted in a - negative or larger value than pubkey_len, memchr would fail. - - Reported by Coverity CID 89846. +- SECURITY: security process -- channel.c: remove logically dead code, host cannot be NULL here +GitHub (14 Aug 2016) +- [Alexander Lamaison brought this change] + + Basic dockerised test suite. - ... host cannot be NULL in line 525, because it is always - valid (e.g. at least set to "0.0.0.0") after lines 430 and 431. + This introduces a test suite for libssh2. It runs OpenSSH in a Docker + container because that works well on Windows (via docker-machine) as + well as Linux. Presumably it works on Mac too with docker-machine, but + I've not tested that. - Reported by Coverity CID 89807. + Because the test suite is docker-machine aware, you can also run it + against a cloud provider, for more realistic network testing, by setting + your cloud provider as your active docker machine. The Appveyor CI setup + in this commit does that because Appveyor doesn't support docker + locally. -- session.c: check return value of session_nonblock during startup - - Reported by Coverity CID 89803. +Kamil Dudka (3 Aug 2016) +- [Viktor Szakats brought this change] -- session.c: check return value of session_nonblock in debug mode + misc.c: Delete unused static variables - Reported by Coverity CID 89805. + Closes #114 -- pem.c: fix mixed line-endings introduced with 8670f5da24 +Daniel Stenberg (9 Apr 2016) +- [Will Cosgrove brought this change] -- pem.c: make sure there's a trailing zero and b64data is not NULL + Merge pull request #103 from willco007/patch-2 - ... if there is no base64 data between PEM header and footer. - Reported by Coverity CID 89823. + Fix for security issue CVE-2016-0787 -- kex.c: make sure mlist is not set to NULL - - ... if the currently unsupported LANG methods are called. - Reported by Coverity CID 89834. +Alexander Lamaison (2 Apr 2016) +- [Zenju brought this change] -- packet.c: i < 256 was always true and i would overflow to 0 + Fix MSVC 14 compilation errors - Visualize that the 0-termination is intentional, because the array - is later passed to strlen within _libssh2_packet_askv. + For _MSC_VER == 1900 these macros are not needed and create problems: + + + + 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1925): warning C4005: 'snprintf': macro redefinition (compiling source file libssh2-files\src\mac.c) + + 1> \win32\libssh2_config.h(27): note: see previous definition of 'snprintf' (compiling source file libssh2-files\src\mac.c) + + 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\stdio.h(1927): fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration (compiling source file libssh2-files\src\mac.c) -- silence multiple data conversion warnings +Daniel Stenberg (26 Mar 2016) +- [Brad Harder brought this change] -Daniel Stenberg (23 Dec 2014) -- agent_connect_unix: make sure there's a trailing zero - - ... if the path name was too long. Reported by Coverity CID 89801. + _libssh2_channel_open: speeling error fixed in channel error message -Marc Hoersken (22 Dec 2014) -- examples on Windows: use native SOCKET-type instead of int +Alexander Lamaison (15 Mar 2016) +- Link with crypt32.lib on Windows. - And check return values accordingly. + Makes linking with static OpenSSL work again. Although it's not + required for dynamic OpenSSL, it does no harm. + + Fixes #98. -- userauth.c: improve readability and clarity of for-loops +- [Craig A. Berry brought this change] -Daniel Stenberg (22 Dec 2014) -- calloc: introduce LIBSSH2_CALLOC() + Tweak VMS help file building. - A simple function using LIBSSH2_ALLOC + memset, since this pattern was - used in multiple places and this simplies code in general. + Primarily this is handling cases where top-level files moved into + the docs/ directory. I also corrected a typo and removed the + claim that libssh2 is public domain. -Marc Hoersken (15 Dec 2014) -- libssh2_priv.h: Ignore session, context and format parameters +- [Craig A. Berry brought this change] -- x11 example: check return value of socket function + Build with standard stat structure on VMS. + + This gets us large file support, is available on any VMS release + in the last decade and more, and gives stat other modern features + such as 64-bit ino_t. -- examples: fixed mixed line-endings introduced with aedfba25b8 +- [Craig A. Berry brought this change] -- wincng.c: explicitly ignore BCrypt*AlgorithmProvider return codes + Update vms/libssh2_config.h. - Fixes VS2012 code analysis warning C6031: - return value ignored: could return unexpected value + VMS does have stdlib.h, gettimeofday(), and OpenSSL. The latter + is appropriate to hard-wire in the configuration because it's + installed by default as part of the base operating system and + there is currently no libgcrypt port. -- wincng.c: fix possible invalid memory write access - - Fixes VS2012 code analysis warning C6386: - buffer overrun: accessing 'pbOutput', the writable size is - 'cbOutput' bytes, but '3' bytes may be written: libssh2 wincng.c 610 +- [Craig A. Berry brought this change] -- tests on Windows: check for WSAStartup return code + VMS can't use %zd for off_t format. - Fixes VS2012 code analysis warning C6031: - return value ignored: could return unexpected value + %z is a C99-ism that VMS doesn't currently have; even though the + compiler is C99-compliant, the library isn't quite. The off_t used + for the st_size element of the stat can be 32-bit or 64-bit, so + detect what we've got and pick a format accordingly. -- wincng.c: fix possible NULL pointer de-reference of bignum - - Fixes VS2012 code analysis warning C6011: - dereferencing NULL pointer 'bignum'. libssh2 wincng.c 1567 +- [Craig A. Berry brought this change] -- wincng.c: fix possible use of uninitialized memory + Normalize line endings in libssh2_sftp_get_channel.3. - Fixes VS2012 code analysis warning C6001: - using uninitialized memory 'cbDecoded'. libssh2 wincng.c 553 + Somehow it got Windows-style CRLF endings so convert to just LF, + for consistency as well as not to confuse tools that will regard + the \r as content (e.g. the OpenVMS help librarian). -- packet.c: fix possible NULL pointer de-reference within listen_state - - Fixes VS2012 code analysis warning C6011: - dereferencing NULL pointer 'listen_state->channel'. libssh2 packet.c 221 +Dan Fandrich (29 Feb 2016) +- libgcrypt: Fixed a NULL pointer dereference on OOM -- kex.c: fix possible NULL pointer de-reference with session->kex +Daniel Stenberg (24 Feb 2016) +- [Viktor Szakats brought this change] + + url updates, HTTP => HTTPS - Fixes VS2012 code analysis warning C6011: - dereferencing NULL pointer 'session->kex'. libssh2 kex.c 1761 + Closes #87 -- agent.c: check return code of MapViewOfFile +Dan Fandrich (23 Feb 2016) +- RELEASE-NOTES: removed some duplicated names + +Version 1.7.0 (23 Feb 2016) + +Daniel Stenberg (23 Feb 2016) +- web: the site is now HTTPS + +- RELEASE-NOTES: 1.7.0 release + +- diffie_hellman_sha256: convert bytes to bits - Fixes VS2012 code analysis warning C6387: 'p+4' may be '0': - this does not adhere to the specification for the function - 'memcpy': libssh2 agent.c 330 + As otherwise we get far too small numbers. - Fixes VS2012 code analysis warning C6387: 'p' may be '0': - this does not adhere to the specification for the function - 'UnmapViewOfFile': libssh2 agent.c 333 + Reported-by: Andreas Schneider + + CVE-2016-0787 -- examples on Windows: check for socket return code +Alexander Lamaison (18 Feb 2016) +- Allow CI failures with VS 2008 x64. - Fixes VS2012 code analysis warning C28193: - The variable holds a value that must be examined + Appveyor doesn't support this combination. -- examples on Windows: check for WSAStartup return code +Daniel Stenberg (16 Feb 2016) +- [Viktor Szakats brought this change] + + GNUmakefile: list system libs after user libs - Fixes VS2012 code analysis warning C6031: - return value ignored: could return unexpected value + Otherwise some referenced WinSock functions will fail to + resolve when linking against LibreSSL 2.3.x static libraries + with mingw. + + Closes #80 -Guenter Knauf (11 Dec 2014) -- wincng.c: silent some more gcc compiler warnings. +- [Viktor Szakats brought this change] -- wincng.c: silent gcc compiler warnings. + openssl: apply new HAVE_OPAQUE_STRUCTS macro + + Closes #81 -- Watcom build: added support for WinCNG build. +- [Viktor Szakats brought this change] -- build: updated dependencies in makefiles. + openssl: fix LibreSSL support after OpenSSL 1.1.0-pre1/2 support -Daniel Stenberg (4 Dec 2014) -- configure: change LIBS not LDFLAGS when checking for libs - - Closes #289 +Alexander Lamaison (14 Feb 2016) +- sftp.h: Fix non-C90 type. - Patch-by: maurerpe + uint64_t does not exist in C90. Use libssh2_uint64_t instead. -Guenter Knauf (3 Dec 2014) -- MinGW build: some more GNUMakefile tweaks. +- Exclude sshd tests from AppVeyor. - test/GNUmakefile: added architecture autodetection; added switches to - CFLAGS and RCFLAGS to make sure that the right architecture is used. - Added support to build with WinCNG. + They fail complaining that sshd wasn't invoked with an absolute path. -- sftpdir.c: added authentication method detection. - - Stuff copied over from ssh2.c to make testing a bit easier. +- Test on more versions of Visual Studio. -- NMake build: fixed LIBS settings. +- Fix Appveyor builds. -- NMake build: added support for WinCNG build. +Daniel Stenberg (14 Feb 2016) +- [Viktor Szakats brought this change] -- MinGW build: some GNUMakefile tweaks. + openssl: add OpenSSL 1.1.0-pre3-dev compatibility - Added architecture autodetection; added switches to CFLAGS and - RCFLAGS to make sure that the right architecture is used. - Added support to build with WinCNG. + by using API instead of accessing an internal structure. + + Closes #83 -- MinGW build: Fixed redefine warnings. +- RELEASE-NOTES: synced with 996b04ececdf -- Updated copyright year. +- include/libssh2.h: next version is 1.7.0 -Daniel Stenberg (31 Aug 2014) -- COPYING: bump the copyright year +- configure: build "silent" if possible -Dan Fandrich (28 Jul 2014) -- docs: fixed a bunch of typos +- sftp: re-indented some minor stuff -- docs: added missing libssh2_session_handshake.3 file +- [Jakob Egger brought this change] -Marc Hoersken (19 May 2014) -- wincng.c: specify the required libraries for dependencies using MSVC + sftp.c: ensure minimum read packet size - Initially reported by Bob Kast as "for MS VS builds, specify the - libraries that are required so they don't need to go into all - project files that may use this library". Thanks a lot. + For optimum performance we need to ensure we don't request tiny packets. -- [Bob Kast brought this change] +- [Jakob Egger brought this change] - windows build: do not export externals from static library + sftp.c: Explicit return values & sanity checks + +- [Jakob Egger brought this change] + + sftp.c: Check Read Packet File Offset - If you are building a DLL, then you need to explicitly export each - entry point. When building a static library, you should not. + This commit adds a simple check to see if the offset of the read + request matches the expected file offset. - libssh2 was exporting the entry points whether it was building a DLL or a - static library. To elaborate further, if libssh2 was used as a static - library, which was being linked into a DLL, the libssh2 API would be - exported from that separate DLL. + We could try to recover, from this condition at some point in the future. + Right now it is better to return an error instead of corrupted data. -Daniel Stenberg (19 May 2014) -- [Mikhail Gusarov brought this change] +- [Jakob Egger brought this change] - Fix typos in manpages + sftp.c: Don't return EAGAIN if data was written to buffer -Marc Hoersken (18 May 2014) -- wincng.c: Fixed memory leak in case of an error during ASN.1 decoding +- [Jakob Egger brought this change] -- configure: Display individual crypto backends on separate lines + sftp.c: Send at least one read request before reading - This avoids line-wrapping in between parameters and makes the - error message look like the following: + This commit ensures that we have sent at least one read request before + we try to read data in sftp_read(). - configure: error: No crypto library found! - Try --with-libssl-prefix=PATH - or --with-libgcrypt-prefix=PATH - or --with-wincng on Windows + Otherwise sftp_read() would return 0 bytes (indicating EOF) if the + socket is not ready for writing. -- [Bob Kast brought this change] +- [Jakob Egger brought this change] - libssh2_priv.h: a 1 bit bit-field should be unsigned + sftp.c: stop reading when buffer is full - some compilers may not like this + Since we can only store data from a single chunk in filep, + we have to stop receiving data as soon as the buffer is full. + + This adresses the following bug report: + https://github.com/libssh2/libssh2/issues/50 -- knownhost.c: Fixed warning that pointer targets differ in signedness +Salvador Fandiño (21 Jan 2016) +- agent_disconnect_unix: unset the agent fd after closing it + + "agent_disconnect_unix", called by "libssh2_agent_disconnect", was + leaving the file descriptor in the agent structure unchanged. Later, + "libssh2_agent_free" would call again "libssh2_agent_disconnect" under + the hood and it would try to close again the same file descriptor. In + most cases that resulted in just a harmless error, but it is also + possible that the file descriptor had been reused between the two + calls resulting in the closing of an unrelated file descriptor. + + This patch sets agent->fd to LIBSSH2_INVALID_SOCKET avoiding that + issue. + + Signed-off-by: Salvador Fandiño -- wincng.c: Fixed warning about pointer targets differing in signedness +Daniel Stenberg (18 Jan 2016) +- [Patrick Monnerat brought this change] -- tcpip-forward.c: Fixed warning that pointer targets differ in signedness + os400qc3: support encrypted private keys - libssh2_channel_forward_listen_ex uses ints instead of unsigned ints. + PKCS#8 EncryptedPrivateKeyinfo structures are recognized and decoded to get + values accepted by the Qc3 crypto library. -- misc.c: Fixed warning about mixed declarations and code +- [Patrick Monnerat brought this change] -- libgcrypt.h: Fixed warning about pointer targets differing in signedness + os400qc3: New PKCS#5 decoder + + The Qc3 library is not able to handle PKCS#8 EncryptedPrivateKeyInfo structures + by itself. It is only capable of decrypting the (encrypted) PrivateKeyInfo + part, providing a key encryption key and an encryption algorithm are given. + Since the encryption key and algorithm description part in a PKCS#8 + EncryptedPrivateKeyInfo is a PKCS#5 structure, such a decoder is needed to + get the derived key method and hash, as well as encryption algorith and + initialisation vector. -- wincng.h: Fixed warning about pointer targets differing in signedness +- [Patrick Monnerat brought this change] -- misc.c: Fixed warning about unused parameter abstract + os400qc3: force continuous update on non-final hash/hmac computation -- tcpip-forward.c: Removed unused variables shost, sport and sockopt +- [Patrick Monnerat brought this change] -- wincng.h: Added forward declarations for all WinCNG functions + os400qc3: Be sure hmac keys have a minimum length - Initially reported by Bob Kast as "Wincng - define function - prototypes for wincng routines". Thanks a lot. + The Qc3 library requires a minimum key length depending on the target + hash algorithm. Append binary zeroes to the given key if not long enough. + This matches RFC 2104 specifications. + +- [Patrick Monnerat brought this change] + + os400qc3: Slave descriptor for key encryption key - Also replaced structure definitions with type definitions. + The Qc3 library requires the key encryption key to exist as long as + the encrypted key is used. Its descriptor token is then kept as an + "encrypted key slave" for recursive release. -- [Bob Kast brought this change] +- [Patrick Monnerat brought this change] - libssh2.h: on Windows, a socket is of type SOCKET, not int + os400qc3.c: comment PEM/DER decoding -- win32: Added WinCNG targets to generated Visual Studio project - - Inspired by Bob Kast's reports, this commit enables the compilation - of libssh2 with WinCNG using the generated Visual Studio project files. - This commit adds WinCNG support to parts of the existing Win32 build - infrastructure, until new build systems, like pre-defined VS project - files or CMake files may be added. - - This commit and b20bfeb3e519119a48509a1099c06d65aa7da1d7 raise one - question: How to handle build systems, like VS project files, that - need to include all source files regardless of the desired target, - including all supported crypto backends? For now the mentioned commit - added a check for LIBSSH2_OPENSSL to openssl.c and with this commit - the supported crypto backends are hardcoded within Makefile.am. +- [Patrick Monnerat brought this change] -- libssh2_priv msvc: Removed redundant definition of inline keyword - - Initially reported by Bob Kast as "Remove redundant 'inline' define". - Thanks a lot. + os400qc3.c: improve ASN.1 header byte checks -- wincng: Made data parameter to hash update function constant - - Initially reported by Bob Kast as "formal parameter must be const - since it is used in contexts where the actual parameter may be const". - Thanks a lot. +- [Patrick Monnerat brought this change] -- wincng: fix cross-compilation against the w64 mingw-runtime package + os400qc3.c: improve OID matching -- openssl: Check for LIBSSH2_OPENSSL in order to compile with openssl +- [Patrick Monnerat brought this change] -- wincng: Fixed use of possible uninitialized variable pPaddingInfo - - Reported by Bob Kast, thanks a lot. + os400: os400qc3.c: replace malloc by LIBSSH2_ALLOC or alloca where possible -- wincng: Added cast for double to unsigned long conversion +- [Patrick Monnerat brought this change] -- wincng: Cleaned up includes and check NTSTATUS using macro - - Removed header file combination that is not supported on a real - Windows platform and can only be compiled using MinGW. Replaced - custom NTSTATUS return code checks with BCRYPT_SUCCESS macro. + os400: asn1_new_from_bytes(): use data from a single element only -Daniel Stenberg (16 Mar 2014) -- userauth_hostbased_fromfile: zero assign to avoid uninitialized use - - Detected by clang-analyze +- [Patrick Monnerat brought this change] -- channel_receive_window_adjust: store windows size always - - Avoid it sometimes returning without storing it, leaving calling - functions with unknown content! - - Detected by clang-analyzer + os400: fix an ILE/RPG prototype -- publickey_packet_receive: avoid junk in returned pointers +- [Patrick Monnerat brought this change] + + os400: implement character encoding conversion support + +- [Patrick Monnerat brought this change] + + os400: do not miss some external prototypes - clang-analyzer found this risk it would return a non-initialized pointer - in a success case + Build procedure extproto() did not strip braces from header files, thus + possibly prepended them to true prototypes. This prevented the prototype to + be recognized as such. + The solution implemented here is to map braces to semicolons, effectively + considering them as potential prototype delimiters. -Peter Stuge (16 Mar 2014) -- [Marc Hoersken brought this change] +- [Patrick Monnerat brought this change] - Added Windows Cryptography API: Next Generation based backend + os400: Really add specific README -- [Marc Hoersken brought this change] +- [Patrick Monnerat brought this change] - knownhost.c: fixed that 'key_type_len' may be used uninitialized - - ../src/knownhost.c: In function 'libssh2_knownhost_readline': - ../src/knownhost.c:651:16: warning: 'key_type_len' may be used - uninitialized in this function [-Wmaybe-uninitialized] - rc = knownhost_add(hosts, hostbuf, NULL, - ^ - ../src/knownhost.c:745:12: note: 'key_type_len' was declared here - size_t key_type_len; - ^ + os400: Add specific README and include new files in dist tarball -- [Marc Hoersken brought this change] +- [Patrick Monnerat brought this change] - pem.c: always compile pem.c independently of crypto backend + os400: add compilation scripts -- Fix non-autotools builds: Always define the LIBSSH2_OPENSSL CPP macro - - Commit d512b25f69a1b6778881f6b4b5ff9cfc6023be42 introduced a crypto - library abstraction in the autotools build system, to allow us to more - easily support new crypto libraries. In that process it was found that - all other build system which we support are hard-coded to build with - OpenSSL. Commit f5c1a0d98bd51aeb24aca3d49c7c81dcf8bd858d fixes automake - introduced into non-autotools build systems but still overlooked the - CPP macro saying that we are using OpenSSL. +- [Patrick Monnerat brought this change] + + os400: include files for ILE/RPG - Thanks to Marc Hörsken for identifying this issue and proposing a fix - for win32/{GNUmakefile,config.mk}. This commit uses a slightly different - approach but the end result is the same. + In addition, file os400/macros.h declares all procedures originally + defined as macros. It must not be used for real inclusion and is only + intended to be used as a `database' for macro wrapping procedures generation. -Dan Fandrich (15 Mar 2014) -- channel_close: Close the channel even in the case of errors +- [Patrick Monnerat brought this change] -- sftp_close_handle: ensure the handle is always closed - - Errors are reported on return, but otherwise the close path is - completed as much as possible and the handle is freed on exit. + os400: add supplementary header files/wrappers. Define configuration. -Alexander Lamaison (6 Mar 2014) -- knownhost: Restore behaviour of `libssh2_knownhost_writeline` with short buffer. - - Commit 85c6627c changed the behaviour of `libssh2_knownhost_writeline` so that it stopped returning the number of bytes needed when the given buffer was too small. Also, the function changed such that is might write to part of the buffer before realising it is too small. +- [Patrick Monnerat brought this change] + + Protect callback function calls from macro substitution - This commit restores the original behaviour, whilst keeping the unknown-key-type functionality that 85c6627c. Instead of writing to the buffer piecemeal, the length of the various parts is calculated up front and the buffer written only if there is enough space. The calculated necessary size is output in `outlen` regardless of whether the buffer was written to. + Some structure fields holding callback addresses have the same name as the + underlying system function (connect, send, recv). Set parentheses around + their reference to suppress a possible macro substitution. - The main use-case for the original behaviour that this commit restores is to allow passing in a NULL buffer to get the actual buffer size needed, before calling the function again with the buffer allocated to the exact size required. + Use a macro for connect() on OS/400 to resolve a const/nonconst parameter + problem. -- knownhost: Fix DSS keys being detected as unknown. - - I missing `else` meant ssh-dss format keys were being re-detected as unknown format. +- [Patrick Monnerat brought this change] -Dan Fandrich (6 Mar 2014) -- knownhosts: Abort if the hosts buffer is too small - - This could otherwise cause a match on the wrong host + Add interface for OS/400 crypto library QC3 -- agent_list_identities: Fixed memory leak on OOM +- [Patrick Monnerat brought this change] -- Fixed a few typos + misc: include stdarg.h for debug code -- userauth: Fixed an attempt to free from stack on error +- [Patrick Monnerat brought this change] -- Fixed a few memory leaks in error paths + Document crypto library interface -- Fixed two potential use-after-frees of the payload buffer +- [Patrick Monnerat brought this change] + + Feature an optional crypto-specific macro to rsa sign a data fragment vector - The first might occur if _libssh2_packet_add returns an error, as - fullpacket_state wasn't reset to idle so if it were possible for - fullpacket to be called again, it would return to the same state - handler and re-use the freed p->packet buffer. + OS/400 crypto library is unable to sign a precomputed SHA1 hash: however + it does support a procedure that hashes data fragments and rsa signs. + If defined, the new macro _libssh2_rsa_sha1_signv() implements this function + and disables use of _libssh2_rsa_sha1_sign(). - The second could occur if decrypt returned an error, as it freed the - packet buffer but did not clear total_num, meaning that freed buffer - could be written into again later. + The function described above requires that the struct iovec unused slacks are + cleared: for this reason, macro libssh2_prepare_iovec() has been introduced. + It should be defined as empty for crypto backends that are not sensitive + to struct iovec unused slack values. -Alexander Lamaison (28 Nov 2013) -- Fix missing `_libssh2_error` in `_libssh2_channel_write`. - - In one case, the error code from `_libssh2_transport_read` was being returned from `_libssh2_channel_write` without setting it as the last error by calling `_libssh2_error`. This commit fixes that. - - Found when using a session whose socket had been inadvertently destroyed. The calling code got confused because via `libssh2_session_last_error` it appeared no error had occurred, despite one being returned from the previous function. +- [Patrick Monnerat brought this change] -Kamil Dudka (21 Nov 2013) -- [Mark McPherson brought this change] + Fold long lines in include files - openssl: initialise the digest context before calling EVP_DigestInit() - - When using the OpenSSL libraries in FIPS mode, the function call - EVP_DigestInit() is actually #defined to FIPS_digestinit(). - Unfortunately wheres EVP_DigestInit() initialises the context and then - calls EVP_DigestInit_ex(), this function assumes that the context has - been pre-initialised and crashes when it isn't. - - Bug: https://trac.libssh2.org/ticket/279 - - Fixes #279 +- [Viktor Szakats brought this change] -- [Marc Hörsken brought this change] + kex.c: fix indentation + + Closes #71 - .gitignore: Ignore files like src/libssh2_config.h.in~ +- [Viktor Szakats brought this change] -Peter Stuge (13 Nov 2013) -- Move automake conditionals added by commit d512b25f out of Makefile.inc - - Commit d512b25f69a1b6778881f6b4b5ff9cfc6023be42 added automake - conditionals to Makefile.inc but since Makefile.inc is included - from Makefile for all other build systems that does not work. - - This commit instead adds Makefile.OpenSSL.inc and Makefile.libgcrypt.inc - and moves the automake conditional to its proper place, src/Makefile.am. - - The automake conditional includes the correct Makefile.$name.inc per - the crypto library selection/detection done by configure. + add OpenSSL-1.1.0-pre2 compatibility - All non-autotools build system files in libssh2 are hardcoded to use - OpenSSL and do not get a conditional but at least there is some reuse - because they can all include the new Makefile.OpenSSL.inc. + Closes #70 -Daniel Stenberg (27 Oct 2013) -- [Salvador Fandino brought this change] +- [Viktor Szakats brought this change] - Set default window size to 2MB - - The default channel window size used until now was 256KB. This value is - too small and results on a bottleneck on real-life networks where - round-trip delays can easily reach 300ms. - - The issue was not visible because the configured channel window size - was being ignored and a hard-coded value of ~22MB being used instead, - but that was fixed on a previous commit. - - This patch just changes the default window size - (LIBSSH2_CHANNEL_WINDOW_DEFAULT) to 2MB. It is the same value used by - OpenSSH and in our opinion represents a good compromise between memory - used and transfer speed. - - Performance tests were run to determine the optimum value. The details - and related discussion are available from the following thread on the - libssh2 mailing-list: - - http://www.libssh2.org/mail/libssh2-devel-archive-2013-10/0018.shtml - http://article.gmane.org/gmane.network.ssh.libssh2.devel/6543 - - An excerpt follows: - - "I have been running some transfer test and measuring their speed. + add OpenSSL 1.1.0-pre1 compatibility - My setup was composed of a quad-core Linux machine running Ubuntu 13.10 - x86_64 with a LXC container inside. The data transfers were performed - from the container to the host (never crossing through a physical - network device). + * close https://github.com/libssh2/libssh2/issues/69 + * sync a declaration with the rest of similar ones + * handle EVP_MD_CTX_new() returning NULL with OpenSSL 1.1.0 + * fix potential memory leak with OpenSSL 1.1.0 in + _libssh2_*_init() functions, when EVP_MD_CTX_new() succeeds, + but EVP_DigestInit() fails. + +Marc Hoersken (22 Dec 2015) +- wincng.c: fixed _libssh2_wincng_hash_final return value - Network delays were simulated using the tc tool. And ping was used to - verify that they worked as intended during the tests. + _libssh2_wincng_hash_final was returning the internal BCRYPT + status code instead of a valid libssh2 return value (0 or -1). - The operation performed was the equivalent to the following ssh command: + This also means that _libssh2_wincng_hash never returned 0. + +- wincng.c: fixed possible memory leak in _libssh2_wincng_hash - $ ssh container "dd bs=16K count=8K if=/dev/zero" >/dev/null + If _libssh2_wincng_hash_update failed _libssh2_wincng_hash_final + would never have been called before. - Though, establishment and closing of the SSH connection was excluded - from the timings. + Reported by Zenju. + +Kamil Dudka (15 Dec 2015) +- [Paul Howarth brought this change] + + libssh2.pc.in: fix the output of pkg-config --libs - I run the tests several times transferring files of sizes up to 128MB - and the results were consistent between runs. + ... such that it does not include LDFLAGS used to build libssh2 itself. + There was a similar fix in the curl project long time ago: - The results corresponding to the 128MB transfer are available here: + https://github.com/bagder/curl/commit/curl-7_19_7-56-g4c8adc8 - https://docs.google.com/spreadsheet/ccc?key=0Ao1yRmX6PQQzdG5wSFlrZl9HRWNET3ZyN0hnaGo5ZFE&usp=sharing + Bug: https://bugzilla.redhat.com/1279966 + Signed-off-by: Kamil Dudka + +Marc Hoersken (6 Dec 2015) +- hostkey.c: align code path of ssh_rsa_init to ssh_dss_init + +- hostkey.c: fix invalid memory access if libssh2_dsa_new fails - It clearly shows that 256KB is too small as the default window size. - Moving to a 512MB generates a great improvement and after the 1MB mark - the returns rapidly diminish. Other factors (TCP window size, probably) - become more limiting than the channel window size + Reported by dimmaq, fixes #66 + +Daniel Stenberg (3 Nov 2015) +- [Will Cosgrove brought this change] + + gcrypt: define libssh2_sha256_ctx - For comparison I also performed the same transfers using OpenSSH. Its - speed is usually on par with that of libssh2 using a window size of 1MB - (even if it uses a 2MB window, maybe it is less aggressive sending the - window adjust msgs)." + Looks like it didn't make it into the latest commit for whatever reason. - Signed-off-by: Salvador Fandino + Closes #58 -- [Salvador brought this change] +- [Salvador Fandino brought this change] - _libssh2_channel_read: Honour window_size_initial + libssh2_session_set_last_error: Add function - _libssh2_channel_read was using an arbitrary hard-coded limit to trigger - the window adjusting code. The adjustment used was also hard-coded and - arbitrary, 15MB actually, which would limit the usability of libssh2 on - systems with little RAM. + Net::SSH2, the Perl wrapping module for libssh2 implements several features* + on top of libssh2 that can fail and so need some mechanism to report the error + condition to the user. - This patch, uses the window_size parameter passed to - libssh2_channel_open_ex (stored as remote.window_size_initial) plus the - buflen as the base for the trigger and the adjustment calculation. + Until now, besides the error state maintained internally by libssh2, another + error state was maintained at the Perl level for every session object and then + additional logic was used to merge both error states. That is a maintenance + nighmare, and actually there is no way to do it correctly and consistently. - The memory usage when using the default window size is reduced from 22MB - to 256KB per channel (actually, if compression is used, these numbers - should be incremented by ~50% to account for the errors between the - decompressed packet sizes and the predicted sizes). + In order to allow the high level language to add new features to the library + but still rely in its error reporting features the new function + libssh2_session_set_last_error (that just exposses _libssh2_error_flags) is + introduced. - My tests indicate that this change does not impact the performance of - transfers across localhost or a LAN, being it on par with that of - OpenSSH. On the other hand, it will probably slow down transfers on - networks with high bandwidth*delay when the default window size - (LIBSSH2_CHANNEL_WINDOW_DEFAULT=256KB) is used. + *) For instance, connecting to a remote SSH service giving the hostname and + port. Signed-off-by: Salvador Fandino + Signed-off-by: Salvador Fandiño - [Salvador Fandino brought this change] - knownhosts: handle unknown key types + _libssh2_error: Support allocating the error message - Store but don't use keys of unsupported types on the known_hosts file. + Before this patch "_libssh2_error" required the error message to be a + static string. - Currently, when libssh2 parses a known_host file containing keys of some - type it doesn't natively support, it stops reading the file and returns - an error. + This patch adds a new function "_libssh2_error_flags" accepting an + additional "flags" argument and specifically the flag + "LIBSSH2_ERR_FLAG_DUP" indicating that the passed string must be + duplicated into the heap. - That means, that the known_host file can not be safely shared with other - software supporting other key types (i.e. OpenSSH). + Then, the method "_libssh2_error" has been rewritten to use that new + function under the hood. - This patch adds support for handling keys of unknown type. It can read - and write them, even if they are never going to be matched. + Signed-off-by: Salvador Fandino + Signed-off-by: Salvador Fandiño + +- [Will Cosgrove brought this change] + + added engine.h include to fix warning + +- [sune brought this change] + + kex.c: removed dupe entry from libssh2_kex_methods[] - At the source level the patch does the following things: + Closes #51 + +- [Salvador Fandiño brought this change] + + userauth: Fix off by one error when reading public key file - - add a new unknown key type LIBSSH2_KNOWNHOST_KEY_UNKNOWN + After reading the public key from file the size was incorrectly + decremented by one. - - add a new slot (key_type_name) on the known_host struct that is - used to store the key type in ascii form when it is not supported + This was usually a harmless error as the last character on the public + key file is an unimportant EOL. But if due to some error the public key + file is empty, the public key size becomes (uint)(0 - 1), resulting in + an unrecoverable out of memory error later. - - parse correctly known_hosts entries with unknown key types and - populate the key_type_name slot + Signed-off-by: Salvador Fandi??o + +- [Salvador Fandino brought this change] + + channel: Detect bad usage of libssh2_channel_process_startup - - print correctly known_hosts entries of unknown type + A common novice programmer error (at least among those using the + wrapping Perl module Net::SSH2), is to try to reuse channels. - - when checking a host key ignore keys that do not match the key + This patchs detects that incorrect usage and fails with a + LIBSSH2_ERROR_BAD_USE error instead of hanging. - Fixes #276 + Signed-off-by: Salvador Fandino -- windows build: fix build errors - - Fixes various link errors with VS2010 - - Reported-by: "kdekker" - Fixes #272 +- [Will Cosgrove brought this change] -- man page: add missing function argument + kex: Added diffie-hellman-group-exchange-sha256 support - for libssh2_userauth_publickey_fromfile_ex() + ... and fixed HMAC_Init depricated usage - Reported-by: "pastey" + Closes #48 + +Alexander Lamaison (21 Sep 2015) +- Prefixed new #defines to prevent collisions. - Fixes #262 + Other libraries might have their own USE_WIN32_*FILES. -- [Salvador brought this change] +- [keith-daigle brought this change] - Fix zlib deflate usage - - Deflate may return Z_OK even when not all data has been compressed - if the output buffer becomes full. - - In practice this is very unlikely to happen because the output buffer - size is always some KBs larger than the size of the data passed for - compression from the upper layers and I think that zlib never expands - the data so much, even on the worst cases. - - Anyway, this patch plays on the safe side checking that the output - buffer is not exhausted. - - Signed-off-by: Salvador + Update examples/scp.c to fix bug where large files on win32 would cause got to wrap and go negative -- [Salvador brought this change] +- [David Byron brought this change] - comp_method_zlib_decomp: Improve buffer growing algorithm - - The old algorithm was O(N^2), causing lots and lots of reallocations - when highly compressed data was transferred. - - This patch implements a simpler one that just doubles the buffer size - everytime it is exhausted. It results in O(N) complexity. - - Also a smaller inflate ratio is used to calculate the initial size (x4). - - Signed-off-by: Salvador + add libssh2_scp_recv2 to support large (> 2GB) files on windows -- [Salvador brought this change] +Daniel Stenberg (17 Sep 2015) +- [sune brought this change] - Fix zlib usage + WinCNG: support for SHA256/512 HMAC - Data may remain in zlib internal buffers when inflate() returns Z_OK - and avail_out == 0. In that case, inflate has to be called again. + Closes #47 + +- [brian m. carlson brought this change] + + Add support for HMAC-SHA-256 and HMAC-SHA-512. - Also, once all the data has been inflated, it returns Z_BUF_ERROR to - signal that the input buffer has been exhausted. + Implement support for these algorithms and wire them up to the libgcrypt + and OpenSSL backends. Increase the maximum MAC buffer size to 64 bytes + to prevent buffer overflows. Prefer HMAC-SHA-256 over HMAC-SHA-512, and + that over HMAC-SHA-1, as OpenSSH does. - Until now, the way to detect that a packet payload had been completely - decompressed was to check that no data remained on the input buffer - but that didn't account for the case where data remained on the internal - zlib buffers. + Closes #40 + +- [Zenju brought this change] + + kex: free server host key before allocating it (again) - That resulted in packets not being completely decompressed and the - missing data reappearing on the next packet, though the bug was masked - by the buffer allocation algorithm most of the time and only manifested - when transferring highly compressible data. + Fixes a memory leak when Synology server requests key exchange - This patch fixes the zlib usage. + Closes #43 + +- [Viktor Szakats brought this change] + + GNUmakefile: up OpenSSL version - Signed-off-by: Salvador + closes #23 -- [Salvador brought this change] +- [Viktor Szakats brought this change] - _libssh2_channel_read: fix data drop when out of window + GNUmakefile: add -m64 CFLAGS when targeting mingw64, add -m32/-m64 to LDFLAGS - After filling the read buffer with data from the read queue, when the - window size was too small, "libssh2_channel_receive_window_adjust" was - called to increase it. In non-blocking mode that function could return - EAGAIN and, in that case, the EAGAIN was propagated upwards and the data - already read on the buffer lost. + libssh2 equivalent of curl patch https://github.com/bagder/curl/commit/d21b66835f2af781a3c2a685abc92ef9f0cd86be - The function was also moving between the two read states - "libssh2_NB_state_idle" and "libssh2_NB_state_created" both of which - behave in the same way (excepting a debug statment). + This allows to build for the non-default target when using a multi-target mingw distro. + Also bump default OpenSSL dependency path to 1.0.2c. + +- [Viktor Szakats brought this change] + + GNUmakefile: add support for LIBSSH2_LDFLAG_EXTRAS - This commit modifies "_libssh2_channel_read" so that the - "libssh2_channel_receive_window_adjust" call is performed first (when - required) and if everything goes well, then it reads the data from the - queued packets into the read buffer. + It is similar to existing LIBSSH2_CFLAG_EXTRAS, but for + extra linker options. - It also removes the useless "libssh2_NB_state_created" read state. + Also delete some line/file ending whitespace. - Some rotted comments have also been updated. + closes #27 + +- [nasacj brought this change] + + hostkey.c: Fix compiling error when OPENSSL_NO_MD5 is defined - Signed-off-by: Salvador + Closes #32 -- [Salvador Fandino brought this change] +- [Mizunashi Mana brought this change] - window_size: redid window handling for flow control reasons + openssl.h: adjust the rsa/dsa includes - Until now, the window size (channel->remote.window_size) was being - updated just after receiving the packet from the transport layer. + ... to work when built without DSA support. - That behaviour is wrong because the channel queue may grow uncontrolled - when data arrives from the network faster that the upper layer consumes - it. + Closes #36 + +Alexander Lamaison (26 Jul 2015) +- Let CMake build work as a subproject. - This patch adds a new counter, read_avail, which keeps a count of the - bytes available from the packet queue for reading. Also, now the window - size is adjusted when the data is actually read by an upper layer. + Patch contributed by JasonHaslam. + +- Fix builds with Visual Studio 2015. - That way, if the upper layer stops reading data, the window will - eventually fill and the remote host will stop sending data. When the - upper layers reads enough data, a window adjust packet is delivered and - the transfer resumes. + VS2015 moved stdio functions to the header files as inline function. That means check_function_exists can't detect them because it doesn't use header files - just does a link check. Instead we need to use check_symbol_exists with the correct headers. + +Kamil Dudka (2 Jul 2015) +- cmake: include CMake files in the release tarballs - The read_avail counter is used to detect the situation when the remote - server tries to send data surpassing the window size. In that case, the - extra data is discarded. + Despite we announced the CMake support in libssh2-1.6.0 release notes, + the files required by the CMake build system were not included in the + release tarballs. Hence, the only way to use CMake for build was the + upstream git repository. - Signed-off-by: Salvador + This commit makes CMake actually supported in the release tarballs. -Peter Stuge (15 Sep 2013) -- configure.ac: Call zlib zlib and not libz in text but keep option names +- tests/mansyntax.sh: fix 'make distcheck' with recent autotools + + Do not create symbolic links off the build directory. Recent autotools + verify that out-of-source build works even if the source directory tree + is not writable. -- configure.ac: Reorder --with-* options in --help output +- openssl: fix memleak in _libssh2_dsa_sha1_verify() -- configure.ac: Rework crypto library detection +Daniel Stenberg (12 Jun 2015) +- openssl: make libssh2_sha1 return error code - This further simplifies adding new crypto libraries. - -- Clean up crypto library abstraction in build system and source code + - use the internal prefix _libssh2_ for non-exported functions - libssh2 used to explicitly check for libgcrypt and default to OpenSSL. + - removed libssh2_md5() since it wasn't used - Now all possible crypto libraries are checked for explicitly, making - the addition of further crypto libraries both simpler and cleaner. + Reported-by: Kamil Dudka -- configure.ac: Add zlib to Requires.private in libssh2.pc if using zlib +- [LarsNordin-LNdata brought this change] -- Revert "Added Windows Cryptography API: Next Generation based backend" + SFTP: Increase speed and datasize in SFTP read - This reverts commit d385230e15715e67796f16f3e65fd899f21a638b. + The function sftp_read never return more then 2000 bytes (as it should + when I asked Daniel). I increased the MAX_SFTP_READ_SIZE to 30000 but + didn't get the same speed as a sftp read in SecureSSH. I analyzed the + code and found that a return always was dona when a chunk has been read. + I changed it to a sliding buffer and worked on all available chunks. I + got an increase in speed and non of the test I have done has failed + (both local net and over Internet). Please review and test. I think + 30000 is still not the optimal MAX_SFTP_READ_SIZE, my next goal is to + make an API to enable changing this value (The SecureSSH sftp_read has + more complete filled packages when comparing the network traffic) -Daniel Stenberg (7 Sep 2013) -- [Leif Salomonsson brought this change] +- bump: start working on 1.6.1 - sftp_statvfs: fix for servers not supporting statfvs extension - - Fixes issue arising when server does not support statfvs and or fstatvfs - extensions. sftp_statvfs() and sftp_fstatvfs() after this patch will - handle the case when SSH_FXP_STATUS is returned from server. +Version 1.6.0 (5 Jun 2015) -- [Marc Hoersken brought this change] +Daniel Stenberg (5 Jun 2015) +- RELEASE-NOTES: synced with 858930cae5c6a - Added Windows Cryptography API: Next Generation based backend +Marc Hoersken (19 May 2015) +- wincng.c: fixed indentation -- [Kamil Dudka brought this change] +- [sbredahl brought this change] - partially revert "window_size: explicit adjustments only" - - This partially reverts commit 03ca9020756a4e16f0294e5b35e9826ee6af2364 - in order to fix extreme slowdown when uploading to localhost via SFTP. - - I was able to repeat the issue on RHEL-7 on localhost only. It did not - occur when uploading via network and it did not occur on a RHEL-6 box - with the same version of libssh2. - - The problem was that sftp_read() used a read-ahead logic to figure out - the window_size, but sftp_packet_read() called indirectly from - sftp_write() did not use any read-ahead logic. + wincng.c: fixed memleak in (block) cipher destructor -- _libssh2_channel_write: client spins on write when window full - - When there's no window to "write to", there's no point in waiting for - the socket to become writable since it most likely just will continue to - be. - - Patch-by: ncm - Fixes #258 +Alexander Lamaison (6 May 2015) +- [Jakob Egger brought this change] -- _libssh2_channel_forward_cancel: avoid memory leaks on error + libssh2_channel_open: more detailed error message - Fixes #257 + The error message returned by libssh2_channel_open in case of a server side channel open failure is now more detailed and includes the four standard error conditions in RFC 4254. -- _libssh2_packet_add: avoid using uninitialized memory - - In _libssh2_packet_add, called by _libssh2_packet_read, a call to - _libssh2_packet_send that is supposed to send a one-byte message - SSH_MSG_REQUEST_FAILURE would send an uninitialized byte upon re-entry - if its call to _send returns _EAGAIN. +- [Hannes Domani brought this change] + + kex: fix libgcrypt memory leaks of bignum - Fixes #259 + Fixes #168. -- _libssh2_channel_forward_cancel: accessed struct after free +Marc Hoersken (3 Apr 2015) +- configure.ac: check for SecureZeroMemory for clear memory feature + +- Revert "wincng.c: fix clear memory feature compilation with mingw" - ... and the assignment was pointless anyway since the struct was about - to be freed. Bug introduced in dde2b094. + This reverts commit 2d2744efdd0497b72b3e1ff6e732aa4c0037fc43. - Fixes #268 - -Peter Stuge (2 Jun 2013) -- [Marc Hoersken brought this change] + Autobuilds show that this did not solve the issue. + And it seems like RtlFillMemory is defined to memset, + which would be optimized out by some compilers. - Fixed compilation using mingw-w64 +- wincng.c: fix clear memory feature compilation with mingw -- [Marc Hoersken brought this change] +Alexander Lamaison (1 Apr 2015) +- [LarsNordin-LNdata brought this change] - knownhost.c: use LIBSSH2_FREE macro instead of free + Enable use of OpenSSL that doesn't have DSA. - Use LIBSSH2_FREE instead of free since - _libssh2_base64_encode uses LIBSSH2_ALLOC + Added #if LIBSSH2_DSA for all DSA functions. -Daniel Stenberg (18 May 2013) -- [Matthias Kerestesch brought this change] +- [LarsNordin-LNdata brought this change] - libssh2_agent_init: init ->fd to LIBSSH2_INVALID_SOCKET - - ... previously it was left at 0 which is a valid file descriptor! - - Bug: https://trac.libssh2.org/ticket/265 + Use correct no-blowfish #define with OpenSSL. - Fixes #265 + The OpenSSL define is OPENSSL_NO_BF, not OPENSSL_NO_BLOWFISH. -- userauth_password: pass on the underlying error code - - _libssh2_packet_requirev() may return different errors and we pass that - to the parent instead of rewriting it. +Marc Hoersken (25 Mar 2015) +- configure: error if explicitly enabled clear-memory is not supported - Bug: http://libssh2.org/mail/libssh2-devel-archive-2013-04/0029.shtml - Reported by: Cosmin + This takes 22bd8d81d8fab956085e2079bf8c29872455ce59 and + b8289b625e291bbb785ed4add31f4759241067f3 into account, + but still makes it enabled by default if it is supported + and error out in case it is unsupported and was requested. -Peter Stuge (9 May 2013) -- [Marc Hoersken brought this change] +Daniel Stenberg (25 Mar 2015) +- configure: make clear-memory default but only WARN if backend unsupported + + ... instead of previous ERROR. - libcrypt.c: Fix typo in _libssh2_rsa_sha1_sign() parameter type +Marc Hoersken (24 Mar 2015) +- wincng.h: fix warning about computed return value not being used -Kamil Dudka (4 May 2013) -- configure.ac: replace AM_CONFIG_HEADER with AC_CONFIG_HEADERS - - Reported by: Quintus - Bug: https://trac.libssh2.org/ticket/261 +- nonblocking examples: fix warning about unused tvdiff on Mac OS X -Guenter Knauf (12 Apr 2013) -- Fixed copyright string for NetWare build. +Daniel Stenberg (24 Mar 2015) +- openssl: fix compiler warnings -Daniel Stenberg (9 Apr 2013) -- [Richard W.M. Jones brought this change] +- cofigure: fix --disable-clear-memory check - sftp: Add support for fsync (OpenSSH extension). - - The new libssh2_sftp_fsync API causes data and metadata in the - currently open file to be committed to disk at the server. - - This is an OpenSSH extension to the SFTP protocol. See: +Marc Hoersken (23 Mar 2015) +- scp.c: improved command length calculation - https://bugzilla.mindrot.org/show_bug.cgi?id=1798 + Reduced number of calls to strlen, because shell_quotearg already + returns the length of the resulting string (e.q. quoted path) + which we can add to the existing and known cmd_len. + Removed obsolete call to memset again, because we can put a final + NULL-byte at the end of the string using the calculated length. -- [Richard W.M. Jones brought this change] +- scp.c: improved and streamlined formatting - sftp: statvfs: Along error path, reset the correct 'state' variable. +- scp.c: fix that scp_recv may transmit not initialised memory -- [Richard W.M. Jones brought this change] +- scp.c: fix that scp_send may transmit not initialised memory + + Fixes ticket 244. Thanks Torsten. - sftp: seek: Don't flush buffers on same offset +- kex: do not ignore failure of libssh2_sha1_init() - Signed-off-by: Richard W.M. Jones + Based upon 43b730ce56f010e9d33573fcb020df49798c1ed8. + Fixes ticket 290. Thanks for the suggestion, mstrsn. -Guenter Knauf (9 Feb 2013) -- Updated dependency libs. +- wincng.h: fix return code of libssh2_md5_init() -- Fixed tool macro names. +- openssl.c: fix possible segfault in case EVP_DigestInit fails -Daniel Stenberg (29 Nov 2012) -- [Seth Willits brought this change] +- wincng.c: fix possible use of uninitialized variables - compiler warnings: typecast strlen in macros +- wincng.c: fix unused argument warning if clear memory is not enabled + +- wincng: Added explicit clear memory feature to WinCNG backend - ... in macro parameters to avoid compiler warnings about lost precision. + This re-introduces the original feature proposed during + the development of the WinCNG crypto backend. It still needs + to be added to libssh2 itself and probably other backends. - Several macros in libssh2.h call strlen and pass the result directly to - unsigned int parameters of other functions, which warns about precision - loss because strlen returns size_t which is unsigned long on at least - some platforms (such as OS X). The fix is to simply typecast the - strlen() result to unsigned int. - -- libssh2.h: bump version to 1.4.4-DEV - -Version 1.4.3 (27 Nov 2012) + Memory is cleared using the function SecureZeroMemory which is + available on Windows systems, just like the WinCNG backend. -Daniel Stenberg (27 Nov 2012) -- RELEASE-NOTES: fixed for 1.4.3 +- wincng.c: fixed mixed line-endings -- sftp_read: return error if a too large package arrives +- wincng.c: fixed use of invalid parameter types in a8d14c5dcf -Peter Stuge (13 Nov 2012) -- Only define _libssh2_dsa_*() functions when building with DSA support +- wincng.c: only try to load keys corresponding to the algorithm -Guenter Knauf (8 Nov 2012) -- Added .def file to output. +- wincng.c: moved PEM headers into definitions -Kamil Dudka (1 Nov 2012) -- libssh2_hostkey_hash.3: update the description of return value - - The function returns NULL also if the hash algorithm is not available. +- wincng.h: fixed invalid parameter name -Guenter Knauf (24 Oct 2012) -- Fixed mode acciedently committed. +- wincng: fixed mismatch with declarations in crypto.h -- Ignore generated file. +- userauth.c: fixed warning C6001: using uninitialized sig and sig_len -- Added hack to make use of Makefile.inc. - - This should avoid further maintainance of the objects list. +- pem.c: fixed warning C6269: possible incorrect order of operations -- Fixed MSVC NMakefile. +- wincng: add support for authentication keys to be passed in memory - Added missing source files; added resource for DLL. + Based upon 18cfec8336e and daa2dfa2db. -Kamil Dudka (22 Oct 2012) -- examples: use stderr for messages, stdout for data +- pem.c: add _libssh2_pem_parse_memory to parse PEM from memory - Reported by: Karel Srot - Bug: https://bugzilla.redhat.com/867462 + Requirement to implement 18cfec8336e for Libgcrypt and WinCNG. -- openssl: do not leak memory when handling errors - - ,.. in aes_ctr_init(). Detected by Coverity. +- pem.c: fix copy and paste mistake from 55d030089b8 -- channel: fix possible NULL dereference - - ... in libssh2_channel_get_exit_signal(). Detected by Coverity. +- userauth.c: fix another possible dereference of a null pointer -- Revert "aes: the init function fails when OpenSSL has AES support" - - This partially reverts commit f4f2298ef3635acd031cc2ee0e71026cdcda5864. - - We need to use the EVP_aes_???_ctr() functions in FIPS mode. +- userauth.c: fix possible dereference of a null pointer -- crypt: use hard-wired cipher block sizes consistently +- pem.c: reduce number of calls to strlen in readline -- openssl: do not ignore failure of EVP_CipherInit() +Alexander Lamaison (17 Mar 2015) +- [Will Cosgrove brought this change] -- kex: do not ignore failure of libssh2_md5_init() + Initialise HMAC_CTX in more places. - The MD5 algorithm is disabled when running in FIPS mode. - -Daniel Stenberg (21 Aug 2012) -- [Peter Krempa brought this change] + Missed a couple more places we init ctx to avoid openssl threading crash. - known_hosts: Fail when parsing unknown keys in known_hosts file. +- Build build breakage in WinCNG backend caused when adding libssh2_userauth_publickey_frommemory. - libssh2_knownhost_readfile() silently ignored problems when reading keys - in unsupported formats from the known hosts file. When the file is - written again from the internal structures of libssh2 it gets truntcated - to the point where the first unknown key was located. + The new feature isn't implemented for the WinCNG backend currently, but the WinCNG backend didn't contain any implementation of the required backend functions - even ones that returns an error. That caused link errors. - * src/knownhost.c:libssh2_knownhost_readfile() - return error if key - parsing fails + This change fixes the problem by providing an implementation of the backend functions that returns an error. -- AUTHORS: synced with 42fec44c8a4 +- Fix breakage in WinCNG backend caused by introducing libssh2_hmac_ctx_init. - 31 recent authors added + The macro was defined to nothing for the libgcrypt backend, but not for WinCNG. This brings the latter into line with the former. -- [Dave Hayden brought this change] +Daniel Stenberg (15 Mar 2015) +- userauth_publickey_frommemory.3: add AVAILABILITY + + ... it will be added in 1.6.0 - compression: add support for zlib@openssh.com +- libssh2: next version will be called 1.6.0 - Add a "use_in_auth" flag to the LIBSSH2_COMP_METHOD struct and a - separate "zlib@openssh.com" method, along with checking session->state - for LIBSSH2_STATE_AUTHENTICATED. Appears to work on the OpenSSH servers - I've tried against, and it should work as before with normal zlib - compression. + ... since we just added a new function. -- [Dmitry Smirnov brought this change] +- docs: add libssh2_userauth_publickey_frommemory.3 to dist + + The function and man page were added in commit 18cfec8336e - configure: gcrypt doesn't come with pkg-config support +- [Jakob Egger brought this change] + + direct_tcpip: Fixed channel write - ... so use plain old -lgcrypt to the linker to link with it. + There were 3 bugs in this loop: + 1) Started from beginning after partial writes + 2) Aborted when 0 bytes were sent + 3) Ignored LIBSSH2_ERROR_EAGAIN - Fixes #225 + See also: + https://trac.libssh2.org/ticket/281 + https://trac.libssh2.org/ticket/293 -- sftp_read: Value stored to 'next' is never read +Alexander Lamaison (15 Mar 2015) +- [Will Cosgrove brought this change] + + Must init HMAC_CTX before using it. - Detected by clang-analyzer + Must init ctx before using it or openssl will reuse the hmac which is not thread safe and causes a crash. + Added libssh2_hmac_ctx_init macro. -- publickey_init: errors are negative, fix check +- Add continuous integration configurations. - Detected by clang-analyzer. + Linux-based CI is done by Travis CI. Windows-based CI is done by Appveyor. -- [Maxime Larocque brought this change] +- [David Calavera brought this change] - session_free: wrong variable used for keeping state - - If libssh2_session_free is called without the channel being freed - previously by libssh2_channel_free a memory leak could occur. - - A mismatch of states variables in session_free() prevent the call to - libssh2_channel_free function. session->state member is used instead of - session->free_state. - - It causes a leak of around 600 bytes on every connection on my systems - (Linux, x64 and PPC). + Allow authentication keys to be passed in memory. - (Debugging done under contract for Accedian Networks) + All credits go to Joe Turpin, I'm just reaplying and cleaning his patch: + http://www.libssh2.org/mail/libssh2-devel-archive-2012-01/0015.shtml - Fixes #246 - -Guenter Knauf (29 Jun 2012) -- Small NetWare makefile tweak. + * Use an unimplemented error for extracting keys from memory with libgcrypt. -- Some small Win32 makefile fixes. +Daniel Stenberg (14 Mar 2015) +- docs: include the renamed INSTALL* files in dist -Daniel Stenberg (19 Jun 2012) -- libssh2_userauth_publickey_fromfile_ex.3: mention publickey == NULL +Alexander Lamaison (13 Mar 2015) +- Prevent collisions between CMake and Autotools in examples/ and tests/. -- comp_method_zlib_decomp: handle Z_BUF_ERROR when inflating - - When using libssh2 to perform an SFTP file transfer from the "JSCAPE MFT - Server" (http://www.jscape.com) the transfer failed. The default JSCAPE - configuration is to enforce zlib compression on SSH2 sessions so the - session was compressed. The relevant part of the debug trace contained: +- Avoid clash between CMake build and Autotools. - [libssh2] 1.052750 Transport: unhandled zlib error -5 - [libssh2] 1.052750 Failure Event: -29 - decompression failure + Autotools expects a configuration template file at src/libssh2_config.h.in, which buildconf generates. But the CMake build system has its CMake-specific version of the file at this path. This means that, if you don't run buildconf, the Autotools build will fail because it configured the wrong header template. - The trace comes from comp_method_zlib_decomp() in comp.c. The "unhandled - zlib error -5" is the status returned from the zlib function - inflate(). The -5 status corresponds to "Z_BUF_ERROR". - - The inflate() function takes a pointer to a z_stream structure and - "inflates" (decompresses) as much as it can. The relevant fields of the - z_stream structure are: - - next_in - pointer to the input buffer containing compressed data - avail_in - the number of bytes available at next_in - next_out - pointer to the output buffer to be filled with uncompressed - data - avail_out - how much space available at next_out - - To decompress data you set up a z_stream struct with the relevant fields - filled in and pass it to inflate(). On return the fields will have been - updated so next_in and avail_in show how much compressed data is yet to - be processed and next_out and avail_out show how much space is left in - the output buffer. - - If the supplied output buffer is too small then on return there will be - compressed data yet to be processed (avail_in != 0) and inflate() will - return Z_OK. In this case the output buffer must be grown, avail_out - updated and inflate() called again. - - If the supplied output buffer was big enough then on return the - compressed data will have been exhausted (avail_in == 0) and inflate() - will return Z_OK, so the data has all been uncompressed. - - There is a corner case where inflate() makes no progress. That is, there - may be unprocessed compressed data and space available in the output - buffer and yet the function does nothing. In this case inflate() will - return Z_BUF_ERROR. From the zlib documentation and the source code it - is not clear under what circumstances this happens. It could be that it - needs to write multiple bytes (all in one go) from its internal state to - the output buffer before processing the next chunk of input but but - can't because there is not enough space (though my guesses as to the - cause are not really relevant). Recovery from Z_BUF_ERROR is pretty - simple - just grow the output buffer, update avail_out and call - inflate() again. - - The comp_method_zlib_decomp() function does not handle the case when - inflate() returns Z_BUF_ERROR. It treats it as a non-recoverable error - and basically aborts the session. - - Fixes #240 + See https://github.com/libssh2/libssh2/pull/8. -Guenter Knauf (12 Jun 2012) -- MinGW makefile tweaks. +- Merge pull request #8 from alamaison/cmake - Use GNU tools when compiling on Linux. - Fixed dist and dev targets. + CMake build system. -- NetWare makefile tweaks. +- CMake build system. - Changed to use Windows commandline tools instead of - GNU tools when compiling on Windows. Fixed dist and - dev targets. Enabled nlmconv error for unresolved - symbols. - -Daniel Stenberg (11 Jun 2012) -- Revert "config.rpath: generated file, no need to keep in git" + Tested: + - Windows: + - Visual C++ 2005/2008/2010/2012/2013/MinGW-w64 + - static/shared + - 32/64-bit + - OpenSSL/WinCNG + - Without zlib + - Linux: + - GCC 4.6.3/Clang 3.4 + - static/shared + - 32/64-bit + - OpenSSL/Libgcrypt + - With/Without zlib + - MacOS X + - AppleClang 6.0.0 + - static + - 64-bit + - OpenSSL + - Without zlib - This reverts commit 1ac7bd09cc685755577fb2c8829adcd081e7ab3c. + Conflicts: + README + +- Man man syntax tests fail gracefully if man version is not suitable. + +- Return valid code from test fixture on failure. - This file still used by lib/*m4 functions so we need to keep the file - around. + The sshd test fixture was returning -1 if an error occurred, but negative error codes aren't technically valid (google it). Bash on Windows converted them to 0 which made setup failure look as though all tests were passing. -- BINDINGS: added PySsh2, a Python-ctypes binding +- Let mansyntax.sh work regardless of where it is called from. -Guenter Knauf (8 Jun 2012) -- Fixed MinGW debug build. +Daniel Stenberg (12 Mar 2015) +- [Viktor Szakáts brought this change] -Daniel Stenberg (5 Jun 2012) -- BINDINGS: Added the Cocoa/Objective-C one + mingw build: allow to pass custom CFLAGS - ... and sorted the bindings after the languages, alphabetically + Allow to pass custom `CFLAGS` options via environment variable + `LIBSSH2_CFLAG_EXTRAS`. Default and automatically added options of + `GNUmakefile` have preference over custom ones. This addition is useful + for passing f.e. custom CPU tuning or LTO optimization (`-flto + -ffat-lto-objects`) options. The only current way to do this is to edit + `GNUmakefile`. This patch makes it unnecessary. - Reported by: Mike Abdullah + This is a mirror of similar libcurl patch: + https://github.com/bagder/curl/pull/136 -- BINDINGS: document the bindings we know of +- [Will Cosgrove brought this change] -Guenter Knauf (4 Jun 2012) -- Fixed LIBSSH2_INT64_T_FORMAT macro. + userauth: Fixed prompt text no longer being copied to the prompts struct - Usually a format macro should hold the whole format, otherwise - it should be named a prefix. Also fixed usage of this macro in - scp.c for a signed var where it was used as prefix for unsigned. + Regression from 031566f9c -- Removed obsolete define from makefiles. +- README: update the git repo locations -- Renamed NetWare makefiles. +- wait_socket: wrong use of difftime() + + With reversed arguments it would always return a negative value... + + Bug: https://github.com/bagder/libssh2/issues/1 -- Renamed NetWare makefiles. +- bump: start working toward 1.5.1 now -- Synced MinGW makefiles with 56c64a6..39e438f. - - Also synced MinGW test makefile with b092696..f8cb874. +Version 1.5.0 (11 Mar 2015) -Peter Stuge (30 May 2012) -- Revert "sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN" - - This reverts commit 04e79e0c798674a0796be8a55f63dd92e6877790. +Daniel Stenberg (11 Mar 2015) +- RELEASE-NOTES: 1.5.0 release -- sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN - - This works around a protocol violation in the ProFTPD 1.3.4 mod_sftp - server, as reported by Will Cosgrove in: - - http://libssh2.org/mail/libssh2-devel-archive-2012-05/0079.shtml +- [Mariusz Ziulek brought this change] + + kex: bail out on rubbish in the incoming packet - Based on a suggested fix by TJ Saunders in: + CVE-2015-1782 - http://libssh2.org/mail/libssh2-devel-archive-2012-05/0104.shtml + Bug: http://www.libssh2.org/adv_20150311.html -Guenter Knauf (28 May 2012) -- Try to detect OpenSSL build type automatically. +- docs: move INSTALL, AUTHORS, HACKING and TODO to docs/ - Also fixed recently added libgdi32 linkage which is only - required when OpenSSL libs are linked statically. - -Daniel Stenberg (25 May 2012) -- config.rpath: generated file, no need to keep in git + And with this, cleanup README to be shorter and mention the new source + code home. -Guenter Knauf (22 May 2012) -- Updated dependency libary versions. +- .gitignore: don't ignore INSTALL -Daniel Stenberg (18 May 2012) -- 1.4.3: towards the future +Dan Fandrich (4 Mar 2015) +- examples/x11.c: include sys/select.h for improved portability -Version 1.4.2 (18 May 2012) +Daniel Stenberg (4 Mar 2015) +- RELEASE-NOTES: synced with a8473c819bc068 + + In preparation for the upcoming 1.5.0 release. -Daniel Stenberg (18 May 2012) -- RELEASE-NOTES: synced with 92a9f952794 +Guenter Knauf (8 Jan 2015) +- NetWare build: added some missing exports. -Alexander Lamaison (15 May 2012) -- win32/libssh2_config.h: Remove hardcoded #define LIBSSH2_HAVE_ZLIB. - - Rationale: Everything else in this file states a fact about the win32 - platform that is unconditional for that platform. There is nothing - unconditional about the presence of zlib. It is neither included with - Windows nor with the platform SDK. Therefore, this is not an appropriate - place to assert its presence. Especially as, once asserted, it cannot be - overridden using a compiler flag. +Marc Hoersken (29 Dec 2014) +- knownhost.c: fix use of uninitialized argument variable wrote - In contrast, if it is omitted, then it can easily be reasserted by adding - a compiler flag defining LIBSSH2_HAVE_ZLIB. + Detected by clang scan in line 1195, column 18. -Daniel Stenberg (14 May 2012) -- RELEASE-NOTES: synced with 69a3354467c +- examples/x11.c: fix result of operation is garbage or undefined + + Fix use of uninitialized structure w_size_bck. + Detected by clang scan in line 386, column 28. -- _libssh2_packet_add: SSH_MSG_CHANNEL_REQUEST default to want_reply +- examples/x11.c: remove dead assigments of some return values - RFC4254 says the default 'want_reply' is TRUE but the code defaulted to - FALSE. Now changed. + Detected by clang scan in line 212, column 9. + Detected by clang scan in line 222, column 13. + Detected by clang scan in line 410, column 13. + +- examples/x11.c: fix possible memory leak if read fails - Fixes #233 + Detected by clang scan in line 224, column 21. -- gettimeofday: no need for a replacement under cygwin +- examples/x11.c: fix invalid removal of first list element - Fixes #224 + Fix use of memory after it was being freed. + Detected by clang scan in line 56, column 12. -Alexander Lamaison (13 May 2012) -- Prevent sftp_packet_read accessing freed memory. +- userauth.c: make sure that sp_len is positive and avoid overflows - sftp_packet_add takes ownership of the packet passed to it and (now that we - handle zombies) might free the packet. sftp_packet_read uses the packet type - byte as its return code but by this point sftp_packet_add might have freed - it. This change fixes the problem by caching the packet type before calling - sftp_packet_add. + ... if the pointer subtraction of sp1 - pubkey - 1 resulted in a + negative or larger value than pubkey_len, memchr would fail. - I don't understand why sftp_packet_read uses the packet type as its return - code. A future change might get rid of this entirely. + Reported by Coverity CID 89846. -Daniel Stenberg (12 May 2012) -- sftp_packet_flush: flush zombies too +- channel.c: remove logically dead code, host cannot be NULL here - As this function is called when the SFTP session is closed, it needs to - also kill all zombies left in the SFTP session to avoid leaking memory - just in case some zombie would still be in there. - -- sftp_packetlist_flush: zombies must not have responses already + ... host cannot be NULL in line 525, because it is always + valid (e.g. at least set to "0.0.0.0") after lines 430 and 431. - When flushing the packetlist, we must only add the request as a zombie - if no response has already been received. Otherwise we could wrongly - make it a zombie even though the response was already received and then - we'd get a zombie stuck there "forever"... + Reported by Coverity CID 89807. -- sftp_read: on EOF remove packet before flush +- session.c: check return value of session_nonblock during startup - Since the sftp_packetlist_flush() function will move all the existing - FXP_READ requests in this handle to the zombie list we must first remove - this just received packet as it is clearly not a zombie. + Reported by Coverity CID 89803. -- sftp_packet_require: sftp_packet_read() returning 0 is not an error +- session.c: check return value of session_nonblock in debug mode - Exactly as the comment in the code said, checking the return code from - sftp_packet_read() with <= was wrong and it should be < 0. With the new - filtering on incoming packets that are "zombies" we can now see this - getting zero returned. + Reported by Coverity CID 89805. -- sftp_packetlist_flush: only make it zombie if it was sent - - The list of outgoing packets may also contain packets that never were - sent off and we better not make them zombies too. +- pem.c: fix mixed line-endings introduced with 8670f5da24 -- [Alexander Lamaison brought this change] +- pem.c: make sure there's a trailing zero and b64data is not NULL + + ... if there is no base64 data between PEM header and footer. + Reported by Coverity CID 89823. - Mark outstanding read requests after EOF as zombies. +- kex.c: make sure mlist is not set to NULL - In order to be fast, sftp_read sends many read requests at once. With a small - file, this can mean that when EOF is received back, many of these requests are - still outstanding. Responses arriving after we close the file and abandon the - file handle are queued in the SFTP packet queue and never collected. This - causes transfer speed to drop as a progressively longer queue must be searched - for every packet. + ... if the currently unsupported LANG methods are called. + Reported by Coverity CID 89834. + +- packet.c: i < 256 was always true and i would overflow to 0 - This change introduces a zombie request-ID list in the SFTP session that is - used to recognise these outstanding requests and prevent them being added to - the queue. + Visualize that the 0-termination is intentional, because the array + is later passed to strlen within _libssh2_packet_askv. -Peter Stuge (23 Apr 2012) -- [Rafael Kitover brought this change] +- silence multiple data conversion warnings - Update win32/GNUmakefile to use OpenSSL 1.0.1a +Daniel Stenberg (23 Dec 2014) +- agent_connect_unix: make sure there's a trailing zero - libcrypto on win32 now depends on gdi32.dll, so move the OpenSSL LDLIBS - block to before the compiler definitions, so that libcrypto gets added - first, and then add -lgdi32 into the following common LDLIBS for gcc. + ... if the path name was too long. Reported by Coverity CID 89801. -Guenter Knauf (23 Apr 2012) -- Changed 'Requires' to 'Requires.private'. +Marc Hoersken (22 Dec 2014) +- examples on Windows: use native SOCKET-type instead of int - Only static builds need to link against the crypto libs. + And check return values accordingly. -- Fixed 'Requires:' names. - - The 'Requires:' line lists the names of the .pc files. +- userauth.c: improve readability and clarity of for-loops -- Added 'Requires:' line to libssh2.pc. +Daniel Stenberg (22 Dec 2014) +- calloc: introduce LIBSSH2_CALLOC() - This is necessary so that other libs which lookup libssh2 info - via pkg-config can add the right crypto lib dependencies. + A simple function using LIBSSH2_ALLOC + memset, since this pattern was + used in multiple places and this simplies code in general. -- Updated dependency lib versions. +Marc Hoersken (15 Dec 2014) +- libssh2_priv.h: Ignore session, context and format parameters -Peter Stuge (18 Apr 2012) -- configure.ac: Add option to disable build of the example applications +- x11 example: check return value of socket function + +- examples: fixed mixed line-endings introduced with aedfba25b8 + +- wincng.c: explicitly ignore BCrypt*AlgorithmProvider return codes - Examples are built by default. Any of the following options on the - configure command line will skip building them: + Fixes VS2012 code analysis warning C6031: + return value ignored: could return unexpected value + +- wincng.c: fix possible invalid memory write access - --disable-examples-build - --enable-examples-build=no - --enable-examples-build=false + Fixes VS2012 code analysis warning C6386: + buffer overrun: accessing 'pbOutput', the writable size is + 'cbOutput' bytes, but '3' bytes may be written: libssh2 wincng.c 610 -- userauth.c: fread() from public key file to correctly detect any errors +- tests on Windows: check for WSAStartup return code - If the filename parameter for file_read_publickey() was the name of a - directory instead of a file then libssh2 would spin trying to fgetc() - from the FILE * for the opened directory when trying to determine the - length of the encoded public key, since fgetc() can't report errors. + Fixes VS2012 code analysis warning C6031: + return value ignored: could return unexpected value + +- wincng.c: fix possible NULL pointer de-reference of bignum - Use fread() instead to correctly detect this error condition along - with many others. + Fixes VS2012 code analysis warning C6011: + dereferencing NULL pointer 'bignum'. libssh2 wincng.c 1567 + +- wincng.c: fix possible use of uninitialized memory - This fixes the problem reported in - http://www.libssh2.org/mail/libssh2-devel-archive-2012-04/0021.shtml + Fixes VS2012 code analysis warning C6001: + using uninitialized memory 'cbDecoded'. libssh2 wincng.c 553 + +- packet.c: fix possible NULL pointer de-reference within listen_state - Reported-by: Oleksiy Zagorskyi + Fixes VS2012 code analysis warning C6011: + dereferencing NULL pointer 'listen_state->channel'. libssh2 packet.c 221 -- Return LIBSSH2_ERROR_SOCKET_DISCONNECT on EOF when reading banner +- kex.c: fix possible NULL pointer de-reference with session->kex + + Fixes VS2012 code analysis warning C6011: + dereferencing NULL pointer 'session->kex'. libssh2 kex.c 1761 -Guenter Knauf (17 Apr 2012) -- Fixed copyright year. +- agent.c: check return code of MapViewOfFile + + Fixes VS2012 code analysis warning C6387: 'p+4' may be '0': + this does not adhere to the specification for the function + 'memcpy': libssh2 agent.c 330 + + Fixes VS2012 code analysis warning C6387: 'p' may be '0': + this does not adhere to the specification for the function + 'UnmapViewOfFile': libssh2 agent.c 333 -- Updated dependency lib versions in static makefiles. +- examples on Windows: check for socket return code + + Fixes VS2012 code analysis warning C28193: + The variable holds a value that must be examined -Daniel Stenberg (6 Apr 2012) -- version: bump to 1.4.2 +- examples on Windows: check for WSAStartup return code - We're on the 1.4.2 track now (at least) + Fixes VS2012 code analysis warning C6031: + return value ignored: could return unexpected value -Version 1.4.1 (4 Apr 2012) +Guenter Knauf (11 Dec 2014) +- wincng.c: silent some more gcc compiler warnings. -Daniel Stenberg (4 Apr 2012) -- RELEASE-NOTES: updated for 1.4.1 release +- wincng.c: silent gcc compiler warnings. -- always do "forced" window updates +- Watcom build: added support for WinCNG build. + +- build: updated dependencies in makefiles. + +Daniel Stenberg (4 Dec 2014) +- configure: change LIBS not LDFLAGS when checking for libs - When calling _libssh2_channel_receive_window_adjust() internally, we now - always use the 'force' option to prevent libssh2 to avoid sending the - update if the update isn't big enough. + Closes #289 - It isn't fully analyzed but we have seen corner cases which made a - necessary window update not get send due to this and then the other side - doesn't send data our side then sits waiting for forever. + Patch-by: maurerpe -- channel_read: force window adjusts! +Guenter Knauf (3 Dec 2014) +- MinGW build: some more GNUMakefile tweaks. - if there's not enough room to receive the data that's being requested, - the window adjustment needs to be sent to the remote and thus the force - option has to be used. _libssh2_channel_receive_window_adjust() would - otherwise "queue" small window adjustments for a later packet but that - is really terribly for the small buffer read that for example is the - final little piece of a very large file as then there is no logical next - packet! + test/GNUmakefile: added architecture autodetection; added switches to + CFLAGS and RCFLAGS to make sure that the right architecture is used. + Added support to build with WinCNG. + +- sftpdir.c: added authentication method detection. - Reported by: Armen Babakhanian - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0130.shtml + Stuff copied over from ssh2.c to make testing a bit easier. -- [Paul Howarth brought this change] +- NMake build: fixed LIBS settings. - aes: the init function fails when OpenSSL has AES support - - The internal init function only worked fine when the configure script - didn't detect the OpenSSL AES_CTR function! +- NMake build: added support for WinCNG build. + +- MinGW build: some GNUMakefile tweaks. - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0111.shtml - Reported by: Paul Howarth + Added architecture autodetection; added switches to CFLAGS and + RCFLAGS to make sure that the right architecture is used. + Added support to build with WinCNG. -- [Matthew Booth brought this change] +- MinGW build: Fixed redefine warnings. - transport_send: Finish in-progress key exchange before sending data - - _libssh2_channel_write() first reads outstanding packets before writing - new data. If it reads a key exchange request, it will immediately start - key re-exchange, which will require sending a response. If the output - socket is full, this will result in a return from - _libssh2_transport_read() of LIBSSH2_ERROR_EAGAIN. In order not to block - a write because there is no data to read, this error is explicitly - ignored and the code continues marshalling a packet for sending. When it - is sent, the remote end immediately drops the connection because it was - expecting a continuation of the key exchange, but got a data packet. - - This change adds the same check for key exchange to - _libssh2_transport_send() that is in _libssh2_transport_read(). This - ensures that key exchange is completed before any data packet is sent. +- Updated copyright year. -- channel_write: acknowledge transport errors - - When draining data off the socket with _libssh2_transport_read() (which - in turn has to be done so that we can be sure to have read any possible - window-increasing packets), this code previously ignored errors which - could lead to nasty loops. Now all error codes except EAGAIN will cause - the error to be returned at once. - - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0068.shtml - Reported by: Matthew Booth +Daniel Stenberg (31 Aug 2014) +- COPYING: bump the copyright year -- [Steven Dake brought this change] +Dan Fandrich (28 Jul 2014) +- docs: fixed a bunch of typos - In examples/x11.c, Make sure sizeof passed to read operation is correct - - sizeof(buf) expands to 8 or 4 (since its a pointer). This variable may - have been static in the past, leading to this error. +- docs: added missing libssh2_session_handshake.3 file + +Marc Hoersken (19 May 2014) +- wincng.c: specify the required libraries for dependencies using MSVC - Signed-off-by: Steven Dake + Initially reported by Bob Kast as "for MS VS builds, specify the + libraries that are required so they don't need to go into all + project files that may use this library". Thanks a lot. -- [Steven Dake brought this change] +- [Bob Kast brought this change] - Fix suspicious sizeof usage in examples/x11.c + windows build: do not export externals from static library - In the x11 example, sizeof(buf) = 8UL (on x86_64), when this should - probably represent the buffer size available. I am not sure how to - test that this change is actually correct, however. + If you are building a DLL, then you need to explicitly export each + entry point. When building a static library, you should not. - Signed-off-by: Steven Dake + libssh2 was exporting the entry points whether it was building a DLL or a + static library. To elaborate further, if libssh2 was used as a static + library, which was being linked into a DLL, the libssh2 API would be + exported from that separate DLL. -- sftp_packet_read: follow-up fix for EAGAIN/window adjust - - The commit in 7194a9bd7ba45 wasn't complete. This change makes sure - variables are initialized properly before used in the EAGAIN and window - adjust cases. +Daniel Stenberg (19 May 2014) +- [Mikhail Gusarov brought this change] -- sftp_packet_add: use named error code instead of number + Fix typos in manpages -- sftp_packet_add: verify the packet before accepting it - - In order to bail out as quickly as possible when things are wrong and - out of sync, make sure the SFTP message is one we understand. +Marc Hoersken (18 May 2014) +- wincng.c: Fixed memory leak in case of an error during ASN.1 decoding -- SFTP: preserve the original error code more +- configure: Display individual crypto backends on separate lines - Lots of places in the code translated the original error into the more - generic LIBSSH2_ERROR_SOCKET_TIMEOUT but this turns out to distort the - original error reason a lot and makes tracking down the real origin of a - problem really hard. This change makes the original error code be - preserved to a larger extent when return up to the parent function. - -- sftp_packet_read: adjust window size as necessary - - Commit 03ca9020756 tried to simplify the window sizing logic but broke - SFTP readdir as there was no window sizing code left there so large - directory listings no longer worked. - - This change introduces window sizing logic to the sftp_packet_read() - function so that it now tells the remote about the local size having a - window size that suffice when it is about to ask for directory data. + This avoids line-wrapping in between parameters and makes the + error message look like the following: - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0069.shtml - Reported by: Eric + configure: error: No crypto library found! + Try --with-libssl-prefix=PATH + or --with-libgcrypt-prefix=PATH + or --with-wincng on Windows -- [Steven Dake brought this change] +- [Bob Kast brought this change] - Tell C compiler we don't care about return code of libssh2_init - - The call of libssh2_init returns a return code, but nothing could be done - within the _libssh2_init_if_needed execution path. + libssh2_priv.h: a 1 bit bit-field should be unsigned - Signed-off-by: Steven Dake + some compilers may not like this -- [Steven Dake brought this change] +- knownhost.c: Fixed warning that pointer targets differ in signedness - Add comment indicating a resource leak is not really a resource leak - - While possibly obvious to those investigating the code, coverity complains - about this out of scope leak. +- wincng.c: Fixed warning about pointer targets differing in signedness + +- tcpip-forward.c: Fixed warning that pointer targets differ in signedness - Signed-off-by: Steven Dake + libssh2_channel_forward_listen_ex uses ints instead of unsigned ints. -- [Steven Dake brought this change] +- misc.c: Fixed warning about mixed declarations and code - Use safer snprintf rather then sprintf in scp_send() - - Signed-off-by: Steven Dake +- libgcrypt.h: Fixed warning about pointer targets differing in signedness -- [Steven Dake brought this change] +- wincng.h: Fixed warning about pointer targets differing in signedness - Use safer snprintf rather then sprintf in scp_recv() - - While the buffer is indeed allocated to a safe length, better safe then sorry. - - Signed-off-by: Steven Dake +- misc.c: Fixed warning about unused parameter abstract -- [Steven Dake brought this change] +- tcpip-forward.c: Removed unused variables shost, sport and sockopt - use snprintf in knownhost_writeline() rather then sprintf +- wincng.h: Added forward declarations for all WinCNG functions - Although the function checks the length, if the code was in error, there - could potentially be a buffer overrun with the use of sprintf. Instead replace - with snprintf. + Initially reported by Bob Kast as "Wincng - define function + prototypes for wincng routines". Thanks a lot. - Signed-off-by: Steven Dake + Also replaced structure definitions with type definitions. -- [Steven Dake brought this change] +- [Bob Kast brought this change] - Add tracing to print packets left on session at libssh2_session_free - - Signed-off-by: Steven Dake + libssh2.h: on Windows, a socket is of type SOCKET, not int -Peter Stuge (2 Mar 2012) -- Define and use LIBSSH2_INVALID_SOCKET instead of INVALID_SOCKET +- win32: Added WinCNG targets to generated Visual Studio project - INVALID_SOCKET is a special value in Windows representing a - non-valid socket identifier. We were #defining this to -1 on - non-Windows platforms, causing unneccessary namespace pollution. - Let's have our own identifier instead. + Inspired by Bob Kast's reports, this commit enables the compilation + of libssh2 with WinCNG using the generated Visual Studio project files. + This commit adds WinCNG support to parts of the existing Win32 build + infrastructure, until new build systems, like pre-defined VS project + files or CMake files may be added. - Thanks to Matt Lawson for pointing this out. - -- nw/Makefile.netware: Fix project name typo to avoid needless confusion + This commit and b20bfeb3e519119a48509a1099c06d65aa7da1d7 raise one + question: How to handle build systems, like VS project files, that + need to include all source files regardless of the desired target, + including all supported crypto backends? For now the mentioned commit + added a check for LIBSSH2_OPENSSL to openssl.c and with this commit + the supported crypto backends are hardcoded within Makefile.am. -- example/x11: Set raw terminal mode manually instead of with cfmakeraw() - - OpenSolaris has no cfmakeraw() so to make the example more portable - we simply do the equivalent operations on struct termios ourselves. +- libssh2_priv msvc: Removed redundant definition of inline keyword - Thanks to Tom Weber for reporting this problem, and finding a solution. + Initially reported by Bob Kast as "Remove redundant 'inline' define". + Thanks a lot. -Daniel Stenberg (17 Feb 2012) -- sftp_write: cannot return acked data *and* EAGAIN +- wincng: Made data parameter to hash update function constant - Whenever we have acked data and is about to call a function that *MAY* - return EAGAIN we must return the number now and wait to get called - again. Our API only allows data *or* EAGAIN and we must never try to get - both. + Initially reported by Bob Kast as "formal parameter must be const + since it is used in contexts where the actual parameter may be const". + Thanks a lot. -Peter Stuge (13 Feb 2012) -- example/x11: Build only when sys/un.h is found by configure +- wincng: fix cross-compilation against the w64 mingw-runtime package + +- openssl: Check for LIBSSH2_OPENSSL in order to compile with openssl + +- wincng: Fixed use of possible uninitialized variable pPaddingInfo - The example can't be built on systems without AF_UNIX sockets. + Reported by Bob Kast, thanks a lot. -Daniel Stenberg (10 Feb 2012) -- [Alexander Lamaison brought this change] +- wincng: Added cast for double to unsigned long conversion - Simplified sftp_read. +- wincng: Cleaned up includes and check NTSTATUS using macro - Removed the total_read variable that originally must have tracked how - much data had been written to the buffer. With non-blocking reads, we - must return straight away once we have read data into the buffer so this - variable served not purpose. + Removed header file combination that is not supported on a real + Windows platform and can only be compiled using MinGW. Replaced + custom NTSTATUS return code checks with BCRYPT_SUCCESS macro. + +Daniel Stenberg (16 Mar 2014) +- userauth_hostbased_fromfile: zero assign to avoid uninitialized use - I think it was still hanging around in case the initial processing of - 'leftover' data meant we wrote to the buffer but this case, like the - others, must return immediately. Now that it does, the last remaining - need for the variable is gone. + Detected by clang-analyze -- [Alexander Lamaison brought this change] +- channel_receive_window_adjust: store windows size always + + Avoid it sometimes returning without storing it, leaving calling + functions with unknown content! + + Detected by clang-analyzer - Cleaned up sftp_read and added more explanation. +- publickey_packet_receive: avoid junk in returned pointers - Replaced the gotos which were implementing the state machine with - a switch statement which makes the states more explicit. + clang-analyzer found this risk it would return a non-initialized pointer + in a success case -- sftp_read: avoid data *and* EAGAIN +Peter Stuge (16 Mar 2014) +- [Marc Hoersken brought this change] + + Added Windows Cryptography API: Next Generation based backend + +- [Marc Hoersken brought this change] + + knownhost.c: fixed that 'key_type_len' may be used uninitialized - Whenever we have data and is about to call a function that *MAY* return - EAGAIN we must return the data now and wait to get called again. Our API - only allows data *or* EAGAIN and we must never try to get both. + ../src/knownhost.c: In function 'libssh2_knownhost_readline': + ../src/knownhost.c:651:16: warning: 'key_type_len' may be used + uninitialized in this function [-Wmaybe-uninitialized] + rc = knownhost_add(hosts, hostbuf, NULL, + ^ + ../src/knownhost.c:745:12: note: 'key_type_len' was declared here + size_t key_type_len; + ^ -Peter Stuge (2 Feb 2012) -- Add a tcpip-forward example which demonstrates remote port forwarding +- [Marc Hoersken brought this change] -- libssh2.h: Add missing prototype for libssh2_session_banner_set() + pem.c: always compile pem.c independently of crypto backend -- example/subsystem_netconf.c: Return error when read buffer is too small +- Fix non-autotools builds: Always define the LIBSSH2_OPENSSL CPP macro - Also remove a little redundancy in the read loop condition. + Commit d512b25f69a1b6778881f6b4b5ff9cfc6023be42 introduced a crypto + library abstraction in the autotools build system, to allow us to more + easily support new crypto libraries. In that process it was found that + all other build system which we support are hard-coded to build with + OpenSSL. Commit f5c1a0d98bd51aeb24aca3d49c7c81dcf8bd858d fixes automake + introduced into non-autotools build systems but still overlooked the + CPP macro saying that we are using OpenSSL. + + Thanks to Marc Hörsken for identifying this issue and proposing a fix + for win32/{GNUmakefile,config.mk}. This commit uses a slightly different + approach but the end result is the same. -- example/subsystem_netconf.c: Add a missing newline in an error message +Dan Fandrich (15 Mar 2014) +- channel_close: Close the channel even in the case of errors -- Fix undefined reference to _libssh_error in libgcrypt backend +- sftp_close_handle: ensure the handle is always closed - Commit 209de22299b4b58e582891dfba70f57e1e0492db introduced a function - call to a non-existing function, and since then the libgcrypt backend - has not been buildable. + Errors are reported on return, but otherwise the close path is + completed as much as possible and the handle is freed on exit. -Version 1.4.0 (31 Jan 2012) +Alexander Lamaison (6 Mar 2014) +- knownhost: Restore behaviour of `libssh2_knownhost_writeline` with short buffer. + + Commit 85c6627c changed the behaviour of `libssh2_knownhost_writeline` so that it stopped returning the number of bytes needed when the given buffer was too small. Also, the function changed such that is might write to part of the buffer before realising it is too small. + + This commit restores the original behaviour, whilst keeping the unknown-key-type functionality that 85c6627c. Instead of writing to the buffer piecemeal, the length of the various parts is calculated up front and the buffer written only if there is enough space. The calculated necessary size is output in `outlen` regardless of whether the buffer was written to. + + The main use-case for the original behaviour that this commit restores is to allow passing in a NULL buffer to get the actual buffer size needed, before calling the function again with the buffer allocated to the exact size required. -Daniel Stenberg (31 Jan 2012) -- RELEASE-NOTES: synced with 6bd584d29 for 1.4.0 +- knownhost: Fix DSS keys being detected as unknown. + + I missing `else` meant ssh-dss format keys were being re-detected as unknown format. -- s/1.3.1/1.4.0 +Dan Fandrich (6 Mar 2014) +- knownhosts: Abort if the hosts buffer is too small - We're bumping the minor number + This could otherwise cause a match on the wrong host -- [Jernej Kovacic brought this change] +- agent_list_identities: Fixed memory leak on OOM - libssh2_session_supported_algs: fix compiler warning +- Fixed a few typos -- [Jernej Kovacic brought this change] +- userauth: Fixed an attempt to free from stack on error - session_supported_algs docs: added an example +- Fixed a few memory leaks in error paths -- [Gellule Xg brought this change] +- Fixed two potential use-after-frees of the payload buffer + + The first might occur if _libssh2_packet_add returns an error, as + fullpacket_state wasn't reset to idle so if it were possible for + fullpacket to be called again, it would return to the same state + handler and re-use the freed p->packet buffer. + + The second could occur if decrypt returned an error, as it freed the + packet buffer but did not clear total_num, meaning that freed buffer + could be written into again later. - sftp-seek: clear EOF flag +Alexander Lamaison (28 Nov 2013) +- Fix missing `_libssh2_error` in `_libssh2_channel_write`. - Set the EOF flag to False when calling seek64 to be able to get some - data back on a following read + In one case, the error code from `_libssh2_transport_read` was being returned from `_libssh2_channel_write` without setting it as the last error by calling `_libssh2_error`. This commit fixes that. + + Found when using a session whose socket had been inadvertently destroyed. The calling code got confused because via `libssh2_session_last_error` it appeared no error had occurred, despite one being returned from the previous function. -- [Peter Krempa brought this change] +Kamil Dudka (21 Nov 2013) +- [Mark McPherson brought this change] - userauth: Provide more informations if ssh pub key extraction fails + openssl: initialise the digest context before calling EVP_DigestInit() - If the function that extracts/computes the public key from a private key - fails the errors it reports were masked by the function calling it. This - patch modifies the key extraction function to return errors using - _libssh_error() function. The error messages are tweaked to contain - reference to the failed operaton in addition to the reason. + When using the OpenSSL libraries in FIPS mode, the function call + EVP_DigestInit() is actually #defined to FIPS_digestinit(). + Unfortunately wheres EVP_DigestInit() initialises the context and then + calls EVP_DigestInit_ex(), this function assumes that the context has + been pre-initialised and crashes when it isn't. - * AUTHORS: - add my name - * libgcrypt.c: _libssh2_pub_priv_keyfile(): - return a more verbose - error using - _libssh2_error() func. - * openssl.c: - modify call graph of _libssh2_pub_priv_keyfile() to use - _libssh2_error for error reporting(); - * userauth.c: - tweak functions calling _libssh2_pub_priv_keyfile() not - to shadow error messages + Bug: https://trac.libssh2.org/ticket/279 + + Fixes #279 -- TODO: remove issues we (sort of) did already +- [Marc Hörsken brought this change] -- ssh2_exec: skip error outputs for EAGAIN + .gitignore: Ignore files like src/libssh2_config.h.in~ + +Peter Stuge (13 Nov 2013) +- Move automake conditionals added by commit d512b25f out of Makefile.inc - Since the example uses non-blocking mode, it will just flood the output - with this "nonsense" error. + Commit d512b25f69a1b6778881f6b4b5ff9cfc6023be42 added automake + conditionals to Makefile.inc but since Makefile.inc is included + from Makefile for all other build systems that does not work. + + This commit instead adds Makefile.OpenSSL.inc and Makefile.libgcrypt.inc + and moves the automake conditional to its proper place, src/Makefile.am. + + The automake conditional includes the correct Makefile.$name.inc per + the crypto library selection/detection done by configure. + + All non-autotools build system files in libssh2 are hardcoded to use + OpenSSL and do not get a conditional but at least there is some reuse + because they can all include the new Makefile.OpenSSL.inc. -Guenter Knauf (30 Nov 2011) -- Some NetWare makefile tweaks. +Daniel Stenberg (27 Oct 2013) +- [Salvador Fandino brought this change] -Daniel Stenberg (18 Nov 2011) -- LIBSSH2_SFTP_PACKET_MAXLEN: increase to 80000 + Set default window size to 2MB - Some SFTP servers send SFTP packets larger than 40000. Since the limit - is only present to avoid insane sizes anyway, we can easily bump it. + The default channel window size used until now was 256KB. This value is + too small and results on a bottleneck on real-life networks where + round-trip delays can easily reach 300ms. - The define was formerly in the public header libssh2_sftp.h but served - no external purpose and was moved into the source dir. + The issue was not visible because the configured channel window size + was being ignored and a hard-coded value of ~22MB being used instead, + but that was fixed on a previous commit. - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-11/0004.shtml - Reported by: Michael Harris + This patch just changes the default window size + (LIBSSH2_CHANNEL_WINDOW_DEFAULT) to 2MB. It is the same value used by + OpenSSH and in our opinion represents a good compromise between memory + used and transfer speed. + + Performance tests were run to determine the optimum value. The details + and related discussion are available from the following thread on the + libssh2 mailing-list: + + http://www.libssh2.org/mail/libssh2-devel-archive-2013-10/0018.shtml + http://article.gmane.org/gmane.network.ssh.libssh2.devel/6543 + + An excerpt follows: + + "I have been running some transfer test and measuring their speed. + + My setup was composed of a quad-core Linux machine running Ubuntu 13.10 + x86_64 with a LXC container inside. The data transfers were performed + from the container to the host (never crossing through a physical + network device). + + Network delays were simulated using the tc tool. And ping was used to + verify that they worked as intended during the tests. + + The operation performed was the equivalent to the following ssh command: + + $ ssh container "dd bs=16K count=8K if=/dev/zero" >/dev/null + + Though, establishment and closing of the SSH connection was excluded + from the timings. + + I run the tests several times transferring files of sizes up to 128MB + and the results were consistent between runs. + + The results corresponding to the 128MB transfer are available here: + + https://docs.google.com/spreadsheet/ccc?key=0Ao1yRmX6PQQzdG5wSFlrZl9HRWNET3ZyN0hnaGo5ZFE&usp=sharing + + It clearly shows that 256KB is too small as the default window size. + Moving to a 512MB generates a great improvement and after the 1MB mark + the returns rapidly diminish. Other factors (TCP window size, probably) + become more limiting than the channel window size + + For comparison I also performed the same transfers using OpenSSH. Its + speed is usually on par with that of libssh2 using a window size of 1MB + (even if it uses a 2MB window, maybe it is less aggressive sending the + window adjust msgs)." + + Signed-off-by: Salvador Fandino -Alexander Lamaison (18 Nov 2011) -- [Peter Krempa brought this change] +- [Salvador brought this change] - knownhost_check(): Don't dereference ext if NULL is passed + _libssh2_channel_read: Honour window_size_initial - Documentation for libssh2_knownhost_checkp() and related functions - states that the last argument is filled with data if non-NULL. + _libssh2_channel_read was using an arbitrary hard-coded limit to trigger + the window adjusting code. The adjustment used was also hard-coded and + arbitrary, 15MB actually, which would limit the usability of libssh2 on + systems with little RAM. - "knownhost if set to non-NULL, it must be a pointer to a 'struct - libssh2_knownhost' pointer that gets filled in to point to info about a - known host that matches or partially matches." + This patch, uses the window_size parameter passed to + libssh2_channel_open_ex (stored as remote.window_size_initial) plus the + buflen as the base for the trigger and the adjustment calculation. - In this function ext is dereferenced even if set to NULL, causing - segfault in applications not needing the extra data. + The memory usage when using the default window size is reduced from 22MB + to 256KB per channel (actually, if compression is used, these numbers + should be incremented by ~50% to account for the errors between the + decompressed packet sizes and the predicted sizes). + + My tests indicate that this change does not impact the performance of + transfers across localhost or a LAN, being it on par with that of + OpenSSH. On the other hand, it will probably slow down transfers on + networks with high bandwidth*delay when the default window size + (LIBSSH2_CHANNEL_WINDOW_DEFAULT=256KB) is used. + + Signed-off-by: Salvador Fandino -Daniel Stenberg (11 Nov 2011) -- [Peter Krempa brought this change] +- [Salvador Fandino brought this change] - knownhost_add: Avoid dereferencing uninitialized memory on error path. + knownhosts: handle unknown key types - In function knownhost_add, memory is alocated for a new entry. If normal - alocation is used, memory is not initialized to 0 right after, but a - check is done to verify if correct key type is passed. This test is done - BEFORE setting the memory to null, and on the error path function - free_host() is called, that tries to dereference unititialized memory, - resulting into a glibc abort(). + Store but don't use keys of unsupported types on the known_hosts file. - * knownhost.c - knownhost_add(): - move typemask check before alloc + Currently, when libssh2 parses a known_host file containing keys of some + type it doesn't natively support, it stops reading the file and returns + an error. + + That means, that the known_host file can not be safely shared with other + software supporting other key types (i.e. OpenSSH). + + This patch adds support for handling keys of unknown type. It can read + and write them, even if they are never going to be matched. + + At the source level the patch does the following things: + + - add a new unknown key type LIBSSH2_KNOWNHOST_KEY_UNKNOWN + + - add a new slot (key_type_name) on the known_host struct that is + used to store the key type in ascii form when it is not supported + + - parse correctly known_hosts entries with unknown key types and + populate the key_type_name slot + + - print correctly known_hosts entries of unknown type + + - when checking a host key ignore keys that do not match the key + + Fixes #276 -- windows build: add define to avoid compiler warning +- windows build: fix build errors - A recent mingw compiler has started to complain on "#warning Please - include winsock2.h before windows.h" unless the magic define is set - first. + Fixes various link errors with VS2010 - Reported by: Vincent Torri - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-10/0064.shtml + Reported-by: "kdekker" + Fixes #272 -Henrik Nordstrom (31 Oct 2011) -- [Vincent Torri brought this change] +- man page: add missing function argument + + for libssh2_userauth_publickey_fromfile_ex() + + Reported-by: "pastey" + + Fixes #262 - Correct Windows include file name case, simplifying cross-compilation +- [Salvador brought this change] + + Fix zlib deflate usage - When cross compiling to Windows, libssh2.h include Windows header files - with upper case filenames : BaseTsd.h and WinSock2.h. + Deflate may return Z_OK even when not all data has been compressed + if the output buffer becomes full. - These files have lowercase names with mingw-w64 (iirc, it's the same with - mingw). And as on Windows, being lowercase or uppercase does not matter. + In practice this is very unlikely to happen because the output buffer + size is always some KBs larger than the size of the data passed for + compression from the upper layers and I think that zlib never expands + the data so much, even on the worst cases. + + Anyway, this patch plays on the safe side checking that the output + buffer is not exhausted. + + Signed-off-by: Salvador -Daniel Stenberg (25 Oct 2011) -- [Jernej Kovacic brought this change] +- [Salvador brought this change] - libssh2_session_supported_algs: added + comp_method_zlib_decomp: Improve buffer growing algorithm + + The old algorithm was O(N^2), causing lots and lots of reallocations + when highly compressed data was transferred. + + This patch implements a simpler one that just doubles the buffer size + everytime it is exhausted. It results in O(N) complexity. + + Also a smaller inflate ratio is used to calculate the initial size (x4). + + Signed-off-by: Salvador -- [Kamil Dudka brought this change] +- [Salvador brought this change] - example/sftp_RW_nonblock: do not ignore LIBSSH2_ERROR_EAGAIN + Fix zlib usage - Bug: https://bugzilla.redhat.com/745420 + Data may remain in zlib internal buffers when inflate() returns Z_OK + and avail_out == 0. In that case, inflate has to be called again. + + Also, once all the data has been inflated, it returns Z_BUF_ERROR to + signal that the input buffer has been exhausted. + + Until now, the way to detect that a packet payload had been completely + decompressed was to check that no data remained on the input buffer + but that didn't account for the case where data remained on the internal + zlib buffers. + + That resulted in packets not being completely decompressed and the + missing data reappearing on the next packet, though the bug was masked + by the buffer allocation algorithm most of the time and only manifested + when transferring highly compressible data. + + This patch fixes the zlib usage. + + Signed-off-by: Salvador -Peter Stuge (5 Oct 2011) -- example/ssh2_agent: Print host key fingerprint before authentication +- [Salvador brought this change] + + _libssh2_channel_read: fix data drop when out of window - Also moves the comment about not being authenticated to before the - agent authentication takes place, so that it better matches the code. + After filling the read buffer with data from the read queue, when the + window size was too small, "libssh2_channel_receive_window_adjust" was + called to increase it. In non-blocking mode that function could return + EAGAIN and, in that case, the EAGAIN was propagated upwards and the data + already read on the buffer lost. + + The function was also moving between the two read states + "libssh2_NB_state_idle" and "libssh2_NB_state_created" both of which + behave in the same way (excepting a debug statment). + + This commit modifies "_libssh2_channel_read" so that the + "libssh2_channel_receive_window_adjust" call is performed first (when + required) and if everything goes well, then it reads the data from the + queued packets into the read buffer. + + It also removes the useless "libssh2_NB_state_created" read state. + + Some rotted comments have also been updated. + + Signed-off-by: Salvador -Daniel Stenberg (29 Sep 2011) -- OpenSSL EVP: fix threaded use of structs +- [Salvador Fandino brought this change] + + window_size: redid window handling for flow control reasons - Make sure we don't clear or reset static structs after first init so - that they work fine even when used from multiple threads. Init the - structs in the global init. + Until now, the window size (channel->remote.window_size) was being + updated just after receiving the packet from the transport layer. - Help and assistance by: John Engstrom + That behaviour is wrong because the channel queue may grow uncontrolled + when data arrives from the network faster that the upper layer consumes + it. - Fixes #229 (again) + This patch adds a new counter, read_avail, which keeps a count of the + bytes available from the packet queue for reading. Also, now the window + size is adjusted when the data is actually read by an upper layer. + + That way, if the upper layer stops reading data, the window will + eventually fill and the remote host will stop sending data. When the + upper layers reads enough data, a window adjust packet is delivered and + the transfer resumes. + + The read_avail counter is used to detect the situation when the remote + server tries to send data surpassing the window size. In that case, the + extra data is discarded. + + Signed-off-by: Salvador -- openssl: don't init static structs differently +Peter Stuge (15 Sep 2013) +- configure.ac: Call zlib zlib and not libz in text but keep option names + +- configure.ac: Reorder --with-* options in --help output + +- configure.ac: Rework crypto library detection - make_ctr_evp() is changed to take a struct pointer, and then each - _libssh2_EVP_aes_[keylen]_ctr function is made to pass in their own - static struct + This further simplifies adding new crypto libraries. + +- Clean up crypto library abstraction in build system and source code - Reported by: John Engstrom - Fixes #229 + libssh2 used to explicitly check for libgcrypt and default to OpenSSL. + + Now all possible crypto libraries are checked for explicitly, making + the addition of further crypto libraries both simpler and cleaner. -Guenter Knauf (27 Sep 2011) -- Removed obsolete include path. +- configure.ac: Add zlib to Requires.private in libssh2.pc if using zlib -Daniel Stenberg (21 Sep 2011) -- read_state: clear the state variable better +- Revert "Added Windows Cryptography API: Next Generation based backend" - Set read_state back to idle before trying to send anything so that if - the state somehow is wrongly set. + This reverts commit d385230e15715e67796f16f3e65fd899f21a638b. + +Daniel Stenberg (7 Sep 2013) +- [Leif Salomonsson brought this change] + + sftp_statvfs: fix for servers not supporting statfvs extension - Also, avoid such a case of confusion by resetting the read_state when an - sftp handle is closed. + Fixes issue arising when server does not support statfvs and or fstatvfs + extensions. sftp_statvfs() and sftp_fstatvfs() after this patch will + handle the case when SSH_FXP_STATUS is returned from server. -- sftp_read: remove leftover fprintf +- [Marc Hoersken brought this change] + + Added Windows Cryptography API: Next Generation based backend + +- [Kamil Dudka brought this change] + + partially revert "window_size: explicit adjustments only" - Reported by: Alexander Lamaison + This partially reverts commit 03ca9020756a4e16f0294e5b35e9826ee6af2364 + in order to fix extreme slowdown when uploading to localhost via SFTP. + + I was able to repeat the issue on RHEL-7 on localhost only. It did not + occur when uploading via network and it did not occur on a RHEL-6 box + with the same version of libssh2. + + The problem was that sftp_read() used a read-ahead logic to figure out + the window_size, but sftp_packet_read() called indirectly from + sftp_write() did not use any read-ahead logic. -- sftp.h: fix the #ifdef to prevent multiple inclusions +- _libssh2_channel_write: client spins on write when window full + + When there's no window to "write to", there's no point in waiting for + the socket to become writable since it most likely just will continue to + be. + + Patch-by: ncm + Fixes #258 -- sftp_read: use a state variable to avoid bad writes +- _libssh2_channel_forward_cancel: avoid memory leaks on error - When a channel_write call has gotten an EAGAIN back, we try harder to - continue the same write in the subsequent invoke. + Fixes #257 -- window_size: explicit adjustments only +- _libssh2_packet_add: avoid using uninitialized memory - Removed the automatic window_size adjustments from - _libssh2_channel_read() and instead all channel readers must now make - sure to enlarge the window sizes properly themselves. + In _libssh2_packet_add, called by _libssh2_packet_read, a call to + _libssh2_packet_send that is supposed to send a one-byte message + SSH_MSG_REQUEST_FAILURE would send an uninitialized byte upon re-entry + if its call to _send returns _EAGAIN. - libssh2_channel_read_ex() - the public function, now grows the window - size according to the requested buffer size. Applications can still opt - to grow the window more on demand. Larger windows tend to give higher - performance. + Fixes #259 + +- _libssh2_channel_forward_cancel: accessed struct after free - sftp_read() now uses the read-ahead logic to figure out a window_size. + ... and the assignment was pointless anyway since the struct was about + to be freed. Bug introduced in dde2b094. + + Fixes #268 -- libssh2.h: bump the default window size to 256K +Peter Stuge (2 Jun 2013) +- [Marc Hoersken brought this change] -- libssh2_userauth_keyboard_interactive.3: fix man warning + Fixed compilation using mingw-w64 + +- [Marc Hoersken brought this change] + + knownhost.c: use LIBSSH2_FREE macro instead of free + + Use LIBSSH2_FREE instead of free since + _libssh2_base64_encode uses LIBSSH2_ALLOC + +Daniel Stenberg (18 May 2013) +- [Matthias Kerestesch brought this change] + + libssh2_agent_init: init ->fd to LIBSSH2_INVALID_SOCKET + + ... previously it was left at 0 which is a valid file descriptor! + + Bug: https://trac.libssh2.org/ticket/265 + + Fixes #265 + +- userauth_password: pass on the underlying error code + + _libssh2_packet_requirev() may return different errors and we pass that + to the parent instead of rewriting it. + + Bug: http://libssh2.org/mail/libssh2-devel-archive-2013-04/0029.shtml + Reported by: Cosmin + +Peter Stuge (9 May 2013) +- [Marc Hoersken brought this change] + + libcrypt.c: Fix typo in _libssh2_rsa_sha1_sign() parameter type + +Kamil Dudka (4 May 2013) +- configure.ac: replace AM_CONFIG_HEADER with AC_CONFIG_HEADERS + + Reported by: Quintus + Bug: https://trac.libssh2.org/ticket/261 + +Guenter Knauf (12 Apr 2013) +- Fixed copyright string for NetWare build. + +Daniel Stenberg (9 Apr 2013) +- [Richard W.M. Jones brought this change] + + sftp: Add support for fsync (OpenSSH extension). + + The new libssh2_sftp_fsync API causes data and metadata in the + currently open file to be committed to disk at the server. - It seemed to occur due to the excessive line length + This is an OpenSSH extension to the SFTP protocol. See: + + https://bugzilla.mindrot.org/show_bug.cgi?id=1798 -- [Mikhail Gusarov brought this change] +- [Richard W.M. Jones brought this change] - Add missing .gitignore entries + sftp: statvfs: Along error path, reset the correct 'state' variable. -- [Mikhail Gusarov brought this change] +- [Richard W.M. Jones brought this change] - Add manpage syntax checker to 'check' target + sftp: seek: Don't flush buffers on same offset - In virtually every libssh2 release Debian's lintian catches syntax errors in - manpages. Prevent it by checking manpages as a part of testsuite. + Signed-off-by: Richard W.M. Jones -- libssh2_banner_set.3: fix nroff syntax mistake +Guenter Knauf (9 Feb 2013) +- Updated dependency libs. -Guenter Knauf (10 Sep 2011) -- Use predefined resource compiler macro. +- Fixed tool macro names. -- Added casts to silent compiler warnings. +Daniel Stenberg (29 Nov 2012) +- [Seth Willits brought this change] -- Fixed uint64_t printf. + compiler warnings: typecast strlen in macros + + ... in macro parameters to avoid compiler warnings about lost precision. + + Several macros in libssh2.h call strlen and pass the result directly to + unsigned int parameters of other functions, which warns about precision + loss because strlen returns size_t which is unsigned long on at least + some platforms (such as OS X). The fix is to simply typecast the + strlen() result to unsigned int. -- Fixed macro function signatures. +- libssh2.h: bump version to 1.4.4-DEV -- NetWare makefile tweaks. +Version 1.4.3 (27 Nov 2012) -- Removed unused var. +Daniel Stenberg (27 Nov 2012) +- RELEASE-NOTES: fixed for 1.4.3 -- Added 2 samples not mentioned. +- sftp_read: return error if a too large package arrives -- Dont build x11 sample with MinGW. +Peter Stuge (13 Nov 2012) +- Only define _libssh2_dsa_*() functions when building with DSA support -- Fixed executable file description. +Guenter Knauf (8 Nov 2012) +- Added .def file to output. -- Removed unused var. +Kamil Dudka (1 Nov 2012) +- libssh2_hostkey_hash.3: update the description of return value + + The function returns NULL also if the hash algorithm is not available. -- Kill stupid gcc 3.x uninitialized warning. +Guenter Knauf (24 Oct 2012) +- Fixed mode acciedently committed. -- Build all examples. +- Ignore generated file. -- More MinGW makefile tweaks. +- Added hack to make use of Makefile.inc. - Renamed *.mingw makefiles to GNUmakefile since GNU make picks these - up automatically, and therefore win32/Makefile removed. + This should avoid further maintainance of the objects list. -- Removed forgotten WINSOCK_VERSION defines. +- Fixed MSVC NMakefile. + + Added missing source files; added resource for DLL. -Daniel Stenberg (9 Sep 2011) -- libssh2_session_startup(3) => libssh2_session_handshake(3) +Kamil Dudka (22 Oct 2012) +- examples: use stderr for messages, stdout for data - Propagate for the current function in docs and examples. - libssh2_session_startup() is deprecated. + Reported by: Karel Srot + Bug: https://bugzilla.redhat.com/867462 -- libssh2_banner_set => libssh2_session_banner_get +- openssl: do not leak memory when handling errors - Marked the old function as deprecated. Added the new name in the correct - name space with the same arguments and functionality. + ,.. in aes_ctr_init(). Detected by Coverity. -- new function: libssh2_session_banner_get +- channel: fix possible NULL dereference - Returns the banner from the server handshake + ... in libssh2_channel_get_exit_signal(). Detected by Coverity. + +- Revert "aes: the init function fails when OpenSSL has AES support" - Fixes #226 + This partially reverts commit f4f2298ef3635acd031cc2ee0e71026cdcda5864. + + We need to use the EVP_aes_???_ctr() functions in FIPS mode. -- libssh2.h: bump version to 1.4.0 for new function(s) +- crypt: use hard-wired cipher block sizes consistently -- remove embedded CVS/svn tags +- openssl: do not ignore failure of EVP_CipherInit() -- [liuzl brought this change] +- kex: do not ignore failure of libssh2_md5_init() + + The MD5 algorithm is disabled when running in FIPS mode. - API add:libssh2_sftp_get_channel +Daniel Stenberg (21 Aug 2012) +- [Peter Krempa brought this change] + + known_hosts: Fail when parsing unknown keys in known_hosts file. - Return the channel of sftp, then caller can - control the channel's behavior. + libssh2_knownhost_readfile() silently ignored problems when reading keys + in unsupported formats from the known hosts file. When the file is + written again from the internal structures of libssh2 it gets truntcated + to the point where the first unknown key was located. - Signed-off-by: liuzl + * src/knownhost.c:libssh2_knownhost_readfile() - return error if key + parsing fails -- _libssh2_channel_read: react on errors from receive_window_adjust +- AUTHORS: synced with 42fec44c8a4 - Previously the function would ignore all errors except for EAGAIN. + 31 recent authors added -- sftp_read: extend and clarify the documentation +- [Dave Hayden brought this change] -- sftp_read: cap the read ahead maximum amount + compression: add support for zlib@openssh.com - Now we only go up to LIBSSH2_CHANNEL_WINDOW_DEFAULT*30 bytes SFTP read - ahead, which currently equals 64K*30 == 1966080 bytes. + Add a "use_in_auth" flag to the LIBSSH2_COMP_METHOD struct and a + separate "zlib@openssh.com" method, along with checking session->state + for LIBSSH2_STATE_AUTHENTICATED. Appears to work on the OpenSSH servers + I've tried against, and it should work as before with normal zlib + compression. -- _libssh2_channel_read: fix non-blocking window adjusting +- [Dmitry Smirnov brought this change] + + configure: gcrypt doesn't come with pkg-config support - If EAGAIN is returned when adjusting the receive window, we must not - read from the transport directly until we've finished the adjusting. + ... so use plain old -lgcrypt to the linker to link with it. + + Fixes #225 -Guenter Knauf (8 Sep 2011) -- Fix for systems which need sys/select.h. +- sftp_read: Value stored to 'next' is never read + + Detected by clang-analyzer -- The files were not gone but renamed ... +- publickey_init: errors are negative, fix check + + Detected by clang-analyzer. -Daniel Stenberg (6 Sep 2011) -- sftp_read: added documenting comment +- [Maxime Larocque brought this change] + + session_free: wrong variable used for keeping state - Taken from some recent email conversations I added some descriptions of - the logic in sftp_read() to aid readers. + If libssh2_session_free is called without the channel being freed + previously by libssh2_channel_free a memory leak could occur. + + A mismatch of states variables in session_free() prevent the call to + libssh2_channel_free function. session->state member is used instead of + session->free_state. + + It causes a leak of around 600 bytes on every connection on my systems + (Linux, x64 and PPC). + + (Debugging done under contract for Accedian Networks) + + Fixes #246 -- 1.3.1: start the work +Guenter Knauf (29 Jun 2012) +- Small NetWare makefile tweak. -Version 1.3.0 (6 Sep 2011) +- Some small Win32 makefile fixes. -Daniel Stenberg (6 Sep 2011) -- Makefile.am: the Makefile.win32 files are gone +Daniel Stenberg (19 Jun 2012) +- libssh2_userauth_publickey_fromfile_ex.3: mention publickey == NULL -- RELEASE-NOTES: updated for 1.3.0 +- comp_method_zlib_decomp: handle Z_BUF_ERROR when inflating + + When using libssh2 to perform an SFTP file transfer from the "JSCAPE MFT + Server" (http://www.jscape.com) the transfer failed. The default JSCAPE + configuration is to enforce zlib compression on SSH2 sessions so the + session was compressed. The relevant part of the debug trace contained: + + [libssh2] 1.052750 Transport: unhandled zlib error -5 + [libssh2] 1.052750 Failure Event: -29 - decompression failure + + The trace comes from comp_method_zlib_decomp() in comp.c. The "unhandled + zlib error -5" is the status returned from the zlib function + inflate(). The -5 status corresponds to "Z_BUF_ERROR". + + The inflate() function takes a pointer to a z_stream structure and + "inflates" (decompresses) as much as it can. The relevant fields of the + z_stream structure are: + + next_in - pointer to the input buffer containing compressed data + avail_in - the number of bytes available at next_in + next_out - pointer to the output buffer to be filled with uncompressed + data + avail_out - how much space available at next_out + + To decompress data you set up a z_stream struct with the relevant fields + filled in and pass it to inflate(). On return the fields will have been + updated so next_in and avail_in show how much compressed data is yet to + be processed and next_out and avail_out show how much space is left in + the output buffer. + + If the supplied output buffer is too small then on return there will be + compressed data yet to be processed (avail_in != 0) and inflate() will + return Z_OK. In this case the output buffer must be grown, avail_out + updated and inflate() called again. + + If the supplied output buffer was big enough then on return the + compressed data will have been exhausted (avail_in == 0) and inflate() + will return Z_OK, so the data has all been uncompressed. + + There is a corner case where inflate() makes no progress. That is, there + may be unprocessed compressed data and space available in the output + buffer and yet the function does nothing. In this case inflate() will + return Z_BUF_ERROR. From the zlib documentation and the source code it + is not clear under what circumstances this happens. It could be that it + needs to write multiple bytes (all in one go) from its internal state to + the output buffer before processing the next chunk of input but but + can't because there is not enough space (though my guesses as to the + cause are not really relevant). Recovery from Z_BUF_ERROR is pretty + simple - just grow the output buffer, update avail_out and call + inflate() again. + + The comp_method_zlib_decomp() function does not handle the case when + inflate() returns Z_BUF_ERROR. It treats it as a non-recoverable error + and basically aborts the session. + + Fixes #240 + +Guenter Knauf (12 Jun 2012) +- MinGW makefile tweaks. + + Use GNU tools when compiling on Linux. + Fixed dist and dev targets. + +- NetWare makefile tweaks. + + Changed to use Windows commandline tools instead of + GNU tools when compiling on Windows. Fixed dist and + dev targets. Enabled nlmconv error for unresolved + symbols. + +Daniel Stenberg (11 Jun 2012) +- Revert "config.rpath: generated file, no need to keep in git" + + This reverts commit 1ac7bd09cc685755577fb2c8829adcd081e7ab3c. + + This file still used by lib/*m4 functions so we need to keep the file + around. + +- BINDINGS: added PySsh2, a Python-ctypes binding + +Guenter Knauf (8 Jun 2012) +- Fixed MinGW debug build. -- sftp_read: a short read is not end of file +Daniel Stenberg (5 Jun 2012) +- BINDINGS: Added the Cocoa/Objective-C one - A returned READ packet that is short will now only reduce the - offset. + ... and sorted the bindings after the languages, alphabetically - This is a temporary fix as it is slightly better than the previous - approach but still not very good. + Reported by: Mike Abdullah -- [liuzl brought this change] +- BINDINGS: document the bindings we know of - _libssh2_packet_add: adjust window size when truncating +Guenter Knauf (4 Jun 2012) +- Fixed LIBSSH2_INT64_T_FORMAT macro. - When receiving more data than what the window size allows on a - particular channel, make sure that the window size is adjusted in that - case too. Previously it would only adjust the window in the non-error - case. + Usually a format macro should hold the whole format, otherwise + it should be named a prefix. Also fixed usage of this macro in + scp.c for a signed var where it was used as prefix for unsigned. -Guenter Knauf (29 Aug 2011) -- Silent compiler warning with MinGW64. +- Removed obsolete define from makefiles. -- Fixed link to native Win32 awk tool. +- Renamed NetWare makefiles. -- Renamed MinGW makefiles. +- Renamed NetWare makefiles. -- Some MinGW makefile tweaks. +- Synced MinGW makefiles with 56c64a6..39e438f. - Enable build without GNU tools and with MinGW64 compiler. - -- Fixed aes_ctr_do_cipher() signature. - -Daniel Stenberg (26 Aug 2011) -- [liuzl brought this change] + Also synced MinGW test makefile with b092696..f8cb874. - libssh2_sftp_seek64: flush packetlist and buffered data +Peter Stuge (30 May 2012) +- Revert "sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN" - When seeking to a new position, flush the packetlist and buffered data - to prevent already received or pending data to wrongly get used when - sftp-reading from the new offset within the file. + This reverts commit 04e79e0c798674a0796be8a55f63dd92e6877790. -- sftp_read: advance offset correctly for buffered copies - - In the case where a read packet has been received from the server, but - the entire contents couldn't be copied to the user-buffer, the data is - instead buffered and copied to the user's buffer in the next invocation - of sftp_read(). When that "extra" copy is made, the 'offset' pointer was - not advanced accordingly. +- sftp: Don't send attrs.permissions on read-only SSH_FXP_OPEN - The biggest impact of this flaw was that the 'already' variable at the - top of the function that figures out how much data "ahead" that has - already been asked for would slowly go more and more out of sync, which - could lead to the file not being read all the way to the end. + This works around a protocol violation in the ProFTPD 1.3.4 mod_sftp + server, as reported by Will Cosgrove in: - This problem was most noticable in cases where the application would - only try to read the exact file size amount, like curl does. In the - examples libssh2 provides the sftp read function is most often called - with a fixed size large buffer and then the bug would not appear as - easily. + http://libssh2.org/mail/libssh2-devel-archive-2012-05/0079.shtml - This bug was introduced in the SFTP rewrite in 1.2.8. + Based on a suggested fix by TJ Saunders in: - Bug: http://curl.haxx.se/mail/lib-2011-08/0305.html - http://www.libssh2.org/mail/libssh2-devel-archive-2011-08/0085.shtml - -- wrap some long lines < 80 columns - -- LIBSSH2_RECV: fix typo, use the RECV_FD macro - -- subsystem_netconf.c: fix compiler warnings - -- [Henrik Nordstrom brought this change] - - Custom callbacks for performing low level socket I/O - -- version bump: start working towards 1.3.0 + http://libssh2.org/mail/libssh2-devel-archive-2012-05/0104.shtml -Version 1.2.9 (16 Aug 2011) +Guenter Knauf (28 May 2012) +- Try to detect OpenSSL build type automatically. + + Also fixed recently added libgdi32 linkage which is only + required when OpenSSL libs are linked statically. -Daniel Stenberg (16 Aug 2011) -- RELEASE-NOTES: synced with 95d69d3a81261 +Daniel Stenberg (25 May 2012) +- config.rpath: generated file, no need to keep in git -- [Henrik Nordstrom brought this change] +Guenter Knauf (22 May 2012) +- Updated dependency libary versions. - Document prototypes for macro defined functions +Daniel Stenberg (18 May 2012) +- 1.4.3: towards the future -- [Henrik Nordstrom brought this change] +Version 1.4.2 (18 May 2012) - Avoid reuse after free when closing X11 channels +Daniel Stenberg (18 May 2012) +- RELEASE-NOTES: synced with 92a9f952794 -- _libssh2_channel_write: handle window_size == 0 better +Alexander Lamaison (15 May 2012) +- win32/libssh2_config.h: Remove hardcoded #define LIBSSH2_HAVE_ZLIB. - When about to send data on the channel and the window size is 0, we must - not just return 0 if the transport_read() function returned EAGAIN as it - then causes a busy-loop. + Rationale: Everything else in this file states a fact about the win32 + platform that is unconditional for that platform. There is nothing + unconditional about the presence of zlib. It is neither included with + Windows nor with the platform SDK. Therefore, this is not an appropriate + place to assert its presence. Especially as, once asserted, it cannot be + overridden using a compiler flag. - Bug: http://libssh2.org/mail/libssh2-devel-archive-2011-08/0011.shtml + In contrast, if it is omitted, then it can easily be reasserted by adding + a compiler flag defining LIBSSH2_HAVE_ZLIB. -- gettimeofday: fix name space pollution +Daniel Stenberg (14 May 2012) +- RELEASE-NOTES: synced with 69a3354467c + +- _libssh2_packet_add: SSH_MSG_CHANNEL_REQUEST default to want_reply - For systems without its own gettimeofday() implementation, we still must - not provide one outside our namespace. + RFC4254 says the default 'want_reply' is TRUE but the code defaulted to + FALSE. Now changed. - Reported by: Bill Segall - -Dan Fandrich (5 Aug 2011) -- libssh2.pc.in: Fixed spelling in pkgconfig file - -Peter Stuge (17 Jul 2011) -- example/subsystem_netconf.c: Add missing #include - -- example/subsystem_netconf.c: Discard ]]>]]> and return only XML response + Fixes #233 -- example/subsystem_netconf.c: Fix uninitialized variable bug +- gettimeofday: no need for a replacement under cygwin + + Fixes #224 -- example: Add subsystem_netconf.c +Alexander Lamaison (13 May 2012) +- Prevent sftp_packet_read accessing freed memory. - This example demonstrates how to use libssh2 to send a request to - the NETCONF subsystem available e.g. in JunOS. + sftp_packet_add takes ownership of the packet passed to it and (now that we + handle zombies) might free the packet. sftp_packet_read uses the packet type + byte as its return code but by this point sftp_packet_add might have freed + it. This change fixes the problem by caching the packet type before calling + sftp_packet_add. - See also http://tools.ietf.org/html/draft-ietf-netconf-ssh-06 - -Daniel Stenberg (16 Jul 2011) -- man page cleanups: non-existing functions need no man pages + I don't understand why sftp_packet_read uses the packet type as its return + code. A future change might get rid of this entirely. -- libssh2_new_host_entry.3: removed +Daniel Stenberg (12 May 2012) +- sftp_packet_flush: flush zombies too - This is just junk leftovers. + As this function is called when the SFTP session is closed, it needs to + also kill all zombies left in the SFTP session to avoid leaking memory + just in case some zombie would still be in there. -- userauth_keyboard_interactive: fix buffer overflow - - Partly reverse 566894494b4972ae12 which was simplifying the code far too - much and ended up overflowing a buffer within the LIBSSH2_SESSION - struct. Back to allocating the buffer properly like it used to do. +- sftp_packetlist_flush: zombies must not have responses already - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-06/0032.shtml - Reported by: Alfred Gebert - -- keyboard-interactive man page: cleaned up + When flushing the packetlist, we must only add the request as a zombie + if no response has already been received. Otherwise we could wrongly + make it a zombie even though the response was already received and then + we'd get a zombie stuck there "forever"... -- [Alfred Gebert brought this change] +- sftp_read: on EOF remove packet before flush + + Since the sftp_packetlist_flush() function will move all the existing + FXP_READ requests in this handle to the zombie list we must first remove + this just received packet as it is clearly not a zombie. - _libssh2_recv(): handle ENOENT error as EAGAIN +- sftp_packet_require: sftp_packet_read() returning 0 is not an error - A sftp session failed with error "failure establishing ssh session" on - Solaris and HP-UX. Sometimes the first recv() function call sets errno - to ENOENT. In the man pages for recv of Solaris and HP-UX the error - ENOENT is not documented. + Exactly as the comment in the code said, checking the return code from + sftp_packet_read() with <= was wrong and it should be < 0. With the new + filtering on incoming packets that are "zombies" we can now see this + getting zero returned. + +- sftp_packetlist_flush: only make it zombie if it was sent - I tested Solaris SPARC and x86, HP-UX i64, AIX, Windows and Linux. + The list of outgoing packets may also contain packets that never were + sent off and we better not make them zombies too. -- agent_list_identities: fix out of scope access +- [Alexander Lamaison brought this change] + + Mark outstanding read requests after EOF as zombies. - An auto variable out of scope was being referenced and used. + In order to be fast, sftp_read sends many read requests at once. With a small + file, this can mean that when EOF is received back, many of these requests are + still outstanding. Responses arriving after we close the file and abandon the + file handle are queued in the SFTP packet queue and never collected. This + causes transfer speed to drop as a progressively longer queue must be searched + for every packet. - fixes #220 + This change introduces a zombie request-ID list in the SFTP session that is + used to recognise these outstanding requests and prevent them being added to + the queue. -- _libssh2_wait_socket: fix timeouts for poll() uses +Peter Stuge (23 Apr 2012) +- [Rafael Kitover brought this change] -- windows: inclusion fix + Update win32/GNUmakefile to use OpenSSL 1.0.1a - include winsock2.h for all windows compilers + libcrypto on win32 now depends on gdi32.dll, so move the OpenSSL LDLIBS + block to before the compiler definitions, so that libcrypto gets added + first, and then add -lgdi32 into the following common LDLIBS for gcc. -- keyb-interactive: add the fixed buffer +Guenter Knauf (23 Apr 2012) +- Changed 'Requires' to 'Requires.private'. - Belongs to commit 5668944 + Only static builds need to link against the crypto libs. -- code cleanup: don't use C99/c++ comments +- Fixed 'Requires:' names. - We aim for C89 compliance + The 'Requires:' line lists the names of the .pc files. -- keyb-interactive: allow zero length fields +- Added 'Requires:' line to libssh2.pc. - Allow zero length fields so they don't cause malloc(0) calls + This is necessary so that other libs which lookup libssh2 info + via pkg-config can add the right crypto lib dependencies. + +- Updated dependency lib versions. + +Peter Stuge (18 Apr 2012) +- configure.ac: Add option to disable build of the example applications - Avoid free()ing NULL pointers + Examples are built by default. Any of the following options on the + configure command line will skip building them: - Avoid a malloc of a fixed 5 byte buffer. + --disable-examples-build + --enable-examples-build=no + --enable-examples-build=false -- libssh2_channel_process_startup.3: clean up +- userauth.c: fread() from public key file to correctly detect any errors + + If the filename parameter for file_read_publickey() was the name of a + directory instead of a file then libssh2 would spin trying to fgetc() + from the FILE * for the opened directory when trying to determine the + length of the encoded public key, since fgetc() can't report errors. - Remove the references to the macro-fied shortcuts as they have their own - individual man pages. + Use fread() instead to correctly detect this error condition along + with many others. - Made the prototype different and more readable. - -- man page: fix .BR lines + This fixes the problem reported in + http://www.libssh2.org/mail/libssh2-devel-archive-2012-04/0021.shtml - We don't use \fI etc on .BR lines + Reported-by: Oleksiy Zagorskyi -- userauth_keyboard_interactive: skip code on zero length auth +- Return LIBSSH2_ERROR_SOCKET_DISCONNECT on EOF when reading banner -- libssh2_channel_forward_accept.3: mention how to get error - - Since this returns a pointer, libssh2_session_last_errno() must be used - to get the actual error code and it wasn't that clear before. +Guenter Knauf (17 Apr 2012) +- Fixed copyright year. -- timeout docs: mention they're added in 1.2.9 +- Updated dependency lib versions in static makefiles. -- sftp_write_sliding.c: indent fix +Daniel Stenberg (6 Apr 2012) +- version: bump to 1.4.2 - Use the standard indenting and removed CVS leftover comment + We're on the 1.4.2 track now (at least) -- [zl liu brought this change] +Version 1.4.1 (4 Apr 2012) - sftp_write_sliding: send the complete file - - When reaching the end of file there can still be data left not sent. +Daniel Stenberg (4 Apr 2012) +- RELEASE-NOTES: updated for 1.4.1 release -- [Douglas Masterson brought this change] +- always do "forced" window updates + + When calling _libssh2_channel_receive_window_adjust() internally, we now + always use the 'force' option to prevent libssh2 to avoid sending the + update if the update isn't big enough. + + It isn't fully analyzed but we have seen corner cases which made a + necessary window update not get send due to this and then the other side + doesn't send data our side then sits waiting for forever. - session_startup: init state properly +- channel_read: force window adjusts! - libssh2_session_startup() didn't set the state correctly so it could get - confused. + if there's not enough room to receive the data that's being requested, + the window adjustment needs to be sent to the remote and thus the force + option has to be used. _libssh2_channel_receive_window_adjust() would + otherwise "queue" small window adjustments for a later packet but that + is really terribly for the small buffer read that for example is the + final little piece of a very large file as then there is no logical next + packet! - Fixes #218 + Reported by: Armen Babakhanian + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0130.shtml -- timeout: added man pages +- [Paul Howarth brought this change] -- BLOCK_ADJUST_ERRNO: move rc to right level + aes: the init function fails when OpenSSL has AES support - We can't declare the variable within the block and use it in the final - do-while() expression to be properly portable C89. + The internal init function only worked fine when the configure script + didn't detect the OpenSSL AES_CTR function! + + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0111.shtml + Reported by: Paul Howarth -- [Matt Lilley brought this change] +- [Matthew Booth brought this change] - adds a timeout to blocking calls + transport_send: Finish in-progress key exchange before sending data - Fixes bug #160 as per Daniel's suggestion + _libssh2_channel_write() first reads outstanding packets before writing + new data. If it reads a key exchange request, it will immediately start + key re-exchange, which will require sending a response. If the output + socket is full, this will result in a return from + _libssh2_transport_read() of LIBSSH2_ERROR_EAGAIN. In order not to block + a write because there is no data to read, this error is explicitly + ignored and the code continues marshalling a packet for sending. When it + is sent, the remote end immediately drops the connection because it was + expecting a continuation of the key exchange, but got a data packet. - Adds libssh2_session_set_timeout() and libssh2_session_get_timeout() + This change adds the same check for key exchange to + _libssh2_transport_send() that is in _libssh2_transport_read(). This + ensures that key exchange is completed before any data packet is sent. -- SCP: fix incorrect error code - - After an error occurs in libssh2_scp_recv() or libssh2_scp_send(), the - function libssh2_session_last_error() would return - LIBSSH2_ERROR_SOCKET_NONE on error. +- channel_write: acknowledge transport errors - Bug: http://trac.libssh2.org/ticket/216 - Patch by: "littlesavage" + When draining data off the socket with _libssh2_transport_read() (which + in turn has to be done so that we can be sure to have read any possible + window-increasing packets), this code previously ignored errors which + could lead to nasty loops. Now all error codes except EAGAIN will cause + the error to be returned at once. - Fixes #216 + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0068.shtml + Reported by: Matthew Booth -Guenter Knauf (19 Apr 2011) -- Updated default (recommended) dependency versions. +- [Steven Dake brought this change] -Daniel Stenberg (17 Apr 2011) -- libssh2_session_block_directions: fix mistake - - The last LIBSSH2_SESSION_BLOCK_INBOUND should be - LIBSSH2_SESSION_BLOCK_OUTBOUND + In examples/x11.c, Make sure sizeof passed to read operation is correct - And I shortened the short description + sizeof(buf) expands to 8 or 4 (since its a pointer). This variable may + have been static in the past, leading to this error. - Reported by: "drswinghead" + Signed-off-by: Steven Dake -- msvcproj: added libs and debug stuff - - Added libraries needed to link whether using openssl dynamically or - statically +- [Steven Dake brought this change] + + Fix suspicious sizeof usage in examples/x11.c - Added LIBSSH2DEBUG define to debug versions to enable tracing + In the x11 example, sizeof(buf) = 8UL (on x86_64), when this should + probably represent the buffer size available. I am not sure how to + test that this change is actually correct, however. - URL: http://trac.libssh2.org/ticket/215 - Patch by: Mark Smith + Signed-off-by: Steven Dake -- sftp_write: clean offsets on error +- sftp_packet_read: follow-up fix for EAGAIN/window adjust - When an error has occurred on FXP_WRITE, we must make sure that the - offset, sent offset and acked counter are reset properly. + The commit in 7194a9bd7ba45 wasn't complete. This change makes sure + variables are initialized properly before used in the EAGAIN and window + adjust cases. -- example/.gitignore: ignore built binaries +- sftp_packet_add: use named error code instead of number -- sftp_write: flush the packetlist on error +- sftp_packet_add: verify the packet before accepting it - When an error occurs during write, flush the entire list of pending - outgoing SFTP packets. + In order to bail out as quickly as possible when things are wrong and + out of sync, make sure the SFTP message is one we understand. -- keepalive: add first basic man pages +- SFTP: preserve the original error code more - Someone on IRC pointed out that we don't have these documented so I - wrote up a first set based on the information in the wiki: - http://trac.libssh2.org/wiki/KeepAlive + Lots of places in the code translated the original error into the more + generic LIBSSH2_ERROR_SOCKET_TIMEOUT but this turns out to distort the + original error reason a lot and makes tracking down the real origin of a + problem really hard. This change makes the original error code be + preserved to a larger extent when return up to the parent function. -- scp_write_nonblock.c: remove pointless check +- sftp_packet_read: adjust window size as necessary - libssh2_channel_write() cannot return a value that is larger than the - input length value + Commit 03ca9020756 tried to simplify the window sizing logic but broke + SFTP readdir as there was no window sizing code left there so large + directory listings no longer worked. + + This change introduces window sizing logic to the sftp_packet_read() + function so that it now tells the remote about the local size having a + window size that suffice when it is about to ask for directory data. + + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2012-03/0069.shtml + Reported by: Eric -Mikhail Gusarov (9 Apr 2011) -- s/\.NF/.nf/ to fix wrong macro name caught by man --warnings +- [Steven Dake brought this change] -Daniel Stenberg (6 Apr 2011) -- version: bump to 1.2.9_dev + Tell C compiler we don't care about return code of libssh2_init - Also update the copyright year range to include 2011 + The call of libssh2_init returns a return code, but nothing could be done + within the _libssh2_init_if_needed execution path. + + Signed-off-by: Steven Dake -- configure: fix $VERSION +- [Steven Dake brought this change] + + Add comment indicating a resource leak is not really a resource leak - Stop using the $VERSION variable as it seems to be magically used by - autoconfig itself and thus gets set to the value set in AC_INIT() - without us wanting that. $LIBSSH2VER is now the libssh2 version as - detected. + While possibly obvious to those investigating the code, coverity complains + about this out of scope leak. - Reported by: Paul Howarth - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-04/0008.shtml + Signed-off-by: Steven Dake -- maketgz: use git2news.pl by the correct name +- [Steven Dake brought this change] -Version 1.2.8 (4 Apr 2011) + Use safer snprintf rather then sprintf in scp_send() + + Signed-off-by: Steven Dake -Daniel Stenberg (4 Apr 2011) -- RELEASE-NOTES: synced with fabf1a45ee +- [Steven Dake brought this change] -- NEWS: auto-generated from git + Use safer snprintf rather then sprintf in scp_recv() - Starting now, the NEWS file is generated from git using the git2news.pl - script. This makes it always accurate and up-to-date, even for daily - snapshots etc. - -- sftp_write: handle FXP_WRITE errors + While the buffer is indeed allocated to a safe length, better safe then sorry. - When an sftp server returns an error back on write, make sure the - function bails out and returns the proper error. + Signed-off-by: Steven Dake -- configure: stop using the deprecated AM_INIT_AUTOMAKE syntax +- [Steven Dake brought this change] -Alexander Lamaison (13 Mar 2011) -- Support unlimited number of host names in a single line of the known_hosts file. + use snprintf in knownhost_writeline() rather then sprintf - Previously the code assumed either a single host name or a hostname,ip-address pair. However, according to the spec [1], there can be any number of comma separated host names or IP addresses. + Although the function checks the length, if the code was in error, there + could potentially be a buffer overrun with the use of sprintf. Instead replace + with snprintf. - [1] http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&sektion=8 + Signed-off-by: Steven Dake -Daniel Stenberg (26 Feb 2011) -- libssh2_knownhost_readfile.3: clarify return value - - This function returns the number of parsed hosts on success, not just - zero as previously documented. +- [Steven Dake brought this change] -Peter Stuge (26 Feb 2011) -- Don't save allocated packet size until it has actually been allocated + Add tracing to print packets left on session at libssh2_session_free - The allocated packet size is internal state which needs to match reality - in order to avoid problems. This commit fixes #211. - -Daniel Stenberg (21 Feb 2011) -- [Alfred Gebert brought this change] + Signed-off-by: Steven Dake - session_startup: manage server data before server identification - - Fix the bug that libssh2 could not connect if the sftp server - sends data before sending the version string. +Peter Stuge (2 Mar 2012) +- Define and use LIBSSH2_INVALID_SOCKET instead of INVALID_SOCKET - http://tools.ietf.org/html/rfc4253#section-4.2 + INVALID_SOCKET is a special value in Windows representing a + non-valid socket identifier. We were #defining this to -1 on + non-Windows platforms, causing unneccessary namespace pollution. + Let's have our own identifier instead. - "The server MAY send other lines of data before sending the version - string. Each line SHOULD be terminated by a Carriage Return and Line - Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded - in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients - MUST be able to process such lines." + Thanks to Matt Lawson for pointing this out. -- [Alfred Gebert brought this change] +- nw/Makefile.netware: Fix project name typo to avoid needless confusion - fullpacket: decompression only after init +- example/x11: Set raw terminal mode manually instead of with cfmakeraw() - The buffer for the decompression (remote.comp_abstract) is initialised - in time when it is needed. With this fix decompression is disabled when - the buffer (remote.comp_abstract) is not initialised. + OpenSolaris has no cfmakeraw() so to make the example more portable + we simply do the equivalent operations on struct termios ourselves. - Bug: http://trac.libssh2.org/ticket/200 + Thanks to Tom Weber for reporting this problem, and finding a solution. -- _libssh2_channel_read: store last error +Daniel Stenberg (17 Feb 2012) +- sftp_write: cannot return acked data *and* EAGAIN - When the transport layer returns EAGAIN this function didn't call - _libssh2_error() which made the last_error not get set. - -- sftp_write: clarified the comment header + Whenever we have acked data and is about to call a function that *MAY* + return EAGAIN we must return the number now and wait to get called + again. Our API only allows data *or* EAGAIN and we must never try to get + both. -- sftp_read: avoid wrapping counter to insanity - - As pointed out in bug #206, if a second invoke of libssh2_sftp_read() - would shrink the buffer size, libssh2 would go nuts and send out read - requests like crazy. This was due to an unsigned variable turning - "negative" by some wrong math, and that value would be the amount of - data attempt to pre-buffer! +Peter Stuge (13 Feb 2012) +- example/x11: Build only when sys/un.h is found by configure - Bug: http://trac.libssh2.org/ticket/206 + The example can't be built on systems without AF_UNIX sockets. -- sftp_packet_read: use 32bit variables for 32bit data +Daniel Stenberg (10 Feb 2012) +- [Alexander Lamaison brought this change] -- libssh2_sftp_stat_ex.3: cleaned up, extended + Simplified sftp_read. - Removed the macros from it as they have their own man pages. + Removed the total_read variable that originally must have tracked how + much data had been written to the buffer. With non-blocking reads, we + must return straight away once we have read data into the buffer so this + variable served not purpose. - Added the LIBSSH2_SFTP_ATTRIBUTES struct in here for easier reference. + I think it was still hanging around in case the initial processing of + 'leftover' data meant we wrote to the buffer but this case, like the + others, must return immediately. Now that it does, the last remaining + need for the variable is gone. -- sftp_readdir: return error if buffer is too small - - If asked to read data into a buffer and the buffer is too small to hold - the data, this function now returns an error instead of as previously - just copy as much as fits. +- [Alexander Lamaison brought this change] -- sftp_symlink: return error if receive buffer too small - - and clean up some variable type mismatches + Cleaned up sftp_read and added more explanation. - Discussion: http://www.libssh2.org/mail/libssh2-devel-archive-2011-01/0001.shtml + Replaced the gotos which were implementing the state machine with + a switch statement which makes the states more explicit. -- docs: clarify what happens with a too small buffer +- sftp_read: avoid data *and* EAGAIN - This flaw is subject to change, but I figured it might be valuable to - users of existing code to know how it works. + Whenever we have data and is about to call a function that *MAY* return + EAGAIN we must return the data now and wait to get called again. Our API + only allows data *or* EAGAIN and we must never try to get both. -- channel_request_pty_size: fix reqPTY_state - - The state variable isn't properly set so every other call to the - function fails! +Peter Stuge (2 Feb 2012) +- Add a tcpip-forward example which demonstrates remote port forwarding + +- libssh2.h: Add missing prototype for libssh2_session_banner_set() + +- example/subsystem_netconf.c: Return error when read buffer is too small - Bug: http://libssh2.org/mail/libssh2-devel-archive-2010-12/0096.shtml - Reported by: Steve Legg + Also remove a little redundancy in the read loop condition. -- data size: cleanup +- example/subsystem_netconf.c: Add a missing newline in an error message + +- Fix undefined reference to _libssh_error in libgcrypt backend - Fix 64bit warnings by using (s)size_t and dedicated uint32_t types more. + Commit 209de22299b4b58e582891dfba70f57e1e0492db introduced a function + call to a non-existing function, and since then the libgcrypt backend + has not been buildable. -- [Pierre Joye brought this change] +Version 1.4.0 (31 Jan 2012) - ssize_t: proper typedef with MSVC compilers +Daniel Stenberg (31 Jan 2012) +- RELEASE-NOTES: synced with 6bd584d29 for 1.4.0 + +- s/1.3.1/1.4.0 - As discussed on the mailing list, it was wrong for win64 and using the - VC-provided type is the safest approach instead of second- guessing - which one it should be. + We're bumping the minor number -Guenter Knauf (22 Dec 2010) -- Updated OpenSSL version. +- [Jernej Kovacic brought this change] -- Expanded tabs to spaces. + libssh2_session_supported_algs: fix compiler warning -Peter Stuge (21 Dec 2010) -- [Joey Degges brought this change] +- [Jernej Kovacic brought this change] - _libssh2_ntohu64: fix conversion from network bytes to uint64 + session_supported_algs docs: added an example + +- [Gellule Xg brought this change] + + sftp-seek: clear EOF flag - Cast individual bytes to uint64 to avoid overflow in arithmetic. + Set the EOF flag to False when calling seek64 to be able to get some + data back on a following read -Daniel Stenberg (20 Dec 2010) -- libssh2_userauth_list: language fix +- [Peter Krempa brought this change] + + userauth: Provide more informations if ssh pub key extraction fails - "faily" is not a good English word, and I also cleaned up some other minor - mistakes + If the function that extracts/computes the public key from a private key + fails the errors it reports were masked by the function calling it. This + patch modifies the key extraction function to return errors using + _libssh_error() function. The error messages are tweaked to contain + reference to the failed operaton in addition to the reason. + + * AUTHORS: - add my name + * libgcrypt.c: _libssh2_pub_priv_keyfile(): - return a more verbose + error using + _libssh2_error() func. + * openssl.c: - modify call graph of _libssh2_pub_priv_keyfile() to use + _libssh2_error for error reporting(); + * userauth.c: - tweak functions calling _libssh2_pub_priv_keyfile() not + to shadow error messages -- crypto: unify the generic functions +- TODO: remove issues we (sort of) did already + +- ssh2_exec: skip error outputs for EAGAIN - Added crypto.h that is the unified header to include when using crypto - functionality. It should be the only header that needs to adapt to the - underlying crypto library in use. It provides the set of prototypes that - are library agnostic. + Since the example uses non-blocking mode, it will just flood the output + with this "nonsense" error. -- [Mark Smith brought this change] +Guenter Knauf (30 Nov 2011) +- Some NetWare makefile tweaks. - userauth: derive publickey from private +Daniel Stenberg (18 Nov 2011) +- LIBSSH2_SFTP_PACKET_MAXLEN: increase to 80000 - Pass a NULL pointer for the publickey parameter of - libssh2_userauth_publickey_fromfile and - libssh2_userauth_hostbased_fromfile functions. In this case, the - functions recompute the public key from the private key file data. + Some SFTP servers send SFTP packets larger than 40000. Since the limit + is only present to avoid insane sizes anyway, we can easily bump it. - This is work done by Jean-Louis CHARTON - , then adapted by Mark Smith and - slightly edited further by me Daniel. + The define was formerly in the public header libssh2_sftp.h but served + no external purpose and was moved into the source dir. - WARNING: this does leave the feature NOT WORKING when libssh2 is built - to use libgcrypt instead of OpenSSL simply due to lack of - implementation. + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-11/0004.shtml + Reported by: Michael Harris -- ssh2_echo: Value stored to 'exitcode' is never read +Alexander Lamaison (18 Nov 2011) +- [Peter Krempa brought this change] -- _libssh2_packet_add: fix SSH_MSG_DEBUG weirdness + knownhost_check(): Don't dereference ext if NULL is passed - I believe I may have caused this weird typo style error when I cleaned - up this function a while ago. Corrected now. - -- uint32: more longs converted to proper types + Documentation for libssh2_knownhost_checkp() and related functions + states that the last argument is filled with data if non-NULL. - I also moved the MAC struct over to the mac.h header file and made sure - that the users of that struct include that file. - -- SFTP: more types to uint32_t + "knownhost if set to non-NULL, it must be a pointer to a 'struct + libssh2_knownhost' pointer that gets filled in to point to info about a + known host that matches or partially matches." - The 'num_names' field in the SSH_FXP_NAME response is an unsigned 32bit - value so we make sure to treat it like that. + In this function ext is dereferenced even if set to NULL, causing + segfault in applications not needing the extra data. -- SFTP: request_ids are uint32_t - - I went over the code and made sure we use uint32_t all over for the - request_id data. It is an unsigned 32bit value on the wire. +Daniel Stenberg (11 Nov 2011) +- [Peter Krempa brought this change] -- SFTP: store request_id separately in packets + knownhost_add: Avoid dereferencing uninitialized memory on error path. - By using a new separate struct for incoming SFTP packets and not sharing - the generic packet struct, we can get rid of an unused field and add a - new one dedicated for holding the request_id for the incoming - package. As sftp_packet_ask() is called fairly often, a "mere" integer - comparison is MUCH faster than the previous memcmp() of (typically) 5 - bytes. + In function knownhost_add, memory is alocated for a new entry. If normal + alocation is used, memory is not initialized to 0 right after, but a + check is done to verify if correct key type is passed. This test is done + BEFORE setting the memory to null, and on the error path function + free_host() is called, that tries to dereference unititialized memory, + resulting into a glibc abort(). + + * knownhost.c - knownhost_add(): - move typemask check before alloc -- libssh2_sftp_open_ex: man page extended and cleaned up +- windows build: add define to avoid compiler warning - I added the missing documentation for the 'flags' argument. + A recent mingw compiler has started to complain on "#warning Please + include winsock2.h before windows.h" unless the magic define is set + first. + + Reported by: Vincent Torri + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-10/0064.shtml -- SFTP: unify the READ/WRITE chunk structs +Henrik Nordstrom (31 Oct 2011) +- [Vincent Torri brought this change] -- SFTP: fix memory leaks + Correct Windows include file name case, simplifying cross-compilation - Make sure that we cleanup remainders when the handle is closed and when - the subsystem is shutdown. + When cross compiling to Windows, libssh2.h include Windows header files + with upper case filenames : BaseTsd.h and WinSock2.h. - Existing flaw: if a single handle sends packets that haven't been - replied to yet at the time when the handle is closed, those packets will - arrive later and end up in the generic packet brigade queue and they - will remain in there until flushed. They will use unnecessary memory, - make things slower and they will ruin the SFTP handling if the - request_id counter ever wraps (highly unlikely to every happen). + These files have lowercase names with mingw-w64 (iirc, it's the same with + mingw). And as on Windows, being lowercase or uppercase does not matter. -- sftp_close_handle: packet list is generic - - Fix comment, simplify the loop logic +Daniel Stenberg (25 Oct 2011) +- [Jernej Kovacic brought this change] -- sftp_read: pipeline reads - - The SFTP read function now does transfers the same way the SFTP write - function was made to recently: it creates a list of many outgoing - FXP_READ packets that each asks for a small data chunk. The code then - tries to keep sending read request while collecting the acks for the - previous requests and returns the received data. + libssh2_session_supported_algs: added -- sftp_write: removed unused variable +- [Kamil Dudka brought this change] -- _libssh2_channel_close: don't call transport read if disconnected - - The loop that waits for remote.close to get set may end up looping - forever since session->socket_state gets set to - LIBSSH2_SOCKET_DISCONNECTED by the packet_add() function called from the - transport_read() function and after having been set to - LIBSSH2_SOCKET_DISCONNECTED, the transport_read() function will only - return 0. + example/sftp_RW_nonblock: do not ignore LIBSSH2_ERROR_EAGAIN - Bug: http://trac.libssh2.org/ticket/198 + Bug: https://bugzilla.redhat.com/745420 -- libssh2_sftp_seek64: new man page +Peter Stuge (5 Oct 2011) +- example/ssh2_agent: Print host key fingerprint before authentication - Split off libssh2_sftp_seek64 from the libssh2_sftp_seek man page, and - mentioned that we consider the latter deprecated. Also added a mention - about the dangers of doing seek during writing or reading. + Also moves the comment about not being authenticated to before the + agent authentication takes place, so that it better matches the code. -- sftp_seek: fix - - The new SFTP write code caused a regression as the seek function no - longer worked as it didn't set the write position properly. +Daniel Stenberg (29 Sep 2011) +- OpenSSL EVP: fix threaded use of structs - It should be noted that seeking is STRONGLY PROHIBITED during upload, as - the upload magic uses two different offset positions and the multiple - outstanding packets etc make them sensitive to change in the midst of - operations. + Make sure we don't clear or reset static structs after first init so + that they work fine even when used from multiple threads. Init the + structs in the global init. - This functionality was just verified with the new example code - sftp_append. This bug was filed as bug #202: + Help and assistance by: John Engstrom - Bug: http://trac.libssh2.org/ticket/202 - -- sftp_append: new example doing SFTP append + Fixes #229 (again) -- MAX_SFTP_OUTGOING_SIZE: 30000 +- openssl: don't init static structs differently - I ran SFTP upload tests against localhost. It showed that to make the - app reach really good speeds, I needed to do a little code tweak and - change MAX_SFTP_OUTGOING_SIZE from 4000 to 30000. The tests I did before - with the high latency tests didn't show any real difference whatever I - had that size set to. + make_ctr_evp() is changed to take a struct pointer, and then each + _libssh2_EVP_aes_[keylen]_ctr function is made to pass in their own + static struct - This number is the size in bytes that libssh2 cuts off the large input - buffer and sends off as an individual sftp packet. + Reported by: John Engstrom + Fixes #229 -- sftp_write_sliding.c: new example - - This is an example that is very similar to sftp_write_nonblock.c, with - the exception that this uses - - 1 - a larger upload buffer +Guenter Knauf (27 Sep 2011) +- Removed obsolete include path. + +Daniel Stenberg (21 Sep 2011) +- read_state: clear the state variable better - 2 - a sliding buffer mechnism to allow the app to keep sending lots of - data to libssh2 without having to first drain the buffer. + Set read_state back to idle before trying to send anything so that if + the state somehow is wrongly set. - These are two key issues to make libssh2 SFTP uploads really perform - well at this point in time. + Also, avoid such a case of confusion by resetting the read_state when an + sftp handle is closed. -- cpp: s/#elsif/#elif +- sftp_read: remove leftover fprintf - This looks like a typo as #elsif is not really C... + Reported by: Alexander Lamaison -- _libssh2_channel_write: revert channel_write() use +- sftp.h: fix the #ifdef to prevent multiple inclusions + +- sftp_read: use a state variable to avoid bad writes - The attempts made to have _libssh2_channel_write() accept larger pieces - of data and split up the data by itself into 32700 byte chunks and pass - them on to channel_write() in a loop as a way to do faster operations on - larger data blocks was a failed attempt. + When a channel_write call has gotten an EAGAIN back, we try harder to + continue the same write in the subsequent invoke. + +- window_size: explicit adjustments only - The reason why it is difficult: + Removed the automatic window_size adjustments from + _libssh2_channel_read() and instead all channel readers must now make + sure to enlarge the window sizes properly themselves. - The API only allows EAGAIN or a length to be returned. When looping over - multiple blocks to get sent, one block can get sent and the next might - not. And yet: when transport_send() has returned EAGAIN we must not call - it again with new data until it has returned OK on the existing data it - is still working on. This makes it a mess and we do get a much easier - job by simply returning the bytes or EAGAIN at once, as in the EAGAIN - case we can assume that we will be called with the same arguments again - and transport_send() will be happy. + libssh2_channel_read_ex() - the public function, now grows the window + size according to the requested buffer size. Applications can still opt + to grow the window more on demand. Larger windows tend to give higher + performance. - Unfortunately, I think we take a small performance hit by not being able - to do this. + sftp_read() now uses the read-ahead logic to figure out a window_size. -- ssh2_echo: new example - - This is a new example snippet. The code is largely based on ssh2_exec, - and is written by Tommy Lindgren. I edited it into C90 compliance and to - conform to libssh2 indent style and some more. +- libssh2.h: bump the default window size to 256K -- send_existing: return after send_existing - - When a piece of data is sent from the send_existing() function we must - make the parent function return afterwards. Otherwise we risk that the - parent function tries to send more data and ends up getting an EGAIN for - that more data and since it can only return one return code it doesn't - return info for the successfully sent data. +- libssh2_userauth_keyboard_interactive.3: fix man warning - As this change is a regression I now added a larger comment explaining - why it has to work like this. + It seemed to occur due to the excessive line length -- _libssh2_channel_write: count resent data as written +- [Mikhail Gusarov brought this change] + + Add missing .gitignore entries + +- [Mikhail Gusarov brought this change] + + Add manpage syntax checker to 'check' target - In the logic that resends data that was kept for that purpose due to a - previous EAGAIN, the data was not counted as sent causing badness. + In virtually every libssh2 release Debian's lintian catches syntax errors in + manpages. Prevent it by checking manpages as a part of testsuite. -Peter Stuge (13 Nov 2010) -- Use fprintf(stderr, ) instead of write(2, ) for debugging +- libssh2_banner_set.3: fix nroff syntax mistake -- session/transport: Correctly handle when _libssh2_send() returns -EAGAIN +Guenter Knauf (10 Sep 2011) +- Use predefined resource compiler macro. -- src/agent.c: Simplify _libssh2_send() error checking ever so slightly +- Added casts to silent compiler warnings. -Daniel Stenberg (12 Nov 2010) -- send/recv: use _libssh2_recv and _libssh2_send now +- Fixed uint64_t printf. + +- Fixed macro function signatures. + +- NetWare makefile tweaks. + +- Removed unused var. + +- Added 2 samples not mentioned. + +- Dont build x11 sample with MinGW. + +- Fixed executable file description. + +- Removed unused var. + +- Kill stupid gcc 3.x uninitialized warning. + +- Build all examples. + +- More MinGW makefile tweaks. - Starting now, we unconditionally use the internal replacement functions - for send() and recv() - creatively named _libssh2_recv() and - _libssh2_send(). + Renamed *.mingw makefiles to GNUmakefile since GNU make picks these + up automatically, and therefore win32/Makefile removed. + +- Removed forgotten WINSOCK_VERSION defines. + +Daniel Stenberg (9 Sep 2011) +- libssh2_session_startup(3) => libssh2_session_handshake(3) - On errors, these functions return the negative 'errno' value instead of - the traditional -1. This design allows systems that have no "natural" - errno support to not have to invent it. It also means that no code - outside of these two transfer functions should use the errno variable. + Propagate for the current function in docs and examples. + libssh2_session_startup() is deprecated. -- channel_write: move some logic to _libssh2_channel_write +- libssh2_banner_set => libssh2_session_banner_get - Some checks are better done in _libssh2_channel_write just once per - write instead of in channel_write() since the looping will call the - latter function multiple times per _libssh2_channel_write() invoke. + Marked the old function as deprecated. Added the new name in the correct + name space with the same arguments and functionality. -- sftp_write: handle "left over" acked data +- new function: libssh2_session_banner_get - The SFTP handle struct now buffers number of acked bytes that haven't - yet been returned. The way this is used is as following: + Returns the banner from the server handshake - 1. sftp_write() gets called with a buffer of let say size 32000. We - split 32000 into 8 smaller packets and send them off one by one. One of - them gets acked before the function returns so 4000 is returned. + Fixes #226 + +- libssh2.h: bump version to 1.4.0 for new function(s) + +- remove embedded CVS/svn tags + +- [liuzl brought this change] + + API add:libssh2_sftp_get_channel - 2. sftp_write() gets called again a short while after the previous one, - now with a much smaller size passed in to the function. Lets say 8000. - In the mean-time, all of the remaining packets from the previous call - have been acked (7*4000 = 28000). This function then returns 8000 as all - data passed in are already sent and it can't return any more than what - it got passed in. But we have 28000 bytes acked. We now store the - remaining 20000 in the handle->u.file.acked struct field to add up in - the next call. + Return the channel of sftp, then caller can + control the channel's behavior. - 3. sftp_write() gets called again, and now there's a backlogged 20000 - bytes to return as fine and that will get skipped from the beginning - of the buffer that is passed in. + Signed-off-by: liuzl -- sftp_write: polished and simplified +- _libssh2_channel_read: react on errors from receive_window_adjust - Removed unnecessary struct fields and state changes within the function. + Previously the function would ignore all errors except for EAGAIN. + +- sftp_read: extend and clarify the documentation + +- sftp_read: cap the read ahead maximum amount - Made the loop that checks for ACKs only check chunks that were fully - sent. + Now we only go up to LIBSSH2_CHANNEL_WINDOW_DEFAULT*30 bytes SFTP read + ahead, which currently equals 64K*30 == 1966080 bytes. -- SCP: on failure, show the numerical error reason +- _libssh2_channel_read: fix non-blocking window adjusting - By calling libssh2_session_last_errno() + If EAGAIN is returned when adjusting the receive window, we must not + read from the transport directly until we've finished the adjusting. + +Guenter Knauf (8 Sep 2011) +- Fix for systems which need sys/select.h. + +- The files were not gone but renamed ... + +Daniel Stenberg (6 Sep 2011) +- sftp_read: added documenting comment + + Taken from some recent email conversations I added some descriptions of + the logic in sftp_read() to aid readers. + +- 1.3.1: start the work + +Version 1.3.0 (6 Sep 2011) + +Daniel Stenberg (6 Sep 2011) +- Makefile.am: the Makefile.win32 files are gone -- SFTP: provide the numerical error reason on failure +- RELEASE-NOTES: updated for 1.3.0 -- SCP: clean up failure treatment +- sftp_read: a short read is not end of file - When SCP send or recv fails, it gets a special message from the server - with a warning or error message included. We have no current API to - expose that message but the foundation is there. Removed unnecessary use - of session struct fields. + A returned READ packet that is short will now only reduce the + offset. + + This is a temporary fix as it is slightly better than the previous + approach but still not very good. -- sftp_write: enlarge buffer to perform better +- [liuzl brought this change] -- packets: code cleanup - - I added size checks in several places. I fixed the code flow to be easier - to read in some places. + _libssh2_packet_add: adjust window size when truncating - I removed unnecessary zeroing of structs. I removed unused struct fields. - -- LIBSSH2_CALLBACK_MACERROR: clarify return code use + When receiving more data than what the window size allows on a + particular channel, make sure that the window size is adjusted in that + case too. Previously it would only adjust the window in the non-error + case. -- _libssh2_userauth_publickey: avoid shadowing +Guenter Knauf (29 Aug 2011) +- Silent compiler warning with MinGW64. -- packet: avoid shadowing global symbols +- Fixed link to native Win32 awk tool. -- sftp_readdir: avoid shadowing +- Renamed MinGW makefiles. -- shadowing: don't shadow the global compress +- Some MinGW makefile tweaks. + + Enable build without GNU tools and with MinGW64 compiler. -- _libssh2_packet_add: turn ifs into a single switch +- Fixed aes_ctr_do_cipher() signature. -- _libssh2_packet_add: check SSH_MSG_GLOBAL_REQUEST packet +Daniel Stenberg (26 Aug 2011) +- [liuzl brought this change] -- _libssh2_packet_add: SSH_MSG_DEBUG length checks + libssh2_sftp_seek64: flush packetlist and buffered data - Verify lengths before using them. Read always_display from the correct - index. Don't copy stuff around just to provide zero-termination of the - strings. + When seeking to a new position, flush the packetlist and buffered data + to prevent already received or pending data to wrongly get used when + sftp-reading from the new offset within the file. -- _libssh2_packet_add: SSH_MSG_IGNORE skip memmove +- sftp_read: advance offset correctly for buffered copies - There's no promise of a zero termination of the data in the callback so - no longer perform ugly operation in order to provide it. - -- _libssh2_packet_add: SSH_MSG_DISCONNECT length checks + In the case where a read packet has been received from the server, but + the entire contents couldn't be copied to the user-buffer, the data is + instead buffered and copied to the user's buffer in the next invocation + of sftp_read(). When that "extra" copy is made, the 'offset' pointer was + not advanced accordingly. - Verify lengths before trying to read data. + The biggest impact of this flaw was that the 'already' variable at the + top of the function that figures out how much data "ahead" that has + already been asked for would slowly go more and more out of sync, which + could lead to the file not being read all the way to the end. + + This problem was most noticable in cases where the application would + only try to read the exact file size amount, like curl does. In the + examples libssh2 provides the sftp read function is most often called + with a fixed size large buffer and then the bug would not appear as + easily. + + This bug was introduced in the SFTP rewrite in 1.2.8. + + Bug: http://curl.haxx.se/mail/lib-2011-08/0305.html + http://www.libssh2.org/mail/libssh2-devel-archive-2011-08/0085.shtml -- indent: break lines at 80 columns +- wrap some long lines < 80 columns -- SSH_MSG_CHANNEL_OPEN_FAILURE: used defined values - - We don't like magic numbers in the code. Now the acceptable failure - codes sent in the SSH_MSG_CHANNEL_OPEN_FAILURE message are added as - defined values in the private header file. +- LIBSSH2_RECV: fix typo, use the RECV_FD macro -- sftp_write: don't return EAGAIN if no EAGAIN was received - - This function now only returns EAGAIN if a lower layer actually returned - EAGAIN to it. If nothing was acked and no EAGAIN was received, it will - now instead return 0. +- subsystem_netconf.c: fix compiler warnings -- _libssh2_wait_socket: detect nothing-to-wait-for - - If _libssh2_wait_socket() gets called but there's no direction set to - wait for, this causes a "hang". This code now detects this situation, - set a 1 second timeout instead and outputs a debug output about it. +- [Henrik Nordstrom brought this change] -- decomp: remove the free_dest argument - - Since the decompress function ALWAYS returns allocated memory we get a - lot simpler code by removing the ability to return data unallocated. + Custom callbacks for performing low level socket I/O -- decomp: cleaned off old compression stuff - - I cleared off legacy code from when the compression and decompression - functions were a single unified function. Makes the code easier to read - too. +- version bump: start working towards 1.3.0 -- [TJ Saunders brought this change] +Version 1.2.9 (16 Aug 2011) - decomp: increase decompression buffer sizes +Daniel Stenberg (16 Aug 2011) +- RELEASE-NOTES: synced with 95d69d3a81261 -- [TJ Saunders brought this change] +- [Henrik Nordstrom brought this change] - zlib: Add debug tracing of zlib errors + Document prototypes for macro defined functions -- sftp_packet_read: handle partial reads of the length field - - SFTP packets come as [32 bit length][payload] and the code didn't - previously handle that the initial 32 bit field was read only partially - when it was read. +- [Henrik Nordstrom brought this change] -- [Jasmeet Bagga brought this change] + Avoid reuse after free when closing X11 channels - kex_agree_hostkey: fix NULL pointer derefence +- _libssh2_channel_write: handle window_size == 0 better - While setting up the session, ssh tries to determine the type of - encryption method it can use for the session. This requires looking at - the keys offered by the remote host and comparing these with the methods - supported by libssh2 (rsa & dss). To do this there is an iteration over - the array containing the methods supported by libssh2. + When about to send data on the channel and the window size is 0, we must + not just return 0 if the transport_read() function returned EAGAIN as it + then causes a busy-loop. - If there is no agreement on the type of encryption we come to the 3rd - entry of the hostkeyp array. Here hostkeyp is valid but *hostkep is - NULL. Thus when we dereference that in (*hostkeyp)->name there is a - crash + Bug: http://libssh2.org/mail/libssh2-devel-archive-2011-08/0011.shtml -- _libssh2_transport_send: remove dead assignment +- gettimeofday: fix name space pollution - 'data' isn't accessed beyond this point so there's no need to assign it. - -- scp_recv: remove dead assignment + For systems without its own gettimeofday() implementation, we still must + not provide one outside our namespace. - Instead of assigning a variable we won't read, we now use the more - explicit (void) prefix. - -- sftp_write: removed superfluous assignment + Reported by: Bill Segall -- bugfix: avoid use of uninitialized value +Dan Fandrich (5 Aug 2011) +- libssh2.pc.in: Fixed spelling in pkgconfig file -- sftp_packet_require: propagate error codes better - - There were some chances that they would cause -1 to get returned by - public functions and as we're hunting down all such occurances and since - the underlying functions do return valuable information the code now - passes back proper return codes better. +Peter Stuge (17 Jul 2011) +- example/subsystem_netconf.c: Add missing #include -- [Alfred Gebert brought this change] +- example/subsystem_netconf.c: Discard ]]>]]> and return only XML response - fix memory leaks (two times cipher_data) for each sftp session +- example/subsystem_netconf.c: Fix uninitialized variable bug -- libssh2_userauth_authenticated: make it work as documented - - The man page clearly says it returns 1 for "already authenticated" but - the code said non-zero. I changed the code to use 1 now, as that is also - non-zero but it gets the benefit that it now matches the documentation. +- example: Add subsystem_netconf.c - Using 1 instead of non-zero is better for two reasons: + This example demonstrates how to use libssh2 to send a request to + the NETCONF subsystem available e.g. in JunOS. - 1. We have the opportunity to introduce other return codes in the future for - things like error and what not. - 2. We don't expose the internal bitmask variable value. - -- userauth_keyboard_interactive: fix indent + See also http://tools.ietf.org/html/draft-ietf-netconf-ssh-06 -- [Alfred Gebert brought this change] +Daniel Stenberg (16 Jul 2011) +- man page cleanups: non-existing functions need no man pages - fix memory leak in userauth_keyboard_interactive() +- libssh2_new_host_entry.3: removed - First I wanted to free the memory in session_free() but then - I had still memory leaks because in my test case the function - userauth_keyboard_interactive() is called twice. It is called - twice perhaps because the server has this authentication - methods available: publickey,gssapi-with-mic,keyboard-interactive - The keyboard-interactive method is successful. - -- dist: include sftp.h in dist archives - -Simon Josefsson (27 Oct 2010) -- Update header to match new function prototype, see c48840ba88. - -Daniel Stenberg (26 Oct 2010) -- bugfixes: the transport rearrange left some subtle flaws now gone - -- libssh2_userauth_publickey_fromfile_ex.3: cleaned up looks + This is just junk leftovers. -- libssh2_userauth_publickey: add man page +- userauth_keyboard_interactive: fix buffer overflow - I found an undocumented public function and we can't have it like - that. The description here is incomplete, but should serve as a template - to allow filling in... - -- libssh2_sftp_write.3: added blurb about the "write ahead" + Partly reverse 566894494b4972ae12 which was simplifying the code far too + much and ended up overflowing a buffer within the LIBSSH2_SESSION + struct. Back to allocating the buffer properly like it used to do. - Documented the new SFTP write concept + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-06/0032.shtml + Reported by: Alfred Gebert -- sftp_close_handle: free any trailing write chunks +- keyboard-interactive man page: cleaned up -- _libssh2_channel_write: fix warnings +- [Alfred Gebert brought this change] -- SFTP: bufgix, move more sftp stuff to sftp.h + _libssh2_recv(): handle ENOENT error as EAGAIN - The sftp_write function shouldn't assume that the buffer pointer will be - the same in subsequent calls, even if it assumes that the data already - passed in before haven't changed. + A sftp session failed with error "failure establishing ssh session" on + Solaris and HP-UX. Sometimes the first recv() function call sets errno + to ENOENT. In the man pages for recv of Solaris and HP-UX the error + ENOENT is not documented. - The sftp structs are now moved to sftp.h (which I forgot to add before) + I tested Solaris SPARC and x86, HP-UX i64, AIX, Windows and Linux. -- SFTP: use multiple outgoing packets when writing +- agent_list_identities: fix out of scope access - sftp_write was rewritten to split up outgoing data into multiple packets - and deal with the acks in a more asynchronous manner. This is meant to - help overcome latency and round-trip problems with the SFTP protocol. + An auto variable out of scope was being referenced and used. + + fixes #220 -- TODO: implemented a lot of the ideas now +- _libssh2_wait_socket: fix timeouts for poll() uses -- _libssh2_channel_write: removed 32500 size limit +- windows: inclusion fix - Neither _libssh2_channel_write nor sftp_write now have the 32500 size - limit anymore and instead the channel writing function now has its own - logic to send data in multiple calls until everything is sent. + include winsock2.h for all windows compilers -- send_existing: don't tell parent to return when drained +- keyb-interactive: add the fixed buffer - That will just cause unnecessary code execution. + Belongs to commit 5668944 + +- code cleanup: don't use C99/c++ comments + + We aim for C89 compliance -- _libssh2_channel_write: general code cleanup +- keyb-interactive: allow zero length fields - simplified the function and removed some unused struct fields + Allow zero length fields so they don't cause malloc(0) calls + + Avoid free()ing NULL pointers + + Avoid a malloc of a fixed 5 byte buffer. -- _libssh2_transport_send: replaces _libssh2_transport_write +- libssh2_channel_process_startup.3: clean up - The new function takes two data areas, combines them and sends them as a - single SSH packet. This allows several functions to allocate and copy - less data. + Remove the references to the macro-fied shortcuts as they have their own + individual man pages. - I also found and fixed a mixed up use of the compression function - arguments that I introduced in my rewrite in a recent commit. + Made the prototype different and more readable. -- scp_write_nonblock: use select() instead of busyloop +- man page: fix .BR lines - Make this example nicer by not busylooping. + We don't use \fI etc on .BR lines -- send_existing: clear olen when the data is sent off +- userauth_keyboard_interactive: skip code on zero length auth -- _libssh2_transport_write: allow 256 extra bytes around the packet +- libssh2_channel_forward_accept.3: mention how to get error + + Since this returns a pointer, libssh2_session_last_errno() must be used + to get the actual error code and it wasn't that clear before. -- _libssh2_transport_write: remade to send without malloc +- timeout docs: mention they're added in 1.2.9 -- compress: compression disabled by default +- sftp_write_sliding.c: indent fix - We now allow libssh2_session_flag() to enable compression with a new - flag and I added documentation for the previous LIBSSH2_FLAG_SIGPIPE - flag which I wasn't really aware of! + Use the standard indenting and removed CVS leftover comment -- comp: split the compress function +- [zl liu brought this change] + + sftp_write_sliding: send the complete file - It is now made into two separate compress and decompress functions. In - preparation for upcoming further modficications. + When reaching the end of file there can still be data left not sent. -Dan Fandrich (20 Oct 2010) -- Added header file to allow compiling in older environments +- [Douglas Masterson brought this change] -Daniel Stenberg (20 Oct 2010) -- TODO: add a possible new API for SFTP transfers + session_startup: init state properly + + libssh2_session_startup() didn't set the state correctly so it could get + confused. + + Fixes #218 -- TODO: "New Transport API" added +- timeout: added man pages -- TODO: add buffering plans +- BLOCK_ADJUST_ERRNO: move rc to right level + + We can't declare the variable within the block and use it in the final + do-while() expression to be properly portable C89. -Simon Josefsson (13 Oct 2010) -- Mention libssh2_channel_get_exit_signal and give kudos. +- [Matt Lilley brought this change] -- [Tommy Lindgren brought this change] + adds a timeout to blocking calls + + Fixes bug #160 as per Daniel's suggestion + + Adds libssh2_session_set_timeout() and libssh2_session_get_timeout() - Add libssh2_channel_get_exit_signal man page. +- SCP: fix incorrect error code - Signed-off-by: Simon Josefsson + After an error occurs in libssh2_scp_recv() or libssh2_scp_send(), the + function libssh2_session_last_error() would return + LIBSSH2_ERROR_SOCKET_NONE on error. + + Bug: http://trac.libssh2.org/ticket/216 + Patch by: "littlesavage" + + Fixes #216 -- [Tommy Lindgren brought this change] +Guenter Knauf (19 Apr 2011) +- Updated default (recommended) dependency versions. - Add libssh2_channel_get_exit_signal. +Daniel Stenberg (17 Apr 2011) +- libssh2_session_block_directions: fix mistake - Signed-off-by: Simon Josefsson - -- Add libssh2_free man page and fix typo. + The last LIBSSH2_SESSION_BLOCK_INBOUND should be + LIBSSH2_SESSION_BLOCK_OUTBOUND + + And I shortened the short description + + Reported by: "drswinghead" -- Add libssh2_free. +- msvcproj: added libs and debug stuff + + Added libraries needed to link whether using openssl dynamically or + statically + + Added LIBSSH2DEBUG define to debug versions to enable tracing + + URL: http://trac.libssh2.org/ticket/215 + Patch by: Mark Smith -Daniel Stenberg (11 Oct 2010) -- scp_recv: improved treatment of channel_read() returning zero +- sftp_write: clean offsets on error - As a zero return code from channel_read() is not an error we must make - sure that the SCP functions deal with that properly. channel_read() - always returns 0 if the channel is EOFed already so we check for EOF - after 0-reads to be able to return error properly. + When an error has occurred on FXP_WRITE, we must make sure that the + offset, sent offset and acked counter are reset properly. -- libssh2_session_methods.3: detail what can be asked for +- example/.gitignore: ignore built binaries -- compression: send zlib before none +- sftp_write: flush the packetlist on error - As the list of algorithms in a preferred order we should send zlib - before none to increase the chances that the server will let us do - compression. + When an error occurs during write, flush the entire list of pending + outgoing SFTP packets. -- compress: faster check, better return codes - - In the transport functions we avoid a strcmp() now and just check a - boolean instead. +- keepalive: add first basic man pages - The compress/decompress function's return code is now acknowledged and - used as actual return code in case of failures. + Someone on IRC pointed out that we don't have these documented so I + wrote up a first set based on the information in the wiki: + http://trac.libssh2.org/wiki/KeepAlive -- libssh2_session_handshake: replaces libssh2_session_startup() +- scp_write_nonblock.c: remove pointless check - The function libssh2_session_startup() is now considered deprecated due - to the portability issue with the socket argument. - libssh2_session_handshake() is the name of the replacement. + libssh2_channel_write() cannot return a value that is larger than the + input length value -- libssh2_socket_t: now externally visible - - In preparation for upcominig changes, the libssh2_socket_t type is now - typedef'ed in the public header. +Mikhail Gusarov (9 Apr 2011) +- s/\.NF/.nf/ to fix wrong macro name caught by man --warnings -- _libssh2_transport_drain: removed +Daniel Stenberg (6 Apr 2011) +- version: bump to 1.2.9_dev - This function proved not to be used nor useful. + Also update the copyright year range to include 2011 -- _libssh2_channel_write: don't iterate over transport writes +- configure: fix $VERSION - When a call to _libssh2_transport_write() succeeds, we must return from - _libssh2_channel_write() to allow the caller to provide the next chunk - of data. + Stop using the $VERSION variable as it seems to be magically used by + autoconfig itself and thus gets set to the value set in AC_INIT() + without us wanting that. $LIBSSH2VER is now the libssh2 version as + detected. - We cannot move on to send the next piece of data that may already have - been provided in this same function call, as we risk getting EAGAIN for - that and we can't return information both about sent data as well as - EAGAIN. So, by returning short now, the caller will call this function - again with new data to send. + Reported by: Paul Howarth + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2011-04/0008.shtml -- _libssh2_transport_write: updated documentation blurb +- maketgz: use git2news.pl by the correct name -- _libssh2_transport_write: remove fprintf remainder - - Mistake from previous debugging +Version 1.2.8 (4 Apr 2011) -- session: improved errors +Daniel Stenberg (4 Apr 2011) +- RELEASE-NOTES: synced with fabf1a45ee + +- NEWS: auto-generated from git - Replaced -1/SOCKET_NONE errors with appropriate error defines instead. + Starting now, the NEWS file is generated from git using the git2news.pl + script. This makes it always accurate and up-to-date, even for daily + snapshots etc. + +- sftp_write: handle FXP_WRITE errors - Made the verbose trace output during banner receiving less annoying for - non-blocking sessions. + When an sftp server returns an error back on write, make sure the + function bails out and returns the proper error. -- crypt_init: use correct error define +- configure: stop using the deprecated AM_INIT_AUTOMAKE syntax -- _libssh2_error: hide EAGAIN for non-blocking sessions +Alexander Lamaison (13 Mar 2011) +- Support unlimited number of host names in a single line of the known_hosts file. - In an attempt to make the trace output less cluttered for non-blocking - sessions the error function now avoids calling the debug function if the - error is the EAGAIN and the session is non-blocking. - -- agent: use better error defines + Previously the code assumed either a single host name or a hostname,ip-address pair. However, according to the spec [1], there can be any number of comma separated host names or IP addresses. + + [1] http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&sektion=8 -- comp_method_zlib_init: use correct error defines +Daniel Stenberg (26 Feb 2011) +- libssh2_knownhost_readfile.3: clarify return value + + This function returns the number of parsed hosts on success, not just + zero as previously documented. -- transport: better error codes +Peter Stuge (26 Feb 2011) +- Don't save allocated packet size until it has actually been allocated - LIBSSH2_SOCKET_NONE (-1) should no longer be used as error code as it is - (too) generic and we should instead use specific and dedicated error - codes to better describe the error. + The allocated packet size is internal state which needs to match reality + in order to avoid problems. This commit fixes #211. -- channel: return code and _libssh2_error cleanup +Daniel Stenberg (21 Feb 2011) +- [Alfred Gebert brought this change] + + session_startup: manage server data before server identification - Made sure that all transport_write() call failures get _libssh2_error - called. + Fix the bug that libssh2 could not connect if the sftp server + sends data before sending the version string. + + http://tools.ietf.org/html/rfc4253#section-4.2 + + "The server MAY send other lines of data before sending the version + string. Each line SHOULD be terminated by a Carriage Return and Line + Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded + in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients + MUST be able to process such lines." -- _libssh2_channel_write: limit to 32700 bytes +- [Alfred Gebert brought this change] + + fullpacket: decompression only after init - The well known and used ssh server Dropbear has a maximum SSH packet - length at 32768 by default. Since the libssh2 design current have a - fixed one-to-one mapping from channel_write() to the packet size created - by transport_write() the previous limit of 32768 in the channel layer - caused the transport layer to create larger packets than 32768 at times - which Dropbear rejected forcibly (by closing the connection). + The buffer for the decompression (remote.comp_abstract) is initialised + in time when it is needed. With this fix decompression is disabled when + the buffer (remote.comp_abstract) is not initialised. - The long term fix is of course to remove the hard relation between the - outgoing SSH packet size and what the input length argument is in the - transport_write() function call. + Bug: http://trac.libssh2.org/ticket/200 + +- _libssh2_channel_read: store last error + + When the transport layer returns EAGAIN this function didn't call + _libssh2_error() which made the last_error not get set. -- libssh.h: add more dedicated error codes +- sftp_write: clarified the comment header -- SCP: allow file names with bytes > 126 +- sftp_read: avoid wrapping counter to insanity - When parsing the SCP protocol and verifying that the data looks like a - valid file name, byte values over 126 must not be consider illegal since - UTF-8 file names will use such codes. + As pointed out in bug #206, if a second invoke of libssh2_sftp_read() + would shrink the buffer size, libssh2 would go nuts and send out read + requests like crazy. This was due to an unsigned variable turning + "negative" by some wrong math, and that value would be the amount of + data attempt to pre-buffer! - Reported by: Uli Zappe - Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2010-08/0112.shtml - -Dan Fandrich (25 Aug 2010) -- Document the three sftp stat constants + Bug: http://trac.libssh2.org/ticket/206 -Guenter Knauf (18 Aug 2010) -- Fixed Win32 makefile which was now broken at resource build. +- sftp_packet_read: use 32bit variables for 32bit data -- It is sufficient to pipe stderr to NUL to get rid of the nasty messages. +- libssh2_sftp_stat_ex.3: cleaned up, extended + + Removed the macros from it as they have their own man pages. + + Added the LIBSSH2_SFTP_ATTRIBUTES struct in here for easier reference. -- [Author: Guenter Knauf brought this change] +- sftp_readdir: return error if buffer is too small + + If asked to read data into a buffer and the buffer is too small to hold + the data, this function now returns an error instead of as previously + just copy as much as fits. - Removed Win32 ifdef completely for sys/uio.h. +- sftp_symlink: return error if receive buffer too small - No idea why we had this ifdef at all but MSVC, MingW32, Watcom - and Borland all have no sys/uio.h header; so if there's another - Win32 compiler which needs it then it should be added explicitely - instead of this negative list. + and clean up some variable type mismatches + + Discussion: http://www.libssh2.org/mail/libssh2-devel-archive-2011-01/0001.shtml -- New files should also be added to Makefile.am. +- docs: clarify what happens with a too small buffer - Otherwise they will never be included with release and snapshot tarballs ... + This flaw is subject to change, but I figured it might be valuable to + users of existing code to know how it works. -Daniel Stenberg (18 Aug 2010) -- version: bump to 1.2.8_DEV +- channel_request_pty_size: fix reqPTY_state + + The state variable isn't properly set so every other call to the + function fails! + + Bug: http://libssh2.org/mail/libssh2-devel-archive-2010-12/0096.shtml + Reported by: Steve Legg -Version 1.2.7 (17 Aug 2010) +- data size: cleanup + + Fix 64bit warnings by using (s)size_t and dedicated uint32_t types more. -Daniel Stenberg (17 Aug 2010) -- release: updated to hold 1.2.7 info +- [Pierre Joye brought this change] -Guenter Knauf (17 Aug 2010) -- Use the new libssh2.rc file. + ssize_t: proper typedef with MSVC compilers + + As discussed on the mailing list, it was wrong for win64 and using the + VC-provided type is the safest approach instead of second- guessing + which one it should be. -- Added resource file for libssh2.dll (shamelessly stolen from libcurl). +Guenter Knauf (22 Dec 2010) +- Updated OpenSSL version. -- Updated Win32 MSVC dependencies versions. +- Expanded tabs to spaces. -- Added include for sys/select.h to get fd.set on some platforms. +Peter Stuge (21 Dec 2010) +- [Joey Degges brought this change] -- Added Watcom makefile borrowed from libcurl. + _libssh2_ntohu64: fix conversion from network bytes to uint64 - This makefile compiles already all files fine for static lib, but needs - final touch when I have OpenSSL fully working with shared libs and Watcom. - -- Added copyright define to libssh2.h and use it for binary builds. + Cast individual bytes to uint64 to avoid overflow in arithmetic. -- Moved version defines up in order to include from .rc file. +Daniel Stenberg (20 Dec 2010) +- libssh2_userauth_list: language fix - Blocked rest of header with ifndef so its possible to let - the rc compiler only use the version defines. - -- Some minor makefile tweaks. + "faily" is not a good English word, and I also cleaned up some other minor + mistakes -Daniel Stenberg (2 Aug 2010) -- example: treat the libssh2_channel_read() return code properly +- crypto: unify the generic functions - A short read is not an error. Only negative values are errors! + Added crypto.h that is the unified header to include when using crypto + functionality. It should be the only header that needs to adapt to the + underlying crypto library in use. It provides the set of prototypes that + are library agnostic. -- libssh2_wait_socket: reset error code to "leak" EAGAIN less - - Since libssh2 often sets LIBSSH2_ERROR_EAGAIN internally before - _libssh2_wait_socket is called, we can decrease some amount of - confusion in user programs by resetting the error code in this function - to reduce the risk of EAGAIN being stored as error when a blocking - function returns. +- [Mark Smith brought this change] -- _libssh2_wait_socket: poll needs milliseconds + userauth: derive publickey from private - As reported on the mailing list, the code path using poll() should - multiple seconds with 1000 to get milliseconds, not divide! + Pass a NULL pointer for the publickey parameter of + libssh2_userauth_publickey_fromfile and + libssh2_userauth_hostbased_fromfile functions. In this case, the + functions recompute the public key from the private key file data. - Reported by: Jan Van Boghout - -- typedef: make ssize_t get typedef without LIBSSH2_WIN32 + This is work done by Jean-Louis CHARTON + , then adapted by Mark Smith and + slightly edited further by me Daniel. - The condition around the ssize_t typedef depended on both LIBSSH2_WIN32 - *and* _MSC_VER being defined when it should be enough to depend on - _MSC_VER only. It also makes it nicer so libssh2-using code builds fine - without having custom defines. + WARNING: this does leave the feature NOT WORKING when libssh2 is built + to use libgcrypt instead of OpenSSL simply due to lack of + implementation. -- [John Little brought this change] +- ssh2_echo: Value stored to 'exitcode' is never read - session_free: free more data to avoid memory leaks +- _libssh2_packet_add: fix SSH_MSG_DEBUG weirdness + + I believe I may have caused this weird typo style error when I cleaned + up this function a while ago. Corrected now. -- channel_free: ignore problems with channel_close() +- uint32: more longs converted to proper types - As was pointed out in bug #182, we must not return failure from - _libssh2_channel_free() when _libssh2_channel_close() returns an error - that isn't EAGAIN. It can effectively cause the function to never go - through, like it did now in the case where the socket was actually - closed but socket_state still said LIBSSH2_SOCKET_CONNECTED. + I also moved the MAC struct over to the mac.h header file and made sure + that the users of that struct include that file. + +- SFTP: more types to uint32_t - I consider this fix the right thing as it now also survives other - errors, even if making sure socket_state isn't lying is also a good - idea. + The 'num_names' field in the SSH_FXP_NAME response is an unsigned 32bit + value so we make sure to treat it like that. -- publickey_list_free: no return value from a void function +- SFTP: request_ids are uint32_t - Fixed a compiler warning I introduced previously when checking input - arguments more. I also added a check for the other pointer to avoid NULL - pointer dereferences. + I went over the code and made sure we use uint32_t all over for the + request_id data. It is an unsigned 32bit value on the wire. -- [Lars Nordin brought this change] +- SFTP: store request_id separately in packets + + By using a new separate struct for incoming SFTP packets and not sharing + the generic packet struct, we can get rid of an unused field and add a + new one dedicated for holding the request_id for the incoming + package. As sftp_packet_ask() is called fairly often, a "mere" integer + comparison is MUCH faster than the previous memcmp() of (typically) 5 + bytes. - openssl: make use of the EVP interface +- libssh2_sftp_open_ex: man page extended and cleaned up - Make use of the EVP interface for the AES-funktion. Using this method - supports the use of different ENGINES in OpenSSL for the AES function - (and the direct call to the AES_encrypt should not be used according to - openssl.org) + I added the missing documentation for the 'flags' argument. -Peter Stuge (23 Jun 2010) -- [Tor Arntsen brought this change] +- SFTP: unify the READ/WRITE chunk structs - Don't overflow MD5 server hostkey +- SFTP: fix memory leaks - Use SHA_DIGEST_LENGTH and MD5_DIGEST_LENGTH in memcpy instead of hardcoded - values. An incorrect value was used for MD5. - -- Fix message length bugs in libssh2_debug() + Make sure that we cleanup remainders when the handle is closed and when + the subsystem is shutdown. - There was a buffer overflow waiting to happen when a debug message was - longer than 1536 bytes. + Existing flaw: if a single handle sends packets that haven't been + replied to yet at the time when the handle is closed, those packets will + arrive later and end up in the generic packet brigade queue and they + will remain in there until flushed. They will use unnecessary memory, + make things slower and they will ruin the SFTP handling if the + request_id counter ever wraps (highly unlikely to every happen). + +- sftp_close_handle: packet list is generic - Thanks to Daniel who spotted that there was a problem with the message - length passed to a trace handler also after commit - 0f0652a3093111fc7dac0205fdcf8d02bf16e89f. + Fix comment, simplify the loop logic -- Make libssh2_debug() create a correctly terminated string +- sftp_read: pipeline reads - Also use FILE *stderr rather than fd 2, which can very well be something - completely different. + The SFTP read function now does transfers the same way the SFTP write + function was made to recently: it creates a list of many outgoing + FXP_READ packets that each asks for a small data chunk. The code then + tries to keep sending read request while collecting the acks for the + previous requests and returns the received data. -Daniel Stenberg (23 Jun 2010) -- [TJ Saunders brought this change] +- sftp_write: removed unused variable - handshake: Compression enabled at the wrong time - - In KEXINIT messages, the client and server agree on, among other - things, whether to use compression. This method agreement occurs - in src/kex.c's kex_agree_methods() function. However, if - compression is enabled (either client->server, server->client, or - both), then the compression layer is initialized in - kex_agree_methods() -- before NEWKEYS has been received. +- _libssh2_channel_close: don't call transport read if disconnected - Instead, the initialization of the compression layer should - happen after NEWKEYS has been received. This looks to occur - insrc/kex.c's diffie_hellman_sha1(), which even has the comment: + The loop that waits for remote.close to get set may end up looping + forever since session->socket_state gets set to + LIBSSH2_SOCKET_DISCONNECTED by the packet_add() function called from the + transport_read() function and after having been set to + LIBSSH2_SOCKET_DISCONNECTED, the transport_read() function will only + return 0. - /* The first key exchange has been performed, + Bug: http://trac.libssh2.org/ticket/198 + +- libssh2_sftp_seek64: new man page - switch to active crypt/comp/mac mode */ + Split off libssh2_sftp_seek64 from the libssh2_sftp_seek man page, and + mentioned that we consider the latter deprecated. Also added a mention + about the dangers of doing seek during writing or reading. + +- sftp_seek: fix - There, after NEWKEYS is received, the cipher and mac algorithms - are initialized, and that is where the compression should be - initialized as well. + The new SFTP write code caused a regression as the seek function no + longer worked as it didn't set the write position properly. - The current implementation fails if server->client compression is - enabled because most server implementations follow OpenSSH's - lead, where compression is initialized after NEWKEYS. Since the - server initializes compression after NEWKEYS, but libssh2 - initializes compression after KEXINIT (i.e. before NEWKEYS), they - are out of sync. + It should be noted that seeking is STRONGLY PROHIBITED during upload, as + the upload magic uses two different offset positions and the multiple + outstanding packets etc make them sensitive to change in the midst of + operations. - Reported in bug report #180 + This functionality was just verified with the new example code + sftp_append. This bug was filed as bug #202: + + Bug: http://trac.libssh2.org/ticket/202 -- [TJ Saunders brought this change] +- sftp_append: new example doing SFTP append - userauth_hostbased_fromfile: packet length too short +- MAX_SFTP_OUTGOING_SIZE: 30000 - The packet length calculated in src/userauth.c's - userauth_hostbased_fromfile() function is too short by 4 bytes; - it forgets to add four bytes for the length of the hostname. - This causes hostbased authentication to fail, since the server - will read junk data. + I ran SFTP upload tests against localhost. It showed that to make the + app reach really good speeds, I needed to do a little code tweak and + change MAX_SFTP_OUTGOING_SIZE from 4000 to 30000. The tests I did before + with the high latency tests didn't show any real difference whatever I + had that size set to. - verified against proftpd's mod_sftp module + This number is the size in bytes that libssh2 cuts off the large input + buffer and sends off as an individual sftp packet. -- _libssh2_userauth_publickey: reject method names longer than the data +- sftp_write_sliding.c: new example - This functions get the method length by looking at the first 32 - bit of data, and I now made it not accept method lengths that are - longer than the whole data set is, as given in the dedicated - function argument. + This is an example that is very similar to sftp_write_nonblock.c, with + the exception that this uses - This was detected when the function was given bogus public key - data as an ascii string, which caused the first 32bits to create - a HUGE number. - -- NULL resistance: make more public functions survive NULL pointer input + 1 - a larger upload buffer - Sending in NULL as the primary pointer is now dealt with by more - public functions. I also narrowed the userauth.c code somewhat to - stay within 80 columns better. - -- agent: make libssh2_agent_userauth() work blocking properly + 2 - a sliding buffer mechnism to allow the app to keep sending lots of + data to libssh2 without having to first drain the buffer. - previously it would always work in a non-blocking manner + These are two key issues to make libssh2 SFTP uploads really perform + well at this point in time. -Peter Stuge (17 Jun 2010) -- Fix underscore typo for 64-bit printf format specifiers on Windows +- cpp: s/#elsif/#elif - Commit 49ddf447ff4bd80285f926eac0115f4e595f9425 was missing underscores. - -Daniel Stenberg (16 Jun 2010) -- libssh2_session_callback_set: extended the man page - -- [John brought this change] + This looks like a typo as #elsif is not really C... - LIBSSH2_DEBUG: macro uses incorrect function variable +- _libssh2_channel_write: revert channel_write() use - The LIBSSH2_DEBUG macro, defined in libssh2_priv.h, incorrectly uses the - function variable ssh_msg_disconnect when it should use ssh_msg_debug. + The attempts made to have _libssh2_channel_write() accept larger pieces + of data and split up the data by itself into 32700 byte chunks and pass + them on to channel_write() in a loop as a way to do faster operations on + larger data blocks was a failed attempt. - This shows that the LIBSSH2_CALLBACK_DEBUG callback never has worked... - -- warning: fix a compiler warning 'pointer differs in signedness' + The reason why it is difficult: - As reported in bug #177 - -- portability: introduce LIBSSH2_INT64_T_FORMAT for 64bit printf()s + The API only allows EAGAIN or a length to be returned. When looping over + multiple blocks to get sent, one block can get sent and the next might + not. And yet: when transport_send() has returned EAGAIN we must not call + it again with new data until it has returned OK on the existing data it + is still working on. This makes it a mess and we do get a much easier + job by simply returning the bytes or EAGAIN at once, as in the EAGAIN + case we can assume that we will be called with the same arguments again + and transport_send() will be happy. - As pointed out in bug #177, some of the Windows compilers use - %I64 to output 64 bit variables with the printf family. + Unfortunately, I think we take a small performance hit by not being able + to do this. -- debug: avoid sending NULL to sprintf %s +- ssh2_echo: new example - Via the _libssh2_debug() macro/function. Pointed out by john in bug report + This is a new example snippet. The code is largely based on ssh2_exec, + and is written by Tommy Lindgren. I edited it into C90 compliance and to + conform to libssh2 indent style and some more. -- sftp docs: show macro on macro page, only function on function page +- send_existing: return after send_existing - The individual man pages for macros now show the full convenience - macro as defined, and then the man page for the actual function - only shows the function. - -- code police: make the code use less than 80 columns + When a piece of data is sent from the send_existing() function we must + make the parent function return afterwards. Otherwise we risk that the + parent function tries to send more data and ends up getting an EGAIN for + that more data and since it can only return one return code it doesn't + return info for the successfully sent data. + + As this change is a regression I now added a larger comment explaining + why it has to work like this. -- libssh2_channel_write_ex: remove macros, added wording on buffer size +- _libssh2_channel_write: count resent data as written + + In the logic that resends data that was kept for that purpose due to a + previous EAGAIN, the data was not counted as sent causing badness. -- libssh2_sftp_write: document buffer size and changed some ordering +Peter Stuge (13 Nov 2010) +- Use fprintf(stderr, ) instead of write(2, ) for debugging -- libssh2_channel_write_stderr: show how the macro is defined +- session/transport: Correctly handle when _libssh2_send() returns -EAGAIN -- libssh2_channel_write: show how the macro is defined +- src/agent.c: Simplify _libssh2_send() error checking ever so slightly -- SFTP: limit write() to not produce overly large packets +Daniel Stenberg (12 Nov 2010) +- send/recv: use _libssh2_recv and _libssh2_send now - sftp_write() now limits how much data it gets at a time even more - than before. Since this function creates a complete outgoing - packet based on what gets passed to it, it is crucial that it - doesn't create too large packets. + Starting now, we unconditionally use the internal replacement functions + for send() and recv() - creatively named _libssh2_recv() and + _libssh2_send(). - With this method, there's also no longer any problem to use very - large buffers in your application and feed that to libssh2. I've - done numerous tests now with uploading data over SFTP using 100K - buffers and I've had no problems with that. + On errors, these functions return the negative 'errno' value instead of + the traditional -1. This design allows systems that have no "natural" + errno support to not have to invent it. It also means that no code + outside of these two transfer functions should use the errno variable. -- scp_write_nonblock: add transfer time info +- channel_write: move some logic to _libssh2_channel_write - Using the same timing logic and output format as - sftp_write_nonblock allows us to very easily run benchmarks on - SCP vs SFTP uploads using libssh2. + Some checks are better done in _libssh2_channel_write just once per + write instead of in channel_write() since the looping will call the + latter function multiple times per _libssh2_channel_write() invoke. -- sftp_write_nonblock: select() on socket, use *BIG* buffer, time transfer +- sftp_write: handle "left over" acked data - The select() is just to make it nicer so that it doesn't - crazy-loop on EAGAIN. The buffer size thing is mostly to verify - that this really work as supposed. + The SFTP handle struct now buffers number of acked bytes that haven't + yet been returned. The way this is used is as following: - Transfer timing is just a minor thing, but it can just as well be - there and help us time and work on performance easier using out - of the box examples. - -- agent: use _libssh2_error() when returning errors + 1. sftp_write() gets called with a buffer of let say size 32000. We + split 32000 into 8 smaller packets and send them off one by one. One of + them gets acked before the function returns so 4000 is returned. - As pointed out in bug report #173, this module basically never - used _libssh2_error() which made it work inconstently with other - parts of the libssh2 code base. This is my first take at making - this code more in line with the rest. - -- inputchecks: make lots of API functions check for NULL pointers + 2. sftp_write() gets called again a short while after the previous one, + now with a much smaller size passed in to the function. Lets say 8000. + In the mean-time, all of the remaining packets from the previous call + have been acked (7*4000 = 28000). This function then returns 8000 as all + data passed in are already sent and it can't return any more than what + it got passed in. But we have 28000 bytes acked. We now store the + remaining 20000 in the handle->u.file.acked struct field to add up in + the next call. - If an application accidentally provides a NULL handle pointer to - the channel or sftp public functions, they now return an error - instead of segfaulting. - -- libssh2_channel_eof: clarify that it returns negative on errors + 3. sftp_write() gets called again, and now there's a backlogged 20000 + bytes to return as fine and that will get skipped from the beginning + of the buffer that is passed in. -- SFTP: keep the sftp error code as 32 bit +- sftp_write: polished and simplified - 'last_errno' holds to the error code from the SFTP protocol and - since that is 32 bits on the wire there's no point in using a - long for this internally which is larger on some platforms. - -- agent: make the code better deal with unexpected code flows + Removed unnecessary struct fields and state changes within the function. - agent->ops gets initialized by the libssh2_agent_connect() call - but we need to make sure that we don't segfault even if a bad - sequence of function calls is used. + Made the loop that checks for ACKs only check chunks that were fully + sent. -Alexander Lamaison (10 Jun 2010) -- Better handling of invalid key files. +- SCP: on failure, show the numerical error reason - Passing an invalid public key to libssh2_userauth_publickey_fromfile_ex - triggered an assertion. Replaced this with a runtime check that rejects - obviously invalid key data. + By calling libssh2_session_last_errno() -Daniel Stenberg (10 Jun 2010) -- version: we start working on 1.2.7 now +- SFTP: provide the numerical error reason on failure -Version 1.2.6 (10 Jun 2010) +- SCP: clean up failure treatment + + When SCP send or recv fails, it gets a special message from the server + with a warning or error message included. We have no current API to + expose that message but the foundation is there. Removed unnecessary use + of session struct fields. -Daniel Stenberg (10 Jun 2010) -- NEWS: add the 1.2.6 release details +- sftp_write: enlarge buffer to perform better -- RELEASE-NOTES: 1.2.6 details added +- packets: code cleanup + + I added size checks in several places. I fixed the code flow to be easier + to read in some places. + + I removed unnecessary zeroing of structs. I removed unused struct fields. -Guenter Knauf (10 Jun 2010) -- fixed libssh2.dsw to use the generated libssh2.dsp; removed old *.dsp files. +- LIBSSH2_CALLBACK_MACERROR: clarify return code use -- moved MSVC strdup define to libssh2_config.h which we include already. +- _libssh2_userauth_publickey: avoid shadowing -- added missing source files to src/NMakefile. +- packet: avoid shadowing global symbols -Daniel Stenberg (8 Jun 2010) -- libssh2_poll: refer to poll(3) and select(3) instead +- sftp_readdir: avoid shadowing -- example: fix strdup() for MSVC compiles - - MSVC has a _strdup() that we better use. This was reported in bug +- shadowing: don't shadow the global compress -- SFTP: fail init SFTP if session isn't authenticated - - Alexander Lamaison filed bug #172 - (http://trac.libssh2.org/ticket/172), and pointed out that SFTP - init would do bad if the session isn't yet authenticated at the - time of the call, so we now check for this situation and returns - an error if detected. Calling sftp_init() at this point is bad - usage to start with. +- _libssh2_packet_add: turn ifs into a single switch -- direct_tcpip: bring back inclusion of libssh2_config.h - - In order to increase portability of this example, I'm bringing - the inclusion of libssh2_config.h back, and I also added an - require that header for this example to compile. +- _libssh2_packet_add: check SSH_MSG_GLOBAL_REQUEST packet + +- _libssh2_packet_add: SSH_MSG_DEBUG length checks - I also made all code lines fit within 80 columns. + Verify lengths before using them. Read always_display from the correct + index. Don't copy stuff around just to provide zero-termination of the + strings. -Guenter Knauf (3 Jun 2010) -- cast away a warning. +- _libssh2_packet_add: SSH_MSG_IGNORE skip memmove + + There's no promise of a zero termination of the data in the callback so + no longer perform ugly operation in order to provide it. -- moved CRT_SECURE_NO_DEPRECATE define up so its defined before the winsock headers are included. +- _libssh2_packet_add: SSH_MSG_DISCONNECT length checks + + Verify lengths before trying to read data. -- fixed platform detection for MingW32 test makefile. +- indent: break lines at 80 columns -- MingW32 has gettimeofday() implemented, so proper ifdef this function here. +- SSH_MSG_CHANNEL_OPEN_FAILURE: used defined values + + We don't like magic numbers in the code. Now the acceptable failure + codes sent in the SSH_MSG_CHANNEL_OPEN_FAILURE message are added as + defined values in the private header file. -- removed MSVC ifdef since seems we can use __int64 still with latest headers. +- sftp_write: don't return EAGAIN if no EAGAIN was received + + This function now only returns EAGAIN if a lower layer actually returned + EAGAIN to it. If nothing was acked and no EAGAIN was received, it will + now instead return 0. -- changed copyright notice for MinW32 and NetWare binaries. +- _libssh2_wait_socket: detect nothing-to-wait-for + + If _libssh2_wait_socket() gets called but there's no direction set to + wait for, this causes a "hang". This code now detects this situation, + set a 1 second timeout instead and outputs a debug output about it. -- cleaned up MSVC ifdefs which where spreaded over 3 places. +- decomp: remove the free_dest argument + + Since the decompress function ALWAYS returns allocated memory we get a + lot simpler code by removing the ability to return data unallocated. -- added uint8_t typedef for NetWare CLIB platform. +- decomp: cleaned off old compression stuff + + I cleared off legacy code from when the compression and decompression + functions were a single unified function. Makes the code easier to read + too. -- if the function declaration gets changed the header should be changed too. +- [TJ Saunders brought this change] -- this is MSVC specific and doesnt apply for all Win32 compilers; - the uint8_t typedef clashes with MingW32 headers. + decomp: increase decompression buffer sizes -- updated MingW32 makefiles for latest dependency lib versions. +- [TJ Saunders brought this change] -- updated NetWare makefiles for latest dependency lib versions. + zlib: Add debug tracing of zlib errors -Dan Fandrich (30 May 2010) -- Fixed compiling with libgcrypt +- sftp_packet_read: handle partial reads of the length field - A change of parameter types from unsigned long to size_t was - missed in the prototype in libgcrypt.h + SFTP packets come as [32 bit length][payload] and the code didn't + previously handle that the initial 32 bit field was read only partially + when it was read. -Daniel Stenberg (28 May 2010) -- statvfs: use libssh2_sftp_statvfs only, no "_ex" +- [Jasmeet Bagga brought this change] + + kex_agree_hostkey: fix NULL pointer derefence - As the long-term goal is to get rid of the extensive set of - macros from the API we can just as well start small by not adding - new macros when we add new functions. Therefore we let the - function be libssh2_sftp_statvfs() plainly without using an _ex - suffix. + While setting up the session, ssh tries to determine the type of + encryption method it can use for the session. This requires looking at + the keys offered by the remote host and comparing these with the methods + supported by libssh2 (rsa & dss). To do this there is an iteration over + the array containing the methods supported by libssh2. - I also made it use size_t instead of unsigned int for the string - length as that too is a long-term goal for the API. + If there is no agreement on the type of encryption we come to the 3rd + entry of the hostkeyp array. Here hostkeyp is valid but *hostkep is + NULL. Thus when we dereference that in (*hostkeyp)->name there is a + crash -- [Grubsky Grigory brought this change] +- _libssh2_transport_send: remove dead assignment + + 'data' isn't accessed beyond this point so there's no need to assign it. - DSP: output lib name typo +- scp_recv: remove dead assignment + + Instead of assigning a variable we won't read, we now use the more + explicit (void) prefix. -- [Grubsky Grigory brought this change] +- sftp_write: removed superfluous assignment - win32: provide a uint8_t typedef for better building on windows +- bugfix: avoid use of uninitialized value -- agent: win32: fix bad _libssh2_store_str call +- sftp_packet_require: propagate error codes better - As pointed out by Grubsky Grigory , I - made a mistake when I added the _libssh2_store_str() call before - and I made a slightly different patch than what he suggested. - Based purely on taste. - -Peter Stuge (24 May 2010) -- [Joey Degges brought this change] + There were some chances that they would cause -1 to get returned by + public functions and as we're hunting down all such occurances and since + the underlying functions do return valuable information the code now + passes back proper return codes better. - Add libssh2_sftp_statvfs() and libssh2_sftp_fstatvfs() - - These can be used to get file system statistics from servers that - support the statvfs@openssh.com and fstatvfs@openssh.com extensions. +- [Alfred Gebert brought this change] -Alexander Lamaison (22 May 2010) -- [Jose Baars brought this change] + fix memory leaks (two times cipher_data) for each sftp session - VMS specific: make sure final release can be installed over daily build +- libssh2_userauth_authenticated: make it work as documented + + The man page clearly says it returns 1 for "already authenticated" but + the code said non-zero. I changed the code to use 1 now, as that is also + non-zero but it gets the benefit that it now matches the documentation. + + Using 1 instead of non-zero is better for two reasons: + + 1. We have the opportunity to introduce other return codes in the future for + things like error and what not. + 2. We don't expose the internal bitmask variable value. -- [Jose Baars brought this change] +- userauth_keyboard_interactive: fix indent - VMS: small improvement to the man2help utilities +- [Alfred Gebert brought this change] -Peter Stuge (22 May 2010) -- [Joey Degges brought this change] + fix memory leak in userauth_keyboard_interactive() + + First I wanted to free the memory in session_free() but then + I had still memory leaks because in my test case the function + userauth_keyboard_interactive() is called twice. It is called + twice perhaps because the server has this authentication + methods available: publickey,gssapi-with-mic,keyboard-interactive + The keyboard-interactive method is successful. - libssh2_exit and libssh2_sftp_readdir man page fixes +- dist: include sftp.h in dist archives -Daniel Stenberg (21 May 2010) -- spelling: s/sue/use +Simon Josefsson (27 Oct 2010) +- Update header to match new function prototype, see c48840ba88. -Alexander Lamaison (21 May 2010) -- Change magic port number for generic knownhost check. - - libssh2_knownhost_checkp took 0 as a magic port number that indicated - a 'generic' check should be performed. However, 0 is a valid port - number in its own right so this commit changes the magic value to any - negative int. +Daniel Stenberg (26 Oct 2010) +- bugfixes: the transport rearrange left some subtle flaws now gone -Mikhail Gusarov (5 May 2010) -- Add re-discovered copyright holders to COPYING +- libssh2_userauth_publickey_fromfile_ex.3: cleaned up looks -- Restoring copyright statements from pre-git era +- libssh2_userauth_publickey: add man page - Eli Fant has contributed fragmenting SFTP requests + I found an undocumented public function and we can't have it like + that. The description here is incomplete, but should serve as a template + to allow filling in... -- Restoring my copyright statements from pre-git era +- libssh2_sftp_write.3: added blurb about the "write ahead" - keyboard_interactive, 'exit-status' information packet, non-atomic read/write - under FreeBSD, multi-channel operation bugfixes. - -Daniel Stenberg (3 May 2010) -- pedantic: make the code C90 clean + Documented the new SFTP write concept -Peter Stuge (3 May 2010) -- Do proper keyboard-interactive user dialog in the sftp.c example +- sftp_close_handle: free any trailing write chunks -Daniel Stenberg (3 May 2010) -- added to tarball: libssh2_knownhost_checkp.3 +- _libssh2_channel_write: fix warnings -- knownhost: support [host]:port in knownhost file +- SFTP: bufgix, move more sftp stuff to sftp.h - OpenSSH has ways to add hosts to the knownhosts file that include - a specific port number which makes the key associated with only - that specific host+port pair. libssh2 previously did not support - this, and I was forced to add a new function to the API to - properly expose this ability to applications: - libssh2_knownhost_checkp() + The sftp_write function shouldn't assume that the buffer pointer will be + the same in subsequent calls, even if it assumes that the data already + passed in before haven't changed. - To *add* such hosts to the knownhosts file, you make sure to pass - on the host name in that manner to the libssh2_knownhost_addc() - function. + The sftp structs are now moved to sftp.h (which I forgot to add before) -- init/exit: mention these were added in 1.2.5 +- SFTP: use multiple outgoing packets when writing + + sftp_write was rewritten to split up outgoing data into multiple packets + and deal with the acks in a more asynchronous manner. This is meant to + help overcome latency and round-trip problems with the SFTP protocol. -- libssh2_knownhost_check docs: correct the prototype +- TODO: implemented a lot of the ideas now -- examples: avoid use of uninitialized variable 'sock' +- _libssh2_channel_write: removed 32500 size limit + + Neither _libssh2_channel_write nor sftp_write now have the 32500 size + limit anymore and instead the channel writing function now has its own + logic to send data in multiple calls until everything is sent. -- KEX: stop pretending we negotiate language +- send_existing: don't tell parent to return when drained - There was some stub-like parts of an implementation for - implementing kex language negotiation that caused clang-analyzer - to warn and as it did nothing I've now removed the dead code. + That will just cause unnecessary code execution. -- Uninitialized argument +- _libssh2_channel_write: general code cleanup + + simplified the function and removed some unused struct fields -- sftpdir: removed dead assignment +- _libssh2_transport_send: replaces _libssh2_transport_write + + The new function takes two data areas, combines them and sends them as a + single SSH packet. This allows several functions to allocate and copy + less data. + + I also found and fixed a mixed up use of the compression function + arguments that I introduced in my rewrite in a recent commit. -- Makefile.am: include the VMS-specific config header as well +- scp_write_nonblock: use select() instead of busyloop + + Make this example nicer by not busylooping. -- [Jose Baars brought this change] +- send_existing: clear olen when the data is sent off - Add VMS specific libssh2_config.h +- _libssh2_transport_write: allow 256 extra bytes around the packet -- fix Value stored to 's' is never read warning - - and moved variable declaration of s to be more local +- _libssh2_transport_write: remade to send without malloc -- kexinit: simplify the code and avoid scan-build warning +- compress: compression disabled by default - Previously it would say "Value stored to 's' is never read" due - fourth increment of 's'. - -Alexander Lamaison (28 Apr 2010) -- Removed unecessary brackets. + We now allow libssh2_session_flag() to enable compression with a new + flag and I added documentation for the previous LIBSSH2_FLAG_SIGPIPE + flag which I wasn't really aware of! -- Changed sftp_attrsize macro to a static function. +- comp: split the compress function + + It is now made into two separate compress and decompress functions. In + preparation for upcoming further modficications. -Daniel Stenberg (28 Apr 2010) -- release: include the VMS-specific files +Dan Fandrich (20 Oct 2010) +- Added header file to allow compiling in older environments -- sftp_attrsize: protect the macro argument with proper parentheses +Daniel Stenberg (20 Oct 2010) +- TODO: add a possible new API for SFTP transfers -- ssh2_agent: avoid using 'session' uninitialized on failures +- TODO: "New Transport API" added -- examples: remove assignments of variable rc that's never used +- TODO: add buffering plans -- publickey_init: remove useless variable increment +Simon Josefsson (13 Oct 2010) +- Mention libssh2_channel_get_exit_signal and give kudos. -- hostkey_method_ssh_rsa_init: remove useless variable increment +- [Tommy Lindgren brought this change] -- packet_x11_open: removed useless variable increment + Add libssh2_channel_get_exit_signal man page. - and made the declaration of a variable more local + Signed-off-by: Simon Josefsson -- packet_queue_listener: removed useless variable increment - - and made the declaration of a variable more local +- [Tommy Lindgren brought this change] -- sftp_read: move a read_responses array to where its used + Add libssh2_channel_get_exit_signal. - I find that this increases readability since the array is used - only in the function call just immediately below and nowhere - else. - -- sftp_readdir: turn a small array static const and move it + Signed-off-by: Simon Josefsson -- sftp_attrsize: converted function to a macro - - This way, the macro can evaluate a static number at compile time - for two out of four uses, and it probably runs faster for the - other two cases too. +- Add libssh2_free man page and fix typo. -- sftp_open: deal with short channel_write calls - - This was an old TODO that just wasn't done before. If - channel_write returns short, that is not an error. +- Add libssh2_free. -- sftp_open: clean up, better check of input data - - The clang-analyzer report made it look into this function and - I've went through it to remove a potential use of an - uninitialized variable and I also added some validation of input - data received from the server. +Daniel Stenberg (11 Oct 2010) +- scp_recv: improved treatment of channel_read() returning zero - In general, lots of more code in this file need to validate the - input before assuming it is correct: there are servers out there - that have bugs or just have another idea of how to do the SFTP - protocol. + As a zero return code from channel_read() is not an error we must make + sure that the SCP functions deal with that properly. channel_read() + always returns 0 if the channel is EOFed already so we check for EOF + after 0-reads to be able to return error properly. -- bugfix: avoid using the socket if it failed to create one +- libssh2_session_methods.3: detail what can be asked for -- bugfix: potential use of NULL pointer +- compression: send zlib before none + + As the list of algorithms in a preferred order we should send zlib + before none to increase the chances that the server will let us do + compression. -- libssh2_userauth_password_ex: clarify errors somewhat +- compress: faster check, better return codes - The errors mentioned in this man page are possible return codes - but not necessarily the only return codes that this can return. + In the transport functions we avoid a strcmp() now and just check a + boolean instead. - Also reformatted the typ prototypes somewhat. + The compress/decompress function's return code is now acknowledged and + used as actual return code in case of failures. -- examples: fixed and made them more similar +- libssh2_session_handshake: replaces libssh2_session_startup() - The channel read/write functions can return 0 in legitimate cases - without it being an error, and we need to loop properly if they - return short. - -- [Jose Baars brought this change] + The function libssh2_session_startup() is now considered deprecated due + to the portability issue with the socket argument. + libssh2_session_handshake() is the name of the replacement. - VMS port of libssh2; changes in the libssh2 common code +- libssh2_socket_t: now externally visible + + In preparation for upcominig changes, the libssh2_socket_t type is now + typedef'ed in the public header. -- Makefile: added the two news headers userauth.h and session.h +- _libssh2_transport_drain: removed + + This function proved not to be used nor useful. -- cleanup: prefer the internal functions +- _libssh2_channel_write: don't iterate over transport writes - To get the blocking vs non-blocking to work as smooth as possible - and behave better internally, we avoid using the external - interfaces when calling functions internally. + When a call to _libssh2_transport_write() succeeds, we must return from + _libssh2_channel_write() to allow the caller to provide the next chunk + of data. - Renamed a few internal functions to use _libssh2 prefix when not - being private within a file, and removed the libssh2_ for one - that was private within the file. + We cannot move on to send the next piece of data that may already have + been provided in this same function call, as we risk getting EAGAIN for + that and we can't return information both about sent data as well as + EAGAIN. So, by returning short now, the caller will call this function + again with new data to send. -- session_free: remove dead code +- _libssh2_transport_write: updated documentation blurb -- libssh2_publickey_init: fixed to work better non-blocking - - This was triggered by a clang-analyzer complaint that turned out - to be valid, and it made me dig deeper and fix some generic non- - blocking problems I disovered in the code. +- _libssh2_transport_write: remove fprintf remainder - While cleaning this up, I moved session-specific stuff over to a - new session.h header from the libssh2_priv.h header. + Mistake from previous debugging -- channel: reduce duplicated free and returns +- session: improved errors - Simplified the code by trying to free data and return on a single - spot. + Replaced -1/SOCKET_NONE errors with appropriate error defines instead. + + Made the verbose trace output during banner receiving less annoying for + non-blocking sessions. -- channel: make variables more local +- crypt_init: use correct error define + +- _libssh2_error: hide EAGAIN for non-blocking sessions - By making 'data' and 'data_len' more local in several places in - this file it will be easier to spot how they are used and we'll - get less risks to accidentally do bad things with them. + In an attempt to make the trace output less cluttered for non-blocking + sessions the error function now avoids calling the debug function if the + error is the EAGAIN and the session is non-blocking. -Mikhail Gusarov (24 Apr 2010) -- Fix typos in manpages, catched by Lintian +- agent: use better error defines -Daniel Stenberg (24 Apr 2010) -- channel_request_pty: simplify the code +- comp_method_zlib_init: use correct error defines + +- transport: better error codes - clang-analyzer pointed out how 'data' could be accessed as a NULL - pointer if the wrong state was set, and while I don't see that - happen in real-life the code flow is easier to read and follow by - moving the LIBSSH2_FREE() call into the block that is supposed to - deal with the data pointer anyway. + LIBSSH2_SOCKET_NONE (-1) should no longer be used as error code as it is + (too) generic and we should instead use specific and dedicated error + codes to better describe the error. -- libssh2_channel_process_startup: simplify the code +- channel: return code and _libssh2_error cleanup - clang-analyzer pointed out how 'data' could be accessed as a NULL - pointer if the wrong state was set, and while I don't see that - happen in real-life the code flow is easier to read and follow by - moving the LIBSSH2_FREE() call into the block that is supposed to - deal with the data pointer anyway. + Made sure that all transport_write() call failures get _libssh2_error + called. -- sftp_close_handle: add precation to not access NULL pointer +- _libssh2_channel_write: limit to 32700 bytes - clang-analyzer pointed this out as a "Pass-by-value argument in - function call is undefined" but while I can't see exactly how - this can ever happen in reality I think a little check for safety - isn't such a bad thing here. + The well known and used ssh server Dropbear has a maximum SSH packet + length at 32768 by default. Since the libssh2 design current have a + fixed one-to-one mapping from channel_write() to the packet size created + by transport_write() the previous limit of 32768 in the channel layer + caused the transport layer to create larger packets than 32768 at times + which Dropbear rejected forcibly (by closing the connection). + + The long term fix is of course to remove the hard relation between the + outgoing SSH packet size and what the input length argument is in the + transport_write() function call. -- scp_write_nonblock: Value stored to 'nread' is never read +- libssh.h: add more dedicated error codes -- scp_write: Value stored to 'ptr' is never read +- SCP: allow file names with bytes > 126 + + When parsing the SCP protocol and verifying that the data looks like a + valid file name, byte values over 126 must not be consider illegal since + UTF-8 file names will use such codes. + + Reported by: Uli Zappe + Bug: http://www.libssh2.org/mail/libssh2-devel-archive-2010-08/0112.shtml -- scp_write_nonblock: Value stored to 'ptr' is never read +Dan Fandrich (25 Aug 2010) +- Document the three sftp stat constants -- sftp_mkdir: less silly output but show failures +Guenter Knauf (18 Aug 2010) +- Fixed Win32 makefile which was now broken at resource build. -- [Jose Baars brought this change] +- It is sufficient to pipe stderr to NUL to get rid of the nasty messages. - VMS port of libssh2 including VMS specific build procedures +- [Author: Guenter Knauf brought this change] -- two variable types changes, made lines less than 80 columns + Removed Win32 ifdef completely for sys/uio.h. - The two variable type changes are only to match type variable - fields actually read from the binary protocol. + No idea why we had this ifdef at all but MSVC, MingW32, Watcom + and Borland all have no sys/uio.h header; so if there's another + Win32 compiler which needs it then it should be added explicitely + instead of this negative list. -- remove check for negative padding_length +- New files should also be added to Makefile.am. - It was silly, since it is read as an unsigned char... + Otherwise they will never be included with release and snapshot tarballs ... -- hostkey_method_ssh_dss_init: Value stored to 's' is never read +Daniel Stenberg (18 Aug 2010) +- version: bump to 1.2.8_DEV -- libssh2_banner_set: avoid unnecessary increment and explain code +Version 1.2.7 (17 Aug 2010) -- agent_transact_unix: remove unused variable +Daniel Stenberg (17 Aug 2010) +- release: updated to hold 1.2.7 info -- remove two unnecessary increments +Guenter Knauf (17 Aug 2010) +- Use the new libssh2.rc file. -- more code converted to use _libssh2_store_*() +- Added resource file for libssh2.dll (shamelessly stolen from libcurl). -- libssh2_publickey_list_fetch: removed unused variables +- Updated Win32 MSVC dependencies versions. -- libssh2_publickey_init: remove unused variables +- Added include for sys/select.h to get fd.set on some platforms. -- libssh2_scp_send64: added to API to provide large file transfers +- Added Watcom makefile borrowed from libcurl. - The previously existing libssh2_scp_send_ex() function has no way - to send files that are larger than 'size_t' which on 32bit - systems mean 4GB. This new API uses a libssh2_int64_t type and - should thus on most modern systems be able to send enormous - files. - -- sftp_init: remove unused variables and assignments - -- libssh2_knownhost_check: Value stored to 'keylen' is never read - -- hostkey: fix compiler warning + This makefile compiles already all files fine for static lib, but needs + final touch when I have OpenSSL fully working with shared libs and Watcom. -- remove unused variable +- Added copyright define to libssh2.h and use it for binary builds. -- data types: convert more to use size_t and uint32_t +- Moved version defines up in order to include from .rc file. + + Blocked rest of header with ifndef so its possible to let + the rc compiler only use the version defines. -- channel: variable type cleanups +- Some minor makefile tweaks. -- cleanups: better binary packet gen, size_t fixes and PACKET_* removal - - I'll introduce a new internal function set named - - _libssh2_store_u32 - _libssh2_store_u64 - _libssh2_store_str - - That can be used all through the library to build binary outgoing - packets. Using these instead of the current approach removes - hundreds of lines from the library while at the same time greatly - enhances readability. I've not yet fully converted everything to - use these functions. - - I've converted LOTS of 'unsigned long' to 'size_t' where - data/string lengths are dealt with internally. This is The Right - Thing and it will help us make the transition to our - size_t-polished API later on as well. - - I'm removing the PACKET_* error codes. They were originally - introduced as a set of separate error codes from the transport - layer, but having its own set of errors turned out to be very - awkward and they were then converted into a set of #defines that - simply maps them to the global libssh2 error codes instead. Now, - I'l take the next logical step and simply replace the PACKET_* - defines with the actual LIBSSH2_ERROR_* defines. It will increase - readability and decrease confusion. +Daniel Stenberg (2 Aug 2010) +- example: treat the libssh2_channel_read() return code properly - I also separated packet stuff into its own packet.h header file. + A short read is not an error. Only negative values are errors! -- clarified the return code +- libssh2_wait_socket: reset error code to "leak" EAGAIN less + + Since libssh2 often sets LIBSSH2_ERROR_EAGAIN internally before + _libssh2_wait_socket is called, we can decrease some amount of + confusion in user programs by resetting the error code in this function + to reduce the risk of EAGAIN being stored as error when a blocking + function returns. -- rename libssh2_error to the correct _libssh2_error +- _libssh2_wait_socket: poll needs milliseconds - We reserve ^libssh2_ for public symbols and we use _libssh2 as - prefix for internal ones. I fixed the intendation of all these - edits with emacs afterwards, which then changed it slightly more - than just _libssh2_error() expressions but I didn't see any - obvious problems. + As reported on the mailing list, the code path using poll() should + multiple seconds with 1000 to get milliseconds, not divide! + + Reported by: Jan Van Boghout -- data type cleanup: made lots of code use size_t etc +- typedef: make ssize_t get typedef without LIBSSH2_WIN32 - A lot of code used 'unsigned long' and the likes when it should - rather just use plain 'int' or use size_t for data lengths. + The condition around the ssize_t typedef depended on both LIBSSH2_WIN32 + *and* _MSC_VER being defined when it should be enough to depend on + _MSC_VER only. It also makes it nicer so libssh2-using code builds fine + without having custom defines. -- wait_socket: make c89 compliant and use two fd_sets for select() +- [John Little brought this change] -- sftp_readdir: always zero terminate, detail the return code - - I also added a description for the 'longentry' field which was - previously undocumented! + session_free: free more data to avoid memory leaks -- sftp_readdir: simplified and bugfixed - - This function no longer has any special purpose code for the - single entry case, as it was pointless. - - The previous code would overflow the buffers with an off-by-one - in case the file name or longentry data fields received from the - server were exactly as long as the buffer provided to - libssh2_sftp_readdir_ex. +- channel_free: ignore problems with channel_close() - We now make sure that libssh2_sftp_readdir_ex() ALWAYS zero - terminate the buffers it fills in. + As was pointed out in bug #182, we must not return failure from + _libssh2_channel_free() when _libssh2_channel_close() returns an error + that isn't EAGAIN. It can effectively cause the function to never go + through, like it did now in the case where the socket was actually + closed but socket_state still said LIBSSH2_SOCKET_CONNECTED. - The function no longer calls the libssh2_* function again, but - properly uses the internal sftp_* instead. + I consider this fix the right thing as it now also survives other + errors, even if making sure socket_state isn't lying is also a good + idea. -- channel/transport: we now drain the outgoing send buffer when we ignore EAGAIN +- publickey_list_free: no return value from a void function - When we ignore the EAGAIN from the transport layer within channel_write, we - now drain the outgoing transport layer buffer so that remainders in that - won't cause any problems in the next invoke of _libssh2_transport_write() + Fixed a compiler warning I introduced previously when checking input + arguments more. I also added a check for the other pointer to avoid NULL + pointer dereferences. -- channel_write: if data has been sent, don't return EAGAIN - - When sending data in a loop, we must not return EAGAIN if we - managed to send data in an earlier round. This was reported in - bug #126 => http://libssh2.stuge.se/ticket/126 +- [Lars Nordin brought this change] -Simon Josefsson (14 Apr 2010) -- Fix OpenSSL AES-128-CTR detection. + openssl: make use of the EVP interface - Patch from Paul Howarth . - -Daniel Stenberg (13 Apr 2010) -- version in header file now says 1.2.6-DEV - -- 1.2.6: clean the RELEASE-NOTES for next release round - -- NEWS: add the stuff from the version 1.2.5 RELEASE-NOTES + Make use of the EVP interface for the AES-funktion. Using this method + supports the use of different ENGINES in OpenSSL for the AES function + (and the direct call to the AES_encrypt should not be used according to + openssl.org) -Version 1.2.5 (13 Apr 2010) +Peter Stuge (23 Jun 2010) +- [Tor Arntsen brought this change] -Daniel Stenberg (13 Apr 2010) -- channel_close: no longer wait for the SSH_MSG_CHANNEL_CLOSE message + Don't overflow MD5 server hostkey - As the packet may simply not arrive we cannot have the close - function wait for it unconditionally. + Use SHA_DIGEST_LENGTH and MD5_DIGEST_LENGTH in memcpy instead of hardcoded + values. An incorrect value was used for MD5. -- less code duplication in the poll vs select code flows +- Fix message length bugs in libssh2_debug() + + There was a buffer overflow waiting to happen when a debug message was + longer than 1536 bytes. - libssh2_keepalive_send and libssh2_session_block_directions are - now used outside of the #ifdef blocks. + Thanks to Daniel who spotted that there was a problem with the message + length passed to a trace handler also after commit + 0f0652a3093111fc7dac0205fdcf8d02bf16e89f. -- make it C90 compliant +- Make libssh2_debug() create a correctly terminated string + + Also use FILE *stderr rather than fd 2, which can very well be something + completely different. -- updated with all changes and bugs since 1.2.4 +Daniel Stenberg (23 Jun 2010) +- [TJ Saunders brought this change] -- Added LIBSSH2_SFTP_S_IS***() macros and updated docs + handshake: Compression enabled at the wrong time - libssh2_sftp_fstat_ex.3 is now extended quite a lot to describe a - lot of the struct and the bits it uses and how to test for them. - -- sftp_init() deal with _libssh2_channel_write() returns short + In KEXINIT messages, the client and server agree on, among other + things, whether to use compression. This method agreement occurs + in src/kex.c's kex_agree_methods() function. However, if + compression is enabled (either client->server, server->client, or + both), then the compression layer is initialized in + kex_agree_methods() -- before NEWKEYS has been received. - When _libssh2_channel_write() is asked to send off 9 bytes, the - code needs to deal with the situation where less than 9 bytes - were sent off and prepare to send the remaining piece at a later - time. - -- handle a NULL password as if it was "" + Instead, the initialization of the compression layer should + happen after NEWKEYS has been received. This looks to occur + insrc/kex.c's diffie_hellman_sha1(), which even has the comment: - libssh2_userauth_publickey_fromfile_ex() takes a "passphrase" - but didn't deal with it being set to NULL. - -- Reduce used window sizes by factor 10 + /* The first key exchange has been performed, - As reported in bug report #166 http://libssh2.stuge.se/ticket/166 - by 'ptjm', the maximum window size must be less crazy for libssh2 - to do better with more server implementations. I did not do any - testing to see how this changes raw SCP performance, but the - maximum window size is still almost 4MB. This also has the upside - that libssh2 will use less memory. - -Peter Stuge (28 Mar 2010) -- Correctly clear blocking flag after sending multipart packet + switch to active crypt/comp/mac mode */ - commit 7317edab61d2179febc38a2c2c4da0b951d74cbc cleared the outbound - blocking bit when send_existing() returned PACKET_NONE and *ret=0, as - opposed to before even calling send_existing(), but because *ret=1 when - sending parts 2..n of an existing packet, the bit would only be cleared - when calling libssh2_transport_write() for a new packet. + There, after NEWKEYS is received, the cipher and mac algorithms + are initialized, and that is where the compression should be + initialized as well. - Clear the direction flag after the final part of a packet has been sent. - -Daniel Stenberg (24 Mar 2010) -- Added man page for libssh2_knownhost_addc() + The current implementation fails if server->client compression is + enabled because most server implementations follow OpenSSH's + lead, where compression is initialized after NEWKEYS. Since the + server initializes compression after NEWKEYS, but libssh2 + initializes compression after KEXINIT (i.e. before NEWKEYS), they + are out of sync. - Added mention in libssh2_knownhost_add() docs that - libssh2_knownhost_addc() is the preferred function now. - -- at next soname bump remove libssh2_knownhost_add() + Reported in bug report #180 -- ignore TAGS ("make tags" makes them) +- [TJ Saunders brought this change] -- fix memory leak + userauth_hostbased_fromfile: packet length too short + + The packet length calculated in src/userauth.c's + userauth_hostbased_fromfile() function is too short by 4 bytes; + it forgets to add four bytes for the length of the hostname. + This causes hostbased authentication to fail, since the server + will read junk data. - we must not assign the pointer a NULL since it keeps allocated - data and at least parts of an error string + verified against proftpd's mod_sftp module -- fixed the pattern for avoiding the poll check +- _libssh2_userauth_publickey: reject method names longer than the data + + This functions get the method length by looking at the first 32 + bit of data, and I now made it not accept method lengths that are + longer than the whole data set is, as given in the dedicated + function argument. - added some comments about known problems with poll on darwin + This was detected when the function was given bogus public key + data as an ascii string, which caused the first 32bits to create + a HUGE number. -- avoid checking for poll on some systems +- NULL resistance: make more public functions survive NULL pointer input - darwin and interix are known to have broken poll implementations - so we skip the check on those and thus have them use select - unconditionally + Sending in NULL as the primary pointer is now dealt with by more + public functions. I also narrowed the userauth.c code somewhat to + stay within 80 columns better. -- ignore libssh2.dsp +- agent: make libssh2_agent_userauth() work blocking properly + + previously it would always work in a non-blocking manner -Simon Josefsson (23 Mar 2010) -- Fix logic in "on-the-fly" crypto init. +Peter Stuge (17 Jun 2010) +- Fix underscore typo for 64-bit printf format specifiers on Windows + + Commit 49ddf447ff4bd80285f926eac0115f4e595f9425 was missing underscores. -- Make sure keepalive is working even when poll is used. +Daniel Stenberg (16 Jun 2010) +- libssh2_session_callback_set: extended the man page -- [Paul Querna brought this change] +- [John brought this change] - Use poll when available on blocking API. + LIBSSH2_DEBUG: macro uses incorrect function variable - Signed-off-by: Simon Josefsson + The LIBSSH2_DEBUG macro, defined in libssh2_priv.h, incorrectly uses the + function variable ssh_msg_disconnect when it should use ssh_msg_debug. + + This shows that the LIBSSH2_CALLBACK_DEBUG callback never has worked... -Peter Stuge (20 Mar 2010) -- Fix speling +- warning: fix a compiler warning 'pointer differs in signedness' + + As reported in bug #177 -Daniel Stenberg (19 Mar 2010) -- fix NULL dereference when window adjusting a non-existing channel +- portability: introduce LIBSSH2_INT64_T_FORMAT for 64bit printf()s - Suyog Jadhav pointed out that when receiving a window adjust to - a channel not found, the code would reference a NULL pointer. - Now it will instead output a message about that fact. + As pointed out in bug #177, some of the Windows compilers use + %I64 to output 64 bit variables with the printf family. -Simon Josefsson (19 Mar 2010) -- Fix build problem. +- debug: avoid sending NULL to sprintf %s + + Via the _libssh2_debug() macro/function. Pointed out by john in bug report -- Eat our own dog food, call libssh2_init and libssh2_exit in the examples. +- sftp docs: show macro on macro page, only function on function page + + The individual man pages for macros now show the full convenience + macro as defined, and then the man page for the actual function + only shows the function. -- Fix init/exit logic. Add self-test of it. +- code police: make the code use less than 80 columns -Daniel Stenberg (19 Mar 2010) -- fix typo +- libssh2_channel_write_ex: remove macros, added wording on buffer size -Simon Josefsson (19 Mar 2010) -- Add man page for libssh2_init and libssh2_exit. Fix libssh2_exit prototype. +- libssh2_sftp_write: document buffer size and changed some ordering -- Shorten constant a bit. More documentation. +- libssh2_channel_write_stderr: show how the macro is defined -- Fix namespace pollution. +- libssh2_channel_write: show how the macro is defined -- Add global init/exit points, to do crypto initialization in one place. +- SFTP: limit write() to not produce overly large packets + + sftp_write() now limits how much data it gets at a time even more + than before. Since this function creates a complete outgoing + packet based on what gets passed to it, it is crucial that it + doesn't create too large packets. - By Lars Nordin. + With this method, there's also no longer any problem to use very + large buffers in your application and feed that to libssh2. I've + done numerous tests now with uploading data over SFTP using 100K + buffers and I've had no problems with that. -Daniel Stenberg (14 Mar 2010) -- libssh2 is released under the Modifed BSD license, not GPL +- scp_write_nonblock: add transfer time info + + Using the same timing logic and output format as + sftp_write_nonblock allows us to very easily run benchmarks on + SCP vs SFTP uploads using libssh2. -Alexander Lamaison (14 Mar 2010) -- Add libssh2_knownhost_addc to handle comments. +- sftp_write_nonblock: select() on socket, use *BIG* buffer, time transfer - Comments in known_hosts file were not handle properly. They were parsed as - part of the key causing key matching to return a mismatch if the entry had a - comment. This adds a new API function that takes an optional comment and - changes libssh2_knownhost_readline to parse the comment as pass it to the - new function. + The select() is just to make it nicer so that it doesn't + crazy-loop on EAGAIN. The buffer size thing is mostly to verify + that this really work as supposed. - Fixes #164. + Transfer timing is just a minor thing, but it can just as well be + there and help us time and work on performance easier using out + of the box examples. -- Fix gettimeofday to compile with Visual C++ 6. +- agent: use _libssh2_error() when returning errors - Reported by Steven Van Ingelgem. - -Simon Josefsson (10 Mar 2010) -- Add. - -- keepalive.c: Fix libssh2_error usage. - -- Fix typo in last commit. - -- Tidy up build option notice. - -- Add entry about keep alive stuff. - -- Add keep-alive support. - -Alexander Lamaison (7 Mar 2010) -- Untabify. - -- Fix memory leak in libssh2_knownhost_add. - -Daniel Stenberg (6 Mar 2010) -- change 'int' to 'libssh2_socket_t' in the public API for sockets - -- reduce code duplication and return underlying error better + As pointed out in bug report #173, this module basically never + used _libssh2_error() which made it work inconstently with other + parts of the libssh2 code base. This is my first take at making + this code more in line with the rest. -- acknowledge when _libssh2_packet_requirev() returns error +- inputchecks: make lots of API functions check for NULL pointers - when _libssh2_packet_requirev() returns an error when waiting for - SSH_MSG_USERAUTH_SUCCESS or SSH_MSG_USERAUTH_FAILURE, it is an - error and it should be treated as such - -- wrap long lines - -- polished the phrasing in two error strings - -- silence picky compiler warnings + If an application accidentally provides a NULL handle pointer to + the channel or sftp public functions, they now return an error + instead of segfaulting. -- silence picky compiler warnings +- libssh2_channel_eof: clarify that it returns negative on errors -- removed libssh2_error()'s forth argument +- SFTP: keep the sftp error code as 32 bit - libssh2_error() no longer allocates a string and only accepts a const - error string. I also made a lot of functions use the construct of - return libssh2_error(...) instead of having one call to - libssh2_error() and then a separate return call. In several of those - cases I then also changed the former -1 return code to a more - detailed one - something that I think will not change behaviors - anywhere but it's worth keeping an eye open for any such. + 'last_errno' holds to the error code from the SFTP protocol and + since that is 32 bits on the wire there's no point in using a + long for this internally which is larger on some platforms. -- repaired --enable-debug +- agent: make the code better deal with unexpected code flows + + agent->ops gets initialized by the libssh2_agent_connect() call + but we need to make sure that we don't segfault even if a bad + sequence of function calls is used. -Simon Josefsson (1 Mar 2010) -- Make ./configure output a summary of build options. +Alexander Lamaison (10 Jun 2010) +- Better handling of invalid key files. + + Passing an invalid public key to libssh2_userauth_publickey_fromfile_ex + triggered an assertion. Replaced this with a runtime check that rejects + obviously invalid key data. -Daniel Stenberg (1 Mar 2010) -- let the err_msg in the session struct be const too +Daniel Stenberg (10 Jun 2010) +- version: we start working on 1.2.7 now -Simon Josefsson (1 Mar 2010) -- Revert #ifdef change that pulled in AES-CTR code when explicitly disabled. +Version 1.2.6 (10 Jun 2010) -Daniel Stenberg (1 Mar 2010) -- fix #ifdefs +Daniel Stenberg (10 Jun 2010) +- NEWS: add the 1.2.6 release details -- make function match the new proto +- RELEASE-NOTES: 1.2.6 details added -Simon Josefsson (1 Mar 2010) -- Improve AES-CTR check. +Guenter Knauf (10 Jun 2010) +- fixed libssh2.dsw to use the generated libssh2.dsp; removed old *.dsp files. -Daniel Stenberg (1 Mar 2010) -- use const to silence a bazillion warnings +- moved MSVC strdup define to libssh2_config.h which we include already. -Simon Josefsson (1 Mar 2010) -- Use AES-CTR from OpenSSL when available. - - Reported by Lars Nordin . +- added missing source files to src/NMakefile. -- Make it possible to disable DSA. - - Patch from Lars Nordin . +Daniel Stenberg (8 Jun 2010) +- libssh2_poll: refer to poll(3) and select(3) instead -Peter Stuge (1 Mar 2010) -- Send and receive channel EOF before sending SSH_MSG_CHANNEL_CLOSE - - Sending SSH_MSG_CHANNEL_CLOSE without channel EOF is explicitly allowed - in RFC 4254, but some non-conforming servers will hang or time out when - the channel is closed before EOF. +- example: fix strdup() for MSVC compiles - Other common clients send and receive EOF before closing, there are no - drawbacks, and some servers need it to work correctly. + MSVC has a _strdup() that we better use. This was reported in bug -Alexander Lamaison (26 Feb 2010) -- Style improvements to knownhost error handling. +- SFTP: fail init SFTP if session isn't authenticated - Made improvements as suggested by Peter Stuge: http://www.libssh2.org/mail/libssh2-devel-archive-2010-02/0161.shtml. + Alexander Lamaison filed bug #172 + (http://trac.libssh2.org/ticket/172), and pointed out that SFTP + init would do bad if the session isn't yet authenticated at the + time of the call, so we now check for this situation and returns + an error if detected. Calling sftp_init() at this point is bad + usage to start with. -- Call libssh2_error for every knownhost API failure. - - The libssh2 API calls should set the last error code and a message when - returning a failure by calling libssh2_error. This changeset adds these - calls to the libssh2_knownhost_* API as well as libssh2_base64_decode. +- direct_tcpip: bring back inclusion of libssh2_config.h - This change also makes libssh2_error into a function rather than a macro. - Its implementation is moved to misc.c. This function returns the error - code passed to it allowing callers to return the error value directly - without duplicating the error code. - -- Fix LIBSSH2_ALLOC checks. + In order to increase portability of this example, I'm bringing + the inclusion of libssh2_config.h back, and I also added an + require that header for this example to compile. - These appear to be cut-and paste errors where the wrong variable is checked - for NULLness after calling LIBSSH2_ALLOC. - -Simon Josefsson (23 Feb 2010) -- Silence compiler warning. + I also made all code lines fit within 80 columns. -- Make it portable; test uses = for string comparison (not ==). Indent. +Guenter Knauf (3 Jun 2010) +- cast away a warning. -Alexander Lamaison (22 Feb 2010) -- libssh2_knownhost_del: fix write to freed memory. - - When removing a known host, libssh2_knownhost_del would remove the node from the linked list, free its memory and then overwrite the struct parameter (which indicated which node to remove) with 0. However, this struct is actually allocated within the just-freed node meaning we're writing to freed memory. This made Windows very upset. - - The fix is simply to overwrite the struct first before freeing the memory. +- moved CRT_SECURE_NO_DEPRECATE define up so its defined before the winsock headers are included. -Daniel Stenberg (21 Feb 2010) -- show more verbose error when SCP send fails +- fixed platform detection for MingW32 test makefile. -- libssh2_socket_t is done, a library-free function is needed +- MingW32 has gettimeofday() implemented, so proper ifdef this function here. -- clarify that this frees all data associated with a session +- removed MSVC ifdef since seems we can use __int64 still with latest headers. -- improved error handling +- changed copyright notice for MinW32 and NetWare binaries. -- add missing libssh2_error() calls - - To make sure the public API is functional and that the - BLOCK_ADJUST_ERRNO() macro works correctly we MUST make sure to - call libssh2_error() when we return errors. +- cleaned up MSVC ifdefs which where spreaded over 3 places. -- fix memory leak in userauth_keyboard_interactive() - - Mr anonymous in bug #125 pointed out that the userauth_keyboard_interactive() - function does in fact assign the same pointer a second time to a new allocated - buffer without properly freeing the previous one, which caused a memory leak. +- added uint8_t typedef for NetWare CLIB platform. -- added missing error codes - - To allow the libssh2_session_last_error() function to work as - documented, userauth_password() now better makes sure to call - libssh2_error() everywhere before it returns error. - - Pointed out by mr anonymous in bug #128 +- if the function declaration gets changed the header should be changed too. -Peter Stuge (16 Feb 2010) -- Fix resource and memory leaks in examples as reported by cppcheck - - Thanks to Ettl Martin for the report and patch. This fixes #132 +- this is MSVC specific and doesnt apply for all Win32 compilers; + the uint8_t typedef clashes with MingW32 headers. -Daniel Stenberg (15 Feb 2010) -- mention the new man pages for macros +- updated MingW32 makefiles for latest dependency lib versions. -- added man pages for API macros - - all #defined macros in the public headers are considered to be part - of the API and I've generated individual man pages for each of them - to A) make it easier to figure out what each function/macro actually - is for so that automated lookups work better and for B) make sure we - have all public functions document (both macros and functions) to - make it easier for us to work away from all the macros in a future - release. +- updated NetWare makefiles for latest dependency lib versions. -- Committed the patch by Yoichi Iwaki in bug #2929647 +Dan Fandrich (30 May 2010) +- Fixed compiling with libgcrypt - Committed the patch by Yoichi Iwaki in bug #2929647, which fixed a memory - leak when an 'outbuf' was still allocated when a session was freed. + A change of parameter types from unsigned long to size_t was + missed in the prototype in libgcrypt.h -- free "outbuf" when killing a session +Daniel Stenberg (28 May 2010) +- statvfs: use libssh2_sftp_statvfs only, no "_ex" - Fix memoary leak: if there was an "output" still allocated when a - session was torn down it needs to be freed in session_free() + As the long-term goal is to get rid of the extensive set of + macros from the API we can just as well start small by not adding + new macros when we add new functions. Therefore we let the + function be libssh2_sftp_statvfs() plainly without using an _ex + suffix. - Patch by Yoichi Iwaki in bug #2929647 - -- the working version name is now 1.2.5_DEV + I also made it use size_t instead of unsigned int for the string + length as that too is a long-term goal for the API. -Version 1.2.4 (13 Feb 2010) +- [Grubsky Grigory brought this change] -Daniel Stenberg (13 Feb 2010) -- updated info for 1.2.4 + DSP: output lib name typo -Dan Fandrich (10 Feb 2010) -- Allow compiling with OpenSSL when AES isn't available. +- [Grubsky Grigory brought this change] -Peter Stuge (9 Feb 2010) -- [Dave McCaldon brought this change] + win32: provide a uint8_t typedef for better building on windows - Fix Tru64 socklen_t compile issue with example/direct_tcpip.c - - Building libssh2-1.2.3 on Tru64 fails at line 48 and 166 because socklen_t - isn't defined on Tru64 unless _POSIX_PII_SOCKET is defined. +- agent: win32: fix bad _libssh2_store_str call - This patch updates configure.ac to add -D_POSIX_PII_SOCKET when building - on Tru64 platform(s). + As pointed out by Grubsky Grigory , I + made a mistake when I added the _libssh2_store_str() call before + and I made a slightly different patch than what he suggested. + Based purely on taste. -- [Dave McCaldon brought this change] +Peter Stuge (24 May 2010) +- [Joey Degges brought this change] - Resolve compile issues on Solaris x64 and UltraSPARC - - Solaris builds of libssh2-1.2.3 failed on both x64 and UltraSPARC - platforms because of two problems: + Add libssh2_sftp_statvfs() and libssh2_sftp_fstatvfs() - 1) src/agent.c:145 sun is a reserved word when using the SUNWspro compiler - 2) example/direct_tcpip.c:84 INADDR_NONE is not defined + These can be used to get file system statistics from servers that + support the statvfs@openssh.com and fstatvfs@openssh.com extensions. -Daniel Stenberg (3 Feb 2010) -- towards 1.2.4 now +Alexander Lamaison (22 May 2010) +- [Jose Baars brought this change] -Version 1.2.3 (3 Feb 2010) + VMS specific: make sure final release can be installed over daily build -Daniel Stenberg (3 Feb 2010) -- Version 1.2.3 (February 3, 2010) +- [Jose Baars brought this change] -- fix building out of source tree by proving better include path - - when building out of source tree, we provide -I$(top_builddir)/example - since the libssh2_config.h gets generated in that dir + VMS: small improvement to the man2help utilities -Peter Stuge (1 Feb 2010) -- [Sofian Brabez brought this change] +Peter Stuge (22 May 2010) +- [Joey Degges brought this change] - Replace : in hexdump with " " (two spaces) + libssh2_exit and libssh2_sftp_readdir man page fixes -- Detect when the forwarded connection is closed in example/direct_tcpip.c +Daniel Stenberg (21 May 2010) +- spelling: s/sue/use -- Fix example/direct_tcpip.c to work also on WIN32 +Alexander Lamaison (21 May 2010) +- Change magic port number for generic knownhost check. - read() and write() are no good for WIN32 sockets, use recv() and send(). + libssh2_knownhost_checkp took 0 as a magic port number that indicated + a 'generic' check should be performed. However, 0 is a valid port + number in its own right so this commit changes the magic value to any + negative int. -- Ignore libssh2_config.h.in and stamp-h2 in example/ and remove .cvsignore +Mikhail Gusarov (5 May 2010) +- Add re-discovered copyright holders to COPYING -- Simplify WIN32 ifdefs in example/direct_tcpip.c to allow standalone compile +- Restoring copyright statements from pre-git era + + Eli Fant has contributed fragmenting SFTP requests -- Always #define INVALID_SOCKET -1 in libssh2_priv.h when not on win32 +- Restoring my copyright statements from pre-git era - Fix broken builds since commit abd9bd0bbe631efeada1f54552c70b54e1c490c1 - for all non-win32 platforms. + keyboard_interactive, 'exit-status' information packet, non-atomic read/write + under FreeBSD, multi-channel operation bugfixes. -- Include hmac-md5 and hmac-md5-96 only if crypto backend supports MD5 +Daniel Stenberg (3 May 2010) +- pedantic: make the code C90 clean -- Use LIBSSH2_HOSTKEY_HASH_SHA1 instead of _MD5 in examples and tests - - MD5 support is optional and may not always be available, while SHA1 is both - required and recommended. +Peter Stuge (3 May 2010) +- Do proper keyboard-interactive user dialog in the sftp.c example -- Update mailing list address in configure.ac to @cool.haxx.se +Daniel Stenberg (3 May 2010) +- added to tarball: libssh2_knownhost_checkp.3 -- Make example/direct_tcpip.c compile for win32 +- knownhost: support [host]:port in knownhost file + + OpenSSH has ways to add hosts to the knownhosts file that include + a specific port number which makes the key associated with only + that specific host+port pair. libssh2 previously did not support + this, and I was forced to add a new function to the API to + properly expose this ability to applications: + libssh2_knownhost_checkp() - One warning from FD_SET() remains, it is also in some other examples. + To *add* such hosts to the knownhosts file, you make sure to pass + on the host name in that manner to the libssh2_knownhost_addc() + function. -- Correctly check for an invalid socket in session_startup() +- init/exit: mention these were added in 1.2.5 -- Small documentation fix after Dave's _USERAUTH_FAILURE improvement +- libssh2_knownhost_check docs: correct the prototype -- [Dave McCaldon brought this change] +- examples: avoid use of uninitialized variable 'sock' - Handle SSH_MSG_USERAUTH_FAILURE for password and kbd-int authentication - - Neither libssh2_userauth_password_ex() nor - libssh2_userauth_keyboard_interactive_ex() would return a login failure - error if the server responded with a SSH_MSG_USERAUTH_FAILURE, instead - you would see whatever previous error had occurred, typically - LIBSSH2_ERROR_EAGAIN. +- KEX: stop pretending we negotiate language - This patch changes error code -18 to LIBSSH2_ERROR_AUTHENTICATION_FAILED - and makes LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED an alias for - LIBSSH2_ERROR_AUTHENTICATION_FAILED. In addition, new logic in - userauth_password() properly handles SSH_MSG_USERAUTH_FAILURE and both - this function and userauth_keyboard_interactive() now properly return - LIBSSH2_ERROR_AUTHENTICATION_FAILED. + There was some stub-like parts of an implementation for + implementing kex language negotiation that caused clang-analyzer + to warn and as it did nothing I've now removed the dead code. -Simon Josefsson (28 Jan 2010) -- Fix. +- Uninitialized argument -- Also deal with GLOBAL_REQUEST keep-alives. +- sftpdir: removed dead assignment -- Make OpenSSH-style keepalive work against libssh2 clients. +- Makefile.am: include the VMS-specific config header as well -Daniel Stenberg (27 Jan 2010) -- clarified +- [Jose Baars brought this change] -Peter Stuge (26 Jan 2010) -- [Dave McCaldon brought this change] + Add VMS specific libssh2_config.h - Fix trace context lookup in libssh2_debug() - - The trace context is actually a bitmask so that tracing output can be - controlled by setting a bitmask using libssh2_trace(). However, the logic - in libssh2_debug() that converted the context to a string was using the - context value as an array index. Because the code used a bounds check on - the array, there was never a danger of a crash, but you would certainly - either get the wrong string, or "unknown". +- fix Value stored to 's' is never read warning - This patch adds a lookup that iterates over the context strings and uses - it's index to check for the corresponding bit in the context. + and moved variable declaration of s to be more local -- Fix typo in RELEASE-NOTES +- kexinit: simplify the code and avoid scan-build warning + + Previously it would say "Value stored to 's' is never read" due + fourth increment of 's'. -Daniel Stenberg (20 Jan 2010) -- updated for 1.2.3 with all the stuff I found in the log +Alexander Lamaison (28 Apr 2010) +- Removed unecessary brackets. -- ignore more generated files +- Changed sftp_attrsize macro to a static function. -- [Dave McCaldon brought this change] +Daniel Stenberg (28 Apr 2010) +- release: include the VMS-specific files - Pass user context through libssh2_trace_sethandler() to callback - - The libssh2_trace_sethandler() call allows the user to handle the output of libssh2 rather than having it written to stderr. This patch updates libssh2_trace_sethandler() to allow a user-defined void* context value to be passed back to the output handler. +- sftp_attrsize: protect the macro argument with proper parentheses -- [Dave McCaldon brought this change] +- ssh2_agent: avoid using 'session' uninitialized on failures - Add libssh2_trace_sethandler() to the API (even more) +- examples: remove assignments of variable rc that's never used -- [Dave McCaldon brought this change] +- publickey_init: remove useless variable increment - Add libssh2_trace_sethandler() to the API +- hostkey_method_ssh_rsa_init: remove useless variable increment -- cleanup includes +- packet_x11_open: removed useless variable increment - We now produce a local libssh2_config.h file in this dir for the - examples to use so I cleaned up the include path at the same time. + and made the declaration of a variable more local -- generate a libssh2_config.h in the example dir +- packet_queue_listener: removed useless variable increment - buildconf copies the template to example/ and configure makes sure - to generate a proper file from it and the direct_tcpip.c example - is the first one to use it - to make sure it builds fine on more - paltforms - -Simon Josefsson (13 Jan 2010) -- Remove redundant #includes and reorder sys/types.h include. - -Daniel Stenberg (10 Jan 2010) -- avoid a free(NULL) + and made the declaration of a variable more local -Simon Josefsson (7 Jan 2010) -- Make it simpler to get more debug info. +- sftp_read: move a read_responses array to where its used + + I find that this increases readability since the array is used + only in the function call just immediately below and nowhere + else. -Daiki Ueno (1 Jan 2010) -- Simplify the commit 63457dfa using type cast from size_t * to ulong *. +- sftp_readdir: turn a small array static const and move it -Alexander Lamaison (30 Dec 2009) -- Fixed memory leak in userauth_publickey(). +- sftp_attrsize: converted function to a macro - userauth_publickey_fromfile() reads the key from a - file using file_read_publickey() which returns two - allocated strings, the decoded key and the key - method (such as "ssh-dss"). The latter can be - derived from the former but returning both avoids a - later allocation while doing so. + This way, the macro can evaluate a static number at compile time + for two out of four uses, and it probably runs faster for the + other two cases too. + +- sftp_open: deal with short channel_write calls - Older versions of userauth_publickey_fromfile() used - this method string directly but when - userauth_publickey() was factored out of - userauth_publickey_fromfile() it derived the method - from the key itself. This resulted in the method - being allocated twice. + This was an old TODO that just wasn't done before. If + channel_write returns short, that is not an error. + +- sftp_open: clean up, better check of input data - This fix, which maintains the optimisation that - avoids an extra allocation, changes - userauth_publickey() so it doesn't allocate and - derive the method when userauth_pblc_method already - has a value. + The clang-analyzer report made it look into this function and + I've went through it to remove a potential use of an + uninitialized variable and I also added some validation of input + data received from the server. - Signed-off-by: Alexander Lamaison + In general, lots of more code in this file need to validate the + input before assuming it is correct: there are servers out there + that have bugs or just have another idea of how to do the SFTP + protocol. -Daiki Ueno (25 Dec 2009) -- Fix the return value description of libssh2_knownhost_free(). +- bugfix: avoid using the socket if it failed to create one -- Fix compiler warnings for size_t pointers on 32-bit Windows. +- bugfix: potential use of NULL pointer -- Define INVALID_SOCKET and use it instead of SOCKET_BAD. +- libssh2_userauth_password_ex: clarify errors somewhat - Revert the part of previous commit that defines SOCKET_BAD library wide. - -- Use libssh2_socket_t in the ssh-agent stuff. - Define a portability macro SOCKET_BAD which means "invalid socket". - -- Mark/unmark connection to Pageant is open/close. - -- Add test to check if the socket is connected. - -Peter Stuge (24 Dec 2009) -- Add libssh2.pc to top-level .gitignore - -- Fix publickey authentication regression + The errors mentioned in this man page are possible return codes + but not necessarily the only return codes that this can return. - Commit 70b199f47659a74b8778c528beccf893843e5ecb introduced a parsing - bug in file_read_publickey() which made the algorithm name contain an - extra trailing space character, breaking all publickey authentication. - -- Add a direct-tcpip example which shows local port forwarding - -- Add session parameter and LIBSSH2_TRACE_SOCKET to libssh2_trace(3) man page - -- Add TODO: Expose error messages sent by the server - -Daiki Ueno (23 Dec 2009) -- Fix doc comments. + Also reformatted the typ prototypes somewhat. -- Add man pages for ssh-agent API. +- examples: fixed and made them more similar + + The channel read/write functions can return 0 in legitimate cases + without it being an error, and we need to loop properly if they + return short. -- Don't request userauthlist after authentication. +- [Jose Baars brought this change] -Simon Josefsson (21 Dec 2009) -- Add. + VMS port of libssh2; changes in the libssh2 common code -- [Daiki Ueno brought this change] +- Makefile: added the two news headers userauth.h and session.h - Add an example to use ssh-agent API. +- cleanup: prefer the internal functions - Signed-off-by: Simon Josefsson - -- [Daiki Ueno brought this change] - - Add ssh-agent API. + To get the blocking vs non-blocking to work as smooth as possible + and behave better internally, we avoid using the external + interfaces when calling functions internally. - Signed-off-by: Simon Josefsson + Renamed a few internal functions to use _libssh2 prefix when not + being private within a file, and removed the libssh2_ for one + that was private within the file. -- [Daiki Ueno brought this change] +- session_free: remove dead code - Add callback-based API for publickey auth. +- libssh2_publickey_init: fixed to work better non-blocking - Signed-off-by: Simon Josefsson - -- Move examples from example/simple to example/. - -- Move examples from example/simple to example/. - -Daniel Stenberg (17 Dec 2009) -- _libssh2_list_insert() fixed to work + This was triggered by a clang-analyzer complaint that turned out + to be valid, and it made me dig deeper and fix some generic non- + blocking problems I disovered in the code. - While this is code not currently in use, it is part of the generic linked - list code and since I found the error I thought I'd better fix it since we - might bring in this function into the code one day. + While cleaning this up, I moved session-specific stuff over to a + new session.h header from the libssh2_priv.h header. -Simon Josefsson (16 Dec 2009) -- Silence compiler warnings. +- channel: reduce duplicated free and returns - Based on patch by Kamil Dudka in - . - -- [Kamil Dudka brought this change] + Simplified the code by trying to free data and return on a single + spot. - libgcrypt: simplify code of _libssh2_dsa_sha1_sign +- channel: make variables more local - Signed-off-by: Simon Josefsson + By making 'data' and 'data_len' more local in several places in + this file it will be easier to spot how they are used and we'll + get less risks to accidentally do bad things with them. -- [Kamil Dudka brought this change] +Mikhail Gusarov (24 Apr 2010) +- Fix typos in manpages, catched by Lintian - libgcrypt: follow-up for ssh-dss padding fix +Daniel Stenberg (24 Apr 2010) +- channel_request_pty: simplify the code - Signed-off-by: Simon Josefsson - -Dan Fandrich (15 Dec 2009) -- Check for the right environment variable in the test app + clang-analyzer pointed out how 'data' could be accessed as a NULL + pointer if the wrong state was set, and while I don't see that + happen in real-life the code flow is easier to read and follow by + moving the LIBSSH2_FREE() call into the block that is supposed to + deal with the data pointer anyway. -Simon Josefsson (14 Dec 2009) -- Silence warning about unused function parameter. +- libssh2_channel_process_startup: simplify the code - Reported by Steven Van Ingelgem . + clang-analyzer pointed out how 'data' could be accessed as a NULL + pointer if the wrong state was set, and while I don't see that + happen in real-life the code flow is easier to read and follow by + moving the LIBSSH2_FREE() call into the block that is supposed to + deal with the data pointer anyway. -Daniel Stenberg (10 Dec 2009) -- avoid returning data to memory already freed +- sftp_close_handle: add precation to not access NULL pointer - In case of failure we must make sure that the data we return - doesn't point to a memory area already freed. Reported anonymously - in the bug report #2910103. + clang-analyzer pointed this out as a "Pass-by-value argument in + function call is undefined" but while I can't see exactly how + this can ever happen in reality I think a little check for safety + isn't such a bad thing here. -Peter Stuge (8 Dec 2009) -- Use LIBSSH2_TRACE_* internally and remove redundant LIBSSH2_DBG_* +- scp_write_nonblock: Value stored to 'nread' is never read -- Add LIBSSH2_TRACE_SOCKET context for tracing send() and recv() - - Helpful in debugging the -39 errors. +- scp_write: Value stored to 'ptr' is never read -- Another transport layer fix for bogus -39 (LIBSSH2_ERROR_BAD_USE) errors - - Commit 683aa0f6b52fb1014873c961709102b5006372fc made send_existing() send - more than just the second part of a packet when the kernel did not accept - the full packet, but the function still overlooked the SSH protocol - overhead in each packet, often 48 bytes. - - If only the last few bytes of a packet remained, then the packet would - erroneously be considered completely sent, and the next call to write - more data in the session would return a -39 error. +- scp_write_nonblock: Value stored to 'ptr' is never read -Daniel Stenberg (6 Dec 2009) -- move local variable to be more localized +- sftp_mkdir: less silly output but show failures -- fixed some indent mistakes +- [Jose Baars brought this change] -Peter Stuge (6 Dec 2009) -- Fix padding in ssh-dss signature blob encoding - - DSA signatures consist of two 160-bit integers called r and s. In ssh-dss - signature blobs r and s are stored directly after each other in binary - representation, making up a 320-bit (40 byte) string. (See RFC4253 p14.) - - The crypto wrappers in libssh2 would either pack r and s incorrectly, or - fail, when at least one integer was small enough to be stored in 19 bytes - or less. - - The patch ensures that r and s are always stored as two 160 bit numbers. + VMS port of libssh2 including VMS specific build procedures -- Don't always clear write direction blocking flag +- two variable types changes, made lines less than 80 columns - When libssh2_transport_write() is called to continue sending a - partially sent packet the write direction flag must not be cleared - until the previous packet has been completely sent, or the app would - hang if the packet still isn't sent completely, since select() gets - called by the internal blocking emulation layer in libssh2 but would - then not be watching the socket for writability. + The two variable type changes are only to match type variable + fields actually read from the binary protocol. + +- remove check for negative padding_length - Clear the flag only once processing of previous packet data is - complete and a new packet is about to be prepared. + It was silly, since it is read as an unsigned char... -Alexander Lamaison (24 Nov 2009) -- Detabify. +- hostkey_method_ssh_dss_init: Value stored to 's' is never read -- [Daniel Stenberg brought this change] +- libssh2_banner_set: avoid unnecessary increment and explain code + +- agent_transact_unix: remove unused variable - Fixed memory leak in sftp_fstat(). +- remove two unnecessary increments -Simon Josefsson (17 Nov 2009) -- Mark date of 1.2.2 release. +- more code converted to use _libssh2_store_*() -- Merge branch 'master' of ssh://git.stuge.se/var/lib/git/libssh2 +- libssh2_publickey_list_fetch: removed unused variables -Version 1.2.2 (16 Nov 2009) +- libssh2_publickey_init: remove unused variables -Daniel Stenberg (16 Nov 2009) -- prepared for 1.2.2 +- libssh2_scp_send64: added to API to provide large file transfers + + The previously existing libssh2_scp_send_ex() function has no way + to send files that are larger than 'size_t' which on 32bit + systems mean 4GB. This new API uses a libssh2_int64_t type and + should thus on most modern systems be able to send enormous + files. -Simon Josefsson (16 Nov 2009) -- Improve NEWS items. +- sftp_init: remove unused variables and assignments -- Support AES-Counter ciphers. +- libssh2_knownhost_check: Value stored to 'keylen' is never read -- Silence compiler warning. - - Reported by Steven Van Ingelgem - in . +- hostkey: fix compiler warning diff --git a/vendor/libssh2/RELEASE-NOTES b/vendor/libssh2/RELEASE-NOTES index d566bafe0..98cb8033b 100644 --- a/vendor/libssh2/RELEASE-NOTES +++ b/vendor/libssh2/RELEASE-NOTES @@ -1,12 +1,44 @@ -libssh2 1.8.2 - -This release includes the following bugfixes: - - o Fixed the misapplied userauth patch that broke 1.8.1 - o moved the MAX size declarations from the public header +libssh2 1.9.0 +This release includes the following enhancements and bugfixes: + + o adds ECDSA keys and host key support when using OpenSSL + o adds ED25519 key and host key support when using OpenSSL 1.1.1 + o adds OpenSSH style key file reading + o adds AES CTR mode support when using WinCNG + o adds PEM passphrase protected file support for Libgcrypt and WinCNG + o adds SHA256 hostkey fingerprint + o adds libssh2_agent_get_identity_path() and libssh2_agent_set_identity_path() + o adds explicit zeroing of sensitive data in memory + o adds additional bounds checks to network buffer reads + o adds the ability to use the server default permissions when creating sftp directories + o adds support for building with OpenSSL no engine flag + o adds support for building with LibreSSL + o increased sftp packet size to 256k + o fixed oversized packet handling in sftp + o fixed building with OpenSSL 1.1 + o fixed a possible crash if sftp stat gets an unexpected response + o fixed incorrect parsing of the KEX preference string value + o fixed conditional RSA and AES-CTR support + o fixed a small memory leak during the key exchange process + o fixed a possible memory leak of the ssh banner string + o fixed various small memory leaks in the backends + o fixed possible out of bounds read when parsing public keys from the server + o fixed possible out of bounds read when parsing invalid PEM files + o no longer null terminates the scp remote exec command + o now handle errors when diffie hellman key pair generation fails + o fixed compiling on Windows with the flag STDCALL=ON + o improved building instructions + o improved unit tests + This release would not have looked like this without help, code, reports and advice from friends like these: - Will Cosgrove - (1 contributors) + Peter Surge, Will Cosgrove, Daniel Stenberg, Alex Arslan, Alex Crichton, + Thomas Bleeker, Keno Fischer, Marc Hörsken, Marcel Raad, Viktor Szakats, + Kamil Dudka, Panos, Etienne Samson, Tseng Jun, Brendan Shanks, doublex, + Erik B, Jakob Egger, Thomas Lochmatter, alex-weaver, Adrian Moran, Zenju, + gartens, Matthew D. Fuller, Ryan Kelley, Zhen-Huan HWANG, Orivej Desh, + Alexander Curtiss + + (29 contributors) diff --git a/vendor/libssh2/acinclude.m4 b/vendor/libssh2/acinclude.m4 index 734ef070c..a0044fc47 100644 --- a/vendor/libssh2/acinclude.m4 +++ b/vendor/libssh2/acinclude.m4 @@ -382,86 +382,130 @@ AC_DEFUN([CURL_CONFIGURE_REENTRANT], [ # ]) -AC_DEFUN([LIBSSH2_CHECKFOR_MBEDTLS], [ - - old_LDFLAGS=$LDFLAGS - old_CFLAGS=$CFLAGS - if test -n "$use_mbedtls" && test "$use_mbedtls" != "no"; then - LDFLAGS="$LDFLAGS -L$use_mbedtls/lib" - CFLAGS="$CFLAGS -I$use_mbedtls/include" - fi +dnl LIBSSH2_LIB_HAVE_LINKFLAGS +dnl -------------------------- +dnl Wrapper around AC_LIB_HAVE_LINKFLAGS to also check $prefix/lib, if set. +dnl +dnl autoconf only checks $prefix/lib64 if gcc -print-search-dirs output +dnl includes a directory named lib64. So, to find libraries in $prefix/lib +dnl we append -L$prefix/lib to LDFLAGS before checking. +dnl +dnl For conveniece, $4 is expanded if [lib]$1 is found. - AC_LIB_HAVE_LINKFLAGS([mbedtls], [], [ - #include - ]) +AC_DEFUN([LIBSSH2_LIB_HAVE_LINKFLAGS], [ + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" - if test "$ac_cv_libmbedtls" = "yes"; then - AC_DEFINE(LIBSSH2_MBEDTLS, 1, [Use mbedtls]) - LIBSREQUIRED= # mbedtls doesn't provide a .pc file - LIBS="$LIBS -lmbedtls -lmbedcrypto" - found_crypto=libmbedtls - support_clear_memory=yes - else - # restore - LDFLAGS=$old_LDFLAGS - CFLAGS=$old_CFLAGS + if test "${with_lib$1_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_lib$1_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_lib$1_prefix}/lib" fi -]) -AC_DEFUN([LIBSSH2_CHECKFOR_GCRYPT], [ + AC_LIB_HAVE_LINKFLAGS([$1], [$2], [$3]) - old_LDFLAGS=$LDFLAGS - old_CFLAGS=$CFLAGS - if test -n "$use_libgcrypt" && test "$use_libgcrypt" != "no"; then - LDFLAGS="$LDFLAGS -L$use_libgcrypt/lib" - CFLAGS="$CFLAGS -I$use_libgcrypt/include" - fi - AC_LIB_HAVE_LINKFLAGS([gcrypt], [], [ - #include - ]) + LDFLAGS="$libssh2_save_LDFLAGS" - if test "$ac_cv_libgcrypt" = "yes"; then - AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use libgcrypt]) - LIBSREQUIRED= # libgcrypt doesn't provide a .pc file. sad face. - LIBS="$LIBS -lgcrypt" - found_crypto=libgcrypt + if test "$ac_cv_lib$1" = "yes"; then : + $4 else - # restore - LDFLAGS=$old_LDFLAGS - CFLAGS=$old_CFLAGS + CPPFLAGS="$libssh2_save_CPPFLAGS" fi ]) +AC_DEFUN([LIBSSH2_CHECK_CRYPTO], [ +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "$1"; then +m4_case([$1], +[openssl], [ + LIBSSH2_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include ], [ + AC_DEFINE(LIBSSH2_OPENSSL, 1, [Use $1]) + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto" + + # Not all OpenSSL have AES-CTR functions. + libssh2_save_LIBS="$LIBS" + LIBS="$LIBS $LIBSSL" + AC_CHECK_FUNCS(EVP_aes_128_ctr) + LIBS="$libssh2_save_LIBS" + + found_crypto="$1" + found_crypto_str="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})" + ]) +], + +[libgcrypt], [ + LIBSSH2_LIB_HAVE_LINKFLAGS([gcrypt], [], [#include ], [ + AC_DEFINE(LIBSSH2_LIBGCRYPT, 1, [Use $1]) + found_crypto="$1" + ]) +], -AC_DEFUN([LIBSSH2_CHECKFOR_WINCNG], [ +[mbedtls], [ + LIBSSH2_LIB_HAVE_LINKFLAGS([mbedcrypto], [], [#include ], [ + AC_DEFINE(LIBSSH2_MBEDTLS, 1, [Use $1]) + found_crypto="$1" + support_clear_memory=yes + ]) +], +[wincng], [ # Look for Windows Cryptography API: Next Generation - AC_LIB_HAVE_LINKFLAGS([bcrypt], [], [ - #include - #include - ]) - AC_LIB_HAVE_LINKFLAGS([crypt32], [], [ + AC_CHECK_HEADERS([ntdef.h ntstatus.h], [], [], [#include ]) + AC_CHECK_DECLS([SecureZeroMemory], [], [], [#include ]) + + LIBSSH2_LIB_HAVE_LINKFLAGS([crypt32], [], [ #include #include ]) - AC_CHECK_HEADERS([ntdef.h ntstatus.h], [], [], [ - #include - ]) - AC_CHECK_DECLS([SecureZeroMemory], [], [], [ + LIBSSH2_LIB_HAVE_LINKFLAGS([bcrypt], [], [ #include + #include + ], [ + AC_DEFINE(LIBSSH2_WINCNG, 1, [Use $1]) + found_crypto="$1" + found_crypto_str="Windows Cryptography API: Next Generation" + support_clear_memory="$ac_cv_have_decl_SecureZeroMemory" ]) +], +) + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No $1 crypto library found! +" +fi +]) - if test "$ac_cv_libbcrypt" = "yes"; then - AC_DEFINE(LIBSSH2_WINCNG, 1, [Use Windows CNG]) - LIBSREQUIRED= # wincng doesn't provide a .pc file. sad face. - LIBS="$LIBS -lbcrypt" - if test "$ac_cv_libcrypt32" = "yes"; then - LIBS="$LIBS -lcrypt32" - fi - found_crypto="Windows Cryptography API: Next Generation" - if test "$ac_cv_have_decl_SecureZeroMemory" = "yes"; then - support_clear_memory=yes - fi + +dnl LIBSSH2_CHECK_OPTION_WERROR +dnl ------------------------------------------------- +dnl Verify if configure has been invoked with option +dnl --enable-werror or --disable-werror, and set +dnl shell variable want_werror as appropriate. + +AC_DEFUN([LIBSSH2_CHECK_OPTION_WERROR], [ + AC_BEFORE([$0],[LIBSSH2_CHECK_COMPILER])dnl + AC_MSG_CHECKING([whether to enable compiler warnings as errors]) + OPT_COMPILER_WERROR="default" + AC_ARG_ENABLE(werror, +AC_HELP_STRING([--enable-werror],[Enable compiler warnings as errors]) +AC_HELP_STRING([--disable-werror],[Disable compiler warnings as errors]), + OPT_COMPILER_WERROR=$enableval) + case "$OPT_COMPILER_WERROR" in + no) + dnl --disable-werror option used + want_werror="no" + ;; + default) + dnl configure option not specified + want_werror="no" + ;; + *) + dnl --enable-werror option used + want_werror="yes" + ;; + esac + AC_MSG_RESULT([$want_werror]) + + if test X"$want_werror" = Xyes; then + CFLAGS="$CFLAGS -Werror" fi ]) + diff --git a/vendor/libssh2/configure b/vendor/libssh2/configure index ac4d4931c..a983da2ce 100755 --- a/vendor/libssh2/configure +++ b/vendor/libssh2/configure @@ -646,36 +646,34 @@ LIBZ_PREFIX LTLIBZ LIBZ HAVE_LIBZ -OS400QC3_FALSE -OS400QC3_TRUE +WINCNG_FALSE +WINCNG_TRUE MBEDTLS_FALSE MBEDTLS_TRUE LIBGCRYPT_FALSE LIBGCRYPT_TRUE -WINCNG_FALSE -WINCNG_TRUE OPENSSL_FALSE OPENSSL_TRUE -LIBSSL_PREFIX -LTLIBSSL -LIBSSL -HAVE_LIBSSL -LIBMBEDTLS_PREFIX -LTLIBMBEDTLS -LIBMBEDTLS -HAVE_LIBMBEDTLS -LIBCRYPT32_PREFIX -LTLIBCRYPT32 -LIBCRYPT32 -HAVE_LIBCRYPT32 LIBBCRYPT_PREFIX LTLIBBCRYPT LIBBCRYPT HAVE_LIBBCRYPT +LIBCRYPT32_PREFIX +LTLIBCRYPT32 +LIBCRYPT32 +HAVE_LIBCRYPT32 +LIBMBEDCRYPTO_PREFIX +LTLIBMBEDCRYPTO +LIBMBEDCRYPTO +HAVE_LIBMBEDCRYPTO LIBGCRYPT_PREFIX LTLIBGCRYPT LIBGCRYPT HAVE_LIBGCRYPT +LIBSSL_PREFIX +LTLIBSSL +LIBSSL +HAVE_LIBSSL LT_SYS_LIBRARY_PATH OTOOL64 OTOOL @@ -813,17 +811,14 @@ with_gnu_ld with_sysroot enable_libtool_lock enable_largefile -with_openssl -with_libgcrypt +with_crypto enable_rpath +with_libssl_prefix with_libgcrypt_prefix -with_wincng -with_libbcrypt_prefix +with_libmbedcrypto_prefix with_libcrypt32_prefix -with_mbedtls -with_libmbedtls_prefix +with_libbcrypt_prefix with_libz -with_libssl_prefix with_libz_prefix enable_crypt_none enable_mac_none @@ -832,6 +827,7 @@ enable_clear_memory enable_debug enable_hidden_symbols enable_examples_build +enable_werror ' ac_precious_vars='build_alias host_alias @@ -1501,6 +1497,8 @@ Optional Features: --enable-examples-build Build example applications (this is the default) --disable-examples-build Do not build example applications + --enable-werror Enable compiler warnings as errors + --disable-werror Disable compiler warnings as errors Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1513,22 +1511,20 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). - --with-openssl Use OpenSSL for crypto - --with-libgcrypt Use libgcrypt for crypto + --with-crypto=auto|openssl|libgcrypt|mbedtls|wincng + Select crypto backend (default: auto) --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libssl-prefix[=DIR] search for libssl in DIR/include and DIR/lib + --without-libssl-prefix don't search for libssl in includedir and libdir --with-libgcrypt-prefix[=DIR] search for libgcrypt in DIR/include and DIR/lib --without-libgcrypt-prefix don't search for libgcrypt in includedir and libdir - --with-wincng Use Windows CNG for crypto - --with-libbcrypt-prefix[=DIR] search for libbcrypt in DIR/include and DIR/lib - --without-libbcrypt-prefix don't search for libbcrypt in includedir and libdir + --with-libmbedcrypto-prefix[=DIR] search for libmbedcrypto in DIR/include and DIR/lib + --without-libmbedcrypto-prefix don't search for libmbedcrypto in includedir and libdir --with-libcrypt32-prefix[=DIR] search for libcrypt32 in DIR/include and DIR/lib --without-libcrypt32-prefix don't search for libcrypt32 in includedir and libdir - --with-mbedtls Use mbedTLS for crypto - --with-libmbedtls-prefix[=DIR] search for libmbedtls in DIR/include and DIR/lib - --without-libmbedtls-prefix don't search for libmbedtls in includedir and libdir - --with-libz Use zlib for compression - --with-libssl-prefix[=DIR] search for libssl in DIR/include and DIR/lib - --without-libssl-prefix don't search for libssl in includedir and libdir + --with-libbcrypt-prefix[=DIR] search for libbcrypt in DIR/include and DIR/lib + --without-libbcrypt-prefix don't search for libbcrypt in includedir and libdir + --with-libz Use libz for compression --with-libz-prefix[=DIR] search for libz in DIR/include and DIR/lib --without-libz-prefix don't search for libz in includedir and libdir @@ -14052,18 +14048,31 @@ rm -rf conftest* fi +# Crypto backends + found_crypto=none +found_crypto_str="" +support_clear_memory=no +crypto_errors="" + + + + + -# Configure parameters -# Check whether --with-openssl was given. -if test "${with_openssl+set}" = set; then : - withval=$with_openssl; use_openssl=$withval +# Check whether --with-crypto was given. +if test "${with_crypto+set}" = set; then : + withval=$with_crypto; use_crypto=$withval else - use_openssl=auto + use_crypto=auto + fi +case "${use_crypto}" in + auto|openssl|libgcrypt|mbedtls|wincng) + if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else @@ -14246,16 +14255,15 @@ fi fi -# Check whether --with-libgcrypt was given. -if test "${with_libgcrypt+set}" = set; then : - withval=$with_libgcrypt; use_libgcrypt=$withval +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "openssl"; then - old_LDFLAGS=$LDFLAGS - old_CFLAGS=$CFLAGS - if test -n "$use_libgcrypt" && test "$use_libgcrypt" != "no"; then - LDFLAGS="$LDFLAGS -L$use_libgcrypt/lib" - CFLAGS="$CFLAGS -I$use_libgcrypt/include" + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_libssl_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libssl_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libssl_prefix}/lib" fi @@ -14267,6 +14275,7 @@ if test "${with_libgcrypt+set}" = set; then : + use_additional=yes acl_save_prefix="$prefix" @@ -14281,9 +14290,9 @@ if test "${with_libgcrypt+set}" = set; then : prefix="$acl_save_prefix" -# Check whether --with-libgcrypt-prefix was given. -if test "${with_libgcrypt_prefix+set}" = set; then : - withval=$with_libgcrypt_prefix; +# Check whether --with-libssl-prefix was given. +if test "${with_libssl_prefix+set}" = set; then : + withval=$with_libssl_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -14308,14 +14317,14 @@ if test "${with_libgcrypt_prefix+set}" = set; then : fi - LIBGCRYPT= - LTLIBGCRYPT= - INCGCRYPT= - LIBGCRYPT_PREFIX= + LIBSSL= + LTLIBSSL= + INCSSL= + LIBSSL_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= - names_next_round='gcrypt ' + names_next_round='ssl crypto' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= @@ -14334,9 +14343,9 @@ fi if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" - test -z "$value" || LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$value" + test -z "$value" || LIBSSL="${LIBSSL}${LIBSSL:+ }$value" eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$value" + test -z "$value" || LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$value" else : fi @@ -14393,7 +14402,7 @@ fi fi fi if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIBGCRYPT; do + for x in $LDFLAGS $LTLIBSSL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14452,10 +14461,10 @@ fi done fi if test "X$found_dir" != "X"; then - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$found_dir -l$name" + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" else haveit= for x in $ltrpathdirs; do @@ -14468,10 +14477,10 @@ fi ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then @@ -14484,7 +14493,7 @@ fi fi else haveit= - for x in $LDFLAGS $LIBGCRYPT; do + for x in $LDFLAGS $LIBSSL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14500,28 +14509,28 @@ fi fi done if test -z "$haveit"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir" + LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" else - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" + LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_a" + LIBSSL="${LIBSSL}${LIBSSL:+ }$found_a" else - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir -l$name" + LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - LIBGCRYPT_PREFIX="$basedir" + LIBSSL_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac @@ -14536,7 +14545,7 @@ fi fi fi if test -z "$haveit"; then - for x in $CPPFLAGS $INCGCRYPT; do + for x in $CPPFLAGS $INCSSL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14553,7 +14562,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then - INCGCRYPT="${INCGCRYPT}${INCGCRYPT:+ }-I$additional_includedir" + INCSSL="${INCSSL}${INCSSL:+ }-I$additional_includedir" fi fi fi @@ -14581,7 +14590,7 @@ fi fi if test -z "$haveit"; then haveit= - for x in $LDFLAGS $LIBGCRYPT; do + for x in $LDFLAGS $LIBSSL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14598,11 +14607,11 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$additional_libdir" + LIBSSL="${LIBSSL}${LIBSSL:+ }-L$additional_libdir" fi fi haveit= - for x in $LDFLAGS $LTLIBGCRYPT; do + for x in $LDFLAGS $LTLIBSSL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -14619,7 +14628,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$additional_libdir" + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$additional_libdir" fi fi fi @@ -14657,15 +14666,15 @@ fi names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$dep" - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$dep" + LIBSSL="${LIBSSL}${LIBSSL:+ }$dep" + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$dep" ;; esac done fi else - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-l$name" + LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-l$name" fi fi fi @@ -14681,27 +14690,27 @@ fi libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" + LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" + LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do - LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-R$found_dir" + LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" - for element in $INCGCRYPT; do + for element in $INCSSL; do haveit= for x in $CPPFLAGS; do @@ -14724,19 +14733,17 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgcrypt" >&5 -$as_echo_n "checking for libgcrypt... " >&6; } -if ${ac_cv_libgcrypt+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libssl" >&5 +$as_echo_n "checking for libssl... " >&6; } +if ${ac_cv_libssl+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIBGCRYPT" + LIBS="$LIBS $LIBSSL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - - #include - +#include int main () { @@ -14746,32 +14753,32 @@ main () } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_libgcrypt=yes + ac_cv_libssl=yes else - ac_cv_libgcrypt=no + ac_cv_libssl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgcrypt" >&5 -$as_echo "$ac_cv_libgcrypt" >&6; } - if test "$ac_cv_libgcrypt" = yes; then - HAVE_LIBGCRYPT=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libssl" >&5 +$as_echo "$ac_cv_libssl" >&6; } + if test "$ac_cv_libssl" = yes; then + HAVE_LIBSSL=yes -$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h +$as_echo "#define HAVE_LIBSSL 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libgcrypt" >&5 -$as_echo_n "checking how to link with libgcrypt... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT" >&5 -$as_echo "$LIBGCRYPT" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libssl" >&5 +$as_echo_n "checking how to link with libssl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBSSL" >&5 +$as_echo "$LIBSSL" >&6; } else - HAVE_LIBGCRYPT=no + HAVE_LIBSSL=no CPPFLAGS="$ac_save_CPPFLAGS" - LIBGCRYPT= - LTLIBGCRYPT= - LIBGCRYPT_PREFIX= + LIBSSL= + LTLIBSSL= + LIBSSL_PREFIX= fi @@ -14781,31 +14788,54 @@ $as_echo "$LIBGCRYPT" >&6; } - if test "$ac_cv_libgcrypt" = "yes"; then + LDFLAGS="$libssh2_save_LDFLAGS" -$as_echo "#define LIBSSH2_LIBGCRYPT 1" >>confdefs.h + if test "$ac_cv_libssl" = "yes"; then : + + +$as_echo "#define LIBSSH2_OPENSSL 1" >>confdefs.h + + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto" + + # Not all OpenSSL have AES-CTR functions. + libssh2_save_LIBS="$LIBS" + LIBS="$LIBS $LIBSSL" + for ac_func in EVP_aes_128_ctr +do : + ac_fn_c_check_func "$LINENO" "EVP_aes_128_ctr" "ac_cv_func_EVP_aes_128_ctr" +if test "x$ac_cv_func_EVP_aes_128_ctr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_EVP_AES_128_CTR 1 +_ACEOF + +fi +done + + LIBS="$libssh2_save_LIBS" + + found_crypto="openssl" + found_crypto_str="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})" - LIBSREQUIRED= # libgcrypt doesn't provide a .pc file. sad face. - LIBS="$LIBS -lgcrypt" - found_crypto=libgcrypt else - # restore - LDFLAGS=$old_LDFLAGS - CFLAGS=$old_CFLAGS + CPPFLAGS="$libssh2_save_CPPFLAGS" fi -else - use_libgcrypt=auto + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No openssl crypto library found! +" fi +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "libgcrypt"; then -# Check whether --with-wincng was given. -if test "${with_wincng+set}" = set; then : - withval=$with_wincng; use_wincng=$withval + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" - # Look for Windows Cryptography API: Next Generation + if test "${with_libgcrypt_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libgcrypt_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libgcrypt_prefix}/lib" + fi @@ -14831,9 +14861,9 @@ if test "${with_wincng+set}" = set; then : prefix="$acl_save_prefix" -# Check whether --with-libbcrypt-prefix was given. -if test "${with_libbcrypt_prefix+set}" = set; then : - withval=$with_libbcrypt_prefix; +# Check whether --with-libgcrypt-prefix was given. +if test "${with_libgcrypt_prefix+set}" = set; then : + withval=$with_libgcrypt_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -14858,14 +14888,14 @@ if test "${with_libbcrypt_prefix+set}" = set; then : fi - LIBBCRYPT= - LTLIBBCRYPT= - INCBCRYPT= - LIBBCRYPT_PREFIX= + LIBGCRYPT= + LTLIBGCRYPT= + INCGCRYPT= + LIBGCRYPT_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= - names_next_round='bcrypt ' + names_next_round='gcrypt ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= @@ -14884,9 +14914,9 @@ fi if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" - test -z "$value" || LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$value" + test -z "$value" || LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$value" eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }$value" + test -z "$value" || LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$value" else : fi @@ -14943,7 +14973,7 @@ fi fi fi if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIBBCRYPT; do + for x in $LDFLAGS $LTLIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15002,10 +15032,10 @@ fi done fi if test "X$found_dir" != "X"; then - LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-L$found_dir -l$name" + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" else haveit= for x in $ltrpathdirs; do @@ -15018,10 +15048,10 @@ fi ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then @@ -15034,7 +15064,7 @@ fi fi else haveit= - for x in $LDFLAGS $LIBBCRYPT; do + for x in $LDFLAGS $LIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15050,28 +15080,28 @@ fi fi done if test -z "$haveit"; then - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$found_dir" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_so" else - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-l$name" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_a" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$found_a" else - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$found_dir -l$name" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - LIBBCRYPT_PREFIX="$basedir" + LIBGCRYPT_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac @@ -15086,7 +15116,7 @@ fi fi fi if test -z "$haveit"; then - for x in $CPPFLAGS $INCBCRYPT; do + for x in $CPPFLAGS $INCGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15103,7 +15133,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then - INCBCRYPT="${INCBCRYPT}${INCBCRYPT:+ }-I$additional_includedir" + INCGCRYPT="${INCGCRYPT}${INCGCRYPT:+ }-I$additional_includedir" fi fi fi @@ -15131,7 +15161,7 @@ fi fi if test -z "$haveit"; then haveit= - for x in $LDFLAGS $LIBBCRYPT; do + for x in $LDFLAGS $LIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15148,11 +15178,11 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$additional_libdir" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-L$additional_libdir" fi fi haveit= - for x in $LDFLAGS $LTLIBBCRYPT; do + for x in $LDFLAGS $LTLIBGCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15169,7 +15199,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-L$additional_libdir" + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-L$additional_libdir" fi fi fi @@ -15207,15 +15237,15 @@ fi names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$dep" - LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }$dep" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$dep" + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }$dep" ;; esac done fi else - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-l$name" - LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-l$name" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }-l$name" + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-l$name" fi fi fi @@ -15231,27 +15261,27 @@ fi libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$flag" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$flag" + LIBGCRYPT="${LIBGCRYPT}${LIBGCRYPT:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do - LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-R$found_dir" + LTLIBGCRYPT="${LTLIBGCRYPT}${LTLIBGCRYPT:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" - for element in $INCBCRYPT; do + for element in $INCGCRYPT; do haveit= for x in $CPPFLAGS; do @@ -15274,20 +15304,17 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libbcrypt" >&5 -$as_echo_n "checking for libbcrypt... " >&6; } -if ${ac_cv_libbcrypt+:} false; then : - $as_echo_n "(cached) " >&6 -else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgcrypt" >&5 +$as_echo_n "checking for libgcrypt... " >&6; } +if ${ac_cv_libgcrypt+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIBBCRYPT" + LIBS="$LIBS $LIBGCRYPT" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - - #include - #include - +#include int main () { @@ -15297,32 +15324,32 @@ main () } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_libbcrypt=yes + ac_cv_libgcrypt=yes else - ac_cv_libbcrypt=no + ac_cv_libgcrypt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libbcrypt" >&5 -$as_echo "$ac_cv_libbcrypt" >&6; } - if test "$ac_cv_libbcrypt" = yes; then - HAVE_LIBBCRYPT=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgcrypt" >&5 +$as_echo "$ac_cv_libgcrypt" >&6; } + if test "$ac_cv_libgcrypt" = yes; then + HAVE_LIBGCRYPT=yes -$as_echo "#define HAVE_LIBBCRYPT 1" >>confdefs.h +$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libbcrypt" >&5 -$as_echo_n "checking how to link with libbcrypt... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBBCRYPT" >&5 -$as_echo "$LIBBCRYPT" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libgcrypt" >&5 +$as_echo_n "checking how to link with libgcrypt... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT" >&5 +$as_echo "$LIBGCRYPT" >&6; } else - HAVE_LIBBCRYPT=no + HAVE_LIBGCRYPT=no CPPFLAGS="$ac_save_CPPFLAGS" - LIBBCRYPT= - LTLIBBCRYPT= - LIBBCRYPT_PREFIX= + LIBGCRYPT= + LTLIBGCRYPT= + LIBGCRYPT_PREFIX= fi @@ -15332,6 +15359,37 @@ $as_echo "$LIBBCRYPT" >&6; } + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_libgcrypt" = "yes"; then : + + +$as_echo "#define LIBSSH2_LIBGCRYPT 1" >>confdefs.h + + found_crypto="libgcrypt" + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi + + + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No libgcrypt crypto library found! +" +fi + +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "mbedtls"; then + + + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" + + if test "${with_libmbedcrypto_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libmbedcrypto_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libmbedcrypto_prefix}/lib" + fi + + @@ -15355,9 +15413,9 @@ $as_echo "$LIBBCRYPT" >&6; } prefix="$acl_save_prefix" -# Check whether --with-libcrypt32-prefix was given. -if test "${with_libcrypt32_prefix+set}" = set; then : - withval=$with_libcrypt32_prefix; +# Check whether --with-libmbedcrypto-prefix was given. +if test "${with_libmbedcrypto_prefix+set}" = set; then : + withval=$with_libmbedcrypto_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -15382,14 +15440,14 @@ if test "${with_libcrypt32_prefix+set}" = set; then : fi - LIBCRYPT32= - LTLIBCRYPT32= - INCCRYPT32= - LIBCRYPT32_PREFIX= + LIBMBEDCRYPTO= + LTLIBMBEDCRYPTO= + INCMBEDCRYPTO= + LIBMBEDCRYPTO_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= - names_next_round='crypt32 ' + names_next_round='mbedcrypto ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= @@ -15408,9 +15466,9 @@ fi if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" - test -z "$value" || LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$value" + test -z "$value" || LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$value" eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }$value" + test -z "$value" || LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }$value" else : fi @@ -15467,7 +15525,7 @@ fi fi fi if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIBCRYPT32; do + for x in $LDFLAGS $LTLIBMBEDCRYPTO; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15526,10 +15584,10 @@ fi done fi if test "X$found_dir" != "X"; then - LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-L$found_dir -l$name" + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" else haveit= for x in $ltrpathdirs; do @@ -15542,10 +15600,10 @@ fi ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then @@ -15558,7 +15616,7 @@ fi fi else haveit= - for x in $LDFLAGS $LIBCRYPT32; do + for x in $LDFLAGS $LIBMBEDCRYPTO; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15574,28 +15632,28 @@ fi fi done if test -z "$haveit"; then - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$found_dir" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_so" else - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-l$name" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_a" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$found_a" else - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$found_dir -l$name" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - LIBCRYPT32_PREFIX="$basedir" + LIBMBEDCRYPTO_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac @@ -15610,7 +15668,7 @@ fi fi fi if test -z "$haveit"; then - for x in $CPPFLAGS $INCCRYPT32; do + for x in $CPPFLAGS $INCMBEDCRYPTO; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15627,7 +15685,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then - INCCRYPT32="${INCCRYPT32}${INCCRYPT32:+ }-I$additional_includedir" + INCMBEDCRYPTO="${INCMBEDCRYPTO}${INCMBEDCRYPTO:+ }-I$additional_includedir" fi fi fi @@ -15655,7 +15713,7 @@ fi fi if test -z "$haveit"; then haveit= - for x in $LDFLAGS $LIBCRYPT32; do + for x in $LDFLAGS $LIBMBEDCRYPTO; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15672,11 +15730,11 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$additional_libdir" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-L$additional_libdir" fi fi haveit= - for x in $LDFLAGS $LTLIBCRYPT32; do + for x in $LDFLAGS $LTLIBMBEDCRYPTO; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -15693,7 +15751,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-L$additional_libdir" + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-L$additional_libdir" fi fi fi @@ -15731,15 +15789,15 @@ fi names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$dep" - LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }$dep" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$dep" + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }$dep" ;; esac done fi else - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-l$name" - LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-l$name" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }-l$name" + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-l$name" fi fi fi @@ -15755,27 +15813,27 @@ fi libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$flag" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$flag" + LIBMBEDCRYPTO="${LIBMBEDCRYPTO}${LIBMBEDCRYPTO:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do - LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-R$found_dir" + LTLIBMBEDCRYPTO="${LTLIBMBEDCRYPTO}${LTLIBMBEDCRYPTO:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" - for element in $INCCRYPT32; do + for element in $INCMBEDCRYPTO; do haveit= for x in $CPPFLAGS; do @@ -15798,20 +15856,17 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcrypt32" >&5 -$as_echo_n "checking for libcrypt32... " >&6; } -if ${ac_cv_libcrypt32+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libmbedcrypto" >&5 +$as_echo_n "checking for libmbedcrypto... " >&6; } +if ${ac_cv_libmbedcrypto+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIBCRYPT32" + LIBS="$LIBS $LIBMBEDCRYPTO" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - - #include - #include - +#include int main () { @@ -15821,32 +15876,32 @@ main () } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_libcrypt32=yes + ac_cv_libmbedcrypto=yes else - ac_cv_libcrypt32=no + ac_cv_libmbedcrypto=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libcrypt32" >&5 -$as_echo "$ac_cv_libcrypt32" >&6; } - if test "$ac_cv_libcrypt32" = yes; then - HAVE_LIBCRYPT32=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libmbedcrypto" >&5 +$as_echo "$ac_cv_libmbedcrypto" >&6; } + if test "$ac_cv_libmbedcrypto" = yes; then + HAVE_LIBMBEDCRYPTO=yes -$as_echo "#define HAVE_LIBCRYPT32 1" >>confdefs.h +$as_echo "#define HAVE_LIBMBEDCRYPTO 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libcrypt32" >&5 -$as_echo_n "checking how to link with libcrypt32... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBCRYPT32" >&5 -$as_echo "$LIBCRYPT32" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libmbedcrypto" >&5 +$as_echo_n "checking how to link with libmbedcrypto... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBMBEDCRYPTO" >&5 +$as_echo "$LIBMBEDCRYPTO" >&6; } else - HAVE_LIBCRYPT32=no + HAVE_LIBMBEDCRYPTO=no CPPFLAGS="$ac_save_CPPFLAGS" - LIBCRYPT32= - LTLIBCRYPT32= - LIBCRYPT32_PREFIX= + LIBMBEDCRYPTO= + LTLIBMBEDCRYPTO= + LIBMBEDCRYPTO_PREFIX= fi @@ -15855,12 +15910,35 @@ $as_echo "$LIBCRYPT32" >&6; } + + LDFLAGS="$libssh2_save_LDFLAGS" + + if test "$ac_cv_libmbedcrypto" = "yes"; then : + + +$as_echo "#define LIBSSH2_MBEDTLS 1" >>confdefs.h + + found_crypto="mbedtls" + support_clear_memory=yes + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi + + + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No mbedtls crypto library found! +" +fi + +if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "wincng"; then + + # Look for Windows Cryptography API: Next Generation + for ac_header in ntdef.h ntstatus.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " - #include - +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @@ -15871,9 +15949,7 @@ fi done - ac_fn_c_check_decl "$LINENO" "SecureZeroMemory" "ac_cv_have_decl_SecureZeroMemory" " - #include - + ac_fn_c_check_decl "$LINENO" "SecureZeroMemory" "ac_cv_have_decl_SecureZeroMemory" "#include " if test "x$ac_cv_have_decl_SecureZeroMemory" = xyes; then : ac_have_decl=1 @@ -15886,37 +15962,13 @@ cat >>confdefs.h <<_ACEOF _ACEOF - if test "$ac_cv_libbcrypt" = "yes"; then - -$as_echo "#define LIBSSH2_WINCNG 1" >>confdefs.h - - LIBSREQUIRED= # wincng doesn't provide a .pc file. sad face. - LIBS="$LIBS -lbcrypt" - if test "$ac_cv_libcrypt32" = "yes"; then - LIBS="$LIBS -lcrypt32" - fi - found_crypto="Windows Cryptography API: Next Generation" - if test "$ac_cv_have_decl_SecureZeroMemory" = "yes"; then - support_clear_memory=yes - fi - fi - - -else - use_wincng=auto -fi - -# Check whether --with-mbedtls was given. -if test "${with_mbedtls+set}" = set; then : - withval=$with_mbedtls; use_mbedtls=$withval + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" - - old_LDFLAGS=$LDFLAGS - old_CFLAGS=$CFLAGS - if test -n "$use_mbedtls" && test "$use_mbedtls" != "no"; then - LDFLAGS="$LDFLAGS -L$use_mbedtls/lib" - CFLAGS="$CFLAGS -I$use_mbedtls/include" + if test "${with_libcrypt32_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libcrypt32_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libcrypt32_prefix}/lib" fi @@ -15943,9 +15995,9 @@ if test "${with_mbedtls+set}" = set; then : prefix="$acl_save_prefix" -# Check whether --with-libmbedtls-prefix was given. -if test "${with_libmbedtls_prefix+set}" = set; then : - withval=$with_libmbedtls_prefix; +# Check whether --with-libcrypt32-prefix was given. +if test "${with_libcrypt32_prefix+set}" = set; then : + withval=$with_libcrypt32_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -15970,14 +16022,14 @@ if test "${with_libmbedtls_prefix+set}" = set; then : fi - LIBMBEDTLS= - LTLIBMBEDTLS= - INCMBEDTLS= - LIBMBEDTLS_PREFIX= + LIBCRYPT32= + LTLIBCRYPT32= + INCCRYPT32= + LIBCRYPT32_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= - names_next_round='mbedtls ' + names_next_round='crypt32 ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= @@ -15996,9 +16048,9 @@ fi if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" - test -z "$value" || LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$value" + test -z "$value" || LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$value" eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIBMBEDTLS="${LTLIBMBEDTLS}${LTLIBMBEDTLS:+ }$value" + test -z "$value" || LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }$value" else : fi @@ -16055,7 +16107,7 @@ fi fi fi if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIBMBEDTLS; do + for x in $LDFLAGS $LTLIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16114,10 +16166,10 @@ fi done fi if test "X$found_dir" != "X"; then - LTLIBMBEDTLS="${LTLIBMBEDTLS}${LTLIBMBEDTLS:+ }-L$found_dir -l$name" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" else haveit= for x in $ltrpathdirs; do @@ -16130,10 +16182,10 @@ fi ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then @@ -16146,7 +16198,7 @@ fi fi else haveit= - for x in $LDFLAGS $LIBMBEDTLS; do + for x in $LDFLAGS $LIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16162,28 +16214,28 @@ fi fi done if test -z "$haveit"; then - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }-L$found_dir" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$found_so" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_so" else - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }-l$name" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$found_a" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$found_a" else - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }-L$found_dir -l$name" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - LIBMBEDTLS_PREFIX="$basedir" + LIBCRYPT32_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac @@ -16198,7 +16250,7 @@ fi fi fi if test -z "$haveit"; then - for x in $CPPFLAGS $INCMBEDTLS; do + for x in $CPPFLAGS $INCCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16215,7 +16267,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then - INCMBEDTLS="${INCMBEDTLS}${INCMBEDTLS:+ }-I$additional_includedir" + INCCRYPT32="${INCCRYPT32}${INCCRYPT32:+ }-I$additional_includedir" fi fi fi @@ -16243,7 +16295,7 @@ fi fi if test -z "$haveit"; then haveit= - for x in $LDFLAGS $LIBMBEDTLS; do + for x in $LDFLAGS $LIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16260,11 +16312,11 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }-L$additional_libdir" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-L$additional_libdir" fi fi haveit= - for x in $LDFLAGS $LTLIBMBEDTLS; do + for x in $LDFLAGS $LTLIBCRYPT32; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16281,7 +16333,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LTLIBMBEDTLS="${LTLIBMBEDTLS}${LTLIBMBEDTLS:+ }-L$additional_libdir" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-L$additional_libdir" fi fi fi @@ -16319,15 +16371,15 @@ fi names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$dep" - LTLIBMBEDTLS="${LTLIBMBEDTLS}${LTLIBMBEDTLS:+ }$dep" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$dep" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }$dep" ;; esac done fi else - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }-l$name" - LTLIBMBEDTLS="${LTLIBMBEDTLS}${LTLIBMBEDTLS:+ }-l$name" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }-l$name" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-l$name" fi fi fi @@ -16343,27 +16395,27 @@ fi libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$flag" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBMBEDTLS="${LIBMBEDTLS}${LIBMBEDTLS:+ }$flag" + LIBCRYPT32="${LIBCRYPT32}${LIBCRYPT32:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do - LTLIBMBEDTLS="${LTLIBMBEDTLS}${LTLIBMBEDTLS:+ }-R$found_dir" + LTLIBCRYPT32="${LTLIBCRYPT32}${LTLIBCRYPT32:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" - for element in $INCMBEDTLS; do + for element in $INCCRYPT32; do haveit= for x in $CPPFLAGS; do @@ -16386,18 +16438,19 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libmbedtls" >&5 -$as_echo_n "checking for libmbedtls... " >&6; } -if ${ac_cv_libmbedtls+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcrypt32" >&5 +$as_echo_n "checking for libcrypt32... " >&6; } +if ${ac_cv_libcrypt32+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIBMBEDTLS" + LIBS="$LIBS $LIBCRYPT32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include + #include + #include int main () @@ -16408,32 +16461,32 @@ main () } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_libmbedtls=yes + ac_cv_libcrypt32=yes else - ac_cv_libmbedtls=no + ac_cv_libcrypt32=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libmbedtls" >&5 -$as_echo "$ac_cv_libmbedtls" >&6; } - if test "$ac_cv_libmbedtls" = yes; then - HAVE_LIBMBEDTLS=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libcrypt32" >&5 +$as_echo "$ac_cv_libcrypt32" >&6; } + if test "$ac_cv_libcrypt32" = yes; then + HAVE_LIBCRYPT32=yes -$as_echo "#define HAVE_LIBMBEDTLS 1" >>confdefs.h +$as_echo "#define HAVE_LIBCRYPT32 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libmbedtls" >&5 -$as_echo_n "checking how to link with libmbedtls... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBMBEDTLS" >&5 -$as_echo "$LIBMBEDTLS" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libcrypt32" >&5 +$as_echo_n "checking how to link with libcrypt32... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBCRYPT32" >&5 +$as_echo "$LIBCRYPT32" >&6; } else - HAVE_LIBMBEDTLS=no + HAVE_LIBCRYPT32=no CPPFLAGS="$ac_save_CPPFLAGS" - LIBMBEDTLS= - LTLIBMBEDTLS= - LIBMBEDTLS_PREFIX= + LIBCRYPT32= + LTLIBCRYPT32= + LIBCRYPT32_PREFIX= fi @@ -16443,39 +16496,23 @@ $as_echo "$LIBMBEDTLS" >&6; } - if test "$ac_cv_libmbedtls" = "yes"; then + LDFLAGS="$libssh2_save_LDFLAGS" -$as_echo "#define LIBSSH2_MBEDTLS 1" >>confdefs.h + if test "$ac_cv_libcrypt32" = "yes"; then : - LIBSREQUIRED= # mbedtls doesn't provide a .pc file - LIBS="$LIBS -lmbedtls -lmbedcrypto" - found_crypto=libmbedtls - support_clear_memory=yes else - # restore - LDFLAGS=$old_LDFLAGS - CFLAGS=$old_CFLAGS + CPPFLAGS="$libssh2_save_CPPFLAGS" fi -else - use_mbedtls=auto - -fi - - -# Check whether --with-libz was given. -if test "${with_libz+set}" = set; then : - withval=$with_libz; use_libz=$withval -else - use_libz=auto -fi - + libssh2_save_CPPFLAGS="$CPPFLAGS" + libssh2_save_LDFLAGS="$LDFLAGS" -support_clear_memory=no + if test "${with_libbcrypt_prefix+set}" = set; then + CPPFLAGS="$CPPFLAGS${CPPFLAGS:+ }-I${with_libbcrypt_prefix}/include" + LDFLAGS="$LDFLAGS${LDFLAGS:+ }-L${with_libbcrypt_prefix}/lib" + fi -# Look for OpenSSL -if test "$found_crypto" = "none" && test "$use_openssl" != "no"; then @@ -16500,9 +16537,9 @@ if test "$found_crypto" = "none" && test "$use_openssl" != "no"; then prefix="$acl_save_prefix" -# Check whether --with-libssl-prefix was given. -if test "${with_libssl_prefix+set}" = set; then : - withval=$with_libssl_prefix; +# Check whether --with-libbcrypt-prefix was given. +if test "${with_libbcrypt_prefix+set}" = set; then : + withval=$with_libbcrypt_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -16527,14 +16564,14 @@ if test "${with_libssl_prefix+set}" = set; then : fi - LIBSSL= - LTLIBSSL= - INCSSL= - LIBSSL_PREFIX= + LIBBCRYPT= + LTLIBBCRYPT= + INCBCRYPT= + LIBBCRYPT_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= - names_next_round='ssl crypto' + names_next_round='bcrypt ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= @@ -16553,9 +16590,9 @@ fi if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" - test -z "$value" || LIBSSL="${LIBSSL}${LIBSSL:+ }$value" + test -z "$value" || LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$value" eval value=\"\$LTLIB$uppername\" - test -z "$value" || LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$value" + test -z "$value" || LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }$value" else : fi @@ -16612,7 +16649,7 @@ fi fi fi if test "X$found_dir" = "X"; then - for x in $LDFLAGS $LTLIBSSL; do + for x in $LDFLAGS $LTLIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16671,10 +16708,10 @@ fi done fi if test "X$found_dir" != "X"; then - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$found_dir -l$name" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" else haveit= for x in $ltrpathdirs; do @@ -16687,10 +16724,10 @@ fi ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then @@ -16703,7 +16740,7 @@ fi fi else haveit= - for x in $LDFLAGS $LIBSSL; do + for x in $LDFLAGS $LIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16719,28 +16756,28 @@ fi fi done if test -z "$haveit"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_so" else - LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }$found_a" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$found_a" else - LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir -l$name" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` - LIBSSL_PREFIX="$basedir" + LIBBCRYPT_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac @@ -16755,7 +16792,7 @@ fi fi fi if test -z "$haveit"; then - for x in $CPPFLAGS $INCSSL; do + for x in $CPPFLAGS $INCBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16772,7 +16809,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then - INCSSL="${INCSSL}${INCSSL:+ }-I$additional_includedir" + INCBCRYPT="${INCBCRYPT}${INCBCRYPT:+ }-I$additional_includedir" fi fi fi @@ -16800,7 +16837,7 @@ fi fi if test -z "$haveit"; then haveit= - for x in $LDFLAGS $LIBSSL; do + for x in $LDFLAGS $LIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16817,11 +16854,11 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LIBSSL="${LIBSSL}${LIBSSL:+ }-L$additional_libdir" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-L$additional_libdir" fi fi haveit= - for x in $LDFLAGS $LTLIBSSL; do + for x in $LDFLAGS $LTLIBBCRYPT; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" @@ -16838,7 +16875,7 @@ fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$additional_libdir" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-L$additional_libdir" fi fi fi @@ -16876,15 +16913,15 @@ fi names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) - LIBSSL="${LIBSSL}${LIBSSL:+ }$dep" - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$dep" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$dep" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }$dep" ;; esac done fi else - LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name" - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-l$name" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }-l$name" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-l$name" fi fi fi @@ -16900,27 +16937,27 @@ fi libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" - LIBSSL="${LIBSSL}${LIBSSL:+ }$flag" + LIBBCRYPT="${LIBBCRYPT}${LIBBCRYPT:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do - LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-R$found_dir" + LTLIBBCRYPT="${LTLIBBCRYPT}${LTLIBBCRYPT:+ }-R$found_dir" done fi ac_save_CPPFLAGS="$CPPFLAGS" - for element in $INCSSL; do + for element in $INCBCRYPT; do haveit= for x in $CPPFLAGS; do @@ -16943,17 +16980,20 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libssl" >&5 -$as_echo_n "checking for libssl... " >&6; } -if ${ac_cv_libssl+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libbcrypt" >&5 +$as_echo_n "checking for libbcrypt... " >&6; } +if ${ac_cv_libbcrypt+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" - LIBS="$LIBS $LIBSSL" + LIBS="$LIBS $LIBBCRYPT" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + + #include + #include + int main () { @@ -16963,32 +17003,32 @@ main () } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_libssl=yes + ac_cv_libbcrypt=yes else - ac_cv_libssl=no + ac_cv_libbcrypt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libssl" >&5 -$as_echo "$ac_cv_libssl" >&6; } - if test "$ac_cv_libssl" = yes; then - HAVE_LIBSSL=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libbcrypt" >&5 +$as_echo "$ac_cv_libbcrypt" >&6; } + if test "$ac_cv_libbcrypt" = yes; then + HAVE_LIBBCRYPT=yes -$as_echo "#define HAVE_LIBSSL 1" >>confdefs.h +$as_echo "#define HAVE_LIBBCRYPT 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libssl" >&5 -$as_echo_n "checking how to link with libssl... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBSSL" >&5 -$as_echo "$LIBSSL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libbcrypt" >&5 +$as_echo_n "checking how to link with libbcrypt... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBBCRYPT" >&5 +$as_echo "$LIBBCRYPT" >&6; } else - HAVE_LIBSSL=no + HAVE_LIBBCRYPT=no CPPFLAGS="$ac_save_CPPFLAGS" - LIBSSL= - LTLIBSSL= - LIBSSL_PREFIX= + LIBBCRYPT= + LTLIBBCRYPT= + LIBBCRYPT_PREFIX= fi @@ -16997,33 +17037,49 @@ $as_echo "$LIBSSL" >&6; } -fi -if test "$ac_cv_libssl" = "yes"; then -$as_echo "#define LIBSSH2_OPENSSL 1" >>confdefs.h + LDFLAGS="$libssh2_save_LDFLAGS" - LIBSREQUIRED=libssl,libcrypto + if test "$ac_cv_libbcrypt" = "yes"; then : - # Not all OpenSSL have AES-CTR functions. - save_LIBS="$LIBS" - LIBS="$LIBS $LIBSSL" - for ac_func in EVP_aes_128_ctr -do : - ac_fn_c_check_func "$LINENO" "EVP_aes_128_ctr" "ac_cv_func_EVP_aes_128_ctr" -if test "x$ac_cv_func_EVP_aes_128_ctr" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_EVP_AES_128_CTR 1 -_ACEOF +$as_echo "#define LIBSSH2_WINCNG 1" >>confdefs.h + + found_crypto="wincng" + found_crypto_str="Windows Cryptography API: Next Generation" + support_clear_memory="$ac_cv_have_decl_SecureZeroMemory" + + else + CPPFLAGS="$libssh2_save_CPPFLAGS" + fi + + + test "$found_crypto" = "none" && + crypto_errors="${crypto_errors}No wincng crypto library found! +" fi -done - LIBS="$save_LIBS" + ;; + yes|"") + crypto_errors="No crypto backend specified!" + ;; + *) + crypto_errors="Unknown crypto backend '${use_crypto}' specified!" + ;; +esac + +if test "$found_crypto" = "none"; then + crypto_errors="${crypto_errors} +Specify --with-crypto=\$backend and/or the neccessary library search prefix. - found_crypto="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})" +Known crypto backends: auto, openssl, libgcrypt, mbedtls, wincng" + { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 +$as_echo "$as_me: ERROR: ${crypto_errors}" >&6;} +else + test "$found_crypto_str" = "" && found_crypto_str="$found_crypto" fi - if test "$ac_cv_libssl" = "yes"; then + if test "$found_crypto" = "openssl"; then OPENSSL_TRUE= OPENSSL_FALSE='#' else @@ -17031,15 +17087,7 @@ else OPENSSL_FALSE= fi - if test "$ac_cv_libbcrypt" = "yes"; then - WINCNG_TRUE= - WINCNG_FALSE='#' -else - WINCNG_TRUE='#' - WINCNG_FALSE= -fi - - if test "$ac_cv_libgcrypt" = "yes"; then + if test "$found_crypto" = "libgcrypt"; then LIBGCRYPT_TRUE= LIBGCRYPT_FALSE='#' else @@ -17047,7 +17095,7 @@ else LIBGCRYPT_FALSE= fi - if test "$ac_cv_libmbedtls" = "yes"; then + if test "$found_crypto" = "mbedtls"; then MBEDTLS_TRUE= MBEDTLS_FALSE='#' else @@ -17055,27 +17103,33 @@ else MBEDTLS_FALSE= fi - if false; then - OS400QC3_TRUE= - OS400QC3_FALSE='#' + if test "$found_crypto" = "wincng"; then + WINCNG_TRUE= + WINCNG_FALSE='#' else - OS400QC3_TRUE='#' - OS400QC3_FALSE= + WINCNG_TRUE='#' + WINCNG_FALSE= fi -# Check if crypto library was found -if test "$found_crypto" = "none"; then - as_fn_error $? "No crypto library found! -Try --with-libssl-prefix=PATH - or --with-libgcrypt-prefix=PATH - or --with-libmbedtls-prefix=PATH - or --with-wincng on Windows\ -" "$LINENO" 5 + + + +# libz + + +# Check whether --with-libz was given. +if test "${with_libz+set}" = set; then : + withval=$with_libz; use_libz=$withval +else + use_libz=auto fi -# Look for Libz -if test "$use_libz" != "no"; then + +found_libz=no +libz_errors="" + +if test "$use_libz" != no; then @@ -17598,18 +17652,22 @@ $as_echo "$LIBZ" >&6; } if test "$ac_cv_libz" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot find zlib, disabling compression" >&5 -$as_echo "$as_me: Cannot find zlib, disabling compression" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Try --with-libz-prefix=PATH if you know you have it" >&5 -$as_echo "$as_me: Try --with-libz-prefix=PATH if you know you have it" >&6;} + if test "$use_libz" = auto; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot find libz, disabling compression" >&5 +$as_echo "$as_me: Cannot find libz, disabling compression" >&6;} + found_libz="disabled; no libz found" + else + libz_errors="No libz found! +Try --with-libz-prefix=PATH if you know that you have it." + { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: $libz_errors" >&5 +$as_echo "$as_me: ERROR: $libz_errors" >&6;} + fi else $as_echo "#define LIBSSH2_HAVE_ZLIB 1" >>confdefs.h - if test "${LIBSREQUIRED}" != ""; then - LIBSREQUIRED="${LIBSREQUIRED}," - fi - LIBSREQUIRED="${LIBSREQUIRED}zlib" + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }zlib" + found_libz="yes" fi fi @@ -17683,6 +17741,7 @@ if test "${enable_debug+set}" = set; then : no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } + CPPFLAGS="$CPPFLAGS -DNDEBUG" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -17994,7 +18053,7 @@ done ;; esac -for ac_func in gettimeofday select strtoll +for ac_func in gettimeofday select strtoll memset_s do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -18583,6 +18642,53 @@ $as_echo "$as_me: WARNING: non-block sockets disabled" >&2;} fi +missing_required_deps=0 + +if test "${libz_errors}" != ""; then + { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: ${libz_errors}" >&5 +$as_echo "$as_me: ERROR: ${libz_errors}" >&6;} + missing_required_deps=1 +fi + +if test "$found_crypto" = "none"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 +$as_echo "$as_me: ERROR: ${crypto_errors}" >&6;} + missing_required_deps=1 +fi + +if test $missing_required_deps = 1; then + as_fn_error $? "Required dependencies are missing!" "$LINENO" 5 +fi + +# Configure parameters + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable compiler warnings as errors" >&5 +$as_echo_n "checking whether to enable compiler warnings as errors... " >&6; } + OPT_COMPILER_WERROR="default" + # Check whether --enable-werror was given. +if test "${enable_werror+set}" = set; then : + enableval=$enable_werror; OPT_COMPILER_WERROR=$enableval +fi + + case "$OPT_COMPILER_WERROR" in + no) + want_werror="no" + ;; + default) + want_werror="no" + ;; + *) + want_werror="yes" + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $want_werror" >&5 +$as_echo "$want_werror" >&6; } + + if test X"$want_werror" = Xyes; then + CFLAGS="$CFLAGS -Werror" + fi + + ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile example/Makefile docs/Makefile libssh2.pc" cat >confcache <<\_ACEOF @@ -18735,10 +18841,6 @@ if test -z "${OPENSSL_TRUE}" && test -z "${OPENSSL_FALSE}"; then as_fn_error $? "conditional \"OPENSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${WINCNG_TRUE}" && test -z "${WINCNG_FALSE}"; then - as_fn_error $? "conditional \"WINCNG\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi if test -z "${LIBGCRYPT_TRUE}" && test -z "${LIBGCRYPT_FALSE}"; then as_fn_error $? "conditional \"LIBGCRYPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -18747,8 +18849,8 @@ if test -z "${MBEDTLS_TRUE}" && test -z "${MBEDTLS_FALSE}"; then as_fn_error $? "conditional \"MBEDTLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${OS400QC3_TRUE}" && test -z "${OS400QC3_FALSE}"; then - as_fn_error $? "conditional \"OS400QC3\" was never defined. +if test -z "${WINCNG_TRUE}" && test -z "${WINCNG_FALSE}"; then + as_fn_error $? "conditional \"WINCNG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then @@ -20927,12 +21029,12 @@ fi Compiler: ${CC} Compiler flags: ${CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} - Crypto library: ${found_crypto} + Crypto library: ${found_crypto_str} Clear memory: $enable_clear_memory Debug build: $enable_debug Build examples: $build_examples Path to sshd: $ac_cv_path_SSHD (only for self-tests) - zlib compression: $ac_cv_libz + zlib compression: ${found_libz} " >&5 $as_echo "$as_me: summary of build options: @@ -20942,10 +21044,10 @@ $as_echo "$as_me: summary of build options: Compiler: ${CC} Compiler flags: ${CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} - Crypto library: ${found_crypto} + Crypto library: ${found_crypto_str} Clear memory: $enable_clear_memory Debug build: $enable_debug Build examples: $build_examples Path to sshd: $ac_cv_path_SSHD (only for self-tests) - zlib compression: $ac_cv_libz + zlib compression: ${found_libz} " >&6;} diff --git a/vendor/libssh2/configure.ac b/vendor/libssh2/configure.ac index c26a52b12..fe5054a09 100644 --- a/vendor/libssh2/configure.ac +++ b/vendor/libssh2/configure.ac @@ -83,79 +83,78 @@ AC_C_BIGENDIAN dnl check for how to do large files AC_SYS_LARGEFILE -found_crypto=none +# Crypto backends -# Configure parameters -AC_ARG_WITH(openssl, - AC_HELP_STRING([--with-openssl],[Use OpenSSL for crypto]), - use_openssl=$withval,use_openssl=auto) -AC_ARG_WITH(libgcrypt, - AC_HELP_STRING([--with-libgcrypt],[Use libgcrypt for crypto]), - [ use_libgcrypt=$withval - LIBSSH2_CHECKFOR_GCRYPT - ], use_libgcrypt=auto) -AC_ARG_WITH(wincng, - AC_HELP_STRING([--with-wincng],[Use Windows CNG for crypto]), - [ use_wincng=$withval - LIBSSH2_CHECKFOR_WINCNG - ] ,use_wincng=auto) -AC_ARG_WITH([mbedtls], - AC_HELP_STRING([--with-mbedtls],[Use mbedTLS for crypto]), - [ use_mbedtls=$withval - LIBSSH2_CHECKFOR_MBEDTLS - ], use_mbedtls=auto +found_crypto=none +found_crypto_str="" +support_clear_memory=no +crypto_errors="" + +m4_set_add([crypto_backends], [openssl]) +m4_set_add([crypto_backends], [libgcrypt]) +m4_set_add([crypto_backends], [mbedtls]) +m4_set_add([crypto_backends], [wincng]) + +AC_ARG_WITH([crypto], + AC_HELP_STRING([--with-crypto=auto|]m4_set_contents([crypto_backends], [|]), + [Select crypto backend (default: auto)]), + use_crypto=$withval, + use_crypto=auto ) -AC_ARG_WITH(libz, - AC_HELP_STRING([--with-libz],[Use zlib for compression]), - use_libz=$withval,use_libz=auto) -support_clear_memory=no +case "${use_crypto}" in + auto|m4_set_contents([crypto_backends], [|])) + m4_set_map([crypto_backends], [LIBSSH2_CHECK_CRYPTO]) + ;; + yes|"") + crypto_errors="No crypto backend specified!" + ;; + *) + crypto_errors="Unknown crypto backend '${use_crypto}' specified!" + ;; +esac + +if test "$found_crypto" = "none"; then + crypto_errors="${crypto_errors} +Specify --with-crypto=\$backend and/or the neccessary library search prefix. -# Look for OpenSSL -if test "$found_crypto" = "none" && test "$use_openssl" != "no"; then - AC_LIB_HAVE_LINKFLAGS([ssl], [crypto], [#include ]) +Known crypto backends: auto, m4_set_contents([crypto_backends], [, ])" + AS_MESSAGE([ERROR: ${crypto_errors}]) +else + test "$found_crypto_str" = "" && found_crypto_str="$found_crypto" fi -if test "$ac_cv_libssl" = "yes"; then - AC_DEFINE(LIBSSH2_OPENSSL, 1, [Use OpenSSL]) - LIBSREQUIRED=libssl,libcrypto - # Not all OpenSSL have AES-CTR functions. - save_LIBS="$LIBS" - LIBS="$LIBS $LIBSSL" - AC_CHECK_FUNCS(EVP_aes_128_ctr) - LIBS="$save_LIBS" +m4_set_foreach([crypto_backends], [backend], + [AM_CONDITIONAL(m4_toupper(backend), test "$found_crypto" = "backend")] +) +m4_undefine([backend]) - found_crypto="OpenSSL (AES-CTR: ${ac_cv_func_EVP_aes_128_ctr:-N/A})" -fi -AM_CONDITIONAL(OPENSSL, test "$ac_cv_libssl" = "yes") -AM_CONDITIONAL(WINCNG, test "$ac_cv_libbcrypt" = "yes") -AM_CONDITIONAL(LIBGCRYPT, test "$ac_cv_libgcrypt" = "yes") -AM_CONDITIONAL(MBEDTLS, test "$ac_cv_libmbedtls" = "yes") -AM_CONDITIONAL(OS400QC3, false) +# libz -# Check if crypto library was found -if test "$found_crypto" = "none"; then - AC_MSG_ERROR([No crypto library found! -Try --with-libssl-prefix=PATH - or --with-libgcrypt-prefix=PATH - or --with-libmbedtls-prefix=PATH - or --with-wincng on Windows\ -]) -fi +AC_ARG_WITH([libz], + AC_HELP_STRING([--with-libz],[Use libz for compression]), + use_libz=$withval, + use_libz=auto) -# Look for Libz -if test "$use_libz" != "no"; then +found_libz=no +libz_errors="" + +if test "$use_libz" != no; then AC_LIB_HAVE_LINKFLAGS([z], [], [#include ]) if test "$ac_cv_libz" != yes; then - AC_MSG_NOTICE([Cannot find zlib, disabling compression]) - AC_MSG_NOTICE([Try --with-libz-prefix=PATH if you know you have it]) + if test "$use_libz" = auto; then + AC_MSG_NOTICE([Cannot find libz, disabling compression]) + found_libz="disabled; no libz found" + else + libz_errors="No libz found! +Try --with-libz-prefix=PATH if you know that you have it." + AS_MESSAGE([ERROR: $libz_errors]) + fi else AC_DEFINE(LIBSSH2_HAVE_ZLIB, 1, [Compile in zlib support]) - if test "${LIBSREQUIRED}" != ""; then - LIBSREQUIRED="${LIBSREQUIRED}," - fi - LIBSREQUIRED="${LIBSREQUIRED}zlib" + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }zlib" + found_libz="yes" fi fi @@ -213,6 +212,7 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), [ case "$enable_debug" in no) AC_MSG_RESULT(no) + CPPFLAGS="$CPPFLAGS -DNDEBUG" ;; *) AC_MSG_RESULT(yes) enable_debug=yes @@ -319,7 +319,7 @@ case $host in ;; esac -AC_CHECK_FUNCS(gettimeofday select strtoll) +AC_CHECK_FUNCS(gettimeofday select strtoll memset_s) dnl Check for select() into ws2_32 for Msys/Mingw if test "$ac_cv_func_select" != "yes"; then @@ -351,6 +351,25 @@ AC_C_INLINE CURL_CHECK_NONBLOCKING_SOCKET +missing_required_deps=0 + +if test "${libz_errors}" != ""; then + AS_MESSAGE([ERROR: ${libz_errors}]) + missing_required_deps=1 +fi + +if test "$found_crypto" = "none"; then + AS_MESSAGE([ERROR: ${crypto_errors}]) + missing_required_deps=1 +fi + +if test $missing_required_deps = 1; then + AC_MSG_ERROR([Required dependencies are missing!]) +fi + +# Configure parameters +LIBSSH2_CHECK_OPTION_WERROR + AC_CONFIG_FILES([Makefile src/Makefile tests/Makefile @@ -367,10 +386,10 @@ AC_MSG_NOTICE([summary of build options: Compiler: ${CC} Compiler flags: ${CFLAGS} Library types: Shared=${enable_shared}, Static=${enable_static} - Crypto library: ${found_crypto} + Crypto library: ${found_crypto_str} Clear memory: $enable_clear_memory Debug build: $enable_debug Build examples: $build_examples Path to sshd: $ac_cv_path_SSHD (only for self-tests) - zlib compression: $ac_cv_libz + zlib compression: ${found_libz} ]) diff --git a/vendor/libssh2/docs/CMakeLists.txt b/vendor/libssh2/docs/CMakeLists.txt index 3e9d165ef..6abf0e498 100644 --- a/vendor/libssh2/docs/CMakeLists.txt +++ b/vendor/libssh2/docs/CMakeLists.txt @@ -38,8 +38,10 @@ set(MAN_PAGES libssh2_agent_disconnect.3 libssh2_agent_free.3 libssh2_agent_get_identity.3 + libssh2_agent_get_identity_path.3 libssh2_agent_init.3 libssh2_agent_list_identities.3 + libssh2_agent_set_identity_path.3 libssh2_agent_userauth.3 libssh2_banner_set.3 libssh2_base64_decode.3 @@ -134,6 +136,7 @@ set(MAN_PAGES libssh2_session_free.3 libssh2_session_get_blocking.3 libssh2_session_get_timeout.3 + libssh2_session_handshake.3 libssh2_session_hostkey.3 libssh2_session_init.3 libssh2_session_init_ex.3 @@ -200,6 +203,7 @@ set(MAN_PAGES libssh2_userauth_publickey.3 libssh2_userauth_publickey_fromfile.3 libssh2_userauth_publickey_fromfile_ex.3 + libssh2_userauth_publickey_frommemory.3 libssh2_version.3) include(GNUInstallDirs) diff --git a/vendor/libssh2/docs/HACKING.CRYPTO b/vendor/libssh2/docs/HACKING.CRYPTO index a8a6a0618..e1c4f38d9 100644 --- a/vendor/libssh2/docs/HACKING.CRYPTO +++ b/vendor/libssh2/docs/HACKING.CRYPTO @@ -13,6 +13,38 @@ Procedures listed as "void" may indeed have a result type: the void indication indicates the libssh2 core modules never use the function result. +0) Build system. + +Adding a crypto backend to the autotools build system (./configure) is easy: + +0.1) Add one new line in configure.ac + +m4_set_add([crypto_backends], [newname]) + +This automatically creates a --with-crypto=newname option. + +0.2) Add an m4_case stanza to LIBSSH2_CRYPTO_CHECK in acinclude.m4 + +This must check for all required libraries, and if found set and AC_SUBST a +variable with the library linking flags. The recommended method is to use +LIBSSH2_LIB_HAVE_LINKFLAGS from LIBSSH2_CRYPTO_CHECK, which automatically +creates and handles a --with-$newname-prefix option and sets an +LTLIBNEWNAME variable on success. + +0.3) Create Makefile.newname.inc in the top-level directory + +This must set CRYPTO_CSOURCES, CRYPTO_HHEADERS and CRYPTO_LTLIBS. +Set CRYPTO_CSOURCES and CRYPTO_HHEADERS to the new backend source files +and set CRYPTO_LTLIBS to the required library linking parameters, e.g. +$(LTLIBNEWNAME) as generated by by LIBSSH2_LIB_HAVE_LINKFLAGS. + +0.4) Add a new block in src/Makefile.am + +if NEWNAME +include ../Makefile.newname.inc +endif + + 1) Crypto library initialization/termination. void libssh2_crypto_init(void); @@ -61,7 +93,7 @@ SHA_DIGEST_LENGTH #define to 20, the SHA-1 digest length. libssh2_sha1_ctx -Type of an SHA1 computation context. Generally a struct. +Type of an SHA-1 computation context. Generally a struct. int libssh2_sha1_init(libssh2_sha1_ctx *x); Initializes the SHA-1 computation context at x. @@ -75,7 +107,7 @@ Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. void libssh2_sha1_final(libssh2_sha1_ctx ctx, - unsigned char output[SHA1_DIGEST_LEN]); + unsigned char output[SHA_DIGEST_LEN]); Get the computed SHA-1 signature from context ctx and store it into the output buffer. Release the context. @@ -196,7 +228,7 @@ the keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). Returns 1 for success and 0 for failure. -4) Bidirectional Key ciphers. +4) Bidirectional key ciphers. _libssh2_cipher_ctx Type of a cipher computation context. @@ -252,10 +284,6 @@ LIBSSH2_AES_CTR #define as 1 if the crypto library supports AES in CTR mode, else 0. If defined as 0, the rest of this section can be omitted. -void _libssh2_init_aes_ctr(void); -Initialize static AES CTR ciphers. -This procedure is already prototyped in crypto.h. - _libssh2_cipher_aes128ctr AES-128-CTR algorithm identifier initializer. #define with constant value of type _libssh2_cipher_type(). @@ -305,10 +333,42 @@ TripleDES-CBC algorithm identifier initializer. #define with constant value of type _libssh2_cipher_type(). -5) Big numbers. +5) Diffie-Hellman support. + +5.1) Diffie-Hellman context. +_libssh2_dh_ctx +Type of a Diffie-Hellman computation context. +Must always be defined. + +5.2) Diffie-Hellman computation procedures. +void libssh2_dh_init(_libssh2_dh_ctx *dhctx); +Initializes the Diffie-Hellman context at `dhctx'. No effective context +creation needed here. + +int libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order, + _libssh2_bn_ctx *bnctx); +Generates a Diffie-Hellman key pair using base `g', prime `p' and the given +`group_order'. Can use the given big number context `bnctx' if needed. +The private key is stored as opaque in the Diffie-Hellman context `*dhctx' and +the public key is returned in `public'. +0 is returned upon success, else -1. + +int libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p, _libssh2_bn_ctx * bnctx) +Computes the Diffie-Hellman secret from the previously created context `*dhctx', +the public key `f' from the other party and the same prime `p' used at +context creation. The result is stored in `secret'. +0 is returned upon success, else -1. + +void libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) +Destroys Diffie-Hellman context at `dhctx' and resets its storage. + + +6) Big numbers. Positive multi-byte integers support is sufficient. -5.1) Computation contexts. +6.1) Computation contexts. This has a real meaning if the big numbers computations need some context storage. If not, use a dummy type and functions (macros). @@ -316,13 +376,13 @@ _libssh2_bn_ctx Type of multiple precision computation context. May not be empty. if not used, #define as char, for example. -libssh2_bn_ctx _libssh2_bn_ctx_new(void); +_libssh2_bn_ctx _libssh2_bn_ctx_new(void); Returns a new multiple precision computation context. void _libssh2_bn_ctx_free(_libssh2_bn_ctx ctx); Releases a multiple precision computation context. -5.2) Computation support. +6.2) Computation support. _libssh2_bn Type of multiple precision numbers (aka bignumbers or huge integers) for the crypto library. @@ -339,7 +399,7 @@ allocates the number. Returns a value of type _libssh2_bn *. void _libssh2_bn_free(_libssh2_bn *bn); Destroys the multiple precision number at bn. -unsigned long _libssh2_bn_bytes(libssh2_bn *bn); +unsigned long _libssh2_bn_bytes(_libssh2_bn *bn); Get the number of bytes needed to store the bits of the multiple precision number at bn. @@ -362,22 +422,8 @@ Converts the absolute value of bn into big-endian form and store it at val. val must point to _libssh2_bn_bytes(bn) bytes of memory. Returns the length of the big-endian number. -void _libssh2_bn_rand(_libssh2_bn *bn, int bits, int top, int bottom); -Generates a cryptographically strong pseudo-random number of bits in -length and stores it in bn. If top is -1, the most significant bit of the -random number can be zero. If top is 0, it is set to 1, and if top is 1, the -two most significant bits of the number will be set to 1, so that the product -of two such random numbers will always have 2*bits length. If bottom is true, -the number will be odd. -void _libssh2_bn_mod_exp(_libssh2_bn *r, _libssh2_bn *a, - _libssh2_bn *p, _libssh2_bn *m, - _libssh2_bn_ctx *ctx); -Computes a to the p-th power modulo m and stores the result into r (r=a^p % m). -May use the given context. - - -6) Private key algorithms. +7) Private key algorithms. Format of an RSA public key: a) "ssh-rsa". b) RSA exponent, MSB first, with high order bit = 0. @@ -421,7 +467,7 @@ Both buffers have to be allocated using LIBSSH2_ALLOC(). Returns 0 if OK, else -1. This procedure is already prototyped in crypto.h. -6.1) RSA +7.1) RSA LIBSSH2_RSA #define as 1 if the crypto library supports RSA, else 0. If defined as 0, the rest of this section can be omitted. @@ -515,7 +561,7 @@ void _libssh2_rsa_free(libssh2_rsa_ctx *rsactx); Releases the RSA computation context at rsactx. -6.2) DSA +7.2) DSA LIBSSH2_DSA #define as 1 if the crypto library supports DSA, else 0. If defined as 0, the rest of this section can be omitted. @@ -565,7 +611,7 @@ This procedure is already prototyped in crypto.h. int _libssh2_dsa_sha1_verify(libssh2_dsa_ctx *dsactx, const unsigned char *sig, const unsigned char *m, unsigned long m_len); -Verify (sig, siglen) signature of (m, m_len) using an SHA1 hash and the +Verify (sig, siglen) signature of (m, m_len) using an SHA-1 hash and the DSA context. Returns 0 if OK, else -1. This procedure is already prototyped in crypto.h. @@ -581,7 +627,7 @@ void _libssh2_dsa_free(libssh2_dsa_ctx *dsactx); Releases the DSA computation context at dsactx. -7) Miscellaneous +8) Miscellaneous void libssh2_prepare_iovec(struct iovec *vector, unsigned int len); Prepare len consecutive iovec slots before using them. diff --git a/vendor/libssh2/docs/INSTALL_AUTOTOOLS b/vendor/libssh2/docs/INSTALL_AUTOTOOLS index d6eae59af..515001e35 100644 --- a/vendor/libssh2/docs/INSTALL_AUTOTOOLS +++ b/vendor/libssh2/docs/INSTALL_AUTOTOOLS @@ -7,6 +7,22 @@ Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. +When Building directly from Master +================================== + +If you want to build directly from the git repository, you must first +generate the configure script and Makefile using autotools. There is +a convenience script that calls all tools in the correct order. Make +sure that autoconf, automake and libtool are installed on your system, +then execute the following script: + + ./buildconf + +After executing this script, you can build the project as usual: + + ./configure + make + Basic Installation ================== diff --git a/vendor/libssh2/docs/INSTALL_CMAKE b/vendor/libssh2/docs/INSTALL_CMAKE index e0b851510..b9261b344 100644 --- a/vendor/libssh2/docs/INSTALL_CMAKE +++ b/vendor/libssh2/docs/INSTALL_CMAKE @@ -176,4 +176,4 @@ builds your project: [1] https://www.cmake.org/cmake/resources/software.html [2] https://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html [3] https://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#package-registry -[4] http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html +[4] https://blog.kitware.com/wp-content/uploads/2016/01/kitware_quarterly1009.pdf diff --git a/vendor/libssh2/docs/Makefile.am b/vendor/libssh2/docs/Makefile.am index 688d8d00a..6df033710 100644 --- a/vendor/libssh2/docs/Makefile.am +++ b/vendor/libssh2/docs/Makefile.am @@ -8,8 +8,10 @@ dist_man_MANS = \ libssh2_agent_disconnect.3 \ libssh2_agent_free.3 \ libssh2_agent_get_identity.3 \ + libssh2_agent_get_identity_path.3 \ libssh2_agent_init.3 \ libssh2_agent_list_identities.3 \ + libssh2_agent_set_identity_path.3 \ libssh2_agent_userauth.3 \ libssh2_banner_set.3 \ libssh2_base64_decode.3 \ diff --git a/vendor/libssh2/docs/Makefile.in b/vendor/libssh2/docs/Makefile.in index 7ba7369e9..dadaf1fc7 100644 --- a/vendor/libssh2/docs/Makefile.in +++ b/vendor/libssh2/docs/Makefile.in @@ -189,7 +189,7 @@ GREP = @GREP@ HAVE_LIBBCRYPT = @HAVE_LIBBCRYPT@ HAVE_LIBCRYPT32 = @HAVE_LIBCRYPT32@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ -HAVE_LIBMBEDTLS = @HAVE_LIBMBEDTLS@ +HAVE_LIBMBEDCRYPTO = @HAVE_LIBMBEDCRYPTO@ HAVE_LIBSSL = @HAVE_LIBSSL@ HAVE_LIBZ = @HAVE_LIBZ@ INSTALL = @INSTALL@ @@ -205,8 +205,8 @@ LIBCRYPT32 = @LIBCRYPT32@ LIBCRYPT32_PREFIX = @LIBCRYPT32_PREFIX@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ -LIBMBEDTLS = @LIBMBEDTLS@ -LIBMBEDTLS_PREFIX = @LIBMBEDTLS_PREFIX@ +LIBMBEDCRYPTO = @LIBMBEDCRYPTO@ +LIBMBEDCRYPTO_PREFIX = @LIBMBEDCRYPTO_PREFIX@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSREQUIRED = @LIBSREQUIRED@ @@ -221,7 +221,7 @@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ LTLIBCRYPT32 = @LTLIBCRYPT32@ LTLIBGCRYPT = @LTLIBGCRYPT@ -LTLIBMBEDTLS = @LTLIBMBEDTLS@ +LTLIBMBEDCRYPTO = @LTLIBMBEDCRYPTO@ LTLIBOBJS = @LTLIBOBJS@ LTLIBSSL = @LTLIBSSL@ LTLIBZ = @LTLIBZ@ @@ -312,8 +312,10 @@ dist_man_MANS = \ libssh2_agent_disconnect.3 \ libssh2_agent_free.3 \ libssh2_agent_get_identity.3 \ + libssh2_agent_get_identity_path.3 \ libssh2_agent_init.3 \ libssh2_agent_list_identities.3 \ + libssh2_agent_set_identity_path.3 \ libssh2_agent_userauth.3 \ libssh2_banner_set.3 \ libssh2_base64_decode.3 \ diff --git a/vendor/libssh2/docs/SECURITY.md b/vendor/libssh2/docs/SECURITY.md index 83cf65b7a..6f442eb63 100644 --- a/vendor/libssh2/docs/SECURITY.md +++ b/vendor/libssh2/docs/SECURITY.md @@ -64,7 +64,7 @@ announcement. [distros@openwall](http://oss-security.openwall.org/wiki/mailing-lists/distros) when also informing and preparing them for the upcoming public security vulnerability announcement - attach the advisory draft for information. Note - that 'distros' won't accept an embargo longer than 19 days. + that 'distros' won't accept an embargo longer than 14 days. - Update the "security advisory" with the CVE number. @@ -96,5 +96,5 @@ libssh2 project and you have shown an understanding for the project and its way of working. You must've been around for a good while and you should have no plans in vanishing in the near future. -We do not make the list of partipants public mostly because it tends to vary +We do not make the list of participants public mostly because it tends to vary somewhat over time and a list somewhere will only risk getting outdated. diff --git a/vendor/libssh2/docs/libssh2_agent_get_identity_path.3 b/vendor/libssh2/docs/libssh2_agent_get_identity_path.3 new file mode 100644 index 000000000..58d6dd569 --- /dev/null +++ b/vendor/libssh2/docs/libssh2_agent_get_identity_path.3 @@ -0,0 +1,22 @@ +.\" +.\" Copyright (c) 2019 by Will Cosgrove +.\" +.TH libssh2_agent_get_identity_path 3 "6 Mar 2019" "libssh2 1.9" "libssh2 manual" +.SH NAME +libssh2_agent_get_identity_path - gets the custom ssh-agent socket path +.SH SYNOPSIS +#include + +const char * +libssh2_agent_get_identity_path(LIBSSH2_AGENT *agent); +.SH DESCRIPTION +Returns the custom agent identity socket path if set using libssh2_agent_set_identity_path() + +.SH RETURN VALUE +Returns the socket path on disk. +.SH AVAILABILITY +Added in libssh2 1.9 +.SH SEE ALSO +.BR libssh2_agent_init(3) +.BR libssh2_agent_set_identity_path(3) + diff --git a/vendor/libssh2/docs/libssh2_agent_set_identity_path.3 b/vendor/libssh2/docs/libssh2_agent_set_identity_path.3 new file mode 100644 index 000000000..73e1266d1 --- /dev/null +++ b/vendor/libssh2/docs/libssh2_agent_set_identity_path.3 @@ -0,0 +1,22 @@ +.\" +.\" Copyright (c) 2019 by Will Cosgrove +.\" +.TH libssh2_agent_set_identity_path 3 "6 Mar 2019" "libssh2 1.9" "libssh2 manual" +.SH NAME +libssh2_agent_set_identity_path - set an ssh-agent socket path on disk +.SH SYNOPSIS +#include + +void +libssh2_agent_set_identity_path(LIBSSH2_AGENT *agent, const char *path); +.SH DESCRIPTION +Allows a custom agent identity socket path instead of the default SSH_AUTH_SOCK env value + +.SH RETURN VALUE +Returns void +.SH AVAILABILITY +Added in libssh2 1.9 +.SH SEE ALSO +.BR libssh2_agent_init(3) +.BR libssh2_agent_get_identity_path(3) + diff --git a/vendor/libssh2/docs/libssh2_channel_wait_eof.3 b/vendor/libssh2/docs/libssh2_channel_wait_eof.3 index 47587e6b1..8a3dc4757 100644 --- a/vendor/libssh2/docs/libssh2_channel_wait_eof.3 +++ b/vendor/libssh2/docs/libssh2_channel_wait_eof.3 @@ -8,7 +8,7 @@ int libssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel); .SH DESCRIPTION -Wait for the remote end to acknowledge an EOF request. +Wait for the remote end to send EOF. .SH RETURN VALUE Return 0 on success or negative on failure. It returns diff --git a/vendor/libssh2/docs/libssh2_hostkey_hash.3 b/vendor/libssh2/docs/libssh2_hostkey_hash.3 index c2f164400..d57fc0dd5 100644 --- a/vendor/libssh2/docs/libssh2_hostkey_hash.3 +++ b/vendor/libssh2/docs/libssh2_hostkey_hash.3 @@ -11,12 +11,12 @@ libssh2_hostkey_hash(LIBSSH2_SESSION *session, int hash_type); \fIsession\fP - Session instance as returned by .BR libssh2_session_init_ex(3) -\fIhash_type\fP - One of: \fBLIBSSH2_HOSTKEY_HASH_MD5\fP or -\fBLIBSSH2_HOSTKEY_HASH_SHA1\fP. +\fIhash_type\fP - One of: \fBLIBSSH2_HOSTKEY_HASH_MD5\fP, +\fBLIBSSH2_HOSTKEY_HASH_SHA1\fP or \fBLIBSSH2_HOSTKEY_HASH_SHA256\fP. Returns the computed digest of the remote system's hostkey. The length of the returned string is hash_type specific (e.g. 16 bytes for MD5, -20 bytes for SHA1). +20 bytes for SHA1, 32 bytes for SHA256). .SH RETURN VALUE Computed hostkey hash value, or NULL if the information is not available (either the session has not yet been started up, or the requested hash diff --git a/vendor/libssh2/docs/libssh2_session_supported_algs.3 b/vendor/libssh2/docs/libssh2_session_supported_algs.3 index e8568f2e8..6e414a90c 100644 --- a/vendor/libssh2/docs/libssh2_session_supported_algs.3 +++ b/vendor/libssh2/docs/libssh2_session_supported_algs.3 @@ -10,9 +10,9 @@ int libssh2_session_supported_algs(LIBSSH2_SESSION* session, const char*** algs); .SH DESCRIPTION \fIsession\fP - An instance of initialized LIBSSH2_SESSION (the function will -use its pointer to the memory allocation function). \fImethod_type\fP - Method -type. See .BR \fIlibssh2_session_method_pref(3)\fP. \fIalgs\fP - Address of a -pointer that will point to an array of returned algorithms +use its pointer to the memory allocation function). \fImethod_type\fP - +Method type. See \fIlibssh2_session_method_pref(3)\fP. \fIalgs\fP - Address +of a pointer that will point to an array of returned algorithms Get a list of supported algorithms for the given \fImethod_type\fP. The method_type parameter is equivalent to method_type in @@ -44,9 +44,9 @@ rc = libssh2_session_supported_algs(session, if (rc>0) { /* the call succeeded, do sth. with the list of algorithms (e.g. list them)... */ - printf("Supported symmetric algorithms:\n"); + printf("Supported symmetric algorithms:\\n"); for ( i=0; i 1) + if(argc > 1) server_ip = argv[1]; - if (argc > 2) + if(argc > 2) username = argv[2]; - if (argc > 3) + if(argc > 3) password = argv[3]; - if (argc > 4) + if(argc > 4) local_listenip = argv[4]; - if (argc > 5) + if(argc > 5) local_listenport = atoi(argv[5]); - if (argc > 6) + if(argc > 6) remote_desthost = argv[6]; - if (argc > 7) + if(argc > 7) remote_destport = atoi(argv[7]); - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } /* Connect to SSH server */ sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); #ifdef WIN32 - if (sock == INVALID_SOCKET) { + if(sock == INVALID_SOCKET) { fprintf(stderr, "failed to open socket!\n"); return -1; } #else - if (sock == -1) { + if(sock == -1) { perror("socket"); return -1; } #endif sin.sin_family = AF_INET; - if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) { + sin.sin_addr.s_addr = inet_addr(server_ip); + if(INADDR_NONE == sin.sin_addr.s_addr) { perror("inet_addr"); return -1; } sin.sin_port = htons(22); - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -159,44 +160,46 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); fprintf(stderr, "Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "password")) + if(strstr(userauthlist, "password")) auth |= AUTH_PASSWORD; - if (strstr(userauthlist, "publickey")) + if(strstr(userauthlist, "publickey")) auth |= AUTH_PUBLICKEY; /* check for options */ if(argc > 8) { - if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], "-p")) + if((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], "-p")) auth = AUTH_PASSWORD; - if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], "-k")) + if((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], "-k")) auth = AUTH_PUBLICKEY; } - if (auth & AUTH_PASSWORD) { - if (libssh2_userauth_password(session, username, password)) { + if(auth & AUTH_PASSWORD) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else if (auth & AUTH_PUBLICKEY) { - if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, - keyfile2, password)) { + } + else if(auth & AUTH_PUBLICKEY) { + if(libssh2_userauth_publickey_fromfile(session, username, keyfile1, + keyfile2, password)) { fprintf(stderr, "\tAuthentication by public key failed!\n"); goto shutdown; } fprintf(stderr, "\tAuthentication by public key succeeded.\n"); - } else { + } + else { fprintf(stderr, "No supported authentication methods found!\n"); goto shutdown; } listensock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); #ifdef WIN32 - if (listensock == INVALID_SOCKET) { + if(listensock == INVALID_SOCKET) { fprintf(stderr, "failed to open listen socket!\n"); return -1; } #else - if (listensock == -1) { + if(listensock == -1) { perror("socket"); return -1; } @@ -204,18 +207,20 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(local_listenport); - if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(local_listenip))) { + sin.sin_addr.s_addr = inet_addr(local_listenip); + if(INADDR_NONE == sin.sin_addr.s_addr) { perror("inet_addr"); goto shutdown; } sockopt = 1; - setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)); - sinlen=sizeof(sin); - if (-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) { + setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, + sizeof(sockopt)); + sinlen = sizeof(sin); + if(-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) { perror("bind"); goto shutdown; } - if (-1 == listen(listensock, 2)) { + if(-1 == listen(listensock, 2)) { perror("listen"); goto shutdown; } @@ -225,12 +230,12 @@ int main(int argc, char *argv[]) forwardsock = accept(listensock, (struct sockaddr *)&sin, &sinlen); #ifdef WIN32 - if (forwardsock == INVALID_SOCKET) { + if(forwardsock == INVALID_SOCKET) { fprintf(stderr, "failed to accept forward socket!\n"); goto shutdown; } #else - if (forwardsock == -1) { + if(forwardsock == -1) { perror("accept"); goto shutdown; } @@ -244,7 +249,7 @@ int main(int argc, char *argv[]) channel = libssh2_channel_direct_tcpip_ex(session, remote_desthost, remote_destport, shost, sport); - if (!channel) { + if(!channel) { fprintf(stderr, "Could not open the direct-tcpip channel!\n" "(Note that this can be a problem at the server!" " Please review the server logs.)\n"); @@ -254,22 +259,23 @@ int main(int argc, char *argv[]) /* Must use non-blocking IO hereafter due to the current libssh2 API */ libssh2_session_set_blocking(session, 0); - while (1) { + while(1) { FD_ZERO(&fds); FD_SET(forwardsock, &fds); tv.tv_sec = 0; tv.tv_usec = 100000; rc = select(forwardsock + 1, &fds, NULL, NULL, &tv); - if (-1 == rc) { + if(-1 == rc) { perror("select"); goto shutdown; } - if (rc && FD_ISSET(forwardsock, &fds)) { + if(rc && FD_ISSET(forwardsock, &fds)) { len = recv(forwardsock, buf, sizeof(buf), 0); - if (len < 0) { + if(len < 0) { perror("read"); goto shutdown; - } else if (0 == len) { + } + else if(0 == len) { fprintf(stderr, "The client at %s:%d disconnected!\n", shost, sport); goto shutdown; @@ -277,34 +283,34 @@ int main(int argc, char *argv[]) wr = 0; while(wr < len) { i = libssh2_channel_write(channel, buf + wr, len - wr); - if (LIBSSH2_ERROR_EAGAIN == i) { + if(LIBSSH2_ERROR_EAGAIN == i) { continue; } - if (i < 0) { + if(i < 0) { fprintf(stderr, "libssh2_channel_write: %d\n", i); goto shutdown; } wr += i; } } - while (1) { + while(1) { len = libssh2_channel_read(channel, buf, sizeof(buf)); - if (LIBSSH2_ERROR_EAGAIN == len) + if(LIBSSH2_ERROR_EAGAIN == len) break; - else if (len < 0) { + else if(len < 0) { fprintf(stderr, "libssh2_channel_read: %d", (int)len); goto shutdown; } wr = 0; - while (wr < len) { + while(wr < len) { i = send(forwardsock, buf + wr, len - wr, 0); - if (i <= 0) { + if(i <= 0) { perror("write"); goto shutdown; } wr += i; } - if (libssh2_channel_eof(channel)) { + if(libssh2_channel_eof(channel)) { fprintf(stderr, "The server at %s:%d disconnected!\n", remote_desthost, remote_destport); goto shutdown; @@ -320,7 +326,7 @@ int main(int argc, char *argv[]) close(forwardsock); close(listensock); #endif - if (channel) + if(channel) libssh2_channel_free(channel); libssh2_session_disconnect(session, "Client disconnecting normally"); libssh2_session_free(session); diff --git a/vendor/libssh2/example/scp.c b/vendor/libssh2/example/scp.c index e8e4217d7..9ad1e7d40 100644 --- a/vendor/libssh2/example/scp.c +++ b/vendor/libssh2/example/scp.c @@ -38,9 +38,9 @@ int main(int argc, char *argv[]) const char *fingerprint; LIBSSH2_SESSION *session; LIBSSH2_CHANNEL *channel; - const char *username="username"; - const char *password="password"; - const char *scppath="/tmp/TEST"; + const char *username = "username"; + const char *password = "password"; + const char *scppath = "/tmp/TEST"; libssh2_struct_stat fileinfo; int rc; libssh2_struct_stat_size got = 0; @@ -49,31 +49,32 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } - if (argc > 4) { + if(argc > 4) { scppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -86,8 +87,8 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -119,18 +120,20 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) { +#define HOME_DIR "/home/username/" + if(libssh2_userauth_publickey_fromfile(session, username, + HOME_DIR ".ssh/id_rsa.pub", + HOME_DIR ".ssh/id_rsa", + password)) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -139,7 +142,7 @@ int main(int argc, char *argv[]) /* Request a file via SCP */ channel = libssh2_scp_recv2(session, scppath, &fileinfo); - if (!channel) { + if(!channel) { fprintf(stderr, "Unable to open a session: %d\n", libssh2_session_last_errno(session)); goto shutdown; @@ -148,7 +151,7 @@ int main(int argc, char *argv[]) while(got < fileinfo.st_size) { char mem[1024]; - int amount=sizeof(mem); + int amount = sizeof(mem); if((fileinfo.st_size -got) < amount) { amount = (int)(fileinfo.st_size -got); @@ -170,7 +173,8 @@ int main(int argc, char *argv[]) shutdown: - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, + "Normal Shutdown, Thank you for playing"); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/scp_nonblock.c b/vendor/libssh2/example/scp_nonblock.c index 45f66b83a..bc5bdb3dc 100644 --- a/vendor/libssh2/example/scp_nonblock.c +++ b/vendor/libssh2/example/scp_nonblock.c @@ -85,9 +85,9 @@ int main(int argc, char *argv[]) const char *fingerprint; LIBSSH2_SESSION *session; LIBSSH2_CHANNEL *channel; - const char *username="username"; - const char *password="password"; - const char *scppath="/tmp/TEST"; + const char *username = "username"; + const char *password = "password"; + const char *scppath = "/tmp/TEST"; libssh2_struct_stat fileinfo; #ifdef HAVE_GETTIMEOFDAY struct timeval start; @@ -103,31 +103,32 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } - if (argc > 4) { + if(argc > 4) { scppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -140,14 +141,14 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in))) { fprintf(stderr, "failed to connect!\n"); return -1; } /* Create a session instance */ session = libssh2_session_init(); - if (!session) + if(!session) return -1; /* Since we have set non-blocking, tell libssh2 we are non-blocking */ @@ -160,9 +161,9 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = libssh2_session_handshake(session, sock)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; } @@ -179,24 +180,25 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = libssh2_userauth_password(session, username, password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - while ((rc = libssh2_userauth_publickey_fromfile(session, username, - "/home/username/" - ".ssh/id_rsa.pub", - "/home/username/" - ".ssh/id_rsa", - password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = libssh2_userauth_publickey_fromfile(session, username, + "/home/username/" + ".ssh/id_rsa.pub", + "/home/username/" + ".ssh/id_rsa", + password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -211,7 +213,7 @@ int main(int argc, char *argv[]) do { channel = libssh2_scp_recv2(session, scppath, &fileinfo); - if (!channel) { + if(!channel) { if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { char *err_msg; @@ -224,7 +226,7 @@ int main(int argc, char *argv[]) waitsocket(sock, session); } } - } while (!channel); + } while(!channel); fprintf(stderr, "libssh2_scp_recv() is done, now receive data!\n"); while(got < fileinfo.st_size) { @@ -232,22 +234,22 @@ int main(int argc, char *argv[]) int rc; do { - int amount=sizeof(mem); + int amount = sizeof(mem); - if ((fileinfo.st_size -got) < amount) { + if((fileinfo.st_size -got) < amount) { amount = (int)(fileinfo.st_size - got); } /* loop until we block */ rc = libssh2_channel_read(channel, mem, amount); - if (rc > 0) { + if(rc > 0) { write(1, mem, rc); got += rc; total += rc; } - } while (rc > 0); + } while(rc > 0); - if ((rc == LIBSSH2_ERROR_EAGAIN) && (got < fileinfo.st_size)) { + if((rc == LIBSSH2_ERROR_EAGAIN) && (got < fileinfo.st_size)) { /* this is due to blocking that would occur otherwise so we loop on this condition */ @@ -262,10 +264,11 @@ int main(int argc, char *argv[]) gettimeofday(&end, NULL); time_ms = tvdiff(end, start); - fprintf(stderr, "Got " LIBSSH2_STRUCT_STAT_SIZE_FORMAT " bytes in %ld ms = %.1f bytes/sec spin: %d\n", total, - time_ms, total/(time_ms/1000.0), spin); + fprintf(stderr, "Got %ld bytes in %ld ms = %.1f bytes/sec spin: %d\n", + (long)total, + time_ms, total/(time_ms/1000.0), spin); #else - fprintf(stderr, "Got " LIBSSH2_STRUCT_STAT_SIZE_FORMAT " bytes spin: %d\n", total, spin); + fprintf(stderr, "Got %ld bytes spin: %d\n", (long)total, spin); #endif libssh2_channel_free(channel); diff --git a/vendor/libssh2/example/scp_write.c b/vendor/libssh2/example/scp_write.c index eef6e811f..030232ec6 100644 --- a/vendor/libssh2/example/scp_write.c +++ b/vendor/libssh2/example/scp_write.c @@ -38,10 +38,10 @@ int main(int argc, char *argv[]) const char *fingerprint; LIBSSH2_SESSION *session = NULL; LIBSSH2_CHANNEL *channel; - const char *username="username"; - const char *password="password"; - const char *loclfile="scp_write.c"; - const char *scppath="/tmp/TEST"; + const char *username = "username"; + const char *password = "password"; + const char *loclfile = "scp_write.c"; + const char *scppath = "/tmp/TEST"; FILE *local; int rc; char mem[1024]; @@ -53,39 +53,40 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } if(argc > 4) { loclfile = argv[4]; } - if (argc > 5) { + if(argc > 5) { scppath = argv[5]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } local = fopen(loclfile, "rb"); - if (!local) { + if(!local) { fprintf(stderr, "Can't open local file %s\n", loclfile); return -1; } @@ -105,8 +106,8 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -138,18 +139,20 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) { +#define HOME "/home/username/" + if(libssh2_userauth_publickey_fromfile(session, username, + HOME ".ssh/id_rsa.pub", + HOME ".ssh/id_rsa", + password)) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -159,7 +162,7 @@ int main(int argc, char *argv[]) channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777, (unsigned long)fileinfo.st_size); - if (!channel) { + if(!channel) { char *errmsg; int errlen; int err = libssh2_session_last_error(session, &errmsg, &errlen, 0); @@ -170,7 +173,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "SCP session waiting to send file\n"); do { nread = fread(mem, 1, sizeof(mem), local); - if (nread <= 0) { + if(nread <= 0) { /* end of file */ break; } @@ -179,7 +182,7 @@ int main(int argc, char *argv[]) do { /* write the same data over and over, until error or completion */ rc = libssh2_channel_write(channel, ptr, nread); - if (rc < 0) { + if(rc < 0) { fprintf(stderr, "ERROR %d\n", rc); break; } @@ -188,9 +191,9 @@ int main(int argc, char *argv[]) ptr += rc; nread -= rc; } - } while (nread); + } while(nread); - } while (1); + } while(1); fprintf(stderr, "Sending EOF\n"); libssh2_channel_send_eof(channel); @@ -207,7 +210,7 @@ int main(int argc, char *argv[]) shutdown: if(session) { - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, "Normal Shutdown"); libssh2_session_free(session); } #ifdef WIN32 @@ -215,7 +218,7 @@ int main(int argc, char *argv[]) #else close(sock); #endif - if (local) + if(local) fclose(local); fprintf(stderr, "all done\n"); diff --git a/vendor/libssh2/example/scp_write_nonblock.c b/vendor/libssh2/example/scp_write_nonblock.c index bb8e39dcb..9226322e9 100644 --- a/vendor/libssh2/example/scp_write_nonblock.c +++ b/vendor/libssh2/example/scp_write_nonblock.c @@ -73,10 +73,10 @@ int main(int argc, char *argv[]) const char *fingerprint; LIBSSH2_SESSION *session = NULL; LIBSSH2_CHANNEL *channel; - const char *username="username"; - const char *password="password"; - const char *loclfile="scp_write.c"; - const char *scppath="/tmp/TEST"; + const char *username = "username"; + const char *password = "password"; + const char *loclfile = "scp_write.c"; + const char *scppath = "/tmp/TEST"; FILE *local; int rc; char mem[1024*100]; @@ -92,39 +92,40 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } if(argc > 4) { loclfile = argv[4]; } - if (argc > 5) { + if(argc > 5) { scppath = argv[5]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } local = fopen(loclfile, "rb"); - if (!local) { + if(!local) { fprintf(stderr, "Can't local file %s\n", loclfile); return -1; } @@ -140,8 +141,8 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -158,8 +159,8 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) - == LIBSSH2_ERROR_EAGAIN); + while((rc = libssh2_session_handshake(session, sock)) + == LIBSSH2_ERROR_EAGAIN); if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; @@ -177,21 +178,24 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = libssh2_userauth_password(session, username, password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - while ((rc = libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { +#define HOME "/home/username/" + while((rc = libssh2_userauth_publickey_fromfile(session, username, + HOME ".ssh/id_rsa.pub", + HOME ".ssh/id_rsa", + password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -202,21 +206,21 @@ int main(int argc, char *argv[]) channel = libssh2_scp_send(session, scppath, fileinfo.st_mode & 0777, (unsigned long)fileinfo.st_size); - if ((!channel) && (libssh2_session_last_errno(session) != - LIBSSH2_ERROR_EAGAIN)) { + if((!channel) && (libssh2_session_last_errno(session) != + LIBSSH2_ERROR_EAGAIN)) { char *err_msg; libssh2_session_last_error(session, &err_msg, NULL, 0); fprintf(stderr, "%s\n", err_msg); goto shutdown; } - } while (!channel); + } while(!channel); fprintf(stderr, "SCP session waiting to send file\n"); start = time(NULL); do { nread = fread(mem, 1, sizeof(mem), local); - if (nread <= 0) { + if(nread <= 0) { /* end of file */ break; } @@ -226,12 +230,12 @@ int main(int argc, char *argv[]) prev = 0; do { - while ((rc = libssh2_channel_write(channel, ptr, nread)) == - LIBSSH2_ERROR_EAGAIN) { + while((rc = libssh2_channel_write(channel, ptr, nread)) == + LIBSSH2_ERROR_EAGAIN) { waitsocket(sock, session); prev = 0; } - if (rc < 0) { + if(rc < 0) { fprintf(stderr, "ERROR %d total %ld / %d prev %d\n", rc, total, (int)nread, (int)prev); break; @@ -243,8 +247,8 @@ int main(int argc, char *argv[]) nread -= rc; ptr += rc; } - } while (nread); - } while (!nread); /* only continue if nread was drained */ + } while(nread); + } while(!nread); /* only continue if nread was drained */ duration = (int)(time(NULL)-start); @@ -252,22 +256,22 @@ int main(int argc, char *argv[]) total, duration, total/(double)duration); fprintf(stderr, "Sending EOF\n"); - while (libssh2_channel_send_eof(channel) == LIBSSH2_ERROR_EAGAIN); + while(libssh2_channel_send_eof(channel) == LIBSSH2_ERROR_EAGAIN); fprintf(stderr, "Waiting for EOF\n"); - while (libssh2_channel_wait_eof(channel) == LIBSSH2_ERROR_EAGAIN); + while(libssh2_channel_wait_eof(channel) == LIBSSH2_ERROR_EAGAIN); fprintf(stderr, "Waiting for channel to close\n"); - while (libssh2_channel_wait_closed(channel) == LIBSSH2_ERROR_EAGAIN); + while(libssh2_channel_wait_closed(channel) == LIBSSH2_ERROR_EAGAIN); libssh2_channel_free(channel); channel = NULL; shutdown: - while (libssh2_session_disconnect(session, - "Normal Shutdown, Thank you for playing") == - LIBSSH2_ERROR_EAGAIN); + while(libssh2_session_disconnect(session, + "Normal Shutdown,") == + LIBSSH2_ERROR_EAGAIN); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/sftp.c b/vendor/libssh2/example/sftp.c index 0feb534d0..8f67244a6 100644 --- a/vendor/libssh2/example/sftp.c +++ b/vendor/libssh2/example/sftp.c @@ -37,18 +37,19 @@ #include -const char *keyfile1="~/.ssh/id_rsa.pub"; -const char *keyfile2="~/.ssh/id_rsa"; -const char *username="username"; -const char *password="password"; -const char *sftppath="/tmp/TEST"; - - -static void kbd_callback(const char *name, int name_len, - const char *instruction, int instruction_len, int num_prompts, - const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, - LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, - void **abstract) +const char *keyfile1 = "~/.ssh/id_rsa.pub"; +const char *keyfile2 = "~/.ssh/id_rsa"; +const char *username = "username"; +const char *password = "password"; +const char *sftppath = "/tmp/TEST"; + + +static void kbd_callback(const char *name, int name_len, + const char *instruction, int instruction_len, + int num_prompts, + const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, + LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, + void **abstract) { int i; size_t n; @@ -67,7 +68,7 @@ static void kbd_callback(const char *name, int name_len, fprintf(stderr, "Number of prompts: %d\n\n", num_prompts); - for (i = 0; i < num_prompts; i++) { + for(i = 0; i < num_prompts; i++) { fprintf(stderr, "Prompt %d from server: '", i); fwrite(prompts[i].text, 1, prompts[i].length, stderr); fprintf(stderr, "'\n"); @@ -75,7 +76,7 @@ static void kbd_callback(const char *name, int name_len, fprintf(stderr, "Please type response: "); fgets(buf, sizeof(buf), stdin); n = strlen(buf); - while (n > 0 && strchr("\r\n", buf[n - 1])) + while(n > 0 && strchr("\r\n", buf[n - 1])) n--; buf[n] = 0; @@ -108,16 +109,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -131,8 +133,8 @@ int main(int argc, char *argv[]) sftppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { + rc = libssh2_init(0); + if(rc != 0) { fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -146,8 +148,8 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -185,54 +187,61 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); fprintf(stderr, "Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "password") != NULL) { + if(strstr(userauthlist, "password") != NULL) { auth_pw |= 1; } - if (strstr(userauthlist, "keyboard-interactive") != NULL) { + if(strstr(userauthlist, "keyboard-interactive") != NULL) { auth_pw |= 2; } - if (strstr(userauthlist, "publickey") != NULL) { + if(strstr(userauthlist, "publickey") != NULL) { auth_pw |= 4; } - /* if we got an 4. argument we set this option if supported */ + /* if we got an 4. argument we set this option if supported */ if(argc > 5) { - if ((auth_pw & 1) && !strcasecmp(argv[5], "-p")) { + if((auth_pw & 1) && !strcasecmp(argv[5], "-p")) { auth_pw = 1; } - if ((auth_pw & 2) && !strcasecmp(argv[5], "-i")) { + if((auth_pw & 2) && !strcasecmp(argv[5], "-i")) { auth_pw = 2; } - if ((auth_pw & 4) && !strcasecmp(argv[5], "-k")) { + if((auth_pw & 4) && !strcasecmp(argv[5], "-k")) { auth_pw = 4; } } - if (auth_pw & 1) { + if(auth_pw & 1) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else if (auth_pw & 2) { + } + else if(auth_pw & 2) { /* Or via keyboard-interactive */ - if (libssh2_userauth_keyboard_interactive(session, username, &kbd_callback) ) { + if(libssh2_userauth_keyboard_interactive(session, username, + &kbd_callback) ) { fprintf(stderr, "\tAuthentication by keyboard-interactive failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, "\tAuthentication by keyboard-interactive succeeded.\n"); } - } else if (auth_pw & 4) { + } + else if(auth_pw & 4) { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, keyfile2, password)) { + if(libssh2_userauth_publickey_fromfile(session, username, keyfile1, + keyfile2, password)) { fprintf(stderr, "\tAuthentication by public key failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, "\tAuthentication by public key succeeded.\n"); } - } else { + } + else { fprintf(stderr, "No supported authentication methods found!\n"); goto shutdown; } @@ -240,7 +249,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "libssh2_sftp_init()!\n"); sftp_session = libssh2_sftp_init(session); - if (!sftp_session) { + if(!sftp_session) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } @@ -250,7 +259,7 @@ int main(int argc, char *argv[]) sftp_handle = libssh2_sftp_open(sftp_session, sftppath, LIBSSH2_FXF_READ, 0); - if (!sftp_handle) { + if(!sftp_handle) { fprintf(stderr, "Unable to open file with SFTP: %ld\n", libssh2_sftp_last_error(sftp_session)); goto shutdown; @@ -262,19 +271,20 @@ int main(int argc, char *argv[]) /* loop until we fail */ fprintf(stderr, "libssh2_sftp_read()!\n"); rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem)); - if (rc > 0) { + if(rc > 0) { write(1, mem, rc); - } else { + } + else { break; } - } while (1); + } while(1); libssh2_sftp_close(sftp_handle); libssh2_sftp_shutdown(sftp_session); shutdown: - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, "Normal Shutdown"); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/sftp_RW_nonblock.c b/vendor/libssh2/example/sftp_RW_nonblock.c index 133815aa1..70d87db35 100644 --- a/vendor/libssh2/example/sftp_RW_nonblock.c +++ b/vendor/libssh2/example/sftp_RW_nonblock.c @@ -79,10 +79,10 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *sftppath="/tmp/TEST"; /* source path */ - const char *dest="/tmp/TEST2"; /* destination path */ + const char *username = "username"; + const char *password = "password"; + const char *sftppath = "/tmp/TEST"; /* source path */ + const char *dest = "/tmp/TEST2"; /* destination path */ int rc; LIBSSH2_SFTP *sftp_session; LIBSSH2_SFTP_HANDLE *sftp_handle; @@ -90,21 +90,22 @@ int main(int argc, char *argv[]) char mem[1000]; struct timeval timeout; fd_set fd; + fd_set fd2; #ifdef WIN32 WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -117,7 +118,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = htonl(0x7F000001); - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -171,25 +172,26 @@ int main(int argc, char *argv[]) goto shutdown; } - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) + while((rc = libssh2_userauth_password(session, username, password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - while ((rc = - libssh2_userauth_publickey_fromfile(session, username, - "/home/username/" - ".ssh/id_rsa.pub", - "/home/username/" - ".ssh/id_rsa", - password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = + libssh2_userauth_publickey_fromfile(session, username, + "/home/username/" + ".ssh/id_rsa.pub", + "/home/username/" + ".ssh/id_rsa", + password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -209,15 +211,15 @@ int main(int argc, char *argv[]) goto shutdown; } } - } while (!sftp_session); + } while(!sftp_session); /* Request a file via SFTP */ do { sftp_handle = libssh2_sftp_open(sftp_session, sftppath, LIBSSH2_FXF_READ, 0); - if (!sftp_handle) { - if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { + if(!sftp_handle) { + if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { fprintf(stderr, "Unable to open file with SFTP\n"); goto shutdown; } @@ -226,7 +228,7 @@ int main(int argc, char *argv[]) waitsocket(sock, session); /* now we wait */ } } - } while (!sftp_handle); + } while(!sftp_handle); fprintf(stderr, "libssh2_sftp_open() is done, now receive data!\n"); do { @@ -242,7 +244,7 @@ int main(int argc, char *argv[]) /* write to temporary storage area */ fwrite(mem, rc, 1, tempstorage); } - } while (rc > 0); + } while(rc > 0); if(rc != LIBSSH2_ERROR_EAGAIN) { /* error or end of file */ @@ -253,11 +255,12 @@ int main(int argc, char *argv[]) timeout.tv_usec = 0; FD_ZERO(&fd); - + FD_ZERO(&fd2); FD_SET(sock, &fd); + FD_SET(sock, &fd2); /* wait for readable or writeable */ - rc = select(sock+1, &fd, &fd, NULL, &timeout); + rc = select(sock + 1, &fd, &fd2, NULL, &timeout); if(rc <= 0) { /* negative is error 0 is timeout */ @@ -265,7 +268,7 @@ int main(int argc, char *argv[]) break; } - } while (1); + } while(1); libssh2_sftp_close(sftp_handle); fclose(tempstorage); @@ -301,7 +304,7 @@ int main(int argc, char *argv[]) nread); ptr += rc; nread -= nread; - } while (rc >= 0); + } while(rc >= 0); if(rc != LIBSSH2_ERROR_EAGAIN) { /* error or end of file */ @@ -312,11 +315,12 @@ int main(int argc, char *argv[]) timeout.tv_usec = 0; FD_ZERO(&fd); - + FD_ZERO(&fd2); FD_SET(sock, &fd); + FD_SET(sock, &fd2); /* wait for readable or writeable */ - rc = select(sock+1, &fd, &fd, NULL, &timeout); + rc = select(sock + 1, &fd, &fd2, NULL, &timeout); if(rc <= 0) { /* negative is error 0 is timeout */ @@ -324,7 +328,7 @@ int main(int argc, char *argv[]) rc); break; } - } while (1); + } while(1); fprintf(stderr, "SFTP upload done!\n"); } else { @@ -336,7 +340,7 @@ int main(int argc, char *argv[]) shutdown: - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, "Normal Shutdown"); libssh2_session_free(session); #ifdef WIN32 @@ -344,7 +348,7 @@ int main(int argc, char *argv[]) #else close(sock); #endif - if (tempstorage) + if(tempstorage) fclose(tempstorage); fprintf(stderr, "all done\n"); diff --git a/vendor/libssh2/example/sftp_append.c b/vendor/libssh2/example/sftp_append.c index 788c51f5a..bfea1f727 100644 --- a/vendor/libssh2/example/sftp_append.c +++ b/vendor/libssh2/example/sftp_append.c @@ -40,10 +40,10 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *loclfile="sftp_write.c"; - const char *sftppath="/tmp/TEST"; + const char *username = "username"; + const char *password = "password"; + const char *loclfile = "sftp_write.c"; + const char *sftppath = "/tmp/TEST"; int rc; FILE *local; LIBSSH2_SFTP *sftp_session; @@ -57,16 +57,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -83,14 +84,14 @@ int main(int argc, char *argv[]) sftppath = argv[5]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } local = fopen(loclfile, "rb"); - if (!local) { + if(!local) { fprintf(stderr, "Can't open local file %s\n", loclfile); return -1; } @@ -104,8 +105,8 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -140,18 +141,20 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) { +#define HOME "/home/username/" + if(libssh2_userauth_publickey_fromfile(session, username, + HOME ".ssh/id_rsa.pub", + HOME ".ssh/id_rsa", + password)) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -160,7 +163,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "libssh2_sftp_init()!\n"); sftp_session = libssh2_sftp_init(session); - if (!sftp_session) { + if(!sftp_session) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } @@ -173,7 +176,7 @@ int main(int argc, char *argv[]) LIBSSH2_FXF_WRITE|LIBSSH2_FXF_READ, LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); - if (!sftp_handle) { + if(!sftp_handle) { fprintf(stderr, "Unable to open file with SFTP\n"); goto shutdown; } @@ -188,14 +191,14 @@ int main(int argc, char *argv[]) fprintf(stderr, "libssh2_sftp_open() a handle for APPEND\n"); - if (!sftp_handle) { + if(!sftp_handle) { fprintf(stderr, "Unable to open file with SFTP\n"); goto shutdown; } fprintf(stderr, "libssh2_sftp_open() is done, now send data!\n"); do { nread = fread(mem, 1, sizeof(mem), local); - if (nread <= 0) { + if(nread <= 0) { /* end of file */ break; } @@ -208,9 +211,9 @@ int main(int argc, char *argv[]) break; ptr += rc; nread -= rc; - } while (nread); + } while(nread); - } while (rc > 0); + } while(rc > 0); libssh2_sftp_close(sftp_handle); libssh2_sftp_shutdown(sftp_session); @@ -225,7 +228,7 @@ int main(int argc, char *argv[]) #else close(sock); #endif - if (local) + if(local) fclose(local); fprintf(stderr, "all done\n"); diff --git a/vendor/libssh2/example/sftp_mkdir.c b/vendor/libssh2/example/sftp_mkdir.c index 1270adb03..2347abe42 100644 --- a/vendor/libssh2/example/sftp_mkdir.c +++ b/vendor/libssh2/example/sftp_mkdir.c @@ -40,9 +40,9 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *sftppath="/tmp/sftp_mkdir"; + const char *username = "username"; + const char *password = "password"; + const char *sftppath = "/tmp/sftp_mkdir"; int rc; LIBSSH2_SFTP *sftp_session; @@ -50,16 +50,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -73,9 +74,9 @@ int main(int argc, char *argv[]) sftppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -88,7 +89,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -121,15 +122,16 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, + if(libssh2_userauth_publickey_fromfile(session, username, "/home/username/.ssh/id_rsa.pub", "/home/username/.ssh/id_rsa", password)) { @@ -140,7 +142,7 @@ int main(int argc, char *argv[]) sftp_session = libssh2_sftp_init(session); - if (!sftp_session) { + if(!sftp_session) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } @@ -161,7 +163,7 @@ int main(int argc, char *argv[]) shutdown: - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, "Normal Shutdown"); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/sftp_mkdir_nonblock.c b/vendor/libssh2/example/sftp_mkdir_nonblock.c index db366d22d..217cc4b3d 100644 --- a/vendor/libssh2/example/sftp_mkdir_nonblock.c +++ b/vendor/libssh2/example/sftp_mkdir_nonblock.c @@ -40,9 +40,9 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *sftppath="/tmp/sftp_mkdir_nonblock"; + const char *username = "username"; + const char *password = "password"; + const char *sftppath = "/tmp/sftp_mkdir_nonblock"; int rc; LIBSSH2_SFTP *sftp_session; @@ -50,16 +50,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -73,9 +74,9 @@ int main(int argc, char *argv[]) sftppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -88,7 +89,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -121,15 +122,16 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, + if(libssh2_userauth_publickey_fromfile(session, username, "/home/username/.ssh/id_rsa.pub", "/home/username/.ssh/id_rsa", password)) { @@ -141,7 +143,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "libssh2_sftp_init()!\n"); sftp_session = libssh2_sftp_init(session); - if (!sftp_session) { + if(!sftp_session) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } @@ -151,7 +153,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "libssh2_sftp_mkdirnb()!\n"); /* Make a directory via SFTP */ - while (libssh2_sftp_mkdir(sftp_session, sftppath, + while(libssh2_sftp_mkdir(sftp_session, sftppath, LIBSSH2_SFTP_S_IRWXU| LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IXGRP| LIBSSH2_SFTP_S_IROTH|LIBSSH2_SFTP_S_IXOTH) @@ -161,7 +163,7 @@ int main(int argc, char *argv[]) shutdown: - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, "Normal Shutdown"); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/sftp_nonblock.c b/vendor/libssh2/example/sftp_nonblock.c index 0db0cb638..8ef091e1f 100644 --- a/vendor/libssh2/example/sftp_nonblock.c +++ b/vendor/libssh2/example/sftp_nonblock.c @@ -85,9 +85,9 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *sftppath="/tmp/TEST"; + const char *username = "username"; + const char *password = "password"; + const char *sftppath = "/tmp/TEST"; #ifdef HAVE_GETTIMEOFDAY struct timeval start; struct timeval end; @@ -103,32 +103,33 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } - if (argc > 4) { + if(argc > 4) { sftppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -141,7 +142,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -149,7 +150,7 @@ int main(int argc, char *argv[]) /* Create a session instance */ session = libssh2_session_init(); - if (!session) + if(!session) return -1; /* Since we have set non-blocking, tell libssh2 we are non-blocking */ @@ -162,9 +163,9 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) == + while((rc = libssh2_session_handshake(session, sock)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; } @@ -181,25 +182,26 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) + while((rc = libssh2_userauth_password(session, username, password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - while ((rc = - libssh2_userauth_publickey_fromfile(session, username, - "/home/username/" - ".ssh/id_rsa.pub", - "/home/username/" - ".ssh/id_rsa", - password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = + libssh2_userauth_publickey_fromfile(session, username, + "/home/username/" + ".ssh/id_rsa.pub", + "/home/username/" + ".ssh/id_rsa", + password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -222,7 +224,7 @@ int main(int argc, char *argv[]) goto shutdown; } } - } while (!sftp_session); + } while(!sftp_session); fprintf(stderr, "libssh2_sftp_open()!\n"); /* Request a file via SFTP */ @@ -230,8 +232,8 @@ int main(int argc, char *argv[]) sftp_handle = libssh2_sftp_open(sftp_session, sftppath, LIBSSH2_FXF_READ, 0); - if (!sftp_handle) { - if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { + if(!sftp_handle) { + if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { fprintf(stderr, "Unable to open file with SFTP\n"); goto shutdown; } @@ -240,31 +242,33 @@ int main(int argc, char *argv[]) waitsocket(sock, session); /* now we wait */ } } - } while (!sftp_handle); + } while(!sftp_handle); fprintf(stderr, "libssh2_sftp_open() is done, now receive data!\n"); do { char mem[1024*24]; /* loop until we fail */ - while ((rc = libssh2_sftp_read(sftp_handle, mem, + while((rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem))) == LIBSSH2_ERROR_EAGAIN) { spin++; waitsocket(sock, session); /* now we wait */ } - if (rc > 0) { + if(rc > 0) { total += rc; write(1, mem, rc); - } else { + } + else { break; } - } while (1); + } while(1); #ifdef HAVE_GETTIMEOFDAY gettimeofday(&end, NULL); time_ms = tvdiff(end, start); - fprintf(stderr, "Got %d bytes in %ld ms = %.1f bytes/sec spin: %d\n", total, - time_ms, total/(time_ms/1000.0), spin ); + fprintf(stderr, "Got %d bytes in %ld ms = %.1f bytes/sec spin: %d\n", + total, + time_ms, total/(time_ms/1000.0), spin); #else fprintf(stderr, "Got %d bytes spin: %d\n", total, spin); #endif @@ -275,7 +279,7 @@ int main(int argc, char *argv[]) shutdown: fprintf(stderr, "libssh2_session_disconnect\n"); - while (libssh2_session_disconnect(session, + while(libssh2_session_disconnect(session, "Normal Shutdown, Thank you") == LIBSSH2_ERROR_EAGAIN); libssh2_session_free(session); diff --git a/vendor/libssh2/example/sftp_write.c b/vendor/libssh2/example/sftp_write.c index 7afc187f1..c1350e9cb 100644 --- a/vendor/libssh2/example/sftp_write.c +++ b/vendor/libssh2/example/sftp_write.c @@ -40,10 +40,10 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *loclfile="sftp_write.c"; - const char *sftppath="/tmp/TEST"; + const char *username = "username"; + const char *password = "password"; + const char *loclfile = "sftp_write.c"; + const char *sftppath = "/tmp/TEST"; int rc; FILE *local; LIBSSH2_SFTP *sftp_session; @@ -56,16 +56,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -82,14 +83,14 @@ int main(int argc, char *argv[]) sftppath = argv[5]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } local = fopen(loclfile, "rb"); - if (!local) { + if(!local) { fprintf(stderr, "Can't open local file %s\n", loclfile); return -1; } @@ -103,7 +104,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -139,18 +140,20 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) { + const char *pubkey = "/home/username/.ssh/id_rsa.pub"; + const char *privkey = "/home/username/.ssh/id_rsa.pub"; + if(libssh2_userauth_publickey_fromfile(session, username, + pubkey, privkey, + password)) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -159,7 +162,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "libssh2_sftp_init()!\n"); sftp_session = libssh2_sftp_init(session); - if (!sftp_session) { + if(!sftp_session) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } @@ -172,14 +175,14 @@ int main(int argc, char *argv[]) LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); - if (!sftp_handle) { + if(!sftp_handle) { fprintf(stderr, "Unable to open file with SFTP\n"); goto shutdown; } fprintf(stderr, "libssh2_sftp_open() is done, now send data!\n"); do { nread = fread(mem, 1, sizeof(mem), local); - if (nread <= 0) { + if(nread <= 0) { /* end of file */ break; } @@ -192,9 +195,9 @@ int main(int argc, char *argv[]) break; ptr += rc; nread -= rc; - } while (nread); + } while(nread); - } while (rc > 0); + } while(rc > 0); libssh2_sftp_close(sftp_handle); libssh2_sftp_shutdown(sftp_session); @@ -209,7 +212,7 @@ int main(int argc, char *argv[]) #else close(sock); #endif - if (local) + if(local) fclose(local); fprintf(stderr, "all done\n"); diff --git a/vendor/libssh2/example/sftp_write_nonblock.c b/vendor/libssh2/example/sftp_write_nonblock.c index 2e22395e9..934749ea7 100644 --- a/vendor/libssh2/example/sftp_write_nonblock.c +++ b/vendor/libssh2/example/sftp_write_nonblock.c @@ -4,7 +4,7 @@ * The sample code has default values for host name, user name, password * and path to copy, but you can specify them on the command line like: * - * "sftp 192.168.0.1 user password sftp_write_nonblock.c /tmp/sftp_write_nonblock.c" + * "sftp 192.168.0.1 user password thisfile /tmp/storehere" */ #include "libssh2_config.h" @@ -77,10 +77,10 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *loclfile="sftp_write_nonblock.c"; - const char *sftppath="/tmp/sftp_write_nonblock.c"; + const char *username = "username"; + const char *password = "password"; + const char *loclfile = "sftp_write_nonblock.c"; + const char *sftppath = "/tmp/sftp_write_nonblock.c"; int rc; FILE *local; LIBSSH2_SFTP *sftp_session; @@ -96,40 +96,41 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } - if (argc > 4) { + if(argc > 4) { loclfile = argv[4]; } - if (argc > 5) { + if(argc > 5) { sftppath = argv[5]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } local = fopen(loclfile, "rb"); - if (!local) { + if(!local) { fprintf(stderr, "Can't open local file %s\n", loclfile); return -1; } @@ -143,7 +144,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -152,7 +153,7 @@ int main(int argc, char *argv[]) /* Create a session instance */ session = libssh2_session_init(); - if (!session) + if(!session) return -1; /* Since we have set non-blocking, tell libssh2 we are non-blocking */ @@ -161,9 +162,9 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) + while((rc = libssh2_session_handshake(session, sock)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; } @@ -180,22 +181,24 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) == + while((rc = libssh2_userauth_password(session, username, password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - while ((rc = libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + const char *pubkey = "/home/username/.ssh/id_rsa.pub"; + const char *privkey = "/home/username/.ssh/id_rsa"; + while((rc = libssh2_userauth_publickey_fromfile(session, username, + pubkey, privkey, + password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -205,28 +208,28 @@ int main(int argc, char *argv[]) do { sftp_session = libssh2_sftp_init(session); - if (!sftp_session && + if(!sftp_session && (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } - } while (!sftp_session); + } while(!sftp_session); fprintf(stderr, "libssh2_sftp_open()!\n"); /* Request a file via SFTP */ do { sftp_handle = - libssh2_sftp_open(sftp_session, sftppath, - LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); - - if (!sftp_handle && - (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) { + libssh2_sftp_open(sftp_session, sftppath, + LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT| + LIBSSH2_FXF_TRUNC, + LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| + LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + if(!sftp_handle && + (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) { fprintf(stderr, "Unable to open file with SFTP\n"); goto shutdown; } - } while (!sftp_handle); + } while(!sftp_handle); fprintf(stderr, "libssh2_sftp_open() is done, now send data!\n"); @@ -234,7 +237,7 @@ int main(int argc, char *argv[]) do { nread = fread(mem, 1, sizeof(mem), local); - if (nread <= 0) { + if(nread <= 0) { /* end of file */ break; } @@ -244,7 +247,7 @@ int main(int argc, char *argv[]) do { /* write data in a loop until we block */ - while ((rc = libssh2_sftp_write(sftp_handle, ptr, nread)) == + while((rc = libssh2_sftp_write(sftp_handle, ptr, nread)) == LIBSSH2_ERROR_EAGAIN) { waitsocket(sock, session); } @@ -253,8 +256,8 @@ int main(int argc, char *argv[]) ptr += rc; nread -= rc; - } while (nread); - } while (rc > 0); + } while(nread); + } while(rc > 0); duration = (int)(time(NULL)-start); @@ -268,7 +271,7 @@ int main(int argc, char *argv[]) shutdown: - while (libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing") + while(libssh2_session_disconnect(session, "Normal Shutdown") == LIBSSH2_ERROR_EAGAIN); libssh2_session_free(session); diff --git a/vendor/libssh2/example/sftp_write_sliding.c b/vendor/libssh2/example/sftp_write_sliding.c index 19fe851a2..9a72140f4 100644 --- a/vendor/libssh2/example/sftp_write_sliding.c +++ b/vendor/libssh2/example/sftp_write_sliding.c @@ -4,7 +4,7 @@ * The sample code has default values for host name, user name, password * and path to copy, but you can specify them on the command line like: * - * "sftp 192.168.0.1 user password sftp_write_nonblock.c /tmp/sftp_write_nonblock.c" + * "sftp 192.168.0.1 user password file /tmp/storehere" */ #include "libssh2_config.h" @@ -77,10 +77,10 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *loclfile="sftp_write_nonblock.c"; - const char *sftppath="/tmp/sftp_write_nonblock.c"; + const char *username = "username"; + const char *password = "password"; + const char *loclfile = "sftp_write_nonblock.c"; + const char *sftppath = "/tmp/sftp_write_nonblock.c"; int rc; FILE *local; LIBSSH2_SFTP *sftp_session; @@ -96,40 +96,41 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } - if (argc > 4) { + if(argc > 4) { loclfile = argv[4]; } - if (argc > 5) { + if(argc > 5) { sftppath = argv[5]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } local = fopen(loclfile, "rb"); - if (!local) { + if(!local) { fprintf(stderr, "Can't open local file %s\n", loclfile); return -1; } @@ -143,7 +144,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -152,7 +153,7 @@ int main(int argc, char *argv[]) /* Create a session instance */ session = libssh2_session_init(); - if (!session) + if(!session) return -1; /* Since we have set non-blocking, tell libssh2 we are non-blocking */ @@ -161,9 +162,9 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) + while((rc = libssh2_session_handshake(session, sock)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; } @@ -180,22 +181,24 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) == + while((rc = libssh2_userauth_password(session, username, password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - while ((rc = libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { +#define PUBKEY "/home/username/.ssh/id_rsa.pub" +#define PRIVKEY "/home/username/.ssh/id_rsa" + while((rc = libssh2_userauth_publickey_fromfile(session, username, + PUBKEY, PRIVKEY, + password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -205,28 +208,29 @@ int main(int argc, char *argv[]) do { sftp_session = libssh2_sftp_init(session); - if (!sftp_session && + if(!sftp_session && (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } - } while (!sftp_session); + } while(!sftp_session); fprintf(stderr, "libssh2_sftp_open()!\n"); /* Request a file via SFTP */ do { sftp_handle = - libssh2_sftp_open(sftp_session, sftppath, - LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); - - if (!sftp_handle && - (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) { + libssh2_sftp_open(sftp_session, sftppath, + LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT| + LIBSSH2_FXF_TRUNC, + LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| + LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + + if(!sftp_handle && + (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) { fprintf(stderr, "Unable to open file with SFTP\n"); goto shutdown; } - } while (!sftp_handle); + } while(!sftp_handle); fprintf(stderr, "libssh2_sftp_open() is done, now send data!\n"); @@ -235,9 +239,9 @@ int main(int argc, char *argv[]) memuse = 0; /* it starts blank */ do { nread = fread(&mem[memuse], 1, sizeof(mem)-memuse, local); - if (nread <= 0) { + if(nread <= 0) { /* end of file */ - if (memuse > 0) + if(memuse > 0) /* the previous sending is not finished */ nread = 0; else @@ -247,7 +251,7 @@ int main(int argc, char *argv[]) total += nread; /* write data in a loop until we block */ - while ((rc = libssh2_sftp_write(sftp_handle, mem, memuse)) == + while((rc = libssh2_sftp_write(sftp_handle, mem, memuse)) == LIBSSH2_ERROR_EAGAIN) { waitsocket(sock, session); } @@ -263,7 +267,7 @@ int main(int argc, char *argv[]) /* 'mem' was consumed fully */ memuse = 0; - } while (rc > 0); + } while(rc > 0); duration = (int)(time(NULL)-start); @@ -277,8 +281,8 @@ int main(int argc, char *argv[]) shutdown: - while (libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing") - == LIBSSH2_ERROR_EAGAIN); + while(libssh2_session_disconnect(session, "Normal Shutdown") + == LIBSSH2_ERROR_EAGAIN); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/sftpdir.c b/vendor/libssh2/example/sftpdir.c index c21f9b35d..8fb16b1e9 100644 --- a/vendor/libssh2/example/sftpdir.c +++ b/vendor/libssh2/example/sftpdir.c @@ -36,26 +36,16 @@ #include #include -/* last resort for systems not defining PRIu64 in inttypes.h */ -#ifndef __PRI64_PREFIX #ifdef WIN32 -#define __PRI64_PREFIX "I64" +#define __FILESIZE "I64" #else -#if __WORDSIZE == 64 -#define __PRI64_PREFIX "l" -#else -#define __PRI64_PREFIX "ll" -#endif /* __WORDSIZE */ -#endif /* WIN32 */ -#endif /* !__PRI64_PREFIX */ -#ifndef PRIu64 -#define PRIu64 __PRI64_PREFIX "u" -#endif /* PRIu64 */ - -const char *keyfile1="~/.ssh/id_rsa.pub"; -const char *keyfile2="~/.ssh/id_rsa"; -const char *username="username"; -const char *password="password"; +#define __FILESIZE "llu" +#endif + +const char *keyfile1 = "~/.ssh/id_rsa.pub"; +const char *keyfile2 = "~/.ssh/id_rsa"; +const char *username = "username"; +const char *password = "password"; static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, @@ -68,7 +58,7 @@ static void kbd_callback(const char *name, int name_len, (void)name_len; (void)instruction; (void)instruction_len; - if (num_prompts == 1) { + if(num_prompts == 1) { responses[0].text = strdup(password); responses[0].length = strlen(password); } @@ -84,7 +74,7 @@ int main(int argc, char *argv[]) const char *fingerprint; char *userauthlist; LIBSSH2_SESSION *session; - const char *sftppath="/tmp/secretdir"; + const char *sftppath = "/tmp/secretdir"; LIBSSH2_SFTP *sftp_session; LIBSSH2_SFTP_HANDLE *sftp_handle; @@ -92,16 +82,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -115,9 +106,9 @@ int main(int argc, char *argv[]) sftppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -130,8 +121,8 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -166,58 +157,64 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); fprintf(stderr, "Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "password") != NULL) { + if(strstr(userauthlist, "password") != NULL) { auth_pw |= 1; } - if (strstr(userauthlist, "keyboard-interactive") != NULL) { + if(strstr(userauthlist, "keyboard-interactive") != NULL) { auth_pw |= 2; } - if (strstr(userauthlist, "publickey") != NULL) { + if(strstr(userauthlist, "publickey") != NULL) { auth_pw |= 4; } /* if we got an 5. argument we set this option if supported */ if(argc > 5) { - if ((auth_pw & 1) && !strcasecmp(argv[5], "-p")) { + if((auth_pw & 1) && !strcasecmp(argv[5], "-p")) { auth_pw = 1; } - if ((auth_pw & 2) && !strcasecmp(argv[5], "-i")) { + if((auth_pw & 2) && !strcasecmp(argv[5], "-i")) { auth_pw = 2; } - if ((auth_pw & 4) && !strcasecmp(argv[5], "-k")) { + if((auth_pw & 4) && !strcasecmp(argv[5], "-k")) { auth_pw = 4; } } - if (auth_pw & 1) { + if(auth_pw & 1) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "\tAuthentication by password failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, "\tAuthentication by password succeeded.\n"); } - } else if (auth_pw & 2) { + } + else if(auth_pw & 2) { /* Or via keyboard-interactive */ - if (libssh2_userauth_keyboard_interactive(session, username, - &kbd_callback) ) { + if(libssh2_userauth_keyboard_interactive(session, username, + &kbd_callback) ) { fprintf(stderr, - "\tAuthentication by keyboard-interactive failed!\n"); + "\tAuthentication by keyboard-interactive failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, - "\tAuthentication by keyboard-interactive succeeded.\n"); + "\tAuthentication by keyboard-interactive succeeded.\n"); } - } else if (auth_pw & 4) { + } + else if(auth_pw & 4) { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, - keyfile2, password)) { + if(libssh2_userauth_publickey_fromfile(session, username, keyfile1, + keyfile2, password)) { fprintf(stderr, "\tAuthentication by public key failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, "\tAuthentication by public key succeeded.\n"); } - } else { + } + else { fprintf(stderr, "No supported authentication methods found!\n"); goto shutdown; } @@ -225,7 +222,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "libssh2_sftp_init()!\n"); sftp_session = libssh2_sftp_init(session); - if (!sftp_session) { + if(!sftp_session) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } @@ -237,7 +234,7 @@ int main(int argc, char *argv[]) /* Request a dir listing via SFTP */ sftp_handle = libssh2_sftp_opendir(sftp_session, sftppath); - if (!sftp_handle) { + if(!sftp_handle) { fprintf(stderr, "Unable to open dir with SFTP\n"); goto shutdown; } @@ -254,9 +251,10 @@ int main(int argc, char *argv[]) /* rc is the length of the file name in the mem buffer */ - if (longentry[0] != '\0') { + if(longentry[0] != '\0') { printf("%s\n", longentry); - } else { + } + else { if(attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { /* this should check what permissions it is and print the output accordingly */ @@ -267,14 +265,14 @@ int main(int argc, char *argv[]) } if(attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) { - printf("%4ld %4ld ", attrs.uid, attrs.gid); + printf("%4d %4d ", (int) attrs.uid, (int) attrs.gid); } else { printf(" - - "); } if(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) { - printf("%8" PRIu64 " ", attrs.filesize); + printf("%8" __FILESIZE " ", attrs.filesize); } printf("%s\n", mem); @@ -283,14 +281,14 @@ int main(int argc, char *argv[]) else break; - } while (1); + } while(1); libssh2_sftp_closedir(sftp_handle); libssh2_sftp_shutdown(sftp_session); shutdown: - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, "Normal Shutdown"); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/sftpdir_nonblock.c b/vendor/libssh2/example/sftpdir_nonblock.c index 1950e6712..e9498d97c 100644 --- a/vendor/libssh2/example/sftpdir_nonblock.c +++ b/vendor/libssh2/example/sftpdir_nonblock.c @@ -36,21 +36,11 @@ #include #include -/* last resort for systems not defining PRIu64 in inttypes.h */ -#ifndef __PRI64_PREFIX #ifdef WIN32 -#define __PRI64_PREFIX "I64" +#define __FILESIZE "I64" #else -#if __WORDSIZE == 64 -#define __PRI64_PREFIX "l" -#else -#define __PRI64_PREFIX "ll" -#endif /* __WORDSIZE */ -#endif /* WIN32 */ -#endif /* !__PRI64_PREFIX */ -#ifndef PRIu64 -#define PRIu64 __PRI64_PREFIX "u" -#endif /* PRIu64 */ +#define __FILESIZE "llu" +#endif int main(int argc, char *argv[]) { @@ -59,9 +49,11 @@ int main(int argc, char *argv[]) struct sockaddr_in sin; const char *fingerprint; LIBSSH2_SESSION *session; - const char *username="username"; - const char *password="password"; - const char *sftppath="/tmp/secretdir"; + const char *username = "username"; + const char *password = "password"; + const char *sftppath = "/tmp/secretdir"; + const char *pubkey = "/home/username/.ssh/id_rsa.pub"; + const char *privkey = "/home/username/.ssh/id_rsa"; int rc; LIBSSH2_SFTP *sftp_session; LIBSSH2_SFTP_HANDLE *sftp_handle; @@ -70,16 +62,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -93,9 +86,9 @@ int main(int argc, char *argv[]) sftppath = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -108,8 +101,8 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), - sizeof(struct sockaddr_in)) != 0) { + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; } @@ -126,8 +119,8 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) == - LIBSSH2_ERROR_EAGAIN); + while((rc = libssh2_session_handshake(session, sock)) == + LIBSSH2_ERROR_EAGAIN); if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; @@ -145,21 +138,22 @@ int main(int argc, char *argv[]) } fprintf(stderr, "\n"); - if (auth_pw) { + if(auth_pw) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = libssh2_userauth_password(session, username, password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else { + } + else { /* Or by public key */ - while ((rc = libssh2_userauth_publickey_fromfile(session, username, - "/home/username/.ssh/id_rsa.pub", - "/home/username/.ssh/id_rsa", - password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = libssh2_userauth_publickey_fromfile(session, username, + pubkey, privkey, + password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } @@ -169,24 +163,24 @@ int main(int argc, char *argv[]) do { sftp_session = libssh2_sftp_init(session); - if ((!sftp_session) && (libssh2_session_last_errno(session) != - LIBSSH2_ERROR_EAGAIN)) { + if((!sftp_session) && (libssh2_session_last_errno(session) != + LIBSSH2_ERROR_EAGAIN)) { fprintf(stderr, "Unable to init SFTP session\n"); goto shutdown; } - } while (!sftp_session); + } while(!sftp_session); fprintf(stderr, "libssh2_sftp_opendir()!\n"); /* Request a dir listing via SFTP */ do { sftp_handle = libssh2_sftp_opendir(sftp_session, sftppath); - if ((!sftp_handle) && (libssh2_session_last_errno(session) != - LIBSSH2_ERROR_EAGAIN)) { + if((!sftp_handle) && (libssh2_session_last_errno(session) != + LIBSSH2_ERROR_EAGAIN)) { fprintf(stderr, "Unable to open dir with SFTP\n"); goto shutdown; } - } while (!sftp_handle); + } while(!sftp_handle); fprintf(stderr, "libssh2_sftp_opendir() is done, now receive listing!\n"); do { @@ -194,8 +188,8 @@ int main(int argc, char *argv[]) LIBSSH2_SFTP_ATTRIBUTES attrs; /* loop until we fail */ - while ((rc = libssh2_sftp_readdir(sftp_handle, mem, sizeof(mem), - &attrs)) == LIBSSH2_ERROR_EAGAIN) { + while((rc = libssh2_sftp_readdir(sftp_handle, mem, sizeof(mem), + &attrs)) == LIBSSH2_ERROR_EAGAIN) { ; } if(rc > 0) { @@ -206,37 +200,40 @@ int main(int argc, char *argv[]) /* this should check what permissions it is and print the output accordingly */ printf("--fix----- "); - } else { + } + else { printf("---------- "); } if(attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) { - printf("%4ld %4ld ", attrs.uid, attrs.gid); - } else { + printf("%4d %4d ", (int) attrs.uid, (int) attrs.gid); + } + else { printf(" - - "); } if(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) { - printf("%8" PRIu64 " ", attrs.filesize); + printf("%8" __FILESIZE " ", attrs.filesize); } printf("%s\n", mem); } - else if (rc == LIBSSH2_ERROR_EAGAIN) { + else if(rc == LIBSSH2_ERROR_EAGAIN) { /* blocking */ fprintf(stderr, "Blocking\n"); - } else { + } + else { break; } - } while (1); + } while(1); libssh2_sftp_closedir(sftp_handle); libssh2_sftp_shutdown(sftp_session); shutdown: - libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); + libssh2_session_disconnect(session, "Normal Shutdown"); libssh2_session_free(session); #ifdef WIN32 diff --git a/vendor/libssh2/example/ssh2.c b/vendor/libssh2/example/ssh2.c index f9ee68aec..fa86f5513 100644 --- a/vendor/libssh2/example/ssh2.c +++ b/vendor/libssh2/example/ssh2.c @@ -37,10 +37,10 @@ #include -const char *keyfile1="~/.ssh/id_rsa.pub"; -const char *keyfile2="~/.ssh/id_rsa"; -const char *username="username"; -const char *password="password"; +const char *keyfile1 = "~/.ssh/id_rsa.pub"; +const char *keyfile2 = "~/.ssh/id_rsa"; +const char *username = "username"; +const char *password = "password"; static void kbd_callback(const char *name, int name_len, @@ -54,7 +54,7 @@ static void kbd_callback(const char *name, int name_len, (void)name_len; (void)instruction; (void)instruction_len; - if (num_prompts == 1) { + if(num_prompts == 1) { responses[0].text = strdup(password); responses[0].length = strlen(password); } @@ -77,16 +77,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -97,9 +98,9 @@ int main(int argc, char *argv[]) password = argv[3]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -111,7 +112,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -121,7 +122,7 @@ int main(int argc, char *argv[]) * banners, exchange keys, and setup crypto, compression, and MAC layers */ session = libssh2_session_init(); - if (libssh2_session_handshake(session, sock)) { + if(libssh2_session_handshake(session, sock)) { fprintf(stderr, "Failure establishing SSH session\n"); return -1; } @@ -141,64 +142,71 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); fprintf(stderr, "Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "password") != NULL) { + if(strstr(userauthlist, "password") != NULL) { auth_pw |= 1; } - if (strstr(userauthlist, "keyboard-interactive") != NULL) { + if(strstr(userauthlist, "keyboard-interactive") != NULL) { auth_pw |= 2; } - if (strstr(userauthlist, "publickey") != NULL) { + if(strstr(userauthlist, "publickey") != NULL) { auth_pw |= 4; } /* if we got an 4. argument we set this option if supported */ if(argc > 4) { - if ((auth_pw & 1) && !strcasecmp(argv[4], "-p")) { + if((auth_pw & 1) && !strcasecmp(argv[4], "-p")) { auth_pw = 1; } - if ((auth_pw & 2) && !strcasecmp(argv[4], "-i")) { + if((auth_pw & 2) && !strcasecmp(argv[4], "-i")) { auth_pw = 2; } - if ((auth_pw & 4) && !strcasecmp(argv[4], "-k")) { + if((auth_pw & 4) && !strcasecmp(argv[4], "-k")) { auth_pw = 4; } } - if (auth_pw & 1) { + if(auth_pw & 1) { /* We could authenticate via password */ - if (libssh2_userauth_password(session, username, password)) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "\tAuthentication by password failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, "\tAuthentication by password succeeded.\n"); } - } else if (auth_pw & 2) { + } + else if(auth_pw & 2) { /* Or via keyboard-interactive */ - if (libssh2_userauth_keyboard_interactive(session, username, - &kbd_callback) ) { + if(libssh2_userauth_keyboard_interactive(session, username, + &kbd_callback) ) { fprintf(stderr, - "\tAuthentication by keyboard-interactive failed!\n"); + "\tAuthentication by keyboard-interactive failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, - "\tAuthentication by keyboard-interactive succeeded.\n"); + "\tAuthentication by keyboard-interactive succeeded.\n"); } - } else if (auth_pw & 4) { + } + else if(auth_pw & 4) { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, - keyfile2, password)) { + if(libssh2_userauth_publickey_fromfile(session, username, keyfile1, + keyfile2, password)) { fprintf(stderr, "\tAuthentication by public key failed!\n"); goto shutdown; - } else { + } + else { fprintf(stderr, "\tAuthentication by public key succeeded.\n"); } - } else { + } + else { fprintf(stderr, "No supported authentication methods found!\n"); goto shutdown; } /* Request a shell */ - if (!(channel = libssh2_channel_open_session(session))) { + channel = libssh2_channel_open_session(session); + if(!channel) { fprintf(stderr, "Unable to open a session\n"); goto shutdown; } @@ -211,13 +219,13 @@ int main(int argc, char *argv[]) /* Request a terminal with 'vanilla' terminal emulation * See /etc/termcap for more options */ - if (libssh2_channel_request_pty(channel, "vanilla")) { + if(libssh2_channel_request_pty(channel, "vanilla")) { fprintf(stderr, "Failed requesting pty\n"); goto skip_shell; } /* Open a SHELL on that pty */ - if (libssh2_channel_shell(channel)) { + if(libssh2_channel_shell(channel)) { fprintf(stderr, "Unable to request shell on allocated pty\n"); goto shutdown; } @@ -236,7 +244,7 @@ int main(int argc, char *argv[]) */ skip_shell: - if (channel) { + if(channel) { libssh2_channel_free(channel); channel = NULL; } diff --git a/vendor/libssh2/example/ssh2_agent.c b/vendor/libssh2/example/ssh2_agent.c index 33a2998a5..1cc508442 100644 --- a/vendor/libssh2/example/ssh2_agent.c +++ b/vendor/libssh2/example/ssh2_agent.c @@ -36,7 +36,7 @@ #include #include -const char *username="username"; +const char *username = "username"; int main(int argc, char *argv[]) { @@ -54,16 +54,17 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) { + if(argc > 1) { hostaddr = inet_addr(argv[1]); - } else { + } + else { hostaddr = htonl(0x7F000001); } @@ -71,9 +72,9 @@ int main(int argc, char *argv[]) username = argv[2]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -81,7 +82,7 @@ int main(int argc, char *argv[]) * responsible for creating the socket establishing the connection */ sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { + if(sock == -1) { fprintf(stderr, "failed to create socket!\n"); rc = 1; goto shutdown; @@ -90,7 +91,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); goto shutdown; @@ -100,7 +101,7 @@ int main(int argc, char *argv[]) * banners, exchange keys, and setup crypto, compression, and MAC layers */ session = libssh2_session_init(); - if (libssh2_session_handshake(session, sock)) { + if(libssh2_session_handshake(session, sock)) { fprintf(stderr, "Failure establishing SSH session\n"); return 1; } @@ -120,43 +121,44 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); fprintf(stderr, "Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "publickey") == NULL) { + if(strstr(userauthlist, "publickey") == NULL) { fprintf(stderr, "\"publickey\" authentication is not supported\n"); goto shutdown; } /* Connect to the ssh-agent */ agent = libssh2_agent_init(session); - if (!agent) { + if(!agent) { fprintf(stderr, "Failure initializing ssh-agent support\n"); rc = 1; goto shutdown; } - if (libssh2_agent_connect(agent)) { + if(libssh2_agent_connect(agent)) { fprintf(stderr, "Failure connecting to ssh-agent\n"); rc = 1; goto shutdown; } - if (libssh2_agent_list_identities(agent)) { + if(libssh2_agent_list_identities(agent)) { fprintf(stderr, "Failure requesting identities to ssh-agent\n"); rc = 1; goto shutdown; } - while (1) { + while(1) { rc = libssh2_agent_get_identity(agent, &identity, prev_identity); - if (rc == 1) + if(rc == 1) break; - if (rc < 0) { + if(rc < 0) { fprintf(stderr, "Failure obtaining identity from ssh-agent support\n"); rc = 1; goto shutdown; } - if (libssh2_agent_userauth(agent, username, identity)) { + if(libssh2_agent_userauth(agent, username, identity)) { fprintf(stderr, "\tAuthentication with username %s and " "public key %s failed!\n", username, identity->comment); - } else { + } + else { fprintf(stderr, "\tAuthentication with username %s and " "public key %s succeeded!\n", username, identity->comment); @@ -164,7 +166,7 @@ int main(int argc, char *argv[]) } prev_identity = identity; } - if (rc) { + if(rc) { fprintf(stderr, "Couldn't continue authentication\n"); goto shutdown; } @@ -172,7 +174,8 @@ int main(int argc, char *argv[]) /* We're authenticated now. */ /* Request a shell */ - if (!(channel = libssh2_channel_open_session(session))) { + channel = libssh2_channel_open_session(session); + if(!channel) { fprintf(stderr, "Unable to open a session\n"); goto shutdown; } @@ -185,13 +188,13 @@ int main(int argc, char *argv[]) /* Request a terminal with 'vanilla' terminal emulation * See /etc/termcap for more options */ - if (libssh2_channel_request_pty(channel, "vanilla")) { + if(libssh2_channel_request_pty(channel, "vanilla")) { fprintf(stderr, "Failed requesting pty\n"); goto skip_shell; } /* Open a SHELL on that pty */ - if (libssh2_channel_shell(channel)) { + if(libssh2_channel_shell(channel)) { fprintf(stderr, "Unable to request shell on allocated pty\n"); goto shutdown; } @@ -210,7 +213,7 @@ int main(int argc, char *argv[]) */ skip_shell: - if (channel) { + if(channel) { libssh2_channel_free(channel); channel = NULL; } @@ -223,8 +226,10 @@ int main(int argc, char *argv[]) shutdown: - libssh2_agent_disconnect(agent); - libssh2_agent_free(agent); + if(agent) { + libssh2_agent_disconnect(agent); + libssh2_agent_free(agent); + } if(session) { libssh2_session_disconnect(session, @@ -232,7 +237,7 @@ int main(int argc, char *argv[]) libssh2_session_free(session); } - if (sock != -1) { + if(sock != -1) { #ifdef WIN32 closesocket(sock); #else diff --git a/vendor/libssh2/example/ssh2_echo.c b/vendor/libssh2/example/ssh2_echo.c index 782930d28..eae416563 100644 --- a/vendor/libssh2/example/ssh2_echo.c +++ b/vendor/libssh2/example/ssh2_echo.c @@ -87,7 +87,7 @@ int main(int argc, char *argv[]) LIBSSH2_CHANNEL *channel; int rc; int exitcode = 0; - char *exitsignal=(char *)"none"; + char *exitsignal = (char *)"none"; size_t len; LIBSSH2_KNOWNHOSTS *nh; int type; @@ -96,27 +96,27 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) + if(argc > 1) /* must be ip address only */ hostname = argv[1]; - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -131,7 +131,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -139,7 +139,7 @@ int main(int argc, char *argv[]) /* Create a session instance */ session = libssh2_session_init(); - if (!session) + if(!session) return -1; /* tell libssh2 we want it all done non-blocking */ @@ -148,9 +148,9 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) == + while((rc = libssh2_session_handshake(session, sock)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; } @@ -193,11 +193,11 @@ int main(int argc, char *argv[]) } libssh2_knownhost_free(nh); - if ( strlen(password) != 0 ) { + if(strlen(password) != 0) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) == - LIBSSH2_ERROR_EAGAIN); - if (rc) { + while((rc = libssh2_userauth_password(session, username, password)) == + LIBSSH2_ERROR_EAGAIN); + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); exit(1); } @@ -206,22 +206,22 @@ int main(int argc, char *argv[]) libssh2_trace(session, LIBSSH2_TRACE_SOCKET); /* Exec non-blocking on the remove host */ - while( (channel = libssh2_channel_open_session(session)) == NULL && - libssh2_session_last_error(session,NULL,NULL,0) == - LIBSSH2_ERROR_EAGAIN ) { + while((channel = libssh2_channel_open_session(session)) == NULL && + libssh2_session_last_error(session, NULL, NULL, 0) == + LIBSSH2_ERROR_EAGAIN) { waitsocket(sock, session); } - if( channel == NULL ) { - fprintf(stderr,"Error\n"); - exit( 1 ); + if(channel == NULL) { + fprintf(stderr, "Error\n"); + exit(1); } - while( (rc = libssh2_channel_exec(channel, commandline)) == - LIBSSH2_ERROR_EAGAIN ) + while((rc = libssh2_channel_exec(channel, commandline)) == + LIBSSH2_ERROR_EAGAIN) waitsocket(sock, session); - if( rc != 0 ) { + if(rc != 0) { fprintf(stderr, "exec error\n"); - exit( 1 ); + exit(1); } else { LIBSSH2_POLLFD *fds = NULL; @@ -236,10 +236,11 @@ int main(int argc, char *argv[]) int rewrites = 0; int i; - for (i = 0; i < BUFSIZE; i++) + for(i = 0; i < BUFSIZE; i++) buffer[i] = 'A'; - if ((fds = malloc (sizeof (LIBSSH2_POLLFD))) == NULL) { + fds = malloc(sizeof (LIBSSH2_POLLFD)); + if(!fds) { fprintf(stderr, "malloc failed\n"); exit(1); } @@ -252,18 +253,18 @@ int main(int argc, char *argv[]) int rc = (libssh2_poll(fds, 1, 10)); int act = 0; - if (rc < 1) + if(rc < 1) continue; - if (fds[0].revents & LIBSSH2_POLLFD_POLLIN) { + if(fds[0].revents & LIBSSH2_POLLFD_POLLIN) { int n = libssh2_channel_read(channel, buffer, sizeof(buffer)); act++; - if (n == LIBSSH2_ERROR_EAGAIN) { + if(n == LIBSSH2_ERROR_EAGAIN) { rereads++; fprintf(stderr, "will read again\n"); } - else if (n < 0) { + else if(n < 0) { fprintf(stderr, "read failed\n"); exit(1); } @@ -274,20 +275,20 @@ int main(int argc, char *argv[]) } } - if (fds[0].revents & LIBSSH2_POLLFD_POLLOUT) { + if(fds[0].revents & LIBSSH2_POLLFD_POLLOUT) { act++; - if (totwritten < totsize) { + if(totwritten < totsize) { /* we have not written all data yet */ int left = totsize - totwritten; int size = (left < bufsize) ? left : bufsize; int n = libssh2_channel_write_ex(channel, 0, buffer, size); - if (n == LIBSSH2_ERROR_EAGAIN) { + if(n == LIBSSH2_ERROR_EAGAIN) { rewrites++; fprintf(stderr, "will write again\n"); } - else if (n < 0) { + else if(n < 0) { fprintf(stderr, "write failed\n"); exit(1); } @@ -295,20 +296,21 @@ int main(int argc, char *argv[]) totwritten += n; fprintf(stderr, "wrote %d bytes (%d in total)", n, totwritten); - if (left >= bufsize && n != bufsize) { + if(left >= bufsize && n != bufsize) { partials++; fprintf(stderr, " PARTIAL"); } fprintf(stderr, "\n"); } - } else { + } + else { /* all data written, send EOF */ rc = libssh2_channel_send_eof(channel); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { fprintf(stderr, "will send eof again\n"); } - else if (rc < 0) { + else if(rc < 0) { fprintf(stderr, "send eof failed\n"); exit(1); } @@ -320,23 +322,23 @@ int main(int argc, char *argv[]) } } - if (fds[0].revents & LIBSSH2_POLLFD_CHANNEL_CLOSED) { - if (!act) /* don't leave loop until we have read all data */ + if(fds[0].revents & LIBSSH2_POLLFD_CHANNEL_CLOSED) { + if(!act) /* don't leave loop until we have read all data */ running = 0; } } while(running); exitcode = 127; - while( (rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN ) + while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) waitsocket(sock, session); - if( rc == 0 ) { - exitcode = libssh2_channel_get_exit_status( channel ); + if(rc == 0) { + exitcode = libssh2_channel_get_exit_status(channel); libssh2_channel_get_exit_signal(channel, &exitsignal, NULL, NULL, NULL, NULL, NULL); } - if (exitsignal) + if(exitsignal) fprintf(stderr, "\nGot signal: %s\n", exitsignal); libssh2_channel_free(channel); @@ -345,7 +347,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "\nrereads: %d rewrites: %d totwritten %d\n", rereads, rewrites, totwritten); - if (totwritten != totread) { + if(totwritten != totread) { fprintf(stderr, "\n*** FAIL bytes written: %d bytes " "read: %d ***\n", totwritten, totread); exit(1); diff --git a/vendor/libssh2/example/ssh2_exec.c b/vendor/libssh2/example/ssh2_exec.c index c83f0bc4b..d33c6d9a8 100644 --- a/vendor/libssh2/example/ssh2_exec.c +++ b/vendor/libssh2/example/ssh2_exec.c @@ -87,7 +87,7 @@ int main(int argc, char *argv[]) LIBSSH2_CHANNEL *channel; int rc; int exitcode; - char *exitsignal=(char *)"none"; + char *exitsignal = (char *)"none"; int bytecount = 0; size_t len; LIBSSH2_KNOWNHOSTS *nh; @@ -97,30 +97,30 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } #endif - if (argc > 1) + if(argc > 1) /* must be ip address only */ hostname = argv[1]; - if (argc > 2) { + if(argc > 2) { username = argv[2]; } - if (argc > 3) { + if(argc > 3) { password = argv[3]; } - if (argc > 4) { + if(argc > 4) { commandline = argv[4]; } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } @@ -135,7 +135,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -143,7 +143,7 @@ int main(int argc, char *argv[]) /* Create a session instance */ session = libssh2_session_init(); - if (!session) + if(!session) return -1; /* tell libssh2 we want it all done non-blocking */ @@ -152,9 +152,9 @@ int main(int argc, char *argv[]) /* ... start it up. This will trade welcome banners, exchange keys, * and setup crypto, compression, and MAC layers */ - while ((rc = libssh2_session_handshake(session, sock)) == + while((rc = libssh2_session_handshake(session, sock)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Failure establishing SSH session: %d\n", rc); return -1; } @@ -206,104 +206,95 @@ int main(int argc, char *argv[]) } libssh2_knownhost_free(nh); - if ( strlen(password) != 0 ) { + if(strlen(password) != 0) { /* We could authenticate via password */ - while ((rc = libssh2_userauth_password(session, username, password)) == + while((rc = libssh2_userauth_password(session, username, password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } } else { /* Or by public key */ - while ((rc = libssh2_userauth_publickey_fromfile(session, username, + while((rc = libssh2_userauth_publickey_fromfile(session, username, "/home/user/" ".ssh/id_rsa.pub", "/home/user/" ".ssh/id_rsa", password)) == LIBSSH2_ERROR_EAGAIN); - if (rc) { + if(rc) { fprintf(stderr, "\tAuthentication by public key failed\n"); goto shutdown; } } #if 0 - libssh2_trace(session, ~0 ); + libssh2_trace(session, ~0); #endif /* Exec non-blocking on the remove host */ - while( (channel = libssh2_channel_open_session(session)) == NULL && - libssh2_session_last_error(session,NULL,NULL,0) == - LIBSSH2_ERROR_EAGAIN ) - { + while((channel = libssh2_channel_open_session(session)) == NULL && + libssh2_session_last_error(session, NULL, NULL, 0) == + LIBSSH2_ERROR_EAGAIN) { waitsocket(sock, session); } - if( channel == NULL ) - { - fprintf(stderr,"Error\n"); - exit( 1 ); + if(channel == NULL) { + fprintf(stderr, "Error\n"); + exit(1); } - while( (rc = libssh2_channel_exec(channel, commandline)) == - LIBSSH2_ERROR_EAGAIN ) - { + while((rc = libssh2_channel_exec(channel, commandline)) == + LIBSSH2_ERROR_EAGAIN) { waitsocket(sock, session); } - if( rc != 0 ) - { - fprintf(stderr,"Error\n"); - exit( 1 ); + if(rc != 0) { + fprintf(stderr, "Error\n"); + exit(1); } - for( ;; ) - { + for(;;) { /* loop until we block */ int rc; - do - { + do { char buffer[0x4000]; - rc = libssh2_channel_read( channel, buffer, sizeof(buffer) ); - if( rc > 0 ) - { + rc = libssh2_channel_read(channel, buffer, sizeof(buffer) ); + if(rc > 0) { int i; bytecount += rc; fprintf(stderr, "We read:\n"); - for( i=0; i < rc; ++i ) - fputc( buffer[i], stderr); + for(i = 0; i < rc; ++i) + fputc(buffer[i], stderr); fprintf(stderr, "\n"); } else { - if( rc != LIBSSH2_ERROR_EAGAIN ) + if(rc != LIBSSH2_ERROR_EAGAIN) /* no need to output this for the EAGAIN case */ fprintf(stderr, "libssh2_channel_read returned %d\n", rc); } } - while( rc > 0 ); + while(rc > 0); /* this is due to blocking that would occur otherwise so we loop on this condition */ - if( rc == LIBSSH2_ERROR_EAGAIN ) - { + if(rc == LIBSSH2_ERROR_EAGAIN) { waitsocket(sock, session); } else break; } exitcode = 127; - while( (rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN ) + while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) waitsocket(sock, session); - if( rc == 0 ) - { - exitcode = libssh2_channel_get_exit_status( channel ); + if(rc == 0) { + exitcode = libssh2_channel_get_exit_status(channel); libssh2_channel_get_exit_signal(channel, &exitsignal, NULL, NULL, NULL, NULL, NULL); } - if (exitsignal) + if(exitsignal) fprintf(stderr, "\nGot signal: %s\n", exitsignal); - else + else fprintf(stderr, "\nEXIT: %d bytecount: %d\n", exitcode, bytecount); libssh2_channel_free(channel); diff --git a/vendor/libssh2/example/subsystem_netconf.c b/vendor/libssh2/example/subsystem_netconf.c index 82c494178..cef25fee3 100644 --- a/vendor/libssh2/example/subsystem_netconf.c +++ b/vendor/libssh2/example/subsystem_netconf.c @@ -57,12 +57,12 @@ static int netconf_write(LIBSSH2_CHANNEL *channel, const char *buf, size_t len) do { i = libssh2_channel_write(channel, buf, len); - if (i < 0) { + if(i < 0) { fprintf(stderr, "libssh2_channel_write: %d\n", i); return -1; } wr += i; - } while (i > 0 && wr < (ssize_t)len); + } while(i > 0 && wr < (ssize_t)len); return 0; } @@ -78,9 +78,9 @@ static int netconf_read_until(LIBSSH2_CHANNEL *channel, const char *endtag, do { len = libssh2_channel_read(channel, buf + rd, buflen - rd); - if (LIBSSH2_ERROR_EAGAIN == len) + if(LIBSSH2_ERROR_EAGAIN == len) continue; - else if (len < 0) { + else if(len < 0) { fprintf(stderr, "libssh2_channel_read: %d\n", (int)len); return -1; } @@ -92,13 +92,14 @@ static int netconf_read_until(LIBSSH2_CHANNEL *channel, const char *endtag, /* really, this MUST be replaced with proper XML parsing! */ endreply = strstr(buf, endtag); - if (endreply) + if(endreply) specialsequence = strstr(endreply, "]]>]]>"); - } while (!specialsequence && rd < buflen); + } while(!specialsequence && rd < buflen); - if (!specialsequence) { - fprintf(stderr, "%s: ]]>]]> not found! read buffer too small?\n", __func__); + if(!specialsequence) { + fprintf(stderr, "%s: ]]>]]> not found! read buffer too small?\n", + __func__); return -1; } @@ -125,8 +126,8 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } @@ -134,40 +135,41 @@ int main(int argc, char *argv[]) int sock = -1; #endif - if (argc > 1) + if(argc > 1) server_ip = argv[1]; - if (argc > 2) + if(argc > 2) username = argv[2]; - if (argc > 3) + if(argc > 3) password = argv[3]; - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } /* Connect to SSH server */ sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); #ifdef WIN32 - if (sock == INVALID_SOCKET) { + if(sock == INVALID_SOCKET) { fprintf(stderr, "failed to open socket!\n"); return -1; } #else - if (sock == -1) { + if(sock == -1) { perror("socket"); return -1; } #endif sin.sin_family = AF_INET; - if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) { + sin.sin_addr.s_addr = inet_addr(server_ip); + if(INADDR_NONE == sin.sin_addr.s_addr) { fprintf(stderr, "inet_addr: Invalid IP address \"%s\"\n", server_ip); return -1; } sin.sin_port = htons(830); - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "Failed to connect to %s!\n", inet_ntoa(sin.sin_addr)); return -1; @@ -203,39 +205,41 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); fprintf(stderr, "Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "password")) + if(strstr(userauthlist, "password")) auth |= AUTH_PASSWORD; - if (strstr(userauthlist, "publickey")) + if(strstr(userauthlist, "publickey")) auth |= AUTH_PUBLICKEY; /* check for options */ if(argc > 4) { - if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[4], "-p")) + if((auth & AUTH_PASSWORD) && !strcasecmp(argv[4], "-p")) auth = AUTH_PASSWORD; - if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[4], "-k")) + if((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[4], "-k")) auth = AUTH_PUBLICKEY; } - if (auth & AUTH_PASSWORD) { - if (libssh2_userauth_password(session, username, password)) { + if(auth & AUTH_PASSWORD) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else if (auth & AUTH_PUBLICKEY) { - if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, + } + else if(auth & AUTH_PUBLICKEY) { + if(libssh2_userauth_publickey_fromfile(session, username, keyfile1, keyfile2, password)) { fprintf(stderr, "Authentication by public key failed!\n"); goto shutdown; } fprintf(stderr, "Authentication by public key succeeded.\n"); - } else { + } + else { fprintf(stderr, "No supported authentication methods found!\n"); goto shutdown; } /* open a channel */ channel = libssh2_channel_open_session(session); - if (!channel) { + if(!channel) { fprintf(stderr, "Could not open the channel!\n" "(Note that this can be a problem at the server!" " Please review the server logs.)\n"); @@ -243,7 +247,7 @@ int main(int argc, char *argv[]) } /* execute the subsystem on our channel */ - if (libssh2_channel_subsystem(channel, "netconf")) { + if(libssh2_channel_subsystem(channel, "netconf")) { fprintf(stderr, "Could not execute the \"netconf\" subsystem!\n" "(Note that this can be a problem at the server!" " Please review the server logs.)\n"); @@ -261,15 +265,16 @@ int main(int argc, char *argv[]) "" "\n" "]]>]]>\n%n", (int *)&len); - if (-1 == netconf_write(channel, buf, len)) + if(-1 == netconf_write(channel, buf, len)) goto shutdown; fprintf(stderr, "Reading NETCONF server \n"); len = netconf_read_until(channel, "", buf, sizeof(buf)); - if (-1 == len) + if(-1 == len) goto shutdown; - fprintf(stderr, "Got %d bytes:\n----------------------\n%s", (int)len, buf); + fprintf(stderr, "Got %d bytes:\n----------------------\n%s", + (int)len, buf); fprintf(stderr, "Sending NETCONF \n"); snprintf(buf, sizeof(buf), @@ -278,18 +283,19 @@ int main(int argc, char *argv[]) "" "\n" "]]>]]>\n%n", (int *)&len); - if (-1 == netconf_write(channel, buf, len)) + if(-1 == netconf_write(channel, buf, len)) goto shutdown; fprintf(stderr, "Reading NETCONF \n"); len = netconf_read_until(channel, "", buf, sizeof(buf)); - if (-1 == len) + if(-1 == len) goto shutdown; - fprintf(stderr, "Got %d bytes:\n----------------------\n%s", (int)len, buf); + fprintf(stderr, "Got %d bytes:\n----------------------\n%s", + (int)len, buf); shutdown: - if (channel) + if(channel) libssh2_channel_free(channel); libssh2_session_disconnect(session, "Client disconnecting normally"); libssh2_session_free(session); diff --git a/vendor/libssh2/example/tcpip-forward.c b/vendor/libssh2/example/tcpip-forward.c index 23513689a..51ca17ab1 100644 --- a/vendor/libssh2/example/tcpip-forward.c +++ b/vendor/libssh2/example/tcpip-forward.c @@ -70,8 +70,8 @@ int main(int argc, char *argv[]) WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return 1; } @@ -79,48 +79,49 @@ int main(int argc, char *argv[]) int sock = -1, forwardsock = -1; #endif - if (argc > 1) + if(argc > 1) server_ip = argv[1]; - if (argc > 2) + if(argc > 2) username = argv[2]; - if (argc > 3) + if(argc > 3) password = argv[3]; - if (argc > 4) + if(argc > 4) remote_listenhost = argv[4]; - if (argc > 5) + if(argc > 5) remote_wantport = atoi(argv[5]); - if (argc > 6) + if(argc > 6) local_destip = argv[6]; - if (argc > 7) + if(argc > 7) local_destport = atoi(argv[7]); - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } /* Connect to SSH server */ sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); #ifdef WIN32 - if (sock == INVALID_SOCKET) { + if(sock == INVALID_SOCKET) { fprintf(stderr, "failed to open socket!\n"); return -1; } #else - if (sock == -1) { + if(sock == -1) { perror("socket"); return -1; } #endif sin.sin_family = AF_INET; - if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) { + sin.sin_addr.s_addr = inet_addr(server_ip); + if(INADDR_NONE == sin.sin_addr.s_addr) { perror("inet_addr"); return -1; } sin.sin_port = htons(22); - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return -1; @@ -156,32 +157,34 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); fprintf(stderr, "Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "password")) + if(strstr(userauthlist, "password")) auth |= AUTH_PASSWORD; - if (strstr(userauthlist, "publickey")) + if(strstr(userauthlist, "publickey")) auth |= AUTH_PUBLICKEY; /* check for options */ if(argc > 8) { - if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], "-p")) + if((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], "-p")) auth = AUTH_PASSWORD; - if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], "-k")) + if((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], "-k")) auth = AUTH_PUBLICKEY; } - if (auth & AUTH_PASSWORD) { - if (libssh2_userauth_password(session, username, password)) { + if(auth & AUTH_PASSWORD) { + if(libssh2_userauth_password(session, username, password)) { fprintf(stderr, "Authentication by password failed.\n"); goto shutdown; } - } else if (auth & AUTH_PUBLICKEY) { - if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, - keyfile2, password)) { + } + else if(auth & AUTH_PUBLICKEY) { + if(libssh2_userauth_publickey_fromfile(session, username, keyfile1, + keyfile2, password)) { fprintf(stderr, "\tAuthentication by public key failed!\n"); goto shutdown; } fprintf(stderr, "\tAuthentication by public key succeeded.\n"); - } else { + } + else { fprintf(stderr, "No supported authentication methods found!\n"); goto shutdown; } @@ -191,7 +194,7 @@ int main(int argc, char *argv[]) listener = libssh2_channel_forward_listen_ex(session, remote_listenhost, remote_wantport, &remote_listenport, 1); - if (!listener) { + if(!listener) { fprintf(stderr, "Could not start the tcpip-forward listener!\n" "(Note that this can be a problem at the server!" " Please review the server logs.)\n"); @@ -203,7 +206,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Waiting for remote connection\n"); channel = libssh2_channel_forward_accept(listener); - if (!channel) { + if(!channel) { fprintf(stderr, "Could not accept connection!\n" "(Note that this can be a problem at the server!" " Please review the server logs.)\n"); @@ -215,12 +218,12 @@ int main(int argc, char *argv[]) local_destip, local_destport); forwardsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); #ifdef WIN32 - if (forwardsock == INVALID_SOCKET) { + if(forwardsock == INVALID_SOCKET) { fprintf(stderr, "failed to open forward socket!\n"); goto shutdown; } #else - if (forwardsock == -1) { + if(forwardsock == -1) { perror("socket"); goto shutdown; } @@ -228,11 +231,12 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(local_destport); - if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(local_destip))) { + sin.sin_addr.s_addr = inet_addr(local_destip); + if(INADDR_NONE == sin.sin_addr.s_addr) { perror("inet_addr"); goto shutdown; } - if (-1 == connect(forwardsock, (struct sockaddr *)&sin, sinlen)) { + if(-1 == connect(forwardsock, (struct sockaddr *)&sin, sinlen)) { perror("connect"); goto shutdown; } @@ -243,22 +247,23 @@ int main(int argc, char *argv[]) /* Must use non-blocking IO hereafter due to the current libssh2 API */ libssh2_session_set_blocking(session, 0); - while (1) { + while(1) { FD_ZERO(&fds); FD_SET(forwardsock, &fds); tv.tv_sec = 0; tv.tv_usec = 100000; rc = select(forwardsock + 1, &fds, NULL, NULL, &tv); - if (-1 == rc) { + if(-1 == rc) { perror("select"); goto shutdown; } - if (rc && FD_ISSET(forwardsock, &fds)) { + if(rc && FD_ISSET(forwardsock, &fds)) { len = recv(forwardsock, buf, sizeof(buf), 0); - if (len < 0) { + if(len < 0) { perror("read"); goto shutdown; - } else if (0 == len) { + } + else if(0 == len) { fprintf(stderr, "The local server at %s:%d disconnected!\n", local_destip, local_destport); goto shutdown; @@ -266,31 +271,31 @@ int main(int argc, char *argv[]) wr = 0; do { i = libssh2_channel_write(channel, buf, len); - if (i < 0) { + if(i < 0) { fprintf(stderr, "libssh2_channel_write: %d\n", i); goto shutdown; } wr += i; } while(i > 0 && wr < len); } - while (1) { + while(1) { len = libssh2_channel_read(channel, buf, sizeof(buf)); - if (LIBSSH2_ERROR_EAGAIN == len) + if(LIBSSH2_ERROR_EAGAIN == len) break; - else if (len < 0) { + else if(len < 0) { fprintf(stderr, "libssh2_channel_read: %d", (int)len); goto shutdown; } wr = 0; - while (wr < len) { + while(wr < len) { i = send(forwardsock, buf + wr, len - wr, 0); - if (i <= 0) { + if(i <= 0) { perror("write"); goto shutdown; } wr += i; } - if (libssh2_channel_eof(channel)) { + if(libssh2_channel_eof(channel)) { fprintf(stderr, "The remote client at %s:%d disconnected!\n", remote_listenhost, remote_listenport); goto shutdown; @@ -304,9 +309,9 @@ int main(int argc, char *argv[]) #else close(forwardsock); #endif - if (channel) + if(channel) libssh2_channel_free(channel); - if (listener) + if(listener) libssh2_channel_forward_cancel(listener); libssh2_session_disconnect(session, "Client disconnecting normally"); libssh2_session_free(session); diff --git a/vendor/libssh2/example/x11.c b/vendor/libssh2/example/x11.c index dd01b3bcc..c49b64ea9 100644 --- a/vendor/libssh2/example/x11.c +++ b/vendor/libssh2/example/x11.c @@ -48,14 +48,14 @@ static void remove_node(struct chan_X11_list *elem) current_node = gp_x11_chan; - if (gp_x11_chan == elem) { + if(gp_x11_chan == elem) { gp_x11_chan = gp_x11_chan->next; free(current_node); return; } - while (current_node->next != NULL) { - if (current_node->next == elem) { + while(current_node->next != NULL) { + if(current_node->next == elem) { current_node->next = current_node->next->next; current_node = current_node->next; free(current_node); @@ -78,7 +78,7 @@ static int _raw_mode(void) struct termios tio; rc = tcgetattr(fileno(stdin), &tio); - if (rc != -1) { + if(rc != -1) { _saved_tio = tio; /* do the equivalent of cfmakeraw() manually, to build on Solaris */ tio.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); @@ -106,37 +106,40 @@ static int _normal_mode(void) static void x11_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, char *shost, int sport, void **abstract) { - const char * display = NULL; - char * ptr = NULL; - char * temp_buff = NULL; + const char *display = NULL; + char *ptr = NULL; + char *temp_buff = NULL; int display_port = 0; int sock = 0; int rc = 0; struct sockaddr_un addr; struct chan_X11_list *new; struct chan_X11_list *chan_iter; - + (void)session; + (void)shost; + (void)sport; + (void)abstract; /* * Connect to the display * Inspired by x11_connect_display in openssh */ display = getenv("DISPLAY"); - if ( display != NULL) { - if (strncmp( display, "unix:", 5) == 0 || + if(display != NULL) { + if(strncmp(display, "unix:", 5) == 0 || display[0] == ':') { /* Connect to the local unix domain */ ptr = strrchr(display, ':'); - temp_buff = (char *) calloc(strlen(ptr+1), sizeof(char)); - if (!temp_buff) { + temp_buff = (char *) calloc(strlen(ptr + 1), sizeof(char)); + if(!temp_buff) { perror("calloc"); return; } - memcpy(temp_buff, ptr+1, strlen(ptr+1)); + memcpy(temp_buff, ptr + 1, strlen(ptr + 1)); display_port = atoi(temp_buff); free(temp_buff); sock = socket(AF_UNIX, SOCK_STREAM, 0); - if (sock < 0) + if(sock < 0) return; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; @@ -144,9 +147,9 @@ static void x11_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, _PATH_UNIX_X, display_port); rc = connect(sock, (struct sockaddr *) &addr, sizeof(addr)); - if (rc != -1){ + if(rc != -1) { /* Connection Successfull */ - if (gp_x11_chan == NULL) { + if(gp_x11_chan == NULL) { /* Calloc ensure that gp_X11_chan is full of 0 */ gp_x11_chan = (struct chan_X11_list *) calloc(1, sizeof(struct chan_X11_list)); @@ -156,7 +159,7 @@ static void x11_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, } else { chan_iter = gp_x11_chan; - while (chan_iter->next != NULL) + while(chan_iter->next != NULL) chan_iter = chan_iter->next; /* Create the new Node */ new = (struct chan_X11_list *) @@ -180,10 +183,10 @@ static void x11_callback(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, */ static int x11_send_receive(LIBSSH2_CHANNEL *channel, int sock) { - char * buf = NULL; - int bufsize = 8192; - int rc = 0; - int nfds = 1; + char *buf = NULL; + int bufsize = 8192; + int rc = 0; + int nfds = 1; LIBSSH2_POLLFD *fds = NULL; fd_set set; struct timeval timeval_out; @@ -192,12 +195,14 @@ static int x11_send_receive(LIBSSH2_CHANNEL *channel, int sock) FD_ZERO(&set); - FD_SET(sock,&set); + FD_SET(sock, &set); - if ((buf = calloc (bufsize, sizeof(char))) == NULL) + buf = calloc(bufsize, sizeof(char)); + if(!buf) return 0; - if ((fds = malloc (sizeof (LIBSSH2_POLLFD))) == NULL) { + fds = malloc(sizeof (LIBSSH2_POLLFD)); + if(!fds) { free(buf); return 0; } @@ -208,18 +213,18 @@ static int x11_send_receive(LIBSSH2_CHANNEL *channel, int sock) fds[0].revents = LIBSSH2_POLLFD_POLLIN; rc = libssh2_poll(fds, nfds, 0); - if (rc >0) { + if(rc >0) { rc = libssh2_channel_read(channel, buf, bufsize); write(sock, buf, rc); } - rc = select(sock+1, &set, NULL, NULL, &timeval_out); - if (rc > 0) { + rc = select(sock + 1, &set, NULL, NULL, &timeval_out); + if(rc > 0) { memset((void *)buf, 0, bufsize); /* Data in sock*/ rc = read(sock, buf, bufsize); - if (rc > 0) { + if(rc > 0) { libssh2_channel_write(channel, buf, rc); } else { @@ -230,7 +235,7 @@ static int x11_send_receive(LIBSSH2_CHANNEL *channel, int sock) free(fds); free(buf); - if (libssh2_channel_eof(channel) == 1) { + if(libssh2_channel_eof(channel) == 1) { return -1; } return 0; @@ -270,10 +275,10 @@ main (int argc, char *argv[]) timeval_out.tv_usec = 10; - if (argc > 3) { - hostaddr = inet_addr(argv[1]); - username = argv[2]; - password = argv[3]; + if(argc > 3) { + hostaddr = inet_addr(argv[1]); + username = argv[2]; + password = argv[3]; } else { fprintf(stderr, "Usage: %s destination username password", @@ -281,51 +286,55 @@ main (int argc, char *argv[]) return -1; } - if (argc > 4) { + if(argc > 4) { set_debug_on = 1; - fprintf (stderr, "DEBUG is ON: %d\n", set_debug_on); + fprintf(stderr, "DEBUG is ON: %d\n", set_debug_on); } - rc = libssh2_init (0); - if (rc != 0) { - fprintf (stderr, "libssh2 initialization failed (%d)\n", rc); + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); return 1; } - sock = socket (AF_INET, SOCK_STREAM, 0); - if (sock == -1) { + sock = socket(AF_INET, SOCK_STREAM, 0); + if(sock == -1) { perror("socket"); return -1; } sin.sin_family = AF_INET; - sin.sin_port = htons (22); + sin.sin_port = htons(22); sin.sin_addr.s_addr = hostaddr; rc = connect(sock, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)); - if (rc != 0) { - fprintf (stderr, "Failed to established connection!\n"); + if(rc != 0) { + fprintf(stderr, "Failed to established connection!\n"); return -1; } /* Open a session */ session = libssh2_session_init(); rc = libssh2_session_handshake(session, sock); - if (rc != 0) { + if(rc != 0) { fprintf(stderr, "Failed Start the SSH session\n"); return -1; } - if (set_debug_on == 1) + if(set_debug_on == 1) libssh2_trace(session, LIBSSH2_TRACE_CONN); + /* ignore pedantic warnings by gcc on the callback argument */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" /* Set X11 Callback */ libssh2_session_callback_set(session, LIBSSH2_CALLBACK_X11, (void *)x11_callback); +#pragma GCC diagnostic pop /* Authenticate via password */ rc = libssh2_userauth_password(session, username, password); - if (rc != 0) { + if(rc != 0) { fprintf(stderr, "Failed to authenticate\n"); session_shutdown(session); close(sock); @@ -334,7 +343,7 @@ main (int argc, char *argv[]) /* Open a channel */ channel = libssh2_channel_open_session(session); - if ( channel == NULL ) { + if(channel == NULL) { fprintf(stderr, "Failed to open a new channel\n"); session_shutdown(session); close(sock); @@ -343,8 +352,8 @@ main (int argc, char *argv[]) /* Request a PTY */ - rc = libssh2_channel_request_pty( channel, "xterm"); - if (rc != 0) { + rc = libssh2_channel_request_pty(channel, "xterm"); + if(rc != 0) { fprintf(stderr, "Failed to request a pty\n"); session_shutdown(session); close(sock); @@ -352,8 +361,8 @@ main (int argc, char *argv[]) } /* Request X11 */ - rc = libssh2_channel_x11_req(channel,0); - if(rc!=0) { + rc = libssh2_channel_x11_req(channel, 0); + if(rc != 0) { fprintf(stderr, "Failed to request X11 forwarding\n"); session_shutdown(session); close(sock); @@ -362,7 +371,7 @@ main (int argc, char *argv[]) /* Request a shell */ rc = libssh2_channel_shell(channel); - if (rc!=0) { + if(rc != 0) { fprintf(stderr, "Failed to open a shell\n"); session_shutdown(session); close(sock); @@ -370,7 +379,7 @@ main (int argc, char *argv[]) } rc = _raw_mode(); - if (rc != 0) { + if(rc != 0) { fprintf(stderr, "Failed to entered in raw mode\n"); session_shutdown(session); close(sock); @@ -380,15 +389,15 @@ main (int argc, char *argv[]) memset(&w_size, 0, sizeof(struct winsize)); memset(&w_size_bck, 0, sizeof(struct winsize)); - while (1) { + while(1) { FD_ZERO(&set); - FD_SET(fileno(stdin),&set); + FD_SET(fileno(stdin), &set); /* Search if a resize pty has to be send */ ioctl(fileno(stdin), TIOCGWINSZ, &w_size); - if ((w_size.ws_row != w_size_bck.ws_row) || - (w_size.ws_col != w_size_bck.ws_col)) { + if((w_size.ws_row != w_size_bck.ws_row) || + (w_size.ws_col != w_size_bck.ws_col)) { w_size_bck = w_size; libssh2_channel_request_pty_size(channel, @@ -396,10 +405,12 @@ main (int argc, char *argv[]) w_size.ws_row); } - if ((buf = calloc (bufsiz, sizeof(char))) == NULL) + buf = calloc(bufsiz, sizeof(char)); + if(buf == NULL) break; - if ((fds = malloc (sizeof (LIBSSH2_POLLFD))) == NULL) { + fds = malloc(sizeof (LIBSSH2_POLLFD)); + if(fds == NULL) { free(buf); break; } @@ -410,25 +421,25 @@ main (int argc, char *argv[]) fds[0].revents = LIBSSH2_POLLFD_POLLIN; rc = libssh2_poll(fds, nfds, 0); - if (rc >0) { + if(rc >0) { libssh2_channel_read(channel, buf, sizeof(buf)); fprintf(stdout, "%s", buf); fflush(stdout); } /* Looping on X clients */ - if (gp_x11_chan != NULL) { + if(gp_x11_chan != NULL) { current_node = gp_x11_chan; } else current_node = NULL; - while (current_node != NULL) { + while(current_node != NULL) { struct chan_X11_list *next_node; rc = x11_send_receive(current_node->chan, current_node->sock); next_node = current_node->next; - if (rc == -1){ - shutdown(current_node->sock,SHUT_RDWR); + if(rc == -1) { + shutdown(current_node->sock, SHUT_RDWR); close(current_node->sock); remove_node(current_node); } @@ -437,25 +448,25 @@ main (int argc, char *argv[]) } - rc = select(fileno(stdin)+1,&set,NULL,NULL,&timeval_out); - if (rc > 0) { + rc = select(fileno(stdin) + 1, &set, NULL, NULL, &timeval_out); + if(rc > 0) { /* Data in stdin*/ - rc = read(fileno(stdin), buf,1); - if (rc > 0) - libssh2_channel_write(channel,buf, sizeof(buf)); + rc = read(fileno(stdin), buf, 1); + if(rc > 0) + libssh2_channel_write(channel, buf, sizeof(buf)); } - free (fds); - free (buf); + free(fds); + free(buf); - if (libssh2_channel_eof (channel) == 1) { - break; + if(libssh2_channel_eof (channel) == 1) { + break; } } - if (channel) { - libssh2_channel_free (channel); - channel = NULL; + if(channel) { + libssh2_channel_free(channel); + channel = NULL; } _normal_mode(); diff --git a/vendor/libssh2/include/libssh2.h b/vendor/libssh2/include/libssh2.h index fdcf6163d..d33df03c3 100644 --- a/vendor/libssh2/include/libssh2.h +++ b/vendor/libssh2/include/libssh2.h @@ -40,19 +40,19 @@ #ifndef LIBSSH2_H #define LIBSSH2_H 1 -#define LIBSSH2_COPYRIGHT "2004-2016 The libssh2 project and its contributors." +#define LIBSSH2_COPYRIGHT "2004-2019 The libssh2 project and its contributors." /* We use underscore instead of dash when appending DEV in dev versions just to make the BANNER define (used by src/session.c) be a valid SSH banner. Release versions have no appended strings and may of course not have dashes either. */ -#define LIBSSH2_VERSION "1.8.2" +#define LIBSSH2_VERSION "1.9.0" /* The numeric version number is also available "in parts" by using these defines: */ #define LIBSSH2_VERSION_MAJOR 1 -#define LIBSSH2_VERSION_MINOR 8 -#define LIBSSH2_VERSION_PATCH 2 +#define LIBSSH2_VERSION_MINOR 9 +#define LIBSSH2_VERSION_PATCH 0 /* This is the numeric version of the libssh2 version number, meant for easier parsing and comparions by programs. The LIBSSH2_VERSION_NUM define will @@ -69,7 +69,7 @@ and it is always a greater number in a more recent release. It makes comparisons with greater than and less than work. */ -#define LIBSSH2_VERSION_NUM 0x010802 +#define LIBSSH2_VERSION_NUM 0x010900 /* * This is the date and time when the full source package was created. The @@ -80,7 +80,7 @@ * * "Mon Feb 12 11:35:33 UTC 2007" */ -#define LIBSSH2_TIMESTAMP "Mon Mar 25 19:29:57 UTC 2019" +#define LIBSSH2_TIMESTAMP "Thu Jun 20 06:19:26 UTC 2019" #ifndef RC_INVOKED @@ -121,18 +121,28 @@ extern "C" { #if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) # include typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; typedef unsigned int uint32_t; +typedef int int32_t; +typedef unsigned long long uint64_t; +typedef long long int64_t; #endif #ifdef _MSC_VER typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; typedef unsigned int uint32_t; +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; typedef unsigned __int64 libssh2_uint64_t; typedef __int64 libssh2_int64_t; -#ifndef ssize_t +#if (!defined(HAVE_SSIZE_T) && !defined(ssize_t)) typedef SSIZE_T ssize_t; +#define HAVE_SSIZE_T #endif #else +#include typedef unsigned long long libssh2_uint64_t; typedef long long libssh2_int64_t; #endif @@ -203,7 +213,8 @@ typedef off_t libssh2_struct_stat_size; #ifndef LIBSSH2_STRUCT_STAT_SIZE_FORMAT # ifdef __VMS -/* We have to roll our own format here because %z is a C99-ism we don't have. */ +/* We have to roll our own format here because %z is a C99-ism we don't + have. */ # if __USE_OFF64_T || __USING_STD_STAT # define LIBSSH2_STRUCT_STAT_SIZE_FORMAT "%Ld" # else @@ -219,11 +230,11 @@ typedef off_t libssh2_struct_stat_size; /* Part of every banner, user specified or not */ #define LIBSSH2_SSH_BANNER "SSH-2.0-libssh2_" LIBSSH2_VERSION -/* We *could* add a comment here if we so chose */ -#define LIBSSH2_SSH_DEFAULT_BANNER LIBSSH2_SSH_BANNER -#define LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF LIBSSH2_SSH_DEFAULT_BANNER "\r\n" +#define LIBSSH2_SSH_DEFAULT_BANNER LIBSSH2_SSH_BANNER +#define LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF LIBSSH2_SSH_DEFAULT_BANNER "\r\n" -/* Default generate and safe prime sizes for diffie-hellman-group-exchange-sha1 */ +/* Default generate and safe prime sizes for + diffie-hellman-group-exchange-sha1 */ #define LIBSSH2_DH_GEX_MINGROUP 1024 #define LIBSSH2_DH_GEX_OPTGROUP 1536 #define LIBSSH2_DH_GEX_MAXGROUP 2048 @@ -259,14 +270,14 @@ typedef off_t libssh2_struct_stat_size; typedef struct _LIBSSH2_USERAUTH_KBDINT_PROMPT { - char* text; + char *text; unsigned int length; unsigned char echo; } LIBSSH2_USERAUTH_KBDINT_PROMPT; typedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE { - char* text; + char *text; unsigned int length; } LIBSSH2_USERAUTH_KBDINT_RESPONSE; @@ -277,10 +288,10 @@ typedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE /* 'keyboard-interactive' authentication callback */ #define LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(name_) \ - void name_(const char* name, int name_len, const char* instruction, \ + void name_(const char *name, int name_len, const char *instruction, \ int instruction_len, int num_prompts, \ - const LIBSSH2_USERAUTH_KBDINT_PROMPT* prompts, \ - LIBSSH2_USERAUTH_KBDINT_RESPONSE* responses, void **abstract) + const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, \ + LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract) /* Callbacks for special SSH packets */ #define LIBSSH2_IGNORE_FUNC(name) \ @@ -314,12 +325,14 @@ typedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE LIBSSH2_CHANNEL *channel, void **channel_abstract) /* I/O callbacks */ -#define LIBSSH2_RECV_FUNC(name) ssize_t name(libssh2_socket_t socket, \ - void *buffer, size_t length, \ - int flags, void **abstract) -#define LIBSSH2_SEND_FUNC(name) ssize_t name(libssh2_socket_t socket, \ - const void *buffer, size_t length,\ - int flags, void **abstract) +#define LIBSSH2_RECV_FUNC(name) \ + ssize_t name(libssh2_socket_t socket, \ + void *buffer, size_t length, \ + int flags, void **abstract) +#define LIBSSH2_SEND_FUNC(name) \ + ssize_t name(libssh2_socket_t socket, \ + const void *buffer, size_t length, \ + int flags, void **abstract) /* libssh2_session_callback_set() constants */ #define LIBSSH2_CALLBACK_IGNORE 0 @@ -403,11 +416,16 @@ typedef struct _LIBSSH2_POLLFD { /* Hash Types */ #define LIBSSH2_HOSTKEY_HASH_MD5 1 #define LIBSSH2_HOSTKEY_HASH_SHA1 2 +#define LIBSSH2_HOSTKEY_HASH_SHA256 3 /* Hostkey Types */ -#define LIBSSH2_HOSTKEY_TYPE_UNKNOWN 0 -#define LIBSSH2_HOSTKEY_TYPE_RSA 1 -#define LIBSSH2_HOSTKEY_TYPE_DSS 2 +#define LIBSSH2_HOSTKEY_TYPE_UNKNOWN 0 +#define LIBSSH2_HOSTKEY_TYPE_RSA 1 +#define LIBSSH2_HOSTKEY_TYPE_DSS 2 +#define LIBSSH2_HOSTKEY_TYPE_ECDSA_256 3 +#define LIBSSH2_HOSTKEY_TYPE_ECDSA_384 4 +#define LIBSSH2_HOSTKEY_TYPE_ECDSA_521 5 +#define LIBSSH2_HOSTKEY_TYPE_ED25519 6 /* Disconnect Codes (defined by SSH protocol) */ #define SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1 @@ -453,7 +471,8 @@ typedef struct _LIBSSH2_POLLFD { #define LIBSSH2_ERROR_FILE -16 #define LIBSSH2_ERROR_METHOD_NONE -17 #define LIBSSH2_ERROR_AUTHENTICATION_FAILED -18 -#define LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED LIBSSH2_ERROR_AUTHENTICATION_FAILED +#define LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED \ + LIBSSH2_ERROR_AUTHENTICATION_FAILED #define LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED -19 #define LIBSSH2_ERROR_CHANNEL_OUTOFORDER -20 #define LIBSSH2_ERROR_CHANNEL_FAILURE -21 @@ -482,6 +501,8 @@ typedef struct _LIBSSH2_POLLFD { #define LIBSSH2_ERROR_ENCRYPT -44 #define LIBSSH2_ERROR_BAD_SOCKET -45 #define LIBSSH2_ERROR_KNOWN_HOSTS -46 +#define LIBSSH2_ERROR_CHANNEL_WINDOW_FULL -47 +#define LIBSSH2_ERROR_KEYFILE_AUTH_FAILED -48 /* this is a define to provide the old (<= 1.2.7) name */ #define LIBSSH2_ERROR_BANNER_NONE LIBSSH2_ERROR_BANNER_RECV @@ -531,7 +552,7 @@ LIBSSH2_API void libssh2_free(LIBSSH2_SESSION *session, void *ptr); */ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, int method_type, - const char*** algs); + const char ***algs); /* Session API */ LIBSSH2_API LIBSSH2_SESSION * @@ -579,7 +600,7 @@ LIBSSH2_API int libssh2_session_last_error(LIBSSH2_SESSION *session, LIBSSH2_API int libssh2_session_last_errno(LIBSSH2_SESSION *session); LIBSSH2_API int libssh2_session_set_last_error(LIBSSH2_SESSION* session, int errcode, - const char* errmsg); + const char *errmsg); LIBSSH2_API int libssh2_session_block_directions(LIBSSH2_SESSION *session); LIBSSH2_API int libssh2_session_flag(LIBSSH2_SESSION *session, int flag, @@ -592,12 +613,14 @@ LIBSSH2_API char *libssh2_userauth_list(LIBSSH2_SESSION *session, unsigned int username_len); LIBSSH2_API int libssh2_userauth_authenticated(LIBSSH2_SESSION *session); -LIBSSH2_API int libssh2_userauth_password_ex(LIBSSH2_SESSION *session, - const char *username, - unsigned int username_len, - const char *password, - unsigned int password_len, - LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb))); +LIBSSH2_API int +libssh2_userauth_password_ex(LIBSSH2_SESSION *session, + const char *username, + unsigned int username_len, + const char *password, + unsigned int password_len, + LIBSSH2_PASSWD_CHANGEREQ_FUNC + ((*passwd_change_cb))); #define libssh2_userauth_password(session, username, password) \ libssh2_userauth_password_ex((session), (username), \ @@ -624,7 +647,8 @@ libssh2_userauth_publickey(LIBSSH2_SESSION *session, const char *username, const unsigned char *pubkeydata, size_t pubkeydata_len, - LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)), + LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC + ((*sign_callback)), void **abstract); LIBSSH2_API int @@ -716,7 +740,8 @@ libssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host, LIBSSH2_API LIBSSH2_LISTENER * libssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, const char *host, - int port, int *bound_port, int queue_maxsize); + int port, int *bound_port, + int queue_maxsize); #define libssh2_channel_forward_listen(session, port) \ libssh2_channel_forward_listen_ex((session), NULL, (port), NULL, 16) @@ -747,15 +772,17 @@ LIBSSH2_API int libssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel, libssh2_channel_request_pty_ex((channel), (term), \ (unsigned int)strlen(term), \ NULL, 0, \ - LIBSSH2_TERM_WIDTH, LIBSSH2_TERM_HEIGHT, \ - LIBSSH2_TERM_WIDTH_PX, LIBSSH2_TERM_HEIGHT_PX) + LIBSSH2_TERM_WIDTH, \ + LIBSSH2_TERM_HEIGHT, \ + LIBSSH2_TERM_WIDTH_PX, \ + LIBSSH2_TERM_HEIGHT_PX) LIBSSH2_API int libssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL *channel, int width, int height, int width_px, int height_px); #define libssh2_channel_request_pty_size(channel, width, height) \ - libssh2_channel_request_pty_size_ex( (channel), (width), (height), 0, 0) + libssh2_channel_request_pty_size_ex((channel), (width), (height), 0, 0) LIBSSH2_API int libssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel, int single_connection, @@ -817,8 +844,9 @@ LIBSSH2_API ssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL *channel, #define libssh2_channel_write(channel, buf, buflen) \ libssh2_channel_write_ex((channel), 0, (buf), (buflen)) -#define libssh2_channel_write_stderr(channel, buf, buflen) \ - libssh2_channel_write_ex((channel), SSH_EXTENDED_DATA_STDERR, (buf), (buflen)) +#define libssh2_channel_write_stderr(channel, buf, buflen) \ + libssh2_channel_write_ex((channel), SSH_EXTENDED_DATA_STDERR, \ + (buf), (buflen)) LIBSSH2_API unsigned long libssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel, @@ -855,7 +883,7 @@ LIBSSH2_API int libssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel, libssh2_channel_handle_extended_data((channel), \ (ignore) ? \ LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE : \ - LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL ) + LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL) #define LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA -1 #define LIBSSH2_CHANNEL_FLUSH_ALL -2 @@ -959,13 +987,17 @@ libssh2_knownhost_init(LIBSSH2_SESSION *session); #define LIBSSH2_KNOWNHOST_KEYENC_RAW (1<<16) #define LIBSSH2_KNOWNHOST_KEYENC_BASE64 (2<<16) -/* type of key (2 bits) */ -#define LIBSSH2_KNOWNHOST_KEY_MASK (7<<18) -#define LIBSSH2_KNOWNHOST_KEY_SHIFT 18 -#define LIBSSH2_KNOWNHOST_KEY_RSA1 (1<<18) -#define LIBSSH2_KNOWNHOST_KEY_SSHRSA (2<<18) -#define LIBSSH2_KNOWNHOST_KEY_SSHDSS (3<<18) -#define LIBSSH2_KNOWNHOST_KEY_UNKNOWN (7<<18) +/* type of key (3 bits) */ +#define LIBSSH2_KNOWNHOST_KEY_MASK (15<<18) +#define LIBSSH2_KNOWNHOST_KEY_SHIFT 18 +#define LIBSSH2_KNOWNHOST_KEY_RSA1 (1<<18) +#define LIBSSH2_KNOWNHOST_KEY_SSHRSA (2<<18) +#define LIBSSH2_KNOWNHOST_KEY_SSHDSS (3<<18) +#define LIBSSH2_KNOWNHOST_KEY_ECDSA_256 (4<<18) +#define LIBSSH2_KNOWNHOST_KEY_ECDSA_384 (5<<18) +#define LIBSSH2_KNOWNHOST_KEY_ECDSA_521 (6<<18) +#define LIBSSH2_KNOWNHOST_KEY_ED25519 (7<<18) +#define LIBSSH2_KNOWNHOST_KEY_UNKNOWN (15<<18) LIBSSH2_API int libssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts, @@ -1233,6 +1265,24 @@ libssh2_agent_disconnect(LIBSSH2_AGENT *agent); LIBSSH2_API void libssh2_agent_free(LIBSSH2_AGENT *agent); +/* + * libssh2_agent_set_identity_path() + * + * Allows a custom agent identity socket path beyond SSH_AUTH_SOCK env + * + */ +LIBSSH2_API void +libssh2_agent_set_identity_path(LIBSSH2_AGENT *agent, + const char *path); + +/* + * libssh2_agent_get_identity_path() + * + * Returns the custom agent identity socket path if set + * + */ +LIBSSH2_API const char * +libssh2_agent_get_identity_path(LIBSSH2_AGENT *agent); /* * libssh2_keepalive_config() @@ -1247,9 +1297,9 @@ libssh2_agent_free(LIBSSH2_AGENT *agent); * Note that non-blocking applications are responsible for sending the * keepalive messages using libssh2_keepalive_send(). */ -LIBSSH2_API void libssh2_keepalive_config (LIBSSH2_SESSION *session, - int want_reply, - unsigned interval); +LIBSSH2_API void libssh2_keepalive_config(LIBSSH2_SESSION *session, + int want_reply, + unsigned interval); /* * libssh2_keepalive_send() @@ -1259,8 +1309,8 @@ LIBSSH2_API void libssh2_keepalive_config (LIBSSH2_SESSION *session, * it again. Returns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on * I/O errors. */ -LIBSSH2_API int libssh2_keepalive_send (LIBSSH2_SESSION *session, - int *seconds_to_next); +LIBSSH2_API int libssh2_keepalive_send(LIBSSH2_SESSION *session, + int *seconds_to_next); /* NOTE NOTE NOTE libssh2_trace() has no function in builds that aren't built with debug @@ -1278,11 +1328,11 @@ LIBSSH2_API int libssh2_trace(LIBSSH2_SESSION *session, int bitmask); #define LIBSSH2_TRACE_SOCKET (1<<9) typedef void (*libssh2_trace_handler_func)(LIBSSH2_SESSION*, - void*, + void *, const char *, size_t); LIBSSH2_API int libssh2_trace_sethandler(LIBSSH2_SESSION *session, - void* context, + void *context, libssh2_trace_handler_func callback); #ifdef __cplusplus diff --git a/vendor/libssh2/include/libssh2_publickey.h b/vendor/libssh2/include/libssh2_publickey.h index 0979e23cb..5dbdcf925 100644 --- a/vendor/libssh2/include/libssh2_publickey.h +++ b/vendor/libssh2/include/libssh2_publickey.h @@ -81,16 +81,18 @@ extern "C" { #endif /* Publickey Subsystem */ -LIBSSH2_API LIBSSH2_PUBLICKEY *libssh2_publickey_init(LIBSSH2_SESSION *session); - -LIBSSH2_API int libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, - const unsigned char *name, - unsigned long name_len, - const unsigned char *blob, - unsigned long blob_len, char overwrite, - unsigned long num_attrs, - const libssh2_publickey_attribute attrs[]); -#define libssh2_publickey_add(pkey, name, blob, blob_len, overwrite, \ +LIBSSH2_API LIBSSH2_PUBLICKEY * +libssh2_publickey_init(LIBSSH2_SESSION *session); + +LIBSSH2_API int +libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, + const unsigned char *name, + unsigned long name_len, + const unsigned char *blob, + unsigned long blob_len, char overwrite, + unsigned long num_attrs, + const libssh2_publickey_attribute attrs[]); +#define libssh2_publickey_add(pkey, name, blob, blob_len, overwrite, \ num_attrs, attrs) \ libssh2_publickey_add_ex((pkey), (name), strlen(name), (blob), (blob_len), \ (overwrite), (num_attrs), (attrs)) @@ -107,8 +109,9 @@ LIBSSH2_API int libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY *pkey, unsigned long *num_keys, libssh2_publickey_list **pkey_list); -LIBSSH2_API void libssh2_publickey_list_free(LIBSSH2_PUBLICKEY *pkey, - libssh2_publickey_list *pkey_list); +LIBSSH2_API void +libssh2_publickey_list_free(LIBSSH2_PUBLICKEY *pkey, + libssh2_publickey_list *pkey_list); LIBSSH2_API int libssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey); diff --git a/vendor/libssh2/include/libssh2_sftp.h b/vendor/libssh2/include/libssh2_sftp.h index 677faf2fd..4a750b3e3 100644 --- a/vendor/libssh2/include/libssh2_sftp.h +++ b/vendor/libssh2/include/libssh2_sftp.h @@ -79,6 +79,9 @@ typedef struct _LIBSSH2_SFTP_STATVFS LIBSSH2_SFTP_STATVFS; #define LIBSSH2_SFTP_READLINK 1 #define LIBSSH2_SFTP_REALPATH 2 +/* Flags for sftp_mkdir() */ +#define LIBSSH2_SFTP_DEFAULT_MODE -1 + /* SFTP attribute flag bits */ #define LIBSSH2_SFTP_ATTR_SIZE 0x00000001 #define LIBSSH2_SFTP_ATTR_UIDGID 0x00000002 @@ -221,12 +224,13 @@ LIBSSH2_API unsigned long libssh2_sftp_last_error(LIBSSH2_SFTP *sftp); LIBSSH2_API LIBSSH2_CHANNEL *libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp); /* File / Directory Ops */ -LIBSSH2_API LIBSSH2_SFTP_HANDLE *libssh2_sftp_open_ex(LIBSSH2_SFTP *sftp, - const char *filename, - unsigned int filename_len, - unsigned long flags, - long mode, int open_type); -#define libssh2_sftp_open(sftp, filename, flags, mode) \ +LIBSSH2_API LIBSSH2_SFTP_HANDLE * +libssh2_sftp_open_ex(LIBSSH2_SFTP *sftp, + const char *filename, + unsigned int filename_len, + unsigned long flags, + long mode, int open_type); +#define libssh2_sftp_open(sftp, filename, flags, mode) \ libssh2_sftp_open_ex((sftp), (filename), strlen(filename), (flags), \ (mode), LIBSSH2_SFTP_OPENFILE) #define libssh2_sftp_opendir(sftp, path) \ @@ -328,7 +332,8 @@ LIBSSH2_API int libssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp, const char *path, unsigned int path_len, char *target, - unsigned int target_len, int link_type); + unsigned int target_len, + int link_type); #define libssh2_sftp_symlink(sftp, orig, linkpath) \ libssh2_sftp_symlink_ex((sftp), (orig), strlen(orig), (linkpath), \ strlen(linkpath), LIBSSH2_SFTP_SYMLINK) diff --git a/vendor/libssh2/os400/initscript.sh b/vendor/libssh2/os400/initscript.sh index 1d47a1dd8..a18e24cfe 100644 --- a/vendor/libssh2/os400/initscript.sh +++ b/vendor/libssh2/os400/initscript.sh @@ -49,7 +49,7 @@ setenv TGTCCSID '500' # Target CCSID of objects. setenv DEBUG '*ALL' # Debug level. setenv OPTIMIZE '10' # Optimisation level setenv OUTPUT '*NONE' # Compilation output option. -setenv TGTRLS 'V5R3M0' # Target OS release. +setenv TGTRLS 'V6R1M0' # Target OS release. setenv IFSDIR '/libssh2' # Installation IFS directory. # Define ZLIB availability and locations. @@ -180,7 +180,7 @@ make_module() CMD="CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('__tmpsrcf.c')" # CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST *SHOWINC *SHOWSYS)" CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)" - CMD="${CMD} LOCALETYPE(*LOCALE)" + CMD="${CMD} LOCALETYPE(*LOCALE) FLAG(10)" CMD="${CMD} INCDIR('${TOPDIR}/os400/include'" CMD="${CMD} '/QIBM/ProdData/qadrt/include' '${TOPDIR}/include'" CMD="${CMD} '${TOPDIR}/os400' '${SRCDIR}'" diff --git a/vendor/libssh2/src/CMakeLists.txt b/vendor/libssh2/src/CMakeLists.txt index 6401acff2..2eaf4cc2c 100644 --- a/vendor/libssh2/src/CMakeLists.txt +++ b/vendor/libssh2/src/CMakeLists.txt @@ -77,21 +77,21 @@ if(CRYPTO_BACKEND STREQUAL "OpenSSL" OR NOT CRYPTO_BACKEND) list(APPEND PC_LIBS -lcrypt32) find_file(DLL_LIBEAY32 - NAMES libeay32.dll crypto.dll + NAMES libeay32.dll crypto.dll libcrypto-1_1.dll libcrypto-1_1-x64.dll HINTS ${_OPENSSL_ROOT_HINTS} PATHS ${_OPENSSL_ROOT_PATHS} PATH_SUFFIXES bin) if (NOT DLL_LIBEAY32) message(WARNING - "Unable to find OpenSSL libeay32 DLL, executables may not run") + "Unable to find OpenSSL crypto (aka libeay32) DLL, executables may not run") endif() find_file(DLL_SSLEAY32 - NAMES ssleay32.dll ssl.dll + NAMES ssleay32.dll ssl.dll libssl-1_1.dll libssl-1_1-x64.dll HINTS ${_OPENSSL_ROOT_HINTS} PATHS ${_OPENSSL_ROOT_PATHS} PATH_SUFFIXES bin) if (NOT DLL_SSLEAY32) message(WARNING - "Unable to find OpenSSL ssleay32 DLL, executables may not run") + "Unable to find OpenSSL ssl (aka ssleay32) DLL, executables may not run") endif() if(DLL_LIBEAY32 AND DLL_SSLEAY32) @@ -176,6 +176,9 @@ include(GNUInstallDirs) set(SOURCES ${CRYPTO_SOURCES} agent.c + blf.h + bcrypt_pbkdf.c + blowfish.c channel.c channel.h comp.c @@ -217,7 +220,7 @@ set_target_properties(libssh2 PROPERTIES PREFIX "") target_compile_definitions(libssh2 PRIVATE ${PRIVATE_COMPILE_DEFINITIONS}) target_include_directories(libssh2 - PRIVATE ${PRIVATE_INCLUDE_DIRECTORIES} + PRIVATE "${PROJECT_SOURCE_DIR}/include/" ${PRIVATE_INCLUDE_DIRECTORIES} PUBLIC $ $/${CMAKE_INSTALL_INCLUDEDIR}>) @@ -312,6 +315,7 @@ if (NOT HAVE_STRTOLL) check_symbol_exists(_strtoi64 stdlib.h HAVE_STRTOI64) endif() check_symbol_exists(snprintf stdio.h HAVE_SNPRINTF) +check_symbol_exists(memset_s string.h HAVE_MEMSET_S) if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Interix") @@ -322,7 +326,7 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR # filesystem here" # # Mac OS X's poll has funny behaviors, like: - # not being able to do poll on no fildescriptors (10.3?) + # not being able to do poll on no filedescriptors (10.3?) # not being able to poll on some files (like anything in /dev) # not having reliable timeout support # inconsistent return of POLLHUP where other implementations give POLLIN @@ -333,7 +337,7 @@ endif() append_needed_socket_libraries(LIBRARIES) -# Non-blocking socket support tests. Must be after after library tests to +# Non-blocking socket support tests. Must be after library tests to # link correctly set(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) set(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES}) diff --git a/vendor/libssh2/src/Makefile.am b/vendor/libssh2/src/Makefile.am index c14dc7cb3..31d58ed57 100644 --- a/vendor/libssh2/src/Makefile.am +++ b/vendor/libssh2/src/Makefile.am @@ -1,7 +1,7 @@ # $Id: Makefile.am,v 1.21 2009/05/07 17:21:56 bagder Exp $ AUTOMAKE_OPTIONS = foreign nostdinc -# Get the CRYPTO_CSOURCES and CRYPTO_HHEADERS defines +# Get the CRYPTO_CSOURCES, CRYPTO_HHEADERS and CRYPTO_LTLIBS defines if OPENSSL include ../Makefile.OpenSSL.inc endif @@ -11,9 +11,6 @@ endif if WINCNG include ../Makefile.WinCNG.inc endif -if OS400QC3 -include ../Makefile.os400qc3.inc -endif if MBEDTLS include ../Makefile.mbedTLS.inc endif @@ -65,4 +62,4 @@ VERSION=-version-info 1:1:0 libssh2_la_LDFLAGS = $(VERSION) -no-undefined \ -export-symbols-regex '^libssh2_.*' \ - $(LTLIBGCRYPT) $(LTLIBSSL) $(LTLIBZ) + $(CRYPTO_LTLIBS) $(LTLIBZ) diff --git a/vendor/libssh2/src/Makefile.in b/vendor/libssh2/src/Makefile.in index 44533bded..c00d9dbae 100644 --- a/vendor/libssh2/src/Makefile.in +++ b/vendor/libssh2/src/Makefile.in @@ -137,12 +137,12 @@ libssh2_la_LIBADD = am__libssh2_la_SOURCES_DIST = channel.c comp.c crypt.c hostkey.c kex.c \ mac.c misc.c packet.c publickey.c scp.c session.c sftp.c \ userauth.c transport.c version.c knownhost.c agent.c \ - libgcrypt.c mbedtls.c openssl.c os400qc3.c wincng.c pem.c \ - keepalive.c global.c libssh2_priv.h libgcrypt.h mbedtls.h \ - openssl.h os400qc3.h wincng.h transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h -@LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_FALSE@@OS400QC3_FALSE@@WINCNG_TRUE@am__objects_1 = wincng.lo -@LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_FALSE@@OS400QC3_TRUE@am__objects_1 = os400qc3.lo + libgcrypt.c mbedtls.c openssl.c wincng.c pem.c keepalive.c \ + global.c blowfish.c bcrypt_pbkdf.c libssh2_priv.h libgcrypt.h \ + mbedtls.h openssl.h wincng.h transport.h channel.h comp.h \ + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h \ + blf.h +@LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_FALSE@@WINCNG_TRUE@am__objects_1 = wincng.lo @LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_TRUE@am__objects_1 = \ @LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_TRUE@ openssl.lo @LIBGCRYPT_FALSE@@MBEDTLS_TRUE@am__objects_1 = mbedtls.lo @@ -150,7 +150,8 @@ am__libssh2_la_SOURCES_DIST = channel.c comp.c crypt.c hostkey.c kex.c \ am__objects_2 = channel.lo comp.lo crypt.lo hostkey.lo kex.lo mac.lo \ misc.lo packet.lo publickey.lo scp.lo session.lo sftp.lo \ userauth.lo transport.lo version.lo knownhost.lo agent.lo \ - $(am__objects_1) pem.lo keepalive.lo global.lo + $(am__objects_1) pem.lo keepalive.lo global.lo blowfish.lo \ + bcrypt_pbkdf.lo am__objects_3 = am__objects_4 = $(am__objects_3) am_libssh2_la_OBJECTS = $(am__objects_2) $(am__objects_4) @@ -177,14 +178,15 @@ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles -am__depfiles_remade = ./$(DEPDIR)/agent.Plo ./$(DEPDIR)/channel.Plo \ - ./$(DEPDIR)/comp.Plo ./$(DEPDIR)/crypt.Plo \ - ./$(DEPDIR)/global.Plo ./$(DEPDIR)/hostkey.Plo \ - ./$(DEPDIR)/keepalive.Plo ./$(DEPDIR)/kex.Plo \ - ./$(DEPDIR)/knownhost.Plo ./$(DEPDIR)/libgcrypt.Plo \ - ./$(DEPDIR)/mac.Plo ./$(DEPDIR)/mbedtls.Plo \ - ./$(DEPDIR)/misc.Plo ./$(DEPDIR)/openssl.Plo \ - ./$(DEPDIR)/os400qc3.Plo ./$(DEPDIR)/packet.Plo \ +am__depfiles_remade = ./$(DEPDIR)/agent.Plo \ + ./$(DEPDIR)/bcrypt_pbkdf.Plo ./$(DEPDIR)/blowfish.Plo \ + ./$(DEPDIR)/channel.Plo ./$(DEPDIR)/comp.Plo \ + ./$(DEPDIR)/crypt.Plo ./$(DEPDIR)/global.Plo \ + ./$(DEPDIR)/hostkey.Plo ./$(DEPDIR)/keepalive.Plo \ + ./$(DEPDIR)/kex.Plo ./$(DEPDIR)/knownhost.Plo \ + ./$(DEPDIR)/libgcrypt.Plo ./$(DEPDIR)/mac.Plo \ + ./$(DEPDIR)/mbedtls.Plo ./$(DEPDIR)/misc.Plo \ + ./$(DEPDIR)/openssl.Plo ./$(DEPDIR)/packet.Plo \ ./$(DEPDIR)/pem.Plo ./$(DEPDIR)/publickey.Plo \ ./$(DEPDIR)/scp.Plo ./$(DEPDIR)/session.Plo \ ./$(DEPDIR)/sftp.Plo ./$(DEPDIR)/transport.Plo \ @@ -239,8 +241,7 @@ CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.OpenSSL.inc \ $(srcdir)/../Makefile.WinCNG.inc $(srcdir)/../Makefile.inc \ $(srcdir)/../Makefile.libgcrypt.inc \ - $(srcdir)/../Makefile.mbedTLS.inc \ - $(srcdir)/../Makefile.os400qc3.inc $(srcdir)/Makefile.in \ + $(srcdir)/../Makefile.mbedTLS.inc $(srcdir)/Makefile.in \ $(srcdir)/libssh2_config.h.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ @@ -274,7 +275,7 @@ GREP = @GREP@ HAVE_LIBBCRYPT = @HAVE_LIBBCRYPT@ HAVE_LIBCRYPT32 = @HAVE_LIBCRYPT32@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ -HAVE_LIBMBEDTLS = @HAVE_LIBMBEDTLS@ +HAVE_LIBMBEDCRYPTO = @HAVE_LIBMBEDCRYPTO@ HAVE_LIBSSL = @HAVE_LIBSSL@ HAVE_LIBZ = @HAVE_LIBZ@ INSTALL = @INSTALL@ @@ -290,8 +291,8 @@ LIBCRYPT32 = @LIBCRYPT32@ LIBCRYPT32_PREFIX = @LIBCRYPT32_PREFIX@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ -LIBMBEDTLS = @LIBMBEDTLS@ -LIBMBEDTLS_PREFIX = @LIBMBEDTLS_PREFIX@ +LIBMBEDCRYPTO = @LIBMBEDCRYPTO@ +LIBMBEDCRYPTO_PREFIX = @LIBMBEDCRYPTO_PREFIX@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSREQUIRED = @LIBSREQUIRED@ @@ -306,7 +307,7 @@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ LTLIBCRYPT32 = @LTLIBCRYPT32@ LTLIBGCRYPT = @LTLIBGCRYPT@ -LTLIBMBEDTLS = @LTLIBMBEDTLS@ +LTLIBMBEDCRYPTO = @LTLIBMBEDCRYPTO@ LTLIBOBJS = @LTLIBOBJS@ LTLIBSSL = @LTLIBSSL@ LTLIBZ = @LTLIBZ@ @@ -395,22 +396,25 @@ AUTOMAKE_OPTIONS = foreign nostdinc @LIBGCRYPT_TRUE@CRYPTO_CSOURCES = libgcrypt.c @MBEDTLS_TRUE@CRYPTO_CSOURCES = mbedtls.c @OPENSSL_TRUE@CRYPTO_CSOURCES = openssl.c -@OS400QC3_TRUE@CRYPTO_CSOURCES = os400qc3.c @WINCNG_TRUE@CRYPTO_CSOURCES = wincng.c @LIBGCRYPT_TRUE@CRYPTO_HHEADERS = libgcrypt.h @MBEDTLS_TRUE@CRYPTO_HHEADERS = mbedtls.h @OPENSSL_TRUE@CRYPTO_HHEADERS = openssl.h -@OS400QC3_TRUE@CRYPTO_HHEADERS = os400qc3.h @WINCNG_TRUE@CRYPTO_HHEADERS = wincng.h +@LIBGCRYPT_TRUE@CRYPTO_LTLIBS = $(LTLIBGCRYPT) +@MBEDTLS_TRUE@CRYPTO_LTLIBS = $(LTLIBMBEDCRYPTO) +@OPENSSL_TRUE@CRYPTO_LTLIBS = $(LTLIBSSL) +@WINCNG_TRUE@CRYPTO_LTLIBS = $(LTLIBBCRYPT) $(LTLIBCRYPT32) CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ - version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c + version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ + blowfish.c bcrypt_pbkdf.c HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h -# Get the CRYPTO_CSOURCES and CRYPTO_HHEADERS defines +# Get the CRYPTO_CSOURCES, CRYPTO_HHEADERS and CRYPTO_LTLIBS defines # Makefile.inc provides the CSOURCES and HHEADERS defines libssh2_la_SOURCES = $(CSOURCES) $(HHEADERS) @@ -452,14 +456,14 @@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/src # libssh2_la_LDFLAGS = $(VERSION) -no-undefined \ -export-symbols-regex '^libssh2_.*' \ - $(LTLIBGCRYPT) $(LTLIBSSL) $(LTLIBZ) + $(CRYPTO_LTLIBS) $(LTLIBZ) all: libssh2_config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.OpenSSL.inc $(srcdir)/../Makefile.libgcrypt.inc $(srcdir)/../Makefile.WinCNG.inc $(srcdir)/../Makefile.os400qc3.inc $(srcdir)/../Makefile.mbedTLS.inc $(srcdir)/../Makefile.inc $(am__configure_deps) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../Makefile.OpenSSL.inc $(srcdir)/../Makefile.libgcrypt.inc $(srcdir)/../Makefile.WinCNG.inc $(srcdir)/../Makefile.mbedTLS.inc $(srcdir)/../Makefile.inc $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -479,7 +483,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; -$(srcdir)/../Makefile.OpenSSL.inc $(srcdir)/../Makefile.libgcrypt.inc $(srcdir)/../Makefile.WinCNG.inc $(srcdir)/../Makefile.os400qc3.inc $(srcdir)/../Makefile.mbedTLS.inc $(srcdir)/../Makefile.inc $(am__empty): +$(srcdir)/../Makefile.OpenSSL.inc $(srcdir)/../Makefile.libgcrypt.inc $(srcdir)/../Makefile.WinCNG.inc $(srcdir)/../Makefile.mbedTLS.inc $(srcdir)/../Makefile.inc $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -550,6 +554,8 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/agent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcrypt_pbkdf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blowfish.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypt.Plo@am__quote@ # am--include-marker @@ -563,7 +569,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbedtls.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openssl.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os400qc3.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packet.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pem.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/publickey.Plo@am__quote@ # am--include-marker @@ -737,6 +742,8 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ distclean: distclean-am -rm -f ./$(DEPDIR)/agent.Plo + -rm -f ./$(DEPDIR)/bcrypt_pbkdf.Plo + -rm -f ./$(DEPDIR)/blowfish.Plo -rm -f ./$(DEPDIR)/channel.Plo -rm -f ./$(DEPDIR)/comp.Plo -rm -f ./$(DEPDIR)/crypt.Plo @@ -750,7 +757,6 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/mbedtls.Plo -rm -f ./$(DEPDIR)/misc.Plo -rm -f ./$(DEPDIR)/openssl.Plo - -rm -f ./$(DEPDIR)/os400qc3.Plo -rm -f ./$(DEPDIR)/packet.Plo -rm -f ./$(DEPDIR)/pem.Plo -rm -f ./$(DEPDIR)/publickey.Plo @@ -807,6 +813,8 @@ installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/agent.Plo + -rm -f ./$(DEPDIR)/bcrypt_pbkdf.Plo + -rm -f ./$(DEPDIR)/blowfish.Plo -rm -f ./$(DEPDIR)/channel.Plo -rm -f ./$(DEPDIR)/comp.Plo -rm -f ./$(DEPDIR)/crypt.Plo @@ -820,7 +828,6 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/mbedtls.Plo -rm -f ./$(DEPDIR)/misc.Plo -rm -f ./$(DEPDIR)/openssl.Plo - -rm -f ./$(DEPDIR)/os400qc3.Plo -rm -f ./$(DEPDIR)/packet.Plo -rm -f ./$(DEPDIR)/pem.Plo -rm -f ./$(DEPDIR)/publickey.Plo diff --git a/vendor/libssh2/src/agent.c b/vendor/libssh2/src/agent.c index c2ba422b6..0c8d88166 100644 --- a/vendor/libssh2/src/agent.c +++ b/vendor/libssh2/src/agent.c @@ -138,6 +138,8 @@ struct _LIBSSH2_AGENT struct agent_transaction_ctx transctx; struct agent_publickey *identity; struct list_head head; /* list of public keys */ + + char *identity_agent_path; /* Path to a custom identity agent socket */ }; #ifdef PF_UNIX @@ -147,22 +149,25 @@ agent_connect_unix(LIBSSH2_AGENT *agent) const char *path; struct sockaddr_un s_un; - path = getenv("SSH_AUTH_SOCK"); - if (!path) - return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE, - "no auth sock variable"); + path = agent->identity_agent_path; + if(!path) { + path = getenv("SSH_AUTH_SOCK"); + if(!path) + return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE, + "no auth sock variable"); + } agent->fd = socket(PF_UNIX, SOCK_STREAM, 0); - if (agent->fd < 0) + if(agent->fd < 0) return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_SOCKET, "failed creating socket"); s_un.sun_family = AF_UNIX; - strncpy (s_un.sun_path, path, sizeof s_un.sun_path); - s_un.sun_path[sizeof(s_un.sun_path)-1]=0; /* make sure there's a trailing - zero */ - if (connect(agent->fd, (struct sockaddr*)(&s_un), sizeof s_un) != 0) { - close (agent->fd); + strncpy(s_un.sun_path, path, sizeof s_un.sun_path); + s_un.sun_path[sizeof(s_un.sun_path)-1] = 0; /* make sure there's a trailing + zero */ + if(connect(agent->fd, (struct sockaddr*)(&s_un), sizeof s_un) != 0) { + close(agent->fd); return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, "failed connecting with agent"); } @@ -177,34 +182,34 @@ agent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) int rc; /* Send the length of the request */ - if (transctx->state == agent_NB_state_request_created) { + if(transctx->state == agent_NB_state_request_created) { _libssh2_htonu32(buf, transctx->request_len); rc = LIBSSH2_SEND_FD(agent->session, agent->fd, buf, sizeof buf, 0); - if (rc == -EAGAIN) + if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; - else if (rc < 0) + else if(rc < 0) return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND, "agent send failed"); transctx->state = agent_NB_state_request_length_sent; } /* Send the request body */ - if (transctx->state == agent_NB_state_request_length_sent) { + if(transctx->state == agent_NB_state_request_length_sent) { rc = LIBSSH2_SEND_FD(agent->session, agent->fd, transctx->request, transctx->request_len, 0); - if (rc == -EAGAIN) + if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; - else if (rc < 0) + else if(rc < 0) return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND, "agent send failed"); transctx->state = agent_NB_state_request_sent; } /* Receive the length of a response */ - if (transctx->state == agent_NB_state_request_sent) { + if(transctx->state == agent_NB_state_request_sent) { rc = LIBSSH2_RECV_FD(agent->session, agent->fd, buf, sizeof buf, 0); - if (rc < 0) { - if (rc == -EAGAIN) + if(rc < 0) { + if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_RECV, "agent recv failed"); @@ -212,18 +217,18 @@ agent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) transctx->response_len = _libssh2_ntohu32(buf); transctx->response = LIBSSH2_ALLOC(agent->session, transctx->response_len); - if (!transctx->response) + if(!transctx->response) return LIBSSH2_ERROR_ALLOC; transctx->state = agent_NB_state_response_length_received; } /* Receive the response body */ - if (transctx->state == agent_NB_state_response_length_received) { + if(transctx->state == agent_NB_state_response_length_received) { rc = LIBSSH2_RECV_FD(agent->session, agent->fd, transctx->response, transctx->response_len, 0); - if (rc < 0) { - if (rc == -EAGAIN) + if(rc < 0) { + if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND, "agent recv failed"); @@ -270,7 +275,7 @@ agent_connect_pageant(LIBSSH2_AGENT *agent) { HWND hwnd; hwnd = FindWindow("Pageant", "Pageant"); - if (!hwnd) + if(!hwnd) return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, "failed connecting agent"); agent->fd = 0; /* Mark as the connection has been established */ @@ -288,25 +293,26 @@ agent_transact_pageant(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) int id; COPYDATASTRUCT cds; - if (!transctx || 4 + transctx->request_len > PAGEANT_MAX_MSGLEN) + if(!transctx || 4 + transctx->request_len > PAGEANT_MAX_MSGLEN) return _libssh2_error(agent->session, LIBSSH2_ERROR_INVAL, "illegal input"); hwnd = FindWindow("Pageant", "Pageant"); - if (!hwnd) + if(!hwnd) return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, "found no pageant"); - sprintf(mapname, "PageantRequest%08x", (unsigned)GetCurrentThreadId()); + snprintf(mapname, sizeof(mapname), + "PageantRequest%08x%c", (unsigned)GetCurrentThreadId(), '\0'); filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, PAGEANT_MAX_MSGLEN, mapname); - if (filemap == NULL || filemap == INVALID_HANDLE_VALUE) + if(filemap == NULL || filemap == INVALID_HANDLE_VALUE) return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, "failed setting up pageant filemap"); p2 = p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0); - if (p == NULL || p2 == NULL) { + if(p == NULL || p2 == NULL) { CloseHandle(filemap); return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, "failed to open pageant filemap for writing"); @@ -320,9 +326,9 @@ agent_transact_pageant(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) cds.lpData = mapname; id = SendMessage(hwnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &cds); - if (id > 0) { + if(id > 0) { transctx->response_len = _libssh2_ntohu32(p); - if (transctx->response_len > PAGEANT_MAX_MSGLEN) { + if(transctx->response_len > PAGEANT_MAX_MSGLEN) { UnmapViewOfFile(p); CloseHandle(filemap); return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, @@ -330,7 +336,7 @@ agent_transact_pageant(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) } transctx->response = LIBSSH2_ALLOC(agent->session, transctx->response_len); - if (!transctx->response) { + if(!transctx->response) { UnmapViewOfFile(p); CloseHandle(filemap); return _libssh2_error(agent->session, LIBSSH2_ERROR_ALLOC, @@ -384,9 +390,9 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, int rc; /* Create a request to sign the data */ - if (transctx->state == agent_NB_state_init) { + if(transctx->state == agent_NB_state_init) { s = transctx->request = LIBSSH2_ALLOC(session, len); - if (!transctx->request) + if(!transctx->request) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "out of memory"); @@ -405,17 +411,17 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, } /* Make sure to be re-called as a result of EAGAIN. */ - if (*transctx->request != SSH2_AGENTC_SIGN_REQUEST) + if(*transctx->request != SSH2_AGENTC_SIGN_REQUEST) return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE, "illegal request"); - if (!agent->ops) + if(!agent->ops) /* if no agent has been connected, bail out */ return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE, "agent not connected"); rc = agent->ops->transact(agent, transctx); - if (rc) { + if(rc) { goto error; } LIBSSH2_FREE(session, transctx->request); @@ -424,11 +430,11 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, len = transctx->response_len; s = transctx->response; len--; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } - if (*s != SSH2_AGENT_SIGN_RESPONSE) { + if(*s != SSH2_AGENT_SIGN_RESPONSE) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } @@ -436,7 +442,7 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, /* Skip the entire length of the signature */ len -= 4; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } @@ -444,14 +450,14 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, /* Skip signing method */ len -= 4; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } method_len = _libssh2_ntohu32(s); s += 4; len -= method_len; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } @@ -459,20 +465,20 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, /* Read the signature */ len -= 4; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } *sig_len = _libssh2_ntohu32(s); s += 4; len -= *sig_len; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } *sig = LIBSSH2_ALLOC(session, *sig_len); - if (!*sig) { + if(!*sig) { rc = LIBSSH2_ERROR_ALLOC; goto error; } @@ -498,24 +504,24 @@ agent_list_identities(LIBSSH2_AGENT *agent) unsigned char c = SSH2_AGENTC_REQUEST_IDENTITIES; /* Create a request to list identities */ - if (transctx->state == agent_NB_state_init) { + if(transctx->state == agent_NB_state_init) { transctx->request = &c; transctx->request_len = 1; transctx->state = agent_NB_state_request_created; } /* Make sure to be re-called as a result of EAGAIN. */ - if (*transctx->request != SSH2_AGENTC_REQUEST_IDENTITIES) + if(*transctx->request != SSH2_AGENTC_REQUEST_IDENTITIES) return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE, "illegal agent request"); - if (!agent->ops) + if(!agent->ops) /* if no agent has been connected, bail out */ return _libssh2_error(agent->session, LIBSSH2_ERROR_BAD_USE, "agent not connected"); rc = agent->ops->transact(agent, transctx); - if (rc) { + if(rc) { goto error; } transctx->request = NULL; @@ -523,11 +529,11 @@ agent_list_identities(LIBSSH2_AGENT *agent) len = transctx->response_len; s = transctx->response; len--; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } - if (*s != SSH2_AGENT_IDENTITIES_ANSWER) { + if(*s != SSH2_AGENT_IDENTITIES_ANSWER) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } @@ -535,25 +541,25 @@ agent_list_identities(LIBSSH2_AGENT *agent) /* Read the length of identities */ len -= 4; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } num_identities = _libssh2_ntohu32(s); s += 4; - while (num_identities--) { + while(num_identities--) { struct agent_publickey *identity; ssize_t comment_len; /* Read the length of the blob */ len -= 4; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } identity = LIBSSH2_ALLOC(agent->session, sizeof *identity); - if (!identity) { + if(!identity) { rc = LIBSSH2_ERROR_ALLOC; goto error; } @@ -562,7 +568,7 @@ agent_list_identities(LIBSSH2_AGENT *agent) /* Read the blob */ len -= identity->external.blob_len; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; LIBSSH2_FREE(agent->session, identity); goto error; @@ -570,7 +576,7 @@ agent_list_identities(LIBSSH2_AGENT *agent) identity->external.blob = LIBSSH2_ALLOC(agent->session, identity->external.blob_len); - if (!identity->external.blob) { + if(!identity->external.blob) { rc = LIBSSH2_ERROR_ALLOC; LIBSSH2_FREE(agent->session, identity); goto error; @@ -580,7 +586,7 @@ agent_list_identities(LIBSSH2_AGENT *agent) /* Read the length of the comment */ len -= 4; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; LIBSSH2_FREE(agent->session, identity->external.blob); LIBSSH2_FREE(agent->session, identity); @@ -591,7 +597,7 @@ agent_list_identities(LIBSSH2_AGENT *agent) /* Read the comment */ len -= comment_len; - if (len < 0) { + if(len < 0) { rc = LIBSSH2_ERROR_AGENT_PROTOCOL; LIBSSH2_FREE(agent->session, identity->external.blob); LIBSSH2_FREE(agent->session, identity); @@ -600,7 +606,7 @@ agent_list_identities(LIBSSH2_AGENT *agent) identity->external.comment = LIBSSH2_ALLOC(agent->session, comment_len + 1); - if (!identity->external.comment) { + if(!identity->external.comment) { rc = LIBSSH2_ERROR_ALLOC; LIBSSH2_FREE(agent->session, identity->external.blob); LIBSSH2_FREE(agent->session, identity); @@ -621,11 +627,12 @@ agent_list_identities(LIBSSH2_AGENT *agent) } static void -agent_free_identities(LIBSSH2_AGENT *agent) { +agent_free_identities(LIBSSH2_AGENT *agent) +{ struct agent_publickey *node; struct agent_publickey *next; - for (node = _libssh2_list_first(&agent->head); node; node = next) { + for(node = _libssh2_list_first(&agent->head); node; node = next) { next = _libssh2_list_next(&node->node); LIBSSH2_FREE(agent->session, node->external.blob); LIBSSH2_FREE(agent->session, node->external.comment); @@ -664,13 +671,14 @@ libssh2_agent_init(LIBSSH2_SESSION *session) LIBSSH2_AGENT *agent; agent = LIBSSH2_CALLOC(session, sizeof *agent); - if (!agent) { + if(!agent) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate space for agent connection"); return NULL; } agent->fd = LIBSSH2_INVALID_SOCKET; agent->session = session; + agent->identity_agent_path = NULL; _libssh2_list_init(&agent->head); return agent; @@ -687,10 +695,10 @@ LIBSSH2_API int libssh2_agent_connect(LIBSSH2_AGENT *agent) { int i, rc = -1; - for (i = 0; supported_backends[i].name; i++) { + for(i = 0; supported_backends[i].name; i++) { agent->ops = supported_backends[i].ops; rc = (agent->ops->connect)(agent); - if (!rc) + if(!rc) return 0; } return rc; @@ -707,7 +715,7 @@ LIBSSH2_API int libssh2_agent_list_identities(LIBSSH2_AGENT *agent) { memset(&agent->transctx, 0, sizeof agent->transctx); - /* Abondon the last fetched identities */ + /* Abandon the last fetched identities */ agent_free_identities(agent); return agent_list_identities(agent); } @@ -730,7 +738,7 @@ libssh2_agent_get_identity(LIBSSH2_AGENT *agent, struct libssh2_agent_publickey *oprev) { struct agent_publickey *node; - if (oprev && oprev->node) { + if(oprev && oprev->node) { /* we have a starting point */ struct agent_publickey *prev = oprev->node; @@ -740,7 +748,7 @@ libssh2_agent_get_identity(LIBSSH2_AGENT *agent, else node = _libssh2_list_first(&agent->head); - if (!node) + if(!node) /* no (more) node */ return 1; @@ -764,7 +772,7 @@ libssh2_agent_userauth(LIBSSH2_AGENT *agent, void *abstract = agent; int rc; - if (agent->session->userauth_pblc_state == libssh2_NB_state_idle) { + if(agent->session->userauth_pblc_state == libssh2_NB_state_idle) { memset(&agent->transctx, 0, sizeof agent->transctx); agent->identity = identity->node; } @@ -789,7 +797,7 @@ libssh2_agent_userauth(LIBSSH2_AGENT *agent, LIBSSH2_API int libssh2_agent_disconnect(LIBSSH2_AGENT *agent) { - if (agent->ops && agent->fd != LIBSSH2_INVALID_SOCKET) + if(agent->ops && agent->fd != LIBSSH2_INVALID_SOCKET) return agent->ops->disconnect(agent); return 0; } @@ -801,11 +809,52 @@ libssh2_agent_disconnect(LIBSSH2_AGENT *agent) * collection of public keys. */ LIBSSH2_API void -libssh2_agent_free(LIBSSH2_AGENT *agent) { +libssh2_agent_free(LIBSSH2_AGENT *agent) +{ /* Allow connection freeing when the socket has lost its connection */ - if (agent->fd != LIBSSH2_INVALID_SOCKET) { + if(agent->fd != LIBSSH2_INVALID_SOCKET) { libssh2_agent_disconnect(agent); } + + if(agent->identity_agent_path != NULL) + LIBSSH2_FREE(agent->session, agent->identity_agent_path); + agent_free_identities(agent); LIBSSH2_FREE(agent->session, agent); } + +/* + * libssh2_agent_set_identity_path() + * + * Allows a custom agent socket path beyond SSH_AUTH_SOCK env + * + */ +LIBSSH2_API void +libssh2_agent_set_identity_path(LIBSSH2_AGENT *agent, const char *path) +{ + if(agent->identity_agent_path) { + LIBSSH2_FREE(agent->session, agent->identity_agent_path); + agent->identity_agent_path = NULL; + } + + if(path) { + size_t path_len = strlen(path); + if(path_len < SIZE_MAX - 1) { + char *path_buf = LIBSSH2_ALLOC(agent->session, path_len + 1); + memcpy(path_buf, path, path_len); + path_buf[path_len] = '\0'; + agent->identity_agent_path = path_buf; + } + } +} + +/* + * libssh2_agent_get_identity_path() + * + * Returns the custom agent socket path if set + * + */ +LIBSSH2_API const char *libssh2_agent_get_identity_path(LIBSSH2_AGENT *agent) +{ + return agent->identity_agent_path; +} diff --git a/vendor/libssh2/src/bcrypt_pbkdf.c b/vendor/libssh2/src/bcrypt_pbkdf.c new file mode 100644 index 000000000..e92969a00 --- /dev/null +++ b/vendor/libssh2/src/bcrypt_pbkdf.c @@ -0,0 +1,180 @@ +/* $OpenBSD: bcrypt_pbkdf.c,v 1.4 2013/07/29 00:55:53 tedu Exp $ */ +/* + * Copyright (c) 2013 Ted Unangst + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +#ifndef HAVE_BCRYPT_PBKDF + +#include "libssh2_priv.h" +#include +#include +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#include "blf.h" + +#define MINIMUM(a,b) (((a) < (b)) ? (a) : (b)) + +/* + * pkcs #5 pbkdf2 implementation using the "bcrypt" hash + * + * The bcrypt hash function is derived from the bcrypt password hashing + * function with the following modifications: + * 1. The input password and salt are preprocessed with SHA512. + * 2. The output length is expanded to 256 bits. + * 3. Subsequently the magic string to be encrypted is lengthened and modifed + * to "OxychromaticBlowfishSwatDynamite" + * 4. The hash function is defined to perform 64 rounds of initial state + * expansion. (More rounds are performed by iterating the hash.) + * + * Note that this implementation pulls the SHA512 operations into the caller + * as a performance optimization. + * + * One modification from official pbkdf2. Instead of outputting key material + * linearly, we mix it. pbkdf2 has a known weakness where if one uses it to + * generate (i.e.) 512 bits of key material for use as two 256 bit keys, an + * attacker can merely run once through the outer loop below, but the user + * always runs it twice. Shuffling output bytes requires computing the + * entirety of the key material to assemble any subkey. This is something a + * wise caller could do; we just do it for you. + */ + +#define BCRYPT_BLOCKS 8 +#define BCRYPT_HASHSIZE (BCRYPT_BLOCKS * 4) + +static void +bcrypt_hash(uint8_t *sha2pass, uint8_t *sha2salt, uint8_t *out) +{ + blf_ctx state; + uint8_t ciphertext[BCRYPT_HASHSIZE] = + "OxychromaticBlowfishSwatDynamite"; + uint32_t cdata[BCRYPT_BLOCKS]; + int i; + uint16_t j; + size_t shalen = SHA512_DIGEST_LENGTH; + + /* key expansion */ + Blowfish_initstate(&state); + Blowfish_expandstate(&state, sha2salt, shalen, sha2pass, shalen); + for(i = 0; i < 64; i++) { + Blowfish_expand0state(&state, sha2salt, shalen); + Blowfish_expand0state(&state, sha2pass, shalen); + } + + /* encryption */ + j = 0; + for(i = 0; i < BCRYPT_BLOCKS; i++) + cdata[i] = Blowfish_stream2word(ciphertext, sizeof(ciphertext), + &j); + for(i = 0; i < 64; i++) + blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t)); + + /* copy out */ + for(i = 0; i < BCRYPT_BLOCKS; i++) { + out[4 * i + 3] = (cdata[i] >> 24) & 0xff; + out[4 * i + 2] = (cdata[i] >> 16) & 0xff; + out[4 * i + 1] = (cdata[i] >> 8) & 0xff; + out[4 * i + 0] = cdata[i] & 0xff; + } + + /* zap */ + _libssh2_explicit_zero(ciphertext, sizeof(ciphertext)); + _libssh2_explicit_zero(cdata, sizeof(cdata)); + _libssh2_explicit_zero(&state, sizeof(state)); +} + +int +bcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt, + size_t saltlen, + uint8_t *key, size_t keylen, unsigned int rounds) +{ + uint8_t sha2pass[SHA512_DIGEST_LENGTH]; + uint8_t sha2salt[SHA512_DIGEST_LENGTH]; + uint8_t out[BCRYPT_HASHSIZE]; + uint8_t tmpout[BCRYPT_HASHSIZE]; + uint8_t *countsalt; + size_t i, j, amt, stride; + uint32_t count; + size_t origkeylen = keylen; + libssh2_sha512_ctx ctx; + + /* nothing crazy */ + if(rounds < 1) + return -1; + if(passlen == 0 || saltlen == 0 || keylen == 0 || + keylen > sizeof(out) * sizeof(out) || saltlen > 1<<20) + return -1; + countsalt = calloc(1, saltlen + 4); + if(countsalt == NULL) + return -1; + stride = (keylen + sizeof(out) - 1) / sizeof(out); + amt = (keylen + stride - 1) / stride; + + memcpy(countsalt, salt, saltlen); + + /* collapse password */ + libssh2_sha512_init(&ctx); + libssh2_sha512_update(ctx, pass, passlen); + libssh2_sha512_final(ctx, sha2pass); + + /* generate key, sizeof(out) at a time */ + for(count = 1; keylen > 0; count++) { + countsalt[saltlen + 0] = (count >> 24) & 0xff; + countsalt[saltlen + 1] = (count >> 16) & 0xff; + countsalt[saltlen + 2] = (count >> 8) & 0xff; + countsalt[saltlen + 3] = count & 0xff; + + /* first round, salt is salt */ + libssh2_sha512_init(&ctx); + libssh2_sha512_update(ctx, countsalt, saltlen + 4); + libssh2_sha512_final(ctx, sha2salt); + + bcrypt_hash(sha2pass, sha2salt, tmpout); + memcpy(out, tmpout, sizeof(out)); + + for(i = 1; i < rounds; i++) { + /* subsequent rounds, salt is previous output */ + libssh2_sha512_init(&ctx); + libssh2_sha512_update(ctx, tmpout, sizeof(tmpout)); + libssh2_sha512_final(ctx, sha2salt); + + bcrypt_hash(sha2pass, sha2salt, tmpout); + for(j = 0; j < sizeof(out); j++) + out[j] ^= tmpout[j]; + } + + /* + * pbkdf2 deviation: ouput the key material non-linearly. + */ + amt = MINIMUM(amt, keylen); + for(i = 0; i < amt; i++) { + size_t dest = i * stride + (count - 1); + if(dest >= origkeylen) { + break; + } + key[dest] = out[i]; + } + keylen -= i; + } + + /* zap */ + _libssh2_explicit_zero(out, sizeof(out)); + free(countsalt); + + return 0; +} +#endif /* HAVE_BCRYPT_PBKDF */ diff --git a/vendor/libssh2/src/blf.h b/vendor/libssh2/src/blf.h new file mode 100644 index 000000000..1a85e6eef --- /dev/null +++ b/vendor/libssh2/src/blf.h @@ -0,0 +1,90 @@ +/* $OpenBSD: blf.h,v 1.7 2007/03/14 17:59:41 grunk Exp $ */ +/* + * Blowfish - a fast block cipher designed by Bruce Schneier + * + * Copyright 1997 Niels Provos + * All rights reserved. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niels Provos. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 _BLF_H_ +#define _BLF_H_ + +#if !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) + +/* Schneier specifies a maximum key length of 56 bytes. + * This ensures that every key bit affects every cipher + * bit. However, the subkeys can hold up to 72 bytes. + * Warning: For normal blowfish encryption only 56 bytes + * of the key affect all cipherbits. + */ + +#define BLF_N 16 /* Number of Subkeys */ +#define BLF_MAXKEYLEN ((BLF_N-2)*4) /* 448 bits */ +#define BLF_MAXUTILIZED ((BLF_N + 2)*4) /* 576 bits */ + +/* Blowfish context */ +typedef struct BlowfishContext { + uint32_t S[4][256]; /* S-Boxes */ + uint32_t P[BLF_N + 2]; /* Subkeys */ +} blf_ctx; + +/* Raw access to customized Blowfish + * blf_key is just: + * Blowfish_initstate( state ) + * Blowfish_expand0state( state, key, keylen ) + */ + +void Blowfish_encipher(blf_ctx *, uint32_t *, uint32_t *); +void Blowfish_decipher(blf_ctx *, uint32_t *, uint32_t *); +void Blowfish_initstate(blf_ctx *); +void Blowfish_expand0state(blf_ctx *, const uint8_t *, uint16_t); +void Blowfish_expandstate +(blf_ctx *, const uint8_t *, uint16_t, const uint8_t *, uint16_t); + +/* Standard Blowfish */ + +void blf_key(blf_ctx *, const uint8_t *, uint16_t); +void blf_enc(blf_ctx *, uint32_t *, uint16_t); +void blf_dec(blf_ctx *, uint32_t *, uint16_t); + +void blf_ecb_encrypt(blf_ctx *, uint8_t *, uint32_t); +void blf_ecb_decrypt(blf_ctx *, uint8_t *, uint32_t); + +void blf_cbc_encrypt(blf_ctx *, uint8_t *, uint8_t *, uint32_t); +void blf_cbc_decrypt(blf_ctx *, uint8_t *, uint8_t *, uint32_t); + +/* Converts uint8_t to uint32_t */ +uint32_t Blowfish_stream2word(const uint8_t *, uint16_t, uint16_t *); + +/* bcrypt with pbkd */ +int bcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt, + size_t saltlen, + uint8_t *key, size_t keylen, unsigned int rounds); + +#endif /* !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) */ +#endif /* _BLF_H */ diff --git a/vendor/libssh2/src/blowfish.c b/vendor/libssh2/src/blowfish.c new file mode 100644 index 000000000..4aefc66ac --- /dev/null +++ b/vendor/libssh2/src/blowfish.c @@ -0,0 +1,697 @@ +/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */ +/* + * Blowfish block cipher for OpenBSD + * Copyright 1997 Niels Provos + * All rights reserved. + * + * Implementation advice by David Mazieres . + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niels Provos. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ + +/* + * This code is derived from section 14.3 and the given source + * in section V of Applied Cryptography, second edition. + * Blowfish is an unpatented fast block cipher designed by + * Bruce Schneier. + */ + + +#if !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \ + !defined(HAVE_BLOWFISH_EXPAND0STATE) || \ + !defined(HAVE_BLF_ENC)) + +#if 0 +#include /* used for debugging */ +#include +#endif + +#include + +#include "libssh2.h" +#include "blf.h" + +#undef inline +#ifdef __GNUC__ +#define inline __inline +#else /* !__GNUC__ */ +#define inline +#endif /* !__GNUC__ */ + +/* Function for Feistel Networks */ + +#define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \ + + (s)[0x100 + (((x)>>16)&0xFF)]) \ + ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \ + + (s)[0x300 + ( (x) &0xFF)]) + +#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n]) + +void +Blowfish_encipher(blf_ctx *c, uint32_t *xl, uint32_t *xr) +{ + uint32_t Xl; + uint32_t Xr; + uint32_t *s = c->S[0]; + uint32_t *p = c->P; + + Xl = *xl; + Xr = *xr; + + Xl ^= p[0]; + BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2); + BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4); + BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6); + BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8); + BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10); + BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12); + BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14); + BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16); + + *xl = Xr ^ p[17]; + *xr = Xl; +} + +void +Blowfish_decipher(blf_ctx *c, uint32_t *xl, uint32_t *xr) +{ + uint32_t Xl; + uint32_t Xr; + uint32_t *s = c->S[0]; + uint32_t *p = c->P; + + Xl = *xl; + Xr = *xr; + + Xl ^= p[17]; + BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15); + BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13); + BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11); + BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9); + BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7); + BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5); + BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3); + BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1); + + *xl = Xr ^ p[0]; + *xr = Xl; +} + +void +Blowfish_initstate(blf_ctx *c) +{ + /* P-box and S-box tables initialized with digits of Pi */ + + static const blf_ctx initstate = + { { + { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a}, + { + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7}, + { + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0}, + { + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6} + }, + { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + } }; + + *c = initstate; +} + +uint32_t +Blowfish_stream2word(const uint8_t *data, uint16_t databytes, + uint16_t *current) +{ + uint8_t i; + uint16_t j; + uint32_t temp; + + temp = 0x00000000; + j = *current; + + for(i = 0; i < 4; i++, j++) { + if(j >= databytes) + j = 0; + temp = (temp << 8) | data[j]; + } + + *current = j; + return temp; +} + +void +Blowfish_expand0state(blf_ctx *c, const uint8_t *key, uint16_t keybytes) +{ + uint16_t i; + uint16_t j; + uint16_t k; + uint32_t temp; + uint32_t datal; + uint32_t datar; + + j = 0; + for(i = 0; i < BLF_N + 2; i++) { + /* Extract 4 int8 to 1 int32 from keystream */ + temp = Blowfish_stream2word(key, keybytes, &j); + c->P[i] = c->P[i] ^ temp; + } + + j = 0; + datal = 0x00000000; + datar = 0x00000000; + for(i = 0; i < BLF_N + 2; i += 2) { + Blowfish_encipher(c, &datal, &datar); + + c->P[i] = datal; + c->P[i + 1] = datar; + } + + for(i = 0; i < 4; i++) { + for(k = 0; k < 256; k += 2) { + Blowfish_encipher(c, &datal, &datar); + + c->S[i][k] = datal; + c->S[i][k + 1] = datar; + } + } +} + + +void +Blowfish_expandstate(blf_ctx *c, const uint8_t *data, uint16_t databytes, + const uint8_t *key, uint16_t keybytes) +{ + uint16_t i; + uint16_t j; + uint16_t k; + uint32_t temp; + uint32_t datal; + uint32_t datar; + + j = 0; + for(i = 0; i < BLF_N + 2; i++) { + /* Extract 4 int8 to 1 int32 from keystream */ + temp = Blowfish_stream2word(key, keybytes, &j); + c->P[i] = c->P[i] ^ temp; + } + + j = 0; + datal = 0x00000000; + datar = 0x00000000; + for(i = 0; i < BLF_N + 2; i += 2) { + datal ^= Blowfish_stream2word(data, databytes, &j); + datar ^= Blowfish_stream2word(data, databytes, &j); + Blowfish_encipher(c, &datal, &datar); + + c->P[i] = datal; + c->P[i + 1] = datar; + } + + for(i = 0; i < 4; i++) { + for(k = 0; k < 256; k += 2) { + datal ^= Blowfish_stream2word(data, databytes, &j); + datar ^= Blowfish_stream2word(data, databytes, &j); + Blowfish_encipher(c, &datal, &datar); + + c->S[i][k] = datal; + c->S[i][k + 1] = datar; + } + } + +} + +void +blf_key(blf_ctx *c, const uint8_t *k, uint16_t len) +{ + /* Initialize S-boxes and subkeys with Pi */ + Blowfish_initstate(c); + + /* Transform S-boxes and subkeys with key */ + Blowfish_expand0state(c, k, len); +} + +void +blf_enc(blf_ctx *c, uint32_t *data, uint16_t blocks) +{ + uint32_t *d; + uint16_t i; + + d = data; + for(i = 0; i < blocks; i++) { + Blowfish_encipher(c, d, d + 1); + d += 2; + } +} + +void +blf_dec(blf_ctx *c, uint32_t *data, uint16_t blocks) +{ + uint32_t *d; + uint16_t i; + + d = data; + for(i = 0; i < blocks; i++) { + Blowfish_decipher(c, d, d + 1); + d += 2; + } +} + +void +blf_ecb_encrypt(blf_ctx *c, uint8_t *data, uint32_t len) +{ + uint32_t l, r; + uint32_t i; + + for(i = 0; i < len; i += 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_encipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + data += 8; + } +} + +void +blf_ecb_decrypt(blf_ctx *c, uint8_t *data, uint32_t len) +{ + uint32_t l, r; + uint32_t i; + + for(i = 0; i < len; i += 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + data += 8; + } +} + +void +blf_cbc_encrypt(blf_ctx *c, uint8_t *iv, uint8_t *data, uint32_t len) +{ + uint32_t l, r; + uint32_t i, j; + + for(i = 0; i < len; i += 8) { + for(j = 0; j < 8; j++) + data[j] ^= iv[j]; + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_encipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + iv = data; + data += 8; + } +} + +void +blf_cbc_decrypt(blf_ctx *c, uint8_t *iva, uint8_t *data, uint32_t len) +{ + uint32_t l, r; + uint8_t *iv; + uint32_t i, j; + + iv = data + len - 16; + data = data + len - 8; + for(i = len - 8; i >= 8; i -= 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + for(j = 0; j < 8; j++) + data[j] ^= iv[j]; + iv -= 8; + data -= 8; + } + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + for(j = 0; j < 8; j++) + data[j] ^= iva[j]; +} + +#if 0 +void +report(uint32_t data[], uint16_t len) +{ + uint16_t i; + for(i = 0; i < len; i += 2) + printf("Block %0hd: %08lx %08lx.\n", + i / 2, data[i], data[i + 1]); +} +void +main(void) +{ + + blf_ctx c; + char key[] = "AAAAA"; + char key2[] = "abcdefghijklmnopqrstuvwxyz"; + + uint32_t data[10]; + uint32_t data2[] = + {0x424c4f57l, 0x46495348l}; + + uint16_t i; + + /* First test */ + for(i = 0; i < 10; i++) + data[i] = i; + + blf_key(&c, (uint8_t *) key, 5); + blf_enc(&c, data, 5); + blf_dec(&c, data, 1); + blf_dec(&c, data + 2, 4); + printf("Should read as 0 - 9.\n"); + report(data, 10); + + /* Second test */ + blf_key(&c, (uint8_t *) key2, strlen(key2)); + blf_enc(&c, data2, 1); + printf("\nShould read as: 0x324ed0fe 0xf413a203.\n"); + report(data2, 2); + blf_dec(&c, data2, 1); + report(data2, 2); +} +#endif + +#endif /* !defined(HAVE_BCRYPT_PBKDF) && \ + (!defined(HAVE_BLOWFISH_INITSTATE) || \ + !defined(HAVE_BLOWFISH_EXPAND0STATE) || \ + '!defined(HAVE_BLF_ENC)) */ diff --git a/vendor/libssh2/src/channel.c b/vendor/libssh2/src/channel.c index 39ff05bf1..7bbeeb88f 100644 --- a/vendor/libssh2/src/channel.c +++ b/vendor/libssh2/src/channel.c @@ -1,6 +1,6 @@ /* Copyright (c) 2004-2007 Sara Golemon * Copyright (c) 2005 Mikhail Gusarov - * Copyright (c) 2008-2014 by Daniel Stenberg + * Copyright (c) 2008-2019 by Daniel Stenberg * * All rights reserved. * @@ -66,8 +66,8 @@ _libssh2_channel_nextid(LIBSSH2_SESSION * session) channel = _libssh2_list_first(&session->channels); - while (channel) { - if (channel->local.id > id) { + while(channel) { + if(channel->local.id > id) { id = channel->local.id; } channel = _libssh2_list_next(&channel->node); @@ -100,7 +100,7 @@ _libssh2_channel_locate(LIBSSH2_SESSION *session, uint32_t channel_id) for(channel = _libssh2_list_first(&session->channels); channel; channel = _libssh2_list_next(&channel->node)) { - if (channel->local.id == channel_id) + if(channel->local.id == channel_id) return channel; } @@ -112,7 +112,7 @@ _libssh2_channel_locate(LIBSSH2_SESSION *session, uint32_t channel_id) for(channel = _libssh2_list_first(&l->queue); channel; channel = _libssh2_list_next(&channel->node)) { - if (channel->local.id == channel_id) + if(channel->local.id == channel_id) return channel; } } @@ -141,7 +141,7 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, unsigned char *s; int rc; - if (session->open_state == libssh2_NB_state_idle) { + if(session->open_state == libssh2_NB_state_idle) { session->open_channel = NULL; session->open_packet = NULL; session->open_data = NULL; @@ -159,7 +159,7 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, packet_size); session->open_channel = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL)); - if (!session->open_channel) { + if(!session->open_channel) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate space for channel data"); return NULL; @@ -167,7 +167,7 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, session->open_channel->channel_type_len = channel_type_len; session->open_channel->channel_type = LIBSSH2_ALLOC(session, channel_type_len); - if (!session->open_channel->channel_type) { + if(!session->open_channel->channel_type) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Failed allocating memory for channel type name"); LIBSSH2_FREE(session, session->open_channel); @@ -189,7 +189,7 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, s = session->open_packet = LIBSSH2_ALLOC(session, session->open_packet_len); - if (!session->open_packet) { + if(!session->open_packet) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate temporary space for packet"); goto channel_error; @@ -205,17 +205,17 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, session->open_state = libssh2_NB_state_created; } - if (session->open_state == libssh2_NB_state_created) { + if(session->open_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, session->open_packet, session->open_packet_len, message, message_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending channel-open request"); return NULL; } - else if (rc) { + else if(rc) { _libssh2_error(session, rc, "Unable to send channel-open request"); goto channel_error; @@ -224,17 +224,18 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, session->open_state = libssh2_NB_state_sent; } - if (session->open_state == libssh2_NB_state_sent) { + if(session->open_state == libssh2_NB_state_sent) { rc = _libssh2_packet_requirev(session, reply_codes, &session->open_data, &session->open_data_len, 1, session->open_packet + 5 + channel_type_len, 4, &session->open_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); return NULL; - } else if (rc) { + } + else if(rc) { goto channel_error; } @@ -244,9 +245,9 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, goto channel_error; } - if (session->open_data[0] == SSH_MSG_CHANNEL_OPEN_CONFIRMATION) { - - if(session->open_data_len < 17) { + if(session->open_data[0] == SSH_MSG_CHANNEL_OPEN_CONFIRMATION) { + + if(session->open_data_len < 17) { _libssh2_error(session, LIBSSH2_ERROR_PROTO, "Unexpected packet size"); goto channel_error; @@ -278,12 +279,14 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, return session->open_channel; } - if (session->open_data[0] == SSH_MSG_CHANNEL_OPEN_FAILURE) { - unsigned int reason_code = _libssh2_ntohu32(session->open_data + 5); - switch (reason_code) { + if(session->open_data[0] == SSH_MSG_CHANNEL_OPEN_FAILURE) { + unsigned int reason_code = + _libssh2_ntohu32(session->open_data + 5); + switch(reason_code) { case SSH_OPEN_ADMINISTRATIVELY_PROHIBITED: _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE, - "Channel open failure (administratively prohibited)"); + "Channel open failure " + "(administratively prohibited)"); break; case SSH_OPEN_CONNECT_FAILED: _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE, @@ -306,15 +309,15 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, channel_error: - if (session->open_data) { + if(session->open_data) { LIBSSH2_FREE(session, session->open_data); session->open_data = NULL; } - if (session->open_packet) { + if(session->open_packet) { LIBSSH2_FREE(session, session->open_packet); session->open_packet = NULL; } - if (session->open_channel) { + if(session->open_channel) { unsigned char channel_id[4]; LIBSSH2_FREE(session, session->open_channel->channel_type); @@ -322,7 +325,7 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, /* Clear out packets meant for this channel */ _libssh2_htonu32(channel_id, session->open_channel->local.id); - while ((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA, + while((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA, &session->open_data, &session->open_data_len, 1, channel_id, 4) >= 0) @@ -379,7 +382,7 @@ channel_direct_tcpip(LIBSSH2_SESSION * session, const char *host, LIBSSH2_CHANNEL *channel; unsigned char *s; - if (session->direct_state == libssh2_NB_state_idle) { + if(session->direct_state == libssh2_NB_state_idle) { session->direct_host_len = strlen(host); session->direct_shost_len = strlen(shost); /* host_len(4) + port(4) + shost_len(4) + sport(4) */ @@ -387,14 +390,15 @@ channel_direct_tcpip(LIBSSH2_SESSION * session, const char *host, session->direct_host_len + session->direct_shost_len + 16; _libssh2_debug(session, LIBSSH2_TRACE_CONN, - "Requesting direct-tcpip session to from %s:%d to %s:%d", + "Requesting direct-tcpip session from %s:%d to %s:%d", shost, sport, host, port); s = session->direct_message = LIBSSH2_ALLOC(session, session->direct_message_len); - if (!session->direct_message) { + if(!session->direct_message) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for direct-tcpip connection"); + "Unable to allocate memory for " + "direct-tcpip connection"); return NULL; } _libssh2_store_str(&s, host, session->direct_host_len); @@ -411,7 +415,7 @@ channel_direct_tcpip(LIBSSH2_SESSION * session, const char *host, session->direct_message, session->direct_message_len); - if (!channel && + if(!channel && libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) { /* The error code is still set to LIBSSH2_ERROR_EAGAIN, set our state to created to avoid re-creating the package on next invoke */ @@ -442,7 +446,8 @@ libssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host, return NULL; BLOCK_ADJUST_ERRNO(ptr, session, - channel_direct_tcpip(session, host, port, shost, sport)); + channel_direct_tcpip(session, host, port, + shost, sport)); return ptr; } @@ -463,7 +468,7 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, if(!host) host = "0.0.0.0"; - if (session->fwdLstn_state == libssh2_NB_state_idle) { + if(session->fwdLstn_state == libssh2_NB_state_idle) { session->fwdLstn_host_len = strlen(host); /* 14 = packet_type(1) + request_len(4) + want_replay(1) + host_len(4) + port(4) */ @@ -480,7 +485,7 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, s = session->fwdLstn_packet = LIBSSH2_ALLOC(session, session->fwdLstn_packet_len); - if (!session->fwdLstn_packet) { + if(!session->fwdLstn_packet) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for setenv packet"); return NULL; @@ -496,18 +501,18 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, session->fwdLstn_state = libssh2_NB_state_created; } - if (session->fwdLstn_state == libssh2_NB_state_created) { + if(session->fwdLstn_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, session->fwdLstn_packet, session->fwdLstn_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block sending global-request packet for " "forward listen request"); return NULL; } - else if (rc) { + else if(rc) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send global-request packet for forward " "listen request"); @@ -522,34 +527,36 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, session->fwdLstn_state = libssh2_NB_state_sent; } - if (session->fwdLstn_state == libssh2_NB_state_sent) { + if(session->fwdLstn_state == libssh2_NB_state_sent) { unsigned char *data; size_t data_len; rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len, 0, NULL, 0, &session->fwdLstn_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); return NULL; - } else if (rc || data_len < 1) { + } + else if(rc || (data_len < 1)) { _libssh2_error(session, LIBSSH2_ERROR_PROTO, "Unknown"); session->fwdLstn_state = libssh2_NB_state_idle; return NULL; } - if (data[0] == SSH_MSG_REQUEST_SUCCESS) { + if(data[0] == SSH_MSG_REQUEST_SUCCESS) { LIBSSH2_LISTENER *listener; listener = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_LISTENER)); - if (!listener) + if(!listener) _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for listener queue"); else { listener->host = LIBSSH2_ALLOC(session, session->fwdLstn_host_len + 1); - if (!listener->host) { + if(!listener->host) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for listener queue"); + "Unable to allocate memory " + "for listener queue"); LIBSSH2_FREE(session, listener); listener = NULL; } @@ -557,10 +564,11 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, listener->session = session; memcpy(listener->host, host, session->fwdLstn_host_len); listener->host[session->fwdLstn_host_len] = 0; - if (data_len >= 5 && !port) { + if(data_len >= 5 && !port) { listener->port = _libssh2_ntohu32(data + 1); _libssh2_debug(session, LIBSSH2_TRACE_CONN, - "Dynamic tcpip-forward port allocated: %d", + "Dynamic tcpip-forward port " + "allocated: %d", listener->port); } else @@ -572,7 +580,7 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, /* append this to the parent's list of listeners */ _libssh2_list_add(&session->listeners, &listener->node); - if (bound_port) { + if(bound_port) { *bound_port = listener->port; } } @@ -582,7 +590,7 @@ channel_forward_listen(LIBSSH2_SESSION * session, const char *host, session->fwdLstn_state = libssh2_NB_state_idle; return listener; } - else if (data[0] == SSH_MSG_REQUEST_FAILURE) { + else if(data[0] == SSH_MSG_REQUEST_FAILURE) { LIBSSH2_FREE(session, data); _libssh2_error(session, LIBSSH2_ERROR_REQUEST_DENIED, "Unable to complete request for forward-listen"); @@ -637,13 +645,13 @@ int _libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener) int rc; int retcode = 0; - if (listener->chanFwdCncl_state == libssh2_NB_state_idle) { + if(listener->chanFwdCncl_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Cancelling tcpip-forward session for %s:%d", listener->host, listener->port); s = packet = LIBSSH2_ALLOC(session, packet_len); - if (!packet) { + if(!packet) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for setenv packet"); return LIBSSH2_ERROR_ALLOC; @@ -658,19 +666,20 @@ int _libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener) _libssh2_store_u32(&s, listener->port); listener->chanFwdCncl_state = libssh2_NB_state_created; - } else { + } + else { packet = listener->chanFwdCncl_data; } - if (listener->chanFwdCncl_state == libssh2_NB_state_created) { + if(listener->chanFwdCncl_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, packet, packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending forward request"); listener->chanFwdCncl_data = packet; return rc; } - else if (rc) { + else if(rc) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send global-request packet for forward " "listen request"); @@ -686,11 +695,11 @@ int _libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener) } queued = _libssh2_list_first(&listener->queue); - while (queued) { + while(queued) { LIBSSH2_CHANNEL *next = _libssh2_list_next(&queued->node); rc = _libssh2_channel_free(queued); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } queued = next; @@ -738,9 +747,9 @@ channel_forward_accept(LIBSSH2_LISTENER *listener) do { rc = _libssh2_transport_read(listener->session); - } while (rc > 0); + } while(rc > 0); - if (_libssh2_list_first(&listener->queue)) { + if(_libssh2_list_first(&listener->queue)) { LIBSSH2_CHANNEL *channel = _libssh2_list_first(&listener->queue); /* detach channel from listener's queue */ @@ -754,7 +763,7 @@ channel_forward_accept(LIBSSH2_LISTENER *listener) return channel; } - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(listener->session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for packet"); } @@ -799,7 +808,7 @@ static int channel_setenv(LIBSSH2_CHANNEL *channel, size_t data_len; int rc; - if (channel->setenv_state == libssh2_NB_state_idle) { + if(channel->setenv_state == libssh2_NB_state_idle) { /* 21 = packet_type(1) + channel_id(4) + request_len(4) + * request(3)"env" + want_reply(1) + varname_len(4) + value_len(4) */ channel->setenv_packet_len = varname_len + value_len + 21; @@ -815,7 +824,7 @@ static int channel_setenv(LIBSSH2_CHANNEL *channel, s = channel->setenv_packet = LIBSSH2_ALLOC(session, channel->setenv_packet_len); - if (!channel->setenv_packet) { + if(!channel->setenv_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory " "for setenv packet"); @@ -831,16 +840,17 @@ static int channel_setenv(LIBSSH2_CHANNEL *channel, channel->setenv_state = libssh2_NB_state_created; } - if (channel->setenv_state == libssh2_NB_state_created) { + if(channel->setenv_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, channel->setenv_packet, channel->setenv_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending setenv request"); return rc; - } else if (rc) { + } + else if(rc) { LIBSSH2_FREE(session, channel->setenv_packet); channel->setenv_packet = NULL; channel->setenv_state = libssh2_NB_state_idle; @@ -856,15 +866,15 @@ static int channel_setenv(LIBSSH2_CHANNEL *channel, channel->setenv_state = libssh2_NB_state_sent; } - if (channel->setenv_state == libssh2_NB_state_sent) { + if(channel->setenv_state == libssh2_NB_state_sent) { rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len, 1, channel->setenv_local_channel, 4, &channel-> setenv_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - if (rc) { + if(rc) { channel->setenv_state = libssh2_NB_state_idle; return rc; } @@ -874,7 +884,7 @@ static int channel_setenv(LIBSSH2_CHANNEL *channel, "Unexpected packet size"); } - if (data[0] == SSH_MSG_CHANNEL_SUCCESS) { + if(data[0] == SSH_MSG_CHANNEL_SUCCESS) { LIBSSH2_FREE(session, data); channel->setenv_state = libssh2_NB_state_idle; return 0; @@ -925,7 +935,7 @@ static int channel_request_pty(LIBSSH2_CHANNEL *channel, { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 }; int rc; - if (channel->reqPTY_state == libssh2_NB_state_idle) { + if(channel->reqPTY_state == libssh2_NB_state_idle) { /* 41 = packet_type(1) + channel(4) + pty_req_len(4) + "pty_req"(7) + * want_reply(1) + term_len(4) + width(4) + height(4) + width_px(4) + * height_px(4) + modes_len(4) */ @@ -962,15 +972,16 @@ static int channel_request_pty(LIBSSH2_CHANNEL *channel, channel->reqPTY_state = libssh2_NB_state_created; } - if (channel->reqPTY_state == libssh2_NB_state_created) { + if(channel->reqPTY_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, channel->reqPTY_packet, channel->reqPTY_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending pty request"); return rc; - } else if (rc) { + } + else if(rc) { channel->reqPTY_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Unable to send pty-request packet"); @@ -980,16 +991,17 @@ static int channel_request_pty(LIBSSH2_CHANNEL *channel, channel->reqPTY_state = libssh2_NB_state_sent; } - if (channel->reqPTY_state == libssh2_NB_state_sent) { + if(channel->reqPTY_state == libssh2_NB_state_sent) { unsigned char *data; size_t data_len; unsigned char code; rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len, 1, channel->reqPTY_local_channel, 4, &channel->reqPTY_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc || data_len < 1) { + } + else if(rc || data_len < 1) { channel->reqPTY_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_PROTO, "Failed to require the PTY package"); @@ -1000,12 +1012,13 @@ static int channel_request_pty(LIBSSH2_CHANNEL *channel, LIBSSH2_FREE(session, data); channel->reqPTY_state = libssh2_NB_state_idle; - if (code == SSH_MSG_CHANNEL_SUCCESS) + if(code == SSH_MSG_CHANNEL_SUCCESS) return 0; } return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED, - "Unable to complete request for channel request-pty"); + "Unable to complete request for " + "channel request-pty"); } /* @@ -1039,7 +1052,7 @@ channel_request_pty_size(LIBSSH2_CHANNEL * channel, int width, int rc; int retcode = LIBSSH2_ERROR_PROTO; - if (channel->reqPTY_state == libssh2_NB_state_idle) { + if(channel->reqPTY_state == libssh2_NB_state_idle) { channel->reqPTY_packet_len = 39; /* Zero the whole thing out */ @@ -1066,15 +1079,16 @@ channel_request_pty_size(LIBSSH2_CHANNEL * channel, int width, channel->reqPTY_state = libssh2_NB_state_created; } - if (channel->reqPTY_state == libssh2_NB_state_created) { + if(channel->reqPTY_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, channel->reqPTY_packet, channel->reqPTY_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending window-change request"); return rc; - } else if (rc) { + } + else if(rc) { channel->reqPTY_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Unable to send window-change packet"); @@ -1124,7 +1138,7 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, auth_cookie ? strlen(auth_cookie) : LIBSSH2_X11_RANDOM_COOKIE_LEN; int rc; - if (channel->reqX11_state == libssh2_NB_state_idle) { + if(channel->reqX11_state == libssh2_NB_state_idle) { /* 30 = packet_type(1) + channel(4) + x11_req_len(4) + "x11-req"(7) + * want_reply(1) + single_cnx(1) + proto_len(4) + cookie_len(4) + * screen_num(4) */ @@ -1144,7 +1158,7 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, s = channel->reqX11_packet = LIBSSH2_ALLOC(session, channel->reqX11_packet_len); - if (!channel->reqX11_packet) { + if(!channel->reqX11_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for pty-request"); } @@ -1156,23 +1170,24 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, *(s++) = 0x01; /* want_reply */ *(s++) = single_connection ? 0x01 : 0x00; - _libssh2_store_str(&s, auth_proto?auth_proto:"MIT-MAGIC-COOKIE-1", + _libssh2_store_str(&s, auth_proto ? auth_proto : "MIT-MAGIC-COOKIE-1", proto_len); _libssh2_store_u32(&s, cookie_len); - if (auth_cookie) { + if(auth_cookie) { memcpy(s, auth_cookie, cookie_len); - } else { + } + else { int i; /* note: the extra +1 below is necessary since the sprintf() loop will always write 3 bytes so the last one will write the trailing zero at the LIBSSH2_X11_RANDOM_COOKIE_LEN/2 border */ - unsigned char buffer[(LIBSSH2_X11_RANDOM_COOKIE_LEN / 2) +1]; + unsigned char buffer[(LIBSSH2_X11_RANDOM_COOKIE_LEN / 2) + 1]; _libssh2_random(buffer, LIBSSH2_X11_RANDOM_COOKIE_LEN / 2); for(i = 0; i < (LIBSSH2_X11_RANDOM_COOKIE_LEN / 2); i++) { - sprintf((char *)&s[i*2], "%02X", buffer[i]); + snprintf((char *)&s[i*2], 3, "%02X", buffer[i]); } } s += cookie_len; @@ -1181,16 +1196,16 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, channel->reqX11_state = libssh2_NB_state_created; } - if (channel->reqX11_state == libssh2_NB_state_created) { + if(channel->reqX11_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, channel->reqX11_packet, channel->reqX11_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending X11-req packet"); return rc; } - if (rc) { + if(rc) { LIBSSH2_FREE(session, channel->reqX11_packet); channel->reqX11_packet = NULL; channel->reqX11_state = libssh2_NB_state_idle; @@ -1205,7 +1220,7 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, channel->reqX11_state = libssh2_NB_state_sent; } - if (channel->reqX11_state == libssh2_NB_state_sent) { + if(channel->reqX11_state == libssh2_NB_state_sent) { size_t data_len; unsigned char *data; unsigned char code; @@ -1213,9 +1228,10 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len, 1, channel->reqX11_local_channel, 4, &channel->reqX11_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc || data_len < 1) { + } + else if(rc || data_len < 1) { channel->reqX11_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "waiting for x11-req response packet"); @@ -1225,7 +1241,7 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, LIBSSH2_FREE(session, data); channel->reqX11_state = libssh2_NB_state_idle; - if (code == SSH_MSG_CHANNEL_SUCCESS) + if(code == SSH_MSG_CHANNEL_SUCCESS) return 0; } @@ -1270,12 +1286,12 @@ _libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel, { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 }; int rc; - if (channel->process_state == libssh2_NB_state_end) { + if(channel->process_state == libssh2_NB_state_end) { return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE, "Channel can not be reused"); } - if (channel->process_state == libssh2_NB_state_idle) { + if(channel->process_state == libssh2_NB_state_idle) { /* 10 = packet_type(1) + channel(4) + request_len(4) + want_reply(1) */ channel->process_packet_len = request_len + 10; @@ -1283,16 +1299,16 @@ _libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel, memset(&channel->process_packet_requirev_state, 0, sizeof(channel->process_packet_requirev_state)); - if (message) + if(message) channel->process_packet_len += + 4; _libssh2_debug(session, LIBSSH2_TRACE_CONN, "starting request(%s) on channel %lu/%lu, message=%s", request, channel->local.id, channel->remote.id, - message?message:""); + message ? message : ""); s = channel->process_packet = LIBSSH2_ALLOC(session, channel->process_packet_len); - if (!channel->process_packet) + if(!channel->process_packet) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory " "for channel-process request"); @@ -1302,23 +1318,23 @@ _libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel, _libssh2_store_str(&s, request, request_len); *(s++) = 0x01; - if (message) + if(message) _libssh2_store_u32(&s, message_len); channel->process_state = libssh2_NB_state_created; } - if (channel->process_state == libssh2_NB_state_created) { + if(channel->process_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, channel->process_packet, channel->process_packet_len, (unsigned char *)message, message_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending channel request"); return rc; } - else if (rc) { + else if(rc) { LIBSSH2_FREE(session, channel->process_packet); channel->process_packet = NULL; channel->process_state = libssh2_NB_state_end; @@ -1333,16 +1349,17 @@ _libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel, channel->process_state = libssh2_NB_state_sent; } - if (channel->process_state == libssh2_NB_state_sent) { + if(channel->process_state == libssh2_NB_state_sent) { unsigned char *data; size_t data_len; unsigned char code; rc = _libssh2_packet_requirev(session, reply_codes, &data, &data_len, 1, channel->process_local_channel, 4, &channel->process_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc || data_len < 1) { + } + else if(rc || data_len < 1) { channel->process_state = libssh2_NB_state_end; return _libssh2_error(session, rc, "Failed waiting for channel success"); @@ -1352,7 +1369,7 @@ _libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel, LIBSSH2_FREE(session, data); channel->process_state = libssh2_NB_state_end; - if (code == SSH_MSG_CHANNEL_SUCCESS) + if(code == SSH_MSG_CHANNEL_SUCCESS) return 0; } @@ -1405,30 +1422,54 @@ libssh2_channel_set_blocking(LIBSSH2_CHANNEL * channel, int blocking) int _libssh2_channel_flush(LIBSSH2_CHANNEL *channel, int streamid) { - if (channel->flush_state == libssh2_NB_state_idle) { + if(channel->flush_state == libssh2_NB_state_idle) { LIBSSH2_PACKET *packet = _libssh2_list_first(&channel->session->packets); channel->flush_refund_bytes = 0; channel->flush_flush_bytes = 0; - while (packet) { + while(packet) { + unsigned char packet_type; LIBSSH2_PACKET *next = _libssh2_list_next(&packet->node); - unsigned char packet_type = packet->data[0]; - if (((packet_type == SSH_MSG_CHANNEL_DATA) - || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA)) - && (_libssh2_ntohu32(packet->data + 1) == channel->local.id)) { + if(packet->data_len < 1) { + packet = next; + _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR, + "Unexpected packet length"); + continue; + } + + packet_type = packet->data[0]; + + if(((packet_type == SSH_MSG_CHANNEL_DATA) + || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA)) + && ((packet->data_len >= 5) + && (_libssh2_ntohu32(packet->data + 1) + == channel->local.id))) { /* It's our channel at least */ - long packet_stream_id = - (packet_type == SSH_MSG_CHANNEL_DATA) ? 0 : - _libssh2_ntohu32(packet->data + 5); - if ((streamid == LIBSSH2_CHANNEL_FLUSH_ALL) + int packet_stream_id; + + if(packet_type == SSH_MSG_CHANNEL_DATA) { + packet_stream_id = 0; + } + else if(packet->data_len >= 9) { + packet_stream_id = _libssh2_ntohu32(packet->data + 5); + } + else { + channel->flush_state = libssh2_NB_state_idle; + return _libssh2_error(channel->session, + LIBSSH2_ERROR_PROTO, + "Unexpected packet length"); + } + + if((streamid == LIBSSH2_CHANNEL_FLUSH_ALL) || ((packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA) && ((streamid == LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA) || (streamid == packet_stream_id))) || ((packet_type == SSH_MSG_CHANNEL_DATA) && (streamid == 0))) { - int bytes_to_flush = packet->data_len - packet->data_head; + size_t bytes_to_flush = packet->data_len - + packet->data_head; _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN, "Flushing %d bytes of data from stream " @@ -1456,13 +1497,12 @@ _libssh2_channel_flush(LIBSSH2_CHANNEL *channel, int streamid) channel->read_avail -= channel->flush_flush_bytes; channel->remote.window_size -= channel->flush_flush_bytes; - if (channel->flush_refund_bytes) { - int rc; - - rc = _libssh2_channel_receive_window_adjust(channel, - channel->flush_refund_bytes, - 1, NULL); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(channel->flush_refund_bytes) { + int rc = + _libssh2_channel_receive_window_adjust(channel, + channel->flush_refund_bytes, + 1, NULL); + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; } @@ -1528,41 +1568,42 @@ libssh2_channel_get_exit_signal(LIBSSH2_CHANNEL *channel, { size_t namelen = 0; - if (channel) { + if(channel) { LIBSSH2_SESSION *session = channel->session; - if (channel->exit_signal) { + if(channel->exit_signal) { namelen = strlen(channel->exit_signal); - if (exitsignal) { - *exitsignal = LIBSSH2_ALLOC(session, namelen + 1); - if (!*exitsignal) { + if(exitsignal) { + *exitsignal = LIBSSH2_ALLOC(session, namelen + 1); + if(!*exitsignal) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for signal name"); } memcpy(*exitsignal, channel->exit_signal, namelen); (*exitsignal)[namelen] = '\0'; } - if (exitsignal_len) + if(exitsignal_len) *exitsignal_len = namelen; - } else { - if (exitsignal) + } + else { + if(exitsignal) *exitsignal = NULL; - if (exitsignal_len) + if(exitsignal_len) *exitsignal_len = 0; } /* TODO: set error message and language tag */ - if (errmsg) + if(errmsg) *errmsg = NULL; - if (errmsg_len) + if(errmsg_len) *errmsg_len = 0; - if (langtag) + if(langtag) *langtag = NULL; - if (langtag_len) + if(langtag_len) *langtag_len = 0; } @@ -1589,8 +1630,8 @@ _libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel, if(store) *store = channel->remote.window_size; - if (channel->adjust_state == libssh2_NB_state_idle) { - if (!force + if(channel->adjust_state == libssh2_NB_state_idle) { + if(!force && (adjustment + channel->adjust_queue < LIBSSH2_CHANNEL_MINADJUST)) { _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN, @@ -1601,7 +1642,7 @@ _libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel, return 0; } - if (!adjustment && !channel->adjust_queue) { + if(!adjustment && !channel->adjust_queue) { return 0; } @@ -1622,12 +1663,12 @@ _libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL * channel, rc = _libssh2_transport_send(channel->session, channel->adjust_adjust, 9, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(channel->session, rc, "Would block sending window adjust"); return rc; } - else if (rc) { + else if(rc) { channel->adjust_queue = adjustment; return _libssh2_error(channel->session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send transfer-window adjustment " @@ -1672,7 +1713,7 @@ libssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL *channel, /* stupid - but this is how it was made to work before and this is just kept for backwards compatibility */ - return rc?(unsigned long)rc:window; + return rc ? (unsigned long)rc : window; } /* @@ -1706,7 +1747,7 @@ libssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL *channel, int _libssh2_channel_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode) { - if (channel->extData2_state == libssh2_NB_state_idle) { + if(channel->extData2_state == libssh2_NB_state_idle) { _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN, "Setting channel %lu/%lu handle_extended_data" " mode to %d", @@ -1716,8 +1757,8 @@ _libssh2_channel_extended_data(LIBSSH2_CHANNEL *channel, int ignore_mode) channel->extData2_state = libssh2_NB_state_created; } - if (channel->extData2_state == libssh2_NB_state_idle) { - if (ignore_mode == LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE) { + if(channel->extData2_state == libssh2_NB_state_idle) { + if(ignore_mode == LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE) { int rc = _libssh2_channel_flush(channel, LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA); @@ -1784,8 +1825,8 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, { LIBSSH2_SESSION *session = channel->session; int rc; - int bytes_read = 0; - int bytes_want; + size_t bytes_read = 0; + size_t bytes_want; int unlink_packet; LIBSSH2_PACKET *read_packet; LIBSSH2_PACKET *read_next; @@ -1797,11 +1838,13 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, stream_id); /* expand the receiving window first if it has become too narrow */ - if( (channel->read_state == libssh2_NB_state_jump1) || - (channel->remote.window_size < channel->remote.window_size_initial / 4 * 3 + buflen) ) { + if((channel->read_state == libssh2_NB_state_jump1) || + (channel->remote.window_size < + channel->remote.window_size_initial / 4 * 3 + buflen) ) { - uint32_t adjustment = channel->remote.window_size_initial + buflen - channel->remote.window_size; - if (adjustment < LIBSSH2_CHANNEL_MINADJUST) + uint32_t adjustment = channel->remote.window_size_initial + buflen - + channel->remote.window_size; + if(adjustment < LIBSSH2_CHANNEL_MINADJUST) adjustment = LIBSSH2_CHANNEL_MINADJUST; /* the actual window adjusting may not finish so we need to deal with @@ -1809,7 +1852,7 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, channel->read_state = libssh2_NB_state_jump1; rc = _libssh2_channel_receive_window_adjust(channel, adjustment, 0, NULL); - if (rc) + if(rc) return rc; channel->read_state = libssh2_NB_state_idle; @@ -1819,13 +1862,13 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, produces faster transfers. */ do { rc = _libssh2_transport_read(session); - } while (rc > 0); + } while(rc > 0); - if ((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) + if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) return _libssh2_error(session, rc, "transport read"); read_packet = _libssh2_list_first(&session->packets); - while (read_packet && (bytes_read < (int) buflen)) { + while(read_packet && (bytes_read < buflen)) { /* previously this loop condition also checked for !channel->remote.close but we cannot let it do this: @@ -1839,6 +1882,13 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, /* In case packet gets destroyed during this iteration */ read_next = _libssh2_list_next(&readpkt->node); + if(readpkt->data_len < 5) { + read_packet = read_next; + _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR, + "Unexpected packet length"); + continue; + } + channel->read_local_id = _libssh2_ntohu32(readpkt->data + 1); @@ -1849,9 +1899,10 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, * or the standard stream with extended_data_merge * enabled and data was available */ - if ((stream_id + if((stream_id && (readpkt->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA) && (channel->local.id == channel->read_local_id) + && (readpkt->data_len >= 9) && (stream_id == (int) _libssh2_ntohu32(readpkt->data + 5))) || (!stream_id && (readpkt->data[0] == SSH_MSG_CHANNEL_DATA) && (channel->local.id == channel->read_local_id)) @@ -1865,7 +1916,7 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, bytes_want = buflen - bytes_read; unlink_packet = FALSE; - if (bytes_want >= (int) (readpkt->data_len - readpkt->data_head)) { + if(bytes_want >= (readpkt->data_len - readpkt->data_head)) { /* we want more than this node keeps, so adjust the number and delete this node after the copy */ bytes_want = readpkt->data_len - readpkt->data_head; @@ -1887,7 +1938,7 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, bytes_read += bytes_want; /* if drained, remove from list */ - if (unlink_packet) { + if(unlink_packet) { /* detach readpkt from session->packets list */ _libssh2_list_remove(&readpkt->node); @@ -1900,7 +1951,7 @@ ssize_t _libssh2_channel_read(LIBSSH2_CHANNEL *channel, int stream_id, read_packet = read_next; } - if (!bytes_read) { + if(!bytes_read) { /* If the channel is already at EOF or even closed, we need to signal that back. We may have gotten that info while draining the incoming transport layer until EAGAIN so we must not be fooled by that @@ -1968,13 +2019,24 @@ _libssh2_channel_packet_data_len(LIBSSH2_CHANNEL * channel, int stream_id) { LIBSSH2_SESSION *session = channel->session; LIBSSH2_PACKET *read_packet; + LIBSSH2_PACKET *next_packet; uint32_t read_local_id; read_packet = _libssh2_list_first(&session->packets); - if (read_packet == NULL) + if(read_packet == NULL) return 0; - while (read_packet) { + while(read_packet) { + + next_packet = _libssh2_list_next(&read_packet->node); + + if(read_packet->data_len < 5) { + read_packet = next_packet; + _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR, + "Unexpected packet length"); + continue; + } + read_local_id = _libssh2_ntohu32(read_packet->data + 1); /* @@ -1984,9 +2046,10 @@ _libssh2_channel_packet_data_len(LIBSSH2_CHANNEL * channel, int stream_id) * or the standard stream with extended_data_merge * enabled and data was available */ - if ((stream_id + if((stream_id && (read_packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA) && (channel->local.id == read_local_id) + && (read_packet->data_len >= 9) && (stream_id == (int) _libssh2_ntohu32(read_packet->data + 5))) || (!stream_id @@ -1997,11 +2060,11 @@ _libssh2_channel_packet_data_len(LIBSSH2_CHANNEL * channel, int stream_id) && (read_packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA) && (channel->local.id == read_local_id) && (channel->remote.extended_data_ignore_mode - == LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE))) - { + == LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE))) { return (read_packet->data_len - read_packet->data_head); } - read_packet = _libssh2_list_next(&read_packet->node); + + read_packet = next_packet; } return 0; @@ -2035,7 +2098,7 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id, if(buflen > 32700) buflen = 32700; - if (channel->write_state == libssh2_NB_state_idle) { + if(channel->write_state == libssh2_NB_state_idle) { unsigned char *s = channel->write_packet; _libssh2_debug(channel->session, LIBSSH2_TRACE_CONN, @@ -2043,11 +2106,11 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id, (int) buflen, channel->local.id, channel->remote.id, stream_id); - if (channel->local.close) + if(channel->local.close) return _libssh2_error(channel->session, LIBSSH2_ERROR_CHANNEL_CLOSED, "We've already closed this channel"); - else if (channel->local.eof) + else if(channel->local.eof) return _libssh2_error(channel->session, LIBSSH2_ERROR_CHANNEL_EOF_SENT, "EOF has already been received, " @@ -2057,7 +2120,7 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id, * pending window adjust packets */ do rc = _libssh2_transport_read(session); - while (rc > 0); + while(rc > 0); if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) { return _libssh2_error(channel->session, rc, @@ -2073,7 +2136,7 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id, */ session->socket_block_directions = LIBSSH2_SESSION_BLOCK_INBOUND; - return (rc==LIBSSH2_ERROR_EAGAIN?rc:0); + return (rc == LIBSSH2_ERROR_EAGAIN?rc:0); } channel->write_bufwrite = buflen; @@ -2081,12 +2144,12 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id, *(s++) = stream_id ? SSH_MSG_CHANNEL_EXTENDED_DATA : SSH_MSG_CHANNEL_DATA; _libssh2_store_u32(&s, channel->remote.id); - if (stream_id) + if(stream_id) _libssh2_store_u32(&s, stream_id); /* Don't exceed the remote end's limits */ /* REMEMBER local means local as the SOURCE of the data */ - if (channel->write_bufwrite > channel->local.window_size) { + if(channel->write_bufwrite > channel->local.window_size) { _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Splitting write block due to %lu byte " "window_size on %lu/%lu/%d", @@ -2094,7 +2157,7 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id, channel->remote.id, stream_id); channel->write_bufwrite = channel->local.window_size; } - if (channel->write_bufwrite > channel->local.packet_size) { + if(channel->write_bufwrite > channel->local.packet_size) { _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Splitting write block due to %lu byte " "packet_size on %lu/%lu/%d", @@ -2115,15 +2178,15 @@ _libssh2_channel_write(LIBSSH2_CHANNEL *channel, int stream_id, channel->write_state = libssh2_NB_state_created; } - if (channel->write_state == libssh2_NB_state_created) { + if(channel->write_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, channel->write_packet, channel->write_packet_len, buf, channel->write_bufwrite); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return _libssh2_error(session, rc, "Unable to send channel data"); } - else if (rc) { + else if(rc) { channel->write_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Unable to send channel data"); @@ -2182,17 +2245,18 @@ static int channel_send_eof(LIBSSH2_CHANNEL *channel) unsigned char packet[5]; /* packet_type(1) + channelno(4) */ int rc; - _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Sending EOF on channel %lu/%lu", + _libssh2_debug(session, LIBSSH2_TRACE_CONN, + "Sending EOF on channel %lu/%lu", channel->local.id, channel->remote.id); packet[0] = SSH_MSG_CHANNEL_EOF; _libssh2_htonu32(packet + 1, channel->remote.id); rc = _libssh2_transport_send(session, packet, 5, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending EOF"); return rc; } - else if (rc) { + else if(rc) { return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send EOF on channel"); } @@ -2228,6 +2292,7 @@ libssh2_channel_eof(LIBSSH2_CHANNEL * channel) { LIBSSH2_SESSION *session; LIBSSH2_PACKET *packet; + LIBSSH2_PACKET *next_packet; if(!channel) return LIBSSH2_ERROR_BAD_USE; @@ -2235,14 +2300,25 @@ libssh2_channel_eof(LIBSSH2_CHANNEL * channel) session = channel->session; packet = _libssh2_list_first(&session->packets); - while (packet) { - if (((packet->data[0] == SSH_MSG_CHANNEL_DATA) - || (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)) - && (channel->local.id == _libssh2_ntohu32(packet->data + 1))) { + while(packet) { + + next_packet = _libssh2_list_next(&packet->node); + + if(packet->data_len < 1) { + packet = next_packet; + _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR, + "Unexpected packet length"); + continue; + } + + if(((packet->data[0] == SSH_MSG_CHANNEL_DATA) + || (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA)) + && ((packet->data_len >= 5) + && (channel->local.id == _libssh2_ntohu32(packet->data + 1)))) { /* There's data waiting to be read yet, mask the EOF status */ return 0; } - packet = _libssh2_list_next(&packet->node); + packet = next_packet; } return channel->remote.eof; @@ -2258,9 +2334,9 @@ static int channel_wait_eof(LIBSSH2_CHANNEL *channel) LIBSSH2_SESSION *session = channel->session; int rc; - if (channel->wait_eof_state == libssh2_NB_state_idle) { + if(channel->wait_eof_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_CONN, - "Awaiting close of channel %lu/%lu", channel->local.id, + "Awaiting EOF for channel %lu/%lu", channel->local.id, channel->remote.id); channel->wait_eof_state = libssh2_NB_state_created; @@ -2271,19 +2347,26 @@ static int channel_wait_eof(LIBSSH2_CHANNEL *channel) * Either the EOF will be set or network timeout will occur. */ do { - if (channel->remote.eof) { + if(channel->remote.eof) { break; } + + if((channel->remote.window_size == channel->read_avail) && + session->api_block_mode) + return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_WINDOW_FULL, + "Receiving channel window " + "has been exhausted"); + rc = _libssh2_transport_read(session); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc < 0) { + else if(rc < 0) { channel->wait_eof_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "_libssh2_transport_read() bailed out!"); } - } while (1); + } while(1); channel->wait_eof_state = libssh2_NB_state_idle; @@ -2312,16 +2395,17 @@ int _libssh2_channel_close(LIBSSH2_CHANNEL * channel) LIBSSH2_SESSION *session = channel->session; int rc = 0; - if (channel->local.close) { + if(channel->local.close) { /* Already closed, act like we sent another close, * even though we didn't... shhhhhh */ channel->close_state = libssh2_NB_state_idle; return 0; } - if (!channel->local.eof) { - if ((rc = channel_send_eof(channel))) { - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(!channel->local.eof) { + rc = channel_send_eof(channel); + if(rc) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } _libssh2_error(session, rc, @@ -2332,7 +2416,7 @@ int _libssh2_channel_close(LIBSSH2_CHANNEL * channel) /* ignore if we have received a remote eof or not, as it is now too late for us to wait for it. Continue closing! */ - if (channel->close_state == libssh2_NB_state_idle) { + if(channel->close_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Closing channel %lu/%lu", channel->local.id, channel->remote.id); @@ -2342,41 +2426,43 @@ int _libssh2_channel_close(LIBSSH2_CHANNEL * channel) channel->close_state = libssh2_NB_state_created; } - if (channel->close_state == libssh2_NB_state_created) { + if(channel->close_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, channel->close_packet, 5, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, rc, "Would block sending close-channel"); return rc; - } else if (rc) { + } + else if(rc) { _libssh2_error(session, rc, "Unable to send close-channel request, " "but closing anyway"); /* skip waiting for the response and fall through to LIBSSH2_CHANNEL_CLOSE below */ - } else + } + else channel->close_state = libssh2_NB_state_sent; } - if (channel->close_state == libssh2_NB_state_sent) { + if(channel->close_state == libssh2_NB_state_sent) { /* We must wait for the remote SSH_MSG_CHANNEL_CLOSE message */ - while (!channel->remote.close && !rc && + while(!channel->remote.close && !rc && (session->socket_state != LIBSSH2_SOCKET_DISCONNECTED)) rc = _libssh2_transport_read(session); } if(rc != LIBSSH2_ERROR_EAGAIN) { - /* set the local close state first when we're perfectly confirmed to not - do any more EAGAINs */ + /* set the local close state first when we're perfectly confirmed to + not do any more EAGAINs */ channel->local.close = 1; /* We call the callback last in this function to make it keep the local data as long as EAGAIN is returned. */ - if (channel->close_cb) { + if(channel->close_cb) { LIBSSH2_CHANNEL_CLOSE(session, channel); } @@ -2384,7 +2470,7 @@ int _libssh2_channel_close(LIBSSH2_CHANNEL * channel) } /* return 0 or an error */ - return rc>=0?0:rc; + return rc >= 0 ? 0 : rc; } /* @@ -2414,13 +2500,13 @@ static int channel_wait_closed(LIBSSH2_CHANNEL *channel) LIBSSH2_SESSION *session = channel->session; int rc; - if (!libssh2_channel_eof(channel)) { + if(!channel->remote.eof) { return _libssh2_error(session, LIBSSH2_ERROR_INVAL, "libssh2_channel_wait_closed() invoked when " "channel is not in EOF state"); } - if (channel->wait_closed_state == libssh2_NB_state_idle) { + if(channel->wait_closed_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Awaiting close of channel %lu/%lu", channel->local.id, channel->remote.id); @@ -2432,13 +2518,13 @@ static int channel_wait_closed(LIBSSH2_CHANNEL *channel) * While channel is not closed, read more packets from the network. * Either the channel will be closed or network timeout will occur. */ - if (!channel->remote.close) { + if(!channel->remote.close) { do { rc = _libssh2_transport_read(session); - if (channel->remote.close) + if(channel->remote.close) /* it is now closed, move on! */ break; - } while (rc > 0); + } while(rc > 0); if(rc < 0) return rc; } @@ -2483,7 +2569,7 @@ int _libssh2_channel_free(LIBSSH2_CHANNEL *channel) assert(session); - if (channel->free_state == libssh2_NB_state_idle) { + if(channel->free_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Freeing channel %lu/%lu resources", channel->local.id, channel->remote.id); @@ -2492,7 +2578,7 @@ int _libssh2_channel_free(LIBSSH2_CHANNEL *channel) } /* Allow channel freeing even when the socket has lost its connection */ - if (!channel->local.close + if(!channel->local.close && (session->socket_state == LIBSSH2_SOCKET_CONNECTED)) { rc = _libssh2_channel_close(channel); @@ -2505,7 +2591,7 @@ int _libssh2_channel_free(LIBSSH2_CHANNEL *channel) channel->free_state = libssh2_NB_state_idle; - if (channel->exit_signal) { + if(channel->exit_signal) { LIBSSH2_FREE(session, channel->exit_signal); } @@ -2517,7 +2603,7 @@ int _libssh2_channel_free(LIBSSH2_CHANNEL *channel) /* Clear out packets meant for this channel */ _libssh2_htonu32(channel_id, channel->local.id); - while ((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA, &data, + while((_libssh2_packet_ask(session, SSH_MSG_CHANNEL_DATA, &data, &data_len, 1, channel_id, 4) >= 0) || (_libssh2_packet_ask(session, SSH_MSG_CHANNEL_EXTENDED_DATA, &data, @@ -2526,7 +2612,7 @@ int _libssh2_channel_free(LIBSSH2_CHANNEL *channel) } /* free "channel_type" */ - if (channel->channel_type) { + if(channel->channel_type) { LIBSSH2_FREE(session, channel->channel_type); } @@ -2536,13 +2622,13 @@ int _libssh2_channel_free(LIBSSH2_CHANNEL *channel) /* * Make sure all memory used in the state variables are free */ - if (channel->setenv_packet) { + if(channel->setenv_packet) { LIBSSH2_FREE(session, channel->setenv_packet); } - if (channel->reqX11_packet) { + if(channel->reqX11_packet) { LIBSSH2_FREE(session, channel->reqX11_packet); } - if (channel->process_packet) { + if(channel->process_packet) { LIBSSH2_FREE(session, channel->process_packet); } @@ -2587,25 +2673,38 @@ libssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel, if(!channel) return 0; /* no channel, no window! */ - if (window_size_initial) { + if(window_size_initial) { *window_size_initial = channel->remote.window_size_initial; } - if (read_avail) { + if(read_avail) { size_t bytes_queued = 0; + LIBSSH2_PACKET *next_packet; LIBSSH2_PACKET *packet = _libssh2_list_first(&channel->session->packets); - while (packet) { - unsigned char packet_type = packet->data[0]; + while(packet) { + unsigned char packet_type; + next_packet = _libssh2_list_next(&packet->node); + + if(packet->data_len < 1) { + packet = next_packet; + _libssh2_debug(channel->session, LIBSSH2_TRACE_ERROR, + "Unexpected packet length"); + continue; + } + + packet_type = packet->data[0]; - if (((packet_type == SSH_MSG_CHANNEL_DATA) - || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA)) - && (_libssh2_ntohu32(packet->data + 1) == channel->local.id)) { + if(((packet_type == SSH_MSG_CHANNEL_DATA) + || (packet_type == SSH_MSG_CHANNEL_EXTENDED_DATA)) + && ((packet->data_len >= 5) + && (_libssh2_ntohu32(packet->data + 1) == + channel->local.id))) { bytes_queued += packet->data_len - packet->data_head; } - packet = _libssh2_list_next(&packet->node); + packet = next_packet; } *read_avail = bytes_queued; @@ -2629,7 +2728,7 @@ libssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel, if(!channel) return 0; /* no channel, no window! */ - if (window_size_initial) { + if(window_size_initial) { /* For locally initiated channels this is very often 0, so it's not * *that* useful as information goes */ *window_size_initial = channel->local.window_size_initial; diff --git a/vendor/libssh2/src/comp.c b/vendor/libssh2/src/comp.c index 629319590..fec82a74b 100644 --- a/vendor/libssh2/src/comp.c +++ b/vendor/libssh2/src/comp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2004-2007, Sara Golemon +/* Copyright (c) 2004-2007, 2019, Sara Golemon * Copyright (c) 2010-2014, Daniel Stenberg * All rights reserved. * @@ -142,7 +142,7 @@ comp_method_zlib_init(LIBSSH2_SESSION * session, int compr, int status; strm = LIBSSH2_CALLOC(session, sizeof(z_stream)); - if (!strm) { + if(!strm) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "zlib compression/decompression"); @@ -151,15 +151,16 @@ comp_method_zlib_init(LIBSSH2_SESSION * session, int compr, strm->opaque = (voidpf) session; strm->zalloc = (alloc_func) comp_method_zlib_alloc; strm->zfree = (free_func) comp_method_zlib_free; - if (compr) { + if(compr) { /* deflate */ status = deflateInit(strm, Z_DEFAULT_COMPRESSION); - } else { + } + else { /* inflate */ status = inflateInit(strm); } - if (status != Z_OK) { + if(status != Z_OK) { LIBSSH2_FREE(session, strm); _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "unhandled zlib error %d", status); @@ -197,13 +198,14 @@ comp_method_zlib_comp(LIBSSH2_SESSION *session, status = deflate(strm, Z_PARTIAL_FLUSH); - if ((status == Z_OK) && (strm->avail_out > 0)) { + if((status == Z_OK) && (strm->avail_out > 0)) { *dest_len = out_maxlen - strm->avail_out; return 0; } _libssh2_debug(session, LIBSSH2_TRACE_TRANS, - "unhandled zlib compression error %d, avail_out", status, strm->avail_out); + "unhandled zlib compression error %d, avail_out", + status, strm->avail_out); return _libssh2_error(session, LIBSSH2_ERROR_ZLIB, "compression failure"); } @@ -225,22 +227,22 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session, reallocs */ char *out; size_t out_maxlen = src_len; - - if (src_len <= SIZE_MAX / 4) + + if(src_len <= SIZE_MAX / 4) out_maxlen = src_len * 4; else out_maxlen = payload_limit; /* If strm is null, then we have not yet been initialized. */ - if (strm == NULL) + if(strm == NULL) return _libssh2_error(session, LIBSSH2_ERROR_COMPRESS, "decompression uninitialized");; /* In practice they never come smaller than this */ - if (out_maxlen < 25) + if(out_maxlen < 25) out_maxlen = 25; - if (out_maxlen > (int) payload_limit) + if(out_maxlen > payload_limit) out_maxlen = payload_limit; strm->next_in = (unsigned char *) src; @@ -248,26 +250,29 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session, strm->next_out = (unsigned char *) LIBSSH2_ALLOC(session, out_maxlen); out = (char *) strm->next_out; strm->avail_out = out_maxlen; - if (!strm->next_out) + if(!strm->next_out) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate decompression buffer"); /* Loop until it's all inflated or hit error */ - for (;;) { + for(;;) { int status; size_t out_ofs; char *newout; status = inflate(strm, Z_PARTIAL_FLUSH); - if (status == Z_OK) { - if (strm->avail_out > 0) - /* status is OK and the output buffer has not been exhausted so we're done */ + if(status == Z_OK) { + if(strm->avail_out > 0) + /* status is OK and the output buffer has not been exhausted + so we're done */ break; - } else if (status == Z_BUF_ERROR) { + } + else if(status == Z_BUF_ERROR) { /* the input data has been exhausted so we are done */ break; - } else { + } + else { /* error state */ LIBSSH2_FREE(session, out); _libssh2_debug(session, LIBSSH2_TRACE_TRANS, @@ -276,7 +281,7 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session, "decompression failure"); } - if (out_maxlen > (int) payload_limit || out_maxlen > SIZE_MAX / 2) { + if(out_maxlen > payload_limit || out_maxlen > SIZE_MAX / 2) { LIBSSH2_FREE(session, out); return _libssh2_error(session, LIBSSH2_ERROR_ZLIB, "Excessive growth in decompression phase"); @@ -286,7 +291,7 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session, out_ofs = out_maxlen - strm->avail_out; out_maxlen *= 2; newout = LIBSSH2_REALLOC(session, out, out_maxlen); - if (!newout) { + if(!newout) { LIBSSH2_FREE(session, out); return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to expand decompression buffer"); @@ -311,8 +316,8 @@ comp_method_zlib_dtor(LIBSSH2_SESSION *session, int compr, void **abstract) { z_stream *strm = *abstract; - if (strm) { - if (compr) + if(strm) { + if(compr) deflateEnd(strm); else inflateEnd(strm); diff --git a/vendor/libssh2/src/crypt.c b/vendor/libssh2/src/crypt.c index 931ae8b80..8d493b484 100644 --- a/vendor/libssh2/src/crypt.c +++ b/vendor/libssh2/src/crypt.c @@ -53,10 +53,11 @@ crypt_none_crypt(LIBSSH2_SESSION * session, unsigned char *buf, static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_none = { "none", - 8, /* blocksize (SSH2 defines minimum blocksize as 8) */ - 0, /* iv_len */ - 0, /* secret_len */ - 0, /* flags */ + "DEK-Info: NONE", + 8, /* blocksize (SSH2 defines minimum blocksize as 8) */ + 0, /* iv_len */ + 0, /* secret_len */ + 0, /* flags */ NULL, crypt_none_crypt, NULL @@ -79,12 +80,12 @@ crypt_init(LIBSSH2_SESSION * session, { struct crypt_ctx *ctx = LIBSSH2_ALLOC(session, sizeof(struct crypt_ctx)); - if (!ctx) + if(!ctx) return LIBSSH2_ERROR_ALLOC; ctx->encrypt = encrypt; ctx->algo = method->algo; - if (_libssh2_cipher_init(&ctx->h, ctx->algo, iv, secret, encrypt)) { + if(_libssh2_cipher_init(&ctx->h, ctx->algo, iv, secret, encrypt)) { LIBSSH2_FREE(session, ctx); return -1; } @@ -108,7 +109,7 @@ static int crypt_dtor(LIBSSH2_SESSION * session, void **abstract) { struct crypt_ctx **cctx = (struct crypt_ctx **) abstract; - if (cctx && *cctx) { + if(cctx && *cctx) { _libssh2_cipher_dtor(&(*cctx)->h); LIBSSH2_FREE(session, *cctx); *abstract = NULL; @@ -119,6 +120,7 @@ crypt_dtor(LIBSSH2_SESSION * session, void **abstract) #if LIBSSH2_AES_CTR static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_ctr = { "aes128-ctr", + "", 16, /* blocksize */ 16, /* initial value length */ 16, /* secret length -- 16*8 == 128bit */ @@ -131,6 +133,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_ctr = { static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_ctr = { "aes192-ctr", + "", 16, /* blocksize */ 16, /* initial value length */ 24, /* secret length -- 24*8 == 192bit */ @@ -143,6 +146,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_ctr = { static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_ctr = { "aes256-ctr", + "", 16, /* blocksize */ 16, /* initial value length */ 32, /* secret length -- 32*8 == 256bit */ @@ -157,6 +161,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_ctr = { #if LIBSSH2_AES static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_cbc = { "aes128-cbc", + "DEK-Info: AES-128-CBC", 16, /* blocksize */ 16, /* initial value length */ 16, /* secret length -- 16*8 == 128bit */ @@ -169,6 +174,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes128_cbc = { static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_cbc = { "aes192-cbc", + "DEK-Info: AES-192-CBC", 16, /* blocksize */ 16, /* initial value length */ 24, /* secret length -- 24*8 == 192bit */ @@ -181,6 +187,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes192_cbc = { static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_cbc = { "aes256-cbc", + "DEK-Info: AES-256-CBC", 16, /* blocksize */ 16, /* initial value length */ 32, /* secret length -- 32*8 == 256bit */ @@ -195,6 +202,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_aes256_cbc = { static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_rijndael_cbc_lysator_liu_se = { "rijndael-cbc@lysator.liu.se", + "DEK-Info: AES-256-CBC", 16, /* blocksize */ 16, /* initial value length */ 32, /* secret length -- 32*8 == 256bit */ @@ -209,6 +217,7 @@ static const LIBSSH2_CRYPT_METHOD #if LIBSSH2_BLOWFISH static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_blowfish_cbc = { "blowfish-cbc", + "", 8, /* blocksize */ 8, /* initial value length */ 16, /* secret length */ @@ -223,6 +232,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_blowfish_cbc = { #if LIBSSH2_RC4 static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_arcfour = { "arcfour", + "DEK-Info: RC4", 8, /* blocksize */ 8, /* initial value length */ 16, /* secret length */ @@ -242,13 +252,13 @@ crypt_init_arcfour128(LIBSSH2_SESSION * session, { int rc; - rc = crypt_init (session, method, iv, free_iv, secret, free_secret, - encrypt, abstract); - if (rc == 0) { + rc = crypt_init(session, method, iv, free_iv, secret, free_secret, + encrypt, abstract); + if(rc == 0) { struct crypt_ctx *cctx = *(struct crypt_ctx **) abstract; unsigned char block[8]; size_t discard = 1536; - for (; discard; discard -= 8) + for(; discard; discard -= 8) _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block, method->blocksize); } @@ -258,6 +268,7 @@ crypt_init_arcfour128(LIBSSH2_SESSION * session, static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_arcfour128 = { "arcfour128", + "", 8, /* blocksize */ 8, /* initial value length */ 16, /* secret length */ @@ -272,6 +283,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_arcfour128 = { #if LIBSSH2_CAST static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_cast128_cbc = { "cast128-cbc", + "", 8, /* blocksize */ 8, /* initial value length */ 16, /* secret length */ @@ -286,6 +298,7 @@ static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_cast128_cbc = { #if LIBSSH2_3DES static const LIBSSH2_CRYPT_METHOD libssh2_crypt_method_3des_cbc = { "3des-cbc", + "DEK-Info: DES-EDE3-CBC", 8, /* blocksize */ 8, /* initial value length */ 24, /* secret length */ diff --git a/vendor/libssh2/src/crypto.h b/vendor/libssh2/src/crypto.h index aa997a307..8b1e00402 100644 --- a/vendor/libssh2/src/crypto.h +++ b/vendor/libssh2/src/crypto.h @@ -1,6 +1,6 @@ /* Copyright (C) 2009, 2010 Simon Josefsson * Copyright (C) 2006, 2007 The Written Word, Inc. All rights reserved. - * Copyright (C) 2010 Daniel Stenberg + * Copyright (C) 2010-2019 Daniel Stenberg * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided @@ -58,6 +58,11 @@ #include "mbedtls.h" #endif +#define LIBSSH2_ED25519_KEY_LEN 32 +#define LIBSSH2_ED25519_PRIVATE_KEY_LEN 64 +#define LIBSSH2_ED25519_SIG_LEN 64 + +#if LIBSSH2_RSA int _libssh2_rsa_new(libssh2_rsa_ctx ** rsa, const unsigned char *edata, unsigned long elen, @@ -90,8 +95,10 @@ int _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, size_t *signature_len); int _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa, LIBSSH2_SESSION * session, - const char *filedata, size_t filedata_len, + const char *filedata, + size_t filedata_len, unsigned const char *passphrase); +#endif #if LIBSSH2_DSA int _libssh2_dsa_new(libssh2_dsa_ctx ** dsa, @@ -116,10 +123,102 @@ int _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, unsigned long hash_len, unsigned char *sig); int _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa, LIBSSH2_SESSION * session, - const char *filedata, size_t filedata_len, + const char *filedata, + size_t filedata_len, unsigned const char *passphrase); #endif +#if LIBSSH2_ECDSA +int +_libssh2_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx ** ecdsactx, + const unsigned char *k, + size_t k_len, + libssh2_curve_type type); +int +_libssh2_ecdsa_new_private(libssh2_ecdsa_ctx ** ec_ctx, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase); + +int +_libssh2_ecdsa_verify(libssh2_ecdsa_ctx * ctx, + const unsigned char *r, size_t r_len, + const unsigned char *s, size_t s_len, + const unsigned char *m, size_t m_len); + +int +_libssh2_ecdsa_create_key(LIBSSH2_SESSION *session, + _libssh2_ec_key **out_private_key, + unsigned char **out_public_key_octal, + size_t *out_public_key_octal_len, + libssh2_curve_type curve_type); + +int +_libssh2_ecdh_gen_k(_libssh2_bn **k, _libssh2_ec_key *private_key, + const unsigned char *server_public_key, + size_t server_public_key_len); + +int +_libssh2_ecdsa_sign(LIBSSH2_SESSION *session, libssh2_ecdsa_ctx *ec_ctx, + const unsigned char *hash, unsigned long hash_len, + unsigned char **signature, size_t *signature_len); + +int _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx, + LIBSSH2_SESSION * session, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase); + +libssh2_curve_type +_libssh2_ecdsa_key_get_curve_type(_libssh2_ec_key *key); + +int +_libssh2_ecdsa_curve_type_from_name(const char *name, + libssh2_curve_type *out_type); + +#endif /* LIBSSH2_ECDSA */ + +#if LIBSSH2_ED25519 + +int +_libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_ed25519_ctx **ctx, + uint8_t **out_public_key, uint8_t **out_private_key); + +int +_libssh2_curve25519_gen_k(_libssh2_bn **k, + uint8_t private_key[LIBSSH2_ED25519_KEY_LEN], + uint8_t server_public_key[LIBSSH2_ED25519_KEY_LEN]); + +int +_libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s, + size_t s_len, const uint8_t *m, size_t m_len); + +int +_libssh2_ed25519_new_private(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const char *filename, const uint8_t *passphrase); + +int +_libssh2_ed25519_new_public(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const unsigned char *raw_pub_key, + const uint8_t key_len); + +int +_libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session, + uint8_t **out_sig, size_t *out_sig_len, + const uint8_t *message, size_t message_len); + +int +_libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase); + +#endif /* LIBSSH2_ED25519 */ + + int _libssh2_cipher_init(_libssh2_cipher_ctx * h, _libssh2_cipher_type(algo), unsigned char *iv, @@ -136,6 +235,7 @@ int _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, size_t *pubkeydata_len, const char *privatekey, const char *passphrase); + int _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, unsigned char **method, size_t *method_len, @@ -145,6 +245,4 @@ int _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, size_t privatekeydata_len, const char *passphrase); -void _libssh2_init_aes_ctr(void); - #endif diff --git a/vendor/libssh2/src/global.c b/vendor/libssh2/src/global.c index dc45e7003..f88eb33da 100644 --- a/vendor/libssh2/src/global.c +++ b/vendor/libssh2/src/global.c @@ -44,9 +44,8 @@ static int _libssh2_init_flags = 0; LIBSSH2_API int libssh2_init(int flags) { - if (_libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO)) { + if(_libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO)) { libssh2_crypto_init(); - _libssh2_init_aes_ctr(); } _libssh2_initialized++; @@ -58,12 +57,12 @@ libssh2_init(int flags) LIBSSH2_API void libssh2_exit(void) { - if (_libssh2_initialized == 0) + if(_libssh2_initialized == 0) return; _libssh2_initialized--; - if (!(_libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO)) { + if(!(_libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO)) { libssh2_crypto_exit(); } @@ -73,6 +72,6 @@ libssh2_exit(void) void _libssh2_init_if_needed(void) { - if (_libssh2_initialized == 0) + if(_libssh2_initialized == 0) (void)libssh2_init (0); } diff --git a/vendor/libssh2/src/hostkey.c b/vendor/libssh2/src/hostkey.c index 2a0a8f943..a8bd42b7a 100644 --- a/vendor/libssh2/src/hostkey.c +++ b/vendor/libssh2/src/hostkey.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Sara Golemon - * Copyright (c) 2009-2014 by Daniel Stenberg + * Copyright (c) 2009-2019 by Daniel Stenberg * All rights reserved. * * Redistribution and use in source and binary forms, @@ -64,38 +64,36 @@ hostkey_method_ssh_rsa_init(LIBSSH2_SESSION * session, void **abstract) { libssh2_rsa_ctx *rsactx; - const unsigned char *s, *e, *n; - unsigned long len, e_len, n_len; - int ret; - - (void) hostkey_data_len; + unsigned char *e, *n; + size_t e_len, n_len; + struct string_buf buf; - if (*abstract) { + if(*abstract) { hostkey_method_ssh_rsa_dtor(session, abstract); *abstract = NULL; } - s = hostkey_data; - len = _libssh2_ntohu32(s); - s += 4; - - if (len != 7 || strncmp((char *) s, "ssh-rsa", 7) != 0) { + if(hostkey_data_len < 19) { + _libssh2_debug(session, LIBSSH2_TRACE_ERROR, + "host key length too short"); return -1; } - s += 7; - e_len = _libssh2_ntohu32(s); - s += 4; + buf.data = (unsigned char *)hostkey_data; + buf.dataptr = buf.data; + buf.len = hostkey_data_len; - e = s; - s += e_len; - n_len = _libssh2_ntohu32(s); - s += 4; - n = s; + if(_libssh2_match_string(&buf, "ssh-rsa")) + return -1; + + if(_libssh2_get_string(&buf, &e, &e_len)) + return -1; + + if(_libssh2_get_string(&buf, &n, &n_len)) + return -1; - ret = _libssh2_rsa_new(&rsactx, e, e_len, n, n_len, NULL, 0, - NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0); - if (ret) { + if(_libssh2_rsa_new(&rsactx, e, e_len, n, n_len, NULL, 0, + NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0)) { return -1; } @@ -118,13 +116,13 @@ hostkey_method_ssh_rsa_initPEM(LIBSSH2_SESSION * session, libssh2_rsa_ctx *rsactx; int ret; - if (*abstract) { + if(*abstract) { hostkey_method_ssh_rsa_dtor(session, abstract); *abstract = NULL; } ret = _libssh2_rsa_new_private(&rsactx, session, privkeyfile, passphrase); - if (ret) { + if(ret) { return -1; } @@ -148,7 +146,7 @@ hostkey_method_ssh_rsa_initPEMFromMemory(LIBSSH2_SESSION * session, libssh2_rsa_ctx *rsactx; int ret; - if (*abstract) { + if(*abstract) { hostkey_method_ssh_rsa_dtor(session, abstract); *abstract = NULL; } @@ -156,7 +154,7 @@ hostkey_method_ssh_rsa_initPEMFromMemory(LIBSSH2_SESSION * session, ret = _libssh2_rsa_new_private_frommemory(&rsactx, session, privkeyfiledata, privkeyfiledata_len, passphrase); - if (ret) { + if(ret) { return -1; } @@ -181,6 +179,9 @@ hostkey_method_ssh_rsa_sig_verify(LIBSSH2_SESSION * session, (void) session; /* Skip past keyname_len(4) + keyname(7){"ssh-rsa"} + signature_len(4) */ + if(sig_len < 15) + return -1; + sig += 15; sig_len -= 15; return _libssh2_rsa_sha1_verify(rsactx, sig, sig_len, m, m_len); @@ -218,7 +219,7 @@ hostkey_method_ssh_rsa_signv(LIBSSH2_SESSION * session, ret = _libssh2_rsa_sha1_sign(session, rsactx, hash, SHA_DIGEST_LENGTH, signature, signature_len); - if (ret) { + if(ret) { return -1; } @@ -281,45 +282,42 @@ hostkey_method_ssh_dss_init(LIBSSH2_SESSION * session, void **abstract) { libssh2_dsa_ctx *dsactx; - const unsigned char *p, *q, *g, *y, *s; - unsigned long p_len, q_len, g_len, y_len, len; - int ret; - - (void) hostkey_data_len; + unsigned char *p, *q, *g, *y; + size_t p_len, q_len, g_len, y_len; + struct string_buf buf; - if (*abstract) { + if(*abstract) { hostkey_method_ssh_dss_dtor(session, abstract); *abstract = NULL; } - s = hostkey_data; - len = _libssh2_ntohu32(s); - s += 4; - if (len != 7 || strncmp((char *) s, "ssh-dss", 7) != 0) { + if(hostkey_data_len < 27) { + _libssh2_debug(session, LIBSSH2_TRACE_ERROR, + "host key length too short"); return -1; } - s += 7; - p_len = _libssh2_ntohu32(s); - s += 4; - p = s; - s += p_len; - q_len = _libssh2_ntohu32(s); - s += 4; - q = s; - s += q_len; - g_len = _libssh2_ntohu32(s); - s += 4; - g = s; - s += g_len; - y_len = _libssh2_ntohu32(s); - s += 4; - y = s; - /* s += y_len; */ + buf.data = (unsigned char *)hostkey_data; + buf.dataptr = buf.data; + buf.len = hostkey_data_len; + + if(_libssh2_match_string(&buf, "ssh-dss")) + return -1; + + if(_libssh2_get_string(&buf, &p, &p_len)) + return -1; + + if(_libssh2_get_string(&buf, &q, &q_len)) + return -1; + + if(_libssh2_get_string(&buf, &g, &g_len)) + return -1; + + if(_libssh2_get_string(&buf, &y, &y_len)) + return -1; - ret = _libssh2_dsa_new(&dsactx, p, p_len, q, q_len, - g, g_len, y, y_len, NULL, 0); - if (ret) { + if(_libssh2_dsa_new(&dsactx, p, p_len, q, q_len, + g, g_len, y, y_len, NULL, 0)) { return -1; } @@ -342,13 +340,13 @@ hostkey_method_ssh_dss_initPEM(LIBSSH2_SESSION * session, libssh2_dsa_ctx *dsactx; int ret; - if (*abstract) { + if(*abstract) { hostkey_method_ssh_dss_dtor(session, abstract); *abstract = NULL; } ret = _libssh2_dsa_new_private(&dsactx, session, privkeyfile, passphrase); - if (ret) { + if(ret) { return -1; } @@ -372,7 +370,7 @@ hostkey_method_ssh_dss_initPEMFromMemory(LIBSSH2_SESSION * session, libssh2_dsa_ctx *dsactx; int ret; - if (*abstract) { + if(*abstract) { hostkey_method_ssh_dss_dtor(session, abstract); *abstract = NULL; } @@ -380,7 +378,7 @@ hostkey_method_ssh_dss_initPEMFromMemory(LIBSSH2_SESSION * session, ret = _libssh2_dsa_new_private_frommemory(&dsactx, session, privkeyfiledata, privkeyfiledata_len, passphrase); - if (ret) { + if(ret) { return -1; } @@ -404,12 +402,14 @@ hostkey_method_ssh_dss_sig_verify(LIBSSH2_SESSION * session, libssh2_dsa_ctx *dsactx = (libssh2_dsa_ctx *) (*abstract); /* Skip past keyname_len(4) + keyname(7){"ssh-dss"} + signature_len(4) */ - sig += 15; - sig_len -= 15; - if (sig_len != 40) { + if(sig_len != 55) { return _libssh2_error(session, LIBSSH2_ERROR_PROTO, "Invalid DSS signature length"); } + + sig += 15; + sig_len -= 15; + return _libssh2_dsa_sha1_verify(dsactx, sig, m, m_len); } @@ -432,7 +432,7 @@ hostkey_method_ssh_dss_signv(LIBSSH2_SESSION * session, int i; *signature = LIBSSH2_CALLOC(session, 2 * SHA_DIGEST_LENGTH); - if (!*signature) { + if(!*signature) { return -1; } @@ -444,7 +444,7 @@ hostkey_method_ssh_dss_signv(LIBSSH2_SESSION * session, } libssh2_sha1_final(ctx, hash); - if (_libssh2_dsa_sha1_sign(dsactx, hash, SHA_DIGEST_LENGTH, *signature)) { + if(_libssh2_dsa_sha1_sign(dsactx, hash, SHA_DIGEST_LENGTH, *signature)) { LIBSSH2_FREE(session, *signature); return -1; } @@ -483,7 +483,526 @@ static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_dss = { }; #endif /* LIBSSH2_DSA */ +#if LIBSSH2_ECDSA + +/* *********** + * ecdsa-sha2-nistp256/384/521 * + *********** */ + +static int +hostkey_method_ssh_ecdsa_dtor(LIBSSH2_SESSION * session, + void **abstract); + +/* + * hostkey_method_ssh_ecdsa_init + * + * Initialize the server hostkey working area with e/n pair + */ +static int +hostkey_method_ssh_ecdsa_init(LIBSSH2_SESSION * session, + const unsigned char *hostkey_data, + size_t hostkey_data_len, + void **abstract) +{ + libssh2_ecdsa_ctx *ecdsactx = NULL; + unsigned char *type_str, *domain, *public_key; + size_t key_len, len; + libssh2_curve_type type; + struct string_buf buf; + + if(abstract != NULL && *abstract) { + hostkey_method_ssh_ecdsa_dtor(session, abstract); + *abstract = NULL; + } + + if(hostkey_data_len < 39) { + _libssh2_debug(session, LIBSSH2_TRACE_ERROR, + "host key length too short"); + return -1; + } + + buf.data = (unsigned char *)hostkey_data; + buf.dataptr = buf.data; + buf.len = hostkey_data_len; + + if(_libssh2_get_string(&buf, &type_str, &len) || len != 19) + return -1; + + if(strncmp((char *) type_str, "ecdsa-sha2-nistp256", 19) == 0) { + type = LIBSSH2_EC_CURVE_NISTP256; + } + else if(strncmp((char *) type_str, "ecdsa-sha2-nistp384", 19) == 0) { + type = LIBSSH2_EC_CURVE_NISTP384; + } + else if(strncmp((char *) type_str, "ecdsa-sha2-nistp521", 19) == 0) { + type = LIBSSH2_EC_CURVE_NISTP521; + } + else { + return -1; + } + + if(_libssh2_get_string(&buf, &domain, &len) || len != 8) + return -1; + + if(type == LIBSSH2_EC_CURVE_NISTP256 && + strncmp((char *)domain, "nistp256", 8) != 0) { + return -1; + } + else if(type == LIBSSH2_EC_CURVE_NISTP384 && + strncmp((char *)domain, "nistp384", 8) != 0) { + return -1; + } + else if(type == LIBSSH2_EC_CURVE_NISTP521 && + strncmp((char *)domain, "nistp521", 8) != 0) { + return -1; + } + + /* public key */ + if(_libssh2_get_string(&buf, &public_key, &key_len)) + return -1; + + if(_libssh2_ecdsa_curve_name_with_octal_new(&ecdsactx, public_key, + key_len, type)) + return -1; + + if(abstract != NULL) + *abstract = ecdsactx; + + return 0; +} + +/* + * hostkey_method_ssh_ecdsa_initPEM + * + * Load a Private Key from a PEM file + */ +static int +hostkey_method_ssh_ecdsa_initPEM(LIBSSH2_SESSION * session, + const char *privkeyfile, + unsigned const char *passphrase, + void **abstract) +{ + libssh2_ecdsa_ctx *ec_ctx = NULL; + int ret; + + if(abstract != NULL && *abstract) { + hostkey_method_ssh_ecdsa_dtor(session, abstract); + *abstract = NULL; + } + + ret = _libssh2_ecdsa_new_private(&ec_ctx, session, + privkeyfile, passphrase); + + if(abstract != NULL) + *abstract = ec_ctx; + + return ret; +} + +/* + * hostkey_method_ssh_ecdsa_initPEMFromMemory + * + * Load a Private Key from memory + */ +static int +hostkey_method_ssh_ecdsa_initPEMFromMemory(LIBSSH2_SESSION * session, + const char *privkeyfiledata, + size_t privkeyfiledata_len, + unsigned const char *passphrase, + void **abstract) +{ + libssh2_ecdsa_ctx *ec_ctx = NULL; + int ret; + + if(abstract != NULL && *abstract) { + hostkey_method_ssh_ecdsa_dtor(session, abstract); + *abstract = NULL; + } + + ret = _libssh2_ecdsa_new_private_frommemory(&ec_ctx, session, + privkeyfiledata, + privkeyfiledata_len, + passphrase); + if(ret) { + return -1; + } + + if(abstract != NULL) + *abstract = ec_ctx; + + return 0; +} + +/* + * hostkey_method_ecdsa_sig_verify + * + * Verify signature created by remote + */ +static int +hostkey_method_ssh_ecdsa_sig_verify(LIBSSH2_SESSION * session, + const unsigned char *sig, + size_t sig_len, + const unsigned char *m, + size_t m_len, void **abstract) +{ + unsigned char *r, *s, *name; + size_t r_len, s_len, name_len; + unsigned int len; + struct string_buf buf; + libssh2_ecdsa_ctx *ctx = (libssh2_ecdsa_ctx *) (*abstract); + + (void) session; + + if(sig_len < 35) + return -1; + + /* keyname_len(4) + keyname(19){"ecdsa-sha2-nistp256"} + + signature_len(4) */ + buf.data = (unsigned char *)sig; + buf.dataptr = buf.data; + buf.len = sig_len; + + if(_libssh2_get_string(&buf, &name, &name_len) || name_len != 19) + return -1; + + if(_libssh2_get_u32(&buf, &len) != 0 || len < 8) + return -1; + + if(_libssh2_get_string(&buf, &r, &r_len)) + return -1; + + if(_libssh2_get_string(&buf, &s, &s_len)) + return -1; + + return _libssh2_ecdsa_verify(ctx, r, r_len, s, s_len, m, m_len); +} + + +#define LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(digest_type) \ + { \ + unsigned char hash[SHA##digest_type##_DIGEST_LENGTH]; \ + libssh2_sha##digest_type##_ctx ctx; \ + int i; \ + libssh2_sha##digest_type##_init(&ctx); \ + for(i = 0; i < veccount; i++) { \ + libssh2_sha##digest_type##_update(ctx, datavec[i].iov_base, \ + datavec[i].iov_len); \ + } \ + libssh2_sha##digest_type##_final(ctx, hash); \ + ret = _libssh2_ecdsa_sign(session, ec_ctx, hash, \ + SHA##digest_type##_DIGEST_LENGTH, \ + signature, signature_len); \ + } + + +/* + * hostkey_method_ecdsa_signv + * + * Construct a signature from an array of vectors + */ +static int +hostkey_method_ssh_ecdsa_signv(LIBSSH2_SESSION * session, + unsigned char **signature, + size_t *signature_len, + int veccount, + const struct iovec datavec[], + void **abstract) +{ + libssh2_ecdsa_ctx *ec_ctx = (libssh2_ecdsa_ctx *) (*abstract); + libssh2_curve_type type = _libssh2_ecdsa_key_get_curve_type(ec_ctx); + int ret = 0; + + if(type == LIBSSH2_EC_CURVE_NISTP256) { + LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(256); + } + else if(type == LIBSSH2_EC_CURVE_NISTP384) { + LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(384); + } + else if(type == LIBSSH2_EC_CURVE_NISTP521) { + LIBSSH2_HOSTKEY_METHOD_EC_SIGNV_HASH(512); + } + else { + return -1; + } + + return ret; +} + +/* + * hostkey_method_ssh_ecdsa_dtor + * + * Shutdown the hostkey by freeing EC_KEY context + */ +static int +hostkey_method_ssh_ecdsa_dtor(LIBSSH2_SESSION * session, void **abstract) +{ + libssh2_ecdsa_ctx *keyctx = (libssh2_ecdsa_ctx *) (*abstract); + (void) session; + + if(keyctx != NULL) + _libssh2_ecdsa_free(keyctx); + + *abstract = NULL; + + return 0; +} + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp256 = { + "ecdsa-sha2-nistp256", + SHA256_DIGEST_LENGTH, + hostkey_method_ssh_ecdsa_init, + hostkey_method_ssh_ecdsa_initPEM, + hostkey_method_ssh_ecdsa_initPEMFromMemory, + hostkey_method_ssh_ecdsa_sig_verify, + hostkey_method_ssh_ecdsa_signv, + NULL, /* encrypt */ + hostkey_method_ssh_ecdsa_dtor, +}; + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp384 = { + "ecdsa-sha2-nistp384", + SHA384_DIGEST_LENGTH, + hostkey_method_ssh_ecdsa_init, + hostkey_method_ssh_ecdsa_initPEM, + hostkey_method_ssh_ecdsa_initPEMFromMemory, + hostkey_method_ssh_ecdsa_sig_verify, + hostkey_method_ssh_ecdsa_signv, + NULL, /* encrypt */ + hostkey_method_ssh_ecdsa_dtor, +}; + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp521 = { + "ecdsa-sha2-nistp521", + SHA512_DIGEST_LENGTH, + hostkey_method_ssh_ecdsa_init, + hostkey_method_ssh_ecdsa_initPEM, + hostkey_method_ssh_ecdsa_initPEMFromMemory, + hostkey_method_ssh_ecdsa_sig_verify, + hostkey_method_ssh_ecdsa_signv, + NULL, /* encrypt */ + hostkey_method_ssh_ecdsa_dtor, +}; + +#endif /* LIBSSH2_ECDSA */ + +#if LIBSSH2_ED25519 + +/* *********** + * ed25519 * + *********** */ + +static int hostkey_method_ssh_ed25519_dtor(LIBSSH2_SESSION * session, + void **abstract); + +/* + * hostkey_method_ssh_ed25519_init + * + * Initialize the server hostkey working area with e/n pair + */ +static int +hostkey_method_ssh_ed25519_init(LIBSSH2_SESSION * session, + const unsigned char *hostkey_data, + size_t hostkey_data_len, + void **abstract) +{ + const unsigned char *s; + unsigned long len, key_len; + libssh2_ed25519_ctx *ctx = NULL; + + if(*abstract) { + hostkey_method_ssh_ed25519_dtor(session, abstract); + *abstract = NULL; + } + + if(hostkey_data_len < 19) { + _libssh2_debug(session, LIBSSH2_TRACE_ERROR, + "host key length too short"); + return -1; + } + + s = hostkey_data; + len = _libssh2_ntohu32(s); + s += 4; + + if(len != 11 || strncmp((char *) s, "ssh-ed25519", 11) != 0) { + return -1; + } + + s += 11; + + /* public key */ + key_len = _libssh2_ntohu32(s); + s += 4; + + if(_libssh2_ed25519_new_public(&ctx, session, s, key_len) != 0) { + return -1; + } + + *abstract = ctx; + + return 0; +} + +/* + * hostkey_method_ssh_ed25519_initPEM + * + * Load a Private Key from a PEM file + */ +static int +hostkey_method_ssh_ed25519_initPEM(LIBSSH2_SESSION * session, + const char *privkeyfile, + unsigned const char *passphrase, + void **abstract) +{ + libssh2_ed25519_ctx *ec_ctx = NULL; + int ret; + + if(*abstract) { + hostkey_method_ssh_ed25519_dtor(session, abstract); + *abstract = NULL; + } + + ret = _libssh2_ed25519_new_private(&ec_ctx, session, + privkeyfile, passphrase); + if(ret) { + return -1; + } + + *abstract = ec_ctx; + + return ret; +} + +/* + * hostkey_method_ssh_ed25519_initPEMFromMemory + * + * Load a Private Key from memory + */ +static int +hostkey_method_ssh_ed25519_initPEMFromMemory(LIBSSH2_SESSION * session, + const char *privkeyfiledata, + size_t privkeyfiledata_len, + unsigned const char *passphrase, + void **abstract) +{ + libssh2_ed25519_ctx *ed_ctx = NULL; + int ret; + + if(abstract != NULL && *abstract) { + hostkey_method_ssh_ed25519_dtor(session, abstract); + *abstract = NULL; + } + + ret = _libssh2_ed25519_new_private_frommemory(&ed_ctx, session, + privkeyfiledata, + privkeyfiledata_len, + passphrase); + if(ret) { + return -1; + } + + if(abstract != NULL) + *abstract = ed_ctx; + + return 0; +} + +/* + * hostkey_method_ssh_ed25519_sig_verify + * + * Verify signature created by remote + */ +static int +hostkey_method_ssh_ed25519_sig_verify(LIBSSH2_SESSION * session, + const unsigned char *sig, + size_t sig_len, + const unsigned char *m, + size_t m_len, void **abstract) +{ + libssh2_ed25519_ctx *ctx = (libssh2_ed25519_ctx *) (*abstract); + (void) session; + + if(sig_len < 19) + return -1; + + /* Skip past keyname_len(4) + keyname(11){"ssh-ed25519"} + + signature_len(4) */ + sig += 19; + sig_len -= 19; + + if(sig_len != LIBSSH2_ED25519_SIG_LEN) + return -1; + + return _libssh2_ed25519_verify(ctx, sig, sig_len, m, m_len); +} + +/* + * hostkey_method_ssh_ed25519_signv + * + * Construct a signature from an array of vectors + */ +static int +hostkey_method_ssh_ed25519_signv(LIBSSH2_SESSION * session, + unsigned char **signature, + size_t *signature_len, + int veccount, + const struct iovec datavec[], + void **abstract) +{ + libssh2_ed25519_ctx *ctx = (libssh2_ed25519_ctx *) (*abstract); + + if(veccount != 1) { + return -1; + } + + return _libssh2_ed25519_sign(ctx, session, signature, signature_len, + datavec[0].iov_base, datavec[0].iov_len); +} + + +/* + * hostkey_method_ssh_ed25519_dtor + * + * Shutdown the hostkey by freeing key context + */ +static int +hostkey_method_ssh_ed25519_dtor(LIBSSH2_SESSION * session, void **abstract) +{ + libssh2_ed25519_ctx *keyctx = (libssh2_ed25519_ctx*) (*abstract); + (void) session; + + if(keyctx) + _libssh2_ed25519_free(keyctx); + + *abstract = NULL; + + return 0; +} + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_ed25519 = { + "ssh-ed25519", + SHA256_DIGEST_LENGTH, + hostkey_method_ssh_ed25519_init, + hostkey_method_ssh_ed25519_initPEM, + hostkey_method_ssh_ed25519_initPEMFromMemory, + hostkey_method_ssh_ed25519_sig_verify, + hostkey_method_ssh_ed25519_signv, + NULL, /* encrypt */ + hostkey_method_ssh_ed25519_dtor, +}; + +#endif /*LIBSSH2_ED25519*/ + + static const LIBSSH2_HOSTKEY_METHOD *hostkey_methods[] = { +#if LIBSSH2_ECDSA + &hostkey_method_ecdsa_ssh_nistp256, + &hostkey_method_ecdsa_ssh_nistp384, + &hostkey_method_ecdsa_ssh_nistp521, +#endif +#if LIBSSH2_ED25519 + &hostkey_method_ssh_ed25519, +#endif #if LIBSSH2_RSA &hostkey_method_ssh_rsa, #endif /* LIBSSH2_RSA */ @@ -505,12 +1024,12 @@ libssh2_hostkey_methods(void) * Returns hash signature * Returned buffer should NOT be freed * Length of buffer is determined by hash type - * i.e. MD5 == 16, SHA1 == 20 + * i.e. MD5 == 16, SHA1 == 20, SHA256 == 32 */ LIBSSH2_API const char * libssh2_hostkey_hash(LIBSSH2_SESSION * session, int hash_type) { - switch (hash_type) { + switch(hash_type) { #if LIBSSH2_MD5 case LIBSSH2_HOSTKEY_HASH_MD5: return (session->server_hostkey_md5_valid) @@ -523,6 +1042,11 @@ libssh2_hostkey_hash(LIBSSH2_SESSION * session, int hash_type) ? (char *) session->server_hostkey_sha1 : NULL; break; + case LIBSSH2_HOSTKEY_HASH_SHA256: + return (session->server_hostkey_sha256_valid) + ? (char *) session->server_hostkey_sha256 + : NULL; + break; default: return NULL; } @@ -530,22 +1054,55 @@ libssh2_hostkey_hash(LIBSSH2_SESSION * session, int hash_type) static int hostkey_type(const unsigned char *hostkey, size_t len) { - const unsigned char rsa[] = { + static const unsigned char rsa[] = { 0, 0, 0, 0x07, 's', 's', 'h', '-', 'r', 's', 'a' }; - const unsigned char dss[] = { + static const unsigned char dss[] = { 0, 0, 0, 0x07, 's', 's', 'h', '-', 'd', 's', 's' }; + static const unsigned char ecdsa_256[] = { + 0, 0, 0, 0x13, 'e', 'c', 'd', 's', 'a', '-', 's', 'h', 'a', '2', '-', + 'n', 'i', 's', 't', 'p', '2', '5', '6' + }; + static const unsigned char ecdsa_384[] = { + 0, 0, 0, 0x13, 'e', 'c', 'd', 's', 'a', '-', 's', 'h', 'a', '2', '-', + 'n', 'i', 's', 't', 'p', '3', '8', '4' + }; + static const unsigned char ecdsa_521[] = { + 0, 0, 0, 0x13, 'e', 'c', 'd', 's', 'a', '-', 's', 'h', 'a', '2', '-', + 'n', 'i', 's', 't', 'p', '5', '2', '1' + }; + static const unsigned char ed25519[] = { + 0, 0, 0, 0x0b, 's', 's', 'h', '-', 'e', 'd', '2', '5', '5', '1', '9' + }; - if (len < 11) + if(len < 11) return LIBSSH2_HOSTKEY_TYPE_UNKNOWN; - if (!memcmp(rsa, hostkey, 11)) + if(!memcmp(rsa, hostkey, 11)) return LIBSSH2_HOSTKEY_TYPE_RSA; - if (!memcmp(dss, hostkey, 11)) + if(!memcmp(dss, hostkey, 11)) return LIBSSH2_HOSTKEY_TYPE_DSS; + if(len < 15) + return LIBSSH2_HOSTKEY_TYPE_UNKNOWN; + + if(!memcmp(ed25519, hostkey, 15)) + return LIBSSH2_HOSTKEY_TYPE_ED25519; + + if(len < 23) + return LIBSSH2_HOSTKEY_TYPE_UNKNOWN; + + if(!memcmp(ecdsa_256, hostkey, 23)) + return LIBSSH2_HOSTKEY_TYPE_ECDSA_256; + + if(!memcmp(ecdsa_384, hostkey, 23)) + return LIBSSH2_HOSTKEY_TYPE_ECDSA_384; + + if(!memcmp(ecdsa_521, hostkey, 23)) + return LIBSSH2_HOSTKEY_TYPE_ECDSA_521; + return LIBSSH2_HOSTKEY_TYPE_UNKNOWN; } @@ -561,7 +1118,7 @@ libssh2_session_hostkey(LIBSSH2_SESSION *session, size_t *len, int *type) if(session->server_hostkey_len) { if(len) *len = session->server_hostkey_len; - if (type) + if(type) *type = hostkey_type(session->server_hostkey, session->server_hostkey_len); return (char *) session->server_hostkey; @@ -570,4 +1127,3 @@ libssh2_session_hostkey(LIBSSH2_SESSION *session, size_t *len, int *type) *len = 0; return NULL; } - diff --git a/vendor/libssh2/src/keepalive.c b/vendor/libssh2/src/keepalive.c index fd749dd29..2151b1710 100644 --- a/vendor/libssh2/src/keepalive.c +++ b/vendor/libssh2/src/keepalive.c @@ -46,7 +46,7 @@ libssh2_keepalive_config (LIBSSH2_SESSION *session, int want_reply, unsigned interval) { - if (interval == 1) + if(interval == 1) session->keepalive_interval = 2; else session->keepalive_interval = interval; @@ -59,20 +59,20 @@ libssh2_keepalive_send (LIBSSH2_SESSION *session, { time_t now; - if (!session->keepalive_interval) { - if (seconds_to_next) + if(!session->keepalive_interval) { + if(seconds_to_next) *seconds_to_next = 0; return 0; } - now = time (NULL); + now = time(NULL); - if (session->keepalive_last_sent + session->keepalive_interval <= now) { + if(session->keepalive_last_sent + session->keepalive_interval <= now) { /* Format is "SSH_MSG_GLOBAL_REQUEST || 4-byte len || str || want-reply". */ unsigned char keepalive_data[] = "\x50\x00\x00\x00\x15keepalive@libssh2.orgW"; - size_t len = sizeof (keepalive_data) - 1; + size_t len = sizeof(keepalive_data) - 1; int rc; keepalive_data[len - 1] = @@ -81,16 +81,17 @@ libssh2_keepalive_send (LIBSSH2_SESSION *session, rc = _libssh2_transport_send(session, keepalive_data, len, NULL, 0); /* Silently ignore PACKET_EAGAIN here: if the write buffer is already full, sending another keepalive is not useful. */ - if (rc && rc != LIBSSH2_ERROR_EAGAIN) { + if(rc && rc != LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send keepalive message"); return rc; } session->keepalive_last_sent = now; - if (seconds_to_next) + if(seconds_to_next) *seconds_to_next = session->keepalive_interval; - } else if (seconds_to_next) { + } + else if(seconds_to_next) { *seconds_to_next = (int) (session->keepalive_last_sent - now) + session->keepalive_interval; } diff --git a/vendor/libssh2/src/kex.c b/vendor/libssh2/src/kex.c index 3634cb5a9..cb1663937 100644 --- a/vendor/libssh2/src/kex.c +++ b/vendor/libssh2/src/kex.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2007, Sara Golemon - * Copyright (c) 2010, Daniel Stenberg + * Copyright (c) 2010-2019, Daniel Stenberg * All rights reserved. * * Redistribution and use in source and binary forms, @@ -43,24 +43,26 @@ #include "mac.h" /* TODO: Switch this to an inline and handle alloc() failures */ -/* Helper macro called from kex_method_diffie_hellman_group1_sha1_key_exchange */ +/* Helper macro called from + kex_method_diffie_hellman_group1_sha1_key_exchange */ #define LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(value, reqlen, version) \ { \ libssh2_sha1_ctx hash; \ unsigned long len = 0; \ - if (!(value)) { \ + if(!(value)) { \ value = LIBSSH2_ALLOC(session, reqlen + SHA_DIGEST_LENGTH); \ } \ - if (value) \ - while (len < (unsigned long)reqlen) { \ + if(value) \ + while(len < (unsigned long)reqlen) { \ libssh2_sha1_init(&hash); \ libssh2_sha1_update(hash, exchange_state->k_value, \ exchange_state->k_value_len); \ libssh2_sha1_update(hash, exchange_state->h_sig_comp, \ SHA_DIGEST_LENGTH); \ - if (len > 0) { \ + if(len > 0) { \ libssh2_sha1_update(hash, value, len); \ - } else { \ + } \ + else { \ libssh2_sha1_update(hash, (version), 1); \ libssh2_sha1_update(hash, session->session_id, \ session->session_id_len); \ @@ -68,35 +70,53 @@ libssh2_sha1_final(hash, (value) + len); \ len += SHA_DIGEST_LENGTH; \ } \ - } + } \ -/* Helper macro called from kex_method_diffie_hellman_group1_sha256_key_exchange */ -#define LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(value, reqlen, version) \ - { \ - libssh2_sha256_ctx hash; \ - unsigned long len = 0; \ - if (!(value)) { \ - value = LIBSSH2_ALLOC(session, reqlen + SHA256_DIGEST_LENGTH); \ - } \ - if (value) \ - while (len < (unsigned long)reqlen) { \ - libssh2_sha256_init(&hash); \ - libssh2_sha256_update(hash, exchange_state->k_value, \ - exchange_state->k_value_len); \ - libssh2_sha256_update(hash, exchange_state->h_sig_comp, \ - SHA256_DIGEST_LENGTH); \ - if (len > 0) { \ - libssh2_sha256_update(hash, value, len); \ - } else { \ - libssh2_sha256_update(hash, (version), 1); \ - libssh2_sha256_update(hash, session->session_id, \ - session->session_id_len); \ - } \ - libssh2_sha256_final(hash, (value) + len); \ - len += SHA256_DIGEST_LENGTH; \ - } \ - } +#define LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(value, reqlen, version) \ + { \ + if(type == LIBSSH2_EC_CURVE_NISTP256) { \ + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, value, reqlen, version); \ + } \ + else if(type == LIBSSH2_EC_CURVE_NISTP384) { \ + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(384, value, reqlen, version); \ + } \ + else if(type == LIBSSH2_EC_CURVE_NISTP521) { \ + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(512, value, reqlen, version); \ + } \ + } \ + + +#define LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(digest_type, value, \ + reqlen, version) \ +{ \ + libssh2_sha##digest_type##_ctx hash; \ + unsigned long len = 0; \ + if(!(value)) { \ + value = LIBSSH2_ALLOC(session, \ + reqlen + SHA##digest_type##_DIGEST_LENGTH); \ + } \ + if(value) \ + while(len < (unsigned long)reqlen) { \ + libssh2_sha##digest_type##_init(&hash); \ + libssh2_sha##digest_type##_update(hash, \ + exchange_state->k_value, \ + exchange_state->k_value_len); \ + libssh2_sha##digest_type##_update(hash, \ + exchange_state->h_sig_comp, \ + SHA##digest_type##_DIGEST_LENGTH); \ + if(len > 0) { \ + libssh2_sha##digest_type##_update(hash, value, len); \ + } \ + else { \ + libssh2_sha##digest_type##_update(hash, (version), 1); \ + libssh2_sha##digest_type##_update(hash, session->session_id, \ + session->session_id_len); \ + } \ + libssh2_sha##digest_type##_final(hash, (value) + len); \ + len += SHA##digest_type##_DIGEST_LENGTH; \ + } \ +} /* @@ -118,37 +138,40 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, int rc; libssh2_sha1_ctx exchange_hash_ctx; - if (exchange_state->state == libssh2_NB_state_idle) { + if(exchange_state->state == libssh2_NB_state_idle) { /* Setup initial values */ exchange_state->e_packet = NULL; exchange_state->s_packet = NULL; exchange_state->k_value = NULL; exchange_state->ctx = _libssh2_bn_ctx_new(); - exchange_state->x = _libssh2_bn_init(); /* Random from client */ + libssh2_dh_init(&exchange_state->x); exchange_state->e = _libssh2_bn_init(); /* g^x mod p */ - exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from server) mod p */ - exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod p */ + exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from + server) mod p */ + exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod + p */ /* Zero the whole thing out */ memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t)); /* Generate x and e */ - _libssh2_bn_rand(exchange_state->x, group_order * 8 - 1, 0, -1); - _libssh2_bn_mod_exp(exchange_state->e, g, exchange_state->x, p, - exchange_state->ctx); + rc = libssh2_dh_key_pair(&exchange_state->x, exchange_state->e, g, p, + group_order, exchange_state->ctx); + if(rc) + goto clean_exit; /* Send KEX init */ /* packet_type(1) + String Length(4) + leading 0(1) */ exchange_state->e_packet_len = _libssh2_bn_bytes(exchange_state->e) + 6; - if (_libssh2_bn_bits(exchange_state->e) % 8) { + if(_libssh2_bn_bits(exchange_state->e) % 8) { /* Leading 00 not needed */ exchange_state->e_packet_len--; } exchange_state->e_packet = LIBSSH2_ALLOC(session, exchange_state->e_packet_len); - if (!exchange_state->e_packet) { + if(!exchange_state->e_packet) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Out of memory error"); goto clean_exit; @@ -156,10 +179,11 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, exchange_state->e_packet[0] = packet_type_init; _libssh2_htonu32(exchange_state->e_packet + 1, exchange_state->e_packet_len - 5); - if (_libssh2_bn_bits(exchange_state->e) % 8) { + if(_libssh2_bn_bits(exchange_state->e) % 8) { _libssh2_bn_to_bin(exchange_state->e, exchange_state->e_packet + 5); - } else { + } + else { exchange_state->e_packet[5] = 0; _libssh2_bn_to_bin(exchange_state->e, exchange_state->e_packet + 6); @@ -170,13 +194,14 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_created; } - if (exchange_state->state == libssh2_NB_state_created) { + if(exchange_state->state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, exchange_state->e_packet, exchange_state->e_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, "Unable to send KEX init message"); goto clean_exit; @@ -184,20 +209,22 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_sent; } - if (exchange_state->state == libssh2_NB_state_sent) { - if (session->burn_optimistic_kexinit) { + if(exchange_state->state == libssh2_NB_state_sent) { + if(session->burn_optimistic_kexinit) { /* The first KEX packet to come along will be the guess initially * sent by the server. That guess turned out to be wrong so we * need to silently ignore it */ int burn_type; _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Waiting for badly guessed KEX packet (to be ignored)"); + "Waiting for badly guessed KEX packet " + "(to be ignored)"); burn_type = _libssh2_packet_burn(session, &exchange_state->burn_state); - if (burn_type == LIBSSH2_ERROR_EAGAIN) { + if(burn_type == LIBSSH2_ERROR_EAGAIN) { return burn_type; - } else if (burn_type <= 0) { + } + else if(burn_type <= 0) { /* Failed to receive a packet */ ret = burn_type; goto clean_exit; @@ -212,16 +239,19 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_sent1; } - if (exchange_state->state == libssh2_NB_state_sent1) { + if(exchange_state->state == libssh2_NB_state_sent1) { /* Wait for KEX reply */ + struct string_buf buf; + size_t host_key_len; + rc = _libssh2_packet_require(session, packet_type_reply, &exchange_state->s_packet, &exchange_state->s_packet_len, 0, NULL, 0, &exchange_state->req_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - if (rc) { + if(rc) { ret = _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT, "Timed out waiting for KEX reply"); goto clean_exit; @@ -234,37 +264,28 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, goto clean_exit; } - exchange_state->s = exchange_state->s_packet + 1; + buf.data = exchange_state->s_packet; + buf.len = exchange_state->s_packet_len; + buf.dataptr = buf.data; + buf.dataptr++; /* advance past type */ - session->server_hostkey_len = _libssh2_ntohu32(exchange_state->s); - exchange_state->s += 4; - - if(session->server_hostkey_len > exchange_state->s_packet_len - 5) { - ret = _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, - "Host key length out of bounds"); - goto clean_exit; - } - - if (session->server_hostkey) + if(session->server_hostkey) LIBSSH2_FREE(session, session->server_hostkey); - session->server_hostkey = - LIBSSH2_ALLOC(session, session->server_hostkey_len); - if (!session->server_hostkey) { + if(_libssh2_copy_string(session, &buf, &(session->server_hostkey), + &host_key_len)) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for a copy " - "of the host key"); + "Could not copy host key"); goto clean_exit; } - memcpy(session->server_hostkey, exchange_state->s, - session->server_hostkey_len); - exchange_state->s += session->server_hostkey_len; + + session->server_hostkey_len = (uint32_t)host_key_len; #if LIBSSH2_MD5 { libssh2_md5_ctx fingerprint_ctx; - if (libssh2_md5_init(&fingerprint_ctx)) { + if(libssh2_md5_init(&fingerprint_ctx)) { libssh2_md5_update(fingerprint_ctx, session->server_hostkey, session->server_hostkey_len); libssh2_md5_final(fingerprint_ctx, @@ -292,7 +313,7 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, { libssh2_sha1_ctx fingerprint_ctx; - if (libssh2_sha1_init(&fingerprint_ctx)) { + if(libssh2_sha1_init(&fingerprint_ctx)) { libssh2_sha1_update(fingerprint_ctx, session->server_hostkey, session->server_hostkey_len); libssh2_sha1_final(fingerprint_ctx, @@ -317,7 +338,38 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, } #endif /* LIBSSH2DEBUG */ - if (session->hostkey->init(session, session->server_hostkey, + { + libssh2_sha256_ctx fingerprint_ctx; + + if(libssh2_sha256_init(&fingerprint_ctx)) { + libssh2_sha256_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_sha256_final(fingerprint_ctx, + session->server_hostkey_sha256); + session->server_hostkey_sha256_valid = TRUE; + } + else { + session->server_hostkey_sha256_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char *base64Fingerprint = NULL; + _libssh2_base64_encode(session, + (const char *) + session->server_hostkey_sha256, + SHA256_DIGEST_LENGTH, &base64Fingerprint); + if(base64Fingerprint != NULL) { + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's SHA256 Fingerprint: %s", + base64Fingerprint); + LIBSSH2_FREE(session, base64Fingerprint); + } + } +#endif /* LIBSSH2DEBUG */ + + + if(session->hostkey->init(session, session->server_hostkey, session->server_hostkey_len, &session->server_hostkey_abstract)) { ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, @@ -325,58 +377,67 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, goto clean_exit; } - exchange_state->f_value_len = _libssh2_ntohu32(exchange_state->s); - exchange_state->s += 4; - exchange_state->f_value = exchange_state->s; - exchange_state->s += exchange_state->f_value_len; + if(_libssh2_get_string(&buf, &(exchange_state->f_value), + &(exchange_state->f_value_len))) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unable to get f value"); + goto clean_exit; + } + _libssh2_bn_from_bin(exchange_state->f, exchange_state->f_value_len, exchange_state->f_value); - exchange_state->h_sig_len = _libssh2_ntohu32(exchange_state->s); - exchange_state->s += 4; - exchange_state->h_sig = exchange_state->s; + if(_libssh2_get_string(&buf, &(exchange_state->h_sig), + &(exchange_state->h_sig_len))) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unable to get h sig"); + goto clean_exit; + } /* Compute the shared secret */ - _libssh2_bn_mod_exp(exchange_state->k, exchange_state->f, - exchange_state->x, p, exchange_state->ctx); + libssh2_dh_secret(&exchange_state->x, exchange_state->k, + exchange_state->f, p, exchange_state->ctx); exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5; - if (_libssh2_bn_bits(exchange_state->k) % 8) { + if(_libssh2_bn_bits(exchange_state->k) % 8) { /* don't need leading 00 */ exchange_state->k_value_len--; } exchange_state->k_value = LIBSSH2_ALLOC(session, exchange_state->k_value_len); - if (!exchange_state->k_value) { + if(!exchange_state->k_value) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate buffer for K"); goto clean_exit; } _libssh2_htonu32(exchange_state->k_value, exchange_state->k_value_len - 4); - if (_libssh2_bn_bits(exchange_state->k) % 8) { + if(_libssh2_bn_bits(exchange_state->k) % 8) { _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4); - } else { + } + else { exchange_state->k_value[4] = 0; _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5); } - exchange_state->exchange_hash = (void*)&exchange_hash_ctx; + exchange_state->exchange_hash = (void *)&exchange_hash_ctx; libssh2_sha1_init(&exchange_hash_ctx); - if (session->local.banner) { + if(session->local.banner) { _libssh2_htonu32(exchange_state->h_sig_comp, strlen((char *) session->local.banner) - 2); libssh2_sha1_update(exchange_hash_ctx, exchange_state->h_sig_comp, 4); libssh2_sha1_update(exchange_hash_ctx, - (char *) session->local.banner, + session->local.banner, strlen((char *) session->local.banner) - 2); - } else { + } + else { _libssh2_htonu32(exchange_state->h_sig_comp, sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); libssh2_sha1_update(exchange_hash_ctx, exchange_state->h_sig_comp, 4); libssh2_sha1_update(exchange_hash_ctx, + (const unsigned char *) LIBSSH2_SSH_DEFAULT_BANNER, sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); } @@ -413,7 +474,7 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, session->server_hostkey, session->server_hostkey_len); - if (packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) { + if(packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) { /* diffie-hellman-group-exchange hashes additional fields */ #ifdef LIBSSH2_DH_GEX_NEW _libssh2_htonu32(exchange_state->h_sig_comp, @@ -432,7 +493,7 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, #endif } - if (midhash) { + if(midhash) { libssh2_sha1_update(exchange_hash_ctx, midhash, midhash_len); } @@ -456,7 +517,7 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, libssh2_sha1_final(exchange_hash_ctx, exchange_state->h_sig_comp); - if (session->hostkey-> + if(session->hostkey-> sig_verify(session, exchange_state->h_sig, exchange_state->h_sig_len, exchange_state->h_sig_comp, 20, &session->server_hostkey_abstract)) { @@ -471,26 +532,29 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_sent2; } - if (exchange_state->state == libssh2_NB_state_sent2) { + if(exchange_state->state == libssh2_NB_state_sent2) { rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { - ret = _libssh2_error(session, rc, "Unable to send NEWKEYS message"); + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Unable to send NEWKEYS message"); goto clean_exit; } exchange_state->state = libssh2_NB_state_sent3; } - if (exchange_state->state == libssh2_NB_state_sent3) { + if(exchange_state->state == libssh2_NB_state_sent3) { rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS, &exchange_state->tmp, &exchange_state->tmp_len, 0, NULL, 0, &exchange_state->req_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, "Timed out waiting for NEWKEYS"); goto clean_exit; } @@ -503,46 +567,52 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, for this packet type anyway */ LIBSSH2_FREE(session, exchange_state->tmp); - if (!session->session_id) { + if(!session->session_id) { session->session_id = LIBSSH2_ALLOC(session, SHA_DIGEST_LENGTH); - if (!session->session_id) { + if(!session->session_id) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate buffer for SHA digest"); + "Unable to allocate buffer for " + "SHA digest"); goto clean_exit; } memcpy(session->session_id, exchange_state->h_sig_comp, SHA_DIGEST_LENGTH); session->session_id_len = SHA_DIGEST_LENGTH; - _libssh2_debug(session, LIBSSH2_TRACE_KEX, "session_id calculated"); + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "session_id calculated"); } /* Cleanup any existing cipher */ - if (session->local.crypt->dtor) { + if(session->local.crypt->dtor) { session->local.crypt->dtor(session, &session->local.crypt_abstract); } /* Calculate IV/Secret/Key for each direction */ - if (session->local.crypt->init) { + if(session->local.crypt->init) { unsigned char *iv = NULL, *secret = NULL; int free_iv = 0, free_secret = 0; LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv, session->local.crypt-> - iv_len, "A"); - if (!iv) { + iv_len, + (const unsigned char *) + "A"); + if(!iv) { ret = -1; goto clean_exit; } LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret, session->local.crypt-> - secret_len, "C"); - if (!secret) { + secret_len, + (const unsigned char *) + "C"); + if(!secret) { LIBSSH2_FREE(session, iv); ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } - if (session->local.crypt-> + if(session->local.crypt-> init(session, session->local.crypt, iv, &free_iv, secret, &free_secret, 1, &session->local.crypt_abstract)) { LIBSSH2_FREE(session, iv); @@ -551,45 +621,50 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, goto clean_exit; } - if (free_iv) { - memset(iv, 0, session->local.crypt->iv_len); + if(free_iv) { + _libssh2_explicit_zero(iv, session->local.crypt->iv_len); LIBSSH2_FREE(session, iv); } - if (free_secret) { - memset(secret, 0, session->local.crypt->secret_len); + if(free_secret) { + _libssh2_explicit_zero(secret, + session->local.crypt->secret_len); LIBSSH2_FREE(session, secret); } } _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Client to Server IV and Key calculated"); - if (session->remote.crypt->dtor) { + if(session->remote.crypt->dtor) { /* Cleanup any existing cipher */ session->remote.crypt->dtor(session, &session->remote.crypt_abstract); } - if (session->remote.crypt->init) { + if(session->remote.crypt->init) { unsigned char *iv = NULL, *secret = NULL; int free_iv = 0, free_secret = 0; LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv, session->remote.crypt-> - iv_len, "B"); - if (!iv) { + iv_len, + (const unsigned char *) + "B"); + if(!iv) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret, session->remote.crypt-> - secret_len, "D"); - if (!secret) { + secret_len, + (const unsigned char *) + "D"); + if(!secret) { LIBSSH2_FREE(session, iv); ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } - if (session->remote.crypt-> + if(session->remote.crypt-> init(session, session->remote.crypt, iv, &free_iv, secret, &free_secret, 0, &session->remote.crypt_abstract)) { LIBSSH2_FREE(session, iv); @@ -598,65 +673,70 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, goto clean_exit; } - if (free_iv) { - memset(iv, 0, session->remote.crypt->iv_len); + if(free_iv) { + _libssh2_explicit_zero(iv, session->remote.crypt->iv_len); LIBSSH2_FREE(session, iv); } - if (free_secret) { - memset(secret, 0, session->remote.crypt->secret_len); + if(free_secret) { + _libssh2_explicit_zero(secret, + session->remote.crypt->secret_len); LIBSSH2_FREE(session, secret); } } _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Server to Client IV and Key calculated"); - if (session->local.mac->dtor) { + if(session->local.mac->dtor) { session->local.mac->dtor(session, &session->local.mac_abstract); } - if (session->local.mac->init) { + if(session->local.mac->init) { unsigned char *key = NULL; int free_key = 0; LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key, session->local.mac-> - key_len, "E"); - if (!key) { + key_len, + (const unsigned char *) + "E"); + if(!key) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } session->local.mac->init(session, key, &free_key, &session->local.mac_abstract); - if (free_key) { - memset(key, 0, session->local.mac->key_len); + if(free_key) { + _libssh2_explicit_zero(key, session->local.mac->key_len); LIBSSH2_FREE(session, key); } } _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Client to Server HMAC Key calculated"); - if (session->remote.mac->dtor) { + if(session->remote.mac->dtor) { session->remote.mac->dtor(session, &session->remote.mac_abstract); } - if (session->remote.mac->init) { + if(session->remote.mac->init) { unsigned char *key = NULL; int free_key = 0; LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key, session->remote.mac-> - key_len, "F"); - if (!key) { + key_len, + (const unsigned char *) + "F"); + if(!key) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } session->remote.mac->init(session, key, &free_key, &session->remote.mac_abstract); - if (free_key) { - memset(key, 0, session->remote.mac->key_len); + if(free_key) { + _libssh2_explicit_zero(key, session->remote.mac->key_len); LIBSSH2_FREE(session, key); } } @@ -666,13 +746,13 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, /* Initialize compression for each direction */ /* Cleanup any existing compression */ - if (session->local.comp && session->local.comp->dtor) { + if(session->local.comp && session->local.comp->dtor) { session->local.comp->dtor(session, 1, &session->local.comp_abstract); } - if (session->local.comp && session->local.comp->init) { - if (session->local.comp->init(session, 1, + if(session->local.comp && session->local.comp->init) { + if(session->local.comp->init(session, 1, &session->local.comp_abstract)) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; @@ -681,13 +761,13 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Client to Server compression initialized"); - if (session->remote.comp && session->remote.comp->dtor) { + if(session->remote.comp && session->remote.comp->dtor) { session->remote.comp->dtor(session, 0, &session->remote.comp_abstract); } - if (session->remote.comp && session->remote.comp->init) { - if (session->remote.comp->init(session, 0, + if(session->remote.comp && session->remote.comp->init) { + if(session->remote.comp->init(session, 0, &session->remote.comp_abstract)) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; @@ -699,8 +779,7 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, } clean_exit: - _libssh2_bn_free(exchange_state->x); - exchange_state->x = NULL; + libssh2_dh_dtor(&exchange_state->x); _libssh2_bn_free(exchange_state->e); exchange_state->e = NULL; _libssh2_bn_free(exchange_state->f); @@ -710,17 +789,17 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, _libssh2_bn_ctx_free(exchange_state->ctx); exchange_state->ctx = NULL; - if (exchange_state->e_packet) { + if(exchange_state->e_packet) { LIBSSH2_FREE(session, exchange_state->e_packet); exchange_state->e_packet = NULL; } - if (exchange_state->s_packet) { + if(exchange_state->s_packet) { LIBSSH2_FREE(session, exchange_state->s_packet); exchange_state->s_packet = NULL; } - if (exchange_state->k_value) { + if(exchange_state->k_value) { LIBSSH2_FREE(session, exchange_state->k_value); exchange_state->k_value = NULL; } @@ -750,37 +829,40 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, int rc; libssh2_sha256_ctx exchange_hash_ctx; - if (exchange_state->state == libssh2_NB_state_idle) { + if(exchange_state->state == libssh2_NB_state_idle) { /* Setup initial values */ exchange_state->e_packet = NULL; exchange_state->s_packet = NULL; exchange_state->k_value = NULL; exchange_state->ctx = _libssh2_bn_ctx_new(); - exchange_state->x = _libssh2_bn_init(); /* Random from client */ + libssh2_dh_init(&exchange_state->x); exchange_state->e = _libssh2_bn_init(); /* g^x mod p */ - exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from server) mod p */ - exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod p */ + exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from + server) mod p */ + exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod + p */ /* Zero the whole thing out */ memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t)); /* Generate x and e */ - _libssh2_bn_rand(exchange_state->x, group_order * 8 - 1, 0, -1); - _libssh2_bn_mod_exp(exchange_state->e, g, exchange_state->x, p, - exchange_state->ctx); + rc = libssh2_dh_key_pair(&exchange_state->x, exchange_state->e, g, p, + group_order, exchange_state->ctx); + if(rc) + goto clean_exit; /* Send KEX init */ /* packet_type(1) + String Length(4) + leading 0(1) */ exchange_state->e_packet_len = _libssh2_bn_bytes(exchange_state->e) + 6; - if (_libssh2_bn_bits(exchange_state->e) % 8) { + if(_libssh2_bn_bits(exchange_state->e) % 8) { /* Leading 00 not needed */ exchange_state->e_packet_len--; } exchange_state->e_packet = LIBSSH2_ALLOC(session, exchange_state->e_packet_len); - if (!exchange_state->e_packet) { + if(!exchange_state->e_packet) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Out of memory error"); goto clean_exit; @@ -788,10 +870,11 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, exchange_state->e_packet[0] = packet_type_init; _libssh2_htonu32(exchange_state->e_packet + 1, exchange_state->e_packet_len - 5); - if (_libssh2_bn_bits(exchange_state->e) % 8) { + if(_libssh2_bn_bits(exchange_state->e) % 8) { _libssh2_bn_to_bin(exchange_state->e, exchange_state->e_packet + 5); - } else { + } + else { exchange_state->e_packet[5] = 0; _libssh2_bn_to_bin(exchange_state->e, exchange_state->e_packet + 6); @@ -802,13 +885,14 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_created; } - if (exchange_state->state == libssh2_NB_state_created) { + if(exchange_state->state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, exchange_state->e_packet, exchange_state->e_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, "Unable to send KEX init message"); goto clean_exit; @@ -816,20 +900,22 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_sent; } - if (exchange_state->state == libssh2_NB_state_sent) { - if (session->burn_optimistic_kexinit) { + if(exchange_state->state == libssh2_NB_state_sent) { + if(session->burn_optimistic_kexinit) { /* The first KEX packet to come along will be the guess initially * sent by the server. That guess turned out to be wrong so we * need to silently ignore it */ int burn_type; _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Waiting for badly guessed KEX packet (to be ignored)"); + "Waiting for badly guessed KEX packet " + "(to be ignored)"); burn_type = _libssh2_packet_burn(session, &exchange_state->burn_state); - if (burn_type == LIBSSH2_ERROR_EAGAIN) { + if(burn_type == LIBSSH2_ERROR_EAGAIN) { return burn_type; - } else if (burn_type <= 0) { + } + else if(burn_type <= 0) { /* Failed to receive a packet */ ret = burn_type; goto clean_exit; @@ -844,16 +930,19 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_sent1; } - if (exchange_state->state == libssh2_NB_state_sent1) { + if(exchange_state->state == libssh2_NB_state_sent1) { /* Wait for KEX reply */ + struct string_buf buf; + size_t host_key_len; + rc = _libssh2_packet_require(session, packet_type_reply, &exchange_state->s_packet, &exchange_state->s_packet_len, 0, NULL, 0, &exchange_state->req_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - if (rc) { + if(rc) { ret = _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT, "Timed out waiting for KEX reply"); goto clean_exit; @@ -865,38 +954,29 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, "Unexpected packet length"); goto clean_exit; } - - exchange_state->s = exchange_state->s_packet + 1; - session->server_hostkey_len = _libssh2_ntohu32(exchange_state->s); - exchange_state->s += 4; + buf.data = exchange_state->s_packet; + buf.len = exchange_state->s_packet_len; + buf.dataptr = buf.data; + buf.dataptr++; /* advance past type */ - if(session->server_hostkey_len > exchange_state->s_packet_len - 5) { - ret = _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, - "Host key length out of bounds"); - goto clean_exit; - } - - if (session->server_hostkey) + if(session->server_hostkey) LIBSSH2_FREE(session, session->server_hostkey); - session->server_hostkey = - LIBSSH2_ALLOC(session, session->server_hostkey_len); - if (!session->server_hostkey) { + if(_libssh2_copy_string(session, &buf, &(session->server_hostkey), + &host_key_len)) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for a copy " - "of the host key"); + "Could not copy host key"); goto clean_exit; } - memcpy(session->server_hostkey, exchange_state->s, - session->server_hostkey_len); - exchange_state->s += session->server_hostkey_len; + + session->server_hostkey_len = (uint32_t)host_key_len; #if LIBSSH2_MD5 { libssh2_md5_ctx fingerprint_ctx; - if (libssh2_md5_init(&fingerprint_ctx)) { + if(libssh2_md5_init(&fingerprint_ctx)) { libssh2_md5_update(fingerprint_ctx, session->server_hostkey, session->server_hostkey_len); libssh2_md5_final(fingerprint_ctx, @@ -924,7 +1004,7 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, { libssh2_sha1_ctx fingerprint_ctx; - if (libssh2_sha1_init(&fingerprint_ctx)) { + if(libssh2_sha1_init(&fingerprint_ctx)) { libssh2_sha1_update(fingerprint_ctx, session->server_hostkey, session->server_hostkey_len); libssh2_sha1_final(fingerprint_ctx, @@ -949,7 +1029,37 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, } #endif /* LIBSSH2DEBUG */ - if (session->hostkey->init(session, session->server_hostkey, + { + libssh2_sha256_ctx fingerprint_ctx; + + if(libssh2_sha256_init(&fingerprint_ctx)) { + libssh2_sha256_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_sha256_final(fingerprint_ctx, + session->server_hostkey_sha256); + session->server_hostkey_sha256_valid = TRUE; + } + else { + session->server_hostkey_sha256_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char *base64Fingerprint = NULL; + _libssh2_base64_encode(session, + (const char *) + session->server_hostkey_sha256, + SHA256_DIGEST_LENGTH, &base64Fingerprint); + if(base64Fingerprint != NULL) { + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's SHA256 Fingerprint: %s", + base64Fingerprint); + LIBSSH2_FREE(session, base64Fingerprint); + } + } +#endif /* LIBSSH2DEBUG */ + + if(session->hostkey->init(session, session->server_hostkey, session->server_hostkey_len, &session->server_hostkey_abstract)) { ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, @@ -957,58 +1067,67 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, goto clean_exit; } - exchange_state->f_value_len = _libssh2_ntohu32(exchange_state->s); - exchange_state->s += 4; - exchange_state->f_value = exchange_state->s; - exchange_state->s += exchange_state->f_value_len; + if(_libssh2_get_string(&buf, &(exchange_state->f_value), + &(exchange_state->f_value_len))) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unable to get f value"); + goto clean_exit; + } + _libssh2_bn_from_bin(exchange_state->f, exchange_state->f_value_len, exchange_state->f_value); - exchange_state->h_sig_len = _libssh2_ntohu32(exchange_state->s); - exchange_state->s += 4; - exchange_state->h_sig = exchange_state->s; + if(_libssh2_get_string(&buf, &(exchange_state->h_sig), + &(exchange_state->h_sig_len))) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unable to get h sig"); + goto clean_exit; + } /* Compute the shared secret */ - _libssh2_bn_mod_exp(exchange_state->k, exchange_state->f, - exchange_state->x, p, exchange_state->ctx); + libssh2_dh_secret(&exchange_state->x, exchange_state->k, + exchange_state->f, p, exchange_state->ctx); exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5; - if (_libssh2_bn_bits(exchange_state->k) % 8) { + if(_libssh2_bn_bits(exchange_state->k) % 8) { /* don't need leading 00 */ exchange_state->k_value_len--; } exchange_state->k_value = LIBSSH2_ALLOC(session, exchange_state->k_value_len); - if (!exchange_state->k_value) { + if(!exchange_state->k_value) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate buffer for K"); goto clean_exit; } _libssh2_htonu32(exchange_state->k_value, exchange_state->k_value_len - 4); - if (_libssh2_bn_bits(exchange_state->k) % 8) { + if(_libssh2_bn_bits(exchange_state->k) % 8) { _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4); - } else { + } + else { exchange_state->k_value[4] = 0; _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5); } - exchange_state->exchange_hash = (void*)&exchange_hash_ctx; + exchange_state->exchange_hash = (void *)&exchange_hash_ctx; libssh2_sha256_init(&exchange_hash_ctx); - if (session->local.banner) { + if(session->local.banner) { _libssh2_htonu32(exchange_state->h_sig_comp, strlen((char *) session->local.banner) - 2); libssh2_sha256_update(exchange_hash_ctx, exchange_state->h_sig_comp, 4); libssh2_sha256_update(exchange_hash_ctx, - (char *) session->local.banner, + session->local.banner, strlen((char *) session->local.banner) - 2); - } else { + } + else { _libssh2_htonu32(exchange_state->h_sig_comp, sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); libssh2_sha256_update(exchange_hash_ctx, exchange_state->h_sig_comp, 4); libssh2_sha256_update(exchange_hash_ctx, + (const unsigned char *) LIBSSH2_SSH_DEFAULT_BANNER, sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); } @@ -1045,7 +1164,7 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, session->server_hostkey, session->server_hostkey_len); - if (packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) { + if(packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) { /* diffie-hellman-group-exchange hashes additional fields */ #ifdef LIBSSH2_DH_GEX_NEW _libssh2_htonu32(exchange_state->h_sig_comp, @@ -1064,7 +1183,7 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, #endif } - if (midhash) { + if(midhash) { libssh2_sha256_update(exchange_hash_ctx, midhash, midhash_len); } @@ -1088,10 +1207,11 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, libssh2_sha256_final(exchange_hash_ctx, exchange_state->h_sig_comp); - if (session->hostkey-> - sig_verify(session, exchange_state->h_sig, - exchange_state->h_sig_len, exchange_state->h_sig_comp, - SHA256_DIGEST_LENGTH, &session->server_hostkey_abstract)) { + if(session->hostkey-> + sig_verify(session, exchange_state->h_sig, + exchange_state->h_sig_len, exchange_state->h_sig_comp, + SHA256_DIGEST_LENGTH, + &session->server_hostkey_abstract)) { ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN, "Unable to verify hostkey signature"); goto clean_exit; @@ -1105,26 +1225,29 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, exchange_state->state = libssh2_NB_state_sent2; } - if (exchange_state->state == libssh2_NB_state_sent2) { + if(exchange_state->state == libssh2_NB_state_sent2) { rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { - ret = _libssh2_error(session, rc, "Unable to send NEWKEYS message"); + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Unable to send NEWKEYS message"); goto clean_exit; } exchange_state->state = libssh2_NB_state_sent3; } - if (exchange_state->state == libssh2_NB_state_sent3) { + if(exchange_state->state == libssh2_NB_state_sent3) { rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS, &exchange_state->tmp, &exchange_state->tmp_len, 0, NULL, 0, &exchange_state->req_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, "Timed out waiting for NEWKEYS"); goto clean_exit; } @@ -1137,46 +1260,50 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, for this packet type anyway */ LIBSSH2_FREE(session, exchange_state->tmp); - if (!session->session_id) { + if(!session->session_id) { session->session_id = LIBSSH2_ALLOC(session, SHA256_DIGEST_LENGTH); - if (!session->session_id) { + if(!session->session_id) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate buffer for SHA digest"); + "Unable to allocate buffer for " + "SHA digest"); goto clean_exit; } memcpy(session->session_id, exchange_state->h_sig_comp, SHA256_DIGEST_LENGTH); session->session_id_len = SHA256_DIGEST_LENGTH; - _libssh2_debug(session, LIBSSH2_TRACE_KEX, "session_id calculated"); + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "session_id calculated"); } /* Cleanup any existing cipher */ - if (session->local.crypt->dtor) { + if(session->local.crypt->dtor) { session->local.crypt->dtor(session, &session->local.crypt_abstract); } /* Calculate IV/Secret/Key for each direction */ - if (session->local.crypt->init) { + if(session->local.crypt->init) { unsigned char *iv = NULL, *secret = NULL; int free_iv = 0, free_secret = 0; - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(iv, - session->local.crypt-> - iv_len, "A"); - if (!iv) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv, + session->local.crypt-> + iv_len, + (const unsigned char *)"A"); + if(!iv) { ret = -1; goto clean_exit; } - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(secret, - session->local.crypt-> - secret_len, "C"); - if (!secret) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret, + session->local.crypt-> + secret_len, + (const unsigned char *)"C"); + if(!secret) { LIBSSH2_FREE(session, iv); ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } - if (session->local.crypt-> + if(session->local.crypt-> init(session, session->local.crypt, iv, &free_iv, secret, &free_secret, 1, &session->local.crypt_abstract)) { LIBSSH2_FREE(session, iv); @@ -1185,45 +1312,48 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, goto clean_exit; } - if (free_iv) { - memset(iv, 0, session->local.crypt->iv_len); + if(free_iv) { + _libssh2_explicit_zero(iv, session->local.crypt->iv_len); LIBSSH2_FREE(session, iv); } - if (free_secret) { - memset(secret, 0, session->local.crypt->secret_len); + if(free_secret) { + _libssh2_explicit_zero(secret, + session->local.crypt->secret_len); LIBSSH2_FREE(session, secret); } } _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Client to Server IV and Key calculated"); - if (session->remote.crypt->dtor) { + if(session->remote.crypt->dtor) { /* Cleanup any existing cipher */ session->remote.crypt->dtor(session, &session->remote.crypt_abstract); } - if (session->remote.crypt->init) { + if(session->remote.crypt->init) { unsigned char *iv = NULL, *secret = NULL; int free_iv = 0, free_secret = 0; - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(iv, - session->remote.crypt-> - iv_len, "B"); - if (!iv) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv, + session->remote.crypt-> + iv_len, + (const unsigned char *)"B"); + if(!iv) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(secret, - session->remote.crypt-> - secret_len, "D"); - if (!secret) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret, + session->remote.crypt-> + secret_len, + (const unsigned char *)"D"); + if(!secret) { LIBSSH2_FREE(session, iv); ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } - if (session->remote.crypt-> + if(session->remote.crypt-> init(session, session->remote.crypt, iv, &free_iv, secret, &free_secret, 0, &session->remote.crypt_abstract)) { LIBSSH2_FREE(session, iv); @@ -1232,65 +1362,68 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, goto clean_exit; } - if (free_iv) { - memset(iv, 0, session->remote.crypt->iv_len); + if(free_iv) { + _libssh2_explicit_zero(iv, session->remote.crypt->iv_len); LIBSSH2_FREE(session, iv); } - if (free_secret) { - memset(secret, 0, session->remote.crypt->secret_len); + if(free_secret) { + _libssh2_explicit_zero(secret, + session->remote.crypt->secret_len); LIBSSH2_FREE(session, secret); } } _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Server to Client IV and Key calculated"); - if (session->local.mac->dtor) { + if(session->local.mac->dtor) { session->local.mac->dtor(session, &session->local.mac_abstract); } - if (session->local.mac->init) { + if(session->local.mac->init) { unsigned char *key = NULL; int free_key = 0; - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(key, - session->local.mac-> - key_len, "E"); - if (!key) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key, + session->local.mac-> + key_len, + (const unsigned char *)"E"); + if(!key) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } session->local.mac->init(session, key, &free_key, &session->local.mac_abstract); - if (free_key) { - memset(key, 0, session->local.mac->key_len); + if(free_key) { + _libssh2_explicit_zero(key, session->local.mac->key_len); LIBSSH2_FREE(session, key); } } _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Client to Server HMAC Key calculated"); - if (session->remote.mac->dtor) { + if(session->remote.mac->dtor) { session->remote.mac->dtor(session, &session->remote.mac_abstract); } - if (session->remote.mac->init) { + if(session->remote.mac->init) { unsigned char *key = NULL; int free_key = 0; - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA256_HASH(key, - session->remote.mac-> - key_len, "F"); - if (!key) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key, + session->remote.mac-> + key_len, + (const unsigned char *)"F"); + if(!key) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } session->remote.mac->init(session, key, &free_key, &session->remote.mac_abstract); - if (free_key) { - memset(key, 0, session->remote.mac->key_len); + if(free_key) { + _libssh2_explicit_zero(key, session->remote.mac->key_len); LIBSSH2_FREE(session, key); } } @@ -1300,13 +1433,13 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, /* Initialize compression for each direction */ /* Cleanup any existing compression */ - if (session->local.comp && session->local.comp->dtor) { + if(session->local.comp && session->local.comp->dtor) { session->local.comp->dtor(session, 1, &session->local.comp_abstract); } - if (session->local.comp && session->local.comp->init) { - if (session->local.comp->init(session, 1, + if(session->local.comp && session->local.comp->init) { + if(session->local.comp->init(session, 1, &session->local.comp_abstract)) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; @@ -1315,13 +1448,13 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Client to Server compression initialized"); - if (session->remote.comp && session->remote.comp->dtor) { + if(session->remote.comp && session->remote.comp->dtor) { session->remote.comp->dtor(session, 0, &session->remote.comp_abstract); } - if (session->remote.comp && session->remote.comp->init) { - if (session->remote.comp->init(session, 0, + if(session->remote.comp && session->remote.comp->init) { + if(session->remote.comp->init(session, 0, &session->remote.comp_abstract)) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; @@ -1333,8 +1466,7 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, } clean_exit: - _libssh2_bn_free(exchange_state->x); - exchange_state->x = NULL; + libssh2_dh_dtor(&exchange_state->x); _libssh2_bn_free(exchange_state->e); exchange_state->e = NULL; _libssh2_bn_free(exchange_state->f); @@ -1344,17 +1476,17 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, _libssh2_bn_ctx_free(exchange_state->ctx); exchange_state->ctx = NULL; - if (exchange_state->e_packet) { + if(exchange_state->e_packet) { LIBSSH2_FREE(session, exchange_state->e_packet); exchange_state->e_packet = NULL; } - if (exchange_state->s_packet) { + if(exchange_state->s_packet) { LIBSSH2_FREE(session, exchange_state->s_packet); exchange_state->s_packet = NULL; } - if (exchange_state->k_value) { + if(exchange_state->k_value) { LIBSSH2_FREE(session, exchange_state->k_value); exchange_state->k_value = NULL; } @@ -1395,9 +1527,10 @@ kex_method_diffie_hellman_group1_sha1_key_exchange(LIBSSH2_SESSION *session, int ret; - if (key_state->state == libssh2_NB_state_idle) { + if(key_state->state == libssh2_NB_state_idle) { /* g == 2 */ - key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value (p_value) */ + key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value + (p_value) */ key_state->g = _libssh2_bn_init(); /* SSH2 defined value (2) */ /* Initialize P and G */ @@ -1412,7 +1545,7 @@ kex_method_diffie_hellman_group1_sha1_key_exchange(LIBSSH2_SESSION *session, ret = diffie_hellman_sha1(session, key_state->g, key_state->p, 128, SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY, NULL, 0, &key_state->exchange_state); - if (ret == LIBSSH2_ERROR_EAGAIN) { + if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1471,8 +1604,9 @@ kex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session, }; int ret; - if (key_state->state == libssh2_NB_state_idle) { - key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value (p_value) */ + if(key_state->state == libssh2_NB_state_idle) { + key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value + (p_value) */ key_state->g = _libssh2_bn_init(); /* SSH2 defined value (2) */ /* g == 2 */ @@ -1488,7 +1622,7 @@ kex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session, ret = diffie_hellman_sha1(session, key_state->g, key_state->p, 256, SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY, NULL, 0, &key_state->exchange_state); - if (ret == LIBSSH2_ERROR_EAGAIN) { + if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1511,11 +1645,10 @@ static int kex_method_diffie_hellman_group_exchange_sha1_key_exchange (LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state) { - unsigned long p_len, g_len; int ret = 0; int rc; - if (key_state->state == libssh2_NB_state_idle) { + if(key_state->state == libssh2_NB_state_idle) { key_state->p = _libssh2_bn_init_from_bin(); key_state->g = _libssh2_bn_init_from_bin(); /* Ask for a P and G pair */ @@ -1526,24 +1659,27 @@ kex_method_diffie_hellman_group_exchange_sha1_key_exchange _libssh2_htonu32(key_state->request + 9, LIBSSH2_DH_GEX_MAXGROUP); key_state->request_len = 13; _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Initiating Diffie-Hellman Group-Exchange (New Method)"); + "Initiating Diffie-Hellman Group-Exchange " + "(New Method)"); #else key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST_OLD; _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_OPTGROUP); key_state->request_len = 5; _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Initiating Diffie-Hellman Group-Exchange (Old Method)"); + "Initiating Diffie-Hellman Group-Exchange " + "(Old Method)"); #endif key_state->state = libssh2_NB_state_created; } - if (key_state->state == libssh2_NB_state_created) { + if(key_state->state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, key_state->request, key_state->request_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, "Unable to send Group Exchange Request"); goto dh_gex_clean_exit; @@ -1552,13 +1688,14 @@ kex_method_diffie_hellman_group_exchange_sha1_key_exchange key_state->state = libssh2_NB_state_sent; } - if (key_state->state == libssh2_NB_state_sent) { + if(key_state->state == libssh2_NB_state_sent) { rc = _libssh2_packet_require(session, SSH_MSG_KEX_DH_GEX_GROUP, &key_state->data, &key_state->data_len, 0, NULL, 0, &key_state->req_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, "Timeout waiting for GEX_GROUP reply"); goto dh_gex_clean_exit; @@ -1567,16 +1704,37 @@ kex_method_diffie_hellman_group_exchange_sha1_key_exchange key_state->state = libssh2_NB_state_sent1; } - if (key_state->state == libssh2_NB_state_sent1) { - unsigned char *s = key_state->data + 1; - p_len = _libssh2_ntohu32(s); - s += 4; - _libssh2_bn_from_bin(key_state->p, p_len, s); - s += p_len; + if(key_state->state == libssh2_NB_state_sent1) { + size_t p_len, g_len; + unsigned char *p, *g; + struct string_buf buf; - g_len = _libssh2_ntohu32(s); - s += 4; - _libssh2_bn_from_bin(key_state->g, g_len, s); + if(key_state->data_len < 9) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected key length"); + goto dh_gex_clean_exit; + } + + buf.data = key_state->data; + buf.dataptr = buf.data; + buf.len = key_state->data_len; + + buf.dataptr++; /* increment to big num */ + + if(_libssh2_get_bignum_bytes(&buf, &p, &p_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected value"); + goto dh_gex_clean_exit; + } + + if(_libssh2_get_bignum_bytes(&buf, &g, &g_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected value"); + goto dh_gex_clean_exit; + } + + _libssh2_bn_from_bin(key_state->p, p_len, p); + _libssh2_bn_from_bin(key_state->g, g_len, g); ret = diffie_hellman_sha1(session, key_state->g, key_state->p, p_len, SSH_MSG_KEX_DH_GEX_INIT, @@ -1584,7 +1742,7 @@ kex_method_diffie_hellman_group_exchange_sha1_key_exchange key_state->data + 1, key_state->data_len - 1, &key_state->exchange_state); - if (ret == LIBSSH2_ERROR_EAGAIN) { + if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1611,11 +1769,10 @@ static int kex_method_diffie_hellman_group_exchange_sha256_key_exchange (LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state) { - unsigned long p_len, g_len; int ret = 0; int rc; - if (key_state->state == libssh2_NB_state_idle) { + if(key_state->state == libssh2_NB_state_idle) { key_state->p = _libssh2_bn_init(); key_state->g = _libssh2_bn_init(); /* Ask for a P and G pair */ @@ -1626,39 +1783,44 @@ kex_method_diffie_hellman_group_exchange_sha256_key_exchange _libssh2_htonu32(key_state->request + 9, LIBSSH2_DH_GEX_MAXGROUP); key_state->request_len = 13; _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Initiating Diffie-Hellman Group-Exchange (New Method SHA256)"); + "Initiating Diffie-Hellman Group-Exchange " + "(New Method SHA256)"); #else key_state->request[0] = SSH_MSG_KEX_DH_GEX_REQUEST_OLD; _libssh2_htonu32(key_state->request + 1, LIBSSH2_DH_GEX_OPTGROUP); key_state->request_len = 5; _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Initiating Diffie-Hellman Group-Exchange (Old Method SHA256)"); + "Initiating Diffie-Hellman Group-Exchange " + "(Old Method SHA256)"); #endif key_state->state = libssh2_NB_state_created; } - if (key_state->state == libssh2_NB_state_created) { + if(key_state->state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, key_state->request, key_state->request_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, - "Unable to send Group Exchange Request SHA256"); + "Unable to send " + "Group Exchange Request SHA256"); goto dh_gex_clean_exit; } key_state->state = libssh2_NB_state_sent; } - if (key_state->state == libssh2_NB_state_sent) { + if(key_state->state == libssh2_NB_state_sent) { rc = _libssh2_packet_require(session, SSH_MSG_KEX_DH_GEX_GROUP, &key_state->data, &key_state->data_len, 0, NULL, 0, &key_state->req_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { ret = _libssh2_error(session, rc, "Timeout waiting for GEX_GROUP reply SHA256"); goto dh_gex_clean_exit; @@ -1667,16 +1829,37 @@ kex_method_diffie_hellman_group_exchange_sha256_key_exchange key_state->state = libssh2_NB_state_sent1; } - if (key_state->state == libssh2_NB_state_sent1) { - unsigned char *s = key_state->data + 1; - p_len = _libssh2_ntohu32(s); - s += 4; - _libssh2_bn_from_bin(key_state->p, p_len, s); - s += p_len; + if(key_state->state == libssh2_NB_state_sent1) { + unsigned char *p, *g; + size_t p_len, g_len; + struct string_buf buf; - g_len = _libssh2_ntohu32(s); - s += 4; - _libssh2_bn_from_bin(key_state->g, g_len, s); + if(key_state->data_len < 9) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected key length"); + goto dh_gex_clean_exit; + } + + buf.data = key_state->data; + buf.dataptr = buf.data; + buf.len = key_state->data_len; + + buf.dataptr++; /* increment to big num */ + + if(_libssh2_get_bignum_bytes(&buf, &p, &p_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected value"); + goto dh_gex_clean_exit; + } + + if(_libssh2_get_bignum_bytes(&buf, &g, &g_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected value"); + goto dh_gex_clean_exit; + } + + _libssh2_bn_from_bin(key_state->p, p_len, p); + _libssh2_bn_from_bin(key_state->g, g_len, g); ret = diffie_hellman_sha256(session, key_state->g, key_state->p, p_len, SSH_MSG_KEX_DH_GEX_INIT, @@ -1684,7 +1867,7 @@ kex_method_diffie_hellman_group_exchange_sha256_key_exchange key_state->data + 1, key_state->data_len - 1, &key_state->exchange_state); - if (ret == LIBSSH2_ERROR_EAGAIN) { + if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1702,144 +1885,1556 @@ kex_method_diffie_hellman_group_exchange_sha256_key_exchange } -#define LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY 0x0001 -#define LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY 0x0002 - -static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group1_sha1 = { - "diffie-hellman-group1-sha1", - kex_method_diffie_hellman_group1_sha1_key_exchange, - LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, -}; - -static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group14_sha1 = { - "diffie-hellman-group14-sha1", - kex_method_diffie_hellman_group14_sha1_key_exchange, - LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, -}; - -static const LIBSSH2_KEX_METHOD -kex_method_diffie_helman_group_exchange_sha1 = { - "diffie-hellman-group-exchange-sha1", - kex_method_diffie_hellman_group_exchange_sha1_key_exchange, - LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, -}; - -static const LIBSSH2_KEX_METHOD -kex_method_diffie_helman_group_exchange_sha256 = { - "diffie-hellman-group-exchange-sha256", - kex_method_diffie_hellman_group_exchange_sha256_key_exchange, - LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, -}; +#if LIBSSH2_ECDSA -static const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = { - &kex_method_diffie_helman_group_exchange_sha256, - &kex_method_diffie_helman_group_exchange_sha1, - &kex_method_diffie_helman_group14_sha1, - &kex_method_diffie_helman_group1_sha1, - NULL -}; +/* kex_session_ecdh_curve_type + * returns the EC curve type by name used in key exchange + */ -typedef struct _LIBSSH2_COMMON_METHOD +static int +kex_session_ecdh_curve_type(const char *name, libssh2_curve_type *out_type) { - const char *name; -} LIBSSH2_COMMON_METHOD; + int ret = 0; + libssh2_curve_type type; -/* kex_method_strlen - * Calculate the length of a particular method list's resulting string - * Includes SUM(strlen() of each individual method plus 1 (for coma)) - 1 (because the last coma isn't used) - * Another sign of bad coding practices gone mad. Pretend you don't see this. - */ -static size_t -kex_method_strlen(LIBSSH2_COMMON_METHOD ** method) -{ - size_t len = 0; + if(name == NULL) + return -1; - if (!method || !*method) { - return 0; + if(strcmp(name, "ecdh-sha2-nistp256") == 0) + type = LIBSSH2_EC_CURVE_NISTP256; + else if(strcmp(name, "ecdh-sha2-nistp384") == 0) + type = LIBSSH2_EC_CURVE_NISTP384; + else if(strcmp(name, "ecdh-sha2-nistp521") == 0) + type = LIBSSH2_EC_CURVE_NISTP521; + else { + ret = -1; } - while (*method && (*method)->name) { - len += strlen((*method)->name) + 1; - method++; + if(ret == 0 && out_type) { + *out_type = type; } - return len - 1; + return ret; } +/* LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY + * + * Macro that create and verifies EC SHA hash with a given digest bytes + * + * Payload format: + * + * string V_C, client's identification string (CR and LF excluded) + * string V_S, server's identification string (CR and LF excluded) + * string I_C, payload of the client's SSH_MSG_KEXINIT + * string I_S, payload of the server's SSH_MSG_KEXINIT + * string K_S, server's public host key + * string Q_C, client's ephemeral public key octet string + * string Q_S, server's ephemeral public key octet string + * mpint K, shared secret + * + */ -/* kex_method_list - * Generate formatted preference list in buf +#define LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(digest_type) \ +{ \ + libssh2_sha##digest_type##_ctx ctx; \ + exchange_state->exchange_hash = (void *)&ctx; \ + libssh2_sha##digest_type##_init(&ctx); \ + if(session->local.banner) { \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + strlen((char *) session->local.banner) - 2); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + (char *) session->local.banner, \ + strlen((char *) \ + session->local.banner) \ + - 2); \ + } \ + else { \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + LIBSSH2_SSH_DEFAULT_BANNER, \ + sizeof(LIBSSH2_SSH_DEFAULT_BANNER) \ + - 1); \ + } \ + \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + strlen((char *) session->remote.banner)); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + session->remote.banner, \ + strlen((char *) \ + session->remote.banner)); \ + \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + session->local.kexinit_len); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + session->local.kexinit, \ + session->local.kexinit_len); \ + \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + session->remote.kexinit_len); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + session->remote.kexinit, \ + session->remote.kexinit_len); \ + \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + session->server_hostkey_len); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + session->server_hostkey, \ + session->server_hostkey_len); \ + \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + public_key_len); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + public_key, \ + public_key_len); \ + \ + _libssh2_htonu32(exchange_state->h_sig_comp, \ + server_public_key_len); \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->h_sig_comp, 4); \ + libssh2_sha##digest_type##_update(ctx, \ + server_public_key, \ + server_public_key_len); \ + \ + libssh2_sha##digest_type##_update(ctx, \ + exchange_state->k_value, \ + exchange_state->k_value_len); \ + \ + libssh2_sha##digest_type##_final(ctx, exchange_state->h_sig_comp); \ + \ + if(session->hostkey-> \ + sig_verify(session, exchange_state->h_sig, \ + exchange_state->h_sig_len, exchange_state->h_sig_comp, \ + SHA##digest_type##_DIGEST_LENGTH, \ + &session->server_hostkey_abstract)) { \ + rc = -1; \ + } \ +} \ + + +/* ecdh_sha2_nistp + * Elliptic Curve Diffie Hellman Key Exchange */ -static size_t -kex_method_list(unsigned char *buf, size_t list_strlen, - LIBSSH2_COMMON_METHOD ** method) + +static int ecdh_sha2_nistp(LIBSSH2_SESSION *session, libssh2_curve_type type, + unsigned char *data, size_t data_len, + unsigned char *public_key, + size_t public_key_len, _libssh2_ec_key *private_key, + kmdhgGPshakex_state_t *exchange_state) { - _libssh2_htonu32(buf, list_strlen); - buf += 4; + int ret = 0; + int rc; - if (!method || !*method) { - return 4; + if(data_len < 5) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Host key data is too short"); + return ret; } - while (*method && (*method)->name) { - int mlen = strlen((*method)->name); - memcpy(buf, (*method)->name, mlen); - buf += mlen; - *(buf++) = ','; - method++; + if(exchange_state->state == libssh2_NB_state_idle) { + + /* Setup initial values */ + exchange_state->k = _libssh2_bn_init(); + + exchange_state->state = libssh2_NB_state_created; } - return list_strlen + 4; -} + if(exchange_state->state == libssh2_NB_state_created) { + /* parse INIT reply data */ + /* host key K_S */ + unsigned char *s = data + 1; /* Advance past packet type */ + unsigned char *server_public_key; + size_t server_public_key_len; + size_t host_sig_len; + session->server_hostkey_len = + _libssh2_ntohu32((const unsigned char *)s); + s += 4; -#define LIBSSH2_METHOD_PREFS_LEN(prefvar, defaultvar) \ - ((prefvar) ? strlen(prefvar) : \ - kex_method_strlen((LIBSSH2_COMMON_METHOD**)(defaultvar))) + session->server_hostkey = LIBSSH2_ALLOC(session, + session->server_hostkey_len); + if(!session->server_hostkey) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for a copy " + "of the host key"); + goto clean_exit; + } -#define LIBSSH2_METHOD_PREFS_STR(buf, prefvarlen, prefvar, defaultvar) \ - if (prefvar) { \ - _libssh2_htonu32((buf), (prefvarlen)); \ - buf += 4; \ - memcpy((buf), (prefvar), (prefvarlen)); \ - buf += (prefvarlen); \ - } else { \ - buf += kex_method_list((buf), (prefvarlen), \ - (LIBSSH2_COMMON_METHOD**)(defaultvar)); \ - } + memcpy(session->server_hostkey, s, session->server_hostkey_len); + s += session->server_hostkey_len; -/* kexinit - * Send SSH_MSG_KEXINIT packet - */ -static int kexinit(LIBSSH2_SESSION * session) -{ - /* 62 = packet_type(1) + cookie(16) + first_packet_follows(1) + - reserved(4) + length longs(40) */ - size_t data_len = 62; - size_t kex_len, hostkey_len = 0; - size_t crypt_cs_len, crypt_sc_len; - size_t comp_cs_len, comp_sc_len; - size_t mac_cs_len, mac_sc_len; - size_t lang_cs_len, lang_sc_len; - unsigned char *data, *s; - int rc; +#if LIBSSH2_MD5 + { + libssh2_md5_ctx fingerprint_ctx; - if (session->kexinit_state == libssh2_NB_state_idle) { - kex_len = - LIBSSH2_METHOD_PREFS_LEN(session->kex_prefs, libssh2_kex_methods); - hostkey_len = - LIBSSH2_METHOD_PREFS_LEN(session->hostkey_prefs, - libssh2_hostkey_methods()); - crypt_cs_len = - LIBSSH2_METHOD_PREFS_LEN(session->local.crypt_prefs, - libssh2_crypt_methods()); - crypt_sc_len = - LIBSSH2_METHOD_PREFS_LEN(session->remote.crypt_prefs, - libssh2_crypt_methods()); - mac_cs_len = - LIBSSH2_METHOD_PREFS_LEN(session->local.mac_prefs, + if(libssh2_md5_init(&fingerprint_ctx)) { + libssh2_md5_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_md5_final(fingerprint_ctx, + session->server_hostkey_md5); + session->server_hostkey_md5_valid = TRUE; + } + else { + session->server_hostkey_md5_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char fingerprint[50], *fprint = fingerprint; + int i; + for(i = 0; i < 16; i++, fprint += 3) { + snprintf(fprint, 4, "%02x:", session->server_hostkey_md5[i]); + } + *(--fprint) = '\0'; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's MD5 Fingerprint: %s", fingerprint); + } +#endif /* LIBSSH2DEBUG */ +#endif /* ! LIBSSH2_MD5 */ + + { + libssh2_sha1_ctx fingerprint_ctx; + + if(libssh2_sha1_init(&fingerprint_ctx)) { + libssh2_sha1_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_sha1_final(fingerprint_ctx, + session->server_hostkey_sha1); + session->server_hostkey_sha1_valid = TRUE; + } + else { + session->server_hostkey_sha1_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char fingerprint[64], *fprint = fingerprint; + int i; + + for(i = 0; i < 20; i++, fprint += 3) { + snprintf(fprint, 4, "%02x:", session->server_hostkey_sha1[i]); + } + *(--fprint) = '\0'; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's SHA1 Fingerprint: %s", fingerprint); + } +#endif /* LIBSSH2DEBUG */ + + /* SHA256 */ + { + libssh2_sha256_ctx fingerprint_ctx; + + if(libssh2_sha256_init(&fingerprint_ctx)) { + libssh2_sha256_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_sha256_final(fingerprint_ctx, + session->server_hostkey_sha256); + session->server_hostkey_sha256_valid = TRUE; + } + else { + session->server_hostkey_sha256_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char *base64Fingerprint = NULL; + _libssh2_base64_encode(session, + (const char *) + session->server_hostkey_sha256, + SHA256_DIGEST_LENGTH, &base64Fingerprint); + if(base64Fingerprint != NULL) { + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's SHA256 Fingerprint: %s", + base64Fingerprint); + LIBSSH2_FREE(session, base64Fingerprint); + } + } +#endif /* LIBSSH2DEBUG */ + + if(session->hostkey->init(session, session->server_hostkey, + session->server_hostkey_len, + &session->server_hostkey_abstract)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unable to initialize hostkey importer"); + goto clean_exit; + } + + /* server public key Q_S */ + server_public_key_len = _libssh2_ntohu32((const unsigned char *)s); + s += 4; + + server_public_key = s; + s += server_public_key_len; + + /* server signature */ + host_sig_len = _libssh2_ntohu32((const unsigned char *)s); + s += 4; + + exchange_state->h_sig = s; + exchange_state->h_sig_len = host_sig_len; + s += host_sig_len; + + /* Compute the shared secret K */ + rc = _libssh2_ecdh_gen_k(&exchange_state->k, private_key, + server_public_key, server_public_key_len); + if(rc != 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_KEX_FAILURE, + "Unable to create ECDH shared secret"); + goto clean_exit; + } + + exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5; + if(_libssh2_bn_bits(exchange_state->k) % 8) { + /* don't need leading 00 */ + exchange_state->k_value_len--; + } + exchange_state->k_value = + LIBSSH2_ALLOC(session, exchange_state->k_value_len); + if(!exchange_state->k_value) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate buffer for K"); + goto clean_exit; + } + _libssh2_htonu32(exchange_state->k_value, + exchange_state->k_value_len - 4); + if(_libssh2_bn_bits(exchange_state->k) % 8) { + _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4); + } + else { + exchange_state->k_value[4] = 0; + _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5); + } + + /* verify hash */ + + switch(type) { + case LIBSSH2_EC_CURVE_NISTP256: + LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(256); + break; + + case LIBSSH2_EC_CURVE_NISTP384: + LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(384); + break; + case LIBSSH2_EC_CURVE_NISTP521: + LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(512); + break; + } + + if(rc != 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN, + "Unable to verify hostkey signature"); + goto clean_exit; + } + + exchange_state->c = SSH_MSG_NEWKEYS; + exchange_state->state = libssh2_NB_state_sent; + } + + if(exchange_state->state == libssh2_NB_state_sent) { + rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Unable to send NEWKEYS message"); + goto clean_exit; + } + + exchange_state->state = libssh2_NB_state_sent2; + } + + if(exchange_state->state == libssh2_NB_state_sent2) { + rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS, + &exchange_state->tmp, + &exchange_state->tmp_len, 0, NULL, 0, + &exchange_state->req_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, "Timed out waiting for NEWKEYS"); + goto clean_exit; + } + + /* The first key exchange has been performed, + switch to active crypt/comp/mac mode */ + session->state |= LIBSSH2_STATE_NEWKEYS; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Received NEWKEYS message"); + + /* This will actually end up being just packet_type(1) + for this packet type anyway */ + LIBSSH2_FREE(session, exchange_state->tmp); + + if(!session->session_id) { + + size_t digest_length = 0; + + if(type == LIBSSH2_EC_CURVE_NISTP256) + digest_length = SHA256_DIGEST_LENGTH; + else if(type == LIBSSH2_EC_CURVE_NISTP384) + digest_length = SHA384_DIGEST_LENGTH; + else if(type == LIBSSH2_EC_CURVE_NISTP521) + digest_length = SHA512_DIGEST_LENGTH; + else{ + ret = _libssh2_error(session, LIBSSH2_ERROR_KEX_FAILURE, + "Unknown SHA digest for EC curve"); + goto clean_exit; + + } + session->session_id = LIBSSH2_ALLOC(session, digest_length); + if(!session->session_id) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate buffer for " + "SHA digest"); + goto clean_exit; + } + memcpy(session->session_id, exchange_state->h_sig_comp, + digest_length); + session->session_id_len = digest_length; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "session_id calculated"); + } + + /* Cleanup any existing cipher */ + if(session->local.crypt->dtor) { + session->local.crypt->dtor(session, + &session->local.crypt_abstract); + } + + /* Calculate IV/Secret/Key for each direction */ + if(session->local.crypt->init) { + unsigned char *iv = NULL, *secret = NULL; + int free_iv = 0, free_secret = 0; + + LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(iv, + session->local.crypt-> + iv_len, "A"); + if(!iv) { + ret = -1; + goto clean_exit; + } + + LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(secret, + session->local.crypt-> + secret_len, "C"); + + if(!secret) { + LIBSSH2_FREE(session, iv); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + if(session->local.crypt-> + init(session, session->local.crypt, iv, &free_iv, secret, + &free_secret, 1, &session->local.crypt_abstract)) { + LIBSSH2_FREE(session, iv); + LIBSSH2_FREE(session, secret); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + + if(free_iv) { + _libssh2_explicit_zero(iv, session->local.crypt->iv_len); + LIBSSH2_FREE(session, iv); + } + + if(free_secret) { + _libssh2_explicit_zero(secret, + session->local.crypt->secret_len); + LIBSSH2_FREE(session, secret); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Client to Server IV and Key calculated"); + + if(session->remote.crypt->dtor) { + /* Cleanup any existing cipher */ + session->remote.crypt->dtor(session, + &session->remote.crypt_abstract); + } + + if(session->remote.crypt->init) { + unsigned char *iv = NULL, *secret = NULL; + int free_iv = 0, free_secret = 0; + + LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(iv, + session->remote.crypt-> + iv_len, "B"); + + if(!iv) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(secret, + session->remote.crypt-> + secret_len, "D"); + + if(!secret) { + LIBSSH2_FREE(session, iv); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + if(session->remote.crypt-> + init(session, session->remote.crypt, iv, &free_iv, secret, + &free_secret, 0, &session->remote.crypt_abstract)) { + LIBSSH2_FREE(session, iv); + LIBSSH2_FREE(session, secret); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + + if(free_iv) { + _libssh2_explicit_zero(iv, session->remote.crypt->iv_len); + LIBSSH2_FREE(session, iv); + } + + if(free_secret) { + _libssh2_explicit_zero(secret, + session->remote.crypt->secret_len); + LIBSSH2_FREE(session, secret); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server to Client IV and Key calculated"); + + if(session->local.mac->dtor) { + session->local.mac->dtor(session, &session->local.mac_abstract); + } + + if(session->local.mac->init) { + unsigned char *key = NULL; + int free_key = 0; + + LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(key, + session->local.mac-> + key_len, "E"); + + if(!key) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + session->local.mac->init(session, key, &free_key, + &session->local.mac_abstract); + + if(free_key) { + _libssh2_explicit_zero(key, session->local.mac->key_len); + LIBSSH2_FREE(session, key); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Client to Server HMAC Key calculated"); + + if(session->remote.mac->dtor) { + session->remote.mac->dtor(session, &session->remote.mac_abstract); + } + + if(session->remote.mac->init) { + unsigned char *key = NULL; + int free_key = 0; + + LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(key, + session->remote.mac-> + key_len, "F"); + + if(!key) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + session->remote.mac->init(session, key, &free_key, + &session->remote.mac_abstract); + + if(free_key) { + _libssh2_explicit_zero(key, session->remote.mac->key_len); + LIBSSH2_FREE(session, key); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server to Client HMAC Key calculated"); + + /* Initialize compression for each direction */ + + /* Cleanup any existing compression */ + if(session->local.comp && session->local.comp->dtor) { + session->local.comp->dtor(session, 1, + &session->local.comp_abstract); + } + + if(session->local.comp && session->local.comp->init) { + if(session->local.comp->init(session, 1, + &session->local.comp_abstract)) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Client to Server compression initialized"); + + if(session->remote.comp && session->remote.comp->dtor) { + session->remote.comp->dtor(session, 0, + &session->remote.comp_abstract); + } + + if(session->remote.comp && session->remote.comp->init) { + if(session->remote.comp->init(session, 0, + &session->remote.comp_abstract)) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server to Client compression initialized"); + + } + +clean_exit: + _libssh2_bn_free(exchange_state->k); + exchange_state->k = NULL; + + if(exchange_state->k_value) { + LIBSSH2_FREE(session, exchange_state->k_value); + exchange_state->k_value = NULL; + } + + exchange_state->state = libssh2_NB_state_idle; + + return ret; +} + +/* kex_method_ecdh_key_exchange + * + * Elliptic Curve Diffie Hellman Key Exchange + * supports SHA256/384/512 hashes based on negotated ecdh method + * + */ + +static int +kex_method_ecdh_key_exchange +(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state) +{ + int ret = 0; + int rc = 0; + unsigned char *s; + libssh2_curve_type type; + + if(key_state->state == libssh2_NB_state_idle) { + + key_state->public_key_oct = NULL; + key_state->state = libssh2_NB_state_created; + } + + if(key_state->state == libssh2_NB_state_created) { + rc = kex_session_ecdh_curve_type(session->kex->name, &type); + + if(rc != 0) { + ret = _libssh2_error(session, -1, + "Unknown KEX nistp curve type"); + goto ecdh_clean_exit; + } + + rc = _libssh2_ecdsa_create_key(session, &key_state->private_key, + &key_state->public_key_oct, + &key_state->public_key_oct_len, type); + + if(rc != 0) { + ret = _libssh2_error(session, rc, + "Unable to create private key"); + goto ecdh_clean_exit; + } + + key_state->request[0] = SSH2_MSG_KEX_ECDH_INIT; + s = key_state->request + 1; + _libssh2_store_str(&s, (const char *)key_state->public_key_oct, + key_state->public_key_oct_len); + key_state->request_len = key_state->public_key_oct_len + 5; + + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Initiating ECDH SHA2 NISTP256"); + + key_state->state = libssh2_NB_state_sent; + } + + if(key_state->state == libssh2_NB_state_sent) { + rc = _libssh2_transport_send(session, key_state->request, + key_state->request_len, NULL, 0); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Unable to send ECDH_INIT"); + goto ecdh_clean_exit; + } + + key_state->state = libssh2_NB_state_sent1; + } + + if(key_state->state == libssh2_NB_state_sent1) { + rc = _libssh2_packet_require(session, SSH2_MSG_KEX_ECDH_REPLY, + &key_state->data, &key_state->data_len, + 0, NULL, 0, &key_state->req_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Timeout waiting for ECDH_REPLY reply"); + goto ecdh_clean_exit; + } + + key_state->state = libssh2_NB_state_sent2; + } + + if(key_state->state == libssh2_NB_state_sent2) { + + (void)kex_session_ecdh_curve_type(session->kex->name, &type); + + ret = ecdh_sha2_nistp(session, type, key_state->data, + key_state->data_len, + (unsigned char *)key_state->public_key_oct, + key_state->public_key_oct_len, + key_state->private_key, + &key_state->exchange_state); + + if(ret == LIBSSH2_ERROR_EAGAIN) { + return ret; + } + + LIBSSH2_FREE(session, key_state->data); + } + +ecdh_clean_exit: + + if(key_state->public_key_oct) { + LIBSSH2_FREE(session, key_state->public_key_oct); + key_state->public_key_oct = NULL; + } + + if(key_state->private_key) { + _libssh2_ecdsa_free(key_state->private_key); + key_state->private_key = NULL; + } + + key_state->state = libssh2_NB_state_idle; + + return ret; +} + +#endif /*LIBSSH2_ECDSA*/ + + +#if LIBSSH2_ED25519 + +/* curve25519_sha256 + * Elliptic Curve Key Exchange + */ + +static int +curve25519_sha256(LIBSSH2_SESSION *session, unsigned char *data, + size_t data_len, + unsigned char public_key[LIBSSH2_ED25519_KEY_LEN], + unsigned char private_key[LIBSSH2_ED25519_KEY_LEN], + kmdhgGPshakex_state_t *exchange_state) +{ + int ret = 0; + int rc; + int public_key_len = LIBSSH2_ED25519_KEY_LEN; + + if(data_len < 5) { + return _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Data is too short"); + } + + if(exchange_state->state == libssh2_NB_state_idle) { + + /* Setup initial values */ + exchange_state->k = _libssh2_bn_init(); + + exchange_state->state = libssh2_NB_state_created; + } + + if(exchange_state->state == libssh2_NB_state_created) { + /* parse INIT reply data */ + unsigned char *server_public_key, *server_host_key; + size_t server_public_key_len, hostkey_len; + struct string_buf buf; + + if(data_len < 5) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected key length"); + goto clean_exit; + } + + buf.data = data; + buf.len = data_len; + buf.dataptr = buf.data; + buf.dataptr++; /* advance past packet type */ + + if(_libssh2_get_string(&buf, &server_host_key, &hostkey_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected key length"); + goto clean_exit; + } + + session->server_hostkey_len = (uint32_t)hostkey_len; + session->server_hostkey = LIBSSH2_ALLOC(session, + session->server_hostkey_len); + if(!session->server_hostkey) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for a copy " + "of the host key"); + goto clean_exit; + } + + memcpy(session->server_hostkey, server_host_key, + session->server_hostkey_len); + +#if LIBSSH2_MD5 + { + libssh2_md5_ctx fingerprint_ctx; + + if(libssh2_md5_init(&fingerprint_ctx)) { + libssh2_md5_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_md5_final(fingerprint_ctx, + session->server_hostkey_md5); + session->server_hostkey_md5_valid = TRUE; + } + else { + session->server_hostkey_md5_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char fingerprint[50], *fprint = fingerprint; + int i; + for(i = 0; i < 16; i++, fprint += 3) { + snprintf(fprint, 4, "%02x:", session->server_hostkey_md5[i]); + } + *(--fprint) = '\0'; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's MD5 Fingerprint: %s", fingerprint); + } +#endif /* LIBSSH2DEBUG */ +#endif /* ! LIBSSH2_MD5 */ + + { + libssh2_sha1_ctx fingerprint_ctx; + + if(libssh2_sha1_init(&fingerprint_ctx)) { + libssh2_sha1_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_sha1_final(fingerprint_ctx, + session->server_hostkey_sha1); + session->server_hostkey_sha1_valid = TRUE; + } + else { + session->server_hostkey_sha1_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char fingerprint[64], *fprint = fingerprint; + int i; + + for(i = 0; i < 20; i++, fprint += 3) { + snprintf(fprint, 4, "%02x:", session->server_hostkey_sha1[i]); + } + *(--fprint) = '\0'; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's SHA1 Fingerprint: %s", fingerprint); + } +#endif /* LIBSSH2DEBUG */ + + /* SHA256 */ + { + libssh2_sha256_ctx fingerprint_ctx; + + if(libssh2_sha256_init(&fingerprint_ctx)) { + libssh2_sha256_update(fingerprint_ctx, session->server_hostkey, + session->server_hostkey_len); + libssh2_sha256_final(fingerprint_ctx, + session->server_hostkey_sha256); + session->server_hostkey_sha256_valid = TRUE; + } + else { + session->server_hostkey_sha256_valid = FALSE; + } + } +#ifdef LIBSSH2DEBUG + { + char *base64Fingerprint = NULL; + _libssh2_base64_encode(session, + (const char *) + session->server_hostkey_sha256, + SHA256_DIGEST_LENGTH, &base64Fingerprint); + if(base64Fingerprint != NULL) { + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server's SHA256 Fingerprint: %s", + base64Fingerprint); + LIBSSH2_FREE(session, base64Fingerprint); + } + } +#endif /* LIBSSH2DEBUG */ + + if(session->hostkey->init(session, session->server_hostkey, + session->server_hostkey_len, + &session->server_hostkey_abstract)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unable to initialize hostkey importer"); + goto clean_exit; + } + + /* server public key Q_S */ + if(_libssh2_get_string(&buf, &server_public_key, + &server_public_key_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected key length"); + goto clean_exit; + } + + if(server_public_key_len != LIBSSH2_ED25519_KEY_LEN) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unexpected curve25519 server " + "public key length"); + goto clean_exit; + } + + /* server signature */ + if(_libssh2_get_string(&buf, &exchange_state->h_sig, + &(exchange_state->h_sig_len))) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unexpected curve25519 server sig length"); + goto clean_exit; + } + + /* Compute the shared secret K */ + rc = _libssh2_curve25519_gen_k(&exchange_state->k, private_key, + server_public_key); + if(rc != 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_KEX_FAILURE, + "Unable to create ECDH shared secret"); + goto clean_exit; + } + + exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5; + if(_libssh2_bn_bits(exchange_state->k) % 8) { + /* don't need leading 00 */ + exchange_state->k_value_len--; + } + exchange_state->k_value = + LIBSSH2_ALLOC(session, exchange_state->k_value_len); + if(!exchange_state->k_value) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate buffer for K"); + goto clean_exit; + } + _libssh2_htonu32(exchange_state->k_value, + exchange_state->k_value_len - 4); + if(_libssh2_bn_bits(exchange_state->k) % 8) { + _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4); + } + else { + exchange_state->k_value[4] = 0; + _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5); + } + + /*/ verify hash */ + LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY(256); + + if(rc != 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN, + "Unable to verify hostkey signature"); + goto clean_exit; + } + + exchange_state->c = SSH_MSG_NEWKEYS; + exchange_state->state = libssh2_NB_state_sent; + } + + if(exchange_state->state == libssh2_NB_state_sent) { + rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Unable to send NEWKEYS message"); + goto clean_exit; + } + + exchange_state->state = libssh2_NB_state_sent2; + } + + if(exchange_state->state == libssh2_NB_state_sent2) { + rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS, + &exchange_state->tmp, + &exchange_state->tmp_len, 0, NULL, 0, + &exchange_state->req_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, "Timed out waiting for NEWKEYS"); + goto clean_exit; + } + + /* The first key exchange has been performed, switch to active + crypt/comp/mac mode */ + + session->state |= LIBSSH2_STATE_NEWKEYS; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Received NEWKEYS message"); + + /* This will actually end up being just packet_type(1) for this packet + type anyway */ + LIBSSH2_FREE(session, exchange_state->tmp); + + if(!session->session_id) { + + size_t digest_length = SHA256_DIGEST_LENGTH; + session->session_id = LIBSSH2_ALLOC(session, digest_length); + if(!session->session_id) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allxcocate buffer for " + "SHA digest"); + goto clean_exit; + } + memcpy(session->session_id, exchange_state->h_sig_comp, + digest_length); + session->session_id_len = digest_length; + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "session_id calculated"); + } + + /* Cleanup any existing cipher */ + if(session->local.crypt->dtor) { + session->local.crypt->dtor(session, + &session->local.crypt_abstract); + } + + /* Calculate IV/Secret/Key for each direction */ + if(session->local.crypt->init) { + unsigned char *iv = NULL, *secret = NULL; + int free_iv = 0, free_secret = 0; + + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv, + session->local.crypt-> + iv_len, "A"); + if(!iv) { + ret = -1; + goto clean_exit; + } + + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret, + session->local.crypt-> + secret_len, "C"); + + if(!secret) { + LIBSSH2_FREE(session, iv); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + if(session->local.crypt-> + init(session, session->local.crypt, iv, &free_iv, secret, + &free_secret, 1, &session->local.crypt_abstract)) { + LIBSSH2_FREE(session, iv); + LIBSSH2_FREE(session, secret); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + + if(free_iv) { + _libssh2_explicit_zero(iv, session->local.crypt->iv_len); + LIBSSH2_FREE(session, iv); + } + + if(free_secret) { + _libssh2_explicit_zero(secret, + session->local.crypt->secret_len); + LIBSSH2_FREE(session, secret); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Client to Server IV and Key calculated"); + + if(session->remote.crypt->dtor) { + /* Cleanup any existing cipher */ + session->remote.crypt->dtor(session, + &session->remote.crypt_abstract); + } + + if(session->remote.crypt->init) { + unsigned char *iv = NULL, *secret = NULL; + int free_iv = 0, free_secret = 0; + + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv, + session->remote.crypt-> + iv_len, "B"); + + if(!iv) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret, + session->remote.crypt-> + secret_len, "D"); + + if(!secret) { + LIBSSH2_FREE(session, iv); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + if(session->remote.crypt-> + init(session, session->remote.crypt, iv, &free_iv, secret, + &free_secret, 0, &session->remote.crypt_abstract)) { + LIBSSH2_FREE(session, iv); + LIBSSH2_FREE(session, secret); + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + + if(free_iv) { + _libssh2_explicit_zero(iv, session->remote.crypt->iv_len); + LIBSSH2_FREE(session, iv); + } + + if(free_secret) { + _libssh2_explicit_zero(secret, + session->remote.crypt->secret_len); + LIBSSH2_FREE(session, secret); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server to Client IV and Key calculated"); + + if(session->local.mac->dtor) { + session->local.mac->dtor(session, &session->local.mac_abstract); + } + + if(session->local.mac->init) { + unsigned char *key = NULL; + int free_key = 0; + + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key, + session->local.mac-> + key_len, "E"); + + if(!key) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + session->local.mac->init(session, key, &free_key, + &session->local.mac_abstract); + + if(free_key) { + _libssh2_explicit_zero(key, session->local.mac->key_len); + LIBSSH2_FREE(session, key); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Client to Server HMAC Key calculated"); + + if(session->remote.mac->dtor) { + session->remote.mac->dtor(session, &session->remote.mac_abstract); + } + + if(session->remote.mac->init) { + unsigned char *key = NULL; + int free_key = 0; + + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key, + session->remote.mac-> + key_len, "F"); + + if(!key) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + session->remote.mac->init(session, key, &free_key, + &session->remote.mac_abstract); + + if(free_key) { + _libssh2_explicit_zero(key, session->remote.mac->key_len); + LIBSSH2_FREE(session, key); + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server to Client HMAC Key calculated"); + + /* Initialize compression for each direction */ + + /* Cleanup any existing compression */ + if(session->local.comp && session->local.comp->dtor) { + session->local.comp->dtor(session, 1, + &session->local.comp_abstract); + } + + if(session->local.comp && session->local.comp->init) { + if(session->local.comp->init(session, 1, + &session->local.comp_abstract)) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Client to Server compression initialized"); + + if(session->remote.comp && session->remote.comp->dtor) { + session->remote.comp->dtor(session, 0, + &session->remote.comp_abstract); + } + + if(session->remote.comp && session->remote.comp->init) { + if(session->remote.comp->init(session, 0, + &session->remote.comp_abstract)) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server to Client compression initialized"); + } + +clean_exit: + _libssh2_bn_free(exchange_state->k); + exchange_state->k = NULL; + + if(exchange_state->k_value) { + LIBSSH2_FREE(session, exchange_state->k_value); + exchange_state->k_value = NULL; + } + + exchange_state->state = libssh2_NB_state_idle; + + return ret; +} + +/* kex_method_curve25519_key_exchange + * + * Elliptic Curve X25519 Key Exchange with SHA256 hash + * + */ + +static int +kex_method_curve25519_key_exchange +(LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state) +{ + int ret = 0; + int rc = 0; + + if(key_state->state == libssh2_NB_state_idle) { + + key_state->public_key_oct = NULL; + key_state->state = libssh2_NB_state_created; + } + + if(key_state->state == libssh2_NB_state_created) { + unsigned char *s = NULL; + + rc = strcmp(session->kex->name, "curve25519-sha256@libssh.org"); + if(rc != 0) + rc = strcmp(session->kex->name, "curve25519-sha256"); + + if(rc != 0) { + ret = _libssh2_error(session, -1, + "Unknown KEX curve25519 curve type"); + goto clean_exit; + } + + rc = _libssh2_curve25519_new(session, NULL, + &key_state->curve25519_public_key, + &key_state->curve25519_private_key); + + if(rc != 0) { + ret = _libssh2_error(session, rc, + "Unable to create private key"); + goto clean_exit; + } + + key_state->request[0] = SSH2_MSG_KEX_ECDH_INIT; + s = key_state->request + 1; + _libssh2_store_str(&s, (const char *)key_state->curve25519_public_key, + LIBSSH2_ED25519_KEY_LEN); + key_state->request_len = LIBSSH2_ED25519_KEY_LEN + 5; + + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Initiating curve25519 SHA2"); + + key_state->state = libssh2_NB_state_sent; + } + + if(key_state->state == libssh2_NB_state_sent) { + rc = _libssh2_transport_send(session, key_state->request, + key_state->request_len, NULL, 0); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Unable to send ECDH_INIT"); + goto clean_exit; + } + + key_state->state = libssh2_NB_state_sent1; + } + + if(key_state->state == libssh2_NB_state_sent1) { + rc = _libssh2_packet_require(session, SSH2_MSG_KEX_ECDH_REPLY, + &key_state->data, &key_state->data_len, + 0, NULL, 0, &key_state->req_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + ret = _libssh2_error(session, rc, + "Timeout waiting for ECDH_REPLY reply"); + goto clean_exit; + } + + key_state->state = libssh2_NB_state_sent2; + } + + if(key_state->state == libssh2_NB_state_sent2) { + + ret = curve25519_sha256(session, key_state->data, key_state->data_len, + key_state->curve25519_public_key, + key_state->curve25519_private_key, + &key_state->exchange_state); + + if(ret == LIBSSH2_ERROR_EAGAIN) { + return ret; + } + + LIBSSH2_FREE(session, key_state->data); + } + +clean_exit: + + if(key_state->curve25519_public_key) { + _libssh2_explicit_zero(key_state->curve25519_public_key, + LIBSSH2_ED25519_KEY_LEN); + LIBSSH2_FREE(session, key_state->curve25519_public_key); + key_state->curve25519_public_key = NULL; + } + + if(key_state->curve25519_private_key) { + _libssh2_explicit_zero(key_state->curve25519_private_key, + LIBSSH2_ED25519_KEY_LEN); + LIBSSH2_FREE(session, key_state->curve25519_private_key); + key_state->curve25519_private_key = NULL; + } + + key_state->state = libssh2_NB_state_idle; + + return ret; +} + + +#endif /*LIBSSH2_ED25519*/ + + +#define LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY 0x0001 +#define LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY 0x0002 + +static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group1_sha1 = { + "diffie-hellman-group1-sha1", + kex_method_diffie_hellman_group1_sha1_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group14_sha1 = { + "diffie-hellman-group14-sha1", + kex_method_diffie_hellman_group14_sha1_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +static const LIBSSH2_KEX_METHOD +kex_method_diffie_helman_group_exchange_sha1 = { + "diffie-hellman-group-exchange-sha1", + kex_method_diffie_hellman_group_exchange_sha1_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +static const LIBSSH2_KEX_METHOD +kex_method_diffie_helman_group_exchange_sha256 = { + "diffie-hellman-group-exchange-sha256", + kex_method_diffie_hellman_group_exchange_sha256_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +#if LIBSSH2_ECDSA +static const LIBSSH2_KEX_METHOD +kex_method_ecdh_sha2_nistp256 = { + "ecdh-sha2-nistp256", + kex_method_ecdh_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +static const LIBSSH2_KEX_METHOD +kex_method_ecdh_sha2_nistp384 = { + "ecdh-sha2-nistp384", + kex_method_ecdh_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +static const LIBSSH2_KEX_METHOD +kex_method_ecdh_sha2_nistp521 = { + "ecdh-sha2-nistp521", + kex_method_ecdh_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; +#endif + +#if LIBSSH2_ED25519 +static const LIBSSH2_KEX_METHOD +kex_method_ssh_curve25519_sha256_libssh = { + "curve25519-sha256@libssh.org", + kex_method_curve25519_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; +static const LIBSSH2_KEX_METHOD +kex_method_ssh_curve25519_sha256 = { + "curve25519-sha256", + kex_method_curve25519_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; +#endif + +static const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = { +#if LIBSSH2_ECDSA + &kex_method_ecdh_sha2_nistp256, + &kex_method_ecdh_sha2_nistp384, + &kex_method_ecdh_sha2_nistp521, +#endif +#if LIBSSH2_ED25519 + &kex_method_ssh_curve25519_sha256, + &kex_method_ssh_curve25519_sha256_libssh, +#endif + &kex_method_diffie_helman_group_exchange_sha256, + &kex_method_diffie_helman_group_exchange_sha1, + &kex_method_diffie_helman_group14_sha1, + &kex_method_diffie_helman_group1_sha1, + NULL +}; + +typedef struct _LIBSSH2_COMMON_METHOD +{ + const char *name; +} LIBSSH2_COMMON_METHOD; + +/* kex_method_strlen + * Calculate the length of a particular method list's resulting string + * Includes SUM(strlen() of each individual method plus 1 (for coma)) - 1 + * (because the last coma isn't used) + * Another sign of bad coding practices gone mad. Pretend you don't see this. + */ +static size_t +kex_method_strlen(LIBSSH2_COMMON_METHOD ** method) +{ + size_t len = 0; + + if(!method || !*method) { + return 0; + } + + while(*method && (*method)->name) { + len += strlen((*method)->name) + 1; + method++; + } + + return len - 1; +} + + + +/* kex_method_list + * Generate formatted preference list in buf + */ +static size_t +kex_method_list(unsigned char *buf, size_t list_strlen, + LIBSSH2_COMMON_METHOD ** method) +{ + _libssh2_htonu32(buf, list_strlen); + buf += 4; + + if(!method || !*method) { + return 4; + } + + while(*method && (*method)->name) { + int mlen = strlen((*method)->name); + memcpy(buf, (*method)->name, mlen); + buf += mlen; + *(buf++) = ','; + method++; + } + + return list_strlen + 4; +} + + + +#define LIBSSH2_METHOD_PREFS_LEN(prefvar, defaultvar) \ + ((prefvar) ? strlen(prefvar) : \ + kex_method_strlen((LIBSSH2_COMMON_METHOD**)(defaultvar))) + +#define LIBSSH2_METHOD_PREFS_STR(buf, prefvarlen, prefvar, defaultvar) \ + if(prefvar) { \ + _libssh2_htonu32((buf), (prefvarlen)); \ + buf += 4; \ + memcpy((buf), (prefvar), (prefvarlen)); \ + buf += (prefvarlen); \ + } \ + else { \ + buf += kex_method_list((buf), (prefvarlen), \ + (LIBSSH2_COMMON_METHOD**)(defaultvar)); \ + } + +/* kexinit + * Send SSH_MSG_KEXINIT packet + */ +static int kexinit(LIBSSH2_SESSION * session) +{ + /* 62 = packet_type(1) + cookie(16) + first_packet_follows(1) + + reserved(4) + length longs(40) */ + size_t data_len = 62; + size_t kex_len, hostkey_len = 0; + size_t crypt_cs_len, crypt_sc_len; + size_t comp_cs_len, comp_sc_len; + size_t mac_cs_len, mac_sc_len; + size_t lang_cs_len, lang_sc_len; + unsigned char *data, *s; + int rc; + + if(session->kexinit_state == libssh2_NB_state_idle) { + kex_len = + LIBSSH2_METHOD_PREFS_LEN(session->kex_prefs, libssh2_kex_methods); + hostkey_len = + LIBSSH2_METHOD_PREFS_LEN(session->hostkey_prefs, + libssh2_hostkey_methods()); + crypt_cs_len = + LIBSSH2_METHOD_PREFS_LEN(session->local.crypt_prefs, + libssh2_crypt_methods()); + crypt_sc_len = + LIBSSH2_METHOD_PREFS_LEN(session->remote.crypt_prefs, + libssh2_crypt_methods()); + mac_cs_len = + LIBSSH2_METHOD_PREFS_LEN(session->local.mac_prefs, _libssh2_mac_methods()); mac_sc_len = LIBSSH2_METHOD_PREFS_LEN(session->remote.mac_prefs, @@ -1860,7 +3455,7 @@ static int kexinit(LIBSSH2_SESSION * session) lang_cs_len + lang_sc_len; s = data = LIBSSH2_ALLOC(session, data_len); - if (!data) { + if(!data) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory"); } @@ -1907,7 +3502,7 @@ static int kexinit(LIBSSH2_SESSION * session) #ifdef LIBSSH2DEBUG { /* Funnily enough, they'll all "appear" to be '\0' terminated */ - unsigned char *p = data + 21; /* type(1) + cookie(16) + len(4) */ + unsigned char *p = data + 21; /* type(1) + cookie(16) + len(4) */ _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Sent KEX: %s", p); p += kex_len + 4; @@ -1933,7 +3528,8 @@ static int kexinit(LIBSSH2_SESSION * session) #endif /* LIBSSH2DEBUG */ session->kexinit_state = libssh2_NB_state_created; - } else { + } + else { data = session->kexinit_data; data_len = session->kexinit_data_len; /* zap the variables to ensure there is NOT a double free later */ @@ -1942,12 +3538,12 @@ static int kexinit(LIBSSH2_SESSION * session) } rc = _libssh2_transport_send(session, data, data_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { session->kexinit_data = data; session->kexinit_data_len = data_len; return rc; } - else if (rc) { + else if(rc) { LIBSSH2_FREE(session, data); session->kexinit_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, @@ -1955,7 +3551,7 @@ static int kexinit(LIBSSH2_SESSION * session) } - if (session->local.kexinit) { + if(session->local.kexinit) { LIBSSH2_FREE(session, session->local.kexinit); } @@ -1969,7 +3565,7 @@ static int kexinit(LIBSSH2_SESSION * session) /* kex_agree_instr * Kex specific variant of strstr() - * Needle must be preceed by BOL or ',', and followed by ',' or EOL + * Needle must be precede by BOL or ',', and followed by ',' or EOL */ static unsigned char * kex_agree_instr(unsigned char *haystack, unsigned long haystack_len, @@ -1978,12 +3574,12 @@ kex_agree_instr(unsigned char *haystack, unsigned long haystack_len, unsigned char *s; /* Haystack too short to bother trying */ - if (haystack_len < needle_len) { + if(haystack_len < needle_len) { return NULL; } /* Needle at start of haystack */ - if ((strncmp((char *) haystack, (char *) needle, needle_len) == 0) && + if((strncmp((char *) haystack, (char *) needle, needle_len) == 0) && (needle_len == haystack_len || haystack[needle_len] == ',')) { return haystack; } @@ -1991,11 +3587,11 @@ kex_agree_instr(unsigned char *haystack, unsigned long haystack_len, s = haystack; /* Search until we run out of comas or we run out of haystack, whichever comes first */ - while ((s = (unsigned char *) strchr((char *) s, ',')) + while((s = (unsigned char *) strchr((char *) s, ',')) && ((haystack_len - (s - haystack)) > needle_len)) { s++; /* Needle at X position */ - if ((strncmp((char *) s, (char *) needle, needle_len) == 0) && + if((strncmp((char *) s, (char *) needle, needle_len) == 0) && (((s - haystack) + needle_len) == haystack_len || s[needle_len] == ',')) { return s; @@ -2013,8 +3609,8 @@ static const LIBSSH2_COMMON_METHOD * kex_get_method_by_name(const char *name, size_t name_len, const LIBSSH2_COMMON_METHOD ** methodlist) { - while (*methodlist) { - if ((strlen((*methodlist)->name) == name_len) && + while(*methodlist) { + if((strlen((*methodlist)->name) == name_len) && (strncmp((*methodlist)->name, name, name_len) == 0)) { return *methodlist; } @@ -2035,31 +3631,31 @@ static int kex_agree_hostkey(LIBSSH2_SESSION * session, const LIBSSH2_HOSTKEY_METHOD **hostkeyp = libssh2_hostkey_methods(); unsigned char *s; - if (session->hostkey_prefs) { + if(session->hostkey_prefs) { s = (unsigned char *) session->hostkey_prefs; - while (s && *s) { + while(s && *s) { unsigned char *p = (unsigned char *) strchr((char *) s, ','); size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); - if (kex_agree_instr(hostkey, hostkey_len, s, method_len)) { + if(kex_agree_instr(hostkey, hostkey_len, s, method_len)) { const LIBSSH2_HOSTKEY_METHOD *method = (const LIBSSH2_HOSTKEY_METHOD *) kex_get_method_by_name((char *) s, method_len, (const LIBSSH2_COMMON_METHOD **) hostkeyp); - if (!method) { + if(!method) { /* Invalid method -- Should never be reached */ return -1; } /* So far so good, but does it suit our purposes? (Encrypting vs Signing) */ - if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) == + if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) == 0) || (method->encrypt)) { /* Either this hostkey can do encryption or this kex just doesn't require it */ - if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY) + if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY) == 0) || (method->sig_verify)) { /* Either this hostkey can do signing or this kex just doesn't require it */ @@ -2074,18 +3670,18 @@ static int kex_agree_hostkey(LIBSSH2_SESSION * session, return -1; } - while (hostkeyp && (*hostkeyp) && (*hostkeyp)->name) { + while(hostkeyp && (*hostkeyp) && (*hostkeyp)->name) { s = kex_agree_instr(hostkey, hostkey_len, (unsigned char *) (*hostkeyp)->name, strlen((*hostkeyp)->name)); - if (s) { + if(s) { /* So far so good, but does it suit our purposes? (Encrypting vs Signing) */ - if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) == 0) || + if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_ENC_HOSTKEY) == 0) || ((*hostkeyp)->encrypt)) { /* Either this hostkey can do encryption or this kex just doesn't require it */ - if (((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY) == + if(((kex_flags & LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY) == 0) || ((*hostkeyp)->sig_verify)) { /* Either this hostkey can do signing or this kex just doesn't require it */ @@ -2112,19 +3708,20 @@ static int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex, const LIBSSH2_KEX_METHOD **kexp = libssh2_kex_methods; unsigned char *s; - if (session->kex_prefs) { + if(session->kex_prefs) { s = (unsigned char *) session->kex_prefs; - while (s && *s) { + while(s && *s) { unsigned char *q, *p = (unsigned char *) strchr((char *) s, ','); size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); - if ((q = kex_agree_instr(kex, kex_len, s, method_len))) { + q = kex_agree_instr(kex, kex_len, s, method_len); + if(q) { const LIBSSH2_KEX_METHOD *method = (const LIBSSH2_KEX_METHOD *) kex_get_method_by_name((char *) s, method_len, (const LIBSSH2_COMMON_METHOD **) kexp); - if (!method) { + if(!method) { /* Invalid method -- Should never be reached */ return -1; } @@ -2132,13 +3729,13 @@ static int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex, /* We've agreed on a key exchange method, * Can we agree on a hostkey that works with this kex? */ - if (kex_agree_hostkey(session, method->flags, hostkey, + if(kex_agree_hostkey(session, method->flags, hostkey, hostkey_len) == 0) { session->kex = method; - if (session->burn_optimistic_kexinit && (kex == q)) { - /* Server sent an optimistic packet, - * and client agrees with preference - * cancel burning the first KEX_INIT packet that comes in */ + if(session->burn_optimistic_kexinit && (kex == q)) { + /* Server sent an optimistic packet, and client agrees + * with preference cancel burning the first KEX_INIT + * packet that comes in */ session->burn_optimistic_kexinit = 0; } return 0; @@ -2150,21 +3747,21 @@ static int kex_agree_kex_hostkey(LIBSSH2_SESSION * session, unsigned char *kex, return -1; } - while (*kexp && (*kexp)->name) { + while(*kexp && (*kexp)->name) { s = kex_agree_instr(kex, kex_len, (unsigned char *) (*kexp)->name, strlen((*kexp)->name)); - if (s) { + if(s) { /* We've agreed on a key exchange method, * Can we agree on a hostkey that works with this kex? */ - if (kex_agree_hostkey(session, (*kexp)->flags, hostkey, + if(kex_agree_hostkey(session, (*kexp)->flags, hostkey, hostkey_len) == 0) { session->kex = *kexp; - if (session->burn_optimistic_kexinit && (kex == s)) { - /* Server sent an optimistic packet, - * and client agrees with preference - * cancel burning the first KEX_INIT packet that comes in */ + if(session->burn_optimistic_kexinit && (kex == s)) { + /* Server sent an optimistic packet, and client agrees + * with preference cancel burning the first KEX_INIT + * packet that comes in */ session->burn_optimistic_kexinit = 0; } return 0; @@ -2190,21 +3787,21 @@ static int kex_agree_crypt(LIBSSH2_SESSION * session, (void) session; - if (endpoint->crypt_prefs) { + if(endpoint->crypt_prefs) { s = (unsigned char *) endpoint->crypt_prefs; - while (s && *s) { + while(s && *s) { unsigned char *p = (unsigned char *) strchr((char *) s, ','); size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); - if (kex_agree_instr(crypt, crypt_len, s, method_len)) { + if(kex_agree_instr(crypt, crypt_len, s, method_len)) { const LIBSSH2_CRYPT_METHOD *method = (const LIBSSH2_CRYPT_METHOD *) kex_get_method_by_name((char *) s, method_len, (const LIBSSH2_COMMON_METHOD **) cryptp); - if (!method) { + if(!method) { /* Invalid method -- Should never be reached */ return -1; } @@ -2218,11 +3815,11 @@ static int kex_agree_crypt(LIBSSH2_SESSION * session, return -1; } - while (*cryptp && (*cryptp)->name) { + while(*cryptp && (*cryptp)->name) { s = kex_agree_instr(crypt, crypt_len, (unsigned char *) (*cryptp)->name, strlen((*cryptp)->name)); - if (s) { + if(s) { endpoint->crypt = *cryptp; return 0; } @@ -2245,20 +3842,20 @@ static int kex_agree_mac(LIBSSH2_SESSION * session, unsigned char *s; (void) session; - if (endpoint->mac_prefs) { + if(endpoint->mac_prefs) { s = (unsigned char *) endpoint->mac_prefs; - while (s && *s) { + while(s && *s) { unsigned char *p = (unsigned char *) strchr((char *) s, ','); size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); - if (kex_agree_instr(mac, mac_len, s, method_len)) { + if(kex_agree_instr(mac, mac_len, s, method_len)) { const LIBSSH2_MAC_METHOD *method = (const LIBSSH2_MAC_METHOD *) kex_get_method_by_name((char *) s, method_len, (const LIBSSH2_COMMON_METHOD **) macp); - if (!method) { + if(!method) { /* Invalid method -- Should never be reached */ return -1; } @@ -2272,10 +3869,10 @@ static int kex_agree_mac(LIBSSH2_SESSION * session, return -1; } - while (*macp && (*macp)->name) { + while(*macp && (*macp)->name) { s = kex_agree_instr(mac, mac_len, (unsigned char *) (*macp)->name, strlen((*macp)->name)); - if (s) { + if(s) { endpoint->mac = *macp; return 0; } @@ -2298,21 +3895,21 @@ static int kex_agree_comp(LIBSSH2_SESSION *session, unsigned char *s; (void) session; - if (endpoint->comp_prefs) { + if(endpoint->comp_prefs) { s = (unsigned char *) endpoint->comp_prefs; - while (s && *s) { + while(s && *s) { unsigned char *p = (unsigned char *) strchr((char *) s, ','); size_t method_len = (p ? (size_t)(p - s) : strlen((char *) s)); - if (kex_agree_instr(comp, comp_len, s, method_len)) { + if(kex_agree_instr(comp, comp_len, s, method_len)) { const LIBSSH2_COMP_METHOD *method = (const LIBSSH2_COMP_METHOD *) kex_get_method_by_name((char *) s, method_len, (const LIBSSH2_COMMON_METHOD **) compp); - if (!method) { + if(!method) { /* Invalid method -- Should never be reached */ return -1; } @@ -2326,10 +3923,10 @@ static int kex_agree_comp(LIBSSH2_SESSION *session, return -1; } - while (*compp && (*compp)->name) { + while(*compp && (*compp)->name) { s = kex_agree_instr(comp, comp_len, (unsigned char *) (*compp)->name, strlen((*compp)->name)); - if (s) { + if(s) { endpoint->comp = *compp; return 0; } @@ -2360,7 +3957,7 @@ static int kex_string_pair(unsigned char **sp, /* parsing position */ /* the length of the string must fit within the current pointer and the end of the packet */ - if (*lenp > (data_len - (s - data) -4)) + if(*lenp > (data_len - (s - data) -4)) return 1; *strp = s + 4; s += 4 + *lenp; @@ -2411,30 +4008,31 @@ static int kex_agree_methods(LIBSSH2_SESSION * session, unsigned char *data, session->burn_optimistic_kexinit = *(s++); /* Next uint32 in packet is all zeros (reserved) */ - if (data_len < (unsigned) (s - data)) + if(data_len < (unsigned) (s - data)) return -1; /* short packet */ - if (kex_agree_kex_hostkey(session, kex, kex_len, hostkey, hostkey_len)) { + if(kex_agree_kex_hostkey(session, kex, kex_len, hostkey, hostkey_len)) { return -1; } - if (kex_agree_crypt(session, &session->local, crypt_cs, crypt_cs_len) - || kex_agree_crypt(session, &session->remote, crypt_sc, crypt_sc_len)) { + if(kex_agree_crypt(session, &session->local, crypt_cs, crypt_cs_len) + || kex_agree_crypt(session, &session->remote, crypt_sc, + crypt_sc_len)) { return -1; } - if (kex_agree_mac(session, &session->local, mac_cs, mac_cs_len) || + if(kex_agree_mac(session, &session->local, mac_cs, mac_cs_len) || kex_agree_mac(session, &session->remote, mac_sc, mac_sc_len)) { return -1; } - if (kex_agree_comp(session, &session->local, comp_cs, comp_cs_len) || + if(kex_agree_comp(session, &session->local, comp_cs, comp_cs_len) || kex_agree_comp(session, &session->remote, comp_sc, comp_sc_len)) { return -1; } #if 0 - if (libssh2_kex_agree_lang(session, &session->local, lang_cs, lang_cs_len) + if(libssh2_kex_agree_lang(session, &session->local, lang_cs, lang_cs_len) || libssh2_kex_agree_lang(session, &session->remote, lang_sc, lang_sc_len)) { return -1; @@ -2478,14 +4076,14 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, session->state |= LIBSSH2_STATE_KEX_ACTIVE; - if (key_state->state == libssh2_NB_state_idle) { + if(key_state->state == libssh2_NB_state_idle) { /* Prevent loop in packet_add() */ session->state |= LIBSSH2_STATE_EXCHANGING_KEYS; - if (reexchange) { + if(reexchange) { session->kex = NULL; - if (session->hostkey && session->hostkey->dtor) { + if(session->hostkey && session->hostkey->dtor) { session->hostkey->dtor(session, &session->server_hostkey_abstract); } @@ -2495,8 +4093,8 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, key_state->state = libssh2_NB_state_created; } - if (!session->kex || !session->hostkey) { - if (key_state->state == libssh2_NB_state_created) { + if(!session->kex || !session->hostkey) { + if(key_state->state == libssh2_NB_state_created) { /* Preserve in case of failure */ key_state->oldlocal = session->local.kexinit; key_state->oldlocal_len = session->local.kexinit_len; @@ -2506,12 +4104,13 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, key_state->state = libssh2_NB_state_sent; } - if (key_state->state == libssh2_NB_state_sent) { + if(key_state->state == libssh2_NB_state_sent) { retcode = kexinit(session); - if (retcode == LIBSSH2_ERROR_EAGAIN) { + if(retcode == LIBSSH2_ERROR_EAGAIN) { session->state &= ~LIBSSH2_STATE_KEX_ACTIVE; return retcode; - } else if (retcode) { + } + else if(retcode) { session->local.kexinit = key_state->oldlocal; session->local.kexinit_len = key_state->oldlocal_len; key_state->state = libssh2_NB_state_idle; @@ -2523,18 +4122,18 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, key_state->state = libssh2_NB_state_sent1; } - if (key_state->state == libssh2_NB_state_sent1) { + if(key_state->state == libssh2_NB_state_sent1) { retcode = _libssh2_packet_require(session, SSH_MSG_KEXINIT, &key_state->data, &key_state->data_len, 0, NULL, 0, &key_state->req_state); - if (retcode == LIBSSH2_ERROR_EAGAIN) { + if(retcode == LIBSSH2_ERROR_EAGAIN) { session->state &= ~LIBSSH2_STATE_KEX_ACTIVE; return retcode; } - else if (retcode) { - if (session->local.kexinit) { + else if(retcode) { + if(session->local.kexinit) { LIBSSH2_FREE(session, session->local.kexinit); } session->local.kexinit = key_state->oldlocal; @@ -2545,42 +4144,45 @@ _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, return -1; } - if (session->remote.kexinit) { + if(session->remote.kexinit) { LIBSSH2_FREE(session, session->remote.kexinit); } session->remote.kexinit = key_state->data; session->remote.kexinit_len = key_state->data_len; - if (kex_agree_methods(session, key_state->data, + if(kex_agree_methods(session, key_state->data, key_state->data_len)) rc = LIBSSH2_ERROR_KEX_FAILURE; key_state->state = libssh2_NB_state_sent2; } - } else { + } + else { key_state->state = libssh2_NB_state_sent2; } - if (rc == 0 && session->kex) { - if (key_state->state == libssh2_NB_state_sent2) { + if(rc == 0 && session->kex) { + if(key_state->state == libssh2_NB_state_sent2) { retcode = session->kex->exchange_keys(session, &key_state->key_state_low); - if (retcode == LIBSSH2_ERROR_EAGAIN) { + if(retcode == LIBSSH2_ERROR_EAGAIN) { session->state &= ~LIBSSH2_STATE_KEX_ACTIVE; return retcode; - } else if (retcode) { - rc = _libssh2_error(session, LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE, + } + else if(retcode) { + rc = _libssh2_error(session, + LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE, "Unrecoverable error exchanging keys"); } } } /* Done with kexinit buffers */ - if (session->local.kexinit) { + if(session->local.kexinit) { LIBSSH2_FREE(session, session->local.kexinit); session->local.kexinit = NULL; } - if (session->remote.kexinit) { + if(session->remote.kexinit) { LIBSSH2_FREE(session, session->remote.kexinit); session->remote.kexinit = NULL; } @@ -2606,7 +4208,7 @@ libssh2_session_method_pref(LIBSSH2_SESSION * session, int method_type, int prefs_len = strlen(prefs); const LIBSSH2_COMMON_METHOD **mlist; - switch (method_type) { + switch(method_type) { case LIBSSH2_METHOD_KEX: prefvar = &session->kex_prefs; mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_kex_methods; @@ -2665,40 +4267,43 @@ libssh2_session_method_pref(LIBSSH2_SESSION * session, int method_type, } s = newprefs = LIBSSH2_ALLOC(session, prefs_len + 1); - if (!newprefs) { + if(!newprefs) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Error allocated space for method preferences"); } memcpy(s, prefs, prefs_len + 1); - while (s && *s && mlist) { + while(s && *s && mlist) { char *p = strchr(s, ','); int method_len = p ? (p - s) : (int) strlen(s); - if (!kex_get_method_by_name(s, method_len, mlist)) { + if(!kex_get_method_by_name(s, method_len, mlist)) { /* Strip out unsupported method */ - if (p) { + if(p) { memcpy(s, p + 1, strlen(s) - method_len); - } else { - if (s > newprefs) { + } + else { + if(s > newprefs) { *(--s) = '\0'; - } else { + } + else { *s = '\0'; } } } - - s = p ? (p + 1) : NULL; + else { + s = p ? (p + 1) : NULL; + } } - if (strlen(newprefs) == 0) { + if(strlen(newprefs) == 0) { LIBSSH2_FREE(session, newprefs); return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, "The requested method(s) are not currently " "supported"); } - if (*prefvar) { + if(*prefvar) { LIBSSH2_FREE(session, *prefvar); } *prefvar = newprefs; @@ -2714,7 +4319,7 @@ libssh2_session_method_pref(LIBSSH2_SESSION * session, int method_type, LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, int method_type, - const char*** algs) + const char ***algs) { unsigned int i; unsigned int j; @@ -2722,11 +4327,11 @@ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, const LIBSSH2_COMMON_METHOD **mlist; /* to prevent coredumps due to dereferencing of NULL */ - if (NULL == algs) + if(NULL == algs) return _libssh2_error(session, LIBSSH2_ERROR_BAD_USE, "algs must not be NULL"); - switch (method_type) { + switch(method_type) { case LIBSSH2_METHOD_KEX: mlist = (const LIBSSH2_COMMON_METHOD **) libssh2_kex_methods; break; @@ -2747,7 +4352,8 @@ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, case LIBSSH2_METHOD_COMP_CS: case LIBSSH2_METHOD_COMP_SC: - mlist = (const LIBSSH2_COMMON_METHOD **) _libssh2_comp_methods(session); + mlist = (const LIBSSH2_COMMON_METHOD **) + _libssh2_comp_methods(session); break; default: @@ -2756,7 +4362,7 @@ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, } /* switch */ /* weird situation */ - if (NULL==mlist) + if(NULL == mlist) return _libssh2_error(session, LIBSSH2_ERROR_INVAL, "No algorithm found"); @@ -2773,28 +4379,28 @@ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, */ /* count the number of supported algorithms */ - for ( i=0, ialg=0; NULL!=mlist[i]; i++) { + for(i = 0, ialg = 0; NULL != mlist[i]; i++) { /* do not count fields with NULL name */ - if (mlist[i]->name) + if(mlist[i]->name) ialg++; } /* weird situation, no algorithm found */ - if (0==ialg) + if(0 == ialg) return _libssh2_error(session, LIBSSH2_ERROR_INVAL, "No algorithm found"); /* allocate buffer */ - *algs = (const char**) LIBSSH2_ALLOC(session, ialg*sizeof(const char*)); - if ( NULL==*algs ) { + *algs = (const char **) LIBSSH2_ALLOC(session, ialg*sizeof(const char *)); + if(NULL == *algs) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Memory allocation failed"); } /* Past this point *algs must be deallocated in case of an error!! */ /* copy non-NULL pointers only */ - for ( i=0, j=0; NULL!=mlist[i] && jname ){ + for(i = 0, j = 0; NULL != mlist[i] && j < ialg; i++) { + if(NULL == mlist[i]->name) { /* maybe a weird situation but if it occurs, do not include NULL pointers */ continue; @@ -2805,7 +4411,7 @@ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, } /* correct number of pointers copied? (test the code above) */ - if ( j!=ialg ) { + if(j != ialg) { /* deallocate buffer */ LIBSSH2_FREE(session, (void *)*algs); *algs = NULL; diff --git a/vendor/libssh2/src/knownhost.c b/vendor/libssh2/src/knownhost.c index a32dcf876..b9dc47a80 100644 --- a/vendor/libssh2/src/knownhost.c +++ b/vendor/libssh2/src/knownhost.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2014 by Daniel Stenberg + * Copyright (c) 2009-2019 by Daniel Stenberg * All rights reserved. * * Redistribution and use in source and binary forms, @@ -71,7 +71,7 @@ static void free_host(LIBSSH2_SESSION *session, struct known_host *entry) if(entry) { if(entry->comment) LIBSSH2_FREE(session, entry->comment); - if (entry->key_type_name) + if(entry->key_type_name) LIBSSH2_FREE(session, entry->key_type_name); if(entry->key) LIBSSH2_FREE(session, entry->key); @@ -149,7 +149,8 @@ knownhost_add(LIBSSH2_KNOWNHOSTS *hosts, return _libssh2_error(hosts->session, LIBSSH2_ERROR_INVAL, "No key type set"); - if(!(entry = LIBSSH2_CALLOC(hosts->session, sizeof(struct known_host)))) + entry = LIBSSH2_CALLOC(hosts->session, sizeof(struct known_host)); + if(!entry) return _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for known host " "entry"); @@ -159,13 +160,13 @@ knownhost_add(LIBSSH2_KNOWNHOSTS *hosts, switch(entry->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) { case LIBSSH2_KNOWNHOST_TYPE_PLAIN: case LIBSSH2_KNOWNHOST_TYPE_CUSTOM: - entry->name = LIBSSH2_ALLOC(hosts->session, hostlen+1); + entry->name = LIBSSH2_ALLOC(hosts->session, hostlen + 1); if(!entry->name) { rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for host name"); goto error; } - memcpy(entry->name, host, hostlen+1); + memcpy(entry->name, host, hostlen + 1); entry->name_len = hostlen; break; case LIBSSH2_KNOWNHOST_TYPE_SHA1: @@ -193,14 +194,14 @@ knownhost_add(LIBSSH2_KNOWNHOSTS *hosts, /* the provided key is base64 encoded already */ if(!keylen) keylen = strlen(key); - entry->key = LIBSSH2_ALLOC(hosts->session, keylen+1); + entry->key = LIBSSH2_ALLOC(hosts->session, keylen + 1); if(!entry->key) { rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for key"); goto error; } - memcpy(entry->key, key, keylen+1); - entry->key[keylen]=0; /* force a terminating zero trailer */ + memcpy(entry->key, key, keylen + 1); + entry->key[keylen] = 0; /* force a terminating zero trailer */ } else { /* key is raw, we base64 encode it and store it as such */ @@ -216,28 +217,28 @@ knownhost_add(LIBSSH2_KNOWNHOSTS *hosts, entry->key = ptr; } - if (key_type_name && ((typemask & LIBSSH2_KNOWNHOST_KEY_MASK) == + if(key_type_name && ((typemask & LIBSSH2_KNOWNHOST_KEY_MASK) == LIBSSH2_KNOWNHOST_KEY_UNKNOWN)) { - entry->key_type_name = LIBSSH2_ALLOC(hosts->session, key_type_len+1); - if (!entry->key_type_name) { + entry->key_type_name = LIBSSH2_ALLOC(hosts->session, key_type_len + 1); + if(!entry->key_type_name) { rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for key type"); goto error; } memcpy(entry->key_type_name, key_type_name, key_type_len); - entry->key_type_name[key_type_len]=0; + entry->key_type_name[key_type_len] = 0; entry->key_type_len = key_type_len; } - if (comment) { - entry->comment = LIBSSH2_ALLOC(hosts->session, commentlen+1); + if(comment) { + entry->comment = LIBSSH2_ALLOC(hosts->session, commentlen + 1); if(!entry->comment) { rc = _libssh2_error(hosts->session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for comment"); goto error; } - memcpy(entry->comment, comment, commentlen+1); - entry->comment[commentlen]=0; /* force a terminating zero trailer */ + memcpy(entry->comment, comment, commentlen + 1); + entry->comment[commentlen] = 0; /* force a terminating zero trailer */ entry->comment_len = commentlen; } else { @@ -370,7 +371,7 @@ knownhost_check(LIBSSH2_KNOWNHOSTS *hosts, plain 'host' */ if(port >= 0) { int len = snprintf(hostbuff, sizeof(hostbuff), "[%s]:%d", hostp, port); - if (len < 0 || len >= (int)sizeof(hostbuff)) { + if(len < 0 || len >= (int)sizeof(hostbuff)) { _libssh2_error(hosts->session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, "Known-host write buffer too small"); @@ -401,7 +402,7 @@ knownhost_check(LIBSSH2_KNOWNHOSTS *hosts, do { node = _libssh2_list_first(&hosts->head); - while (node) { + while(node) { switch(node->typemask & LIBSSH2_KNOWNHOST_TYPE_MASK) { case LIBSSH2_KNOWNHOST_TYPE_PLAIN: if(type == LIBSSH2_KNOWNHOST_TYPE_PLAIN) @@ -450,13 +451,13 @@ knownhost_check(LIBSSH2_KNOWNHOSTS *hosts, - if key_type is set to zero, ignore it an match always - otherwise match when both key types are equal */ - if ( (host_key_type != LIBSSH2_KNOWNHOST_KEY_UNKNOWN ) && - ( (host_key_type == 0) || - (host_key_type == known_key_type) ) ) { + if(host_key_type != LIBSSH2_KNOWNHOST_KEY_UNKNOWN && + (host_key_type == 0 || + host_key_type == known_key_type)) { /* host name and key type match, now compare the keys */ if(!strcmp(key, node->key)) { /* they match! */ - if (ext) + if(ext) *ext = knownhost_to_external(node); badkey = NULL; rc = LIBSSH2_KNOWNHOST_CHECK_MATCH; @@ -472,14 +473,14 @@ knownhost_check(LIBSSH2_KNOWNHOSTS *hosts, } match = 0; /* don't count this as a match anymore */ } - node= _libssh2_list_next(&node->node); + node = _libssh2_list_next(&node->node); } host = hostp; } while(!match && --numcheck); if(badkey) { /* key mismatch */ - if (ext) + if(ext) *ext = knownhost_to_external(badkey); rc = LIBSSH2_KNOWNHOST_CHECK_MISMATCH; } @@ -646,7 +647,7 @@ static int oldstyle_hostline(LIBSSH2_KNOWNHOSTS *hosts, /* copy host name to the temp buffer and zero terminate */ memcpy(hostbuf, name, namelen); - hostbuf[namelen]=0; + hostbuf[namelen] = 0; rc = knownhost_add(hosts, hostbuf, NULL, key_type_name, key_type_len, @@ -685,7 +686,7 @@ static int hashed_hostline(LIBSSH2_KNOWNHOSTS *hosts, for(p = salt; *p && (*p != '|'); p++) ; - if(*p=='|') { + if(*p == '|') { const char *hash = NULL; size_t saltlen = p - salt; if(saltlen >= (sizeof(saltbuf)-1)) /* weird length */ @@ -698,11 +699,11 @@ static int hashed_hostline(LIBSSH2_KNOWNHOSTS *hosts, saltbuf[saltlen] = 0; /* zero terminate */ salt = saltbuf; /* point to the stack based buffer */ - hash = p+1; /* the host hash is after the separator */ + hash = p + 1; /* the host hash is after the separator */ /* now make the host point to the hash */ host = hash; - hostlen -= saltlen+1; /* deduct the salt and separator */ + hostlen -= saltlen + 1; /* deduct the salt and separator */ /* check that the lengths seem sensible */ if(hostlen >= sizeof(hostbuf)-1) @@ -712,7 +713,7 @@ static int hashed_hostline(LIBSSH2_KNOWNHOSTS *hosts, "(unexpected length)"); memcpy(hostbuf, host, hostlen); - hostbuf[hostlen]=0; + hostbuf[hostlen] = 0; return knownhost_add(hosts, hostbuf, salt, key_type_name, key_type_len, @@ -766,17 +767,25 @@ static int hostline(LIBSSH2_KNOWNHOSTS *hosts, default: key_type_name = key; - while (keylen && *key && + while(keylen && *key && (*key != ' ') && (*key != '\t')) { key++; keylen--; } key_type_len = key - key_type_name; - if (!strncmp(key_type_name, "ssh-dss", key_type_len)) + if(!strncmp(key_type_name, "ssh-dss", key_type_len)) key_type = LIBSSH2_KNOWNHOST_KEY_SSHDSS; - else if (!strncmp(key_type_name, "ssh-rsa", key_type_len)) + else if(!strncmp(key_type_name, "ssh-rsa", key_type_len)) key_type = LIBSSH2_KNOWNHOST_KEY_SSHRSA; + else if(!strncmp(key_type_name, "ecdsa-sha2-nistp256", key_type_len)) + key_type = LIBSSH2_KNOWNHOST_KEY_ECDSA_256; + else if(!strncmp(key_type_name, "ecdsa-sha2-nistp384", key_type_len)) + key_type = LIBSSH2_KNOWNHOST_KEY_ECDSA_384; + else if(!strncmp(key_type_name, "ecdsa-sha2-nistp521", key_type_len)) + key_type = LIBSSH2_KNOWNHOST_KEY_ECDSA_521; + else if(!strncmp(key_type_name, "ssh-ed25519", key_type_len)) + key_type = LIBSSH2_KNOWNHOST_KEY_ED25519; else key_type = LIBSSH2_KNOWNHOST_KEY_UNKNOWN; @@ -800,7 +809,7 @@ static int hostline(LIBSSH2_KNOWNHOSTS *hosts, keylen -= commentlen; /* Distinguish empty comment (a space) from no comment (no space) */ - if (commentlen == 0) + if(commentlen == 0) comment = NULL; /* skip whitespaces */ @@ -879,7 +888,7 @@ libssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts, cp = line; /* skip leading whitespaces */ - while(len && ((*cp==' ') || (*cp == '\t'))) { + while(len && ((*cp == ' ') || (*cp == '\t'))) { cp++; len--; } @@ -892,7 +901,7 @@ libssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts, hostp = cp; /* move over the host to the separator */ - while(len && *cp && (*cp!=' ') && (*cp != '\t')) { + while(len && *cp && (*cp != ' ') && (*cp != '\t')) { cp++; len--; } @@ -900,7 +909,7 @@ libssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts, hostlen = cp - hostp; /* the key starts after the whitespaces */ - while(len && *cp && ((*cp==' ') || (*cp == '\t'))) { + while(len && *cp && ((*cp == ' ') || (*cp == '\t'))) { cp++; len--; } @@ -954,7 +963,7 @@ libssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts, "Unsupported type of known-host information " "store"); - file = fopen(filename, "r"); + file = fopen(filename, FOPEN_READTEXT); if(file) { while(fgets(buf, sizeof(buf), file)) { if(libssh2_knownhost_readline(hosts, buf, strlen(buf), type)) { @@ -1016,13 +1025,30 @@ knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts, key_type_name = "ssh-dss"; key_type_len = 7; break; + case LIBSSH2_KNOWNHOST_KEY_ECDSA_256: + key_type_name = "ecdsa-sha2-nistp256"; + key_type_len = 19; + break; + case LIBSSH2_KNOWNHOST_KEY_ECDSA_384: + key_type_name = "ecdsa-sha2-nistp384"; + key_type_len = 19; + break; + case LIBSSH2_KNOWNHOST_KEY_ECDSA_521: + key_type_name = "ecdsa-sha2-nistp521"; + key_type_len = 19; + break; + case LIBSSH2_KNOWNHOST_KEY_ED25519: + key_type_name = "ssh-ed25519"; + key_type_len = 11; + break; case LIBSSH2_KNOWNHOST_KEY_UNKNOWN: key_type_name = node->key_type_name; - if (key_type_name) { + if(key_type_name) { key_type_len = node->key_type_len; break; } /* otherwise fallback to default and error */ + /* FALL-THROUGH */ default: return _libssh2_error(hosts->session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, @@ -1033,7 +1059,7 @@ knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts, - Hashed (SHA1) or unhashed hostname - key name or no key name (RSA1) - comment or no comment - + This means there are 2^3 different formats: ("|1|%s|%s %s %s %s\n", salt, hashed_host, key_name, key, comment) ("|1|%s|%s %s %s\n", salt, hashed_host, key_name, key) @@ -1043,7 +1069,7 @@ knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts, ("%s %s %s\n", host, key_name, key) ("%s %s %s\n", host, key, comment) ("%s %s\n", host, key) - + Even if the buffer is too small, we have to set outlen to the number of characters the complete line would have taken. We also don't write anything to the buffer unless we are sure we can write everything to the @@ -1087,10 +1113,10 @@ knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts, if(node->comment && key_type_len) snprintf(buf, buflen, "|1|%s|%s %s %s %s\n", saltalloc, namealloc, key_type_name, node->key, node->comment); - else if (node->comment) + else if(node->comment) snprintf(buf, buflen, "|1|%s|%s %s %s\n", saltalloc, namealloc, node->key, node->comment); - else if (key_type_len) + else if(key_type_len) snprintf(buf, buflen, "|1|%s|%s %s %s\n", saltalloc, namealloc, key_type_name, node->key); else @@ -1109,10 +1135,10 @@ knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts, if(node->comment && key_type_len) snprintf(buf, buflen, "%s %s %s %s\n", node->name, key_type_name, node->key, node->comment); - else if (node->comment) + else if(node->comment) snprintf(buf, buflen, "%s %s %s\n", node->name, node->key, node->comment); - else if (key_type_len) + else if(key_type_len) snprintf(buf, buflen, "%s %s %s\n", node->name, key_type_name, node->key); else @@ -1178,7 +1204,7 @@ libssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts, "Unsupported type of known-host information " "store"); - file = fopen(filename, "w"); + file = fopen(filename, FOPEN_WRITETEXT); if(!file) return _libssh2_error(hosts->session, LIBSSH2_ERROR_FILE, "Failed to open file"); diff --git a/vendor/libssh2/src/libgcrypt.c b/vendor/libssh2/src/libgcrypt.c index 366d007a3..0aff176a6 100644 --- a/vendor/libssh2/src/libgcrypt.c +++ b/vendor/libssh2/src/libgcrypt.c @@ -66,17 +66,18 @@ _libssh2_rsa_new(libssh2_rsa_ctx ** rsa, (void) e2data; (void) e2len; - if (ddata) { + if(ddata) { rc = gcry_sexp_build (rsa, NULL, "(private-key(rsa(n%b)(e%b)(d%b)(q%b)(p%b)(u%b)))", nlen, ndata, elen, edata, dlen, ddata, plen, pdata, qlen, qdata, coefflen, coeffdata); - } else { + } + else { rc = gcry_sexp_build(rsa, NULL, "(public-key(rsa(n%b)(e%b)))", nlen, ndata, elen, edata); } - if (rc) { + if(rc) { *rsa = NULL; return -1; } @@ -99,12 +100,12 @@ _libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsa, rc = gcry_sexp_build(&s_hash, NULL, "(data (flags pkcs1) (hash sha1 %b))", SHA_DIGEST_LENGTH, hash); - if (rc != 0) { + if(rc != 0) { return -1; } rc = gcry_sexp_build(&s_sig, NULL, "(sig-val(rsa(s %b)))", sig_len, sig); - if (rc != 0) { + if(rc != 0) { gcry_sexp_release(s_hash); return -1; } @@ -130,18 +131,19 @@ _libssh2_dsa_new(libssh2_dsa_ctx ** dsactx, { int rc; - if (x_len) { + if(x_len) { rc = gcry_sexp_build (dsactx, NULL, "(private-key(dsa(p%b)(q%b)(g%b)(y%b)(x%b)))", p_len, p, q_len, q, g_len, g, y_len, y, x_len, x); - } else { + } + else { rc = gcry_sexp_build(dsactx, NULL, "(public-key(dsa(p%b)(q%b)(g%b)(y%b)))", p_len, p, q_len, q, g_len, g, y_len, y); } - if (rc) { + if(rc) { *dsactx = NULL; return -1; } @@ -172,84 +174,83 @@ _libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa, unsigned char *n, *e, *d, *p, *q, *e1, *e2, *coeff; unsigned int nlen, elen, dlen, plen, qlen, e1len, e2len, coefflen; - (void) passphrase; - - fp = fopen(filename, "r"); - if (!fp) { + fp = fopen(filename, FOPEN_READTEXT); + if(!fp) { return -1; } ret = _libssh2_pem_parse(session, "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----", + passphrase, fp, &data, &datalen); fclose(fp); - if (ret) { + if(ret) { return -1; } save_data = data; - if (_libssh2_pem_decode_sequence(&data, &datalen)) { + if(_libssh2_pem_decode_sequence(&data, &datalen)) { ret = -1; goto fail; } /* First read Version field (should be 0). */ ret = _libssh2_pem_decode_integer(&data, &datalen, &n, &nlen); - if (ret != 0 || (nlen != 1 && *n != '\0')) { + if(ret != 0 || (nlen != 1 && *n != '\0')) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &n, &nlen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &e, &elen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &d, &dlen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &q, &qlen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &e1, &e1len); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &e2, &e2len); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &coeff, &coefflen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } - if (_libssh2_rsa_new(rsa, e, elen, n, nlen, d, dlen, p, plen, + if(_libssh2_rsa_new(rsa, e, elen, n, nlen, d, dlen, p, plen, q, qlen, e1, e1len, e2, e2len, coeff, coefflen)) { ret = -1; goto fail; @@ -285,72 +286,71 @@ _libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa, unsigned char *p, *q, *g, *y, *x; unsigned int plen, qlen, glen, ylen, xlen; - (void) passphrase; - - fp = fopen(filename, "r"); - if (!fp) { + fp = fopen(filename, FOPEN_READTEXT); + if(!fp) { return -1; } ret = _libssh2_pem_parse(session, "-----BEGIN DSA PRIVATE KEY-----", "-----END DSA PRIVATE KEY-----", + passphrase, fp, &data, &datalen); fclose(fp); - if (ret) { + if(ret) { return -1; } save_data = data; - if (_libssh2_pem_decode_sequence(&data, &datalen)) { + if(_libssh2_pem_decode_sequence(&data, &datalen)) { ret = -1; goto fail; } /* First read Version field (should be 0). */ ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen); - if (ret != 0 || (plen != 1 && *p != '\0')) { + if(ret != 0 || (plen != 1 && *p != '\0')) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &p, &plen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &q, &qlen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &g, &glen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &y, &ylen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } ret = _libssh2_pem_decode_integer(&data, &datalen, &x, &xlen); - if (ret != 0) { + if(ret != 0) { ret = -1; goto fail; } - if (datalen != 0) { + if(datalen != 0) { ret = -1; goto fail; } - if (_libssh2_dsa_new(dsa, p, plen, q, qlen, g, glen, y, ylen, x, xlen)) { + if(_libssh2_dsa_new(dsa, p, plen, q, qlen, g, glen, y, ylen, x, xlen)) { ret = -1; goto fail; } @@ -375,11 +375,11 @@ _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, const char *tmp; size_t size; - if (hash_len != SHA_DIGEST_LENGTH) { + if(hash_len != SHA_DIGEST_LENGTH) { return -1; } - if (gcry_sexp_build(&data, NULL, + if(gcry_sexp_build(&data, NULL, "(data (flags pkcs1) (hash sha1 %b))", hash_len, hash)) { return -1; @@ -389,32 +389,36 @@ _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, gcry_sexp_release(data); - if (rc != 0) { + if(rc != 0) { return -1; } data = gcry_sexp_find_token(sig_sexp, "s", 0); - if (!data) { + if(!data) { return -1; } tmp = gcry_sexp_nth_data(data, 1, &size); - if (!tmp) { + if(!tmp) { + gcry_sexp_release(data); return -1; } - if (tmp[0] == '\0') { + if(tmp[0] == '\0') { tmp++; size--; } *signature = LIBSSH2_ALLOC(session, size); - if (!*signature) { + if(!*signature) { + gcry_sexp_release(data); return -1; } memcpy(*signature, tmp, size); *signature_len = size; + gcry_sexp_release(data); + return rc; } @@ -430,14 +434,15 @@ _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, const char *tmp; size_t size; - if (hash_len != SHA_DIGEST_LENGTH) { + if(hash_len != SHA_DIGEST_LENGTH) { return -1; } memcpy(zhash + 1, hash, hash_len); zhash[0] = 0; - if (gcry_sexp_build(&data, NULL, "(data (value %b))", hash_len + 1, zhash)) { + if(gcry_sexp_build(&data, NULL, "(data (value %b))", + hash_len + 1, zhash)) { return -1; } @@ -445,7 +450,7 @@ _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, gcry_sexp_release(data); - if (ret != 0) { + if(ret != 0) { return -1; } @@ -454,19 +459,19 @@ _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, /* Extract R. */ data = gcry_sexp_find_token(sig_sexp, "r", 0); - if (!data) + if(!data) goto err; tmp = gcry_sexp_nth_data(data, 1, &size); - if (!tmp) + if(!tmp) goto err; - if (tmp[0] == '\0') { + if(tmp[0] == '\0') { tmp++; size--; } - if (size < 1 || size > 20) + if(size < 1 || size > 20) goto err; memcpy(sig + (20 - size), tmp, size); @@ -476,19 +481,19 @@ _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, /* Extract S. */ data = gcry_sexp_find_token(sig_sexp, "s", 0); - if (!data) + if(!data) goto err; tmp = gcry_sexp_nth_data(data, 1, &size); - if (!tmp) + if(!tmp) goto err; - if (tmp[0] == '\0') { + if(tmp[0] == '\0') { tmp++; size--; } - if (size < 1 || size > 20) + if(size < 1 || size > 20) goto err; memcpy(sig + 20 + (20 - size), tmp, size); @@ -498,10 +503,10 @@ _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, ret = -1; out: - if (sig_sexp) { + if(sig_sexp) { gcry_sexp_release(sig_sexp); } - if (data) { + if(data) { gcry_sexp_release(data); } return ret; @@ -519,12 +524,12 @@ _libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx, libssh2_sha1(m, m_len, hash + 1); hash[0] = 0; - if (gcry_sexp_build(&s_hash, NULL, "(data(flags raw)(value %b))", + if(gcry_sexp_build(&s_hash, NULL, "(data(flags raw)(value %b))", SHA_DIGEST_LENGTH + 1, hash)) { return -1; } - if (gcry_sexp_build(&s_sig, NULL, "(sig-val(dsa(r %b)(s %b)))", + if(gcry_sexp_build(&s_sig, NULL, "(sig-val(dsa(r %b)(s %b)))", 20, sig, 20, sig + 20)) { gcry_sexp_release(s_hash); return -1; @@ -543,30 +548,30 @@ _libssh2_cipher_init(_libssh2_cipher_ctx * h, unsigned char *iv, unsigned char *secret, int encrypt) { int ret; - int cipher = _libssh2_gcry_cipher (algo); - int mode = _libssh2_gcry_mode (algo); + int cipher = _libssh2_gcry_cipher(algo); + int mode = _libssh2_gcry_mode(algo); int keylen = gcry_cipher_get_algo_keylen(cipher); (void) encrypt; ret = gcry_cipher_open(h, cipher, mode, 0); - if (ret) { + if(ret) { return -1; } ret = gcry_cipher_setkey(*h, secret, keylen); - if (ret) { + if(ret) { gcry_cipher_close(*h); return -1; } - if (mode != GCRY_CIPHER_MODE_STREAM) { + if(mode != GCRY_CIPHER_MODE_STREAM) { int blklen = gcry_cipher_get_algo_blklen(cipher); - if (mode == GCRY_CIPHER_MODE_CTR) + if(mode == GCRY_CIPHER_MODE_CTR) ret = gcry_cipher_setctr(*h, iv, blklen); else ret = gcry_cipher_setiv(*h, iv, blklen); - if (ret) { + if(ret) { gcry_cipher_close(*h); return -1; } @@ -580,12 +585,13 @@ _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx, _libssh2_cipher_type(algo), int encrypt, unsigned char *block, size_t blklen) { - int cipher = _libssh2_gcry_cipher (algo); + int cipher = _libssh2_gcry_cipher(algo); int ret; - if (encrypt) { + if(encrypt) { ret = gcry_cipher_encrypt(*ctx, block, blklen, block, blklen); - } else { + } + else { ret = gcry_cipher_decrypt(*ctx, block, blklen, block, blklen); } return ret; @@ -602,8 +608,9 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, const char *passphrase) { return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, - "Unable to extract public key from private key in memory: " - "Method unimplemented in libgcrypt backend"); + "Unable to extract public key from private " + "key in memory: " + "Method unimplemented in libgcrypt backend"); } int @@ -624,4 +631,37 @@ void _libssh2_init_aes_ctr(void) { /* no implementation */ } + +void +_libssh2_dh_init(_libssh2_dh_ctx *dhctx) +{ + *dhctx = gcry_mpi_new(0); /* Random from client */ +} + +int +_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order) +{ + /* Generate x and e */ + gcry_mpi_randomize(*dhctx, group_order * 8 - 1, GCRY_WEAK_RANDOM); + gcry_mpi_powm(public, g, *dhctx, p); + return 0; +} + +int +_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p) +{ + /* Compute the shared secret */ + gcry_mpi_powm(secret, f, *dhctx, p); + return 0; +} + +void +_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) +{ + gcry_mpi_release(*dhctx); + *dhctx = NULL; +} + #endif /* LIBSSH2_LIBGCRYPT */ diff --git a/vendor/libssh2/src/libgcrypt.h b/vendor/libssh2/src/libgcrypt.h index 11d6ad2dc..ec88aded6 100644 --- a/vendor/libssh2/src/libgcrypt.h +++ b/vendor/libssh2/src/libgcrypt.h @@ -54,10 +54,16 @@ #define LIBSSH2_RSA 1 #define LIBSSH2_DSA 1 +#define LIBSSH2_ECDSA 0 +#define LIBSSH2_ED25519 0 #define MD5_DIGEST_LENGTH 16 #define SHA_DIGEST_LENGTH 20 #define SHA256_DIGEST_LENGTH 32 +#define SHA384_DIGEST_LENGTH 48 +#define SHA512_DIGEST_LENGTH 64 + +#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) #define _libssh2_random(buf, len) \ (gcry_randomize ((buf), (len), GCRY_STRONG_RANDOM), 1) @@ -68,60 +74,82 @@ /* returns 0 in case of failure */ #define libssh2_sha1_init(ctx) \ - (GPG_ERR_NO_ERROR == gcry_md_open (ctx, GCRY_MD_SHA1, 0)) + (GPG_ERR_NO_ERROR == gcry_md_open(ctx, GCRY_MD_SHA1, 0)) #define libssh2_sha1_update(ctx, data, len) \ - gcry_md_write (ctx, (unsigned char *) data, len) + gcry_md_write(ctx, (unsigned char *) data, len) #define libssh2_sha1_final(ctx, out) \ - memcpy (out, gcry_md_read (ctx, 0), SHA_DIGEST_LENGTH), gcry_md_close (ctx) + memcpy(out, gcry_md_read(ctx, 0), SHA_DIGEST_LENGTH), gcry_md_close(ctx) #define libssh2_sha1(message, len, out) \ - gcry_md_hash_buffer (GCRY_MD_SHA1, out, message, len) + gcry_md_hash_buffer(GCRY_MD_SHA1, out, message, len) #define libssh2_sha256_ctx gcry_md_hd_t #define libssh2_sha256_init(ctx) \ - (GPG_ERR_NO_ERROR == gcry_md_open (ctx, GCRY_MD_SHA256, 0)) + (GPG_ERR_NO_ERROR == gcry_md_open(ctx, GCRY_MD_SHA256, 0)) #define libssh2_sha256_update(ctx, data, len) \ - gcry_md_write (ctx, (unsigned char *) data, len) + gcry_md_write(ctx, (unsigned char *) data, len) #define libssh2_sha256_final(ctx, out) \ - memcpy (out, gcry_md_read (ctx, 0), SHA256_DIGEST_LENGTH), gcry_md_close (ctx) + memcpy(out, gcry_md_read(ctx, 0), SHA256_DIGEST_LENGTH), gcry_md_close(ctx) #define libssh2_sha256(message, len, out) \ - gcry_md_hash_buffer (GCRY_MD_SHA256, out, message, len) + gcry_md_hash_buffer(GCRY_MD_SHA256, out, message, len) + +#define libssh2_sha384_ctx gcry_md_hd_t + +#define libssh2_sha384_init(ctx) \ + (GPG_ERR_NO_ERROR == gcry_md_open(ctx, GCRY_MD_SHA384, 0)) +#define libssh2_sha384_update(ctx, data, len) \ + gcry_md_write(ctx, (unsigned char *) data, len) +#define libssh2_sha384_final(ctx, out) \ + memcpy(out, gcry_md_read(ctx, 0), SHA384_DIGEST_LENGTH), gcry_md_close(ctx) +#define libssh2_sha384(message, len, out) \ + gcry_md_hash_buffer(GCRY_MD_SHA384, out, message, len) + +#define libssh2_sha512_ctx gcry_md_hd_t + +#define libssh2_sha512_init(ctx) \ + (GPG_ERR_NO_ERROR == gcry_md_open(ctx, GCRY_MD_SHA512, 0)) +#define libssh2_sha512_update(ctx, data, len) \ + gcry_md_write(ctx, (unsigned char *) data, len) +#define libssh2_sha512_final(ctx, out) \ + memcpy(out, gcry_md_read(ctx, 0), SHA512_DIGEST_LENGTH), gcry_md_close(ctx) +#define libssh2_sha512(message, len, out) \ + gcry_md_hash_buffer(GCRY_MD_SHA512, out, message, len) #define libssh2_md5_ctx gcry_md_hd_t /* returns 0 in case of failure */ #define libssh2_md5_init(ctx) \ - (GPG_ERR_NO_ERROR == gcry_md_open (ctx, GCRY_MD_MD5, 0)) + (GPG_ERR_NO_ERROR == gcry_md_open(ctx, GCRY_MD_MD5, 0)) #define libssh2_md5_update(ctx, data, len) \ - gcry_md_write (ctx, (unsigned char *) data, len) + gcry_md_write(ctx, (unsigned char *) data, len) #define libssh2_md5_final(ctx, out) \ - memcpy (out, gcry_md_read (ctx, 0), MD5_DIGEST_LENGTH), gcry_md_close (ctx) + memcpy(out, gcry_md_read(ctx, 0), MD5_DIGEST_LENGTH), gcry_md_close(ctx) #define libssh2_md5(message, len, out) \ - gcry_md_hash_buffer (GCRY_MD_MD5, out, message, len) + gcry_md_hash_buffer(GCRY_MD_MD5, out, message, len) #define libssh2_hmac_ctx gcry_md_hd_t #define libssh2_hmac_ctx_init(ctx) #define libssh2_hmac_sha1_init(ctx, key, keylen) \ - gcry_md_open (ctx, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC), \ - gcry_md_setkey (*ctx, key, keylen) + gcry_md_open(ctx, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC), \ + gcry_md_setkey(*ctx, key, keylen) #define libssh2_hmac_md5_init(ctx, key, keylen) \ - gcry_md_open (ctx, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC), \ - gcry_md_setkey (*ctx, key, keylen) + gcry_md_open(ctx, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC), \ + gcry_md_setkey(*ctx, key, keylen) #define libssh2_hmac_ripemd160_init(ctx, key, keylen) \ - gcry_md_open (ctx, GCRY_MD_RMD160, GCRY_MD_FLAG_HMAC), \ - gcry_md_setkey (*ctx, key, keylen) + gcry_md_open(ctx, GCRY_MD_RMD160, GCRY_MD_FLAG_HMAC), \ + gcry_md_setkey(*ctx, key, keylen) #define libssh2_hmac_sha256_init(ctx, key, keylen) \ - gcry_md_open (ctx, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC), \ - gcry_md_setkey (*ctx, key, keylen) + gcry_md_open(ctx, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC), \ + gcry_md_setkey(*ctx, key, keylen) #define libssh2_hmac_sha512_init(ctx, key, keylen) \ - gcry_md_open (ctx, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC), \ - gcry_md_setkey (*ctx, key, keylen) + gcry_md_open(ctx, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC), \ + gcry_md_setkey(*ctx, key, keylen) #define libssh2_hmac_update(ctx, data, datalen) \ - gcry_md_write (ctx, (unsigned char *) data, datalen) + gcry_md_write(ctx, (unsigned char *) data, datalen) #define libssh2_hmac_final(ctx, data) \ - memcpy (data, gcry_md_read (ctx, 0), \ - gcry_md_get_algo_dlen (gcry_md_get_algo (ctx))) + memcpy(data, gcry_md_read(ctx, 0), \ + gcry_md_get_algo_dlen(gcry_md_get_algo(ctx))) #define libssh2_hmac_cleanup(ctx) gcry_md_close (*ctx); #define libssh2_crypto_init() gcry_control (GCRYCTL_DISABLE_SECMEM) @@ -135,6 +163,11 @@ #define _libssh2_dsa_free(dsactx) gcry_sexp_release (dsactx) +#if LIBSSH2_ECDSA +#else +#define _libssh2_ec_key void +#endif + #define _libssh2_cipher_type(name) int name #define _libssh2_cipher_ctx gcry_cipher_hd_t @@ -171,13 +204,31 @@ #define _libssh2_bn_ctx_new() 0 #define _libssh2_bn_ctx_free(bnctx) ((void)0) #define _libssh2_bn_init() gcry_mpi_new(0) -#define _libssh2_bn_init_from_bin() NULL /* because gcry_mpi_scan() creates a new bignum */ -#define _libssh2_bn_rand(bn, bits, top, bottom) gcry_mpi_randomize (bn, bits, GCRY_WEAK_RANDOM) -#define _libssh2_bn_mod_exp(r, a, p, m, ctx) gcry_mpi_powm (r, a, p, m) +#define _libssh2_bn_init_from_bin() NULL /* because gcry_mpi_scan() creates a + new bignum */ #define _libssh2_bn_set_word(bn, val) gcry_mpi_set_ui(bn, val) -#define _libssh2_bn_from_bin(bn, len, val) gcry_mpi_scan(&((bn)), GCRYMPI_FMT_USG, val, len, NULL) -#define _libssh2_bn_to_bin(bn, val) gcry_mpi_print (GCRYMPI_FMT_USG, val, _libssh2_bn_bytes(bn), NULL, bn) -#define _libssh2_bn_bytes(bn) (gcry_mpi_get_nbits (bn) / 8 + ((gcry_mpi_get_nbits (bn) % 8 == 0) ? 0 : 1)) +#define _libssh2_bn_from_bin(bn, len, val) \ + gcry_mpi_scan(&((bn)), GCRYMPI_FMT_USG, val, len, NULL) +#define _libssh2_bn_to_bin(bn, val) \ + gcry_mpi_print(GCRYMPI_FMT_USG, val, _libssh2_bn_bytes(bn), NULL, bn) +#define _libssh2_bn_bytes(bn) \ + (gcry_mpi_get_nbits (bn) / 8 + \ + ((gcry_mpi_get_nbits (bn) % 8 == 0) ? 0 : 1)) #define _libssh2_bn_bits(bn) gcry_mpi_get_nbits (bn) #define _libssh2_bn_free(bn) gcry_mpi_release(bn) +#define _libssh2_dh_ctx struct gcry_mpi * +#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx) +#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \ + _libssh2_dh_key_pair(dhctx, public, g, p, group_order) +#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \ + _libssh2_dh_secret(dhctx, secret, f, p) +#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx) +extern void _libssh2_dh_init(_libssh2_dh_ctx *dhctx); +extern int _libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, + int group_order); +extern int _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p); +extern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); + diff --git a/vendor/libssh2/src/libssh2_config.h.in b/vendor/libssh2/src/libssh2_config.h.in index af4ab9ca0..307c62553 100644 --- a/vendor/libssh2/src/libssh2_config.h.in +++ b/vendor/libssh2/src/libssh2_config.h.in @@ -64,8 +64,8 @@ /* Define if you have the gcrypt library. */ #undef HAVE_LIBGCRYPT -/* Define if you have the mbedtls library. */ -#undef HAVE_LIBMBEDTLS +/* Define if you have the mbedcrypto library. */ +#undef HAVE_LIBMBEDCRYPTO /* Define if you have the ssl library. */ #undef HAVE_LIBSSL @@ -79,6 +79,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `memset_s' function. */ +#undef HAVE_MEMSET_S + /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H @@ -178,10 +181,10 @@ /* Use mbedtls */ #undef LIBSSH2_MBEDTLS -/* Use OpenSSL */ +/* Use openssl */ #undef LIBSSH2_OPENSSL -/* Use Windows CNG */ +/* Use wincng */ #undef LIBSSH2_WINCNG /* Define to the sub-directory where libtool stores uninstalled libraries. */ diff --git a/vendor/libssh2/src/libssh2_priv.h b/vendor/libssh2/src/libssh2_priv.h index bb5d1a50a..33c5ad3f8 100644 --- a/vendor/libssh2/src/libssh2_priv.h +++ b/vendor/libssh2/src/libssh2_priv.h @@ -58,18 +58,15 @@ #include #include -/* The following CPP block should really only be in session.c and - packet.c. However, AIX have #define's for 'events' and 'revents' - and we are using those names in libssh2.h, so we need to include - the AIX headers first, to make sure all code is compiled with - consistent names of these fields. While arguable the best would to - change libssh2.h to use other names, that would break backwards - compatibility. For more information, see: - https://www.mail-archive.com/libssh2-devel%40lists.sourceforge.net/msg00003.html - https://www.mail-archive.com/libssh2-devel%40lists.sourceforge.net/msg00224.html +/* The following CPP block should really only be in session.c and packet.c. + However, AIX have #define's for 'events' and 'revents' and we are using + those names in libssh2.h, so we need to include the AIX headers first, to + make sure all code is compiled with consistent names of these fields. + While arguable the best would to change libssh2.h to use other names, that + would break backwards compatibility. */ #ifdef HAVE_POLL -# include +# include #else # if defined(HAVE_SELECT) && !defined(WIN32) # ifdef HAVE_SYS_SELECT_H @@ -118,13 +115,13 @@ struct iovec { size_t iov_len; - void * iov_base; + void *iov_base; }; static inline int writev(int sock, struct iovec *iov, int nvecs) { DWORD ret; - if (WSASend(sock, (LPWSABUF)iov, nvecs, &ret, 0, NULL, NULL) == 0) { + if(WSASend(sock, (LPWSABUF)iov, nvecs, &ret, 0, NULL, NULL) == 0) { return ret; } return -1; @@ -166,7 +163,7 @@ static inline int writev(int sock, struct iovec *iov, int nvecs) * padding length, payload, padding, and MAC.)." */ #define MAX_SSH_PACKET_LEN 35000 -#define MAX_SHA_DIGEST_LEN SHA256_DIGEST_LENGTH +#define MAX_SHA_DIGEST_LEN SHA512_DIGEST_LENGTH #define LIBSSH2_ALLOC(session, count) \ session->alloc((count), &(session)->abstract) @@ -260,11 +257,10 @@ typedef struct kmdhgGPshakex_state_t size_t s_packet_len; size_t tmp_len; _libssh2_bn_ctx *ctx; - _libssh2_bn *x; + _libssh2_dh_ctx x; _libssh2_bn *e; _libssh2_bn *f; _libssh2_bn *k; - unsigned char *s; unsigned char *f_value; unsigned char *k_value; unsigned char *h_sig; @@ -283,10 +279,18 @@ typedef struct key_exchange_state_low_t kmdhgGPshakex_state_t exchange_state; _libssh2_bn *p; /* SSH2 defined value (p_value) */ _libssh2_bn *g; /* SSH2 defined value (2) */ - unsigned char request[13]; + unsigned char request[256]; /* Must fit EC_MAX_POINT_LEN + data */ unsigned char *data; size_t request_len; size_t data_len; + _libssh2_ec_key *private_key; /* SSH2 ecdh private key */ + unsigned char *public_key_oct; /* SSH2 ecdh public key octal value */ + size_t public_key_oct_len; /* SSH2 ecdh public key octal value + length */ + unsigned char *curve25519_public_key; /* curve25519 public key, 32 + bytes */ + unsigned char *curve25519_private_key; /* curve25519 private key, 32 + bytes */ } key_exchange_state_low_t; typedef struct key_exchange_state_t @@ -418,7 +422,8 @@ struct _LIBSSH2_CHANNEL /* State variables used in libssh2_channel_receive_window_adjust() */ libssh2_nonblocking_states adjust_state; - unsigned char adjust_adjust[9]; /* packet_type(1) + channel(4) + adjustment(4) */ + unsigned char adjust_adjust[9]; /* packet_type(1) + channel(4) + + adjustment(4) */ /* State variables used in libssh2_channel_read_ex() */ libssh2_nonblocking_states read_state; @@ -621,6 +626,9 @@ struct _LIBSSH2_SESSION unsigned char server_hostkey_sha1[SHA_DIGEST_LENGTH]; int server_hostkey_sha1_valid; + unsigned char server_hostkey_sha256[SHA256_DIGEST_LENGTH]; + int server_hostkey_sha256_valid; + /* (remote as source of data -- packet_read ) */ libssh2_endpoint_data remote; @@ -654,8 +662,9 @@ struct _LIBSSH2_SESSION struct transportpacket packet; #ifdef LIBSSH2DEBUG int showmask; /* what debug/trace messages to display */ - libssh2_trace_handler_func tracehandler; /* callback to display trace messages */ - void* tracehandler_context; /* context for the trace handler */ + libssh2_trace_handler_func tracehandler; /* callback to display trace + messages */ + void *tracehandler_context; /* context for the trace handler */ #endif /* State variables used in libssh2_banner_send() */ @@ -862,7 +871,8 @@ struct _LIBSSH2_KEX_METHOD { const char *name; - /* Key exchange, populates session->* and returns 0 on success, non-0 on error */ + /* Key exchange, populates session->* and returns 0 on success, non-0 on + error */ int (*exchange_keys) (LIBSSH2_SESSION * session, key_exchange_state_low_t * key_state); @@ -879,8 +889,10 @@ struct _LIBSSH2_HOSTKEY_METHOD int (*initPEM) (LIBSSH2_SESSION * session, const char *privkeyfile, unsigned const char *passphrase, void **abstract); int (*initPEMFromMemory) (LIBSSH2_SESSION * session, - const char *privkeyfiledata, size_t privkeyfiledata_len, - unsigned const char *passphrase, void **abstract); + const char *privkeyfiledata, + size_t privkeyfiledata_len, + unsigned const char *passphrase, + void **abstract); int (*sig_verify) (LIBSSH2_SESSION * session, const unsigned char *sig, size_t sig_len, const unsigned char *m, size_t m_len, void **abstract); @@ -896,6 +908,7 @@ struct _LIBSSH2_HOSTKEY_METHOD struct _LIBSSH2_CRYPT_METHOD { const char *name; + const char *pem_annotation; int blocksize; @@ -942,7 +955,8 @@ struct _LIBSSH2_COMP_METHOD void _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...); #else -#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__GNUC__) +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__GNUC__) /* C99 supported and also by older GCC */ #define _libssh2_debug(x,y,z,...) do {} while (0) #else @@ -963,7 +977,8 @@ _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...) /* Initial packet state, prior to MAC check */ #define LIBSSH2_MAC_UNCONFIRMED 1 -/* When MAC type is "none" (proto initiation phase) all packets are deemed "confirmed" */ +/* When MAC type is "none" (proto initiation phase) all packets are deemed + "confirmed" */ #define LIBSSH2_MAC_CONFIRMED 0 /* Something very bad is going on */ #define LIBSSH2_MAC_INVALID -1 @@ -988,13 +1003,18 @@ _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...) #define SSH_MSG_KEXDH_INIT 30 #define SSH_MSG_KEXDH_REPLY 31 -/* diffie-hellman-group-exchange-sha1 and diffie-hellman-group-exchange-sha256 */ +/* diffie-hellman-group-exchange-sha1 and + diffie-hellman-group-exchange-sha256 */ #define SSH_MSG_KEX_DH_GEX_REQUEST_OLD 30 #define SSH_MSG_KEX_DH_GEX_REQUEST 34 #define SSH_MSG_KEX_DH_GEX_GROUP 31 #define SSH_MSG_KEX_DH_GEX_INIT 32 #define SSH_MSG_KEX_DH_GEX_REPLY 33 +/* ecdh */ +#define SSH2_MSG_KEX_ECDH_INIT 30 +#define SSH2_MSG_KEX_ECDH_REPLY 31 + /* User Authentication */ #define SSH_MSG_USERAUTH_REQUEST 50 #define SSH_MSG_USERAUTH_FAILURE 51 @@ -1049,31 +1069,75 @@ int _libssh2_kex_exchange(LIBSSH2_SESSION * session, int reexchange, const LIBSSH2_CRYPT_METHOD **libssh2_crypt_methods(void); const LIBSSH2_HOSTKEY_METHOD **libssh2_hostkey_methods(void); +/* misc.c */ +int _libssh2_bcrypt_pbkdf(const char *pass, + size_t passlen, + const uint8_t *salt, + size_t saltlen, + uint8_t *key, + size_t keylen, + unsigned int rounds); + /* pem.c */ int _libssh2_pem_parse(LIBSSH2_SESSION * session, const char *headerbegin, const char *headerend, + const unsigned char *passphrase, FILE * fp, unsigned char **data, unsigned int *datalen); int _libssh2_pem_parse_memory(LIBSSH2_SESSION * session, const char *headerbegin, const char *headerend, const char *filedata, size_t filedata_len, unsigned char **data, unsigned int *datalen); + /* OpenSSL keys */ +int +_libssh2_openssh_pem_parse(LIBSSH2_SESSION * session, + const unsigned char *passphrase, + FILE * fp, struct string_buf **decrypted_buf); +int +_libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session, + const unsigned char *passphrase, + const char *filedata, size_t filedata_len, + struct string_buf **decrypted_buf); + int _libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen); int _libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen, unsigned char **i, unsigned int *ilen); /* global.c */ -void _libssh2_init_if_needed (void); +void _libssh2_init_if_needed(void); #define ARRAY_SIZE(a) (sizeof ((a)) / sizeof ((a)[0])) /* define to output the libssh2_int64_t type in a *printf() */ -#if defined( __BORLANDC__ ) || defined( _MSC_VER ) || defined( __MINGW32__ ) +#if defined(__BORLANDC__) || defined(_MSC_VER) || defined(__MINGW32__) #define LIBSSH2_INT64_T_FORMAT "I64d" #else #define LIBSSH2_INT64_T_FORMAT "lld" #endif +/* In Windows the default file mode is text but an application can override it. +Therefore we specify it explicitly. https://github.com/curl/curl/pull/258 +*/ +#if defined(WIN32) || defined(MSDOS) +#define FOPEN_READTEXT "rt" +#define FOPEN_WRITETEXT "wt" +#define FOPEN_APPENDTEXT "at" +#elif defined(__CYGWIN__) +/* Cygwin has specific behavior we need to address when WIN32 is not defined. +https://cygwin.com/cygwin-ug-net/using-textbinary.html +For write we want our output to have line endings of LF and be compatible with +other Cygwin utilities. For read we want to handle input that may have line +endings either CRLF or LF so 't' is appropriate. +*/ +#define FOPEN_READTEXT "rt" +#define FOPEN_WRITETEXT "w" +#define FOPEN_APPENDTEXT "a" +#else +#define FOPEN_READTEXT "r" +#define FOPEN_WRITETEXT "w" +#define FOPEN_APPENDTEXT "a" +#endif + #endif /* LIBSSH2_H */ diff --git a/vendor/libssh2/src/mac.c b/vendor/libssh2/src/mac.c index 5ec26eb3b..5ac71df4c 100644 --- a/vendor/libssh2/src/mac.c +++ b/vendor/libssh2/src/mac.c @@ -86,7 +86,7 @@ mac_method_common_init(LIBSSH2_SESSION * session, unsigned char *key, static int mac_method_common_dtor(LIBSSH2_SESSION * session, void **abstract) { - if (*abstract) { + if(*abstract) { LIBSSH2_FREE(session, *abstract); } *abstract = NULL; @@ -118,7 +118,7 @@ mac_method_hmac_sha2_512_hash(LIBSSH2_SESSION * session, libssh2_hmac_sha512_init(&ctx, *abstract, 64); libssh2_hmac_update(ctx, seqno_buf, 4); libssh2_hmac_update(ctx, packet, packet_len); - if (addtl && addtl_len) { + if(addtl && addtl_len) { libssh2_hmac_update(ctx, addtl, addtl_len); } libssh2_hmac_final(ctx, buf); @@ -163,7 +163,7 @@ mac_method_hmac_sha2_256_hash(LIBSSH2_SESSION * session, libssh2_hmac_sha256_init(&ctx, *abstract, 32); libssh2_hmac_update(ctx, seqno_buf, 4); libssh2_hmac_update(ctx, packet, packet_len); - if (addtl && addtl_len) { + if(addtl && addtl_len) { libssh2_hmac_update(ctx, addtl, addtl_len); } libssh2_hmac_final(ctx, buf); @@ -208,7 +208,7 @@ mac_method_hmac_sha1_hash(LIBSSH2_SESSION * session, libssh2_hmac_sha1_init(&ctx, *abstract, 20); libssh2_hmac_update(ctx, seqno_buf, 4); libssh2_hmac_update(ctx, packet, packet_len); - if (addtl && addtl_len) { + if(addtl && addtl_len) { libssh2_hmac_update(ctx, addtl, addtl_len); } libssh2_hmac_final(ctx, buf); @@ -281,7 +281,7 @@ mac_method_hmac_md5_hash(LIBSSH2_SESSION * session, unsigned char *buf, libssh2_hmac_md5_init(&ctx, *abstract, 16); libssh2_hmac_update(ctx, seqno_buf, 4); libssh2_hmac_update(ctx, packet, packet_len); - if (addtl && addtl_len) { + if(addtl && addtl_len) { libssh2_hmac_update(ctx, addtl, addtl_len); } libssh2_hmac_final(ctx, buf); @@ -354,7 +354,7 @@ mac_method_hmac_ripemd160_hash(LIBSSH2_SESSION * session, libssh2_hmac_ripemd160_init(&ctx, *abstract, 20); libssh2_hmac_update(ctx, seqno_buf, 4); libssh2_hmac_update(ctx, packet, packet_len); - if (addtl && addtl_len) { + if(addtl && addtl_len) { libssh2_hmac_update(ctx, addtl, addtl_len); } libssh2_hmac_final(ctx, buf); diff --git a/vendor/libssh2/src/mbedtls.c b/vendor/libssh2/src/mbedtls.c index 1d181e18f..8bbcfd8d0 100644 --- a/vendor/libssh2/src/mbedtls.c +++ b/vendor/libssh2/src/mbedtls.c @@ -1,7 +1,52 @@ +/* Copyright (c) 2016, Art + * 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. + * + * Neither the name of the copyright holder nor the names + * of any other contributors may be used to endorse or + * promote products derived from this software without + * specific prior written permission. + * + * 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. + */ + #include "libssh2_priv.h" #ifdef LIBSSH2_MBEDTLS /* compile only if we build with mbedtls */ +/*******************************************************************/ +/* + * mbedTLS backend: Global context handles + */ + +static mbedtls_entropy_context _libssh2_mbedtls_entropy; +static mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg; + /*******************************************************************/ /* * mbedTLS backend: Generic functions @@ -18,7 +63,7 @@ _libssh2_mbedtls_init(void) ret = mbedtls_ctr_drbg_seed(&_libssh2_mbedtls_ctr_drbg, mbedtls_entropy_func, &_libssh2_mbedtls_entropy, NULL, 0); - if (ret != 0) + if(ret != 0) mbedtls_ctr_drbg_free(&_libssh2_mbedtls_ctr_drbg); } @@ -44,11 +89,11 @@ _libssh2_mbedtls_safe_free(void *buf, int len) (void)len; #endif - if (!buf) + if(!buf) return; #ifdef LIBSSH2_CLEAR_MEMORY - if (len > 0) + if(len > 0) memset(buf, 0, len); #endif @@ -65,7 +110,7 @@ _libssh2_mbedtls_cipher_init(_libssh2_cipher_ctx *ctx, const mbedtls_cipher_info_t *cipher_info; int ret, op; - if (!ctx) + if(!ctx) return -1; op = encrypt == 0 ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT; @@ -99,11 +144,10 @@ _libssh2_mbedtls_cipher_crypt(_libssh2_cipher_ctx *ctx, (void) encrypt; (void) algo; - osize = blocklen+mbedtls_cipher_get_block_size(ctx); + osize = blocklen + mbedtls_cipher_get_block_size(ctx); output = (unsigned char *)mbedtls_calloc(osize, sizeof(char)); - if(output) - { + if(output) { ret = mbedtls_cipher_reset(ctx); if(!ret) @@ -112,7 +156,7 @@ _libssh2_mbedtls_cipher_crypt(_libssh2_cipher_ctx *ctx, if(!ret) ret = mbedtls_cipher_finish(ctx, output + olen, &finish_olen); - if (!ret) { + if(!ret) { olen += finish_olen; memcpy(block, output, olen); } @@ -148,8 +192,8 @@ _libssh2_mbedtls_hash_init(mbedtls_md_context_t *ctx, mbedtls_md_init(ctx); ret = mbedtls_md_setup(ctx, md_info, hmac); - if (!ret){ - if (hmac) + if(!ret) { + if(hmac) ret = mbedtls_md_hmac_starts(ctx, key, keylen); else ret = mbedtls_md_starts(ctx); @@ -196,50 +240,61 @@ _libssh2_mbedtls_bignum_init(void) _libssh2_bn *bignum; bignum = (_libssh2_bn *)mbedtls_calloc(1, sizeof(_libssh2_bn)); - if (bignum) { + if(bignum) { mbedtls_mpi_init(bignum); } return bignum; } -int +void +_libssh2_mbedtls_bignum_free(_libssh2_bn *bn) +{ + if(bn) { + mbedtls_mpi_free(bn); + mbedtls_free(bn); + } +} + +static int _libssh2_mbedtls_bignum_random(_libssh2_bn *bn, int bits, int top, int bottom) { size_t len; int err; int i; - if (!bn || bits <= 0) + if(!bn || bits <= 0) return -1; len = (bits + 7) >> 3; - err = mbedtls_mpi_fill_random(bn, len, mbedtls_ctr_drbg_random, &_libssh2_mbedtls_ctr_drbg); - if (err) + err = mbedtls_mpi_fill_random(bn, len, mbedtls_ctr_drbg_random, + &_libssh2_mbedtls_ctr_drbg); + if(err) return -1; /* Zero unsued bits above the most significant bit*/ - for(i=len*8-1;bits<=i;--i) { + for(i = len*8 - 1; bits <= i; --i) { err = mbedtls_mpi_set_bit(bn, i, 0); - if (err) + if(err) return -1; } - /* If `top` is -1, the most significant bit of the random number can be zero. - If top is 0, the most significant bit of the random number is set to 1, - and if top is 1, the two most significant bits of the number will be set - to 1, so that the product of two such random numbers will always have 2*bits length. + /* If `top` is -1, the most significant bit of the random number can be + zero. If top is 0, the most significant bit of the random number is + set to 1, and if top is 1, the two most significant bits of the number + will be set to 1, so that the product of two such random numbers will + always have 2*bits length. */ - for(i=0;i<=top;++i) { + for(i = 0; i <= top; ++i) { err = mbedtls_mpi_set_bit(bn, bits-i-1, 1); - if (err) + if(err) return -1; } /* make odd by setting first bit in least significant byte */ - if (bottom) { + if(bottom) { err = mbedtls_mpi_set_bit(bn, 0, 1); - if (err) + if(err) return -1; } @@ -275,42 +330,40 @@ _libssh2_mbedtls_rsa_new(libssh2_rsa_ctx **rsa, libssh2_rsa_ctx *ctx; ctx = (libssh2_rsa_ctx *) mbedtls_calloc(1, sizeof(libssh2_rsa_ctx)); - if (ctx != NULL) { + if(ctx != NULL) { mbedtls_rsa_init(ctx, MBEDTLS_RSA_PKCS_V15, 0); } else return -1; - if( (ret = mbedtls_mpi_read_binary(&(ctx->E), edata, elen) ) != 0 || - (ret = mbedtls_mpi_read_binary(&(ctx->N), ndata, nlen) ) != 0 ) - { + /* !checksrc! disable ASSIGNWITHINCONDITION 1 */ + if((ret = mbedtls_mpi_read_binary(&(ctx->E), edata, elen) ) != 0 || + (ret = mbedtls_mpi_read_binary(&(ctx->N), ndata, nlen) ) != 0) { ret = -1; } - if (!ret) - { + if(!ret) { ctx->len = mbedtls_mpi_size(&(ctx->N)); } - if (!ret && ddata) - { - if( (ret = mbedtls_mpi_read_binary(&(ctx->D) , ddata, dlen) ) != 0 || - (ret = mbedtls_mpi_read_binary(&(ctx->P) , pdata, plen) ) != 0 || - (ret = mbedtls_mpi_read_binary(&(ctx->Q) , qdata, qlen) ) != 0 || - (ret = mbedtls_mpi_read_binary(&(ctx->DP), e1data, e1len) ) != 0 || - (ret = mbedtls_mpi_read_binary(&(ctx->DQ), e2data, e2len) ) != 0 || - (ret = mbedtls_mpi_read_binary(&(ctx->QP), coeffdata, coefflen) ) != 0 ) - { + if(!ret && ddata) { + /* !checksrc! disable ASSIGNWITHINCONDITION 1 */ + if((ret = mbedtls_mpi_read_binary(&(ctx->D), ddata, dlen) ) != 0 || + (ret = mbedtls_mpi_read_binary(&(ctx->P), pdata, plen) ) != 0 || + (ret = mbedtls_mpi_read_binary(&(ctx->Q), qdata, qlen) ) != 0 || + (ret = mbedtls_mpi_read_binary(&(ctx->DP), e1data, e1len) ) != 0 || + (ret = mbedtls_mpi_read_binary(&(ctx->DQ), e2data, e2len) ) != 0 || + (ret = mbedtls_mpi_read_binary(&(ctx->QP), coeffdata, coefflen) ) + != 0) { ret = -1; } ret = mbedtls_rsa_check_privkey(ctx); } - else if (!ret) - { + else if(!ret) { ret = mbedtls_rsa_check_pubkey(ctx); } - if (ret && ctx) { + if(ret && ctx) { _libssh2_mbedtls_rsa_free(ctx); ctx = NULL; } @@ -326,17 +379,17 @@ _libssh2_mbedtls_rsa_new_private(libssh2_rsa_ctx **rsa, { int ret; mbedtls_pk_context pkey; + mbedtls_rsa_context *pk_rsa; *rsa = (libssh2_rsa_ctx *) LIBSSH2_ALLOC(session, sizeof(libssh2_rsa_ctx)); - if (*rsa == NULL) + if(*rsa == NULL) return -1; mbedtls_rsa_init(*rsa, MBEDTLS_RSA_PKCS_V15, 0); mbedtls_pk_init(&pkey); ret = mbedtls_pk_parse_keyfile(&pkey, filename, (char *)passphrase); - if( ret != 0 || mbedtls_pk_get_type(&pkey) != MBEDTLS_PK_RSA) - { + if(ret != 0 || mbedtls_pk_get_type(&pkey) != MBEDTLS_PK_RSA) { mbedtls_pk_free(&pkey); mbedtls_rsa_free(*rsa); LIBSSH2_FREE(session, *rsa); @@ -344,7 +397,7 @@ _libssh2_mbedtls_rsa_new_private(libssh2_rsa_ctx **rsa, return -1; } - mbedtls_rsa_context *pk_rsa = mbedtls_pk_rsa(pkey); + pk_rsa = mbedtls_pk_rsa(pkey); mbedtls_rsa_copy(*rsa, pk_rsa); mbedtls_pk_free(&pkey); @@ -360,17 +413,33 @@ _libssh2_mbedtls_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa, { int ret; mbedtls_pk_context pkey; + mbedtls_rsa_context *pk_rsa; + void *filedata_nullterm; + size_t pwd_len; - *rsa = (libssh2_rsa_ctx *) mbedtls_calloc( 1, sizeof( libssh2_rsa_ctx ) ); - if (*rsa == NULL) + *rsa = (libssh2_rsa_ctx *) mbedtls_calloc(1, sizeof(libssh2_rsa_ctx)); + if(*rsa == NULL) return -1; + /* + mbedtls checks in "mbedtls/pkparse.c:1184" if "key[keylen - 1] != '\0'" + private-key from memory will fail if the last byte is not a null byte + */ + filedata_nullterm = mbedtls_calloc(filedata_len + 1, 1); + if(filedata_nullterm == NULL) { + return -1; + } + memcpy(filedata_nullterm, filedata, filedata_len); + mbedtls_pk_init(&pkey); - ret = mbedtls_pk_parse_key(&pkey, (unsigned char *)filedata, - filedata_len, NULL, 0); - if( ret != 0 || mbedtls_pk_get_type(&pkey) != MBEDTLS_PK_RSA) - { + pwd_len = passphrase != NULL ? strlen((const char *)passphrase) : 0; + ret = mbedtls_pk_parse_key(&pkey, (unsigned char *)filedata_nullterm, + filedata_len + 1, + passphrase, pwd_len); + _libssh2_mbedtls_safe_free(filedata_nullterm, filedata_len); + + if(ret != 0 || mbedtls_pk_get_type(&pkey) != MBEDTLS_PK_RSA) { mbedtls_pk_free(&pkey); mbedtls_rsa_free(*rsa); LIBSSH2_FREE(session, *rsa); @@ -378,7 +447,7 @@ _libssh2_mbedtls_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa, return -1; } - mbedtls_rsa_context *pk_rsa = mbedtls_pk_rsa(pkey); + pk_rsa = mbedtls_pk_rsa(pkey); mbedtls_rsa_copy(*rsa, pk_rsa); mbedtls_pk_free(&pkey); @@ -400,7 +469,8 @@ _libssh2_mbedtls_rsa_sha1_verify(libssh2_rsa_ctx *rsa, return -1; /* failure */ ret = mbedtls_rsa_pkcs1_verify(rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, - MBEDTLS_MD_SHA1, SHA_DIGEST_LENGTH, hash, sig); + MBEDTLS_MD_SHA1, SHA_DIGEST_LENGTH, + hash, sig); return (ret == 0) ? 0 : -1; } @@ -421,14 +491,14 @@ _libssh2_mbedtls_rsa_sha1_sign(LIBSSH2_SESSION *session, sig_len = rsa->len; sig = LIBSSH2_ALLOC(session, sig_len); - if (!sig) { + if(!sig) { return -1; } ret = mbedtls_rsa_pkcs1_sign(rsa, NULL, NULL, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA1, SHA_DIGEST_LENGTH, hash, sig); - if (ret) { + if(ret) { LIBSSH2_FREE(session, sig); return -1; } @@ -453,8 +523,8 @@ gen_publickey_from_rsa(LIBSSH2_SESSION *session, { int e_bytes, n_bytes; unsigned long len; - unsigned char* key; - unsigned char* p; + unsigned char *key; + unsigned char *p; e_bytes = mbedtls_mpi_size(&rsa->E); n_bytes = mbedtls_mpi_size(&rsa->N); @@ -463,7 +533,7 @@ gen_publickey_from_rsa(LIBSSH2_SESSION *session, len = 4 + 7 + 4 + e_bytes + 4 + n_bytes; key = LIBSSH2_ALLOC(session, len); - if (!key) { + if(!key) { return NULL; } @@ -498,36 +568,38 @@ _libssh2_mbedtls_pub_priv_key(LIBSSH2_SESSION *session, unsigned char *key = NULL, *mth = NULL; size_t keylen = 0, mthlen = 0; int ret; + mbedtls_rsa_context *rsa; - if( mbedtls_pk_get_type(pkey) != MBEDTLS_PK_RSA ) - { + if(mbedtls_pk_get_type(pkey) != MBEDTLS_PK_RSA) { mbedtls_pk_free(pkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Key type not supported"); } - // write method + /* write method */ mthlen = 7; mth = LIBSSH2_ALLOC(session, mthlen); - if (mth) { + if(mth) { memcpy(mth, "ssh-rsa", mthlen); - } else { + } + else { ret = -1; } - mbedtls_rsa_context *rsa = mbedtls_pk_rsa(*pkey); + rsa = mbedtls_pk_rsa(*pkey); key = gen_publickey_from_rsa(session, rsa, &keylen); - if (key == NULL) { + if(key == NULL) { ret = -1; } - // write output - if (ret) { - if (mth) + /* write output */ + if(ret) { + if(mth) LIBSSH2_FREE(session, mth); - if (key) + if(key) LIBSSH2_FREE(session, key); - } else { + } + else { *method = mth; *method_len = mthlen; *pubkeydata = key; @@ -552,8 +624,7 @@ _libssh2_mbedtls_pub_priv_keyfile(LIBSSH2_SESSION *session, mbedtls_pk_init(&pkey); ret = mbedtls_pk_parse_keyfile(&pkey, privatekey, passphrase); - if( ret != 0 ) - { + if(ret != 0) { mbedtls_strerror(ret, (char *)buf, sizeof(buf)); mbedtls_pk_free(&pkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, buf); @@ -580,12 +651,29 @@ _libssh2_mbedtls_pub_priv_keyfilememory(LIBSSH2_SESSION *session, mbedtls_pk_context pkey; char buf[1024]; int ret; + void *privatekeydata_nullterm; + size_t pwd_len; + + /* + mbedtls checks in "mbedtls/pkparse.c:1184" if "key[keylen - 1] != '\0'" + private-key from memory will fail if the last byte is not a null byte + */ + privatekeydata_nullterm = mbedtls_calloc(privatekeydata_len + 1, 1); + if(privatekeydata_nullterm == NULL) { + return -1; + } + memcpy(privatekeydata_nullterm, privatekeydata, privatekeydata_len); mbedtls_pk_init(&pkey); - ret = mbedtls_pk_parse_key(&pkey, (unsigned char *)privatekeydata, - privatekeydata_len, NULL, 0); - if( ret != 0 ) - { + + pwd_len = passphrase != NULL ? strlen((const char *)passphrase) : 0; + ret = mbedtls_pk_parse_key(&pkey, + (unsigned char *)privatekeydata_nullterm, + privatekeydata_len + 1, + (const unsigned char *)passphrase, pwd_len); + _libssh2_mbedtls_safe_free(privatekeydata_nullterm, privatekeydata_len); + + if(ret != 0) { mbedtls_strerror(ret, (char *)buf, sizeof(buf)); mbedtls_pk_free(&pkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, buf); @@ -603,4 +691,43 @@ void _libssh2_init_aes_ctr(void) { /* no implementation */ } + + +/*******************************************************************/ +/* + * mbedTLS backend: Diffie-Hellman functions + */ + +void +_libssh2_dh_init(_libssh2_dh_ctx *dhctx) +{ + *dhctx = _libssh2_mbedtls_bignum_init(); /* Random from client */ +} + +int +_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order) +{ + /* Generate x and e */ + _libssh2_mbedtls_bignum_random(*dhctx, group_order * 8 - 1, 0, -1); + mbedtls_mpi_exp_mod(public, g, *dhctx, p, NULL); + return 0; +} + +int +_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p) +{ + /* Compute the shared secret */ + mbedtls_mpi_exp_mod(secret, f, *dhctx, p, NULL); + return 0; +} + +void +_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) +{ + _libssh2_mbedtls_bignum_free(*dhctx); + *dhctx = NULL; +} + #endif /* LIBSSH2_MBEDTLS */ diff --git a/vendor/libssh2/src/mbedtls.h b/vendor/libssh2/src/mbedtls.h index 248583ed3..88b0e54d6 100644 --- a/vendor/libssh2/src/mbedtls.h +++ b/vendor/libssh2/src/mbedtls.h @@ -1,3 +1,40 @@ +/* Copyright (c) 2016, Art + * 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. + * + * Neither the name of the copyright holder nor the names + * of any other contributors may be used to endorse or + * promote products derived from this software without + * specific prior written permission. + * + * 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. + */ + #include #include @@ -27,19 +64,21 @@ #define LIBSSH2_RSA 1 #define LIBSSH2_DSA 0 +#define LIBSSH2_ECDSA 0 +#define LIBSSH2_ED25519 0 #define MD5_DIGEST_LENGTH 16 #define SHA_DIGEST_LENGTH 20 #define SHA256_DIGEST_LENGTH 32 +#define SHA384_DIGEST_LENGTH 48 #define SHA512_DIGEST_LENGTH 64 -/*******************************************************************/ -/* - * mbedTLS backend: Global context handles - */ +#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) -mbedtls_entropy_context _libssh2_mbedtls_entropy; -mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg; +#if LIBSSH2_ECDSA +#else +#define _libssh2_ec_key void +#endif /*******************************************************************/ /* @@ -80,6 +119,8 @@ mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg; _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_RIPEMD160, key, keylen) #define libssh2_hmac_sha256_init(pctx, key, keylen) \ _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA256, key, keylen) +#define libssh2_hmac_sha384_init(pctx, key, keylen) \ + _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA384, key, keylen) #define libssh2_hmac_sha512_init(pctx, key, keylen) \ _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA512, key, keylen) @@ -117,6 +158,23 @@ mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg; _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_SHA256, hash) +/*******************************************************************/ +/* + * mbedTLS backend: SHA384 functions + */ + +#define libssh2_sha384_ctx mbedtls_md_context_t + +#define libssh2_sha384_init(pctx) \ + _libssh2_mbedtls_hash_init(pctx, MBEDTLS_MD_SHA384, NULL, 0) +#define libssh2_sha384_update(ctx, data, datalen) \ + mbedtls_md_update(&ctx, (unsigned char *) data, datalen) +#define libssh2_sha384_final(ctx, hash) \ + _libssh2_mbedtls_hash_final(&ctx, hash) +#define libssh2_sha384(data, datalen, hash) \ + _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_SHA384, hash) + + /*******************************************************************/ /* * mbedTLS backend: SHA512 functions @@ -239,10 +297,6 @@ mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg; _libssh2_mbedtls_bignum_init() #define _libssh2_bn_init_from_bin() \ _libssh2_mbedtls_bignum_init() -#define _libssh2_bn_rand(bn, bits, top, bottom) \ - _libssh2_mbedtls_bignum_random(bn, bits, top, bottom) -#define _libssh2_bn_mod_exp(r, a, p, m, ctx) \ - mbedtls_mpi_exp_mod(r, a, p, m, NULL) #define _libssh2_bn_set_word(bn, word) \ mbedtls_mpi_lset(bn, word) #define _libssh2_bn_from_bin(bn, len, bin) \ @@ -254,7 +308,21 @@ mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg; #define _libssh2_bn_bits(bn) \ mbedtls_mpi_bitlen(bn) #define _libssh2_bn_free(bn) \ - mbedtls_mpi_free(bn) + _libssh2_mbedtls_bignum_free(bn) + + +/*******************************************************************/ +/* + * mbedTLS backend: Diffie-Hellman support. + */ + +#define _libssh2_dh_ctx mbedtls_mpi * +#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx) +#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \ + _libssh2_dh_key_pair(dhctx, public, g, p, group_order) +#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \ + _libssh2_dh_secret(dhctx, secret, f, p) +#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx) /*******************************************************************/ @@ -302,9 +370,6 @@ _libssh2_mbedtls_bignum_init(void); void _libssh2_mbedtls_bignum_free(_libssh2_bn *bn); -int -_libssh2_mbedtls_bignum_random(_libssh2_bn *bn, int bits, int top, int bottom); - int _libssh2_mbedtls_rsa_new(libssh2_rsa_ctx **rsa, const unsigned char *edata, @@ -369,3 +434,14 @@ _libssh2_mbedtls_pub_priv_keyfilememory(LIBSSH2_SESSION *session, const char *privatekeydata, size_t privatekeydata_len, const char *passphrase); + +extern void +_libssh2_dh_init(_libssh2_dh_ctx *dhctx); +extern int +_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order); +extern int +_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p); +extern void +_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); diff --git a/vendor/libssh2/src/misc.c b/vendor/libssh2/src/misc.c index f7faae7b6..bd084c854 100644 --- a/vendor/libssh2/src/misc.c +++ b/vendor/libssh2/src/misc.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2007 Sara Golemon - * Copyright (c) 2009-2014 by Daniel Stenberg + * Copyright (c) 2009-2019 by Daniel Stenberg * Copyright (c) 2010 Simon Josefsson * All rights reserved. * @@ -39,6 +39,11 @@ #include "libssh2_priv.h" #include "misc.h" +#include "blf.h" + +#ifdef HAVE_STDLIB_H +#include +#endif #ifdef HAVE_UNISTD_H #include @@ -48,21 +53,28 @@ #include #endif +#if defined(HAVE_DECL_SECUREZEROMEMORY) && HAVE_DECL_SECUREZEROMEMORY +#ifdef HAVE_WINDOWS_H +#include +#endif +#endif + #include #include -int _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode, const char* errmsg, int errflags) +int _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode, + const char *errmsg, int errflags) { - if (session->err_flags & LIBSSH2_ERR_FLAG_DUP) + if(session->err_flags & LIBSSH2_ERR_FLAG_DUP) LIBSSH2_FREE(session, (char *)session->err_msg); session->err_code = errcode; session->err_flags = 0; - if ((errmsg != NULL) && ((errflags & LIBSSH2_ERR_FLAG_DUP) != 0)) { + if((errmsg != NULL) && ((errflags & LIBSSH2_ERR_FLAG_DUP) != 0)) { size_t len = strlen(errmsg); char *copy = LIBSSH2_ALLOC(session, len + 1); - if (copy) { + if(copy) { memcpy(copy, errmsg, len + 1); session->err_flags = LIBSSH2_ERR_FLAG_DUP; session->err_msg = copy; @@ -86,7 +98,7 @@ int _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode, const char* errm return errcode; } -int _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char* errmsg) +int _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char *errmsg) { return _libssh2_error_flags(session, errcode, errmsg, 0); } @@ -94,7 +106,7 @@ int _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char* errmsg) #ifdef WIN32 static int wsa2errno(void) { - switch (WSAGetLastError()) { + switch(WSAGetLastError()) { case WSAEWOULDBLOCK: return EAGAIN; @@ -127,20 +139,20 @@ _libssh2_recv(libssh2_socket_t sock, void *buffer, size_t length, rc = recv(sock, buffer, length, flags); #ifdef WIN32 - if (rc < 0 ) + if(rc < 0) return -wsa2errno(); #elif defined(__VMS) - if (rc < 0 ){ - if ( errno == EWOULDBLOCK ) + if(rc < 0) { + if(errno == EWOULDBLOCK) return -EAGAIN; else return -errno; } #else - if (rc < 0 ){ + if(rc < 0) { /* Sometimes the first recv() function call sets errno to ENOENT on Solaris and HP-UX */ - if ( errno == ENOENT ) + if(errno == ENOENT) return -EAGAIN; else return -errno; @@ -163,17 +175,17 @@ _libssh2_send(libssh2_socket_t sock, const void *buffer, size_t length, rc = send(sock, buffer, length, flags); #ifdef WIN32 - if (rc < 0 ) + if(rc < 0) return -wsa2errno(); #elif defined(__VMS) - if (rc < 0 ) { - if ( errno == EWOULDBLOCK ) + if(rc < 0) { + if(errno == EWOULDBLOCK) return -EAGAIN; else return -errno; } #else - if (rc < 0 ) + if(rc < 0) return -errno; #endif return rc; @@ -269,15 +281,16 @@ libssh2_base64_decode(LIBSSH2_SESSION *session, char **data, *data = LIBSSH2_ALLOC(session, (3 * src_len / 4) + 1); d = (unsigned char *) *data; - if (!d) { + if(!d) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for base64 decoding"); } for(s = (unsigned char *) src; ((char *) s) < (src + src_len); s++) { - if ((v = base64_reverse_table[*s]) < 0) + v = base64_reverse_table[*s]; + if(v < 0) continue; - switch (i % 4) { + switch(i % 4) { case 0: d[len] = (unsigned char)(v << 2); break; @@ -295,10 +308,11 @@ libssh2_base64_decode(LIBSSH2_SESSION *session, char **data, } i++; } - if ((i % 4) == 1) { + if((i % 4) == 1) { /* Invalid -- We have a byte which belongs exclusively to a partial octet */ LIBSSH2_FREE(session, *data); + *data = NULL; return _libssh2_error(session, LIBSSH2_ERROR_INVAL, "Invalid base64"); } @@ -321,68 +335,69 @@ static const char table64[]= size_t _libssh2_base64_encode(LIBSSH2_SESSION *session, const char *inp, size_t insize, char **outptr) { - unsigned char ibuf[3]; - unsigned char obuf[4]; - int i; - int inputparts; - char *output; - char *base64data; - const char *indata = inp; - - *outptr = NULL; /* set to NULL in case of failure before we reach the end */ - - if(0 == insize) - insize = strlen(indata); - - base64data = output = LIBSSH2_ALLOC(session, insize*4/3+4); - if(NULL == output) - return 0; - - while(insize > 0) { - for (i = inputparts = 0; i < 3; i++) { - if(insize > 0) { - inputparts++; - ibuf[i] = *indata; - indata++; - insize--; - } - else - ibuf[i] = 0; - } + unsigned char ibuf[3]; + unsigned char obuf[4]; + int i; + int inputparts; + char *output; + char *base64data; + const char *indata = inp; + + *outptr = NULL; /* set to NULL in case of failure before we reach the + end */ + + if(0 == insize) + insize = strlen(indata); + + base64data = output = LIBSSH2_ALLOC(session, insize * 4 / 3 + 4); + if(NULL == output) + return 0; + + while(insize > 0) { + for(i = inputparts = 0; i < 3; i++) { + if(insize > 0) { + inputparts++; + ibuf[i] = *indata; + indata++; + insize--; + } + else + ibuf[i] = 0; + } - obuf[0] = (unsigned char) ((ibuf[0] & 0xFC) >> 2); - obuf[1] = (unsigned char) (((ibuf[0] & 0x03) << 4) | \ - ((ibuf[1] & 0xF0) >> 4)); - obuf[2] = (unsigned char) (((ibuf[1] & 0x0F) << 2) | \ - ((ibuf[2] & 0xC0) >> 6)); - obuf[3] = (unsigned char) (ibuf[2] & 0x3F); - - switch(inputparts) { - case 1: /* only one byte read */ - snprintf(output, 5, "%c%c==", - table64[obuf[0]], - table64[obuf[1]]); - break; - case 2: /* two bytes read */ - snprintf(output, 5, "%c%c%c=", - table64[obuf[0]], - table64[obuf[1]], - table64[obuf[2]]); - break; - default: - snprintf(output, 5, "%c%c%c%c", - table64[obuf[0]], - table64[obuf[1]], - table64[obuf[2]], - table64[obuf[3]] ); - break; + obuf[0] = (unsigned char) ((ibuf[0] & 0xFC) >> 2); + obuf[1] = (unsigned char) (((ibuf[0] & 0x03) << 4) | \ + ((ibuf[1] & 0xF0) >> 4)); + obuf[2] = (unsigned char) (((ibuf[1] & 0x0F) << 2) | \ + ((ibuf[2] & 0xC0) >> 6)); + obuf[3] = (unsigned char) (ibuf[2] & 0x3F); + + switch(inputparts) { + case 1: /* only one byte read */ + snprintf(output, 5, "%c%c==", + table64[obuf[0]], + table64[obuf[1]]); + break; + case 2: /* two bytes read */ + snprintf(output, 5, "%c%c%c=", + table64[obuf[0]], + table64[obuf[1]], + table64[obuf[2]]); + break; + default: + snprintf(output, 5, "%c%c%c%c", + table64[obuf[0]], + table64[obuf[1]], + table64[obuf[2]], + table64[obuf[3]]); + break; + } + output += 4; } - output += 4; - } - *output=0; - *outptr = base64data; /* make it return the actual data memory */ + *output = 0; + *outptr = base64data; /* make it return the actual data memory */ - return strlen(base64data); /* return the length of the new data */ + return strlen(base64data); /* return the length of the new data */ } /* ---- End of Base64 Encoding ---- */ @@ -403,7 +418,7 @@ libssh2_trace(LIBSSH2_SESSION * session, int bitmask) } LIBSSH2_API int -libssh2_trace_sethandler(LIBSSH2_SESSION *session, void* handler_context, +libssh2_trace_sethandler(LIBSSH2_SESSION *session, void *handler_context, libssh2_trace_handler_func callback) { session->tracehandler = callback; @@ -431,18 +446,18 @@ _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...) "Publickey", "Socket", }; - const char* contexttext = contexts[0]; + const char *contexttext = contexts[0]; unsigned int contextindex; - if (!(session->showmask & context)) { + if(!(session->showmask & context)) { /* no such output asked for */ return; } /* Find the first matching context string for this message */ - for (contextindex = 0; contextindex < ARRAY_SIZE(contexts); + for(contextindex = 0; contextindex < ARRAY_SIZE(contexts); contextindex++) { - if ((context & (1 << contextindex)) != 0) { + if((context & (1 << contextindex)) != 0) { contexttext = contexts[contextindex]; break; } @@ -457,7 +472,7 @@ _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...) len = snprintf(buffer, buflen, "[libssh2] %d.%06d %s: ", (int)now.tv_sec, (int)now.tv_usec, contexttext); - if (len >= buflen) + if(len >= buflen) msglen = buflen - 1; else { buflen -= len; @@ -468,7 +483,7 @@ _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...) msglen += len < buflen ? len : buflen - 1; } - if (session->tracehandler) + if(session->tracehandler) (session->tracehandler)(session, session->tracehandler_context, buffer, msglen); else @@ -485,7 +500,7 @@ libssh2_trace(LIBSSH2_SESSION * session, int bitmask) } LIBSSH2_API int -libssh2_trace_sethandler(LIBSSH2_SESSION *session, void* handler_context, +libssh2_trace_sethandler(LIBSSH2_SESSION *session, void *handler_context, libssh2_trace_handler_func callback) { (void) session; @@ -615,21 +630,20 @@ void _libssh2_list_insert(struct list_node *after, /* insert before this */ #define _W32_FT_OFFSET (116444736000000000) int __cdecl _libssh2_gettimeofday(struct timeval *tp, void *tzp) - { - union { - unsigned __int64 ns100; /*time since 1 Jan 1601 in 100ns units */ - FILETIME ft; - } _now; - (void)tzp; - if(tp) - { - GetSystemTimeAsFileTime (&_now.ft); - tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 ); - tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000); +{ + union { + unsigned __int64 ns100; /*time since 1 Jan 1601 in 100ns units */ + FILETIME ft; + } _now; + (void)tzp; + if(tp) { + GetSystemTimeAsFileTime(&_now.ft); + tp->tv_usec = (long)((_now.ns100 / 10) % 1000000); + tp->tv_sec = (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000); } - /* Always return 0 as per Open Group Base Specifications Issue 6. - Do not set errno on error. */ - return 0; + /* Always return 0 as per Open Group Base Specifications Issue 6. + Do not set errno on error. */ + return 0; } @@ -643,3 +657,218 @@ void *_libssh2_calloc(LIBSSH2_SESSION* session, size_t size) } return p; } + +/* XOR operation on buffers input1 and input2, result in output. + It is safe to use an input buffer as the output buffer. */ +void _libssh2_xor_data(unsigned char *output, + const unsigned char *input1, + const unsigned char *input2, + size_t length) +{ + size_t i; + + for(i = 0; i < length; i++) + *output++ = *input1++ ^ *input2++; +} + +/* Increments an AES CTR buffer to prepare it for use with the + next AES block. */ +void _libssh2_aes_ctr_increment(unsigned char *ctr, + size_t length) +{ + unsigned char *pc; + unsigned int val, carry; + + pc = ctr + length - 1; + carry = 1; + + while(pc >= ctr) { + val = (unsigned int)*pc + carry; + *pc-- = val & 0xFF; + carry = val >> 8; + } +} + +#ifdef WIN32 +static void * (__cdecl * const volatile memset_libssh)(void *, int, size_t) = + memset; +#else +static void * (* const volatile memset_libssh)(void *, int, size_t) = memset; +#endif + +void _libssh2_explicit_zero(void *buf, size_t size) +{ +#if defined(HAVE_DECL_SECUREZEROMEMORY) && HAVE_DECL_SECUREZEROMEMORY + SecureZeroMemory(buf, size); + (void)memset_libssh; /* Silence unused variable warning */ +#elif defined(HAVE_MEMSET_S) + (void)memset_s(buf, size, 0, size); + (void)memset_libssh; /* Silence unused variable warning */ +#else + memset_libssh(buf, 0, size); +#endif +} + +/* String buffer */ + +struct string_buf* _libssh2_string_buf_new(LIBSSH2_SESSION *session) +{ + struct string_buf *ret; + + ret = _libssh2_calloc(session, sizeof(*ret)); + if(ret == NULL) + return NULL; + + return ret; +} + +void _libssh2_string_buf_free(LIBSSH2_SESSION *session, struct string_buf *buf) +{ + if(buf == NULL) + return; + + if(buf->data != NULL) + LIBSSH2_FREE(session, buf->data); + + LIBSSH2_FREE(session, buf); + buf = NULL; +} + +int _libssh2_get_u32(struct string_buf *buf, uint32_t *out) +{ + if(!_libssh2_check_length(buf, 4)) { + return -1; + } + + *out = _libssh2_ntohu32(buf->dataptr); + buf->dataptr += 4; + return 0; +} + +int _libssh2_get_u64(struct string_buf *buf, libssh2_uint64_t *out) +{ + if(!_libssh2_check_length(buf, 8)) { + return -1; + } + + *out = _libssh2_ntohu64(buf->dataptr); + buf->dataptr += 8; + return 0; +} + +int _libssh2_match_string(struct string_buf *buf, const char *match) +{ + unsigned char *out; + size_t len = 0; + if(_libssh2_get_string(buf, &out, &len) || len != strlen(match) || + strncmp((char *)out, match, strlen(match)) != 0) { + return -1; + } + return 0; +} + +int _libssh2_get_string(struct string_buf *buf, unsigned char **outbuf, + size_t *outlen) +{ + uint32_t data_len; + if(_libssh2_get_u32(buf, &data_len) != 0) { + return -1; + } + if(!_libssh2_check_length(buf, data_len)) { + return -1; + } + *outbuf = buf->dataptr; + buf->dataptr += data_len; + + if(outlen) + *outlen = (size_t)data_len; + + return 0; +} + +int _libssh2_copy_string(LIBSSH2_SESSION *session, struct string_buf *buf, + unsigned char **outbuf, size_t *outlen) +{ + size_t str_len; + unsigned char *str; + + if(_libssh2_get_string(buf, &str, &str_len)) { + return -1; + } + + *outbuf = LIBSSH2_ALLOC(session, str_len); + if(*outbuf) { + memcpy(*outbuf, str, str_len); + } + else { + return -1; + } + + if(outlen) + *outlen = str_len; + + return 0; +} + +int _libssh2_get_bignum_bytes(struct string_buf *buf, unsigned char **outbuf, + size_t *outlen) +{ + uint32_t data_len; + uint32_t bn_len; + unsigned char *bnptr; + + if(_libssh2_get_u32(buf, &data_len)) { + return -1; + } + if(!_libssh2_check_length(buf, data_len)) { + return -1; + } + + bn_len = data_len; + bnptr = buf->dataptr; + + /* trim leading zeros */ + while(bn_len > 0 && *bnptr == 0x00) { + bn_len--; + bnptr++; + } + + *outbuf = bnptr; + buf->dataptr += data_len; + + if(outlen) + *outlen = (size_t)bn_len; + + return 0; +} + +/* Given the current location in buf, _libssh2_check_length ensures + callers can read the next len number of bytes out of the buffer + before reading the buffer content */ + +int _libssh2_check_length(struct string_buf *buf, size_t len) +{ + unsigned char *endp = &buf->data[buf->len]; + size_t left = endp - buf->dataptr; + return ((len <= left) && (left <= buf->len)); +} + +/* Wrappers */ + +int _libssh2_bcrypt_pbkdf(const char *pass, + size_t passlen, + const uint8_t *salt, + size_t saltlen, + uint8_t *key, + size_t keylen, + unsigned int rounds) +{ + /* defined in bcrypt_pbkdf.c */ + return bcrypt_pbkdf(pass, + passlen, + salt, + saltlen, + key, + keylen, + rounds); +} diff --git a/vendor/libssh2/src/misc.h b/vendor/libssh2/src/misc.h index 54ae5461d..5481e666c 100644 --- a/vendor/libssh2/src/misc.h +++ b/vendor/libssh2/src/misc.h @@ -1,6 +1,6 @@ #ifndef __LIBSSH2_MISC_H #define __LIBSSH2_MISC_H -/* Copyright (c) 2009-2014 by Daniel Stenberg +/* Copyright (c) 2009-2019 by Daniel Stenberg * * All rights reserved. * @@ -49,8 +49,15 @@ struct list_node { struct list_head *head; }; -int _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode, const char* errmsg, int errflags); -int _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char* errmsg); +struct string_buf { + unsigned char *data; + unsigned char *dataptr; + size_t len; +}; + +int _libssh2_error_flags(LIBSSH2_SESSION* session, int errcode, + const char *errmsg, int errflags); +int _libssh2_error(LIBSSH2_SESSION* session, int errcode, const char *errmsg); void _libssh2_list_init(struct list_head *head); @@ -70,7 +77,7 @@ void *_libssh2_list_prev(struct list_node *node); /* remove this node from the list */ void _libssh2_list_remove(struct list_node *entry); -size_t _libssh2_base64_encode(struct _LIBSSH2_SESSION *session, +size_t _libssh2_base64_encode(LIBSSH2_SESSION *session, const char *inp, size_t insize, char **outptr); unsigned int _libssh2_ntohu32(const unsigned char *buf); @@ -78,7 +85,22 @@ libssh2_uint64_t _libssh2_ntohu64(const unsigned char *buf); void _libssh2_htonu32(unsigned char *buf, uint32_t val); void _libssh2_store_u32(unsigned char **buf, uint32_t value); void _libssh2_store_str(unsigned char **buf, const char *str, size_t len); -void *_libssh2_calloc(LIBSSH2_SESSION* session, size_t size); +void *_libssh2_calloc(LIBSSH2_SESSION *session, size_t size); +void _libssh2_explicit_zero(void *buf, size_t size); + +struct string_buf* _libssh2_string_buf_new(LIBSSH2_SESSION *session); +void _libssh2_string_buf_free(LIBSSH2_SESSION *session, + struct string_buf *buf); +int _libssh2_get_u32(struct string_buf *buf, uint32_t *out); +int _libssh2_get_u64(struct string_buf *buf, libssh2_uint64_t *out); +int _libssh2_match_string(struct string_buf *buf, const char *match); +int _libssh2_get_string(struct string_buf *buf, unsigned char **outbuf, + size_t *outlen); +int _libssh2_copy_string(LIBSSH2_SESSION* session, struct string_buf *buf, + unsigned char **outbuf, size_t *outlen); +int _libssh2_get_bignum_bytes(struct string_buf *buf, unsigned char **outbuf, + size_t *outlen); +int _libssh2_check_length(struct string_buf *buf, size_t requested_len); #if defined(LIBSSH2_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) /* provide a private one */ @@ -93,4 +115,11 @@ int __cdecl _libssh2_gettimeofday(struct timeval *tp, void *tzp); #endif #endif +void _libssh2_xor_data(unsigned char *output, + const unsigned char *input1, + const unsigned char *input2, + size_t length); + +void _libssh2_aes_ctr_increment(unsigned char *ctr, size_t length); + #endif /* _LIBSSH2_MISC_H */ diff --git a/vendor/libssh2/src/openssl.c b/vendor/libssh2/src/openssl.c index 4f63ef92b..04d5ec2ff 100644 --- a/vendor/libssh2/src/openssl.c +++ b/vendor/libssh2/src/openssl.c @@ -43,11 +43,37 @@ #ifdef LIBSSH2_OPENSSL /* compile only if we build with openssl */ #include +#include "misc.h" #ifndef EVP_MAX_BLOCK_LENGTH #define EVP_MAX_BLOCK_LENGTH 32 #endif +int +read_openssh_private_key_from_memory(void **key_ctx, LIBSSH2_SESSION *session, + const char *key_type, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase); + +static unsigned char * +write_bn(unsigned char *buf, const BIGNUM *bn, int bn_bytes) +{ + unsigned char *p = buf; + + /* Left space for bn size which will be written below. */ + p += 4; + + *p = 0; + BN_bn2bin(bn, p + 1); + if(!(*(p + 1) & 0x80)) { + memmove(p, p + 1, --bn_bytes); + } + _libssh2_htonu32(p - 4, bn_bytes); /* Post write bn size. */ + + return p + bn_bytes; +} + int _libssh2_rsa_new(libssh2_rsa_ctx ** rsa, const unsigned char *edata, @@ -81,7 +107,7 @@ _libssh2_rsa_new(libssh2_rsa_ctx ** rsa, n = BN_new(); BN_bin2bn(ndata, nlen, n); - if (ddata) { + if(ddata) { d = BN_new(); BN_bin2bn(ddata, dlen, d); @@ -107,6 +133,7 @@ _libssh2_rsa_new(libssh2_rsa_ctx ** rsa, #else (*rsa)->e = e; (*rsa)->n = n; + (*rsa)->d = d; #endif #ifdef HAVE_OPAQUE_STRUCTS @@ -135,7 +162,7 @@ _libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsactx, unsigned char hash[SHA_DIGEST_LENGTH]; int ret; - if (_libssh2_sha1(m, m_len, hash)) + if(_libssh2_sha1(m, m_len, hash)) return -1; /* failure */ ret = RSA_verify(NID_sha1, hash, SHA_DIGEST_LENGTH, (unsigned char *) sig, sig_len, rsactx); @@ -173,7 +200,7 @@ _libssh2_dsa_new(libssh2_dsa_ctx ** dsactx, pub_key = BN_new(); BN_bin2bn(y, y_len, pub_key); - if (x_len) { + if(x_len) { priv_key = BN_new(); BN_bin2bn(x, x_len, priv_key); } @@ -220,7 +247,7 @@ _libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx, dsasig->r = r; dsasig->s = s; #endif - if (!_libssh2_sha1(m, m_len, hash)) + if(!_libssh2_sha1(m, m_len, hash)) /* _libssh2_sha1() succeeded */ ret = DSA_do_verify(hash, SHA_DIGEST_LENGTH, dsasig, dsactx); @@ -230,6 +257,147 @@ _libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx, } #endif /* LIBSSH_DSA */ +#if LIBSSH2_ECDSA + +/* _libssh2_ecdsa_key_get_curve_type + * + * returns key curve type that maps to libssh2_curve_type + * + */ + +libssh2_curve_type +_libssh2_ecdsa_key_get_curve_type(_libssh2_ec_key *key) +{ + const EC_GROUP *group = EC_KEY_get0_group(key); + return EC_GROUP_get_curve_name(group); +} + +/* _libssh2_ecdsa_curve_type_from_name + * + * returns 0 for success, key curve type that maps to libssh2_curve_type + * + */ + +int +_libssh2_ecdsa_curve_type_from_name(const char *name, + libssh2_curve_type *out_type) +{ + int ret = 0; + libssh2_curve_type type; + + if(name == NULL || strlen(name) != 19) + return -1; + + if(strcmp(name, "ecdsa-sha2-nistp256") == 0) + type = LIBSSH2_EC_CURVE_NISTP256; + else if(strcmp(name, "ecdsa-sha2-nistp384") == 0) + type = LIBSSH2_EC_CURVE_NISTP384; + else if(strcmp(name, "ecdsa-sha2-nistp521") == 0) + type = LIBSSH2_EC_CURVE_NISTP521; + else { + ret = -1; + } + + if(ret == 0 && out_type) { + *out_type = type; + } + + return ret; +} + +/* _libssh2_ecdsa_curve_name_with_octal_new + * + * Creates a new public key given an octal string, length and type + * + */ + +int +_libssh2_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx ** ec_ctx, + const unsigned char *k, + size_t k_len, libssh2_curve_type curve) +{ + + int ret = 0; + const EC_GROUP *ec_group = NULL; + EC_KEY *ec_key = EC_KEY_new_by_curve_name(curve); + EC_POINT *point = NULL; + + if(ec_key) { + ec_group = EC_KEY_get0_group(ec_key); + point = EC_POINT_new(ec_group); + ret = EC_POINT_oct2point(ec_group, point, k, k_len, NULL); + ret = EC_KEY_set_public_key(ec_key, point); + + if(point != NULL) + EC_POINT_free(point); + + if(ec_ctx != NULL) + *ec_ctx = ec_key; + } + + return (ret == 1) ? 0 : -1; +} + +#define LIBSSH2_ECDSA_VERIFY(digest_type) \ +{ \ + unsigned char hash[SHA##digest_type##_DIGEST_LENGTH]; \ + libssh2_sha##digest_type(m, m_len, hash); \ + ret = ECDSA_do_verify(hash, SHA##digest_type##_DIGEST_LENGTH, \ + ecdsa_sig, ec_key); \ + \ +} + +int +_libssh2_ecdsa_verify(libssh2_ecdsa_ctx * ctx, + const unsigned char *r, size_t r_len, + const unsigned char *s, size_t s_len, + const unsigned char *m, size_t m_len) +{ + int ret = 0; + EC_KEY *ec_key = (EC_KEY*)ctx; + libssh2_curve_type type = _libssh2_ecdsa_key_get_curve_type(ec_key); + +#ifdef HAVE_OPAQUE_STRUCTS + ECDSA_SIG *ecdsa_sig = ECDSA_SIG_new(); + BIGNUM *pr = BN_new(); + BIGNUM *ps = BN_new(); + + BN_bin2bn(r, r_len, pr); + BN_bin2bn(s, s_len, ps); + ECDSA_SIG_set0(ecdsa_sig, pr, ps); + +#else + ECDSA_SIG ecdsa_sig_; + ECDSA_SIG *ecdsa_sig = &ecdsa_sig_; + ecdsa_sig_.r = BN_new(); + BN_bin2bn(r, r_len, ecdsa_sig_.r); + ecdsa_sig_.s = BN_new(); + BN_bin2bn(s, s_len, ecdsa_sig_.s); +#endif + + if(type == LIBSSH2_EC_CURVE_NISTP256) { + LIBSSH2_ECDSA_VERIFY(256); + } + else if(type == LIBSSH2_EC_CURVE_NISTP384) { + LIBSSH2_ECDSA_VERIFY(384); + } + else if(type == LIBSSH2_EC_CURVE_NISTP521) { + LIBSSH2_ECDSA_VERIFY(512); + } + +#ifdef HAVE_OPAQUE_STRUCTS + if(ecdsa_sig) + ECDSA_SIG_free(ecdsa_sig); +#else + BN_clear_free(ecdsa_sig_.s); + BN_clear_free(ecdsa_sig_.r); +#endif + + return (ret == 1) ? 0 : -1; +} + +#endif /* LIBSSH2_ECDSA */ + int _libssh2_cipher_init(_libssh2_cipher_ctx * h, _libssh2_cipher_type(algo), @@ -259,7 +427,7 @@ _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx, #else ret = EVP_Cipher(ctx, buf, block, blocksize); #endif - if (ret == 1) { + if(ret == 1) { memcpy(block, buf, blocksize); } return ret == 1 ? 0 : 1; @@ -289,7 +457,7 @@ aes_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, const EVP_CIPHER *aes_cipher; (void) enc; - switch (EVP_CIPHER_CTX_key_length(ctx)) { + switch(EVP_CIPHER_CTX_key_length(ctx)) { case 16: aes_cipher = EVP_aes_128_ecb(); break; @@ -304,7 +472,7 @@ aes_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, } c = malloc(sizeof(*c)); - if (c == NULL) + if(c == NULL) return 0; #ifdef HAVE_OPAQUE_STRUCTS @@ -312,12 +480,12 @@ aes_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, #else c->aes_ctx = malloc(sizeof(EVP_CIPHER_CTX)); #endif - if (c->aes_ctx == NULL) { + if(c->aes_ctx == NULL) { free(c); return 0; } - if (EVP_EncryptInit(c->aes_ctx, aes_cipher, key, NULL) != 1) { + if(EVP_EncryptInit(c->aes_ctx, aes_cipher, key, NULL) != 1) { #ifdef HAVE_OPAQUE_STRUCTS EVP_CIPHER_CTX_free(c->aes_ctx); #else @@ -343,13 +511,12 @@ aes_ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, { aes_ctr_ctx *c = EVP_CIPHER_CTX_get_app_data(ctx); unsigned char b1[AES_BLOCK_SIZE]; - size_t i = 0; int outlen = 0; - if (inl != 16) /* libssh2 only ever encrypt one block */ + if(inl != 16) /* libssh2 only ever encrypt one block */ return 0; - if (c == NULL) { + if(c == NULL) { return 0; } @@ -360,19 +527,13 @@ aes_ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, the ciphertext block C1. The counter X is then incremented */ - if (EVP_EncryptUpdate(c->aes_ctx, b1, &outlen, c->ctr, AES_BLOCK_SIZE) != 1) { + if(EVP_EncryptUpdate(c->aes_ctx, b1, &outlen, + c->ctr, AES_BLOCK_SIZE) != 1) { return 0; } - for (i = 0; i < 16; i++) - *out++ = *in++ ^ b1[i]; - - i = 15; - while (c->ctr[i]++ == 0xFF) { - if (i == 0) - break; - i--; - } + _libssh2_xor_data(out, in, b1, AES_BLOCK_SIZE); + _libssh2_aes_ctr_increment(c->ctr, AES_BLOCK_SIZE); return 1; } @@ -382,11 +543,11 @@ aes_ctr_cleanup(EVP_CIPHER_CTX *ctx) /* cleanup ctx */ { aes_ctr_ctx *c = EVP_CIPHER_CTX_get_app_data(ctx); - if (c == NULL) { + if(c == NULL) { return 1; } - if (c->aes_ctx != NULL) { + if(c->aes_ctx != NULL) { #ifdef HAVE_OPAQUE_STRUCTS EVP_CIPHER_CTX_free(c->aes_ctx); #else @@ -401,27 +562,27 @@ aes_ctr_cleanup(EVP_CIPHER_CTX *ctx) /* cleanup ctx */ } static const EVP_CIPHER * -make_ctr_evp (size_t keylen, EVP_CIPHER *aes_ctr_cipher, int type) +make_ctr_evp (size_t keylen, EVP_CIPHER **aes_ctr_cipher, int type) { #ifdef HAVE_OPAQUE_STRUCTS - aes_ctr_cipher = EVP_CIPHER_meth_new(type, 16, keylen); - if (aes_ctr_cipher) { - EVP_CIPHER_meth_set_iv_length(aes_ctr_cipher, 16); - EVP_CIPHER_meth_set_init(aes_ctr_cipher, aes_ctr_init); - EVP_CIPHER_meth_set_do_cipher(aes_ctr_cipher, aes_ctr_do_cipher); - EVP_CIPHER_meth_set_cleanup(aes_ctr_cipher, aes_ctr_cleanup); + *aes_ctr_cipher = EVP_CIPHER_meth_new(type, 16, keylen); + if(*aes_ctr_cipher) { + EVP_CIPHER_meth_set_iv_length(*aes_ctr_cipher, 16); + EVP_CIPHER_meth_set_init(*aes_ctr_cipher, aes_ctr_init); + EVP_CIPHER_meth_set_do_cipher(*aes_ctr_cipher, aes_ctr_do_cipher); + EVP_CIPHER_meth_set_cleanup(*aes_ctr_cipher, aes_ctr_cleanup); } #else - aes_ctr_cipher->nid = type; - aes_ctr_cipher->block_size = 16; - aes_ctr_cipher->key_len = keylen; - aes_ctr_cipher->iv_len = 16; - aes_ctr_cipher->init = aes_ctr_init; - aes_ctr_cipher->do_cipher = aes_ctr_do_cipher; - aes_ctr_cipher->cleanup = aes_ctr_cleanup; + (*aes_ctr_cipher)->nid = type; + (*aes_ctr_cipher)->block_size = 16; + (*aes_ctr_cipher)->key_len = keylen; + (*aes_ctr_cipher)->iv_len = 16; + (*aes_ctr_cipher)->init = aes_ctr_init; + (*aes_ctr_cipher)->do_cipher = aes_ctr_do_cipher; + (*aes_ctr_cipher)->cleanup = aes_ctr_cleanup; #endif - return aes_ctr_cipher; + return *aes_ctr_cipher; } const EVP_CIPHER * @@ -429,12 +590,13 @@ _libssh2_EVP_aes_128_ctr(void) { #ifdef HAVE_OPAQUE_STRUCTS static EVP_CIPHER * aes_ctr_cipher; - return !aes_ctr_cipher? - make_ctr_evp (16, aes_ctr_cipher, NID_aes_128_ctr) : aes_ctr_cipher; + return !aes_ctr_cipher ? + make_ctr_evp(16, &aes_ctr_cipher, NID_aes_128_ctr) : aes_ctr_cipher; #else static EVP_CIPHER aes_ctr_cipher; - return !aes_ctr_cipher.key_len? - make_ctr_evp (16, &aes_ctr_cipher, 0) : &aes_ctr_cipher; + static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher; + return !aes_ctr_cipher.key_len ? + make_ctr_evp(16, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher; #endif } @@ -443,12 +605,13 @@ _libssh2_EVP_aes_192_ctr(void) { #ifdef HAVE_OPAQUE_STRUCTS static EVP_CIPHER * aes_ctr_cipher; - return !aes_ctr_cipher? - make_ctr_evp (24, aes_ctr_cipher, NID_aes_192_ctr) : aes_ctr_cipher; + return !aes_ctr_cipher ? + make_ctr_evp(24, &aes_ctr_cipher, NID_aes_192_ctr) : aes_ctr_cipher; #else static EVP_CIPHER aes_ctr_cipher; - return !aes_ctr_cipher.key_len? - make_ctr_evp (24, &aes_ctr_cipher, 0) : &aes_ctr_cipher; + static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher; + return !aes_ctr_cipher.key_len ? + make_ctr_evp(24, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher; #endif } @@ -457,25 +620,70 @@ _libssh2_EVP_aes_256_ctr(void) { #ifdef HAVE_OPAQUE_STRUCTS static EVP_CIPHER * aes_ctr_cipher; - return !aes_ctr_cipher? - make_ctr_evp (32, aes_ctr_cipher, NID_aes_256_ctr) : aes_ctr_cipher; + return !aes_ctr_cipher ? + make_ctr_evp(32, &aes_ctr_cipher, NID_aes_256_ctr) : aes_ctr_cipher; #else static EVP_CIPHER aes_ctr_cipher; - return !aes_ctr_cipher.key_len? - make_ctr_evp (32, &aes_ctr_cipher, 0) : &aes_ctr_cipher; + static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher; + return !aes_ctr_cipher.key_len ? + make_ctr_evp(32, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher; #endif } -void _libssh2_init_aes_ctr(void) +#endif /* LIBSSH2_AES_CTR */ + +#ifndef HAVE_EVP_AES_128_CTR +static EVP_CIPHER * aes_128_ctr_cipher = NULL; +static EVP_CIPHER * aes_192_ctr_cipher = NULL; +static EVP_CIPHER * aes_256_ctr_cipher = NULL; +#endif + +void _libssh2_openssl_crypto_init(void) { - _libssh2_EVP_aes_128_ctr(); - _libssh2_EVP_aes_192_ctr(); - _libssh2_EVP_aes_256_ctr(); +#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \ + !defined(LIBRESSL_VERSION_NUMBER) +#ifndef OPENSSL_NO_ENGINE + ENGINE_load_builtin_engines(); + ENGINE_register_all_complete(); +#endif +#else + OpenSSL_add_all_algorithms(); + OpenSSL_add_all_ciphers(); + OpenSSL_add_all_digests(); +#ifndef OPENSSL_NO_ENGINE + ENGINE_load_builtin_engines(); + ENGINE_register_all_complete(); +#endif +#endif +#ifndef HAVE_EVP_AES_128_CTR + aes_128_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_128_ctr(); + aes_192_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_192_ctr(); + aes_256_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_256_ctr(); +#endif } -#else -void _libssh2_init_aes_ctr(void) {} -#endif /* LIBSSH2_AES_CTR */ +void _libssh2_openssl_crypto_exit(void) +{ +#ifndef HAVE_EVP_AES_128_CTR +#ifdef HAVE_OPAQUE_STRUCTS + if(aes_128_ctr_cipher) { + EVP_CIPHER_meth_free(aes_128_ctr_cipher); + } + + if(aes_192_ctr_cipher) { + EVP_CIPHER_meth_free(aes_192_ctr_cipher); + } + + if(aes_256_ctr_cipher) { + EVP_CIPHER_meth_free(aes_256_ctr_cipher); + } +#endif + + aes_128_ctr_cipher = NULL; + aes_192_ctr_cipher = NULL; + aes_256_ctr_cipher = NULL; +#endif +} /* TODO: Optionally call a passphrase callback specified by the * calling program @@ -486,7 +694,7 @@ passphrase_cb(char *buf, int size, int rwflag, char *passphrase) int passphrase_len = strlen(passphrase); (void) rwflag; - if (passphrase_len > (size - 1)) { + if(passphrase_len > (size - 1)) { passphrase_len = size - 1; } memcpy(buf, passphrase, passphrase_len); @@ -496,12 +704,12 @@ passphrase_cb(char *buf, int size, int rwflag, char *passphrase) } typedef void * (*pem_read_bio_func)(BIO *, void **, pem_password_cb *, - void * u); + void *u); static int -read_private_key_from_memory(void ** key_ctx, +read_private_key_from_memory(void **key_ctx, pem_read_bio_func read_private_key, - const char * filedata, + const char *filedata, size_t filedata_len, unsigned const char *passphrase) { @@ -510,7 +718,7 @@ read_private_key_from_memory(void ** key_ctx, *key_ctx = NULL; bp = BIO_new_mem_buf((char *)filedata, filedata_len); - if (!bp) { + if(!bp) { return -1; } *key_ctx = read_private_key(bp, NULL, (pem_password_cb *) passphrase_cb, @@ -520,10 +728,12 @@ read_private_key_from_memory(void ** key_ctx, return (*key_ctx) ? 0 : -1; } + + static int -read_private_key_from_file(void ** key_ctx, +read_private_key_from_file(void **key_ctx, pem_read_bio_func read_private_key, - const char * filename, + const char *filename, unsigned const char *passphrase) { BIO * bp; @@ -531,7 +741,7 @@ read_private_key_from_file(void ** key_ctx, *key_ctx = NULL; bp = BIO_new_file(filename, "r"); - if (!bp) { + if(!bp) { return -1; } @@ -548,139 +758,1229 @@ _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa, const char *filedata, size_t filedata_len, unsigned const char *passphrase) { + int rc; + pem_read_bio_func read_rsa = (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey; (void) session; _libssh2_init_if_needed(); - return read_private_key_from_memory((void **) rsa, read_rsa, - filedata, filedata_len, passphrase); -} - -int -_libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa, - LIBSSH2_SESSION * session, - const char *filename, unsigned const char *passphrase) -{ - pem_read_bio_func read_rsa = - (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey; - (void) session; + rc = read_private_key_from_memory((void **) rsa, read_rsa, + filedata, filedata_len, passphrase); - _libssh2_init_if_needed (); + if(rc) { + rc = read_openssh_private_key_from_memory((void **)rsa, session, + "ssh-rsa", filedata, filedata_len, passphrase); + } - return read_private_key_from_file((void **) rsa, read_rsa, - filename, passphrase); +return rc; } -#if LIBSSH2_DSA -int -_libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa, - LIBSSH2_SESSION * session, - const char *filedata, size_t filedata_len, - unsigned const char *passphrase) +static unsigned char * +gen_publickey_from_rsa(LIBSSH2_SESSION *session, RSA *rsa, + size_t *key_len) { - pem_read_bio_func read_dsa = - (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey; - (void) session; + int e_bytes, n_bytes; + unsigned long len; + unsigned char *key; + unsigned char *p; + const BIGNUM * e; + const BIGNUM * n; +#ifdef HAVE_OPAQUE_STRUCTS + RSA_get0_key(rsa, &n, &e, NULL); +#else + e = rsa->e; + n = rsa->n; +#endif + e_bytes = BN_num_bytes(e) + 1; + n_bytes = BN_num_bytes(n) + 1; - _libssh2_init_if_needed(); + /* Key form is "ssh-rsa" + e + n. */ + len = 4 + 7 + 4 + e_bytes + 4 + n_bytes; - return read_private_key_from_memory((void **) dsa, read_dsa, - filedata, filedata_len, passphrase); -} + key = LIBSSH2_ALLOC(session, len); + if(key == NULL) { + return NULL; + } -int -_libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa, - LIBSSH2_SESSION * session, - const char *filename, unsigned const char *passphrase) -{ - pem_read_bio_func read_dsa = - (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey; - (void) session; + /* Process key encoding. */ + p = key; + + _libssh2_htonu32(p, 7); /* Key type. */ + p += 4; + memcpy(p, "ssh-rsa", 7); + p += 7; - _libssh2_init_if_needed (); + p = write_bn(p, e, e_bytes); + p = write_bn(p, n, n_bytes); - return read_private_key_from_file((void **) dsa, read_dsa, - filename, passphrase); + *key_len = (size_t)(p - key); + return key; } -#endif /* LIBSSH_DSA */ -int -_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, - libssh2_rsa_ctx * rsactx, - const unsigned char *hash, - size_t hash_len, - unsigned char **signature, size_t *signature_len) +static int +gen_publickey_from_rsa_evp(LIBSSH2_SESSION *session, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + EVP_PKEY *pk) { - int ret; - unsigned char *sig; - unsigned int sig_len; + RSA* rsa = NULL; + unsigned char *key; + unsigned char *method_buf = NULL; + size_t key_len; - sig_len = RSA_size(rsactx); - sig = LIBSSH2_ALLOC(session, sig_len); + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing public key from RSA private key envelop"); - if (!sig) { - return -1; + rsa = EVP_PKEY_get1_RSA(pk); + if(rsa == NULL) { + /* Assume memory allocation error... what else could it be ? */ + goto __alloc_error; } - ret = RSA_sign(NID_sha1, hash, hash_len, sig, &sig_len, rsactx); - - if (!ret) { - LIBSSH2_FREE(session, sig); - return -1; + method_buf = LIBSSH2_ALLOC(session, 7); /* ssh-rsa. */ + if(method_buf == NULL) { + goto __alloc_error; } - *signature = sig; - *signature_len = sig_len; + key = gen_publickey_from_rsa(session, rsa, &key_len); + if(key == NULL) { + goto __alloc_error; + } + RSA_free(rsa); + memcpy(method_buf, "ssh-rsa", 7); + *method = method_buf; + *method_len = 7; + *pubkeydata = key; + *pubkeydata_len = key_len; return 0; + + __alloc_error: + if(rsa != NULL) { + RSA_free(rsa); + } + if(method_buf != NULL) { + LIBSSH2_FREE(session, method_buf); + } + + return _libssh2_error(session, + LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); } -#if LIBSSH2_DSA -int -_libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, - const unsigned char *hash, - unsigned long hash_len, unsigned char *signature) +static int _libssh2_rsa_new_additional_parameters(RSA *rsa) { - DSA_SIG *sig; - const BIGNUM * r; - const BIGNUM * s; - int r_len, s_len; - (void) hash_len; - - sig = DSA_do_sign(hash, SHA_DIGEST_LENGTH, dsactx); - if (!sig) { - return -1; - } + BN_CTX *ctx = NULL; + BIGNUM *aux = NULL; + BIGNUM *dmp1 = NULL; + BIGNUM *dmq1 = NULL; + const BIGNUM *p = NULL; + const BIGNUM *q = NULL; + const BIGNUM *d = NULL; + int rc = 0; #ifdef HAVE_OPAQUE_STRUCTS - DSA_SIG_get0(sig, &r, &s); + RSA_get0_key(rsa, NULL, NULL, &d); + RSA_get0_factors(rsa, &p, &q); #else - r = sig->r; - s = sig->s; + d = (*rsa).d; + p = (*rsa).p; + q = (*rsa).q; #endif - r_len = BN_num_bytes(r); - if (r_len < 1 || r_len > 20) { - DSA_SIG_free(sig); - return -1; - } - s_len = BN_num_bytes(s); - if (s_len < 1 || s_len > 20) { - DSA_SIG_free(sig); + + ctx = BN_CTX_new(); + if(ctx == NULL) return -1; + + aux = BN_new(); + if(aux == NULL) { + rc = -1; + goto out; } - memset(signature, 0, 40); + dmp1 = BN_new(); + if(dmp1 == NULL) { + rc = -1; + goto out; + } - BN_bn2bin(r, signature + (20 - r_len)); - BN_bn2bin(s, signature + 20 + (20 - s_len)); + dmq1 = BN_new(); + if(dmq1 == NULL) { + rc = -1; + goto out; + } - DSA_SIG_free(sig); + if((BN_sub(aux, q, BN_value_one()) == 0) || + (BN_mod(dmq1, d, aux, ctx) == 0) || + (BN_sub(aux, p, BN_value_one()) == 0) || + (BN_mod(dmp1, d, aux, ctx) == 0)) { + rc = -1; + goto out; + } - return 0; +#ifdef HAVE_OPAQUE_STRUCTS + RSA_set0_crt_params(rsa, dmp1, dmq1, NULL); +#else + (*rsa).dmp1 = dmp1; + (*rsa).dmq1 = dmq1; +#endif + +out: + if(aux) + BN_clear_free(aux); + BN_CTX_free(ctx); + + if(rc != 0) { + if(dmp1) + BN_clear_free(dmp1); + if(dmq1) + BN_clear_free(dmq1); + } + + return rc; +} + +static int +gen_publickey_from_rsa_openssh_priv_data(LIBSSH2_SESSION *session, + struct string_buf *decrypted, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + libssh2_rsa_ctx **rsa_ctx) +{ + int rc = 0; + size_t nlen, elen, dlen, plen, qlen, coefflen, commentlen; + unsigned char *n, *e, *d, *p, *q, *coeff, *comment; + RSA *rsa = NULL; + + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing RSA keys from private key data"); + + /* public key data */ + if(_libssh2_get_bignum_bytes(decrypted, &n, &nlen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "RSA no n"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &e, &elen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "RSA no e"); + return -1; + } + + /* private key data */ + if(_libssh2_get_bignum_bytes(decrypted, &d, &dlen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "RSA no d"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &coeff, &coefflen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "RSA no coeff"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &p, &plen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "RSA no p"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &q, &qlen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "RSA no q"); + return -1; + } + + if(_libssh2_get_string(decrypted, &comment, &commentlen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "RSA no comment"); + return -1; + } + + if((rc = _libssh2_rsa_new(&rsa, e, elen, n, nlen, d, dlen, p, plen, + q, qlen, NULL, 0, NULL, 0, + coeff, coefflen)) != 0) { + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Could not create RSA private key"); + goto fail; + } + + if(rsa != NULL) + rc = _libssh2_rsa_new_additional_parameters(rsa); + + if(rsa != NULL && pubkeydata != NULL && method != NULL) { + EVP_PKEY *pk = EVP_PKEY_new(); + EVP_PKEY_set1_RSA(pk, rsa); + + rc = gen_publickey_from_rsa_evp(session, method, method_len, + pubkeydata, pubkeydata_len, + pk); + + if(pk) + EVP_PKEY_free(pk); + } + + if(rsa_ctx != NULL) + *rsa_ctx = rsa; + else + RSA_free(rsa); + + return rc; + +fail: + + if(rsa != NULL) + RSA_free(rsa); + + return _libssh2_error(session, + LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); +} + +static int +_libssh2_rsa_new_openssh_private(libssh2_rsa_ctx ** rsa, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase) +{ + FILE *fp; + int rc; + unsigned char *buf = NULL; + struct string_buf *decrypted = NULL; + + if(session == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Session is required"); + return -1; + } + + _libssh2_init_if_needed(); + + fp = fopen(filename, "r"); + if(!fp) { + _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Unable to open OpenSSH RSA private key file"); + return -1; + } + + rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted); + fclose(fp); + if(rc) { + return rc; + } + + /* We have a new key file, now try and parse it using supported types */ + rc = _libssh2_get_string(decrypted, &buf, NULL); + + if(rc != 0 || buf == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Public key type in decrypted key data not found"); + return -1; + } + + if(strcmp("ssh-rsa", (const char *)buf) == 0) { + rc = gen_publickey_from_rsa_openssh_priv_data(session, decrypted, + NULL, 0, + NULL, 0, rsa); + } + else { + rc = -1; + } + + if(decrypted) + _libssh2_string_buf_free(session, decrypted); + + return rc; +} + +int +_libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa, + LIBSSH2_SESSION * session, + const char *filename, unsigned const char *passphrase) +{ + int rc; + + pem_read_bio_func read_rsa = + (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey; + (void) session; + + _libssh2_init_if_needed(); + + rc = read_private_key_from_file((void **) rsa, read_rsa, + filename, passphrase); + + if(rc) { + rc = _libssh2_rsa_new_openssh_private(rsa, session, + filename, passphrase); + } + + return rc; +} + +#if LIBSSH2_DSA +int +_libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa, + LIBSSH2_SESSION * session, + const char *filedata, size_t filedata_len, + unsigned const char *passphrase) +{ + int rc; + + pem_read_bio_func read_dsa = + (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey; + (void) session; + + _libssh2_init_if_needed(); + + rc = read_private_key_from_memory((void **)dsa, read_dsa, + filedata, filedata_len, passphrase); + + if(rc) { + rc = read_openssh_private_key_from_memory((void **)dsa, session, + "ssh-dsa", filedata, filedata_len, passphrase); + } + + return rc; +} + +static unsigned char * +gen_publickey_from_dsa(LIBSSH2_SESSION* session, DSA *dsa, + size_t *key_len) +{ + int p_bytes, q_bytes, g_bytes, k_bytes; + unsigned long len; + unsigned char *key; + unsigned char *p; + + const BIGNUM * p_bn; + const BIGNUM * q; + const BIGNUM * g; + const BIGNUM * pub_key; +#ifdef HAVE_OPAQUE_STRUCTS + DSA_get0_pqg(dsa, &p_bn, &q, &g); +#else + p_bn = dsa->p; + q = dsa->q; + g = dsa->g; +#endif + +#ifdef HAVE_OPAQUE_STRUCTS + DSA_get0_key(dsa, &pub_key, NULL); +#else + pub_key = dsa->pub_key; +#endif + p_bytes = BN_num_bytes(p_bn) + 1; + q_bytes = BN_num_bytes(q) + 1; + g_bytes = BN_num_bytes(g) + 1; + k_bytes = BN_num_bytes(pub_key) + 1; + + /* Key form is "ssh-dss" + p + q + g + pub_key. */ + len = 4 + 7 + 4 + p_bytes + 4 + q_bytes + 4 + g_bytes + 4 + k_bytes; + + key = LIBSSH2_ALLOC(session, len); + if(key == NULL) { + return NULL; + } + + /* Process key encoding. */ + p = key; + + _libssh2_htonu32(p, 7); /* Key type. */ + p += 4; + memcpy(p, "ssh-dss", 7); + p += 7; + + p = write_bn(p, p_bn, p_bytes); + p = write_bn(p, q, q_bytes); + p = write_bn(p, g, g_bytes); + p = write_bn(p, pub_key, k_bytes); + + *key_len = (size_t)(p - key); + return key; +} + +static int +gen_publickey_from_dsa_evp(LIBSSH2_SESSION *session, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + EVP_PKEY *pk) +{ + DSA* dsa = NULL; + unsigned char *key; + unsigned char *method_buf = NULL; + size_t key_len; + + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing public key from DSA private key envelop"); + + dsa = EVP_PKEY_get1_DSA(pk); + if(dsa == NULL) { + /* Assume memory allocation error... what else could it be ? */ + goto __alloc_error; + } + + method_buf = LIBSSH2_ALLOC(session, 7); /* ssh-dss. */ + if(method_buf == NULL) { + goto __alloc_error; + } + + key = gen_publickey_from_dsa(session, dsa, &key_len); + if(key == NULL) { + goto __alloc_error; + } + DSA_free(dsa); + + memcpy(method_buf, "ssh-dss", 7); + *method = method_buf; + *method_len = 7; + *pubkeydata = key; + *pubkeydata_len = key_len; + return 0; + + __alloc_error: + if(dsa != NULL) { + DSA_free(dsa); + } + if(method_buf != NULL) { + LIBSSH2_FREE(session, method_buf); + } + + return _libssh2_error(session, + LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); +} + +static int +gen_publickey_from_dsa_openssh_priv_data(LIBSSH2_SESSION *session, + struct string_buf *decrypted, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + libssh2_dsa_ctx **dsa_ctx) +{ + int rc = 0; + size_t plen, qlen, glen, pub_len, priv_len; + unsigned char *p, *q, *g, *pub_key, *priv_key; + DSA *dsa = NULL; + + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing DSA keys from private key data"); + + if(_libssh2_get_bignum_bytes(decrypted, &p, &plen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "DSA no p"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &q, &qlen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "DSA no q"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &g, &glen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "DSA no g"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &pub_key, &pub_len)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "DSA no public key"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &priv_key, &priv_len)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "DSA no private key"); + return -1; + } + + rc = _libssh2_dsa_new(&dsa, p, plen, q, qlen, g, glen, pub_key, pub_len, + priv_key, priv_len); + if(rc != 0) { + _libssh2_debug(session, + LIBSSH2_ERROR_PROTO, + "Could not create DSA private key"); + goto fail; + } + + if(dsa != NULL && pubkeydata != NULL && method != NULL) { + EVP_PKEY *pk = EVP_PKEY_new(); + EVP_PKEY_set1_DSA(pk, dsa); + + rc = gen_publickey_from_dsa_evp(session, method, method_len, + pubkeydata, pubkeydata_len, + pk); + + if(pk) + EVP_PKEY_free(pk); + } + + if(dsa_ctx != NULL) + *dsa_ctx = dsa; + else + DSA_free(dsa); + + return rc; + +fail: + + if(dsa != NULL) + DSA_free(dsa); + + return _libssh2_error(session, + LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); +} + +static int +_libssh2_dsa_new_openssh_private(libssh2_dsa_ctx ** dsa, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase) +{ + FILE *fp; + int rc; + unsigned char *buf = NULL; + struct string_buf *decrypted = NULL; + + if(session == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Session is required"); + return -1; + } + + _libssh2_init_if_needed(); + + fp = fopen(filename, "r"); + if(!fp) { + _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Unable to open OpenSSH DSA private key file"); + return -1; + } + + rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted); + fclose(fp); + if(rc) { + return rc; + } + + /* We have a new key file, now try and parse it using supported types */ + rc = _libssh2_get_string(decrypted, &buf, NULL); + + if(rc != 0 || buf == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Public key type in decrypted key data not found"); + return -1; + } + + if(strcmp("ssh-dss", (const char *)buf) == 0) { + rc = gen_publickey_from_dsa_openssh_priv_data(session, decrypted, + NULL, 0, + NULL, 0, dsa); + } + else { + rc = -1; + } + + if(decrypted) + _libssh2_string_buf_free(session, decrypted); + + return rc; +} + +int +_libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa, + LIBSSH2_SESSION * session, + const char *filename, unsigned const char *passphrase) +{ + int rc; + + pem_read_bio_func read_dsa = + (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey; + (void) session; + + _libssh2_init_if_needed(); + + rc = read_private_key_from_file((void **) dsa, read_dsa, + filename, passphrase); + + if(rc) { + rc = _libssh2_dsa_new_openssh_private(dsa, session, + filename, passphrase); + } + + return rc; +} + +#endif /* LIBSSH_DSA */ + +#if LIBSSH2_ECDSA + +int +_libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx, + LIBSSH2_SESSION * session, + const char *filedata, size_t filedata_len, + unsigned const char *passphrase) +{ + int rc; + + pem_read_bio_func read_ec = + (pem_read_bio_func) &PEM_read_bio_ECPrivateKey; + (void) session; + + _libssh2_init_if_needed(); + + rc = read_private_key_from_memory((void **) ec_ctx, read_ec, + filedata, filedata_len, passphrase); + + if(rc) { + rc = read_openssh_private_key_from_memory((void **)ec_ctx, session, + "ssh-ecdsa", filedata, + filedata_len, passphrase); + } + + return rc; +} + +#endif /* LIBSSH2_ECDSA */ + + +#if LIBSSH2_ED25519 + +int +_libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_x25519_ctx **out_ctx, + unsigned char **out_public_key, + unsigned char **out_private_key) +{ + EVP_PKEY *key = NULL; + EVP_PKEY_CTX *pctx = NULL; + PKCS8_PRIV_KEY_INFO *info = NULL; + ASN1_OCTET_STRING *oct = NULL; + X509_PUBKEY *pubkey = NULL; + libssh2_ed25519_ctx *ctx = NULL; + const unsigned char *pkcs, *priv, *pub; + int privLen, pubLen, pkcsLen; + int rc = -1; + + pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_X25519, NULL); + if(pctx == NULL) + return -1; + + EVP_PKEY_keygen_init(pctx); + EVP_PKEY_keygen(pctx, &key); + info = EVP_PKEY2PKCS8(key); + + if(info == NULL || !PKCS8_pkey_get0(NULL, &pkcs, &pkcsLen, NULL, info)) + goto cleanExit; + + oct = d2i_ASN1_OCTET_STRING(NULL, &pkcs, pkcsLen); + if(oct == NULL) { + goto cleanExit; + } + + priv = ASN1_STRING_get0_data(oct); + privLen = ASN1_STRING_length(oct); + + if(privLen != LIBSSH2_ED25519_KEY_LEN) + goto cleanExit; + + pubkey = X509_PUBKEY_new(); + if(pubkey == NULL || !X509_PUBKEY_set(&pubkey, key)) + goto cleanExit; + + if(!X509_PUBKEY_get0_param(NULL, &pub, &pubLen, NULL, pubkey)) + goto cleanExit; + + if(pubLen != LIBSSH2_ED25519_KEY_LEN) + goto cleanExit; + + if(out_private_key != NULL) { + *out_private_key = LIBSSH2_ALLOC(session, LIBSSH2_ED25519_KEY_LEN); + if(*out_private_key == NULL) + goto cleanExit; + + memcpy(*out_private_key, priv, LIBSSH2_ED25519_KEY_LEN); + } + + if(out_public_key != NULL) { + *out_public_key = LIBSSH2_ALLOC(session, LIBSSH2_ED25519_KEY_LEN); + if(*out_public_key == NULL) + goto cleanExit; + + memcpy(*out_public_key, pub, LIBSSH2_ED25519_KEY_LEN); + } + + if(out_ctx != NULL) { + ctx = malloc(sizeof(libssh2_x25519_ctx)); + if(ctx == NULL) + goto cleanExit; + + ctx->private_key = + EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, + (const unsigned char *)priv, + LIBSSH2_ED25519_KEY_LEN); + + ctx->public_key = + EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL, + (const unsigned char *)pub, + LIBSSH2_ED25519_KEY_LEN); + + if(ctx->public_key == NULL || ctx->private_key == NULL) { + _libssh2_x25519_free(ctx); + goto cleanExit; + } + + *out_ctx = ctx; + } + + /* success */ + rc = 0; + +cleanExit: + + if(info) + PKCS8_PRIV_KEY_INFO_free(info); + if(pctx) + EVP_PKEY_CTX_free(pctx); + if(oct) + ASN1_OCTET_STRING_free(oct); + if(pubkey) + X509_PUBKEY_free(pubkey); + if(key) + EVP_PKEY_free(key); + + return rc; +} + +static int +gen_publickey_from_ed25519_openssh_priv_data(LIBSSH2_SESSION *session, + struct string_buf *decrypted, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + libssh2_ed25519_ctx **out_ctx) +{ + libssh2_ed25519_ctx *ctx = NULL; + unsigned char *method_buf = NULL; + unsigned char *key = NULL; + int i, ret = 0; + unsigned char *pub_key, *priv_key, *buf; + size_t key_len = 0, tmp_len = 0; + unsigned char *p; + + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing ED25519 keys from private key data"); + + if(_libssh2_get_string(decrypted, &pub_key, &tmp_len) || + tmp_len != LIBSSH2_ED25519_KEY_LEN) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Wrong public key length"); + return -1; + } + + if(_libssh2_get_string(decrypted, &priv_key, &tmp_len) || + tmp_len != LIBSSH2_ED25519_PRIVATE_KEY_LEN) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Wrong private key length"); + ret = -1; + goto clean_exit; + } + + ctx = _libssh2_ed25519_new_ctx(); + if(ctx == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for ed25519 key"); + ret = -1; + goto clean_exit; + } + + /* first 32 bytes of priv_key is the private key, the last 32 bytes are + the public key */ + ctx->private_key = + EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, + (const unsigned char *)priv_key, + LIBSSH2_ED25519_KEY_LEN); + + ctx->public_key = + EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL, + (const unsigned char *)pub_key, + LIBSSH2_ED25519_KEY_LEN); + + /* comment */ + if(_libssh2_get_string(decrypted, &buf, &tmp_len)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unable to read comment"); + ret = -1; + goto clean_exit; + } + + if(tmp_len > 0) { + unsigned char *comment = LIBSSH2_CALLOC(session, tmp_len + 1); + if(comment != NULL) { + memcpy(comment, buf, tmp_len); + memcpy(comment + tmp_len, "\0", 1); + + _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Key comment: %s", + comment); + + LIBSSH2_FREE(session, comment); + } + } + + /* Padding */ + i = 1; + while(decrypted->dataptr < decrypted->data + decrypted->len) { + if(*decrypted->dataptr != i) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Wrong padding"); + ret = -1; + goto clean_exit; + } + i++; + decrypted->dataptr++; + } + + if(ret == 0) { + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing public key from ED25519 " + "private key envelop"); + + method_buf = LIBSSH2_ALLOC(session, 11); /* ssh-ed25519. */ + if(method_buf == NULL) { + goto clean_exit; + } + + /* Key form is: type_len(4) + type(11) + pub_key_len(4) + + pub_key(32). */ + key_len = LIBSSH2_ED25519_KEY_LEN + 19; + key = LIBSSH2_CALLOC(session, key_len); + if(key == NULL) { + goto clean_exit; + } + + p = key; + + _libssh2_store_str(&p, "ssh-ed25519", 11); + _libssh2_store_str(&p, (const char *)pub_key, LIBSSH2_ED25519_KEY_LEN); + + memcpy(method_buf, "ssh-ed25519", 11); + + if(method != NULL) + *method = method_buf; + else + LIBSSH2_FREE(session, method_buf); + + if(method_len != NULL) + *method_len = 11; + + if(pubkeydata != NULL) + *pubkeydata = key; + else + LIBSSH2_FREE(session, key); + + if(pubkeydata_len != NULL) + *pubkeydata_len = key_len; + + if(out_ctx != NULL) + *out_ctx = ctx; + else if(ctx != NULL) + _libssh2_ed25519_free(ctx); + + return 0; + } + +clean_exit: + + if(ctx) + _libssh2_ed25519_free(ctx); + + if(method_buf) + LIBSSH2_FREE(session, method_buf); + + if(key) + LIBSSH2_FREE(session, key); + + return -1; +} + +int +_libssh2_ed25519_new_private(libssh2_ed25519_ctx ** ed_ctx, + LIBSSH2_SESSION * session, + const char *filename, const uint8_t *passphrase) +{ + int rc; + FILE *fp; + unsigned char *buf; + struct string_buf *decrypted = NULL; + libssh2_ed25519_ctx *ctx = NULL; + + if(session == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Session is required"); + return -1; + } + + _libssh2_init_if_needed(); + + fp = fopen(filename, "r"); + if(!fp) { + _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Unable to open ED25519 private key file"); + return -1; + } + + rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted); + fclose(fp); + if(rc) { + return rc; + } + + /* We have a new key file, now try and parse it using supported types */ + rc = _libssh2_get_string(decrypted, &buf, NULL); + + if(rc != 0 || buf == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Public key type in decrypted key data not found"); + return -1; + } + + if(strcmp("ssh-ed25519", (const char *)buf) == 0) { + rc = gen_publickey_from_ed25519_openssh_priv_data(session, + decrypted, + NULL, + NULL, + NULL, + NULL, + &ctx); + } + else { + rc = -1; + } + + if(decrypted) + _libssh2_string_buf_free(session, decrypted); + + if(rc == 0) { + if(ed_ctx != NULL) + *ed_ctx = ctx; + else if(ctx != NULL) + _libssh2_ed25519_free(ctx); + } + + return rc; +} + +int +_libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx ** ed_ctx, + LIBSSH2_SESSION * session, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase) +{ + return read_openssh_private_key_from_memory((void **)ed_ctx, session, + "ssh-ed25519", + filedata, filedata_len, + passphrase); +} + +int +_libssh2_ed25519_new_public(libssh2_ed25519_ctx ** ed_ctx, + LIBSSH2_SESSION * session, + const unsigned char *raw_pub_key, + const uint8_t key_len) +{ + libssh2_ed25519_ctx *ctx = NULL; + EVP_PKEY *public_key = NULL; + + if(ed_ctx == NULL) + return -1; + + public_key = + EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL, + (const unsigned char *)raw_pub_key, + key_len); + if(public_key == NULL) { + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "could not create ED25519 public key"); + } + + ctx = _libssh2_ed25519_new_ctx(); + if(ctx == NULL) { + return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "could not alloc public/private key"); + } + + ctx->public_key = public_key; + + if(ed_ctx != NULL) + *ed_ctx = ctx; + else if(ctx != NULL) + _libssh2_ed25519_free(ctx); + + return 0; +} + +#endif /* LIBSSH2_ED25519 */ + +int +_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, + libssh2_rsa_ctx * rsactx, + const unsigned char *hash, + size_t hash_len, + unsigned char **signature, size_t *signature_len) +{ + int ret; + unsigned char *sig; + unsigned int sig_len; + + sig_len = RSA_size(rsactx); + sig = LIBSSH2_ALLOC(session, sig_len); + + if(!sig) { + return -1; + } + + ret = RSA_sign(NID_sha1, hash, hash_len, sig, &sig_len, rsactx); + + if(!ret) { + LIBSSH2_FREE(session, sig); + return -1; + } + + *signature = sig; + *signature_len = sig_len; + + return 0; +} + +#if LIBSSH2_DSA +int +_libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, + const unsigned char *hash, + unsigned long hash_len, unsigned char *signature) +{ + DSA_SIG *sig; + const BIGNUM * r; + const BIGNUM * s; + int r_len, s_len; + (void) hash_len; + + sig = DSA_do_sign(hash, SHA_DIGEST_LENGTH, dsactx); + if(!sig) { + return -1; + } + +#ifdef HAVE_OPAQUE_STRUCTS + DSA_SIG_get0(sig, &r, &s); +#else + r = sig->r; + s = sig->s; +#endif + r_len = BN_num_bytes(r); + if(r_len < 1 || r_len > 20) { + DSA_SIG_free(sig); + return -1; + } + s_len = BN_num_bytes(s); + if(s_len < 1 || s_len > 20) { + DSA_SIG_free(sig); + return -1; + } + + memset(signature, 0, 40); + + BN_bn2bin(r, signature + (20 - r_len)); + BN_bn2bin(s, signature + 20 + (20 - s_len)); + + DSA_SIG_free(sig); + + return 0; +} +#endif /* LIBSSH_DSA */ + +#if LIBSSH2_ECDSA + +int +_libssh2_ecdsa_sign(LIBSSH2_SESSION * session, libssh2_ecdsa_ctx * ec_ctx, + const unsigned char *hash, unsigned long hash_len, + unsigned char **signature, size_t *signature_len) +{ + int r_len, s_len; + int rc = 0; + size_t out_buffer_len = 0; + unsigned char *sp; + const BIGNUM *pr = NULL, *ps = NULL; + unsigned char *temp_buffer = NULL; + unsigned char *out_buffer = NULL; + + ECDSA_SIG *sig = ECDSA_do_sign(hash, hash_len, ec_ctx); + if(sig == NULL) + return -1; +#ifdef HAVE_OPAQUE_STRUCTS + ECDSA_SIG_get0(sig, &pr, &ps); +#else + pr = sig->r; + ps = sig->s; +#endif + + r_len = BN_num_bytes(pr) + 1; + s_len = BN_num_bytes(ps) + 1; + + temp_buffer = malloc(r_len + s_len + 8); + if(temp_buffer == NULL) { + rc = -1; + goto clean_exit; + } + + sp = temp_buffer; + sp = write_bn(sp, pr, r_len); + sp = write_bn(sp, ps, s_len); + + out_buffer_len = (size_t)(sp - temp_buffer); + + out_buffer = LIBSSH2_CALLOC(session, out_buffer_len); + if(out_buffer == NULL) { + rc = -1; + goto clean_exit; + } + + memcpy(out_buffer, temp_buffer, out_buffer_len); + + *signature = out_buffer; + *signature_len = out_buffer_len; + +clean_exit: + + if(temp_buffer != NULL) + free(temp_buffer); + + if(sig) + ECDSA_SIG_free(sig); + + return rc; } -#endif /* LIBSSH_DSA */ +#endif /* LIBSSH2_ECDSA */ int _libssh2_sha1_init(libssh2_sha1_ctx *ctx) @@ -688,10 +1988,10 @@ _libssh2_sha1_init(libssh2_sha1_ctx *ctx) #ifdef HAVE_OPAQUE_STRUCTS *ctx = EVP_MD_CTX_new(); - if (*ctx == NULL) + if(*ctx == NULL) return 0; - if (EVP_DigestInit(*ctx, EVP_get_digestbyname("sha1"))) + if(EVP_DigestInit(*ctx, EVP_get_digestbyname("sha1"))) return 1; EVP_MD_CTX_free(*ctx); @@ -711,10 +2011,10 @@ _libssh2_sha1(const unsigned char *message, unsigned long len, #ifdef HAVE_OPAQUE_STRUCTS EVP_MD_CTX * ctx = EVP_MD_CTX_new(); - if (ctx == NULL) + if(ctx == NULL) return 1; /* error */ - if (EVP_DigestInit(ctx, EVP_get_digestbyname("sha1"))) { + if(EVP_DigestInit(ctx, EVP_get_digestbyname("sha1"))) { EVP_DigestUpdate(ctx, message, len); EVP_DigestFinal(ctx, out, NULL); EVP_MD_CTX_free(ctx); @@ -725,7 +2025,7 @@ _libssh2_sha1(const unsigned char *message, unsigned long len, EVP_MD_CTX ctx; EVP_MD_CTX_init(&ctx); - if (EVP_DigestInit(&ctx, EVP_get_digestbyname("sha1"))) { + if(EVP_DigestInit(&ctx, EVP_get_digestbyname("sha1"))) { EVP_DigestUpdate(&ctx, message, len); EVP_DigestFinal(&ctx, out, NULL); return 0; /* success */ @@ -740,10 +2040,10 @@ _libssh2_sha256_init(libssh2_sha256_ctx *ctx) #ifdef HAVE_OPAQUE_STRUCTS *ctx = EVP_MD_CTX_new(); - if (*ctx == NULL) + if(*ctx == NULL) return 0; - if (EVP_DigestInit(*ctx, EVP_get_digestbyname("sha256"))) + if(EVP_DigestInit(*ctx, EVP_get_digestbyname("sha256"))) return 1; EVP_MD_CTX_free(*ctx); @@ -763,7 +2063,7 @@ _libssh2_sha256(const unsigned char *message, unsigned long len, #ifdef HAVE_OPAQUE_STRUCTS EVP_MD_CTX * ctx = EVP_MD_CTX_new(); - if (ctx == NULL) + if(ctx == NULL) return 1; /* error */ if(EVP_DigestInit(ctx, EVP_get_digestbyname("sha256"))) { @@ -786,16 +2086,120 @@ _libssh2_sha256(const unsigned char *message, unsigned long len, return 1; /* error */ } +int +_libssh2_sha384_init(libssh2_sha384_ctx *ctx) +{ +#ifdef HAVE_OPAQUE_STRUCTS + *ctx = EVP_MD_CTX_new(); + + if(*ctx == NULL) + return 0; + + if(EVP_DigestInit(*ctx, EVP_get_digestbyname("sha384"))) + return 1; + + EVP_MD_CTX_free(*ctx); + *ctx = NULL; + + return 0; +#else + EVP_MD_CTX_init(ctx); + return EVP_DigestInit(ctx, EVP_get_digestbyname("sha384")); +#endif +} + +int +_libssh2_sha384(const unsigned char *message, unsigned long len, + unsigned char *out) +{ +#ifdef HAVE_OPAQUE_STRUCTS + EVP_MD_CTX * ctx = EVP_MD_CTX_new(); + + if(ctx == NULL) + return 1; /* error */ + + if(EVP_DigestInit(ctx, EVP_get_digestbyname("sha384"))) { + EVP_DigestUpdate(ctx, message, len); + EVP_DigestFinal(ctx, out, NULL); + EVP_MD_CTX_free(ctx); + return 0; /* success */ + } + EVP_MD_CTX_free(ctx); +#else + EVP_MD_CTX ctx; + + EVP_MD_CTX_init(&ctx); + if(EVP_DigestInit(&ctx, EVP_get_digestbyname("sha384"))) { + EVP_DigestUpdate(&ctx, message, len); + EVP_DigestFinal(&ctx, out, NULL); + return 0; /* success */ + } +#endif + return 1; /* error */ +} + +int +_libssh2_sha512_init(libssh2_sha512_ctx *ctx) +{ +#ifdef HAVE_OPAQUE_STRUCTS + *ctx = EVP_MD_CTX_new(); + + if(*ctx == NULL) + return 0; + + if(EVP_DigestInit(*ctx, EVP_get_digestbyname("sha512"))) + return 1; + + EVP_MD_CTX_free(*ctx); + *ctx = NULL; + + return 0; +#else + EVP_MD_CTX_init(ctx); + return EVP_DigestInit(ctx, EVP_get_digestbyname("sha512")); +#endif +} + +int +_libssh2_sha512(const unsigned char *message, unsigned long len, + unsigned char *out) +{ +#ifdef HAVE_OPAQUE_STRUCTS + EVP_MD_CTX * ctx = EVP_MD_CTX_new(); + + if(ctx == NULL) + return 1; /* error */ + + if(EVP_DigestInit(ctx, EVP_get_digestbyname("sha512"))) { + EVP_DigestUpdate(ctx, message, len); + EVP_DigestFinal(ctx, out, NULL); + EVP_MD_CTX_free(ctx); + return 0; /* success */ + } + EVP_MD_CTX_free(ctx); +#else + EVP_MD_CTX ctx; + + EVP_MD_CTX_init(&ctx); + if(EVP_DigestInit(&ctx, EVP_get_digestbyname("sha512"))) { + EVP_DigestUpdate(&ctx, message, len); + EVP_DigestFinal(&ctx, out, NULL); + return 0; /* success */ + } +#endif + return 1; /* error */ +} + int _libssh2_md5_init(libssh2_md5_ctx *ctx) { #ifdef HAVE_OPAQUE_STRUCTS *ctx = EVP_MD_CTX_new(); - if (*ctx == NULL) + if(*ctx == NULL) return 0; - if (EVP_DigestInit(*ctx, EVP_get_digestbyname("md5"))) + if(EVP_DigestInit(*ctx, EVP_get_digestbyname("md5"))) return 1; EVP_MD_CTX_free(*ctx); @@ -808,233 +2212,696 @@ _libssh2_md5_init(libssh2_md5_ctx *ctx) #endif } -static unsigned char * -write_bn(unsigned char *buf, const BIGNUM *bn, int bn_bytes) +#if LIBSSH2_ECDSA + +static int +gen_publickey_from_ec_evp(LIBSSH2_SESSION *session, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + EVP_PKEY *pk) { - unsigned char *p = buf; + int rc = 0; + EC_KEY *ec = NULL; + unsigned char *p; + unsigned char *method_buf = NULL; + unsigned char *key; + size_t key_len = 0; + unsigned char *octal_value = NULL; + size_t octal_len; + const EC_POINT *public_key; + const EC_GROUP *group; + BN_CTX *bn_ctx; + libssh2_curve_type type; - /* Left space for bn size which will be written below. */ - p += 4; + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing public key from EC private key envelop"); - *p = 0; - BN_bn2bin(bn, p + 1); - if (!(*(p + 1) & 0x80)) { - memmove(p, p + 1, --bn_bytes); + bn_ctx = BN_CTX_new(); + if(bn_ctx == NULL) + return -1; + + ec = EVP_PKEY_get1_EC_KEY(pk); + if(ec == NULL) { + rc = -1; + goto clean_exit; } - _libssh2_htonu32(p - 4, bn_bytes); /* Post write bn size. */ - return p + bn_bytes; -} + public_key = EC_KEY_get0_public_key(ec); + group = EC_KEY_get0_group(ec); + type = _libssh2_ecdsa_key_get_curve_type(ec); + + method_buf = LIBSSH2_ALLOC(session, 19); + if(method_buf == NULL) { + return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "out of memory"); + } + + if(type == LIBSSH2_EC_CURVE_NISTP256) + memcpy(method_buf, "ecdsa-sha2-nistp256", 19); + else if(type == LIBSSH2_EC_CURVE_NISTP384) + memcpy(method_buf, "ecdsa-sha2-nistp384", 19); + else if(type == LIBSSH2_EC_CURVE_NISTP521) + memcpy(method_buf, "ecdsa-sha2-nistp521", 19); + else { + _libssh2_debug(session, + LIBSSH2_TRACE_ERROR, + "Unsupported EC private key type"); + rc = -1; + goto clean_exit; + } + + /* get length */ + octal_len = EC_POINT_point2oct(group, public_key, + POINT_CONVERSION_UNCOMPRESSED, + NULL, 0, bn_ctx); + if(octal_len > EC_MAX_POINT_LEN) { + rc = -1; + goto clean_exit; + } + + octal_value = malloc(octal_len); + if(octal_value == NULL) { + rc = -1; + goto clean_exit; + } + + /* convert to octal */ + if(EC_POINT_point2oct(group, public_key, POINT_CONVERSION_UNCOMPRESSED, + octal_value, octal_len, bn_ctx) != octal_len) { + rc = -1; + goto clean_exit; + } + + /* Key form is: type_len(4) + type(19) + domain_len(4) + domain(8) + + pub_key_len(4) + pub_key(~65). */ + key_len = 4 + 19 + 4 + 8 + 4 + octal_len; + key = LIBSSH2_ALLOC(session, key_len); + if(key == NULL) { + rc = -1; + goto clean_exit; + } + + /* Process key encoding. */ + p = key; + + /* Key type */ + _libssh2_store_str(&p, (const char *)method_buf, 19); + + /* Name domain */ + _libssh2_store_str(&p, (const char *)method_buf + 11, 8); + + /* Public key */ + _libssh2_store_str(&p, (const char *)octal_value, octal_len); + + *method = method_buf; + *method_len = 19; + *pubkeydata = key; + *pubkeydata_len = key_len; + +clean_exit: + + if(ec != NULL) + EC_KEY_free(ec); + + if(bn_ctx != NULL) { + BN_CTX_free(bn_ctx); + } + + if(octal_value != NULL) + free(octal_value); + + if(rc == 0) + return 0; + + if(method_buf != NULL) + LIBSSH2_FREE(session, method_buf); + + return -1; +} + +static int +gen_publickey_from_ecdsa_openssh_priv_data(LIBSSH2_SESSION *session, + libssh2_curve_type curve_type, + struct string_buf *decrypted, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + libssh2_ecdsa_ctx **ec_ctx) +{ + int rc = 0; + size_t curvelen, exponentlen, pointlen; + unsigned char *curve, *exponent, *point_buf; + EC_KEY *ec_key = NULL; + BIGNUM *bn_exponent; + + _libssh2_debug(session, + LIBSSH2_TRACE_AUTH, + "Computing ECDSA keys from private key data"); + + if(_libssh2_get_string(decrypted, &curve, &curvelen) || + curvelen == 0) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "ECDSA no curve"); + return -1; + } + + if(_libssh2_get_string(decrypted, &point_buf, &pointlen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "ECDSA no point"); + return -1; + } + + if(_libssh2_get_bignum_bytes(decrypted, &exponent, &exponentlen)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "ECDSA no exponent"); + return -1; + } + + if((rc = _libssh2_ecdsa_curve_name_with_octal_new(&ec_key, point_buf, + pointlen, curve_type)) != 0) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "ECDSA could not create key"); + goto fail; + } + + bn_exponent = BN_new(); + if(bn_exponent == NULL) { + rc = -1; + goto fail; + } + + BN_bin2bn(exponent, exponentlen, bn_exponent); + rc = (EC_KEY_set_private_key(ec_key, bn_exponent) != 1); + + if(rc == 0 && ec_key != NULL && pubkeydata != NULL && method != NULL) { + EVP_PKEY *pk = EVP_PKEY_new(); + EVP_PKEY_set1_EC_KEY(pk, ec_key); + + rc = gen_publickey_from_ec_evp(session, method, method_len, + pubkeydata, pubkeydata_len, + pk); + + if(pk) + EVP_PKEY_free(pk); + } + + if(ec_ctx != NULL) + *ec_ctx = ec_key; + else + EC_KEY_free(ec_key); + + return rc; + +fail: + + if(ec_key != NULL) + EC_KEY_free(ec_key); + + return _libssh2_error(session, + LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); + + +} + +static int +_libssh2_ecdsa_new_openssh_private(libssh2_ecdsa_ctx ** ec_ctx, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase) +{ + FILE *fp; + int rc; + unsigned char *buf = NULL; + libssh2_curve_type type; + struct string_buf *decrypted = NULL; + + if(session == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Session is required"); + return -1; + } + + _libssh2_init_if_needed(); + + fp = fopen(filename, "r"); + if(!fp) { + _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Unable to open OpenSSH ECDSA private key file"); + return -1; + } + + rc = _libssh2_openssh_pem_parse(session, passphrase, fp, &decrypted); + fclose(fp); + if(rc) { + return rc; + } + + /* We have a new key file, now try and parse it using supported types */ + rc = _libssh2_get_string(decrypted, &buf, NULL); + + if(rc != 0 || buf == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Public key type in decrypted key data not found"); + return -1; + } + + rc = _libssh2_ecdsa_curve_type_from_name((const char *)buf, &type); + + if(rc == 0) { + rc = gen_publickey_from_ecdsa_openssh_priv_data(session, type, + decrypted, NULL, 0, + NULL, 0, ec_ctx); + } + else { + rc = -1; + } + + if(decrypted) + _libssh2_string_buf_free(session, decrypted); + + return rc; +} + +int +_libssh2_ecdsa_new_private(libssh2_ecdsa_ctx ** ec_ctx, + LIBSSH2_SESSION * session, + const char *filename, unsigned const char *passphrase) +{ + int rc; + + pem_read_bio_func read_ec = (pem_read_bio_func) &PEM_read_bio_ECPrivateKey; + (void) session; + + _libssh2_init_if_needed(); + + rc = read_private_key_from_file((void **) ec_ctx, read_ec, + filename, passphrase); + + if(rc) { + return _libssh2_ecdsa_new_openssh_private(ec_ctx, session, + filename, passphrase); + } + + return rc; +} + +/* + * _libssh2_ecdsa_create_key + * + * Creates a local private key based on input curve + * and returns octal value and octal length + * + */ + +int +_libssh2_ecdsa_create_key(LIBSSH2_SESSION *session, + _libssh2_ec_key **out_private_key, + unsigned char **out_public_key_octal, + size_t *out_public_key_octal_len, + libssh2_curve_type curve_type) +{ + int ret = 1; + size_t octal_len = 0; + unsigned char octal_value[EC_MAX_POINT_LEN]; + const EC_POINT *public_key = NULL; + EC_KEY *private_key = NULL; + const EC_GROUP *group = NULL; + + /* create key */ + BN_CTX *bn_ctx = BN_CTX_new(); + if(!bn_ctx) + return -1; + + private_key = EC_KEY_new_by_curve_name(curve_type); + group = EC_KEY_get0_group(private_key); + + EC_KEY_generate_key(private_key); + public_key = EC_KEY_get0_public_key(private_key); + + /* get length */ + octal_len = EC_POINT_point2oct(group, public_key, + POINT_CONVERSION_UNCOMPRESSED, + NULL, 0, bn_ctx); + if(octal_len > EC_MAX_POINT_LEN) { + ret = -1; + goto clean_exit; + } + + /* convert to octal */ + if(EC_POINT_point2oct(group, public_key, POINT_CONVERSION_UNCOMPRESSED, + octal_value, octal_len, bn_ctx) != octal_len) { + ret = -1; + goto clean_exit; + } + + if(out_private_key != NULL) + *out_private_key = private_key; + + if(out_public_key_octal) { + *out_public_key_octal = LIBSSH2_ALLOC(session, octal_len); + if(*out_public_key_octal == NULL) { + ret = -1; + goto clean_exit; + } + + memcpy(*out_public_key_octal, octal_value, octal_len); + } + + if(out_public_key_octal_len != NULL) + *out_public_key_octal_len = octal_len; + +clean_exit: + + if(bn_ctx) + BN_CTX_free(bn_ctx); + + return (ret == 1) ? 0 : -1; +} + +/* _libssh2_ecdh_gen_k + * + * Computes the shared secret K given a local private key, + * remote public key and length + */ + +int +_libssh2_ecdh_gen_k(_libssh2_bn **k, _libssh2_ec_key *private_key, + const unsigned char *server_public_key, size_t server_public_key_len) +{ + int ret = 0; + int rc; + size_t secret_len; + unsigned char *secret = NULL; + const EC_GROUP *private_key_group; + EC_POINT *server_public_key_point; + + BN_CTX *bn_ctx = BN_CTX_new(); + + if(!bn_ctx) + return -1; + + if(k == NULL) + return -1; + + private_key_group = EC_KEY_get0_group(private_key); + + server_public_key_point = EC_POINT_new(private_key_group); + if(server_public_key_point == NULL) + return -1; + + rc = EC_POINT_oct2point(private_key_group, server_public_key_point, + server_public_key, server_public_key_len, bn_ctx); + if(rc != 1) { + ret = -1; + goto clean_exit; + } -static unsigned char * -gen_publickey_from_rsa(LIBSSH2_SESSION *session, RSA *rsa, - size_t *key_len) -{ - int e_bytes, n_bytes; - unsigned long len; - unsigned char* key; - unsigned char* p; - const BIGNUM * e; - const BIGNUM * n; -#ifdef HAVE_OPAQUE_STRUCTS - RSA_get0_key(rsa, &n, &e, NULL); -#else - e = rsa->e; - n = rsa->n; -#endif - e_bytes = BN_num_bytes(e) + 1; - n_bytes = BN_num_bytes(n) + 1; + secret_len = (EC_GROUP_get_degree(private_key_group) + 7) / 8; + secret = malloc(secret_len); + if(!secret) { + ret = -1; + goto clean_exit; + } - /* Key form is "ssh-rsa" + e + n. */ - len = 4 + 7 + 4 + e_bytes + 4 + n_bytes; + secret_len = ECDH_compute_key(secret, secret_len, server_public_key_point, + private_key, NULL); - key = LIBSSH2_ALLOC(session, len); - if (key == NULL) { - return NULL; + if(secret_len <= 0 || secret_len > EC_MAX_POINT_LEN) { + ret = -1; + goto clean_exit; } - /* Process key encoding. */ - p = key; + BN_bin2bn(secret, secret_len, *k); - _libssh2_htonu32(p, 7); /* Key type. */ - p += 4; - memcpy(p, "ssh-rsa", 7); - p += 7; +clean_exit: - p = write_bn(p, e, e_bytes); - p = write_bn(p, n, n_bytes); + if(server_public_key_point != NULL) + EC_POINT_free(server_public_key_point); - *key_len = (size_t)(p - key); - return key; + if(bn_ctx != NULL) + BN_CTX_free(bn_ctx); + + if(secret != NULL) + free(secret); + + return ret; } -#if LIBSSH2_DSA -static unsigned char * -gen_publickey_from_dsa(LIBSSH2_SESSION* session, DSA *dsa, - size_t *key_len) + +#endif /* LIBSSH2_ECDSA */ + +#if LIBSSH2_ED25519 + +int +_libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session, + uint8_t **out_sig, size_t *out_sig_len, + const uint8_t *message, size_t message_len) { - int p_bytes, q_bytes, g_bytes, k_bytes; - unsigned long len; - unsigned char* key; - unsigned char* p; + int rc = -1; + EVP_MD_CTX *md_ctx = EVP_MD_CTX_new(); + size_t sig_len = 0; + unsigned char *sig = NULL; - const BIGNUM * p_bn; - const BIGNUM * q; - const BIGNUM * g; - const BIGNUM * pub_key; -#ifdef HAVE_OPAQUE_STRUCTS - DSA_get0_pqg(dsa, &p_bn, &q, &g); -#else - p_bn = dsa->p; - q = dsa->q; - g = dsa->g; -#endif + if(md_ctx != NULL) { + if(EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, ctx->private_key) != 1) + goto clean_exit; + if(EVP_DigestSign(md_ctx, NULL, &sig_len, message, message_len) != 1) + goto clean_exit; -#ifdef HAVE_OPAQUE_STRUCTS - DSA_get0_key(dsa, &pub_key, NULL); -#else - pub_key = dsa->pub_key; -#endif - p_bytes = BN_num_bytes(p_bn) + 1; - q_bytes = BN_num_bytes(q) + 1; - g_bytes = BN_num_bytes(g) + 1; - k_bytes = BN_num_bytes(pub_key) + 1; + if(sig_len != LIBSSH2_ED25519_SIG_LEN) + goto clean_exit; - /* Key form is "ssh-dss" + p + q + g + pub_key. */ - len = 4 + 7 + 4 + p_bytes + 4 + q_bytes + 4 + g_bytes + 4 + k_bytes; + sig = LIBSSH2_CALLOC(session, sig_len); + if(sig == NULL) + goto clean_exit; - key = LIBSSH2_ALLOC(session, len); - if (key == NULL) { - return NULL; + rc = EVP_DigestSign(md_ctx, sig, &sig_len, message, message_len); } - /* Process key encoding. */ - p = key; + if(rc == 1) { + *out_sig = sig; + *out_sig_len = sig_len; + } + else { + *out_sig_len = 0; + *out_sig = NULL; + LIBSSH2_FREE(session, sig); + } - _libssh2_htonu32(p, 7); /* Key type. */ - p += 4; - memcpy(p, "ssh-dss", 7); - p += 7; +clean_exit: - p = write_bn(p, p_bn, p_bytes); - p = write_bn(p, q, q_bytes); - p = write_bn(p, g, g_bytes); - p = write_bn(p, pub_key, k_bytes); + if(md_ctx) + EVP_MD_CTX_free(md_ctx); - *key_len = (size_t)(p - key); - return key; + return (rc == 1 ? 0 : -1); } -#endif /* LIBSSH_DSA */ -static int -gen_publickey_from_rsa_evp(LIBSSH2_SESSION *session, - unsigned char **method, - size_t *method_len, - unsigned char **pubkeydata, - size_t *pubkeydata_len, - EVP_PKEY *pk) +int +_libssh2_curve25519_gen_k(_libssh2_bn **k, + uint8_t private_key[LIBSSH2_ED25519_KEY_LEN], + uint8_t server_public_key[LIBSSH2_ED25519_KEY_LEN]) { - RSA* rsa = NULL; - unsigned char* key; - unsigned char* method_buf = NULL; - size_t key_len; + int rc = -1; + unsigned char out_shared_key[LIBSSH2_ED25519_KEY_LEN]; + EVP_PKEY *peer_key = NULL, *server_key = NULL; + EVP_PKEY_CTX *server_key_ctx = NULL; + BN_CTX *bn_ctx = NULL; + size_t out_len = 0; + + if(k == NULL || *k == NULL) + return -1; - _libssh2_debug(session, - LIBSSH2_TRACE_AUTH, - "Computing public key from RSA private key envelop"); + bn_ctx = BN_CTX_new(); + if(bn_ctx == NULL) + return -1; - rsa = EVP_PKEY_get1_RSA(pk); - if (rsa == NULL) { - /* Assume memory allocation error... what else could it be ? */ - goto __alloc_error; + peer_key = EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL, + server_public_key, + LIBSSH2_ED25519_KEY_LEN); + + server_key = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, + private_key, + LIBSSH2_ED25519_KEY_LEN); + + if(peer_key == NULL || server_key == NULL) { + goto cleanExit; } - method_buf = LIBSSH2_ALLOC(session, 7); /* ssh-rsa. */ - if (method_buf == NULL) { - goto __alloc_error; + server_key_ctx = EVP_PKEY_CTX_new(server_key, NULL); + if(server_key_ctx == NULL) { + goto cleanExit; } - key = gen_publickey_from_rsa(session, rsa, &key_len); - if (key == NULL) { - goto __alloc_error; + rc = EVP_PKEY_derive_init(server_key_ctx); + if(rc <= 0) goto cleanExit; + + rc = EVP_PKEY_derive_set_peer(server_key_ctx, peer_key); + if(rc <= 0) goto cleanExit; + + rc = EVP_PKEY_derive(server_key_ctx, NULL, &out_len); + if(rc <= 0) goto cleanExit; + + if(out_len != LIBSSH2_ED25519_KEY_LEN) { + rc = -1; + goto cleanExit; } - RSA_free(rsa); - memcpy(method_buf, "ssh-rsa", 7); - *method = method_buf; - *method_len = 7; - *pubkeydata = key; - *pubkeydata_len = key_len; - return 0; + rc = EVP_PKEY_derive(server_key_ctx, out_shared_key, &out_len); - __alloc_error: - if (rsa != NULL) { - RSA_free(rsa); + if(rc == 1 && out_len == LIBSSH2_ED25519_KEY_LEN) { + BN_bin2bn(out_shared_key, LIBSSH2_ED25519_KEY_LEN, *k); } - if (method_buf != NULL) { - LIBSSH2_FREE(session, method_buf); + else { + rc = -1; } - return _libssh2_error(session, - LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for private key data"); +cleanExit: + + if(server_key_ctx) + EVP_PKEY_CTX_free(server_key_ctx); + if(peer_key) + EVP_PKEY_free(peer_key); + if(server_key) + EVP_PKEY_free(server_key); + if(bn_ctx != NULL) + BN_CTX_free(bn_ctx); + + return (rc == 1) ? 0 : -1; } -#if LIBSSH2_DSA + +int +_libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s, + size_t s_len, const uint8_t *m, size_t m_len) +{ + int ret = -1; + + EVP_MD_CTX *md_ctx = EVP_MD_CTX_new(); + if(NULL == md_ctx) + return -1; + + ret = EVP_DigestVerifyInit(md_ctx, NULL, NULL, NULL, ctx->public_key); + if(ret != 1) + goto clean_exit; + + ret = EVP_DigestVerify(md_ctx, s, s_len, m, m_len); + + clean_exit: + + EVP_MD_CTX_free(md_ctx); + + return (ret == 1) ? 0 : -1; +} + +#endif /* LIBSSH2_ED25519 */ + static int -gen_publickey_from_dsa_evp(LIBSSH2_SESSION *session, - unsigned char **method, - size_t *method_len, - unsigned char **pubkeydata, - size_t *pubkeydata_len, - EVP_PKEY *pk) +_libssh2_pub_priv_openssh_keyfile(LIBSSH2_SESSION *session, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + const char *privatekey, + const char *passphrase) { - DSA* dsa = NULL; - unsigned char* key; - unsigned char* method_buf = NULL; - size_t key_len; + FILE *fp; + unsigned char *buf = NULL; + struct string_buf *decrypted = NULL; + int rc = 0; + + if(session == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Session is required"); + return -1; + } - _libssh2_debug(session, - LIBSSH2_TRACE_AUTH, - "Computing public key from DSA private key envelop"); + _libssh2_init_if_needed(); - dsa = EVP_PKEY_get1_DSA(pk); - if (dsa == NULL) { - /* Assume memory allocation error... what else could it be ? */ - goto __alloc_error; + fp = fopen(privatekey, "r"); + if(!fp) { + _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Unable to open private key file"); + return -1; } - method_buf = LIBSSH2_ALLOC(session, 7); /* ssh-dss. */ - if (method_buf == NULL) { - goto __alloc_error; + rc = _libssh2_openssh_pem_parse(session, (const unsigned char *)passphrase, + fp, &decrypted); + fclose(fp); + if(rc) { + _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Not an OpenSSH key file"); + return rc; } - key = gen_publickey_from_dsa(session, dsa, &key_len); - if (key == NULL) { - goto __alloc_error; + /* We have a new key file, now try and parse it using supported types */ + rc = _libssh2_get_string(decrypted, &buf, NULL); + + if(rc != 0 || buf == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Public key type in decrypted key data not found"); + return -1; } - DSA_free(dsa); - memcpy(method_buf, "ssh-dss", 7); - *method = method_buf; - *method_len = 7; - *pubkeydata = key; - *pubkeydata_len = key_len; - return 0; + rc = -1; - __alloc_error: - if (dsa != NULL) { - DSA_free(dsa); +#if LIBSSH2_ED25519 + if(strcmp("ssh-ed25519", (const char *)buf) == 0) { + rc = gen_publickey_from_ed25519_openssh_priv_data(session, decrypted, + method, method_len, + pubkeydata, + pubkeydata_len, + NULL); } - if (method_buf != NULL) { - LIBSSH2_FREE(session, method_buf); +#endif +#if LIBSSH2_RSA + if(strcmp("ssh-rsa", (const char *)buf) == 0) { + rc = gen_publickey_from_rsa_openssh_priv_data(session, decrypted, + method, method_len, + pubkeydata, + pubkeydata_len, + NULL); + } +#endif +#if LIBSSH2_DSA + if(strcmp("ssh-dss", (const char *)buf) == 0) { + rc = gen_publickey_from_dsa_openssh_priv_data(session, decrypted, + method, method_len, + pubkeydata, + pubkeydata_len, + NULL); + } +#endif +#if LIBSSH2_ECDSA + { + libssh2_curve_type type; + + if(_libssh2_ecdsa_curve_type_from_name((const char *)buf, + &type) == 0) { + rc = gen_publickey_from_ecdsa_openssh_priv_data(session, type, + decrypted, + method, method_len, + pubkeydata, + pubkeydata_len, + NULL); + } } +#endif - return _libssh2_error(session, - LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for private key data"); + if(decrypted) + _libssh2_string_buf_free(session, decrypted); + + if(rc != 0) { + _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Unsupported OpenSSH key type"); + } + + return rc; } -#endif /* LIBSSH_DSA */ int _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, @@ -1049,6 +2916,7 @@ _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, BIO* bp; EVP_PKEY* pk; int pktype; + int rc; _libssh2_debug(session, LIBSSH2_TRACE_AUTH, @@ -1056,31 +2924,35 @@ _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, privatekey); bp = BIO_new_file(privatekey, "r"); - if (bp == NULL) { + if(bp == NULL) { return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Unable to extract public key from private key " "file: Unable to open private key file"); } - if (!EVP_get_cipherbyname("des")) { - /* If this cipher isn't loaded it's a pretty good indication that none - * are. I have *NO DOUBT* that there's a better way to deal with this - * ($#&%#$(%$#( Someone buy me an OpenSSL manual and I'll read up on - * it. - */ - OpenSSL_add_all_ciphers(); - } + BIO_reset(bp); - pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void*)passphrase); + pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void *)passphrase); BIO_free(bp); - if (pk == NULL) { - return _libssh2_error(session, - LIBSSH2_ERROR_FILE, - "Unable to extract public key " - "from private key file: " - "Wrong passphrase or invalid/unrecognized " - "private key file format"); + if(pk == NULL) { + + /* Try OpenSSH format */ + rc = _libssh2_pub_priv_openssh_keyfile(session, + method, + method_len, + pubkeydata, pubkeydata_len, + privatekey, passphrase); + if(rc != 0) { + return _libssh2_error(session, + LIBSSH2_ERROR_FILE, + "Unable to extract public key " + "from private key file: " + "Wrong passphrase or invalid/unrecognized " + "private key file format"); + } + + return 0; } #ifdef HAVE_OPAQUE_STRUCTS @@ -1089,7 +2961,7 @@ _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, pktype = pk->type; #endif - switch (pktype) { + switch(pktype) { case EVP_PKEY_RSA : st = gen_publickey_from_rsa_evp( session, method, method_len, pubkeydata, pubkeydata_len, pk); @@ -1102,6 +2974,13 @@ _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, break; #endif /* LIBSSH_DSA */ +#if LIBSSH2_ECDSA + case EVP_PKEY_EC : + st = gen_publickey_from_ec_evp( + session, method, method_len, pubkeydata, pubkeydata_len, pk); + break; +#endif + default : st = _libssh2_error(session, LIBSSH2_ERROR_FILE, @@ -1115,6 +2994,129 @@ _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, return st; } +static int +_libssh2_pub_priv_openssh_keyfilememory(LIBSSH2_SESSION *session, + void **key_ctx, + const char *key_type, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + const char *privatekeydata, + size_t privatekeydata_len, + unsigned const char *passphrase) +{ + int rc; + unsigned char *buf = NULL; + struct string_buf *decrypted = NULL; + + if(key_ctx != NULL) + *key_ctx = NULL; + + if(session == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Session is required"); + return -1; + } + + if(key_type != NULL && (strlen(key_type) > 11 || strlen(key_type) < 7)) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "type is invalid"); + return -1; + } + + _libssh2_init_if_needed(); + + rc = _libssh2_openssh_pem_parse_memory(session, passphrase, + privatekeydata, + privatekeydata_len, &decrypted); + + if(rc) { + return rc; + } + + /* We have a new key file, now try and parse it using supported types */ + rc = _libssh2_get_string(decrypted, &buf, NULL); + + if(rc != 0 || buf == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Public key type in decrypted key data not found"); + return -1; + } + + rc = -1; + +#if LIBSSH2_ED25519 + if(strcmp("ssh-ed25519", (const char *)buf) == 0) { + if(key_type == NULL || strcmp("ssh-ed25519", key_type) == 0) { + rc = gen_publickey_from_ed25519_openssh_priv_data(session, + decrypted, + method, + method_len, + pubkeydata, + pubkeydata_len, + (libssh2_ed25519_ctx**)key_ctx); + } + } +#endif +#if LIBSSH2_RSA + if(strcmp("ssh-rsa", (const char *)buf) == 0) { + if(key_type == NULL || strcmp("ssh-rsa", key_type) == 0) { + rc = gen_publickey_from_rsa_openssh_priv_data(session, decrypted, + method, method_len, + pubkeydata, + pubkeydata_len, + (libssh2_rsa_ctx**)key_ctx); + } + } +#endif +#if LIBSSH2_DSA + if(strcmp("ssh-dss", (const char *)buf) == 0) { + if(key_type == NULL || strcmp("ssh-dss", key_type) == 0) { + rc = gen_publickey_from_dsa_openssh_priv_data(session, decrypted, + method, method_len, + pubkeydata, + pubkeydata_len, + (libssh2_dsa_ctx**)key_ctx); + } + } +#endif +#if LIBSSH2_ECDSA +{ + libssh2_curve_type type; + + if(_libssh2_ecdsa_curve_type_from_name((const char *)buf, &type) == 0) { + if(key_type == NULL || strcmp("ssh-ecdsa", key_type) == 0) { + rc = gen_publickey_from_ecdsa_openssh_priv_data(session, type, + decrypted, + method, method_len, + pubkeydata, + pubkeydata_len, + (libssh2_ecdsa_ctx**)key_ctx); + } + } +} +#endif + + if(decrypted) + _libssh2_string_buf_free(session, decrypted); + + return rc; +} + +int +read_openssh_private_key_from_memory(void **key_ctx, LIBSSH2_SESSION *session, + const char *key_type, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase) +{ + return _libssh2_pub_priv_openssh_keyfilememory(session, key_ctx, key_type, + NULL, NULL, NULL, NULL, + filedata, filedata_len, + passphrase); +} + int _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, unsigned char **method, @@ -1135,28 +3137,34 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, "Computing public key from private key."); bp = BIO_new_mem_buf((char *)privatekeydata, privatekeydata_len); - if (!bp) { + if(!bp) { return -1; } - if (!EVP_get_cipherbyname("des")) { - /* If this cipher isn't loaded it's a pretty good indication that none - * are. I have *NO DOUBT* that there's a better way to deal with this - * ($#&%#$(%$#( Someone buy me an OpenSSL manual and I'll read up on - * it. - */ - OpenSSL_add_all_ciphers(); - } + BIO_reset(bp); - pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void*)passphrase); + pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void *)passphrase); BIO_free(bp); - if (pk == NULL) { - return _libssh2_error(session, - LIBSSH2_ERROR_FILE, - "Unable to extract public key " - "from private key file: " - "Wrong passphrase or invalid/unrecognized " - "private key file format"); + if(pk == NULL) { + /* Try OpenSSH format */ + st = _libssh2_pub_priv_openssh_keyfilememory(session, NULL, NULL, + method, + method_len, + pubkeydata, + pubkeydata_len, + privatekeydata, + privatekeydata_len, + (unsigned const char *)passphrase); + if(st != 0) { + return _libssh2_error(session, + LIBSSH2_ERROR_FILE, + "Unable to extract public key " + "from private key file: " + "Wrong passphrase or invalid/unrecognized " + "private key file format"); + } + + return 0; } #ifdef HAVE_OPAQUE_STRUCTS @@ -1165,7 +3173,7 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, pktype = pk->type; #endif - switch (pktype) { + switch(pktype) { case EVP_PKEY_RSA : st = gen_publickey_from_rsa_evp(session, method, method_len, pubkeydata, pubkeydata_len, pk); @@ -1176,6 +3184,12 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, pubkeydata, pubkeydata_len, pk); break; #endif /* LIBSSH_DSA */ +#if LIBSSH2_ECDSA + case EVP_PKEY_EC : + st = gen_publickey_from_ec_evp(session, method, method_len, + pubkeydata, pubkeydata_len, pk); + break; +#endif /* LIBSSH2_ECDSA */ default : st = _libssh2_error(session, LIBSSH2_ERROR_FILE, @@ -1189,4 +3203,38 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, return st; } +void +_libssh2_dh_init(_libssh2_dh_ctx *dhctx) +{ + *dhctx = BN_new(); /* Random from client */ +} + +int +_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order, + _libssh2_bn_ctx *bnctx) +{ + /* Generate x and e */ + BN_rand(*dhctx, group_order * 8 - 1, 0, -1); + BN_mod_exp(public, g, *dhctx, p, bnctx); + return 0; +} + +int +_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p, + _libssh2_bn_ctx *bnctx) +{ + /* Compute the shared secret */ + BN_mod_exp(secret, f, *dhctx, p, bnctx); + return 0; +} + +void +_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) +{ + BN_clear_free(*dhctx); + *dhctx = NULL; +} + #endif /* LIBSSH2_OPENSSL */ diff --git a/vendor/libssh2/src/openssl.h b/vendor/libssh2/src/openssl.h index 3ca71fa8a..15518e0a6 100644 --- a/vendor/libssh2/src/openssl.h +++ b/vendor/libssh2/src/openssl.h @@ -40,7 +40,9 @@ #include #include #include +#ifndef OPENSSL_NO_ENGINE #include +#endif #ifndef OPENSSL_NO_DSA #include #endif @@ -70,6 +72,20 @@ # define LIBSSH2_DSA 1 #endif +#ifdef OPENSSL_NO_ECDSA +# define LIBSSH2_ECDSA 0 +#else +# define LIBSSH2_ECDSA 1 +#endif + +#if OPENSSL_VERSION_NUMBER >= 0x10101000L && \ +!defined(LIBRESSL_VERSION_NUMBER) +# define LIBSSH2_ED25519 1 +#else +# define LIBSSH2_ED25519 0 +#endif + + #ifdef OPENSSL_NO_MD5 # define LIBSSH2_MD5 0 #else @@ -117,6 +133,8 @@ # define LIBSSH2_3DES 1 #endif +#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) + #define _libssh2_random(buf, len) RAND_bytes ((buf), (len)) #define libssh2_prepare_iovec(vec, len) /* Empty. */ @@ -160,13 +178,62 @@ int _libssh2_sha256_init(libssh2_sha256_ctx *ctx); EVP_MD_CTX_free(ctx); \ } while(0) #else -#define libssh2_sha256_update(ctx, data, len) EVP_DigestUpdate(&(ctx), data, len) +#define libssh2_sha256_update(ctx, data, len) \ + EVP_DigestUpdate(&(ctx), data, len) #define libssh2_sha256_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL) #endif int _libssh2_sha256(const unsigned char *message, unsigned long len, unsigned char *out); #define libssh2_sha256(x,y,z) _libssh2_sha256(x,y,z) +#ifdef HAVE_OPAQUE_STRUCTS +#define libssh2_sha384_ctx EVP_MD_CTX * +#else +#define libssh2_sha384_ctx EVP_MD_CTX +#endif + +/* returns 0 in case of failure */ +int _libssh2_sha384_init(libssh2_sha384_ctx *ctx); +#define libssh2_sha384_init(x) _libssh2_sha384_init(x) +#ifdef HAVE_OPAQUE_STRUCTS +#define libssh2_sha384_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len) +#define libssh2_sha384_final(ctx, out) do { \ + EVP_DigestFinal(ctx, out, NULL); \ + EVP_MD_CTX_free(ctx); \ + } while(0) +#else +#define libssh2_sha384_update(ctx, data, len) \ + EVP_DigestUpdate(&(ctx), data, len) +#define libssh2_sha384_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL) +#endif +int _libssh2_sha384(const unsigned char *message, unsigned long len, + unsigned char *out); +#define libssh2_sha384(x,y,z) _libssh2_sha384(x,y,z) + +#ifdef HAVE_OPAQUE_STRUCTS +#define libssh2_sha512_ctx EVP_MD_CTX * +#else +#define libssh2_sha512_ctx EVP_MD_CTX +#endif + +/* returns 0 in case of failure */ +int _libssh2_sha512_init(libssh2_sha512_ctx *ctx); +#define libssh2_sha512_init(x) _libssh2_sha512_init(x) +#ifdef HAVE_OPAQUE_STRUCTS +#define libssh2_sha512_update(ctx, data, len) EVP_DigestUpdate(ctx, data, len) +#define libssh2_sha512_final(ctx, out) do { \ + EVP_DigestFinal(ctx, out, NULL); \ + EVP_MD_CTX_free(ctx); \ + } while(0) +#else +#define libssh2_sha512_update(ctx, data, len) \ + EVP_DigestUpdate(&(ctx), data, len) +#define libssh2_sha512_final(ctx, out) EVP_DigestFinal(&(ctx), out, NULL) +#endif +int _libssh2_sha512(const unsigned char *message, unsigned long len, + unsigned char *out); +#define libssh2_sha512(x,y,z) _libssh2_sha512(x,y,z) + #ifdef HAVE_OPAQUE_STRUCTS #define libssh2_md5_ctx EVP_MD_CTX * #else @@ -226,12 +293,10 @@ int _libssh2_md5_init(libssh2_md5_ctx *ctx); #define libssh2_hmac_cleanup(ctx) HMAC_cleanup(ctx) #endif -#define libssh2_crypto_init() \ - OpenSSL_add_all_algorithms(); \ - ENGINE_load_builtin_engines(); \ - ENGINE_register_all_complete() - -#define libssh2_crypto_exit() +extern void _libssh2_openssl_crypto_init(void); +extern void _libssh2_openssl_crypto_exit(void); +#define libssh2_crypto_init() _libssh2_openssl_crypto_init() +#define libssh2_crypto_exit() _libssh2_openssl_crypto_exit() #define libssh2_rsa_ctx RSA @@ -239,9 +304,46 @@ int _libssh2_md5_init(libssh2_md5_ctx *ctx); #define libssh2_dsa_ctx DSA - #define _libssh2_dsa_free(dsactx) DSA_free(dsactx) +#ifdef LIBSSH2_ECDSA +#define libssh2_ecdsa_ctx EC_KEY +#define _libssh2_ecdsa_free(ecdsactx) EC_KEY_free(ecdsactx) +#define _libssh2_ec_key EC_KEY + +typedef enum { + LIBSSH2_EC_CURVE_NISTP256 = NID_X9_62_prime256v1, + LIBSSH2_EC_CURVE_NISTP384 = NID_secp384r1, + LIBSSH2_EC_CURVE_NISTP521 = NID_secp521r1 +} +libssh2_curve_type; +#else +#define _libssh2_ec_key void +#endif /* LIBSSH2_ECDSA */ + +#ifdef LIBSSH2_ED25519 + +typedef struct { + EVP_PKEY *public_key; + EVP_PKEY *private_key; +} libssh2_curve25519_keys; + +#define libssh2_ed25519_ctx libssh2_curve25519_keys +#define libssh2_x25519_ctx libssh2_curve25519_keys + +#define _libssh2_ed25519_new_ctx() calloc(1, sizeof(libssh2_ed25519_ctx)) +#define _libssh2_ed25519_free(ctx) do { \ + if(ctx) { \ + if(ctx->public_key) EVP_PKEY_free(ctx->public_key); \ + if(ctx->private_key) EVP_PKEY_free(ctx->private_key); \ + free(ctx); \ + } \ +} while(0) + +#define _libssh2_x25519_free(ctx) _libssh2_ed25519_free(ctx) + +#endif /* ED25519 */ + #define _libssh2_cipher_type(name) const EVP_CIPHER *(*name)(void) #ifdef HAVE_OPAQUE_STRUCTS #define _libssh2_cipher_ctx EVP_CIPHER_CTX * @@ -267,7 +369,7 @@ int _libssh2_md5_init(libssh2_md5_ctx *ctx); #define _libssh2_cipher_3des EVP_des_ede3_cbc #ifdef HAVE_OPAQUE_STRUCTS -#define _libssh2_cipher_dtor(ctx) EVP_CIPHER_CTX_reset(*(ctx)) +#define _libssh2_cipher_dtor(ctx) EVP_CIPHER_CTX_free(*(ctx)) #else #define _libssh2_cipher_dtor(ctx) EVP_CIPHER_CTX_cleanup(ctx) #endif @@ -278,8 +380,6 @@ int _libssh2_md5_init(libssh2_md5_ctx *ctx); #define _libssh2_bn_ctx_free(bnctx) BN_CTX_free(bnctx) #define _libssh2_bn_init() BN_new() #define _libssh2_bn_init_from_bin() _libssh2_bn_init() -#define _libssh2_bn_rand(bn, bits, top, bottom) BN_rand(bn, bits, top, bottom) -#define _libssh2_bn_mod_exp(r, a, p, m, ctx) BN_mod_exp(r, a, p, m, ctx) #define _libssh2_bn_set_word(bn, val) BN_set_word(bn, val) #define _libssh2_bn_from_bin(bn, len, val) BN_bin2bn(val, len, bn) #define _libssh2_bn_to_bin(bn, val) BN_bn2bin(bn, val) @@ -287,7 +387,23 @@ int _libssh2_md5_init(libssh2_md5_ctx *ctx); #define _libssh2_bn_bits(bn) BN_num_bits(bn) #define _libssh2_bn_free(bn) BN_clear_free(bn) +#define _libssh2_dh_ctx BIGNUM * +#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx) +#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \ + _libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) +#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \ + _libssh2_dh_secret(dhctx, secret, f, p, bnctx) +#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx) +extern void _libssh2_dh_init(_libssh2_dh_ctx *dhctx); +extern int _libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, + int group_order, + _libssh2_bn_ctx *bnctx); +extern int _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p, + _libssh2_bn_ctx *bnctx); +extern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); + const EVP_CIPHER *_libssh2_EVP_aes_128_ctr(void); const EVP_CIPHER *_libssh2_EVP_aes_192_ctr(void); const EVP_CIPHER *_libssh2_EVP_aes_256_ctr(void); - diff --git a/vendor/libssh2/src/os400qc3.c b/vendor/libssh2/src/os400qc3.c deleted file mode 100644 index f8e46aba9..000000000 --- a/vendor/libssh2/src/os400qc3.c +++ /dev/null @@ -1,2513 +0,0 @@ -/* - * Copyright (C) 2015 Patrick Monnerat, D+H - * 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. - * - * Neither the name of the copyright holder nor the names - * of any other contributors may be used to endorse or - * promote products derived from this software without - * specific prior written permission. - * - * 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. - */ - -#include "libssh2_priv.h" - -#ifdef LIBSSH2_OS400QC3 /* compile only if we build with OS/400 QC3 library */ - -#ifdef HAVE_STDLIB_H -#include -#endif - -#include -#include -#include -#include - -#include - - -#ifdef OS400_DEBUG -/* In debug mode, all system library errors cause an exception. */ -#define set_EC_length(ec, length) ((ec).Bytes_Provided = \ - (ec).Bytes_Available = 0) -#else -#define set_EC_length(ec, length) ((ec).Bytes_Provided = (length)) -#endif - - -/* Ensure va_list operations are not on an array. */ -typedef struct { - va_list list; -} valiststr; - - -typedef int (*loadkeyproc)(LIBSSH2_SESSION *session, - const unsigned char *data, unsigned int datalen, - const unsigned char *passphrase, void *loadkeydata); - -/* Public key extraction data. */ -typedef struct { - const char * method; - const unsigned char * data; - unsigned int length; -} loadpubkeydata; - - -/* Support for ASN.1 elements. */ - -typedef struct { - char * header; /* Pointer to header byte. */ - char * beg; /* Pointer to element data. */ - char * end; /* Pointer to 1st byte after element. */ - unsigned char class; /* ASN.1 element class. */ - unsigned char tag; /* ASN.1 element tag. */ - unsigned char constructed; /* Element is constructed. */ -} asn1Element; - -#define ASN1_INTEGER 2 -#define ASN1_BIT_STRING 3 -#define ASN1_OCTET_STRING 4 -#define ASN1_NULL 5 -#define ASN1_OBJ_ID 6 -#define ASN1_SEQ 16 - -#define ASN1_CONSTRUCTED 0x20 - -/* rsaEncryption OID: 1.2.840.113549.1.1.1 */ -static unsigned char OID_rsaEncryption[] = - {9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 1, 1, 1}; -static int sshrsapubkey(LIBSSH2_SESSION *session, char **sshpubkey, - asn1Element *params, asn1Element *key, - const char *method); - -#if LIBSSH2_DSA != 0 -/* dsaEncryption OID: 1.2.840.10040.4.1 */ -static unsigned char OID_dsaEncryption[] = - {7, 40 + 2, 0x86, 0x48, 0xCE, 0x38, 4, 1}; -static int sshdsapubkey(LIBSSH2_SESSION *session, char **sshpubkey, - asn1Element *params, asn1Element *key, - const char *method); -#endif - - -/* PKCS#5 support. */ - -typedef struct pkcs5params pkcs5params; -struct pkcs5params { - int cipher; /* Encryption cipher. */ - int blocksize; /* Cipher block size. */ - char mode; /* Block encryption mode. */ - char padopt; /* Pad option. */ - char padchar; /* Pad character. */ - int (*kdf)(LIBSSH2_SESSION *session, char **dk, - const unsigned char * passphrase, pkcs5params *pkcs5); - int hash; /* KDF hash algorithm. */ - size_t hashlen; /* KDF hash digest length. */ - char * salt; /* Salt. */ - size_t saltlen; /* Salt length. */ - char * iv; /* Initialization vector. */ - size_t ivlen; /* Initialization vector length. */ - int itercount; /* KDF iteration count. */ - int dklen; /* Derived key length (#bytes). */ - int effkeysize; /* RC2 effective key size (#bits) or 0. */ -}; - -typedef struct pkcs5algo pkcs5algo; -struct pkcs5algo { - const unsigned char * oid; - int (*parse)(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param); - int cipher; /* Encryption cipher. */ - size_t blocksize; /* Cipher block size. */ - char mode; /* Block encryption mode. */ - char padopt; /* Pad option. */ - char padchar; /* Pad character. */ - size_t keylen; /* Key length (#bytes). */ - int hash; /* Hash algorithm. */ - size_t hashlen; /* Hash digest length. */ - size_t saltlen; /* Salt length. */ - size_t ivlen; /* Initialisation vector length. */ - int effkeysize; /* RC2 effective key size (#bits) or 0. */ -}; - -/* id-PBES2 OID: 1.2.840.113549.1.5.13 */ -static const unsigned char OID_id_PBES2[] = { - 9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0D -}; -static int parse_pbes2(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param); -static const pkcs5algo PBES2 = { - OID_id_PBES2, parse_pbes2, 0, 0, '\0', '\0', '\0', 0, - 0, 0, 0, 0, 0 -}; - -/* id-PBKDF2 OID: 1.2.840.113549.1.5.12 */ -static const unsigned char OID_id_PBKDF2[] = { - 9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0C -}; -static int parse_pbkdf2(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param); -static const pkcs5algo PBKDF2 = { - OID_id_PBKDF2, parse_pbkdf2, 0, 0, '\0', '\0', '\0', - SHA_DIGEST_LENGTH, Qc3_SHA1, SHA_DIGEST_LENGTH, 8, 8, 0 -}; - -/* id-hmacWithSHA1 OID: 1.2.840.113549.2.7 */ -static const unsigned char OID_id_hmacWithSHA1[] = { - 8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x07 -}; -static int parse_hmacWithSHA1(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param); -static const pkcs5algo hmacWithSHA1 = { - OID_id_hmacWithSHA1, parse_hmacWithSHA1, 0, 0, '\0', '\0', '\0', - SHA_DIGEST_LENGTH, Qc3_SHA1, SHA_DIGEST_LENGTH, 8, 8, 0 -}; - -/* desCBC OID: 1.3.14.3.2.7 */ -static const unsigned char OID_desCBC[] = {5, 40 + 3, 0x0E, 0x03, 0x02, 0x07}; -static int parse_iv(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param); -static const pkcs5algo desCBC = { - OID_desCBC, parse_iv, Qc3_DES, 8, Qc3_CBC, Qc3_Pad_Counter, - '\0', 8, 0, 0, 8, 8, 0 -}; - -/* des-EDE3-CBC OID: 1.2.840.113549.3.7 */ -static const unsigned char OID_des_EDE3_CBC[] = { - 8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x07 -}; -static const pkcs5algo des_EDE3_CBC = { - OID_des_EDE3_CBC, parse_iv, Qc3_TDES, 8, Qc3_CBC, Qc3_Pad_Counter, - '\0', 24, 0, 0, 8, 8, 0 -}; - -/* rc2CBC OID: 1.2.840.113549.3.2 */ -static const unsigned char OID_rc2CBC[] = { - 8, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x02 -}; -static int parse_rc2(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param); -static const pkcs5algo rc2CBC = { - OID_rc2CBC, parse_rc2, Qc3_RC2, 8, Qc3_CBC, Qc3_Pad_Counter, - '\0', 0, 0, 0, 8, 0, 32 -}; - -/* pbeWithMD5AndDES-CBC OID: 1.2.840.113549.1.5.3 */ -static const unsigned char OID_pbeWithMD5AndDES_CBC[] = { - 9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x03 -}; -static int parse_pbes1(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param); -static const pkcs5algo pbeWithMD5AndDES_CBC = { - OID_pbeWithMD5AndDES_CBC, parse_pbes1, Qc3_DES, 8, Qc3_CBC, - Qc3_Pad_Counter, '\0', 8, Qc3_MD5, MD5_DIGEST_LENGTH, 8, 0, 0 -}; - -/* pbeWithMD5AndRC2-CBC OID: 1.2.840.113549.1.5.6 */ -static const unsigned char OID_pbeWithMD5AndRC2_CBC[] = { - 9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x06 -}; -static const pkcs5algo pbeWithMD5AndRC2_CBC = { - OID_pbeWithMD5AndRC2_CBC, parse_pbes1, Qc3_RC2, 8, Qc3_CBC, - Qc3_Pad_Counter, '\0', 0, Qc3_MD5, MD5_DIGEST_LENGTH, 8, 0, 64 -}; - -/* pbeWithSHA1AndDES-CBC OID: 1.2.840.113549.1.5.10 */ -static const unsigned char OID_pbeWithSHA1AndDES_CBC[] = { - 9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0A -}; -static const pkcs5algo pbeWithSHA1AndDES_CBC = { - OID_pbeWithSHA1AndDES_CBC, parse_pbes1, Qc3_DES, 8, Qc3_CBC, - Qc3_Pad_Counter, '\0', 8, Qc3_SHA1, SHA_DIGEST_LENGTH, 8, 0, 0 -}; - -/* pbeWithSHA1AndRC2-CBC OID: 1.2.840.113549.1.5.11 */ -static const unsigned char OID_pbeWithSHA1AndRC2_CBC[] = { - 9, 40 + 2, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0B -}; -static const pkcs5algo pbeWithSHA1AndRC2_CBC = { - OID_pbeWithSHA1AndRC2_CBC, parse_pbes1, Qc3_RC2, 8, Qc3_CBC, - Qc3_Pad_Counter, '\0', 0, Qc3_SHA1, SHA_DIGEST_LENGTH, 8, 0, 64 -}; - -/* rc5-CBC-PAD OID: 1.2.840.113549.3.9: RC5 not implemented in Qc3. */ -/* pbeWithMD2AndDES-CBC OID: 1.2.840.113549.1.5.1: MD2 not implemented. */ -/* pbeWithMD2AndRC2-CBC OID: 1.2.840.113549.1.5.4: MD2 not implemented. */ - -static const pkcs5algo * pbestable[] = { - &pbeWithMD5AndDES_CBC, - &pbeWithMD5AndRC2_CBC, - &pbeWithSHA1AndDES_CBC, - &pbeWithSHA1AndRC2_CBC, - &PBES2, - NULL -}; - -static const pkcs5algo * pbkdf2table[] = { - &PBKDF2, - NULL -}; - -static const pkcs5algo * pbes2enctable[] = { - &desCBC, - &des_EDE3_CBC, - &rc2CBC, - NULL -}; - -static const pkcs5algo * kdf2prftable[] = { - &hmacWithSHA1, - NULL -}; - - -/* Public key extraction support. */ -static struct { - unsigned char * oid; - int (*sshpubkey)(LIBSSH2_SESSION *session, char **pubkey, - asn1Element *params, asn1Element *key, - const char *method); - const char * method; -} pka[] = { -#if LIBSSH2_RSA != 0 - { OID_rsaEncryption, sshrsapubkey, "ssh-rsa" }, -#endif -#if LIBSSH2_DSA != 0 - { OID_dsaEncryption, sshdsapubkey, "ssh-dss" }, -#endif - { NULL, NULL, NULL } -}; - -/* Define ASCII strings. */ -static const char beginencprivkeyhdr[] = - "-----BEGIN ENCRYPTED PRIVATE KEY-----"; -static const char endencprivkeyhdr[] = "-----END ENCRYPTED PRIVATE KEY-----"; -static const char beginprivkeyhdr[] = "-----BEGIN PRIVATE KEY-----"; -static const char endprivkeyhdr[] = "-----END PRIVATE KEY-----"; -static const char beginrsaprivkeyhdr[] = "-----BEGIN RSA PRIVATE KEY-----"; -static const char endrsaprivkeyhdr[] = "-----END RSA PRIVATE KEY-----"; -static const char fopenrmode[] = "r"; -static const char fopenrbmode[] = "rb"; - - -/* The rest of character literals in this module are in EBCDIC. */ -#pragma convert(37) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static Qc3_Format_KEYD0100_T nulltoken = {""}; - -static int zero = 0; -static int rsaprivate[] = { Qc3_RSA_Private }; -static char anycsp[] = { Qc3_Any_CSP }; -static char binstring[] = { Qc3_Bin_String }; -static char berstring[] = { Qc3_BER_String }; -static char qc3clear[] = { Qc3_Clear }; - -static const Qus_EC_t ecnull = {0}; /* Error causes an exception. */ - -static asn1Element lastbytebitcount = { - (char *) &zero, NULL, (char *) &zero + 1 -}; - - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: ASN.1 support. - * - *******************************************************************/ - -static char * -getASN1Element(asn1Element *elem, char *beg, char *end) -{ - unsigned char b; - unsigned long len; - asn1Element lelem; - - /* Get a single ASN.1 element into `elem', parse ASN.1 string at `beg' - * ending at `end'. - * Returns a pointer in source string after the parsed element, or NULL - * if an error occurs. - */ - - if (beg >= end || !*beg) - return NULL; - - /* Process header byte. */ - elem->header = beg; - b = (unsigned char) *beg++; - elem->constructed = (b & 0x20) != 0; - elem->class = (b >> 6) & 3; - b &= 0x1F; - if (b == 0x1F) - return NULL; /* Long tag values not supported here. */ - elem->tag = b; - - /* Process length. */ - if (beg >= end) - return NULL; - b = (unsigned char) *beg++; - if (!(b & 0x80)) - len = b; - else if (!(b &= 0x7F)) { - /* Unspecified length. Since we have all the data, we can determine the - * effective length by skipping element until an end element is - * found. - */ - if (!elem->constructed) - return NULL; - elem->beg = beg; - while (beg < end && *beg) { - beg = getASN1Element(&lelem, beg, end); - if (!beg) - return NULL; - } - if (beg >= end) - return NULL; - elem->end = beg; - return beg + 1; - } else if (beg + b > end) - return NULL; /* Does not fit in source. */ - else { - /* Get long length. */ - len = 0; - do { - if (len & 0xFF000000L) - return NULL; /* Lengths > 32 bits are not supported. */ - len = (len << 8) | (unsigned char) *beg++; - } while (--b); - } - if ((unsigned long) (end - beg) < len) - return NULL; /* Element data does not fit in source. */ - elem->beg = beg; - elem->end = beg + len; - return elem->end; -} - -static asn1Element * -asn1_new(unsigned int type, unsigned int length) -{ - asn1Element *e; - unsigned int hdrl = 2; - unsigned int i; - unsigned char *buf; - - e = (asn1Element *) malloc(sizeof *e); - - if (e) { - if (length >= 0x80) - for (i = length; i; i >>= 8) - hdrl++; - - buf = (unsigned char *) malloc(hdrl + length); - - if (buf) { - e->header = buf; - e->beg = buf + hdrl; - e->end = e->beg + length; - e->class = (type >> 6) & 0x03; - e->tag = type & 0x1F; - e->constructed = (type >> 5) & 0x01; - e->header[0] = type; - - if (length < 0x80) - e->header[1] = length; - else { - e->header[1] = (hdrl - 2) | 0x80; - do { - e->header[--hdrl] = length; - length >>= 8; - } while (length); - } - } else { - free((char *) e); - e = NULL; - } - } - - return e; -} - -static asn1Element * -asn1_new_from_bytes(const unsigned char *data, unsigned int length) -{ - asn1Element *e; - asn1Element te; - - getASN1Element(&te, - (unsigned char *) data, (unsigned char *) data + length); - e = asn1_new(te.tag, te.end - te.beg); - - if (e) - memcpy(e->header, data, e->end - e->header); - - return e; -} - -static void -asn1delete(asn1Element *e) -{ - if (e) { - if (e->header) - free((char *) e->header); - free((char *) e); - } -} - -static asn1Element * -asn1uint(_libssh2_bn *bn) -{ - asn1Element *e; - int bits; - int length; - unsigned char * p; - - if (!bn) - return NULL; - - bits = _libssh2_bn_bits(bn); - length = (bits + 8) >> 3; - e = asn1_new(ASN1_INTEGER, length); - - if (e) { - p = e->beg; - if (!(bits & 0x07)) - *p++ = 0; - _libssh2_bn_to_bin(bn, p); - } - - return e; -} - -static asn1Element * -asn1containerv(unsigned int type, valiststr args) -{ - valiststr va; - asn1Element *e; - asn1Element *p; - unsigned char *bp; - unsigned int length = 0; - - memcpy((char *) &va, (char *) &args, sizeof args); - while ((p = va_arg(va.list, asn1Element *))) - length += p->end - p->header; - va_end(va.list); - e = asn1_new(type, length); - if (e) { - bp = e->beg; - while ((p = va_arg(args.list, asn1Element *))) { - memcpy(bp, p->header, p->end - p->header); - bp += p->end - p->header; - } - } - return e; -} - -/* VARARGS1 */ -static asn1Element * -asn1container(unsigned int type, ...) -{ - valiststr va; - asn1Element *e; - - va_start(va.list, type); - e = asn1containerv(type, va); - va_end(va.list); - return e; -} - -static asn1Element * -asn1bytes(unsigned int type, const unsigned char *bytes, unsigned int length) -{ - asn1Element *e; - - e = asn1_new(type, length); - if (e && length) - memcpy(e->beg, bytes, length); - return e; -} - -static asn1Element * -rsapublickey(_libssh2_bn *e, _libssh2_bn *m) -{ - asn1Element *publicexponent; - asn1Element *modulus; - asn1Element *rsapubkey; - - /* Build a PKCS#1 RSAPublicKey. */ - - modulus = asn1uint(m); - publicexponent = asn1uint(e); - rsapubkey = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, - modulus, publicexponent, NULL); - asn1delete(modulus); - asn1delete(publicexponent); - - if (!modulus || !publicexponent) { - asn1delete(rsapubkey); - rsapubkey = NULL; - } - - return rsapubkey; -} - -static asn1Element * -rsaprivatekey(_libssh2_bn *e, _libssh2_bn *m, _libssh2_bn *d, - _libssh2_bn *p, _libssh2_bn *q, - _libssh2_bn *exp1, _libssh2_bn *exp2, _libssh2_bn *coeff) -{ - asn1Element *version; - asn1Element *modulus; - asn1Element *publicexponent; - asn1Element *privateexponent; - asn1Element *prime1; - asn1Element *prime2; - asn1Element *exponent1; - asn1Element *exponent2; - asn1Element *coefficient; - asn1Element *rsaprivkey; - - /* Build a PKCS#1 RSAPrivateKey. */ - version = asn1bytes(ASN1_INTEGER, "\0", 1); - modulus = asn1uint(m); - publicexponent = asn1uint(e); - privateexponent = asn1uint(d); - prime1 = asn1uint(p); - prime2 = asn1uint(q); - exponent1 = asn1uint(exp1); - exponent2 = asn1uint(exp2); - coefficient = asn1uint(coeff); - rsaprivkey = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, version, modulus, - publicexponent, privateexponent, prime1, prime2, - exponent1, exponent2, coefficient, NULL); - asn1delete(version); - asn1delete(modulus); - asn1delete(publicexponent); - asn1delete(privateexponent); - asn1delete(prime1); - asn1delete(prime2); - asn1delete(exponent1); - asn1delete(exponent2); - asn1delete(coefficient); - - if (!version || !modulus || !publicexponent || !privateexponent || - !prime1 || !prime2 || !exponent1 || !exponent2 || !coefficient) { - asn1delete(rsaprivkey); - rsaprivkey = NULL; - } - - return rsaprivkey; -} - -static asn1Element * -subjectpublickeyinfo(asn1Element *pubkey, const unsigned char *algo, - asn1Element *parameters) -{ - asn1Element *subjpubkey; - asn1Element *algorithm; - asn1Element *algorithmid; - asn1Element *subjpubkeyinfo; - unsigned int algosize = *algo++; - - algorithm = asn1bytes(ASN1_OBJ_ID, algo, algosize); - algorithmid = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, - algorithm, parameters, NULL); - subjpubkey = asn1container(ASN1_BIT_STRING, &lastbytebitcount, - pubkey, NULL); - subjpubkeyinfo = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, - algorithmid, subjpubkey, NULL); - asn1delete(algorithm); - asn1delete(algorithmid); - asn1delete(subjpubkey); - if (!algorithm || !algorithmid || !subjpubkey) { - asn1delete(subjpubkeyinfo); - subjpubkeyinfo = NULL; - } - return subjpubkeyinfo; -} - -static asn1Element * -rsasubjectpublickeyinfo(asn1Element *pubkey) -{ - asn1Element *parameters; - asn1Element *subjpubkeyinfo; - - parameters = asn1bytes(ASN1_NULL, NULL, 0); - subjpubkeyinfo = subjectpublickeyinfo(pubkey, - OID_rsaEncryption, parameters); - asn1delete(parameters); - if (!parameters) { - asn1delete(subjpubkeyinfo); - subjpubkeyinfo = NULL; - } - return subjpubkeyinfo; -} - -static asn1Element * -privatekeyinfo(asn1Element *privkey, const unsigned char *algo, - asn1Element *parameters) -{ - asn1Element *version; - asn1Element *privatekey; - asn1Element *algorithm; - asn1Element *privatekeyalgorithm; - asn1Element *privkeyinfo; - unsigned int algosize = *algo++; - - /* Build a PKCS#8 PrivateKeyInfo. */ - version = asn1bytes(ASN1_INTEGER, "\0", 1); - algorithm = asn1bytes(ASN1_OBJ_ID, algo, algosize); - privatekeyalgorithm = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, - algorithm, parameters, NULL); - privatekey = asn1container(ASN1_OCTET_STRING, privkey, NULL); - privkeyinfo = asn1container(ASN1_SEQ | ASN1_CONSTRUCTED, version, - privatekeyalgorithm, privatekey, NULL); - asn1delete(version); - asn1delete(algorithm); - asn1delete(privatekeyalgorithm); - if (!version || !algorithm || !privatekeyalgorithm) { - asn1delete(privkeyinfo); - privkeyinfo = NULL; - } - return privkeyinfo; -} - -static asn1Element * -rsaprivatekeyinfo(asn1Element *privkey) -{ - asn1Element *parameters; - asn1Element *privkeyinfo; - - parameters = asn1bytes(ASN1_NULL, NULL, 0); - privkeyinfo = privatekeyinfo(privkey, OID_rsaEncryption, parameters); - asn1delete(parameters); - if (!parameters) { - asn1delete(privkeyinfo); - privkeyinfo = NULL; - } - return privkeyinfo; -} - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: big numbers support. - * - *******************************************************************/ - - -_libssh2_bn * -_libssh2_bn_init(void) -{ - _libssh2_bn *bignum; - - bignum = (_libssh2_bn *) malloc(sizeof *bignum); - if (bignum) { - bignum->bignum = NULL; - bignum->length = 0; - } - - return bignum; -} - -void -_libssh2_bn_free(_libssh2_bn *bn) -{ - if (bn) { - if (bn->bignum) { -#ifdef LIBSSH2_CLEAR_MEMORY - if (bn->length) - memset((char *) bn->bignum, 0, bn->length); -#endif - free(bn->bignum); - } - - free((char *) bn); - } -} - -static int -_libssh2_bn_resize(_libssh2_bn *bn, size_t newlen) -{ - unsigned char *bignum; - - if (!bn) - return -1; - if (newlen == bn->length) - return 0; - - if (!bn->bignum) - bignum = (unsigned char *) malloc(newlen); - else { -#ifdef LIBSSH2_CLEAR_MEMORY - if (newlen < bn->length) - memset((char *) bn->bignum + newlen, 0, bn->length - newlen); -#endif - if (!newlen) { - free((char *) bn->bignum); - bn->bignum = NULL; - bn->length = 0; - return 0; - } - bignum = (unsigned char *) realloc((char *) bn->bignum, newlen); - } - - if (!bignum) - return -1; - - if (newlen > bn->length) - memset((char *) bignum + bn->length, 0, newlen - bn->length); - - bn->bignum = bignum; - bn->length = newlen; - return 0; -} - -unsigned long -_libssh2_bn_bits(_libssh2_bn *bn) -{ - unsigned int i; - unsigned char b; - - if (bn && bn->bignum) { - for (i = bn->length; i--;) - if ((b = bn->bignum[i])) { - i *= 8; - do { - i++; - } while (b >>= 1); - return i; - } - } - - return 0; -} - -int -_libssh2_bn_from_bin(_libssh2_bn *bn, int len, const unsigned char *val) -{ - int i; - - if (!bn || (len && !val)) - return -1; - - for (; len && !*val; len--) - val++; - - if (_libssh2_bn_resize(bn, len)) - return -1; - - for (i = len; i--;) - bn->bignum[i] = *val++; - - return 0; -} - -int -_libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val) -{ - val = htonl(val); - return _libssh2_bn_from_bin(bn, sizeof val, (unsigned char *) &val); -} - -int -_libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val) -{ - int i; - - if (!bn || !val) - return -1; - - for (i = bn->length; i--;) - *val++ = bn->bignum[i]; - - return 0; -} - -static int -_libssh2_bn_from_bn(_libssh2_bn *to, _libssh2_bn *from) -{ - int i; - - if (!to || !from) - return -1; - - if (_libssh2_bn_resize(to, from->length)) - return -1; - - for (i = to->length; i--;) - to->bignum[i] = from->bignum[i]; - - return 0; -} - -void -_libssh2_random(unsigned char *buf, int len) -{ - Qc3GenPRNs(buf, len, - Qc3PRN_TYPE_NORMAL, Qc3PRN_NO_PARITY, (char *) &ecnull); -} - -int -_libssh2_bn_rand(_libssh2_bn *bn, int bits, int top, int bottom) -{ - int len; - int i; - - if (!bn || bits <= 0) - return -1; - len = (bits + 7) >> 3; - if (_libssh2_bn_resize(bn, len)) - return -1; - _libssh2_random(bn->bignum, len); - i = ((bits - 1) & 07) + 1; - bn->bignum[len - 1] &= (1 << i) - 1; - switch (top) { - case 1: - if (bits > 1) - if (i > 1) - bn->bignum[len - 1] |= 1 << (i - 2); - else - bn->bignum[len - 2] |= 0x80; - /* Fall into. */ - case 0: - bn->bignum[len - 1] |= 1 << (i - 1); - break; - } - if (bottom) - *bn->bignum |= 0x01; - return 0; -} - -static int -_libssh2_bn_lshift(_libssh2_bn *bn) -{ - int i; - int c = 0; - - if (!bn) - return -1; - - if (_libssh2_bn_resize(bn, (_libssh2_bn_bits(bn) + 8) >> 3)) - return -1; - - for (i = 0; i < bn->length; i++) { - if (bn->bignum[i] & 0x80) - c |= 0x02; - bn->bignum[i] = (bn->bignum[i] << 1) | (c & 0x01); - c >>= 1; - } - - return 0; -} - -static int -_libssh2_bn_rshift(_libssh2_bn *bn) -{ - int i; - int c = 0; - - if (!bn) - return -1; - - for (i = bn->length; i--;) { - if (bn->bignum[i] & 0x01) - c |= 0x100; - bn->bignum[i] = (bn->bignum[i] >> 1) | (c & 0x80); - c >>= 1; - } - - if (_libssh2_bn_resize(bn, (_libssh2_bn_bits(bn) + 7) >> 3)) - return -1; - - return 0; -} - -static void -_libssh2_bn_swap(_libssh2_bn *bn1, _libssh2_bn *bn2) -{ - _libssh2_bn t = *bn1; - - *bn1 = *bn2; - *bn2 = t; -} - -static int -_libssh2_bn_subtract(_libssh2_bn *d, _libssh2_bn *bn1, _libssh2_bn *bn2) -{ - int c = 0; - int i; - - if (bn1->length < bn2->length) - return -1; - - if (_libssh2_bn_resize(d, bn1->length)) - return -1; - - for (i = 0; i < bn2->length; i++) { - c += (int) bn1->bignum[i] - (int) bn2->bignum[i]; - d->bignum[i] = c; - c = c < 0? -1: 0; - } - - for (; c && i < bn1->length; i++) { - c += (int) bn1->bignum[i]; - d->bignum[i] = c; - c = c < 0? -1: 0; - } - - if (_libssh2_bn_resize(d, (_libssh2_bn_bits(d) + 7) >> 3)) - return -1; - - return c; -} - -int -_libssh2_os400qc3_bn_mod_exp(_libssh2_bn *r, _libssh2_bn *a, _libssh2_bn *p, - _libssh2_bn *m) -{ - _libssh2_bn *mp; - _libssh2_bn *rp; - asn1Element *rsapubkey; - asn1Element *subjpubkeyinfo; - unsigned char *av; - unsigned char *rv; - char *keydbuf; - Qc3_Format_ALGD0400_T algd; - Qc3_Format_KEYD0200_T *keyd; - Qus_EC_t errcode; - int sc; - int outlen; - int ret = -1; - - /* There is no support for this function in the Qc3 crypto-library. - Since a RSA encryption performs this function, we can emulate it - by creating an RSA public key in ASN.1 SubjectPublicKeyInfo format - from p (exponent) and m (modulus) and encrypt a with this key. The - encryption output is the function result. - Problem: the Qc3EncryptData procedure only succeeds if the data bit - count is less than the modulus bit count. To satisfy this condition, - we multiply the modulus by a power of two and adjust the result - accordingly. */ - - if (!r || !a || !p) - return ret; - - mp = _libssh2_bn_init(); - if (!mp) - return ret; - if (_libssh2_bn_from_bn(mp, m)) { - _libssh2_bn_free(mp); - return ret; - } - for (sc = 0; _libssh2_bn_bits(mp) <= 8 * a->length; sc++) - if (_libssh2_bn_lshift(mp)) { - _libssh2_bn_free(mp); - return ret; - } - - rsapubkey = rsapublickey(p, mp); - subjpubkeyinfo = rsasubjectpublickeyinfo(rsapubkey); - asn1delete(rsapubkey); - - if (!rsapubkey || !subjpubkeyinfo) { - asn1delete(rsapubkey); - asn1delete(subjpubkeyinfo); - _libssh2_bn_free(mp); - return ret; - } - - av = (unsigned char *) alloca(a->length); - rv = (unsigned char *) alloca(mp->length); - keydbuf = alloca(sizeof *keyd + - subjpubkeyinfo->end - subjpubkeyinfo->header); - - if (av && rv && keydbuf) { - _libssh2_bn_to_bin(a, av); - algd.Public_Key_Alg = Qc3_RSA; - algd.PKA_Block_Format = Qc3_Zero_Pad; - memset(algd.Reserved, 0, sizeof algd.Reserved); - algd.Signing_Hash_Alg = 0; - keyd = (Qc3_Format_KEYD0200_T *) keydbuf; - keyd->Key_Type = Qc3_RSA_Public; - keyd->Key_String_Len = subjpubkeyinfo->end - subjpubkeyinfo->header; - keyd->Key_Format = Qc3_BER_String; - memset(keyd->Reserved, 0, sizeof keyd->Reserved); - memcpy(keydbuf + sizeof *keyd, subjpubkeyinfo->header, - keyd->Key_String_Len); - set_EC_length(errcode, sizeof errcode); - Qc3EncryptData(av, (int *) &a->length, Qc3_Data, (char *) &algd, - Qc3_Alg_Public_Key, keydbuf, Qc3_Key_Parms, anycsp, - NULL, rv, (int *) &mp->length, &outlen, &errcode); - if (!errcode.Bytes_Available) { - _libssh2_bn_from_bin(r, outlen, rv); - if (!sc) - ret = 0; - else { - rp = _libssh2_bn_init(); - if (rp) { - do { - _libssh2_bn_rshift(mp); - if (!_libssh2_bn_subtract(rp, r, mp)) - _libssh2_bn_swap(r, rp); - } while (--sc); - _libssh2_bn_free(rp); - ret = 0; - } - } - } - } - asn1delete(subjpubkeyinfo); - _libssh2_bn_free(mp); - return ret; -} - - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: crypto context support. - * - *******************************************************************/ - -static _libssh2_os400qc3_crypto_ctx * -libssh2_init_crypto_ctx(_libssh2_os400qc3_crypto_ctx *ctx) -{ - if (!ctx) - ctx = (_libssh2_os400qc3_crypto_ctx *) malloc(sizeof *ctx); - - if (ctx) { - memset((char *) ctx, 0, sizeof *ctx); - ctx->hash.Final_Op_Flag = Qc3_Continue; - } - - return ctx; -} - -static int -null_token(const char *token) -{ - return !memcmp(token, nulltoken.Key_Context_Token, - sizeof nulltoken.Key_Context_Token); -} - -void -_libssh2_os400qc3_crypto_dtor(_libssh2_os400qc3_crypto_ctx *x) -{ - if (!x) - return; - if (!null_token(x->hash.Alg_Context_Token)) { - Qc3DestroyAlgorithmContext(x->hash.Alg_Context_Token, (char *) &ecnull); - memset(x->hash.Alg_Context_Token, 0, sizeof x->hash.Alg_Context_Token); - } - if (!null_token(x->key.Key_Context_Token)) { - Qc3DestroyKeyContext(x->key.Key_Context_Token, (char *) &ecnull); - memset(x->key.Key_Context_Token, 0, sizeof x->key.Key_Context_Token); - } - if (x->kek) { - _libssh2_os400qc3_crypto_dtor(x->kek); - free((char *) x->kek); - x->kek = NULL; - } -} - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: hash algorithms support. - * - *******************************************************************/ - -int -libssh2_os400qc3_hash_init(Qc3_Format_ALGD0100_T *x, unsigned int algorithm) -{ - Qc3_Format_ALGD0500_T algd; - Qus_EC_t errcode; - - if (!x) - return 0; - - memset((char *) x, 0, sizeof *x); - x->Final_Op_Flag = Qc3_Continue; - algd.Hash_Alg = algorithm; - set_EC_length(errcode, sizeof errcode); - Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Hash, - x->Alg_Context_Token, &errcode); - return errcode.Bytes_Available? 0: 1; -} - -void -libssh2_os400qc3_hash_update(Qc3_Format_ALGD0100_T *ctx, - unsigned char *data, int len) -{ - char dummy[64]; - - ctx->Final_Op_Flag = Qc3_Continue; - Qc3CalculateHash((char *) data, &len, Qc3_Data, (char *) ctx, - Qc3_Alg_Token, anycsp, NULL, dummy, (char *) &ecnull); -} - -void -libssh2_os400qc3_hash_final(Qc3_Format_ALGD0100_T *ctx, unsigned char *out) -{ - char data; - - ctx->Final_Op_Flag = Qc3_Final; - Qc3CalculateHash(&data, &zero, Qc3_Data, (char *) ctx, Qc3_Alg_Token, - anycsp, NULL, (char *) out, (char *) &ecnull); - Qc3DestroyAlgorithmContext(ctx->Alg_Context_Token, (char *) &ecnull); - memset(ctx->Alg_Context_Token, 0, sizeof ctx->Alg_Context_Token); -} - -int -libssh2_os400qc3_hash(const unsigned char *message, unsigned long len, - unsigned char *out, unsigned int algo) -{ - Qc3_Format_ALGD0100_T ctx; - - if (!libssh2_os400qc3_hash_init(&ctx, algo)) - return 1; - - libssh2_os400qc3_hash_update(&ctx, (unsigned char *) message, len); - libssh2_os400qc3_hash_final(&ctx, out); - return 0; -} - -void -libssh2_os400qc3_hmac_init(_libssh2_os400qc3_crypto_ctx *ctx, - int algo, size_t minkeylen, void *key, int keylen) -{ - if (keylen < minkeylen) { - char *lkey = alloca(minkeylen); - - /* Pad key with zeroes if too short. */ - if (!lkey) - return; - memcpy(lkey, (char *) key, keylen); - memset(lkey + keylen, 0, minkeylen - keylen); - key = (void *) lkey; - keylen = minkeylen; - } - libssh2_os400qc3_hash_init(&ctx->hash, algo); - Qc3CreateKeyContext((char *) key, &keylen, binstring, &algo, qc3clear, - NULL, NULL, ctx->key.Key_Context_Token, - (char *) &ecnull); -} - -void -libssh2_os400qc3_hmac_update(_libssh2_os400qc3_crypto_ctx *ctx, - unsigned char *data, int len) -{ - char dummy[64]; - - ctx->hash.Final_Op_Flag = Qc3_Continue; - Qc3CalculateHMAC((char *) data, &len, Qc3_Data, (char *) &ctx->hash, - Qc3_Alg_Token, ctx->key.Key_Context_Token, Qc3_Key_Token, - anycsp, NULL, dummy, (char *) &ecnull); -} - -void -libssh2_os400qc3_hmac_final(_libssh2_os400qc3_crypto_ctx *ctx, - unsigned char *out) -{ - char data; - - ctx->hash.Final_Op_Flag = Qc3_Final; - Qc3CalculateHMAC((char *) data, &zero, Qc3_Data, (char *) &ctx->hash, - Qc3_Alg_Token, ctx->key.Key_Context_Token, Qc3_Key_Token, - anycsp, NULL, (char *) out, (char *) &ecnull); -} - - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: cipher algorithms support. - * - *******************************************************************/ - -int -_libssh2_cipher_init(_libssh2_cipher_ctx *h, _libssh2_cipher_type(algo), - unsigned char *iv, unsigned char *secret, int encrypt) -{ - Qc3_Format_ALGD0200_T algd; - Qus_EC_t errcode; - - (void) encrypt; - - if (!h) - return -1; - - libssh2_init_crypto_ctx(h); - algd.Block_Cipher_Alg = algo.algo; - algd.Block_Length = algo.size; - algd.Mode = algo.mode; - algd.Pad_Option = Qc3_No_Pad; - algd.Pad_Character = 0; - algd.Reserved = 0; - algd.MAC_Length = 0; - algd.Effective_Key_Size = 0; - memset(algd.Init_Vector, 0 , sizeof algd.Init_Vector); - if (algo.mode != Qc3_ECB && algo.size) - memcpy(algd.Init_Vector, iv, algo.size); - set_EC_length(errcode, sizeof errcode); - Qc3CreateAlgorithmContext((char *) &algd, algo.fmt, - h->hash.Alg_Context_Token, &errcode); - if (errcode.Bytes_Available) - return -1; - Qc3CreateKeyContext((char *) secret, &algo.keylen, binstring, - &algo.algo, qc3clear, NULL, NULL, - h->key.Key_Context_Token, (char *) &errcode); - if (errcode.Bytes_Available) { - _libssh2_os400qc3_crypto_dtor(h); - return -1; - } - - return 0; -} - -int -_libssh2_cipher_crypt(_libssh2_cipher_ctx *ctx, - _libssh2_cipher_type(algo), - int encrypt, unsigned char *block, size_t blocksize) -{ - Qus_EC_t errcode; - int outlen; - int blksize = blocksize; - - (void) algo; - - set_EC_length(errcode, sizeof errcode); - if (encrypt) - Qc3EncryptData((char *) block, &blksize, Qc3_Data, - ctx->hash.Alg_Context_Token, Qc3_Alg_Token, - ctx->key.Key_Context_Token, Qc3_Key_Token, anycsp, NULL, - (char *) block, &blksize, &outlen, (char *) &errcode); - else - Qc3DecryptData((char *) block, &blksize, - ctx->hash.Alg_Context_Token, Qc3_Alg_Token, - ctx->key.Key_Context_Token, Qc3_Key_Token, anycsp, NULL, - (char *) block, &blksize, &outlen, (char *) &errcode); - - return errcode.Bytes_Available? -1: 0; -} - - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: RSA support. - * - *******************************************************************/ - -int -_libssh2_rsa_new(libssh2_rsa_ctx **rsa, - const unsigned char *edata, unsigned long elen, - const unsigned char *ndata, unsigned long nlen, - const unsigned char *ddata, unsigned long dlen, - const unsigned char *pdata, unsigned long plen, - const unsigned char *qdata, unsigned long qlen, - const unsigned char *e1data, unsigned long e1len, - const unsigned char *e2data, unsigned long e2len, - const unsigned char *coeffdata, unsigned long coefflen) -{ - libssh2_rsa_ctx *ctx; - _libssh2_bn *e = _libssh2_bn_init_from_bin(); - _libssh2_bn *n = _libssh2_bn_init_from_bin(); - _libssh2_bn *d = NULL; - _libssh2_bn *p = NULL; - _libssh2_bn *q = NULL; - _libssh2_bn *e1 = NULL; - _libssh2_bn *e2 = NULL; - _libssh2_bn *coeff = NULL; - asn1Element *key = NULL; - asn1Element *structkey = NULL; - Qc3_Format_ALGD0400_T algd; - Qus_EC_t errcode; - int keytype; - int ret = 0; - int i; - - ctx = libssh2_init_crypto_ctx(NULL); - if (!ctx) - ret = -1; - if (!ret) { - _libssh2_bn_from_bin(e, elen, edata); - _libssh2_bn_from_bin(n, nlen, ndata); - if (!e || !n) - ret = -1; - } - if (!ret && ddata) { - /* Private key. */ - d = _libssh2_bn_init_from_bin(); - _libssh2_bn_from_bin(d, dlen, ddata); - p = _libssh2_bn_init_from_bin(); - _libssh2_bn_from_bin(p, plen, pdata); - q = _libssh2_bn_init_from_bin(); - _libssh2_bn_from_bin(q, qlen, qdata); - e1 = _libssh2_bn_init_from_bin(); - _libssh2_bn_from_bin(e1, e1len, e1data); - e2 = _libssh2_bn_init_from_bin(); - _libssh2_bn_from_bin(e2, e2len, e2data); - coeff = _libssh2_bn_init_from_bin(); - _libssh2_bn_from_bin(coeff, coefflen, coeffdata); - if (!d || !p || !q ||!e1 || !e2 || !coeff) - ret = -1; - - if (!ret) { - /* Build a PKCS#8 private key. */ - key = rsaprivatekey(e, n, d, p, q, e1, e2, coeff); - structkey = rsaprivatekeyinfo(key); - } - keytype = Qc3_RSA_Private; - } else if (!ret) { - key = rsapublickey(e, n); - structkey = rsasubjectpublickeyinfo(key); - keytype = Qc3_RSA_Public; - } - if (!key || !structkey) - ret = -1; - - set_EC_length(errcode, sizeof errcode); - - if (!ret) { - /* Create the algorithm context. */ - algd.Public_Key_Alg = Qc3_RSA; - algd.PKA_Block_Format = Qc3_PKCS1_01; - memset(algd.Reserved, 0, sizeof algd.Reserved); - algd.Signing_Hash_Alg = Qc3_SHA1; - Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key, - ctx->hash.Alg_Context_Token, &errcode); - if (errcode.Bytes_Available) - ret = -1; - ctx->hash.Final_Op_Flag = Qc3_Continue; - } - - /* Create the key context. */ - if (!ret) { - i = structkey->end - structkey->header; - Qc3CreateKeyContext(structkey->header, &i, berstring, &keytype, - qc3clear, NULL, NULL, ctx->key.Key_Context_Token, - (char *) &errcode); - if (errcode.Bytes_Available) - ret = -1; - } - - _libssh2_bn_free(e); - _libssh2_bn_free(n); - _libssh2_bn_free(d); - _libssh2_bn_free(p); - _libssh2_bn_free(q); - _libssh2_bn_free(e1); - _libssh2_bn_free(e2); - _libssh2_bn_free(coeff); - asn1delete(key); - asn1delete(structkey); - if (ret && ctx) { - _libssh2_rsa_free(ctx); - ctx = NULL; - } - *rsa = ctx; - return ret; -} - - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: PKCS#5 supplement. - * - *******************************************************************/ - -static int -oidcmp(const asn1Element *e, const unsigned char *oid) -{ - int i = e->end - e->beg - *oid++; - - if (*e->header != ASN1_OBJ_ID) - return -2; - if (!i) - i = memcmp(e->beg, oid, oid[-1]); - return i; -} - -static int -asn1getword(asn1Element *e, unsigned long *v) -{ - unsigned long a; - const unsigned char *cp; - - if (*e->header != ASN1_INTEGER) - return -1; - for (cp = e->beg; cp < e->end && !*cp; cp++) - ; - if (e->end - cp > sizeof a) - return -1; - for (a = 0; cp < e->end; cp++) - a = (a << 8) | *cp; - *v = a; - return 0; -} - -static int -pbkdf1(LIBSSH2_SESSION *session, char **dk, const unsigned char * passphrase, - pkcs5params *pkcs5) -{ - int i; - Qc3_Format_ALGD0100_T hctx; - int len = pkcs5->saltlen; - char *data = (char *) pkcs5->salt; - - *dk = NULL; - if (pkcs5->dklen > pkcs5->hashlen) - return -1; - - /* Allocate the derived key buffer. */ - if (!(*dk = LIBSSH2_ALLOC(session, pkcs5->hashlen))) - return -1; - - /* Initial hash. */ - libssh2_os400qc3_hash_init(&hctx, pkcs5->hash); - libssh2_os400qc3_hash_update(&hctx, (unsigned char *) passphrase, - strlen(passphrase)); - hctx.Final_Op_Flag = Qc3_Final; - Qc3CalculateHash((char *) pkcs5->salt, &len, Qc3_Data, (char *) &hctx, - Qc3_Alg_Token, anycsp, NULL, *dk, (char *) &ecnull); - - /* Iterate. */ - len = pkcs5->hashlen; - for (i = 1; i < pkcs5->itercount; i++) - Qc3CalculateHash((char *) *dk, &len, Qc3_Data, (char *) &hctx, - Qc3_Alg_Token, anycsp, NULL, *dk, (char *) &ecnull); - - /* Special stuff for PBES1: split derived key into 8-byte key and 8-byte - initialization vector. */ - pkcs5->dklen = 8; - pkcs5->ivlen = 8; - pkcs5->iv = *dk + 8; - - /* Clean-up and exit. */ - Qc3DestroyAlgorithmContext(hctx.Alg_Context_Token, (char *) &ecnull); - return 0; -} - -static int -pbkdf2(LIBSSH2_SESSION *session, char **dk, const unsigned char * passphrase, - pkcs5params *pkcs5) -{ - size_t i; - size_t k; - int j; - int l; - uint32_t ni; - unsigned long long t; - char *mac; - char *buf; - _libssh2_os400qc3_crypto_ctx hctx; - - *dk = NULL; - t = ((unsigned long long) pkcs5->dklen + pkcs5->hashlen - 1) / - pkcs5->hashlen; - if (t > 0xFFFFFFFF) - return -1; - mac = alloca(pkcs5->hashlen); - if (!mac) - return -1; - - /* Allocate the derived key buffer. */ - l = t; - if (!(buf = LIBSSH2_ALLOC(session, l * pkcs5->hashlen))) - return -1; - *dk = buf; - - /* Create an HMAC context for our computations. */ - libssh2_os400qc3_hmac_init(&hctx, pkcs5->hash, pkcs5->hashlen, - (void *) passphrase, strlen(passphrase)); - - /* Process each hLen-size blocks. */ - for (i = 1; i <= l; i++) { - ni = htonl(i); - libssh2_os400qc3_hmac_update(&hctx, pkcs5->salt, pkcs5->saltlen); - libssh2_os400qc3_hmac_update(&hctx, (char *) &ni, sizeof ni); - libssh2_os400qc3_hmac_final(&hctx, mac); - memcpy(buf, mac, pkcs5->hashlen); - for (j = 1; j < pkcs5->itercount; j++) { - libssh2_os400qc3_hmac_update(&hctx, mac, pkcs5->hashlen); - libssh2_os400qc3_hmac_final(&hctx, mac); - for (k = 0; k < pkcs5->hashlen; k++) - buf[k] ^= mac[k]; - } - buf += pkcs5->hashlen; - } - - /* Computation done. Release HMAC context. */ - _libssh2_os400qc3_crypto_dtor(&hctx); - return 0; -} - -static int -parse_pkcs5_algorithm(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - asn1Element *algid, pkcs5algo **algotable) -{ - asn1Element oid; - asn1Element param; - char *cp; - - cp = getASN1Element(&oid, algid->beg, algid->end); - if (!cp || *oid.header != ASN1_OBJ_ID) - return -1; - param.header = NULL; - if (cp < algid->end) - cp = getASN1Element(¶m, cp, algid->end); - if (cp != algid->end) - return -1; - for (; *algotable; algotable++) - if (!oidcmp(&oid, (*algotable)->oid)) - return (*(*algotable)->parse)(session, pkcs5, *algotable, - param.header? ¶m: NULL); - return -1; -} - -static int -parse_pbes2(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param) -{ - asn1Element keyDerivationFunc; - asn1Element encryptionScheme; - char *cp; - - if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - cp = getASN1Element(&keyDerivationFunc, param->beg, param->end); - if (!cp || *keyDerivationFunc.header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - if (getASN1Element(&encryptionScheme, cp, param->end) != param->end || - *encryptionScheme.header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - if (parse_pkcs5_algorithm(session, pkcs5, &encryptionScheme, pbes2enctable)) - return -1; - if (parse_pkcs5_algorithm(session, pkcs5, &keyDerivationFunc, pbkdf2table)) - return -1; - return 0; -} - -static int -parse_pbkdf2(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param) -{ - asn1Element salt; - asn1Element iterationCount; - asn1Element keyLength; - asn1Element prf; - unsigned long itercount; - char *cp; - - if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - cp = getASN1Element(&salt, param->beg, param->end); - /* otherSource not supported. */ - if (!cp || *salt.header != ASN1_OCTET_STRING) - return -1; - cp = getASN1Element(&iterationCount, cp, param->end); - if (!cp || *iterationCount.header != ASN1_INTEGER) - return -1; - keyLength.header = prf.header = NULL; - if (cp < param->end) { - cp = getASN1Element(&prf, cp, param->end); - if (!cp) - return -1; - if (*prf.header == ASN1_INTEGER) { - keyLength = prf; - prf.header = NULL; - if (cp < param->end) - cp = getASN1Element(&prf, cp, param->end); - } - if (cp != param->end) - return -1; - } - pkcs5->hash = algo->hash; - pkcs5->hashlen = algo->hashlen; - if (prf.header) { - if (*prf.header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - if (parse_pkcs5_algorithm(session, pkcs5, &prf, kdf2prftable)) - return -1; - } - pkcs5->saltlen = salt.end - salt.beg; - pkcs5->salt = salt.beg; - if (asn1getword(&iterationCount, &itercount) || - !itercount || itercount > 100000) - return -1; - pkcs5->itercount = itercount; - pkcs5->kdf = pbkdf2; - return 0; -} - -static int -parse_hmacWithSHA1(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param) -{ - if (!param || *param->header != ASN1_NULL) - return -1; - pkcs5->hash = algo->hash; - pkcs5->hashlen = algo->hashlen; - return 0; -} - -static int -parse_iv(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param) -{ - if (!param || *param->header != ASN1_OCTET_STRING || - param->end - param->beg != algo->ivlen) - return -1; - pkcs5->cipher = algo->cipher; - pkcs5->blocksize = algo->blocksize; - pkcs5->mode = algo->mode; - pkcs5->padopt = algo->padopt; - pkcs5->padchar = algo->padchar; - pkcs5->dklen = algo->keylen; - pkcs5->ivlen = algo->ivlen; - pkcs5->iv = param->beg; - return 0; -} - -static int -parse_rc2(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param) -{ - asn1Element iv; - unsigned long effkeysize; - char *cp; - - if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - cp = getASN1Element(&iv, param->beg, param->end); - if (!cp) - return -1; - effkeysize = algo->effkeysize; - if (*iv.header == ASN1_INTEGER) { - if (asn1getword(&iv, &effkeysize) || effkeysize > 1024) - return -1; - - cp = getASN1Element(&iv, cp, param->end); - if (effkeysize < 256) - switch (effkeysize) { - case 160: - effkeysize = 40; - case 120: - effkeysize = 64; - case 58: - effkeysize = 128; - break; - default: - return -1; - } - } - if (effkeysize > 1024 || cp != param->end || - *iv.header != ASN1_OCTET_STRING || iv.end - iv.beg != algo->ivlen) - return -1; - pkcs5->cipher = algo->cipher; - pkcs5->blocksize = algo->blocksize; - pkcs5->mode = algo->mode; - pkcs5->padopt = algo->padopt; - pkcs5->padchar = algo->padchar; - pkcs5->ivlen = algo->ivlen; - pkcs5->iv = iv.beg; - pkcs5->effkeysize = effkeysize; - pkcs5->dklen = (effkeysize + 8 - 1) / 8; - return 0; -} - -static int -parse_pbes1(LIBSSH2_SESSION *session, pkcs5params *pkcs5, - pkcs5algo *algo, asn1Element *param) -{ - asn1Element salt; - asn1Element iterationCount; - unsigned long itercount; - char *cp; - - if (!param || *param->header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - - cp = getASN1Element(&salt, param->beg, param->end); - if (!cp || *salt.header != ASN1_OCTET_STRING || - salt.end - salt.beg != algo->saltlen) - return -1; - if (getASN1Element(&iterationCount, cp, param->end) != param->end || - *iterationCount.header != ASN1_INTEGER) - return -1; - if (asn1getword(&iterationCount, &itercount) || - !itercount || itercount > 100000) - return -1; - pkcs5->cipher = algo->cipher; - pkcs5->blocksize = algo->blocksize; - pkcs5->mode = algo->mode; - pkcs5->padopt = algo->padopt; - pkcs5->padchar = algo->padchar; - pkcs5->hash = algo->hash; - pkcs5->hashlen = algo->hashlen; - pkcs5->dklen = 16; - pkcs5->saltlen = algo->saltlen; - pkcs5->effkeysize = algo->effkeysize; - pkcs5->salt = salt.beg; - pkcs5->kdf = pbkdf1; - pkcs5->itercount = itercount; - return 0; -} - -static int -pkcs8kek(LIBSSH2_SESSION *session, _libssh2_os400qc3_crypto_ctx **ctx, - const unsigned char *data, unsigned int datalen, - const unsigned char *passphrase, asn1Element *privkeyinfo) -{ - asn1Element encprivkeyinfo; - asn1Element pkcs5alg; - pkcs5params pkcs5; - size_t pplen; - char *cp; - unsigned long t; - int i; - char *dk = NULL; - Qc3_Format_ALGD0200_T algd; - Qus_EC_t errcode; - - /* Determine if the PKCS#8 data is encrypted and, if so, set-up a - key encryption key and algorithm in context. - Return 1 if encrypted, 0, if not, -1 if error. */ - - *ctx = NULL; - privkeyinfo->beg = (char *) data; - privkeyinfo->end = privkeyinfo->beg + datalen; - - /* If no passphrase is given, it cannot be an encrypted key. */ - if (!passphrase || !*passphrase) - return 0; - - /* Parse PKCS#8 data, checking if ASN.1 format is PrivateKeyInfo or - EncryptedPrivateKeyInfo. */ - if (getASN1Element(&encprivkeyinfo, privkeyinfo->beg, privkeyinfo->end) != - (char *) data + datalen || - *encprivkeyinfo.header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - cp = getASN1Element(&pkcs5alg, encprivkeyinfo.beg, encprivkeyinfo.end); - if (!cp) - return -1; - - switch (*pkcs5alg.header) { - case ASN1_INTEGER: /* Version. */ - return 0; /* This is a PrivateKeyInfo --> not encrypted. */ - case ASN1_SEQ | ASN1_CONSTRUCTED: /* AlgorithIdentifier. */ - break; /* This is an EncryptedPrivateKeyInfo --> encrypted. */ - default: - return -1; /* Unrecognized: error. */ - } - - /* Get the encrypted key data. */ - if (getASN1Element(privkeyinfo, cp, encprivkeyinfo.end) != - encprivkeyinfo.end || *privkeyinfo->header != ASN1_OCTET_STRING) - return -1; - - /* PKCS#5: parse the PBES AlgorithmIdentifier and recursively get all - encryption parameters. */ - memset((char *) &pkcs5, 0, sizeof pkcs5); - if (parse_pkcs5_algorithm(session, &pkcs5, &pkcs5alg, pbestable)) - return -1; - - /* Compute the derived key. */ - if ((*pkcs5.kdf)(session, &dk, passphrase, &pkcs5)) - return -1; - - /* Prepare the algorithm descriptor. */ - memset((char *) &algd, 0, sizeof algd); - algd.Block_Cipher_Alg = pkcs5.cipher; - algd.Block_Length = pkcs5.blocksize; - algd.Mode = pkcs5.mode; - algd.Pad_Option = pkcs5.padopt; - algd.Pad_Character = pkcs5.padchar; - algd.Effective_Key_Size = pkcs5.effkeysize; - memcpy(algd.Init_Vector, pkcs5.iv, pkcs5.ivlen); - - /* Create the key and algorithm context tokens. */ - *ctx = libssh2_init_crypto_ctx(NULL); - if (!*ctx) { - LIBSSH2_FREE(session, dk); - return -1; - } - libssh2_init_crypto_ctx(*ctx); - set_EC_length(errcode, sizeof errcode); - Qc3CreateKeyContext(dk, &pkcs5.dklen, binstring, &algd.Block_Cipher_Alg, - qc3clear, NULL, NULL, (*ctx)->key.Key_Context_Token, - (char *) &errcode); - LIBSSH2_FREE(session, dk); - if (errcode.Bytes_Available) { - free((char *) *ctx); - *ctx = NULL; - return -1; - } - - Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Block_Cipher, - (*ctx)->hash.Alg_Context_Token, &errcode); - if (errcode.Bytes_Available) { - Qc3DestroyKeyContext((*ctx)->key.Key_Context_Token, (char *) &ecnull); - free((char *) *ctx); - *ctx = NULL; - return -1; - } - return 1; /* Tell it's encrypted. */ -} - -static int -rsapkcs8privkey(LIBSSH2_SESSION *session, - const unsigned char *data, unsigned int datalen, - const unsigned char *passphrase, void *loadkeydata) -{ - libssh2_rsa_ctx *ctx = (libssh2_rsa_ctx *) loadkeydata; - char keyform = Qc3_Clear; - char *kek = NULL; - char *kea = NULL; - _libssh2_os400qc3_crypto_ctx *kekctx; - asn1Element pki; - int pkilen; - Qus_EC_t errcode; - - switch (pkcs8kek(session, &kekctx, data, datalen, passphrase, &pki)) { - case 1: - keyform = Qc3_Encrypted; - kek = kekctx->key.Key_Context_Token; - kea = kekctx->hash.Alg_Context_Token; - case 0: - break; - default: - return -1; - } - - set_EC_length(errcode, sizeof errcode); - pkilen = pki.end - pki.beg; - Qc3CreateKeyContext((unsigned char *) pki.beg, &pkilen, berstring, - rsaprivate, &keyform, kek, kea, - ctx->key.Key_Context_Token, (char *) &errcode); - if (errcode.Bytes_Available) { - if (kekctx) - _libssh2_os400qc3_crypto_dtor(kekctx); - return -1; - } - ctx->kek = kekctx; - return 0; -} - -static char * -storewithlength(char *p, const char *data, int length) -{ - _libssh2_htonu32(p, length); - if (length) - memcpy(p + 4, data, length); - return p + 4 + length; -} - -static int -sshrsapubkey(LIBSSH2_SESSION *session, char **sshpubkey, - asn1Element *params, asn1Element *key, const char *method) -{ - int methlen = strlen(method); - asn1Element keyseq; - asn1Element m; - asn1Element e; - int len; - char *cp; - - if (getASN1Element(&keyseq, key->beg + 1, key->end) != key->end || - *keyseq.header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - if (!getASN1Element(&m, keyseq.beg, keyseq.end) || - *m.header != ASN1_INTEGER) - return -1; - if (getASN1Element(&e, m.end, keyseq.end) != keyseq.end || - *e.header != ASN1_INTEGER) - return -1; - len = 4 + methlen + 4 + (e.end - e.beg) + 4 + (m.end - m.beg); - cp = LIBSSH2_ALLOC(session, len); - if (!cp) - return -1; - *sshpubkey = cp; - cp = storewithlength(cp, method, methlen); - cp = storewithlength(cp, e.beg, e.end - e.beg); - cp = storewithlength(cp, m.beg, m.end - m.beg); - return len; -} - -static int -rsapkcs8pubkey(LIBSSH2_SESSION *session, - const unsigned char *data, unsigned int datalen, - const unsigned char *passphrase, void *loadkeydata) -{ - loadpubkeydata *p = (loadpubkeydata *) loadkeydata; - char *buf; - int len; - char *cp; - int i; - char keyform = Qc3_Clear; - char *kek = NULL; - char *kea = NULL; - _libssh2_os400qc3_crypto_ctx *kekctx; - asn1Element subjpubkeyinfo; - asn1Element algorithmid; - asn1Element algorithm; - asn1Element subjpubkey; - asn1Element parameters; - asn1Element pki; - int pkilen; - Qus_EC_t errcode; - - if (!(buf = alloca(datalen))) - return -1; - - switch (pkcs8kek(session, &kekctx, data, datalen, passphrase, &pki)) { - case 1: - keyform = Qc3_Encrypted; - kek = kekctx->key.Key_Context_Token; - kea = kekctx->hash.Alg_Context_Token; - case 0: - break; - default: - return -1; - } - - set_EC_length(errcode, sizeof errcode); - pkilen = pki.end - pki.beg; - Qc3ExtractPublicKey(pki.beg, &pkilen, berstring, &keyform, - kek, kea, buf, (int *) &datalen, &len, &errcode); - _libssh2_os400qc3_crypto_dtor(kekctx); - if (errcode.Bytes_Available) - return -1; - /* Get the algorithm OID and key data from SubjectPublicKeyInfo. */ - if (getASN1Element(&subjpubkeyinfo, buf, buf + len) != buf + len || - *subjpubkeyinfo.header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - cp = getASN1Element(&algorithmid, subjpubkeyinfo.beg, subjpubkeyinfo.end); - if (!cp || *algorithmid.header != (ASN1_SEQ | ASN1_CONSTRUCTED)) - return -1; - if (!getASN1Element(&algorithm, algorithmid.beg, algorithmid.end) || - *algorithm.header != ASN1_OBJ_ID) - return -1; - if (getASN1Element(&subjpubkey, cp, subjpubkeyinfo.end) != - subjpubkeyinfo.end || *subjpubkey.header != ASN1_BIT_STRING) - return -1; - /* Check for supported algorithm. */ - for (i = 0; pka[i].oid; i++) - if (!oidcmp(&algorithm, pka[i].oid)) { - len = (*pka[i].sshpubkey)(session, &p->data, &algorithmid, - &subjpubkey, pka[i].method); - if (len < 0) - return -1; - p->length = len; - p->method = pka[i].method; - return 0; - } - return -1; /* Algorithm not supported. */ -} - -static int -pkcs1topkcs8(LIBSSH2_SESSION *session, - const unsigned char **data8, unsigned int *datalen8, - const unsigned char *data1, unsigned int datalen1) -{ - asn1Element *prvk; - asn1Element *pkcs8; - unsigned char *data; - - *data8 = NULL; - *datalen8 = 0; - if (datalen1 < 2) - return -1; - prvk = asn1_new_from_bytes(data1, datalen1); - if (!prvk) - return -1; - pkcs8 = rsaprivatekeyinfo(prvk); - asn1delete(prvk); - if (!prvk) { - asn1delete(pkcs8); - pkcs8 = NULL; - } - if (!pkcs8) - return -1; - data = (unsigned char *) LIBSSH2_ALLOC(session, pkcs8->end - pkcs8->header); - if (!data) { - asn1delete(pkcs8); - return -1; - } - *data8 = data; - *datalen8 = pkcs8->end - pkcs8->header; - memcpy((char *) data, (char *) pkcs8->header, *datalen8); - asn1delete(pkcs8); - return 0; -} - -static int -rsapkcs1privkey(LIBSSH2_SESSION *session, - const unsigned char *data, unsigned int datalen, - const unsigned char *passphrase, void *loadkeydata) -{ - const unsigned char *data8; - unsigned int datalen8; - int ret; - - if (pkcs1topkcs8(session, &data8, &datalen8, data, datalen)) - return -1; - ret = rsapkcs8privkey(session, data8, datalen8, passphrase, loadkeydata); - LIBSSH2_FREE(session, (char *) data8); - return ret; -} - -static int -rsapkcs1pubkey(LIBSSH2_SESSION *session, - const unsigned char *data, unsigned int datalen, - const unsigned char *passphrase, void *loadkeydata) -{ - const unsigned char *data8; - unsigned int datalen8; - int ret; - - if (pkcs1topkcs8(session, &data8, &datalen8, data, datalen)) - return -1; - ret = rsapkcs8pubkey(session, data8, datalen8, passphrase, loadkeydata); - LIBSSH2_FREE(session, (char *) data8); - return ret; -} - -static int -try_pem_load(LIBSSH2_SESSION *session, FILE *fp, - const unsigned char *passphrase, - const char *header, const char *trailer, - loadkeyproc proc, void *loadkeydata) -{ - unsigned char *data = NULL; - unsigned int datalen = 0; - int c; - int ret; - - fseek(fp, 0L, SEEK_SET); - for (;;) { - ret = _libssh2_pem_parse(session, header, trailer, - fp, &data, &datalen); - - if (!ret) { - ret = (*proc)(session, data, datalen, passphrase, loadkeydata); - if (!ret) - return 0; - } - - if (data) { - LIBSSH2_FREE(session, data); - data = NULL; - } - c = getc(fp); - - if (c == EOF) - break; - - ungetc(c, fp); - } - - return -1; -} - -static int -load_rsa_private_file(LIBSSH2_SESSION *session, const char *filename, - unsigned const char *passphrase, - loadkeyproc proc1, loadkeyproc proc8, void *loadkeydata) -{ - FILE *fp = fopen(filename, fopenrmode); - unsigned char *data = NULL; - size_t datalen = 0; - int ret; - long filesize; - - if (!fp) - return -1; - - /* Try with "ENCRYPTED PRIVATE KEY" PEM armor. - --> PKCS#8 EncryptedPrivateKeyInfo */ - ret = try_pem_load(session, fp, passphrase, beginencprivkeyhdr, - endencprivkeyhdr, proc8, loadkeydata); - - /* Try with "PRIVATE KEY" PEM armor. - --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */ - if (ret) - ret = try_pem_load(session, fp, passphrase, beginprivkeyhdr, - endprivkeyhdr, proc8, loadkeydata); - - /* Try with "RSA PRIVATE KEY" PEM armor. - --> PKCS#1 RSAPrivateKey */ - if (ret) - ret = try_pem_load(session, fp, passphrase, beginrsaprivkeyhdr, - endrsaprivkeyhdr, proc1, loadkeydata); - fclose(fp); - - if (ret) { - /* Try DER encoding. */ - fp = fopen(filename, fopenrbmode); - fseek(fp, 0L, SEEK_END); - filesize = ftell(fp); - - if (filesize <= 32768) { /* Limit to a reasonable size. */ - datalen = filesize; - data = (unsigned char *) alloca(datalen); - if (data) { - fseek(fp, 0L, SEEK_SET); - fread(data, datalen, 1, fp); - - /* Try as PKCS#8 DER data. - --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */ - ret = (*proc8)(session, data, datalen, passphrase, - loadkeydata); - - /* Try as PKCS#1 DER data. - --> PKCS#1 RSAPrivateKey */ - if (ret) - ret = (*proc1)(session, data, datalen, passphrase, - loadkeydata); - } - } - fclose(fp); - } - - return ret; -} - -int -_libssh2_rsa_new_private(libssh2_rsa_ctx **rsa, LIBSSH2_SESSION *session, - const char *filename, unsigned const char *passphrase) -{ - libssh2_rsa_ctx *ctx = libssh2_init_crypto_ctx(NULL); - int ret; - Qc3_Format_ALGD0400_T algd; - Qus_EC_t errcode; - - if (!ctx) - return -1; - ret = load_rsa_private_file(session, filename, passphrase, - rsapkcs1privkey, rsapkcs8privkey, (void *) ctx); - if (!ret) { - /* Create the algorithm context. */ - algd.Public_Key_Alg = Qc3_RSA; - algd.PKA_Block_Format = Qc3_PKCS1_01; - memset(algd.Reserved, 0, sizeof algd.Reserved); - algd.Signing_Hash_Alg = Qc3_SHA1; - set_EC_length(errcode, sizeof errcode); - Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key, - ctx->hash.Alg_Context_Token, &errcode); - if (errcode.Bytes_Available) - ret = -1; - } - if (ret) { - _libssh2_os400qc3_crypto_dtor(ctx); - ctx = NULL; - } - *rsa = ctx; - return ret; -} - -int -_libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, - unsigned char **method, size_t *method_len, - unsigned char **pubkeydata, size_t *pubkeydata_len, - const char *privatekey, const char *passphrase) - -{ - loadpubkeydata p; - int ret; - - *method = NULL; - *method_len = 0; - *pubkeydata = NULL; - *pubkeydata_len = 0; - - ret = load_rsa_private_file(session, privatekey, passphrase, - rsapkcs1pubkey, rsapkcs8pubkey, (void *) &p); - if (!ret) { - *method_len = strlen(p.method); - if ((*method = LIBSSH2_ALLOC(session, *method_len))) - memcpy((char *) *method, p.method, *method_len); - else - ret = -1; - } - - if (ret) { - if (*method) - LIBSSH2_FREE(session, *method); - if (p.data) - LIBSSH2_FREE(session, (void *) p.data); - *method = NULL; - *method_len = 0; - } else { - *pubkeydata = (unsigned char *) p.data; - *pubkeydata_len = p.length; - } - - return ret; -} - -int -_libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa, - LIBSSH2_SESSION *session, - const char *filedata, - size_t filedata_len, - unsigned const char *passphrase) -{ - libssh2_rsa_ctx *ctx = libssh2_init_crypto_ctx(NULL); - unsigned char *data = NULL; - unsigned int datalen = 0; - int ret; - Qc3_Format_ALGD0400_T algd; - Qus_EC_t errcode; - - if (!ctx) - return -1; - - /* Try with "ENCRYPTED PRIVATE KEY" PEM armor. - --> PKCS#8 EncryptedPrivateKeyInfo */ - ret = _libssh2_pem_parse_memory(session, - beginencprivkeyhdr, endencprivkeyhdr, - filedata, filedata_len, &data, &datalen); - - /* Try with "PRIVATE KEY" PEM armor. - --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */ - if (ret) - ret = _libssh2_pem_parse_memory(session, - beginprivkeyhdr, endprivkeyhdr, - filedata, filedata_len, - &data, &datalen); - - if (!ret) { - /* Process PKCS#8. */ - ret = rsapkcs8privkey(session, - data, datalen, passphrase, (void *) &ctx); - } else { - /* Try with "RSA PRIVATE KEY" PEM armor. - --> PKCS#1 RSAPrivateKey */ - ret = _libssh2_pem_parse_memory(session, - beginrsaprivkeyhdr, endrsaprivkeyhdr, - filedata, filedata_len, - &data, &datalen); - if (!ret) - ret = rsapkcs1privkey(session, - data, datalen, passphrase, (void *) &ctx); - } - - if (ret) { - /* Try as PKCS#8 DER data. - --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */ - ret = rsapkcs8privkey(session, filedata, filedata_len, - passphrase, (void *) &ctx); - - /* Try as PKCS#1 DER data. - --> PKCS#1 RSAPrivateKey */ - if (ret) - ret = rsapkcs1privkey(session, filedata, filedata_len, - passphrase, (void *) &ctx); - } - - if (data) - LIBSSH2_FREE(session, data); - - if (!ret) { - /* Create the algorithm context. */ - algd.Public_Key_Alg = Qc3_RSA; - algd.PKA_Block_Format = Qc3_PKCS1_01; - memset(algd.Reserved, 0, sizeof algd.Reserved); - algd.Signing_Hash_Alg = Qc3_SHA1; - set_EC_length(errcode, sizeof errcode); - Qc3CreateAlgorithmContext((char *) &algd, Qc3_Alg_Public_Key, - ctx->hash.Alg_Context_Token, &errcode); - if (errcode.Bytes_Available) - ret = -1; - } - - if (ret) { - _libssh2_os400qc3_crypto_dtor(ctx); - ctx = NULL; - } - - *rsa = ctx; - return ret; -} - -int -_libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, - unsigned char **method, size_t *method_len, - unsigned char **pubkeydata, - size_t *pubkeydata_len, - const char *privatekeydata, - size_t privatekeydata_len, - const char *passphrase) -{ - loadpubkeydata p; - unsigned char *data = NULL; - unsigned int datalen = 0; - const char *meth; - int ret; - - *method = NULL; - *method_len = 0; - *pubkeydata = NULL; - *pubkeydata_len = 0; - - /* Try with "ENCRYPTED PRIVATE KEY" PEM armor. - --> PKCS#8 EncryptedPrivateKeyInfo */ - ret = _libssh2_pem_parse_memory(session, - beginencprivkeyhdr, endencprivkeyhdr, - privatekeydata, privatekeydata_len, - &data, &datalen); - - /* Try with "PRIVATE KEY" PEM armor. - --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */ - if (ret) - ret = _libssh2_pem_parse_memory(session, - beginprivkeyhdr, endprivkeyhdr, - privatekeydata, privatekeydata_len, - &data, &datalen); - - if (!ret) { - /* Process PKCS#8. */ - ret = rsapkcs8pubkey(session, - data, datalen, passphrase, (void *) &p); - } else { - /* Try with "RSA PRIVATE KEY" PEM armor. - --> PKCS#1 RSAPrivateKey */ - ret = _libssh2_pem_parse_memory(session, - beginrsaprivkeyhdr, endrsaprivkeyhdr, - privatekeydata, privatekeydata_len, - &data, &datalen); - if (!ret) - ret = rsapkcs1pubkey(session, - data, datalen, passphrase, (void *) &p); - } - - if (ret) { - /* Try as PKCS#8 DER data. - --> PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo */ - ret = rsapkcs8pubkey(session, privatekeydata, privatekeydata_len, - passphrase, (void *) &p); - - /* Try as PKCS#1 DER data. - --> PKCS#1 RSAPrivateKey */ - if (ret) - ret = rsapkcs1pubkey(session, privatekeydata, privatekeydata_len, - passphrase, (void *) &p); - } - - if (data) - LIBSSH2_FREE(session, data); - - if (!ret) { - *method_len = strlen(p.method); - if ((*method = LIBSSH2_ALLOC(session, *method_len))) - memcpy((char *) *method, p.method, *method_len); - else - ret = -1; - } - if (ret) { - if (*method) - LIBSSH2_FREE(session, *method); - if (p.data) - LIBSSH2_FREE(session, (void *) p.data); - *method = NULL; - *method_len = 0; - } else { - *pubkeydata = (unsigned char *) p.data; - *pubkeydata_len = p.length; - } - - return ret; -} - -int -_libssh2_rsa_sha1_verify(libssh2_rsa_ctx *rsa, - const unsigned char *sig, unsigned long sig_len, - const unsigned char *m, unsigned long m_len) -{ - Qus_EC_t errcode; - int slen = sig_len; - int mlen = m_len; - - set_EC_length(errcode, sizeof errcode); - Qc3VerifySignature((char *) sig, &slen, (char *) m, &mlen, Qc3_Data, - rsa->hash.Alg_Context_Token, Qc3_Alg_Token, - rsa->key.Key_Context_Token, Qc3_Key_Token, anycsp, - NULL, (char *) &errcode); - return errcode.Bytes_Available? -1: 0; -} - -int -_libssh2_os400qc3_rsa_sha1_signv(LIBSSH2_SESSION *session, - unsigned char **signature, - size_t *signature_len, - int veccount, - const struct iovec vector[], - libssh2_rsa_ctx *ctx) -{ - Qus_EC_t errcode; - int siglen; - unsigned char *sig; - char sigbuf[8192]; - int sigbufsize = sizeof sigbuf; - - ctx->hash.Final_Op_Flag = Qc3_Final; - set_EC_length(errcode, sizeof errcode); - Qc3CalculateSignature((char *) vector, &veccount, Qc3_Array, - (char *) &ctx->hash, Qc3_Alg_Token, - (char *) &ctx->key, Qc3_Key_Token, - anycsp, NULL, sigbuf, &sigbufsize, &siglen, - (char *) &errcode); - ctx->hash.Final_Op_Flag = Qc3_Continue; - if (errcode.Bytes_Available) - return -1; - sig = LIBSSH2_ALLOC(session, siglen); - if (!sig) - return -1; - memcpy((char *) sig, sigbuf, siglen); - *signature = sig; - *signature_len = siglen; - return 0; -} - -void -_libssh2_init_aes_ctr(void) -{ -} - -#endif /* LIBSSH2_OS400QC3 */ - -/* vim: set expandtab ts=4 sw=4: */ diff --git a/vendor/libssh2/src/os400qc3.h b/vendor/libssh2/src/os400qc3.h deleted file mode 100644 index dbaa581f6..000000000 --- a/vendor/libssh2/src/os400qc3.h +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (C) 2015 Patrick Monnerat, D+H - * 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. - * - * Neither the name of the copyright holder nor the names - * of any other contributors may be used to endorse or - * promote products derived from this software without - * specific prior written permission. - * - * 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 LIBSSH2_OS400QC3_H -#define LIBSSH2_OS400QC3_H - -#include -#include - -#include - - -/* Redefine character/string literals as always EBCDIC. */ -#undef Qc3_Alg_Token -#define Qc3_Alg_Token "\xC1\xD3\xC7\xC4\xF0\xF1\xF0\xF0" /* ALGD0100 */ -#undef Qc3_Alg_Block_Cipher -#define Qc3_Alg_Block_Cipher "\xC1\xD3\xC7\xC4\xF0\xF2\xF0\xF0" /* ALGD0200 */ -#undef Qc3_Alg_Block_CipherAuth -#define Qc3_Alg_Block_CipherAuth \ - "\xC1\xD3\xC7\xC4\xF0\xF2\xF1\xF0" /* ALGD0210 */ -#undef Qc3_Alg_Stream_Cipher -#define Qc3_Alg_Stream_Cipher \ - "\xC1\xD3\xC7\xC4\xF0\xF3\xF0\xF0" /* ALGD0300 */ -#undef Qc3_Alg_Public_Key -#define Qc3_Alg_Public_Key "\xC1\xD3\xC7\xC4\xF0\xF4\xF0\xF0" /* ALGD0400 */ -#undef Qc3_Alg_Hash -#define Qc3_Alg_Hash "\xC1\xD3\xC7\xC4\xF0\xF5\xF0\xF0" /* ALGD0500 */ -#undef Qc3_Data -#define Qc3_Data "\xC4\xC1\xE3\xC1\xF0\xF1\xF0\xF0" /* DATA0100 */ -#undef Qc3_Array -#define Qc3_Array "\xC4\xC1\xE3\xC1\xF0\xF2\xF0\xF0" /* DATA0200 */ -#undef Qc3_Key_Token -#define Qc3_Key_Token "\xD2\xC5\xE8\xC4\xF0\xF1\xF0\xF0" /* KEYD0100 */ -#undef Qc3_Key_Parms -#define Qc3_Key_Parms "\xD2\xC5\xE8\xC4\xF0\xF2\xF0\xF0" /* KEYD0200 */ -#undef Qc3_Key_KSLabel -#define Qc3_Key_KSLabel "\xD2\xC5\xE8\xC4\xF0\xF4\xF0\xF0" /* KEYD0400 */ -#undef Qc3_Key_PKCS5 -#define Qc3_Key_PKCS5 "\xD2\xC5\xE8\xC4\xF0\xF5\xF0\xF0" /* KEYD0500 */ -#undef Qc3_Key_PEMCert -#define Qc3_Key_PEMCert "\xD2\xC5\xE8\xC4\xF0\xF6\xF0\xF0" /* KEYD0600 */ -#undef Qc3_Key_CSLabel -#define Qc3_Key_CSLabel "\xD2\xC5\xE8\xC4\xF0\xF7\xF0\xF0" /* KEYD0700 */ -#undef Qc3_Key_CSDN -#define Qc3_Key_CSDN "\xD2\xC5\xE8\xC4\xF0\xF8\xF0\xF0" /* KEYD0800 */ -#undef Qc3_Key_AppID -#define Qc3_Key_AppID "\xD2\xC5\xE8\xC4\xF0\xF9\xF0\xF0" /* KEYD0900 */ - -#undef Qc3_ECB -#define Qc3_ECB '\xF0' /* '0' */ -#undef Qc3_CBC -#define Qc3_CBC '\xF1' /* '1' */ -#undef Qc3_OFB -#define Qc3_OFB '\xF2' /* '2' */ -#undef Qc3_CFB1Bit -#define Qc3_CFB1Bit '\xF3' /* '3' */ -#undef Qc3_CFB8Bit -#define Qc3_CFB8Bit '\xF4' /* '4' */ -#undef Qc3_CFB64Bit -#define Qc3_CFB64Bit '\xF5' /* '5' */ -#undef Qc3_CUSP -#define Qc3_CUSP '\xF6' /* '6' */ -#undef Qc3_CTR -#define Qc3_CTR '\xF7' /* '7' */ -#undef Qc3_CCM -#define Qc3_CCM '\xF8' /* '8' */ -#undef Qc3_No_Pad -#define Qc3_No_Pad '\xF0' /* '0' */ -#undef Qc3_Pad_Char -#define Qc3_Pad_Char '\xF1' /* '1' */ -#undef Qc3_Pad_Counter -#define Qc3_Pad_Counter '\xF2' /* '2' */ -#undef Qc3_PKCS1_00 -#define Qc3_PKCS1_00 '\xF0' /* '0' */ -#undef Qc3_PKCS1_01 -#define Qc3_PKCS1_01 '\xF1' /* '1' */ -#undef Qc3_PKCS1_02 -#define Qc3_PKCS1_02 '\xF2' /* '2' */ -#undef Qc3_ISO9796 -#define Qc3_ISO9796 '\xF3' /* '3' */ -#undef Qc3_Zero_Pad -#define Qc3_Zero_Pad '\xF4' /* '4' */ -#undef Qc3_ANSI_X931 -#define Qc3_ANSI_X931 '\xF5' /* '5' */ -#undef Qc3_OAEP -#define Qc3_OAEP '\xF6' /* '6' */ -#undef Qc3_Bin_String -#define Qc3_Bin_String '\xF0' /* '0' */ -#undef Qc3_BER_String -#define Qc3_BER_String '\xF1' /* '1' */ -#undef Qc3_MK_Struct -#define Qc3_MK_Struct '\xF3' /* '3' */ -#undef Qc3_KSLabel_Struct -#define Qc3_KSLabel_Struct '\xF4' /* '4' */ -#undef Qc3_PKCS5_Struct -#define Qc3_PKCS5_Struct '\xF5' /* '5' */ -#undef Qc3_PEMCert_String -#define Qc3_PEMCert_String '\xF6' /* '6' */ -#undef Qc3_CSLabel_String -#define Qc3_CSLabel_String '\xF7' /* '7' */ -#undef Qc3_CSDN_String -#define Qc3_CSDN_String '\xF8' /* '8' */ -#undef Qc3_Clear -#define Qc3_Clear '\xF0' /* '0' */ -#undef Qc3_Encrypted -#define Qc3_Encrypted '\xF1' /* '1' */ -#undef Qc3_MK_Encrypted -#define Qc3_MK_Encrypted '\xF2' /* '2' */ -#undef Qc3_Any_CSP -#define Qc3_Any_CSP '\xF0' /* '0' */ -#undef Qc3_Sfw_CSP -#define Qc3_Sfw_CSP '\xF1' /* '1' */ -#undef Qc3_Hdw_CSP -#define Qc3_Hdw_CSP '\xF2' /* '2' */ -#undef Qc3_Continue -#define Qc3_Continue '\xF0' /* '0' */ -#undef Qc3_Final -#define Qc3_Final '\xF1' /* '1' */ -#undef Qc3_MK_New -#define Qc3_MK_New '\xF0' /* '0' */ -#undef Qc3_MK_Current -#define Qc3_MK_Current '\xF1' /* '1' */ -#undef Qc3_MK_Old -#define Qc3_MK_Old '\xF2' /* '2' */ -#undef Qc3_MK_Pending -#define Qc3_MK_Pending '\xF3' /* '3' */ - - -/* Define which features are supported. */ -#define LIBSSH2_MD5 1 -#define LIBSSH2_HMAC_RIPEMD 0 -#define LIBSSH2_HMAC_SHA256 1 -#define LIBSSH2_HMAC_SHA512 1 - -#define LIBSSH2_AES 1 -#define LIBSSH2_AES_CTR 1 -#define LIBSSH2_BLOWFISH 0 -#define LIBSSH2_RC4 1 -#define LIBSSH2_CAST 0 -#define LIBSSH2_3DES 1 - -#define LIBSSH2_RSA 1 -#define LIBSSH2_DSA 0 - -#define MD5_DIGEST_LENGTH 16 -#define SHA_DIGEST_LENGTH 20 -#define SHA256_DIGEST_LENGTH 32 -#define SHA512_DIGEST_LENGTH 64 - - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: global handles structures. - * - *******************************************************************/ - -/* HMAC & private key algorithms support structure. */ -typedef struct _libssh2_os400qc3_crypto_ctx _libssh2_os400qc3_crypto_ctx; -struct _libssh2_os400qc3_crypto_ctx { - Qc3_Format_ALGD0100_T hash; /* Hash algorithm. */ - Qc3_Format_KEYD0100_T key; /* Key. */ - _libssh2_os400qc3_crypto_ctx * kek; /* Key encryption. */ -}; - -typedef struct { /* Big number. */ - unsigned char * bignum; /* Number bits, little-endian. */ - unsigned int length; /* Length of bignum (# bytes). */ -} _libssh2_bn; - -typedef struct { /* Algorithm description. */ - char * fmt; /* Format of Qc3 structure. */ - int algo; /* Algorithm identifier. */ - unsigned char size; /* Block length. */ - unsigned char mode; /* Block mode. */ - int keylen; /* Key length. */ -} _libssh2_os400qc3_cipher_t; - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: Define global types/codes. - * - *******************************************************************/ - -#define libssh2_crypto_init() -#define libssh2_crypto_exit() - -#define libssh2_sha1_ctx Qc3_Format_ALGD0100_T -#define libssh2_sha256_ctx Qc3_Format_ALGD0100_T -#define libssh2_md5_ctx Qc3_Format_ALGD0100_T -#define libssh2_hmac_ctx _libssh2_os400qc3_crypto_ctx -#define _libssh2_cipher_ctx _libssh2_os400qc3_crypto_ctx - -#define libssh2_sha1_init(x) libssh2_os400qc3_hash_init(x, Qc3_SHA1) -#define libssh2_sha1_update(ctx, data, len) \ - libssh2_os400qc3_hash_update(&(ctx), data, len) -#define libssh2_sha1_final(ctx, out) \ - libssh2_os400qc3_hash_final(&(ctx), out) -#define libssh2_sha256_init(x) libssh2_os400qc3_hash_init(x, Qc3_SHA256) -#define libssh2_sha256_update(ctx, data, len) \ - libssh2_os400qc3_hash_update(&(ctx), data, len) -#define libssh2_sha256_final(ctx, out) \ - libssh2_os400qc3_hash_final(&(ctx), out) -#define libssh2_sha256(message, len, out) \ - libssh2_os400qc3_hash(message, len, out, \ - Qc3_SHA256) -#define libssh2_md5_init(x) libssh2_os400qc3_hash_init(x, Qc3_MD5) -#define libssh2_md5_update(ctx, data, len) \ - libssh2_os400qc3_hash_update(&(ctx), data, len) -#define libssh2_md5_final(ctx, out) \ - libssh2_os400qc3_hash_final(&(ctx), out) -#define libssh2_hmac_ctx_init(ctx) \ - memset((char *) &(ctx), 0, \ - sizeof(libssh2_hmac_ctx)) -#define libssh2_hmac_md5_init(ctx, key, keylen) \ - libssh2_os400qc3_hmac_init(ctx, Qc3_MD5, \ - MD5_DIGEST_LENGTH, \ - key, keylen) -#define libssh2_hmac_sha1_init(ctx, key, keylen) \ - libssh2_os400qc3_hmac_init(ctx, Qc3_SHA1, \ - SHA_DIGEST_LENGTH, \ - key, keylen) -#define libssh2_hmac_sha256_init(ctx, key, keylen) \ - libssh2_os400qc3_hmac_init(ctx, Qc3_SHA256, \ - SHA256_DIGEST_LENGTH, \ - key, keylen) -#define libssh2_hmac_sha512_init(ctx, key, keylen) \ - libssh2_os400qc3_hmac_init(ctx, Qc3_SHA512, \ - SHA512_DIGEST_LENGTH, \ - key, keylen) -#define libssh2_hmac_update(ctx, data, datalen) \ - libssh2_os400qc3_hmac_update(&(ctx), \ - data, datalen) -#define libssh2_hmac_final(ctx, data) \ - libssh2_os400qc3_hmac_final(&(ctx), data) -#define libssh2_hmac_cleanup(ctx) \ - _libssh2_os400qc3_crypto_dtor(ctx) - - -#define _libssh2_bn_ctx int /* Not used. */ - -#define _libssh2_bn_ctx_new() 0 -#define _libssh2_bn_ctx_free(bnctx) ((void) 0) - -#define _libssh2_bn_init_from_bin() _libssh2_bn_init() -#define _libssh2_bn_mod_exp(r, a, p, m, ctx) \ - _libssh2_os400qc3_bn_mod_exp(r, a, p, m) -#define _libssh2_bn_bytes(bn) ((bn)->length) - -#define _libssh2_cipher_type(name) _libssh2_os400qc3_cipher_t name -#define _libssh2_cipher_aes128 {Qc3_Alg_Block_Cipher, Qc3_AES, 16, \ - Qc3_CBC, 16} -#define _libssh2_cipher_aes192 {Qc3_Alg_Block_Cipher, Qc3_AES, 24, \ - Qc3_CBC, 24} -#define _libssh2_cipher_aes256 {Qc3_Alg_Block_Cipher, Qc3_AES, 32, \ - Qc3_CBC, 32} -#define _libssh2_cipher_aes128ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 16, \ - Qc3_CTR, 16} -#define _libssh2_cipher_aes192ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 24, \ - Qc3_CTR, 24} -#define _libssh2_cipher_aes256ctr {Qc3_Alg_Block_Cipher, Qc3_AES, 32, \ - Qc3_CTR, 32} -#define _libssh2_cipher_3des {Qc3_Alg_Block_Cipher, Qc3_TDES, 0, \ - Qc3_CBC, 24} -#define _libssh2_cipher_arcfour {Qc3_Alg_Stream_Cipher, Qc3_RC4, 0, 0, 16} - -#define _libssh2_cipher_dtor(ctx) _libssh2_os400qc3_crypto_dtor(ctx) - -#define libssh2_rsa_ctx _libssh2_os400qc3_crypto_ctx -#define _libssh2_rsa_free(ctx) (_libssh2_os400qc3_crypto_dtor(ctx), \ - free((char *) ctx)) -#define libssh2_prepare_iovec(vec, len) memset((char *) (vec), 0, \ - (len) * sizeof(struct iovec)) -#define _libssh2_rsa_sha1_signv(session, sig, siglen, count, vector, ctx) \ - _libssh2_os400qc3_rsa_sha1_signv(session, sig, siglen, \ - count, vector, ctx) - - -/******************************************************************* - * - * OS/400 QC3 crypto-library backend: Support procedure prototypes. - * - *******************************************************************/ - -extern _libssh2_bn * _libssh2_bn_init(void); -extern void _libssh2_bn_free(_libssh2_bn *bn); -extern unsigned long _libssh2_bn_bits(_libssh2_bn *bn); -extern int _libssh2_bn_from_bin(_libssh2_bn *bn, int len, - const unsigned char *v); -extern int _libssh2_bn_set_word(_libssh2_bn *bn, unsigned long val); -extern int _libssh2_bn_to_bin(_libssh2_bn *bn, unsigned char *val); -extern void _libssh2_random(unsigned char *buf, int len); -extern int _libssh2_bn_rand(_libssh2_bn *bn, int bits, - int top, int bottom); -extern int _libssh2_os400qc3_bn_mod_exp(_libssh2_bn *r, _libssh2_bn *a, - _libssh2_bn *p, _libssh2_bn *m); -extern void _libssh2_os400qc3_crypto_dtor(_libssh2_os400qc3_crypto_ctx *x); -extern int libssh2_os400qc3_hash_init(Qc3_Format_ALGD0100_T *x, - unsigned int algo); -extern void libssh2_os400qc3_hash_update(Qc3_Format_ALGD0100_T *ctx, - unsigned char *data, int len); -extern void libssh2_os400qc3_hash_final(Qc3_Format_ALGD0100_T *ctx, - unsigned char *out); -extern int libssh2_os400qc3_hash(const unsigned char *message, - unsigned long len, unsigned char *out, - unsigned int algo); -extern void libssh2_os400qc3_hmac_init(_libssh2_os400qc3_crypto_ctx *x, - int algo, size_t minkeylen, - void *key, int keylen); -extern void libssh2_os400qc3_hmac_update(_libssh2_os400qc3_crypto_ctx *ctx, - const unsigned char *data, - int len); -extern void libssh2_os400qc3_hmac_final(_libssh2_os400qc3_crypto_ctx *ctx, - unsigned char *out); -extern int _libssh2_os400qc3_rsa_sha1_signv(LIBSSH2_SESSION *session, - unsigned char **signature, - size_t *signature_len, - int veccount, - const struct iovec vector[], - libssh2_rsa_ctx *ctx); - -#endif - -/* vim: set expandtab ts=4 sw=4: */ diff --git a/vendor/libssh2/src/packet.c b/vendor/libssh2/src/packet.c index c950b5dcf..38ab62944 100644 --- a/vendor/libssh2/src/packet.c +++ b/vendor/libssh2/src/packet.c @@ -87,7 +87,7 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, (void) datalen; - if (listen_state->state == libssh2_NB_state_idle) { + if(listen_state->state == libssh2_NB_state_idle) { unsigned char *s = data + (sizeof("forwarded-tcpip") - 1) + 5; listen_state->sender_channel = _libssh2_ntohu32(s); s += 4; @@ -118,9 +118,9 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, listen_state->state = libssh2_NB_state_allocated; } - if (listen_state->state != libssh2_NB_state_sent) { - while (listn) { - if ((listn->port == (int) listen_state->port) && + if(listen_state->state != libssh2_NB_state_sent) { + while(listn) { + if((listn->port == (int) listen_state->port) && (strlen(listn->host) == listen_state->host_len) && (memcmp (listn->host, listen_state->host, listen_state->host_len) == 0)) { @@ -128,8 +128,8 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, LIBSSH2_CHANNEL *channel = NULL; listen_state->channel = NULL; - if (listen_state->state == libssh2_NB_state_allocated) { - if (listn->queue_maxsize && + if(listen_state->state == libssh2_NB_state_allocated) { + if(listn->queue_maxsize && (listn->queue_maxsize <= listn->queue_size)) { /* Queue is full */ failure_code = SSH_OPEN_RESOURCE_SHORTAGE; @@ -140,7 +140,7 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, } channel = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL)); - if (!channel) { + if(!channel) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate a channel for " "new connection"); @@ -156,7 +156,7 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, channel-> channel_type_len + 1); - if (!channel->channel_type) { + if(!channel->channel_type) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate a channel for new" " connection"); @@ -203,12 +203,12 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, listen_state->state = libssh2_NB_state_created; } - if (listen_state->state == libssh2_NB_state_created) { + if(listen_state->state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, listen_state->packet, 17, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; - else if (rc) { + else if(rc) { listen_state->state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Unable to send channel " @@ -216,7 +216,7 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, } /* Link the channel into the end of the queue list */ - if (listen_state->channel) { + if(listen_state->channel) { _libssh2_list_add(&listn->queue, &listen_state->channel->node); listn->queue_size++; @@ -243,9 +243,10 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, rc = _libssh2_transport_send(session, listen_state->packet, packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { listen_state->state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Unable to send open failure"); @@ -273,7 +274,7 @@ packet_x11_open(LIBSSH2_SESSION * session, unsigned char *data, (void) datalen; - if (x11open_state->state == libssh2_NB_state_idle) { + if(x11open_state->state == libssh2_NB_state_idle) { unsigned char *s = data + (sizeof("x11") - 1) + 5; x11open_state->sender_channel = _libssh2_ntohu32(s); s += 4; @@ -295,10 +296,10 @@ packet_x11_open(LIBSSH2_SESSION * session, unsigned char *data, x11open_state->state = libssh2_NB_state_allocated; } - if (session->x11) { - if (x11open_state->state == libssh2_NB_state_allocated) { + if(session->x11) { + if(x11open_state->state == libssh2_NB_state_allocated) { channel = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL)); - if (!channel) { + if(!channel) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "allocate a channel for new connection"); failure_code = SSH_OPEN_RESOURCE_SHORTAGE; @@ -310,7 +311,7 @@ packet_x11_open(LIBSSH2_SESSION * session, unsigned char *data, channel->channel_type = LIBSSH2_ALLOC(session, channel->channel_type_len + 1); - if (!channel->channel_type) { + if(!channel->channel_type) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "allocate a channel for new connection"); LIBSSH2_FREE(session, channel); @@ -350,12 +351,13 @@ packet_x11_open(LIBSSH2_SESSION * session, unsigned char *data, x11open_state->state = libssh2_NB_state_created; } - if (x11open_state->state == libssh2_NB_state_created) { + if(x11open_state->state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, x11open_state->packet, 17, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { x11open_state->state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send channel open " @@ -389,9 +391,10 @@ packet_x11_open(LIBSSH2_SESSION * session, unsigned char *data, rc = _libssh2_transport_send(session, x11open_state->packet, packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { x11open_state->state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Unable to send open failure"); } @@ -416,10 +419,10 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, size_t datalen, int macstate) { int rc = 0; - char *message=NULL; - char *language=NULL; - size_t message_len=0; - size_t language_len=0; + char *message = NULL; + char *language = NULL; + size_t message_len = 0; + size_t language_len = 0; LIBSSH2_CHANNEL *channelp = NULL; size_t data_head = 0; unsigned char msg = data[0]; @@ -430,7 +433,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, "Packet type %d received, length=%d", (int) msg, (int) datalen); - if ((macstate == LIBSSH2_MAC_INVALID) && + if((macstate == LIBSSH2_MAC_INVALID) && (!session->macerror || LIBSSH2_MACERROR(session, (char *) data, datalen))) { /* Bad MAC input, but no callback set or non-zero return from the @@ -456,9 +459,9 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, break; } - if (session->packAdd_state == libssh2_NB_state_allocated) { + if(session->packAdd_state == libssh2_NB_state_allocated) { /* A couple exceptions to the packet adding rule: */ - switch (msg) { + switch(msg) { /* byte SSH_MSG_DISCONNECT @@ -478,7 +481,8 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, /* 9 = packet_type(1) + reason(4) + message_len(4) */ message = (char *) data + 9; - language_len = _libssh2_ntohu32(data + 9 + message_len); + language_len = + _libssh2_ntohu32(data + 9 + message_len); language = (char *) data + 9 + message_len + 4; if(language_len > (datalen-13-message_len)) { @@ -489,9 +493,9 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, } else /* bad size, clear it */ - message_len=0; + message_len = 0; } - if (session->ssh_msg_disconnect) { + if(session->ssh_msg_disconnect) { LIBSSH2_DISCONNECT(session, reason, message, message_len, language, language_len); } @@ -511,11 +515,12 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, */ case SSH_MSG_IGNORE: - if (datalen >= 2) { - if (session->ssh_msg_ignore) { + if(datalen >= 2) { + if(session->ssh_msg_ignore) { LIBSSH2_IGNORE(session, (char *) data + 1, datalen - 1); } - } else if (session->ssh_msg_ignore) { + } + else if(session->ssh_msg_ignore) { LIBSSH2_IGNORE(session, "", 0); } LIBSSH2_FREE(session, data); @@ -531,7 +536,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, case SSH_MSG_DEBUG: if(datalen >= 2) { - int always_display= data[1]; + int always_display = data[1]; if(datalen >= 6) { message_len = _libssh2_ntohu32(data + 2); @@ -539,14 +544,15 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, if(message_len <= (datalen - 10)) { /* 6 = packet_type(1) + display(1) + message_len(4) */ message = (char *) data + 6; - language_len = _libssh2_ntohu32(data + 6 + message_len); + language_len = _libssh2_ntohu32(data + 6 + + message_len); if(language_len <= (datalen - 10 - message_len)) language = (char *) data + 10 + message_len; } } - if (session->ssh_msg_debug) { + if(session->ssh_msg_debug) { LIBSSH2_DEBUG(session, always_display, message, message_len, language, language_len); } @@ -570,8 +576,8 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, case SSH_MSG_GLOBAL_REQUEST: if(datalen >= 5) { - uint32_t len =0; - unsigned char want_reply=0; + uint32_t len = 0; + unsigned char want_reply = 0; len = _libssh2_ntohu32(data + 1); if(datalen >= (6 + len)) { want_reply = data[5 + len]; @@ -582,13 +588,13 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, } - if (want_reply) { + if(want_reply) { static const unsigned char packet = SSH_MSG_REQUEST_FAILURE; libssh2_packet_add_jump_point5: session->packAdd_state = libssh2_NB_state_jump5; rc = _libssh2_transport_send(session, &packet, 1, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; } } @@ -624,7 +630,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, _libssh2_channel_locate(session, _libssh2_ntohu32(data + 1)); - if (!channelp) { + if(!channelp) { _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_UNKNOWN, "Packet received for unknown channel"); LIBSSH2_FREE(session, data); @@ -634,7 +640,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, #ifdef LIBSSH2DEBUG { uint32_t stream_id = 0; - if (msg == SSH_MSG_CHANNEL_EXTENDED_DATA) + if(msg == SSH_MSG_CHANNEL_EXTENDED_DATA) stream_id = _libssh2_ntohu32(data + 5); _libssh2_debug(session, LIBSSH2_TRACE_CONN, @@ -645,7 +651,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, stream_id); } #endif - if ((channelp->remote.extended_data_ignore_mode == + if((channelp->remote.extended_data_ignore_mode == LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE) && (msg == SSH_MSG_CHANNEL_EXTENDED_DATA)) { /* Pretend we didn't receive this */ @@ -654,14 +660,15 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Ignoring extended data and refunding %d bytes", (int) (datalen - 13)); - if (channelp->read_avail + datalen - data_head >= + if(channelp->read_avail + datalen - data_head >= channelp->remote.window_size) datalen = channelp->remote.window_size - channelp->read_avail + data_head; channelp->remote.window_size -= datalen - data_head; _libssh2_debug(session, LIBSSH2_TRACE_CONN, - "shrinking window size by %lu bytes to %lu, read_avail %lu", + "shrinking window size by %lu bytes to %lu, " + "read_avail %lu", datalen - data_head, channelp->remote.window_size, channelp->read_avail); @@ -675,7 +682,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, packAdd_channelp, datalen - 13, 1, NULL); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; session->packAdd_state = libssh2_NB_state_idle; @@ -686,7 +693,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, * REMEMBER! remote means remote as source of data, * NOT remote window! */ - if (channelp->remote.packet_size < (datalen - data_head)) { + if(channelp->remote.packet_size < (datalen - data_head)) { /* * Spec says we MAY ignore bytes sent beyond * packet_size @@ -697,7 +704,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, " to receive, truncating"); datalen = channelp->remote.packet_size + data_head; } - if (channelp->remote.window_size <= channelp->read_avail) { + if(channelp->remote.window_size <= channelp->read_avail) { /* * Spec says we MAY ignore bytes sent beyond * window_size @@ -713,7 +720,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, /* Reset EOF status */ channelp->remote.eof = 0; - if (channelp->read_avail + datalen - data_head > + if(channelp->read_avail + datalen - data_head > channelp->remote.window_size) { _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED, @@ -746,7 +753,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, channelp = _libssh2_channel_locate(session, _libssh2_ntohu32(data + 1)); - if (!channelp) + if(!channelp) /* We may have freed already, just quietly ignore this... */ ; else { @@ -783,7 +790,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, "Channel %d received request type %.*s (wr %X)", channel, len, data + 9, want_reply); - if (len == sizeof("exit-status") - 1 + if(len == sizeof("exit-status") - 1 && (sizeof("exit-status") - 1 + 9) <= datalen && !memcmp("exit-status", data + 9, sizeof("exit-status") - 1)) { @@ -793,7 +800,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, channelp = _libssh2_channel_locate(session, channel); - if (channelp && (sizeof("exit-status") + 13) <= datalen) { + if(channelp && (sizeof("exit-status") + 13) <= datalen) { channelp->exit_status = _libssh2_ntohu32(data + 9 + sizeof("exit-status")); _libssh2_debug(session, LIBSSH2_TRACE_CONN, @@ -805,7 +812,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, } } - else if (len == sizeof("exit-signal") - 1 + else if(len == sizeof("exit-signal") - 1 && (sizeof("exit-signal") - 1 + 9) <= datalen && !memcmp("exit-signal", data + 9, sizeof("exit-signal") - 1)) { @@ -813,7 +820,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, if(datalen >= 20) channelp = _libssh2_channel_locate(session, channel); - if (channelp && (sizeof("exit-signal") + 13) <= datalen) { + if(channelp && (sizeof("exit-signal") + 13) <= datalen) { /* set signal name (without SIG prefix) */ uint32_t namelen = _libssh2_ntohu32(data + 9 + sizeof("exit-signal")); @@ -826,10 +833,11 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, channelp->exit_signal = NULL; } - if (!channelp->exit_signal) + if(!channelp->exit_signal) rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "memory for signal name"); - else if ((sizeof("exit-signal") + 13 + namelen <= datalen)) { + else if((sizeof("exit-signal") + 13 + namelen <= + datalen)) { memcpy(channelp->exit_signal, data + 13 + sizeof("exit-signal"), namelen); channelp->exit_signal[namelen] = '\0'; @@ -845,14 +853,14 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, } - if (want_reply) { + if(want_reply) { unsigned char packet[5]; libssh2_packet_add_jump_point4: session->packAdd_state = libssh2_NB_state_jump4; packet[0] = SSH_MSG_CHANNEL_FAILURE; - memcpy(&packet[1], data+1, 4); + memcpy(&packet[1], data + 1, 4); rc = _libssh2_transport_send(session, packet, 5, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; } } @@ -870,7 +878,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, channelp = _libssh2_channel_locate(session, _libssh2_ntohu32(data + 1)); - if (!channelp) { + if(!channelp) { /* We may have freed already, just quietly ignore this... */ LIBSSH2_FREE(session, data); session->packAdd_state = libssh2_NB_state_idle; @@ -899,7 +907,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, case SSH_MSG_CHANNEL_OPEN: if(datalen < 17) ; - else if ((datalen >= (sizeof("forwarded-tcpip") + 4)) && + else if((datalen >= (sizeof("forwarded-tcpip") + 4)) && ((sizeof("forwarded-tcpip") - 1) == _libssh2_ntohu32(data + 1)) && @@ -915,7 +923,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, rc = packet_queue_listener(session, data, datalen, &session->packAdd_Qlstn_state); } - else if ((datalen >= (sizeof("x11") + 4)) && + else if((datalen >= (sizeof("x11") + 4)) && ((sizeof("x11") - 1) == _libssh2_ntohu32(data + 1)) && (memcmp(data + 5, "x11", sizeof("x11") - 1) == 0)) { @@ -928,7 +936,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, rc = packet_x11_open(session, data, datalen, &session->packAdd_x11open_state); } - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; LIBSSH2_FREE(session, data); @@ -970,10 +978,10 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, session->packAdd_state = libssh2_NB_state_sent; } - if (session->packAdd_state == libssh2_NB_state_sent) { + if(session->packAdd_state == libssh2_NB_state_sent) { LIBSSH2_PACKET *packetp = LIBSSH2_ALLOC(session, sizeof(LIBSSH2_PACKET)); - if (!packetp) { + if(!packetp) { _libssh2_debug(session, LIBSSH2_ERROR_ALLOC, "memory for packet"); LIBSSH2_FREE(session, data); @@ -989,10 +997,10 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, session->packAdd_state = libssh2_NB_state_sent1; } - if ((msg == SSH_MSG_KEXINIT && + if((msg == SSH_MSG_KEXINIT && !(session->state & LIBSSH2_STATE_EXCHANGING_KEYS)) || (session->packAdd_state == libssh2_NB_state_sent2)) { - if (session->packAdd_state == libssh2_NB_state_sent1) { + if(session->packAdd_state == libssh2_NB_state_sent1) { /* * Remote wants new keys * Well, it's already in the brigade, @@ -1021,7 +1029,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, * send NEWKEYS yet, otherwise remote will drop us like a rock */ rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; } @@ -1046,8 +1054,8 @@ _libssh2_packet_ask(LIBSSH2_SESSION * session, unsigned char packet_type, _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Looking for packet of type: %d", (int) packet_type); - while (packet) { - if (packet->data[0] == packet_type + while(packet) { + if(packet->data[0] == packet_type && (packet->data_len >= (match_ofs + match_len)) && (!match_buf || (memcmp(packet->data + match_ofs, match_buf, @@ -1084,7 +1092,7 @@ _libssh2_packet_askv(LIBSSH2_SESSION * session, int i, packet_types_len = strlen((char *) packet_types); for(i = 0; i < packet_types_len; i++) { - if (0 == _libssh2_packet_ask(session, packet_types[i], data, + if(0 == _libssh2_packet_ask(session, packet_types[i], data, data_len, match_ofs, match_buf, match_len)) { return 0; @@ -1111,8 +1119,8 @@ _libssh2_packet_require(LIBSSH2_SESSION * session, unsigned char packet_type, size_t match_len, packet_require_state_t *state) { - if (state->start == 0) { - if (_libssh2_packet_ask(session, packet_type, data, data_len, + if(state->start == 0) { + if(_libssh2_packet_ask(session, packet_type, data, data_len, match_ofs, match_buf, match_len) == 0) { /* A packet was available in the packet brigade */ @@ -1122,26 +1130,28 @@ _libssh2_packet_require(LIBSSH2_SESSION * session, unsigned char packet_type, state->start = time(NULL); } - while (session->socket_state == LIBSSH2_SOCKET_CONNECTED) { + while(session->socket_state == LIBSSH2_SOCKET_CONNECTED) { int ret = _libssh2_transport_read(session); - if (ret == LIBSSH2_ERROR_EAGAIN) + if(ret == LIBSSH2_ERROR_EAGAIN) return ret; - else if (ret < 0) { + else if(ret < 0) { state->start = 0; /* an error which is not just because of blocking */ return ret; - } else if (ret == packet_type) { + } + else if(ret == packet_type) { /* Be lazy, let packet_ask pull it out of the brigade */ ret = _libssh2_packet_ask(session, packet_type, data, data_len, match_ofs, match_buf, match_len); state->start = 0; return ret; - } else if (ret == 0) { + } + else if(ret == 0) { /* nothing available, wait until data arrives or we time out */ long left = LIBSSH2_READ_TIMEOUT - (long)(time(NULL) - state->start); - if (left <= 0) { + if(left <= 0) { state->start = 0; return LIBSSH2_ERROR_TIMEOUT; } @@ -1169,13 +1179,13 @@ _libssh2_packet_burn(LIBSSH2_SESSION * session, unsigned char i, all_packets[255]; int ret; - if (*state == libssh2_NB_state_idle) { + if(*state == libssh2_NB_state_idle) { for(i = 1; i < 255; i++) { all_packets[i - 1] = i; } all_packets[254] = 0; - if (_libssh2_packet_askv(session, all_packets, &data, &data_len, 0, + if(_libssh2_packet_askv(session, all_packets, &data, &data_len, 0, NULL, 0) == 0) { i = data[0]; /* A packet was available in the packet brigade, burn it */ @@ -1188,20 +1198,22 @@ _libssh2_packet_burn(LIBSSH2_SESSION * session, *state = libssh2_NB_state_created; } - while (session->socket_state == LIBSSH2_SOCKET_CONNECTED) { + while(session->socket_state == LIBSSH2_SOCKET_CONNECTED) { ret = _libssh2_transport_read(session); - if (ret == LIBSSH2_ERROR_EAGAIN) { + if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; - } else if (ret < 0) { + } + else if(ret < 0) { *state = libssh2_NB_state_idle; return ret; - } else if (ret == 0) { + } + else if(ret == 0) { /* FIXME: this might busyloop */ continue; } /* Be lazy, let packet_ask pull it out of the brigade */ - if (0 == + if(0 == _libssh2_packet_ask(session, (unsigned char)ret, &data, &data_len, 0, NULL, 0)) { /* Smoke 'em if you got 'em */ @@ -1231,37 +1243,37 @@ _libssh2_packet_requirev(LIBSSH2_SESSION *session, const unsigned char *match_buf, size_t match_len, packet_requirev_state_t * state) { - if (_libssh2_packet_askv(session, packet_types, data, data_len, match_ofs, + if(_libssh2_packet_askv(session, packet_types, data, data_len, match_ofs, match_buf, match_len) == 0) { /* One of the packets listed was available in the packet brigade */ state->start = 0; return 0; } - if (state->start == 0) { + if(state->start == 0) { state->start = time(NULL); } - while (session->socket_state != LIBSSH2_SOCKET_DISCONNECTED) { + while(session->socket_state != LIBSSH2_SOCKET_DISCONNECTED) { int ret = _libssh2_transport_read(session); - if ((ret < 0) && (ret != LIBSSH2_ERROR_EAGAIN)) { + if((ret < 0) && (ret != LIBSSH2_ERROR_EAGAIN)) { state->start = 0; return ret; } - if (ret <= 0) { + if(ret <= 0) { long left = LIBSSH2_READ_TIMEOUT - (long)(time(NULL) - state->start); - if (left <= 0) { + if(left <= 0) { state->start = 0; return LIBSSH2_ERROR_TIMEOUT; } - else if (ret == LIBSSH2_ERROR_EAGAIN) { + else if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } } - if (strchr((char *) packet_types, ret)) { + if(strchr((char *) packet_types, ret)) { /* Be lazy, let packet_ask pull it out of the brigade */ return _libssh2_packet_askv(session, packet_types, data, data_len, match_ofs, match_buf, diff --git a/vendor/libssh2/src/pem.c b/vendor/libssh2/src/pem.c index 9f51bba3b..53f58c2ef 100644 --- a/vendor/libssh2/src/pem.c +++ b/vendor/libssh2/src/pem.c @@ -43,23 +43,23 @@ readline(char *line, int line_size, FILE * fp) { size_t len; - if (!line) { + if(!line) { return -1; } - if (!fgets(line, line_size, fp)) { + if(!fgets(line, line_size, fp)) { return -1; } - if (*line) { + if(*line) { len = strlen(line); - if (len > 0 && line[len - 1] == '\n') { + if(len > 0 && line[len - 1] == '\n') { line[len - 1] = '\0'; } } - if (*line) { + if(*line) { len = strlen(line); - if (len > 0 && line[len - 1] == '\r') { + if(len > 0 && line[len - 1] == '\r') { line[len - 1] = '\0'; } } @@ -76,14 +76,14 @@ readline_memory(char *line, size_t line_size, off = *filedata_offset; - for (len = 0; off + len < filedata_len && len < line_size; len++) { - if (filedata[off + len] == '\n' || + for(len = 0; off + len < filedata_len && len < line_size - 1; len++) { + if(filedata[off + len] == '\n' || filedata[off + len] == '\r') { break; } } - if (len) { + if(len) { memcpy(line, filedata + off, len); *filedata_offset += len; } @@ -96,36 +96,86 @@ readline_memory(char *line, size_t line_size, #define LINE_SIZE 128 +static const char *crypt_annotation = "Proc-Type: 4,ENCRYPTED"; + +static unsigned char hex_decode(char digit) +{ + return (digit >= 'A') ? 0xA + (digit - 'A') : (digit - '0'); +} + int _libssh2_pem_parse(LIBSSH2_SESSION * session, const char *headerbegin, const char *headerend, + const unsigned char *passphrase, FILE * fp, unsigned char **data, unsigned int *datalen) { char line[LINE_SIZE]; + unsigned char iv[LINE_SIZE]; char *b64data = NULL; unsigned int b64datalen = 0; int ret; + const LIBSSH2_CRYPT_METHOD *method = NULL; do { *line = '\0'; - if (readline(line, LINE_SIZE, fp)) { + if(readline(line, LINE_SIZE, fp)) { return -1; } } - while (strcmp(line, headerbegin) != 0); + while(strcmp(line, headerbegin) != 0); - *line = '\0'; + if(readline(line, LINE_SIZE, fp)) { + return -1; + } + + if(passphrase && + memcmp(line, crypt_annotation, strlen(crypt_annotation)) == 0) { + const LIBSSH2_CRYPT_METHOD **all_methods, *cur_method; + int i; + + if(readline(line, LINE_SIZE, fp)) { + ret = -1; + goto out; + } + + all_methods = libssh2_crypt_methods(); + while((cur_method = *all_methods++)) { + if(*cur_method->pem_annotation && + memcmp(line, cur_method->pem_annotation, + strlen(cur_method->pem_annotation)) == 0) { + method = cur_method; + memcpy(iv, line + strlen(method->pem_annotation) + 1, + 2*method->iv_len); + } + } + + /* None of the available crypt methods were able to decrypt the key */ + if(method == NULL) + return -1; + + /* Decode IV from hex */ + for(i = 0; i < method->iv_len; ++i) { + iv[i] = hex_decode(iv[2*i]) << 4; + iv[i] |= hex_decode(iv[2*i + 1]); + } + + /* skip to the next line */ + if(readline(line, LINE_SIZE, fp)) { + ret = -1; + goto out; + } + } do { - if (*line) { + if(*line) { char *tmp; size_t linelen; linelen = strlen(line); tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); - if (!tmp) { + if(!tmp) { ret = -1; goto out; } @@ -136,25 +186,102 @@ _libssh2_pem_parse(LIBSSH2_SESSION * session, *line = '\0'; - if (readline(line, LINE_SIZE, fp)) { + if(readline(line, LINE_SIZE, fp)) { ret = -1; goto out; } - } while (strcmp(line, headerend) != 0); + } while(strcmp(line, headerend) != 0); - if (!b64data) { + if(!b64data) { return -1; } - if (libssh2_base64_decode(session, (char**) data, datalen, + if(libssh2_base64_decode(session, (char **) data, datalen, b64data, b64datalen)) { ret = -1; goto out; } + if(method) { + /* Set up decryption */ + int free_iv = 0, free_secret = 0, len_decrypted = 0, padding = 0; + int blocksize = method->blocksize; + void *abstract; + unsigned char secret[2*MD5_DIGEST_LENGTH]; + libssh2_md5_ctx fingerprint_ctx; + + /* Perform key derivation (PBKDF1/MD5) */ + if(!libssh2_md5_init(&fingerprint_ctx)) { + ret = -1; + goto out; + } + libssh2_md5_update(fingerprint_ctx, passphrase, + strlen((char *)passphrase)); + libssh2_md5_update(fingerprint_ctx, iv, 8); + libssh2_md5_final(fingerprint_ctx, secret); + if(method->secret_len > MD5_DIGEST_LENGTH) { + if(!libssh2_md5_init(&fingerprint_ctx)) { + ret = -1; + goto out; + } + libssh2_md5_update(fingerprint_ctx, secret, MD5_DIGEST_LENGTH); + libssh2_md5_update(fingerprint_ctx, passphrase, + strlen((char *)passphrase)); + libssh2_md5_update(fingerprint_ctx, iv, 8); + libssh2_md5_final(fingerprint_ctx, secret + MD5_DIGEST_LENGTH); + } + + /* Initialize the decryption */ + if(method->init(session, method, iv, &free_iv, secret, + &free_secret, 0, &abstract)) { + _libssh2_explicit_zero((char *)secret, sizeof(secret)); + LIBSSH2_FREE(session, data); + ret = -1; + goto out; + } + + if(free_secret) { + _libssh2_explicit_zero((char *)secret, sizeof(secret)); + } + + /* Do the actual decryption */ + if((*datalen % blocksize) != 0) { + _libssh2_explicit_zero((char *)secret, sizeof(secret)); + method->dtor(session, &abstract); + _libssh2_explicit_zero(*data, *datalen); + LIBSSH2_FREE(session, *data); + ret = -1; + goto out; + } + + while(len_decrypted <= (int)*datalen - blocksize) { + if(method->crypt(session, *data + len_decrypted, blocksize, + &abstract)) { + ret = LIBSSH2_ERROR_DECRYPT; + _libssh2_explicit_zero((char *)secret, sizeof(secret)); + method->dtor(session, &abstract); + _libssh2_explicit_zero(*data, *datalen); + LIBSSH2_FREE(session, *data); + goto out; + } + + len_decrypted += blocksize; + } + + /* Account for padding */ + padding = (*data)[*datalen - 1]; + memset(&(*data)[*datalen-padding], 0, padding); + *datalen -= padding; + + /* Clean up */ + _libssh2_explicit_zero((char *)secret, sizeof(secret)); + method->dtor(session, &abstract); + } + ret = 0; out: - if (b64data) { + if(b64data) { + _libssh2_explicit_zero(b64data, b64datalen); LIBSSH2_FREE(session, b64data); } return ret; @@ -176,22 +303,22 @@ _libssh2_pem_parse_memory(LIBSSH2_SESSION * session, do { *line = '\0'; - if (readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) { + if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) { return -1; } } - while (strcmp(line, headerbegin) != 0); + while(strcmp(line, headerbegin) != 0); *line = '\0'; do { - if (*line) { + if(*line) { char *tmp; size_t linelen; linelen = strlen(line); tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); - if (!tmp) { + if(!tmp) { ret = -1; goto out; } @@ -202,17 +329,17 @@ _libssh2_pem_parse_memory(LIBSSH2_SESSION * session, *line = '\0'; - if (readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) { + if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) { ret = -1; goto out; } - } while (strcmp(line, headerend) != 0); + } while(strcmp(line, headerend) != 0); - if (!b64data) { + if(!b64data) { return -1; } - if (libssh2_base64_decode(session, (char**) data, datalen, + if(libssh2_base64_decode(session, (char **) data, datalen, b64data, b64datalen)) { ret = -1; goto out; @@ -220,12 +347,462 @@ _libssh2_pem_parse_memory(LIBSSH2_SESSION * session, ret = 0; out: - if (b64data) { + if(b64data) { + _libssh2_explicit_zero(b64data, b64datalen); + LIBSSH2_FREE(session, b64data); + } + return ret; +} + +/* OpenSSH formatted keys */ +#define AUTH_MAGIC "openssh-key-v1" +#define OPENSSH_HEADER_BEGIN "-----BEGIN OPENSSH PRIVATE KEY-----" +#define OPENSSH_HEADER_END "-----END OPENSSH PRIVATE KEY-----" + +static int +_libssh2_openssh_pem_parse_data(LIBSSH2_SESSION * session, + const unsigned char *passphrase, + const char *b64data, size_t b64datalen, + struct string_buf **decrypted_buf) +{ + const LIBSSH2_CRYPT_METHOD *method = NULL; + struct string_buf decoded, decrypted, kdf_buf; + unsigned char *ciphername = NULL; + unsigned char *kdfname = NULL; + unsigned char *kdf = NULL; + unsigned char *buf = NULL; + unsigned char *salt = NULL; + uint32_t nkeys, check1, check2; + uint32_t rounds = 0; + unsigned char *key = NULL; + unsigned char *key_part = NULL; + unsigned char *iv_part = NULL; + unsigned char *f = NULL; + unsigned int f_len = 0; + int ret = 0, keylen = 0, ivlen = 0, total_len = 0; + size_t kdf_len = 0, tmp_len = 0, salt_len = 0; + + if(decrypted_buf) + *decrypted_buf = NULL; + + /* decode file */ + if(libssh2_base64_decode(session, (char **)&f, &f_len, + b64data, b64datalen)) { + ret = -1; + goto out; + } + + /* Parse the file */ + decoded.data = (unsigned char *)f; + decoded.dataptr = (unsigned char *)f; + decoded.len = f_len; + + if(decoded.len < strlen(AUTH_MAGIC)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, "key too short"); + goto out; + } + + if(strncmp((char *) decoded.dataptr, AUTH_MAGIC, + strlen(AUTH_MAGIC)) != 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "key auth magic mismatch"); + goto out; + } + + decoded.dataptr += strlen(AUTH_MAGIC) + 1; + + if(_libssh2_get_string(&decoded, &ciphername, &tmp_len) || + tmp_len == 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "ciphername is missing"); + goto out; + } + + if(_libssh2_get_string(&decoded, &kdfname, &tmp_len) || + tmp_len == 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "kdfname is missing"); + goto out; + } + + if(_libssh2_get_string(&decoded, &kdf, &kdf_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "kdf is missing"); + goto out; + } + else { + kdf_buf.data = kdf; + kdf_buf.dataptr = kdf; + kdf_buf.len = kdf_len; + } + + if((passphrase == NULL || strlen((const char *)passphrase) == 0) && + strcmp((const char *)ciphername, "none") != 0) { + /* passphrase required */ + ret = LIBSSH2_ERROR_KEYFILE_AUTH_FAILED; + goto out; + } + + if(strcmp((const char *)kdfname, "none") != 0 && + strcmp((const char *)kdfname, "bcrypt") != 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "unknown cipher"); + goto out; + } + + if(!strcmp((const char *)kdfname, "none") && + strcmp((const char *)ciphername, "none") != 0) { + ret =_libssh2_error(session, LIBSSH2_ERROR_PROTO, + "invalid format"); + goto out; + } + + if(_libssh2_get_u32(&decoded, &nkeys) != 0 || nkeys != 1) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Multiple keys are unsupported"); + goto out; + } + + /* unencrypted public key */ + + if(_libssh2_get_string(&decoded, &buf, &tmp_len) || tmp_len == 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Invalid private key; " + "expect embedded public key"); + goto out; + } + + if(_libssh2_get_string(&decoded, &buf, &tmp_len) || tmp_len == 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Private key data not found"); + goto out; + } + + /* decode encrypted private key */ + decrypted.data = decrypted.dataptr = buf; + decrypted.len = tmp_len; + + if(ciphername && strcmp((const char *)ciphername, "none") != 0) { + const LIBSSH2_CRYPT_METHOD **all_methods, *cur_method; + + all_methods = libssh2_crypt_methods(); + while((cur_method = *all_methods++)) { + if(*cur_method->name && + memcmp(ciphername, cur_method->name, + strlen(cur_method->name)) == 0) { + method = cur_method; + } + } + + /* None of the available crypt methods were able to decrypt the key */ + + if(method == NULL) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "No supported cipher found"); + goto out; + } + } + + if(method) { + int free_iv = 0, free_secret = 0, len_decrypted = 0; + int blocksize; + void *abstract = NULL; + + keylen = method->secret_len; + ivlen = method->iv_len; + total_len = keylen + ivlen; + + key = LIBSSH2_CALLOC(session, total_len); + if(key == NULL) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Could not alloc key"); + goto out; + } + + if(strcmp((const char *)kdfname, "bcrypt") == 0 && + passphrase != NULL) { + if((_libssh2_get_string(&kdf_buf, &salt, &salt_len)) || + (_libssh2_get_u32(&kdf_buf, &rounds) != 0) ) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "kdf contains unexpected values"); + LIBSSH2_FREE(session, key); + goto out; + } + + if(_libssh2_bcrypt_pbkdf((const char *)passphrase, + strlen((const char *)passphrase), + salt, salt_len, key, + keylen + ivlen, rounds) < 0) { + ret = _libssh2_error(session, LIBSSH2_ERROR_DECRYPT, + "invalid format"); + LIBSSH2_FREE(session, key); + goto out; + } + } + else { + ret = _libssh2_error(session, LIBSSH2_ERROR_KEYFILE_AUTH_FAILED, + "bcrypted without passphrase"); + LIBSSH2_FREE(session, key); + goto out; + } + + /* Set up decryption */ + blocksize = method->blocksize; + + key_part = LIBSSH2_CALLOC(session, keylen); + if(key_part == NULL) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Could not alloc key part"); + goto out; + } + + iv_part = LIBSSH2_CALLOC(session, ivlen); + if(iv_part == NULL) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Could not alloc iv part"); + goto out; + } + + memcpy(key_part, key, keylen); + memcpy(iv_part, key + keylen, ivlen); + + /* Initialize the decryption */ + if(method->init(session, method, iv_part, &free_iv, key_part, + &free_secret, 0, &abstract)) { + ret = LIBSSH2_ERROR_DECRYPT; + goto out; + } + + /* Do the actual decryption */ + if((decrypted.len % blocksize) != 0) { + method->dtor(session, &abstract); + ret = LIBSSH2_ERROR_DECRYPT; + goto out; + } + + while((size_t)len_decrypted <= decrypted.len - blocksize) { + if(method->crypt(session, decrypted.data + len_decrypted, + blocksize, + &abstract)) { + ret = LIBSSH2_ERROR_DECRYPT; + method->dtor(session, &abstract); + goto out; + } + + len_decrypted += blocksize; + } + + /* No padding */ + + method->dtor(session, &abstract); + } + + /* Check random bytes match */ + + if(_libssh2_get_u32(&decrypted, &check1) != 0 || + _libssh2_get_u32(&decrypted, &check2) != 0 || + check1 != check2) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Private key unpack failed (correct password?)"); + ret = LIBSSH2_ERROR_KEYFILE_AUTH_FAILED; + goto out; + } + + if(decrypted_buf != NULL) { + /* copy data to out-going buffer */ + struct string_buf *out_buf = _libssh2_string_buf_new(session); + if(!out_buf) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for " + "decrypted struct"); + goto out; + } + + out_buf->data = LIBSSH2_CALLOC(session, decrypted.len); + if(out_buf->data == NULL) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for " + "decrypted struct"); + _libssh2_string_buf_free(session, out_buf); + goto out; + } + memcpy(out_buf->data, decrypted.data, decrypted.len); + out_buf->dataptr = out_buf->data + + (decrypted.dataptr - decrypted.data); + out_buf->len = decrypted.len; + + *decrypted_buf = out_buf; + } + +out: + + /* Clean up */ + if(key) { + _libssh2_explicit_zero(key, total_len); + LIBSSH2_FREE(session, key); + } + if(key_part) { + _libssh2_explicit_zero(key_part, keylen); + LIBSSH2_FREE(session, key_part); + } + if(iv_part) { + _libssh2_explicit_zero(iv_part, ivlen); + LIBSSH2_FREE(session, iv_part); + } + if(f) { + _libssh2_explicit_zero(f, f_len); + LIBSSH2_FREE(session, f); + } + + return ret; +} + +int +_libssh2_openssh_pem_parse(LIBSSH2_SESSION * session, + const unsigned char *passphrase, + FILE * fp, struct string_buf **decrypted_buf) +{ + char line[LINE_SIZE]; + char *b64data = NULL; + unsigned int b64datalen = 0; + int ret = 0; + + /* read file */ + + do { + *line = '\0'; + + if(readline(line, LINE_SIZE, fp)) { + return -1; + } + } + while(strcmp(line, OPENSSH_HEADER_BEGIN) != 0); + + if(readline(line, LINE_SIZE, fp)) { + return -1; + } + + do { + if(*line) { + char *tmp; + size_t linelen; + + linelen = strlen(line); + tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); + if(!tmp) { + ret = -1; + goto out; + } + memcpy(tmp + b64datalen, line, linelen); + b64data = tmp; + b64datalen += linelen; + } + + *line = '\0'; + + if(readline(line, LINE_SIZE, fp)) { + ret = -1; + goto out; + } + } while(strcmp(line, OPENSSH_HEADER_END) != 0); + + if(!b64data) { + return -1; + } + + ret = _libssh2_openssh_pem_parse_data(session, + passphrase, + (const char *)b64data, + (size_t)b64datalen, + decrypted_buf); + + if(b64data) { + _libssh2_explicit_zero(b64data, b64datalen); LIBSSH2_FREE(session, b64data); } + +out: + return ret; } +int +_libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session, + const unsigned char *passphrase, + const char *filedata, size_t filedata_len, + struct string_buf **decrypted_buf) +{ + char line[LINE_SIZE]; + char *b64data = NULL; + unsigned int b64datalen = 0; + size_t off = 0; + int ret; + + if(filedata == NULL || filedata_len <= 0) { + return -1; + } + + do { + + *line = '\0'; + + if(off >= filedata_len) { + return -1; + } + + if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) { + return -1; + } + } + while(strcmp(line, OPENSSH_HEADER_BEGIN) != 0); + + *line = '\0'; + + do { + if (*line) { + char *tmp; + size_t linelen; + + linelen = strlen(line); + tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); + if(!tmp) { + ret = -1; + goto out; + } + memcpy(tmp + b64datalen, line, linelen); + b64data = tmp; + b64datalen += linelen; + } + + *line = '\0'; + + if(off >= filedata_len) { + ret = -1; + goto out; + } + + if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) { + ret = -1; + goto out; + } + } while(strcmp(line, OPENSSH_HEADER_END) != 0); + + if(!b64data) { + return -1; + } + + ret = _libssh2_openssh_pem_parse_data(session, passphrase, b64data, + b64datalen, decrypted_buf); + +out: + if(b64data) { + _libssh2_explicit_zero(b64data, b64datalen); + LIBSSH2_FREE(session, b64data); + } + return ret; + +} + static int read_asn1_length(const unsigned char *data, unsigned int datalen, unsigned int *len) @@ -233,27 +810,28 @@ read_asn1_length(const unsigned char *data, unsigned int lenlen; int nextpos; - if (datalen < 1) { + if(datalen < 1) { return -1; } *len = data[0]; - if (*len >= 0x80) { + if(*len >= 0x80) { lenlen = *len & 0x7F; *len = data[1]; - if (1 + lenlen > datalen) { + if(1 + lenlen > datalen) { return -1; } - if (lenlen > 1) { + if(lenlen > 1) { *len <<= 8; *len |= data[2]; } - } else { + } + else { lenlen = 0; } nextpos = 1 + lenlen; - if (lenlen > 2 || 1 + lenlen + *len > datalen) { + if(lenlen > 2 || 1 + lenlen + *len > datalen) { return -1; } @@ -266,11 +844,11 @@ _libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen) unsigned int len; int lenlen; - if (*datalen < 1) { + if(*datalen < 1) { return -1; } - if ((*data)[0] != '\x30') { + if((*data)[0] != '\x30') { return -1; } @@ -278,7 +856,7 @@ _libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen) (*datalen)--; lenlen = read_asn1_length(*data, *datalen, &len); - if (lenlen < 0 || lenlen + len != *datalen) { + if(lenlen < 0 || lenlen + len != *datalen) { return -1; } @@ -295,11 +873,11 @@ _libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen, unsigned int len; int lenlen; - if (*datalen < 1) { + if(*datalen < 1) { return -1; } - if ((*data)[0] != '\x02') { + if((*data)[0] != '\x02') { return -1; } @@ -307,7 +885,7 @@ _libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen, (*datalen)--; lenlen = read_asn1_length(*data, *datalen, &len); - if (lenlen < 0 || lenlen + len > *datalen) { + if(lenlen < 0 || lenlen + len > *datalen) { return -1; } diff --git a/vendor/libssh2/src/publickey.c b/vendor/libssh2/src/publickey.c index bfee0a842..f26c6327d 100644 --- a/vendor/libssh2/src/publickey.c +++ b/vendor/libssh2/src/publickey.c @@ -60,7 +60,7 @@ static const LIBSSH2_PUBLICKEY_CODE_LIST publickey_response_codes[] = {LIBSSH2_PUBLICKEY_RESPONSE_STATUS, "status", sizeof("status") - 1}, {LIBSSH2_PUBLICKEY_RESPONSE_VERSION, "version", sizeof("version") - 1}, {LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY, "publickey", - sizeof("publickey") - 1} , + sizeof("publickey") - 1}, {0, NULL, 0} }; @@ -78,13 +78,13 @@ static const LIBSSH2_PUBLICKEY_CODE_LIST publickey_response_codes[] = #define LIBSSH2_PUBLICKEY_STATUS_CODE_MAX 8 static const LIBSSH2_PUBLICKEY_CODE_LIST publickey_status_codes[] = { - {LIBSSH2_PUBLICKEY_SUCCESS, "success", sizeof("success") - 1} , + {LIBSSH2_PUBLICKEY_SUCCESS, "success", sizeof("success") - 1}, {LIBSSH2_PUBLICKEY_ACCESS_DENIED, "access denied", sizeof("access denied") - 1}, {LIBSSH2_PUBLICKEY_STORAGE_EXCEEDED, "storage exceeded", - sizeof("storage exceeded") - 1} , + sizeof("storage exceeded") - 1}, {LIBSSH2_PUBLICKEY_VERSION_NOT_SUPPORTED, "version not supported", - sizeof("version not supported") - 1} , + sizeof("version not supported") - 1}, {LIBSSH2_PUBLICKEY_KEY_NOT_FOUND, "key not found", sizeof("key not found") - 1}, {LIBSSH2_PUBLICKEY_KEY_NOT_SUPPORTED, "key not supported", @@ -110,13 +110,14 @@ publickey_status_error(const LIBSSH2_PUBLICKEY *pkey, const char *msg; /* GENERAL_FAILURE got remapped between version 1 and 2 */ - if (status == 6 && pkey && pkey->version == 1) { + if(status == 6 && pkey && pkey->version == 1) { status = 7; } - if (status < 0 || status > LIBSSH2_PUBLICKEY_STATUS_CODE_MAX) { + if(status < 0 || status > LIBSSH2_PUBLICKEY_STATUS_CODE_MAX) { msg = "unknown"; - } else { + } + else { msg = publickey_status_codes[status].name; } @@ -139,11 +140,12 @@ publickey_packet_receive(LIBSSH2_PUBLICKEY * pkey, *data = NULL; /* default to nothing returned */ *data_len = 0; - if (pkey->receive_state == libssh2_NB_state_idle) { + if(pkey->receive_state == libssh2_NB_state_idle) { rc = _libssh2_channel_read(channel, 0, (char *) buffer, 4); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc != 4) { + } + else if(rc != 4) { return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, "Invalid response from publickey subsystem"); } @@ -151,7 +153,7 @@ publickey_packet_receive(LIBSSH2_PUBLICKEY * pkey, pkey->receive_packet_len = _libssh2_ntohu32(buffer); pkey->receive_packet = LIBSSH2_ALLOC(session, pkey->receive_packet_len); - if (!pkey->receive_packet) { + if(!pkey->receive_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate publickey response " "buffer"); @@ -160,12 +162,13 @@ publickey_packet_receive(LIBSSH2_PUBLICKEY * pkey, pkey->receive_state = libssh2_NB_state_sent; } - if (pkey->receive_state == libssh2_NB_state_sent) { + if(pkey->receive_state == libssh2_NB_state_sent) { rc = _libssh2_channel_read(channel, 0, (char *) pkey->receive_packet, pkey->receive_packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc != (int)pkey->receive_packet_len) { + } + else if(rc != (int)pkey->receive_packet_len) { LIBSSH2_FREE(session, pkey->receive_packet); pkey->receive_packet = NULL; pkey->receive_state = libssh2_NB_state_idle; @@ -195,20 +198,20 @@ publickey_response_id(unsigned char **pdata, size_t data_len) unsigned char *data = *pdata; const LIBSSH2_PUBLICKEY_CODE_LIST *codes = publickey_response_codes; - if (data_len < 4) { + if(data_len < 4) { /* Malformed response */ return -1; } response_len = _libssh2_ntohu32(data); data += 4; data_len -= 4; - if (data_len < response_len) { + if(data_len < response_len) { /* Malformed response */ return -1; } - while (codes->name) { - if ((unsigned long)codes->name_len == response_len && + while(codes->name) { + if((unsigned long)codes->name_len == response_len && strncmp(codes->name, (char *) data, response_len) == 0) { *pdata = data + response_len; return codes->code; @@ -231,28 +234,41 @@ publickey_response_success(LIBSSH2_PUBLICKEY * pkey) size_t data_len; int response; - while (1) { + while(1) { int rc = publickey_packet_receive(pkey, &data, &data_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT, "Timeout waiting for response from " "publickey subsystem"); } + if(data_len < 4) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Publickey response too small"); + } + s = data; response = publickey_response_id(&s, data_len); - switch (response) { + switch(response) { case LIBSSH2_PUBLICKEY_RESPONSE_STATUS: /* Error, or processing complete */ { - unsigned long status = _libssh2_ntohu32(s); + unsigned long status = 0; + + if(data_len < 8) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Publickey response too small"); + } + + status = _libssh2_ntohu32(s); LIBSSH2_FREE(session, data); - if (status == LIBSSH2_PUBLICKEY_SUCCESS) + if(status == LIBSSH2_PUBLICKEY_SUCCESS) return 0; publickey_status_error(pkey, session, status); @@ -260,7 +276,7 @@ publickey_response_success(LIBSSH2_PUBLICKEY * pkey) } default: LIBSSH2_FREE(session, data); - if (response < 0) { + if(response < 0) { return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, "Invalid publickey subsystem response"); @@ -289,7 +305,7 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) int response; int rc; - if (session->pkeyInit_state == libssh2_NB_state_idle) { + if(session->pkeyInit_state == libssh2_NB_state_idle) { session->pkeyInit_data = NULL; session->pkeyInit_pkey = NULL; session->pkeyInit_channel = NULL; @@ -300,7 +316,7 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) session->pkeyInit_state = libssh2_NB_state_allocated; } - if (session->pkeyInit_state == libssh2_NB_state_allocated) { + if(session->pkeyInit_state == libssh2_NB_state_allocated) { session->pkeyInit_channel = _libssh2_channel_open(session, "session", @@ -308,8 +324,8 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) LIBSSH2_CHANNEL_WINDOW_DEFAULT, LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0); - if (!session->pkeyInit_channel) { - if (libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) + if(!session->pkeyInit_channel) { + if(libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) /* The error state is already set, so leave it */ return NULL; _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE, @@ -320,17 +336,18 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) session->pkeyInit_state = libssh2_NB_state_sent; } - if (session->pkeyInit_state == libssh2_NB_state_sent) { + if(session->pkeyInit_state == libssh2_NB_state_sent) { rc = _libssh2_channel_process_startup(session->pkeyInit_channel, "subsystem", sizeof("subsystem") - 1, "publickey", sizeof("publickey") - 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block starting publickey subsystem"); return NULL; - } else if (rc) { + } + else if(rc) { _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE, "Unable to request publickey subsystem"); goto err_exit; @@ -339,11 +356,11 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) session->pkeyInit_state = libssh2_NB_state_sent1; } - if (session->pkeyInit_state == libssh2_NB_state_sent1) { + if(session->pkeyInit_state == libssh2_NB_state_sent1) { unsigned char *s; rc = _libssh2_channel_extended_data(session->pkeyInit_channel, - LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE); - if (rc == LIBSSH2_ERROR_EAGAIN) { + LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE); + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block starting publickey subsystem"); return NULL; @@ -351,7 +368,7 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) session->pkeyInit_pkey = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_PUBLICKEY)); - if (!session->pkeyInit_pkey) { + if(!session->pkeyInit_pkey) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate a new publickey structure"); goto err_exit; @@ -377,15 +394,16 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) session->pkeyInit_state = libssh2_NB_state_sent2; } - if (session->pkeyInit_state == libssh2_NB_state_sent2) { + if(session->pkeyInit_state == libssh2_NB_state_sent2) { rc = _libssh2_channel_write(session->pkeyInit_channel, 0, session->pkeyInit_buffer, 19 - session->pkeyInit_buffer_sent); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block sending publickey version packet"); return NULL; - } else if (rc < 0) { + } + else if(rc < 0) { _libssh2_error(session, rc, "Unable to send publickey version packet"); goto err_exit; @@ -400,18 +418,19 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) session->pkeyInit_state = libssh2_NB_state_sent3; } - if (session->pkeyInit_state == libssh2_NB_state_sent3) { - while (1) { + if(session->pkeyInit_state == libssh2_NB_state_sent3) { + while(1) { unsigned char *s; rc = publickey_packet_receive(session->pkeyInit_pkey, &session->pkeyInit_data, &session->pkeyInit_data_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for response from " "publickey subsystem"); return NULL; - } else if (rc) { + } + else if(rc) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT, "Timeout waiting for response from " "publickey subsystem"); @@ -419,31 +438,62 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) } s = session->pkeyInit_data; - if ((response = + if((response = publickey_response_id(&s, session->pkeyInit_data_len)) < 0) { _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, "Invalid publickey subsystem response code"); goto err_exit; } - switch (response) { + if(session->pkeyInit_data_len < 4) { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Public key init data too small"); + goto err_exit; + } + + switch(response) { case LIBSSH2_PUBLICKEY_RESPONSE_STATUS: /* Error */ { unsigned long status, descr_len, lang_len; - status = _libssh2_ntohu32(s); - s += 4; - descr_len = _libssh2_ntohu32(s); - s += 4; - /* description starts here */ - s += descr_len; - lang_len = _libssh2_ntohu32(s); - s += 4; - /* lang starts here */ - s += lang_len; - - if (s > + if(session->pkeyInit_data_len >= 8) { + status = _libssh2_ntohu32(s); + s += 4; + descr_len = _libssh2_ntohu32(s); + s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Public key init data too small"); + goto err_exit; + } + + if(s + descr_len + 4 <= + session->pkeyInit_data + session->pkeyInit_data_len) { + /* description starts here */ + s += descr_len; + lang_len = _libssh2_ntohu32(s); + s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Public key init data too small"); + goto err_exit; + } + + if(s + lang_len <= + session->pkeyInit_data + session->pkeyInit_data_len) { + /* lang starts here */ + s += lang_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Public key init data too small"); + goto err_exit; + } + + if(s > session->pkeyInit_data + session->pkeyInit_data_len) { _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, @@ -459,10 +509,11 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) case LIBSSH2_PUBLICKEY_RESPONSE_VERSION: /* What we want */ session->pkeyInit_pkey->version = _libssh2_ntohu32(s); - if (session->pkeyInit_pkey->version > + if(session->pkeyInit_pkey->version > LIBSSH2_PUBLICKEY_VERSION) { _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY, - "Truncate remote publickey version from %lu", + "Truncate remote publickey version " + "from %lu", session->pkeyInit_pkey->version); session->pkeyInit_pkey->version = LIBSSH2_PUBLICKEY_VERSION; @@ -489,19 +540,19 @@ static LIBSSH2_PUBLICKEY *publickey_init(LIBSSH2_SESSION *session) /* Never reached except by direct goto */ err_exit: session->pkeyInit_state = libssh2_NB_state_sent4; - if (session->pkeyInit_channel) { + if(session->pkeyInit_channel) { rc = _libssh2_channel_close(session->pkeyInit_channel); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block closing channel"); return NULL; } } - if (session->pkeyInit_pkey) { + if(session->pkeyInit_pkey) { LIBSSH2_FREE(session, session->pkeyInit_pkey); session->pkeyInit_pkey = NULL; } - if (session->pkeyInit_data) { + if(session->pkeyInit_data) { LIBSSH2_FREE(session, session->pkeyInit_data); session->pkeyInit_data = NULL; } @@ -553,16 +604,16 @@ libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name, channel = pkey->channel; session = channel->session; - if (pkey->add_state == libssh2_NB_state_idle) { + if(pkey->add_state == libssh2_NB_state_idle) { pkey->add_packet = NULL; _libssh2_debug(session, LIBSSH2_TRACE_PUBLICKEY, "Adding %s publickey", name); - if (pkey->version == 1) { + if(pkey->version == 1) { for(i = 0; i < num_attrs; i++) { /* Search for a comment attribute */ - if (attrs[i].name_len == (sizeof("comment") - 1) && + if(attrs[i].name_len == (sizeof("comment") - 1) && strncmp(attrs[i].name, "comment", sizeof("comment") - 1) == 0) { comment = (unsigned char *) attrs[i].value; @@ -571,7 +622,8 @@ libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name, } } packet_len += 4 + comment_len; - } else { + } + else { packet_len += 5; /* overwrite(1) + attribute_count(4) */ for(i = 0; i < num_attrs; i++) { packet_len += 9 + attrs[i].name_len + attrs[i].value_len; @@ -580,7 +632,7 @@ libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name, } pkey->add_packet = LIBSSH2_ALLOC(session, packet_len); - if (!pkey->add_packet) { + if(!pkey->add_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "publickey \"add\" packet"); @@ -593,10 +645,10 @@ libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name, pkey->add_s += 4; memcpy(pkey->add_s, "add", sizeof("add") - 1); pkey->add_s += sizeof("add") - 1; - if (pkey->version == 1) { + if(pkey->version == 1) { _libssh2_htonu32(pkey->add_s, comment_len); pkey->add_s += 4; - if (comment) { + if(comment) { memcpy(pkey->add_s, comment, comment_len); pkey->add_s += comment_len; } @@ -609,7 +661,8 @@ libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name, pkey->add_s += 4; memcpy(pkey->add_s, blob, blob_len); pkey->add_s += blob_len; - } else { + } + else { /* Version == 2 */ _libssh2_htonu32(pkey->add_s, name_len); @@ -644,12 +697,13 @@ libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name, pkey->add_state = libssh2_NB_state_created; } - if (pkey->add_state == libssh2_NB_state_created) { + if(pkey->add_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, pkey->add_packet, (pkey->add_s - pkey->add_packet)); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if ((pkey->add_s - pkey->add_packet) != rc) { + } + else if((pkey->add_s - pkey->add_packet) != rc) { LIBSSH2_FREE(session, pkey->add_packet); pkey->add_packet = NULL; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, @@ -662,7 +716,7 @@ libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey, const unsigned char *name, } rc = publickey_response_success(pkey); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } @@ -693,11 +747,11 @@ libssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY * pkey, channel = pkey->channel; session = channel->session; - if (pkey->remove_state == libssh2_NB_state_idle) { + if(pkey->remove_state == libssh2_NB_state_idle) { pkey->remove_packet = NULL; pkey->remove_packet = LIBSSH2_ALLOC(session, packet_len); - if (!pkey->remove_packet) { + if(!pkey->remove_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "publickey \"remove\" packet"); @@ -727,12 +781,13 @@ libssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY * pkey, pkey->remove_state = libssh2_NB_state_created; } - if (pkey->remove_state == libssh2_NB_state_created) { + if(pkey->remove_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, pkey->remove_packet, (pkey->remove_s - pkey->remove_packet)); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if ((pkey->remove_s - pkey->remove_packet) != rc) { + } + else if((pkey->remove_s - pkey->remove_packet) != rc) { LIBSSH2_FREE(session, pkey->remove_packet); pkey->remove_packet = NULL; pkey->remove_state = libssh2_NB_state_idle; @@ -746,7 +801,7 @@ libssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY * pkey, } rc = publickey_response_success(pkey); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } @@ -776,7 +831,7 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, channel = pkey->channel; session = channel->session; - if (pkey->listFetch_state == libssh2_NB_state_idle) { + if(pkey->listFetch_state == libssh2_NB_state_idle) { pkey->listFetch_data = NULL; pkey->listFetch_s = pkey->listFetch_buffer; @@ -793,14 +848,15 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, pkey->listFetch_state = libssh2_NB_state_created; } - if (pkey->listFetch_state == libssh2_NB_state_created) { + if(pkey->listFetch_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, pkey->listFetch_buffer, (pkey->listFetch_s - pkey->listFetch_buffer)); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if ((pkey->listFetch_s - pkey->listFetch_buffer) != rc) { + } + else if((pkey->listFetch_s - pkey->listFetch_buffer) != rc) { pkey->listFetch_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send publickey list packet"); @@ -809,12 +865,13 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, pkey->listFetch_state = libssh2_NB_state_sent; } - while (1) { + while(1) { rc = publickey_packet_receive(pkey, &pkey->listFetch_data, &pkey->listFetch_data_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (rc) { + } + else if(rc) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_TIMEOUT, "Timeout waiting for response from " "publickey subsystem"); @@ -822,7 +879,7 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, } pkey->listFetch_s = pkey->listFetch_data; - if ((response = + if((response = publickey_response_id(&pkey->listFetch_s, pkey->listFetch_data_len)) < 0) { _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, @@ -830,31 +887,57 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, goto err_exit; } - switch (response) { + switch(response) { case LIBSSH2_PUBLICKEY_RESPONSE_STATUS: /* Error, or processing complete */ { unsigned long status, descr_len, lang_len; - status = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - descr_len = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - /* description starts at pkey->listFetch_s */ - pkey->listFetch_s += descr_len; - lang_len = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - /* lang starts at pkey->listFetch_s */ - pkey->listFetch_s += lang_len; - - if (pkey->listFetch_s > + if(pkey->listFetch_s + 8 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + status = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + descr_len = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + descr_len + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + /* description starts at pkey->listFetch_s */ + pkey->listFetch_s += descr_len; + lang_len = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + lang_len <= + pkey->listFetch_data + pkey->listFetch_data_len) { + /* lang starts at pkey->listFetch_s */ + pkey->listFetch_s += lang_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s > pkey->listFetch_data + pkey->listFetch_data_len) { _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_PROTOCOL, "Malformed publickey subsystem packet"); goto err_exit; } - if (status == LIBSSH2_PUBLICKEY_SUCCESS) { + if(status == LIBSSH2_PUBLICKEY_SUCCESS) { LIBSSH2_FREE(session, pkey->listFetch_data); pkey->listFetch_data = NULL; *pkey_list = list; @@ -868,7 +951,7 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, } case LIBSSH2_PUBLICKEY_RESPONSE_PUBLICKEY: /* What we want */ - if (keys >= max_keys) { + if(keys >= max_keys) { libssh2_publickey_list *newlist; /* Grow the key list if necessary */ max_keys += 8; @@ -876,7 +959,7 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, LIBSSH2_REALLOC(session, list, (max_keys + 1) * sizeof(libssh2_publickey_list)); - if (!newlist) { + if(!newlist) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "publickey list"); @@ -884,17 +967,26 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, } list = newlist; } - if (pkey->version == 1) { + if(pkey->version == 1) { unsigned long comment_len; - comment_len = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - if (comment_len) { + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + comment_len = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(comment_len) { list[keys].num_attrs = 1; list[keys].attrs = LIBSSH2_ALLOC(session, sizeof(libssh2_publickey_attribute)); - if (!list[keys].attrs) { + if(!list[keys].attrs) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "publickey attributes"); @@ -907,57 +999,184 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, list[keys].attrs[0].mandatory = 0; pkey->listFetch_s += comment_len; - } else { + } + else { list[keys].num_attrs = 0; list[keys].attrs = NULL; } - list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - list[keys].name = pkey->listFetch_s; - pkey->listFetch_s += list[keys].name_len; - list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - list[keys].blob = pkey->listFetch_s; - pkey->listFetch_s += list[keys].blob_len; - } else { + + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + list[keys].name_len <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].name = pkey->listFetch_s; + pkey->listFetch_s += list[keys].name_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + list[keys].blob_len <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].blob = pkey->listFetch_s; + pkey->listFetch_s += list[keys].blob_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + } + else { /* Version == 2 */ - list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - list[keys].name = pkey->listFetch_s; - pkey->listFetch_s += list[keys].name_len; - list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - list[keys].blob = pkey->listFetch_s; - pkey->listFetch_s += list[keys].blob_len; - list[keys].num_attrs = _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - if (list[keys].num_attrs) { + + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].name_len = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + list[keys].name_len <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].name = pkey->listFetch_s; + pkey->listFetch_s += list[keys].name_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].blob_len = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + list[keys].blob_len <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].blob = pkey->listFetch_s; + pkey->listFetch_s += list[keys].blob_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].num_attrs = _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(list[keys].num_attrs) { list[keys].attrs = LIBSSH2_ALLOC(session, list[keys].num_attrs * sizeof(libssh2_publickey_attribute)); - if (!list[keys].attrs) { + if(!list[keys].attrs) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "publickey attributes"); goto err_exit; } for(i = 0; i < list[keys].num_attrs; i++) { - list[keys].attrs[i].name_len = - _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - list[keys].attrs[i].name = (char *) pkey->listFetch_s; - pkey->listFetch_s += list[keys].attrs[i].name_len; - list[keys].attrs[i].value_len = - _libssh2_ntohu32(pkey->listFetch_s); - pkey->listFetch_s += 4; - list[keys].attrs[i].value = (char *) pkey->listFetch_s; - pkey->listFetch_s += list[keys].attrs[i].value_len; + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].attrs[i].name_len = + _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, + LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + list[keys].attrs[i].name_len <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].attrs[i].name = + (char *) pkey->listFetch_s; + pkey->listFetch_s += list[keys].attrs[i].name_len; + } + else { + _libssh2_error(session, + LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + 4 <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].attrs[i].value_len = + _libssh2_ntohu32(pkey->listFetch_s); + pkey->listFetch_s += 4; + } + else { + _libssh2_error(session, + LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } + + if(pkey->listFetch_s + + list[keys].attrs[i].value_len <= + pkey->listFetch_data + pkey->listFetch_data_len) { + list[keys].attrs[i].value = + (char *) pkey->listFetch_s; + pkey->listFetch_s += list[keys].attrs[i].value_len; + } + else { + _libssh2_error(session, + LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "ListFetch data too short"); + goto err_exit; + } /* actually an ignored value */ list[keys].attrs[i].mandatory = 0; } - } else { + } + else { list[keys].attrs = NULL; } } @@ -979,11 +1198,11 @@ libssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY * pkey, unsigned long *num_keys, /* Only reached via explicit goto */ err_exit: - if (pkey->listFetch_data) { + if(pkey->listFetch_data) { LIBSSH2_FREE(session, pkey->listFetch_data); pkey->listFetch_data = NULL; } - if (list) { + if(list) { libssh2_publickey_list_free(pkey, list); } pkey->listFetch_state = libssh2_NB_state_idle; @@ -1005,8 +1224,8 @@ libssh2_publickey_list_free(LIBSSH2_PUBLICKEY * pkey, session = pkey->channel->session; - while (p->packet) { - if (p->attrs) { + while(p->packet) { + if(p->attrs) { LIBSSH2_FREE(session, p->attrs); } LIBSSH2_FREE(session, p->packet); @@ -1033,25 +1252,25 @@ libssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey) /* * Make sure all memory used in the state variables are free */ - if (pkey->receive_packet) { + if(pkey->receive_packet) { LIBSSH2_FREE(session, pkey->receive_packet); pkey->receive_packet = NULL; } - if (pkey->add_packet) { + if(pkey->add_packet) { LIBSSH2_FREE(session, pkey->add_packet); pkey->add_packet = NULL; } - if (pkey->remove_packet) { + if(pkey->remove_packet) { LIBSSH2_FREE(session, pkey->remove_packet); pkey->remove_packet = NULL; } - if (pkey->listFetch_data) { + if(pkey->listFetch_data) { LIBSSH2_FREE(session, pkey->listFetch_data); pkey->listFetch_data = NULL; } rc = _libssh2_channel_free(pkey->channel); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; LIBSSH2_FREE(session, pkey); diff --git a/vendor/libssh2/src/scp.c b/vendor/libssh2/src/scp.c index 22778dd38..a9d2db535 100644 --- a/vendor/libssh2/src/scp.c +++ b/vendor/libssh2/src/scp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2010 by Daniel Stenberg +/* Copyright (c) 2009-2019 by Daniel Stenberg * Copyright (c) 2004-2008, Sara Golemon * All rights reserved. * @@ -141,9 +141,9 @@ shell_quotearg(const char *path, unsigned char *buf, endp = &buf[bufsize]; src = path; dst = buf; - while (*src && dst < endp - 1) { + while(*src && dst < endp - 1) { - switch (*src) { + switch(*src) { /* * Special handling for apostrophe. * An apostrophe is always written in quotation marks, e.g. @@ -151,16 +151,16 @@ shell_quotearg(const char *path, unsigned char *buf, */ case '\'': - switch (state) { + switch(state) { case UQSTRING: /* Unquoted string */ - if (dst+1 >= endp) + if(dst + 1 >= endp) return 0; *dst++ = '"'; break; case QSTRING: /* Continue quoted string */ break; case SQSTRING: /* Close single quoted string */ - if (dst+2 >= endp) + if(dst + 2 >= endp) return 0; *dst++ = '\''; *dst++ = '"'; @@ -179,20 +179,20 @@ shell_quotearg(const char *path, unsigned char *buf, */ case '!': - switch (state) { + switch(state) { case UQSTRING: - if (dst+1 >= endp) + if(dst + 1 >= endp) return 0; *dst++ = '\\'; break; case QSTRING: - if (dst+2 >= endp) + if(dst + 2 >= endp) return 0; *dst++ = '"'; /* Closing quotation mark */ *dst++ = '\\'; break; case SQSTRING: /* Close single quoted string */ - if (dst+2 >= endp) + if(dst + 2 >= endp) return 0; *dst++ = '\''; *dst++ = '\\'; @@ -208,14 +208,14 @@ shell_quotearg(const char *path, unsigned char *buf, */ default: - switch (state) { + switch(state) { case UQSTRING: - if (dst+1 >= endp) + if(dst + 1 >= endp) return 0; *dst++ = '\''; break; case QSTRING: - if (dst+2 >= endp) + if(dst + 2 >= endp) return 0; *dst++ = '"'; /* Closing quotation mark */ *dst++ = '\''; @@ -229,21 +229,21 @@ shell_quotearg(const char *path, unsigned char *buf, break; } - if (dst+1 >= endp) + if(dst + 1 >= endp) return 0; *dst++ = *src++; } - switch (state) { + switch(state) { case UQSTRING: break; case QSTRING: /* Close quoted string */ - if (dst+1 >= endp) + if(dst + 1 >= endp) return 0; *dst++ = '"'; break; case SQSTRING: /* Close single quoted string */ - if (dst+1 >= endp) + if(dst + 1 >= endp) return 0; *dst++ = '\''; break; @@ -251,7 +251,7 @@ shell_quotearg(const char *path, unsigned char *buf, break; } - if (dst+1 >= endp) + if(dst + 1 >= endp) return 0; *dst = '\0'; @@ -275,7 +275,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) int tmp_err_code; const char *tmp_err_msg; - if (session->scpRecv_state == libssh2_NB_state_idle) { + if(session->scpRecv_state == libssh2_NB_state_idle) { session->scpRecv_mode = 0; session->scpRecv_size = 0; session->scpRecv_mtime = 0; @@ -287,7 +287,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_command = LIBSSH2_ALLOC(session, session->scpRecv_command_len); - if (!session->scpRecv_command) { + if(!session->scpRecv_command) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate a command buffer for " "SCP session"); @@ -303,8 +303,8 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) &session->scpRecv_command[cmd_len], session->scpRecv_command_len - cmd_len); - session->scpRecv_command[cmd_len] = '\0'; - session->scpRecv_command_len = cmd_len + 1; + /* the command to exec should _not_ be NUL-terminated */ + session->scpRecv_command_len = cmd_len; _libssh2_debug(session, LIBSSH2_TRACE_SCP, "Opening channel for SCP receive"); @@ -312,7 +312,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_created; } - if (session->scpRecv_state == libssh2_NB_state_created) { + if(session->scpRecv_state == libssh2_NB_state_created) { /* Allocate a channel */ session->scpRecv_channel = _libssh2_channel_open(session, "session", @@ -320,8 +320,8 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) LIBSSH2_CHANNEL_WINDOW_DEFAULT, LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0); - if (!session->scpRecv_channel) { - if (libssh2_session_last_errno(session) != + if(!session->scpRecv_channel) { + if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { LIBSSH2_FREE(session, session->scpRecv_command); session->scpRecv_command = NULL; @@ -337,17 +337,18 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_sent; } - if (session->scpRecv_state == libssh2_NB_state_sent) { + if(session->scpRecv_state == libssh2_NB_state_sent) { /* Request SCP for the desired file */ rc = _libssh2_channel_process_startup(session->scpRecv_channel, "exec", sizeof("exec") - 1, - (char *) session->scpRecv_command, + (char *)session->scpRecv_command, session->scpRecv_command_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting SCP startup"); return NULL; - } else if (rc) { + } + else if(rc) { LIBSSH2_FREE(session, session->scpRecv_command); session->scpRecv_command = NULL; goto scp_recv_error; @@ -362,14 +363,15 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_sent1; } - if (session->scpRecv_state == libssh2_NB_state_sent1) { + if(session->scpRecv_state == libssh2_NB_state_sent1) { rc = _libssh2_channel_write(session->scpRecv_channel, 0, session->scpRecv_response, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block sending initial wakeup"); return NULL; - } else if (rc != 1) { + } + else if(rc != 1) { goto scp_recv_error; } @@ -379,23 +381,23 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_sent2; } - if ((session->scpRecv_state == libssh2_NB_state_sent2) + if((session->scpRecv_state == libssh2_NB_state_sent2) || (session->scpRecv_state == libssh2_NB_state_sent3)) { - while (sb && (session->scpRecv_response_len < + while(sb && (session->scpRecv_response_len < LIBSSH2_SCP_RESPONSE_BUFLEN)) { unsigned char *s, *p; - if (session->scpRecv_state == libssh2_NB_state_sent2) { + if(session->scpRecv_state == libssh2_NB_state_sent2) { rc = _libssh2_channel_read(session->scpRecv_channel, 0, (char *) session-> scpRecv_response + session->scpRecv_response_len, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for SCP response"); return NULL; } - else if (rc < 0) { + else if(rc < 0) { /* error, give up */ _libssh2_error(session, rc, "Failed reading SCP response"); goto scp_recv_error; @@ -405,7 +407,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_response_len++; - if (session->scpRecv_response[0] != 'T') { + if(session->scpRecv_response[0] != 'T') { size_t err_len; char *err_msg; @@ -419,7 +421,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) _libssh2_channel_packet_data_len(session-> scpRecv_channel, 0); err_msg = LIBSSH2_ALLOC(session, err_len + 1); - if (!err_msg) { + if(!err_msg) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Failed to get memory "); goto scp_recv_error; @@ -431,7 +433,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) /* If it failed for any reason, we ignore it anyway. */ /* zero terminate the error */ - err_msg[err_len]=0; + err_msg[err_len] = 0; _libssh2_debug(session, LIBSSH2_TRACE_SCP, "got %02x %s", session->scpRecv_response[0], @@ -444,7 +446,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) goto scp_recv_error; } - if ((session->scpRecv_response_len > 1) && + if((session->scpRecv_response_len > 1) && ((session-> scpRecv_response[session->scpRecv_response_len - 1] < '0') @@ -465,15 +467,16 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) goto scp_recv_error; } - if ((session->scpRecv_response_len < 9) + if((session->scpRecv_response_len < 9) || (session-> scpRecv_response[session->scpRecv_response_len - 1] != '\n')) { - if (session->scpRecv_response_len == + if(session->scpRecv_response_len == LIBSSH2_SCP_RESPONSE_BUFLEN) { /* You had your chance */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Unterminated response from SCP server"); + "Unterminated response from " + "SCP server"); goto scp_recv_error; } /* Way too short to be an SCP response, or not done yet, @@ -483,7 +486,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) /* We're guaranteed not to go under response_len == 0 by the logic above */ - while ((session-> + while((session-> scpRecv_response[session->scpRecv_response_len - 1] == '\r') || (session-> @@ -493,18 +496,18 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_response[session->scpRecv_response_len] = '\0'; - if (session->scpRecv_response_len < 8) { + if(session->scpRecv_response_len < 8) { /* EOL came too soon */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, "Invalid response from SCP server, " - "too short" ); + "too short"); goto scp_recv_error; } s = session->scpRecv_response + 1; p = (unsigned char *) strchr((char *) s, ' '); - if (!p || ((p - s) <= 0)) { + if(!p || ((p - s) <= 0)) { /* No spaces or space in the wrong spot */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, "Invalid response from SCP server, " @@ -517,20 +520,22 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_mtime = strtol((char *) s, NULL, 10); s = (unsigned char *) strchr((char *) p, ' '); - if (!s || ((s - p) <= 0)) { + if(!s || ((s - p) <= 0)) { /* No spaces or space in the wrong spot */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Invalid response from SCP server, malformed mtime.usec"); + "Invalid response from SCP server, " + "malformed mtime.usec"); goto scp_recv_error; } /* Ignore mtime.usec */ s++; p = (unsigned char *) strchr((char *) s, ' '); - if (!p || ((p - s) <= 0)) { + if(!p || ((p - s) <= 0)) { /* No spaces or space in the wrong spot */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Invalid response from SCP server, too short or malformed"); + "Invalid response from SCP server, " + "too short or malformed"); goto scp_recv_error; } @@ -544,14 +549,15 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_sent3; } - if (session->scpRecv_state == libssh2_NB_state_sent3) { + if(session->scpRecv_state == libssh2_NB_state_sent3) { rc = _libssh2_channel_write(session->scpRecv_channel, 0, session->scpRecv_response, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting to send SCP ACK"); return NULL; - } else if (rc != 1) { + } + else if(rc != 1) { goto scp_recv_error; } @@ -568,28 +574,28 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_sent4; } - if (session->scpRecv_state == libssh2_NB_state_sent4) { + if(session->scpRecv_state == libssh2_NB_state_sent4) { session->scpRecv_response_len = 0; session->scpRecv_state = libssh2_NB_state_sent5; } - if ((session->scpRecv_state == libssh2_NB_state_sent5) + if((session->scpRecv_state == libssh2_NB_state_sent5) || (session->scpRecv_state == libssh2_NB_state_sent6)) { - while (session->scpRecv_response_len < LIBSSH2_SCP_RESPONSE_BUFLEN) { + while(session->scpRecv_response_len < LIBSSH2_SCP_RESPONSE_BUFLEN) { char *s, *p, *e = NULL; - if (session->scpRecv_state == libssh2_NB_state_sent5) { + if(session->scpRecv_state == libssh2_NB_state_sent5) { rc = _libssh2_channel_read(session->scpRecv_channel, 0, (char *) session-> scpRecv_response + session->scpRecv_response_len, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for SCP response"); return NULL; } - else if (rc < 0) { + else if(rc < 0) { /* error, bail out*/ _libssh2_error(session, rc, "Failed reading SCP response"); goto scp_recv_error; @@ -599,13 +605,13 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_response_len++; - if (session->scpRecv_response[0] != 'C') { + if(session->scpRecv_response[0] != 'C') { _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, "Invalid response from SCP server"); goto scp_recv_error; } - if ((session->scpRecv_response_len > 1) && + if((session->scpRecv_response_len > 1) && (session-> scpRecv_response[session->scpRecv_response_len - 1] != '\r') @@ -621,15 +627,16 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) goto scp_recv_error; } - if ((session->scpRecv_response_len < 7) + if((session->scpRecv_response_len < 7) || (session-> scpRecv_response[session->scpRecv_response_len - 1] != '\n')) { - if (session->scpRecv_response_len == + if(session->scpRecv_response_len == LIBSSH2_SCP_RESPONSE_BUFLEN) { /* You had your chance */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Unterminated response from SCP server"); + "Unterminated response " + "from SCP server"); goto scp_recv_error; } /* Way too short to be an SCP response, or not done yet, @@ -639,7 +646,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) /* We're guaranteed not to go under response_len == 0 by the logic above */ - while ((session-> + while((session-> scpRecv_response[session->scpRecv_response_len - 1] == '\r') || (session-> @@ -650,20 +657,22 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_response[session->scpRecv_response_len] = '\0'; - if (session->scpRecv_response_len < 6) { + if(session->scpRecv_response_len < 6) { /* EOL came too soon */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Invalid response from SCP server, too short"); + "Invalid response from SCP server, " + "too short"); goto scp_recv_error; } s = (char *) session->scpRecv_response + 1; p = strchr(s, ' '); - if (!p || ((p - s) <= 0)) { + if(!p || ((p - s) <= 0)) { /* No spaces or space in the wrong spot */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Invalid response from SCP server, malformed mode"); + "Invalid response from SCP server, " + "malformed mode"); goto scp_recv_error; } @@ -671,26 +680,29 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) /* Make sure we don't get fooled by leftover values */ session->scpRecv_mode = strtol(s, &e, 8); - if (e && *e) { + if(e && *e) { _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Invalid response from SCP server, invalid mode"); + "Invalid response from SCP server, " + "invalid mode"); goto scp_recv_error; } s = strchr(p, ' '); - if (!s || ((s - p) <= 0)) { + if(!s || ((s - p) <= 0)) { /* No spaces or space in the wrong spot */ _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Invalid response from SCP server, too short or malformed"); + "Invalid response from SCP server, " + "too short or malformed"); goto scp_recv_error; } *s = '\0'; /* Make sure we don't get fooled by leftover values */ session->scpRecv_size = scpsize_strtol(p, &e, 10); - if (e && *e) { + if(e && *e) { _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, - "Invalid response from SCP server, invalid size"); + "Invalid response from SCP server, " + "invalid size"); goto scp_recv_error; } @@ -700,14 +712,15 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_sent6; } - if (session->scpRecv_state == libssh2_NB_state_sent6) { + if(session->scpRecv_state == libssh2_NB_state_sent6) { rc = _libssh2_channel_write(session->scpRecv_channel, 0, session->scpRecv_response, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block sending SCP ACK"); return NULL; - } else if (rc != 1) { + } + else if(rc != 1) { goto scp_recv_error; } _libssh2_debug(session, LIBSSH2_TRACE_SCP, @@ -723,7 +736,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) session->scpRecv_state = libssh2_NB_state_sent7; } - if (sb) { + if(sb) { memset(sb, 0, sizeof(libssh2_struct_stat)); sb->st_mtime = session->scpRecv_mtime; @@ -747,7 +760,7 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) scp_recv_error: tmp_err_code = session->err_code; tmp_err_msg = session->err_msg; - while (libssh2_channel_free(session->scpRecv_channel) == + while(libssh2_channel_free(session->scpRecv_channel) == LIBSSH2_ERROR_EAGAIN); session->err_code = tmp_err_code; session->err_msg = tmp_err_msg; @@ -761,9 +774,9 @@ scp_recv(LIBSSH2_SESSION * session, const char *path, libssh2_struct_stat * sb) * * DEPRECATED * - * Open a channel and request a remote file via SCP. This receives files larger - * than 2 GB, but is unable to report the proper size on platforms where the - * st_size member of struct stat is limited to 2 GB (e.g. windows). + * Open a channel and request a remote file via SCP. This receives files + * larger than 2 GB, but is unable to report the proper size on platforms + * where the st_size member of struct stat is limited to 2 GB (e.g. windows). * */ LIBSSH2_API LIBSSH2_CHANNEL * @@ -771,15 +784,17 @@ libssh2_scp_recv(LIBSSH2_SESSION *session, const char *path, struct stat * sb) { LIBSSH2_CHANNEL *ptr; - /* scp_recv uses libssh2_struct_stat, so pass one if the caller gave us a struct to populate... */ + /* scp_recv uses libssh2_struct_stat, so pass one if the caller gave us a + struct to populate... */ libssh2_struct_stat sb_intl; libssh2_struct_stat *sb_ptr; + memset(&sb_intl, 0, sizeof(sb_intl)); sb_ptr = sb ? &sb_intl : NULL; BLOCK_ADJUST_ERRNO(ptr, session, scp_recv(session, path, sb_ptr)); /* ...and populate the caller's with as much info as fits. */ - if (sb) { + if(sb) { memset(sb, 0, sizeof(struct stat)); sb->st_mtime = sb_intl.st_mtime; @@ -799,7 +814,8 @@ libssh2_scp_recv(LIBSSH2_SESSION *session, const char *path, struct stat * sb) * */ LIBSSH2_API LIBSSH2_CHANNEL * -libssh2_scp_recv2(LIBSSH2_SESSION *session, const char *path, libssh2_struct_stat * sb) +libssh2_scp_recv2(LIBSSH2_SESSION *session, const char *path, + libssh2_struct_stat *sb) { LIBSSH2_CHANNEL *ptr; BLOCK_ADJUST_ERRNO(ptr, session, scp_recv(session, path, sb)); @@ -821,7 +837,7 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, int tmp_err_code; const char *tmp_err_msg; - if (session->scpSend_state == libssh2_NB_state_idle) { + if(session->scpSend_state == libssh2_NB_state_idle) { session->scpSend_command_len = _libssh2_shell_quotedsize(path) + sizeof("scp -t ") + ((mtime || atime)?1:0); @@ -829,7 +845,7 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_command = LIBSSH2_ALLOC(session, session->scpSend_command_len); - if (!session->scpSend_command) { + if(!session->scpSend_command) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate a command buffer for " "SCP session"); @@ -845,8 +861,8 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, &session->scpSend_command[cmd_len], session->scpSend_command_len - cmd_len); - session->scpSend_command[cmd_len] = '\0'; - session->scpSend_command_len = cmd_len + 1; + /* the command to exec should _not_ be NUL-terminated */ + session->scpSend_command_len = cmd_len; _libssh2_debug(session, LIBSSH2_TRACE_SCP, "Opening channel for SCP send"); @@ -855,13 +871,13 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_state = libssh2_NB_state_created; } - if (session->scpSend_state == libssh2_NB_state_created) { + if(session->scpSend_state == libssh2_NB_state_created) { session->scpSend_channel = _libssh2_channel_open(session, "session", sizeof("session") - 1, LIBSSH2_CHANNEL_WINDOW_DEFAULT, LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0); - if (!session->scpSend_channel) { - if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { + if(!session->scpSend_channel) { + if(libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN) { /* previous call set libssh2_session_last_error(), pass it through */ LIBSSH2_FREE(session, session->scpSend_command); @@ -878,18 +894,18 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_state = libssh2_NB_state_sent; } - if (session->scpSend_state == libssh2_NB_state_sent) { + if(session->scpSend_state == libssh2_NB_state_sent) { /* Request SCP for the desired file */ rc = _libssh2_channel_process_startup(session->scpSend_channel, "exec", sizeof("exec") - 1, - (char *) session->scpSend_command, + (char *)session->scpSend_command, session->scpSend_command_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting SCP startup"); return NULL; } - else if (rc) { + else if(rc) { /* previous call set libssh2_session_last_error(), pass it through */ LIBSSH2_FREE(session, session->scpSend_command); @@ -904,28 +920,28 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_state = libssh2_NB_state_sent1; } - if (session->scpSend_state == libssh2_NB_state_sent1) { + if(session->scpSend_state == libssh2_NB_state_sent1) { /* Wait for ACK */ rc = _libssh2_channel_read(session->scpSend_channel, 0, (char *) session->scpSend_response, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for response from remote"); return NULL; } - else if (rc < 0) { + else if(rc < 0) { _libssh2_error(session, rc, "SCP failure"); goto scp_send_error; } else if(!rc) /* remain in the same state */ goto scp_send_empty_channel; - else if (session->scpSend_response[0] != 0) { + else if(session->scpSend_response[0] != 0) { _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, "Invalid ACK response from remote"); goto scp_send_error; } - if (mtime || atime) { + if(mtime || atime) { /* Send mtime and atime to be used for file */ session->scpSend_response_len = snprintf((char *) session->scpSend_response, @@ -939,16 +955,17 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, } /* Send mtime and atime to be used for file */ - if (mtime || atime) { - if (session->scpSend_state == libssh2_NB_state_sent2) { + if(mtime || atime) { + if(session->scpSend_state == libssh2_NB_state_sent2) { rc = _libssh2_channel_write(session->scpSend_channel, 0, session->scpSend_response, session->scpSend_response_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block sending time data for SCP file"); return NULL; - } else if (rc != (int)session->scpSend_response_len) { + } + else if(rc != (int)session->scpSend_response_len) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send time data for SCP file"); goto scp_send_error; @@ -957,23 +974,23 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_state = libssh2_NB_state_sent3; } - if (session->scpSend_state == libssh2_NB_state_sent3) { + if(session->scpSend_state == libssh2_NB_state_sent3) { /* Wait for ACK */ rc = _libssh2_channel_read(session->scpSend_channel, 0, (char *) session->scpSend_response, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for response"); return NULL; } - else if (rc < 0) { + else if(rc < 0) { _libssh2_error(session, rc, "SCP failure"); goto scp_send_error; } else if(!rc) /* remain in the same state */ goto scp_send_empty_channel; - else if (session->scpSend_response[0] != 0) { + else if(session->scpSend_response[0] != 0) { _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, "Invalid SCP ACK response"); goto scp_send_error; @@ -981,16 +998,17 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_state = libssh2_NB_state_sent4; } - } else { - if (session->scpSend_state == libssh2_NB_state_sent2) { + } + else { + if(session->scpSend_state == libssh2_NB_state_sent2) { session->scpSend_state = libssh2_NB_state_sent4; } } - if (session->scpSend_state == libssh2_NB_state_sent4) { + if(session->scpSend_state == libssh2_NB_state_sent4) { /* Send mode, size, and basename */ const char *base = strrchr(path, '/'); - if (base) + if(base) base++; else base = path; @@ -1006,15 +1024,16 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_state = libssh2_NB_state_sent5; } - if (session->scpSend_state == libssh2_NB_state_sent5) { + if(session->scpSend_state == libssh2_NB_state_sent5) { rc = _libssh2_channel_write(session->scpSend_channel, 0, session->scpSend_response, session->scpSend_response_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block send core file data for SCP file"); return NULL; - } else if (rc != (int)session->scpSend_response_len) { + } + else if(rc != (int)session->scpSend_response_len) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send core file data for SCP file"); goto scp_send_error; @@ -1023,31 +1042,31 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, session->scpSend_state = libssh2_NB_state_sent6; } - if (session->scpSend_state == libssh2_NB_state_sent6) { + if(session->scpSend_state == libssh2_NB_state_sent6) { /* Wait for ACK */ rc = _libssh2_channel_read(session->scpSend_channel, 0, (char *) session->scpSend_response, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for response"); return NULL; } - else if (rc < 0) { + else if(rc < 0) { _libssh2_error(session, LIBSSH2_ERROR_SCP_PROTOCOL, "Invalid ACK response from remote"); goto scp_send_error; } - else if (rc == 0) + else if(rc == 0) goto scp_send_empty_channel; - else if (session->scpSend_response[0] != 0) { + else if(session->scpSend_response[0] != 0) { size_t err_len; char *err_msg; err_len = _libssh2_channel_packet_data_len(session->scpSend_channel, 0); err_msg = LIBSSH2_ALLOC(session, err_len + 1); - if (!err_msg) { + if(!err_msg) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "failed to get memory"); goto scp_send_error; @@ -1056,8 +1075,8 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, /* Read the remote error message */ rc = _libssh2_channel_read(session->scpSend_channel, 0, err_msg, err_len); - if (rc > 0) { - err_msg[err_len]=0; + if(rc > 0) { + err_msg[err_len] = 0; _libssh2_debug(session, LIBSSH2_TRACE_SCP, "got %02x %s", session->scpSend_response[0], err_msg); @@ -1085,8 +1104,8 @@ scp_send(LIBSSH2_SESSION * session, const char *path, int mode, scp_send_error: tmp_err_code = session->err_code; tmp_err_msg = session->err_msg; - while (libssh2_channel_free(session->scpSend_channel) == - LIBSSH2_ERROR_EAGAIN); + while(libssh2_channel_free(session->scpSend_channel) == + LIBSSH2_ERROR_EAGAIN); session->err_code = tmp_err_code; session->err_msg = tmp_err_msg; session->scpSend_channel = NULL; diff --git a/vendor/libssh2/src/session.c b/vendor/libssh2/src/session.c index b5a83ddd6..e439acde5 100644 --- a/vendor/libssh2/src/session.c +++ b/vendor/libssh2/src/session.c @@ -99,15 +99,16 @@ banner_receive(LIBSSH2_SESSION * session) int ret; int banner_len; - if (session->banner_TxRx_state == libssh2_NB_state_idle) { + if(session->banner_TxRx_state == libssh2_NB_state_idle) { banner_len = 0; session->banner_TxRx_state = libssh2_NB_state_created; - } else { + } + else { banner_len = session->banner_TxRx_total_send; } - while ((banner_len < (int) sizeof(session->banner_TxRx_banner)) && + while((banner_len < (int) sizeof(session->banner_TxRx_banner)) && ((banner_len == 0) || (session->banner_TxRx_banner[banner_len - 1] != '\n'))) { char c = '\0'; @@ -117,7 +118,7 @@ banner_receive(LIBSSH2_SESSION * session) ret = LIBSSH2_RECV(session, &c, 1, LIBSSH2_SOCKET_RECV_FLAGS(session)); - if (ret < 0) { + if(ret < 0) { if(session->api_block_mode || (ret != -EAGAIN)) /* ignore EAGAIN when non-blocking */ _libssh2_debug(session, LIBSSH2_TRACE_SOCKET, @@ -127,8 +128,8 @@ banner_receive(LIBSSH2_SESSION * session) _libssh2_debug(session, LIBSSH2_TRACE_SOCKET, "Recved %d bytes banner", ret); - if (ret < 0) { - if (ret == -EAGAIN) { + if(ret < 0) { + if(ret == -EAGAIN) { session->socket_block_directions = LIBSSH2_SESSION_BLOCK_INBOUND; session->banner_TxRx_total_send = banner_len; @@ -141,12 +142,12 @@ banner_receive(LIBSSH2_SESSION * session) return LIBSSH2_ERROR_SOCKET_RECV; } - if (ret == 0) { + if(ret == 0) { session->socket_state = LIBSSH2_SOCKET_DISCONNECTED; return LIBSSH2_ERROR_SOCKET_DISCONNECT; } - if (c == '\0') { + if(c == '\0') { /* NULLs are not allowed in SSH banners */ session->banner_TxRx_state = libssh2_NB_state_idle; session->banner_TxRx_total_send = 0; @@ -156,7 +157,7 @@ banner_receive(LIBSSH2_SESSION * session) session->banner_TxRx_banner[banner_len++] = c; } - while (banner_len && + while(banner_len && ((session->banner_TxRx_banner[banner_len - 1] == '\n') || (session->banner_TxRx_banner[banner_len - 1] == '\r'))) { banner_len--; @@ -166,11 +167,14 @@ banner_receive(LIBSSH2_SESSION * session) session->banner_TxRx_state = libssh2_NB_state_idle; session->banner_TxRx_total_send = 0; - if (!banner_len) + if(!banner_len) return LIBSSH2_ERROR_BANNER_RECV; + if(session->remote.banner) + LIBSSH2_FREE(session, session->remote.banner); + session->remote.banner = LIBSSH2_ALLOC(session, banner_len + 1); - if (!session->remote.banner) { + if(!session->remote.banner) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Error allocating space for remote banner"); } @@ -201,18 +205,19 @@ banner_send(LIBSSH2_SESSION * session) char banner_dup[256]; #endif - if (session->banner_TxRx_state == libssh2_NB_state_idle) { - if (session->local.banner) { + if(session->banner_TxRx_state == libssh2_NB_state_idle) { + if(session->local.banner) { /* setopt_string will have given us our \r\n characters */ banner_len = strlen((char *) session->local.banner); banner = (char *) session->local.banner; } #ifdef LIBSSH2DEBUG /* Hack and slash to avoid sending CRLF in debug output */ - if (banner_len < 256) { + if(banner_len < 256) { memcpy(banner_dup, banner, banner_len - 2); banner_dup[banner_len - 2] = '\0'; - } else { + } + else { memcpy(banner_dup, banner, 255); banner[255] = '\0'; } @@ -231,7 +236,7 @@ banner_send(LIBSSH2_SESSION * session) banner + session->banner_TxRx_total_send, banner_len - session->banner_TxRx_total_send, LIBSSH2_SOCKET_SEND_FLAGS(session)); - if (ret < 0) + if(ret < 0) _libssh2_debug(session, LIBSSH2_TRACE_SOCKET, "Error sending %d bytes: %d", banner_len - session->banner_TxRx_total_send, -ret); @@ -241,12 +246,12 @@ banner_send(LIBSSH2_SESSION * session) banner_len - session->banner_TxRx_total_send, banner, session->banner_TxRx_total_send); - if (ret != (banner_len - session->banner_TxRx_total_send)) { - if (ret >= 0 || ret == -EAGAIN) { + if(ret != (banner_len - session->banner_TxRx_total_send)) { + if(ret >= 0 || ret == -EAGAIN) { /* the whole packet could not be sent, save the what was */ session->socket_block_directions = LIBSSH2_SESSION_BLOCK_OUTBOUND; - if (ret > 0) + if(ret > 0) session->banner_TxRx_total_send += ret; return LIBSSH2_ERROR_EAGAIN; } @@ -278,7 +283,7 @@ session_nonblock(libssh2_socket_t sockfd, /* operate on this */ int flags; flags = fcntl(sockfd, F_GETFL, 0); - if (nonblock) + if(nonblock) return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); else return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); @@ -327,7 +332,7 @@ session_nonblock(libssh2_socket_t sockfd, /* operate on this */ #define SETBLOCK 6 #endif -#if (SETBLOCK == 0) +#if(SETBLOCK == 0) #error "no non-blocking method was found/used/set" #endif } @@ -344,9 +349,9 @@ get_socket_nonblocking(int sockfd) #define GETBLOCK 0 #ifdef HAVE_O_NONBLOCK /* most recent unix versions */ - int flags; + int flags = fcntl(sockfd, F_GETFL, 0); - if ((flags = fcntl(sockfd, F_GETFL, 0)) == -1) { + if(flags == -1) { /* Assume blocking on error */ return 1; } @@ -360,7 +365,7 @@ get_socket_nonblocking(int sockfd) unsigned int option_value; socklen_t option_len = sizeof(option_value); - if (getsockopt + if(getsockopt (sockfd, SOL_SOCKET, SO_ERROR, (void *) &option_value, &option_len)) { /* Assume blocking on error */ return 1; @@ -373,7 +378,7 @@ get_socket_nonblocking(int sockfd) #if defined(HAVE_SO_NONBLOCK) && (GETBLOCK == 0) /* BeOS */ long b; - if (getsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b))) { + if(getsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b))) { /* Assume blocking on error */ return 1; } @@ -382,19 +387,19 @@ get_socket_nonblocking(int sockfd) #define GETBLOCK 5 #endif -#if defined(SO_STATE) && defined( __VMS ) && (GETBLOCK == 0) +#if defined(SO_STATE) && defined(__VMS) && (GETBLOCK == 0) /* VMS TCP/IP Services */ size_t sockstat = 0; int callstat = 0; - size_t size = sizeof( int ); + size_t size = sizeof(int); callstat = getsockopt(sockfd, SOL_SOCKET, SO_STATE, (char *)&sockstat, &size); - if ( callstat == -1 ) return(0); - if ( (sockstat&SS_NBIO) )return(1); - return(0); + if(callstat == -1) return 0; + if((sockstat&SS_NBIO) != 0) return 1; + return 0; #undef GETBLOCK #define GETBLOCK 6 @@ -406,7 +411,7 @@ get_socket_nonblocking(int sockfd) #define GETBLOCK 7 #endif -#if (GETBLOCK == 0) +#if(GETBLOCK == 0) #error "no non-blocking method was found/used/get" #endif } @@ -419,16 +424,16 @@ libssh2_session_banner_set(LIBSSH2_SESSION * session, const char *banner) { size_t banner_len = banner ? strlen(banner) : 0; - if (session->local.banner) { + if(session->local.banner) { LIBSSH2_FREE(session, session->local.banner); session->local.banner = NULL; } - if (!banner_len) + if(!banner_len) return 0; session->local.banner = LIBSSH2_ALLOC(session, banner_len + 3); - if (!session->local.banner) { + if(!session->local.banner) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for local banner"); } @@ -474,18 +479,18 @@ libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)), LIBSSH2_REALLOC_FUNC((*local_realloc)) = libssh2_default_realloc; LIBSSH2_SESSION *session; - if (my_alloc) { + if(my_alloc) { local_alloc = my_alloc; } - if (my_free) { + if(my_free) { local_free = my_free; } - if (my_realloc) { + if(my_realloc) { local_realloc = my_realloc; } session = local_alloc(sizeof(LIBSSH2_SESSION), &abstract); - if (session) { + if(session) { memset(session, 0, sizeof(LIBSSH2_SESSION)); session->alloc = local_alloc; session->free = local_free; @@ -497,7 +502,7 @@ libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)), session->api_block_mode = 1; /* blocking API by default */ _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "New session resource allocated"); - _libssh2_init_if_needed (); + _libssh2_init_if_needed(); } return session; } @@ -508,16 +513,18 @@ libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)), * Set (or reset) a callback function * Returns the prior address * - * FIXME: this function relies on that we can typecast function pointers + * ALERT: this function relies on that we can typecast function pointers * to void pointers, which isn't allowed in ISO C! */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" LIBSSH2_API void * libssh2_session_callback_set(LIBSSH2_SESSION * session, int cbtype, void *callback) { void *oldcb; - switch (cbtype) { + switch(cbtype) { case LIBSSH2_CALLBACK_IGNORE: oldcb = session->ssh_msg_ignore; session->ssh_msg_ignore = callback; @@ -553,10 +560,12 @@ libssh2_session_callback_set(LIBSSH2_SESSION * session, session->recv = callback; return oldcb; } - _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Setting Callback %d", cbtype); + _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Setting Callback %d", + cbtype); return NULL; } +#pragma GCC diagnostic pop /* * _libssh2_wait_socket() @@ -579,8 +588,8 @@ int _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t start_time) being stored as error when a blocking function has returned */ session->err_code = LIBSSH2_ERROR_NONE; - rc = libssh2_keepalive_send (session, &seconds_to_next); - if (rc < 0) + rc = libssh2_keepalive_send(session, &seconds_to_next); + if(rc < 0) return rc; ms_to_next = seconds_to_next * 1000; @@ -597,19 +606,19 @@ int _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t start_time) ms_to_next = 1000; } - if (session->api_timeout > 0 && + if(session->api_timeout > 0 && (seconds_to_next == 0 || ms_to_next > session->api_timeout)) { - time_t now = time (NULL); + time_t now = time(NULL); elapsed_ms = (long)(1000*difftime(now, start_time)); - if (elapsed_ms > session->api_timeout) { + if(elapsed_ms > session->api_timeout) { return _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT, "API timeout expired"); } ms_to_next = (session->api_timeout - elapsed_ms); has_timeout = 1; } - else if (ms_to_next > 0) { + else if(ms_to_next > 0) { has_timeout = 1; } else @@ -675,10 +684,10 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) { int rc; - if (session->startup_state == libssh2_NB_state_idle) { + if(session->startup_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "session_startup for socket %d", sock); - if (LIBSSH2_INVALID_SOCKET == sock) { + if(LIBSSH2_INVALID_SOCKET == sock) { /* Did we forget something? */ return _libssh2_error(session, LIBSSH2_ERROR_BAD_SOCKET, "Bad socket provided"); @@ -688,10 +697,10 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) session->socket_prev_blockstate = !get_socket_nonblocking(session->socket_fd); - if (session->socket_prev_blockstate) { + if(session->socket_prev_blockstate) { /* If in blocking state change to non-blocking */ rc = session_nonblock(session->socket_fd, 1); - if (rc) { + if(rc) { return _libssh2_error(session, rc, "Failed changing socket's " "blocking state to non-blocking"); @@ -701,9 +710,11 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) session->startup_state = libssh2_NB_state_created; } - if (session->startup_state == libssh2_NB_state_created) { + if(session->startup_state == libssh2_NB_state_created) { rc = banner_send(session); - if (rc) { + if(rc == LIBSSH2_ERROR_EAGAIN) + return rc; + else if(rc) { return _libssh2_error(session, rc, "Failed sending banner"); } @@ -711,10 +722,12 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) session->banner_TxRx_state = libssh2_NB_state_idle; } - if (session->startup_state == libssh2_NB_state_sent) { + if(session->startup_state == libssh2_NB_state_sent) { do { rc = banner_receive(session); - if (rc) + if(rc == LIBSSH2_ERROR_EAGAIN) + return rc; + else if(rc) return _libssh2_error(session, rc, "Failed getting banner"); } while(strncmp("SSH-", (char *)session->remote.banner, 4)); @@ -722,16 +735,18 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) session->startup_state = libssh2_NB_state_sent1; } - if (session->startup_state == libssh2_NB_state_sent1) { + if(session->startup_state == libssh2_NB_state_sent1) { rc = _libssh2_kex_exchange(session, 0, &session->startup_key_state); - if (rc) + if(rc == LIBSSH2_ERROR_EAGAIN) + return rc; + else if(rc) return _libssh2_error(session, rc, "Unable to exchange encryption keys"); session->startup_state = libssh2_NB_state_sent2; } - if (session->startup_state == libssh2_NB_state_sent2) { + if(session->startup_state == libssh2_NB_state_sent2) { _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Requesting userauth service"); @@ -745,11 +760,13 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) session->startup_state = libssh2_NB_state_sent3; } - if (session->startup_state == libssh2_NB_state_sent3) { + if(session->startup_state == libssh2_NB_state_sent3) { rc = _libssh2_transport_send(session, session->startup_service, sizeof("ssh-userauth") + 5 - 1, NULL, 0); - if (rc) { + if(rc == LIBSSH2_ERROR_EAGAIN) + return rc; + else if(rc) { return _libssh2_error(session, rc, "Unable to ask for ssh-userauth service"); } @@ -757,12 +774,12 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) session->startup_state = libssh2_NB_state_sent4; } - if (session->startup_state == libssh2_NB_state_sent4) { + if(session->startup_state == libssh2_NB_state_sent4) { rc = _libssh2_packet_require(session, SSH_MSG_SERVICE_ACCEPT, &session->startup_data, &session->startup_data_len, 0, NULL, 0, &session->startup_req_state); - if (rc) + if(rc) return rc; if(session->startup_data_len < 5) { @@ -773,7 +790,8 @@ session_startup(LIBSSH2_SESSION *session, libssh2_socket_t sock) session->startup_service_length = _libssh2_ntohu32(session->startup_data + 1); - if ((session->startup_service_length != (sizeof("ssh-userauth") - 1)) + + if((session->startup_service_length != (sizeof("ssh-userauth") - 1)) || strncmp("ssh-userauth", (char *) session->startup_data + 5, session->startup_service_length)) { LIBSSH2_FREE(session, session->startup_data); @@ -843,203 +861,204 @@ session_free(LIBSSH2_SESSION *session) LIBSSH2_LISTENER *l; int packets_left = 0; - if (session->free_state == libssh2_NB_state_idle) { - _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Freeing session resource", + if(session->free_state == libssh2_NB_state_idle) { + _libssh2_debug(session, LIBSSH2_TRACE_TRANS, + "Freeing session resource", session->remote.banner); session->free_state = libssh2_NB_state_created; } - if (session->free_state == libssh2_NB_state_created) { - while ((ch = _libssh2_list_first(&session->channels))) { + if(session->free_state == libssh2_NB_state_created) { + while((ch = _libssh2_list_first(&session->channels))) { rc = _libssh2_channel_free(ch); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; } session->free_state = libssh2_NB_state_sent; } - if (session->free_state == libssh2_NB_state_sent) { - while ((l = _libssh2_list_first(&session->listeners))) { + if(session->free_state == libssh2_NB_state_sent) { + while((l = _libssh2_list_first(&session->listeners))) { rc = _libssh2_channel_forward_cancel(l); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; } session->free_state = libssh2_NB_state_sent1; } - if (session->state & LIBSSH2_STATE_NEWKEYS) { + if(session->state & LIBSSH2_STATE_NEWKEYS) { /* hostkey */ - if (session->hostkey && session->hostkey->dtor) { + if(session->hostkey && session->hostkey->dtor) { session->hostkey->dtor(session, &session->server_hostkey_abstract); } /* Client to Server */ /* crypt */ - if (session->local.crypt && session->local.crypt->dtor) { + if(session->local.crypt && session->local.crypt->dtor) { session->local.crypt->dtor(session, &session->local.crypt_abstract); } /* comp */ - if (session->local.comp && session->local.comp->dtor) { + if(session->local.comp && session->local.comp->dtor) { session->local.comp->dtor(session, 1, &session->local.comp_abstract); } /* mac */ - if (session->local.mac && session->local.mac->dtor) { + if(session->local.mac && session->local.mac->dtor) { session->local.mac->dtor(session, &session->local.mac_abstract); } /* Server to Client */ /* crypt */ - if (session->remote.crypt && session->remote.crypt->dtor) { + if(session->remote.crypt && session->remote.crypt->dtor) { session->remote.crypt->dtor(session, &session->remote.crypt_abstract); } /* comp */ - if (session->remote.comp && session->remote.comp->dtor) { + if(session->remote.comp && session->remote.comp->dtor) { session->remote.comp->dtor(session, 0, &session->remote.comp_abstract); } /* mac */ - if (session->remote.mac && session->remote.mac->dtor) { + if(session->remote.mac && session->remote.mac->dtor) { session->remote.mac->dtor(session, &session->remote.mac_abstract); } /* session_id */ - if (session->session_id) { + if(session->session_id) { LIBSSH2_FREE(session, session->session_id); } } /* Free banner(s) */ - if (session->remote.banner) { + if(session->remote.banner) { LIBSSH2_FREE(session, session->remote.banner); } - if (session->local.banner) { + if(session->local.banner) { LIBSSH2_FREE(session, session->local.banner); } /* Free preference(s) */ - if (session->kex_prefs) { + if(session->kex_prefs) { LIBSSH2_FREE(session, session->kex_prefs); } - if (session->hostkey_prefs) { + if(session->hostkey_prefs) { LIBSSH2_FREE(session, session->hostkey_prefs); } - if (session->local.kexinit) { + if(session->local.kexinit) { LIBSSH2_FREE(session, session->local.kexinit); } - if (session->local.crypt_prefs) { + if(session->local.crypt_prefs) { LIBSSH2_FREE(session, session->local.crypt_prefs); } - if (session->local.mac_prefs) { + if(session->local.mac_prefs) { LIBSSH2_FREE(session, session->local.mac_prefs); } - if (session->local.comp_prefs) { + if(session->local.comp_prefs) { LIBSSH2_FREE(session, session->local.comp_prefs); } - if (session->local.lang_prefs) { + if(session->local.lang_prefs) { LIBSSH2_FREE(session, session->local.lang_prefs); } - if (session->remote.kexinit) { + if(session->remote.kexinit) { LIBSSH2_FREE(session, session->remote.kexinit); } - if (session->remote.crypt_prefs) { + if(session->remote.crypt_prefs) { LIBSSH2_FREE(session, session->remote.crypt_prefs); } - if (session->remote.mac_prefs) { + if(session->remote.mac_prefs) { LIBSSH2_FREE(session, session->remote.mac_prefs); } - if (session->remote.comp_prefs) { + if(session->remote.comp_prefs) { LIBSSH2_FREE(session, session->remote.comp_prefs); } - if (session->remote.lang_prefs) { + if(session->remote.lang_prefs) { LIBSSH2_FREE(session, session->remote.lang_prefs); } /* * Make sure all memory used in the state variables are free */ - if (session->kexinit_data) { + if(session->kexinit_data) { LIBSSH2_FREE(session, session->kexinit_data); } - if (session->startup_data) { + if(session->startup_data) { LIBSSH2_FREE(session, session->startup_data); } - if (session->userauth_list_data) { + if(session->userauth_list_data) { LIBSSH2_FREE(session, session->userauth_list_data); } - if (session->userauth_pswd_data) { + if(session->userauth_pswd_data) { LIBSSH2_FREE(session, session->userauth_pswd_data); } - if (session->userauth_pswd_newpw) { + if(session->userauth_pswd_newpw) { LIBSSH2_FREE(session, session->userauth_pswd_newpw); } - if (session->userauth_host_packet) { + if(session->userauth_host_packet) { LIBSSH2_FREE(session, session->userauth_host_packet); } - if (session->userauth_host_method) { + if(session->userauth_host_method) { LIBSSH2_FREE(session, session->userauth_host_method); } - if (session->userauth_host_data) { + if(session->userauth_host_data) { LIBSSH2_FREE(session, session->userauth_host_data); } - if (session->userauth_pblc_data) { + if(session->userauth_pblc_data) { LIBSSH2_FREE(session, session->userauth_pblc_data); } - if (session->userauth_pblc_packet) { + if(session->userauth_pblc_packet) { LIBSSH2_FREE(session, session->userauth_pblc_packet); } - if (session->userauth_pblc_method) { + if(session->userauth_pblc_method) { LIBSSH2_FREE(session, session->userauth_pblc_method); } - if (session->userauth_kybd_data) { + if(session->userauth_kybd_data) { LIBSSH2_FREE(session, session->userauth_kybd_data); } - if (session->userauth_kybd_packet) { + if(session->userauth_kybd_packet) { LIBSSH2_FREE(session, session->userauth_kybd_packet); } - if (session->userauth_kybd_auth_instruction) { + if(session->userauth_kybd_auth_instruction) { LIBSSH2_FREE(session, session->userauth_kybd_auth_instruction); } - if (session->open_packet) { + if(session->open_packet) { LIBSSH2_FREE(session, session->open_packet); } - if (session->open_data) { + if(session->open_data) { LIBSSH2_FREE(session, session->open_data); } - if (session->direct_message) { + if(session->direct_message) { LIBSSH2_FREE(session, session->direct_message); } - if (session->fwdLstn_packet) { + if(session->fwdLstn_packet) { LIBSSH2_FREE(session, session->fwdLstn_packet); } - if (session->pkeyInit_data) { + if(session->pkeyInit_data) { LIBSSH2_FREE(session, session->pkeyInit_data); } - if (session->scpRecv_command) { + if(session->scpRecv_command) { LIBSSH2_FREE(session, session->scpRecv_command); } - if (session->scpSend_command) { + if(session->scpSend_command) { LIBSSH2_FREE(session, session->scpSend_command); } - if (session->sftpInit_sftp) { + if(session->sftpInit_sftp) { LIBSSH2_FREE(session, session->sftpInit_sftp); } /* Free payload buffer */ - if (session->packet.total_num) { + if(session->packet.total_num) { LIBSSH2_FREE(session, session->packet.payload); } /* Cleanup all remaining packets */ - while ((pkg = _libssh2_list_first(&session->packets))) { + while((pkg = _libssh2_list_first(&session->packets))) { packets_left++; _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "packet left with id %d", pkg->data[0]); @@ -1056,18 +1075,19 @@ session_free(LIBSSH2_SESSION *session) if(session->socket_prev_blockstate) { /* if the socket was previously blocking, put it back so */ rc = session_nonblock(session->socket_fd, 0); - if (rc) { + if(rc) { _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "unable to reset socket's blocking state"); } } - if (session->server_hostkey) { + if(session->server_hostkey) { LIBSSH2_FREE(session, session->server_hostkey); } /* error string */ - if (session->err_msg && ((session->err_flags & LIBSSH2_ERR_FLAG_DUP) != 0)) { + if(session->err_msg && + ((session->err_flags & LIBSSH2_ERR_FLAG_DUP) != 0)) { LIBSSH2_FREE(session, (char *)session->err_msg); } @@ -1104,14 +1124,14 @@ session_disconnect(LIBSSH2_SESSION *session, int reason, unsigned long descr_len = 0, lang_len = 0; int rc; - if (session->disconnect_state == libssh2_NB_state_idle) { + if(session->disconnect_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Disconnecting: reason=%d, desc=%s, lang=%s", reason, description, lang); - if (description) + if(description) descr_len = strlen(description); - if (lang) + if(lang) lang_len = strlen(lang); if(descr_len > 256) @@ -1135,7 +1155,7 @@ session_disconnect(LIBSSH2_SESSION *session, int reason, rc = _libssh2_transport_send(session, session->disconnect_data, session->disconnect_data_len, (unsigned char *)lang, lang_len); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; session->disconnect_state = libssh2_NB_state_idle; @@ -1151,7 +1171,7 @@ libssh2_session_disconnect_ex(LIBSSH2_SESSION *session, int reason, const char *desc, const char *lang) { int rc; - + session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS; BLOCK_ADJUST(rc, session, session_disconnect(session, reason, desc, lang)); @@ -1171,7 +1191,7 @@ libssh2_session_methods(LIBSSH2_SESSION * session, int method_type) /* All methods have char *name as their first element */ const LIBSSH2_KEX_METHOD *method = NULL; - switch (method_type) { + switch(method_type) { case LIBSSH2_METHOD_KEX: method = session->kex; break; @@ -1216,7 +1236,7 @@ libssh2_session_methods(LIBSSH2_SESSION * session, int method_type) return NULL; } - if (!method) { + if(!method) { _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE, "No method negotiated"); return NULL; @@ -1247,32 +1267,33 @@ libssh2_session_last_error(LIBSSH2_SESSION * session, char **errmsg, size_t msglen = 0; /* No error to report */ - if (!session->err_code) { - if (errmsg) { - if (want_buf) { + if(!session->err_code) { + if(errmsg) { + if(want_buf) { *errmsg = LIBSSH2_ALLOC(session, 1); - if (*errmsg) { + if(*errmsg) { **errmsg = 0; } - } else { + } + else { *errmsg = (char *) ""; } } - if (errmsg_len) { + if(errmsg_len) { *errmsg_len = 0; } return 0; } - if (errmsg) { + if(errmsg) { const char *error = session->err_msg ? session->err_msg : ""; msglen = strlen(error); - if (want_buf) { + if(want_buf) { /* Make a copy so the calling program can own it */ *errmsg = LIBSSH2_ALLOC(session, msglen + 1); - if (*errmsg) { + if(*errmsg) { memcpy(*errmsg, error, msglen); (*errmsg)[msglen] = 0; } @@ -1281,7 +1302,7 @@ libssh2_session_last_error(LIBSSH2_SESSION * session, char **errmsg, *errmsg = (char *)error; } - if (errmsg_len) { + if(errmsg_len) { *errmsg_len = msglen; } @@ -1309,7 +1330,7 @@ libssh2_session_last_errno(LIBSSH2_SESSION * session) LIBSSH2_API int libssh2_session_set_last_error(LIBSSH2_SESSION* session, int errcode, - const char* errmsg) + const char *errmsg) { return _libssh2_error_flags(session, errcode, errmsg, LIBSSH2_ERR_FLAG_DUP); @@ -1417,14 +1438,20 @@ libssh2_poll_channel_read(LIBSSH2_CHANNEL *channel, int extended) session = channel->session; packet = _libssh2_list_first(&session->packets); - while (packet) { - if ( channel->local.id == _libssh2_ntohu32(packet->data + 1)) { - if ( extended == 1 && - (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA - || packet->data[0] == SSH_MSG_CHANNEL_DATA )) { + while(packet) { + if(packet->data_len < 5) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Packet too small"); + } + + if(channel->local.id == _libssh2_ntohu32(packet->data + 1)) { + if(extended == 1 && + (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA + || packet->data[0] == SSH_MSG_CHANNEL_DATA)) { return 1; - } else if ( extended == 0 && - packet->data[0] == SSH_MSG_CHANNEL_DATA) { + } + else if(extended == 0 && + packet->data[0] == SSH_MSG_CHANNEL_DATA) { return 1; } /* else - no data of any type is ready to be read */ @@ -1475,7 +1502,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) #else struct pollfd sockets[256]; - if (nfds > 256) + if(nfds > 256) /* systems without alloca use a fixed-size array, this can be fixed if we really want to, at least if the compiler is a C99 capable one */ return -1; @@ -1483,7 +1510,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) /* Setup sockets for polling */ for(i = 0; i < nfds; i++) { fds[i].revents = 0; - switch (fds[i].type) { + switch(fds[i].type) { case LIBSSH2_POLLFD_SOCKET: sockets[i].fd = fds[i].fd.socket; sockets[i].events = fds[i].events; @@ -1494,7 +1521,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) sockets[i].fd = fds[i].fd.channel->session->socket_fd; sockets[i].events = POLLIN; sockets[i].revents = 0; - if (!session) + if(!session) session = fds[i].fd.channel->session; break; @@ -1502,12 +1529,12 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) sockets[i].fd = fds[i].fd.listener->session->socket_fd; sockets[i].events = POLLIN; sockets[i].revents = 0; - if (!session) + if(!session) session = fds[i].fd.listener->session; break; default: - if (session) + if(session) _libssh2_error(session, LIBSSH2_ERROR_INVALID_POLL_TYPE, "Invalid descriptor passed to libssh2_poll()"); return -1; @@ -1523,38 +1550,38 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) FD_ZERO(&wfds); for(i = 0; i < nfds; i++) { fds[i].revents = 0; - switch (fds[i].type) { + switch(fds[i].type) { case LIBSSH2_POLLFD_SOCKET: - if (fds[i].events & LIBSSH2_POLLFD_POLLIN) { + if(fds[i].events & LIBSSH2_POLLFD_POLLIN) { FD_SET(fds[i].fd.socket, &rfds); - if (fds[i].fd.socket > maxfd) + if(fds[i].fd.socket > maxfd) maxfd = fds[i].fd.socket; } - if (fds[i].events & LIBSSH2_POLLFD_POLLOUT) { + if(fds[i].events & LIBSSH2_POLLFD_POLLOUT) { FD_SET(fds[i].fd.socket, &wfds); - if (fds[i].fd.socket > maxfd) + if(fds[i].fd.socket > maxfd) maxfd = fds[i].fd.socket; } break; case LIBSSH2_POLLFD_CHANNEL: FD_SET(fds[i].fd.channel->session->socket_fd, &rfds); - if (fds[i].fd.channel->session->socket_fd > maxfd) + if(fds[i].fd.channel->session->socket_fd > maxfd) maxfd = fds[i].fd.channel->session->socket_fd; - if (!session) + if(!session) session = fds[i].fd.channel->session; break; case LIBSSH2_POLLFD_LISTENER: FD_SET(fds[i].fd.listener->session->socket_fd, &rfds); - if (fds[i].fd.listener->session->socket_fd > maxfd) + if(fds[i].fd.listener->session->socket_fd > maxfd) maxfd = fds[i].fd.listener->session->socket_fd; - if (!session) + if(!session) session = fds[i].fd.listener->session; break; default: - if (session) + if(session) _libssh2_error(session, LIBSSH2_ERROR_INVALID_POLL_TYPE, "Invalid descriptor passed to libssh2_poll()"); return -1; @@ -1577,10 +1604,10 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) active_fds = 0; for(i = 0; i < nfds; i++) { - if (fds[i].events != fds[i].revents) { - switch (fds[i].type) { + if(fds[i].events != fds[i].revents) { + switch(fds[i].type) { case LIBSSH2_POLLFD_CHANNEL: - if ((fds[i].events & LIBSSH2_POLLFD_POLLIN) && + if((fds[i].events & LIBSSH2_POLLFD_POLLIN) && /* Want to be ready for read */ ((fds[i].revents & LIBSSH2_POLLFD_POLLIN) == 0)) { /* Not yet known to be ready for read */ @@ -1589,7 +1616,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) 0) ? LIBSSH2_POLLFD_POLLIN : 0; } - if ((fds[i].events & LIBSSH2_POLLFD_POLLEXT) && + if((fds[i].events & LIBSSH2_POLLFD_POLLEXT) && /* Want to be ready for extended read */ ((fds[i].revents & LIBSSH2_POLLFD_POLLEXT) == 0)) { /* Not yet known to be ready for extended read */ @@ -1598,7 +1625,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) 1) ? LIBSSH2_POLLFD_POLLEXT : 0; } - if ((fds[i].events & LIBSSH2_POLLFD_POLLOUT) && + if((fds[i].events & LIBSSH2_POLLFD_POLLOUT) && /* Want to be ready for write */ ((fds[i].revents & LIBSSH2_POLLFD_POLLOUT) == 0)) { /* Not yet known to be ready for write */ @@ -1606,11 +1633,11 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) poll_channel_write(fds[i].fd. channel) ? LIBSSH2_POLLFD_POLLOUT : 0; } - if (fds[i].fd.channel->remote.close + if(fds[i].fd.channel->remote.close || fds[i].fd.channel->local.close) { fds[i].revents |= LIBSSH2_POLLFD_CHANNEL_CLOSED; } - if (fds[i].fd.channel->session->socket_state == + if(fds[i].fd.channel->session->socket_state == LIBSSH2_SOCKET_DISCONNECTED) { fds[i].revents |= LIBSSH2_POLLFD_CHANNEL_CLOSED | @@ -1619,7 +1646,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) break; case LIBSSH2_POLLFD_LISTENER: - if ((fds[i].events & LIBSSH2_POLLFD_POLLIN) && + if((fds[i].events & LIBSSH2_POLLFD_POLLIN) && /* Want a connection */ ((fds[i].revents & LIBSSH2_POLLFD_POLLIN) == 0)) { /* No connections known of yet */ @@ -1627,7 +1654,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) poll_listener_queued(fds[i].fd. listener) ? LIBSSH2_POLLFD_POLLIN : 0; } - if (fds[i].fd.listener->session->socket_state == + if(fds[i].fd.listener->session->socket_state == LIBSSH2_SOCKET_DISCONNECTED) { fds[i].revents |= LIBSSH2_POLLFD_LISTENER_CLOSED | @@ -1636,12 +1663,12 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) break; } } - if (fds[i].revents) { + if(fds[i].revents) { active_fds++; } } - if (active_fds) { + if(active_fds) { /* Don't block on the sockets if we have channels/listeners which are ready */ timeout_remaining = 0; @@ -1666,23 +1693,25 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) timeout_remaining = 0; #endif /* HAVE_GETTIMEOFDAY */ - if (sysret > 0) { + if(sysret > 0) { for(i = 0; i < nfds; i++) { - switch (fds[i].type) { + switch(fds[i].type) { case LIBSSH2_POLLFD_SOCKET: fds[i].revents = sockets[i].revents; - sockets[i].revents = 0; /* In case we loop again, be nice */ - if (fds[i].revents) { + sockets[i].revents = 0; /* In case we loop again, be + nice */ + if(fds[i].revents) { active_fds++; } break; case LIBSSH2_POLLFD_CHANNEL: - if (sockets[i].events & POLLIN) { + if(sockets[i].events & POLLIN) { /* Spin session until no data available */ - while (_libssh2_transport_read(fds[i].fd.channel->session) - > 0); + while(_libssh2_transport_read(fds[i].fd. + channel->session) + > 0); } - if (sockets[i].revents & POLLHUP) { + if(sockets[i].revents & POLLHUP) { fds[i].revents |= LIBSSH2_POLLFD_CHANNEL_CLOSED | LIBSSH2_POLLFD_SESSION_CLOSED; @@ -1690,12 +1719,13 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) sockets[i].revents = 0; break; case LIBSSH2_POLLFD_LISTENER: - if (sockets[i].events & POLLIN) { + if(sockets[i].events & POLLIN) { /* Spin session until no data available */ - while (_libssh2_transport_read(fds[i].fd.listener->session) - > 0); + while(_libssh2_transport_read(fds[i].fd. + listener->session) + > 0); } - if (sockets[i].revents & POLLHUP) { + if(sockets[i].revents & POLLHUP) { fds[i].revents |= LIBSSH2_POLLFD_LISTENER_CLOSED | LIBSSH2_POLLFD_SESSION_CLOSED; @@ -1713,7 +1743,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) struct timeval tv_begin, tv_end; _libssh2_gettimeofday((struct timeval *) &tv_begin, NULL); - sysret = select(maxfd+1, &rfds, &wfds, NULL, &tv); + sysret = select(maxfd + 1, &rfds, &wfds, NULL, &tv); _libssh2_gettimeofday((struct timeval *) &tv_end, NULL); timeout_remaining -= (tv_end.tv_sec - tv_begin.tv_sec) * 1000; @@ -1723,39 +1753,42 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) /* If the platform doesn't support gettimeofday, * then just make the call non-blocking and walk away */ - sysret = select(maxfd+1, &rfds, &wfds, NULL, &tv); + sysret = select(maxfd + 1, &rfds, &wfds, NULL, &tv); timeout_remaining = 0; #endif - if (sysret > 0) { + if(sysret > 0) { for(i = 0; i < nfds; i++) { - switch (fds[i].type) { + switch(fds[i].type) { case LIBSSH2_POLLFD_SOCKET: - if (FD_ISSET(fds[i].fd.socket, &rfds)) { + if(FD_ISSET(fds[i].fd.socket, &rfds)) { fds[i].revents |= LIBSSH2_POLLFD_POLLIN; } - if (FD_ISSET(fds[i].fd.socket, &wfds)) { + if(FD_ISSET(fds[i].fd.socket, &wfds)) { fds[i].revents |= LIBSSH2_POLLFD_POLLOUT; } - if (fds[i].revents) { + if(fds[i].revents) { active_fds++; } break; case LIBSSH2_POLLFD_CHANNEL: - if (FD_ISSET(fds[i].fd.channel->session->socket_fd, &rfds)) { + if(FD_ISSET(fds[i].fd.channel->session->socket_fd, + &rfds)) { /* Spin session until no data available */ - while (_libssh2_transport_read(fds[i].fd.channel->session) - > 0); + while(_libssh2_transport_read(fds[i].fd. + channel->session) + > 0); } break; case LIBSSH2_POLLFD_LISTENER: - if (FD_ISSET + if(FD_ISSET (fds[i].fd.listener->session->socket_fd, &rfds)) { /* Spin session until no data available */ - while (_libssh2_transport_read(fds[i].fd.listener->session) - > 0); + while(_libssh2_transport_read(fds[i].fd. + listener->session) + > 0); } break; } @@ -1763,7 +1796,7 @@ libssh2_poll(LIBSSH2_POLLFD * fds, unsigned int nfds, long timeout) } #endif /* else no select() or poll() -- timeout (and by extension * timeout_remaining) will be equal to 0 */ - } while ((timeout_remaining > 0) && !active_fds); + } while((timeout_remaining > 0) && !active_fds); return active_fds; } @@ -1789,10 +1822,10 @@ LIBSSH2_API const char * libssh2_session_banner_get(LIBSSH2_SESSION *session) { /* to avoid a coredump when session is NULL */ - if (NULL == session) + if(NULL == session) return NULL; - if (NULL==session->remote.banner) + if(NULL == session->remote.banner) return NULL; return (const char *) session->remote.banner; diff --git a/vendor/libssh2/src/session.h b/vendor/libssh2/src/session.h index aff4f2c5c..7b6c291e2 100644 --- a/vendor/libssh2/src/session.h +++ b/vendor/libssh2/src/session.h @@ -51,9 +51,9 @@ function. */ -#define BLOCK_ADJUST(rc,sess,x) \ +#define BLOCK_ADJUST(rc, sess, x) \ do { \ - time_t entry_time = time (NULL); \ + time_t entry_time = time(NULL); \ do { \ rc = x; \ /* the order of the check below is important to properly deal with \ @@ -70,9 +70,9 @@ * immediately. If the API is blocking and we get a NULL we check the errno * and *only* if that is EAGAIN we loop and wait for socket action. */ -#define BLOCK_ADJUST_ERRNO(ptr,sess,x) \ +#define BLOCK_ADJUST_ERRNO(ptr, sess, x) \ do { \ - time_t entry_time = time (NULL); \ + time_t entry_time = time(NULL); \ int rc; \ do { \ ptr = x; \ diff --git a/vendor/libssh2/src/sftp.c b/vendor/libssh2/src/sftp.c index fd94d3902..ece590e51 100644 --- a/vendor/libssh2/src/sftp.c +++ b/vendor/libssh2/src/sftp.c @@ -1,6 +1,6 @@ /* Copyright (c) 2004-2008, Sara Golemon * Copyright (c) 2007 Eli Fant - * Copyright (c) 2009-2014 by Daniel Stenberg + * Copyright (c) 2009-2019 by Daniel Stenberg * All rights reserved. * * Redistribution and use in source and binary forms, @@ -91,7 +91,7 @@ /* This is the maximum packet length to accept, as larger than this indicate some kind of server problem. */ -#define LIBSSH2_SFTP_PACKET_MAXLEN 80000 +#define LIBSSH2_SFTP_PACKET_MAXLEN (256 * 1024) static int sftp_packet_ask(LIBSSH2_SFTP *sftp, unsigned char packet_type, uint32_t request_id, unsigned char **data, @@ -161,7 +161,8 @@ remove_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id) request_id); if(zombie) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, - "Removing request ID %ld from the list of zombie requests", + "Removing request ID %ld from the list of " + "zombie requests", request_id); _libssh2_list_remove(&zombie->node); @@ -181,7 +182,7 @@ add_zombie_request(LIBSSH2_SFTP *sftp, uint32_t request_id) zombie = LIBSSH2_ALLOC(sftp->channel->session, sizeof(struct sftp_zombie_requests)); - if (!zombie) + if(!zombie) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "malloc fail for zombie request ID"); else { @@ -204,7 +205,7 @@ sftp_packet_add(LIBSSH2_SFTP *sftp, unsigned char *data, LIBSSH2_SFTP_PACKET *packet; uint32_t request_id; - if (data_len < 5) { + if(data_len < 5) { return LIBSSH2_ERROR_OUT_OF_BOUNDARY; } @@ -272,7 +273,7 @@ sftp_packet_add(LIBSSH2_SFTP *sftp, unsigned char *data, } packet = LIBSSH2_ALLOC(session, sizeof(LIBSSH2_SFTP_PACKET)); - if (!packet) { + if(!packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate datablock for SFTP packet"); } @@ -331,9 +332,9 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) (char *)&sftp->partial_size[ sftp->partial_size_len], 4 - sftp->partial_size_len); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; - else if (rc < 0) + else if(rc < 0) return _libssh2_error(session, rc, "channel read"); sftp->partial_size_len += rc; @@ -345,11 +346,15 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) sftp->partial_len = _libssh2_ntohu32(sftp->partial_size); /* make sure we don't proceed if the packet size is unreasonably large */ - if (sftp->partial_len > LIBSSH2_SFTP_PACKET_MAXLEN) + if(sftp->partial_len > LIBSSH2_SFTP_PACKET_MAXLEN) { + libssh2_channel_flush(channel); + sftp->partial_size_len = 0; return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED, "SFTP packet too large"); - if (sftp->partial_len == 0) + } + + if(sftp->partial_len == 0) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate empty SFTP packet"); @@ -358,7 +363,7 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) "Data begin - Packet Length: %lu", sftp->partial_len); packet = LIBSSH2_ALLOC(session, sftp->partial_len); - if (!packet) + if(!packet) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate SFTP packet"); sftp->partial_size_len = 0; @@ -372,7 +377,8 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) if(sftp->partial_len > recv_window) { /* ask for twice the data amount we need at once */ rc = _libssh2_channel_receive_window_adjust(channel, - sftp->partial_len*2, + sftp->partial_len + * 2, 1, NULL); /* store the state so that we continue with the correct operation at next invoke */ @@ -386,13 +392,13 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) } /* Read as much of the packet as we can */ - while (sftp->partial_len > sftp->partial_received) { + while(sftp->partial_len > sftp->partial_received) { rc = _libssh2_channel_read(channel, 0, (char *)&packet[sftp->partial_received], sftp->partial_len - sftp->partial_received); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { /* * We received EAGAIN, save what we have and return EAGAIN to * the caller. Set 'partial_packet' so that this function @@ -401,7 +407,7 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) sftp->packet_state = libssh2_NB_state_sent1; return rc; } - else if (rc < 0) { + else if(rc < 0) { LIBSSH2_FREE(session, packet); sftp->partial_packet = NULL; return _libssh2_error(session, rc, @@ -416,7 +422,7 @@ sftp_packet_read(LIBSSH2_SFTP *sftp) so we take a copy of the packet type before we call it. */ packet_type = packet[0]; rc = sftp_packet_add(sftp, packet, sftp->partial_len); - if (rc) { + if(rc) { LIBSSH2_FREE(session, packet); return rc; } @@ -485,7 +491,7 @@ sftp_packet_ask(LIBSSH2_SFTP *sftp, unsigned char packet_type, /* Special consideration when getting VERSION packet */ - while (packet) { + while(packet) { if((packet->data[0] == packet_type) && ((packet_type == SSH_FXP_VERSION) || (packet->request_id == request_id))) { @@ -517,38 +523,38 @@ sftp_packet_require(LIBSSH2_SFTP *sftp, unsigned char packet_type, LIBSSH2_SESSION *session = sftp->channel->session; int rc; - if (data == NULL || data_len == NULL || required_size == 0) { + if(data == NULL || data_len == NULL || required_size == 0) { return LIBSSH2_ERROR_BAD_USE; } _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Requiring packet %d id %ld", (int) packet_type, request_id); - if (sftp_packet_ask(sftp, packet_type, request_id, data, data_len) == 0) { + if(sftp_packet_ask(sftp, packet_type, request_id, data, data_len) == 0) { /* The right packet was available in the packet brigade */ _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Got %d", (int) packet_type); if (*data_len < required_size) { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } return LIBSSH2_ERROR_NONE; } - while (session->socket_state == LIBSSH2_SOCKET_CONNECTED) { + while(session->socket_state == LIBSSH2_SOCKET_CONNECTED) { rc = sftp_packet_read(sftp); - if (rc < 0) + if(rc < 0) return rc; /* data was read, check the queue again */ - if (!sftp_packet_ask(sftp, packet_type, request_id, data, data_len)) { + if(!sftp_packet_ask(sftp, packet_type, request_id, data, data_len)) { /* The right packet was available in the packet brigade */ _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Got %d", (int) packet_type); if (*data_len < required_size) { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } return LIBSSH2_ERROR_NONE; @@ -571,17 +577,17 @@ sftp_packet_requirev(LIBSSH2_SFTP *sftp, int num_valid_responses, int i; int rc; - if (data == NULL || data_len == NULL || required_size == 0) { + if(data == NULL || data_len == NULL || required_size == 0) { return LIBSSH2_ERROR_BAD_USE; } /* If no timeout is active, start a new one */ - if (sftp->requirev_start == 0) + if(sftp->requirev_start == 0) sftp->requirev_start = time(NULL); - while (sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) { + while(sftp->channel->session->socket_state == LIBSSH2_SOCKET_CONNECTED) { for(i = 0; i < num_valid_responses; i++) { - if (sftp_packet_ask(sftp, valid_responses[i], request_id, + if(sftp_packet_ask(sftp, valid_responses[i], request_id, data, data_len) == 0) { /* * Set to zero before all returns to say @@ -590,7 +596,7 @@ sftp_packet_requirev(LIBSSH2_SFTP *sftp, int num_valid_responses, sftp->requirev_start = 0; if (*data_len < required_size) { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } return LIBSSH2_ERROR_NONE; @@ -598,19 +604,21 @@ sftp_packet_requirev(LIBSSH2_SFTP *sftp, int num_valid_responses, } rc = sftp_packet_read(sftp); - if ((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) { + if((rc < 0) && (rc != LIBSSH2_ERROR_EAGAIN)) { sftp->requirev_start = 0; return rc; - } else if (rc <= 0) { + } + else if(rc <= 0) { /* prevent busy-looping */ long left = - LIBSSH2_READ_TIMEOUT - (long)(time(NULL) - sftp->requirev_start); + LIBSSH2_READ_TIMEOUT - + (long)(time(NULL) - sftp->requirev_start); - if (left <= 0) { + if(left <= 0) { sftp->requirev_start = 0; return LIBSSH2_ERROR_TIMEOUT; } - else if (rc == LIBSSH2_ERROR_EAGAIN) { + else if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } } @@ -636,27 +644,27 @@ sftp_attr2bin(unsigned char *p, const LIBSSH2_SFTP_ATTRIBUTES * attrs) /* TODO: When we add SFTP4+ functionality flag_mask can get additional bits */ - if (!attrs) { + if(!attrs) { _libssh2_htonu32(s, 0); return 4; } _libssh2_store_u32(&s, attrs->flags & flag_mask); - if (attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) { + if(attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) { _libssh2_store_u64(&s, attrs->filesize); } - if (attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) { + if(attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) { _libssh2_store_u32(&s, attrs->uid); _libssh2_store_u32(&s, attrs->gid); } - if (attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { + if(attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { _libssh2_store_u32(&s, attrs->permissions); } - if (attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) { + if(attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) { _libssh2_store_u32(&s, attrs->atime); _libssh2_store_u32(&s, attrs->mtime); } @@ -667,68 +675,57 @@ sftp_attr2bin(unsigned char *p, const LIBSSH2_SFTP_ATTRIBUTES * attrs) /* sftp_bin2attr */ static int -sftp_bin2attr(LIBSSH2_SFTP_ATTRIBUTES * attrs, const unsigned char *p, size_t data_len) +sftp_bin2attr(LIBSSH2_SFTP_ATTRIBUTES *attrs, const unsigned char *p, + size_t data_len) { - const unsigned char *s = p; + struct string_buf buf; + uint32_t flags = 0; + buf.data = (unsigned char *)p; + buf.dataptr = buf.data; + buf.len = data_len; - if (data_len >= 4) { - memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); - attrs->flags = _libssh2_ntohu32(s); - s += 4; - data_len -= 4; - } - else { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + if(_libssh2_get_u32(&buf, &flags) != 0) { + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } + attrs->flags = flags; - if (attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) { - if (data_len >= 8) { - attrs->filesize = _libssh2_ntohu64(s); - s += 8; - data_len -= 8; - } - else { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + if(attrs->flags & LIBSSH2_SFTP_ATTR_SIZE) { + if(_libssh2_get_u64(&buf, &(attrs->filesize)) != 0) { + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } } - if (attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) { - if (data_len >= 8) { - attrs->uid = _libssh2_ntohu32(s); - s += 4; - attrs->gid = _libssh2_ntohu32(s); - s += 4; - data_len -= 8; - } - else { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + if(attrs->flags & LIBSSH2_SFTP_ATTR_UIDGID) { + uint32_t uid = 0; + uint32_t gid = 0; + if(_libssh2_get_u32(&buf, &uid) != 0 || + _libssh2_get_u32(&buf, &gid) != 0) { + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } + attrs->uid = uid; + attrs->gid = gid; } - if (attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { - if (data_len >= 4) { - attrs->permissions = _libssh2_ntohu32(s); - s += 4; - data_len -= 4; - } - else { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + if(attrs->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { + uint32_t permissions; + if(_libssh2_get_u32(&buf, &permissions) != 0) { + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } + attrs->permissions = permissions; } - if (attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) { - if (data_len >= 8) { - attrs->atime = _libssh2_ntohu32(s); - s += 4; - attrs->mtime = _libssh2_ntohu32(s); - s += 4; - } - else { - return LIBSSH2_ERROR_OUT_OF_BOUNDARY; + if(attrs->flags & LIBSSH2_SFTP_ATTR_ACMODTIME) { + uint32_t atime; + uint32_t mtime; + if(_libssh2_get_u32(&buf, &atime) != 0 || + _libssh2_get_u32(&buf, &mtime) != 0) { + return LIBSSH2_ERROR_BUFFER_TOO_SMALL; } + attrs->atime = atime; + attrs->mtime = mtime; } - return (s - p); + return (buf.dataptr - buf.data); } /* ************ @@ -748,12 +745,12 @@ LIBSSH2_CHANNEL_CLOSE_FUNC(libssh2_sftp_dtor) (void) channel; /* Free the partial packet storage for sftp_packet_read */ - if (sftp->partial_packet) { + if(sftp->partial_packet) { LIBSSH2_FREE(session, sftp->partial_packet); } /* Free the packet storage for _libssh2_sftp_packet_readdir */ - if (sftp->readdir_packet) { + if(sftp->readdir_packet) { LIBSSH2_FREE(session, sftp->readdir_packet); } @@ -767,12 +764,14 @@ LIBSSH2_CHANNEL_CLOSE_FUNC(libssh2_sftp_dtor) */ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) { - unsigned char *data, *s; + unsigned char *data; size_t data_len; ssize_t rc; LIBSSH2_SFTP *sftp_handle; + struct string_buf buf; + unsigned char *endp; - if (session->sftpInit_state == libssh2_NB_state_idle) { + if(session->sftpInit_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Initializing SFTP subsystem"); @@ -795,13 +794,13 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) sftp_handle = session->sftpInit_sftp; - if (session->sftpInit_state == libssh2_NB_state_created) { + if(session->sftpInit_state == libssh2_NB_state_created) { session->sftpInit_channel = _libssh2_channel_open(session, "session", sizeof("session") - 1, LIBSSH2_CHANNEL_WINDOW_DEFAULT, LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0); - if (!session->sftpInit_channel) { - if (libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) { + if(!session->sftpInit_channel) { + if(libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block starting up channel"); } @@ -816,16 +815,18 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) session->sftpInit_state = libssh2_NB_state_sent; } - if (session->sftpInit_state == libssh2_NB_state_sent) { + if(session->sftpInit_state == libssh2_NB_state_sent) { int ret = _libssh2_channel_process_startup(session->sftpInit_channel, "subsystem", - sizeof("subsystem") - 1, "sftp", + sizeof("subsystem") - 1, + "sftp", strlen("sftp")); - if (ret == LIBSSH2_ERROR_EAGAIN) { + if(ret == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block to request SFTP subsystem"); return NULL; - } else if (ret) { + } + else if(ret) { _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_FAILURE, "Unable to request SFTP subsystem"); goto sftp_init_error; @@ -834,10 +835,10 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) session->sftpInit_state = libssh2_NB_state_sent1; } - if (session->sftpInit_state == libssh2_NB_state_sent1) { + if(session->sftpInit_state == libssh2_NB_state_sent1) { rc = _libssh2_channel_extended_data(session->sftpInit_channel, - LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE); - if (rc == LIBSSH2_ERROR_EAGAIN) { + LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE); + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting handle extended data"); return NULL; @@ -846,7 +847,7 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) sftp_handle = session->sftpInit_sftp = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_SFTP)); - if (!sftp_handle) { + if(!sftp_handle) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate a new SFTP structure"); goto sftp_init_error; @@ -860,19 +861,20 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) session->sftpInit_sent = 0; /* nothing's sent yet */ _libssh2_debug(session, LIBSSH2_TRACE_SFTP, - "Sending FXP_INIT packet advertising version %d support", + "Sending FXP_INIT packet advertising " + "version %d support", (int) LIBSSH2_SFTP_VERSION); session->sftpInit_state = libssh2_NB_state_sent2; } - if (session->sftpInit_state == libssh2_NB_state_sent2) { + if(session->sftpInit_state == libssh2_NB_state_sent2) { /* sent off what's left of the init buffer to send */ rc = _libssh2_channel_write(session->sftpInit_channel, 0, session->sftpInit_buffer + session->sftpInit_sent, 9 - session->sftpInit_sent); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block sending SSH_FXP_INIT"); return NULL; @@ -896,29 +898,37 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) rc = sftp_packet_require(sftp_handle, SSH_FXP_VERSION, 0, &data, &data_len, 5); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block receiving SSH_FXP_VERSION"); return NULL; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Invalid SSH_FXP_VERSION response"); goto sftp_init_error; } - else if (rc) { + else if(rc) { _libssh2_error(session, rc, "Timeout waiting for response from SFTP subsystem"); goto sftp_init_error; } - s = data + 1; - sftp_handle->version = _libssh2_ntohu32(s); - s += 4; - if (sftp_handle->version > LIBSSH2_SFTP_VERSION) { + buf.data = data; + buf.dataptr = buf.data + 1; + buf.len = data_len; + endp = &buf.data[data_len]; + + if(_libssh2_get_u32(&buf, &(sftp_handle->version)) != 0) { + LIBSSH2_FREE(session, data); + rc = LIBSSH2_ERROR_BUFFER_TOO_SMALL; + goto sftp_init_error; + } + + if(sftp_handle->version > LIBSSH2_SFTP_VERSION) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Truncating remote SFTP version from %lu", sftp_handle->version); @@ -927,20 +937,22 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Enabling SFTP version %lu compatibility", sftp_handle->version); - while (s < (data + data_len)) { - size_t extname_len, extdata_len; - - extname_len = _libssh2_ntohu32(s); - s += 4; - /* the extension name starts here */ - s += extname_len; - - extdata_len = _libssh2_ntohu32(s); - s += 4; + while(buf.dataptr < endp) { + unsigned char *extname, *extdata; - /* TODO: Actually process extensions */ - s += extdata_len; + if(_libssh2_get_string(&buf, &extname, NULL)) { + LIBSSH2_FREE(session, data); + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short when extracting extname"); + goto sftp_init_error; + } + if(_libssh2_get_string(&buf, &extdata, NULL)) { + LIBSSH2_FREE(session, data); + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short when extracting extdata"); + goto sftp_init_error; + } } LIBSSH2_FREE(session, data); @@ -960,10 +972,10 @@ static LIBSSH2_SFTP *sftp_init(LIBSSH2_SESSION *session) return sftp_handle; sftp_init_error: - while (_libssh2_channel_free(session->sftpInit_channel) == + while(_libssh2_channel_free(session->sftpInit_channel) == LIBSSH2_ERROR_EAGAIN); session->sftpInit_channel = NULL; - if (session->sftpInit_sftp) { + if(session->sftpInit_sftp) { LIBSSH2_FREE(session, session->sftpInit_sftp); session->sftpInit_sftp = NULL; } @@ -1006,55 +1018,55 @@ sftp_shutdown(LIBSSH2_SFTP *sftp) /* * Make sure all memory used in the state variables are free */ - if (sftp->partial_packet) { + if(sftp->partial_packet) { LIBSSH2_FREE(session, sftp->partial_packet); sftp->partial_packet = NULL; } - if (sftp->open_packet) { + if(sftp->open_packet) { LIBSSH2_FREE(session, sftp->open_packet); sftp->open_packet = NULL; } - if (sftp->readdir_packet) { + if(sftp->readdir_packet) { LIBSSH2_FREE(session, sftp->readdir_packet); sftp->readdir_packet = NULL; } - if (sftp->fstat_packet) { + if(sftp->fstat_packet) { LIBSSH2_FREE(session, sftp->fstat_packet); sftp->fstat_packet = NULL; } - if (sftp->unlink_packet) { + if(sftp->unlink_packet) { LIBSSH2_FREE(session, sftp->unlink_packet); sftp->unlink_packet = NULL; } - if (sftp->rename_packet) { + if(sftp->rename_packet) { LIBSSH2_FREE(session, sftp->rename_packet); sftp->rename_packet = NULL; } - if (sftp->fstatvfs_packet) { + if(sftp->fstatvfs_packet) { LIBSSH2_FREE(session, sftp->fstatvfs_packet); sftp->fstatvfs_packet = NULL; } - if (sftp->statvfs_packet) { + if(sftp->statvfs_packet) { LIBSSH2_FREE(session, sftp->statvfs_packet); sftp->statvfs_packet = NULL; } - if (sftp->mkdir_packet) { + if(sftp->mkdir_packet) { LIBSSH2_FREE(session, sftp->mkdir_packet); sftp->mkdir_packet = NULL; } - if (sftp->rmdir_packet) { + if(sftp->rmdir_packet) { LIBSSH2_FREE(session, sftp->rmdir_packet); sftp->rmdir_packet = NULL; } - if (sftp->stat_packet) { + if(sftp->stat_packet) { LIBSSH2_FREE(session, sftp->stat_packet); sftp->stat_packet = NULL; } - if (sftp->symlink_packet) { + if(sftp->symlink_packet) { LIBSSH2_FREE(session, sftp->symlink_packet); sftp->symlink_packet = NULL; } - if (sftp->fsync_packet) { + if(sftp->fsync_packet) { LIBSSH2_FREE(session, sftp->fsync_packet); sftp->fsync_packet = NULL; } @@ -1103,16 +1115,17 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, ssize_t rc; int open_file = (open_type == LIBSSH2_SFTP_OPENFILE)?1:0; - if (sftp->open_state == libssh2_NB_state_idle) { + if(sftp->open_state == libssh2_NB_state_idle) { /* packet_len(4) + packet_type(1) + request_id(4) + filename_len(4) + flags(4) */ sftp->open_packet_len = filename_len + 13 + - (open_file? (4 + sftp_attrsize(LIBSSH2_SFTP_ATTR_PERMISSIONS)) : 0); + (open_file? (4 + + sftp_attrsize(LIBSSH2_SFTP_ATTR_PERMISSIONS)) : 0); /* surprise! this starts out with nothing sent */ sftp->open_packet_sent = 0; s = sftp->open_packet = LIBSSH2_ALLOC(session, sftp->open_packet_len); - if (!sftp->open_packet) { + if(!sftp->open_packet) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_OPEN or " "FXP_OPENDIR packet"); @@ -1129,7 +1142,7 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, _libssh2_store_u32(&s, sftp->open_request_id); _libssh2_store_str(&s, filename, filename_len); - if (open_file) { + if(open_file) { _libssh2_store_u32(&s, flags); s += sftp_attr2bin(s, &attrs); } @@ -1140,14 +1153,15 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, sftp->open_state = libssh2_NB_state_created; } - if (sftp->open_state == libssh2_NB_state_created) { + if(sftp->open_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, sftp->open_packet+ sftp->open_packet_sent, sftp->open_packet_len - sftp->open_packet_sent); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, - "Would block sending FXP_OPEN or FXP_OPENDIR command"); + "Would block sending FXP_OPEN or " + "FXP_OPENDIR command"); return NULL; } else if(rc < 0) { @@ -1170,7 +1184,7 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, } } - if (sftp->open_state == libssh2_NB_state_sent) { + if(sftp->open_state == libssh2_NB_state_sent) { size_t data_len; unsigned char *data; static const unsigned char fopen_responses[2] = @@ -1178,13 +1192,13 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, rc = sftp_packet_requirev(sftp, 2, fopen_responses, sftp->open_request_id, &data, &data_len, 1); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block waiting for status message"); return NULL; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, @@ -1192,7 +1206,7 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, return NULL; } sftp->open_state = libssh2_NB_state_idle; - if (rc) { + if(rc) { _libssh2_error(session, rc, "Timeout waiting for status message"); return NULL; } @@ -1201,7 +1215,7 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, a fine response while STATUS means error. It seems though that at times we get an SSH_FX_OK back in a STATUS, followed the "real" HANDLE so we need to properly deal with that. */ - if (data[0] == SSH_FXP_STATUS) { + if(data[0] == SSH_FXP_STATUS) { int badness = 1; if(data_len < 9) { @@ -1214,7 +1228,8 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, sftp->last_errno = _libssh2_ntohu32(data + 5); if(LIBSSH2_FX_OK == sftp->last_errno) { - _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "got HANDLE FXOK!"); + _libssh2_debug(session, LIBSSH2_TRACE_SFTP, + "got HANDLE FXOK!"); LIBSSH2_FREE(session, data); @@ -1227,8 +1242,8 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, sftp->open_state = libssh2_NB_state_sent; return NULL; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, @@ -1243,7 +1258,8 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, if(badness) { _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Failed opening remote file"); - _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "got FXP_STATUS %d", + _libssh2_debug(session, LIBSSH2_TRACE_SFTP, + "got FXP_STATUS %d", sftp->last_errno); LIBSSH2_FREE(session, data); return NULL; @@ -1258,7 +1274,7 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, } fp = LIBSSH2_CALLOC(session, sizeof(LIBSSH2_SFTP_HANDLE)); - if (!fp) { + if(!fp) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate new SFTP handle structure"); LIBSSH2_FREE(session, data); @@ -1268,7 +1284,7 @@ sftp_open(LIBSSH2_SFTP *sftp, const char *filename, LIBSSH2_SFTP_HANDLE_DIR; fp->handle_len = _libssh2_ntohu32(data + 5); - if (fp->handle_len > SFTP_HANDLE_MAXLEN) + if(fp->handle_len > SFTP_HANDLE_MAXLEN) /* SFTP doesn't allow handles longer than 256 characters */ fp->handle_len = SFTP_HANDLE_MAXLEN; @@ -1364,7 +1380,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, and second phases on the next call and resume sending. */ - switch (sftp->read_state) { + switch(sftp->read_state) { case libssh2_NB_state_idle: /* Some data may already have been read from the server in the @@ -1388,9 +1404,10 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, return copy; } - if (filep->eof) { + if(filep->eof) { return 0; - } else { + } + else { /* We allow a number of bytes being requested at any given time without having been acked - until we reach EOF. */ @@ -1441,7 +1458,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, at next call */ assert(rc != LIBSSH2_ERROR_EAGAIN || !filep->data_left); assert(rc != LIBSSH2_ERROR_EAGAIN || !filep->eof); - if (rc) + if(rc) return rc; } } @@ -1455,14 +1472,14 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, uint32_t request_id; uint32_t size = count; - if (size < buffer_size) + if(size < buffer_size) size = buffer_size; - if (size > MAX_SFTP_READ_SIZE) + if(size > MAX_SFTP_READ_SIZE) size = MAX_SFTP_READ_SIZE; chunk = LIBSSH2_ALLOC(session, packet_len + sizeof(struct sftp_pipeline_chunk)); - if (!chunk) + if(!chunk) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "malloc fail for FXP_WRITE"); @@ -1485,13 +1502,13 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, /* add this new entry LAST in the list */ _libssh2_list_add(&handle->packet_list, &chunk->node); - count -= MIN(size,count); /* deduct the size we used, as we might - * have to create more packets */ + count -= MIN(size, count); /* deduct the size we used, as we might + * have to create more packets */ _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "read request id %d sent (offset: %d, size: %d)", request_id, (int)chunk->offset, (int)chunk->len); } - + /* FALL-THROUGH */ case libssh2_NB_state_sent: sftp->read_state = libssh2_NB_state_idle; @@ -1519,9 +1536,10 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, /* We still have data left to send for this chunk. * If there is at least one completely sent chunk, * we can get out of this loop and start reading. */ - if (chunk != _libssh2_list_first(&handle->packet_list)) { + if(chunk != _libssh2_list_first(&handle->packet_list)) { break; - } else { + } + else { continue; } } @@ -1530,6 +1548,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, /* move on to the next chunk with data to send */ chunk = _libssh2_list_next(&chunk->node); } + /* FALL-THROUGH */ case libssh2_NB_state_sent2: @@ -1551,9 +1570,10 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, if(chunk->lefttosend) { /* if the chunk still has data left to send, we shouldn't wait for an ACK for it just yet */ - if (bytes_in_buffer > 0) { + if(bytes_in_buffer > 0) { return bytes_in_buffer; - } else { + } + else { /* we should never reach this point */ return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "sftp_read() internal error"); @@ -1562,14 +1582,14 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, rc = sftp_packet_requirev(sftp, 2, read_responses, chunk->request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN && bytes_in_buffer != 0) { + if(rc == LIBSSH2_ERROR_EAGAIN && bytes_in_buffer != 0) { /* do not return EAGAIN if we have already * written data into the buffer */ return bytes_in_buffer; } - if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, @@ -1585,7 +1605,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, * FX_EOF when we reach the end of the file. */ - switch (data[0]) { + switch(data[0]) { case SSH_FXP_STATUS: /* remove the chunk we just processed */ @@ -1599,7 +1619,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, rc32 = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (rc32 == LIBSSH2_FX_EOF) { + if(rc32 == LIBSSH2_FX_EOF) { filep->eof = TRUE; return bytes_in_buffer; } @@ -1611,7 +1631,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, break; case SSH_FXP_DATA: - if (chunk->offset != filep->offset) { + if(chunk->offset != filep->offset) { /* This could happen if the server returns less bytes than requested, which shouldn't happen for normal files. See: https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02 @@ -1622,7 +1642,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, } rc32 = _libssh2_ntohu32(data + 5); - if (rc32 > (data_len - 9)) + if(rc32 > (data_len - 9)) return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP Protocol badness"); @@ -1676,9 +1696,10 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, /* check if we have space left in the buffer * and either continue to the next chunk or stop */ - if (bytes_in_buffer < buffer_size) { + if(bytes_in_buffer < buffer_size) { chunk = next; - } else { + } + else { chunk = NULL; } @@ -1690,7 +1711,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, } } - if (bytes_in_buffer > 0) + if(bytes_in_buffer > 0) return bytes_in_buffer; break; @@ -1739,8 +1760,8 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, SSH_FXP_NAME, SSH_FXP_STATUS }; ssize_t retcode; - if (sftp->readdir_state == libssh2_NB_state_idle) { - if (handle->u.dir.names_left) { + if(sftp->readdir_state == libssh2_NB_state_idle) { + if(handle->u.dir.names_left) { /* * A prior request returned more than one directory entry, * feed it back from the buffer @@ -1750,29 +1771,53 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, size_t real_filename_len; size_t filename_len; size_t longentry_len; - - s = (unsigned char *) handle->u.dir.next_name; - real_filename_len = _libssh2_ntohu32(s); - - s += 4; + size_t names_packet_len = handle->u.dir.names_packet_len; + int attr_len = 0; + + if(names_packet_len >= 4) { + s = (unsigned char *) handle->u.dir.next_name; + real_filename_len = _libssh2_ntohu32(s); + s += 4; + names_packet_len -= 4; + } + else { + filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL; + goto end; + } filename_len = real_filename_len; - if (filename_len >= buffer_maxlen) { + if(filename_len >= buffer_maxlen) { filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL; goto end; } - memcpy(buffer, s, filename_len); - buffer[filename_len] = '\0'; /* zero terminate */ - s += real_filename_len; + if(buffer_maxlen >= filename_len && names_packet_len >= + filename_len) { + memcpy(buffer, s, filename_len); + buffer[filename_len] = '\0'; /* zero terminate */ + s += real_filename_len; + names_packet_len -= real_filename_len; + } + else { + filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL; + goto end; + } - real_longentry_len = _libssh2_ntohu32(s); - s += 4; + if(names_packet_len >= 4) { + real_longentry_len = _libssh2_ntohu32(s); + s += 4; + names_packet_len -= 4; + } + else { + filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL; + goto end; + } - if (longentry && (longentry_maxlen>1)) { + if(longentry && (longentry_maxlen>1)) { longentry_len = real_longentry_len; - if (longentry_len >= longentry_maxlen) { + if(longentry_len >= longentry_maxlen || + longentry_len > names_packet_len) { filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL; goto end; } @@ -1780,17 +1825,36 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, memcpy(longentry, s, longentry_len); longentry[longentry_len] = '\0'; /* zero terminate */ } - s += real_longentry_len; - if (attrs) + if(real_longentry_len <= names_packet_len) { + s += real_longentry_len; + names_packet_len -= real_longentry_len; + } + else { + filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL; + goto end; + } + + if(attrs) memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); - s += sftp_bin2attr(attrs ? attrs : &attrs_dummy, s, 32); + attr_len = sftp_bin2attr(attrs ? attrs : &attrs_dummy, s, + names_packet_len); + + if(attr_len >= 0) { + s += attr_len; + names_packet_len -= attr_len; + } + else { + filename_len = (size_t)LIBSSH2_ERROR_BUFFER_TOO_SMALL; + goto end; + } handle->u.dir.next_name = (char *) s; + handle->u.dir.names_packet_len = names_packet_len; end: - if ((--handle->u.dir.names_left) == 0) + if((--handle->u.dir.names_left) == 0) LIBSSH2_FREE(session, handle->u.dir.names_packet); _libssh2_debug(session, LIBSSH2_TRACE_SFTP, @@ -1802,7 +1866,7 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, /* Request another entry(entries?) */ s = sftp->readdir_packet = LIBSSH2_ALLOC(session, packet_len); - if (!sftp->readdir_packet) + if(!sftp->readdir_packet) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "FXP_READDIR packet"); @@ -1816,15 +1880,15 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, sftp->readdir_state = libssh2_NB_state_created; } - if (sftp->readdir_state == libssh2_NB_state_created) { + if(sftp->readdir_state == libssh2_NB_state_created) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Reading entries from directory handle"); retcode = _libssh2_channel_write(channel, 0, sftp->readdir_packet, packet_len); - if (retcode == LIBSSH2_ERROR_EAGAIN) { + if(retcode == LIBSSH2_ERROR_EAGAIN) { return retcode; } - else if ((ssize_t)packet_len != retcode) { + else if((ssize_t)packet_len != retcode) { LIBSSH2_FREE(session, sftp->readdir_packet); sftp->readdir_packet = NULL; sftp->readdir_state = libssh2_NB_state_idle; @@ -1841,25 +1905,25 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, retcode = sftp_packet_requirev(sftp, 2, read_responses, sftp->readdir_request_id, &data, &data_len, 9); - if (retcode == LIBSSH2_ERROR_EAGAIN) + if(retcode == LIBSSH2_ERROR_EAGAIN) return retcode; - else if (retcode == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(retcode == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } - return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, - "Status message too short"); + return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, + "Status message too short"); } - else if (retcode) { + else if(retcode) { sftp->readdir_state = libssh2_NB_state_idle; return _libssh2_error(session, retcode, "Timeout waiting for status message"); } - if (data[0] == SSH_FXP_STATUS) { + if(data[0] == SSH_FXP_STATUS) { retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode == LIBSSH2_FX_EOF) { + if(retcode == LIBSSH2_FX_EOF) { sftp->readdir_state = libssh2_NB_state_idle; return 0; } @@ -1876,7 +1940,7 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, num_names = _libssh2_ntohu32(data + 5); _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "%lu entries returned", num_names); - if (!num_names) { + if(!num_names) { LIBSSH2_FREE(session, data); return 0; } @@ -1884,6 +1948,7 @@ static ssize_t sftp_readdir(LIBSSH2_SFTP_HANDLE *handle, char *buffer, handle->u.dir.names_left = num_names; handle->u.dir.names_packet = data; handle->u.dir.next_name = (char *) data + 9; + handle->u.dir.names_packet_len = data_len - 9; /* use the name popping mechanism from the start of the function */ return sftp_readdir(handle, buffer, buffer_maxlen, longentry, @@ -1967,14 +2032,15 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, default: case libssh2_NB_state_idle: - /* Number of bytes sent off that haven't been acked and therefor we + /* Number of bytes sent off that haven't been acked and therefore we will get passed in here again. Also, add up the number of bytes that actually already have been acked but we haven't been able to return as such yet, so we will get that data as well passed in here again. */ - already = (size_t) (handle->u.file.offset_sent - handle->u.file.offset)+ + already = (size_t) (handle->u.file.offset_sent - + handle->u.file.offset)+ handle->u.file.acked; if(count >= already) { @@ -1999,7 +2065,7 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, chunk = LIBSSH2_ALLOC(session, packet_len + sizeof(struct sftp_pipeline_chunk)); - if (!chunk) + if(!chunk) return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "malloc fail for FXP_WRITE"); @@ -2027,8 +2093,8 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, to create more packets */ } - /* move through the WRITE packets that haven't been sent and send as many - as possible - remember that we don't block */ + /* move through the WRITE packets that haven't been sent and send as + many as possible - remember that we don't block */ chunk = _libssh2_list_first(&handle->packet_list); while(chunk) { @@ -2076,15 +2142,15 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, /* we check the packets in order */ rc = sftp_packet_require(sftp, SSH_FXP_STATUS, chunk->request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "FXP write packet too short"); } - else if (rc < 0) { - if (rc == LIBSSH2_ERROR_EAGAIN) + else if(rc < 0) { + if(rc == LIBSSH2_ERROR_EAGAIN) sftp->write_state = libssh2_NB_state_sent; return rc; } @@ -2093,7 +2159,7 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, LIBSSH2_FREE(session, data); sftp->last_errno = retcode; - if (retcode == LIBSSH2_FX_OK) { + if(retcode == LIBSSH2_FX_OK) { acked += chunk->len; /* number of payload data that was acked here */ @@ -2113,7 +2179,8 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, /* since we return error now, the application will not get any outstanding data acked, so we need to rewind the offset to - where the application knows it has reached with acked data */ + where the application knows it has reached with acked + data */ handle->u.file.offset -= handle->u.file.acked; /* then reset the offset_sent to be the same as the offset */ @@ -2123,8 +2190,8 @@ static ssize_t sftp_write(LIBSSH2_SFTP_HANDLE *handle, const char *buffer, ack after an error */ handle->u.file.acked = 0; - /* the server returned an error for that written chunk, propagate - this back to our parent function */ + /* the server returned an error for that written chunk, + propagate this back to our parent function */ return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "FXP write failed"); } @@ -2183,11 +2250,11 @@ static int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle) ssize_t rc; uint32_t retcode; - if (sftp->fsync_state == libssh2_NB_state_idle) { + if(sftp->fsync_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Issuing fsync command"); s = packet = LIBSSH2_ALLOC(session, packet_len); - if (!packet) { + if(!packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_EXTENDED " "packet"); @@ -2201,13 +2268,14 @@ static int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle) _libssh2_store_str(&s, handle->handle, handle->handle_len); sftp->fsync_state = libssh2_NB_state_created; - } else { + } + else { packet = sftp->fsync_packet; } - if (sftp->fsync_state == libssh2_NB_state_created) { + if(sftp->fsync_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN || + if(rc == LIBSSH2_ERROR_EAGAIN || (0 <= rc && rc < (ssize_t)packet_len)) { sftp->fsync_packet = packet; return LIBSSH2_ERROR_EAGAIN; @@ -2216,7 +2284,7 @@ static int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle) LIBSSH2_FREE(session, packet); sftp->fsync_packet = NULL; - if (rc < 0) { + if(rc < 0) { sftp->fsync_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "_libssh2_channel_write() failed"); @@ -2226,17 +2294,17 @@ static int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle) rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->fsync_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP fsync packet too short"); } - else if (rc) { + else if(rc) { sftp->fsync_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP EXTENDED REPLY"); @@ -2247,7 +2315,7 @@ static int sftp_fsync(LIBSSH2_SFTP_HANDLE *handle) retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode != LIBSSH2_FX_OK) { + if(retcode != LIBSSH2_FX_OK) { sftp->last_errno = retcode; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "fsync failed"); @@ -2291,11 +2359,11 @@ static int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, { SSH_FXP_ATTRS, SSH_FXP_STATUS }; ssize_t rc; - if (sftp->fstat_state == libssh2_NB_state_idle) { + if(sftp->fstat_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Issuing %s command", setstat ? "set-stat" : "stat"); s = sftp->fstat_packet = LIBSSH2_ALLOC(session, packet_len); - if (!sftp->fstat_packet) { + if(!sftp->fstat_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "FSTAT/FSETSTAT packet"); @@ -2307,20 +2375,20 @@ static int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, _libssh2_store_u32(&s, sftp->fstat_request_id); _libssh2_store_str(&s, handle->handle, handle->handle_len); - if (setstat) { + if(setstat) { s += sftp_attr2bin(s, attrs); } sftp->fstat_state = libssh2_NB_state_created; } - if (sftp->fstat_state == libssh2_NB_state_created) { + if(sftp->fstat_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, sftp->fstat_packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if ((ssize_t)packet_len != rc) { + else if((ssize_t)packet_len != rc) { LIBSSH2_FREE(session, sftp->fstat_packet); sftp->fstat_packet = NULL; sftp->fstat_state = libssh2_NB_state_idle; @@ -2337,16 +2405,16 @@ static int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, rc = sftp_packet_requirev(sftp, 2, fstat_responses, sftp->fstat_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP fstat packet too short"); } - else if (rc) { + else if(rc) { sftp->fstat_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Timeout waiting for status message"); @@ -2354,21 +2422,22 @@ static int sftp_fstat(LIBSSH2_SFTP_HANDLE *handle, sftp->fstat_state = libssh2_NB_state_idle; - if (data[0] == SSH_FXP_STATUS) { + if(data[0] == SSH_FXP_STATUS) { uint32_t retcode; retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode == LIBSSH2_FX_OK) { + if(retcode == LIBSSH2_FX_OK) { return 0; - } else { + } + else { sftp->last_errno = retcode; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP Protocol Error"); } } - if (sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) { + if(sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) { LIBSSH2_FREE(session, data); return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Attributes too short in SFTP fstat"); @@ -2411,7 +2480,7 @@ libssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle, libssh2_uint64_t offset) sftp_packetlist_flush(handle); /* free the left received buffered data */ - if (handle->u.file.data_left) { + if(handle->u.file.data_left) { LIBSSH2_FREE(handle->sftp->channel->session, handle->u.file.data); handle->u.file.data_left = handle->u.file.data_len = 0; handle->u.file.data = NULL; @@ -2512,15 +2581,16 @@ sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle) unsigned char *s, *data = NULL; int rc = 0; - if (handle->close_state == libssh2_NB_state_idle) { + if(handle->close_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Closing handle"); s = handle->close_packet = LIBSSH2_ALLOC(session, packet_len); - if (!handle->close_packet) { + if(!handle->close_packet) { handle->close_state = libssh2_NB_state_idle; rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_CLOSE " "packet"); - } else { + } + else { _libssh2_store_u32(&s, packet_len - 4); *(s++) = SSH_FXP_CLOSE; @@ -2531,38 +2601,40 @@ sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle) } } - if (handle->close_state == libssh2_NB_state_created) { + if(handle->close_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, handle->close_packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if ((ssize_t)packet_len != rc) { + } + else if((ssize_t)packet_len != rc) { handle->close_state = libssh2_NB_state_idle; rc = _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send FXP_CLOSE command"); - } else + } + else handle->close_state = libssh2_NB_state_sent; LIBSSH2_FREE(session, handle->close_packet); handle->close_packet = NULL; } - if (handle->close_state == libssh2_NB_state_sent) { + if(handle->close_state == libssh2_NB_state_sent) { rc = sftp_packet_require(sftp, SSH_FXP_STATUS, handle->close_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } data = NULL; _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Packet too short in FXP_CLOSE command"); } - else if (rc) { + else if(rc) { _libssh2_error(session, rc, "Error waiting for status message"); } @@ -2575,11 +2647,12 @@ sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle) happened for which we should have set an error code */ assert(rc); - } else { + } + else { int retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode != LIBSSH2_FX_OK) { + if(retcode != LIBSSH2_FX_OK) { sftp->last_errno = retcode; handle->close_state = libssh2_NB_state_idle; rc = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, @@ -2590,11 +2663,11 @@ sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle) /* remove this handle from the parent's list */ _libssh2_list_remove(&handle->node); - if ((handle->handle_type == LIBSSH2_SFTP_HANDLE_DIR) - && handle->u.dir.names_left) { - LIBSSH2_FREE(session, handle->u.dir.names_packet); + if(handle->handle_type == LIBSSH2_SFTP_HANDLE_DIR) { + if(handle->u.dir.names_left) + LIBSSH2_FREE(session, handle->u.dir.names_packet); } - else { + else if(handle->handle_type == LIBSSH2_SFTP_HANDLE_FILE) { if(handle->u.file.data) LIBSSH2_FREE(session, handle->u.file.data); } @@ -2639,10 +2712,10 @@ static int sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename, unsigned char *s, *data; int rc; - if (sftp->unlink_state == libssh2_NB_state_idle) { + if(sftp->unlink_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Unlinking %s", filename); s = sftp->unlink_packet = LIBSSH2_ALLOC(session, packet_len); - if (!sftp->unlink_packet) { + if(!sftp->unlink_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_REMOVE " "packet"); @@ -2656,12 +2729,13 @@ static int sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename, sftp->unlink_state = libssh2_NB_state_created; } - if (sftp->unlink_state == libssh2_NB_state_created) { + if(sftp->unlink_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, sftp->unlink_packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if ((ssize_t)packet_len != rc) { + } + else if((ssize_t)packet_len != rc) { LIBSSH2_FREE(session, sftp->unlink_packet); sftp->unlink_packet = NULL; sftp->unlink_state = libssh2_NB_state_idle; @@ -2677,17 +2751,17 @@ static int sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename, rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->unlink_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP unlink packet too short"); } - else if (rc) { + else if(rc) { sftp->unlink_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP STATUS"); @@ -2698,9 +2772,10 @@ static int sftp_unlink(LIBSSH2_SFTP *sftp, const char *filename, retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode == LIBSSH2_FX_OK) { + if(retcode == LIBSSH2_FX_OK) { return 0; - } else { + } + else { sftp->last_errno = retcode; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP Protocol Error"); @@ -2744,17 +2819,17 @@ static int sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename, unsigned char *data; ssize_t rc; - if (sftp->version < 2) { + if(sftp->version < 2) { return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Server does not support RENAME"); } - if (sftp->rename_state == libssh2_NB_state_idle) { + if(sftp->rename_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Renaming %s to %s", source_filename, dest_filename); sftp->rename_s = sftp->rename_packet = LIBSSH2_ALLOC(session, packet_len); - if (!sftp->rename_packet) { + if(!sftp->rename_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_RENAME " "packet"); @@ -2768,18 +2843,19 @@ static int sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename, source_filename_len); _libssh2_store_str(&sftp->rename_s, dest_filename, dest_filename_len); - if (sftp->version >= 5) + if(sftp->version >= 5) _libssh2_store_u32(&sftp->rename_s, flags); sftp->rename_state = libssh2_NB_state_created; } - if (sftp->rename_state == libssh2_NB_state_created) { + if(sftp->rename_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, sftp->rename_packet, sftp->rename_s - sftp->rename_packet); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if ((ssize_t)packet_len != rc) { + } + else if((ssize_t)packet_len != rc) { LIBSSH2_FREE(session, sftp->rename_packet); sftp->rename_packet = NULL; sftp->rename_state = libssh2_NB_state_idle; @@ -2795,17 +2871,17 @@ static int sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename, rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->rename_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP rename packet too short"); } - else if (rc) { + else if(rc) { sftp->rename_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP STATUS"); @@ -2820,7 +2896,7 @@ static int sftp_rename(LIBSSH2_SFTP *sftp, const char *source_filename, /* now convert the SFTP error code to libssh2 return code or error message */ - switch (retcode) { + switch(retcode) { case LIBSSH2_FX_OK: retcode = LIBSSH2_ERROR_NONE; break; @@ -2884,11 +2960,11 @@ static int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st) static const unsigned char responses[2] = { SSH_FXP_EXTENDED_REPLY, SSH_FXP_STATUS }; - if (sftp->fstatvfs_state == libssh2_NB_state_idle) { + if(sftp->fstatvfs_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Getting file system statistics"); s = packet = LIBSSH2_ALLOC(session, packet_len); - if (!packet) { + if(!packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_EXTENDED " "packet"); @@ -2907,9 +2983,9 @@ static int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st) packet = sftp->fstatvfs_packet; } - if (sftp->fstatvfs_state == libssh2_NB_state_created) { + if(sftp->fstatvfs_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN || + if(rc == LIBSSH2_ERROR_EAGAIN || (0 <= rc && rc < (ssize_t)packet_len)) { sftp->fstatvfs_packet = packet; return LIBSSH2_ERROR_EAGAIN; @@ -2918,7 +2994,7 @@ static int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st) LIBSSH2_FREE(session, packet); sftp->fstatvfs_packet = NULL; - if (rc < 0) { + if(rc < 0) { sftp->fstatvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "_libssh2_channel_write() failed"); @@ -2929,23 +3005,23 @@ static int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st) rc = sftp_packet_requirev(sftp, 2, responses, sftp->fstatvfs_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP rename packet too short"); } - else if (rc) { + else if(rc) { sftp->fstatvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP EXTENDED REPLY"); } - if (data[0] == SSH_FXP_STATUS) { + if(data[0] == SSH_FXP_STATUS) { int retcode = _libssh2_ntohu32(data + 5); sftp->fstatvfs_state = libssh2_NB_state_idle; LIBSSH2_FREE(session, data); @@ -2954,7 +3030,7 @@ static int sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st) "SFTP Protocol Error"); } - if (data_len < 93) { + if(data_len < 93) { LIBSSH2_FREE(session, data); sftp->fstatvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, @@ -2994,7 +3070,8 @@ libssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle, LIBSSH2_SFTP_STATVFS *st) int rc; if(!handle || !st) return LIBSSH2_ERROR_BAD_USE; - BLOCK_ADJUST(rc, handle->sftp->channel->session, sftp_fstatvfs(handle, st)); + BLOCK_ADJUST(rc, handle->sftp->channel->session, + sftp_fstatvfs(handle, st)); return rc; } @@ -3019,11 +3096,11 @@ static int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path, static const unsigned char responses[2] = { SSH_FXP_EXTENDED_REPLY, SSH_FXP_STATUS }; - if (sftp->statvfs_state == libssh2_NB_state_idle) { + if(sftp->statvfs_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Getting file system statistics of %s", path); s = packet = LIBSSH2_ALLOC(session, packet_len); - if (!packet) { + if(!packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_EXTENDED " "packet"); @@ -3042,9 +3119,9 @@ static int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path, packet = sftp->statvfs_packet; } - if (sftp->statvfs_state == libssh2_NB_state_created) { + if(sftp->statvfs_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN || + if(rc == LIBSSH2_ERROR_EAGAIN || (0 <= rc && rc < (ssize_t)packet_len)) { sftp->statvfs_packet = packet; return LIBSSH2_ERROR_EAGAIN; @@ -3053,7 +3130,7 @@ static int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_FREE(session, packet); sftp->statvfs_packet = NULL; - if (rc < 0) { + if(rc < 0) { sftp->statvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "_libssh2_channel_write() failed"); @@ -3063,23 +3140,23 @@ static int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path, rc = sftp_packet_requirev(sftp, 2, responses, sftp->statvfs_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP fstat packet too short"); } - else if (rc) { + else if(rc) { sftp->statvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP EXTENDED REPLY"); } - if (data[0] == SSH_FXP_STATUS) { + if(data[0] == SSH_FXP_STATUS) { int retcode = _libssh2_ntohu32(data + 5); sftp->statvfs_state = libssh2_NB_state_idle; LIBSSH2_FREE(session, data); @@ -3088,7 +3165,7 @@ static int sftp_statvfs(LIBSSH2_SFTP *sftp, const char *path, "SFTP Protocol Error"); } - if (data_len < 93) { + if(data_len < 93) { LIBSSH2_FREE(session, data); sftp->statvfs_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, @@ -3146,27 +3223,32 @@ static int sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, LIBSSH2_CHANNEL *channel = sftp->channel; LIBSSH2_SESSION *session = channel->session; LIBSSH2_SFTP_ATTRIBUTES attrs = { - LIBSSH2_SFTP_ATTR_PERMISSIONS, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0 }; size_t data_len; int retcode; - /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */ - ssize_t packet_len = path_len + 13 + - sftp_attrsize(LIBSSH2_SFTP_ATTR_PERMISSIONS); + ssize_t packet_len; unsigned char *packet, *s, *data; int rc; - if (sftp->mkdir_state == libssh2_NB_state_idle) { + if(mode != LIBSSH2_SFTP_DEFAULT_MODE) { + /* Filetype in SFTP 3 and earlier */ + attrs.flags = LIBSSH2_SFTP_ATTR_PERMISSIONS; + attrs.permissions = mode | LIBSSH2_SFTP_ATTR_PFILETYPE_DIR; + } + + /* 13 = packet_len(4) + packet_type(1) + request_id(4) + path_len(4) */ + packet_len = path_len + 13 + sftp_attrsize(attrs.flags); + + if(sftp->mkdir_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Creating directory %s with mode 0%lo", path, mode); s = packet = LIBSSH2_ALLOC(session, packet_len); - if (!packet) { + if(!packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_MKDIR " "packet"); } - /* Filetype in SFTP 3 and earlier */ - attrs.permissions = mode | LIBSSH2_SFTP_ATTR_PFILETYPE_DIR; _libssh2_store_u32(&s, packet_len - 4); *(s++) = SSH_FXP_MKDIR; @@ -3182,13 +3264,13 @@ static int sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, packet = sftp->mkdir_packet; } - if (sftp->mkdir_state == libssh2_NB_state_created) { + if(sftp->mkdir_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { sftp->mkdir_packet = packet; return rc; } - if (packet_len != rc) { + if(packet_len != rc) { LIBSSH2_FREE(session, packet); sftp->mkdir_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, @@ -3201,17 +3283,17 @@ static int sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->mkdir_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP mkdir packet too short"); } - else if (rc) { + else if(rc) { sftp->mkdir_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP STATUS"); @@ -3222,10 +3304,11 @@ static int sftp_mkdir(LIBSSH2_SFTP *sftp, const char *path, retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode == LIBSSH2_FX_OK) { + if(retcode == LIBSSH2_FX_OK) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "OK!"); return 0; - } else { + } + else { sftp->last_errno = retcode; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP Protocol Error"); @@ -3264,11 +3347,11 @@ static int sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path, unsigned char *s, *data; int rc; - if (sftp->rmdir_state == libssh2_NB_state_idle) { + if(sftp->rmdir_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "Removing directory: %s", path); s = sftp->rmdir_packet = LIBSSH2_ALLOC(session, packet_len); - if (!sftp->rmdir_packet) { + if(!sftp->rmdir_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_RMDIR " "packet"); @@ -3283,12 +3366,13 @@ static int sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path, sftp->rmdir_state = libssh2_NB_state_created; } - if (sftp->rmdir_state == libssh2_NB_state_created) { + if(sftp->rmdir_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, sftp->rmdir_packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (packet_len != rc) { + } + else if(packet_len != rc) { LIBSSH2_FREE(session, sftp->rmdir_packet); sftp->rmdir_packet = NULL; sftp->rmdir_state = libssh2_NB_state_idle; @@ -3303,17 +3387,17 @@ static int sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path, rc = sftp_packet_require(sftp, SSH_FXP_STATUS, sftp->rmdir_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; } - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP rmdir packet too short"); } - else if (rc) { + else if(rc) { sftp->rmdir_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Error waiting for FXP STATUS"); @@ -3324,9 +3408,10 @@ static int sftp_rmdir(LIBSSH2_SFTP *sftp, const char *path, retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode == LIBSSH2_FX_OK) { + if(retcode == LIBSSH2_FX_OK) { return 0; - } else { + } + else { sftp->last_errno = retcode; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP Protocol Error"); @@ -3368,13 +3453,13 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, { SSH_FXP_ATTRS, SSH_FXP_STATUS }; int rc; - if (sftp->stat_state == libssh2_NB_state_idle) { + if(sftp->stat_state == libssh2_NB_state_idle) { _libssh2_debug(session, LIBSSH2_TRACE_SFTP, "%s %s", (stat_type == LIBSSH2_SFTP_SETSTAT) ? "Set-statting" : (stat_type == LIBSSH2_SFTP_LSTAT ? "LStatting" : "Statting"), path); s = sftp->stat_packet = LIBSSH2_ALLOC(session, packet_len); - if (!sftp->stat_packet) { + if(!sftp->stat_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for FXP_*STAT " "packet"); @@ -3382,7 +3467,7 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, _libssh2_store_u32(&s, packet_len - 4); - switch (stat_type) { + switch(stat_type) { case LIBSSH2_SFTP_SETSTAT: *(s++) = SSH_FXP_SETSTAT; break; @@ -3399,17 +3484,18 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, _libssh2_store_u32(&s, sftp->stat_request_id); _libssh2_store_str(&s, path, path_len); - if (stat_type == LIBSSH2_SFTP_SETSTAT) + if(stat_type == LIBSSH2_SFTP_SETSTAT) s += sftp_attr2bin(s, attrs); sftp->stat_state = libssh2_NB_state_created; } - if (sftp->stat_state == libssh2_NB_state_created) { + if(sftp->stat_state == libssh2_NB_state_created) { rc = _libssh2_channel_write(channel, 0, sftp->stat_packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return rc; - } else if (packet_len != rc) { + } + else if(packet_len != rc) { LIBSSH2_FREE(session, sftp->stat_packet); sftp->stat_packet = NULL; sftp->stat_state = libssh2_NB_state_idle; @@ -3424,16 +3510,16 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, rc = sftp_packet_requirev(sftp, 2, stat_responses, sftp->stat_request_id, &data, &data_len, 9); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; - else if (rc == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP stat packet too short"); } - else if (rc) { + else if(rc) { sftp->stat_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, "Timeout waiting for status message"); @@ -3441,14 +3527,16 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, sftp->stat_state = libssh2_NB_state_idle; - if (data[0] == SSH_FXP_STATUS) { + if(data[0] == SSH_FXP_STATUS) { int retcode; retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode == LIBSSH2_FX_OK) { + if(retcode == LIBSSH2_FX_OK) { + memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); return 0; - } else { + } + else { sftp->last_errno = retcode; return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP Protocol Error"); @@ -3456,7 +3544,7 @@ static int sftp_stat(LIBSSH2_SFTP *sftp, const char *path, } memset(attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES)); - if (sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) { + if(sftp_bin2attr(attrs, data + 5, data_len - 5) < 0) { LIBSSH2_FREE(session, data); return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Attributes too short in SFTP fstat"); @@ -3502,14 +3590,14 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, { SSH_FXP_NAME, SSH_FXP_STATUS }; int retcode; - if ((sftp->version < 3) && (link_type != LIBSSH2_SFTP_REALPATH)) { + if((sftp->version < 3) && (link_type != LIBSSH2_SFTP_REALPATH)) { return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Server does not support SYMLINK or READLINK"); } - if (sftp->symlink_state == libssh2_NB_state_idle) { + if(sftp->symlink_state == libssh2_NB_state_idle) { s = sftp->symlink_packet = LIBSSH2_ALLOC(session, packet_len); - if (!sftp->symlink_packet) { + if(!sftp->symlink_packet) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "SYMLINK/READLINK/REALPATH packet"); @@ -3523,7 +3611,7 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, _libssh2_store_u32(&s, packet_len - 4); - switch (link_type) { + switch(link_type) { case LIBSSH2_SFTP_REALPATH: *(s++) = SSH_FXP_REALPATH; break; @@ -3540,18 +3628,18 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, _libssh2_store_u32(&s, sftp->symlink_request_id); _libssh2_store_str(&s, path, path_len); - if (link_type == LIBSSH2_SFTP_SYMLINK) + if(link_type == LIBSSH2_SFTP_SYMLINK) _libssh2_store_str(&s, target, target_len); sftp->symlink_state = libssh2_NB_state_created; } - if (sftp->symlink_state == libssh2_NB_state_created) { + if(sftp->symlink_state == libssh2_NB_state_created) { ssize_t rc = _libssh2_channel_write(channel, 0, sftp->symlink_packet, packet_len); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; - else if (packet_len != rc) { + else if(packet_len != rc) { LIBSSH2_FREE(session, sftp->symlink_packet); sftp->symlink_packet = NULL; sftp->symlink_state = libssh2_NB_state_idle; @@ -3567,16 +3655,16 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, retcode = sftp_packet_requirev(sftp, 2, link_responses, sftp->symlink_request_id, &data, &data_len, 9); - if (retcode == LIBSSH2_ERROR_EAGAIN) + if(retcode == LIBSSH2_ERROR_EAGAIN) return retcode; - else if (retcode == LIBSSH2_ERROR_OUT_OF_BOUNDARY) { - if (data_len > 0) { + else if(retcode == LIBSSH2_ERROR_BUFFER_TOO_SMALL) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "SFTP symlink packet too short"); } - else if (retcode) { + else if(retcode) { sftp->symlink_state = libssh2_NB_state_idle; return _libssh2_error(session, retcode, "Error waiting for status message"); @@ -3584,12 +3672,10 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, sftp->symlink_state = libssh2_NB_state_idle; - if (data[0] == SSH_FXP_STATUS) { - int retcode; - + if(data[0] == SSH_FXP_STATUS) { retcode = _libssh2_ntohu32(data + 5); LIBSSH2_FREE(session, data); - if (retcode == LIBSSH2_FX_OK) + if(retcode == LIBSSH2_FX_OK) return LIBSSH2_ERROR_NONE; else { sftp->last_errno = retcode; @@ -3598,15 +3684,15 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, } } - if (_libssh2_ntohu32(data + 5) < 1) { + if(_libssh2_ntohu32(data + 5) < 1) { LIBSSH2_FREE(session, data); return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, "Invalid READLINK/REALPATH response, " "no name entries"); } - if (data_len < 13) { - if (data_len > 0) { + if(data_len < 13) { + if(data_len > 0) { LIBSSH2_FREE(session, data); } return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL, @@ -3615,7 +3701,7 @@ static int sftp_symlink(LIBSSH2_SFTP *sftp, const char *path, /* this reads a u32 and stores it into a signed 32bit value */ link_len = _libssh2_ntohu32(data + 9); - if (link_len < target_len) { + if(link_len < target_len) { memcpy(target, data + 13, link_len); target[link_len] = 0; retcode = (int)link_len; @@ -3662,7 +3748,7 @@ libssh2_sftp_last_error(LIBSSH2_SFTP *sftp) LIBSSH2_API LIBSSH2_CHANNEL * libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp) { - if (!sftp) + if(!sftp) return NULL; return sftp->channel; diff --git a/vendor/libssh2/src/sftp.h b/vendor/libssh2/src/sftp.h index 2ed32cea6..ae4162f10 100644 --- a/vendor/libssh2/src/sftp.h +++ b/vendor/libssh2/src/sftp.h @@ -122,6 +122,7 @@ struct _LIBSSH2_SFTP_HANDLE uint32_t names_left; void *names_packet; char *next_name; + size_t names_packet_len; } dir; } u; diff --git a/vendor/libssh2/src/transport.c b/vendor/libssh2/src/transport.c index 7317579f3..45e445c74 100644 --- a/vendor/libssh2/src/transport.c +++ b/vendor/libssh2/src/transport.c @@ -65,16 +65,16 @@ debugdump(LIBSSH2_SESSION * session, unsigned int width = 0x10; char buffer[256]; /* Must be enough for width*4 + about 30 or so */ size_t used; - static const char* hex_chars = "0123456789ABCDEF"; + static const char *hex_chars = "0123456789ABCDEF"; - if (!(session->showmask & LIBSSH2_TRACE_TRANS)) { + if(!(session->showmask & LIBSSH2_TRACE_TRANS)) { /* not asked for, bail out */ return; } used = snprintf(buffer, sizeof(buffer), "=> %s (%d bytes)\n", desc, (int) size); - if (session->tracehandler) + if(session->tracehandler) (session->tracehandler)(session, session->tracehandler_context, buffer, used); else @@ -86,9 +86,9 @@ debugdump(LIBSSH2_SESSION * session, /* hex not disabled, show it */ for(c = 0; c < width; c++) { - if (i + c < size) { - buffer[used++] = hex_chars[(ptr[i+c] >> 4) & 0xF]; - buffer[used++] = hex_chars[ptr[i+c] & 0xF]; + if(i + c < size) { + buffer[used++] = hex_chars[(ptr[i + c] >> 4) & 0xF]; + buffer[used++] = hex_chars[ptr[i + c] & 0xF]; } else { buffer[used++] = ' '; @@ -96,7 +96,7 @@ debugdump(LIBSSH2_SESSION * session, } buffer[used++] = ' '; - if ((width/2) - 1 == c) + if((width/2) - 1 == c) buffer[used++] = ' '; } @@ -110,7 +110,7 @@ debugdump(LIBSSH2_SESSION * session, buffer[used++] = '\n'; buffer[used] = 0; - if (session->tracehandler) + if(session->tracehandler) (session->tracehandler)(session, session->tracehandler_context, buffer, used); else @@ -138,8 +138,8 @@ decrypt(LIBSSH2_SESSION * session, unsigned char *source, we risk losing those extra bytes */ assert((len % blocksize) == 0); - while (len >= blocksize) { - if (session->remote.crypt->crypt(session, source, blocksize, + while(len >= blocksize) { + if(session->remote.crypt->crypt(session, source, blocksize, &session->remote.crypt_abstract)) { LIBSSH2_FREE(session, p->payload); return LIBSSH2_ERROR_DECRYPT; @@ -169,11 +169,11 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ ) int rc; int compressed; - if (session->fullpacket_state == libssh2_NB_state_idle) { + if(session->fullpacket_state == libssh2_NB_state_idle) { session->fullpacket_macstate = LIBSSH2_MAC_CONFIRMED; session->fullpacket_payload_len = p->packet_length - 1; - if (encrypted) { + if(encrypted) { /* Calculate MAC hash */ session->remote.mac->hash(session, macbuf, /* store hash here */ @@ -188,7 +188,7 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ ) * buffer. Note that 'payload_len' here is the packet_length * field which includes the padding but not the MAC. */ - if (memcmp(macbuf, p->payload + session->fullpacket_payload_len, + if(memcmp(macbuf, p->payload + session->fullpacket_payload_len, session->remote.mac->mac_len)) { session->fullpacket_macstate = LIBSSH2_MAC_INVALID; } @@ -206,7 +206,7 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ ) ((session->state & LIBSSH2_STATE_AUTHENTICATED) || session->local.comp->use_in_auth); - if (compressed && session->remote.comp_abstract) { + if(compressed && session->remote.comp_abstract) { /* * The buffer for the decompression (remote.comp_abstract) is * initialised in time when it is needed so as long it is NULL we @@ -237,13 +237,13 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ ) session->fullpacket_state = libssh2_NB_state_created; } - if (session->fullpacket_state == libssh2_NB_state_created) { + if(session->fullpacket_state == libssh2_NB_state_created) { rc = _libssh2_packet_add(session, p->payload, session->fullpacket_payload_len, session->fullpacket_macstate); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return rc; - if (rc) { + if(rc) { session->fullpacket_state = libssh2_NB_state_idle; return rc; } @@ -281,7 +281,6 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) unsigned char block[MAX_BLOCKSIZE]; int blocksize; int encrypted = 1; - size_t total_num; /* default clear the bit */ session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_INBOUND; @@ -298,7 +297,7 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) * of packet_read, then don't redirect, as that would be an infinite loop! */ - if (session->state & LIBSSH2_STATE_EXCHANGING_KEYS && + if(session->state & LIBSSH2_STATE_EXCHANGING_KEYS && !(session->state & LIBSSH2_STATE_KEX_ACTIVE)) { /* Whoever wants a packet won't get anything until the key re-exchange @@ -307,7 +306,7 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Redirecting into the" " key re-exchange from _libssh2_transport_read"); rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state); - if (rc) + if(rc) return rc; } @@ -316,20 +315,21 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) * I know this is very ugly and not a really good use of "goto", but * this case statement would be even uglier to do it any other way */ - if (session->readPack_state == libssh2_NB_state_jump1) { + if(session->readPack_state == libssh2_NB_state_jump1) { session->readPack_state = libssh2_NB_state_idle; encrypted = session->readPack_encrypted; goto libssh2_transport_read_point1; } do { - if (session->socket_state == LIBSSH2_SOCKET_DISCONNECTED) { + if(session->socket_state == LIBSSH2_SOCKET_DISCONNECTED) { return LIBSSH2_ERROR_NONE; } - if (session->state & LIBSSH2_STATE_NEWKEYS) { + if(session->state & LIBSSH2_STATE_NEWKEYS) { blocksize = session->remote.crypt->blocksize; - } else { + } + else { encrypted = 0; /* not encrypted */ blocksize = 5; /* not strictly true, but we can use 5 here to make the checks below work fine still */ @@ -348,18 +348,19 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) /* if remainbuf turns negative we have a bad internal error */ assert(remainbuf >= 0); - if (remainbuf < blocksize) { + if(remainbuf < blocksize) { /* If we have less than a blocksize left, it is too little data to deal with, read more */ ssize_t nread; /* move any remainder to the start of the buffer so that we can do a full refill */ - if (remainbuf) { + if(remainbuf) { memmove(p->buf, &p->buf[p->readidx], remainbuf); p->readidx = 0; p->writeidx = remainbuf; - } else { + } + else { /* nothing to move, just zero the indexes */ p->readidx = p->writeidx = 0; } @@ -369,10 +370,10 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) LIBSSH2_RECV(session, &p->buf[remainbuf], PACKETBUFSIZE - remainbuf, LIBSSH2_SOCKET_RECV_FLAGS(session)); - if (nread <= 0) { + if(nread <= 0) { /* check if this is due to EAGAIN and return the special return code if so, error out normally otherwise */ - if ((nread < 0) && (nread == -EAGAIN)) { + if((nread < 0) && (nread == -EAGAIN)) { session->socket_block_directions |= LIBSSH2_SESSION_BLOCK_INBOUND; return LIBSSH2_ERROR_EAGAIN; @@ -398,12 +399,14 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) /* how much data to deal with from the buffer */ numbytes = remainbuf; - if (!p->total_num) { + if(!p->total_num) { + size_t total_num; + /* No payload package area allocated yet. To know the size of this payload, we need to decrypt the first blocksize data. */ - if (numbytes < blocksize) { + if(numbytes < blocksize) { /* we can't act on anything less than blocksize, but this check is only done for the initial block since once we have got the start of a block we can in fact deal with fractions @@ -413,15 +416,16 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) return LIBSSH2_ERROR_EAGAIN; } - if (encrypted) { + if(encrypted) { rc = decrypt(session, &p->buf[p->readidx], block, blocksize); - if (rc != LIBSSH2_ERROR_NONE) { + if(rc != LIBSSH2_ERROR_NONE) { return rc; } /* save the first 5 bytes of the decrypted package, to be used in the hash calculation later down. */ - memcpy(p->init, &p->buf[p->readidx], 5); - } else { + memcpy(p->init, block, 5); + } + else { /* the data is plain, just copy it verbatim to the working block buffer */ memcpy(block, &p->buf[p->readidx], blocksize); @@ -434,17 +438,15 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) * and we can extract packet and padding length from it */ p->packet_length = _libssh2_ntohu32(block); - if (p->packet_length < 1) - return LIBSSH2_ERROR_DECRYPT; - - p->padding_length = block[4]; if(p->packet_length < 1) { return LIBSSH2_ERROR_DECRYPT; } else if(p->packet_length > LIBSSH2_PACKET_MAXPAYLOAD) { return LIBSSH2_ERROR_OUT_OF_BOUNDARY; } - else if ( p->padding_length > p->packet_length - 1 ) { + + p->padding_length = block[4]; + if(p->padding_length > p->packet_length - 1) { return LIBSSH2_ERROR_DECRYPT; } @@ -463,28 +465,29 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) * or less (including length, padding length, payload, * padding, and MAC.)." */ - if (total_num > LIBSSH2_PACKET_MAXPAYLOAD) { + if(total_num > LIBSSH2_PACKET_MAXPAYLOAD) { return LIBSSH2_ERROR_OUT_OF_BOUNDARY; } /* Get a packet handle put data into. We get one to hold all data, including padding and MAC. */ p->payload = LIBSSH2_ALLOC(session, total_num); - if (!p->payload) { + if(!p->payload) { return LIBSSH2_ERROR_ALLOC; } p->total_num = total_num; /* init write pointer to start of payload buffer */ p->wptr = p->payload; - if (blocksize > 5) { + if(blocksize > 5) { /* copy the data from index 5 to the end of the blocksize from the temporary buffer to the start of the decrypted buffer */ - if (blocksize - 5 <= total_num) { + if(blocksize - 5 <= (int) total_num) { memcpy(p->wptr, &block[5], blocksize - 5); p->wptr += blocksize - 5; /* advance write pointer */ - } else { + } + else { return LIBSSH2_ERROR_OUT_OF_BOUNDARY; } } @@ -501,13 +504,13 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) package */ remainpack = p->total_num - p->data_num; - if (numbytes > remainpack) { + if(numbytes > remainpack) { /* if we have more data in the buffer than what is going into this particular packet, we limit this round to this packet only */ numbytes = remainpack; } - if (encrypted) { + if(encrypted) { /* At the end of the incoming stream, there is a MAC, and we don't want to decrypt that since we need it "raw". We MUST however decrypt the padding data @@ -517,13 +520,14 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) /* if what we have plus numbytes is bigger than the total minus the skip margin, we should lower the amount to decrypt even more */ - if ((p->data_num + numbytes) > (p->total_num - skip)) { + if((p->data_num + numbytes) > (p->total_num - skip)) { numdecrypt = (p->total_num - skip) - p->data_num; - } else { + } + else { int frac; numdecrypt = numbytes; frac = numdecrypt % blocksize; - if (frac) { + if(frac) { /* not an aligned amount of blocks, align it */ numdecrypt -= frac; @@ -532,16 +536,17 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) numbytes = 0; } } - } else { + } + else { /* unencrypted data should not be decrypted at all */ numdecrypt = 0; } /* if there are bytes to decrypt, do that */ - if (numdecrypt > 0) { + if(numdecrypt > 0) { /* now decrypt the lot */ rc = decrypt(session, &p->buf[p->readidx], p->wptr, numdecrypt); - if (rc != LIBSSH2_ERROR_NONE) { + if(rc != LIBSSH2_ERROR_NONE) { p->total_num = 0; /* no packet buffer available */ return rc; } @@ -559,9 +564,9 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) /* if there are bytes to copy that aren't decrypted, simply copy them as-is to the target buffer */ - if (numbytes > 0) { - - if (numbytes <= total_num - (p->wptr - p->payload)) { + if(numbytes > 0) { + + if(numbytes <= (int)(p->total_num - (p->wptr - p->payload))) { memcpy(p->wptr, &p->buf[p->readidx], numbytes); } else { @@ -580,21 +585,21 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) current packet */ remainpack = p->total_num - p->data_num; - if (!remainpack) { + if(!remainpack) { /* we have a full packet */ libssh2_transport_read_point1: rc = fullpacket(session, encrypted); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { - if (session->packAdd_state != libssh2_NB_state_idle) - { + if(session->packAdd_state != libssh2_NB_state_idle) { /* fullpacket only returns LIBSSH2_ERROR_EAGAIN if - * libssh2_packet_add returns LIBSSH2_ERROR_EAGAIN. If that - * returns LIBSSH2_ERROR_EAGAIN but the packAdd_state is idle, - * then the packet has been added to the brigade, but some - * immediate action that was taken based on the packet - * type (such as key re-exchange) is not yet complete. - * Clear the way for a new packet to be read in. + * libssh2_packet_add returns LIBSSH2_ERROR_EAGAIN. If + * that returns LIBSSH2_ERROR_EAGAIN but the packAdd_state + * is idle, then the packet has been added to the brigade, + * but some immediate action that was taken based on the + * packet type (such as key re-exchange) is not yet + * complete. Clear the way for a new packet to be read + * in. */ session->readPack_encrypted = encrypted; session->readPack_state = libssh2_NB_state_jump1; @@ -607,7 +612,7 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) return rc; } - } while (1); /* loop */ + } while(1); /* loop */ return LIBSSH2_ERROR_SOCKET_RECV; /* we never reach this point */ } @@ -620,13 +625,13 @@ send_existing(LIBSSH2_SESSION *session, const unsigned char *data, ssize_t length; struct transportpacket *p = &session->packet; - if (!p->olen) { + if(!p->olen) { *ret = 0; return LIBSSH2_ERROR_NONE; } /* send as much as possible of the existing packet */ - if ((data != p->odata) || (data_len != p->olen)) { + if((data != p->odata) || (data_len != p->olen)) { /* When we are about to complete the sending of a packet, it is vital that the caller doesn't try to send a new/different packet since we don't add this one up until the previous one has been sent. To @@ -642,7 +647,7 @@ send_existing(LIBSSH2_SESSION *session, const unsigned char *data, rc = LIBSSH2_SEND(session, &p->outbuf[p->osent], length, LIBSSH2_SOCKET_SEND_FLAGS(session)); - if (rc < 0) + if(rc < 0) _libssh2_debug(session, LIBSSH2_TRACE_SOCKET, "Error sending %d bytes: %d", length, -rc); else { @@ -653,7 +658,7 @@ send_existing(LIBSSH2_SESSION *session, const unsigned char *data, &p->outbuf[p->osent], rc); } - if (rc == length) { + if(rc == length) { /* the remainder of the package was sent */ p->ototal_num = 0; p->olen = 0; @@ -663,9 +668,9 @@ send_existing(LIBSSH2_SESSION *session, const unsigned char *data, return LIBSSH2_ERROR_NONE; } - else if (rc < 0) { + else if(rc < 0) { /* nothing was sent */ - if (rc != -EAGAIN) + if(rc != -EAGAIN) /* send failure! */ return LIBSSH2_ERROR_SOCKET_SEND; @@ -725,14 +730,14 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, * * See the similar block in _libssh2_transport_read for more details. */ - if (session->state & LIBSSH2_STATE_EXCHANGING_KEYS && + if(session->state & LIBSSH2_STATE_EXCHANGING_KEYS && !(session->state & LIBSSH2_STATE_KEX_ACTIVE)) { /* Don't write any new packets if we're still in the middle of a key * exchange. */ _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Redirecting into the" " key re-exchange from _libssh2_transport_send"); rc = _libssh2_kex_exchange(session, 1, &session->startup_key_state); - if (rc) + if(rc) return rc; } @@ -743,12 +748,12 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, /* FIRST, check if we have a pending write to complete. send_existing only sanity-check data and data_len and not data2 and data2_len!! */ rc = send_existing(session, data, data_len, &ret); - if (rc) + if(rc) return rc; session->socket_block_directions &= ~LIBSSH2_SESSION_BLOCK_OUTBOUND; - if (ret) + if(ret) /* set by send_existing if data was sent */ return rc; @@ -760,7 +765,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, ((session->state & LIBSSH2_STATE_AUTHENTICATED) || session->local.comp->use_in_auth); - if (encrypted && compressed) { + if(encrypted && compressed) { /* the idea here is that these function must fail if the output gets larger than what fits in the assigned buffer so thus they don't check the input size as we don't know how much it compresses */ @@ -781,7 +786,8 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, dest2_len -= dest_len; rc = session->local.comp->comp(session, - &p->outbuf[5+dest_len], &dest2_len, + &p->outbuf[5 + dest_len], + &dest2_len, data2, data2_len, &session->local.comp_abstract); } @@ -801,7 +807,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, /* copy the payload data */ memcpy(&p->outbuf[5], data, data_len); if(data2 && data2_len) - memcpy(&p->outbuf[5+data_len], data2, data2_len); + memcpy(&p->outbuf[5 + data_len], data2, data2_len); data_len += data2_len; /* use the combined length */ } @@ -825,7 +831,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, /* if the padding becomes too small we add another blocksize worth of it (taken from the original libssh2 where it didn't have any real explanation) */ - if (padding_length < 4) { + if(padding_length < 4) { padding_length += blocksize; } #ifdef RANDOM_PADDING @@ -854,7 +860,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, /* fill the padding area with random junk */ _libssh2_random(p->outbuf + 5 + data_len, padding_length); - if (encrypted) { + if(encrypted) { size_t i; /* Calculate MAC hash. Put the output at index packet_length, @@ -870,7 +876,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, The MAC field is not encrypted. */ for(i = 0; i < packet_length; i += session->local.crypt->blocksize) { unsigned char *ptr = &p->outbuf[i]; - if (session->local.crypt->crypt(session, ptr, + if(session->local.crypt->crypt(session, ptr, session->local.crypt->blocksize, &session->local.crypt_abstract)) return LIBSSH2_ERROR_ENCRYPT; /* encryption failure */ @@ -881,7 +887,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, ret = LIBSSH2_SEND(session, p->outbuf, total_length, LIBSSH2_SOCKET_SEND_FLAGS(session)); - if (ret < 0) + if(ret < 0) _libssh2_debug(session, LIBSSH2_TRACE_SOCKET, "Error sending %d bytes: %d", total_length, -ret); else { @@ -890,8 +896,8 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, debugdump(session, "libssh2_transport_write send()", p->outbuf, ret); } - if (ret != total_length) { - if (ret >= 0 || ret == -EAGAIN) { + if(ret != total_length) { + if(ret >= 0 || ret == -EAGAIN) { /* the whole packet could not be sent, save the rest */ session->socket_block_directions |= LIBSSH2_SESSION_BLOCK_OUTBOUND; p->odata = orgdata; diff --git a/vendor/libssh2/src/userauth.c b/vendor/libssh2/src/userauth.c index c02d81d0e..949dc1c66 100644 --- a/vendor/libssh2/src/userauth.c +++ b/vendor/libssh2/src/userauth.c @@ -71,7 +71,7 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, unsigned char *s; int rc; - if (session->userauth_list_state == libssh2_NB_state_idle) { + if(session->userauth_list_state == libssh2_NB_state_idle) { /* Zero the whole thing out */ memset(&session->userauth_list_packet_requirev_state, 0, sizeof(session->userauth_list_packet_requirev_state)); @@ -80,7 +80,7 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, s = session->userauth_list_data = LIBSSH2_ALLOC(session, session->userauth_list_data_len); - if (!session->userauth_list_data) { + if(!session->userauth_list_data) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for userauth_list"); return NULL; @@ -94,11 +94,11 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, session->userauth_list_state = libssh2_NB_state_created; } - if (session->userauth_list_state == libssh2_NB_state_created) { + if(session->userauth_list_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, session->userauth_list_data, session->userauth_list_data_len, (unsigned char *)"none", 4); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting userauth list"); return NULL; @@ -107,7 +107,7 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, LIBSSH2_FREE(session, session->userauth_list_data); session->userauth_list_data = NULL; - if (rc) { + if(rc) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send userauth-none request"); session->userauth_list_state = libssh2_NB_state_idle; @@ -117,23 +117,24 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, session->userauth_list_state = libssh2_NB_state_sent; } - if (session->userauth_list_state == libssh2_NB_state_sent) { + if(session->userauth_list_state == libssh2_NB_state_sent) { rc = _libssh2_packet_requirev(session, reply_codes, &session->userauth_list_data, &session->userauth_list_data_len, 0, NULL, 0, - &session->userauth_list_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + &session->userauth_list_packet_requirev_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting userauth list"); return NULL; - } else if (rc || (session->userauth_list_data_len < 1)) { + } + else if(rc || (session->userauth_list_data_len < 1)) { _libssh2_error(session, rc, "Failed getting response"); session->userauth_list_state = libssh2_NB_state_idle; return NULL; } - if (session->userauth_list_data[0] == SSH_MSG_USERAUTH_SUCCESS) { + if(session->userauth_list_data[0] == SSH_MSG_USERAUTH_SUCCESS) { /* Wow, who'dve thought... */ _libssh2_error(session, LIBSSH2_ERROR_NONE, "No error"); LIBSSH2_FREE(session, session->userauth_list_data); @@ -143,7 +144,7 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, return NULL; } - if(session->userauth_list_data_len < 5) { + if(session->userauth_list_data_len < 5) { LIBSSH2_FREE(session, session->userauth_list_data); session->userauth_list_data = NULL; _libssh2_error(session, LIBSSH2_ERROR_PROTO, @@ -157,6 +158,7 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, "Unexpected userauth list size"); return NULL; } + /* Do note that the memory areas overlap! */ memmove(session->userauth_list_data, session->userauth_list_data + 5, methods_len); @@ -217,7 +219,7 @@ userauth_password(LIBSSH2_SESSION *session, }; int rc; - if (session->userauth_pswd_state == libssh2_NB_state_idle) { + if(session->userauth_pswd_state == libssh2_NB_state_idle) { /* Zero the whole thing out */ memset(&session->userauth_pswd_packet_requirev_state, 0, sizeof(session->userauth_pswd_packet_requirev_state)); @@ -235,7 +237,7 @@ userauth_password(LIBSSH2_SESSION *session, struct */ s = session->userauth_pswd_data = LIBSSH2_ALLOC(session, session->userauth_pswd_data_len); - if (!session->userauth_pswd_data) { + if(!session->userauth_pswd_data) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "userauth-password request"); @@ -255,11 +257,11 @@ userauth_password(LIBSSH2_SESSION *session, session->userauth_pswd_state = libssh2_NB_state_created; } - if (session->userauth_pswd_state == libssh2_NB_state_created) { + if(session->userauth_pswd_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, session->userauth_pswd_data, session->userauth_pswd_data_len, password, password_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block writing password request"); } @@ -268,7 +270,7 @@ userauth_password(LIBSSH2_SESSION *session, LIBSSH2_FREE(session, session->userauth_pswd_data); session->userauth_pswd_data = NULL; - if (rc) { + if(rc) { session->userauth_pswd_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send userauth-password request"); @@ -279,10 +281,10 @@ userauth_password(LIBSSH2_SESSION *session, password_response: - if ((session->userauth_pswd_state == libssh2_NB_state_sent) + if((session->userauth_pswd_state == libssh2_NB_state_sent) || (session->userauth_pswd_state == libssh2_NB_state_sent1) || (session->userauth_pswd_state == libssh2_NB_state_sent2)) { - if (session->userauth_pswd_state == libssh2_NB_state_sent) { + if(session->userauth_pswd_state == libssh2_NB_state_sent) { rc = _libssh2_packet_requirev(session, reply_codes, &session->userauth_pswd_data, &session->userauth_pswd_data_len, @@ -290,8 +292,8 @@ userauth_password(LIBSSH2_SESSION *session, &session-> userauth_pswd_packet_requirev_state); - if (rc) { - if (rc != LIBSSH2_ERROR_EAGAIN) + if(rc) { + if(rc != LIBSSH2_ERROR_EAGAIN) session->userauth_pswd_state = libssh2_NB_state_idle; return _libssh2_error(session, rc, @@ -303,7 +305,7 @@ userauth_password(LIBSSH2_SESSION *session, "Unexpected packet size"); } - if (session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_SUCCESS) { + if(session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_SUCCESS) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Password authentication successful"); LIBSSH2_FREE(session, session->userauth_pswd_data); @@ -311,7 +313,9 @@ userauth_password(LIBSSH2_SESSION *session, session->state |= LIBSSH2_STATE_AUTHENTICATED; session->userauth_pswd_state = libssh2_NB_state_idle; return 0; - } else if (session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_FAILURE) { + } + else if(session->userauth_pswd_data[0] == + SSH_MSG_USERAUTH_FAILURE) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Password authentication failed"); LIBSSH2_FREE(session, session->userauth_pswd_data); @@ -335,41 +339,48 @@ userauth_password(LIBSSH2_SESSION *session, "Unexpected packet size"); } - if ((session->userauth_pswd_data[0] == + if((session->userauth_pswd_data[0] == SSH_MSG_USERAUTH_PASSWD_CHANGEREQ) || (session->userauth_pswd_data0 == SSH_MSG_USERAUTH_PASSWD_CHANGEREQ)) { session->userauth_pswd_data0 = SSH_MSG_USERAUTH_PASSWD_CHANGEREQ; - if ((session->userauth_pswd_state == libssh2_NB_state_sent1) || + if((session->userauth_pswd_state == libssh2_NB_state_sent1) || (session->userauth_pswd_state == libssh2_NB_state_sent2)) { - if (session->userauth_pswd_state == libssh2_NB_state_sent1) { + if(session->userauth_pswd_state == libssh2_NB_state_sent1) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Password change required"); LIBSSH2_FREE(session, session->userauth_pswd_data); session->userauth_pswd_data = NULL; } - if (passwd_change_cb) { - if (session->userauth_pswd_state == libssh2_NB_state_sent1) { + if(passwd_change_cb) { + if(session->userauth_pswd_state == + libssh2_NB_state_sent1) { passwd_change_cb(session, &session->userauth_pswd_newpw, &session->userauth_pswd_newpw_len, &session->abstract); - if (!session->userauth_pswd_newpw) { + if(!session->userauth_pswd_newpw) { return _libssh2_error(session, - LIBSSH2_ERROR_PASSWORD_EXPIRED, + LIBSSH2_ERROR_PASSWORD_EXPIRED, "Password expired, and " "callback failed"); } /* basic data_len + newpw_len(4) */ - session->userauth_pswd_data_len = - username_len + password_len + 44; + if(username_len + password_len + 44 <= UINT_MAX) { + session->userauth_pswd_data_len = + username_len + password_len + 44; + s = session->userauth_pswd_data = + LIBSSH2_ALLOC(session, + session->userauth_pswd_data_len); + } + else { + s = session->userauth_pswd_data = NULL; + session->userauth_pswd_data_len = 0; + } - s = session->userauth_pswd_data = - LIBSSH2_ALLOC(session, - session->userauth_pswd_data_len); - if (!session->userauth_pswd_data) { + if(!session->userauth_pswd_data) { LIBSSH2_FREE(session, session->userauth_pswd_newpw); session->userauth_pswd_newpw = NULL; @@ -394,15 +405,17 @@ userauth_password(LIBSSH2_SESSION *session, session->userauth_pswd_state = libssh2_NB_state_sent2; } - if (session->userauth_pswd_state == libssh2_NB_state_sent2) { + if(session->userauth_pswd_state == + libssh2_NB_state_sent2) { rc = _libssh2_transport_send(session, - session->userauth_pswd_data, - session->userauth_pswd_data_len, - (unsigned char *) - session->userauth_pswd_newpw, - session->userauth_pswd_newpw_len); - if (rc == LIBSSH2_ERROR_EAGAIN) { - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + session->userauth_pswd_data, + session->userauth_pswd_data_len, + (unsigned char *) + session->userauth_pswd_newpw, + session->userauth_pswd_newpw_len); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return _libssh2_error(session, + LIBSSH2_ERROR_EAGAIN, "Would block waiting"); } @@ -412,7 +425,7 @@ userauth_password(LIBSSH2_SESSION *session, LIBSSH2_FREE(session, session->userauth_pswd_newpw); session->userauth_pswd_newpw = NULL; - if (rc) { + if(rc) { return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send userauth " @@ -427,7 +440,8 @@ userauth_password(LIBSSH2_SESSION *session, goto password_response; } } - } else { + } + else { session->userauth_pswd_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_PASSWORD_EXPIRED, "Password Expired, and no callback " @@ -455,7 +469,8 @@ LIBSSH2_API int libssh2_userauth_password_ex(LIBSSH2_SESSION *session, const char *username, unsigned int username_len, const char *password, unsigned int password_len, - LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb))) + LIBSSH2_PASSWD_CHANGEREQ_FUNC + ((*passwd_change_cb))) { int rc; BLOCK_ADJUST(rc, session, @@ -477,13 +492,13 @@ memory_read_publickey(LIBSSH2_SESSION * session, unsigned char **method, size_t pubkey_len = pubkeyfiledata_len; unsigned int tmp_len; - if (pubkeyfiledata_len <= 1) { + if(pubkeyfiledata_len <= 1) { return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Invalid data in public key file"); } pubkey = LIBSSH2_ALLOC(session, pubkeyfiledata_len); - if (!pubkey) { + if(!pubkey) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for public key data"); } @@ -493,16 +508,17 @@ memory_read_publickey(LIBSSH2_SESSION * session, unsigned char **method, /* * Remove trailing whitespace */ - while (pubkey_len && isspace(pubkey[pubkey_len - 1])) + while(pubkey_len && isspace(pubkey[pubkey_len - 1])) pubkey_len--; - if (!pubkey_len) { + if(!pubkey_len) { LIBSSH2_FREE(session, pubkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Missing public key data"); } - if ((sp1 = memchr(pubkey, ' ', pubkey_len)) == NULL) { + sp1 = memchr(pubkey, ' ', pubkey_len); + if(sp1 == NULL) { LIBSSH2_FREE(session, pubkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Invalid public key data"); @@ -510,12 +526,13 @@ memory_read_publickey(LIBSSH2_SESSION * session, unsigned char **method, sp1++; - if ((sp2 = memchr(sp1, ' ', pubkey_len - (sp1 - pubkey - 1))) == NULL) { + sp2 = memchr(sp1, ' ', pubkey_len - (sp1 - pubkey)); + if(sp2 == NULL) { /* Assume that the id string is missing, but that it's okay */ sp2 = pubkey + pubkey_len; } - if (libssh2_base64_decode(session, (char **) &tmp, &tmp_len, + if(libssh2_base64_decode(session, (char **) &tmp, &tmp_len, (char *) sp1, sp2 - sp1)) { LIBSSH2_FREE(session, pubkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, @@ -561,29 +578,29 @@ file_read_publickey(LIBSSH2_SESSION * session, unsigned char **method, _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Loading public key file: %s", pubkeyfile); /* Read Public Key */ - fd = fopen(pubkeyfile, "r"); - if (!fd) { + fd = fopen(pubkeyfile, FOPEN_READTEXT); + if(!fd) { return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Unable to open public key file"); } - while (!feof(fd) && 1 == fread(&c, 1, 1, fd) && c != '\r' && c != '\n') { + while(!feof(fd) && 1 == fread(&c, 1, 1, fd) && c != '\r' && c != '\n') { pubkey_len++; } rewind(fd); - if (pubkey_len <= 1) { + if(pubkey_len <= 1) { fclose(fd); return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Invalid data in public key file"); } pubkey = LIBSSH2_ALLOC(session, pubkey_len); - if (!pubkey) { + if(!pubkey) { fclose(fd); return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for public key data"); } - if (fread(pubkey, 1, pubkey_len, fd) != pubkey_len) { + if(fread(pubkey, 1, pubkey_len, fd) != pubkey_len) { LIBSSH2_FREE(session, pubkey); fclose(fd); return _libssh2_error(session, LIBSSH2_ERROR_FILE, @@ -593,17 +610,18 @@ file_read_publickey(LIBSSH2_SESSION * session, unsigned char **method, /* * Remove trailing whitespace */ - while (pubkey_len && isspace(pubkey[pubkey_len - 1])) { + while(pubkey_len && isspace(pubkey[pubkey_len - 1])) { pubkey_len--; } - if (!pubkey_len) { + if(!pubkey_len) { LIBSSH2_FREE(session, pubkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Missing public key data"); } - if ((sp1 = memchr(pubkey, ' ', pubkey_len)) == NULL) { + sp1 = memchr(pubkey, ' ', pubkey_len); + if(sp1 == NULL) { LIBSSH2_FREE(session, pubkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Invalid public key data"); @@ -612,12 +630,13 @@ file_read_publickey(LIBSSH2_SESSION * session, unsigned char **method, sp1++; sp_len = sp1 > pubkey ? (sp1 - pubkey) - 1 : 0; - if ((sp2 = memchr(sp1, ' ', pubkey_len - sp_len)) == NULL) { + sp2 = memchr(sp1, ' ', pubkey_len - sp_len); + if(sp2 == NULL) { /* Assume that the id string is missing, but that it's okay */ sp2 = pubkey + pubkey_len; } - if (libssh2_base64_decode(session, (char **) &tmp, &tmp_len, + if(libssh2_base64_decode(session, (char **) &tmp, &tmp_len, (char *) sp1, sp2 - sp1)) { LIBSSH2_FREE(session, pubkey); return _libssh2_error(session, LIBSSH2_ERROR_FILE, @@ -649,8 +668,8 @@ memory_read_privatekey(LIBSSH2_SESSION * session, *hostkey_method = NULL; *hostkey_abstract = NULL; - while (*hostkey_methods_avail && (*hostkey_methods_avail)->name) { - if ((*hostkey_methods_avail)->initPEMFromMemory + while(*hostkey_methods_avail && (*hostkey_methods_avail)->name) { + if((*hostkey_methods_avail)->initPEMFromMemory && strncmp((*hostkey_methods_avail)->name, (const char *) method, method_len) == 0) { *hostkey_method = *hostkey_methods_avail; @@ -658,12 +677,12 @@ memory_read_privatekey(LIBSSH2_SESSION * session, } hostkey_methods_avail++; } - if (!*hostkey_method) { + if(!*hostkey_method) { return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE, "No handler for specified private key"); } - if ((*hostkey_method)-> + if((*hostkey_method)-> initPEMFromMemory(session, privkeyfiledata, privkeyfiledata_len, (unsigned char *) passphrase, hostkey_abstract)) { @@ -691,8 +710,8 @@ file_read_privatekey(LIBSSH2_SESSION * session, privkeyfile); *hostkey_method = NULL; *hostkey_abstract = NULL; - while (*hostkey_methods_avail && (*hostkey_methods_avail)->name) { - if ((*hostkey_methods_avail)->initPEM + while(*hostkey_methods_avail && (*hostkey_methods_avail)->name) { + if((*hostkey_methods_avail)->initPEM && strncmp((*hostkey_methods_avail)->name, (const char *) method, method_len) == 0) { *hostkey_method = *hostkey_methods_avail; @@ -700,12 +719,12 @@ file_read_privatekey(LIBSSH2_SESSION * session, } hostkey_methods_avail++; } - if (!*hostkey_method) { + if(!*hostkey_method) { return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE, "No handler for specified private key"); } - if ((*hostkey_method)-> + if((*hostkey_method)-> initPEM(session, privkeyfile, (unsigned char *) passphrase, hostkey_abstract)) { return _libssh2_error(session, LIBSSH2_ERROR_FILE, @@ -743,15 +762,15 @@ sign_frommemory(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, datavec.iov_base = (void *)data; datavec.iov_len = data_len; - if (privkeyobj->signv(session, sig, sig_len, 1, &datavec, + if(privkeyobj->signv(session, sig, sig_len, 1, &datavec, &hostkey_abstract)) { - if (privkeyobj->dtor) { - privkeyobj->dtor(session, abstract); + if(privkeyobj->dtor) { + privkeyobj->dtor(session, &hostkey_abstract); } return -1; } - if (privkeyobj->dtor) { + if(privkeyobj->dtor) { privkeyobj->dtor(session, &hostkey_abstract); } return 0; @@ -779,15 +798,15 @@ sign_fromfile(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, datavec.iov_base = (void *)data; datavec.iov_len = data_len; - if (privkeyobj->signv(session, sig, sig_len, 1, &datavec, + if(privkeyobj->signv(session, sig, sig_len, 1, &datavec, &hostkey_abstract)) { - if (privkeyobj->dtor) { + if(privkeyobj->dtor) { privkeyobj->dtor(session, &hostkey_abstract); } return -1; } - if (privkeyobj->dtor) { + if(privkeyobj->dtor) { privkeyobj->dtor(session, &hostkey_abstract); } return 0; @@ -809,9 +828,15 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, { int rc; - if (session->userauth_host_state == libssh2_NB_state_idle) { +#if !LIBSSH2_RSA + return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, + "RSA is not supported by crypto backend"); +#endif + + if(session->userauth_host_state == libssh2_NB_state_idle) { const LIBSSH2_HOSTKEY_METHOD *privkeyobj; - unsigned char *pubkeydata, *sig = NULL; + unsigned char *pubkeydata = NULL; + unsigned char *sig = NULL; size_t pubkeydata_len = 0; size_t sig_len = 0; void *abstract; @@ -822,7 +847,7 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, memset(&session->userauth_host_packet_requirev_state, 0, sizeof(session->userauth_host_packet_requirev_state)); - if (publickey) { + if(publickey) { rc = file_read_publickey(session, &session->userauth_host_method, &session->userauth_host_method_len, &pubkeydata, &pubkeydata_len, publickey); @@ -837,7 +862,7 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, &session->userauth_host_method_len, &pubkeydata, &pubkeydata_len, privatekey, passphrase); - if (rc) + if(rc) /* libssh2_pub_priv_keyfile calls _libssh2_error() */ return rc; } @@ -862,7 +887,7 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, session->userauth_host_packet_len + 4 + (4 + session->userauth_host_method_len) + (4 + pubkeydata_len)); - if (!session->userauth_host_packet) { + if(!session->userauth_host_packet) { LIBSSH2_FREE(session, session->userauth_host_method); session->userauth_host_method = NULL; LIBSSH2_FREE(session, pubkeydata); @@ -906,31 +931,31 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, datavec[2].iov_base = (void *)session->userauth_host_packet; datavec[2].iov_len = session->userauth_host_packet_len; - if (privkeyobj && privkeyobj->signv && + if(privkeyobj && privkeyobj->signv && privkeyobj->signv(session, &sig, &sig_len, 3, datavec, &abstract)) { LIBSSH2_FREE(session, session->userauth_host_method); session->userauth_host_method = NULL; LIBSSH2_FREE(session, session->userauth_host_packet); session->userauth_host_packet = NULL; - if (privkeyobj->dtor) { + if(privkeyobj->dtor) { privkeyobj->dtor(session, &abstract); } return -1; } - if (privkeyobj && privkeyobj->dtor) { + if(privkeyobj && privkeyobj->dtor) { privkeyobj->dtor(session, &abstract); } - if (sig_len > pubkeydata_len) { + if(sig_len > pubkeydata_len) { unsigned char *newpacket; /* Should *NEVER* happen, but...well.. better safe than sorry */ newpacket = LIBSSH2_REALLOC(session, session->userauth_host_packet, session->userauth_host_packet_len + 4 + (4 + session->userauth_host_method_len) + (4 + sig_len)); /* PK sigblob */ - if (!newpacket) { + if(!newpacket) { LIBSSH2_FREE(session, sig); LIBSSH2_FREE(session, session->userauth_host_packet); session->userauth_host_packet = NULL; @@ -947,7 +972,8 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, session->userauth_host_packet + session->userauth_host_packet_len; _libssh2_store_u32(&session->userauth_host_s, - 4 + session->userauth_host_method_len + 4 + sig_len); + 4 + session->userauth_host_method_len + + 4 + sig_len); _libssh2_store_str(&session->userauth_host_s, (const char *)session->userauth_host_method, session->userauth_host_method_len); @@ -964,15 +990,16 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, session->userauth_host_state = libssh2_NB_state_created; } - if (session->userauth_host_state == libssh2_NB_state_created) { + if(session->userauth_host_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, session->userauth_host_packet, session->userauth_host_s - session->userauth_host_packet, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block"); } - else if (rc) { + else if(rc) { LIBSSH2_FREE(session, session->userauth_host_packet); session->userauth_host_packet = NULL; session->userauth_host_state = libssh2_NB_state_idle; @@ -985,7 +1012,7 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, session->userauth_host_state = libssh2_NB_state_sent; } - if (session->userauth_host_state == libssh2_NB_state_sent) { + if(session->userauth_host_state == libssh2_NB_state_sent) { static const unsigned char reply_codes[3] = { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, 0 }; size_t data_len; @@ -994,17 +1021,18 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, &data_len, 0, NULL, 0, &session-> userauth_host_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block"); } session->userauth_host_state = libssh2_NB_state_idle; - if (rc || data_len < 1) { + if(rc || data_len < 1) { return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED, "Auth failed"); } - if (session->userauth_host_data[0] == SSH_MSG_USERAUTH_SUCCESS) { + if(session->userauth_host_data[0] == SSH_MSG_USERAUTH_SUCCESS) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Hostbased authentication successful"); /* We are us and we've proved it. */ @@ -1055,7 +1083,8 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, unsigned int username_len, const unsigned char *pubkeydata, unsigned long pubkeydata_len, - LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)), + LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC + ((*sign_callback)), void *abstract) { unsigned char reply_codes[4] = @@ -1065,13 +1094,13 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, int rc; unsigned char *s; - if (session->userauth_pblc_state == libssh2_NB_state_idle) { + if(session->userauth_pblc_state == libssh2_NB_state_idle) { /* * The call to _libssh2_ntohu32 later relies on pubkeydata having at * least 4 valid bytes containing the length of the method name. */ - if (pubkeydata_len < 4) + if(pubkeydata_len < 4) return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED, "Invalid public key, too short"); @@ -1085,10 +1114,10 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, * allocation/free. * For other uses, we allocate and populate it here. */ - if (!session->userauth_pblc_method) { + if(!session->userauth_pblc_method) { session->userauth_pblc_method_len = _libssh2_ntohu32(pubkeydata); - if(session->userauth_pblc_method_len > pubkeydata_len) + if(session->userauth_pblc_method_len > pubkeydata_len - 4) /* the method length simply cannot be longer than the entire passed in data, so we use this to detect crazy input data */ @@ -1098,10 +1127,10 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_method = LIBSSH2_ALLOC(session, session->userauth_pblc_method_len); - if (!session->userauth_pblc_method) { + if(!session->userauth_pblc_method) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for public key " - "data"); + "Unable to allocate memory " + "for public key data"); } memcpy(session->userauth_pblc_method, pubkeydata + 4, session->userauth_pblc_method_len); @@ -1111,7 +1140,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, * file must match length embedded in the key. * TODO: The data should match too but we don't check that. Should we? */ - else if (session->userauth_pblc_method_len != + else if(session->userauth_pblc_method_len != _libssh2_ntohu32(pubkeydata)) return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED, "Invalid public key"); @@ -1140,7 +1169,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_packet_len + 4 + (4 + session->userauth_pblc_method_len) + (4 + pubkeydata_len)); - if (!session->userauth_pblc_packet) { + if(!session->userauth_pblc_packet) { LIBSSH2_FREE(session, session->userauth_pblc_method); session->userauth_pblc_method = NULL; return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, @@ -1166,13 +1195,14 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_state = libssh2_NB_state_created; } - if (session->userauth_pblc_state == libssh2_NB_state_created) { + if(session->userauth_pblc_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, session->userauth_pblc_packet, session->userauth_pblc_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); - else if (rc) { + if(rc == LIBSSH2_ERROR_EAGAIN) + return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block"); + else if(rc) { LIBSSH2_FREE(session, session->userauth_pblc_packet); session->userauth_pblc_packet = NULL; LIBSSH2_FREE(session, session->userauth_pblc_method); @@ -1185,17 +1215,18 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_state = libssh2_NB_state_sent; } - if (session->userauth_pblc_state == libssh2_NB_state_sent) { + if(session->userauth_pblc_state == libssh2_NB_state_sent) { rc = _libssh2_packet_requirev(session, reply_codes, &session->userauth_pblc_data, &session->userauth_pblc_data_len, 0, NULL, 0, &session-> userauth_pblc_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block"); } - else if (rc || (session->userauth_pblc_data_len < 1)) { + else if(rc || (session->userauth_pblc_data_len < 1)) { LIBSSH2_FREE(session, session->userauth_pblc_packet); session->userauth_pblc_packet = NULL; LIBSSH2_FREE(session, session->userauth_pblc_method); @@ -1205,7 +1236,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, "Waiting for USERAUTH response"); } - if (session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) { + if(session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Pubkey authentication prematurely successful"); /* @@ -1223,7 +1254,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, return 0; } - if (session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_FAILURE) { + if(session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_FAILURE) { /* This public key is not allowed for this user on this server */ LIBSSH2_FREE(session, session->userauth_pblc_data); session->userauth_pblc_data = NULL; @@ -1244,14 +1275,14 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_state = libssh2_NB_state_sent1; } - if (session->userauth_pblc_state == libssh2_NB_state_sent1) { + if(session->userauth_pblc_state == libssh2_NB_state_sent1) { unsigned char *buf; unsigned char *sig; size_t sig_len; s = buf = LIBSSH2_ALLOC(session, 4 + session->session_id_len + session->userauth_pblc_packet_len); - if (!buf) { + if(!buf) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "userauth-publickey signed data"); @@ -1260,15 +1291,17 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, _libssh2_store_str(&s, (const char *)session->session_id, session->session_id_len); - memcpy (s, session->userauth_pblc_packet, - session->userauth_pblc_packet_len); + memcpy(s, session->userauth_pblc_packet, + session->userauth_pblc_packet_len); s += session->userauth_pblc_packet_len; rc = sign_callback(session, &sig, &sig_len, buf, s - buf, abstract); LIBSSH2_FREE(session, buf); - if (rc == LIBSSH2_ERROR_EAGAIN) { - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); - } else if (rc) { + if(rc == LIBSSH2_ERROR_EAGAIN) { + return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block"); + } + else if(rc) { LIBSSH2_FREE(session, session->userauth_pblc_method); session->userauth_pblc_method = NULL; LIBSSH2_FREE(session, session->userauth_pblc_packet); @@ -1282,7 +1315,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, * If this function was restarted, pubkeydata_len might still be 0 * which will cause an unnecessary but harmless realloc here. */ - if (sig_len > pubkeydata_len) { + if(sig_len > pubkeydata_len) { unsigned char *newpacket; /* Should *NEVER* happen, but...well.. better safe than sorry */ newpacket = LIBSSH2_REALLOC(session, @@ -1290,7 +1323,7 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_packet_len + 4 + (4 + session->userauth_pblc_method_len) + (4 + sig_len)); /* PK sigblob */ - if (!newpacket) { + if(!newpacket) { LIBSSH2_FREE(session, sig); LIBSSH2_FREE(session, session->userauth_pblc_packet); session->userauth_pblc_packet = NULL; @@ -1308,7 +1341,8 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_b = NULL; _libssh2_store_u32(&s, - 4 + session->userauth_pblc_method_len + 4 + sig_len); + 4 + session->userauth_pblc_method_len + 4 + + sig_len); _libssh2_store_str(&s, (const char *)session->userauth_pblc_method, session->userauth_pblc_method_len); @@ -1325,14 +1359,16 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_state = libssh2_NB_state_sent2; } - if (session->userauth_pblc_state == libssh2_NB_state_sent2) { + if(session->userauth_pblc_state == libssh2_NB_state_sent2) { rc = _libssh2_transport_send(session, session->userauth_pblc_packet, session->userauth_pblc_s - session->userauth_pblc_packet, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); - } else if (rc) { + if(rc == LIBSSH2_ERROR_EAGAIN) { + return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block"); + } + else if(rc) { LIBSSH2_FREE(session, session->userauth_pblc_packet); session->userauth_pblc_packet = NULL; session->userauth_pblc_state = libssh2_NB_state_idle; @@ -1349,19 +1385,20 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, reply_codes[2] = 0; rc = _libssh2_packet_requirev(session, reply_codes, - &session->userauth_pblc_data, - &session->userauth_pblc_data_len, 0, NULL, 0, - &session->userauth_pblc_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + &session->userauth_pblc_data, + &session->userauth_pblc_data_len, 0, NULL, 0, + &session->userauth_pblc_packet_requirev_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block requesting userauth list"); - } else if (rc || session->userauth_pblc_data_len < 1) { + } + else if(rc || session->userauth_pblc_data_len < 1) { session->userauth_pblc_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED, "Waiting for publickey USERAUTH response"); } - if (session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) { + if(session->userauth_pblc_data[0] == SSH_MSG_USERAUTH_SUCCESS) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Publickey authentication successful"); /* We are us and we've proved it. */ @@ -1401,11 +1438,16 @@ userauth_publickey_frommemory(LIBSSH2_SESSION *session, void *abstract = &privkey_file; int rc; +#if !LIBSSH2_RSA + return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, + "RSA is not supported by crypto backend"); +#endif + privkey_file.filename = privatekeydata; privkey_file.passphrase = passphrase; - if (session->userauth_pblc_state == libssh2_NB_state_idle) { - if (publickeydata_len && publickeydata) { + if(session->userauth_pblc_state == libssh2_NB_state_idle) { + if(publickeydata_len && publickeydata) { rc = memory_read_publickey(session, &session->userauth_pblc_method, &session->userauth_pblc_method_len, &pubkeydata, &pubkeydata_len, @@ -1413,14 +1455,14 @@ userauth_publickey_frommemory(LIBSSH2_SESSION *session, if(rc) return rc; } - else if (privatekeydata_len && privatekeydata) { + else if(privatekeydata_len && privatekeydata) { /* Compute public key from private key. */ - if (_libssh2_pub_priv_keyfilememory(session, - &session->userauth_pblc_method, - &session->userauth_pblc_method_len, - &pubkeydata, &pubkeydata_len, - privatekeydata, privatekeydata_len, - passphrase)) + if(_libssh2_pub_priv_keyfilememory(session, + &session->userauth_pblc_method, + &session->userauth_pblc_method_len, + &pubkeydata, &pubkeydata_len, + privatekeydata, privatekeydata_len, + passphrase)) return _libssh2_error(session, LIBSSH2_ERROR_FILE, "Unable to extract public key " "from private key."); @@ -1458,15 +1500,20 @@ userauth_publickey_fromfile(LIBSSH2_SESSION *session, void *abstract = &privkey_file; int rc; +#if !LIBSSH2_RSA + return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, + "RSA is not supported by crypto backend"); +#endif + privkey_file.filename = privatekey; privkey_file.passphrase = passphrase; - if (session->userauth_pblc_state == libssh2_NB_state_idle) { - if (publickey) { + if(session->userauth_pblc_state == libssh2_NB_state_idle) { + if(publickey) { rc = file_read_publickey(session, &session->userauth_pblc_method, &session->userauth_pblc_method_len, - &pubkeydata, &pubkeydata_len,publickey); - if (rc) + &pubkeydata, &pubkeydata_len, publickey); + if(rc) return rc; } else { @@ -1478,7 +1525,7 @@ userauth_publickey_fromfile(LIBSSH2_SESSION *session, privatekey, passphrase); /* _libssh2_pub_priv_keyfile calls _libssh2_error() */ - if (rc) + if(rc) return rc; } } @@ -1510,7 +1557,7 @@ libssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session, if(NULL == passphrase) /* if given a NULL pointer, make it point to a zero-length string to save us from having to check this all over */ - passphrase=""; + passphrase = ""; BLOCK_ADJUST(rc, session, userauth_publickey_frommemory(session, user, user_len, @@ -1538,7 +1585,7 @@ libssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session, if(NULL == passphrase) /* if given a NULL pointer, make it point to a zero-length string to save us from having to check this all over */ - passphrase=""; + passphrase = ""; BLOCK_ADJUST(rc, session, userauth_publickey_fromfile(session, user, user_len, @@ -1555,7 +1602,8 @@ libssh2_userauth_publickey(LIBSSH2_SESSION *session, const char *user, const unsigned char *pubkeydata, size_t pubkeydata_len, - LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)), + LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC + ((*sign_callback)), void **abstract) { int rc; @@ -1581,7 +1629,8 @@ static int userauth_keyboard_interactive(LIBSSH2_SESSION * session, const char *username, unsigned int username_len, - LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback))) + LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC + ((*response_callback))) { unsigned char *s; int rc; @@ -1593,7 +1642,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, unsigned int language_tag_len; unsigned int i; - if (session->userauth_kybd_state == libssh2_NB_state_idle) { + if(session->userauth_kybd_state == libssh2_NB_state_idle) { session->userauth_kybd_auth_name = NULL; session->userauth_kybd_auth_instruction = NULL; session->userauth_kybd_num_prompts = 0; @@ -1618,7 +1667,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, session->userauth_kybd_data = s = LIBSSH2_ALLOC(session, session->userauth_kybd_packet_len); - if (!s) { + if(!s) { return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "keyboard-interactive authentication"); @@ -1647,18 +1696,21 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, session->userauth_kybd_state = libssh2_NB_state_created; } - if (session->userauth_kybd_state == libssh2_NB_state_created) { + if(session->userauth_kybd_state == libssh2_NB_state_created) { rc = _libssh2_transport_send(session, session->userauth_kybd_data, session->userauth_kybd_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) { - return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); - } else if (rc) { + if(rc == LIBSSH2_ERROR_EAGAIN) { + return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block"); + } + else if(rc) { LIBSSH2_FREE(session, session->userauth_kybd_data); session->userauth_kybd_data = NULL; session->userauth_kybd_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, - "Unable to send keyboard-interactive request"); + "Unable to send keyboard-interactive" + " request"); } LIBSSH2_FREE(session, session->userauth_kybd_data); session->userauth_kybd_data = NULL; @@ -1667,26 +1719,29 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, } for(;;) { - if (session->userauth_kybd_state == libssh2_NB_state_sent) { + if(session->userauth_kybd_state == libssh2_NB_state_sent) { rc = _libssh2_packet_requirev(session, reply_codes, &session->userauth_kybd_data, &session->userauth_kybd_data_len, 0, NULL, 0, &session-> userauth_kybd_packet_requirev_state); - if (rc == LIBSSH2_ERROR_EAGAIN) { + if(rc == LIBSSH2_ERROR_EAGAIN) { return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); - } else if (rc || session->userauth_kybd_data_len < 1) { + } + else if(rc || session->userauth_kybd_data_len < 1) { session->userauth_kybd_state = libssh2_NB_state_idle; return _libssh2_error(session, LIBSSH2_ERROR_AUTHENTICATION_FAILED, - "Waiting for keyboard USERAUTH response"); + "Waiting for keyboard " + "USERAUTH response"); } - if (session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_SUCCESS) { + if(session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_SUCCESS) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, - "Keyboard-interactive authentication successful"); + "Keyboard-interactive " + "authentication successful"); LIBSSH2_FREE(session, session->userauth_kybd_data); session->userauth_kybd_data = NULL; session->state |= LIBSSH2_STATE_AUTHENTICATED; @@ -1694,7 +1749,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, return 0; } - if (session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_FAILURE) { + if(session->userauth_kybd_data[0] == SSH_MSG_USERAUTH_FAILURE) { _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Keyboard-interactive authentication failed"); LIBSSH2_FREE(session, session->userauth_kybd_data); @@ -1709,60 +1764,127 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, /* server requested PAM-like conversation */ s = session->userauth_kybd_data + 1; - /* string name (ISO-10646 UTF-8) */ - session->userauth_kybd_auth_name_len = _libssh2_ntohu32(s); - s += 4; + if(session->userauth_kybd_data_len >= 5) { + /* string name (ISO-10646 UTF-8) */ + session->userauth_kybd_auth_name_len = _libssh2_ntohu32(s); + s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too small" + "to get length"); + goto cleanup; + } + if(session->userauth_kybd_auth_name_len) { session->userauth_kybd_auth_name = LIBSSH2_ALLOC(session, session->userauth_kybd_auth_name_len); - if (!session->userauth_kybd_auth_name) { + if(!session->userauth_kybd_auth_name) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "keyboard-interactive 'name' " "request field"); goto cleanup; } - memcpy(session->userauth_kybd_auth_name, s, - session->userauth_kybd_auth_name_len); - s += session->userauth_kybd_auth_name_len; + if(s + session->userauth_list_data_len <= + session->userauth_kybd_data + + session->userauth_kybd_data_len) { + memcpy(session->userauth_kybd_auth_name, s, + session->userauth_kybd_auth_name_len); + s += session->userauth_kybd_auth_name_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too small" + "for auth name"); + goto cleanup; + } + } + + if(s + 4 <= session->userauth_kybd_data + + session->userauth_kybd_data_len) { + /* string instruction (ISO-10646 UTF-8) */ + session->userauth_kybd_auth_instruction_len = + _libssh2_ntohu32(s); + s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too small" + "for auth instruction length"); + goto cleanup; } - /* string instruction (ISO-10646 UTF-8) */ - session->userauth_kybd_auth_instruction_len = _libssh2_ntohu32(s); - s += 4; if(session->userauth_kybd_auth_instruction_len) { session->userauth_kybd_auth_instruction = LIBSSH2_ALLOC(session, session->userauth_kybd_auth_instruction_len); - if (!session->userauth_kybd_auth_instruction) { + if(!session->userauth_kybd_auth_instruction) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "keyboard-interactive 'instruction' " "request field"); goto cleanup; } - memcpy(session->userauth_kybd_auth_instruction, s, - session->userauth_kybd_auth_instruction_len); - s += session->userauth_kybd_auth_instruction_len; + if(s + session->userauth_kybd_auth_instruction_len <= + session->userauth_kybd_data + + session->userauth_kybd_data_len) { + memcpy(session->userauth_kybd_auth_instruction, s, + session->userauth_kybd_auth_instruction_len); + s += session->userauth_kybd_auth_instruction_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too small" + "for auth instruction"); + goto cleanup; + } } - /* string language tag (as defined in [RFC-3066]) */ - language_tag_len = _libssh2_ntohu32(s); - s += 4; - - /* ignoring this field as deprecated */ - s += language_tag_len; - - /* int num-prompts */ - session->userauth_kybd_num_prompts = _libssh2_ntohu32(s); - s += 4; - if(session->userauth_kybd_num_prompts && - session->userauth_kybd_num_prompts > 100) { - _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, - "Too many replies for " - "keyboard-interactive prompts"); - goto cleanup; + if(s + 4 <= session->userauth_kybd_data + + session->userauth_kybd_data_len) { + /* string language tag (as defined in [RFC-3066]) */ + language_tag_len = _libssh2_ntohu32(s); + s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too small" + "for auth language tag length"); + goto cleanup; + } + + if(s + language_tag_len <= session->userauth_kybd_data + + session->userauth_kybd_data_len) { + /* ignoring this field as deprecated */ + s += language_tag_len; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too small" + "for auth language tag"); + goto cleanup; + } + + if(s + 4 <= session->userauth_kybd_data + + session->userauth_kybd_data_len) { + /* int num-prompts */ + session->userauth_kybd_num_prompts = _libssh2_ntohu32(s); + s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too small" + "for auth num keyboard prompts"); + goto cleanup; + } + + if(session->userauth_kybd_num_prompts > 100) { + _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, + "Too many replies for " + "keyboard-interactive prompts"); + goto cleanup; } if(session->userauth_kybd_num_prompts) { @@ -1770,7 +1892,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, LIBSSH2_CALLOC(session, sizeof(LIBSSH2_USERAUTH_KBDINT_PROMPT) * session->userauth_kybd_num_prompts); - if (!session->userauth_kybd_prompts) { + if(!session->userauth_kybd_prompts) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "keyboard-interactive prompts array"); @@ -1781,7 +1903,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, LIBSSH2_CALLOC(session, sizeof(LIBSSH2_USERAUTH_KBDINT_RESPONSE) * session->userauth_kybd_num_prompts); - if (!session->userauth_kybd_responses) { + if(!session->userauth_kybd_responses) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "keyboard-interactive responses array"); @@ -1789,25 +1911,56 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, } for(i = 0; i < session->userauth_kybd_num_prompts; i++) { - /* string prompt[1] (ISO-10646 UTF-8) */ - session->userauth_kybd_prompts[i].length = - _libssh2_ntohu32(s); - s += 4; + if(s + 4 <= session->userauth_kybd_data + + session->userauth_kybd_data_len) { + /* string prompt[1] (ISO-10646 UTF-8) */ + session->userauth_kybd_prompts[i].length = + _libssh2_ntohu32(s); + s += 4; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too " + "small for auth keyboard " + "prompt length"); + goto cleanup; + } + session->userauth_kybd_prompts[i].text = LIBSSH2_CALLOC(session, - session->userauth_kybd_prompts[i].length); - if (!session->userauth_kybd_prompts[i].text) { + session->userauth_kybd_prompts[i]. + length); + if(!session->userauth_kybd_prompts[i].text) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for " "keyboard-interactive prompt message"); goto cleanup; } - memcpy(session->userauth_kybd_prompts[i].text, s, - session->userauth_kybd_prompts[i].length); - s += session->userauth_kybd_prompts[i].length; - /* boolean echo[1] */ - session->userauth_kybd_prompts[i].echo = *s++; + if(s + session->userauth_kybd_prompts[i].length <= + session->userauth_kybd_data + + session->userauth_kybd_data_len) { + memcpy(session->userauth_kybd_prompts[i].text, s, + session->userauth_kybd_prompts[i].length); + s += session->userauth_kybd_prompts[i].length; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too " + "small for auth keyboard prompt"); + goto cleanup; + } + if(s < session->userauth_kybd_data + + session->userauth_kybd_data_len) { + /* boolean echo[1] */ + session->userauth_kybd_prompts[i].echo = *s++; + } + else { + _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "userauth keyboard data buffer too " + "small for auth keyboard prompt echo"); + goto cleanup; + } } } @@ -1831,7 +1984,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, for(i = 0; i < session->userauth_kybd_num_prompts; i++) { /* string response[1] (ISO-10646 UTF-8) */ - if(session->userauth_kybd_responses[i].length <= + if(session->userauth_kybd_responses[i].length <= (SIZE_MAX - 4 - session->userauth_kybd_packet_len) ) { session->userauth_kybd_packet_len += 4 + session->userauth_kybd_responses[i].length; @@ -1850,7 +2003,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, session->userauth_kybd_data = s = LIBSSH2_ALLOC(session, session->userauth_kybd_packet_len); - if (!s) { + if(!s) { _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for keyboard-" "interactive response packet"); @@ -1870,14 +2023,14 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, session->userauth_kybd_state = libssh2_NB_state_sent1; } - if (session->userauth_kybd_state == libssh2_NB_state_sent1) { + if(session->userauth_kybd_state == libssh2_NB_state_sent1) { rc = _libssh2_transport_send(session, session->userauth_kybd_data, session->userauth_kybd_packet_len, NULL, 0); - if (rc == LIBSSH2_ERROR_EAGAIN) + if(rc == LIBSSH2_ERROR_EAGAIN) return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); - if (rc) { + if(rc) { _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND, "Unable to send userauth-keyboard-interactive" " request"); @@ -1896,14 +2049,14 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, LIBSSH2_FREE(session, session->userauth_kybd_data); session->userauth_kybd_data = NULL; - if (session->userauth_kybd_prompts) { + if(session->userauth_kybd_prompts) { for(i = 0; i < session->userauth_kybd_num_prompts; i++) { LIBSSH2_FREE(session, session->userauth_kybd_prompts[i].text); session->userauth_kybd_prompts[i].text = NULL; } } - if (session->userauth_kybd_responses) { + if(session->userauth_kybd_responses) { for(i = 0; i < session->userauth_kybd_num_prompts; i++) { LIBSSH2_FREE(session, session->userauth_kybd_responses[i].text); @@ -1928,7 +2081,7 @@ userauth_keyboard_interactive(LIBSSH2_SESSION * session, session->userauth_kybd_auth_instruction = NULL; } - if (session->userauth_kybd_auth_failure) { + if(session->userauth_kybd_auth_failure) { session->userauth_kybd_state = libssh2_NB_state_idle; return -1; } @@ -1946,7 +2099,8 @@ LIBSSH2_API int libssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION *session, const char *user, unsigned int user_len, - LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback))) + LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC + ((*response_callback))) { int rc; BLOCK_ADJUST(rc, session, diff --git a/vendor/libssh2/src/userauth.h b/vendor/libssh2/src/userauth.h index c0442ae15..a7b0a9846 100644 --- a/vendor/libssh2/src/userauth.h +++ b/vendor/libssh2/src/userauth.h @@ -44,7 +44,8 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, unsigned int username_len, const unsigned char *pubkeydata, unsigned long pubkeydata_len, - LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)), + LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC + ((*sign_callback)), void *abstract); #endif /* LIBSSH2_USERAUTH_H */ diff --git a/vendor/libssh2/src/wincng.c b/vendor/libssh2/src/wincng.c index d3271b3e3..4bebc6407 100755 --- a/vendor/libssh2/src/wincng.c +++ b/vendor/libssh2/src/wincng.c @@ -59,6 +59,7 @@ #include #include #include +#include "misc.h" #ifdef HAVE_STDLIB_H #include @@ -244,34 +245,50 @@ _libssh2_wincng_init(void) ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC, BCRYPT_AES_ALGORITHM, NULL, 0); - if (BCRYPT_SUCCESS(ret)) { - ret = BCryptSetProperty(_libssh2_wincng.hAlgAES_CBC, BCRYPT_CHAINING_MODE, + if(BCRYPT_SUCCESS(ret)) { + ret = BCryptSetProperty(_libssh2_wincng.hAlgAES_CBC, + BCRYPT_CHAINING_MODE, (PBYTE)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0); } } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_ECB, + BCRYPT_AES_ALGORITHM, NULL, 0); + if(BCRYPT_SUCCESS(ret)) { + ret = BCryptSetProperty(_libssh2_wincng.hAlgAES_ECB, + BCRYPT_CHAINING_MODE, + (PBYTE)BCRYPT_CHAIN_MODE_ECB, + sizeof(BCRYPT_CHAIN_MODE_ECB), 0); + if(!BCRYPT_SUCCESS(ret)) { + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_ECB, 0); + } + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRC4_NA, BCRYPT_RC4_ALGORITHM, NULL, 0); - if (BCRYPT_SUCCESS(ret)) { - ret = BCryptSetProperty(_libssh2_wincng.hAlgRC4_NA, BCRYPT_CHAINING_MODE, + if(BCRYPT_SUCCESS(ret)) { + ret = BCryptSetProperty(_libssh2_wincng.hAlgRC4_NA, + BCRYPT_CHAINING_MODE, (PBYTE)BCRYPT_CHAIN_MODE_NA, sizeof(BCRYPT_CHAIN_MODE_NA), 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0); } } ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlg3DES_CBC, BCRYPT_3DES_ALGORITHM, NULL, 0); - if (BCRYPT_SUCCESS(ret)) { - ret = BCryptSetProperty(_libssh2_wincng.hAlg3DES_CBC, BCRYPT_CHAINING_MODE, + if(BCRYPT_SUCCESS(ret)) { + ret = BCryptSetProperty(_libssh2_wincng.hAlg3DES_CBC, + BCRYPT_CHAINING_MODE, (PBYTE)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0); - if (!BCRYPT_SUCCESS(ret)) { - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0); + if(!BCRYPT_SUCCESS(ret)) { + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, + 0); } } } @@ -314,11 +331,11 @@ _libssh2_wincng_safe_free(void *buf, int len) (void)len; #endif - if (!buf) + if(!buf) return; #ifdef LIBSSH2_CLEAR_MEMORY - if (len > 0) + if(len > 0) SecureZeroMemory(buf, len); #endif @@ -345,7 +362,7 @@ _libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx, (unsigned char *)&dwHash, sizeof(dwHash), &cbData, 0); - if ((!BCRYPT_SUCCESS(ret)) || dwHash != hashlen) { + if((!BCRYPT_SUCCESS(ret)) || dwHash != hashlen) { return -1; } @@ -353,12 +370,12 @@ _libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx, (unsigned char *)&dwHashObject, sizeof(dwHashObject), &cbData, 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { return -1; } pbHashObject = malloc(dwHashObject); - if (!pbHashObject) { + if(!pbHashObject) { return -1; } @@ -366,7 +383,7 @@ _libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx, ret = BCryptCreateHash(hAlg, &hHash, pbHashObject, dwHashObject, key, keylen, 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { _libssh2_wincng_safe_free(pbHashObject, dwHashObject); return -1; } @@ -418,7 +435,7 @@ _libssh2_wincng_hash(unsigned char *data, unsigned long datalen, int ret; ret = _libssh2_wincng_hash_init(&ctx, hAlg, hashlen, NULL, 0); - if (!ret) { + if(!ret) { ret = _libssh2_wincng_hash_update(&ctx, data, datalen); ret |= _libssh2_wincng_hash_final(&ctx, hash); } @@ -476,13 +493,13 @@ _libssh2_wincng_key_sha1_verify(_libssh2_wincng_key_ctx *ctx, datalen = m_len; data = malloc(datalen); - if (!data) { + if(!data) { return -1; } hashlen = SHA_DIGEST_LENGTH; hash = malloc(hashlen); - if (!hash) { + if(!hash) { free(data); return -1; } @@ -495,22 +512,23 @@ _libssh2_wincng_key_sha1_verify(_libssh2_wincng_key_ctx *ctx, _libssh2_wincng_safe_free(data, datalen); - if (ret) { + if(ret) { _libssh2_wincng_safe_free(hash, hashlen); return -1; } datalen = sig_len; data = malloc(datalen); - if (!data) { + if(!data) { _libssh2_wincng_safe_free(hash, hashlen); return -1; } - if (flags & BCRYPT_PAD_PKCS1) { + if(flags & BCRYPT_PAD_PKCS1) { paddingInfoPKCS1.pszAlgId = BCRYPT_SHA1_ALGORITHM; pPaddingInfo = &paddingInfoPKCS1; - } else + } + else pPaddingInfo = NULL; memcpy(data, sig, datalen); @@ -537,14 +555,13 @@ _libssh2_wincng_load_pem(LIBSSH2_SESSION *session, FILE *fp; int ret; - (void)passphrase; - - fp = fopen(filename, "r"); - if (!fp) { + fp = fopen(filename, FOPEN_READTEXT); + if(!fp) { return -1; } ret = _libssh2_pem_parse(session, headerbegin, headerend, + passphrase, fp, data, datalen); fclose(fp); @@ -564,19 +581,19 @@ _libssh2_wincng_load_private(LIBSSH2_SESSION *session, unsigned int datalen = 0; int ret = -1; - if (ret && tryLoadRSA) { + if(ret && tryLoadRSA) { ret = _libssh2_wincng_load_pem(session, filename, passphrase, PEM_RSA_HEADER, PEM_RSA_FOOTER, &data, &datalen); } - if (ret && tryLoadDSA) { + if(ret && tryLoadDSA) { ret = _libssh2_wincng_load_pem(session, filename, passphrase, PEM_DSA_HEADER, PEM_DSA_FOOTER, &data, &datalen); } - if (!ret) { + if(!ret) { *ppbEncoded = data; *pcbEncoded = datalen; } @@ -599,21 +616,21 @@ _libssh2_wincng_load_private_memory(LIBSSH2_SESSION *session, (void)passphrase; - if (ret && tryLoadRSA) { + if(ret && tryLoadRSA) { ret = _libssh2_pem_parse_memory(session, PEM_RSA_HEADER, PEM_RSA_FOOTER, privatekeydata, privatekeydata_len, &data, &datalen); } - if (ret && tryLoadDSA) { + if(ret && tryLoadDSA) { ret = _libssh2_pem_parse_memory(session, PEM_DSA_HEADER, PEM_DSA_FOOTER, privatekeydata, privatekeydata_len, &data, &datalen); } - if (!ret) { + if(!ret) { *ppbEncoded = data; *pcbEncoded = datalen; } @@ -636,12 +653,12 @@ _libssh2_wincng_asn_decode(unsigned char *pbEncoded, lpszStructType, pbEncoded, cbEncoded, 0, NULL, NULL, &cbDecoded); - if (!ret) { + if(!ret) { return -1; } pbDecoded = malloc(cbDecoded); - if (!pbDecoded) { + if(!pbDecoded) { return -1; } @@ -649,7 +666,7 @@ _libssh2_wincng_asn_decode(unsigned char *pbEncoded, lpszStructType, pbEncoded, cbEncoded, 0, NULL, pbDecoded, &cbDecoded); - if (!ret) { + if(!ret) { _libssh2_wincng_safe_free(pbDecoded, cbDecoded); return -1; } @@ -670,25 +687,25 @@ _libssh2_wincng_bn_ltob(unsigned char *pbInput, unsigned char *pbOutput; unsigned long cbOutput, index, offset, length; - if (cbInput < 1) { + if(cbInput < 1) { return 0; } offset = 0; length = cbInput - 1; cbOutput = cbInput; - if (pbInput[length] & (1 << 7)) { + if(pbInput[length] & (1 << 7)) { offset++; cbOutput += offset; } pbOutput = (unsigned char *)malloc(cbOutput); - if (!pbOutput) { + if(!pbOutput) { return -1; } pbOutput[0] = 0; - for (index = 0; ((index + offset) < cbOutput) + for(index = 0; ((index + offset) < cbOutput) && (index < cbInput); index++) { pbOutput[index + offset] = pbInput[length - index]; } @@ -713,11 +730,11 @@ _libssh2_wincng_asn_decode_bn(unsigned char *pbEncoded, ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded, X509_MULTI_BYTE_UINT, &pbInteger, &cbInteger); - if (!ret) { + if(!ret) { ret = _libssh2_wincng_bn_ltob(((PCRYPT_DATA_BLOB)pbInteger)->pbData, ((PCRYPT_DATA_BLOB)pbInteger)->cbData, &pbDecoded, &cbDecoded); - if (!ret) { + if(!ret) { *ppbDecoded = pbDecoded; *pcbDecoded = cbDecoded; } @@ -742,30 +759,31 @@ _libssh2_wincng_asn_decode_bns(unsigned char *pbEncoded, ret = _libssh2_wincng_asn_decode(pbEncoded, cbEncoded, X509_SEQUENCE_OF_ANY, &pbDecoded, &cbDecoded); - if (!ret) { + if(!ret) { length = ((PCRYPT_DATA_BLOB)pbDecoded)->cbData; rpbDecoded = malloc(sizeof(PBYTE) * length); - if (rpbDecoded) { + if(rpbDecoded) { rcbDecoded = malloc(sizeof(DWORD) * length); - if (rcbDecoded) { - for (index = 0; index < length; index++) { + if(rcbDecoded) { + for(index = 0; index < length; index++) { pBlob = &((PCRYPT_DER_BLOB) ((PCRYPT_DATA_BLOB)pbDecoded)->pbData)[index]; ret = _libssh2_wincng_asn_decode_bn(pBlob->pbData, pBlob->cbData, &rpbDecoded[index], &rcbDecoded[index]); - if (ret) + if(ret) break; } - if (!ret) { + if(!ret) { *prpbDecoded = rpbDecoded; *prcbDecoded = rcbDecoded; *pcbCount = length; - } else { - for (length = 0; length < index; length++) { + } + else { + for(length = 0; length < index; length++) { _libssh2_wincng_safe_free(rpbDecoded[length], rcbDecoded[length]); rpbDecoded[length] = NULL; @@ -774,11 +792,13 @@ _libssh2_wincng_asn_decode_bns(unsigned char *pbEncoded, free(rpbDecoded); free(rcbDecoded); } - } else { + } + else { free(rpbDecoded); ret = -1; } - } else { + } + else { ret = -1; } @@ -795,13 +815,13 @@ _libssh2_wincng_bn_size(const unsigned char *bignum, { unsigned long offset; - if (!bignum) + if(!bignum) return 0; length--; offset = 0; - while (!(*(bignum + offset)) && (offset < length)) + while(!(*(bignum + offset)) && (offset < length)) offset++; length++; @@ -845,7 +865,7 @@ _libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa, _libssh2_wincng_bn_size(ddata, dlen)); offset = sizeof(BCRYPT_RSAKEY_BLOB); keylen = offset + elen + mlen; - if (ddata && dlen > 0) { + if(ddata && dlen > 0) { p1len = max(_libssh2_wincng_bn_size(pdata, plen), _libssh2_wincng_bn_size(e1data, e1len)); p2len = max(_libssh2_wincng_bn_size(qdata, qlen), @@ -854,7 +874,7 @@ _libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa, } key = malloc(keylen); - if (!key) { + if(!key) { return -1; } @@ -870,45 +890,45 @@ _libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa, memcpy(key + offset, edata, elen); offset += elen; - if (nlen < mlen) + if(nlen < mlen) memcpy(key + offset + mlen - nlen, ndata, nlen); else memcpy(key + offset, ndata + nlen - mlen, mlen); - if (ddata && dlen > 0) { + if(ddata && dlen > 0) { offset += mlen; - if (plen < p1len) + if(plen < p1len) memcpy(key + offset + p1len - plen, pdata, plen); else memcpy(key + offset, pdata + plen - p1len, p1len); offset += p1len; - if (qlen < p2len) + if(qlen < p2len) memcpy(key + offset + p2len - qlen, qdata, qlen); else memcpy(key + offset, qdata + qlen - p2len, p2len); offset += p2len; - if (e1len < p1len) + if(e1len < p1len) memcpy(key + offset + p1len - e1len, e1data, e1len); else memcpy(key + offset, e1data + e1len - p1len, p1len); offset += p1len; - if (e2len < p2len) + if(e2len < p2len) memcpy(key + offset + p2len - e2len, e2data, e2len); else memcpy(key + offset, e2data + e2len - p2len, p2len); offset += p2len; - if (coefflen < p1len) + if(coefflen < p1len) memcpy(key + offset + p1len - coefflen, coeffdata, coefflen); else memcpy(key + offset, coeffdata + coefflen - p1len, p1len); offset += p1len; - if (dlen < mlen) + if(dlen < mlen) memcpy(key + offset + mlen - dlen, ddata, dlen); else memcpy(key + offset, ddata + dlen - mlen, mlen); @@ -917,7 +937,8 @@ _libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa, rsakey->Magic = BCRYPT_RSAFULLPRIVATE_MAGIC; rsakey->cbPrime1 = p1len; rsakey->cbPrime2 = p2len; - } else { + } + else { lpszBlobType = BCRYPT_RSAPUBLIC_BLOB; rsakey->Magic = BCRYPT_RSAPUBLIC_MAGIC; rsakey->cbPrime1 = 0; @@ -927,14 +948,14 @@ _libssh2_wincng_rsa_new(libssh2_rsa_ctx **rsa, ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL, lpszBlobType, &hKey, key, keylen, 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { _libssh2_wincng_safe_free(key, keylen); return -1; } *rsa = malloc(sizeof(libssh2_rsa_ctx)); - if (!(*rsa)) { + if(!(*rsa)) { BCryptDestroyKey(hKey); _libssh2_wincng_safe_free(key, keylen); return -1; @@ -967,7 +988,7 @@ _libssh2_wincng_rsa_new_private_parse(libssh2_rsa_ctx **rsa, _libssh2_wincng_safe_free(pbEncoded, cbEncoded); - if (ret) { + if(ret) { return -1; } @@ -975,14 +996,14 @@ _libssh2_wincng_rsa_new_private_parse(libssh2_rsa_ctx **rsa, ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL, LEGACY_RSAPRIVATE_BLOB, &hKey, pbStructInfo, cbStructInfo, 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { _libssh2_wincng_safe_free(pbStructInfo, cbStructInfo); return -1; } *rsa = malloc(sizeof(libssh2_rsa_ctx)); - if (!(*rsa)) { + if(!(*rsa)) { BCryptDestroyKey(hKey); _libssh2_wincng_safe_free(pbStructInfo, cbStructInfo); return -1; @@ -1012,7 +1033,7 @@ _libssh2_wincng_rsa_new_private(libssh2_rsa_ctx **rsa, ret = _libssh2_wincng_load_private(session, filename, (const char *)passphrase, &pbEncoded, &cbEncoded, 1, 0); - if (ret) { + if(ret) { return -1; } @@ -1046,7 +1067,7 @@ _libssh2_wincng_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa, ret = _libssh2_wincng_load_private_memory(session, filedata, filedata_len, (const char *)passphrase, &pbEncoded, &cbEncoded, 1, 0); - if (ret) { + if(ret) { return -1; } @@ -1090,7 +1111,7 @@ _libssh2_wincng_rsa_sha1_sign(LIBSSH2_SESSION *session, datalen = (unsigned long)hash_len; data = malloc(datalen); - if (!data) { + if(!data) { return -1; } @@ -1101,20 +1122,22 @@ _libssh2_wincng_rsa_sha1_sign(LIBSSH2_SESSION *session, ret = BCryptSignHash(rsa->hKey, &paddingInfo, data, datalen, NULL, 0, &cbData, BCRYPT_PAD_PKCS1); - if (BCRYPT_SUCCESS(ret)) { + if(BCRYPT_SUCCESS(ret)) { siglen = cbData; sig = LIBSSH2_ALLOC(session, siglen); - if (sig) { + if(sig) { ret = BCryptSignHash(rsa->hKey, &paddingInfo, data, datalen, sig, siglen, &cbData, BCRYPT_PAD_PKCS1); - if (BCRYPT_SUCCESS(ret)) { + if(BCRYPT_SUCCESS(ret)) { *signature_len = siglen; *signature = sig; - } else { + } + else { LIBSSH2_FREE(session, sig); } - } else + } + else ret = STATUS_NO_MEMORY; } @@ -1126,7 +1149,7 @@ _libssh2_wincng_rsa_sha1_sign(LIBSSH2_SESSION *session, void _libssh2_wincng_rsa_free(libssh2_rsa_ctx *rsa) { - if (!rsa) + if(!rsa) return; BCryptDestroyKey(rsa->hKey); @@ -1168,11 +1191,11 @@ _libssh2_wincng_dsa_new(libssh2_dsa_ctx **dsa, _libssh2_wincng_bn_size(ydata, ylen)); offset = sizeof(BCRYPT_DSA_KEY_BLOB); keylen = offset + length * 3; - if (xdata && xlen > 0) + if(xdata && xlen > 0) keylen += 20; key = malloc(keylen); - if (!key) { + if(!key) { return -1; } @@ -1186,39 +1209,40 @@ _libssh2_wincng_dsa_new(libssh2_dsa_ctx **dsa, memset(dsakey->Count, -1, sizeof(dsakey->Count)); memset(dsakey->Seed, -1, sizeof(dsakey->Seed)); - if (qlen < 20) + if(qlen < 20) memcpy(dsakey->q + 20 - qlen, qdata, qlen); else memcpy(dsakey->q, qdata + qlen - 20, 20); - if (plen < length) + if(plen < length) memcpy(key + offset + length - plen, pdata, plen); else memcpy(key + offset, pdata + plen - length, length); offset += length; - if (glen < length) + if(glen < length) memcpy(key + offset + length - glen, gdata, glen); else memcpy(key + offset, gdata + glen - length, length); offset += length; - if (ylen < length) + if(ylen < length) memcpy(key + offset + length - ylen, ydata, ylen); else memcpy(key + offset, ydata + ylen - length, length); - if (xdata && xlen > 0) { + if(xdata && xlen > 0) { offset += length; - if (xlen < 20) + if(xlen < 20) memcpy(key + offset + 20 - xlen, xdata, xlen); else memcpy(key + offset, xdata + xlen - 20, 20); lpszBlobType = BCRYPT_DSA_PRIVATE_BLOB; dsakey->dwMagic = BCRYPT_DSA_PRIVATE_MAGIC; - } else { + } + else { lpszBlobType = BCRYPT_DSA_PUBLIC_BLOB; dsakey->dwMagic = BCRYPT_DSA_PUBLIC_MAGIC; } @@ -1226,14 +1250,14 @@ _libssh2_wincng_dsa_new(libssh2_dsa_ctx **dsa, ret = BCryptImportKeyPair(_libssh2_wincng.hAlgDSA, NULL, lpszBlobType, &hKey, key, keylen, 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { _libssh2_wincng_safe_free(key, keylen); return -1; } *dsa = malloc(sizeof(libssh2_dsa_ctx)); - if (!(*dsa)) { + if(!(*dsa)) { BCryptDestroyKey(hKey); _libssh2_wincng_safe_free(key, keylen); return -1; @@ -1264,23 +1288,24 @@ _libssh2_wincng_dsa_new_private_parse(libssh2_dsa_ctx **dsa, _libssh2_wincng_safe_free(pbEncoded, cbEncoded); - if (ret) { + if(ret) { return -1; } - if (length == 6) { + if(length == 6) { ret = _libssh2_wincng_dsa_new(dsa, rpbDecoded[1], rcbDecoded[1], rpbDecoded[2], rcbDecoded[2], rpbDecoded[3], rcbDecoded[3], rpbDecoded[4], rcbDecoded[4], rpbDecoded[5], rcbDecoded[5]); - } else { + } + else { ret = -1; } - for (index = 0; index < length; index++) { + for(index = 0; index < length; index++) { _libssh2_wincng_safe_free(rpbDecoded[index], rcbDecoded[index]); rpbDecoded[index] = NULL; rcbDecoded[index] = 0; @@ -1307,7 +1332,7 @@ _libssh2_wincng_dsa_new_private(libssh2_dsa_ctx **dsa, ret = _libssh2_wincng_load_private(session, filename, (const char *)passphrase, &pbEncoded, &cbEncoded, 0, 1); - if (ret) { + if(ret) { return -1; } @@ -1339,7 +1364,7 @@ _libssh2_wincng_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa, ret = _libssh2_wincng_load_private_memory(session, filedata, filedata_len, (const char *)passphrase, &pbEncoded, &cbEncoded, 0, 1); - if (ret) { + if(ret) { return -1; } @@ -1378,7 +1403,7 @@ _libssh2_wincng_dsa_sha1_sign(libssh2_dsa_ctx *dsa, datalen = hash_len; data = malloc(datalen); - if (!data) { + if(!data) { return -1; } @@ -1386,21 +1411,23 @@ _libssh2_wincng_dsa_sha1_sign(libssh2_dsa_ctx *dsa, ret = BCryptSignHash(dsa->hKey, NULL, data, datalen, NULL, 0, &cbData, 0); - if (BCRYPT_SUCCESS(ret)) { + if(BCRYPT_SUCCESS(ret)) { siglen = cbData; - if (siglen == 40) { + if(siglen == 40) { sig = malloc(siglen); - if (sig) { + if(sig) { ret = BCryptSignHash(dsa->hKey, NULL, data, datalen, sig, siglen, &cbData, 0); - if (BCRYPT_SUCCESS(ret)) { + if(BCRYPT_SUCCESS(ret)) { memcpy(sig_fixed, sig, siglen); } _libssh2_wincng_safe_free(sig, siglen); - } else + } + else ret = STATUS_NO_MEMORY; - } else + } + else ret = STATUS_NO_MEMORY; } @@ -1412,7 +1439,7 @@ _libssh2_wincng_dsa_sha1_sign(libssh2_dsa_ctx *dsa, void _libssh2_wincng_dsa_free(libssh2_dsa_ctx *dsa) { - if (!dsa) + if(!dsa) return; BCryptDestroyKey(dsa->hKey); @@ -1466,24 +1493,25 @@ _libssh2_wincng_pub_priv_keyfile_parse(LIBSSH2_SESSION *session, _libssh2_wincng_safe_free(pbEncoded, cbEncoded); - if (ret) { + if(ret) { return -1; } - if (length == 9) { /* private RSA key */ + if(length == 9) { /* private RSA key */ mthlen = 7; mth = LIBSSH2_ALLOC(session, mthlen); - if (mth) { + if(mth) { memcpy(mth, "ssh-rsa", mthlen); - } else { + } + else { ret = -1; } keylen = 4 + mthlen + 4 + rcbDecoded[2] + 4 + rcbDecoded[1]; key = LIBSSH2_ALLOC(session, keylen); - if (key) { + if(key) { offset = _libssh2_wincng_pub_priv_write(key, 0, mth, mthlen); offset = _libssh2_wincng_pub_priv_write(key, offset, @@ -1493,23 +1521,26 @@ _libssh2_wincng_pub_priv_keyfile_parse(LIBSSH2_SESSION *session, _libssh2_wincng_pub_priv_write(key, offset, rpbDecoded[1], rcbDecoded[1]); - } else { + } + else { ret = -1; } - } else if (length == 6) { /* private DSA key */ + } + else if(length == 6) { /* private DSA key */ mthlen = 7; mth = LIBSSH2_ALLOC(session, mthlen); - if (mth) { + if(mth) { memcpy(mth, "ssh-dss", mthlen); - } else { + } + else { ret = -1; } keylen = 4 + mthlen + 4 + rcbDecoded[1] + 4 + rcbDecoded[2] + 4 + rcbDecoded[3] + 4 + rcbDecoded[4]; key = LIBSSH2_ALLOC(session, keylen); - if (key) { + if(key) { offset = _libssh2_wincng_pub_priv_write(key, 0, mth, mthlen); offset = _libssh2_wincng_pub_priv_write(key, offset, @@ -1527,16 +1558,18 @@ _libssh2_wincng_pub_priv_keyfile_parse(LIBSSH2_SESSION *session, _libssh2_wincng_pub_priv_write(key, offset, rpbDecoded[4], rcbDecoded[4]); - } else { + } + else { ret = -1; } - } else { + } + else { ret = -1; } - for (index = 0; index < length; index++) { + for(index = 0; index < length; index++) { _libssh2_wincng_safe_free(rpbDecoded[index], rcbDecoded[index]); rpbDecoded[index] = NULL; rcbDecoded[index] = 0; @@ -1546,12 +1579,13 @@ _libssh2_wincng_pub_priv_keyfile_parse(LIBSSH2_SESSION *session, free(rcbDecoded); - if (ret) { - if (mth) + if(ret) { + if(mth) LIBSSH2_FREE(session, mth); - if (key) + if(key) LIBSSH2_FREE(session, key); - } else { + } + else { *method = mth; *method_len = mthlen; *pubkeydata = key; @@ -1578,7 +1612,7 @@ _libssh2_wincng_pub_priv_keyfile(LIBSSH2_SESSION *session, ret = _libssh2_wincng_load_private(session, privatekey, passphrase, &pbEncoded, &cbEncoded, 1, 1); - if (ret) { + if(ret) { return -1; } @@ -1617,7 +1651,7 @@ _libssh2_wincng_pub_priv_keyfilememory(LIBSSH2_SESSION *session, ret = _libssh2_wincng_load_private_memory(session, privatekeydata, privatekeydata_len, passphrase, &pbEncoded, &cbEncoded, 1, 1); - if (ret) { + if(ret) { return -1; } @@ -1634,8 +1668,8 @@ _libssh2_wincng_pub_priv_keyfilememory(LIBSSH2_SESSION *session, (void)passphrase; return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, - "Unable to extract public key from private key in memory: " - "Method unsupported in Windows CNG backend"); + "Unable to extract public key from private key in memory: " + "Method unsupported in Windows CNG backend"); #endif /* HAVE_LIBCRYPT32 */ } @@ -1653,8 +1687,9 @@ _libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx, { BCRYPT_KEY_HANDLE hKey; BCRYPT_KEY_DATA_BLOB_HEADER *header; - unsigned char *pbKeyObject, *pbIV, *key; - unsigned long dwKeyObject, dwIV, dwBlockLength, cbData, keylen; + unsigned char *pbKeyObject, *pbIV, *key, *pbCtr, *pbIVCopy; + unsigned long dwKeyObject, dwIV, dwCtrLength, dwBlockLength, + cbData, keylen; int ret; (void)encrypt; @@ -1663,7 +1698,7 @@ _libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx, (unsigned char *)&dwKeyObject, sizeof(dwKeyObject), &cbData, 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { return -1; } @@ -1671,19 +1706,19 @@ _libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx, (unsigned char *)&dwBlockLength, sizeof(dwBlockLength), &cbData, 0); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { return -1; } pbKeyObject = malloc(dwKeyObject); - if (!pbKeyObject) { + if(!pbKeyObject) { return -1; } keylen = sizeof(BCRYPT_KEY_DATA_BLOB_HEADER) + type.dwKeyLength; key = malloc(keylen); - if (!key) { + if(!key) { free(pbKeyObject); return -1; } @@ -1702,36 +1737,46 @@ _libssh2_wincng_cipher_init(_libssh2_cipher_ctx *ctx, _libssh2_wincng_safe_free(key, keylen); - if (!BCRYPT_SUCCESS(ret)) { + if(!BCRYPT_SUCCESS(ret)) { _libssh2_wincng_safe_free(pbKeyObject, dwKeyObject); return -1; } - if (type.dwUseIV) { - pbIV = malloc(dwBlockLength); - if (!pbIV) { + pbIV = NULL; + pbCtr = NULL; + dwIV = 0; + dwCtrLength = 0; + + if(type.useIV || type.ctrMode) { + pbIVCopy = malloc(dwBlockLength); + if(!pbIVCopy) { BCryptDestroyKey(hKey); _libssh2_wincng_safe_free(pbKeyObject, dwKeyObject); return -1; } - dwIV = dwBlockLength; - memcpy(pbIV, iv, dwIV); - } else { - pbIV = NULL; - dwIV = 0; - } + memcpy(pbIVCopy, iv, dwBlockLength); + if(type.ctrMode) { + pbCtr = pbIVCopy; + dwCtrLength = dwBlockLength; + } + else if(type.useIV) { + pbIV = pbIVCopy; + dwIV = dwBlockLength; + } + } ctx->hKey = hKey; ctx->pbKeyObject = pbKeyObject; ctx->pbIV = pbIV; + ctx->pbCtr = pbCtr; ctx->dwKeyObject = dwKeyObject; ctx->dwIV = dwIV; ctx->dwBlockLength = dwBlockLength; + ctx->dwCtrLength = dwCtrLength; return 0; } - int _libssh2_wincng_cipher_crypt(_libssh2_cipher_ctx *ctx, _libssh2_cipher_type(type), @@ -1739,7 +1784,7 @@ _libssh2_wincng_cipher_crypt(_libssh2_cipher_ctx *ctx, unsigned char *block, size_t blocklen) { - unsigned char *pbOutput; + unsigned char *pbOutput, *pbInput; unsigned long cbOutput, cbInput; int ret; @@ -1747,31 +1792,47 @@ _libssh2_wincng_cipher_crypt(_libssh2_cipher_ctx *ctx, cbInput = (unsigned long)blocklen; - if (encrypt) { - ret = BCryptEncrypt(ctx->hKey, block, cbInput, NULL, + if(type.ctrMode) { + pbInput = ctx->pbCtr; + } + else { + pbInput = block; + } + + if(encrypt || type.ctrMode) { + ret = BCryptEncrypt(ctx->hKey, pbInput, cbInput, NULL, ctx->pbIV, ctx->dwIV, NULL, 0, &cbOutput, 0); - } else { - ret = BCryptDecrypt(ctx->hKey, block, cbInput, NULL, + } + else { + ret = BCryptDecrypt(ctx->hKey, pbInput, cbInput, NULL, ctx->pbIV, ctx->dwIV, NULL, 0, &cbOutput, 0); } - if (BCRYPT_SUCCESS(ret)) { + if(BCRYPT_SUCCESS(ret)) { pbOutput = malloc(cbOutput); - if (pbOutput) { - if (encrypt) { - ret = BCryptEncrypt(ctx->hKey, block, cbInput, NULL, + if(pbOutput) { + if(encrypt || type.ctrMode) { + ret = BCryptEncrypt(ctx->hKey, pbInput, cbInput, NULL, ctx->pbIV, ctx->dwIV, pbOutput, cbOutput, &cbOutput, 0); - } else { - ret = BCryptDecrypt(ctx->hKey, block, cbInput, NULL, + } + else { + ret = BCryptDecrypt(ctx->hKey, pbInput, cbInput, NULL, ctx->pbIV, ctx->dwIV, pbOutput, cbOutput, &cbOutput, 0); } - if (BCRYPT_SUCCESS(ret)) { - memcpy(block, pbOutput, cbOutput); + if(BCRYPT_SUCCESS(ret)) { + if(type.ctrMode) { + _libssh2_xor_data(block, block, pbOutput, blocklen); + _libssh2_aes_ctr_increment(ctx->pbCtr, ctx->dwCtrLength); + } + else { + memcpy(block, pbOutput, cbOutput); + } } _libssh2_wincng_safe_free(pbOutput, cbOutput); - } else + } + else ret = STATUS_NO_MEMORY; } @@ -1791,6 +1852,10 @@ _libssh2_wincng_cipher_dtor(_libssh2_cipher_ctx *ctx) _libssh2_wincng_safe_free(ctx->pbIV, ctx->dwBlockLength); ctx->pbIV = NULL; ctx->dwBlockLength = 0; + + _libssh2_wincng_safe_free(ctx->pbCtr, ctx->dwCtrLength); + ctx->pbCtr = NULL; + ctx->dwCtrLength = 0; } @@ -1805,7 +1870,7 @@ _libssh2_wincng_bignum_init(void) _libssh2_bn *bignum; bignum = (_libssh2_bn *)malloc(sizeof(_libssh2_bn)); - if (bignum) { + if(bignum) { bignum->bignum = NULL; bignum->length = 0; } @@ -1818,20 +1883,20 @@ _libssh2_wincng_bignum_resize(_libssh2_bn *bn, unsigned long length) { unsigned char *bignum; - if (!bn) + if(!bn) return -1; - if (length == bn->length) + if(length == bn->length) return 0; #ifdef LIBSSH2_CLEAR_MEMORY - if (bn->bignum && bn->length > 0 && length < bn->length) { + if(bn->bignum && bn->length > 0 && length < bn->length) { SecureZeroMemory(bn->bignum + length, bn->length - length); } #endif bignum = realloc(bn->bignum, length); - if (!bignum) + if(!bignum) return -1; bn->bignum = bignum; @@ -1840,22 +1905,22 @@ _libssh2_wincng_bignum_resize(_libssh2_bn *bn, unsigned long length) return 0; } -int +static int _libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom) { unsigned char *bignum; unsigned long length; - if (!rnd) + if(!rnd) return -1; length = (unsigned long)(ceil((float)bits / 8) * sizeof(unsigned char)); - if (_libssh2_wincng_bignum_resize(rnd, length)) + if(_libssh2_wincng_bignum_resize(rnd, length)) return -1; bignum = rnd->bignum; - if (_libssh2_wincng_random(bignum, length)) + if(_libssh2_wincng_random(bignum, length)) return -1; /* calculate significant bits in most significant byte */ @@ -1865,24 +1930,23 @@ _libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom) bignum[0] &= (1 << (8 - bits)) - 1; /* set some special last bits in most significant byte */ - if (top == 0) + if(top == 0) bignum[0] |= (1 << (7 - bits)); - else if (top == 1) + else if(top == 1) bignum[0] |= (3 << (6 - bits)); /* make odd by setting first bit in least significant byte */ - if (bottom) + if(bottom) bignum[length - 1] |= 1; return 0; } -int +static int _libssh2_wincng_bignum_mod_exp(_libssh2_bn *r, _libssh2_bn *a, _libssh2_bn *p, - _libssh2_bn *m, - _libssh2_bn_ctx *bnctx) + _libssh2_bn *m) { BCRYPT_KEY_HANDLE hKey; BCRYPT_RSAKEY_BLOB *rsakey; @@ -1890,16 +1954,14 @@ _libssh2_wincng_bignum_mod_exp(_libssh2_bn *r, unsigned long keylen, offset, length; int ret; - (void)bnctx; - - if (!r || !a || !p || !m) + if(!r || !a || !p || !m) return -1; offset = sizeof(BCRYPT_RSAKEY_BLOB); keylen = offset + p->length + m->length; key = malloc(keylen); - if (!key) + if(!key) return -1; @@ -1921,14 +1983,14 @@ _libssh2_wincng_bignum_mod_exp(_libssh2_bn *r, BCRYPT_RSAPUBLIC_BLOB, &hKey, key, keylen, BCRYPT_NO_KEY_VALIDATION); - if (BCRYPT_SUCCESS(ret)) { + if(BCRYPT_SUCCESS(ret)) { ret = BCryptEncrypt(hKey, a->bignum, a->length, NULL, NULL, 0, NULL, 0, &length, BCRYPT_PAD_NONE); - if (BCRYPT_SUCCESS(ret)) { - if (!_libssh2_wincng_bignum_resize(r, length)) { + if(BCRYPT_SUCCESS(ret)) { + if(!_libssh2_wincng_bignum_resize(r, length)) { length = max(a->length, length); bignum = malloc(length); - if (bignum) { + if(bignum) { offset = length - a->length; memset(bignum, 0, offset); memcpy(bignum + offset, a->bignum, a->length); @@ -1939,12 +2001,14 @@ _libssh2_wincng_bignum_mod_exp(_libssh2_bn *r, _libssh2_wincng_safe_free(bignum, length); - if (BCRYPT_SUCCESS(ret)) { + if(BCRYPT_SUCCESS(ret)) { _libssh2_wincng_bignum_resize(r, offset); } - } else + } + else ret = STATUS_NO_MEMORY; - } else + } + else ret = STATUS_NO_MEMORY; } @@ -1961,20 +2025,20 @@ _libssh2_wincng_bignum_set_word(_libssh2_bn *bn, unsigned long word) { unsigned long offset, number, bits, length; - if (!bn) + if(!bn) return -1; bits = 0; number = word; - while (number >>= 1) + while(number >>= 1) bits++; length = (unsigned long) (ceil(((double)(bits + 1)) / 8.0) * sizeof(unsigned char)); - if (_libssh2_wincng_bignum_resize(bn, length)) + if(_libssh2_wincng_bignum_resize(bn, length)) return -1; - for (offset = 0; offset < length; offset++) + for(offset = 0; offset < length; offset++) bn->bignum[offset] = (word >> (offset * 8)) & 0xff; return 0; @@ -1986,19 +2050,19 @@ _libssh2_wincng_bignum_bits(const _libssh2_bn *bn) unsigned char number; unsigned long offset, length, bits; - if (!bn) + if(!bn) return 0; length = bn->length - 1; offset = 0; - while (!(*(bn->bignum + offset)) && (offset < length)) + while(!(*(bn->bignum + offset)) && (offset < length)) offset++; bits = (length - offset) * 8; number = bn->bignum[offset]; - while (number >>= 1) + while(number >>= 1) bits++; bits++; @@ -2013,10 +2077,10 @@ _libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len, unsigned char *bignum; unsigned long offset, length, bits; - if (!bn || !bin || !len) + if(!bn || !bin || !len) return; - if (_libssh2_wincng_bignum_resize(bn, len)) + if(_libssh2_wincng_bignum_resize(bn, len)) return; memcpy(bn->bignum, bin, len); @@ -2026,7 +2090,7 @@ _libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len, sizeof(unsigned char)); offset = bn->length - length; - if (offset > 0) { + if(offset > 0) { memmove(bn->bignum, bn->bignum + offset, length); #ifdef LIBSSH2_CLEAR_MEMORY @@ -2034,7 +2098,7 @@ _libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len, #endif bignum = realloc(bn->bignum, length); - if (bignum) { + if(bignum) { bn->bignum = bignum; bn->length = length; } @@ -2044,7 +2108,7 @@ _libssh2_wincng_bignum_from_bin(_libssh2_bn *bn, unsigned long len, void _libssh2_wincng_bignum_to_bin(const _libssh2_bn *bn, unsigned char *bin) { - if (bin && bn && bn->bignum && bn->length > 0) { + if(bin && bn && bn->bignum && bn->length > 0) { memcpy(bin, bn->bignum, bn->length); } } @@ -2052,8 +2116,8 @@ _libssh2_wincng_bignum_to_bin(const _libssh2_bn *bn, unsigned char *bin) void _libssh2_wincng_bignum_free(_libssh2_bn *bn) { - if (bn) { - if (bn->bignum) { + if(bn) { + if(bn->bignum) { _libssh2_wincng_safe_free(bn->bignum, bn->length); bn->bignum = NULL; } @@ -2064,13 +2128,41 @@ _libssh2_wincng_bignum_free(_libssh2_bn *bn) /* - * Windows CNG backend: other functions + * Windows CNG backend: Diffie-Hellman support. */ -void _libssh2_init_aes_ctr(void) +void +_libssh2_dh_init(_libssh2_dh_ctx *dhctx) +{ + *dhctx = _libssh2_wincng_bignum_init(); /* Random from client */ +} + +int +_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order) +{ + /* Generate x and e */ + if(_libssh2_wincng_bignum_rand(*dhctx, group_order * 8 - 1, 0, -1)) + return -1; + if(_libssh2_wincng_bignum_mod_exp(public, g, *dhctx, p)) + return -1; + return 0; +} + +int +_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p) +{ + /* Compute the shared secret */ + _libssh2_wincng_bignum_mod_exp(secret, f, *dhctx, p); + return 0; +} + +void +_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) { - /* no implementation */ - (void)0; + _libssh2_wincng_bignum_free(*dhctx); + *dhctx = NULL; } #endif /* LIBSSH2_WINCNG */ diff --git a/vendor/libssh2/src/wincng.h b/vendor/libssh2/src/wincng.h index 5219db7f8..f5838d0e6 100755 --- a/vendor/libssh2/src/wincng.h +++ b/vendor/libssh2/src/wincng.h @@ -55,7 +55,7 @@ #define LIBSSH2_HMAC_SHA512 1 #define LIBSSH2_AES 1 -#define LIBSSH2_AES_CTR 0 +#define LIBSSH2_AES_CTR 1 #define LIBSSH2_BLOWFISH 0 #define LIBSSH2_RC4 1 #define LIBSSH2_CAST 0 @@ -63,12 +63,20 @@ #define LIBSSH2_RSA 1 #define LIBSSH2_DSA 1 +#define LIBSSH2_ECDSA 0 +#define LIBSSH2_ED25519 0 #define MD5_DIGEST_LENGTH 16 #define SHA_DIGEST_LENGTH 20 #define SHA256_DIGEST_LENGTH 32 #define SHA512_DIGEST_LENGTH 64 +#define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) + +#if LIBSSH2_ECDSA +#else +#define _libssh2_ec_key void +#endif /*******************************************************************/ /* @@ -88,6 +96,7 @@ struct _libssh2_wincng_ctx { BCRYPT_ALG_HANDLE hAlgRSA; BCRYPT_ALG_HANDLE hAlgDSA; BCRYPT_ALG_HANDLE hAlgAES_CBC; + BCRYPT_ALG_HANDLE hAlgAES_ECB; BCRYPT_ALG_HANDLE hAlgRC4_NA; BCRYPT_ALG_HANDLE hAlg3DES_CBC; }; @@ -285,9 +294,11 @@ struct _libssh2_wincng_cipher_ctx { BCRYPT_KEY_HANDLE hKey; unsigned char *pbKeyObject; unsigned char *pbIV; + unsigned char *pbCtr; unsigned long dwKeyObject; unsigned long dwIV; unsigned long dwBlockLength; + unsigned long dwCtrLength; }; #define _libssh2_cipher_ctx struct _libssh2_wincng_cipher_ctx @@ -299,21 +310,21 @@ struct _libssh2_wincng_cipher_ctx { struct _libssh2_wincng_cipher_type { BCRYPT_ALG_HANDLE *phAlg; unsigned long dwKeyLength; - unsigned long dwUseIV; + int useIV; /* TODO: Convert to bool when a C89 compatible bool type + is defined */ + int ctrMode; }; #define _libssh2_cipher_type(type) struct _libssh2_wincng_cipher_type type -#define _libssh2_cipher_aes256ctr { NULL, 32, 1 } /* not supported */ -#define _libssh2_cipher_aes192ctr { NULL, 24, 1 } /* not supported */ -#define _libssh2_cipher_aes128ctr { NULL, 16, 1 } /* not supported */ -#define _libssh2_cipher_aes256 { &_libssh2_wincng.hAlgAES_CBC, 32, 1 } -#define _libssh2_cipher_aes192 { &_libssh2_wincng.hAlgAES_CBC, 24, 1 } -#define _libssh2_cipher_aes128 { &_libssh2_wincng.hAlgAES_CBC, 16, 1 } -#define _libssh2_cipher_blowfish { NULL, 16, 0 } /* not supported */ -#define _libssh2_cipher_arcfour { &_libssh2_wincng.hAlgRC4_NA, 16, 0 } -#define _libssh2_cipher_cast5 { NULL, 16, 0 } /* not supported */ -#define _libssh2_cipher_3des { &_libssh2_wincng.hAlg3DES_CBC, 24, 1 } +#define _libssh2_cipher_aes256ctr { &_libssh2_wincng.hAlgAES_ECB, 32, 0, 1 } +#define _libssh2_cipher_aes192ctr { &_libssh2_wincng.hAlgAES_ECB, 24, 0, 1 } +#define _libssh2_cipher_aes128ctr { &_libssh2_wincng.hAlgAES_ECB, 16, 0, 1 } +#define _libssh2_cipher_aes256 { &_libssh2_wincng.hAlgAES_CBC, 32, 1, 0 } +#define _libssh2_cipher_aes192 { &_libssh2_wincng.hAlgAES_CBC, 24, 1, 0 } +#define _libssh2_cipher_aes128 { &_libssh2_wincng.hAlgAES_CBC, 16, 1, 0 } +#define _libssh2_cipher_arcfour { &_libssh2_wincng.hAlgRC4_NA, 16, 0, 0 } +#define _libssh2_cipher_3des { &_libssh2_wincng.hAlg3DES_CBC, 24, 1, 0 } /* * Windows CNG backend: Cipher functions @@ -358,10 +369,6 @@ _libssh2_bn *_libssh2_wincng_bignum_init(void); _libssh2_wincng_bignum_init() #define _libssh2_bn_init_from_bin() \ _libssh2_bn_init() -#define _libssh2_bn_rand(bn, bits, top, bottom) \ - _libssh2_wincng_bignum_rand(bn, bits, top, bottom) -#define _libssh2_bn_mod_exp(r, a, p, m, ctx) \ - _libssh2_wincng_bignum_mod_exp(r, a, p, m, ctx) #define _libssh2_bn_set_word(bn, word) \ _libssh2_wincng_bignum_set_word(bn, word) #define _libssh2_bn_from_bin(bn, len, bin) \ @@ -374,6 +381,18 @@ _libssh2_bn *_libssh2_wincng_bignum_init(void); #define _libssh2_bn_free(bn) \ _libssh2_wincng_bignum_free(bn) +/* + * Windows CNG backend: Diffie-Hellman support + */ + +#define _libssh2_dh_ctx struct _libssh2_wincng_bignum * +#define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx) +#define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \ + _libssh2_dh_key_pair(dhctx, public, g, p, group_order) +#define libssh2_dh_secret(dhctx, secret, f, p, bnctx) \ + _libssh2_dh_secret(dhctx, secret, f, p) +#define libssh2_dh_dtor(dhctx) _libssh2_dh_dtor(dhctx) + /*******************************************************************/ /* * Windows CNG backend: forward declarations @@ -381,7 +400,6 @@ _libssh2_bn *_libssh2_wincng_bignum_init(void); void _libssh2_wincng_init(void); void _libssh2_wincng_free(void); int _libssh2_wincng_random(void *buf, int len); -void _libssh2_init_aes_ctr(void); int _libssh2_wincng_hash_init(_libssh2_wincng_hash_ctx *ctx, @@ -531,14 +549,6 @@ _libssh2_wincng_cipher_dtor(_libssh2_cipher_ctx *ctx); _libssh2_bn * _libssh2_wincng_bignum_init(void); int -_libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom); -int -_libssh2_wincng_bignum_mod_exp(_libssh2_bn *r, - _libssh2_bn *a, - _libssh2_bn *p, - _libssh2_bn *m, - _libssh2_bn_ctx *bnctx); -int _libssh2_wincng_bignum_set_word(_libssh2_bn *bn, unsigned long word); unsigned long _libssh2_wincng_bignum_bits(const _libssh2_bn *bn); @@ -549,3 +559,13 @@ void _libssh2_wincng_bignum_to_bin(const _libssh2_bn *bn, unsigned char *bin); void _libssh2_wincng_bignum_free(_libssh2_bn *bn); +extern void +_libssh2_dh_init(_libssh2_dh_ctx *dhctx); +extern int +_libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, + _libssh2_bn *g, _libssh2_bn *p, int group_order); +extern int +_libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, + _libssh2_bn *f, _libssh2_bn *p); +extern void +_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); diff --git a/vendor/libssh2/tests/CMakeLists.txt b/vendor/libssh2/tests/CMakeLists.txt index bd0f903e2..c8c5253df 100644 --- a/vendor/libssh2/tests/CMakeLists.txt +++ b/vendor/libssh2/tests/CMakeLists.txt @@ -43,15 +43,70 @@ include(SocketLibraries) ## Platform checks check_include_files(inttypes.h HAVE_INTTYPES_H) check_include_files(unistd.h HAVE_UNISTD_H) +check_include_files(sys/param.h HAVE_SYS_PARAM_H) check_include_files(sys/socket.h HAVE_SYS_SOCKET_H) check_include_files(arpa/inet.h HAVE_ARPA_INET_H) check_include_files(windows.h HAVE_WINDOWS_H) check_include_files(winsock2.h HAVE_WINSOCK2_H) +check_include_files(netinet/in.h HAVE_NETINET_IN_H) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/libssh2_config_cmake.h.in" "${CMAKE_CURRENT_BINARY_DIR}/libssh2_config.h") append_needed_socket_libraries(LIBRARIES) +## Cryptography backend choice + +set(CRYPTO_BACKEND + "" + CACHE + STRING + "The backend to use for cryptography: OpenSSL, Libgcrypt or WinCNG, mbedTLS +or empty to try any available") + +# If the crypto backend was given, rather than searching for the first +# we are able to find, the find_package commands must abort configuration +# and report to the user. +if(CRYPTO_BACKEND) + set(SPECIFIC_CRYPTO_REQUIREMENT REQUIRED) +endif() + +if(CRYPTO_BACKEND STREQUAL "OpenSSL" OR NOT CRYPTO_BACKEND) + + find_package(OpenSSL ${SPECIFIC_CRYPTO_REQUIREMENT}) + + if(OPENSSL_FOUND) + set(CRYPTO_BACKEND "OpenSSL") + endif() +endif() + +if(CRYPTO_BACKEND STREQUAL "Libgcrypt" OR NOT CRYPTO_BACKEND) + + find_package(Libgcrypt ${SPECIFIC_CRYPTO_REQUIREMENT}) + + if(LIBGCRYPT_FOUND) + set(CRYPTO_BACKEND "Libgcrypt") + endif() +endif() + +if(CRYPTO_BACKEND STREQUAL "WinCNG" OR NOT CRYPTO_BACKEND) + + # The check actually compiles the header. This requires windows.h. + check_include_files("windows.h;bcrypt.h" HAVE_BCRYPT_H) + + if(HAVE_BCRYPT_H) + set(CRYPTO_BACKEND "WinCNG") + endif() +endif() + +if(CRYPTO_BACKEND STREQUAL "mbedTLS" OR NOT CRYPTO_BACKEND) + + find_package(mbedTLS ${SPECIFIC_CRYPTO_REQUIREMENT}) + + if(MBEDTLS_FOUND) + set(CRYPTO_BACKEND "mbedTLS") + endif() +endif() + set(TESTS hostkey hostkey_hash @@ -60,11 +115,30 @@ set(TESTS password_auth_fails_with_wrong_username public_key_auth_fails_with_wrong_key public_key_auth_succeeds_with_correct_rsa_key - public_key_auth_succeeds_with_correct_dsa_key + public_key_auth_succeeds_with_correct_encrypted_rsa_key keyboard_interactive_auth_fails_with_wrong_response keyboard_interactive_auth_succeeds_with_correct_response ) +if(CRYPTO_BACKEND STREQUAL "OpenSSL") + list(APPEND TESTS + public_key_auth_succeeds_with_correct_rsa_openssh_key + ) + if(OPENSSL_VERSION VERSION_GREATER "1.1.0") + list(APPEND TESTS + public_key_auth_succeeds_with_correct_ed25519_key + public_key_auth_succeeds_with_correct_encrypted_ed25519_key + public_key_auth_succeeds_with_correct_ed25519_key_from_mem + ) + endif() +endif() + +if(NOT CRYPTO_BACKEND STREQUAL "mbedTLS") + list(APPEND TESTS + public_key_auth_succeeds_with_correct_dsa_key + ) +endif() + add_library(openssh_fixture STATIC openssh_fixture.h openssh_fixture.c) target_link_libraries(openssh_fixture ${LIBRARIES}) target_include_directories(openssh_fixture PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") @@ -82,6 +156,7 @@ foreach(test ${TESTS}) target_link_libraries(test_${test} libssh2 runner ${LIBRARIES}) target_include_directories(test_${test} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") list(APPEND TEST_TARGETS test_${test}) + add_definitions(-DFIXTURE_WORKDIR="${CMAKE_CURRENT_SOURCE_DIR}") add_test( NAME test_${test} COMMAND $ diff --git a/vendor/libssh2/tests/Makefile.am b/vendor/libssh2/tests/Makefile.am index 3c3745c68..dc0922f21 100644 --- a/vendor/libssh2/tests/Makefile.am +++ b/vendor/libssh2/tests/Makefile.am @@ -31,3 +31,11 @@ EXTRA_DIST += test_password_auth_succeeds_with_correct_credentials.c EXTRA_DIST += test_public_key_auth_fails_with_wrong_key.c EXTRA_DIST += test_public_key_auth_succeeds_with_correct_dsa_key.c EXTRA_DIST += test_public_key_auth_succeeds_with_correct_rsa_key.c +EXTRA_DIST += test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c +if OPENSSL +# TODO: need to add a test for specific openssl version some how +# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_ed25519_key.c +# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c +# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c +EXTRA_DIST += test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c +endif \ No newline at end of file diff --git a/vendor/libssh2/tests/Makefile.in b/vendor/libssh2/tests/Makefile.in index 3228129f4..1cd508298 100644 --- a/vendor/libssh2/tests/Makefile.in +++ b/vendor/libssh2/tests/Makefile.in @@ -90,6 +90,11 @@ build_triplet = @build@ host_triplet = @host@ @SSHD_TRUE@noinst_PROGRAMS = ssh2$(EXEEXT) @SSHD_TRUE@am__append_1 = ssh2.sh +# TODO: need to add a test for specific openssl version some how +# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_ed25519_key.c +# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c +# EXTRA_DIST += test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c +@OPENSSL_TRUE@am__append_2 = test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \ @@ -419,7 +424,7 @@ GREP = @GREP@ HAVE_LIBBCRYPT = @HAVE_LIBBCRYPT@ HAVE_LIBCRYPT32 = @HAVE_LIBCRYPT32@ HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ -HAVE_LIBMBEDTLS = @HAVE_LIBMBEDTLS@ +HAVE_LIBMBEDCRYPTO = @HAVE_LIBMBEDCRYPTO@ HAVE_LIBSSL = @HAVE_LIBSSL@ HAVE_LIBZ = @HAVE_LIBZ@ INSTALL = @INSTALL@ @@ -435,8 +440,8 @@ LIBCRYPT32 = @LIBCRYPT32@ LIBCRYPT32_PREFIX = @LIBCRYPT32_PREFIX@ LIBGCRYPT = @LIBGCRYPT@ LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ -LIBMBEDTLS = @LIBMBEDTLS@ -LIBMBEDTLS_PREFIX = @LIBMBEDTLS_PREFIX@ +LIBMBEDCRYPTO = @LIBMBEDCRYPTO@ +LIBMBEDCRYPTO_PREFIX = @LIBMBEDCRYPTO_PREFIX@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSREQUIRED = @LIBSREQUIRED@ @@ -451,7 +456,7 @@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ LTLIBCRYPT32 = @LTLIBCRYPT32@ LTLIBGCRYPT = @LTLIBGCRYPT@ -LTLIBMBEDTLS = @LTLIBMBEDTLS@ +LTLIBMBEDCRYPTO = @LTLIBMBEDCRYPTO@ LTLIBOBJS = @LTLIBOBJS@ LTLIBSSL = @LTLIBSSL@ LTLIBZ = @LTLIBZ@ @@ -557,7 +562,9 @@ EXTRA_DIST = ssh2.sh mansyntax.sh etc/host etc/host.pub etc/user \ test_password_auth_succeeds_with_correct_credentials.c \ test_public_key_auth_fails_with_wrong_key.c \ test_public_key_auth_succeeds_with_correct_dsa_key.c \ - test_public_key_auth_succeeds_with_correct_rsa_key.c + test_public_key_auth_succeeds_with_correct_rsa_key.c \ + test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c \ + $(am__append_2) all: all-am .SUFFIXES: diff --git a/vendor/libssh2/tests/libssh2_config_cmake.h.in b/vendor/libssh2/tests/libssh2_config_cmake.h.in index 51461f256..4df27ecdc 100644 --- a/vendor/libssh2/tests/libssh2_config_cmake.h.in +++ b/vendor/libssh2/tests/libssh2_config_cmake.h.in @@ -37,6 +37,7 @@ /* Headers */ #cmakedefine HAVE_UNISTD_H #cmakedefine HAVE_INTTYPES_H +#cmakedefine HAVE_SYS_PARAM_H #cmakedefine HAVE_SYS_SOCKET_H #cmakedefine HAVE_ARPA_INET_H #cmakedefine HAVE_NETINET_IN_H diff --git a/vendor/libssh2/tests/openssh_fixture.c b/vendor/libssh2/tests/openssh_fixture.c index 185ef87f0..093f31e0e 100644 --- a/vendor/libssh2/tests/openssh_fixture.c +++ b/vendor/libssh2/tests/openssh_fixture.c @@ -57,87 +57,98 @@ #include #include #include +#include -static int run_command(const char *command, char **output) +static int run_command_varg(char **output, const char *command, va_list args) { FILE *pipe; char command_buf[BUFSIZ]; + char buf[BUFSIZ]; + char *p; int ret; - if (output) { + if(output) { *output = NULL; } - /* Rewrite the command to redirect stderr to stdout to we can output it */ - ret = snprintf(command_buf, sizeof(command_buf), "%s 2>&1", command); - if (ret < 0 || ret >= BUFSIZ) { + /* Format the command string */ + ret = vsnprintf(command_buf, sizeof(command_buf), command, args); + if(ret < 0 || ret >= BUFSIZ) { fprintf(stderr, "Unable to format command (%s)\n", command); return -1; } + /* Rewrite the command to redirect stderr to stdout to we can output it */ + if(strlen(command_buf) + 6 >= sizeof(command_buf)) { + fprintf(stderr, "Unable to rewrite command (%s)\n", command); + return -1; + } + + strncat(command_buf, " 2>&1", 6); + fprintf(stdout, "Command: %s\n", command); #ifdef WIN32 pipe = _popen(command_buf, "r"); #else pipe = popen(command_buf, "r"); #endif - if (pipe) { - char buf[BUFSIZ]; - char *p = buf; - while (fgets(p, sizeof(buf) - (p - buf), pipe) != NULL) - ; + if(!pipe) { + fprintf(stderr, "Unable to execute command '%s'\n", command); + return -1; + } + p = buf; + while(fgets(p, sizeof(buf) - (p - buf), pipe) != NULL) + ; #ifdef WIN32 - ret = _pclose(pipe); + ret = _pclose(pipe); #else - ret = pclose(pipe); + ret = pclose(pipe); #endif - if (ret == 0) { - if (output) { - /* command output may contain a trailing newline, so we trim - * whitespace here */ - size_t end = strlen(buf) - 1; - while (end > 0 && isspace(buf[end])) { - buf[end] = '\0'; - } - - *output = strdup(buf); - } - } - else { - fprintf(stderr, "Error running command '%s' (exit %d): %s\n", - command, ret, buf); - } - return ret; + if(ret != 0) { + fprintf(stderr, "Error running command '%s' (exit %d): %s\n", + command, ret, buf); } - else { - fprintf(stderr, "Unable to execute command '%s'\n", command); - return -1; + + if(output) { + /* command output may contain a trailing newline, so we trim + * whitespace here */ + size_t end = strlen(buf) - 1; + while(end > 0 && isspace(buf[end])) { + buf[end] = '\0'; + } + + *output = strdup(buf); } + return ret; +} + +static int run_command(char **output, const char *command, ...) +{ + va_list args; + int ret; + + va_start(args, command); + ret = run_command_varg(output, command, args); + va_end(args); + + return ret; } static int build_openssh_server_docker_image() { - return run_command("docker build -t libssh2/openssh_server openssh_server", - NULL); + return run_command(NULL, "docker build -t libssh2/openssh_server openssh_server"); } static int start_openssh_server(char **container_id_out) { - return run_command("docker run --detach -P libssh2/openssh_server", - container_id_out); + return run_command(container_id_out, + "docker run --detach -P libssh2/openssh_server" + ); } static int stop_openssh_server(char *container_id) { - char command_buf[BUFSIZ]; - int rc = snprintf(command_buf, sizeof(command_buf), "docker stop %s", - container_id); - if (rc > -1 && rc < BUFSIZ) { - return run_command(command_buf, NULL); - } - else { - return rc; - } + return run_command(NULL, "docker stop %s", container_id); } static const char *docker_machine_name() @@ -148,22 +159,17 @@ static const char *docker_machine_name() static int ip_address_from_container(char *container_id, char **ip_address_out) { const char *active_docker_machine = docker_machine_name(); - if (active_docker_machine != NULL) { + if(active_docker_machine != NULL) { - // This can be flaky when tests run in parallel (see - // https://github.com/docker/machine/issues/2612), so we retry a few - // times with exponential backoff if it fails + /* This can be flaky when tests run in parallel (see + https://github.com/docker/machine/issues/2612), so we retry a few + times with exponential backoff if it fails */ int attempt_no = 0; int wait_time = 500; - for (;;) { - char command_buf[BUFSIZ]; - int rc = snprintf(command_buf, sizeof(command_buf), - "docker-machine ip %s", active_docker_machine); - if (rc > -1 && rc < BUFSIZ) { - return run_command(command_buf, ip_address_out); - } + for(;;) { + return run_command(ip_address_out, "docker-machine ip %s", active_docker_machine); - if (attempt_no > 5) { + if(attempt_no > 5) { fprintf( stderr, "Unable to get IP from docker-machine after %d attempts\n", @@ -185,93 +191,75 @@ static int ip_address_from_container(char *container_id, char **ip_address_out) } } else { - char command_buf[BUFSIZ]; - int rc = snprintf( - command_buf, sizeof(command_buf), - "docker inspect --format \"{{ index (index (index " - ".NetworkSettings.Ports \\\"22/tcp\\\") 0) \\\"HostIp\\\" }}\" %s", - container_id); - if (rc > -1 && rc < BUFSIZ) { - return run_command(command_buf, ip_address_out); - } - else { - return rc; - } + return run_command(ip_address_out, + "docker inspect --format " + "\"{{ index (index (index .NetworkSettings.Ports " + "\\\"22/tcp\\\") 0) \\\"HostIp\\\" }}\" %s", + container_id); } } static int port_from_container(char *container_id, char **port_out) { - char command_buf[BUFSIZ]; - int rc = snprintf( - command_buf, sizeof(command_buf), - "docker inspect --format \"{{ index (index (index " - ".NetworkSettings.Ports \\\"22/tcp\\\") 0) \\\"HostPort\\\" }}\" %s", - container_id); - if (rc > -1 && rc < BUFSIZ) { - return run_command(command_buf, port_out); - } - else { - return rc; - } + return run_command(port_out, + "docker inspect --format " + "\"{{ index (index (index .NetworkSettings.Ports " + "\\\"22/tcp\\\") 0) \\\"HostPort\\\" }}\" %s", + container_id); } static int open_socket_to_container(char *container_id) { char *ip_address = NULL; + char *port_string = NULL; + unsigned long hostaddr; + int sock; + struct sockaddr_in sin; int ret = ip_address_from_container(container_id, &ip_address); - if (ret == 0) { - char *port_string = NULL; - ret = port_from_container(container_id, &port_string); - if (ret == 0) { - unsigned long hostaddr = inet_addr(ip_address); - if (hostaddr != (unsigned long)(-1)) { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock > -1) { - struct sockaddr_in sin; - - sin.sin_family = AF_INET; - sin.sin_port = htons((short)strtol(port_string, NULL, 0)); - sin.sin_addr.s_addr = hostaddr; - - if (connect(sock, (struct sockaddr *)(&sin), - sizeof(struct sockaddr_in)) == 0) { - ret = sock; - } - else { - fprintf(stderr, "Failed to connect to %s:%s\n", - ip_address, port_string); - ret = -1; - } - } - else { - fprintf(stderr, "Failed to open socket (%d)\n", sock); - ret = -1; - } - } - else { - fprintf(stderr, "Failed to convert %s host address\n", - ip_address); - ret = -1; - } + if(ret != 0) { + fprintf(stderr, "Failed to get IP address for container %s\n", container_id); + ret = -1; + goto cleanup; + } - free(port_string); - } - else { - fprintf(stderr, "Failed to get port for container %s\n", - container_id); - ret = -1; - } + ret = port_from_container(container_id, &port_string); + if(ret != 0) { + fprintf(stderr, "Failed to get port for container %s\n", container_id); + ret = -1; + } - free(ip_address); + hostaddr = inet_addr(ip_address); + if(hostaddr == (unsigned long)(-1)) { + fprintf(stderr, "Failed to convert %s host address\n", ip_address); + ret = -1; + goto cleanup; } - else { - fprintf(stderr, "Failed to get IP address for container %s\n", - container_id); + + sock = socket(AF_INET, SOCK_STREAM, 0); + if(sock <= 0) { + fprintf(stderr, "Failed to open socket (%d)\n", sock); ret = -1; + goto cleanup; } + sin.sin_family = AF_INET; + sin.sin_port = htons((short)strtol(port_string, NULL, 0)); + sin.sin_addr.s_addr = hostaddr; + + if(connect(sock, (struct sockaddr *)(&sin), + sizeof(struct sockaddr_in)) != 0) { + fprintf(stderr, "Failed to connect to %s:%s\n", ip_address, port_string); + ret = -1; + goto cleanup; + } + + ret = sock; + +cleanup: + free(ip_address); + free(port_string); + return ret; } @@ -284,14 +272,14 @@ int start_openssh_fixture() WSADATA wsadata; ret = WSAStartup(MAKEWORD(2, 0), &wsadata); - if (ret != 0) { + if(ret != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", ret); return 1; } #endif ret = build_openssh_server_docker_image(); - if (ret == 0) { + if(ret == 0) { return start_openssh_server(&running_container_id); } else { @@ -302,7 +290,7 @@ int start_openssh_fixture() void stop_openssh_fixture() { - if (running_container_id) { + if(running_container_id) { stop_openssh_server(running_container_id); free(running_container_id); running_container_id = NULL; diff --git a/vendor/libssh2/tests/openssh_server/Dockerfile b/vendor/libssh2/tests/openssh_server/Dockerfile index 284810626..72e24bfe3 100644 --- a/vendor/libssh2/tests/openssh_server/Dockerfile +++ b/vendor/libssh2/tests/openssh_server/Dockerfile @@ -50,6 +50,14 @@ COPY ssh_host_rsa_key /tmp/etc/ssh/ssh_host_rsa_key RUN mv /tmp/etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key RUN chmod 600 /etc/ssh/ssh_host_rsa_key +COPY ssh_host_ecdsa_key /tmp/etc/ssh/ssh_host_ecdsa_key +RUN mv /tmp/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ecdsa_key +RUN chmod 600 /etc/ssh/ssh_host_ecdsa_key + +COPY ssh_host_ed25519_key /tmp/etc/ssh/ssh_host_ed25519_key +RUN mv /tmp/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_ed25519_key +RUN chmod 600 /etc/ssh/ssh_host_ed25519_key + RUN adduser --disabled-password --gecos 'Test user for libssh2 integration tests' libssh2 RUN echo 'libssh2:my test password' | chpasswd diff --git a/vendor/libssh2/tests/openssh_server/authorized_keys b/vendor/libssh2/tests/openssh_server/authorized_keys index 3ae35e6d4..870f9a2f2 100644 --- a/vendor/libssh2/tests/openssh_server/authorized_keys +++ b/vendor/libssh2/tests/openssh_server/authorized_keys @@ -1,2 +1,6 @@ ssh-dss AAAAB3NzaC1kc3MAAACBAK2Jh2Ck+8W1+LsFrjgOIH7XHySiONPSdG+faFTZprinh9cjyR3odzntVA7+UuFH14WnGM/ub6MbAXjrxDo1TzGILvW5x6nQ6hdLu7xFygihZ8sO1mIMOVqGdlNbTiYHl8XGjbLt1iXfW8ThM91LGGqmS+cgEiy0wWHYzsOXTDz9AAAAFQD/ebunYNTluoBrEYIoq3LMtQPbcwAAAIEAjPBzkUKcmfMAmb0eO/QAVXmX+L8NC6Vn2m4QguQ2IcJ8NH6VMnxXEBHsnemCOa9jN55G+LnX17PViuKS0O3rqQiSdA5wcHyCHKBT519/v1KQNymDwudfnFvdxUyAAG6MDSxKlpbXDCbrhFd2+ahC9a7rKalRPSXR0R2hhWRvjK0AAACAJ+CGwV/1S4j1GVwa6pSP0nj4V86GWXosTTBg7GT+rKWu8lrxIcr6FzLWgFi/gHoMrgnKWGxO1yF7vkoYM5Yfo84oBYiH+MgpiBuOrZrgzacHsA66JJbUfrESRFWZl2blIPr6Gyjj6cVGgMabK3yCiTRi0v7hwffpm0rKyKv7Goo= awl03@bounty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnak1T7zHJ+hVRFBDQ9pf1KVzmd5gaNc7y7NPmL13aOG3sYeJevi1x1WM/R3tb8XnUnzZUX9GJN0MYovvZsw9bknG1mDP72LFbGp/gzPddGIKHBBpvceDaJ85sM/ME3XOtD7uuXQuNAuEHwEzSMMiSIEMcQS+lXIcMLr5xPLEkyNvqsO5RqSjMTLHKHgY8gLWx7oQ1avokhwuDxF7P3Pqtj+rW2Te6vR0i1H6EyFPsBkzkgNXb33cus8M1CnTmYTSgJgmHO2LLcGpjQ5sL8T/PWIWHaSqTnkrFXEMysgoteXnAYILjzyBaqq2WV4KA3TluGdAP2p8gC32QtKmIuis3Q== awl03@bounty +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC92YlGoc4PJy6DzX916JJZhxkvmkWBLGJdWOL7R9B6iaYEKebBxzTE3P1RcnxnuI06kklVq/KcDP9sLlgawTZcDg7ifM7HncPOi18OON8vvVVzodikHzuupjhpI5YTT9wwV2fDVi2URsBjvX4AFiZ5WM3/NwqdKpYABzWieBikXGJ58Tsnw+zQw2qMmKKESBuzSN538loTAj5iEH/GAKYDbbH9t2a17qhNCNEw4vrtURT9JqwO1cOg7N1OKpmqCPEbK0wuSTljNC230VJ06X/8UqahWWSH6MreGy6gwpPi6i9wFiFLur301R0dTPiKVhz6bguhcC1EAlhSgjfelFJt awl03@bounty +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTe1lN2L/yet0Ma1JzXkQf3t1f+pauALec2FsGZy87KRJW1AOxcTTiePjlFwP1yfSK1lWXQ+uf0b61gkKqqR52FDky24HJWuYlfXlEQMn2d/PNDNVDDbO4TXKyNxxUHFJ6qYMNd4kWjOH+6rmYoWKsWV+3mDRbHagbVPEYL8wep8OTqKOqruVLVPzZyYZkBtn4XOFi6UE8WKiSVdK1Am1O5UxvlD95t32eYch6wQ9azgMqja6spe/L5UJgP83QZFknVC3wPZWkjqomVFql0FpaQclENwyY/OZMxr0cT/f7bCL6s4A/1XpbsGmC0xak4/THHbOn+0LdIej2nGV8JFoR +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIxtdyg2ZRXE70UwyPVUH3UyfDBV8GX5cPF636P6hjom +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICHxEyUTOVHXvdMFARedFQ+H9DW/n8Zy3daKKRqnTDMq diff --git a/vendor/libssh2/tests/runner.c b/vendor/libssh2/tests/runner.c index efd05ef4d..b9f9328df 100644 --- a/vendor/libssh2/tests/runner.c +++ b/vendor/libssh2/tests/runner.c @@ -43,7 +43,7 @@ int main() { int exit_code = 1; LIBSSH2_SESSION *session = start_session_fixture(); - if (session != NULL) { + if(session != NULL) { exit_code = (test(session) == 0) ? 0 : 1; } stop_session_fixture(); diff --git a/vendor/libssh2/tests/session_fixture.c b/vendor/libssh2/tests/session_fixture.c index 6985275e6..5d8fd2156 100644 --- a/vendor/libssh2/tests/session_fixture.c +++ b/vendor/libssh2/tests/session_fixture.c @@ -40,6 +40,10 @@ #include "openssh_fixture.h" #include +#include +#ifdef HAVE_UNISTD_H +#include +#endif #ifdef HAVE_WINDOWS_H #include @@ -50,63 +54,85 @@ #ifdef HAVE_SYS_SOCKET_H #include #endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif LIBSSH2_SESSION *connected_session = NULL; int connected_socket = -1; static int connect_to_server() { + int rc; connected_socket = open_socket_to_openssh_server(); - if (connected_socket > -1) { - int rc = libssh2_session_handshake(connected_session, connected_socket); - if (rc == 0) { - return 0; - } - else { - print_last_session_error("libssh2_session_handshake"); - return -1; - } + if(connected_socket <= 0) { + return -1; } - else { + + rc = libssh2_session_handshake(connected_session, connected_socket); + if(rc != 0) { + print_last_session_error("libssh2_session_handshake"); return -1; } + + return 0; +} + +void setup_fixture_workdir() +{ + char *wd = getenv("FIXTURE_WORKDIR"); +#ifdef FIXTURE_WORKDIR + if(!wd) { + wd = FIXTURE_WORKDIR; + } +#endif + if(!wd) { +#ifdef WIN32 + char wd_buf[_MAX_PATH]; +#else + char wd_buf[MAXPATHLEN]; +#endif + getcwd(wd_buf, sizeof(wd_buf)); + wd = wd_buf; + } + + chdir(wd); } LIBSSH2_SESSION *start_session_fixture() { - int rc = start_openssh_fixture(); - if (rc == 0) { - rc = libssh2_init(0); - if (rc == 0) { - connected_session = libssh2_session_init_ex(NULL, NULL, NULL, NULL); - libssh2_session_set_blocking(connected_session, 1); - if (connected_session != NULL) { - rc = connect_to_server(); - if (rc == 0) { - return connected_session; - } - else { - return NULL; - } - } - else { - fprintf(stderr, "libssh2_session_init_ex failed\n"); - return NULL; - } - } - else { - fprintf(stderr, "libssh2_init failed (%d)\n", rc); - return NULL; - } + int rc; + + setup_fixture_workdir(); + + rc = start_openssh_fixture(); + if(rc != 0) { + return NULL; } - else { + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2_init failed (%d)\n", rc); + return NULL; + } + + connected_session = libssh2_session_init_ex(NULL, NULL, NULL, NULL); + libssh2_session_set_blocking(connected_session, 1); + if(connected_session == NULL) { + fprintf(stderr, "libssh2_session_init_ex failed\n"); + return NULL; + } + + rc = connect_to_server(); + if(rc != 0) { return NULL; } + + return connected_session; } void print_last_session_error(const char *function) { - if (connected_session) { + if(connected_session) { char *message; int rc = libssh2_session_last_error(connected_session, &message, NULL, 0); @@ -119,7 +145,7 @@ void print_last_session_error(const char *function) void stop_session_fixture() { - if (connected_session) { + if(connected_session) { libssh2_session_disconnect(connected_session, "test ended"); libssh2_session_free(connected_session); shutdown(connected_socket, 2); diff --git a/vendor/libssh2/tests/simple.c b/vendor/libssh2/tests/simple.c index 0a5b03c02..e97f7d339 100644 --- a/vendor/libssh2/tests/simple.c +++ b/vendor/libssh2/tests/simple.c @@ -41,28 +41,27 @@ #include "libssh2.h" -static int test_libssh2_base64_decode (LIBSSH2_SESSION *session) +static int test_libssh2_base64_decode(LIBSSH2_SESSION *session) { char *data; unsigned int datalen; const char *src = "Zm5vcmQ="; - unsigned int src_len = strlen (src); + unsigned int src_len = strlen(src); int ret; ret = libssh2_base64_decode(session, &data, &datalen, src, src_len); - if (ret) + if(ret) return ret; - if (datalen != 5 || strcmp (data, "fnord") != 0) - { - fprintf (stderr, - "libssh2_base64_decode() failed (%d, %.*s)\n", - datalen, datalen, data); + if(datalen != 5 || strcmp(data, "fnord") != 0) { + fprintf(stderr, + "libssh2_base64_decode() failed (%d, %.*s)\n", + datalen, datalen, data); return 1; } - free (data); + free(data); return 0; } @@ -74,25 +73,23 @@ int main(int argc, char *argv[]) (void)argv; (void)argc; - rc = libssh2_init (LIBSSH2_INIT_NO_CRYPTO); - if (rc != 0) - { - fprintf (stderr, "libssh2_init() failed: %d\n", rc); + rc = libssh2_init(LIBSSH2_INIT_NO_CRYPTO); + if(rc != 0) { + fprintf(stderr, "libssh2_init() failed: %d\n", rc); return 1; } session = libssh2_session_init(); - if (!session) - { - fprintf (stderr, "libssh2_session_init() failed\n"); + if(!session) { + fprintf(stderr, "libssh2_session_init() failed\n"); return 1; } - test_libssh2_base64_decode (session); + test_libssh2_base64_decode(session); libssh2_session_free(session); - libssh2_exit (); + libssh2_exit(); return 0; } diff --git a/vendor/libssh2/tests/ssh2.c b/vendor/libssh2/tests/ssh2.c index f8b6a0d5e..d349ab904 100644 --- a/vendor/libssh2/tests/ssh2.c +++ b/vendor/libssh2/tests/ssh2.c @@ -39,18 +39,18 @@ int main(int argc, char *argv[]) char *userauthlist; LIBSSH2_SESSION *session; LIBSSH2_CHANNEL *channel; - const char *pubkeyfile="etc/user.pub"; - const char *privkeyfile="etc/user"; - const char *username="username"; - const char *password="password"; + const char *pubkeyfile = "etc/user.pub"; + const char *privkeyfile = "etc/user"; + const char *username = "username"; + const char *password = "password"; int ec = 1; #ifdef WIN32 WSADATA wsadata; int err; - err = WSAStartup(MAKEWORD(2,0), &wsadata); - if (err != 0) { + err = WSAStartup(MAKEWORD(2, 0), &wsadata); + if(err != 0) { fprintf(stderr, "WSAStartup failed with error: %d\n", err); return -1; } @@ -59,14 +59,14 @@ int main(int argc, char *argv[]) (void)argc; (void)argv; - if (getenv ("USER")) - username = getenv ("USER"); + if(getenv("USER")) + username = getenv("USER"); - if (getenv ("PRIVKEY")) - privkeyfile = getenv ("PRIVKEY"); + if(getenv ("PRIVKEY")) + privkeyfile = getenv("PRIVKEY"); - if (getenv ("PUBKEY")) - pubkeyfile = getenv ("PUBKEY"); + if(getenv("PUBKEY")) + pubkeyfile = getenv("PUBKEY"); hostaddr = htonl(0x7F000001); @@ -77,7 +77,7 @@ int main(int argc, char *argv[]) sin.sin_family = AF_INET; sin.sin_port = htons(4711); sin.sin_addr.s_addr = hostaddr; - if (connect(sock, (struct sockaddr*)(&sin), + if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in)) != 0) { fprintf(stderr, "failed to connect!\n"); return 1; @@ -87,7 +87,7 @@ int main(int argc, char *argv[]) * This will trade welcome banners, exchange keys, and setup crypto, compression, and MAC layers */ session = libssh2_session_init(); - if (libssh2_session_startup(session, sock)) { + if(libssh2_session_startup(session, sock)) { fprintf(stderr, "Failure establishing SSH session\n"); return 1; } @@ -106,31 +106,34 @@ int main(int argc, char *argv[]) /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, strlen(username)); printf("Authentication methods: %s\n", userauthlist); - if (strstr(userauthlist, "password") != NULL) { + if(strstr(userauthlist, "password") != NULL) { auth_pw |= 1; } - if (strstr(userauthlist, "keyboard-interactive") != NULL) { + if(strstr(userauthlist, "keyboard-interactive") != NULL) { auth_pw |= 2; } - if (strstr(userauthlist, "publickey") != NULL) { + if(strstr(userauthlist, "publickey") != NULL) { auth_pw |= 4; } - if (auth_pw & 4) { + if(auth_pw & 4) { /* Authenticate by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, pubkeyfile, privkeyfile, password)) { + if(libssh2_userauth_publickey_fromfile(session, username, pubkeyfile, privkeyfile, password)) { printf("\tAuthentication by public key failed!\n"); goto shutdown; - } else { + } + else { printf("\tAuthentication by public key succeeded.\n"); } - } else { + } + else { printf("No supported authentication methods found!\n"); goto shutdown; } /* Request a shell */ - if (!(channel = libssh2_channel_open_session(session))) { + channel = libssh2_channel_open_session(session); + if(!channel) { fprintf(stderr, "Unable to open a session\n"); goto shutdown; } @@ -143,13 +146,13 @@ int main(int argc, char *argv[]) /* Request a terminal with 'vanilla' terminal emulation * See /etc/termcap for more options */ - if (libssh2_channel_request_pty(channel, "vanilla")) { + if(libssh2_channel_request_pty(channel, "vanilla")) { fprintf(stderr, "Failed requesting pty\n"); goto skip_shell; } /* Open a SHELL on that pty */ - if (libssh2_channel_shell(channel)) { + if(libssh2_channel_shell(channel)) { fprintf(stderr, "Unable to request shell on allocated pty\n"); goto shutdown; } @@ -157,7 +160,7 @@ int main(int argc, char *argv[]) ec = 0; skip_shell: - if (channel) { + if(channel) { libssh2_channel_free(channel); channel = NULL; } diff --git a/vendor/libssh2/tests/test_hostkey.c b/vendor/libssh2/tests/test_hostkey.c index 63c2063f2..e09a76747 100644 --- a/vendor/libssh2/tests/test_hostkey.c +++ b/vendor/libssh2/tests/test_hostkey.c @@ -4,7 +4,7 @@ #include -const char *EXPECTED_HOSTKEY = +static const char *EXPECTED_RSA_HOSTKEY = "AAAAB3NzaC1yc2EAAAABIwAAAQEArrr/JuJmaZligyfS8vcNur+mWR2ddDQtVdhHzdKU" "UoR6/Om6cvxpe61H1YZO1xCpLUBXmkki4HoNtYOpPB2W4V+8U4BDeVBD5crypEOE1+7B" "Am99fnEDxYIOZq2/jTP0yQmzCpWYS3COyFmkOL7sfX1wQMeW5zQT2WKcxC6FSWbhDqrB" @@ -12,6 +12,10 @@ const char *EXPECTED_HOSTKEY = "i6ELfP3r+q6wdu0P4jWaoo3De1aYxnToV/ldXykpipON4NPamsb6Ph2qlJQKypq7J4iQ" "gkIIbCU1A31+4ExvcIVoxLQw/aTSbw=="; +static const char *EXPECTED_ECDSA_HOSTKEY = + "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC+/syyeKJD9dC2ZH" + "9Q7iJGReR4YM3rUCMsSynkyXojdfSClGCMY7JvWlt30ESjYvxoTfSRGx6WvaqYK/vPoYQ4="; + int test(LIBSSH2_SESSION *session) { int rc; @@ -21,31 +25,36 @@ int test(LIBSSH2_SESSION *session) char *expected_hostkey = NULL; const char *hostkey = libssh2_session_hostkey(session, &len, &type); - if (hostkey == NULL) { + if(hostkey == NULL) { print_last_session_error("libssh2_session_hostkey"); return 1; } - if (type != LIBSSH2_HOSTKEY_TYPE_RSA) { - /* Hostkey configured in docker container is RSA */ - fprintf(stderr, "Wrong type of hostkey\n"); + if(type == LIBSSH2_HOSTKEY_TYPE_ECDSA_256) { + rc = libssh2_base64_decode(session, &expected_hostkey, &expected_len, + EXPECTED_ECDSA_HOSTKEY, strlen(EXPECTED_ECDSA_HOSTKEY)); + } + else if(type == LIBSSH2_HOSTKEY_TYPE_RSA) { + rc = libssh2_base64_decode(session, &expected_hostkey, &expected_len, + EXPECTED_RSA_HOSTKEY, strlen(EXPECTED_RSA_HOSTKEY)); + } + else { + fprintf(stderr, "Unexpected type of hostkey: %i\n", type); return 1; } - rc = libssh2_base64_decode(session, &expected_hostkey, &expected_len, - EXPECTED_HOSTKEY, strlen(EXPECTED_HOSTKEY)); - if (rc != 0) { + if(rc != 0) { print_last_session_error("libssh2_base64_decode"); return 1; } - if (len != expected_len) { + if(len != expected_len) { fprintf(stderr, "Hostkey does not have the expected length %ld != %d\n", - len, expected_len); + (unsigned long)len, expected_len); return 1; } - if (memcmp(hostkey, expected_hostkey, len) != 0) { + if(memcmp(hostkey, expected_hostkey, len) != 0) { fprintf(stderr, "Hostkeys do not match\n"); return 1; } diff --git a/vendor/libssh2/tests/test_hostkey_hash.c b/vendor/libssh2/tests/test_hostkey_hash.c index 6fb78d9e2..0576120b4 100644 --- a/vendor/libssh2/tests/test_hostkey_hash.c +++ b/vendor/libssh2/tests/test_hostkey_hash.c @@ -5,7 +5,7 @@ #include -const char *EXPECTED_HOSTKEY = +static const char *EXPECTED_RSA_HOSTKEY = "AAAAB3NzaC1yc2EAAAABIwAAAQEArrr/JuJmaZligyfS8vcNur+mWR2ddDQtVdhHzdKU" "UoR6/Om6cvxpe61H1YZO1xCpLUBXmkki4HoNtYOpPB2W4V+8U4BDeVBD5crypEOE1+7B" "Am99fnEDxYIOZq2/jTP0yQmzCpWYS3COyFmkOL7sfX1wQMeW5zQT2WKcxC6FSWbhDqrB" @@ -13,13 +13,27 @@ const char *EXPECTED_HOSTKEY = "i6ELfP3r+q6wdu0P4jWaoo3De1aYxnToV/ldXykpipON4NPamsb6Ph2qlJQKypq7J4iQ" "gkIIbCU1A31+4ExvcIVoxLQw/aTSbw=="; -const char *EXPECTED_MD5_HASH_DIGEST = "0C0ED1A5BB10275F76924CE187CE5C5E"; +static const char *EXPECTED_ECDSA_HOSTKEY = + "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC+/syyeKJD9dC2ZH" + "9Q7iJGReR4YM3rUCMsSynkyXojdfSClGCMY7JvWlt30ESjYvxoTfSRGx6WvaqYK/vPoYQ4="; -const char *EXPECTED_SHA1_HASH_DIGEST = +static const char *EXPECTED_RSA_MD5_HASH_DIGEST = "0C0ED1A5BB10275F76924CE187CE5C5E"; + +static const char *EXPECTED_RSA_SHA1_HASH_DIGEST = "F3CD59E2913F4422B80F7B0A82B2B89EAE449387"; -const int MD5_HASH_SIZE = 16; -const int SHA1_HASH_SIZE = 20; +static const char *EXPECTED_RSA_SHA256_HASH_DIGEST = "92E3DA49DF3C7F99A828F505ED8239397A5D1F62914459760F878F7510F563A3"; + +static const char *EXPECTED_ECDSA_MD5_HASH_DIGEST = "0402E4D897580BBC911379CBD88BCD3D"; + +static const char *EXPECTED_ECDSA_SHA1_HASH_DIGEST = + "12FDAD1E3B31B10BABB00F2A8D1B9A62C326BD2F"; + +static const char *EXPECTED_ECDSA_SHA256_HASH_DIGEST = "56FCD975B166C3F0342D0036E44C311A86C0EAE40713B53FC776369BAE7F5264"; + +static const int MD5_HASH_SIZE = 16; +static const int SHA1_HASH_SIZE = 20; +static const int SHA256_HASH_SIZE = 32; static void calculate_digest(const char *hash, size_t hash_len, char *buffer, size_t buffer_len) @@ -28,7 +42,7 @@ static void calculate_digest(const char *hash, size_t hash_len, char *buffer, char *p = buffer; char *end = buffer + buffer_len; - for (i = 0; i < hash_len && p < end; ++i) { + for(i = 0; i < hash_len && p < end; ++i) { p += snprintf(p, end - p, "%02X", (unsigned char)hash[i]); } } @@ -39,34 +53,117 @@ int test(LIBSSH2_SESSION *session) const char *md5_hash; const char *sha1_hash; + const char *sha256_hash; + int type; + size_t len; + + /* these are the host keys under test, they are currently unused */ + (void)EXPECTED_RSA_HOSTKEY; + (void)EXPECTED_ECDSA_HOSTKEY; - md5_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5); - if (md5_hash == NULL) { - print_last_session_error( - "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_MD5)"); + const char *hostkey = libssh2_session_hostkey(session, &len, &type); + if(hostkey == NULL) { + print_last_session_error("libssh2_session_hostkey"); return 1; } - calculate_digest(md5_hash, MD5_HASH_SIZE, buf, BUFSIZ); + if(type == LIBSSH2_HOSTKEY_TYPE_ECDSA_256) { + + md5_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5); + if(md5_hash == NULL) { + print_last_session_error( + "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_MD5)"); + return 1; + } + + calculate_digest(md5_hash, MD5_HASH_SIZE, buf, BUFSIZ); + + if(strcmp(buf, EXPECTED_ECDSA_MD5_HASH_DIGEST) != 0) { + fprintf(stderr, "ECDSA MD5 hash not as expected - digest %s != %s\n", buf, + EXPECTED_ECDSA_MD5_HASH_DIGEST); + return 1; + } + + sha1_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); + if(sha1_hash == NULL) { + print_last_session_error( + "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA1)"); + return 1; + } + + calculate_digest(sha1_hash, SHA1_HASH_SIZE, buf, BUFSIZ); + + if(strcmp(buf, EXPECTED_ECDSA_SHA1_HASH_DIGEST) != 0) { + fprintf(stderr, "ECDSA SHA1 hash not as expected - digest %s != %s\n", buf, + EXPECTED_ECDSA_SHA1_HASH_DIGEST); + return 1; + } + + sha256_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256); + if(sha256_hash == NULL) { + print_last_session_error( + "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA256)"); + return 1; + } + + calculate_digest(sha256_hash, SHA256_HASH_SIZE, buf, BUFSIZ); + + if(strcmp(buf, EXPECTED_ECDSA_SHA256_HASH_DIGEST) != 0) { + fprintf(stderr, "ECDSA SHA256 hash not as expected - digest %s != %s\n", buf, + EXPECTED_ECDSA_SHA256_HASH_DIGEST); + return 1; + } - if (strcmp(buf, EXPECTED_MD5_HASH_DIGEST) != 0) { - fprintf(stderr, "MD5 hash not as expected - digest %s != %s\n", buf, - EXPECTED_MD5_HASH_DIGEST); - return 1; } - - sha1_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); - if (sha1_hash == NULL) { - print_last_session_error( - "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA1)"); - return 1; + else if(type == LIBSSH2_HOSTKEY_TYPE_RSA) { + + md5_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5); + if(md5_hash == NULL) { + print_last_session_error( + "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_MD5)"); + return 1; + } + + calculate_digest(md5_hash, MD5_HASH_SIZE, buf, BUFSIZ); + + if(strcmp(buf, EXPECTED_RSA_MD5_HASH_DIGEST) != 0) { + fprintf(stderr, "MD5 hash not as expected - digest %s != %s\n", buf, + EXPECTED_RSA_MD5_HASH_DIGEST); + return 1; + } + + sha1_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); + if(sha1_hash == NULL) { + print_last_session_error( + "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA1)"); + return 1; + } + + calculate_digest(sha1_hash, SHA1_HASH_SIZE, buf, BUFSIZ); + + if(strcmp(buf, EXPECTED_RSA_SHA1_HASH_DIGEST) != 0) { + fprintf(stderr, "SHA1 hash not as expected - digest %s != %s\n", buf, + EXPECTED_RSA_SHA1_HASH_DIGEST); + return 1; + } + + sha256_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256); + if(sha256_hash == NULL) { + print_last_session_error( + "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA256)"); + return 1; + } + + calculate_digest(sha256_hash, SHA256_HASH_SIZE, buf, BUFSIZ); + + if(strcmp(buf, EXPECTED_RSA_SHA256_HASH_DIGEST) != 0) { + fprintf(stderr, "SHA256 hash not as expected - digest %s != %s\n", buf, + EXPECTED_RSA_SHA256_HASH_DIGEST); + return 1; + } } - - calculate_digest(sha1_hash, SHA1_HASH_SIZE, buf, BUFSIZ); - - if (strcmp(buf, EXPECTED_SHA1_HASH_DIGEST) != 0) { - fprintf(stderr, "SHA1 hash not as expected - digest %s != %s\n", buf, - EXPECTED_SHA1_HASH_DIGEST); + else { + fprintf(stderr, "Unexpected type of hostkey: %i\n", type); return 1; } diff --git a/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c b/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c index beb6608ee..995d9f1d3 100644 --- a/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c +++ b/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c @@ -4,8 +4,8 @@ #include -const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -const char *WRONG_PASSWORD = "i'm not the password"; +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *WRONG_PASSWORD = "i'm not the password"; static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, @@ -18,12 +18,12 @@ static void kbd_callback(const char *name, int name_len, (void)abstract; fprintf(stdout, "Kb-int name: %.*s\n", name_len, name); fprintf(stdout, "Kb-int instruction: %.*s\n", instruction_len, instruction); - for (i = 0; i < num_prompts; ++i) { + for(i = 0; i < num_prompts; ++i) { fprintf(stdout, "Kb-int prompt %d: %.*s\n", i, prompts[i].length, prompts[i].text); } - if (num_prompts == 1) { + if(num_prompts == 1) { responses[0].text = strdup(WRONG_PASSWORD); responses[0].length = strlen(WRONG_PASSWORD); } @@ -35,12 +35,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "keyboard-interactive") == NULL) { + if(strstr(userauth_list, "keyboard-interactive") == NULL) { fprintf(stderr, "'keyboard-interactive' was expected in userauth list: %s\n", userauth_list); @@ -49,7 +49,7 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_keyboard_interactive_ex( session, USERNAME, strlen(USERNAME), kbd_callback); - if (rc == 0) { + if(rc == 0) { fprintf(stderr, "Keyboard-interactive auth succeeded with wrong response\n"); return 1; diff --git a/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c b/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c index aec1dd496..06b9e68c7 100644 --- a/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c +++ b/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c @@ -4,8 +4,8 @@ #include -const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -const char *PASSWORD = "my test password"; /* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *PASSWORD = "my test password"; /* configured in Dockerfile */ static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, @@ -19,12 +19,12 @@ static void kbd_callback(const char *name, int name_len, fprintf(stdout, "Kb-int name: %.*s\n", name_len, name); fprintf(stdout, "Kb-int instruction: %.*s\n", instruction_len, instruction); - for (i = 0; i < num_prompts; ++i) { + for(i = 0; i < num_prompts; ++i) { fprintf(stdout, "Kb-int prompt %d: %.*s\n", i, prompts[i].length, prompts[i].text); } - if (num_prompts == 1) { + if(num_prompts == 1) { responses[0].text = strdup(PASSWORD); responses[0].length = strlen(PASSWORD); } @@ -36,12 +36,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "keyboard-interactive") == NULL) { + if(strstr(userauth_list, "keyboard-interactive") == NULL) { fprintf(stderr, "'keyboard-interactive' was expected in userauth list: %s\n", userauth_list); @@ -50,7 +50,7 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_keyboard_interactive_ex( session, USERNAME, strlen(USERNAME), kbd_callback); - if (rc != 0) { + if(rc != 0) { print_last_session_error("libssh2_userauth_keyboard_interactive_ex"); return 1; } diff --git a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c index dc65c1320..af906df40 100644 --- a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c +++ b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c @@ -4,8 +4,8 @@ #include -const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -const char *WRONG_PASSWORD = "i'm not the password"; +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *WRONG_PASSWORD = "i'm not the password"; int test(LIBSSH2_SESSION *session) { @@ -13,12 +13,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "password") == NULL) { + if(strstr(userauth_list, "password") == NULL) { fprintf(stderr, "'password' was expected in userauth list: %s\n", userauth_list); return 1; @@ -27,7 +27,7 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_password_ex(session, USERNAME, strlen(USERNAME), WRONG_PASSWORD, strlen(WRONG_PASSWORD), NULL); - if (rc == 0) { + if(rc == 0) { fprintf(stderr, "Password auth succeeded with wrong password\n"); return 1; } diff --git a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c index 6ea27d42e..81df36f39 100644 --- a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c +++ b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c @@ -4,8 +4,8 @@ #include -const char *PASSWORD = "my test password"; /* configured in Dockerfile */ -const char *WRONG_USERNAME = "i dont exist"; +static const char *PASSWORD = "my test password"; /* configured in Dockerfile */ +static const char *WRONG_USERNAME = "i dont exist"; int test(LIBSSH2_SESSION *session) { @@ -13,12 +13,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, WRONG_USERNAME, strlen(WRONG_USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "password") == NULL) { + if(strstr(userauth_list, "password") == NULL) { fprintf(stderr, "'password' was expected in userauth list: %s\n", userauth_list); return 1; @@ -27,7 +27,7 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_password_ex(session, WRONG_USERNAME, strlen(WRONG_USERNAME), PASSWORD, strlen(PASSWORD), NULL); - if (rc == 0) { + if(rc == 0) { fprintf(stderr, "Password auth succeeded with wrong username\n"); return 1; } diff --git a/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c b/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c index aaf9c2a38..f39e6d6a5 100644 --- a/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c +++ b/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c @@ -4,8 +4,8 @@ #include -const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -const char *PASSWORD = "my test password"; /* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *PASSWORD = "my test password"; /* configured in Dockerfile */ int test(LIBSSH2_SESSION *session) { @@ -13,12 +13,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "password") == NULL) { + if(strstr(userauth_list, "password") == NULL) { fprintf(stderr, "'password' was expected in userauth list: %s\n", userauth_list); return 1; @@ -26,12 +26,12 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_password_ex(session, USERNAME, strlen(USERNAME), PASSWORD, strlen(PASSWORD), NULL); - if (rc != 0) { + if(rc != 0) { print_last_session_error("libssh2_userauth_password_ex"); return 1; } - if (libssh2_userauth_authenticated(session) == 0) { + if(libssh2_userauth_authenticated(session) == 0) { fprintf(stderr, "Password auth appeared to succeed but " "libssh2_userauth_authenticated returned 0\n"); return 1; diff --git a/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c b/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c index 6e12abf4e..4da7068b7 100644 --- a/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c @@ -4,9 +4,9 @@ #include -const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -const char *KEY_FILE_PRIVATE = "key_dsa_wrong"; -const char *KEY_FILE_PUBLIC = "key_dsa_wrong.pub"; +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *KEY_FILE_PRIVATE = "key_dsa_wrong"; +static const char *KEY_FILE_PUBLIC = "key_dsa_wrong.pub"; int test(LIBSSH2_SESSION *session) { @@ -14,12 +14,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "publickey") == NULL) { + if(strstr(userauth_list, "publickey") == NULL) { fprintf(stderr, "'publickey' was expected in userauth list: %s\n", userauth_list); return 1; @@ -28,7 +28,7 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_publickey_fromfile_ex( session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, NULL); - if (rc == 0) { + if(rc == 0) { fprintf(stderr, "Public-key auth succeeded with wrong key\n"); return 1; } diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c index 4e5b46d04..46bcc26ab 100644 --- a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c @@ -4,9 +4,9 @@ #include -const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -const char *KEY_FILE_PRIVATE = "key_dsa"; -const char *KEY_FILE_PUBLIC = "key_dsa.pub"; /* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *KEY_FILE_PRIVATE = "key_dsa"; +static const char *KEY_FILE_PUBLIC = "key_dsa.pub"; /* configured in Dockerfile */ int test(LIBSSH2_SESSION *session) { @@ -14,12 +14,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "publickey") == NULL) { + if(strstr(userauth_list, "publickey") == NULL) { fprintf(stderr, "'publickey' was expected in userauth list: %s\n", userauth_list); return 1; @@ -28,7 +28,7 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_publickey_fromfile_ex( session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, NULL); - if (rc != 0) { + if(rc != 0) { print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); return 1; } diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c new file mode 100644 index 000000000..6b9451359 --- /dev/null +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c @@ -0,0 +1,38 @@ +#include "session_fixture.h" + +#include + +#include + +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *PASSWORD = "libssh2"; +static const char *KEY_FILE_PRIVATE = "key_rsa_encrypted"; +static const char *KEY_FILE_PUBLIC = "key_rsa_encrypted.pub"; /* configured in Dockerfile */ + +int test(LIBSSH2_SESSION *session) +{ + int rc; + + const char *userauth_list = + libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + rc = libssh2_userauth_publickey_fromfile_ex( + session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, + PASSWORD); + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + return 0; +} diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c index b02a6425d..d9e87c613 100644 --- a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c @@ -4,9 +4,9 @@ #include -const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -const char *KEY_FILE_PRIVATE = "key_rsa"; -const char *KEY_FILE_PUBLIC = "key_rsa.pub"; /* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *KEY_FILE_PRIVATE = "key_rsa"; +static const char *KEY_FILE_PUBLIC = "key_rsa.pub"; /* configured in Dockerfile */ int test(LIBSSH2_SESSION *session) { @@ -14,12 +14,12 @@ int test(LIBSSH2_SESSION *session) const char *userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); - if (userauth_list == NULL) { + if(userauth_list == NULL) { print_last_session_error("libssh2_userauth_list"); return 1; } - if (strstr(userauth_list, "publickey") == NULL) { + if(strstr(userauth_list, "publickey") == NULL) { fprintf(stderr, "'publickey' was expected in userauth list: %s\n", userauth_list); return 1; @@ -28,7 +28,7 @@ int test(LIBSSH2_SESSION *session) rc = libssh2_userauth_publickey_fromfile_ex( session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, NULL); - if (rc != 0) { + if(rc != 0) { print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); return 1; } diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c new file mode 100644 index 000000000..e7fd7373e --- /dev/null +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c @@ -0,0 +1,37 @@ +#include "session_fixture.h" + +#include + +#include + +static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *KEY_FILE_PRIVATE = "key_rsa_openssh"; +static const char *KEY_FILE_PUBLIC = "key_rsa_openssh.pub"; /* configured in Dockerfile */ + +int test(LIBSSH2_SESSION *session) +{ + int rc; + + const char *userauth_list = + libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + rc = libssh2_userauth_publickey_fromfile_ex( + session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, + NULL); + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + return 0; +} diff --git a/vendor/libssh2/win32/GNUmakefile b/vendor/libssh2/win32/GNUmakefile index 86857513c..0971d891c 100644 --- a/vendor/libssh2/win32/GNUmakefile +++ b/vendor/libssh2/win32/GNUmakefile @@ -86,11 +86,26 @@ CAT = type ECHONL = $(ComSpec) /c echo. endif +ifeq ($(LIBSSH2_CC),) +LIBSSH2_CC := $(CROSSPREFIX)gcc +endif +ifeq ($(LIBSSH2_AR),) +LIBSSH2_AR := $(CROSSPREFIX)ar +endif +ifeq ($(LIBSSH2_RANLIB),) +LIBSSH2_RANLIB := $(CROSSPREFIX)ranlib +endif +ifeq ($(LIBSSH2_DLL_A_SUFFIX),) +LIBSSH2_DLL_A_SUFFIX := dll +endif + +libssh2_dll_LIBRARY = $(TARGET)$(LIBSSH2_DLL_SUFFIX).dll + # The following line defines your compiler. ifdef METROWERKS CC = mwcc else - CC = $(CROSSPREFIX)gcc + CC = $(LIBSSH2_CC) endif # Set environment var ARCH to your architecture to override autodetection. @@ -110,7 +125,7 @@ endif -include $(OBJDIR)/version.inc # Global flags for all compilers -CFLAGS = $(LIBSSH2_CFLAG_EXTRAS) $(OPT) -D$(DB) -DLIBSSH2_WIN32 # -DHAVE_CONFIG_H +CFLAGS = $(LIBSSH2_CFLAG_EXTRAS) $(OPT) -D$(DB) -DLIBSSH2_WIN32 -DHAVE_WINDOWS_H # -DHAVE_CONFIG_H LDFLAGS = $(LIBSSH2_LDFLAG_EXTRAS) ifeq ($(CC),mwcc) @@ -128,13 +143,13 @@ CFLAGS += -nostdinc -gccinc -msgstyle gcc -inline off -opt nointrinsics -proc 58 CFLAGS += -ir "$(METROWERKS)/MSL" -ir "$(METROWERKS)/Win32-x86 Support" CFLAGS += -w on,nounused,nounusedexpr # -ansi strict else -LD = $(CROSSPREFIX)gcc -RC = $(CROSSPREFIX)windres -LDFLAGS += -s -shared -Wl,--output-def,$(TARGET).def,--out-implib,$(TARGET)dll.a -AR = $(CROSSPREFIX)ar -ARFLAGS = -cq LIBEXT = a -RANLIB = $(CROSSPREFIX)ranlib +LD = $(LIBSSH2_CC) +RC = $(CROSSPREFIX)windres +LDFLAGS += -s -shared -Wl,--output-def,$(libssh2_dll_LIBRARY:.dll=.def),--out-implib,$(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT) +AR = $(LIBSSH2_AR) +ARFLAGS = cru +RANLIB = $(LIBSSH2_RANLIB) RCFLAGS = -I $(PROOT)/include -O coff CFLAGS += -fno-builtin CFLAGS += -fno-strict-aliasing @@ -223,7 +238,7 @@ OBJL = $(OBJS) $(OBJDIR)/$(TARGET).res all: lib dll -dll: prebuild $(TARGET).dll +dll: prebuild $(libssh2_dll_LIBRARY) lib: prebuild $(TARGET).$(LIBEXT) @@ -248,7 +263,7 @@ dist: all $(DISTDIR) $(DISTDIR)/readme.txt @$(call COPY, $(PROOT)/INSTALL, $(DISTDIR)) @$(call COPY, $(PROOT)/README, $(DISTDIR)) @$(call COPY, $(PROOT)/RELEASE-NOTES, $(DISTDIR)) - @$(call COPY, $(TARGET).dll, $(DISTDIR)/bin) + @$(call COPY, $(libssh2_dll_LIBRARY), $(DISTDIR)/bin) @echo Creating $(DISTARC) @$(ZIP) $(DISTARC) $(DISTDIR)/* < $(DISTDIR)/readme.txt @@ -261,7 +276,7 @@ dev: all $(DEVLDIR) $(DEVLDIR)/readme.txt @$(call COPY, $(PROOT)/INSTALL, $(DEVLDIR)) @$(call COPY, $(PROOT)/README, $(DEVLDIR)) @$(call COPY, $(PROOT)/RELEASE-NOTES, $(DEVLDIR)) - @$(call COPY, $(TARGET).dll, $(DEVLDIR)/bin) + @$(call COPY, $(libssh2_dll_LIBRARY), $(DEVLDIR)/bin) @$(call COPY, $(PROOT)/include/*.h, $(DEVLDIR)/include) @$(call COPY, libssh2_config.h, $(DEVLDIR)/include) @$(call COPY, *.$(LIBEXT), $(DEVLDIR)/win32) @@ -284,7 +299,7 @@ testclean: clean clean: # $(call DEL, libssh2_config.h) - $(call DEL, $(TARGET).dll $(TARGET).def $(TARGET).$(LIBEXT) $(TARGET)dll.$(LIBEXT)) + $(call DEL, $(libssh2_dll_LIBRARY) $(libssh2_dll_LIBRARY:.dll=.def) $(TARGET).$(LIBEXT) $(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT)) $(call RMDIR, $(OBJDIR)) $(OBJDIR): @@ -304,7 +319,7 @@ ifdef RANLIB @$(RANLIB) $@ endif -$(TARGET).dll $(TARGET)dll.a: $(OBJL) +$(libssh2_dll_LIBRARY) $(TARGET)$(LIBSSH2_DLL_A_SUFFIX).$(LIBEXT): $(OBJL) @echo Linking $@ @$(call DEL, $@) @$(LD) $(LDFLAGS) $^ -o $@ $(LIBPATH) $(LDLIBS) diff --git a/vendor/libssh2/win32/libssh2.dsp b/vendor/libssh2/win32/libssh2.dsp index eac2b82b1..42a51b949 100644 --- a/vendor/libssh2/win32/libssh2.dsp +++ b/vendor/libssh2/win32/libssh2.dsp @@ -263,6 +263,14 @@ SOURCE=..\src\agent.c # End Source File # Begin Source File +SOURCE=..\src\bcrypt_pbkdf.c +# End Source File +# Begin Source File + +SOURCE=..\src\blowfish.c +# End Source File +# Begin Source File + SOURCE=..\src\channel.c # End Source File # Begin Source File @@ -355,6 +363,10 @@ SOURCE=..\src\wincng.c # PROP Default_Filter "h;hpp;hxx" # Begin Source File +SOURCE=..\src\blf.h +# End Source File +# Begin Source File + SOURCE=..\src\channel.h # End Source File # Begin Source File From 95e0518c0fbf810695ee2ebaa8c454811fc12589 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 6 Sep 2019 15:35:50 -0700 Subject: [PATCH 160/545] GitRemote upload and updateTips are async --- generate/input/descriptor.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index b61702214..4bc158793 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3297,6 +3297,18 @@ "return": { "ownedByThis": true } + }, + "git_remote_update_tips": { + "isAsync": true, + "return": { + "isErrorCode": true + } + }, + "git_remote_upload": { + "isAsync": true, + "return": { + "isErrorCode": true + } } } }, From b6e5fac3430d226856c7dba52482bd25b3ea3be5 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 9 Sep 2019 07:22:54 -0700 Subject: [PATCH 161/545] In testing, retry npm install because of unsolved race condition --- .github/workflows/tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6d516db9a..38b2b42fa 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -46,7 +46,8 @@ jobs: CXX: clang++ npm_config_clang: 1 GYP_DEFINES: use_obsolete_asm=true - run: npm install + # There is a race condition in node/generate that needs to be fixed + run: node utils/retry npm install - name: Test run: | From 3699ee95f2294207f835e46080ad91b73c0c5581 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 9 Sep 2019 07:26:09 -0700 Subject: [PATCH 162/545] Bump to v0.26.0 --- CHANGELOG.md | 13 +++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25834346d..1a90e44a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## v0.26.0 [(2019-09-09)](https://github.com/nodegit/nodegit/releases/tag/v0.26.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.1...v0.26.0) + +#### Summary of changes +- Bumped libssh2 to 1.9 for security patch +- Remote.prototype.upload and Remote.prototype.updateTips should be async now + +#### Merged PRs into NodeGit +- [GitRemote upload and updateTips are async #1720](https://github.com/nodegit/nodegit/pull/1720) +- [Update libssh2 to 1.9 #1719](https://github.com/nodegit/nodegit/pull/1719) + + ## v0.25.1 [(2019-08-13)](https://github.com/nodegit/nodegit/releases/tag/v0.25.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.0...v0.25.1) diff --git a/package-lock.json b/package-lock.json index a5c2bbf88..cbc8781c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.25.1", + "version": "0.26.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6492e7f64..49fa0de8d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.25.1", + "version": "0.26.0", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 0228707e0b38cdbada2edf8cfeb35ed22704072e Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 9 Sep 2019 07:45:38 -0700 Subject: [PATCH 163/545] Enable builds on tags --- .github/workflows/tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 38b2b42fa..ca23b9126 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -57,7 +57,7 @@ jobs: node utils/retry npm test - name: Deploy - if: startsWith(github.ref, 'refs/tags/test-v') + if: startsWith(github.ref, 'refs/tags/v') env: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} @@ -107,19 +107,19 @@ jobs: # but it's not, because the CI runner for windows doesn't wait for each step as listed here # and it treats each additional step past the first as an orphaned process. - name: Deploy (Dependencies) - if: startsWith(github.ref, 'refs/tags/test-v') + if: startsWith(github.ref, 'refs/tags/v') run: npm install -g node-pre-gyp aws-sdk - name: Deploy (Clean) - if: startsWith(github.ref, 'refs/tags/test-v') + if: startsWith(github.ref, 'refs/tags/v') run: node lifecycleScripts\clean - name: Deploy (Package) - if: startsWith(github.ref, 'refs/tags/test-v') + if: startsWith(github.ref, 'refs/tags/v') run: node-pre-gyp package - name: Deploy (Publish) - if: startsWith(github.ref, 'refs/tags/test-v') + if: startsWith(github.ref, 'refs/tags/v') env: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} From cd55298875243de30b66dbacfe812610ef73b590 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 13 Sep 2019 12:00:35 -0700 Subject: [PATCH 164/545] updateTips: optional param and normalizeOptions --- generate/input/descriptor.json | 5 +++++ lib/remote.js | 36 +++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 4bc158793..b50384f57 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3300,6 +3300,11 @@ }, "git_remote_update_tips": { "isAsync": true, + "args": { + "reflog_message": { + "isOptional": true + } + }, "return": { "isErrorCode": true } diff --git a/lib/remote.js b/lib/remote.js index 510ce9b8b..258aaf467 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -11,6 +11,7 @@ var _createWithOpts = Remote.createWithOpts; var _download = Remote.prototype.download; var _fetch = Remote.prototype.fetch; var _push = Remote.prototype.push; +var _updateTips = Remote.prototype.updateTips; var _upload = Remote.prototype.upload; /** @@ -146,6 +147,40 @@ Remote.prototype.fetch = function(refspecs, opts, reflog_message) { .call(this, refspecs, normalizeFetchOptions(opts), reflog_message); }; +/** + * Update the tips to the new state + * @param {RemoteCallbacks} callbacks The callback functions for the connection + * @param {boolean} updateFetchhead whether to write to FETCH_HEAD. Pass true + * to behave like git. + * @param {boolean} downloadTags what the behaviour for downloading tags is + * for this fetch. This is ignored for push. + * This must be the same value passed to + * Remote.prototype.download + * @param {string} reflogMessage The message to insert into the reflogs. If + * null and fetching, the default is "fetch ", + * where is the name of the remote (or its url, + * for in-memory remotes). This parameter is + * ignored when pushing. + */ +Remote.prototype.updateTips = function( + callbacks, + updateFetchhead, + downloadTags, + reflogMessage +) { + if (callbacks) { + callbacks = normalizeOptions(callbacks, NodeGit.RemoteCallbacks); + } + + return _updateTips.call( + this, + callbacks, + updateFetchhead, + downloadTags, + reflogMessage + ); +}; + /** * Pushes to a remote * @@ -184,7 +219,6 @@ Remote.prototype.upload = function(refSpecs, opts) { return _upload.call(this, refSpecs, opts); }; - NodeGit.Remote.COMPLETION_TYPE = {}; var DEPRECATED_STATES = { COMPLETION_DOWNLOAD: "DOWNLOAD", From 0ff64700a7e5234a55b6aa50c8ca58020bd60108 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 13 Sep 2019 16:01:37 -0700 Subject: [PATCH 165/545] Bump libgit2 to latest fork of master --- generate/input/descriptor.json | 44 + generate/input/libgit2-docs.json | 1063 +++++++++++++----------- generate/input/libgit2-supplement.json | 16 + lib/blob.js | 31 + test/tests/blob.js | 182 +++- vendor/libgit2 | 2 +- 6 files changed, 871 insertions(+), 467 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index b50384f57..5aaf5d0d9 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -4,6 +4,19 @@ "JsName": "STATES", "isMask": false }, + "blob_filter_flag": { + "values": { + "GIT_BLOB_FILTER_CHECK_FOR_BINARY": { + "JsName": "CHECK_FOR_BINARY" + }, + "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES": { + "JsName": "NO_SYSTEM_ATTRIBUTES" + }, + "GIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD": { + "JsName": "ATTTRIBUTES_FROM_HEAD" + } + } + }, "branch": { "JsName": "BRANCH", "isMask": false @@ -249,6 +262,34 @@ "git_blob_create_from_stream_commit": { "ignore": true }, + "git_blob_filter": { + "isAsync": true, + "isPrototypeMethod": true, + "args": { + "out": { + "isReturn": true, + "cppClassName": "GitBuf", + "jsClassName": "Buffer", + "shouldAlloc": true + }, + "blob": { + "cppClassName": "GitBlob", + "jsClassName": "Blob", + "isSelf": true + }, + "as_path": { + "cppClassName": "String", + "jsClassName": "String", + "cType": "const char *" + }, + "opts": { + "isOptional": true + } + }, + "return": { + "isErrorCode": true + } + }, "git_blob_filtered_content": { "isAsync": true, "isPrototypeMethod": false, @@ -300,6 +341,9 @@ "node_buffer.h" ] }, + "blob_filter_options": { + "hasConstructor": true + }, "branch": { "functions": { "git_branch_create": { diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index b4f82110a..c84ff31ba 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -37,7 +37,7 @@ "git_attr_add_macro" ], "meta": {}, - "lines": 251 + "lines": 258 }, { "file": "git2/blame.h", @@ -63,7 +63,7 @@ "git_blob_owner", "git_blob_rawcontent", "git_blob_rawsize", - "git_blob_filtered_content", + "git_blob_filter", "git_blob_create_from_workdir", "git_blob_create_from_disk", "git_blob_create_from_stream", @@ -73,7 +73,7 @@ "git_blob_dup" ], "meta": {}, - "lines": 228 + "lines": 260 }, { "file": "git2/branch.h", @@ -257,6 +257,7 @@ "file": "git2/deprecated.h", "functions": [ "git_blob_create_fromworkdir", + "git_blob_filtered_content", "git_buf_free", "giterr_last", "giterr_clear", @@ -268,7 +269,7 @@ "git_blame_init_options" ], "meta": {}, - "lines": 449 + "lines": 456 }, { "file": "git2/describe.h", @@ -355,7 +356,7 @@ "git_filter_list_free" ], "meta": {}, - "lines": 210 + "lines": 218 }, { "file": "git2/global.h", @@ -1595,8 +1596,8 @@ "git_attr_get": { "type": "function", "file": "git2/attr.h", - "line": 145, - "lineto": 150, + "line": 152, + "lineto": 157, "args": [ { "name": "value_out", @@ -1637,8 +1638,8 @@ "git_attr_get_many": { "type": "function", "file": "git2/attr.h", - "line": 181, - "lineto": 187, + "line": 188, + "lineto": 194, "args": [ { "name": "values_out", @@ -1684,8 +1685,8 @@ "git_attr_foreach": { "type": "function", "file": "git2/attr.h", - "line": 220, - "lineto": 225, + "line": 227, + "lineto": 232, "args": [ { "name": "repo", @@ -1726,8 +1727,8 @@ "git_attr_cache_flush": { "type": "function", "file": "git2/attr.h", - "line": 235, - "lineto": 236, + "line": 242, + "lineto": 243, "args": [ { "name": "repo", @@ -1748,8 +1749,8 @@ "git_attr_add_macro": { "type": "function", "file": "git2/attr.h", - "line": 248, - "lineto": 251, + "line": 255, + "lineto": 258, "args": [ { "name": "repo", @@ -2211,46 +2212,46 @@ }, "git_blob_filtered_content": { "type": "function", - "file": "git2/blob.h", - "line": 122, - "lineto": 126, + "file": "git2/deprecated.h", + "line": 94, + "lineto": 98, "args": [ { "name": "out", "type": "git_buf *", - "comment": "The git_buf to be filled in" + "comment": null }, { "name": "blob", "type": "git_blob *", - "comment": "Pointer to the blob" + "comment": null }, { "name": "as_path", "type": "const char *", - "comment": "Path used for file attribute lookups, etc." + "comment": null }, { "name": "check_for_binary_data", "type": "int", - "comment": "Should this test if blob content contains\n NUL bytes / looks like binary data before applying filters?" + "comment": null } ], "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", "sig": "git_buf *::git_blob *::const char *::int", "return": { "type": "int", - "comment": " 0 on success or an error code" + "comment": null }, - "description": "

Get a buffer with the filtered content of a blob.

\n", - "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", + "description": "

Deprecated in favor of

\n", + "comments": "", "group": "blob" }, "git_blob_create_from_workdir": { "type": "function", "file": "git2/blob.h", - "line": 139, - "lineto": 139, + "line": 171, + "lineto": 171, "args": [ { "name": "id", @@ -2281,8 +2282,8 @@ "git_blob_create_from_disk": { "type": "function", "file": "git2/blob.h", - "line": 151, - "lineto": 151, + "line": 183, + "lineto": 183, "args": [ { "name": "id", @@ -2313,8 +2314,8 @@ "git_blob_create_from_stream": { "type": "function", "file": "git2/blob.h", - "line": 178, - "lineto": 181, + "line": 210, + "lineto": 213, "args": [ { "name": "out", @@ -2345,8 +2346,8 @@ "git_blob_create_from_stream_commit": { "type": "function", "file": "git2/blob.h", - "line": 192, - "lineto": 194, + "line": 224, + "lineto": 226, "args": [ { "name": "out", @@ -2372,8 +2373,8 @@ "git_blob_create_from_buffer": { "type": "function", "file": "git2/blob.h", - "line": 205, - "lineto": 206, + "line": 237, + "lineto": 238, "args": [ { "name": "id", @@ -2409,8 +2410,8 @@ "git_blob_is_binary": { "type": "function", "file": "git2/blob.h", - "line": 219, - "lineto": 219, + "line": 251, + "lineto": 251, "args": [ { "name": "blob", @@ -2431,8 +2432,8 @@ "git_blob_dup": { "type": "function", "file": "git2/blob.h", - "line": 228, - "lineto": 228, + "line": 260, + "lineto": 260, "args": [ { "name": "out", @@ -5958,8 +5959,8 @@ "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 116, - "lineto": 116, + "line": 123, + "lineto": 123, "args": [ { "name": "buffer", @@ -5980,8 +5981,8 @@ "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 190, - "lineto": 190, + "line": 197, + "lineto": 197, "args": [], "argline": "", "sig": "", @@ -5996,8 +5997,8 @@ "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 202, - "lineto": 202, + "line": 209, + "lineto": 209, "args": [], "argline": "", "sig": "", @@ -6012,8 +6013,8 @@ "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 214, - "lineto": 214, + "line": 221, + "lineto": 221, "args": [ { "name": "error_class", @@ -6039,8 +6040,8 @@ "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 226, - "lineto": 226, + "line": 233, + "lineto": 233, "args": [], "argline": "", "sig": "", @@ -6052,11 +6053,33 @@ "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "giterr" }, + "git_object__size": { + "type": "function", + "file": "git2/deprecated.h", + "line": 323, + "lineto": 323, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to get its size" + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "size_t", + "comment": " size in bytes of the object" + }, + "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", + "comments": "

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.

\n", + "group": "object" + }, "git_oid_iszero": { "type": "function", "file": "git2/deprecated.h", - "line": 390, - "lineto": 390, + "line": 397, + "lineto": 397, "args": [ { "name": "id", @@ -6077,8 +6100,8 @@ "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 449, - "lineto": 449, + "line": 456, + "lineto": 456, "args": [ { "name": "opts", @@ -7640,8 +7663,8 @@ "git_filter_list_load": { "type": "function", "file": "git2/filter.h", - "line": 90, - "lineto": 96, + "line": 98, + "lineto": 104, "args": [ { "name": "filters", @@ -7687,8 +7710,8 @@ "git_filter_list_contains": { "type": "function", "file": "git2/filter.h", - "line": 110, - "lineto": 112, + "line": 118, + "lineto": 120, "args": [ { "name": "filters", @@ -7714,8 +7737,8 @@ "git_filter_list_apply_to_data": { "type": "function", "file": "git2/filter.h", - "line": 134, - "lineto": 137, + "line": 142, + "lineto": 145, "args": [ { "name": "out", @@ -7746,8 +7769,8 @@ "git_filter_list_apply_to_file": { "type": "function", "file": "git2/filter.h", - "line": 148, - "lineto": 152, + "line": 156, + "lineto": 160, "args": [ { "name": "out", @@ -7783,8 +7806,8 @@ "git_filter_list_apply_to_blob": { "type": "function", "file": "git2/filter.h", - "line": 161, - "lineto": 164, + "line": 169, + "lineto": 172, "args": [ { "name": "out", @@ -7815,8 +7838,8 @@ "git_filter_list_stream_data": { "type": "function", "file": "git2/filter.h", - "line": 173, - "lineto": 176, + "line": 181, + "lineto": 184, "args": [ { "name": "filters", @@ -7847,8 +7870,8 @@ "git_filter_list_stream_file": { "type": "function", "file": "git2/filter.h", - "line": 187, - "lineto": 191, + "line": 195, + "lineto": 199, "args": [ { "name": "filters", @@ -7884,8 +7907,8 @@ "git_filter_list_stream_blob": { "type": "function", "file": "git2/filter.h", - "line": 200, - "lineto": 203, + "line": 208, + "lineto": 211, "args": [ { "name": "filters", @@ -7916,8 +7939,8 @@ "git_filter_list_free": { "type": "function", "file": "git2/filter.h", - "line": 210, - "lineto": 210, + "line": 218, + "lineto": 218, "args": [ { "name": "filters", @@ -24783,27 +24806,42 @@ "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", "group": "worktree" }, - "git_object__size": { + "git_blob_filter": { "type": "function", - "file": "git2/deprecated.h", - "line": 316, - "lineto": 316, + "file": "git2/blob.h", + "line": 154, + "lineto": 158, "args": [ { - "name": "type", - "type": "git_object_t", - "comment": "object type to get its size" + "name": "out", + "type": "git_buf *", + "comment": "The git_buf to be filled in" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "Pointer to the blob" + }, + { + "name": "as_path", + "type": "const char *", + "comment": "Path used for file attribute lookups, etc." + }, + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "Options to use for filtering the blob" } ], - "argline": "git_object_t type", - "sig": "git_object_t", + "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", + "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", "return": { - "type": "size_t", - "comment": " size in bytes of the object" + "type": "int", + "comment": " 0 on success or an error code" }, - "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", - "comments": "

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.

\n", - "group": "object" + "description": "

Get a buffer with the filtered content of a blob.

\n", + "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", + "group": "blob" } }, "callbacks": { @@ -24862,8 +24900,8 @@ "git_attr_foreach_cb": { "type": "callback", "file": "git2/attr.h", - "line": 205, - "lineto": 205, + "line": 212, + "lineto": 212, "args": [ { "name": "name", @@ -25075,6 +25113,42 @@ "description": "

The signature of a function matchin git_repository_init, with an\n aditional void * as callback payload.

\n", "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" }, + "git_commit_signing_cb": { + "type": "callback", + "file": "git2/commit.h", + "line": 523, + "lineto": 524, + "args": [ + { + "name": "signature", + "type": "git_buf *", + "comment": null + }, + { + "name": "signature_field", + "type": "git_buf *", + "comment": null + }, + { + "name": "commit_content", + "type": "const char *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", + "sig": "git_buf *::git_buf *::const char *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Commit signing callback.

\n", + "comments": "

The callback will be called with the commit content, giving a user an opportunity to sign the commit content. The signature_field buf may be left empty to specify the default field "gpgsig".

\n\n

Signatures can take the form of any string, and can be created on an arbitrary header field. Signatures are most commonly used for verifying authorship of a commit using GPG or a similar cryptographically secure signing algorithm. See https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work for more details.

\n\n

When the callback: - returns GIT_PASSTHROUGH, no signature will be added to the commit. - returns < 0, commit creation will be aborted. - returns GIT_OK, the signature parameter is expected to be filled.

\n" + }, "git_config_foreach_cb": { "type": "callback", "file": "git2/config.h", @@ -25104,8 +25178,8 @@ "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 435, - "lineto": 435, + "line": 442, + "lineto": 442, "args": [ { "name": "rhead", @@ -26164,42 +26238,6 @@ }, "description": "

Callback for the user's custom certificate checks.

\n", "comments": "" - }, - "git_commit_signing_cb": { - "type": "callback", - "file": "git2/commit.h", - "line": 523, - "lineto": 524, - "args": [ - { - "name": "signature", - "type": "git_buf *", - "comment": null - }, - { - "name": "signature_field", - "type": "git_buf *", - "comment": null - }, - { - "name": "commit_content", - "type": "const char *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", - "sig": "git_buf *::git_buf *::const char *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Commit signing callback.

\n", - "comments": "

The callback will be called with the commit content, giving a user an opportunity to sign the commit content. The signature_field buf may be left empty to specify the default field "gpgsig".

\n\n

Signatures can take the form of any string, and can be created on an arbitrary header field. Signatures are most commonly used for verifying authorship of a commit using GPG or a similar cryptographically secure signing algorithm. See https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work for more details.

\n\n

When the callback: - returns GIT_PASSTHROUGH, no signature will be added to the commit. - returns < 0, commit creation will be aborted. - returns GIT_OK, the signature parameter is expected to be filled.

\n" } }, "globals": {}, @@ -26644,6 +26682,7 @@ "returns": [], "needs": [ "git_blob_dup", + "git_blob_filter", "git_blob_filtered_content", "git_blob_free", "git_blob_id", @@ -26664,6 +26703,84 @@ } } ], + [ + "git_blob_filter_flag_t", + { + "decl": [ + "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD" + ], + "type": "enum", + "file": "git2/blob.h", + "line": 102, + "lineto": 117, + "tdef": "typedef", + "description": " Flags to control the functionality of `git_blob_filter`.", + "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD", + "fields": [ + { + "type": "int", + "name": "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "comments": "

When set, filters will not be applied to binary files.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

When set, filters will not load configuration from the\n system-wide gitattributes in /etc (or system equivalent).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", + "value": 4 + } + ] + } + ], + [ + "git_blob_filter_options", + { + "decl": [ + "int version", + "git_blob_filter_flag_t flags" + ], + "type": "struct", + "file": "git2/blob.h", + "line": 122, + "lineto": 127, + "block": "int version\ngit_blob_filter_flag_t flags", + "tdef": "typedef", + "description": " The options used when applying filter options to a file.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "version", + "comments": "" + }, + { + "type": "git_blob_filter_flag_t", + "name": "flags", + "comments": " Flags to control the filtering process " + } + ], + "used": { + "returns": [], + "needs": [ + "git_blob_filter" + ] + }, + "value": "git_blob_filter_options" + } + ], [ "git_branch_iterator", { @@ -26769,6 +26886,7 @@ "used": { "returns": [], "needs": [ + "git_blob_filter", "git_blob_filtered_content", "git_branch_remote_name", "git_branch_upstream_name", @@ -26825,7 +26943,6 @@ "git_cert_t cert_type" ], "type": "struct", - "value": "git_cert", "file": "git2/types.h", "line": 289, "lineto": 294, @@ -26845,7 +26962,8 @@ "needs": [ "git_transport_certificate_check_cb" ] - } + }, + "value": "git_cert" } ], [ @@ -26858,7 +26976,6 @@ "unsigned char [20] hash_sha1" ], "type": "struct", - "value": "git_cert_hostkey", "file": "git2/transport.h", "line": 39, "lineto": 59, @@ -26891,7 +27008,8 @@ "used": { "returns": [], "needs": [] - } + }, + "value": "git_cert_hostkey" } ], [ @@ -27116,7 +27234,6 @@ "void * perfdata_payload" ], "type": "struct", - "value": "git_checkout_options", "file": "git2/checkout.h", "line": 263, "lineto": 326, @@ -27237,7 +27354,8 @@ "git_reset", "git_reset_from_annotated" ] - } + }, + "value": "git_checkout_options" } ], [ @@ -27519,10 +27637,14 @@ "file": "git2/clone.h", "line": 33, "lineto": 53, - "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", "tdef": "typedef", "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", "fields": [ { "type": "int", @@ -27548,11 +27670,7 @@ "comments": "

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n", "value": 3 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -27575,10 +27693,17 @@ "file": "git2/clone.h", "line": 103, "lineto": 164, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", "tdef": "typedef", "description": " Clone options structure", "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", + "used": { + "returns": [], + "needs": [ + "git_clone", + "git_clone_options_init" + ] + }, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", "fields": [ { "type": "unsigned int", @@ -27630,14 +27755,7 @@ "name": "remote_cb_payload", "comments": " An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL." } - ], - "used": { - "returns": [], - "needs": [ - "git_clone", - "git_clone_options_init" - ] - } + ] } ], [ @@ -27787,7 +27905,6 @@ "void * payload" ], "type": "struct", - "value": "git_config_entry", "file": "git2/config.h", "line": 64, "lineto": 71, @@ -27835,7 +27952,8 @@ "git_config_get_entry", "git_config_next" ] - } + }, + "value": "git_config_entry" } ], [ @@ -27948,7 +28066,6 @@ "file": "git2/config.h", "line": 104, "lineto": 108, - "block": "git_configmap_t type\nconst char * str_match\nint map_value", "tdef": "typedef", "description": " Mapping from config variables to values.", "comments": "", @@ -27969,6 +28086,7 @@ "comments": "" } ], + "block": "git_configmap_t type\nconst char * str_match\nint map_value", "used": { "returns": [], "needs": [ @@ -27991,10 +28109,14 @@ "file": "git2/config.h", "line": 94, "lineto": 99, - "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", "tdef": "typedef", "description": " Config var type", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", "fields": [ { "type": "int", @@ -28020,11 +28142,7 @@ "comments": "", "value": 3 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -28039,6 +28157,7 @@ "file": "git2/transport.h", "line": 147, "lineto": 152, + "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", "tdef": null, "description": " The base structure for all credential types", "comments": "", @@ -28054,7 +28173,6 @@ "comments": "" } ], - "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", "used": { "returns": [], "needs": [ @@ -28292,7 +28410,6 @@ "const char * password" ], "type": "struct", - "value": "git_cred_userpass_payload", "file": "git2/cred_helpers.h", "line": 24, "lineto": 27, @@ -28315,7 +28432,8 @@ "used": { "returns": [], "needs": [] - } + }, + "value": "git_cred_userpass_payload" } ], [ @@ -28327,7 +28445,6 @@ "char * password" ], "type": "struct", - "value": "git_cred_userpass_plaintext", "file": "git2/transport.h", "line": 155, "lineto": 159, @@ -28355,7 +28472,8 @@ "used": { "returns": [], "needs": [] - } + }, + "value": "git_cred_userpass_plaintext" } ], [ @@ -28543,10 +28661,17 @@ "file": "git2/describe.h", "line": 91, "lineto": 111, - "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", "tdef": "typedef", "description": " Describe format options structure", "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", + "used": { + "returns": [], + "needs": [ + "git_describe_format", + "git_describe_format_options_init" + ] + }, + "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", "fields": [ { "type": "unsigned int", @@ -28568,14 +28693,7 @@ "name": "dirty_suffix", "comments": " If the workdir is dirty and this is set, this string will\n be appended to the description string." } - ], - "used": { - "returns": [], - "needs": [ - "git_describe_format", - "git_describe_format_options_init" - ] - } + ] } ], [ @@ -28590,7 +28708,6 @@ "int show_commit_oid_as_fallback" ], "type": "struct", - "value": "git_describe_options", "file": "git2/describe.h", "line": 43, "lineto": 61, @@ -28637,7 +28754,8 @@ "git_describe_options_init", "git_describe_workdir" ] - } + }, + "value": "git_describe_options" } ], [ @@ -28789,7 +28907,6 @@ "git_diff_binary_file new_file" ], "type": "struct", - "value": "git_diff_binary", "file": "git2/diff.h", "line": 513, "lineto": 525, @@ -28823,7 +28940,8 @@ "git_diff_buffers", "git_diff_foreach" ] - } + }, + "value": "git_diff_binary" } ], [ @@ -28995,7 +29113,6 @@ "uint16_t id_abbrev" ], "type": "struct", - "value": "git_diff_file", "file": "git2/diff.h", "line": 260, "lineto": 267, @@ -29044,7 +29161,8 @@ "git_diff_buffers", "git_diff_foreach" ] - } + }, + "value": "git_diff_file" } ], [ @@ -29061,7 +29179,6 @@ "git_diff_similarity_metric * metric" ], "type": "struct", - "value": "git_diff_find_options", "file": "git2/diff.h", "line": 718, "lineto": 772, @@ -29117,7 +29234,8 @@ "git_diff_find_options_init", "git_diff_find_similar" ] - } + }, + "value": "git_diff_find_options" } ], [ @@ -29483,7 +29601,6 @@ "char [128] header" ], "type": "struct", - "value": "git_diff_hunk", "file": "git2/diff.h", "line": 545, "lineto": 552, @@ -29535,7 +29652,8 @@ "git_diff_line_cb", "git_patch_get_hunk" ] - } + }, + "value": "git_diff_hunk" } ], [ @@ -29551,7 +29669,6 @@ "const char * content" ], "type": "struct", - "value": "git_diff_line", "file": "git2/diff.h", "line": 600, "lineto": 608, @@ -29608,7 +29725,8 @@ "git_patch_get_line_in_hunk", "git_patch_print" ] - } + }, + "value": "git_diff_line" } ], [ @@ -30052,24 +30170,24 @@ "file": "git2/diff.h", "line": 1462, "lineto": 1464, - "block": "unsigned int version", "tdef": "typedef", "description": " Patch ID options structure", "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - } - ], "used": { "returns": [], "needs": [ "git_diff_patchid", "git_diff_patchid_options_init" ] - } + }, + "block": "unsigned int version", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + } + ] } ], [ @@ -30083,7 +30201,6 @@ "void * payload" ], "type": "struct", - "value": "git_diff_similarity_metric", "file": "git2/diff.h", "line": 701, "lineto": 711, @@ -30121,7 +30238,8 @@ "used": { "returns": [], "needs": [] - } + }, + "value": "git_diff_similarity_metric" } ], [ @@ -30129,7 +30247,6 @@ { "decl": "git_diff_stats", "type": "struct", - "value": "git_diff_stats", "file": "git2/diff.h", "line": 1280, "lineto": 1280, @@ -30146,7 +30263,8 @@ "git_diff_stats_insertions", "git_diff_stats_to_buf" ] - } + }, + "value": "git_diff_stats" } ], [ @@ -30254,7 +30372,6 @@ "int klass" ], "type": "struct", - "value": "git_error", "file": "git2/errors.h", "line": 69, "lineto": 72, @@ -30280,7 +30397,8 @@ "giterr_last" ], "needs": [] - } + }, + "value": "git_error" } ], [ @@ -30835,7 +30953,6 @@ "git_strarray custom_headers" ], "type": "struct", - "value": "git_fetch_options", "file": "git2/remote.h", "line": 652, "lineto": 689, @@ -30887,7 +31004,8 @@ "git_remote_download", "git_remote_fetch" ] - } + }, + "value": "git_fetch_options" } ], [ @@ -30902,10 +31020,14 @@ "file": "git2/remote.h", "line": 604, "lineto": 617, - "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", "description": " Acceptable prune settings when fetching ", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "fields": [ { "type": "int", @@ -30925,11 +31047,7 @@ "comments": "

Force pruning off

\n", "value": 2 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -31007,8 +31125,8 @@ "type": "struct", "value": "git_filter", "file": "git2/filter.h", - "line": 61, - "lineto": 61, + "line": 69, + "lineto": 69, "tdef": "typedef", "description": " A filter that can transform file data", "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", @@ -31033,13 +31151,15 @@ { "decl": [ "GIT_FILTER_DEFAULT", - "GIT_FILTER_ALLOW_UNSAFE" + "GIT_FILTER_ALLOW_UNSAFE", + "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_FILTER_ATTRIBUTES_FROM_HEAD" ], "type": "enum", "file": "git2/filter.h", "line": 41, - "lineto": 44, - "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE", + "lineto": 52, + "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD", "tdef": "typedef", "description": " Filter option flags.", "comments": "", @@ -31053,8 +31173,20 @@ { "type": "int", "name": "GIT_FILTER_ALLOW_UNSAFE", - "comments": "", + "comments": "

Don't error for safecrlf violations, allow them to continue.

\n", "value": 1 + }, + { + "type": "int", + "name": "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

Don't load /etc/gitattributes (or the system equivalent)

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "comments": "

Load attributes from .gitattributes in the root of HEAD

\n", + "value": 4 } ], "used": { @@ -31070,8 +31202,8 @@ "type": "struct", "value": "git_filter_list", "file": "git2/filter.h", - "line": 73, - "lineto": 73, + "line": 81, + "lineto": 81, "tdef": "typedef", "description": " List of filters to be applied", "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", @@ -31214,7 +31346,6 @@ { "decl": "git_index", "type": "struct", - "value": "git_index", "file": "git2/types.h", "line": 136, "lineto": 136, @@ -31294,7 +31425,8 @@ "git_repository_index", "git_revert_commit" ] - } + }, + "value": "git_index" } ], [ @@ -31310,10 +31442,14 @@ "file": "git2/index.h", "line": 139, "lineto": 144, - "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", "tdef": "typedef", "description": " Flags for APIs that add files matching pathspec ", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", "fields": [ { "type": "int", @@ -31339,11 +31475,7 @@ "comments": "", "value": 4 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -31400,7 +31532,6 @@ { "decl": "git_index_conflict_iterator", "type": "struct", - "value": "git_index_conflict_iterator", "file": "git2/types.h", "line": 142, "lineto": 142, @@ -31414,7 +31545,8 @@ "git_index_conflict_iterator_new", "git_index_conflict_next" ] - } + }, + "value": "git_index_conflict_iterator" } ], [ @@ -31435,7 +31567,6 @@ "const char * path" ], "type": "struct", - "value": "git_index_entry", "file": "git2/index.h", "line": 53, "lineto": 70, @@ -31521,7 +31652,8 @@ "git_index_iterator_next", "git_merge_file_from_index" ] - } + }, + "value": "git_index_entry" } ], [ @@ -31537,10 +31669,14 @@ "file": "git2/index.h", "line": 116, "lineto": 123, - "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", "tdef": "typedef", "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", "fields": [ { "type": "int", @@ -31566,11 +31702,7 @@ "comments": "", "value": 4 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -31644,10 +31776,14 @@ "file": "git2/index.h", "line": 147, "lineto": 167, - "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", "tdef": "typedef", "description": " Git index stage states ", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", "fields": [ { "type": "int", @@ -31679,11 +31815,7 @@ "comments": "

The "theirs" side of a conflict.

\n", "value": 3 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -31760,7 +31892,6 @@ "unsigned char verify" ], "type": "struct", - "value": "git_indexer_options", "file": "git2/indexer.h", "line": 62, "lineto": 72, @@ -31796,7 +31927,8 @@ "git_indexer_new", "git_indexer_options_init" ] - } + }, + "value": "git_indexer_options" } ], [ @@ -31816,10 +31948,22 @@ "file": "git2/indexer.h", "line": 24, "lineto": 48, - "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", "tdef": "typedef", "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", "comments": "", + "used": { + "returns": [ + "git_remote_stats" + ], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + }, + "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", "fields": [ { "type": "unsigned int", @@ -31856,19 +32000,7 @@ "name": "received_bytes", "comments": " size of the packfile received up to now " } - ], - "used": { - "returns": [ - "git_remote_stats" - ], - "needs": [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_progress_cb", - "git_odb_write_pack", - "git_packbuilder_write" - ] - } + ] } ], [ @@ -32180,7 +32312,6 @@ { "decl": "git_merge_driver_source", "type": "struct", - "value": "git_merge_driver_source", "file": "git2/sys/merge.h", "line": 41, "lineto": 41, @@ -32190,7 +32321,8 @@ "used": { "returns": [], "needs": [] - } + }, + "value": "git_merge_driver_source" } ], [ @@ -32394,7 +32526,6 @@ "unsigned short marker_size" ], "type": "struct", - "value": "git_merge_file_options", "file": "git2/merge.h", "line": 170, "lineto": 200, @@ -32446,7 +32577,8 @@ "git_merge_file_from_index", "git_merge_file_options_init" ] - } + }, + "value": "git_merge_file_options" } ], [ @@ -32694,10 +32826,17 @@ "file": "git2/message.h", "line": 43, "lineto": 46, - "block": "const char * key\nconst char * value", "tdef": "typedef", "description": " Represents a single git message trailer.", "comments": "", + "used": { + "returns": [], + "needs": [ + "git_message_trailer_array_free", + "git_message_trailers" + ] + }, + "block": "const char * key\nconst char * value", "fields": [ { "type": "const char *", @@ -32709,14 +32848,7 @@ "name": "value", "comments": "" } - ], - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - } + ] } ], [ @@ -32732,10 +32864,17 @@ "file": "git2/message.h", "line": 54, "lineto": 60, - "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", "tdef": "typedef", "description": " Represents an array of git message trailers.", "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", + "used": { + "returns": [], + "needs": [ + "git_message_trailer_array_free", + "git_message_trailers" + ] + }, + "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", "fields": [ { "type": "git_message_trailer *", @@ -32752,14 +32891,7 @@ "name": "_trailer_block", "comments": "" } - ], - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - } + ] } ], [ @@ -32798,7 +32930,6 @@ { "decl": "git_note_iterator", "type": "struct", - "value": "git_note_iterator", "file": "git2/notes.h", "line": 35, "lineto": 35, @@ -32813,7 +32944,8 @@ "git_note_iterator_new", "git_note_next" ] - } + }, + "value": "git_note_iterator" } ], [ @@ -32891,10 +33023,36 @@ "file": "git2/types.h", "line": 70, "lineto": 79, - "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", "tdef": "typedef", "description": " Basic type (loose or packed) of any Git object. ", "comments": "", + "used": { + "returns": [ + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_object__size", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_peel", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile" + ] + }, + "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", "fields": [ { "type": "int", @@ -32944,33 +33102,7 @@ "comments": "

A delta, base is given by object id.

\n", "value": 7 } - ], - "used": { - "returns": [ - "git_object_string2type", - "git_object_type", - "git_odb_object_type", - "git_tag_target_type", - "git_tree_entry_type" - ], - "needs": [ - "git_object__size", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_peel", - "git_object_type2string", - "git_object_typeisloose", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read_header", - "git_odb_write", - "git_reference_peel", - "git_repository_hashfile" - ] - } + ] } ], [ @@ -33100,7 +33232,6 @@ { "decl": "git_odb_object", "type": "struct", - "value": "git_odb_object", "file": "git2/types.h", "line": 88, "lineto": 88, @@ -33119,7 +33250,8 @@ "git_odb_read", "git_odb_read_prefix" ] - } + }, + "value": "git_odb_object" } ], [ @@ -33246,10 +33378,16 @@ "file": "git2/types.h", "line": 94, "lineto": 94, - "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "tdef": "typedef", "description": " A stream to write a packfile to the ODB ", "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_write_pack" + ] + }, + "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "fields": [ { "type": "git_odb_backend *", @@ -33271,13 +33409,7 @@ "name": "free", "comments": "" } - ], - "used": { - "returns": [], - "needs": [ - "git_odb_write_pack" - ] - } + ] } ], [ @@ -33468,7 +33600,6 @@ "size_t count" ], "type": "struct", - "value": "git_oidarray", "file": "git2/oidarray.h", "line": 16, "lineto": 19, @@ -33495,7 +33626,8 @@ "git_merge_bases_many", "git_oidarray_free" ] - } + }, + "value": "git_oidarray" } ], [ @@ -33749,7 +33881,6 @@ { "decl": "git_pathspec_match_list", "type": "struct", - "value": "git_pathspec_match_list", "file": "git2/pathspec.h", "line": 25, "lineto": 25, @@ -33770,7 +33901,8 @@ "git_pathspec_match_tree", "git_pathspec_match_workdir" ] - } + }, + "value": "git_pathspec_match_list" } ], [ @@ -33789,10 +33921,17 @@ "file": "git2/proxy.h", "line": 42, "lineto": 77, - "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "tdef": "typedef", "description": " Options for connecting through a proxy", "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", + "used": { + "returns": [], + "needs": [ + "git_proxy_options_init", + "git_remote_connect" + ] + }, + "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "fields": [ { "type": "unsigned int", @@ -33824,14 +33963,7 @@ "name": "payload", "comments": " Payload to be provided to the credentials and certificate\n check callbacks." } - ], - "used": { - "returns": [], - "needs": [ - "git_proxy_options_init", - "git_remote_connect" - ] - } + ] } ], [ @@ -33914,10 +34046,18 @@ "file": "git2/remote.h", "line": 713, "lineto": 740, - "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", "comments": "", + "used": { + "returns": [], + "needs": [ + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + }, + "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "fields": [ { "type": "unsigned int", @@ -33944,15 +34084,7 @@ "name": "custom_headers", "comments": " Extra headers for this push operation" } - ], - "used": { - "returns": [], - "needs": [ - "git_push_options_init", - "git_remote_push", - "git_remote_upload" - ] - } + ] } ], [ @@ -34008,7 +34140,6 @@ { "decl": "git_rebase", "type": "struct", - "value": "git_rebase", "file": "git2/types.h", "line": 192, "lineto": 192, @@ -34037,7 +34168,8 @@ "git_rebase_orig_head_id", "git_rebase_orig_head_name" ] - } + }, + "value": "git_rebase" } ], [ @@ -34099,10 +34231,14 @@ "file": "git2/rebase.h", "line": 96, "lineto": 132, - "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "tdef": "typedef", "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "fields": [ { "type": "int", @@ -34140,11 +34276,7 @@ "comments": "

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n", "value": 5 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -34165,10 +34297,18 @@ "file": "git2/rebase.h", "line": 32, "lineto": 91, - "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_signing_cb signing_cb\nvoid * payload", "tdef": "typedef", "description": " Rebase options", "comments": "

Use to tell the rebase machinery how to operate.

\n", + "used": { + "returns": [], + "needs": [ + "git_rebase_init", + "git_rebase_open", + "git_rebase_options_init" + ] + }, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_signing_cb signing_cb\nvoid * payload", "fields": [ { "type": "unsigned int", @@ -34210,15 +34350,7 @@ "name": "payload", "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." } - ], - "used": { - "returns": [], - "needs": [ - "git_rebase_init", - "git_rebase_open", - "git_rebase_options_init" - ] - } + ] } ], [ @@ -34250,7 +34382,6 @@ { "decl": "git_refdb_backend", "type": "struct", - "value": "git_refdb_backend", "file": "git2/types.h", "line": 100, "lineto": 100, @@ -34260,7 +34391,8 @@ "used": { "returns": [], "needs": [] - } + }, + "value": "git_refdb_backend" } ], [ @@ -34421,10 +34553,16 @@ "file": "git2/types.h", "line": 195, "lineto": 200, - "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", "tdef": "typedef", "description": " Basic type of any Git reference. ", "comments": "", + "used": { + "returns": [ + "git_reference_type" + ], + "needs": [] + }, + "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", "fields": [ { "type": "int", @@ -34450,13 +34588,7 @@ "comments": "", "value": 3 } - ], - "used": { - "returns": [ - "git_reference_type" - ], - "needs": [] - } + ] } ], [ @@ -34522,7 +34654,6 @@ { "decl": "git_refspec", "type": "struct", - "value": "git_refspec", "file": "git2/types.h", "line": 223, "lineto": 223, @@ -34546,7 +34677,8 @@ "git_refspec_string", "git_refspec_transform" ] - } + }, + "value": "git_refspec" } ], [ @@ -34681,7 +34813,6 @@ "git_url_resolve_cb resolve_url" ], "type": "struct", - "value": "git_remote_callbacks", "file": "git2/remote.h", "line": 497, "lineto": 586, @@ -34769,7 +34900,8 @@ "git_remote_prune", "git_remote_update_tips" ] - } + }, + "value": "git_remote_callbacks" } ], [ @@ -34864,10 +34996,17 @@ "file": "git2/remote.h", "line": 62, "lineto": 82, - "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", "tdef": "typedef", "description": " Remote creation options structure", "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", + "used": { + "returns": [], + "needs": [ + "git_remote_create_options_init", + "git_remote_create_with_opts" + ] + }, + "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", "fields": [ { "type": "unsigned int", @@ -34894,14 +35033,7 @@ "name": "flags", "comments": " Additional flags for the remote. See git_remote_create_flags. " } - ], - "used": { - "returns": [], - "needs": [ - "git_remote_create_options_init", - "git_remote_create_with_opts" - ] - } + ] } ], [ @@ -34915,7 +35047,6 @@ "char * symref_target" ], "type": "struct", - "value": "git_remote_head", "file": "git2/net.h", "line": 40, "lineto": 50, @@ -34956,7 +35087,8 @@ "git_headlist_cb", "git_remote_ls" ] - } + }, + "value": "git_remote_head" } ], [ @@ -34964,7 +35096,6 @@ { "decl": "git_repository", "type": "struct", - "value": "git_repository", "file": "git2/types.h", "line": 106, "lineto": 106, @@ -35200,7 +35331,8 @@ "git_worktree_lookup", "git_worktree_open_from_repository" ] - } + }, + "value": "git_repository" } ], [ @@ -35329,7 +35461,6 @@ "const char * origin_url" ], "type": "struct", - "value": "git_repository_init_options", "file": "git2/repository.h", "line": 302, "lineto": 311, @@ -35385,7 +35516,8 @@ "git_repository_init_ext", "git_repository_init_options_init" ] - } + }, + "value": "git_repository_init_options" } ], [ @@ -35783,10 +35915,14 @@ "file": "git2/revparse.h", "line": 71, "lineto": 78, - "block": "GIT_REVPARSE_SINGLE\nGIT_REVPARSE_RANGE\nGIT_REVPARSE_MERGE_BASE", "tdef": "typedef", "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_REVPARSE_SINGLE\nGIT_REVPARSE_RANGE\nGIT_REVPARSE_MERGE_BASE", "fields": [ { "type": "int", @@ -35806,11 +35942,7 @@ "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", "value": 4 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -35860,7 +35992,6 @@ { "decl": "git_revwalk", "type": "struct", - "value": "git_revwalk", "file": "git2/types.h", "line": 115, "lineto": 115, @@ -35889,7 +36020,8 @@ "git_revwalk_simplify_first_parent", "git_revwalk_sorting" ] - } + }, + "value": "git_revwalk" } ], [ @@ -35901,7 +36033,6 @@ "git_time when" ], "type": "struct", - "value": "git_signature", "file": "git2/types.h", "line": 170, "lineto": 174, @@ -35962,7 +36093,8 @@ "git_transaction_set_symbolic_target", "git_transaction_set_target" ] - } + }, + "value": "git_signature" } ], [ @@ -36109,7 +36241,6 @@ "void * progress_payload" ], "type": "struct", - "value": "git_stash_apply_options", "file": "git2/stash.h", "line": 126, "lineto": 138, @@ -36151,7 +36282,8 @@ "git_stash_apply_options_init", "git_stash_pop" ] - } + }, + "value": "git_stash_apply_options" } ], [ @@ -36246,10 +36378,14 @@ "file": "git2/stash.h", "line": 25, "lineto": 48, - "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", "tdef": "typedef", "description": " Stash flags", "comments": "", + "used": { + "returns": [], + "needs": [] + }, + "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", "fields": [ { "type": "int", @@ -36275,11 +36411,7 @@ "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", "value": 4 } - ], - "used": { - "returns": [], - "needs": [] - } + ] } ], [ @@ -36291,7 +36423,6 @@ "git_diff_delta * index_to_workdir" ], "type": "struct", - "value": "git_status_entry", "file": "git2/status.h", "line": 230, "lineto": 234, @@ -36321,7 +36452,8 @@ "git_status_byindex" ], "needs": [] - } + }, + "value": "git_status_entry" } ], [ @@ -36491,7 +36623,6 @@ "git_tree * baseline" ], "type": "struct", - "value": "git_status_options", "file": "git2/status.h", "line": 170, "lineto": 197, @@ -36533,7 +36664,8 @@ "git_status_list_new", "git_status_options_init" ] - } + }, + "value": "git_status_options" } ], [ @@ -36709,22 +36841,9 @@ "file": "git2/strarray.h", "line": 22, "lineto": 25, - "block": "char ** strings\nsize_t count", "tdef": "typedef", "description": " Array of strings ", "comments": "", - "fields": [ - { - "type": "char **", - "name": "strings", - "comments": "" - }, - { - "type": "size_t", - "name": "count", - "comments": "" - } - ], "used": { "returns": [], "needs": [ @@ -36749,7 +36868,20 @@ "git_tag_list_match", "git_worktree_list" ] - } + }, + "block": "char ** strings\nsize_t count", + "fields": [ + { + "type": "char **", + "name": "strings", + "comments": "" + }, + { + "type": "size_t", + "name": "count", + "comments": "" + } + ] } ], [ @@ -36792,7 +36924,6 @@ { "decl": "git_submodule", "type": "struct", - "value": "git_submodule", "file": "git2/types.h", "line": 313, "lineto": 313, @@ -36837,7 +36968,8 @@ "git_submodule_url", "git_submodule_wd_id" ] - } + }, + "value": "git_submodule" } ], [ @@ -37080,10 +37212,17 @@ "file": "git2/submodule.h", "line": 128, "lineto": 153, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", "tdef": "typedef", "description": " Submodule update options structure", "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", + "used": { + "returns": [], + "needs": [ + "git_submodule_update", + "git_submodule_update_options_init" + ] + }, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", "fields": [ { "type": "unsigned int", @@ -37105,14 +37244,7 @@ "name": "allow_fetch", "comments": " Allow fetching from the submodule's default remote if the target\n commit isn't found. Enabled by default." } - ], - "used": { - "returns": [], - "needs": [ - "git_submodule_update", - "git_submodule_update_options_init" - ] - } + ] } ], [ @@ -37180,7 +37312,6 @@ { "decl": "git_tag", "type": "struct", - "value": "git_tag", "file": "git2/types.h", "line": 118, "lineto": 118, @@ -37205,7 +37336,8 @@ "git_tag_target_id", "git_tag_target_type" ] - } + }, + "value": "git_tag" } ], [ @@ -37221,10 +37353,18 @@ "file": "git2/types.h", "line": 163, "lineto": 167, - "block": "git_time_t time\nint offset\nchar sign", "tdef": "typedef", "description": " Time in a signature ", "comments": "", + "used": { + "returns": [ + "git_commit_time" + ], + "needs": [ + "git_signature_new" + ] + }, + "block": "git_time_t time\nint offset\nchar sign", "fields": [ { "type": "git_time_t", @@ -37241,15 +37381,7 @@ "name": "sign", "comments": " indicator for questionable '-0000' offsets in signature " } - ], - "used": { - "returns": [ - "git_commit_time" - ], - "needs": [ - "git_signature_new" - ] - } + ] } ], [ @@ -37268,10 +37400,17 @@ "file": "git2/trace.h", "line": 26, "lineto": 47, - "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", "tdef": "typedef", "description": " Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.", "comments": "", + "used": { + "returns": [], + "needs": [ + "git_trace_cb", + "git_trace_set" + ] + }, + "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", "fields": [ { "type": "int", @@ -37315,14 +37454,7 @@ "comments": "

Exceptionally detailed debugging data

\n", "value": 6 } - ], - "used": { - "returns": [], - "needs": [ - "git_trace_cb", - "git_trace_set" - ] - } + ] } ], [ @@ -37449,7 +37581,6 @@ { "decl": "git_tree_entry", "type": "struct", - "value": "git_tree_entry", "file": "git2/types.h", "line": 127, "lineto": 127, @@ -37478,7 +37609,8 @@ "git_treebuilder_insert", "git_treewalk_cb" ] - } + }, + "value": "git_tree_entry" } ], [ @@ -37495,10 +37627,16 @@ "file": "git2/tree.h", "line": 448, "lineto": 457, - "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "tdef": "typedef", "description": " An action to perform during the update of a tree", "comments": "", + "used": { + "returns": [], + "needs": [ + "git_tree_create_updated" + ] + }, + "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "fields": [ { "type": "git_tree_update_t", @@ -37520,13 +37658,7 @@ "name": "path", "comments": " The full path from the root tree " } - ], - "used": { - "returns": [], - "needs": [ - "git_tree_create_updated" - ] - } + ] } ], [ @@ -37673,7 +37805,6 @@ "git_reference * ref" ], "type": "struct", - "value": "git_worktree_add_options", "file": "git2/worktree.h", "line": 84, "lineto": 89, @@ -37704,7 +37835,8 @@ "git_worktree_add", "git_worktree_add_options_init" ] - } + }, + "value": "git_worktree_add_options" } ], [ @@ -37719,7 +37851,6 @@ "file": "git2/worktree.h", "line": 198, "lineto": 202, - "block": "unsigned int version\nuint32_t flags", "tdef": "typedef", "description": " Worktree prune options structure", "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", @@ -37735,6 +37866,7 @@ "comments": "" } ], + "block": "unsigned int version\nuint32_t flags", "used": { "returns": [], "needs": [ @@ -37889,6 +38021,7 @@ "git_blob_create_from_workdir", "git_blob_create_fromworkdir", "git_blob_dup", + "git_blob_filter", "git_blob_filtered_content", "git_blob_free", "git_blob_id", diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 6d7809833..b8b74abd7 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1095,6 +1095,22 @@ } } ], + [ + "git_blob_filter_options", + { + "type": "struct", + "fields": [ + { + "name": "version", + "type": "int" + }, + { + "name": "flags", + "type": "git_blob_filter_flag_t" + } + ] + } + ], [ "git_config_entry", { diff --git a/lib/blob.js b/lib/blob.js index 073623fdd..afb563a6a 100644 --- a/lib/blob.js +++ b/lib/blob.js @@ -1,7 +1,12 @@ +var util = require("util"); var NodeGit = require("../"); var Blob = NodeGit.Blob; var LookupWrapper = NodeGit.Utils.lookupWrapper; var TreeEntry = NodeGit.TreeEntry; +var normalizeOptions = NodeGit.Utils.normalizeOptions; + +var _filteredContent = Blob.filteredContent; +var _filter = Blob.prototype.filter; /** * Retrieves the blob pointed to by the oid @@ -40,3 +45,29 @@ Blob.prototype.filemode = function() { Blob.prototype.toString = function() { return this.content().toString(); }; + +/** + * Get a buffer with the filtered content of a blob. + * + * This applies filters as if the blob was being checked out to the + * working directory under the specified filename. This may apply + * CRLF filtering or other types of changes depending on the file + * attributes set for the blob and the content detected in it. + * + * @async + * @param asPath Path used for file attribute lookups, etc. + * @param opts Options to use for filtering the blob + * @return {Promise} + */ +Blob.prototype.filter = function(asPath, opts) { + if (opts) { + opts = normalizeOptions(opts, NodeGit.BlobFilterOptions); + } + return _filter.call(this, asPath, opts); +}; + +Blob.filteredContent = util.deprecate( + _filteredContent, + "NodeGit.Blob.filteredContent is deprecated" + + "use NodeGit.Blob.prototype.filter instead." +); diff --git a/test/tests/blob.js b/test/tests/blob.js index 3635f6ba3..4d18a43ff 100644 --- a/test/tests/blob.js +++ b/test/tests/blob.js @@ -272,7 +272,7 @@ describe("Blob", function() { }); }); - describe("filteredContent", function() { + describe("filteredContent (DEPRECATED)", function() { var attrFileName = ".gitattributes"; var filter = "* text eol=crlf"; var lineEndingRegex = /\r\n|\r|\n/; @@ -479,4 +479,184 @@ describe("Blob", function() { }); }); }); + + describe("filter", function() { + var attrFileName = ".gitattributes"; + var filter = "* text eol=crlf"; + var lineEndingRegex = /\r\n|\r|\n/; + var newFileName = "testfile.test"; + + it("retrieves the filtered content", function() { + var test = this; + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + "this\nis\nfun\guys", + "added LF ending file" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(lfBlob) { + test.lfBlob = lfBlob; + var ending = test.lfBlob.toString().match(lineEndingRegex); + assert.strictEqual(ending[0], "\n"); + + return test.lfBlob.filter(newFileName, { flags: 0 }); + }) + .then(function(content) { + var ending = content.match(lineEndingRegex); + assert.strictEqual(ending[0], "\r\n"); + assert.notStrictEqual(content, test.blob.toString()); + }); + }); + + it("returns non-binary filtered content when checking binary", function() { + var test = this; + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + "this\nis\nfun\guys", + "added LF ending file" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(lfBlob) { + test.lfBlob = lfBlob; + var ending = test.lfBlob.toString().match(lineEndingRegex); + assert.strictEqual(ending[0], "\n"); + + return test.lfBlob.filter( + newFileName, + { flags: NodeGit.Blob.FILTER_FLAG.CHECK_FOR_BINARY } + ); + }) + .then(function(content) { + var ending = content.match(lineEndingRegex); + assert.strictEqual(ending[0], "\r\n"); + assert.notStrictEqual(content, test.blob.toString()); + }); + }); + + it("returns nothing when checking binary blob", function() { + var test = this; + var binary = new Buffer(new Uint8Array([1,2,3,4,5,6])); + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + binary, + "binary content" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(binaryBlob) { + test.binaryBlob = binaryBlob; + assert.equal(true, binaryBlob.isBinary()); + + return test.binaryBlob.filter( + newFileName, + { flags: NodeGit.Blob.FILTER_FLAG.CHECK_FOR_BINARY } + ); + }) + .then(function(content) { + assert.strictEqual(content, ""); + }); + }); + + it("returns blob when not checking binary on binary blob", function() { + var test = this; + var binary = new Buffer(new Uint8Array([1,2,3,4,5,6])); + + return commitFile( + test.repository, + attrFileName, + filter, + "added gitattributes") + .then(function() { + return commitFile( + test.repository, + newFileName, + binary, + "binary content" + ); + }) + .then(function(oid) { + return test.repository.getCommit(oid); + }) + .then(function(commit) { + test.filteredCommit = commit; + return commit.getEntry(newFileName); + }) + .then(function(entry) { + return entry.getBlob(); + }) + .then(function(binaryBlob) { + test.binaryBlob = binaryBlob; + assert.equal(true, binaryBlob.isBinary()); + + return test.binaryBlob.filter( + newFileName, + { flags: 0 } + ); + }) + .then(function(content) { + assert.strictEqual(content, binary.toString()); + }); + }); + + it("throws an error when the path is null", function() { + var test = this; + return test.blob.filter(test.blob, null, { flags: 0 }) + .catch(function(err) { + assert.strictEqual(err.message, "String as_path is required."); + }); + }); + }); }); diff --git a/vendor/libgit2 b/vendor/libgit2 index fb173ba7f..eee2ed90e 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit fb173ba7f8dae6bb6d723b1b587f9a2ffbdbd5b9 +Subproject commit eee2ed90eb4e32ab87eb7f178a7bde2af3593d38 From ee7b26c06b8d86b719f264a361dc0d900905f796 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 16 Sep 2019 08:11:08 -0700 Subject: [PATCH 166/545] Bump to v0.26.1 --- CHANGELOG.md | 37 +++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a90e44a1..6491d2124 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,42 @@ # Change Log +## v0.26.1 [(2019-09-16)](https://github.com/nodegit/nodegit/releases/tag/v0.26.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.0...v0.26.1) + +#### Summary of changes +- Bumped LibGit2 + - Additional git ignore fixes + - Allow credentials callback to return any credential type from list of supported types + - Memory leak and allocation fixes +- updateTips has optional parameters and should convert plain objects into options structs correctly now +- Added Nodegit.Blob.prototype.filter, this should be used instead of NodeGit.Blob.filteredContent as it is not deprecated. + +#### Merged PRs into NodeGit +- [Bump libgit2 to latest fork of master #1723](https://github.com/nodegit/nodegit/pull/1723) +- [updateTips: optional param and normalizeOptions #1722](https://github.com/nodegit/nodegit/pull/1722) + +#### Merged PRs into LibGit2 +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [azure: build Docker images as part of the pipeline](https://github.com/libgit2/libgit2/pull/5198) +- [smart: use push_glob instead of manual filtering](https://github.com/libgit2/libgit2/pull/5195) +- [ntlm: fix failure to find openssl headers](https://github.com/libgit2/libgit2/pull/5216) +- [cmake: remove extraneous logging](https://github.com/libgit2/libgit2/pull/5222) +- [open:fix memory leak when passing NULL to git_repository_open_ext](https://github.com/libgit2/libgit2/pull/5224) +- [apply: Fix a patch corruption related to EOFNL handling](https://github.com/libgit2/libgit2/pull/5209) +- [ignore: correct handling of nested rules overriding wild card unignore](https://github.com/libgit2/libgit2/pull/5210) +- [Memory allocation fixes for diff generator](https://github.com/libgit2/libgit2/pull/5214) +- [Use an HTTP scheme that supports the given credentials](https://github.com/libgit2/libgit2/pull/5212) +- [apply: git_apply_to_tree fails to apply patches that add new files](https://github.com/libgit2/libgit2/pull/5208) +- [Optionally read `.gitattributes` from HEAD](https://github.com/libgit2/libgit2/pull/5189) +- [config: implement "onbranch" conditional](https://github.com/libgit2/libgit2/pull/5196) +- [Fix include casing for case-sensitive filesystems.](https://github.com/libgit2/libgit2/pull/5213) +- [util: use 64 bit timer on Windows](https://github.com/libgit2/libgit2/pull/5054) +- [Memory allocation audit](https://github.com/libgit2/libgit2/pull/5200) +- [clone: don't decode URL percent encodings](https://github.com/libgit2/libgit2/pull/5187) +- [Security updates from 0.28.3](https://github.com/libgit2/libgit2/pull/5202) + + ## v0.26.0 [(2019-09-09)](https://github.com/nodegit/nodegit/releases/tag/v0.26.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.25.1...v0.26.0) diff --git a/package-lock.json b/package-lock.json index cbc8781c6..e69f3935c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.26.0", + "version": "0.26.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 49fa0de8d..560570e72 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.26.0", + "version": "0.26.1", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 6ecd368dafb8a1abe473eaa9354407f8748c13bb Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 25 Sep 2019 12:27:12 -0700 Subject: [PATCH 167/545] commitWalk optionally returns plain objects with gpgSignature data --- generate/input/libgit2-supplement.json | 6 +- .../templates/manual/revwalk/commit_walk.cc | 170 +++++++++++++++--- generate/templates/templates/class_header.h | 1 + 3 files changed, 153 insertions(+), 24 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index b8b74abd7..fd827c8bf 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -753,7 +753,11 @@ }, { "name": "out", - "type": "std::vector *" + "type": "void *" + }, + { + "name": "returnPlainObjects", + "type": "bool" }, { "name": "walk", diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index 91fe7f38c..c230550f2 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -1,24 +1,149 @@ +#define SET_ON_OBJECT(obj, field, data) Nan::Set(obj, Nan::New(field).ToLocalChecked(), data) + +v8::Local signatureToJavascript(const git_signature *signature) { + v8::Local signatureObject = Nan::New(); + SET_ON_OBJECT(signatureObject, "name", Nan::New(signature->name).ToLocalChecked()); + SET_ON_OBJECT(signatureObject, "email", Nan::New(signature->email).ToLocalChecked()); + SET_ON_OBJECT(signatureObject, "date", Nan::New(signature->when.time * 1000)); + std::stringstream fullSignature; + fullSignature << signature->name << " <" << signature << ">"; + SET_ON_OBJECT(signatureObject, "full", Nan::New(fullSignature.str()).ToLocalChecked()); + return signatureObject; +} + +#include +class CommitModel { +public: + CommitModel(git_commit *commit, bool fetchSignature): + commit(commit), + fetchSignature(fetchSignature), + signature({ 0, 0, 0 }), + signedData({ 0, 0, 0 }) + { + if (fetchSignature) { + int error = git_commit_extract_signature( + &signature, + &signedData, + git_commit_owner(commit), + const_cast(git_commit_id(commit)), + NULL + ); + if (error != GIT_ENOTFOUND) { + assert(error == GIT_OK); + } + } + + size_t parentCount = git_commit_parentcount(commit); + parentIds.reserve(parentCount); + for (size_t parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + parentIds.push_back(git_oid_tostr_s(git_commit_parent_id(commit, parentIndex))); + } + } + + v8::Local toJavascript() { + if (!fetchSignature) { + v8::Local commitObject = GitCommit::New( + commit, + true, + Nan::To(GitRepository::New( + git_commit_owner(commit), + true + )).ToLocalChecked() + ); + commit = NULL; + return commitObject; + } + + v8::Local commitModel = Nan::New(); + SET_ON_OBJECT(commitModel, "sha", Nan::New(git_oid_tostr_s(git_commit_id(commit))).ToLocalChecked()); + SET_ON_OBJECT(commitModel, "message", Nan::New(git_commit_message(commit)).ToLocalChecked()); + SET_ON_OBJECT(commitModel, "author", signatureToJavascript(git_commit_author(commit))); + SET_ON_OBJECT(commitModel, "committer", signatureToJavascript(git_commit_committer(commit))); + + size_t parentCount = parentIds.size(); + v8::Local parents = Nan::New(parentCount); + for (size_t parentIndex = 0; parentIndex < parentCount; ++parentIndex) { + Nan::Set(parents, Nan::New(parentIndex), Nan::New(parentIds[parentIndex]).ToLocalChecked()); + } + SET_ON_OBJECT(commitModel, "parents", parents); + + if (signature.size != 0 || signedData.size != 0) { + v8::Local gpgSignature = Nan::New(); + if (signature.size != 0) { + SET_ON_OBJECT(gpgSignature, "signature", Nan::New(signature.ptr).ToLocalChecked()); + } else { + SET_ON_OBJECT(gpgSignature, "signature", Nan::Null()); + } + + if (signedData.size != 0) { + SET_ON_OBJECT(gpgSignature, "signedData", Nan::New(signedData.ptr).ToLocalChecked()); + } else { + SET_ON_OBJECT(gpgSignature, "signedData", Nan::Null()); + } + + SET_ON_OBJECT(commitModel, "gpgSignature", gpgSignature); + } + + return commitModel; + } + + ~CommitModel() { + git_buf_dispose(&signature); + git_buf_dispose(&signedData); + if (commit) { + git_commit_free(commit); + } + } + +private: + git_commit *commit; + bool fetchSignature; + git_buf signature, signedData; + std::vector parentIds; +}; + NAN_METHOD(GitRevwalk::CommitWalk) { if (info.Length() == 0 || !info[0]->IsNumber()) { return Nan::ThrowError("Max count is required and must be a number."); } - if (info.Length() == 1 || !info[1]->IsFunction()) { + if (info.Length() == 1 || (info.Length() == 2 && !info[1]->IsFunction())) { return Nan::ThrowError("Callback is required and must be a Function."); } + if (info.Length() >= 3) { + if (!info[1]->IsNull() && !info[1]->IsUndefined() && !info[1]->IsObject()) { + return Nan::ThrowError("Options must be an object, null, or undefined."); + } + + if (!info[2]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + } + CommitWalkBaton* baton = new CommitWalkBaton; baton->error_code = GIT_OK; baton->error = NULL; baton->max_count = Nan::To(info[0]).FromJust(); - baton->out = new std::vector; - baton->out->reserve(baton->max_count); + std::vector *out = new std::vector; + out->reserve(baton->max_count); + baton->out = reinterpret_cast(out); + if (info.Length() == 3 && info[1]->IsObject()) { + v8::Local options = Nan::To(info[1]).ToLocalChecked(); + v8::Local propName = Nan::New("returnPlainObjects").ToLocalChecked(); + if (Nan::Has(options, propName).FromJust()) { + baton->returnPlainObjects = Nan::Get(options, propName).ToLocalChecked()->IsTrue(); + } else { + baton->returnPlainObjects = false; + } + } else { + baton->returnPlainObjects = false; + } baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1]->IsFunction() ? info[1] : info[2])); CommitWalkWorker *worker = new CommitWalkWorker(baton, callback); - worker->SaveToPersistent("fastWalk", info.This()); + worker->SaveToPersistent("commitWalk", info.This()); Nan::AsyncQueueWorker(worker); return; @@ -27,6 +152,7 @@ NAN_METHOD(GitRevwalk::CommitWalk) { void GitRevwalk::CommitWalkWorker::Execute() { giterr_clear(); + std::vector *out = reinterpret_cast *>(baton->out); for (int i = 0; i < baton->max_count; i++) { git_oid next_commit_id; baton->error_code = git_revwalk_next(&next_commit_id, baton->walk); @@ -41,12 +167,12 @@ void GitRevwalk::CommitWalkWorker::Execute() { baton->error = git_error_dup(giterr_last()); } - while (baton->out->size()) { - git_commit_free(baton->out->back()); - baton->out->pop_back(); + while (out->size()) { + delete out->back(); + out->pop_back(); } - delete baton->out; + delete out; baton->out = NULL; return; @@ -60,39 +186,37 @@ void GitRevwalk::CommitWalkWorker::Execute() { baton->error = git_error_dup(giterr_last()); } - while (baton->out->size()) { - git_commit_free(baton->out->back()); - baton->out->pop_back(); + while (out->size()) { + delete out->back(); + out->pop_back(); } - delete baton->out; + delete out; baton->out = NULL; return; } - baton->out->push_back(commit); + out->push_back(new CommitModel(commit, baton->returnPlainObjects)); } } void GitRevwalk::CommitWalkWorker::HandleOKCallback() { if (baton->out != NULL) { - unsigned int size = baton->out->size(); + std::vector *out = reinterpret_cast *>(baton->out); + unsigned int size = out->size(); Local result = Nan::New(size); for (unsigned int i = 0; i < size; i++) { - git_commit *commit = baton->out->at(i); + CommitModel *commitModel = out->at(i); Nan::Set( result, Nan::New(i), - GitCommit::New( - commit, - true, - Nan::To(GitRepository::New(git_commit_owner(commit), true)).ToLocalChecked() - ) + commitModel->toJavascript() ); + delete commitModel; } - delete baton->out; + delete out; Local argv[2] = { Nan::Null(), diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index fce17e58c..746692e9e 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "async_baton.h" #include "nodegit_wrapper.h" From d7c9860bb2b8a75b6046fa58cd5c03835ea54d63 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 26 Sep 2019 12:02:44 -0700 Subject: [PATCH 168/545] Use const qualifier more; use static_cast for void * --- generate/templates/manual/revwalk/commit_walk.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index c230550f2..bef5bc889 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -21,7 +21,7 @@ class CommitModel { signedData({ 0, 0, 0 }) { if (fetchSignature) { - int error = git_commit_extract_signature( + const int error = git_commit_extract_signature( &signature, &signedData, git_commit_owner(commit), @@ -33,7 +33,7 @@ class CommitModel { } } - size_t parentCount = git_commit_parentcount(commit); + const size_t parentCount = git_commit_parentcount(commit); parentIds.reserve(parentCount); for (size_t parentIndex = 0; parentIndex < parentCount; ++parentIndex) { parentIds.push_back(git_oid_tostr_s(git_commit_parent_id(commit, parentIndex))); @@ -128,7 +128,7 @@ NAN_METHOD(GitRevwalk::CommitWalk) { baton->max_count = Nan::To(info[0]).FromJust(); std::vector *out = new std::vector; out->reserve(baton->max_count); - baton->out = reinterpret_cast(out); + baton->out = static_cast(out); if (info.Length() == 3 && info[1]->IsObject()) { v8::Local options = Nan::To(info[1]).ToLocalChecked(); v8::Local propName = Nan::New("returnPlainObjects").ToLocalChecked(); @@ -152,7 +152,7 @@ NAN_METHOD(GitRevwalk::CommitWalk) { void GitRevwalk::CommitWalkWorker::Execute() { giterr_clear(); - std::vector *out = reinterpret_cast *>(baton->out); + std::vector *out = static_cast *>(baton->out); for (int i = 0; i < baton->max_count; i++) { git_oid next_commit_id; baton->error_code = git_revwalk_next(&next_commit_id, baton->walk); @@ -203,8 +203,8 @@ void GitRevwalk::CommitWalkWorker::Execute() { void GitRevwalk::CommitWalkWorker::HandleOKCallback() { if (baton->out != NULL) { - std::vector *out = reinterpret_cast *>(baton->out); - unsigned int size = out->size(); + std::vector *out = static_cast *>(baton->out); + const unsigned int size = out->size(); Local result = Nan::New(size); for (unsigned int i = 0; i < size; i++) { CommitModel *commitModel = out->at(i); From 0683f2be2d4b2812d11c3413db089ae73ede116f Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 26 Sep 2019 14:04:37 -0700 Subject: [PATCH 169/545] Update README.md for inactive maintainers --- README.md | 9 +++++---- package.json | 4 ---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c547e32e7..6e0dde815 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,20 @@ Linux & macOS | Windows | Coverage | Dependencies ------------- | ------- | -------- | ------------- [![Build Status Travis](https://api.travis-ci.org/nodegit/nodegit.svg?branch=master)](https://travis-ci.org/nodegit/nodegit) | [![Build Status AppVeyor](https://ci.appveyor.com/api/projects/status/e5a5q75l9yfhnfv2?svg=true)](https://ci.appveyor.com/project/timbranyen/nodegit) | [![Coveralls](https://coveralls.io/repos/nodegit/nodegit/badge.svg)](https://coveralls.io/r/nodegit/nodegit) | [![Dependencies](https://david-dm.org/nodegit/nodegit.svg)](https://david-dm.org/nodegit/nodegit) -**Stable (libgit2@v0.27.3): 0.27.3** +**Stable (libgit2@v0.28.3): 0.28.3** ## Have a problem? Come chat with us! ## Visit [slack.libgit2.org](http://slack.libgit2.org/) to sign up, then join us in #nodegit. ## Maintained by ## -Tim Branyen [@tbranyen](http://twitter.com/tbranyen), -John Haley [@johnhaley81](http://twitter.com/johnhaley81), and -Max Korp [@maxkorp](http://twitter.com/MaximilianoKorp) with help from tons of +Tyler Ang-Wanek [@twwanek](http://twitter.com/twwanek) with help from tons of [awesome contributors](https://github.com/nodegit/nodegit/contributors)! ### Alumni Maintainers ### +Tim Branyen [@tbranyen](http://twitter.com/tbranyen), +John Haley [@johnhaley81](http://twitter.com/johnhaley81), +Max Korp [@maxkorp](http://twitter.com/MaximilianoKorp), Steve Smith [@orderedlist](https://twitter.com/orderedlist), Michael Robinson [@codeofinterest](http://twitter.com/codeofinterest), and Nick Kallen [@nk](http://twitter.com/nk) diff --git a/package.json b/package.json index 560570e72..e552cc4c2 100644 --- a/package.json +++ b/package.json @@ -64,10 +64,6 @@ "mocha": "^5.2.0", "walk": "^2.3.9" }, - "vendorDependencies": { - "libssh2": "1.8.0", - "http_parser": "2.5.0" - }, "binary": { "module_name": "nodegit", "module_path": "./build/Release/", From 1047f66950e22397d27a0cb4ec93e9a4b583aaff Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 26 Sep 2019 14:20:12 -0700 Subject: [PATCH 170/545] Bupm to v0.26.2 --- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6491d2124..17e2172b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## v0.26.2 [(2019-09-26)](https://github.com/nodegit/nodegit/releases/tag/v0.26.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.1...v0.26.2) + +#### Summary of changes +- Added options to fetch additional data (gpg signature) from LibGit2 in revWalk.prototype.commitWalk and return plain objects + - _revWalk.prototype.commitWalk(numCommits: number, { returnPlainObjects: boolean })_ + +#### Merged PRs into NodeGit +- [Optionally retrieve more data on commit walk #1728](https://github.com/nodegit/nodegit/pull/1728) + + ## v0.26.1 [(2019-09-16)](https://github.com/nodegit/nodegit/releases/tag/v0.26.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.0...v0.26.1) diff --git a/package-lock.json b/package-lock.json index e69f3935c..c34de5475 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.26.1", + "version": "0.26.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e552cc4c2..0b32264ea 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.26.1", + "version": "0.26.2", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From ce6f8168d9519220c9ba7d78369e9b6fa27eb312 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 27 Sep 2019 10:10:14 -0700 Subject: [PATCH 171/545] Wait for copy and remove promises to finish --- generate/scripts/utils.js | 44 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/generate/scripts/utils.js b/generate/scripts/utils.js index 078ccf41e..90a96f23e 100644 --- a/generate/scripts/utils.js +++ b/generate/scripts/utils.js @@ -120,29 +120,35 @@ var util = { }, syncDirs: function(fromDir, toDir) { + let toFilePaths; + let fromFilePaths; return Promise.all([ util.getFilePathsRelativeToDir(toDir), util.getFilePathsRelativeToDir(fromDir) - ]).then(function(filePaths) { - const toFilePaths = filePaths[0]; - const fromFilePaths = filePaths[1]; - - // Delete files that aren't in fromDir - toFilePaths.forEach(function(filePath) { - if (!util.isFile(path.join(fromDir, filePath))) { - fse.remove(path.join(toDir, filePath)); - } + ]) + .then(function(filePaths) { + toFilePaths = filePaths[0]; + fromFilePaths = filePaths[1]; + + // Delete files that aren't in fromDir + return Promise.all(toFilePaths.map(function(filePath) { + if (!util.isFile(path.join(fromDir, filePath))) { + return fse.remove(path.join(toDir, filePath)); + } + return Promise.resolve(); + })); + }) + .then(function() { + // Copy files that don't exist in toDir or have different contents + return Promise.all(fromFilePaths.map(function(filePath) { + const toFilePath = path.join(toDir, filePath); + const fromFilePath = path.join(fromDir, filePath); + if (!util.isFile(toFilePath) || util.readFile(toFilePath) !== util.readFile(fromFilePath)) { + return fse.copy(fromFilePath, toFilePath); + } + return Promise.resolve(); + })); }); - - // Copy files that don't exist in toDir or have different contents - fromFilePaths.forEach(function(filePath) { - const toFilePath = path.join(toDir, filePath); - const fromFilePath = path.join(fromDir, filePath); - if (!util.isFile(toFilePath) || util.readFile(toFilePath) !== util.readFile(fromFilePath)) { - fse.copy(fromFilePath, toFilePath); - } - }); - }); } }; From ffcd894018ff75b664ec33118f71ce4223d5eb0b Mon Sep 17 00:00:00 2001 From: Ignacio Carbajo Date: Sun, 6 Oct 2019 22:43:25 +0800 Subject: [PATCH 172/545] Remove DiffList --- lib/tree.js | 4 ++-- test/tests/diff.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/tree.js b/lib/tree.js index 1be687075..43af49656 100644 --- a/lib/tree.js +++ b/lib/tree.js @@ -34,7 +34,7 @@ Tree.prototype.builder = function() { * @async * @param {Tree} tree to diff against * @param {Function} callback - * @return {DiffList} + * @return {Diff} */ Tree.prototype.diff = function(tree, callback) { return this.diffWithOptions(tree, null, callback); @@ -46,7 +46,7 @@ Tree.prototype.diff = function(tree, callback) { * @param {Tree} tree to diff against * @param {Object} options * @param {Function} callback - * @return {DiffList} + * @return {Diff} */ Tree.prototype.diffWithOptions = function(tree, options, callback) { return Diff.treeToTree(this.repo, tree, this, options).then(function(diff) { diff --git a/test/tests/diff.js b/test/tests/diff.js index 7eb243fc9..31aff3f64 100644 --- a/test/tests/diff.js +++ b/test/tests/diff.js @@ -112,7 +112,7 @@ describe("Diff", function() { }); }); - it("can walk a DiffList", function() { + it("can walk an Array", function() { return this.diff[0].patches() .then(function(patches) { var patch = patches[0]; From b5769a2a8caefcd7bcc7ca8c14d1fe32891b6f9e Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 10 Dec 2019 13:22:33 -0700 Subject: [PATCH 173/545] Bring in security patches from libgit2 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index eee2ed90e..ffddb85a7 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit eee2ed90eb4e32ab87eb7f178a7bde2af3593d38 +Subproject commit ffddb85a7269fee8844769fd64770e2a9ac9686d From 0de32949cf3b11d6c42748630dc6e0758cd554d6 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 10 Dec 2019 15:33:12 -0700 Subject: [PATCH 174/545] Bump to v0.26.3 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17e2172b3..7bb636da7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.26.3 [(2019-12-10)](https://github.com/nodegit/nodegit/releases/tag/v0.26.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.2...v0.26.3) + +#### Summary of changes +- Include LibGit2 security patch: https://github.com/libgit2/libgit2/releases/tag/v0.28.4 + +#### Merged PRs into NodeGit +- [Bring in security patches from libgit2 #1743](https://github.com/nodegit/nodegit/pull/1743) + + ## v0.26.2 [(2019-09-26)](https://github.com/nodegit/nodegit/releases/tag/v0.26.2) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.1...v0.26.2) diff --git a/package-lock.json b/package-lock.json index c34de5475..1c630eb3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.26.2", + "version": "0.26.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0b32264ea..bb7d1af02 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.26.2", + "version": "0.26.3", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From bdae09150bb7db3917fcba6567b8c7a6385d2a17 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 10 Dec 2019 16:21:38 -0700 Subject: [PATCH 175/545] Fix workflow for node 8 npm issue --- .github/workflows/tests.yml | 1 - .travis.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ca23b9126..89c64db28 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -83,7 +83,6 @@ jobs: git config --global core.autocrlf input git config --global user.name "John Doe" git config --global user.email johndoe@example.com - npm install -g node-pre-gyp aws-sdk - uses: actions/checkout@master diff --git a/.travis.yml b/.travis.yml index e1d7ff047..d9a203067 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ dist: xenial branches: only: - master - - /^v\d+\.\d+\.\d+(-alpha\.\d+)?$/ compiler: clang language: node_js From ec694ba59ba39abe56b2d536ddbe362d008a7d3d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 10 Jan 2020 17:03:41 -0700 Subject: [PATCH 176/545] Update libgit2 to latest master --- generate/input/descriptor.json | 7 + generate/input/libgit2-docs.json | 2882 +++++++++++++++--------------- generate/scripts/helpers.js | 3 +- vendor/libgit2 | 2 +- vendor/libgit2.gyp | 3 +- 5 files changed, 1448 insertions(+), 1449 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 5aaf5d0d9..b52112a38 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -485,6 +485,9 @@ "../include/git_buf_converter.h" ] }, + "cert": { + "needsForwardDeclaration": false + }, "cert_hostkey": { "fields": { "hash_md5": { @@ -494,6 +497,10 @@ "hash_sha1": { "cppClassName": "String", "size": 20 + }, + "hash_sha256": { + "cppClassName": "String", + "size": 32 } } }, diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index c84ff31ba..cb1361c66 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -23,7 +23,7 @@ "git_apply" ], "meta": {}, - "lines": 133 + "lines": 145 }, { "file": "git2/attr.h", @@ -96,7 +96,7 @@ "git_branch_upstream_remote" ], "meta": {}, - "lines": 288 + "lines": 305 }, { "file": "git2/buffer.h", @@ -110,6 +110,14 @@ "meta": {}, "lines": 128 }, + { + "file": "git2/cert.h", + "functions": [ + "git_transport_certificate_check_cb" + ], + "meta": {}, + "lines": 131 + }, { "file": "git2/checkout.h", "functions": [ @@ -245,6 +253,25 @@ "meta": {}, "lines": 762 }, + { + "file": "git2/cred.h", + "functions": [ + "git_cred_acquire_cb", + "git_cred_free", + "git_cred_has_username", + "git_cred_get_username", + "git_cred_userpass_plaintext_new", + "git_cred_default_new", + "git_cred_username_new", + "git_cred_ssh_key_new", + "git_cred_ssh_key_memory_new", + "git_cred_ssh_interactive_new", + "git_cred_ssh_key_from_agent", + "git_cred_ssh_custom_new" + ], + "meta": {}, + "lines": 304 + }, { "file": "git2/cred_helpers.h", "functions": [ @@ -269,7 +296,7 @@ "git_blame_init_options" ], "meta": {}, - "lines": 456 + "lines": 459 }, { "file": "git2/describe.h", @@ -329,7 +356,7 @@ "git_diff_patchid" ], "meta": {}, - "lines": 1502 + "lines": 1504 }, { "file": "git2/errors.h", @@ -547,7 +574,7 @@ "git_object_dup" ], "meta": {}, - "lines": 223 + "lines": 225 }, { "file": "git2/odb.h", @@ -704,7 +731,7 @@ "git_proxy_options_init" ], "meta": {}, - "lines": 92 + "lines": 94 }, { "file": "git2/rebase.h", @@ -1055,6 +1082,7 @@ "git_submodule_free", "git_submodule_foreach", "git_submodule_add_setup", + "git_submodule_clone", "git_submodule_add_finalize", "git_submodule_add_to_index", "git_submodule_owner", @@ -1083,7 +1111,7 @@ "git_submodule_location" ], "meta": {}, - "lines": 633 + "lines": 650 }, { "file": "git2/sys/filter.h", @@ -1177,21 +1205,11 @@ { "file": "git2/transport.h", "functions": [ - "git_transport_cb", - "git_cred_has_username", - "git_cred_userpass_plaintext_new", - "git_cred_ssh_key_new", - "git_cred_ssh_interactive_new", - "git_cred_ssh_key_from_agent", - "git_cred_ssh_custom_new", - "git_cred_default_new", - "git_cred_username_new", - "git_cred_ssh_key_memory_new", - "git_cred_free", - "git_cred_acquire_cb" + "git_transport_message_cb", + "git_transport_cb" ], "meta": {}, - "lines": 381 + "lines": 37 }, { "file": "git2/tree.h", @@ -1236,12 +1254,9 @@ }, { "file": "git2/types.h", - "functions": [ - "git_transport_message_cb", - "git_transport_certificate_check_cb" - ], + "functions": [], "meta": {}, - "lines": 412 + "lines": 357 }, { "file": "git2/worktree.h", @@ -1297,7 +1312,12 @@ }, "description": "

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", "comments": "", - "group": "annotated" + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_annotated_commit_from_ref-1" + ] + } }, "git_annotated_commit_from_fetchhead": { "type": "function", @@ -1428,7 +1448,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_id-1" + "ex/HEAD/checkout.html#git_annotated_commit_id-2" ], "merge.c": [ "ex/HEAD/merge.html#git_annotated_commit_id-1", @@ -1460,8 +1480,9 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_ref-2", - "ex/HEAD/checkout.html#git_annotated_commit_ref-3" + "ex/HEAD/checkout.html#git_annotated_commit_ref-3", + "ex/HEAD/checkout.html#git_annotated_commit_ref-4", + "ex/HEAD/checkout.html#git_annotated_commit_ref-5" ] } }, @@ -1488,15 +1509,15 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_free-4" + "ex/HEAD/checkout.html#git_annotated_commit_free-6" ] } }, "git_apply_to_tree": { "type": "function", "file": "git2/apply.h", - "line": 92, - "lineto": 97, + "line": 104, + "lineto": 109, "args": [ { "name": "out", @@ -1537,8 +1558,8 @@ "git_apply": { "type": "function", "file": "git2/apply.h", - "line": 129, - "lineto": 133, + "line": 141, + "lineto": 145, "args": [ { "name": "repo", @@ -2191,7 +2212,7 @@ "argline": "const git_blob *blob", "sig": "const git_blob *", "return": { - "type": "git_off_t", + "type": "git_object_size_t", "comment": " size on bytes" }, "description": "

Get the size in bytes of the contents of a blob

\n", @@ -2210,41 +2231,41 @@ ] } }, - "git_blob_filtered_content": { + "git_blob_filter": { "type": "function", - "file": "git2/deprecated.h", - "line": 94, - "lineto": 98, + "file": "git2/blob.h", + "line": 154, + "lineto": 158, "args": [ { "name": "out", "type": "git_buf *", - "comment": null + "comment": "The git_buf to be filled in" }, { "name": "blob", "type": "git_blob *", - "comment": null + "comment": "Pointer to the blob" }, { "name": "as_path", "type": "const char *", - "comment": null + "comment": "Path used for file attribute lookups, etc." }, { - "name": "check_for_binary_data", - "type": "int", - "comment": null + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "Options to use for filtering the blob" } ], - "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", - "sig": "git_buf *::git_blob *::const char *::int", + "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", + "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", "return": { "type": "int", - "comment": null + "comment": " 0 on success or an error code" }, - "description": "

Deprecated in favor of

\n", - "comments": "", + "description": "

Get a buffer with the filtered content of a blob.

\n", + "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", "group": "blob" }, "git_blob_create_from_workdir": { @@ -2538,7 +2559,12 @@ }, "description": "

Create a new branch pointing at a target commit

\n", "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", - "group": "branch" + "group": "branch", + "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_branch_create_from_annotated-7" + ] + } }, "git_branch_delete": { "type": "function", @@ -2559,7 +2585,7 @@ "comment": " 0 on success, or an error code." }, "description": "

Delete an existing branch reference.

\n", - "comments": "

If the branch is successfully deleted, the passed reference object will be invalidated. The reference must be freed manually by the user.

\n", + "comments": "

Note that if the deletion succeeds, the reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", "group": "branch" }, "git_branch_iterator_new": { @@ -2651,13 +2677,13 @@ "git_branch_move": { "type": "function", "file": "git2/branch.h", - "line": 138, - "lineto": 142, + "line": 144, + "lineto": 148, "args": [ { "name": "out", "type": "git_reference **", - "comment": null + "comment": "New reference object for the updated name." }, { "name": "branch", @@ -2682,14 +2708,14 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." }, "description": "

Move/rename an existing local branch reference.

\n", - "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

Note that if the move succeeds, the old reference object will not + be valid anymore, and should be freed immediately by the user using + git_reference_free().

\n", "group": "branch" }, "git_branch_lookup": { "type": "function", "file": "git2/branch.h", - "line": 165, - "lineto": 169, + "line": 168, + "lineto": 172, "args": [ { "name": "out", @@ -2719,34 +2745,34 @@ "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." }, "description": "

Lookup a branch by its name in a repository.

\n", - "comments": "

The generated reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "comments": "

The generated reference must be freed by the user. The branch name will be checked for validity.

\n", "group": "branch" }, "git_branch_name": { "type": "function", "file": "git2/branch.h", - "line": 186, - "lineto": 188, + "line": 189, + "lineto": 191, "args": [ { "name": "out", "type": "const char **", - "comment": "where the pointer of branch name is stored;\n this is valid as long as the ref is not freed." + "comment": "Pointer to the abbreviated reference name.\n Owned by ref, do not free." }, { "name": "ref", "type": "const git_reference *", - "comment": "the reference ideally pointing to a branch" + "comment": "A reference object, ideally pointing to a branch" } ], "argline": "const char **out, const git_reference *ref", "sig": "const char **::const git_reference *", "return": { "type": "int", - "comment": " 0 on success; otherwise an error code (e.g., if the\n ref is no local or remote branch)." + "comment": " 0 on success; GIT_EINVALID if the reference isn't either a local or\n remote branch, otherwise an error code." }, - "description": "

Return the name of the given local or remote branch.

\n", - "comments": "

The name of the branch matches the definition of the name for git_branch_lookup. That is, if the returned name is given to git_branch_lookup() then the reference is returned that was given to this function.

\n", + "description": "

Get the branch name

\n", + "comments": "

Given a reference object, this will check that it really is a branch (ie. it lives under "refs/heads/" or "refs/remotes/"), and return the branch part of it.

\n", "group": "branch", "examples": { "merge.c": [ @@ -2757,13 +2783,13 @@ "git_branch_upstream": { "type": "function", "file": "git2/branch.h", - "line": 202, - "lineto": 204, + "line": 207, + "lineto": 209, "args": [ { "name": "out", "type": "git_reference **", - "comment": "Pointer where to store the retrieved\n reference." + "comment": "Pointer where to store the retrieved reference." }, { "name": "branch", @@ -2775,17 +2801,17 @@ "sig": "git_reference **::const git_reference *", "return": { "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code." + "comment": " 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code." }, - "description": "

Return the reference supporting the remote tracking branch,\n given a local branch reference.

\n", - "comments": "", + "description": "

Get the upstream of a branch

\n", + "comments": "

Given a reference, this will return a new reference object corresponding to its remote tracking branch. The reference must be a local branch.

\n", "group": "branch" }, "git_branch_set_upstream": { "type": "function", "file": "git2/branch.h", - "line": 216, - "lineto": 216, + "line": 226, + "lineto": 228, "args": [ { "name": "branch", @@ -2793,36 +2819,36 @@ "comment": "the branch to configure" }, { - "name": "upstream_name", + "name": "branch_name", "type": "const char *", - "comment": "remote-tracking or local branch to set as\n upstream. Pass NULL to unset." + "comment": "remote-tracking or local branch to set as upstream." } ], - "argline": "git_reference *branch, const char *upstream_name", + "argline": "git_reference *branch, const char *branch_name", "sig": "git_reference *::const char *", "return": { "type": "int", - "comment": " 0 or an error code" + "comment": " 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" }, - "description": "

Set the upstream configuration for a given local branch

\n", - "comments": "", + "description": "

Set a branch's upstream branch

\n", + "comments": "

This will update the configuration to set the branch named branch_name as the upstream of branch. Pass a NULL name to unset the upstream information.

\n", "group": "branch" }, "git_branch_upstream_name": { "type": "function", "file": "git2/branch.h", - "line": 232, - "lineto": 235, + "line": 244, + "lineto": 247, "args": [ { "name": "out", "type": "git_buf *", - "comment": "Pointer to the user-allocated git_buf which will be\n filled with the name of the reference." + "comment": "the buffer into which the name will be written." }, { "name": "repo", "type": "git_repository *", - "comment": "the repository where the branches live" + "comment": "the repository where the branches live." }, { "name": "refname", @@ -2834,66 +2860,66 @@ "sig": "git_buf *::git_repository *::const char *", "return": { "type": "int", - "comment": " 0, GIT_ENOTFOUND when no remote tracking reference exists,\n otherwise an error code." + "comment": " 0 on success, GIT_ENOTFOUND when no remote tracking reference exists,\n or an error code." }, - "description": "

Return the name of the reference supporting the remote tracking branch,\n given the name of a local branch reference.

\n", - "comments": "", + "description": "

Get the upstream name of a branch

\n", + "comments": "

Given a local branch, this will return its remote-tracking branch information, as a full reference name, ie. "feature/nice" would become "refs/remote/origin/feature/nice", depending on that branch's configuration.

\n", "group": "branch" }, "git_branch_is_head": { "type": "function", "file": "git2/branch.h", - "line": 245, - "lineto": 246, + "line": 257, + "lineto": 258, "args": [ { "name": "branch", "type": "const git_reference *", - "comment": "Current underlying reference of the branch." + "comment": "A reference to a local branch." } ], "argline": "const git_reference *branch", "sig": "const git_reference *", "return": { "type": "int", - "comment": " 1 if HEAD points at the branch, 0 if it isn't,\n error code otherwise." + "comment": " 1 if HEAD points at the branch, 0 if it isn't, or a negative value\n \t\t as an error code." }, - "description": "

Determine if the current local branch is pointed at by HEAD.

\n", + "description": "

Determine if HEAD points to the given branch

\n", "comments": "", "group": "branch" }, "git_branch_is_checked_out": { "type": "function", "file": "git2/branch.h", - "line": 257, - "lineto": 258, + "line": 270, + "lineto": 271, "args": [ { "name": "branch", "type": "const git_reference *", - "comment": "Reference to the branch." + "comment": "A reference to a local branch." } ], "argline": "const git_reference *branch", "sig": "const git_reference *", "return": { "type": "int", - "comment": " 1 if branch is checked out, 0 if it isn't,\n error code otherwise." + "comment": " 1 if branch is checked out, 0 if it isn't, an error code otherwise." }, - "description": "

Determine if the current branch is checked out in any linked\n repository.

\n", - "comments": "", + "description": "

Determine if any HEAD points to the current branch

\n", + "comments": "

This will iterate over all known linked repositories (usually in the form of worktrees) and report whether any HEAD is pointing at the current branch.

\n", "group": "branch" }, "git_branch_remote_name": { "type": "function", "file": "git2/branch.h", - "line": 274, - "lineto": 277, + "line": 289, + "lineto": 292, "args": [ { "name": "out", "type": "git_buf *", - "comment": "Pointer to the user-allocated git_buf which will be filled with the name of the remote." + "comment": "The buffer into which the name will be written." }, { "name": "repo", @@ -2901,26 +2927,26 @@ "comment": "The repository where the branch lives." }, { - "name": "canonical_branch_name", + "name": "refname", "type": "const char *", - "comment": "name of the remote tracking branch." + "comment": "complete name of the remote tracking branch." } ], - "argline": "git_buf *out, git_repository *repo, const char *canonical_branch_name", + "argline": "git_buf *out, git_repository *repo, const char *refname", "sig": "git_buf *::git_repository *::const char *", "return": { "type": "int", - "comment": " 0, GIT_ENOTFOUND\n when no remote matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." + "comment": " 0 on success, GIT_ENOTFOUND when no matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." }, - "description": "

Return the name of remote that the remote tracking branch belongs to.

\n", - "comments": "", + "description": "

Find the remote name of a remote-tracking branch

\n", + "comments": "

This will return the name of the remote whose fetch refspec is matching the given branch. E.g. given a branch "refs/remotes/test/master", it will extract the "test" part. If refspecs from multiple remotes match, the function will return GIT_EAMBIGUOUS.

\n", "group": "branch" }, "git_branch_upstream_remote": { "type": "function", "file": "git2/branch.h", - "line": 288, - "lineto": 288, + "line": 305, + "lineto": 305, "args": [ { "name": "buf", @@ -2944,8 +2970,8 @@ "type": "int", "comment": " 0 or an error code" }, - "description": "

Retrieve the name of the upstream remote of a local branch

\n", - "comments": "", + "description": "

Retrieve the upstream remote of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", "group": "branch" }, "git_buf_dispose": { @@ -3201,7 +3227,7 @@ "group": "checkout", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_checkout_tree-5" + "ex/HEAD/checkout.html#git_checkout_tree-8" ], "merge.c": [ "ex/HEAD/merge.html#git_checkout_tree-5" @@ -3259,12 +3285,12 @@ { "name": "our_commit", "type": "git_commit *", - "comment": "the commit to revert against (eg, HEAD)" + "comment": "the commit to cherry-pick against (eg, HEAD)" }, { "name": "mainline", "type": "unsigned int", - "comment": "the parent of the revert commit, if it is a merge" + "comment": "the parent of the `cherrypick_commit`, if it is a merge" }, { "name": "merge_options", @@ -3411,7 +3437,7 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_lookup-6" + "ex/HEAD/checkout.html#git_commit_lookup-9" ], "general.c": [ "ex/HEAD/general.html#git_commit_lookup-6", @@ -3486,7 +3512,7 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_free-7" + "ex/HEAD/checkout.html#git_commit_free-10" ], "general.c": [ "ex/HEAD/general.html#git_commit_free-9", @@ -5882,6 +5908,348 @@ "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", "group": "config" }, + "git_cred_free": { + "type": "function", + "file": "git2/cred.h", + "line": 145, + "lineto": 145, + "args": [ + { + "name": "cred", + "type": "git_cred *", + "comment": "the object to free" + } + ], + "argline": "git_cred *cred", + "sig": "git_cred *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a credential.

\n", + "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", + "group": "cred" + }, + "git_cred_has_username": { + "type": "function", + "file": "git2/cred.h", + "line": 153, + "lineto": 153, + "args": [ + { + "name": "cred", + "type": "git_cred *", + "comment": "object to check" + } + ], + "argline": "git_cred *cred", + "sig": "git_cred *", + "return": { + "type": "int", + "comment": " 1 if the credential object has non-NULL username, 0 otherwise" + }, + "description": "

Check whether a credential object contains username information.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_get_username": { + "type": "function", + "file": "git2/cred.h", + "line": 161, + "lineto": 161, + "args": [ + { + "name": "cred", + "type": "git_cred *", + "comment": "object to check" + } + ], + "argline": "git_cred *cred", + "sig": "git_cred *", + "return": { + "type": "const char *", + "comment": " the credential username, or NULL if not applicable" + }, + "description": "

Return the username associated with a credential object.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_userpass_plaintext_new": { + "type": "function", + "file": "git2/cred.h", + "line": 172, + "lineto": 175, + "args": [ + { + "name": "out", + "type": "git_cred **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "The username of the credential." + }, + { + "name": "password", + "type": "const char *", + "comment": "The password of the credential." + } + ], + "argline": "git_cred **out, const char *username, const char *password", + "sig": "git_cred **::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_default_new": { + "type": "function", + "file": "git2/cred.h", + "line": 183, + "lineto": 183, + "args": [ + { + "name": "out", + "type": "git_cred **", + "comment": null + } + ], + "argline": "git_cred **out", + "sig": "git_cred **", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_username_new": { + "type": "function", + "file": "git2/cred.h", + "line": 191, + "lineto": 191, + "args": [ + { + "name": "cred", + "type": "git_cred **", + "comment": null + }, + { + "name": "username", + "type": "const char *", + "comment": null + } + ], + "argline": "git_cred **cred, const char *username", + "sig": "git_cred **::const char *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create a credential to specify a username.

\n", + "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", + "group": "cred" + }, + "git_cred_ssh_key_new": { + "type": "function", + "file": "git2/cred.h", + "line": 204, + "lineto": 209, + "args": [ + { + "name": "out", + "type": "git_cred **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The path to the public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The path to the private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_cred **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_ssh_key_memory_new": { + "type": "function", + "file": "git2/cred.h", + "line": 221, + "lineto": 226, + "args": [ + { + "name": "out", + "type": "git_cred **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate." + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_cred **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object reading the keys from memory.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_ssh_interactive_new": { + "type": "function", + "file": "git2/cred.h", + "line": 256, + "lineto": 260, + "args": [ + { + "name": "out", + "type": "git_cred **", + "comment": null + }, + { + "name": "username", + "type": "const char *", + "comment": "Username to use to authenticate." + }, + { + "name": "prompt_callback", + "type": "git_cred_ssh_interactive_cb", + "comment": "The callback method used for prompts." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_cred **out, const char *username, git_cred_ssh_interactive_cb prompt_callback, void *payload", + "sig": "git_cred **::const char *::git_cred_ssh_interactive_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure." + }, + "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_ssh_key_from_agent": { + "type": "function", + "file": "git2/cred.h", + "line": 270, + "lineto": 272, + "args": [ + { + "name": "out", + "type": "git_cred **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + } + ], + "argline": "git_cred **out, const char *username", + "sig": "git_cred **::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "cred" + }, + "git_cred_ssh_custom_new": { + "type": "function", + "file": "git2/cred.h", + "line": 298, + "lineto": 304, + "args": [ + { + "name": "out", + "type": "git_cred **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The bytes of the public key." + }, + { + "name": "publickey_len", + "type": "size_t", + "comment": "The length of the public key in bytes." + }, + { + "name": "sign_callback", + "type": "git_cred_sign_cb", + "comment": "The callback method to sign the data during the challenge." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_cred **out, const char *username, const char *publickey, size_t publickey_len, git_cred_sign_cb sign_callback, void *payload", + "sig": "git_cred **::const char *::const char *::size_t::git_cred_sign_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create an ssh key credential with a custom signing function.

\n", + "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", + "group": "cred" + }, "git_cred_userpass": { "type": "function", "file": "git2/cred_helpers.h", @@ -5927,8 +6295,8 @@ "git_blob_create_fromworkdir": { "type": "function", "file": "git2/deprecated.h", - "line": 81, - "lineto": 81, + "line": 84, + "lineto": 84, "args": [ { "name": "id", @@ -5956,11 +6324,48 @@ "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility values at this time.

\n\n

@{

\n", "group": "blob" }, + "git_blob_filtered_content": { + "type": "function", + "file": "git2/deprecated.h", + "line": 97, + "lineto": 101, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "blob", + "type": "git_blob *", + "comment": null + }, + { + "name": "as_path", + "type": "const char *", + "comment": null + }, + { + "name": "check_for_binary_data", + "type": "int", + "comment": null + } + ], + "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", + "sig": "git_buf *::git_blob *::const char *::int", + "return": { + "type": "int", + "comment": null + }, + "description": "

Deprecated in favor of

\n", + "comments": "", + "group": "blob" + }, "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 123, - "lineto": 123, + "line": 126, + "lineto": 126, "args": [ { "name": "buffer", @@ -5981,8 +6386,8 @@ "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 197, - "lineto": 197, + "line": 200, + "lineto": 200, "args": [], "argline": "", "sig": "", @@ -5997,8 +6402,8 @@ "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 209, - "lineto": 209, + "line": 212, + "lineto": 212, "args": [], "argline": "", "sig": "", @@ -6013,8 +6418,8 @@ "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 221, - "lineto": 221, + "line": 224, + "lineto": 224, "args": [ { "name": "error_class", @@ -6040,8 +6445,8 @@ "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 233, - "lineto": 233, + "line": 236, + "lineto": 236, "args": [], "argline": "", "sig": "", @@ -6056,8 +6461,8 @@ "git_object__size": { "type": "function", "file": "git2/deprecated.h", - "line": 323, - "lineto": 323, + "line": 326, + "lineto": 326, "args": [ { "name": "type", @@ -6078,8 +6483,8 @@ "git_oid_iszero": { "type": "function", "file": "git2/deprecated.h", - "line": 397, - "lineto": 397, + "line": 400, + "lineto": 400, "args": [ { "name": "id", @@ -6100,8 +6505,8 @@ "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 456, - "lineto": 456, + "line": 459, + "lineto": 459, "args": [ { "name": "opts", @@ -6906,8 +7311,8 @@ "git_diff_print": { "type": "function", "file": "git2/diff.h", - "line": 1110, - "lineto": 1114, + "line": 1111, + "lineto": 1115, "args": [ { "name": "diff", @@ -6951,8 +7356,8 @@ "git_diff_to_buf": { "type": "function", "file": "git2/diff.h", - "line": 1126, - "lineto": 1129, + "line": 1127, + "lineto": 1130, "args": [ { "name": "out", @@ -6983,8 +7388,8 @@ "git_diff_blobs": { "type": "function", "file": "git2/diff.h", - "line": 1166, - "lineto": 1176, + "line": 1167, + "lineto": 1177, "args": [ { "name": "old_blob", @@ -7050,8 +7455,8 @@ "git_diff_blob_to_buffer": { "type": "function", "file": "git2/diff.h", - "line": 1203, - "lineto": 1214, + "line": 1204, + "lineto": 1215, "args": [ { "name": "old_blob", @@ -7122,8 +7527,8 @@ "git_diff_buffers": { "type": "function", "file": "git2/diff.h", - "line": 1237, - "lineto": 1249, + "line": 1238, + "lineto": 1250, "args": [ { "name": "old_buffer", @@ -7199,8 +7604,8 @@ "git_diff_from_buffer": { "type": "function", "file": "git2/diff.h", - "line": 1270, - "lineto": 1273, + "line": 1271, + "lineto": 1274, "args": [ { "name": "out", @@ -7236,8 +7641,8 @@ "git_diff_get_stats": { "type": "function", "file": "git2/diff.h", - "line": 1309, - "lineto": 1311, + "line": 1310, + "lineto": 1312, "args": [ { "name": "out", @@ -7268,8 +7673,8 @@ "git_diff_stats_files_changed": { "type": "function", "file": "git2/diff.h", - "line": 1319, - "lineto": 1320, + "line": 1320, + "lineto": 1321, "args": [ { "name": "stats", @@ -7290,8 +7695,8 @@ "git_diff_stats_insertions": { "type": "function", "file": "git2/diff.h", - "line": 1328, - "lineto": 1329, + "line": 1329, + "lineto": 1330, "args": [ { "name": "stats", @@ -7312,8 +7717,8 @@ "git_diff_stats_deletions": { "type": "function", "file": "git2/diff.h", - "line": 1337, - "lineto": 1338, + "line": 1338, + "lineto": 1339, "args": [ { "name": "stats", @@ -7334,8 +7739,8 @@ "git_diff_stats_to_buf": { "type": "function", "file": "git2/diff.h", - "line": 1349, - "lineto": 1353, + "line": 1350, + "lineto": 1354, "args": [ { "name": "out", @@ -7376,8 +7781,8 @@ "git_diff_stats_free": { "type": "function", "file": "git2/diff.h", - "line": 1361, - "lineto": 1361, + "line": 1362, + "lineto": 1362, "args": [ { "name": "stats", @@ -7403,8 +7808,8 @@ "git_diff_format_email": { "type": "function", "file": "git2/diff.h", - "line": 1413, - "lineto": 1416, + "line": 1415, + "lineto": 1418, "args": [ { "name": "out", @@ -7435,8 +7840,8 @@ "git_diff_commit_as_email": { "type": "function", "file": "git2/diff.h", - "line": 1432, - "lineto": 1439, + "line": 1434, + "lineto": 1441, "args": [ { "name": "out", @@ -7465,7 +7870,7 @@ }, { "name": "flags", - "type": "git_diff_format_email_flags_t", + "type": "uint32_t", "comment": "determines the formatting of the e-mail" }, { @@ -7474,8 +7879,8 @@ "comment": "structure with options to influence diff or NULL for defaults." } ], - "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, git_diff_format_email_flags_t flags, const git_diff_options *diff_opts", - "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::git_diff_format_email_flags_t::const git_diff_options *", + "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", + "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", "return": { "type": "int", "comment": " 0 or an error code" @@ -7487,8 +7892,8 @@ "git_diff_format_email_options_init": { "type": "function", "file": "git2/diff.h", - "line": 1451, - "lineto": 1453, + "line": 1453, + "lineto": 1455, "args": [ { "name": "opts", @@ -7514,8 +7919,8 @@ "git_diff_patchid_options_init": { "type": "function", "file": "git2/diff.h", - "line": 1479, - "lineto": 1481, + "line": 1481, + "lineto": 1483, "args": [ { "name": "opts", @@ -7541,8 +7946,8 @@ "git_diff_patchid": { "type": "function", "file": "git2/diff.h", - "line": 1502, - "lineto": 1502, + "line": 1504, + "lineto": 1504, "args": [ { "name": "out", @@ -7587,10 +7992,10 @@ "group": "error", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_error_last-8", - "ex/HEAD/checkout.html#git_error_last-9", - "ex/HEAD/checkout.html#git_error_last-10", - "ex/HEAD/checkout.html#git_error_last-11" + "ex/HEAD/checkout.html#git_error_last-11", + "ex/HEAD/checkout.html#git_error_last-12", + "ex/HEAD/checkout.html#git_error_last-13", + "ex/HEAD/checkout.html#git_error_last-14" ], "general.c": [ "ex/HEAD/general.html#git_error_last-33" @@ -11088,8 +11493,8 @@ "git_object_lookup": { "type": "function", "file": "git2/object.h", - "line": 42, - "lineto": 46, + "line": 44, + "lineto": 48, "args": [ { "name": "object", @@ -11133,8 +11538,8 @@ "git_object_lookup_prefix": { "type": "function", "file": "git2/object.h", - "line": 75, - "lineto": 80, + "line": 77, + "lineto": 82, "args": [ { "name": "object_out", @@ -11175,8 +11580,8 @@ "git_object_lookup_bypath": { "type": "function", "file": "git2/object.h", - "line": 93, - "lineto": 97, + "line": 95, + "lineto": 99, "args": [ { "name": "out", @@ -11212,8 +11617,8 @@ "git_object_id": { "type": "function", "file": "git2/object.h", - "line": 105, - "lineto": 105, + "line": 107, + "lineto": 107, "args": [ { "name": "obj", @@ -11259,8 +11664,8 @@ "git_object_short_id": { "type": "function", "file": "git2/object.h", - "line": 119, - "lineto": 119, + "line": 121, + "lineto": 121, "args": [ { "name": "out", @@ -11291,8 +11696,8 @@ "git_object_type": { "type": "function", "file": "git2/object.h", - "line": 127, - "lineto": 127, + "line": 129, + "lineto": 129, "args": [ { "name": "obj", @@ -11323,8 +11728,8 @@ "git_object_owner": { "type": "function", "file": "git2/object.h", - "line": 141, - "lineto": 141, + "line": 143, + "lineto": 143, "args": [ { "name": "obj", @@ -11345,8 +11750,8 @@ "git_object_free": { "type": "function", "file": "git2/object.h", - "line": 158, - "lineto": 158, + "line": 160, + "lineto": 160, "args": [ { "name": "object", @@ -11398,8 +11803,8 @@ "git_object_type2string": { "type": "function", "file": "git2/object.h", - "line": 169, - "lineto": 169, + "line": 171, + "lineto": 171, "args": [ { "name": "type", @@ -11432,8 +11837,8 @@ "git_object_string2type": { "type": "function", "file": "git2/object.h", - "line": 177, - "lineto": 177, + "line": 179, + "lineto": 179, "args": [ { "name": "str", @@ -11454,8 +11859,8 @@ "git_object_typeisloose": { "type": "function", "file": "git2/object.h", - "line": 186, - "lineto": 186, + "line": 188, + "lineto": 188, "args": [ { "name": "type", @@ -11476,8 +11881,8 @@ "git_object_peel": { "type": "function", "file": "git2/object.h", - "line": 211, - "lineto": 214, + "line": 213, + "lineto": 216, "args": [ { "name": "peeled", @@ -11508,8 +11913,8 @@ "git_object_dup": { "type": "function", "file": "git2/object.h", - "line": 223, - "lineto": 223, + "line": 225, + "lineto": 225, "args": [ { "name": "dest", @@ -11967,7 +12372,7 @@ }, { "name": "size", - "type": "git_off_t", + "type": "git_object_size_t", "comment": "final size of the object that will be written" }, { @@ -11976,8 +12381,8 @@ "comment": "type of the object that will be written" } ], - "argline": "git_odb_stream **out, git_odb *db, git_off_t size, git_object_t type", - "sig": "git_odb_stream **::git_odb *::git_off_t::git_object_t", + "argline": "git_odb_stream **out, git_odb *db, git_object_size_t size, git_object_t type", + "sig": "git_odb_stream **::git_odb *::git_object_size_t::git_object_t", "return": { "type": "int", "comment": " 0 if the stream was created; error code otherwise" @@ -14554,8 +14959,8 @@ "git_proxy_options_init": { "type": "function", "file": "git2/proxy.h", - "line": 92, - "lineto": 92, + "line": 94, + "lineto": 94, "args": [ { "name": "opts", @@ -15486,6 +15891,10 @@ "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_reference_lookup-15", + "ex/HEAD/checkout.html#git_reference_lookup-16" + ], "general.c": [ "ex/HEAD/general.html#git_reference_lookup-62" ], @@ -15894,6 +16303,9 @@ "comments": "

See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_reference_name-17" + ], "merge.c": [ "ex/HEAD/merge.html#git_reference_name-25" ] @@ -16263,6 +16675,11 @@ "comments": "", "group": "reference", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_reference_free-18", + "ex/HEAD/checkout.html#git_reference_free-19", + "ex/HEAD/checkout.html#git_reference_free-20" + ], "general.c": [ "ex/HEAD/general.html#git_reference_free-67" ], @@ -16571,7 +16988,12 @@ }, "description": "

Check if a reference is a remote tracking branch

\n", "comments": "", - "group": "reference" + "group": "reference", + "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_reference_is_remote-21" + ] + } }, "git_reference_is_tag": { "type": "function", @@ -17852,6 +18274,9 @@ "comments": "

The string array must be freed by the user.

\n", "group": "remote", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_remote_list-22" + ], "remote.c": [ "ex/HEAD/remote.html#git_remote_list-8" ] @@ -19423,7 +19848,7 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head-12" + "ex/HEAD/checkout.html#git_repository_set_head-23" ] } }, @@ -19482,7 +19907,7 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-13" + "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-24" ] } }, @@ -19531,7 +19956,7 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_state-14" + "ex/HEAD/checkout.html#git_repository_state-25" ], "merge.c": [ "ex/HEAD/merge.html#git_repository_state-35" @@ -21231,6 +21656,9 @@ "comments": "

This method should be called on git_strarray objects where the strings array is allocated and contains allocated strings, such as what you would get from git_strarray_copy(). Not doing so, will result in a memory leak.

\n\n

This does not free the git_strarray itself, since the library will never allocate that object directly itself (it is more commonly embedded inside another struct or created on the stack).

\n", "group": "strarray", "examples": { + "checkout.c": [ + "ex/HEAD/checkout.html#git_strarray_free-26" + ], "general.c": [ "ex/HEAD/general.html#git_strarray_free-83" ], @@ -21423,8 +21851,8 @@ "git_submodule_add_setup": { "type": "function", "file": "git2/submodule.h", - "line": 281, - "lineto": 286, + "line": 282, + "lineto": 287, "args": [ { "name": "out", @@ -21459,14 +21887,46 @@ "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." }, "description": "

Set up a new git submodule for checkout.

\n", - "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed. Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", + "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed (if you don't need anything custom see git_submodule_add_clone()). Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", + "group": "submodule" + }, + "git_submodule_clone": { + "type": "function", + "file": "git2/submodule.h", + "line": 300, + "lineto": 303, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "The newly created repository object. Optional." + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule currently waiting for its clone." + }, + { + "name": "opts", + "type": "const git_submodule_update_options *", + "comment": "The options to use." + } + ], + "argline": "git_repository **out, git_submodule *submodule, const git_submodule_update_options *opts", + "sig": "git_repository **::git_submodule *::const git_submodule_update_options *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on other errors (see git_clone)." + }, + "description": "

Perform the clone step for a newly created submodule.

\n", + "comments": "

This performs the necessary git_clone to setup a newly-created submodule.

\n", "group": "submodule" }, "git_submodule_add_finalize": { "type": "function", "file": "git2/submodule.h", - "line": 298, - "lineto": 298, + "line": 315, + "lineto": 315, "args": [ { "name": "submodule", @@ -21487,8 +21947,8 @@ "git_submodule_add_to_index": { "type": "function", "file": "git2/submodule.h", - "line": 310, - "lineto": 312, + "line": 327, + "lineto": 329, "args": [ { "name": "submodule", @@ -21514,8 +21974,8 @@ "git_submodule_owner": { "type": "function", "file": "git2/submodule.h", - "line": 325, - "lineto": 325, + "line": 342, + "lineto": 342, "args": [ { "name": "submodule", @@ -21536,8 +21996,8 @@ "git_submodule_name": { "type": "function", "file": "git2/submodule.h", - "line": 333, - "lineto": 333, + "line": 350, + "lineto": 350, "args": [ { "name": "submodule", @@ -21563,8 +22023,8 @@ "git_submodule_path": { "type": "function", "file": "git2/submodule.h", - "line": 344, - "lineto": 344, + "line": 361, + "lineto": 361, "args": [ { "name": "submodule", @@ -21590,8 +22050,8 @@ "git_submodule_url": { "type": "function", "file": "git2/submodule.h", - "line": 352, - "lineto": 352, + "line": 369, + "lineto": 369, "args": [ { "name": "submodule", @@ -21612,8 +22072,8 @@ "git_submodule_resolve_url": { "type": "function", "file": "git2/submodule.h", - "line": 362, - "lineto": 362, + "line": 379, + "lineto": 379, "args": [ { "name": "out", @@ -21644,8 +22104,8 @@ "git_submodule_branch": { "type": "function", "file": "git2/submodule.h", - "line": 370, - "lineto": 370, + "line": 387, + "lineto": 387, "args": [ { "name": "submodule", @@ -21666,8 +22126,8 @@ "git_submodule_set_branch": { "type": "function", "file": "git2/submodule.h", - "line": 383, - "lineto": 383, + "line": 400, + "lineto": 400, "args": [ { "name": "repo", @@ -21698,8 +22158,8 @@ "git_submodule_set_url": { "type": "function", "file": "git2/submodule.h", - "line": 397, - "lineto": 397, + "line": 414, + "lineto": 414, "args": [ { "name": "repo", @@ -21730,8 +22190,8 @@ "git_submodule_index_id": { "type": "function", "file": "git2/submodule.h", - "line": 405, - "lineto": 405, + "line": 422, + "lineto": 422, "args": [ { "name": "submodule", @@ -21752,8 +22212,8 @@ "git_submodule_head_id": { "type": "function", "file": "git2/submodule.h", - "line": 413, - "lineto": 413, + "line": 430, + "lineto": 430, "args": [ { "name": "submodule", @@ -21774,8 +22234,8 @@ "git_submodule_wd_id": { "type": "function", "file": "git2/submodule.h", - "line": 426, - "lineto": 426, + "line": 443, + "lineto": 443, "args": [ { "name": "submodule", @@ -21796,8 +22256,8 @@ "git_submodule_ignore": { "type": "function", "file": "git2/submodule.h", - "line": 451, - "lineto": 452, + "line": 468, + "lineto": 469, "args": [ { "name": "submodule", @@ -21818,8 +22278,8 @@ "git_submodule_set_ignore": { "type": "function", "file": "git2/submodule.h", - "line": 464, - "lineto": 467, + "line": 481, + "lineto": 484, "args": [ { "name": "repo", @@ -21850,8 +22310,8 @@ "git_submodule_update_strategy": { "type": "function", "file": "git2/submodule.h", - "line": 479, - "lineto": 480, + "line": 496, + "lineto": 497, "args": [ { "name": "submodule", @@ -21872,8 +22332,8 @@ "git_submodule_set_update": { "type": "function", "file": "git2/submodule.h", - "line": 492, - "lineto": 495, + "line": 509, + "lineto": 512, "args": [ { "name": "repo", @@ -21904,8 +22364,8 @@ "git_submodule_fetch_recurse_submodules": { "type": "function", "file": "git2/submodule.h", - "line": 508, - "lineto": 509, + "line": 525, + "lineto": 526, "args": [ { "name": "submodule", @@ -21926,8 +22386,8 @@ "git_submodule_set_fetch_recurse_submodules": { "type": "function", "file": "git2/submodule.h", - "line": 521, - "lineto": 524, + "line": 538, + "lineto": 541, "args": [ { "name": "repo", @@ -21958,8 +22418,8 @@ "git_submodule_init": { "type": "function", "file": "git2/submodule.h", - "line": 539, - "lineto": 539, + "line": 556, + "lineto": 556, "args": [ { "name": "submodule", @@ -21985,8 +22445,8 @@ "git_submodule_repo_init": { "type": "function", "file": "git2/submodule.h", - "line": 554, - "lineto": 557, + "line": 571, + "lineto": 574, "args": [ { "name": "out", @@ -22017,8 +22477,8 @@ "git_submodule_sync": { "type": "function", "file": "git2/submodule.h", - "line": 567, - "lineto": 567, + "line": 584, + "lineto": 584, "args": [ { "name": "submodule", @@ -22039,8 +22499,8 @@ "git_submodule_open": { "type": "function", "file": "git2/submodule.h", - "line": 581, - "lineto": 583, + "line": 598, + "lineto": 600, "args": [ { "name": "repo", @@ -22066,8 +22526,8 @@ "git_submodule_reload": { "type": "function", "file": "git2/submodule.h", - "line": 595, - "lineto": 595, + "line": 612, + "lineto": 612, "args": [ { "name": "submodule", @@ -22093,8 +22553,8 @@ "git_submodule_status": { "type": "function", "file": "git2/submodule.h", - "line": 611, - "lineto": 615, + "line": 628, + "lineto": 632, "args": [ { "name": "status", @@ -22135,8 +22595,8 @@ "git_submodule_location": { "type": "function", "file": "git2/submodule.h", - "line": 631, - "lineto": 633, + "line": 648, + "lineto": 650, "args": [ { "name": "location_status", @@ -23125,326 +23585,6 @@ "comments": "

If any references remain locked, they will be unlocked without any changes made to them.

\n", "group": "transaction" }, - "git_cred_has_username": { - "type": "function", - "file": "git2/transport.h", - "line": 233, - "lineto": 233, - "args": [ - { - "name": "cred", - "type": "git_cred *", - "comment": "object to check" - } - ], - "argline": "git_cred *cred", - "sig": "git_cred *", - "return": { - "type": "int", - "comment": " 1 if the credential object has non-NULL username, 0 otherwise" - }, - "description": "

Check whether a credential object contains username information.

\n", - "comments": "", - "group": "cred" - }, - "git_cred_userpass_plaintext_new": { - "type": "function", - "file": "git2/transport.h", - "line": 244, - "lineto": 247, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "The username of the credential." - }, - { - "name": "password", - "type": "const char *", - "comment": "The password of the credential." - } - ], - "argline": "git_cred **out, const char *username, const char *password", - "sig": "git_cred **::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "cred" - }, - "git_cred_ssh_key_new": { - "type": "function", - "file": "git2/transport.h", - "line": 260, - "lineto": 265, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The path to the public key of the credential." - }, - { - "name": "privatekey", - "type": "const char *", - "comment": "The path to the private key of the credential." - }, - { - "name": "passphrase", - "type": "const char *", - "comment": "The passphrase of the credential." - } - ], - "argline": "git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_cred **::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "cred" - }, - "git_cred_ssh_interactive_new": { - "type": "function", - "file": "git2/transport.h", - "line": 276, - "lineto": 280, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": null - }, - { - "name": "username", - "type": "const char *", - "comment": "Username to use to authenticate." - }, - { - "name": "prompt_callback", - "type": "git_cred_ssh_interactive_cb", - "comment": "The callback method used for prompts." - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback." - } - ], - "argline": "git_cred **out, const char *username, git_cred_ssh_interactive_cb prompt_callback, void *payload", - "sig": "git_cred **::const char *::git_cred_ssh_interactive_cb::void *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure." - }, - "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "cred" - }, - "git_cred_ssh_key_from_agent": { - "type": "function", - "file": "git2/transport.h", - "line": 290, - "lineto": 292, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - } - ], - "argline": "git_cred **out, const char *username", - "sig": "git_cred **::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "cred" - }, - "git_cred_ssh_custom_new": { - "type": "function", - "file": "git2/transport.h", - "line": 312, - "lineto": 318, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The bytes of the public key." - }, - { - "name": "publickey_len", - "type": "size_t", - "comment": "The length of the public key in bytes." - }, - { - "name": "sign_callback", - "type": "git_cred_sign_cb", - "comment": "The callback method to sign the data during the challenge." - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback." - } - ], - "argline": "git_cred **out, const char *username, const char *publickey, size_t publickey_len, git_cred_sign_cb sign_callback, void *payload", - "sig": "git_cred **::const char *::const char *::size_t::git_cred_sign_cb::void *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create an ssh key credential with a custom signing function.

\n", - "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", - "group": "cred" - }, - "git_cred_default_new": { - "type": "function", - "file": "git2/transport.h", - "line": 326, - "lineto": 326, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": null - } - ], - "argline": "git_cred **out", - "sig": "git_cred **", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", - "comments": "", - "group": "cred" - }, - "git_cred_username_new": { - "type": "function", - "file": "git2/transport.h", - "line": 334, - "lineto": 334, - "args": [ - { - "name": "cred", - "type": "git_cred **", - "comment": null - }, - { - "name": "username", - "type": "const char *", - "comment": null - } - ], - "argline": "git_cred **cred, const char *username", - "sig": "git_cred **::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a credential to specify a username.

\n", - "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", - "group": "cred" - }, - "git_cred_ssh_key_memory_new": { - "type": "function", - "file": "git2/transport.h", - "line": 346, - "lineto": 351, - "args": [ - { - "name": "out", - "type": "git_cred **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate." - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The public key of the credential." - }, - { - "name": "privatekey", - "type": "const char *", - "comment": "The private key of the credential." - }, - { - "name": "passphrase", - "type": "const char *", - "comment": "The passphrase of the credential." - } - ], - "argline": "git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_cred **::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new ssh key credential object reading the keys from memory.

\n", - "comments": "", - "group": "cred" - }, - "git_cred_free": { - "type": "function", - "file": "git2/transport.h", - "line": 362, - "lineto": 362, - "args": [ - { - "name": "cred", - "type": "git_cred *", - "comment": "the object to free" - } - ], - "argline": "git_cred *cred", - "sig": "git_cred *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a credential.

\n", - "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", - "group": "cred" - }, "git_tree_lookup": { "type": "function", "file": "git2/tree.h", @@ -24805,43 +24945,6 @@ "description": "

Prune working tree

\n", "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", "group": "worktree" - }, - "git_blob_filter": { - "type": "function", - "file": "git2/blob.h", - "line": 154, - "lineto": 158, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The git_buf to be filled in" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "Pointer to the blob" - }, - { - "name": "as_path", - "type": "const char *", - "comment": "Path used for file attribute lookups, etc." - }, - { - "name": "opts", - "type": "git_blob_filter_options *", - "comment": "Options to use for filtering the blob" - } - ], - "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", - "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Get a buffer with the filtered content of a blob.

\n", - "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", - "group": "blob" } }, "callbacks": { @@ -24928,6 +25031,42 @@ "description": "

The callback used with git_attr_foreach.

\n", "comments": "

This callback will be invoked only once per attribute name, even if there are multiple rules for a given file. The highest priority rule will be used.

\n" }, + "git_transport_certificate_check_cb": { + "type": "callback", + "file": "git2/cert.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "cert", + "type": "struct git_cert *", + "comment": "The host certificate" + }, + { + "name": "valid", + "type": "int", + "comment": "Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid" + }, + { + "name": "host", + "type": "const char *", + "comment": "Hostname of the host libgit2 connected to" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "struct git_cert *cert, int valid, const char *host, void *payload", + "sig": "struct git_cert *::int::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" + }, + "description": "

Callback for the user's custom certificate checks.

\n", + "comments": "" + }, "git_checkout_notify_cb": { "type": "callback", "file": "git2/checkout.h", @@ -25175,11 +25314,52 @@ "description": "

A config enumeration callback

\n", "comments": "" }, + "git_cred_acquire_cb": { + "type": "callback", + "file": "git2/cred.h", + "line": 130, + "lineto": 135, + "args": [ + { + "name": "cred", + "type": "git_cred **", + "comment": "The newly created credential object." + }, + { + "name": "url", + "type": "const char *", + "comment": "The resource for which we are demanding a credential." + }, + { + "name": "username_from_url", + "type": "const char *", + "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." + }, + { + "name": "allowed_types", + "type": "unsigned int", + "comment": "A bitmask stating which cred types are OK to return." + }, + { + "name": "payload", + "type": "void *", + "comment": "The payload provided when specifying this callback." + } + ], + "argline": "git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", + "sig": "git_cred **::const char *::const char *::unsigned int::void *", + "return": { + "type": "int", + "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" + }, + "description": "

Credential acquisition callback.

\n", + "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_cred object back, depending on allowed_types (a git_credtype_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" + }, "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 442, - "lineto": 442, + "line": 445, + "lineto": 445, "args": [ { "name": "rhead", @@ -26043,11 +26223,42 @@ "description": "

An instance for a tracing function

\n", "comments": "" }, + "git_transport_message_cb": { + "type": "callback", + "file": "git2/transport.h", + "line": 34, + "lineto": 34, + "args": [ + { + "name": "str", + "type": "const char *", + "comment": "The message from the transport" + }, + { + "name": "len", + "type": "int", + "comment": "The length of the message" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "const char *str, int len, void *payload", + "sig": "const char *::int::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for messages recieved by the transport.

\n", + "comments": "

Return a negative value to cancel the network operation.

\n" + }, "git_transport_cb": { "type": "callback", "file": "git2/transport.h", - "line": 24, - "lineto": 24, + "line": 37, + "lineto": 37, "args": [ { "name": "out", @@ -26074,47 +26285,6 @@ "description": "

Signature of a function which creates a transport

\n", "comments": "" }, - "git_cred_acquire_cb": { - "type": "callback", - "file": "git2/transport.h", - "line": 376, - "lineto": 381, - "args": [ - { - "name": "cred", - "type": "git_cred **", - "comment": "The newly created credential object." - }, - { - "name": "url", - "type": "const char *", - "comment": "The resource for which we are demanding a credential." - }, - { - "name": "username_from_url", - "type": "const char *", - "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." - }, - { - "name": "allowed_types", - "type": "unsigned int", - "comment": "A bitmask stating which cred types are OK to return." - }, - { - "name": "payload", - "type": "void *", - "comment": "The payload provided when specifying this callback." - } - ], - "argline": "git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", - "sig": "git_cred **::const char *::const char *::unsigned int::void *", - "return": { - "type": "int", - "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" - }, - "description": "

Signature of a function which acquires a credential object.

\n", - "comments": "" - }, "git_treebuilder_filter_cb": { "type": "callback", "file": "git2/tree.h", @@ -26171,73 +26341,6 @@ }, "description": "

Callback for the tree traversal method

\n", "comments": "" - }, - "git_transport_message_cb": { - "type": "callback", - "file": "git2/types.h", - "line": 255, - "lineto": 255, - "args": [ - { - "name": "str", - "type": "const char *", - "comment": "The message from the transport" - }, - { - "name": "len", - "type": "int", - "comment": "The length of the message" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "const char *str, int len, void *payload", - "sig": "const char *::int::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Type for messages delivered by the transport. Return a negative value\n to cancel the network operation.

\n", - "comments": "" - }, - "git_transport_certificate_check_cb": { - "type": "callback", - "file": "git2/types.h", - "line": 308, - "lineto": 308, - "args": [ - { - "name": "cert", - "type": "git_cert *", - "comment": "The host certificate" - }, - { - "name": "valid", - "type": "int", - "comment": "Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid" - }, - { - "name": "host", - "type": "const char *", - "comment": "Hostname of the host libgit2 connected to" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "git_cert *cert, int valid, const char *host, void *payload", - "sig": "git_cert *::int::const char *::void *", - "return": { - "type": "int", - "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" - }, - "description": "

Callback for the user's custom certificate checks.

\n", - "comments": "" } }, "globals": {}, @@ -26249,8 +26352,8 @@ "type": "struct", "value": "git_annotated_commit", "file": "git2/types.h", - "line": 186, - "lineto": 186, + "line": 189, + "lineto": 189, "tdef": "typedef", "description": " Annotated commits, the input to merge and rebase. ", "comments": "", @@ -26275,6 +26378,34 @@ } } ], + [ + "git_apply_flags_t", + { + "decl": [ + "GIT_APPLY_CHECK" + ], + "type": "enum", + "file": "git2/apply.h", + "line": 57, + "lineto": 63, + "block": "GIT_APPLY_CHECK", + "tdef": "typedef", + "description": " Flags controlling the behavior of git_apply ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_CHECK", + "comments": "

Don't actually make changes, just test that the patch applies.\n This is the equivalent of git apply --check.

\n", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_apply_location_t", { @@ -26285,8 +26416,8 @@ ], "type": "enum", "file": "git2/apply.h", - "line": 100, - "lineto": 118, + "line": 112, + "lineto": 130, "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", "tdef": "typedef", "description": " Possible application locations for git_apply ", @@ -26326,14 +26457,15 @@ "unsigned int version", "git_apply_delta_cb delta_cb", "git_apply_hunk_cb hunk_cb", - "void * payload" + "void * payload", + "unsigned int flags" ], "type": "struct", "value": "git_apply_options", "file": "git2/apply.h", - "line": 64, - "lineto": 75, - "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload", + "line": 73, + "lineto": 87, + "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload\nunsigned int flags", "tdef": "typedef", "description": " Apply options structure", "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", @@ -26357,6 +26489,11 @@ "type": "void *", "name": "payload", "comments": " Payload passed to both delta_cb \n&\n hunk_cb. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Bitmask of git_apply_flags_t " } ], "used": { @@ -26673,8 +26810,8 @@ "type": "struct", "value": "git_blob", "file": "git2/types.h", - "line": 121, - "lineto": 121, + "line": 124, + "lineto": 124, "tdef": "typedef", "description": " In-memory representation of a blob object. ", "comments": "", @@ -26715,14 +26852,10 @@ "file": "git2/blob.h", "line": 102, "lineto": 117, + "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD", "tdef": "typedef", "description": " Flags to control the functionality of `git_blob_filter`.", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD", "fields": [ { "type": "int", @@ -26742,7 +26875,11 @@ "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", "value": 4 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -26750,13 +26887,14 @@ { "decl": [ "int version", - "git_blob_filter_flag_t flags" + "uint32_t flags" ], "type": "struct", + "value": "git_blob_filter_options", "file": "git2/blob.h", "line": 122, "lineto": 127, - "block": "int version\ngit_blob_filter_flag_t flags", + "block": "int version\nuint32_t flags", "tdef": "typedef", "description": " The options used when applying filter options to a file.", "comments": "", @@ -26767,9 +26905,9 @@ "comments": "" }, { - "type": "git_blob_filter_flag_t", + "type": "uint32_t", "name": "flags", - "comments": " Flags to control the filtering process " + "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above " } ], "used": { @@ -26777,8 +26915,7 @@ "needs": [ "git_blob_filter" ] - }, - "value": "git_blob_filter_options" + } } ], [ @@ -26813,8 +26950,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 203, - "lineto": 207, + "line": 206, + "lineto": 210, "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", "tdef": "typedef", "description": " Basic type of any Git branch. ", @@ -26939,13 +27076,12 @@ [ "git_cert", { - "decl": [ - "git_cert_t cert_type" - ], + "decl": "git_cert", "type": "struct", + "value": "git_cert", "file": "git2/types.h", - "line": 289, - "lineto": 294, + "line": 253, + "lineto": 253, "block": "git_cert_t cert_type", "tdef": "typedef", "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", @@ -26962,30 +27098,31 @@ "needs": [ "git_transport_certificate_check_cb" ] - }, - "value": "git_cert" + } } ], [ "git_cert_hostkey", { "decl": [ - "git_cert parent", + "struct git_cert parent", "git_cert_ssh_t type", "unsigned char [16] hash_md5", - "unsigned char [20] hash_sha1" + "unsigned char [20] hash_sha1", + "unsigned char [32] hash_sha256" ], "type": "struct", - "file": "git2/transport.h", - "line": 39, - "lineto": 59, - "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1", + "value": "git_cert_hostkey", + "file": "git2/cert.h", + "line": 88, + "lineto": 114, + "block": "struct git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256", "tdef": "typedef", "description": " Hostkey information taken from libssh2", "comments": "", "fields": [ { - "type": "git_cert", + "type": "struct git_cert", "name": "parent", "comments": " The parent cert " }, @@ -27003,13 +27140,17 @@ "type": "unsigned char [20]", "name": "hash_sha1", "comments": " Hostkey hash. If type has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." + }, + { + "type": "unsigned char [32]", + "name": "hash_sha256", + "comments": " Hostkey hash. If type has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." } ], "used": { "returns": [], "needs": [] - }, - "value": "git_cert_hostkey" + } } ], [ @@ -27017,13 +27158,14 @@ { "decl": [ "GIT_CERT_SSH_MD5", - "GIT_CERT_SSH_SHA1" + "GIT_CERT_SSH_SHA1", + "GIT_CERT_SSH_SHA256" ], "type": "enum", - "file": "git2/transport.h", - "line": 29, - "lineto": 34, - "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1", + "file": "git2/cert.h", + "line": 76, + "lineto": 83, + "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256", "tdef": "typedef", "description": " Type of SSH host fingerprint", "comments": "", @@ -27039,6 +27181,12 @@ "name": "GIT_CERT_SSH_SHA1", "comments": "

SHA-1 is available

\n", "value": 2 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_SHA256", + "comments": "

SHA-256 is available

\n", + "value": 4 } ], "used": { @@ -27057,9 +27205,9 @@ "GIT_CERT_STRARRAY" ], "type": "enum", - "file": "git2/types.h", - "line": 261, - "lineto": 284, + "file": "git2/cert.h", + "line": 24, + "lineto": 47, "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", "tdef": "typedef", "description": " Type of host certificate structure that is passed to the check callback", @@ -27100,22 +27248,22 @@ "git_cert_x509", { "decl": [ - "git_cert parent", + "struct git_cert parent", "void * data", "size_t len" ], "type": "struct", "value": "git_cert_x509", - "file": "git2/transport.h", - "line": 64, - "lineto": 76, - "block": "git_cert parent\nvoid * data\nsize_t len", + "file": "git2/cert.h", + "line": 119, + "lineto": 131, + "block": "struct git_cert parent\nvoid * data\nsize_t len", "tdef": "typedef", "description": " X.509 certificate information", "comments": "", "fields": [ { - "type": "git_cert", + "type": "struct git_cert", "name": "parent", "comments": " The parent cert " }, @@ -27234,6 +27382,7 @@ "void * perfdata_payload" ], "type": "struct", + "value": "git_checkout_options", "file": "git2/checkout.h", "line": 263, "lineto": 326, @@ -27354,8 +27503,7 @@ "git_reset", "git_reset_from_annotated" ] - }, - "value": "git_checkout_options" + } } ], [ @@ -27637,14 +27785,10 @@ "file": "git2/clone.h", "line": 33, "lineto": 53, + "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", "tdef": "typedef", "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", "fields": [ { "type": "int", @@ -27670,7 +27814,11 @@ "comments": "

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n", "value": 3 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -27693,17 +27841,10 @@ "file": "git2/clone.h", "line": 103, "lineto": 164, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", "tdef": "typedef", "description": " Clone options structure", "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", - "used": { - "returns": [], - "needs": [ - "git_clone", - "git_clone_options_init" - ] - }, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", "fields": [ { "type": "unsigned int", @@ -27755,7 +27896,14 @@ "name": "remote_cb_payload", "comments": " An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL." } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_clone", + "git_clone_options_init" + ] + } } ], [ @@ -27765,8 +27913,8 @@ "type": "struct", "value": "git_commit", "file": "git2/types.h", - "line": 124, - "lineto": 124, + "line": 127, + "lineto": 127, "tdef": "typedef", "description": " Parsed representation of a commit object. ", "comments": "", @@ -27823,8 +27971,8 @@ "type": "struct", "value": "git_config", "file": "git2/types.h", - "line": 145, - "lineto": 145, + "line": 148, + "lineto": 148, "tdef": "typedef", "description": " Memory representation of a set of config files ", "comments": "", @@ -27880,8 +28028,8 @@ "type": "struct", "value": "git_config_backend", "file": "git2/types.h", - "line": 148, - "lineto": 148, + "line": 151, + "lineto": 151, "tdef": "typedef", "description": " Interface to access a configuration file ", "comments": "", @@ -27905,6 +28053,7 @@ "void * payload" ], "type": "struct", + "value": "git_config_entry", "file": "git2/config.h", "line": 64, "lineto": 71, @@ -27952,8 +28101,7 @@ "git_config_get_entry", "git_config_next" ] - }, - "value": "git_config_entry" + } } ], [ @@ -28066,6 +28214,7 @@ "file": "git2/config.h", "line": 104, "lineto": 108, + "block": "git_configmap_t type\nconst char * str_match\nint map_value", "tdef": "typedef", "description": " Mapping from config variables to values.", "comments": "", @@ -28086,7 +28235,6 @@ "comments": "" } ], - "block": "git_configmap_t type\nconst char * str_match\nint map_value", "used": { "returns": [], "needs": [ @@ -28109,14 +28257,10 @@ "file": "git2/config.h", "line": 94, "lineto": 99, + "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", "tdef": "typedef", "description": " Config var type", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", "fields": [ { "type": "int", @@ -28142,43 +28286,32 @@ "comments": "", "value": 3 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ "git_cred", { - "decl": [ - "git_credtype_t credtype", - "void (*)(git_cred *) free" - ], + "decl": "git_cred", "type": "struct", "value": "git_cred", - "file": "git2/transport.h", - "line": 147, - "lineto": 152, - "block": "git_credtype_t credtype\nvoid (*)(git_cred *) free", - "tdef": null, + "file": "git2/cred.h", + "line": 84, + "lineto": 84, + "tdef": "typedef", "description": " The base structure for all credential types", "comments": "", - "fields": [ - { - "type": "git_credtype_t", - "name": "credtype", - "comments": " A type of credential " - }, - { - "type": "void (*)(git_cred *)", - "name": "free", - "comments": "" - } - ], "used": { "returns": [], "needs": [ "git_cred_acquire_cb", "git_cred_default_new", "git_cred_free", + "git_cred_get_username", "git_cred_has_username", "git_cred_ssh_custom_new", "git_cred_ssh_interactive_new", @@ -28198,9 +28331,9 @@ "decl": "git_cred_default", "type": "struct", "value": "git_cred_default", - "file": "git2/transport.h", - "line": 219, - "lineto": 219, + "file": "git2/cred.h", + "line": 92, + "lineto": 92, "tdef": "typedef", "description": " A key for NTLM/Kerberos \"default\" credentials ", "comments": "", @@ -28213,55 +28346,15 @@ [ "git_cred_ssh_custom", { - "decl": [ - "git_cred parent", - "char * username", - "char * publickey", - "size_t publickey_len", - "git_cred_sign_cb sign_callback", - "void * payload" - ], + "decl": "git_cred_ssh_custom", "type": "struct", "value": "git_cred_ssh_custom", - "file": "git2/transport.h", - "line": 204, - "lineto": 216, - "block": "git_cred parent\nchar * username\nchar * publickey\nsize_t publickey_len\ngit_cred_sign_cb sign_callback\nvoid * payload", + "file": "git2/cred.h", + "line": 107, + "lineto": 107, "tdef": "typedef", "description": " A key with a custom signature function", "comments": "", - "fields": [ - { - "type": "git_cred", - "name": "parent", - "comments": " The parent cred " - }, - { - "type": "char *", - "name": "username", - "comments": " The username to authenticate as " - }, - { - "type": "char *", - "name": "publickey", - "comments": " The public key data " - }, - { - "type": "size_t", - "name": "publickey_len", - "comments": " Length of the public key " - }, - { - "type": "git_cred_sign_cb", - "name": "sign_callback", - "comments": " Callback used to sign the data." - }, - { - "type": "void *", - "name": "payload", - "comments": " Payload passed to prompt_callback " - } - ], "used": { "returns": [], "needs": [] @@ -28271,43 +28364,15 @@ [ "git_cred_ssh_interactive", { - "decl": [ - "git_cred parent", - "char * username", - "git_cred_ssh_interactive_cb prompt_callback", - "void * payload" - ], + "decl": "git_cred_ssh_interactive", "type": "struct", "value": "git_cred_ssh_interactive", - "file": "git2/transport.h", - "line": 189, - "lineto": 199, - "block": "git_cred parent\nchar * username\ngit_cred_ssh_interactive_cb prompt_callback\nvoid * payload", + "file": "git2/cred.h", + "line": 102, + "lineto": 102, "tdef": "typedef", "description": " Keyboard-interactive based ssh authentication", "comments": "", - "fields": [ - { - "type": "git_cred", - "name": "parent", - "comments": " The parent cred " - }, - { - "type": "char *", - "name": "username", - "comments": " The username to authenticate as " - }, - { - "type": "git_cred_ssh_interactive_cb", - "name": "prompt_callback", - "comments": " Callback used for authentication." - }, - { - "type": "void *", - "name": "payload", - "comments": " Payload passed to prompt_callback " - } - ], "used": { "returns": [], "needs": [ @@ -28319,49 +28384,15 @@ [ "git_cred_ssh_key", { - "decl": [ - "git_cred parent", - "char * username", - "char * publickey", - "char * privatekey", - "char * passphrase" - ], + "decl": "git_cred_ssh_key", "type": "struct", "value": "git_cred_ssh_key", - "file": "git2/transport.h", - "line": 178, - "lineto": 184, - "block": "git_cred parent\nchar * username\nchar * publickey\nchar * privatekey\nchar * passphrase", + "file": "git2/cred.h", + "line": 97, + "lineto": 97, "tdef": "typedef", "description": " A ssh key from disk", "comments": "", - "fields": [ - { - "type": "git_cred", - "name": "parent", - "comments": " The parent cred " - }, - { - "type": "char *", - "name": "username", - "comments": " The username to authenticate as " - }, - { - "type": "char *", - "name": "publickey", - "comments": " The path to a public key " - }, - { - "type": "char *", - "name": "privatekey", - "comments": " The path to a private key " - }, - { - "type": "char *", - "name": "passphrase", - "comments": " Passphrase used to decrypt the private key " - } - ], "used": { "returns": [], "needs": [] @@ -28371,31 +28402,15 @@ [ "git_cred_username", { - "decl": [ - "git_cred parent", - "char [1] username" - ], + "decl": "git_cred_username", "type": "struct", "value": "git_cred_username", - "file": "git2/transport.h", - "line": 222, - "lineto": 225, - "block": "git_cred parent\nchar [1] username", + "file": "git2/cred.h", + "line": 89, + "lineto": 89, "tdef": "typedef", "description": " Username-only credential information ", "comments": "", - "fields": [ - { - "type": "git_cred", - "name": "parent", - "comments": " The parent cred " - }, - { - "type": "char [1]", - "name": "username", - "comments": " The username to authenticate as " - } - ], "used": { "returns": [], "needs": [] @@ -28410,6 +28425,7 @@ "const char * password" ], "type": "struct", + "value": "git_cred_userpass_payload", "file": "git2/cred_helpers.h", "line": 24, "lineto": 27, @@ -28432,48 +28448,7 @@ "used": { "returns": [], "needs": [] - }, - "value": "git_cred_userpass_payload" - } - ], - [ - "git_cred_userpass_plaintext", - { - "decl": [ - "git_cred parent", - "char * username", - "char * password" - ], - "type": "struct", - "file": "git2/transport.h", - "line": 155, - "lineto": 159, - "block": "git_cred parent\nchar * username\nchar * password", - "tdef": "typedef", - "description": " A plaintext username and password ", - "comments": "", - "fields": [ - { - "type": "git_cred", - "name": "parent", - "comments": " The parent cred " - }, - { - "type": "char *", - "name": "username", - "comments": " The username to authenticate as " - }, - { - "type": "char *", - "name": "password", - "comments": " The password to use " - } - ], - "used": { - "returns": [], - "needs": [] - }, - "value": "git_cred_userpass_plaintext" + } } ], [ @@ -28489,9 +28464,9 @@ "GIT_CREDTYPE_SSH_MEMORY" ], "type": "enum", - "file": "git2/transport.h", - "line": 88, - "lineto": 140, + "file": "git2/cred.h", + "line": 27, + "lineto": 79, "block": "GIT_CREDTYPE_USERPASS_PLAINTEXT\nGIT_CREDTYPE_SSH_KEY\nGIT_CREDTYPE_SSH_CUSTOM\nGIT_CREDTYPE_DEFAULT\nGIT_CREDTYPE_SSH_INTERACTIVE\nGIT_CREDTYPE_USERNAME\nGIT_CREDTYPE_SSH_MEMORY", "tdef": "typedef", "description": " Supported credential types", @@ -28661,17 +28636,10 @@ "file": "git2/describe.h", "line": 91, "lineto": 111, + "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", "tdef": "typedef", "description": " Describe format options structure", "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", - "used": { - "returns": [], - "needs": [ - "git_describe_format", - "git_describe_format_options_init" - ] - }, - "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", "fields": [ { "type": "unsigned int", @@ -28693,7 +28661,14 @@ "name": "dirty_suffix", "comments": " If the workdir is dirty and this is set, this string will\n be appended to the description string." } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_describe_format", + "git_describe_format_options_init" + ] + } } ], [ @@ -28708,6 +28683,7 @@ "int show_commit_oid_as_fallback" ], "type": "struct", + "value": "git_describe_options", "file": "git2/describe.h", "line": 43, "lineto": 61, @@ -28754,8 +28730,7 @@ "git_describe_options_init", "git_describe_workdir" ] - }, - "value": "git_describe_options" + } } ], [ @@ -28907,6 +28882,7 @@ "git_diff_binary_file new_file" ], "type": "struct", + "value": "git_diff_binary", "file": "git2/diff.h", "line": 513, "lineto": 525, @@ -28940,8 +28916,7 @@ "git_diff_buffers", "git_diff_foreach" ] - }, - "value": "git_diff_binary" + } } ], [ @@ -29107,16 +29082,17 @@ "decl": [ "git_oid id", "const char * path", - "git_off_t size", + "git_object_size_t size", "uint32_t flags", "uint16_t mode", "uint16_t id_abbrev" ], "type": "struct", + "value": "git_diff_file", "file": "git2/diff.h", "line": 260, "lineto": 267, - "block": "git_oid id\nconst char * path\ngit_off_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", + "block": "git_oid id\nconst char * path\ngit_object_size_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", "tdef": "typedef", "description": " Description of one side of a delta.", "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n\n

The id is the git_oid of the item. If the entry represents an absent side of a diff (e.g. the old_file of a GIT_DELTA_ADDED delta), then the oid will be zeroes.

\n\n

path is the NUL-terminated path to the entry relative to the working directory of the repository.

\n\n

size is the size of the entry in bytes.

\n\n

flags is a combination of the git_diff_flag_t types

\n\n

mode is, roughly, the stat() st_mode value for the item. This will be restricted to one of the git_filemode_t values.

\n\n

The id_abbrev represents the known length of the id field, when converted to a hex string. It is generally GIT_OID_HEXSZ, unless this delta was created from reading a patch file, in which case it may be abbreviated to something reasonable, like 7 characters.

\n", @@ -29132,7 +29108,7 @@ "comments": "" }, { - "type": "git_off_t", + "type": "git_object_size_t", "name": "size", "comments": "" }, @@ -29161,8 +29137,7 @@ "git_diff_buffers", "git_diff_foreach" ] - }, - "value": "git_diff_file" + } } ], [ @@ -29179,6 +29154,7 @@ "git_diff_similarity_metric * metric" ], "type": "struct", + "value": "git_diff_find_options", "file": "git2/diff.h", "line": 718, "lineto": 772, @@ -29234,8 +29210,7 @@ "git_diff_find_options_init", "git_diff_find_similar" ] - }, - "value": "git_diff_find_options" + } } ], [ @@ -29429,8 +29404,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 1366, - "lineto": 1373, + "line": 1367, + "lineto": 1374, "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", "tdef": "typedef", "description": " Formatting options for diff e-mail generation", @@ -29451,9 +29426,7 @@ ], "used": { "returns": [], - "needs": [ - "git_diff_commit_as_email" - ] + "needs": [] } } ], @@ -29462,7 +29435,7 @@ { "decl": [ "unsigned int version", - "git_diff_format_email_flags_t flags", + "uint32_t flags", "size_t patch_no", "size_t total_patches", "const git_oid * id", @@ -29473,9 +29446,9 @@ "type": "struct", "value": "git_diff_format_email_options", "file": "git2/diff.h", - "line": 1378, - "lineto": 1400, - "block": "unsigned int version\ngit_diff_format_email_flags_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", + "line": 1379, + "lineto": 1402, + "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", "tdef": "typedef", "description": " Options for controlling the formatting of the generated e-mail.", "comments": "", @@ -29486,9 +29459,9 @@ "comments": "" }, { - "type": "git_diff_format_email_flags_t", + "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " see `git_diff_format_email_flags_t` above " }, { "type": "size_t", @@ -29538,13 +29511,14 @@ "GIT_DIFF_FORMAT_PATCH_HEADER", "GIT_DIFF_FORMAT_RAW", "GIT_DIFF_FORMAT_NAME_ONLY", - "GIT_DIFF_FORMAT_NAME_STATUS" + "GIT_DIFF_FORMAT_NAME_STATUS", + "GIT_DIFF_FORMAT_PATCH_ID" ], "type": "enum", "file": "git2/diff.h", "line": 1090, - "lineto": 1096, - "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS", + "lineto": 1097, + "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", "tdef": "typedef", "description": " Possible output formats for diff data", "comments": "", @@ -29578,6 +29552,12 @@ "name": "GIT_DIFF_FORMAT_NAME_STATUS", "comments": "

like git diff --name-status

\n", "value": 5 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH_ID", + "comments": "

git diff as used by git patch-id

\n", + "value": 6 } ], "used": { @@ -29601,6 +29581,7 @@ "char [128] header" ], "type": "struct", + "value": "git_diff_hunk", "file": "git2/diff.h", "line": 545, "lineto": 552, @@ -29652,8 +29633,7 @@ "git_diff_line_cb", "git_patch_get_hunk" ] - }, - "value": "git_diff_hunk" + } } ], [ @@ -29669,6 +29649,7 @@ "const char * content" ], "type": "struct", + "value": "git_diff_line", "file": "git2/diff.h", "line": 600, "lineto": 608, @@ -29725,8 +29706,7 @@ "git_patch_get_line_in_hunk", "git_patch_print" ] - }, - "value": "git_diff_line" + } } ], [ @@ -30168,26 +30148,26 @@ "type": "struct", "value": "git_diff_patchid_options", "file": "git2/diff.h", - "line": 1462, - "lineto": 1464, + "line": 1464, + "lineto": 1466, + "block": "unsigned int version", "tdef": "typedef", "description": " Patch ID options structure", "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", - "used": { - "returns": [], - "needs": [ - "git_diff_patchid", - "git_diff_patchid_options_init" - ] - }, - "block": "unsigned int version", "fields": [ { "type": "unsigned int", "name": "version", "comments": "" } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_diff_patchid", + "git_diff_patchid_options_init" + ] + } } ], [ @@ -30201,6 +30181,7 @@ "void * payload" ], "type": "struct", + "value": "git_diff_similarity_metric", "file": "git2/diff.h", "line": 701, "lineto": 711, @@ -30238,8 +30219,7 @@ "used": { "returns": [], "needs": [] - }, - "value": "git_diff_similarity_metric" + } } ], [ @@ -30247,9 +30227,10 @@ { "decl": "git_diff_stats", "type": "struct", + "value": "git_diff_stats", "file": "git2/diff.h", - "line": 1280, - "lineto": 1280, + "line": 1281, + "lineto": 1281, "tdef": "typedef", "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", "comments": "", @@ -30263,8 +30244,7 @@ "git_diff_stats_insertions", "git_diff_stats_to_buf" ] - }, - "value": "git_diff_stats" + } } ], [ @@ -30279,8 +30259,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 1285, - "lineto": 1300, + "line": 1286, + "lineto": 1301, "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", "tdef": "typedef", "description": " Formatting options for diff stats", @@ -30372,6 +30352,7 @@ "int klass" ], "type": "struct", + "value": "git_error", "file": "git2/errors.h", "line": 69, "lineto": 72, @@ -30397,8 +30378,7 @@ "giterr_last" ], "needs": [] - }, - "value": "git_error" + } } ], [ @@ -30953,6 +30933,7 @@ "git_strarray custom_headers" ], "type": "struct", + "value": "git_fetch_options", "file": "git2/remote.h", "line": 652, "lineto": 689, @@ -31004,8 +30985,7 @@ "git_remote_download", "git_remote_fetch" ] - }, - "value": "git_fetch_options" + } } ], [ @@ -31020,14 +31000,10 @@ "file": "git2/remote.h", "line": 604, "lineto": 617, + "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", "description": " Acceptable prune settings when fetching ", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "fields": [ { "type": "int", @@ -31047,7 +31023,11 @@ "comments": "

Force pruning off

\n", "value": 2 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -31063,8 +31043,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 210, - "lineto": 217, + "line": 213, + "lineto": 220, "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", "tdef": "typedef", "description": " Valid modes for index and tree entries. ", @@ -31346,9 +31326,10 @@ { "decl": "git_index", "type": "struct", + "value": "git_index", "file": "git2/types.h", - "line": 136, - "lineto": 136, + "line": 139, + "lineto": 139, "tdef": "typedef", "description": " Memory representation of an index file. ", "comments": "", @@ -31425,8 +31406,7 @@ "git_repository_index", "git_revert_commit" ] - }, - "value": "git_index" + } } ], [ @@ -31442,14 +31422,10 @@ "file": "git2/index.h", "line": 139, "lineto": 144, + "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", "tdef": "typedef", "description": " Flags for APIs that add files matching pathspec ", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", "fields": [ { "type": "int", @@ -31475,7 +31451,11 @@ "comments": "", "value": 4 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -31532,9 +31512,10 @@ { "decl": "git_index_conflict_iterator", "type": "struct", + "value": "git_index_conflict_iterator", "file": "git2/types.h", - "line": 142, - "lineto": 142, + "line": 145, + "lineto": 145, "tdef": "typedef", "description": " An iterator for conflicts in the index. ", "comments": "", @@ -31545,8 +31526,7 @@ "git_index_conflict_iterator_new", "git_index_conflict_next" ] - }, - "value": "git_index_conflict_iterator" + } } ], [ @@ -31567,6 +31547,7 @@ "const char * path" ], "type": "struct", + "value": "git_index_entry", "file": "git2/index.h", "line": 53, "lineto": 70, @@ -31652,8 +31633,7 @@ "git_index_iterator_next", "git_merge_file_from_index" ] - }, - "value": "git_index_entry" + } } ], [ @@ -31669,14 +31649,10 @@ "file": "git2/index.h", "line": 116, "lineto": 123, + "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", "tdef": "typedef", "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", "fields": [ { "type": "int", @@ -31702,7 +31678,11 @@ "comments": "", "value": 4 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -31747,8 +31727,8 @@ "type": "struct", "value": "git_index_iterator", "file": "git2/types.h", - "line": 139, - "lineto": 139, + "line": 142, + "lineto": 142, "tdef": "typedef", "description": " An iterator for entries in the index. ", "comments": "", @@ -31776,14 +31756,10 @@ "file": "git2/index.h", "line": 147, "lineto": 167, + "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", "tdef": "typedef", "description": " Git index stage states ", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", "fields": [ { "type": "int", @@ -31815,7 +31791,11 @@ "comments": "

The "theirs" side of a conflict.

\n", "value": 3 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -31892,6 +31872,7 @@ "unsigned char verify" ], "type": "struct", + "value": "git_indexer_options", "file": "git2/indexer.h", "line": 62, "lineto": 72, @@ -31927,8 +31908,7 @@ "git_indexer_new", "git_indexer_options_init" ] - }, - "value": "git_indexer_options" + } } ], [ @@ -31948,22 +31928,10 @@ "file": "git2/indexer.h", "line": 24, "lineto": 48, + "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", "tdef": "typedef", "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", "comments": "", - "used": { - "returns": [ - "git_remote_stats" - ], - "needs": [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_progress_cb", - "git_odb_write_pack", - "git_packbuilder_write" - ] - }, - "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", "fields": [ { "type": "unsigned int", @@ -32000,7 +31968,19 @@ "name": "received_bytes", "comments": " size of the packfile received up to now " } - ] + ], + "used": { + "returns": [ + "git_remote_stats" + ], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + } } ], [ @@ -32227,8 +32207,8 @@ "type": "struct", "value": "git_mailmap", "file": "git2/types.h", - "line": 412, - "lineto": 412, + "line": 357, + "lineto": 357, "tdef": "typedef", "description": " Representation of .mailmap file state. ", "comments": "", @@ -32312,6 +32292,7 @@ { "decl": "git_merge_driver_source", "type": "struct", + "value": "git_merge_driver_source", "file": "git2/sys/merge.h", "line": 41, "lineto": 41, @@ -32321,8 +32302,7 @@ "used": { "returns": [], "needs": [] - }, - "value": "git_merge_driver_source" + } } ], [ @@ -32522,14 +32502,15 @@ "const char * our_label", "const char * their_label", "git_merge_file_favor_t favor", - "git_merge_file_flag_t flags", + "uint32_t flags", "unsigned short marker_size" ], "type": "struct", + "value": "git_merge_file_options", "file": "git2/merge.h", "line": 170, "lineto": 200, - "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\ngit_merge_file_flag_t flags\nunsigned short marker_size", + "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nuint32_t flags\nunsigned short marker_size", "tdef": "typedef", "description": " Options for merging a file", "comments": "", @@ -32560,7 +32541,7 @@ "comments": " The file to favor in region conflicts. " }, { - "type": "git_merge_file_flag_t", + "type": "uint32_t", "name": "flags", "comments": " see `git_merge_file_flag_t` above " }, @@ -32577,8 +32558,7 @@ "git_merge_file_from_index", "git_merge_file_options_init" ] - }, - "value": "git_merge_file_options" + } } ], [ @@ -32691,21 +32671,21 @@ { "decl": [ "unsigned int version", - "git_merge_flag_t flags", + "uint32_t flags", "unsigned int rename_threshold", "unsigned int target_limit", "git_diff_similarity_metric * metric", "unsigned int recursion_limit", "const char * default_driver", "git_merge_file_favor_t file_favor", - "git_merge_file_flag_t file_flags" + "uint32_t file_flags" ], "type": "struct", "value": "git_merge_options", "file": "git2/merge.h", "line": 246, "lineto": 295, - "block": "unsigned int version\ngit_merge_flag_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\ngit_merge_file_flag_t file_flags", + "block": "unsigned int version\nuint32_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\nuint32_t file_flags", "tdef": "typedef", "description": " Merging options", "comments": "", @@ -32716,7 +32696,7 @@ "comments": "" }, { - "type": "git_merge_flag_t", + "type": "uint32_t", "name": "flags", "comments": " See `git_merge_flag_t` above " }, @@ -32751,7 +32731,7 @@ "comments": " Flags for handling conflicting content, to be used with the standard\n (`text`) merge driver." }, { - "type": "git_merge_file_flag_t", + "type": "uint32_t", "name": "file_flags", "comments": " see `git_merge_file_flag_t` above " } @@ -32826,17 +32806,10 @@ "file": "git2/message.h", "line": 43, "lineto": 46, + "block": "const char * key\nconst char * value", "tdef": "typedef", "description": " Represents a single git message trailer.", "comments": "", - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - }, - "block": "const char * key\nconst char * value", "fields": [ { "type": "const char *", @@ -32848,7 +32821,14 @@ "name": "value", "comments": "" } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_message_trailer_array_free", + "git_message_trailers" + ] + } } ], [ @@ -32864,17 +32844,10 @@ "file": "git2/message.h", "line": 54, "lineto": 60, + "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", "tdef": "typedef", "description": " Represents an array of git message trailers.", "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - }, - "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", "fields": [ { "type": "git_message_trailer *", @@ -32891,7 +32864,14 @@ "name": "_trailer_block", "comments": "" } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_message_trailer_array_free", + "git_message_trailers" + ] + } } ], [ @@ -32901,8 +32881,8 @@ "type": "struct", "value": "git_note", "file": "git2/types.h", - "line": 157, - "lineto": 157, + "line": 160, + "lineto": 160, "tdef": "typedef", "description": " Representation of a git note ", "comments": "", @@ -32930,6 +32910,7 @@ { "decl": "git_note_iterator", "type": "struct", + "value": "git_note_iterator", "file": "git2/notes.h", "line": 35, "lineto": 35, @@ -32944,8 +32925,7 @@ "git_note_iterator_new", "git_note_next" ] - }, - "value": "git_note_iterator" + } } ], [ @@ -32955,13 +32935,14 @@ "type": "struct", "value": "git_object", "file": "git2/types.h", - "line": 112, - "lineto": 112, + "line": 115, + "lineto": 115, "tdef": "typedef", "description": " Representation of a generic object in a repository ", "comments": "", "used": { "returns": [ + "git_blob_rawsize", "git_object_string2type", "git_object_type", "git_odb_object_type", @@ -33021,38 +33002,12 @@ ], "type": "enum", "file": "git2/types.h", - "line": 70, - "lineto": 79, + "line": 73, + "lineto": 82, + "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", "tdef": "typedef", "description": " Basic type (loose or packed) of any Git object. ", "comments": "", - "used": { - "returns": [ - "git_object_string2type", - "git_object_type", - "git_odb_object_type", - "git_tag_target_type", - "git_tree_entry_type" - ], - "needs": [ - "git_object__size", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_peel", - "git_object_type2string", - "git_object_typeisloose", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read_header", - "git_odb_write", - "git_reference_peel", - "git_repository_hashfile" - ] - }, - "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", "fields": [ { "type": "int", @@ -33102,7 +33057,33 @@ "comments": "

A delta, base is given by object id.

\n", "value": 7 } - ] + ], + "used": { + "returns": [ + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_object__size", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_peel", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile" + ] + } } ], [ @@ -33112,8 +33093,8 @@ "type": "struct", "value": "git_odb", "file": "git2/types.h", - "line": 82, - "lineto": 82, + "line": 85, + "lineto": 85, "tdef": "typedef", "description": " An open object database handle. ", "comments": "", @@ -33167,8 +33148,8 @@ "type": "struct", "value": "git_odb_backend", "file": "git2/types.h", - "line": 85, - "lineto": 85, + "line": 88, + "lineto": 88, "tdef": "typedef", "description": " A custom backend in an ODB ", "comments": "", @@ -33232,9 +33213,10 @@ { "decl": "git_odb_object", "type": "struct", + "value": "git_odb_object", "file": "git2/types.h", - "line": 88, - "lineto": 88, + "line": 91, + "lineto": 91, "tdef": "typedef", "description": " An object read from the ODB ", "comments": "", @@ -33250,8 +33232,7 @@ "git_odb_read", "git_odb_read_prefix" ] - }, - "value": "git_odb_object" + } } ], [ @@ -33261,9 +33242,9 @@ "type": "struct", "value": "git_odb_stream", "file": "git2/types.h", - "line": 91, - "lineto": 91, - "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_off_t declared_size\ngit_off_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", + "line": 94, + "lineto": 94, + "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_object_size_t declared_size\ngit_object_size_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", "tdef": "typedef", "description": " A stream to read/write from the ODB ", "comments": "", @@ -33284,12 +33265,12 @@ "comments": "" }, { - "type": "git_off_t", + "type": "git_object_size_t", "name": "declared_size", "comments": "" }, { - "type": "git_off_t", + "type": "git_object_size_t", "name": "received_bytes", "comments": "" }, @@ -33376,18 +33357,12 @@ "type": "struct", "value": "git_odb_writepack", "file": "git2/types.h", - "line": 94, - "lineto": 94, + "line": 97, + "lineto": 97, + "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "tdef": "typedef", "description": " A stream to write a packfile to the ODB ", "comments": "", - "used": { - "returns": [], - "needs": [ - "git_odb_write_pack" - ] - }, - "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "fields": [ { "type": "git_odb_backend *", @@ -33409,7 +33384,13 @@ "name": "free", "comments": "" } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_odb_write_pack" + ] + } } ], [ @@ -33600,6 +33581,7 @@ "size_t count" ], "type": "struct", + "value": "git_oidarray", "file": "git2/oidarray.h", "line": 16, "lineto": 19, @@ -33626,8 +33608,7 @@ "git_merge_bases_many", "git_oidarray_free" ] - }, - "value": "git_oidarray" + } } ], [ @@ -33637,8 +33618,8 @@ "type": "struct", "value": "git_packbuilder", "file": "git2/types.h", - "line": 160, - "lineto": 160, + "line": 163, + "lineto": 163, "tdef": "typedef", "description": " Representation of a git packbuilder ", "comments": "", @@ -33881,6 +33862,7 @@ { "decl": "git_pathspec_match_list", "type": "struct", + "value": "git_pathspec_match_list", "file": "git2/pathspec.h", "line": 25, "lineto": 25, @@ -33901,8 +33883,7 @@ "git_pathspec_match_tree", "git_pathspec_match_workdir" ] - }, - "value": "git_pathspec_match_list" + } } ], [ @@ -33919,19 +33900,12 @@ "type": "struct", "value": "git_proxy_options", "file": "git2/proxy.h", - "line": 42, - "lineto": 77, + "line": 44, + "lineto": 79, + "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "tdef": "typedef", "description": " Options for connecting through a proxy", "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", - "used": { - "returns": [], - "needs": [ - "git_proxy_options_init", - "git_remote_connect" - ] - }, - "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "fields": [ { "type": "unsigned int", @@ -33963,7 +33937,14 @@ "name": "payload", "comments": " Payload to be provided to the credentials and certificate\n check callbacks." } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_proxy_options_init", + "git_remote_connect" + ] + } } ], [ @@ -33976,8 +33957,8 @@ ], "type": "enum", "file": "git2/proxy.h", - "line": 18, - "lineto": 34, + "line": 20, + "lineto": 36, "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", "tdef": "typedef", "description": " The type of proxy to use.", @@ -34015,8 +33996,8 @@ "type": "struct", "value": "git_push", "file": "git2/types.h", - "line": 241, - "lineto": 241, + "line": 244, + "lineto": 244, "tdef": "typedef", "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", "comments": "", @@ -34046,18 +34027,10 @@ "file": "git2/remote.h", "line": 713, "lineto": 740, + "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", "comments": "", - "used": { - "returns": [], - "needs": [ - "git_push_options_init", - "git_remote_push", - "git_remote_upload" - ] - }, - "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "fields": [ { "type": "unsigned int", @@ -34084,7 +34057,15 @@ "name": "custom_headers", "comments": " Extra headers for this push operation" } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + } } ], [ @@ -34140,9 +34121,10 @@ { "decl": "git_rebase", "type": "struct", + "value": "git_rebase", "file": "git2/types.h", - "line": 192, - "lineto": 192, + "line": 195, + "lineto": 195, "tdef": "typedef", "description": " Representation of a rebase ", "comments": "", @@ -34168,8 +34150,7 @@ "git_rebase_orig_head_id", "git_rebase_orig_head_name" ] - }, - "value": "git_rebase" + } } ], [ @@ -34231,14 +34212,10 @@ "file": "git2/rebase.h", "line": 96, "lineto": 132, + "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "tdef": "typedef", "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "fields": [ { "type": "int", @@ -34276,7 +34253,11 @@ "comments": "

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n", "value": 5 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -34297,18 +34278,10 @@ "file": "git2/rebase.h", "line": 32, "lineto": 91, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_signing_cb signing_cb\nvoid * payload", "tdef": "typedef", "description": " Rebase options", "comments": "

Use to tell the rebase machinery how to operate.

\n", - "used": { - "returns": [], - "needs": [ - "git_rebase_init", - "git_rebase_open", - "git_rebase_options_init" - ] - }, - "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_signing_cb signing_cb\nvoid * payload", "fields": [ { "type": "unsigned int", @@ -34350,7 +34323,15 @@ "name": "payload", "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_rebase_init", + "git_rebase_open", + "git_rebase_options_init" + ] + } } ], [ @@ -34360,8 +34341,8 @@ "type": "struct", "value": "git_refdb", "file": "git2/types.h", - "line": 97, - "lineto": 97, + "line": 100, + "lineto": 100, "tdef": "typedef", "description": " An open refs database handle. ", "comments": "", @@ -34382,17 +34363,17 @@ { "decl": "git_refdb_backend", "type": "struct", + "value": "git_refdb_backend", "file": "git2/types.h", - "line": 100, - "lineto": 100, + "line": 103, + "lineto": 103, "tdef": "typedef", "description": " A custom backend for refs ", "comments": "", "used": { "returns": [], "needs": [] - }, - "value": "git_refdb_backend" + } } ], [ @@ -34402,8 +34383,8 @@ "type": "struct", "value": "git_reference", "file": "git2/types.h", - "line": 177, - "lineto": 177, + "line": 180, + "lineto": 180, "tdef": "typedef", "description": " In-memory representation of a reference. ", "comments": "", @@ -34523,8 +34504,8 @@ "type": "struct", "value": "git_reference_iterator", "file": "git2/types.h", - "line": 180, - "lineto": 180, + "line": 183, + "lineto": 183, "tdef": "typedef", "description": " Iterator for references ", "comments": "", @@ -34551,18 +34532,12 @@ ], "type": "enum", "file": "git2/types.h", - "line": 195, - "lineto": 200, + "line": 198, + "lineto": 203, + "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", "tdef": "typedef", "description": " Basic type of any Git reference. ", "comments": "", - "used": { - "returns": [ - "git_reference_type" - ], - "needs": [] - }, - "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", "fields": [ { "type": "int", @@ -34588,7 +34563,13 @@ "comments": "", "value": 3 } - ] + ], + "used": { + "returns": [ + "git_reference_type" + ], + "needs": [] + } } ], [ @@ -34598,8 +34579,8 @@ "type": "struct", "value": "git_reflog", "file": "git2/types.h", - "line": 154, - "lineto": 154, + "line": 157, + "lineto": 157, "tdef": "typedef", "description": " Representation of a reference log ", "comments": "", @@ -34631,8 +34612,8 @@ "type": "struct", "value": "git_reflog_entry", "file": "git2/types.h", - "line": 151, - "lineto": 151, + "line": 154, + "lineto": 154, "tdef": "typedef", "description": " Representation of a reference log entry ", "comments": "", @@ -34654,9 +34635,10 @@ { "decl": "git_refspec", "type": "struct", + "value": "git_refspec", "file": "git2/types.h", - "line": 223, - "lineto": 223, + "line": 226, + "lineto": 226, "tdef": "typedef", "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", "comments": "", @@ -34677,8 +34659,7 @@ "git_refspec_string", "git_refspec_transform" ] - }, - "value": "git_refspec" + } } ], [ @@ -34688,8 +34669,8 @@ "type": "struct", "value": "git_remote", "file": "git2/types.h", - "line": 229, - "lineto": 229, + "line": 232, + "lineto": 232, "tdef": "typedef", "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entires).", "comments": "", @@ -34813,6 +34794,7 @@ "git_url_resolve_cb resolve_url" ], "type": "struct", + "value": "git_remote_callbacks", "file": "git2/remote.h", "line": 497, "lineto": 586, @@ -34900,8 +34882,7 @@ "git_remote_prune", "git_remote_update_tips" ] - }, - "value": "git_remote_callbacks" + } } ], [ @@ -34996,17 +34977,10 @@ "file": "git2/remote.h", "line": 62, "lineto": 82, + "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", "tdef": "typedef", "description": " Remote creation options structure", "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", - "used": { - "returns": [], - "needs": [ - "git_remote_create_options_init", - "git_remote_create_with_opts" - ] - }, - "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", "fields": [ { "type": "unsigned int", @@ -35033,7 +35007,14 @@ "name": "flags", "comments": " Additional flags for the remote. See git_remote_create_flags. " } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_remote_create_options_init", + "git_remote_create_with_opts" + ] + } } ], [ @@ -35047,6 +35028,7 @@ "char * symref_target" ], "type": "struct", + "value": "git_remote_head", "file": "git2/net.h", "line": 40, "lineto": 50, @@ -35087,8 +35069,7 @@ "git_headlist_cb", "git_remote_ls" ] - }, - "value": "git_remote_head" + } } ], [ @@ -35096,9 +35077,10 @@ { "decl": "git_repository", "type": "struct", + "value": "git_repository", "file": "git2/types.h", - "line": 106, - "lineto": 106, + "line": 109, + "lineto": 109, "tdef": "typedef", "description": " Representation of an existing git repository,\n including all its object contents", "comments": "", @@ -35299,6 +35281,7 @@ "git_status_list_new", "git_status_should_ignore", "git_submodule_add_setup", + "git_submodule_clone", "git_submodule_foreach", "git_submodule_lookup", "git_submodule_open", @@ -35331,8 +35314,7 @@ "git_worktree_lookup", "git_worktree_open_from_repository" ] - }, - "value": "git_repository" + } } ], [ @@ -35461,6 +35443,7 @@ "const char * origin_url" ], "type": "struct", + "value": "git_repository_init_options", "file": "git2/repository.h", "line": 302, "lineto": 311, @@ -35516,8 +35499,7 @@ "git_repository_init_ext", "git_repository_init_options_init" ] - }, - "value": "git_repository_init_options" + } } ], [ @@ -35915,14 +35897,10 @@ "file": "git2/revparse.h", "line": 71, "lineto": 78, + "block": "GIT_REVPARSE_SINGLE\nGIT_REVPARSE_RANGE\nGIT_REVPARSE_MERGE_BASE", "tdef": "typedef", "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_REVPARSE_SINGLE\nGIT_REVPARSE_RANGE\nGIT_REVPARSE_MERGE_BASE", "fields": [ { "type": "int", @@ -35942,7 +35920,11 @@ "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", "value": 4 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -35992,9 +35974,10 @@ { "decl": "git_revwalk", "type": "struct", + "value": "git_revwalk", "file": "git2/types.h", - "line": 115, - "lineto": 115, + "line": 118, + "lineto": 118, "tdef": "typedef", "description": " Representation of an in-progress walk through the commits in a repo ", "comments": "", @@ -36020,8 +36003,7 @@ "git_revwalk_simplify_first_parent", "git_revwalk_sorting" ] - }, - "value": "git_revwalk" + } } ], [ @@ -36033,9 +36015,10 @@ "git_time when" ], "type": "struct", + "value": "git_signature", "file": "git2/types.h", - "line": 170, - "lineto": 174, + "line": 173, + "lineto": 177, "block": "char * name\nchar * email\ngit_time when", "tdef": "typedef", "description": " An action signature (e.g. for committers, taggers, etc) ", @@ -36093,8 +36076,7 @@ "git_transaction_set_symbolic_target", "git_transaction_set_target" ] - }, - "value": "git_signature" + } } ], [ @@ -36235,16 +36217,17 @@ { "decl": [ "unsigned int version", - "git_stash_apply_flags flags", + "uint32_t flags", "git_checkout_options checkout_options", "git_stash_apply_progress_cb progress_cb", "void * progress_payload" ], "type": "struct", + "value": "git_stash_apply_options", "file": "git2/stash.h", "line": 126, "lineto": 138, - "block": "unsigned int version\ngit_stash_apply_flags flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", + "block": "unsigned int version\nuint32_t flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", "tdef": "typedef", "description": " Stash application options structure", "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can use git_stash_apply_options_init.

\n", @@ -36255,9 +36238,9 @@ "comments": "" }, { - "type": "git_stash_apply_flags", + "type": "uint32_t", "name": "flags", - "comments": " See `git_stash_apply_flags_t`, above. " + "comments": " See `git_stash_apply_flags`, above. " }, { "type": "git_checkout_options", @@ -36282,8 +36265,7 @@ "git_stash_apply_options_init", "git_stash_pop" ] - }, - "value": "git_stash_apply_options" + } } ], [ @@ -36378,14 +36360,10 @@ "file": "git2/stash.h", "line": 25, "lineto": 48, + "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", "tdef": "typedef", "description": " Stash flags", "comments": "", - "used": { - "returns": [], - "needs": [] - }, - "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", "fields": [ { "type": "int", @@ -36411,7 +36389,11 @@ "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", "value": 4 } - ] + ], + "used": { + "returns": [], + "needs": [] + } } ], [ @@ -36423,6 +36405,7 @@ "git_diff_delta * index_to_workdir" ], "type": "struct", + "value": "git_status_entry", "file": "git2/status.h", "line": 230, "lineto": 234, @@ -36452,8 +36435,7 @@ "git_status_byindex" ], "needs": [] - }, - "value": "git_status_entry" + } } ], [ @@ -36463,8 +36445,8 @@ "type": "struct", "value": "git_status_list", "file": "git2/types.h", - "line": 189, - "lineto": 189, + "line": 192, + "lineto": 192, "tdef": "typedef", "description": " Representation of a status collection ", "comments": "", @@ -36623,6 +36605,7 @@ "git_tree * baseline" ], "type": "struct", + "value": "git_status_options", "file": "git2/status.h", "line": 170, "lineto": 197, @@ -36664,8 +36647,7 @@ "git_status_list_new", "git_status_options_init" ] - }, - "value": "git_status_options" + } } ], [ @@ -36841,9 +36823,22 @@ "file": "git2/strarray.h", "line": 22, "lineto": 25, + "block": "char ** strings\nsize_t count", "tdef": "typedef", "description": " Array of strings ", "comments": "", + "fields": [ + { + "type": "char **", + "name": "strings", + "comments": "" + }, + { + "type": "size_t", + "name": "count", + "comments": "" + } + ], "used": { "returns": [], "needs": [ @@ -36868,20 +36863,7 @@ "git_tag_list_match", "git_worktree_list" ] - }, - "block": "char ** strings\nsize_t count", - "fields": [ - { - "type": "char **", - "name": "strings", - "comments": "" - }, - { - "type": "size_t", - "name": "count", - "comments": "" - } - ] + } } ], [ @@ -36924,9 +36906,10 @@ { "decl": "git_submodule", "type": "struct", + "value": "git_submodule", "file": "git2/types.h", - "line": 313, - "lineto": 313, + "line": 258, + "lineto": 258, "tdef": "typedef", "description": " Opaque structure representing a submodule.", "comments": "", @@ -36942,6 +36925,7 @@ "git_submodule_add_to_index", "git_submodule_branch", "git_submodule_cb", + "git_submodule_clone", "git_submodule_fetch_recurse_submodules", "git_submodule_foreach", "git_submodule_free", @@ -36968,8 +36952,7 @@ "git_submodule_url", "git_submodule_wd_id" ] - }, - "value": "git_submodule" + } } ], [ @@ -36984,8 +36967,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 377, - "lineto": 384, + "line": 322, + "lineto": 329, "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", "tdef": "typedef", "description": " Submodule ignore values", @@ -37043,8 +37026,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 396, - "lineto": 400, + "line": 341, + "lineto": 345, "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", "tdef": "typedef", "description": " Options for submodule recurse.", @@ -37212,17 +37195,10 @@ "file": "git2/submodule.h", "line": 128, "lineto": 153, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", "tdef": "typedef", "description": " Submodule update options structure", "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", - "used": { - "returns": [], - "needs": [ - "git_submodule_update", - "git_submodule_update_options_init" - ] - }, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", "fields": [ { "type": "unsigned int", @@ -37244,7 +37220,15 @@ "name": "allow_fetch", "comments": " Allow fetching from the submodule's default remote if the target\n commit isn't found. Enabled by default." } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_submodule_clone", + "git_submodule_update", + "git_submodule_update_options_init" + ] + } } ], [ @@ -37259,8 +37243,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 341, - "lineto": 348, + "line": 286, + "lineto": 293, "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", "tdef": "typedef", "description": " Submodule update values", @@ -37312,9 +37296,10 @@ { "decl": "git_tag", "type": "struct", + "value": "git_tag", "file": "git2/types.h", - "line": 118, - "lineto": 118, + "line": 121, + "lineto": 121, "tdef": "typedef", "description": " Parsed representation of a tag object. ", "comments": "", @@ -37336,8 +37321,7 @@ "git_tag_target_id", "git_tag_target_type" ] - }, - "value": "git_tag" + } } ], [ @@ -37351,20 +37335,12 @@ "type": "struct", "value": "git_time", "file": "git2/types.h", - "line": 163, - "lineto": 167, + "line": 166, + "lineto": 170, + "block": "git_time_t time\nint offset\nchar sign", "tdef": "typedef", "description": " Time in a signature ", "comments": "", - "used": { - "returns": [ - "git_commit_time" - ], - "needs": [ - "git_signature_new" - ] - }, - "block": "git_time_t time\nint offset\nchar sign", "fields": [ { "type": "git_time_t", @@ -37381,7 +37357,15 @@ "name": "sign", "comments": " indicator for questionable '-0000' offsets in signature " } - ] + ], + "used": { + "returns": [ + "git_commit_time" + ], + "needs": [ + "git_signature_new" + ] + } } ], [ @@ -37400,17 +37384,10 @@ "file": "git2/trace.h", "line": 26, "lineto": 47, + "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", "tdef": "typedef", "description": " Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.", "comments": "", - "used": { - "returns": [], - "needs": [ - "git_trace_cb", - "git_trace_set" - ] - }, - "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", "fields": [ { "type": "int", @@ -37454,7 +37431,14 @@ "comments": "

Exceptionally detailed debugging data

\n", "value": 6 } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_trace_cb", + "git_trace_set" + ] + } } ], [ @@ -37464,8 +37448,8 @@ "type": "struct", "value": "git_transaction", "file": "git2/types.h", - "line": 183, - "lineto": 183, + "line": 186, + "lineto": 186, "tdef": "typedef", "description": " Transactional interface to references ", "comments": "", @@ -37492,8 +37476,8 @@ "type": "struct", "value": "git_transport", "file": "git2/types.h", - "line": 235, - "lineto": 235, + "line": 238, + "lineto": 238, "tdef": "typedef", "description": " Interface which represents a transport to communicate with a\n remote.", "comments": "", @@ -37512,8 +37496,8 @@ "type": "struct", "value": "git_tree", "file": "git2/types.h", - "line": 130, - "lineto": 130, + "line": 133, + "lineto": 133, "tdef": "typedef", "description": " Representation of a tree object. ", "comments": "", @@ -37581,9 +37565,10 @@ { "decl": "git_tree_entry", "type": "struct", + "value": "git_tree_entry", "file": "git2/types.h", - "line": 127, - "lineto": 127, + "line": 130, + "lineto": 130, "tdef": "typedef", "description": " Representation of each one of the entries in a tree object. ", "comments": "", @@ -37609,8 +37594,7 @@ "git_treebuilder_insert", "git_treewalk_cb" ] - }, - "value": "git_tree_entry" + } } ], [ @@ -37627,16 +37611,10 @@ "file": "git2/tree.h", "line": 448, "lineto": 457, + "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "tdef": "typedef", "description": " An action to perform during the update of a tree", "comments": "", - "used": { - "returns": [], - "needs": [ - "git_tree_create_updated" - ] - }, - "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "fields": [ { "type": "git_tree_update_t", @@ -37658,7 +37636,13 @@ "name": "path", "comments": " The full path from the root tree " } - ] + ], + "used": { + "returns": [], + "needs": [ + "git_tree_create_updated" + ] + } } ], [ @@ -37703,8 +37687,8 @@ "type": "struct", "value": "git_treebuilder", "file": "git2/types.h", - "line": 133, - "lineto": 133, + "line": 136, + "lineto": 136, "tdef": "typedef", "description": " Constructor for in-memory trees ", "comments": "", @@ -37769,8 +37753,8 @@ "type": "struct", "value": "git_worktree", "file": "git2/types.h", - "line": 109, - "lineto": 109, + "line": 112, + "lineto": 112, "tdef": "typedef", "description": " Representation of a working tree ", "comments": "", @@ -37805,6 +37789,7 @@ "git_reference * ref" ], "type": "struct", + "value": "git_worktree_add_options", "file": "git2/worktree.h", "line": 84, "lineto": 89, @@ -37835,8 +37820,7 @@ "git_worktree_add", "git_worktree_add_options_init" ] - }, - "value": "git_worktree_add_options" + } } ], [ @@ -37851,6 +37835,7 @@ "file": "git2/worktree.h", "line": 198, "lineto": 202, + "block": "unsigned int version\nuint32_t flags", "tdef": "typedef", "description": " Worktree prune options structure", "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", @@ -37866,7 +37851,6 @@ "comments": "" } ], - "block": "unsigned int version\nuint32_t flags", "used": { "returns": [], "needs": [ @@ -37930,8 +37914,8 @@ "type": "struct", "value": "git_writestream", "file": "git2/types.h", - "line": 405, - "lineto": 409, + "line": 350, + "lineto": 354, "tdef": null, "description": " A type to write in a streaming fashion, for example, for filters. ", "comments": "", @@ -38178,6 +38162,7 @@ [ "git_cred_default_new", "git_cred_free", + "git_cred_get_username", "git_cred_has_username", "git_cred_ssh_custom_new", "git_cred_ssh_interactive_new", @@ -38885,6 +38870,7 @@ "git_submodule_add_setup", "git_submodule_add_to_index", "git_submodule_branch", + "git_submodule_clone", "git_submodule_fetch_recurse_submodules", "git_submodule_foreach", "git_submodule_free", @@ -39028,6 +39014,10 @@ "add.c", "ex/HEAD/add.html" ], + [ + "args.c", + "ex/HEAD/args.html" + ], [ "blame.c", "ex/HEAD/blame.html" diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index 3a8daaaa2..9b9afb015 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -24,7 +24,8 @@ var cTypeMappings = { "uint16_t": "Number", "uint32_t": "Number", "uint64_t": "Number", - "double": "Number" + "double": "Number", + "git_object_size_t": "Number" } var collisionMappings = { diff --git a/vendor/libgit2 b/vendor/libgit2 index ffddb85a7..e40d9e3dd 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit ffddb85a7269fee8844769fd64770e2a9ac9686d +Subproject commit e40d9e3ddf339a1a487e7a6194bab6f2f658d354 diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 6a8d9449b..1c3ca7dcd 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -209,7 +209,6 @@ "libgit2/src/pool.h", "libgit2/src/posix.c", "libgit2/src/posix.h", - "libgit2/src/posix_regex.h", "libgit2/src/pqueue.c", "libgit2/src/pqueue.h", "libgit2/src/proxy.c", @@ -228,6 +227,8 @@ "libgit2/src/refs.h", "libgit2/src/refspec.c", "libgit2/src/refspec.h", + "libgit2/src/regexp.c", + "libgit2/src/regexp.h", "libgit2/src/remote.c", "libgit2/src/remote.h", "libgit2/src/repo_template.h", From 0598d40f793f09ceff13c067cdf1ec26cd11854d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 10 Jan 2020 17:07:19 -0700 Subject: [PATCH 177/545] Merge in libgit2 longpaths PR --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index e40d9e3dd..7b4b1930f 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit e40d9e3ddf339a1a487e7a6194bab6f2f658d354 +Subproject commit 7b4b1930f12fac1c6ef16cd32946a46eb8eeaa5f From ef0c27cb4ee9504242ca64e97683b238d86507b4 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 10 Jan 2020 17:07:42 -0700 Subject: [PATCH 178/545] Expose git_libgit2_opts Not all options are supported --- generate/input/libgit2-supplement.json | 8 ++ generate/templates/manual/libgit2/opts.cc | 139 ++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 generate/templates/manual/libgit2/opts.cc diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index fd827c8bf..a9b64ea75 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -86,6 +86,14 @@ }, "new" : { "functions": { + "git_libgit2_opts": { + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/libgit2/opts.cc", + "isAsync": false, + "isPrototypeMethod": false, + "group": "libgit2" + }, "git_clone": { "isManual": true, "cFile": "generate/templates/manual/clone/clone.cc", diff --git a/generate/templates/manual/libgit2/opts.cc b/generate/templates/manual/libgit2/opts.cc new file mode 100644 index 000000000..5c28cc7ca --- /dev/null +++ b/generate/templates/manual/libgit2/opts.cc @@ -0,0 +1,139 @@ +NAN_METHOD(GitLibgit2::Opts) +{ + Nan::EscapableHandleScope scope; + + if (info.Length() == 0 || !info[0]->IsNumber()) + { + return Nan::ThrowError("Number option is required."); + } + + int from_option = (int)info[0].As()->Value(); + + git_error_clear(); + + v8::Local to; + switch (from_option) + { + // GET size_t + case GIT_OPT_GET_MWINDOW_SIZE: + case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT: + case GIT_OPT_GET_PACK_MAX_OBJECTS: + { + size_t option_value; + if (git_libgit2_opts(from_option, &option_value)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET int + case GIT_OPT_GET_WINDOWS_LONGPATHS: + { + int option_value; + if (git_libgit2_opts(from_option, &option_value)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET unsigned long + case GIT_OPT_GET_WINDOWS_SHAREMODE: + { + unsigned long option_value; + if (git_libgit2_opts(from_option, &option_value)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET ssize_t + case GIT_OPT_GET_CACHED_MEMORY: + { + ssize_t option_value; + if (git_libgit2_opts(from_option, &option_value)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } + // GET git_buf + case GIT_OPT_GET_TEMPLATE_PATH: + case GIT_OPT_GET_USER_AGENT: + { + git_buf option_value = {0}; + if (git_libgit2_opts(from_option, &option_value)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value.ptr, option_value.size).ToLocalChecked(); + git_buf_dispose(&option_value); + break; + } + case GIT_OPT_GET_SEARCH_PATH: + { + git_buf option_value = {0}; + if (info.Length() < 2 || !info[1]->IsNumber()) + { + return Nan::ThrowError("Number option is required."); + } + int level = (int)info[1].As()->Value(); + if (git_libgit2_opts(from_option, level, &option_value)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value.ptr, option_value.size).ToLocalChecked(); + git_buf_dispose(&option_value); + break; + } + // SET int + case GIT_OPT_ENABLE_CACHING: + case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION: + case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION: + case GIT_OPT_ENABLE_OFS_DELTA: + case GIT_OPT_ENABLE_FSYNC_GITDIR: + case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION: + case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY: + case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: + case GIT_OPT_SET_WINDOWS_LONGPATHS: + { + if (info.Length() < 2 || !info[1]->IsNumber()) + { + return Nan::ThrowError("Number option is required."); + } + int option_arg = (int)info[1].As()->Value(); + if (git_libgit2_opts(from_option, option_arg)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(0); + break; + } + // SET size_t + case GIT_OPT_SET_MWINDOW_SIZE: + case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: + case GIT_OPT_SET_PACK_MAX_OBJECTS: + { + if (info.Length() < 2 || !info[1]->IsNumber()) + { + return Nan::ThrowError("Number option is required."); + } + size_t option_arg = (size_t)info[1].As()->Value(); + if (git_libgit2_opts(from_option, option_arg)) + { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(0); + break; + } + default: + { + return Nan::ThrowError("Unsupported option"); + } + } + + return info.GetReturnValue().Set(scope.Escape(to)); +} From 80698b434aa95fdd49785c83af64bb3e5f943361 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 13 Jan 2020 14:03:00 -0700 Subject: [PATCH 179/545] Update to latest libgit2 master --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 7b4b1930f..b36f257ff 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 7b4b1930f12fac1c6ef16cd32946a46eb8eeaa5f +Subproject commit b36f257ff380d14d6e11e6203c48659e6b921e5b From 743b7a991fc8d72a0e71747c9635d66d36d5cb20 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 13 Jan 2020 16:12:26 -0700 Subject: [PATCH 180/545] Remove unused libgit2 files --- vendor/libgit2.gyp | 2 -- 1 file changed, 2 deletions(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 1c3ca7dcd..adafb322d 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -66,7 +66,6 @@ "libgit2/src/blob.h", "libgit2/src/branch.c", "libgit2/src/branch.h", - "libgit2/src/bswap.h", "libgit2/src/buf_text.c", "libgit2/src/buf_text.h", "libgit2/src/buffer.c", @@ -154,7 +153,6 @@ "libgit2/src/map.h", "libgit2/src/merge_driver.c", "libgit2/src/merge_file.c", - "libgit2/src/merge_file.h", "libgit2/src/merge.c", "libgit2/src/merge.h", "libgit2/src/message.c", From 22d94f1f637c52fb593a047f78227eb6054430c6 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 13 Jan 2020 16:27:48 -0700 Subject: [PATCH 181/545] Format opts.cc --- generate/templates/manual/libgit2/opts.cc | 208 ++++++++++------------ 1 file changed, 94 insertions(+), 114 deletions(-) diff --git a/generate/templates/manual/libgit2/opts.cc b/generate/templates/manual/libgit2/opts.cc index 5c28cc7ca..51a42b395 100644 --- a/generate/templates/manual/libgit2/opts.cc +++ b/generate/templates/manual/libgit2/opts.cc @@ -2,8 +2,7 @@ NAN_METHOD(GitLibgit2::Opts) { Nan::EscapableHandleScope scope; - if (info.Length() == 0 || !info[0]->IsNumber()) - { + if (info.Length() == 0 || !info[0]->IsNumber()) { return Nan::ThrowError("Number option is required."); } @@ -12,127 +11,108 @@ NAN_METHOD(GitLibgit2::Opts) git_error_clear(); v8::Local to; - switch (from_option) - { - // GET size_t - case GIT_OPT_GET_MWINDOW_SIZE: - case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT: - case GIT_OPT_GET_PACK_MAX_OBJECTS: - { - size_t option_value; - if (git_libgit2_opts(from_option, &option_value)) - { - return Nan::ThrowError("git_libgit2_opts failed"); + switch (from_option) { + // GET size_t + case GIT_OPT_GET_MWINDOW_SIZE: + case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT: + case GIT_OPT_GET_PACK_MAX_OBJECTS: { + size_t option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; } - to = Nan::New(option_value); - break; - } - // GET int - case GIT_OPT_GET_WINDOWS_LONGPATHS: - { - int option_value; - if (git_libgit2_opts(from_option, &option_value)) - { - return Nan::ThrowError("git_libgit2_opts failed"); + // GET int + case GIT_OPT_GET_WINDOWS_LONGPATHS: { + int option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; } - to = Nan::New(option_value); - break; - } - // GET unsigned long - case GIT_OPT_GET_WINDOWS_SHAREMODE: - { - unsigned long option_value; - if (git_libgit2_opts(from_option, &option_value)) - { - return Nan::ThrowError("git_libgit2_opts failed"); + // GET unsigned long + case GIT_OPT_GET_WINDOWS_SHAREMODE: { + unsigned long option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; } - to = Nan::New(option_value); - break; - } - // GET ssize_t - case GIT_OPT_GET_CACHED_MEMORY: - { - ssize_t option_value; - if (git_libgit2_opts(from_option, &option_value)) - { - return Nan::ThrowError("git_libgit2_opts failed"); + // GET ssize_t + case GIT_OPT_GET_CACHED_MEMORY: { + ssize_t option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; } - to = Nan::New(option_value); - break; - } - // GET git_buf - case GIT_OPT_GET_TEMPLATE_PATH: - case GIT_OPT_GET_USER_AGENT: - { - git_buf option_value = {0}; - if (git_libgit2_opts(from_option, &option_value)) - { - return Nan::ThrowError("git_libgit2_opts failed"); + // GET git_buf + case GIT_OPT_GET_TEMPLATE_PATH: + case GIT_OPT_GET_USER_AGENT: { + git_buf option_value = { 0 }; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value.ptr, option_value.size) + .ToLocalChecked(); + git_buf_dispose(&option_value); + break; } - to = Nan::New(option_value.ptr, option_value.size).ToLocalChecked(); - git_buf_dispose(&option_value); - break; - } - case GIT_OPT_GET_SEARCH_PATH: - { - git_buf option_value = {0}; - if (info.Length() < 2 || !info[1]->IsNumber()) - { - return Nan::ThrowError("Number option is required."); + case GIT_OPT_GET_SEARCH_PATH: { + git_buf option_value = { 0 }; + if (info.Length() < 2 || !info[1]->IsNumber()) { + return Nan::ThrowError("Number option is required."); + } + int level = (int)info[1].As()->Value(); + if (git_libgit2_opts(from_option, level, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value.ptr, option_value.size) + .ToLocalChecked(); + git_buf_dispose(&option_value); + break; } - int level = (int)info[1].As()->Value(); - if (git_libgit2_opts(from_option, level, &option_value)) - { - return Nan::ThrowError("git_libgit2_opts failed"); + // SET int + case GIT_OPT_ENABLE_CACHING: + case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION: + case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION: + case GIT_OPT_ENABLE_OFS_DELTA: + case GIT_OPT_ENABLE_FSYNC_GITDIR: + case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION: + case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY: + case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: + case GIT_OPT_SET_WINDOWS_LONGPATHS: { + if (info.Length() < 2 || !info[1]->IsNumber()) { + return Nan::ThrowError("Number option is required."); + } + int option_arg = (int)info[1].As()->Value(); + if (git_libgit2_opts(from_option, option_arg)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(0); + break; } - to = Nan::New(option_value.ptr, option_value.size).ToLocalChecked(); - git_buf_dispose(&option_value); - break; - } - // SET int - case GIT_OPT_ENABLE_CACHING: - case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION: - case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION: - case GIT_OPT_ENABLE_OFS_DELTA: - case GIT_OPT_ENABLE_FSYNC_GITDIR: - case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION: - case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY: - case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: - case GIT_OPT_SET_WINDOWS_LONGPATHS: - { - if (info.Length() < 2 || !info[1]->IsNumber()) - { - return Nan::ThrowError("Number option is required."); + // SET size_t + case GIT_OPT_SET_MWINDOW_SIZE: + case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: + case GIT_OPT_SET_PACK_MAX_OBJECTS: { + if (info.Length() < 2 || !info[1]->IsNumber()) { + return Nan::ThrowError("Number option is required."); + } + size_t option_arg = (size_t)info[1].As()->Value(); + if (git_libgit2_opts(from_option, option_arg)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(0); + break; } - int option_arg = (int)info[1].As()->Value(); - if (git_libgit2_opts(from_option, option_arg)) - { - return Nan::ThrowError("git_libgit2_opts failed"); + default: { + return Nan::ThrowError("Unsupported option"); } - to = Nan::New(0); - break; - } - // SET size_t - case GIT_OPT_SET_MWINDOW_SIZE: - case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: - case GIT_OPT_SET_PACK_MAX_OBJECTS: - { - if (info.Length() < 2 || !info[1]->IsNumber()) - { - return Nan::ThrowError("Number option is required."); - } - size_t option_arg = (size_t)info[1].As()->Value(); - if (git_libgit2_opts(from_option, option_arg)) - { - return Nan::ThrowError("git_libgit2_opts failed"); - } - to = Nan::New(0); - break; - } - default: - { - return Nan::ThrowError("Unsupported option"); - } } return info.GetReturnValue().Set(scope.Escape(to)); From e4e66f4dcb98991f11a66f9e307f507bb4e2e01d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 13 Jan 2020 16:37:25 -0700 Subject: [PATCH 182/545] Add longpath options to NodeGit.Libgit2.OPT This should be removed once libgit2/libgit2#5347 is merged --- lib/libgit2.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 lib/libgit2.js diff --git a/lib/libgit2.js b/lib/libgit2.js new file mode 100644 index 000000000..f246df51e --- /dev/null +++ b/lib/libgit2.js @@ -0,0 +1,6 @@ +var NodeGit = require("../"); + +var Libgit2 = NodeGit.Libgit2; + +Libgit2.OPT.SET_WINDOWS_LONGPATHS = 28; +Libgit2.OPT.GET_WINDOWS_LONGPATHS = 29; From fcdb122ae04c257439c88ac07957a189053a63de Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 14 Jan 2020 08:48:40 -0700 Subject: [PATCH 183/545] Bring in libssh2#402 https://github.com/libssh2/libssh2/pull/402 --- vendor/libssh2/src/packet.c | 68 ++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 39 deletions(-) diff --git a/vendor/libssh2/src/packet.c b/vendor/libssh2/src/packet.c index 38ab62944..2e01bfc5d 100644 --- a/vendor/libssh2/src/packet.c +++ b/vendor/libssh2/src/packet.c @@ -419,8 +419,8 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, size_t datalen, int macstate) { int rc = 0; - char *message = NULL; - char *language = NULL; + unsigned char *message = NULL; + unsigned char *language = NULL; size_t message_len = 0; size_t language_len = 0; LIBSSH2_CHANNEL *channelp = NULL; @@ -472,33 +472,23 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, case SSH_MSG_DISCONNECT: if(datalen >= 5) { - size_t reason = _libssh2_ntohu32(data + 1); + uint32_t reason = 0; + struct string_buf buf; + buf.data = (unsigned char *)data; + buf.dataptr = buf.data; + buf.len = datalen; + buf.dataptr++; /* advance past type */ - if(datalen >= 9) { - message_len = _libssh2_ntohu32(data + 5); + _libssh2_get_u32(&buf, &reason); + _libssh2_get_string(&buf, &message, &message_len); + _libssh2_get_string(&buf, &language, &language_len); - if(message_len < datalen-13) { - /* 9 = packet_type(1) + reason(4) + message_len(4) */ - message = (char *) data + 9; - - language_len = - _libssh2_ntohu32(data + 9 + message_len); - language = (char *) data + 9 + message_len + 4; - - if(language_len > (datalen-13-message_len)) { - /* bad input, clear info */ - language = message = NULL; - language_len = message_len = 0; - } - } - else - /* bad size, clear it */ - message_len = 0; - } if(session->ssh_msg_disconnect) { - LIBSSH2_DISCONNECT(session, reason, message, - message_len, language, language_len); + LIBSSH2_DISCONNECT(session, reason, (const char *)message, + message_len, (const char *)language, + language_len); } + _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Disconnect(%d): %s(%s)", reason, message, language); @@ -539,24 +529,24 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, int always_display = data[1]; if(datalen >= 6) { - message_len = _libssh2_ntohu32(data + 2); - - if(message_len <= (datalen - 10)) { - /* 6 = packet_type(1) + display(1) + message_len(4) */ - message = (char *) data + 6; - language_len = _libssh2_ntohu32(data + 6 + - message_len); - - if(language_len <= (datalen - 10 - message_len)) - language = (char *) data + 10 + message_len; - } + struct string_buf buf; + buf.data = (unsigned char *)data; + buf.dataptr = buf.data; + buf.len = datalen; + buf.dataptr += 2; /* advance past type & always display */ + + _libssh2_get_string(&buf, &message, &message_len); + _libssh2_get_string(&buf, &language, &language_len); } if(session->ssh_msg_debug) { - LIBSSH2_DEBUG(session, always_display, message, - message_len, language, language_len); + LIBSSH2_DEBUG(session, always_display, + (const char *)message, + message_len, (const char *)language, + language_len); } } + /* * _libssh2_debug will actually truncate this for us so * that it's not an inordinate about of data @@ -579,7 +569,7 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, uint32_t len = 0; unsigned char want_reply = 0; len = _libssh2_ntohu32(data + 1); - if(datalen >= (6 + len)) { + if((len <= (UINT_MAX - 6)) && (datalen >= (6 + len))) { want_reply = data[5 + len]; _libssh2_debug(session, LIBSSH2_TRACE_CONN, From 8ae2436c0c41ab7c44d086c2c4b04110fff6d239 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 14 Jan 2020 09:15:29 -0700 Subject: [PATCH 184/545] Longpaths options should take/return boolean values --- generate/templates/manual/libgit2/opts.cc | 33 ++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/generate/templates/manual/libgit2/opts.cc b/generate/templates/manual/libgit2/opts.cc index 51a42b395..e387f387d 100644 --- a/generate/templates/manual/libgit2/opts.cc +++ b/generate/templates/manual/libgit2/opts.cc @@ -6,7 +6,7 @@ NAN_METHOD(GitLibgit2::Opts) return Nan::ThrowError("Number option is required."); } - int from_option = (int)info[0].As()->Value(); + const int from_option = (int)info[0].As()->Value(); git_error_clear(); @@ -23,13 +23,13 @@ NAN_METHOD(GitLibgit2::Opts) to = Nan::New(option_value); break; } - // GET int + // GET bool case GIT_OPT_GET_WINDOWS_LONGPATHS: { int option_value; if (git_libgit2_opts(from_option, &option_value)) { return Nan::ThrowError("git_libgit2_opts failed"); } - to = Nan::New(option_value); + to = option_value ? Nan::True() : Nan::False(); break; } // GET unsigned long @@ -67,7 +67,7 @@ NAN_METHOD(GitLibgit2::Opts) if (info.Length() < 2 || !info[1]->IsNumber()) { return Nan::ThrowError("Number option is required."); } - int level = (int)info[1].As()->Value(); + const int level = (int)info[1].As()->Value(); if (git_libgit2_opts(from_option, level, &option_value)) { return Nan::ThrowError("git_libgit2_opts failed"); } @@ -84,18 +84,33 @@ NAN_METHOD(GitLibgit2::Opts) case GIT_OPT_ENABLE_FSYNC_GITDIR: case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION: case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY: - case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: - case GIT_OPT_SET_WINDOWS_LONGPATHS: { + case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: { if (info.Length() < 2 || !info[1]->IsNumber()) { return Nan::ThrowError("Number option is required."); } - int option_arg = (int)info[1].As()->Value(); + const int option_arg = (int)info[1].As()->Value(); if (git_libgit2_opts(from_option, option_arg)) { return Nan::ThrowError("git_libgit2_opts failed"); } to = Nan::New(0); break; } + // SET bool + case GIT_OPT_SET_WINDOWS_LONGPATHS: { + int option_arg; + if (info.Length() < 2) { + option_arg = 0; + } else { + const Nan::Maybe maybeIsTruthy = Nan::To(info[1]); + const bool isTruthy = maybeIsTruthy.IsJust() && maybeIsTruthy.FromJust(); + option_arg = isTruthy ? 1 : 0; + } + if (git_libgit2_opts(from_option, option_arg)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::Undefined(); + break; + } // SET size_t case GIT_OPT_SET_MWINDOW_SIZE: case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: @@ -103,11 +118,11 @@ NAN_METHOD(GitLibgit2::Opts) if (info.Length() < 2 || !info[1]->IsNumber()) { return Nan::ThrowError("Number option is required."); } - size_t option_arg = (size_t)info[1].As()->Value(); + const size_t option_arg = (size_t)info[1].As()->Value(); if (git_libgit2_opts(from_option, option_arg)) { return Nan::ThrowError("git_libgit2_opts failed"); } - to = Nan::New(0); + to = Nan::Undefined(); break; } default: { From 2a79ce9646333bbe97f8ba667fefe28547feb77c Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 14 Jan 2020 09:18:47 -0700 Subject: [PATCH 185/545] Default option return value to undefined Don't return error value, instead throw on error --- generate/templates/manual/libgit2/opts.cc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/generate/templates/manual/libgit2/opts.cc b/generate/templates/manual/libgit2/opts.cc index e387f387d..3e7f1483d 100644 --- a/generate/templates/manual/libgit2/opts.cc +++ b/generate/templates/manual/libgit2/opts.cc @@ -10,7 +10,7 @@ NAN_METHOD(GitLibgit2::Opts) git_error_clear(); - v8::Local to; + v8::Local to = Nan::Undefined(); switch (from_option) { // GET size_t case GIT_OPT_GET_MWINDOW_SIZE: @@ -92,7 +92,6 @@ NAN_METHOD(GitLibgit2::Opts) if (git_libgit2_opts(from_option, option_arg)) { return Nan::ThrowError("git_libgit2_opts failed"); } - to = Nan::New(0); break; } // SET bool @@ -108,7 +107,6 @@ NAN_METHOD(GitLibgit2::Opts) if (git_libgit2_opts(from_option, option_arg)) { return Nan::ThrowError("git_libgit2_opts failed"); } - to = Nan::Undefined(); break; } // SET size_t @@ -122,7 +120,6 @@ NAN_METHOD(GitLibgit2::Opts) if (git_libgit2_opts(from_option, option_arg)) { return Nan::ThrowError("git_libgit2_opts failed"); } - to = Nan::Undefined(); break; } default: { From b22ae7534f7fa6ac0ca7415ea59460b19687c7ea Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 14 Jan 2020 09:20:18 -0700 Subject: [PATCH 186/545] Remove appveyor.yml and .travis.yml --- .travis.yml | 122 --------------------------------------------------- appveyor.yml | 63 -------------------------- 2 files changed, 185 deletions(-) delete mode 100644 .travis.yml delete mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d9a203067..000000000 --- a/.travis.yml +++ /dev/null @@ -1,122 +0,0 @@ -sudo: false -dist: xenial - -branches: - only: - - master - -compiler: clang -language: node_js - -# Stage order; the default stage is "test", which in our case is actually building and deploying -stages: - - "Extended testing" - - test - - "Deploy documentation" - -env: - - TARGET_ARCH="x64" - - TARGET_ARCH="ia32" - -node_js: - - "12" - - "10" - - "8" - -os: - - linux - - osx - -jobs: - exclude: - - os: osx - env: TARGET_ARCH="ia32" - include: - - stage: "Extended testing" - os: linux - dist: xenial - node_js: "8" - env: TARGET_ARCH="x64" EXTENDED_TESTING="false" SKIP_DEPLOY="true" - - stage: "Deploy documentation" - os: linux - dist: xenial - node_js: "8" - env: TARGET_ARCH="x64" DEPLOY_DOCUMENTATION="true" - - -git: - depth: 5 - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - build-essential - - libssl-dev - - gcc-4.9-multilib - - g++-4.9-multilib - - lcov - -before_install: - - export CC=clang - - export CXX=clang++ - - export npm_config_clang=1 - - export JOBS=4 - - - if [ -z "$TRAVIS_TAG" ] && [ "$EXTENDED_TESTING" == "true" ]; then - export GYP_DEFINES="coverage=1 use_obsolete_asm=true"; - export CC=/usr/bin/gcc-4.9; - export CXX=/usr/bin/g++-4.9; - export npm_config_clang=0; - wget http://downloads.sourceforge.net/ltp/lcov-1.10.tar.gz; - tar xvfz lcov-1.10.tar.gz; - else - export GYP_DEFINES="use_obsolete_asm=true"; - fi - -install: - - set -e; - - travis_retry npm install; - -# This is a random private key used purely for testing. -before_script: - - echo -e "Host *\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config - - echo -e "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R" > ~/.ssh/id_rsa.pub - - echo -e "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----" > ~/.ssh/id_rsa - - chmod 600 ~/.ssh/id_rsa* - - eval `ssh-agent -s` - - ssh-add ~/.ssh/id_rsa - - git config --global user.name "John Doe" - - git config --global user.email johndoe@example.com - -script: - if [ -z "$TRAVIS_TAG" ] && [ "$EXTENDED_TESTING" == "true" ]; then - travis_retry npm test && npm run cov && npm run coveralls; - else - travis_retry npm test; - fi - -after_success: - - if [ -n "$TRAVIS_TAG" ] && [ "$EXTENDED_TESTING" != "true" ] && [ "$DEPLOY_DOCUMENTATION" != "true" ] && [ "$SKIP_DEPLOY" != "true" ]; then - npm install -g node-pre-gyp; - npm install -g aws-sdk; - node lifecycleScripts/clean; - node-pre-gyp package --target_arch=$TARGET_ARCH; - node-pre-gyp publish --target_arch=$TARGET_ARCH; - fi - - - if [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ -n "$TRAVIS_TAG" ] && [ "$DEPLOY_DOCUMENTATION" == "true" ]; then - .travis/deploy-docs.sh; - fi - -notifications: - slack: - secure: KglNSqZiid9YudCwkPFDh+sZfW5BwFlM70y67E4peHwwlbbV1sSBPHcs74ZHP/lqgEZ4hMv4N2NI58oYFD5/1a+tKIQP1TkdIMuq4j2LXheuirA2HDcydOVrsC8kRx5XFGKdVRg/uyX2dlRHcOWFhxrS6yc6IxtxYWlRTD2SmEc= - - webhooks: - urls: - - https://webhooks.gitter.im/e/cbafdb27ad32ba746a73 - on_success: always # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: false # default: false diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 891225fd7..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,63 +0,0 @@ -# appveyor file -# https://www.appveyor.com/docs/appveyor-yml/ - -image: Visual Studio 2015 - -platform: - - x64 - - x86 - -# build version format -version: "{build}" - -# Set a known clone folder -clone_folder: c:\projects\nodegit - -# fix line endings in Windows -init: - - git config --global core.autocrlf input - - git config --global user.name "John Doe" - - git config --global user.email johndoe@example.com - -# what combinations to test -environment: - JOBS: 4 - GIT_SSH: c:\projects\nodegit\vendor\plink.exe - GYP_MSVS_VERSION: 2015 - matrix: - # Node.js - - nodejs_version: "12" - - nodejs_version: "10" - - nodejs_version: "8" - -matrix: - fast_finish: true - -# Get the latest stable version of Node 0.STABLE.latest -install: - - git submodule update --init --recursive - - ps: Install-Product node $env:nodejs_version $env:platform - - ps: Start-Process c:\projects\nodegit\vendor\pageant.exe c:\projects\nodegit\vendor\private.ppk - - npm install -g npm - - npm install -g node-gyp - - appveyor-retry call npm install - -test_script: - - node --version - - npm --version - - appveyor-retry call npm test - -on_success: - - IF %APPVEYOR_REPO_TAG%==true npm install -g node-pre-gyp - - IF %APPVEYOR_REPO_TAG%==true npm install -g aws-sdk - - IF %APPVEYOR_REPO_TAG%==true node lifecycleScripts\clean - - IF %APPVEYOR_REPO_TAG%==true node-pre-gyp package - - IF %APPVEYOR_REPO_TAG%==true node-pre-gyp publish - -build: off - -branches: - only: - - /backport\/.*/ - - master - - v0.3 From 59437a804062d859bd8495bc3b4b7a26472a02ef Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 14 Jan 2020 10:21:12 -0700 Subject: [PATCH 187/545] Fix some issues from the libgit2 bump --- generate/input/descriptor.json | 12 +----------- generate/input/libgit2-supplement.json | 4 ++-- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index b52112a38..92772180c 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -396,16 +396,6 @@ "jsClassName": "Buffer", "cType": "git_buf *", "shouldAlloc": true - }, - "repo": { - "cppClassName": "GitRepository", - "jsClassName": "Repo", - "cType": "git_repository *" - }, - "canonical_branch_name": { - "cppClassName": "String", - "jsClassName": "String", - "cType": "const char *" } }, "return": { @@ -415,7 +405,7 @@ "git_branch_set_upstream": { "isAsync": true, "args": { - "upstream_name": { + "branch_name": { "isOptional": true } }, diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index a9b64ea75..2115c41ba 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1118,7 +1118,7 @@ }, { "name": "flags", - "type": "git_blob_filter_flag_t" + "type": "uint32_t" } ] } @@ -1643,7 +1643,7 @@ "name": "version" }, { - "type": "git_stash_apply_flags", + "type": "uint32_t", "name": "flags" }, { From 8ad3e372380655ca9cd83a168c2e0c6561167633 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 14 Jan 2020 11:06:14 -0700 Subject: [PATCH 188/545] Bump to v0.26.4 --- CHANGELOG.md | 84 +++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bb636da7..9c63dbf20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,89 @@ # Change Log +## v0.26.4 [(2020-01-14)](https://github.com/nodegit/nodegit/releases/tag/v0.26.4) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.3...v0.26.4) + +#### Summary of changes +- Bumped LibGit2 + - Now can be configured to support longpaths on Windows. Does not respect the config value, but is configured through `NodeGit.Libgit2.opts`. See [#1748](https://github.com/nodegit/nodegit/pull/1748) for details. + - Support for complex SSH auth creds handshakes +- Pulled in patch for Libssh2 that covers an integer overflow, see [Libssh2#402](https://github.com/libssh2/libssh2/pull/402) + +#### Merged PRs into NodeGit +- [Fix some issues from the libgit2 bump](https://github.com/nodegit/nodegit/pull/1751) +- [Add option to support longpaths on Windows](https://github.com/nodegit/nodegit/pull/1748) +- [Bring in libssh2#402](https://github.com/nodegit/nodegit/pull/1749) +- [Wait for copy and remove promises to finish](https://github.com/nodegit/nodegit/pull/1730) + +#### Merged PRs into LibGit2 +- [Support `core.longpaths` on Windows #5347](https://github.com/libgit2/libgit2/pull/5347) +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) +- [win32: fix relative symlinks pointing into dirs](https://github.com/libgit2/libgit2/pull/5355) +- [ntlm: prevent (spurious) compiler warnings](https://github.com/libgit2/libgit2/pull/5354) +- [Adds support for multiple SSH auth mechanisms being used sequentially](https://github.com/libgit2/libgit2/pull/5305) +- [netops: handle intact query parameters in service_suffix removal](https://github.com/libgit2/libgit2/pull/5339) +- [Refactor packfile code to use zstream abstraction](https://github.com/libgit2/libgit2/pull/5340) +- [Fix git_submodule_sync with relative url](https://github.com/libgit2/libgit2/pull/5322) +- [http: avoid generating double slashes in url](https://github.com/libgit2/libgit2/pull/5325) +- [Correct typo in name of referenced parameter](https://github.com/libgit2/libgit2/pull/5348) +- [patch_parse: fix undefined behaviour due to arithmetic on NULL pointers](https://github.com/libgit2/libgit2/pull/5338) +- [smart_pkt: fix overflow resulting in OOB read/write of one byte](https://github.com/libgit2/libgit2/pull/5337) +- [branch: clarify documentation around branches](https://github.com/libgit2/libgit2/pull/5300) +- [examples: checkout: implement guess heuristic for remote branches](https://github.com/libgit2/libgit2/pull/5283) +- [Minor doc improvements](https://github.com/libgit2/libgit2/pull/5320) +- [attr: Update definition of binary macro](https://github.com/libgit2/libgit2/pull/5333) +- [Security fixes for master](https://github.com/libgit2/libgit2/pull/5331) +- [release.md: note that we do two security releases](https://github.com/libgit2/libgit2/pull/5318) +- [MSVC: Fix warning C4133 on x64: "function": Incompatible types - from "unsigned long *" to "size_t *"](https://github.com/libgit2/libgit2/pull/5317) +- [ci: only push docs from the libgit2/libgit2 repo](https://github.com/libgit2/libgit2/pull/5316) +- [global: convert to fiber-local storage to fix exit races](https://github.com/libgit2/libgit2/pull/5314) +- [Fix copy&paste in git_cherrypick_commit docstring](https://github.com/libgit2/libgit2/pull/5315) +- [patch_parse: fix out-of-bounds reads caused by integer underflow](https://github.com/libgit2/libgit2/pull/5312) +- [tests: fix compiler warning if tracing is disabled](https://github.com/libgit2/libgit2/pull/5311) +- [tests: config: only test parsing huge file with GITTEST_INVASIVE_SPEED](https://github.com/libgit2/libgit2/pull/5313) +- [diff: complete support for git patchid](https://github.com/libgit2/libgit2/pull/5306) +- [Memory optimizations for config entries](https://github.com/libgit2/libgit2/pull/5243) +- [ssh: include sha256 host key hash when supported](https://github.com/libgit2/libgit2/pull/5307) +- [Various examples shape-ups](https://github.com/libgit2/libgit2/pull/5272) +- [Improve trace support in tests](https://github.com/libgit2/libgit2/pull/5309) +- [Move `git_off_t` to `git_object_size_t`](https://github.com/libgit2/libgit2/pull/5123) +- [Add compat typdef for git_attr_t](https://github.com/libgit2/libgit2/pull/5310) +- [CI Build Updates](https://github.com/libgit2/libgit2/pull/5308) +- [patch_parse: use paths from "---"/"+++" lines for binary patches](https://github.com/libgit2/libgit2/pull/5303) +- [Follow 308 redirect in WinHTTP transport](https://github.com/libgit2/libgit2/pull/5285) +- [fileops: correct error return on p_lstat failures when mkdir](https://github.com/libgit2/libgit2/pull/5302) +- [config_mem: implement support for snapshots](https://github.com/libgit2/libgit2/pull/5299) +- [patch_parse: fix segfault when header path contains whitespace only](https://github.com/libgit2/libgit2/pull/5298) +- [config_file: fix race when creating an iterator](https://github.com/libgit2/libgit2/pull/5282) +- [Fix crash if snapshotting a config_snapshot](https://github.com/libgit2/libgit2/pull/5293) +- [fix a bug introduced in 8a23597b](https://github.com/libgit2/libgit2/pull/5295) +- [reflogs: fix behaviour around reflogs with newlines](https://github.com/libgit2/libgit2/pull/5275) +- [commit: verify objects exist in git_commit_with_signature](https://github.com/libgit2/libgit2/pull/5289) +- [patch_parse: fixes for fuzzing errors](https://github.com/libgit2/libgit2/pull/5276) +- [apply: add GIT_APPLY_CHECK](https://github.com/libgit2/libgit2/pull/5227) +- [refs: unlock unmodified refs on transaction commit](https://github.com/libgit2/libgit2/pull/5264) +- [fuzzers: add a new fuzzer for patch parsing](https://github.com/libgit2/libgit2/pull/5269) +- [patch_parse: handle patches without extended headers](https://github.com/libgit2/libgit2/pull/5273) +- [Provide a wrapper for simple submodule clone steps](https://github.com/libgit2/libgit2/pull/4637) +- [macOS GSS Support](https://github.com/libgit2/libgit2/pull/5238) +- [cmake: correct the link stanza for CoreFoundation](https://github.com/libgit2/libgit2/pull/5265) +- [Fix file locking on POSIX OS](https://github.com/libgit2/libgit2/pull/5257) +- [cmake: update minimum CMake version to v3.5.1](https://github.com/libgit2/libgit2/pull/5260) +- [patch_parse: handle patches with new empty files](https://github.com/libgit2/libgit2/pull/5248) +- [DRY commit parsing](https://github.com/libgit2/libgit2/pull/4445) +- [azure: avoid building and testing in Docker as root](https://github.com/libgit2/libgit2/pull/5239) +- [regexp: implement a new regular expression API](https://github.com/libgit2/libgit2/pull/5226) +- [git_refdb API fixes](https://github.com/libgit2/libgit2/pull/5106) +- [Don't use enum for flags](https://github.com/libgit2/libgit2/pull/5242) +- [valgrind: suppress memory leaks in libssh2_session_handshake](https://github.com/libgit2/libgit2/pull/5240) +- [buffer: fix writes into out-of-memory buffers](https://github.com/libgit2/libgit2/pull/5232) +- [cred: add missing private header in GSSAPI block](https://github.com/libgit2/libgit2/pull/5237) +- [CMake pkg-config modulification](https://github.com/libgit2/libgit2/pull/5206) +- [Update chat resources in README.md](https://github.com/libgit2/libgit2/pull/5229) +- [Circular header splitting](https://github.com/libgit2/libgit2/pull/5223) + + ## v0.26.3 [(2019-12-10)](https://github.com/nodegit/nodegit/releases/tag/v0.26.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.2...v0.26.3) diff --git a/package-lock.json b/package-lock.json index 1c630eb3d..389266bd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.26.3", + "version": "0.26.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bb7d1af02..3226f9e77 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.26.3", + "version": "0.26.4", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From c2b61a2cf2f370f1dcf50d38c79a6f17d8e19cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Wed, 6 Jun 2018 14:45:35 +0200 Subject: [PATCH 189/545] Remove unnecessary assignment of Commit#repo Repository#getCommit uses Commit.lookup and then manually assigns to Commit#repo even though Commit.lookup already does that. --- lib/repository.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/repository.js b/lib/repository.js index aa7c406e4..d3b6ade2d 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -1143,8 +1143,6 @@ Repository.prototype.getCommit = function(oid, callback) { var repository = this; return Commit.lookup(repository, oid).then(function(commit) { - commit.repo = repository; - if (typeof callback === "function") { callback(null, commit); } From e3bb744195a5a9ffed1a0e377627a30fff483c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Wed, 6 Jun 2018 17:11:54 +0200 Subject: [PATCH 190/545] Fix behavior of Commit#parent Commit#parent did not assign the repo property so subsequent calls which relied on this property (such as Commit#getTree) failed. This change works around this problem by imitating what LookupWrapper does for Commit.lookup, that is, it wraps the actual call in a new function and manually assigns the repo property. --- lib/commit.js | 18 ++++++++++++++++++ test/tests/commit.js | 10 ++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/commit.js b/lib/commit.js index 033ecdfa1..c91245f04 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -16,6 +16,24 @@ var _parent = Commit.prototype.parent; */ Commit.lookup = LookupWrapper(Commit); +/** + * @async + * @param {Number} n + * @return {Commit} + */ +Commit.prototype.parent = function(n, callback) { + var repo = this.repo; + return _parent.call(this, n).then(p => { + p.repo = repo; + + if (typeof callback === "function") { + callback(null, p); + } + + return p; + }, callback); +}; + /** * Amend a commit * @async diff --git a/test/tests/commit.js b/test/tests/commit.js index 237471923..69868333c 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -774,6 +774,16 @@ describe("Commit", function() { assert.equal(1, this.commit.parentcount()); }); + it("can fetch a single parent", function() { + return this.commit.parent(0).then(function(parent) { + assert.strictEqual(parent.sha(), + "ecfd36c80a3e9081f200dfda2391acadb56dac27"); + // This used to crash due to a missing .repo property on the retrieved + // parent. + return parent.getTree().then(tree => assert(tree)); + }); + }); + it("can retrieve and walk a commit tree", function() { var commitTreeEntryCount = 0; var expectedCommitTreeEntryCount = 198; From 64228106751636209042fdb895f5128b8a3edd55 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 23 Jan 2020 10:40:06 -0700 Subject: [PATCH 191/545] Use github actions for CI status badge in README.md --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 6e0dde815..72442d791 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,7 @@ > Node bindings to the [libgit2](http://libgit2.github.com/) project. - -Linux & macOS | Windows | Coverage | Dependencies -------------- | ------- | -------- | ------------- -[![Build Status Travis](https://api.travis-ci.org/nodegit/nodegit.svg?branch=master)](https://travis-ci.org/nodegit/nodegit) | [![Build Status AppVeyor](https://ci.appveyor.com/api/projects/status/e5a5q75l9yfhnfv2?svg=true)](https://ci.appveyor.com/project/timbranyen/nodegit) | [![Coveralls](https://coveralls.io/repos/nodegit/nodegit/badge.svg)](https://coveralls.io/r/nodegit/nodegit) | [![Dependencies](https://david-dm.org/nodegit/nodegit.svg)](https://david-dm.org/nodegit/nodegit) +[![Actions Status](https://github.com/nodegit/nodegit/workflows/Testing/badge.svg)](https://github.com/nodegit/nodegit/actions) **Stable (libgit2@v0.28.3): 0.28.3** From adb461e3ac0fb6d50b3e5d884064451e4fd5760c Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 26 Feb 2020 16:44:14 -0700 Subject: [PATCH 192/545] Bring in Libgit2 #5384 to NodeGit --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index b36f257ff..71c00e721 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit b36f257ff380d14d6e11e6203c48659e6b921e5b +Subproject commit 71c00e72172e22478a62fab61be418e0c5375865 From f55a66d130a48551cd096241f6ac54326060ff7f Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 27 Feb 2020 10:47:22 -0700 Subject: [PATCH 193/545] Bump to v0.26.5 --- CHANGELOG.md | 20 ++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c63dbf20..f9acdd2c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Change Log +## v0.26.5 [(2020-02-27)](https://github.com/nodegit/nodegit/releases/tag/v0.26.5) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.4...v0.26.5) + +#### Summary of changes +- Bring in improvement to client certificate handling on Windows from [winhttp: support optional client cert #5384](https://github.com/libgit2/libgit2/pull/5384) +- `Commit.prototype.parent()` now correctly assigns the repo property on the retrieved commit. This should solve certain bugs when working with a commit retrieved from `parent`. + +#### Merged PRs into NodeGit +- [Bring in Libgit2 #5384 to NodeGit](https://github.com/nodegit/nodegit/pull/1758) +- [Fix behavior of Commit#parent](https://github.com/nodegit/nodegit/pull/1509) +- [Remove DiffList](https://github.com/nodegit/nodegit/pull/1733) +- [Remove unnecessary assignment of Commit#repo](https://github.com/nodegit/nodegit/pull/1508) + +#### Merged PRs into LibGit2 +- [winhttp: support optional client cert #5384](https://github.com/libgit2/libgit2/pull/5384) +- [Support `core.longpaths` on Windows #5347](https://github.com/libgit2/libgit2/pull/5347) +- [Parallelize checkout_create_the_new for perf #4205](https://github.com/libgit2/libgit2/pull/4205) + + ## v0.26.4 [(2020-01-14)](https://github.com/nodegit/nodegit/releases/tag/v0.26.4) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.3...v0.26.4) diff --git a/package-lock.json b/package-lock.json index 389266bd9..b6b80976a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.26.4", + "version": "0.26.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3226f9e77..50f226a0d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.26.4", + "version": "0.26.5", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 1507003bf07026abcaf11edfbc4f4757a3e31935 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 19 Mar 2020 07:10:17 -0700 Subject: [PATCH 194/545] Dedupe Remote.prototype.fetch --- lib/remote.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/lib/remote.js b/lib/remote.js index 258aaf467..6106779e3 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -132,21 +132,6 @@ Remote.prototype.push = function(refSpecs, opts) { */ Remote.prototype.referenceList = Remote.prototype.referenceList; -/** - * Connects to a remote - * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {FetchOptions} opts The fetch options for download, contains callbacks - * @param {String} message The message to use for the update reflog messages - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.fetch = function(refspecs, opts, reflog_message) { - return _fetch - .call(this, refspecs, normalizeFetchOptions(opts), reflog_message); -}; - /** * Update the tips to the new state * @param {RemoteCallbacks} callbacks The callback functions for the connection From dd6aa63dc7795e143786550b74df0428529fe962 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 20 Mar 2020 15:41:51 -0700 Subject: [PATCH 195/545] Expose git_remote_rename --- generate/input/descriptor.json | 15 ++++++++++++++- test/tests/remote.js | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 92772180c..07bb84650 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3312,7 +3312,20 @@ "ignore": true }, "git_remote_rename": { - "ignore": true + "isAsync": true, + "args": { + "problems": { + "isReturn": true, + "shouldAlloc": true, + "cppClassName": "Array", + "jsClassName": "Array", + "size": "count", + "key": "strings" + } + }, + "return": { + "isErrorCode": true + } }, "git_remote_push": { "isAsync": true, diff --git a/test/tests/remote.js b/test/tests/remote.js index e5d4eed1f..a57c89ad2 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -101,6 +101,31 @@ describe("Remote", function() { }); }); + it("can rename a remote", function() { + var repository = this.repository; + + return Remote.list(repository) + .then(function(remoteNames) { + assert.deepEqual(remoteNames, ["origin"]); + return Remote.rename(repository, "origin", "origin2"); + }) + .then(function(problems) { + assert.deepEqual(problems, []); + return Remote.list(repository); + }) + .then(function(remoteNames) { + assert.deepEqual(remoteNames, ["origin2"]); + return Remote.rename(repository, "origin2", "origin"); + }) + .then(function(problems) { + assert.deepEqual(problems, []); + return Remote.list(repository); + }) + .then(function(remoteNames) { + assert.deepEqual(remoteNames, ["origin"]); + }); + }); + it("can delete a remote", function() { var repository = this.repository; From c007bb72801ffdd81b55ac15ee84593e43fce405 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 24 Mar 2020 16:08:25 -0700 Subject: [PATCH 196/545] Bump OpenSSL prebuilt to 1.1.1c --- utils/discoverOpenSSLDistros.js | 8 ++--- .../static_config/openssl_distributions.json | 34 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/utils/discoverOpenSSLDistros.js b/utils/discoverOpenSSLDistros.js index 5a413a8e6..6fd7586d7 100644 --- a/utils/discoverOpenSSLDistros.js +++ b/utils/discoverOpenSSLDistros.js @@ -60,7 +60,7 @@ const debugPairs = R.toPairs({ R.test(/^\s*compiler\.runtime=MTd$/gm), R.test(/^\s*compiler\.version=15$/gm) ]), - + "macOS-clang-9-static-debug": R.allPass([ ...macCommonConditions, R.test(/^\s*build_type=Debug$/gm), @@ -133,13 +133,13 @@ const releasePairs = R.toPairs({ const distributionPairs = [...debugPairs, ...releasePairs]; const getDistributionConfigURLFromHash = itemHash => - `https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/${itemHash}/conaninfo.txt`; + `https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/${itemHash}/0/conaninfo.txt`; const getDistributionDownloadURLFromHash = itemHash => - `https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/${itemHash}/conan_package.tgz`; + `https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/${itemHash}/0/conan_package.tgz`; const getDistributionsRootURL = () => - "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/package/"; + "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/"; const detectDistributionPairFromConfig = (itemHash, body) => R.pipe( R.find(([_, predicate]) => predicate(body)), diff --git a/vendor/static_config/openssl_distributions.json b/vendor/static_config/openssl_distributions.json index d42ecae15..cdbf16603 100644 --- a/vendor/static_config/openssl_distributions.json +++ b/vendor/static_config/openssl_distributions.json @@ -1,18 +1,18 @@ { - "macOS-clang-8.1-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/bd3cca94af79c6a2c35b664c43f643582a13a9f2/0/conan_package.tgz", - "macOS-clang-8.1-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/0197c20e330042c026560da838f5b4c4bf094b8a/0/conan_package.tgz", - "macOS-clang-9-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/85d674b0f6705cafe6b2edb8689ffbe0f3c2e60b/0/conan_package.tgz", - "macOS-clang-9-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/227fb0ea22f4797212e72ba94ea89c7b3fbc2a0c/0/conan_package.tgz", - "win32-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/39d6fe009a278f733e97b59a4f9536bfc4e8f366/0/conan_package.tgz", - "win32-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/d16d8a16b4cef0046922b8d83d567689d36149d0/0/conan_package.tgz", - "win32-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/889fd4ea9ba89fd6dc7fa32e2f45bd9804b85481/0/conan_package.tgz", - "win32-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/253958a6ce15f1c9325eeea33ffc0a5cfc29212a/0/conan_package.tgz", - "win32-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/05f648ec4d066b206769d6314e859fdd97a18f8d/0/conan_package.tgz", - "win32-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/a075e3ffc3590d6a920a26b4218b20253dd68d57/0/conan_package.tgz", - "win64-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/6bc3be0f39fdc624b24ba9bb00e8af55928d74e7/0/conan_package.tgz", - "win64-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/e942631065059eabe964ca471ad35bb453c15b31/0/conan_package.tgz", - "win64-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/867ca54360ed234a8bc9a6aa63806599ea29b38e/0/conan_package.tgz", - "win64-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/c4aef4edbc33205e0cf9b55bfb116b38c90ec132/0/conan_package.tgz", - "win64-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/0bd0c413b56aaec57c0f222a89b4e565a6729027/0/conan_package.tgz", - "win64-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.0i/stable/0/package/fce9be1511a149a4af36b5997f7e611ab83b2f58/0/conan_package.tgz" -} + "macOS-clang-8.1-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/d1c17264207d7d5cd3268628053a64345144278a/0/conan_package.tgz", + "macOS-clang-8.1-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/2fd87da1a557da1625ed3b37267403907210dfd8/0/conan_package.tgz", + "macOS-clang-9-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/85d674b0f6705cafe6b2edb8689ffbe0f3c2e60b/0/conan_package.tgz", + "macOS-clang-9-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/2f6ec1d0e45c99b245f982a1d4f7554a0ce0f97d/0/conan_package.tgz", + "win32-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/39d6fe009a278f733e97b59a4f9536bfc4e8f366/0/conan_package.tgz", + "win32-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/d16d8a16b4cef0046922b8d83d567689d36149d0/0/conan_package.tgz", + "win32-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/889fd4ea9ba89fd6dc7fa32e2f45bd9804b85481/0/conan_package.tgz", + "win32-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/253958a6ce15f1c9325eeea33ffc0a5cfc29212a/0/conan_package.tgz", + "win32-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/05f648ec4d066b206769d6314e859fdd97a18f8d/0/conan_package.tgz", + "win32-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/a075e3ffc3590d6a920a26b4218b20253dd68d57/0/conan_package.tgz", + "win64-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/6bc3be0f39fdc624b24ba9bb00e8af55928d74e7/0/conan_package.tgz", + "win64-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/e942631065059eabe964ca471ad35bb453c15b31/0/conan_package.tgz", + "win64-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/867ca54360ed234a8bc9a6aa63806599ea29b38e/0/conan_package.tgz", + "win64-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/c4aef4edbc33205e0cf9b55bfb116b38c90ec132/0/conan_package.tgz", + "win64-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/0bd0c413b56aaec57c0f222a89b4e565a6729027/0/conan_package.tgz", + "win64-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/fce9be1511a149a4af36b5997f7e611ab83b2f58/0/conan_package.tgz" +} \ No newline at end of file From 6398d9042cc014b69aaab9bf4701accee11780ed Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 25 Mar 2020 13:06:41 -0700 Subject: [PATCH 197/545] Replace deprecated package request with got --- package-lock.json | 446 ++++++++++++++++++++++++++------ package.json | 2 +- utils/acquireOpenSSL.js | 11 +- utils/discoverOpenSSLDistros.js | 10 +- 4 files changed, 384 insertions(+), 85 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6b80976a..de03d41a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,11 +4,55 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@sindresorhus/is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", + "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==" + }, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" + }, + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "requires": { + "@types/node": "*" + } + }, "@types/node": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", - "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==", - "dev": true + "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } }, "abbrev": { "version": "1.1.1", @@ -101,13 +145,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "dev": true, + "optional": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "dev": true, + "optional": true }, "array-unique": { "version": "0.2.1", @@ -138,7 +184,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "dev": true, + "optional": true }, "async": { "version": "1.5.2", @@ -162,7 +209,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "dev": true, + "optional": true }, "aws-sdk": { "version": "2.326.0", @@ -791,6 +839,7 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, + "optional": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -806,6 +855,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^1.0.0" } @@ -815,6 +865,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, + "optional": true, "requires": { "kind-of": "^6.0.0" } @@ -824,6 +875,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, + "optional": true, "requires": { "kind-of": "^6.0.0" } @@ -833,6 +885,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -843,13 +896,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "optional": true } } }, @@ -965,6 +1020,7 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, + "optional": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -981,10 +1037,34 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true } } }, + "cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "requires": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + } + }, + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } + }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", @@ -1073,6 +1153,7 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, + "optional": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -1085,6 +1166,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -1093,7 +1175,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -1169,6 +1252,21 @@ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + } + } + }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", @@ -1201,6 +1299,7 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, + "optional": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -1237,7 +1336,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", @@ -1294,7 +1394,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "dev": true, + "optional": true }, "core-js": { "version": "2.5.7", @@ -1409,7 +1510,16 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "dev": true, + "optional": true + }, + "decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "requires": { + "mimic-response": "^2.0.0" + } }, "deep-extend": { "version": "0.6.0", @@ -1422,6 +1532,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1436,6 +1551,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, + "optional": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -1446,6 +1562,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, + "optional": true, "requires": { "kind-of": "^6.0.0" } @@ -1455,6 +1572,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, + "optional": true, "requires": { "kind-of": "^6.0.0" } @@ -1464,6 +1582,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1474,13 +1593,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "optional": true } } }, @@ -1563,6 +1684,11 @@ "domelementtype": "1" } }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, "duplexify": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", @@ -1697,6 +1823,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, + "optional": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -1707,6 +1834,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -1809,7 +1937,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "dev": true, + "optional": true }, "for-own": { "version": "0.1.5", @@ -1847,6 +1976,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, + "optional": true, "requires": { "map-cache": "^0.2.2" } @@ -1925,7 +2055,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -1946,12 +2077,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1966,17 +2099,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2093,7 +2229,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2105,6 +2242,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2119,6 +2257,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2126,12 +2265,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2150,6 +2291,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2237,7 +2379,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2249,6 +2392,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2334,7 +2478,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2370,6 +2515,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2389,6 +2535,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2432,12 +2579,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2462,11 +2611,31 @@ "wide-align": "^1.1.0" } }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "dev": true, + "optional": true }, "getpass": { "version": "0.1.7", @@ -2505,6 +2674,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, + "optional": true, "requires": { "is-glob": "^2.0.0" } @@ -2560,6 +2730,28 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "got": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "requires": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -2636,6 +2828,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, + "optional": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -2646,7 +2839,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -2655,6 +2849,7 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, + "optional": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -2665,6 +2860,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" }, @@ -2674,6 +2870,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -2685,6 +2882,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -2757,6 +2955,11 @@ } } }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2838,6 +3041,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -2863,6 +3067,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -2872,6 +3077,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "optional": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -2882,7 +3088,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "dev": true, + "optional": true } } }, @@ -2907,13 +3114,15 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "dev": true, + "optional": true }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "dev": true, + "optional": true }, "is-finite": { "version": "1.0.2", @@ -2937,6 +3146,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, + "optional": true, "requires": { "is-extglob": "^1.0.0" } @@ -2962,6 +3172,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "optional": true, "requires": { "isobject": "^3.0.1" }, @@ -2970,7 +3181,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -3193,6 +3405,11 @@ } } }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3265,11 +3482,20 @@ "dev": true, "optional": true }, + "keyv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", + "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==", + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -3357,17 +3583,24 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "dev": true, + "optional": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, + "optional": true, "requires": { "object-visit": "^1.0.0" } @@ -3414,6 +3647,11 @@ "mime-db": "~1.36.0" } }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3448,6 +3686,7 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, + "optional": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -3458,6 +3697,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "optional": true, "requires": { "is-plain-object": "^2.0.4" } @@ -3698,6 +3938,11 @@ "remove-trailing-separator": "^1.0.1" } }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, "now-and-later": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", @@ -3761,6 +4006,7 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, + "optional": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -3772,6 +4018,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -3789,6 +4036,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, + "optional": true, "requires": { "isobject": "^3.0.0" }, @@ -3797,7 +4045,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -3829,6 +4078,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, + "optional": true, "requires": { "isobject": "^3.0.1" }, @@ -3837,7 +4087,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -3929,6 +4180,32 @@ "object-assign": "^4.1.0" } }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" + }, + "p-event": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", + "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "requires": { + "p-timeout": "^2.0.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "^1.0.0" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -3955,7 +4232,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "dev": true, + "optional": true }, "path-dirname": { "version": "1.0.2", @@ -4223,7 +4501,8 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "dev": true, + "optional": true }, "braces": { "version": "2.3.2", @@ -4486,7 +4765,8 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "optional": true }, "micromatch": { "version": "3.1.10", @@ -4550,6 +4830,7 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, + "optional": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -4620,13 +4901,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "dev": true, + "optional": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "dev": true, + "optional": true }, "repeating": { "version": "2.0.1", @@ -4687,24 +4970,6 @@ "throttleit": "^1.0.0" } }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "requires": { - "lodash": "^4.13.1" - } - }, - "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", - "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" - } - }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -4724,13 +4989,23 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "dev": true, + "optional": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "requires": { + "lowercase-keys": "^2.0.0" + } }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "dev": true, + "optional": true }, "rimraf": { "version": "2.6.2", @@ -4750,6 +5025,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, + "optional": true, "requires": { "ret": "~0.1.10" } @@ -4780,6 +5056,7 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, + "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -4792,6 +5069,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -4820,6 +5098,7 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, + "optional": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -4836,6 +5115,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } @@ -4845,6 +5125,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -4916,7 +5197,8 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "optional": true } } }, @@ -4941,6 +5223,7 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, + "optional": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -4962,7 +5245,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "dev": true, + "optional": true }, "split": { "version": "1.0.1", @@ -4979,6 +5263,7 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, + "optional": true, "requires": { "extend-shallow": "^3.0.0" } @@ -5017,6 +5302,7 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, + "optional": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -5027,17 +5313,13 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, + "optional": true, "requires": { "is-descriptor": "^0.1.0" } } } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", @@ -5206,15 +5488,22 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } }, + "to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==" + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, + "optional": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -5292,6 +5581,11 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -5343,6 +5637,7 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, + "optional": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -5370,6 +5665,7 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, + "optional": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -5380,6 +5676,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, + "optional": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -5391,6 +5688,7 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, + "optional": true, "requires": { "isarray": "1.0.0" } @@ -5401,13 +5699,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "dev": true, + "optional": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -5415,7 +5715,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "dev": true, + "optional": true }, "url": { "version": "0.10.3", @@ -5439,7 +5740,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "dev": true, + "optional": true }, "user-home": { "version": "1.1.1", diff --git a/package.json b/package.json index 50f226a0d..9f7193d22 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ }, "dependencies": { "fs-extra": "^7.0.0", + "got": "^10.7.0", "json5": "^2.1.0", "lodash": "^4.17.14", "nan": "^2.14.0", @@ -46,7 +47,6 @@ "node-pre-gyp": "^0.13.0", "promisify-node": "~0.3.0", "ramda": "^0.25.0", - "request-promise-native": "^1.0.5", "tar-fs": "^1.16.3" }, "devDependencies": { diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 1c1ca29df..b75278340 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -1,7 +1,7 @@ const fse = require("fs-extra"); const path = require("path"); const R = require("ramda"); -const request = require("request-promise-native"); +const got = require("got"); const stream = require("stream"); const tar = require("tar-fs"); const zlib = require("zlib"); @@ -58,12 +58,9 @@ const getDistrbutionURLFromConfig = (config) => { return Promise.resolve(distURL); }; -const fetchFileFromURL = (distUrl) => request({ - method: "GET", - uri: distUrl, - encoding: null, - gzip: true -}); +const fetchFileFromURL = (distUrl) => got(distUrl, { + responseType: 'buffer' +}).then(({ body }) => body); const extractFile = (body) => new Promise((resolve, reject) => { const streamableBody = new stream.Readable(); diff --git a/utils/discoverOpenSSLDistros.js b/utils/discoverOpenSSLDistros.js index 6fd7586d7..a062e6fd2 100644 --- a/utils/discoverOpenSSLDistros.js +++ b/utils/discoverOpenSSLDistros.js @@ -2,7 +2,7 @@ const cheerio = require("cheerio"); const fse = require("fs-extra"); const path = require("path"); const R = require("ramda"); -const request = require("request-promise-native"); +const got = require("got"); const windowsCommonConditions = [ R.test(/^\s*os=Windows$/gm), @@ -149,8 +149,8 @@ const detectDistributionPairFromConfig = (itemHash, body) => R.pipe( )(distributionPairs); const getDistributionConfig = (itemHash) => - request.get(getDistributionConfigURLFromHash(itemHash)) - .then((body) => detectDistributionPairFromConfig(itemHash, body)); + got(getDistributionConfigURLFromHash(itemHash)) + .then(({ body }) => detectDistributionPairFromConfig(itemHash, body)); const discoverDistributions = (treeHtml) => { const releaseHashes = []; @@ -176,8 +176,8 @@ const writeFile = (distributions) => .then(fse.writeFile(outputPath, JSON.stringify(distributions, null, 2))); const outputPath = path.resolve(__dirname, "..", "vendor", "static_config", "openssl_distributions.json"); -request(getDistributionsRootURL()) - .then(discoverDistributions) +got(getDistributionsRootURL()) + .then(({ body }) => discoverDistributions(body)) .then(R.filter(R.identity)) .then(R.sortBy(R.prop(0))) .then(R.fromPairs) From 5d008e0648662cf1187369c3467b7d49508e8424 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 25 Mar 2020 15:26:30 -0700 Subject: [PATCH 198/545] Remove promisify-node and remove old callback api remnants --- generate/templates/templates/nodegit.js | 7 +- lib/commit.js | 63 ++------ lib/filter_registry.js | 23 +-- lib/odb.js | 15 -- lib/repository.js | 202 ++++++------------------ lib/revert.js | 12 +- lib/revwalk.js | 2 +- lib/tree.js | 27 +--- lib/tree_entry.js | 21 +-- package-lock.json | 21 --- package.json | 1 - test/tests/revert.js | 11 +- test/tests/tree.js | 6 +- test/tests/tree_entry.js | 7 +- 14 files changed, 98 insertions(+), 320 deletions(-) delete mode 100644 lib/odb.js diff --git a/generate/templates/templates/nodegit.js b/generate/templates/templates/nodegit.js index 15b8f322c..c22d7d999 100644 --- a/generate/templates/templates/nodegit.js +++ b/generate/templates/templates/nodegit.js @@ -1,5 +1,5 @@ var _ = require("lodash"); -var promisify = require("promisify-node"); +var util = require("util"); var rawApi; // Attempt to load the production release first, if it fails fall back to the @@ -16,6 +16,8 @@ catch (ex) { rawApi = require("../build/Debug/nodegit.node"); } +var promisify = fn => fn && util.promisify(fn); // jshint ignore:line + // For disccussion on why `cloneDeep` is required, see: // https://github.com/facebook/jest/issues/3552 // https://github.com/facebook/jest/issues/3550 @@ -132,9 +134,6 @@ importExtension("filter_registry"); {% endeach %} /* jshint ignore:end */ -// Wrap asynchronous methods to return promises. -promisify(exports); - // Set version. exports.version = require("../package").version; diff --git a/lib/commit.js b/lib/commit.js index c91245f04..8eb561e58 100644 --- a/lib/commit.js +++ b/lib/commit.js @@ -21,17 +21,12 @@ Commit.lookup = LookupWrapper(Commit); * @param {Number} n * @return {Commit} */ -Commit.prototype.parent = function(n, callback) { +Commit.prototype.parent = function(n) { var repo = this.repo; return _parent.call(this, n).then(p => { p.repo = repo; - - if (typeof callback === "function") { - callback(null, p); - } - return p; - }, callback); + }); }; /** @@ -43,10 +38,10 @@ Commit.prototype.parent = function(n, callback) { * @param {String} message_encoding * @param {String} message * @param {Tree|Oid} tree - * @param {Oid} callback + * @return {Oid} */ Commit.prototype.amend = function ( - updateRef, author, committer, message_encoding, message, tree, callback) { + updateRef, author, committer, message_encoding, message, tree) { var repo = this.repo; var _this = this; var treePromise; @@ -244,11 +239,10 @@ Commit.prototype.date = function() { * and its parent(s). * * @async - * @param {Function} callback * @return {Array} an array of diffs */ -Commit.prototype.getDiff = function(callback) { - return this.getDiffWithOptions(null, callback); +Commit.prototype.getDiff = function() { + return this.getDiffWithOptions(null); }; /** @@ -257,10 +251,9 @@ Commit.prototype.getDiff = function(callback) { * * @async * @param {Object} options - * @param {Function} callback * @return {Array} an array of diffs */ -Commit.prototype.getDiffWithOptions = function(options, callback) { +Commit.prototype.getDiffWithOptions = function(options) { var commit = this; return commit.getTree().then(function(thisTree) { @@ -278,13 +271,7 @@ Commit.prototype.getDiffWithOptions = function(options, callback) { return Promise.all(diffs); }); - }).then(function(diffs) { - if (typeof callback === "function") { - callback(null, diffs); - } - - return diffs; - }, callback); + }); }; /** @@ -295,16 +282,10 @@ Commit.prototype.getDiffWithOptions = function(options, callback) { * @param {String} path * @return {TreeEntry} */ -Commit.prototype.getEntry = function(path, callback) { +Commit.prototype.getEntry = function(path) { return this.getTree().then(function(tree) { - return tree.getEntry(path).then(function(entry) { - if (typeof callback === "function") { - callback(null, entry); - } - - return entry; - }); - }, callback); + return tree.getEntry(path); + }); }; /** @@ -312,17 +293,11 @@ Commit.prototype.getEntry = function(path, callback) { * * @async * @param {number} limit Optional amount of parents to return. - * @param {Function} callback * @return {Array} array of commits */ -Commit.prototype.getParents = function(limit, callback) { +Commit.prototype.getParents = function(limit) { var parents = []; - // Shift arguments. - if (typeof limit === "function") { - callback = limit; - } - // If no limit was set, default to the maximum parents. limit = typeof limit === "number" ? limit : this.parentcount(); limit = Math.min(limit, this.parentcount()); @@ -335,13 +310,7 @@ Commit.prototype.getParents = function(limit, callback) { } // Wait for all parents to complete, before returning. - return Promise.all(parents).then(function(parents) { - if (typeof callback === "function") { - callback(null, parents); - } - - return parents; - }, callback); + return Promise.all(parents); }; /** @@ -367,8 +336,8 @@ Commit.prototype.getSignature = function(field) { * @async * @return {Tree} */ -Commit.prototype.getTree = function(callback) { - return this.repo.getTree(this.treeId(), callback); +Commit.prototype.getTree = function() { + return this.repo.getTree(this.treeId()); }; /** @@ -415,7 +384,7 @@ Commit.prototype.history = function() { /** * Get the specified parent of the commit. - * + * * @param {number} the position of the parent, starting from 0 * @async * @return {Commit} the parent commit at the specified position diff --git a/lib/filter_registry.js b/lib/filter_registry.js index 76dfba573..e51f901d5 100644 --- a/lib/filter_registry.js +++ b/lib/filter_registry.js @@ -4,11 +4,10 @@ var normalizeOptions = NodeGit.Utils.normalizeOptions; var FilterRegistry = NodeGit.FilterRegistry; var _register = FilterRegistry.register; -var _unregister = FilterRegistry.unregister; // register should add filter by name to dict and return // Override FilterRegistry.register to normalize Filter -FilterRegistry.register = function(name, filter, priority, callback) { +FilterRegistry.register = function(name, filter, priority) { // setting default value of attributes if (filter.attributes === undefined) { filter.attributes = ""; @@ -17,26 +16,10 @@ FilterRegistry.register = function(name, filter, priority, callback) { filter = normalizeOptions(filter, NodeGit.Filter); if (!filter.check || !filter.apply) { - return callback(new Error( + return Promise.reject(new Error( "ERROR: please provide check and apply callbacks for filter" )); } - return _register(name, filter, priority) - .then(function(result) { - if (typeof callback === "function") { - callback(null, result); - } - return result; - }, callback); -}; - -FilterRegistry.unregister = function(name, callback) { - return _unregister(name) - .then(function(result) { - if (typeof callback === "function") { - callback(null, result); - } - return result; - }, callback); + return _register(name, filter, priority); }; diff --git a/lib/odb.js b/lib/odb.js deleted file mode 100644 index 8bbd15a62..000000000 --- a/lib/odb.js +++ /dev/null @@ -1,15 +0,0 @@ -var NodeGit = require("../"); - -var Odb = NodeGit.Odb; - -var _read = Odb.prototype.read; - -Odb.prototype.read = function(oid, callback) { - return _read.call(this, oid).then(function(odbObject) { - if (typeof callback === "function") { - callback(null, odbObject); - } - - return odbObject; - }, callback); -}; diff --git a/lib/repository.js b/lib/repository.js index d3b6ade2d..69f011ae0 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -331,15 +331,11 @@ function performRebase( are hit. This may be set to null * @return {String} Path of the git repository */ -Repository.discover = function(startPath, acrossFs, ceilingDirs, callback) { +Repository.discover = function(startPath, acrossFs, ceilingDirs) { return _discover(startPath, acrossFs, ceilingDirs) .then(function(foundPath) { - foundPath = path.resolve(foundPath); - if (typeof callback === "function") { - callback(null, foundPath); - } - return foundPath; - }, callback); + return path.resolve(foundPath); + }); }; // Override Repository.initExt to normalize initoptions @@ -551,7 +547,7 @@ Repository.prototype.createBlobFromBuffer = function(buffer) { * @return {Oid} The oid of the commit */ Repository.prototype.createCommit = function( - updateRef, author, committer, message, tree, parents, callback) { + updateRef, author, committer, message, tree, parents) { var repo = this; var promises = []; @@ -586,13 +582,7 @@ Repository.prototype.createCommit = function( parents.length, parents ); - }).then(function(commit) { - if (typeof callback === "function") { - callback(null, commit); - } - - return commit; - }, callback); + }); }; /** @@ -768,8 +758,7 @@ Repository.prototype.createCommitOnHead = function( filesToAdd, author, committer, - message, - callback) { + message) { var repo = this; @@ -808,7 +797,7 @@ Repository.prototype.createCommitOnHead = function( parent ); }); - }, callback); + }); }; /** @@ -819,7 +808,7 @@ Repository.prototype.createCommitOnHead = function( * @param {String} name the name of the tag * @return {Reference} */ -Repository.prototype.createLightweightTag = function(oid, name, callback) { +Repository.prototype.createLightweightTag = function(oid, name) { var repository = this; return Commit.lookup(repository, oid) @@ -852,7 +841,7 @@ Repository.prototype.createRevWalk = function() { * annotated tag * @return {Tag} */ -Repository.prototype.createTag = function(oid, name, message, callback) { +Repository.prototype.createTag = function(oid, name, message) { const repository = this; let signature = null; @@ -866,7 +855,7 @@ Repository.prototype.createTag = function(oid, name, message, callback) { return Tag.create(repository, name, commit, signature, message, 0); }) .then((tagOid) => { - return repository.getTag(tagOid, callback); + return repository.getTag(tagOid); }); }; @@ -986,28 +975,16 @@ Repository.prototype.discardLines = */ Repository.prototype.fetch = function( remote, - fetchOptions, - callback) + fetchOptions) { var repo = this; - function finallyFn(error) { - if (typeof callback === "function") { - callback(error); - } - } - return repo.getRemote(remote) .then(function(remote) { return remote.fetch(null, fetchOptions, "Fetch from " + remote) .then(function() { return remote.disconnect(); }); - }) - .then(finallyFn) - .catch(function(error) { - finallyFn(error); - throw error; }); }; @@ -1018,12 +995,8 @@ Repository.prototype.fetch = function( * @async * @param {Object|FetchOptions} fetchOptions Options for the fetch, includes * callbacks for fetching - * @param {Function} callback */ -Repository.prototype.fetchAll = function( - fetchOptions, - callback) -{ +Repository.prototype.fetchAll = function(fetchOptions) { var repo = this; function createCallbackWrapper(fn, remote) { @@ -1070,11 +1043,6 @@ Repository.prototype.fetchAll = function( return repo.fetch(remote, wrappedFetchOptions); }); }, Promise.resolve()); - }) - .then(function() { - if (typeof callback === "function") { - callback(); - } }); }; @@ -1094,18 +1062,13 @@ Repository.prototype.fetchheadForeach = function(callback) { * @param {String|Oid} String sha or Oid * @return {Blob} */ -Repository.prototype.getBlob = function(oid, callback) { +Repository.prototype.getBlob = function(oid) { var repository = this; return Blob.lookup(repository, oid).then(function(blob) { blob.repo = repository; - - if (typeof callback === "function") { - callback(null, blob); - } - return blob; - }, callback); + }); }; /** @@ -1116,8 +1079,8 @@ Repository.prototype.getBlob = function(oid, callback) { * or Branch Ref * @return {Reference} */ -Repository.prototype.getBranch = function(name, callback) { - return this.getReference(name, callback); +Repository.prototype.getBranch = function(name) { + return this.getReference(name); }; /** @@ -1128,8 +1091,8 @@ Repository.prototype.getBranch = function(name, callback) { * or Branch Ref * @return {Commit} */ -Repository.prototype.getBranchCommit = function(name, callback) { - return this.getReferenceCommit(name, callback); +Repository.prototype.getBranchCommit = function(name) { + return this.getReferenceCommit(name); }; /** @@ -1139,16 +1102,10 @@ Repository.prototype.getBranchCommit = function(name, callback) { * @param {String|Oid} String sha or Oid * @return {Commit} */ -Repository.prototype.getCommit = function(oid, callback) { +Repository.prototype.getCommit = function(oid) { var repository = this; - return Commit.lookup(repository, oid).then(function(commit) { - if (typeof callback === "function") { - callback(null, commit); - } - - return commit; - }, callback); + return Commit.lookup(repository, oid); }; /** @@ -1168,12 +1125,12 @@ Repository.prototype.getCurrentBranch = function() { * @async * @return {Commit} */ -Repository.prototype.getHeadCommit = function(callback) { +Repository.prototype.getHeadCommit = function() { var repo = this; return Reference.nameToId(repo, "HEAD") .then(function(head) { - return repo.getCommit(head, callback); + return repo.getCommit(head); }) .catch(function() { return null; @@ -1186,8 +1143,8 @@ Repository.prototype.getHeadCommit = function(callback) { * @async * @return {Commit} */ -Repository.prototype.getMasterCommit = function(callback) { - return this.getBranchCommit("master", callback); +Repository.prototype.getMasterCommit = function() { + return this.getBranchCommit("master"); }; /** @@ -1198,28 +1155,20 @@ Repository.prototype.getMasterCommit = function(callback) { * or Branch Ref * @return {Reference} */ -Repository.prototype.getReference = function(name, callback) { +Repository.prototype.getReference = function(name) { var repository = this; return Reference.dwim(this, name).then(function(reference) { if (reference.isSymbolic()) { return reference.resolve().then(function(reference) { reference.repo = repository; - - if (typeof callback === "function") { - callback(null, reference); - } - return reference; - }, callback); - } else { - reference.repo = repository; - if (typeof callback === "function") { - callback(null, reference); - } - return reference; + }); } - }, callback); + + reference.repo = repository; + return reference; + }); }; /** @@ -1230,18 +1179,12 @@ Repository.prototype.getReference = function(name, callback) { * or Branch Ref * @return {Commit} */ -Repository.prototype.getReferenceCommit = function(name, callback) { +Repository.prototype.getReferenceCommit = function(name) { var repository = this; return this.getReference(name).then(function(reference) { - return repository.getCommit(reference.target()).then(function(commit) { - if (typeof callback === "function") { - callback(null, commit); - } - - return commit; - }); - }, callback); + return repository.getCommit(reference.target()); + }); }; /** @@ -1268,44 +1211,24 @@ Repository.prototype.getReferenceNames = function(type) { * * @async * @param {String|Remote} remote - * @param {Function} callback * @return {Remote} The remote object */ -Repository.prototype.getRemote = function(remote, callback) { +Repository.prototype.getRemote = function(remote) { if (remote instanceof NodeGit.Remote) { - return Promise.resolve(remote).then(function(remoteObj) { - if (typeof callback === "function") { - callback(null, remoteObj); - } - - return remoteObj; - }, callback); + return Promise.resolve(remote); } - return NodeGit.Remote.lookup(this, remote).then(function(remoteObj) { - if (typeof callback === "function") { - callback(null, remoteObj); - } - - return remoteObj; - }, callback); + return NodeGit.Remote.lookup(this, remote); }; /** * Lists out the remotes in the given repository. * * @async -* @param {Function} Optional callback * @return {Object} Promise object. */ -Repository.prototype.getRemoteNames = function(callback) { - return Remote.list(this).then(function(remotes) { - if (typeof callback === "function") { - callback(null, remotes); - } - - return remotes; - }, callback); +Repository.prototype.getRemoteNames = function() { + return Remote.list(this); }; /** @@ -1371,17 +1294,13 @@ Repository.prototype.getStatusExt = function(opts) { * @async * @return {Array} */ -Repository.prototype.getSubmoduleNames = function(callback) { +Repository.prototype.getSubmoduleNames = function() { var names = []; var submoduleCallback = function(submodule, name, payload) { names.push(name); }; return Submodule.foreach(this, submoduleCallback).then(function() { - if (typeof callback === "function") { - callback(null, names); - } - return names; }); }; @@ -1393,18 +1312,13 @@ Repository.prototype.getSubmoduleNames = function(callback) { * @param {String|Oid} String sha or Oid * @return {Tag} */ -Repository.prototype.getTag = function(oid, callback) { +Repository.prototype.getTag = function(oid) { var repository = this; return Tag.lookup(repository, oid).then(function(reference) { reference.repo = repository; - - if (typeof callback === "function") { - callback(null, reference); - } - return reference; - }, callback); + }); }; /** @@ -1414,22 +1328,18 @@ Repository.prototype.getTag = function(oid, callback) { * @param {String} Short or full tag name * @return {Tag} */ -Repository.prototype.getTagByName = function(name, callback) { +Repository.prototype.getTagByName = function(name) { var repo = this; name = ~name.indexOf("refs/tags/") ? name : "refs/tags/" + name; - return Reference.nameToId(repo, name).then(function(oid) { - return Tag.lookup(repo, oid).then(function(reference) { + return Reference.nameToId(repo, name) + .then(function(oid) { + return Tag.lookup(repo, oid); + }).then(function(reference) { reference.repo = repo; - - if (typeof callback === "function") { - callback(null, reference); - } - return reference; }); - }, callback); }; /** @@ -1439,18 +1349,13 @@ Repository.prototype.getTagByName = function(name, callback) { * @param {String|Oid} String sha or Oid * @return {Tree} */ -Repository.prototype.getTree = function(oid, callback) { +Repository.prototype.getTree = function(oid) { var repository = this; return Tree.lookup(repository, oid).then(function(tree) { tree.repo = repository; - - if (typeof callback === "function") { - callback(null, tree); - } - return tree; - }, callback); + }); }; /** @@ -1632,19 +1537,12 @@ Repository.prototype.rebaseBranches = function( * @async * @return {Index} */ -Repository.prototype.refreshIndex = function(callback) { +Repository.prototype.refreshIndex = function() { var repo = this; repo.setIndex(); // clear the index - return repo.index() - .then(function(index) { - if (typeof callback === "function") { - callback(null, index); - } - - return index; - }, callback); + return repo.index(); }; /** diff --git a/lib/revert.js b/lib/revert.js index 84c05b5c9..d6ef9b705 100644 --- a/lib/revert.js +++ b/lib/revert.js @@ -24,8 +24,7 @@ Revert.commit = function( revert_commit, our_commit, mainline, - merge_options, - callback + merge_options ) { merge_options = normalizeOptions(merge_options, NodeGit.MergeOptions); @@ -37,14 +36,7 @@ Revert.commit = function( our_commit, mainline, merge_options - ) - .then(function(result) { - if (typeof callback === "function") { - callback(null, result); - } - - return result; - }, callback); + ); }; /** diff --git a/lib/revwalk.js b/lib/revwalk.js index a12d9f7f4..7787fc89b 100644 --- a/lib/revwalk.js +++ b/lib/revwalk.js @@ -119,7 +119,7 @@ Revwalk.prototype.walk = function(oid, callback) { this.push(oid); function walk() { - revwalk.next().done(function(oid) { + revwalk.next().then(function(oid) { if (!oid) { if (typeof callback === "function") { return callback(); diff --git a/lib/tree.js b/lib/tree.js index 43af49656..1067fa3f2 100644 --- a/lib/tree.js +++ b/lib/tree.js @@ -11,7 +11,6 @@ var Treebuilder = NodeGit.Treebuilder; * @async * @param {Repository} repo The repo that the tree lives in * @param {String|Oid|Tree} id The tree to lookup -* @param {Function} callback * @return {Tree} */ Tree.lookup = LookupWrapper(Tree); @@ -33,11 +32,10 @@ Tree.prototype.builder = function() { * Diff two trees * @async * @param {Tree} tree to diff against - * @param {Function} callback * @return {Diff} */ -Tree.prototype.diff = function(tree, callback) { - return this.diffWithOptions(tree, null, callback); +Tree.prototype.diff = function(tree) { + return this.diffWithOptions(tree, null); }; /** @@ -45,17 +43,10 @@ Tree.prototype.diff = function(tree, callback) { * @async * @param {Tree} tree to diff against * @param {Object} options - * @param {Function} callback * @return {Diff} */ -Tree.prototype.diffWithOptions = function(tree, options, callback) { - return Diff.treeToTree(this.repo, tree, this, options).then(function(diff) { - if (typeof callback === "function") { - callback(null, diff); - } - - return diff; - }, callback); +Tree.prototype.diffWithOptions = function(tree, options) { + return Diff.treeToTree(this.repo, tree, this, options); }; /** @@ -104,17 +95,12 @@ Tree.prototype.entryByName = function(name) { * @param {String} filePath * @return {TreeEntry} */ -Tree.prototype.getEntry = function(filePath, callback) { +Tree.prototype.getEntry = function(filePath) { var tree = this; return this.entryByPath(filePath).then(function(entry) { entry.parent = tree; entry.dirtoparent = path.dirname(filePath); - - if (typeof callback === "function") { - callback(null, entry); - } - return entry; }); }; @@ -171,7 +157,8 @@ Tree.prototype.walk = function(blobsOnly) { if (entry.isTree()) { total++; - entry.getTree(bfs); + entry.getTree() + .then(result => bfs(null, result), bfs); } }); diff --git a/lib/tree_entry.js b/lib/tree_entry.js index b9bc0fd72..a978de9a3 100644 --- a/lib/tree_entry.js +++ b/lib/tree_entry.js @@ -7,14 +7,8 @@ var TreeEntry = NodeGit.TreeEntry; * @async * @return {Blob} */ -TreeEntry.prototype.getBlob = function(callback) { - return this.parent.repo.getBlob(this.id()).then(function(blob) { - if (typeof callback === "function") { - callback(null, blob); - } - - return blob; - }, callback); +TreeEntry.prototype.getBlob = function() { + return this.parent.repo.getBlob(this.id()); }; /** @@ -22,18 +16,13 @@ TreeEntry.prototype.getBlob = function(callback) { * @async * @return {Tree} */ -TreeEntry.prototype.getTree = function(callback) { +TreeEntry.prototype.getTree = function() { var entry = this; return this.parent.repo.getTree(this.id()).then(function(tree) { tree.entry = entry; - - if (typeof callback === "function") { - callback(null, tree); - } - return tree; - }, callback); + }); }; /** @@ -89,7 +78,7 @@ TreeEntry.prototype.oid = function() { * Returns the path for this entry. * @return {String} */ -TreeEntry.prototype.path = function(callback) { +TreeEntry.prototype.path = function() { var dirtoparent = this.dirtoparent || ""; return path.join(this.parent.path(), dirtoparent, this.name()); }; diff --git a/package-lock.json b/package-lock.json index de03d41a3..b71c90c33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -162,11 +162,6 @@ "dev": true, "optional": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -3913,14 +3908,6 @@ } } }, - "nodegit-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz", - "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=", - "requires": { - "asap": "~2.0.3" - } - }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -4357,14 +4344,6 @@ "dev": true, "optional": true }, - "promisify-node": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.3.0.tgz", - "integrity": "sha1-tLVaz5D6p9K4uQyjlomQhsAwYM8=", - "requires": { - "nodegit-promise": "~4.0.0" - } - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", diff --git a/package.json b/package.json index 9f7193d22..96539ef15 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "nan": "^2.14.0", "node-gyp": "^4.0.0", "node-pre-gyp": "^0.13.0", - "promisify-node": "~0.3.0", "ramda": "^0.25.0", "tar-fs": "^1.16.3" }, diff --git a/test/tests/revert.js b/test/tests/revert.js index 46263e7b9..e213dec28 100644 --- a/test/tests/revert.js +++ b/test/tests/revert.js @@ -37,15 +37,16 @@ describe("Revert", function() { var fileStats = fs.statSync(path.join(repoPath, fileName)); assert.ok(fileStats.isFile()); - Revert.revert(test.repository, test.firstCommit, new RevertOptions()) + return Revert.revert(test.repository, test.firstCommit, new RevertOptions()) .then(function() { try { fs.statSync(path.join(repoPath, fileName)); - assert.fail("Working directory was not reverted"); - } - catch (error) { - // pass + } catch (e) { + // we expect this not to exist + return; } + + assert.fail("Working directory was not reverted"); }); }); diff --git a/test/tests/tree.js b/test/tests/tree.js index 98c5959e9..68765bf74 100644 --- a/test/tests/tree.js +++ b/test/tests/tree.js @@ -31,11 +31,11 @@ describe("Tree", function() { }); it("gets an entry by name", - function(done) { - this.commit.getTree().then(function(tree) { + function() { + return this.commit.getTree().then(function(tree) { var entry = tree.entryByName("README.md"); assert(entry); - }).done(done); + }); }); it("updates a tree", function () { diff --git a/test/tests/tree_entry.js b/test/tests/tree_entry.js index 086a4f8d2..f62f374f0 100644 --- a/test/tests/tree_entry.js +++ b/test/tests/tree_entry.js @@ -61,7 +61,7 @@ describe("TreeEntry", function() { }); }); - it("provides the full path when the entry came from a tree", function(done) { + it("provides the full path when the entry came from a tree", function() { var testTree = function(tree, _dir) { var dir = _dir || "", testPromises = []; @@ -82,10 +82,7 @@ describe("TreeEntry", function() { }; return this.commit.getTree() - .then(testTree) - .done(function() { - done(); - }); + .then(testTree); }); it("provides the blob representation of the entry", function() { From 8a59c1cbedf8f70404ebc923f9d212052a4205ca Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 26 Mar 2020 16:07:48 -0700 Subject: [PATCH 199/545] Bump to 0.27.0-alpha.1 --- CHANGELOG.md | 18 ++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9acdd2c2..022a98ae3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Change Log +## v0.27.0-alpha.1 [(2020-03-26)](https://github.com/nodegit/nodegit/releases/tag/v0.27.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.5...v0.27.0-alpha.1) + +#### Summary of changes +- Expose git_remote_rename +- Bump OpenSSL from 1.1.0i -> 1.1.1c in Windows/Mac OS Electron builds +- Replace unmaintained request library with got +- Remove promisify-node and use vanilla promises for all NodeGit promises + +### #Merged PRs into NodeGit +- [Remove promisify-node and remove old callback api remnants](https://github.com/nodegit/nodegit/pull/1772) +- [Replace deprecated package request with got](https://github.com/nodegit/nodegit/pull/1771) +- [Bump OpenSSL prebuilt to 1.1.1c](https://github.com/nodegit/nodegit/pull/1770) +- [Expose git_remote_rename](https://github.com/nodegit/nodegit/pull/1767) +- [Dedupe Remote.prototype.fetch](https://github.com/nodegit/nodegit/pull/1766) + + ## v0.26.5 [(2020-02-27)](https://github.com/nodegit/nodegit/releases/tag/v0.26.5) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.4...v0.26.5) diff --git a/package-lock.json b/package-lock.json index b71c90c33..7f7bb222d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.26.5", + "version": "0.27.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 96539ef15..0422b8c0f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.26.5", + "version": "0.27.0-alpha.1", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 69b010a1125ebaa2afee955dd465cc5ef4c125d4 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 28 Jul 2020 10:15:54 -0700 Subject: [PATCH 200/545] Use a different folder for ssh test keys --- .github/workflows/tests.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 89c64db28..e15ae9d4b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,12 +20,12 @@ jobs: steps: - name: Setup Environment run: | - mkdir ~/.ssh - chmod 700 ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh/config - echo -e "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R" > ~/.ssh/id_rsa.pub - echo -e "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa* + mkdir ~/.ssh_tests + chmod 700 ~/.ssh_tests + echo -e "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config + echo -e "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R" > ~/.ssh_tests/id_rsa.pub + echo -e "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----" > ~/.ssh_tests/id_rsa + chmod 600 ~/.ssh_tests/id_rsa* git config --global user.name "John Doe" git config --global user.email johndoe@example.com @@ -53,7 +53,7 @@ jobs: run: | set -e eval `ssh-agent -s` - ssh-add ~/.ssh/id_rsa + ssh-add ~/.ssh_tests/id_rsa node utils/retry npm test - name: Deploy From d5ad62c5c74a3a895326cb3f9c6dc15fbd94f964 Mon Sep 17 00:00:00 2001 From: Matthew Williamson Date: Tue, 28 Jul 2020 10:39:22 -0700 Subject: [PATCH 201/545] Remote needs to REALLY persist the callback/proxyOpts/headers --- lib/remote.js | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/lib/remote.js b/lib/remote.js index 6106779e3..576ead232 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -8,6 +8,7 @@ var shallowClone = NodeGit.Utils.shallowClone; var Remote = NodeGit.Remote; var _connect = Remote.prototype.connect; var _createWithOpts = Remote.createWithOpts; +var _disconnect = Remote.prototype.disconnect; var _download = Remote.prototype.download; var _fetch = Remote.prototype.fetch; var _push = Remote.prototype.push; @@ -45,7 +46,29 @@ Remote.prototype.connect = function( proxyOpts = normalizeOptions(proxyOpts || {}, NodeGit.ProxyOptions); customHeaders = customHeaders || []; - return _connect.call(this, direction, callbacks, proxyOpts, customHeaders); + return _connect.call(this, direction, callbacks, proxyOpts, customHeaders) + .then(() => { + // Save options on the remote object. If we don't do this, + // the options may be cleaned up and cause a segfault + // when Remote.prototype.connect is called. + Object.defineProperties(this, { + callbacks: { + configurable: true, + value: callbacks, + writable: false + }, + proxyOpts: { + configurable: true, + value: proxyOpts, + writable: false + }, + customHeaders: { + configurable: true, + value: customHeaders, + writable: false + } + }); + }); }; Remote.createWithOpts = function(url, options) { @@ -53,6 +76,30 @@ Remote.createWithOpts = function(url, options) { options, NodeGit.RemoteCreateOptions)); }; +Remote.prototype.disconnect = function() { + return _disconnect.call(this) + .then(() => { + // Release the options + Object.defineProperties(this, { + callbacks: { + configurable: true, + value: undefined, + writable: false + }, + proxyOpts: { + configurable: true, + value: undefined, + writable: false + }, + customHeaders: { + configurable: true, + value: undefined, + writable: false + } + }); + }); +}; + /** * Connects to a remote * From e71eea7aee74dcb416fe301d2ed7afcdde0c252a Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 28 Jul 2020 10:54:29 -0700 Subject: [PATCH 202/545] Upgrade build environments MacOS -> 10.15 Retire Node 8 Build on Node 14 --- .github/workflows/tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e15ae9d4b..2f2f782a3 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,8 +14,8 @@ jobs: name: "*nix Tests" strategy: matrix: - node: [8, 10, 12] - os: [ubuntu-16.04, macOS-10.14] + node: [10, 12, 14] + os: [ubuntu-16.04, macOS-10.15] runs-on: ${{ matrix.os }} steps: - name: Setup Environment @@ -31,7 +31,7 @@ jobs: - uses: actions/checkout@master - - name: Use Node.js 8.x + - name: Use Node.js uses: actions/setup-node@master with: node-version: ${{ matrix.node }} @@ -72,7 +72,7 @@ jobs: name: Windows Tests strategy: matrix: - node: [8, 10, 12] + node: [10, 12, 14] arch: [x86, x64] runs-on: windows-2016 steps: @@ -86,7 +86,7 @@ jobs: - uses: actions/checkout@master - - name: Use Node.js 8.x + - name: Use Node.js uses: implausible/setup-node@feature/expose-architecture-override with: node-version: ${{ matrix.node }} From 0327c08e2d0fdaaef2f1865b82959bcea5353b5b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 28 Jul 2020 11:31:52 -0700 Subject: [PATCH 203/545] Bump to v0.27.0 --- CHANGELOG.md | 21 +++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 022a98ae3..7a6784439 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Change Log +## v0.27.0 [(2020-07-28)](https://github.com/nodegit/nodegit/releases/tag/v0.27.0) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.5...v0.27.0) + +#### Summary of changes +- Expose git_remote_rename +- Bump OpenSSL from 1.1.0i -> 1.1.1c in Windows/Mac OS Electron builds +- Replace unmaintained request library with got +- Remove promisify-node and use vanilla promises for all NodeGit promises +- Prebuilds for Node 14, deprecate Node 8 +- Persist RemoteCallbacks and ProxyOptions on the remote if using Remote.prototype.connect. This fixes a segfault when using any routines on a connected remote. + +### #Merged PRs into NodeGit +- [Upgrade build environments #1785](https://github.com/nodegit/nodegit/pull/1785) +- [Remote needs to persist the callback/proxyOpts/headers #1784](https://github.com/nodegit/nodegit/pull/1784) +- [Remove promisify-node and remove old callback api remnants](https://github.com/nodegit/nodegit/pull/1772) +- [Replace deprecated package request with got](https://github.com/nodegit/nodegit/pull/1771) +- [Bump OpenSSL prebuilt to 1.1.1c](https://github.com/nodegit/nodegit/pull/1770) +- [Expose git_remote_rename](https://github.com/nodegit/nodegit/pull/1767) +- [Dedupe Remote.prototype.fetch](https://github.com/nodegit/nodegit/pull/1766) + ## v0.27.0-alpha.1 [(2020-03-26)](https://github.com/nodegit/nodegit/releases/tag/v0.27.0-alpha.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.5...v0.27.0-alpha.1) diff --git a/package-lock.json b/package-lock.json index 7f7bb222d..6c7f169a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.27.0-alpha.1", + "version": "0.27.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0422b8c0f..36c09494c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.27.0-alpha.1", + "version": "0.27.0", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 58de0a751ea9170d1acaa0ed54885a4e29664b5a Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 13 Aug 2020 15:23:34 -0700 Subject: [PATCH 204/545] Bump Libgit2 to fork of v1.0.0 Fix gyp --- generate/input/callbacks.json | 6 +- generate/input/descriptor.json | 84 +- generate/input/libgit2-docs.json | 1924 ++++++++++++------------ generate/input/libgit2-supplement.json | 14 +- guides/cloning/gh-two-factor/index.js | 2 +- guides/cloning/ssh-with-agent/index.js | 2 +- lib/credential.js | 33 + lib/libgit2.js | 4 +- test/tests/clone.js | 10 +- test/tests/cred.js | 32 +- test/tests/remote.js | 15 +- test/tests/repository.js | 2 +- vendor/libgit2 | 2 +- vendor/libgit2.gyp | 14 +- 14 files changed, 1117 insertions(+), 1027 deletions(-) create mode 100644 lib/credential.js diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index 0d8720b79..c8db807e5 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -180,11 +180,11 @@ "error": -1 } }, - "git_cred_acquire_cb": { + "git_credential_acquire_cb": { "args": [ { - "name": "cred", - "cType": "git_cred **", + "name": "credential", + "cType": "git_credential **", "isReturn": true }, { diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 07bb84650..b1aa0d463 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -33,6 +33,10 @@ } } }, + "credential": { + "JsName": "TYPE", + "owner": "Credential" + }, "describe_strategy": { "ignore": true }, @@ -132,6 +136,11 @@ }, "attr": { "functions": { + "git_attr_cache_flush": { + "return": { + "isErrorCode": true + } + }, "git_attr_foreach": { "ignore": true }, @@ -1066,61 +1075,61 @@ } } }, - "cred": { + "credential": { "needsForwardDeclaration": false, "selfFreeing": true, - "cType": "git_cred", + "cType": "git_credential", "fields": { "free": { "ignore": true } }, "functions": { - "git_cred_default_new": { + "git_credential_default_new": { "isAsync": false }, - "git_cred_free": { + "git_credential_free": { "ignore": true }, - "git_cred_ssh_custom_new": { + "git_credential_ssh_custom_new": { "ignore": true }, - "git_cred_ssh_interactive_new": { + "git_credential_ssh_interactive_new": { "ignore": true }, - "git_cred_ssh_key_from_agent": { + "git_credential_ssh_key_from_agent": { "isAsync": false }, - "git_cred_ssh_key_new": { + "git_credential_ssh_key_new": { "isAsync": false }, - "git_cred_userpass": { + "git_credential_userpass": { "ignore": true }, - "git_cred_userpass_plaintext_new": { + "git_credential_userpass_plaintext_new": { "isAsync": false } } }, - "cred_default": { + "credential_default": { "ignore": true }, - "cred_ssh_custom": { + "credential_ssh_custom": { "ignore": true }, - "cred_ssh_interactive": { + "credential_ssh_interactive": { "ignore": true }, - "cred_ssh_key": { + "credential_ssh_key": { "ignore": true }, - "cred_username": { + "credential_username": { "ignore": true }, - "cred_userpass_payload": { + "credential_userpass_payload": { "ignore": true }, - "cred_userpass_plaintext": { + "credential_userpass_plaintext": { "ignore": true }, "describe": { @@ -1996,7 +2005,10 @@ "git_index_name_clear": { "cppFunctionName": "Clear", "jsFunctionName": "clear", - "isAsync": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_index_name_entrycount": { "cppFunctionName": "Entrycount", @@ -2031,7 +2043,10 @@ "cppFunctionName": "Clear", "jsFunctionName": "clear", "isAsync": true, - "isPrototypeMethod": false + "isPrototypeMethod": false, + "return": { + "isErrorCode": true + } }, "git_index_reuc_entrycount": { "cppFunctionName": "Entrycount", @@ -2571,10 +2586,17 @@ "shouldAlloc": true, "functions": { "git_oid_cpy": { + "isAsync": false, "args": { + "src": { + "shouldAlloc": false + }, "out": { "isReturn": true } + }, + "return": { + "isErrorCode": true } }, "git_oid_fmt": { @@ -2707,8 +2729,10 @@ }, "git_patch_from_diff": { "isAsync": true, - "return": { - "ownedBy": ["diff"] + "args": { + "out": { + "ownedBy": ["diff"] + } } }, "git_patch_get_delta": { @@ -3203,7 +3227,10 @@ } }, "git_remote_disconnect": { - "isAsync": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_remote_download": { "args": { @@ -3408,7 +3435,10 @@ ], "functions": { "git_repository__cleanup": { - "isAsync": true + "isAsync": true, + "return": { + "isErrorCode": true + } }, "git_repository_config": { "args": { @@ -3525,6 +3555,9 @@ "index": { "isOptional": true } + }, + "return": { + "isErrorCode": true } }, "git_repository_set_odb": { @@ -4321,6 +4354,11 @@ "treebuilder": { "selfFreeing": true, "functions": { + "git_treebuilder_clear": { + "return": { + "isErrorCode": true + } + }, "git_treebuilder_filter": { "ignore": true }, diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index cb1361c66..c01194e82 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -37,7 +37,7 @@ "git_attr_add_macro" ], "meta": {}, - "lines": 258 + "lines": 261 }, { "file": "git2/blame.h", @@ -200,7 +200,7 @@ "git_libgit2_opts" ], "meta": {}, - "lines": 404 + "lines": 411 }, { "file": "git2/config.h", @@ -254,28 +254,28 @@ "lines": 762 }, { - "file": "git2/cred.h", + "file": "git2/credential.h", "functions": [ - "git_cred_acquire_cb", - "git_cred_free", - "git_cred_has_username", - "git_cred_get_username", - "git_cred_userpass_plaintext_new", - "git_cred_default_new", - "git_cred_username_new", - "git_cred_ssh_key_new", - "git_cred_ssh_key_memory_new", - "git_cred_ssh_interactive_new", - "git_cred_ssh_key_from_agent", - "git_cred_ssh_custom_new" + "git_credential_acquire_cb", + "git_credential_free", + "git_credential_has_username", + "git_credential_get_username", + "git_credential_userpass_plaintext_new", + "git_credential_default_new", + "git_credential_username_new", + "git_credential_ssh_key_new", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_custom_new" ], "meta": {}, - "lines": 304 + "lines": 310 }, { - "file": "git2/cred_helpers.h", + "file": "git2/credential_helpers.h", "functions": [ - "git_cred_userpass" + "git_credential_userpass" ], "meta": {}, "lines": 48 @@ -296,7 +296,7 @@ "git_blame_init_options" ], "meta": {}, - "lines": 459 + "lines": 530 }, { "file": "git2/describe.h", @@ -367,7 +367,7 @@ "git_error_set_oom" ], "meta": {}, - "lines": 157 + "lines": 159 }, { "file": "git2/filter.h", @@ -650,7 +650,7 @@ "git_oid_shorten_free" ], "meta": {}, - "lines": 264 + "lines": 269 }, { "file": "git2/oidarray.h", @@ -908,7 +908,7 @@ "git_remote_default_branch" ], "meta": {}, - "lines": 949 + "lines": 951 }, { "file": "git2/repository.h", @@ -1016,7 +1016,7 @@ "git_revwalk_add_hide_cb" ], "meta": {}, - "lines": 291 + "lines": 295 }, { "file": "git2/signature.h", @@ -1250,7 +1250,7 @@ "git_tree_create_updated" ], "meta": {}, - "lines": 479 + "lines": 481 }, { "file": "git2/types.h", @@ -1315,7 +1315,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_from_ref-1" + "ex/v0.99.0/checkout.html#git_annotated_commit_from_ref-1" ] } }, @@ -1448,12 +1448,12 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_id-2" + "ex/v0.99.0/checkout.html#git_annotated_commit_id-2" ], "merge.c": [ - "ex/HEAD/merge.html#git_annotated_commit_id-1", - "ex/HEAD/merge.html#git_annotated_commit_id-2", - "ex/HEAD/merge.html#git_annotated_commit_id-3" + "ex/v0.99.0/merge.html#git_annotated_commit_id-1", + "ex/v0.99.0/merge.html#git_annotated_commit_id-2", + "ex/v0.99.0/merge.html#git_annotated_commit_id-3" ] } }, @@ -1480,9 +1480,9 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_ref-3", - "ex/HEAD/checkout.html#git_annotated_commit_ref-4", - "ex/HEAD/checkout.html#git_annotated_commit_ref-5" + "ex/v0.99.0/checkout.html#git_annotated_commit_ref-3", + "ex/v0.99.0/checkout.html#git_annotated_commit_ref-4", + "ex/v0.99.0/checkout.html#git_annotated_commit_ref-5" ] } }, @@ -1509,7 +1509,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_free-6" + "ex/v0.99.0/checkout.html#git_annotated_commit_free-6" ] } }, @@ -1748,20 +1748,20 @@ "git_attr_cache_flush": { "type": "function", "file": "git2/attr.h", - "line": 242, - "lineto": 243, + "line": 245, + "lineto": 246, "args": [ { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "The repository containing the gitattributes cache" } ], "argline": "git_repository *repo", "sig": "git_repository *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success, or an error code" }, "description": "

Flush the gitattributes cache.

\n", "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", @@ -1770,8 +1770,8 @@ "git_attr_add_macro": { "type": "function", "file": "git2/attr.h", - "line": 255, - "lineto": 258, + "line": 258, + "lineto": 261, "args": [ { "name": "repo", @@ -1903,7 +1903,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_get_hunk_byline-1" + "ex/v0.99.0/blame.html#git_blame_get_hunk_byline-1" ] } }, @@ -1945,7 +1945,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_file-2" + "ex/v0.99.0/blame.html#git_blame_file-2" ] } }, @@ -2009,7 +2009,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_free-3" + "ex/v0.99.0/blame.html#git_blame_free-3" ] } }, @@ -2046,10 +2046,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_lookup-4" + "ex/v0.99.0/blame.html#git_blob_lookup-4" ], "general.c": [ - "ex/HEAD/general.html#git_blob_lookup-1" + "ex/v0.99.0/general.html#git_blob_lookup-1" ] } }, @@ -2113,10 +2113,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_free-5" + "ex/v0.99.0/blame.html#git_blob_free-5" ], "general.c": [ - "ex/HEAD/general.html#git_blob_free-2" + "ex/v0.99.0/general.html#git_blob_free-2" ] } }, @@ -2187,13 +2187,13 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_rawcontent-6" + "ex/v0.99.0/blame.html#git_blob_rawcontent-6" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_blob_rawcontent-1" + "ex/v0.99.0/cat-file.html#git_blob_rawcontent-1" ], "general.c": [ - "ex/HEAD/general.html#git_blob_rawcontent-3" + "ex/v0.99.0/general.html#git_blob_rawcontent-3" ] } }, @@ -2220,14 +2220,14 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_rawsize-7" + "ex/v0.99.0/blame.html#git_blob_rawsize-7" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_blob_rawsize-2" + "ex/v0.99.0/cat-file.html#git_blob_rawsize-2" ], "general.c": [ - "ex/HEAD/general.html#git_blob_rawsize-4", - "ex/HEAD/general.html#git_blob_rawsize-5" + "ex/v0.99.0/general.html#git_blob_rawsize-4", + "ex/v0.99.0/general.html#git_blob_rawsize-5" ] } }, @@ -2562,7 +2562,7 @@ "group": "branch", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_branch_create_from_annotated-7" + "ex/v0.99.0/checkout.html#git_branch_create_from_annotated-7" ] } }, @@ -2776,7 +2776,7 @@ "group": "branch", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_branch_name-4" + "ex/v0.99.0/merge.html#git_branch_name-4" ] } }, @@ -2997,11 +2997,11 @@ "group": "buf", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_buf_dispose-1", - "ex/HEAD/diff.html#git_buf_dispose-2" + "ex/v0.99.0/diff.html#git_buf_dispose-1", + "ex/v0.99.0/diff.html#git_buf_dispose-2" ], "tag.c": [ - "ex/HEAD/tag.html#git_buf_dispose-1" + "ex/v0.99.0/tag.html#git_buf_dispose-1" ] } }, @@ -3227,10 +3227,10 @@ "group": "checkout", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_checkout_tree-8" + "ex/v0.99.0/checkout.html#git_checkout_tree-8" ], "merge.c": [ - "ex/HEAD/merge.html#git_checkout_tree-5" + "ex/v0.99.0/merge.html#git_checkout_tree-5" ] } }, @@ -3437,18 +3437,18 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_lookup-9" + "ex/v0.99.0/checkout.html#git_commit_lookup-9" ], "general.c": [ - "ex/HEAD/general.html#git_commit_lookup-6", - "ex/HEAD/general.html#git_commit_lookup-7", - "ex/HEAD/general.html#git_commit_lookup-8" + "ex/v0.99.0/general.html#git_commit_lookup-6", + "ex/v0.99.0/general.html#git_commit_lookup-7", + "ex/v0.99.0/general.html#git_commit_lookup-8" ], "log.c": [ - "ex/HEAD/log.html#git_commit_lookup-1" + "ex/v0.99.0/log.html#git_commit_lookup-1" ], "merge.c": [ - "ex/HEAD/merge.html#git_commit_lookup-6" + "ex/v0.99.0/merge.html#git_commit_lookup-6" ] } }, @@ -3512,20 +3512,20 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_free-10" + "ex/v0.99.0/checkout.html#git_commit_free-10" ], "general.c": [ - "ex/HEAD/general.html#git_commit_free-9", - "ex/HEAD/general.html#git_commit_free-10", - "ex/HEAD/general.html#git_commit_free-11", - "ex/HEAD/general.html#git_commit_free-12", - "ex/HEAD/general.html#git_commit_free-13" + "ex/v0.99.0/general.html#git_commit_free-9", + "ex/v0.99.0/general.html#git_commit_free-10", + "ex/v0.99.0/general.html#git_commit_free-11", + "ex/v0.99.0/general.html#git_commit_free-12", + "ex/v0.99.0/general.html#git_commit_free-13" ], "log.c": [ - "ex/HEAD/log.html#git_commit_free-2", - "ex/HEAD/log.html#git_commit_free-3", - "ex/HEAD/log.html#git_commit_free-4", - "ex/HEAD/log.html#git_commit_free-5" + "ex/v0.99.0/log.html#git_commit_free-2", + "ex/v0.99.0/log.html#git_commit_free-3", + "ex/v0.99.0/log.html#git_commit_free-4", + "ex/v0.99.0/log.html#git_commit_free-5" ] } }, @@ -3552,10 +3552,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_id-14" + "ex/v0.99.0/general.html#git_commit_id-14" ], "log.c": [ - "ex/HEAD/log.html#git_commit_id-6" + "ex/v0.99.0/log.html#git_commit_id-6" ] } }, @@ -3582,8 +3582,8 @@ "group": "commit", "examples": { "log.c": [ - "ex/HEAD/log.html#git_commit_owner-7", - "ex/HEAD/log.html#git_commit_owner-8" + "ex/v0.99.0/log.html#git_commit_owner-7", + "ex/v0.99.0/log.html#git_commit_owner-8" ] } }, @@ -3632,21 +3632,21 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_message-3", - "ex/HEAD/cat-file.html#git_commit_message-4" + "ex/v0.99.0/cat-file.html#git_commit_message-3", + "ex/v0.99.0/cat-file.html#git_commit_message-4" ], "general.c": [ - "ex/HEAD/general.html#git_commit_message-15", - "ex/HEAD/general.html#git_commit_message-16", - "ex/HEAD/general.html#git_commit_message-17" + "ex/v0.99.0/general.html#git_commit_message-15", + "ex/v0.99.0/general.html#git_commit_message-16", + "ex/v0.99.0/general.html#git_commit_message-17" ], "log.c": [ - "ex/HEAD/log.html#git_commit_message-9", - "ex/HEAD/log.html#git_commit_message-10", - "ex/HEAD/log.html#git_commit_message-11" + "ex/v0.99.0/log.html#git_commit_message-9", + "ex/v0.99.0/log.html#git_commit_message-10", + "ex/v0.99.0/log.html#git_commit_message-11" ], "tag.c": [ - "ex/HEAD/tag.html#git_commit_message-2" + "ex/v0.99.0/tag.html#git_commit_message-2" ] } }, @@ -3739,8 +3739,8 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_time-18", - "ex/HEAD/general.html#git_commit_time-19" + "ex/v0.99.0/general.html#git_commit_time-18", + "ex/v0.99.0/general.html#git_commit_time-19" ] } }, @@ -3789,13 +3789,13 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_committer-5" + "ex/v0.99.0/cat-file.html#git_commit_committer-5" ], "general.c": [ - "ex/HEAD/general.html#git_commit_committer-20" + "ex/v0.99.0/general.html#git_commit_committer-20" ], "log.c": [ - "ex/HEAD/log.html#git_commit_committer-12" + "ex/v0.99.0/log.html#git_commit_committer-12" ] } }, @@ -3822,15 +3822,15 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_author-6" + "ex/v0.99.0/cat-file.html#git_commit_author-6" ], "general.c": [ - "ex/HEAD/general.html#git_commit_author-21", - "ex/HEAD/general.html#git_commit_author-22" + "ex/v0.99.0/general.html#git_commit_author-21", + "ex/v0.99.0/general.html#git_commit_author-22" ], "log.c": [ - "ex/HEAD/log.html#git_commit_author-13", - "ex/HEAD/log.html#git_commit_author-14" + "ex/v0.99.0/log.html#git_commit_author-13", + "ex/v0.99.0/log.html#git_commit_author-14" ] } }, @@ -3948,11 +3948,11 @@ "group": "commit", "examples": { "log.c": [ - "ex/HEAD/log.html#git_commit_tree-15", - "ex/HEAD/log.html#git_commit_tree-16", - "ex/HEAD/log.html#git_commit_tree-17", - "ex/HEAD/log.html#git_commit_tree-18", - "ex/HEAD/log.html#git_commit_tree-19" + "ex/v0.99.0/log.html#git_commit_tree-15", + "ex/v0.99.0/log.html#git_commit_tree-16", + "ex/v0.99.0/log.html#git_commit_tree-17", + "ex/v0.99.0/log.html#git_commit_tree-18", + "ex/v0.99.0/log.html#git_commit_tree-19" ] } }, @@ -3979,7 +3979,7 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_tree_id-7" + "ex/v0.99.0/cat-file.html#git_commit_tree_id-7" ] } }, @@ -4006,14 +4006,14 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_parentcount-8" + "ex/v0.99.0/cat-file.html#git_commit_parentcount-8" ], "general.c": [ - "ex/HEAD/general.html#git_commit_parentcount-23" + "ex/v0.99.0/general.html#git_commit_parentcount-23" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parentcount-20", - "ex/HEAD/log.html#git_commit_parentcount-21" + "ex/v0.99.0/log.html#git_commit_parentcount-20", + "ex/v0.99.0/log.html#git_commit_parentcount-21" ] } }, @@ -4050,11 +4050,11 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_parent-24" + "ex/v0.99.0/general.html#git_commit_parent-24" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parent-22", - "ex/HEAD/log.html#git_commit_parent-23" + "ex/v0.99.0/log.html#git_commit_parent-22", + "ex/v0.99.0/log.html#git_commit_parent-23" ] } }, @@ -4086,10 +4086,10 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_parent_id-9" + "ex/v0.99.0/cat-file.html#git_commit_parent_id-9" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parent_id-24" + "ex/v0.99.0/log.html#git_commit_parent_id-24" ] } }, @@ -4267,7 +4267,7 @@ "group": "commit", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_commit_create-7" + "ex/v0.99.0/merge.html#git_commit_create-7" ] } }, @@ -4334,10 +4334,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_create_v-25" + "ex/v0.99.0/general.html#git_commit_create_v-25" ], "init.c": [ - "ex/HEAD/init.html#git_commit_create_v-1" + "ex/v0.99.0/init.html#git_commit_create_v-1" ] } }, @@ -4532,8 +4532,8 @@ "git_libgit2_version": { "type": "function", "file": "git2/common.h", - "line": 121, - "lineto": 121, + "line": 122, + "lineto": 122, "args": [ { "name": "major", @@ -4554,8 +4554,8 @@ "argline": "int *major, int *minor, int *rev", "sig": "int *::int *::int *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success or an error code on failure" }, "description": "

Return the version of the libgit2 library\n being currently used.

\n", "comments": "", @@ -4564,8 +4564,8 @@ "git_libgit2_features": { "type": "function", "file": "git2/common.h", - "line": 170, - "lineto": 170, + "line": 171, + "lineto": 171, "args": [], "argline": "", "sig": "", @@ -4580,8 +4580,8 @@ "git_libgit2_opts": { "type": "function", "file": "git2/common.h", - "line": 404, - "lineto": 404, + "line": 411, + "lineto": 411, "args": [ { "name": "option", @@ -4596,7 +4596,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time        by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n
\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time        by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n", "group": "libgit2" }, "git_config_entry_free": { @@ -4823,7 +4823,7 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_open_ondisk-26" + "ex/v0.99.0/general.html#git_config_open_ondisk-26" ] } }, @@ -4936,8 +4936,8 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_free-27", - "ex/HEAD/general.html#git_config_free-28" + "ex/v0.99.0/general.html#git_config_free-27", + "ex/v0.99.0/general.html#git_config_free-28" ] } }, @@ -5006,8 +5006,8 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_get_int32-29", - "ex/HEAD/general.html#git_config_get_int32-30" + "ex/v0.99.0/general.html#git_config_get_int32-29", + "ex/v0.99.0/general.html#git_config_get_int32-30" ] } }, @@ -5140,8 +5140,8 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_get_string-31", - "ex/HEAD/general.html#git_config_get_string-32" + "ex/v0.99.0/general.html#git_config_get_string-31", + "ex/v0.99.0/general.html#git_config_get_string-32" ] } }, @@ -5908,81 +5908,81 @@ "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", "group": "config" }, - "git_cred_free": { + "git_credential_free": { "type": "function", - "file": "git2/cred.h", - "line": 145, - "lineto": 145, + "file": "git2/credential.h", + "line": 146, + "lineto": 146, "args": [ { "name": "cred", - "type": "git_cred *", + "type": "git_credential *", "comment": "the object to free" } ], - "argline": "git_cred *cred", - "sig": "git_cred *", + "argline": "git_credential *cred", + "sig": "git_credential *", "return": { "type": "void", "comment": null }, "description": "

Free a credential.

\n", "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", - "group": "cred" + "group": "credential" }, - "git_cred_has_username": { + "git_credential_has_username": { "type": "function", - "file": "git2/cred.h", - "line": 153, - "lineto": 153, + "file": "git2/credential.h", + "line": 154, + "lineto": 154, "args": [ { "name": "cred", - "type": "git_cred *", + "type": "git_credential *", "comment": "object to check" } ], - "argline": "git_cred *cred", - "sig": "git_cred *", + "argline": "git_credential *cred", + "sig": "git_credential *", "return": { "type": "int", "comment": " 1 if the credential object has non-NULL username, 0 otherwise" }, "description": "

Check whether a credential object contains username information.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_get_username": { + "git_credential_get_username": { "type": "function", - "file": "git2/cred.h", - "line": 161, - "lineto": 161, + "file": "git2/credential.h", + "line": 162, + "lineto": 162, "args": [ { "name": "cred", - "type": "git_cred *", + "type": "git_credential *", "comment": "object to check" } ], - "argline": "git_cred *cred", - "sig": "git_cred *", + "argline": "git_credential *cred", + "sig": "git_credential *", "return": { "type": "const char *", "comment": " the credential username, or NULL if not applicable" }, "description": "

Return the username associated with a credential object.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_userpass_plaintext_new": { + "git_credential_userpass_plaintext_new": { "type": "function", - "file": "git2/cred.h", - "line": 172, - "lineto": 175, + "file": "git2/credential.h", + "line": 173, + "lineto": 176, "args": [ { "name": "out", - "type": "git_cred **", + "type": "git_credential **", "comment": "The newly created credential object." }, { @@ -5996,74 +5996,74 @@ "comment": "The password of the credential." } ], - "argline": "git_cred **out, const char *username, const char *password", - "sig": "git_cred **::const char *::const char *", + "argline": "git_credential **out, const char *username, const char *password", + "sig": "git_credential **::const char *::const char *", "return": { "type": "int", "comment": " 0 for success or an error code for failure" }, "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_default_new": { + "git_credential_default_new": { "type": "function", - "file": "git2/cred.h", - "line": 183, - "lineto": 183, + "file": "git2/credential.h", + "line": 185, + "lineto": 185, "args": [ { "name": "out", - "type": "git_cred **", - "comment": null + "type": "git_credential **", + "comment": "The newly created credential object." } ], - "argline": "git_cred **out", - "sig": "git_cred **", + "argline": "git_credential **out", + "sig": "git_credential **", "return": { "type": "int", "comment": " 0 for success or an error code for failure" }, "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_username_new": { + "git_credential_username_new": { "type": "function", - "file": "git2/cred.h", - "line": 191, - "lineto": 191, + "file": "git2/credential.h", + "line": 197, + "lineto": 197, "args": [ { - "name": "cred", - "type": "git_cred **", - "comment": null + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." }, { "name": "username", "type": "const char *", - "comment": null + "comment": "The username to authenticate with" } ], - "argline": "git_cred **cred, const char *username", - "sig": "git_cred **::const char *", + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", "return": { "type": "int", - "comment": null + "comment": " 0 for success or an error code for failure" }, "description": "

Create a credential to specify a username.

\n", "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", - "group": "cred" + "group": "credential" }, - "git_cred_ssh_key_new": { + "git_credential_ssh_key_new": { "type": "function", - "file": "git2/cred.h", - "line": 204, - "lineto": 209, + "file": "git2/credential.h", + "line": 210, + "lineto": 215, "args": [ { "name": "out", - "type": "git_cred **", + "type": "git_credential **", "comment": "The newly created credential object." }, { @@ -6087,25 +6087,25 @@ "comment": "The passphrase of the credential." } ], - "argline": "git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_cred **::const char *::const char *::const char *::const char *", + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", "return": { "type": "int", "comment": " 0 for success or an error code for failure" }, "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_ssh_key_memory_new": { + "git_credential_ssh_key_memory_new": { "type": "function", - "file": "git2/cred.h", - "line": 221, - "lineto": 226, + "file": "git2/credential.h", + "line": 227, + "lineto": 232, "args": [ { "name": "out", - "type": "git_cred **", + "type": "git_credential **", "comment": "The newly created credential object." }, { @@ -6129,25 +6129,25 @@ "comment": "The passphrase of the credential." } ], - "argline": "git_cred **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_cred **::const char *::const char *::const char *::const char *", + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", "return": { "type": "int", "comment": " 0 for success or an error code for failure" }, "description": "

Create a new ssh key credential object reading the keys from memory.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_ssh_interactive_new": { + "git_credential_ssh_interactive_new": { "type": "function", - "file": "git2/cred.h", - "line": 256, - "lineto": 260, + "file": "git2/credential.h", + "line": 262, + "lineto": 266, "args": [ { "name": "out", - "type": "git_cred **", + "type": "git_credential **", "comment": null }, { @@ -6157,7 +6157,7 @@ }, { "name": "prompt_callback", - "type": "git_cred_ssh_interactive_cb", + "type": "git_credential_ssh_interactive_cb", "comment": "The callback method used for prompts." }, { @@ -6166,25 +6166,25 @@ "comment": "Additional data to pass to the callback." } ], - "argline": "git_cred **out, const char *username, git_cred_ssh_interactive_cb prompt_callback, void *payload", - "sig": "git_cred **::const char *::git_cred_ssh_interactive_cb::void *", + "argline": "git_credential **out, const char *username, git_credential_ssh_interactive_cb prompt_callback, void *payload", + "sig": "git_credential **::const char *::git_credential_ssh_interactive_cb::void *", "return": { "type": "int", "comment": " 0 for success or an error code for failure." }, "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_ssh_key_from_agent": { + "git_credential_ssh_key_from_agent": { "type": "function", - "file": "git2/cred.h", - "line": 270, - "lineto": 272, + "file": "git2/credential.h", + "line": 276, + "lineto": 278, "args": [ { "name": "out", - "type": "git_cred **", + "type": "git_credential **", "comment": "The newly created credential object." }, { @@ -6193,25 +6193,25 @@ "comment": "username to use to authenticate" } ], - "argline": "git_cred **out, const char *username", - "sig": "git_cred **::const char *", + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", "return": { "type": "int", "comment": " 0 for success or an error code for failure" }, "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", "comments": "", - "group": "cred" + "group": "credential" }, - "git_cred_ssh_custom_new": { + "git_credential_ssh_custom_new": { "type": "function", - "file": "git2/cred.h", - "line": 298, - "lineto": 304, + "file": "git2/credential.h", + "line": 304, + "lineto": 310, "args": [ { "name": "out", - "type": "git_cred **", + "type": "git_credential **", "comment": "The newly created credential object." }, { @@ -6231,7 +6231,7 @@ }, { "name": "sign_callback", - "type": "git_cred_sign_cb", + "type": "git_credential_sign_cb", "comment": "The callback method to sign the data during the challenge." }, { @@ -6240,25 +6240,25 @@ "comment": "Additional data to pass to the callback." } ], - "argline": "git_cred **out, const char *username, const char *publickey, size_t publickey_len, git_cred_sign_cb sign_callback, void *payload", - "sig": "git_cred **::const char *::const char *::size_t::git_cred_sign_cb::void *", + "argline": "git_credential **out, const char *username, const char *publickey, size_t publickey_len, git_credential_sign_cb sign_callback, void *payload", + "sig": "git_credential **::const char *::const char *::size_t::git_credential_sign_cb::void *", "return": { "type": "int", "comment": " 0 for success or an error code for failure" }, "description": "

Create an ssh key credential with a custom signing function.

\n", "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", - "group": "cred" + "group": "credential" }, - "git_cred_userpass": { + "git_credential_userpass": { "type": "function", - "file": "git2/cred_helpers.h", + "file": "git2/credential_helpers.h", "line": 43, "lineto": 48, "args": [ { - "name": "cred", - "type": "git_cred **", + "name": "out", + "type": "git_credential **", "comment": "The newly created credential object." }, { @@ -6274,29 +6274,29 @@ { "name": "allowed_types", "type": "unsigned int", - "comment": "A bitmask stating which cred types are OK to return." + "comment": "A bitmask stating which credential types are OK to return." }, { "name": "payload", "type": "void *", - "comment": "The payload provided when specifying this callback. (This is\n interpreted as a `git_cred_userpass_payload*`.)" + "comment": "The payload provided when specifying this callback. (This is\n interpreted as a `git_credential_userpass_payload*`.)" } ], - "argline": "git_cred **cred, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload", - "sig": "git_cred **::const char *::const char *::unsigned int::void *", + "argline": "git_credential **out, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", "return": { "type": "int", "comment": null }, - "description": "

Stock callback usable as a git_cred_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDTYPE_USERPASS_PLAINTEXT as an allowed type.

\n", + "description": "

Stock callback usable as a git_credential_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDENTIAL_USERPASS_PLAINTEXT as an allowed type.

\n", "comments": "", - "group": "cred" + "group": "credential" }, "git_blob_create_fromworkdir": { "type": "function", "file": "git2/deprecated.h", - "line": 84, - "lineto": 84, + "line": 86, + "lineto": 86, "args": [ { "name": "id", @@ -6327,8 +6327,8 @@ "git_blob_filtered_content": { "type": "function", "file": "git2/deprecated.h", - "line": 97, - "lineto": 101, + "line": 99, + "lineto": 103, "args": [ { "name": "out", @@ -6364,8 +6364,8 @@ "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 126, - "lineto": 126, + "line": 128, + "lineto": 128, "args": [ { "name": "buffer", @@ -6386,8 +6386,8 @@ "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 200, - "lineto": 200, + "line": 202, + "lineto": 202, "args": [], "argline": "", "sig": "", @@ -6402,8 +6402,8 @@ "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 212, - "lineto": 212, + "line": 214, + "lineto": 214, "args": [], "argline": "", "sig": "", @@ -6418,8 +6418,8 @@ "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 224, - "lineto": 224, + "line": 226, + "lineto": 226, "args": [ { "name": "error_class", @@ -6445,8 +6445,8 @@ "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 236, - "lineto": 236, + "line": 238, + "lineto": 238, "args": [], "argline": "", "sig": "", @@ -6461,8 +6461,8 @@ "git_object__size": { "type": "function", "file": "git2/deprecated.h", - "line": 326, - "lineto": 326, + "line": 328, + "lineto": 328, "args": [ { "name": "type", @@ -6483,8 +6483,8 @@ "git_oid_iszero": { "type": "function", "file": "git2/deprecated.h", - "line": 400, - "lineto": 400, + "line": 471, + "lineto": 471, "args": [ { "name": "id", @@ -6505,8 +6505,8 @@ "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 459, - "lineto": 459, + "line": 530, + "lineto": 530, "args": [ { "name": "opts", @@ -6557,7 +6557,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_options_init-1" + "ex/v0.99.0/describe.html#git_describe_options_init-1" ] } }, @@ -6589,7 +6589,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_format_options_init-2" + "ex/v0.99.0/describe.html#git_describe_format_options_init-2" ] } }, @@ -6626,7 +6626,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_commit-3" + "ex/v0.99.0/describe.html#git_describe_commit-3" ] } }, @@ -6663,7 +6663,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_workdir-4" + "ex/v0.99.0/describe.html#git_describe_workdir-4" ] } }, @@ -6700,7 +6700,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_format-5" + "ex/v0.99.0/describe.html#git_describe_format-5" ] } }, @@ -6803,11 +6803,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_free-3" + "ex/v0.99.0/diff.html#git_diff_free-3" ], "log.c": [ - "ex/HEAD/log.html#git_diff_free-25", - "ex/HEAD/log.html#git_diff_free-26" + "ex/v0.99.0/log.html#git_diff_free-25", + "ex/v0.99.0/log.html#git_diff_free-26" ] } }, @@ -6854,11 +6854,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_tree-4" + "ex/v0.99.0/diff.html#git_diff_tree_to_tree-4" ], "log.c": [ - "ex/HEAD/log.html#git_diff_tree_to_tree-27", - "ex/HEAD/log.html#git_diff_tree_to_tree-28" + "ex/v0.99.0/log.html#git_diff_tree_to_tree-27", + "ex/v0.99.0/log.html#git_diff_tree_to_tree-28" ] } }, @@ -6905,7 +6905,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_index-5" + "ex/v0.99.0/diff.html#git_diff_tree_to_index-5" ] } }, @@ -6947,7 +6947,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_index_to_workdir-6" + "ex/v0.99.0/diff.html#git_diff_index_to_workdir-6" ] } }, @@ -6989,7 +6989,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir-7" + "ex/v0.99.0/diff.html#git_diff_tree_to_workdir-7" ] } }, @@ -7031,7 +7031,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir_with_index-8" + "ex/v0.99.0/diff.html#git_diff_tree_to_workdir_with_index-8" ] } }, @@ -7132,7 +7132,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_find_similar-9" + "ex/v0.99.0/diff.html#git_diff_find_similar-9" ] } }, @@ -7159,7 +7159,7 @@ "group": "diff", "examples": { "log.c": [ - "ex/HEAD/log.html#git_diff_num_deltas-29" + "ex/v0.99.0/log.html#git_diff_num_deltas-29" ] } }, @@ -7346,10 +7346,10 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_print-10" + "ex/v0.99.0/diff.html#git_diff_print-10" ], "log.c": [ - "ex/HEAD/log.html#git_diff_print-30" + "ex/v0.99.0/log.html#git_diff_print-30" ] } }, @@ -7634,7 +7634,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_from_buffer-11" + "ex/v0.99.0/diff.html#git_diff_from_buffer-11" ] } }, @@ -7666,7 +7666,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_get_stats-12" + "ex/v0.99.0/diff.html#git_diff_get_stats-12" ] } }, @@ -7774,7 +7774,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_to_buf-13" + "ex/v0.99.0/diff.html#git_diff_stats_to_buf-13" ] } }, @@ -7801,7 +7801,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_free-14" + "ex/v0.99.0/diff.html#git_diff_stats_free-14" ] } }, @@ -7978,8 +7978,8 @@ "git_error_last": { "type": "function", "file": "git2/errors.h", - "line": 123, - "lineto": 123, + "line": 124, + "lineto": 124, "args": [], "argline": "", "sig": "", @@ -7992,25 +7992,25 @@ "group": "error", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_error_last-11", - "ex/HEAD/checkout.html#git_error_last-12", - "ex/HEAD/checkout.html#git_error_last-13", - "ex/HEAD/checkout.html#git_error_last-14" + "ex/v0.99.0/checkout.html#git_error_last-11", + "ex/v0.99.0/checkout.html#git_error_last-12", + "ex/v0.99.0/checkout.html#git_error_last-13", + "ex/v0.99.0/checkout.html#git_error_last-14" ], "general.c": [ - "ex/HEAD/general.html#git_error_last-33" + "ex/v0.99.0/general.html#git_error_last-33" ], "merge.c": [ - "ex/HEAD/merge.html#git_error_last-8", - "ex/HEAD/merge.html#git_error_last-9" + "ex/v0.99.0/merge.html#git_error_last-8", + "ex/v0.99.0/merge.html#git_error_last-9" ] } }, "git_error_clear": { "type": "function", "file": "git2/errors.h", - "line": 128, - "lineto": 128, + "line": 129, + "lineto": 129, "args": [], "argline": "", "sig": "", @@ -8025,8 +8025,8 @@ "git_error_set_str": { "type": "function", "file": "git2/errors.h", - "line": 146, - "lineto": 146, + "line": 148, + "lineto": 148, "args": [ { "name": "error_class", @@ -8042,8 +8042,8 @@ "argline": "int error_class, const char *string", "sig": "int::const char *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success or -1 on failure" }, "description": "

Set the error message string for this thread.

\n", "comments": "

This function is public so that custom ODB backends and the like can relay an error message through libgit2. Most regular users of libgit2 will never need to call this function -- actually, calling it in most circumstances (for example, calling from within a callback function) will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies to the particular thread that this libgit2 call is made from.

\n", @@ -8052,8 +8052,8 @@ "git_error_set_oom": { "type": "function", "file": "git2/errors.h", - "line": 157, - "lineto": 157, + "line": 159, + "lineto": 159, "args": [], "argline": "", "sig": "", @@ -8380,7 +8380,7 @@ "group": "libgit2", "examples": { "general.c": [ - "ex/HEAD/general.html#git_libgit2_init-34" + "ex/v0.99.0/general.html#git_libgit2_init-34" ] } }, @@ -8627,16 +8627,16 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_free-1" + "ex/v0.99.0/add.html#git_index_free-1" ], "general.c": [ - "ex/HEAD/general.html#git_index_free-35" + "ex/v0.99.0/general.html#git_index_free-35" ], "init.c": [ - "ex/HEAD/init.html#git_index_free-2" + "ex/v0.99.0/init.html#git_index_free-2" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_free-1" + "ex/v0.99.0/ls-files.html#git_index_free-1" ] } }, @@ -8810,7 +8810,7 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_write-2" + "ex/v0.99.0/add.html#git_index_write-2" ] } }, @@ -8913,10 +8913,10 @@ "group": "index", "examples": { "init.c": [ - "ex/HEAD/init.html#git_index_write_tree-3" + "ex/v0.99.0/init.html#git_index_write_tree-3" ], "merge.c": [ - "ex/HEAD/merge.html#git_index_write_tree-10" + "ex/v0.99.0/merge.html#git_index_write_tree-10" ] } }, @@ -8975,10 +8975,10 @@ "group": "index", "examples": { "general.c": [ - "ex/HEAD/general.html#git_index_entrycount-36" + "ex/v0.99.0/general.html#git_index_entrycount-36" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_entrycount-2" + "ex/v0.99.0/ls-files.html#git_index_entrycount-2" ] } }, @@ -9032,10 +9032,10 @@ "group": "index", "examples": { "general.c": [ - "ex/HEAD/general.html#git_index_get_byindex-37" + "ex/v0.99.0/general.html#git_index_get_byindex-37" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_get_byindex-3" + "ex/v0.99.0/ls-files.html#git_index_get_byindex-3" ] } }, @@ -9072,7 +9072,7 @@ "group": "index", "examples": { "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_get_bypath-4" + "ex/v0.99.0/ls-files.html#git_index_get_bypath-4" ] } }, @@ -9421,7 +9421,7 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_add_all-3" + "ex/v0.99.0/add.html#git_index_add_all-3" ] } }, @@ -9500,7 +9500,7 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_update_all-4" + "ex/v0.99.0/add.html#git_index_update_all-4" ] } }, @@ -9719,7 +9719,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_has_conflicts-11" + "ex/v0.99.0/merge.html#git_index_has_conflicts-11" ] } }, @@ -9751,7 +9751,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_new-12" + "ex/v0.99.0/merge.html#git_index_conflict_iterator_new-12" ] } }, @@ -9793,7 +9793,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_next-13" + "ex/v0.99.0/merge.html#git_index_conflict_next-13" ] } }, @@ -9820,7 +9820,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_free-14" + "ex/v0.99.0/merge.html#git_index_conflict_iterator_free-14" ] } }, @@ -10344,7 +10344,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge_analysis-15" + "ex/v0.99.0/merge.html#git_merge_analysis-15" ] } }, @@ -10433,10 +10433,10 @@ "group": "merge", "examples": { "log.c": [ - "ex/HEAD/log.html#git_merge_base-31" + "ex/v0.99.0/log.html#git_merge_base-31" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_merge_base-1" + "ex/v0.99.0/rev-parse.html#git_merge_base-1" ] } }, @@ -10831,7 +10831,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge-16" + "ex/v0.99.0/merge.html#git_merge-16" ] } }, @@ -11528,10 +11528,10 @@ "group": "object", "examples": { "log.c": [ - "ex/HEAD/log.html#git_object_lookup-32" + "ex/v0.99.0/log.html#git_object_lookup-32" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_lookup-17" + "ex/v0.99.0/merge.html#git_object_lookup-17" ] } }, @@ -11637,27 +11637,27 @@ "group": "object", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_object_id-8", - "ex/HEAD/blame.html#git_object_id-9", - "ex/HEAD/blame.html#git_object_id-10", - "ex/HEAD/blame.html#git_object_id-11" + "ex/v0.99.0/blame.html#git_object_id-8", + "ex/v0.99.0/blame.html#git_object_id-9", + "ex/v0.99.0/blame.html#git_object_id-10", + "ex/v0.99.0/blame.html#git_object_id-11" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_id-10", - "ex/HEAD/cat-file.html#git_object_id-11" + "ex/v0.99.0/cat-file.html#git_object_id-10", + "ex/v0.99.0/cat-file.html#git_object_id-11" ], "log.c": [ - "ex/HEAD/log.html#git_object_id-33", - "ex/HEAD/log.html#git_object_id-34", - "ex/HEAD/log.html#git_object_id-35", - "ex/HEAD/log.html#git_object_id-36" + "ex/v0.99.0/log.html#git_object_id-33", + "ex/v0.99.0/log.html#git_object_id-34", + "ex/v0.99.0/log.html#git_object_id-35", + "ex/v0.99.0/log.html#git_object_id-36" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_object_id-2", - "ex/HEAD/rev-parse.html#git_object_id-3", - "ex/HEAD/rev-parse.html#git_object_id-4", - "ex/HEAD/rev-parse.html#git_object_id-5", - "ex/HEAD/rev-parse.html#git_object_id-6" + "ex/v0.99.0/rev-parse.html#git_object_id-2", + "ex/v0.99.0/rev-parse.html#git_object_id-3", + "ex/v0.99.0/rev-parse.html#git_object_id-4", + "ex/v0.99.0/rev-parse.html#git_object_id-5", + "ex/v0.99.0/rev-parse.html#git_object_id-6" ] } }, @@ -11689,7 +11689,7 @@ "group": "object", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_object_short_id-3" + "ex/v0.99.0/tag.html#git_object_short_id-3" ] } }, @@ -11716,12 +11716,12 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_type-12", - "ex/HEAD/cat-file.html#git_object_type-13", - "ex/HEAD/cat-file.html#git_object_type-14" + "ex/v0.99.0/cat-file.html#git_object_type-12", + "ex/v0.99.0/cat-file.html#git_object_type-13", + "ex/v0.99.0/cat-file.html#git_object_type-14" ], "tag.c": [ - "ex/HEAD/tag.html#git_object_type-4" + "ex/v0.99.0/tag.html#git_object_type-4" ] } }, @@ -11770,33 +11770,33 @@ "group": "object", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_object_free-12", - "ex/HEAD/blame.html#git_object_free-13", - "ex/HEAD/blame.html#git_object_free-14", - "ex/HEAD/blame.html#git_object_free-15" + "ex/v0.99.0/blame.html#git_object_free-12", + "ex/v0.99.0/blame.html#git_object_free-13", + "ex/v0.99.0/blame.html#git_object_free-14", + "ex/v0.99.0/blame.html#git_object_free-15" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_free-15" + "ex/v0.99.0/cat-file.html#git_object_free-15" ], "general.c": [ - "ex/HEAD/general.html#git_object_free-38" + "ex/v0.99.0/general.html#git_object_free-38" ], "log.c": [ - "ex/HEAD/log.html#git_object_free-37" + "ex/v0.99.0/log.html#git_object_free-37" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_free-18" + "ex/v0.99.0/merge.html#git_object_free-18" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_object_free-7", - "ex/HEAD/rev-parse.html#git_object_free-8", - "ex/HEAD/rev-parse.html#git_object_free-9" + "ex/v0.99.0/rev-parse.html#git_object_free-7", + "ex/v0.99.0/rev-parse.html#git_object_free-8", + "ex/v0.99.0/rev-parse.html#git_object_free-9" ], "tag.c": [ - "ex/HEAD/tag.html#git_object_free-5", - "ex/HEAD/tag.html#git_object_free-6", - "ex/HEAD/tag.html#git_object_free-7", - "ex/HEAD/tag.html#git_object_free-8" + "ex/v0.99.0/tag.html#git_object_free-5", + "ex/v0.99.0/tag.html#git_object_free-6", + "ex/v0.99.0/tag.html#git_object_free-7", + "ex/v0.99.0/tag.html#git_object_free-8" ] } }, @@ -11823,14 +11823,14 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_type2string-16", - "ex/HEAD/cat-file.html#git_object_type2string-17", - "ex/HEAD/cat-file.html#git_object_type2string-18", - "ex/HEAD/cat-file.html#git_object_type2string-19" + "ex/v0.99.0/cat-file.html#git_object_type2string-16", + "ex/v0.99.0/cat-file.html#git_object_type2string-17", + "ex/v0.99.0/cat-file.html#git_object_type2string-18", + "ex/v0.99.0/cat-file.html#git_object_type2string-19" ], "general.c": [ - "ex/HEAD/general.html#git_object_type2string-39", - "ex/HEAD/general.html#git_object_type2string-40" + "ex/v0.99.0/general.html#git_object_type2string-39", + "ex/v0.99.0/general.html#git_object_type2string-40" ] } }, @@ -12036,10 +12036,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_free-20" + "ex/v0.99.0/cat-file.html#git_odb_free-20" ], "general.c": [ - "ex/HEAD/general.html#git_odb_free-41" + "ex/v0.99.0/general.html#git_odb_free-41" ] } }, @@ -12076,10 +12076,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_read-21" + "ex/v0.99.0/cat-file.html#git_odb_read-21" ], "general.c": [ - "ex/HEAD/general.html#git_odb_read-42" + "ex/v0.99.0/general.html#git_odb_read-42" ] } }, @@ -12350,7 +12350,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_write-43" + "ex/v0.99.0/general.html#git_odb_write-43" ] } }, @@ -12702,10 +12702,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_object_free-22" + "ex/v0.99.0/cat-file.html#git_odb_object_free-22" ], "general.c": [ - "ex/HEAD/general.html#git_odb_object_free-44" + "ex/v0.99.0/general.html#git_odb_object_free-44" ] } }, @@ -12754,7 +12754,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_object_data-45" + "ex/v0.99.0/general.html#git_odb_object_data-45" ] } }, @@ -12781,10 +12781,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_object_size-23" + "ex/v0.99.0/cat-file.html#git_odb_object_size-23" ], "general.c": [ - "ex/HEAD/general.html#git_odb_object_size-46" + "ex/v0.99.0/general.html#git_odb_object_size-46" ] } }, @@ -12811,7 +12811,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_object_type-47" + "ex/v0.99.0/general.html#git_odb_object_type-47" ] } }, @@ -13062,14 +13062,14 @@ "group": "oid", "examples": { "general.c": [ - "ex/HEAD/general.html#git_oid_fromstr-48", - "ex/HEAD/general.html#git_oid_fromstr-49", - "ex/HEAD/general.html#git_oid_fromstr-50", - "ex/HEAD/general.html#git_oid_fromstr-51", - "ex/HEAD/general.html#git_oid_fromstr-52", - "ex/HEAD/general.html#git_oid_fromstr-53", - "ex/HEAD/general.html#git_oid_fromstr-54", - "ex/HEAD/general.html#git_oid_fromstr-55" + "ex/v0.99.0/general.html#git_oid_fromstr-48", + "ex/v0.99.0/general.html#git_oid_fromstr-49", + "ex/v0.99.0/general.html#git_oid_fromstr-50", + "ex/v0.99.0/general.html#git_oid_fromstr-51", + "ex/v0.99.0/general.html#git_oid_fromstr-52", + "ex/v0.99.0/general.html#git_oid_fromstr-53", + "ex/v0.99.0/general.html#git_oid_fromstr-54", + "ex/v0.99.0/general.html#git_oid_fromstr-55" ] } }, @@ -13135,8 +13135,8 @@ "git_oid_fromraw": { "type": "function", "file": "git2/oid.h", - "line": 77, - "lineto": 77, + "line": 78, + "lineto": 78, "args": [ { "name": "out", @@ -13152,8 +13152,8 @@ "argline": "git_oid *out, const unsigned char *raw", "sig": "git_oid *::const unsigned char *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success or error code" }, "description": "

Copy an already raw oid into a git_oid structure.

\n", "comments": "", @@ -13162,8 +13162,8 @@ "git_oid_fmt": { "type": "function", "file": "git2/oid.h", - "line": 89, - "lineto": 89, + "line": 91, + "lineto": 91, "args": [ { "name": "out", @@ -13179,35 +13179,35 @@ "argline": "char *out, const git_oid *id", "sig": "char *::const git_oid *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success or error code" }, "description": "

Format a git_oid into a hex string.

\n", "comments": "", "group": "oid", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_oid_fmt-1", - "ex/HEAD/fetch.html#git_oid_fmt-2" + "ex/v0.99.0/fetch.html#git_oid_fmt-1", + "ex/v0.99.0/fetch.html#git_oid_fmt-2" ], "general.c": [ - "ex/HEAD/general.html#git_oid_fmt-56", - "ex/HEAD/general.html#git_oid_fmt-57", - "ex/HEAD/general.html#git_oid_fmt-58", - "ex/HEAD/general.html#git_oid_fmt-59", - "ex/HEAD/general.html#git_oid_fmt-60", - "ex/HEAD/general.html#git_oid_fmt-61" + "ex/v0.99.0/general.html#git_oid_fmt-56", + "ex/v0.99.0/general.html#git_oid_fmt-57", + "ex/v0.99.0/general.html#git_oid_fmt-58", + "ex/v0.99.0/general.html#git_oid_fmt-59", + "ex/v0.99.0/general.html#git_oid_fmt-60", + "ex/v0.99.0/general.html#git_oid_fmt-61" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_oid_fmt-1" + "ex/v0.99.0/ls-remote.html#git_oid_fmt-1" ] } }, "git_oid_nfmt": { "type": "function", "file": "git2/oid.h", - "line": 100, - "lineto": 100, + "line": 103, + "lineto": 103, "args": [ { "name": "out", @@ -13228,8 +13228,8 @@ "argline": "char *out, size_t n, const git_oid *id", "sig": "char *::size_t::const git_oid *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success or error code" }, "description": "

Format a git_oid into a partial hex string.

\n", "comments": "", @@ -13238,8 +13238,8 @@ "git_oid_pathfmt": { "type": "function", "file": "git2/oid.h", - "line": 115, - "lineto": 115, + "line": 119, + "lineto": 119, "args": [ { "name": "out", @@ -13255,8 +13255,8 @@ "argline": "char *out, const git_oid *id", "sig": "char *::const git_oid *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Format a git_oid into a loose-object path string.

\n", "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", @@ -13265,8 +13265,8 @@ "git_oid_tostr_s": { "type": "function", "file": "git2/oid.h", - "line": 128, - "lineto": 128, + "line": 132, + "lineto": 132, "args": [ { "name": "oid", @@ -13285,16 +13285,16 @@ "group": "oid", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_oid_tostr_s-19", - "ex/HEAD/merge.html#git_oid_tostr_s-20" + "ex/v0.99.0/merge.html#git_oid_tostr_s-19", + "ex/v0.99.0/merge.html#git_oid_tostr_s-20" ] } }, "git_oid_tostr": { "type": "function", "file": "git2/oid.h", - "line": 147, - "lineto": 147, + "line": 151, + "lineto": 151, "args": [ { "name": "out", @@ -13323,33 +13323,33 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_tostr-16", - "ex/HEAD/blame.html#git_oid_tostr-17" + "ex/v0.99.0/blame.html#git_oid_tostr-16", + "ex/v0.99.0/blame.html#git_oid_tostr-17" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_oid_tostr-24", - "ex/HEAD/cat-file.html#git_oid_tostr-25", - "ex/HEAD/cat-file.html#git_oid_tostr-26", - "ex/HEAD/cat-file.html#git_oid_tostr-27", - "ex/HEAD/cat-file.html#git_oid_tostr-28" + "ex/v0.99.0/cat-file.html#git_oid_tostr-24", + "ex/v0.99.0/cat-file.html#git_oid_tostr-25", + "ex/v0.99.0/cat-file.html#git_oid_tostr-26", + "ex/v0.99.0/cat-file.html#git_oid_tostr-27", + "ex/v0.99.0/cat-file.html#git_oid_tostr-28" ], "log.c": [ - "ex/HEAD/log.html#git_oid_tostr-38", - "ex/HEAD/log.html#git_oid_tostr-39" + "ex/v0.99.0/log.html#git_oid_tostr-38", + "ex/v0.99.0/log.html#git_oid_tostr-39" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_oid_tostr-10", - "ex/HEAD/rev-parse.html#git_oid_tostr-11", - "ex/HEAD/rev-parse.html#git_oid_tostr-12", - "ex/HEAD/rev-parse.html#git_oid_tostr-13" + "ex/v0.99.0/rev-parse.html#git_oid_tostr-10", + "ex/v0.99.0/rev-parse.html#git_oid_tostr-11", + "ex/v0.99.0/rev-parse.html#git_oid_tostr-12", + "ex/v0.99.0/rev-parse.html#git_oid_tostr-13" ] } }, "git_oid_cpy": { "type": "function", "file": "git2/oid.h", - "line": 155, - "lineto": 155, + "line": 160, + "lineto": 160, "args": [ { "name": "out", @@ -13365,25 +13365,25 @@ "argline": "git_oid *out, const git_oid *src", "sig": "git_oid *::const git_oid *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success or error code" }, "description": "

Copy an oid from one structure to another.

\n", "comments": "", "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_cpy-18", - "ex/HEAD/blame.html#git_oid_cpy-19", - "ex/HEAD/blame.html#git_oid_cpy-20" + "ex/v0.99.0/blame.html#git_oid_cpy-18", + "ex/v0.99.0/blame.html#git_oid_cpy-19", + "ex/v0.99.0/blame.html#git_oid_cpy-20" ] } }, "git_oid_cmp": { "type": "function", "file": "git2/oid.h", - "line": 164, - "lineto": 164, + "line": 169, + "lineto": 169, "args": [ { "name": "a", @@ -13409,8 +13409,8 @@ "git_oid_equal": { "type": "function", "file": "git2/oid.h", - "line": 173, - "lineto": 173, + "line": 178, + "lineto": 178, "args": [ { "name": "a", @@ -13436,8 +13436,8 @@ "git_oid_ncmp": { "type": "function", "file": "git2/oid.h", - "line": 184, - "lineto": 184, + "line": 189, + "lineto": 189, "args": [ { "name": "a", @@ -13468,8 +13468,8 @@ "git_oid_streq": { "type": "function", "file": "git2/oid.h", - "line": 193, - "lineto": 193, + "line": 198, + "lineto": 198, "args": [ { "name": "id", @@ -13495,8 +13495,8 @@ "git_oid_strcmp": { "type": "function", "file": "git2/oid.h", - "line": 203, - "lineto": 203, + "line": 208, + "lineto": 208, "args": [ { "name": "id", @@ -13522,8 +13522,8 @@ "git_oid_is_zero": { "type": "function", "file": "git2/oid.h", - "line": 210, - "lineto": 210, + "line": 215, + "lineto": 215, "args": [ { "name": "id", @@ -13542,18 +13542,18 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_is_zero-21" + "ex/v0.99.0/blame.html#git_oid_is_zero-21" ], "fetch.c": [ - "ex/HEAD/fetch.html#git_oid_is_zero-3" + "ex/v0.99.0/fetch.html#git_oid_is_zero-3" ] } }, "git_oid_shorten_new": { "type": "function", "file": "git2/oid.h", - "line": 231, - "lineto": 231, + "line": 236, + "lineto": 236, "args": [ { "name": "min_length", @@ -13574,8 +13574,8 @@ "git_oid_shorten_add": { "type": "function", "file": "git2/oid.h", - "line": 257, - "lineto": 257, + "line": 262, + "lineto": 262, "args": [ { "name": "os", @@ -13601,8 +13601,8 @@ "git_oid_shorten_free": { "type": "function", "file": "git2/oid.h", - "line": 264, - "lineto": 264, + "line": 269, + "lineto": 269, "args": [ { "name": "os", @@ -14251,7 +14251,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_patch_from_buffers-15" + "ex/v0.99.0/diff.html#git_patch_from_buffers-15" ] } }, @@ -14278,7 +14278,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_patch_free-16" + "ex/v0.99.0/diff.html#git_patch_free-16" ] } }, @@ -14561,7 +14561,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_patch_to_buf-17" + "ex/v0.99.0/diff.html#git_patch_to_buf-17" ] } }, @@ -14593,7 +14593,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_new-40" + "ex/v0.99.0/log.html#git_pathspec_new-40" ] } }, @@ -14620,7 +14620,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_free-41" + "ex/v0.99.0/log.html#git_pathspec_free-41" ] } }, @@ -14768,7 +14768,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_match_tree-42" + "ex/v0.99.0/log.html#git_pathspec_match_tree-42" ] } }, @@ -15892,14 +15892,14 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_lookup-15", - "ex/HEAD/checkout.html#git_reference_lookup-16" + "ex/v0.99.0/checkout.html#git_reference_lookup-15", + "ex/v0.99.0/checkout.html#git_reference_lookup-16" ], "general.c": [ - "ex/HEAD/general.html#git_reference_lookup-62" + "ex/v0.99.0/general.html#git_reference_lookup-62" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_lookup-21" + "ex/v0.99.0/merge.html#git_reference_lookup-21" ] } }, @@ -15968,7 +15968,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_dwim-22" + "ex/v0.99.0/merge.html#git_reference_dwim-22" ] } }, @@ -16119,7 +16119,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_create-23" + "ex/v0.99.0/merge.html#git_reference_create-23" ] } }, @@ -16198,7 +16198,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_target-63" + "ex/v0.99.0/general.html#git_reference_target-63" ] } }, @@ -16247,10 +16247,10 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_symbolic_target-64" + "ex/v0.99.0/general.html#git_reference_symbolic_target-64" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_symbolic_target-24" + "ex/v0.99.0/merge.html#git_reference_symbolic_target-24" ] } }, @@ -16277,7 +16277,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_type-65" + "ex/v0.99.0/general.html#git_reference_type-65" ] } }, @@ -16304,10 +16304,10 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_name-17" + "ex/v0.99.0/checkout.html#git_reference_name-17" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_name-25" + "ex/v0.99.0/merge.html#git_reference_name-25" ] } }, @@ -16435,7 +16435,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_set_target-26" + "ex/v0.99.0/merge.html#git_reference_set_target-26" ] } }, @@ -16558,7 +16558,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_list-66" + "ex/v0.99.0/general.html#git_reference_list-66" ] } }, @@ -16676,20 +16676,20 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_free-18", - "ex/HEAD/checkout.html#git_reference_free-19", - "ex/HEAD/checkout.html#git_reference_free-20" + "ex/v0.99.0/checkout.html#git_reference_free-18", + "ex/v0.99.0/checkout.html#git_reference_free-19", + "ex/v0.99.0/checkout.html#git_reference_free-20" ], "general.c": [ - "ex/HEAD/general.html#git_reference_free-67" + "ex/v0.99.0/general.html#git_reference_free-67" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_free-27", - "ex/HEAD/merge.html#git_reference_free-28", - "ex/HEAD/merge.html#git_reference_free-29" + "ex/v0.99.0/merge.html#git_reference_free-27", + "ex/v0.99.0/merge.html#git_reference_free-28", + "ex/v0.99.0/merge.html#git_reference_free-29" ], "status.c": [ - "ex/HEAD/status.html#git_reference_free-1" + "ex/v0.99.0/status.html#git_reference_free-1" ] } }, @@ -16991,7 +16991,7 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_is_remote-21" + "ex/v0.99.0/checkout.html#git_reference_is_remote-21" ] } }, @@ -17109,7 +17109,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_peel-30" + "ex/v0.99.0/merge.html#git_reference_peel-30" ] } }, @@ -17158,7 +17158,7 @@ "group": "reference", "examples": { "status.c": [ - "ex/HEAD/status.html#git_reference_shorthand-2" + "ex/v0.99.0/status.html#git_reference_shorthand-2" ] } }, @@ -17482,7 +17482,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_create-1" + "ex/v0.99.0/remote.html#git_remote_create-1" ] } }, @@ -17620,10 +17620,10 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_create_anonymous-4" + "ex/v0.99.0/fetch.html#git_remote_create_anonymous-4" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_create_anonymous-2" + "ex/v0.99.0/ls-remote.html#git_remote_create_anonymous-2" ] } }, @@ -17687,13 +17687,13 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_lookup-5" + "ex/v0.99.0/fetch.html#git_remote_lookup-5" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_lookup-3" + "ex/v0.99.0/ls-remote.html#git_remote_lookup-3" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_lookup-2" + "ex/v0.99.0/remote.html#git_remote_lookup-2" ] } }, @@ -17791,7 +17791,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_url-3" + "ex/v0.99.0/remote.html#git_remote_url-3" ] } }, @@ -17818,7 +17818,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_pushurl-4" + "ex/v0.99.0/remote.html#git_remote_pushurl-4" ] } }, @@ -17855,7 +17855,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_set_url-5" + "ex/v0.99.0/remote.html#git_remote_set_url-5" ] } }, @@ -17892,7 +17892,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_set_pushurl-6" + "ex/v0.99.0/remote.html#git_remote_set_pushurl-6" ] } }, @@ -18106,7 +18106,7 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_connect-4" + "ex/v0.99.0/ls-remote.html#git_remote_connect-4" ] } }, @@ -18143,7 +18143,7 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_ls-5" + "ex/v0.99.0/ls-remote.html#git_remote_ls-5" ] } }, @@ -18172,8 +18172,8 @@ "git_remote_stop": { "type": "function", "file": "git2/remote.h", - "line": 382, - "lineto": 382, + "line": 383, + "lineto": 383, "args": [ { "name": "remote", @@ -18184,8 +18184,8 @@ "argline": "git_remote *remote", "sig": "git_remote *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success, or an error code" }, "description": "

Cancel the operation

\n", "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", @@ -18194,8 +18194,8 @@ "git_remote_disconnect": { "type": "function", "file": "git2/remote.h", - "line": 391, - "lineto": 391, + "line": 393, + "lineto": 393, "args": [ { "name": "remote", @@ -18206,8 +18206,8 @@ "argline": "git_remote *remote", "sig": "git_remote *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success, or an error code" }, "description": "

Disconnect from the remote

\n", "comments": "

Close the connection to the remote.

\n", @@ -18216,8 +18216,8 @@ "git_remote_free": { "type": "function", "file": "git2/remote.h", - "line": 401, - "lineto": 401, + "line": 403, + "lineto": 403, "args": [ { "name": "remote", @@ -18236,22 +18236,22 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_free-6", - "ex/HEAD/fetch.html#git_remote_free-7" + "ex/v0.99.0/fetch.html#git_remote_free-6", + "ex/v0.99.0/fetch.html#git_remote_free-7" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_free-6" + "ex/v0.99.0/ls-remote.html#git_remote_free-6" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_free-7" + "ex/v0.99.0/remote.html#git_remote_free-7" ] } }, "git_remote_list": { "type": "function", "file": "git2/remote.h", - "line": 412, - "lineto": 412, + "line": 414, + "lineto": 414, "args": [ { "name": "out", @@ -18275,18 +18275,18 @@ "group": "remote", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_remote_list-22" + "ex/v0.99.0/checkout.html#git_remote_list-22" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_list-8" + "ex/v0.99.0/remote.html#git_remote_list-8" ] } }, "git_remote_init_callbacks": { "type": "function", "file": "git2/remote.h", - "line": 599, - "lineto": 601, + "line": 601, + "lineto": 603, "args": [ { "name": "opts", @@ -18312,8 +18312,8 @@ "git_fetch_options_init": { "type": "function", "file": "git2/remote.h", - "line": 705, - "lineto": 707, + "line": 707, + "lineto": 709, "args": [ { "name": "opts", @@ -18339,8 +18339,8 @@ "git_push_options_init": { "type": "function", "file": "git2/remote.h", - "line": 755, - "lineto": 757, + "line": 757, + "lineto": 759, "args": [ { "name": "opts", @@ -18366,8 +18366,8 @@ "git_remote_download": { "type": "function", "file": "git2/remote.h", - "line": 775, - "lineto": 775, + "line": 777, + "lineto": 777, "args": [ { "name": "remote", @@ -18398,8 +18398,8 @@ "git_remote_upload": { "type": "function", "file": "git2/remote.h", - "line": 789, - "lineto": 789, + "line": 791, + "lineto": 791, "args": [ { "name": "remote", @@ -18430,8 +18430,8 @@ "git_remote_update_tips": { "type": "function", "file": "git2/remote.h", - "line": 805, - "lineto": 810, + "line": 807, + "lineto": 812, "args": [ { "name": "remote", @@ -18472,8 +18472,8 @@ "git_remote_fetch": { "type": "function", "file": "git2/remote.h", - "line": 826, - "lineto": 830, + "line": 828, + "lineto": 832, "args": [ { "name": "remote", @@ -18507,15 +18507,15 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_fetch-8" + "ex/v0.99.0/fetch.html#git_remote_fetch-8" ] } }, "git_remote_prune": { "type": "function", "file": "git2/remote.h", - "line": 839, - "lineto": 839, + "line": 841, + "lineto": 841, "args": [ { "name": "remote", @@ -18541,8 +18541,8 @@ "git_remote_push": { "type": "function", "file": "git2/remote.h", - "line": 851, - "lineto": 853, + "line": 853, + "lineto": 855, "args": [ { "name": "remote", @@ -18573,8 +18573,8 @@ "git_remote_stats": { "type": "function", "file": "git2/remote.h", - "line": 858, - "lineto": 858, + "line": 860, + "lineto": 860, "args": [ { "name": "remote", @@ -18593,15 +18593,15 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_stats-9" + "ex/v0.99.0/fetch.html#git_remote_stats-9" ] } }, "git_remote_autotag": { "type": "function", "file": "git2/remote.h", - "line": 866, - "lineto": 866, + "line": 868, + "lineto": 868, "args": [ { "name": "remote", @@ -18622,8 +18622,8 @@ "git_remote_set_autotag": { "type": "function", "file": "git2/remote.h", - "line": 878, - "lineto": 878, + "line": 880, + "lineto": 880, "args": [ { "name": "repo", @@ -18654,8 +18654,8 @@ "git_remote_prune_refs": { "type": "function", "file": "git2/remote.h", - "line": 885, - "lineto": 885, + "line": 887, + "lineto": 887, "args": [ { "name": "remote", @@ -18676,8 +18676,8 @@ "git_remote_rename": { "type": "function", "file": "git2/remote.h", - "line": 907, - "lineto": 911, + "line": 909, + "lineto": 913, "args": [ { "name": "problems", @@ -18711,15 +18711,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_rename-9" + "ex/v0.99.0/remote.html#git_remote_rename-9" ] } }, "git_remote_is_valid_name": { "type": "function", "file": "git2/remote.h", - "line": 919, - "lineto": 919, + "line": 921, + "lineto": 921, "args": [ { "name": "remote_name", @@ -18740,8 +18740,8 @@ "git_remote_delete": { "type": "function", "file": "git2/remote.h", - "line": 931, - "lineto": 931, + "line": 933, + "lineto": 933, "args": [ { "name": "repo", @@ -18765,15 +18765,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_delete-10" + "ex/v0.99.0/remote.html#git_remote_delete-10" ] } }, "git_remote_default_branch": { "type": "function", "file": "git2/remote.h", - "line": 949, - "lineto": 949, + "line": 951, + "lineto": 951, "args": [ { "name": "out", @@ -18824,7 +18824,7 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_open-68" + "ex/v0.99.0/general.html#git_repository_open-68" ] } }, @@ -18957,7 +18957,7 @@ "group": "repository", "examples": { "log.c": [ - "ex/HEAD/log.html#git_repository_open_ext-43" + "ex/v0.99.0/log.html#git_repository_open_ext-43" ] } }, @@ -19011,10 +19011,10 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_free-69" + "ex/v0.99.0/general.html#git_repository_free-69" ], "init.c": [ - "ex/HEAD/init.html#git_repository_free-4" + "ex/v0.99.0/init.html#git_repository_free-4" ] } }, @@ -19051,7 +19051,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_init-5" + "ex/v0.99.0/init.html#git_repository_init-5" ] } }, @@ -19115,7 +19115,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_init_ext-6" + "ex/v0.99.0/init.html#git_repository_init_ext-6" ] } }, @@ -19147,11 +19147,11 @@ "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_head-31", - "ex/HEAD/merge.html#git_repository_head-32" + "ex/v0.99.0/merge.html#git_repository_head-31", + "ex/v0.99.0/merge.html#git_repository_head-32" ], "status.c": [ - "ex/HEAD/status.html#git_repository_head-3" + "ex/v0.99.0/status.html#git_repository_head-3" ] } }, @@ -19335,10 +19335,10 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_path-7" + "ex/v0.99.0/init.html#git_repository_path-7" ], "status.c": [ - "ex/HEAD/status.html#git_repository_path-4" + "ex/v0.99.0/status.html#git_repository_path-4" ] } }, @@ -19365,7 +19365,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_workdir-8" + "ex/v0.99.0/init.html#git_repository_workdir-8" ] } }, @@ -19446,7 +19446,7 @@ "group": "repository", "examples": { "status.c": [ - "ex/HEAD/status.html#git_repository_is_bare-5" + "ex/v0.99.0/status.html#git_repository_is_bare-5" ] } }, @@ -19527,8 +19527,8 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_config_snapshot-70", - "ex/HEAD/general.html#git_repository_config_snapshot-71" + "ex/v0.99.0/general.html#git_repository_config_snapshot-70", + "ex/v0.99.0/general.html#git_repository_config_snapshot-71" ] } }, @@ -19560,10 +19560,10 @@ "group": "repository", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_repository_odb-29" + "ex/v0.99.0/cat-file.html#git_repository_odb-29" ], "general.c": [ - "ex/HEAD/general.html#git_repository_odb-72" + "ex/v0.99.0/general.html#git_repository_odb-72" ] } }, @@ -19622,19 +19622,19 @@ "group": "repository", "examples": { "add.c": [ - "ex/HEAD/add.html#git_repository_index-5" + "ex/v0.99.0/add.html#git_repository_index-5" ], "general.c": [ - "ex/HEAD/general.html#git_repository_index-73" + "ex/v0.99.0/general.html#git_repository_index-73" ], "init.c": [ - "ex/HEAD/init.html#git_repository_index-9" + "ex/v0.99.0/init.html#git_repository_index-9" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_repository_index-5" + "ex/v0.99.0/ls-files.html#git_repository_index-5" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_index-33" + "ex/v0.99.0/merge.html#git_repository_index-33" ] } }, @@ -19710,7 +19710,7 @@ "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_state_cleanup-34" + "ex/v0.99.0/merge.html#git_repository_state_cleanup-34" ] } }, @@ -19848,7 +19848,7 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head-23" + "ex/v0.99.0/checkout.html#git_repository_set_head-23" ] } }, @@ -19907,7 +19907,7 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-24" + "ex/v0.99.0/checkout.html#git_repository_set_head_detached_from_annotated-24" ] } }, @@ -19956,10 +19956,10 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_state-25" + "ex/v0.99.0/checkout.html#git_repository_state-25" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_state-35" + "ex/v0.99.0/merge.html#git_repository_state-35" ] } }, @@ -20343,22 +20343,22 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_revparse_single-22" + "ex/v0.99.0/blame.html#git_revparse_single-22" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_revparse_single-30" + "ex/v0.99.0/cat-file.html#git_revparse_single-30" ], "describe.c": [ - "ex/HEAD/describe.html#git_revparse_single-6" + "ex/v0.99.0/describe.html#git_revparse_single-6" ], "log.c": [ - "ex/HEAD/log.html#git_revparse_single-44" + "ex/v0.99.0/log.html#git_revparse_single-44" ], "tag.c": [ - "ex/HEAD/tag.html#git_revparse_single-9", - "ex/HEAD/tag.html#git_revparse_single-10", - "ex/HEAD/tag.html#git_revparse_single-11", - "ex/HEAD/tag.html#git_revparse_single-12" + "ex/v0.99.0/tag.html#git_revparse_single-9", + "ex/v0.99.0/tag.html#git_revparse_single-10", + "ex/v0.99.0/tag.html#git_revparse_single-11", + "ex/v0.99.0/tag.html#git_revparse_single-12" ] } }, @@ -20432,14 +20432,14 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_revparse-23" + "ex/v0.99.0/blame.html#git_revparse-23" ], "log.c": [ - "ex/HEAD/log.html#git_revparse-45" + "ex/v0.99.0/log.html#git_revparse-45" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_revparse-14", - "ex/HEAD/rev-parse.html#git_revparse-15" + "ex/v0.99.0/rev-parse.html#git_revparse-14", + "ex/v0.99.0/rev-parse.html#git_revparse-15" ] } }, @@ -20471,19 +20471,19 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_new-74" + "ex/v0.99.0/general.html#git_revwalk_new-74" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_new-46", - "ex/HEAD/log.html#git_revwalk_new-47" + "ex/v0.99.0/log.html#git_revwalk_new-46", + "ex/v0.99.0/log.html#git_revwalk_new-47" ] } }, "git_revwalk_reset": { "type": "function", "file": "git2/revwalk.h", - "line": 88, - "lineto": 88, + "line": 89, + "lineto": 89, "args": [ { "name": "walker", @@ -20494,8 +20494,8 @@ "argline": "git_revwalk *walker", "sig": "git_revwalk *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 or an error code" }, "description": "

Reset the revision walker for reuse.

\n", "comments": "

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.

\n\n

The revision walk is automatically reset when a walk is over.

\n", @@ -20504,8 +20504,8 @@ "git_revwalk_push": { "type": "function", "file": "git2/revwalk.h", - "line": 107, - "lineto": 107, + "line": 108, + "lineto": 108, "args": [ { "name": "walk", @@ -20529,18 +20529,18 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_push-75" + "ex/v0.99.0/general.html#git_revwalk_push-75" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_push-48" + "ex/v0.99.0/log.html#git_revwalk_push-48" ] } }, "git_revwalk_push_glob": { "type": "function", "file": "git2/revwalk.h", - "line": 125, - "lineto": 125, + "line": 126, + "lineto": 126, "args": [ { "name": "walk", @@ -20566,8 +20566,8 @@ "git_revwalk_push_head": { "type": "function", "file": "git2/revwalk.h", - "line": 133, - "lineto": 133, + "line": 134, + "lineto": 134, "args": [ { "name": "walk", @@ -20586,15 +20586,15 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/HEAD/log.html#git_revwalk_push_head-49" + "ex/v0.99.0/log.html#git_revwalk_push_head-49" ] } }, "git_revwalk_hide": { "type": "function", "file": "git2/revwalk.h", - "line": 148, - "lineto": 148, + "line": 149, + "lineto": 149, "args": [ { "name": "walk", @@ -20618,15 +20618,15 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/HEAD/log.html#git_revwalk_hide-50" + "ex/v0.99.0/log.html#git_revwalk_hide-50" ] } }, "git_revwalk_hide_glob": { "type": "function", "file": "git2/revwalk.h", - "line": 167, - "lineto": 167, + "line": 168, + "lineto": 168, "args": [ { "name": "walk", @@ -20652,8 +20652,8 @@ "git_revwalk_hide_head": { "type": "function", "file": "git2/revwalk.h", - "line": 175, - "lineto": 175, + "line": 176, + "lineto": 176, "args": [ { "name": "walk", @@ -20674,8 +20674,8 @@ "git_revwalk_push_ref": { "type": "function", "file": "git2/revwalk.h", - "line": 186, - "lineto": 186, + "line": 187, + "lineto": 187, "args": [ { "name": "walk", @@ -20701,8 +20701,8 @@ "git_revwalk_hide_ref": { "type": "function", "file": "git2/revwalk.h", - "line": 197, - "lineto": 197, + "line": 198, + "lineto": 198, "args": [ { "name": "walk", @@ -20728,8 +20728,8 @@ "git_revwalk_next": { "type": "function", "file": "git2/revwalk.h", - "line": 217, - "lineto": 217, + "line": 218, + "lineto": 218, "args": [ { "name": "out", @@ -20753,18 +20753,18 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_next-76" + "ex/v0.99.0/general.html#git_revwalk_next-76" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_next-51" + "ex/v0.99.0/log.html#git_revwalk_next-51" ] } }, "git_revwalk_sorting": { "type": "function", "file": "git2/revwalk.h", - "line": 228, - "lineto": 228, + "line": 230, + "lineto": 230, "args": [ { "name": "walk", @@ -20780,27 +20780,27 @@ "argline": "git_revwalk *walk, unsigned int sort_mode", "sig": "git_revwalk *::unsigned int", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 or an error code" }, "description": "

Change the sorting mode when iterating through the\n repository's contents.

\n", "comments": "

Changing the sorting mode resets the walker.

\n", "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_sorting-77" + "ex/v0.99.0/general.html#git_revwalk_sorting-77" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_sorting-52", - "ex/HEAD/log.html#git_revwalk_sorting-53" + "ex/v0.99.0/log.html#git_revwalk_sorting-52", + "ex/v0.99.0/log.html#git_revwalk_sorting-53" ] } }, "git_revwalk_push_range": { "type": "function", "file": "git2/revwalk.h", - "line": 243, - "lineto": 243, + "line": 245, + "lineto": 245, "args": [ { "name": "walk", @@ -20826,8 +20826,8 @@ "git_revwalk_simplify_first_parent": { "type": "function", "file": "git2/revwalk.h", - "line": 250, - "lineto": 250, + "line": 254, + "lineto": 254, "args": [ { "name": "walk", @@ -20838,8 +20838,8 @@ "argline": "git_revwalk *walk", "sig": "git_revwalk *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 or an error code" }, "description": "

Simplify the history by first-parent

\n", "comments": "

No parents other than the first for each commit will be enqueued.

\n", @@ -20848,8 +20848,8 @@ "git_revwalk_free": { "type": "function", "file": "git2/revwalk.h", - "line": 258, - "lineto": 258, + "line": 262, + "lineto": 262, "args": [ { "name": "walk", @@ -20868,18 +20868,18 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_free-78" + "ex/v0.99.0/general.html#git_revwalk_free-78" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_free-54" + "ex/v0.99.0/log.html#git_revwalk_free-54" ] } }, "git_revwalk_repository": { "type": "function", "file": "git2/revwalk.h", - "line": 267, - "lineto": 267, + "line": 271, + "lineto": 271, "args": [ { "name": "walk", @@ -20900,8 +20900,8 @@ "git_revwalk_add_hide_cb": { "type": "function", "file": "git2/revwalk.h", - "line": 288, - "lineto": 291, + "line": 292, + "lineto": 295, "args": [ { "name": "walk", @@ -20972,8 +20972,8 @@ "group": "signature", "examples": { "general.c": [ - "ex/HEAD/general.html#git_signature_new-79", - "ex/HEAD/general.html#git_signature_new-80" + "ex/v0.99.0/general.html#git_signature_new-79", + "ex/v0.99.0/general.html#git_signature_new-80" ] } }, @@ -21010,7 +21010,7 @@ "group": "signature", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_signature_now-36" + "ex/v0.99.0/merge.html#git_signature_now-36" ] } }, @@ -21042,10 +21042,10 @@ "group": "signature", "examples": { "init.c": [ - "ex/HEAD/init.html#git_signature_default-10" + "ex/v0.99.0/init.html#git_signature_default-10" ], "tag.c": [ - "ex/HEAD/tag.html#git_signature_default-13" + "ex/v0.99.0/tag.html#git_signature_default-13" ] } }, @@ -21126,14 +21126,14 @@ "group": "signature", "examples": { "general.c": [ - "ex/HEAD/general.html#git_signature_free-81", - "ex/HEAD/general.html#git_signature_free-82" + "ex/v0.99.0/general.html#git_signature_free-81", + "ex/v0.99.0/general.html#git_signature_free-82" ], "init.c": [ - "ex/HEAD/init.html#git_signature_free-11" + "ex/v0.99.0/init.html#git_signature_free-11" ], "tag.c": [ - "ex/HEAD/tag.html#git_signature_free-14" + "ex/v0.99.0/tag.html#git_signature_free-14" ] } }, @@ -21389,7 +21389,7 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_foreach-6" + "ex/v0.99.0/status.html#git_status_foreach-6" ] } }, @@ -21431,7 +21431,7 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_foreach_ext-7" + "ex/v0.99.0/status.html#git_status_foreach_ext-7" ] } }, @@ -21468,7 +21468,7 @@ "group": "status", "examples": { "add.c": [ - "ex/HEAD/add.html#git_status_file-6" + "ex/v0.99.0/add.html#git_status_file-6" ] } }, @@ -21505,8 +21505,8 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_new-8", - "ex/HEAD/status.html#git_status_list_new-9" + "ex/v0.99.0/status.html#git_status_list_new-8", + "ex/v0.99.0/status.html#git_status_list_new-9" ] } }, @@ -21533,8 +21533,8 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_entrycount-10", - "ex/HEAD/status.html#git_status_list_entrycount-11" + "ex/v0.99.0/status.html#git_status_list_entrycount-10", + "ex/v0.99.0/status.html#git_status_list_entrycount-11" ] } }, @@ -21566,12 +21566,12 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_byindex-12", - "ex/HEAD/status.html#git_status_byindex-13", - "ex/HEAD/status.html#git_status_byindex-14", - "ex/HEAD/status.html#git_status_byindex-15", - "ex/HEAD/status.html#git_status_byindex-16", - "ex/HEAD/status.html#git_status_byindex-17" + "ex/v0.99.0/status.html#git_status_byindex-12", + "ex/v0.99.0/status.html#git_status_byindex-13", + "ex/v0.99.0/status.html#git_status_byindex-14", + "ex/v0.99.0/status.html#git_status_byindex-15", + "ex/v0.99.0/status.html#git_status_byindex-16", + "ex/v0.99.0/status.html#git_status_byindex-17" ] } }, @@ -21598,7 +21598,7 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_free-18" + "ex/v0.99.0/status.html#git_status_list_free-18" ] } }, @@ -21657,17 +21657,17 @@ "group": "strarray", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_strarray_free-26" + "ex/v0.99.0/checkout.html#git_strarray_free-26" ], "general.c": [ - "ex/HEAD/general.html#git_strarray_free-83" + "ex/v0.99.0/general.html#git_strarray_free-83" ], "remote.c": [ - "ex/HEAD/remote.html#git_strarray_free-11", - "ex/HEAD/remote.html#git_strarray_free-12" + "ex/v0.99.0/remote.html#git_strarray_free-11", + "ex/v0.99.0/remote.html#git_strarray_free-12" ], "tag.c": [ - "ex/HEAD/tag.html#git_strarray_free-15" + "ex/v0.99.0/tag.html#git_strarray_free-15" ] } }, @@ -21844,7 +21844,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_foreach-19" + "ex/v0.99.0/status.html#git_submodule_foreach-19" ] } }, @@ -22016,7 +22016,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_name-20" + "ex/v0.99.0/status.html#git_submodule_name-20" ] } }, @@ -22043,7 +22043,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_path-21" + "ex/v0.99.0/status.html#git_submodule_path-21" ] } }, @@ -22588,7 +22588,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_status-22" + "ex/v0.99.0/status.html#git_submodule_status-22" ] } }, @@ -22652,7 +22652,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_lookup-84" + "ex/v0.99.0/general.html#git_tag_lookup-84" ] } }, @@ -22716,7 +22716,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_free-85" + "ex/v0.99.0/general.html#git_tag_free-85" ] } }, @@ -22792,7 +22792,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_target-86" + "ex/v0.99.0/general.html#git_tag_target-86" ] } }, @@ -22819,7 +22819,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_target_id-31" + "ex/v0.99.0/cat-file.html#git_tag_target_id-31" ] } }, @@ -22846,10 +22846,10 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_target_type-32" + "ex/v0.99.0/cat-file.html#git_tag_target_type-32" ], "general.c": [ - "ex/HEAD/general.html#git_tag_target_type-87" + "ex/v0.99.0/general.html#git_tag_target_type-87" ] } }, @@ -22876,13 +22876,13 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_name-33" + "ex/v0.99.0/cat-file.html#git_tag_name-33" ], "general.c": [ - "ex/HEAD/general.html#git_tag_name-88" + "ex/v0.99.0/general.html#git_tag_name-88" ], "tag.c": [ - "ex/HEAD/tag.html#git_tag_name-16" + "ex/v0.99.0/tag.html#git_tag_name-16" ] } }, @@ -22909,7 +22909,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_tagger-34" + "ex/v0.99.0/cat-file.html#git_tag_tagger-34" ] } }, @@ -22936,14 +22936,14 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_message-35", - "ex/HEAD/cat-file.html#git_tag_message-36" + "ex/v0.99.0/cat-file.html#git_tag_message-35", + "ex/v0.99.0/cat-file.html#git_tag_message-36" ], "general.c": [ - "ex/HEAD/general.html#git_tag_message-89" + "ex/v0.99.0/general.html#git_tag_message-89" ], "tag.c": [ - "ex/HEAD/tag.html#git_tag_message-17" + "ex/v0.99.0/tag.html#git_tag_message-17" ] } }, @@ -23000,7 +23000,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_create-18" + "ex/v0.99.0/tag.html#git_tag_create-18" ] } }, @@ -23131,7 +23131,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_create_lightweight-19" + "ex/v0.99.0/tag.html#git_tag_create_lightweight-19" ] } }, @@ -23163,7 +23163,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_delete-20" + "ex/v0.99.0/tag.html#git_tag_delete-20" ] } }, @@ -23227,7 +23227,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_list_match-21" + "ex/v0.99.0/tag.html#git_tag_list_match-21" ] } }, @@ -23618,14 +23618,14 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_lookup-90", - "ex/HEAD/general.html#git_tree_lookup-91" + "ex/v0.99.0/general.html#git_tree_lookup-90", + "ex/v0.99.0/general.html#git_tree_lookup-91" ], "init.c": [ - "ex/HEAD/init.html#git_tree_lookup-12" + "ex/v0.99.0/init.html#git_tree_lookup-12" ], "merge.c": [ - "ex/HEAD/merge.html#git_tree_lookup-37" + "ex/v0.99.0/merge.html#git_tree_lookup-37" ] } }, @@ -23689,22 +23689,22 @@ "group": "tree", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_tree_free-18", - "ex/HEAD/diff.html#git_tree_free-19" + "ex/v0.99.0/diff.html#git_tree_free-18", + "ex/v0.99.0/diff.html#git_tree_free-19" ], "general.c": [ - "ex/HEAD/general.html#git_tree_free-92", - "ex/HEAD/general.html#git_tree_free-93" + "ex/v0.99.0/general.html#git_tree_free-92", + "ex/v0.99.0/general.html#git_tree_free-93" ], "init.c": [ - "ex/HEAD/init.html#git_tree_free-13" + "ex/v0.99.0/init.html#git_tree_free-13" ], "log.c": [ - "ex/HEAD/log.html#git_tree_free-55", - "ex/HEAD/log.html#git_tree_free-56", - "ex/HEAD/log.html#git_tree_free-57", - "ex/HEAD/log.html#git_tree_free-58", - "ex/HEAD/log.html#git_tree_free-59" + "ex/v0.99.0/log.html#git_tree_free-55", + "ex/v0.99.0/log.html#git_tree_free-56", + "ex/v0.99.0/log.html#git_tree_free-57", + "ex/v0.99.0/log.html#git_tree_free-58", + "ex/v0.99.0/log.html#git_tree_free-59" ] } }, @@ -23775,10 +23775,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entrycount-37" + "ex/v0.99.0/cat-file.html#git_tree_entrycount-37" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entrycount-94" + "ex/v0.99.0/general.html#git_tree_entrycount-94" ] } }, @@ -23810,7 +23810,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_entry_byname-95" + "ex/v0.99.0/general.html#git_tree_entry_byname-95" ] } }, @@ -23842,10 +23842,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_byindex-38" + "ex/v0.99.0/cat-file.html#git_tree_entry_byindex-38" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entry_byindex-96" + "ex/v0.99.0/general.html#git_tree_entry_byindex-96" ] } }, @@ -23980,11 +23980,11 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_name-39" + "ex/v0.99.0/cat-file.html#git_tree_entry_name-39" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entry_name-97", - "ex/HEAD/general.html#git_tree_entry_name-98" + "ex/v0.99.0/general.html#git_tree_entry_name-97", + "ex/v0.99.0/general.html#git_tree_entry_name-98" ] } }, @@ -24011,7 +24011,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_id-40" + "ex/v0.99.0/cat-file.html#git_tree_entry_id-40" ] } }, @@ -24038,7 +24038,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_type-41" + "ex/v0.99.0/cat-file.html#git_tree_entry_type-41" ] } }, @@ -24065,7 +24065,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_filemode-42" + "ex/v0.99.0/cat-file.html#git_tree_entry_filemode-42" ] } }, @@ -24151,7 +24151,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_entry_to_object-99" + "ex/v0.99.0/general.html#git_tree_entry_to_object-99" ] } }, @@ -24190,8 +24190,8 @@ "git_treebuilder_clear": { "type": "function", "file": "git2/tree.h", - "line": 262, - "lineto": 262, + "line": 263, + "lineto": 263, "args": [ { "name": "bld", @@ -24202,8 +24202,8 @@ "argline": "git_treebuilder *bld", "sig": "git_treebuilder *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success; error code otherwise" }, "description": "

Clear all the entires in the builder

\n", "comments": "", @@ -24212,8 +24212,8 @@ "git_treebuilder_entrycount": { "type": "function", "file": "git2/tree.h", - "line": 270, - "lineto": 270, + "line": 271, + "lineto": 271, "args": [ { "name": "bld", @@ -24234,8 +24234,8 @@ "git_treebuilder_free": { "type": "function", "file": "git2/tree.h", - "line": 281, - "lineto": 281, + "line": 282, + "lineto": 282, "args": [ { "name": "bld", @@ -24256,8 +24256,8 @@ "git_treebuilder_get": { "type": "function", "file": "git2/tree.h", - "line": 293, - "lineto": 294, + "line": 294, + "lineto": 295, "args": [ { "name": "bld", @@ -24283,8 +24283,8 @@ "git_treebuilder_insert": { "type": "function", "file": "git2/tree.h", - "line": 324, - "lineto": 329, + "line": 325, + "lineto": 330, "args": [ { "name": "out", @@ -24325,8 +24325,8 @@ "git_treebuilder_remove": { "type": "function", "file": "git2/tree.h", - "line": 337, - "lineto": 338, + "line": 338, + "lineto": 339, "args": [ { "name": "bld", @@ -24352,8 +24352,8 @@ "git_treebuilder_filter": { "type": "function", "file": "git2/tree.h", - "line": 361, - "lineto": 364, + "line": 363, + "lineto": 366, "args": [ { "name": "bld", @@ -24374,8 +24374,8 @@ "argline": "git_treebuilder *bld, git_treebuilder_filter_cb filter, void *payload", "sig": "git_treebuilder *::git_treebuilder_filter_cb::void *", "return": { - "type": "void", - "comment": null + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" }, "description": "

Selectively remove entries in the tree

\n", "comments": "

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 non-zero, the entry will be filtered (removed from the builder).

\n", @@ -24384,8 +24384,8 @@ "git_treebuilder_write": { "type": "function", "file": "git2/tree.h", - "line": 376, - "lineto": 377, + "line": 378, + "lineto": 379, "args": [ { "name": "id", @@ -24411,8 +24411,8 @@ "git_treebuilder_write_with_buffer": { "type": "function", "file": "git2/tree.h", - "line": 390, - "lineto": 391, + "line": 392, + "lineto": 393, "args": [ { "name": "oid", @@ -24443,8 +24443,8 @@ "git_tree_walk": { "type": "function", "file": "git2/tree.h", - "line": 420, - "lineto": 424, + "line": 422, + "lineto": 426, "args": [ { "name": "tree", @@ -24480,8 +24480,8 @@ "git_tree_dup": { "type": "function", "file": "git2/tree.h", - "line": 433, - "lineto": 433, + "line": 435, + "lineto": 435, "args": [ { "name": "out", @@ -24507,8 +24507,8 @@ "git_tree_create_updated": { "type": "function", "file": "git2/tree.h", - "line": 479, - "lineto": 479, + "line": 481, + "lineto": 481, "args": [ { "name": "out", @@ -25314,15 +25314,15 @@ "description": "

A config enumeration callback

\n", "comments": "" }, - "git_cred_acquire_cb": { + "git_credential_acquire_cb": { "type": "callback", - "file": "git2/cred.h", - "line": 130, - "lineto": 135, + "file": "git2/credential.h", + "line": 131, + "lineto": 136, "args": [ { - "name": "cred", - "type": "git_cred **", + "name": "out", + "type": "git_credential **", "comment": "The newly created credential object." }, { @@ -25338,7 +25338,7 @@ { "name": "allowed_types", "type": "unsigned int", - "comment": "A bitmask stating which cred types are OK to return." + "comment": "A bitmask stating which credential types are OK to return." }, { "name": "payload", @@ -25346,20 +25346,20 @@ "comment": "The payload provided when specifying this callback." } ], - "argline": "git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", - "sig": "git_cred **::const char *::const char *::unsigned int::void *", + "argline": "git_credential **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", "return": { "type": "int", "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" }, "description": "

Credential acquisition callback.

\n", - "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_cred object back, depending on allowed_types (a git_credtype_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" + "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" }, "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 445, - "lineto": 445, + "line": 516, + "lineto": 516, "args": [ { "name": "rhead", @@ -25818,8 +25818,8 @@ "git_push_transfer_progress_cb": { "type": "callback", "file": "git2/remote.h", - "line": 425, - "lineto": 429, + "line": 427, + "lineto": 431, "args": [ { "name": "current", @@ -25854,8 +25854,8 @@ "git_push_negotiation": { "type": "callback", "file": "git2/remote.h", - "line": 461, - "lineto": 461, + "line": 463, + "lineto": 463, "args": [ { "name": "updates", @@ -25885,8 +25885,8 @@ "git_push_update_reference_cb": { "type": "callback", "file": "git2/remote.h", - "line": 475, - "lineto": 475, + "line": 477, + "lineto": 477, "args": [ { "name": "refname", @@ -25916,8 +25916,8 @@ "git_url_resolve_cb": { "type": "callback", "file": "git2/remote.h", - "line": 489, - "lineto": 489, + "line": 491, + "lineto": 491, "args": [ { "name": "url_resolved", @@ -26019,8 +26019,8 @@ "git_revwalk_hide_cb": { "type": "callback", "file": "git2/revwalk.h", - "line": 277, - "lineto": 279, + "line": 281, + "lineto": 283, "args": [ { "name": "commit_id", @@ -26288,8 +26288,8 @@ "git_treebuilder_filter_cb": { "type": "callback", "file": "git2/tree.h", - "line": 347, - "lineto": 348, + "line": 348, + "lineto": 349, "args": [ { "name": "entry", @@ -26314,8 +26314,8 @@ "git_treewalk_cb": { "type": "callback", "file": "git2/tree.h", - "line": 394, - "lineto": 395, + "line": 396, + "lineto": 397, "args": [ { "name": "root", @@ -28294,12 +28294,12 @@ } ], [ - "git_cred", + "git_credential", { - "decl": "git_cred", + "decl": "git_credential", "type": "struct", - "value": "git_cred", - "file": "git2/cred.h", + "value": "git_credential", + "file": "git2/credential.h", "line": 84, "lineto": 84, "tdef": "typedef", @@ -28308,30 +28308,30 @@ "used": { "returns": [], "needs": [ - "git_cred_acquire_cb", - "git_cred_default_new", - "git_cred_free", - "git_cred_get_username", - "git_cred_has_username", - "git_cred_ssh_custom_new", - "git_cred_ssh_interactive_new", - "git_cred_ssh_key_from_agent", - "git_cred_ssh_key_memory_new", - "git_cred_ssh_key_new", - "git_cred_username_new", - "git_cred_userpass", - "git_cred_userpass_plaintext_new" + "git_credential_acquire_cb", + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" ] } } ], [ - "git_cred_default", + "git_credential_default", { - "decl": "git_cred_default", + "decl": "git_credential_default", "type": "struct", - "value": "git_cred_default", - "file": "git2/cred.h", + "value": "git_credential_default", + "file": "git2/credential.h", "line": 92, "lineto": 92, "tdef": "typedef", @@ -28344,12 +28344,12 @@ } ], [ - "git_cred_ssh_custom", + "git_credential_ssh_custom", { - "decl": "git_cred_ssh_custom", + "decl": "git_credential_ssh_custom", "type": "struct", - "value": "git_cred_ssh_custom", - "file": "git2/cred.h", + "value": "git_credential_ssh_custom", + "file": "git2/credential.h", "line": 107, "lineto": 107, "tdef": "typedef", @@ -28362,12 +28362,12 @@ } ], [ - "git_cred_ssh_interactive", + "git_credential_ssh_interactive", { - "decl": "git_cred_ssh_interactive", + "decl": "git_credential_ssh_interactive", "type": "struct", - "value": "git_cred_ssh_interactive", - "file": "git2/cred.h", + "value": "git_credential_ssh_interactive", + "file": "git2/credential.h", "line": 102, "lineto": 102, "tdef": "typedef", @@ -28376,18 +28376,18 @@ "used": { "returns": [], "needs": [ - "git_cred_ssh_interactive_new" + "git_credential_ssh_interactive_new" ] } } ], [ - "git_cred_ssh_key", + "git_credential_ssh_key", { - "decl": "git_cred_ssh_key", + "decl": "git_credential_ssh_key", "type": "struct", - "value": "git_cred_ssh_key", - "file": "git2/cred.h", + "value": "git_credential_ssh_key", + "file": "git2/credential.h", "line": 97, "lineto": 97, "tdef": "typedef", @@ -28400,117 +28400,65 @@ } ], [ - "git_cred_username", - { - "decl": "git_cred_username", - "type": "struct", - "value": "git_cred_username", - "file": "git2/cred.h", - "line": 89, - "lineto": 89, - "tdef": "typedef", - "description": " Username-only credential information ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cred_userpass_payload", - { - "decl": [ - "const char * username", - "const char * password" - ], - "type": "struct", - "value": "git_cred_userpass_payload", - "file": "git2/cred_helpers.h", - "line": 24, - "lineto": 27, - "block": "const char * username\nconst char * password", - "tdef": "typedef", - "description": " Payload for git_cred_stock_userpass_plaintext.", - "comments": "", - "fields": [ - { - "type": "const char *", - "name": "username", - "comments": "" - }, - { - "type": "const char *", - "name": "password", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credtype_t", + "git_credential_t", { "decl": [ - "GIT_CREDTYPE_USERPASS_PLAINTEXT", - "GIT_CREDTYPE_SSH_KEY", - "GIT_CREDTYPE_SSH_CUSTOM", - "GIT_CREDTYPE_DEFAULT", - "GIT_CREDTYPE_SSH_INTERACTIVE", - "GIT_CREDTYPE_USERNAME", - "GIT_CREDTYPE_SSH_MEMORY" + "GIT_CREDENTIAL_USERPASS_PLAINTEXT", + "GIT_CREDENTIAL_SSH_KEY", + "GIT_CREDENTIAL_SSH_CUSTOM", + "GIT_CREDENTIAL_DEFAULT", + "GIT_CREDENTIAL_SSH_INTERACTIVE", + "GIT_CREDENTIAL_USERNAME", + "GIT_CREDENTIAL_SSH_MEMORY" ], "type": "enum", - "file": "git2/cred.h", + "file": "git2/credential.h", "line": 27, "lineto": 79, - "block": "GIT_CREDTYPE_USERPASS_PLAINTEXT\nGIT_CREDTYPE_SSH_KEY\nGIT_CREDTYPE_SSH_CUSTOM\nGIT_CREDTYPE_DEFAULT\nGIT_CREDTYPE_SSH_INTERACTIVE\nGIT_CREDTYPE_USERNAME\nGIT_CREDTYPE_SSH_MEMORY", + "block": "GIT_CREDENTIAL_USERPASS_PLAINTEXT\nGIT_CREDENTIAL_SSH_KEY\nGIT_CREDENTIAL_SSH_CUSTOM\nGIT_CREDENTIAL_DEFAULT\nGIT_CREDENTIAL_SSH_INTERACTIVE\nGIT_CREDENTIAL_USERNAME\nGIT_CREDENTIAL_SSH_MEMORY", "tdef": "typedef", "description": " Supported credential types", "comments": "

This represents the various types of authentication methods supported by the library.

\n", "fields": [ { "type": "int", - "name": "GIT_CREDTYPE_USERPASS_PLAINTEXT", + "name": "GIT_CREDENTIAL_USERPASS_PLAINTEXT", "comments": "

A vanilla user/password request

\n", "value": 1 }, { "type": "int", - "name": "GIT_CREDTYPE_SSH_KEY", + "name": "GIT_CREDENTIAL_SSH_KEY", "comments": "

An SSH key-based authentication request

\n", "value": 2 }, { "type": "int", - "name": "GIT_CREDTYPE_SSH_CUSTOM", + "name": "GIT_CREDENTIAL_SSH_CUSTOM", "comments": "

An SSH key-based authentication request, with a custom signature

\n", "value": 4 }, { "type": "int", - "name": "GIT_CREDTYPE_DEFAULT", + "name": "GIT_CREDENTIAL_DEFAULT", "comments": "

An NTLM/Negotiate-based authentication request.

\n", "value": 8 }, { "type": "int", - "name": "GIT_CREDTYPE_SSH_INTERACTIVE", + "name": "GIT_CREDENTIAL_SSH_INTERACTIVE", "comments": "

An SSH interactive authentication request

\n", "value": 16 }, { "type": "int", - "name": "GIT_CREDTYPE_USERNAME", + "name": "GIT_CREDENTIAL_USERNAME", "comments": "

Username-only authentication request

\n\n

Used as a pre-authentication step if the underlying transport\n (eg. SSH, with no username in its URL) does not know which username\n to use.

\n", "value": 32 }, { "type": "int", - "name": "GIT_CREDTYPE_SSH_MEMORY", + "name": "GIT_CREDENTIAL_SSH_MEMORY", "comments": "

An SSH key-based authentication request

\n\n

Allows credentials to be read from memory instead of files.\n Note that because of differences in crypto backend support, it might\n not be functional.

\n", "value": 64 } @@ -28521,6 +28469,58 @@ } } ], + [ + "git_credential_username", + { + "decl": "git_credential_username", + "type": "struct", + "value": "git_credential_username", + "file": "git2/credential.h", + "line": 89, + "lineto": 89, + "tdef": "typedef", + "description": " Username-only credential information ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_credential_userpass_payload", + { + "decl": [ + "const char * username", + "const char * password" + ], + "type": "struct", + "value": "git_credential_userpass_payload", + "file": "git2/credential_helpers.h", + "line": 24, + "lineto": 27, + "block": "const char * username\nconst char * password", + "tdef": "typedef", + "description": " Payload for git_credential_userpass_plaintext.", + "comments": "", + "fields": [ + { + "type": "const char *", + "name": "username", + "comments": "" + }, + { + "type": "const char *", + "name": "password", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_delta_t", { @@ -30649,13 +30649,14 @@ "GIT_ERROR_FILESYSTEM", "GIT_ERROR_PATCH", "GIT_ERROR_WORKTREE", - "GIT_ERROR_SHA1" + "GIT_ERROR_SHA1", + "GIT_ERROR_HTTP" ], "type": "enum", "file": "git2/errors.h", "line": 75, - "lineto": 110, - "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA1", + "lineto": 111, + "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA1\nGIT_ERROR_HTTP", "tdef": "typedef", "description": " Error classes ", "comments": "", @@ -30863,6 +30864,12 @@ "name": "GIT_ERROR_SHA1", "comments": "", "value": 33 + }, + { + "type": "int", + "name": "GIT_ERROR_HTTP", + "comments": "", + "value": 34 } ], "used": { @@ -30882,8 +30889,8 @@ ], "type": "enum", "file": "git2/common.h", - "line": 127, - "lineto": 150, + "line": 128, + "lineto": 151, "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", "tdef": "typedef", "description": " Combinations of these values describe the features with which libgit2\n was compiled", @@ -30935,8 +30942,8 @@ "type": "struct", "value": "git_fetch_options", "file": "git2/remote.h", - "line": 652, - "lineto": 689, + "line": 654, + "lineto": 691, "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Fetch options structure.", @@ -30998,8 +31005,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 604, - "lineto": 617, + "line": 606, + "lineto": 619, "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", "description": " Acceptable prune settings when fetching ", @@ -32014,13 +32021,14 @@ "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", "GIT_OPT_GET_PACK_MAX_OBJECTS", "GIT_OPT_SET_PACK_MAX_OBJECTS", - "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS" + "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE" ], "type": "enum", "file": "git2/common.h", - "line": 178, - "lineto": 207, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "line": 179, + "lineto": 209, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", "tdef": "typedef", "description": " Global library options", "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", @@ -32192,6 +32200,12 @@ "name": "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", "comments": "", "value": 27 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "comments": "", + "value": 28 } ], "used": { @@ -33557,8 +33571,8 @@ "type": "struct", "value": "git_oid_shorten", "file": "git2/oid.h", - "line": 215, - "lineto": 215, + "line": 220, + "lineto": 220, "tdef": "typedef", "description": " OID Shortener object", "comments": "", @@ -33893,7 +33907,7 @@ "unsigned int version", "git_proxy_t type", "const char * url", - "git_cred_acquire_cb credentials", + "git_credential_acquire_cb credentials", "git_transport_certificate_check_cb certificate_check", "void * payload" ], @@ -33902,7 +33916,7 @@ "file": "git2/proxy.h", "line": 44, "lineto": 79, - "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", + "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "tdef": "typedef", "description": " Options for connecting through a proxy", "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", @@ -33923,7 +33937,7 @@ "comments": " The URL of the proxy." }, { - "type": "git_cred_acquire_cb", + "type": "git_credential_acquire_cb", "name": "credentials", "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." }, @@ -34025,8 +34039,8 @@ "type": "struct", "value": "git_push_options", "file": "git2/remote.h", - "line": 713, - "lineto": 740, + "line": 715, + "lineto": 742, "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", @@ -34080,8 +34094,8 @@ "type": "struct", "value": "git_push_update", "file": "git2/remote.h", - "line": 434, - "lineto": 451, + "line": 436, + "lineto": 453, "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", "tdef": "typedef", "description": " Represents an update which will be performed on the remote during push", @@ -34731,8 +34745,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 624, - "lineto": 642, + "line": 626, + "lineto": 644, "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", "tdef": "typedef", "description": " Automatic tag following option", @@ -34781,7 +34795,7 @@ "unsigned int version", "git_transport_message_cb sideband_progress", "int (*)(git_remote_completion_t, void *) completion", - "git_cred_acquire_cb credentials", + "git_credential_acquire_cb credentials", "git_transport_certificate_check_cb certificate_check", "git_indexer_progress_cb transfer_progress", "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", @@ -34796,9 +34810,9 @@ "type": "struct", "value": "git_remote_callbacks", "file": "git2/remote.h", - "line": 497, - "lineto": 586, - "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_cred_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload\ngit_url_resolve_cb resolve_url", + "line": 499, + "lineto": 588, + "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload\ngit_url_resolve_cb resolve_url", "tdef": null, "description": " The callback settings structure", "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", @@ -34819,7 +34833,7 @@ "comments": "" }, { - "type": "git_cred_acquire_cb", + "type": "git_credential_acquire_cb", "name": "credentials", "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." }, @@ -34895,8 +34909,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 418, - "lineto": 422, + "line": 420, + "lineto": 424, "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", "tdef": "typedef", "description": " Argument to the completion callback which tells it which operation\n finished.", @@ -37609,8 +37623,8 @@ "type": "struct", "value": "git_tree_update", "file": "git2/tree.h", - "line": 448, - "lineto": 457, + "line": 450, + "lineto": 459, "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "tdef": "typedef", "description": " An action to perform during the update of a tree", @@ -37654,8 +37668,8 @@ ], "type": "enum", "file": "git2/tree.h", - "line": 438, - "lineto": 443, + "line": 440, + "lineto": 445, "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", "tdef": "typedef", "description": " The kind of update to perform", @@ -37718,8 +37732,8 @@ ], "type": "enum", "file": "git2/tree.h", - "line": 398, - "lineto": 401, + "line": 400, + "lineto": 403, "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", "tdef": "typedef", "description": " Tree traversal modes ", @@ -38158,20 +38172,20 @@ ] ], [ - "cred", + "credential", [ - "git_cred_default_new", - "git_cred_free", - "git_cred_get_username", - "git_cred_has_username", - "git_cred_ssh_custom_new", - "git_cred_ssh_interactive_new", - "git_cred_ssh_key_from_agent", - "git_cred_ssh_key_memory_new", - "git_cred_ssh_key_new", - "git_cred_username_new", - "git_cred_userpass", - "git_cred_userpass_plaintext_new" + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" ] ], [ @@ -39012,111 +39026,111 @@ "examples": [ [ "add.c", - "ex/HEAD/add.html" + "ex/v0.99.0/add.html" ], [ "args.c", - "ex/HEAD/args.html" + "ex/v0.99.0/args.html" ], [ "blame.c", - "ex/HEAD/blame.html" + "ex/v0.99.0/blame.html" ], [ "cat-file.c", - "ex/HEAD/cat-file.html" + "ex/v0.99.0/cat-file.html" ], [ "checkout.c", - "ex/HEAD/checkout.html" + "ex/v0.99.0/checkout.html" ], [ "clone.c", - "ex/HEAD/clone.html" + "ex/v0.99.0/clone.html" ], [ "common.c", - "ex/HEAD/common.html" + "ex/v0.99.0/common.html" ], [ "config.c", - "ex/HEAD/config.html" + "ex/v0.99.0/config.html" ], [ "describe.c", - "ex/HEAD/describe.html" + "ex/v0.99.0/describe.html" ], [ "diff.c", - "ex/HEAD/diff.html" + "ex/v0.99.0/diff.html" ], [ "fetch.c", - "ex/HEAD/fetch.html" + "ex/v0.99.0/fetch.html" ], [ "for-each-ref.c", - "ex/HEAD/for-each-ref.html" + "ex/v0.99.0/for-each-ref.html" ], [ "general.c", - "ex/HEAD/general.html" + "ex/v0.99.0/general.html" ], [ "index-pack.c", - "ex/HEAD/index-pack.html" + "ex/v0.99.0/index-pack.html" ], [ "init.c", - "ex/HEAD/init.html" + "ex/v0.99.0/init.html" ], [ "lg2.c", - "ex/HEAD/lg2.html" + "ex/v0.99.0/lg2.html" ], [ "log.c", - "ex/HEAD/log.html" + "ex/v0.99.0/log.html" ], [ "ls-files.c", - "ex/HEAD/ls-files.html" + "ex/v0.99.0/ls-files.html" ], [ "ls-remote.c", - "ex/HEAD/ls-remote.html" + "ex/v0.99.0/ls-remote.html" ], [ "merge.c", - "ex/HEAD/merge.html" + "ex/v0.99.0/merge.html" ], [ "remote.c", - "ex/HEAD/remote.html" + "ex/v0.99.0/remote.html" ], [ "rev-list.c", - "ex/HEAD/rev-list.html" + "ex/v0.99.0/rev-list.html" ], [ "rev-parse.c", - "ex/HEAD/rev-parse.html" + "ex/v0.99.0/rev-parse.html" ], [ "show-index.c", - "ex/HEAD/show-index.html" + "ex/v0.99.0/show-index.html" ], [ "stash.c", - "ex/HEAD/stash.html" + "ex/v0.99.0/stash.html" ], [ "status.c", - "ex/HEAD/status.html" + "ex/v0.99.0/status.html" ], [ "tag.c", - "ex/HEAD/tag.html" + "ex/v0.99.0/tag.html" ] ] } diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 2115c41ba..b8c269537 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1,7 +1,7 @@ { "types": { - "git_cred_default": { - "decl": "git_cred" + "git_credential_default": { + "decl": "git_credential" }, "git_diff_hunk": { "decl": [ @@ -353,7 +353,7 @@ } ], "return": { - "type": "void" + "type": "int" }, "group": "index_name_entry" }, @@ -441,7 +441,7 @@ } ], "return": { - "type": "void" + "type": "int" }, "group": "index_reuc_entry" }, @@ -615,7 +615,7 @@ } ], "return": { - "type": "void" + "type": "int" }, "group": "repository" }, @@ -721,7 +721,7 @@ } ], "return": { - "type": "void" + "type": "int" }, "group": "repository" }, @@ -1455,7 +1455,7 @@ "name": "sideband_progress" }, { - "type": "git_cred_acquire_cb", + "type": "git_credential_acquire_cb", "name": "credentials" }, { diff --git a/guides/cloning/gh-two-factor/index.js b/guides/cloning/gh-two-factor/index.js index 1f34c5756..945aac351 100644 --- a/guides/cloning/gh-two-factor/index.js +++ b/guides/cloning/gh-two-factor/index.js @@ -24,7 +24,7 @@ cloneOptions.fetchOpts = { callbacks: { certificateCheck: function() { return 0; }, credentials: function() { - return NodeGit.Cred.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); + return NodeGit.Credential.userpassPlaintextNew(GITHUB_TOKEN, "x-oauth-basic"); } } }; diff --git a/guides/cloning/ssh-with-agent/index.js b/guides/cloning/ssh-with-agent/index.js index b8f5a3aac..655f07e24 100644 --- a/guides/cloning/ssh-with-agent/index.js +++ b/guides/cloning/ssh-with-agent/index.js @@ -23,7 +23,7 @@ cloneOptions.fetchOpts = { // `userName` argument to the `sshKeyFromAgent` function to validate // authentication. credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); } } }; diff --git a/lib/credential.js b/lib/credential.js new file mode 100644 index 000000000..61637ec59 --- /dev/null +++ b/lib/credential.js @@ -0,0 +1,33 @@ +var util = require("util"); +var NodeGit = require("../"); + +var Credential = NodeGit.Credential; + +var deprecatedFn = (method) => + util.deprecate( + Credential[method].bind(Credential), + `Use NodeGit.Credential.${method} instead of NodeGit.Cred.${method}` + ); + +var createCredTypeDeprecationMessage = type => + `Use NodeGit.Credential.TYPE.${type} instead of NodeGit.Cred.TYPE.${type}`; + +NodeGit.Cred = { + defaultNew: deprecatedFn("defaultNew"), + sshKeyFromAgent: deprecatedFn("sshKeyFromAgent"), + sshKeyNew: deprecatedFn("sshKeyNew"), + usernameNew: deprecatedFn("usernameNew"), + userpassPlaintextNew: deprecatedFn("userpassPlaintextNew"), + TYPE: Object.keys(Credential.TYPE).reduce( + (type, key) => { + Object.defineProperty(type, key, { + get: util.deprecate( + () => Credential.TYPE[type], + createCredTypeDeprecationMessage(type) + ) + }); + return type; + }, + {} + ) +}; diff --git a/lib/libgit2.js b/lib/libgit2.js index f246df51e..f8e1b2b52 100644 --- a/lib/libgit2.js +++ b/lib/libgit2.js @@ -2,5 +2,5 @@ var NodeGit = require("../"); var Libgit2 = NodeGit.Libgit2; -Libgit2.OPT.SET_WINDOWS_LONGPATHS = 28; -Libgit2.OPT.GET_WINDOWS_LONGPATHS = 29; +Libgit2.OPT.SET_WINDOWS_LONGPATHS = 29; +Libgit2.OPT.GET_WINDOWS_LONGPATHS = 30; diff --git a/test/tests/clone.js b/test/tests/clone.js index e86663e1c..965d78bc7 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -219,7 +219,7 @@ describe("Clone", function() { callbacks: { certificateCheck: () => 0, credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); } } } @@ -239,7 +239,7 @@ describe("Clone", function() { callbacks: { certificateCheck: () => 0, credentials: function(url, userName) { - return NodeGit.Cred.sshKeyNew( + return NodeGit.Credential.sshKeyNew( userName, sshPublicKeyPath, sshPrivateKeyPath, @@ -263,7 +263,7 @@ describe("Clone", function() { callbacks: { certificateCheck: () => 0, credentials: function(url, userName) { - return NodeGit.Cred.sshKeyNew( + return NodeGit.Credential.sshKeyNew( userName, sshEncryptedPublicKeyPath, sshEncryptedPrivateKeyPath, @@ -320,10 +320,10 @@ describe("Clone", function() { credentials: function() { if (firstPass) { firstPass = false; - return NodeGit.Cred.userpassPlaintextNew("fake-token", + return NodeGit.Credential.userpassPlaintextNew("fake-token", "x-oauth-basic"); } else { - return NodeGit.Cred.defaultNew(); + return NodeGit.Credential.defaultNew(); } } } diff --git a/test/tests/cred.js b/test/tests/cred.js index 6f0bb46ad..eee98d69b 100644 --- a/test/tests/cred.js +++ b/test/tests/cred.js @@ -5,23 +5,23 @@ var local = path.join.bind(path, __dirname); describe("Cred", function() { var NodeGit = require("../../"); - + var sshPublicKey = local("../id_rsa.pub"); var sshPrivateKey = local("../id_rsa"); it("can create default credentials", function() { - var defaultCreds = NodeGit.Cred.defaultNew(); - assert.ok(defaultCreds instanceof NodeGit.Cred); + var defaultCreds = NodeGit.Credential.defaultNew(); + assert.ok(defaultCreds instanceof NodeGit.Credential); }); it("can create ssh credentials using passed keys", function() { - var cred = NodeGit.Cred.sshKeyNew( + var cred = NodeGit.Credential.sshKeyNew( "username", sshPublicKey, sshPrivateKey, ""); - assert.ok(cred instanceof NodeGit.Cred); + assert.ok(cred instanceof NodeGit.Credential); }); it("can create ssh credentials using passed keys in memory", function() { @@ -32,42 +32,42 @@ describe("Cred", function() { encoding: "ascii" }); - return NodeGit.Cred.sshKeyMemoryNew( + return NodeGit.Credential.sshKeyMemoryNew( "username", publicKeyContents, privateKeyContents, "").then(function(cred) { - assert.ok(cred instanceof NodeGit.Cred); + assert.ok(cred instanceof NodeGit.Credential); }); }); it("can create credentials using plaintext", function() { - var plaintextCreds = NodeGit.Cred.userpassPlaintextNew + var plaintextCreds = NodeGit.Credential.userpassPlaintextNew ("username", "password"); - assert.ok(plaintextCreds instanceof NodeGit.Cred); + assert.ok(plaintextCreds instanceof NodeGit.Credential); }); - + it("can create credentials using agent", function() { - var fromAgentCreds = NodeGit.Cred.sshKeyFromAgent + var fromAgentCreds = NodeGit.Credential.sshKeyFromAgent ("username"); - assert.ok(fromAgentCreds instanceof NodeGit.Cred); + assert.ok(fromAgentCreds instanceof NodeGit.Credential); }); it("can create credentials using username", function() { - return NodeGit.Cred.usernameNew + return NodeGit.Credential.usernameNew ("username").then(function(cred) { - assert.ok(cred instanceof NodeGit.Cred); + assert.ok(cred instanceof NodeGit.Credential); }); }); it("can return 1 if a username exists", function() { - var plaintextCreds = NodeGit.Cred.userpassPlaintextNew + var plaintextCreds = NodeGit.Credential.userpassPlaintextNew ("username", "password"); assert.ok(plaintextCreds.hasUsername() === 1); }); it("can return 0 if a username does not exist", function() { - var defaultCreds = NodeGit.Cred.defaultNew(); + var defaultCreds = NodeGit.Credential.defaultNew(); assert.ok(defaultCreds.hasUsername() === 0); }); }); diff --git a/test/tests/remote.js b/test/tests/remote.js index a57c89ad2..c9bf8192c 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -224,7 +224,7 @@ describe("Remote", function() { var fetchOpts = { callbacks: { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); }, certificateCheck: () => 0, @@ -261,7 +261,7 @@ describe("Remote", function() { return this.repository.fetch("origin", { callbacks: { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); }, certificateCheck: () => 0 } @@ -273,7 +273,7 @@ describe("Remote", function() { var fetchOptions = { callbacks: { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyNew( + return NodeGit.Credential.sshKeyNew( userName, path.resolve("./test/nodegit-test-rsa.pub"), path.resolve("./test/nodegit-test-rsa"), @@ -302,7 +302,7 @@ describe("Remote", function() { credentials: function(url, userName) { if (firstPass) { firstPass = false; - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); } }, certificateCheck: () => 0 @@ -336,7 +336,7 @@ describe("Remote", function() { return repository.fetchAll({ callbacks: { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); }, certificateCheck: () => 0 } @@ -428,9 +428,10 @@ describe("Remote", function() { if (firstPass) { firstPass = false; if (url.indexOf("https") === -1) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); } else { - return NodeGit.Cred.userpassPlaintextNew(userName, ""); + return NodeGit.Credential + .userpassPlaintextNew(userName, ""); } } else { return Promise.reject(); diff --git a/test/tests/repository.js b/test/tests/repository.js index bce03a6cb..3d260ea80 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -184,7 +184,7 @@ describe("Repository", function() { return repo.fetch("origin", { credentials: function(url, userName) { - return NodeGit.Cred.sshKeyFromAgent(userName); + return NodeGit.Credential.sshKeyFromAgent(userName); }, certificateCheck: () => 0 }) diff --git a/vendor/libgit2 b/vendor/libgit2 index 71c00e721..bb31abb74 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 71c00e72172e22478a62fab61be418e0c5375865 +Subproject commit bb31abb74c5f746a3367f94a7648ba240ded5187 diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index adafb322d..9747b155a 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -44,6 +44,8 @@ "libgit2/src/allocators/stdalloc.h", "libgit2/src/commit.c", "libgit2/src/commit.h", + "libgit2/src/custom_tls.c", + "libgit2/src/custom_tls.h", "libgit2/src/alloc.c", "libgit2/src/alloc.h", "libgit2/src/annotated_commit.c", @@ -51,6 +53,7 @@ "libgit2/src/apply.c", "libgit2/src/apply.h", "libgit2/src/array.h", + "libgit2/src/assert_safe.h", "libgit2/src/attr_file.c", "libgit2/src/attr_file.h", "libgit2/src/attr.c", @@ -216,7 +219,6 @@ "libgit2/src/reader.h", "libgit2/src/rebase.c", "libgit2/src/refdb_fs.c", - "libgit2/src/refdb_fs.h", "libgit2/src/refdb.c", "libgit2/src/refdb.h", "libgit2/src/reflog.c", @@ -238,8 +240,6 @@ "libgit2/src/revwalk.c", "libgit2/src/revwalk.h", "libgit2/src/settings.c", - "libgit2/src/sha1_lookup.c", - "libgit2/src/sha1_lookup.h", "libgit2/src/signature.c", "libgit2/src/signature.h", "libgit2/src/streams/socket.c", @@ -249,6 +249,7 @@ "libgit2/src/stash.c", "libgit2/src/status.c", "libgit2/src/status.h", + "libgit2/src/strarray.c", "libgit2/src/strmap.c", "libgit2/src/strmap.h", "libgit2/src/strnlen.h", @@ -265,10 +266,12 @@ "libgit2/src/trailer.c", "libgit2/src/transaction.c", "libgit2/src/transport.c", - "libgit2/src/transports/cred_helpers.c", - "libgit2/src/transports/cred.c", + "libgit2/src/transports/credential_helpers.c", + "libgit2/src/transports/credential.c", "libgit2/src/transports/git.c", "libgit2/src/transports/local.c", + "libgit2/src/transports/httpclient.h", + "libgit2/src/transports/httpclient.c", "libgit2/src/transports/smart_pkt.c", "libgit2/src/transports/smart_protocol.c", "libgit2/src/transports/smart.c", @@ -477,6 +480,7 @@ "sources": [ "libgit2/src/unix/map.c", "libgit2/src/unix/posix.h", + "libgit2/src/unix/pthread.c", "libgit2/src/unix/pthread.h", "libgit2/src/unix/realpath.c", ], From 835f8d6b26f07fd88ebe1d57c4f6c7e42e541f85 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Feb 2020 17:31:49 -0700 Subject: [PATCH 205/545] Fix ownership model on AnnotatedCommit --- generate/input/descriptor.json | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index b1aa0d463..e5f18b568 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -110,23 +110,31 @@ } }, "git_annotated_commit_from_ref": { - "return": { - "ownedBy": ["repo"] + "args": { + "out": { + "ownedBy": ["repo"] + } } }, "git_annotated_commit_from_fetchhead": { - "return": { - "ownedBy": ["repo"] + "args": { + "out": { + "ownedBy": ["repo"] + } } }, "git_annotated_commit_lookup": { - "return": { - "ownedBy": ["repo"] + "args": { + "out": { + "ownedBy": ["repo"] + } } }, "git_annotated_commit_from_revspec": { - "return": { - "ownedBy": ["repo"] + "args": { + "out": { + "ownedBy": ["repo"] + } } } } From 7f2c1fcf087572670026bbd0a749e9ac37093945 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Feb 2020 17:32:01 -0700 Subject: [PATCH 206/545] Clean up buffer deprecations --- lib/blob.js | 2 +- lib/diff_line.js | 2 +- lib/repository.js | 2 +- test/tests/blob.js | 14 +++++++------- test/tests/diff.js | 2 +- test/tests/filter.js | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/blob.js b/lib/blob.js index afb563a6a..7d4e14303 100644 --- a/lib/blob.js +++ b/lib/blob.js @@ -69,5 +69,5 @@ Blob.prototype.filter = function(asPath, opts) { Blob.filteredContent = util.deprecate( _filteredContent, "NodeGit.Blob.filteredContent is deprecated" + - "use NodeGit.Blob.prototype.filter instead." + " use NodeGit.Blob.prototype.filter instead." ); diff --git a/lib/diff_line.js b/lib/diff_line.js index 83e434401..f856f07c7 100644 --- a/lib/diff_line.js +++ b/lib/diff_line.js @@ -13,7 +13,7 @@ DiffLine.prototype.content = function() { } if (!this._cache.content) { - this._cache.content = new Buffer(this.rawContent()) + this._cache.content = Buffer.from(this.rawContent()) .slice(0, this.contentLen()) .toString("utf8"); } diff --git a/lib/repository.js b/lib/repository.js index 69f011ae0..49e968e4f 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -1942,7 +1942,7 @@ Repository.prototype.stageLines = ); }) .then(function(newContent) { - var newContentBuffer = new Buffer(newContent); + var newContentBuffer = Buffer.from(newContent); return repo.createBlobFromBuffer(newContentBuffer); }) diff --git a/test/tests/blob.js b/test/tests/blob.js index 4d18a43ff..2d6512c86 100644 --- a/test/tests/blob.js +++ b/test/tests/blob.js @@ -128,7 +128,7 @@ describe("Blob", function() { describe("createFromBuffer", function() { it("creates a new blob from the buffer", function() { var content = "This is a new buffer"; - var buf = new Buffer(content, content.length); + var buf = Buffer.from(content, content.length); var test = this; return Blob.createFromBuffer(test.repository, buf, content.length) @@ -142,7 +142,7 @@ describe("Blob", function() { it("creates blob with content equal to length", function() { var content = "This is a new buffer"; - var buf = new Buffer(content, content.length); + var buf = Buffer.from(content, content.length); var test = this; return Blob.createFromBuffer(test.repository, buf, 2) @@ -171,7 +171,7 @@ describe("Blob", function() { it("throws an error when no length is provided", function() { var test = this; - return Blob.createFromBuffer(test.repository, new Buffer("testing")) + return Blob.createFromBuffer(test.repository, Buffer.from("testing")) .catch(function(error) { assert.strictEqual(error.message, "Number len is required."); }); @@ -368,7 +368,7 @@ describe("Blob", function() { it("returns nothing when checking binary blob", function() { var test = this; - var binary = new Buffer(new Uint8Array([1,2,3,4,5,6])); + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); return commitFile( test.repository, @@ -410,7 +410,7 @@ describe("Blob", function() { it("returns blob when not checking binary on binary blob", function() { var test = this; - var binary = new Buffer(new Uint8Array([1,2,3,4,5,6])); + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); return commitFile( test.repository, @@ -571,7 +571,7 @@ describe("Blob", function() { it("returns nothing when checking binary blob", function() { var test = this; - var binary = new Buffer(new Uint8Array([1,2,3,4,5,6])); + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); return commitFile( test.repository, @@ -612,7 +612,7 @@ describe("Blob", function() { it("returns blob when not checking binary on binary blob", function() { var test = this; - var binary = new Buffer(new Uint8Array([1,2,3,4,5,6])); + var binary = Buffer.from(new Uint8Array([1,2,3,4,5,6])); return commitFile( test.repository, diff --git a/test/tests/diff.js b/test/tests/diff.js index 31aff3f64..9fd483c38 100644 --- a/test/tests/diff.js +++ b/test/tests/diff.js @@ -246,7 +246,7 @@ describe("Diff", function() { it("can diff the contents of a file to a string with unicode characters", function(done) { var evilString = "Unicode’s fun!\nAnd it’s good for you!\n"; - var buffer = new Buffer(evilString); + var buffer = Buffer.from(evilString); var test = this; Blob.createFromBuffer(test.repository, buffer, buffer.length) .then(function(oid) { diff --git a/test/tests/filter.js b/test/tests/filter.js index 62aa4e863..5b8b8b63c 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -406,7 +406,7 @@ describe("Filter", function() { var message = "some new fancy filter"; var length = message.length; - var tempBuffer = new Buffer(message, "utf-8"); + var tempBuffer = Buffer.from(message, "utf-8"); var largeBufferSize = 500000000; it("should not apply when check returns GIT_PASSTHROUGH", function(){ @@ -938,7 +938,7 @@ describe("Filter", function() { var message = "This is the filtered content, friends"; var length = message.length; - var tempBuffer = new Buffer(message, "utf-8"); + var tempBuffer = Buffer.from(message, "utf-8"); it("applies the filters for a path on demand", function() { var test = this; From 6fce58c4e38f0f293873aed0e1be65746e10f514 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Feb 2020 17:35:10 -0700 Subject: [PATCH 207/545] Clean up assert deprecations --- test/tests/filter.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/tests/filter.js b/test/tests/filter.js index 5b8b8b63c..b03587d77 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -266,7 +266,11 @@ describe("Filter", function() { return Checkout.head(test.repository, opts); }) .then(function(head) { - assert.fail(head, undefined, "Should not have actually checked out"); + assert.strictEqual( + head, + undefined, + "Should not have actually checked out" + ); }) .catch(function(error) { assert.strictEqual(initialized, true); From 77b81d9a201a1908e9d6125fe9207aa29d12039f Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 13 Aug 2020 15:23:42 -0700 Subject: [PATCH 208/545] Fix broken revert test --- test/tests/revert.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/tests/revert.js b/test/tests/revert.js index e213dec28..accb529ca 100644 --- a/test/tests/revert.js +++ b/test/tests/revert.js @@ -10,6 +10,7 @@ describe("Revert", function() { var Revert = NodeGit.Revert; var RevertOptions = NodeGit.RevertOptions; + var Status = NodeGit.Status; var test; var fileName = "foobar.js"; @@ -51,15 +52,13 @@ describe("Revert", function() { }); it("revert modifies the index", function() { - Revert.revert(test.repository, test.firstCommit, new RevertOptions()) - .then(function() { - return test.repository.index(); - }) - .then(function(index) { - var entries = index.entries; - assert.equal(1, entries.length); - assert.ok(_.endsWith(fileName, entries[0].path)); - }); + return Revert.revert(test.repository, test.firstCommit, new RevertOptions()) + .then(() => test.repository.getStatus()) + .then((status) => { + assert.equal(1, status.length); + assert.ok(_.endsWith(fileName, status[0].path())); + assert.equal(Status.STATUS.INDEX_DELETED, status[0].statusBit()); + }); }); it("RevertOptions is optional (unspecified)", function() { From 320692704336bb33d39f28099c24a346d631dfdc Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Aug 2020 14:08:53 -0700 Subject: [PATCH 209/545] Add node::CallbackScope to loop callbacks --- generate/templates/manual/src/thread_pool.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 7eadf0421..ef7a4528d 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -1,3 +1,4 @@ +#include #include "../include/thread_pool.h" ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) { @@ -73,6 +74,9 @@ void ThreadPool::RunLoopCallbacks(uv_async_t* handle) { } void ThreadPool::RunLoopCallbacks() { + Nan::HandleScope scope; + v8::Local context = Nan::GetCurrentContext(); + node::CallbackScope callbackScope(context->GetIsolate(), Nan::New(), {0, 0}); // get the next callback to run uv_mutex_lock(&loopMutex); LoopCallback loopCallback = loopQueue.front(); From 7949764a770416b45cc441bb576d57e85e4b4a11 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 31 Jul 2020 09:51:01 -0700 Subject: [PATCH 210/545] Cleanup unused ifdefs --- generate/templates/templates/nodegit.cc | 42 ++++++++----------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 6a3fa8ef4..f3c7f3ab3 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -23,37 +23,21 @@ #include "../include/convenient_hunk.h" #include "../include/filter_registry.h" -#if (NODE_MODULE_VERSION > 48) - v8::Local GetPrivate(v8::Local object, - v8::Local key) { - v8::Local value; - Nan::Maybe result = Nan::HasPrivate(object, key); - if (!(result.IsJust() && result.FromJust())) - return v8::Local(); - if (Nan::GetPrivate(object, key).ToLocal(&value)) - return value; +v8::Local GetPrivate(v8::Local object, v8::Local key) { + v8::Local value; + Nan::Maybe result = Nan::HasPrivate(object, key); + if (!(result.IsJust() && result.FromJust())) return v8::Local(); - } - - void SetPrivate(v8::Local object, - v8::Local key, - v8::Local value) { - if (value.IsEmpty()) - return; - Nan::SetPrivate(object, key, value); - } -#else - v8::Local GetPrivate(v8::Local object, - v8::Local key) { - return object->GetHiddenValue(key); - } + if (Nan::GetPrivate(object, key).ToLocal(&value)) + return value; + return v8::Local(); +} - void SetPrivate(v8::Local object, - v8::Local key, - v8::Local value) { - object->SetHiddenValue(key, value); - } -#endif +void SetPrivate(v8::Local object, v8::Local key, v8::Local value) { + if (value.IsEmpty()) + return; + Nan::SetPrivate(object, key, value); +} void LockMasterEnable(const FunctionCallbackInfo& info) { LockMaster::Enable(); From 33326b49493cce9b1a738ec22650232176b5c153 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 31 Jul 2020 10:21:10 -0700 Subject: [PATCH 211/545] Guard initialization so that we only initialize our core libraries once --- generate/templates/templates/nodegit.cc | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index f3c7f3ab3..8d1790afc 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -5,8 +5,8 @@ #include #include #include - #include +#include #include "../include/init_ssh2.h" #include "../include/lock_master.h" @@ -98,14 +98,26 @@ void OpenSSL_ThreadSetup() { CRYPTO_THREADID_set_callback(OpenSSL_IDCallback); } +// TODO initialize a thread pool per context. Replace uv_default_loop() with node::GetCurrentEventLoop(isolate); ThreadPool libgit2ThreadPool(10, uv_default_loop()); +std::once_flag libraryInitializedFlag; +std::mutex libraryInitializationMutex; + extern "C" void init(v8::Local target) { - // Initialize thread safety in openssl and libssh2 - OpenSSL_ThreadSetup(); - init_ssh2(); - // Initialize libgit2. - git_libgit2_init(); + { + // We only want to do initialization logic once, and we also want to prevent any thread from completely loading + // the module until initialization has occurred. + // All of this initialization logic ends up being shared. + const std::lock_guard lock(libraryInitializationMutex); + std::call_once(libraryInitializedFlag, []() { + // Initialize thread safety in openssl and libssh2 + OpenSSL_ThreadSetup(); + init_ssh2(); + // Initialize libgit2. + git_libgit2_init(); + }); + } Nan::HandleScope scope; From 5ad8682474d05e1258cfdad512aae85a0ccdc60b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 31 Jul 2020 10:30:13 -0700 Subject: [PATCH 212/545] Use NAN_MODULE_INIT and prevent worker_threads from booting library Until node understands how to cleanup a native node module asynchronously, we cannot allow nodegit to operate in a worker thread or it will die on exit. Other concerns... Process reuse in Electron may be a problem without async cleanup being a real thing. --- generate/templates/templates/nodegit.cc | 2 +- generate/templates/templates/nodegit.js | 6 ++++++ package-lock.json | 6 +++--- package.json | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 8d1790afc..447bdb4fb 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -104,7 +104,7 @@ ThreadPool libgit2ThreadPool(10, uv_default_loop()); std::once_flag libraryInitializedFlag; std::mutex libraryInitializationMutex; -extern "C" void init(v8::Local target) { +NAN_MODULE_INIT(init) { { // We only want to do initialization logic once, and we also want to prevent any thread from completely loading // the module until initialization has occurred. diff --git a/generate/templates/templates/nodegit.js b/generate/templates/templates/nodegit.js index c22d7d999..a580b4df7 100644 --- a/generate/templates/templates/nodegit.js +++ b/generate/templates/templates/nodegit.js @@ -1,7 +1,13 @@ var _ = require("lodash"); var util = require("util"); +var worker = require("worker_threads"); + var rawApi; +if (!worker.isMainThread || typeof importScripts === "function") { + throw new Error("NodeGit is currently not safe to run in a worker thread or web worker"); +} + // Attempt to load the production release first, if it fails fall back to the // debug release. try { diff --git a/package-lock.json b/package-lock.json index 6c7f169a1..cfaa4813f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3779,9 +3779,9 @@ "dev": true }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, "nanomatch": { "version": "1.2.13", diff --git a/package.json b/package.json index 36c09494c..18ba76965 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "got": "^10.7.0", "json5": "^2.1.0", "lodash": "^4.17.14", - "nan": "^2.14.0", + "nan": "^2.14.1", "node-gyp": "^4.0.0", "node-pre-gyp": "^0.13.0", "ramda": "^0.25.0", From 6167a10be3199ebf63283e07c886097a312f9379 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 3 Aug 2020 15:10:58 -0700 Subject: [PATCH 213/545] Make LockMaster shareable across contexts --- .../templates/manual/include/lock_master.h | 40 +---------- generate/templates/manual/src/lock_master.cc | 40 ++++------- generate/templates/templates/nodegit.cc | 66 ++++--------------- test/runner.js | 8 --- test/tests/thread_safety.js | 65 ------------------ 5 files changed, 28 insertions(+), 191 deletions(-) delete mode 100644 test/tests/thread_safety.js diff --git a/generate/templates/manual/include/lock_master.h b/generate/templates/manual/include/lock_master.h index fde38825b..911760bd8 100644 --- a/generate/templates/manual/include/lock_master.h +++ b/generate/templates/manual/include/lock_master.h @@ -6,16 +6,7 @@ class LockMasterImpl; class LockMaster { -public: - enum Status { - Disabled = 0, - EnabledForAsyncOnly, - Enabled - }; - private: - static Status status; - LockMasterImpl *impl; template @@ -44,7 +35,7 @@ class LockMaster { // we lock on construction template LockMaster(bool asyncAction, const Types*... types) { - if((status == Disabled) || ((status == EnabledForAsyncOnly) && !asyncAction)) { + if(!asyncAction) { impl = NULL; return; } @@ -85,33 +76,8 @@ class LockMaster { } }; - static void Initialize(); - - // Enables the thread safety system - static void Enable() { - status = Enabled; - } - - static void SetStatus(Status status) { - LockMaster::status = status; - } - - static void Disable() { - status = Disabled; - } - - static Status GetStatus() { - return status; - } - - // Diagnostic information that can be provided to the JavaScript layer - // for a minimal level of testing - struct Diagnostics { - // this counts all stored mutexes - even if they are unlocked: - int storedMutexesCount; - }; - - static Diagnostics GetDiagnostics(); + static void InitializeGlobal(); + static void InitializeContext(); }; diff --git a/generate/templates/manual/src/lock_master.cc b/generate/templates/manual/src/lock_master.cc index 30679b534..553928177 100644 --- a/generate/templates/manual/src/lock_master.cc +++ b/generate/templates/manual/src/lock_master.cc @@ -36,7 +36,9 @@ class LockMasterImpl { static NAN_GC_CALLBACK(CleanupMutexes); public: - static void Initialize(); + static void InitializeGlobal(); + + static void InitializeContext(); // INSTANCE variables / methods @@ -53,7 +55,6 @@ class LockMasterImpl { static LockMasterImpl *CurrentLockMasterImpl() { return (LockMasterImpl *)uv_key_get(¤tLockMasterKey); } - static LockMaster::Diagnostics GetDiagnostics(); LockMasterImpl() { Register(); @@ -76,21 +77,16 @@ std::map LockMasterImpl::mutexes; uv_mutex_t LockMasterImpl::mapMutex; uv_key_t LockMasterImpl::currentLockMasterKey; -void LockMasterImpl::Initialize() { +void LockMasterImpl::InitializeGlobal() { uv_mutex_init(&mapMutex); uv_key_create(¤tLockMasterKey); +} + +void LockMasterImpl::InitializeContext() { Nan::AddGCEpilogueCallback(CleanupMutexes); } NAN_GC_CALLBACK(LockMasterImpl::CleanupMutexes) { - // skip cleanup if thread safety is disabled - // this means that turning thread safety on and then off - // could result in remaining mutexes - but they would get cleaned up - // if thread safety is turned on again - if (LockMaster::GetStatus() == LockMaster::Disabled) { - return; - } - uv_mutex_lock(&mapMutex); for (auto it = mutexes.begin(); it != mutexes.end(); ) @@ -113,8 +109,12 @@ NAN_GC_CALLBACK(LockMasterImpl::CleanupMutexes) { uv_mutex_unlock(&mapMutex); } -void LockMaster::Initialize() { - LockMasterImpl::Initialize(); +void LockMaster::InitializeGlobal() { + LockMasterImpl::InitializeGlobal(); +} + +void LockMaster::InitializeContext() { + LockMasterImpl::InitializeContext(); } std::vector LockMasterImpl::GetMutexes(int useCountDelta) { @@ -200,14 +200,6 @@ void LockMasterImpl::Unlock(bool releaseMutexes) { GetMutexes(releaseMutexes * -1); } -LockMaster::Diagnostics LockMasterImpl::GetDiagnostics() { - LockMaster::Diagnostics diagnostics; - uv_mutex_lock(&LockMasterImpl::mapMutex); - diagnostics.storedMutexesCount = mutexes.size(); - uv_mutex_unlock(&LockMasterImpl::mapMutex); - return diagnostics; -} - // LockMaster void LockMaster::ConstructorImpl() { @@ -226,10 +218,6 @@ void LockMaster::ObjectsToLockAdded() { impl->Lock(true); } -LockMaster::Diagnostics LockMaster::GetDiagnostics() { - return LockMasterImpl::GetDiagnostics(); -} - // LockMaster::TemporaryUnlock void LockMaster::TemporaryUnlock::ConstructorImpl() { @@ -242,5 +230,3 @@ void LockMaster::TemporaryUnlock::ConstructorImpl() { void LockMaster::TemporaryUnlock::DestructorImpl() { impl->Lock(false); } - -LockMaster::Status LockMaster::status = LockMaster::Disabled; diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 447bdb4fb..3d742adb6 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -23,56 +23,24 @@ #include "../include/convenient_hunk.h" #include "../include/filter_registry.h" -v8::Local GetPrivate(v8::Local object, v8::Local key) { - v8::Local value; +using namespace v8; + +Local GetPrivate(Local object, Local key) { + Local value; Nan::Maybe result = Nan::HasPrivate(object, key); if (!(result.IsJust() && result.FromJust())) - return v8::Local(); + return Local(); if (Nan::GetPrivate(object, key).ToLocal(&value)) return value; - return v8::Local(); + return Local(); } -void SetPrivate(v8::Local object, v8::Local key, v8::Local value) { +void SetPrivate(Local object, Local key, Local value) { if (value.IsEmpty()) return; Nan::SetPrivate(object, key, value); } -void LockMasterEnable(const FunctionCallbackInfo& info) { - LockMaster::Enable(); -} - -void LockMasterSetStatus(const FunctionCallbackInfo& info) { - Nan::HandleScope scope; - - // convert the first argument to Status - if(info.Length() >= 0 && info[0]->IsNumber()) { - v8::Local value = Nan::To(info[0]).ToLocalChecked(); - LockMaster::Status status = static_cast(value->Value()); - if(status >= LockMaster::Disabled && status <= LockMaster::Enabled) { - LockMaster::SetStatus(status); - return; - } - } - - // argument error - Nan::ThrowError("Argument must be one 0, 1 or 2"); -} - -void LockMasterGetStatus(const FunctionCallbackInfo& info) { - info.GetReturnValue().Set(Nan::New(LockMaster::GetStatus())); -} - -void LockMasterGetDiagnostics(const FunctionCallbackInfo& info) { - LockMaster::Diagnostics diagnostics(LockMaster::GetDiagnostics()); - - // return a plain JS object with properties - v8::Local result = Nan::New(); - Nan::Set(result, Nan::New("storedMutexesCount").ToLocalChecked(), Nan::New(diagnostics.storedMutexesCount)); - info.GetReturnValue().Set(result); -} - static uv_mutex_t *opensslMutexes; void OpenSSL_LockingCallback(int mode, int type, const char *, int) { @@ -101,8 +69,8 @@ void OpenSSL_ThreadSetup() { // TODO initialize a thread pool per context. Replace uv_default_loop() with node::GetCurrentEventLoop(isolate); ThreadPool libgit2ThreadPool(10, uv_default_loop()); -std::once_flag libraryInitializedFlag; -std::mutex libraryInitializationMutex; +static std::once_flag libraryInitializedFlag; +static std::mutex libraryInitializationMutex; NAN_MODULE_INIT(init) { { @@ -116,6 +84,8 @@ NAN_MODULE_INIT(init) { init_ssh2(); // Initialize libgit2. git_libgit2_init(); + + LockMaster::InitializeGlobal(); }); } @@ -133,19 +103,7 @@ NAN_MODULE_INIT(init) { ConvenientPatch::InitializeComponent(target); GitFilterRegistry::InitializeComponent(target); - NODE_SET_METHOD(target, "enableThreadSafety", LockMasterEnable); - NODE_SET_METHOD(target, "setThreadSafetyStatus", LockMasterSetStatus); - NODE_SET_METHOD(target, "getThreadSafetyStatus", LockMasterGetStatus); - NODE_SET_METHOD(target, "getThreadSafetyDiagnostics", LockMasterGetDiagnostics); - - v8::Local threadSafety = Nan::New(); - Nan::Set(threadSafety, Nan::New("DISABLED").ToLocalChecked(), Nan::New((int)LockMaster::Disabled)); - Nan::Set(threadSafety, Nan::New("ENABLED_FOR_ASYNC_ONLY").ToLocalChecked(), Nan::New((int)LockMaster::EnabledForAsyncOnly)); - Nan::Set(threadSafety, Nan::New("ENABLED").ToLocalChecked(), Nan::New((int)LockMaster::Enabled)); - - Nan::Set(target, Nan::New("THREAD_SAFETY").ToLocalChecked(), threadSafety); - - LockMaster::Initialize(); + LockMaster::InitializeContext(); } NODE_MODULE(nodegit, init) diff --git a/test/runner.js b/test/runner.js index 89732a158..d81a6578f 100644 --- a/test/runner.js +++ b/test/runner.js @@ -5,14 +5,6 @@ var exec = require('../utils/execPromise'); var NodeGit = require('..'); -if(process.env.NODEGIT_TEST_THREADSAFETY) { - console.log('Enabling thread safety in NodeGit'); - NodeGit.enableThreadSafety(); -} else if (process.env.NODEGIT_TEST_THREADSAFETY_ASYNC) { - console.log('Enabling thread safety for async actions only in NodeGit'); - NodeGit.setThreadSafetyStatus(NodeGit.THREAD_SAFETY.ENABLED_FOR_ASYNC_ONLY); -} - var workdirPath = local("repos/workdir"); before(function() { diff --git a/test/tests/thread_safety.js b/test/tests/thread_safety.js deleted file mode 100644 index 257c2d51e..000000000 --- a/test/tests/thread_safety.js +++ /dev/null @@ -1,65 +0,0 @@ -var assert = require("assert"); -var path = require("path"); -var local = path.join.bind(path, __dirname); - -describe("ThreadSafety", function() { - var NodeGit = require("../../"); - var Repository = NodeGit.Repository; - - var reposPath = local("../repos/workdir"); - - beforeEach(function() { - var test = this; - - return Repository.open(reposPath) - .then(function(repo) { - test.repository = repo; - return repo.refreshIndex(); - }) - .then(function(index) { - test.index = index; - }); - }); - - it("can enable and disable thread safety", function() { - var originalValue = NodeGit.getThreadSafetyStatus(); - - NodeGit.enableThreadSafety(); - assert.equal(NodeGit.THREAD_SAFETY.ENABLED, - NodeGit.getThreadSafetyStatus()); - - NodeGit.setThreadSafetyStatus(NodeGit.THREAD_SAFETY.ENABLED_FOR_ASYNC_ONLY); - assert.equal(NodeGit.THREAD_SAFETY.ENABLED_FOR_ASYNC_ONLY, - NodeGit.getThreadSafetyStatus()); - - NodeGit.setThreadSafetyStatus(NodeGit.THREAD_SAFETY.DISABLED); - assert.equal(NodeGit.THREAD_SAFETY.DISABLED, - NodeGit.getThreadSafetyStatus()); - - NodeGit.setThreadSafetyStatus(originalValue); - }); - - it("can lock something and cleanup mutex", function() { - var diagnostics = NodeGit.getThreadSafetyDiagnostics(); - var originalCount = diagnostics.storedMutexesCount; - // call a sync method to guarantee that it stores a mutex, - // and that it will clean up the mutex in a garbage collection cycle - this.repository.headDetached(); - - diagnostics = NodeGit.getThreadSafetyDiagnostics(); - switch(NodeGit.getThreadSafetyStatus()) { - case NodeGit.THREAD_SAFETY.ENABLED: - // this is a fairly vague test - it just tests that something - // had a mutex created for it at some point (i.e., the thread safety - // code is not completely dead) - assert.ok(diagnostics.storedMutexesCount > 0); - break; - case NodeGit.THREAD_SAFETY.ENABLED_FOR_ASYNC_ONLY: - assert.equal(originalCount, diagnostics.storedMutexesCount); - break; - - case NodeGit.THREAD_SAFETY.DISABLED: - assert.equal(0, diagnostics.storedMutexesCount); - } - }); -}); From a820ff48e3d88301a54b52c3ee0cde175d5ac88b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 5 Aug 2020 14:41:54 -0700 Subject: [PATCH 214/545] Get rid of libuv in lock_master --- generate/templates/manual/src/lock_master.cc | 97 +++++++++----------- generate/templates/templates/nodegit.cc | 2 - 2 files changed, 43 insertions(+), 56 deletions(-) diff --git a/generate/templates/manual/src/lock_master.cc b/generate/templates/manual/src/lock_master.cc index 553928177..fd1c49192 100644 --- a/generate/templates/manual/src/lock_master.cc +++ b/generate/templates/manual/src/lock_master.cc @@ -1,21 +1,23 @@ #include #include -#include #include #include #include #include +#include +#include +#include #include "../include/lock_master.h" // information about a lockable object // - the mutex used to lock it and the number of outstanding locks struct ObjectInfo { - uv_mutex_t *mutex; + std::shared_ptr mutex; unsigned useCount; - ObjectInfo(uv_mutex_t *mutex, unsigned useCount) - : mutex(mutex), useCount(useCount) + ObjectInfo(unsigned useCount) + : mutex(new std::mutex), useCount(useCount) {} }; @@ -27,17 +29,15 @@ class LockMasterImpl { // A map from objects that are locked (or were locked), to information on their mutex static std::map mutexes; // A mutex used for the mutexes map - static uv_mutex_t mapMutex; + static std::mutex mapMutex; - // A libuv key used to store the current thread-specific LockMasterImpl instance - static uv_key_t currentLockMasterKey; + // A thread local storage slot for the current thread-specific LockMasterImpl instance + thread_local static LockMasterImpl* currentLockMaster; // Cleans up any mutexes that are not currently used static NAN_GC_CALLBACK(CleanupMutexes); public: - static void InitializeGlobal(); - static void InitializeContext(); // INSTANCE variables / methods @@ -47,13 +47,13 @@ class LockMasterImpl { std::set objectsToLock; // Mutexes locked by this LockMaster on construction and unlocked on destruction - std::vector GetMutexes(int useCountDelta); + std::vector> GetMutexes(int useCountDelta); void Register(); void Unregister(); public: static LockMasterImpl *CurrentLockMasterImpl() { - return (LockMasterImpl *)uv_key_get(¤tLockMasterKey); + return (LockMasterImpl *)currentLockMaster; } LockMasterImpl() { @@ -74,30 +74,22 @@ class LockMasterImpl { }; std::map LockMasterImpl::mutexes; -uv_mutex_t LockMasterImpl::mapMutex; -uv_key_t LockMasterImpl::currentLockMasterKey; - -void LockMasterImpl::InitializeGlobal() { - uv_mutex_init(&mapMutex); - uv_key_create(¤tLockMasterKey); -} +std::mutex LockMasterImpl::mapMutex; +thread_local LockMasterImpl* LockMasterImpl::currentLockMaster = NULL; void LockMasterImpl::InitializeContext() { Nan::AddGCEpilogueCallback(CleanupMutexes); } NAN_GC_CALLBACK(LockMasterImpl::CleanupMutexes) { - uv_mutex_lock(&mapMutex); + std::lock_guard lock(mapMutex); for (auto it = mutexes.begin(); it != mutexes.end(); ) { - uv_mutex_t *mutex = it->second.mutex; - unsigned useCount = it->second.useCount; // if the mutex is not used by any LockMasters, // we can destroy it + unsigned useCount = it->second.useCount; if (!useCount) { - uv_mutex_destroy(mutex); - free(mutex); auto to_erase = it; it++; mutexes.erase(to_erase); @@ -105,35 +97,27 @@ NAN_GC_CALLBACK(LockMasterImpl::CleanupMutexes) { it++; } } - - uv_mutex_unlock(&mapMutex); -} - -void LockMaster::InitializeGlobal() { - LockMasterImpl::InitializeGlobal(); } void LockMaster::InitializeContext() { LockMasterImpl::InitializeContext(); } -std::vector LockMasterImpl::GetMutexes(int useCountDelta) { - std::vector objectMutexes; - - uv_mutex_lock(&mapMutex); +std::vector> LockMasterImpl::GetMutexes(int useCountDelta) { + std::vector> objectMutexes; + std::lock_guard lock(mapMutex); for (auto object : objectsToLock) { - if(object) { + if (object) { // ensure we have an initialized mutex for each object auto mutexIt = mutexes.find(object); - if(mutexIt == mutexes.end()) { + if (mutexIt == mutexes.end()) { mutexIt = mutexes.insert( std::make_pair( object, - ObjectInfo((uv_mutex_t *)malloc(sizeof(uv_mutex_t)), 0U) + ObjectInfo(0U) ) ).first; - uv_mutex_init(mutexIt->second.mutex); } objectMutexes.push_back(mutexIt->second.mutex); @@ -141,61 +125,66 @@ std::vector LockMasterImpl::GetMutexes(int useCountDelta) { } } - uv_mutex_unlock(&mapMutex); - return objectMutexes; } void LockMasterImpl::Register() { - uv_key_set(¤tLockMasterKey, this); + currentLockMaster = this; } void LockMasterImpl::Unregister() { - uv_key_set(¤tLockMasterKey, NULL); + currentLockMaster = NULL; } void LockMasterImpl::Lock(bool acquireMutexes) { - std::vector objectMutexes = GetMutexes(acquireMutexes * 1); + std::vector> objectMutexes = GetMutexes(acquireMutexes * 1); auto alreadyLocked = objectMutexes.end(); + std::vector>::iterator it; // we will attempt to lock all the mutexes at the same time to avoid deadlocks // note in most cases we are locking 0 or 1 mutexes. more than 1 implies // passing objects with different repos/owners in the same call. - std::vector::iterator it; do { // go through all the mutexes and try to lock them - for(it = objectMutexes.begin(); it != objectMutexes.end(); it++) { - // if we already locked this mutex in a previous pass via uv_mutex_lock, + for (it = objectMutexes.begin(); it != objectMutexes.end(); it++) { + // if we already locked this mutex in a previous pass via std::mutex::lock, // we don't need to lock it again if (it == alreadyLocked) { continue; } + // first, try to lock (non-blocking) - bool failure = uv_mutex_trylock(*it); - if(failure) { + bool success = (*it)->try_lock(); + if (!success) { // we have failed to lock a mutex... unlock everything we have locked - std::for_each(objectMutexes.begin(), it, uv_mutex_unlock); + std::for_each(objectMutexes.begin(), it, [](std::shared_ptr mutex) { + mutex->unlock(); + }); + if (alreadyLocked > it && alreadyLocked != objectMutexes.end()) { - uv_mutex_unlock(*alreadyLocked); + (*alreadyLocked)->unlock(); } + // now do a blocking lock on what we couldn't lock - uv_mutex_lock(*it); + (*it)->lock(); // mark that we have already locked this one // if there are more mutexes than this one, we will go back to locking everything alreadyLocked = it; break; } } - } while(it != objectMutexes.end()); + } while (it != objectMutexes.end()); } void LockMasterImpl::Unlock(bool releaseMutexes) { // Get the mutexes but don't decrement their use count until after we've // unlocked them all. - std::vector objectMutexes = GetMutexes(0); + std::vector> objectMutexes = GetMutexes(0); - std::for_each(objectMutexes.begin(), objectMutexes.end(), uv_mutex_unlock); + std::for_each(objectMutexes.begin(), objectMutexes.end(), [](std::shared_ptr mutex) { + mutex->unlock(); + }); GetMutexes(releaseMutexes * -1); } @@ -222,7 +211,7 @@ void LockMaster::ObjectsToLockAdded() { void LockMaster::TemporaryUnlock::ConstructorImpl() { impl = LockMasterImpl::CurrentLockMasterImpl(); - if(impl) { + if (impl) { impl->Unlock(false); } } diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 3d742adb6..5d16fa3bb 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -84,8 +84,6 @@ NAN_MODULE_INIT(init) { init_ssh2(); // Initialize libgit2. git_libgit2_init(); - - LockMaster::InitializeGlobal(); }); } From 67d77d917d87341f95f67d46a8157dd417e38061 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 17 Aug 2020 16:59:42 -0700 Subject: [PATCH 215/545] Get rid of unnecessary libuv in thread pool --- generate/templates/manual/include/semaphore.h | 20 +++++ .../templates/manual/include/thread_pool.h | 29 +++++-- generate/templates/manual/src/semaphore.cc | 17 +++++ generate/templates/manual/src/thread_pool.cc | 75 +++++++++---------- generate/templates/templates/binding.gyp | 1 + generate/templates/templates/nodegit.js | 2 +- 6 files changed, 96 insertions(+), 48 deletions(-) create mode 100644 generate/templates/manual/include/semaphore.h create mode 100644 generate/templates/manual/src/semaphore.cc diff --git a/generate/templates/manual/include/semaphore.h b/generate/templates/manual/include/semaphore.h new file mode 100644 index 000000000..02f1df446 --- /dev/null +++ b/generate/templates/manual/include/semaphore.h @@ -0,0 +1,20 @@ +#ifndef NODEGIT_SEMAPHORE +#define NODEGIT_SEMAPHORE + +#include +#include + +class Semaphore { +public: + Semaphore(); + + void post(); + void wait(); + +private: + std::mutex mutex; + std::condition_variable condition; + unsigned long count; +}; + +#endif diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 8a346028d..12a3ebe3c 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -2,7 +2,11 @@ #define THREAD_POOL_H #include +#include #include +#include + +#include "./semaphore.h" class ThreadPool { public: @@ -15,8 +19,12 @@ class ThreadPool { void *data; Work(Callback workCallback, Callback completionCallback, void *data) - : workCallback(workCallback), completionCallback(completionCallback), data(data) { - } + : workCallback(workCallback), completionCallback(completionCallback), data(data) + {} + + Work() + : workCallback(NULL), completionCallback(NULL), data(NULL) + {} }; struct LoopCallback { @@ -25,22 +33,27 @@ class ThreadPool { bool isWork; LoopCallback(Callback callback, void *data, bool isWork) - : callback(callback), data(data), isWork(isWork) { - } + : callback(callback), data(data), isWork(isWork) + {} + + LoopCallback() + : callback(NULL), data(NULL), isWork(false) + {} }; // work to be performed on the threadpool std::queue workQueue; - uv_mutex_t workMutex; - uv_sem_t workSemaphore; + std::mutex workMutex; + Semaphore workSemaphore; int workInProgressCount; // completion and async callbacks to be performed on the loop std::queue loopQueue; - uv_mutex_t loopMutex; + std::mutex loopMutex; uv_async_t loopAsync; - static void RunEventQueue(void *threadPool); + std::vector threads; + void RunEventQueue(); static void RunLoopCallbacks(uv_async_t* handle); void RunLoopCallbacks(); diff --git a/generate/templates/manual/src/semaphore.cc b/generate/templates/manual/src/semaphore.cc new file mode 100644 index 000000000..8185ba774 --- /dev/null +++ b/generate/templates/manual/src/semaphore.cc @@ -0,0 +1,17 @@ +#include "../include/semaphore.h" + +Semaphore::Semaphore() + : count(0) +{} + +void Semaphore::post() { + std::lock_guard lock(mutex); + ++count; + condition.notify_one(); +} + +void Semaphore::wait() { + std::unique_lock lock(mutex); + while (!count) condition.wait(lock); + --count; +} diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index ef7a4528d..c7a716e7f 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -1,37 +1,35 @@ #include #include "../include/thread_pool.h" -ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) { - uv_mutex_init(&workMutex); - uv_sem_init(&workSemaphore, 0); - +ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) +{ uv_async_init(loop, &loopAsync, RunLoopCallbacks); loopAsync.data = this; uv_unref((uv_handle_t *)&loopAsync); - uv_mutex_init(&loopMutex); workInProgressCount = 0; - for(int i=0; i lock(workMutex); + // there is work on the thread pool - reference the handle so + // node doesn't terminate + uv_ref((uv_handle_t *)&loopAsync); + workQueue.push(Work(workCallback, completionCallback, data)); + workInProgressCount++; + } + workSemaphore.post(); } void ThreadPool::QueueLoopCallback(Callback callback, void *data, bool isWork) { // push the callback into the queue - uv_mutex_lock(&loopMutex); + std::lock_guard lock(loopMutex); LoopCallback loopCallback(callback, data, isWork); bool queueWasEmpty = loopQueue.empty(); loopQueue.push(loopCallback); @@ -40,26 +38,23 @@ void ThreadPool::QueueLoopCallback(Callback callback, void *data, bool isWork) { if (queueWasEmpty) { uv_async_send(&loopAsync); } - uv_mutex_unlock(&loopMutex); } void ThreadPool::ExecuteReverseCallback(Callback reverseCallback, void *data) { QueueLoopCallback(reverseCallback, data, false); } -void ThreadPool::RunEventQueue(void *threadPool) { - static_cast(threadPool)->RunEventQueue(); -} - void ThreadPool::RunEventQueue() { for ( ; ; ) { // wait until there is work to do - uv_sem_wait(&workSemaphore); - uv_mutex_lock(&workMutex); - // the semaphore should guarantee that queue is not empty - Work work = workQueue.front(); - workQueue.pop(); - uv_mutex_unlock(&workMutex); + workSemaphore.wait(); + Work work; + { + std::lock_guard lock(workMutex); + // the semaphore should guarantee that queue is not empty + work = workQueue.front(); + workQueue.pop(); + } // perform the queued work (*work.workCallback)(work.data); @@ -77,30 +72,32 @@ void ThreadPool::RunLoopCallbacks() { Nan::HandleScope scope; v8::Local context = Nan::GetCurrentContext(); node::CallbackScope callbackScope(context->GetIsolate(), Nan::New(), {0, 0}); - // get the next callback to run - uv_mutex_lock(&loopMutex); - LoopCallback loopCallback = loopQueue.front(); - uv_mutex_unlock(&loopMutex); + LoopCallback loopCallback; + { + std::lock_guard lock(loopMutex); + // get the next callback to run + loopCallback = loopQueue.front(); + } // perform the queued loop callback (*loopCallback.callback)(loopCallback.data); // pop the queue, and if necessary, re-trigger RunLoopCallbacks - uv_mutex_lock(&loopMutex); - loopQueue.pop(); - if (!loopQueue.empty()) { - uv_async_send(&loopAsync); + { + std::lock_guard lock(loopMutex); + loopQueue.pop(); + if (!loopQueue.empty()) { + uv_async_send(&loopAsync); + } } - uv_mutex_unlock(&loopMutex); // if there is no ongoing work / completion processing, node doesn't need // to be prevented from terminating if (loopCallback.isWork) { - uv_mutex_lock(&workMutex); + std::lock_guard lock(workMutex); workInProgressCount --; if(!workInProgressCount) { uv_unref((uv_handle_t *)&loopAsync); } - uv_mutex_unlock(&workMutex); } } diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 1b23ed2fd..52620e4bb 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -59,6 +59,7 @@ "src/convenient_hunk.cc", "src/filter_registry.cc", "src/git_buf_converter.cc", + "src/semaphore.cc", "src/str_array_converter.cc", "src/thread_pool.cc", {% each %} diff --git a/generate/templates/templates/nodegit.js b/generate/templates/templates/nodegit.js index a580b4df7..00c8ca992 100644 --- a/generate/templates/templates/nodegit.js +++ b/generate/templates/templates/nodegit.js @@ -5,7 +5,7 @@ var worker = require("worker_threads"); var rawApi; if (!worker.isMainThread || typeof importScripts === "function") { - throw new Error("NodeGit is currently not safe to run in a worker thread or web worker"); + throw new Error("NodeGit is currently not safe to run in a worker thread or web worker"); // jshint ignore:line } // Attempt to load the production release first, if it fails fall back to the From 88711bf02855e85466935e11b1497fdff479b2f6 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 17 Aug 2020 17:11:46 -0700 Subject: [PATCH 216/545] Fix jshint --- generate/templates/templates/nodegit.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/generate/templates/templates/nodegit.js b/generate/templates/templates/nodegit.js index 00c8ca992..8009150ef 100644 --- a/generate/templates/templates/nodegit.js +++ b/generate/templates/templates/nodegit.js @@ -1,10 +1,14 @@ var _ = require("lodash"); var util = require("util"); -var worker = require("worker_threads"); +var worker; + +try { + worker = require("worker_threads"); +} catch (e) {} var rawApi; -if (!worker.isMainThread || typeof importScripts === "function") { +if (worker && (!worker.isMainThread || typeof importScripts === "function")) { throw new Error("NodeGit is currently not safe to run in a worker thread or web worker"); // jshint ignore:line } From deb1430acaba85531fe284315e799c1a40bca0fd Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Aug 2020 14:15:57 -0700 Subject: [PATCH 217/545] Rewrite thread pool for context awareness --- generate/templates/manual/clone/clone.cc | 46 +- .../manual/commit/extract_signature.cc | 33 +- generate/templates/manual/filter_list/load.cc | 31 +- .../templates/manual/filter_source/repo.cc | 24 +- .../templates/manual/include/async_baton.h | 142 ++-- .../include/async_libgit2_queue_worker.h | 33 - .../templates/manual/include/async_worker.h | 18 + generate/templates/manual/include/context.h | 43 ++ .../manual/include/convenient_hunk.h | 10 +- .../manual/include/convenient_patch.h | 10 +- .../manual/include/filter_registry.h | 23 +- .../templates/manual/include/lock_master.h | 279 ++++---- generate/templates/manual/include/nodegit.h | 4 - .../manual/include/nodegit_wrapper.h | 6 +- .../manual/include/promise_completion.h | 18 +- generate/templates/manual/include/semaphore.h | 20 - .../templates/manual/include/thread_pool.h | 93 +-- generate/templates/manual/include/wrapper.h | 5 +- .../manual/patches/convenient_patches.cc | 71 +- generate/templates/manual/remote/ls.cc | 49 +- .../manual/repository/get_references.cc | 9 +- .../manual/repository/get_remotes.cc | 10 +- .../manual/repository/get_submodules.cc | 10 +- .../manual/repository/refresh_references.cc | 10 +- .../templates/manual/revwalk/commit_walk.cc | 8 +- .../templates/manual/revwalk/fast_walk.cc | 8 +- .../manual/revwalk/file_history_walk.cc | 8 +- generate/templates/manual/src/async_baton.cc | 68 +- generate/templates/manual/src/async_worker.cc | 11 + generate/templates/manual/src/context.cc | 42 ++ .../templates/manual/src/convenient_hunk.cc | 45 +- .../templates/manual/src/convenient_patch.cc | 63 +- .../templates/manual/src/filter_registry.cc | 42 +- generate/templates/manual/src/lock_master.cc | 357 +++++----- .../templates/manual/src/nodegit_wrapper.cc | 13 +- .../manual/src/promise_completion.cc | 47 +- .../templates/manual/src/reference_counter.cc | 4 +- generate/templates/manual/src/semaphore.cc | 17 - generate/templates/manual/src/thread_pool.cc | 628 +++++++++++++++--- generate/templates/manual/src/wrapper.cc | 20 +- generate/templates/partials/async_function.cc | 31 +- .../templates/partials/callback_helpers.cc | 6 +- .../templates/partials/field_accessors.cc | 13 +- generate/templates/partials/sync_function.cc | 2 +- generate/templates/partials/traits.h | 1 + generate/templates/templates/binding.gyp | 9 +- generate/templates/templates/class_content.cc | 25 +- generate/templates/templates/class_header.h | 27 +- generate/templates/templates/nodegit.cc | 24 +- .../templates/templates/struct_content.cc | 13 +- generate/templates/templates/struct_header.h | 16 +- 51 files changed, 1607 insertions(+), 938 deletions(-) delete mode 100644 generate/templates/manual/include/async_libgit2_queue_worker.h create mode 100644 generate/templates/manual/include/async_worker.h create mode 100644 generate/templates/manual/include/context.h delete mode 100644 generate/templates/manual/include/semaphore.h create mode 100644 generate/templates/manual/src/async_worker.cc create mode 100644 generate/templates/manual/src/context.cc delete mode 100644 generate/templates/manual/src/semaphore.cc diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index a7ac262dc..9541f05f3 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -86,36 +86,42 @@ NAN_METHOD(GitClone::Clone) { if (!info[2]->IsUndefined() && !info[2]->IsNull()) worker->SaveToPersistent("options", Nan::To(info[2]).ToLocalChecked()); - AsyncLibgit2QueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitClone::CloneWorker::AcquireLocks() { + nodegit::LockMaster lockMaster( + true, + baton->url, + baton->local_path, + baton->options + ); + return lockMaster; +} + void GitClone::CloneWorker::Execute() { git_error_clear(); - { - LockMaster lockMaster( - /*asyncAction: */ true, baton->url, baton->local_path, baton->options); - - git_repository *repo; - int result = - git_clone(&repo, baton->url, baton->local_path, baton->options); + git_repository *repo; + int result = + git_clone(&repo, baton->url, baton->local_path, baton->options); - if (result == GIT_OK) { - // This is required to clean up after the clone to avoid file locking - // issues in Windows and potentially other issues we don't know about. - git_repository_free(repo); + if (result == GIT_OK) { + // This is required to clean up after the clone to avoid file locking + // issues in Windows and potentially other issues we don't know about. + git_repository_free(repo); - // We want to provide a valid repository object, so reopen the repository - // after clone and cleanup. - result = git_repository_open(&baton->out, baton->local_path); - } + // We want to provide a valid repository object, so reopen the repository + // after clone and cleanup. + result = git_repository_open(&baton->out, baton->local_path); + } - baton->error_code = result; + baton->error_code = result; - if (result != GIT_OK && git_error_last() != NULL) { - baton->error = git_error_dup(git_error_last()); - } + if (result != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index e96d0cc7f..5c66cbe3f 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -67,31 +67,30 @@ NAN_METHOD(GitCommit::ExtractSignature) ExtractSignatureWorker *worker = new ExtractSignatureWorker(baton, callback); worker->SaveToPersistent("repo", Nan::To(info[0]).ToLocalChecked()); worker->SaveToPersistent("commit_id", Nan::To(info[1]).ToLocalChecked()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitCommit::ExtractSignatureWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + void GitCommit::ExtractSignatureWorker::Execute() { git_error_clear(); - { - LockMaster lockMaster( - /*asyncAction: */true, - baton->repo - ); + baton->error_code = git_commit_extract_signature( + &baton->signature, + &baton->signed_data, + baton->repo, + baton->commit_id, + (const char *)baton->field + ); - baton->error_code = git_commit_extract_signature( - &baton->signature, - &baton->signed_data, - baton->repo, - baton->commit_id, - (const char *)baton->field - ); - - if (baton->error_code != GIT_OK && git_error_last() != NULL) { - baton->error = git_error_dup(git_error_last()); - } + if (baton->error_code != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index fd02a44e6..0107dfb81 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -103,25 +103,31 @@ NAN_METHOD(GitFilterList::Load) { if (!info[4]->IsUndefined() && !info[4]->IsNull()) worker->SaveToPersistent("flags", Nan::To(info[4]).ToLocalChecked()); - AsyncLibgit2QueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitFilterList::LoadWorker::AcquireLocks() { + nodegit::LockMaster lockMaster( + true, + baton->repo, + baton->blob, + baton->path + ); + return lockMaster; +} + void GitFilterList::LoadWorker::Execute() { git_error_clear(); - { - LockMaster lockMaster( - /*asyncAction: */ true, baton->repo, baton->blob, baton->path); + int result = git_filter_list_load(&baton->filters, baton->repo, baton->blob, + baton->path, baton->mode, baton->flags); - int result = git_filter_list_load(&baton->filters, baton->repo, baton->blob, - baton->path, baton->mode, baton->flags); + baton->error_code = result; - baton->error_code = result; - - if (result != GIT_OK && git_error_last() != NULL) { - baton->error = git_error_dup(git_error_last()); - } + if (result != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } @@ -133,7 +139,8 @@ void GitFilterList::LoadWorker::HandleOKCallback() { if (baton->filters != NULL) { // GitFilterList baton->filters v8::Local owners = Nan::New(0); - v8::Local filterRegistry = Nan::New(GitFilterRegistry::persistentHandle); + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + v8::Local filterRegistry = nodegitContext->GetFromPersistent("FilterRegistry").As(); v8::Local propertyNames = Nan::GetPropertyNames(filterRegistry).ToLocalChecked(); Nan::Set( diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index 57c2a07f7..96d2d5e0b 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -23,24 +23,26 @@ NAN_METHOD(GitFilterSource::Repo) { worker->SaveToPersistent("src", info.This()); - AsyncLibgit2QueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitFilterSource::RepoWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->src); + return lockMaster; +} + void GitFilterSource::RepoWorker::Execute() { git_error_clear(); - { - LockMaster lockMaster(true, baton->src); - - git_repository *repo = git_filter_source_repo(baton->src); - baton->error_code = git_repository_open(&repo, git_repository_path(repo)); + git_repository *repo = git_filter_source_repo(baton->src); + baton->error_code = git_repository_open(&repo, git_repository_path(repo)); - if (baton->error_code == GIT_OK) { - baton->out = repo; - } else if (git_error_last() != NULL) { - baton->error = git_error_dup(git_error_last()); - } + if (baton->error_code == GIT_OK) { + baton->out = repo; + } else if (git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/include/async_baton.h b/generate/templates/manual/include/async_baton.h index f8373cd0d..b9df1cfec 100644 --- a/generate/templates/manual/include/async_baton.h +++ b/generate/templates/manual/include/async_baton.h @@ -1,97 +1,71 @@ #ifndef ASYNC_BATON #define ASYNC_BATON -#include +#include +#include +#include #include #include "lock_master.h" #include "nodegit.h" +#include "thread_pool.h" -// Base class for Batons used for callbacks (for example, -// JS functions passed as callback parameters, -// or field properties of configuration objects whose values are callbacks) -struct AsyncBaton { - uv_sem_t semaphore; - - virtual ~AsyncBaton() {} -}; - -void deleteBaton(AsyncBaton *baton); - -template -struct AsyncBatonWithResult : public AsyncBaton { - ResultT result; - ResultT defaultResult; // result returned if the callback doesn't return anything valid - void (*onCompletion)(AsyncBaton *); - - AsyncBatonWithResult(const ResultT &defaultResult) - : defaultResult(defaultResult) { - } - - void Done() { - if (onCompletion) { - onCompletion(this); - } else { - // signal completion - uv_sem_post(&semaphore); - } - } - - ResultT ExecuteAsync(ThreadPool::Callback asyncCallback, void (*onCompletion)(AsyncBaton *) = NULL) { - result = 0; - this->onCompletion = onCompletion; - if (!onCompletion) { - uv_sem_init(&semaphore, 0); - } - - { - LockMaster::TemporaryUnlock temporaryUnlock; - - libgit2ThreadPool.ExecuteReverseCallback(asyncCallback, this); - - if (!onCompletion) { - // wait for completion - uv_sem_wait(&semaphore); - uv_sem_destroy(&semaphore); +namespace nodegit { + // Base class for Batons used for callbacks (for example, + // JS functions passed as callback parameters, + // or field properties of configuration objects whose values are callbacks) + class AsyncBaton { + public: + typedef std::function AsyncCallback; + typedef std::function CompletionCallback; + + AsyncBaton(); + + virtual ~AsyncBaton() {} + + void Done(); + + Nan::AsyncResource *GetAsyncResource(); + + protected: + void ExecuteAsyncPerform(AsyncCallback asyncCallback, CompletionCallback onCompletion); + + private: + void SignalCompletion(); + void WaitForCompletion(); + + Nan::AsyncResource *asyncResource; + ThreadPool::Callback onCompletion; + std::unique_ptr completedMutex; + std::condition_variable completedCondition; + bool hasCompleted; + }; + + void deleteBaton(AsyncBaton *baton); + + template + class AsyncBatonWithResult : public AsyncBaton { + public: + ResultT defaultResult; // result returned if the callback doesn't return anything valid + ResultT result; + + AsyncBatonWithResult(const ResultT &defaultResult) + : defaultResult(defaultResult) { } - } - - return result; - } -}; - -struct AsyncBatonWithNoResult : public AsyncBaton { - void (*onCompletion)(AsyncBaton *); - - void Done() { - if (onCompletion) { - onCompletion(this); - } else { - // signal completion - uv_sem_post(&semaphore); - } - } - - void ExecuteAsync(ThreadPool::Callback asyncCallback, void (*onCompletion)(AsyncBaton *) = NULL) { - this->onCompletion = onCompletion; - if (!onCompletion) { - uv_sem_init(&semaphore, 0); - } - - { - LockMaster::TemporaryUnlock temporaryUnlock; - - libgit2ThreadPool.ExecuteReverseCallback(asyncCallback, this); - - if (!onCompletion) { - // wait for completion - uv_sem_wait(&semaphore); - uv_sem_destroy(&semaphore); + + ResultT ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::CompletionCallback onCompletion = nullptr) { + result = 0; + ExecuteAsyncPerform(asyncCallback, onCompletion); + return result; } - } + }; - return; - } -}; + class AsyncBatonWithNoResult : public AsyncBaton { + public: + void ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::CompletionCallback onCompletion = nullptr) { + ExecuteAsyncPerform(asyncCallback, onCompletion); + } + }; +} #endif diff --git a/generate/templates/manual/include/async_libgit2_queue_worker.h b/generate/templates/manual/include/async_libgit2_queue_worker.h deleted file mode 100644 index f3ddf2fb3..000000000 --- a/generate/templates/manual/include/async_libgit2_queue_worker.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef ASYNC_LIBGIT2_QUEUE_WORKER_H -#define ASYNC_LIBGIT2_QUEUE_WORKER_H - -#include -#include -#include "../include/thread_pool.h" -#include "../include/nodegit.h" - - -// Runs WorkComplete of the scheduled AsyncWorker, -// and destroys it. This is run in the uv_default_loop event loop. -NAN_INLINE void AsyncLibgit2Complete (void* data) { - Nan::AsyncWorker *worker = static_cast(data); - worker->WorkComplete(); - worker->Destroy(); -} - -// Runs Execute of the scheduled AyncWorker on the dedicated libgit2 thread / -// event loop, and schedules the WorkComplete callback to run on the -// uv_default_loop event loop -NAN_INLINE void AsyncLibgit2Execute (void *vworker) { - // execute the worker - Nan::AsyncWorker *worker = static_cast(vworker); - worker->Execute(); -} - -// Schedules the AsyncWorker to run on the dedicated libgit2 thread / event loop, -// and on completion AsyncLibgit2Complete on the default loop -NAN_INLINE void AsyncLibgit2QueueWorker (Nan::AsyncWorker* worker) { - libgit2ThreadPool.QueueWork(AsyncLibgit2Execute, AsyncLibgit2Complete, worker); -} - -#endif diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h new file mode 100644 index 000000000..fc10893e6 --- /dev/null +++ b/generate/templates/manual/include/async_worker.h @@ -0,0 +1,18 @@ +#ifndef NODEGIT_ASYNC_WORKER +#define NODEGIT_ASYNC_WORKER + +#include +#include "lock_master.h" + +namespace nodegit { + class AsyncWorker : public Nan::AsyncWorker { + public: + AsyncWorker(Nan::Callback *callback, const char *resourceName); + + virtual nodegit::LockMaster AcquireLocks() = 0; + + Nan::AsyncResource *GetAsyncResource(); + }; +} + +#endif diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h new file mode 100644 index 000000000..8b2ef66be --- /dev/null +++ b/generate/templates/manual/include/context.h @@ -0,0 +1,43 @@ +#ifndef NODEGIT_CONTEXT +#define NODEGIT_CONTEXT + +#include +#include +#include +#include +#include + +#include "async_worker.h" +#include "thread_pool.h" + +namespace nodegit { + class Context { + public: + Context(v8::Isolate *isolate); + + void QueueWorker(nodegit::AsyncWorker *worker); + + void SaveToPersistent(std::string key, const v8::Local &value); + + v8::Local GetFromPersistent(std::string key); + + static Context *GetCurrentContext(); + + ~Context(); + + private: + v8::Isolate *isolate; + + ThreadPool threadPool; + + // This map contains persistent handles that need to be cleaned up + // after the context has been torn down. + // Often this is used as a context-aware storage cell for `*::InitializeComponent` + // to store function templates on them. + Nan::Persistent persistentStorage; + + static std::map contexts; + }; +} + +#endif diff --git a/generate/templates/manual/include/convenient_hunk.h b/generate/templates/manual/include/convenient_hunk.h index 37e9ab111..3953a4680 100644 --- a/generate/templates/manual/include/convenient_hunk.h +++ b/generate/templates/manual/include/convenient_hunk.h @@ -5,6 +5,8 @@ #include #include "async_baton.h" +#include "async_worker.h" +#include "lock_master.h" #include "promise_completion.h" extern "C" { @@ -26,8 +28,7 @@ using namespace v8; class ConvenientHunk : public Nan::ObjectWrap { public: - static Nan::Persistent constructor_template; - static void InitializeComponent (v8::Local target); + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); static v8::Local New(void *raw); @@ -55,16 +56,17 @@ class ConvenientHunk : public Nan::ObjectWrap { HunkData *hunk; std::vector *lines; }; - class LinesWorker : public Nan::AsyncWorker { + class LinesWorker : public nodegit::AsyncWorker { public: LinesWorker( LinesBaton *_baton, Nan::Callback *callback - ) : Nan::AsyncWorker(callback) + ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:ConvenientHunk:Lines") , baton(_baton) {}; ~LinesWorker() {}; void Execute(); void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); private: LinesBaton *baton; diff --git a/generate/templates/manual/include/convenient_patch.h b/generate/templates/manual/include/convenient_patch.h index 9d6921ef8..ea8dcf95d 100644 --- a/generate/templates/manual/include/convenient_patch.h +++ b/generate/templates/manual/include/convenient_patch.h @@ -5,6 +5,8 @@ #include #include "async_baton.h" +#include "async_worker.h" +#include "lock_master.h" #include "promise_completion.h" extern "C" { @@ -37,8 +39,7 @@ using namespace v8; class ConvenientPatch : public Nan::ObjectWrap { public: - static Nan::Persistent constructor_template; - static void InitializeComponent (v8::Local target); + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); static v8::Local New(void *raw); @@ -67,16 +68,17 @@ class ConvenientPatch : public Nan::ObjectWrap { PatchData *patch; std::vector *hunks; }; - class HunksWorker : public Nan::AsyncWorker { + class HunksWorker : public nodegit::AsyncWorker { public: HunksWorker( HunksBaton *_baton, Nan::Callback *callback - ) : Nan::AsyncWorker(callback) + ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:ConvenientPatch:Hunks") , baton(_baton) {}; ~HunksWorker() {}; void Execute(); void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); private: HunksBaton *baton; diff --git a/generate/templates/manual/include/filter_registry.h b/generate/templates/manual/include/filter_registry.h index b75938218..cefcbcaed 100644 --- a/generate/templates/manual/include/filter_registry.h +++ b/generate/templates/manual/include/filter_registry.h @@ -6,6 +6,9 @@ #include #include "async_baton.h" +#include "async_worker.h" +#include "context.h" +#include "lock_master.h" #include "nodegit_wrapper.h" #include "promise_completion.h" @@ -23,12 +26,10 @@ using namespace v8; class GitFilterRegistry : public Nan::ObjectWrap { public: - static void InitializeComponent(v8::Local target); - - static Nan::Persistent persistentHandle; + static void InitializeComponent(v8::Local target, nodegit::Context *nodegitContext); private: - + static NAN_METHOD(GitFilterRegister); static NAN_METHOD(GitFilterUnregister); @@ -47,25 +48,27 @@ class GitFilterRegistry : public Nan::ObjectWrap { int error_code; }; - class RegisterWorker : public Nan::AsyncWorker { + class RegisterWorker : public nodegit::AsyncWorker { public: - RegisterWorker(FilterRegisterBaton *_baton, Nan::Callback *callback) - : Nan::AsyncWorker(callback), baton(_baton) {}; + RegisterWorker(FilterRegisterBaton *_baton, Nan::Callback *callback) + : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Register"), baton(_baton) {}; ~RegisterWorker() {}; void Execute(); void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); private: FilterRegisterBaton *baton; }; - class UnregisterWorker : public Nan::AsyncWorker { + class UnregisterWorker : public nodegit::AsyncWorker { public: - UnregisterWorker(FilterUnregisterBaton *_baton, Nan::Callback *callback) - : Nan::AsyncWorker(callback), baton(_baton) {}; + UnregisterWorker(FilterUnregisterBaton *_baton, Nan::Callback *callback) + : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Unregister"), baton(_baton) {}; ~UnregisterWorker() {}; void Execute(); void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); private: FilterUnregisterBaton *baton; diff --git a/generate/templates/manual/include/lock_master.h b/generate/templates/manual/include/lock_master.h index 911760bd8..54ca0e64a 100644 --- a/generate/templates/manual/include/lock_master.h +++ b/generate/templates/manual/include/lock_master.h @@ -3,165 +3,176 @@ #include -class LockMasterImpl; +namespace nodegit { + class LockMasterImpl; -class LockMaster { -private: - LockMasterImpl *impl; - - template - void AddLocks(const T *t) { - // by default, don't lock anything - } - - // base case for variadic template unwinding - void AddParameters() { - } + class LockMaster { + private: + LockMasterImpl *impl; - // processes a single parameter, then calls recursively on the rest - template - void AddParameters(const T *t, const Types*... args) { - if(t) { - AddLocks(t); + template + void AddLocks(const T *t) { + // by default, don't lock anything } - AddParameters(args...); - } - void ConstructorImpl(); - void DestructorImpl(); - void ObjectToLock(const void *); - void ObjectsToLockAdded(); -public: - - // we lock on construction - template LockMaster(bool asyncAction, const Types*... types) { - if(!asyncAction) { - impl = NULL; - return; + // base case for variadic template unwinding + void AddParameters() { } - ConstructorImpl(); - AddParameters(types...); - ObjectsToLockAdded(); - } - - // and unlock on destruction - ~LockMaster() { - if(!impl) { - return; + // processes a single parameter, then calls recursively on the rest + template + void AddParameters(const T *t, const Types*... args) { + if(t) { + AddLocks(t); + } + AddParameters(args...); } - DestructorImpl(); - } - - // TemporaryUnlock unlocks the LockMaster currently registered on the thread, - // and re-locks it on destruction. - class TemporaryUnlock { - LockMasterImpl *impl; void ConstructorImpl(); void DestructorImpl(); + void ObjectToLock(const void *); + void ObjectsToLockAdded(); public: - TemporaryUnlock() { - // We can't return here if disabled - // It's possible that a LockMaster was fully constructed and registered - // before the thread safety was disabled. - // So we rely on ConstructorImpl to abort if there is no registered LockMaster + + // we lock on construction + template LockMaster(bool asyncAction, const Types*... types) { + if(!asyncAction) { + impl = nullptr; + return; + } + ConstructorImpl(); + AddParameters(types...); + ObjectsToLockAdded(); } - ~TemporaryUnlock() { + + // we don't want this object to be copyable, there can only be one lock holder + LockMaster(const LockMaster &other) = delete; + + LockMaster &operator=(const LockMaster &other) = delete; + + // expose a move constructor so that LockMaster can be returned + LockMaster(LockMaster &&other); + + LockMaster &operator=(LockMaster &&other); + + // and unlock on destruction + ~LockMaster() { if(!impl) { return; } DestructorImpl(); } - }; - static void InitializeGlobal(); - static void InitializeContext(); -}; + // TemporaryUnlock unlocks the LockMaster currently registered on the thread, + // and re-locks it on destruction. + class TemporaryUnlock { + LockMasterImpl *impl; + + void ConstructorImpl(); + void DestructorImpl(); + public: + TemporaryUnlock() { + // We can't return here if disabled + // It's possible that a LockMaster was fully constructed and registered + // before the thread safety was disabled. + // So we rely on ConstructorImpl to abort if there is no registered LockMaster + ConstructorImpl(); + } + ~TemporaryUnlock() { + if(!impl) { + return; + } + DestructorImpl(); + } + }; + static void InitializeGlobal(); + static void InitializeContext(); + }; -template<> inline void LockMaster::AddLocks(const git_repository *repo) { - // when using a repo, lock the repo - ObjectToLock(repo); -} -template<> inline void LockMaster::AddLocks(const git_index *index) { - // when using an index, lock the repo, or if there isn't one lock the index - const void *owner = git_index_owner(index); - if(!owner) { - owner = index; + template<> inline void LockMaster::AddLocks(const git_repository *repo) { + // when using a repo, lock the repo + ObjectToLock(repo); } - ObjectToLock(owner); -} -template<> inline void LockMaster::AddLocks(const git_commit *commit) { - // when using a commit, lock the repo - const void *owner = git_commit_owner(commit); - ObjectToLock(owner); -} + template<> inline void LockMaster::AddLocks(const git_index *index) { + // when using an index, lock the repo, or if there isn't one lock the index + const void *owner = git_index_owner(index); + if(!owner) { + owner = index; + } + ObjectToLock(owner); + } -// ... more locking rules would go here. According to an analysis of idefs.json, -// the following types are passed as non-const * and may require locking -// (some likely, some probably not): -// 'git_annotated_commit', -// 'git_blame_options', -// 'git_blob', -// 'git_buf', -// 'git_checkout_options', -// 'git_cherrypick_options', -// 'git_clone_options', -// 'git_commit', -// 'git_config', -// 'git_diff', -// 'git_diff_perfdata', -// 'git_error', -// 'git_fetch_options', -// 'git_fetch_options', -// 'git_filter', -// 'git_filter_list', -// 'git_hashsig', -// 'git_index', -// 'git_merge_file_input', -// 'git_merge_options', -// 'git_merge_options', -// 'git_note', -// 'git_note_iterator', -// 'git_object', -// 'git_odb', -// 'git_odb_object', -// 'git_oid', -// 'git_oidarray', -// 'git_packbuilder', -// 'git_patch', -// 'git_pathspec', -// 'git_push_options', -// 'git_rebase', -// 'git_rebase_options', -// 'git_refdb', -// 'git_reference', -// 'git_reflog', -// 'git_remote', -// 'git_remote_callbacks', -// 'git_remote_callbacks', -// 'git_repository', -// 'git_repository_init_options', -// 'git_revwalk', -// 'git_signature', -// 'git_stash_apply_options', -// 'git_status_list', -// 'git_strarray', -// 'git_submodule', -// 'git_submodule_update_options', -// 'git_tag', -// 'git_transfer_progress', -// 'git_transport', -// 'git_tree', -// 'git_treebuilder', -// 'git_writestream' -// -// Other types are always passed as const * and perhaps don't require locking -// (it's not a guarantee though) + template<> inline void LockMaster::AddLocks(const git_commit *commit) { + // when using a commit, lock the repo + const void *owner = git_commit_owner(commit); + ObjectToLock(owner); + } + // ... more locking rules would go here. According to an analysis of idefs.json, + // the following types are passed as non-const * and may require locking + // (some likely, some probably not): + // 'git_annotated_commit', + // 'git_blame_options', + // 'git_blob', + // 'git_buf', + // 'git_checkout_options', + // 'git_cherrypick_options', + // 'git_clone_options', + // 'git_commit', + // 'git_config', + // 'git_diff', + // 'git_diff_perfdata', + // 'git_error', + // 'git_fetch_options', + // 'git_fetch_options', + // 'git_filter', + // 'git_filter_list', + // 'git_hashsig', + // 'git_index', + // 'git_merge_file_input', + // 'git_merge_options', + // 'git_merge_options', + // 'git_note', + // 'git_note_iterator', + // 'git_object', + // 'git_odb', + // 'git_odb_object', + // 'git_oid', + // 'git_oidarray', + // 'git_packbuilder', + // 'git_patch', + // 'git_pathspec', + // 'git_push_options', + // 'git_rebase', + // 'git_rebase_options', + // 'git_refdb', + // 'git_reference', + // 'git_reflog', + // 'git_remote', + // 'git_remote_callbacks', + // 'git_remote_callbacks', + // 'git_repository', + // 'git_repository_init_options', + // 'git_revwalk', + // 'git_signature', + // 'git_stash_apply_options', + // 'git_status_list', + // 'git_strarray', + // 'git_submodule', + // 'git_submodule_update_options', + // 'git_tag', + // 'git_transfer_progress', + // 'git_transport', + // 'git_tree', + // 'git_treebuilder', + // 'git_writestream' + // + // Other types are always passed as const * and perhaps don't require locking + // (it's not a guarantee though) +} #endif diff --git a/generate/templates/manual/include/nodegit.h b/generate/templates/manual/include/nodegit.h index a9cef2950..bab3e4179 100644 --- a/generate/templates/manual/include/nodegit.h +++ b/generate/templates/manual/include/nodegit.h @@ -1,10 +1,6 @@ #ifndef NODEGIT_H #define NODEGIT_H -#include "thread_pool.h" - -extern ThreadPool libgit2ThreadPool; - v8::Local GetPrivate(v8::Local object, v8::Local key); diff --git a/generate/templates/manual/include/nodegit_wrapper.h b/generate/templates/manual/include/nodegit_wrapper.h index c40b7af1d..b48e956d1 100644 --- a/generate/templates/manual/include/nodegit_wrapper.h +++ b/generate/templates/manual/include/nodegit_wrapper.h @@ -37,12 +37,10 @@ class NodeGitWrapper : public Nan::ObjectWrap { // CopyablePersistentTraits are used to get the reset-on-destruct behavior. Nan::Persistent > owner; - static Nan::Persistent constructor_template; - // diagnostic count of self-freeing object instances - static int SelfFreeingInstanceCount; + thread_local static int SelfFreeingInstanceCount; // diagnostic count of constructed non-self-freeing object instances - static int NonSelfFreeingConstructedCount; + thread_local static int NonSelfFreeingConstructedCount; static void InitializeTemplate(v8::Local &tpl); diff --git a/generate/templates/manual/include/promise_completion.h b/generate/templates/manual/include/promise_completion.h index 600fc0617..da933b7de 100644 --- a/generate/templates/manual/include/promise_completion.h +++ b/generate/templates/manual/include/promise_completion.h @@ -4,6 +4,7 @@ #include #include "async_baton.h" +#include "context.h" // PromiseCompletion forwards either the resolved result or the rejection reason // to the native layer, once the promise completes @@ -14,33 +15,28 @@ class PromiseCompletion : public Nan::ObjectWrap { // callback type called when a promise completes - typedef void (*Callback) (bool isFulfilled, AsyncBaton *baton, v8::Local resultOfPromise); + typedef void (*Callback) (bool isFulfilled, nodegit::AsyncBaton *baton, v8::Local resultOfPromise); static NAN_METHOD(New); static NAN_METHOD(PromiseFulfilled); static NAN_METHOD(PromiseRejected); - // persistent handles for NAN_METHODs - static Nan::Persistent newFn; - static Nan::Persistent promiseFulfilled; - static Nan::Persistent promiseRejected; - - static v8::Local Bind(Nan::Persistent &method, v8::Local object); + static v8::Local Bind(v8::Local method, v8::Local object); static void CallCallback(bool isFulfilled, const Nan::FunctionCallbackInfo &info); // callback and baton stored for the promise that this PromiseCompletion is // attached to. when the promise completes, the callback will be called with // the result, and the stored baton. Callback callback; - AsyncBaton *baton; + nodegit::AsyncBaton *baton; - void Setup(v8::Local thenFn, v8::Local result, AsyncBaton *baton, Callback callback); + void Setup(v8::Local thenFn, v8::Local result, nodegit::AsyncBaton *baton, Callback callback); public: // If result is a promise, this will instantiate a new PromiseCompletion // and have it forward the promise result / reason via the baton and callback - static bool ForwardIfPromise(v8::Local result, AsyncBaton *baton, Callback callback); + static bool ForwardIfPromise(v8::Local result, nodegit::AsyncBaton *baton, Callback callback); - static void InitializeComponent(); + static void InitializeComponent(nodegit::Context *nodegitContext); }; #endif diff --git a/generate/templates/manual/include/semaphore.h b/generate/templates/manual/include/semaphore.h deleted file mode 100644 index 02f1df446..000000000 --- a/generate/templates/manual/include/semaphore.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef NODEGIT_SEMAPHORE -#define NODEGIT_SEMAPHORE - -#include -#include - -class Semaphore { -public: - Semaphore(); - - void post(); - void wait(); - -private: - std::mutex mutex; - std::condition_variable condition; - unsigned long count; -}; - -#endif diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 12a3ebe3c..5baf4e743 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -1,76 +1,49 @@ #ifndef THREAD_POOL_H #define THREAD_POOL_H +#include +#include +#include #include -#include -#include -#include -#include "./semaphore.h" +#include "async_worker.h" -class ThreadPool { -public: - typedef void (*Callback) (void *); +namespace nodegit { + class ThreadPoolImpl; -private: - struct Work { - Callback workCallback; - Callback completionCallback; - void *data; + class ThreadPool { + public: + typedef std::function Callback; + typedef std::function QueueCallbackFn; + typedef std::function OnPostCallbackFn; - Work(Callback workCallback, Callback completionCallback, void *data) - : workCallback(workCallback), completionCallback(completionCallback), data(data) - {} + // Initializes thread pool and spins up the requested number of threads + // The provided loop will be used for completion callbacks, whenever + // queued work is completed + ThreadPool(int numberOfThreads, uv_loop_t *loop); - Work() - : workCallback(NULL), completionCallback(NULL), data(NULL) - {} - }; - - struct LoopCallback { - Callback callback; - void *data; - bool isWork; + ~ThreadPool(); - LoopCallback(Callback callback, void *data, bool isWork) - : callback(callback), data(data), isWork(isWork) - {} - - LoopCallback() - : callback(NULL), data(NULL), isWork(false) - {} - }; + // Queues work on the thread pool, followed by completion call scheduled + // on the loop provided in the constructor. + // QueueWork should be called on the loop provided in the constructor. + void QueueWorker(nodegit::AsyncWorker *worker); - // work to be performed on the threadpool - std::queue workQueue; - std::mutex workMutex; - Semaphore workSemaphore; - int workInProgressCount; + // When an AsyncWorker is being executed, the threads involved in executing + // will ensure that this is set to the AsyncResource belonging to the AsyncWorker. + // This ensures that any callbacks from libgit2 take the correct AsyncResource + // when scheduling work on the JS thread. + static Nan::AsyncResource *GetCurrentAsyncResource(); - // completion and async callbacks to be performed on the loop - std::queue loopQueue; - std::mutex loopMutex; - uv_async_t loopAsync; + // Queues a callback on the loop provided in the constructor + static void PostCallbackEvent(OnPostCallbackFn onPostCallback); - std::vector threads; + // Called once at libgit2 initialization to setup contracts with libgit2 + static void InitializeGlobal(); - void RunEventQueue(); - static void RunLoopCallbacks(uv_async_t* handle); - void RunLoopCallbacks(); - - void QueueLoopCallback(Callback callback, void *data, bool isWork); - -public: - // Initializes thread pool and spins up the requested number of threads - // The provided loop will be used for completion callbacks, whenever - // queued work is completed - ThreadPool(int numberOfThreads, uv_loop_t *loop); - // Queues work on the thread pool, followed by completion call scheduled - // on the loop provided in the constructor. - // QueueWork should be called on the loop provided in the constructor. - void QueueWork(Callback workCallback, Callback completionCallback, void *data); - // Queues a callback on the loop provided in the constructor - void ExecuteReverseCallback(Callback reverseCallback, void *data); -}; + private: + std::unique_ptr impl; + }; +} #endif diff --git a/generate/templates/manual/include/wrapper.h b/generate/templates/manual/include/wrapper.h index 9dcbe3186..f24ce800b 100644 --- a/generate/templates/manual/include/wrapper.h +++ b/generate/templates/manual/include/wrapper.h @@ -9,15 +9,14 @@ #include #include "nan.h" +#include "context.h" using namespace node; using namespace v8; class Wrapper : public Nan::ObjectWrap { public: - - static Nan::Persistent constructor_template; - static void InitializeComponent (v8::Local target); + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); void *GetValue(); static v8::Local New(const void *raw); diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index 795dca506..5630de1dc 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -21,57 +21,60 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { worker->SaveToPersistent("diff", info[0]); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitPatch::ConvenientFromDiffWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->diff); + return lockMaster; +} + void GitPatch::ConvenientFromDiffWorker::Execute() { git_error_clear(); - { - LockMaster lockMaster(true, baton->diff); - std::vector patchesToBeFreed; - - for (int i = 0; i < git_diff_num_deltas(baton->diff); ++i) { - git_patch *nextPatch; - int result = git_patch_from_diff(&nextPatch, baton->diff, i); + std::vector patchesToBeFreed; - if (result) { - while (!patchesToBeFreed.empty()) - { - git_patch_free(patchesToBeFreed.back()); - patchesToBeFreed.pop_back(); - } + for (int i = 0; i < git_diff_num_deltas(baton->diff); ++i) { + git_patch *nextPatch; + int result = git_patch_from_diff(&nextPatch, baton->diff, i); - while (!baton->out->empty()) { - PatchDataFree(baton->out->back()); - baton->out->pop_back(); - } - - baton->error_code = result; + if (result) { + while (!patchesToBeFreed.empty()) + { + git_patch_free(patchesToBeFreed.back()); + patchesToBeFreed.pop_back(); + } - if (git_error_last() != NULL) { - baton->error = git_error_dup(git_error_last()); - } + while (!baton->out->empty()) { + PatchDataFree(baton->out->back()); + baton->out->pop_back(); + } - delete baton->out; - baton->out = NULL; + baton->error_code = result; - return; + if (git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); } - if (nextPatch != NULL) { - baton->out->push_back(createFromRaw(nextPatch)); - patchesToBeFreed.push_back(nextPatch); - } + delete baton->out; + baton->out = NULL; + + return; } - while (!patchesToBeFreed.empty()) - { - git_patch_free(patchesToBeFreed.back()); - patchesToBeFreed.pop_back(); + if (nextPatch != NULL) { + baton->out->push_back(createFromRaw(nextPatch)); + patchesToBeFreed.push_back(nextPatch); } } + + while (!patchesToBeFreed.empty()) + { + git_patch_free(patchesToBeFreed.back()); + patchesToBeFreed.pop_back(); + } } void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 8816e0150..f3adfee9f 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -14,41 +14,40 @@ NAN_METHOD(GitRemote::ReferenceList) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); ReferenceListWorker *worker = new ReferenceListWorker(baton, callback); worker->SaveToPersistent("remote", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitRemote::ReferenceListWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->remote); + return lockMaster; +} + void GitRemote::ReferenceListWorker::Execute() { git_error_clear(); - { - LockMaster lockMaster( - /*asyncAction: */true, - baton->remote - ); - - const git_remote_head **remote_heads; - size_t num_remote_heads; - baton->error_code = git_remote_ls( - &remote_heads, - &num_remote_heads, - baton->remote - ); + const git_remote_head **remote_heads; + size_t num_remote_heads; + baton->error_code = git_remote_ls( + &remote_heads, + &num_remote_heads, + baton->remote + ); - if (baton->error_code != GIT_OK) { - baton->error = git_error_dup(git_error_last()); - delete baton->out; - baton->out = NULL; - return; - } + if (baton->error_code != GIT_OK) { + baton->error = git_error_dup(git_error_last()); + delete baton->out; + baton->out = NULL; + return; + } - baton->out->reserve(num_remote_heads); + baton->out->reserve(num_remote_heads); - for (size_t head_index = 0; head_index < num_remote_heads; ++head_index) { - git_remote_head *remote_head = git_remote_head_dup(remote_heads[head_index]); - baton->out->push_back(remote_head); - } + for (size_t head_index = 0; head_index < num_remote_heads; ++head_index) { + git_remote_head *remote_head = git_remote_head_dup(remote_heads[head_index]); + baton->out->push_back(remote_head); } } diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index 8f03d60e1..313f0479b 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -14,15 +14,20 @@ NAN_METHOD(GitRepository::GetReferences) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); GetReferencesWorker *worker = new GetReferencesWorker(baton, callback); worker->SaveToPersistent("repo", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitRepository::GetReferencesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + void GitRepository::GetReferencesWorker::Execute() { giterr_clear(); - LockMaster lockMaster(true, baton->repo); git_repository *repo = baton->repo; git_strarray reference_names; diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 9cad189a2..eb562de9f 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -14,17 +14,23 @@ NAN_METHOD(GitRepository::GetRemotes) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); GetRemotesWorker *worker = new GetRemotesWorker(baton, callback); worker->SaveToPersistent("repo", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitRepository::GetRemotesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + void GitRepository::GetRemotesWorker::Execute() { giterr_clear(); git_repository *repo; { - LockMaster lockMaster(true, baton->repo); + nodegit::LockMaster lockMaster(true, baton->repo); baton->error_code = git_repository_open(&repo, git_repository_workdir(baton->repo)); } diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 71de6948c..425754ad9 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -14,7 +14,8 @@ NAN_METHOD(GitRepository::GetSubmodules) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); GetSubmodulesWorker *worker = new GetSubmodulesWorker(baton, callback); worker->SaveToPersistent("repo", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } @@ -35,12 +36,15 @@ int foreachSubmoduleCB(git_submodule *submodule, const char *name, void *void_pa return result; } +nodegit::LockMaster GitRepository::GetSubmodulesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + void GitRepository::GetSubmodulesWorker::Execute() { giterr_clear(); - LockMaster lockMaster(true, baton->repo); - submodule_foreach_payload payload { baton->repo, baton->out }; baton->error_code = git_submodule_foreach(baton->repo, foreachSubmoduleCB, (void *)&payload); diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 730afadbc..80a783708 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -406,15 +406,21 @@ NAN_METHOD(GitRepository::RefreshReferences) RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback); worker->SaveToPersistent("repo", info.This()); worker->SaveToPersistent("signatureType", signatureType); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitRepository::RefreshReferencesWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->repo); + return lockMaster; +} + void GitRepository::RefreshReferencesWorker::Execute() { giterr_clear(); - LockMaster lockMaster(true, baton->repo); + nodegit::LockMaster lockMaster(true, baton->repo); git_repository *repo = baton->repo; RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; git_odb *odb; diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index bef5bc889..b2486e899 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -145,10 +145,16 @@ NAN_METHOD(GitRevwalk::CommitWalk) { CommitWalkWorker *worker = new CommitWalkWorker(baton, callback); worker->SaveToPersistent("commitWalk", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitRevwalk::CommitWalkWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + void GitRevwalk::CommitWalkWorker::Execute() { giterr_clear(); diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 002251852..72d092eba 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -21,10 +21,16 @@ NAN_METHOD(GitRevwalk::FastWalk) FastWalkWorker *worker = new FastWalkWorker(baton, callback); worker->SaveToPersistent("fastWalk", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitRevwalk::FastWalkWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + void GitRevwalk::FastWalkWorker::Execute() { for (int i = 0; i < baton->max_count; i++) diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index d8d2935df..6ba2e0b33 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -207,10 +207,16 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) FileHistoryWalkWorker *worker = new FileHistoryWalkWorker(baton, callback); worker->SaveToPersistent("fileHistoryWalk", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitRevwalk::FileHistoryWalkWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true); + return lockMaster; +} + void GitRevwalk::FileHistoryWalkWorker::Execute() { git_repository *repo = git_revwalk_repository(baton->walk); diff --git a/generate/templates/manual/src/async_baton.cc b/generate/templates/manual/src/async_baton.cc index 590a19c62..da99b9e26 100644 --- a/generate/templates/manual/src/async_baton.cc +++ b/generate/templates/manual/src/async_baton.cc @@ -1,5 +1,69 @@ #include "../include/async_baton.h" -void deleteBaton(AsyncBaton *baton) { - delete baton; +namespace nodegit { + void deleteBaton(AsyncBaton *baton) { + delete baton; + } + + AsyncBaton::AsyncBaton() + : asyncResource(ThreadPool::GetCurrentAsyncResource()), completedMutex(new std::mutex), hasCompleted(false) + {} + + void AsyncBaton::SignalCompletion() { + std::lock_guard lock(*completedMutex); + hasCompleted = true; + completedCondition.notify_one(); + } + + void AsyncBaton::Done() { + onCompletion(); + } + + Nan::AsyncResource *AsyncBaton::GetAsyncResource() { + return asyncResource; + } + + void AsyncBaton::ExecuteAsyncPerform(AsyncCallback asyncCallback, CompletionCallback onCompletion) { + auto jsCallback = [asyncCallback, this]() { + asyncCallback(this); + }; + + if (onCompletion) { + this->onCompletion = [this, onCompletion]() { + onCompletion(this); + }; + + ThreadPool::PostCallbackEvent( + [this, jsCallback]( + ThreadPool::QueueCallbackFn queueCallback, + ThreadPool::Callback callbackCompleted + ) -> ThreadPool::Callback { + queueCallback(jsCallback); + callbackCompleted(); + + return []() {}; + } + ); + } else { + ThreadPool::PostCallbackEvent( + [this, jsCallback]( + ThreadPool::QueueCallbackFn queueCallback, + ThreadPool::Callback callbackCompleted + ) -> ThreadPool::Callback { + this->onCompletion = callbackCompleted; + + queueCallback(jsCallback); + + return std::bind(&AsyncBaton::SignalCompletion, this); + } + ); + + WaitForCompletion(); + } + } + + void AsyncBaton::WaitForCompletion() { + std::unique_lock lock(*completedMutex); + while (!hasCompleted) completedCondition.wait(lock); + } } diff --git a/generate/templates/manual/src/async_worker.cc b/generate/templates/manual/src/async_worker.cc new file mode 100644 index 000000000..65c7a4e1c --- /dev/null +++ b/generate/templates/manual/src/async_worker.cc @@ -0,0 +1,11 @@ +#include "../include/async_worker.h" + +namespace nodegit { + AsyncWorker::AsyncWorker(Nan::Callback *callback, const char *resourceName) + : Nan::AsyncWorker(callback, resourceName) + {} + + Nan::AsyncResource *AsyncWorker::GetAsyncResource() { + return async_resource; + } +} diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc new file mode 100644 index 000000000..b5454b6e4 --- /dev/null +++ b/generate/templates/manual/src/context.cc @@ -0,0 +1,42 @@ +#include "../include/context.h" + +namespace nodegit { + Context::Context(v8::Isolate *isolate) + : isolate(isolate), threadPool(10, node::GetCurrentEventLoop(isolate)) + { + Nan::HandleScope scopoe; + v8::Local storage = Nan::New(); + persistentStorage.Reset(storage); + contexts[isolate] = this; + } + + Context::~Context() { + contexts.erase(isolate); + } + + void Context::QueueWorker(nodegit::AsyncWorker *worker) { + threadPool.QueueWorker(worker); + } + + void Context::SaveToPersistent(std::string key, const v8::Local &value) { + Nan::HandleScope scope; + v8::Local storage = Nan::New(persistentStorage); + Nan::Set(storage, Nan::New(key).ToLocalChecked(), value); + } + + v8::Local Context::GetFromPersistent(std::string key) { + Nan::EscapableHandleScope scope; + v8::Local storage = Nan::New(persistentStorage); + Nan::MaybeLocal value = Nan::Get(storage, Nan::New(key).ToLocalChecked()); + return scope.Escape(value.ToLocalChecked()); + } + + Context *Context::GetCurrentContext() { + Nan::HandleScope scope; + v8::Local context = Nan::GetCurrentContext(); + v8::Isolate *isolate = context->GetIsolate(); + return contexts[isolate]; + } + + std::map Context::contexts; +} diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc index 184f015a1..ff1c0967b 100644 --- a/generate/templates/manual/src/convenient_hunk.cc +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -5,6 +5,7 @@ extern "C" { #include } +#include "../include/context.h" #include "../include/functions/copy.h" #include "../include/convenient_hunk.h" #include "../include/diff_line.h" @@ -32,27 +33,28 @@ ConvenientHunk::~ConvenientHunk() { HunkDataFree(this->hunk); } -void ConvenientHunk::InitializeComponent(Local target) { +void ConvenientHunk::InitializeComponent(Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; - Local tpl = Nan::New(JSNewFunction); + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(Nan::New("ConvenientHunk").ToLocalChecked()); - Nan::SetPrototypeMethod(tpl, "size", Size); - Nan::SetPrototypeMethod(tpl, "lines", Lines); + Nan::SetPrototypeMethod(tpl, "size", Size, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "lines", Lines, nodegitExternal); - Nan::SetPrototypeMethod(tpl, "oldStart", OldStart); - Nan::SetPrototypeMethod(tpl, "oldLines", OldLines); - Nan::SetPrototypeMethod(tpl, "newStart", NewStart); - Nan::SetPrototypeMethod(tpl, "newLines", NewLines); - Nan::SetPrototypeMethod(tpl, "headerLen", HeaderLen); - Nan::SetPrototypeMethod(tpl, "header", Header); + Nan::SetPrototypeMethod(tpl, "oldStart", OldStart, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "oldLines", OldLines, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "newStart", NewStart, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "newLines", NewLines, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "headerLen", HeaderLen, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "header", Header, nodegitExternal); - Local _constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); - constructor_template.Reset(_constructor_template); - Nan::Set(target, Nan::New("ConvenientHunk").ToLocalChecked(), _constructor_template); + Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("ConvenientHunk::Template", constructor_template); + Nan::Set(target, Nan::New("ConvenientHunk").ToLocalChecked(), constructor_template); } NAN_METHOD(ConvenientHunk::JSNewFunction) { @@ -67,10 +69,12 @@ NAN_METHOD(ConvenientHunk::JSNewFunction) { info.GetReturnValue().Set(info.This()); } -Local ConvenientHunk::New(void *raw) { +Local ConvenientHunk::New(void *raw) { Nan::EscapableHandleScope scope; - Local argv[1] = { Nan::New((void *)raw) }; - return scope.Escape(Nan::NewInstance(Nan::New(ConvenientHunk::constructor_template), 1, argv).ToLocalChecked()); + Local argv[1] = { Nan::New((void *)raw) }; + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent("ConvenientHunk::Template").As(); + return scope.Escape(Nan::NewInstance(constructor_template, 1, argv).ToLocalChecked()); } HunkData *ConvenientHunk::GetValue() { @@ -101,10 +105,15 @@ NAN_METHOD(ConvenientHunk::Lines) { worker->SaveToPersistent("hunk", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster ConvenientHunk::LinesWorker::AcquireLocks() { + return nodegit::LockMaster(true); +} + void ConvenientHunk::LinesWorker::Execute() { baton->lines = new std::vector; baton->lines->reserve(baton->hunk->numLines); @@ -181,5 +190,3 @@ NAN_METHOD(ConvenientHunk::Header) { info.GetReturnValue().Set(to); } - -Nan::Persistent ConvenientHunk::constructor_template; diff --git a/generate/templates/manual/src/convenient_patch.cc b/generate/templates/manual/src/convenient_patch.cc index 9c6cd46ca..01a437fb9 100644 --- a/generate/templates/manual/src/convenient_patch.cc +++ b/generate/templates/manual/src/convenient_patch.cc @@ -5,6 +5,7 @@ extern "C" { #include } +#include "../include/context.h" #include "../include/convenient_hunk.h" #include "../include/convenient_patch.h" #include "../include/functions/copy.h" @@ -129,36 +130,37 @@ ConvenientPatch::~ConvenientPatch() { PatchDataFree(this->patch); } -void ConvenientPatch::InitializeComponent(Local target) { +void ConvenientPatch::InitializeComponent(Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; - Local tpl = Nan::New(JSNewFunction); + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(Nan::New("ConvenientPatch").ToLocalChecked()); - Nan::SetPrototypeMethod(tpl, "hunks", Hunks); - Nan::SetPrototypeMethod(tpl, "lineStats", LineStats); - Nan::SetPrototypeMethod(tpl, "size", Size); - - Nan::SetPrototypeMethod(tpl, "oldFile", OldFile); - Nan::SetPrototypeMethod(tpl, "newFile", NewFile); - Nan::SetPrototypeMethod(tpl, "status", Status); - Nan::SetPrototypeMethod(tpl, "isUnmodified", IsUnmodified); - Nan::SetPrototypeMethod(tpl, "isAdded", IsAdded); - Nan::SetPrototypeMethod(tpl, "isDeleted", IsDeleted); - Nan::SetPrototypeMethod(tpl, "isModified", IsModified); - Nan::SetPrototypeMethod(tpl, "isRenamed", IsRenamed); - Nan::SetPrototypeMethod(tpl, "isCopied", IsCopied); - Nan::SetPrototypeMethod(tpl, "isIgnored", IsIgnored); - Nan::SetPrototypeMethod(tpl, "isUntracked", IsUntracked); - Nan::SetPrototypeMethod(tpl, "isTypeChange", IsTypeChange); - Nan::SetPrototypeMethod(tpl, "isUnreadable", IsUnreadable); - Nan::SetPrototypeMethod(tpl, "isConflicted", IsConflicted); - - Local _constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); - constructor_template.Reset(_constructor_template); - Nan::Set(target, Nan::New("ConvenientPatch").ToLocalChecked(), _constructor_template); + Nan::SetPrototypeMethod(tpl, "hunks", Hunks, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "lineStats", LineStats, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "size", Size, nodegitExternal); + + Nan::SetPrototypeMethod(tpl, "oldFile", OldFile, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "newFile", NewFile, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "status", Status, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isUnmodified", IsUnmodified, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isAdded", IsAdded, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isDeleted", IsDeleted, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isModified", IsModified, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isRenamed", IsRenamed, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isCopied", IsCopied, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isIgnored", IsIgnored, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isUntracked", IsUntracked, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isTypeChange", IsTypeChange, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isUnreadable", IsUnreadable, nodegitExternal); + Nan::SetPrototypeMethod(tpl, "isConflicted", IsConflicted, nodegitExternal); + + Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("ConvenientPatch::Template", constructor_template); + Nan::Set(target, Nan::New("ConvenientPatch").ToLocalChecked(), constructor_template); } NAN_METHOD(ConvenientPatch::JSNewFunction) { @@ -176,7 +178,9 @@ NAN_METHOD(ConvenientPatch::JSNewFunction) { Local ConvenientPatch::New(void *raw) { Nan::EscapableHandleScope scope; Local argv[1] = { Nan::New((void *)raw) }; - return scope.Escape(Nan::NewInstance(Nan::New(ConvenientPatch::constructor_template), 1, argv).ToLocalChecked()); + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent("ConvenientPatch::Template").As(); + return scope.Escape(Nan::NewInstance(constructor_template, 1, argv).ToLocalChecked()); } ConvenientLineStats ConvenientPatch::GetLineStats() { @@ -217,10 +221,15 @@ NAN_METHOD(ConvenientPatch::Hunks) { worker->SaveToPersistent("patch", info.This()); - Nan::AsyncQueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster ConvenientPatch::HunksWorker::AcquireLocks() { + return nodegit::LockMaster(true); +} + void ConvenientPatch::HunksWorker::Execute() { // copy hunks baton->hunks = new std::vector; @@ -396,5 +405,3 @@ NAN_METHOD(ConvenientPatch::IsConflicted) { to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_CONFLICTED); info.GetReturnValue().Set(to); } - -Nan::Persistent ConvenientPatch::constructor_template; diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 67e958d03..688b9efbf 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -6,11 +6,11 @@ extern "C" { } #include "../include/nodegit.h" +#include "../include/context.h" #include "../include/lock_master.h" #include "../include/functions/copy.h" #include "../include/filter_registry.h" #include "nodegit_wrapper.cc" -#include "../include/async_libgit2_queue_worker.h" #include "../include/filter.h" @@ -18,19 +18,18 @@ using namespace std; using namespace v8; using namespace node; -Nan::Persistent GitFilterRegistry::persistentHandle; - // #pragma unmanaged -void GitFilterRegistry::InitializeComponent(v8::Local target) { +void GitFilterRegistry::InitializeComponent(v8::Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; - v8::Local object = Nan::New(); + v8::Local filterRegistry = Nan::New(); - Nan::SetMethod(object, "register", GitFilterRegister); - Nan::SetMethod(object, "unregister", GitFilterUnregister); + Local nodegitExternal = Nan::New(nodegitContext); + Nan::SetMethod(filterRegistry, "register", GitFilterRegister, nodegitExternal); + Nan::SetMethod(filterRegistry, "unregister", GitFilterUnregister, nodegitExternal); - Nan::Set(target, Nan::New("FilterRegistry").ToLocalChecked(), object); - GitFilterRegistry::persistentHandle.Reset(object); + Nan::Set(target, Nan::New("FilterRegistry").ToLocalChecked(), filterRegistry); + nodegitContext->SaveToPersistent("FilterRegistry", filterRegistry); } NAN_METHOD(GitFilterRegistry::GitFilterRegister) { @@ -64,7 +63,10 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { baton->error_code = GIT_OK; baton->filter_priority = Nan::To(info[2]).FromJust(); - Nan::Set(Nan::New(GitFilterRegistry::persistentHandle), Nan::To(info[0]).ToLocalChecked(), Nan::To(info[1]).ToLocalChecked()); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + + Local filterRegistry = nodegitContext->GetFromPersistent("FilterRegistry").As(); + Nan::Set(filterRegistry, Nan::To(info[0]).ToLocalChecked(), Nan::To(info[1]).ToLocalChecked()); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); RegisterWorker *worker = new RegisterWorker(baton, callback); @@ -72,15 +74,19 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { worker->SaveToPersistent("filter_name", Nan::To(info[0]).ToLocalChecked()); worker->SaveToPersistent("filter_priority", Nan::To(info[2]).ToLocalChecked()); - AsyncLibgit2QueueWorker(worker); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitFilterRegistry::RegisterWorker::AcquireLocks() { + return nodegit::LockMaster(true, baton->filter_name, baton->filter); +} + void GitFilterRegistry::RegisterWorker::Execute() { git_error_clear(); { - LockMaster lockMaster(/*asyncAction: */true, baton->filter_name, baton->filter); + nodegit::LockMaster lockMaster(/*asyncAction: */true, baton->filter_name, baton->filter); int result = git_filter_register(baton->filter_name, baton->filter, baton->filter_priority); baton->error_code = result; @@ -158,15 +164,20 @@ NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { worker->SaveToPersistent("filter_name", info[0]); - AsyncLibgit2QueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster GitFilterRegistry::UnregisterWorker::AcquireLocks() { + return nodegit::LockMaster(true, baton->filter_name); +} + void GitFilterRegistry::UnregisterWorker::Execute() { git_error_clear(); { - LockMaster lockMaster(/*asyncAction: */true, baton->filter_name); + nodegit::LockMaster lockMaster(/*asyncAction: */true, baton->filter_name); int result = git_filter_unregister(baton->filter_name); baton->error_code = result; @@ -178,6 +189,9 @@ void GitFilterRegistry::UnregisterWorker::Execute() { void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local filterRegistry = nodegitContext->GetFromPersistent("FilterRegistry").As(); + Nan::Delete(filterRegistry, Nan::To(GetFromPersistent("filter_name")).ToLocalChecked()); v8::Local result = Nan::New(baton->error_code); v8::Local argv[2] = { Nan::Null(), diff --git a/generate/templates/manual/src/lock_master.cc b/generate/templates/manual/src/lock_master.cc index fd1c49192..72740db8e 100644 --- a/generate/templates/manual/src/lock_master.cc +++ b/generate/templates/manual/src/lock_master.cc @@ -9,213 +9,228 @@ #include #include "../include/lock_master.h" +namespace nodegit { + // information about a lockable object + // - the mutex used to lock it and the number of outstanding locks + struct ObjectInfo { + std::shared_ptr mutex; + unsigned useCount; + + ObjectInfo(unsigned useCount) + : mutex(new std::mutex), useCount(useCount) + {} + }; + + // LockMaster implementation details + // implemented in a separate class to keep LockMaster opaque + class LockMasterImpl { + // STATIC variables / methods + + // A map from objects that are locked (or were locked), to information on their mutex + static std::map mutexes; + // A mutex used for the mutexes map + static std::mutex mapMutex; + + // A thread local storage slot for the current thread-specific LockMasterImpl instance + thread_local static LockMasterImpl* currentLockMaster; + + // Cleans up any mutexes that are not currently used + static NAN_GC_CALLBACK(CleanupMutexes); + + public: + static void InitializeContext(); + + // INSTANCE variables / methods + + private: + // The set of objects this LockMaster is responsible for locking + std::set objectsToLock; + + // Mutexes locked by this LockMaster on construction and unlocked on destruction + std::vector> GetMutexes(int useCountDelta); + void Register(); + void Unregister(); + + public: + static LockMasterImpl *CurrentLockMasterImpl() { + return (LockMasterImpl *)currentLockMaster; + } -// information about a lockable object -// - the mutex used to lock it and the number of outstanding locks -struct ObjectInfo { - std::shared_ptr mutex; - unsigned useCount; - - ObjectInfo(unsigned useCount) - : mutex(new std::mutex), useCount(useCount) - {} -}; - -// LockMaster implementation details -// implemented in a separate class to keep LockMaster opaque -class LockMasterImpl { - // STATIC variables / methods - - // A map from objects that are locked (or were locked), to information on their mutex - static std::map mutexes; - // A mutex used for the mutexes map - static std::mutex mapMutex; - - // A thread local storage slot for the current thread-specific LockMasterImpl instance - thread_local static LockMasterImpl* currentLockMaster; + LockMasterImpl() { + Register(); + } - // Cleans up any mutexes that are not currently used - static NAN_GC_CALLBACK(CleanupMutexes); + ~LockMasterImpl() { + Unregister(); + Unlock(true); + } -public: - static void InitializeContext(); + void ObjectToLock(const void *objectToLock) { + objectsToLock.insert(objectToLock); + } - // INSTANCE variables / methods + void Lock(bool acquireMutexes); + void Unlock(bool releaseMutexes); + }; -private: - // The set of objects this LockMaster is responsible for locking - std::set objectsToLock; + std::map LockMasterImpl::mutexes; + std::mutex LockMasterImpl::mapMutex; + thread_local LockMasterImpl* LockMasterImpl::currentLockMaster = nullptr; - // Mutexes locked by this LockMaster on construction and unlocked on destruction - std::vector> GetMutexes(int useCountDelta); - void Register(); - void Unregister(); + LockMaster::LockMaster(LockMaster &&other) + : impl(std::exchange(other.impl, nullptr)) + {} -public: - static LockMasterImpl *CurrentLockMasterImpl() { - return (LockMasterImpl *)currentLockMaster; - } + LockMaster &LockMaster::operator=(LockMaster &&other) { + if (&other == this) { + return *this; + } - LockMasterImpl() { - Register(); + impl = std::exchange(other.impl, nullptr); + return *this; } - ~LockMasterImpl() { - Unregister(); - Unlock(true); + void LockMasterImpl::InitializeContext() { + Nan::AddGCEpilogueCallback(CleanupMutexes); } - void ObjectToLock(const void *objectToLock) { - objectsToLock.insert(objectToLock); + NAN_GC_CALLBACK(LockMasterImpl::CleanupMutexes) { + std::lock_guard lock(mapMutex); + + for (auto it = mutexes.begin(); it != mutexes.end(); ) + { + // if the mutex is not used by any LockMasters, + // we can destroy it + unsigned useCount = it->second.useCount; + if (!useCount) { + auto to_erase = it; + it++; + mutexes.erase(to_erase); + } else { + it++; + } + } } - void Lock(bool acquireMutexes); - void Unlock(bool releaseMutexes); -}; - -std::map LockMasterImpl::mutexes; -std::mutex LockMasterImpl::mapMutex; -thread_local LockMasterImpl* LockMasterImpl::currentLockMaster = NULL; - -void LockMasterImpl::InitializeContext() { - Nan::AddGCEpilogueCallback(CleanupMutexes); -} - -NAN_GC_CALLBACK(LockMasterImpl::CleanupMutexes) { - std::lock_guard lock(mapMutex); - - for (auto it = mutexes.begin(); it != mutexes.end(); ) - { - // if the mutex is not used by any LockMasters, - // we can destroy it - unsigned useCount = it->second.useCount; - if (!useCount) { - auto to_erase = it; - it++; - mutexes.erase(to_erase); - } else { - it++; - } + void LockMaster::InitializeContext() { + LockMasterImpl::InitializeContext(); } -} -void LockMaster::InitializeContext() { - LockMasterImpl::InitializeContext(); -} + std::vector> LockMasterImpl::GetMutexes(int useCountDelta) { + std::vector> objectMutexes; + std::lock_guard lock(mapMutex); + + for (auto object : objectsToLock) { + if (object) { + // ensure we have an initialized mutex for each object + auto mutexIt = mutexes.find(object); + if (mutexIt == mutexes.end()) { + mutexIt = mutexes.insert( + std::make_pair( + object, + ObjectInfo(0U) + ) + ).first; + } -std::vector> LockMasterImpl::GetMutexes(int useCountDelta) { - std::vector> objectMutexes; - std::lock_guard lock(mapMutex); - - for (auto object : objectsToLock) { - if (object) { - // ensure we have an initialized mutex for each object - auto mutexIt = mutexes.find(object); - if (mutexIt == mutexes.end()) { - mutexIt = mutexes.insert( - std::make_pair( - object, - ObjectInfo(0U) - ) - ).first; + objectMutexes.push_back(mutexIt->second.mutex); + mutexIt->second.useCount += useCountDelta; } - - objectMutexes.push_back(mutexIt->second.mutex); - mutexIt->second.useCount += useCountDelta; } - } - - return objectMutexes; -} -void LockMasterImpl::Register() { - currentLockMaster = this; -} - -void LockMasterImpl::Unregister() { - currentLockMaster = NULL; -} + return objectMutexes; + } -void LockMasterImpl::Lock(bool acquireMutexes) { - std::vector> objectMutexes = GetMutexes(acquireMutexes * 1); - - auto alreadyLocked = objectMutexes.end(); - std::vector>::iterator it; - - // we will attempt to lock all the mutexes at the same time to avoid deadlocks - // note in most cases we are locking 0 or 1 mutexes. more than 1 implies - // passing objects with different repos/owners in the same call. - do { - // go through all the mutexes and try to lock them - for (it = objectMutexes.begin(); it != objectMutexes.end(); it++) { - // if we already locked this mutex in a previous pass via std::mutex::lock, - // we don't need to lock it again - if (it == alreadyLocked) { - continue; - } + void LockMasterImpl::Register() { + currentLockMaster = this; + } - // first, try to lock (non-blocking) - bool success = (*it)->try_lock(); - if (!success) { - // we have failed to lock a mutex... unlock everything we have locked - std::for_each(objectMutexes.begin(), it, [](std::shared_ptr mutex) { - mutex->unlock(); - }); + void LockMasterImpl::Unregister() { + currentLockMaster = nullptr; + } - if (alreadyLocked > it && alreadyLocked != objectMutexes.end()) { - (*alreadyLocked)->unlock(); + void LockMasterImpl::Lock(bool acquireMutexes) { + std::vector> objectMutexes = GetMutexes(acquireMutexes * 1); + + auto alreadyLocked = objectMutexes.end(); + std::vector>::iterator it; + + // we will attempt to lock all the mutexes at the same time to avoid deadlocks + // note in most cases we are locking 0 or 1 mutexes. more than 1 implies + // passing objects with different repos/owners in the same call. + do { + // go through all the mutexes and try to lock them + for (it = objectMutexes.begin(); it != objectMutexes.end(); it++) { + // if we already locked this mutex in a previous pass via std::mutex::lock, + // we don't need to lock it again + if (it == alreadyLocked) { + continue; } - // now do a blocking lock on what we couldn't lock - (*it)->lock(); - // mark that we have already locked this one - // if there are more mutexes than this one, we will go back to locking everything - alreadyLocked = it; - break; + // first, try to lock (non-blocking) + bool success = (*it)->try_lock(); + if (!success) { + // we have failed to lock a mutex... unlock everything we have locked + std::for_each(objectMutexes.begin(), it, [](std::shared_ptr mutex) { + mutex->unlock(); + }); + + if (alreadyLocked > it && alreadyLocked != objectMutexes.end()) { + (*alreadyLocked)->unlock(); + } + + // now do a blocking lock on what we couldn't lock + (*it)->lock(); + // mark that we have already locked this one + // if there are more mutexes than this one, we will go back to locking everything + alreadyLocked = it; + break; + } } - } - } while (it != objectMutexes.end()); -} + } while (it != objectMutexes.end()); + } -void LockMasterImpl::Unlock(bool releaseMutexes) { - // Get the mutexes but don't decrement their use count until after we've - // unlocked them all. - std::vector> objectMutexes = GetMutexes(0); + void LockMasterImpl::Unlock(bool releaseMutexes) { + // Get the mutexes but don't decrement their use count until after we've + // unlocked them all. + std::vector> objectMutexes = GetMutexes(0); - std::for_each(objectMutexes.begin(), objectMutexes.end(), [](std::shared_ptr mutex) { - mutex->unlock(); - }); + std::for_each(objectMutexes.begin(), objectMutexes.end(), [](std::shared_ptr mutex) { + mutex->unlock(); + }); - GetMutexes(releaseMutexes * -1); -} + GetMutexes(releaseMutexes * -1); + } -// LockMaster + // LockMaster -void LockMaster::ConstructorImpl() { - impl = new LockMasterImpl(); -} + void LockMaster::ConstructorImpl() { + impl = new LockMasterImpl(); + } -void LockMaster::DestructorImpl() { - delete impl; -} + void LockMaster::DestructorImpl() { + delete impl; + } -void LockMaster::ObjectToLock(const void *objectToLock) { - impl->ObjectToLock(objectToLock); -} + void LockMaster::ObjectToLock(const void *objectToLock) { + impl->ObjectToLock(objectToLock); + } -void LockMaster::ObjectsToLockAdded() { - impl->Lock(true); -} + void LockMaster::ObjectsToLockAdded() { + impl->Lock(true); + } + + // LockMaster::TemporaryUnlock -// LockMaster::TemporaryUnlock + void LockMaster::TemporaryUnlock::ConstructorImpl() { + impl = LockMasterImpl::CurrentLockMasterImpl(); + if (impl) { + impl->Unlock(false); + } + } -void LockMaster::TemporaryUnlock::ConstructorImpl() { - impl = LockMasterImpl::CurrentLockMasterImpl(); - if (impl) { - impl->Unlock(false); + void LockMaster::TemporaryUnlock::DestructorImpl() { + impl->Lock(false); } -} -void LockMaster::TemporaryUnlock::DestructorImpl() { - impl->Lock(false); } diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index 69aed4f94..a9f0483b3 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -79,9 +79,13 @@ template v8::Local NodeGitWrapper::New(const typename Traits::cType *raw, bool selfFreeing, v8::Local owner) { Nan::EscapableHandleScope scope; Local argv[3] = { Nan::New((void *)raw), Nan::New(selfFreeing), owner }; + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent( + std::string(Traits::className()) + "::Template" + ).As(); return scope.Escape( Nan::NewInstance( - Nan::New(constructor_template), + constructor_template, owner.IsEmpty() ? 2 : 3, // passing an empty handle as part of the arguments causes a crash argv ).ToLocalChecked()); @@ -98,13 +102,10 @@ void NodeGitWrapper::ClearValue() { } template -Nan::Persistent NodeGitWrapper::constructor_template; +thread_local int NodeGitWrapper::SelfFreeingInstanceCount; template -int NodeGitWrapper::SelfFreeingInstanceCount; - -template -int NodeGitWrapper::NonSelfFreeingConstructedCount; +thread_local int NodeGitWrapper::NonSelfFreeingConstructedCount; template NAN_METHOD(NodeGitWrapper::GetSelfFreeingInstanceCount) { diff --git a/generate/templates/manual/src/promise_completion.cc b/generate/templates/manual/src/promise_completion.cc index 22203b41d..dfc560682 100644 --- a/generate/templates/manual/src/promise_completion.cc +++ b/generate/templates/manual/src/promise_completion.cc @@ -1,21 +1,30 @@ #include #include "../include/promise_completion.h" -Nan::Persistent PromiseCompletion::newFn; -Nan::Persistent PromiseCompletion::promiseFulfilled; -Nan::Persistent PromiseCompletion::promiseRejected; - // initializes the persistent handles for NAN_METHODs -void PromiseCompletion::InitializeComponent() { - v8::Local newTemplate = Nan::New(New); +void PromiseCompletion::InitializeComponent(nodegit::Context *nodegitContext) { + Nan::HandleScope scope; + v8::Local nodegitExternal = Nan::New(nodegitContext); + v8::Local newTemplate = Nan::New(New, nodegitExternal); newTemplate->InstanceTemplate()->SetInternalFieldCount(1); - newFn.Reset(Nan::GetFunction(newTemplate).ToLocalChecked()); - promiseFulfilled.Reset(Nan::GetFunction(Nan::New(PromiseFulfilled)).ToLocalChecked()); - promiseRejected.Reset(Nan::GetFunction(Nan::New(PromiseRejected)).ToLocalChecked()); + nodegitContext->SaveToPersistent( + "PromiseCompletion::Template", + Nan::GetFunction(newTemplate).ToLocalChecked() + ); + + v8::Local promiseFulfilled = Nan::GetFunction( + Nan::New(PromiseFulfilled, nodegitExternal) + ).ToLocalChecked(); + nodegitContext->SaveToPersistent("PromiseCompletion::PromiseFulfilled", promiseFulfilled); + + v8::Local promiseRejected = Nan::GetFunction( + Nan::New(PromiseRejected, nodegitExternal) + ).ToLocalChecked(); + nodegitContext->SaveToPersistent("PromiseCompletion::PromiseRejected", promiseRejected); } -bool PromiseCompletion::ForwardIfPromise(v8::Local result, AsyncBaton *baton, Callback callback) +bool PromiseCompletion::ForwardIfPromise(v8::Local result, nodegit::AsyncBaton *baton, Callback callback) { Nan::HandleScope scope; @@ -28,7 +37,10 @@ bool PromiseCompletion::ForwardIfPromise(v8::Local result, AsyncBaton // we can be reasonably certain that the result is a promise // create a new v8 instance of PromiseCompletion - v8::Local object = Nan::NewInstance(Nan::New(newFn)).ToLocalChecked(); + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + v8::Local constructor_template = nodegitContext->GetFromPersistent("PromiseCompletion::Template") + .As(); + v8::Local object = Nan::NewInstance(constructor_template).ToLocalChecked(); // set up the native PromiseCompletion object PromiseCompletion *promiseCompletion = ObjectWrap::Unwrap(object); @@ -50,13 +62,18 @@ NAN_METHOD(PromiseCompletion::New) { } // sets up a Promise to forward the promise result via the baton and callback -void PromiseCompletion::Setup(v8::Local thenFn, v8::Local result, AsyncBaton *baton, Callback callback) { +void PromiseCompletion::Setup(v8::Local thenFn, v8::Local result, nodegit::AsyncBaton *baton, Callback callback) { this->callback = callback; this->baton = baton; v8::Local promise = Nan::To(result).ToLocalChecked(); + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); v8::Local thisHandle = handle(); + v8::Local promiseFulfilled = nodegitContext->GetFromPersistent("PromiseCompletion::PromiseFulfilled") + .As(); + v8::Local promiseRejected = nodegitContext->GetFromPersistent("PromiseCompletion::PromiseRejected") + .As(); v8::Local argv[2] = { Bind(promiseFulfilled, thisHandle), @@ -69,16 +86,16 @@ void PromiseCompletion::Setup(v8::Local thenFn, v8::Local PromiseCompletion::Bind(Nan::Persistent &function, v8::Local object) { +v8::Local PromiseCompletion::Bind(v8::Local function, v8::Local object) { Nan::EscapableHandleScope scope; v8::Local bind = - Nan::Get(Nan::New(function), Nan::New("bind").ToLocalChecked()) + Nan::Get(function, Nan::New("bind").ToLocalChecked()) .ToLocalChecked().As(); v8::Local argv[1] = { object }; - return scope.Escape(Nan::Call(bind, Nan::To(Nan::New(function)).ToLocalChecked(), 1, argv).ToLocalChecked()); + return scope.Escape(Nan::Call(bind, Nan::To(function).ToLocalChecked(), 1, argv).ToLocalChecked()); } // calls the callback stored in the PromiseCompletion, passing the baton that diff --git a/generate/templates/manual/src/reference_counter.cc b/generate/templates/manual/src/reference_counter.cc index 1adc1df4b..e3bc483a7 100644 --- a/generate/templates/manual/src/reference_counter.cc +++ b/generate/templates/manual/src/reference_counter.cc @@ -1,7 +1,7 @@ #include "../include/reference_counter.h" void ReferenceCounter::incrementCountForPointer(void *ptr) { - LockMaster(true, &referenceCountByPointer); + nodegit::LockMaster lm(true, &referenceCountByPointer); if (referenceCountByPointer.find(ptr) == referenceCountByPointer.end()) { referenceCountByPointer[ptr] = 1; } else { @@ -10,7 +10,7 @@ void ReferenceCounter::incrementCountForPointer(void *ptr) { } unsigned long ReferenceCounter::decrementCountForPointer(void *ptr) { - LockMaster(true, &referenceCountByPointer); + nodegit::LockMaster lm(true, &referenceCountByPointer); unsigned long referenceCount = referenceCountByPointer[ptr]; if (referenceCount == 1) { referenceCountByPointer.erase(ptr); diff --git a/generate/templates/manual/src/semaphore.cc b/generate/templates/manual/src/semaphore.cc deleted file mode 100644 index 8185ba774..000000000 --- a/generate/templates/manual/src/semaphore.cc +++ /dev/null @@ -1,17 +0,0 @@ -#include "../include/semaphore.h" - -Semaphore::Semaphore() - : count(0) -{} - -void Semaphore::post() { - std::lock_guard lock(mutex); - ++count; - condition.notify_one(); -} - -void Semaphore::wait() { - std::unique_lock lock(mutex); - while (!count) condition.wait(lock); - --count; -} diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index c7a716e7f..771e95074 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -1,103 +1,581 @@ #include #include "../include/thread_pool.h" -ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) -{ - uv_async_init(loop, &loopAsync, RunLoopCallbacks); - loopAsync.data = this; - uv_unref((uv_handle_t *)&loopAsync); +#include +#include +#include +#include +#include - workInProgressCount = 0; +#include - for (int i=0; i } -void ThreadPool::QueueWork(Callback workCallback, Callback completionCallback, void *data) { - { - std::lock_guard lock(workMutex); - // there is work on the thread pool - reference the handle so - // node doesn't terminate - uv_ref((uv_handle_t *)&loopAsync); - workQueue.push(Work(workCallback, completionCallback, data)); - workInProgressCount++; +using namespace std::placeholders; + +namespace nodegit { + class Executor { + public: + struct Task { + enum Type { SHUTDOWN, WORK }; + + Task(Type initType) + : type(initType) + {} + + // We must define a virtual destructor so that derived classes are castable + virtual ~Task() {} + + Type type; + }; + + struct ShutdownTask : Task { + ShutdownTask() + : Task(SHUTDOWN) + {} + }; + + struct WorkTask : Task { + WorkTask(ThreadPool::Callback initCallback, Nan::AsyncResource *asyncResource) + : Task(WORK), asyncResource(asyncResource), callback(initCallback) + {} + + Nan::AsyncResource *asyncResource; + ThreadPool::Callback callback; + }; + + typedef std::function PostCallbackEventToOrchestratorFn; + typedef std::function PostCompletedEventToOrchestratorFn; + typedef std::function()> TakeNextTaskFn; + + struct Event { + enum Type { COMPLETED, CALLBACK_TYPE }; + Event(Type initType) + : type(initType) + {} + + Type type; + + // We must define a virtual destructor so that derived classes are castable + virtual ~Event() {} + }; + + struct CompletedEvent : Event { + CompletedEvent() + : Event(COMPLETED) + {} + }; + + struct CallbackEvent : Event { + CallbackEvent(ThreadPool::OnPostCallbackFn initCallback) + : Event(CALLBACK_TYPE), callback(initCallback) + {} + + ThreadPool::Callback operator()(ThreadPool::QueueCallbackFn queueCb, ThreadPool::Callback completedCb) { + return callback(queueCb, completedCb); + } + + private: + ThreadPool::OnPostCallbackFn callback; + }; + + Executor( + PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator, + PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator, + TakeNextTaskFn takeNextTask + ); + + void RunTaskLoop(); + + // Orchestrator needs to call this to ensure that the executor is done reading from + // the Orchestrator's memory + void WaitForThreadClose(); + + static Nan::AsyncResource *GetCurrentAsyncResource(); + + static void PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback); + + // Libgit2 will call this before it spawns a child thread. + // That way we can decide what the TLS for that thread should be + // We will make sure that the context for the current async work + // is preserved on the child thread through this method + static void *RetrieveTLSForLibgit2ChildThread(); + + // Libgit2 will call this on a child thread with the pointer that was + // retrieved from RetrieveTLSForLibgit2ChildThread. That allows us + // to store the necessary thread local storage for the child thread + static void SetTLSForLibgit2ChildThread(void *vexecutor); + + // Called when a libgit2 child thread exits. This gives us the ability + // to teardown any TLS we set up for the child thread if we need to + static void TeardownTLSOnLibgit2ChildThread(); + + private: + Nan::AsyncResource *currentAsyncResource; + // We need to populate the executor on every thread that libgit2 + // could make a callback on so that it can correctly queue callbacks + // in the correct javascript context + thread_local static Executor *executor; + PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator; + PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator; + TakeNextTaskFn takeNextTask; + std::thread thread; + }; + + Executor::Executor( + PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator, + PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator, + TakeNextTaskFn takeNextTask + ) + : currentAsyncResource(nullptr), + postCallbackEventToOrchestrator(postCallbackEventToOrchestrator), + postCompletedEventToOrchestrator(postCompletedEventToOrchestrator), + takeNextTask(takeNextTask), + thread(&Executor::RunTaskLoop, this) + {} + + void Executor::RunTaskLoop() { + // Set the thread local storage so that libgit2 can pick up the current executor + // for the thread. + executor = this; + + for ( ; ; ) { + std::unique_ptr task = takeNextTask(); + if (task->type == Task::Type::SHUTDOWN) { + return; + } + + WorkTask *workTask = static_cast(task.get()); + + currentAsyncResource = workTask->asyncResource; + workTask->callback(); + currentAsyncResource = nullptr; + + postCompletedEventToOrchestrator(); + } } - workSemaphore.post(); -} -void ThreadPool::QueueLoopCallback(Callback callback, void *data, bool isWork) { - // push the callback into the queue - std::lock_guard lock(loopMutex); - LoopCallback loopCallback(callback, data, isWork); - bool queueWasEmpty = loopQueue.empty(); - loopQueue.push(loopCallback); - // we only trigger RunLoopCallbacks via the loopAsync handle if the queue - // was empty. Otherwise, we depend on RunLoopCallbacks to re-trigger itself - if (queueWasEmpty) { - uv_async_send(&loopAsync); + void Executor::WaitForThreadClose() { + thread.join(); } -} -void ThreadPool::ExecuteReverseCallback(Callback reverseCallback, void *data) { - QueueLoopCallback(reverseCallback, data, false); -} + Nan::AsyncResource *Executor::GetCurrentAsyncResource() { + if (executor) { + return executor->currentAsyncResource; + } + + // NOTE this should always be set when a libgit2 callback is running, + // so this case should not happen. + return nullptr; + } -void ThreadPool::RunEventQueue() { - for ( ; ; ) { - // wait until there is work to do - workSemaphore.wait(); - Work work; - { - std::lock_guard lock(workMutex); - // the semaphore should guarantee that queue is not empty - work = workQueue.front(); - workQueue.pop(); + void Executor::PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback) { + if (executor) { + executor->postCallbackEventToOrchestrator(onPostCallback); } + } - // perform the queued work - (*work.workCallback)(work.data); + void *Executor::RetrieveTLSForLibgit2ChildThread() { + return Executor::executor; + } - // schedule the completion callback on the loop - QueueLoopCallback(work.completionCallback, work.data, true); + void Executor::SetTLSForLibgit2ChildThread(void *vexecutor) { + Executor::executor = static_cast(vexecutor); } -} -void ThreadPool::RunLoopCallbacks(uv_async_t* handle) { - static_cast(handle->data)->RunLoopCallbacks(); -} + void Executor::TeardownTLSOnLibgit2ChildThread() { + Executor::executor = nullptr; + } -void ThreadPool::RunLoopCallbacks() { - Nan::HandleScope scope; - v8::Local context = Nan::GetCurrentContext(); - node::CallbackScope callbackScope(context->GetIsolate(), Nan::New(), {0, 0}); - LoopCallback loopCallback; - { - std::lock_guard lock(loopMutex); - // get the next callback to run - loopCallback = loopQueue.front(); + thread_local Executor *Executor::executor = nullptr; + + class Orchestrator { + public: + struct Job { + enum Type { SHUTDOWN, ASYNC_WORK }; + Job(Type initType) + : type(initType) + {} + + virtual ~Job() {} + + Type type; + }; + + struct ShutdownJob : Job { + ShutdownJob() + : Job(SHUTDOWN) + {} + }; + + struct AsyncWorkJob : Job { + AsyncWorkJob(nodegit::AsyncWorker *initWorker) + : Job(ASYNC_WORK), worker(initWorker) + {} + + nodegit::AsyncWorker *worker; + }; + + typedef std::function QueueCallbackOnJSThreadFn; + typedef std::function()> TakeNextJobFn; + + private: + class OrchestratorImpl { + public: + OrchestratorImpl( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob + ); + + void RunJobLoop(); + + // The Executor will call this method to queue a CallbackEvent in Orchestrator's event loop + void PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback); + + // The Executor will call this method after completion its work. This should queue + // a CompletedEvent in Thread's event loop + void PostCompletedEvent(); + + // This will be used by Executor to take jobs that the Thread has picked up and run them. + std::unique_ptr TakeNextTask(); + + // This is used to wait for the Orchestrator's thread to shutdown after signaling shutdown + void WaitForThreadClose(); + + private: + // The only thread safe way to pull events from executorEventsQueue + std::shared_ptr TakeEventFromExecutor(); + + void ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource); + + void ScheduleShutdownTaskOnExecutor(); + + std::condition_variable taskCondition; + std::unique_ptr taskMutex; + + std::queue> executorEventsQueue; + std::unique_ptr executorEventsMutex; + std::condition_variable executorEventsCondition; + + QueueCallbackOnJSThreadFn queueCallbackOnJSThread; + TakeNextJobFn takeNextJob; + std::unique_ptr task; + std::thread thread; + Executor executor; + + }; + + std::unique_ptr impl; + + public: + Orchestrator( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob + ); + + void WaitForThreadClose(); + }; + + Orchestrator::OrchestratorImpl::OrchestratorImpl( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob + ) + : taskMutex(new std::mutex), + executorEventsMutex(new std::mutex), + queueCallbackOnJSThread(queueCallbackOnJSThread), + takeNextJob(takeNextJob), + task(nullptr), + thread(&Orchestrator::OrchestratorImpl::RunJobLoop, this), + executor( + std::bind(&Orchestrator::OrchestratorImpl::PostCallbackEvent, this, _1), + std::bind(&Orchestrator::OrchestratorImpl::PostCompletedEvent, this), + std::bind(&Orchestrator::OrchestratorImpl::TakeNextTask, this) + ) + {} + + void Orchestrator::OrchestratorImpl::RunJobLoop() { + for ( ; ; ) { + auto job = takeNextJob(); // takes jobs from the threadpool queue + switch (job->type) { + case Job::Type::SHUTDOWN: { + ScheduleShutdownTaskOnExecutor(); + executor.WaitForThreadClose(); + return; + } + + case Job::Type::ASYNC_WORK: { + std::shared_ptr asyncWorkJob = std::static_pointer_cast(job); + nodegit::AsyncWorker *worker = asyncWorkJob->worker; + // We lock at this level, because we temporarily unlock the lock master + // when a callback is fired. We need to be on the same thread to ensure + // the same thread that acquired the locks also releases them + nodegit::LockMaster lock = worker->AcquireLocks(); + ScheduleWorkTaskOnExecutor(std::bind(&nodegit::AsyncWorker::Execute, worker), worker->GetAsyncResource()); + for ( ; ; ) { + std::shared_ptr event = TakeEventFromExecutor(); + if (event->type == Executor::Event::Type::COMPLETED) { + break; + } + + // We must have received a callback from libgit2 + auto callbackEvent = std::static_pointer_cast(event); + std::shared_ptr callbackMutex(new std::mutex); + std::shared_ptr callbackCondition(new std::condition_variable); + bool hasCompleted = false; + + LockMaster::TemporaryUnlock temporaryUnlock; + auto onCompletedCallback = (*callbackEvent)( + [this](ThreadPool::Callback callback) { + queueCallbackOnJSThread(callback, false); + }, + [callbackCondition, callbackMutex, &hasCompleted]() { + std::lock_guard lock(*callbackMutex); + hasCompleted = true; + callbackCondition->notify_one(); + } + ); + + std::unique_lock lock(*callbackMutex); + while (!hasCompleted) callbackCondition->wait(lock); + onCompletedCallback(); + } + + queueCallbackOnJSThread( + [worker]() { + worker->WorkComplete(); + worker->Destroy(); + }, + true + ); + } + } + } + } + + void Orchestrator::OrchestratorImpl::PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback) { + std::lock_guard lock(*executorEventsMutex); + std::shared_ptr callbackEvent(new Executor::CallbackEvent(onPostCallback)); + executorEventsQueue.push(callbackEvent); + executorEventsCondition.notify_one(); + } + + void Orchestrator::OrchestratorImpl::PostCompletedEvent() { + std::lock_guard lock(*executorEventsMutex); + std::shared_ptr completedEvent(new Executor::CompletedEvent); + executorEventsQueue.push(completedEvent); + executorEventsCondition.notify_one(); + } + + std::shared_ptr Orchestrator::OrchestratorImpl::TakeEventFromExecutor() { + std::unique_lock lock(*executorEventsMutex); + while (executorEventsQueue.empty()) executorEventsCondition.wait(lock); + std::shared_ptr executorEvent = executorEventsQueue.front(); + executorEventsQueue.pop(); + return executorEvent; + } + + void Orchestrator::OrchestratorImpl::ScheduleShutdownTaskOnExecutor() { + std::lock_guard lock(*taskMutex); + task.reset(new Executor::ShutdownTask); + taskCondition.notify_one(); + } + + void Orchestrator::OrchestratorImpl::ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource) { + std::lock_guard lock(*taskMutex); + task.reset(new Executor::WorkTask(callback, asyncResource)); + taskCondition.notify_one(); + } + + std::unique_ptr Orchestrator::OrchestratorImpl::TakeNextTask() { + std::unique_lock lock(*taskMutex); + while (!task) taskCondition.wait(lock); + return std::move(task); + } + + void Orchestrator::OrchestratorImpl::WaitForThreadClose() { + thread.join(); } - // perform the queued loop callback - (*loopCallback.callback)(loopCallback.data); + Orchestrator::Orchestrator( + QueueCallbackOnJSThreadFn queueCallbackOnJSThread, + TakeNextJobFn takeNextJob + ) + : impl(new OrchestratorImpl(queueCallbackOnJSThread, takeNextJob)) + {} + + void Orchestrator::WaitForThreadClose() { + impl->WaitForThreadClose(); + } + + class ThreadPoolImpl { + public: + ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop); + + void QueueWorker(nodegit::AsyncWorker *worker); + + std::shared_ptr TakeNextJob(); + + void QueueCallbackOnJSThread(ThreadPool::Callback callback, bool isWork); + + static void RunJSThreadCallbacksFromOrchestrator(uv_async_t *handle); + + void RunJSThreadCallbacksFromOrchestrator(); + + static void RunLoopCallbacks(uv_async_t *handle); + + private: + struct JSThreadCallback { + JSThreadCallback(ThreadPool::Callback callback, bool isWork) + : isWork(isWork), callback(callback) + {} + + JSThreadCallback() + : isWork(false), callback(nullptr) + {} + + void operator()() { + callback(); + } + + bool isWork; + + private: + ThreadPool::Callback callback; + }; + + void RunLoopCallbacks(); - // pop the queue, and if necessary, re-trigger RunLoopCallbacks + std::queue> orchestratorJobQueue; + std::unique_ptr orchestratorJobMutex; + std::condition_variable orchestratorJobCondition; + size_t workInProgressCount; + + // completion and async callbacks to be performed on the loop + std::queue jsThreadCallbackQueue; + std::unique_ptr jsThreadCallbackMutex; + uv_async_t jsThreadCallbackAsync; + + std::vector orchestrators; + }; + + ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop) + : orchestratorJobMutex(new std::mutex), + jsThreadCallbackMutex(new std::mutex) { - std::lock_guard lock(loopMutex); - loopQueue.pop(); - if (!loopQueue.empty()) { - uv_async_send(&loopAsync); + uv_async_init(loop, &jsThreadCallbackAsync, RunLoopCallbacks); + jsThreadCallbackAsync.data = this; + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + + workInProgressCount = 0; + + for (int i = 0; i < numberOfThreads; i++) { + orchestrators.emplace_back( + std::bind(&ThreadPoolImpl::QueueCallbackOnJSThread, this, _1, _2), + std::bind(&ThreadPoolImpl::TakeNextJob, this) + ); + } + } + + void ThreadPoolImpl::QueueWorker(nodegit::AsyncWorker *worker) { + std::lock_guard lock(*orchestratorJobMutex); + // there is work on the thread pool - reference the handle so + // node doesn't terminate + uv_ref((uv_handle_t *)&jsThreadCallbackAsync); + std::shared_ptr job(new Orchestrator::AsyncWorkJob(worker)); + orchestratorJobQueue.emplace(job); + workInProgressCount++; + orchestratorJobCondition.notify_one(); + } + + std::shared_ptr ThreadPoolImpl::TakeNextJob() { + std::unique_lock lock(*orchestratorJobMutex); + while (orchestratorJobQueue.empty()) orchestratorJobCondition.wait(lock); + auto orchestratorJob = orchestratorJobQueue.front(); + + // When the thread pool is shutting down, the thread pool will drain the work queue and replace it with + // a single shared_ptr to a shutdown job, so don't pop the queue when we're shutting down so + // everyone gets the signal + if (orchestratorJob->type != Orchestrator::Job::Type::SHUTDOWN) { + orchestratorJobQueue.pop(); + } + + return orchestratorJob; + } + + void ThreadPoolImpl::QueueCallbackOnJSThread(ThreadPool::Callback callback, bool isWork) { + // push the callback into the queue + std::lock_guard lock(*jsThreadCallbackMutex); + bool queueWasEmpty = jsThreadCallbackQueue.empty(); + jsThreadCallbackQueue.emplace(callback, isWork); + // we only trigger RunLoopCallbacks via the jsThreadCallbackAsync handle if the queue + // was empty. Otherwise, we depend on RunLoopCallbacks to re-trigger itself + if (queueWasEmpty) { + uv_async_send(&jsThreadCallbackAsync); } } - // if there is no ongoing work / completion processing, node doesn't need - // to be prevented from terminating - if (loopCallback.isWork) { - std::lock_guard lock(workMutex); - workInProgressCount --; - if(!workInProgressCount) { - uv_unref((uv_handle_t *)&loopAsync); + void ThreadPoolImpl::RunLoopCallbacks(uv_async_t* handle) { + static_cast(handle->data)->RunLoopCallbacks(); + } + + // TODO every time this is called, if there is a cleanup operation in progress + // for the current context and there is workInProgress, we should ping the + // cleanup async handle which is not created yet + void ThreadPoolImpl::RunLoopCallbacks() { + Nan::HandleScope scope; + v8::Local context = Nan::GetCurrentContext(); + node::CallbackScope callbackScope(context->GetIsolate(), Nan::New(), {0, 0}); + + std::unique_lock lock(*jsThreadCallbackMutex); + // get the next callback to run + JSThreadCallback jsThreadCallback = jsThreadCallbackQueue.front(); + + lock.unlock(); + jsThreadCallback(); + lock.lock(); + + // pop the queue, and if necessary, re-trigger RunLoopCallbacks + jsThreadCallbackQueue.pop(); + if (!jsThreadCallbackQueue.empty()) { + uv_async_send(&jsThreadCallbackAsync); + } + + // if there is no ongoing work / completion processing, node doesn't need + // to be prevented from terminating + if (jsThreadCallback.isWork) { + std::lock_guard orchestratorLock(*orchestratorJobMutex); + workInProgressCount--; + if (!workInProgressCount) { + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + } } } + + ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) + : impl(new ThreadPoolImpl(numberOfThreads, loop)) + {} + + ThreadPool::~ThreadPool() {} + + void ThreadPool::QueueWorker(nodegit::AsyncWorker *worker) { + impl->QueueWorker(worker); + } + + void ThreadPool::PostCallbackEvent(OnPostCallbackFn onPostCallback) { + Executor::PostCallbackEvent(onPostCallback); + } + + Nan::AsyncResource *ThreadPool::GetCurrentAsyncResource() { + return Executor::GetCurrentAsyncResource(); + } + + void ThreadPool::InitializeGlobal() { + git_custom_tls_set_callbacks( + Executor::RetrieveTLSForLibgit2ChildThread, + Executor::SetTLSForLibgit2ChildThread, + Executor::TeardownTLSOnLibgit2ChildThread + ); + } } diff --git a/generate/templates/manual/src/wrapper.cc b/generate/templates/manual/src/wrapper.cc index ffd9bc584..9daae7848 100644 --- a/generate/templates/manual/src/wrapper.cc +++ b/generate/templates/manual/src/wrapper.cc @@ -16,18 +16,20 @@ Wrapper::Wrapper(void *raw) { this->raw = raw; } -void Wrapper::InitializeComponent(Local target) { +void Wrapper::InitializeComponent(Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; - Local tpl = Nan::New(JSNewFunction); + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(Nan::New("Wrapper").ToLocalChecked()); - Nan::SetPrototypeMethod(tpl, "toBuffer", ToBuffer); + Nan::SetPrototypeMethod(tpl, "toBuffer", ToBuffer, nodegitExternal); - constructor_template.Reset(tpl); - Nan::Set(target, Nan::New("Wrapper").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked()); + Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("Wrapper::Template", constructor_template); + Nan::Set(target, Nan::New("Wrapper").ToLocalChecked(), constructor_template); } NAN_METHOD(Wrapper::JSNewFunction) { @@ -47,8 +49,9 @@ Local Wrapper::New(const void *raw) { Local argv[1] = { Nan::New((void *)raw) }; Local instance; - Local constructorHandle = Nan::New(constructor_template); - instance = Nan::NewInstance(Nan::GetFunction(constructorHandle).ToLocalChecked(), 1, argv).ToLocalChecked(); + nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); + Local constructor_template = nodegitContext->GetFromPersistent("Wrapper::Template").As(); + instance = Nan::NewInstance(constructor_template, 1, argv).ToLocalChecked(); return scope.Escape(instance); } @@ -75,6 +78,3 @@ NAN_METHOD(Wrapper::ToBuffer) { info.GetReturnValue().Set(nodeBuffer); } - - -Nan::Persistent Wrapper::constructor_template; diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 9a1ce26fe..b0ad8ab4b 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -74,25 +74,29 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endif%} {%endeach%} - AsyncLibgit2QueueWorker(worker); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); return; } +nodegit::LockMaster {{ cppClassName }}::{{ cppFunctionName }}Worker::AcquireLocks() { + nodegit::LockMaster lockMaster( + /*asyncAction: */true + {%each args|argsInfo as arg %} + {%if arg.cType|isPointer%} + {%if not arg.cType|isDoublePointer%} + ,baton->{{ arg.name }} + {%endif%} + {%endif%} + {%endeach%} + ); + + return lockMaster; +} + void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { git_error_clear(); - { - LockMaster lockMaster( - /*asyncAction: */true - {%each args|argsInfo as arg %} - {%if arg.cType|isPointer%} - {%if not arg.cType|isDoublePointer%} - ,baton->{{ arg.name }} - {%endif%} - {%endif%} - {%endeach%} - ); - {%if .|hasReturnType %} {{ return.cType }} result = {{ cFunctionName }}( {%else%} @@ -123,7 +127,6 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { baton->result = result; {%endif%} - } } void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index c3810371c..8bbc2ecd0 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -49,8 +49,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void }; Nan::TryCatch tryCatch; - // TODO This should take an async_resource, but we will need to figure out how to pipe the correct context into this - Nan::MaybeLocal maybeResult = Nan::Call(*callback, {{ cbFunction.args|callbackArgsCount }}, argv); + Nan::MaybeLocal maybeResult = (*callback)(baton->GetAsyncResource(), {{ cbFunction.args|callbackArgsCount }}, argv); + v8::Local result; if (!maybeResult.IsEmpty()) { result = maybeResult.ToLocalChecked(); @@ -88,7 +88,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void baton->Done(); } -void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_promiseCompleted(bool isFulfilled, AsyncBaton *_baton, v8::Local result) { +void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result) { Nan::HandleScope scope; {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = static_cast<{{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton*>(_baton); diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 35b583bdc..0b0dec1ee 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -144,7 +144,7 @@ baton->ExecuteAsync({{ field.name }}_async); delete baton; } else { - baton->ExecuteAsync({{ field.name }}_async, deleteBaton); + baton->ExecuteAsync({{ field.name }}_async, nodegit::deleteBaton); } return; {% else %} @@ -158,7 +158,7 @@ delete baton; } else { result = baton->defaultResult; - baton->ExecuteAsync({{ field.name }}_async, deleteBaton); + baton->ExecuteAsync({{ field.name }}_async, nodegit::deleteBaton); } return result; {% endif %} @@ -205,8 +205,11 @@ Nan::TryCatch tryCatch; - // TODO This should take an async_resource, but we will need to figure out how to pipe the correct context into this - Nan::MaybeLocal maybeResult = Nan::Call(*(instance->{{ field.name }}.GetCallback()), {{ field.args|callbackArgsCount }}, argv); + Nan::MaybeLocal maybeResult = (*(instance->{{ field.name }}.GetCallback()))( + baton->GetAsyncResource(), + {{ field.args|callbackArgsCount }}, + argv + ); v8::Local result; if (!maybeResult.IsEmpty()) { result = maybeResult.ToLocalChecked(); @@ -247,7 +250,7 @@ {% endif %} } - void {{ cppClassName }}::{{ field.name }}_promiseCompleted(bool isFulfilled, AsyncBaton *_baton, v8::Local result) { + void {{ cppClassName }}::{{ field.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result) { Nan::HandleScope scope; {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(_baton); diff --git a/generate/templates/partials/sync_function.cc b/generate/templates/partials/sync_function.cc index 4a76463ed..3e6b6cc6a 100644 --- a/generate/templates/partials/sync_function.cc +++ b/generate/templates/partials/sync_function.cc @@ -34,7 +34,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { git_error_clear(); { // lock master scope start - LockMaster lockMaster( + nodegit::LockMaster lockMaster( /*asyncAction: */false {%each args|argsInfo as arg %} {%if arg.cType|isPointer%} diff --git a/generate/templates/partials/traits.h b/generate/templates/partials/traits.h index 3e63e42e8..c708c965b 100644 --- a/generate/templates/partials/traits.h +++ b/generate/templates/partials/traits.h @@ -17,6 +17,7 @@ struct {{ cppClassName }}Traits { {% endif %} } + static std::string className() { return "{{ cppClassName }}"; }; static const bool isSingleton = {{ isSingleton | toBool }}; static const bool isFreeable = {{ freeFunctionName | toBool}}; static void free({{ cType }} *raw) { diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 52620e4bb..2f9acf366 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -47,8 +47,10 @@ }, "sources": [ "src/async_baton.cc", + "src/async_worker.cc", "src/lock_master.cc", "src/reference_counter.cc", + "src/thread_pool.cc", "src/nodegit.cc", "src/init_ssh2.cc", "src/promise_completion.cc", @@ -59,9 +61,8 @@ "src/convenient_hunk.cc", "src/filter_registry.cc", "src/git_buf_converter.cc", - "src/semaphore.cc", "src/str_array_converter.cc", - "src/thread_pool.cc", + "src/context.cc", {% each %} {% if type != "enum" %} "src/{{ name }}.cc", @@ -113,7 +114,7 @@ "GCC_ENABLE_CPP_EXCEPTIONS": "YES", "MACOSX_DEPLOYMENT_TARGET": "10.9", 'CLANG_CXX_LIBRARY': 'libc++', - 'CLANG_CXX_LANGUAGE_STANDARD':'c++11', + 'CLANG_CXX_LANGUAGE_STANDARD':'c++14', "WARNING_CFLAGS": [ "-Wno-unused-variable", @@ -165,7 +166,7 @@ [ "OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { "cflags": [ - "-std=c++11" + "-std=c++14" ] } ], diff --git a/generate/templates/templates/class_content.cc b/generate/templates/templates/class_content.cc index dbac5e097..275e4f8b0 100644 --- a/generate/templates/templates/class_content.cc +++ b/generate/templates/templates/class_content.cc @@ -13,7 +13,6 @@ extern "C" { #include "../include/functions/copy.h" #include "../include/{{ filename }}.h" #include "nodegit_wrapper.cc" -#include "../include/async_libgit2_queue_worker.h" {% each dependencies as dependency %} #include "{{ dependency }}" @@ -43,10 +42,11 @@ using namespace node; {% endeach %} } - void {{ cppClassName }}::InitializeComponent(v8::Local target) { + void {{ cppClassName }}::InitializeComponent(v8::Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; - v8::Local tpl = Nan::New(JSNewFunction); + v8::Local nodegitExternal = Nan::New(nodegitContext); + v8::Local tpl = Nan::New(JSNewFunction, nodegitExternal); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); @@ -54,40 +54,41 @@ using namespace node; {% each functions as function %} {% if not function.ignore %} {% if function.isPrototypeMethod %} - Nan::SetPrototypeMethod(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}); + Nan::SetPrototypeMethod(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}, nodegitExternal); {% else %} - Nan::SetMethod(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}); + Nan::SetMethod(tpl, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}, nodegitExternal); {% endif %} {% endif %} {% endeach %} {% each fields as field %} {% if not field.ignore %} - Nan::SetPrototypeMethod(tpl, "{{ field.jsFunctionName }}", {{ field.cppFunctionName }}); + Nan::SetPrototypeMethod(tpl, "{{ field.jsFunctionName }}", {{ field.cppFunctionName }}, nodegitExternal); {% endif %} {% endeach %} InitializeTemplate(tpl); - v8::Local _constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); - constructor_template.Reset(_constructor_template); - Nan::Set(target, Nan::New("{{ jsClassName }}").ToLocalChecked(), _constructor_template); + v8::Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("{{ cppClassName }}::Template", constructor_template); + Nan::Set(target, Nan::New("{{ jsClassName }}").ToLocalChecked(), constructor_template); } {% else %} - void {{ cppClassName }}::InitializeComponent(v8::Local target) { + void {{ cppClassName }}::InitializeComponent(v8::Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; + Local nodegitExternal = Nan::New(nodegitContext); {% if functions|hasFunctionOnRootProto %} - v8::Local object = Nan::New({{ functions|getCPPFunctionForRootProto }}); + v8::Local object = Nan::New({{ functions|getCPPFunctionForRootProto }}, nodegitExternal); {% else %} v8::Local object = Nan::New(); {% endif %} {% each functions as function %} {% if not function.ignore %} - Nan::SetMethod(object, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}); + Nan::SetMethod(object, "{{ function.jsFunctionName }}", {{ function.cppFunctionName }}, nodegitExternal); {% endif %} {% endeach %} diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index 746692e9e..ca394278f 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -8,6 +8,9 @@ #include #include "async_baton.h" +#include "async_worker.h" +#include "context.h" +#include "lock_master.h" #include "nodegit_wrapper.h" #include "promise_completion.h" #include "reference_counter.h" @@ -55,7 +58,7 @@ class {{ cppClassName }} : public friend class NodeGitWrapper<{{ cppClassName }}Traits>; {%endif %} public: - static void InitializeComponent (v8::Local target); + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); {% each functions as function %} {% if not function.ignore %} @@ -71,14 +74,15 @@ class {{ cppClassName }} : public ); static void {{ function.cppFunctionName }}_{{ arg.name }}_async(void *baton); - static void {{ function.cppFunctionName }}_{{ arg.name }}_promiseCompleted(bool isFulfilled, AsyncBaton *_baton, v8::Local result); - struct {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton : public AsyncBatonWithResult<{{ arg.return.type }}> { + static void {{ function.cppFunctionName }}_{{ arg.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); + class {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ arg.return.type }}> { + public: {% each arg.args|argsInfo as cbArg %} {{ cbArg.cType }} {{ cbArg.name }}; {% endeach %} {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton(const {{ arg.return.type }} &defaultResult) - : AsyncBatonWithResult<{{ arg.return.type }}>(defaultResult) { + : nodegit::AsyncBatonWithResult<{{ arg.return.type }}>(defaultResult) { } }; {% endif %} @@ -104,16 +108,6 @@ class {{ cppClassName }} : public ~{{ cppClassName }}(); {%endif%} - {% each functions as function %} - {% if not function.ignore %} - {% each function.args as arg %} - {% if arg.saveArg %} - Nan::Persistent {{ function.cppFunctionName }}_{{ arg.name }}; - {% endif %} - {% endeach %} - {% endif %} - {% endeach %} - {%each fields as field%} {%if not field.ignore%} static NAN_METHOD({{ field.cppFunctionName }}); @@ -138,16 +132,17 @@ class {{ cppClassName }} : public {%endif%} {%endeach%} }; - class {{ function.cppFunctionName }}Worker : public Nan::AsyncWorker { + class {{ function.cppFunctionName }}Worker : public nodegit::AsyncWorker { public: {{ function.cppFunctionName }}Worker( {{ function.cppFunctionName }}Baton *_baton, Nan::Callback *callback - ) : Nan::AsyncWorker(callback) + ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:{{ cppClassName }}:{{ function.cppFunctionName }}") , baton(_baton) {}; ~{{ function.cppFunctionName }}Worker() {}; void Execute(); void HandleOKCallback(); + nodegit::LockMaster AcquireLocks(); private: {{ function.cppFunctionName }}Baton *baton; diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 5d16fa3bb..e174ae27b 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -11,6 +11,7 @@ #include "../include/init_ssh2.h" #include "../include/lock_master.h" #include "../include/nodegit.h" +#include "../include/context.h" #include "../include/wrapper.h" #include "../include/promise_completion.h" #include "../include/functions/copy.h" @@ -66,9 +67,6 @@ void OpenSSL_ThreadSetup() { CRYPTO_THREADID_set_callback(OpenSSL_IDCallback); } -// TODO initialize a thread pool per context. Replace uv_default_loop() with node::GetCurrentEventLoop(isolate); -ThreadPool libgit2ThreadPool(10, uv_default_loop()); - static std::once_flag libraryInitializedFlag; static std::mutex libraryInitializationMutex; @@ -84,24 +82,30 @@ NAN_MODULE_INIT(init) { init_ssh2(); // Initialize libgit2. git_libgit2_init(); + + // Register thread pool with libgit2 + nodegit::ThreadPool::InitializeGlobal(); }); } Nan::HandleScope scope; + Local context = Nan::GetCurrentContext(); + Isolate *isolate = context->GetIsolate(); + nodegit::Context *nodegitContext = new nodegit::Context(isolate); - Wrapper::InitializeComponent(target); - PromiseCompletion::InitializeComponent(); + Wrapper::InitializeComponent(target, nodegitContext); + PromiseCompletion::InitializeComponent(nodegitContext); {% each %} {% if type != "enum" %} - {{ cppClassName }}::InitializeComponent(target); + {{ cppClassName }}::InitializeComponent(target, nodegitContext); {% endif %} {% endeach %} - ConvenientHunk::InitializeComponent(target); - ConvenientPatch::InitializeComponent(target); - GitFilterRegistry::InitializeComponent(target); + ConvenientHunk::InitializeComponent(target, nodegitContext); + ConvenientPatch::InitializeComponent(target, nodegitContext); + GitFilterRegistry::InitializeComponent(target, nodegitContext); - LockMaster::InitializeContext(); + nodegit::LockMaster::InitializeContext(); } NODE_MODULE(nodegit, init) diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index 0450447ac..a7db84d53 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -106,10 +106,11 @@ void {{ cppClassName }}::ConstructFields() { {% endeach %} } -void {{ cppClassName }}::InitializeComponent(v8::Local target) { +void {{ cppClassName }}::InitializeComponent(Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; - v8::Local tpl = Nan::New(JSNewFunction); + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); @@ -117,16 +118,16 @@ void {{ cppClassName }}::InitializeComponent(v8::Local target) { {% each fields as field %} {% if not field.ignore %} {% if not field | isPayload %} - Nan::SetAccessor(tpl->InstanceTemplate(), Nan::New("{{ field.jsFunctionName }}").ToLocalChecked(), Get{{ field.cppFunctionName}}, Set{{ field.cppFunctionName}}); + Nan::SetAccessor(tpl->InstanceTemplate(), Nan::New("{{ field.jsFunctionName }}").ToLocalChecked(), Get{{ field.cppFunctionName}}, Set{{ field.cppFunctionName}}, nodegitExternal); {% endif %} {% endif %} {% endeach %} InitializeTemplate(tpl); - v8::Local _constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); - constructor_template.Reset(_constructor_template); - Nan::Set(target, Nan::New("{{ jsClassName }}").ToLocalChecked(), _constructor_template); + v8::Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("{{ cppClassName }}::Template", constructor_template); + Nan::Set(target, Nan::New("{{ jsClassName }}").ToLocalChecked(), constructor_template); } {% partial fieldAccessors . %} diff --git a/generate/templates/templates/struct_header.h b/generate/templates/templates/struct_header.h index 568bcfc91..a80e7a5cf 100644 --- a/generate/templates/templates/struct_header.h +++ b/generate/templates/templates/struct_header.h @@ -7,7 +7,9 @@ #include #include "async_baton.h" +#include "async_worker.h" #include "callback_wrapper.h" +#include "context.h" #include "reference_counter.h" #include "nodegit_wrapper.h" @@ -37,7 +39,7 @@ class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { friend class NodeGitWrapper<{{ cppClassName }}Traits>; public: {{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner = v8::Local()); - static void InitializeComponent (v8::Local target); + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); {% each fields as field %} {% if not field.ignore %} @@ -52,25 +54,27 @@ class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { ); static void {{ field.name }}_async(void *baton); - static void {{ field.name }}_promiseCompleted(bool isFulfilled, AsyncBaton *_baton, v8::Local result); + static void {{ field.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); {% if field.return.type == 'void' %} - struct {{ field.name|titleCase }}Baton : public AsyncBatonWithNoResult { + class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithNoResult { + public: {% each field.args|argsInfo as arg %} {{ arg.cType }} {{ arg.name }}; {% endeach %} {{ field.name|titleCase }}Baton() - : AsyncBatonWithNoResult() { + : nodegit::AsyncBatonWithNoResult() { } }; {% else %} - struct {{ field.name|titleCase }}Baton : public AsyncBatonWithResult<{{ field.return.type }}> { + class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ field.return.type }}> { + public: {% each field.args|argsInfo as arg %} {{ arg.cType }} {{ arg.name }}; {% endeach %} {{ field.name|titleCase }}Baton(const {{ field.return.type }} &defaultResult) - : AsyncBatonWithResult<{{ field.return.type }}>(defaultResult) { + : nodegit::AsyncBatonWithResult<{{ field.return.type }}>(defaultResult) { } }; {% endif %} From 42e266ed124b1524acaa693a499c08f506db543d Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 25 Aug 2020 16:49:31 -0700 Subject: [PATCH 218/545] Skeleton shutdown logic for thread pool and cancellation of work --- .../templates/manual/include/async_baton.h | 10 +- .../templates/manual/include/async_worker.h | 10 ++ generate/templates/manual/include/context.h | 10 +- .../templates/manual/include/thread_pool.h | 6 +- generate/templates/manual/src/async_baton.cc | 13 +- generate/templates/manual/src/async_worker.cc | 7 + generate/templates/manual/src/context.cc | 37 +++-- generate/templates/manual/src/thread_pool.cc | 146 +++++++++++++++--- generate/templates/partials/async_function.cc | 2 + .../templates/partials/callback_helpers.cc | 6 +- .../templates/partials/field_accessors.cc | 11 +- generate/templates/templates/class_header.h | 1 + generate/templates/templates/struct_header.h | 1 + 13 files changed, 205 insertions(+), 55 deletions(-) diff --git a/generate/templates/manual/include/async_baton.h b/generate/templates/manual/include/async_baton.h index b9df1cfec..54f580f94 100644 --- a/generate/templates/manual/include/async_baton.h +++ b/generate/templates/manual/include/async_baton.h @@ -28,7 +28,7 @@ namespace nodegit { Nan::AsyncResource *GetAsyncResource(); protected: - void ExecuteAsyncPerform(AsyncCallback asyncCallback, CompletionCallback onCompletion); + void ExecuteAsyncPerform(AsyncCallback asyncCallback, AsyncCallback asyncCancelCb, CompletionCallback onCompletion); private: void SignalCompletion(); @@ -53,17 +53,17 @@ namespace nodegit { : defaultResult(defaultResult) { } - ResultT ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::CompletionCallback onCompletion = nullptr) { + ResultT ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::AsyncCallback asyncCancelCb, AsyncBaton::CompletionCallback onCompletion = nullptr) { result = 0; - ExecuteAsyncPerform(asyncCallback, onCompletion); + ExecuteAsyncPerform(asyncCallback, asyncCancelCb, onCompletion); return result; } }; class AsyncBatonWithNoResult : public AsyncBaton { public: - void ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::CompletionCallback onCompletion = nullptr) { - ExecuteAsyncPerform(asyncCallback, onCompletion); + void ExecuteAsync(AsyncBaton::AsyncCallback asyncCallback, AsyncBaton::AsyncCallback asyncCancelCb, AsyncBaton::CompletionCallback onCompletion = nullptr) { + ExecuteAsyncPerform(asyncCallback, asyncCancelCb, onCompletion); } }; } diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index fc10893e6..77159a605 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -9,8 +9,18 @@ namespace nodegit { public: AsyncWorker(Nan::Callback *callback, const char *resourceName); + // This must be implemented by every async worker + // so that the thread pool can lock separately + // from the execute method in the AsyncWorker virtual nodegit::LockMaster AcquireLocks() = 0; + // Ensure that the `HandleErrorCallback` will be called + // when the AsyncWork is complete + void Cancel(); + + // Retrieves the async resource attached to this AsyncWorker + // This is used to inform libgit2 callbacks what asyncResource + // they should use when working with any javascript Nan::AsyncResource *GetAsyncResource(); }; } diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 8b2ef66be..1027622ec 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -15,15 +15,17 @@ namespace nodegit { public: Context(v8::Isolate *isolate); - void QueueWorker(nodegit::AsyncWorker *worker); + ~Context(); - void SaveToPersistent(std::string key, const v8::Local &value); + static Context *GetCurrentContext(); v8::Local GetFromPersistent(std::string key); - static Context *GetCurrentContext(); + void QueueWorker(nodegit::AsyncWorker *worker); - ~Context(); + void SaveToPersistent(std::string key, const v8::Local &value); + + void ShutdownThreadPool(); private: v8::Isolate *isolate; diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 5baf4e743..74ed09bdf 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -14,7 +14,7 @@ namespace nodegit { class ThreadPool { public: typedef std::function Callback; - typedef std::function QueueCallbackFn; + typedef std::function QueueCallbackFn; typedef std::function OnPostCallbackFn; // Initializes thread pool and spins up the requested number of threads @@ -41,6 +41,10 @@ namespace nodegit { // Called once at libgit2 initialization to setup contracts with libgit2 static void InitializeGlobal(); + // Will wait for all threads to terminate before returning + // It will also clean up any resources that the thread pool is keeping alive + void Shutdown(); + private: std::unique_ptr impl; }; diff --git a/generate/templates/manual/src/async_baton.cc b/generate/templates/manual/src/async_baton.cc index da99b9e26..2bcd0ea82 100644 --- a/generate/templates/manual/src/async_baton.cc +++ b/generate/templates/manual/src/async_baton.cc @@ -23,10 +23,13 @@ namespace nodegit { return asyncResource; } - void AsyncBaton::ExecuteAsyncPerform(AsyncCallback asyncCallback, CompletionCallback onCompletion) { + void AsyncBaton::ExecuteAsyncPerform(AsyncCallback asyncCallback, AsyncCallback asyncCancelCb, CompletionCallback onCompletion) { auto jsCallback = [asyncCallback, this]() { asyncCallback(this); }; + auto cancelCallback = [asyncCancelCb, this]() { + asyncCancelCb(this); + }; if (onCompletion) { this->onCompletion = [this, onCompletion]() { @@ -34,11 +37,11 @@ namespace nodegit { }; ThreadPool::PostCallbackEvent( - [this, jsCallback]( + [this, jsCallback, cancelCallback]( ThreadPool::QueueCallbackFn queueCallback, ThreadPool::Callback callbackCompleted ) -> ThreadPool::Callback { - queueCallback(jsCallback); + queueCallback(jsCallback, cancelCallback); callbackCompleted(); return []() {}; @@ -46,13 +49,13 @@ namespace nodegit { ); } else { ThreadPool::PostCallbackEvent( - [this, jsCallback]( + [this, jsCallback, cancelCallback]( ThreadPool::QueueCallbackFn queueCallback, ThreadPool::Callback callbackCompleted ) -> ThreadPool::Callback { this->onCompletion = callbackCompleted; - queueCallback(jsCallback); + queueCallback(jsCallback, cancelCallback); return std::bind(&AsyncBaton::SignalCompletion, this); } diff --git a/generate/templates/manual/src/async_worker.cc b/generate/templates/manual/src/async_worker.cc index 65c7a4e1c..bc7162a84 100644 --- a/generate/templates/manual/src/async_worker.cc +++ b/generate/templates/manual/src/async_worker.cc @@ -5,6 +5,13 @@ namespace nodegit { : Nan::AsyncWorker(callback, resourceName) {} + void AsyncWorker::Cancel() { + // We use Nan::AsyncWorker's ErrorMessage flow + // to trigger `HandleErrorCallback` for cancellation + // of AsyncWork + SetErrorMessage("SHUTTING DOWN"); + } + Nan::AsyncResource *AsyncWorker::GetAsyncResource() { return async_resource; } diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index b5454b6e4..16a8e6267 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -1,6 +1,16 @@ #include "../include/context.h" namespace nodegit { + std::map Context::contexts; + + static void CleanupContext(void *data) { + Context *context = static_cast(data); + + context->ShutdownThreadPool(); + + delete context; + } + Context::Context(v8::Isolate *isolate) : isolate(isolate), threadPool(10, node::GetCurrentEventLoop(isolate)) { @@ -8,20 +18,18 @@ namespace nodegit { v8::Local storage = Nan::New(); persistentStorage.Reset(storage); contexts[isolate] = this; + node::AddEnvironmentCleanupHook(isolate, CleanupContext, this); } Context::~Context() { contexts.erase(isolate); } - void Context::QueueWorker(nodegit::AsyncWorker *worker) { - threadPool.QueueWorker(worker); - } - - void Context::SaveToPersistent(std::string key, const v8::Local &value) { + Context *Context::GetCurrentContext() { Nan::HandleScope scope; - v8::Local storage = Nan::New(persistentStorage); - Nan::Set(storage, Nan::New(key).ToLocalChecked(), value); + v8::Local context = Nan::GetCurrentContext(); + v8::Isolate *isolate = context->GetIsolate(); + return contexts[isolate]; } v8::Local Context::GetFromPersistent(std::string key) { @@ -31,12 +39,17 @@ namespace nodegit { return scope.Escape(value.ToLocalChecked()); } - Context *Context::GetCurrentContext() { + void Context::QueueWorker(nodegit::AsyncWorker *worker) { + threadPool.QueueWorker(worker); + } + + void Context::SaveToPersistent(std::string key, const v8::Local &value) { Nan::HandleScope scope; - v8::Local context = Nan::GetCurrentContext(); - v8::Isolate *isolate = context->GetIsolate(); - return contexts[isolate]; + v8::Local storage = Nan::New(persistentStorage); + Nan::Set(storage, Nan::New(key).ToLocalChecked(), value); } - std::map Context::contexts; + void Context::ShutdownThreadPool() { + threadPool.Shutdown(); + } } diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 771e95074..4cf5a23f6 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -218,7 +218,7 @@ namespace nodegit { nodegit::AsyncWorker *worker; }; - typedef std::function QueueCallbackOnJSThreadFn; + typedef std::function QueueCallbackOnJSThreadFn; typedef std::function()> TakeNextJobFn; private: @@ -297,7 +297,7 @@ namespace nodegit { void Orchestrator::OrchestratorImpl::RunJobLoop() { for ( ; ; ) { - auto job = takeNextJob(); // takes jobs from the threadpool queue + auto job = takeNextJob(); switch (job->type) { case Job::Type::SHUTDOWN: { ScheduleShutdownTaskOnExecutor(); @@ -327,8 +327,8 @@ namespace nodegit { LockMaster::TemporaryUnlock temporaryUnlock; auto onCompletedCallback = (*callbackEvent)( - [this](ThreadPool::Callback callback) { - queueCallbackOnJSThread(callback, false); + [this](ThreadPool::Callback callback, ThreadPool::Callback cancelCallback) { + queueCallbackOnJSThread(callback, cancelCallback, false); }, [callbackCondition, callbackMutex, &hasCompleted]() { std::lock_guard lock(*callbackMutex); @@ -347,6 +347,11 @@ namespace nodegit { worker->WorkComplete(); worker->Destroy(); }, + [worker]() { + worker->Cancel(); + worker->WorkComplete(); + worker->Destroy(); + }, true ); } @@ -354,6 +359,7 @@ namespace nodegit { } } + // TODO add a cancel callback to `OnPostCallbackFn` which can be used on nodegit terminate void Orchestrator::OrchestratorImpl::PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback) { std::lock_guard lock(*executorEventsMutex); std::shared_ptr callbackEvent(new Executor::CallbackEvent(onPostCallback)); @@ -417,7 +423,7 @@ namespace nodegit { std::shared_ptr TakeNextJob(); - void QueueCallbackOnJSThread(ThreadPool::Callback callback, bool isWork); + void QueueCallbackOnJSThread(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork); static void RunJSThreadCallbacksFromOrchestrator(uv_async_t *handle); @@ -425,24 +431,33 @@ namespace nodegit { static void RunLoopCallbacks(uv_async_t *handle); + void Shutdown(); + private: + bool isMarkedForDeletion; + struct JSThreadCallback { - JSThreadCallback(ThreadPool::Callback callback, bool isWork) - : isWork(isWork), callback(callback) + JSThreadCallback(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork) + : isWork(isWork), callback(callback), cancelCallback(cancelCallback) {} JSThreadCallback() - : isWork(false), callback(nullptr) + : isWork(false), callback(nullptr), cancelCallback(nullptr) {} - void operator()() { + void performCallback() { callback(); } + void cancel() { + cancelCallback(); + } + bool isWork; private: ThreadPool::Callback callback; + ThreadPool::Callback cancelCallback; }; void RunLoopCallbacks(); @@ -461,7 +476,8 @@ namespace nodegit { }; ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop) - : orchestratorJobMutex(new std::mutex), + : isMarkedForDeletion(false), + orchestratorJobMutex(new std::mutex), jsThreadCallbackMutex(new std::mutex) { uv_async_init(loop, &jsThreadCallbackAsync, RunLoopCallbacks); @@ -472,7 +488,7 @@ namespace nodegit { for (int i = 0; i < numberOfThreads; i++) { orchestrators.emplace_back( - std::bind(&ThreadPoolImpl::QueueCallbackOnJSThread, this, _1, _2), + std::bind(&ThreadPoolImpl::QueueCallbackOnJSThread, this, _1, _2, _3), std::bind(&ThreadPoolImpl::TakeNextJob, this) ); } @@ -483,8 +499,7 @@ namespace nodegit { // there is work on the thread pool - reference the handle so // node doesn't terminate uv_ref((uv_handle_t *)&jsThreadCallbackAsync); - std::shared_ptr job(new Orchestrator::AsyncWorkJob(worker)); - orchestratorJobQueue.emplace(job); + orchestratorJobQueue.emplace(new Orchestrator::AsyncWorkJob(worker)); workInProgressCount++; orchestratorJobCondition.notify_one(); } @@ -504,11 +519,21 @@ namespace nodegit { return orchestratorJob; } - void ThreadPoolImpl::QueueCallbackOnJSThread(ThreadPool::Callback callback, bool isWork) { - // push the callback into the queue - std::lock_guard lock(*jsThreadCallbackMutex); + void ThreadPoolImpl::QueueCallbackOnJSThread(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork) { + std::unique_lock lock(*jsThreadCallbackMutex); + // When the threadpool is shutting down, we want to free up the executors to also shutdown + // that means that we need to cancel all non-work callbacks as soon as we see them and + // we know that we are shutting down + if (isMarkedForDeletion && !isWork) { + // we don't know how long the cancelCallback will take, and it certainly doesn't need the lock + // while we're running it, so unlock it immediately. + lock.unlock(); + cancelCallback(); + return; + } + bool queueWasEmpty = jsThreadCallbackQueue.empty(); - jsThreadCallbackQueue.emplace(callback, isWork); + jsThreadCallbackQueue.emplace(callback, cancelCallback, isWork); // we only trigger RunLoopCallbacks via the jsThreadCallbackAsync handle if the queue // was empty. Otherwise, we depend on RunLoopCallbacks to re-trigger itself if (queueWasEmpty) { @@ -520,9 +545,7 @@ namespace nodegit { static_cast(handle->data)->RunLoopCallbacks(); } - // TODO every time this is called, if there is a cleanup operation in progress - // for the current context and there is workInProgress, we should ping the - // cleanup async handle which is not created yet + // NOTE this should theoretically never be triggered during a cleanup operation void ThreadPoolImpl::RunLoopCallbacks() { Nan::HandleScope scope; v8::Local context = Nan::GetCurrentContext(); @@ -531,13 +554,12 @@ namespace nodegit { std::unique_lock lock(*jsThreadCallbackMutex); // get the next callback to run JSThreadCallback jsThreadCallback = jsThreadCallbackQueue.front(); + jsThreadCallbackQueue.pop(); lock.unlock(); - jsThreadCallback(); + jsThreadCallback.performCallback(); lock.lock(); - // pop the queue, and if necessary, re-trigger RunLoopCallbacks - jsThreadCallbackQueue.pop(); if (!jsThreadCallbackQueue.empty()) { uv_async_send(&jsThreadCallbackAsync); } @@ -553,6 +575,80 @@ namespace nodegit { } } + void ThreadPoolImpl::Shutdown() { + std::queue> cancelledJobs; + std::queue cancelledCallbacks; + { + std::unique_lock orchestratorLock(*orchestratorJobMutex, std::defer_lock); + std::unique_lock jsThreadLock(*jsThreadCallbackMutex, std::defer_lock); + std::lock(orchestratorLock, jsThreadLock); + + // Once we've marked for deletion, we will start cancelling all callbacks + // when an attempt to queue a callback is made + isMarkedForDeletion = true; + // We want to grab all of the jobs that have been queued and run their cancel routines + // so that we can clean up their resources + orchestratorJobQueue.swap(cancelledJobs); + // We also want to grab all callbacks that have been queued so that we can + // run their cancel routines, this will help terminate the async workers + // that are currently being executed complete so that the threads + // running them can exit cleanly + jsThreadCallbackQueue.swap(cancelledCallbacks); + // Pushing a ShutdownJob into the queue will instruct all threads + // to start their shutdown process when they see the job is available. + orchestratorJobQueue.emplace(new Orchestrator::ShutdownJob); + + if (workInProgressCount) { + // unref the jsThreadCallback for all work in progress + // it will not be used after this function has completed + while (workInProgressCount--) { + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + } + } + + orchestratorJobCondition.notify_all(); + } + + Nan::HandleScope scope; + v8::Local context = Nan::GetCurrentContext(); + node::CallbackScope callbackScope(context->GetIsolate(), Nan::New(), {0, 0}); + + while (cancelledJobs.size()) { + std::shared_ptr cancelledJob = cancelledJobs.front(); + std::shared_ptr asyncWorkJob = std::static_pointer_cast(cancelledJob); + + asyncWorkJob->worker->Cancel(); + asyncWorkJob->worker->WorkComplete(); + asyncWorkJob->worker->Destroy(); + + cancelledJobs.pop(); + } + + // We need to cancel all callbacks that were scheduled before the shutdown + // request went through. This will help finish any work any currently operating + // executors are undertaking + while (cancelledCallbacks.size()) { + JSThreadCallback cancelledCallback = cancelledCallbacks.front(); + cancelledCallback.cancel(); + cancelledCallbacks.pop(); + } + + std::for_each(orchestrators.begin(), orchestrators.end(), [](Orchestrator &orchestrator) { + orchestrator.WaitForThreadClose(); + }); + + // After we have completed waiting for all threads to close + // we will need to cleanup the rest of the completion callbacks + // from workers that were still running when the shutdown signal + // was sent + std::lock_guard jsThreadLock(*jsThreadCallbackMutex); + while (jsThreadCallbackQueue.size()) { + JSThreadCallback jsThreadCallback = jsThreadCallbackQueue.front(); + jsThreadCallback.cancel(); + jsThreadCallbackQueue.pop(); + } + } + ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) : impl(new ThreadPoolImpl(numberOfThreads, loop)) {} @@ -571,6 +667,10 @@ namespace nodegit { return Executor::GetCurrentAsyncResource(); } + void ThreadPool::Shutdown() { + impl->Shutdown(); + } + void ThreadPool::InitializeGlobal() { git_custom_tls_set_callbacks( Executor::RetrieveTLSForLibgit2ChildThread, diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index b0ad8ab4b..a48629385 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -27,6 +27,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%if arg.payload.globalPayload %} globalPayload->{{ arg.name }} = NULL; {%else%} + // NOTE this is a dead path baton->{{ arg.payload.name }} = NULL; {%endif%} } @@ -35,6 +36,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%if arg.payload.globalPayload %} globalPayload->{{ arg.name }} = new Nan::Callback(info[{{ arg.jsArg }}].As()); {%else%} + // NOTE this is a dead path baton->{{ arg.payload.name }} = new Nan::Callback(info[{{ arg.jsArg }}].As()); {%endif%} } diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index 8bbc2ecd0..8759d26b1 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -12,7 +12,11 @@ baton.{{ arg.name }} = {{ arg.name }}; {% endeach %} - return baton.ExecuteAsync({{ cppFunctionName }}_{{ cbFunction.name }}_async); + return baton.ExecuteAsync({{ cppFunctionName }}_{{ cbFunction.name }}_async, {{ cppFunctionName }}_{{ cbFunction.name }}_cancelAsync); +} + +void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_cancelAsync(void *untypedBaton) { + // TODO decide between defaultResult and cancellation on a per callback basis } void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void *untypedBaton) { diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 0b0dec1ee..0995bb384 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -141,10 +141,10 @@ if (instance->{{ field.name }}.WillBeThrottled()) { delete baton; } else if (instance->{{ field.name }}.ShouldWaitForResult()) { - baton->ExecuteAsync({{ field.name }}_async); + baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync); delete baton; } else { - baton->ExecuteAsync({{ field.name }}_async, nodegit::deleteBaton); + baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync, nodegit::deleteBaton); } return; {% else %} @@ -154,16 +154,19 @@ result = baton->defaultResult; delete baton; } else if (instance->{{ field.name }}.ShouldWaitForResult()) { - result = baton->ExecuteAsync({{ field.name }}_async); + result = baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync); delete baton; } else { result = baton->defaultResult; - baton->ExecuteAsync({{ field.name }}_async, nodegit::deleteBaton); + baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync, nodegit::deleteBaton); } return result; {% endif %} } + void {{ cppClassName }}::{{ field.name }}_cancelAsync(void *untypedBaton) { + + } void {{ cppClassName }}::{{ field.name }}_async(void *untypedBaton) { Nan::HandleScope scope; diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index ca394278f..94b60fce1 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -73,6 +73,7 @@ class {{ cppClassName }} : public {% endeach %} ); + static void {{ function.cppFunctionName }}_{{ arg.name }}_cancelAsync(void *baton); static void {{ function.cppFunctionName }}_{{ arg.name }}_async(void *baton); static void {{ function.cppFunctionName }}_{{ arg.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); class {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ arg.return.type }}> { diff --git a/generate/templates/templates/struct_header.h b/generate/templates/templates/struct_header.h index a80e7a5cf..6ef905c92 100644 --- a/generate/templates/templates/struct_header.h +++ b/generate/templates/templates/struct_header.h @@ -53,6 +53,7 @@ class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { {% endeach %} ); + static void {{ field.name }}_cancelAsync(void *baton); static void {{ field.name }}_async(void *baton); static void {{ field.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); {% if field.return.type == 'void' %} From 317f3a788ff71b92b70ec4a0ac9b3cc8372e0b4c Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 28 Aug 2020 12:30:42 -0700 Subject: [PATCH 219/545] Complete implementation of libgit2 callback cancellation --- generate/input/callbacks.json | 133 +++--- generate/input/descriptor.json | 3 + generate/templates/manual/src/thread_pool.cc | 28 +- .../templates/partials/callback_helpers.cc | 4 +- .../templates/partials/field_accessors.cc | 6 +- test/tests/filter.js | 379 +----------------- 6 files changed, 118 insertions(+), 435 deletions(-) diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index c8db807e5..e1cf6d828 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -14,7 +14,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_apply_hunk_cb": { @@ -32,7 +33,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_attr_foreach_cb": { @@ -54,7 +56,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_checkout_notify_cb": { @@ -88,7 +91,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": 0 } }, "git_checkout_progress_cb": { @@ -111,10 +115,7 @@ } ], "return": { - "type": "int", - "noResults": 1, - "success": 0, - "error": -1, + "type": "void", "throttle": 100 } }, @@ -130,10 +131,8 @@ } ], "return": { - "type": "int", - "noResults": 1, - "success": 0, - "error": -1 + "type": "void", + "throttle": 100 } }, "git_commit_signing_cb": { @@ -159,7 +158,8 @@ "type": "int", "noResults": -30, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_config_foreach_cb": { @@ -177,7 +177,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_credential_acquire_cb": { @@ -208,7 +209,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_binary_cb": { @@ -230,7 +232,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_file_cb": { @@ -253,7 +256,7 @@ "noResults": 1, "success": 0, "error": -1, - "throttle": 100 + "cancel": -1 } }, "git_diff_hunk_cb": { @@ -275,7 +278,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_line_cb": { @@ -301,7 +305,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_notify_cb": { @@ -328,7 +333,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_diff_progress_cb": { @@ -355,7 +361,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_filter_apply_fn": { @@ -385,7 +392,8 @@ "type": "int", "noResults": -30, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_filter_check_fn": { @@ -411,7 +419,8 @@ "type": "int", "noResults": -30, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_filter_cleanup_fn": { @@ -440,7 +449,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_filter_shutdown_fn": { @@ -473,7 +483,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_indexer_progress_cb": { @@ -492,6 +503,7 @@ "noResults": 0, "success": 0, "error": -1, + "cancel": -1, "throttle": 100 } }, @@ -514,7 +526,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_odb_foreach_cb": { @@ -527,7 +540,14 @@ "name": "payload", "cType": "void *" } - ] + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "cancel": -1 + } }, "git_packbuilder_foreach_cb": { "args": [ @@ -548,7 +568,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_push_update_reference_cb": { @@ -570,7 +591,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_remote_create_cb": { @@ -601,7 +623,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": -1, + "cancel": -1 } }, "git_repository_create_cb": { @@ -628,7 +651,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": 1, + "cancel": -1 } }, "git_reference_foreach_cb": { @@ -646,7 +670,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_reference_foreach_name_cb": { @@ -664,7 +689,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_repository_fetchhead_foreach_cb": { @@ -694,7 +720,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": -1, + "cancel": -1 } }, "git_repository_mergehead_foreach_cb": { @@ -712,7 +739,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": 1 + "error": -1, + "cancel": -1 } }, "git_revwalk_hide_cb": { @@ -730,7 +758,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_stash_apply_progress_cb": { @@ -749,6 +778,7 @@ "noResults":0, "success": 0, "error": -1, + "cancel": -1, "throttle": 100 } }, @@ -775,7 +805,8 @@ "type": "int", "noResults":0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_status_cb": { @@ -797,7 +828,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_submodule_cb": { @@ -819,7 +851,8 @@ "type": "int", "noResults": 0, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_tag_foreach_cb": { @@ -841,7 +874,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_push_transfer_progress_cb": { @@ -868,6 +902,7 @@ "noResults": 0, "success": 0, "error": -1, + "cancel": -1, "throttle": 100 } }, @@ -891,7 +926,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_transport_certificate_check_cb": { @@ -917,7 +953,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_transport_message_cb": { @@ -939,7 +976,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_treebuilder_filter_cb": { @@ -957,7 +995,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": 0 } }, "git_treewalk_cb": { @@ -979,7 +1018,8 @@ "type": "int", "noResults": 1, "success": 0, - "error": -1 + "error": -1, + "cancel": -1 } }, "git_url_resolve_cb": { @@ -1005,7 +1045,8 @@ "type": "int", "noResults": -30, "success": 0, - "error": -1 + "error": -1, + "cancel": -30 } } } diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index e5f18b568..05cc25f1f 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1487,6 +1487,9 @@ "git2/sys/filter.h" ], "fields": { + "cleanup": { + "ignore": true + }, "stream": { "ignore": true } diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 4cf5a23f6..17e8d758a 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -470,7 +470,7 @@ namespace nodegit { // completion and async callbacks to be performed on the loop std::queue jsThreadCallbackQueue; std::unique_ptr jsThreadCallbackMutex; - uv_async_t jsThreadCallbackAsync; + uv_async_t *jsThreadCallbackAsync; std::vector orchestrators; }; @@ -478,11 +478,12 @@ namespace nodegit { ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop) : isMarkedForDeletion(false), orchestratorJobMutex(new std::mutex), - jsThreadCallbackMutex(new std::mutex) + jsThreadCallbackMutex(new std::mutex), + jsThreadCallbackAsync(new uv_async_t) { - uv_async_init(loop, &jsThreadCallbackAsync, RunLoopCallbacks); - jsThreadCallbackAsync.data = this; - uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + uv_async_init(loop, jsThreadCallbackAsync, RunLoopCallbacks); + jsThreadCallbackAsync->data = this; + uv_unref((uv_handle_t *)jsThreadCallbackAsync); workInProgressCount = 0; @@ -498,7 +499,7 @@ namespace nodegit { std::lock_guard lock(*orchestratorJobMutex); // there is work on the thread pool - reference the handle so // node doesn't terminate - uv_ref((uv_handle_t *)&jsThreadCallbackAsync); + uv_ref((uv_handle_t *)jsThreadCallbackAsync); orchestratorJobQueue.emplace(new Orchestrator::AsyncWorkJob(worker)); workInProgressCount++; orchestratorJobCondition.notify_one(); @@ -537,7 +538,7 @@ namespace nodegit { // we only trigger RunLoopCallbacks via the jsThreadCallbackAsync handle if the queue // was empty. Otherwise, we depend on RunLoopCallbacks to re-trigger itself if (queueWasEmpty) { - uv_async_send(&jsThreadCallbackAsync); + uv_async_send(jsThreadCallbackAsync); } } @@ -561,7 +562,7 @@ namespace nodegit { lock.lock(); if (!jsThreadCallbackQueue.empty()) { - uv_async_send(&jsThreadCallbackAsync); + uv_async_send(jsThreadCallbackAsync); } // if there is no ongoing work / completion processing, node doesn't need @@ -570,7 +571,7 @@ namespace nodegit { std::lock_guard orchestratorLock(*orchestratorJobMutex); workInProgressCount--; if (!workInProgressCount) { - uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + uv_unref((uv_handle_t *)jsThreadCallbackAsync); } } } @@ -602,7 +603,7 @@ namespace nodegit { // unref the jsThreadCallback for all work in progress // it will not be used after this function has completed while (workInProgressCount--) { - uv_unref((uv_handle_t *)&jsThreadCallbackAsync); + uv_unref((uv_handle_t *)jsThreadCallbackAsync); } } @@ -647,6 +648,13 @@ namespace nodegit { jsThreadCallback.cancel(); jsThreadCallbackQueue.pop(); } + + // NOTE We are deliberately leaking this pointer because `async` cleanup in + // node has not completely landed yet. Trying to cleanup this pointer + // is probably not worth the fight as it's very little memory lost per context + // When all LTS versions of node and Electron support async cleanup, we should + // be heading back to cleanup this + uv_close((uv_handle_t *)jsThreadCallbackAsync, nullptr); } ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index 8759d26b1..36e20891c 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -16,7 +16,9 @@ } void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_cancelAsync(void *untypedBaton) { - // TODO decide between defaultResult and cancellation on a per callback basis + {{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton* baton = static_cast<{{ cppFunctionName }}_{{ cbFunction.name|titleCase }}Baton*>(untypedBaton); + baton->result = {{ cbFunction.return.cancel }}; + baton->Done(); } void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void *untypedBaton) { diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 0995bb384..5bbe0b2f6 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -165,7 +165,11 @@ } void {{ cppClassName }}::{{ field.name }}_cancelAsync(void *untypedBaton) { - + {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(untypedBaton); + {% if field.return.type != "void" %} + baton->result = {{ field.return.cancel }}; + {% endif %} + baton->Done(); } void {{ cppClassName }}::{{ field.name }}_async(void *untypedBaton) { diff --git a/test/tests/filter.js b/test/tests/filter.js index b03587d77..995e2542f 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -167,233 +167,6 @@ describe("Filter", function() { }); }); - describe("Initialize", function(){ - it("initializes successfully", function() { - var test = this; - var initialized = false; - return Registry.register(filterName, { - initialize: function() { - initialized = true; - return NodeGit.Error.CODE.OK; - }, - apply: function() {}, - check: function() { - return NodeGit.Error.CODE.PASSTHROUGH; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - }) - .then(function() { - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout" - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - assert.strictEqual(initialized, true); - }); - }); - - it("initializes successfully even on garbage collect", function() { - var test = this; - var initialized = false; - return Registry.register(filterName, { - initialize: function() { - initialized = true; - return NodeGit.Error.CODE.OK; - }, - apply: function() {}, - check: function() { - return NodeGit.Error.CODE.PASSTHROUGH; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - garbageCollect(); - - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout" - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - assert.strictEqual(initialized, true); - }); - }); - - it("does not initialize successfully", function() { - var test = this; - var initialized = false; - return Registry.register(filterName, { - initialize: function() { - initialized = true; - return NodeGit.Error.CODE.ERROR; - }, - apply: function() {}, - check: function() { - return NodeGit.Error.CODE.PASSTHROUGH; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - }) - .then(function() { - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout" - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function(head) { - assert.strictEqual( - head, - undefined, - "Should not have actually checked out" - ); - }) - .catch(function(error) { - assert.strictEqual(initialized, true); - }); - }); - }); - - describe("Shutdown", function() { - it("filter successfully shuts down", function() { - var test = this; - var shutdown = false; - return Registry.register(filterName, { - apply: function() {}, - check: function(){ - return NodeGit.Error.CODE.PASSTHROUGH; - }, - shutdown: function(){ - shutdown = true; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout", - { encoding: "utf-8" } - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - return Registry.unregister(filterName); - }) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - assert.strictEqual(shutdown, true); - }); - }); - - it("filter successfully shuts down on garbage collect", function() { - var test = this; - var shutdown = false; - return Registry.register(filterName, { - apply: function() {}, - check: function(){ - return NodeGit.Error.CODE.PASSTHROUGH; - }, - shutdown: function(){ - shutdown = true; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout", - { encoding: "utf-8" } - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - garbageCollect(); - - return Registry.unregister(filterName); - }) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - assert.strictEqual(shutdown, true); - }); - }); - - it("shutdown completes even if there is an error", function() { - var test = this; - var shutdown = false; - return Registry.register(filterName, { - apply: function() {}, - check: function(){ - return NodeGit.Error.CODE.PASSTHROUGH; - }, - shutdown: function(){ - shutdown = true; - throw new Error("I failed"); - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout", - { encoding: "utf-8" } - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - return Registry.unregister(filterName); - }) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - assert.strictEqual(shutdown, true); - }) - .catch(function(error) { - assert.fail(error, null, "The operation should not have failed"); - }); - }); - }); - describe("Apply", function() { before(function() { var test = this; @@ -672,8 +445,7 @@ describe("Filter", function() { check: function(src, attr) { return src.path() === "README.md" ? 0 : NodeGit.Error.CODE.PASSTHROUGH; - }, - cleanup: function() {} + } }, 0) .then(function(result) { assert.strictEqual(result, NodeGit.Error.CODE.OK); @@ -727,8 +499,7 @@ describe("Filter", function() { check: function(src, attr) { return src.path() === "README.md" ? 0 : NodeGit.Error.CODE.PASSTHROUGH; - }, - cleanup: function() {} + } }, 0) .then(function(result) { garbageCollect(); @@ -775,152 +546,6 @@ describe("Filter", function() { }); }); - describe("Cleanup", function() { - it("is called successfully", function() { - var test = this; - var cleaned = false; - return Registry.register(filterName, { - initialize: function() { - return NodeGit.Error.CODE.OK; - }, - apply: function() { - return NodeGit.Error.CODE.OK; - }, - check: function() { - return NodeGit.Error.CODE.OK; - }, - cleanup: function() { - cleaned = true; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - }) - .then(function() { - var packageContent = fse.readFileSync( - packageJsonPath, - "utf-8" - ); - assert.notEqual(packageContent, ""); - - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout", - { encoding: "utf-8" } - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - assert.strictEqual(cleaned, true); - }); - }); - - it("is called successfully with gc", function() { - var test = this; - var cleaned = false; - return Registry.register(filterName, { - initialize: function() { - return NodeGit.Error.CODE.OK; - }, - apply: function() { - return NodeGit.Error.CODE.OK; - }, - check: function() { - return NodeGit.Error.CODE.OK; - }, - cleanup: function() { - cleaned = true; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - }) - .then(function() { - var packageContent = fse.readFileSync( - packageJsonPath, - "utf-8" - ); - assert.notEqual(packageContent, ""); - - garbageCollect(); - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout", - { encoding: "utf-8" } - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "package.json" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - assert.strictEqual(cleaned, true); - }); - }); - - it("is not called when check returns GIT_PASSTHROUGH", function() { - var test = this; - var cleaned = false; - - return Registry.register(filterName, { - initialize: function() { - return NodeGit.Error.CODE.OK; - }, - apply: function() { - return NodeGit.Error.CODE.OK; - }, - check: function() { - return NodeGit.Error.CODE.PASSTHROUGH; - }, - cleanup: function() { - cleaned = true; - } - }, 0) - .then(function(result) { - assert.strictEqual(result, NodeGit.Error.CODE.OK); - }) - .then(function() { - var packageContent = fse.readFileSync( - packageJsonPath, - "utf-8" - ); - var readmeContent = fse.readFileSync( - readmePath, - "utf-8" - ); - - assert.notEqual(packageContent, ""); - assert.notEqual(readmeContent, "Initialized"); - }) - .then(function() { - return fse.writeFile( - packageJsonPath, - "Changing content to trigger checkout", - { encoding: "utf-8" } - ); - }) - .then(function() { - var opts = { - checkoutStrategy: Checkout.STRATEGY.FORCE, - paths: "README.md" - }; - return Checkout.head(test.repository, opts); - }) - .then(function() { - assert.notStrictEqual(cleaned, true); - }); - }); - }); - describe("Manually Apply", function() { beforeEach(function() { var test = this; From fa0376937945ff7aab58917f0e5bac300e0263b3 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 27 Aug 2020 12:29:51 -0700 Subject: [PATCH 220/545] Add HandleErrorCallback skeleton --- generate/templates/partials/async_function.cc | 18 ++++++++++++++++++ generate/templates/templates/class_header.h | 1 + 2 files changed, 19 insertions(+) diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index a48629385..02f097119 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -131,6 +131,24 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { {%endif%} } +void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { + puts("HandleErrorCallback"); + // inspect the baton for any pointers that have been initialized + // free any pointers that have been initialized + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + baton->error = NULL; + } + + // free the baton + delete baton; + baton = NULL; +} + void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%if return.isResultOrError %} if (baton->error_code >= GIT_OK) { diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index 94b60fce1..e828b7f89 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -142,6 +142,7 @@ class {{ cppClassName }} : public , baton(_baton) {}; ~{{ function.cppFunctionName }}Worker() {}; void Execute(); + void HandleErrorCallback(); void HandleOKCallback(); nodegit::LockMaster AcquireLocks(); From f259b6fb36e5ff6e9c5a6ebae445207dbf1920bd Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 27 Aug 2020 12:30:34 -0700 Subject: [PATCH 221/545] Add skeleton of manual templates --- generate/templates/manual/clone/clone.cc | 2 ++ generate/templates/manual/commit/extract_signature.cc | 2 ++ generate/templates/manual/filter_list/load.cc | 2 ++ generate/templates/manual/filter_source/repo.cc | 2 ++ generate/templates/manual/patches/convenient_patches.cc | 2 ++ generate/templates/manual/remote/ls.cc | 2 ++ generate/templates/manual/repository/get_references.cc | 2 ++ generate/templates/manual/repository/get_remotes.cc | 2 ++ generate/templates/manual/repository/get_submodules.cc | 2 ++ generate/templates/manual/repository/refresh_references.cc | 2 ++ generate/templates/manual/revwalk/commit_walk.cc | 2 ++ generate/templates/manual/revwalk/fast_walk.cc | 2 ++ generate/templates/manual/revwalk/file_history_walk.cc | 2 ++ 13 files changed, 26 insertions(+) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 9541f05f3..0050affce 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -125,6 +125,8 @@ void GitClone::CloneWorker::Execute() { } } +void GitClone::CloneWorker::HandleErrorCallback() {} + void GitClone::CloneWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { v8::Local to; diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index 5c66cbe3f..dfe45347a 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -94,6 +94,8 @@ void GitCommit::ExtractSignatureWorker::Execute() } } +void GitCommit::ExtractSignatureWorker::HandleErrorCallback() {} + void GitCommit::ExtractSignatureWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 0107dfb81..49d13c72b 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -131,6 +131,8 @@ void GitFilterList::LoadWorker::Execute() { } } +void GitFilterList::LoadWorker::HandleErrorCallback() {} + void GitFilterList::LoadWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { v8::Local to; diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index 96d2d5e0b..f11257aba 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -46,6 +46,8 @@ void GitFilterSource::RepoWorker::Execute() { } } +void GitFilterSource::RepoWorker::HandleErrorCallback() {} + void GitFilterSource::RepoWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { v8::Local to; diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index 5630de1dc..bd4559ea0 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -77,6 +77,8 @@ void GitPatch::ConvenientFromDiffWorker::Execute() { } } +void GitPatch::ConvenientFromDiffWorker::HandleErrorCallback() {} + void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { if (baton->out != NULL) { unsigned int size = baton->out->size(); diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index f3adfee9f..233af8a27 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -51,6 +51,8 @@ void GitRemote::ReferenceListWorker::Execute() } } +void GitRemote::ReferenceListWorker::HandleErrorCallback() {} + void GitRemote::ReferenceListWorker::HandleOKCallback() { if (baton->out != NULL) diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index 313f0479b..343ecb712 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -81,6 +81,8 @@ void GitRepository::GetReferencesWorker::Execute() } } +void GitRepository::GetReferencesWorker::HandleErrorCallback() {} + void GitRepository::GetReferencesWorker::HandleOKCallback() { if (baton->out != NULL) diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index eb562de9f..2def104bb 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -83,6 +83,8 @@ void GitRepository::GetRemotesWorker::Execute() } } +void GitRepository::GetRemotesWorker::HandleErrorCallback() {} + void GitRepository::GetRemotesWorker::HandleOKCallback() { if (baton->out != NULL) diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 425754ad9..0a486dbc0 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -62,6 +62,8 @@ void GitRepository::GetSubmodulesWorker::Execute() } } +void GitRepository::GetSubmodulesWorker::HandleErrorCallback() {} + void GitRepository::GetSubmodulesWorker::HandleOKCallback() { if (baton->out != NULL) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 80a783708..763280322 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -589,6 +589,8 @@ void GitRepository::RefreshReferencesWorker::Execute() } } +void GitRepository::RefreshReferencesWorker::HandleErrorCallback() {} + void GitRepository::RefreshReferencesWorker::HandleOKCallback() { if (baton->out != NULL) diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index b2486e899..dd14d0d75 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -207,6 +207,8 @@ void GitRevwalk::CommitWalkWorker::Execute() { } } +void GitRevwalk::CommitWalkWorker::HandleErrorCallback() {} + void GitRevwalk::CommitWalkWorker::HandleOKCallback() { if (baton->out != NULL) { std::vector *out = static_cast *>(baton->out); diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 72d092eba..db4564cd3 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -72,6 +72,8 @@ void GitRevwalk::FastWalkWorker::Execute() } } +void GitRevwalk::FastWalkWorker::HandleErrorCallback() {} + void GitRevwalk::FastWalkWorker::HandleOKCallback() { if (baton->out != NULL) diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 6ba2e0b33..1efe6c33f 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -424,6 +424,8 @@ void GitRevwalk::FileHistoryWalkWorker::Execute() baton->file_path = NULL; } +void GitRevwalk::FileHistoryWalkWorker::HandleErrorCallback() {} + void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() { if (baton->out != NULL) { From 50444d0892afaa23e866332cfa7201c806dfd2c6 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 27 Aug 2020 14:58:39 -0700 Subject: [PATCH 222/545] Fix Repository.discover description --- lib/repository.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/repository.js b/lib/repository.js index 49e968e4f..32987d44f 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -319,7 +319,7 @@ function performRebase( } /** - * Creates a branch with the passed in name pointing to the commit + * Look for a git repository, returning its path. * * @async * @param {String} startPath The base path where the lookup starts. From c0ff5e68efc9aa2afa9c4acb3c439c394741acdb Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 27 Aug 2020 15:06:03 -0700 Subject: [PATCH 223/545] Cleanup additional baton members --- generate/templates/partials/async_function.cc | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 02f097119..34ee27ac5 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -132,7 +132,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { } void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { - puts("HandleErrorCallback"); + puts("{{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback()"); // inspect the baton for any pointers that have been initialized // free any pointers that have been initialized if (baton->error) { @@ -144,6 +144,54 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { baton->error = NULL; } + {%each args|argsInfo as arg %} + {%if arg.shouldAlloc %} + {%if not arg.isCppClassStringOrArray %} + {%elsif arg | isOid %} + if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; + free((void*)baton->{{ arg.name }}); + } + {%elsif arg.isCallbackFunction %} + {%if not arg.payload.globalPayload %} + delete baton->{{ arg.payload.name }}; + {%endif%} + {%elsif arg.globalPayload %} + delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; + {%else%} + free((void*)baton->{{ arg.name }}); + {%endif%} + {%endif%} + {%endeach%} + + {%each args|argsInfo as arg %} + {%if arg.isCppClassStringOrArray %} + {%if arg.freeFunctionName %} + {{ arg.freeFunctionName }}(baton->{{ arg.name }}); + {%elsif not arg.isConst%} + free((void *)baton->{{ arg.name }}); + {%endif%} + {%elsif arg | isOid %} + if (baton->{{ arg.name}}NeedsFree) { + baton->{{ arg.name}}NeedsFree = false; + free((void *)baton->{{ arg.name }}); + } + {%elsif arg.isCallbackFunction %} + {%if not arg.payload.globalPayload %} + delete baton->{{ arg.payload.name }}; + {%endif%} + {%elsif arg.globalPayload %} + delete ({{ cppFunctionName}}_globalPayload*)baton->{{ arg.name }}; + {%endif%} + {%if arg.cppClassName == "GitBuf" %} + {%if cppFunctionName == "Set" %} + {%else%} + git_buf_dispose(baton->{{ arg.name }}); + free((void *)baton->{{ arg.name }}); + {%endif%} + {%endif%} + {%endeach%} + // free the baton delete baton; baton = NULL; From ce43d922f222ebbb2e92c39187774728140ee557 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 27 Aug 2020 15:41:42 -0700 Subject: [PATCH 224/545] Call callback from HandleErrorCallback --- generate/templates/partials/async_function.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 34ee27ac5..522de672b 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -133,6 +133,14 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { puts("{{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback()"); + + v8::Local err = Nan::To(Nan::Error(ErrorMessage())).ToLocalChecked(); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + // inspect the baton for any pointers that have been initialized // free any pointers that have been initialized if (baton->error) { From 223bf7e7ceac8514fdc41d0d9425a2ffcd1aef72 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 28 Aug 2020 14:08:40 -0700 Subject: [PATCH 225/545] Don't call callback if AsyncWorker is cancelled We aren't allowed to call back to JavaScript in this case --- generate/templates/manual/include/async_worker.h | 5 +++++ generate/templates/manual/src/async_worker.cc | 6 ++++++ generate/templates/partials/async_function.cc | 14 ++++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index 77159a605..13005040a 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -22,6 +22,11 @@ namespace nodegit { // This is used to inform libgit2 callbacks what asyncResource // they should use when working with any javascript Nan::AsyncResource *GetAsyncResource(); + + bool GetIsCancelled() const; + + private: + bool isCancelled = false; }; } diff --git a/generate/templates/manual/src/async_worker.cc b/generate/templates/manual/src/async_worker.cc index bc7162a84..26a07b098 100644 --- a/generate/templates/manual/src/async_worker.cc +++ b/generate/templates/manual/src/async_worker.cc @@ -6,6 +6,8 @@ namespace nodegit { {} void AsyncWorker::Cancel() { + isCancelled = true; + // We use Nan::AsyncWorker's ErrorMessage flow // to trigger `HandleErrorCallback` for cancellation // of AsyncWork @@ -15,4 +17,8 @@ namespace nodegit { Nan::AsyncResource *AsyncWorker::GetAsyncResource() { return async_resource; } + + bool AsyncWorker::GetIsCancelled() const { + return isCancelled; + } } diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 522de672b..e428c46f1 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -134,12 +134,14 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { puts("{{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback()"); - v8::Local err = Nan::To(Nan::Error(ErrorMessage())).ToLocalChecked(); - Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); - v8::Local argv[1] = { - err - }; - callback->Call(1, argv, async_resource); + if (!GetIsCancelled()) { + v8::Local err = Nan::To(Nan::Error(ErrorMessage())).ToLocalChecked(); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); + v8::Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } // inspect the baton for any pointers that have been initialized // free any pointers that have been initialized From af5585cb984d380b2a42cfea1d98de58465e12ef Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 28 Aug 2020 14:11:57 -0700 Subject: [PATCH 226/545] Cleanup HandleErrorCallback template --- generate/templates/partials/async_function.cc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index e428c46f1..982b07c46 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -132,8 +132,6 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { } void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { - puts("{{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback()"); - if (!GetIsCancelled()) { v8::Local err = Nan::To(Nan::Error(ErrorMessage())).ToLocalChecked(); Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("{{ jsClassName }}.{{ jsFunctionName }}").ToLocalChecked()); @@ -143,15 +141,12 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { callback->Call(1, argv, async_resource); } - // inspect the baton for any pointers that have been initialized - // free any pointers that have been initialized if (baton->error) { if (baton->error->message) { free((void *)baton->error->message); } free((void *)baton->error); - baton->error = NULL; } {%each args|argsInfo as arg %} @@ -202,9 +197,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { {%endif%} {%endeach%} - // free the baton delete baton; - baton = NULL; } void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { From 610104b4c24704f45d3b5de03d072e0aed7d33a7 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 28 Aug 2020 16:52:06 -0700 Subject: [PATCH 227/545] Fill in skeleton HandleErrorCallbacks --- generate/templates/manual/clone/clone.cc | 12 +++++++++++- .../templates/manual/commit/extract_signature.cc | 12 +++++++++++- generate/templates/manual/filter_list/load.cc | 12 +++++++++++- generate/templates/manual/filter_source/repo.cc | 12 +++++++++++- .../templates/manual/patches/convenient_patches.cc | 12 +++++++++++- generate/templates/manual/remote/ls.cc | 14 +++++++++++++- .../templates/manual/repository/get_references.cc | 14 +++++++++++++- .../templates/manual/repository/get_remotes.cc | 14 +++++++++++++- .../templates/manual/repository/get_submodules.cc | 14 +++++++++++++- .../manual/repository/refresh_references.cc | 14 +++++++++++++- generate/templates/manual/revwalk/commit_walk.cc | 14 +++++++++++++- generate/templates/manual/revwalk/fast_walk.cc | 14 +++++++++++++- .../templates/manual/revwalk/file_history_walk.cc | 14 +++++++++++++- 13 files changed, 159 insertions(+), 13 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 0050affce..75a48cbfe 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -125,7 +125,17 @@ void GitClone::CloneWorker::Execute() { } } -void GitClone::CloneWorker::HandleErrorCallback() {} +void GitClone::CloneWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitClone::CloneWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index dfe45347a..e9f39d5ac 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -94,7 +94,17 @@ void GitCommit::ExtractSignatureWorker::Execute() } } -void GitCommit::ExtractSignatureWorker::HandleErrorCallback() {} +void GitCommit::ExtractSignatureWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitCommit::ExtractSignatureWorker::HandleOKCallback() { diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 49d13c72b..ba6eb50c2 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -131,7 +131,17 @@ void GitFilterList::LoadWorker::Execute() { } } -void GitFilterList::LoadWorker::HandleErrorCallback() {} +void GitFilterList::LoadWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitFilterList::LoadWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index f11257aba..0f4317f25 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -46,7 +46,17 @@ void GitFilterSource::RepoWorker::Execute() { } } -void GitFilterSource::RepoWorker::HandleErrorCallback() {} +void GitFilterSource::RepoWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitFilterSource::RepoWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index bd4559ea0..15e2df5d8 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -77,7 +77,17 @@ void GitPatch::ConvenientFromDiffWorker::Execute() { } } -void GitPatch::ConvenientFromDiffWorker::HandleErrorCallback() {} +void GitPatch::ConvenientFromDiffWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitPatch::ConvenientFromDiffWorker::HandleOKCallback() { if (baton->out != NULL) { diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 233af8a27..5eb45c7f9 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -51,7 +51,17 @@ void GitRemote::ReferenceListWorker::Execute() } } -void GitRemote::ReferenceListWorker::HandleErrorCallback() {} +void GitRemote::ReferenceListWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRemote::ReferenceListWorker::HandleOKCallback() { @@ -98,4 +108,6 @@ void GitRemote::ReferenceListWorker::HandleOKCallback() { callback->Call(0, NULL, async_resource); } + + delete baton; } diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index 343ecb712..8f5f70263 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -81,7 +81,17 @@ void GitRepository::GetReferencesWorker::Execute() } } -void GitRepository::GetReferencesWorker::HandleErrorCallback() {} +void GitRepository::GetReferencesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRepository::GetReferencesWorker::HandleOKCallback() { @@ -137,4 +147,6 @@ void GitRepository::GetReferencesWorker::HandleOKCallback() { callback->Call(0, NULL, async_resource); } + + delete baton; } diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 2def104bb..7f7503fc9 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -83,7 +83,17 @@ void GitRepository::GetRemotesWorker::Execute() } } -void GitRepository::GetRemotesWorker::HandleErrorCallback() {} +void GitRepository::GetRemotesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRepository::GetRemotesWorker::HandleOKCallback() { @@ -139,4 +149,6 @@ void GitRepository::GetRemotesWorker::HandleOKCallback() { callback->Call(0, NULL, async_resource); } + + delete baton; } diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 0a486dbc0..28a89046b 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -62,7 +62,17 @@ void GitRepository::GetSubmodulesWorker::Execute() } } -void GitRepository::GetSubmodulesWorker::HandleErrorCallback() {} +void GitRepository::GetSubmodulesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRepository::GetSubmodulesWorker::HandleOKCallback() { @@ -118,4 +128,6 @@ void GitRepository::GetSubmodulesWorker::HandleOKCallback() { callback->Call(0, NULL, async_resource); } + + delete baton; } diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 763280322..ef220b8d7 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -589,7 +589,17 @@ void GitRepository::RefreshReferencesWorker::Execute() } } -void GitRepository::RefreshReferencesWorker::HandleErrorCallback() {} +void GitRepository::RefreshReferencesWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRepository::RefreshReferencesWorker::HandleOKCallback() { @@ -678,4 +688,6 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() { callback->Call(0, NULL, async_resource); } + + delete baton; } diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index dd14d0d75..09e3e4831 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -207,7 +207,17 @@ void GitRevwalk::CommitWalkWorker::Execute() { } } -void GitRevwalk::CommitWalkWorker::HandleErrorCallback() {} +void GitRevwalk::CommitWalkWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRevwalk::CommitWalkWorker::HandleOKCallback() { if (baton->out != NULL) { @@ -252,4 +262,6 @@ void GitRevwalk::CommitWalkWorker::HandleOKCallback() { } else { callback->Call(0, NULL, async_resource); } + + delete baton; } diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index db4564cd3..76e151238 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -72,7 +72,17 @@ void GitRevwalk::FastWalkWorker::Execute() } } -void GitRevwalk::FastWalkWorker::HandleErrorCallback() {} +void GitRevwalk::FastWalkWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRevwalk::FastWalkWorker::HandleOKCallback() { @@ -180,4 +190,6 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() callback->Call(0, NULL, async_resource); } } + + delete baton; } diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 1efe6c33f..f0359abd3 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -424,7 +424,17 @@ void GitRevwalk::FileHistoryWalkWorker::Execute() baton->file_path = NULL; } -void GitRevwalk::FileHistoryWalkWorker::HandleErrorCallback() {} +void GitRevwalk::FileHistoryWalkWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() { @@ -483,4 +493,6 @@ void GitRevwalk::FileHistoryWalkWorker::HandleOKCallback() } callback->Call(0, NULL, async_resource); + + delete baton; } From 9a519001c2b48d5c60bf4bab194c9e44a4c750c9 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 28 Aug 2020 16:52:44 -0700 Subject: [PATCH 228/545] Add missing HandleErrorCallbacks --- .../manual/include/convenient_hunk.h | 1 + .../manual/include/convenient_patch.h | 1 + .../manual/include/filter_registry.h | 2 ++ .../templates/manual/src/convenient_hunk.cc | 4 +++ .../templates/manual/src/convenient_patch.cc | 4 +++ .../templates/manual/src/filter_registry.cc | 28 +++++++++++++++++-- 6 files changed, 38 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/include/convenient_hunk.h b/generate/templates/manual/include/convenient_hunk.h index 3953a4680..dbdfb5c79 100644 --- a/generate/templates/manual/include/convenient_hunk.h +++ b/generate/templates/manual/include/convenient_hunk.h @@ -65,6 +65,7 @@ class ConvenientHunk : public Nan::ObjectWrap { , baton(_baton) {}; ~LinesWorker() {}; void Execute(); + void HandleErrorCallback(); void HandleOKCallback(); nodegit::LockMaster AcquireLocks(); diff --git a/generate/templates/manual/include/convenient_patch.h b/generate/templates/manual/include/convenient_patch.h index ea8dcf95d..148c14ff2 100644 --- a/generate/templates/manual/include/convenient_patch.h +++ b/generate/templates/manual/include/convenient_patch.h @@ -77,6 +77,7 @@ class ConvenientPatch : public Nan::ObjectWrap { , baton(_baton) {}; ~HunksWorker() {}; void Execute(); + void HandleErrorCallback(); void HandleOKCallback(); nodegit::LockMaster AcquireLocks(); diff --git a/generate/templates/manual/include/filter_registry.h b/generate/templates/manual/include/filter_registry.h index cefcbcaed..c329b33e7 100644 --- a/generate/templates/manual/include/filter_registry.h +++ b/generate/templates/manual/include/filter_registry.h @@ -54,6 +54,7 @@ class GitFilterRegistry : public Nan::ObjectWrap { : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Register"), baton(_baton) {}; ~RegisterWorker() {}; void Execute(); + void HandleErrorCallback(); void HandleOKCallback(); nodegit::LockMaster AcquireLocks(); @@ -67,6 +68,7 @@ class GitFilterRegistry : public Nan::ObjectWrap { : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Unregister"), baton(_baton) {}; ~UnregisterWorker() {}; void Execute(); + void HandleErrorCallback(); void HandleOKCallback(); nodegit::LockMaster AcquireLocks(); diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc index ff1c0967b..1d53d3327 100644 --- a/generate/templates/manual/src/convenient_hunk.cc +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -130,6 +130,8 @@ void ConvenientHunk::LinesWorker::Execute() { } } +void ConvenientHunk::LinesWorker::HandleErrorCallback() {} + void ConvenientHunk::LinesWorker::HandleOKCallback() { unsigned int size = baton->lines->size(); Local result = Nan::New(size); @@ -145,6 +147,8 @@ void ConvenientHunk::LinesWorker::HandleOKCallback() { result }; callback->Call(2, argv, async_resource); + + delete baton; } NAN_METHOD(ConvenientHunk::OldStart) { diff --git a/generate/templates/manual/src/convenient_patch.cc b/generate/templates/manual/src/convenient_patch.cc index 01a437fb9..e9489a48e 100644 --- a/generate/templates/manual/src/convenient_patch.cc +++ b/generate/templates/manual/src/convenient_patch.cc @@ -263,6 +263,8 @@ void ConvenientPatch::HunksWorker::Execute() { } } +void ConvenientPatch::HunksWorker::HandleErrorCallback() {} + void ConvenientPatch::HunksWorker::HandleOKCallback() { unsigned int size = baton->hunks->size(); Local result = Nan::New(size); @@ -278,6 +280,8 @@ void ConvenientPatch::HunksWorker::HandleOKCallback() { result }; callback->Call(2, argv, async_resource); + + delete baton; } NAN_METHOD(ConvenientPatch::LineStats) { diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 688b9efbf..a026b102d 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -96,6 +96,18 @@ void GitFilterRegistry::RegisterWorker::Execute() { } } +void GitFilterRegistry::RegisterWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} + void GitFilterRegistry::RegisterWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { v8::Local result = Nan::New(baton->error_code); @@ -134,8 +146,8 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { else { callback->Call(0, NULL, async_resource); } + delete baton; - return; } NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { @@ -187,6 +199,18 @@ void GitFilterRegistry::UnregisterWorker::Execute() { } } +void GitFilterRegistry::UnregisterWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton; +} + void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); @@ -228,6 +252,6 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { else { callback->Call(0, NULL, async_resource); } + delete baton; - return; } From bed58a4cfc712b7ec339d52ceb9d9e7dbfe1c63d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 31 Aug 2020 17:54:07 -0700 Subject: [PATCH 229/545] Value initialize batons Ensure baton data members are value initialized (since batons are trivial types) --- generate/templates/partials/async_function.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 982b07c46..846b19912 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -6,7 +6,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { return Nan::ThrowError("Callback is required and must be a Function."); } - {{ cppFunctionName }}Baton* baton = new {{ cppFunctionName }}Baton; + {{ cppFunctionName }}Baton* baton = new {{ cppFunctionName }}Baton(); baton->error_code = GIT_OK; baton->error = NULL; From 74fe6e18fe814bc356d73ea0e0f2ea63c44bd179 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 31 Aug 2020 18:00:01 -0700 Subject: [PATCH 230/545] Use freeFunctionName to free returned args on error --- generate/scripts/helpers.js | 2 ++ generate/templates/partials/async_function.cc | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index 9b9afb015..2af653f63 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -170,6 +170,8 @@ var Helpers = { } } + type.freeFunctionName = libgitType.freeFunctionName; + // we don't want to overwrite the c type of the passed in type _.merge(type, descriptor.types[normalizedType.replace("git_", "")] || {}, { cType: type.cType }); } diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 846b19912..6b64ad443 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -166,13 +166,14 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleErrorCallback() { {%else%} free((void*)baton->{{ arg.name }}); {%endif%} + {%elsif arg.freeFunctionName|and arg.isReturn|and arg.selfFreeing %} + {{ arg.freeFunctionName }}(baton->{{ arg.name }}); {%endif%} {%endeach%} {%each args|argsInfo as arg %} {%if arg.isCppClassStringOrArray %} {%if arg.freeFunctionName %} - {{ arg.freeFunctionName }}(baton->{{ arg.name }}); {%elsif not arg.isConst%} free((void *)baton->{{ arg.name }}); {%endif%} @@ -331,6 +332,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%else%} free((void*)baton->{{ arg.name }}); {%endif%} + {%elsif arg.freeFunctionName|and arg.isReturn|and arg.selfFreeing %} + {{ arg.freeFunctionName }}(baton->{{ arg.name }}); {%endif%} {%endeach%} } @@ -338,7 +341,6 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%each args|argsInfo as arg %} {%if arg.isCppClassStringOrArray %} {%if arg.freeFunctionName %} - {{ arg.freeFunctionName }}(baton->{{ arg.name }}); {%elsif not arg.isConst%} free((void *)baton->{{ arg.name }}); {%endif%} From 046a7ad4d318061a7f2f84fd977b3a5b1d8a8344 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 2 Sep 2020 10:53:34 -0700 Subject: [PATCH 231/545] Value initialize manual template batons as well --- generate/templates/manual/clone/clone.cc | 2 +- generate/templates/manual/commit/extract_signature.cc | 2 +- generate/templates/manual/filter_list/load.cc | 2 +- generate/templates/manual/filter_source/repo.cc | 2 +- generate/templates/manual/patches/convenient_patches.cc | 2 +- generate/templates/manual/remote/ls.cc | 2 +- generate/templates/manual/repository/get_references.cc | 2 +- generate/templates/manual/repository/get_remotes.cc | 2 +- generate/templates/manual/repository/get_submodules.cc | 2 +- .../templates/manual/repository/refresh_references.cc | 4 ++-- generate/templates/manual/revwalk/commit_walk.cc | 2 +- generate/templates/manual/revwalk/fast_walk.cc | 2 +- generate/templates/manual/revwalk/file_history_walk.cc | 2 +- generate/templates/manual/src/convenient_hunk.cc | 2 +- generate/templates/manual/src/convenient_patch.cc | 8 ++++---- generate/templates/manual/src/filter_registry.cc | 4 ++-- 16 files changed, 21 insertions(+), 21 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 75a48cbfe..2dd6fa3e8 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -25,7 +25,7 @@ NAN_METHOD(GitClone::Clone) { return Nan::ThrowError("Callback is required and must be a Function."); } - CloneBaton *baton = new CloneBaton; + CloneBaton *baton = new CloneBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index e9f39d5ac..53f7d3e89 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -22,7 +22,7 @@ NAN_METHOD(GitCommit::ExtractSignature) } } - ExtractSignatureBaton* baton = new ExtractSignatureBaton; + ExtractSignatureBaton* baton = new ExtractSignatureBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index ba6eb50c2..b1899d7e9 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -39,7 +39,7 @@ NAN_METHOD(GitFilterList::Load) { return Nan::ThrowError("Callback is required and must be a Function."); } - LoadBaton *baton = new LoadBaton; + LoadBaton *baton = new LoadBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index 0f4317f25..5255f6fbf 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -12,7 +12,7 @@ NAN_METHOD(GitFilterSource::Repo) { return Nan::ThrowError("Callback is required and must be a Function."); } - RepoBaton *baton = new RepoBaton; + RepoBaton *baton = new RepoBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index 15e2df5d8..bbfa32e46 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -7,7 +7,7 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { return Nan::ThrowError("Callback is required and must be a Function."); } - ConvenientFromDiffBaton *baton = new ConvenientFromDiffBaton; + ConvenientFromDiffBaton *baton = new ConvenientFromDiffBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 5eb45c7f9..31850de0e 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -4,7 +4,7 @@ NAN_METHOD(GitRemote::ReferenceList) return Nan::ThrowError("Callback is required and must be a Function."); } - ReferenceListBaton* baton = new ReferenceListBaton; + ReferenceListBaton* baton = new ReferenceListBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index 8f5f70263..f1ec6d3df 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -4,7 +4,7 @@ NAN_METHOD(GitRepository::GetReferences) return Nan::ThrowError("Callback is required and must be a Function."); } - GetReferencesBaton* baton = new GetReferencesBaton; + GetReferencesBaton* baton = new GetReferencesBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 7f7503fc9..2e1d4ed29 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -4,7 +4,7 @@ NAN_METHOD(GitRepository::GetRemotes) return Nan::ThrowError("Callback is required and must be a Function."); } - GetRemotesBaton* baton = new GetRemotesBaton; + GetRemotesBaton* baton = new GetRemotesBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 28a89046b..fc93240fd 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -4,7 +4,7 @@ NAN_METHOD(GitRepository::GetSubmodules) return Nan::ThrowError("Callback is required and must be a Function."); } - GetSubmodulesBaton* baton = new GetSubmodulesBaton; + GetSubmodulesBaton* baton = new GetSubmodulesBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index ef220b8d7..7c27dfec3 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -395,11 +395,11 @@ NAN_METHOD(GitRepository::RefreshReferences) return Nan::ThrowError("Callback is required and must be a Function."); } - RefreshReferencesBaton* baton = new RefreshReferencesBaton; + RefreshReferencesBaton* baton = new RefreshReferencesBaton(); baton->error_code = GIT_OK; baton->error = NULL; - baton->out = (void *)new RefreshReferencesData; + baton->out = (void *)new RefreshReferencesData(); baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index 09e3e4831..00270703e 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -121,7 +121,7 @@ NAN_METHOD(GitRevwalk::CommitWalk) { } } - CommitWalkBaton* baton = new CommitWalkBaton; + CommitWalkBaton* baton = new CommitWalkBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 76e151238..c9ae994cf 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -8,7 +8,7 @@ NAN_METHOD(GitRevwalk::FastWalk) return Nan::ThrowError("Callback is required and must be a Function."); } - FastWalkBaton* baton = new FastWalkBaton; + FastWalkBaton* baton = new FastWalkBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index f0359abd3..9a54f526d 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -192,7 +192,7 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) return Nan::ThrowError("Callback is required and must be a Function."); } - FileHistoryWalkBaton* baton = new FileHistoryWalkBaton; + FileHistoryWalkBaton* baton = new FileHistoryWalkBaton(); baton->error_code = GIT_OK; baton->error = NULL; diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc index 1d53d3327..2fa1de17b 100644 --- a/generate/templates/manual/src/convenient_hunk.cc +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -96,7 +96,7 @@ NAN_METHOD(ConvenientHunk::Lines) { return Nan::ThrowError("Callback is required and must be a Function."); } - LinesBaton *baton = new LinesBaton; + LinesBaton *baton = new LinesBaton(); baton->hunk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); diff --git a/generate/templates/manual/src/convenient_patch.cc b/generate/templates/manual/src/convenient_patch.cc index e9489a48e..47044e9dd 100644 --- a/generate/templates/manual/src/convenient_patch.cc +++ b/generate/templates/manual/src/convenient_patch.cc @@ -33,7 +33,7 @@ void PatchDataFree(PatchData *patch) { } PatchData *createFromRaw(git_patch *raw) { - PatchData *patch = new PatchData; + PatchData *patch = new PatchData(); const git_diff_delta *delta = git_patch_get_delta(raw); patch->status = delta->status; @@ -56,7 +56,7 @@ PatchData *createFromRaw(git_patch *raw) { patch->hunks->reserve(patch->numHunks); for (unsigned int i = 0; i < patch->numHunks; ++i) { - HunkData *hunkData = new HunkData; + HunkData *hunkData = new HunkData(); const git_diff_hunk *hunk = NULL; int result = git_patch_get_hunk(&hunk, &hunkData->numLines, raw, i); if (result != 0) { @@ -212,7 +212,7 @@ NAN_METHOD(ConvenientPatch::Hunks) { return Nan::ThrowError("Callback is required and must be a Function."); } - HunksBaton *baton = new HunksBaton; + HunksBaton *baton = new HunksBaton(); baton->patch = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); @@ -236,7 +236,7 @@ void ConvenientPatch::HunksWorker::Execute() { baton->hunks->reserve(baton->patch->numHunks); for (unsigned int i = 0; i < baton->patch->numHunks; ++i) { - HunkData *hunkData = new HunkData; + HunkData *hunkData = new HunkData(); hunkData->numLines = baton->patch->hunks->at(i)->numLines; hunkData->hunk.old_start = baton->patch->hunks->at(i)->hunk.old_start; hunkData->hunk.old_lines = baton->patch->hunks->at(i)->hunk.old_lines; diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index a026b102d..418c1142e 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -51,7 +51,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { return Nan::ThrowError("Callback is required and must be a Function."); } - FilterRegisterBaton *baton = new FilterRegisterBaton; + FilterRegisterBaton *baton = new FilterRegisterBaton(); baton->filter = Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); @@ -161,7 +161,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { return Nan::ThrowError("Callback is required and must be a Function."); } - FilterUnregisterBaton *baton = new FilterUnregisterBaton; + FilterUnregisterBaton *baton = new FilterUnregisterBaton(); Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); baton->filter_name = (char *)malloc(name.length() + 1); From bf7b13f7376cdac2e1aec68d15950696f900eb96 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 2 Sep 2020 13:43:44 -0700 Subject: [PATCH 232/545] Cleanup manual template batons --- generate/templates/manual/clone/clone.cc | 8 ++++++++ .../manual/commit/extract_signature.cc | 5 +++++ generate/templates/manual/filter_list/load.cc | 6 ++++++ .../templates/manual/filter_source/repo.cc | 2 ++ .../manual/patches/convenient_patches.cc | 7 +++++++ generate/templates/manual/remote/ls.cc | 2 ++ .../manual/repository/get_references.cc | 8 ++++++++ .../manual/repository/get_remotes.cc | 8 ++++++++ .../manual/repository/get_submodules.cc | 7 +++++++ .../manual/repository/refresh_references.cc | 5 ++++- .../templates/manual/revwalk/commit_walk.cc | 8 ++++++++ .../templates/manual/revwalk/fast_walk.cc | 7 +++++++ .../manual/revwalk/file_history_walk.cc | 8 ++++++++ .../templates/manual/src/convenient_hunk.cc | 13 ++++++++++--- .../templates/manual/src/convenient_patch.cc | 19 +++++++++++++++---- .../templates/manual/src/filter_registry.cc | 8 ++++++++ 16 files changed, 113 insertions(+), 8 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 2dd6fa3e8..a75ecb134 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -134,6 +134,11 @@ void GitClone::CloneWorker::HandleErrorCallback() { free((void *)baton->error); } + git_repository_free(baton->out); + + free((void*)baton->url); + free((void*)baton->local_path); + delete baton; } @@ -225,5 +230,8 @@ void GitClone::CloneWorker::HandleOKCallback() { } } + free((void*)baton->url); + free((void*)baton->local_path); + delete baton; } diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index 53f7d3e89..acad88e54 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -103,6 +103,11 @@ void GitCommit::ExtractSignatureWorker::HandleErrorCallback() { free((void *)baton->error); } + git_buf_dispose(&baton->signature); + git_buf_dispose(&baton->signed_data); + + free(baton->field); + delete baton; } diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index b1899d7e9..253d61e06 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -140,6 +140,10 @@ void GitFilterList::LoadWorker::HandleErrorCallback() { free((void *)baton->error); } + git_filter_list_free(baton->filters); + + free((void *)baton->path); + delete baton; } @@ -260,5 +264,7 @@ void GitFilterList::LoadWorker::HandleOKCallback() { } } + free((void *)baton->path); + delete baton; } diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index 5255f6fbf..2ca9f5f47 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -55,6 +55,8 @@ void GitFilterSource::RepoWorker::HandleErrorCallback() { free((void *)baton->error); } + git_repository_free(baton->out); + delete baton; } diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index bbfa32e46..af7a875ea 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -86,6 +86,13 @@ void GitPatch::ConvenientFromDiffWorker::HandleErrorCallback() { free((void *)baton->error); } + while (!baton->out->empty()) { + PatchDataFree(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + delete baton; } diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 31850de0e..75a7ffed4 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -60,6 +60,8 @@ void GitRemote::ReferenceListWorker::HandleErrorCallback() { free((void *)baton->error); } + delete baton->out; + delete baton; } diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index f1ec6d3df..b868bc422 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -90,6 +90,14 @@ void GitRepository::GetReferencesWorker::HandleErrorCallback() { free((void *)baton->error); } + while (baton->out->size()) { + git_reference *referenceToFree = baton->out->back(); + baton->out->pop_back(); + git_reference_free(referenceToFree); + } + + delete baton->out; + delete baton; } diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 2e1d4ed29..6e3a398ab 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -92,6 +92,14 @@ void GitRepository::GetRemotesWorker::HandleErrorCallback() { free((void *)baton->error); } + while (baton->out->size()) { + git_remote *remoteToFree = baton->out->back(); + baton->out->pop_back(); + git_remote_free(remoteToFree); + } + + delete baton->out; + delete baton; } diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index fc93240fd..5d3e07998 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -71,6 +71,13 @@ void GitRepository::GetSubmodulesWorker::HandleErrorCallback() { free((void *)baton->error); } + while (baton->out->size()) { + git_submodule_free(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + delete baton; } diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 7c27dfec3..6257b26f7 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -598,6 +598,9 @@ void GitRepository::RefreshReferencesWorker::HandleErrorCallback() { free((void *)baton->error); } + RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; + delete refreshData; + delete baton; } @@ -606,7 +609,7 @@ void GitRepository::RefreshReferencesWorker::HandleOKCallback() if (baton->out != NULL) { RefreshedRefModel::ensureSignatureRegexes(); - RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; + auto refreshData = (RefreshReferencesData *)baton->out; v8::Local result = Nan::New(); Nan::Set( diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index 00270703e..e99543d52 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -216,6 +216,14 @@ void GitRevwalk::CommitWalkWorker::HandleErrorCallback() { free((void *)baton->error); } + auto out = static_cast *>(baton->out); + while (out->size()) { + delete out->back(); + out->pop_back(); + } + + delete out; + delete baton; } diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index c9ae994cf..989ed15c0 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -81,6 +81,13 @@ void GitRevwalk::FastWalkWorker::HandleErrorCallback() { free((void *)baton->error); } + while(!baton->out->empty()) { + free(baton->out->back()); + baton->out->pop_back(); + } + + delete baton->out; + delete baton; } diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 9a54f526d..850e5d309 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -433,6 +433,14 @@ void GitRevwalk::FileHistoryWalkWorker::HandleErrorCallback() { free((void *)baton->error); } + for (unsigned int i = 0; i < baton->out->size(); ++i) { + delete static_cast(baton->out->at(i)); + } + + delete baton->out; + + free((void *)baton->file_path); + delete baton; } diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc index 2fa1de17b..755783e74 100644 --- a/generate/templates/manual/src/convenient_hunk.cc +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -99,6 +99,8 @@ NAN_METHOD(ConvenientHunk::Lines) { LinesBaton *baton = new LinesBaton(); baton->hunk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->lines = new std::vector; + baton->lines->reserve(baton->hunk->numLines); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); LinesWorker *worker = new LinesWorker(baton, callback); @@ -115,8 +117,6 @@ nodegit::LockMaster ConvenientHunk::LinesWorker::AcquireLocks() { } void ConvenientHunk::LinesWorker::Execute() { - baton->lines = new std::vector; - baton->lines->reserve(baton->hunk->numLines); for (unsigned int i = 0; i < baton->hunk->numLines; ++i) { git_diff_line *storeLine = (git_diff_line *)malloc(sizeof(git_diff_line)); storeLine->origin = baton->hunk->lines->at(i)->origin; @@ -130,7 +130,14 @@ void ConvenientHunk::LinesWorker::Execute() { } } -void ConvenientHunk::LinesWorker::HandleErrorCallback() {} +void ConvenientHunk::LinesWorker::HandleErrorCallback() { + while (!baton->lines->empty()) { + free(baton->lines->back()); + baton->lines->pop_back(); + } + + delete baton->lines; +} void ConvenientHunk::LinesWorker::HandleOKCallback() { unsigned int size = baton->lines->size(); diff --git a/generate/templates/manual/src/convenient_patch.cc b/generate/templates/manual/src/convenient_patch.cc index 47044e9dd..99096a390 100644 --- a/generate/templates/manual/src/convenient_patch.cc +++ b/generate/templates/manual/src/convenient_patch.cc @@ -215,6 +215,8 @@ NAN_METHOD(ConvenientPatch::Hunks) { HunksBaton *baton = new HunksBaton(); baton->patch = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->hunks = new std::vector; + baton->hunks->reserve(baton->patch->numHunks); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); HunksWorker *worker = new HunksWorker(baton, callback); @@ -232,9 +234,6 @@ nodegit::LockMaster ConvenientPatch::HunksWorker::AcquireLocks() { void ConvenientPatch::HunksWorker::Execute() { // copy hunks - baton->hunks = new std::vector; - baton->hunks->reserve(baton->patch->numHunks); - for (unsigned int i = 0; i < baton->patch->numHunks; ++i) { HunkData *hunkData = new HunkData(); hunkData->numLines = baton->patch->hunks->at(i)->numLines; @@ -263,7 +262,19 @@ void ConvenientPatch::HunksWorker::Execute() { } } -void ConvenientPatch::HunksWorker::HandleErrorCallback() {} +void ConvenientPatch::HunksWorker::HandleErrorCallback() { + while (!baton->hunks->empty()) { + HunkData *hunk = baton->hunks->back(); + baton->hunks->pop_back(); + + while (!hunk->lines->empty()) { + free(hunk->lines->back()); + hunk->lines->pop_back(); + } + } + + delete baton->hunks; +} void ConvenientPatch::HunksWorker::HandleOKCallback() { unsigned int size = baton->hunks->size(); diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 418c1142e..c9d9b5ffd 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -105,6 +105,8 @@ void GitFilterRegistry::RegisterWorker::HandleErrorCallback() { free((void *)baton->error); } + free(baton->filter_name); + delete baton; } @@ -147,6 +149,8 @@ void GitFilterRegistry::RegisterWorker::HandleOKCallback() { callback->Call(0, NULL, async_resource); } + free(baton->filter_name); + delete baton; } @@ -208,6 +212,8 @@ void GitFilterRegistry::UnregisterWorker::HandleErrorCallback() { free((void *)baton->error); } + free(baton->filter_name); + delete baton; } @@ -253,5 +259,7 @@ void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { callback->Call(0, NULL, async_resource); } + free(baton->filter_name); + delete baton; } From e4a9092519536499d673d8fe261f0b9b478e727e Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 3 Sep 2020 10:27:47 -0700 Subject: [PATCH 233/545] Enable module from workers --- generate/templates/templates/nodegit.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index e174ae27b..45ce409fb 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -108,4 +108,4 @@ NAN_MODULE_INIT(init) { nodegit::LockMaster::InitializeContext(); } -NODE_MODULE(nodegit, init) +NAN_MODULE_WORKER_ENABLED(nodegit, init) From 7f358d1c6e4300ab398f1854c808cd0380be75e9 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 3 Sep 2020 11:22:26 -0700 Subject: [PATCH 234/545] Test clone via worker thread --- test/tests/clone.js | 47 ++++++++++++++++++++++++++++++++++++++ test/utils/clone_worker.js | 19 +++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 test/utils/clone_worker.js diff --git a/test/tests/clone.js b/test/tests/clone.js index 965d78bc7..ab40e4ffc 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -1,3 +1,4 @@ +var { Worker } = require("worker_threads"); var path = require("path"); var assert = require("assert"); var fse = require("fs-extra"); @@ -54,6 +55,52 @@ describe("Clone", function() { }); }); + it("can clone with https via worker thread", function(done) { + const workerPath = path.join(__dirname, "../utils/clone_worker.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (success) => { + if (success) { + done(); + } else { + assert.fail(); + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code !== 0) { + assert.fail(); + } + }); + }); + + for (let i = 0; i < 5; ++i) { + it(`can kill worker thread while cloning #${i}`, function(done) { // jshint ignore:line + const workerPath = path.join(__dirname, "../utils/clone_worker.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("error", () => assert.fail()); + worker.on("message", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1) { + done(); + } else { + assert.fail(); + } + }); + + setTimeout(() => { worker.terminate(); }, 500); + }); + } + it("can clone twice with https using same config object", function() { var test = this; var url = "https://github.com/nodegit/test.git"; diff --git a/test/utils/clone_worker.js b/test/utils/clone_worker.js new file mode 100644 index 000000000..18a2c68ec --- /dev/null +++ b/test/utils/clone_worker.js @@ -0,0 +1,19 @@ +const { parentPort, workerData } = require("worker_threads"); +const assert = require("assert"); +const NodeGit = require("../../"); + +const { clonePath, url } = workerData; +const opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +return NodeGit.Clone(url, clonePath, opts).then(repo => { + assert.ok(repo instanceof NodeGit.Repository); + parentPort.postMessage(true); +}).catch(() => { + parentPort.postMessage(false); +}); From 7c50ce5f6c8efeb9864c469994eede58c8d297a4 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 3 Sep 2020 11:24:27 -0700 Subject: [PATCH 235/545] Allow nodegit to run via worker thread or web worker --- generate/templates/templates/nodegit.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/generate/templates/templates/nodegit.js b/generate/templates/templates/nodegit.js index 8009150ef..bb9739ac9 100644 --- a/generate/templates/templates/nodegit.js +++ b/generate/templates/templates/nodegit.js @@ -8,10 +8,6 @@ try { var rawApi; -if (worker && (!worker.isMainThread || typeof importScripts === "function")) { - throw new Error("NodeGit is currently not safe to run in a worker thread or web worker"); // jshint ignore:line -} - // Attempt to load the production release first, if it fails fall back to the // debug release. try { From f82e10ccbc3ce7afe1109e1283b21aa344a272bc Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 3 Sep 2020 13:27:53 -0700 Subject: [PATCH 236/545] More reliable worker thread test --- test/tests/clone.js | 47 ---------------------- test/tests/worker.js | 81 ++++++++++++++++++++++++++++++++++++++ test/utils/clone_worker.js | 19 --------- test/utils/worker.js | 38 ++++++++++++++++++ 4 files changed, 119 insertions(+), 66 deletions(-) create mode 100644 test/tests/worker.js delete mode 100644 test/utils/clone_worker.js create mode 100644 test/utils/worker.js diff --git a/test/tests/clone.js b/test/tests/clone.js index ab40e4ffc..965d78bc7 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -1,4 +1,3 @@ -var { Worker } = require("worker_threads"); var path = require("path"); var assert = require("assert"); var fse = require("fs-extra"); @@ -55,52 +54,6 @@ describe("Clone", function() { }); }); - it("can clone with https via worker thread", function(done) { - const workerPath = path.join(__dirname, "../utils/clone_worker.js"); - const worker = new Worker(workerPath, { - workerData: { - clonePath, - url: "https://github.com/nodegit/test.git" - } - }); - worker.on("message", (success) => { - if (success) { - done(); - } else { - assert.fail(); - } - }); - worker.on("error", () => assert.fail()); - worker.on("exit", (code) => { - if (code !== 0) { - assert.fail(); - } - }); - }); - - for (let i = 0; i < 5; ++i) { - it(`can kill worker thread while cloning #${i}`, function(done) { // jshint ignore:line - const workerPath = path.join(__dirname, "../utils/clone_worker.js"); - const worker = new Worker(workerPath, { - workerData: { - clonePath, - url: "https://github.com/nodegit/test.git" - } - }); - worker.on("error", () => assert.fail()); - worker.on("message", () => assert.fail()); - worker.on("exit", (code) => { - if (code === 1) { - done(); - } else { - assert.fail(); - } - }); - - setTimeout(() => { worker.terminate(); }, 500); - }); - } - it("can clone twice with https using same config object", function() { var test = this; var url = "https://github.com/nodegit/test.git"; diff --git a/test/tests/worker.js b/test/tests/worker.js new file mode 100644 index 000000000..c7aed3162 --- /dev/null +++ b/test/tests/worker.js @@ -0,0 +1,81 @@ +const { Worker } = require("worker_threads"); +const path = require("path"); +const assert = require("assert"); +const fse = require("fs-extra"); +const local = path.join.bind(path, __dirname); + +describe("Worker", function() { + const clonePath = local("../repos/clone"); + + // Set a reasonable timeout here now that our repository has grown. + this.timeout(30000); + + beforeEach(function() { + return fse.remove(clonePath).catch(function(err) { + console.log(err); + + throw err; + }); + }); + + it("can perform basic functionality via worker thread", function(done) { + const workerPath = local("../utils/worker.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "init": + break; + case "success": + done(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code !== 0) { + assert.fail(); + } + }); + }); + + for (let i = 0; i < 5; ++i) { + it(`can kill worker thread while in use #${i}`, function(done) { // jshint ignore:line + const workerPath = local("../utils/worker.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "init": + setTimeout(() => { worker.terminate(); }, 500); + break; + case "success": + assert.fail(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1) { + done(); + } else { + assert.fail(); + } + }); + }); + } +}); diff --git a/test/utils/clone_worker.js b/test/utils/clone_worker.js deleted file mode 100644 index 18a2c68ec..000000000 --- a/test/utils/clone_worker.js +++ /dev/null @@ -1,19 +0,0 @@ -const { parentPort, workerData } = require("worker_threads"); -const assert = require("assert"); -const NodeGit = require("../../"); - -const { clonePath, url } = workerData; -const opts = { - fetchOpts: { - callbacks: { - certificateCheck: () => 0 - } - } -}; - -return NodeGit.Clone(url, clonePath, opts).then(repo => { - assert.ok(repo instanceof NodeGit.Repository); - parentPort.postMessage(true); -}).catch(() => { - parentPort.postMessage(false); -}); diff --git a/test/utils/worker.js b/test/utils/worker.js new file mode 100644 index 000000000..6f2d21840 --- /dev/null +++ b/test/utils/worker.js @@ -0,0 +1,38 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const assert = require("assert"); +const NodeGit = require("../../"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +parentPort.postMessage("init"); + +const { clonePath, url } = workerData; +const opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +return NodeGit.Clone(url, clonePath, opts).then((_repository) => { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return repository.index(); +}).then((index) => { + assert.ok(index instanceof NodeGit.Index); + return repository.getRemoteNames(); +}).then((remotes) => { + assert.ok(Array.isArray(remotes)); + return repository.getCurrentBranch(); +}).then((branch) => { + assert.ok(branch instanceof NodeGit.Reference); + parentPort.postMessage("success"); +}).catch(() => parentPort.postMessage("failure")); From 8a5ee942660430bf462cda717c538df38ec8e899 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 8 Sep 2020 11:44:29 -0700 Subject: [PATCH 237/545] Remove duplicate locks We already lock in AcquireLocks --- generate/templates/manual/repository/refresh_references.cc | 1 - generate/templates/manual/src/filter_registry.cc | 2 -- 2 files changed, 3 deletions(-) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 6257b26f7..c9d1353c9 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -420,7 +420,6 @@ void GitRepository::RefreshReferencesWorker::Execute() { giterr_clear(); - nodegit::LockMaster lockMaster(true, baton->repo); git_repository *repo = baton->repo; RefreshReferencesData *refreshData = (RefreshReferencesData *)baton->out; git_odb *odb; diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index c9d9b5ffd..734f20c1a 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -86,7 +86,6 @@ void GitFilterRegistry::RegisterWorker::Execute() { git_error_clear(); { - nodegit::LockMaster lockMaster(/*asyncAction: */true, baton->filter_name, baton->filter); int result = git_filter_register(baton->filter_name, baton->filter, baton->filter_priority); baton->error_code = result; @@ -193,7 +192,6 @@ void GitFilterRegistry::UnregisterWorker::Execute() { git_error_clear(); { - nodegit::LockMaster lockMaster(/*asyncAction: */true, baton->filter_name); int result = git_filter_unregister(baton->filter_name); baton->error_code = result; From aaa34eee628351e48fc987c9f6519865972c71e3 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 10 Sep 2020 13:27:53 -0700 Subject: [PATCH 238/545] Verify context before running cppCallback --- .../manual/include/nodegit_wrapper.h | 7 +++ .../templates/manual/include/thread_pool.h | 7 ++- generate/templates/manual/src/context.cc | 2 +- .../templates/manual/src/nodegit_wrapper.cc | 6 ++- generate/templates/manual/src/thread_pool.cc | 53 ++++++++++++++----- .../templates/partials/field_accessors.cc | 9 +++- 6 files changed, 65 insertions(+), 19 deletions(-) diff --git a/generate/templates/manual/include/nodegit_wrapper.h b/generate/templates/manual/include/nodegit_wrapper.h index b48e956d1..3d8f5a089 100644 --- a/generate/templates/manual/include/nodegit_wrapper.h +++ b/generate/templates/manual/include/nodegit_wrapper.h @@ -14,6 +14,10 @@ // static const bool isFreeable // static void free(cType *raw) - frees the object using freeFunctionName +namespace nodegit { + class Context; +} + template class NodeGitWrapper : public Nan::ObjectWrap { public: @@ -29,6 +33,9 @@ class NodeGitWrapper : public Nan::ObjectWrap { // (and through a method) instead of changing selfFreeing, but that's // a separate issue. bool selfFreeing; + + const nodegit::Context *nodegitContext = nullptr; + protected: cType *raw; diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 74ed09bdf..e40ad2bb6 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -9,6 +9,7 @@ #include "async_worker.h" namespace nodegit { + class Context; class ThreadPoolImpl; class ThreadPool { @@ -20,7 +21,7 @@ namespace nodegit { // Initializes thread pool and spins up the requested number of threads // The provided loop will be used for completion callbacks, whenever // queued work is completed - ThreadPool(int numberOfThreads, uv_loop_t *loop); + ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context); ~ThreadPool(); @@ -35,6 +36,10 @@ namespace nodegit { // when scheduling work on the JS thread. static Nan::AsyncResource *GetCurrentAsyncResource(); + // Same as GetCurrentAsyncResource, except used to ensure callbacks occur + // in the correct context. + static const nodegit::Context *GetCurrentContext(); + // Queues a callback on the loop provided in the constructor static void PostCallbackEvent(OnPostCallbackFn onPostCallback); diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index 16a8e6267..7152e3643 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -12,7 +12,7 @@ namespace nodegit { } Context::Context(v8::Isolate *isolate) - : isolate(isolate), threadPool(10, node::GetCurrentEventLoop(isolate)) + : isolate(isolate), threadPool(10, node::GetCurrentEventLoop(isolate), this) { Nan::HandleScope scopoe; v8::Local storage = Nan::New(); diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index a9f0483b3..2eb295a80 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -1,5 +1,6 @@ template -NodeGitWrapper::NodeGitWrapper(typename Traits::cType *raw, bool selfFreeing, v8::Local owner) { +NodeGitWrapper::NodeGitWrapper(typename Traits::cType *raw, bool selfFreeing, v8::Local owner) + : nodegitContext(nodegit::Context::GetCurrentContext()) { if (Traits::isSingleton) { ReferenceCounter::incrementCountForPointer((void *)raw); this->raw = raw; @@ -35,7 +36,8 @@ NodeGitWrapper::NodeGitWrapper(typename Traits::cType *raw, bool selfFre } template -NodeGitWrapper::NodeGitWrapper(const char *error) { +NodeGitWrapper::NodeGitWrapper(const char *error) + : nodegitContext(nodegit::Context::GetCurrentContext()) { selfFreeing = false; raw = NULL; Nan::ThrowError(error); diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 17e8d758a..1d47a6213 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -1,4 +1,5 @@ #include +#include "../include/context.h" #include "../include/thread_pool.h" #include @@ -84,7 +85,8 @@ namespace nodegit { Executor( PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator, PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator, - TakeNextTaskFn takeNextTask + TakeNextTaskFn takeNextTask, + nodegit::Context *context ); void RunTaskLoop(); @@ -95,6 +97,8 @@ namespace nodegit { static Nan::AsyncResource *GetCurrentAsyncResource(); + static const nodegit::Context *GetCurrentContext(); + static void PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback); // Libgit2 will call this before it spawns a child thread. @@ -114,6 +118,7 @@ namespace nodegit { private: Nan::AsyncResource *currentAsyncResource; + nodegit::Context *currentContext; // We need to populate the executor on every thread that libgit2 // could make a callback on so that it can correctly queue callbacks // in the correct javascript context @@ -127,9 +132,11 @@ namespace nodegit { Executor::Executor( PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator, PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator, - TakeNextTaskFn takeNextTask + TakeNextTaskFn takeNextTask, + nodegit::Context *context ) : currentAsyncResource(nullptr), + currentContext(context), postCallbackEventToOrchestrator(postCallbackEventToOrchestrator), postCompletedEventToOrchestrator(postCompletedEventToOrchestrator), takeNextTask(takeNextTask), @@ -171,6 +178,16 @@ namespace nodegit { return nullptr; } + const nodegit::Context *Executor::GetCurrentContext() { + if (executor) { + return executor->currentContext; + } + + // NOTE this should always be set when a libgit2 callback is running, + // so this case should not happen. + return nullptr; + } + void Executor::PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback) { if (executor) { executor->postCallbackEventToOrchestrator(onPostCallback); @@ -226,7 +243,8 @@ namespace nodegit { public: OrchestratorImpl( QueueCallbackOnJSThreadFn queueCallbackOnJSThread, - TakeNextJobFn takeNextJob + TakeNextJobFn takeNextJob, + nodegit::Context *context ); void RunJobLoop(); @@ -272,7 +290,8 @@ namespace nodegit { public: Orchestrator( QueueCallbackOnJSThreadFn queueCallbackOnJSThread, - TakeNextJobFn takeNextJob + TakeNextJobFn takeNextJob, + nodegit::Context *context ); void WaitForThreadClose(); @@ -280,7 +299,8 @@ namespace nodegit { Orchestrator::OrchestratorImpl::OrchestratorImpl( QueueCallbackOnJSThreadFn queueCallbackOnJSThread, - TakeNextJobFn takeNextJob + TakeNextJobFn takeNextJob, + nodegit::Context *context ) : taskMutex(new std::mutex), executorEventsMutex(new std::mutex), @@ -291,7 +311,8 @@ namespace nodegit { executor( std::bind(&Orchestrator::OrchestratorImpl::PostCallbackEvent, this, _1), std::bind(&Orchestrator::OrchestratorImpl::PostCompletedEvent, this), - std::bind(&Orchestrator::OrchestratorImpl::TakeNextTask, this) + std::bind(&Orchestrator::OrchestratorImpl::TakeNextTask, this), + context ) {} @@ -406,9 +427,10 @@ namespace nodegit { Orchestrator::Orchestrator( QueueCallbackOnJSThreadFn queueCallbackOnJSThread, - TakeNextJobFn takeNextJob + TakeNextJobFn takeNextJob, + nodegit::Context *context ) - : impl(new OrchestratorImpl(queueCallbackOnJSThread, takeNextJob)) + : impl(new OrchestratorImpl(queueCallbackOnJSThread, takeNextJob, context)) {} void Orchestrator::WaitForThreadClose() { @@ -417,7 +439,7 @@ namespace nodegit { class ThreadPoolImpl { public: - ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop); + ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context); void QueueWorker(nodegit::AsyncWorker *worker); @@ -475,7 +497,7 @@ namespace nodegit { std::vector orchestrators; }; - ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop) + ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) : isMarkedForDeletion(false), orchestratorJobMutex(new std::mutex), jsThreadCallbackMutex(new std::mutex), @@ -490,7 +512,8 @@ namespace nodegit { for (int i = 0; i < numberOfThreads; i++) { orchestrators.emplace_back( std::bind(&ThreadPoolImpl::QueueCallbackOnJSThread, this, _1, _2, _3), - std::bind(&ThreadPoolImpl::TakeNextJob, this) + std::bind(&ThreadPoolImpl::TakeNextJob, this), + context ); } } @@ -657,8 +680,8 @@ namespace nodegit { uv_close((uv_handle_t *)jsThreadCallbackAsync, nullptr); } - ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop) - : impl(new ThreadPoolImpl(numberOfThreads, loop)) + ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) + : impl(new ThreadPoolImpl(numberOfThreads, loop, context)) {} ThreadPool::~ThreadPool() {} @@ -675,6 +698,10 @@ namespace nodegit { return Executor::GetCurrentAsyncResource(); } + const nodegit::Context *ThreadPool::GetCurrentContext() { + return Executor::GetCurrentContext(); + } + void ThreadPool::Shutdown() { impl->Shutdown(); } diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 5bbe0b2f6..26f52ef4d 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -138,7 +138,9 @@ {{ cppClassName }}* instance = {{ field.name }}_getInstanceFromBaton(baton); {% if field.return.type == "void" %} - if (instance->{{ field.name }}.WillBeThrottled()) { + if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { + delete baton; + } else if (instance->{{ field.name }}.WillBeThrottled()) { delete baton; } else if (instance->{{ field.name }}.ShouldWaitForResult()) { baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync); @@ -150,7 +152,10 @@ {% else %} {{ field.return.type }} result; - if (instance->{{ field.name }}.WillBeThrottled()) { + if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { + result = baton->defaultResult; + delete baton; + } else if (instance->{{ field.name }}.WillBeThrottled()) { result = baton->defaultResult; delete baton; } else if (instance->{{ field.name }}.ShouldWaitForResult()) { From 69d9d4e03235a52c13a5bd52d7a5f15aa0481655 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 11 Sep 2020 10:32:15 -0700 Subject: [PATCH 239/545] Stick to c++11 for a little bit longer RHEL 7 is still fairly popular and on GCC 4.8.x --- generate/templates/manual/src/lock_master.cc | 11 +++++++---- generate/templates/templates/binding.gyp | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/generate/templates/manual/src/lock_master.cc b/generate/templates/manual/src/lock_master.cc index 72740db8e..8ad33378f 100644 --- a/generate/templates/manual/src/lock_master.cc +++ b/generate/templates/manual/src/lock_master.cc @@ -77,16 +77,19 @@ namespace nodegit { std::mutex LockMasterImpl::mapMutex; thread_local LockMasterImpl* LockMasterImpl::currentLockMaster = nullptr; - LockMaster::LockMaster(LockMaster &&other) - : impl(std::exchange(other.impl, nullptr)) - {} + LockMaster::LockMaster(LockMaster &&other) { + impl = other.impl; + other.impl = nullptr; + } LockMaster &LockMaster::operator=(LockMaster &&other) { if (&other == this) { return *this; } - impl = std::exchange(other.impl, nullptr); + impl = other.impl; + other.impl = nullptr; + return *this; } diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 2f9acf366..d47e32f31 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -114,7 +114,7 @@ "GCC_ENABLE_CPP_EXCEPTIONS": "YES", "MACOSX_DEPLOYMENT_TARGET": "10.9", 'CLANG_CXX_LIBRARY': 'libc++', - 'CLANG_CXX_LANGUAGE_STANDARD':'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD':'c++11', "WARNING_CFLAGS": [ "-Wno-unused-variable", @@ -166,7 +166,7 @@ [ "OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { "cflags": [ - "-std=c++14" + "-std=c++11" ] } ], From ee1865c69eb215f9a688e54cd423b4f99c678dac Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 11 Sep 2020 11:04:35 -0700 Subject: [PATCH 240/545] Only test worker_threads if they are available --- test/tests/worker.js | 101 +++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/test/tests/worker.js b/test/tests/worker.js index c7aed3162..e141b58aa 100644 --- a/test/tests/worker.js +++ b/test/tests/worker.js @@ -1,55 +1,32 @@ -const { Worker } = require("worker_threads"); const path = require("path"); const assert = require("assert"); const fse = require("fs-extra"); const local = path.join.bind(path, __dirname); -describe("Worker", function() { - const clonePath = local("../repos/clone"); +let Worker; - // Set a reasonable timeout here now that our repository has grown. - this.timeout(30000); +try { + Worker = require("worker_threads").Worker; +} catch (e) {} - beforeEach(function() { - return fse.remove(clonePath).catch(function(err) { - console.log(err); +if (Worker) { + describe("Worker", function() { + const clonePath = local("../repos/clone"); - throw err; - }); - }); + // Set a reasonable timeout here now that our repository has grown. + this.timeout(30000); - it("can perform basic functionality via worker thread", function(done) { - const workerPath = local("../utils/worker.js"); - const worker = new Worker(workerPath, { - workerData: { - clonePath, - url: "https://github.com/nodegit/test.git" - } - }); - worker.on("message", (message) => { - switch (message) { - case "init": - break; - case "success": - done(); - break; - case "failure": - assert.fail(); - break; - } - }); - worker.on("error", () => assert.fail()); - worker.on("exit", (code) => { - if (code !== 0) { - assert.fail(); - } + beforeEach(function() { + return fse.remove(clonePath).catch(function(err) { + console.log(err); + + throw err; + }); }); - }); - for (let i = 0; i < 5; ++i) { - it(`can kill worker thread while in use #${i}`, function(done) { // jshint ignore:line + it("can perform basic functionality via worker thread", function(done) { const workerPath = local("../utils/worker.js"); - const worker = new Worker(workerPath, { + const worker = new Worker(workerPath, { workerData: { clonePath, url: "https://github.com/nodegit/test.git" @@ -58,10 +35,9 @@ describe("Worker", function() { worker.on("message", (message) => { switch (message) { case "init": - setTimeout(() => { worker.terminate(); }, 500); break; case "success": - assert.fail(); + done(); break; case "failure": assert.fail(); @@ -70,12 +46,43 @@ describe("Worker", function() { }); worker.on("error", () => assert.fail()); worker.on("exit", (code) => { - if (code === 1) { - done(); - } else { + if (code !== 0) { assert.fail(); } }); }); - } -}); + + for (let i = 0; i < 5; ++i) { + it(`can kill worker thread while in use #${i}`, function(done) { // jshint ignore:line + const workerPath = local("../utils/worker.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "init": + setTimeout(() => { worker.terminate(); }, 500); + break; + case "success": + assert.fail(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1) { + done(); + } else { + assert.fail(); + } + }); + }); + } + }); +} From a21efa66a2da6a5f21b836854e4190bb5c6d76dc Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 11 Sep 2020 15:47:08 -0700 Subject: [PATCH 241/545] Threadpool shutdown uv_close asynchronously Windows fails to shutdown synchronously, so shutdown asynchronously. This is only supported by node 14.10+ currently. Should be backported to LTS releases shortly --- generate/templates/manual/include/context.h | 10 +++++++ .../templates/manual/include/thread_pool.h | 2 +- generate/templates/manual/src/context.cc | 27 ++++++++++++------- generate/templates/manual/src/thread_pool.cc | 12 ++++----- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 1027622ec..d34fc13da 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -2,6 +2,7 @@ #define NODEGIT_CONTEXT #include +#include #include #include #include @@ -27,11 +28,20 @@ namespace nodegit { void ShutdownThreadPool(); + struct AsyncCleanupData { + Context *context; + node::AsyncCleanupHookHandle handle; + void (*doneCallback)(void*); + void *doneData; + }; + private: v8::Isolate *isolate; ThreadPool threadPool; + std::unique_ptr asyncCleanupData; + // This map contains persistent handles that need to be cleaned up // after the context has been torn down. // Often this is used as a context-aware storage cell for `*::InitializeComponent` diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index e40ad2bb6..394e7a46b 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -46,7 +46,7 @@ namespace nodegit { // Called once at libgit2 initialization to setup contracts with libgit2 static void InitializeGlobal(); - // Will wait for all threads to terminate before returning + // Will asynchronously shutdown the thread pool // It will also clean up any resources that the thread pool is keeping alive void Shutdown(); diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index 7152e3643..5fdb052f6 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -1,28 +1,35 @@ #include "../include/context.h" -namespace nodegit { - std::map Context::contexts; - - static void CleanupContext(void *data) { - Context *context = static_cast(data); +namespace { + void AsyncCleanupContext(void *data, void(*uvCallback)(void*), void *uvCallbackData) { + auto asyncCleanupData = static_cast(data); + asyncCleanupData->doneCallback = uvCallback; + asyncCleanupData->doneData = uvCallbackData; - context->ShutdownThreadPool(); - - delete context; + asyncCleanupData->context->ShutdownThreadPool(); } +} + +namespace nodegit { + std::map Context::contexts; Context::Context(v8::Isolate *isolate) - : isolate(isolate), threadPool(10, node::GetCurrentEventLoop(isolate), this) + : isolate(isolate) + , threadPool(10, node::GetCurrentEventLoop(isolate), this) + , asyncCleanupData(new Context::AsyncCleanupData()) { Nan::HandleScope scopoe; v8::Local storage = Nan::New(); persistentStorage.Reset(storage); contexts[isolate] = this; - node::AddEnvironmentCleanupHook(isolate, CleanupContext, this); + asyncCleanupData->context = this; + asyncCleanupData->handle = node::AddEnvironmentCleanupHook(isolate, AsyncCleanupContext, asyncCleanupData.get()); } Context::~Context() { contexts.erase(isolate); + + asyncCleanupData->doneCallback(asyncCleanupData->doneData); } Context *Context::GetCurrentContext() { diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 1d47a6213..73d3a3719 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -457,6 +457,7 @@ namespace nodegit { private: bool isMarkedForDeletion; + nodegit::Context *currentContext; struct JSThreadCallback { JSThreadCallback(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork) @@ -499,6 +500,7 @@ namespace nodegit { ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) : isMarkedForDeletion(false), + currentContext(context), orchestratorJobMutex(new std::mutex), jsThreadCallbackMutex(new std::mutex), jsThreadCallbackAsync(new uv_async_t) @@ -672,12 +674,10 @@ namespace nodegit { jsThreadCallbackQueue.pop(); } - // NOTE We are deliberately leaking this pointer because `async` cleanup in - // node has not completely landed yet. Trying to cleanup this pointer - // is probably not worth the fight as it's very little memory lost per context - // When all LTS versions of node and Electron support async cleanup, we should - // be heading back to cleanup this - uv_close((uv_handle_t *)jsThreadCallbackAsync, nullptr); + uv_close(reinterpret_cast(jsThreadCallbackAsync), [](uv_handle_t *handle) { + auto threadPoolImpl = static_cast(handle->data); + delete threadPoolImpl->currentContext; + }); } ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) From 130560b432539c1b4b740b26c1150d51a6756234 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 11 Sep 2020 15:47:43 -0700 Subject: [PATCH 242/545] Fix misc warnings --- generate/templates/manual/patches/convenient_patches.cc | 2 +- generate/templates/manual/src/async_baton.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index af7a875ea..2e6f1ae92 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -36,7 +36,7 @@ void GitPatch::ConvenientFromDiffWorker::Execute() { std::vector patchesToBeFreed; - for (int i = 0; i < git_diff_num_deltas(baton->diff); ++i) { + for (std::size_t i = 0; i < git_diff_num_deltas(baton->diff); ++i) { git_patch *nextPatch; int result = git_patch_from_diff(&nextPatch, baton->diff, i); diff --git a/generate/templates/manual/src/async_baton.cc b/generate/templates/manual/src/async_baton.cc index 2bcd0ea82..f21e0f709 100644 --- a/generate/templates/manual/src/async_baton.cc +++ b/generate/templates/manual/src/async_baton.cc @@ -37,7 +37,7 @@ namespace nodegit { }; ThreadPool::PostCallbackEvent( - [this, jsCallback, cancelCallback]( + [jsCallback, cancelCallback]( ThreadPool::QueueCallbackFn queueCallback, ThreadPool::Callback callbackCompleted ) -> ThreadPool::Callback { From 9d5a42bf7daaa83d5badfbf46892eeabc5b8dd24 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 11 Sep 2020 15:51:19 -0700 Subject: [PATCH 243/545] Test on node 14 only until backport of required node PR PR: https://github.com/nodejs/node/pull/34819 --- .github/workflows/tests.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2f2f782a3..5e2ac9ee8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,8 @@ jobs: name: "*nix Tests" strategy: matrix: - node: [10, 12, 14] + # TODO wait for https://github.com/nodejs/node/pull/34819 backport to 10 + 12 + node: [14] os: [ubuntu-16.04, macOS-10.15] runs-on: ${{ matrix.os }} steps: @@ -72,7 +73,8 @@ jobs: name: Windows Tests strategy: matrix: - node: [10, 12, 14] + # TODO wait for https://github.com/nodejs/node/pull/34819 backport to 10 + 12 + node: [14] arch: [x86, x64] runs-on: windows-2016 steps: From 01765fb3fd8204eec46187758ecd6ecfc260589b Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 11 Sep 2020 16:13:24 -0700 Subject: [PATCH 244/545] Don't leak jsThreadCallbackAsync --- generate/templates/manual/src/thread_pool.cc | 23 ++++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 73d3a3719..f43411d0c 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -493,7 +493,7 @@ namespace nodegit { // completion and async callbacks to be performed on the loop std::queue jsThreadCallbackQueue; std::unique_ptr jsThreadCallbackMutex; - uv_async_t *jsThreadCallbackAsync; + uv_async_t jsThreadCallbackAsync; std::vector orchestrators; }; @@ -502,12 +502,11 @@ namespace nodegit { : isMarkedForDeletion(false), currentContext(context), orchestratorJobMutex(new std::mutex), - jsThreadCallbackMutex(new std::mutex), - jsThreadCallbackAsync(new uv_async_t) + jsThreadCallbackMutex(new std::mutex) { - uv_async_init(loop, jsThreadCallbackAsync, RunLoopCallbacks); - jsThreadCallbackAsync->data = this; - uv_unref((uv_handle_t *)jsThreadCallbackAsync); + uv_async_init(loop, &jsThreadCallbackAsync, RunLoopCallbacks); + jsThreadCallbackAsync.data = this; + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); workInProgressCount = 0; @@ -524,7 +523,7 @@ namespace nodegit { std::lock_guard lock(*orchestratorJobMutex); // there is work on the thread pool - reference the handle so // node doesn't terminate - uv_ref((uv_handle_t *)jsThreadCallbackAsync); + uv_ref((uv_handle_t *)&jsThreadCallbackAsync); orchestratorJobQueue.emplace(new Orchestrator::AsyncWorkJob(worker)); workInProgressCount++; orchestratorJobCondition.notify_one(); @@ -563,7 +562,7 @@ namespace nodegit { // we only trigger RunLoopCallbacks via the jsThreadCallbackAsync handle if the queue // was empty. Otherwise, we depend on RunLoopCallbacks to re-trigger itself if (queueWasEmpty) { - uv_async_send(jsThreadCallbackAsync); + uv_async_send(&jsThreadCallbackAsync); } } @@ -587,7 +586,7 @@ namespace nodegit { lock.lock(); if (!jsThreadCallbackQueue.empty()) { - uv_async_send(jsThreadCallbackAsync); + uv_async_send(&jsThreadCallbackAsync); } // if there is no ongoing work / completion processing, node doesn't need @@ -596,7 +595,7 @@ namespace nodegit { std::lock_guard orchestratorLock(*orchestratorJobMutex); workInProgressCount--; if (!workInProgressCount) { - uv_unref((uv_handle_t *)jsThreadCallbackAsync); + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); } } } @@ -628,7 +627,7 @@ namespace nodegit { // unref the jsThreadCallback for all work in progress // it will not be used after this function has completed while (workInProgressCount--) { - uv_unref((uv_handle_t *)jsThreadCallbackAsync); + uv_unref((uv_handle_t *)&jsThreadCallbackAsync); } } @@ -674,7 +673,7 @@ namespace nodegit { jsThreadCallbackQueue.pop(); } - uv_close(reinterpret_cast(jsThreadCallbackAsync), [](uv_handle_t *handle) { + uv_close(reinterpret_cast(&jsThreadCallbackAsync), [](uv_handle_t *handle) { auto threadPoolImpl = static_cast(handle->data); delete threadPoolImpl->currentContext; }); From fb1737264cf36e1c4a3bd1c96a2a0314a7001f9e Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 11 Sep 2020 17:00:37 -0700 Subject: [PATCH 245/545] Build a cleanup handle that can be deleted by last user --- generate/templates/manual/include/context.h | 27 ++++++++------ .../templates/manual/include/thread_pool.h | 3 +- generate/templates/manual/src/context.cc | 35 ++++++++++--------- generate/templates/manual/src/thread_pool.cc | 13 +++---- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index d34fc13da..84e8c22c4 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -12,6 +12,7 @@ #include "thread_pool.h" namespace nodegit { + class AsyncContextCleanupHandle; class Context { public: Context(v8::Isolate *isolate); @@ -26,22 +27,13 @@ namespace nodegit { void SaveToPersistent(std::string key, const v8::Local &value); - void ShutdownThreadPool(); - - struct AsyncCleanupData { - Context *context; - node::AsyncCleanupHookHandle handle; - void (*doneCallback)(void*); - void *doneData; - }; + void ShutdownThreadPool(AsyncContextCleanupHandle *cleanupHandle); private: v8::Isolate *isolate; ThreadPool threadPool; - std::unique_ptr asyncCleanupData; - // This map contains persistent handles that need to be cleaned up // after the context has been torn down. // Often this is used as a context-aware storage cell for `*::InitializeComponent` @@ -50,6 +42,21 @@ namespace nodegit { static std::map contexts; }; + + class AsyncContextCleanupHandle { + public: + ~AsyncContextCleanupHandle(); + + private: + static void AsyncCleanupContext(void *data, void (*uvCallback)(void *), void *uvCallbackData); + + friend class Context; + AsyncContextCleanupHandle(v8::Isolate *isolate, Context *context); + Context *context; + node::AsyncCleanupHookHandle handle; + void (*doneCallback)(void *); + void *doneData; + }; } #endif diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 394e7a46b..e854f5495 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -10,6 +10,7 @@ namespace nodegit { class Context; + class AsyncContextCleanupHandle; class ThreadPoolImpl; class ThreadPool { @@ -48,7 +49,7 @@ namespace nodegit { // Will asynchronously shutdown the thread pool // It will also clean up any resources that the thread pool is keeping alive - void Shutdown(); + void Shutdown(AsyncContextCleanupHandle *cleanupHandle); private: std::unique_ptr impl; diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index 5fdb052f6..f5df2af81 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -1,35 +1,38 @@ #include "../include/context.h" -namespace { - void AsyncCleanupContext(void *data, void(*uvCallback)(void*), void *uvCallbackData) { - auto asyncCleanupData = static_cast(data); - asyncCleanupData->doneCallback = uvCallback; - asyncCleanupData->doneData = uvCallbackData; +namespace nodegit { + std::map Context::contexts; - asyncCleanupData->context->ShutdownThreadPool(); + AsyncContextCleanupHandle::AsyncContextCleanupHandle(v8::Isolate *isolate, Context *context) + : context(context), + handle(node::AddEnvironmentCleanupHook(isolate, AsyncCleanupContext, this)) + {} + + AsyncContextCleanupHandle::~AsyncContextCleanupHandle() { + delete context; + doneCallback(doneData); } -} -namespace nodegit { - std::map Context::contexts; + void AsyncContextCleanupHandle::AsyncCleanupContext(void *data, void(*uvCallback)(void*), void *uvCallbackData) { + auto cleanupHandle = static_cast(data); + cleanupHandle->doneCallback = uvCallback; + cleanupHandle->doneData = uvCallbackData; + cleanupHandle->context->ShutdownThreadPool(cleanupHandle); + } Context::Context(v8::Isolate *isolate) : isolate(isolate) , threadPool(10, node::GetCurrentEventLoop(isolate), this) - , asyncCleanupData(new Context::AsyncCleanupData()) { Nan::HandleScope scopoe; v8::Local storage = Nan::New(); persistentStorage.Reset(storage); contexts[isolate] = this; - asyncCleanupData->context = this; - asyncCleanupData->handle = node::AddEnvironmentCleanupHook(isolate, AsyncCleanupContext, asyncCleanupData.get()); + new AsyncContextCleanupHandle(isolate, this); } Context::~Context() { contexts.erase(isolate); - - asyncCleanupData->doneCallback(asyncCleanupData->doneData); } Context *Context::GetCurrentContext() { @@ -56,7 +59,7 @@ namespace nodegit { Nan::Set(storage, Nan::New(key).ToLocalChecked(), value); } - void Context::ShutdownThreadPool() { - threadPool.Shutdown(); + void Context::ShutdownThreadPool(AsyncContextCleanupHandle *cleanupHandle) { + threadPool.Shutdown(cleanupHandle); } } diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index f43411d0c..98cdbf291 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -453,7 +453,7 @@ namespace nodegit { static void RunLoopCallbacks(uv_async_t *handle); - void Shutdown(); + void Shutdown(AsyncContextCleanupHandle *cleanupHandle); private: bool isMarkedForDeletion; @@ -600,7 +600,7 @@ namespace nodegit { } } - void ThreadPoolImpl::Shutdown() { + void ThreadPoolImpl::Shutdown(AsyncContextCleanupHandle *cleanupHandle) { std::queue> cancelledJobs; std::queue cancelledCallbacks; { @@ -673,9 +673,10 @@ namespace nodegit { jsThreadCallbackQueue.pop(); } + jsThreadCallbackAsync.data = cleanupHandle; uv_close(reinterpret_cast(&jsThreadCallbackAsync), [](uv_handle_t *handle) { - auto threadPoolImpl = static_cast(handle->data); - delete threadPoolImpl->currentContext; + auto cleanupHandle = static_cast(handle->data); + delete cleanupHandle; }); } @@ -701,8 +702,8 @@ namespace nodegit { return Executor::GetCurrentContext(); } - void ThreadPool::Shutdown() { - impl->Shutdown(); + void ThreadPool::Shutdown(AsyncContextCleanupHandle *cleanupHandle) { + impl->Shutdown(cleanupHandle); } void ThreadPool::InitializeGlobal() { From 7a7e1fa3cb1e02a9cc93934aae4dfedaeb8de1ef Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 11 Sep 2020 17:18:02 -0700 Subject: [PATCH 246/545] Use a better data type for data on uv_async_t --- generate/templates/manual/include/context.h | 2 +- .../templates/manual/include/thread_pool.h | 2 +- generate/templates/manual/src/context.cc | 8 ++--- generate/templates/manual/src/thread_pool.cc | 33 ++++++++++++++----- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 84e8c22c4..ab0b256ea 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -27,7 +27,7 @@ namespace nodegit { void SaveToPersistent(std::string key, const v8::Local &value); - void ShutdownThreadPool(AsyncContextCleanupHandle *cleanupHandle); + void ShutdownThreadPool(std::unique_ptr cleanupHandle); private: v8::Isolate *isolate; diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index e854f5495..32d94a571 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -49,7 +49,7 @@ namespace nodegit { // Will asynchronously shutdown the thread pool // It will also clean up any resources that the thread pool is keeping alive - void Shutdown(AsyncContextCleanupHandle *cleanupHandle); + void Shutdown(std::unique_ptr cleanupHandle); private: std::unique_ptr impl; diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index f5df2af81..8d97361d3 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -14,10 +14,10 @@ namespace nodegit { } void AsyncContextCleanupHandle::AsyncCleanupContext(void *data, void(*uvCallback)(void*), void *uvCallbackData) { - auto cleanupHandle = static_cast(data); + std::unique_ptr cleanupHandle(static_cast(data)); cleanupHandle->doneCallback = uvCallback; cleanupHandle->doneData = uvCallbackData; - cleanupHandle->context->ShutdownThreadPool(cleanupHandle); + cleanupHandle->context->ShutdownThreadPool(std::move(cleanupHandle)); } Context::Context(v8::Isolate *isolate) @@ -59,7 +59,7 @@ namespace nodegit { Nan::Set(storage, Nan::New(key).ToLocalChecked(), value); } - void Context::ShutdownThreadPool(AsyncContextCleanupHandle *cleanupHandle) { - threadPool.Shutdown(cleanupHandle); + void Context::ShutdownThreadPool(std::unique_ptr cleanupHandle) { + threadPool.Shutdown(std::move(cleanupHandle)); } } diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 98cdbf291..5fc72a903 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -453,7 +453,16 @@ namespace nodegit { static void RunLoopCallbacks(uv_async_t *handle); - void Shutdown(AsyncContextCleanupHandle *cleanupHandle); + void Shutdown(std::unique_ptr cleanupHandle); + + struct AsyncCallbackData { + AsyncCallbackData(ThreadPoolImpl *pool) + : pool(pool) + {} + + std::unique_ptr cleanupHandle; + ThreadPoolImpl *pool; + }; private: bool isMarkedForDeletion; @@ -505,7 +514,7 @@ namespace nodegit { jsThreadCallbackMutex(new std::mutex) { uv_async_init(loop, &jsThreadCallbackAsync, RunLoopCallbacks); - jsThreadCallbackAsync.data = this; + jsThreadCallbackAsync.data = new AsyncCallbackData(this); uv_unref((uv_handle_t *)&jsThreadCallbackAsync); workInProgressCount = 0; @@ -567,7 +576,10 @@ namespace nodegit { } void ThreadPoolImpl::RunLoopCallbacks(uv_async_t* handle) { - static_cast(handle->data)->RunLoopCallbacks(); + auto asyncCallbackData = static_cast(handle->data); + if (asyncCallbackData->pool) { + asyncCallbackData->pool->RunLoopCallbacks(); + } } // NOTE this should theoretically never be triggered during a cleanup operation @@ -600,7 +612,7 @@ namespace nodegit { } } - void ThreadPoolImpl::Shutdown(AsyncContextCleanupHandle *cleanupHandle) { + void ThreadPoolImpl::Shutdown(std::unique_ptr cleanupHandle) { std::queue> cancelledJobs; std::queue cancelledCallbacks; { @@ -673,10 +685,13 @@ namespace nodegit { jsThreadCallbackQueue.pop(); } - jsThreadCallbackAsync.data = cleanupHandle; + AsyncCallbackData *asyncCallbackData = static_cast(jsThreadCallbackAsync.data); + asyncCallbackData->cleanupHandle.swap(cleanupHandle); + asyncCallbackData->pool = nullptr; + uv_close(reinterpret_cast(&jsThreadCallbackAsync), [](uv_handle_t *handle) { - auto cleanupHandle = static_cast(handle->data); - delete cleanupHandle; + auto asyncCallbackData = static_cast(handle->data); + delete asyncCallbackData; }); } @@ -702,8 +717,8 @@ namespace nodegit { return Executor::GetCurrentContext(); } - void ThreadPool::Shutdown(AsyncContextCleanupHandle *cleanupHandle) { - impl->Shutdown(cleanupHandle); + void ThreadPool::Shutdown(std::unique_ptr cleanupHandle) { + impl->Shutdown(std::move(cleanupHandle)); } void ThreadPool::InitializeGlobal() { From cb7cd2644f71f5c032d02eb70d1535efdf58478f Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 14 Sep 2020 08:21:26 -0700 Subject: [PATCH 247/545] Fix ordering issue on Windows --- generate/templates/manual/src/context.cc | 6 +++++- generate/templates/manual/src/thread_pool.cc | 2 -- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index 8d97361d3..88ef1a0be 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -17,7 +17,11 @@ namespace nodegit { std::unique_ptr cleanupHandle(static_cast(data)); cleanupHandle->doneCallback = uvCallback; cleanupHandle->doneData = uvCallbackData; - cleanupHandle->context->ShutdownThreadPool(std::move(cleanupHandle)); + // the ordering of std::move and the call to Context::ShutdownThreadPool prohibits + // us from referring to context on cleanupHandle if we're also intending to move + // the unique_ptr into the method. + Context *context = cleanupHandle->context; + context->ShutdownThreadPool(std::move(cleanupHandle)); } Context::Context(v8::Isolate *isolate) diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 5fc72a903..6c8e6776e 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -8,8 +8,6 @@ #include #include -#include - extern "C" { #include } From d58942d4cbdad3e15b8746a55dfdbc40de3b7f54 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 22 Sep 2020 10:29:56 -0700 Subject: [PATCH 248/545] Update longpath enums to match libgit2 --- lib/libgit2.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libgit2.js b/lib/libgit2.js index f8e1b2b52..40730278d 100644 --- a/lib/libgit2.js +++ b/lib/libgit2.js @@ -2,5 +2,5 @@ var NodeGit = require("../"); var Libgit2 = NodeGit.Libgit2; -Libgit2.OPT.SET_WINDOWS_LONGPATHS = 29; -Libgit2.OPT.GET_WINDOWS_LONGPATHS = 30; +Libgit2.OPT.SET_WINDOWS_LONGPATHS = 31; +Libgit2.OPT.GET_WINDOWS_LONGPATHS = 32; From a1255e01ef7bb0d3256a74e9571244a9abd2175b Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 22 Sep 2020 13:08:55 -0700 Subject: [PATCH 249/545] Test clone to long path --- test/tests/clone.js | 83 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/test/tests/clone.js b/test/tests/clone.js index 965d78bc7..e69076f9d 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -4,12 +4,32 @@ var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); var _ = require("lodash"); +const generatePathWithLength = (base, length) => { + let path = `${base}/`; + const baseLength = path.length; + const remaining = length - baseLength; + + for (let i = 0; i < remaining; ++i) { + // add a slash every 240 characters, but not as first or last character + if (i % 239 == 0 && i != remaining - 1 && i != 0) { + path += "/"; + } else { + path += "a"; + } + } + + assert.ok(path.length === length); + + return path; +}; + describe("Clone", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; var Clone = NodeGit.Clone; var clonePath = local("../repos/clone"); + var longClonePath = generatePathWithLength(clonePath, 600); var sshPublicKeyPath = local("../id_rsa.pub"); var sshPrivateKeyPath = local("../id_rsa"); @@ -20,11 +40,18 @@ describe("Clone", function() { this.timeout(30000); beforeEach(function() { - return fse.remove(clonePath).catch(function(err) { - console.log(err); + if (process.platform === "win32") { + NodeGit.Libgit2.opts(NodeGit.Libgit2.OPT.SET_WINDOWS_LONGPATHS, 0); + } - throw err; - }); + return fse.remove(clonePath) + .then(function() { + return fse.remove(longClonePath); + }) + .catch(function(err) { + console.log(err); + throw err; + }); }); it.skip("can clone with http", function() { @@ -54,6 +81,54 @@ describe("Clone", function() { }); }); + it("can clone into long path if opt set", function() { + var test = this; + var url = "https://github.com/nodegit/test.git"; + var opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } + }; + + fse.ensureDirSync(longClonePath); + + if (process.platform === "win32") { + NodeGit.Libgit2.opts(NodeGit.Libgit2.OPT.SET_WINDOWS_LONGPATHS, 1); + } + + return Clone(url, longClonePath, opts).then(function(repo) { + assert.ok(repo instanceof Repository); + test.repository = repo; + }); + }); + + it("can't clone into long path if opt not set on win32", function() { + if (process.platform !== "win32") { + this.skip(); + } + + var url = "https://github.com/nodegit/test.git"; + var opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } + }; + + fse.ensureDirSync(longClonePath); + + NodeGit.Libgit2.opts(NodeGit.Libgit2.OPT.SET_WINDOWS_LONGPATHS, 0); + + return Clone(url, longClonePath, opts).then(function(repo) { + assert.fail("Clone should not succeed"); + }).catch(function(error) { + assert.ok(error instanceof Error); + }); + }); + it("can clone twice with https using same config object", function() { var test = this; var url = "https://github.com/nodegit/test.git"; From 09d41d0ff866c2775c0a19c7798133c0c97af397 Mon Sep 17 00:00:00 2001 From: Adarsh Pai Date: Mon, 5 Oct 2020 13:47:57 -0500 Subject: [PATCH 250/545] Remove block for sideband_progress in remote_callbacks --- generate/input/descriptor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index e5f18b568..8f21978ef 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3418,7 +3418,7 @@ "ignore": true }, "sideband_progress": { - "ignore": true + "ignore": false }, "update_tips": { "ignore": true From fb56e129aed76de6fc3ac624d51cadfcb08ff938 Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 16:04:31 +0200 Subject: [PATCH 251/545] Update add-and-commit.js --- examples/add-and-commit.js | 81 ++++++++++++++------------------------ 1 file changed, 30 insertions(+), 51 deletions(-) diff --git a/examples/add-and-commit.js b/examples/add-and-commit.js index 4f4959dd7..42215257b 100644 --- a/examples/add-and-commit.js +++ b/examples/add-and-commit.js @@ -1,9 +1,9 @@ -var nodegit = require("../"); -var path = require("path"); -var fse = require("fs-extra"); -var fileName = "newfile.txt"; -var fileContent = "hello world"; -var directoryName = "salad/toast/strangerinastrangeland/theresnowaythisexists"; +const nodegit = require("../"); +const path = require("path"); +const fs = require("fs"); +const fileName = "newfile.txt"; +const fileContent = "hello world"; +const directoryName = "salad/toast/strangerinastrangeland/theresnowaythisexists"; /** * This example creates a certain file `newfile.txt`, adds it to the git @@ -11,59 +11,38 @@ var directoryName = "salad/toast/strangerinastrangeland/theresnowaythisexists"; * followed by a `git commit` **/ -var repo; -var index; -var oid; -nodegit.Repository.open(path.resolve(__dirname, "../.git")) -.then(function(repoResult) { - repo = repoResult; - return fse.ensureDir(path.join(repo.workdir(), directoryName)); -}).then(function(){ - return fse.writeFile(path.join(repo.workdir(), fileName), fileContent); -}) -.then(function() { - return fse.writeFile( +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + + await fs.promises.mkdir(path.join(repo.workdir(), directoryName), { + recursive: true, + }); + + await fs.promises.writeFile(path.join(repo.workdir(), fileName), fileContent); + await fs.promises.writeFile( path.join(repo.workdir(), directoryName, fileName), fileContent ); -}) -.then(function() { - return repo.refreshIndex(); -}) -.then(function(indexResult) { - index = indexResult; -}) -.then(function() { + + const index = await repo.refreshIndex(); + // this file is in the root of the directory and doesn't need a full path - return index.addByPath(fileName); -}) -.then(function() { + await index.addByPath(fileName); // this file is in a subdirectory and can use a relative path - return index.addByPath(path.posix.join(directoryName, fileName)); -}) -.then(function() { + await index.addByPath(path.posix.join(directoryName, fileName)); // this will write both files to the index - return index.write(); -}) -.then(function() { - return index.writeTree(); -}) -.then(function(oidResult) { - oid = oidResult; - return nodegit.Reference.nameToId(repo, "HEAD"); -}) -.then(function(head) { - return repo.getCommit(head); -}) -.then(function(parent) { - var author = nodegit.Signature.now("Scott Chacon", + await index.write(); + + const oid = await index.writeTree(); + + const parent = await repo.getHeadCommit(); + const author = nodegit.Signature.now("Scott Chacon", "schacon@gmail.com"); - var committer = nodegit.Signature.now("Scott A Chacon", + const committer = nodegit.Signature.now("Scott A Chacon", "scott@github.com"); - return repo.createCommit("HEAD", author, committer, "message", oid, [parent]); -}) -.done(function(commitId) { + const commitId = await repo.createCommit("HEAD", author, committer, "message", oid, [parent]); + console.log("New Commit: ", commitId); -}); +})(); From 5b2dffe289192b708eaf5e01a76f9ea170f09ceb Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 16:25:13 +0200 Subject: [PATCH 252/545] Update read-file.js --- examples/read-file.js | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/examples/read-file.js b/examples/read-file.js index 991a5ae39..9da5ed175 100644 --- a/examples/read-file.js +++ b/examples/read-file.js @@ -1,25 +1,19 @@ -var nodegit = require("../"), - path = require("path"); +const nodegit = require("../"); +const path = require("path"); // This example opens a certain file, `README.md`, at a particular commit, // and prints the first 10 lines as well as some metadata. -var _entry; -nodegit.Repository.open(path.resolve(__dirname, "../.git")) - .then(function(repo) { - return repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); - }) - .then(function(commit) { - return commit.getEntry("README.md"); - }) - .then(function(entry) { - _entry = entry; - return _entry.getBlob(); - }) - .then(function(blob) { - console.log(_entry.name(), _entry.sha(), blob.rawsize() + "b"); - console.log("========================================================\n\n"); - var firstTenLines = blob.toString().split("\n").slice(0, 10).join("\n"); - console.log(firstTenLines); - console.log("..."); - }) - .done(); + +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + const commit = await repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); + const entry = await commit.getEntry("README.md"); + const blob = await entry.getBlob(); + + console.log(entry.name(), entry.sha(), blob.rawsize() + "b"); + console.log("========================================================\n\n"); + const firstTenLines = blob.toString().split("\n").slice(0, 10).join("\n"); + console.log(firstTenLines); + console.log("..."); +})(); + From c5490347b7e3f4782e9492d2dab4ad9a4c21a62d Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 16:35:53 +0200 Subject: [PATCH 253/545] Update create-new-repo.js --- examples/create-new-repo.js | 62 ++++++++++++++----------------------- 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/examples/create-new-repo.js b/examples/create-new-repo.js index 1c7e3e9f5..cdf345ea3 100644 --- a/examples/create-new-repo.js +++ b/examples/create-new-repo.js @@ -1,46 +1,32 @@ -var nodegit = require("../"); -var path = require("path"); -var fse = require("fs-extra"); -var fileName = "newfile.txt"; -var fileContent = "hello world"; -var repoDir = "../../newRepo"; +const nodegit = require("../"); +const path = require("path"); +const fs = require("fs"); +const fileName = "newfile.txt"; +const fileContent = "hello world"; +const repoDir = "../newRepo"; -var repository; -var index; -fse.ensureDir(path.resolve(__dirname, repoDir)) -.then(function() { - return nodegit.Repository.init(path.resolve(__dirname, repoDir), 0); -}) -.then(function(repo) { - repository = repo; - return fse.writeFile(path.join(repository.workdir(), fileName), fileContent); -}) -.then(function(){ - return repository.refreshIndex(); -}) -.then(function(idx) { - index = idx; -}) -.then(function() { - return index.addByPath(fileName); -}) -.then(function() { - return index.write(); -}) -.then(function() { - return index.writeTree(); -}) -.then(function(oid) { - var author = nodegit.Signature.now("Scott Chacon", +(async () => { + await fs.promises.mkdir(path.resolve(__dirname, repoDir), { + recursive: true, + }); + const repo = await nodegit.Repository.init(path.resolve(__dirname, repoDir), 0); + await fs.promises.writeFile(path.join(repo.workdir(), fileName), fileContent); + const index = await repo.refreshIndex(); + await index.addByPath(fileName); + await index.write(); + + const oid = await index.writeTree(); + + const author = nodegit.Signature.now("Scott Chacon", "schacon@gmail.com"); - var committer = nodegit.Signature.now("Scott A Chacon", + const committer = nodegit.Signature.now("Scott A Chacon", "scott@github.com"); // Since we're creating an inital commit, it has no parents. Note that unlike // normal we don't get the head either, because there isn't one yet. - return repository.createCommit("HEAD", author, committer, "message", oid, []); -}) -.done(function(commitId) { + const commitId = await repo.createCommit("HEAD", author, committer, "message", oid, []); console.log("New Commit: ", commitId); -}); +})(); + + From cc50a6163c1d0aea567240f0852666592576bfa3 Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 18:53:24 +0200 Subject: [PATCH 254/545] Update general.js --- examples/general.js | 636 ++++++++++++++++++++------------------------ 1 file changed, 292 insertions(+), 344 deletions(-) diff --git a/examples/general.js b/examples/general.js index b6ae7efc9..c27a391fa 100644 --- a/examples/general.js +++ b/examples/general.js @@ -1,12 +1,10 @@ -var nodegit = require("../"); -var path = require("path"); -var oid; -var odb; -var repo; +const nodegit = require("../"); +const path = require("path"); + // **nodegit** is a javascript library for node.js that wraps libgit2, a // pure C implementation of the Git core. It provides an asynchronous -// interface around any functions that do I/O, and a sychronous interface +// interface around any functions that do I/O, and a synchronous interface // around the rest. // // This file is an example of using that API in a real, JS file. @@ -19,348 +17,298 @@ var repo; // Nearly, all git operations in the context of a repository. // To open a repository, -nodegit.Repository.open(path.resolve(__dirname, "../.git")) - .then(function(repoResult) { - repo = repoResult; - console.log("Opened repository."); - - // ### SHA-1 Value Conversions - - // Objects in git (commits, blobs, etc.) are referred to by their SHA value - // **nodegit** uses a simple wrapper around hash values called an `Oid`. - // The oid validates that the SHA is well-formed. - - oid = nodegit.Oid.fromString("c27d9c35e3715539d941254f2ce57042b978c49c"); - - // Most functions in in **nodegit** that take an oid will also take a - // string, so for example, you can look up a commit by a string SHA or - // an Oid, but but any functions that create new SHAs will always return - // an Oid. - - // If you have a oid, you can easily get the hex value of the SHA again. - console.log("Sha hex string:", oid.toString()); - - // ### 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. - return repo.odb(); - }) - - .then(function(odbResult) { - odb = odbResult; - - // 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. - - return odb.read(oid); - }) - - .then(function(object) { - // 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. - var data = object.data(); - var type = object.type(); - var size = object.size(); - - console.log("Object size and type:", size, type); - console.log("Raw data: ", data.toString().substring(100), "..."); - - }) - - .then(function() { - // 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. - return odb.write("test data", "test data".length, nodegit.Object.TYPE.BLOB); - }) - - .then(function(oid) { - // Now that we've written the object, we can check out what SHA1 was - // generated when the object was written to our database. - console.log("Written Object: ", oid.toString()); - }) - - .then(function() { - // ### 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). - - oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); - - // Many methods in **nodegit** are asynchronous, because they do file - // or network I/O. By convention, all asynchronous methods are named - // imperatively, like `getCommit`, `open`, `read`, `write`, etc., whereas - // synchronous methods are named nominatively, like `type`, `size`, `name`. - - return repo.getCommit(oid); - }) - - .then(function(commit) { - // 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 `git_commit_message` which gives you the - // commit message. - console.log("Commit:", commit.message(), - commit.author().name(), commit.date()); - - // Commits can have zero or more parents. The first (root) commit will - // have no parents, most commits will have one (i.e. the commit it was - // based on) and merge commits will have two or more. Commits can - // technically have any number, though it's rare to have more than two. - return commit.getParents(); - }) - - .then(function(parents) { - parents.forEach(function(parent) { - console.log("Parent:", parent.toString()); - }); - }) - - .then(function() { - // #### Writing Commits - - // nodegit provides a couple of methods to create commit objects easily as - // well. - var author = nodegit.Signature.now("Scott Chacon", - "schacon@gmail.com"); - var committer = nodegit.Signature.now("Scott A Chacon", - "scott@github.com"); - - // 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 existing ones: - var treeId = nodegit.Oid.fromString( - "4170d10f19600b9cb086504e8e05fe7d863358a2"); - var parentId = nodegit.Oid.fromString( - "eebd0ead15d62eaf0ba276da53af43bbc3ce43ab"); - - return repo.getTree(treeId).then(function(tree) { - return repo.getCommit(parentId).then(function(parent) { - // 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. - return repo.createCommit( - null /* do not update the HEAD */, - author, - committer, - "example commit", - tree, - [parent]); - }).then(function(oid) { - console.log("New Commit:", oid.toString()); - }); - }); - }) - - .then(function() { - // #### 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. - - oid = nodegit.Oid.fromString("dcc4aa9fcdaced037434cb149ed3b6eab4d0709d"); - return repo.getTag(oid); - }) - - .then(function(tag) { - // 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. - console.log(tag.name(), tag.targetType(), tag.message()); - - return tag.target(); - }) - - .then(function (target) { - console.log("Target is commit:", target.isCommit()); - }) - - .then(function() { - // #### Tree Parsing - - // A Tree is how Git represents the state of the filesystem - // at a given revision. In general, a tree corresponds to a directory, - // and files in that directory are either files (blobs) or directories. - - // [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. - - oid = nodegit.Oid.fromString("e1b0c7ea57bfc5e30ec279402a98168a27838ac9"); - return repo.getTree(oid); - }) - - .then(function(tree) { - console.log("Tree Size:", tree.entryCount()); - - function dfs(tree) { - var promises = []; - - tree.entries().forEach(function(entry) { - if (entry.isDirectory()) { - promises.push(entry.getTree().then(dfs)); - } else if (entry.isFile()) { - console.log("Tree Entry:", entry.name()); - } - }); - - return Promise.all(promises); +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + console.log("Opened repository."); + + // ### SHA-1 Value Conversions + + // Objects in git (commits, blobs, etc.) are referred to by their SHA value + // **nodegit** uses a simple wrapper around hash values called an `Oid`. + // The oid validates that the SHA is well-formed. + + let oid = nodegit.Oid.fromString("c27d9c35e3715539d941254f2ce57042b978c49c"); + + // Most functions in in **nodegit** that take an oid will also take a + // string, so for example, you can look up a commit by a string SHA or + // an Oid, but any functions that create new SHAs will always return + // an Oid. + + // If you have a oid, you can easily get the hex value of the SHA again. + console.log("Sha hex string:", oid.toString()); + + // ### 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. + const odb = await repo.odb(); + + // 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 their type and inspect the raw bytes unparsed. + + const object = await odb.read(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. + const data = object.data(); + const type = object.type(); + const size = object.size(); + + console.log("Object size and type:", size, type); + console.log("Raw data: ", data.toString().substring(100), "..."); + + // 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. + oid = await odb.write("test data", "test data".length, nodegit.Object.TYPE.BLOB); + + // Now that we've written the object, we can check out what SHA1 was + // generated when the object was written to our database. + console.log("Written Object: ", oid.toString()); + + // ### 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). + + oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); + + // Many methods in **nodegit** are asynchronous, because they do file + // or network I/O. By convention, all asynchronous methods are named + // imperatively, like `getCommit`, `open`, `read`, `write`, etc., whereas + // synchronous methods are named nominatively, like `type`, `size`, `name`. + + const commit = await repo.getCommit(oid); + + // 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 `git_commit_message` which gives you the + // commit message. + console.log( + "Commit:", commit.message(), + commit.author().name(), commit.date() + ); + + // Commits can have zero or more parents. The first (root) commit will + // have no parents, most commits will have one (i.e. the commit it was + // based on) and merge commits will have two or more. Commits can + // technically have any number, though it's rare to have more than two. + const parents = await commit.getParents(); + for (const parent of parents) { + console.log("Parent:", parent.toString()); + } + + // #### Writing Commits + + // nodegit provides a couple of methods to create commit objects easily as + // well. + const author = nodegit.Signature.now("Scott Chacon", + "schacon@gmail.com"); + const committer = nodegit.Signature.now("Scott A Chacon", + "scott@github.com"); + + // 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 existing ones: + const treeId = nodegit.Oid.fromString( + "4170d10f19600b9cb086504e8e05fe7d863358a2"); + const parentId = nodegit.Oid.fromString( + "eebd0ead15d62eaf0ba276da53af43bbc3ce43ab"); + + let tree = await repo.getTree(treeId); + const parent = await repo.getCommit(parentId); + // 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. + oid = await repo.createCommit( + null /* do not update the HEAD */, + author, + committer, + "example commit", + tree, + [parent] + ); + console.log("New Commit:", oid.toString()); + + // #### 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. + + oid = nodegit.Oid.fromString("dcc4aa9fcdaced037434cb149ed3b6eab4d0709d"); + const tag = await repo.getTag(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. + console.log(tag.name(), tag.targetType(), tag.message()); + + const target = await tag.target(); + console.log("Target is commit:", target.isCommit()); + + // #### Tree Parsing + + // A Tree is how Git represents the state of the filesystem + // at a given revision. In general, a tree corresponds to a directory, + // and files in that directory are either files (blobs) or directories. + + // [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. + + oid = nodegit.Oid.fromString("e1b0c7ea57bfc5e30ec279402a98168a27838ac9"); + tree = await repo.getTree(oid); + + console.log("Tree Size:", tree.entryCount()); + + /** + * @param {nodegit.Tree} tree + */ + function dfs(tree) { + const promises = []; + + for (const entry of tree.entries()) { + if (entry.isDirectory()) { + promises.push(entry.getTree().then(dfs)); + } else if (entry.isFile()) { + console.log("Tree Entry:", entry.name()); + } } - return dfs(tree).then(function() { - // You can also access tree entries by path if you know the path of the - // entry you're looking for. - return tree.getEntry("example/general.js").then(function(entry) { - // Entries which are files have blobs associated with them: - entry.getBlob(function(error, blob) { - console.log("Blob size:", blob.size()); - }); - }); - }); - }) - - .then(function() { - // #### 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. - - oid = nodegit.Oid.fromString("991c06b7b1ec6f939488427e4b41a4fa3e1edd5f"); - return repo.getBlob(oid); - }) - - .then(function(blob) { - // You can access a node.js Buffer with the raw contents - // of the blob directly. Note that this buffer may not - // contain ASCII data for certain blobs (e.g. binary files). - var buffer = blob.content(); - - // If you know that the blob is UTF-8, however, - console.log("Blob contents:", blob.toString().slice(0, 38)); - console.log("Buffer:", buffer.toString().substring(100), "..."); - }) - - .then(function() { - // ### 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. - - oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); - - // 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`. - var revWalk = repo.createRevWalk(); - - revWalk.sorting(nodegit.Revwalk.SORT.TOPOLOGICAL, - nodegit.Revwalk.SORT.REVERSE); - - revWalk.push(oid); - - // Now that we have the starting point pushed onto the walker, we 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 - - function walk() { - return revWalk.next().then(function(oid) { - if (!oid) { - return; - } - - return repo.getCommit(oid).then(function(commit) { - console.log("Commit:", commit.toString()); - return walk(); - }); - }); + return Promise.all(promises); + } + + await dfs(tree); + + // You can also access tree entries by path if you know the path of the + // entry you're looking for. + const entry = await tree.getEntry("example/general.js"); + // Entries which are files have blobs associated with them: + let blob = await entry.getBlob(); + console.log("Blob size:", blob.rawsize()); + + // #### 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. + + oid = nodegit.Oid.fromString("991c06b7b1ec6f939488427e4b41a4fa3e1edd5f"); + blob = await repo.getBlob(oid); + // You can access a node.js Buffer with the raw contents + // of the blob directly. Note that this buffer may not + // contain ASCII data for certain blobs (e.g. binary files). + const buffer = blob.content(); + + // If you know that the blob is UTF-8, however, + console.log("Blob contents:", blob.toString().slice(0, 38)); + console.log("Buffer:", buffer.toString().substring(100), "..."); + + // ### 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. + + oid = nodegit.Oid.fromString("698c74e817243efe441a5d1f3cbaf3998282ca86"); + + // 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`. + const revWalk = repo.createRevWalk(); + + revWalk.sorting(nodegit.Revwalk.SORT.TOPOLOGICAL, + nodegit.Revwalk.SORT.REVERSE); + + revWalk.push(oid); + + // Now that we have the starting point pushed onto the walker, we 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 + + async function walk() { + try { + const oid = await revWalk.next(); + } catch(error) { + if (error.errno !== nodegit.Error.CODE.ITEROVER) { + throw error; + } else { + return; + } } + const commit = await repo.getCommit(oid); + console.log("Commit:", commit.toString()); return walk(); - }) - - .then(function() { - // ### 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). - return repo.refreshIndex(); - }) - - .then(function(index) { - // 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 `IndexEntry` class - - index.entries().forEach(function(entry) { - console.log("Index Entry:", entry.path(), entry.mtime().seconds()); - }); - }) - - .then(function() { - // ### 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). - - return repo.getReferenceNames(nodegit.Reference.TYPE.LISTALL); - }) - - .then(function(referenceNames) { - var promises = []; - - referenceNames.forEach(function(referenceName) { - promises.push(repo.getReference(referenceName).then(function(reference) { - if (reference.isConcrete()) { - console.log("Reference:", referenceName, reference.target()); - } else if (reference.isSymbolic()) { - console.log("Reference:", referenceName, reference.symbolicTarget()); - } - })); - }); + } - return Promise.all(promises); - }) + await 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). + const index = await repo.refreshIndex(); + + // 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 `IndexEntry` class + + for (const entry of index.entries()) { + console.log("Index Entry:", entry.path, entry.mtime.seconds()); + } + + // ### 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). + + const referenceNames = await repo.getReferenceNames(nodegit.Reference.TYPE.ALL); + + for (const referenceName of referenceNames) { + const reference = await repo.getReference(referenceName); + if (reference.isConcrete()) { + console.log("Reference:", referenceName, reference.target()); + } else if (reference.isSymbolic()) { + console.log("Reference:", referenceName, reference.symbolicTarget()); + } + } - .done(function() { - console.log("Done!"); - }); + console.log("Done!"); +})(); From 48d056c435e2576233ebb6c7c62a188fd7540efc Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 20:02:35 +0200 Subject: [PATCH 255/545] Fix general.js --- examples/general.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/general.js b/examples/general.js index c27a391fa..9bfb978dc 100644 --- a/examples/general.js +++ b/examples/general.js @@ -259,8 +259,9 @@ const path = require("path"); // since the raw contents of the commit object will be cached in memory async function walk() { + let oid; try { - const oid = await revWalk.next(); + oid = await revWalk.next(); } catch(error) { if (error.errno !== nodegit.Error.CODE.ITEROVER) { throw error; From b94161100730deea5907de545f6bd291f1dfdd0e Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 20:15:58 +0200 Subject: [PATCH 256/545] Turn down jshint while we get feedback on this --- .jshintrc | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.jshintrc b/.jshintrc index 0fd02f29b..01cb5effc 100644 --- a/.jshintrc +++ b/.jshintrc @@ -2,7 +2,7 @@ "boss": true, "curly": true, "eqnull": true, - "esnext": true, + "esversion": 9, "evil": true, "futurehostile": true, "globals": { diff --git a/package.json b/package.json index 36c09494c..858fe4dfc 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "generateNativeCode": "node generate/scripts/generateNativeCode", "install": "node lifecycleScripts/preinstall && node lifecycleScripts/install", "installDebug": "BUILD_DEBUG=true npm install", - "lint": "jshint lib test/tests test/utils examples lifecycleScripts", + "lint": "jshint lib test/tests test/utils lifecycleScripts", "mergecov": "lcov-result-merger 'test/**/*.info' 'test/coverage/merged.lcov' && ./lcov-1.10/bin/genhtml test/coverage/merged.lcov --output-directory test/coverage/report", "mocha": "mocha --expose-gc test/runner test/tests --timeout 15000", "mochaDebug": "mocha --expose-gc --debug-brk test/runner test/tests --timeout 15000", From 3b2d68b3fd7bb9cc8e861c9a3c9894b44f3bd7a3 Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 20:25:35 +0200 Subject: [PATCH 257/545] jshint what are you doing? --- .jshintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.jshintrc b/.jshintrc index 01cb5effc..0fd02f29b 100644 --- a/.jshintrc +++ b/.jshintrc @@ -2,7 +2,7 @@ "boss": true, "curly": true, "eqnull": true, - "esversion": 9, + "esnext": true, "evil": true, "futurehostile": true, "globals": { From fec768fa4332166a0ffd4b2240aa14b47725a2b4 Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 20:48:37 +0200 Subject: [PATCH 258/545] Update details-for-tree-entry.js --- examples/details-for-tree-entry.js | 41 ++++++++++++++---------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/examples/details-for-tree-entry.js b/examples/details-for-tree-entry.js index a567fcf75..13dcd4e21 100644 --- a/examples/details-for-tree-entry.js +++ b/examples/details-for-tree-entry.js @@ -1,29 +1,26 @@ -var nodegit = require("../"); -var path = require("path"); +const nodegit = require("../"); +const path = require("path"); /** * This shows how to get details from a tree entry or a blob **/ -nodegit.Repository.open(path.resolve(__dirname, "../.git")) - .then(function(repo) { - return repo.getTree("e1b0c7ea57bfc5e30ec279402a98168a27838ac9") - .then(function(tree) { - var treeEntry = tree.entryByIndex(0); +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")); + const tree = await repo.getTree("e1b0c7ea57bfc5e30ec279402a98168a27838ac9"); + const treeEntry = tree.entryByIndex(0); + + // Tree entry doesn't have any data associated with the actual entry + // To get that we need to get the index entry that this points to + const index = await repo.refreshIndex(); + const indexEntry = index.getByPath(treeEntry.path()); - // Tree entry doesn't have any data associated with the actual entry - // To get that we need to get the index entry that this points to - return repo.refreshIndex().then(function(index) { - var indexEntry = index.getByPath(treeEntry.path()); + // With the index entry we can now view the details for the tree entry + console.log("Entry path: " + indexEntry.path); + console.log("Entry time in seconds: " + indexEntry.mtime.seconds()); + console.log("Entry oid: " + indexEntry.id.toString()); + console.log("Entry size: " + indexEntry.fileSize); + + console.log("Done!"); +})(); - // With the index entry we can now view the details for the tree entry - console.log("Entry path: " + indexEntry.path); - console.log("Entry time in seconds: " + indexEntry.mtime.seconds()); - console.log("Entry oid: " + indexEntry.id.toString()); - console.log("Entry size: " + indexEntry.fileSize); - }); - }); - }) - .done(function() { - console.log("Done!"); - }); From 81ae2a76c5c04edb50bfcf3c8ba86bb67af858a8 Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 21:37:58 +0200 Subject: [PATCH 259/545] Update diff-commits.js --- examples/diff-commits.js | 64 ++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/examples/diff-commits.js b/examples/diff-commits.js index f68d0fcfb..b3d6d7510 100644 --- a/examples/diff-commits.js +++ b/examples/diff-commits.js @@ -1,41 +1,41 @@ -var nodegit = require("../"); -var path = require("path"); +const nodegit = require("../"); +const path = require("path"); // This code examines the diffs between a particular commit and all of its // parents. Since this commit is not a merge, it only has one parent. This is // similar to doing `git show`. -nodegit.Repository.open(path.resolve(__dirname, "../.git")) -.then(function(repo) { - return repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); -}) -.then(function(commit) { +(async () => { + const repo = await nodegit.Repository.open(path.resolve(__dirname, "../.git")) + const commit = await repo.getCommit("59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5"); console.log("commit " + commit.sha()); - console.log("Author:", commit.author().name() + - " <" + commit.author().email() + ">"); + console.log( + "Author:", commit.author().name() + + " <" + commit.author().email() + ">" + ); console.log("Date:", commit.date()); console.log("\n " + commit.message()); - return commit.getDiff(); -}) -.done(function(diffList) { - diffList.forEach(function(diff) { - diff.patches().then(function(patches) { - patches.forEach(function(patch) { - patch.hunks().then(function(hunks) { - hunks.forEach(function(hunk) { - hunk.lines().then(function(lines) { - console.log("diff", patch.oldFile().path(), - patch.newFile().path()); - console.log(hunk.header().trim()); - lines.forEach(function(line) { - console.log(String.fromCharCode(line.origin()) + - line.content().trim()); - }); - }); - }); - }); - }); - }); - }); -}); + const diffList = await commit.getDiff(); + for (const diff of diffList) { + const patches = await diff.patches(); + for (const patch of patches) { + const hunks = await patch.hunks(); + for (const hunk of hunks) { + const lines = await hunk.lines(); + console.log( + "diff", + patch.oldFile().path(), + patch.newFile().path() + ); + console.log(hunk.header().trim()); + for (const line of lines) { + console.log( + String.fromCharCode(line.origin()) + + line.content().trim() + ); + } + } + } + } +})(); From 085c8ea558730fd9351ca57dfcfc240f43aa0ee7 Mon Sep 17 00:00:00 2001 From: Julien Chaumond Date: Fri, 9 Oct 2020 21:46:03 +0200 Subject: [PATCH 260/545] cs --- examples/general.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/general.js b/examples/general.js index 9bfb978dc..ea6ada149 100644 --- a/examples/general.js +++ b/examples/general.js @@ -247,8 +247,10 @@ const path = require("path"); // of `branch1`. const revWalk = repo.createRevWalk(); - revWalk.sorting(nodegit.Revwalk.SORT.TOPOLOGICAL, - nodegit.Revwalk.SORT.REVERSE); + revWalk.sorting( + nodegit.Revwalk.SORT.TOPOLOGICAL, + nodegit.Revwalk.SORT.REVERSE + ); revWalk.push(oid); From 85f55d4b9a3e27952fbff6f2a1959a7e0a9b467a Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 19 Oct 2020 09:05:34 -0700 Subject: [PATCH 261/545] Require 12.19.0+ or 14.10.0+ due to async cleanup --- .github/workflows/tests.yml | 6 ++---- package.json | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5e2ac9ee8..13dcc8538 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,8 +14,7 @@ jobs: name: "*nix Tests" strategy: matrix: - # TODO wait for https://github.com/nodejs/node/pull/34819 backport to 10 + 12 - node: [14] + node: [12, 14] os: [ubuntu-16.04, macOS-10.15] runs-on: ${{ matrix.os }} steps: @@ -73,8 +72,7 @@ jobs: name: Windows Tests strategy: matrix: - # TODO wait for https://github.com/nodejs/node/pull/34819 backport to 10 + 12 - node: [14] + node: [12, 14] arch: [x86, x64] runs-on: windows-2016 steps: diff --git a/package.json b/package.json index 18ba76965..c69caf907 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "lib": "./lib" }, "engines": { - "node": ">= 6" + "node": ">= 12.19.0 < 13 || >= 14.10.0" }, "dependencies": { "fs-extra": "^7.0.0", From 08db6fc42b144c97e6c4322b57c04510be30b78f Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 19 Oct 2020 11:22:50 -0700 Subject: [PATCH 262/545] Check for latest node version when running tests --- .github/workflows/tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 13dcc8538..fbd1bafc9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -35,6 +35,7 @@ jobs: uses: actions/setup-node@master with: node-version: ${{ matrix.node }} + check-latest: true - name: Install Dependencies for Ubuntu if: startsWith(matrix.os, 'ubuntu') @@ -90,6 +91,7 @@ jobs: uses: implausible/setup-node@feature/expose-architecture-override with: node-version: ${{ matrix.node }} + check-latest: true node-arch: ${{ matrix.arch }} - name: Install From 75c1c3bc8ae329b2c9f040eaf03e50502ee9e151 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 20 Nov 2020 08:49:48 -0700 Subject: [PATCH 263/545] Bump to v0.28.0-alpha.1 --- CHANGELOG.md | 193 +++++++++++++++++++++++++++++++++++++++++++++- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 193 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a6784439..cba46cf84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,194 @@ # Change Log +## v0.28.0-alpha.1 [(2020-11-20)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.1) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.27.0...v0.28.0-alpha.1) + +#### Summary of changes +- Support for Electron 11 +- Drops support for Node 10.x.y, < 12.19.x, < 14.10.0 +- Drops support for Electron 9.x.y, < 10.1.4 +- Brings in LibGit2 1.0.0 +- Fixes issue with winhttp and optional client certificates +- Deprecations + - NodeGit.Cred is deprecated in favor of NodeGit.Credential + +#### Merged PRs into NodeGit +- [Merge pull request #1795 from ianhattendorf/refactor/context-awareness](https://github.com/nodegit/nodegit/pull/1795) +- [Merge pull request #1797 from ianhattendorf/fix/longpaths-enum](https://github.com/nodegit/nodegit/pull/1797) +- [Merge pull request #1788 from implausible/bump/libgit2-1.0.0](https://github.com/nodegit/nodegit/pull/1788) + +#### Merged PRs into Libgit2 +- [sanitizer ci: skip negotiate tests](https://github.com/libgit2/libgit2/pull/5596) +- [Add CI support for Memory and UndefinedBehavior Sanitizers](https://github.com/libgit2/libgit2/pull/5569) +- [Access HEAD via the refdb backends](https://github.com/libgit2/libgit2/pull/5563) +- [config_entries: Avoid excessive map operations](https://github.com/libgit2/libgit2/pull/5582) +- [mwindow: set limit on number of open files](https://github.com/libgit2/libgit2/pull/5396) +- [refdb: a set of preliminary refactorings for the reftable backend](https://github.com/libgit2/libgit2/pull/5570) +- [CMake modernization pt2](https://github.com/libgit2/libgit2/pull/5547) +- [Make the tests run cleanly under UndefinedBehaviorSanitizer](https://github.com/libgit2/libgit2/pull/5568) +- [Make the tests pass cleanly with MemorySanitizer](https://github.com/libgit2/libgit2/pull/5567) +- [Enable building git2.rc resource script with GCC](https://github.com/libgit2/libgit2/pull/5561) +- [Make NTLMClient Memory and UndefinedBehavior Sanitizer-clean](https://github.com/libgit2/libgit2/pull/5571) +- [Random fixes for diff-printing](https://github.com/libgit2/libgit2/pull/5559) +- [index: Update the documentation for git_index_add_from_buffer()](https://github.com/libgit2/libgit2/pull/5419) +- [Introduce CI with GitHub Actions](https://github.com/libgit2/libgit2/pull/5550) +- [Random code cleanups and fixes](https://github.com/libgit2/libgit2/pull/5552) +- [examples: log: fix documentation generation](https://github.com/libgit2/libgit2/pull/5553) +- [Missing declarations](https://github.com/libgit2/libgit2/pull/5551) +- [clar: add tap output option](https://github.com/libgit2/libgit2/pull/5541) +- [diff::parse: don't include `diff.h`](https://github.com/libgit2/libgit2/pull/5545) +- [release script: fix typo](https://github.com/libgit2/libgit2/pull/5543) +- [tests: offer exact name matching with a `$` suffix](https://github.com/libgit2/libgit2/pull/5537) +- [httpclient: support googlesource](https://github.com/libgit2/libgit2/pull/5536) +- [git_packbuilder_write: Allow setting path to NULL to use the default path](https://github.com/libgit2/libgit2/pull/5532) +- [mempack: Use threads when building the pack](https://github.com/libgit2/libgit2/pull/5531) +- [clar: use internal functions instead of /bin/cp and /bin/rm](https://github.com/libgit2/libgit2/pull/5528) +- [strarray refactoring](https://github.com/libgit2/libgit2/pull/5535) +- [CMake cleanups](https://github.com/libgit2/libgit2/pull/5481) +- [git_pool_init: allow the function to fail](https://github.com/libgit2/libgit2/pull/5526) +- [diff::workdir: actually test the buffers](https://github.com/libgit2/libgit2/pull/5529) +- [Handle unreadable configuration files](https://github.com/libgit2/libgit2/pull/5527) +- [Make git_index_write() generate valid v4 index](https://github.com/libgit2/libgit2/pull/5533) +- [OpenSSL certificate memory leak](https://github.com/libgit2/libgit2/pull/5522) +- [tests: checkout: fix flaky test due to mtime race](https://github.com/libgit2/libgit2/pull/5515) +- [cmake: Sort source files for reproducible builds](https://github.com/libgit2/libgit2/pull/5523) +- [futils: fix order of declared parameters for `git_futils_fake_symlink`](https://github.com/libgit2/libgit2/pull/5517) +- [Check the version in package.json](https://github.com/libgit2/libgit2/pull/5516) +- [tests: merge: fix printf formatter on 32 bit arches](https://github.com/libgit2/libgit2/pull/5513) +- [Update package.json](https://github.com/libgit2/libgit2/pull/5511) +- [Introduce GIT_ASSERT macros](https://github.com/libgit2/libgit2/pull/5509) +- [README.md: Add instructions for building in MinGW environment](https://github.com/libgit2/libgit2/pull/5512) +- [Fix uninitialized stack memory and NULL ptr dereference in stash_to_index](https://github.com/libgit2/libgit2/pull/5510) +- [Honor GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH for all checkout types ](https://github.com/libgit2/libgit2/pull/5378) +- [docs: add documentation for our coding style](https://github.com/libgit2/libgit2/pull/5482) +- [MSVC: Enable Control Flow Guard (CFG)](https://github.com/libgit2/libgit2/pull/5500) +- [git__hexdump: better mimic `hexdump -C`](https://github.com/libgit2/libgit2/pull/5431) +- [Feature: Allow blame to ignore whitespace change](https://github.com/libgit2/libgit2/pull/5383) +- [deps: ntlmclient: use htobe64 on NetBSD too](https://github.com/libgit2/libgit2/pull/5487) +- [sysdir: remove unused git_sysdir_get_str](https://github.com/libgit2/libgit2/pull/5485) +- [Fix typo causing removal of symbol 'git_worktree_prune_init_options'](https://github.com/libgit2/libgit2/pull/5483) +- [pack: Improve error handling for get_delta_base()](https://github.com/libgit2/libgit2/pull/5425) +- [repo::open: ensure we can open the repository](https://github.com/libgit2/libgit2/pull/5480) +- [examples: additions and fixes](https://github.com/libgit2/libgit2/pull/5421) +- [merge: cache negative cache results for similarity metrics](https://github.com/libgit2/libgit2/pull/5477) +- [Handle repository format v1](https://github.com/libgit2/libgit2/pull/5388) +- [CMake: backend selection streamlining](https://github.com/libgit2/libgit2/pull/5440) +- [refdb_fs: remove unused header file](https://github.com/libgit2/libgit2/pull/5461) +- [patch: correctly handle mode changes for renames](https://github.com/libgit2/libgit2/pull/5466) +- [gitignore: clean up patterns from old times](https://github.com/libgit2/libgit2/pull/5474) +- [README.md: update build matrix to reflect our latest releases](https://github.com/libgit2/libgit2/pull/5478) +- [Release v1.0](https://github.com/libgit2/libgit2/pull/5471) +- [refdb_backend: improve callback documentation](https://github.com/libgit2/libgit2/pull/5464) +- [credentials: provide backcompat for opaque structs](https://github.com/libgit2/libgit2/pull/5465) +- [Fix segfault when calling git_blame_buffer()](https://github.com/libgit2/libgit2/pull/5445) +- [Fix spelling error](https://github.com/libgit2/libgit2/pull/5463) +- [refdb_fs: initialize backend version](https://github.com/libgit2/libgit2/pull/5456) +- [repository: improve commondir docs](https://github.com/libgit2/libgit2/pull/5444) +- [cmake: use install directories provided via GNUInstallDirs](https://github.com/libgit2/libgit2/pull/5455) +- [azure: fix errors due to curl and removal of old VM images](https://github.com/libgit2/libgit2/pull/5451) +- [win32: don't canonicalize relative paths](https://github.com/libgit2/libgit2/pull/5435) +- [CMake booleans](https://github.com/libgit2/libgit2/pull/5422) +- [Set proper pkg-config dependency for pcre2](https://github.com/libgit2/libgit2/pull/5439) +- [httpclient: use a 16kb read buffer for macOS](https://github.com/libgit2/libgit2/pull/5432) +- [ci: provide globalsign certs for bionic](https://github.com/libgit2/libgit2/pull/5437) +- [deps: ntlmclient: fix htonll on big endian FreeBSD](https://github.com/libgit2/libgit2/pull/5426) +- [azure-pipelines: download GlobalSign's certificate manually](https://github.com/libgit2/libgit2/pull/5433) +- [deps: ntlmclient: fix missing htonll symbols on FreeBSD and SunOS](https://github.com/libgit2/libgit2/pull/5417) +- [README: add language binding link to wasm-git](https://github.com/libgit2/libgit2/pull/5420) +- [Fix #5410: fix installing libgit2.pc in wrong location](https://github.com/libgit2/libgit2/pull/5412) +- [Fix typo on GIT_USE_NEC](https://github.com/libgit2/libgit2/pull/5413) +- [tests: diff: verify that we are able to diff with empty subtrees](https://github.com/libgit2/libgit2/pull/5374) +- [README: update our build matrix to reflect current releases](https://github.com/libgit2/libgit2/pull/5408) +- [azure: docker: set up HOME variable to fix Coverity builds](https://github.com/libgit2/libgit2/pull/5409) +- [sha1_lookup: inline its only function into "pack.c"](https://github.com/libgit2/libgit2/pull/5390) +- [Coverity fixes](https://github.com/libgit2/libgit2/pull/5391) +- [Release 0.99](https://github.com/libgit2/libgit2/pull/5291) +- [Release script](https://github.com/libgit2/libgit2/pull/5372) +- [azure: fix ARM32 builds by replacing gosu(1)](https://github.com/libgit2/libgit2/pull/5406) +- [openssl: fix Valgrind issues in nightly builds](https://github.com/libgit2/libgit2/pull/5398) +- [fuzzers: Fix the documentation](https://github.com/libgit2/libgit2/pull/5400) +- [azure: fix misleading messages printed to stderr being](https://github.com/libgit2/libgit2/pull/5392) +- [tests: iterator: fix iterator expecting too few items](https://github.com/libgit2/libgit2/pull/5393) +- [transports: http: fix custom headers not being applied](https://github.com/libgit2/libgit2/pull/5387) +- [azure: fix Coverity pipeline](https://github.com/libgit2/libgit2/pull/5382) +- [azure: tests: re-run flaky proxy tests](https://github.com/libgit2/libgit2/pull/5381) +- [fetchhead: strip credentials from remote URL](https://github.com/libgit2/libgit2/pull/5373) +- [azure-pipelines: properly expand negotiate passwords](https://github.com/libgit2/libgit2/pull/5375) +- [cred: change enum to git_credential_t and GIT_CREDENTIAL_*](https://github.com/libgit2/libgit2/pull/5336) +- [Update link to libgit2 Julia language binding](https://github.com/libgit2/libgit2/pull/5371) +- [Return int from non-free functions](https://github.com/libgit2/libgit2/pull/5365) +- [HTTP: Support Apache-based servers with Negotiate](https://github.com/libgit2/libgit2/pull/5286) +- [internal types: change enums from `type_t` to `_t`](https://github.com/libgit2/libgit2/pull/5364) +- [merge: Return non-const git_repository from accessor method](https://github.com/libgit2/libgit2/pull/5358) +- [Do not return free'd git_repository object on error](https://github.com/libgit2/libgit2/pull/5361) +- [refs: refuse to delete HEAD](https://github.com/libgit2/libgit2/pull/5360) +- [index: replace map macros with inline functions](https://github.com/libgit2/libgit2/pull/5351) +- [Make type mismatch errors consistent](https://github.com/libgit2/libgit2/pull/5359) +- [win32: fix relative symlinks pointing into dirs](https://github.com/libgit2/libgit2/pull/5355) +- [ntlm: prevent (spurious) compiler warnings](https://github.com/libgit2/libgit2/pull/5354) +- [Adds support for multiple SSH auth mechanisms being used sequentially](https://github.com/libgit2/libgit2/pull/5305) +- [netops: handle intact query parameters in service_suffix removal](https://github.com/libgit2/libgit2/pull/5339) +- [Refactor packfile code to use zstream abstraction](https://github.com/libgit2/libgit2/pull/5340) +- [Fix git_submodule_sync with relative url](https://github.com/libgit2/libgit2/pull/5322) +- [http: avoid generating double slashes in url](https://github.com/libgit2/libgit2/pull/5325) +- [Correct typo in name of referenced parameter](https://github.com/libgit2/libgit2/pull/5348) +- [patch_parse: fix undefined behaviour due to arithmetic on NULL pointers](https://github.com/libgit2/libgit2/pull/5338) +- [smart_pkt: fix overflow resulting in OOB read/write of one byte](https://github.com/libgit2/libgit2/pull/5337) +- [branch: clarify documentation around branches](https://github.com/libgit2/libgit2/pull/5300) +- [examples: checkout: implement guess heuristic for remote branches](https://github.com/libgit2/libgit2/pull/5283) +- [Minor doc improvements](https://github.com/libgit2/libgit2/pull/5320) +- [attr: Update definition of binary macro](https://github.com/libgit2/libgit2/pull/5333) +- [Security fixes for master](https://github.com/libgit2/libgit2/pull/5331) +- [release.md: note that we do two security releases](https://github.com/libgit2/libgit2/pull/5318) +- [MSVC: Fix warning C4133 on x64: "function": Incompatible types - from "unsigned long *" to "size_t *"](https://github.com/libgit2/libgit2/pull/5317) +- [ci: only push docs from the libgit2/libgit2 repo](https://github.com/libgit2/libgit2/pull/5316) +- [global: convert to fiber-local storage to fix exit races](https://github.com/libgit2/libgit2/pull/5314) +- [Fix copy&paste in git_cherrypick_commit docstring](https://github.com/libgit2/libgit2/pull/5315) +- [patch_parse: fix out-of-bounds reads caused by integer underflow](https://github.com/libgit2/libgit2/pull/5312) +- [tests: fix compiler warning if tracing is disabled](https://github.com/libgit2/libgit2/pull/5311) +- [tests: config: only test parsing huge file with GITTEST_INVASIVE_SPEED](https://github.com/libgit2/libgit2/pull/5313) +- [diff: complete support for git patchid](https://github.com/libgit2/libgit2/pull/5306) +- [Memory optimizations for config entries](https://github.com/libgit2/libgit2/pull/5243) +- [ssh: include sha256 host key hash when supported](https://github.com/libgit2/libgit2/pull/5307) +- [Various examples shape-ups](https://github.com/libgit2/libgit2/pull/5272) +- [Improve trace support in tests](https://github.com/libgit2/libgit2/pull/5309) +- [Move `git_off_t` to `git_object_size_t`](https://github.com/libgit2/libgit2/pull/5123) +- [Add compat typdef for git_attr_t](https://github.com/libgit2/libgit2/pull/5310) +- [CI Build Updates](https://github.com/libgit2/libgit2/pull/5308) +- [patch_parse: use paths from "---"/"+++" lines for binary patches](https://github.com/libgit2/libgit2/pull/5303) +- [Follow 308 redirect in WinHTTP transport](https://github.com/libgit2/libgit2/pull/5285) +- [fileops: correct error return on p_lstat failures when mkdir](https://github.com/libgit2/libgit2/pull/5302) +- [config_mem: implement support for snapshots](https://github.com/libgit2/libgit2/pull/5299) +- [patch_parse: fix segfault when header path contains whitespace only](https://github.com/libgit2/libgit2/pull/5298) +- [config_file: fix race when creating an iterator](https://github.com/libgit2/libgit2/pull/5282) +- [Fix crash if snapshotting a config_snapshot](https://github.com/libgit2/libgit2/pull/5293) +- [fix a bug introduced in 8a23597b](https://github.com/libgit2/libgit2/pull/5295) +- [reflogs: fix behaviour around reflogs with newlines](https://github.com/libgit2/libgit2/pull/5275) +- [commit: verify objects exist in git_commit_with_signature](https://github.com/libgit2/libgit2/pull/5289) +- [patch_parse: fixes for fuzzing errors](https://github.com/libgit2/libgit2/pull/5276) +- [apply: add GIT_APPLY_CHECK](https://github.com/libgit2/libgit2/pull/5227) +- [refs: unlock unmodified refs on transaction commit](https://github.com/libgit2/libgit2/pull/5264) +- [fuzzers: add a new fuzzer for patch parsing](https://github.com/libgit2/libgit2/pull/5269) +- [patch_parse: handle patches without extended headers](https://github.com/libgit2/libgit2/pull/5273) +- [Provide a wrapper for simple submodule clone steps](https://github.com/libgit2/libgit2/pull/4637) +- [macOS GSS Support](https://github.com/libgit2/libgit2/pull/5238) +- [cmake: correct the link stanza for CoreFoundation](https://github.com/libgit2/libgit2/pull/5265) +- [Fix file locking on POSIX OS](https://github.com/libgit2/libgit2/pull/5257) +- [cmake: update minimum CMake version to v3.5.1](https://github.com/libgit2/libgit2/pull/5260) +- [patch_parse: handle patches with new empty files](https://github.com/libgit2/libgit2/pull/5248) +- [DRY commit parsing](https://github.com/libgit2/libgit2/pull/4445) +- [azure: avoid building and testing in Docker as root](https://github.com/libgit2/libgit2/pull/5239) +- [regexp: implement a new regular expression API](https://github.com/libgit2/libgit2/pull/5226) +- [git_refdb API fixes](https://github.com/libgit2/libgit2/pull/5106) +- [Don't use enum for flags](https://github.com/libgit2/libgit2/pull/5242) +- [valgrind: suppress memory leaks in libssh2_session_handshake](https://github.com/libgit2/libgit2/pull/5240) +- [buffer: fix writes into out-of-memory buffers](https://github.com/libgit2/libgit2/pull/5232) +- [cred: add missing private header in GSSAPI block](https://github.com/libgit2/libgit2/pull/5237) +- [CMake pkg-config modulification](https://github.com/libgit2/libgit2/pull/5206) +- [Update chat resources in README.md](https://github.com/libgit2/libgit2/pull/5229) +- [Circular header splitting](https://github.com/libgit2/libgit2/pull/5223) + ## v0.27.0 [(2020-07-28)](https://github.com/nodegit/nodegit/releases/tag/v0.27.0) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.26.5...v0.27.0) @@ -12,7 +201,7 @@ - Prebuilds for Node 14, deprecate Node 8 - Persist RemoteCallbacks and ProxyOptions on the remote if using Remote.prototype.connect. This fixes a segfault when using any routines on a connected remote. -### #Merged PRs into NodeGit +####Merged PRs into NodeGit - [Upgrade build environments #1785](https://github.com/nodegit/nodegit/pull/1785) - [Remote needs to persist the callback/proxyOpts/headers #1784](https://github.com/nodegit/nodegit/pull/1784) - [Remove promisify-node and remove old callback api remnants](https://github.com/nodegit/nodegit/pull/1772) @@ -31,7 +220,7 @@ - Replace unmaintained request library with got - Remove promisify-node and use vanilla promises for all NodeGit promises -### #Merged PRs into NodeGit +#### Merged PRs into NodeGit - [Remove promisify-node and remove old callback api remnants](https://github.com/nodegit/nodegit/pull/1772) - [Replace deprecated package request with got](https://github.com/nodegit/nodegit/pull/1771) - [Bump OpenSSL prebuilt to 1.1.1c](https://github.com/nodegit/nodegit/pull/1770) diff --git a/package-lock.json b/package-lock.json index cfaa4813f..934a91a17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.27.0", + "version": "0.28.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c69caf907..48404dea3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.27.0", + "version": "0.28.0-alpha.1", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 480694cdd9e093b9142ff08c905cb68a7f78f80c Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 20 Nov 2020 09:52:22 -0700 Subject: [PATCH 264/545] Temporarily workaround new action restrictions --- .github/workflows/tests.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fbd1bafc9..1e66d1bec 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,6 +33,8 @@ jobs: - name: Use Node.js uses: actions/setup-node@master + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} check-latest: true @@ -40,6 +42,8 @@ jobs: - name: Install Dependencies for Ubuntu if: startsWith(matrix.os, 'ubuntu') run: sudo apt install build-essential libssl-dev libkrb5-dev libc++-dev + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true - name: Install env: @@ -89,6 +93,8 @@ jobs: - name: Use Node.js uses: implausible/setup-node@feature/expose-architecture-override + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} check-latest: true From 53a2073486a2333db5b105389efb621a7baafd1f Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 20 Nov 2020 10:14:22 -0700 Subject: [PATCH 265/545] Update before install on ubuntu --- .github/workflows/tests.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1e66d1bec..1d2a5651f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -41,7 +41,9 @@ jobs: - name: Install Dependencies for Ubuntu if: startsWith(matrix.os, 'ubuntu') - run: sudo apt install build-essential libssl-dev libkrb5-dev libc++-dev + run: | + sudo apt update + sudo apt install build-essential libssl-dev libkrb5-dev libc++-dev env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true From efc19424200f66b6e9b7ffd4bb5233dc26f0fbd2 Mon Sep 17 00:00:00 2001 From: Lei Nelissen Date: Wed, 2 Dec 2020 14:24:23 +0100 Subject: [PATCH 266/545] Upgrade c++ standard to v14 to ensure compatibility with Electron v11 on macOS Fixes #1808 --- generate/templates/templates/binding.gyp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index d47e32f31..2f9acf366 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -114,7 +114,7 @@ "GCC_ENABLE_CPP_EXCEPTIONS": "YES", "MACOSX_DEPLOYMENT_TARGET": "10.9", 'CLANG_CXX_LIBRARY': 'libc++', - 'CLANG_CXX_LANGUAGE_STANDARD':'c++11', + 'CLANG_CXX_LANGUAGE_STANDARD':'c++14', "WARNING_CFLAGS": [ "-Wno-unused-variable", @@ -166,7 +166,7 @@ [ "OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { "cflags": [ - "-std=c++11" + "-std=c++14" ] } ], From ae18296209bf291a76261bf6f0275cfa6c176652 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Fri, 5 Mar 2021 15:19:30 +0100 Subject: [PATCH 267/545] returns_info: fix ownedByIndices --- generate/templates/filters/returns_info.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate/templates/filters/returns_info.js b/generate/templates/filters/returns_info.js index 2d178e2c1..87a3fc342 100644 --- a/generate/templates/filters/returns_info.js +++ b/generate/templates/filters/returns_info.js @@ -52,7 +52,7 @@ module.exports = function(fn, argReturnsOnly, isAsync) { // sync functions will need to know this. if (!isAsync && return_info.ownedBy) { return_info.ownedBy.forEach(function (argName) { - return_info.ownedByIndices.push(nameToArgIndex[return_info.ownedBy]); + return_info.ownedByIndices.push(nameToArgIndex[argName]); }) } From d4cd5acbf7405e3afe32f6e96ff6e90d93513437 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 3 Mar 2021 17:59:31 -0700 Subject: [PATCH 268/545] Don't strdup nullptr from git_tag_message git_tag_message can return nullptr. From docs: "message of the tag or NULL when unspecified" e.g. https://gitlab.freedesktop.org/mesa/mesa/-/tags/R300_DRIVER_0 --- generate/templates/manual/repository/refresh_references.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 730afadbc..488559c61 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -97,7 +97,8 @@ class RefreshedRefModel { git_tag *referencedTag; if (git_tag_lookup(&referencedTag, repo, referencedTargetOid) == GIT_OK) { - refModel->message = strdup(git_tag_message(referencedTag)); + const char *tagMessage = git_tag_message(referencedTag); + refModel->message = tagMessage ? strdup(tagMessage) : NULL; git_odb_object *tagOdbObject; if (git_odb_read(&tagOdbObject, odb, git_tag_id(referencedTag)) == GIT_OK) { From fc00dfaa5801673ae479b50c9b670bb9f6878514 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 20 Nov 2020 09:52:22 -0700 Subject: [PATCH 269/545] Temporarily workaround new action restrictions --- .github/workflows/tests.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2f2f782a3..f5ac49d3e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,12 +33,16 @@ jobs: - name: Use Node.js uses: actions/setup-node@master + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} - name: Install Dependencies for Ubuntu if: startsWith(matrix.os, 'ubuntu') run: sudo apt install build-essential libssl-dev libkrb5-dev libc++-dev + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true - name: Install env: @@ -88,6 +92,8 @@ jobs: - name: Use Node.js uses: implausible/setup-node@feature/expose-architecture-override + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} node-arch: ${{ matrix.arch }} From b0e7440d716f02e5889f749acc1e7bb1335b9357 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 8 Mar 2021 14:51:02 -0700 Subject: [PATCH 270/545] Check if module is compiled under context aware node version If not, leak cleanup pointer like before --- generate/templates/manual/include/context.h | 14 ++++++++++++++ generate/templates/manual/src/context.cc | 4 ++++ generate/templates/manual/src/thread_pool.cc | 13 +++++++++++-- generate/templates/templates/nodegit.cc | 4 ++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index ab0b256ea..9613b032c 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -8,6 +8,20 @@ #include #include +/* + * Determine if node module is compiled under a supported node release. + * Currently 12 - 15 (ignoring pre-releases). Will need to be updated + * for new major versions. + * + * See: https://github.com/nodejs/node/issues/36349 + * and: https://github.com/nodejs/node/blob/master/doc/abi_version_registry.json + */ +#define IS_CONTEXT_AWARE_NODE_MODULE_VERSION \ + (NODE_MODULE_VERSION == 72 \ + || NODE_MODULE_VERSION == 79 \ + || NODE_MODULE_VERSION == 83 \ + || NODE_MODULE_VERSION == 88) + #include "async_worker.h" #include "thread_pool.h" diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index 88ef1a0be..bfab0e19d 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -5,7 +5,11 @@ namespace nodegit { AsyncContextCleanupHandle::AsyncContextCleanupHandle(v8::Isolate *isolate, Context *context) : context(context), +#if IS_CONTEXT_AWARE_NODE_MODULE_VERSION handle(node::AddEnvironmentCleanupHook(isolate, AsyncCleanupContext, this)) +#else + handle(nullptr) +#endif {} AsyncContextCleanupHandle::~AsyncContextCleanupHandle() { diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 6c8e6776e..42cee5e35 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -687,10 +687,19 @@ namespace nodegit { asyncCallbackData->cleanupHandle.swap(cleanupHandle); asyncCallbackData->pool = nullptr; +#if IS_CONTEXT_AWARE_NODE_MODULE_VERSION uv_close(reinterpret_cast(&jsThreadCallbackAsync), [](uv_handle_t *handle) { - auto asyncCallbackData = static_cast(handle->data); - delete asyncCallbackData; + auto closeAsyncCallbackData = static_cast(handle->data); + delete closeAsyncCallbackData; }); +#else + // NOTE We are deliberately leaking this pointer because `async` cleanup in + // node has not completely landed yet. Trying to cleanup this pointer + // is probably not worth the fight as it's very little memory lost per context + // When all LTS versions of node and Electron support async cleanup, we should + // be heading back to cleanup this + uv_close(reinterpret_cast(&jsThreadCallbackAsync), nullptr); +#endif } ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 45ce409fb..f1d9b9e11 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -108,4 +108,8 @@ NAN_MODULE_INIT(init) { nodegit::LockMaster::InitializeContext(); } +#if IS_CONTEXT_AWARE_NODE_MODULE_VERSION NAN_MODULE_WORKER_ENABLED(nodegit, init) +#else +NODE_MODULE(nodegit, init) +#endif From 905bb6015cc2d1cd721d57ad7418c9e7ed5e74aa Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 10 Mar 2021 09:43:30 -0700 Subject: [PATCH 271/545] Include libgit2 winhttp proxy fix --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index bb31abb74..0acf9f9e3 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit bb31abb74c5f746a3367f94a7648ba240ded5187 +Subproject commit 0acf9f9e3acca13aba5e399bc60956f6020e6025 From 856318cef5ebf50b7185f5b8ec2110f1057c24f3 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 8 Mar 2021 17:25:47 -0700 Subject: [PATCH 272/545] Return/accept boolean for Config#get/setBool --- lib/config.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/config.js b/lib/config.js index 10838522a..37b792da8 100644 --- a/lib/config.js +++ b/lib/config.js @@ -3,6 +3,29 @@ var NodeGit = require("../"); var Config = NodeGit.Config; +var _getBool = Config.prototype.getBool; +var _setBool = Config.prototype.setBool; + +/** + * @async + * @param {String} name The variable's name + * @return {Boolean} The variable's value + */ +Config.prototype.getBool = function(name) { + return _getBool.call(this, name) + .then(result => Boolean(result)); +}; + +/** + * @async + * @param {String} name The variable's name + * @param {Boolean} name The variable's value + * @return {Number} 0 or an error code + */ +Config.prototype.setBool = function(name, value) { + return _setBool.call(this, name, value ? 1 : 0); +}; + // Backwards compatibility. Config.prototype.getString = function() { return this.getStringBuf.apply(this, arguments); From 0a66b299ea71373b7e0f64deb529adb6f495ad2d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 10 Mar 2021 16:58:07 -0700 Subject: [PATCH 273/545] Use key to grab credential type --- lib/credential.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/credential.js b/lib/credential.js index 61637ec59..db1f82a78 100644 --- a/lib/credential.js +++ b/lib/credential.js @@ -22,7 +22,7 @@ NodeGit.Cred = { (type, key) => { Object.defineProperty(type, key, { get: util.deprecate( - () => Credential.TYPE[type], + () => Credential.TYPE[key], createCredTypeDeprecationMessage(type) ) }); From 620e0b1a3ffb78421168e36841c3f7065648ce53 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 12 Mar 2021 12:48:54 -0700 Subject: [PATCH 274/545] Bump to v0.28.0-alpha.1 --- CHANGELOG.md | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cba46cf84..97c0ba02b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,24 +1,36 @@ # Change Log -## v0.28.0-alpha.1 [(2020-11-20)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.1) +## v0.28.0-alpha.1 [(2021-03-12)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.27.0...v0.28.0-alpha.1) #### Summary of changes -- Support for Electron 11 +- *Notice* We planned to fix / address Electron 11 compatibility, but ran into some roadblocks. Fix is coming soon, follow [#114](https://github.com/nodegit/nodegit/issues/1774) for details - Drops support for Node 10.x.y, < 12.19.x, < 14.10.0 -- Drops support for Electron 9.x.y, < 10.1.4 - Brings in LibGit2 1.0.0 +- NodeGit.Config.prototype.setBool handles truthiness, and NodeGit.Config.prototype.getBool returns true or false +- Fix GC ownership memory issue +- Exposes sidebandProgress callback in GitRemoteCallbacks - Fixes issue with winhttp and optional client certificates +- Addresses proxy issue with certification validation in Windows +- Fix crash in NodeGit.Repository.prototype.refreshReferences - Deprecations - NodeGit.Cred is deprecated in favor of NodeGit.Credential #### Merged PRs into NodeGit -- [Merge pull request #1795 from ianhattendorf/refactor/context-awareness](https://github.com/nodegit/nodegit/pull/1795) -- [Merge pull request #1797 from ianhattendorf/fix/longpaths-enum](https://github.com/nodegit/nodegit/pull/1797) -- [Merge pull request #1788 from implausible/bump/libgit2-1.0.0](https://github.com/nodegit/nodegit/pull/1788) +- [Include libgit2 winhttp proxy fix #1824](https://github.com/nodegit/nodegit/pull/1824) +- [Return/accept boolean for Config#get/setBool #1827](https://github.com/nodegit/nodegit/pull/1827) +- [First stab at #1800 (async/await in examples) #1802](https://github.com/nodegit/nodegit/pull/1802) +- [returns_info: fix ownedByIndices #1823](https://github.com/nodegit/nodegit/pull/1823) +- [Remove block for sideband_progress in remote_callbacks #1801](https://github.com/nodegit/nodegit/pull/1801) +- [Use key to grab credential type #1828](https://github.com/nodegit/nodegit/pull/1828) +- [Don't strdup nullptr from git_tag_message #1822](https://github.com/nodegit/nodegit/pull/1822) +- [Refactor for context-awareness #1795](https://github.com/nodegit/nodegit/pull/1795) +- [Update longpath enums to match libgit2 #1797](https://github.com/nodegit/nodegit/pull/1797) +- [Bump libgit2 to fork of v1.0.0 #1788](https://github.com/nodegit/nodegit/pull/1788) #### Merged PRs into Libgit2 +- [winhttp: skip certificate check if unable to send request #5814](https://github.com/libgit2/libgit2/pull/5814) - [sanitizer ci: skip negotiate tests](https://github.com/libgit2/libgit2/pull/5596) - [Add CI support for Memory and UndefinedBehavior Sanitizers](https://github.com/libgit2/libgit2/pull/5569) - [Access HEAD via the refdb backends](https://github.com/libgit2/libgit2/pull/5563) From 193c628845c205406d0e1b96117384abbef66ac3 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Tue, 30 Mar 2021 09:07:20 -0700 Subject: [PATCH 275/545] Bump Libgit2 to 1.1.0 (on current head of libgit2) --- generate/input/descriptor.json | 18 +- generate/input/libgit2-docs.json | 2105 ++++++++++------- generate/input/libgit2-supplement.json | 43 + generate/templates/partials/async_function.cc | 6 +- generate/templates/partials/convert_to_v8.cc | 36 +- generate/templates/partials/fields.cc | 4 +- generate/templates/partials/sync_function.cc | 6 +- lib/revparse.js | 18 + lifecycleScripts/install.js | 8 +- package-lock.json | 281 ++- package.json | 2 +- vendor/libgit2 | 2 +- vendor/libgit2.gyp | 35 +- 13 files changed, 1585 insertions(+), 979 deletions(-) create mode 100644 lib/revparse.js diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index da0711f84..c6a400901 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -82,6 +82,10 @@ "JsName": "TYPE", "isMask": false }, + "revspec": { + "JsName": "TYPE", + "isMask": false + }, "sort": { "owner": "Revwalk" }, @@ -307,6 +311,9 @@ "isErrorCode": true } }, + "git_blob_filter_options_init": { + "ignore": true + }, "git_blob_filtered_content": { "isAsync": true, "isPrototypeMethod": false, @@ -2728,6 +2735,10 @@ "dependencies": [ "../include/convenient_patch.h" ], + "ownerFn": { + "name": "git_patch_owner", + "singletonCppClassName": "GitRepository" + }, "functions": { "git_patch_free": { "ignore": true @@ -3672,9 +3683,6 @@ } } }, - "revspec": { - "ignore": true - }, "revwalk": { "selfFreeing": true, "ownerFn": { @@ -3881,7 +3889,11 @@ }, "strarray": { "selfFreeing": true, + "freeFunctionName": "git_strarray_dispose", "functions": { + "git_strarray_dispose": { + "ignore": true + }, "git_strarray_free": { "ignore": true } diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index c01194e82..e9f259a71 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -51,7 +51,7 @@ "git_blame_free" ], "meta": {}, - "lines": 224 + "lines": 226 }, { "file": "git2/blob.h", @@ -63,6 +63,7 @@ "git_blob_owner", "git_blob_rawcontent", "git_blob_rawsize", + "git_blob_filter_options_init", "git_blob_filter", "git_blob_create_from_workdir", "git_blob_create_from_disk", @@ -73,7 +74,7 @@ "git_blob_dup" ], "meta": {}, - "lines": 260 + "lines": 276 }, { "file": "git2/branch.h", @@ -93,10 +94,11 @@ "git_branch_is_head", "git_branch_is_checked_out", "git_branch_remote_name", - "git_branch_upstream_remote" + "git_branch_upstream_remote", + "git_branch_name_is_valid" ], "meta": {}, - "lines": 305 + "lines": 317 }, { "file": "git2/buffer.h", @@ -116,7 +118,7 @@ "git_transport_certificate_check_cb" ], "meta": {}, - "lines": 131 + "lines": 167 }, { "file": "git2/checkout.h", @@ -200,7 +202,7 @@ "git_libgit2_opts" ], "meta": {}, - "lines": 411 + "lines": 423 }, { "file": "git2/config.h", @@ -283,20 +285,24 @@ { "file": "git2/deprecated.h", "functions": [ - "git_blob_create_fromworkdir", "git_blob_filtered_content", + "git_treebuilder_write_with_buffer", "git_buf_free", "giterr_last", "giterr_clear", "giterr_set_str", "giterr_set_oom", "git_object__size", + "git_remote_is_valid_name", + "git_reference_is_valid_name", "git_oid_iszero", "git_headlist_cb", + "git_strarray_copy", + "git_strarray_free", "git_blame_init_options" ], "meta": {}, - "lines": 530 + "lines": 667 }, { "file": "git2/describe.h", @@ -367,7 +373,7 @@ "git_error_set_oom" ], "meta": {}, - "lines": 159 + "lines": 160 }, { "file": "git2/filter.h", @@ -462,7 +468,7 @@ "git_index_conflict_iterator_free" ], "meta": {}, - "lines": 830 + "lines": 829 }, { "file": "git2/indexer.h", @@ -687,6 +693,7 @@ { "file": "git2/patch.h", "functions": [ + "git_patch_owner", "git_patch_from_diff", "git_patch_from_blobs", "git_patch_from_blob_and_buffer", @@ -703,7 +710,7 @@ "git_patch_to_buf" ], "meta": {}, - "lines": 268 + "lines": 276 }, { "file": "git2/pathspec.h", @@ -831,11 +838,11 @@ "git_reference_is_note", "git_reference_normalize_name", "git_reference_peel", - "git_reference_is_valid_name", + "git_reference_name_is_valid", "git_reference_shorthand" ], "meta": {}, - "lines": 763 + "lines": 764 }, { "file": "git2/refspec.h", @@ -903,12 +910,12 @@ "git_remote_set_autotag", "git_remote_prune_refs", "git_remote_rename", - "git_remote_is_valid_name", + "git_remote_name_is_valid", "git_remote_delete", "git_remote_default_branch" ], "meta": {}, - "lines": 951 + "lines": 952 }, { "file": "git2/repository.h", @@ -961,7 +968,7 @@ "git_repository_set_ident" ], "meta": {}, - "lines": 899 + "lines": 943 }, { "file": "git2/reset.h", @@ -1066,11 +1073,11 @@ { "file": "git2/strarray.h", "functions": [ - "git_strarray_free", + "git_strarray_dispose", "git_strarray_copy" ], "meta": {}, - "lines": 53 + "lines": 49 }, { "file": "git2/submodule.h", @@ -1173,10 +1180,11 @@ "git_tag_foreach_cb", "git_tag_foreach", "git_tag_peel", - "git_tag_dup" + "git_tag_dup", + "git_tag_name_is_valid" ], "meta": {}, - "lines": 366 + "lines": 378 }, { "file": "git2/trace.h", @@ -1243,14 +1251,13 @@ "git_treebuilder_filter_cb", "git_treebuilder_filter", "git_treebuilder_write", - "git_treebuilder_write_with_buffer", "git_treewalk_cb", "git_tree_walk", "git_tree_dup", "git_tree_create_updated" ], "meta": {}, - "lines": 481 + "lines": 467 }, { "file": "git2/types.h", @@ -1315,7 +1322,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_annotated_commit_from_ref-1" + "ex/HEAD/checkout.html#git_annotated_commit_from_ref-1" ] } }, @@ -1421,7 +1428,7 @@ "type": "int", "comment": " 0 on success or error code" }, - "description": "

Creates a git_annotated_comit from a revision string.

\n", + "description": "

Creates a git_annotated_commit from a revision string.

\n", "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", "group": "annotated" }, @@ -1448,12 +1455,12 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_annotated_commit_id-2" + "ex/HEAD/checkout.html#git_annotated_commit_id-2" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_annotated_commit_id-1", - "ex/v0.99.0/merge.html#git_annotated_commit_id-2", - "ex/v0.99.0/merge.html#git_annotated_commit_id-3" + "ex/HEAD/merge.html#git_annotated_commit_id-1", + "ex/HEAD/merge.html#git_annotated_commit_id-2", + "ex/HEAD/merge.html#git_annotated_commit_id-3" ] } }, @@ -1480,9 +1487,9 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_annotated_commit_ref-3", - "ex/v0.99.0/checkout.html#git_annotated_commit_ref-4", - "ex/v0.99.0/checkout.html#git_annotated_commit_ref-5" + "ex/HEAD/checkout.html#git_annotated_commit_ref-3", + "ex/HEAD/checkout.html#git_annotated_commit_ref-4", + "ex/HEAD/checkout.html#git_annotated_commit_ref-5" ] } }, @@ -1509,7 +1516,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_annotated_commit_free-6" + "ex/HEAD/checkout.html#git_annotated_commit_free-6" ] } }, @@ -1802,8 +1809,8 @@ "git_blame_options_init": { "type": "function", "file": "git2/blame.h", - "line": 103, - "lineto": 105, + "line": 105, + "lineto": 107, "args": [ { "name": "opts", @@ -1829,8 +1836,8 @@ "git_blame_get_hunk_count": { "type": "function", "file": "git2/blame.h", - "line": 154, - "lineto": 154, + "line": 156, + "lineto": 156, "args": [ { "name": "blame", @@ -1851,8 +1858,8 @@ "git_blame_get_hunk_byindex": { "type": "function", "file": "git2/blame.h", - "line": 163, - "lineto": 165, + "line": 165, + "lineto": 167, "args": [ { "name": "blame", @@ -1878,8 +1885,8 @@ "git_blame_get_hunk_byline": { "type": "function", "file": "git2/blame.h", - "line": 174, - "lineto": 176, + "line": 176, + "lineto": 178, "args": [ { "name": "blame", @@ -1903,15 +1910,15 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_blame_get_hunk_byline-1" + "ex/HEAD/blame.html#git_blame_get_hunk_byline-1" ] } }, "git_blame_file": { "type": "function", "file": "git2/blame.h", - "line": 189, - "lineto": 193, + "line": 191, + "lineto": 195, "args": [ { "name": "out", @@ -1945,15 +1952,15 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_blame_file-2" + "ex/HEAD/blame.html#git_blame_file-2" ] } }, "git_blame_buffer": { "type": "function", "file": "git2/blame.h", - "line": 213, - "lineto": 217, + "line": 215, + "lineto": 219, "args": [ { "name": "out", @@ -1989,8 +1996,8 @@ "git_blame_free": { "type": "function", "file": "git2/blame.h", - "line": 224, - "lineto": 224, + "line": 226, + "lineto": 226, "args": [ { "name": "blame", @@ -2009,7 +2016,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_blame_free-3" + "ex/HEAD/blame.html#git_blame_free-3" ] } }, @@ -2046,10 +2053,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_blob_lookup-4" + "ex/HEAD/blame.html#git_blob_lookup-4" ], "general.c": [ - "ex/v0.99.0/general.html#git_blob_lookup-1" + "ex/HEAD/general.html#git_blob_lookup-1" ] } }, @@ -2113,10 +2120,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_blob_free-5" + "ex/HEAD/blame.html#git_blob_free-5" ], "general.c": [ - "ex/v0.99.0/general.html#git_blob_free-2" + "ex/HEAD/general.html#git_blob_free-2" ] } }, @@ -2180,20 +2187,20 @@ "sig": "const git_blob *", "return": { "type": "const void *", - "comment": " the pointer" + "comment": " the pointer, or NULL on error" }, "description": "

Get a read-only buffer with the raw content of a blob.

\n", "comments": "

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.

\n", "group": "blob", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_blob_rawcontent-6" + "ex/HEAD/blame.html#git_blob_rawcontent-6" ], "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_blob_rawcontent-1" + "ex/HEAD/cat-file.html#git_blob_rawcontent-1" ], "general.c": [ - "ex/v0.99.0/general.html#git_blob_rawcontent-3" + "ex/HEAD/general.html#git_blob_rawcontent-3" ] } }, @@ -2220,22 +2227,49 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_blob_rawsize-7" + "ex/HEAD/blame.html#git_blob_rawsize-7" ], "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_blob_rawsize-2" + "ex/HEAD/cat-file.html#git_blob_rawsize-2" ], "general.c": [ - "ex/v0.99.0/general.html#git_blob_rawsize-4", - "ex/v0.99.0/general.html#git_blob_rawsize-5" + "ex/HEAD/general.html#git_blob_rawsize-4", + "ex/HEAD/general.html#git_blob_rawsize-5" ] } }, + "git_blob_filter_options_init": { + "type": "function", + "file": "git2/blob.h", + "line": 146, + "lineto": 146, + "args": [ + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "The `git_blob_filter_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_BLOB_FILTER_OPTIONS_VERSION`." + } + ], + "argline": "git_blob_filter_options *opts, unsigned int version", + "sig": "git_blob_filter_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_blob_filter_options structure

\n", + "comments": "

Initializes a git_blob_filter_options with default values. Equivalent to creating an instance with GIT_BLOB_FILTER_OPTIONS_INIT.

\n", + "group": "blob" + }, "git_blob_filter": { "type": "function", "file": "git2/blob.h", - "line": 154, - "lineto": 158, + "line": 170, + "lineto": 174, "args": [ { "name": "out", @@ -2271,8 +2305,8 @@ "git_blob_create_from_workdir": { "type": "function", "file": "git2/blob.h", - "line": 171, - "lineto": 171, + "line": 187, + "lineto": 187, "args": [ { "name": "id", @@ -2303,8 +2337,8 @@ "git_blob_create_from_disk": { "type": "function", "file": "git2/blob.h", - "line": 183, - "lineto": 183, + "line": 199, + "lineto": 199, "args": [ { "name": "id", @@ -2335,8 +2369,8 @@ "git_blob_create_from_stream": { "type": "function", "file": "git2/blob.h", - "line": 210, - "lineto": 213, + "line": 226, + "lineto": 229, "args": [ { "name": "out", @@ -2367,8 +2401,8 @@ "git_blob_create_from_stream_commit": { "type": "function", "file": "git2/blob.h", - "line": 224, - "lineto": 226, + "line": 240, + "lineto": 242, "args": [ { "name": "out", @@ -2394,8 +2428,8 @@ "git_blob_create_from_buffer": { "type": "function", "file": "git2/blob.h", - "line": 237, - "lineto": 238, + "line": 253, + "lineto": 254, "args": [ { "name": "id", @@ -2431,8 +2465,8 @@ "git_blob_is_binary": { "type": "function", "file": "git2/blob.h", - "line": 251, - "lineto": 251, + "line": 267, + "lineto": 267, "args": [ { "name": "blob", @@ -2453,8 +2487,8 @@ "git_blob_dup": { "type": "function", "file": "git2/blob.h", - "line": 260, - "lineto": 260, + "line": 276, + "lineto": 276, "args": [ { "name": "out", @@ -2562,7 +2596,7 @@ "group": "branch", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_branch_create_from_annotated-7" + "ex/HEAD/checkout.html#git_branch_create_from_annotated-7" ] } }, @@ -2776,7 +2810,7 @@ "group": "branch", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_branch_name-4" + "ex/HEAD/merge.html#git_branch_name-4" ] } }, @@ -2974,6 +3008,33 @@ "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", "group": "branch" }, + "git_branch_name_is_valid": { + "type": "function", + "file": "git2/branch.h", + "line": 317, + "lineto": 317, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given branch name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a branch name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Determine whether a branch name is valid, meaning that (when prefixed\n with refs/heads/) that it is a valid reference name, and that any\n additional branch name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "branch" + }, "git_buf_dispose": { "type": "function", "file": "git2/buffer.h", @@ -2997,11 +3058,11 @@ "group": "buf", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_buf_dispose-1", - "ex/v0.99.0/diff.html#git_buf_dispose-2" + "ex/HEAD/diff.html#git_buf_dispose-1", + "ex/HEAD/diff.html#git_buf_dispose-2" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_buf_dispose-1" + "ex/HEAD/tag.html#git_buf_dispose-1" ] } }, @@ -3227,10 +3288,10 @@ "group": "checkout", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_checkout_tree-8" + "ex/HEAD/checkout.html#git_checkout_tree-8" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_checkout_tree-5" + "ex/HEAD/merge.html#git_checkout_tree-5" ] } }, @@ -3437,18 +3498,18 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_commit_lookup-9" + "ex/HEAD/checkout.html#git_commit_lookup-9" ], "general.c": [ - "ex/v0.99.0/general.html#git_commit_lookup-6", - "ex/v0.99.0/general.html#git_commit_lookup-7", - "ex/v0.99.0/general.html#git_commit_lookup-8" + "ex/HEAD/general.html#git_commit_lookup-6", + "ex/HEAD/general.html#git_commit_lookup-7", + "ex/HEAD/general.html#git_commit_lookup-8" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_lookup-1" + "ex/HEAD/log.html#git_commit_lookup-1" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_commit_lookup-6" + "ex/HEAD/merge.html#git_commit_lookup-6" ] } }, @@ -3512,20 +3573,20 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_commit_free-10" + "ex/HEAD/checkout.html#git_commit_free-10" ], "general.c": [ - "ex/v0.99.0/general.html#git_commit_free-9", - "ex/v0.99.0/general.html#git_commit_free-10", - "ex/v0.99.0/general.html#git_commit_free-11", - "ex/v0.99.0/general.html#git_commit_free-12", - "ex/v0.99.0/general.html#git_commit_free-13" + "ex/HEAD/general.html#git_commit_free-9", + "ex/HEAD/general.html#git_commit_free-10", + "ex/HEAD/general.html#git_commit_free-11", + "ex/HEAD/general.html#git_commit_free-12", + "ex/HEAD/general.html#git_commit_free-13" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_free-2", - "ex/v0.99.0/log.html#git_commit_free-3", - "ex/v0.99.0/log.html#git_commit_free-4", - "ex/v0.99.0/log.html#git_commit_free-5" + "ex/HEAD/log.html#git_commit_free-2", + "ex/HEAD/log.html#git_commit_free-3", + "ex/HEAD/log.html#git_commit_free-4", + "ex/HEAD/log.html#git_commit_free-5" ] } }, @@ -3552,10 +3613,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_commit_id-14" + "ex/HEAD/general.html#git_commit_id-14" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_id-6" + "ex/HEAD/log.html#git_commit_id-6" ] } }, @@ -3582,8 +3643,8 @@ "group": "commit", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_commit_owner-7", - "ex/v0.99.0/log.html#git_commit_owner-8" + "ex/HEAD/log.html#git_commit_owner-7", + "ex/HEAD/log.html#git_commit_owner-8" ] } }, @@ -3632,21 +3693,21 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_commit_message-3", - "ex/v0.99.0/cat-file.html#git_commit_message-4" + "ex/HEAD/cat-file.html#git_commit_message-3", + "ex/HEAD/cat-file.html#git_commit_message-4" ], "general.c": [ - "ex/v0.99.0/general.html#git_commit_message-15", - "ex/v0.99.0/general.html#git_commit_message-16", - "ex/v0.99.0/general.html#git_commit_message-17" + "ex/HEAD/general.html#git_commit_message-15", + "ex/HEAD/general.html#git_commit_message-16", + "ex/HEAD/general.html#git_commit_message-17" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_message-9", - "ex/v0.99.0/log.html#git_commit_message-10", - "ex/v0.99.0/log.html#git_commit_message-11" + "ex/HEAD/log.html#git_commit_message-9", + "ex/HEAD/log.html#git_commit_message-10", + "ex/HEAD/log.html#git_commit_message-11" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_commit_message-2" + "ex/HEAD/tag.html#git_commit_message-2" ] } }, @@ -3739,8 +3800,8 @@ "group": "commit", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_commit_time-18", - "ex/v0.99.0/general.html#git_commit_time-19" + "ex/HEAD/general.html#git_commit_time-18", + "ex/HEAD/general.html#git_commit_time-19" ] } }, @@ -3789,13 +3850,13 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_commit_committer-5" + "ex/HEAD/cat-file.html#git_commit_committer-5" ], "general.c": [ - "ex/v0.99.0/general.html#git_commit_committer-20" + "ex/HEAD/general.html#git_commit_committer-20" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_committer-12" + "ex/HEAD/log.html#git_commit_committer-12" ] } }, @@ -3822,15 +3883,15 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_commit_author-6" + "ex/HEAD/cat-file.html#git_commit_author-6" ], "general.c": [ - "ex/v0.99.0/general.html#git_commit_author-21", - "ex/v0.99.0/general.html#git_commit_author-22" + "ex/HEAD/general.html#git_commit_author-21", + "ex/HEAD/general.html#git_commit_author-22" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_author-13", - "ex/v0.99.0/log.html#git_commit_author-14" + "ex/HEAD/log.html#git_commit_author-13", + "ex/HEAD/log.html#git_commit_author-14" ] } }, @@ -3948,11 +4009,11 @@ "group": "commit", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_commit_tree-15", - "ex/v0.99.0/log.html#git_commit_tree-16", - "ex/v0.99.0/log.html#git_commit_tree-17", - "ex/v0.99.0/log.html#git_commit_tree-18", - "ex/v0.99.0/log.html#git_commit_tree-19" + "ex/HEAD/log.html#git_commit_tree-15", + "ex/HEAD/log.html#git_commit_tree-16", + "ex/HEAD/log.html#git_commit_tree-17", + "ex/HEAD/log.html#git_commit_tree-18", + "ex/HEAD/log.html#git_commit_tree-19" ] } }, @@ -3979,7 +4040,7 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_commit_tree_id-7" + "ex/HEAD/cat-file.html#git_commit_tree_id-7" ] } }, @@ -4006,14 +4067,14 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_commit_parentcount-8" + "ex/HEAD/cat-file.html#git_commit_parentcount-8" ], "general.c": [ - "ex/v0.99.0/general.html#git_commit_parentcount-23" + "ex/HEAD/general.html#git_commit_parentcount-23" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_parentcount-20", - "ex/v0.99.0/log.html#git_commit_parentcount-21" + "ex/HEAD/log.html#git_commit_parentcount-20", + "ex/HEAD/log.html#git_commit_parentcount-21" ] } }, @@ -4050,11 +4111,11 @@ "group": "commit", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_commit_parent-24" + "ex/HEAD/general.html#git_commit_parent-24" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_parent-22", - "ex/v0.99.0/log.html#git_commit_parent-23" + "ex/HEAD/log.html#git_commit_parent-22", + "ex/HEAD/log.html#git_commit_parent-23" ] } }, @@ -4086,10 +4147,10 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_commit_parent_id-9" + "ex/HEAD/cat-file.html#git_commit_parent_id-9" ], "log.c": [ - "ex/v0.99.0/log.html#git_commit_parent_id-24" + "ex/HEAD/log.html#git_commit_parent_id-24" ] } }, @@ -4267,7 +4328,7 @@ "group": "commit", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_commit_create-7" + "ex/HEAD/merge.html#git_commit_create-7" ] } }, @@ -4333,11 +4394,14 @@ "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", "group": "commit", "examples": { + "commit.c": [ + "ex/HEAD/commit.html#git_commit_create_v-1" + ], "general.c": [ - "ex/v0.99.0/general.html#git_commit_create_v-25" + "ex/HEAD/general.html#git_commit_create_v-25" ], "init.c": [ - "ex/v0.99.0/init.html#git_commit_create_v-1" + "ex/HEAD/init.html#git_commit_create_v-1" ] } }, @@ -4580,8 +4644,8 @@ "git_libgit2_opts": { "type": "function", "file": "git2/common.h", - "line": 411, - "lineto": 411, + "line": 423, + "lineto": 423, "args": [ { "name": "option", @@ -4596,7 +4660,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    >Set the maximum amount of memory that can be mapped at any time        by the library\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n", "group": "libgit2" }, "git_config_entry_free": { @@ -4823,7 +4887,7 @@ "group": "config", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_config_open_ondisk-26" + "ex/HEAD/general.html#git_config_open_ondisk-26" ] } }, @@ -4883,7 +4947,7 @@ "comment": null }, "description": "

Open the global/XDG configuration file according to git's rules

\n", - "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatability, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", + "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatibility, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", "group": "config" }, "git_config_snapshot": { @@ -4936,8 +5000,8 @@ "group": "config", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_config_free-27", - "ex/v0.99.0/general.html#git_config_free-28" + "ex/HEAD/general.html#git_config_free-27", + "ex/HEAD/general.html#git_config_free-28" ] } }, @@ -5006,8 +5070,8 @@ "group": "config", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_config_get_int32-29", - "ex/v0.99.0/general.html#git_config_get_int32-30" + "ex/HEAD/general.html#git_config_get_int32-29", + "ex/HEAD/general.html#git_config_get_int32-30" ] } }, @@ -5140,8 +5204,8 @@ "group": "config", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_config_get_string-31", - "ex/v0.99.0/general.html#git_config_get_string-32" + "ex/HEAD/general.html#git_config_get_string-31", + "ex/HEAD/general.html#git_config_get_string-32" ] } }, @@ -6292,80 +6356,80 @@ "comments": "", "group": "credential" }, - "git_blob_create_fromworkdir": { + "git_blob_filtered_content": { "type": "function", "file": "git2/deprecated.h", - "line": 86, - "lineto": 86, + "line": 114, + "lineto": 118, "args": [ { - "name": "id", - "type": "git_oid *", + "name": "out", + "type": "git_buf *", "comment": null }, { - "name": "repo", - "type": "git_repository *", + "name": "blob", + "type": "git_blob *", "comment": null }, { - "name": "relative_path", + "name": "as_path", "type": "const char *", "comment": null + }, + { + "name": "check_for_binary_data", + "type": "int", + "comment": null } ], - "argline": "git_oid *id, git_repository *repo, const char *relative_path", - "sig": "git_oid *::git_repository *::const char *", + "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", + "sig": "git_buf *::git_blob *::const char *::int", "return": { "type": "int", "comment": null }, - "description": "", - "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility values at this time.

\n\n

@{

\n", + "description": "

Deprecated in favor of git_blob_filter.

\n", + "comments": "", "group": "blob" }, - "git_blob_filtered_content": { + "git_treebuilder_write_with_buffer": { "type": "function", "file": "git2/deprecated.h", - "line": 99, - "lineto": 103, + "line": 144, + "lineto": 145, "args": [ { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "blob", - "type": "git_blob *", + "name": "oid", + "type": "git_oid *", "comment": null }, { - "name": "as_path", - "type": "const char *", + "name": "bld", + "type": "git_treebuilder *", "comment": null }, { - "name": "check_for_binary_data", - "type": "int", + "name": "tree", + "type": "git_buf *", "comment": null } ], - "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", - "sig": "git_buf *::git_blob *::const char *::int", + "argline": "git_oid *oid, git_treebuilder *bld, git_buf *tree", + "sig": "git_oid *::git_treebuilder *::git_buf *", "return": { "type": "int", "comment": null }, - "description": "

Deprecated in favor of

\n", - "comments": "", - "group": "blob" + "description": "

Write the contents of the tree builder as a tree object.\n This is an alias of git_treebuilder_write and is preserved\n for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "treebuilder" }, "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 128, - "lineto": 128, + "line": 170, + "lineto": 170, "args": [ { "name": "buffer", @@ -6386,8 +6450,8 @@ "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 202, - "lineto": 202, + "line": 244, + "lineto": 244, "args": [], "argline": "", "sig": "", @@ -6402,8 +6466,8 @@ "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 214, - "lineto": 214, + "line": 256, + "lineto": 256, "args": [], "argline": "", "sig": "", @@ -6418,8 +6482,8 @@ "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 226, - "lineto": 226, + "line": 268, + "lineto": 268, "args": [ { "name": "error_class", @@ -6445,8 +6509,8 @@ "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 238, - "lineto": 238, + "line": 280, + "lineto": 280, "args": [], "argline": "", "sig": "", @@ -6454,15 +6518,15 @@ "type": "void", "comment": null }, - "description": "

Indicates that an out-of-memory situation occured. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", + "description": "

Indicates that an out-of-memory situation occurred. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "giterr" }, "git_object__size": { "type": "function", "file": "git2/deprecated.h", - "line": 328, - "lineto": 328, + "line": 370, + "lineto": 370, "args": [ { "name": "type", @@ -6480,11 +6544,55 @@ "comments": "

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.

\n", "group": "object" }, + "git_remote_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 391, + "lineto": 391, + "args": [ + { + "name": "remote_name", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *remote_name", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the remote name is well-formed.

\n", + "comments": "", + "group": "remote" + }, + "git_reference_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 435, + "lineto": 435, + "args": [ + { + "name": "refname", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *refname", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the reference name is well-formed.

\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "group": "reference" + }, "git_oid_iszero": { "type": "function", "file": "git2/deprecated.h", - "line": 471, - "lineto": 471, + "line": 572, + "lineto": 572, "args": [ { "name": "id", @@ -6502,11 +6610,60 @@ "comments": "

These types are retained for backward compatibility. The newer versions of these values should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility values at this time.

\n\n

@{

\n", "group": "oid" }, + "git_strarray_copy": { + "type": "function", + "file": "git2/strarray.h", + "line": 49, + "lineto": 49, + "args": [ + { + "name": "tgt", + "type": "git_strarray *", + "comment": "target" + }, + { + "name": "src", + "type": "const git_strarray *", + "comment": "source" + } + ], + "argline": "git_strarray *tgt, const git_strarray *src", + "sig": "git_strarray *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n 0 on allocation failure" + }, + "description": "

Copy a string array object from source to target.

\n", + "comments": "

Note: target is overwritten and hence should be empty, otherwise its contents are leaked. Call git_strarray_free() if necessary.

\n", + "group": "strarray" + }, + "git_strarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 653, + "lineto": 653, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": null + } + ], + "argline": "git_strarray *array", + "sig": "git_strarray *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory referred to by the git_strarray. This is an alias of\n git_strarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "strarray" + }, "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 530, - "lineto": 530, + "line": 667, + "lineto": 667, "args": [ { "name": "opts", @@ -6557,7 +6714,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v0.99.0/describe.html#git_describe_options_init-1" + "ex/HEAD/describe.html#git_describe_options_init-1" ] } }, @@ -6589,7 +6746,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v0.99.0/describe.html#git_describe_format_options_init-2" + "ex/HEAD/describe.html#git_describe_format_options_init-2" ] } }, @@ -6626,7 +6783,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v0.99.0/describe.html#git_describe_commit-3" + "ex/HEAD/describe.html#git_describe_commit-3" ] } }, @@ -6663,7 +6820,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v0.99.0/describe.html#git_describe_workdir-4" + "ex/HEAD/describe.html#git_describe_workdir-4" ] } }, @@ -6700,7 +6857,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v0.99.0/describe.html#git_describe_format-5" + "ex/HEAD/describe.html#git_describe_format-5" ] } }, @@ -6803,11 +6960,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_free-3" + "ex/HEAD/diff.html#git_diff_free-3" ], "log.c": [ - "ex/v0.99.0/log.html#git_diff_free-25", - "ex/v0.99.0/log.html#git_diff_free-26" + "ex/HEAD/log.html#git_diff_free-25", + "ex/HEAD/log.html#git_diff_free-26" ] } }, @@ -6854,11 +7011,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_tree_to_tree-4" + "ex/HEAD/diff.html#git_diff_tree_to_tree-4" ], "log.c": [ - "ex/v0.99.0/log.html#git_diff_tree_to_tree-27", - "ex/v0.99.0/log.html#git_diff_tree_to_tree-28" + "ex/HEAD/log.html#git_diff_tree_to_tree-27", + "ex/HEAD/log.html#git_diff_tree_to_tree-28" ] } }, @@ -6905,7 +7062,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_tree_to_index-5" + "ex/HEAD/diff.html#git_diff_tree_to_index-5" ] } }, @@ -6947,7 +7104,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_index_to_workdir-6" + "ex/HEAD/diff.html#git_diff_index_to_workdir-6" ] } }, @@ -6989,7 +7146,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_tree_to_workdir-7" + "ex/HEAD/diff.html#git_diff_tree_to_workdir-7" ] } }, @@ -7031,7 +7188,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_tree_to_workdir_with_index-8" + "ex/HEAD/diff.html#git_diff_tree_to_workdir_with_index-8" ] } }, @@ -7132,7 +7289,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_find_similar-9" + "ex/HEAD/diff.html#git_diff_find_similar-9" ] } }, @@ -7159,7 +7316,7 @@ "group": "diff", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_diff_num_deltas-29" + "ex/HEAD/log.html#git_diff_num_deltas-29" ] } }, @@ -7346,10 +7503,10 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_print-10" + "ex/HEAD/diff.html#git_diff_print-10" ], "log.c": [ - "ex/v0.99.0/log.html#git_diff_print-30" + "ex/HEAD/log.html#git_diff_print-30" ] } }, @@ -7634,7 +7791,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_from_buffer-11" + "ex/HEAD/diff.html#git_diff_from_buffer-11" ] } }, @@ -7666,7 +7823,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_get_stats-12" + "ex/HEAD/diff.html#git_diff_get_stats-12" ] } }, @@ -7774,7 +7931,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_stats_to_buf-13" + "ex/HEAD/diff.html#git_diff_stats_to_buf-13" ] } }, @@ -7801,7 +7958,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_diff_stats_free-14" + "ex/HEAD/diff.html#git_diff_stats_free-14" ] } }, @@ -7978,8 +8135,8 @@ "git_error_last": { "type": "function", "file": "git2/errors.h", - "line": 124, - "lineto": 124, + "line": 125, + "lineto": 125, "args": [], "argline": "", "sig": "", @@ -7992,25 +8149,28 @@ "group": "error", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_error_last-11", - "ex/v0.99.0/checkout.html#git_error_last-12", - "ex/v0.99.0/checkout.html#git_error_last-13", - "ex/v0.99.0/checkout.html#git_error_last-14" + "ex/HEAD/checkout.html#git_error_last-11", + "ex/HEAD/checkout.html#git_error_last-12", + "ex/HEAD/checkout.html#git_error_last-13", + "ex/HEAD/checkout.html#git_error_last-14" + ], + "commit.c": [ + "ex/HEAD/commit.html#git_error_last-2" ], "general.c": [ - "ex/v0.99.0/general.html#git_error_last-33" + "ex/HEAD/general.html#git_error_last-33" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_error_last-8", - "ex/v0.99.0/merge.html#git_error_last-9" + "ex/HEAD/merge.html#git_error_last-8", + "ex/HEAD/merge.html#git_error_last-9" ] } }, "git_error_clear": { "type": "function", "file": "git2/errors.h", - "line": 129, - "lineto": 129, + "line": 130, + "lineto": 130, "args": [], "argline": "", "sig": "", @@ -8025,8 +8185,8 @@ "git_error_set_str": { "type": "function", "file": "git2/errors.h", - "line": 148, - "lineto": 148, + "line": 149, + "lineto": 149, "args": [ { "name": "error_class", @@ -8052,8 +8212,8 @@ "git_error_set_oom": { "type": "function", "file": "git2/errors.h", - "line": 159, - "lineto": 159, + "line": 160, + "lineto": 160, "args": [], "argline": "", "sig": "", @@ -8380,7 +8540,7 @@ "group": "libgit2", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_libgit2_init-34" + "ex/HEAD/general.html#git_libgit2_init-34" ] } }, @@ -8627,16 +8787,19 @@ "group": "index", "examples": { "add.c": [ - "ex/v0.99.0/add.html#git_index_free-1" + "ex/HEAD/add.html#git_index_free-1" + ], + "commit.c": [ + "ex/HEAD/commit.html#git_index_free-3" ], "general.c": [ - "ex/v0.99.0/general.html#git_index_free-35" + "ex/HEAD/general.html#git_index_free-35" ], "init.c": [ - "ex/v0.99.0/init.html#git_index_free-2" + "ex/HEAD/init.html#git_index_free-2" ], "ls-files.c": [ - "ex/v0.99.0/ls-files.html#git_index_free-1" + "ex/HEAD/ls-files.html#git_index_free-1" ] } }, @@ -8810,7 +8973,10 @@ "group": "index", "examples": { "add.c": [ - "ex/v0.99.0/add.html#git_index_write-2" + "ex/HEAD/add.html#git_index_write-2" + ], + "commit.c": [ + "ex/HEAD/commit.html#git_index_write-4" ] } }, @@ -8912,11 +9078,14 @@ "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", "group": "index", "examples": { + "commit.c": [ + "ex/HEAD/commit.html#git_index_write_tree-5" + ], "init.c": [ - "ex/v0.99.0/init.html#git_index_write_tree-3" + "ex/HEAD/init.html#git_index_write_tree-3" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_index_write_tree-10" + "ex/HEAD/merge.html#git_index_write_tree-10" ] } }, @@ -8929,7 +9098,7 @@ { "name": "out", "type": "git_oid *", - "comment": "Pointer where to store OID of the the written tree" + "comment": "Pointer where to store OID of the written tree" }, { "name": "index", @@ -8975,10 +9144,10 @@ "group": "index", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_index_entrycount-36" + "ex/HEAD/general.html#git_index_entrycount-36" ], "ls-files.c": [ - "ex/v0.99.0/ls-files.html#git_index_entrycount-2" + "ex/HEAD/ls-files.html#git_index_entrycount-2" ] } }, @@ -9032,10 +9201,10 @@ "group": "index", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_index_get_byindex-37" + "ex/HEAD/general.html#git_index_get_byindex-37" ], "ls-files.c": [ - "ex/v0.99.0/ls-files.html#git_index_get_byindex-3" + "ex/HEAD/ls-files.html#git_index_get_byindex-3" ] } }, @@ -9072,7 +9241,7 @@ "group": "index", "examples": { "ls-files.c": [ - "ex/v0.99.0/ls-files.html#git_index_get_bypath-4" + "ex/HEAD/ls-files.html#git_index_get_bypath-4" ] } }, @@ -9317,8 +9486,8 @@ "git_index_add_from_buffer": { "type": "function", "file": "git2/index.h", - "line": 575, - "lineto": 578, + "line": 574, + "lineto": 577, "args": [ { "name": "index", @@ -9348,14 +9517,14 @@ "comment": " 0 or an error code" }, "description": "

Add or update an index entry from a buffer in memory

\n", - "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added. The id and the file_size of the 'entry' are updated with the real value of the blob.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", "group": "index" }, "git_index_remove_bypath": { "type": "function", "file": "git2/index.h", - "line": 594, - "lineto": 594, + "line": 593, + "lineto": 593, "args": [ { "name": "index", @@ -9381,8 +9550,8 @@ "git_index_add_all": { "type": "function", "file": "git2/index.h", - "line": 642, - "lineto": 647, + "line": 641, + "lineto": 646, "args": [ { "name": "index", @@ -9421,15 +9590,15 @@ "group": "index", "examples": { "add.c": [ - "ex/v0.99.0/add.html#git_index_add_all-3" + "ex/HEAD/add.html#git_index_add_all-3" ] } }, "git_index_remove_all": { "type": "function", "file": "git2/index.h", - "line": 664, - "lineto": 668, + "line": 663, + "lineto": 667, "args": [ { "name": "index", @@ -9465,8 +9634,8 @@ "git_index_update_all": { "type": "function", "file": "git2/index.h", - "line": 693, - "lineto": 697, + "line": 692, + "lineto": 696, "args": [ { "name": "index", @@ -9500,15 +9669,15 @@ "group": "index", "examples": { "add.c": [ - "ex/v0.99.0/add.html#git_index_update_all-4" + "ex/HEAD/add.html#git_index_update_all-4" ] } }, "git_index_find": { "type": "function", "file": "git2/index.h", - "line": 708, - "lineto": 708, + "line": 707, + "lineto": 707, "args": [ { "name": "at_pos", @@ -9539,8 +9708,8 @@ "git_index_find_prefix": { "type": "function", "file": "git2/index.h", - "line": 719, - "lineto": 719, + "line": 718, + "lineto": 718, "args": [ { "name": "at_pos", @@ -9571,8 +9740,8 @@ "git_index_conflict_add": { "type": "function", "file": "git2/index.h", - "line": 744, - "lineto": 748, + "line": 743, + "lineto": 747, "args": [ { "name": "index", @@ -9608,8 +9777,8 @@ "git_index_conflict_get": { "type": "function", "file": "git2/index.h", - "line": 764, - "lineto": 769, + "line": 763, + "lineto": 768, "args": [ { "name": "ancestor_out", @@ -9650,8 +9819,8 @@ "git_index_conflict_remove": { "type": "function", "file": "git2/index.h", - "line": 778, - "lineto": 778, + "line": 777, + "lineto": 777, "args": [ { "name": "index", @@ -9677,8 +9846,8 @@ "git_index_conflict_cleanup": { "type": "function", "file": "git2/index.h", - "line": 786, - "lineto": 786, + "line": 785, + "lineto": 785, "args": [ { "name": "index", @@ -9699,8 +9868,8 @@ "git_index_has_conflicts": { "type": "function", "file": "git2/index.h", - "line": 793, - "lineto": 793, + "line": 792, + "lineto": 792, "args": [ { "name": "index", @@ -9719,15 +9888,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_index_has_conflicts-11" + "ex/HEAD/merge.html#git_index_has_conflicts-11" ] } }, "git_index_conflict_iterator_new": { "type": "function", "file": "git2/index.h", - "line": 804, - "lineto": 806, + "line": 803, + "lineto": 805, "args": [ { "name": "iterator_out", @@ -9751,15 +9920,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_index_conflict_iterator_new-12" + "ex/HEAD/merge.html#git_index_conflict_iterator_new-12" ] } }, "git_index_conflict_next": { "type": "function", "file": "git2/index.h", - "line": 818, - "lineto": 822, + "line": 817, + "lineto": 821, "args": [ { "name": "ancestor_out", @@ -9793,15 +9962,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_index_conflict_next-13" + "ex/HEAD/merge.html#git_index_conflict_next-13" ] } }, "git_index_conflict_iterator_free": { "type": "function", "file": "git2/index.h", - "line": 829, - "lineto": 830, + "line": 828, + "lineto": 829, "args": [ { "name": "iterator", @@ -9820,7 +9989,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_index_conflict_iterator_free-14" + "ex/HEAD/merge.html#git_index_conflict_iterator_free-14" ] } }, @@ -10344,7 +10513,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_merge_analysis-15" + "ex/HEAD/merge.html#git_merge_analysis-15" ] } }, @@ -10433,10 +10602,10 @@ "group": "merge", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_merge_base-31" + "ex/HEAD/log.html#git_merge_base-31" ], "rev-parse.c": [ - "ex/v0.99.0/rev-parse.html#git_merge_base-1" + "ex/HEAD/rev-parse.html#git_merge_base-1" ] } }, @@ -10831,7 +11000,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_merge-16" + "ex/HEAD/merge.html#git_merge-16" ] } }, @@ -11528,10 +11697,10 @@ "group": "object", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_object_lookup-32" + "ex/HEAD/log.html#git_object_lookup-32" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_object_lookup-17" + "ex/HEAD/merge.html#git_object_lookup-17" ] } }, @@ -11637,27 +11806,27 @@ "group": "object", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_object_id-8", - "ex/v0.99.0/blame.html#git_object_id-9", - "ex/v0.99.0/blame.html#git_object_id-10", - "ex/v0.99.0/blame.html#git_object_id-11" + "ex/HEAD/blame.html#git_object_id-8", + "ex/HEAD/blame.html#git_object_id-9", + "ex/HEAD/blame.html#git_object_id-10", + "ex/HEAD/blame.html#git_object_id-11" ], "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_object_id-10", - "ex/v0.99.0/cat-file.html#git_object_id-11" + "ex/HEAD/cat-file.html#git_object_id-10", + "ex/HEAD/cat-file.html#git_object_id-11" ], "log.c": [ - "ex/v0.99.0/log.html#git_object_id-33", - "ex/v0.99.0/log.html#git_object_id-34", - "ex/v0.99.0/log.html#git_object_id-35", - "ex/v0.99.0/log.html#git_object_id-36" + "ex/HEAD/log.html#git_object_id-33", + "ex/HEAD/log.html#git_object_id-34", + "ex/HEAD/log.html#git_object_id-35", + "ex/HEAD/log.html#git_object_id-36" ], "rev-parse.c": [ - "ex/v0.99.0/rev-parse.html#git_object_id-2", - "ex/v0.99.0/rev-parse.html#git_object_id-3", - "ex/v0.99.0/rev-parse.html#git_object_id-4", - "ex/v0.99.0/rev-parse.html#git_object_id-5", - "ex/v0.99.0/rev-parse.html#git_object_id-6" + "ex/HEAD/rev-parse.html#git_object_id-2", + "ex/HEAD/rev-parse.html#git_object_id-3", + "ex/HEAD/rev-parse.html#git_object_id-4", + "ex/HEAD/rev-parse.html#git_object_id-5", + "ex/HEAD/rev-parse.html#git_object_id-6" ] } }, @@ -11689,7 +11858,7 @@ "group": "object", "examples": { "tag.c": [ - "ex/v0.99.0/tag.html#git_object_short_id-3" + "ex/HEAD/tag.html#git_object_short_id-3" ] } }, @@ -11716,12 +11885,12 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_object_type-12", - "ex/v0.99.0/cat-file.html#git_object_type-13", - "ex/v0.99.0/cat-file.html#git_object_type-14" + "ex/HEAD/cat-file.html#git_object_type-12", + "ex/HEAD/cat-file.html#git_object_type-13", + "ex/HEAD/cat-file.html#git_object_type-14" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_object_type-4" + "ex/HEAD/tag.html#git_object_type-4" ] } }, @@ -11770,33 +11939,33 @@ "group": "object", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_object_free-12", - "ex/v0.99.0/blame.html#git_object_free-13", - "ex/v0.99.0/blame.html#git_object_free-14", - "ex/v0.99.0/blame.html#git_object_free-15" + "ex/HEAD/blame.html#git_object_free-12", + "ex/HEAD/blame.html#git_object_free-13", + "ex/HEAD/blame.html#git_object_free-14", + "ex/HEAD/blame.html#git_object_free-15" ], "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_object_free-15" + "ex/HEAD/cat-file.html#git_object_free-15" ], "general.c": [ - "ex/v0.99.0/general.html#git_object_free-38" + "ex/HEAD/general.html#git_object_free-38" ], "log.c": [ - "ex/v0.99.0/log.html#git_object_free-37" + "ex/HEAD/log.html#git_object_free-37" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_object_free-18" + "ex/HEAD/merge.html#git_object_free-18" ], "rev-parse.c": [ - "ex/v0.99.0/rev-parse.html#git_object_free-7", - "ex/v0.99.0/rev-parse.html#git_object_free-8", - "ex/v0.99.0/rev-parse.html#git_object_free-9" + "ex/HEAD/rev-parse.html#git_object_free-7", + "ex/HEAD/rev-parse.html#git_object_free-8", + "ex/HEAD/rev-parse.html#git_object_free-9" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_object_free-5", - "ex/v0.99.0/tag.html#git_object_free-6", - "ex/v0.99.0/tag.html#git_object_free-7", - "ex/v0.99.0/tag.html#git_object_free-8" + "ex/HEAD/tag.html#git_object_free-5", + "ex/HEAD/tag.html#git_object_free-6", + "ex/HEAD/tag.html#git_object_free-7", + "ex/HEAD/tag.html#git_object_free-8" ] } }, @@ -11823,14 +11992,14 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_object_type2string-16", - "ex/v0.99.0/cat-file.html#git_object_type2string-17", - "ex/v0.99.0/cat-file.html#git_object_type2string-18", - "ex/v0.99.0/cat-file.html#git_object_type2string-19" + "ex/HEAD/cat-file.html#git_object_type2string-16", + "ex/HEAD/cat-file.html#git_object_type2string-17", + "ex/HEAD/cat-file.html#git_object_type2string-18", + "ex/HEAD/cat-file.html#git_object_type2string-19" ], "general.c": [ - "ex/v0.99.0/general.html#git_object_type2string-39", - "ex/v0.99.0/general.html#git_object_type2string-40" + "ex/HEAD/general.html#git_object_type2string-39", + "ex/HEAD/general.html#git_object_type2string-40" ] } }, @@ -12036,10 +12205,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_odb_free-20" + "ex/HEAD/cat-file.html#git_odb_free-20" ], "general.c": [ - "ex/v0.99.0/general.html#git_odb_free-41" + "ex/HEAD/general.html#git_odb_free-41" ] } }, @@ -12076,10 +12245,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_odb_read-21" + "ex/HEAD/cat-file.html#git_odb_read-21" ], "general.c": [ - "ex/v0.99.0/general.html#git_odb_read-42" + "ex/HEAD/general.html#git_odb_read-42" ] } }, @@ -12350,7 +12519,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_odb_write-43" + "ex/HEAD/general.html#git_odb_write-43" ] } }, @@ -12702,10 +12871,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_odb_object_free-22" + "ex/HEAD/cat-file.html#git_odb_object_free-22" ], "general.c": [ - "ex/v0.99.0/general.html#git_odb_object_free-44" + "ex/HEAD/general.html#git_odb_object_free-44" ] } }, @@ -12754,7 +12923,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_odb_object_data-45" + "ex/HEAD/general.html#git_odb_object_data-45" ] } }, @@ -12781,10 +12950,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_odb_object_size-23" + "ex/HEAD/cat-file.html#git_odb_object_size-23" ], "general.c": [ - "ex/v0.99.0/general.html#git_odb_object_size-46" + "ex/HEAD/general.html#git_odb_object_size-46" ] } }, @@ -12811,7 +12980,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_odb_object_type-47" + "ex/HEAD/general.html#git_odb_object_type-47" ] } }, @@ -13062,14 +13231,14 @@ "group": "oid", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_oid_fromstr-48", - "ex/v0.99.0/general.html#git_oid_fromstr-49", - "ex/v0.99.0/general.html#git_oid_fromstr-50", - "ex/v0.99.0/general.html#git_oid_fromstr-51", - "ex/v0.99.0/general.html#git_oid_fromstr-52", - "ex/v0.99.0/general.html#git_oid_fromstr-53", - "ex/v0.99.0/general.html#git_oid_fromstr-54", - "ex/v0.99.0/general.html#git_oid_fromstr-55" + "ex/HEAD/general.html#git_oid_fromstr-48", + "ex/HEAD/general.html#git_oid_fromstr-49", + "ex/HEAD/general.html#git_oid_fromstr-50", + "ex/HEAD/general.html#git_oid_fromstr-51", + "ex/HEAD/general.html#git_oid_fromstr-52", + "ex/HEAD/general.html#git_oid_fromstr-53", + "ex/HEAD/general.html#git_oid_fromstr-54", + "ex/HEAD/general.html#git_oid_fromstr-55" ] } }, @@ -13187,19 +13356,18 @@ "group": "oid", "examples": { "fetch.c": [ - "ex/v0.99.0/fetch.html#git_oid_fmt-1", - "ex/v0.99.0/fetch.html#git_oid_fmt-2" + "ex/HEAD/fetch.html#git_oid_fmt-1", + "ex/HEAD/fetch.html#git_oid_fmt-2" ], "general.c": [ - "ex/v0.99.0/general.html#git_oid_fmt-56", - "ex/v0.99.0/general.html#git_oid_fmt-57", - "ex/v0.99.0/general.html#git_oid_fmt-58", - "ex/v0.99.0/general.html#git_oid_fmt-59", - "ex/v0.99.0/general.html#git_oid_fmt-60", - "ex/v0.99.0/general.html#git_oid_fmt-61" + "ex/HEAD/general.html#git_oid_fmt-56", + "ex/HEAD/general.html#git_oid_fmt-57", + "ex/HEAD/general.html#git_oid_fmt-58", + "ex/HEAD/general.html#git_oid_fmt-59", + "ex/HEAD/general.html#git_oid_fmt-60" ], "ls-remote.c": [ - "ex/v0.99.0/ls-remote.html#git_oid_fmt-1" + "ex/HEAD/ls-remote.html#git_oid_fmt-1" ] } }, @@ -13285,8 +13453,8 @@ "group": "oid", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_oid_tostr_s-19", - "ex/v0.99.0/merge.html#git_oid_tostr_s-20" + "ex/HEAD/merge.html#git_oid_tostr_s-19", + "ex/HEAD/merge.html#git_oid_tostr_s-20" ] } }, @@ -13323,25 +13491,25 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_oid_tostr-16", - "ex/v0.99.0/blame.html#git_oid_tostr-17" + "ex/HEAD/blame.html#git_oid_tostr-16", + "ex/HEAD/blame.html#git_oid_tostr-17" ], "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_oid_tostr-24", - "ex/v0.99.0/cat-file.html#git_oid_tostr-25", - "ex/v0.99.0/cat-file.html#git_oid_tostr-26", - "ex/v0.99.0/cat-file.html#git_oid_tostr-27", - "ex/v0.99.0/cat-file.html#git_oid_tostr-28" + "ex/HEAD/cat-file.html#git_oid_tostr-24", + "ex/HEAD/cat-file.html#git_oid_tostr-25", + "ex/HEAD/cat-file.html#git_oid_tostr-26", + "ex/HEAD/cat-file.html#git_oid_tostr-27", + "ex/HEAD/cat-file.html#git_oid_tostr-28" ], "log.c": [ - "ex/v0.99.0/log.html#git_oid_tostr-38", - "ex/v0.99.0/log.html#git_oid_tostr-39" + "ex/HEAD/log.html#git_oid_tostr-38", + "ex/HEAD/log.html#git_oid_tostr-39" ], "rev-parse.c": [ - "ex/v0.99.0/rev-parse.html#git_oid_tostr-10", - "ex/v0.99.0/rev-parse.html#git_oid_tostr-11", - "ex/v0.99.0/rev-parse.html#git_oid_tostr-12", - "ex/v0.99.0/rev-parse.html#git_oid_tostr-13" + "ex/HEAD/rev-parse.html#git_oid_tostr-10", + "ex/HEAD/rev-parse.html#git_oid_tostr-11", + "ex/HEAD/rev-parse.html#git_oid_tostr-12", + "ex/HEAD/rev-parse.html#git_oid_tostr-13" ] } }, @@ -13373,9 +13541,9 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_oid_cpy-18", - "ex/v0.99.0/blame.html#git_oid_cpy-19", - "ex/v0.99.0/blame.html#git_oid_cpy-20" + "ex/HEAD/blame.html#git_oid_cpy-18", + "ex/HEAD/blame.html#git_oid_cpy-19", + "ex/HEAD/blame.html#git_oid_cpy-20" ] } }, @@ -13542,10 +13710,10 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_oid_is_zero-21" + "ex/HEAD/blame.html#git_oid_is_zero-21" ], "fetch.c": [ - "ex/v0.99.0/fetch.html#git_oid_is_zero-3" + "ex/HEAD/fetch.html#git_oid_is_zero-3" ] } }, @@ -13882,7 +14050,7 @@ { "name": "path", "type": "const char *", - "comment": "to the directory where the packfile and index should be stored" + "comment": "Path to the directory where the packfile and index should be stored, or NULL for default location" }, { "name": "mode", @@ -14062,11 +14230,33 @@ "comments": "", "group": "packbuilder" }, + "git_patch_owner": { + "type": "function", + "file": "git2/patch.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "the patch" + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repository" + }, + "description": "

Get the repository associated with this patch. May be NULL.

\n", + "comments": "", + "group": "patch" + }, "git_patch_from_diff": { "type": "function", "file": "git2/patch.h", - "line": 51, - "lineto": 52, + "line": 59, + "lineto": 60, "args": [ { "name": "out", @@ -14097,8 +14287,8 @@ "git_patch_from_blobs": { "type": "function", "file": "git2/patch.h", - "line": 70, - "lineto": 76, + "line": 78, + "lineto": 84, "args": [ { "name": "out", @@ -14144,8 +14334,8 @@ "git_patch_from_blob_and_buffer": { "type": "function", "file": "git2/patch.h", - "line": 95, - "lineto": 102, + "line": 103, + "lineto": 110, "args": [ { "name": "out", @@ -14196,8 +14386,8 @@ "git_patch_from_buffers": { "type": "function", "file": "git2/patch.h", - "line": 122, - "lineto": 130, + "line": 130, + "lineto": 138, "args": [ { "name": "out", @@ -14251,15 +14441,15 @@ "group": "patch", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_patch_from_buffers-15" + "ex/HEAD/diff.html#git_patch_from_buffers-15" ] } }, "git_patch_free": { "type": "function", "file": "git2/patch.h", - "line": 135, - "lineto": 135, + "line": 143, + "lineto": 143, "args": [ { "name": "patch", @@ -14278,15 +14468,15 @@ "group": "patch", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_patch_free-16" + "ex/HEAD/diff.html#git_patch_free-16" ] } }, "git_patch_get_delta": { "type": "function", "file": "git2/patch.h", - "line": 141, - "lineto": 141, + "line": 149, + "lineto": 149, "args": [ { "name": "patch", @@ -14307,8 +14497,8 @@ "git_patch_num_hunks": { "type": "function", "file": "git2/patch.h", - "line": 146, - "lineto": 146, + "line": 154, + "lineto": 154, "args": [ { "name": "patch", @@ -14329,8 +14519,8 @@ "git_patch_line_stats": { "type": "function", "file": "git2/patch.h", - "line": 164, - "lineto": 168, + "line": 172, + "lineto": 176, "args": [ { "name": "total_context", @@ -14366,8 +14556,8 @@ "git_patch_get_hunk": { "type": "function", "file": "git2/patch.h", - "line": 183, - "lineto": 187, + "line": 191, + "lineto": 195, "args": [ { "name": "out", @@ -14403,8 +14593,8 @@ "git_patch_num_lines_in_hunk": { "type": "function", "file": "git2/patch.h", - "line": 196, - "lineto": 198, + "line": 204, + "lineto": 206, "args": [ { "name": "patch", @@ -14430,8 +14620,8 @@ "git_patch_get_line_in_hunk": { "type": "function", "file": "git2/patch.h", - "line": 214, - "lineto": 218, + "line": 222, + "lineto": 226, "args": [ { "name": "out", @@ -14467,8 +14657,8 @@ "git_patch_size": { "type": "function", "file": "git2/patch.h", - "line": 236, - "lineto": 240, + "line": 244, + "lineto": 248, "args": [ { "name": "patch", @@ -14504,8 +14694,8 @@ "git_patch_print": { "type": "function", "file": "git2/patch.h", - "line": 254, - "lineto": 257, + "line": 262, + "lineto": 265, "args": [ { "name": "patch", @@ -14536,8 +14726,8 @@ "git_patch_to_buf": { "type": "function", "file": "git2/patch.h", - "line": 266, - "lineto": 268, + "line": 274, + "lineto": 276, "args": [ { "name": "out", @@ -14561,7 +14751,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/v0.99.0/diff.html#git_patch_to_buf-17" + "ex/HEAD/diff.html#git_patch_to_buf-17" ] } }, @@ -14593,7 +14783,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_pathspec_new-40" + "ex/HEAD/log.html#git_pathspec_new-40" ] } }, @@ -14620,7 +14810,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_pathspec_free-41" + "ex/HEAD/log.html#git_pathspec_free-41" ] } }, @@ -14768,7 +14958,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_pathspec_match_tree-42" + "ex/HEAD/log.html#git_pathspec_match_tree-42" ] } }, @@ -15892,14 +16082,14 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_reference_lookup-15", - "ex/v0.99.0/checkout.html#git_reference_lookup-16" + "ex/HEAD/checkout.html#git_reference_lookup-15", + "ex/HEAD/checkout.html#git_reference_lookup-16" ], "general.c": [ - "ex/v0.99.0/general.html#git_reference_lookup-62" + "ex/HEAD/general.html#git_reference_lookup-61" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_lookup-21" + "ex/HEAD/merge.html#git_reference_lookup-21" ] } }, @@ -15968,7 +16158,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_dwim-22" + "ex/HEAD/merge.html#git_reference_dwim-22" ] } }, @@ -16115,11 +16305,11 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new direct reference.

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", "group": "reference", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_create-23" + "ex/HEAD/merge.html#git_reference_create-23" ] } }, @@ -16172,7 +16362,7 @@ "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" }, "description": "

Conditionally create new direct reference

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", "group": "reference" }, "git_reference_target": { @@ -16198,7 +16388,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_reference_target-63" + "ex/HEAD/general.html#git_reference_target-62" ] } }, @@ -16247,10 +16437,10 @@ "group": "reference", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_reference_symbolic_target-64" + "ex/HEAD/general.html#git_reference_symbolic_target-63" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_symbolic_target-24" + "ex/HEAD/merge.html#git_reference_symbolic_target-24" ] } }, @@ -16277,7 +16467,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_reference_type-65" + "ex/HEAD/general.html#git_reference_type-64" ] } }, @@ -16304,10 +16494,10 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_reference_name-17" + "ex/HEAD/checkout.html#git_reference_name-17" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_name-25" + "ex/HEAD/merge.html#git_reference_name-25" ] } }, @@ -16394,7 +16584,7 @@ "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" }, "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", - "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and and it does not have a reflog.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", "group": "reference" }, "git_reference_set_target": { @@ -16435,7 +16625,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_set_target-26" + "ex/HEAD/merge.html#git_reference_set_target-26" ] } }, @@ -16558,7 +16748,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_reference_list-66" + "ex/HEAD/general.html#git_reference_list-65" ] } }, @@ -16676,20 +16866,20 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_reference_free-18", - "ex/v0.99.0/checkout.html#git_reference_free-19", - "ex/v0.99.0/checkout.html#git_reference_free-20" + "ex/HEAD/checkout.html#git_reference_free-18", + "ex/HEAD/checkout.html#git_reference_free-19", + "ex/HEAD/checkout.html#git_reference_free-20" ], "general.c": [ - "ex/v0.99.0/general.html#git_reference_free-67" + "ex/HEAD/general.html#git_reference_free-66" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_free-27", - "ex/v0.99.0/merge.html#git_reference_free-28", - "ex/v0.99.0/merge.html#git_reference_free-29" + "ex/HEAD/merge.html#git_reference_free-27", + "ex/HEAD/merge.html#git_reference_free-28", + "ex/HEAD/merge.html#git_reference_free-29" ], "status.c": [ - "ex/v0.99.0/status.html#git_reference_free-1" + "ex/HEAD/status.html#git_reference_free-1" ] } }, @@ -16991,7 +17181,7 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_reference_is_remote-21" + "ex/HEAD/checkout.html#git_reference_is_remote-21" ] } }, @@ -17109,27 +17299,32 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_reference_peel-30" + "ex/HEAD/merge.html#git_reference_peel-30" ] } }, - "git_reference_is_valid_name": { + "git_reference_name_is_valid": { "type": "function", "file": "git2/refs.h", - "line": 749, - "lineto": 749, + "line": 750, + "lineto": 750, "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given reference name" + }, { "name": "refname", "type": "const char *", "comment": "name to be checked." } ], - "argline": "const char *refname", - "sig": "const char *", + "argline": "int *valid, const char *refname", + "sig": "int *::const char *", "return": { "type": "int", - "comment": " 1 if the reference name is acceptable; 0 if it isn't" + "comment": " 0 on success or an error code" }, "description": "

Ensure the reference name is well-formed.

\n", "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", @@ -17138,8 +17333,8 @@ "git_reference_shorthand": { "type": "function", "file": "git2/refs.h", - "line": 763, - "lineto": 763, + "line": 764, + "lineto": 764, "args": [ { "name": "ref", @@ -17158,7 +17353,7 @@ "group": "reference", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_reference_shorthand-2" + "ex/HEAD/status.html#git_reference_shorthand-2" ] } }, @@ -17482,7 +17677,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_create-1" + "ex/HEAD/remote.html#git_remote_create-1" ] } }, @@ -17620,10 +17815,10 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v0.99.0/fetch.html#git_remote_create_anonymous-4" + "ex/HEAD/fetch.html#git_remote_create_anonymous-4" ], "ls-remote.c": [ - "ex/v0.99.0/ls-remote.html#git_remote_create_anonymous-2" + "ex/HEAD/ls-remote.html#git_remote_create_anonymous-2" ] } }, @@ -17687,13 +17882,16 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v0.99.0/fetch.html#git_remote_lookup-5" + "ex/HEAD/fetch.html#git_remote_lookup-5" ], "ls-remote.c": [ - "ex/v0.99.0/ls-remote.html#git_remote_lookup-3" + "ex/HEAD/ls-remote.html#git_remote_lookup-3" + ], + "push.c": [ + "ex/HEAD/push.html#git_remote_lookup-1" ], "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_lookup-2" + "ex/HEAD/remote.html#git_remote_lookup-2" ] } }, @@ -17791,7 +17989,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_url-3" + "ex/HEAD/remote.html#git_remote_url-3" ] } }, @@ -17818,7 +18016,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_pushurl-4" + "ex/HEAD/remote.html#git_remote_pushurl-4" ] } }, @@ -17855,7 +18053,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_set_url-5" + "ex/HEAD/remote.html#git_remote_set_url-5" ] } }, @@ -17892,7 +18090,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_set_pushurl-6" + "ex/HEAD/remote.html#git_remote_set_pushurl-6" ] } }, @@ -18106,7 +18304,7 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/v0.99.0/ls-remote.html#git_remote_connect-4" + "ex/HEAD/ls-remote.html#git_remote_connect-4" ] } }, @@ -18143,7 +18341,7 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/v0.99.0/ls-remote.html#git_remote_ls-5" + "ex/HEAD/ls-remote.html#git_remote_ls-5" ] } }, @@ -18236,14 +18434,14 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v0.99.0/fetch.html#git_remote_free-6", - "ex/v0.99.0/fetch.html#git_remote_free-7" + "ex/HEAD/fetch.html#git_remote_free-6", + "ex/HEAD/fetch.html#git_remote_free-7" ], "ls-remote.c": [ - "ex/v0.99.0/ls-remote.html#git_remote_free-6" + "ex/HEAD/ls-remote.html#git_remote_free-6" ], "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_free-7" + "ex/HEAD/remote.html#git_remote_free-7" ] } }, @@ -18275,10 +18473,10 @@ "group": "remote", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_remote_list-22" + "ex/HEAD/checkout.html#git_remote_list-22" ], "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_list-8" + "ex/HEAD/remote.html#git_remote_list-8" ] } }, @@ -18361,7 +18559,12 @@ }, "description": "

Initialize git_push_options structure

\n", "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", - "group": "push" + "group": "push", + "examples": { + "push.c": [ + "ex/HEAD/push.html#git_push_options_init-2" + ] + } }, "git_remote_download": { "type": "function", @@ -18507,7 +18710,7 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v0.99.0/fetch.html#git_remote_fetch-8" + "ex/HEAD/fetch.html#git_remote_fetch-8" ] } }, @@ -18568,7 +18771,12 @@ }, "description": "

Perform a push

\n", "comments": "

Peform all the steps from a push.

\n", - "group": "remote" + "group": "remote", + "examples": { + "push.c": [ + "ex/HEAD/push.html#git_remote_push-3" + ] + } }, "git_remote_stats": { "type": "function", @@ -18593,7 +18801,7 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v0.99.0/fetch.html#git_remote_stats-9" + "ex/HEAD/fetch.html#git_remote_stats-9" ] } }, @@ -18711,27 +18919,32 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_rename-9" + "ex/HEAD/remote.html#git_remote_rename-9" ] } }, - "git_remote_is_valid_name": { + "git_remote_name_is_valid": { "type": "function", "file": "git2/remote.h", - "line": 921, - "lineto": 921, + "line": 922, + "lineto": 922, "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given remote name" + }, { "name": "remote_name", "type": "const char *", "comment": "name to be checked." } ], - "argline": "const char *remote_name", - "sig": "const char *", + "argline": "int *valid, const char *remote_name", + "sig": "int *::const char *", "return": { "type": "int", - "comment": " 1 if the reference name is acceptable; 0 if it isn't" + "comment": " 0 on success or an error code" }, "description": "

Ensure the remote name is well-formed.

\n", "comments": "", @@ -18740,8 +18953,8 @@ "git_remote_delete": { "type": "function", "file": "git2/remote.h", - "line": 933, - "lineto": 933, + "line": 934, + "lineto": 934, "args": [ { "name": "repo", @@ -18765,15 +18978,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v0.99.0/remote.html#git_remote_delete-10" + "ex/HEAD/remote.html#git_remote_delete-10" ] } }, "git_remote_default_branch": { "type": "function", "file": "git2/remote.h", - "line": 951, - "lineto": 951, + "line": 952, + "lineto": 952, "args": [ { "name": "out", @@ -18824,7 +19037,7 @@ "group": "repository", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_repository_open-68" + "ex/HEAD/general.html#git_repository_open-67" ] } }, @@ -18957,7 +19170,7 @@ "group": "repository", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_repository_open_ext-43" + "ex/HEAD/log.html#git_repository_open_ext-43" ] } }, @@ -19011,10 +19224,10 @@ "group": "repository", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_repository_free-69" + "ex/HEAD/general.html#git_repository_free-68" ], "init.c": [ - "ex/v0.99.0/init.html#git_repository_free-4" + "ex/HEAD/init.html#git_repository_free-4" ] } }, @@ -19051,15 +19264,15 @@ "group": "repository", "examples": { "init.c": [ - "ex/v0.99.0/init.html#git_repository_init-5" + "ex/HEAD/init.html#git_repository_init-5" ] } }, "git_repository_init_options_init": { "type": "function", "file": "git2/repository.h", - "line": 326, - "lineto": 328, + "line": 369, + "lineto": 371, "args": [ { "name": "opts", @@ -19085,8 +19298,8 @@ "git_repository_init_ext": { "type": "function", "file": "git2/repository.h", - "line": 343, - "lineto": 346, + "line": 386, + "lineto": 389, "args": [ { "name": "out", @@ -19115,15 +19328,15 @@ "group": "repository", "examples": { "init.c": [ - "ex/v0.99.0/init.html#git_repository_init_ext-6" + "ex/HEAD/init.html#git_repository_init_ext-6" ] } }, "git_repository_head": { "type": "function", "file": "git2/repository.h", - "line": 361, - "lineto": 361, + "line": 404, + "lineto": 404, "args": [ { "name": "out", @@ -19147,19 +19360,19 @@ "group": "repository", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_repository_head-31", - "ex/v0.99.0/merge.html#git_repository_head-32" + "ex/HEAD/merge.html#git_repository_head-31", + "ex/HEAD/merge.html#git_repository_head-32" ], "status.c": [ - "ex/v0.99.0/status.html#git_repository_head-3" + "ex/HEAD/status.html#git_repository_head-3" ] } }, "git_repository_head_for_worktree": { "type": "function", "file": "git2/repository.h", - "line": 371, - "lineto": 372, + "line": 414, + "lineto": 415, "args": [ { "name": "out", @@ -19190,8 +19403,8 @@ "git_repository_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 384, - "lineto": 384, + "line": 427, + "lineto": 427, "args": [ { "name": "repo", @@ -19212,8 +19425,8 @@ "git_repository_head_detached_for_worktree": { "type": "function", "file": "git2/repository.h", - "line": 397, - "lineto": 398, + "line": 440, + "lineto": 441, "args": [ { "name": "repo", @@ -19239,8 +19452,8 @@ "git_repository_head_unborn": { "type": "function", "file": "git2/repository.h", - "line": 410, - "lineto": 410, + "line": 453, + "lineto": 453, "args": [ { "name": "repo", @@ -19261,8 +19474,8 @@ "git_repository_is_empty": { "type": "function", "file": "git2/repository.h", - "line": 422, - "lineto": 422, + "line": 465, + "lineto": 465, "args": [ { "name": "repo", @@ -19283,8 +19496,8 @@ "git_repository_item_path": { "type": "function", "file": "git2/repository.h", - "line": 459, - "lineto": 459, + "line": 502, + "lineto": 502, "args": [ { "name": "out", @@ -19315,8 +19528,8 @@ "git_repository_path": { "type": "function", "file": "git2/repository.h", - "line": 470, - "lineto": 470, + "line": 513, + "lineto": 513, "args": [ { "name": "repo", @@ -19335,18 +19548,18 @@ "group": "repository", "examples": { "init.c": [ - "ex/v0.99.0/init.html#git_repository_path-7" + "ex/HEAD/init.html#git_repository_path-7" ], "status.c": [ - "ex/v0.99.0/status.html#git_repository_path-4" + "ex/HEAD/status.html#git_repository_path-4" ] } }, "git_repository_workdir": { "type": "function", "file": "git2/repository.h", - "line": 481, - "lineto": 481, + "line": 524, + "lineto": 524, "args": [ { "name": "repo", @@ -19365,15 +19578,15 @@ "group": "repository", "examples": { "init.c": [ - "ex/v0.99.0/init.html#git_repository_workdir-8" + "ex/HEAD/init.html#git_repository_workdir-8" ] } }, "git_repository_commondir": { "type": "function", "file": "git2/repository.h", - "line": 492, - "lineto": 492, + "line": 536, + "lineto": 536, "args": [ { "name": "repo", @@ -19387,15 +19600,15 @@ "type": "const char *", "comment": " the path to the common dir" }, - "description": "

Get the path of the shared common directory for this repository

\n", - "comments": "

If the repository is bare is not a worktree, the git directory path is returned.

\n", + "description": "

Get the path of the shared common directory for this repository.

\n", + "comments": "

If the repository is bare, it is the root directory for the repository. If the repository is a worktree, it is the parent repo's gitdir. Otherwise, it is the gitdir.

\n", "group": "repository" }, "git_repository_set_workdir": { "type": "function", "file": "git2/repository.h", - "line": 511, - "lineto": 512, + "line": 555, + "lineto": 556, "args": [ { "name": "repo", @@ -19426,8 +19639,8 @@ "git_repository_is_bare": { "type": "function", "file": "git2/repository.h", - "line": 520, - "lineto": 520, + "line": 564, + "lineto": 564, "args": [ { "name": "repo", @@ -19446,15 +19659,15 @@ "group": "repository", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_repository_is_bare-5" + "ex/HEAD/status.html#git_repository_is_bare-5" ] } }, "git_repository_is_worktree": { "type": "function", "file": "git2/repository.h", - "line": 528, - "lineto": 528, + "line": 572, + "lineto": 572, "args": [ { "name": "repo", @@ -19475,8 +19688,8 @@ "git_repository_config": { "type": "function", "file": "git2/repository.h", - "line": 544, - "lineto": 544, + "line": 588, + "lineto": 588, "args": [ { "name": "out", @@ -19502,8 +19715,8 @@ "git_repository_config_snapshot": { "type": "function", "file": "git2/repository.h", - "line": 560, - "lineto": 560, + "line": 604, + "lineto": 604, "args": [ { "name": "out", @@ -19527,16 +19740,16 @@ "group": "repository", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_repository_config_snapshot-70", - "ex/v0.99.0/general.html#git_repository_config_snapshot-71" + "ex/HEAD/general.html#git_repository_config_snapshot-69", + "ex/HEAD/general.html#git_repository_config_snapshot-70" ] } }, "git_repository_odb": { "type": "function", "file": "git2/repository.h", - "line": 576, - "lineto": 576, + "line": 620, + "lineto": 620, "args": [ { "name": "out", @@ -19560,18 +19773,18 @@ "group": "repository", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_repository_odb-29" + "ex/HEAD/cat-file.html#git_repository_odb-29" ], "general.c": [ - "ex/v0.99.0/general.html#git_repository_odb-72" + "ex/HEAD/general.html#git_repository_odb-71" ] } }, "git_repository_refdb": { "type": "function", "file": "git2/repository.h", - "line": 592, - "lineto": 592, + "line": 636, + "lineto": 636, "args": [ { "name": "out", @@ -19597,8 +19810,8 @@ "git_repository_index": { "type": "function", "file": "git2/repository.h", - "line": 608, - "lineto": 608, + "line": 652, + "lineto": 652, "args": [ { "name": "out", @@ -19622,27 +19835,30 @@ "group": "repository", "examples": { "add.c": [ - "ex/v0.99.0/add.html#git_repository_index-5" + "ex/HEAD/add.html#git_repository_index-5" + ], + "commit.c": [ + "ex/HEAD/commit.html#git_repository_index-6" ], "general.c": [ - "ex/v0.99.0/general.html#git_repository_index-73" + "ex/HEAD/general.html#git_repository_index-72" ], "init.c": [ - "ex/v0.99.0/init.html#git_repository_index-9" + "ex/HEAD/init.html#git_repository_index-9" ], "ls-files.c": [ - "ex/v0.99.0/ls-files.html#git_repository_index-5" + "ex/HEAD/ls-files.html#git_repository_index-5" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_repository_index-33" + "ex/HEAD/merge.html#git_repository_index-33" ] } }, "git_repository_message": { "type": "function", "file": "git2/repository.h", - "line": 626, - "lineto": 626, + "line": 670, + "lineto": 670, "args": [ { "name": "out", @@ -19668,8 +19884,8 @@ "git_repository_message_remove": { "type": "function", "file": "git2/repository.h", - "line": 633, - "lineto": 633, + "line": 677, + "lineto": 677, "args": [ { "name": "repo", @@ -19690,8 +19906,8 @@ "git_repository_state_cleanup": { "type": "function", "file": "git2/repository.h", - "line": 642, - "lineto": 642, + "line": 686, + "lineto": 686, "args": [ { "name": "repo", @@ -19710,15 +19926,15 @@ "group": "repository", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_repository_state_cleanup-34" + "ex/HEAD/merge.html#git_repository_state_cleanup-34" ] } }, "git_repository_fetchhead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 673, - "lineto": 676, + "line": 717, + "lineto": 720, "args": [ { "name": "repo", @@ -19749,8 +19965,8 @@ "git_repository_mergehead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 702, - "lineto": 705, + "line": 746, + "lineto": 749, "args": [ { "name": "repo", @@ -19781,8 +19997,8 @@ "git_repository_hashfile": { "type": "function", "file": "git2/repository.h", - "line": 730, - "lineto": 735, + "line": 774, + "lineto": 779, "args": [ { "name": "out", @@ -19823,8 +20039,8 @@ "git_repository_set_head": { "type": "function", "file": "git2/repository.h", - "line": 755, - "lineto": 757, + "line": 799, + "lineto": 801, "args": [ { "name": "repo", @@ -19848,15 +20064,15 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_repository_set_head-23" + "ex/HEAD/checkout.html#git_repository_set_head-23" ] } }, "git_repository_set_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 775, - "lineto": 777, + "line": 819, + "lineto": 821, "args": [ { "name": "repo", @@ -19882,8 +20098,8 @@ "git_repository_set_head_detached_from_annotated": { "type": "function", "file": "git2/repository.h", - "line": 791, - "lineto": 793, + "line": 835, + "lineto": 837, "args": [ { "name": "repo", @@ -19907,15 +20123,15 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_repository_set_head_detached_from_annotated-24" + "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-24" ] } }, "git_repository_detach_head": { "type": "function", "file": "git2/repository.h", - "line": 812, - "lineto": 813, + "line": 856, + "lineto": 857, "args": [ { "name": "repo", @@ -19936,8 +20152,8 @@ "git_repository_state": { "type": "function", "file": "git2/repository.h", - "line": 843, - "lineto": 843, + "line": 887, + "lineto": 887, "args": [ { "name": "repo", @@ -19956,18 +20172,18 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_repository_state-25" + "ex/HEAD/checkout.html#git_repository_state-25" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_repository_state-35" + "ex/HEAD/merge.html#git_repository_state-35" ] } }, "git_repository_set_namespace": { "type": "function", "file": "git2/repository.h", - "line": 857, - "lineto": 857, + "line": 901, + "lineto": 901, "args": [ { "name": "repo", @@ -19993,8 +20209,8 @@ "git_repository_get_namespace": { "type": "function", "file": "git2/repository.h", - "line": 865, - "lineto": 865, + "line": 909, + "lineto": 909, "args": [ { "name": "repo", @@ -20015,8 +20231,8 @@ "git_repository_is_shallow": { "type": "function", "file": "git2/repository.h", - "line": 874, - "lineto": 874, + "line": 918, + "lineto": 918, "args": [ { "name": "repo", @@ -20037,8 +20253,8 @@ "git_repository_ident": { "type": "function", "file": "git2/repository.h", - "line": 886, - "lineto": 886, + "line": 930, + "lineto": 930, "args": [ { "name": "name", @@ -20069,8 +20285,8 @@ "git_repository_set_ident": { "type": "function", "file": "git2/repository.h", - "line": 899, - "lineto": 899, + "line": 943, + "lineto": 943, "args": [ { "name": "repo", @@ -20343,22 +20559,22 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_revparse_single-22" + "ex/HEAD/blame.html#git_revparse_single-22" ], "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_revparse_single-30" + "ex/HEAD/cat-file.html#git_revparse_single-30" ], "describe.c": [ - "ex/v0.99.0/describe.html#git_revparse_single-6" + "ex/HEAD/describe.html#git_revparse_single-6" ], "log.c": [ - "ex/v0.99.0/log.html#git_revparse_single-44" + "ex/HEAD/log.html#git_revparse_single-44" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_revparse_single-9", - "ex/v0.99.0/tag.html#git_revparse_single-10", - "ex/v0.99.0/tag.html#git_revparse_single-11", - "ex/v0.99.0/tag.html#git_revparse_single-12" + "ex/HEAD/tag.html#git_revparse_single-9", + "ex/HEAD/tag.html#git_revparse_single-10", + "ex/HEAD/tag.html#git_revparse_single-11", + "ex/HEAD/tag.html#git_revparse_single-12" ] } }, @@ -20397,7 +20613,12 @@ }, "description": "

Find a single object and intermediate reference by a revision string.

\n", "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", - "group": "revparse" + "group": "revparse", + "examples": { + "commit.c": [ + "ex/HEAD/commit.html#git_revparse_ext-7" + ] + } }, "git_revparse": { "type": "function", @@ -20432,14 +20653,14 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/v0.99.0/blame.html#git_revparse-23" + "ex/HEAD/blame.html#git_revparse-23" ], "log.c": [ - "ex/v0.99.0/log.html#git_revparse-45" + "ex/HEAD/log.html#git_revparse-45" ], "rev-parse.c": [ - "ex/v0.99.0/rev-parse.html#git_revparse-14", - "ex/v0.99.0/rev-parse.html#git_revparse-15" + "ex/HEAD/rev-parse.html#git_revparse-14", + "ex/HEAD/rev-parse.html#git_revparse-15" ] } }, @@ -20471,11 +20692,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_revwalk_new-74" + "ex/HEAD/general.html#git_revwalk_new-73" ], "log.c": [ - "ex/v0.99.0/log.html#git_revwalk_new-46", - "ex/v0.99.0/log.html#git_revwalk_new-47" + "ex/HEAD/log.html#git_revwalk_new-46", + "ex/HEAD/log.html#git_revwalk_new-47" ] } }, @@ -20529,10 +20750,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_revwalk_push-75" + "ex/HEAD/general.html#git_revwalk_push-74" ], "log.c": [ - "ex/v0.99.0/log.html#git_revwalk_push-48" + "ex/HEAD/log.html#git_revwalk_push-48" ] } }, @@ -20586,7 +20807,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_revwalk_push_head-49" + "ex/HEAD/log.html#git_revwalk_push_head-49" ] } }, @@ -20618,7 +20839,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/v0.99.0/log.html#git_revwalk_hide-50" + "ex/HEAD/log.html#git_revwalk_hide-50" ] } }, @@ -20753,10 +20974,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_revwalk_next-76" + "ex/HEAD/general.html#git_revwalk_next-75" ], "log.c": [ - "ex/v0.99.0/log.html#git_revwalk_next-51" + "ex/HEAD/log.html#git_revwalk_next-51" ] } }, @@ -20788,11 +21009,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_revwalk_sorting-77" + "ex/HEAD/general.html#git_revwalk_sorting-76" ], "log.c": [ - "ex/v0.99.0/log.html#git_revwalk_sorting-52", - "ex/v0.99.0/log.html#git_revwalk_sorting-53" + "ex/HEAD/log.html#git_revwalk_sorting-52", + "ex/HEAD/log.html#git_revwalk_sorting-53" ] } }, @@ -20868,10 +21089,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_revwalk_free-78" + "ex/HEAD/general.html#git_revwalk_free-77" ], "log.c": [ - "ex/v0.99.0/log.html#git_revwalk_free-54" + "ex/HEAD/log.html#git_revwalk_free-54" ] } }, @@ -20972,8 +21193,8 @@ "group": "signature", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_signature_new-79", - "ex/v0.99.0/general.html#git_signature_new-80" + "ex/HEAD/general.html#git_signature_new-78", + "ex/HEAD/general.html#git_signature_new-79" ] } }, @@ -21010,7 +21231,7 @@ "group": "signature", "examples": { "merge.c": [ - "ex/v0.99.0/merge.html#git_signature_now-36" + "ex/HEAD/merge.html#git_signature_now-36" ] } }, @@ -21041,11 +21262,14 @@ "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", "group": "signature", "examples": { + "commit.c": [ + "ex/HEAD/commit.html#git_signature_default-8" + ], "init.c": [ - "ex/v0.99.0/init.html#git_signature_default-10" + "ex/HEAD/init.html#git_signature_default-10" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_signature_default-13" + "ex/HEAD/tag.html#git_signature_default-13" ] } }, @@ -21125,15 +21349,18 @@ "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", "group": "signature", "examples": { + "commit.c": [ + "ex/HEAD/commit.html#git_signature_free-9" + ], "general.c": [ - "ex/v0.99.0/general.html#git_signature_free-81", - "ex/v0.99.0/general.html#git_signature_free-82" + "ex/HEAD/general.html#git_signature_free-80", + "ex/HEAD/general.html#git_signature_free-81" ], "init.c": [ - "ex/v0.99.0/init.html#git_signature_free-11" + "ex/HEAD/init.html#git_signature_free-11" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_signature_free-14" + "ex/HEAD/tag.html#git_signature_free-14" ] } }, @@ -21389,7 +21616,7 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_status_foreach-6" + "ex/HEAD/status.html#git_status_foreach-6" ] } }, @@ -21431,7 +21658,7 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_status_foreach_ext-7" + "ex/HEAD/status.html#git_status_foreach_ext-7" ] } }, @@ -21468,7 +21695,7 @@ "group": "status", "examples": { "add.c": [ - "ex/v0.99.0/add.html#git_status_file-6" + "ex/HEAD/add.html#git_status_file-6" ] } }, @@ -21505,8 +21732,8 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_status_list_new-8", - "ex/v0.99.0/status.html#git_status_list_new-9" + "ex/HEAD/status.html#git_status_list_new-8", + "ex/HEAD/status.html#git_status_list_new-9" ] } }, @@ -21533,8 +21760,8 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_status_list_entrycount-10", - "ex/v0.99.0/status.html#git_status_list_entrycount-11" + "ex/HEAD/status.html#git_status_list_entrycount-10", + "ex/HEAD/status.html#git_status_list_entrycount-11" ] } }, @@ -21566,12 +21793,12 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_status_byindex-12", - "ex/v0.99.0/status.html#git_status_byindex-13", - "ex/v0.99.0/status.html#git_status_byindex-14", - "ex/v0.99.0/status.html#git_status_byindex-15", - "ex/v0.99.0/status.html#git_status_byindex-16", - "ex/v0.99.0/status.html#git_status_byindex-17" + "ex/HEAD/status.html#git_status_byindex-12", + "ex/HEAD/status.html#git_status_byindex-13", + "ex/HEAD/status.html#git_status_byindex-14", + "ex/HEAD/status.html#git_status_byindex-15", + "ex/HEAD/status.html#git_status_byindex-16", + "ex/HEAD/status.html#git_status_byindex-17" ] } }, @@ -21598,7 +21825,7 @@ "group": "status", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_status_list_free-18" + "ex/HEAD/status.html#git_status_list_free-18" ] } }, @@ -21634,16 +21861,16 @@ "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", "group": "status" }, - "git_strarray_free": { + "git_strarray_dispose": { "type": "function", "file": "git2/strarray.h", - "line": 41, - "lineto": 41, + "line": 37, + "lineto": 37, "args": [ { "name": "array", "type": "git_strarray *", - "comment": "git_strarray from which to free string data" + "comment": "The git_strarray that contains strings to free" } ], "argline": "git_strarray *array", @@ -21652,52 +21879,25 @@ "type": "void", "comment": null }, - "description": "

Close a string array object

\n", - "comments": "

This method should be called on git_strarray objects where the strings array is allocated and contains allocated strings, such as what you would get from git_strarray_copy(). Not doing so, will result in a memory leak.

\n\n

This does not free the git_strarray itself, since the library will never allocate that object directly itself (it is more commonly embedded inside another struct or created on the stack).

\n", + "description": "

Free the strings contained in a string array. This method should\n be called on git_strarray objects that were provided by the\n library. Not doing so, will result in a memory leak.

\n", + "comments": "

This does not free the git_strarray itself, since the library will never allocate that object directly itself.

\n", "group": "strarray", "examples": { "checkout.c": [ - "ex/v0.99.0/checkout.html#git_strarray_free-26" + "ex/HEAD/checkout.html#git_strarray_dispose-26" ], "general.c": [ - "ex/v0.99.0/general.html#git_strarray_free-83" + "ex/HEAD/general.html#git_strarray_dispose-82" ], "remote.c": [ - "ex/v0.99.0/remote.html#git_strarray_free-11", - "ex/v0.99.0/remote.html#git_strarray_free-12" + "ex/HEAD/remote.html#git_strarray_dispose-11", + "ex/HEAD/remote.html#git_strarray_dispose-12" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_strarray_free-15" + "ex/HEAD/tag.html#git_strarray_dispose-15" ] } }, - "git_strarray_copy": { - "type": "function", - "file": "git2/strarray.h", - "line": 53, - "lineto": 53, - "args": [ - { - "name": "tgt", - "type": "git_strarray *", - "comment": "target" - }, - { - "name": "src", - "type": "const git_strarray *", - "comment": "source" - } - ], - "argline": "git_strarray *tgt, const git_strarray *src", - "sig": "git_strarray *::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n 0 on allocation failure" - }, - "description": "

Copy a string array object from source to target.

\n", - "comments": "

Note: target is overwritten and hence should be empty, otherwise its contents are leaked. Call git_strarray_free() if necessary.

\n", - "group": "strarray" - }, "git_submodule_update_options_init": { "type": "function", "file": "git2/submodule.h", @@ -21844,7 +22044,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_submodule_foreach-19" + "ex/HEAD/status.html#git_submodule_foreach-19" ] } }, @@ -22016,7 +22216,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_submodule_name-20" + "ex/HEAD/status.html#git_submodule_name-20" ] } }, @@ -22043,7 +22243,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_submodule_path-21" + "ex/HEAD/status.html#git_submodule_path-21" ] } }, @@ -22588,7 +22788,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v0.99.0/status.html#git_submodule_status-22" + "ex/HEAD/status.html#git_submodule_status-22" ] } }, @@ -22652,7 +22852,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_tag_lookup-84" + "ex/HEAD/general.html#git_tag_lookup-83" ] } }, @@ -22716,7 +22916,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_tag_free-85" + "ex/HEAD/general.html#git_tag_free-84" ] } }, @@ -22792,7 +22992,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_tag_target-86" + "ex/HEAD/general.html#git_tag_target-85" ] } }, @@ -22819,7 +23019,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tag_target_id-31" + "ex/HEAD/cat-file.html#git_tag_target_id-31" ] } }, @@ -22846,10 +23046,10 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tag_target_type-32" + "ex/HEAD/cat-file.html#git_tag_target_type-32" ], "general.c": [ - "ex/v0.99.0/general.html#git_tag_target_type-87" + "ex/HEAD/general.html#git_tag_target_type-86" ] } }, @@ -22876,13 +23076,13 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tag_name-33" + "ex/HEAD/cat-file.html#git_tag_name-33" ], "general.c": [ - "ex/v0.99.0/general.html#git_tag_name-88" + "ex/HEAD/general.html#git_tag_name-87" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_tag_name-16" + "ex/HEAD/tag.html#git_tag_name-16" ] } }, @@ -22909,7 +23109,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tag_tagger-34" + "ex/HEAD/cat-file.html#git_tag_tagger-34" ] } }, @@ -22936,14 +23136,14 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tag_message-35", - "ex/v0.99.0/cat-file.html#git_tag_message-36" + "ex/HEAD/cat-file.html#git_tag_message-35", + "ex/HEAD/cat-file.html#git_tag_message-36" ], "general.c": [ - "ex/v0.99.0/general.html#git_tag_message-89" + "ex/HEAD/general.html#git_tag_message-88" ], "tag.c": [ - "ex/v0.99.0/tag.html#git_tag_message-17" + "ex/HEAD/tag.html#git_tag_message-17" ] } }, @@ -23000,7 +23200,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v0.99.0/tag.html#git_tag_create-18" + "ex/HEAD/tag.html#git_tag_create-18" ] } }, @@ -23131,7 +23331,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v0.99.0/tag.html#git_tag_create_lightweight-19" + "ex/HEAD/tag.html#git_tag_create_lightweight-19" ] } }, @@ -23163,7 +23363,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v0.99.0/tag.html#git_tag_delete-20" + "ex/HEAD/tag.html#git_tag_delete-20" ] } }, @@ -23227,7 +23427,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v0.99.0/tag.html#git_tag_list_match-21" + "ex/HEAD/tag.html#git_tag_list_match-21" ] } }, @@ -23317,6 +23517,33 @@ "comments": "", "group": "tag" }, + "git_tag_name_is_valid": { + "type": "function", + "file": "git2/tag.h", + "line": 378, + "lineto": 378, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given tag name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a tag name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Determine whether a tag name is valid, meaning that (when prefixed\n with refs/tags/) that it is a valid reference name, and that any\n additional tag name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "tag" + }, "git_trace_set": { "type": "function", "file": "git2/trace.h", @@ -23617,15 +23844,18 @@ "comments": "", "group": "tree", "examples": { + "commit.c": [ + "ex/HEAD/commit.html#git_tree_lookup-10" + ], "general.c": [ - "ex/v0.99.0/general.html#git_tree_lookup-90", - "ex/v0.99.0/general.html#git_tree_lookup-91" + "ex/HEAD/general.html#git_tree_lookup-89", + "ex/HEAD/general.html#git_tree_lookup-90" ], "init.c": [ - "ex/v0.99.0/init.html#git_tree_lookup-12" + "ex/HEAD/init.html#git_tree_lookup-12" ], "merge.c": [ - "ex/v0.99.0/merge.html#git_tree_lookup-37" + "ex/HEAD/merge.html#git_tree_lookup-37" ] } }, @@ -23688,23 +23918,26 @@ "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", "group": "tree", "examples": { + "commit.c": [ + "ex/HEAD/commit.html#git_tree_free-11" + ], "diff.c": [ - "ex/v0.99.0/diff.html#git_tree_free-18", - "ex/v0.99.0/diff.html#git_tree_free-19" + "ex/HEAD/diff.html#git_tree_free-18", + "ex/HEAD/diff.html#git_tree_free-19" ], "general.c": [ - "ex/v0.99.0/general.html#git_tree_free-92", - "ex/v0.99.0/general.html#git_tree_free-93" + "ex/HEAD/general.html#git_tree_free-91", + "ex/HEAD/general.html#git_tree_free-92" ], "init.c": [ - "ex/v0.99.0/init.html#git_tree_free-13" + "ex/HEAD/init.html#git_tree_free-13" ], "log.c": [ - "ex/v0.99.0/log.html#git_tree_free-55", - "ex/v0.99.0/log.html#git_tree_free-56", - "ex/v0.99.0/log.html#git_tree_free-57", - "ex/v0.99.0/log.html#git_tree_free-58", - "ex/v0.99.0/log.html#git_tree_free-59" + "ex/HEAD/log.html#git_tree_free-55", + "ex/HEAD/log.html#git_tree_free-56", + "ex/HEAD/log.html#git_tree_free-57", + "ex/HEAD/log.html#git_tree_free-58", + "ex/HEAD/log.html#git_tree_free-59" ] } }, @@ -23775,10 +24008,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tree_entrycount-37" + "ex/HEAD/cat-file.html#git_tree_entrycount-37" ], "general.c": [ - "ex/v0.99.0/general.html#git_tree_entrycount-94" + "ex/HEAD/general.html#git_tree_entrycount-93" ] } }, @@ -23810,7 +24043,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_tree_entry_byname-95" + "ex/HEAD/general.html#git_tree_entry_byname-94" ] } }, @@ -23842,10 +24075,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tree_entry_byindex-38" + "ex/HEAD/cat-file.html#git_tree_entry_byindex-38" ], "general.c": [ - "ex/v0.99.0/general.html#git_tree_entry_byindex-96" + "ex/HEAD/general.html#git_tree_entry_byindex-95" ] } }, @@ -23980,11 +24213,11 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tree_entry_name-39" + "ex/HEAD/cat-file.html#git_tree_entry_name-39" ], "general.c": [ - "ex/v0.99.0/general.html#git_tree_entry_name-97", - "ex/v0.99.0/general.html#git_tree_entry_name-98" + "ex/HEAD/general.html#git_tree_entry_name-96", + "ex/HEAD/general.html#git_tree_entry_name-97" ] } }, @@ -24011,7 +24244,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tree_entry_id-40" + "ex/HEAD/cat-file.html#git_tree_entry_id-40" ] } }, @@ -24038,7 +24271,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tree_entry_type-41" + "ex/HEAD/cat-file.html#git_tree_entry_type-41" ] } }, @@ -24065,7 +24298,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v0.99.0/cat-file.html#git_tree_entry_filemode-42" + "ex/HEAD/cat-file.html#git_tree_entry_filemode-42" ] } }, @@ -24151,7 +24384,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/v0.99.0/general.html#git_tree_entry_to_object-99" + "ex/HEAD/general.html#git_tree_entry_to_object-98" ] } }, @@ -24408,43 +24641,11 @@ "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", "group": "treebuilder" }, - "git_treebuilder_write_with_buffer": { - "type": "function", - "file": "git2/tree.h", - "line": 392, - "lineto": 393, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer to store the OID of the newly written tree" - }, - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder to write" - }, - { - "name": "tree", - "type": "git_buf *", - "comment": "Shared buffer for writing the tree. Will be grown as necessary." - } - ], - "argline": "git_oid *oid, git_treebuilder *bld, git_buf *tree", - "sig": "git_oid *::git_treebuilder *::git_buf *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write the contents of the tree builder as a tree object\n using a shared git_buf.

\n", - "comments": "", - "group": "treebuilder" - }, "git_tree_walk": { "type": "function", "file": "git2/tree.h", - "line": 422, - "lineto": 426, + "line": 408, + "lineto": 412, "args": [ { "name": "tree", @@ -24480,8 +24681,8 @@ "git_tree_dup": { "type": "function", "file": "git2/tree.h", - "line": 435, - "lineto": 435, + "line": 421, + "lineto": 421, "args": [ { "name": "out", @@ -24507,8 +24708,8 @@ "git_tree_create_updated": { "type": "function", "file": "git2/tree.h", - "line": 481, - "lineto": 481, + "line": 467, + "lineto": 467, "args": [ { "name": "out", @@ -25358,8 +25559,8 @@ "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 516, - "lineto": 516, + "line": 617, + "lineto": 617, "args": [ { "name": "rhead", @@ -25952,8 +26153,8 @@ "git_repository_fetchhead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 656, - "lineto": 660, + "line": 700, + "lineto": 704, "args": [ { "name": "ref_name", @@ -25993,8 +26194,8 @@ "git_repository_mergehead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 687, - "lineto": 688, + "line": 731, + "lineto": 732, "args": [ { "name": "oid", @@ -26251,7 +26452,7 @@ "type": "int", "comment": null }, - "description": "

Callback for messages recieved by the transport.

\n", + "description": "

Callback for messages received by the transport.

\n", "comments": "

Return a negative value to cancel the network operation.

\n" }, "git_transport_cb": { @@ -26314,8 +26515,8 @@ "git_treewalk_cb": { "type": "callback", "file": "git2/tree.h", - "line": 396, - "lineto": 397, + "line": 382, + "lineto": 383, "args": [ { "name": "root", @@ -26563,8 +26764,8 @@ "type": "struct", "value": "git_blame", "file": "git2/blame.h", - "line": 149, - "lineto": 149, + "line": 151, + "lineto": 151, "tdef": "typedef", "description": " Opaque structure to hold blame results ", "comments": "", @@ -26596,13 +26797,14 @@ "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", "GIT_BLAME_FIRST_PARENT", - "GIT_BLAME_USE_MAILMAP" + "GIT_BLAME_USE_MAILMAP", + "GIT_BLAME_IGNORE_WHITESPACE" ], "type": "enum", "file": "git2/blame.h", "line": 26, - "lineto": 50, - "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP", + "lineto": 52, + "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", "tdef": "typedef", "description": " Flags for indicating option behavior for git_blame APIs.", "comments": "", @@ -26648,6 +26850,12 @@ "name": "GIT_BLAME_USE_MAILMAP", "comments": "

Use mailmap file to map author and committer names and email addresses\n to canonical real names and email addresses. The mailmap will be read\n from the working directory, or HEAD in a bare repository.

\n", "value": 32 + }, + { + "type": "int", + "name": "GIT_BLAME_IGNORE_WHITESPACE", + "comments": "

Ignore whitespace differences

\n", + "value": 64 } ], "used": { @@ -26673,8 +26881,8 @@ "type": "struct", "value": "git_blame_hunk", "file": "git2/blame.h", - "line": 132, - "lineto": 145, + "line": 134, + "lineto": 147, "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", "tdef": "typedef", "description": " Structure that represents a blame hunk.", @@ -26750,8 +26958,8 @@ "type": "struct", "value": "git_blame_options", "file": "git2/blame.h", - "line": 59, - "lineto": 88, + "line": 61, + "lineto": 90, "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", "tdef": "typedef", "description": " Blame options structure", @@ -26820,6 +27028,7 @@ "needs": [ "git_blob_dup", "git_blob_filter", + "git_blob_filter_options_init", "git_blob_filtered_content", "git_blob_free", "git_blob_id", @@ -26846,13 +27055,13 @@ "decl": [ "GIT_BLOB_FILTER_CHECK_FOR_BINARY", "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", - "GIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD" + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD" ], "type": "enum", "file": "git2/blob.h", "line": 102, "lineto": 117, - "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD", + "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", "tdef": "typedef", "description": " Flags to control the functionality of `git_blob_filter`.", "comments": "", @@ -26871,7 +27080,7 @@ }, { "type": "int", - "name": "GIT_BLOB_FILTER_ATTTRIBUTES_FROM_HEAD", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", "value": 4 } @@ -26892,12 +27101,12 @@ "type": "struct", "value": "git_blob_filter_options", "file": "git2/blob.h", - "line": 122, - "lineto": 127, + "line": 126, + "lineto": 131, "block": "int version\nuint32_t flags", "tdef": "typedef", "description": " The options used when applying filter options to a file.", - "comments": "", + "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n", "fields": [ { "type": "int", @@ -26913,7 +27122,8 @@ "used": { "returns": [], "needs": [ - "git_blob_filter" + "git_blob_filter", + "git_blob_filter_options_init" ] } } @@ -27109,14 +27319,17 @@ "git_cert_ssh_t type", "unsigned char [16] hash_md5", "unsigned char [20] hash_sha1", - "unsigned char [32] hash_sha256" + "unsigned char [32] hash_sha256", + "git_cert_ssh_raw_type_t raw_type", + "const char * hostkey", + "size_t hostkey_len" ], "type": "struct", "value": "git_cert_hostkey", "file": "git2/cert.h", - "line": 88, - "lineto": 114, - "block": "struct git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256", + "line": 107, + "lineto": 150, + "block": "struct git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", "tdef": "typedef", "description": " Hostkey information taken from libssh2", "comments": "", @@ -27129,22 +27342,37 @@ { "type": "git_cert_ssh_t", "name": "type", - "comments": " A hostkey type from libssh2, either\n `GIT_CERT_SSH_MD5` or `GIT_CERT_SSH_SHA1`" + "comments": " A bitmask containing the available fields." }, { "type": "unsigned char [16]", "name": "hash_md5", - "comments": " Hostkey hash. If type has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey." + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey." }, { "type": "unsigned char [20]", "name": "hash_sha1", - "comments": " Hostkey hash. If type has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." }, { "type": "unsigned char [32]", "name": "hash_sha256", - "comments": " Hostkey hash. If type has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." + }, + { + "type": "git_cert_ssh_raw_type_t", + "name": "raw_type", + "comments": " Raw hostkey type. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the type of the raw hostkey." + }, + { + "type": "const char *", + "name": "hostkey", + "comments": " Pointer to the raw hostkey. If `type` has `GIT_CERT_SSH_RAW` set,\n this will have the raw contents of the hostkey." + }, + { + "type": "size_t", + "name": "hostkey_len", + "comments": " Raw hostkey length. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the length of the raw contents of the hostkey." } ], "used": { @@ -27159,13 +27387,14 @@ "decl": [ "GIT_CERT_SSH_MD5", "GIT_CERT_SSH_SHA1", - "GIT_CERT_SSH_SHA256" + "GIT_CERT_SSH_SHA256", + "GIT_CERT_SSH_RAW" ], "type": "enum", "file": "git2/cert.h", "line": 76, - "lineto": 83, - "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256", + "lineto": 85, + "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256\nGIT_CERT_SSH_RAW", "tdef": "typedef", "description": " Type of SSH host fingerprint", "comments": "", @@ -27187,6 +27416,12 @@ "name": "GIT_CERT_SSH_SHA256", "comments": "

SHA-256 is available

\n", "value": 4 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_RAW", + "comments": "

Raw hostkey is available

\n", + "value": 8 } ], "used": { @@ -27255,8 +27490,8 @@ "type": "struct", "value": "git_cert_x509", "file": "git2/cert.h", - "line": 119, - "lineto": 131, + "line": 155, + "lineto": 167, "block": "struct git_cert parent\nvoid * data\nsize_t len", "tdef": "typedef", "description": " X.509 certificate information", @@ -30650,13 +30885,14 @@ "GIT_ERROR_PATCH", "GIT_ERROR_WORKTREE", "GIT_ERROR_SHA1", - "GIT_ERROR_HTTP" + "GIT_ERROR_HTTP", + "GIT_ERROR_INTERNAL" ], "type": "enum", "file": "git2/errors.h", "line": 75, - "lineto": 111, - "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA1\nGIT_ERROR_HTTP", + "lineto": 112, + "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA1\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL", "tdef": "typedef", "description": " Error classes ", "comments": "", @@ -30870,6 +31106,12 @@ "name": "GIT_ERROR_HTTP", "comments": "", "value": 34 + }, + { + "type": "int", + "name": "GIT_ERROR_INTERNAL", + "comments": "", + "value": 35 } ], "used": { @@ -32022,13 +32264,15 @@ "GIT_OPT_GET_PACK_MAX_OBJECTS", "GIT_OPT_SET_PACK_MAX_OBJECTS", "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", - "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE" + "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_MWINDOW_FILE_LIMIT" ], "type": "enum", "file": "git2/common.h", "line": 179, - "lineto": 209, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "lineto": 211, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT", "tdef": "typedef", "description": " Global library options", "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", @@ -32206,6 +32450,18 @@ "name": "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", "comments": "", "value": 28 + }, + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 29 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 30 } ], "used": { @@ -33464,7 +33720,6 @@ "git_blob_create_from_disk", "git_blob_create_from_stream_commit", "git_blob_create_from_workdir", - "git_blob_create_fromworkdir", "git_blob_lookup", "git_blob_lookup_prefix", "git_commit_amend", @@ -33720,6 +33975,7 @@ "git_patch_line_stats", "git_patch_num_hunks", "git_patch_num_lines_in_hunk", + "git_patch_owner", "git_patch_print", "git_patch_size", "git_patch_to_buf" @@ -35104,6 +35360,7 @@ "git_commit_owner", "git_index_owner", "git_object_owner", + "git_patch_owner", "git_reference_owner", "git_remote_owner", "git_revwalk_repository", @@ -35128,7 +35385,6 @@ "git_blob_create_from_disk", "git_blob_create_from_stream", "git_blob_create_from_workdir", - "git_blob_create_fromworkdir", "git_blob_lookup", "git_blob_lookup_prefix", "git_branch_create", @@ -35345,53 +35601,53 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 245, - "lineto": 253, + "line": 225, + "lineto": 271, "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", "tdef": "typedef", "description": " Option flags for `git_repository_init_ext`.", - "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo. Details of individual values are:

\n\n
    \n
  • BARE - Create a bare repository with no working directory. * NO_REINIT - Return an GIT_EEXISTS error if the repo_path appears to already be an git repository. * NO_DOTGIT_DIR - Normally a "/.git/" will be appended to the repo path for non-bare repos (if it is not already there), but passing this flag prevents that behavior. * MKDIR - Make the repo_path (and workdir_path) as needed. Init is always willing to create the ".git" directory even without this flag. This flag tells init to create the trailing component of the repo and workdir paths as needed. * MKPATH - Recursively make all components of the repo and workdir paths as necessary. * EXTERNAL_TEMPLATE - libgit2 normally uses internal templates to initialize a new repo. This flags enables external templates, looking the "template_path" from the options if set, or the init.templatedir global config if not, or falling back on "/usr/share/git-core/templates" if it exists. * GIT_REPOSITORY_INIT_RELATIVE_GITLINK - If an alternate workdir is specified, use relative paths for the gitdir and core.worktree.
  • \n
\n", + "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo.

\n", "fields": [ { "type": "int", "name": "GIT_REPOSITORY_INIT_BARE", - "comments": "", + "comments": "

Create a bare repository with no working directory.

\n", "value": 1 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_NO_REINIT", - "comments": "", + "comments": "

Return an GIT_EEXISTS error if the repo_path appears to already be\n an git repository.

\n", "value": 2 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", - "comments": "", + "comments": "

Normally a "/.git/" will be appended to the repo path for\n non-bare repos (if it is not already there), but passing this flag\n prevents that behavior.

\n", "value": 4 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_MKDIR", - "comments": "", + "comments": "

Make the repo_path (and workdir_path) as needed. Init is always willing\n to create the ".git" directory even without this flag. This flag tells\n init to create the trailing component of the repo and workdir paths\n as needed.

\n", "value": 8 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_MKPATH", - "comments": "", + "comments": "

Recursively make all components of the repo and workdir paths as\n necessary.

\n", "value": 16 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", - "comments": "", + "comments": "

libgit2 normally uses internal templates to initialize a new repo.\n This flags enables external templates, looking the "template_path" from\n the options if set, or the init.templatedir global config if not,\n or falling back on "/usr/share/git-core/templates" if it exists.

\n", "value": 32 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_RELATIVE_GITLINK", - "comments": "", + "comments": "

If an alternate workdir is specified, use relative paths for the gitdir\n and core.worktree.

\n", "value": 64 } ], @@ -35411,29 +35667,29 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 268, - "lineto": 272, + "line": 280, + "lineto": 296, "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", "tdef": "typedef", "description": " Mode options for `git_repository_init_ext`.", - "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the following modes:

\n\n
    \n
  • SHARED_UMASK - Use permissions configured by umask - the default. * SHARED_GROUP - Use "--shared=group" behavior, chmod'ing the new repo to be group writable and "g+sx" for sticky group assignment. * SHARED_ALL - Use "--shared=all" behavior, adding world readability. * Anything else - Set to custom value.
  • \n
\n", + "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the defined modes.

\n", "fields": [ { "type": "int", "name": "GIT_REPOSITORY_INIT_SHARED_UMASK", - "comments": "", + "comments": "

Use permissions configured by umask - the default.

\n", "value": 0 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_SHARED_GROUP", - "comments": "", + "comments": "

Use "--shared=group" behavior, chmod'ing the new repo to be group\n writable and "g+sx" for sticky group assignment.

\n", "value": 1533 }, { "type": "int", "name": "GIT_REPOSITORY_INIT_SHARED_ALL", - "comments": "", + "comments": "

Use "--shared=all" behavior, adding world readability.

\n", "value": 1535 } ], @@ -35459,12 +35715,12 @@ "type": "struct", "value": "git_repository_init_options", "file": "git2/repository.h", - "line": 302, - "lineto": 311, + "line": 304, + "lineto": 354, "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", "tdef": "typedef", "description": " Extended options structure for `git_repository_init_ext`.", - "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features. The fields are:

\n\n
    \n
  • flags - Combination of GIT_REPOSITORY_INIT flags above. * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants above, or to a custom value that you would like. * workdir_path - The path to the working dir or NULL for default (i.e. repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not the "natural" working directory, a .git gitlink file will be created here linking to the repo_path. * description - If set, this will be used to initialize the "description" file in the repository, instead of using the template content. * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains the path to use for the template directory. If this is NULL, the config or default directory options will be used instead. * initial_head - The name of the head to point HEAD at. If NULL, then this will be treated as "master" and the HEAD ref will be set to "refs/heads/master". If this begins with "refs/" it will be used verbatim; otherwise "refs/heads/" will be prefixed. * origin_url - If this is non-NULL, then after the rest of the repository initialization is completed, an "origin" remote will be added pointing to this URL.
  • \n
\n", + "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features.

\n", "fields": [ { "type": "unsigned int", @@ -35474,37 +35730,37 @@ { "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " Combination of GIT_REPOSITORY_INIT flags above." }, { "type": "uint32_t", "name": "mode", - "comments": "" + "comments": " Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants\n above, or to a custom value that you would like." }, { "type": "const char *", "name": "workdir_path", - "comments": "" + "comments": " The path to the working dir or NULL for default (i.e. repo_path parent\n on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED\n RELATIVE TO THE REPO_PATH. If this is not the \"natural\" working\n directory, a .git gitlink file will be created here linking to the\n repo_path." }, { "type": "const char *", "name": "description", - "comments": "" + "comments": " If set, this will be used to initialize the \"description\" file in the\n repository, instead of using the template content." }, { "type": "const char *", "name": "template_path", - "comments": "" + "comments": " When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains\n the path to use for the template directory. If this is NULL, the config\n or default directory options will be used instead." }, { "type": "const char *", "name": "initial_head", - "comments": "" + "comments": " The name of the head to point HEAD at. If NULL, then this will be\n treated as \"master\" and the HEAD ref will be set to \"refs/heads/master\".\n If this begins with \"refs/\" it will be used verbatim;\n otherwise \"refs/heads/\" will be prefixed." }, { "type": "const char *", "name": "origin_url", - "comments": "" + "comments": " If this is non-NULL, then after the rest of the repository\n initialization is completed, an \"origin\" remote will be added\n pointing to this URL." } ], "used": { @@ -35538,8 +35794,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 427, - "lineto": 443, + "line": 470, + "lineto": 486, "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM__LAST", "tdef": "typedef", "description": " List of items which belong to the git repository layout", @@ -35719,8 +35975,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 821, - "lineto": 834, + "line": 865, + "lineto": 878, "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", "tdef": "typedef", "description": " Repository state", @@ -35899,48 +36155,6 @@ } } ], - [ - "git_revparse_mode_t", - { - "decl": [ - "GIT_REVPARSE_SINGLE", - "GIT_REVPARSE_RANGE", - "GIT_REVPARSE_MERGE_BASE" - ], - "type": "enum", - "file": "git2/revparse.h", - "line": 71, - "lineto": 78, - "block": "GIT_REVPARSE_SINGLE\nGIT_REVPARSE_RANGE\nGIT_REVPARSE_MERGE_BASE", - "tdef": "typedef", - "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REVPARSE_SINGLE", - "comments": "

The spec targeted a single object.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REVPARSE_RANGE", - "comments": "

The spec targeted a range of commits.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REVPARSE_MERGE_BASE", - "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], [ "git_revspec", { @@ -35972,7 +36186,7 @@ { "type": "unsigned int", "name": "flags", - "comments": " The intent of the revspec (i.e. `git_revparse_mode_t` flags) " + "comments": " The intent of the revspec (i.e. `git_revspec_mode_t` flags) " } ], "used": { @@ -35983,6 +36197,48 @@ } } ], + [ + "git_revspec_t", + { + "decl": [ + "GIT_REVSPEC_SINGLE", + "GIT_REVSPEC_RANGE", + "GIT_REVSPEC_MERGE_BASE" + ], + "type": "enum", + "file": "git2/revparse.h", + "line": 71, + "lineto": 78, + "block": "GIT_REVSPEC_SINGLE\nGIT_REVSPEC_RANGE\nGIT_REVSPEC_MERGE_BASE", + "tdef": "typedef", + "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REVSPEC_SINGLE", + "comments": "

The spec targeted a single object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REVSPEC_RANGE", + "comments": "

The spec targeted a range of commits.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REVSPEC_MERGE_BASE", + "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_revwalk", { @@ -36872,6 +37128,7 @@ "git_remote_upload", "git_reset_default", "git_strarray_copy", + "git_strarray_dispose", "git_strarray_free", "git_tag_list", "git_tag_list_match", @@ -37623,8 +37880,8 @@ "type": "struct", "value": "git_tree_update", "file": "git2/tree.h", - "line": 450, - "lineto": 459, + "line": 436, + "lineto": 445, "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "tdef": "typedef", "description": " An action to perform during the update of a tree", @@ -37668,8 +37925,8 @@ ], "type": "enum", "file": "git2/tree.h", - "line": 440, - "lineto": 445, + "line": 426, + "lineto": 431, "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", "tdef": "typedef", "description": " The kind of update to perform", @@ -37732,8 +37989,8 @@ ], "type": "enum", "file": "git2/tree.h", - "line": 400, - "lineto": 403, + "line": 386, + "lineto": 389, "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", "tdef": "typedef", "description": " Tree traversal modes ", @@ -38017,9 +38274,9 @@ "git_blob_create_from_stream", "git_blob_create_from_stream_commit", "git_blob_create_from_workdir", - "git_blob_create_fromworkdir", "git_blob_dup", "git_blob_filter", + "git_blob_filter_options_init", "git_blob_filtered_content", "git_blob_free", "git_blob_id", @@ -38044,6 +38301,7 @@ "git_branch_lookup", "git_branch_move", "git_branch_name", + "git_branch_name_is_valid", "git_branch_next", "git_branch_remote_name", "git_branch_set_upstream", @@ -38547,6 +38805,7 @@ "git_patch_line_stats", "git_patch_num_hunks", "git_patch_num_lines_in_hunk", + "git_patch_owner", "git_patch_print", "git_patch_size", "git_patch_to_buf" @@ -38638,6 +38897,7 @@ "git_reference_list", "git_reference_lookup", "git_reference_name", + "git_reference_name_is_valid", "git_reference_name_to_id", "git_reference_next", "git_reference_next_name", @@ -38722,6 +38982,7 @@ "git_remote_lookup", "git_remote_ls", "git_remote_name", + "git_remote_name_is_valid", "git_remote_owner", "git_remote_prune", "git_remote_prune_refs", @@ -38874,6 +39135,7 @@ "strarray", [ "git_strarray_copy", + "git_strarray_dispose", "git_strarray_free" ] ], @@ -38933,6 +39195,7 @@ "git_tag_lookup_prefix", "git_tag_message", "git_tag_name", + "git_tag_name_is_valid", "git_tag_owner", "git_tag_peel", "git_tag_tagger", @@ -39026,111 +39289,119 @@ "examples": [ [ "add.c", - "ex/v0.99.0/add.html" + "ex/HEAD/add.html" ], [ "args.c", - "ex/v0.99.0/args.html" + "ex/HEAD/args.html" ], [ "blame.c", - "ex/v0.99.0/blame.html" + "ex/HEAD/blame.html" ], [ "cat-file.c", - "ex/v0.99.0/cat-file.html" + "ex/HEAD/cat-file.html" ], [ "checkout.c", - "ex/v0.99.0/checkout.html" + "ex/HEAD/checkout.html" ], [ "clone.c", - "ex/v0.99.0/clone.html" + "ex/HEAD/clone.html" + ], + [ + "commit.c", + "ex/HEAD/commit.html" ], [ "common.c", - "ex/v0.99.0/common.html" + "ex/HEAD/common.html" ], [ "config.c", - "ex/v0.99.0/config.html" + "ex/HEAD/config.html" ], [ "describe.c", - "ex/v0.99.0/describe.html" + "ex/HEAD/describe.html" ], [ "diff.c", - "ex/v0.99.0/diff.html" + "ex/HEAD/diff.html" ], [ "fetch.c", - "ex/v0.99.0/fetch.html" + "ex/HEAD/fetch.html" ], [ "for-each-ref.c", - "ex/v0.99.0/for-each-ref.html" + "ex/HEAD/for-each-ref.html" ], [ "general.c", - "ex/v0.99.0/general.html" + "ex/HEAD/general.html" ], [ "index-pack.c", - "ex/v0.99.0/index-pack.html" + "ex/HEAD/index-pack.html" ], [ "init.c", - "ex/v0.99.0/init.html" + "ex/HEAD/init.html" ], [ "lg2.c", - "ex/v0.99.0/lg2.html" + "ex/HEAD/lg2.html" ], [ "log.c", - "ex/v0.99.0/log.html" + "ex/HEAD/log.html" ], [ "ls-files.c", - "ex/v0.99.0/ls-files.html" + "ex/HEAD/ls-files.html" ], [ "ls-remote.c", - "ex/v0.99.0/ls-remote.html" + "ex/HEAD/ls-remote.html" ], [ "merge.c", - "ex/v0.99.0/merge.html" + "ex/HEAD/merge.html" + ], + [ + "push.c", + "ex/HEAD/push.html" ], [ "remote.c", - "ex/v0.99.0/remote.html" + "ex/HEAD/remote.html" ], [ "rev-list.c", - "ex/v0.99.0/rev-list.html" + "ex/HEAD/rev-list.html" ], [ "rev-parse.c", - "ex/v0.99.0/rev-parse.html" + "ex/HEAD/rev-parse.html" ], [ "show-index.c", - "ex/v0.99.0/show-index.html" + "ex/HEAD/show-index.html" ], [ "stash.c", - "ex/v0.99.0/stash.html" + "ex/HEAD/stash.html" ], [ "status.c", - "ex/v0.99.0/status.html" + "ex/HEAD/status.html" ], [ "tag.c", - "ex/v0.99.0/tag.html" + "ex/HEAD/tag.html" ] ] } diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index b8c269537..1723c4949 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1123,6 +1123,49 @@ ] } ], + [ + "git_cert_ssh_raw_type_t", + { + "type": "enum", + "fields": [ + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_UNKNOWN", + "value": 0 + }, + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_RSA", + "value": 1 + }, + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_DSS", + "value": 2 + }, + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256", + "value": 3 + }, + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384", + "value": 4 + }, + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521", + "value": 5 + }, + { + "type": "uint32_t", + "name": "GIT_CERT_SSH_RAW_TYPE_KEY_ED25519", + "value": 6 + } + ] + } + ], [ "git_config_entry", { diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 6b64ad443..6cc47b09b 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -214,18 +214,18 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%elsif not .|returnsCount %} v8::Local result = Nan::Undefined(); {%else%} - v8::Local to; + v8::Local v8ConversionSlot; {%if .|returnsCount > 1 %} v8::Local result = Nan::New(); {%endif%} {%each .|returnsInfo 0 1 as _return %} {%partial convertToV8 _return %} {%if .|returnsCount > 1 %} - Nan::Set(result, Nan::New("{{ _return.returnNameOrName }}").ToLocalChecked(), to); + Nan::Set(result, Nan::New("{{ _return.returnNameOrName }}").ToLocalChecked(), v8ConversionSlot); {%endif%} {%endeach%} {%if .|returnsCount == 1 %} - v8::Local result = to; + v8::Local result = v8ConversionSlot; {%endif%} {%endif%} diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index a7a251938..6addc3a1d 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -2,18 +2,18 @@ {% if cppClassName == 'String' %} if ({{= parsedName =}}){ {% if size %} - to = Nan::New({{= parsedName =}}, {{ size }}).ToLocalChecked(); + v8ConversionSlot = Nan::New({{= parsedName =}}, {{ size }}).ToLocalChecked(); {% elsif cType == 'char **' %} - to = Nan::New(*{{= parsedName =}}).ToLocalChecked(); + v8ConversionSlot = Nan::New(*{{= parsedName =}}).ToLocalChecked(); {% elsif cType == 'char' %} char convertToNullTerminated[2] = { {{= parsedName =}}, '\0' }; - to = Nan::New(convertToNullTerminated).ToLocalChecked(); + v8ConversionSlot = Nan::New(convertToNullTerminated).ToLocalChecked(); {% else %} - to = Nan::New({{= parsedName =}}).ToLocalChecked(); + v8ConversionSlot = Nan::New({{= parsedName =}}).ToLocalChecked(); {% endif %} } else { - to = Nan::Null(); + v8ConversionSlot = Nan::Null(); } {% if freeFunctionName %} @@ -32,16 +32,16 @@ {% endif %} Nan::Set(tmpArray, Nan::New(i), element); } - to = tmpArray; + v8ConversionSlot = tmpArray; {% elsif isCppClassIntType %} - to = Nan::New<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}); + v8ConversionSlot = Nan::New<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}); {% else %} - to = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}); + v8ConversionSlot = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}); {% endif %} {% elsif cppClassName == 'External' %} - to = Nan::New((void *){{= parsedName =}}); + v8ConversionSlot = Nan::New((void *){{= parsedName =}}); {% elsif cppClassName == 'Array' %} @@ -55,16 +55,16 @@ v8::Local tmpArray = Nan::New({{= parsedName =}}); {% endif %} - to = tmpArray; + v8ConversionSlot = tmpArray; {% elsif cppClassName == 'GitBuf' %} {% if doNotConvert %} - to = Nan::Null(); + v8ConversionSlot = Nan::Null(); {% else %} if ({{= parsedName =}}) { - to = Nan::New({{= parsedName =}}->ptr, {{= parsedName = }}->size).ToLocalChecked(); + v8ConversionSlot = Nan::New({{= parsedName =}}->ptr, {{= parsedName = }}->size).ToLocalChecked(); } else { - to = Nan::Null(); + v8ConversionSlot = Nan::Null(); } {% endif %} {% else %} @@ -104,9 +104,9 @@ {% endif %} {% endif %} {% if cppClassName == 'Wrapper' %} - to = {{ cppClassName }}::New({{ cType|asElementPointer parsedName }}); + v8ConversionSlot = {{ cppClassName }}::New({{ cType|asElementPointer parsedName }}); {% else %} - to = {{ cppClassName }}::New( + v8ConversionSlot = {{ cppClassName }}::New( {{ cType|asElementPointer parsedName }}, {{ selfFreeing|toBool }} {% if hasOwner %} @@ -116,12 +116,12 @@ {% endif %} } else { - to = Nan::Null(); + v8ConversionSlot = Nan::Null(); } {% if cType|isArrayType %} - Nan::Set(tmpArray, Nan::New(i), to); + Nan::Set(tmpArray, Nan::New(i), v8ConversionSlot); } - to = tmpArray; + v8ConversionSlot = tmpArray; {% endif %} {% endif %} // end convert_to_v8 block diff --git a/generate/templates/partials/fields.cc b/generate/templates/partials/fields.cc index 437975084..d9478549e 100644 --- a/generate/templates/partials/fields.cc +++ b/generate/templates/partials/fields.cc @@ -2,7 +2,7 @@ {% if not field.ignore %} // start field block NAN_METHOD({{ cppClassName }}::{{ field.cppFunctionName }}) { - v8::Local to; + v8::Local v8ConversionSlot; {% if field | isFixedLengthString %} char* {{ field.name }} = (char *)Nan::ObjectWrap::Unwrap<{{ cppClassName }}>(info.This())->GetValue()->{{ field.name }}; @@ -25,7 +25,7 @@ {% endif %} {% partial convertToV8 field %} - info.GetReturnValue().Set(to); + info.GetReturnValue().Set(v8ConversionSlot); } // end field block {% endif %} diff --git a/generate/templates/partials/sync_function.cc b/generate/templates/partials/sync_function.cc index 3e6b6cc6a..8868bb5ca 100644 --- a/generate/templates/partials/sync_function.cc +++ b/generate/templates/partials/sync_function.cc @@ -111,18 +111,18 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { } {%endif%} - v8::Local to; + v8::Local v8ConversionSlot; {%if .|returnsCount > 1 %} v8::Local toReturn = Nan::New(); {%endif%} {%each .|returnsInfo as _return %} {%partial convertToV8 _return %} {%if .|returnsCount > 1 %} - Nan::Set(toReturn, Nan::New("{{ _return.returnNameOrName }}").ToLocalChecked(), to); + Nan::Set(toReturn, Nan::New("{{ _return.returnNameOrName }}").ToLocalChecked(), v8ConversionSlot); {%endif%} {%endeach%} {%if .|returnsCount == 1 %} - return info.GetReturnValue().Set(scope.Escape(to)); + return info.GetReturnValue().Set(scope.Escape(v8ConversionSlot)); {%else%} return info.GetReturnValue().Set(scope.Escape(toReturn)); {%endif%} diff --git a/lib/revparse.js b/lib/revparse.js new file mode 100644 index 000000000..74c1fa4c2 --- /dev/null +++ b/lib/revparse.js @@ -0,0 +1,18 @@ +var util = require("util"); +var NodeGit = require("../"); + +const MODE = { + SINGLE: 1, + RANGE: 2, + MERGE_BASE: 4, +}; + +NodeGit.Revparse.MODE = {}; +Object.keys(MODE).forEach((key) => { + Object.defineProperty(NodeGit.Revparse.MODE, key, { + get: util.deprecate( + () => MODE[key], + `Use NodeGit.Revspec.TYPE.${key} instead of NodeGit.Revparse.MODE.${key}.` + ) + }); +}); diff --git a/lifecycleScripts/install.js b/lifecycleScripts/install.js index 16b047120..dc44c836b 100644 --- a/lifecycleScripts/install.js +++ b/lifecycleScripts/install.js @@ -1,5 +1,6 @@ var buildFlags = require("../utils/buildFlags"); var spawn = require("child_process").spawn; +var path = require("path"); module.exports = function install() { console.log("[nodegit] Running install script"); @@ -28,7 +29,12 @@ module.exports = function install() { } return new Promise(function(resolve, reject) { - var spawnedNodePreGyp = spawn(nodePreGyp, args); + var spawnedNodePreGyp = spawn(nodePreGyp, args, { + env: Object.assign({}, process.env, { + npm_config_node_gyp: path.join(__dirname, "..", "node_modules", + "node-gyp", "bin", "node-gyp.js") + }) + }); spawnedNodePreGyp.stdout.on("data", function(data) { console.info(data.toString().trim()); diff --git a/package-lock.json b/package-lock.json index 934a91a17..8d093dedf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,6 +63,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -1282,7 +1283,8 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "code-point-at": { "version": "1.1.0", @@ -1720,6 +1722,11 @@ "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", @@ -1874,7 +1881,8 @@ "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", @@ -2787,6 +2795,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, "requires": { "ajv": "^5.3.0", "har-schema": "^2.0.0" @@ -3413,7 +3422,8 @@ "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", @@ -3583,6 +3593,21 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3676,6 +3701,30 @@ } } }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -3863,21 +3912,192 @@ "dev": true }, "node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==", - "requires": { - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^4.4.8", - "which": "1" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "node-pre-gyp": { @@ -3912,6 +4132,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, "requires": { "abbrev": "1" } @@ -4379,7 +4600,8 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, "qs": { "version": "6.5.2", @@ -4909,6 +5131,7 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -4935,7 +5158,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true } } }, @@ -5526,6 +5750,7 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -5690,6 +5915,21 @@ } } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -5830,6 +6070,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index d73f00ae6..93eab791a 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "nan": "^2.14.1", - "node-gyp": "^4.0.0", + "node-gyp": "^7.1.2", "node-pre-gyp": "^0.13.0", "ramda": "^0.25.0", "tar-fs": "^1.16.3" diff --git a/vendor/libgit2 b/vendor/libgit2 index 0acf9f9e3..55d767df3 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 0acf9f9e3acca13aba5e399bc60956f6020e6025 +Subproject commit 55d767df3967b0472dec91a1148b848992f21806 diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 9747b155a..3fa6693f2 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -40,10 +40,14 @@ "libgit2/include/git2/sys/hashsig.h", "libgit2/include/git2/sys/merge.h", "libgit2/include/git2/worktree.h", + "libgit2/src/allocators/failalloc.c", + "libgit2/src/allocators/failalloc.h", "libgit2/src/allocators/stdalloc.c", "libgit2/src/allocators/stdalloc.h", "libgit2/src/commit.c", "libgit2/src/commit.h", + "libgit2/src/commit_graph.c", + "libgit2/src/commit_graph.h", "libgit2/src/custom_tls.c", "libgit2/src/custom_tls.h", "libgit2/src/alloc.c", @@ -127,7 +131,6 @@ "libgit2/src/futils.h", "libgit2/src/filter.c", "libgit2/src/filter.h", - "libgit2/src/global.c", "libgit2/src/global.h", "libgit2/src/graph.c", "libgit2/src/hash.c", @@ -151,9 +154,13 @@ "libgit2/src/iterator.c", "libgit2/src/iterator.h", "libgit2/src/khash.h", + "libgit2/src/libgit2.c", + "libgit2/src/libgit2.h", "libgit2/src/mailmap.c", "libgit2/src/mailmap.h", "libgit2/src/map.h", + "libgit2/src/midx.c", + "libgit2/src/midx.h", "libgit2/src/merge_driver.c", "libgit2/src/merge_file.c", "libgit2/src/merge.c", @@ -184,12 +191,6 @@ "libgit2/src/oidarray.h", "libgit2/src/oidmap.c", "libgit2/src/oidmap.h", - "libgit2/src/streams/mbedtls.c", - "libgit2/src/streams/mbedtls.h", - "libgit2/src/streams/openssl.c", - "libgit2/src/streams/openssl.h", - "libgit2/src/streams/registry.c", - "libgit2/src/streams/registry.h", "libgit2/src/pack-objects.c", "libgit2/src/pack-objects.h", "libgit2/src/pack.c", @@ -239,7 +240,9 @@ "libgit2/src/revparse.c", "libgit2/src/revwalk.c", "libgit2/src/revwalk.h", - "libgit2/src/settings.c", + "libgit2/src/runtime.c", + "libgit2/src/runtime.h", + "libgit2/src/settings.h", "libgit2/src/signature.c", "libgit2/src/signature.h", "libgit2/src/streams/socket.c", @@ -250,6 +253,12 @@ "libgit2/src/status.c", "libgit2/src/status.h", "libgit2/src/strarray.c", + "libgit2/src/streams/mbedtls.c", + "libgit2/src/streams/mbedtls.h", + "libgit2/src/streams/openssl.c", + "libgit2/src/streams/openssl.h", + "libgit2/src/streams/registry.c", + "libgit2/src/streams/registry.h", "libgit2/src/strmap.c", "libgit2/src/strmap.h", "libgit2/src/strnlen.h", @@ -259,8 +268,10 @@ "libgit2/src/sysdir.h", "libgit2/src/tag.c", "libgit2/src/tag.h", - "libgit2/src/thread-utils.c", - "libgit2/src/thread-utils.h", + "libgit2/src/thread.c", + "libgit2/src/thread.h", + "libgit2/src/threadstate.c", + "libgit2/src/threadstate.h", "libgit2/src/trace.c", "libgit2/src/trace.h", "libgit2/src/trailer.c", @@ -444,6 +455,8 @@ 4013, ], "sources": [ + "libgit2/src/allocators/win32_leakcheck.c", + "libgit2/src/allocators/win32_leakcheck.h", "libgit2/src/transports/winhttp.c", "libgit2/src/win32/dir.c", "libgit2/src/win32/dir.h", @@ -470,6 +483,8 @@ "libgit2/src/win32/w32_buffer.c", "libgit2/src/win32/w32_buffer.h", "libgit2/src/win32/w32_common.h", + "libgit2/src/win32/w32_leakcheck.c", + "libgit2/src/win32/w32_leakcheck.h", "libgit2/src/win32/w32_util.c", "libgit2/src/win32/w32_util.h", ], From 8b7b48b7d0b4bf6755646438206dff73d8f40825 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 31 Mar 2021 14:15:08 -0700 Subject: [PATCH 276/545] Bump to v0.28.0-alpha.2 --- CHANGELOG.md | 112 ++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97c0ba02b..c038a3092 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,117 @@ # Change Log +## v0.28.0-alpha.2 [(2021-03-31)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.2) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.1...v0.28.0-alpha.2) + +#### Summary of changes +- Addresses crash in mwindow from libgit2 +- Bumps libgit2 to bring in bug fixes + +#### Merged PRs into NodeGit +- [Bump Libgit2 to 1.1.0 (on current head of libgit2) #1831](https://github.com/nodegit/nodegit/pull/1831) + +#### Merged PRs into Libgit2 +- [tree: deprecate `git_treebuilder_write_with_buffer`](https://github.com/libgit2/libgit2/pull/5815) +- [winhttp: skip certificate check if unable to send request](https://github.com/libgit2/libgit2/pull/5814) +- [commit-graph: Introduce `git_commit_graph_needs_refresh()`](https://github.com/libgit2/libgit2/pull/5764) +- [commit-graph: Support lookups of entries in a commit-graph](https://github.com/libgit2/libgit2/pull/5763) +- [merge: Check insert_head_ids error in create_virtual_base](https://github.com/libgit2/libgit2/pull/5818) +- [Check git_signature_dup failure](https://github.com/libgit2/libgit2/pull/5817) +- [Fix some typos](https://github.com/libgit2/libgit2/pull/5797) +- [include: fix typos in comments](https://github.com/libgit2/libgit2/pull/5805) +- [Fix documentation formating on repository.h](https://github.com/libgit2/libgit2/pull/5806) +- [index: Check git_vector_dup error in write_entries](https://github.com/libgit2/libgit2/pull/5801) +- [refdb_fs: Check git_sortedcache wlock/rlock errors](https://github.com/libgit2/libgit2/pull/5800) +- [Add new bindings for the R language](https://github.com/libgit2/libgit2/pull/5795) +- [Update .gitignore](https://github.com/libgit2/libgit2/pull/5787) +- [patch: add owner accessor](https://github.com/libgit2/libgit2/pull/5731) +- [commit-graph: Introduce a parser for commit-graph files](https://github.com/libgit2/libgit2/pull/5762) +- [revspec: rename git_revparse_mode_t to git_revspec_t](https://github.com/libgit2/libgit2/pull/5786) +- [mwindow: Fix a bug in the LRU window finding code](https://github.com/libgit2/libgit2/pull/5783) +- [ci: don't use ninja on macOS](https://github.com/libgit2/libgit2/pull/5780) +- [midx: Fix a bug in `git_midx_needs_refresh()`](https://github.com/libgit2/libgit2/pull/5768) +- [clone: set refs/remotes/origin/HEAD when branch is specified](https://github.com/libgit2/libgit2/pull/5775) +- [Use `p_pwrite`/`p_pread` consistently throughout the codebase](https://github.com/libgit2/libgit2/pull/5769) +- [README: instructions for using libgit2 without compiling](https://github.com/libgit2/libgit2/pull/5772) +- [Cope with empty default branch](https://github.com/libgit2/libgit2/pull/5770) +- [github-actions: Also rename the main branch here](https://github.com/libgit2/libgit2/pull/5771) +- [blob: fix name of `GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD`](https://github.com/libgit2/libgit2/pull/5760) +- [Add documentation for git_blob_filter_options.version](https://github.com/libgit2/libgit2/pull/5759) +- [Build with NO_MMAP](https://github.com/libgit2/libgit2/pull/5583) +- [zlib: Add support for building with Chromium's zlib implementation](https://github.com/libgit2/libgit2/pull/5748) +- [Handle ipv6 addresses](https://github.com/libgit2/libgit2/pull/5741) +- [Add support for additional SSH hostkey types.](https://github.com/libgit2/libgit2/pull/5750) +- [Fix the `-DENABLE_WERROR=ON` build for gcc 10.2](https://github.com/libgit2/libgit2/pull/5749) +- [repository: use intptr_t's in the config map cache](https://github.com/libgit2/libgit2/pull/5746) +- [Add tests for `git__multiply_int64_overflow`](https://github.com/libgit2/libgit2/pull/5744) +- [Third attempt to fix the 32-bit version of `git__multiply_int64_overf…](https://github.com/libgit2/libgit2/pull/5743) +- [Avoid using `__builtin_mul_overflow` with the clang+32-bit combo](https://github.com/libgit2/libgit2/pull/5742) +- [ci: run codeql](https://github.com/libgit2/libgit2/pull/5709) +- [pack: continue zlib while we can make progress](https://github.com/libgit2/libgit2/pull/5740) +- [Re-enable the RC4 test](https://github.com/libgit2/libgit2/pull/4418) +- [Cache the parsed submodule config when diffing](https://github.com/libgit2/libgit2/pull/5727) +- [Make git__strntol64() ~70%* faster](https://github.com/libgit2/libgit2/pull/5735) +- [winhttp: support optional client cert](https://github.com/libgit2/libgit2/pull/5384) +- [git.git-authors: Replacing his/her with their](https://github.com/libgit2/libgit2/pull/5724) +- [Friendlier getting started in the lack of git_libgit2_init](https://github.com/libgit2/libgit2/pull/5578) +- [Thread-local storage: a generic internal library (with no allocations)](https://github.com/libgit2/libgit2/pull/5720) +- [Thread-free implementation](https://github.com/libgit2/libgit2/pull/5719) +- [Make the pack and mwindow implementations data-race-free](https://github.com/libgit2/libgit2/pull/5593) +- [Make the odb race-free](https://github.com/libgit2/libgit2/pull/5595) +- [Also add the raw hostkey to `git_cert_hostkey`](https://github.com/libgit2/libgit2/pull/5704) +- [Fix the `ENABLE_WERROR=ON` build in Groovy Gorilla (gcc 10.2)](https://github.com/libgit2/libgit2/pull/5715) +- [odb: Add git_odb_options](https://github.com/libgit2/libgit2/pull/5447) +- [Introduce GIT_ASSERT macros](https://github.com/libgit2/libgit2/pull/5327) +- [ci: only report main branch in README status](https://github.com/libgit2/libgit2/pull/5708) +- [ci: run coverity in the nightly builds](https://github.com/libgit2/libgit2/pull/5707) +- [ci: more GitHub Actions](https://github.com/libgit2/libgit2/pull/5706) +- [Add a ThreadSanitizer build](https://github.com/libgit2/libgit2/pull/5597) +- [msvc crtdbg -> win32 leakcheck](https://github.com/libgit2/libgit2/pull/5580) +- [Add missing worktree_dir check and test case](https://github.com/libgit2/libgit2/pull/5692) +- [Fix the `-DTHREADSAFE=OFF` build](https://github.com/libgit2/libgit2/pull/5690) +- [ci: propagate environment variables](https://github.com/libgit2/libgit2/pull/5703) +- [ci: supply a token for self-hosted runners](https://github.com/libgit2/libgit2/pull/5702) +- [ci: supply a token for self-hosted runners](https://github.com/libgit2/libgit2/pull/5701) +- [ci: GitHub Actions for arm64](https://github.com/libgit2/libgit2/pull/5700) +- [ci: stop using deprecated set-env in GitHub Actions](https://github.com/libgit2/libgit2/pull/5697) +- [Deprecate `is_valid_name` functions; replace with `name_is_valid` functions](https://github.com/libgit2/libgit2/pull/5659) +- [Include `${MBEDTLS_INCLUDE_DIR}` when compiling `crypt_mbedtls.c`](https://github.com/libgit2/libgit2/pull/5685) +- [threadstate: rename tlsdata when building w/o threads](https://github.com/libgit2/libgit2/pull/5668) +- [Refactor "global" state](https://github.com/libgit2/libgit2/pull/5546) +- [Make the Windows leak detection more robust](https://github.com/libgit2/libgit2/pull/5661) +- [Define `git___load` when building with `-DTHREADSAFE=OFF`](https://github.com/libgit2/libgit2/pull/5664) +- [ntlm: update ntlm dependency for htonll](https://github.com/libgit2/libgit2/pull/5658) +- [libgit2 v1.1.0](https://github.com/libgit2/libgit2/pull/5660) +- [Update PCRE to 8.44](https://github.com/libgit2/libgit2/pull/5649) +- [clone: update origin's HEAD](https://github.com/libgit2/libgit2/pull/5651) +- [Improve the support of atomics](https://github.com/libgit2/libgit2/pull/5594) +- [Fix error return for invalid extensions.](https://github.com/libgit2/libgit2/pull/5656) +- [Change bare free to allocator free (fixes #5653)](https://github.com/libgit2/libgit2/pull/5654) +- [midx: Introduce a parser for multi-pack-index files](https://github.com/libgit2/libgit2/pull/5401) +- [Fixed typo in comment](https://github.com/libgit2/libgit2/pull/5648) +- [Fix binary diff showing /dev/null](https://github.com/libgit2/libgit2/pull/5494) +- [httpclient: only free challenges for current_server type](https://github.com/libgit2/libgit2/pull/5576) +- [Respect `init.defaultBranch` setting](https://github.com/libgit2/libgit2/pull/5581) +- [patch_parse: handle absence of "index" header for new/deleted cases](https://github.com/libgit2/libgit2/pull/5620) +- [boolean config parsing fails in some cases with mapped values](https://github.com/libgit2/libgit2/pull/5626) +- [Fix config file parsing with multi line values containing quoted parts](https://github.com/libgit2/libgit2/pull/5629) +- [Fix release build warnings](https://github.com/libgit2/libgit2/pull/5636) +- [Fix deprecation links inside of documentation not working](https://github.com/libgit2/libgit2/pull/5631) +- [Fix typo: Make ifndef macroname the same as the define name](https://github.com/libgit2/libgit2/pull/5632) +- [diff stats: fix segfaults with new files](https://github.com/libgit2/libgit2/pull/5619) +- [WinHTTP: Try to use TLS1.3](https://github.com/libgit2/libgit2/pull/5633) +- [Fixed includes for FreeBSD](https://github.com/libgit2/libgit2/pull/5628) +- [Don't fail if a HTTP server announces he supports a protocol upgrade](https://github.com/libgit2/libgit2/pull/5624) +- [Return false instead of segfaulting when checking for default port](https://github.com/libgit2/libgit2/pull/5621) +- [deps: ntlmclient: fix htonll for Haiku](https://github.com/libgit2/libgit2/pull/5612) +- [azure: Remove job generating documentation](https://github.com/libgit2/libgit2/pull/5615) +- [Fix crash in git_describe_commit when opts are NULL.](https://github.com/libgit2/libgit2/pull/5617) +- [Fix `git_mwindow_scan_recently_used` spuriously returning true](https://github.com/libgit2/libgit2/pull/5600) +- [zstream: handle Z_BUF_ERROR appropriately in get_output_chunk](https://github.com/libgit2/libgit2/pull/5599) +- [docs: fix typo](https://github.com/libgit2/libgit2/pull/5610) + + ## v0.28.0-alpha.1 [(2021-03-12)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.1) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.27.0...v0.28.0-alpha.1) diff --git a/package-lock.json b/package-lock.json index 8d093dedf..f62e9d730 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.1", + "version": "0.28.0-alpha.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 93eab791a..13cd9609d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.1", + "version": "0.28.0-alpha.2", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From fcc4915ff3f118366aa0fd6b15e96821ce6cebf6 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 1 Apr 2021 13:52:51 -0700 Subject: [PATCH 277/545] Bring in changes from libgit2 #5832 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 55d767df3..c6ff3fe34 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 55d767df3967b0472dec91a1148b848992f21806 +Subproject commit c6ff3fe3400c3e6fd2933badefb2ca70d2eef740 From a25279f97ca9913f205cdb2335bc3ce918d9305b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 2 Apr 2021 08:51:35 -0700 Subject: [PATCH 278/545] Bump to v0.28.0-alpha.3 --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c038a3092..1962098eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## v0.28.0-alpha.3 [(2021-04-02)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.3) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.2...v0.28.0-alpha.3) + +#### Summary of changes +- Addresses failure to open repo with empty default branch name + +#### Merged PRs into NodeGit +- [Bring in changes from libgit2 #5832 #1832](https://github.com/nodegit/nodegit/pull/1832) + +#### Cherrypicked PRs into Libgit2 +- [Default to GIT_BRANCH_DEFAULT if init.defaultBranch is empty string #5832](https://github.com/libgit2/libgit2/pull/5832) + + ## v0.28.0-alpha.2 [(2021-03-31)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.2) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.1...v0.28.0-alpha.2) diff --git a/package-lock.json b/package-lock.json index f62e9d730..b63ce6f2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.2", + "version": "0.28.0-alpha.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 13cd9609d..c2e691fa1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.2", + "version": "0.28.0-alpha.3", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From eaf788ee8325c0a43048ba283289bb031f4931e7 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 1 Apr 2021 16:53:01 -0700 Subject: [PATCH 279/545] Workaround: Prevent objectwrap from being cleaned up during async work We're seeing some super weird behavior where an object that was persisted is being cleaned up during async work. We need to workaround this issue, as we are reasonably certain that our persistent references are well formed. We suspect this is an issue with v8 itself rather than an issue with our code. We are now aggressively preventing GC from calling the objectwrap destructor until the objectwrap is no longer in use. --- generate/templates/filters/args_info.js | 11 +++++ generate/templates/filters/fields_info.js | 13 +++++- .../templates/manual/include/async_worker.h | 6 +++ .../manual/include/nodegit_wrapper.h | 12 +++++- generate/templates/manual/src/async_worker.cc | 11 +++++ .../templates/manual/src/nodegit_wrapper.cc | 22 ++++++++++ generate/templates/partials/async_function.cc | 40 ++++++++++++++++++- .../templates/partials/field_accessors.cc | 17 +++++++- test/tests/revwalk.js | 4 +- 9 files changed, 130 insertions(+), 6 deletions(-) diff --git a/generate/templates/filters/args_info.js b/generate/templates/filters/args_info.js index 0c05c30eb..4f7ed6580 100644 --- a/generate/templates/filters/args_info.js +++ b/generate/templates/filters/args_info.js @@ -1,3 +1,11 @@ +var bannedCppClassNames = [ + "Buffer", + "Function", + "GitBuf", + "GitStrarray", + "Wrapper" +]; + module.exports = function(args) { var result = [], cArg, @@ -20,6 +28,9 @@ module.exports = function(args) { arg.isCppClassStringOrArray = ~["String", "Array"].indexOf(arg.cppClassName); arg.isConst = ~arg.cType.indexOf("const "); + arg.isUnwrappable = arg.isLibgitType && !arg.isEnum && + !bannedCppClassNames.includes(arg.cppClassName); + // if we have a callback then we also need the corresponding payload for that callback if (arg.isCallbackFunction) { var payload = args.filter(function(payload) { diff --git a/generate/templates/filters/fields_info.js b/generate/templates/filters/fields_info.js index 7e1e1211b..6022aab12 100644 --- a/generate/templates/filters/fields_info.js +++ b/generate/templates/filters/fields_info.js @@ -1,15 +1,26 @@ +var bannedCppClassNames = [ + "Buffer", + "Function", + "GitBuf", + "GitStrarray", + "Wrapper" +]; + module.exports = function(fields) { var result = []; - fields.forEach(function (field){ + fields.forEach(function (field, index){ var fieldInfo = {}; fieldInfo.__proto__ = field; + fieldInfo.index = index; fieldInfo.parsedName = field.name || "result"; fieldInfo.isCppClassIntType = ~["Uint32", "Int32"].indexOf(field.cppClassName); fieldInfo.parsedClassName = (field.cppClassName || '').toLowerCase() + "_t"; fieldInfo.hasOwner = !fieldInfo.selfOwned && !!fieldInfo.ownedByThis; + fieldInfo.isUnwrappable = fieldInfo.isLibgitType && !fieldInfo.isEnum && + !bannedCppClassNames.includes(fieldInfo.cppClassName); result.push(fieldInfo); }); diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index 13005040a..d4ad8d7b9 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -2,6 +2,7 @@ #define NODEGIT_ASYNC_WORKER #include +#include #include "lock_master.h" namespace nodegit { @@ -25,7 +26,12 @@ namespace nodegit { bool GetIsCancelled() const; + void Destroy() override; + + void RegisterCleanupCall(std::function cleanupCall); + private: + std::vector> cleanupCalls; bool isCancelled = false; }; } diff --git a/generate/templates/manual/include/nodegit_wrapper.h b/generate/templates/manual/include/nodegit_wrapper.h index 3d8f5a089..850aeeeb2 100644 --- a/generate/templates/manual/include/nodegit_wrapper.h +++ b/generate/templates/manual/include/nodegit_wrapper.h @@ -2,6 +2,7 @@ #define NODEGIT_WRAPPER_H #include +#include #include // the Traits template parameter supplies: @@ -33,7 +34,7 @@ class NodeGitWrapper : public Nan::ObjectWrap { // (and through a method) instead of changing selfFreeing, but that's // a separate issue. bool selfFreeing; - + const nodegit::Context *nodegitContext = nullptr; protected: @@ -63,8 +64,17 @@ class NodeGitWrapper : public Nan::ObjectWrap { public: static v8::Local New(const cType *raw, bool selfFreeing, v8::Local owner = v8::Local()); + void Reference(); + void Unreference(); + + void AddReferenceCallbacks(size_t, std::function, std::function); + cType *GetValue(); void ClearValue(); + +private: + std::unordered_map> referenceCallbacks; + std::unordered_map> unreferenceCallbacks; }; #endif diff --git a/generate/templates/manual/src/async_worker.cc b/generate/templates/manual/src/async_worker.cc index 26a07b098..0ce104363 100644 --- a/generate/templates/manual/src/async_worker.cc +++ b/generate/templates/manual/src/async_worker.cc @@ -21,4 +21,15 @@ namespace nodegit { bool AsyncWorker::GetIsCancelled() const { return isCancelled; } + + void AsyncWorker::Destroy() { + std::for_each(cleanupCalls.begin(), cleanupCalls.end(), [](std::function cleanupCall) { + cleanupCall(); + }); + Nan::AsyncWorker::Destroy(); + } + + void AsyncWorker::RegisterCleanupCall(std::function cleanupCall) { + cleanupCalls.push_back(cleanupCall); + } } diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index 2eb295a80..c08aec610 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -124,3 +124,25 @@ void NodeGitWrapper::InitializeTemplate(v8::Local Nan::SetMethod(tpl, "getSelfFreeingInstanceCount", GetSelfFreeingInstanceCount); Nan::SetMethod(tpl, "getNonSelfFreeingConstructedCount", GetNonSelfFreeingConstructedCount); } + +template +void NodeGitWrapper::Reference() { + Ref(); + for (auto &i : referenceCallbacks) { + i.second(); + } +} + +template +void NodeGitWrapper::Unreference() { + Unref(); + for (auto &i : unreferenceCallbacks) { + i.second(); + } +} + +template +void NodeGitWrapper::AddReferenceCallbacks(size_t fieldIndex, std::function refCb, std::function unrefCb) { + referenceCallbacks[fieldIndex] = refCb; + unreferenceCallbacks[fieldIndex] = unrefCb; +} diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 6cc47b09b..d9fe25f74 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -69,9 +69,45 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%if not arg.isReturn %} {%if arg.isSelf %} worker->SaveToPersistent("{{ arg.name }}", info.This()); + { + auto objectWrapPointer = Nan::ObjectWrap::Unwrap<{{ arg.cppClassName }}>(info.This()); + objectWrapPointer->Reference(); + worker->RegisterCleanupCall([objectWrapPointer]() { + objectWrapPointer->Unreference(); + }); + } {%elsif not arg.isCallbackFunction %} - if (!info[{{ arg.jsArg }}]->IsUndefined() && !info[{{ arg.jsArg }}]->IsNull()) - worker->SaveToPersistent("{{ arg.name }}", Nan::To(info[{{ arg.jsArg }}]).ToLocalChecked()); + worker->SaveToPersistent("{{ arg.name }}", info[{{ arg.jsArg }}]); + {%if arg.isUnwrappable %} + { + auto unwrap = info[{{ arg.jsArg }}]; + if (!unwrap->IsUndefined() && !unwrap->IsNull()) { + {% if arg.cppClassName == "Array" %} + auto unwrapArray = v8::Local::Cast(info[{{ arg.jsArg }}]); + for (uint32_t i = 0; i < unwrapArray->Length(); ++i) { + v8::Local arrayValue = Nan::Get(unwrapArray, i).ToLocalChecked(); + if (!arrayValue->IsString()) { // Don't cast a string-oid + auto objectWrapPointer = Nan::ObjectWrap::Unwrap<{{ arg.arrayElementCppClassName }}>( + Nan::Get(unwrapArray, i).ToLocalChecked().As() + ); + objectWrapPointer->Reference(); + worker->RegisterCleanupCall([objectWrapPointer]() { + objectWrapPointer->Unreference(); + }); + } + } + {% else %} + if (!info[{{ arg.jsArg }}]->IsString()) { // Don't cast a string-oid + auto objectWrapPointer = Nan::ObjectWrap::Unwrap<{{ arg.cppClassName }}>(info[{{ arg.jsArg }}].As()); + objectWrapPointer->Reference(); + worker->RegisterCleanupCall([objectWrapPointer]() { + objectWrapPointer->Unreference(); + }); + } + {% endif %} + } + } + {% endif %} {%endif%} {%endif%} {%endeach%} diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 26f52ef4d..ad2df9f6d 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -43,7 +43,22 @@ wrapper->{{ field.name }}.Reset({{ field.name }}); - wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}{% if field.cppClassName == 'GitStrarray' %}StrArrayConverter::Convert(Nan::To({{ field.name }}).ToLocalChecked()){% else %}Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(Nan::To({{ field.name }}).ToLocalChecked())->GetValue(){% endif %}; + {% if field.cppClassName == 'GitStrarray' %} + wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}StrArrayConverter::Convert({{ field.name }}); + {% else %} + auto wrappedObject = Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>({{ field.name }}); + wrapper->raw->{{ field.name }} = {% if not field.cType | isPointer %}*{% endif %}wrappedObject->GetValue(); + {%-- We are assuming that users are responsible enough to not replace fields on their structs mid-operation, and would rather build out code to prevent that than be smarter here --%} + wrapper->AddReferenceCallbacks( + {{ field.index }}, + [wrappedObject]() { + wrappedObject->Reference(); + }, + [wrappedObject]() { + wrappedObject->Unreference(); + } + ); + {% endif %} {% elsif field.isCallbackFunction %} Nan::Callback *callback = NULL; diff --git a/test/tests/revwalk.js b/test/tests/revwalk.js index 702bf35cf..bb1cd06ee 100644 --- a/test/tests/revwalk.js +++ b/test/tests/revwalk.js @@ -345,7 +345,9 @@ describe("Revwalk", function() { var test = this; return leakTest(NodeGit.Revwalk, function() { - return Promise.resolve(NodeGit.Revwalk.create(test.repository)); + const walker = test.repository.createRevWalk(); + walker.push("115d114e2c4d5028c7a78428f16a4528c51be7dd"); + return walker.next(); }); }); From efaee68b8f2b511e7e93a533d0ed11be89b8f277 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 7 Apr 2021 12:42:17 -0700 Subject: [PATCH 280/545] Extend to non-generated code templates --- generate/templates/manual/clone/clone.cc | 10 ++--- .../manual/commit/extract_signature.cc | 4 +- generate/templates/manual/filter_list/load.cc | 12 +---- .../templates/manual/filter_source/repo.cc | 2 +- .../templates/manual/include/async_worker.h | 37 +++++++++++++++ .../manual/patches/convenient_patches.cc | 2 +- generate/templates/manual/remote/ls.cc | 2 +- .../manual/repository/get_references.cc | 2 +- .../manual/repository/get_remotes.cc | 2 +- .../manual/repository/get_submodules.cc | 2 +- .../manual/repository/refresh_references.cc | 2 +- .../templates/manual/revwalk/commit_walk.cc | 2 +- .../templates/manual/revwalk/fast_walk.cc | 2 +- .../manual/revwalk/file_history_walk.cc | 2 +- generate/templates/partials/async_function.cc | 45 ++++--------------- 15 files changed, 64 insertions(+), 64 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index a75ecb134..e3eba6e32 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -79,12 +79,10 @@ NAN_METHOD(GitClone::Clone) { new Nan::Callback(v8::Local::Cast(info[3])); CloneWorker *worker = new CloneWorker(baton, callback); - if (!info[0]->IsUndefined() && !info[0]->IsNull()) - worker->SaveToPersistent("url", Nan::To(info[0]).ToLocalChecked()); - if (!info[1]->IsUndefined() && !info[1]->IsNull()) - worker->SaveToPersistent("local_path", Nan::To(info[1]).ToLocalChecked()); - if (!info[2]->IsUndefined() && !info[2]->IsNull()) - worker->SaveToPersistent("options", Nan::To(info[2]).ToLocalChecked()); + worker->SaveToPersistent("url", info[0]); + worker->SaveToPersistent("local_path", info[1]); + worker->SaveToPersistent("options", info[2]); + worker->Reference("options", info[2]); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index acad88e54..c0afe77ec 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -65,8 +65,8 @@ NAN_METHOD(GitCommit::ExtractSignature) } ExtractSignatureWorker *worker = new ExtractSignatureWorker(baton, callback); - worker->SaveToPersistent("repo", Nan::To(info[0]).ToLocalChecked()); - worker->SaveToPersistent("commit_id", Nan::To(info[1]).ToLocalChecked()); + worker->Reference("repo", info[0]); + worker->Reference("commit_id", info[1]); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 253d61e06..eb04b4b67 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -92,16 +92,8 @@ NAN_METHOD(GitFilterList::Load) { new Nan::Callback(v8::Local::Cast(info[5])); LoadWorker *worker = new LoadWorker(baton, callback); - if (!info[0]->IsUndefined() && !info[0]->IsNull()) - worker->SaveToPersistent("repo", Nan::To(info[0]).ToLocalChecked()); - if (!info[1]->IsUndefined() && !info[1]->IsNull()) - worker->SaveToPersistent("blob", Nan::To(info[1]).ToLocalChecked()); - if (!info[2]->IsUndefined() && !info[2]->IsNull()) - worker->SaveToPersistent("path", Nan::To(info[2]).ToLocalChecked()); - if (!info[3]->IsUndefined() && !info[3]->IsNull()) - worker->SaveToPersistent("mode", Nan::To(info[3]).ToLocalChecked()); - if (!info[4]->IsUndefined() && !info[4]->IsNull()) - worker->SaveToPersistent("flags", Nan::To(info[4]).ToLocalChecked()); + worker->Reference("repo", info[0]); + worker->Reference("blob", info[1]); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index 2ca9f5f47..6d3392144 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -21,7 +21,7 @@ NAN_METHOD(GitFilterSource::Repo) { Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[0])); RepoWorker *worker = new RepoWorker(baton, callback); - worker->SaveToPersistent("src", info.This()); + worker->Reference("src", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index d4ad8d7b9..83622d9de 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -30,6 +30,43 @@ namespace nodegit { void RegisterCleanupCall(std::function cleanupCall); + template + void Reference(v8::Local item) { + if (item->IsString() || item->IsNull() || item->IsUndefined()) { + return; + } + + auto objectWrapPointer = Nan::ObjectWrap::Unwrap(item.As()); + objectWrapPointer->Reference(); + RegisterCleanupCall([objectWrapPointer]() { + objectWrapPointer->Unreference(); + }); + } + + template + inline void Reference(const char *label, v8::Local item) { + SaveToPersistent(label, item); + Reference(item); + } + + template + inline void Reference(const char *label, v8::Local item) { + SaveToPersistent(label, item); + Reference(item); + } + + template + inline void Reference(const char *label, v8::Local array) { + SaveToPersistent(label, array); + for (uint32_t i = 0; i < array->Length(); ++i) { + Reference(Nan::Get(array, i).ToLocalChecked()); + } + } + + inline void Reference(const char *label, v8::Local item) { + SaveToPersistent(label, item); + } + private: std::vector> cleanupCalls; bool isCancelled = false; diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index 2e6f1ae92..f518d77e0 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -19,7 +19,7 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); ConvenientFromDiffWorker *worker = new ConvenientFromDiffWorker(baton, callback); - worker->SaveToPersistent("diff", info[0]); + worker->Reference("diff", info[0]); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 75a7ffed4..cfcec31d6 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -13,7 +13,7 @@ NAN_METHOD(GitRemote::ReferenceList) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); ReferenceListWorker *worker = new ReferenceListWorker(baton, callback); - worker->SaveToPersistent("remote", info.This()); + worker->Reference("remote", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index b868bc422..7fda66a41 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -13,7 +13,7 @@ NAN_METHOD(GitRepository::GetReferences) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); GetReferencesWorker *worker = new GetReferencesWorker(baton, callback); - worker->SaveToPersistent("repo", info.This()); + worker->Reference("repo", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 6e3a398ab..30f0d494a 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -13,7 +13,7 @@ NAN_METHOD(GitRepository::GetRemotes) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); GetRemotesWorker *worker = new GetRemotesWorker(baton, callback); - worker->SaveToPersistent("repo", info.This()); + worker->Reference("repo", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 5d3e07998..71238c981 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -13,7 +13,7 @@ NAN_METHOD(GitRepository::GetSubmodules) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); GetSubmodulesWorker *worker = new GetSubmodulesWorker(baton, callback); - worker->SaveToPersistent("repo", info.This()); + worker->Reference("repo", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index acb7156d4..aa49e96c7 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -405,7 +405,7 @@ NAN_METHOD(GitRepository::RefreshReferences) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback); - worker->SaveToPersistent("repo", info.This()); + worker->Reference("repo", info.This()); worker->SaveToPersistent("signatureType", signatureType); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index e99543d52..7f35bee01 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -143,7 +143,7 @@ NAN_METHOD(GitRevwalk::CommitWalk) { baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1]->IsFunction() ? info[1] : info[2])); CommitWalkWorker *worker = new CommitWalkWorker(baton, callback); - worker->SaveToPersistent("commitWalk", info.This()); + worker->Reference("commitWalk", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 989ed15c0..ed56e6afa 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -19,7 +19,7 @@ NAN_METHOD(GitRevwalk::FastWalk) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); FastWalkWorker *worker = new FastWalkWorker(baton, callback); - worker->SaveToPersistent("fastWalk", info.This()); + worker->Reference("fastWalk", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 850e5d309..6fa7edf7e 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -205,7 +205,7 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[2])); FileHistoryWalkWorker *worker = new FileHistoryWalkWorker(baton, callback); - worker->SaveToPersistent("fileHistoryWalk", info.This()); + worker->Reference("fileHistoryWalk", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index d9fe25f74..a75c42560 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -68,45 +68,18 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%each args|argsInfo as arg %} {%if not arg.isReturn %} {%if arg.isSelf %} - worker->SaveToPersistent("{{ arg.name }}", info.This()); - { - auto objectWrapPointer = Nan::ObjectWrap::Unwrap<{{ arg.cppClassName }}>(info.This()); - objectWrapPointer->Reference(); - worker->RegisterCleanupCall([objectWrapPointer]() { - objectWrapPointer->Unreference(); - }); - } + worker->Reference<{{ arg.cppClassName }}>("{{ arg.name }}", info.This()); {%elsif not arg.isCallbackFunction %} - worker->SaveToPersistent("{{ arg.name }}", info[{{ arg.jsArg }}]); {%if arg.isUnwrappable %} - { - auto unwrap = info[{{ arg.jsArg }}]; - if (!unwrap->IsUndefined() && !unwrap->IsNull()) { - {% if arg.cppClassName == "Array" %} - auto unwrapArray = v8::Local::Cast(info[{{ arg.jsArg }}]); - for (uint32_t i = 0; i < unwrapArray->Length(); ++i) { - v8::Local arrayValue = Nan::Get(unwrapArray, i).ToLocalChecked(); - if (!arrayValue->IsString()) { // Don't cast a string-oid - auto objectWrapPointer = Nan::ObjectWrap::Unwrap<{{ arg.arrayElementCppClassName }}>( - Nan::Get(unwrapArray, i).ToLocalChecked().As() - ); - objectWrapPointer->Reference(); - worker->RegisterCleanupCall([objectWrapPointer]() { - objectWrapPointer->Unreference(); - }); - } - } - {% else %} - if (!info[{{ arg.jsArg }}]->IsString()) { // Don't cast a string-oid - auto objectWrapPointer = Nan::ObjectWrap::Unwrap<{{ arg.cppClassName }}>(info[{{ arg.jsArg }}].As()); - objectWrapPointer->Reference(); - worker->RegisterCleanupCall([objectWrapPointer]() { - objectWrapPointer->Unreference(); - }); - } - {% endif %} + {% if arg.cppClassName == "Array" %} + if (info[{{ arg.jsArg }}]->IsArray()) { + worker->Reference<{{ arg.arrayElementCppClassName }}>("{{ arg.name }}", info[{{ arg.jsArg }}].As()); } - } + {% else %} + worker->Reference<{{ arg.cppClassName }}>("{{ arg.name }}", info[{{ arg.jsArg }}]); + {% endif %} + {% else %} + worker->Reference("{{ arg.name }}", info[{{ arg.jsArg }}]); {% endif %} {%endif%} {%endif%} From 338c249389f84a9843662bad6da026324ed6bbbe Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 7 Apr 2021 12:59:47 -0700 Subject: [PATCH 281/545] Replace all uses of AsyncWorker::SaveToPersistent with Reference --- generate/templates/manual/clone/clone.cc | 6 +++--- generate/templates/manual/include/convenient_hunk.h | 3 +++ generate/templates/manual/include/convenient_patch.h | 3 +++ .../templates/manual/repository/refresh_references.cc | 2 +- generate/templates/manual/src/convenient_hunk.cc | 10 +++++++++- generate/templates/manual/src/convenient_patch.cc | 10 +++++++++- generate/templates/manual/src/filter_registry.cc | 6 +++--- 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index e3eba6e32..389289021 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -79,9 +79,9 @@ NAN_METHOD(GitClone::Clone) { new Nan::Callback(v8::Local::Cast(info[3])); CloneWorker *worker = new CloneWorker(baton, callback); - worker->SaveToPersistent("url", info[0]); - worker->SaveToPersistent("local_path", info[1]); - worker->SaveToPersistent("options", info[2]); + worker->Reference("url", info[0]); + worker->Reference("local_path", info[1]); + worker->Reference("options", info[2]); worker->Reference("options", info[2]); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); diff --git a/generate/templates/manual/include/convenient_hunk.h b/generate/templates/manual/include/convenient_hunk.h index dbdfb5c79..50f40b4d5 100644 --- a/generate/templates/manual/include/convenient_hunk.h +++ b/generate/templates/manual/include/convenient_hunk.h @@ -36,6 +36,9 @@ class ConvenientHunk : public Nan::ObjectWrap { char *GetHeader(); size_t GetSize(); + void Reference(); + void Unreference(); + private: ConvenientHunk(HunkData *hunk); ~ConvenientHunk(); diff --git a/generate/templates/manual/include/convenient_patch.h b/generate/templates/manual/include/convenient_patch.h index 148c14ff2..35aae9355 100644 --- a/generate/templates/manual/include/convenient_patch.h +++ b/generate/templates/manual/include/convenient_patch.h @@ -50,6 +50,9 @@ class ConvenientPatch : public Nan::ObjectWrap { size_t GetNumHunks(); PatchData *GetValue(); + void Reference(); + void Unreference(); + private: ConvenientPatch(PatchData *raw); ~ConvenientPatch(); diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index aa49e96c7..da9c8580e 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -406,7 +406,7 @@ NAN_METHOD(GitRepository::RefreshReferences) Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback); worker->Reference("repo", info.This()); - worker->SaveToPersistent("signatureType", signatureType); + worker->Reference("signatureType", signatureType); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc index 755783e74..e1ba23343 100644 --- a/generate/templates/manual/src/convenient_hunk.cc +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -105,7 +105,7 @@ NAN_METHOD(ConvenientHunk::Lines) { Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); LinesWorker *worker = new LinesWorker(baton, callback); - worker->SaveToPersistent("hunk", info.This()); + worker->Reference("hunk", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); @@ -201,3 +201,11 @@ NAN_METHOD(ConvenientHunk::Header) { info.GetReturnValue().Set(to); } + +void ConvenientHunk::Reference() { + Ref(); +} + +void ConvenientHunk::Unreference() { + Unref(); +} diff --git a/generate/templates/manual/src/convenient_patch.cc b/generate/templates/manual/src/convenient_patch.cc index 99096a390..f60f53257 100644 --- a/generate/templates/manual/src/convenient_patch.cc +++ b/generate/templates/manual/src/convenient_patch.cc @@ -221,7 +221,7 @@ NAN_METHOD(ConvenientPatch::Hunks) { Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); HunksWorker *worker = new HunksWorker(baton, callback); - worker->SaveToPersistent("patch", info.This()); + worker->Reference("patch", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); @@ -420,3 +420,11 @@ NAN_METHOD(ConvenientPatch::IsConflicted) { to = Nan::New(Nan::ObjectWrap::Unwrap(info.This())->GetStatus() == GIT_DELTA_CONFLICTED); info.GetReturnValue().Set(to); } + +void ConvenientPatch::Reference() { + Ref(); +} + +void ConvenientPatch::Unreference() { + Unref(); +} diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 734f20c1a..b8cc946f6 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -71,8 +71,8 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); RegisterWorker *worker = new RegisterWorker(baton, callback); - worker->SaveToPersistent("filter_name", Nan::To(info[0]).ToLocalChecked()); - worker->SaveToPersistent("filter_priority", Nan::To(info[2]).ToLocalChecked()); + worker->Reference("filter_name", info[0]); + worker->Reference("filter_priority", info[2]); nodegitContext->QueueWorker(worker); return; @@ -177,7 +177,7 @@ NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); UnregisterWorker *worker = new UnregisterWorker(baton, callback); - worker->SaveToPersistent("filter_name", info[0]); + worker->Reference("filter_name", info[0]); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); From f7c1e07f4c6730e1c711ab41d2a86c2d628f0132 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Wed, 7 Apr 2021 15:11:14 -0700 Subject: [PATCH 282/545] Bump to v0.28.0-alpha.4 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1962098eb..11cacc076 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.28.0-alpha.4 [(2021-04-07)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.4) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.3...v0.28.0-alpha.4) + +#### Summary of changes +- Introduces harder safeguards on persistent references to prevent garbage collection during async work + +#### Merged PRs into NodeGit +- [Workaround: Prevent objectwrap from being cleaned up during async work #1833](https://github.com/nodegit/nodegit/pull/1833) + + ## v0.28.0-alpha.3 [(2021-04-02)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.3) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.2...v0.28.0-alpha.3) diff --git a/package-lock.json b/package-lock.json index b63ce6f2b..b339fbd61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.3", + "version": "0.28.0-alpha.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c2e691fa1..f96088eae 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.3", + "version": "0.28.0-alpha.4", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 63fe51fd5d05cbb16d803cf3194f8aba9d75b470 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 9 Apr 2021 10:24:44 -0700 Subject: [PATCH 283/545] Update multithreaded checkout in libgit2 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index c6ff3fe34..7617d1f8a 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit c6ff3fe3400c3e6fd2933badefb2ca70d2eef740 +Subproject commit 7617d1f8a34f84498e86d6b500ccb4c077816eea From e2e0289f9c7e85e83f14c7d1a8afa65e18ff91e0 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 9 Apr 2021 15:51:50 -0700 Subject: [PATCH 284/545] Bump to v0.28.0-alpha.5 --- CHANGELOG.md | 15 +++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11cacc076..39fea7835 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Change Log +## v0.28.0-alpha.5 [(2021-04-09)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.5) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.4...v0.28.0-alpha.5) + +#### Summary of changes +- Fixes crash in multithreaded checkout in fork of libgit2 + +#### Merged PRs into NodeGit +- [Update multithreaded checkout in libgit2 #1834](https://github.com/nodegit/nodegit/pull/1834) + +#### Merged PRs into Libgit2 +- [Default to GIT_BRANCH_DEFAULT if init.defaultBranch is empty string](https://github.com/libgit2/libgit2/pull/5832) +- [Remove duplicate line, in example code](https://github.com/libgit2/libgit2/pull/5821) + + ## v0.28.0-alpha.4 [(2021-04-07)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.4) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.3...v0.28.0-alpha.4) diff --git a/package-lock.json b/package-lock.json index b339fbd61..dd4428ad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.4", + "version": "0.28.0-alpha.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f96088eae..8e01bacab 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.4", + "version": "0.28.0-alpha.5", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 4f606bf3b2e5bc83f3ebc275a689bfb55791652b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Bj=C3=B6rklund?= Date: Wed, 14 Apr 2021 16:12:52 +0200 Subject: [PATCH 285/545] Define optional arguments for Patch.fromBlobs() According to the libgit2 documentation (https://libgit2.org/libgit2/#HEAD/group/patch/git_patch_from_blobs) all arguments are allowed to be NULL. --- generate/input/descriptor.json | 23 +++++++++++++++++++++++ lib/patch.js | 25 +++++++++++++++++++++++++ test/tests/patch.js | 22 ++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 lib/patch.js diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index c6a400901..723eaaa17 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2743,6 +2743,29 @@ "git_patch_free": { "ignore": true }, + "git_patch_from_blobs": { + "isAsync": true, + "args": { + "out": { + "isReturn": true + }, + "old_blob": { + "isOptional": true + }, + "old_as_path": { + "isOptional": true + }, + "new_blob": { + "isOptional": true + }, + "new_as_path": { + "isOptional": true + }, + "opts": { + "isOptional": true + } + } + }, "git_patch_from_blob_and_buffer": { "ignore": true }, diff --git a/lib/patch.js b/lib/patch.js new file mode 100644 index 000000000..48b81eb81 --- /dev/null +++ b/lib/patch.js @@ -0,0 +1,25 @@ +"use strict"; + +var NodeGit = require("../"); +var Patch = NodeGit.Patch; +var normalizeOptions = NodeGit.Utils.normalizeOptions; + +var _fromBlobs = Patch.fromBlobs; + +Patch.fromBlobs = function ( + old_blob, + old_as_path, + new_blob, + new_as_path, + opts +) { + opts = normalizeOptions(opts, NodeGit.DiffOptions); + return _fromBlobs.call( + this, + old_blob, + old_as_path, + new_blob, + new_as_path, + opts + ); +}; diff --git a/test/tests/patch.js b/test/tests/patch.js index 158685a08..ba56c870b 100644 --- a/test/tests/patch.js +++ b/test/tests/patch.js @@ -61,4 +61,26 @@ describe("Patch", function() { }); }); + + it("can generate patch from blobs", async function() { + // Generates a patch for README.md from commit fce88902e66c72b5b93e75bdb5ae717038b221f6 + const file = "README.md"; + + const blob = await NodeGit.Blob.lookup(this.repository, "b252f396b17661462372f78b7bcfc403b8731aaa"); + const oldBlob = await NodeGit.Blob.lookup(this.repository, "b8d014998072c3f9e4b7eba8486011e80d8de98a"); + const patch = await NodeGit.Patch.fromBlobs(oldBlob, file, blob, file); + + assert.strictEqual(patch.size(0, 0, 0), 254); + }); + + it ("can generate patch from blobs without 'old_blob'", async function() { + // Generates a patch for README.md from commit fce88902e66c72b5b93e75bdb5ae717038b221f6 + // without old_blob. Should show all lines as additions. + const file = "README.md"; + + const blob = await NodeGit.Blob.lookup(this.repository, "b252f396b17661462372f78b7bcfc403b8731aaa"); + const patch = await NodeGit.Patch.fromBlobs(null, file, blob, file); + + assert.strictEqual(patch.size(0, 0, 0), 8905); + }); }); From 4e1fef5197b007c2faa8a09d89e28f584a55e0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Bj=C3=B6rklund?= Date: Wed, 14 Apr 2021 18:03:42 +0200 Subject: [PATCH 286/545] Adjust test according to lint rules --- test/tests/patch.js | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/test/tests/patch.js b/test/tests/patch.js index ba56c870b..b9cdf58fa 100644 --- a/test/tests/patch.js +++ b/test/tests/patch.js @@ -62,25 +62,41 @@ describe("Patch", function() { }); - it("can generate patch from blobs", async function() { - // Generates a patch for README.md from commit fce88902e66c72b5b93e75bdb5ae717038b221f6 + it("can generate patch from blobs", function() { + // Generates a patch for README.md from commit + // fce88902e66c72b5b93e75bdb5ae717038b221f6 const file = "README.md"; - const blob = await NodeGit.Blob.lookup(this.repository, "b252f396b17661462372f78b7bcfc403b8731aaa"); - const oldBlob = await NodeGit.Blob.lookup(this.repository, "b8d014998072c3f9e4b7eba8486011e80d8de98a"); - const patch = await NodeGit.Patch.fromBlobs(oldBlob, file, blob, file); - - assert.strictEqual(patch.size(0, 0, 0), 254); + NodeGit.Blob.lookup( + this.repository, + "b252f396b17661462372f78b7bcfc403b8731aaa" + ).then(blob => { + NodeGit.Blob.lookup( + this.repository, + "b8d014998072c3f9e4b7eba8486011e80d8de98a" + ).then(oldBlob => { + NodeGit.Patch.fromBlobs(oldBlob, file, blob, file) + .then(patch => { + assert.strictEqual(patch.size(0, 0, 0), 254); + }); + }); + }); }); - it ("can generate patch from blobs without 'old_blob'", async function() { - // Generates a patch for README.md from commit fce88902e66c72b5b93e75bdb5ae717038b221f6 - // without old_blob. Should show all lines as additions. + it ("can generate patch from blobs without 'old_blob'", function() { + // Generates a patch for README.md from commit + // fce88902e66c72b5b93e75bdb5ae717038b221f6 without + // old_blob. Should show all lines as additions. const file = "README.md"; - const blob = await NodeGit.Blob.lookup(this.repository, "b252f396b17661462372f78b7bcfc403b8731aaa"); - const patch = await NodeGit.Patch.fromBlobs(null, file, blob, file); - - assert.strictEqual(patch.size(0, 0, 0), 8905); + NodeGit.Blob.lookup( + this.repository, + "b252f396b17661462372f78b7bcfc403b8731aaa" + ).then(blob => { + NodeGit.Patch.fromBlobs(null, file, blob, file) + .then(patch => { + assert.strictEqual(patch.size(0, 0, 0), 8905); + }); + }); }); }); From 3d0ed26096356cf180e02b3162125f9227b7a0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Bj=C3=B6rklund?= Date: Wed, 14 Apr 2021 18:44:36 +0200 Subject: [PATCH 287/545] Test calling Patch.fromBlobs() without arguments --- test/tests/patch.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/tests/patch.js b/test/tests/patch.js index b9cdf58fa..06da2ab91 100644 --- a/test/tests/patch.js +++ b/test/tests/patch.js @@ -83,7 +83,7 @@ describe("Patch", function() { }); }); - it ("can generate patch from blobs without 'old_blob'", function() { + it("can generate patch from blobs without 'old_blob'", function() { // Generates a patch for README.md from commit // fce88902e66c72b5b93e75bdb5ae717038b221f6 without // old_blob. Should show all lines as additions. @@ -99,4 +99,11 @@ describe("Patch", function() { }); }); }); + + it("can generate patch from blobs without arguments", function() { + NodeGit.Patch.fromBlobs() + .then(patch => { + assert.strictEqual(patch.size(0, 0, 0), 0); + }); + }); }); From a1506cb943100b0a48f736c955edee9b8365d451 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 15 Apr 2021 11:43:04 -0700 Subject: [PATCH 288/545] Do not allow static executor to be unset on executor thread --- generate/templates/manual/src/thread_pool.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 42cee5e35..e4d2473a3 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -121,6 +121,7 @@ namespace nodegit { // could make a callback on so that it can correctly queue callbacks // in the correct javascript context thread_local static Executor *executor; + thread_local static bool isExecutorThread; PostCallbackEventToOrchestratorFn postCallbackEventToOrchestrator; PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator; TakeNextTaskFn takeNextTask; @@ -144,6 +145,7 @@ namespace nodegit { void Executor::RunTaskLoop() { // Set the thread local storage so that libgit2 can pick up the current executor // for the thread. + isExecutorThread = true; executor = this; for ( ; ; ) { @@ -201,10 +203,13 @@ namespace nodegit { } void Executor::TeardownTLSOnLibgit2ChildThread() { - Executor::executor = nullptr; + if (!isExecutorThread) { + Executor::executor = nullptr; + } } thread_local Executor *Executor::executor = nullptr; + thread_local bool Executor::isExecutorThread = false; class Orchestrator { public: @@ -280,7 +285,6 @@ namespace nodegit { std::unique_ptr task; std::thread thread; Executor executor; - }; std::unique_ptr impl; From d8494e24b2c537196c3c011f9c6dd2cd4885879b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 13:47:51 -0700 Subject: [PATCH 289/545] Fix memory leak in unit tests --- test/tests/filter.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/test/tests/filter.js b/test/tests/filter.js index 995e2542f..324375fce 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -571,7 +571,6 @@ describe("Filter", function() { it("applies the filters for a path on demand", function() { var test = this; - var list; return Registry.register(filterName, { apply: function(to, from, source) { @@ -601,8 +600,7 @@ describe("Filter", function() { NodeGit.Filter.FLAG.DEFAULT ); }) - .then(function(_list) { - list = _list; + .then(function(list) { return list.applyToFile(test.repository, "README.md"); }) .then(function(content) { @@ -612,7 +610,6 @@ describe("Filter", function() { it("applies the filters to a buffer on demand", function() { var test = this; - var list; return Registry.register(filterName, { apply: function(to, from, source) { @@ -642,8 +639,7 @@ describe("Filter", function() { NodeGit.Filter.FLAG.DEFAULT ); }) - .then(function(_list) { - list = _list; + .then(function(list) { /* jshint ignore:start */ return list.applyToData(new String("garbo garbo garbo garbo")); /* jshint ignore:end */ @@ -704,6 +700,7 @@ describe("Filter", function() { }) .then(function(content) { assert.equal(content, message); + list = null; }); }); }); From 92714adc33193fb2c2637a4194b24990f31ac593 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 13:58:13 -0700 Subject: [PATCH 290/545] Introduce CleanupHandle for memory management We will need these to keep memory alive during async operations. --- generate/templates/manual/clone/clone.cc | 5 +++-- .../templates/manual/commit/extract_signature.cc | 3 ++- generate/templates/manual/filter_list/load.cc | 3 ++- generate/templates/manual/filter_source/repo.cc | 3 ++- generate/templates/manual/include/async_worker.h | 7 +++++++ .../templates/manual/include/cleanup_handle.h | 15 +++++++++++++++ generate/templates/manual/include/context.h | 9 +++++++++ .../templates/manual/include/filter_registry.h | 5 +++-- .../templates/manual/include/nodegit_wrapper.h | 5 +++++ .../manual/patches/convenient_patches.cc | 3 ++- generate/templates/manual/remote/ls.cc | 3 ++- .../templates/manual/repository/get_references.cc | 3 ++- .../templates/manual/repository/get_remotes.cc | 3 ++- .../templates/manual/repository/get_submodules.cc | 3 ++- .../manual/repository/refresh_references.cc | 3 ++- generate/templates/manual/revwalk/commit_walk.cc | 3 ++- generate/templates/manual/revwalk/fast_walk.cc | 3 ++- .../templates/manual/revwalk/file_history_walk.cc | 3 ++- generate/templates/manual/src/async_worker.cc | 4 ++++ generate/templates/manual/src/cleanup_handle.cc | 6 ++++++ generate/templates/manual/src/context.cc | 14 ++++++++++++++ generate/templates/manual/src/filter_registry.cc | 7 ++++--- generate/templates/manual/src/nodegit_wrapper.cc | 5 +++++ generate/templates/partials/async_function.cc | 6 ++++-- generate/templates/templates/binding.gyp | 1 + generate/templates/templates/class_header.h | 6 ++++-- 26 files changed, 108 insertions(+), 23 deletions(-) create mode 100644 generate/templates/manual/include/cleanup_handle.h create mode 100644 generate/templates/manual/src/cleanup_handle.cc diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 389289021..0aa40f92e 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -26,6 +26,8 @@ NAN_METHOD(GitClone::Clone) { } CloneBaton *baton = new CloneBaton(); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + std::map> cleanupHandles; baton->error_code = GIT_OK; baton->error = NULL; @@ -77,14 +79,13 @@ NAN_METHOD(GitClone::Clone) { Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[3])); - CloneWorker *worker = new CloneWorker(baton, callback); + CloneWorker *worker = new CloneWorker(baton, callback, cleanupHandles); worker->Reference("url", info[0]); worker->Reference("local_path", info[1]); worker->Reference("options", info[2]); worker->Reference("options", info[2]); - nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; } diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index c0afe77ec..33380a146 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -64,7 +64,8 @@ NAN_METHOD(GitCommit::ExtractSignature) callback = new Nan::Callback(Local::Cast(info[3])); } - ExtractSignatureWorker *worker = new ExtractSignatureWorker(baton, callback); + std::map> cleanupHandles; + ExtractSignatureWorker *worker = new ExtractSignatureWorker(baton, callback, cleanupHandles); worker->Reference("repo", info[0]); worker->Reference("commit_id", info[1]); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index eb04b4b67..52ec18cfd 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -90,7 +90,8 @@ NAN_METHOD(GitFilterList::Load) { Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[5])); - LoadWorker *worker = new LoadWorker(baton, callback); + std::map> cleanupHandles; + LoadWorker *worker = new LoadWorker(baton, callback, cleanupHandles); worker->Reference("repo", info[0]); worker->Reference("blob", info[1]); diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index 6d3392144..64a2e2a13 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -19,7 +19,8 @@ NAN_METHOD(GitFilterSource::Repo) { baton->src = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[0])); - RepoWorker *worker = new RepoWorker(baton, callback); + std::map> cleanupHandles; + RepoWorker *worker = new RepoWorker(baton, callback, cleanupHandles); worker->Reference("src", info.This()); diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index 83622d9de..b91788ab6 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -3,11 +3,15 @@ #include #include +#include +#include #include "lock_master.h" +#include "cleanup_handle.h" namespace nodegit { class AsyncWorker : public Nan::AsyncWorker { public: + AsyncWorker(Nan::Callback *callback, const char *resourceName, std::map> &cleanupHandles); AsyncWorker(Nan::Callback *callback, const char *resourceName); // This must be implemented by every async worker @@ -67,6 +71,9 @@ namespace nodegit { SaveToPersistent(label, item); } + protected: + std::map> cleanupHandles; + private: std::vector> cleanupCalls; bool isCancelled = false; diff --git a/generate/templates/manual/include/cleanup_handle.h b/generate/templates/manual/include/cleanup_handle.h new file mode 100644 index 000000000..9c843b5d3 --- /dev/null +++ b/generate/templates/manual/include/cleanup_handle.h @@ -0,0 +1,15 @@ +#ifndef NODEGIT_CLEANUP_HANDLE_H +#define NODEGIT_CLEANUP_HANDLE_H + +#include +#include + +namespace nodegit { + class CleanupHandle { + public: + CleanupHandle(); + virtual ~CleanupHandle(); + }; +} + +#endif diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 9613b032c..b45090856 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -23,6 +23,7 @@ || NODE_MODULE_VERSION == 88) #include "async_worker.h" +#include "cleanup_handle.h" #include "thread_pool.h" namespace nodegit { @@ -41,6 +42,12 @@ namespace nodegit { void SaveToPersistent(std::string key, const v8::Local &value); + void SaveCleanupHandle(std::string key, std::shared_ptr cleanupHandle); + + std::shared_ptr GetCleanupHandle(std::string key); + + std::shared_ptr RemoveCleanupHandle(std::string key); + void ShutdownThreadPool(std::unique_ptr cleanupHandle); private: @@ -54,6 +61,8 @@ namespace nodegit { // to store function templates on them. Nan::Persistent persistentStorage; + std::map> cleanupHandles; + static std::map contexts; }; diff --git a/generate/templates/manual/include/filter_registry.h b/generate/templates/manual/include/filter_registry.h index c329b33e7..9d90cab55 100644 --- a/generate/templates/manual/include/filter_registry.h +++ b/generate/templates/manual/include/filter_registry.h @@ -7,6 +7,7 @@ #include "async_baton.h" #include "async_worker.h" +#include "cleanup_handle.h" #include "context.h" #include "lock_master.h" #include "nodegit_wrapper.h" @@ -50,8 +51,8 @@ class GitFilterRegistry : public Nan::ObjectWrap { class RegisterWorker : public nodegit::AsyncWorker { public: - RegisterWorker(FilterRegisterBaton *_baton, Nan::Callback *callback) - : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Register"), baton(_baton) {}; + RegisterWorker(FilterRegisterBaton *_baton, Nan::Callback *callback, std::map> &cleanupHandles) + : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Register", cleanupHandles), baton(_baton) {}; ~RegisterWorker() {}; void Execute(); void HandleErrorCallback(); diff --git a/generate/templates/manual/include/nodegit_wrapper.h b/generate/templates/manual/include/nodegit_wrapper.h index 850aeeeb2..3ba026b8a 100644 --- a/generate/templates/manual/include/nodegit_wrapper.h +++ b/generate/templates/manual/include/nodegit_wrapper.h @@ -5,6 +5,8 @@ #include #include +#include "cleanup_handle.h" + // the Traits template parameter supplies: // typename cppClass - the C++ type of the NodeGit wrapper (e.g. GitRepository) // typename cType - the C type of the libgit2 object being wrapped (e.g. git_repository) @@ -39,6 +41,7 @@ class NodeGitWrapper : public Nan::ObjectWrap { protected: cType *raw; + std::vector> childCleanupVector; // owner of the object, in the memory management sense. only populated // when using ownedByThis, and the type doesn't have a dupFunction @@ -64,6 +67,8 @@ class NodeGitWrapper : public Nan::ObjectWrap { public: static v8::Local New(const cType *raw, bool selfFreeing, v8::Local owner = v8::Local()); + void SaveCleanupHandle(std::shared_ptr cleanupHandle); + void Reference(); void Unreference(); diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index f518d77e0..60ba1b250 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -17,7 +17,8 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { baton->out->reserve(git_diff_num_deltas(baton->diff)); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); - ConvenientFromDiffWorker *worker = new ConvenientFromDiffWorker(baton, callback); + std::map> cleanupHandles; + ConvenientFromDiffWorker *worker = new ConvenientFromDiffWorker(baton, callback, cleanupHandles); worker->Reference("diff", info[0]); diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index cfcec31d6..44bd9a8b2 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -12,7 +12,8 @@ NAN_METHOD(GitRemote::ReferenceList) baton->remote = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); - ReferenceListWorker *worker = new ReferenceListWorker(baton, callback); + std::map> cleanupHandles; + ReferenceListWorker *worker = new ReferenceListWorker(baton, callback, cleanupHandles); worker->Reference("remote", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index 7fda66a41..a68352c8a 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -12,7 +12,8 @@ NAN_METHOD(GitRepository::GetReferences) baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); - GetReferencesWorker *worker = new GetReferencesWorker(baton, callback); + std::map> cleanupHandles; + GetReferencesWorker *worker = new GetReferencesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 30f0d494a..319c22f49 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -12,7 +12,8 @@ NAN_METHOD(GitRepository::GetRemotes) baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); - GetRemotesWorker *worker = new GetRemotesWorker(baton, callback); + std::map> cleanupHandles; + GetRemotesWorker *worker = new GetRemotesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 71238c981..8d484d61f 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -12,7 +12,8 @@ NAN_METHOD(GitRepository::GetSubmodules) baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); - GetSubmodulesWorker *worker = new GetSubmodulesWorker(baton, callback); + std::map> cleanupHandles; + GetSubmodulesWorker *worker = new GetSubmodulesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index da9c8580e..ae0634605 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -404,7 +404,8 @@ NAN_METHOD(GitRepository::RefreshReferences) baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); - RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback); + std::map> cleanupHandles; + RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); worker->Reference("signatureType", signatureType); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index 7f35bee01..aecc0ac65 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -142,7 +142,8 @@ NAN_METHOD(GitRevwalk::CommitWalk) { } baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1]->IsFunction() ? info[1] : info[2])); - CommitWalkWorker *worker = new CommitWalkWorker(baton, callback); + std::map> cleanupHandles; + CommitWalkWorker *worker = new CommitWalkWorker(baton, callback, cleanupHandles); worker->Reference("commitWalk", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index ed56e6afa..2853ff39a 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -18,7 +18,8 @@ NAN_METHOD(GitRevwalk::FastWalk) baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); - FastWalkWorker *worker = new FastWalkWorker(baton, callback); + std::map> cleanupHandles; + FastWalkWorker *worker = new FastWalkWorker(baton, callback, cleanupHandles); worker->Reference("fastWalk", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 6fa7edf7e..9a680f81f 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -204,7 +204,8 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[2])); - FileHistoryWalkWorker *worker = new FileHistoryWalkWorker(baton, callback); + std::map> cleanupHandles; + FileHistoryWalkWorker *worker = new FileHistoryWalkWorker(baton, callback, cleanupHandles); worker->Reference("fileHistoryWalk", info.This()); nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); diff --git a/generate/templates/manual/src/async_worker.cc b/generate/templates/manual/src/async_worker.cc index 0ce104363..0fcaefa12 100644 --- a/generate/templates/manual/src/async_worker.cc +++ b/generate/templates/manual/src/async_worker.cc @@ -1,6 +1,10 @@ #include "../include/async_worker.h" namespace nodegit { + AsyncWorker::AsyncWorker(Nan::Callback *callback, const char *resourceName, std::map> &_cleanupHandles) + : Nan::AsyncWorker(callback, resourceName), cleanupHandles(_cleanupHandles) + {} + AsyncWorker::AsyncWorker(Nan::Callback *callback, const char *resourceName) : Nan::AsyncWorker(callback, resourceName) {} diff --git a/generate/templates/manual/src/cleanup_handle.cc b/generate/templates/manual/src/cleanup_handle.cc new file mode 100644 index 000000000..b243d4f0e --- /dev/null +++ b/generate/templates/manual/src/cleanup_handle.cc @@ -0,0 +1,6 @@ +#include "../include/cleanup_handle.h" + +namespace nodegit { + CleanupHandle::CleanupHandle() {} + CleanupHandle::~CleanupHandle() {} +} diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index bfab0e19d..ba99e7345 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -43,6 +43,10 @@ namespace nodegit { contexts.erase(isolate); } + std::shared_ptr Context::GetCleanupHandle(std::string key) { + return cleanupHandles[key]; + } + Context *Context::GetCurrentContext() { Nan::HandleScope scope; v8::Local context = Nan::GetCurrentContext(); @@ -61,12 +65,22 @@ namespace nodegit { threadPool.QueueWorker(worker); } + std::shared_ptr Context::RemoveCleanupHandle(std::string key) { + std::shared_ptr cleanupItem = cleanupHandles[key]; + cleanupHandles.erase(key); + return cleanupItem; + } + void Context::SaveToPersistent(std::string key, const v8::Local &value) { Nan::HandleScope scope; v8::Local storage = Nan::New(persistentStorage); Nan::Set(storage, Nan::New(key).ToLocalChecked(), value); } + void Context::SaveCleanupHandle(std::string key, std::shared_ptr cleanupItem) { + cleanupHandles[key] = cleanupItem; + } + void Context::ShutdownThreadPool(std::unique_ptr cleanupHandle) { threadPool.Shutdown(std::move(cleanupHandle)); } diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index b8cc946f6..3f882468e 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -6,6 +6,7 @@ extern "C" { } #include "../include/nodegit.h" +#include "../include/cleanup_handle.h" #include "../include/context.h" #include "../include/lock_master.h" #include "../include/functions/copy.h" @@ -52,6 +53,8 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { } FilterRegisterBaton *baton = new FilterRegisterBaton(); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + std::map> cleanupHandles; baton->filter = Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); @@ -63,13 +66,11 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { baton->error_code = GIT_OK; baton->filter_priority = Nan::To(info[2]).FromJust(); - nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); - Local filterRegistry = nodegitContext->GetFromPersistent("FilterRegistry").As(); Nan::Set(filterRegistry, Nan::To(info[0]).ToLocalChecked(), Nan::To(info[1]).ToLocalChecked()); Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); - RegisterWorker *worker = new RegisterWorker(baton, callback); + RegisterWorker *worker = new RegisterWorker(baton, callback, cleanupHandles); worker->Reference("filter_name", info[0]); worker->Reference("filter_priority", info[2]); diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index c08aec610..66b208c66 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -146,3 +146,8 @@ void NodeGitWrapper::AddReferenceCallbacks(size_t fieldIndex, std::funct referenceCallbacks[fieldIndex] = refCb; unreferenceCallbacks[fieldIndex] = unrefCb; } + +template +void NodeGitWrapper::SaveCleanupHandle(std::shared_ptr cleanupHandle) { + childCleanupVector.push_back(cleanupHandle); +} diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index a75c42560..5c1841888 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -17,6 +17,9 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endif%} {%endeach%} + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + std::map> cleanupHandles; + {%each args|argsInfo as arg %} {%if not arg.isReturn %} {%if arg.isSelf %} @@ -63,7 +66,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endeach%} Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[{{args|jsArgsCount}}])); - {{ cppFunctionName }}Worker *worker = new {{ cppFunctionName }}Worker(baton, callback); + {{ cppFunctionName }}Worker *worker = new {{ cppFunctionName }}Worker(baton, callback, cleanupHandles); {%each args|argsInfo as arg %} {%if not arg.isReturn %} @@ -85,7 +88,6 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endif%} {%endeach%} - nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; } diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 2f9acf366..52ee4b44e 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -57,6 +57,7 @@ "src/wrapper.cc", "src/functions/copy.cc", "src/functions/free.cc", + "src/cleanup_handle.cc", "src/convenient_patch.cc", "src/convenient_hunk.cc", "src/filter_registry.cc", diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index e828b7f89..8a638adfc 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -9,6 +9,7 @@ #include "async_baton.h" #include "async_worker.h" +#include "cleanup_handle.h" #include "context.h" #include "lock_master.h" #include "nodegit_wrapper.h" @@ -137,8 +138,9 @@ class {{ cppClassName }} : public public: {{ function.cppFunctionName }}Worker( {{ function.cppFunctionName }}Baton *_baton, - Nan::Callback *callback - ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:{{ cppClassName }}:{{ function.cppFunctionName }}") + Nan::Callback *callback, + std::map> &cleanupHandles + ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:{{ cppClassName }}:{{ function.cppFunctionName }}", cleanupHandles) , baton(_baton) {}; ~{{ function.cppFunctionName }}Worker() {}; void Execute(); From 6cdabe749a29248ca5bd8c959c6c49eb07033702 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 14:03:49 -0700 Subject: [PATCH 291/545] Introduce decoration to determine template type on args/fields --- generate/scripts/helpers.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index 2af653f63..15790983f 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -80,6 +80,13 @@ var Helpers = { }, hasConstructor: function(type, normalizedType) { + if (normalizedType && descriptor.types[normalizedType.substr(4)]) { + var descriptorEntry = descriptor.types[normalizedType.substr(4)]; + if (descriptorEntry.hasOwnProperty('hasConstructor')) { + return descriptorEntry.hasConstructor; + } + } + return type.used && type.used.needs && type.used.needs.some(function (fnName) { @@ -159,7 +166,9 @@ var Helpers = { if (libgitType) { type.isLibgitType = true; type.isEnum = libgitType.type === "enum"; - type.hasConstructor = Helpers.hasConstructor(type, normalizedType); + type.hasConstructor = Helpers.hasConstructor(libgitType, normalizedType); + type.isClassType = !type.isEnum && !type.hasConstructor; + type.isStructType = !type.isEnum && !!type.hasConstructor; // there are no enums at the struct level currently, but we still need to override function args if (type.isEnum) { From b7f43b906938d3517b0e2461a8227bfd98e90a9b Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 14:05:38 -0700 Subject: [PATCH 292/545] Introduce helper function for getting fields off object --- .../templates/manual/include/v8_helpers.h | 10 ++++++++++ generate/templates/manual/src/v8_helpers.cc | 19 +++++++++++++++++++ generate/templates/templates/binding.gyp | 1 + 3 files changed, 30 insertions(+) create mode 100644 generate/templates/manual/include/v8_helpers.h create mode 100644 generate/templates/manual/src/v8_helpers.cc diff --git a/generate/templates/manual/include/v8_helpers.h b/generate/templates/manual/include/v8_helpers.h new file mode 100644 index 000000000..184b8d31b --- /dev/null +++ b/generate/templates/manual/include/v8_helpers.h @@ -0,0 +1,10 @@ +#ifndef NODEGIT_V8_HELPERS_H +#define NODEGIT_V8_HELPERS_H + +#include + +namespace nodegit { + v8::Local safeGetField(v8::Local &containerObj, std::string fieldName); +} + +#endif diff --git a/generate/templates/manual/src/v8_helpers.cc b/generate/templates/manual/src/v8_helpers.cc new file mode 100644 index 000000000..bd97fba34 --- /dev/null +++ b/generate/templates/manual/src/v8_helpers.cc @@ -0,0 +1,19 @@ +#include "../include/v8_helpers.h" + +namespace nodegit { + v8::Local safeGetField(v8::Local &containerObject, std::string field) { + auto maybeFieldName = Nan::New(field); + if (maybeFieldName.IsEmpty()) { + v8::Local emptyResult; + return emptyResult; + } + + auto maybeRetrievedField = Nan::Get(containerObject, maybeFieldName.ToLocalChecked()); + if (maybeRetrievedField.IsEmpty()) { + v8::Local emptyResult; + return emptyResult; + } + + return maybeRetrievedField.ToLocalChecked(); + } +} diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 52ee4b44e..5f270f43f 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -64,6 +64,7 @@ "src/git_buf_converter.cc", "src/str_array_converter.cc", "src/context.cc", + "src/v8_helpers.cc", {% each %} {% if type != "enum" %} "src/{{ name }}.cc", From 6d69ab50e59e1c9dffe2a8b5565b93733e8c9496 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 14:07:47 -0700 Subject: [PATCH 293/545] Use unique_ptr in callback_wrapper --- .../manual/include/callback_wrapper.h | 26 ++++++------------- .../templates/partials/field_accessors.cc | 11 ++++---- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/generate/templates/manual/include/callback_wrapper.h b/generate/templates/manual/include/callback_wrapper.h index 0f655ed18..961d9e912 100644 --- a/generate/templates/manual/include/callback_wrapper.h +++ b/generate/templates/manual/include/callback_wrapper.h @@ -3,15 +3,16 @@ #include #include +#include using namespace v8; using namespace node; class CallbackWrapper { - Nan::Callback* jsCallback; + std::unique_ptr jsCallback; // throttling data, used for callbacks that need to be throttled - int throttle; // in milliseconds - if > 0, calls to the JS callback will be throttled + uint32_t throttle; // in milliseconds - if > 0, calls to the JS callback will be throttled uint64_t lastCallTime; // false will trigger the callback and not wait for the callback to finish @@ -20,29 +21,18 @@ class CallbackWrapper { bool waitForResult; public: - CallbackWrapper() { - jsCallback = NULL; - lastCallTime = 0; - throttle = 0; - } - - ~CallbackWrapper() { - SetCallback(NULL); - } + CallbackWrapper(): jsCallback(nullptr), throttle(0), lastCallTime(0) {} bool HasCallback() { - return jsCallback != NULL; + return jsCallback != nullptr; } Nan::Callback* GetCallback() { - return jsCallback; + return jsCallback.get(); } - void SetCallback(Nan::Callback* callback, int throttle = 0, bool waitForResult = true) { - if(jsCallback) { - delete jsCallback; - } - jsCallback = callback; + void SetCallback(std::unique_ptr callback, uint32_t throttle = 0, bool waitForResult = true) { + jsCallback = std::move(callback); this->throttle = throttle; this->waitForResult = waitForResult; } diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index ad2df9f6d..4e54b15c4 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -61,12 +61,11 @@ {% endif %} {% elsif field.isCallbackFunction %} - Nan::Callback *callback = NULL; - int throttle = {%if field.return.throttle %}{{ field.return.throttle }}{%else%}0{%endif%}; + std::unique_ptr callback; + uint32_t throttle = {%if field.return.throttle %}{{ field.return.throttle }}{%else%}0{%endif%}; bool waitForResult = true; - if (value->IsFunction()) { - callback = new Nan::Callback(value.As()); + callback.reset(new Nan::Callback(value.As())); } else if (value->IsObject()) { v8::Local object = value.As(); v8::Local callbackKey; @@ -74,7 +73,7 @@ if (!maybeObjectCallback.IsEmpty()) { v8::Local objectCallback = maybeObjectCallback.ToLocalChecked(); if (objectCallback->IsFunction()) { - callback = new Nan::Callback(objectCallback.As()); + callback.reset(new Nan::Callback(objectCallback.As())); Nan::MaybeLocal maybeObjectThrottle = Nan::Get(object, Nan::New("throttle").ToLocalChecked()); if(!maybeObjectThrottle.IsEmpty()) { @@ -97,7 +96,7 @@ wrapper->raw->{{ field.name }} = ({{ field.cType }}){{ field.name }}_cppCallback; } - wrapper->{{ field.name }}.SetCallback(callback, throttle, waitForResult); + wrapper->{{ field.name }}.SetCallback(std::move(callback), throttle, waitForResult); } {% elsif field.payloadFor %} From c884eebfe9f7f1719343694bdf07de11d6763c1c Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 14:12:31 -0700 Subject: [PATCH 294/545] Introduce new callback storage for errors in callbacks --- .../templates/manual/include/async_baton.h | 3 ++ .../templates/manual/include/async_worker.h | 4 +++ .../templates/manual/include/thread_pool.h | 4 +++ generate/templates/manual/src/async_baton.cc | 9 ++++- generate/templates/manual/src/async_worker.cc | 4 +++ generate/templates/manual/src/thread_pool.cc | 34 +++++++++++++++---- 6 files changed, 51 insertions(+), 7 deletions(-) diff --git a/generate/templates/manual/include/async_baton.h b/generate/templates/manual/include/async_baton.h index 54f580f94..4fadb30fc 100644 --- a/generate/templates/manual/include/async_baton.h +++ b/generate/templates/manual/include/async_baton.h @@ -27,6 +27,8 @@ namespace nodegit { Nan::AsyncResource *GetAsyncResource(); + void SetCallbackError(v8::Local error); + protected: void ExecuteAsyncPerform(AsyncCallback asyncCallback, AsyncCallback asyncCancelCb, CompletionCallback onCompletion); @@ -35,6 +37,7 @@ namespace nodegit { void WaitForCompletion(); Nan::AsyncResource *asyncResource; + Nan::Global &callbackErrorHandle; ThreadPool::Callback onCompletion; std::unique_ptr completedMutex; std::condition_variable completedCondition; diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index b91788ab6..60b0b05bb 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -28,6 +28,8 @@ namespace nodegit { // they should use when working with any javascript Nan::AsyncResource *GetAsyncResource(); + Nan::Global *GetCallbackErrorHandle(); + bool GetIsCancelled() const; void Destroy() override; @@ -75,8 +77,10 @@ namespace nodegit { std::map> cleanupHandles; private: + Nan::Global callbackErrorHandle; std::vector> cleanupCalls; bool isCancelled = false; + }; } diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 32d94a571..6c983ecff 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -41,6 +41,10 @@ namespace nodegit { // in the correct context. static const nodegit::Context *GetCurrentContext(); + // Same as GetCurrentAsyncResource, except used for callbacks to store errors + // for use after completion of async work + static Nan::Global *GetCurrentCallbackErrorHandle(); + // Queues a callback on the loop provided in the constructor static void PostCallbackEvent(OnPostCallbackFn onPostCallback); diff --git a/generate/templates/manual/src/async_baton.cc b/generate/templates/manual/src/async_baton.cc index f21e0f709..8078c0c45 100644 --- a/generate/templates/manual/src/async_baton.cc +++ b/generate/templates/manual/src/async_baton.cc @@ -6,7 +6,10 @@ namespace nodegit { } AsyncBaton::AsyncBaton() - : asyncResource(ThreadPool::GetCurrentAsyncResource()), completedMutex(new std::mutex), hasCompleted(false) + : asyncResource(ThreadPool::GetCurrentAsyncResource()), + callbackErrorHandle(*ThreadPool::GetCurrentCallbackErrorHandle()), + completedMutex(new std::mutex), + hasCompleted(false) {} void AsyncBaton::SignalCompletion() { @@ -23,6 +26,10 @@ namespace nodegit { return asyncResource; } + void AsyncBaton::SetCallbackError(v8::Local error) { + callbackErrorHandle.Reset(error); + } + void AsyncBaton::ExecuteAsyncPerform(AsyncCallback asyncCallback, AsyncCallback asyncCancelCb, CompletionCallback onCompletion) { auto jsCallback = [asyncCallback, this]() { asyncCallback(this); diff --git a/generate/templates/manual/src/async_worker.cc b/generate/templates/manual/src/async_worker.cc index 0fcaefa12..709e8a1e8 100644 --- a/generate/templates/manual/src/async_worker.cc +++ b/generate/templates/manual/src/async_worker.cc @@ -22,6 +22,10 @@ namespace nodegit { return async_resource; } + Nan::Global *AsyncWorker::GetCallbackErrorHandle() { + return &callbackErrorHandle; + } + bool AsyncWorker::GetIsCancelled() const { return isCancelled; } diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index e4d2473a3..e03115707 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -37,11 +37,12 @@ namespace nodegit { }; struct WorkTask : Task { - WorkTask(ThreadPool::Callback initCallback, Nan::AsyncResource *asyncResource) - : Task(WORK), asyncResource(asyncResource), callback(initCallback) + WorkTask(ThreadPool::Callback initCallback, Nan::AsyncResource *asyncResource, Nan::Global *callbackErrorHandle) + : Task(WORK), asyncResource(asyncResource), callbackErrorHandle(callbackErrorHandle), callback(initCallback) {} Nan::AsyncResource *asyncResource; + Nan::Global *callbackErrorHandle; ThreadPool::Callback callback; }; @@ -97,6 +98,8 @@ namespace nodegit { static const nodegit::Context *GetCurrentContext(); + static Nan::Global *GetCurrentCallbackErrorHandle(); + static void PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback); // Libgit2 will call this before it spawns a child thread. @@ -116,7 +119,9 @@ namespace nodegit { private: Nan::AsyncResource *currentAsyncResource; + Nan::Global *currentCallbackErrorHandle; nodegit::Context *currentContext; + // We need to populate the executor on every thread that libgit2 // could make a callback on so that it can correctly queue callbacks // in the correct javascript context @@ -135,6 +140,7 @@ namespace nodegit { nodegit::Context *context ) : currentAsyncResource(nullptr), + currentCallbackErrorHandle(nullptr), currentContext(context), postCallbackEventToOrchestrator(postCallbackEventToOrchestrator), postCompletedEventToOrchestrator(postCompletedEventToOrchestrator), @@ -157,7 +163,9 @@ namespace nodegit { WorkTask *workTask = static_cast(task.get()); currentAsyncResource = workTask->asyncResource; + currentCallbackErrorHandle = workTask->callbackErrorHandle; workTask->callback(); + currentCallbackErrorHandle = nullptr; currentAsyncResource = nullptr; postCompletedEventToOrchestrator(); @@ -188,6 +196,16 @@ namespace nodegit { return nullptr; } + Nan::Global *Executor::GetCurrentCallbackErrorHandle() { + if (executor) { + return executor->currentCallbackErrorHandle; + } + + // NOTE this should always be set when a libgit2 callback is running, + // so this case should not happen. + return nullptr; + } + void Executor::PostCallbackEvent(ThreadPool::OnPostCallbackFn onPostCallback) { if (executor) { executor->postCallbackEventToOrchestrator(onPostCallback); @@ -269,7 +287,7 @@ namespace nodegit { // The only thread safe way to pull events from executorEventsQueue std::shared_ptr TakeEventFromExecutor(); - void ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource); + void ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource, Nan::Global *callbackErrorHandle); void ScheduleShutdownTaskOnExecutor(); @@ -335,7 +353,7 @@ namespace nodegit { // when a callback is fired. We need to be on the same thread to ensure // the same thread that acquired the locks also releases them nodegit::LockMaster lock = worker->AcquireLocks(); - ScheduleWorkTaskOnExecutor(std::bind(&nodegit::AsyncWorker::Execute, worker), worker->GetAsyncResource()); + ScheduleWorkTaskOnExecutor(std::bind(&nodegit::AsyncWorker::Execute, worker), worker->GetAsyncResource(), worker->GetCallbackErrorHandle()); for ( ; ; ) { std::shared_ptr event = TakeEventFromExecutor(); if (event->type == Executor::Event::Type::COMPLETED) { @@ -411,9 +429,9 @@ namespace nodegit { taskCondition.notify_one(); } - void Orchestrator::OrchestratorImpl::ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource) { + void Orchestrator::OrchestratorImpl::ScheduleWorkTaskOnExecutor(ThreadPool::Callback callback, Nan::AsyncResource *asyncResource, Nan::Global *callbackErrorHandle) { std::lock_guard lock(*taskMutex); - task.reset(new Executor::WorkTask(callback, asyncResource)); + task.reset(new Executor::WorkTask(callback, asyncResource, callbackErrorHandle)); taskCondition.notify_one(); } @@ -728,6 +746,10 @@ namespace nodegit { return Executor::GetCurrentContext(); } + Nan::Global *ThreadPool::GetCurrentCallbackErrorHandle() { + return Executor::GetCurrentCallbackErrorHandle(); + } + void ThreadPool::Shutdown(std::unique_ptr cleanupHandle) { impl->Shutdown(std::move(cleanupHandle)); } From 660c7d900ed3d06ff68885dad6c7bbe5a2a0a45a Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 14:29:11 -0700 Subject: [PATCH 295/545] Add additional strarray converter capabilities (direct write to memory) --- .../manual/include/str_array_converter.h | 2 ++ .../templates/manual/src/str_array_converter.cc | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/generate/templates/manual/include/str_array_converter.h b/generate/templates/manual/include/str_array_converter.h index 26a82479d..d5edd6187 100644 --- a/generate/templates/manual/include/str_array_converter.h +++ b/generate/templates/manual/include/str_array_converter.h @@ -12,6 +12,8 @@ class StrArrayConverter { public: static git_strarray *Convert (v8::Local val); + static void ConvertInto(git_strarray *out, v8::Local val); + static void ConvertInto(git_strarray *out, v8::Local val); private: static git_strarray *ConvertArray(v8::Local val); diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index eb75aa41d..732f16cf2 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -62,3 +62,19 @@ git_strarray *StrArrayConverter::ConstructStrArray(int argc, char** argv) { return result; } + +void StrArrayConverter::ConvertInto(git_strarray *out, v8::Local val) { + out->count = val->Length(); + out->strings = new char *[out->count]; + for (uint32_t i = 0; i < out->count; ++i) { + Nan::Utf8String utf8String(Nan::Get(val, i).ToLocalChecked().As()); + out->strings[i] = strdup(*utf8String); + } +} + +void StrArrayConverter::ConvertInto(git_strarray *out, v8::Local val) { + Nan::Utf8String utf8String(val); + out->count = 1; + out->strings = new char *[1]; + out->strings[0] = strdup(*utf8String); +} From 9268280845b3ae0ee6dcabd1d42a85eb8627f4a3 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 16:52:07 -0700 Subject: [PATCH 296/545] Adjust supplement and descriptor for optional/struct correctness - git_worktree_*_options are structs - git_index_time is a struct - fill in optionality for various fields --- generate/input/descriptor.json | 60 ++++++++++++++++++++++++++ generate/input/libgit2-supplement.json | 14 +++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 723eaaa17..bec50adc9 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -545,6 +545,9 @@ }, "git_checkout_index": { "args": { + "index": { + "isOptional": true + }, "opts": { "isOptional": true } @@ -579,11 +582,23 @@ "cherrypick": { "functions": { "git_cherrypick": { + "args": { + "cherrypick_options": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true } }, + "git_cherrypick_commit": { + "args": { + "merge_options": { + "isOptional": true + } + } + }, "git_cherrypick_init_options": { "ignore": true }, @@ -2108,6 +2123,10 @@ "git2/sys/index.h" ] }, + "index_time": { + "hasConstructor": true, + "ignoreInit": true + }, "indexer": { "ignore": true }, @@ -2206,10 +2225,12 @@ "jsClassName": "Number" }, "merge_opts": { + "isOptional": true, "cType": "git_merge_options *", "cppClassName": "GitMergeOptions" }, "checkout_opts": { + "isOptional": true, "cType": "git_checkout_options *", "cppClassName": "GitCheckoutOptions" } @@ -2980,6 +3001,7 @@ "git_rebase_init": { "args": { "out": { + "isSelf": true, "ownedBy": ["repo"] }, "upstream": { @@ -3023,6 +3045,9 @@ "out": { "isSelf": true, "ownedBy": ["repo"] + }, + "opts": { + "isOptional": true } } }, @@ -3267,6 +3292,17 @@ }, "git_remote_connect": { "isAsync": true, + "args": { + "callbacks": { + "isOptional": true + }, + "proxy_opts": { + "isOptional": true + }, + "custom_headers": { + "isOptional": true + } + }, "return": { "isErrorCode": true } @@ -3281,6 +3317,9 @@ "args": { "refspecs": { "isOptional": true + }, + "opts": { + "isOptional": true } }, "isAsync": true, @@ -3312,6 +3351,9 @@ }, "git_remote_fetch": { "args": { + "opts": { + "isOptional": true + }, "reflog_message": { "isOptional": true }, @@ -3405,6 +3447,9 @@ "isErrorCode": true }, "args": { + "refspecs": { + "isOptional": true + }, "opts": { "isOptional": true } @@ -3436,6 +3481,11 @@ } }, "git_remote_upload": { + "args": { + "refspecs": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true @@ -3785,6 +3835,11 @@ "stash": { "functions": { "git_stash_apply": { + "args": { + "options": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true @@ -3809,6 +3864,11 @@ } }, "git_stash_pop": { + "args": { + "options": { + "isOptional": true + } + }, "isAsync": true, "return": { "isErrorCode": true diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 1723c4949..02eb9ccf6 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1766,7 +1766,12 @@ "type": "int", "name": "lock" } - ] + ], + "used": { + "needs": [ + "git_worktree_add_options_init" + ] + } } ], [ @@ -1782,7 +1787,12 @@ "type": "uint32_t", "name": "flags" } - ] + ], + "used": { + "needs": [ + "git_worktree_prune_options_init" + ] + } } ], [ From 026f0af38a8cf89073c906de50fe6d06ce5ae66c Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 16:35:23 -0700 Subject: [PATCH 297/545] Leverage last argument as callback, regardless of input --- generate/templates/manual/clone/clone.cc | 4 ++-- .../manual/commit/extract_signature.cc | 21 +++++-------------- generate/templates/manual/filter_list/load.cc | 4 ++-- .../templates/manual/filter_source/repo.cc | 4 ++-- .../templates/manual/include/async_worker.h | 2 +- .../manual/patches/convenient_patches.cc | 4 ++-- generate/templates/manual/remote/ls.cc | 4 ++-- .../manual/repository/get_references.cc | 4 ++-- .../manual/repository/get_remotes.cc | 4 ++-- .../manual/repository/get_submodules.cc | 4 ++-- .../manual/repository/refresh_references.cc | 4 ++-- .../templates/manual/revwalk/commit_walk.cc | 16 +++++--------- .../templates/manual/revwalk/fast_walk.cc | 4 ++-- .../manual/revwalk/file_history_walk.cc | 4 ++-- generate/templates/partials/async_function.cc | 4 ++-- .../templates/partials/convert_from_v8.cc | 2 +- 16 files changed, 36 insertions(+), 53 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 0aa40f92e..57145ab92 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -21,7 +21,7 @@ NAN_METHOD(GitClone::Clone) { return Nan::ThrowError("String local_path is required."); } - if (info.Length() == 3 || !info[3]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -78,7 +78,7 @@ NAN_METHOD(GitClone::Clone) { baton->options = from_options; Nan::Callback *callback = - new Nan::Callback(v8::Local::Cast(info[3])); + new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); CloneWorker *worker = new CloneWorker(baton, callback, cleanupHandles); worker->Reference("url", info[0]); diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index 33380a146..b42e8f188 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -8,18 +8,12 @@ NAN_METHOD(GitCommit::ExtractSignature) return Nan::ThrowError("Oid commit_id is required."); } - if (info.Length() == 2 || (info.Length() == 3 && !info[2]->IsFunction())) { - return Nan::ThrowError("Callback is required and must be a Function."); + if (info.Length() >= 4 && !info[2]->IsString() && !info[2]->IsUndefined() && !info[2]->IsNull()) { + return Nan::ThrowError("String signature_field must be a string or undefined/null."); } - if (info.Length() >= 4) { - if (!info[2]->IsString() && !info[2]->IsUndefined() && !info[2]->IsNull()) { - return Nan::ThrowError("String signature_field must be a string or undefined/null."); - } - - if (!info[3]->IsFunction()) { - return Nan::ThrowError("Callback is required and must be a Function."); - } + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); } ExtractSignatureBaton* baton = new ExtractSignatureBaton(); @@ -57,12 +51,7 @@ NAN_METHOD(GitCommit::ExtractSignature) baton->field = NULL; } - Nan::Callback *callback; - if (info[2]->IsFunction()) { - callback = new Nan::Callback(Local::Cast(info[2])); - } else { - callback = new Nan::Callback(Local::Cast(info[3])); - } + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; ExtractSignatureWorker *worker = new ExtractSignatureWorker(baton, callback, cleanupHandles); diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 52ec18cfd..25bae8f08 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -35,7 +35,7 @@ NAN_METHOD(GitFilterList::Load) { return Nan::ThrowError("Number flags is required."); } - if (info.Length() == 5 || !info[5]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -89,7 +89,7 @@ NAN_METHOD(GitFilterList::Load) { baton->flags = from_flags; Nan::Callback *callback = - new Nan::Callback(v8::Local::Cast(info[5])); + new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; LoadWorker *worker = new LoadWorker(baton, callback, cleanupHandles); diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index 64a2e2a13..f7cb98bf4 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -8,7 +8,7 @@ * @param Repository callback */ NAN_METHOD(GitFilterSource::Repo) { - if (info.Length() == 0 || !info[0]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -18,7 +18,7 @@ NAN_METHOD(GitFilterSource::Repo) { baton->error = NULL; baton->src = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[0])); + Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; RepoWorker *worker = new RepoWorker(baton, callback, cleanupHandles); diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index 60b0b05bb..bad56e056 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -38,7 +38,7 @@ namespace nodegit { template void Reference(v8::Local item) { - if (item->IsString() || item->IsNull() || item->IsUndefined()) { + if (item->IsFunction() || item->IsString() || item->IsNull() || item->IsUndefined()) { return; } diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index 60ba1b250..9d46cb3bf 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -3,7 +3,7 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { return Nan::ThrowError("Diff diff is required."); } - if (info.Length() == 1 || !info[1]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -16,7 +16,7 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { baton->out = new std::vector; baton->out->reserve(git_diff_num_deltas(baton->diff)); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; ConvenientFromDiffWorker *worker = new ConvenientFromDiffWorker(baton, callback, cleanupHandles); diff --git a/generate/templates/manual/remote/ls.cc b/generate/templates/manual/remote/ls.cc index 44bd9a8b2..97c801c62 100644 --- a/generate/templates/manual/remote/ls.cc +++ b/generate/templates/manual/remote/ls.cc @@ -1,6 +1,6 @@ NAN_METHOD(GitRemote::ReferenceList) { - if (info.Length() == 0 || !info[0]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -11,7 +11,7 @@ NAN_METHOD(GitRemote::ReferenceList) baton->out = new std::vector; baton->remote = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; ReferenceListWorker *worker = new ReferenceListWorker(baton, callback, cleanupHandles); worker->Reference("remote", info.This()); diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index a68352c8a..1db6c542f 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -1,6 +1,6 @@ NAN_METHOD(GitRepository::GetReferences) { - if (info.Length() == 0 || !info[0]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -11,7 +11,7 @@ NAN_METHOD(GitRepository::GetReferences) baton->out = new std::vector; baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; GetReferencesWorker *worker = new GetReferencesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 319c22f49..647498837 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -1,6 +1,6 @@ NAN_METHOD(GitRepository::GetRemotes) { - if (info.Length() == 0 || !info[0]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -11,7 +11,7 @@ NAN_METHOD(GitRepository::GetRemotes) baton->out = new std::vector; baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; GetRemotesWorker *worker = new GetRemotesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); diff --git a/generate/templates/manual/repository/get_submodules.cc b/generate/templates/manual/repository/get_submodules.cc index 8d484d61f..069f6bdbc 100644 --- a/generate/templates/manual/repository/get_submodules.cc +++ b/generate/templates/manual/repository/get_submodules.cc @@ -1,6 +1,6 @@ NAN_METHOD(GitRepository::GetSubmodules) { - if (info.Length() == 0 || !info[0]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -11,7 +11,7 @@ NAN_METHOD(GitRepository::GetSubmodules) baton->out = new std::vector; baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; GetSubmodulesWorker *worker = new GetSubmodulesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index ae0634605..7528601a9 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -392,7 +392,7 @@ NAN_METHOD(GitRepository::RefreshReferences) signatureType = Nan::New("gpgsig").ToLocalChecked(); } - if (info.Length() == 0 || (info.Length() == 1 && !info[0]->IsFunction()) || (info.Length() == 2 && !info[1]->IsFunction())) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -403,7 +403,7 @@ NAN_METHOD(GitRepository::RefreshReferences) baton->out = (void *)new RefreshReferencesData(); baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[0])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; RefreshReferencesWorker *worker = new RefreshReferencesWorker(baton, callback, cleanupHandles); worker->Reference("repo", info.This()); diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index aecc0ac65..a5cbbc593 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -107,18 +107,12 @@ NAN_METHOD(GitRevwalk::CommitWalk) { return Nan::ThrowError("Max count is required and must be a number."); } - if (info.Length() == 1 || (info.Length() == 2 && !info[1]->IsFunction())) { - return Nan::ThrowError("Callback is required and must be a Function."); + if (info.Length() >= 3 && !info[1]->IsNull() && !info[1]->IsUndefined() && !info[1]->IsObject()) { + return Nan::ThrowError("Options must be an object, null, or undefined."); } - if (info.Length() >= 3) { - if (!info[1]->IsNull() && !info[1]->IsUndefined() && !info[1]->IsObject()) { - return Nan::ThrowError("Options must be an object, null, or undefined."); - } - - if (!info[2]->IsFunction()) { - return Nan::ThrowError("Callback is required and must be a Function."); - } + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); } CommitWalkBaton* baton = new CommitWalkBaton(); @@ -141,7 +135,7 @@ NAN_METHOD(GitRevwalk::CommitWalk) { baton->returnPlainObjects = false; } baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1]->IsFunction() ? info[1] : info[2])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; CommitWalkWorker *worker = new CommitWalkWorker(baton, callback, cleanupHandles); worker->Reference("commitWalk", info.This()); diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index 2853ff39a..e02a84fc1 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -4,7 +4,7 @@ NAN_METHOD(GitRevwalk::FastWalk) return Nan::ThrowError("Max count is required and must be a number."); } - if (info.Length() == 1 || !info[1]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -17,7 +17,7 @@ NAN_METHOD(GitRevwalk::FastWalk) baton->out->reserve(baton->max_count); baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; FastWalkWorker *worker = new FastWalkWorker(baton, callback, cleanupHandles); worker->Reference("fastWalk", info.This()); diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 9a680f81f..fc8a17dac 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -188,7 +188,7 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) return Nan::ThrowError("Max count is required and must be a number."); } - if (info.Length() == 2 || !info[2]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -203,7 +203,7 @@ NAN_METHOD(GitRevwalk::FileHistoryWalk) baton->out->reserve(baton->max_count); baton->walk = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[2])); + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); std::map> cleanupHandles; FileHistoryWalkWorker *worker = new FileHistoryWalkWorker(baton, callback, cleanupHandles); worker->Reference("fileHistoryWalk", info.This()); diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 5c1841888..dfe5f8e77 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -2,7 +2,7 @@ {%partial doc .%} NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%partial guardArguments .%} - if (info.Length() == {{args|jsArgsCount}} || !info[{{args|jsArgsCount}}]->IsFunction()) { + if (!info[info.Length() - 1]->IsFunction()) { return Nan::ThrowError("Callback is required and must be a Function."); } @@ -65,7 +65,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endif%} {%endeach%} - Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[{{args|jsArgsCount}}])); + Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); {{ cppFunctionName }}Worker *worker = new {{ cppFunctionName }}Worker(baton, callback, cleanupHandles); {%each args|argsInfo as arg %} diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index cad28ebfc..01462281f 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -14,7 +14,7 @@ {% elsif cppClassName == 'GitBuf' %} {%-- Print nothing --%} {%else%} - if (info[{{ jsArg }}]->Is{{ cppClassName|cppToV8 }}()) { + if ((info.Length() - 1) > {{ jsArg }} && info[{{ jsArg }}]->Is{{ cppClassName|cppToV8 }}()) { {%endif%} {%endif%} {%if cppClassName == 'String'%} From 5944bbc9b06f719524388363f2bfd31a20e890ed Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 15:13:35 -0700 Subject: [PATCH 298/545] Introduce thisInfo filter for functions in templates --- generate/scripts/generateNativeCode.js | 1 + generate/templates/filters/this_info.js | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 generate/templates/filters/this_info.js diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index 44f0501a9..46205acba 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -75,6 +75,7 @@ module.exports = function generateNativeCode() { returnsCount: require("../templates/filters/returns_count"), returnsInfo: require("../templates/filters/returns_info"), subtract: require("../templates/filters/subtract"), + thisInfo: require("../templates/filters/this_info"), titleCase: require("../templates/filters/title_case"), toBool: require('../templates/filters/to_bool'), toSizeOfArray: require("../templates/filters/to_size_of_array"), diff --git a/generate/templates/filters/this_info.js b/generate/templates/filters/this_info.js new file mode 100644 index 000000000..e5d57520a --- /dev/null +++ b/generate/templates/filters/this_info.js @@ -0,0 +1,8 @@ +module.exports = function(args, fieldToRetrieve) { + const thisArg = args.find(arg => arg.isSelf); + if (thisArg) { + return thisArg[fieldToRetrieve]; + } + + return; +}; From a9da2658d13e6e88d069342b90180b47815f5296 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 23 Apr 2021 08:13:21 -0700 Subject: [PATCH 299/545] Introduce ConfigurableClasses in place of NodeGitWrapper structs - Eliminates need for normalizing options - Almost eliminates need for NodeGitWrapper in struct_content.cc - No longer depend on v8 GC to clean up options objects, they should cleanup when async work goes out of scope except in special cases. - Introduce ways to persist options objects on non-configurable classes --- generate/input/descriptor.json | 10 +- generate/scripts/generateNativeCode.js | 1 + generate/templates/filters/args_info.js | 2 +- generate/templates/manual/clone/clone.cc | 64 ++--- generate/templates/manual/filter_list/load.cc | 70 ++--- .../templates/manual/include/async_worker.h | 2 +- .../templates/manual/include/cleanup_handle.h | 5 + .../include/configurable_class_wrapper.h | 54 ++++ generate/templates/manual/include/context.h | 4 +- .../manual/include/filter_registry.h | 1 - .../templates/manual/revwalk/fast_walk.cc | 45 +--- .../templates/manual/src/filter_registry.cc | 26 +- generate/templates/partials/async_function.cc | 101 ++++--- .../partials/configurable_callbacks.cc | 208 +++++++++++++++ generate/templates/partials/traits.h | 6 + generate/templates/templates/class_header.h | 2 - generate/templates/templates/nodegit.js | 9 +- .../templates/templates/struct_content.cc | 250 +++++++++++++++++- generate/templates/templates/struct_header.h | 87 +++++- lib/blame.js | 20 -- lib/blob.js | 22 -- lib/checkout.js | 51 ---- lib/cherrypick.js | 73 ----- lib/clone.js | 33 --- lib/deprecated/structs/ApplyOptions.js | 3 + lib/deprecated/structs/BlameOptions.js | 6 + lib/deprecated/structs/BlobFilterOptions.js | 3 + lib/deprecated/structs/CheckoutOptions.js | 8 + lib/deprecated/structs/CherrypickOptions.js | 5 + lib/deprecated/structs/CloneOptions.js | 6 + .../structs/DescribeFormatOptions.js | 4 + lib/deprecated/structs/DescribeOptions.js | 6 + lib/deprecated/structs/DiffFindOptions.js | 8 + lib/deprecated/structs/DiffOptions.js | 8 + lib/deprecated/structs/FetchOptions.js | 7 + lib/deprecated/structs/MergeFileInput.js | 4 + lib/deprecated/structs/MergeFileOptions.js | 5 + lib/deprecated/structs/MergeOptions.js | 8 + lib/deprecated/structs/ProxyOptions.js | 3 + lib/deprecated/structs/PushOptions.js | 5 + lib/deprecated/structs/RebaseOptions.js | 6 + lib/deprecated/structs/RemoteCreateOptions.js | 3 + .../structs/RepositoryInitOptions.js | 4 + lib/deprecated/structs/RevertOptions.js | 5 + lib/deprecated/structs/StashApplyOptions.js | 4 + lib/deprecated/structs/StatusOptions.js | 4 + .../structs/SubmoduleUpdateOptions.js | 5 + lib/diff.js | 46 ---- lib/filter_registry.js | 3 - lib/merge.js | 6 - lib/patch.js | 25 -- lib/rebase.js | 71 +---- lib/remote.js | 225 ---------------- lib/repository.js | 9 - lib/reset.js | 25 -- lib/revert.js | 77 ------ lib/stash.js | 46 ---- lib/status.js | 4 +- lib/status_list.js | 12 - lib/submodule.js | 41 --- lib/utils/normalize_fetch_options.js | 43 --- lib/utils/normalize_options.js | 29 -- 62 files changed, 868 insertions(+), 1060 deletions(-) create mode 100644 generate/templates/manual/include/configurable_class_wrapper.h create mode 100644 generate/templates/partials/configurable_callbacks.cc delete mode 100644 lib/blame.js delete mode 100644 lib/checkout.js delete mode 100644 lib/cherrypick.js delete mode 100644 lib/clone.js create mode 100644 lib/deprecated/structs/ApplyOptions.js create mode 100644 lib/deprecated/structs/BlameOptions.js create mode 100644 lib/deprecated/structs/BlobFilterOptions.js create mode 100644 lib/deprecated/structs/CheckoutOptions.js create mode 100644 lib/deprecated/structs/CherrypickOptions.js create mode 100644 lib/deprecated/structs/CloneOptions.js create mode 100644 lib/deprecated/structs/DescribeFormatOptions.js create mode 100644 lib/deprecated/structs/DescribeOptions.js create mode 100644 lib/deprecated/structs/DiffFindOptions.js create mode 100644 lib/deprecated/structs/DiffOptions.js create mode 100644 lib/deprecated/structs/FetchOptions.js create mode 100644 lib/deprecated/structs/MergeFileInput.js create mode 100644 lib/deprecated/structs/MergeFileOptions.js create mode 100644 lib/deprecated/structs/MergeOptions.js create mode 100644 lib/deprecated/structs/ProxyOptions.js create mode 100644 lib/deprecated/structs/PushOptions.js create mode 100644 lib/deprecated/structs/RebaseOptions.js create mode 100644 lib/deprecated/structs/RemoteCreateOptions.js create mode 100644 lib/deprecated/structs/RepositoryInitOptions.js create mode 100644 lib/deprecated/structs/RevertOptions.js create mode 100644 lib/deprecated/structs/StashApplyOptions.js create mode 100644 lib/deprecated/structs/StatusOptions.js create mode 100644 lib/deprecated/structs/SubmoduleUpdateOptions.js delete mode 100644 lib/patch.js delete mode 100644 lib/revert.js delete mode 100644 lib/status_list.js delete mode 100644 lib/utils/normalize_fetch_options.js delete mode 100644 lib/utils/normalize_options.js diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index bec50adc9..e9ae6dacd 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3014,6 +3014,7 @@ "isOptional": true }, "opts": { + "preserveOnThis": true, "isOptional": true } } @@ -3047,7 +3048,8 @@ "ownedBy": ["repo"] }, "opts": { - "isOptional": true + "isOptional": true, + "preserveOnThis": true } } }, @@ -3294,10 +3296,12 @@ "isAsync": true, "args": { "callbacks": { - "isOptional": true + "isOptional": true, + "preserveOnThis": true }, "proxy_opts": { - "isOptional": true + "isOptional": true, + "preserveOnThis": true }, "custom_headers": { "isOptional": true diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index 46205acba..44fb21dec 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -26,6 +26,7 @@ module.exports = function generateNativeCode() { var partials = { asyncFunction: utils.readLocalFile("templates/partials/async_function.cc"), callbackHelpers: utils.readLocalFile("templates/partials/callback_helpers.cc"), + configurableCallbacks: utils.readLocalFile("templates/partials/configurable_callbacks.cc"), convertFromV8: utils.readLocalFile("templates/partials/convert_from_v8.cc"), convertToV8: utils.readLocalFile("templates/partials/convert_to_v8.cc"), doc: utils.readLocalFile("templates/partials/doc.cc"), diff --git a/generate/templates/filters/args_info.js b/generate/templates/filters/args_info.js index 4f7ed6580..55270102d 100644 --- a/generate/templates/filters/args_info.js +++ b/generate/templates/filters/args_info.js @@ -28,7 +28,7 @@ module.exports = function(args) { arg.isCppClassStringOrArray = ~["String", "Array"].indexOf(arg.cppClassName); arg.isConst = ~arg.cType.indexOf("const "); - arg.isUnwrappable = arg.isLibgitType && !arg.isEnum && + arg.isUnwrappable = !arg.isStructType && arg.isLibgitType && !arg.isEnum && !bannedCppClassNames.includes(arg.cppClassName); // if we have a callback then we also need the corresponding payload for that callback diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index 57145ab92..e3b0bbc14 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -29,6 +29,19 @@ NAN_METHOD(GitClone::Clone) { nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); std::map> cleanupHandles; + if (info[2]->IsNull() || info[2]->IsUndefined()) { + baton->options = nullptr; + } else { + auto conversionResult = ConfigurableGitCloneOptions::fromJavascript(nodegitContext, info[2]); + if (!conversionResult.result) { + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles["options"] = convertedObject; + baton->options = convertedObject->GetValue(); + } + baton->error_code = GIT_OK; baton->error = NULL; @@ -66,16 +79,6 @@ NAN_METHOD(GitClone::Clone) { memset((void *)(((char *)from_local_path) + local_path.length()), 0, 1); // end convert_from_v8 block baton->local_path = from_local_path; - // start convert_from_v8 block - const git_clone_options *from_options = NULL; - if (info[2]->IsObject()) { - from_options = Nan::ObjectWrap::Unwrap(Nan::To(info[2]).ToLocalChecked()) - ->GetValue(); - } else { - from_options = 0; - } - // end convert_from_v8 block - baton->options = from_options; Nan::Callback *callback = new Nan::Callback(v8::Local::Cast(info[info.Length() - 1])); @@ -83,8 +86,6 @@ NAN_METHOD(GitClone::Clone) { worker->Reference("url", info[0]); worker->Reference("local_path", info[1]); - worker->Reference("options", info[2]); - worker->Reference("options", info[2]); nodegitContext->QueueWorker(worker); return; @@ -175,42 +176,15 @@ void GitClone::CloneWorker::HandleOKCallback() { free((void *)baton->error->message); free((void *)baton->error); } else if (baton->error_code < 0) { - std::queue> workerArguments; - workerArguments.push(GetFromPersistent("url")); - workerArguments.push(GetFromPersistent("local_path")); - workerArguments.push(GetFromPersistent("options")); bool callbackFired = false; - while (!workerArguments.empty()) { - v8::Local node = workerArguments.front(); - workerArguments.pop(); - - if (!node->IsObject() || node->IsArray() || node->IsBooleanObject() || - node->IsDate() || node->IsFunction() || node->IsNumberObject() || - node->IsRegExp() || node->IsStringObject()) { - continue; - } - - v8::Local nodeObj = Nan::To(node).ToLocalChecked(); - v8::Local checkValue = GetPrivate( - nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); - - if (!checkValue.IsEmpty() && !checkValue->IsNull() && - !checkValue->IsUndefined()) { - v8::Local argv[1] = {Nan::To(checkValue).ToLocalChecked()}; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; callback->Call(1, argv, async_resource); callbackFired = true; - break; - } - - v8::Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); - for (unsigned int propIndex = 0; propIndex < properties->Length(); - ++propIndex) { - v8::Local propName = - Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); - v8::Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); - if (!nodeToQueue->IsUndefined()) { - workerArguments.push(nodeToQueue); - } } } diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index 25bae8f08..de15daabb 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -149,8 +149,6 @@ void GitFilterList::LoadWorker::HandleOKCallback() { // GitFilterList baton->filters v8::Local owners = Nan::New(0); nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); - v8::Local filterRegistry = nodegitContext->GetFromPersistent("FilterRegistry").As(); - v8::Local propertyNames = Nan::GetPropertyNames(filterRegistry).ToLocalChecked(); Nan::Set( owners, @@ -158,23 +156,18 @@ void GitFilterList::LoadWorker::HandleOKCallback() { Nan::To(this->GetFromPersistent("repo")).ToLocalChecked() ); - for (uint32_t index = 0; index < propertyNames->Length(); ++index) { - v8::Local propertyName = Nan::To(Nan::Get(propertyNames, index).ToLocalChecked()).ToLocalChecked(); - Nan::Utf8String propertyNameAsUtf8Value(propertyName); - const char *propertyNameAsCString = *propertyNameAsUtf8Value; - - bool isNotMethodOnRegistry = strcmp("register", propertyNameAsCString) - && strcmp("unregister", propertyNameAsCString); - if (isNotMethodOnRegistry && git_filter_list_contains(baton->filters, propertyNameAsCString)) { - Nan::Set( - owners, - Nan::New(owners->Length()), - Nan::Get(filterRegistry, propertyName).ToLocalChecked() - ); - } - } - to = GitFilterList::New(baton->filters, true, Nan::To(owners).ToLocalChecked()); + auto filterListWrapper = Nan::ObjectWrap::Unwrap(to.As()); + auto filterRegistryCleanupHandles = static_pointer_cast(nodegit::Context::GetCurrentContext()->GetCleanupHandle("filterRegistry")); + std::for_each( + filterRegistryCleanupHandles->registeredFilters.begin(), + filterRegistryCleanupHandles->registeredFilters.end(), + [this, &filterListWrapper](std::pair> filterCleanupHandle) { + if (git_filter_list_contains(baton->filters, filterCleanupHandle.first.c_str())) { + filterListWrapper->SaveCleanupHandle(filterCleanupHandle.second); + } + } + ); } else { to = Nan::Null(); } @@ -201,44 +194,15 @@ void GitFilterList::LoadWorker::HandleOKCallback() { free((void *)baton->error->message); free((void *)baton->error); } else if (baton->error_code < 0) { - std::queue> workerArguments; - workerArguments.push(GetFromPersistent("repo")); - workerArguments.push(GetFromPersistent("blob")); - workerArguments.push(GetFromPersistent("path")); - workerArguments.push(GetFromPersistent("mode")); - workerArguments.push(GetFromPersistent("flags")); bool callbackFired = false; - while (!workerArguments.empty()) { - v8::Local node = workerArguments.front(); - workerArguments.pop(); - - if (!node->IsObject() || node->IsArray() || node->IsBooleanObject() || - node->IsDate() || node->IsFunction() || node->IsNumberObject() || - node->IsRegExp() || node->IsStringObject()) { - continue; - } - - v8::Local nodeObj = Nan::To(node).ToLocalChecked(); - v8::Local checkValue = GetPrivate( - nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); - - if (!checkValue.IsEmpty() && !checkValue->IsNull() && - !checkValue->IsUndefined()) { - v8::Local argv[1] = {Nan::To(checkValue).ToLocalChecked()}; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; callback->Call(1, argv, async_resource); callbackFired = true; - break; - } - - v8::Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); - for (unsigned int propIndex = 0; propIndex < properties->Length(); - ++propIndex) { - v8::Local propName = - Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); - v8::Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); - if (!nodeToQueue->IsUndefined()) { - workerArguments.push(nodeToQueue); - } } } diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index bad56e056..a9acc00a2 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -75,9 +75,9 @@ namespace nodegit { protected: std::map> cleanupHandles; + Nan::Global callbackErrorHandle; private: - Nan::Global callbackErrorHandle; std::vector> cleanupCalls; bool isCancelled = false; diff --git a/generate/templates/manual/include/cleanup_handle.h b/generate/templates/manual/include/cleanup_handle.h index 9c843b5d3..442f40013 100644 --- a/generate/templates/manual/include/cleanup_handle.h +++ b/generate/templates/manual/include/cleanup_handle.h @@ -10,6 +10,11 @@ namespace nodegit { CleanupHandle(); virtual ~CleanupHandle(); }; + + class FilterRegistryCleanupHandles : public CleanupHandle { + public: + std::map> registeredFilters; + }; } #endif diff --git a/generate/templates/manual/include/configurable_class_wrapper.h b/generate/templates/manual/include/configurable_class_wrapper.h new file mode 100644 index 000000000..9c780a7db --- /dev/null +++ b/generate/templates/manual/include/configurable_class_wrapper.h @@ -0,0 +1,54 @@ +#ifndef CALLER_CONFIGURABLE_CLASS_WRAPPER_H +#define CALLER_CONFIGURABLE_CLASS_WRAPPER_H + +#include +#include +#include + +#include "cleanup_handle.h" + +namespace nodegit { + class Context; + + template + class ConfigurableClassWrapper : public CleanupHandle { + public: + typedef typename Traits::cType cType; + typedef typename Traits::configurableCppClass configurableCppClass; + + struct v8ConversionResult { + v8ConversionResult(std::string _error) + : error(_error), result(nullptr) + {} + + v8ConversionResult(std::shared_ptr _result) + : result(_result) + {} + + std::string error; + std::shared_ptr result; + }; + + // We copy the entity + ConfigurableClassWrapper(nodegit::Context *_nodeGitContext) + : nodegitContext(_nodeGitContext), raw(nullptr) {} + + virtual ~ConfigurableClassWrapper() { + if (raw != nullptr) { + delete raw; + raw = nullptr; + } + } + + const Context *nodegitContext = nullptr; + cType *GetValue() { + return raw; + } + + protected: + cType *raw; + std::vector> childCleanupVector; + }; +} + +#endif diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index b45090856..098b54bf6 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -12,7 +12,7 @@ * Determine if node module is compiled under a supported node release. * Currently 12 - 15 (ignoring pre-releases). Will need to be updated * for new major versions. - * + * * See: https://github.com/nodejs/node/issues/36349 * and: https://github.com/nodejs/node/blob/master/doc/abi_version_registry.json */ @@ -59,7 +59,7 @@ namespace nodegit { // after the context has been torn down. // Often this is used as a context-aware storage cell for `*::InitializeComponent` // to store function templates on them. - Nan::Persistent persistentStorage; + Nan::Global persistentStorage; std::map> cleanupHandles; diff --git a/generate/templates/manual/include/filter_registry.h b/generate/templates/manual/include/filter_registry.h index 9d90cab55..f636a66f3 100644 --- a/generate/templates/manual/include/filter_registry.h +++ b/generate/templates/manual/include/filter_registry.h @@ -2,7 +2,6 @@ #define GITFILTERREGISTRY_H #include #include -#include #include #include "async_baton.h" diff --git a/generate/templates/manual/revwalk/fast_walk.cc b/generate/templates/manual/revwalk/fast_walk.cc index e02a84fc1..ce2d05a2d 100644 --- a/generate/templates/manual/revwalk/fast_walk.cc +++ b/generate/templates/manual/revwalk/fast_walk.cc @@ -135,50 +135,15 @@ void GitRevwalk::FastWalkWorker::HandleOKCallback() } else if (baton->error_code < 0) { - std::queue< Local > workerArguments; bool callbackFired = false; - - while(!workerArguments.empty()) - { - Local node = workerArguments.front(); - workerArguments.pop(); - - if ( - !node->IsObject() - || node->IsArray() - || node->IsBooleanObject() - || node->IsDate() - || node->IsFunction() - || node->IsNumberObject() - || node->IsRegExp() - || node->IsStringObject() - ) - { - continue; - } - - Local nodeObj = Nan::To(node).ToLocalChecked(); - Local checkValue = GetPrivate(nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); - - if (!checkValue.IsEmpty() && !checkValue->IsNull() && !checkValue->IsUndefined()) - { - Local argv[1] = { - Nan::To(checkValue).ToLocalChecked() + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError }; callback->Call(1, argv, async_resource); callbackFired = true; - break; - } - - Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); - for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) - { - Local propName = Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); - Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); - if (!nodeToQueue->IsUndefined()) - { - workerArguments.push(nodeToQueue); - } } } diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 3f882468e..3cdc89feb 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -19,7 +19,6 @@ using namespace std; using namespace v8; using namespace node; -// #pragma unmanaged void GitFilterRegistry::InitializeComponent(v8::Local target, nodegit::Context *nodegitContext) { Nan::HandleScope scope; @@ -31,6 +30,8 @@ void GitFilterRegistry::InitializeComponent(v8::Local target, nodegi Nan::Set(target, Nan::New("FilterRegistry").ToLocalChecked(), filterRegistry); nodegitContext->SaveToPersistent("FilterRegistry", filterRegistry); + std::shared_ptr filterRegistryCleanupHandles(new nodegit::FilterRegistryCleanupHandles); + nodegitContext->SaveCleanupHandle("filterRegistry", filterRegistryCleanupHandles); } NAN_METHOD(GitFilterRegistry::GitFilterRegister) { @@ -56,7 +57,18 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); std::map> cleanupHandles; - baton->filter = Nan::ObjectWrap::Unwrap(Nan::To(info[1]).ToLocalChecked())->GetValue(); + { + auto conversionResult = ConfigurableGitFilter::fromJavascript(nodegitContext, info[1]); + if (!conversionResult.result) { + delete baton; + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles["filter"] = convertedObject; + baton->filter = convertedObject->GetValue(); + } + Nan::Utf8String name(Nan::To(info[0]).ToLocalChecked()); baton->filter_name = (char *)malloc(name.length() + 1); @@ -66,9 +78,6 @@ NAN_METHOD(GitFilterRegistry::GitFilterRegister) { baton->error_code = GIT_OK; baton->filter_priority = Nan::To(info[2]).FromJust(); - Local filterRegistry = nodegitContext->GetFromPersistent("FilterRegistry").As(); - Nan::Set(filterRegistry, Nan::To(info[0]).ToLocalChecked(), Nan::To(info[1]).ToLocalChecked()); - Nan::Callback *callback = new Nan::Callback(Local::Cast(info[3])); RegisterWorker *worker = new RegisterWorker(baton, callback, cleanupHandles); @@ -112,6 +121,7 @@ void GitFilterRegistry::RegisterWorker::HandleErrorCallback() { void GitFilterRegistry::RegisterWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { + static_pointer_cast(nodegit::Context::GetCurrentContext()->GetCleanupHandle("filterRegistry"))->registeredFilters[baton->filter_name] = cleanupHandles["filter"]; v8::Local result = Nan::New(baton->error_code); v8::Local argv[2] = { Nan::Null(), @@ -178,8 +188,6 @@ NAN_METHOD(GitFilterRegistry::GitFilterUnregister) { Nan::Callback *callback = new Nan::Callback(Local::Cast(info[1])); UnregisterWorker *worker = new UnregisterWorker(baton, callback); - worker->Reference("filter_name", info[0]); - nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); nodegitContext->QueueWorker(worker); return; @@ -218,9 +226,7 @@ void GitFilterRegistry::UnregisterWorker::HandleErrorCallback() { void GitFilterRegistry::UnregisterWorker::HandleOKCallback() { if (baton->error_code == GIT_OK) { - nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); - Local filterRegistry = nodegitContext->GetFromPersistent("FilterRegistry").As(); - Nan::Delete(filterRegistry, Nan::To(GetFromPersistent("filter_name")).ToLocalChecked()); + static_pointer_cast(nodegit::Context::GetCurrentContext()->GetCleanupHandle("filterRegistry"))->registeredFilters.erase(baton->filter_name); v8::Local result = Nan::New(baton->error_code); v8::Local argv[2] = { Nan::Null(), diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index dfe5f8e77..411f8778c 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -47,6 +47,44 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%if arg.globalPayload %} baton->{{ arg.name }} = globalPayload; {%endif%} + {% elsif arg.isStructType %} + {% if arg.isOptional %} + if (info[{{ arg.jsArg }}]->IsNull() || info[{{ arg.jsArg }}]->IsUndefined()) { + baton->{{ arg.name }} = nullptr; + } else + {% endif %} + {% if arg.cppClassName == 'Array' %} + { + v8::Local tempArray = v8::Local::Cast(info[{{ arg.jsArg }}]); + baton->{{ arg.name }} = new {{ arg.cType|unPointer }}[tempArray->Length()]; + for (uint32_t i = 0; i < tempArray->Length(); ++i) { + auto conversionResult = Configurable{{ arg.arrayElementCppClassName }}::fromJavascript( + nodegitContext, + Nan::Get(tempArray, i).ToLocalChecked() + ); + + if (!conversionResult.result) { + delete[] baton->{{ arg.name }}; + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles["{{ arg.name }}"] = convertedObject; + baton->{{ arg.name }}[i] = *convertedObject->GetValue(); + } + } + {% else %} + { + auto conversionResult = Configurable{{ arg.cppClassName }}::fromJavascript(nodegitContext, info[{{ arg.jsArg }}]); + if (!conversionResult.result) { + return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); + } + + auto convertedObject = conversionResult.result; + cleanupHandles["{{ arg.name }}"] = convertedObject; + baton->{{ arg.name }} = convertedObject->GetValue(); + } + {% endif %} {%elsif arg.name %} {%partial convertFromV8 arg%} {%if not arg.payloadFor %} @@ -240,6 +278,23 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { {%endif%} {%endif%} + {% each args|argsInfo as arg %} + {% if not arg.ignore %} + {% if arg.isStructType %} + {% if arg.preserveOnThis %} + { + {% if args|thisInfo 'isReturn' %} + auto objWrap = Nan::ObjectWrap::Unwrap<{{ args|thisInfo 'cppClassName' }}>(result.As()); + {% else %} + auto objWrap = Nan::ObjectWrap::Unwrap<{{ args|thisInfo 'cppClassName' }}>(GetFromPersistent("{{ args|thisInfo 'name' }}").As()); + {% endif %} + objWrap->SaveCleanupHandle(cleanupHandles["{{ arg.name }}"]); + } + {% endif %} + {% endif %} + {% endif %} + {% endeach %} + v8::Local argv[2] = { Nan::Null(), result @@ -263,53 +318,15 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::HandleOKCallback() { free((void *)baton->error->message); free((void *)baton->error); } else if (baton->error_code < 0) { - std::queue< v8::Local > workerArguments; - {%each args|argsInfo as arg %} - {%if not arg.isReturn %} - {%if not arg.isSelf %} - {%if not arg.isCallbackFunction %} - workerArguments.push(GetFromPersistent("{{ arg.name }}")); - {%endif%} - {%endif%} - {%endif%} - {%endeach%} bool callbackFired = false; - while(!workerArguments.empty()) { - v8::Local node = workerArguments.front(); - workerArguments.pop(); - - if ( - !node->IsObject() - || node->IsArray() - || node->IsBooleanObject() - || node->IsDate() - || node->IsFunction() - || node->IsNumberObject() - || node->IsRegExp() - || node->IsStringObject() - ) { - continue; - } - - v8::Local nodeObj = Nan::To(node).ToLocalChecked(); - v8::Local checkValue = GetPrivate(nodeObj, Nan::New("NodeGitPromiseError").ToLocalChecked()); - - if (!checkValue.IsEmpty() && !checkValue->IsNull() && !checkValue->IsUndefined()) { + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { v8::Local argv[1] = { - Nan::To(checkValue).ToLocalChecked() + maybeError }; callback->Call(1, argv, async_resource); callbackFired = true; - break; - } - - v8::Local properties = Nan::GetPropertyNames(nodeObj).ToLocalChecked(); - for (unsigned int propIndex = 0; propIndex < properties->Length(); ++propIndex) { - v8::Local propName = Nan::To(Nan::Get(properties, propIndex).ToLocalChecked()).ToLocalChecked(); - v8::Local nodeToQueue = Nan::Get(nodeObj, propName).ToLocalChecked(); - if (!nodeToQueue->IsUndefined()) { - workerArguments.push(nodeToQueue); - } } } diff --git a/generate/templates/partials/configurable_callbacks.cc b/generate/templates/partials/configurable_callbacks.cc new file mode 100644 index 000000000..3b2866074 --- /dev/null +++ b/generate/templates/partials/configurable_callbacks.cc @@ -0,0 +1,208 @@ +{% each fields|fieldsInfo as field %} + {% if not field.ignore %} + {% if field.isCallbackFunction %} + Configurable{{ cppClassName }}* Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_getInstanceFromBaton({{ field.name|titleCase }}Baton* baton) { + {% if isExtendedStruct %} + return static_cast((({{cType}}_extended *)baton->self)->payload); + {% else %} + return static_cast(baton-> + {% each field.args|argsInfo as arg %} + {% if arg.payload == true %} + {{arg.name}} + {% elsif arg.lastArg %} + {{arg.name}} + {% endif %} + {% endeach %}); + {% endif %} + } + + {{ field.return.type }} Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_cppCallback ( + {% each field.args|argsInfo as arg %} + {{ arg.cType }} {{ arg.name}}{% if not arg.lastArg %},{% endif %} + {% endeach %} + ) { + {{ field.name|titleCase }}Baton *baton = + new {{ field.name|titleCase }}Baton({{ field.return.noResults }}); + + {% each field.args|argsInfo as arg %} + baton->{{ arg.name }} = {{ arg.name }}; + {% endeach %} + + Configurable{{ cppClassName }}* instance = {{ field.jsFunctionName }}_getInstanceFromBaton(baton); + + {% if field.return.type == "void" %} + if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { + delete baton; + } else if (instance->{{ field.jsFunctionName }}.WillBeThrottled()) { + delete baton; + } else if (instance->{{ field.jsFunctionName }}.ShouldWaitForResult()) { + baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync); + delete baton; + } else { + baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync, nodegit::deleteBaton); + } + return; + {% else %} + {{ field.return.type }} result; + + if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { + result = baton->defaultResult; + delete baton; + } else if (instance->{{ field.jsFunctionName }}.WillBeThrottled()) { + result = baton->defaultResult; + delete baton; + } else if (instance->{{ field.jsFunctionName }}.ShouldWaitForResult()) { + result = baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync); + delete baton; + } else { + result = baton->defaultResult; + baton->ExecuteAsync({{ field.jsFunctionName }}_async, {{ field.jsFunctionName }}_cancelAsync, nodegit::deleteBaton); + } + return result; + {% endif %} + } + + void Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_cancelAsync(void *untypedBaton) { + {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(untypedBaton); + {% if field.return.type != "void" %} + baton->result = {{ field.return.cancel }}; + {% endif %} + baton->Done(); + } + + void Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_async(void *untypedBaton) { + Nan::HandleScope scope; + + {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(untypedBaton); + Configurable{{ cppClassName }}* instance = {{ field.jsFunctionName }}_getInstanceFromBaton(baton); + + if (instance->{{ field.jsFunctionName }}.GetCallback()->IsEmpty()) { + {% if field.return.type == "int" %} + baton->result = baton->defaultResult; // no results acquired + {% endif %} + baton->Done(); + return; + } + + {% if field.args|callbackArgsCount == 0 %} + v8::Local *argv = NULL; + {% else %} + v8::Local argv[{{ field.args|callbackArgsCount }}] = { + {% each field.args|callbackArgsInfo as arg %} + {% if not arg.firstArg %},{% endif %} + {% if arg.isEnum %} + Nan::New((int)baton->{{ arg.name }}) + {% elsif arg.isLibgitType %} + {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false) + {% elsif arg.cType == "size_t" %} + // HACK: NAN should really have an overload for Nan::New to support size_t + Nan::New((unsigned int)baton->{{ arg.name }}) + {% elsif arg.cppClassName == "String" %} + baton->{{ arg.name }} == NULL + ? Nan::EmptyString() + : Nan::New({%if arg.cType | isDoublePointer %}*{% endif %}baton->{{ arg.name }}).ToLocalChecked() + {% else %} + Nan::New(baton->{{ arg.name }}) + {% endif %} + {% endeach %} + }; + {% endif %} + + Nan::TryCatch tryCatch; + + Nan::MaybeLocal maybeResult = (*(instance->{{ field.jsFunctionName }}.GetCallback()))( + baton->GetAsyncResource(), + {{ field.args|callbackArgsCount }}, + argv + ); + v8::Local result; + if (!maybeResult.IsEmpty()) { + result = maybeResult.ToLocalChecked(); + } + + if (PromiseCompletion::ForwardIfPromise(result, baton, Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_promiseCompleted)) { + return; + } + + {% if field.return.type == "void" %} + baton->Done(); + {% else %} + {% each field|returnsInfo false true as _return %} + if (result.IsEmpty() || result->IsNativeError()) { + baton->result = {{ field.return.error }}; + } + else if (!result->IsNull() && !result->IsUndefined()) { + {% if _return.isOutParam %} + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); + wrapper->selfFreeing = false; + + *baton->{{ _return.name }} = wrapper->GetValue(); + baton->result = {{ field.return.success }}; + {% else %} + if (result->IsNumber()) { + baton->result = Nan::To(result).FromJust(); + } + else { + baton->result = baton->defaultResult; + } + {% endif %} + } + else { + baton->result = baton->defaultResult; + } + {% endeach %} + baton->Done(); + {% endif %} + } + + void Configurable{{ cppClassName }}::{{ field.jsFunctionName }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result) { + Nan::HandleScope scope; + + {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(_baton); + {% if field.return.type == "void" %} + baton->Done(); + {% else %} + if (isFulfilled) { + {% each field|returnsInfo false true as _return %} + if (result.IsEmpty() || result->IsNativeError()) { + baton->result = {{ field.return.error }}; + } + else if (!result->IsNull() && !result->IsUndefined()) { + {% if _return.isOutParam %} + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); + wrapper->selfFreeing = false; + + *baton->{{ _return.name }} = wrapper->GetValue(); + baton->result = {{ field.return.success }}; + {% else %} + if (result->IsNumber()) { + baton->result = Nan::To(result).FromJust(); + } + else{ + baton->result = baton->defaultResult; + } + {% endif %} + } + else { + baton->result = baton->defaultResult; + } + {% endeach %} + } + else { + // promise was rejected + {% if isExtendedStruct %} + Configurable{{ cppClassName }}* instance = static_cast((({{cType}}_extended *)baton->self)->payload); + {% else %} + Configurable{{ cppClassName }}* instance = static_cast(baton->{% each field.args|argsInfo as arg %} + {% if arg.payload == true %}{{arg.name}}{% elsif arg.lastArg %}{{arg.name}}{% endif %} + {% endeach %}); + {% endif %} + baton->SetCallbackError(result); + baton->result = {{ field.return.error }}; + } + baton->Done(); + {% endif %} + } + {% endif %} + {% endif %} +{% endeach %} diff --git a/generate/templates/partials/traits.h b/generate/templates/partials/traits.h index c708c965b..9f1f2eed7 100644 --- a/generate/templates/partials/traits.h +++ b/generate/templates/partials/traits.h @@ -1,8 +1,14 @@ class {{ cppClassName }}; +{% if type == 'struct' %} +class Configurable{{ cppClassName }}; +{% endif %} struct {{ cppClassName }}Traits { typedef {{ cppClassName }} cppClass; typedef {{ cType }} cType; + {% if type == 'struct' %} + typedef Configurable{{ cppClassName }} configurableCppClass; + {% endif %} static const bool isDuplicable = {{ dupFunction|toBool |or cpyFunction|toBool}}; static void duplicate({{ cType }} **dest, {{ cType }} *src) { diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index 8a638adfc..7f3032ffb 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -2,9 +2,7 @@ #define {{ cppClassName|upper }}_H #include #include -#include #include -#include #include #include "async_baton.h" diff --git a/generate/templates/templates/nodegit.js b/generate/templates/templates/nodegit.js index bb9739ac9..43e7d9de0 100644 --- a/generate/templates/templates/nodegit.js +++ b/generate/templates/templates/nodegit.js @@ -34,6 +34,13 @@ rawApi = _.cloneDeep(rawApi); // have to override them here /* jshint ignore:start */ {% each . as idef %} + {% if idef.type == 'struct' %} + rawApi.{{ idef.jsClassName }} = util.deprecate(function {{ idef.jsClassName }}() { + try { + require("./deprecated/structs/{{ idef.jsClassName }}").call(this, rawApi); + } catch (error) {/* allow these to be undefined */} + }, "Instantiation of {{ idef.jsClassName }} is deprecated and will be removed in an upcoming version"); + {% endif %} {% if idef.type != "enum" %} {% if idef.functions.length > 0 %} @@ -100,9 +107,7 @@ var importExtension = function(name) { // Load up utils rawApi.Utils = {}; require("./utils/lookup_wrapper"); -require("./utils/normalize_options"); require("./utils/shallow_clone"); -require("./utils/normalize_fetch_options"); // Load up extra types; require("./status_file"); diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index a7db84d53..08860e69f 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -127,7 +127,6 @@ void {{ cppClassName }}::InitializeComponent(Local target, nodegit::Cont v8::Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); nodegitContext->SaveToPersistent("{{ cppClassName }}::Template", constructor_template); - Nan::Set(target, Nan::New("{{ jsClassName }}").ToLocalChecked(), constructor_template); } {% partial fieldAccessors . %} @@ -135,3 +134,252 @@ void {{ cppClassName }}::InitializeComponent(Local target, nodegit::Cont // force base class template instantiation, to make sure we get all the // methods, statics, etc. template class NodeGitWrapper<{{ cppClassName }}Traits>; + +Configurable{{ cppClassName }}::Configurable{{ cppClassName }}(nodegit::Context *nodegitContext) + : nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>(nodegitContext) +{ + {% if ignoreInit == true %} + this->raw = new {{ cType }}; + {% else %} + {{ cType }}{% if isExtendedStruct %}_extended{% endif %} wrappedValue = {{ cType|upper }}_INIT; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); + memcpy(this->raw, &wrappedValue, sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); + {% endif %} +} + +Configurable{{ cppClassName }}::~Configurable{{ cppClassName }}() { + {% each fields|fieldsInfo as field %} + {% if not field.ignore %} + {% if field.cppClassName == 'GitStrarray' %} + if (this->raw->{{ field.name }}.count) { + for (size_t i = 0; i < this->raw->{{ field.name }}.count; ++i) { + delete this->raw->{{ field.name }}.strings[i]; + } + delete[] this->raw->{{ field.name }}.strings; + } + {% elsif field.cppClassName == 'String' %} + delete this->raw->{{ field.name }}; + {% endif %} + {% endif %} + {% endeach %} +} + +nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>::v8ConversionResult Configurable{{ cppClassName }}::fromJavascript(nodegit::Context *nodegitContext, v8::Local input) { + if (!input->IsObject()) { + return { + "Must pass object for Configurable{{ cppClassName }}" + }; + } + + Nan::HandleScope scope; + v8::Local inputObj = input.As(); + std::shared_ptr output(new Configurable{{ cppClassName }}(nodegitContext)); + + // unpack the data into the correct fields + {% each fields as field %} + {% if not field.ignore %} + {% if field.isClassType %} + {% if field.cppClassName == 'GitOid' %} + { + v8::Local maybeOid = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeOid.IsEmpty() && !maybeOid->IsUndefined() && !maybeOid->IsNull()) { + if (maybeOid->IsString()) { + Nan::Utf8String oidString(maybeOid.As()); + if (git_oid_fromstr(&output->raw->{{ field.name }}, *oidString) != GIT_OK) { + return { + git_error_last()->message + }; + } + } else if (maybeOid->IsObject()) { + if (git_oid_cpy(&output->raw->{{ field.name }}, Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(maybeOid.As())->GetValue()) != GIT_OK) { + return { + git_error_last()->message + }; + } + } else { + return { + "Must pass String or NodeGit.Oid to {{ field.jsFunctionName }}" + }; + } + } + } + {% elsif field.cppClassName == 'GitStrarray' %} + output->raw->{{ field.name }}.count = 0; + output->raw->{{ field.name }}.strings = nullptr; + + { + v8::Local maybeStrarray = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeStrarray.IsEmpty() && !maybeStrarray->IsUndefined() && !maybeStrarray->IsNull()) { + if (maybeStrarray->IsArray()) { + v8::Local strarrayValue = maybeStrarray.As(); + // validate the StrArray is indeed a list of strings + for (uint32_t i = 0; i < strarrayValue->Length(); ++i) { + // TODO confirm that sparse array at least boils down to undefined + v8::Local arrayValue = Nan::Get(strarrayValue, i).ToLocalChecked(); + if (!arrayValue->IsString()) { + return { + "Must pass String or Array of strings to {{ field.jsFunctionName }}" + }; + } + } + + StrArrayConverter::ConvertInto(&output->raw->{{ field.name }}, strarrayValue); + } else if (maybeStrarray->IsString()) { + v8::Local strarrayValue = maybeStrarray.As(); + StrArrayConverter::ConvertInto(&output->raw->{{ field.name }}, strarrayValue); + } else { + return { + "Must pass String or Array of strings to {{ field.jsFunctionName }}" + }; + } + } + } + {% else %} + { + v8::Local maybeObject = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeObject.IsEmpty() && !maybeObject->IsUndefined() && !maybeObject->IsNull()) { + if (!maybeObject->IsObject()) { + return { + "Must pass NodeGit.{{ field.jsClassName }} to {{ field.jsFunctionName }}" + }; + } + + v8::Local objectValue = maybeObject.As(); + output->raw->{{ field.name }} = Nan::ObjectWrap::Unwrap<{{ field.cppClassName }}>(objectValue)->GetValue(); + output->{{ field.jsFunctionName }}.Reset(objectValue); + } + } + {% endif %} + {% elsif field.isCallbackFunction %} + { + v8::Local maybeCallback = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeCallback.IsEmpty() && !maybeCallback->IsUndefined() && !maybeCallback->IsNull()) { + if (!maybeCallback->IsFunction() && !maybeCallback->IsObject()) { + return { + "Must pass Function or CallbackSpecifier to {{ field.jsFunctionName}}" + }; + } + + std::unique_ptr callback; + uint32_t throttle = {% if field.return.throttle %}{{ field.return.throttle }}{% else %}0{% endif %}; + bool waitForResult = true; + + if (maybeCallback->IsFunction()) { + callback.reset(new Nan::Callback(maybeCallback.As())); + } else { + v8::Local callbackSpecifier = maybeCallback.As(); + v8::Local maybeCallback = nodegit::safeGetField(callbackSpecifier, "callback"); + if (maybeCallback.IsEmpty() || !maybeCallback->IsFunction()) { + return { + "Must pass callback to CallbackSpecifier" + }; + } + + callback.reset(new Nan::Callback(maybeCallback.As())); + + v8::Local maybeThrottle = nodegit::safeGetField(callbackSpecifier, "throttle"); + if (!maybeThrottle.IsEmpty() && !maybeThrottle->IsUndefined() && !maybeThrottle->IsNull()) { + if (!maybeThrottle->IsNumber()) { + return { + "Must pass zero or positive number as throttle to CallbackSpecifier" + }; + } + + throttle = maybeThrottle->Uint32Value(Nan::GetCurrentContext()).FromJust(); + } + + v8::Local maybeWaitForResult = nodegit::safeGetField(callbackSpecifier, "waitForResult"); + if (!maybeWaitForResult.IsEmpty() && !maybeWaitForResult->IsUndefined() && !maybeWaitForResult->IsNull()) { + if (!maybeWaitForResult->IsBoolean()) { + return { + "Must pass a boolean as waitForResult to callbackSpecifier" + }; + } + + waitForResult = Nan::To(maybeWaitForResult).FromJust(); + } + } + + output->{{ field.jsFunctionName }}.SetCallback(std::move(callback), throttle, waitForResult); + output->raw->{{ field.name }} = ({{ field.cType }}){{ field.jsFunctionName }}_cppCallback; + } + } + {% elsif field.isStructType %} + { + v8::Local maybeNestedObject = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeNestedObject.IsEmpty() && !maybeNestedObject->IsUndefined() && !maybeNestedObject->IsNull()) { + auto conversionResult = Configurable{{ field.cppClassName }}::fromJavascript(nodegitContext, maybeNestedObject); + if (!conversionResult.result) { + std::string error = "Failed to set {{ field.jsFunctionName }}: "; + error += conversionResult.error; + return { + error + }; + } + + auto child = conversionResult.result; + output->childCleanupVector.push_back(child); + output->raw->{{ field.name }} = *child->GetValue(); + } + } + {% elsif field.payloadFor %} + output->raw->{{ field.name }} = (void *)output.get(); + {% elsif field.cppClassName == 'String' %} + output->raw->{{ field.name }} = nullptr; + { + v8::Local maybeString = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeString.IsEmpty() && !maybeString->IsUndefined() && !maybeString->IsNull()) { + if (!maybeString->IsString()) { + return { + "Must pass string to {{ field.jsFunctionName }}" + }; + } + + Nan::Utf8String utf8String(maybeString.As()); + output->raw->{{ field.name }} = strdup(*utf8String); + } + } + {% elsif field.isCppClassIntType %} + { + v8::Local maybeNumber = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeNumber.IsEmpty() && !maybeNumber->IsUndefined() && !maybeNumber->IsNull()) { + if (!maybeNumber->IsNumber()) { + return { + "Must pass {{ field.cppClassName }} to {{ field.jsFunctionName }}" + }; + } + + output->raw->{{ field.name }} = maybeNumber->{{ field.cppClassName }}Value(); + } + } + {% else %} + { + v8::Local maybeNumber = nodegit::safeGetField(inputObj, "{{ field.jsFunctionName }}"); + if (!maybeNumber.IsEmpty() && !maybeNumber->IsUndefined() && !maybeNumber->IsNull()) { + if (!maybeNumber->IsNumber()) { + return { + "Must pass Int32 to {{ field.jsFunctionName }}" + }; + } + + output->raw->{{ field.name }} = static_cast<{{ field.cType }}>(maybeNumber->Int32Value(Nan::GetCurrentContext()).FromJust()); + } + } + {% endif %} + {% endif %} + {% endeach %} + + {% if isExtendedStruct %} + (({{ cType }}_extended *)output->raw)->payload = (void *)output.get(); + {% endif %} + + return { + output + }; +} + +{% partial configurableCallbacks %} + +// force base class template instantiation, to make sure we get all the +// methods, statics, etc. +template class nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>; diff --git a/generate/templates/templates/struct_header.h b/generate/templates/templates/struct_header.h index 6ef905c92..abd6fcf91 100644 --- a/generate/templates/templates/struct_header.h +++ b/generate/templates/templates/struct_header.h @@ -1,10 +1,9 @@ +// generated from struct_header.h #ifndef {{ cppClassName|upper }}_H #define {{ cppClassName|upper }}_H #include #include -#include #include -#include #include "async_baton.h" #include "async_worker.h" @@ -12,6 +11,8 @@ #include "context.h" #include "reference_counter.h" #include "nodegit_wrapper.h" +#include "configurable_class_wrapper.h" +#include "v8_helpers.h" extern "C" { #include @@ -64,8 +65,7 @@ class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { {% endeach %} {{ field.name|titleCase }}Baton() - : nodegit::AsyncBatonWithNoResult() { - } + : nodegit::AsyncBatonWithNoResult() {} }; {% else %} class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ field.return.type }}> { @@ -75,8 +75,7 @@ class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { {% endeach %} {{ field.name|titleCase }}Baton(const {{ field.return.type }} &defaultResult) - : nodegit::AsyncBatonWithResult<{{ field.return.type }}>(defaultResult) { - } + : nodegit::AsyncBatonWithResult<{{ field.return.type }}>(defaultResult) {} }; {% endif %} static {{ cppClassName }} * {{ field.name }}_getInstanceFromBaton ( @@ -110,4 +109,80 @@ class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { {% endeach %} }; +class Configurable{{ cppClassName }} : public nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits> { + friend class nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>; + +public: + static v8ConversionResult fromJavascript(nodegit::Context *nodegitContext, v8::Local input); + ~Configurable{{ cppClassName }}(); + + {% each fields as field %} + {% if not field.ignore %} + {% if field.isCallbackFunction %} + static {{ field.return.type }} {{ field.jsFunctionName }}_cppCallback ( + {% each field.args|argsInfo as arg %} + {{ arg.cType }} {{ arg.name}} + {% if not arg.lastArg %} + , + {% endif %} + {% endeach %} + ); + + static void {{ field.jsFunctionName }}_cancelAsync(void *baton); + static void {{ field.jsFunctionName }}_async(void *baton); + static void {{ field.jsFunctionName }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); + {% if field.return.type == 'void' %} + class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithNoResult { + public: + {% each field.args|argsInfo as arg %} + {{ arg.cType }} {{ arg.name }}; + {% endeach %} + + {{ field.name|titleCase }}Baton() + : nodegit::AsyncBatonWithNoResult() { + } + }; + {% else %} + class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ field.return.type }}> { + public: + {% each field.args|argsInfo as arg %} + {{ arg.cType }} {{ arg.name }}; + {% endeach %} + + {{ field.name|titleCase }}Baton(const {{ field.return.type }} &defaultResult) + : nodegit::AsyncBatonWithResult<{{ field.return.type }}>(defaultResult) { + } + }; + {% endif %} + static Configurable{{ cppClassName }} * {{ field.jsFunctionName }}_getInstanceFromBaton ( + {{ field.name|titleCase }}Baton *baton); + {% endif %} + {% endif %} + {% endeach %} + +private: + Configurable{{ cppClassName }}(nodegit::Context *nodegitContext); + Configurable{{ cppClassName }}() = delete; + Nan::Global promiseError; + + {% each fields as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isClassType %} + {% if field.cppClassName == 'GitOid' %} + {%-- We do not need to generate anything here --%} + {% elsif field.cppClassName == 'GitStrarray' %} + {%-- We do not need to generate anything here --%} + {% else %} + Nan::Global {{ field.jsFunctionName }}; + {% endif %} + {% elsif field.isCallbackFunction %} + CallbackWrapper {{ field.jsFunctionName }}; + {% endif %} + {% endif %} + {% endif %} + {% endeach %} + +}; + #endif diff --git a/lib/blame.js b/lib/blame.js deleted file mode 100644 index 520bb8ce7..000000000 --- a/lib/blame.js +++ /dev/null @@ -1,20 +0,0 @@ -var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var Blame = NodeGit.Blame; - -var _file = Blame.file; - -/** - * Retrieve the blame of a file - * - * @async - * @param {Repository} repo that contains the file - * @param {String} path to the file to get the blame of - * @param {BlameOptions} [options] Options for the blame - * @return {Blame} the blame - */ -Blame.file = function(repo, path, options) { - options = normalizeOptions(options, NodeGit.BlameOptions); - - return _file.call(this, repo, path, options); -}; diff --git a/lib/blob.js b/lib/blob.js index 7d4e14303..be6331248 100644 --- a/lib/blob.js +++ b/lib/blob.js @@ -3,10 +3,8 @@ var NodeGit = require("../"); var Blob = NodeGit.Blob; var LookupWrapper = NodeGit.Utils.lookupWrapper; var TreeEntry = NodeGit.TreeEntry; -var normalizeOptions = NodeGit.Utils.normalizeOptions; var _filteredContent = Blob.filteredContent; -var _filter = Blob.prototype.filter; /** * Retrieves the blob pointed to by the oid @@ -46,26 +44,6 @@ Blob.prototype.toString = function() { return this.content().toString(); }; -/** - * Get a buffer with the filtered content of a blob. - * - * This applies filters as if the blob was being checked out to the - * working directory under the specified filename. This may apply - * CRLF filtering or other types of changes depending on the file - * attributes set for the blob and the content detected in it. - * - * @async - * @param asPath Path used for file attribute lookups, etc. - * @param opts Options to use for filtering the blob - * @return {Promise} - */ -Blob.prototype.filter = function(asPath, opts) { - if (opts) { - opts = normalizeOptions(opts, NodeGit.BlobFilterOptions); - } - return _filter.call(this, asPath, opts); -}; - Blob.filteredContent = util.deprecate( _filteredContent, "NodeGit.Blob.filteredContent is deprecated" + diff --git a/lib/checkout.js b/lib/checkout.js deleted file mode 100644 index dd94b3cfb..000000000 --- a/lib/checkout.js +++ /dev/null @@ -1,51 +0,0 @@ -var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var Checkout = NodeGit.Checkout; -var _head = Checkout.head; -var _index = Checkout.index; -var _tree = Checkout.tree; - -/** -* Patch head checkout to automatically coerce objects. -* -* @async -* @param {Repository} repo The repo to checkout head -* @param {CheckoutOptions} [options] Options for the checkout -* @return {Void} checkout complete -*/ -Checkout.head = function(url, options) { - options = normalizeOptions(options || {}, NodeGit.CheckoutOptions); - - return _head.call(this, url, options); -}; - -/** -* Patch index checkout to automatically coerce objects. -* -* @async -* @param {Repository} repo The repo to checkout an index -* @param {Index} index The index to checkout -* @param {CheckoutOptions} [options] Options for the checkout -* @return {Void} checkout complete -*/ -Checkout.index = function(repo, index, options) { - options = normalizeOptions(options || {}, NodeGit.CheckoutOptions); - - return _index.call(this, repo, index, options); -}; - -/** -* Patch tree checkout to automatically coerce objects. -* -* @async -* @param {Repository} repo -* @param {String|Tree|Commit|Reference} treeish -* @param {CheckoutOptions} [options] -* @return {Void} checkout complete -*/ -Checkout.tree = function(repo, treeish, options) { - options = normalizeOptions(options || {}, NodeGit.CheckoutOptions); - - return _tree.call(this, repo, treeish, options); -}; diff --git a/lib/cherrypick.js b/lib/cherrypick.js deleted file mode 100644 index cf003c2a5..000000000 --- a/lib/cherrypick.js +++ /dev/null @@ -1,73 +0,0 @@ -var NodeGit = require("../"); -var shallowClone = NodeGit.Utils.shallowClone; -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var Cherrypick = NodeGit.Cherrypick; -var _cherrypick = Cherrypick.cherrypick; -var _commit = Cherrypick.commit; - -/** -* Cherrypick a commit and, changing the index and working directory -* -* @async -* @param {Repository} repo The repo to checkout head -* @param {Commit} commit The commit to cherrypick -* @param {CherrypickOptions} [options] Options for the cherrypick -* @return {int} 0 on success, -1 on failure -*/ -Cherrypick.cherrypick = function(repo, commit, options) { - var mergeOpts; - var checkoutOpts; - - if (options) { - options = shallowClone(options); - mergeOpts = options.mergeOpts; - checkoutOpts = options.checkoutOpts; - delete options.mergeOpts; - delete options.checkoutOpts; - } - - options = normalizeOptions(options, NodeGit.CherrypickOptions); - - if (mergeOpts) { - options.mergeOpts = - normalizeOptions(mergeOpts, NodeGit.MergeOptions); - } - - if (checkoutOpts) { - options.checkoutOpts = - normalizeOptions(checkoutOpts, NodeGit.CheckoutOptions); - } - - return _cherrypick.call(this, repo, commit, options); -}; - -/** -* Cherrypicks the given commit against "our" commit, producing an index that -* reflects the result of the cherrypick. The index is not backed by a repo. -* -* @async -* @param {Repository} repo The repo to cherrypick commits -* @param {Commit} cherrypick_commit The commit to cherrypick -* @param {Commit} our_commit The commit to revert against -* @param {int} mainline The parent of the revert commit (1 or -* 2) if it's a merge, 0 otherwise -* @param {MergeOptions} [merge_options] Merge options for the cherrypick -* @return {int} 0 on success, -1 on failure -*/ -Cherrypick.commit = function( - repo, - cherrypick_commit, - our_commit, - mainline, - merge_options) { - merge_options = normalizeOptions(merge_options, NodeGit.MergeOptions); - - return _commit.call( - this, - repo, - cherrypick_commit, - our_commit, - mainline, - merge_options); -}; diff --git a/lib/clone.js b/lib/clone.js deleted file mode 100644 index c6b6be599..000000000 --- a/lib/clone.js +++ /dev/null @@ -1,33 +0,0 @@ -var NodeGit = require("../"); -var shallowClone = NodeGit.Utils.shallowClone; -var normalizeFetchOptions = NodeGit.Utils.normalizeFetchOptions; -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var Clone = NodeGit.Clone; -var _clone = Clone.clone; - -/** - * Patch repository cloning to automatically coerce objects. - * - * @async - * @param {String} url url of the repository - * @param {String} local_path local path to store repository - * @param {CloneOptions} [options] - * @return {Repository} repo - */ -Clone.clone = function(url, local_path, options) { - var fetchOpts = normalizeFetchOptions(options && options.fetchOpts); - - if (options) { - options = shallowClone(options); - delete options.fetchOpts; - } - - options = normalizeOptions(options, NodeGit.CloneOptions); - - if (options) { - options.fetchOpts = fetchOpts; - } - - return _clone.call(this, url, local_path, options); -}; diff --git a/lib/deprecated/structs/ApplyOptions.js b/lib/deprecated/structs/ApplyOptions.js new file mode 100644 index 000000000..cd9f22ca0 --- /dev/null +++ b/lib/deprecated/structs/ApplyOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.flags = 0; +}; diff --git a/lib/deprecated/structs/BlameOptions.js b/lib/deprecated/structs/BlameOptions.js new file mode 100644 index 000000000..8ffd415de --- /dev/null +++ b/lib/deprecated/structs/BlameOptions.js @@ -0,0 +1,6 @@ +module.exports = function() { + this.flags = 0; + this.minMatchCharacters = 0; + this.minLine = 0; + this.maxLine = 0; +}; diff --git a/lib/deprecated/structs/BlobFilterOptions.js b/lib/deprecated/structs/BlobFilterOptions.js new file mode 100644 index 000000000..df9a3d762 --- /dev/null +++ b/lib/deprecated/structs/BlobFilterOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.flags = 1; +}; diff --git a/lib/deprecated/structs/CheckoutOptions.js b/lib/deprecated/structs/CheckoutOptions.js new file mode 100644 index 000000000..89e28d093 --- /dev/null +++ b/lib/deprecated/structs/CheckoutOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.checkoutStrategy = 1; + this.disableFilters = 0; + this.dirMode = 0; + this.fileMode = 0; + this.fileOpenFlags = 0; + this.notifyFlags = 0; +}; diff --git a/lib/deprecated/structs/CherrypickOptions.js b/lib/deprecated/structs/CherrypickOptions.js new file mode 100644 index 000000000..fce5efa10 --- /dev/null +++ b/lib/deprecated/structs/CherrypickOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.mainline = 0; + this.mergeOpts = new NodeGit.MergeOptions(); +}; diff --git a/lib/deprecated/structs/CloneOptions.js b/lib/deprecated/structs/CloneOptions.js new file mode 100644 index 000000000..84deb60da --- /dev/null +++ b/lib/deprecated/structs/CloneOptions.js @@ -0,0 +1,6 @@ +module.exports = function(NodeGit) { + this.bare = 0; + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.fetchOpts = new NodeGit.FetchOptions(); + this.local = 0; +}; diff --git a/lib/deprecated/structs/DescribeFormatOptions.js b/lib/deprecated/structs/DescribeFormatOptions.js new file mode 100644 index 000000000..6e9d25031 --- /dev/null +++ b/lib/deprecated/structs/DescribeFormatOptions.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.abbreviatedSize = 7; + this.alwaysUseLongFormat = 0; +}; diff --git a/lib/deprecated/structs/DescribeOptions.js b/lib/deprecated/structs/DescribeOptions.js new file mode 100644 index 000000000..a4c29a2a7 --- /dev/null +++ b/lib/deprecated/structs/DescribeOptions.js @@ -0,0 +1,6 @@ +module.exports = function() { + this.describeStrategy = 0; + this.maxCandidatesTags = 10; + this.onlyFollowFirstParent = 0; + this.showCommitOidAsFallback = 0; +}; diff --git a/lib/deprecated/structs/DiffFindOptions.js b/lib/deprecated/structs/DiffFindOptions.js new file mode 100644 index 000000000..459bc0ac1 --- /dev/null +++ b/lib/deprecated/structs/DiffFindOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.breakRewriteThreshold = 0; + this.copyThreshold = 0; + this.flags = 0; + this.renameFromRewriteThreshold = 0; + this.renameLimit = 0; + this.renameThreshold = 0; +}; diff --git a/lib/deprecated/structs/DiffOptions.js b/lib/deprecated/structs/DiffOptions.js new file mode 100644 index 000000000..eeb6c5c3a --- /dev/null +++ b/lib/deprecated/structs/DiffOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.contextLines = 3; + this.flags = 0; + this.idAbbrev = 0; + this.ignoreSubmodules = -1; + this.interhunkLines = 0; + this.maxSize = 0; +}; diff --git a/lib/deprecated/structs/FetchOptions.js b/lib/deprecated/structs/FetchOptions.js new file mode 100644 index 000000000..cd3f890dc --- /dev/null +++ b/lib/deprecated/structs/FetchOptions.js @@ -0,0 +1,7 @@ +module.exports = function(NodeGit) { + this.callbacks = new NodeGit.RemoteCallbacks(); + this.downloadTags = 0; + this.proxyOpts = new NodeGit.ProxyOptions(); + this.prune = 0; + this.updateFetchhead = 1; +}; diff --git a/lib/deprecated/structs/MergeFileInput.js b/lib/deprecated/structs/MergeFileInput.js new file mode 100644 index 000000000..0b77f1383 --- /dev/null +++ b/lib/deprecated/structs/MergeFileInput.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.mode = 0; + this.size = 0; +}; diff --git a/lib/deprecated/structs/MergeFileOptions.js b/lib/deprecated/structs/MergeFileOptions.js new file mode 100644 index 000000000..fd7101514 --- /dev/null +++ b/lib/deprecated/structs/MergeFileOptions.js @@ -0,0 +1,5 @@ +module.exports = function() { + this.favor = 0; + this.flags = 0; + this.markerSize = 0; +}; diff --git a/lib/deprecated/structs/MergeOptions.js b/lib/deprecated/structs/MergeOptions.js new file mode 100644 index 000000000..3c73243a2 --- /dev/null +++ b/lib/deprecated/structs/MergeOptions.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.fileFavor = 0; + this.fileFlags = 0; + this.flags = 1; + this.recursionLimit = 0; + this.renameThreshold = 0; + this.targetLimit = 0; +}; diff --git a/lib/deprecated/structs/ProxyOptions.js b/lib/deprecated/structs/ProxyOptions.js new file mode 100644 index 000000000..d1b3260ba --- /dev/null +++ b/lib/deprecated/structs/ProxyOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.type = 0; +}; diff --git a/lib/deprecated/structs/PushOptions.js b/lib/deprecated/structs/PushOptions.js new file mode 100644 index 000000000..bab5bc14f --- /dev/null +++ b/lib/deprecated/structs/PushOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.callbacks = new NodeGit.RemoteCallbacks(); + this.pbParallelism = 1; + this.proxyOpts = new NodeGit.ProxyOptions(); +}; diff --git a/lib/deprecated/structs/RebaseOptions.js b/lib/deprecated/structs/RebaseOptions.js new file mode 100644 index 000000000..414b296b5 --- /dev/null +++ b/lib/deprecated/structs/RebaseOptions.js @@ -0,0 +1,6 @@ +module.exports = function(NodeGit) { + this.checkoutOptions = new NodeGit.CheckoutOptions(); + this.inmemory = 0; + this.mergeOptions = new NodeGit.MergeOptions(); + this.quiet = 0; +}; diff --git a/lib/deprecated/structs/RemoteCreateOptions.js b/lib/deprecated/structs/RemoteCreateOptions.js new file mode 100644 index 000000000..cd9f22ca0 --- /dev/null +++ b/lib/deprecated/structs/RemoteCreateOptions.js @@ -0,0 +1,3 @@ +module.exports = function() { + this.flags = 0; +}; diff --git a/lib/deprecated/structs/RepositoryInitOptions.js b/lib/deprecated/structs/RepositoryInitOptions.js new file mode 100644 index 000000000..39657b17e --- /dev/null +++ b/lib/deprecated/structs/RepositoryInitOptions.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.flags = 0; + this.mode = 0; +}; diff --git a/lib/deprecated/structs/RevertOptions.js b/lib/deprecated/structs/RevertOptions.js new file mode 100644 index 000000000..fce5efa10 --- /dev/null +++ b/lib/deprecated/structs/RevertOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.mainline = 0; + this.mergeOpts = new NodeGit.MergeOptions(); +}; diff --git a/lib/deprecated/structs/StashApplyOptions.js b/lib/deprecated/structs/StashApplyOptions.js new file mode 100644 index 000000000..a7a9fcc83 --- /dev/null +++ b/lib/deprecated/structs/StashApplyOptions.js @@ -0,0 +1,4 @@ +module.exports = function(NodeGit) { + this.checkoutOptions = new NodeGit.CheckoutOptions(); + this.flags = 0; +}; diff --git a/lib/deprecated/structs/StatusOptions.js b/lib/deprecated/structs/StatusOptions.js new file mode 100644 index 000000000..d7c35c0f4 --- /dev/null +++ b/lib/deprecated/structs/StatusOptions.js @@ -0,0 +1,4 @@ +module.exports = function() { + this.flags = 0; + this.show = 0; +}; diff --git a/lib/deprecated/structs/SubmoduleUpdateOptions.js b/lib/deprecated/structs/SubmoduleUpdateOptions.js new file mode 100644 index 000000000..8dad87f11 --- /dev/null +++ b/lib/deprecated/structs/SubmoduleUpdateOptions.js @@ -0,0 +1,5 @@ +module.exports = function(NodeGit) { + this.allowFetch = 1; + this.checkoutOpts = new NodeGit.CheckoutOptions(); + this.fetchOpts = new NodeGit.FetchOptions(); +}; diff --git a/lib/diff.js b/lib/diff.js index b393595f8..feda0aa74 100644 --- a/lib/diff.js +++ b/lib/diff.js @@ -1,16 +1,8 @@ var NodeGit = require("../"); var Diff = NodeGit.Diff; -var normalizeOptions = NodeGit.Utils.normalizeOptions; var Patch = NodeGit.Patch; var _blobToBuffer = Diff.blobToBuffer; -var _indexToWorkdir = Diff.indexToWorkdir; -var _treeToIndex = Diff.treeToIndex; -var _treeToTree = Diff.treeToTree; -var _treeToWorkdir = Diff.treeToWorkdir; -var _treeToWorkdirWithIndex = Diff.treeToWorkdirWithIndex; - -var _findSimilar = Diff.prototype.findSimilar; /** * Directly run a diff between a blob and a buffer. @@ -48,8 +40,6 @@ Diff.blobToBuffer= function( bufferLength = !buffer ? 0 : Buffer.byteLength(buffer, "utf8"); } - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return _blobToBuffer.call( this, old_blob, @@ -65,42 +55,6 @@ Diff.blobToBuffer= function( null); }; -// Override Diff.indexToWorkdir to normalize opts -Diff.indexToWorkdir = function(repo, index, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return _indexToWorkdir(repo, index, opts); -}; - -// Override Diff.treeToIndex to normalize opts -Diff.treeToIndex = function(repo, tree, index, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return _treeToIndex(repo, tree, index, opts); -}; - -// Override Diff.treeToTree to normalize opts -Diff.treeToTree = function(repo, from_tree, to_tree, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return _treeToTree(repo, from_tree, to_tree, opts); -}; - -// Override Diff.treeToWorkdir to normalize opts -Diff.treeToWorkdir = function(repo, tree, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return _treeToWorkdir(repo, tree, opts); -}; - -// Override Diff.treeToWorkdir to normalize opts -Diff.treeToWorkdirWithIndex = function(repo, tree, opts) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return _treeToWorkdirWithIndex(repo, tree, opts); -}; - -// Override Diff.findSimilar to normalize opts -Diff.prototype.findSimilar = function(opts) { - opts = normalizeOptions(opts, NodeGit.DiffFindOptions); - return _findSimilar.call(this, opts); -}; - /** * Retrieve patches in this difflist * diff --git a/lib/filter_registry.js b/lib/filter_registry.js index e51f901d5..cfa17415e 100644 --- a/lib/filter_registry.js +++ b/lib/filter_registry.js @@ -1,5 +1,4 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; var FilterRegistry = NodeGit.FilterRegistry; @@ -13,8 +12,6 @@ FilterRegistry.register = function(name, filter, priority) { filter.attributes = ""; } - filter = normalizeOptions(filter, NodeGit.Filter); - if (!filter.check || !filter.apply) { return Promise.reject(new Error( "ERROR: please provide check and apply callbacks for filter" diff --git a/lib/merge.js b/lib/merge.js index e9b9b5c18..549bbad91 100644 --- a/lib/merge.js +++ b/lib/merge.js @@ -1,5 +1,4 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; var Merge = NodeGit.Merge; var _commits = Merge.commits; @@ -15,8 +14,6 @@ var _merge = Merge.merge; * @param {MergeOptions} [options] The merge tree options (null for default) */ Merge.commits = function(repo, ourCommit, theirCommit, options) { - options = normalizeOptions(options, NodeGit.MergeOptions); - return Promise.all([ repo.getCommit(ourCommit), repo.getCommit(theirCommit) @@ -35,9 +32,6 @@ Merge.commits = function(repo, ourCommit, theirCommit, options) { * (null for default) */ Merge.merge = function(repo, theirHead, mergeOpts, checkoutOpts) { - mergeOpts = normalizeOptions(mergeOpts || {}, NodeGit.MergeOptions); - checkoutOpts = normalizeOptions(checkoutOpts || {}, NodeGit.CheckoutOptions); - // Even though git_merge takes an array of annotated_commits, it expects // exactly one to have been passed in or it will throw an error... ¯\_(ツ)_/¯ var theirHeads = [theirHead]; diff --git a/lib/patch.js b/lib/patch.js deleted file mode 100644 index 48b81eb81..000000000 --- a/lib/patch.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -var NodeGit = require("../"); -var Patch = NodeGit.Patch; -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var _fromBlobs = Patch.fromBlobs; - -Patch.fromBlobs = function ( - old_blob, - old_as_path, - new_blob, - new_as_path, - opts -) { - opts = normalizeOptions(opts, NodeGit.DiffOptions); - return _fromBlobs.call( - this, - old_blob, - old_as_path, - new_blob, - new_as_path, - opts - ); -}; diff --git a/lib/rebase.js b/lib/rebase.js index 731f54bd5..2f72e794e 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -1,24 +1,11 @@ var NodeGit = require("../"); var Rebase = NodeGit.Rebase; -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var shallowClone = NodeGit.Utils.shallowClone; var _init = Rebase.init; var _open = Rebase.open; -var _abort = Rebase.prototype.abort; -var _commit = Rebase.prototype.commit; function defaultRebaseOptions(options, checkoutStrategy) { - let checkoutOptions; - let mergeOptions; - if (options) { - options = shallowClone(options); - checkoutOptions = options.checkoutOptions; - mergeOptions = options.mergeOptions; - delete options.checkoutOptions; - delete options.mergeOptions; - if (options.signingCb) { let signingCb = options.signingCb; options.signingCb = function ( @@ -54,45 +41,17 @@ function defaultRebaseOptions(options, checkoutStrategy) { } }; } - - options = normalizeOptions(options, NodeGit.RebaseOptions); - } else { - options = normalizeOptions({}, NodeGit.RebaseOptions); - if (checkoutStrategy) { - checkoutOptions = { + } else if (checkoutStrategy) { + options = { + checkoutOptions: { checkoutStrategy: checkoutStrategy - }; - } - } - - if (checkoutOptions) { - options.checkoutOptions = normalizeOptions( - checkoutOptions, - NodeGit.CheckoutOptions - ); - } - - if (mergeOptions) { - options.mergeOptions = normalizeOptions( - mergeOptions, - NodeGit.MergeOptions - ); + } + }; } return options; } -// Save options on the rebase object. If we don't do this, -// the options may be cleaned up and cause a segfault -// when Rebase.prototype.commit is called. -const lockOptionsOnRebase = (options) => (rebase) => { - Object.defineProperty(rebase, "options", { - value: options, - writable: false - }); - return rebase; -}; - /** * Initializes a rebase * @async @@ -108,12 +67,10 @@ const lockOptionsOnRebase = (options) => (rebase) => { * @return {Remote} */ Rebase.init = function(repository, branch, upstream, onto, options) { - options = defaultRebaseOptions( + return _init(repository, branch, upstream, onto, defaultRebaseOptions( options, NodeGit.Checkout.STRATEGY.FORCE - ); - return _init(repository, branch, upstream, onto, options) - .then(lockOptionsOnRebase(options)); + )); }; /** @@ -125,18 +82,8 @@ Rebase.init = function(repository, branch, upstream, onto, options) { * @return {Remote} */ Rebase.open = function(repository, options) { - options = defaultRebaseOptions( + return _open(repository, defaultRebaseOptions( options, NodeGit.Checkout.STRATEGY.SAFE - ); - return _open(repository, options) - .then(lockOptionsOnRebase(options)); -}; - -Rebase.prototype.commit = function(author, committer, encoding, message) { - return _commit.call(this, author, committer, encoding, message); -}; - -Rebase.prototype.abort = function() { - return _abort.call(this); + )); }; diff --git a/lib/remote.js b/lib/remote.js index 576ead232..c0483ca87 100644 --- a/lib/remote.js +++ b/lib/remote.js @@ -1,19 +1,8 @@ var util = require("util"); var NodeGit = require("../"); -var normalizeFetchOptions = NodeGit.Utils.normalizeFetchOptions; -var normalizeOptions = NodeGit.Utils.normalizeOptions; var lookupWrapper = NodeGit.Utils.lookupWrapper; -var shallowClone = NodeGit.Utils.shallowClone; var Remote = NodeGit.Remote; -var _connect = Remote.prototype.connect; -var _createWithOpts = Remote.createWithOpts; -var _disconnect = Remote.prototype.disconnect; -var _download = Remote.prototype.download; -var _fetch = Remote.prototype.fetch; -var _push = Remote.prototype.push; -var _updateTips = Remote.prototype.updateTips; -var _upload = Remote.prototype.upload; /** * Retrieves the remote by name @@ -25,148 +14,6 @@ var _upload = Remote.prototype.upload; */ Remote.lookup = lookupWrapper(Remote); -/** - * Connects to a remote - * - * @async - * @param {Enums.DIRECTION} direction The direction for the connection - * @param {RemoteCallbacks} callbacks The callback functions for the connection - * @param {ProxyOptions} proxyOpts Proxy settings - * @param {Array} customHeaders extra HTTP headers to use - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.connect = function( - direction, - callbacks, - proxyOpts, - customHeaders -) { - callbacks = normalizeOptions(callbacks || {}, NodeGit.RemoteCallbacks); - proxyOpts = normalizeOptions(proxyOpts || {}, NodeGit.ProxyOptions); - customHeaders = customHeaders || []; - - return _connect.call(this, direction, callbacks, proxyOpts, customHeaders) - .then(() => { - // Save options on the remote object. If we don't do this, - // the options may be cleaned up and cause a segfault - // when Remote.prototype.connect is called. - Object.defineProperties(this, { - callbacks: { - configurable: true, - value: callbacks, - writable: false - }, - proxyOpts: { - configurable: true, - value: proxyOpts, - writable: false - }, - customHeaders: { - configurable: true, - value: customHeaders, - writable: false - } - }); - }); -}; - -Remote.createWithOpts = function(url, options) { - return _createWithOpts(url, normalizeOptions( - options, NodeGit.RemoteCreateOptions)); -}; - -Remote.prototype.disconnect = function() { - return _disconnect.call(this) - .then(() => { - // Release the options - Object.defineProperties(this, { - callbacks: { - configurable: true, - value: undefined, - writable: false - }, - proxyOpts: { - configurable: true, - value: undefined, - writable: false - }, - customHeaders: { - configurable: true, - value: undefined, - writable: false - } - }); - }); -}; - -/** - * Connects to a remote - * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {FetchOptions} opts The fetch options for download, contains callbacks - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.download = function(refspecs, opts) { - return _download - .call(this, refspecs, normalizeFetchOptions(opts)); -}; - -/** - * Connects to a remote - * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {FetchOptions} opts The fetch options for download, contains callbacks - * @param {String} message The message to use for the update reflog messages - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.fetch = function(refspecs, opts, reflog_message) { - return _fetch - .call(this, refspecs, normalizeFetchOptions(opts), reflog_message); -}; - -/** - * Pushes to a remote - * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {PushOptions} options Options for the checkout - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.push = function(refSpecs, opts) { - var callbacks; - var proxyOpts; - - if (opts) { - opts = shallowClone(opts); - callbacks = opts.callbacks; - proxyOpts = opts.proxyOpts; - delete opts.callbacks; - delete opts.proxyOpts; - } else { - opts = {}; - } - - opts = normalizeOptions(opts, NodeGit.PushOptions); - - if (callbacks) { - opts.callbacks = - normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - } - - if (proxyOpts) { - opts.proxyOpts = - normalizeOptions(proxyOpts, NodeGit.ProxyOptions); - } - - return _push.call(this, refSpecs, opts); -}; - /** * Lists advertised references from a remote. You must connect to the remote * before using referenceList. @@ -179,78 +26,6 @@ Remote.prototype.push = function(refSpecs, opts) { */ Remote.prototype.referenceList = Remote.prototype.referenceList; -/** - * Update the tips to the new state - * @param {RemoteCallbacks} callbacks The callback functions for the connection - * @param {boolean} updateFetchhead whether to write to FETCH_HEAD. Pass true - * to behave like git. - * @param {boolean} downloadTags what the behaviour for downloading tags is - * for this fetch. This is ignored for push. - * This must be the same value passed to - * Remote.prototype.download - * @param {string} reflogMessage The message to insert into the reflogs. If - * null and fetching, the default is "fetch ", - * where is the name of the remote (or its url, - * for in-memory remotes). This parameter is - * ignored when pushing. - */ -Remote.prototype.updateTips = function( - callbacks, - updateFetchhead, - downloadTags, - reflogMessage -) { - if (callbacks) { - callbacks = normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - } - - return _updateTips.call( - this, - callbacks, - updateFetchhead, - downloadTags, - reflogMessage - ); -}; - -/** - * Pushes to a remote - * - * @async - * @param {Array} refSpecs The ref specs that should be pushed - * @param {PushOptions} options Options for the checkout - * @param {Function} callback - * @return {Number} error code - */ -Remote.prototype.upload = function(refSpecs, opts) { - var callbacks; - var proxyOpts; - - if (opts) { - opts = shallowClone(opts); - callbacks = opts.callbacks; - proxyOpts = opts.proxyOpts; - delete opts.callbacks; - delete opts.proxyOpts; - } else { - opts = {}; - } - - opts = normalizeOptions(opts, NodeGit.PushOptions); - - if (callbacks) { - opts.callbacks = - normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - } - - if (proxyOpts) { - opts.proxyOpts = - normalizeOptions(proxyOpts, NodeGit.ProxyOptions); - } - - return _upload.call(this, refSpecs, opts); -}; - NodeGit.Remote.COMPLETION_TYPE = {}; var DEPRECATED_STATES = { COMPLETION_DOWNLOAD: "DOWNLOAD", diff --git a/lib/repository.js b/lib/repository.js index 32987d44f..00ce320c1 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -4,7 +4,6 @@ var NodeGit = require("../"); var Blob = NodeGit.Blob; var Checkout = NodeGit.Checkout; var Commit = NodeGit.Commit; -var normalizeOptions = NodeGit.Utils.normalizeOptions; var shallowClone = NodeGit.Utils.shallowClone; var path = require("path"); var Filter = NodeGit.Filter; @@ -22,7 +21,6 @@ var Tree = NodeGit.Tree; var TreeBuilder = NodeGit.Treebuilder; var _discover = Repository.discover; -var _initExt = Repository.initExt; var _fetchheadForeach = Repository.prototype.fetchheadForeach; var _mergeheadForeach = Repository.prototype.mergeheadForeach; @@ -338,12 +336,6 @@ Repository.discover = function(startPath, acrossFs, ceilingDirs) { }); }; -// Override Repository.initExt to normalize initoptions -Repository.initExt = function(repo_path, opts) { - opts = normalizeOptions(opts, NodeGit.RepositoryInitOptions); - return _initExt(repo_path, opts); -}; - Repository.getReferences = function(repo, type, refNamesOnly) { return repo.getReferences().then(function(refList) { @@ -1583,7 +1575,6 @@ Repository.prototype.mergeBranches = function( const signingCallback = mergeBranchOptions && mergeBranchOptions.signingCb; mergePreference = mergePreference || NodeGit.Merge.PREFERENCE.NONE; - mergeOptions = normalizeOptions(mergeOptions, NodeGit.MergeOptions); let promiseChain = Promise.resolve(); diff --git a/lib/reset.js b/lib/reset.js index ab257b7dd..38b6b1bff 100644 --- a/lib/reset.js +++ b/lib/reset.js @@ -1,10 +1,8 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; var Reset = NodeGit.Reset; var _default = Reset.default; var _reset = Reset.reset; -var _fromAnnotated = Reset.fromAnnotated; /** * Look up a refs's commit. @@ -44,7 +42,6 @@ Reset.default = function(repo, target, pathspecs) { * @return {Number} 0 on success or an error code */ Reset.reset = function(repo, target, resetType, opts) { - opts = normalizeOptions(opts, NodeGit.CheckoutOptions); if (repo !== target.repo) { // this is the same that is performed on libgit2's side // https://github.com/nodegit/libgit2/blob/8d89e409616831b7b30a5ca7b89354957137b65e/src/reset.c#L120-L124 @@ -52,25 +49,3 @@ Reset.reset = function(repo, target, resetType, opts) { } return _reset.call(this, repo, target, resetType, opts); }; - -/** - * Sets the current head to the specified commit oid and optionally - * resets the index and working tree to match. - * - * This behaves like reset but takes an annotated commit, which lets - * you specify which extended sha syntax string was specified by a - * user, allowing for more exact reflog messages. - * - * See the documentation for reset. - * - * @async - * @param {Repository} repo - * @param {AnnotatedCommit} target - * @param {Number} resetType - * @param {CheckoutOptions} opts - */ -Reset.fromAnnotated = function(repo, target, resetType, opts) { - opts = normalizeOptions(opts, NodeGit.CheckoutOptions); - - return _fromAnnotated.call(this, repo, target, resetType, opts); -}; diff --git a/lib/revert.js b/lib/revert.js deleted file mode 100644 index d6ef9b705..000000000 --- a/lib/revert.js +++ /dev/null @@ -1,77 +0,0 @@ -var NodeGit = require("../"); -var shallowClone = NodeGit.Utils.shallowClone; -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var Revert = NodeGit.Revert; -var _commit = Revert.commit; -var _revert = Revert.revert; - -/** - * Reverts the given commit against the given "our" commit, producing an index - * that reflects the result of the revert. - * - * @async - * @param {Repository} repo the repository that contains the given commits. - * @param {Commit} revert_commit the commit to revert - * @param {Commit} our_commit the commit to revert against (e.g. HEAD) - * @param {Number} mainline the parent of the revert commit, if it is a merge - * @param {MergeOptions} merge_options the merge options (or null for defaults) - * - * @return {Index} the index result - */ -Revert.commit = function( - repo, - revert_commit, - our_commit, - mainline, - merge_options -) -{ - merge_options = normalizeOptions(merge_options, NodeGit.MergeOptions); - - return _commit.call( - this, - repo, - revert_commit, - our_commit, - mainline, - merge_options - ); -}; - -/** - * Reverts the given commit, producing changes in the index and - * working directory. - * - * @async - * @param {Repository} repo the repository to perform the revert in - * @param {Commit} commit the commit to revert - * @param {RevertOptions} revert_options the revert options - * (or null for defaults) - */ -Revert.revert = function(repo, commit, revertOpts) { - var mergeOpts; - var checkoutOpts; - - if (revertOpts) { - revertOpts = shallowClone(revertOpts); - mergeOpts = revertOpts.mergeOpts; - checkoutOpts = revertOpts.checkoutOpts; - delete revertOpts.mergeOpts; - delete revertOpts.checkoutOpts; - } - - revertOpts = normalizeOptions(revertOpts, NodeGit.RevertOptions); - - if (mergeOpts) { - revertOpts.mergeOpts = - normalizeOptions(mergeOpts, NodeGit.MergeOptions); - } - - if (checkoutOpts) { - revertOpts.checkoutOpts = - normalizeOptions(checkoutOpts, NodeGit.CheckoutOptions); - } - - return _revert.call(this, repo, commit, revertOpts); -}; diff --git a/lib/stash.js b/lib/stash.js index 7067b24ce..88e9f3510 100644 --- a/lib/stash.js +++ b/lib/stash.js @@ -1,32 +1,7 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var shallowClone = NodeGit.Utils.shallowClone; var Stash = NodeGit.Stash; -var _apply = Stash.apply; var _foreach = Stash.foreach; -var _pop = Stash.pop; - -Stash.apply = function(repo, index, options) { - var checkoutOptions; - - if (options) { - options = shallowClone(options); - checkoutOptions = options.checkoutOptions; - delete options.checkoutOptions; - } else { - options = {}; - } - - options = normalizeOptions(options, NodeGit.StashApplyOptions); - - if (checkoutOptions) { - options.checkoutOptions = - normalizeOptions(checkoutOptions, NodeGit.CheckoutOptions); - } - - return _apply(repo, index, options); -}; // Override Stash.foreach to eliminate the need to pass null payload Stash.foreach = function(repo, callback) { @@ -39,24 +14,3 @@ Stash.foreach = function(repo, callback) { return _foreach(repo, wrappedCallback, null); }; - -Stash.pop = function(repo, index, options) { - var checkoutOptions; - - if (options) { - options = shallowClone(options); - checkoutOptions = options.checkoutOptions; - delete options.checkoutOptions; - } else { - options = {}; - } - - options = normalizeOptions(options, NodeGit.StashApplyOptions); - - if (checkoutOptions) { - options.checkoutOptions = - normalizeOptions(checkoutOptions, NodeGit.CheckoutOptions); - } - - return _pop(repo, index, options); -}; diff --git a/lib/status.js b/lib/status.js index c5c762baa..93aca08e0 100644 --- a/lib/status.js +++ b/lib/status.js @@ -1,5 +1,4 @@ var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; var Status = NodeGit.Status; @@ -11,8 +10,7 @@ Status.foreach = function(repo, callback) { return _foreach(repo, callback, null); }; -// Override Status.foreachExt to normalize opts +// Override Status.foreachExt to eliminate the need to pass null payload Status.foreachExt = function(repo, opts, callback) { - opts = normalizeOptions(opts, NodeGit.StatusOptions); return _foreachExt(repo, opts, callback, null); }; diff --git a/lib/status_list.js b/lib/status_list.js deleted file mode 100644 index efccbad2e..000000000 --- a/lib/status_list.js +++ /dev/null @@ -1,12 +0,0 @@ -var NodeGit = require("../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; - -var StatusList = NodeGit.StatusList; - -var _create = StatusList.create; - -// Override StatusList.create to normalize opts -StatusList.create = function(repo, opts) { - opts = normalizeOptions(opts, NodeGit.StatusOptions); - return _create(repo, opts); -}; diff --git a/lib/submodule.js b/lib/submodule.js index 92b0e6ec0..2b0cb530d 100644 --- a/lib/submodule.js +++ b/lib/submodule.js @@ -1,51 +1,10 @@ var NodeGit = require("../"); -var normalizeFetchOptions = NodeGit.Utils.normalizeFetchOptions; -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var shallowClone = NodeGit.Utils.shallowClone; var Submodule = NodeGit.Submodule; var _foreach = Submodule.foreach; -var _update = Submodule.prototype.update; // Override Submodule.foreach to eliminate the need to pass null payload Submodule.foreach = function(repo, callback) { return _foreach(repo, callback, null); }; - -/** - * Updates a submodule - * - * @async - * @param {Number} init Setting this to 1 will initialize submodule - * before updating - * @param {SubmoduleUpdateOptions} options Submodule update settings - * @return {Number} 0 on success, any non-zero return value from a callback - */ -Submodule.prototype.update = function(init, options) { - var fetchOpts; - var checkoutOpts; - - if (options) { - options = shallowClone(options); - fetchOpts = options.fetchOpts; - checkoutOpts = options.checkoutOpts; - delete options.fetchOpts; - delete options.checkoutOpts; - } - - options = normalizeOptions(options, NodeGit.SubmoduleUpdateOptions); - - if (fetchOpts) { - options.fetchOpts = normalizeFetchOptions(fetchOpts); - } - - if (checkoutOpts) { - options.checkoutOpts = normalizeOptions( - checkoutOpts, - NodeGit.CheckoutOptions - ); - } - - return _update.call(this, init, options); -}; diff --git a/lib/utils/normalize_fetch_options.js b/lib/utils/normalize_fetch_options.js deleted file mode 100644 index 2b4370705..000000000 --- a/lib/utils/normalize_fetch_options.js +++ /dev/null @@ -1,43 +0,0 @@ -var NodeGit = require("../../"); -var normalizeOptions = NodeGit.Utils.normalizeOptions; -var shallowClone = NodeGit.Utils.shallowClone; - -/** - * Normalize an object to match a struct. - * - * @param {String, Object} oid - The oid string or instance. - * @return {Object} An Oid instance. - */ -function normalizeFetchOptions(options) { - if (options instanceof NodeGit.FetchOptions) { - return options; - } - - var callbacks; - var proxyOpts; - - if (options) { - options = shallowClone(options); - callbacks = options.callbacks; - proxyOpts = options.proxyOpts; - delete options.callbacks; - delete options.proxyOpts; - } else { - options = {}; - } - - options = normalizeOptions(options, NodeGit.FetchOptions); - - if (callbacks) { - options.callbacks = - normalizeOptions(callbacks, NodeGit.RemoteCallbacks); - } - - if (proxyOpts) { - options.proxyOpts = - normalizeOptions(proxyOpts, NodeGit.ProxyOptions); - } - return options; -} - -NodeGit.Utils.normalizeFetchOptions = normalizeFetchOptions; diff --git a/lib/utils/normalize_options.js b/lib/utils/normalize_options.js deleted file mode 100644 index a1a46255c..000000000 --- a/lib/utils/normalize_options.js +++ /dev/null @@ -1,29 +0,0 @@ -var NodeGit = require("../../"); - -/** - * Normalize an object to match a struct. - * - * @param {String, Object} oid - The oid string or instance. - * @return {Object} An Oid instance. - */ -function normalizeOptions(options, Ctor) { - if (!options) { - return null; - } - - if (options instanceof Ctor) { - return options; - } - - var instance = new Ctor(); - - Object.keys(options).forEach(function(key) { - if (typeof options[key] !== "undefined") { - instance[key] = options[key]; - } - }); - - return instance; -} - -NodeGit.Utils.normalizeOptions = normalizeOptions; From fb4d55862db87a4591518cd8db88ddde3f00045a Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Thu, 22 Apr 2021 16:36:17 -0700 Subject: [PATCH 300/545] Fix patch test so that it waits for function results --- test/tests/patch.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/tests/patch.js b/test/tests/patch.js index 06da2ab91..fe7fe3734 100644 --- a/test/tests/patch.js +++ b/test/tests/patch.js @@ -67,15 +67,15 @@ describe("Patch", function() { // fce88902e66c72b5b93e75bdb5ae717038b221f6 const file = "README.md"; - NodeGit.Blob.lookup( + return NodeGit.Blob.lookup( this.repository, "b252f396b17661462372f78b7bcfc403b8731aaa" ).then(blob => { - NodeGit.Blob.lookup( + return NodeGit.Blob.lookup( this.repository, "b8d014998072c3f9e4b7eba8486011e80d8de98a" ).then(oldBlob => { - NodeGit.Patch.fromBlobs(oldBlob, file, blob, file) + return NodeGit.Patch.fromBlobs(oldBlob, file, blob, file) .then(patch => { assert.strictEqual(patch.size(0, 0, 0), 254); }); @@ -89,11 +89,11 @@ describe("Patch", function() { // old_blob. Should show all lines as additions. const file = "README.md"; - NodeGit.Blob.lookup( + return NodeGit.Blob.lookup( this.repository, "b252f396b17661462372f78b7bcfc403b8731aaa" ).then(blob => { - NodeGit.Patch.fromBlobs(null, file, blob, file) + return NodeGit.Patch.fromBlobs(null, file, blob, file) .then(patch => { assert.strictEqual(patch.size(0, 0, 0), 8905); }); @@ -101,7 +101,7 @@ describe("Patch", function() { }); it("can generate patch from blobs without arguments", function() { - NodeGit.Patch.fromBlobs() + return NodeGit.Patch.fromBlobs() .then(patch => { assert.strictEqual(patch.size(0, 0, 0), 0); }); From 61b14a7b3a351fa9e44f37a83406df80f702de59 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 23 Apr 2021 09:50:15 -0700 Subject: [PATCH 301/545] Remove unused code from struct_content.cc -Fixes an issue where it was impossible to specify an async function where the return result of the function _is actually_ the return result and not an error. - Adjusts descriptor to ensure functions that should be async are async --- generate/input/descriptor.json | 53 ++++ generate/templates/filters/returns_info.js | 6 +- generate/templates/partials/async_function.cc | 6 +- .../templates/partials/field_accessors.cc | 258 +----------------- generate/templates/templates/class_header.h | 6 + generate/templates/templates/nodegit.cc | 6 +- .../templates/templates/struct_content.cc | 153 +++++------ generate/templates/templates/struct_header.h | 97 ++----- 8 files changed, 166 insertions(+), 419 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index e9ae6dacd..a6110fc9d 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -146,6 +146,21 @@ "apply_options": { "hasConstructor": true }, + "apply": { + "functions": { + "git_apply": { + "args": { + "options": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + } + } + }, "attr": { "functions": { "git_attr_cache_flush": { @@ -1998,6 +2013,7 @@ } }, "index_entry": { + "isReturnable": true, "hasConstructor": true, "ignoreInit": true }, @@ -2124,6 +2140,7 @@ ] }, "index_time": { + "isReturnable": true, "hasConstructor": true, "ignoreInit": true }, @@ -2261,6 +2278,9 @@ "cppClassName": "Number", "jsClassName": "Number" } + }, + "return": { + "isErrorCode": true } }, "git_merge_analysis_for_ref": { @@ -2389,6 +2409,9 @@ "notes_commit_out": { "isReturn": true } + }, + "return": { + "isErrorCode": true } }, "git_note_comitter": { @@ -3445,6 +3468,17 @@ "isErrorCode": true } }, + "git_remote_prune": { + "args": { + "callbacks": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } + }, "git_remote_push": { "isAsync": true, "return": { @@ -4568,6 +4602,14 @@ "git_worktree_free": { "ignore": true }, + "git_worktree_is_prunable": { + "args": { + "opts": { + "isOptional": true + } + }, + "isAsync": true + }, "git_worktree_lookup": { "args": { "out": { @@ -4587,6 +4629,17 @@ }, "git_worktree_prune_options_init": { "ignore": true + }, + "git_worktree_prune": { + "args": { + "opts": { + "isOptional": true + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } } }, "dependencies": [ diff --git a/generate/templates/filters/returns_info.js b/generate/templates/filters/returns_info.js index 87a3fc342..5f7bcdc08 100644 --- a/generate/templates/filters/returns_info.js +++ b/generate/templates/filters/returns_info.js @@ -84,7 +84,11 @@ module.exports = function(fn, argReturnsOnly, isAsync) { }); } - return_info.parsedName = return_info.name && isAsync ? "baton->" + return_info.name : "result"; + if (isAsync) { + return_info.parsedName = "baton->" + (return_info.name || "result"); + } else { + return_info.parsedName = "result"; + } return_info.isCppClassIntType = ~['Uint32', 'Int32'].indexOf(return_info.cppClassName); return_info.parsedClassName = (return_info.cppClassName || '').toLowerCase() + "_t"; return_info.returnNameOrName = return_info.returnName || return_info.name; diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 411f8778c..6041c16f3 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -160,20 +160,20 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { {%endeach%} ); - {%if return.isResultOrError %} + {% if return.isResultOrError %} baton->error_code = result; if (result < GIT_OK && git_error_last() != NULL) { baton->error = git_error_dup(git_error_last()); } - {%elsif return.isErrorCode %} + {% elsif return.isErrorCode %} baton->error_code = result; if (result != GIT_OK && git_error_last() != NULL) { baton->error = git_error_dup(git_error_last()); } - {%elsif not return.cType == 'void' %} + {%elsif return.cType != 'void' %} baton->result = result; diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index 4e54b15c4..bcd5e5f87 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -7,16 +7,9 @@ {% if field.isEnum %} info.GetReturnValue().Set(Nan::New((int)wrapper->GetValue()->{{ field.name }})); - {% elsif field.isLibgitType | or field.payloadFor %} + {% elsif field.isLibgitType %} info.GetReturnValue().Set(Nan::New(wrapper->{{ field.name }})); - {% elsif field.isCallbackFunction %} - if (wrapper->{{field.name}}.HasCallback()) { - info.GetReturnValue().Set(wrapper->{{ field.name }}.GetCallback()->GetFunction()); - } else { - info.GetReturnValue().SetUndefined(); - } - {% elsif field.cppClassName == 'String' %} if (wrapper->GetValue()->{{ field.name }}) { info.GetReturnValue().Set(Nan::New(wrapper->GetValue()->{{ field.name }}).ToLocalChecked()); @@ -60,48 +53,6 @@ ); {% endif %} - {% elsif field.isCallbackFunction %} - std::unique_ptr callback; - uint32_t throttle = {%if field.return.throttle %}{{ field.return.throttle }}{%else%}0{%endif%}; - bool waitForResult = true; - if (value->IsFunction()) { - callback.reset(new Nan::Callback(value.As())); - } else if (value->IsObject()) { - v8::Local object = value.As(); - v8::Local callbackKey; - Nan::MaybeLocal maybeObjectCallback = Nan::Get(object, Nan::New("callback").ToLocalChecked()); - if (!maybeObjectCallback.IsEmpty()) { - v8::Local objectCallback = maybeObjectCallback.ToLocalChecked(); - if (objectCallback->IsFunction()) { - callback.reset(new Nan::Callback(objectCallback.As())); - - Nan::MaybeLocal maybeObjectThrottle = Nan::Get(object, Nan::New("throttle").ToLocalChecked()); - if(!maybeObjectThrottle.IsEmpty()) { - v8::Local objectThrottle = maybeObjectThrottle.ToLocalChecked(); - if (objectThrottle->IsNumber()) { - throttle = (int)objectThrottle.As()->Value(); - } - } - - Nan::MaybeLocal maybeObjectWaitForResult = Nan::Get(object, Nan::New("waitForResult").ToLocalChecked()); - if(!maybeObjectWaitForResult.IsEmpty()) { - Local objectWaitForResult = maybeObjectWaitForResult.ToLocalChecked(); - waitForResult = Nan::To(objectWaitForResult).FromJust(); - } - } - } - } - if (callback) { - if (!wrapper->raw->{{ field.name }}) { - wrapper->raw->{{ field.name }} = ({{ field.cType }}){{ field.name }}_cppCallback; - } - - wrapper->{{ field.name }}.SetCallback(std::move(callback), throttle, waitForResult); - } - - {% elsif field.payloadFor %} - wrapper->{{ field.name }}.Reset(value); - {% elsif field.cppClassName == 'String' %} if (wrapper->GetValue()->{{ field.name }}) { } @@ -120,212 +71,5 @@ } {% endif %} } - - {% if field.isCallbackFunction %} - {{ cppClassName }}* {{ cppClassName }}::{{ field.name }}_getInstanceFromBaton({{ field.name|titleCase }}Baton* baton) { - {% if isExtendedStruct %} - return static_cast<{{ cppClassName }}*>((({{cType}}_extended *)baton->self)->payload); - {% else %} - return static_cast<{{ cppClassName }}*>(baton-> - {% each field.args|argsInfo as arg %} - {% if arg.payload == true %} - {{arg.name}} - {% elsif arg.lastArg %} - {{arg.name}} - {% endif %} - {% endeach %}); - {% endif %} - } - - {{ field.return.type }} {{ cppClassName }}::{{ field.name }}_cppCallback ( - {% each field.args|argsInfo as arg %} - {{ arg.cType }} {{ arg.name}}{% if not arg.lastArg %},{% endif %} - {% endeach %} - ) { - {{ field.name|titleCase }}Baton *baton = - new {{ field.name|titleCase }}Baton({{ field.return.noResults }}); - - {% each field.args|argsInfo as arg %} - baton->{{ arg.name }} = {{ arg.name }}; - {% endeach %} - - {{ cppClassName }}* instance = {{ field.name }}_getInstanceFromBaton(baton); - - {% if field.return.type == "void" %} - if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { - delete baton; - } else if (instance->{{ field.name }}.WillBeThrottled()) { - delete baton; - } else if (instance->{{ field.name }}.ShouldWaitForResult()) { - baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync); - delete baton; - } else { - baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync, nodegit::deleteBaton); - } - return; - {% else %} - {{ field.return.type }} result; - - if (instance->nodegitContext != nodegit::ThreadPool::GetCurrentContext()) { - result = baton->defaultResult; - delete baton; - } else if (instance->{{ field.name }}.WillBeThrottled()) { - result = baton->defaultResult; - delete baton; - } else if (instance->{{ field.name }}.ShouldWaitForResult()) { - result = baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync); - delete baton; - } else { - result = baton->defaultResult; - baton->ExecuteAsync({{ field.name }}_async, {{ field.name }}_cancelAsync, nodegit::deleteBaton); - } - return result; - {% endif %} - } - - void {{ cppClassName }}::{{ field.name }}_cancelAsync(void *untypedBaton) { - {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(untypedBaton); - {% if field.return.type != "void" %} - baton->result = {{ field.return.cancel }}; - {% endif %} - baton->Done(); - } - - void {{ cppClassName }}::{{ field.name }}_async(void *untypedBaton) { - Nan::HandleScope scope; - - {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(untypedBaton); - {{ cppClassName }}* instance = {{ field.name }}_getInstanceFromBaton(baton); - - if (instance->{{ field.name }}.GetCallback()->IsEmpty()) { - {% if field.return.type == "int" %} - baton->result = baton->defaultResult; // no results acquired - {% endif %} - baton->Done(); - return; - } - - {% if field.args|callbackArgsCount == 0 %} - v8::Local *argv = NULL; - {% else %} - v8::Local argv[{{ field.args|callbackArgsCount }}] = { - {% each field.args|callbackArgsInfo as arg %} - {% if not arg.firstArg %},{% endif %} - {% if arg.isEnum %} - Nan::New((int)baton->{{ arg.name }}) - {% elsif arg.isLibgitType %} - {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false) - {% elsif arg.cType == "size_t" %} - // HACK: NAN should really have an overload for Nan::New to support size_t - Nan::New((unsigned int)baton->{{ arg.name }}) - {% elsif arg.cppClassName == "String" %} - baton->{{ arg.name }} == NULL - ? Nan::EmptyString() - : Nan::New({%if arg.cType | isDoublePointer %}*{% endif %}baton->{{ arg.name }}).ToLocalChecked() - {% else %} - Nan::New(baton->{{ arg.name }}) - {% endif %} - {% endeach %} - }; - {% endif %} - - Nan::TryCatch tryCatch; - - Nan::MaybeLocal maybeResult = (*(instance->{{ field.name }}.GetCallback()))( - baton->GetAsyncResource(), - {{ field.args|callbackArgsCount }}, - argv - ); - v8::Local result; - if (!maybeResult.IsEmpty()) { - result = maybeResult.ToLocalChecked(); - } - - if(PromiseCompletion::ForwardIfPromise(result, baton, {{ cppClassName }}::{{ field.name }}_promiseCompleted)) { - return; - } - - {% if field.return.type == "void" %} - baton->Done(); - {% else %} - {% each field|returnsInfo false true as _return %} - if (result.IsEmpty() || result->IsNativeError()) { - baton->result = {{ field.return.error }}; - } - else if (!result->IsNull() && !result->IsUndefined()) { - {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); - wrapper->selfFreeing = false; - - *baton->{{ _return.name }} = wrapper->GetValue(); - baton->result = {{ field.return.success }}; - {% else %} - if (result->IsNumber()) { - baton->result = Nan::To(result).FromJust(); - } - else { - baton->result = baton->defaultResult; - } - {% endif %} - } - else { - baton->result = baton->defaultResult; - } - {% endeach %} - baton->Done(); - {% endif %} - } - - void {{ cppClassName }}::{{ field.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result) { - Nan::HandleScope scope; - - {{ field.name|titleCase }}Baton* baton = static_cast<{{ field.name|titleCase }}Baton*>(_baton); - {% if field.return.type == "void" %} - baton->Done(); - {% else %} - if (isFulfilled) { - {% each field|returnsInfo false true as _return %} - if (result.IsEmpty() || result->IsNativeError()) { - baton->result = {{ field.return.error }}; - } - else if (!result->IsNull() && !result->IsUndefined()) { - {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); - wrapper->selfFreeing = false; - - *baton->{{ _return.name }} = wrapper->GetValue(); - baton->result = {{ field.return.success }}; - {% else %} - if (result->IsNumber()) { - baton->result = Nan::To(result).FromJust(); - } - else{ - baton->result = baton->defaultResult; - } - {% endif %} - } - else { - baton->result = baton->defaultResult; - } - {% endeach %} - } - else { - // promise was rejected - {% if isExtendedStruct %} - {{ cppClassName }}* instance = static_cast<{{ cppClassName }}*>((({{cType}}_extended *)baton->self)->payload); - {% else %} - {{ cppClassName }}* instance = static_cast<{{ cppClassName }}*>(baton->{% each field.args|argsInfo as arg %} - {% if arg.payload == true %}{{arg.name}}{% elsif arg.lastArg %}{{arg.name}}{% endif %} - {% endeach %}); - {% endif %} - v8::Local parent = instance->handle(); - SetPrivate(parent, Nan::New("NodeGitPromiseError").ToLocalChecked(), result); - - baton->result = {{ field.return.error }}; - } - baton->Done(); - {% endif %} - } - {% endif %} {% endif %} {% endeach %} diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index 7f3032ffb..27bb1bb2f 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -81,6 +81,7 @@ class {{ cppClassName }} : public {{ cbArg.cType }} {{ cbArg.name }}; {% endeach %} + {{ function.cppFunctionName }}_{{ arg.name|titleCase }}Baton(const {{ arg.return.type }} &defaultResult) : nodegit::AsyncBatonWithResult<{{ arg.return.type }}>(defaultResult) { } @@ -131,6 +132,11 @@ class {{ cppClassName }} : public {%endif%} {%endif%} {%endeach%} + {% if function.return.isResultOrError %} + {% elsif function.return.isErrorCode %} + {% elsif function.return.cType != 'void' %} + {{ function.return.cType }} result; + {% endif %} }; class {{ function.cppFunctionName }}Worker : public nodegit::AsyncWorker { public: diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index f1d9b9e11..0b26dc303 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -96,8 +96,12 @@ NAN_MODULE_INIT(init) { Wrapper::InitializeComponent(target, nodegitContext); PromiseCompletion::InitializeComponent(nodegitContext); {% each %} - {% if type != "enum" %} + {% if type == 'class' %} {{ cppClassName }}::InitializeComponent(target, nodegitContext); + {% elsif type == 'struct' %} + {% if isReturnable %} + {{ cppClassName }}::InitializeComponent(target, nodegitContext); + {% endif %} {% endif %} {% endeach %} diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index 08860e69f..d5c927af9 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -1,3 +1,4 @@ +// generated from struct_content.cc #include #include #ifdef WIN32 @@ -28,112 +29,90 @@ using namespace v8; using namespace node; using namespace std; - -// generated from struct_content.cc -{{ cppClassName }}::{{ cppClassName }}() : NodeGitWrapper<{{ cppClassName }}Traits>(NULL, true, v8::Local()) -{ - {% if ignoreInit == true %} - this->raw = new {{ cType }}; - {% else %} - {% if isExtendedStruct %} - {{ cType }}_extended wrappedValue = {{ cType|upper }}_INIT; - this->raw = ({{ cType }}*) malloc(sizeof({{ cType }}_extended)); - memcpy(this->raw, &wrappedValue, sizeof({{ cType }}_extended)); +{% if isReturnable %} + {{ cppClassName }}::{{ cppClassName }}() : NodeGitWrapper<{{ cppClassName }}Traits>(NULL, true, v8::Local()) + { + {% if ignoreInit == true %} + this->raw = new {{ cType }}; {% else %} - {{ cType }} wrappedValue = {{ cType|upper }}_INIT; - this->raw = ({{ cType }}*) malloc(sizeof({{ cType }})); - memcpy(this->raw, &wrappedValue, sizeof({{ cType }})); + {% if isExtendedStruct %} + {{ cType }}_extended wrappedValue = {{ cType|upper }}_INIT; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }}_extended)); + memcpy(this->raw, &wrappedValue, sizeof({{ cType }}_extended)); + {% else %} + {{ cType }} wrappedValue = {{ cType|upper }}_INIT; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }})); + memcpy(this->raw, &wrappedValue, sizeof({{ cType }})); + {% endif %} {% endif %} - {% endif %} - this->ConstructFields(); -} + this->ConstructFields(); + } -{{ cppClassName }}::{{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner) - : NodeGitWrapper<{{ cppClassName }}Traits>(raw, selfFreeing, owner) -{ - this->ConstructFields(); -} + {{ cppClassName }}::{{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner) + : NodeGitWrapper<{{ cppClassName }}Traits>(raw, selfFreeing, owner) + { + this->ConstructFields(); + } -{{ cppClassName }}::~{{ cppClassName }}() { - {% each fields|fieldsInfo as field %} - {% if not field.ignore %} - {% if not field.isEnum %} - {% if field.isCallbackFunction %} - if (this->{{ field.name }}.HasCallback()) { - {% if isExtendedStruct %} - (({{ cType }}_extended *)this->raw)->payload = NULL; - {% else %} - this->raw->{{ fields|payloadFor field.name }} = NULL; - {% endif %} - } - {% elsif field.hasConstructor |or field.isLibgitType %} - this->{{ field.name }}.Reset(); + {{ cppClassName }}::~{{ cppClassName }}() { + {% each fields|fieldsInfo as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isLibgitType %} + this->{{ field.name }}.Reset(); + {% endif %} {% endif %} {% endif %} - {% endif %} - {% endeach %} -} + {% endeach %} + } -void {{ cppClassName }}::ConstructFields() { - {% each fields|fieldsInfo as field %} - {% if not field.ignore %} - {% if not field.isEnum %} - {% if field.hasConstructor |or field.isLibgitType %} - v8::Local {{ field.name }}Temp = Nan::To({{ field.cppClassName }}::New( - {%if not field.cType|isPointer %}&{%endif%}this->raw->{{ field.name }}, - false - )).ToLocalChecked(); - this->{{ field.name }}.Reset({{ field.name }}Temp); - - {% elsif field.isCallbackFunction %} - - // Set the static method call and set the payload for this function to be - // the current instance - this->raw->{{ field.name }} = NULL; - {% if isExtendedStruct %} - (({{ cType }}_extended *)this->raw)->payload = (void *)this; - {% else %} - this->raw->{{ fields|payloadFor field.name }} = (void *)this; + void {{ cppClassName }}::ConstructFields() { + {% each fields|fieldsInfo as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isLibgitType %} + v8::Local {{ field.name }}Temp = Nan::To({{ field.cppClassName }}::New( + {%if not field.cType|isPointer %}&{%endif%}this->raw->{{ field.name }}, + false + )).ToLocalChecked(); + this->{{ field.name }}.Reset({{ field.name }}Temp); {% endif %} - {% elsif field.payloadFor %} - - v8::Local {{ field.name }} = Nan::Undefined(); - this->{{ field.name }}.Reset({{ field.name }}); {% endif %} {% endif %} - {% endif %} - {% endeach %} -} + {% endeach %} + } -void {{ cppClassName }}::InitializeComponent(Local target, nodegit::Context *nodegitContext) { - Nan::HandleScope scope; + void {{ cppClassName }}::InitializeComponent(Local target, nodegit::Context *nodegitContext) { + Nan::HandleScope scope; - Local nodegitExternal = Nan::New(nodegitContext); - Local tpl = Nan::New(JSNewFunction, nodegitExternal); + Local nodegitExternal = Nan::New(nodegitContext); + Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); - {% each fields as field %} - {% if not field.ignore %} - {% if not field | isPayload %} - Nan::SetAccessor(tpl->InstanceTemplate(), Nan::New("{{ field.jsFunctionName }}").ToLocalChecked(), Get{{ field.cppFunctionName}}, Set{{ field.cppFunctionName}}, nodegitExternal); - {% endif %} - {% endif %} - {% endeach %} + {% each fields as field %} + {% if not field.ignore %} + {% if not field | isPayload %} + Nan::SetAccessor(tpl->InstanceTemplate(), Nan::New("{{ field.jsFunctionName }}").ToLocalChecked(), Get{{ field.cppFunctionName}}, Set{{ field.cppFunctionName}}, nodegitExternal); + {% endif %} + {% endif %} + {% endeach %} - InitializeTemplate(tpl); + InitializeTemplate(tpl); - v8::Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); - nodegitContext->SaveToPersistent("{{ cppClassName }}::Template", constructor_template); -} + v8::Local constructor_template = Nan::GetFunction(tpl).ToLocalChecked(); + nodegitContext->SaveToPersistent("{{ cppClassName }}::Template", constructor_template); + } -{% partial fieldAccessors . %} + {% partial fieldAccessors . %} -// force base class template instantiation, to make sure we get all the -// methods, statics, etc. -template class NodeGitWrapper<{{ cppClassName }}Traits>; + // force base class template instantiation, to make sure we get all the + // methods, statics, etc. + template class NodeGitWrapper<{{ cppClassName }}Traits>; + +{% endif %} Configurable{{ cppClassName }}::Configurable{{ cppClassName }}(nodegit::Context *nodegitContext) : nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>(nodegitContext) diff --git a/generate/templates/templates/struct_header.h b/generate/templates/templates/struct_header.h index abd6fcf91..879901483 100644 --- a/generate/templates/templates/struct_header.h +++ b/generate/templates/templates/struct_header.h @@ -35,79 +35,36 @@ struct {{ cType }}_extended { void* payload; }; {% endif %} -class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { - // grant full access to base class - friend class NodeGitWrapper<{{ cppClassName }}Traits>; - public: - {{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner = v8::Local()); - static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); - - {% each fields as field %} - {% if not field.ignore %} - {% if field.isCallbackFunction %} - static {{ field.return.type }} {{ field.name }}_cppCallback ( - {% each field.args|argsInfo as arg %} - {{ arg.cType }} {{ arg.name}} - {% if not arg.lastArg %} - , - {% endif %} - {% endeach %} - ); - - static void {{ field.name }}_cancelAsync(void *baton); - static void {{ field.name }}_async(void *baton); - static void {{ field.name }}_promiseCompleted(bool isFulfilled, nodegit::AsyncBaton *_baton, v8::Local result); - {% if field.return.type == 'void' %} - class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithNoResult { - public: - {% each field.args|argsInfo as arg %} - {{ arg.cType }} {{ arg.name }}; - {% endeach %} - - {{ field.name|titleCase }}Baton() - : nodegit::AsyncBatonWithNoResult() {} - }; - {% else %} - class {{ field.name|titleCase }}Baton : public nodegit::AsyncBatonWithResult<{{ field.return.type }}> { - public: - {% each field.args|argsInfo as arg %} - {{ arg.cType }} {{ arg.name }}; - {% endeach %} - - {{ field.name|titleCase }}Baton(const {{ field.return.type }} &defaultResult) - : nodegit::AsyncBatonWithResult<{{ field.return.type }}>(defaultResult) {} - }; - {% endif %} - static {{ cppClassName }} * {{ field.name }}_getInstanceFromBaton ( - {{ field.name|titleCase }}Baton *baton); - {% endif %} - {% endif %} - {% endeach %} - - private: - {{ cppClassName }}(); - ~{{ cppClassName }}(); - - void ConstructFields(); - - {% each fields as field %} - {% if not field.ignore %} - {% if not field.isEnum %} - {% if field.isLibgitType %} - Nan::Persistent {{ field.name }}; - {% elsif field.isCallbackFunction %} - CallbackWrapper {{ field.name }}; - {% elsif field.payloadFor %} - Nan::Persistent {{ field.name }}; +{% if isReturnable %} + class {{ cppClassName }} : public NodeGitWrapper<{{ cppClassName }}Traits> { + // grant full access to base class + friend class NodeGitWrapper<{{ cppClassName }}Traits>; + + public: + {{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner = v8::Local()); + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); + + private: + {{ cppClassName }}(); + ~{{ cppClassName }}(); + + void ConstructFields(); + + {% each fields as field %} + {% if not field.ignore %} + {% if not field.isEnum %} + {% if field.isLibgitType %} + Nan::Global {{ field.name }}; + {% endif %} {% endif %} - {% endif %} - static NAN_GETTER(Get{{ field.cppFunctionName }}); - static NAN_SETTER(Set{{ field.cppFunctionName }}); + static NAN_GETTER(Get{{ field.cppFunctionName }}); + static NAN_SETTER(Set{{ field.cppFunctionName }}); - {% endif %} - {% endeach %} -}; + {% endif %} + {% endeach %} + }; +{% endif %} class Configurable{{ cppClassName }} : public nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits> { friend class nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>; From a1c0a5cb37d7aadba85f310233111cec2b1faf51 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 23 Apr 2021 10:57:21 -0700 Subject: [PATCH 302/545] C++ rule of five If one of the copy/move constructors, copy/move assignment operators, or destructor are defined, the others should be defined as well. --- generate/templates/manual/include/async_baton.h | 4 ++++ generate/templates/manual/include/async_worker.h | 4 ++++ .../templates/manual/include/callback_wrapper.h | 5 +++++ generate/templates/manual/include/context.h | 8 ++++++++ .../templates/manual/include/convenient_hunk.h | 10 +++++++++- .../templates/manual/include/convenient_patch.h | 13 +++++++++++-- .../templates/manual/include/filter_registry.h | 8 ++++++++ generate/templates/manual/include/lock_master.h | 4 ++++ .../templates/manual/include/nodegit_wrapper.h | 4 ++++ generate/templates/manual/include/thread_pool.h | 5 +++++ .../manual/repository/refresh_references.cc | 15 +++++++++++++++ generate/templates/manual/revwalk/commit_walk.cc | 5 +++++ .../templates/manual/revwalk/file_history_walk.cc | 5 +++++ generate/templates/manual/src/thread_pool.cc | 12 ++++++++++++ generate/templates/templates/class_header.h | 14 ++++++++++++++ generate/templates/templates/struct_header.h | 9 +++++++++ 16 files changed, 122 insertions(+), 3 deletions(-) diff --git a/generate/templates/manual/include/async_baton.h b/generate/templates/manual/include/async_baton.h index 4fadb30fc..33da4a452 100644 --- a/generate/templates/manual/include/async_baton.h +++ b/generate/templates/manual/include/async_baton.h @@ -20,6 +20,10 @@ namespace nodegit { typedef std::function CompletionCallback; AsyncBaton(); + AsyncBaton(const AsyncBaton &) = delete; + AsyncBaton(AsyncBaton &&) = delete; + AsyncBaton &operator=(const AsyncBaton &) = delete; + AsyncBaton &operator=(AsyncBaton &&) = delete; virtual ~AsyncBaton() {} diff --git a/generate/templates/manual/include/async_worker.h b/generate/templates/manual/include/async_worker.h index a9acc00a2..b8f290990 100644 --- a/generate/templates/manual/include/async_worker.h +++ b/generate/templates/manual/include/async_worker.h @@ -13,6 +13,10 @@ namespace nodegit { public: AsyncWorker(Nan::Callback *callback, const char *resourceName, std::map> &cleanupHandles); AsyncWorker(Nan::Callback *callback, const char *resourceName); + AsyncWorker(const AsyncWorker &) = delete; + AsyncWorker(AsyncWorker &&) = delete; + AsyncWorker &operator=(const AsyncWorker &) = delete; + AsyncWorker &operator=(AsyncWorker &&) = delete; // This must be implemented by every async worker // so that the thread pool can lock separately diff --git a/generate/templates/manual/include/callback_wrapper.h b/generate/templates/manual/include/callback_wrapper.h index 961d9e912..d50b97610 100644 --- a/generate/templates/manual/include/callback_wrapper.h +++ b/generate/templates/manual/include/callback_wrapper.h @@ -23,6 +23,11 @@ class CallbackWrapper { public: CallbackWrapper(): jsCallback(nullptr), throttle(0), lastCallTime(0) {} + CallbackWrapper(const CallbackWrapper &) = delete; + CallbackWrapper(CallbackWrapper &&) = delete; + CallbackWrapper &operator=(const CallbackWrapper &) = delete; + CallbackWrapper &operator=(CallbackWrapper &&) = delete; + bool HasCallback() { return jsCallback != nullptr; } diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 098b54bf6..60d21c539 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -31,6 +31,10 @@ namespace nodegit { class Context { public: Context(v8::Isolate *isolate); + Context(const Context &) = delete; + Context(Context &&) = delete; + Context &operator=(const Context &) = delete; + Context &operator=(Context &&) = delete; ~Context(); @@ -68,6 +72,10 @@ namespace nodegit { class AsyncContextCleanupHandle { public: + AsyncContextCleanupHandle(const AsyncContextCleanupHandle &) = delete; + AsyncContextCleanupHandle(AsyncContextCleanupHandle &&) = delete; + AsyncContextCleanupHandle &operator=(const AsyncContextCleanupHandle &) = delete; + AsyncContextCleanupHandle &operator=(AsyncContextCleanupHandle &&) = delete; ~AsyncContextCleanupHandle(); private: diff --git a/generate/templates/manual/include/convenient_hunk.h b/generate/templates/manual/include/convenient_hunk.h index 50f40b4d5..c45da7368 100644 --- a/generate/templates/manual/include/convenient_hunk.h +++ b/generate/templates/manual/include/convenient_hunk.h @@ -41,6 +41,10 @@ class ConvenientHunk : public Nan::ObjectWrap { private: ConvenientHunk(HunkData *hunk); + ConvenientHunk(const ConvenientHunk &) = delete; + ConvenientHunk(ConvenientHunk &&) = delete; + ConvenientHunk &operator=(const ConvenientHunk &) = delete; + ConvenientHunk &operator=(ConvenientHunk &&) = delete; ~ConvenientHunk(); HunkData *hunk; @@ -66,7 +70,11 @@ class ConvenientHunk : public Nan::ObjectWrap { Nan::Callback *callback ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:ConvenientHunk:Lines") , baton(_baton) {}; - ~LinesWorker() {}; + LinesWorker(const LinesWorker &) = delete; + LinesWorker(LinesWorker &&) = delete; + LinesWorker &operator=(const LinesWorker &) = delete; + LinesWorker &operator=(LinesWorker &&) = delete; + ~LinesWorker(){}; void Execute(); void HandleErrorCallback(); void HandleOKCallback(); diff --git a/generate/templates/manual/include/convenient_patch.h b/generate/templates/manual/include/convenient_patch.h index 35aae9355..a89476569 100644 --- a/generate/templates/manual/include/convenient_patch.h +++ b/generate/templates/manual/include/convenient_patch.h @@ -39,7 +39,12 @@ using namespace v8; class ConvenientPatch : public Nan::ObjectWrap { public: - static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); + ConvenientPatch(const ConvenientPatch &) = delete; + ConvenientPatch(ConvenientPatch &&) = delete; + ConvenientPatch &operator=(const ConvenientPatch &) = delete; + ConvenientPatch &operator=(ConvenientPatch &&) = delete; + + static void InitializeComponent(v8::Local target, nodegit::Context *nodegitContext); static v8::Local New(void *raw); @@ -78,7 +83,11 @@ class ConvenientPatch : public Nan::ObjectWrap { Nan::Callback *callback ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:ConvenientPatch:Hunks") , baton(_baton) {}; - ~HunksWorker() {}; + HunksWorker(const HunksWorker &) = delete; + HunksWorker(HunksWorker &&) = delete; + HunksWorker &operator=(const HunksWorker &) = delete; + HunksWorker &operator=(HunksWorker &&) = delete; + ~HunksWorker(){}; void Execute(); void HandleErrorCallback(); void HandleOKCallback(); diff --git a/generate/templates/manual/include/filter_registry.h b/generate/templates/manual/include/filter_registry.h index f636a66f3..ca98d972e 100644 --- a/generate/templates/manual/include/filter_registry.h +++ b/generate/templates/manual/include/filter_registry.h @@ -52,6 +52,10 @@ class GitFilterRegistry : public Nan::ObjectWrap { public: RegisterWorker(FilterRegisterBaton *_baton, Nan::Callback *callback, std::map> &cleanupHandles) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Register", cleanupHandles), baton(_baton) {}; + RegisterWorker(const RegisterWorker &) = delete; + RegisterWorker(RegisterWorker &&) = delete; + RegisterWorker &operator=(const RegisterWorker &) = delete; + RegisterWorker &operator=(RegisterWorker &&) = delete; ~RegisterWorker() {}; void Execute(); void HandleErrorCallback(); @@ -66,6 +70,10 @@ class GitFilterRegistry : public Nan::ObjectWrap { public: UnregisterWorker(FilterUnregisterBaton *_baton, Nan::Callback *callback) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:FilterRegistry:Unregister"), baton(_baton) {}; + UnregisterWorker(const UnregisterWorker &) = delete; + UnregisterWorker(UnregisterWorker &&) = delete; + UnregisterWorker &operator=(const UnregisterWorker &) = delete; + UnregisterWorker &operator=(UnregisterWorker &&) = delete; ~UnregisterWorker() {}; void Execute(); void HandleErrorCallback(); diff --git a/generate/templates/manual/include/lock_master.h b/generate/templates/manual/include/lock_master.h index 54ca0e64a..0cd313b60 100644 --- a/generate/templates/manual/include/lock_master.h +++ b/generate/templates/manual/include/lock_master.h @@ -79,6 +79,10 @@ namespace nodegit { // So we rely on ConstructorImpl to abort if there is no registered LockMaster ConstructorImpl(); } + TemporaryUnlock(const TemporaryUnlock &) = delete; + TemporaryUnlock(TemporaryUnlock &&) = delete; + TemporaryUnlock &operator=(const TemporaryUnlock &) = delete; + TemporaryUnlock &operator=(TemporaryUnlock &&) = delete; ~TemporaryUnlock() { if(!impl) { return; diff --git a/generate/templates/manual/include/nodegit_wrapper.h b/generate/templates/manual/include/nodegit_wrapper.h index 3ba026b8a..4919926d0 100644 --- a/generate/templates/manual/include/nodegit_wrapper.h +++ b/generate/templates/manual/include/nodegit_wrapper.h @@ -57,6 +57,10 @@ class NodeGitWrapper : public Nan::ObjectWrap { NodeGitWrapper(cType *raw, bool selfFreeing, v8::Local owner); NodeGitWrapper(const char *error); // calls ThrowError + NodeGitWrapper(const NodeGitWrapper &) = delete; + NodeGitWrapper(NodeGitWrapper &&) = delete; + NodeGitWrapper &operator=(const NodeGitWrapper &) = delete; + NodeGitWrapper &operator=(NodeGitWrapper &&) = delete; ~NodeGitWrapper(); static NAN_METHOD(JSNewFunction); diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 6c983ecff..7e6e3b605 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -24,6 +24,11 @@ namespace nodegit { // queued work is completed ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context); + ThreadPool(const ThreadPool &) = delete; + ThreadPool(ThreadPool &&) = delete; + ThreadPool &operator=(const ThreadPool &) = delete; + ThreadPool &operator=(ThreadPool &&) = delete; + ~ThreadPool(); // Queues work on the thread pool, followed by completion call scheduled diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 7528601a9..5ddaec57f 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -83,6 +83,11 @@ class RefreshedRefModel { } } + RefreshedRefModel(const RefreshedRefModel &) = delete; + RefreshedRefModel(RefreshedRefModel &&) = delete; + RefreshedRefModel &operator=(const RefreshedRefModel &) = delete; + RefreshedRefModel &operator=(RefreshedRefModel &&) = delete; + static int fromReference(RefreshedRefModel **out, git_reference *ref, git_odb *odb) { RefreshedRefModel *refModel = new RefreshedRefModel(ref); const git_oid *referencedTargetOid = git_reference_target(ref); @@ -262,6 +267,11 @@ class UpstreamModel { ahead(0), behind(0) {} + UpstreamModel(const UpstreamModel &) = delete; + UpstreamModel(UpstreamModel &&) = delete; + UpstreamModel &operator=(const UpstreamModel &) = delete; + UpstreamModel &operator=(UpstreamModel &&) = delete; + static bool fromReference(UpstreamModel **out, git_reference *ref) { if (!git_reference_is_branch(ref)) { return false; @@ -351,6 +361,11 @@ class RefreshReferencesData { cherrypick(NULL), merge(NULL) {} + RefreshReferencesData(const RefreshReferencesData &) = delete; + RefreshReferencesData(RefreshReferencesData &&) = delete; + RefreshReferencesData &operator=(const RefreshReferencesData &) = delete; + RefreshReferencesData &operator=(RefreshReferencesData &&) = delete; + ~RefreshReferencesData() { while(refs.size()) { delete refs.back(); diff --git a/generate/templates/manual/revwalk/commit_walk.cc b/generate/templates/manual/revwalk/commit_walk.cc index a5cbbc593..4fe60de9e 100644 --- a/generate/templates/manual/revwalk/commit_walk.cc +++ b/generate/templates/manual/revwalk/commit_walk.cc @@ -40,6 +40,11 @@ class CommitModel { } } + CommitModel(const CommitModel &) = delete; + CommitModel(CommitModel &&) = delete; + CommitModel &operator=(const CommitModel &) = delete; + CommitModel &operator=(CommitModel &&) = delete; + v8::Local toJavascript() { if (!fetchSignature) { v8::Local commitObject = GitCommit::New( diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index fc8a17dac..93b74437e 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -22,6 +22,11 @@ class FileHistoryEvent { } } + FileHistoryEvent(const FileHistoryEvent &) = delete; + FileHistoryEvent(FileHistoryEvent &&) = delete; + FileHistoryEvent &operator=(const FileHistoryEvent &) = delete; + FileHistoryEvent &operator=(FileHistoryEvent &&) = delete; + ~FileHistoryEvent() { if (commit != NULL) { git_commit_free(commit); diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index e03115707..f911fd47c 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -23,6 +23,10 @@ namespace nodegit { Task(Type initType) : type(initType) {} + Task(const Task &) = delete; + Task(Task &&) = delete; + Task &operator=(const Task &) = delete; + Task &operator=(Task &&) = delete; // We must define a virtual destructor so that derived classes are castable virtual ~Task() {} @@ -55,6 +59,10 @@ namespace nodegit { Event(Type initType) : type(initType) {} + Event(const Event &) = delete; + Event(Event &&) = delete; + Event &operator=(const Event &) = delete; + Event &operator=(Event &&) = delete; Type type; @@ -236,6 +244,10 @@ namespace nodegit { Job(Type initType) : type(initType) {} + Job(const Job &) = delete; + Job(Job &&) = delete; + Job &operator=(const Job &) = delete; + Job &operator=(Job &&) = delete; virtual ~Job() {} diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index 27bb1bb2f..2b8797159 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -57,6 +57,11 @@ class {{ cppClassName }} : public friend class NodeGitWrapper<{{ cppClassName }}Traits>; {%endif %} public: + {{ cppClassName }}(const {{ cppClassName }} &) = delete; + {{ cppClassName }}({{ cppClassName }} &&) = delete; + {{ cppClassName }} &operator=(const {{ cppClassName }} &) = delete; + {{ cppClassName }} &operator=({{ cppClassName }} &&) = delete; + static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); {% each functions as function %} @@ -146,6 +151,10 @@ class {{ cppClassName }} : public std::map> &cleanupHandles ) : nodegit::AsyncWorker(callback, "nodegit:AsyncWorker:{{ cppClassName }}:{{ function.cppFunctionName }}", cleanupHandles) , baton(_baton) {}; + {{ function.cppFunctionName }}Worker(const {{ function.cppFunctionName }}Worker &) = delete; + {{ function.cppFunctionName }}Worker({{ function.cppFunctionName }}Worker &&) = delete; + {{ function.cppFunctionName }}Worker &operator=(const {{ function.cppFunctionName }}Worker &) = delete; + {{ function.cppFunctionName }}Worker &operator=({{ function.cppFunctionName }}Worker &&) = delete; ~{{ function.cppFunctionName }}Worker() {}; void Execute(); void HandleErrorCallback(); @@ -180,6 +189,11 @@ class {{ cppClassName }} : public {%endeach%} } + {{ function.cppFunctionName }}_globalPayload(const {{ function.cppFunctionName }}_globalPayload &) = delete; + {{ function.cppFunctionName }}_globalPayload({{ function.cppFunctionName }}_globalPayload &&) = delete; + {{ function.cppFunctionName }}_globalPayload &operator=(const {{ function.cppFunctionName }}_globalPayload &) = delete; + {{ function.cppFunctionName }}_globalPayload &operator=({{ function.cppFunctionName }}_globalPayload &&) = delete; + ~{{ function.cppFunctionName }}_globalPayload() { {%each function.args as arg %} {%if arg.isCallbackFunction %} diff --git a/generate/templates/templates/struct_header.h b/generate/templates/templates/struct_header.h index 879901483..1c2495f44 100644 --- a/generate/templates/templates/struct_header.h +++ b/generate/templates/templates/struct_header.h @@ -42,6 +42,10 @@ struct {{ cType }}_extended { public: {{ cppClassName }}({{ cType }}* raw, bool selfFreeing, v8::Local owner = v8::Local()); + {{ cppClassName }}(const {{ cppClassName }} &) = delete; + {{ cppClassName }}({{ cppClassName }} &&) = delete; + {{ cppClassName }} &operator=(const {{ cppClassName }} &) = delete; + {{ cppClassName }} &operator=({{ cppClassName }} &&) = delete; static void InitializeComponent (v8::Local target, nodegit::Context *nodegitContext); private: @@ -73,6 +77,11 @@ class Configurable{{ cppClassName }} : public nodegit::ConfigurableClassWrapper< static v8ConversionResult fromJavascript(nodegit::Context *nodegitContext, v8::Local input); ~Configurable{{ cppClassName }}(); + Configurable{{ cppClassName }}(const Configurable{{ cppClassName }} &) = delete; + Configurable{{ cppClassName }}(Configurable{{ cppClassName }} &&) = delete; + Configurable{{ cppClassName }} &operator=(const Configurable{{ cppClassName }} &) = delete; + Configurable{{ cppClassName }} &operator=(Configurable{{ cppClassName }} &&) = delete; + {% each fields as field %} {% if not field.ignore %} {% if field.isCallbackFunction %} From 936f5cd9de89f24534922b8b48679486593ca383 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 23 Apr 2021 11:02:47 -0700 Subject: [PATCH 303/545] Leverage modern pass-by-value constructor --- .../templates/manual/include/configurable_class_wrapper.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/include/configurable_class_wrapper.h b/generate/templates/manual/include/configurable_class_wrapper.h index 9c780a7db..6d177d430 100644 --- a/generate/templates/manual/include/configurable_class_wrapper.h +++ b/generate/templates/manual/include/configurable_class_wrapper.h @@ -18,11 +18,11 @@ namespace nodegit { struct v8ConversionResult { v8ConversionResult(std::string _error) - : error(_error), result(nullptr) + : error(std::move(_error)), result(nullptr) {} v8ConversionResult(std::shared_ptr _result) - : result(_result) + : result(std::move(_result)) {} std::string error; From 3a8985756e68560b5aa84adab988b681e1695f84 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 23 Apr 2021 14:43:55 -0700 Subject: [PATCH 304/545] Delete copy and move constructors for ConfigurableClassWrapper --- .../templates/manual/include/configurable_class_wrapper.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/generate/templates/manual/include/configurable_class_wrapper.h b/generate/templates/manual/include/configurable_class_wrapper.h index 6d177d430..283eb7e44 100644 --- a/generate/templates/manual/include/configurable_class_wrapper.h +++ b/generate/templates/manual/include/configurable_class_wrapper.h @@ -33,6 +33,11 @@ namespace nodegit { ConfigurableClassWrapper(nodegit::Context *_nodeGitContext) : nodegitContext(_nodeGitContext), raw(nullptr) {} + ConfigurableClassWrapper(const ConfigurableClassWrapper &) = delete; + ConfigurableClassWrapper(ConfigurableClassWrapper &&) = delete; + ConfigurableClassWrapper &operator=(const ConfigurableClassWrapper &) = delete; + ConfigurableClassWrapper &operator=(ConfigurableClassWrapper &&) = delete; + virtual ~ConfigurableClassWrapper() { if (raw != nullptr) { delete raw; From 9fae6f82d79846ff32f67f782532a87eb5cd15f7 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 23 Apr 2021 14:45:55 -0700 Subject: [PATCH 305/545] Bump to v0.28.0-alpha.6 --- CHANGELOG.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39fea7835..fefba51ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,67 @@ # Change Log +## v0.28.0-alpha.6 [(2021-04-23)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.6) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.5...v0.28.0-alpha.6) + +#### Summary of changes +- Rewrote options normalization such that it is done in C++. Provided deprecated classes for backwards compatibility. These will be removed in a later version of Nodegit. +- Deprecated construction of these objects, in the future, please pass plain objects with just the fields you wish to override to NodeGit, and the library will take care of the rest. + - NodeGit.ApplyOptions + - NodeGit.BlameOptions + - NodeGit.BlobFilterOptions + - NodeGit.CheckoutOptions + - NodeGit.CherrypickOptions + - NodeGit.CloneOptions + - NodeGit.DescribeFormatOptions + - NodeGit.DiffFindOptions + - NodeGit.FetchOptions + - NodeGit.MergeFileInput + - NodeGit.MergeFileOptions + - NodeGit.MergeOptions + - NodeGit.ProxyOptions + - NodeGit.PushOptions + - NodeGit.RebaseOptions + - NodeGit.RemoteCreatOptions + - NodeGit.RepositoryInitOptions + - NodeGit.RevertOptions + - NodeGit.StashApplyOptions + - NodeGit.StatusOptions + - NodeGit.SubmoduleUpdateOptions +- Ensured the following functions have their optional arguments labeled/working as optional: + - NodeGit.Apply + - NodeGit.Checkout.index + - NodeGit.Cherrypick + - NodeGit.Cherrypick.commit + - NodeGit.Merge + - NodeGit.Patch.fromBlobs + - NodeGit.Rebase.open + - NodeGit.Remote.prototype.connect + - NodeGit.Remote.prototype.download + - NodeGit.Remote.prototype.fetch + - NodeGit.Remote.prototype.prune + - NodeGit.Remote.prototype.push + - NodeGit.Remote.prototype.upload + - NodeGit.Stash.apply + - NodeGit.Stash.pop + - NodeGit.Worktree.isPrunable + - NodeGit.Worktree.prune +- Updated the following functions to be async: + - NodeGit.Apply + - NodeGit.Remote.prototype.prune + - NodeGit.Worktree.isPrunable + - NodeGit.Worktree.prune +- Addressed issue where GitWorktreePruneOptions and GitWorktreeAddOptions were impossible to instantiate, thus making working with worktress possible now. +- Addressed issue where GitIndexTime was not configurable +- Addressed issue where the following functions did not return errors from libgit2: + - NodeGit.Merge.analysis + - NodeGit.Note.commitRemove + +#### Merged PRs into NodeGit +- [Eliminate need for normalize options #1837](https://github.com/nodegit/nodegit/pull/1837) +- [Define optional arguments for Patch.fromBlobs() #1835](https://github.com/nodegit/nodegit/pull/1835) + + ## v0.28.0-alpha.5 [(2021-04-09)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.5) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.4...v0.28.0-alpha.5) diff --git a/package-lock.json b/package-lock.json index dd4428ad0..f79ba75f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.5", + "version": "0.28.0-alpha.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8e01bacab..3e1ee49ff 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.5", + "version": "0.28.0-alpha.6", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 545a73a3c4fdd33dd248b5056be741258ec007ff Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 30 Apr 2021 15:44:05 -0700 Subject: [PATCH 306/545] Bump Libgit2 to fix proxy auth on linux / osx --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 7617d1f8a..81a5ce958 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 7617d1f8a34f84498e86d6b500ccb4c077816eea +Subproject commit 81a5ce9581d699f7b9fdec2195a46b656faec453 From f92caf826d91a053321fbd1fa82e39936ba35edd Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Fri, 30 Apr 2021 16:33:19 -0700 Subject: [PATCH 307/545] Bump to v0.28.0-alpha.7 --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fefba51ca..0c33ff9c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## v0.28.0-alpha.7 [(2021-04-30)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.7) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.6...v0.28.0-alpha.7) + +#### Summary of changes +- Fixes issue with where proxy authentication fails on linux/osx with assertion error. + +#### Merged PRs into NodeGit +- [Bump Libgit2 to fix proxy auth on linux / osx #1841](https://github.com/nodegit/nodegit/pull/1841) + +#### Merged PRs into Libgit2 +- [https://github.com/libgit2/libgit2/pull/5852](https://github.com/libgit2/libgit2/pull/5852) + + ## v0.28.0-alpha.6 [(2021-04-23)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.6) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.5...v0.28.0-alpha.6) diff --git a/package-lock.json b/package-lock.json index f79ba75f8..4f29c0a71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.6", + "version": "0.28.0-alpha.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3e1ee49ff..506a46485 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.6", + "version": "0.28.0-alpha.7", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 1e58223d05dbe528be69e0d736ea4a6760eb9e82 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 10 May 2021 08:58:10 -0700 Subject: [PATCH 308/545] Bump libgit2 to include libgit2#5852 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 81a5ce958..a807e37df 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 81a5ce9581d699f7b9fdec2195a46b656faec453 +Subproject commit a807e37df4ca3f60df7e9675e3c8049a21dd6283 From 0f4949aeecab7c398bc91bfb53f2982497781ff8 Mon Sep 17 00:00:00 2001 From: Tyler Ang-Wanek Date: Mon, 10 May 2021 09:25:07 -0700 Subject: [PATCH 309/545] Bump to v0.28.0-alpha.8 --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c33ff9c9..8bac2ebf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## v0.28.0-alpha.8 [(2021-05-10)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.8) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.7...v0.28.0-alpha.8) + +#### Summary of changes +- Fixes another issue where Kerberos proxy authentication causes network failures + +#### Merged PRs into NodeGit +- [Bump libgit2 to include libgit2#5852 #1844](https://github.com/nodegit/nodegit/pull/1844) + +#### Merged PRs into Libgit2 +- [Fix issues with Proxy Authentication after httpclient refactor #5852](https://github.com/libgit2/libgit2/pull/5852) + + ## v0.28.0-alpha.7 [(2021-04-30)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.7) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.6...v0.28.0-alpha.7) diff --git a/package-lock.json b/package-lock.json index 4f29c0a71..b07d309fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.7", + "version": "0.28.0-alpha.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 506a46485..bb3793760 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.7", + "version": "0.28.0-alpha.8", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From b724238bd30c50cb893939d2d4ffc1863fbf4f23 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 27 May 2021 15:41:17 -0700 Subject: [PATCH 310/545] Shallow clone rebase options before modifying Otherwise, we end up recursively calling signingCb every time Rebase.init or Rebase.open are called with the same options object --- lib/rebase.js | 5 ++ test/tests/rebase.js | 125 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) diff --git a/lib/rebase.js b/lib/rebase.js index 2f72e794e..92e0de95b 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -6,6 +6,11 @@ var _open = Rebase.open; function defaultRebaseOptions(options, checkoutStrategy) { if (options) { + // Ensure we don't modify the passed-in options object. + // This could lead to us recursing signingCb if the same + // options object is later re-used. + options = Object.assign({}, options); + if (options.signingCb) { let signingCb = options.signingCb; options.signingCb = function ( diff --git a/test/tests/rebase.js b/test/tests/rebase.js index 8e6e7ec2d..89ab43515 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -2415,4 +2415,129 @@ describe("Rebase", function() { assert.equal(error.errno, NodeGit.Error.CODE.ITEROVER); }); }); + + + it("rebase signs correctly if rebaseOptions are re-used", function () { + const ourFileName = "ourNewFile.txt"; + const theirFileName = "theirNewFile.txt"; + + const ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; + const theirFileContent = "I'm skeptical about Toll Roads"; + + const ourSignature = NodeGit.Signature.create + ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); + const theirSignature = NodeGit.Signature.create + ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); + + let ourCommit; + let theirCommit; + + let rebase; + let newCommitOid; + + const rebaseOptions = { + signingCb: () => ({ + code: NodeGit.Error.CODE.OK, + field: "moose-sig", + signedData: "A moose was here." + }) + }; + + const repository = this.repository; + + // Create two commits on master + // one + return fse.writeFile(path.join(repository.workdir(), ourFileName), + ourFileContent) + .then(() => RepoUtils.addFileToIndex(repository, ourFileName)) + .then((oid) => { + assert.equal(oid.toString(), + "11ead82b1135b8e240fb5d61e703312fb9cc3d6a"); + return repository.createCommit("HEAD", ourSignature, ourSignature, + "we made a commit", oid, []); + }) + .then((commitOid) => { + assert.equal(commitOid.toString(), + "91a183f87842ebb7a9b08dad8bc2473985796844"); + return repository.getCommit(commitOid); + }) + .then((_ourCommit) => { + ourCommit = _ourCommit; + return fse.writeFile(path.join(repository.workdir(), theirFileName), + theirFileContent); + }) + .then(() => RepoUtils.addFileToIndex(repository, theirFileName)) + .then((oid) => { + assert.equal(oid.toString(), + "76631cb5a290dafe2959152626bb90f2a6d8ec94"); + return repository.createCommit("HEAD", theirSignature, + theirSignature, "they made a commit", oid, [ourCommit]); + }) + .then((commitOid) => { + assert.equal(commitOid.toString(), + "0e9231d489b3f4303635fc4b0397830da095e7e7"); + return repository.getCommit(commitOid); + + }) + .then((_theirCommit) => { + theirCommit = _theirCommit; + return Promise.all([ + NodeGit.AnnotatedCommit.lookup( + repository, + ourCommit.id() + ), + NodeGit.AnnotatedCommit.lookup( + repository, + theirCommit.id() + ) + ]); + }) + // rebase latest commit + .then(([ourAnnotatedCommit, theirAnnotatedCommit]) => + NodeGit.Rebase.init( + repository, + // branch, upstream, onto + theirAnnotatedCommit, ourAnnotatedCommit, null, + rebaseOptions // use once + )) + .then(() => { + return NodeGit.Rebase.open( + repository, + rebaseOptions // use twice + ); + }) + .then((_rebase) => { + rebase = _rebase; + return rebase.next(); + }) + .then(() => { + const operationCurrentIndex = rebase.operationCurrent(); + assert(operationCurrentIndex === 0); + // Make sure we don't crash calling the signature CB + // after collecting garbage. + garbageCollect(); + return rebase.commit(null, ourSignature); + }) + .then((_newCommitOid) => { + newCommitOid = _newCommitOid; + assert.strictEqual(newCommitOid.toString(), + "89ad8168264267bcc50ee60ade3bc3804f55aa72"); + return rebase.next(); + }) + .then(() => { + assert.fail("should throw"); + }) + .catch((error) => { + assert(error.errno === NodeGit.Error.CODE.ITEROVER); + assert.strictEqual(rebase.finish(ourSignature), 0); + return NodeGit.Commit.extractSignature( + repository, + newCommitOid.toString(), + "moose-sig" + ); + }) + .then((sig) => { + assert.strictEqual(sig.signature, "A moose was here."); + }); +}); }); From 4561dcb7c120474a4553baa27e4c4c2f4be23a2b Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 4 Jun 2021 11:12:03 -0700 Subject: [PATCH 311/545] Bump to v0.28.0-alpha.9 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bac2ebf7..1085de631 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.28.0-alpha.9 [(2021-06-04)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.9) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.8...v0.28.0-alpha.9) + +#### Summary of changes +- Fixes an issue where rebase.init and rebase.open were ignoring callbacks in some situations + +#### Merged PRs into NodeGit +- [Shallow clone rebase options before modifying #1845](https://github.com/nodegit/nodegit/pull/1845) + + ## v0.28.0-alpha.8 [(2021-05-10)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.8) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.7...v0.28.0-alpha.8) diff --git a/package-lock.json b/package-lock.json index b07d309fb..56d8e9034 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.8", + "version": "0.28.0-alpha.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bb3793760..860c41b07 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.8", + "version": "0.28.0-alpha.9", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 10a3fdc5184b6ccbd3d0ed05a5e672d6fc500d1c Mon Sep 17 00:00:00 2001 From: Samuel Ainsworth Date: Thu, 14 Oct 2021 01:08:00 -0700 Subject: [PATCH 312/545] issue template: remove redundant console.log --- .github/issue_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/issue_template.md b/.github/issue_template.md index b396dbc73..60318f794 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -9,5 +9,5 @@ node -v npm -v # (or yarn -v) node -e "console.log(process.platform)" node -e "console.log(require('os').release())" -node -e "console.log(console.log(process.arch))" +node -e "console.log(process.arch)" ``` From 93ce9e5fdee857cb04887fe3cfa118bf6f1cce59 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 14 Oct 2021 11:22:07 -0700 Subject: [PATCH 313/545] Use containers for Linux CI GitHub dropped support for Ubuntu 16.04, however that means we lose support for older distros in general (like RHEL 7) --- .github/workflows/tests.yml | 86 +++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 13 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1e66d1bec..221e6cb88 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,40 +10,100 @@ on: name: Testing jobs: - nix-tests: - name: "*nix Tests" + linux-tests: + name: "Linux Tests" strategy: matrix: node: [12, 14] - os: [ubuntu-16.04, macOS-10.15] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest + container: ubuntu:16.04 steps: + - name: Install Dependencies for Ubuntu + # git >= 2.18 required for actions/checkout git support + run: apt update && apt install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt update && apt install -y git build-essential clang python3 libssl-dev libkrb5-dev libc++-dev + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true + - name: Setup Environment run: | mkdir ~/.ssh_tests chmod 700 ~/.ssh_tests - echo -e "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config - echo -e "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R" > ~/.ssh_tests/id_rsa.pub - echo -e "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----" > ~/.ssh_tests/id_rsa + printf "%b" "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config + printf "%b" "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R\n" > ~/.ssh_tests/id_rsa.pub + printf "%b" "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----\n" > ~/.ssh_tests/id_rsa chmod 600 ~/.ssh_tests/id_rsa* git config --global user.name "John Doe" git config --global user.email johndoe@example.com - - uses: actions/checkout@master + - uses: actions/checkout@v2 - name: Use Node.js - uses: actions/setup-node@master + uses: actions/setup-node@v2 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} check-latest: true - - name: Install Dependencies for Ubuntu - if: startsWith(matrix.os, 'ubuntu') - run: sudo apt install build-essential libssl-dev libkrb5-dev libc++-dev + - name: Install + env: + CC: clang + CXX: clang++ + npm_config_clang: 1 + GYP_DEFINES: use_obsolete_asm=true + # There is a race condition in node/generate that needs to be fixed + run: | + npm set unsafe-perm true + node utils/retry npm install + + - name: Test + run: | + set -e + eval `ssh-agent -s` + ssh-add ~/.ssh_tests/id_rsa + node utils/retry npm test + + - name: Deploy + if: startsWith(github.ref, 'refs/tags/v') + env: + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} + node_pre_gyp_secretAccessKey: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: | + npm install -g node-pre-gyp aws-sdk + node lifecycleScripts/clean + node-pre-gyp package + node-pre-gyp publish + + macos-tests: + name: "macOS Tests" + strategy: + matrix: + node: [12, 14] + runs-on: macOS-10.15 + # This is mostly the same as the Linux steps, waiting for anchor support + # https://github.com/actions/runner/issues/1182 + steps: + - name: Setup Environment + run: | + mkdir ~/.ssh_tests + chmod 700 ~/.ssh_tests + printf "%b" "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config + printf "%b" "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R\n" > ~/.ssh_tests/id_rsa.pub + printf "%b" "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----\n" > ~/.ssh_tests/id_rsa + chmod 600 ~/.ssh_tests/id_rsa* + git config --global user.name "John Doe" + git config --global user.email johndoe@example.com + + - uses: actions/checkout@v2 + + - name: Use Node.js + uses: actions/setup-node@v2 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true + with: + node-version: ${{ matrix.node }} + check-latest: true - name: Install env: @@ -89,7 +149,7 @@ jobs: git config --global user.name "John Doe" git config --global user.email johndoe@example.com - - uses: actions/checkout@master + - uses: actions/checkout@v2 - name: Use Node.js uses: implausible/setup-node@feature/expose-architecture-override From 19350bd42ffbaec283ccb6caa9199accc2c8f074 Mon Sep 17 00:00:00 2001 From: Yeoh Joer <47742486+yjoer@users.noreply.github.com> Date: Thu, 16 Sep 2021 02:33:52 +0800 Subject: [PATCH 314/545] Fix a reference error when compiling with VC2019 --- generate/templates/manual/include/cleanup_handle.h | 1 + 1 file changed, 1 insertion(+) diff --git a/generate/templates/manual/include/cleanup_handle.h b/generate/templates/manual/include/cleanup_handle.h index 442f40013..5eca8cf70 100644 --- a/generate/templates/manual/include/cleanup_handle.h +++ b/generate/templates/manual/include/cleanup_handle.h @@ -3,6 +3,7 @@ #include #include +#include namespace nodegit { class CleanupHandle { From ad6f35cbbdb961fc3e5e71ac7617e6fd610a755c Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 18 Oct 2021 17:39:08 -0700 Subject: [PATCH 315/545] Optionally pipe exec output to stdout/stderr --- utils/execPromise.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/utils/execPromise.js b/utils/execPromise.js index c186a12bc..acdc785ec 100644 --- a/utils/execPromise.js +++ b/utils/execPromise.js @@ -3,9 +3,9 @@ var cp = require('child_process'); // We have to manually promisify this because at this is required in lifecycle // methods and we are not guaranteed that any 3rd party packages are installed // at this point -module.exports = function(command, opts) { +module.exports = function(command, opts, extraOpts = {}) { return new Promise(function(resolve, reject) { - return cp.exec(command, opts, function(err, result) { + const childProcess = cp.exec(command, opts, function(err, result) { if (err) { reject(err); } @@ -13,5 +13,12 @@ module.exports = function(command, opts) { resolve(result); } }); + + if (extraOpts.pipeOutput) { + childProcess.stdout.pipe(process.stdout); + childProcess.stderr.pipe(process.stderr); + } + + return childProcess; }); }; From a92baa96462f6b10d3069beb6e102b1a307343ac Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 18 Oct 2021 17:42:57 -0700 Subject: [PATCH 316/545] Build OpenSSL from source on macOS --- utils/acquireOpenSSL.js | 150 +++++++++++++++++++++++----------------- 1 file changed, 85 insertions(+), 65 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index b75278340..108a6e03f 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -1,87 +1,107 @@ -const fse = require("fs-extra"); +const crypto = require("crypto"); +const execPromise = require("./execPromise"); +const fsNonPromise = require("fs"); +const fs = fsNonPromise.promises; const path = require("path"); -const R = require("ramda"); const got = require("got"); +const os = require("os"); +const promisify = require("util").promisify; const stream = require("stream"); const tar = require("tar-fs"); const zlib = require("zlib"); +const pipeline = promisify(stream.pipeline); + const vendorPath = path.resolve(__dirname, "..", "vendor"); const distrosFilePath = path.join(vendorPath, "static_config", "openssl_distributions.json"); const extractPath = path.join(vendorPath, "openssl"); -const getOSName = () => { - if (process.platform === "win32") { - if (process.arch === "x64") { - return "win64"; - } else { - return "win32"; - } - } else if (process.platform === "darwin") { - return "macOS"; - } else { - // We only discover distros for Mac and Windows. We don't care about any other OS. - return "unknown"; +// TODO: Determine if we are GYPing in Debug +const getIsDebug = () => false; + +const getOpenSSLSourceUrl = (version) => `https://www.openssl.org/source/openssl-${version}.tar.gz`; +const getOpenSSLSourceSha256Url = (version) => `${getOpenSSLSourceUrl(version)}.sha256`; + +class HashVerify extends stream.Transform { + constructor(algorithm, expected) { + super(); + this.expected = expected; + this.hash = crypto.createHash(algorithm); + } + + _transform(chunk, encoding, callback) { + this.hash.update(chunk, encoding); + callback(null, chunk); } -}; -const getCompilerVersion = () => { - // TODO: Get actual compiler version. For now, just assume latest compiler for distros in openssl_distributions.js - const osName = getOSName(); - if (osName === "win32" || osName === "win64") { - return "vs14"; - } else if (osName === "macOS") { - return "clang-9"; - } else { - // We only discover distros for Mac and Windows. We don't care about any other OS. - return "unknown"; + _final(callback) { + const digest = this.hash.digest("hex"); + const digestOk = digest === this.expected; + callback(digestOk ? null : new Error(`Digest not OK: ${digest} !== ${this.expected}`)); } -}; +} -// TODO: Determine if we are GYPing in Debug -const getIsDebug = () => false; +const buildOpenSSLIfNecessary = async (openSSLVersion) => { + const platform = os.platform(); + if (platform !== "darwin") { + return; + } + + try { + await fs.stat(extractPath); + console.log("Skipping OpenSSL build, dir exists"); + return; + } catch {} + + const openSSLUrl = getOpenSSLSourceUrl(openSSLVersion); + const openSSLSha256Url = getOpenSSLSourceSha256Url(openSSLVersion); + + const openSSLSha256 = (await got(openSSLSha256Url)).body.trim(); + + const downloadStream = got.stream(openSSLUrl); + let lastReport = performance.now(); + downloadStream.on("downloadProgress", ({ percent, transferred, total }) => { + const currentTime = performance.now(); + if (currentTime - lastReport > 1 * 1000) { + lastReport = currentTime; + console.log(`progress: ${transferred}/${total} (${(percent * 100).toFixed(2)}%)`) + } + }); + + await pipeline( + downloadStream, + new HashVerify("sha256", openSSLSha256), + zlib.createGunzip(), + tar.extract(extractPath) + ); + + console.log("OpenSSL download + extract complete: SHA256 OK."); + + const buildCwd = path.join(extractPath, `openssl-${openSSLVersion}`); -const getMatchingDistributionName = () => - `${getOSName()}-${getCompilerVersion()}-static${getIsDebug() ? "-debug" : "-release"}`; + await execPromise(`./Configure darwin64-x86_64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${extractPath}" --openssldir="${extractPath}" -mmacosx-version-min=10.11`, { + cwd: buildCwd + }, { pipeOutput: true }); -const getDistributionsConfig = () => - fse.readFile(distrosFilePath, "utf8") - .then(JSON.parse); + await execPromise("make depend", { + cwd: buildCwd + }, { pipeOutput: true }); -const getDistrbutionURLFromConfig = (config) => { - const distName = getMatchingDistributionName(); - const distURL = R.propOr(null, distName, config); + await execPromise("make install", { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 // we should really just use spawn + }, { pipeOutput: true }); - if (!distURL) { - return Promise.reject(new Error("No matching distribution for this operating system")); + console.log("Build finished."); +} + +const acquireOpenSSL = async () => { + try { + await buildOpenSSLIfNecessary("1.1.1c"); + } catch (err) { + console.error("Acquire failed: ", err); + process.exit(1); } - return Promise.resolve(distURL); }; -const fetchFileFromURL = (distUrl) => got(distUrl, { - responseType: 'buffer' -}).then(({ body }) => body); - -const extractFile = (body) => new Promise((resolve, reject) => { - const streamableBody = new stream.Readable(); - streamableBody.push(body); - streamableBody.push(null); - streamableBody - .pipe(zlib.createGunzip()) - .on("error", reject) - .pipe(tar.extract(extractPath)) - .on("error", reject) - .on("close", resolve); -}); - -const acquireOpenSSL = () => - getDistributionsConfig() - .then(getDistrbutionURLFromConfig) - .then(fetchFileFromURL) - .then(extractFile) - .catch((e) => { - console.error(e); - process.exit(1); - }); - acquireOpenSSL(); From 89f3bd6addd92d96bc5035d48e8bc7b55de7e0df Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 18 Oct 2021 18:44:51 -0700 Subject: [PATCH 317/545] Build OpenSSL from source on win32 --- utils/acquireOpenSSL.js | 52 ++++++++++++++++++++++++++++++----------- utils/build-openssl.bat | 7 ++++++ 2 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 utils/build-openssl.bat diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 108a6e03f..1604d4fac 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -12,6 +12,7 @@ const zlib = require("zlib"); const pipeline = promisify(stream.pipeline); +const win32BatPath = path.join(__dirname, "build-openssl.bat"); const vendorPath = path.resolve(__dirname, "..", "vendor"); const distrosFilePath = path.join(vendorPath, "static_config", "openssl_distributions.json"); const extractPath = path.join(vendorPath, "openssl"); @@ -41,9 +42,39 @@ class HashVerify extends stream.Transform { } } +const buildDarwin = async (buildCwd) => { + await execPromise(`./Configure darwin64-x86_64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${ + extractPath + }" --openssldir="${extractPath}" -mmacosx-version-min=10.11`, { + cwd: buildCwd + }, { pipeOutput: true }); + + await execPromise("make depend", { + cwd: buildCwd + }, { pipeOutput: true }); + + await execPromise("make install", { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 // we should really just use spawn + }, { pipeOutput: true }); +}; + +const buildWin32 = async (buildCwd) => { + const vcvarsPath = `${ + process.env.ProgramFiles + }\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Auxiliary\\Build\\vcvars${ + process.arch === "x64" ? "64" : "32" + }.bat`; + await execPromise(`win32BatPath "${vcvarsPath}" ${process.arch === "x64" ? "VC-WIN64A" : "VC-WIN32"}`, { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 // we should really just use spawn + }, { pipeOutput: true }); +}; + const buildOpenSSLIfNecessary = async (openSSLVersion) => { const platform = os.platform(); - if (platform !== "darwin") { + if (platform !== "darwin" && platform !== "win32") { + console.log(`Skipping OpenSSL build, not required on ${platform}`); return; } @@ -79,18 +110,13 @@ const buildOpenSSLIfNecessary = async (openSSLVersion) => { const buildCwd = path.join(extractPath, `openssl-${openSSLVersion}`); - await execPromise(`./Configure darwin64-x86_64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${extractPath}" --openssldir="${extractPath}" -mmacosx-version-min=10.11`, { - cwd: buildCwd - }, { pipeOutput: true }); - - await execPromise("make depend", { - cwd: buildCwd - }, { pipeOutput: true }); - - await execPromise("make install", { - cwd: buildCwd, - maxBuffer: 10 * 1024 * 1024 // we should really just use spawn - }, { pipeOutput: true }); + if (platform === "darwin") { + await buildDarwin(buildCwd); + } else if (platform === "win32") { + await buildWin32(buildCwd); + } else { + throw new Error(`Unknown platform: ${platform}`); + } console.log("Build finished."); } diff --git a/utils/build-openssl.bat b/utils/build-openssl.bat new file mode 100644 index 000000000..9f98748ce --- /dev/null +++ b/utils/build-openssl.bat @@ -0,0 +1,7 @@ +@call "%1" + +echo %cd% + +perl .\Configure %2 shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." + +nmake install From b18bc964066fce0ee32752005ac9edf845a1f873 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 19 Oct 2021 12:46:02 -0700 Subject: [PATCH 318/545] Allow custom Electron OpenSSL root --- generate/templates/templates/binding.gyp | 17 +++++++++-------- vendor/libgit2.gyp | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 5f270f43f..16e9ffc22 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -1,14 +1,15 @@ { "variables": { "is_electron%": " Date: Tue, 19 Oct 2021 11:00:35 -0700 Subject: [PATCH 319/545] Set macOS deployment target to 10.11 --- generate/templates/templates/binding.gyp | 7 +++-- utils/acquireOpenSSL.js | 35 ++++++++++++++---------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 16e9ffc22..94d0c5f75 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -2,7 +2,8 @@ "variables": { "is_electron%": " { +const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { await execPromise(`./Configure darwin64-x86_64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${ extractPath - }" --openssldir="${extractPath}" -mmacosx-version-min=10.11`, { + }" --openssldir="${extractPath}" -mmacosx-version-min=${macOsDeploymentTarget}`, { cwd: buildCwd }, { pipeOutput: true }); @@ -71,10 +71,9 @@ const buildWin32 = async (buildCwd) => { }, { pipeOutput: true }); }; -const buildOpenSSLIfNecessary = async (openSSLVersion) => { - const platform = os.platform(); - if (platform !== "darwin" && platform !== "win32") { - console.log(`Skipping OpenSSL build, not required on ${platform}`); +const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => { + if (process.platform !== "darwin" && process.platform !== "win32") { + console.log(`Skipping OpenSSL build, not required on ${process.platform}`); return; } @@ -110,12 +109,12 @@ const buildOpenSSLIfNecessary = async (openSSLVersion) => { const buildCwd = path.join(extractPath, `openssl-${openSSLVersion}`); - if (platform === "darwin") { - await buildDarwin(buildCwd); - } else if (platform === "win32") { + if (process.platform === "darwin") { + await buildDarwin(buildCwd, macOsDeploymentTarget); + } else if (process.platform === "win32") { await buildWin32(buildCwd); } else { - throw new Error(`Unknown platform: ${platform}`); + throw new Error(`Unknown platform: ${process.platform}`); } console.log("Build finished."); @@ -123,7 +122,15 @@ const buildOpenSSLIfNecessary = async (openSSLVersion) => { const acquireOpenSSL = async () => { try { - await buildOpenSSLIfNecessary("1.1.1c"); + let macOsDeploymentTarget; + if (process.platform === 'darwin') { + macOsDeploymentTarget = process.argv[2]; + if (!macOsDeploymentTarget || !macOsDeploymentTarget.match(/\d+\.\d+/)) { + throw new Error(`Invalid macOsDeploymentTarget: ${macOsDeploymentTarget}`); + } + } + + await buildOpenSSLIfNecessary("1.1.1c", macOsDeploymentTarget); } catch (err) { console.error("Acquire failed: ", err); process.exit(1); From e8d724c471dd11cebc5202aef1f5c5dfc0a35ea4 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 19 Oct 2021 12:30:48 -0700 Subject: [PATCH 320/545] Handle x86/x64 and custom vcvarsall path on Windows --- generate/templates/templates/binding.gyp | 2 +- utils/acquireOpenSSL.js | 12 ++++++------ utils/build-openssl.bat | 4 ++-- vendor/libgit2.gyp | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 94d0c5f75..c2460cd69 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -2,7 +2,7 @@ "variables": { "is_electron%": " { }; const buildWin32 = async (buildCwd) => { - const vcvarsPath = `${ - process.env.ProgramFiles - }\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Auxiliary\\Build\\vcvars${ - process.arch === "x64" ? "64" : "32" - }.bat`; - await execPromise(`win32BatPath "${vcvarsPath}" ${process.arch === "x64" ? "VC-WIN64A" : "VC-WIN32"}`, { + const vcvarsallPath = process.env.npm_config_vcvarsall_path || `${ + process.env.ProgramFiles || "C:\\Program Files" + }\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Auxiliary\\Build\\vcvarsall.bat`; + const vcvarsallArch = process.arch === "x64" ? "x64" : "x86"; + const vcTarget = process.arch === "x64" ? "VC-WIN64A" : "VC-WIN32"; + await execPromise(`"${win32BatPath}" "${vcvarsallPath}" ${vcvarsallArch} ${vcTarget}`, { cwd: buildCwd, maxBuffer: 10 * 1024 * 1024 // we should really just use spawn }, { pipeOutput: true }); diff --git a/utils/build-openssl.bat b/utils/build-openssl.bat index 9f98748ce..4cb6eac40 100644 --- a/utils/build-openssl.bat +++ b/utils/build-openssl.bat @@ -1,7 +1,7 @@ -@call "%1" +@call %1 %2 echo %cd% -perl .\Configure %2 shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." +perl .\Configure %3 shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." nmake install diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 660d775d2..55438ecdc 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -10,7 +10,7 @@ "is_electron%": " Date: Tue, 19 Oct 2021 13:17:54 -0700 Subject: [PATCH 321/545] Use script to determine OpenSSL root dir String.raw works for Windows, but macOS doesn't like unescaped backticks --- generate/templates/templates/binding.gyp | 2 +- utils/getElectronOpenSSLRoot.js | 10 ++++++++++ vendor/libgit2.gyp | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 utils/getElectronOpenSSLRoot.js diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index c2460cd69..f8e0d5690 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -2,7 +2,7 @@ "variables": { "is_electron%": " Date: Wed, 20 Oct 2021 07:55:26 -0700 Subject: [PATCH 322/545] Test OpenSSL after build --- utils/acquireOpenSSL.js | 6 +++++- utils/build-openssl.bat | 12 +++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index ba893585f..7fb091c17 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -49,7 +49,11 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { cwd: buildCwd }, { pipeOutput: true }); - await execPromise("make depend", { + await execPromise("make", { + cwd: buildCwd + }, { pipeOutput: true }); + + await execPromise("make test", { cwd: buildCwd }, { pipeOutput: true }); diff --git a/utils/build-openssl.bat b/utils/build-openssl.bat index 4cb6eac40..dd9ee6a9c 100644 --- a/utils/build-openssl.bat +++ b/utils/build-openssl.bat @@ -1,7 +1,13 @@ @call %1 %2 -echo %cd% +perl .\Configure %3 shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." || goto :error -perl .\Configure %3 shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." +nmake || goto :error +nmake test || goto :error +nmake install || goto :error -nmake install +goto :EOF + +:error +echo Failed with error #%errorlevel%. +exit /b %errorlevel% \ No newline at end of file From f21941ca96099ea423080997a96849a4ddacba52 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 20 Oct 2021 10:54:48 -0700 Subject: [PATCH 323/545] Remove old versions of OpenSSL --- utils/acquireOpenSSL.js | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 7fb091c17..799c0290f 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -1,5 +1,7 @@ const crypto = require("crypto"); const execPromise = require("./execPromise"); +// for fs.remove. replace with fs.rm after dropping v12 support +const fse = require("fs-extra"); const fsNonPromise = require("fs"); const { promises: fs } = fsNonPromise; const path = require("path"); @@ -75,12 +77,41 @@ const buildWin32 = async (buildCwd) => { }, { pipeOutput: true }); }; +const removeOpenSSLIfOudated = async (openSSLVersion) => { + try { + let pkgconfigContent; + try { + pkgconfigContent = await fs.readFile(path.join(extractPath, "lib", "pkgconfig", "openssl.pc"), "utf8"); + } catch { + /* if we fail to read the file, assume removal not required */ + } + + if (!pkgconfigContent) { + return; + } + + const versionMatch = pkgconfigContent.match(/\nVersion: (\d\.\d\.\d[a-z]*)\n/); + const installedVersion = versionMatch && versionMatch[1]; + if (!installedVersion || installedVersion === openSSLVersion) { + return; + } + + console.log("Removing outdated OpenSSL at: ", extractPath); + await fse.remove(extractPath); + console.log("Outdated OpenSSL removed."); + } catch (err) { + console.log("Remove outdated OpenSSL failed: ", err); + } +}; + const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => { if (process.platform !== "darwin" && process.platform !== "win32") { console.log(`Skipping OpenSSL build, not required on ${process.platform}`); return; } + await removeOpenSSLIfOudated(openSSLVersion); + try { await fs.stat(extractPath); console.log("Skipping OpenSSL build, dir exists"); @@ -127,7 +158,7 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => const acquireOpenSSL = async () => { try { let macOsDeploymentTarget; - if (process.platform === 'darwin') { + if (process.platform === "darwin") { macOsDeploymentTarget = process.argv[2]; if (!macOsDeploymentTarget || !macOsDeploymentTarget.match(/\d+\.\d+/)) { throw new Error(`Invalid macOsDeploymentTarget: ${macOsDeploymentTarget}`); From 0e147b526abaaefc55c80e591d0b12d39647ac87 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 20 Oct 2021 10:51:31 -0700 Subject: [PATCH 324/545] Update OpenSSL to 1.1.1l --- utils/acquireOpenSSL.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 799c0290f..5863f147a 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -165,7 +165,7 @@ const acquireOpenSSL = async () => { } } - await buildOpenSSLIfNecessary("1.1.1c", macOsDeploymentTarget); + await buildOpenSSLIfNecessary("1.1.1l", macOsDeploymentTarget); } catch (err) { console.error("Acquire failed: ", err); process.exit(1); From f59339db69a016935ea80a3e683995e37b9bbb11 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 20 Oct 2021 12:22:10 -0700 Subject: [PATCH 325/545] Parse OpenSSL version from binary pkgconfig only available on *nix OSes --- utils/acquireOpenSSL.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 5863f147a..e35d5a7e7 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -79,18 +79,19 @@ const buildWin32 = async (buildCwd) => { const removeOpenSSLIfOudated = async (openSSLVersion) => { try { - let pkgconfigContent; + let openSSLResult; try { - pkgconfigContent = await fs.readFile(path.join(extractPath, "lib", "pkgconfig", "openssl.pc"), "utf8"); + const openSSLPath = path.join(extractPath, 'bin', 'openssl'); + openSSLResult = await execPromise(`${openSSLPath} version`); } catch { - /* if we fail to read the file, assume removal not required */ + /* if we fail to get the version, assume removal not required */ } - if (!pkgconfigContent) { + if (!openSSLResult) { return; } - const versionMatch = pkgconfigContent.match(/\nVersion: (\d\.\d\.\d[a-z]*)\n/); + const versionMatch = openSSLResult.match(/^OpenSSL (\d\.\d\.\d[a-z]*)/); const installedVersion = versionMatch && versionMatch[1]; if (!installedVersion || installedVersion === openSSLVersion) { return; From ca2e7df5cee27a72339885478e53bd0134692176 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 20 Oct 2021 12:26:05 -0700 Subject: [PATCH 326/545] Log OpenSSL version downloaded --- generate/templates/templates/binding.gyp | 2 +- utils/acquireOpenSSL.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index f8e0d5690..b89a2d41a 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -16,7 +16,7 @@ "action": ["node", "utils/acquireOpenSSL.js", "<(macOS_deployment_target)"], "inputs": ["vendor/static_config/openssl_distributions.json"], "outputs": ["vendor/openssl"], - "message": "Acquiring OpensSL binaries and headers" + "message": "Acquiring OpenSSL binaries and headers" }] }] ] diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index e35d5a7e7..1ffd1ad87 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -141,7 +141,7 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => tar.extract(extractPath) ); - console.log("OpenSSL download + extract complete: SHA256 OK."); + console.log(`OpenSSL ${openSSLVersion} download + extract complete: SHA256 OK.`); const buildCwd = path.join(extractPath, `openssl-${openSSLVersion}`); From 16a459b7dd8b2a02a3ba573134b09d7d593fff8d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 22 Oct 2021 07:37:25 -0700 Subject: [PATCH 327/545] Remove old conan/bintray code --- generate/templates/templates/binding.gyp | 2 +- utils/README.md | 14 +- utils/discoverOpenSSLDistros.js | 184 ------------------ .../static_config/openssl_distributions.json | 18 -- 4 files changed, 2 insertions(+), 216 deletions(-) delete mode 100644 utils/discoverOpenSSLDistros.js delete mode 100644 vendor/static_config/openssl_distributions.json diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index b89a2d41a..0f0b49f96 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -14,7 +14,7 @@ "actions": [{ "action_name": "acquire", "action": ["node", "utils/acquireOpenSSL.js", "<(macOS_deployment_target)"], - "inputs": ["vendor/static_config/openssl_distributions.json"], + "inputs": [""], "outputs": ["vendor/openssl"], "message": "Acquiring OpenSSL binaries and headers" }] diff --git a/utils/README.md b/utils/README.md index 1773e9979..cf046f05b 100644 --- a/utils/README.md +++ b/utils/README.md @@ -5,17 +5,5 @@ #### buildFlags Determines how NodeGit should build. Use `BUILD_ONLY` environment variable to build from source. - ## discoverOpenSSLDistros - Crawls a series of static URLS on the [Conan package manager](https://conan.io/) for the [latest release of OpenSSL](https://bintray.com/conan-community/conan/OpenSSL%3Aconan#files/conan%2FOpenSSL%2F1.1.0i) (1.1.0i at the time of writing). It acquires URLS for releases of statically linked binaries and header files of OpenSSL for Mac and Windows. The provided binaries are compiled on: - - * Mac: clang-8.1 or clang-9. - * Windows: vs12, vs14, vs15 - - The discovered distributions are written into `vendor/static_config/openssl_distributions.json`. This script does not need to be run unless you are updating the version of OpenSSL to build against. - ## acquireOpenSSL - Download the OpenSSL binaries and headers applicable to the current OS for the latest compiler version (clang-9/vs14). Uses links from `vendor/static_config/openssl_distributions.json`. - - TODO: - * Make the script pull the debug versions if node-gyp is building in debug mode - * Make the script pull down a version of the binaries that matches the system compiler + Download and compile OpenSSL. diff --git a/utils/discoverOpenSSLDistros.js b/utils/discoverOpenSSLDistros.js deleted file mode 100644 index a062e6fd2..000000000 --- a/utils/discoverOpenSSLDistros.js +++ /dev/null @@ -1,184 +0,0 @@ -const cheerio = require("cheerio"); -const fse = require("fs-extra"); -const path = require("path"); -const R = require("ramda"); -const got = require("got"); - -const windowsCommonConditions = [ - R.test(/^\s*os=Windows$/gm), - R.test(/^\s*shared=False$/gm) -]; - -const macCommonConditions = [ - R.test(/^\s*arch=x86_64$/gm), - R.test(/^\s*os=Macos$/gm), - R.test(/^\s*compiler=apple-clang$/gm), - R.test(/^\s*shared=False$/gm) -]; - -const debugPairs = R.toPairs({ - "win32-vs12-static-debug": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86$/gm), - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.runtime=MTd$/gm), - R.test(/^\s*compiler\.version=12$/gm) - ]), - "win32-vs14-static-debug": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86$/gm), - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.runtime=MTd$/gm), - R.test(/^\s*compiler\.version=14$/gm) - ]), - "win32-vs15-static-debug": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86$/gm), - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.runtime=MTd$/gm), - R.test(/^\s*compiler\.version=15$/gm) - ]), - - "win64-vs12-static-debug": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86_64$/gm), - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.runtime=MTd$/gm), - R.test(/^\s*compiler\.version=12$/gm) - ]), - "win64-vs14-static-debug": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86_64$/gm), - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.runtime=MTd$/gm), - R.test(/^\s*compiler\.version=14$/gm) - ]), - "win64-vs15-static-debug": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86_64$/gm), - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.runtime=MTd$/gm), - R.test(/^\s*compiler\.version=15$/gm) - ]), - - "macOS-clang-9-static-debug": R.allPass([ - ...macCommonConditions, - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.version=9.0$/gm) - ]), - "macOS-clang-8.1-static-debug": R.allPass([ - ...macCommonConditions, - R.test(/^\s*build_type=Debug$/gm), - R.test(/^\s*compiler\.version=8\.1$/gm) - ]) -}); - -const releasePairs = R.toPairs({ - "win32-vs12-static-release": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86$/gm), - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.runtime=MT$/gm), - R.test(/^\s*compiler\.version=12$/gm) - ]), - "win32-vs14-static-release": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86$/gm), - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.runtime=MT$/gm), - R.test(/^\s*compiler\.version=14$/gm) - ]), - "win32-vs15-static-release": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86$/gm), - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.runtime=MT$/gm), - R.test(/^\s*compiler\.version=15$/gm) - ]), - - "win64-vs12-static-release": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86_64$/gm), - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.runtime=MT$/gm), - R.test(/^\s*compiler\.version=12$/gm) - ]), - "win64-vs14-static-release": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86_64$/gm), - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.runtime=MT$/gm), - R.test(/^\s*compiler\.version=14$/gm) - ]), - "win64-vs15-static-release": R.allPass([ - ...windowsCommonConditions, - R.test(/^\s*arch=x86_64$/gm), - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.runtime=MT$/gm), - R.test(/^\s*compiler\.version=15$/gm) - ]), - - "macOS-clang-9-static-release": R.allPass([ - ...macCommonConditions, - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.version=9.0$/gm) - ]), - "macOS-clang-8.1-static-release": R.allPass([ - ...macCommonConditions, - R.test(/^\s*build_type=Release$/gm), - R.test(/^\s*compiler\.version=8\.1$/gm) - ]) -}); - -const distributionPairs = [...debugPairs, ...releasePairs]; - -const getDistributionConfigURLFromHash = itemHash => - `https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/${itemHash}/0/conaninfo.txt`; - -const getDistributionDownloadURLFromHash = itemHash => - `https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/${itemHash}/0/conan_package.tgz`; - -const getDistributionsRootURL = () => - "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/"; - -const detectDistributionPairFromConfig = (itemHash, body) => R.pipe( - R.find(([_, predicate]) => predicate(body)), - (distributionPair) => distributionPair - ? [distributionPair[0], getDistributionDownloadURLFromHash(itemHash)] - : undefined -)(distributionPairs); - -const getDistributionConfig = (itemHash) => - got(getDistributionConfigURLFromHash(itemHash)) - .then(({ body }) => detectDistributionPairFromConfig(itemHash, body)); - -const discoverDistributions = (treeHtml) => { - const releaseHashes = []; - - const $ = cheerio.load(treeHtml); - $("a").each((_, link) => { - const linkText = link.children[0].data; - if (!linkText) { - return; - } - // Trim off the trailing '/' - const releaseHash = linkText.substring(0, linkText.length - 1); - releaseHashes.push(releaseHash); - }); - - return Promise.all( - R.map(releaseHash => getDistributionConfig(releaseHash), releaseHashes) - ); -} - -const writeFile = (distributions) => - fse.ensureDir(path.dirname(outputPath)) - .then(fse.writeFile(outputPath, JSON.stringify(distributions, null, 2))); - -const outputPath = path.resolve(__dirname, "..", "vendor", "static_config", "openssl_distributions.json"); -got(getDistributionsRootURL()) - .then(({ body }) => discoverDistributions(body)) - .then(R.filter(R.identity)) - .then(R.sortBy(R.prop(0))) - .then(R.fromPairs) - .then(writeFile); diff --git a/vendor/static_config/openssl_distributions.json b/vendor/static_config/openssl_distributions.json deleted file mode 100644 index cdbf16603..000000000 --- a/vendor/static_config/openssl_distributions.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "macOS-clang-8.1-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/d1c17264207d7d5cd3268628053a64345144278a/0/conan_package.tgz", - "macOS-clang-8.1-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/2fd87da1a557da1625ed3b37267403907210dfd8/0/conan_package.tgz", - "macOS-clang-9-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/85d674b0f6705cafe6b2edb8689ffbe0f3c2e60b/0/conan_package.tgz", - "macOS-clang-9-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/2f6ec1d0e45c99b245f982a1d4f7554a0ce0f97d/0/conan_package.tgz", - "win32-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/39d6fe009a278f733e97b59a4f9536bfc4e8f366/0/conan_package.tgz", - "win32-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/d16d8a16b4cef0046922b8d83d567689d36149d0/0/conan_package.tgz", - "win32-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/889fd4ea9ba89fd6dc7fa32e2f45bd9804b85481/0/conan_package.tgz", - "win32-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/253958a6ce15f1c9325eeea33ffc0a5cfc29212a/0/conan_package.tgz", - "win32-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/05f648ec4d066b206769d6314e859fdd97a18f8d/0/conan_package.tgz", - "win32-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/a075e3ffc3590d6a920a26b4218b20253dd68d57/0/conan_package.tgz", - "win64-vs12-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/6bc3be0f39fdc624b24ba9bb00e8af55928d74e7/0/conan_package.tgz", - "win64-vs12-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/e942631065059eabe964ca471ad35bb453c15b31/0/conan_package.tgz", - "win64-vs14-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/867ca54360ed234a8bc9a6aa63806599ea29b38e/0/conan_package.tgz", - "win64-vs14-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/c4aef4edbc33205e0cf9b55bfb116b38c90ec132/0/conan_package.tgz", - "win64-vs15-static-debug": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/0bd0c413b56aaec57c0f222a89b4e565a6729027/0/conan_package.tgz", - "win64-vs15-static-release": "https://dl.bintray.com/conan-community/conan/conan/OpenSSL/1.1.1c/stable/0/package/fce9be1511a149a4af36b5997f7e611ab83b2f58/0/conan_package.tgz" -} \ No newline at end of file From cf4ad70bf1627dd6036fed4d451c53aa93b9e9ee Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 20 Oct 2021 16:22:27 -0700 Subject: [PATCH 328/545] Throw error if vcvarsall not located --- utils/acquireOpenSSL.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 1ffd1ad87..3d11a1b98 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -69,6 +69,12 @@ const buildWin32 = async (buildCwd) => { const vcvarsallPath = process.env.npm_config_vcvarsall_path || `${ process.env.ProgramFiles || "C:\\Program Files" }\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Auxiliary\\Build\\vcvarsall.bat`; + try { + await fs.stat(vcvarsallPath); + } catch { + throw new Error(`vcvarsall.bat not found at ${vcvarsallPath}`); + } + const vcvarsallArch = process.arch === "x64" ? "x64" : "x86"; const vcTarget = process.arch === "x64" ? "VC-WIN64A" : "VC-WIN32"; await execPromise(`"${win32BatPath}" "${vcvarsallPath}" ${vcvarsallArch} ${vcTarget}`, { From 31d96065f13a3a3fd6f399ee7caae186ecc1b6af Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 20 Oct 2021 16:25:37 -0700 Subject: [PATCH 329/545] Document Electron OpenSSL process --- guides/install/from-source/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/guides/install/from-source/README.md b/guides/install/from-source/README.md index b14d7471a..7de3c9adf 100644 --- a/guides/install/from-source/README.md +++ b/guides/install/from-source/README.md @@ -64,6 +64,16 @@ npm install nodegit --msvs_version=2013 # Or whatever version you've installed. ``` +### Electron and OpenSSL ### +A local version of OpenSSL is required when building for Electron on Windows and macOS. This is due to Electron using BoringSSL, as we are not able to link to it like we are OpenSSL in Node. + +`acquireOpenSSL.js` will attempt to download and build OpenSSL locally. On macOS, this should Just Work(tm). On Windows, things are a little trickier. + +- We rely on the Visual Studio dev tools to be installed, specifically `vcvarsall.bat` to provide access to the tools. If this is not in the default location for VS2017, you'll need to `npm config set vcvarsall_path ` or set the environment variable `npm_config_vcvarsall_path` pointing to it. +- See [Compilation and Installation](https://wiki.openssl.org/index.php/Compilation_and_Installation#Windows) regarding required dependencies, specifically `Perl` (Strawberry Perl is known to work) and `NASM`. Make sure they're on the PATH. + +Alternatively, you can provide your own OpenSSL binaries and headers. These can either go in `vendor/openssl` (e.g. `/vendor/openssl/{lib,bin,include}` should exist) or in an external directory located by `npm config set openssl_dir` or the environment variable `npm_config_openssl_dir`. + ##### A note on environment variables in Windows ##### In many of the npm scripts (and examples above), things are run like `BUILD_ONLY=true npm install`. This sets the `BUILD_ONLY` environment variable From 1457cf862df40cd1d5cf71e2214722368f41e263 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 22 Oct 2021 07:39:26 -0700 Subject: [PATCH 330/545] Remove unused code --- utils/acquireOpenSSL.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 3d11a1b98..796cb5c05 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -16,12 +16,8 @@ const pipeline = promisify(stream.pipeline); const win32BatPath = path.join(__dirname, "build-openssl.bat"); const vendorPath = path.resolve(__dirname, "..", "vendor"); -const distrosFilePath = path.join(vendorPath, "static_config", "openssl_distributions.json"); const extractPath = path.join(vendorPath, "openssl"); -// TODO: Determine if we are GYPing in Debug -const getIsDebug = () => false; - const getOpenSSLSourceUrl = (version) => `https://www.openssl.org/source/openssl-${version}.tar.gz`; const getOpenSSLSourceSha256Url = (version) => `${getOpenSSLSourceUrl(version)}.sha256`; From b576da79f4f41f8f4ea6042f56e0056d7eedd269 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 25 Oct 2021 07:25:53 -0700 Subject: [PATCH 331/545] Detect default vcvarsall path on 64 bit Windows --- utils/acquireOpenSSL.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 796cb5c05..34936f7f7 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -62,8 +62,12 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { }; const buildWin32 = async (buildCwd) => { + const vcvarsallArch = process.arch === "x64" ? "x64" : "x86"; + const programFilesPath = (vcvarsallArch === "x64" + ? process.env["ProgramFiles(x86)"] + : process.env.ProgramFiles) || "C:\\Program Files"; const vcvarsallPath = process.env.npm_config_vcvarsall_path || `${ - process.env.ProgramFiles || "C:\\Program Files" + programFilesPath }\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Auxiliary\\Build\\vcvarsall.bat`; try { await fs.stat(vcvarsallPath); @@ -71,8 +75,7 @@ const buildWin32 = async (buildCwd) => { throw new Error(`vcvarsall.bat not found at ${vcvarsallPath}`); } - const vcvarsallArch = process.arch === "x64" ? "x64" : "x86"; - const vcTarget = process.arch === "x64" ? "VC-WIN64A" : "VC-WIN32"; + const vcTarget = vcvarsallArch === "x64" ? "VC-WIN64A" : "VC-WIN32"; await execPromise(`"${win32BatPath}" "${vcvarsallPath}" ${vcvarsallArch} ${vcTarget}`, { cwd: buildCwd, maxBuffer: 10 * 1024 * 1024 // we should really just use spawn @@ -83,7 +86,7 @@ const removeOpenSSLIfOudated = async (openSSLVersion) => { try { let openSSLResult; try { - const openSSLPath = path.join(extractPath, 'bin', 'openssl'); + const openSSLPath = path.join(extractPath, "bin", "openssl"); openSSLResult = await execPromise(`${openSSLPath} version`); } catch { /* if we fail to get the version, assume removal not required */ From 797d07433c7d8d9ee09e37d2de768b8111a3ca2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Tue, 7 Sep 2021 15:05:54 +0200 Subject: [PATCH 332/545] Free memory when closing context There was a memory leak when v8 context is closed: the Nan::ObjectWrap objects created inside nodegit were not freed, since their WeakCallback were not triggered. To fix it, a new class has been added from which NodeGitWrapper objects inherit, so that they can be tracked in the nodegit::Context and freed when its cleanup handle is triggered. This new class allows for cheap tracking via Link/Unlink to a tracker list, allowing each NodeGitWrapper object to link/unlink itself while the normal GC is running, as well as for the nodegit::Context to keep a tracker list of them and free them in a 'owned objects first' way when closing. The ownership model and the fact that a NodeGitWrapper object might have multiple owners have also been considered. --- generate/templates/manual/include/context.h | 7 + .../manual/include/nodegit_wrapper.h | 11 +- .../templates/manual/include/tracker_wrap.h | 72 ++++++ .../manual/revwalk/file_history_walk.cc | 2 +- generate/templates/manual/src/context.cc | 1 + .../templates/manual/src/nodegit_wrapper.cc | 30 +++ generate/templates/manual/src/tracker_wrap.cc | 229 ++++++++++++++++++ generate/templates/templates/binding.gyp | 1 + 8 files changed, 349 insertions(+), 4 deletions(-) create mode 100644 generate/templates/manual/include/tracker_wrap.h create mode 100644 generate/templates/manual/src/tracker_wrap.cc diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 60d21c539..718a79742 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -25,6 +25,7 @@ #include "async_worker.h" #include "cleanup_handle.h" #include "thread_pool.h" +#include "tracker_wrap.h" namespace nodegit { class AsyncContextCleanupHandle; @@ -54,6 +55,10 @@ namespace nodegit { void ShutdownThreadPool(std::unique_ptr cleanupHandle); + inline void LinkTrackerList(nodegit::TrackerWrap::TrackerList *list) { + list->Link(&trackerList); + } + private: v8::Isolate *isolate; @@ -67,6 +72,8 @@ namespace nodegit { std::map> cleanupHandles; + nodegit::TrackerWrap::TrackerList trackerList; + static std::map contexts; }; diff --git a/generate/templates/manual/include/nodegit_wrapper.h b/generate/templates/manual/include/nodegit_wrapper.h index 4919926d0..c72f29027 100644 --- a/generate/templates/manual/include/nodegit_wrapper.h +++ b/generate/templates/manual/include/nodegit_wrapper.h @@ -1,10 +1,10 @@ #ifndef NODEGIT_WRAPPER_H #define NODEGIT_WRAPPER_H -#include #include #include +#include "tracker_wrap.h" #include "cleanup_handle.h" // the Traits template parameter supplies: @@ -16,13 +16,16 @@ // // static const bool isFreeable // static void free(cType *raw) - frees the object using freeFunctionName +// +// nodegit::TrackerWrap allows for cheap tracking of new objects, avoiding searchs +// in a container to remove the tracking of a specific object. namespace nodegit { class Context; } template -class NodeGitWrapper : public Nan::ObjectWrap { +class NodeGitWrapper : public nodegit::TrackerWrap { public: // replicate Traits typedefs for ease of use typedef typename Traits::cType cType; @@ -37,7 +40,7 @@ class NodeGitWrapper : public Nan::ObjectWrap { // a separate issue. bool selfFreeing; - const nodegit::Context *nodegitContext = nullptr; + nodegit::Context *nodegitContext = nullptr; protected: cType *raw; @@ -68,6 +71,8 @@ class NodeGitWrapper : public Nan::ObjectWrap { static NAN_METHOD(GetSelfFreeingInstanceCount); static NAN_METHOD(GetNonSelfFreeingConstructedCount); + void SetNativeOwners(v8::Local owners); + public: static v8::Local New(const cType *raw, bool selfFreeing, v8::Local owner = v8::Local()); diff --git a/generate/templates/manual/include/tracker_wrap.h b/generate/templates/manual/include/tracker_wrap.h new file mode 100644 index 000000000..4fe4b6c7e --- /dev/null +++ b/generate/templates/manual/include/tracker_wrap.h @@ -0,0 +1,72 @@ +#ifndef TRACKERWRAP_H +#define TRACKERWRAP_H + +#include +#include +#include + +namespace nodegit { + // Base class used to track wrapped objects, so that we can + // free the objects that were not freed (because their + // WeakCallback didn't trigger) at the time of context closing. + // Implementation based on node.js's class RefTracker (napi). + class TrackerWrap : public Nan::ObjectWrap { + public: + TrackerWrap() = default; + virtual ~TrackerWrap() = default; + TrackerWrap(const TrackerWrap &other) = delete; + TrackerWrap(TrackerWrap &&other) = delete; + TrackerWrap& operator=(const TrackerWrap &other) = delete; + TrackerWrap& operator=(TrackerWrap &&other) = delete; + + // aliases: + // 'TrackerList': used in functionality related to a list. + // 'TrackerWrap' used in functionality not related to a list. + using TrackerList = TrackerWrap; + + // Links 'this' right after 'listStart' + inline void Link(TrackerList* listStart) { + m_prev = listStart; + m_next = listStart->m_next; + if (m_next != nullptr) { + m_next->m_prev = this; + } + listStart->m_next = this; + } + + // Unlinks itself from the list it's linked to + inline TrackerWrap* Unlink() { + if (m_prev != nullptr) { + m_prev->m_next = m_next; + } + if (m_next != nullptr) { + m_next->m_prev = m_prev; + } + m_prev = nullptr; + m_next = nullptr; + return this; + } + + inline void SetTrackerWrapOwners(std::unique_ptr< std::vector > &&owners) { + m_owners = std::move(owners); + } + + inline const std::vector* GetTrackerWrapOwners() const { + return m_owners.get(); + } + + // Unlinks and returns the first item of 'listStart' + static TrackerWrap* UnlinkFirst(TrackerList *listStart); + + // Deletes items following 'listStart', but not 'listStart' itself + static void DeleteFromList(TrackerList *listStart); + + private: + TrackerList* m_next {}; + TrackerList* m_prev {}; + // m_owners will store pointers to native objects + std::unique_ptr< std::vector > m_owners {}; + }; +} + +#endif diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 93b74437e..714d6f5db 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -35,7 +35,7 @@ class FileHistoryEvent { v8::Local toJavascript() { v8::Local historyEntry = Nan::New(); - v8::Local owners = Nan::New(1); + v8::Local owners = Nan::New(0); Nan::Set( owners, Nan::New(owners->Length()), diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index ba99e7345..101052b8b 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -40,6 +40,7 @@ namespace nodegit { } Context::~Context() { + nodegit::TrackerWrap::DeleteFromList(&trackerList); contexts.erase(isolate); } diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index 66b208c66..a2e7a0457 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -1,6 +1,7 @@ template NodeGitWrapper::NodeGitWrapper(typename Traits::cType *raw, bool selfFreeing, v8::Local owner) : nodegitContext(nodegit::Context::GetCurrentContext()) { + nodegitContext->LinkTrackerList(this); if (Traits::isSingleton) { ReferenceCounter::incrementCountForPointer((void *)raw); this->raw = raw; @@ -20,6 +21,7 @@ NodeGitWrapper::NodeGitWrapper(typename Traits::cType *raw, bool selfFre Traits::duplicate(&this->raw, raw); selfFreeing = true; } else { + SetNativeOwners(owner); this->owner.Reset(owner); this->raw = raw; } @@ -45,6 +47,7 @@ NodeGitWrapper::NodeGitWrapper(const char *error) template NodeGitWrapper::~NodeGitWrapper() { + Unlink(); if (Traits::isFreeable && selfFreeing) { Traits::free(raw); SelfFreeingInstanceCount--; @@ -77,6 +80,33 @@ NAN_METHOD(NodeGitWrapper::JSNewFunction) { info.GetReturnValue().Set(info.This()); } +template +void NodeGitWrapper::SetNativeOwners(v8::Local owners) { + assert(owners->IsArray() || owners->IsObject()); + Nan::HandleScope scope; + std::unique_ptr< std::vector > trackerOwners = + std::make_unique< std::vector >(); + + if (owners->IsArray()) { + v8::Local context = Nan::GetCurrentContext(); + const v8::Local array = owners.As(); + uint32_t length = array->Length(); + + for (uint32_t i = 0; i < length; ++i) { + v8::Local value = array->Get(context, i).ToLocalChecked(); + const v8::Local object = value.As(); + Nan::ObjectWrap *objectWrap = Nan::ObjectWrap::Unwrap(object); + trackerOwners->push_back(static_cast(objectWrap)); + } + } + else if (owners->IsObject()) { + Nan::ObjectWrap *objectWrap = Nan::ObjectWrap::Unwrap(owners); + trackerOwners->push_back(static_cast(objectWrap)); + } + + SetTrackerWrapOwners(std::move(trackerOwners)); +} + template v8::Local NodeGitWrapper::New(const typename Traits::cType *raw, bool selfFreeing, v8::Local owner) { Nan::EscapableHandleScope scope; diff --git a/generate/templates/manual/src/tracker_wrap.cc b/generate/templates/manual/src/tracker_wrap.cc new file mode 100644 index 000000000..7cebf3116 --- /dev/null +++ b/generate/templates/manual/src/tracker_wrap.cc @@ -0,0 +1,229 @@ +#include "../include/tracker_wrap.h" + +#include +#include + +namespace { + /** + * \class TrackerWrapTreeNode + * + * Parents of a TrackerWrapTreeNode will be the nodes holding TrackerWrap objects that + * are owners of the TrackerWrap object that this node holds. The same way for its children. + */ + class TrackerWrapTreeNode + { + public: + TrackerWrapTreeNode(nodegit::TrackerWrap *trackerWrap) : m_trackerWrap(trackerWrap) {} + TrackerWrapTreeNode() = delete; + ~TrackerWrapTreeNode(); + TrackerWrapTreeNode(const TrackerWrapTreeNode &other) = delete; + TrackerWrapTreeNode(TrackerWrapTreeNode &&other) = delete; + TrackerWrapTreeNode& operator=(const TrackerWrapTreeNode &other) = delete; + TrackerWrapTreeNode& operator=(TrackerWrapTreeNode &&other) = delete; + + inline const std::unordered_set& Children() const; + inline nodegit::TrackerWrap* TrackerWrap(); + inline void AddChild(TrackerWrapTreeNode *child); + + private: + std::unordered_set m_children {}; + nodegit::TrackerWrap *m_trackerWrap {}; + }; + + /** + * TrackerWrapTreeNode::~TrackerWrapTreeNode() + * Frees the memory of the TrackerWrap pointer it holds. + */ + TrackerWrapTreeNode::~TrackerWrapTreeNode() { + if (m_trackerWrap != nullptr) { + delete m_trackerWrap; + } + } + + /** + * TrackerWrapTreeNode::Children() + * + * Returns a reference to the children nodes of this. + */ + const std::unordered_set& TrackerWrapTreeNode::Children() const { + return m_children; + } + + /** + * TrackerWrapTreeNode::TrackerWrap() + * + * Returns a pointer to the node's TrackerWrap object. + */ + nodegit::TrackerWrap* TrackerWrapTreeNode::TrackerWrap() { + return m_trackerWrap; + } + + /** + * TrackerWrapTreeNode::AddChild() + */ + void TrackerWrapTreeNode::AddChild(TrackerWrapTreeNode *child) { + m_children.insert(child); + } + + /** + * \class TrackerWrapTrees + * + * Class containing a list of trees with nodes holding TrackerWrap objects. + * For a TrackerWrap object 'P' which owns another TrackerWrap object 'C', + * 'P' will be held in a node which will be the parent of the child node + * that holds 'C'. + * On destruction, nodes will be freed in a children-first way. + * + * NOTE: nodegit code previous to this change is prepared to manage an array of + * owners, so class TrackerWrapTrees considers multiple owners (parent nodes) too. + */ + class TrackerWrapTrees + { + public: + TrackerWrapTrees(nodegit::TrackerWrap::TrackerList *trackerList); + TrackerWrapTrees() = delete; + ~TrackerWrapTrees(); + TrackerWrapTrees(const TrackerWrapTrees &other) = delete; + TrackerWrapTrees(TrackerWrapTrees &&other) = delete; + TrackerWrapTrees& operator=(const TrackerWrapTrees &other) = delete; + TrackerWrapTrees& operator=(TrackerWrapTrees &&other) = delete; + + private: + void addNode(nodegit::TrackerWrap *trackerWrap); + void addParentNode(nodegit::TrackerWrap *owner, TrackerWrapTreeNode *child); + void deleteTree(TrackerWrapTreeNode *node); + void freeAllTreesChildrenFirst(); + + using TrackerWrapTreeNodeMap = std::unordered_map>; + + TrackerWrapTreeNodeMap m_mapTrackerWrapNode {}; + std::vector m_roots {}; + }; + + /** + * TrackerWrapTrees::TrackerWrapTrees(nodegit::TrackerWrap::TrackerList *trackerList) + * + * Unlinks items from trackerList and adds them to a tree. + * For each root (TrackerWrap item without owners), it adds a new tree root. + * + * \param trackerList TrackerList pointer from which the TrackerWrapTrees object will be created. + */ + TrackerWrapTrees::TrackerWrapTrees(nodegit::TrackerWrap::TrackerList *trackerList) + { + nodegit::TrackerWrap *trackerWrap {}; + while ((trackerWrap = nodegit::TrackerWrap::UnlinkFirst(trackerList)) != nullptr) { + addNode(trackerWrap); + } + } + + /* + * TrackerWrapTrees::~TrackerWrapTrees + */ + TrackerWrapTrees::~TrackerWrapTrees() { + freeAllTreesChildrenFirst(); + } + + /** + * TrackerWrapTrees::addNode + * + * \param trackerWrap pointer to the TrackerWrap object to add as a node in a tree. + */ + void TrackerWrapTrees::addNode(nodegit::TrackerWrap *trackerWrap) { + // add trackerWrap as a node + // NOTE: 'emplace' will create a temporal TrackerWrapTreeNode and will + // free it if trackerWrap already exists as a key. To prevent freeing + // the node at this moment we have to find it first. + auto addedNodeIter = m_mapTrackerWrapNode.find(trackerWrap); + if (addedNodeIter == m_mapTrackerWrapNode.end()) { + addedNodeIter = m_mapTrackerWrapNode.emplace(std::make_pair( + trackerWrap, std::make_unique(trackerWrap))).first; + } + TrackerWrapTreeNode *addedNode = addedNodeIter->second.get(); + + // if trackerWrap has no owners, add it as a root node + const std::vector *owners = trackerWrap->GetTrackerWrapOwners(); + if (owners == nullptr) { + m_roots.push_back(addedNode); + } + else { + // add addedNode's parents and link them with this child + for (nodegit::TrackerWrap *owner : *owners) { + addParentNode(owner, addedNode); + } + } + } + + /** + * TrackerWrapTrees::addParentNode + * + * \param owner TrackerWrap pointer for the new parent node to add. + * \param child TrackerWrapTreeNode pointer to be the child node of the new parent node to add. + */ + void TrackerWrapTrees::addParentNode(nodegit::TrackerWrap *owner, TrackerWrapTreeNode *child) + { + // adds a new parent node (holding the owner) + // NOTE: 'emplace' will create a temporal TrackerWrapTreeNode and will + // free it if trackerWrap already exists as a key. To prevent freeing + // the node at this moment we have to find it first. + auto addedParentNodeIter = m_mapTrackerWrapNode.find(owner); + if (addedParentNodeIter == m_mapTrackerWrapNode.end()) { + addedParentNodeIter = m_mapTrackerWrapNode.emplace(std::make_pair( + owner, std::make_unique(owner))).first; + } + TrackerWrapTreeNode *addedParentNode = addedParentNodeIter->second.get(); + + // links parent to child + addedParentNode->AddChild(child); + } + + /** + * TrackerWrapTrees::deleteTree + * + * Deletes the tree from the node passed as a parameter + * in a children-first way and recursively. + * + * \param node node from where to delete all its children and itself. + */ + void TrackerWrapTrees::deleteTree(TrackerWrapTreeNode *node) + { + // delete all node's children first + const std::unordered_set &children = node->Children(); + for (TrackerWrapTreeNode *child : children) { + // check that child hasn't been removed previously by another parent + if (m_mapTrackerWrapNode.find(child->TrackerWrap()) != m_mapTrackerWrapNode.end()) { + deleteTree(child); + } + } + + // then deletes itself from the container, which will + // actually free 'node' and the TrackerWrap object it holds + m_mapTrackerWrapNode.erase(node->TrackerWrap()); + } + + /** + * TrackerWrapTrees::freeAllTreesChildrenFirst + * + * Deletes all the trees held, in a children-first way. + */ + void TrackerWrapTrees::freeAllTreesChildrenFirst() { + for (TrackerWrapTreeNode *root : m_roots) { + deleteTree(root); + } + m_roots.clear(); + } +} // end anonymous namespace + + +namespace nodegit { + TrackerWrap* TrackerWrap::UnlinkFirst(TrackerList *listStart) { + assert(listStart != nullptr); + return listStart->m_next == nullptr ? nullptr : listStart->m_next->Unlink(); + } + + void TrackerWrap::DeleteFromList(TrackerList *listStart) { + assert(listStart != nullptr); + // creates an object TrackerWrapTrees, which will free + // the nodes of its trees in a children-first way + TrackerWrapTrees trackerWrapTrees(listStart); + } +} \ No newline at end of file diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 0f0b49f96..8b641cc29 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -67,6 +67,7 @@ "src/str_array_converter.cc", "src/context.cc", "src/v8_helpers.cc", + "src/tracker_wrap.cc", {% each %} {% if type != "enum" %} "src/{{ name }}.cc", From 4780b6ee7b0bba00979f2ac66fbf543bd7b05d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Tue, 31 Aug 2021 09:38:54 +0200 Subject: [PATCH 333/545] Revert "Check if module is compiled under context aware node version" This reverts commit b0e7440d716f02e5889f749acc1e7bb1335b9357. --- generate/templates/manual/include/context.h | 14 -------------- generate/templates/manual/src/context.cc | 4 ---- generate/templates/manual/src/thread_pool.cc | 13 ++----------- generate/templates/templates/nodegit.cc | 4 ---- 4 files changed, 2 insertions(+), 33 deletions(-) diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 718a79742..3989ea686 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -8,20 +8,6 @@ #include #include -/* - * Determine if node module is compiled under a supported node release. - * Currently 12 - 15 (ignoring pre-releases). Will need to be updated - * for new major versions. - * - * See: https://github.com/nodejs/node/issues/36349 - * and: https://github.com/nodejs/node/blob/master/doc/abi_version_registry.json - */ -#define IS_CONTEXT_AWARE_NODE_MODULE_VERSION \ - (NODE_MODULE_VERSION == 72 \ - || NODE_MODULE_VERSION == 79 \ - || NODE_MODULE_VERSION == 83 \ - || NODE_MODULE_VERSION == 88) - #include "async_worker.h" #include "cleanup_handle.h" #include "thread_pool.h" diff --git a/generate/templates/manual/src/context.cc b/generate/templates/manual/src/context.cc index 101052b8b..a4c9483dc 100644 --- a/generate/templates/manual/src/context.cc +++ b/generate/templates/manual/src/context.cc @@ -5,11 +5,7 @@ namespace nodegit { AsyncContextCleanupHandle::AsyncContextCleanupHandle(v8::Isolate *isolate, Context *context) : context(context), -#if IS_CONTEXT_AWARE_NODE_MODULE_VERSION handle(node::AddEnvironmentCleanupHook(isolate, AsyncCleanupContext, this)) -#else - handle(nullptr) -#endif {} AsyncContextCleanupHandle::~AsyncContextCleanupHandle() { diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index f911fd47c..fa95ccb42 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -721,19 +721,10 @@ namespace nodegit { asyncCallbackData->cleanupHandle.swap(cleanupHandle); asyncCallbackData->pool = nullptr; -#if IS_CONTEXT_AWARE_NODE_MODULE_VERSION uv_close(reinterpret_cast(&jsThreadCallbackAsync), [](uv_handle_t *handle) { - auto closeAsyncCallbackData = static_cast(handle->data); - delete closeAsyncCallbackData; + auto asyncCallbackData = static_cast(handle->data); + delete asyncCallbackData; }); -#else - // NOTE We are deliberately leaking this pointer because `async` cleanup in - // node has not completely landed yet. Trying to cleanup this pointer - // is probably not worth the fight as it's very little memory lost per context - // When all LTS versions of node and Electron support async cleanup, we should - // be heading back to cleanup this - uv_close(reinterpret_cast(&jsThreadCallbackAsync), nullptr); -#endif } ThreadPool::ThreadPool(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 0b26dc303..846e9b1f1 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -112,8 +112,4 @@ NAN_MODULE_INIT(init) { nodegit::LockMaster::InitializeContext(); } -#if IS_CONTEXT_AWARE_NODE_MODULE_VERSION NAN_MODULE_WORKER_ENABLED(nodegit, init) -#else -NODE_MODULE(nodegit, init) -#endif From 46f57c944a48066c50d956b45335562e70b53e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Wed, 8 Sep 2021 11:22:43 +0200 Subject: [PATCH 334/545] prepare code to add test - add code to get the number of tracked objects. - export getNumberOfTrackedObjects for NodeGit addon. --- generate/templates/manual/include/context.h | 4 ++++ generate/templates/manual/include/tracker_wrap.h | 3 +++ generate/templates/manual/src/nodegit_wrapper.cc | 3 +++ generate/templates/manual/src/tracker_wrap.cc | 11 +++++++++++ generate/templates/templates/nodegit.cc | 13 +++++++++++++ 5 files changed, 34 insertions(+) diff --git a/generate/templates/manual/include/context.h b/generate/templates/manual/include/context.h index 3989ea686..11e8b93f8 100644 --- a/generate/templates/manual/include/context.h +++ b/generate/templates/manual/include/context.h @@ -45,6 +45,10 @@ namespace nodegit { list->Link(&trackerList); } + inline int TrackerListSize() { + return nodegit::TrackerWrap::SizeFromList(&trackerList); + } + private: v8::Isolate *isolate; diff --git a/generate/templates/manual/include/tracker_wrap.h b/generate/templates/manual/include/tracker_wrap.h index 4fe4b6c7e..3cc8a4b08 100644 --- a/generate/templates/manual/include/tracker_wrap.h +++ b/generate/templates/manual/include/tracker_wrap.h @@ -58,6 +58,9 @@ namespace nodegit { // Unlinks and returns the first item of 'listStart' static TrackerWrap* UnlinkFirst(TrackerList *listStart); + // Returns number of items following 'listStart' + static int SizeFromList(TrackerList *listStart); + // Deletes items following 'listStart', but not 'listStart' itself static void DeleteFromList(TrackerList *listStart); diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index a2e7a0457..a21790178 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -53,6 +53,9 @@ NodeGitWrapper::~NodeGitWrapper() { SelfFreeingInstanceCount--; raw = NULL; } + else if (!selfFreeing) { + --NonSelfFreeingConstructedCount; + } } template diff --git a/generate/templates/manual/src/tracker_wrap.cc b/generate/templates/manual/src/tracker_wrap.cc index 7cebf3116..36450c320 100644 --- a/generate/templates/manual/src/tracker_wrap.cc +++ b/generate/templates/manual/src/tracker_wrap.cc @@ -220,6 +220,17 @@ namespace nodegit { return listStart->m_next == nullptr ? nullptr : listStart->m_next->Unlink(); } + int TrackerWrap::SizeFromList(TrackerList *listStart) { + assert(listStart != nullptr); + TrackerList *t {listStart}; + int count {0}; + while (t->m_next != nullptr) { + ++count; + t = t->m_next; + } + return count; + } + void TrackerWrap::DeleteFromList(TrackerList *listStart) { assert(listStart != nullptr); // creates an object TrackerWrapTrees, which will free diff --git a/generate/templates/templates/nodegit.cc b/generate/templates/templates/nodegit.cc index 846e9b1f1..e43f8b2ae 100644 --- a/generate/templates/templates/nodegit.cc +++ b/generate/templates/templates/nodegit.cc @@ -67,6 +67,13 @@ void OpenSSL_ThreadSetup() { CRYPTO_THREADID_set_callback(OpenSSL_IDCallback); } +// diagnostic function +NAN_METHOD(GetNumberOfTrackedObjects) { + nodegit::Context *currentNodeGitContext = nodegit::Context::GetCurrentContext(); + assert (currentNodeGitContext != nullptr); + info.GetReturnValue().Set(currentNodeGitContext->TrackerListSize()); +} + static std::once_flag libraryInitializedFlag; static std::mutex libraryInitializationMutex; @@ -88,6 +95,12 @@ NAN_MODULE_INIT(init) { }); } + // Exports function 'getNumberOfTrackedObjects' + Nan::Set(target + , Nan::New("getNumberOfTrackedObjects").ToLocalChecked() + , Nan::GetFunction(Nan::New(GetNumberOfTrackedObjects)).ToLocalChecked() + ); + Nan::HandleScope scope; Local context = Nan::GetCurrentContext(); Isolate *isolate = context->GetIsolate(); From e3c8dde7e6008293a3ab8919799940520693fa69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Wed, 8 Sep 2021 09:49:13 +0200 Subject: [PATCH 335/545] test checking that objects are being tracked so that they can be freed on context shutdown --- test/tests/worker.js | 43 +++++++++++++++++ test/utils/worker_context_aware.js | 74 ++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 test/utils/worker_context_aware.js diff --git a/test/tests/worker.js b/test/tests/worker.js index e141b58aa..b68b47e42 100644 --- a/test/tests/worker.js +++ b/test/tests/worker.js @@ -84,5 +84,48 @@ if (Worker) { }); }); } + + // NOTE: first try was to build a test measuring memory used, checking + // that memory allocated by objects was being freed, but it was problematic + // to obtain the memory freed by a different context (a worker) after the + // context was gone, and the data in the tests wasn't consistent. + // So instead this test checks that the count of objects created/destroyed + // during the test match the count of objects being tracked by the + // nodegit::Context, which will be destroyed on context shutdown. To check + // that they are actually being freed can be done with a debugger/profiler. + it("can track objects to free on context shutdown", function(done) { + let testOk; + const workerPath = local("../utils/worker_context_aware.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "numbersMatch": + testOk = true; + worker.terminate(); + break; + case "numbersDoNotMatch": + testOk = false; + worker.terminate(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1 && testOk === true) { + done(); + } + else { + assert.fail(); + } + }); + }); }); } diff --git a/test/utils/worker_context_aware.js b/test/utils/worker_context_aware.js new file mode 100644 index 000000000..a1a00fbc6 --- /dev/null +++ b/test/utils/worker_context_aware.js @@ -0,0 +1,74 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const garbageCollect = require("./garbage_collect.js"); +const assert = require("assert"); +const NodeGit = require("../../"); +const { promisify } = require("util"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +const { clonePath, url } = workerData; +const opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +const oid = "fce88902e66c72b5b93e75bdb5ae717038b221f6"; + +return NodeGit.Clone(url, clonePath, opts) +.then((_repository) => { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return repository.getCommit(oid); +}).then((commit) => { + assert.ok(commit instanceof NodeGit.Commit); + var historyCount = 0; + var history = commit.history(); + + history.on("commit", function(commit) { + // Number of commits is known to be higher than 200 + if (++historyCount == 200) { + // Tracked objects must work too when the Garbage Collector is triggered + garbageCollect(); + + // Count total of objects left after being created/destroyed + const selfFreeingCount = + NodeGit.Cert.getNonSelfFreeingConstructedCount() + + NodeGit.Repository.getSelfFreeingInstanceCount() + + NodeGit.Commit.getSelfFreeingInstanceCount() + + NodeGit.Oid.getSelfFreeingInstanceCount() + + NodeGit.Revwalk.getSelfFreeingInstanceCount(); + + const numberOfTrackedObjects = NodeGit.getNumberOfTrackedObjects(); + + if (selfFreeingCount === numberOfTrackedObjects) { + parentPort.postMessage("numbersMatch"); + } + else { + parentPort.postMessage("numbersDoNotMatch"); + } + } + }); + + history.on("end", function(commits) { + // Test should not get this far + parentPort.postMessage("failure"); + }); + + history.on("error", function(err) { + assert.ok(false); + }); + + history.start(); + + return promisify(setTimeout)(50000); +}).catch(() => parentPort.postMessage("failure")); \ No newline at end of file From dda1e2b6e8972c547f2ac25da682602334ca2f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Wed, 27 Oct 2021 13:34:07 +0200 Subject: [PATCH 336/545] changes reviewed --- generate/templates/manual/include/tracker_wrap.h | 5 +++-- generate/templates/manual/src/nodegit_wrapper.cc | 8 ++++---- generate/templates/manual/src/tracker_wrap.cc | 4 +--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/generate/templates/manual/include/tracker_wrap.h b/generate/templates/manual/include/tracker_wrap.h index 3cc8a4b08..3b15eba42 100644 --- a/generate/templates/manual/include/tracker_wrap.h +++ b/generate/templates/manual/include/tracker_wrap.h @@ -7,8 +7,9 @@ namespace nodegit { // Base class used to track wrapped objects, so that we can - // free the objects that were not freed (because their - // WeakCallback didn't trigger) at the time of context closing. + // free the objects that were not freed at the time of context + // closing (because their WeakCallback didn't trigger. See + // https://github.com/nodejs/help/issues/3297). // Implementation based on node.js's class RefTracker (napi). class TrackerWrap : public Nan::ObjectWrap { public: diff --git a/generate/templates/manual/src/nodegit_wrapper.cc b/generate/templates/manual/src/nodegit_wrapper.cc index a21790178..a790d7bc3 100644 --- a/generate/templates/manual/src/nodegit_wrapper.cc +++ b/generate/templates/manual/src/nodegit_wrapper.cc @@ -92,11 +92,11 @@ void NodeGitWrapper::SetNativeOwners(v8::Local owners) { if (owners->IsArray()) { v8::Local context = Nan::GetCurrentContext(); - const v8::Local array = owners.As(); - uint32_t length = array->Length(); + const v8::Local ownersArray = owners.As(); + const uint32_t numOwners = ownersArray->Length(); - for (uint32_t i = 0; i < length; ++i) { - v8::Local value = array->Get(context, i).ToLocalChecked(); + for (uint32_t i = 0; i < numOwners; ++i) { + v8::Local value = ownersArray->Get(context, i).ToLocalChecked(); const v8::Local object = value.As(); Nan::ObjectWrap *objectWrap = Nan::ObjectWrap::Unwrap(object); trackerOwners->push_back(static_cast(objectWrap)); diff --git a/generate/templates/manual/src/tracker_wrap.cc b/generate/templates/manual/src/tracker_wrap.cc index 36450c320..85034d88d 100644 --- a/generate/templates/manual/src/tracker_wrap.cc +++ b/generate/templates/manual/src/tracker_wrap.cc @@ -35,9 +35,7 @@ namespace { * Frees the memory of the TrackerWrap pointer it holds. */ TrackerWrapTreeNode::~TrackerWrapTreeNode() { - if (m_trackerWrap != nullptr) { - delete m_trackerWrap; - } + delete m_trackerWrap; } /** From 7d9b24d8a314cdf9a36510e26b6e28be1ca600a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Wed, 9 Jun 2021 10:29:32 +0200 Subject: [PATCH 337/545] Statistics with same output as "git-sizer -j" - Leverages threads when reading and storing data from the objects database, and when setting reachable objects. - Considers multiple initial commits. - Do not count empty trees, like git's empty tree "4b825dc642cb6eb9a060e54bf8d69288fbee4904". - Do not considers dangling/unreachable objects. - Windows build fix: std::max() was conflicting with macro definition in windows.h. Fixed using template syntax std::max() so that it's not confused with the macro. ibgit2 error codes only where makes sense test added --- generate/input/descriptor.json | 3 + generate/input/libgit2-supplement.json | 23 + .../templates/manual/include/worker_pool.h | 161 ++ .../templates/manual/repository/statistics.cc | 1889 +++++++++++++++++ generate/templates/templates/class_header.h | 4 + test/tests/repository.js | 34 + 6 files changed, 2114 insertions(+) create mode 100644 generate/templates/manual/include/worker_pool.h create mode 100644 generate/templates/manual/repository/statistics.cc diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index a6110fc9d..a5e8448d1 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3699,6 +3699,9 @@ "git_repository_set_refdb": { "ignore": true }, + "git_repository_statistics": { + "isAsync": true + }, "git_repository_submodule_cache_all": { "return": { "isErrorCode": true diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 02eb9ccf6..7ecec06c9 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -725,6 +725,28 @@ }, "group": "repository" }, + "git_repository_statistics": { + "args": [ + { + "name": "out", + "type": "void *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/repository/statistics.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "repository", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_repository_submodule_cache_all": { "type": "function", "file": "sys/repository.h", @@ -1043,6 +1065,7 @@ "git_repository_get_remotes", "git_repository_refresh_references", "git_repository_set_index", + "git_repository_statistics", "git_repository_submodule_cache_all", "git_repository_submodule_cache_clear" ] diff --git a/generate/templates/manual/include/worker_pool.h b/generate/templates/manual/include/worker_pool.h new file mode 100644 index 000000000..ed40bbce7 --- /dev/null +++ b/generate/templates/manual/include/worker_pool.h @@ -0,0 +1,161 @@ +#ifndef WORK_POOL_H +#define WORK_POOL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * \class WorkItem + * Abstract class for work items in the WorkerPool. + */ +class WorkItem +{ +public: + WorkItem() = default; + virtual ~WorkItem() = default; + WorkItem(const WorkItem &other) = default; + WorkItem(WorkItem &&other) = default; + WorkItem& operator=(const WorkItem &other) = default; + WorkItem& operator=(WorkItem &&other) = default; +}; + +/** + * \class Worker + * Interface for Workers in the WorkerPool. + */ +class IWorker +{ +public: + IWorker() = default; + virtual ~IWorker() = default; + IWorker(const IWorker &other) = delete; + IWorker(IWorker &&other) = delete; + IWorker& operator=(const IWorker &other) = delete; + IWorker& operator=(IWorker &&other) = delete; + + virtual bool Initialize() = 0; + virtual bool Execute(std::unique_ptr &&work) = 0; +}; + +/** + * \class WorkerPool + * To leverage this class, a Worker must inherit from IWorker. + * WorkItem is an abstract class from which to inherit too. + */ +template +class WorkerPool { +public: + WorkerPool(); + ~WorkerPool() = default; + WorkerPool(const WorkerPool &other) = delete; + WorkerPool(WorkerPool &&other) = delete; + WorkerPool& operator=(const WorkerPool &other) = delete; + WorkerPool& operator=(WorkerPool &&other) = delete; + + bool Init(std::vector< std::shared_ptr > workers); + bool InsertWork(std::unique_ptr &&work); + void Shutdown(); + +private: + void DoWork(std::shared_ptr worker); + + std::mutex m_workQueueMutex {}; + std::condition_variable m_workQueueCondition {}; + std::queue< std::unique_ptr > m_workQueue {}; + std::vector> m_threads {}; + bool m_stop {true}; // initially the workpool has no worker threads +}; + + +template +WorkerPool::WorkerPool() { + static_assert(std::is_base_of::value, "Worker must inherit from IWorker"); +} + +// returns true it it wasn't initialized previously; false otherwise +template +bool WorkerPool::Init(std::vector< std::shared_ptr > workers) +{ + { + std::lock_guard lock(m_workQueueMutex); + if (!m_stop) + return false; + m_stop = false; + } + + std::for_each (workers.begin(), workers.end(), [this](std::shared_ptr worker) { + m_threads.emplace_back(std::make_unique(std::bind(&WorkerPool::DoWork, this, worker))); + }); + + return true; +} + +// returns true if successfully inserted work; false otherwise +template +bool WorkerPool::InsertWork(std::unique_ptr &&work) +{ + { + std::lock_guard lock(m_workQueueMutex); + if (m_stop) + return false; + m_workQueue.emplace(std::move(work)); + } + m_workQueueCondition.notify_one(); + + return true; +} + +template +void WorkerPool::Shutdown() +{ + { + std::lock_guard lock(m_workQueueMutex); + if (m_stop) + return; + m_stop = true; + } + m_workQueueCondition.notify_all(); + + std::for_each (m_threads.begin(), m_threads.end(), [](std::unique_ptr &wt) { + if (wt->joinable()) { + wt->join(); + } + }); +} + +template +void WorkerPool::DoWork(std::shared_ptr worker) +{ + if (!worker->Initialize()) { + return; // signal main that we've exited early + } + + while (true) { + std::unique_ptr work {}; + { + std::unique_lock lock(m_workQueueMutex); + m_workQueueCondition.wait(lock, [this] { + return this->m_stop || !this->m_workQueue.empty(); + }); + + if (m_stop && m_workQueue.empty()) + return; + + work = std::move(m_workQueue.front()); + m_workQueue.pop(); + } + + if (!worker->Execute(std::move(work))) { + return; // signal main that we've exited early + } + } +} + +#endif // WORK_POOL_H + diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc new file mode 100644 index 000000000..175d0f05e --- /dev/null +++ b/generate/templates/manual/repository/statistics.cc @@ -0,0 +1,1889 @@ +/** + * \struct CommitsGraphNode + */ +struct CommitsGraphNode +{ + CommitsGraphNode(uint32_t aParentsLeft) : parentsLeft(aParentsLeft) {} + CommitsGraphNode() = default; + ~CommitsGraphNode() = default; + CommitsGraphNode(const CommitsGraphNode &other) = delete; + CommitsGraphNode(CommitsGraphNode &&other) = delete; + CommitsGraphNode& operator=(const CommitsGraphNode &other) = delete; + CommitsGraphNode& operator=(CommitsGraphNode &&other) = delete; + + std::vector children {}; + uint32_t parentsLeft {0}; // used when calculating the maximum history depth +}; + +/** + * \class CommitsGraph + */ +class CommitsGraph +{ +public: + CommitsGraph() = default; + ~CommitsGraph() = default; + CommitsGraph(const CommitsGraph &other) = delete; + CommitsGraph(CommitsGraph &&other) = delete; + CommitsGraph& operator=(const CommitsGraph &other) = delete; + CommitsGraph& operator=(CommitsGraph &&other) = delete; + + using CommitsGraphMap = std::unordered_map>; + + void AddNode(const std::string &oidStr, const std::vector &parents, uint32_t numParents); + uint32_t CalculateMaxDepth(); + +private: + void addParentNode(const std::string &oidParentStr, CommitsGraphNode *child); + + CommitsGraphMap m_mapOidNode {}; + std::vector m_roots {}; +}; + +/** + * CommitsGraph::AddNode + * + * \param oidStr oid of the commit object to add. + * \param parents oids of the commit's parents. + * \param numParents Number of parents of the commit object. + */ +void CommitsGraph::AddNode(const std::string &oidStr, const std::vector &parents, + uint32_t numParents) +{ + auto emplacePair = m_mapOidNode.emplace(std::make_pair( + oidStr, std::make_unique(numParents))); + + CommitsGraphMap::iterator itNode = emplacePair.first; + + // if this node already added by a child, update its parentsLeft + if (emplacePair.second == false) { + itNode->second.get()->parentsLeft = numParents; + } + + // set roots + if (numParents == 0) { + m_roots.emplace_back(itNode->second.get()); + } + + // add parents + for (unsigned int i = 0; i < numParents; ++i) { + addParentNode(parents.at(i), itNode->second.get()); + } +} + +/** + * CommitsGraph::CalculateMaxDepth + * \return Calculated maximum depth of the tree. + * + * Uses iterative algorithm to count levels. + * Considers multiple initial commits. + * Considers that children of one level can have multiple parents, hence we insert unique children + * at each level. + * Considers that same child can be in different levels. Here to prevent counting the same child + * multiple times, we only add a child when the last parent (parentsLeft) inserts it. This is + * actually what makes the algorithm fast. + * Recursive algorithm avoided to prevent stack overflow in case of excessive levels in the tree. + */ +uint32_t CommitsGraph::CalculateMaxDepth() +{ + uint32_t maxDepth {0}; + std::set parents {}; + std::set children {}; + + // start from the root commmits + for (CommitsGraphNode *root : m_roots) { + children.insert(root); + } + + while (!children.empty()) { + ++maxDepth; + parents = std::move(children); + + // add unique children of next level, and only if from the last parent + for (CommitsGraphNode *parent : parents) { + for (CommitsGraphNode *child : parent->children) { + if (--child->parentsLeft == 0) { + children.insert(child); + } + } + } + } + + return maxDepth; +} + +/** + * CommitsGraph::addParentNode + * + * \param oidParentStr oid of the parent commit to add. + * \param child Child of the parent commit being added. + */ +void CommitsGraph::addParentNode(const std::string &oidParentStr, CommitsGraphNode *child) +{ + CommitsGraphMap::iterator itParentNode = m_mapOidNode.emplace(std::make_pair( + oidParentStr, std::make_unique())).first; + + // add child to parent + itParentNode->second->children.emplace_back(child); +} + +/** + * \struct TreeStatistics + * Structure to store statistics for a git tree object. + */ +struct TreeStatistics +{ + TreeStatistics() = default; + ~TreeStatistics() = default; + TreeStatistics(const TreeStatistics &other) = delete; + TreeStatistics(TreeStatistics &&other) = default; + TreeStatistics& operator=(const TreeStatistics &other) = delete; + TreeStatistics& operator=(TreeStatistics &&other) = default; + + size_t numDirectories{0}; + size_t maxPathDepth {0}; + size_t maxPathLength {0}; + size_t numFiles {0}; + size_t totalFileSize {0}; + size_t numSymlinks {0}; + size_t numSubmodules {0}; +}; + +/** + * \struct Statistics + * Stores statistics of the analyzed repository. + */ +struct Statistics +{ + Statistics() = default; + ~Statistics() = default; + Statistics(const Statistics &other) = delete; + Statistics(Statistics &&other) = delete; + Statistics& operator=(const Statistics &other) = delete; + Statistics& operator=(Statistics &&other) = delete; + + struct { + struct { size_t count {0}; size_t size {0}; } commits; + struct { size_t count {0}; size_t size {0}; size_t entries {0}; } trees; + struct { size_t count {0}; size_t size {0}; } blobs; + struct { size_t count {0}; } annotatedTags; + struct { size_t count {0}; } references; + } repositorySize {}; + + struct { + struct { size_t maxSize {0}; size_t maxParents {0}; } commits; + struct { size_t maxEntries {0}; } trees; + struct { size_t maxSize {0}; } blobs; + } biggestObjects {}; + + struct { + uint32_t maxDepth {0}; + uint32_t maxTagDepth {0}; + } historyStructure {}; + + TreeStatistics biggestCheckouts {}; +}; + +/** + * \struct OdbObjectsData + * Structure to store, for each object read from the repository: + * - its information (size, parents for a commit, etc.) + * - different data needed to obtain the resulting statistics + */ +struct OdbObjectsData +{ + static constexpr uint32_t kUnreachable = 0; + + struct CommitInfo { + CommitInfo() = default; + ~CommitInfo() = default; + CommitInfo(const CommitInfo &other) = delete; + CommitInfo(CommitInfo &&other) = default; + CommitInfo& operator=(const CommitInfo &other) = delete; + CommitInfo& operator=(CommitInfo &&other) = default; + + std::string oidTree {}; + size_t size {0}; + std::vector parents {}; + // number of sources from which a commit can be reached: + // a child commit, a tag, or a direct git reference + uint32_t reachability {kUnreachable}; + }; + + struct TreeInfoAndStats { + TreeInfoAndStats() = default; + ~TreeInfoAndStats() = default; + TreeInfoAndStats(const TreeInfoAndStats &other) = delete; + TreeInfoAndStats(TreeInfoAndStats &&other) = default; + TreeInfoAndStats& operator=(const TreeInfoAndStats &other) = delete; + TreeInfoAndStats& operator=(TreeInfoAndStats &&other) = default; + + size_t size {0}; + size_t numEntries {0}; + std::vector entryBlobs {}; + std::vector< std::pair > entryTreesNameLen {}; + // number of sources from which a tree can be reached: + // a commit, another tree's entry, or a tag + uint32_t reachability {kUnreachable}; + TreeStatistics stats {}; + bool statsDone {false}; + }; + + struct BlobInfo { + BlobInfo() = default; + ~BlobInfo() = default; + BlobInfo(const BlobInfo &other) = delete; + BlobInfo(BlobInfo &&other) = default; + BlobInfo& operator=(const BlobInfo &other) = delete; + BlobInfo& operator=(BlobInfo &&other) = default; + + size_t size {0}; + // number of sources from which a blob can be reached: + // a tree's entry, or a tag + uint32_t reachability {kUnreachable}; + }; + + struct TagInfo { + static constexpr uint32_t kUnsetDepth = 0; + + TagInfo() = default; + ~TagInfo() = default; + TagInfo(const TagInfo &other) = delete; + TagInfo(TagInfo &&other) = default; + TagInfo& operator=(const TagInfo &other) = delete; + TagInfo& operator=(TagInfo &&other) = default; + + std::string oidTarget {}; + git_object_t typeTarget {GIT_OBJECT_INVALID}; + uint32_t depth {kUnsetDepth}; + // number of sources from which a tag can be reached: + // a reference, or another tag + uint32_t reachability {kUnreachable}; + }; + + OdbObjectsData() = default; + ~OdbObjectsData() = default; + OdbObjectsData(const OdbObjectsData &other) = delete; + OdbObjectsData(OdbObjectsData &&other) = delete; + OdbObjectsData& operator=(const OdbObjectsData &other) = delete; + OdbObjectsData& operator=(OdbObjectsData &&other) = delete; + + struct { + std::unordered_map info {}; + std::unordered_set unreachables {}; + // tree of commits (graph) to be built while reading the object database, + // in order to calculate the maximum history depth + CommitsGraph graph {}; + size_t totalSize {0}; + size_t maxSize {0}; + size_t maxParents {0}; + } commits {}; + + struct { + std::unordered_map info; + std::unordered_set unreachables {}; + size_t totalSize {0}; + size_t totalEntries {0}; + size_t maxEntries {0}; + } trees {}; + + struct { + std::unordered_map info {}; + std::unordered_set unreachables {}; + size_t totalSize {0}; + size_t maxSize {0}; + } blobs {}; + + struct { + std::unordered_map info; + std::unordered_set unreachables {}; + } tags {}; + + struct { + std::mutex commits {}; + std::mutex trees {}; + std::mutex blobs {}; + std::mutex tags {}; + } infoMutex; + + using iterCommitInfo = std::unordered_map::iterator; + using iterUnreachable = std::unordered_set::iterator; + using iterTreeInfo = std::unordered_map::iterator; + using iterBlobInfo = std::unordered_map::iterator; + using iterTagInfo = std::unordered_map::iterator; +}; + +/** + * \class WorkItemOid + * WorkItem storing odb oids for the WorkPool. + */ +class WorkItemOid : public WorkItem{ +public: + WorkItemOid(const git_oid &oid) + : m_oid(oid) {} + ~WorkItemOid() = default; + WorkItemOid(const WorkItemOid &other) = delete; + WorkItemOid(WorkItemOid &&other) = delete; + WorkItemOid& operator=(const WorkItemOid &other) = delete; + WorkItemOid& operator=(WorkItemOid &&other) = delete; + + const git_oid& GetOid() const { return m_oid; } + +private: + git_oid m_oid {}; +}; + +/** + * \class WorkerStoreOdbData + * Worker for the WorkPool to store odb object data. + */ +class WorkerStoreOdbData : public IWorker +{ +public: + WorkerStoreOdbData(const std::string &repoPath, OdbObjectsData *odbObjectsData) + : m_repoPath(repoPath), m_odbObjectsData(odbObjectsData) {} + ~WorkerStoreOdbData(); + WorkerStoreOdbData(const WorkerStoreOdbData &other) = delete; + WorkerStoreOdbData(WorkerStoreOdbData &&other) = delete; + WorkerStoreOdbData& operator=(const WorkerStoreOdbData &other) = delete; + WorkerStoreOdbData& operator=(WorkerStoreOdbData &&other) = delete; + + bool Initialize(); + bool Execute(std::unique_ptr &&work); + +private: + OdbObjectsData::TreeInfoAndStats thisTreeInfoAndStats(git_tree *tree, size_t size, size_t numEntries); + + std::string m_repoPath {}; + git_repository *m_repo {nullptr}; + git_odb *m_odb {nullptr}; + OdbObjectsData *m_odbObjectsData {nullptr}; +}; + +/** + * WorkerStoreOdbData::~WorkerStoreOdbData + */ +WorkerStoreOdbData::~WorkerStoreOdbData() { + if (m_odb) { + git_odb_free(m_odb); + } + if (m_repo) { + git_repository_free(m_repo); + } +} + +/** + * WorkerStoreOdbData::Initialize + */ +bool WorkerStoreOdbData::Initialize() { + if (m_repo != nullptr) { // if already initialized + return true; + } + + if (m_repoPath.empty()) { + return false; + } + else { + if (git_repository_open(&m_repo, m_repoPath.c_str()) != GIT_OK) { + return false; + } + + if (git_repository_odb(&m_odb, m_repo) != GIT_OK) { + return false; + } + } + return true; +} + +/** + * WorkerStoreOdbData::Execute + */ +bool WorkerStoreOdbData::Execute(std::unique_ptr &&work) +{ + std::unique_ptr wi {static_cast(work.release())}; + const git_oid &oid = wi->GetOid(); + + // NOTE about PERFORMANCE (May 2021): + // git_object_lookup() is as expensive as git_odb_read(). + // They give access to different information from the libgit2 API. + // Try to call only one of them if possible. + + git_object *target {nullptr}; + if (git_object_lookup(&target, m_repo, &oid, GIT_OBJECT_ANY) != GIT_OK) { + return false; + } + + switch (git_object_type(target)) + { + case GIT_OBJECT_COMMIT: + { + git_commit *commit = (git_commit*)target; + // NOTE about PERFORMANCE (May 2021): + // calling git_odb_object_size() was slightly faster than calculating header size + message size + 1 with GK repo + + // obtain size + git_odb_object *obj {nullptr}; + if (git_odb_read(&obj, m_odb, &oid) != GIT_OK) { + git_object_free(target); + return false; + } + size_t size = git_odb_object_size(obj); + git_odb_object_free(obj); + + // obtain CommitInfo + unsigned int numParents = git_commit_parentcount(commit); + std::vector parents {}; + for (unsigned int i = 0; i < numParents; ++i) { + parents.emplace_back(reinterpret_cast(git_commit_parent_id(commit, i)->id), + GIT_OID_RAWSZ); + } + + OdbObjectsData::CommitInfo commitInfo { + std::string(reinterpret_cast(git_commit_tree_id(commit)->id), GIT_OID_RAWSZ), + size, + std::move(parents), + OdbObjectsData::kUnreachable}; + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.commits); + + m_odbObjectsData->commits.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(commitInfo))); + } + } + break; + + case GIT_OBJECT_TREE: + { + git_tree *tree = (git_tree*)target; + + // do not count empty trees, like git's empty tree "4b825dc642cb6eb9a060e54bf8d69288fbee4904" + size_t numEntries = git_tree_entrycount(tree); + if (numEntries == 0) { + git_object_free(target); + return true; + } + + // obtain size + git_odb_object *obj {nullptr}; + if (git_odb_read(&obj, m_odb, &oid) != GIT_OK) { + git_object_free(target); + return false; + } + size_t size = git_odb_object_size(obj); + git_odb_object_free(obj); + + // obtain tree data and calculate statistics for only this tree (not recursively) + OdbObjectsData::TreeInfoAndStats treeInfoAndStats = thisTreeInfoAndStats(tree, size, numEntries); + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + + m_odbObjectsData->trees.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(treeInfoAndStats))); + } + } + break; + + case GIT_OBJECT_BLOB: + { + git_blob *blob = (git_blob*)target; + size_t size = git_blob_rawsize(blob); + OdbObjectsData::BlobInfo blobInfo {size, OdbObjectsData::kUnreachable}; + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.blobs); + + m_odbObjectsData->blobs.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(blobInfo))); + } + } + break; + + case GIT_OBJECT_TAG: + { + // obtain TagInfo + git_tag *tag = (git_tag*)target; + const git_oid *oid_target = git_tag_target_id(tag); + OdbObjectsData::TagInfo tagInfo { + std::string(reinterpret_cast(oid_target->id), GIT_OID_RAWSZ), + git_tag_target_type(tag), + OdbObjectsData::TagInfo::kUnsetDepth, + OdbObjectsData::kUnreachable}; + + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.tags); + m_odbObjectsData->tags.info.emplace(std::make_pair( + std::string(reinterpret_cast(oid.id), GIT_OID_RAWSZ), + std::move(tagInfo))); + } + } + break; + + default: + break; + } + + git_object_free(target); + + return true; +} + +/** + * WorkerStoreOdbData::thisTreeInfoAndStats + * + * Obtain tree data and calculate the part of this tree's statistics that each thread can do. + * + * \param tree tree to get data from and calculate partial statistics of. + * \param size tree size, to be added to the final result. + * \param numEntries number of entries of this tree. + * \return this tree's data and partial statistics. + */ +OdbObjectsData::TreeInfoAndStats WorkerStoreOdbData::thisTreeInfoAndStats(git_tree *tree, size_t size, + size_t numEntries) +{ + const git_tree_entry *te {nullptr}; + git_object_t te_type {GIT_OBJECT_INVALID}; + const char *teName {nullptr}; + size_t teNameLen {0}; + const git_oid *te_oid {nullptr}; + + OdbObjectsData::TreeInfoAndStats treeInfoAndStats {}; + treeInfoAndStats.size = size; + treeInfoAndStats.numEntries = numEntries; + + for (size_t i = 0; i < numEntries; ++i) + { + te = git_tree_entry_byindex(tree, i); + if (te == nullptr) { + continue; + } + + te_type = git_tree_entry_type(te); + + switch (te_type) + { + // count submodules + case GIT_OBJECT_COMMIT: + if (git_tree_entry_filemode(te) == GIT_FILEMODE_COMMIT) { + ++treeInfoAndStats.stats.numSubmodules; + } + break; + + case GIT_OBJECT_BLOB: + { + // count symbolic links, but don't add them as blob entries + if (git_tree_entry_filemode(te) == GIT_FILEMODE_LINK) { + ++treeInfoAndStats.stats.numSymlinks; + } + else { + ++treeInfoAndStats.stats.numFiles; + teName = git_tree_entry_name(te); + teNameLen = std::char_traits::length(teName); + treeInfoAndStats.stats.maxPathLength = + std::max(treeInfoAndStats.stats.maxPathLength, teNameLen); + } + // store both types of files (symbolic links and non symbolic links) as entryBlob + te_oid = git_tree_entry_id(te); + treeInfoAndStats.entryBlobs.emplace_back( + reinterpret_cast(te_oid->id), GIT_OID_RAWSZ); + } + break; + + case GIT_OBJECT_TREE: + { + // We store tree's name lenght to compare in posterior stage, after threads work + teName = git_tree_entry_name(te); + teNameLen = std::char_traits::length(teName); + + te_oid = git_tree_entry_id(te); + treeInfoAndStats.entryTreesNameLen.emplace_back(std::make_pair( + std::string(reinterpret_cast(te_oid->id), GIT_OID_RAWSZ), + teNameLen)); + } + break; + + default: + break; + } + } + + return treeInfoAndStats; +} + +/** + * \class WorkItemOidStrType + * WorkItem storing pointers to object info structs for the WorkPool. + */ +class WorkItemOidStrType : public WorkItem{ +public: + WorkItemOidStrType(void *objectInfo, git_object_t type) + : m_objectInfo(objectInfo), m_oid_type(type) {} + ~WorkItemOidStrType() = default; + WorkItemOidStrType(const WorkItemOidStrType &other) = delete; + WorkItemOidStrType(WorkItemOidStrType &&other) = delete; + WorkItemOidStrType& operator=(const WorkItemOidStrType &other) = delete; + WorkItemOidStrType& operator=(WorkItemOidStrType &&other) = delete; + + void* GetObjectInfo() const { return m_objectInfo; } + const git_object_t& GetOidType() const { return m_oid_type; } + +private: + void *m_objectInfo {nullptr}; + git_object_t m_oid_type {}; +}; + +/** + * \class WorkerReachCounter + * Worker for the WorkPool to count reachability of each object. + */ +class WorkerReachCounter : public IWorker +{ +public: + WorkerReachCounter(OdbObjectsData *odbObjectsData) + : m_odbObjectsData(odbObjectsData) {} + ~WorkerReachCounter() = default; + WorkerReachCounter(const WorkerReachCounter &other) = delete; + WorkerReachCounter(WorkerReachCounter &&other) = delete; + WorkerReachCounter& operator=(const WorkerReachCounter &other) = delete; + WorkerReachCounter& operator=(WorkerReachCounter &&other) = delete; + + bool Initialize() { return true; } + bool Execute(std::unique_ptr &&work); + +private: + void setReachabilityFromTags(void *objectInfo); + void setReachabilityFromCommits(void *objectInfo); + void setReachabilityFromTrees(void *objectInfo); + + OdbObjectsData *m_odbObjectsData {nullptr}; +}; + +/** + * WorkerReachCounter::Execute + */ +bool WorkerReachCounter::Execute(std::unique_ptr &&work) +{ + std::unique_ptr wi {static_cast(work.release())}; + void *objectInfo = wi->GetObjectInfo(); + const git_object_t &oid_type = wi->GetOidType(); + + switch (oid_type) { + case GIT_OBJECT_TAG: + setReachabilityFromTags(objectInfo); + break; + case GIT_OBJECT_COMMIT: + setReachabilityFromCommits(objectInfo); + break; + case GIT_OBJECT_TREE: + setReachabilityFromTrees(objectInfo); + break; + case GIT_OBJECT_BLOB: + // do not process blobs in this stage + break; + default: + break; + } + + return true; +} + +/** + * WorkerReachCounter::setReachabilityFromTags + * Adds reachability counter where tags point (any type of object). + */ +void WorkerReachCounter::setReachabilityFromTags(void *objectInfo) +{ + const OdbObjectsData::TagInfo *tagInfo = static_cast(objectInfo); + + switch (tagInfo->typeTarget) { + case GIT_OBJECT_COMMIT: + { + OdbObjectsData::iterCommitInfo itCommitInfo = + m_odbObjectsData->commits.info.find(tagInfo->oidTarget); + + if (itCommitInfo != m_odbObjectsData->commits.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.commits); + ++itCommitInfo->second.reachability; + } + } + } + break; + + case GIT_OBJECT_TREE: + { + OdbObjectsData::iterTreeInfo itTreeInfo = + m_odbObjectsData->trees.info.find(tagInfo->oidTarget); + + if (itTreeInfo != m_odbObjectsData->trees.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + ++itTreeInfo->second.reachability; + } + } + } + + case GIT_OBJECT_BLOB: + { + OdbObjectsData::iterBlobInfo itBlobInfo = + m_odbObjectsData->blobs.info.find(tagInfo->oidTarget); + + if (itBlobInfo != m_odbObjectsData->blobs.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.blobs); + ++itBlobInfo->second.reachability; + } + } + } + + case GIT_OBJECT_TAG: + { + OdbObjectsData::iterTagInfo itTargetTagInfo = + m_odbObjectsData->tags.info.find(tagInfo->oidTarget); + + if (itTargetTagInfo != m_odbObjectsData->tags.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.tags); + ++itTargetTagInfo->second.reachability; + } + } + } + default: + break; + } +} + +/** + * WorkerReachCounter::setReachabilityFromCommits + * Adds reachability counter where commits point (parents and tree). + */ +void WorkerReachCounter::setReachabilityFromCommits(void *objectInfo) +{ + const OdbObjectsData::CommitInfo *commitInfo = + static_cast(objectInfo); + size_t numParents = commitInfo->parents.size(); + + // set parents' reachability + for (size_t i = 0; i < numParents; ++i) { + OdbObjectsData::iterCommitInfo itParentCommitInfo = + m_odbObjectsData->commits.info.find(commitInfo->parents.at(i)); + + if (itParentCommitInfo != m_odbObjectsData->commits.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.commits); + ++itParentCommitInfo->second.reachability; + } + } + } + + // add 1 to its tree's reachability + OdbObjectsData::iterTreeInfo itCommitTreeInfo = + m_odbObjectsData->trees.info.find(commitInfo->oidTree); + + if (itCommitTreeInfo != m_odbObjectsData->trees.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + ++itCommitTreeInfo->second.reachability; + } + } +} + +/** + * WorkerReachCounter::setReachabilityFromTrees + * Adds reachability counter where tree entries point (blobs and other trees). + */ +void WorkerReachCounter::setReachabilityFromTrees(void *objectInfo) +{ + const OdbObjectsData::TreeInfoAndStats *treeInfo = + static_cast(objectInfo); + + // set entry blobs' reachability + for (auto &blob : treeInfo->entryBlobs) { + OdbObjectsData::iterBlobInfo itBlobInfo = m_odbObjectsData->blobs.info.find(blob); + + if (itBlobInfo != m_odbObjectsData->blobs.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.blobs); + ++itBlobInfo->second.reachability; + } + } + } + + // set entry trees' reachability + for (auto &treeNameLen : treeInfo->entryTreesNameLen) { + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData->trees.info.find(treeNameLen.first); + + if (itTreeInfo != m_odbObjectsData->trees.info.end()) { + { // lock + std::lock_guard lock(m_odbObjectsData->infoMutex.trees); + ++itTreeInfo->second.reachability; + } + } + } +} + +/** + * forEachOdbCb. Callback for git_odb_foreach. + * Returns GIT_OK on success; GIT_EUSER otherwise + */ +static int forEachOdbCb(const git_oid *oid, void *payloadToCast) +{ + WorkerPool *workerPool = + static_cast*>(payloadToCast); + + // Must insert copies of oid, since the pointers might not survive until worker thread picks it up + if (!workerPool->InsertWork(std::make_unique(*oid))) { + return GIT_EUSER; + } + + return GIT_OK; +} + +/** + * \class RepoAnalysis + * Class to analyse and hold repository statistics + */ +class RepoAnalysis +{ +public: + static constexpr unsigned int kMinThreads = 4; + + explicit RepoAnalysis(git_repository *repo) + : m_repo(repo) {} + ~RepoAnalysis() = default; + RepoAnalysis(const RepoAnalysis &other) = delete; + RepoAnalysis(RepoAnalysis &&other) = delete; + RepoAnalysis& operator=(const RepoAnalysis &other) = delete; + RepoAnalysis& operator=(RepoAnalysis &&other) = delete; + + int Analyze(); + v8::Local StatisticsToJS() const; + +private: + // stage 1 methods: store data from repository (with threads) + int storeObjectsInfo(); + int storeAndCountRefs(); + // stage 2 methods: count reachability of each object (with threads) + // NOTE: we need this stage, since so far libgit2 doesn't provide unreachable objects + void setObjectsReachability(); + void setReachabilityFromRefs(); + void setUnreachables(); + // stage 3 methods: prune unreachable oids + void pruneUnreachables(); + void pruneUnreachableTags(); + void pruneUnreachableCommits(); + void pruneUnreachableTrees(); + void pruneUnreachableBlobs(); + // stage 4 methods: repositorySize and biggestObjects + void statsCountAndMax(); + // stage 5 methods: historyStructure and biggestCheckouts + bool statsHistoryAndBiggestCheckouts(); + bool calculateBiggestCheckouts(); + OdbObjectsData::iterTreeInfo calculateTreeStatistics(const std::string &oidTree); + bool calculateMaxTagDepth(); + OdbObjectsData::iterTagInfo calculateTagDepth(const std::string &oidTag); + // methods to return the statistics calculated + void fillOutStatistics(); + v8::Local repositorySizeToJS() const; + v8::Local biggestObjectsToJS() const; + v8::Local historyStructureToJS() const; + v8::Local biggestCheckoutsToJS() const; + + git_repository *m_repo {nullptr}; + Statistics m_statistics {}; + // odb objects info to build while reading the object database by each thread + OdbObjectsData m_odbObjectsData {}; + // oid and type of peeled references + std::unordered_map m_peeledRefs {}; +}; + +/** + * RepoAnalysis::Analyze + */ +int RepoAnalysis::Analyze() +{ + int errorCode {GIT_OK}; + + if ((errorCode = storeObjectsInfo() != GIT_OK)) { + return errorCode; + } + + setObjectsReachability(); + pruneUnreachables(); + + statsCountAndMax(); + + if (!statsHistoryAndBiggestCheckouts()) { + return GIT_EUSER; + } + + fillOutStatistics(); + + return errorCode; +} + +/** + * RepoAnalysis::StatisticsToJS + */ +v8::Local RepoAnalysis::StatisticsToJS() const +{ + v8::Local result = Nan::New(); + + v8::Local repositorySize = repositorySizeToJS(); + Nan::Set(result, Nan::New("repositorySize").ToLocalChecked(), repositorySize); + + v8::Local biggestObjects = biggestObjectsToJS(); + Nan::Set(result, Nan::New("biggestObjects").ToLocalChecked(), biggestObjects); + + v8::Local historyStructure = historyStructureToJS(); + Nan::Set(result, Nan::New("historyStructure").ToLocalChecked(), historyStructure); + + v8::Local biggestCheckouts = biggestCheckoutsToJS(); + Nan::Set(result, Nan::New("biggestCheckouts").ToLocalChecked(), biggestCheckouts); + + return result; +} + +/** + * RepoAnalysis::storeObjectsInfo + * Store information from read odb objects. + * Build a container with only reachable objects (avoid dangling objects). + */ +int RepoAnalysis::storeObjectsInfo() +{ + int errorCode {GIT_OK}; + + // get the objects database + git_odb *odb {nullptr}; + if ((errorCode = git_repository_odb(&odb, m_repo)) != GIT_OK) { + return errorCode; + } + + // initialize workers for the worker pool + std::string repoPath = git_repository_path(m_repo); + unsigned int numThreads = + std::max(std::thread::hardware_concurrency(), static_cast(kMinThreads)); + + std::vector< std::shared_ptr > workers {}; + for (unsigned int i = 0; i < numThreads; ++i) { + workers.emplace_back(std::make_shared(repoPath, &m_odbObjectsData)); + } + + // initialize worker pool + WorkerPool workerPool {}; + workerPool.Init(workers); + + if ((errorCode = git_odb_foreach(odb, forEachOdbCb, &workerPool)) != GIT_OK) { + git_odb_free(odb); + return errorCode; + } + + // main thread will work on the refs while waiting for the threads to finish + if ((errorCode = storeAndCountRefs() != GIT_OK)) { + return errorCode; + } + + // wait for the threads to finish and shutdown the work pool + workerPool.Shutdown(); + + git_odb_free(odb); + + return errorCode; +} + +/** + * RepoAnalysis::storeAndCountRefs + * Stores the oid and type of peeled references. + * Also counts total references. + */ +int RepoAnalysis::storeAndCountRefs() +{ + int errorCode {GIT_OK}; + git_strarray ref_list; + + // count refs + if ((errorCode = git_reference_list(&ref_list, m_repo)) != GIT_OK) { + return errorCode; + } + m_statistics.repositorySize.references.count = ref_list.count; + + // store refs info + for (size_t i = 0; i < ref_list.count; ++i) + { + // lookup ref + git_reference *ref {nullptr}; + int refLookupError = git_reference_lookup(&ref, m_repo, ref_list.strings[i]); + if (refLookupError == GIT_ENOTFOUND || refLookupError == GIT_EINVALIDSPEC) { + continue; + } + else if (refLookupError != GIT_OK) { + git_strarray_dispose(&ref_list); + return refLookupError; + } + + // obtain peeled oid of the reference + const git_oid *oid_ref {nullptr}; + switch (git_reference_type(ref)) + { + case GIT_REFERENCE_DIRECT: + oid_ref = git_reference_target(ref); + break; + + case GIT_REFERENCE_SYMBOLIC: + { + git_reference *ref_resolved {nullptr}; + if ((errorCode = git_reference_resolve(&ref_resolved, ref)) != GIT_OK) { + git_reference_free(ref); + git_strarray_dispose(&ref_list); + return errorCode; + } + oid_ref = git_reference_target(ref_resolved); + git_reference_free(ref_resolved); + } + break; + + default: + break; + } + + // store object's oid and type + if (oid_ref != nullptr) + { + git_object *target {nullptr}; + if (git_object_lookup(&target, m_repo, oid_ref, GIT_OBJECT_ANY) != GIT_OK) { + git_reference_free(ref); + git_strarray_dispose(&ref_list); + return false; + } + + m_peeledRefs.emplace(std::make_pair( + std::string(reinterpret_cast(oid_ref->id), GIT_OID_RAWSZ), + git_object_type(target))); + + git_object_free(target); + } + git_reference_free(ref); + } + git_strarray_dispose(&ref_list); + + return errorCode; +} + +/** + * RepoAnalysis::setObjectsReachability + * Leverages threads to set reachability from tags, commits, and trees. + * NOTE: performance didn't improve leveraging threads for adding objects to unreachables container. + */ +void RepoAnalysis::setObjectsReachability() +{ + // references are not objects, hence they won't be sent to the worker threads + setReachabilityFromRefs(); + + unsigned int numThreads = + std::max(std::thread::hardware_concurrency(), static_cast(kMinThreads)); + std::vector< std::shared_ptr > workers {}; + for (unsigned int i = 0; i < numThreads; ++i) { + workers.emplace_back(std::make_shared(&m_odbObjectsData)); + } + + // initialize worker pool + WorkerPool workerPool {}; + workerPool.Init(workers); + + // NOTE: avoid queueing same type of objects in a row, so that different mutex can be used concurrently + uint8_t workInserted {0}; + OdbObjectsData::iterTagInfo itTagInfo = m_odbObjectsData.tags.info.begin(); + OdbObjectsData::iterCommitInfo itCommitInfo = m_odbObjectsData.commits.info.begin(); + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.begin(); + do { + workInserted = 0; + // insert tag + if (itTagInfo != m_odbObjectsData.tags.info.end()) { + if (!workerPool.InsertWork( + std::make_unique(&itTagInfo->second, GIT_OBJECT_TAG))) { + return; + } + ++itTagInfo; + ++workInserted; + } + // insert commmit + if (itCommitInfo != m_odbObjectsData.commits.info.end()) { + if (!workerPool.InsertWork( + std::make_unique(&itCommitInfo->second, GIT_OBJECT_COMMIT))) { + return; + } + ++itCommitInfo; + ++workInserted; + } + // insert tree + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + if (!workerPool.InsertWork( + std::make_unique(&itTreeInfo->second, GIT_OBJECT_TREE))) { + return; + } + ++itTreeInfo; + ++workInserted; + } + // blobs do not reach to any other object, hence no need to process them + } while (workInserted); + + // wait for the threads to finish and shutdown the work pool + workerPool.Shutdown(); + + setUnreachables(); +} + +/** + * RepoAnalysis::setReachabilityFromRefs + * Adds reachability counter where peeled refs point (normally a commit or a tag). + */ +void RepoAnalysis::setReachabilityFromRefs() +{ + for (const auto &ref : m_peeledRefs) { + switch (ref.second) { + case GIT_OBJECT_COMMIT: + { + OdbObjectsData::iterCommitInfo itCommitInfo = + m_odbObjectsData.commits.info.find(ref.first); + + if (itCommitInfo != m_odbObjectsData.commits.info.end()) { + ++itCommitInfo->second.reachability; + } + } + break; + case GIT_OBJECT_TREE: + { + OdbObjectsData::iterTreeInfo itTreeInfo = + m_odbObjectsData.trees.info.find(ref.first); + + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + ++itTreeInfo->second.reachability; + } + } + break; + case GIT_OBJECT_BLOB: + { + OdbObjectsData::iterBlobInfo itBlobInfo = + m_odbObjectsData.blobs.info.find(ref.first); + + if (itBlobInfo != m_odbObjectsData.blobs.info.end()) { + ++itBlobInfo->second.reachability; + } + } + break; + case GIT_OBJECT_TAG: + { + OdbObjectsData::iterTagInfo itTagInfo = + m_odbObjectsData.tags.info.find(ref.first); + + if (itTagInfo != m_odbObjectsData.tags.info.end()) { + ++itTagInfo->second.reachability; + } + } + break; + default: + break; + } + } +} + +/** + * RepoAnalysis::setUnreachables + * After setting reachability, we add the unreached objects to their unreachables container. + */ +void RepoAnalysis::setUnreachables() + { + for (const auto &tag : m_odbObjectsData.tags.info) { + if (!tag.second.reachability) { + m_odbObjectsData.tags.unreachables.emplace(tag.first); + } + } + for (const auto &commit : m_odbObjectsData.commits.info) { + if (!commit.second.reachability) { + m_odbObjectsData.commits.unreachables.emplace(commit.first); + } + } + for (const auto &tree : m_odbObjectsData.trees.info) { + if (!tree.second.reachability) { + m_odbObjectsData.trees.unreachables.emplace(tree.first); + } + } + for (const auto &blob : m_odbObjectsData.blobs.info) { + if (!blob.second.reachability) { + m_odbObjectsData.blobs.unreachables.emplace(blob.first); + } + } + } + +/** + * RepoAnalysis::pruneUnreachables + * Removes from their containers the unreachable objects. + * Decreases reachability of the objects they can reach. + */ +void RepoAnalysis::pruneUnreachables() +{ + // NOTE: order is important here, since each method prunes its own objects, but + // only decreases reachability of the objects connected to it; and those + // connected objects will be checked and pruned afterwards. + pruneUnreachableTags(); + pruneUnreachableCommits(); + pruneUnreachableTrees(); + pruneUnreachableBlobs(); +} + +/** + * RepoAnalysis::pruneUnreachableTags + * Prune tags and their chained tags if they become unreachable. + * Also decreases reachability of targets. + */ +void RepoAnalysis::pruneUnreachableTags() +{ + while (!m_odbObjectsData.tags.unreachables.empty()) { + std::unordered_set newUnreachables {}; + + // erase unreachable tags + for (OdbObjectsData::iterUnreachable itTagUnrch = m_odbObjectsData.tags.unreachables.begin(); + itTagUnrch != m_odbObjectsData.tags.unreachables.end(); ++itTagUnrch) + { + OdbObjectsData::iterTagInfo itTagInfo = m_odbObjectsData.tags.info.find(*itTagUnrch); + + if (itTagInfo != m_odbObjectsData.tags.info.end()) { + const std::string &oidTarget = itTagInfo->second.oidTarget; + switch (itTagInfo->second.typeTarget) { + case GIT_OBJECT_TAG: + { + // if target is another tag, add it to newUnreachables + OdbObjectsData::iterTagInfo itTargetTagInfo = m_odbObjectsData.tags.info.find(oidTarget); + if (itTargetTagInfo != m_odbObjectsData.tags.info.end()) { + if (--itTargetTagInfo->second.reachability == OdbObjectsData::kUnreachable) { + newUnreachables.emplace(itTargetTagInfo->first); + } + } + } + break; + case GIT_OBJECT_COMMIT: + { + OdbObjectsData::iterCommitInfo itCommitInfo = m_odbObjectsData.commits.info.find(oidTarget); + if (itCommitInfo != m_odbObjectsData.commits.info.end()) { + if (--itCommitInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.commits.unreachables.emplace(itCommitInfo->first); + } + } + } + break; + case GIT_OBJECT_TREE: + { + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.find(oidTarget); + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + if (--itTreeInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.trees.unreachables.emplace(itTreeInfo->first); + } + } + } + break; + case GIT_OBJECT_BLOB: + { + OdbObjectsData::iterBlobInfo itBlobInfo = m_odbObjectsData.blobs.info.find(oidTarget); + if (itBlobInfo != m_odbObjectsData.blobs.info.end()) { + if (--itBlobInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.blobs.unreachables.emplace(itBlobInfo->first); + } + } + } + break; + default: + break; + } + // erase tag from the tag's container + m_odbObjectsData.tags.info.erase(itTagInfo); + } + } + // set new unreachable tags + m_odbObjectsData.tags.unreachables = std::move(newUnreachables); + } +} + +/** + * RepoAnalysis::pruneUnreachableCommits + * Prune commits and decrease reachability of their associated trees. + */ +void RepoAnalysis::pruneUnreachableCommits() +{ + while (!m_odbObjectsData.commits.unreachables.empty()) { + std::unordered_set newUnreachables {}; + + // erase unreachable commits + for (OdbObjectsData::iterUnreachable itCommitUnrch = m_odbObjectsData.commits.unreachables.begin(); + itCommitUnrch != m_odbObjectsData.commits.unreachables.end(); ++itCommitUnrch) + { + OdbObjectsData::iterCommitInfo itCommitInfo = m_odbObjectsData.commits.info.find(*itCommitUnrch); + + if (itCommitInfo != m_odbObjectsData.commits.info.end()) + { + // decrease commit's parents reachability and add them as newUnreachable + size_t numParents = itCommitInfo->second.parents.size(); + for (size_t i = 0; i < numParents; ++i) { + OdbObjectsData::iterCommitInfo itParentCommitInfo = + m_odbObjectsData.commits.info.find(itCommitInfo->second.parents.at(i)); + + if (itParentCommitInfo != m_odbObjectsData.commits.info.end()) { + if (--itParentCommitInfo->second.reachability == OdbObjectsData::kUnreachable) { + newUnreachables.emplace(itParentCommitInfo->first); + } + } + } + // decrease reachability of the commit's tree + OdbObjectsData::iterTreeInfo itTreeInfo = + m_odbObjectsData.trees.info.find(itCommitInfo->second.oidTree); + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + if (--itTreeInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.trees.unreachables.emplace(itTreeInfo->first); + } + } + // erase commit from the commit's container + m_odbObjectsData.commits.info.erase(itCommitInfo); + } + } + // set new unreachable commits + m_odbObjectsData.commits.unreachables = std::move(newUnreachables); + } +} + +/** + * RepoAnalysis::pruneUnreachableTrees + * Prune unreachable trees and decrement reachability of their entries. + */ +void RepoAnalysis::pruneUnreachableTrees() +{ + while (!m_odbObjectsData.trees.unreachables.empty()) { + std::unordered_set newUnreachables {}; + + // erase unreachable trees + for (OdbObjectsData::iterUnreachable itTreeUnrch = m_odbObjectsData.trees.unreachables.begin(); + itTreeUnrch != m_odbObjectsData.trees.unreachables.end(); ++itTreeUnrch) + { + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.find(*itTreeUnrch); + + if (itTreeInfo != m_odbObjectsData.trees.info.end()) { + // decrease reachability of the entry blobs + for (auto &blob : itTreeInfo->second.entryBlobs) { + OdbObjectsData::iterBlobInfo itEntryBlobInfo = m_odbObjectsData.blobs.info.find(blob); + if (itEntryBlobInfo != m_odbObjectsData.blobs.info.end()) { + if (--itEntryBlobInfo->second.reachability == OdbObjectsData::kUnreachable) { + m_odbObjectsData.blobs.unreachables.emplace(blob); + } + } + } + // decrease reachability of the entry trees and add them as newUnreachables + for (auto &treeNameLen : itTreeInfo->second.entryTreesNameLen) { + OdbObjectsData::iterTreeInfo itEntryTreeInfo = + m_odbObjectsData.trees.info.find(treeNameLen.first); + if (itEntryTreeInfo != m_odbObjectsData.trees.info.end()) { + if (--itEntryTreeInfo->second.reachability == OdbObjectsData::kUnreachable) { + newUnreachables.emplace(treeNameLen.first); + } + } + } + // erase tree from the tree's container + m_odbObjectsData.trees.info.erase(itTreeInfo); + } + } + // set new unreachable trees + m_odbObjectsData.trees.unreachables = std::move(newUnreachables); + } +} + +/** + * RepoAnalysis::pruneUnreachableBlobs + * Rremoves unreachable blobs from their container. + */ +void RepoAnalysis::pruneUnreachableBlobs() +{ + for (OdbObjectsData::iterUnreachable itBlobUnrch = m_odbObjectsData.blobs.unreachables.begin(); + itBlobUnrch != m_odbObjectsData.blobs.unreachables.end(); ++itBlobUnrch) + { + m_odbObjectsData.blobs.info.erase(*itBlobUnrch); + } +} + +/** + * RepoAnalysis::statsCountAndMax + * Statistics for repositorySize (count objects) and biggestObjects (get maximum of them). + * Also builds the commits graph. + * NOTE: better results achieved not leveraging threads. + */ +void RepoAnalysis::statsCountAndMax() +{ + // commits + for (auto &info : m_odbObjectsData.commits.info) { + OdbObjectsData::CommitInfo &commitInfo = info.second; + size_t size = commitInfo.size; + size_t numParents = commitInfo.parents.size(); + + m_odbObjectsData.commits.totalSize += size; + m_odbObjectsData.commits.maxSize = std::max(m_odbObjectsData.commits.maxSize, size); + m_odbObjectsData.commits.maxParents = std::max(m_odbObjectsData.commits.maxParents, numParents); + + // build commit's graph + m_odbObjectsData.commits.graph.AddNode(info.first, + commitInfo.parents, static_cast(numParents)); + } + // trees + for (auto &info : m_odbObjectsData.trees.info) { + OdbObjectsData::TreeInfoAndStats &treeInfo = info.second; + size_t size = treeInfo.size; + size_t numEntries = treeInfo.numEntries; + + m_odbObjectsData.trees.totalSize += size; + m_odbObjectsData.trees.totalEntries += numEntries; + m_odbObjectsData.trees.maxEntries = std::max(m_odbObjectsData.trees.maxEntries, numEntries); + } + // blobs + for (auto &info : m_odbObjectsData.blobs.info) { + OdbObjectsData::BlobInfo &blobInfo = info.second; + size_t size = blobInfo.size; + + m_odbObjectsData.blobs.totalSize += size; + m_odbObjectsData.blobs.maxSize = std::max(m_odbObjectsData.blobs.maxSize, size); + } + // no need to process tags here (we already have the count) +} + +/** + * RepoAnalysis::statsHistoryAndBiggestCheckouts + * Statistics for historyStructure and biggestCheckouts. + * \return true if success; false if something went wrong. + */ +bool RepoAnalysis::statsHistoryAndBiggestCheckouts() +{ + if (!calculateBiggestCheckouts()) { + return false; + } + + if (!calculateMaxTagDepth()) { + return false; + } + + // calculate max commit history depth + m_statistics.historyStructure.maxDepth = m_odbObjectsData.commits.graph.CalculateMaxDepth(); + + return true; +} + +/** + * RepoAnalysis::calculateBiggestCheckouts + * + * Once threads have collected data from objects, biggest checkouts can be calculated. + * Threads have already collected partial non-recursive tree statistics. + * \return true if success; false if something went wrong. + */ +bool RepoAnalysis::calculateBiggestCheckouts() +{ + for (auto &commitInfo : m_odbObjectsData.commits.info) + { + // calculate this commit's data + const std::string &commitOidTree = commitInfo.second.oidTree; + + OdbObjectsData::iterTreeInfo itTreeInfo {}; + if ((itTreeInfo = calculateTreeStatistics(commitOidTree)) == m_odbObjectsData.trees.info.end()) { + return false; + } + + // update biggestCheckouts data + OdbObjectsData::TreeInfoAndStats &treeInfoAndStats = itTreeInfo->second; + m_statistics.biggestCheckouts.numDirectories = std::max( + m_statistics.biggestCheckouts.numDirectories, treeInfoAndStats.stats.numDirectories); + m_statistics.biggestCheckouts.totalFileSize = std::max( + m_statistics.biggestCheckouts.totalFileSize, treeInfoAndStats.stats.totalFileSize); + m_statistics.biggestCheckouts.maxPathDepth = std::max( + m_statistics.biggestCheckouts.maxPathDepth, treeInfoAndStats.stats.maxPathDepth); + m_statistics.biggestCheckouts.numFiles = std::max( + m_statistics.biggestCheckouts.numFiles, treeInfoAndStats.stats.numFiles); + m_statistics.biggestCheckouts.maxPathLength = std::max( + m_statistics.biggestCheckouts.maxPathLength, treeInfoAndStats.stats.maxPathLength); + m_statistics.biggestCheckouts.numSymlinks = std::max( + m_statistics.biggestCheckouts.numSymlinks, treeInfoAndStats.stats.numSymlinks); + m_statistics.biggestCheckouts.numSubmodules = std::max( + m_statistics.biggestCheckouts.numSubmodules, treeInfoAndStats.stats.numSubmodules); + } + + return true; +} + +/** + * RepoAnalysis::calculateTreeStatistics + * + * Calculates tree statistics recursively, considering individual tree's statistics + * have already been calculated. + * Returns an iterator to the tree info container, or to end if something went wrong. + */ +OdbObjectsData::iterTreeInfo RepoAnalysis::calculateTreeStatistics(const std::string &oidTree) +{ + OdbObjectsData::iterTreeInfo itTreeInfo = m_odbObjectsData.trees.info.find(oidTree); + if (itTreeInfo == m_odbObjectsData.trees.info.end()) { + return itTreeInfo; + } + + OdbObjectsData::TreeInfoAndStats &treeInfoAndStats = itTreeInfo->second; + + // prune recursivity + if (treeInfoAndStats.statsDone) { + return itTreeInfo; + } + + ++treeInfoAndStats.stats.numDirectories; + ++treeInfoAndStats.stats.maxPathDepth; + // the following partial statistics have also been calculated in previous stage with threads: + // - treeInfoAndStats.stats.numFiles + // - treeInfoAndStats.stats.maxPathLength + // - treeInfoAndStats.stats.numSymLinks + // - treeInfoAndStats.stats.numSubmodules + + // totalFileSize + OdbObjectsData::iterBlobInfo itBlobInfo {}; + for (auto &oidBlob : treeInfoAndStats.entryBlobs) + { + if ((itBlobInfo = m_odbObjectsData.blobs.info.find(oidBlob)) == m_odbObjectsData.blobs.info.end()) { + return m_odbObjectsData.trees.info.end(); // to let the caller know that something went wrong + } + + treeInfoAndStats.stats.totalFileSize += itBlobInfo->second.size; + } + + // recursively into subtrees + for (const auto &subTreeNameLen : treeInfoAndStats.entryTreesNameLen) + { + OdbObjectsData::iterTreeInfo itSubTreeInfo {}; + if ((itSubTreeInfo = calculateTreeStatistics(subTreeNameLen.first)) == + m_odbObjectsData.trees.info.end()) { + return itSubTreeInfo; + } + + OdbObjectsData::TreeInfoAndStats &subTreeInfoAndStats = itSubTreeInfo->second; + treeInfoAndStats.stats.numDirectories += subTreeInfoAndStats.stats.numDirectories; + treeInfoAndStats.stats.maxPathDepth = std::max(treeInfoAndStats.stats.maxPathDepth, + subTreeInfoAndStats.stats.maxPathDepth + 1); + treeInfoAndStats.stats.maxPathLength = std::max(treeInfoAndStats.stats.maxPathLength, + subTreeNameLen.second + 1 + subTreeInfoAndStats.stats.maxPathLength); + treeInfoAndStats.stats.numFiles += subTreeInfoAndStats.stats.numFiles; + treeInfoAndStats.stats.totalFileSize += subTreeInfoAndStats.stats.totalFileSize; + treeInfoAndStats.stats.numSymlinks += subTreeInfoAndStats.stats.numSymlinks; + treeInfoAndStats.stats.numSubmodules += subTreeInfoAndStats.stats.numSubmodules; + } + + treeInfoAndStats.statsDone = true; + + return itTreeInfo; +} + +/** + * RepoAnalysis::calculateMaxTagDepth + * \return true if success; false if something went wrong. + */ +bool RepoAnalysis::calculateMaxTagDepth() +{ + for (auto &tag : m_odbObjectsData.tags.info) + { + OdbObjectsData::iterTagInfo itTagInfo {}; + if ((itTagInfo = calculateTagDepth(tag.first)) == m_odbObjectsData.tags.info.end()) { + return false; + } + + // update maxTagDepth + OdbObjectsData::TagInfo &tagInfo = itTagInfo->second; + m_statistics.historyStructure.maxTagDepth = std::max(m_statistics.historyStructure.maxTagDepth, + tagInfo.depth); + } + + return true; +} + +/** + * RepoAnalysis::calculateTagDepth + * + * Calculates recursively the tag depth of the oidTag passed as a parameter. + * Returns an iterator to the tag info container, or to end if something went wrong. + */ +OdbObjectsData::iterTagInfo RepoAnalysis::calculateTagDepth(const std::string &oidTag) +{ + OdbObjectsData::iterTagInfo itTagInfo = m_odbObjectsData.tags.info.find(oidTag); + if (itTagInfo == m_odbObjectsData.tags.info.end()) { + return itTagInfo; + } + + OdbObjectsData::TagInfo &tagInfo = itTagInfo->second; + + // prune recursivity + if (tagInfo.depth != OdbObjectsData::TagInfo::kUnsetDepth) { + return itTagInfo; + } + + ++tagInfo.depth; + + if (tagInfo.typeTarget == GIT_OBJECT_TAG) + { + OdbObjectsData::iterTagInfo itChainedTagInfo {}; + if ((itChainedTagInfo = calculateTagDepth(tagInfo.oidTarget)) == m_odbObjectsData.tags.info.end()) { + return itChainedTagInfo; + } + + OdbObjectsData::TagInfo &chainedTagInfo = itChainedTagInfo->second; + tagInfo.depth += chainedTagInfo.depth; + } + + return itTagInfo; +} + +/** + * RepoAnalysis::fillOutStatistics + */ +void RepoAnalysis::fillOutStatistics() +{ + m_statistics.repositorySize.commits.count = m_odbObjectsData.commits.info.size(); + m_statistics.repositorySize.commits.size = m_odbObjectsData.commits.totalSize; + m_statistics.repositorySize.trees.count = m_odbObjectsData.trees.info.size(); + m_statistics.repositorySize.trees.size = m_odbObjectsData.trees.totalSize; + m_statistics.repositorySize.trees.entries = m_odbObjectsData.trees.totalEntries; + m_statistics.repositorySize.blobs.count = m_odbObjectsData.blobs.info.size(); + m_statistics.repositorySize.blobs.size = m_odbObjectsData.blobs.totalSize; + m_statistics.repositorySize.annotatedTags.count = m_odbObjectsData.tags.info.size(); + + m_statistics.biggestObjects.commits.maxSize = m_odbObjectsData.commits.maxSize; + m_statistics.biggestObjects.commits.maxParents = m_odbObjectsData.commits.maxParents; + m_statistics.biggestObjects.trees.maxEntries = m_odbObjectsData.trees.maxEntries; + m_statistics.biggestObjects.blobs.maxSize = m_odbObjectsData.blobs.maxSize; + + // m_statistics.biggestCheckouts have already been filled out while running +} + +/** + * RepoAnalysis::repositorySizeToJS + */ +v8::Local RepoAnalysis::repositorySizeToJS() const +{ + v8::Local commits = Nan::New(); + Nan::Set(commits, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.commits.count)); + Nan::Set(commits, Nan::New("size").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.commits.size)); + + v8::Local trees = Nan::New(); + Nan::Set(trees, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.trees.count)); + Nan::Set(trees, Nan::New("size").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.trees.size)); + Nan::Set(trees, Nan::New("entries").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.trees.entries)); + + v8::Local blobs = Nan::New(); + Nan::Set(blobs, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.blobs.count)); + Nan::Set(blobs, Nan::New("size").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.blobs.size)); + + v8::Local annotatedTags = Nan::New(); + Nan::Set(annotatedTags, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.annotatedTags.count)); + + v8::Local references = Nan::New(); + Nan::Set(references, Nan::New("count").ToLocalChecked(), + Nan::New(m_statistics.repositorySize.references.count)); + + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("commits").ToLocalChecked(), commits); + Nan::Set(result, Nan::New("trees").ToLocalChecked(), trees); + Nan::Set(result, Nan::New("blobs").ToLocalChecked(), blobs); + Nan::Set(result, Nan::New("annotatedTags").ToLocalChecked(), annotatedTags); + Nan::Set(result, Nan::New("references").ToLocalChecked(), references); + + return result; +} + +/** + * RepoAnalysis::biggestObjectsToJS + */ +v8::Local RepoAnalysis::biggestObjectsToJS() const +{ + v8::Local commits = Nan::New(); + Nan::Set(commits, Nan::New("maxSize").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.commits.maxSize)); + Nan::Set(commits, Nan::New("maxParents").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.commits.maxParents)); + + v8::Local trees = Nan::New(); + Nan::Set(trees, Nan::New("maxEntries").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.trees.maxEntries)); + + v8::Local blobs = Nan::New(); + Nan::Set(blobs, Nan::New("maxSize").ToLocalChecked(), + Nan::New(m_statistics.biggestObjects.blobs.maxSize)); + + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("commits").ToLocalChecked(), commits); + Nan::Set(result, Nan::New("trees").ToLocalChecked(), trees); + Nan::Set(result, Nan::New("blobs").ToLocalChecked(), blobs); + + return result; +} + +/** + * RepoAnalysis::historyStructureToJS + */ +v8::Local RepoAnalysis::historyStructureToJS() const +{ + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("maxDepth").ToLocalChecked(), + Nan::New(m_statistics.historyStructure.maxDepth)); + Nan::Set(result, Nan::New("maxTagDepth").ToLocalChecked(), + Nan::New(m_statistics.historyStructure.maxTagDepth)); + + return result; +} + +/** + * RepoAnalysis::biggestCheckoutsToJS + */ +v8::Local RepoAnalysis::biggestCheckoutsToJS() const +{ + v8::Local result = Nan::New(); + Nan::Set(result, Nan::New("numDirectories").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numDirectories)); + Nan::Set(result, Nan::New("maxPathDepth").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.maxPathDepth)); + Nan::Set(result, Nan::New("maxPathLength").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.maxPathLength)); + Nan::Set(result, Nan::New("numFiles").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numFiles)); + Nan::Set(result, Nan::New("totalFileSize").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.totalFileSize)); + Nan::Set(result, Nan::New("numSymlinks").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numSymlinks)); + Nan::Set(result, Nan::New("numSubmodules").ToLocalChecked(), + Nan::New(m_statistics.biggestCheckouts.numSubmodules)); + + return result; +} + +NAN_METHOD(GitRepository::Statistics) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + StatisticsBaton* baton = new StatisticsBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->repo = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->out = static_cast(new RepoAnalysis(baton->repo)); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + StatisticsWorker *worker = new StatisticsWorker(baton, callback, cleanupHandles); + worker->Reference("repo", info.This()); + nodegit::Context *nodegitContext = + reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + return; +} + +nodegit::LockMaster GitRepository::StatisticsWorker::AcquireLocks() +{ + nodegit::LockMaster lockMaster(true, baton->repo); + + return lockMaster; +} + +void GitRepository::StatisticsWorker::Execute() +{ + git_error_clear(); + + RepoAnalysis *repoAnalysis = static_cast(baton->out); + if ((baton->error_code = repoAnalysis->Analyze()) != GIT_OK) + { + if (git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); + } + + delete repoAnalysis; + baton->out = nullptr; + } +} + +void GitRepository::StatisticsWorker::HandleErrorCallback() +{ + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + RepoAnalysis *repoAnalysis = static_cast(baton->out); + if (repoAnalysis) { + delete repoAnalysis; + } + + delete baton; +} + +void GitRepository::StatisticsWorker::HandleOKCallback() +{ + if (baton->out != NULL) + { + RepoAnalysis *repoAnalysis = static_cast(baton->out); + Local result = repoAnalysis->StatisticsToJS(); + + delete repoAnalysis; + + Local argv[2] = { + Nan::Null(), + result + }; + callback->Call(2, argv, async_resource); + } + else if (baton->error) + { + Local err; + + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method statistics has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("GitRepository.statistics").ToLocalChecked()); + Local argv[1] = { + err + }; + + callback->Call(1, argv, async_resource); + + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + Local err = Nan::To(Nan::Error("Method statistics has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("GitRepository.statistics").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + else + { + callback->Call(0, NULL, async_resource); + } + + delete baton; +} \ No newline at end of file diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index 2b8797159..d74bd0ca2 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -3,6 +3,9 @@ #include #include #include +#include +#include +#include #include #include "async_baton.h" @@ -13,6 +16,7 @@ #include "nodegit_wrapper.h" #include "promise_completion.h" #include "reference_counter.h" +#include "worker_pool.h" extern "C" { #include diff --git a/test/tests/repository.js b/test/tests/repository.js index 3d260ea80..1f2eb4913 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -350,4 +350,38 @@ describe("Repository", function() { assert.equal(numMergeHeads, 1); }); }); + + it("can obtain statistics from a valid repository", function() { + return this.repository.statistics() + .then(function(analysisReport) { + + assert.equal(analysisReport.repositorySize.commits.count, 992); + assert.equal(analysisReport.repositorySize.commits.size, 265544); + assert.equal(analysisReport.repositorySize.trees.count, 2416); + assert.equal(analysisReport.repositorySize.trees.size, 1188325); + assert.equal(analysisReport.repositorySize.trees.entries, 32571); + assert.equal(analysisReport.repositorySize.blobs.count, 4149); + assert.equal(analysisReport.repositorySize.blobs.size, 48489622); + assert.equal(analysisReport.repositorySize.annotatedTags.count, 1); + assert.equal(analysisReport.repositorySize.references.count, 10); + + assert.equal(analysisReport.biggestObjects.commits.maxSize, 956); + assert.equal(analysisReport.biggestObjects.commits.maxParents, 2); + assert.equal(analysisReport.biggestObjects.trees.maxEntries, 93); + assert.equal(analysisReport.biggestObjects.blobs.maxSize, 1077756); + + assert.equal(analysisReport.historyStructure.maxDepth, 931); + assert.equal(analysisReport.historyStructure.maxTagDepth, 1); + + assert.equal(analysisReport.biggestCheckouts.numDirectories, 128); + assert.equal(analysisReport.biggestCheckouts.maxPathDepth, 10); + assert.equal(analysisReport.biggestCheckouts.maxPathLength, 107); + assert.equal(analysisReport.biggestCheckouts.numFiles, 514); + assert.equal(analysisReport.biggestCheckouts.totalFileSize, 5160886); + assert.equal(analysisReport.biggestCheckouts.numSymlinks, 2); + assert.equal(analysisReport.biggestCheckouts.numSubmodules, 4); + + // console.log(JSON.stringify(analysisReport,null,2)); + }); + }); }); From 427bb83ce8da6231cc81c804aa6d787f305ce6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Thu, 10 Jun 2021 12:22:25 +0200 Subject: [PATCH 338/545] Fix test leveraging constant repo New clone of 'workdir' repo to be tested by 'statistics()' --- test/runner.js | 4 ++++ test/tests/repository.js | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/test/runner.js b/test/runner.js index d81a6578f..96629f4a5 100644 --- a/test/runner.js +++ b/test/runner.js @@ -6,6 +6,7 @@ var exec = require('../utils/execPromise'); var NodeGit = require('..'); var workdirPath = local("repos/workdir"); +var constWorkdirPath = local("repos/constworkdir"); before(function() { this.timeout(350000); @@ -21,6 +22,9 @@ before(function() { .then(function() { return exec("git init " + local("repos", "empty")); }) + .then(function() { + return exec("git clone " + url + " " + constWorkdirPath); + }) .then(function() { return exec("git clone " + url + " " + workdirPath); }) diff --git a/test/tests/repository.js b/test/tests/repository.js index 1f2eb4913..29f207509 100644 --- a/test/tests/repository.js +++ b/test/tests/repository.js @@ -11,6 +11,7 @@ describe("Repository", function() { var Index = NodeGit.Index; var Signature = NodeGit.Signature; + var constReposPath = local("../repos/constworkdir"); var reposPath = local("../repos/workdir"); var newRepoPath = local("../repos/newrepo"); var emptyRepoPath = local("../repos/empty"); @@ -18,7 +19,13 @@ describe("Repository", function() { beforeEach(function() { var test = this; - return Repository.open(reposPath) + return Repository.open(constReposPath) + .then(function(constRepository) { + test.constRepository = constRepository; + }) + .then(function() { + return Repository.open(reposPath); + }) .then(function(repository) { test.repository = repository; }) @@ -351,8 +358,8 @@ describe("Repository", function() { }); }); - it("can obtain statistics from a valid repository", function() { - return this.repository.statistics() + it("can obtain statistics from a valid constant repository", function() { + return this.constRepository.statistics() .then(function(analysisReport) { assert.equal(analysisReport.repositorySize.commits.count, 992); @@ -363,7 +370,7 @@ describe("Repository", function() { assert.equal(analysisReport.repositorySize.blobs.count, 4149); assert.equal(analysisReport.repositorySize.blobs.size, 48489622); assert.equal(analysisReport.repositorySize.annotatedTags.count, 1); - assert.equal(analysisReport.repositorySize.references.count, 10); + assert.equal(analysisReport.repositorySize.references.count, 8); assert.equal(analysisReport.biggestObjects.commits.maxSize, 956); assert.equal(analysisReport.biggestObjects.commits.maxParents, 2); From 2a473298dba79a7516948348d2fa491470b7f3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Tue, 22 Jun 2021 10:02:16 +0200 Subject: [PATCH 339/545] Add workerPool status - WorkerPool status added for three different failures: when a worker calls Initialize(), when a worker calls Execute() and when the workerPool is shutdown and user calls InsertWork(). - Init() doesn't wait for the threads to finish initializing so that the main thread can continue running. - Methods in the workerPool provided to check status and what failed. --- .../templates/manual/include/worker_pool.h | 65 ++++++---- .../templates/manual/repository/statistics.cc | 112 +++++++++--------- 2 files changed, 100 insertions(+), 77 deletions(-) diff --git a/generate/templates/manual/include/worker_pool.h b/generate/templates/manual/include/worker_pool.h index ed40bbce7..48c4cbd04 100644 --- a/generate/templates/manual/include/worker_pool.h +++ b/generate/templates/manual/include/worker_pool.h @@ -58,9 +58,13 @@ class WorkerPool { WorkerPool& operator=(const WorkerPool &other) = delete; WorkerPool& operator=(WorkerPool &&other) = delete; - bool Init(std::vector< std::shared_ptr > workers); - bool InsertWork(std::unique_ptr &&work); + void Init(std::vector< std::shared_ptr > workers); + void InsertWork(std::unique_ptr &&work); void Shutdown(); + bool Status() { return m_status.workersInitialize && m_status.workersExecute && !m_status.shutdownEarly; } + bool StatusWorkersInitialize() { return m_status.workersInitialize; } + bool StatusWorkersExecute() { return m_status.workersExecute; } + bool StatusShutdownEarly() { return !m_status.shutdownEarly; } private: void DoWork(std::shared_ptr worker); @@ -69,7 +73,13 @@ class WorkerPool { std::condition_variable m_workQueueCondition {}; std::queue< std::unique_ptr > m_workQueue {}; std::vector> m_threads {}; - bool m_stop {true}; // initially the workpool has no worker threads + bool m_stop {true}; // initially the workpool has no worker threads + struct { + bool workersInitialize {true}; + bool workersExecute {true}; + bool shutdownEarly {false}; // for instance if the workerPool was ShutDown, and InsertWork called after that + } m_status; + std::mutex m_statusMutex {}; }; @@ -78,37 +88,37 @@ WorkerPool::WorkerPool() { static_assert(std::is_base_of::value, "Worker must inherit from IWorker"); } -// returns true it it wasn't initialized previously; false otherwise +// launches the worker threads, if they hadn't been launched already template -bool WorkerPool::Init(std::vector< std::shared_ptr > workers) +void WorkerPool::Init(std::vector< std::shared_ptr > workers) { { std::lock_guard lock(m_workQueueMutex); if (!m_stop) - return false; + return; m_stop = false; } std::for_each (workers.begin(), workers.end(), [this](std::shared_ptr worker) { m_threads.emplace_back(std::make_unique(std::bind(&WorkerPool::DoWork, this, worker))); }); - - return true; } -// returns true if successfully inserted work; false otherwise +// queues work, or updates shutdownEarly status template -bool WorkerPool::InsertWork(std::unique_ptr &&work) +void WorkerPool::InsertWork(std::unique_ptr &&work) { { std::lock_guard lock(m_workQueueMutex); - if (m_stop) - return false; + if (m_stop) { + // update shutdownEarly status and return + std::lock_guard lock(m_statusMutex); + m_status.shutdownEarly = true; + return; + } m_workQueue.emplace(std::move(work)); } m_workQueueCondition.notify_one(); - - return true; } template @@ -132,10 +142,13 @@ void WorkerPool::Shutdown() template void WorkerPool::DoWork(std::shared_ptr worker) { - if (!worker->Initialize()) { - return; // signal main that we've exited early + if (!worker->Initialize()) + { // update initialized status and stop worker + std::lock_guard lock(m_statusMutex); + m_status.workersInitialize = false; + return; } - + while (true) { std::unique_ptr work {}; { @@ -143,16 +156,26 @@ void WorkerPool::DoWork(std::shared_ptr worker) m_workQueueCondition.wait(lock, [this] { return this->m_stop || !this->m_workQueue.empty(); }); - - if (m_stop && m_workQueue.empty()) + + // stop all workers if any of them failed on Initialize() or Execute() + // or the workerPool shutdown early + if (!Status()) { return; + } + + if (m_stop && m_workQueue.empty()) { + return; + } work = std::move(m_workQueue.front()); m_workQueue.pop(); } - if (!worker->Execute(std::move(work))) { - return; // signal main that we've exited early + if (!worker->Execute(std::move(work))) + { // update execute status + std::lock_guard lock(m_statusMutex); + m_status.workersExecute = false; + return; } } } diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index 175d0f05e..b4ea3a0b2 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -30,7 +30,7 @@ class CommitsGraph using CommitsGraphMap = std::unordered_map>; - void AddNode(const std::string &oidStr, const std::vector &parents, uint32_t numParents); + void AddNode(const std::string &oidStr, const std::vector &parents); uint32_t CalculateMaxDepth(); private: @@ -45,11 +45,11 @@ class CommitsGraph * * \param oidStr oid of the commit object to add. * \param parents oids of the commit's parents. - * \param numParents Number of parents of the commit object. */ -void CommitsGraph::AddNode(const std::string &oidStr, const std::vector &parents, - uint32_t numParents) +void CommitsGraph::AddNode(const std::string &oidStr, const std::vector &parents) { + uint32_t numParents = static_cast(parents.size()); + auto emplacePair = m_mapOidNode.emplace(std::make_pair( oidStr, std::make_unique(numParents))); @@ -380,19 +380,9 @@ bool WorkerStoreOdbData::Initialize() { return true; } - if (m_repoPath.empty()) { - return false; - } - else { - if (git_repository_open(&m_repo, m_repoPath.c_str()) != GIT_OK) { - return false; - } - - if (git_repository_odb(&m_odb, m_repo) != GIT_OK) { - return false; - } - } - return true; + return !m_repoPath.empty() && + git_repository_open(&m_repo, m_repoPath.c_str()) == GIT_OK && + git_repository_odb(&m_odb, m_repo) == GIT_OK; } /** @@ -836,7 +826,10 @@ static int forEachOdbCb(const git_oid *oid, void *payloadToCast) static_cast*>(payloadToCast); // Must insert copies of oid, since the pointers might not survive until worker thread picks it up - if (!workerPool->InsertWork(std::make_unique(*oid))) { + workerPool->InsertWork(std::make_unique(*oid)); + + // check there were no problems inserting work + if (!workerPool->Status()) { return GIT_EUSER; } @@ -869,7 +862,7 @@ class RepoAnalysis int storeAndCountRefs(); // stage 2 methods: count reachability of each object (with threads) // NOTE: we need this stage, since so far libgit2 doesn't provide unreachable objects - void setObjectsReachability(); + bool setObjectsReachability(); void setReachabilityFromRefs(); void setUnreachables(); // stage 3 methods: prune unreachable oids @@ -912,7 +905,9 @@ int RepoAnalysis::Analyze() return errorCode; } - setObjectsReachability(); + if (!setObjectsReachability()) { + return GIT_EUSER; + } pruneUnreachables(); statsCountAndMax(); @@ -978,6 +973,7 @@ int RepoAnalysis::storeObjectsInfo() workerPool.Init(workers); if ((errorCode = git_odb_foreach(odb, forEachOdbCb, &workerPool)) != GIT_OK) { + workerPool.Shutdown(); git_odb_free(odb); return errorCode; } @@ -990,6 +986,12 @@ int RepoAnalysis::storeObjectsInfo() // wait for the threads to finish and shutdown the work pool workerPool.Shutdown(); + // check there were no problems during execution + if (!workerPool.Status()) { + git_odb_free(odb); + return GIT_EUSER; + } + git_odb_free(odb); return errorCode; @@ -1077,8 +1079,9 @@ int RepoAnalysis::storeAndCountRefs() * RepoAnalysis::setObjectsReachability * Leverages threads to set reachability from tags, commits, and trees. * NOTE: performance didn't improve leveraging threads for adding objects to unreachables container. + * \return false if the workerPool finished with errors; true otherwise */ -void RepoAnalysis::setObjectsReachability() +bool RepoAnalysis::setObjectsReachability() { // references are not objects, hence they won't be sent to the worker threads setReachabilityFromRefs(); @@ -1103,28 +1106,19 @@ void RepoAnalysis::setObjectsReachability() workInserted = 0; // insert tag if (itTagInfo != m_odbObjectsData.tags.info.end()) { - if (!workerPool.InsertWork( - std::make_unique(&itTagInfo->second, GIT_OBJECT_TAG))) { - return; - } + workerPool.InsertWork(std::make_unique(&itTagInfo->second, GIT_OBJECT_TAG)); ++itTagInfo; ++workInserted; } // insert commmit if (itCommitInfo != m_odbObjectsData.commits.info.end()) { - if (!workerPool.InsertWork( - std::make_unique(&itCommitInfo->second, GIT_OBJECT_COMMIT))) { - return; - } + workerPool.InsertWork(std::make_unique(&itCommitInfo->second, GIT_OBJECT_COMMIT)); ++itCommitInfo; ++workInserted; } // insert tree if (itTreeInfo != m_odbObjectsData.trees.info.end()) { - if (!workerPool.InsertWork( - std::make_unique(&itTreeInfo->second, GIT_OBJECT_TREE))) { - return; - } + workerPool.InsertWork(std::make_unique(&itTreeInfo->second, GIT_OBJECT_TREE)); ++itTreeInfo; ++workInserted; } @@ -1134,7 +1128,14 @@ void RepoAnalysis::setObjectsReachability() // wait for the threads to finish and shutdown the work pool workerPool.Shutdown(); + // check there were no problems during execution + if (!workerPool.Status()) { + return false; + } + setUnreachables(); + + return true; } /** @@ -1196,28 +1197,28 @@ void RepoAnalysis::setReachabilityFromRefs() * After setting reachability, we add the unreached objects to their unreachables container. */ void RepoAnalysis::setUnreachables() - { - for (const auto &tag : m_odbObjectsData.tags.info) { - if (!tag.second.reachability) { - m_odbObjectsData.tags.unreachables.emplace(tag.first); - } +{ + for (const auto &tag : m_odbObjectsData.tags.info) { + if (!tag.second.reachability) { + m_odbObjectsData.tags.unreachables.emplace(tag.first); } - for (const auto &commit : m_odbObjectsData.commits.info) { - if (!commit.second.reachability) { - m_odbObjectsData.commits.unreachables.emplace(commit.first); - } + } + for (const auto &commit : m_odbObjectsData.commits.info) { + if (!commit.second.reachability) { + m_odbObjectsData.commits.unreachables.emplace(commit.first); } - for (const auto &tree : m_odbObjectsData.trees.info) { - if (!tree.second.reachability) { - m_odbObjectsData.trees.unreachables.emplace(tree.first); - } + } + for (const auto &tree : m_odbObjectsData.trees.info) { + if (!tree.second.reachability) { + m_odbObjectsData.trees.unreachables.emplace(tree.first); } - for (const auto &blob : m_odbObjectsData.blobs.info) { - if (!blob.second.reachability) { - m_odbObjectsData.blobs.unreachables.emplace(blob.first); - } + } + for (const auto &blob : m_odbObjectsData.blobs.info) { + if (!blob.second.reachability) { + m_odbObjectsData.blobs.unreachables.emplace(blob.first); } } +} /** * RepoAnalysis::pruneUnreachables @@ -1422,15 +1423,14 @@ void RepoAnalysis::statsCountAndMax() for (auto &info : m_odbObjectsData.commits.info) { OdbObjectsData::CommitInfo &commitInfo = info.second; size_t size = commitInfo.size; - size_t numParents = commitInfo.parents.size(); m_odbObjectsData.commits.totalSize += size; m_odbObjectsData.commits.maxSize = std::max(m_odbObjectsData.commits.maxSize, size); - m_odbObjectsData.commits.maxParents = std::max(m_odbObjectsData.commits.maxParents, numParents); + m_odbObjectsData.commits.maxParents = std::max( + m_odbObjectsData.commits.maxParents, commitInfo.parents.size()); // build commit's graph - m_odbObjectsData.commits.graph.AddNode(info.first, - commitInfo.parents, static_cast(numParents)); + m_odbObjectsData.commits.graph.AddNode(info.first, commitInfo.parents); } // trees for (auto &info : m_odbObjectsData.trees.info) { @@ -1595,8 +1595,8 @@ bool RepoAnalysis::calculateMaxTagDepth() // update maxTagDepth OdbObjectsData::TagInfo &tagInfo = itTagInfo->second; - m_statistics.historyStructure.maxTagDepth = std::max(m_statistics.historyStructure.maxTagDepth, - tagInfo.depth); + m_statistics.historyStructure.maxTagDepth = std::max( + m_statistics.historyStructure.maxTagDepth, tagInfo.depth); } return true; From b3f0227283b25af74d3543e8ed07b97b0153cdae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Mon, 5 Jul 2021 18:26:25 +0200 Subject: [PATCH 340/545] fix concurrent read of worker pool status Status of worker pool reduced to a single atomic enumeration variable. --- .../templates/manual/include/worker_pool.h | 64 +++++++++---------- .../templates/manual/repository/statistics.cc | 6 +- 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/generate/templates/manual/include/worker_pool.h b/generate/templates/manual/include/worker_pool.h index 48c4cbd04..3380c8706 100644 --- a/generate/templates/manual/include/worker_pool.h +++ b/generate/templates/manual/include/worker_pool.h @@ -9,6 +9,7 @@ #include #include #include +#include /** * \class WorkItem @@ -43,6 +44,14 @@ class IWorker virtual bool Execute(std::unique_ptr &&work) = 0; }; +/* Enumeration describing the Worker Pool Status: +* - kOk: everything ok. +* - kInitializeFailed: a worker thread failed when calling Initialize(). +* - kExecuteFailed: a worker thread failed when calling Execute(). +* - kShutdownEarly: InsertWork() was called but the worker pool was stopped. +*/ +enum class WPStatus {kOk, kInitializeFailed, kExecuteFailed, kShutdownEarly}; + /** * \class WorkerPool * To leverage this class, a Worker must inherit from IWorker. @@ -61,25 +70,17 @@ class WorkerPool { void Init(std::vector< std::shared_ptr > workers); void InsertWork(std::unique_ptr &&work); void Shutdown(); - bool Status() { return m_status.workersInitialize && m_status.workersExecute && !m_status.shutdownEarly; } - bool StatusWorkersInitialize() { return m_status.workersInitialize; } - bool StatusWorkersExecute() { return m_status.workersExecute; } - bool StatusShutdownEarly() { return !m_status.shutdownEarly; } + WPStatus Status() { return m_atomicWPStatus; } private: void DoWork(std::shared_ptr worker); - std::mutex m_workQueueMutex {}; - std::condition_variable m_workQueueCondition {}; + std::mutex m_mutex {}; // locks m_workQueue and m_stop + std::condition_variable m_condition {}; std::queue< std::unique_ptr > m_workQueue {}; - std::vector> m_threads {}; bool m_stop {true}; // initially the workpool has no worker threads - struct { - bool workersInitialize {true}; - bool workersExecute {true}; - bool shutdownEarly {false}; // for instance if the workerPool was ShutDown, and InsertWork called after that - } m_status; - std::mutex m_statusMutex {}; + std::vector> m_threads {}; + std::atomic m_atomicWPStatus {WPStatus::kOk}; }; @@ -93,7 +94,7 @@ template void WorkerPool::Init(std::vector< std::shared_ptr > workers) { { - std::lock_guard lock(m_workQueueMutex); + std::lock_guard lock(m_mutex); if (!m_stop) return; m_stop = false; @@ -104,33 +105,32 @@ void WorkerPool::Init(std::vector< std::shared_ptr > wo }); } -// queues work, or updates shutdownEarly status +// queues work, or sets WPStatus::kShutdownEarly template void WorkerPool::InsertWork(std::unique_ptr &&work) { { - std::lock_guard lock(m_workQueueMutex); + std::lock_guard lock(m_mutex); if (m_stop) { - // update shutdownEarly status and return - std::lock_guard lock(m_statusMutex); - m_status.shutdownEarly = true; + m_atomicWPStatus = WPStatus::kShutdownEarly; return; } m_workQueue.emplace(std::move(work)); } - m_workQueueCondition.notify_one(); + m_condition.notify_one(); } template void WorkerPool::Shutdown() { { - std::lock_guard lock(m_workQueueMutex); - if (m_stop) + std::lock_guard lock(m_mutex); + if (m_stop) { return; + } m_stop = true; } - m_workQueueCondition.notify_all(); + m_condition.notify_all(); std::for_each (m_threads.begin(), m_threads.end(), [](std::unique_ptr &wt) { if (wt->joinable()) { @@ -142,24 +142,22 @@ void WorkerPool::Shutdown() template void WorkerPool::DoWork(std::shared_ptr worker) { - if (!worker->Initialize()) - { // update initialized status and stop worker - std::lock_guard lock(m_statusMutex); - m_status.workersInitialize = false; + if (!worker->Initialize()) { + m_atomicWPStatus = WPStatus::kInitializeFailed; return; } while (true) { std::unique_ptr work {}; { - std::unique_lock lock(m_workQueueMutex); - m_workQueueCondition.wait(lock, [this] { + std::unique_lock lock(m_mutex); + m_condition.wait(lock, [this] { return this->m_stop || !this->m_workQueue.empty(); }); // stop all workers if any of them failed on Initialize() or Execute() // or the workerPool shutdown early - if (!Status()) { + if (Status() != WPStatus::kOk) { return; } @@ -171,10 +169,8 @@ void WorkerPool::DoWork(std::shared_ptr worker) m_workQueue.pop(); } - if (!worker->Execute(std::move(work))) - { // update execute status - std::lock_guard lock(m_statusMutex); - m_status.workersExecute = false; + if (!worker->Execute(std::move(work))) { + m_atomicWPStatus = WPStatus::kExecuteFailed; return; } } diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index b4ea3a0b2..8c17c7deb 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -829,7 +829,7 @@ static int forEachOdbCb(const git_oid *oid, void *payloadToCast) workerPool->InsertWork(std::make_unique(*oid)); // check there were no problems inserting work - if (!workerPool->Status()) { + if (workerPool->Status() != WPStatus::kOk) { return GIT_EUSER; } @@ -987,7 +987,7 @@ int RepoAnalysis::storeObjectsInfo() workerPool.Shutdown(); // check there were no problems during execution - if (!workerPool.Status()) { + if (workerPool.Status() != WPStatus::kOk) { git_odb_free(odb); return GIT_EUSER; } @@ -1129,7 +1129,7 @@ bool RepoAnalysis::setObjectsReachability() workerPool.Shutdown(); // check there were no problems during execution - if (!workerPool.Status()) { + if (workerPool.Status() != WPStatus::kOk) { return false; } From 1b07ca0b821bc6c86524605fcdccdbe17edf46e7 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Wed, 3 Nov 2021 14:48:35 +0100 Subject: [PATCH 341/545] Update libssh2 to 1.10.0 --- vendor/libgit2.gyp | 1 + vendor/libssh2/CMakeLists.txt | 8 + vendor/libssh2/COPYING | 4 +- vendor/libssh2/Makefile.am | 8 +- vendor/libssh2/Makefile.in | 44 +- vendor/libssh2/Makefile.inc | 4 +- vendor/libssh2/NEWS | 1862 ++- vendor/libssh2/RELEASE-NOTES | 94 +- vendor/libssh2/acinclude.m4 | 1 + vendor/libssh2/aclocal.m4 | 77 +- vendor/libssh2/buildconf | 22 - vendor/libssh2/compile | 6 +- vendor/libssh2/configure | 13806 +++++++++++----- vendor/libssh2/configure.ac | 28 +- vendor/libssh2/depcomp | 2 +- .../docs/{HACKING.CRYPTO => HACKING-CRYPTO} | 361 +- vendor/libssh2/docs/INSTALL_AUTOTOOLS | 4 +- .../docs/{INSTALL_CMAKE => INSTALL_CMAKE.md} | 16 +- vendor/libssh2/docs/Makefile.am | 4 +- vendor/libssh2/docs/Makefile.in | 21 +- .../docs/libssh2_session_callback_set.3 | 40 +- vendor/libssh2/example/CMakeLists.txt | 1 + vendor/libssh2/example/Makefile.am | 6 +- vendor/libssh2/example/Makefile.in | 91 +- .../libssh2/example/ssh2_agent_forwarding.c | 292 + vendor/libssh2/include/libssh2.h | 31 +- vendor/libssh2/include/libssh2_sftp.h | 52 +- vendor/libssh2/install-sh | 161 +- vendor/libssh2/ltmain.sh | 10 +- vendor/libssh2/m4/libtool.m4 | 10 +- vendor/libssh2/missing | 2 +- vendor/libssh2/src/CMakeLists.txt | 10 +- vendor/libssh2/src/Makefile.in | 42 +- vendor/libssh2/src/agent.c | 123 +- vendor/libssh2/src/agent.h | 112 + vendor/libssh2/src/agent_win.c | 361 + vendor/libssh2/src/bcrypt_pbkdf.c | 6 +- vendor/libssh2/src/blf.h | 7 +- vendor/libssh2/src/channel.c | 159 +- vendor/libssh2/src/comp.c | 3 +- vendor/libssh2/src/comp.h | 1 - vendor/libssh2/src/crypto.h | 12 +- vendor/libssh2/src/global.c | 3 +- vendor/libssh2/src/hostkey.c | 43 +- vendor/libssh2/src/kex.c | 1665 +- vendor/libssh2/src/knownhost.c | 4 +- vendor/libssh2/src/libgcrypt.h | 5 +- vendor/libssh2/src/libssh2_config.h.in | 24 +- vendor/libssh2/src/libssh2_priv.h | 23 +- vendor/libssh2/src/mac.h | 1 - vendor/libssh2/src/mbedtls.c | 522 +- vendor/libssh2/src/mbedtls.h | 153 +- vendor/libssh2/src/misc.c | 30 +- vendor/libssh2/src/openssl.c | 408 +- vendor/libssh2/src/openssl.h | 31 +- vendor/libssh2/src/packet.c | 136 +- vendor/libssh2/src/packet.h | 6 +- vendor/libssh2/src/pem.c | 31 +- vendor/libssh2/src/scp.c | 6 +- vendor/libssh2/src/session.c | 4 +- vendor/libssh2/src/session.h | 6 +- vendor/libssh2/src/sftp.c | 2 +- vendor/libssh2/src/sftp.h | 6 +- vendor/libssh2/src/transport.c | 15 +- vendor/libssh2/src/transport.h | 1 - vendor/libssh2/src/userauth.c | 46 +- vendor/libssh2/src/userauth.h | 6 +- vendor/libssh2/src/wincng.c | 545 +- vendor/libssh2/src/wincng.h | 38 +- vendor/libssh2/test-driver | 10 +- vendor/libssh2/tests/CMakeLists.txt | 5 +- vendor/libssh2/tests/Makefile.am | 83 +- vendor/libssh2/tests/Makefile.in | 288 +- vendor/libssh2/tests/key_ecdsa | 10 + vendor/libssh2/tests/key_ecdsa.pub | 1 + vendor/libssh2/tests/key_ed25519 | 7 + vendor/libssh2/tests/key_ed25519.pub | 1 + vendor/libssh2/tests/key_ed25519_encrypted | 8 + .../libssh2/tests/key_ed25519_encrypted.pub | 1 + vendor/libssh2/tests/key_rsa_encrypted | 30 + vendor/libssh2/tests/key_rsa_encrypted.pub | 1 + vendor/libssh2/tests/key_rsa_openssh | 27 + vendor/libssh2/tests/key_rsa_openssh.pub | 1 + vendor/libssh2/tests/openssh_fixture.c | 187 +- .../libssh2/tests/openssh_server/Dockerfile | 9 + .../tests/openssh_server/authorized_keys | 1 + vendor/libssh2/tests/openssh_server/ca_ecdsa | 12 + .../libssh2/tests/openssh_server/ca_ecdsa.pub | 1 + .../tests/openssh_server/ssh_host_ecdsa_key | 5 + .../tests/openssh_server/ssh_host_ed25519_key | 7 + vendor/libssh2/tests/ossfuzz/Makefile.am | 32 + vendor/libssh2/tests/ossfuzz/Makefile.in | 731 + .../tests/ossfuzz/ssh2_client_fuzzer.cc | 90 + .../libssh2/tests/ossfuzz/standaloneengine.cc | 74 + vendor/libssh2/tests/ossfuzz/testinput.h | 3 + vendor/libssh2/tests/ssh2.c | 14 +- .../tests/test_agent_forward_succeeds.c | 51 + vendor/libssh2/tests/test_hostkey.c | 8 +- vendor/libssh2/tests/test_hostkey_hash.c | 51 +- ...teractive_auth_fails_with_wrong_response.c | 6 +- ...tive_auth_succeeds_with_correct_response.c | 9 +- ..._password_auth_fails_with_wrong_password.c | 2 +- ..._password_auth_fails_with_wrong_username.c | 3 +- ...d_auth_succeeds_with_correct_credentials.c | 5 +- ...est_public_key_auth_fails_with_wrong_key.c | 2 +- ...c_key_auth_succeeds_with_correct_dsa_key.c | 5 +- ...key_auth_succeeds_with_correct_ecdsa_key.c | 38 + ...y_auth_succeeds_with_correct_ed25519_key.c | 38 + ...cceeds_with_correct_ed25519_key_from_mem.c | 98 + ...ceeds_with_correct_encrypted_ed25519_key.c | 39 + ..._succeeds_with_correct_encrypted_rsa_key.c | 5 +- ...c_key_auth_succeeds_with_correct_rsa_key.c | 5 +- ...th_succeeds_with_correct_rsa_openssh_key.c | 5 +- ...h_succeeds_with_correct_signed_ecdsa_key.c | 38 + vendor/libssh2/vms/libssh2_make_help.dcl | 24 +- vendor/libssh2/win32/libssh2.dsp | 8 + 116 files changed, 17114 insertions(+), 6630 deletions(-) delete mode 100755 vendor/libssh2/buildconf rename vendor/libssh2/docs/{HACKING.CRYPTO => HACKING-CRYPTO} (62%) rename vendor/libssh2/docs/{INSTALL_CMAKE => INSTALL_CMAKE.md} (97%) create mode 100644 vendor/libssh2/example/ssh2_agent_forwarding.c create mode 100644 vendor/libssh2/src/agent.h create mode 100644 vendor/libssh2/src/agent_win.c create mode 100644 vendor/libssh2/tests/key_ecdsa create mode 100644 vendor/libssh2/tests/key_ecdsa.pub create mode 100644 vendor/libssh2/tests/key_ed25519 create mode 100644 vendor/libssh2/tests/key_ed25519.pub create mode 100644 vendor/libssh2/tests/key_ed25519_encrypted create mode 100644 vendor/libssh2/tests/key_ed25519_encrypted.pub create mode 100644 vendor/libssh2/tests/key_rsa_encrypted create mode 100644 vendor/libssh2/tests/key_rsa_encrypted.pub create mode 100644 vendor/libssh2/tests/key_rsa_openssh create mode 100644 vendor/libssh2/tests/key_rsa_openssh.pub create mode 100644 vendor/libssh2/tests/openssh_server/ca_ecdsa create mode 100644 vendor/libssh2/tests/openssh_server/ca_ecdsa.pub create mode 100644 vendor/libssh2/tests/openssh_server/ssh_host_ecdsa_key create mode 100644 vendor/libssh2/tests/openssh_server/ssh_host_ed25519_key create mode 100644 vendor/libssh2/tests/ossfuzz/Makefile.am create mode 100644 vendor/libssh2/tests/ossfuzz/Makefile.in create mode 100644 vendor/libssh2/tests/ossfuzz/ssh2_client_fuzzer.cc create mode 100644 vendor/libssh2/tests/ossfuzz/standaloneengine.cc create mode 100644 vendor/libssh2/tests/ossfuzz/testinput.h create mode 100644 vendor/libssh2/tests/test_agent_forward_succeeds.c create mode 100644 vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ecdsa_key.c create mode 100644 vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key.c create mode 100644 vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c create mode 100644 vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c create mode 100644 vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_ecdsa_key.c diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 63de9a254..270e2b39c 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -601,6 +601,7 @@ "libssh2/src/pem.c", "libssh2/src/session.c", "libssh2/src/userauth.c", + "libssh2/src/agent_win.c", ], "include_dirs": [ ".", diff --git a/vendor/libssh2/CMakeLists.txt b/vendor/libssh2/CMakeLists.txt index ae5594289..e6c95c888 100644 --- a/vendor/libssh2/CMakeLists.txt +++ b/vendor/libssh2/CMakeLists.txt @@ -98,6 +98,14 @@ if(BUILD_TESTING) add_subdirectory(tests) endif() +option(LINT "Check style while building" OFF) +if(LINT) + add_custom_target(lint ALL + ./ci/checksrc.sh + WORKING_DIRECTORY ${libssh2_SOURCE_DIR}) + add_dependencies(libssh2 lint) +endif() + add_subdirectory(docs) feature_summary(WHAT ALL) diff --git a/vendor/libssh2/COPYING b/vendor/libssh2/COPYING index f2ca94772..937ed32e3 100644 --- a/vendor/libssh2/COPYING +++ b/vendor/libssh2/COPYING @@ -2,8 +2,10 @@ * Copyright (c) 2005,2006 Mikhail Gusarov * Copyright (c) 2006-2007 The Written Word, Inc. * Copyright (c) 2007 Eli Fant - * Copyright (c) 2009-2014 Daniel Stenberg + * Copyright (c) 2009-2021 Daniel Stenberg * Copyright (C) 2008, 2009 Simon Josefsson + * Copyright (c) 2000 Markus Friedl + * Copyright (c) 2015 Microsoft Corp. * All rights reserved. * * Redistribution and use in source and binary forms, diff --git a/vendor/libssh2/Makefile.am b/vendor/libssh2/Makefile.am index 6411e8a04..986441bd6 100644 --- a/vendor/libssh2/Makefile.am +++ b/vendor/libssh2/Makefile.am @@ -43,7 +43,7 @@ os400/libssh2rpg/libssh2_publickey.rpgle \ os400/libssh2rpg/libssh2_sftp.rpgle \ Makefile.os400qc3.inc -EXTRA_DIST = $(WIN32FILES) buildconf $(NETWAREFILES) get_ver.awk \ +EXTRA_DIST = $(WIN32FILES) $(NETWAREFILES) get_ver.awk \ maketgz NMakefile RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath \ CMakeLists.txt cmake $(OS400FILES) @@ -119,7 +119,7 @@ $(DSP): win32/msvcproj.head win32/msvcproj.foot Makefile.am for file in $$sorted_hdrs; do \ echo "# Begin Source File"; \ echo ""; \ - if [ "$$file" == "libssh2_config.h" ]; \ + if [ "$$file" = "libssh2_config.h" ]; \ then \ echo "SOURCE=.\\"$$file; \ else \ @@ -149,4 +149,6 @@ $(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am awk '{printf("%s\r\n", gensub("\r", "", "g"))}' > $@ ) checksrc: - perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c + perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT \ + -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c \ + tests/*.[ch] diff --git a/vendor/libssh2/Makefile.in b/vendor/libssh2/Makefile.in index 32d97cba7..c60873ab8 100644 --- a/vendor/libssh2/Makefile.in +++ b/vendor/libssh2/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.4 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -105,8 +105,7 @@ DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h \ - $(top_builddir)/example/libssh2_config.h +CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h CONFIG_CLEAN_FILES = libssh2.pc CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) @@ -192,9 +191,6 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -CSCOPE = cscope DIST_SUBDIRS = src tests docs example am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.inc \ $(srcdir)/libssh2.pc.in COPYING ChangeLog NEWS README compile \ @@ -238,6 +234,8 @@ am__relativize = \ DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' @@ -257,6 +255,12 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -267,6 +271,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ @@ -300,6 +305,7 @@ LIBSSL_PREFIX = @LIBSSL_PREFIX@ LIBTOOL = @LIBTOOL@ LIBZ = @LIBZ@ LIBZ_PREFIX = @LIBZ_PREFIX@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ @@ -341,6 +347,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -425,7 +432,7 @@ os400/libssh2rpg/libssh2_publickey.rpgle \ os400/libssh2rpg/libssh2_sftp.rpgle \ Makefile.os400qc3.inc -EXTRA_DIST = $(WIN32FILES) buildconf $(NETWAREFILES) get_ver.awk \ +EXTRA_DIST = $(WIN32FILES) $(NETWAREFILES) get_ver.awk \ maketgz NMakefile RELEASE-NOTES libssh2.pc.in $(VMSFILES) config.rpath \ CMakeLists.txt cmake $(OS400FILES) @@ -438,10 +445,10 @@ CRYPTO_HHEADERS = openssl.h wincng.h mbedtls.h CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ - blowfish.c bcrypt_pbkdf.c + blowfish.c bcrypt_pbkdf.c agent_win.c HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h agent.h # Makefile.inc provides the CSOURCES and HHEADERS defines WIN32SOURCES = $(CSOURCES) @@ -642,7 +649,6 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files - distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -729,6 +735,10 @@ dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @@ -771,6 +781,8 @@ distcheck: dist eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) @@ -786,7 +798,7 @@ distcheck: dist $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ @@ -952,7 +964,7 @@ uninstall-am: uninstall-includeHEADERS uninstall-pkgconfigDATA am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ - dist-tarZ dist-xz dist-zip distcheck distclean \ + dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \ distclean-generic distclean-libtool distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ @@ -1028,7 +1040,7 @@ $(DSP): win32/msvcproj.head win32/msvcproj.foot Makefile.am for file in $$sorted_hdrs; do \ echo "# Begin Source File"; \ echo ""; \ - if [ "$$file" == "libssh2_config.h" ]; \ + if [ "$$file" = "libssh2_config.h" ]; \ then \ echo "SOURCE=.\\"$$file; \ else \ @@ -1058,7 +1070,9 @@ $(VCPROJ): win32/vc8proj.head win32/vc8proj.foot Makefile.am awk '{printf("%s\r\n", gensub("\r", "", "g"))}' > $@ ) checksrc: - perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c + perl src/checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF -ACOPYRIGHT \ + -AFOPENMODE -Wsrc/libssh2_config.h src/*.[ch] include/*.h example/*.c \ + tests/*.[ch] # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/vendor/libssh2/Makefile.inc b/vendor/libssh2/Makefile.inc index ff8e6efa8..20d2ebeeb 100644 --- a/vendor/libssh2/Makefile.inc +++ b/vendor/libssh2/Makefile.inc @@ -1,7 +1,7 @@ CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ - blowfish.c bcrypt_pbkdf.c + blowfish.c bcrypt_pbkdf.c agent_win.c HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h agent.h diff --git a/vendor/libssh2/NEWS b/vendor/libssh2/NEWS index 4c7f1eacf..7e22b3dd8 100644 --- a/vendor/libssh2/NEWS +++ b/vendor/libssh2/NEWS @@ -1,5 +1,1381 @@ Changelog for the libssh2 project. Generated with git2news.pl +Daniel Stenberg (29 Aug 2021) +- [Will Cosgrove brought this change] + + updated docs for 1.10.0 release + +Marc Hörsken (30 May 2021) +- [Laurent Stacul brought this change] + + [tests] Try several times to connect the ssh server + + Sometimes, as the OCI container is run in detached mode, it is possible + the actual server is not ready yet to handle SSH traffic. The goal of + this PR is to try several times (max 3). The mechanism is the same as + for the connection to the docker machine. + +- [Laurent Stacul brought this change] + + Remove openssh_server container on test exit + +- [Laurent Stacul brought this change] + + Allow the tests to run inside a container + + The current tests suite starts SSH server as OCI container. This commit + add the possibility to run the tests in a container provided that: + + * the docker client is installed builder container + * the host docker daemon unix socket has been mounted in the builder + container (with, if needed, the DOCKER_HOST environment variable + accordingly set, and the permission to write on this socket) + * the builder container is run on the default bridge network, or the + host network. This PR does not handle the case where the builder + container is on another network. + +Marc Hoersken (28 May 2021) +- CI/appveyor: run SSH server for tests on GitHub Actions (#607) + + No longer rely on DigitalOcean to host the Docker container. + + Unfortunately we require a small dispatcher script that has + access to a GitHub access token with scope repo in order to + trigger the daemon workflow on GitHub Actions also for PRs. + + This script is hosted by myself for the time being until GitHub + provides a tighter scope to trigger the workflow_dispatch event. + +GitHub (26 May 2021) +- [Will Cosgrove brought this change] + + openssl.c: guards around calling FIPS_mode() #596 (#603) + + Notes: + FIPS_mode() is not implemented in LibreSSL and this API is removed in OpenSSL 3.0 and was introduced in 0.9.7. Added guards around making this call. + + Credit: + Will Cosgrove + +- [Will Cosgrove brought this change] + + configure.ac: don't undefine scoped variable (#594) + + * configure.ac: don't undefine scoped variable + + To get this script to run with Autoconf 2.71 on macOS I had to remove the undefine of the backend for loop variable. It seems scoped to the for loop and also isn't referenced later in the script so it seems OK to remove it. + + * configure.ac: remove cygwin specific CFLAGS #598 + + Notes: + Remove cygwin specific Win32 CFLAGS and treat the build like a posix build + + Credit: + Will Cosgrove, Brian Inglis + +- [Laurent Stacul brought this change] + + tests: Makefile.am: Add missing tests client keys in distribution tarball (#604) + + Notes: + Added missing test keys. + + Credit: + Laurent Stacul + +- [Laurent Stacul brought this change] + + Makefile.am: Add missing test keys in the distribution tarball (#601) + + Notes: + Fix tests missing key to build the OCI image + + Credit: + Laurent Stacul + +Daniel Stenberg (16 May 2021) +- dist: add src/agent.h + + Fixes #597 + Closes #599 + +GitHub (12 May 2021) +- [Will Cosgrove brought this change] + + packet.c: Reset read timeout after received a packet (#576) (#586) + + File: + packet.c + + Notes: + Attempt keyboard interactive login (Azure AD 2FA login) and use more than 60 seconds to complete the login, the connection fails. + + The _libssh2_packet_require function does almost the same as _libssh2_packet_requirev but this function sets state->start = 0 before returning. + + Credit: + teottin, Co-authored-by: Tor Erik Ottinsen + +- [kkoenig brought this change] + + Support ECDSA certificate authentication (#570) + + Files: hostkey.c, userauth.c, test_public_key_auth_succeeds_with_correct_ecdsa_key.c + + Notes: + Support ECDSA certificate authentication + + Add a test for: + - Existing ecdsa basic public key authentication + - ecdsa public key authentication with a signed public key + + Credit: + kkoenig + +- [Gabriel Smith brought this change] + + agent.c: Add support for Windows OpenSSH agent (#517) + + Files: agent.c, agent.h, agent_win.c + + Notes: + * agent: Add support for Windows OpenSSH agent + + The implementation was partially taken and modified from that found in + the Portable OpenSSH port to Win32 by the PowerShell team, but mostly + based on the existing Unix OpenSSH agent support. + + https://github.com/PowerShell/openssh-portable + + Regarding the partial transfer support implementation: partial transfers + are easy to deal with, but you need to track additional state when + non-blocking IO enters the picture. A tracker of how many bytes have + been transfered has been placed in the transfer context struct as that's + where it makes most sense. This tracker isn't placed behind a WIN32 + #ifdef as it will probably be useful for other agent implementations. + + * agent: win32 openssh: Disable overlapped IO + + Non-blocking IO is not currently supported by the surrounding agent + code, despite a lot of the code having everything set up to handle it. + + Credit: + Co-authored-by: Gabriel Smith + +- [Zenju brought this change] + + Fix detailed _libssh2_error being overwritten (#473) + + Files: openssl.c, pem.c, userauth.c + + Notes: + * Fix detailed _libssh2_error being overwritten by generic errors + * Unified error handling + + Credit: + Zenju + +- [Paul Capron brought this change] + + Fix _libssh2_random() silently discarding errors (#520) + + Notes: + * Make _libssh2_random return code consistent + + Previously, _libssh2_random was advertized in HACKING.CRYPTO as + returning `void` (and was implemented that way in os400qc3.c), but that + was in other crypto backends a lie; _libssh2_random is (a macro + expanding) to an int-value expression or function. + + Moreover, that returned code was: + — 0 or success, -1 on error for the MbedTLS & WinCNG crypto backends + But also: + — 1 on success, -1 or 0 on error for the OpenSSL backend! + – 1 on success, error cannot happen for libgcrypt! + + This commit makes explicit that _libssh2_random can fail (because most of + the underlying crypto functions can indeed fail!), and it makes its result + code consistent: 0 on success, -1 on error. + + This is related to issue #519 https://github.com/libssh2/libssh2/issues/519 + It fixes the first half of it. + + * Don't silent errors of _libssh2_random + + Make sure to check the returned code of _libssh2_random(), and + propagates any failure. + + A new LIBSSH_ERROR_RANDGEN constant is added to libssh2.h + None of the existing error constants seemed fit. + + This commit is related to d74285b68450c0e9ea6d5f8070450837fb1e74a7 + and to https://github.com/libssh2/libssh2/issues/519 (see the issue + for more info.) It closes #519. + + Credit: + Paul Capron + +- [Gabriel Smith brought this change] + + ci: Remove caching of docker image layers (#589) + + Notes: + continued ci reliability work. + + Credit: + Gabriel Smith + +- [Gabriel Smith brought this change] + + ci: Speed up docker builds for tests (#587) + + Notes: + The OpenSSH server docker image used for tests is pre-built to prevent + wasting time building it during a test, and unneeded rebuilds are + prevented by caching the image layers. + + Credit: + Gabriel Smith + +- [Will Cosgrove brought this change] + + userauth.c: don't error if using keys without RSA (#555) + + file: userauth.c + + notes: libssh2 now supports many other key types besides RSA, if the library is built without RSA support and a user attempts RSA auth it shouldn't be an automatic error + + credit: + Will Cosgrove + +- [Marc brought this change] + + openssl.c: Avoid OpenSSL latent error in FIPS mode (#528) + + File: + openssl.c + + Notes: + Avoid initing MD5 digest, which is not permitted in OpenSSL FIPS certified cryptography mode. + + Credit: + Marc + +- [Laurent Stacul brought this change] + + openssl.c: Fix EVP_Cipher interface change in openssl 3 #463 + + File: + openssl.c + + Notes: + Fixes building with OpenSSL 3, #463. + + The change is described there: + https://github.com/openssl/openssl/commit/f7397f0d58ce7ddf4c5366cd1846f16b341fbe43 + + Credit: + Laurent Stacul, reported by Sergei + +- [Gabriel Smith brought this change] + + openssh_fixture.c: Fix potential overwrite of buffer when reading stdout of command (#580) + + File: + openssh_fixture.c + Notes: + If reading the full output from the executed command took multiple + passes (such as when reading multiple lines) the old code would read + into the buffer starting at the some position (the start) every time. + The old code only works if fgets updated p or had an offset parameter, + both of which are not true. + + Credit: + Gabriel Smith + +- [Gabriel Smith brought this change] + + ci: explicitly state the default branch (#585) + + Notes: + It looks like the $default-branch macro only works in templates, not + workflows. This is not explicitly stated anywhere except the linked PR + comment. + + https://github.com/actions/starter-workflows/pull/590#issuecomment-672360634 + + credit: + Gabriel Smith + +- [Gabriel Smith brought this change] + + ci: Swap from Travis to Github Actions (#581) + + Files: ci files + + Notes: + Move Linux CI using Github Actions + + Credit: + Gabriel Smith, Marc Hörsken + +- [Mary brought this change] + + libssh2_priv.h: add iovec on 3ds (#575) + + file: libssh2_priv.h + note: include iovec for 3DS + credit: Mary Mstrodl + +- [Laurent Stacul brought this change] + + Tests: Fix unused variables warning (#561) + + file: test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c + + notes: fixed unused vars + + credit: + Laurent Stacul + +- [Viktor Szakats brought this change] + + bcrypt_pbkdf.c: fix clang10 false positive warning (#563) + + File: bcrypt_pbkdf.c + + Notes: + blf_enc() takes a number of 64-bit blocks to encrypt, but using + sizeof(uint64_t) in the calculation triggers a warning with + clang 10 because the actual data type is uint32_t. Pass + BCRYPT_BLOCKS / 2 for the number of blocks like libc bcrypt(3) + does. + + Ref: https://github.com/openbsd/src/commit/04a2240bd8f465bcae6b595d912af3e2965856de + + Fixes #562 + + Credit: + Viktor Szakats + +- [Will Cosgrove brought this change] + + transport.c: release payload on error (#554) + + file: transport.c + notes: If the payload is invalid and there is an early return, we could leak the payload + credit: + Will Cosgrove + +- [Will Cosgrove brought this change] + + ssh2_client_fuzzer.cc: fixed building + + The GitHub web editor did some funky things + +- [Will Cosgrove brought this change] + + ssh_client_fuzzer.cc: set blocking mode on (#553) + + file: ssh_client_fuzzer.cc + + notes: the session needs blocking mode turned on to avoid EAGAIN being returned from libssh2_session_handshake() + + credit: + Will Cosgrove, reviewed by Michael Buckley + +- [Etienne Samson brought this change] + + Add a LINT option to CMake (#372) + + * ci: make style-checking available locally + + * cmake: add a linting target + + * tests: check test suite syntax with checksrc.pl + +- [Will Cosgrove brought this change] + + kex.c: kex_agree_instr() improve string reading (#552) + + * kex.c: kex_agree_instr() improve string reading + + file: kex.c + notes: if haystack isn't null terminated we should use memchr() not strchar(). We should also make sure we don't walk off the end of the buffer. + credit: + Will Cosgrove, reviewed by Michael Buckley + +- [Will Cosgrove brought this change] + + kex.c: use string_buf in ecdh_sha2_nistp (#551) + + * kex.c: use string_buf in ecdh_sha2_nistp + + file: kex.c + + notes: + use string_buf in ecdh_sha2_nistp() to avoid attempting to parse malformed data + +- [Will Cosgrove brought this change] + + kex.c: move EC macro outside of if check #549 (#550) + + File: kex.c + + Notes: + Moved the macro LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY outside of the LIBSSH2_ECDSA since it's also now used by the ED25519 code. + + Sha 256, 384 and 512 need to be defined for all backends now even if they aren't used directly. I believe this is already the case, but just a heads up. + + Credit: + Stefan-Ghinea + +- [Tim Gates brought this change] + + kex.c: fix simple typo, niumber -> number (#545) + + File: kex.c + + Notes: + There is a small typo in src/kex.c. + + Should read `number` rather than `niumber`. + + Credit: + Tim Gates + +- [Tseng Jun brought this change] + + session.c: Correct a typo which may lead to stack overflow (#533) + + File: session.c + + Notes: + Seems the author intend to terminate banner_dup buffer, later, print it to the debug console. + + Author: + Tseng Jun + +Marc Hoersken (10 Oct 2020) +- wincng: fix random big number generation to match openssl + + The old function would set the least significant bits in + the most significant byte instead of the most significant bits. + + The old function would also zero pad too much bits in the + most significant byte. This lead to a reduction of key space + in the most significant byte according to the following listing: + - 8 bits reduced to 0 bits => eg. 2048 bits to 2040 bits DH key + - 7 bits reduced to 1 bits => eg. 2047 bits to 2041 bits DH key + - 6 bits reduced to 2 bits => eg. 2046 bits to 2042 bits DH key + - 5 bits reduced to 3 bits => eg. 2045 bits to 2043 bits DH key + + No change would occur for the case of 4 significant bits. + For 1 to 3 significant bits in the most significant byte + the DH key would actually be expanded instead of reduced: + - 3 bits expanded to 5 bits => eg. 2043 bits to 2045 bits DH key + - 2 bits expanded to 6 bits => eg. 2042 bits to 2046 bits DH key + - 1 bits expanded to 7 bits => eg. 2041 bits to 2047 bits DH key + + There is no case of 0 significant bits in the most significant byte + since this would be a case of 8 significant bits in the next byte. + + At the moment only the following case applies due to a fixed + DH key size value currently being used in libssh2: + + The DH group_order is fixed to 256 (bytes) which leads to a + 2047 bits DH key size by calculating (256 * 8) - 1. + + This means the DH keyspace was previously reduced from 2047 bits + to 2041 bits (while the top and bottom bits are always set), so the + keyspace is actually always reduced from 2045 bits to 2039 bits. + + All of this is only relevant for Windows versions supporting the + WinCNG backend (Vista or newer) before Windows 10 version 1903. + + Closes #521 + +Daniel Stenberg (28 Sep 2020) +- libssh2_session_callback_set.3: explain the recv/send callbacks + + Describe how to actually use these callbacks. + + Closes #518 + +GitHub (23 Sep 2020) +- [Will Cosgrove brought this change] + + agent.c: formatting + + Improved formatting of RECV_SEND_ALL macro. + +- [Will Cosgrove brought this change] + + CMakeLists.txt: respect install lib dir #405 (#515) + + Files: + CMakeLists.txt + + Notes: + Use CMAKE_INSTALL_LIBDIR directory + + Credit: Arfrever + +- [Will Cosgrove brought this change] + + kex.c: group16-sha512 and group18-sha512 support #457 (#468) + + Files: kex.c + + Notes: + Added key exchange group16-sha512 and group18-sha512. As a result did the following: + + Abstracted diffie_hellman_sha256() to diffie_hellman_sha_algo() which is now algorithm agnostic and takes the algorithm as a parameter since we needed sha512 support. Unfortunately it required some helper functions but they are simple. + Deleted diffie_hellman_sha1() + Deleted diffie_hellman_sha1 specific macro + Cleaned up some formatting + Defined sha384 in os400 and wincng backends + Defined LIBSSH2_DH_MAX_MODULUS_BITS to abort the connection if we receive too large of p from the server doing sha1 key exchange. + Reorder the default key exchange list to match OpenSSH and improve security + + Credit: + Will Cosgrove + +- [Igor Klevanets brought this change] + + agent.c: Recv and send all bytes via network in agent_transact_unix() (#510) + + Files: agent.c + + Notes: + Handle sending/receiving partial packet replies in agent.c API. + + Credit: Klevanets Igor + +- [Daniel Stenberg brought this change] + + Makefile.am: include all test files in the dist #379 + + File: + Makefile.am + + Notes: + No longer conditionally include OpenSSL specific test files, they aren't run if we're not building against OpenSSL 1.1.x anyway. + + Credit: + Daniel Stenberg + +- [Max Dymond brought this change] + + Add support for an OSS Fuzzer fuzzing target (#392) + + Files: + .travis.yml, configure.ac, ossfuzz + + Notes: + This adds support for an OSS-Fuzz fuzzing target in ssh2_client_fuzzer, + which is a cut down example of ssh2.c. Future enhancements can improve + coverage. + + Credit: + Max Dymond + +- [Sebastián Katzer brought this change] + + mbedtls.c: ECDSA support for mbed TLS (#385) + + Files: + mbedtls.c, mbedtls.h, .travis.yml + + Notes: + This PR adds support for ECDSA for both key exchange and host key algorithms. + + The following elliptic curves are supported: + + 256-bit curve defined by FIPS 186-4 and SEC1 + 384-bit curve defined by FIPS 186-4 and SEC1 + 521-bit curve defined by FIPS 186-4 and SEC1 + + Credit: + Sebastián Katzer + +Marc Hoersken (1 Sep 2020) +- buildconf: exec autoreconf to avoid additional process (#512) + + Also make buildconf exit with the return code of autoreconf. + + Follow up to #224 + +- scp.c: fix indentation in shell_quotearg documentation + +- wincng: make more use of new helper functions (#496) + +- wincng: make sure algorithm providers are closed once (#496) + +GitHub (10 Jul 2020) +- [David Benjamin brought this change] + + openssl.c: clean up curve25519 code (#499) + + File: openssl.c, openssl.h, crypto.h, kex.c + + Notes: + This cleans up a few things in the curve25519 implementation: + + - There is no need to create X509_PUBKEYs or PKCS8_PRIV_KEY_INFOs to + extract key material. EVP_PKEY_get_raw_private_key and + EVP_PKEY_get_raw_public_key work fine. + + - libssh2_x25519_ctx was never used (and occasionally mis-typedefed to + libssh2_ed25519_ctx). Remove it. The _libssh2_curve25519_new and + _libssh2_curve25519_gen_k interfaces use the bytes. Note, if it needs + to be added back, there is no need to roundtrip through + EVP_PKEY_new_raw_private_key. EVP_PKEY_keygen already generated an + EVP_PKEY. + + - Add some missing error checks. + + Credit: + David Benjamin + +- [Will Cosgrove brought this change] + + transport.c: socket is disconnected, return error (#500) + + File: transport.c + + Notes: + This is to fix #102, instead of continuing to attempt to read a disconnected socket, it will now error out. + + Credit: + TDi-jonesds + +- [Will Cosgrove brought this change] + + stale.yml + + Increasing stale values. + +Marc Hoersken (6 Jul 2020) +- wincng: try newer DH API first, fallback to legacy RSA API + + Avoid the use of RtlGetVersion or similar Win32 functions, + since these depend on version information from manifests. + + This commit makes the WinCNG backend first try to use the + new DH algorithm API with the raw secret derivation feature. + In case this feature is not available the WinCNG backend + will fallback to the classic approach of using RSA-encrypt + to perform the required modular exponentiation of BigNums. + + The feature availability test is done during the first handshake + and the result is stored in the crypto backends global state. + + Follow up to #397 + Closes #484 + +- wincng: fix indentation of function arguments and comments + + Follow up to #397 + +- [Wez Furlong brought this change] + + wincng: use newer DH API for Windows 8.1+ + + Since Windows 1903 the approach used to perform DH kex with the CNG + API has been failing. + + This commit switches to using the `DH` algorithm provider to perform + generation of the key pair and derivation of the shared secret. + + It uses a feature of CNG that is not yet documented. The sources of + information that I've found on this are: + + * https://stackoverflow.com/a/56378698/149111 + * https://github.com/wbenny/mini-tor/blob/5d39011e632be8e2b6b1819ee7295e8bd9b7a769/mini/crypto/cng/dh.inl#L355 + + With this change I am able to successfully connect from Windows 10 to my + ubuntu system. + + Refs: https://github.com/alexcrichton/ssh2-rs/issues/122 + Fixes: https://github.com/libssh2/libssh2/issues/388 + Closes: https://github.com/libssh2/libssh2/pull/397 + +GitHub (1 Jul 2020) +- [Zenju brought this change] + + comp.c: Fix name clash with ZLIB macro "compress" (#418) + + File: comp.c + + Notes: + * Fix name clash with ZLIB macro "compress". + + Credit: + Zenju + +- [yann-morin-1998 brought this change] + + buildsystem: drop custom buildconf script, rely on autoreconf (#224) + + Notes: + The buildconf script is currently required, because we need to copy a + header around, because it is used both from the library and the examples + sources. + + However, having a custom 'buildconf'-like script is not needed if we can + ensure that the header exists by the time it is needed. For that, we can + just append the src/ directory to the headers search path for the + examples. + + And then it means we no longer need to generate the same header twice, + so we remove the second one from configure.ac. + + Now, we can just call "autoreconf -fi" to generate the autotools files, + instead of relying on the canned sequence in "buildconf", since + autoreconf has now long known what to do at the correct moment (future + versions of autotools, automake, autopoint, autoheader etc... may + require an other ordering, or other intermediate steps, etc...). + + Eventually, get rid of buildconf now it is no longer needed. In fact, we + really keep it for legacy, but have it just call autoreconf (and print a + nice user-friendly warning). Don't include it in the release tarballs, + though. + + Update doc, gitignore, and travis-CI jobs accordingly. + + Credit: + Signed-off-by: "Yann E. MORIN" + Cc: Sam Voss + +- [Will Cosgrove brought this change] + + libssh2.h: Update Diffie Hellman group values (#493) + + File: libssh2.h + + Notes: + Update the min, preferred and max DH group values based on RFC 8270. + + Credit: + Will Cosgrove, noted from email list by Mitchell Holland + +Marc Hoersken (22 Jun 2020) +- travis: use existing Makefile target to run checksrc + +- Makefile: also run checksrc on test source files + +- tests: avoid use of deprecated function _sleep (#490) + +- tests: avoid use of banned function strncat (#489) + +- tests: satisfy checksrc regarding max line length of 79 chars + + Follow up to 2764bc8e06d51876b6796d6080c6ac51e20f3332 + +- tests: satisfy checksrc with whitespace only fixes + + checksrc.pl -i4 -m79 -ASIZEOFNOPAREN -ASNPRINTF + -ACOPYRIGHT -AFOPENMODE tests/*.[ch] + +- tests: add support for ports published via Docker for Windows + +- tests: restore retry behaviour for docker-machine ip command + +- tests: fix mix of declarations and code failing C89 compliance + +- wincng: add and improve checks in bit counting function + +- wincng: align bits to bytes calculation in all functions + +- wincng: do not disable key validation that can be enabled + + The modular exponentiation also works with key validation enabled. + +- wincng: fix return value in _libssh2_dh_secret + + Do not ignore return value of modular exponentiation. + +- appveyor: build and run tests for WinCNG crypto backend + +GitHub (1 Jun 2020) +- [suryakalpo brought this change] + + INSTALL_CMAKE.md: Update formatting (#481) + + File: INSTALL_CMAKE.md + + Notes: + Although the original text would be immediately clear to seasoned users of CMAKE and/or Unix shell, the lack of newlines may cause some confusion for newcomers. Hence, wrapping the texts in a md code-block such that the newlines appear as intended. + + credit: + suryakalpo + +Marc Hoersken (31 May 2020) +- src: add new and align include guards in header files (#480) + + Make sure all include guards exist and follow the same format. + +- wincng: fix multiple definition of `_libssh2_wincng' (#479) + + Add missing include guard and move global state + from header to source file by using extern. + +GitHub (28 May 2020) +- [Will Cosgrove brought this change] + + transport.c: moving total_num check from #476 (#478) + + file: transport.c + + notes: + moving total_num zero length check from #476 up to the prior bounds check which already includes a total_num check. Makes it slightly more readable. + + credit: + Will Cosgrove + +- [lutianxiong brought this change] + + transport.c: fix use-of-uninitialized-value (#476) + + file:transport.c + + notes: + return error if malloc(0) + + credit: + lutianxiong + +- [Dr. Koutheir Attouchi brought this change] + + libssh2_sftp.h: Changed type of LIBSSH2_FX_* constants to unsigned long, fixes #474 + + File: + libssh2_sftp.h + + Notes: + Error constants `LIBSSH2_FX_*` are only returned by `libssh2_sftp_last_error()` which returns `unsigned long`. + Therefore these constants should be defined as unsigned long literals, instead of int literals. + + Credit: + Dr. Koutheir Attouchi + +- [monnerat brought this change] + + os400qc3.c: constify libssh2_os400qc3_hash_update() data parameter. (#469) + + Files: os400qc3.c, os400qc3.h + + Notes: + Fixes building on OS400. #426 + + Credit: + Reported-by: hjindra on github, dev by Monnerat + +- [monnerat brought this change] + + HACKING.CRYPTO: keep up to date with new crypto definitions from code. (#466) + + File: HACKING.CRYPTO + + Notes: + This commit updates the HACKING.CRYPTO documentation file in an attempt to make it in sync with current code. + New documented features are: + + SHA384 + SHA512 + ECDSA + ED25519 + + Credit: + monnerat + +- [Harry Sintonen brought this change] + + kex.c: Add diffie-hellman-group14-sha256 Key Exchange Method (#464) + + File: kex.c + + Notes: Added diffie-hellman-group14-sha256 kex + + Credit: Harry Sintonen + +- [Will Cosgrove brought this change] + + os400qc3.h: define sha512 macros (#465) + + file: os400qc3.h + notes: fixes for building libssh2 1.9.x + +- [Will Cosgrove brought this change] + + os400qc3.h: define EC types to fix building #426 (#462) + + File: os400qc3.h + Notes: define missing EC types which prevents building + Credit: hjindra + +- [Brendan Shanks brought this change] + + hostkey.c: Fix 'unsigned int'/'uint32_t' mismatch (#461) + + File: hostkey.c + + Notes: + These types are the same size so most compilers are fine with it, but CodeWarrior (on classic MacOS) throws an ‘illegal implicit conversion’ error + + Credit: Brendan Shanks + +- [Thomas Klausner brought this change] + + Makefile.am: Fix unportable test(1) operator. (#459) + + file: Makefile.am + + Notes: + The POSIX comparison operator for test(1) is =; bash supports == but not even test from GNU coreutils does. + + Credit: + Thomas Klausner + +- [Tseng Jun brought this change] + + openssl.c: minor changes of coding style (#454) + + File: openssl.c + + Notes: + minor changes of coding style and align preprocessor conditional for #439 + + Credit: + Tseng Jun + +- [Hans Meier brought this change] + + openssl.c: Fix for use of uninitialized aes_ctr_cipher.key_len (#453) + + File: + Openssl.c + + Notes: + * Fix for use of uninitialized aes_ctr_cipher.key_len when using HAVE_OPAQUE_STRUCTS, regression from #439 + + Credit: + Hans Meirer, Tseng Jun + +- [Zenju brought this change] + + agent.c: Fix Unicode builds on Windows (#417) + + File: agent.c + + Notes: + Fixes unicode builds for Windows in Visual Studio 16.3.2. + + Credit: + Zenju + +- [Hans Meier brought this change] + + openssl.c: Fix use-after-free crash in openssl backend without memory leak (#439) + + Files: openssl.c + + Notes: + Fixes memory leaks and use after free AES EVP_CIPHER contexts when using OpenSSL 1.0.x. + + Credit: + Hans Meier + +- [Romain Geissler @ Amadeus brought this change] + + Session.c: Fix undefined warning when mixing with LTO-enabled libcurl. (#449) + + File: Session.c + + Notes: + With gcc 9, libssh2, libcurl and LTO enabled for all binaries I see this + warning (error with -Werror): + + vssh/libssh2.c: In function ‘ssh_statemach_act’: + /data/mwrep/rgeissler/ospack/ssh2/BUILD/libssh2-libssh2-03c7c4a/src/session.c:579:9: error: ‘seconds_to_next’ is used uninitialized in this function [-Werror=uninitialized] + 579 | int seconds_to_next; + | ^ + lto1: all warnings being treated as errors + + Gcc normally issues -Wuninitialized when it is sure there is a problem, + and -Wmaybe-uninitialized when it's not sure, but it's possible. Here + the compiler seems to have find a real case where this could happen. I + looked in your code and overall it seems you always check if the return + code is non null, not often that it's below zero. I think we should do + the same here. With this patch, gcc is fine. + + Credit: + Romain-Geissler-1A + +- [Zenju brought this change] + + transport.c: Fix crash with delayed compression (#443) + + Files: transport.c + + Notes: + Fixes crash with delayed compression option using Bitvise server. + + Contributor: + Zenju + +- [Will Cosgrove brought this change] + + Update INSTALL_MAKE path to INSTALL_MAKE.md (#446) + + Included for #429 + +- [Will Cosgrove brought this change] + + Update INSTALL_CMAKE filename to INSTALL_CMAKE.md (#445) + + Fixing for #429 + +- [Wallace Souza brought this change] + + Rename INSTALL_CMAKE to INTALL_CMAKE.md (#429) + + Adding Markdown file extension in order to Github render the instructions properly + +Will Cosgrove (17 Dec 2019) +- [Daniel Stenberg brought this change] + + include/libssh2.h: fix comment: the known host key uses 4 bits (#438) + +- [Zenju brought this change] + + ssh-ed25519: Support PKIX + calc pubkey from private (#416) + + Files: openssl.c/h + Author: Zenju + Notes: + Adds support for PKIX key reading by fixing: + + _libssh2_pub_priv_keyfile() is missing the code to extract the ed25519 public key from a given private key + + _libssh2_ed25519_new_private_frommemory is only parsing the openssh key format but does not understand PKIX (as retrieved via PEM_read_bio_PrivateKey) + +GitHub (15 Oct 2019) +- [Will Cosgrove brought this change] + + .travis.yml: Fix Chrome and 32 bit builds (#423) + + File: .travis.yml + + Notes: + * Fix Chrome installing by using Travis build in directive + * Update to use libgcrypt20-dev package to fix 32 bit builds based on comments found here: + https://launchpad.net/ubuntu/xenial/i386/libgcrypt11-dev + +- [Will Cosgrove brought this change] + + packet.c: improved parsing in packet_x11_open (#410) + + Use new API to parse data in packet_x11_open() for better bounds checking. + +Will Cosgrove (12 Sep 2019) +- [Michael Buckley brought this change] + + knownhost.c: Double the static buffer size when reading and writing known hosts (#409) + + Notes: + We had a user who was being repeatedly prompted to accept a server key repeatedly. It turns out the base64-encoded key was larger than the static buffers allocated to read and write known hosts. I doubled the size of these buffers. + + Credit: + Michael Buckley + +GitHub (4 Sep 2019) +- [Will Cosgrove brought this change] + + packet.c: improved packet parsing in packet_queue_listener (#404) + + * improved bounds checking in packet_queue_listener + + file: packet.c + + notes: + improved parsing packet in packet_queue_listener + +- [Will Cosgrove brought this change] + + packet.c: improve message parsing (#402) + + * packet.c: improve parsing of packets + + file: packet.c + + notes: + Use _libssh2_get_string API in SSH_MSG_DEBUG/SSH_MSG_DISCONNECT. Additional uint32 bounds check in SSH_MSG_GLOBAL_REQUEST. + +- [Will Cosgrove brought this change] + + misc.c: _libssh2_ntohu32 cast bit shifting (#401) + + To quite overly aggressive analyzers. + + Note, the builds pass, Travis is having some issues with Docker images. + +- [Will Cosgrove brought this change] + + kex.c: improve bounds checking in kex_agree_methods() (#399) + + file: kex.c + + notes: + use _libssh2_get_string instead of kex_string_pair which does additional checks + +Will Cosgrove (23 Aug 2019) +- [Fabrice Fontaine brought this change] + + acinclude.m4: add mbedtls to LIBS (#371) + + Notes: + This is useful for static builds so that the Libs.private field in + libssh2.pc contains correct info for the benefit of pkg-config users. + Static link with libssh2 requires this information. + + Signed-off-by: Baruch Siach + [Retrieved from: + https://git.buildroot.net/buildroot/tree/package/libssh2/0002-acinclude.m4-add-mbedtls-to-LIBS.patch] + Signed-off-by: Fabrice Fontaine + + Credit: + Fabrice Fontaine + +- [jethrogb brought this change] + + Generate debug info when building with MSVC (#178) + + files: CMakeLists.txt + + notes: Generate debug info when building with MSVC + + credit: + jethrogb + +- [Panos brought this change] + + Add agent forwarding implementation (#219) + + files: channel.c, test_agent_forward_succeeds.c, libssh2_priv.h, libssh2.h, ssh2_agent_forwarding.c + + notes: + * Adding SSH agent forwarding. + * Fix agent forwarding message, updated example. + Added integration test code and cmake target. Added example to cmake list. + + credit: + pkittenis + +GitHub (2 Aug 2019) +- [Will Cosgrove brought this change] + + Update EditorConfig + + Added max_line_length = 80 + +- [Will Cosgrove brought this change] + + global.c : fixed call to libssh2_crypto_exit #394 (#396) + + * global.c : fixed call to libssh2_crypto_exit #394 + + File: global.c + + Notes: Don't call `libssh2_crypto_exit()` until `_libssh2_initialized` count is down to zero. + + Credit: seba30 + +Will Cosgrove (30 Jul 2019) +- [hlefebvre brought this change] + + misc.c : Add an EWOULDBLOCK check for better portability (#172) + + File: misc.c + + Notes: Added support for all OS' that implement EWOULDBLOCK, not only VMS + + Credit: hlefebvre + +- [Etienne Samson brought this change] + + userauth.c: fix off by one error when loading public keys with no id (#386) + + File: userauth.c + + Credit: + Etienne Samson + + Notes: + Caught by ASAN: + + ================================================================= + ==73797==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60700001bcf0 at pc 0x00010026198d bp 0x7ffeefbfed30 sp 0x7ffeefbfe4d8 + READ of size 69 at 0x60700001bcf0 thread T0 + 2019-07-04 08:35:30.292502+0200 atos[73890:2639175] examining /Users/USER/*/libssh2_clar [73797] + #0 0x10026198c in wrap_memchr (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1f98c) + #1 0x1000f8e66 in file_read_publickey userauth.c:633 + #2 0x1000f2dc9 in userauth_publickey_fromfile userauth.c:1513 + #3 0x1000f2948 in libssh2_userauth_publickey_fromfile_ex userauth.c:1590 + #4 0x10000e254 in test_userauth_publickey__ed25519_auth_ok publickey.c:69 + #5 0x1000090c3 in clar_run_test clar.c:260 + #6 0x1000038f3 in clar_run_suite clar.c:343 + #7 0x100003272 in clar_test_run clar.c:522 + #8 0x10000c3cc in main runner.c:60 + #9 0x7fff5b43b3d4 in start (libdyld.dylib:x86_64+0x163d4) + + 0x60700001bcf0 is located 0 bytes to the right of 80-byte region [0x60700001bca0,0x60700001bcf0) + allocated by thread T0 here: + #0 0x10029e053 in wrap_malloc (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x5c053) + #1 0x1000b4978 in libssh2_default_alloc session.c:67 + #2 0x1000f8aba in file_read_publickey userauth.c:597 + #3 0x1000f2dc9 in userauth_publickey_fromfile userauth.c:1513 + #4 0x1000f2948 in libssh2_userauth_publickey_fromfile_ex userauth.c:1590 + #5 0x10000e254 in test_userauth_publickey__ed25519_auth_ok publickey.c:69 + #6 0x1000090c3 in clar_run_test clar.c:260 + #7 0x1000038f3 in clar_run_suite clar.c:343 + #8 0x100003272 in clar_test_run clar.c:522 + #9 0x10000c3cc in main runner.c:60 + #10 0x7fff5b43b3d4 in start (libdyld.dylib:x86_64+0x163d4) + + SUMMARY: AddressSanitizer: heap-buffer-overflow (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1f98c) in wrap_memchr + Shadow bytes around the buggy address: + 0x1c0e00003740: fd fd fd fd fd fd fd fd fd fd fa fa fa fa fd fd + 0x1c0e00003750: fd fd fd fd fd fd fd fa fa fa fa fa 00 00 00 00 + 0x1c0e00003760: 00 00 00 00 00 00 fa fa fa fa 00 00 00 00 00 00 + 0x1c0e00003770: 00 00 00 fa fa fa fa fa fd fd fd fd fd fd fd fd + 0x1c0e00003780: fd fd fa fa fa fa fd fd fd fd fd fd fd fd fd fa + =>0x1c0e00003790: fa fa fa fa 00 00 00 00 00 00 00 00 00 00[fa]fa + 0x1c0e000037a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037b0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + 0x1c0e000037e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa + Shadow byte legend (one shadow byte represents 8 application bytes): + Addressable: 00 + Partially addressable: 01 02 03 04 05 06 07 + Heap left redzone: fa + Freed heap region: fd + Stack left redzone: f1 + Stack mid redzone: f2 + Stack right redzone: f3 + Stack after return: f5 + Stack use after scope: f8 + Global redzone: f9 + Global init order: f6 + Poisoned by user: f7 + Container overflow: fc + Array cookie: ac + Intra object redzone: bb + ASan internal: fe + Left alloca redzone: ca + Right alloca redzone: cb + Shadow gap: cc + +- [Thilo Schulz brought this change] + + openssl.c : Fix use-after-free crash on reinitialization of openssl backend + + file : openssl.c + + notes : + libssh2's openssl backend has a use-after-free condition if HAVE_OPAQUE_STRUCTS is defined and you call libssh2_init() again after prior initialisation/deinitialisation of libssh2 + + credit : Thilo Schulz + +- [axjowa brought this change] + + openssl.h : Use of ifdef where if should be used (#389) + + File : openssl.h + + Notes : + LIBSSH2_ECDSA and LIBSSH2_ED25519 are always defined so the #ifdef + checks would never be false. + + This change makes it possible to build libssh2 against OpenSSL built + without EC support. + + Change-Id: I0a2f07c2d80178314dcb7d505d1295d19cf15afd + + Credit : axjowa + +- [Zenju brought this change] + + Agent.c : Preserve error info from agent_list_identities() (#374) + + Files : agent.c + + Notes : + Currently the error details as returned by agent_transact_pageant() are overwritten by a generic "agent list id failed" message by int agent_list_identities(LIBSSH2_AGENT* agent). + + Credit : + Zenju + +- [Who? Me?! brought this change] + + Channel.c: Make sure the error code is set in _libssh2_channel_open() (#381) + + File : Channel.c + + Notes : + if _libssh2_channel_open() fails, set the error code. + + Credit : + mark-i-m + +- [Orgad Shaneh brought this change] + + Kex.c, Remove unneeded call to strlen (#373) + + File : Kex.c + + Notes : + Removed call to strlen + + Credit : + Orgad Shaneh + +- [Pedro Monreal brought this change] + + Spelling corrections (#380) + + Files : + libssh2.h, libssh2_sftp.h, bcrypt_pbkdf.c, mbedtls.c, sftp.c, ssh2.c + + Notes : + * Fixed misspellings + + Credit : + Pedro Monreal + +- [Sebastián Katzer brought this change] + + Fix Potential typecast error for `_libssh2_ecdsa_key_get_curve_type` (#383) + + Issue : #383 + + Files : hostkey.c, crypto.h, openssl.c + + Notes : + * Fix potential typecast error for `_libssh2_ecdsa_key_get_curve_type` + * Rename _libssh2_ecdsa_key_get_curve_type to _libssh2_ecdsa_get_curve_type + + Credit : + Sebastián Katzer + +GitHub (20 Jun 2019) +- [Will Cosgrove brought this change] + + bump copyright date + +Version 1.9.0 (19 Jun 2019) + GitHub (19 Jun 2019) - [Will Cosgrove brought this change] @@ -5453,489 +6829,3 @@ Peter Stuge (17 Jun 2010) Daniel Stenberg (16 Jun 2010) - libssh2_session_callback_set: extended the man page - -- [John brought this change] - - LIBSSH2_DEBUG: macro uses incorrect function variable - - The LIBSSH2_DEBUG macro, defined in libssh2_priv.h, incorrectly uses the - function variable ssh_msg_disconnect when it should use ssh_msg_debug. - - This shows that the LIBSSH2_CALLBACK_DEBUG callback never has worked... - -- warning: fix a compiler warning 'pointer differs in signedness' - - As reported in bug #177 - -- portability: introduce LIBSSH2_INT64_T_FORMAT for 64bit printf()s - - As pointed out in bug #177, some of the Windows compilers use - %I64 to output 64 bit variables with the printf family. - -- debug: avoid sending NULL to sprintf %s - - Via the _libssh2_debug() macro/function. Pointed out by john in bug report - -- sftp docs: show macro on macro page, only function on function page - - The individual man pages for macros now show the full convenience - macro as defined, and then the man page for the actual function - only shows the function. - -- code police: make the code use less than 80 columns - -- libssh2_channel_write_ex: remove macros, added wording on buffer size - -- libssh2_sftp_write: document buffer size and changed some ordering - -- libssh2_channel_write_stderr: show how the macro is defined - -- libssh2_channel_write: show how the macro is defined - -- SFTP: limit write() to not produce overly large packets - - sftp_write() now limits how much data it gets at a time even more - than before. Since this function creates a complete outgoing - packet based on what gets passed to it, it is crucial that it - doesn't create too large packets. - - With this method, there's also no longer any problem to use very - large buffers in your application and feed that to libssh2. I've - done numerous tests now with uploading data over SFTP using 100K - buffers and I've had no problems with that. - -- scp_write_nonblock: add transfer time info - - Using the same timing logic and output format as - sftp_write_nonblock allows us to very easily run benchmarks on - SCP vs SFTP uploads using libssh2. - -- sftp_write_nonblock: select() on socket, use *BIG* buffer, time transfer - - The select() is just to make it nicer so that it doesn't - crazy-loop on EAGAIN. The buffer size thing is mostly to verify - that this really work as supposed. - - Transfer timing is just a minor thing, but it can just as well be - there and help us time and work on performance easier using out - of the box examples. - -- agent: use _libssh2_error() when returning errors - - As pointed out in bug report #173, this module basically never - used _libssh2_error() which made it work inconstently with other - parts of the libssh2 code base. This is my first take at making - this code more in line with the rest. - -- inputchecks: make lots of API functions check for NULL pointers - - If an application accidentally provides a NULL handle pointer to - the channel or sftp public functions, they now return an error - instead of segfaulting. - -- libssh2_channel_eof: clarify that it returns negative on errors - -- SFTP: keep the sftp error code as 32 bit - - 'last_errno' holds to the error code from the SFTP protocol and - since that is 32 bits on the wire there's no point in using a - long for this internally which is larger on some platforms. - -- agent: make the code better deal with unexpected code flows - - agent->ops gets initialized by the libssh2_agent_connect() call - but we need to make sure that we don't segfault even if a bad - sequence of function calls is used. - -Alexander Lamaison (10 Jun 2010) -- Better handling of invalid key files. - - Passing an invalid public key to libssh2_userauth_publickey_fromfile_ex - triggered an assertion. Replaced this with a runtime check that rejects - obviously invalid key data. - -Daniel Stenberg (10 Jun 2010) -- version: we start working on 1.2.7 now - -Version 1.2.6 (10 Jun 2010) - -Daniel Stenberg (10 Jun 2010) -- NEWS: add the 1.2.6 release details - -- RELEASE-NOTES: 1.2.6 details added - -Guenter Knauf (10 Jun 2010) -- fixed libssh2.dsw to use the generated libssh2.dsp; removed old *.dsp files. - -- moved MSVC strdup define to libssh2_config.h which we include already. - -- added missing source files to src/NMakefile. - -Daniel Stenberg (8 Jun 2010) -- libssh2_poll: refer to poll(3) and select(3) instead - -- example: fix strdup() for MSVC compiles - - MSVC has a _strdup() that we better use. This was reported in bug - -- SFTP: fail init SFTP if session isn't authenticated - - Alexander Lamaison filed bug #172 - (http://trac.libssh2.org/ticket/172), and pointed out that SFTP - init would do bad if the session isn't yet authenticated at the - time of the call, so we now check for this situation and returns - an error if detected. Calling sftp_init() at this point is bad - usage to start with. - -- direct_tcpip: bring back inclusion of libssh2_config.h - - In order to increase portability of this example, I'm bringing - the inclusion of libssh2_config.h back, and I also added an - require that header for this example to compile. - - I also made all code lines fit within 80 columns. - -Guenter Knauf (3 Jun 2010) -- cast away a warning. - -- moved CRT_SECURE_NO_DEPRECATE define up so its defined before the winsock headers are included. - -- fixed platform detection for MingW32 test makefile. - -- MingW32 has gettimeofday() implemented, so proper ifdef this function here. - -- removed MSVC ifdef since seems we can use __int64 still with latest headers. - -- changed copyright notice for MinW32 and NetWare binaries. - -- cleaned up MSVC ifdefs which where spreaded over 3 places. - -- added uint8_t typedef for NetWare CLIB platform. - -- if the function declaration gets changed the header should be changed too. - -- this is MSVC specific and doesnt apply for all Win32 compilers; - the uint8_t typedef clashes with MingW32 headers. - -- updated MingW32 makefiles for latest dependency lib versions. - -- updated NetWare makefiles for latest dependency lib versions. - -Dan Fandrich (30 May 2010) -- Fixed compiling with libgcrypt - - A change of parameter types from unsigned long to size_t was - missed in the prototype in libgcrypt.h - -Daniel Stenberg (28 May 2010) -- statvfs: use libssh2_sftp_statvfs only, no "_ex" - - As the long-term goal is to get rid of the extensive set of - macros from the API we can just as well start small by not adding - new macros when we add new functions. Therefore we let the - function be libssh2_sftp_statvfs() plainly without using an _ex - suffix. - - I also made it use size_t instead of unsigned int for the string - length as that too is a long-term goal for the API. - -- [Grubsky Grigory brought this change] - - DSP: output lib name typo - -- [Grubsky Grigory brought this change] - - win32: provide a uint8_t typedef for better building on windows - -- agent: win32: fix bad _libssh2_store_str call - - As pointed out by Grubsky Grigory , I - made a mistake when I added the _libssh2_store_str() call before - and I made a slightly different patch than what he suggested. - Based purely on taste. - -Peter Stuge (24 May 2010) -- [Joey Degges brought this change] - - Add libssh2_sftp_statvfs() and libssh2_sftp_fstatvfs() - - These can be used to get file system statistics from servers that - support the statvfs@openssh.com and fstatvfs@openssh.com extensions. - -Alexander Lamaison (22 May 2010) -- [Jose Baars brought this change] - - VMS specific: make sure final release can be installed over daily build - -- [Jose Baars brought this change] - - VMS: small improvement to the man2help utilities - -Peter Stuge (22 May 2010) -- [Joey Degges brought this change] - - libssh2_exit and libssh2_sftp_readdir man page fixes - -Daniel Stenberg (21 May 2010) -- spelling: s/sue/use - -Alexander Lamaison (21 May 2010) -- Change magic port number for generic knownhost check. - - libssh2_knownhost_checkp took 0 as a magic port number that indicated - a 'generic' check should be performed. However, 0 is a valid port - number in its own right so this commit changes the magic value to any - negative int. - -Mikhail Gusarov (5 May 2010) -- Add re-discovered copyright holders to COPYING - -- Restoring copyright statements from pre-git era - - Eli Fant has contributed fragmenting SFTP requests - -- Restoring my copyright statements from pre-git era - - keyboard_interactive, 'exit-status' information packet, non-atomic read/write - under FreeBSD, multi-channel operation bugfixes. - -Daniel Stenberg (3 May 2010) -- pedantic: make the code C90 clean - -Peter Stuge (3 May 2010) -- Do proper keyboard-interactive user dialog in the sftp.c example - -Daniel Stenberg (3 May 2010) -- added to tarball: libssh2_knownhost_checkp.3 - -- knownhost: support [host]:port in knownhost file - - OpenSSH has ways to add hosts to the knownhosts file that include - a specific port number which makes the key associated with only - that specific host+port pair. libssh2 previously did not support - this, and I was forced to add a new function to the API to - properly expose this ability to applications: - libssh2_knownhost_checkp() - - To *add* such hosts to the knownhosts file, you make sure to pass - on the host name in that manner to the libssh2_knownhost_addc() - function. - -- init/exit: mention these were added in 1.2.5 - -- libssh2_knownhost_check docs: correct the prototype - -- examples: avoid use of uninitialized variable 'sock' - -- KEX: stop pretending we negotiate language - - There was some stub-like parts of an implementation for - implementing kex language negotiation that caused clang-analyzer - to warn and as it did nothing I've now removed the dead code. - -- Uninitialized argument - -- sftpdir: removed dead assignment - -- Makefile.am: include the VMS-specific config header as well - -- [Jose Baars brought this change] - - Add VMS specific libssh2_config.h - -- fix Value stored to 's' is never read warning - - and moved variable declaration of s to be more local - -- kexinit: simplify the code and avoid scan-build warning - - Previously it would say "Value stored to 's' is never read" due - fourth increment of 's'. - -Alexander Lamaison (28 Apr 2010) -- Removed unecessary brackets. - -- Changed sftp_attrsize macro to a static function. - -Daniel Stenberg (28 Apr 2010) -- release: include the VMS-specific files - -- sftp_attrsize: protect the macro argument with proper parentheses - -- ssh2_agent: avoid using 'session' uninitialized on failures - -- examples: remove assignments of variable rc that's never used - -- publickey_init: remove useless variable increment - -- hostkey_method_ssh_rsa_init: remove useless variable increment - -- packet_x11_open: removed useless variable increment - - and made the declaration of a variable more local - -- packet_queue_listener: removed useless variable increment - - and made the declaration of a variable more local - -- sftp_read: move a read_responses array to where its used - - I find that this increases readability since the array is used - only in the function call just immediately below and nowhere - else. - -- sftp_readdir: turn a small array static const and move it - -- sftp_attrsize: converted function to a macro - - This way, the macro can evaluate a static number at compile time - for two out of four uses, and it probably runs faster for the - other two cases too. - -- sftp_open: deal with short channel_write calls - - This was an old TODO that just wasn't done before. If - channel_write returns short, that is not an error. - -- sftp_open: clean up, better check of input data - - The clang-analyzer report made it look into this function and - I've went through it to remove a potential use of an - uninitialized variable and I also added some validation of input - data received from the server. - - In general, lots of more code in this file need to validate the - input before assuming it is correct: there are servers out there - that have bugs or just have another idea of how to do the SFTP - protocol. - -- bugfix: avoid using the socket if it failed to create one - -- bugfix: potential use of NULL pointer - -- libssh2_userauth_password_ex: clarify errors somewhat - - The errors mentioned in this man page are possible return codes - but not necessarily the only return codes that this can return. - - Also reformatted the typ prototypes somewhat. - -- examples: fixed and made them more similar - - The channel read/write functions can return 0 in legitimate cases - without it being an error, and we need to loop properly if they - return short. - -- [Jose Baars brought this change] - - VMS port of libssh2; changes in the libssh2 common code - -- Makefile: added the two news headers userauth.h and session.h - -- cleanup: prefer the internal functions - - To get the blocking vs non-blocking to work as smooth as possible - and behave better internally, we avoid using the external - interfaces when calling functions internally. - - Renamed a few internal functions to use _libssh2 prefix when not - being private within a file, and removed the libssh2_ for one - that was private within the file. - -- session_free: remove dead code - -- libssh2_publickey_init: fixed to work better non-blocking - - This was triggered by a clang-analyzer complaint that turned out - to be valid, and it made me dig deeper and fix some generic non- - blocking problems I disovered in the code. - - While cleaning this up, I moved session-specific stuff over to a - new session.h header from the libssh2_priv.h header. - -- channel: reduce duplicated free and returns - - Simplified the code by trying to free data and return on a single - spot. - -- channel: make variables more local - - By making 'data' and 'data_len' more local in several places in - this file it will be easier to spot how they are used and we'll - get less risks to accidentally do bad things with them. - -Mikhail Gusarov (24 Apr 2010) -- Fix typos in manpages, catched by Lintian - -Daniel Stenberg (24 Apr 2010) -- channel_request_pty: simplify the code - - clang-analyzer pointed out how 'data' could be accessed as a NULL - pointer if the wrong state was set, and while I don't see that - happen in real-life the code flow is easier to read and follow by - moving the LIBSSH2_FREE() call into the block that is supposed to - deal with the data pointer anyway. - -- libssh2_channel_process_startup: simplify the code - - clang-analyzer pointed out how 'data' could be accessed as a NULL - pointer if the wrong state was set, and while I don't see that - happen in real-life the code flow is easier to read and follow by - moving the LIBSSH2_FREE() call into the block that is supposed to - deal with the data pointer anyway. - -- sftp_close_handle: add precation to not access NULL pointer - - clang-analyzer pointed this out as a "Pass-by-value argument in - function call is undefined" but while I can't see exactly how - this can ever happen in reality I think a little check for safety - isn't such a bad thing here. - -- scp_write_nonblock: Value stored to 'nread' is never read - -- scp_write: Value stored to 'ptr' is never read - -- scp_write_nonblock: Value stored to 'ptr' is never read - -- sftp_mkdir: less silly output but show failures - -- [Jose Baars brought this change] - - VMS port of libssh2 including VMS specific build procedures - -- two variable types changes, made lines less than 80 columns - - The two variable type changes are only to match type variable - fields actually read from the binary protocol. - -- remove check for negative padding_length - - It was silly, since it is read as an unsigned char... - -- hostkey_method_ssh_dss_init: Value stored to 's' is never read - -- libssh2_banner_set: avoid unnecessary increment and explain code - -- agent_transact_unix: remove unused variable - -- remove two unnecessary increments - -- more code converted to use _libssh2_store_*() - -- libssh2_publickey_list_fetch: removed unused variables - -- libssh2_publickey_init: remove unused variables - -- libssh2_scp_send64: added to API to provide large file transfers - - The previously existing libssh2_scp_send_ex() function has no way - to send files that are larger than 'size_t' which on 32bit - systems mean 4GB. This new API uses a libssh2_int64_t type and - should thus on most modern systems be able to send enormous - files. - -- sftp_init: remove unused variables and assignments - -- libssh2_knownhost_check: Value stored to 'keylen' is never read - -- hostkey: fix compiler warning diff --git a/vendor/libssh2/RELEASE-NOTES b/vendor/libssh2/RELEASE-NOTES index 98cb8033b..62064a9fe 100644 --- a/vendor/libssh2/RELEASE-NOTES +++ b/vendor/libssh2/RELEASE-NOTES @@ -1,44 +1,62 @@ -libssh2 1.9.0 +libssh2 1.10 This release includes the following enhancements and bugfixes: - - o adds ECDSA keys and host key support when using OpenSSL - o adds ED25519 key and host key support when using OpenSSL 1.1.1 - o adds OpenSSH style key file reading - o adds AES CTR mode support when using WinCNG - o adds PEM passphrase protected file support for Libgcrypt and WinCNG - o adds SHA256 hostkey fingerprint - o adds libssh2_agent_get_identity_path() and libssh2_agent_set_identity_path() - o adds explicit zeroing of sensitive data in memory - o adds additional bounds checks to network buffer reads - o adds the ability to use the server default permissions when creating sftp directories - o adds support for building with OpenSSL no engine flag - o adds support for building with LibreSSL - o increased sftp packet size to 256k - o fixed oversized packet handling in sftp - o fixed building with OpenSSL 1.1 - o fixed a possible crash if sftp stat gets an unexpected response - o fixed incorrect parsing of the KEX preference string value - o fixed conditional RSA and AES-CTR support - o fixed a small memory leak during the key exchange process - o fixed a possible memory leak of the ssh banner string - o fixed various small memory leaks in the backends - o fixed possible out of bounds read when parsing public keys from the server - o fixed possible out of bounds read when parsing invalid PEM files - o no longer null terminates the scp remote exec command - o now handle errors when diffie hellman key pair generation fails - o fixed compiling on Windows with the flag STDCALL=ON - o improved building instructions + + o adds agent forwarding support + o adds OpenSSH Agent support on Windows + o adds ECDSA key support using the Mbed TLS backend + o adds ECDSA cert authentication + o adds diffie-hellman-group14-sha256, diffie-hellman-group16-sha512, + diffie-hellman-group18-sha512 key exchanges + o adds support for PKIX key reading when using ed25519 with OpenSSL + o adds support for EWOULDBLOCK on VMS systems + o adds support for building with OpenSSL 3 + o adds support for using FIPS mode in OpenSSL + o adds debug symbols when building with MSVC + o adds support for building on the 3DS + o adds unicode build support on Windows + o restores os400 building + o increases min, max and opt Diffie Hellman group values + o improves portiablity of the make file + o improves timeout behavior with 2FA keyboard auth + o various improvements to the Wincng backend + o fixes reading parital packet replies when using an agent + o fixes Diffie Hellman key exchange on Windows 1903+ builds + o fixes building tests with older versions of OpenSSL + o fixes possible multiple definition warnings + o fixes potential cast issues _libssh2_ecdsa_key_get_curve_type() + o fixes potential use after free if libssh2_init() is called twice + o improved linking when using Mbed TLS + o fixes call to libssh2_crypto_exit() if crypto hasn't been initialized + o fixes crash when loading public keys with no id + o fixes possible out of bounds read when exchanging keys + o fixes possible out of bounds read when reading packets + o fixes possible out of bounds read when opening an X11 connection + o fixes possible out of bounds read when ecdh host keys + o fixes possible hang when trying to read a disconnected socket + o fixes a crash when using the delayed compression option + o fixes read error with large known host entries + o fixes various warnings + o fixes various small memory leaks + o improved error handling, various detailed errors will now be reported + o builds are now using OSS-Fuzz + o builds now use autoreconf instead of a custom build script + o cmake now respects install directory + o improved CI backend + o updated HACKING-CRYPTO documentation + o use markdown file extensions o improved unit tests - + This release would not have looked like this without help, code, reports and advice from friends like these: - Peter Surge, Will Cosgrove, Daniel Stenberg, Alex Arslan, Alex Crichton, - Thomas Bleeker, Keno Fischer, Marc Hörsken, Marcel Raad, Viktor Szakats, - Kamil Dudka, Panos, Etienne Samson, Tseng Jun, Brendan Shanks, doublex, - Erik B, Jakob Egger, Thomas Lochmatter, alex-weaver, Adrian Moran, Zenju, - gartens, Matthew D. Fuller, Ryan Kelley, Zhen-Huan HWANG, Orivej Desh, - Alexander Curtiss - - (29 contributors) + katzer, Orgad Shaneh, mark-i-m, Zenju, axjowa, Thilo Schulz, + Etienne Samson, hlefebvre, seba30, Panos, jethrogb, Fabrice Fontaine, + Will Cosgrove, Daniel Stenberg, Michael Buckley, Wallace Souza Silva, + Romain-Geissler-1A, meierha, Tseng Jun, Thomas Klausner, Brendan Shanks, + Harry Sintonen, monnerat, Koutheir Attouchi, Marc Hörsken, yann-morin-1998, + Wez Furlong, TDi-jonesds, David Benjamin, Max Dymond, Igor Klevanets, + Viktor Szakats, Laurent Stacul, Mstrodl, Gabriel Smith, MarcT512, + Paul Capron, teottin, Tor Erik Ottinsen, Brian Inglis + + (40 contributors) diff --git a/vendor/libssh2/acinclude.m4 b/vendor/libssh2/acinclude.m4 index a0044fc47..2066f0ec9 100644 --- a/vendor/libssh2/acinclude.m4 +++ b/vendor/libssh2/acinclude.m4 @@ -441,6 +441,7 @@ m4_case([$1], [mbedtls], [ LIBSSH2_LIB_HAVE_LINKFLAGS([mbedcrypto], [], [#include ], [ AC_DEFINE(LIBSSH2_MBEDTLS, 1, [Use $1]) + LIBS="$LIBS -lmbedcrypto" found_crypto="$1" support_clear_memory=yes ]) diff --git a/vendor/libssh2/aclocal.m4 b/vendor/libssh2/aclocal.m4 index 35a317296..fc56a693e 100644 --- a/vendor/libssh2/aclocal.m4 +++ b/vendor/libssh2/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.16.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.4 -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,13 +14,13 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.16.1], [], +m4_if([$1], [1.16.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.16.1])dnl +[AM_AUTOMAKE_VERSION([1.16.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -332,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -371,7 +371,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi @@ -398,7 +400,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -462,7 +464,7 @@ m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl @@ -514,6 +516,20 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This @@ -595,7 +611,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -616,7 +632,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -638,7 +654,7 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -673,7 +689,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -716,7 +732,7 @@ AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -737,12 +753,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then @@ -755,7 +766,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -784,7 +795,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -831,7 +842,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -850,7 +861,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -931,7 +942,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -991,7 +1002,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1019,7 +1030,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1038,7 +1049,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/vendor/libssh2/buildconf b/vendor/libssh2/buildconf deleted file mode 100755 index 558dcb660..000000000 --- a/vendor/libssh2/buildconf +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -LIBTOOLIZE="libtoolize" - -if [ "x`which $LIBTOOLIZE`" = "x" ]; then - LIBTOOLIZE="glibtoolize" -fi - -if [ "x`which $LIBTOOLIZE`" = "x" ]; then - echo "Neither libtoolize nor glibtoolize could be found!" - exit 1 -fi - -${LIBTOOLIZE} --copy --automake --force -${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS -${AUTOHEADER:-autoheader} -# copy the private libssh2_config.h.in to the examples dir so that -# it can be included without pointing the include path to the private -# source dir -cp src/libssh2_config.h.in example/libssh2_config.h.in -${AUTOCONF:-autoconf} -${AUTOMAKE:-automake} --add-missing --copy diff --git a/vendor/libssh2/compile b/vendor/libssh2/compile index 99e50524b..23fcba011 100755 --- a/vendor/libssh2/compile +++ b/vendor/libssh2/compile @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -53,7 +53,7 @@ func_file_conv () MINGW*) file_conv=mingw ;; - CYGWIN*) + CYGWIN* | MSYS*) file_conv=cygwin ;; *) @@ -67,7 +67,7 @@ func_file_conv () mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; - cygwin/*) + cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) diff --git a/vendor/libssh2/configure b/vendor/libssh2/configure index a983da2ce..1cbf782b1 100755 --- a/vendor/libssh2/configure +++ b/vendor/libssh2/configure @@ -1,11 +1,12 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libssh2 -. +# Generated by GNU Autoconf 2.71 for libssh2 -. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -16,14 +17,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -33,46 +36,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -81,13 +84,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -96,8 +92,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -109,30 +109,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -154,20 +134,22 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else +else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -187,18 +169,20 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : -else +else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' @@ -206,31 +190,40 @@ test \$(( 1 + 1 )) = 2 || exit 1 ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" - if (eval "$as_required") 2>/dev/null; then : + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : as_have_required=yes -else +else $as_nop as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : -else +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base + as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : break 2 fi fi @@ -238,14 +231,21 @@ fi esac as_found=false done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi - if test "x$CONFIG_SHELL" != x; then : + if test "x$CONFIG_SHELL" != x +then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also @@ -263,18 +263,19 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org and + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: libssh2-devel@cool.haxx.se about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script @@ -302,6 +303,7 @@ as_fn_unset () } as_unset=as_fn_unset + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -319,6 +321,14 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -333,7 +343,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -342,7 +352,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -381,12 +391,13 @@ as_fn_executable_p () # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -398,18 +409,27 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -421,9 +441,9 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -450,7 +470,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -494,7 +514,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall @@ -508,6 +528,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -521,6 +545,13 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -598,40 +629,36 @@ PACKAGE_URL='' ac_unique_file="src" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include +#include +#ifdef HAVE_STDIO_H +# include #endif -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif #endif #ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif # include #endif -#ifdef HAVE_STRINGS_H -# include -#endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif" +ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS @@ -639,8 +666,16 @@ LIBOBJS ALLOCA HAVE_SYS_UN_H_FALSE HAVE_SYS_UN_H_TRUE +USE_OSSFUZZ_STATIC_FALSE +USE_OSSFUZZ_STATIC_TRUE +USE_OSSFUZZ_FLAG_FALSE +USE_OSSFUZZ_FLAG_TRUE +LIB_FUZZING_ENGINE +USE_OSSFUZZERS_FALSE +USE_OSSFUZZERS_TRUE BUILD_EXAMPLES_FALSE BUILD_EXAMPLES_TRUE +CPP LIBSREQUIRED LIBZ_PREFIX LTLIBZ @@ -674,6 +709,7 @@ LIBSSL_PREFIX LTLIBSSL LIBSSL HAVE_LIBSSL +CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL @@ -689,6 +725,8 @@ ac_ct_DUMPBIN DUMPBIN LD FGREP +EGREP +GREP LIBTOOL OBJDUMP DLLTOOL @@ -697,9 +735,12 @@ SSHD_FALSE SSHD_TRUE SSHD LN_S -EGREP -GREP -CPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE @@ -725,6 +766,9 @@ build_vendor build_cpu build LIBSSH2VER +CSCOPE +ETAGS +CTAGS am__untar am__tar AMTAR @@ -827,6 +871,7 @@ enable_clear_memory enable_debug enable_hidden_symbols enable_examples_build +enable_ossfuzzers enable_werror ' ac_precious_vars='build_alias @@ -837,8 +882,12 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -CPP -LT_SYS_LIBRARY_PATH' +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CXXCPP +CPP' # Initialize some variables set by options. @@ -907,8 +956,6 @@ do *) ac_optarg=yes ;; esac - # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -949,9 +996,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -975,9 +1022,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1188,9 +1235,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1204,9 +1251,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1250,9 +1297,9 @@ Try \`$0 --help' for more information" *) # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; @@ -1268,7 +1315,7 @@ if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1332,7 +1379,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | +printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -1497,6 +1544,7 @@ Optional Features: --enable-examples-build Build example applications (this is the default) --disable-examples-build Do not build example applications + --enable-ossfuzzers Whether to generate the fuzzers for OSS-Fuzz --enable-werror Enable compiler warnings as errors --disable-werror Disable compiler warnings as errors @@ -1536,9 +1584,12 @@ Some influential environment variables: LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory - CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags LT_SYS_LIBRARY_PATH User-defined run-time library search path. + CXXCPP C++ preprocessor + CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1559,9 +1610,9 @@ if test "$ac_init_help" = "recursive"; then case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -1589,7 +1640,8 @@ esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -1597,7 +1649,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1607,9 +1659,9 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libssh2 configure - -generated by GNU Autoconf 2.69 +generated by GNU Autoconf 2.71 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1626,14 +1678,14 @@ fi ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1641,14 +1693,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1665,17 +1718,18 @@ fi ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof ($2)) return 0; @@ -1683,12 +1737,13 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -1696,101 +1751,23 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in @@ -1798,26 +1775,28 @@ fi ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile @@ -1828,14 +1807,14 @@ $as_echo "$ac_res" >&6; } ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1843,17 +1822,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1868,17 +1848,57 @@ fi } # ac_fn_c_try_link +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. @@ -1886,16 +1906,9 @@ else #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif + which can conflict with char $2 (); below. */ +#include #undef $2 /* Override any GCC internal prototype to avoid an error. @@ -1913,172 +1926,274 @@ choke me #endif int -main () +main (void) { return $2 (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func -# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES -# --------------------------------------------- -# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR -# accordingly. -ac_fn_c_check_decl () +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - as_decl_name=`echo $2|sed 's/ *(.*//'` - as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -#ifndef $as_decl_name -#ifdef __cplusplus - (void) $as_decl_use; -#else - (void) $as_decl_name; -#endif -#endif + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_retval=1 fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval -} # ac_fn_c_check_decl +} # ac_fn_cxx_try_cpp -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ----------------------------------------- ## -## Report this to libssh2-devel@cool.haxx.se ## -## ----------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR +# ------------------------------------------------------------------ +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. +ac_fn_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_check_decl + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac -} # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by libssh2 $as_me -, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.71. Invocation command line was - $ $0 $@ + $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log @@ -2111,8 +2226,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS @@ -2147,7 +2266,7 @@ do | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -2182,11 +2301,13 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - $as_echo "## ---------------- ## + printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo @@ -2197,8 +2318,8 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -2222,7 +2343,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo @@ -2230,14 +2351,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo @@ -2245,15 +2366,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - $as_echo "## ----------- ## + printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo @@ -2261,8 +2382,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo fi test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -2276,63 +2397,48 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h +printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" + +for ac_site_file in $ac_site_files do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi @@ -2342,597 +2448,1079 @@ if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' -ac_config_headers="$ac_config_headers src/libssh2_config.h example/libssh2_config.h" +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 -$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } - # Check whether --enable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then : - enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 -$as_echo "$USE_MAINTAINER_MODE" >&6; } - if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= -fi +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; - MAINT=$MAINTAINER_MODE_TRUE +struct incomplete_array +{ + int datasize; + double data[]; +}; +struct named_init { + int number; + const wchar_t *name; + double average; +}; -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi +typedef const char *ccp; -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=0;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); -# Extract the first word of "sed", so it can be a program name with args. -set dummy sed; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SED in - [\\/]* | ?:[\\/]*) - ac_cv_path_SED="$SED" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy="$PATH:/usr/bin:/usr/local/bin" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + const char *str = ""; + int number = 0; + float fnumber = 0; - test -z "$ac_cv_path_SED" && ac_cv_path_SED="sed-was-not-found-by-configure" - ;; -esac -fi -SED=$ac_cv_path_SED -if test -n "$SED"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 -$as_echo "$SED" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + return *str && number && fnumber; +} +' +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif -if test "x$SED" = "xsed-was-not-found-by-configure"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: sed was not found, this may ruin your chances to build fine" >&5 -$as_echo "$as_me: WARNING: sed was not found, this may ruin your chances to build fine" >&2;} -fi +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; -LIBSSH2VER=`$SED -ne 's/^#define LIBSSH2_VERSION *"\(.*\)"/\1/p' ${srcdir}/include/libssh2.h` -am__api_version='1.16' +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; - done -IFS=$as_save_IFS +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' -rm -rf conftest.one conftest.two conftest.dir +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif -rm -f conftest.file +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi +namespace { -if test x"${install_sh+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; + +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' + +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif + +namespace cxx11test +{ + constexpr int get_val() { return 20; } + + struct testinit + { + int i; + double d; + }; + + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} + + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + + +# Auxiliary files required by this configure script. +ac_aux_files="config.rpath ltmain.sh compile config.guess config.sub missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH +as_found=false +for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break fi + ac_first_candidate=false + + as_found=false done - done IFS=$as_save_IFS +if $as_found +then : +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +ac_config_headers="$ac_config_headers src/libssh2_config.h" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else $as_nop + USE_MAINTAINER_MODE=no +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= fi + MAINT=$MAINTAINER_MODE_TRUE + +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +# Extract the first word of "sed", so it can be a program name with args. +set dummy sed; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SED in + [\\/]* | ?:[\\/]*) + ac_cv_path_SED="$SED" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/bin:/usr/local/bin" +for as_dir in $as_dummy do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SED="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS + test -z "$ac_cv_path_SED" && ac_cv_path_SED="sed-was-not-found-by-configure" + ;; +esac fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } +SED=$ac_cv_path_SED +if test -n "$SED"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +printf "%s\n" "$SED" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi + + +if test "x$SED" = "xsed-was-not-found-by-configure"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: sed was not found, this may ruin your chances to build fine" >&5 +printf "%s\n" "$as_me: WARNING: sed was not found, this may ruin your chances to build fine" >&2;} fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +LIBSSH2VER=`$SED -ne 's/^#define LIBSSH2_VERSION *"\(.*\)"/\1/p' ${srcdir}/include/libssh2.h` +am__api_version='1.16' + + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + done IFS=$as_save_IFS -fi +rm -rf conftest.one conftest.two conftest.dir - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" + INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2941,61 +3529,216 @@ IFS=$as_save_IFS fi fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - test -n "$AWK" && break +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi done + done +IFS=$as_save_IFS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else - am__leading_dot=_ + STRIP="$ac_cv_prog_STRIP" fi -rmdir .tst 2>/dev/null -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured @@ -3019,14 +3762,10 @@ fi VERSION='-' -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. @@ -3066,6 +3805,20 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile @@ -3109,35 +3862,38 @@ END fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libssh2 version" >&5 -$as_echo_n "checking libssh2 version... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBSSH2VER" >&5 -$as_echo "$LIBSSH2VER" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking libssh2 version" >&5 +printf %s "checking libssh2 version... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBSSH2VER" >&5 +printf "%s\n" "$LIBSSH2VER" >&6; } AB_VERSION=$LIBSSH2VER -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; @@ -3156,21 +3912,22 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; @@ -3196,19 +3953,19 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac if test -z "$AB_PACKAGE"; then AB_PACKAGE=${PACKAGE_NAME:-$PACKAGE} fi - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild project... $AB_PACKAGE" >&5 -$as_echo "$as_me: autobuild project... $AB_PACKAGE" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild project... $AB_PACKAGE" >&5 +printf "%s\n" "$as_me: autobuild project... $AB_PACKAGE" >&6;} if test -z "$AB_VERSION"; then AB_VERSION=${PACKAGE_VERSION:-$VERSION} fi - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild revision... $AB_VERSION" >&5 -$as_echo "$as_me: autobuild revision... $AB_VERSION" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild revision... $AB_VERSION" >&5 +printf "%s\n" "$as_me: autobuild revision... $AB_VERSION" >&6;} hostname=`hostname` if test "$hostname"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild hostname... $hostname" >&5 -$as_echo "$as_me: autobuild hostname... $hostname" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild hostname... $hostname" >&5 +printf "%s\n" "$as_me: autobuild hostname... $hostname" >&6;} fi @@ -3218,8 +3975,8 @@ $as_echo "$as_me: autobuild hostname... $hostname" >&6;} date=`date` fi if test "$date"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: autobuild timestamp... $date" >&5 -$as_echo "$as_me: autobuild timestamp... $date" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: autobuild timestamp... $date" >&5 +printf "%s\n" "$as_me: autobuild timestamp... $date" >&6;} fi @@ -3232,12 +3989,9 @@ case "$host" in CFLAGS="$CFLAGS -DLIBSSH2_WIN32" LIBS="$LIBS -lws2_32" ;; - *-cygwin) - CFLAGS="$CFLAGS -DLIBSSH2_WIN32" + *darwin*) + CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" ;; - *darwin*) - CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" - ;; *hpux*) ;; *osf*) @@ -3247,12 +4001,21 @@ case "$host" in ;; esac + + + + + + + + + DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 -$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out @@ -3288,11 +4051,12 @@ esac fi done rm -f confinc.* confmf.* -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 -$as_echo "${_am_result}" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : +if test ${enable_dependency_tracking+y} +then : enableval=$enable_dependency_tracking; fi @@ -3318,11 +4082,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3330,11 +4095,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3345,11 +4114,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3358,11 +4127,12 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3370,11 +4140,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3385,11 +4159,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -3397,8 +4171,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3411,11 +4185,12 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3423,11 +4198,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3438,11 +4217,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3451,11 +4230,12 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3464,15 +4244,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3488,18 +4272,18 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3510,11 +4294,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3522,11 +4307,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3537,11 +4326,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3554,11 +4343,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3566,11 +4356,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3581,11 +4375,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3597,34 +4391,138 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi +else + CC="$ac_cv_prog_CC" fi fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do +for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -3634,7 +4532,7 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done @@ -3642,7 +4540,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -3654,9 +4552,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" @@ -3677,11 +4575,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -3698,7 +4597,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3714,44 +4613,46 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else +else $as_nop ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -3765,15 +4666,15 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext @@ -3782,7 +4683,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -3794,8 +4695,8 @@ _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in @@ -3803,10 +4704,10 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in @@ -3814,39 +4715,40 @@ $as_echo "$ac_try_echo"; } >&5 *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -3860,11 +4762,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -3873,31 +4776,32 @@ $as_echo "$ac_try_echo"; } >&5 break;; esac done -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -3907,29 +4811,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+set} +ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -3938,57 +4846,60 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes -else +else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -4003,117 +4914,169 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} +$ac_c_conftest_c11_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4141,8 +5104,8 @@ _ACEOF rm -f core conftest* unset am_i fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. @@ -4160,11 +5123,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For @@ -4271,8 +5235,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if @@ -4287,455 +5251,89 @@ fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes +ac_header= ac_cache= +for ac_item in $ac_header_c_list do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" +ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +if test "x$ac_cv_type_long_long" = xyes +then : +printf "%s\n" "#define HAVE_LONGLONG 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac + longlong="yes" - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else + # + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is already defined" >&5 +printf %s "checking if _REENTRANT is already defined... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -#include + + int -main () +main (void) { - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" -if test "x$ac_cv_type_long_long" = xyes; then : - -$as_echo "#define HAVE_LONGLONG 1" >>confdefs.h - - longlong="yes" - -fi - - - - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is already defined" >&5 -$as_echo_n "checking if _REENTRANT is already defined... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - - -int -main () -{ - -#ifdef _REENTRANT - int dummy=1; -#else - force compilation error -#endif + +#ifdef _REENTRANT + int dummy=1; +#else + force compilation error +#endif ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } tmp_reentrant_initially_defined="yes" -else +else $as_nop - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } tmp_reentrant_initially_defined="no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # if test "$tmp_reentrant_initially_defined" = "no"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is actually needed" >&5 -$as_echo_n "checking if _REENTRANT is actually needed... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is actually needed" >&5 +printf %s "checking if _REENTRANT is actually needed... " >&6; } case $host in *-*-solaris* | *-*-hpux*) @@ -4748,21 +5346,21 @@ $as_echo_n "checking if _REENTRANT is actually needed... " >&6; } if test "$tmp_need_reentrant" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is onwards defined" >&5 -$as_echo_n "checking if _REENTRANT is onwards defined... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _REENTRANT is onwards defined" >&5 +printf %s "checking if _REENTRANT is onwards defined... " >&6; } if test "$tmp_reentrant_initially_defined" = "yes" || test "$tmp_need_reentrant" = "yes"; then -$as_echo "#define NEED_REENTRANT 1" >>confdefs.h +printf "%s\n" "#define NEED_REENTRANT 1" >>confdefs.h cat >>confdefs.h <<_EOF #ifndef _REENTRANT @@ -4770,21 +5368,22 @@ cat >>confdefs.h <<_EOF #endif _EOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi # # Some systems (Solaris?) have socket() in -lsocket. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -$as_echo_n "checking for library containing socket... " >&6; } -if ${ac_cv_search_socket+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +printf %s "checking for library containing socket... " >&6; } +if test ${ac_cv_search_socket+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4792,57 +5391,60 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char socket (); int -main () +main (void) { return socket (); ; return 0; } _ACEOF -for ac_lib in '' socket; do +for ac_lib in '' socket +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_socket=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_socket+:} false; then : + if test ${ac_cv_search_socket+y} +then : break fi done -if ${ac_cv_search_socket+:} false; then : +if test ${ac_cv_search_socket+y} +then : -else +else $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -$as_echo "$ac_cv_search_socket" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Solaris has inet_addr() in -lnsl. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_addr" >&5 -$as_echo_n "checking for library containing inet_addr... " >&6; } -if ${ac_cv_search_inet_addr+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing inet_addr" >&5 +printf %s "checking for library containing inet_addr... " >&6; } +if test ${ac_cv_search_inet_addr+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4850,46 +5452,48 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char inet_addr (); int -main () +main (void) { return inet_addr (); ; return 0; } _ACEOF -for ac_lib in '' nsl; do +for ac_lib in '' nsl +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_inet_addr=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_inet_addr+:} false; then : + if test ${ac_cv_search_inet_addr+y} +then : break fi done -if ${ac_cv_search_inet_addr+:} false; then : +if test ${ac_cv_search_inet_addr+y} +then : -else +else $as_nop ac_cv_search_inet_addr=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_addr" >&5 -$as_echo "$ac_cv_search_inet_addr" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_addr" >&5 +printf "%s\n" "$ac_cv_search_inet_addr" >&6; } ac_res=$ac_cv_search_inet_addr -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi @@ -4905,11 +5509,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4917,11 +5522,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4932,11 +5541,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4945,11 +5554,12 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -4957,11 +5567,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4972,11 +5586,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -4984,8 +5598,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -4998,11 +5612,12 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -5010,11 +5625,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5025,11 +5644,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5038,11 +5657,12 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -5051,15 +5671,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5075,18 +5699,18 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5097,11 +5721,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -5109,11 +5734,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5124,11 +5753,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5141,11 +5770,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -5153,11 +5783,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5168,11 +5802,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5184,34 +5818,138 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi +else + CC="$ac_cv_prog_CC" fi fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do +for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -5221,20 +5959,21 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -5244,29 +5983,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+set} +ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -5275,57 +6018,60 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes -else +else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -5340,94 +6086,144 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_c89=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC - fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi fi ac_ext=c @@ -5436,21 +6232,23 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -5478,8 +6276,8 @@ _ACEOF rm -f core conftest* unset am_i fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. @@ -5497,11 +6295,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For @@ -5608,8 +6407,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if @@ -5624,125 +6423,47 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -for ac_prog in sshd -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SSHD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SSHD in - [\\/]* | ?:[\\/]*) - ac_cv_path_SSHD="$SSHD" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR /usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SSHD="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SSHD=$ac_cv_path_SSHD -if test -n "$SSHD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SSHD" >&5 -$as_echo "$SSHD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - test -n "$SSHD" && break -done - if test -n "$SSHD"; then - SSHD_TRUE= - SSHD_FALSE='#' -else - SSHD_TRUE='#' - SSHD_FALSE= -fi -enable_win32_dll=yes -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5751,38 +6472,47 @@ IFS=$as_save_IFS fi fi -AS=$ac_cv_prog_AS -if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -$as_echo "$AS" >&6; } +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + test -n "$CXX" && break + done fi -if test -z "$ac_cv_prog_AS"; then - ac_ct_AS=$AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AS"; then - ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5791,182 +6521,542 @@ IFS=$as_save_IFS fi fi -ac_ct_AS=$ac_cv_prog_ac_ct_AS -if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -$as_echo "$ac_ct_AS" >&6; } +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_AS" = x; then - AS="false" + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - AS=$ac_ct_AS + CXX=$ac_ct_CXX fi -else - AS="$ac_cv_prog_AS" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } done - done -IFS=$as_save_IFS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else $as_nop + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + +else $as_nop + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL + CXXFLAGS="-g" fi else - DLLTOOL="$ac_cv_prog_DLLTOOL" + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done - done -IFS=$as_save_IFS +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi - +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +for ac_prog in sshd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SSHD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SSHD in + [\\/]* | ?:[\\/]*) + ac_cv_path_SSHD="$SSHD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR /usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SSHD="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SSHD=$ac_cv_path_SSHD +if test -n "$SSHD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SSHD" >&5 +printf "%s\n" "$SSHD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$SSHD" && break +done + + if test -n "$SSHD"; then + SSHD_TRUE= + SSHD_FALSE='#' +else + SSHD_TRUE='#' + SSHD_FALSE= +fi + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5975,44 +7065,293 @@ IFS=$as_save_IFS fi fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - OBJDUMP=$ac_ct_OBJDUMP + AS=$ac_ct_AS fi else - OBJDUMP="$ac_cv_prog_OBJDUMP" + AS="$ac_cv_prog_AS" fi - ;; -esac - -test -z "$AS" && AS=as - - - - - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + test -z "$OBJDUMP" && OBJDUMP=objdump @@ -6024,8 +7363,8 @@ test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac @@ -6045,6 +7384,7 @@ macro_revision='2.4.6' + ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within @@ -6068,8 +7408,8 @@ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then @@ -6095,12 +7435,12 @@ func_echo_all () } case $ECHO in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; esac @@ -6116,11 +7456,12 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" @@ -6134,10 +7475,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED @@ -6146,13 +7492,13 @@ case `"$ac_path_SED" --version 2>&1` in ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" + printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -6180,8 +7526,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -6198,47 +7544,50 @@ Xsed="$SED -e 1s/^X//" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in *GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then + if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break @@ -6246,36 +7595,181 @@ case `"$ac_path_FGREP" --version 2>&1` in rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac - $ac_path_FGREP_found && break 3 + $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else - ac_cv_path_FGREP=$FGREP + ac_cv_path_GREP=$GREP fi - fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + @@ -6286,17 +7780,18 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw @@ -6325,15 +7820,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do @@ -6362,18 +7858,19 @@ fi LD=$lt_cv_path_LD if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -6396,11 +7893,12 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM @@ -6450,8 +7948,8 @@ else : ${lt_cv_path_NM=no} fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else @@ -6464,11 +7962,12 @@ else do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else @@ -6476,11 +7975,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6491,11 +7994,11 @@ fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6508,11 +8011,12 @@ if test -z "$DUMPBIN"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else @@ -6520,11 +8024,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6535,11 +8043,11 @@ fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6551,8 +8059,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN @@ -6580,11 +8088,12 @@ test -z "$NM" && NM=nm -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) @@ -6600,15 +8109,16 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop i=0 teststring=ABCD @@ -6735,11 +8245,11 @@ else fi if test -n "$lt_cv_sys_max_cmd_len"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -6783,11 +8293,12 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $host in *-*-mingw* ) case $build in @@ -6823,18 +8334,19 @@ esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in @@ -6850,22 +8362,23 @@ esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_reload_flag='-r' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -6898,11 +8411,12 @@ esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else @@ -6910,11 +8424,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6925,11 +8443,11 @@ fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6938,11 +8456,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else @@ -6950,11 +8469,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6965,11 +8488,11 @@ fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then @@ -6977,8 +8500,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP @@ -6994,11 +8517,12 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' @@ -7194,8 +8718,8 @@ os2*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no @@ -7239,11 +8763,12 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -7251,11 +8776,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7266,11 +8795,11 @@ fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7279,11 +8808,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -7291,11 +8821,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7306,11 +8840,11 @@ fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -7318,8 +8852,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -7336,11 +8870,12 @@ test -z "$DLLTOOL" && DLLTOOL=dlltool -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in @@ -7363,8 +8898,8 @@ cygwin* | mingw* | pw32* | cegcc*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO @@ -7379,11 +8914,12 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else @@ -7391,11 +8927,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7406,11 +8946,11 @@ fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7423,11 +8963,12 @@ if test -z "$AR"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else @@ -7435,11 +8976,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7450,11 +8995,11 @@ fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7466,8 +9011,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR @@ -7475,7 +9020,7 @@ esac fi : ${AR=ar} -: ${AR_FLAGS=cru} +: ${AR_FLAGS=cr} @@ -7487,30 +9032,32 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. @@ -7518,7 +9065,7 @@ if ac_fn_c_try_compile "$LINENO"; then : { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ @@ -7527,11 +9074,11 @@ if ac_fn_c_try_compile "$LINENO"; then : rm -f conftest.* libconftest.a fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= @@ -7548,11 +9095,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -7560,11 +9108,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7575,11 +9127,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7588,11 +9140,12 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -7600,11 +9153,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7615,11 +9172,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -7627,8 +9184,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -7647,11 +9204,12 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else @@ -7659,11 +9217,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7674,11 +9236,11 @@ fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7687,11 +9249,12 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else @@ -7699,11 +9262,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7714,11 +9281,11 @@ fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then @@ -7726,8 +9293,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB @@ -7816,11 +9383,12 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -7972,7 +9540,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm @@ -8045,7 +9613,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi @@ -8080,11 +9648,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } fi # Response file support. @@ -8130,13 +9698,14 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : +if test ${with_sysroot+y} +then : withval=$with_sysroot; -else +else $as_nop with_sysroot=no fi @@ -8154,24 +9723,25 @@ case $with_sysroot in #( no|'') ;; #( *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -$as_echo "$with_sysroot" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 -$as_echo_n "checking for a working dd... " >&6; } -if ${ac_cv_path_lt_DD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} @@ -8182,10 +9752,15 @@ if test -z "$lt_DD"; then for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in dd; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ @@ -8205,15 +9780,16 @@ fi rm -f conftest.i conftest2.i conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 -$as_echo "$ac_cv_path_lt_DD" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 -$as_echo_n "checking how to truncate binary pipes... " >&6; } -if ${lt_cv_truncate_bin+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= @@ -8224,8 +9800,8 @@ fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 -$as_echo "$lt_cv_truncate_bin" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -8248,7 +9824,8 @@ func_cc_basename () } # Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : +if test ${enable_libtool_lock+y} +then : enableval=$enable_libtool_lock; fi @@ -8264,7 +9841,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) @@ -8284,7 +9861,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in @@ -8322,7 +9899,7 @@ mips64*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in @@ -8363,7 +9940,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) @@ -8426,11 +10003,12 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -8441,19 +10019,20 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_cc_needs_belf=yes -else +else $as_nop lt_cv_cc_needs_belf=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -8462,8 +10041,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS @@ -8476,7 +10055,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) @@ -8513,11 +10092,12 @@ need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else @@ -8525,11 +10105,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8540,11 +10124,11 @@ fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8553,11 +10137,12 @@ if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else @@ -8565,11 +10150,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8580,11 +10169,11 @@ fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then @@ -8592,8 +10181,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL @@ -8603,11 +10192,12 @@ else fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out @@ -8617,8 +10207,8 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi @@ -8633,11 +10223,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else @@ -8645,11 +10236,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8660,11 +10255,11 @@ fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8673,11 +10268,12 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else @@ -8685,11 +10281,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8700,11 +10300,11 @@ fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then @@ -8712,8 +10312,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL @@ -8725,11 +10325,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else @@ -8737,11 +10338,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8752,11 +10357,11 @@ fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8765,11 +10370,12 @@ if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else @@ -8777,11 +10383,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8792,11 +10402,11 @@ fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then @@ -8804,8 +10414,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT @@ -8817,11 +10427,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else @@ -8829,11 +10440,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8844,11 +10459,11 @@ fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8857,11 +10472,12 @@ if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else @@ -8869,11 +10485,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8884,11 +10504,11 @@ fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then @@ -8896,8 +10516,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO @@ -8909,11 +10529,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else @@ -8921,11 +10542,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8936,11 +10561,11 @@ fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8949,11 +10574,12 @@ if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else @@ -8961,11 +10587,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8976,11 +10606,11 @@ fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then @@ -8988,8 +10618,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL @@ -9001,11 +10631,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else @@ -9013,11 +10644,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9028,11 +10663,11 @@ fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9041,11 +10676,12 @@ if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else @@ -9053,11 +10689,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9068,11 +10708,11 @@ fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then @@ -9080,8 +10720,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 @@ -9116,11 +10756,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override @@ -9149,14 +10790,15 @@ else rm -f conftest.* fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym @@ -9165,39 +10807,41 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_ld_exported_symbols_list=yes -else +else $as_nop lt_cv_ld_exported_symbols_list=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 + echo "$AR cr libconftest.a conftest.o" >&5 + $AR cr libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF @@ -9217,8 +10861,8 @@ _LT_EOF rm -rf conftest.dSYM fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; @@ -9229,11 +10873,11 @@ $as_echo "$lt_cv_ld_force_load" >&6; } # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + 10.0,*86*-darwin8*|10.0,*-darwin[912]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) + 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; @@ -9289,18 +10933,24 @@ func_munge_path_list () esac } -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi -done + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf @@ -9315,7 +10965,8 @@ done # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : +if test ${enable_shared+y} +then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; @@ -9333,7 +10984,7 @@ if test "${enable_shared+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_shared=yes fi @@ -9346,7 +10997,8 @@ fi # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : +if test ${enable_static+y} +then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; @@ -9364,7 +11016,7 @@ if test "${enable_static+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_static=yes fi @@ -9378,7 +11030,8 @@ fi # Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : +if test ${with_pic+y} +then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; @@ -9395,7 +11048,7 @@ if test "${with_pic+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop pic_mode=default fi @@ -9407,7 +11060,8 @@ fi # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : +if test ${enable_fast_install+y} +then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; @@ -9425,7 +11079,7 @@ if test "${enable_fast_install+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_fast_install=yes fi @@ -9439,11 +11093,12 @@ fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 -$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. -if test "${with_aix_soname+set}" = set; then : +if test ${with_aix_soname+y} +then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; @@ -9452,18 +11107,19 @@ if test "${with_aix_soname+set}" = set; then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else - if ${lt_cv_with_aix_soname+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 -$as_echo "$with_aix_soname" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', @@ -9545,11 +11201,12 @@ if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then @@ -9560,17 +11217,15 @@ else fi rmdir .libs 2>/dev/null fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h @@ -9616,11 +11271,12 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -9669,11 +11325,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9682,11 +11338,12 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -9735,11 +11392,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9824,11 +11481,12 @@ if test yes = "$GCC"; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -9859,8 +11517,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -10223,26 +11881,28 @@ case $host_os in ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -10273,8 +11933,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in @@ -10302,11 +11962,12 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" @@ -10330,8 +11991,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : @@ -10345,11 +12006,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -10392,19 +12054,20 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -10447,8 +12110,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -10456,19 +12119,19 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -10480,8 +12143,8 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -11039,21 +12702,23 @@ _LT_EOF if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -11068,7 +12733,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -11092,21 +12757,23 @@ fi if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -11121,7 +12788,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -11372,11 +13039,12 @@ fi # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" @@ -11400,8 +13068,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' @@ -11441,28 +13109,30 @@ fi # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_irix_exported_symbol=yes -else +else $as_nop lt_cv_irix_exported_symbol=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi @@ -11743,8 +13413,8 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -11780,18 +13450,19 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest @@ -11809,7 +13480,7 @@ else if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no @@ -11823,8 +13494,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac @@ -11983,8 +13654,8 @@ esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in @@ -12545,9 +14216,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir @@ -12557,19 +14229,21 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : lt_cv_shlibpath_overrides_runpath=yes fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -12813,8 +14487,8 @@ uts4*) dynamic_linker=no ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -12935,8 +14609,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || @@ -12960,8 +14634,8 @@ else # directories. hardcode_action=unsupported fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then @@ -13005,11 +14679,12 @@ else darwin*) # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13018,32 +14693,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else +else $as_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= @@ -13063,14 +14737,16 @@ fi *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : +if test "x$ac_cv_func_shl_load" = xyes +then : lt_cv_dlopen=shl_load -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13079,41 +14755,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char shl_load (); int -main () +main (void) { return shl_load (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dld_shl_load=yes -else +else $as_nop ac_cv_lib_dld_shl_load=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else +else $as_nop ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : +if test "x$ac_cv_func_dlopen" = xyes +then : lt_cv_dlopen=dlopen -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13122,373 +14799,3719 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); int -main () +main (void) { -return dld_link (); + ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld -fi - - +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes fi - - fi - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir fi + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath -fi + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi -fi + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; - ;; - esac +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; - if test no = "$lt_cv_dlopen"; then - enable_dlopen=no +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' else - enable_dlopen=yes + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS=$CPPFLAGS - test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; - save_LDFLAGS=$LDFLAGS - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; - save_LIBS=$LIBS - LIBS="$lt_cv_dlopen_libs $LIBS" +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; -#if HAVE_DLFCN_H -#include -#endif +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; -#include +rdos*) + dynamic_linker=no + ;; -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; -/* When -fvisibility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; esac - else : - # compilation failed - lt_cv_dlopen_self=no fi -fi -rm -fr conftest* + sys_lib_dlsearch_path_spec='/usr/lib' + ;; +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; - if test yes = "$lt_cv_dlopen_self"; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no -#if HAVE_DLFCN_H -#include -#endif +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi -#include +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec -/* When -fvisibility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - CPPFLAGS=$save_CPPFLAGS - LDFLAGS=$save_LDFLAGS - LIBS=$save_LIBS - ;; - esac - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi @@ -13506,35 +18529,6 @@ fi -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP"; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi @@ -13547,59 +18541,73 @@ fi - # Report what library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test no = "$can_build_shared" && enable_shared=no - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test yes = "$enable_shared" && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[4-9]*) - if test ia64 != "$host_cpu"; then - case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in - yes,aix,yes) ;; # shared object as lib.so file only - yes,svr4,*) ;; # shared object as lib.so archive member only - yes,*) enable_static=no ;; # shared object in lib.a archive as well - esac - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test yes = "$enable_shared" || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi -fi + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -CC=$lt_save_CC - @@ -13622,11 +18630,12 @@ CC=$lt_save_CC # Only expand once: - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13637,7 +18646,8 @@ else typedef int dummy; _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. @@ -13661,7 +18671,7 @@ if ac_fn_c_try_compile "$LINENO"; then : fi done fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13670,7 +18680,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext #include int -main () +main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ @@ -13682,7 +18692,8 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13690,7 +18701,7 @@ if ac_fn_c_try_compile "$LINENO"; then : #include int -main () +main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian @@ -13700,14 +18711,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_bigendian=yes -else +else $as_nop ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). @@ -13716,7 +18728,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext #include int -main () +main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros @@ -13726,14 +18738,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { #ifndef _BIG_ENDIAN not big endian @@ -13743,31 +18756,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_bigendian=yes -else +else $as_nop ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -short int ascii_mm[] = +unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = + unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } - short int ebcdic_ii[] = + unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = + unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; @@ -13775,14 +18790,15 @@ short int ascii_mm[] = extern int foo; int -main () +main (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi @@ -13795,13 +18811,13 @@ if ac_fn_c_try_compile "$LINENO"; then : fi fi fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { /* Are we little or big endian? From Harbison&Steele. */ @@ -13817,9 +18833,10 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_c_bigendian=no -else +else $as_nop ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -13828,17 +18845,17 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) - $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h + printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h +printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) @@ -13848,17 +18865,19 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h # Check whether --enable-largefile was given. -if test "${enable_largefile+set}" = set; then : +if test ${enable_largefile+y} +then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 -$as_echo_n "checking for special C compiler options needed for large files... " >&6; } -if ${ac_cv_sys_largefile_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC @@ -13872,44 +18891,47 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : break fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam CC="$CC -n32" - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_largefile_CC=' -n32'; break fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 -$as_echo "$ac_cv_sys_largefile_CC" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 -$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } -if ${ac_cv_sys_file_offset_bits+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} +then : + printf %s "(cached) " >&6 +else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13918,22 +18940,23 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_file_offset_bits=no; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 @@ -13942,43 +18965,43 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_file_offset_bits=64; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 -$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) -cat >>confdefs.h <<_ACEOF -#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits -_ACEOF +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 -$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } -if ${ac_cv_sys_large_files+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} +then : + printf %s "(cached) " >&6 +else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13987,22 +19010,23 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_large_files=no; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 @@ -14011,40 +19035,37 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_sys_large_files=1; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 -$as_echo "$ac_cv_sys_large_files" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) -cat >>confdefs.h <<_ACEOF -#define _LARGE_FILES $ac_cv_sys_large_files -_ACEOF +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h ;; esac rm -rf conftest* fi - - fi @@ -14062,9 +19083,10 @@ crypto_errors="" # Check whether --with-crypto was given. -if test "${with_crypto+set}" = set; then : +if test ${with_crypto+y} +then : withval=$with_crypto; use_crypto=$withval -else +else $as_nop use_crypto=auto fi @@ -14090,9 +19112,10 @@ case "${use_crypto}" in # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi @@ -14112,8 +19135,8 @@ fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 -$as_echo_n "checking for ld used by GCC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +printf %s "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -14142,15 +19165,16 @@ $as_echo_n "checking for ld used by GCC... " >&6; } ;; esac elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${acl_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${acl_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do @@ -14176,18 +19200,19 @@ fi LD="$acl_cv_path_LD" if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${acl_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${acl_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$acl_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5 +printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 -$as_echo_n "checking for shared library run path origin... " >&6; } -if ${acl_cv_rpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +printf %s "checking for shared library run path origin... " >&6; } +if test ${acl_cv_rpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh @@ -14216,8 +19243,8 @@ else acl_cv_rpath=done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 -$as_echo "$acl_cv_rpath" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +printf "%s\n" "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" @@ -14228,9 +19255,10 @@ $as_echo "$acl_cv_rpath" >&6; } acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. -if test "${enable_rpath+set}" = set; then : +if test ${enable_rpath+y} +then : enableval=$enable_rpath; : -else +else $as_nop enable_rpath=yes fi @@ -14291,7 +19319,8 @@ if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_cr # Check whether --with-libssl-prefix was given. -if test "${with_libssl_prefix+set}" = set; then : +if test ${with_libssl_prefix+y} +then : withval=$with_libssl_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -14733,11 +19762,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libssl" >&5 -$as_echo_n "checking for libssl... " >&6; } -if ${ac_cv_libssl+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libssl" >&5 +printf %s "checking for libssl... " >&6; } +if test ${ac_cv_libssl+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" LIBS="$LIBS $LIBSSL" @@ -14745,34 +19775,35 @@ else /* end confdefs.h. */ #include int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_libssl=yes -else +else $as_nop ac_cv_libssl=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libssl" >&5 -$as_echo "$ac_cv_libssl" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libssl" >&5 +printf "%s\n" "$ac_cv_libssl" >&6; } if test "$ac_cv_libssl" = yes; then HAVE_LIBSSL=yes -$as_echo "#define HAVE_LIBSSL 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBSSL 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libssl" >&5 -$as_echo_n "checking how to link with libssl... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBSSL" >&5 -$as_echo "$LIBSSL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libssl" >&5 +printf %s "checking how to link with libssl... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBSSL" >&5 +printf "%s\n" "$LIBSSL" >&6; } else HAVE_LIBSSL=no CPPFLAGS="$ac_save_CPPFLAGS" @@ -14793,23 +19824,19 @@ $as_echo "$LIBSSL" >&6; } if test "$ac_cv_libssl" = "yes"; then : -$as_echo "#define LIBSSH2_OPENSSL 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_OPENSSL 1" >>confdefs.h LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libssl libcrypto" # Not all OpenSSL have AES-CTR functions. libssh2_save_LIBS="$LIBS" LIBS="$LIBS $LIBSSL" - for ac_func in EVP_aes_128_ctr -do : - ac_fn_c_check_func "$LINENO" "EVP_aes_128_ctr" "ac_cv_func_EVP_aes_128_ctr" -if test "x$ac_cv_func_EVP_aes_128_ctr" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_EVP_AES_128_CTR 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "EVP_aes_128_ctr" "ac_cv_func_EVP_aes_128_ctr" +if test "x$ac_cv_func_EVP_aes_128_ctr" = xyes +then : + printf "%s\n" "#define HAVE_EVP_AES_128_CTR 1" >>confdefs.h fi -done LIBS="$libssh2_save_LIBS" @@ -14862,7 +19889,8 @@ if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_cr # Check whether --with-libgcrypt-prefix was given. -if test "${with_libgcrypt_prefix+set}" = set; then : +if test ${with_libgcrypt_prefix+y} +then : withval=$with_libgcrypt_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -15304,11 +20332,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgcrypt" >&5 -$as_echo_n "checking for libgcrypt... " >&6; } -if ${ac_cv_libgcrypt+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libgcrypt" >&5 +printf %s "checking for libgcrypt... " >&6; } +if test ${ac_cv_libgcrypt+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" LIBS="$LIBS $LIBGCRYPT" @@ -15316,34 +20345,35 @@ else /* end confdefs.h. */ #include int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_libgcrypt=yes -else +else $as_nop ac_cv_libgcrypt=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgcrypt" >&5 -$as_echo "$ac_cv_libgcrypt" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgcrypt" >&5 +printf "%s\n" "$ac_cv_libgcrypt" >&6; } if test "$ac_cv_libgcrypt" = yes; then HAVE_LIBGCRYPT=yes -$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBGCRYPT 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libgcrypt" >&5 -$as_echo_n "checking how to link with libgcrypt... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT" >&5 -$as_echo "$LIBGCRYPT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libgcrypt" >&5 +printf %s "checking how to link with libgcrypt... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT" >&5 +printf "%s\n" "$LIBGCRYPT" >&6; } else HAVE_LIBGCRYPT=no CPPFLAGS="$ac_save_CPPFLAGS" @@ -15364,7 +20394,7 @@ $as_echo "$LIBGCRYPT" >&6; } if test "$ac_cv_libgcrypt" = "yes"; then : -$as_echo "#define LIBSSH2_LIBGCRYPT 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_LIBGCRYPT 1" >>confdefs.h found_crypto="libgcrypt" @@ -15414,7 +20444,8 @@ if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_cr # Check whether --with-libmbedcrypto-prefix was given. -if test "${with_libmbedcrypto_prefix+set}" = set; then : +if test ${with_libmbedcrypto_prefix+y} +then : withval=$with_libmbedcrypto_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -15856,11 +20887,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libmbedcrypto" >&5 -$as_echo_n "checking for libmbedcrypto... " >&6; } -if ${ac_cv_libmbedcrypto+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libmbedcrypto" >&5 +printf %s "checking for libmbedcrypto... " >&6; } +if test ${ac_cv_libmbedcrypto+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" LIBS="$LIBS $LIBMBEDCRYPTO" @@ -15868,34 +20900,35 @@ else /* end confdefs.h. */ #include int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_libmbedcrypto=yes -else +else $as_nop ac_cv_libmbedcrypto=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libmbedcrypto" >&5 -$as_echo "$ac_cv_libmbedcrypto" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libmbedcrypto" >&5 +printf "%s\n" "$ac_cv_libmbedcrypto" >&6; } if test "$ac_cv_libmbedcrypto" = yes; then HAVE_LIBMBEDCRYPTO=yes -$as_echo "#define HAVE_LIBMBEDCRYPTO 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBMBEDCRYPTO 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libmbedcrypto" >&5 -$as_echo_n "checking how to link with libmbedcrypto... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBMBEDCRYPTO" >&5 -$as_echo "$LIBMBEDCRYPTO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libmbedcrypto" >&5 +printf %s "checking how to link with libmbedcrypto... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBMBEDCRYPTO" >&5 +printf "%s\n" "$LIBMBEDCRYPTO" >&6; } else HAVE_LIBMBEDCRYPTO=no CPPFLAGS="$ac_save_CPPFLAGS" @@ -15916,8 +20949,9 @@ $as_echo "$LIBMBEDCRYPTO" >&6; } if test "$ac_cv_libmbedcrypto" = "yes"; then : -$as_echo "#define LIBSSH2_MBEDTLS 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_MBEDTLS 1" >>confdefs.h + LIBS="$LIBS -lmbedcrypto" found_crypto="mbedtls" support_clear_memory=yes @@ -15930,36 +20964,115 @@ $as_echo "#define LIBSSH2_MBEDTLS 1" >>confdefs.h crypto_errors="${crypto_errors}No mbedtls crypto library found! " fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg +fi + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + if test "$use_crypto" = "auto" && test "$found_crypto" = "none" || test "$use_crypto" = "wincng"; then # Look for Windows Cryptography API: Next Generation - for ac_header in ntdef.h ntstatus.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include + ac_fn_c_check_header_compile "$LINENO" "ntdef.h" "ac_cv_header_ntdef_h" "#include " -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +if test "x$ac_cv_header_ntdef_h" = xyes +then : + printf "%s\n" "#define HAVE_NTDEF_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "ntstatus.h" "ac_cv_header_ntstatus_h" "#include +" +if test "x$ac_cv_header_ntstatus_h" = xyes +then : + printf "%s\n" "#define HAVE_NTSTATUS_H 1" >>confdefs.h -done +fi - ac_fn_c_check_decl "$LINENO" "SecureZeroMemory" "ac_cv_have_decl_SecureZeroMemory" "#include -" -if test "x$ac_cv_have_decl_SecureZeroMemory" = xyes; then : + ac_fn_check_decl "$LINENO" "SecureZeroMemory" "ac_cv_have_decl_SecureZeroMemory" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SecureZeroMemory" = xyes +then : ac_have_decl=1 -else +else $as_nop ac_have_decl=0 fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_SECUREZEROMEMORY $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_DECL_SECUREZEROMEMORY $ac_have_decl" >>confdefs.h @@ -15996,7 +21109,8 @@ _ACEOF # Check whether --with-libcrypt32-prefix was given. -if test "${with_libcrypt32_prefix+set}" = set; then : +if test ${with_libcrypt32_prefix+y} +then : withval=$with_libcrypt32_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -16438,11 +21552,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcrypt32" >&5 -$as_echo_n "checking for libcrypt32... " >&6; } -if ${ac_cv_libcrypt32+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libcrypt32" >&5 +printf %s "checking for libcrypt32... " >&6; } +if test ${ac_cv_libcrypt32+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" LIBS="$LIBS $LIBCRYPT32" @@ -16453,34 +21568,35 @@ else #include int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_libcrypt32=yes -else +else $as_nop ac_cv_libcrypt32=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libcrypt32" >&5 -$as_echo "$ac_cv_libcrypt32" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libcrypt32" >&5 +printf "%s\n" "$ac_cv_libcrypt32" >&6; } if test "$ac_cv_libcrypt32" = yes; then HAVE_LIBCRYPT32=yes -$as_echo "#define HAVE_LIBCRYPT32 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBCRYPT32 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libcrypt32" >&5 -$as_echo_n "checking how to link with libcrypt32... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBCRYPT32" >&5 -$as_echo "$LIBCRYPT32" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libcrypt32" >&5 +printf %s "checking how to link with libcrypt32... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBCRYPT32" >&5 +printf "%s\n" "$LIBCRYPT32" >&6; } else HAVE_LIBCRYPT32=no CPPFLAGS="$ac_save_CPPFLAGS" @@ -16538,7 +21654,8 @@ $as_echo "$LIBCRYPT32" >&6; } # Check whether --with-libbcrypt-prefix was given. -if test "${with_libbcrypt_prefix+set}" = set; then : +if test ${with_libbcrypt_prefix+y} +then : withval=$with_libbcrypt_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -16980,11 +22097,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libbcrypt" >&5 -$as_echo_n "checking for libbcrypt... " >&6; } -if ${ac_cv_libbcrypt+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libbcrypt" >&5 +printf %s "checking for libbcrypt... " >&6; } +if test ${ac_cv_libbcrypt+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" LIBS="$LIBS $LIBBCRYPT" @@ -16995,34 +22113,35 @@ else #include int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_libbcrypt=yes -else +else $as_nop ac_cv_libbcrypt=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libbcrypt" >&5 -$as_echo "$ac_cv_libbcrypt" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libbcrypt" >&5 +printf "%s\n" "$ac_cv_libbcrypt" >&6; } if test "$ac_cv_libbcrypt" = yes; then HAVE_LIBBCRYPT=yes -$as_echo "#define HAVE_LIBBCRYPT 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBBCRYPT 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libbcrypt" >&5 -$as_echo_n "checking how to link with libbcrypt... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBBCRYPT" >&5 -$as_echo "$LIBBCRYPT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libbcrypt" >&5 +printf %s "checking how to link with libbcrypt... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBBCRYPT" >&5 +printf "%s\n" "$LIBBCRYPT" >&6; } else HAVE_LIBBCRYPT=no CPPFLAGS="$ac_save_CPPFLAGS" @@ -17043,7 +22162,7 @@ $as_echo "$LIBBCRYPT" >&6; } if test "$ac_cv_libbcrypt" = "yes"; then : -$as_echo "#define LIBSSH2_WINCNG 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_WINCNG 1" >>confdefs.h found_crypto="wincng" found_crypto_str="Windows Cryptography API: Next Generation" @@ -17073,8 +22192,8 @@ if test "$found_crypto" = "none"; then Specify --with-crypto=\$backend and/or the neccessary library search prefix. Known crypto backends: auto, openssl, libgcrypt, mbedtls, wincng" - { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 -$as_echo "$as_me: ERROR: ${crypto_errors}" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 +printf "%s\n" "$as_me: ERROR: ${crypto_errors}" >&6;} else test "$found_crypto_str" = "" && found_crypto_str="$found_crypto" fi @@ -17113,15 +22232,14 @@ fi - - # libz # Check whether --with-libz was given. -if test "${with_libz+set}" = set; then : +if test ${with_libz+y} +then : withval=$with_libz; use_libz=$withval -else +else $as_nop use_libz=auto fi @@ -17155,7 +22273,8 @@ if test "$use_libz" != no; then # Check whether --with-libz-prefix was given. -if test "${with_libz_prefix+set}" = set; then : +if test ${with_libz_prefix+y} +then : withval=$with_libz_prefix; if test "X$withval" = "Xno"; then use_additional=no @@ -17597,11 +22716,12 @@ fi done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libz" >&5 -$as_echo_n "checking for libz... " >&6; } -if ${ac_cv_libz+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libz" >&5 +printf %s "checking for libz... " >&6; } +if test ${ac_cv_libz+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_LIBS="$LIBS" LIBS="$LIBS $LIBZ" @@ -17609,34 +22729,35 @@ else /* end confdefs.h. */ #include int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_libz=yes -else +else $as_nop ac_cv_libz=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libz" >&5 -$as_echo "$ac_cv_libz" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libz" >&5 +printf "%s\n" "$ac_cv_libz" >&6; } if test "$ac_cv_libz" = yes; then HAVE_LIBZ=yes -$as_echo "#define HAVE_LIBZ 1" >>confdefs.h +printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libz" >&5 -$as_echo_n "checking how to link with libz... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBZ" >&5 -$as_echo "$LIBZ" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libz" >&5 +printf %s "checking how to link with libz... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBZ" >&5 +printf "%s\n" "$LIBZ" >&6; } else HAVE_LIBZ=no CPPFLAGS="$ac_save_CPPFLAGS" @@ -17653,18 +22774,18 @@ $as_echo "$LIBZ" >&6; } if test "$ac_cv_libz" != yes; then if test "$use_libz" = auto; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot find libz, disabling compression" >&5 -$as_echo "$as_me: Cannot find libz, disabling compression" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Cannot find libz, disabling compression" >&5 +printf "%s\n" "$as_me: Cannot find libz, disabling compression" >&6;} found_libz="disabled; no libz found" else libz_errors="No libz found! Try --with-libz-prefix=PATH if you know that you have it." - { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: $libz_errors" >&5 -$as_echo "$as_me: ERROR: $libz_errors" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: $libz_errors" >&5 +printf "%s\n" "$as_me: ERROR: $libz_errors" >&6;} fi else -$as_echo "#define LIBSSH2_HAVE_ZLIB 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_HAVE_ZLIB 1" >>confdefs.h LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }zlib" found_libz="yes" @@ -17677,49 +22798,53 @@ fi # Optional Settings # # Check whether --enable-crypt-none was given. -if test "${enable_crypt_none+set}" = set; then : +if test ${enable_crypt_none+y} +then : enableval=$enable_crypt_none; -$as_echo "#define LIBSSH2_CRYPT_NONE 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_CRYPT_NONE 1" >>confdefs.h fi # Check whether --enable-mac-none was given. -if test "${enable_mac_none+set}" = set; then : +if test ${enable_mac_none+y} +then : enableval=$enable_mac_none; -$as_echo "#define LIBSSH2_MAC_NONE 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_MAC_NONE 1" >>confdefs.h fi # Check whether --enable-gex-new was given. -if test "${enable_gex_new+set}" = set; then : +if test ${enable_gex_new+y} +then : enableval=$enable_gex_new; GEX_NEW=$enableval fi if test "$GEX_NEW" != "no"; then -$as_echo "#define LIBSSH2_DH_GEX_NEW 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_DH_GEX_NEW 1" >>confdefs.h fi # Check whether --enable-clear-memory was given. -if test "${enable_clear_memory+set}" = set; then : +if test ${enable_clear_memory+y} +then : enableval=$enable_clear_memory; CLEAR_MEMORY=$enableval fi if test "$CLEAR_MEMORY" != "no"; then if test "$support_clear_memory" = "yes"; then -$as_echo "#define LIBSSH2_CLEAR_MEMORY 1" >>confdefs.h +printf "%s\n" "#define LIBSSH2_CLEAR_MEMORY 1" >>confdefs.h enable_clear_memory=yes else if test "$CLEAR_MEMORY" = "yes"; then as_fn_error $? "secure clearing/zeroing of memory is not supported by the selected crypto backend" "$LINENO" 5 else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&5 -$as_echo "$as_me: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&5 +printf "%s\n" "$as_me: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&2;} fi enable_clear_memory=unsupported fi @@ -17727,24 +22852,158 @@ else if test "$support_clear_memory" = "yes"; then enable_clear_memory=no else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&5 -$as_echo "$as_me: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&5 +printf "%s\n" "$as_me: WARNING: secure clearing/zeroing of memory is not supported by the selected crypto backend" >&2;} enable_clear_memory=unsupported fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable pedantic and debug compiler options" >&5 -$as_echo_n "checking whether to enable pedantic and debug compiler options... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable pedantic and debug compiler options" >&5 +printf %s "checking whether to enable pedantic and debug compiler options... " >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : +if test ${enable_debug+y} +then : enableval=$enable_debug; case "$enable_debug" in no) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } CPPFLAGS="$CPPFLAGS -DNDEBUG" ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } enable_debug=yes CPPFLAGS="$CPPFLAGS -DLIBSSH2DEBUG" CFLAGS="$CFLAGS -g" @@ -17753,44 +23012,45 @@ $as_echo "yes" >&6; } if test "z$ICC" = "z"; then ICC="no" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc in use" >&5 -$as_echo_n "checking for icc in use... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for icc in use" >&5 +printf %s "checking for icc in use... " >&6; } if test "$GCC" = "yes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __INTEL_COMPILER _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "^__INTEL_COMPILER" >/dev/null 2>&1; then : + $EGREP "^__INTEL_COMPILER" >/dev/null 2>&1 +then : ICC="no" -else +else $as_nop ICC="yes" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi -rm -f conftest* +rm -rf conftest* fi if test "$ICC" = "no"; then # this is not ICC - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi if test "$GCC" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking gcc version" >&5 -$as_echo_n "checking gcc version... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking gcc version" >&5 +printf %s "checking gcc version... " >&6; } gccver=`$CC -dumpversion` num1=`echo $gccver | cut -d . -f1` num2=`echo $gccver | cut -d . -f2` gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gccver" >&5 -$as_echo "$gccver" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gccver" >&5 +printf "%s\n" "$gccver" >&6; } if test "$ICC" = "yes"; then @@ -17841,12 +23101,12 @@ $as_echo "$gccver" >&6; } fi CFLAGS="$CFLAGS $WARN" - { $as_echo "$as_me:${as_lineno-$LINENO}: Added this set of compiler options: $WARN" >&5 -$as_echo "$as_me: Added this set of compiler options: $WARN" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Added this set of compiler options: $WARN" >&5 +printf "%s\n" "$as_me: Added this set of compiler options: $WARN" >&6;} else - { $as_echo "$as_me:${as_lineno-$LINENO}: Added no extra compiler options" >&5 -$as_echo "$as_me: Added no extra compiler options" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Added no extra compiler options" >&5 +printf "%s\n" "$as_me: Added no extra compiler options" >&6;} fi NEWFLAGS="" @@ -17865,66 +23125,68 @@ $as_echo "$as_me: Added no extra compiler options" >&6;} ;; esac -else +else $as_nop enable_debug=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable hidden symbols in the library" >&5 -$as_echo_n "checking whether to enable hidden symbols in the library... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable hidden symbols in the library" >&5 +printf %s "checking whether to enable hidden symbols in the library... " >&6; } # Check whether --enable-hidden-symbols was given. -if test "${enable_hidden_symbols+set}" = set; then : +if test ${enable_hidden_symbols+y} +then : enableval=$enable_hidden_symbols; case "$enableval" in no) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports it" >&5 -$as_echo_n "checking whether $CC supports it... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports it" >&5 +printf %s "checking whether $CC supports it... " >&6; } if test "$GCC" = yes ; then if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define LIBSSH2_API __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define LIBSSH2_API __attribute__ ((visibility (\"default\")))" >>confdefs.h CFLAGS="$CFLAGS -fvisibility=hidden" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi else if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } -$as_echo "#define LIBSSH2_API __global" >>confdefs.h +printf "%s\n" "#define LIBSSH2_API __global" >>confdefs.h CFLAGS="$CFLAGS -xldscope=hidden" else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi ;; esac -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi # Build example applications? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build example applications" >&5 -$as_echo_n "checking whether to build example applications... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build example applications" >&5 +printf %s "checking whether to build example applications... " >&6; } # Check whether --enable-examples-build was given. -if test "${enable_examples_build+set}" = set; then : +if test ${enable_examples_build+y} +then : enableval=$enable_examples_build; case "$enableval" in no | false) build_examples='no' @@ -17933,76 +23195,150 @@ if test "${enable_examples_build+set}" = set; then : build_examples='yes' ;; esac +else $as_nop + build_examples='yes' +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $build_examples" >&5 +printf "%s\n" "$build_examples" >&6; } + if test "x$build_examples" != "xno"; then + BUILD_EXAMPLES_TRUE= + BUILD_EXAMPLES_FALSE='#' +else + BUILD_EXAMPLES_TRUE='#' + BUILD_EXAMPLES_FALSE= +fi + + + +# Build OSS fuzzing targets? +# Check whether --enable-ossfuzzers was given. +if test ${enable_ossfuzzers+y} +then : + enableval=$enable_ossfuzzers; have_ossfuzzers=yes +else $as_nop + have_ossfuzzers=no +fi + + if test "x$have_ossfuzzers" = "xyes"; then + USE_OSSFUZZERS_TRUE= + USE_OSSFUZZERS_FALSE='#' +else + USE_OSSFUZZERS_TRUE='#' + USE_OSSFUZZERS_FALSE= +fi + + + +# Set the correct flags for the given fuzzing engine. + + if test "x$LIB_FUZZING_ENGINE" = "x-fsanitize=fuzzer"; then + USE_OSSFUZZ_FLAG_TRUE= + USE_OSSFUZZ_FLAG_FALSE='#' else - build_examples='yes' + USE_OSSFUZZ_FLAG_TRUE='#' + USE_OSSFUZZ_FLAG_FALSE= fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_examples" >&5 -$as_echo "$build_examples" >&6; } - if test "x$build_examples" != "xno"; then - BUILD_EXAMPLES_TRUE= - BUILD_EXAMPLES_FALSE='#' + if test -f "$LIB_FUZZING_ENGINE"; then + USE_OSSFUZZ_STATIC_TRUE= + USE_OSSFUZZ_STATIC_FALSE='#' else - BUILD_EXAMPLES_TRUE='#' - BUILD_EXAMPLES_FALSE= + USE_OSSFUZZ_STATIC_TRUE='#' + USE_OSSFUZZ_STATIC_FALSE= fi + # Checks for header files. # AC_HEADER_STDC -for ac_header in errno.h fcntl.h stdio.h stdlib.h unistd.h sys/uio.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_header_compile "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" +if test "x$ac_cv_header_errno_h" = xyes +then : + printf "%s\n" "#define HAVE_ERRNO_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "stdio.h" "ac_cv_header_stdio_h" "$ac_includes_default" +if test "x$ac_cv_header_stdio_h" = xyes +then : + printf "%s\n" "#define HAVE_STDIO_H 1" >>confdefs.h -for ac_header in sys/select.h sys/socket.h sys/ioctl.h sys/time.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes +then : + printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_uio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UIO_H 1" >>confdefs.h -for ac_header in arpa/inet.h netinet/in.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +fi + +ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h -for ac_header in sys/un.h +fi + +ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default" +if test "x$ac_cv_header_arpa_inet_h" = xyes +then : + printf "%s\n" "#define HAVE_ARPA_INET_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h + +fi + + for ac_header in sys/un.h do : - ac_fn_c_check_header_mongrel "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_un_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_UN_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_un_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UN_H 1" >>confdefs.h have_sys_un_h=yes -else +else $as_nop have_sys_un_h=no fi done - if test "x$have_sys_un_h" = xyes; then HAVE_SYS_UN_H_TRUE= HAVE_SYS_UN_H_FALSE='#' @@ -18017,58 +23353,73 @@ case $host in # These are POSIX-like systems using BSD-like sockets API. ;; *) - for ac_header in windows.h winsock2.h ws2tcpip.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes +then : + printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" +if test "x$ac_cv_header_winsock2_h" = xyes +then : + printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h -done +fi +ac_fn_c_check_header_compile "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default" +if test "x$ac_cv_header_ws2tcpip_h" = xyes +then : + printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h + +fi ;; esac case $host in *darwin*|*interix*) - { $as_echo "$as_me:${as_lineno-$LINENO}: poll use is disabled on this platform" >&5 -$as_echo "$as_me: poll use is disabled on this platform" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: poll use is disabled on this platform" >&5 +printf "%s\n" "$as_me: poll use is disabled on this platform" >&6;} ;; *) - for ac_func in poll -do : - ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" -if test "x$ac_cv_func_poll" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_POLL 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" +if test "x$ac_cv_func_poll" = xyes +then : + printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h fi -done ;; esac -for ac_func in gettimeofday select strtoll memset_s -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes +then : + printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" +if test "x$ac_cv_func_select" = xyes +then : + printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = xyes +then : + printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memset_s" "ac_cv_func_memset_s" +if test "x$ac_cv_func_memset_s" = xyes +then : + printf "%s\n" "#define HAVE_MEMSET_S 1" >>confdefs.h fi -done if test "$ac_cv_func_select" != "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for select in ws2_32" >&5 -$as_echo_n "checking for select in ws2_32... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for select in ws2_32" >&5 +printf %s "checking for select in ws2_32... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18080,7 +23431,7 @@ $as_echo_n "checking for select in ws2_32... " >&6; } #endif int -main () +main (void) { select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL); @@ -18089,50 +23440,49 @@ main () return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } HAVE_SELECT="1" -cat >>confdefs.h <<_ACEOF -#define HAVE_SELECT 1 -_ACEOF +printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h -else +else $as_nop - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +if test "x$ac_cv_type_size_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF +printf "%s\n" "#define size_t unsigned int" >>confdefs.h fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 -$as_echo_n "checking for working alloca.h... " >&6; } -if ${ac_cv_working_alloca_h+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +printf %s "checking for working alloca.h... " >&6; } +if test ${ac_cv_working_alloca_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; @@ -18140,52 +23490,52 @@ char *p = (char *) alloca (2 * sizeof (int)); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_working_alloca_h=yes -else +else $as_nop ac_cv_working_alloca_h=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 -$as_echo "$ac_cv_working_alloca_h" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +printf "%s\n" "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then -$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 -$as_echo_n "checking for alloca... " >&6; } -if ${ac_cv_func_alloca_works+:} false; then : - $as_echo_n "(cached) " >&6 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +printf %s "checking for alloca... " >&6; } +if test ${ac_cv_func_alloca_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test $ac_cv_working_alloca_h = yes; then + ac_cv_func_alloca_works=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER +#include +#include +#ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# elif defined _MSC_VER # include # define alloca _alloca # else -# ifdef HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -void *alloca (size_t); -# endif -# endif +# ifdef __cplusplus +extern "C" # endif +void *alloca (size_t); # endif #endif int -main () +main (void) { char *p = (char *) alloca (1); if (p) return 0; @@ -18193,20 +23543,22 @@ char *p = (char *) alloca (1); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_func_alloca_works=yes -else +else $as_nop ac_cv_func_alloca_works=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 -$as_echo "$ac_cv_func_alloca_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +printf "%s\n" "$ac_cv_func_alloca_works" >&6; } +fi if test $ac_cv_func_alloca_works = yes; then -$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h +printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions @@ -18216,58 +23568,19 @@ else ALLOCA=\${LIBOBJDIR}alloca.$ac_objext -$as_echo "#define C_ALLOCA 1" >>confdefs.h - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 -$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } -if ${ac_cv_os_cray+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined CRAY && ! defined CRAY2 -webecray -#else -wenotbecray -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "webecray" >/dev/null 2>&1; then : - ac_cv_os_cray=yes -else - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 -$as_echo "$ac_cv_os_cray" >&6; } -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - -cat >>confdefs.h <<_ACEOF -#define CRAY_STACKSEG_END $ac_func -_ACEOF - - break -fi +printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h - done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 -$as_echo_n "checking stack direction for C alloca... " >&6; } -if ${ac_cv_c_stack_direction+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +printf %s "checking stack direction for C alloca... " >&6; } +if test ${ac_cv_c_stack_direction+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : ac_cv_c_stack_direction=0 -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default @@ -18288,9 +23601,10 @@ main (int argc, char **argv) return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_c_stack_direction=1 -else +else $as_nop ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -18298,27 +23612,26 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 -$as_echo "$ac_cv_c_stack_direction" >&6; } -cat >>confdefs.h <<_ACEOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +printf "%s\n" "$ac_cv_c_stack_direction" >&6; } +printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h fi # Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __cplusplus @@ -18331,7 +23644,7 @@ main () /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. + /* IBM XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ @@ -18359,7 +23672,7 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; @@ -18375,47 +23688,50 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_const=yes -else +else $as_nop ac_cv_c_const=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then -$as_echo "#define const /**/" >>confdefs.h +printf "%s\n" "#define const /**/" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } +static $ac_kw foo_t static_foo (void) {return 0; } +$ac_kw foo_t foo (void) {return 0; } #endif _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_inline=$ac_kw fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; @@ -18434,8 +23750,8 @@ esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking non-blocking sockets style" >&5 -$as_echo_n "checking non-blocking sockets style... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking non-blocking sockets style" >&5 +printf %s "checking non-blocking sockets style... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18446,7 +23762,7 @@ $as_echo_n "checking non-blocking sockets style... " >&6; } #include int -main () +main (void) { /* try to compile O_NONBLOCK */ @@ -18472,14 +23788,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="O_NONBLOCK" -$as_echo "#define HAVE_O_NONBLOCK 1" >>confdefs.h +printf "%s\n" "#define HAVE_O_NONBLOCK 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18490,7 +23807,7 @@ else #include int -main () +main (void) { /* FIONBIO source test (old-style unix) */ @@ -18501,14 +23818,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="FIONBIO" -$as_echo "#define HAVE_FIONBIO 1" >>confdefs.h +printf "%s\n" "#define HAVE_FIONBIO 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18531,7 +23849,7 @@ else #endif int -main () +main (void) { /* ioctlsocket source code */ @@ -18544,14 +23862,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="ioctlsocket" -$as_echo "#define HAVE_IOCTLSOCKET 1" >>confdefs.h +printf "%s\n" "#define HAVE_IOCTLSOCKET 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18561,7 +23880,7 @@ else #include int -main () +main (void) { /* IoctlSocket source code */ @@ -18572,14 +23891,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : nonblock="IoctlSocket" -$as_echo "#define HAVE_IOCTLSOCKET_CASE 1" >>confdefs.h +printf "%s\n" "#define HAVE_IOCTLSOCKET_CASE 1" >>confdefs.h -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18588,7 +23908,7 @@ else #include int -main () +main (void) { /* SO_NONBLOCK source code */ @@ -18600,59 +23920,60 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : nonblock="SO_NONBLOCK" -$as_echo "#define HAVE_SO_NONBLOCK 1" >>confdefs.h +printf "%s\n" "#define HAVE_SO_NONBLOCK 1" >>confdefs.h -else +else $as_nop nonblock="nada" -$as_echo "#define HAVE_DISABLED_NONBLOCKING 1" >>confdefs.h +printf "%s\n" "#define HAVE_DISABLED_NONBLOCKING 1" >>confdefs.h fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nonblock" >&5 -$as_echo "$nonblock" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $nonblock" >&5 +printf "%s\n" "$nonblock" >&6; } if test "$nonblock" = "nada"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: non-block sockets disabled" >&5 -$as_echo "$as_me: WARNING: non-block sockets disabled" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: non-block sockets disabled" >&5 +printf "%s\n" "$as_me: WARNING: non-block sockets disabled" >&2;} fi missing_required_deps=0 if test "${libz_errors}" != ""; then - { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: ${libz_errors}" >&5 -$as_echo "$as_me: ERROR: ${libz_errors}" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: ${libz_errors}" >&5 +printf "%s\n" "$as_me: ERROR: ${libz_errors}" >&6;} missing_required_deps=1 fi if test "$found_crypto" = "none"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 -$as_echo "$as_me: ERROR: ${crypto_errors}" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: ERROR: ${crypto_errors}" >&5 +printf "%s\n" "$as_me: ERROR: ${crypto_errors}" >&6;} missing_required_deps=1 fi @@ -18662,11 +23983,12 @@ fi # Configure parameters - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable compiler warnings as errors" >&5 -$as_echo_n "checking whether to enable compiler warnings as errors... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable compiler warnings as errors" >&5 +printf %s "checking whether to enable compiler warnings as errors... " >&6; } OPT_COMPILER_WERROR="default" # Check whether --enable-werror was given. -if test "${enable_werror+set}" = set; then : +if test ${enable_werror+y} +then : enableval=$enable_werror; OPT_COMPILER_WERROR=$enableval fi @@ -18681,15 +24003,15 @@ fi want_werror="yes" ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $want_werror" >&5 -$as_echo "$want_werror" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $want_werror" >&5 +printf "%s\n" "$want_werror" >&6; } if test X"$want_werror" = Xyes; then CFLAGS="$CFLAGS -Werror" fi -ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile example/Makefile docs/Makefile libssh2.pc" +ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile tests/ossfuzz/Makefile example/Makefile docs/Makefile libssh2.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -18718,8 +24040,8 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -18749,15 +24071,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else @@ -18771,8 +24093,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;} fi fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -18789,7 +24111,7 @@ U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" @@ -18804,14 +24126,14 @@ if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -18832,6 +24154,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${SSHD_TRUE}" && test -z "${SSHD_FALSE}"; then as_fn_error $? "conditional \"SSHD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -18857,6 +24183,18 @@ if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${USE_OSSFUZZERS_TRUE}" && test -z "${USE_OSSFUZZERS_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZERS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSFUZZ_FLAG_TRUE}" && test -z "${USE_OSSFUZZ_FLAG_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZ_FLAG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSFUZZ_STATIC_TRUE}" && test -z "${USE_OSSFUZZ_STATIC_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZ_STATIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${HAVE_SYS_UN_H_TRUE}" && test -z "${HAVE_SYS_UN_H_FALSE}"; then as_fn_error $? "conditional \"HAVE_SYS_UN_H\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -18866,8 +24204,8 @@ fi ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -18890,14 +24228,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -18907,46 +24247,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -18955,13 +24295,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -18970,8 +24303,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -18983,30 +24320,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] @@ -19019,13 +24336,14 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -19052,18 +24370,20 @@ as_fn_unset () { eval $1=; unset $1;} } as_unset=as_fn_unset + # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -19075,12 +24395,13 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -19111,7 +24432,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -19133,6 +24454,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -19146,6 +24471,12 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -19187,7 +24518,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -19196,7 +24527,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -19259,7 +24590,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by libssh2 $as_me -, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -19321,14 +24652,16 @@ $config_commands Report bugs to ." _ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ libssh2 config.status - -configured by $0, generated by GNU Autoconf 2.69, +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -19368,15 +24701,15 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; + printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; + printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" @@ -19384,7 +24717,7 @@ do --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; @@ -19393,7 +24726,7 @@ do as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; + printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; @@ -19421,7 +24754,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -19435,7 +24768,7 @@ exec 5>>config.log sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - $as_echo "$ac_log" + printf "%s\n" "$ac_log" } >&5 _ACEOF @@ -19589,6 +24922,60 @@ enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_sub enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' @@ -19671,7 +25058,38 @@ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ -striplib; do +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes @@ -19702,7 +25120,18 @@ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ -configure_time_lt_sys_library_path; do +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes @@ -19730,6 +25159,8 @@ fi + + _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 @@ -19739,12 +25170,12 @@ for ac_config_target in $ac_config_targets do case $ac_config_target in "src/libssh2_config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/libssh2_config.h" ;; - "example/libssh2_config.h") CONFIG_HEADERS="$CONFIG_HEADERS example/libssh2_config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "tests/ossfuzz/Makefile") CONFIG_FILES="$CONFIG_FILES tests/ossfuzz/Makefile" ;; "example/Makefile") CONFIG_FILES="$CONFIG_FILES example/Makefile" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "libssh2.pc") CONFIG_FILES="$CONFIG_FILES libssh2.pc" ;; @@ -19759,9 +25190,9 @@ done # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -20097,7 +25528,7 @@ do esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -20105,17 +25536,17 @@ do # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | + ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac @@ -20132,7 +25563,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | +printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -20156,9 +25587,9 @@ $as_echo X"$ac_file" | case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -20220,8 +25651,8 @@ ac_sed_dataroot=' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' @@ -20265,9 +25696,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -20283,20 +25714,20 @@ which seems to be undefined. Please make sure it is defined" >&2;} # if test x"$ac_file" != x-; then { - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi @@ -20316,7 +25747,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | +printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -20336,8 +25767,8 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -20363,7 +25794,7 @@ esac for am_mf do # Strip MF so we end up with the name of the file. - am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line @@ -20375,7 +25806,7 @@ $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$am_mf" | +printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -20397,7 +25828,7 @@ $as_echo X"$am_mf" | $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$am_mf" | +printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -20422,10 +25853,12 @@ $as_echo X/"$am_mf" | (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } @@ -20481,7 +25914,7 @@ See \`config.log' for more details" "$LINENO" 5; } # The names of the tagged configurations supported by this script. -available_tags='' +available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} @@ -20889,6 +26322,20 @@ file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + # ### END LIBTOOL CONFIG _LT_EOF @@ -20967,6 +26414,7 @@ _LT_EOF esac + ltmain=$ac_aux_dir/ltmain.sh @@ -20981,6 +26429,159 @@ ltmain=$ac_aux_dir/ltmain.sh (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + ;; esac @@ -21016,12 +26617,12 @@ if test "$no_create" != yes; then $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: summary of build options: +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: summary of build options: version: ${LIBSSH2VER} Host type: ${host} @@ -21036,7 +26637,7 @@ fi Path to sshd: $ac_cv_path_SSHD (only for self-tests) zlib compression: ${found_libz} " >&5 -$as_echo "$as_me: summary of build options: +printf "%s\n" "$as_me: summary of build options: version: ${LIBSSH2VER} Host type: ${host} @@ -21051,3 +26652,4 @@ $as_echo "$as_me: summary of build options: Path to sshd: $ac_cv_path_SSHD (only for self-tests) zlib compression: ${found_libz} " >&6;} + diff --git a/vendor/libssh2/configure.ac b/vendor/libssh2/configure.ac index fe5054a09..c4fc3e4e3 100644 --- a/vendor/libssh2/configure.ac +++ b/vendor/libssh2/configure.ac @@ -2,7 +2,7 @@ AC_INIT(libssh2, [-], libssh2-devel@cool.haxx.se) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src]) -AC_CONFIG_HEADERS([src/libssh2_config.h example/libssh2_config.h]) +AC_CONFIG_HEADERS([src/libssh2_config.h]) AM_MAINTAINER_MODE m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) @@ -36,12 +36,9 @@ case "$host" in CFLAGS="$CFLAGS -DLIBSSH2_WIN32" LIBS="$LIBS -lws2_32" ;; - *-cygwin) - CFLAGS="$CFLAGS -DLIBSSH2_WIN32" + *darwin*) + CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" ;; - *darwin*) - CFLAGS="$CFLAGS -DLIBSSH2_DARWIN" - ;; *hpux*) ;; *osf*) @@ -69,6 +66,7 @@ AC_SEARCH_LIBS(inet_addr, nsl) AC_SUBST(LIBS) AC_PROG_CC +AC_PROG_CXX AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET @@ -127,8 +125,6 @@ fi m4_set_foreach([crypto_backends], [backend], [AM_CONDITIONAL(m4_toupper(backend), test "$found_crypto" = "backend")] ) -m4_undefine([backend]) - # libz @@ -284,6 +280,21 @@ esac], [build_examples='yes']) AC_MSG_RESULT($build_examples) AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$build_examples" != "xno"]) + +# Build OSS fuzzing targets? +AC_ARG_ENABLE([ossfuzzers], + [AS_HELP_STRING([--enable-ossfuzzers], + [Whether to generate the fuzzers for OSS-Fuzz])], + [have_ossfuzzers=yes], [have_ossfuzzers=no]) +AM_CONDITIONAL([USE_OSSFUZZERS], [test "x$have_ossfuzzers" = "xyes"]) + + +# Set the correct flags for the given fuzzing engine. +AC_SUBST([LIB_FUZZING_ENGINE]) +AM_CONDITIONAL([USE_OSSFUZZ_FLAG], [test "x$LIB_FUZZING_ENGINE" = "x-fsanitize=fuzzer"]) +AM_CONDITIONAL([USE_OSSFUZZ_STATIC], [test -f "$LIB_FUZZING_ENGINE"]) + + # Checks for header files. # AC_HEADER_STDC AC_CHECK_HEADERS([errno.h fcntl.h stdio.h stdlib.h unistd.h sys/uio.h]) @@ -373,6 +384,7 @@ LIBSSH2_CHECK_OPTION_WERROR AC_CONFIG_FILES([Makefile src/Makefile tests/Makefile + tests/ossfuzz/Makefile example/Makefile docs/Makefile libssh2.pc]) diff --git a/vendor/libssh2/depcomp b/vendor/libssh2/depcomp index 65cbf7093..6b391623c 100755 --- a/vendor/libssh2/depcomp +++ b/vendor/libssh2/depcomp @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # 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 diff --git a/vendor/libssh2/docs/HACKING.CRYPTO b/vendor/libssh2/docs/HACKING-CRYPTO similarity index 62% rename from vendor/libssh2/docs/HACKING.CRYPTO rename to vendor/libssh2/docs/HACKING-CRYPTO index e1c4f38d9..ca9477286 100644 --- a/vendor/libssh2/docs/HACKING.CRYPTO +++ b/vendor/libssh2/docs/HACKING-CRYPTO @@ -1,4 +1,4 @@ - Definitions needed to implement a specific crypto library + Definitions needed to implement a specific crypto library This document offers some hints about implementing a new crypto library interface. @@ -67,14 +67,14 @@ Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. void libssh2_hmac_update(libssh2_hmac_ctx ctx, - const unsigned char *data, - int datalen); + const unsigned char *data, + int datalen); Continue computation of an HMAC on datalen bytes at data using context ctx. Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. void libssh2_hmac_final(libssh2_hmac_ctx ctx, - unsigned char output[]); + unsigned char output[]); Get the computed HMAC from context ctx into the output buffer. The minimum data buffer size depends on the HMAC hash algorithm. Note: if the ctx parameter is modified by the underlying code, @@ -100,8 +100,8 @@ Initializes the SHA-1 computation context at x. Returns 1 for success and 0 for failure void libssh2_sha1_update(libssh2_sha1_ctx ctx, - const unsigned char *data, - size_t len); + const unsigned char *data, + size_t len); Continue computation of SHA-1 on len bytes at data using context ctx. Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. @@ -115,8 +115,8 @@ Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. void libssh2_hmac_sha1_init(libssh2_hmac_ctx *ctx, - const void *key, - int keylen); + const void *key, + int keylen); Setup the HMAC computation context ctx for an HMAC-SHA-1 computation using the keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). @@ -134,14 +134,14 @@ Initializes the SHA-256 computation context at x. Returns 1 for success and 0 for failure void libssh2_sha256_update(libssh2_sha256_ctx ctx, - const unsigned char *data, - size_t len); + const unsigned char *data, + size_t len); Continue computation of SHA-256 on len bytes at data using context ctx. Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. void libssh2_sha256_final(libssh2_sha256_ctx ctx, - unsigned char output[SHA256_DIGEST_LENGTH]); + unsigned char output[SHA256_DIGEST_LENGTH]); Gets the computed SHA-256 signature from context ctx into the output buffer. Release the context. Note: if the ctx parameter is modified by the underlying code, @@ -160,26 +160,91 @@ LIBSSH2_HMAC_SHA256 If defined as 0, the rest of this section can be omitted. void libssh2_hmac_sha256_init(libssh2_hmac_ctx *ctx, - const void *key, - int keylen); + const void *key, + int keylen); Setup the HMAC computation context ctx for an HMAC-256 computation using the keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). -3.3) SHA-512 -LIBSSH2_HMAC_SHA512 -#define as 1 if the crypto library supports HMAC-SHA-512, else 0. -If defined as 0, the rest of this section can be omitted. +3.3) SHA-384 +Mandatory if ECDSA is implemented. Can be omitted otherwise. + +SHA384_DIGEST_LENGTH +#define to 48, the SHA-384 digest length. + +libssh2_sha384_ctx +Type of an SHA-384 computation context. Generally a struct. + +int libssh2_sha384_init(libssh2_sha384_ctx *x); +Initializes the SHA-384 computation context at x. +Returns 1 for success and 0 for failure + +void libssh2_sha384_update(libssh2_sha384_ctx ctx, + const unsigned char *data, + size_t len); +Continue computation of SHA-384 on len bytes at data using context ctx. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_sha384_final(libssh2_sha384_ctx ctx, + unsigned char output[SHA384_DIGEST_LENGTH]); +Gets the computed SHA-384 signature from context ctx into the output buffer. +Release the context. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +int libssh2_sha384(const unsigned char *message, + unsigned long len, + unsigned char output[SHA384_DIGEST_LENGTH]); +Computes the SHA-384 signature over the given message of length len and +store the result into the output buffer. +Return 1 if error, else 0. + +3.4) SHA-512 +Must always be implemented. SHA512_DIGEST_LENGTH #define to 64, the SHA-512 digest length. +libssh2_sha512_ctx +Type of an SHA-512 computation context. Generally a struct. + +int libssh2_sha512_init(libssh2_sha512_ctx *x); +Initializes the SHA-512 computation context at x. +Returns 1 for success and 0 for failure + +void libssh2_sha512_update(libssh2_sha512_ctx ctx, + const unsigned char *data, + size_t len); +Continue computation of SHA-512 on len bytes at data using context ctx. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +void libssh2_sha512_final(libssh2_sha512_ctx ctx, + unsigned char output[SHA512_DIGEST_LENGTH]); +Gets the computed SHA-512 signature from context ctx into the output buffer. +Release the context. +Note: if the ctx parameter is modified by the underlying code, +this procedure must be implemented as a macro to map ctx --> &ctx. + +int libssh2_sha512(const unsigned char *message, + unsigned long len, + unsigned char output[SHA512_DIGEST_LENGTH]); +Computes the SHA-512 signature over the given message of length len and +store the result into the output buffer. +Return 1 if error, else 0. +Note: Seems unused in current code, but defined in each crypto library backend. + +LIBSSH2_HMAC_SHA512 +#define as 1 if the crypto library supports HMAC-SHA-512, else 0. +If defined as 0, the rest of this section can be omitted. + void libssh2_hmac_sha512_init(libssh2_hmac_ctx *ctx, - const void *key, - int keylen); + const void *key, + int keylen); Setup the HMAC computation context ctx for an HMAC-512 computation using the keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). -3.4) MD5 +3.5) MD5 LIBSSH2_MD5 #define to 1 if the crypto library supports MD5, else 0. If defined as 0, the rest of this section can be omitted. @@ -195,34 +260,34 @@ Initializes the MD5 computation context at x. Returns 1 for success and 0 for failure void libssh2_md5_update(libssh2_md5_ctx ctx, - const unsigned char *data, - size_t len); + const unsigned char *data, + size_t len); Continues computation of MD5 on len bytes at data using context ctx. Returns 1 for success and 0 for failure. Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. void libssh2_md5_final(libssh2_md5_ctx ctx, - unsigned char output[MD5_DIGEST_LENGTH]); + unsigned char output[MD5_DIGEST_LENGTH]); Gets the computed MD5 signature from context ctx into the output buffer. Release the context. Note: if the ctx parameter is modified by the underlying code, this procedure must be implemented as a macro to map ctx --> &ctx. void libssh2_hmac_md5_init(libssh2_hmac_ctx *ctx, - const void *key, - int keylen); + const void *key, + int keylen); Setup the HMAC computation context ctx for an HMAC-MD5 computation using the keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). -3.5) RIPEMD-160 +3.6) RIPEMD-160 LIBSSH2_HMAC_RIPEMD #define as 1 if the crypto library supports HMAC-RIPEMD-160, else 0. If defined as 0, the rest of this section can be omitted. void libssh2_hmac_ripemd160_init(libssh2_hmac_ctx *ctx, - const void *key, - int keylen); + const void *key, + int keylen); Setup the HMAC computation context ctx for an HMAC-RIPEMD-160 computation using the keylen-byte key. Is invoked just after libssh2_hmac_ctx_init(). Returns 1 for success and 0 for failure. @@ -411,7 +476,7 @@ Sets the value of bn to val. Returns 1 on success, 0 otherwise. _libssh2_bn * _libssh2_bn_from_bin(_libssh2_bn *bn, int len, - const unsigned char *val); + const unsigned char *val); Converts the positive integer in big-endian form of length len at val into a _libssh2_bn and place it in bn. If bn is NULL, a new _libssh2_bn is created. @@ -438,6 +503,17 @@ d) g, MSB first, with high order bit = 0. e) pub_key, MSB first, with high order bit = 0. Each item is preceded by its 32-bit byte length, MSB first. +Format of an ECDSA public key: +a) "ecdsa-sha2-nistp256" or "ecdsa-sha2-nistp384" or "ecdsa-sha2-nistp521". +b) domain: "nistp256", "nistp384" or "nistp521" matching a). +c) raw public key ("octal"). +Each item is preceded by its 32-bit byte length, MSB first. + +Format of an ED25519 public key: +a) "ssh-ed25519". +b) raw key (32 bytes). +Each item is preceded by its 32-bit byte length, MSB first. + int _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, unsigned char **method, size_t *method_len, @@ -467,6 +543,7 @@ Both buffers have to be allocated using LIBSSH2_ALLOC(). Returns 0 if OK, else -1. This procedure is already prototyped in crypto.h. + 7.1) RSA LIBSSH2_RSA #define as 1 if the crypto library supports RSA, else 0. @@ -492,14 +569,14 @@ int _libssh2_rsa_new(libssh2_rsa_ctx **rsa, unsigned long e2len, const unsigned char *coeffdata, unsigned long coefflen); Creates a new context for RSA computations from key source values: - pdata, plen Prime number p. Only used if private key known (ddata). - qdata, qlen Prime number q. Only used if private key known (ddata). - ndata, nlen Modulus n. - edata, elen Exponent e. - ddata, dlen e^-1 % phi(n) = private key. May be NULL if unknown. - e1data, e1len dp = d % (p-1). Only used if private key known (dtata). - e2data, e2len dq = d % (q-1). Only used if private key known (dtata). - coeffdata, coefflen q^-1 % p. Only used if private key known. + pdata, plen Prime number p. Only used if private key known (ddata). + qdata, qlen Prime number q. Only used if private key known (ddata). + ndata, nlen Modulus n. + edata, elen Exponent e. + ddata, dlen e^-1 % phi(n) = private key. May be NULL if unknown. + e1data, e1len dp = d % (p-1). Only used if private key known (dtata). + e2data, e2len dq = d % (q-1). Only used if private key known (dtata). + coeffdata, coefflen q^-1 % p. Only used if private key known. Returns 0 if OK. This procedure is already prototyped in crypto.h. Note: the current generic code only calls this function with e and n (public @@ -518,7 +595,7 @@ This procedure is already prototyped in crypto.h. int _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx **rsa, LIBSSH2_SESSION *session, const char *data, - size_t data_len, + size_t data_len, unsigned const char *passphrase); Gets an RSA private key from data into a new RSA context. Must call _libssh2_init_if_needed(). @@ -529,15 +606,15 @@ int _libssh2_rsa_sha1_verify(libssh2_rsa_ctx *rsa, const unsigned char *sig, unsigned long sig_len, const unsigned char *m, unsigned long m_len); -Verify (sig, siglen) signature of (m, m_len) using an SHA-1 hash and the +Verify (sig, sig_len) signature of (m, m_len) using an SHA-1 hash and the RSA context. Return 0 if OK, else -1. This procedure is already prototyped in crypto.h. int _libssh2_rsa_sha1_signv(LIBSSH2_SESSION *session, - unsigned char **sig, size_t *siglen, - int count, const struct iovec vector[], - libssh2_rsa_ctx *ctx); + unsigned char **sig, size_t *siglen, + int count, const struct iovec vector[], + libssh2_rsa_ctx *ctx); RSA signs the SHA-1 hash computed over the count data chunks in vector. Signature is stored at (sig, siglen). Signature buffer must be allocated from the given session. @@ -581,11 +658,11 @@ int _libssh2_dsa_new(libssh2_dsa_ctx **dsa, unsigned long ylen, const unsigned char *x, unsigned long x_len); Creates a new context for DSA computations from source key values: - pdata, plen Prime number p. Only used if private key known (ddata). - qdata, qlen Prime number q. Only used if private key known (ddata). - gdata, glen G number. - ydata, ylen Public key. - xdata, xlen Private key. Only taken if xlen non-zero. + pdata, plen Prime number p. Only used if private key known (ddata). + qdata, qlen Prime number q. Only used if private key known (ddata). + gdata, glen G number. + ydata, ylen Public key. + xdata, xlen Private key. Only taken if xlen non-zero. Returns 0 if OK. This procedure is already prototyped in crypto.h. @@ -601,7 +678,7 @@ This procedure is already prototyped in crypto.h. int _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx **dsa, LIBSSH2_SESSION *session, const char *data, - size_t data_len, + size_t data_len, unsigned const char *passphrase); Gets a DSA private key from the data_len-bytes data into a new DSA context. Must call _libssh2_init_if_needed(). @@ -627,6 +704,191 @@ void _libssh2_dsa_free(libssh2_dsa_ctx *dsactx); Releases the DSA computation context at dsactx. +7.3) ECDSA +LIBSSH2_ECDSA +#define as 1 if the crypto library supports ECDSA, else 0. +If defined as 0, _libssh2_ec_key should be defined as void and the rest of +this section can be omitted. + +EC_MAX_POINT_LEN +Maximum point length. Usually defined as ((528 * 2 / 8) + 1) (= 133). + +libssh2_ecdsa_ctx +Type of an ECDSA computation context. Generally a struct. + +_libssh2_ec_key +Type of an elliptic curve key. + +libssh2_curve_type +An enum type defining curve types. Current supported identifiers are: + LIBSSH2_EC_CURVE_NISTP256 + LIBSSH2_EC_CURVE_NISTP384 + LIBSSH2_EC_CURVE_NISTP521 + +int _libssh2_ecdsa_create_key(_libssh2_ec_key **out_private_key, + unsigned char **out_public_key_octal, + size_t *out_public_key_octal_len, + libssh2_curve_type curve_type); +Create a new ECDSA private key of type curve_type and return it at +out_private_key. If out_public_key_octal is not NULL, store an allocated +pointer to the associated public key in "octal" form in it and its length +at out_public_key_octal_len. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_new_private(libssh2_ecdsa_ctx **ec_ctx, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase); +Reads an ECDSA private key from PEM file filename into a new ECDSA context. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx, + LIBSSH2_SESSION * session, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase); +Builds an ECDSA private key from PEM data at filedata of length filedata_len +into a new ECDSA context stored at ec_ctx. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx **ecdsactx, + const unsigned char *k, + size_t k_len, + libssh2_curve_type type); +Stores at ecdsactx a new ECDSA context associated with the given curve type +and with "octal" form public key (k, k_len). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_new_openssh_private(libssh2_ecdsa_ctx **ec_ctx, + LIBSSH2_SESSION * session, + const char *filename, + unsigned const char *passphrase); +Reads a PEM-encoded ECDSA private key from file filename encrypted with +passphrase and stores at ec_ctx a new ECDSA context for it. +Return 0 if OK, else -1. +Currently used only from openssl backend (ought to be private). +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_sign(LIBSSH2_SESSION *session, libssh2_ecdsa_ctx *ec_ctx, + const unsigned char *hash, unsigned long hash_len, + unsigned char **signature, size_t *signature_len); +ECDSA signs the (hash, hashlen) hash bytes and stores the allocated +signature at (signature, signature_len). Hash algorithm used should be +SHA-256, SHA-384 or SHA-512 depending on type stored in ECDSA context at ec_ctx. +Signature buffer must be allocated from the given session. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_verify(libssh2_ecdsa_ctx *ctx, + const unsigned char *r, size_t r_len, + const unsigned char *s, size_t s_len, + const unsigned char *m, size_t m_len); +Verify the ECDSA signature made of (r, r_len) and (s, s_len) of (m, m_len) +using the hash algorithm configured in the ECDSA context ctx. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +libssh2_curve_type _libssh2_ecdsa_get_curve_type(libssh2_ecdsa_ctx *ecdsactx); +Returns the curve type associated with given context. +This procedure is already prototyped in crypto.h. + +int _libssh2_ecdsa_curve_type_from_name(const char *name, + libssh2_curve_type *out_type); +Stores in out_type the curve type matching string name of the form +"ecdsa-sha2-nistpxxx". +Return 0 if OK, else -1. +Currently used only from openssl backend (ought to be private). +This procedure is already prototyped in crypto.h. + +void _libssh2_ecdsa_free(libssh2_ecdsa_ctx *ecdsactx); +Releases the ECDSA computation context at ecdsactx. + + +7.4) ED25519 +LIBSSH2_ED25519 +#define as 1 if the crypto library supports ED25519, else 0. +If defined as 0, the rest of this section can be omitted. + + +libssh2_ed25519_ctx +Type of an ED25519 computation context. Generally a struct. + +int _libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_ed25519_ctx **ctx, + uint8_t **out_public_key, + uint8_t **out_private_key); +Generates an ED25519 key pair, stores a pointer to them at out_private_key +and out_public_key respectively and stores at ctx a new ED25519 context for +this key. +Argument ctx, out_private_key and out_public key may be NULL to disable storing +the corresponding value. +Length of each key is LIBSSH2_ED25519_KEY_LEN (32 bytes). +Key buffers are allocated and should be released by caller after use. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_new_private(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const char *filename, + const uint8_t *passphrase); +Reads an ED25519 private key from PEM file filename into a new ED25519 context. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_new_public(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const unsigned char *raw_pub_key, + const uint8_t key_len); +Stores at ed_ctx a new ED25519 key context for raw public key (raw_pub_key, +key_len). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const char *filedata, + size_t filedata_len, + unsigned const char *passphrase); +Builds an ED25519 private key from PEM data at filedata of length filedata_len +into a new ED25519 context stored at ed_ctx. +Must call _libssh2_init_if_needed(). +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session, + uint8_t **out_sig, size_t *out_sig_len, + const uint8_t *message, size_t message_len); +ED25519 signs the (message, message_len) bytes and stores the allocated +signature at (sig, sig_len). +Signature buffer is allocated from the given session. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s, + size_t s_len, const uint8_t *m, size_t m_len); +Verify (s, s_len) signature of (m, m_len) using the given ED25519 context. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +int _libssh2_curve25519_gen_k(_libssh2_bn **k, + uint8_t private_key[LIBSSH2_ED25519_KEY_LEN], + uint8_t srvr_public_key[LIBSSH2_ED25519_KEY_LEN]); +Computes a shared ED25519 secret key from the given raw server public key and +raw client public key and stores it as a big number in *k. Big number should +have been initialized before calling this function. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. + +void _libssh2_ed25519_free(libssh2_ed25519_ctx *ed25519ctx); +Releases the ED25519 computation context at ed25519ctx. + + 8) Miscellaneous void libssh2_prepare_iovec(struct iovec *vector, unsigned int len); @@ -635,5 +897,6 @@ In example, this is needed to preset unused structure slacks on platforms requiring it. If this is not needed, it should be defined as an empty macro. -void _libssh2_random(unsigned char *buf, int len); +int _libssh2_random(unsigned char *buf, int len); Store len random bytes at buf. +Returns 0 if OK, else -1. diff --git a/vendor/libssh2/docs/INSTALL_AUTOTOOLS b/vendor/libssh2/docs/INSTALL_AUTOTOOLS index 515001e35..a75b51814 100644 --- a/vendor/libssh2/docs/INSTALL_AUTOTOOLS +++ b/vendor/libssh2/docs/INSTALL_AUTOTOOLS @@ -14,9 +14,9 @@ If you want to build directly from the git repository, you must first generate the configure script and Makefile using autotools. There is a convenience script that calls all tools in the correct order. Make sure that autoconf, automake and libtool are installed on your system, -then execute the following script: +then execute: - ./buildconf + autoreconf -fi After executing this script, you can build the project as usual: diff --git a/vendor/libssh2/docs/INSTALL_CMAKE b/vendor/libssh2/docs/INSTALL_CMAKE.md similarity index 97% rename from vendor/libssh2/docs/INSTALL_CMAKE rename to vendor/libssh2/docs/INSTALL_CMAKE.md index b9261b344..c136fdcee 100644 --- a/vendor/libssh2/docs/INSTALL_CMAKE +++ b/vendor/libssh2/docs/INSTALL_CMAKE.md @@ -20,10 +20,12 @@ Getting started If you are happy with the default options, make a new build directory, change to it, configure the build environment and build the project: +``` mkdir bin cd bin cmake .. cmake --build . +``` libssh2 will be built as a static library and will use any cryptography library available. The library binary will be put in @@ -40,6 +42,11 @@ pass the options to CMake on the command line: The following options are available: + * `LINT=ON` + + Enables running the source code linter when building. Can be `ON` or `OFF`. + + * `BUILD_SHARED_LIBS=OFF` Determines whether libssh2 is built as a static library or as a @@ -119,20 +126,27 @@ Tests To test the build, run the appropriate test target for your build system. For example: +``` cmake --build . --target test +``` or +``` cmake --build . --target RUN_TESTS +``` How do I use libssh2 in my project if my project doesn't use CMake? ------------------------------------------------------------------- If you are not using CMake for your own project, install libssh2 - +``` cmake cmake --build . cmake --build . --target install +``` or +``` cmake --build . --target INSTALL +``` and then specify the install location to your project in the normal way for your build environment. If you don't like the default install diff --git a/vendor/libssh2/docs/Makefile.am b/vendor/libssh2/docs/Makefile.am index 6df033710..a80943122 100644 --- a/vendor/libssh2/docs/Makefile.am +++ b/vendor/libssh2/docs/Makefile.am @@ -1,7 +1,7 @@ # $Id: Makefile.am,v 1.37 2009/03/26 15:41:15 bagder Exp $ -EXTRA_DIST = template.3 BINDINGS INSTALL_AUTOTOOLS INSTALL_CMAKE HACKING TODO \ - AUTHORS CMakeLists.txt HACKING.CRYPTO SECURITY.md +EXTRA_DIST = template.3 BINDINGS INSTALL_AUTOTOOLS INSTALL_CMAKE.md HACKING TODO \ + AUTHORS CMakeLists.txt HACKING-CRYPTO SECURITY.md dist_man_MANS = \ libssh2_agent_connect.3 \ diff --git a/vendor/libssh2/docs/Makefile.in b/vendor/libssh2/docs/Makefile.in index dadaf1fc7..40143ed18 100644 --- a/vendor/libssh2/docs/Makefile.in +++ b/vendor/libssh2/docs/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.4 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -101,8 +101,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h \ - $(top_builddir)/example/libssh2_config.h +CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) @@ -173,6 +172,12 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -183,6 +188,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ @@ -216,6 +222,7 @@ LIBSSL_PREFIX = @LIBSSL_PREFIX@ LIBTOOL = @LIBTOOL@ LIBZ = @LIBZ@ LIBZ_PREFIX = @LIBZ_PREFIX@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ @@ -257,6 +264,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -304,8 +312,8 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -EXTRA_DIST = template.3 BINDINGS INSTALL_AUTOTOOLS INSTALL_CMAKE HACKING TODO \ - AUTHORS CMakeLists.txt HACKING.CRYPTO SECURITY.md +EXTRA_DIST = template.3 BINDINGS INSTALL_AUTOTOOLS INSTALL_CMAKE.md HACKING TODO \ + AUTHORS CMakeLists.txt HACKING-CRYPTO SECURITY.md dist_man_MANS = \ libssh2_agent_connect.3 \ @@ -567,7 +575,6 @@ ctags CTAGS: cscope cscopelist: - distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am diff --git a/vendor/libssh2/docs/libssh2_session_callback_set.3 b/vendor/libssh2/docs/libssh2_session_callback_set.3 index 3901f8840..6a075cbfb 100644 --- a/vendor/libssh2/docs/libssh2_session_callback_set.3 +++ b/vendor/libssh2/docs/libssh2_session_callback_set.3 @@ -32,11 +32,43 @@ function returns 0, the packet will be accepted nonetheless. .IP LIBSSH2_CALLBACK_X11 Called when an X11 connection has been accepted .IP LIBSSH2_CALLBACK_SEND -Called when libssh2 wants to send some data on the connection. -Can be set to a custom function to handle I/O your own way. +Called when libssh2 wants to send data on the connection. Can be set to a +custom function to handle I/O your own way. + +The prototype of the callback: + +.nf +ssize_t sendcb(libssh2_socket_t sockfd, const void *buffer, + size_t length, int flags, void **abstract); +.fi + +\fBsockfd\fP is the socket to write to, \fBbuffer\fP points to the data to +send, \fBlength\fP is the size of the data, \fBflags\fP is the flags that +would've been used to a \fIsend()\fP call and \fBabstract\fP is a pointer to +the abstract pointer set in the \fIlibssh2_session_init_ex(3)\fP call. + +The callback returns the number of bytes sent, or -1 for error. The special +return code \fB-EAGAIN\fP can be returned to signal that the send was aborted +to prevent getting blocked and it needs to be called again. .IP LIBSSH2_CALLBACK_RECV -Called when libssh2 wants to receive some data from the connection. -Can be set to a custom function to handle I/O your own way. +Called when libssh2 wants to read data from the connection. Can be set to a +custom function to handle I/O your own way. + +The prototype of the callback: + +.nf +ssize_t recvcb(libssh2_socket_t sockfd, void *buffer, + size_t length, int flags, void **abstract); +.fi + +\fBsockfd\fP is the socket to read from, \fBbuffer\fP where to store received +data into, \fBlength\fP is the size of the buffer, \fBflags\fP is the flags +that would've been used to a \fIrecv()\fP call and \fBabstract\fP is a pointer +to the abstract pointer set in the \fIlibssh2_session_init_ex(3)\fP call. + +The callback returns the number of bytes read, or -1 for error. The special +return code \fB-EAGAIN\fP can be returned to signal that the read was aborted +to prevent getting blocked and it needs to be called again. .SH RETURN VALUE Pointer to previous callback handler. Returns NULL if no prior callback handler was set or the callback type was unknown. diff --git a/vendor/libssh2/example/CMakeLists.txt b/vendor/libssh2/example/CMakeLists.txt index f77033f75..3dc115ef1 100644 --- a/vendor/libssh2/example/CMakeLists.txt +++ b/vendor/libssh2/example/CMakeLists.txt @@ -57,6 +57,7 @@ set(EXAMPLES sftpdir_nonblock ssh2_exec ssh2_agent + ssh2_agent_forwarding ssh2_echo sftp_append subsystem_netconf diff --git a/vendor/libssh2/example/Makefile.am b/vendor/libssh2/example/Makefile.am index 5cf5f0714..ec542cd15 100644 --- a/vendor/libssh2/example/Makefile.am +++ b/vendor/libssh2/example/Makefile.am @@ -6,12 +6,12 @@ EXTRA_DIST = libssh2_config.h.in libssh2_config_cmake.h.in CMakeLists.txt noinst_PROGRAMS = direct_tcpip ssh2 scp scp_nonblock scp_write \ scp_write_nonblock sftp sftp_nonblock sftp_write sftp_write_nonblock \ sftp_mkdir sftp_mkdir_nonblock sftp_RW_nonblock sftp_write_sliding \ - sftpdir sftpdir_nonblock ssh2_exec ssh2_agent ssh2_echo sftp_append \ - subsystem_netconf tcpip-forward + sftpdir sftpdir_nonblock ssh2_exec ssh2_agent ssh2_agent_forwarding \ + ssh2_echo sftp_append subsystem_netconf tcpip-forward if HAVE_SYS_UN_H noinst_PROGRAMS += x11 endif -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/example +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/example -I../src LDADD = $(top_builddir)/src/libssh2.la diff --git a/vendor/libssh2/example/Makefile.in b/vendor/libssh2/example/Makefile.in index 632ddedcc..ff86a2e41 100644 --- a/vendor/libssh2/example/Makefile.in +++ b/vendor/libssh2/example/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.4 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -96,7 +96,8 @@ noinst_PROGRAMS = direct_tcpip$(EXEEXT) ssh2$(EXEEXT) scp$(EXEEXT) \ sftp_mkdir_nonblock$(EXEEXT) sftp_RW_nonblock$(EXEEXT) \ sftp_write_sliding$(EXEEXT) sftpdir$(EXEEXT) \ sftpdir_nonblock$(EXEEXT) ssh2_exec$(EXEEXT) \ - ssh2_agent$(EXEEXT) ssh2_echo$(EXEEXT) sftp_append$(EXEEXT) \ + ssh2_agent$(EXEEXT) ssh2_agent_forwarding$(EXEEXT) \ + ssh2_echo$(EXEEXT) sftp_append$(EXEEXT) \ subsystem_netconf$(EXEEXT) tcpip-forward$(EXEEXT) \ $(am__EXEEXT_1) @HAVE_SYS_UN_H_TRUE@am__append_1 = x11 @@ -112,7 +113,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h libssh2_config.h +CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_SYS_UN_H_TRUE@am__EXEEXT_1 = x11$(EXEEXT) @@ -193,6 +194,10 @@ ssh2_agent_SOURCES = ssh2_agent.c ssh2_agent_OBJECTS = ssh2_agent.$(OBJEXT) ssh2_agent_LDADD = $(LDADD) ssh2_agent_DEPENDENCIES = $(top_builddir)/src/libssh2.la +ssh2_agent_forwarding_SOURCES = ssh2_agent_forwarding.c +ssh2_agent_forwarding_OBJECTS = ssh2_agent_forwarding.$(OBJEXT) +ssh2_agent_forwarding_LDADD = $(LDADD) +ssh2_agent_forwarding_DEPENDENCIES = $(top_builddir)/src/libssh2.la ssh2_echo_SOURCES = ssh2_echo.c ssh2_echo_OBJECTS = ssh2_echo.$(OBJEXT) ssh2_echo_LDADD = $(LDADD) @@ -237,9 +242,10 @@ am__depfiles_remade = ./$(DEPDIR)/direct_tcpip.Po ./$(DEPDIR)/scp.Po \ ./$(DEPDIR)/sftp_write_nonblock.Po \ ./$(DEPDIR)/sftp_write_sliding.Po ./$(DEPDIR)/sftpdir.Po \ ./$(DEPDIR)/sftpdir_nonblock.Po ./$(DEPDIR)/ssh2.Po \ - ./$(DEPDIR)/ssh2_agent.Po ./$(DEPDIR)/ssh2_echo.Po \ - ./$(DEPDIR)/ssh2_exec.Po ./$(DEPDIR)/subsystem_netconf.Po \ - ./$(DEPDIR)/tcpip-forward.Po ./$(DEPDIR)/x11.Po + ./$(DEPDIR)/ssh2_agent.Po ./$(DEPDIR)/ssh2_agent_forwarding.Po \ + ./$(DEPDIR)/ssh2_echo.Po ./$(DEPDIR)/ssh2_exec.Po \ + ./$(DEPDIR)/subsystem_netconf.Po ./$(DEPDIR)/tcpip-forward.Po \ + ./$(DEPDIR)/x11.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -263,21 +269,22 @@ SOURCES = direct_tcpip.c scp.c scp_nonblock.c scp_write.c \ scp_write_nonblock.c sftp.c sftp_RW_nonblock.c sftp_append.c \ sftp_mkdir.c sftp_mkdir_nonblock.c sftp_nonblock.c \ sftp_write.c sftp_write_nonblock.c sftp_write_sliding.c \ - sftpdir.c sftpdir_nonblock.c ssh2.c ssh2_agent.c ssh2_echo.c \ - ssh2_exec.c subsystem_netconf.c tcpip-forward.c x11.c + sftpdir.c sftpdir_nonblock.c ssh2.c ssh2_agent.c \ + ssh2_agent_forwarding.c ssh2_echo.c ssh2_exec.c \ + subsystem_netconf.c tcpip-forward.c x11.c DIST_SOURCES = direct_tcpip.c scp.c scp_nonblock.c scp_write.c \ scp_write_nonblock.c sftp.c sftp_RW_nonblock.c sftp_append.c \ sftp_mkdir.c sftp_mkdir_nonblock.c sftp_nonblock.c \ sftp_write.c sftp_write_nonblock.c sftp_write_sliding.c \ - sftpdir.c sftpdir_nonblock.c ssh2.c ssh2_agent.c ssh2_echo.c \ - ssh2_exec.c subsystem_netconf.c tcpip-forward.c x11.c + sftpdir.c sftpdir_nonblock.c ssh2.c ssh2_agent.c \ + ssh2_agent_forwarding.c ssh2_echo.c ssh2_exec.c \ + subsystem_netconf.c tcpip-forward.c x11.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)libssh2_config.h.in +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. @@ -294,10 +301,7 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libssh2_config.h.in \ - $(top_srcdir)/depcomp +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ @@ -314,6 +318,12 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -324,6 +334,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ @@ -357,6 +368,7 @@ LIBSSL_PREFIX = @LIBSSL_PREFIX@ LIBTOOL = @LIBTOOL@ LIBZ = @LIBZ@ LIBZ_PREFIX = @LIBZ_PREFIX@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ @@ -398,6 +410,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -447,10 +460,9 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign nostdinc EXTRA_DIST = libssh2_config.h.in libssh2_config_cmake.h.in CMakeLists.txt -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/example +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/example -I../src LDADD = $(top_builddir)/src/libssh2.la -all: libssh2_config.h - $(MAKE) $(AM_MAKEFLAGS) all-am +all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj @@ -484,17 +496,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -libssh2_config.h: stamp-h2 - @test -f $@ || rm -f stamp-h2 - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2 - -stamp-h2: $(srcdir)/libssh2_config.h.in $(top_builddir)/config.status - @rm -f stamp-h2 - cd $(top_builddir) && $(SHELL) ./config.status example/libssh2_config.h - -distclean-hdr: - -rm -f libssh2_config.h stamp-h2 - clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ @@ -576,6 +577,10 @@ ssh2_agent$(EXEEXT): $(ssh2_agent_OBJECTS) $(ssh2_agent_DEPENDENCIES) $(EXTRA_ss @rm -f ssh2_agent$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ssh2_agent_OBJECTS) $(ssh2_agent_LDADD) $(LIBS) +ssh2_agent_forwarding$(EXEEXT): $(ssh2_agent_forwarding_OBJECTS) $(ssh2_agent_forwarding_DEPENDENCIES) $(EXTRA_ssh2_agent_forwarding_DEPENDENCIES) + @rm -f ssh2_agent_forwarding$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ssh2_agent_forwarding_OBJECTS) $(ssh2_agent_forwarding_LDADD) $(LIBS) + ssh2_echo$(EXEEXT): $(ssh2_echo_OBJECTS) $(ssh2_echo_DEPENDENCIES) $(EXTRA_ssh2_echo_DEPENDENCIES) @rm -f ssh2_echo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ssh2_echo_OBJECTS) $(ssh2_echo_LDADD) $(LIBS) @@ -620,6 +625,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpdir_nonblock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_agent.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_agent_forwarding.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_echo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_exec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subsystem_netconf.Po@am__quote@ # am--include-marker @@ -710,7 +716,6 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -746,7 +751,7 @@ distdir-am: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(PROGRAMS) libssh2_config.h +all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am @@ -802,6 +807,7 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/sftpdir_nonblock.Po -rm -f ./$(DEPDIR)/ssh2.Po -rm -f ./$(DEPDIR)/ssh2_agent.Po + -rm -f ./$(DEPDIR)/ssh2_agent_forwarding.Po -rm -f ./$(DEPDIR)/ssh2_echo.Po -rm -f ./$(DEPDIR)/ssh2_exec.Po -rm -f ./$(DEPDIR)/subsystem_netconf.Po @@ -809,7 +815,7 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/x11.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-tags + distclean-tags dvi: dvi-am @@ -870,6 +876,7 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/sftpdir_nonblock.Po -rm -f ./$(DEPDIR)/ssh2.Po -rm -f ./$(DEPDIR)/ssh2_agent.Po + -rm -f ./$(DEPDIR)/ssh2_agent_forwarding.Po -rm -f ./$(DEPDIR)/ssh2_echo.Po -rm -f ./$(DEPDIR)/ssh2_exec.Po -rm -f ./$(DEPDIR)/subsystem_netconf.Po @@ -893,18 +900,18 @@ ps-am: uninstall-am: -.MAKE: all install-am install-strip +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am diff --git a/vendor/libssh2/example/ssh2_agent_forwarding.c b/vendor/libssh2/example/ssh2_agent_forwarding.c new file mode 100644 index 000000000..b99fc95fe --- /dev/null +++ b/vendor/libssh2/example/ssh2_agent_forwarding.c @@ -0,0 +1,292 @@ +/* + * Sample showing how to use libssh2 to request agent forwarding + * on the remote host. The command executed will run with agent forwarded + * so you should be able to do things like clone out protected git + * repos and such. + * + * The example uses agent authentication to ensure an agent to forward + * is running. + * + * Run it like this: + * + * $ ./ssh2_agent_forwarding 127.0.0.1 user "uptime" + * + */ + +#include "libssh2_config.h" +#include + +#ifdef HAVE_WINSOCK2_H +# include +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_SYS_SELECT_H +# include +#endif +# ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif + +#ifdef HAVE_SYS_TIME_H +# include +#endif +#include +#include +#include +#include +#include +#include + +static int waitsocket(int socket_fd, LIBSSH2_SESSION *session) +{ + struct timeval timeout; + int rc; + fd_set fd; + fd_set *writefd = NULL; + fd_set *readfd = NULL; + int dir; + + timeout.tv_sec = 10; + timeout.tv_usec = 0; + + FD_ZERO(&fd); + + FD_SET(socket_fd, &fd); + + /* now make sure we wait in the correct direction */ + dir = libssh2_session_block_directions(session); + + if(dir & LIBSSH2_SESSION_BLOCK_INBOUND) + readfd = &fd; + + if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND) + writefd = &fd; + + rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout); + + return rc; +} + +int main(int argc, char *argv[]) +{ + const char *hostname = "127.0.0.1"; + const char *commandline = "uptime"; + const char *username = NULL; + unsigned long hostaddr; + int sock; + struct sockaddr_in sin; + LIBSSH2_SESSION *session; + LIBSSH2_CHANNEL *channel; + LIBSSH2_AGENT *agent = NULL; + struct libssh2_agent_publickey *identity, *prev_identity = NULL; + int rc; + int exitcode; + char *exitsignal = (char *)"none"; + int bytecount = 0; + +#ifdef WIN32 + WSADATA wsadata; + WSAStartup(MAKEWORD(2, 0), &wsadata); +#endif + if(argc < 2) { + fprintf(stderr, "At least IP and username arguments are required.\n"); + return 1; + } + /* must be ip address only */ + hostname = argv[1]; + username = argv[2]; + + if(argc > 3) { + commandline = argv[3]; + } + + rc = libssh2_init(0); + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); + return 1; + } + + hostaddr = inet_addr(hostname); + + /* Ultra basic "connect to port 22 on localhost" + * Your code is responsible for creating the socket establishing the + * connection + */ + sock = socket(AF_INET, SOCK_STREAM, 0); + + sin.sin_family = AF_INET; + sin.sin_port = htons(22); + sin.sin_addr.s_addr = hostaddr; + if(connect(sock, (struct sockaddr*)(&sin), + sizeof(struct sockaddr_in)) != 0) { + fprintf(stderr, "failed to connect!\n"); + return -1; + } + + /* Create a session instance */ + session = libssh2_session_init(); + if(!session) + return -1; + + if(libssh2_session_handshake(session, sock) != 0) { + fprintf(stderr, "Failure establishing SSH session: %d\n", rc); + return -1; + } + + /* Connect to the ssh-agent */ + agent = libssh2_agent_init(session); + if(!agent) { + fprintf(stderr, "Failure initializing ssh-agent support\n"); + rc = 1; + goto shutdown; + } + if(libssh2_agent_connect(agent)) { + fprintf(stderr, "Failure connecting to ssh-agent\n"); + rc = 1; + goto shutdown; + } + if(libssh2_agent_list_identities(agent)) { + fprintf(stderr, "Failure requesting identities to ssh-agent\n"); + rc = 1; + goto shutdown; + } + while(1) { + rc = libssh2_agent_get_identity(agent, &identity, prev_identity); + if(rc == 1) + break; + if(rc < 0) { + fprintf(stderr, + "Failure obtaining identity from ssh-agent support\n"); + rc = 1; + goto shutdown; + } + if(libssh2_agent_userauth(agent, username, identity)) { + fprintf(stderr, "\tAuthentication with username %s and " + "public key %s failed!\n", + username, identity->comment); + } + else { + fprintf(stderr, "\tAuthentication with username %s and " + "public key %s succeeded!\n", + username, identity->comment); + break; + } + prev_identity = identity; + } + if(rc) { + fprintf(stderr, "Couldn't continue authentication\n"); + goto shutdown; + } + +#if 0 + libssh2_trace(session, ~0); +#endif + + /* Set session to non-blocking */ + libssh2_session_set_blocking(session, 0); + + /* Exec non-blocking on the remove host */ + while((channel = libssh2_channel_open_session(session)) == NULL && + libssh2_session_last_error(session, NULL, NULL, 0) == + LIBSSH2_ERROR_EAGAIN) { + waitsocket(sock, session); + } + if(channel == NULL) { + fprintf(stderr, "Error\n"); + exit(1); + } + while((rc = libssh2_channel_request_auth_agent(channel)) == + LIBSSH2_ERROR_EAGAIN) { + waitsocket(sock, session); + } + if(rc != 0) { + fprintf(stderr, "Error, couldn't request auth agent, error code %d.\n", + rc); + exit(1); + } + else { + fprintf(stdout, "\tAgent forwarding request succeeded!\n"); + } + while((rc = libssh2_channel_exec(channel, commandline)) == + LIBSSH2_ERROR_EAGAIN) { + waitsocket(sock, session); + } + if(rc != 0) { + fprintf(stderr, "Error\n"); + exit(1); + } + for(;;) { + /* loop until we block */ + int rc; + do { + char buffer[0x4000]; + rc = libssh2_channel_read(channel, buffer, sizeof(buffer) ); + if(rc > 0) { + int i; + bytecount += rc; + fprintf(stderr, "We read:\n"); + for(i = 0; i < rc; ++i) + fputc(buffer[i], stderr); + fprintf(stderr, "\n"); + } + else { + if(rc != LIBSSH2_ERROR_EAGAIN) + /* no need to output this for the EAGAIN case */ + fprintf(stderr, "libssh2_channel_read returned %d\n", rc); + } + } + while(rc > 0); + + /* this is due to blocking that would occur otherwise so we loop on + this condition */ + if(rc == LIBSSH2_ERROR_EAGAIN) { + waitsocket(sock, session); + } + else + break; + } + exitcode = 127; + while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) { + waitsocket(sock, session); + } + if(rc == 0) { + exitcode = libssh2_channel_get_exit_status(channel); + libssh2_channel_get_exit_signal(channel, &exitsignal, + NULL, NULL, NULL, NULL, NULL); + } + + if(exitsignal) { + printf("\nGot signal: %s\n", exitsignal); + } + else { + printf("\nEXIT: %d bytecount: %d\n", exitcode, bytecount); + } + + libssh2_channel_free(channel); + channel = NULL; + +shutdown: + + libssh2_session_disconnect(session, + "Normal Shutdown, Thank you for playing"); + libssh2_session_free(session); + +#ifdef WIN32 + closesocket(sock); +#else + close(sock); +#endif + fprintf(stderr, "all done\n"); + + libssh2_exit(); + + return 0; +} diff --git a/vendor/libssh2/include/libssh2.h b/vendor/libssh2/include/libssh2.h index d33df03c3..995d83ed0 100644 --- a/vendor/libssh2/include/libssh2.h +++ b/vendor/libssh2/include/libssh2.h @@ -46,12 +46,12 @@ to make the BANNER define (used by src/session.c) be a valid SSH banner. Release versions have no appended strings and may of course not have dashes either. */ -#define LIBSSH2_VERSION "1.9.0" +#define LIBSSH2_VERSION "1.10.0" /* The numeric version number is also available "in parts" by using these defines: */ #define LIBSSH2_VERSION_MAJOR 1 -#define LIBSSH2_VERSION_MINOR 9 +#define LIBSSH2_VERSION_MINOR 10 #define LIBSSH2_VERSION_PATCH 0 /* This is the numeric version of the libssh2 version number, meant for easier @@ -69,7 +69,7 @@ and it is always a greater number in a more recent release. It makes comparisons with greater than and less than work. */ -#define LIBSSH2_VERSION_NUM 0x010900 +#define LIBSSH2_VERSION_NUM 0x010a00 /* * This is the date and time when the full source package was created. The @@ -80,7 +80,7 @@ * * "Mon Feb 12 11:35:33 UTC 2007" */ -#define LIBSSH2_TIMESTAMP "Thu Jun 20 06:19:26 UTC 2019" +#define LIBSSH2_TIMESTAMP "Sun 29 Aug 2021 08:37:50 PM UTC" #ifndef RC_INVOKED @@ -235,9 +235,11 @@ typedef off_t libssh2_struct_stat_size; /* Default generate and safe prime sizes for diffie-hellman-group-exchange-sha1 */ -#define LIBSSH2_DH_GEX_MINGROUP 1024 -#define LIBSSH2_DH_GEX_OPTGROUP 1536 -#define LIBSSH2_DH_GEX_MAXGROUP 2048 +#define LIBSSH2_DH_GEX_MINGROUP 2048 +#define LIBSSH2_DH_GEX_OPTGROUP 4096 +#define LIBSSH2_DH_GEX_MAXGROUP 8192 + +#define LIBSSH2_DH_MAX_MODULUS_BITS 16384 /* Defaults for pty requests */ #define LIBSSH2_TERM_WIDTH 80 @@ -503,6 +505,7 @@ typedef struct _LIBSSH2_POLLFD { #define LIBSSH2_ERROR_KNOWN_HOSTS -46 #define LIBSSH2_ERROR_CHANNEL_WINDOW_FULL -47 #define LIBSSH2_ERROR_KEYFILE_AUTH_FAILED -48 +#define LIBSSH2_ERROR_RANDGEN -49 /* this is a define to provide the old (<= 1.2.7) name */ #define LIBSSH2_ERROR_BANNER_NONE LIBSSH2_ERROR_BANNER_RECV @@ -545,7 +548,7 @@ LIBSSH2_API void libssh2_free(LIBSSH2_SESSION *session, void *ptr); * * Fills algs with a list of supported acryptographic algorithms. Returns a * non-negative number (number of supported algorithms) on success or a - * negative number (an eror code) on failure. + * negative number (an error code) on failure. * * NOTE: on success, algs must be deallocated (by calling libssh2_free) when * not needed anymore @@ -688,7 +691,7 @@ libssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session, * response_callback is provided with filled by library prompts array, * but client must allocate and fill individual responses. Responses * array is already allocated. Responses data will be freed by libssh2 - * after callback return, but before subsequent callback invokation. + * after callback return, but before subsequent callback invocation. */ LIBSSH2_API int libssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION* session, @@ -718,7 +721,7 @@ LIBSSH2_API int libssh2_poll(LIBSSH2_POLLFD *fds, unsigned int nfds, #define SSH_EXTENDED_DATA_STDERR 1 -/* Returned by any function that would block during a read/write opperation */ +/* Returned by any function that would block during a read/write operation */ #define LIBSSH2CHANNEL_EAGAIN LIBSSH2_ERROR_EAGAIN LIBSSH2_API LIBSSH2_CHANNEL * @@ -761,6 +764,8 @@ LIBSSH2_API int libssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel, (unsigned int)strlen(varname), (value), \ (unsigned int)strlen(value)) +LIBSSH2_API int libssh2_channel_request_auth_agent(LIBSSH2_CHANNEL *channel); + LIBSSH2_API int libssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel, const char *term, unsigned int term_len, @@ -987,7 +992,7 @@ libssh2_knownhost_init(LIBSSH2_SESSION *session); #define LIBSSH2_KNOWNHOST_KEYENC_RAW (1<<16) #define LIBSSH2_KNOWNHOST_KEYENC_BASE64 (2<<16) -/* type of key (3 bits) */ +/* type of key (4 bits) */ #define LIBSSH2_KNOWNHOST_KEY_MASK (15<<18) #define LIBSSH2_KNOWNHOST_KEY_SHIFT 18 #define LIBSSH2_KNOWNHOST_KEY_RSA1 (1<<18) @@ -1165,7 +1170,7 @@ libssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts, * libssh2_knownhost_get() * * Traverse the internal list of known hosts. Pass NULL to 'prev' to get - * the first one. Or pass a poiner to the previously returned one to get the + * the first one. Or pass a pointer to the previously returned one to get the * next. * * Returns: @@ -1221,7 +1226,7 @@ libssh2_agent_list_identities(LIBSSH2_AGENT *agent); * libssh2_agent_get_identity() * * Traverse the internal list of public keys. Pass NULL to 'prev' to get - * the first one. Or pass a poiner to the previously returned one to get the + * the first one. Or pass a pointer to the previously returned one to get the * next. * * Returns: diff --git a/vendor/libssh2/include/libssh2_sftp.h b/vendor/libssh2/include/libssh2_sftp.h index 4a750b3e3..476ea8704 100644 --- a/vendor/libssh2/include/libssh2_sftp.h +++ b/vendor/libssh2/include/libssh2_sftp.h @@ -189,32 +189,32 @@ struct _LIBSSH2_SFTP_STATVFS { #define LIBSSH2_FXF_EXCL 0x00000020 /* SFTP Status Codes (returned by libssh2_sftp_last_error() ) */ -#define LIBSSH2_FX_OK 0 -#define LIBSSH2_FX_EOF 1 -#define LIBSSH2_FX_NO_SUCH_FILE 2 -#define LIBSSH2_FX_PERMISSION_DENIED 3 -#define LIBSSH2_FX_FAILURE 4 -#define LIBSSH2_FX_BAD_MESSAGE 5 -#define LIBSSH2_FX_NO_CONNECTION 6 -#define LIBSSH2_FX_CONNECTION_LOST 7 -#define LIBSSH2_FX_OP_UNSUPPORTED 8 -#define LIBSSH2_FX_INVALID_HANDLE 9 -#define LIBSSH2_FX_NO_SUCH_PATH 10 -#define LIBSSH2_FX_FILE_ALREADY_EXISTS 11 -#define LIBSSH2_FX_WRITE_PROTECT 12 -#define LIBSSH2_FX_NO_MEDIA 13 -#define LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM 14 -#define LIBSSH2_FX_QUOTA_EXCEEDED 15 -#define LIBSSH2_FX_UNKNOWN_PRINCIPLE 16 /* Initial mis-spelling */ -#define LIBSSH2_FX_UNKNOWN_PRINCIPAL 16 -#define LIBSSH2_FX_LOCK_CONFlICT 17 /* Initial mis-spelling */ -#define LIBSSH2_FX_LOCK_CONFLICT 17 -#define LIBSSH2_FX_DIR_NOT_EMPTY 18 -#define LIBSSH2_FX_NOT_A_DIRECTORY 19 -#define LIBSSH2_FX_INVALID_FILENAME 20 -#define LIBSSH2_FX_LINK_LOOP 21 - -/* Returned by any function that would block during a read/write opperation */ +#define LIBSSH2_FX_OK 0UL +#define LIBSSH2_FX_EOF 1UL +#define LIBSSH2_FX_NO_SUCH_FILE 2UL +#define LIBSSH2_FX_PERMISSION_DENIED 3UL +#define LIBSSH2_FX_FAILURE 4UL +#define LIBSSH2_FX_BAD_MESSAGE 5UL +#define LIBSSH2_FX_NO_CONNECTION 6UL +#define LIBSSH2_FX_CONNECTION_LOST 7UL +#define LIBSSH2_FX_OP_UNSUPPORTED 8UL +#define LIBSSH2_FX_INVALID_HANDLE 9UL +#define LIBSSH2_FX_NO_SUCH_PATH 10UL +#define LIBSSH2_FX_FILE_ALREADY_EXISTS 11UL +#define LIBSSH2_FX_WRITE_PROTECT 12UL +#define LIBSSH2_FX_NO_MEDIA 13UL +#define LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM 14UL +#define LIBSSH2_FX_QUOTA_EXCEEDED 15UL +#define LIBSSH2_FX_UNKNOWN_PRINCIPLE 16UL /* Initial mis-spelling */ +#define LIBSSH2_FX_UNKNOWN_PRINCIPAL 16UL +#define LIBSSH2_FX_LOCK_CONFlICT 17UL /* Initial mis-spelling */ +#define LIBSSH2_FX_LOCK_CONFLICT 17UL +#define LIBSSH2_FX_DIR_NOT_EMPTY 18UL +#define LIBSSH2_FX_NOT_A_DIRECTORY 19UL +#define LIBSSH2_FX_INVALID_FILENAME 20UL +#define LIBSSH2_FX_LINK_LOOP 21UL + +/* Returned by any function that would block during a read/write operation */ #define LIBSSH2SFTP_EAGAIN LIBSSH2_ERROR_EAGAIN /* SFTP API */ diff --git a/vendor/libssh2/install-sh b/vendor/libssh2/install-sh index 8175c640f..ec298b537 100755 --- a/vendor/libssh2/install-sh +++ b/vendor/libssh2/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2018-03-11.20; # UTC +scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -69,6 +69,11 @@ posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -99,18 +104,28 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do @@ -137,8 +152,13 @@ while test $# -ne 0; do -o) chowncmd="$chownprog $2" shift;; + -p) cpprog="$cpprog -p";; + -s) stripcmd=$stripprog;; + -S) backupsuffix="$2" + shift;; + -t) is_target_a_directory=always dst_arg=$2 @@ -255,6 +275,10 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -301,22 +325,6 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then @@ -326,52 +334,49 @@ do fi posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - # Note that $RANDOM variable is not portable (e.g. dash); Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - - trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 - - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p' feature. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac;; + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; esac if @@ -382,7 +387,7 @@ do then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. @@ -411,7 +416,7 @@ do prefixes= else if $posix_mkdir; then - (umask=$mkdir_umask && + (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 @@ -451,7 +456,18 @@ do trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -477,6 +493,13 @@ do then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -491,9 +514,9 @@ do # file should still install successfully. { test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || + $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 diff --git a/vendor/libssh2/ltmain.sh b/vendor/libssh2/ltmain.sh index f402c9c17..21e5e0784 100644 --- a/vendor/libssh2/ltmain.sh +++ b/vendor/libssh2/ltmain.sh @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-10" +VERSION="2.4.6 Debian-2.4.6-15" package_revision=2.4.6 @@ -387,7 +387,7 @@ EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # -# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +# debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: @@ -2141,7 +2141,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.6-10 + version: $progname $scriptversion Debian-2.4.6-15 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` @@ -7368,10 +7368,12 @@ func_mode_link () # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer # -fuse-ld=* Linker select flags for GCC + # -static-* direct GCC to link specific libraries statically + # -fcilkplus Cilk Plus language extension features for C/C++ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ - -specs=*|-fsanitize=*|-fuse-ld=*) + -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" diff --git a/vendor/libssh2/m4/libtool.m4 b/vendor/libssh2/m4/libtool.m4 index 9d6dd9fce..c4c02946d 100644 --- a/vendor/libssh2/m4/libtool.m4 +++ b/vendor/libssh2/m4/libtool.m4 @@ -1041,8 +1041,8 @@ int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$AR cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cr libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF @@ -1071,11 +1071,11 @@ _LT_EOF # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + 10.0,*86*-darwin8*|10.0,*-darwin[[912]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - 10.*) + 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; @@ -1492,7 +1492,7 @@ need_locks=$enable_libtool_lock m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} -: ${AR_FLAGS=cru} +: ${AR_FLAGS=cr} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) diff --git a/vendor/libssh2/missing b/vendor/libssh2/missing index 625aeb118..8d0eaad25 100755 --- a/vendor/libssh2/missing +++ b/vendor/libssh2/missing @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify diff --git a/vendor/libssh2/src/CMakeLists.txt b/vendor/libssh2/src/CMakeLists.txt index 2eaf4cc2c..eee1a80d4 100644 --- a/vendor/libssh2/src/CMakeLists.txt +++ b/vendor/libssh2/src/CMakeLists.txt @@ -176,6 +176,7 @@ include(GNUInstallDirs) set(SOURCES ${CRYPTO_SOURCES} agent.c + agent_win.c blf.h bcrypt_pbkdf.c blowfish.c @@ -359,6 +360,11 @@ elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") target_compile_definitions(libssh2 PRIVATE LIBSSH2_DARWIN) endif() +if(MSVC) + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Zi /Od") + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /DEBUG") +endif() + if(CMAKE_VERSION VERSION_LESS "2.8.12") # Fall back to over-linking dependencies target_link_libraries(libssh2 ${LIBRARIES}) @@ -392,7 +398,7 @@ set(RUNTIME_DEPENDENCIES ${_RUNTIME_DEPENDENCIES} CACHE INTERNAL ## During package installation, install Libssh2Config.cmake install(EXPORT Libssh2Config NAMESPACE Libssh2:: - DESTINATION lib/cmake/libssh2) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libssh2) ## During build, register directly from build tree # create Libssh2Config.cmake @@ -424,4 +430,4 @@ write_basic_package_version_file( COMPATIBILITY SameMajorVersion) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/Libssh2ConfigVersion.cmake - DESTINATION lib/cmake/libssh2) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libssh2) diff --git a/vendor/libssh2/src/Makefile.in b/vendor/libssh2/src/Makefile.in index c00d9dbae..d76490ab6 100644 --- a/vendor/libssh2/src/Makefile.in +++ b/vendor/libssh2/src/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.4 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -100,8 +100,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = libssh2_config.h \ - $(top_builddir)/example/libssh2_config.h +CONFIG_HEADER = libssh2_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; @@ -138,10 +137,10 @@ am__libssh2_la_SOURCES_DIST = channel.c comp.c crypt.c hostkey.c kex.c \ mac.c misc.c packet.c publickey.c scp.c session.c sftp.c \ userauth.c transport.c version.c knownhost.c agent.c \ libgcrypt.c mbedtls.c openssl.c wincng.c pem.c keepalive.c \ - global.c blowfish.c bcrypt_pbkdf.c libssh2_priv.h libgcrypt.h \ - mbedtls.h openssl.h wincng.h transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h \ - blf.h + global.c blowfish.c bcrypt_pbkdf.c agent_win.c libssh2_priv.h \ + libgcrypt.h mbedtls.h openssl.h wincng.h transport.h channel.h \ + comp.h mac.h misc.h packet.h userauth.h session.h sftp.h \ + crypto.h blf.h agent.h @LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_FALSE@@WINCNG_TRUE@am__objects_1 = wincng.lo @LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_TRUE@am__objects_1 = \ @LIBGCRYPT_FALSE@@MBEDTLS_FALSE@@OPENSSL_TRUE@ openssl.lo @@ -151,7 +150,7 @@ am__objects_2 = channel.lo comp.lo crypt.lo hostkey.lo kex.lo mac.lo \ misc.lo packet.lo publickey.lo scp.lo session.lo sftp.lo \ userauth.lo transport.lo version.lo knownhost.lo agent.lo \ $(am__objects_1) pem.lo keepalive.lo global.lo blowfish.lo \ - bcrypt_pbkdf.lo + bcrypt_pbkdf.lo agent_win.lo am__objects_3 = am__objects_4 = $(am__objects_3) am_libssh2_la_OBJECTS = $(am__objects_2) $(am__objects_4) @@ -178,7 +177,7 @@ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles -am__depfiles_remade = ./$(DEPDIR)/agent.Plo \ +am__depfiles_remade = ./$(DEPDIR)/agent.Plo ./$(DEPDIR)/agent_win.Plo \ ./$(DEPDIR)/bcrypt_pbkdf.Plo ./$(DEPDIR)/blowfish.Plo \ ./$(DEPDIR)/channel.Plo ./$(DEPDIR)/comp.Plo \ ./$(DEPDIR)/crypt.Plo ./$(DEPDIR)/global.Plo \ @@ -218,8 +217,8 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)libssh2_config.h.in +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ + libssh2_config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. @@ -236,8 +235,6 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags am__DIST_COMMON = $(srcdir)/../Makefile.OpenSSL.inc \ $(srcdir)/../Makefile.WinCNG.inc $(srcdir)/../Makefile.inc \ $(srcdir)/../Makefile.libgcrypt.inc \ @@ -259,6 +256,12 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -269,6 +272,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ @@ -302,6 +306,7 @@ LIBSSL_PREFIX = @LIBSSL_PREFIX@ LIBTOOL = @LIBTOOL@ LIBZ = @LIBZ@ LIBZ_PREFIX = @LIBZ_PREFIX@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ @@ -343,6 +348,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -408,10 +414,10 @@ AUTOMAKE_OPTIONS = foreign nostdinc CSOURCES = channel.c comp.c crypt.c hostkey.c kex.c mac.c misc.c \ packet.c publickey.c scp.c session.c sftp.c userauth.c transport.c \ version.c knownhost.c agent.c $(CRYPTO_CSOURCES) pem.c keepalive.c global.c \ - blowfish.c bcrypt_pbkdf.c + blowfish.c bcrypt_pbkdf.c agent_win.c HHEADERS = libssh2_priv.h $(CRYPTO_HHEADERS) transport.h channel.h comp.h \ - mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h + mac.h misc.h packet.h userauth.h session.h sftp.h crypto.h blf.h agent.h # Get the CRYPTO_CSOURCES, CRYPTO_HHEADERS and CRYPTO_LTLIBS defines @@ -554,6 +560,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/agent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/agent_win.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcrypt_pbkdf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blowfish.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel.Plo@am__quote@ # am--include-marker @@ -664,7 +671,6 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -742,6 +748,7 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ distclean: distclean-am -rm -f ./$(DEPDIR)/agent.Plo + -rm -f ./$(DEPDIR)/agent_win.Plo -rm -f ./$(DEPDIR)/bcrypt_pbkdf.Plo -rm -f ./$(DEPDIR)/blowfish.Plo -rm -f ./$(DEPDIR)/channel.Plo @@ -813,6 +820,7 @@ installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/agent.Plo + -rm -f ./$(DEPDIR)/agent_win.Plo -rm -f ./$(DEPDIR)/bcrypt_pbkdf.Plo -rm -f ./$(DEPDIR)/blowfish.Plo -rm -f ./$(DEPDIR)/channel.Plo diff --git a/vendor/libssh2/src/agent.c b/vendor/libssh2/src/agent.c index 0c8d88166..85c3e34af 100644 --- a/vendor/libssh2/src/agent.c +++ b/vendor/libssh2/src/agent.c @@ -38,6 +38,7 @@ */ #include "libssh2_priv.h" +#include "agent.h" #include "misc.h" #include #ifdef HAVE_SYS_UN_H @@ -50,6 +51,9 @@ #endif #include "userauth.h" #include "session.h" +#ifdef WIN32 +#include +#endif /* Requests from client to agent for protocol 1 key operations */ #define SSH_AGENTC_REQUEST_RSA_IDENTITIES 1 @@ -90,58 +94,6 @@ #define SSH_AGENT_CONSTRAIN_LIFETIME 1 #define SSH_AGENT_CONSTRAIN_CONFIRM 2 -/* non-blocking mode on agent connection is not yet implemented, but - for future use. */ -typedef enum { - agent_NB_state_init = 0, - agent_NB_state_request_created, - agent_NB_state_request_length_sent, - agent_NB_state_request_sent, - agent_NB_state_response_length_received, - agent_NB_state_response_received -} agent_nonblocking_states; - -typedef struct agent_transaction_ctx { - unsigned char *request; - size_t request_len; - unsigned char *response; - size_t response_len; - agent_nonblocking_states state; -} *agent_transaction_ctx_t; - -typedef int (*agent_connect_func)(LIBSSH2_AGENT *agent); -typedef int (*agent_transact_func)(LIBSSH2_AGENT *agent, - agent_transaction_ctx_t transctx); -typedef int (*agent_disconnect_func)(LIBSSH2_AGENT *agent); - -struct agent_publickey { - struct list_node node; - - /* this is the struct we expose externally */ - struct libssh2_agent_publickey external; -}; - -struct agent_ops { - agent_connect_func connect; - agent_transact_func transact; - agent_disconnect_func disconnect; -}; - -struct _LIBSSH2_AGENT -{ - LIBSSH2_SESSION *session; /* the session this "belongs to" */ - - libssh2_socket_t fd; - - struct agent_ops *ops; - - struct agent_transaction_ctx transctx; - struct agent_publickey *identity; - struct list_head head; /* list of public keys */ - - char *identity_agent_path; /* Path to a custom identity agent socket */ -}; - #ifdef PF_UNIX static int agent_connect_unix(LIBSSH2_AGENT *agent) @@ -175,6 +127,38 @@ agent_connect_unix(LIBSSH2_AGENT *agent) return LIBSSH2_ERROR_NONE; } +#define RECV_SEND_ALL(func, socket, buffer, length, flags, abstract) \ + int rc; \ + size_t finished = 0; \ + \ + while(finished < length) { \ + rc = func(socket, \ + (char *)buffer + finished, length - finished, \ + flags, abstract); \ + if(rc < 0) \ + return rc; \ + \ + finished += rc; \ + } \ + \ + return finished; + +static ssize_t _send_all(LIBSSH2_SEND_FUNC(func), libssh2_socket_t socket, + const void *buffer, size_t length, + int flags, void **abstract) +{ + RECV_SEND_ALL(func, socket, buffer, length, flags, abstract); +} + +static ssize_t _recv_all(LIBSSH2_RECV_FUNC(func), libssh2_socket_t socket, + void *buffer, size_t length, + int flags, void **abstract) +{ + RECV_SEND_ALL(func, socket, buffer, length, flags, abstract); +} + +#undef RECV_SEND_ALL + static int agent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) { @@ -184,7 +168,8 @@ agent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) /* Send the length of the request */ if(transctx->state == agent_NB_state_request_created) { _libssh2_htonu32(buf, transctx->request_len); - rc = LIBSSH2_SEND_FD(agent->session, agent->fd, buf, sizeof buf, 0); + rc = _send_all(agent->session->send, agent->fd, + buf, sizeof buf, 0, &agent->session->abstract); if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; else if(rc < 0) @@ -195,8 +180,8 @@ agent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) /* Send the request body */ if(transctx->state == agent_NB_state_request_length_sent) { - rc = LIBSSH2_SEND_FD(agent->session, agent->fd, transctx->request, - transctx->request_len, 0); + rc = _send_all(agent->session->send, agent->fd, transctx->request, + transctx->request_len, 0, &agent->session->abstract); if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; else if(rc < 0) @@ -207,7 +192,8 @@ agent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) /* Receive the length of a response */ if(transctx->state == agent_NB_state_request_sent) { - rc = LIBSSH2_RECV_FD(agent->session, agent->fd, buf, sizeof buf, 0); + rc = _recv_all(agent->session->recv, agent->fd, + buf, sizeof buf, 0, &agent->session->abstract); if(rc < 0) { if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; @@ -225,8 +211,8 @@ agent_transact_unix(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) /* Receive the response body */ if(transctx->state == agent_NB_state_response_length_received) { - rc = LIBSSH2_RECV_FD(agent->session, agent->fd, transctx->response, - transctx->response_len, 0); + rc = _recv_all(agent->session->recv, agent->fd, transctx->response, + transctx->response_len, 0, &agent->session->abstract); if(rc < 0) { if(rc == -EAGAIN) return LIBSSH2_ERROR_EAGAIN; @@ -274,7 +260,7 @@ static int agent_connect_pageant(LIBSSH2_AGENT *agent) { HWND hwnd; - hwnd = FindWindow("Pageant", "Pageant"); + hwnd = FindWindowA("Pageant", "Pageant"); if(!hwnd) return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, "failed connecting agent"); @@ -297,15 +283,15 @@ agent_transact_pageant(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) return _libssh2_error(agent->session, LIBSSH2_ERROR_INVAL, "illegal input"); - hwnd = FindWindow("Pageant", "Pageant"); + hwnd = FindWindowA("Pageant", "Pageant"); if(!hwnd) return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, "found no pageant"); snprintf(mapname, sizeof(mapname), "PageantRequest%08x%c", (unsigned)GetCurrentThreadId(), '\0'); - filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, - 0, PAGEANT_MAX_MSGLEN, mapname); + filemap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, + 0, PAGEANT_MAX_MSGLEN, mapname); if(filemap == NULL || filemap == INVALID_HANDLE_VALUE) return _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, @@ -370,6 +356,7 @@ static struct { } supported_backends[] = { #ifdef WIN32 {"Pageant", &agent_ops_pageant}, + {"OpenSSH", &agent_ops_openssh}, #endif /* WIN32 */ #ifdef PF_UNIX {"Unix", &agent_ops_unix}, @@ -407,6 +394,7 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, _libssh2_store_u32(&s, 0); transctx->request_len = s - transctx->request; + transctx->send_recv_total = 0; transctx->state = agent_NB_state_request_created; } @@ -507,6 +495,7 @@ agent_list_identities(LIBSSH2_AGENT *agent) if(transctx->state == agent_NB_state_init) { transctx->request = &c; transctx->request_len = 1; + transctx->send_recv_total = 0; transctx->state = agent_NB_state_request_created; } @@ -522,7 +511,9 @@ agent_list_identities(LIBSSH2_AGENT *agent) rc = agent->ops->transact(agent, transctx); if(rc) { - goto error; + LIBSSH2_FREE(agent->session, transctx->response); + transctx->response = NULL; + return rc; } transctx->request = NULL; @@ -681,6 +672,12 @@ libssh2_agent_init(LIBSSH2_SESSION *session) agent->identity_agent_path = NULL; _libssh2_list_init(&agent->head); +#ifdef WIN32 + agent->pipe = INVALID_HANDLE_VALUE; + memset(&agent->overlapped, 0, sizeof(OVERLAPPED)); + agent->pending_io = FALSE; +#endif + return agent; } diff --git a/vendor/libssh2/src/agent.h b/vendor/libssh2/src/agent.h new file mode 100644 index 000000000..dfac0715c --- /dev/null +++ b/vendor/libssh2/src/agent.h @@ -0,0 +1,112 @@ +#ifndef __LIBSSH2_AGENT_H +#define __LIBSSH2_AGENT_H +/* + * Copyright (c) 2009 by Daiki Ueno + * Copyright (C) 2010-2014 by Daniel Stenberg + * 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. + * + * Neither the name of the copyright holder nor the names + * of any other contributors may be used to endorse or + * promote products derived from this software without + * specific prior written permission. + * + * 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. + */ + +#include "libssh2_priv.h" +#include "misc.h" +#include "session.h" +#ifdef WIN32 +#include +#endif + +/* non-blocking mode on agent connection is not yet implemented, but + for future use. */ +typedef enum { + agent_NB_state_init = 0, + agent_NB_state_request_created, + agent_NB_state_request_length_sent, + agent_NB_state_request_sent, + agent_NB_state_response_length_received, + agent_NB_state_response_received +} agent_nonblocking_states; + +typedef struct agent_transaction_ctx { + unsigned char *request; + size_t request_len; + unsigned char *response; + size_t response_len; + agent_nonblocking_states state; + size_t send_recv_total; +} *agent_transaction_ctx_t; + +typedef int (*agent_connect_func)(LIBSSH2_AGENT *agent); +typedef int (*agent_transact_func)(LIBSSH2_AGENT *agent, + agent_transaction_ctx_t transctx); +typedef int (*agent_disconnect_func)(LIBSSH2_AGENT *agent); + +struct agent_publickey { + struct list_node node; + + /* this is the struct we expose externally */ + struct libssh2_agent_publickey external; +}; + +struct agent_ops { + agent_connect_func connect; + agent_transact_func transact; + agent_disconnect_func disconnect; +}; + +struct _LIBSSH2_AGENT +{ + LIBSSH2_SESSION *session; /* the session this "belongs to" */ + + libssh2_socket_t fd; + + struct agent_ops *ops; + + struct agent_transaction_ctx transctx; + struct agent_publickey *identity; + struct list_head head; /* list of public keys */ + + char *identity_agent_path; /* Path to a custom identity agent socket */ + +#ifdef WIN32 + OVERLAPPED overlapped; + HANDLE pipe; + BOOL pending_io; +#endif +}; + +#ifdef WIN32 +extern struct agent_ops agent_ops_openssh; +#endif + +#endif /* __LIBSSH2_AGENT_H */ diff --git a/vendor/libssh2/src/agent_win.c b/vendor/libssh2/src/agent_win.c new file mode 100644 index 000000000..a1605a95f --- /dev/null +++ b/vendor/libssh2/src/agent_win.c @@ -0,0 +1,361 @@ +/* + * Copyright (c) 2009 by Daiki Ueno + * Copyright (C) 2010-2014 by Daniel Stenberg + * 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. + * + * Neither the name of the copyright holder nor the names + * of any other contributors may be used to endorse or + * promote products derived from this software without + * specific prior written permission. + * + * 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. + */ + +#include "libssh2_priv.h" +#include "agent.h" +#include "misc.h" +#include +#ifdef HAVE_SYS_UN_H +#include +#else +/* Use the existence of sys/un.h as a test if Unix domain socket is + supported. winsock*.h define PF_UNIX/AF_UNIX but do not actually + support them. */ +#undef PF_UNIX +#endif +#include "userauth.h" +#include "session.h" +#ifdef WIN32 +#include +#endif + +#ifdef WIN32 +/* Code to talk to OpenSSH was taken and modified from the Win32 port of + * Portable OpenSSH by the PowerShell team. Commit + * 8ab565c53f3619d6a1f5ac229e212cad8a52852c of + * https://github.com/PowerShell/openssh-portable.git was used as the base, + * specificaly the following files: + * + * - contrib\win32\win32compat\fileio.c + * - Structure of agent_connect_openssh from ssh_get_authentication_socket + * - Structure of agent_transact_openssh from ssh_request_reply + * - contrib\win32\win32compat\wmain_common.c + * - Windows equivalent functions for common Unix functions, inlined into + * this implementation + * - fileio_connect replacing connect + * - fileio_read replacing read + * - fileio_write replacing write + * - fileio_close replacing close + * + * Author: Tatu Ylonen + * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland + * All rights reserved + * Functions for connecting the local authentication agent. + * + * As far as I am concerned, the code I have written for this software + * can be used freely for any purpose. Any derived versions of this + * software must be clearly marked as such, and if the derived work is + * incompatible with the protocol description in the RFC file, it must be + * called by a name other than "ssh" or "Secure Shell". + * + * SSH2 implementation, + * Copyright (c) 2000 Markus Friedl. All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * Copyright (c) 2015 Microsoft Corp. + * All rights reserved + * + * Microsoft openssh win32 port + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ + +#define WIN32_OPENSSH_AGENT_SOCK "\\\\.\\pipe\\openssh-ssh-agent" + +static int +agent_connect_openssh(LIBSSH2_AGENT *agent) +{ + int ret = LIBSSH2_ERROR_NONE; + const char *path; + HANDLE pipe = INVALID_HANDLE_VALUE; + HANDLE event = NULL; + + path = agent->identity_agent_path; + if(!path) { + path = getenv("SSH_AUTH_SOCK"); + if(!path) + path = WIN32_OPENSSH_AGENT_SOCK; + } + + for(;;) { + pipe = CreateFileA( + path, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + /* Non-blocking mode for agent connections is not implemented at + * the point this was implemented. The code for Win32 OpenSSH + * should support non-blocking IO, but the code calling it doesn't + * support it as of yet. + * When non-blocking IO is implemented for the surrounding code, + * uncomment the following line to enable support within the Win32 + * OpenSSH code. + */ + /* FILE_FLAG_OVERLAPPED | */ + SECURITY_SQOS_PRESENT | + SECURITY_IDENTIFICATION, + NULL + ); + + if(pipe != INVALID_HANDLE_VALUE) + break; + if(GetLastError() != ERROR_PIPE_BUSY) + break; + + /* Wait up to 1 second for a pipe instance to become available */ + if(!WaitNamedPipeA(path, 1000)) + break; + } + + if(pipe == INVALID_HANDLE_VALUE) { + ret = _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, + "unable to connect to agent pipe"); + goto cleanup; + } + + if(SetHandleInformation(pipe, HANDLE_FLAG_INHERIT, 0) == FALSE) { + ret = _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, + "unable to set handle information of agent pipe"); + goto cleanup; + } + + event = CreateEventA(NULL, TRUE, FALSE, NULL); + if(event == NULL) { + ret = _libssh2_error(agent->session, LIBSSH2_ERROR_AGENT_PROTOCOL, + "unable to create async I/O event"); + goto cleanup; + } + + agent->pipe = pipe; + pipe = INVALID_HANDLE_VALUE; + agent->overlapped.hEvent = event; + event = NULL; + agent->fd = 0; /* Mark as the connection has been established */ + +cleanup: + if(event != NULL) + CloseHandle(event); + if(pipe != INVALID_HANDLE_VALUE) + CloseHandle(pipe); + return ret; +} + +#define RECV_SEND_ALL(func, agent, buffer, length, total) \ + DWORD bytes_transfered; \ + BOOL ret; \ + DWORD err; \ + int rc; \ + \ + while(*total < length) { \ + if(!agent->pending_io) \ + ret = func(agent->pipe, (char *)buffer + *total, \ + (DWORD)(length - *total), &bytes_transfered, \ + &agent->overlapped); \ + else \ + ret = GetOverlappedResult(agent->pipe, &agent->overlapped, \ + &bytes_transfered, FALSE); \ + \ + *total += bytes_transfered; \ + if(!ret) { \ + err = GetLastError(); \ + if((!agent->pending_io && ERROR_IO_PENDING == err) \ + || (agent->pending_io && ERROR_IO_INCOMPLETE == err)) { \ + agent->pending_io = TRUE; \ + return LIBSSH2_ERROR_EAGAIN; \ + } \ + \ + return LIBSSH2_ERROR_SOCKET_NONE; \ + } \ + agent->pending_io = FALSE; \ + } \ + \ + rc = (int)*total; \ + *total = 0; \ + return rc; + +static int +win32_openssh_send_all(LIBSSH2_AGENT *agent, void *buffer, size_t length, + size_t *send_recv_total) +{ + RECV_SEND_ALL(WriteFile, agent, buffer, length, send_recv_total) +} + +static int +win32_openssh_recv_all(LIBSSH2_AGENT *agent, void *buffer, size_t length, + size_t *send_recv_total) +{ + RECV_SEND_ALL(ReadFile, agent, buffer, length, send_recv_total) +} + +#undef RECV_SEND_ALL + +static int +agent_transact_openssh(LIBSSH2_AGENT *agent, agent_transaction_ctx_t transctx) +{ + unsigned char buf[4]; + int rc; + + /* Send the length of the request */ + if(transctx->state == agent_NB_state_request_created) { + _libssh2_htonu32(buf, (uint32_t)transctx->request_len); + rc = win32_openssh_send_all(agent, buf, sizeof buf, + &transctx->send_recv_total); + if(rc == LIBSSH2_ERROR_EAGAIN) + return LIBSSH2_ERROR_EAGAIN; + else if(rc < 0) + return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND, + "agent send failed"); + transctx->state = agent_NB_state_request_length_sent; + } + + /* Send the request body */ + if(transctx->state == agent_NB_state_request_length_sent) { + rc = win32_openssh_send_all(agent, transctx->request, + transctx->request_len, + &transctx->send_recv_total); + if(rc == LIBSSH2_ERROR_EAGAIN) + return LIBSSH2_ERROR_EAGAIN; + else if(rc < 0) + return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_SEND, + "agent send failed"); + transctx->state = agent_NB_state_request_sent; + } + + /* Receive the length of the body */ + if(transctx->state == agent_NB_state_request_sent) { + rc = win32_openssh_recv_all(agent, buf, sizeof buf, + &transctx->send_recv_total); + if(rc == LIBSSH2_ERROR_EAGAIN) + return LIBSSH2_ERROR_EAGAIN; + else if(rc < 0) + return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_RECV, + "agent recv failed"); + + transctx->response_len = _libssh2_ntohu32(buf); + transctx->response = LIBSSH2_ALLOC(agent->session, + transctx->response_len); + if(!transctx->response) + return LIBSSH2_ERROR_ALLOC; + + transctx->state = agent_NB_state_response_length_received; + } + + /* Receive the response body */ + if(transctx->state == agent_NB_state_response_length_received) { + rc = win32_openssh_recv_all(agent, transctx->response, + transctx->response_len, + &transctx->send_recv_total); + if(rc == LIBSSH2_ERROR_EAGAIN) + return LIBSSH2_ERROR_EAGAIN; + else if(rc < 0) + return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_RECV, + "agent recv failed"); + transctx->state = agent_NB_state_response_received; + } + + return LIBSSH2_ERROR_NONE; +} + +static int +agent_disconnect_openssh(LIBSSH2_AGENT *agent) +{ + if(!CancelIo(agent->pipe)) + return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_DISCONNECT, + "failed to cancel pending IO of agent pipe"); + if(!CloseHandle(agent->overlapped.hEvent)) + return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_DISCONNECT, + "failed to close handle to async I/O event"); + agent->overlapped.hEvent = NULL; + /* let queued APCs (if any) drain */ + SleepEx(0, TRUE); + if(!CloseHandle(agent->pipe)) + return _libssh2_error(agent->session, LIBSSH2_ERROR_SOCKET_DISCONNECT, + "failed to close handle to agent pipe"); + + agent->pipe = INVALID_HANDLE_VALUE; + agent->fd = LIBSSH2_INVALID_SOCKET; + + return LIBSSH2_ERROR_NONE; +} + +struct agent_ops agent_ops_openssh = { + agent_connect_openssh, + agent_transact_openssh, + agent_disconnect_openssh +}; +#endif /* WIN32 */ diff --git a/vendor/libssh2/src/bcrypt_pbkdf.c b/vendor/libssh2/src/bcrypt_pbkdf.c index e92969a00..f782bcac5 100644 --- a/vendor/libssh2/src/bcrypt_pbkdf.c +++ b/vendor/libssh2/src/bcrypt_pbkdf.c @@ -36,7 +36,7 @@ * function with the following modifications: * 1. The input password and salt are preprocessed with SHA512. * 2. The output length is expanded to 256 bits. - * 3. Subsequently the magic string to be encrypted is lengthened and modifed + * 3. Subsequently the magic string to be encrypted is lengthened and modified * to "OxychromaticBlowfishSwatDynamite" * 4. The hash function is defined to perform 64 rounds of initial state * expansion. (More rounds are performed by iterating the hash.) @@ -81,7 +81,7 @@ bcrypt_hash(uint8_t *sha2pass, uint8_t *sha2salt, uint8_t *out) cdata[i] = Blowfish_stream2word(ciphertext, sizeof(ciphertext), &j); for(i = 0; i < 64; i++) - blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t)); + blf_enc(&state, cdata, BCRYPT_BLOCKS / 2); /* copy out */ for(i = 0; i < BCRYPT_BLOCKS; i++) { @@ -158,7 +158,7 @@ bcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt, } /* - * pbkdf2 deviation: ouput the key material non-linearly. + * pbkdf2 deviation: output the key material non-linearly. */ amt = MINIMUM(amt, keylen); for(i = 0; i < amt; i++) { diff --git a/vendor/libssh2/src/blf.h b/vendor/libssh2/src/blf.h index 1a85e6eef..5b7c8aae0 100644 --- a/vendor/libssh2/src/blf.h +++ b/vendor/libssh2/src/blf.h @@ -1,3 +1,5 @@ +#ifndef __LIBSSH2_BLF_H +#define __LIBSSH2_BLF_H /* $OpenBSD: blf.h,v 1.7 2007/03/14 17:59:41 grunk Exp $ */ /* * Blowfish - a fast block cipher designed by Bruce Schneier @@ -31,9 +33,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _BLF_H_ -#define _BLF_H_ - #if !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) /* Schneier specifies a maximum key length of 56 bytes. @@ -87,4 +86,4 @@ int bcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt, uint8_t *key, size_t keylen, unsigned int rounds); #endif /* !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) */ -#endif /* _BLF_H */ +#endif /* __LIBSSH2_BLF_H */ diff --git a/vendor/libssh2/src/channel.c b/vendor/libssh2/src/channel.c index 7bbeeb88f..78ed40e87 100644 --- a/vendor/libssh2/src/channel.c +++ b/vendor/libssh2/src/channel.c @@ -236,6 +236,7 @@ _libssh2_channel_open(LIBSSH2_SESSION * session, const char *channel_type, return NULL; } else if(rc) { + _libssh2_error(session, rc, "Unexpected error"); goto channel_error; } @@ -1021,6 +1022,158 @@ static int channel_request_pty(LIBSSH2_CHANNEL *channel, "channel request-pty"); } +/** + * channel_request_auth_agent + * The actual re-entrant method which requests an auth agent. + * */ +static int channel_request_auth_agent(LIBSSH2_CHANNEL *channel, + const char *request_str, + int request_str_len) +{ + LIBSSH2_SESSION *session = channel->session; + unsigned char *s; + static const unsigned char reply_codes[3] = + { SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, 0 }; + int rc; + + if(channel->req_auth_agent_state == libssh2_NB_state_idle) { + /* Only valid options are "auth-agent-req" and + * "auth-agent-req_at_openssh.com" so we make sure it is not + * actually longer than the longest possible. */ + if(request_str_len > 26) { + return _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "request_str length too large"); + } + + /* + * Length: 24 or 36 = packet_type(1) + channel(4) + req_len(4) + + * request_str (variable) + want_reply (1) */ + channel->req_auth_agent_packet_len = 10 + request_str_len; + + /* Zero out the requireev state to reset */ + memset(&channel->req_auth_agent_requirev_state, 0, + sizeof(channel->req_auth_agent_requirev_state)); + + _libssh2_debug(session, LIBSSH2_TRACE_CONN, + "Requesting auth agent on channel %lu/%lu", + channel->local.id, channel->remote.id); + + /* + * byte SSH_MSG_CHANNEL_REQUEST + * uint32 recipient channel + * string "auth-agent-req" + * boolean want reply + * */ + s = channel->req_auth_agent_packet; + *(s++) = SSH_MSG_CHANNEL_REQUEST; + _libssh2_store_u32(&s, channel->remote.id); + _libssh2_store_str(&s, (char *)request_str, request_str_len); + *(s++) = 0x01; + + channel->req_auth_agent_state = libssh2_NB_state_created; + } + + if(channel->req_auth_agent_state == libssh2_NB_state_created) { + /* Send the packet, we can use sizeof() on the packet because it + * is always completely filled; there are no variable length fields. */ + rc = _libssh2_transport_send(session, channel->req_auth_agent_packet, + channel->req_auth_agent_packet_len, + NULL, 0); + + if(rc == LIBSSH2_ERROR_EAGAIN) { + _libssh2_error(session, rc, + "Would block sending auth-agent request"); + } + else if(rc) { + channel->req_auth_agent_state = libssh2_NB_state_idle; + return _libssh2_error(session, rc, + "Unable to send auth-agent request"); + } + _libssh2_htonu32(channel->req_auth_agent_local_channel, + channel->local.id); + channel->req_auth_agent_state = libssh2_NB_state_sent; + } + + if(channel->req_auth_agent_state == libssh2_NB_state_sent) { + unsigned char *data; + size_t data_len; + unsigned char code; + + rc = _libssh2_packet_requirev( + session, reply_codes, &data, &data_len, 1, + channel->req_auth_agent_local_channel, + 4, &channel->req_auth_agent_requirev_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { + return rc; + } + else if(rc) { + channel->req_auth_agent_state = libssh2_NB_state_idle; + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Failed to request auth-agent"); + } + + code = data[0]; + + LIBSSH2_FREE(session, data); + channel->req_auth_agent_state = libssh2_NB_state_idle; + + if(code == SSH_MSG_CHANNEL_SUCCESS) + return 0; + } + + return _libssh2_error(session, LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED, + "Unable to complete request for auth-agent"); +} + +/** + * libssh2_channel_request_auth_agent + * Requests that agent forwarding be enabled for the session. The + * request must be sent over a specific channel, which starts the agent + * listener on the remote side. Once the channel is closed, the agent + * listener continues to exist. + * */ +LIBSSH2_API int +libssh2_channel_request_auth_agent(LIBSSH2_CHANNEL *channel) +{ + int rc; + + if(!channel) + return LIBSSH2_ERROR_BAD_USE; + + /* The current RFC draft for agent forwarding says you're supposed to + * send "auth-agent-req," but most SSH servers out there right now + * actually expect "auth-agent-req@openssh.com", so we try that + * first. */ + if(channel->req_auth_agent_try_state == libssh2_NB_state_idle) { + BLOCK_ADJUST(rc, channel->session, + channel_request_auth_agent(channel, + "auth-agent-req@openssh.com", + 26)); + + /* If we failed (but not with EAGAIN), then we move onto + * the next step to try another request type. */ + if(rc != 0 && rc != LIBSSH2_ERROR_EAGAIN) + channel->req_auth_agent_try_state = libssh2_NB_state_sent; + } + + if(channel->req_auth_agent_try_state == libssh2_NB_state_sent) { + BLOCK_ADJUST(rc, channel->session, + channel_request_auth_agent(channel, + "auth-agent-req", 14)); + + /* If we failed without an EAGAIN, then move on with this + * state machine. */ + if(rc != 0 && rc != LIBSSH2_ERROR_EAGAIN) + channel->req_auth_agent_try_state = libssh2_NB_state_sent1; + } + + /* If things are good, reset the try state. */ + if(rc == 0) + channel->req_auth_agent_try_state = libssh2_NB_state_idle; + + return rc; +} + /* * libssh2_channel_request_pty_ex * Duh... Request a PTY @@ -1185,7 +1338,11 @@ channel_x11_req(LIBSSH2_CHANNEL *channel, int single_connection, border */ unsigned char buffer[(LIBSSH2_X11_RANDOM_COOKIE_LEN / 2) + 1]; - _libssh2_random(buffer, LIBSSH2_X11_RANDOM_COOKIE_LEN / 2); + if(_libssh2_random(buffer, LIBSSH2_X11_RANDOM_COOKIE_LEN / 2)) { + return _libssh2_error(session, LIBSSH2_ERROR_RANDGEN, + "Unable to get random bytes " + "for x11-req cookie"); + } for(i = 0; i < (LIBSSH2_X11_RANDOM_COOKIE_LEN / 2); i++) { snprintf((char *)&s[i*2], 3, "%02X", buffer[i]); } diff --git a/vendor/libssh2/src/comp.c b/vendor/libssh2/src/comp.c index fec82a74b..90ab30c89 100644 --- a/vendor/libssh2/src/comp.c +++ b/vendor/libssh2/src/comp.c @@ -38,7 +38,8 @@ #include "libssh2_priv.h" #ifdef LIBSSH2_HAVE_ZLIB -# include +#include +#undef compress /* dodge name clash with ZLIB macro */ #endif #include "comp.h" diff --git a/vendor/libssh2/src/comp.h b/vendor/libssh2/src/comp.h index 8edc15029..82ac2dc95 100644 --- a/vendor/libssh2/src/comp.h +++ b/vendor/libssh2/src/comp.h @@ -1,6 +1,5 @@ #ifndef __LIBSSH2_COMP_H #define __LIBSSH2_COMP_H - /* Copyright (C) 2009-2010 by Daniel Stenberg * * Redistribution and use in source and binary forms, diff --git a/vendor/libssh2/src/crypto.h b/vendor/libssh2/src/crypto.h index 8b1e00402..f512d6039 100644 --- a/vendor/libssh2/src/crypto.h +++ b/vendor/libssh2/src/crypto.h @@ -1,3 +1,5 @@ +#ifndef __LIBSSH2_CRYPTO_H +#define __LIBSSH2_CRYPTO_H /* Copyright (C) 2009, 2010 Simon Josefsson * Copyright (C) 2006, 2007 The Written Word, Inc. All rights reserved. * Copyright (C) 2010-2019 Daniel Stenberg @@ -35,8 +37,6 @@ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. */ -#ifndef LIBSSH2_CRYPTO_H -#define LIBSSH2_CRYPTO_H #ifdef LIBSSH2_OPENSSL #include "openssl.h" @@ -170,7 +170,7 @@ int _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx, unsigned const char *passphrase); libssh2_curve_type -_libssh2_ecdsa_key_get_curve_type(_libssh2_ec_key *key); +_libssh2_ecdsa_get_curve_type(libssh2_ecdsa_ctx *ec_ctx); int _libssh2_ecdsa_curve_type_from_name(const char *name, @@ -181,8 +181,8 @@ _libssh2_ecdsa_curve_type_from_name(const char *name, #if LIBSSH2_ED25519 int -_libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_ed25519_ctx **ctx, - uint8_t **out_public_key, uint8_t **out_private_key); +_libssh2_curve25519_new(LIBSSH2_SESSION *session, uint8_t **out_public_key, + uint8_t **out_private_key); int _libssh2_curve25519_gen_k(_libssh2_bn **k, @@ -245,4 +245,4 @@ int _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, size_t privatekeydata_len, const char *passphrase); -#endif +#endif /* __LIBSSH2_CRYPTO_H */ diff --git a/vendor/libssh2/src/global.c b/vendor/libssh2/src/global.c index f88eb33da..68289845f 100644 --- a/vendor/libssh2/src/global.c +++ b/vendor/libssh2/src/global.c @@ -62,7 +62,8 @@ libssh2_exit(void) _libssh2_initialized--; - if(!(_libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO)) { + if(_libssh2_initialized == 0 && + !(_libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO)) { libssh2_crypto_exit(); } diff --git a/vendor/libssh2/src/hostkey.c b/vendor/libssh2/src/hostkey.c index a8bd42b7a..d87a4c744 100644 --- a/vendor/libssh2/src/hostkey.c +++ b/vendor/libssh2/src/hostkey.c @@ -647,7 +647,7 @@ hostkey_method_ssh_ecdsa_sig_verify(LIBSSH2_SESSION * session, { unsigned char *r, *s, *name; size_t r_len, s_len, name_len; - unsigned int len; + uint32_t len; struct string_buf buf; libssh2_ecdsa_ctx *ctx = (libssh2_ecdsa_ctx *) (*abstract); @@ -709,7 +709,7 @@ hostkey_method_ssh_ecdsa_signv(LIBSSH2_SESSION * session, void **abstract) { libssh2_ecdsa_ctx *ec_ctx = (libssh2_ecdsa_ctx *) (*abstract); - libssh2_curve_type type = _libssh2_ecdsa_key_get_curve_type(ec_ctx); + libssh2_curve_type type = _libssh2_ecdsa_get_curve_type(ec_ctx); int ret = 0; if(type == LIBSSH2_EC_CURVE_NISTP256) { @@ -783,6 +783,42 @@ static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp521 = { hostkey_method_ssh_ecdsa_dtor, }; +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp256_cert = { + "ecdsa-sha2-nistp256-cert-v01@openssh.com", + SHA256_DIGEST_LENGTH, + NULL, + hostkey_method_ssh_ecdsa_initPEM, + hostkey_method_ssh_ecdsa_initPEMFromMemory, + NULL, + hostkey_method_ssh_ecdsa_signv, + NULL, /* encrypt */ + hostkey_method_ssh_ecdsa_dtor, +}; + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp384_cert = { + "ecdsa-sha2-nistp384-cert-v01@openssh.com", + SHA384_DIGEST_LENGTH, + NULL, + hostkey_method_ssh_ecdsa_initPEM, + hostkey_method_ssh_ecdsa_initPEMFromMemory, + NULL, + hostkey_method_ssh_ecdsa_signv, + NULL, /* encrypt */ + hostkey_method_ssh_ecdsa_dtor, +}; + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ecdsa_ssh_nistp521_cert = { + "ecdsa-sha2-nistp521-cert-v01@openssh.com", + SHA512_DIGEST_LENGTH, + NULL, + hostkey_method_ssh_ecdsa_initPEM, + hostkey_method_ssh_ecdsa_initPEMFromMemory, + NULL, + hostkey_method_ssh_ecdsa_signv, + NULL, /* encrypt */ + hostkey_method_ssh_ecdsa_dtor, +}; + #endif /* LIBSSH2_ECDSA */ #if LIBSSH2_ED25519 @@ -999,6 +1035,9 @@ static const LIBSSH2_HOSTKEY_METHOD *hostkey_methods[] = { &hostkey_method_ecdsa_ssh_nistp256, &hostkey_method_ecdsa_ssh_nistp384, &hostkey_method_ecdsa_ssh_nistp521, + &hostkey_method_ecdsa_ssh_nistp256_cert, + &hostkey_method_ecdsa_ssh_nistp384_cert, + &hostkey_method_ecdsa_ssh_nistp521_cert, #endif #if LIBSSH2_ED25519 &hostkey_method_ssh_ed25519, diff --git a/vendor/libssh2/src/kex.c b/vendor/libssh2/src/kex.c index cb1663937..9f3ef7992 100644 --- a/vendor/libssh2/src/kex.c +++ b/vendor/libssh2/src/kex.c @@ -42,792 +42,202 @@ #include "comp.h" #include "mac.h" +#include + +/* define SHA1_DIGEST_LENGTH for the macro below */ +#ifndef SHA1_DIGEST_LENGTH +#define SHA1_DIGEST_LENGTH SHA_DIGEST_LENGTH +#endif + /* TODO: Switch this to an inline and handle alloc() failures */ /* Helper macro called from kex_method_diffie_hellman_group1_sha1_key_exchange */ -#define LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(value, reqlen, version) \ - { \ - libssh2_sha1_ctx hash; \ - unsigned long len = 0; \ - if(!(value)) { \ - value = LIBSSH2_ALLOC(session, reqlen + SHA_DIGEST_LENGTH); \ - } \ - if(value) \ - while(len < (unsigned long)reqlen) { \ - libssh2_sha1_init(&hash); \ - libssh2_sha1_update(hash, exchange_state->k_value, \ - exchange_state->k_value_len); \ - libssh2_sha1_update(hash, exchange_state->h_sig_comp, \ - SHA_DIGEST_LENGTH); \ - if(len > 0) { \ - libssh2_sha1_update(hash, value, len); \ - } \ - else { \ - libssh2_sha1_update(hash, (version), 1); \ - libssh2_sha1_update(hash, session->session_id, \ - session->session_id_len); \ - } \ - libssh2_sha1_final(hash, (value) + len); \ - len += SHA_DIGEST_LENGTH; \ - } \ - } \ - -#define LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(value, reqlen, version) \ - { \ - if(type == LIBSSH2_EC_CURVE_NISTP256) { \ +#define LIBSSH2_KEX_METHOD_EC_SHA_VALUE_HASH(value, reqlen, version) \ + { \ + if(type == LIBSSH2_EC_CURVE_NISTP256) { \ LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, value, reqlen, version); \ - } \ - else if(type == LIBSSH2_EC_CURVE_NISTP384) { \ + } \ + else if(type == LIBSSH2_EC_CURVE_NISTP384) { \ LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(384, value, reqlen, version); \ - } \ - else if(type == LIBSSH2_EC_CURVE_NISTP521) { \ + } \ + else if(type == LIBSSH2_EC_CURVE_NISTP521) { \ LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(512, value, reqlen, version); \ - } \ - } \ - - -#define LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(digest_type, value, \ - reqlen, version) \ -{ \ - libssh2_sha##digest_type##_ctx hash; \ - unsigned long len = 0; \ - if(!(value)) { \ - value = LIBSSH2_ALLOC(session, \ - reqlen + SHA##digest_type##_DIGEST_LENGTH); \ - } \ - if(value) \ - while(len < (unsigned long)reqlen) { \ - libssh2_sha##digest_type##_init(&hash); \ - libssh2_sha##digest_type##_update(hash, \ - exchange_state->k_value, \ + } \ + } \ + + +#define LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(digest_type, value, \ + reqlen, version) \ +{ \ + libssh2_sha##digest_type##_ctx hash; \ + unsigned long len = 0; \ + if(!(value)) { \ + value = LIBSSH2_ALLOC(session, \ + reqlen + SHA##digest_type##_DIGEST_LENGTH); \ + } \ + if(value) \ + while(len < (unsigned long)reqlen) { \ + libssh2_sha##digest_type##_init(&hash); \ + libssh2_sha##digest_type##_update(hash, \ + exchange_state->k_value, \ exchange_state->k_value_len); \ - libssh2_sha##digest_type##_update(hash, \ - exchange_state->h_sig_comp, \ + libssh2_sha##digest_type##_update(hash, \ + exchange_state->h_sig_comp, \ SHA##digest_type##_DIGEST_LENGTH); \ - if(len > 0) { \ - libssh2_sha##digest_type##_update(hash, value, len); \ - } \ - else { \ - libssh2_sha##digest_type##_update(hash, (version), 1); \ - libssh2_sha##digest_type##_update(hash, session->session_id, \ + if(len > 0) { \ + libssh2_sha##digest_type##_update(hash, value, len); \ + } \ + else { \ + libssh2_sha##digest_type##_update(hash, (version), 1); \ + libssh2_sha##digest_type##_update(hash, session->session_id,\ session->session_id_len); \ - } \ - libssh2_sha##digest_type##_final(hash, (value) + len); \ - len += SHA##digest_type##_DIGEST_LENGTH; \ - } \ + } \ + libssh2_sha##digest_type##_final(hash, (value) + len); \ + len += SHA##digest_type##_DIGEST_LENGTH; \ + } \ } - -/* - * diffie_hellman_sha1 - * - * Diffie Hellman Key Exchange, Group Agnostic +/*! + * @note The following are wrapper functions used by diffie_hellman_sha_algo(). + * TODO: Switch backend SHA macros to functions to allow function pointers + * @discussion Ideally these would be function pointers but the backend macros + * don't allow it so we have to wrap them up in helper functions */ -static int diffie_hellman_sha1(LIBSSH2_SESSION *session, - _libssh2_bn *g, - _libssh2_bn *p, - int group_order, - unsigned char packet_type_init, - unsigned char packet_type_reply, - unsigned char *midhash, - unsigned long midhash_len, - kmdhgGPshakex_state_t *exchange_state) -{ - int ret = 0; - int rc; - libssh2_sha1_ctx exchange_hash_ctx; - - if(exchange_state->state == libssh2_NB_state_idle) { - /* Setup initial values */ - exchange_state->e_packet = NULL; - exchange_state->s_packet = NULL; - exchange_state->k_value = NULL; - exchange_state->ctx = _libssh2_bn_ctx_new(); - libssh2_dh_init(&exchange_state->x); - exchange_state->e = _libssh2_bn_init(); /* g^x mod p */ - exchange_state->f = _libssh2_bn_init_from_bin(); /* g^(Random from - server) mod p */ - exchange_state->k = _libssh2_bn_init(); /* The shared secret: f^x mod - p */ - - /* Zero the whole thing out */ - memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t)); - - /* Generate x and e */ - rc = libssh2_dh_key_pair(&exchange_state->x, exchange_state->e, g, p, - group_order, exchange_state->ctx); - if(rc) - goto clean_exit; - - /* Send KEX init */ - /* packet_type(1) + String Length(4) + leading 0(1) */ - exchange_state->e_packet_len = - _libssh2_bn_bytes(exchange_state->e) + 6; - if(_libssh2_bn_bits(exchange_state->e) % 8) { - /* Leading 00 not needed */ - exchange_state->e_packet_len--; - } - - exchange_state->e_packet = - LIBSSH2_ALLOC(session, exchange_state->e_packet_len); - if(!exchange_state->e_packet) { - ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Out of memory error"); - goto clean_exit; - } - exchange_state->e_packet[0] = packet_type_init; - _libssh2_htonu32(exchange_state->e_packet + 1, - exchange_state->e_packet_len - 5); - if(_libssh2_bn_bits(exchange_state->e) % 8) { - _libssh2_bn_to_bin(exchange_state->e, - exchange_state->e_packet + 5); - } - else { - exchange_state->e_packet[5] = 0; - _libssh2_bn_to_bin(exchange_state->e, - exchange_state->e_packet + 6); - } - _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Sending KEX packet %d", - (int) packet_type_init); - exchange_state->state = libssh2_NB_state_created; +static void _libssh2_sha_algo_ctx_init(int sha_algo, void *ctx) +{ + if(sha_algo == 512) { + libssh2_sha512_init((libssh2_sha512_ctx*)ctx); } - - if(exchange_state->state == libssh2_NB_state_created) { - rc = _libssh2_transport_send(session, exchange_state->e_packet, - exchange_state->e_packet_len, - NULL, 0); - if(rc == LIBSSH2_ERROR_EAGAIN) { - return rc; - } - else if(rc) { - ret = _libssh2_error(session, rc, - "Unable to send KEX init message"); - goto clean_exit; - } - exchange_state->state = libssh2_NB_state_sent; + else if(sha_algo == 384) { + libssh2_sha384_init((libssh2_sha384_ctx*)ctx); } - - if(exchange_state->state == libssh2_NB_state_sent) { - if(session->burn_optimistic_kexinit) { - /* The first KEX packet to come along will be the guess initially - * sent by the server. That guess turned out to be wrong so we - * need to silently ignore it */ - int burn_type; - - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Waiting for badly guessed KEX packet " - "(to be ignored)"); - burn_type = - _libssh2_packet_burn(session, &exchange_state->burn_state); - if(burn_type == LIBSSH2_ERROR_EAGAIN) { - return burn_type; - } - else if(burn_type <= 0) { - /* Failed to receive a packet */ - ret = burn_type; - goto clean_exit; - } - session->burn_optimistic_kexinit = 0; - - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Burnt packet of type: %02x", - (unsigned int) burn_type); - } - - exchange_state->state = libssh2_NB_state_sent1; + else if(sha_algo == 256) { + libssh2_sha256_init((libssh2_sha256_ctx*)ctx); } + else if(sha_algo == 1) { + libssh2_sha1_init((libssh2_sha1_ctx*)ctx); + } + else { + assert(0); + } +} - if(exchange_state->state == libssh2_NB_state_sent1) { - /* Wait for KEX reply */ - struct string_buf buf; - size_t host_key_len; - - rc = _libssh2_packet_require(session, packet_type_reply, - &exchange_state->s_packet, - &exchange_state->s_packet_len, 0, NULL, - 0, &exchange_state->req_state); - if(rc == LIBSSH2_ERROR_EAGAIN) { - return rc; - } - if(rc) { - ret = _libssh2_error(session, LIBSSH2_ERROR_TIMEOUT, - "Timed out waiting for KEX reply"); - goto clean_exit; - } - - /* Parse KEXDH_REPLY */ - if(exchange_state->s_packet_len < 5) { - ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, - "Unexpected packet length"); - goto clean_exit; - } - - buf.data = exchange_state->s_packet; - buf.len = exchange_state->s_packet_len; - buf.dataptr = buf.data; - buf.dataptr++; /* advance past type */ - - if(session->server_hostkey) - LIBSSH2_FREE(session, session->server_hostkey); - - if(_libssh2_copy_string(session, &buf, &(session->server_hostkey), - &host_key_len)) { - ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Could not copy host key"); - goto clean_exit; - } - - session->server_hostkey_len = (uint32_t)host_key_len; - -#if LIBSSH2_MD5 - { - libssh2_md5_ctx fingerprint_ctx; - - if(libssh2_md5_init(&fingerprint_ctx)) { - libssh2_md5_update(fingerprint_ctx, session->server_hostkey, - session->server_hostkey_len); - libssh2_md5_final(fingerprint_ctx, - session->server_hostkey_md5); - session->server_hostkey_md5_valid = TRUE; - } - else { - session->server_hostkey_md5_valid = FALSE; - } - } -#ifdef LIBSSH2DEBUG - { - char fingerprint[50], *fprint = fingerprint; - int i; - for(i = 0; i < 16; i++, fprint += 3) { - snprintf(fprint, 4, "%02x:", session->server_hostkey_md5[i]); - } - *(--fprint) = '\0'; - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Server's MD5 Fingerprint: %s", fingerprint); - } -#endif /* LIBSSH2DEBUG */ -#endif /* ! LIBSSH2_MD5 */ - - { - libssh2_sha1_ctx fingerprint_ctx; - - if(libssh2_sha1_init(&fingerprint_ctx)) { - libssh2_sha1_update(fingerprint_ctx, session->server_hostkey, - session->server_hostkey_len); - libssh2_sha1_final(fingerprint_ctx, - session->server_hostkey_sha1); - session->server_hostkey_sha1_valid = TRUE; - } - else { - session->server_hostkey_sha1_valid = FALSE; - } - } -#ifdef LIBSSH2DEBUG - { - char fingerprint[64], *fprint = fingerprint; - int i; - - for(i = 0; i < 20; i++, fprint += 3) { - snprintf(fprint, 4, "%02x:", session->server_hostkey_sha1[i]); - } - *(--fprint) = '\0'; - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Server's SHA1 Fingerprint: %s", fingerprint); - } -#endif /* LIBSSH2DEBUG */ +static void _libssh2_sha_algo_ctx_update(int sha_algo, void *ctx, + void *data, size_t len) +{ + if(sha_algo == 512) { + libssh2_sha512_ctx *_ctx = (libssh2_sha512_ctx*)ctx; + libssh2_sha512_update(*_ctx, data, len); + } + else if(sha_algo == 384) { + libssh2_sha384_ctx *_ctx = (libssh2_sha384_ctx*)ctx; + libssh2_sha384_update(*_ctx, data, len); + } + else if(sha_algo == 256) { + libssh2_sha256_ctx *_ctx = (libssh2_sha256_ctx*)ctx; + libssh2_sha256_update(*_ctx, data, len); + } + else if(sha_algo == 1) { + libssh2_sha1_ctx *_ctx = (libssh2_sha1_ctx*)ctx; + libssh2_sha1_update(*_ctx, data, len); + } + else { +#if LIBSSH2DEBUG + assert(0); +#endif + } +} - { - libssh2_sha256_ctx fingerprint_ctx; - - if(libssh2_sha256_init(&fingerprint_ctx)) { - libssh2_sha256_update(fingerprint_ctx, session->server_hostkey, - session->server_hostkey_len); - libssh2_sha256_final(fingerprint_ctx, - session->server_hostkey_sha256); - session->server_hostkey_sha256_valid = TRUE; - } - else { - session->server_hostkey_sha256_valid = FALSE; - } - } -#ifdef LIBSSH2DEBUG - { - char *base64Fingerprint = NULL; - _libssh2_base64_encode(session, - (const char *) - session->server_hostkey_sha256, - SHA256_DIGEST_LENGTH, &base64Fingerprint); - if(base64Fingerprint != NULL) { - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Server's SHA256 Fingerprint: %s", - base64Fingerprint); - LIBSSH2_FREE(session, base64Fingerprint); - } - } -#endif /* LIBSSH2DEBUG */ - - - if(session->hostkey->init(session, session->server_hostkey, - session->server_hostkey_len, - &session->server_hostkey_abstract)) { - ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, - "Unable to initialize hostkey importer"); - goto clean_exit; - } - - if(_libssh2_get_string(&buf, &(exchange_state->f_value), - &(exchange_state->f_value_len))) { - ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, - "Unable to get f value"); - goto clean_exit; - } - - _libssh2_bn_from_bin(exchange_state->f, exchange_state->f_value_len, - exchange_state->f_value); - - if(_libssh2_get_string(&buf, &(exchange_state->h_sig), - &(exchange_state->h_sig_len))) { - ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, - "Unable to get h sig"); - goto clean_exit; - } - - /* Compute the shared secret */ - libssh2_dh_secret(&exchange_state->x, exchange_state->k, - exchange_state->f, p, exchange_state->ctx); - exchange_state->k_value_len = _libssh2_bn_bytes(exchange_state->k) + 5; - if(_libssh2_bn_bits(exchange_state->k) % 8) { - /* don't need leading 00 */ - exchange_state->k_value_len--; - } - exchange_state->k_value = - LIBSSH2_ALLOC(session, exchange_state->k_value_len); - if(!exchange_state->k_value) { - ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate buffer for K"); - goto clean_exit; - } - _libssh2_htonu32(exchange_state->k_value, - exchange_state->k_value_len - 4); - if(_libssh2_bn_bits(exchange_state->k) % 8) { - _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 4); - } - else { - exchange_state->k_value[4] = 0; - _libssh2_bn_to_bin(exchange_state->k, exchange_state->k_value + 5); - } - - exchange_state->exchange_hash = (void *)&exchange_hash_ctx; - libssh2_sha1_init(&exchange_hash_ctx); - - if(session->local.banner) { - _libssh2_htonu32(exchange_state->h_sig_comp, - strlen((char *) session->local.banner) - 2); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha1_update(exchange_hash_ctx, - session->local.banner, - strlen((char *) session->local.banner) - 2); - } - else { - _libssh2_htonu32(exchange_state->h_sig_comp, - sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha1_update(exchange_hash_ctx, - (const unsigned char *) - LIBSSH2_SSH_DEFAULT_BANNER, - sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); - } - - _libssh2_htonu32(exchange_state->h_sig_comp, - strlen((char *) session->remote.banner)); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha1_update(exchange_hash_ctx, - session->remote.banner, - strlen((char *) session->remote.banner)); - - _libssh2_htonu32(exchange_state->h_sig_comp, - session->local.kexinit_len); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha1_update(exchange_hash_ctx, - session->local.kexinit, - session->local.kexinit_len); - - _libssh2_htonu32(exchange_state->h_sig_comp, - session->remote.kexinit_len); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha1_update(exchange_hash_ctx, - session->remote.kexinit, - session->remote.kexinit_len); - - _libssh2_htonu32(exchange_state->h_sig_comp, - session->server_hostkey_len); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha1_update(exchange_hash_ctx, - session->server_hostkey, - session->server_hostkey_len); - - if(packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) { - /* diffie-hellman-group-exchange hashes additional fields */ -#ifdef LIBSSH2_DH_GEX_NEW - _libssh2_htonu32(exchange_state->h_sig_comp, - LIBSSH2_DH_GEX_MINGROUP); - _libssh2_htonu32(exchange_state->h_sig_comp + 4, - LIBSSH2_DH_GEX_OPTGROUP); - _libssh2_htonu32(exchange_state->h_sig_comp + 8, - LIBSSH2_DH_GEX_MAXGROUP); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 12); -#else - _libssh2_htonu32(exchange_state->h_sig_comp, - LIBSSH2_DH_GEX_OPTGROUP); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); -#endif - } - - if(midhash) { - libssh2_sha1_update(exchange_hash_ctx, midhash, - midhash_len); - } - - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->e_packet + 1, - exchange_state->e_packet_len - 1); - - _libssh2_htonu32(exchange_state->h_sig_comp, - exchange_state->f_value_len); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->f_value, - exchange_state->f_value_len); - - libssh2_sha1_update(exchange_hash_ctx, - exchange_state->k_value, - exchange_state->k_value_len); - - libssh2_sha1_final(exchange_hash_ctx, - exchange_state->h_sig_comp); - - if(session->hostkey-> - sig_verify(session, exchange_state->h_sig, - exchange_state->h_sig_len, exchange_state->h_sig_comp, - 20, &session->server_hostkey_abstract)) { - ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN, - "Unable to verify hostkey signature"); - goto clean_exit; - } - - _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Sending NEWKEYS message"); - exchange_state->c = SSH_MSG_NEWKEYS; - - exchange_state->state = libssh2_NB_state_sent2; - } - - if(exchange_state->state == libssh2_NB_state_sent2) { - rc = _libssh2_transport_send(session, &exchange_state->c, 1, NULL, 0); - if(rc == LIBSSH2_ERROR_EAGAIN) { - return rc; - } - else if(rc) { - ret = _libssh2_error(session, rc, - "Unable to send NEWKEYS message"); - goto clean_exit; - } - - exchange_state->state = libssh2_NB_state_sent3; - } - - if(exchange_state->state == libssh2_NB_state_sent3) { - rc = _libssh2_packet_require(session, SSH_MSG_NEWKEYS, - &exchange_state->tmp, - &exchange_state->tmp_len, 0, NULL, 0, - &exchange_state->req_state); - if(rc == LIBSSH2_ERROR_EAGAIN) { - return rc; - } - else if(rc) { - ret = _libssh2_error(session, rc, "Timed out waiting for NEWKEYS"); - goto clean_exit; - } - /* The first key exchange has been performed, - switch to active crypt/comp/mac mode */ - session->state |= LIBSSH2_STATE_NEWKEYS; - _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Received NEWKEYS message"); - - /* This will actually end up being just packet_type(1) - for this packet type anyway */ - LIBSSH2_FREE(session, exchange_state->tmp); - - if(!session->session_id) { - session->session_id = LIBSSH2_ALLOC(session, SHA_DIGEST_LENGTH); - if(!session->session_id) { - ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate buffer for " - "SHA digest"); - goto clean_exit; - } - memcpy(session->session_id, exchange_state->h_sig_comp, - SHA_DIGEST_LENGTH); - session->session_id_len = SHA_DIGEST_LENGTH; - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "session_id calculated"); - } - - /* Cleanup any existing cipher */ - if(session->local.crypt->dtor) { - session->local.crypt->dtor(session, - &session->local.crypt_abstract); - } - - /* Calculate IV/Secret/Key for each direction */ - if(session->local.crypt->init) { - unsigned char *iv = NULL, *secret = NULL; - int free_iv = 0, free_secret = 0; - - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv, - session->local.crypt-> - iv_len, - (const unsigned char *) - "A"); - if(!iv) { - ret = -1; - goto clean_exit; - } - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret, - session->local.crypt-> - secret_len, - (const unsigned char *) - "C"); - if(!secret) { - LIBSSH2_FREE(session, iv); - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - if(session->local.crypt-> - init(session, session->local.crypt, iv, &free_iv, secret, - &free_secret, 1, &session->local.crypt_abstract)) { - LIBSSH2_FREE(session, iv); - LIBSSH2_FREE(session, secret); - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - - if(free_iv) { - _libssh2_explicit_zero(iv, session->local.crypt->iv_len); - LIBSSH2_FREE(session, iv); - } - - if(free_secret) { - _libssh2_explicit_zero(secret, - session->local.crypt->secret_len); - LIBSSH2_FREE(session, secret); - } - } - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Client to Server IV and Key calculated"); - - if(session->remote.crypt->dtor) { - /* Cleanup any existing cipher */ - session->remote.crypt->dtor(session, - &session->remote.crypt_abstract); - } - - if(session->remote.crypt->init) { - unsigned char *iv = NULL, *secret = NULL; - int free_iv = 0, free_secret = 0; - - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(iv, - session->remote.crypt-> - iv_len, - (const unsigned char *) - "B"); - if(!iv) { - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(secret, - session->remote.crypt-> - secret_len, - (const unsigned char *) - "D"); - if(!secret) { - LIBSSH2_FREE(session, iv); - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - if(session->remote.crypt-> - init(session, session->remote.crypt, iv, &free_iv, secret, - &free_secret, 0, &session->remote.crypt_abstract)) { - LIBSSH2_FREE(session, iv); - LIBSSH2_FREE(session, secret); - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - - if(free_iv) { - _libssh2_explicit_zero(iv, session->remote.crypt->iv_len); - LIBSSH2_FREE(session, iv); - } - - if(free_secret) { - _libssh2_explicit_zero(secret, - session->remote.crypt->secret_len); - LIBSSH2_FREE(session, secret); - } - } - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Server to Client IV and Key calculated"); - - if(session->local.mac->dtor) { - session->local.mac->dtor(session, &session->local.mac_abstract); - } - - if(session->local.mac->init) { - unsigned char *key = NULL; - int free_key = 0; - - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key, - session->local.mac-> - key_len, - (const unsigned char *) - "E"); - if(!key) { - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - session->local.mac->init(session, key, &free_key, - &session->local.mac_abstract); - - if(free_key) { - _libssh2_explicit_zero(key, session->local.mac->key_len); - LIBSSH2_FREE(session, key); - } - } - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Client to Server HMAC Key calculated"); - - if(session->remote.mac->dtor) { - session->remote.mac->dtor(session, &session->remote.mac_abstract); - } - - if(session->remote.mac->init) { - unsigned char *key = NULL; - int free_key = 0; - - LIBSSH2_KEX_METHOD_DIFFIE_HELLMAN_SHA1_HASH(key, - session->remote.mac-> - key_len, - (const unsigned char *) - "F"); - if(!key) { - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - session->remote.mac->init(session, key, &free_key, - &session->remote.mac_abstract); - - if(free_key) { - _libssh2_explicit_zero(key, session->remote.mac->key_len); - LIBSSH2_FREE(session, key); - } - } - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Server to Client HMAC Key calculated"); - - /* Initialize compression for each direction */ - - /* Cleanup any existing compression */ - if(session->local.comp && session->local.comp->dtor) { - session->local.comp->dtor(session, 1, - &session->local.comp_abstract); - } - - if(session->local.comp && session->local.comp->init) { - if(session->local.comp->init(session, 1, - &session->local.comp_abstract)) { - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - } - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Client to Server compression initialized"); - - if(session->remote.comp && session->remote.comp->dtor) { - session->remote.comp->dtor(session, 0, - &session->remote.comp_abstract); - } - - if(session->remote.comp && session->remote.comp->init) { - if(session->remote.comp->init(session, 0, - &session->remote.comp_abstract)) { - ret = LIBSSH2_ERROR_KEX_FAILURE; - goto clean_exit; - } - } - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Server to Client compression initialized"); +static void _libssh2_sha_algo_ctx_final(int sha_algo, void *ctx, + void *hash) +{ + if(sha_algo == 512) { + libssh2_sha512_ctx *_ctx = (libssh2_sha512_ctx*)ctx; + libssh2_sha512_final(*_ctx, hash); + } + else if(sha_algo == 384) { + libssh2_sha384_ctx *_ctx = (libssh2_sha384_ctx*)ctx; + libssh2_sha384_final(*_ctx, hash); + } + else if(sha_algo == 256) { + libssh2_sha256_ctx *_ctx = (libssh2_sha256_ctx*)ctx; + libssh2_sha256_final(*_ctx, hash); + } + else if(sha_algo == 1) { + libssh2_sha1_ctx *_ctx = (libssh2_sha1_ctx*)ctx; + libssh2_sha1_final(*_ctx, hash); + } + else { +#if LIBSSH2DEBUG + assert(0); +#endif + } +} +static void _libssh2_sha_algo_value_hash(int sha_algo, + LIBSSH2_SESSION *session, + kmdhgGPshakex_state_t *exchange_state, + unsigned char **data, size_t data_len, + const unsigned char *version) +{ + if(sha_algo == 512) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(512, *data, data_len, version); } - - clean_exit: - libssh2_dh_dtor(&exchange_state->x); - _libssh2_bn_free(exchange_state->e); - exchange_state->e = NULL; - _libssh2_bn_free(exchange_state->f); - exchange_state->f = NULL; - _libssh2_bn_free(exchange_state->k); - exchange_state->k = NULL; - _libssh2_bn_ctx_free(exchange_state->ctx); - exchange_state->ctx = NULL; - - if(exchange_state->e_packet) { - LIBSSH2_FREE(session, exchange_state->e_packet); - exchange_state->e_packet = NULL; + else if(sha_algo == 384) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(384, *data, data_len, version); } - - if(exchange_state->s_packet) { - LIBSSH2_FREE(session, exchange_state->s_packet); - exchange_state->s_packet = NULL; + else if(sha_algo == 256) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, *data, data_len, version); } - - if(exchange_state->k_value) { - LIBSSH2_FREE(session, exchange_state->k_value); - exchange_state->k_value = NULL; + else if(sha_algo == 1) { + LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(1, *data, data_len, version); + } + else { +#if LIBSSH2DEBUG + assert(0); +#endif } - - exchange_state->state = libssh2_NB_state_idle; - - return ret; } -/* - * diffie_hellman_sha256 - * - * Diffie Hellman Key Exchange, Group Agnostic +/*! + * @function diffie_hellman_sha_algo + * @abstract Diffie Hellman Key Exchange, Group Agnostic, + * SHA Algorithm Agnostic + * @result 0 on success, error code on failure */ -static int diffie_hellman_sha256(LIBSSH2_SESSION *session, - _libssh2_bn *g, - _libssh2_bn *p, - int group_order, - unsigned char packet_type_init, - unsigned char packet_type_reply, - unsigned char *midhash, - unsigned long midhash_len, - kmdhgGPshakex_state_t *exchange_state) +static int diffie_hellman_sha_algo(LIBSSH2_SESSION *session, + _libssh2_bn *g, + _libssh2_bn *p, + int group_order, + int sha_algo_value, + void *exchange_hash_ctx, + unsigned char packet_type_init, + unsigned char packet_type_reply, + unsigned char *midhash, + unsigned long midhash_len, + kmdhgGPshakex_state_t *exchange_state) { int ret = 0; int rc; - libssh2_sha256_ctx exchange_hash_ctx; + + int digest_len = 0; + + if(sha_algo_value == 512) + digest_len = SHA512_DIGEST_LENGTH; + else if(sha_algo_value == 384) + digest_len = SHA384_DIGEST_LENGTH; + else if(sha_algo_value == 256) + digest_len = SHA256_DIGEST_LENGTH; + else if(sha_algo_value == 1) + digest_len = SHA1_DIGEST_LENGTH; + else { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "sha algo value is unimplemented"); + goto clean_exit; + } if(exchange_state->state == libssh2_NB_state_idle) { /* Setup initial values */ @@ -846,6 +256,12 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, memset(&exchange_state->req_state, 0, sizeof(packet_require_state_t)); /* Generate x and e */ + if(_libssh2_bn_bits(p) > LIBSSH2_DH_MAX_MODULUS_BITS) { + ret = _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "dh modulus value is too large"); + goto clean_exit; + } + rc = libssh2_dh_key_pair(&exchange_state->x, exchange_state->e, g, p, group_order, exchange_state->ctx); if(rc) @@ -1059,6 +475,7 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, } #endif /* LIBSSH2DEBUG */ + if(session->hostkey->init(session, session->server_hostkey, session->server_hostkey_len, &session->server_hostkey_abstract)) { @@ -1110,59 +527,59 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, } exchange_state->exchange_hash = (void *)&exchange_hash_ctx; - libssh2_sha256_init(&exchange_hash_ctx); + _libssh2_sha_algo_ctx_init(sha_algo_value, exchange_hash_ctx); if(session->local.banner) { _libssh2_htonu32(exchange_state->h_sig_comp, strlen((char *) session->local.banner) - 2); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha256_update(exchange_hash_ctx, - session->local.banner, - strlen((char *) session->local.banner) - 2); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + session->local.banner, + strlen((char *) session->local.banner) - 2); } else { _libssh2_htonu32(exchange_state->h_sig_comp, sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha256_update(exchange_hash_ctx, - (const unsigned char *) - LIBSSH2_SSH_DEFAULT_BANNER, - sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + (unsigned char *) + LIBSSH2_SSH_DEFAULT_BANNER, + sizeof(LIBSSH2_SSH_DEFAULT_BANNER) - 1); } _libssh2_htonu32(exchange_state->h_sig_comp, strlen((char *) session->remote.banner)); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha256_update(exchange_hash_ctx, - session->remote.banner, - strlen((char *) session->remote.banner)); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + session->remote.banner, + strlen((char *) session->remote.banner)); _libssh2_htonu32(exchange_state->h_sig_comp, session->local.kexinit_len); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha256_update(exchange_hash_ctx, - session->local.kexinit, - session->local.kexinit_len); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + session->local.kexinit, + session->local.kexinit_len); _libssh2_htonu32(exchange_state->h_sig_comp, session->remote.kexinit_len); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha256_update(exchange_hash_ctx, - session->remote.kexinit, - session->remote.kexinit_len); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + session->remote.kexinit, + session->remote.kexinit_len); _libssh2_htonu32(exchange_state->h_sig_comp, session->server_hostkey_len); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha256_update(exchange_hash_ctx, - session->server_hostkey, - session->server_hostkey_len); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + session->server_hostkey, + session->server_hostkey_len); if(packet_type_init == SSH_MSG_KEX_DH_GEX_INIT) { /* diffie-hellman-group-exchange hashes additional fields */ @@ -1173,52 +590,49 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, LIBSSH2_DH_GEX_OPTGROUP); _libssh2_htonu32(exchange_state->h_sig_comp + 8, LIBSSH2_DH_GEX_MAXGROUP); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 12); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 12); #else _libssh2_htonu32(exchange_state->h_sig_comp, LIBSSH2_DH_GEX_OPTGROUP); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); #endif } if(midhash) { - libssh2_sha256_update(exchange_hash_ctx, midhash, - midhash_len); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + midhash, midhash_len); } - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->e_packet + 1, - exchange_state->e_packet_len - 1); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->e_packet + 1, + exchange_state->e_packet_len - 1); _libssh2_htonu32(exchange_state->h_sig_comp, exchange_state->f_value_len); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->h_sig_comp, 4); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->f_value, - exchange_state->f_value_len); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp, 4); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->f_value, + exchange_state->f_value_len); - libssh2_sha256_update(exchange_hash_ctx, - exchange_state->k_value, - exchange_state->k_value_len); + _libssh2_sha_algo_ctx_update(sha_algo_value, exchange_hash_ctx, + exchange_state->k_value, + exchange_state->k_value_len); - libssh2_sha256_final(exchange_hash_ctx, - exchange_state->h_sig_comp); + _libssh2_sha_algo_ctx_final(sha_algo_value, exchange_hash_ctx, + exchange_state->h_sig_comp); if(session->hostkey-> sig_verify(session, exchange_state->h_sig, exchange_state->h_sig_len, exchange_state->h_sig_comp, - SHA256_DIGEST_LENGTH, - &session->server_hostkey_abstract)) { + digest_len, &session->server_hostkey_abstract)) { ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_SIGN, "Unable to verify hostkey signature"); goto clean_exit; } - - _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Sending NEWKEYS message"); exchange_state->c = SSH_MSG_NEWKEYS; @@ -1261,7 +675,7 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, LIBSSH2_FREE(session, exchange_state->tmp); if(!session->session_id) { - session->session_id = LIBSSH2_ALLOC(session, SHA256_DIGEST_LENGTH); + session->session_id = LIBSSH2_ALLOC(session, digest_len); if(!session->session_id) { ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate buffer for " @@ -1269,8 +683,8 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, goto clean_exit; } memcpy(session->session_id, exchange_state->h_sig_comp, - SHA256_DIGEST_LENGTH); - session->session_id_len = SHA256_DIGEST_LENGTH; + digest_len); + session->session_id_len = digest_len; _libssh2_debug(session, LIBSSH2_TRACE_KEX, "session_id calculated"); } @@ -1286,18 +700,20 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, unsigned char *iv = NULL, *secret = NULL; int free_iv = 0, free_secret = 0; - LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv, - session->local.crypt-> - iv_len, - (const unsigned char *)"A"); + _libssh2_sha_algo_value_hash(sha_algo_value, session, + exchange_state, &iv, + session->local.crypt->iv_len, + (const unsigned char *)"A"); + if(!iv) { ret = -1; goto clean_exit; } - LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret, - session->local.crypt-> - secret_len, - (const unsigned char *)"C"); + _libssh2_sha_algo_value_hash(sha_algo_value, session, + exchange_state, &secret, + session->local.crypt->secret_len, + (const unsigned char *)"C"); + if(!secret) { LIBSSH2_FREE(session, iv); ret = LIBSSH2_ERROR_KEX_FAILURE; @@ -1336,18 +752,18 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, unsigned char *iv = NULL, *secret = NULL; int free_iv = 0, free_secret = 0; - LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, iv, - session->remote.crypt-> - iv_len, - (const unsigned char *)"B"); + _libssh2_sha_algo_value_hash(sha_algo_value, session, + exchange_state, &iv, + session->remote.crypt->iv_len, + (const unsigned char *)"B"); if(!iv) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; } - LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, secret, - session->remote.crypt-> - secret_len, - (const unsigned char *)"D"); + _libssh2_sha_algo_value_hash(sha_algo_value, session, + exchange_state, &secret, + session->remote.crypt->secret_len, + (const unsigned char *)"D"); if(!secret) { LIBSSH2_FREE(session, iv); ret = LIBSSH2_ERROR_KEX_FAILURE; @@ -1384,10 +800,10 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, unsigned char *key = NULL; int free_key = 0; - LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key, - session->local.mac-> - key_len, - (const unsigned char *)"E"); + _libssh2_sha_algo_value_hash(sha_algo_value, session, + exchange_state, &key, + session->local.mac->key_len, + (const unsigned char *)"E"); if(!key) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; @@ -1411,10 +827,10 @@ static int diffie_hellman_sha256(LIBSSH2_SESSION *session, unsigned char *key = NULL; int free_key = 0; - LIBSSH2_KEX_METHOD_SHA_VALUE_HASH(256, key, - session->remote.mac-> - key_len, - (const unsigned char *)"F"); + _libssh2_sha_algo_value_hash(sha_algo_value, session, + exchange_state, &key, + session->remote.mac->key_len, + (const unsigned char *)"F"); if(!key) { ret = LIBSSH2_ERROR_KEX_FAILURE; goto clean_exit; @@ -1526,6 +942,7 @@ kex_method_diffie_hellman_group1_sha1_key_exchange(LIBSSH2_SESSION *session, }; int ret; + libssh2_sha1_ctx exchange_hash_ctx; if(key_state->state == libssh2_NB_state_idle) { /* g == 2 */ @@ -1542,9 +959,11 @@ kex_method_diffie_hellman_group1_sha1_key_exchange(LIBSSH2_SESSION *session, key_state->state = libssh2_NB_state_created; } - ret = diffie_hellman_sha1(session, key_state->g, key_state->p, 128, - SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY, - NULL, 0, &key_state->exchange_state); + + ret = diffie_hellman_sha_algo(session, key_state->g, key_state->p, 128, 1, + (void *)&exchange_hash_ctx, + SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY, + NULL, 0, &key_state->exchange_state); if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1559,14 +978,28 @@ kex_method_diffie_hellman_group1_sha1_key_exchange(LIBSSH2_SESSION *session, } - -/* kex_method_diffie_hellman_group14_sha1_key_exchange - * Diffie-Hellman Group14 Key Exchange using SHA1 +/* kex_method_diffie_hellman_group14_key_exchange + * Diffie-Hellman Group14 Key Exchange with hash function callback */ +typedef int (*diffie_hellman_hash_func_t)(LIBSSH2_SESSION *, + _libssh2_bn *, + _libssh2_bn *, + int, + int, + void *, + unsigned char, + unsigned char, + unsigned char *, + unsigned long, + kmdhgGPshakex_state_t *); static int -kex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session, - key_exchange_state_low_t - * key_state) +kex_method_diffie_hellman_group14_key_exchange(LIBSSH2_SESSION *session, + key_exchange_state_low_t + * key_state, + int sha_algo_value, + void *exchange_hash_ctx, + diffie_hellman_hash_func_t + hashfunc) { static const unsigned char p_value[256] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, @@ -1619,9 +1052,133 @@ kex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session, key_state->state = libssh2_NB_state_created; } - ret = diffie_hellman_sha1(session, key_state->g, key_state->p, - 256, SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY, - NULL, 0, &key_state->exchange_state); + ret = hashfunc(session, key_state->g, key_state->p, + 256, sha_algo_value, exchange_hash_ctx, SSH_MSG_KEXDH_INIT, + SSH_MSG_KEXDH_REPLY, NULL, 0, &key_state->exchange_state); + if(ret == LIBSSH2_ERROR_EAGAIN) { + return ret; + } + + key_state->state = libssh2_NB_state_idle; + _libssh2_bn_free(key_state->p); + key_state->p = NULL; + _libssh2_bn_free(key_state->g); + key_state->g = NULL; + + return ret; +} + + + +/* kex_method_diffie_hellman_group14_sha1_key_exchange + * Diffie-Hellman Group14 Key Exchange using SHA1 + */ +static int +kex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session, + key_exchange_state_low_t + * key_state) +{ + libssh2_sha1_ctx ctx; + return kex_method_diffie_hellman_group14_key_exchange(session, + key_state, 1, + &ctx, + diffie_hellman_sha_algo); +} + + + +/* kex_method_diffie_hellman_group14_sha256_key_exchange + * Diffie-Hellman Group14 Key Exchange using SHA256 + */ +static int +kex_method_diffie_hellman_group14_sha256_key_exchange(LIBSSH2_SESSION *session, + key_exchange_state_low_t + * key_state) +{ + libssh2_sha256_ctx ctx; + return kex_method_diffie_hellman_group14_key_exchange(session, + key_state, 256, + &ctx, + diffie_hellman_sha_algo); +} + +/* kex_method_diffie_hellman_group16_sha512_key_exchange +* Diffie-Hellman Group16 Key Exchange using SHA512 +*/ +static int +kex_method_diffie_hellman_group16_sha512_key_exchange(LIBSSH2_SESSION *session, + key_exchange_state_low_t + * key_state) + +{ + static const unsigned char p_value[512] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, + 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, + 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, + 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, + 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, + 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, + 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, + 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, + 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, + 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, + 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D, + 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57, + 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0, + 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73, + 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0, + 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20, + 0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18, + 0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB, + 0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F, + 0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76, + 0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC, + 0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + }; + int ret; + libssh2_sha512_ctx exchange_hash_ctx; + + if(key_state->state == libssh2_NB_state_idle) { + key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value + (p_value) */ + key_state->g = _libssh2_bn_init(); /* SSH2 defined value (2) */ + + /* g == 2 */ + /* Initialize P and G */ + _libssh2_bn_set_word(key_state->g, 2); + _libssh2_bn_from_bin(key_state->p, 512, p_value); + + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Initiating Diffie-Hellman Group16 Key Exchange"); + + key_state->state = libssh2_NB_state_created; + } + + ret = diffie_hellman_sha_algo(session, key_state->g, key_state->p, 512, + 512, (void *)&exchange_hash_ctx, + SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY, + NULL, 0, &key_state->exchange_state); if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1635,7 +1192,138 @@ kex_method_diffie_hellman_group14_sha1_key_exchange(LIBSSH2_SESSION *session, return ret; } +/* kex_method_diffie_hellman_group16_sha512_key_exchange +* Diffie-Hellman Group18 Key Exchange using SHA512 +*/ +static int +kex_method_diffie_hellman_group18_sha512_key_exchange(LIBSSH2_SESSION *session, + key_exchange_state_low_t + * key_state) + +{ + static const unsigned char p_value[1024] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, + 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, + 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, + 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, + 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, + 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, + 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, + 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, + 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, + 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, + 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D, + 0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57, + 0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0, + 0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73, + 0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0, + 0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20, + 0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18, + 0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB, + 0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F, + 0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76, + 0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC, + 0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92, + 0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26, 0xC1, 0xD4, 0xDC, 0xB2, + 0x60, 0x26, 0x46, 0xDE, 0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD, + 0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E, 0xE5, 0xDB, 0x38, 0x2F, + 0x41, 0x30, 0x01, 0xAE, 0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31, + 0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18, 0xDA, 0x3E, 0xDB, 0xEB, + 0xCF, 0x9B, 0x14, 0xED, 0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B, + 0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B, 0x33, 0x20, 0x51, 0x51, + 0x2B, 0xD7, 0xAF, 0x42, 0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF, + 0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC, 0xF0, 0x32, 0xEA, 0x15, + 0xD1, 0x72, 0x1D, 0x03, 0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6, + 0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82, 0xB5, 0xA8, 0x40, 0x31, + 0x90, 0x0B, 0x1C, 0x9E, 0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3, + 0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE, 0x0F, 0x1D, 0x45, 0xB7, + 0xFF, 0x58, 0x5A, 0xC5, 0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA, + 0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8, 0x14, 0xCC, 0x5E, 0xD2, + 0x0F, 0x80, 0x37, 0xE0, 0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28, + 0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76, 0xF5, 0x50, 0xAA, 0x3D, + 0x8A, 0x1F, 0xBF, 0xF0, 0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C, + 0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32, 0x38, 0x7F, 0xE8, 0xD7, + 0x6E, 0x3C, 0x04, 0x68, 0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE, + 0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6, 0xE6, 0x94, 0xF9, 0x1E, + 0x6D, 0xBE, 0x11, 0x59, 0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4, + 0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C, 0xD8, 0xBE, 0xC4, 0xD0, + 0x73, 0xB9, 0x31, 0xBA, 0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00, + 0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED, 0x25, 0x76, 0xF6, 0x93, + 0x6B, 0xA4, 0x24, 0x66, 0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68, + 0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78, 0x23, 0x8F, 0x16, 0xCB, + 0xE3, 0x9D, 0x65, 0x2D, 0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9, + 0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07, 0x13, 0xEB, 0x57, 0xA8, + 0x1A, 0x23, 0xF0, 0xC7, 0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B, + 0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD, 0xFA, 0x9D, 0x4B, 0x7F, + 0xA2, 0xC0, 0x87, 0xE8, 0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A, + 0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6, 0x6D, 0x2A, 0x13, 0xF8, + 0x3F, 0x44, 0xF8, 0x2D, 0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36, + 0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1, 0x64, 0xF3, 0x1C, 0xC5, + 0x08, 0x46, 0x85, 0x1D, 0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1, + 0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73, 0xFA, 0xF3, 0x6B, 0xC3, + 0x1E, 0xCF, 0xA2, 0x68, 0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92, + 0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7, 0x88, 0x9A, 0x00, 0x2E, + 0xD5, 0xEE, 0x38, 0x2B, 0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47, + 0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA, 0x9E, 0x30, 0x50, 0xE2, + 0x76, 0x56, 0x94, 0xDF, 0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71, + 0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF + }; + int ret; + libssh2_sha512_ctx exchange_hash_ctx; + + if(key_state->state == libssh2_NB_state_idle) { + key_state->p = _libssh2_bn_init_from_bin(); /* SSH2 defined value + (p_value) */ + key_state->g = _libssh2_bn_init(); /* SSH2 defined value (2) */ + + /* g == 2 */ + /* Initialize P and G */ + _libssh2_bn_set_word(key_state->g, 2); + _libssh2_bn_from_bin(key_state->p, 1024, p_value); + + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Initiating Diffie-Hellman Group18 Key Exchange"); + + key_state->state = libssh2_NB_state_created; + } + + ret = diffie_hellman_sha_algo(session, key_state->g, key_state->p, 1024, + 512, (void *)&exchange_hash_ctx, + SSH_MSG_KEXDH_INIT, SSH_MSG_KEXDH_REPLY, + NULL, 0, &key_state->exchange_state); + if(ret == LIBSSH2_ERROR_EAGAIN) { + return ret; + } + + key_state->state = libssh2_NB_state_idle; + _libssh2_bn_free(key_state->p); + key_state->p = NULL; + _libssh2_bn_free(key_state->g); + key_state->g = NULL; + return ret; +} /* kex_method_diffie_hellman_group_exchange_sha1_key_exchange * Diffie-Hellman Group Exchange Key Exchange using SHA1 @@ -1708,6 +1396,7 @@ kex_method_diffie_hellman_group_exchange_sha1_key_exchange size_t p_len, g_len; unsigned char *p, *g; struct string_buf buf; + libssh2_sha1_ctx exchange_hash_ctx; if(key_state->data_len < 9) { ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, @@ -1736,12 +1425,14 @@ kex_method_diffie_hellman_group_exchange_sha1_key_exchange _libssh2_bn_from_bin(key_state->p, p_len, p); _libssh2_bn_from_bin(key_state->g, g_len, g); - ret = diffie_hellman_sha1(session, key_state->g, key_state->p, p_len, - SSH_MSG_KEX_DH_GEX_INIT, - SSH_MSG_KEX_DH_GEX_REPLY, - key_state->data + 1, - key_state->data_len - 1, - &key_state->exchange_state); + ret = diffie_hellman_sha_algo(session, key_state->g, key_state->p, + p_len, 1, + (void *)&exchange_hash_ctx, + SSH_MSG_KEX_DH_GEX_INIT, + SSH_MSG_KEX_DH_GEX_REPLY, + key_state->data + 1, + key_state->data_len - 1, + &key_state->exchange_state); if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1833,6 +1524,7 @@ kex_method_diffie_hellman_group_exchange_sha256_key_exchange unsigned char *p, *g; size_t p_len, g_len; struct string_buf buf; + libssh2_sha256_ctx exchange_hash_ctx; if(key_state->data_len < 9) { ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, @@ -1861,12 +1553,14 @@ kex_method_diffie_hellman_group_exchange_sha256_key_exchange _libssh2_bn_from_bin(key_state->p, p_len, p); _libssh2_bn_from_bin(key_state->g, g_len, g); - ret = diffie_hellman_sha256(session, key_state->g, key_state->p, p_len, - SSH_MSG_KEX_DH_GEX_INIT, - SSH_MSG_KEX_DH_GEX_REPLY, - key_state->data + 1, - key_state->data_len - 1, - &key_state->exchange_state); + ret = diffie_hellman_sha_algo(session, key_state->g, key_state->p, + p_len, 256, + (void *)&exchange_hash_ctx, + SSH_MSG_KEX_DH_GEX_INIT, + SSH_MSG_KEX_DH_GEX_REPLY, + key_state->data + 1, + key_state->data_len - 1, + &key_state->exchange_state); if(ret == LIBSSH2_ERROR_EAGAIN) { return ret; } @@ -1885,39 +1579,6 @@ kex_method_diffie_hellman_group_exchange_sha256_key_exchange } -#if LIBSSH2_ECDSA - -/* kex_session_ecdh_curve_type - * returns the EC curve type by name used in key exchange - */ - -static int -kex_session_ecdh_curve_type(const char *name, libssh2_curve_type *out_type) -{ - int ret = 0; - libssh2_curve_type type; - - if(name == NULL) - return -1; - - if(strcmp(name, "ecdh-sha2-nistp256") == 0) - type = LIBSSH2_EC_CURVE_NISTP256; - else if(strcmp(name, "ecdh-sha2-nistp384") == 0) - type = LIBSSH2_EC_CURVE_NISTP384; - else if(strcmp(name, "ecdh-sha2-nistp521") == 0) - type = LIBSSH2_EC_CURVE_NISTP521; - else { - ret = -1; - } - - if(ret == 0 && out_type) { - *out_type = type; - } - - return ret; -} - - /* LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY * * Macro that create and verifies EC SHA hash with a given digest bytes @@ -2027,6 +1688,39 @@ kex_session_ecdh_curve_type(const char *name, libssh2_curve_type *out_type) } \ +#if LIBSSH2_ECDSA + +/* kex_session_ecdh_curve_type + * returns the EC curve type by name used in key exchange + */ + +static int +kex_session_ecdh_curve_type(const char *name, libssh2_curve_type *out_type) +{ + int ret = 0; + libssh2_curve_type type; + + if(name == NULL) + return -1; + + if(strcmp(name, "ecdh-sha2-nistp256") == 0) + type = LIBSSH2_EC_CURVE_NISTP256; + else if(strcmp(name, "ecdh-sha2-nistp384") == 0) + type = LIBSSH2_EC_CURVE_NISTP384; + else if(strcmp(name, "ecdh-sha2-nistp521") == 0) + type = LIBSSH2_EC_CURVE_NISTP521; + else { + ret = -1; + } + + if(ret == 0 && out_type) { + *out_type = type; + } + + return ret; +} + + /* ecdh_sha2_nistp * Elliptic Curve Diffie Hellman Key Exchange */ @@ -2058,26 +1752,24 @@ static int ecdh_sha2_nistp(LIBSSH2_SESSION *session, libssh2_curve_type type, /* parse INIT reply data */ /* host key K_S */ - unsigned char *s = data + 1; /* Advance past packet type */ unsigned char *server_public_key; size_t server_public_key_len; - size_t host_sig_len; + struct string_buf buf; - session->server_hostkey_len = - _libssh2_ntohu32((const unsigned char *)s); - s += 4; + buf.data = data; + buf.len = data_len; + buf.dataptr = buf.data; + buf.dataptr++; /* Advance past packet type */ - session->server_hostkey = LIBSSH2_ALLOC(session, - session->server_hostkey_len); - if(!session->server_hostkey) { - ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for a copy " - "of the host key"); + if(_libssh2_copy_string(session, &buf, &(session->server_hostkey), + &server_public_key_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for a copy " + "of the host key"); goto clean_exit; } - memcpy(session->server_hostkey, s, session->server_hostkey_len); - s += session->server_hostkey_len; + session->server_hostkey_len = (uint32_t)server_public_key_len; #if LIBSSH2_MD5 { @@ -2176,19 +1868,20 @@ static int ecdh_sha2_nistp(LIBSSH2_SESSION *session, libssh2_curve_type type, } /* server public key Q_S */ - server_public_key_len = _libssh2_ntohu32((const unsigned char *)s); - s += 4; - - server_public_key = s; - s += server_public_key_len; + if(_libssh2_get_string(&buf, &server_public_key, + &server_public_key_len)) { + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected key length"); + goto clean_exit; + } /* server signature */ - host_sig_len = _libssh2_ntohu32((const unsigned char *)s); - s += 4; - - exchange_state->h_sig = s; - exchange_state->h_sig_len = host_sig_len; - s += host_sig_len; + if(_libssh2_get_string(&buf, &exchange_state->h_sig, + &(exchange_state->h_sig_len))) { + ret = _libssh2_error(session, LIBSSH2_ERROR_HOSTKEY_INIT, + "Unexpected ecdh server sig length"); + goto clean_exit; + } /* Compute the shared secret K */ rc = _libssh2_ecdh_gen_k(&exchange_state->k, private_key, @@ -3156,7 +2849,7 @@ kex_method_curve25519_key_exchange goto clean_exit; } - rc = _libssh2_curve25519_new(session, NULL, + rc = _libssh2_curve25519_new(session, &key_state->curve25519_public_key, &key_state->curve25519_private_key); @@ -3263,6 +2956,24 @@ static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group14_sha1 = { LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, }; +static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group14_sha256 = { + "diffie-hellman-group14-sha256", + kex_method_diffie_hellman_group14_sha256_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group16_sha512 = { + "diffie-hellman-group16-sha512", + kex_method_diffie_hellman_group16_sha512_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + +static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group18_sha512 = { + "diffie-hellman-group18-sha512", + kex_method_diffie_hellman_group18_sha512_key_exchange, + LIBSSH2_KEX_METHOD_FLAG_REQ_SIGN_HOSTKEY, +}; + static const LIBSSH2_KEX_METHOD kex_method_diffie_helman_group_exchange_sha1 = { "diffie-hellman-group-exchange-sha1", @@ -3316,20 +3027,23 @@ kex_method_ssh_curve25519_sha256 = { #endif static const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = { +#if LIBSSH2_ED25519 + &kex_method_ssh_curve25519_sha256, + &kex_method_ssh_curve25519_sha256_libssh, +#endif #if LIBSSH2_ECDSA &kex_method_ecdh_sha2_nistp256, &kex_method_ecdh_sha2_nistp384, &kex_method_ecdh_sha2_nistp521, -#endif -#if LIBSSH2_ED25519 - &kex_method_ssh_curve25519_sha256, - &kex_method_ssh_curve25519_sha256_libssh, #endif &kex_method_diffie_helman_group_exchange_sha256, - &kex_method_diffie_helman_group_exchange_sha1, + &kex_method_diffie_helman_group16_sha512, + &kex_method_diffie_helman_group18_sha512, + &kex_method_diffie_helman_group14_sha256, &kex_method_diffie_helman_group14_sha1, &kex_method_diffie_helman_group1_sha1, - NULL + &kex_method_diffie_helman_group_exchange_sha1, + NULL }; typedef struct _LIBSSH2_COMMON_METHOD @@ -3462,7 +3176,11 @@ static int kexinit(LIBSSH2_SESSION * session) *(s++) = SSH_MSG_KEXINIT; - _libssh2_random(s, 16); + if(_libssh2_random(s, 16)) { + return _libssh2_error(session, LIBSSH2_ERROR_RANDGEN, + "Unable to get random bytes " + "for KEXINIT cookie"); + } s += 16; /* Ennumerating through these lists twice is probably (certainly?) @@ -3572,24 +3290,40 @@ kex_agree_instr(unsigned char *haystack, unsigned long haystack_len, const unsigned char *needle, unsigned long needle_len) { unsigned char *s; + unsigned char *end_haystack; + unsigned long left; + + if(haystack == NULL || needle == NULL) { + return NULL; + } /* Haystack too short to bother trying */ - if(haystack_len < needle_len) { + if(haystack_len < needle_len || needle_len == 0) { return NULL; } + s = haystack; + end_haystack = &haystack[haystack_len]; + left = end_haystack - s; + /* Needle at start of haystack */ if((strncmp((char *) haystack, (char *) needle, needle_len) == 0) && (needle_len == haystack_len || haystack[needle_len] == ',')) { return haystack; } - s = haystack; /* Search until we run out of comas or we run out of haystack, whichever comes first */ - while((s = (unsigned char *) strchr((char *) s, ',')) - && ((haystack_len - (s - haystack)) > needle_len)) { - s++; + while((s = (unsigned char *) memchr((char *) s, ',', left))) { + /* Advance buffer past coma if we can */ + left = end_haystack - s; + if((left >= 1) && (left <= haystack_len) && (left > needle_len)) { + s++; + } + else { + return NULL; + } + /* Needle at X position */ if((strncmp((char *) s, (char *) needle, needle_len) == 0) && (((s - haystack) + needle_len) == haystack_len @@ -3937,35 +3671,10 @@ static int kex_agree_comp(LIBSSH2_SESSION *session, } - /* TODO: When in server mode we need to turn this logic on its head * The Client gets to make the final call on "agreed methods" */ -/* - * kex_string_pair() extracts a string from the packet and makes sure it fits - * within the given packet. - */ -static int kex_string_pair(unsigned char **sp, /* parsing position */ - unsigned char *data, /* start pointer to packet */ - size_t data_len, /* size of total packet */ - size_t *lenp, /* length of the string */ - unsigned char **strp) /* pointer to string start */ -{ - unsigned char *s = *sp; - *lenp = _libssh2_ntohu32(s); - - /* the length of the string must fit within the current pointer and the - end of the packet */ - if(*lenp > (data_len - (s - data) -4)) - return 1; - *strp = s + 4; - s += 4 + *lenp; - - *sp = s; - return 0; -} - /* kex_agree_methods * Decide which specific method to use of the methods offered by each party */ @@ -3976,40 +3685,48 @@ static int kex_agree_methods(LIBSSH2_SESSION * session, unsigned char *data, *mac_cs, *mac_sc; size_t kex_len, hostkey_len, crypt_cs_len, crypt_sc_len, comp_cs_len; size_t comp_sc_len, mac_cs_len, mac_sc_len; - unsigned char *s = data; + struct string_buf buf; - /* Skip packet_type, we know it already */ - s++; + if(data_len < 17) + return -1; + + buf.data = (unsigned char *)data; + buf.len = data_len; + buf.dataptr = buf.data; + buf.dataptr++; /* advance past packet type */ /* Skip cookie, don't worry, it's preserved in the kexinit field */ - s += 16; + buf.dataptr += 16; /* Locate each string */ - if(kex_string_pair(&s, data, data_len, &kex_len, &kex)) + if(_libssh2_get_string(&buf, &kex, &kex_len)) return -1; - if(kex_string_pair(&s, data, data_len, &hostkey_len, &hostkey)) + if(_libssh2_get_string(&buf, &hostkey, &hostkey_len)) return -1; - if(kex_string_pair(&s, data, data_len, &crypt_cs_len, &crypt_cs)) + if(_libssh2_get_string(&buf, &crypt_cs, &crypt_cs_len)) return -1; - if(kex_string_pair(&s, data, data_len, &crypt_sc_len, &crypt_sc)) + if(_libssh2_get_string(&buf, &crypt_sc, &crypt_sc_len)) return -1; - if(kex_string_pair(&s, data, data_len, &mac_cs_len, &mac_cs)) + if(_libssh2_get_string(&buf, &mac_cs, &mac_cs_len)) return -1; - if(kex_string_pair(&s, data, data_len, &mac_sc_len, &mac_sc)) + if(_libssh2_get_string(&buf, &mac_sc, &mac_sc_len)) return -1; - if(kex_string_pair(&s, data, data_len, &comp_cs_len, &comp_cs)) + if(_libssh2_get_string(&buf, &comp_cs, &comp_cs_len)) return -1; - if(kex_string_pair(&s, data, data_len, &comp_sc_len, &comp_sc)) + if(_libssh2_get_string(&buf, &comp_sc, &comp_sc_len)) return -1; /* If the server sent an optimistic packet, assume that it guessed wrong. * If the guess is determined to be right (by kex_agree_kex_hostkey) * This flag will be reset to zero so that it's not ignored */ - session->burn_optimistic_kexinit = *(s++); - /* Next uint32 in packet is all zeros (reserved) */ + if(_libssh2_check_length(&buf, 1)) { + session->burn_optimistic_kexinit = *(buf.dataptr++); + } + else { + return -1; + } - if(data_len < (unsigned) (s - data)) - return -1; /* short packet */ + /* Next uint32 in packet is all zeros (reserved) */ if(kex_agree_kex_hostkey(session, kex, kex_len, hostkey, hostkey_len)) { return -1; @@ -4296,7 +4013,7 @@ libssh2_session_method_pref(LIBSSH2_SESSION * session, int method_type, } } - if(strlen(newprefs) == 0) { + if(!*newprefs) { LIBSSH2_FREE(session, newprefs); return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, "The requested method(s) are not currently " @@ -4371,7 +4088,7 @@ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, supported algorithms (needed to allocate the proper size of array) and the second time to actually copy the pointers. Typically this function will not be called often (typically at the beginning of a session) and - the number of algorithms (i.e. niumber of iterations in one loop) will + the number of algorithms (i.e. number of iterations in one loop) will not be high (typically it will not exceed 20) for quite a long time. So double looping really shouldn't be an issue and it is definitely a diff --git a/vendor/libssh2/src/knownhost.c b/vendor/libssh2/src/knownhost.c index b9dc47a80..77798fbfd 100644 --- a/vendor/libssh2/src/knownhost.c +++ b/vendor/libssh2/src/knownhost.c @@ -955,7 +955,7 @@ libssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts, { FILE *file; int num = 0; - char buf[2048]; + char buf[4092]; if(type != LIBSSH2_KNOWNHOST_FILE_OPENSSH) return _libssh2_error(hosts->session, @@ -1194,7 +1194,7 @@ libssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts, struct known_host *node; FILE *file; int rc = LIBSSH2_ERROR_NONE; - char buffer[2048]; + char buffer[4092]; /* we only support this single file type for now, bail out on all other attempts */ diff --git a/vendor/libssh2/src/libgcrypt.h b/vendor/libssh2/src/libgcrypt.h index ec88aded6..298c65ed0 100644 --- a/vendor/libssh2/src/libgcrypt.h +++ b/vendor/libssh2/src/libgcrypt.h @@ -1,3 +1,5 @@ +#ifndef __LIBSSH2_LIBGCRYPT_H +#define __LIBSSH2_LIBGCRYPT_H /* * Copyright (C) 2008, 2009, 2010 Simon Josefsson * Copyright (C) 2006, 2007, The Written Word, Inc. @@ -66,7 +68,7 @@ #define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) #define _libssh2_random(buf, len) \ - (gcry_randomize ((buf), (len), GCRY_STRONG_RANDOM), 1) + (gcry_randomize ((buf), (len), GCRY_STRONG_RANDOM), 0) #define libssh2_prepare_iovec(vec, len) /* Empty. */ @@ -232,3 +234,4 @@ extern int _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, _libssh2_bn *f, _libssh2_bn *p); extern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); +#endif /* __LIBSSH2_LIBGCRYPT_H */ diff --git a/vendor/libssh2/src/libssh2_config.h.in b/vendor/libssh2/src/libssh2_config.h.in index 307c62553..94adf4283 100644 --- a/vendor/libssh2/src/libssh2_config.h.in +++ b/vendor/libssh2/src/libssh2_config.h.in @@ -3,19 +3,13 @@ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. - */ -#undef CRAY_STACKSEG_END - -/* Define to 1 if using `alloca.c'. */ +/* Define to 1 if using 'alloca.c'. */ #undef C_ALLOCA -/* Define to 1 if you have `alloca', as a function or macro. */ +/* Define to 1 if you have 'alloca', as a function or macro. */ #undef HAVE_ALLOCA -/* Define to 1 if you have and it should be used (not on Ultrix). - */ +/* Define to 1 if works. */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ @@ -76,9 +70,6 @@ /* Define to 1 if the compiler supports the 'long long' data type. */ #undef HAVE_LONGLONG -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - /* Define to 1 if you have the `memset_s' function. */ #undef HAVE_MEMSET_S @@ -222,7 +213,9 @@ STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION -/* Define to 1 if you have the ANSI C header files. */ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Version number of package */ @@ -240,11 +233,6 @@ # endif #endif -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif - /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS diff --git a/vendor/libssh2/src/libssh2_priv.h b/vendor/libssh2/src/libssh2_priv.h index 33c5ad3f8..da488b744 100644 --- a/vendor/libssh2/src/libssh2_priv.h +++ b/vendor/libssh2/src/libssh2_priv.h @@ -1,3 +1,5 @@ +#ifndef __LIBSSH2_PRIV_H +#define __LIBSSH2_PRIV_H /* Copyright (c) 2004-2008, 2010, Sara Golemon * Copyright (c) 2009-2014 by Daniel Stenberg * Copyright (c) 2010 Simon Josefsson @@ -37,9 +39,6 @@ * OF SUCH DAMAGE. */ -#ifndef LIBSSH2_PRIV_H -#define LIBSSH2_PRIV_H 1 - #define LIBSSH2_LIBRARY #include "libssh2_config.h" @@ -110,14 +109,19 @@ #define inline __inline #endif -/* Provide iovec / writev on WIN32 platform. */ -#ifdef WIN32 +/* 3DS doesn't seem to have iovec */ +#if defined(WIN32) || defined(_3DS) struct iovec { size_t iov_len; void *iov_base; }; +#endif + +/* Provide iovec / writev on WIN32 platform. */ +#ifdef WIN32 + static inline int writev(int sock, struct iovec *iov, int nvecs) { DWORD ret; @@ -452,6 +456,13 @@ struct _LIBSSH2_CHANNEL /* State variables used in libssh2_channel_handle_extended_data2() */ libssh2_nonblocking_states extData2_state; + /* State variables used in libssh2_channel_request_auth_agent() */ + libssh2_nonblocking_states req_auth_agent_try_state; + libssh2_nonblocking_states req_auth_agent_state; + unsigned char req_auth_agent_packet[36]; + size_t req_auth_agent_packet_len; + unsigned char req_auth_agent_local_channel[4]; + packet_requirev_state_t req_auth_agent_requirev_state; }; struct _LIBSSH2_LISTENER @@ -1140,4 +1151,4 @@ endings either CRLF or LF so 't' is appropriate. #define FOPEN_APPENDTEXT "a" #endif -#endif /* LIBSSH2_H */ +#endif /* __LIBSSH2_PRIV_H */ diff --git a/vendor/libssh2/src/mac.h b/vendor/libssh2/src/mac.h index 66d3e6101..46fce5424 100644 --- a/vendor/libssh2/src/mac.h +++ b/vendor/libssh2/src/mac.h @@ -1,6 +1,5 @@ #ifndef __LIBSSH2_MAC_H #define __LIBSSH2_MAC_H - /* Copyright (C) 2009-2010 by Daniel Stenberg * * Redistribution and use in source and binary forms, diff --git a/vendor/libssh2/src/mbedtls.c b/vendor/libssh2/src/mbedtls.c index 8bbcfd8d0..4629ce4a9 100644 --- a/vendor/libssh2/src/mbedtls.c +++ b/vendor/libssh2/src/mbedtls.c @@ -94,7 +94,7 @@ _libssh2_mbedtls_safe_free(void *buf, int len) #ifdef LIBSSH2_CLEAR_MEMORY if(len > 0) - memset(buf, 0, len); + _libssh2_explicit_zero(buf, len); #endif mbedtls_free(buf); @@ -272,7 +272,7 @@ _libssh2_mbedtls_bignum_random(_libssh2_bn *bn, int bits, int top, int bottom) if(err) return -1; - /* Zero unsued bits above the most significant bit*/ + /* Zero unused bits above the most significant bit*/ for(i = len*8 - 1; bits <= i; --i) { err = mbedtls_mpi_set_bit(bn, i, 0); if(err) @@ -730,4 +730,522 @@ _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) *dhctx = NULL; } +#if LIBSSH2_ECDSA + +/*******************************************************************/ +/* + * mbedTLS backend: ECDSA functions + */ + +/* + * _libssh2_ecdsa_create_key + * + * Creates a local private key based on input curve + * and returns octal value and octal length + * + */ + +int +_libssh2_mbedtls_ecdsa_create_key(LIBSSH2_SESSION *session, + _libssh2_ec_key **privkey, + unsigned char **pubkey_oct, + size_t *pubkey_oct_len, + libssh2_curve_type curve) +{ + size_t plen = 0; + + *privkey = LIBSSH2_ALLOC(session, sizeof(mbedtls_ecp_keypair)); + + if(*privkey == NULL) + goto failed; + + mbedtls_ecdsa_init(*privkey); + + if(mbedtls_ecdsa_genkey(*privkey, (mbedtls_ecp_group_id)curve, + mbedtls_ctr_drbg_random, + &_libssh2_mbedtls_ctr_drbg) != 0) + goto failed; + + plen = 2 * mbedtls_mpi_size(&(*privkey)->grp.P) + 1; + *pubkey_oct = LIBSSH2_ALLOC(session, plen); + + if(*pubkey_oct == NULL) + goto failed; + + if(mbedtls_ecp_point_write_binary(&(*privkey)->grp, &(*privkey)->Q, + MBEDTLS_ECP_PF_UNCOMPRESSED, + pubkey_oct_len, *pubkey_oct, plen) == 0) + return 0; + +failed: + + _libssh2_mbedtls_ecdsa_free(*privkey); + _libssh2_mbedtls_safe_free(*pubkey_oct, plen); + *privkey = NULL; + + return -1; +} + +/* _libssh2_ecdsa_curve_name_with_octal_new + * + * Creates a new public key given an octal string, length and type + * + */ + +int +_libssh2_mbedtls_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx **ctx, + const unsigned char *k, + size_t k_len, + libssh2_curve_type curve) +{ + *ctx = mbedtls_calloc(1, sizeof(mbedtls_ecp_keypair)); + + if(*ctx == NULL) + goto failed; + + mbedtls_ecdsa_init(*ctx); + + if(mbedtls_ecp_group_load(&(*ctx)->grp, (mbedtls_ecp_group_id)curve) != 0) + goto failed; + + if(mbedtls_ecp_point_read_binary(&(*ctx)->grp, &(*ctx)->Q, k, k_len) != 0) + goto failed; + + if(mbedtls_ecp_check_pubkey(&(*ctx)->grp, &(*ctx)->Q) == 0) + return 0; + +failed: + + _libssh2_mbedtls_ecdsa_free(*ctx); + *ctx = NULL; + + return -1; +} + +/* _libssh2_ecdh_gen_k + * + * Computes the shared secret K given a local private key, + * remote public key and length + */ + +int +_libssh2_mbedtls_ecdh_gen_k(_libssh2_bn **k, + _libssh2_ec_key *privkey, + const unsigned char *server_pubkey, + size_t server_pubkey_len) +{ + mbedtls_ecp_point pubkey; + int rc = 0; + + if(*k == NULL) + return -1; + + mbedtls_ecp_point_init(&pubkey); + + if(mbedtls_ecp_point_read_binary(&privkey->grp, &pubkey, + server_pubkey, server_pubkey_len) != 0) { + rc = -1; + goto cleanup; + } + + if(mbedtls_ecdh_compute_shared(&privkey->grp, *k, + &pubkey, &privkey->d, + mbedtls_ctr_drbg_random, + &_libssh2_mbedtls_ctr_drbg) != 0) { + rc = -1; + goto cleanup; + } + + if(mbedtls_ecp_check_privkey(&privkey->grp, *k) != 0) + rc = -1; + +cleanup: + + mbedtls_ecp_point_free(&pubkey); + + return rc; +} + +#define LIBSSH2_MBEDTLS_ECDSA_VERIFY(digest_type) \ +{ \ + unsigned char hsh[SHA##digest_type##_DIGEST_LENGTH]; \ + \ + if(libssh2_sha##digest_type(m, m_len, hsh) == 0) { \ + rc = mbedtls_ecdsa_verify(&ctx->grp, hsh, \ + SHA##digest_type##_DIGEST_LENGTH, \ + &ctx->Q, &pr, &ps); \ + } \ + \ +} + +/* _libssh2_ecdsa_sign + * + * Verifies the ECDSA signature of a hashed message + * + */ + +int +_libssh2_mbedtls_ecdsa_verify(libssh2_ecdsa_ctx *ctx, + const unsigned char *r, size_t r_len, + const unsigned char *s, size_t s_len, + const unsigned char *m, size_t m_len) +{ + mbedtls_mpi pr, ps; + int rc = -1; + + mbedtls_mpi_init(&pr); + mbedtls_mpi_init(&ps); + + if(mbedtls_mpi_read_binary(&pr, r, r_len) != 0) + goto cleanup; + + if(mbedtls_mpi_read_binary(&ps, s, s_len) != 0) + goto cleanup; + + switch(_libssh2_ecdsa_get_curve_type(ctx)) { + case LIBSSH2_EC_CURVE_NISTP256: + LIBSSH2_MBEDTLS_ECDSA_VERIFY(256); + break; + case LIBSSH2_EC_CURVE_NISTP384: + LIBSSH2_MBEDTLS_ECDSA_VERIFY(384); + break; + case LIBSSH2_EC_CURVE_NISTP521: + LIBSSH2_MBEDTLS_ECDSA_VERIFY(512); + break; + default: + rc = -1; + } + +cleanup: + + mbedtls_mpi_free(&pr); + mbedtls_mpi_free(&ps); + + return (rc == 0) ? 0 : -1; +} + +static int +_libssh2_mbedtls_parse_eckey(libssh2_ecdsa_ctx **ctx, + mbedtls_pk_context *pkey, + LIBSSH2_SESSION *session, + const unsigned char *data, + size_t data_len, + const unsigned char *pwd) +{ + size_t pwd_len; + + pwd_len = pwd ? strlen((const char *) pwd) : 0; + + if(mbedtls_pk_parse_key(pkey, data, data_len, pwd, pwd_len) != 0) + goto failed; + + if(mbedtls_pk_get_type(pkey) != MBEDTLS_PK_ECKEY) + goto failed; + + *ctx = LIBSSH2_ALLOC(session, sizeof(libssh2_ecdsa_ctx)); + + if(*ctx == NULL) + goto failed; + + mbedtls_ecdsa_init(*ctx); + + if(mbedtls_ecdsa_from_keypair(*ctx, mbedtls_pk_ec(*pkey)) == 0) + return 0; + +failed: + + _libssh2_mbedtls_ecdsa_free(*ctx); + *ctx = NULL; + + return -1; +} + +static int +_libssh2_mbedtls_parse_openssh_key(libssh2_ecdsa_ctx **ctx, + LIBSSH2_SESSION *session, + const unsigned char *data, + size_t data_len, + const unsigned char *pwd) +{ + libssh2_curve_type type; + unsigned char *name = NULL; + struct string_buf *decrypted = NULL; + size_t curvelen, exponentlen, pointlen; + unsigned char *curve, *exponent, *point_buf; + + if(_libssh2_openssh_pem_parse_memory(session, pwd, + (const char *)data, data_len, + &decrypted) != 0) + goto failed; + + if(_libssh2_get_string(decrypted, &name, NULL) != 0) + goto failed; + + if(_libssh2_mbedtls_ecdsa_curve_type_from_name((const char *)name, + &type) != 0) + goto failed; + + if(_libssh2_get_string(decrypted, &curve, &curvelen) != 0) + goto failed; + + if(_libssh2_get_string(decrypted, &point_buf, &pointlen) != 0) + goto failed; + + if(_libssh2_get_bignum_bytes(decrypted, &exponent, &exponentlen) != 0) + goto failed; + + *ctx = LIBSSH2_ALLOC(session, sizeof(libssh2_ecdsa_ctx)); + + if(*ctx == NULL) + goto failed; + + mbedtls_ecdsa_init(*ctx); + + if(mbedtls_ecp_group_load(&(*ctx)->grp, (mbedtls_ecp_group_id)type) != 0) + goto failed; + + if(mbedtls_mpi_read_binary(&(*ctx)->d, exponent, exponentlen) != 0) + goto failed; + + if(mbedtls_ecp_mul(&(*ctx)->grp, &(*ctx)->Q, + &(*ctx)->d, &(*ctx)->grp.G, + mbedtls_ctr_drbg_random, + &_libssh2_mbedtls_ctr_drbg) != 0) + goto failed; + + if(mbedtls_ecp_check_privkey(&(*ctx)->grp, &(*ctx)->d) == 0) + goto cleanup; + +failed: + + _libssh2_mbedtls_ecdsa_free(*ctx); + *ctx = NULL; + +cleanup: + + if(decrypted) { + _libssh2_string_buf_free(session, decrypted); + } + + return (*ctx == NULL) ? -1 : 0; +} + +/* _libssh2_ecdsa_new_private + * + * Creates a new private key given a file path and password + * + */ + +int +_libssh2_mbedtls_ecdsa_new_private(libssh2_ecdsa_ctx **ctx, + LIBSSH2_SESSION *session, + const char *filename, + const unsigned char *pwd) +{ + mbedtls_pk_context pkey; + unsigned char *data; + size_t data_len; + + if(mbedtls_pk_load_file(filename, &data, &data_len) != 0) + goto cleanup; + + mbedtls_pk_init(&pkey); + + if(_libssh2_mbedtls_parse_eckey(ctx, &pkey, session, + data, data_len, pwd) == 0) + goto cleanup; + + _libssh2_mbedtls_parse_openssh_key(ctx, session, data, data_len, pwd); + +cleanup: + + mbedtls_pk_free(&pkey); + + _libssh2_mbedtls_safe_free(data, data_len); + + return (*ctx == NULL) ? -1 : 0; +} + +/* _libssh2_ecdsa_new_private + * + * Creates a new private key given a file data and password + * + */ + +int +_libssh2_mbedtls_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx **ctx, + LIBSSH2_SESSION *session, + const char *data, + size_t data_len, + const unsigned char *pwd) +{ + unsigned char *ntdata; + mbedtls_pk_context pkey; + + mbedtls_pk_init(&pkey); + + ntdata = LIBSSH2_ALLOC(session, data_len + 1); + + if(ntdata == NULL) + goto cleanup; + + memcpy(ntdata, data, data_len); + + if(_libssh2_mbedtls_parse_eckey(ctx, &pkey, session, + ntdata, data_len + 1, pwd) == 0) + goto cleanup; + + _libssh2_mbedtls_parse_openssh_key(ctx, session, + ntdata, data_len + 1, pwd); + +cleanup: + + mbedtls_pk_free(&pkey); + + _libssh2_mbedtls_safe_free(ntdata, data_len); + + return (*ctx == NULL) ? -1 : 0; +} + +static unsigned char * +_libssh2_mbedtls_mpi_write_binary(unsigned char *buf, + const mbedtls_mpi *mpi, + size_t bytes) +{ + unsigned char *p = buf; + + if(sizeof(&p) / sizeof(p[0]) < 4) { + goto done; + } + + p += 4; + *p = 0; + + if(bytes > 0) { + mbedtls_mpi_write_binary(mpi, p + 1, bytes - 1); + } + + if(bytes > 0 && !(*(p + 1) & 0x80)) { + memmove(p, p + 1, --bytes); + } + + _libssh2_htonu32(p - 4, bytes); + +done: + + return p + bytes; +} + +/* _libssh2_ecdsa_sign + * + * Computes the ECDSA signature of a previously-hashed message + * + */ + +int +_libssh2_mbedtls_ecdsa_sign(LIBSSH2_SESSION *session, + libssh2_ecdsa_ctx *ctx, + const unsigned char *hash, + unsigned long hash_len, + unsigned char **sign, + size_t *sign_len) +{ + size_t r_len, s_len, tmp_sign_len = 0; + unsigned char *sp, *tmp_sign = NULL; + mbedtls_mpi pr, ps; + + mbedtls_mpi_init(&pr); + mbedtls_mpi_init(&ps); + + if(mbedtls_ecdsa_sign(&ctx->grp, &pr, &ps, &ctx->d, + hash, hash_len, + mbedtls_ctr_drbg_random, + &_libssh2_mbedtls_ctr_drbg) != 0) + goto cleanup; + + r_len = mbedtls_mpi_size(&pr) + 1; + s_len = mbedtls_mpi_size(&ps) + 1; + tmp_sign_len = r_len + s_len + 8; + + tmp_sign = LIBSSH2_CALLOC(session, tmp_sign_len); + + if(tmp_sign == NULL) + goto cleanup; + + sp = tmp_sign; + sp = _libssh2_mbedtls_mpi_write_binary(sp, &pr, r_len); + sp = _libssh2_mbedtls_mpi_write_binary(sp, &ps, s_len); + + *sign_len = (size_t)(sp - tmp_sign); + + *sign = LIBSSH2_CALLOC(session, *sign_len); + + if(*sign == NULL) + goto cleanup; + + memcpy(*sign, tmp_sign, *sign_len); + +cleanup: + + mbedtls_mpi_free(&pr); + mbedtls_mpi_free(&ps); + + _libssh2_mbedtls_safe_free(tmp_sign, tmp_sign_len); + + return (*sign == NULL) ? -1 : 0; +} + +/* _libssh2_ecdsa_get_curve_type + * + * returns key curve type that maps to libssh2_curve_type + * + */ + +libssh2_curve_type +_libssh2_mbedtls_ecdsa_get_curve_type(libssh2_ecdsa_ctx *ctx) +{ + return (libssh2_curve_type) ctx->grp.id; +} + +/* _libssh2_ecdsa_curve_type_from_name + * + * returns 0 for success, key curve type that maps to libssh2_curve_type + * + */ + +int +_libssh2_mbedtls_ecdsa_curve_type_from_name(const char *name, + libssh2_curve_type *out_type) +{ + int ret = 0; + libssh2_curve_type type; + + if(name == NULL || strlen(name) != 19) + return -1; + + if(strcmp(name, "ecdsa-sha2-nistp256") == 0) + type = LIBSSH2_EC_CURVE_NISTP256; + else if(strcmp(name, "ecdsa-sha2-nistp384") == 0) + type = LIBSSH2_EC_CURVE_NISTP384; + else if(strcmp(name, "ecdsa-sha2-nistp521") == 0) + type = LIBSSH2_EC_CURVE_NISTP521; + else { + ret = -1; + } + + if(ret == 0 && out_type) { + *out_type = type; + } + + return ret; +} + +void +_libssh2_mbedtls_ecdsa_free(libssh2_ecdsa_ctx *ctx) +{ + mbedtls_ecdsa_free(ctx); + mbedtls_free(ctx); +} + +#endif /* LIBSSH2_ECDSA */ #endif /* LIBSSH2_MBEDTLS */ diff --git a/vendor/libssh2/src/mbedtls.h b/vendor/libssh2/src/mbedtls.h index 88b0e54d6..671932c58 100644 --- a/vendor/libssh2/src/mbedtls.h +++ b/vendor/libssh2/src/mbedtls.h @@ -1,3 +1,5 @@ +#ifndef __LIBSSH2_MBEDTLS_H +#define __LIBSSH2_MBEDTLS_H /* Copyright (c) 2016, Art * All rights reserved. * @@ -43,6 +45,12 @@ #include #include #include +#ifdef MBEDTLS_ECDH_C +# include +#endif +#ifdef MBEDTLS_ECDSA_C +# include +#endif #include #include #include @@ -64,7 +72,11 @@ #define LIBSSH2_RSA 1 #define LIBSSH2_DSA 0 -#define LIBSSH2_ECDSA 0 +#ifdef MBEDTLS_ECDSA_C +# define LIBSSH2_ECDSA 1 +#else +# define LIBSSH2_ECDSA 0 +#endif #define LIBSSH2_ED25519 0 #define MD5_DIGEST_LENGTH 16 @@ -75,10 +87,6 @@ #define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) -#if LIBSSH2_ECDSA -#else -#define _libssh2_ec_key void -#endif /*******************************************************************/ /* @@ -208,9 +216,10 @@ #define libssh2_md5(data, datalen, hash) \ _libssh2_mbedtls_hash(data, datalen, MBEDTLS_MD_MD5, hash) + /*******************************************************************/ /* - * mbedTLS backend: RSA structure + * mbedTLS backend: RSA functions */ #define libssh2_rsa_ctx mbedtls_rsa_context @@ -239,6 +248,82 @@ #define _libssh2_rsa_free(rsactx) \ _libssh2_mbedtls_rsa_free(rsactx) + +/*******************************************************************/ +/* + * mbedTLS backend: ECDSA structures + */ + +#if LIBSSH2_ECDSA + +typedef enum { +#ifdef MBEDTLS_ECP_DP_SECP256R1_ENABLED + LIBSSH2_EC_CURVE_NISTP256 = MBEDTLS_ECP_DP_SECP256R1, +#else + LIBSSH2_EC_CURVE_NISTP256 = MBEDTLS_ECP_DP_NONE, +#endif +#ifdef MBEDTLS_ECP_DP_SECP384R1_ENABLED + LIBSSH2_EC_CURVE_NISTP384 = MBEDTLS_ECP_DP_SECP384R1, +#else + LIBSSH2_EC_CURVE_NISTP384 = MBEDTLS_ECP_DP_NONE, +#endif +#ifdef MBEDTLS_ECP_DP_SECP521R1_ENABLED + LIBSSH2_EC_CURVE_NISTP521 = MBEDTLS_ECP_DP_SECP521R1 +#else + LIBSSH2_EC_CURVE_NISTP521 = MBEDTLS_ECP_DP_NONE, +#endif +} libssh2_curve_type; + +# define _libssh2_ec_key mbedtls_ecp_keypair +#else +# define _libssh2_ec_key void +#endif /* LIBSSH2_ECDSA */ + + +/*******************************************************************/ +/* + * mbedTLS backend: ECDSA functions + */ + +#if LIBSSH2_ECDSA + +#define libssh2_ecdsa_ctx mbedtls_ecdsa_context + +#define _libssh2_ecdsa_create_key(session, privkey, pubkey_octal, \ + pubkey_octal_len, curve) \ + _libssh2_mbedtls_ecdsa_create_key(session, privkey, pubkey_octal, \ + pubkey_octal_len, curve) + +#define _libssh2_ecdsa_curve_name_with_octal_new(ctx, k, k_len, curve) \ + _libssh2_mbedtls_ecdsa_curve_name_with_octal_new(ctx, k, k_len, curve) + +#define _libssh2_ecdh_gen_k(k, privkey, server_pubkey, server_pubkey_len) \ + _libssh2_mbedtls_ecdh_gen_k(k, privkey, server_pubkey, server_pubkey_len) + +#define _libssh2_ecdsa_verify(ctx, r, r_len, s, s_len, m, m_len) \ + _libssh2_mbedtls_ecdsa_verify(ctx, r, r_len, s, s_len, m, m_len) + +#define _libssh2_ecdsa_new_private(ctx, session, filename, passphrase) \ + _libssh2_mbedtls_ecdsa_new_private(ctx, session, filename, passphrase) + +#define _libssh2_ecdsa_new_private_frommemory(ctx, session, filedata, \ + filedata_len, passphrase) \ + _libssh2_mbedtls_ecdsa_new_private_frommemory(ctx, session, filedata, \ + filedata_len, passphrase) + +#define _libssh2_ecdsa_sign(session, ctx, hash, hash_len, sign, sign_len) \ + _libssh2_mbedtls_ecdsa_sign(session, ctx, hash, hash_len, sign, sign_len) + +#define _libssh2_ecdsa_get_curve_type(ctx) \ + _libssh2_mbedtls_ecdsa_get_curve_type(ctx) + +#define _libssh2_ecdsa_free(ctx) \ + _libssh2_mbedtls_ecdsa_free(ctx) + +#endif /* LIBSSH2_ECDSA */ + + +/*******************************************************************/ /* * mbedTLS backend: Key functions */ @@ -251,10 +336,11 @@ pk, pk_len, pw) - /*******************************************************************/ +/*******************************************************************/ /* * mbedTLS backend: Cipher Context structure */ + #define _libssh2_cipher_ctx mbedtls_cipher_context_t #define _libssh2_cipher_type(algo) mbedtls_cipher_type_t algo @@ -270,6 +356,8 @@ #define _libssh2_cipher_cast5 MBEDTLS_CIPHER_NULL #define _libssh2_cipher_3des MBEDTLS_CIPHER_DES_EDE3_CBC + +/*******************************************************************/ /* * mbedTLS backend: Cipher functions */ @@ -329,6 +417,7 @@ /* * mbedTLS backend: forward declarations */ + void _libssh2_mbedtls_init(void); @@ -434,6 +523,54 @@ _libssh2_mbedtls_pub_priv_keyfilememory(LIBSSH2_SESSION *session, const char *privatekeydata, size_t privatekeydata_len, const char *passphrase); +#if LIBSSH2_ECDSA +int +_libssh2_mbedtls_ecdsa_create_key(LIBSSH2_SESSION *session, + _libssh2_ec_key **privkey, + unsigned char **pubkey_octal, + size_t *pubkey_octal_len, + libssh2_curve_type curve); +int +_libssh2_mbedtls_ecdsa_curve_name_with_octal_new(libssh2_ecdsa_ctx **ctx, + const unsigned char *k, + size_t k_len, + libssh2_curve_type curve); +int +_libssh2_mbedtls_ecdh_gen_k(_libssh2_bn **k, + _libssh2_ec_key *privkey, + const unsigned char *server_pubkey, + size_t server_pubkey_len); +int +_libssh2_mbedtls_ecdsa_verify(libssh2_ecdsa_ctx *ctx, + const unsigned char *r, size_t r_len, + const unsigned char *s, size_t s_len, + const unsigned char *m, size_t m_len); +int +_libssh2_mbedtls_ecdsa_new_private(libssh2_ecdsa_ctx **ctx, + LIBSSH2_SESSION *session, + const char *filename, + const unsigned char *passphrase); +int +_libssh2_mbedtls_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx **ctx, + LIBSSH2_SESSION *session, + const char *filedata, + size_t filedata_len, + const unsigned char *passphrase); +int +_libssh2_mbedtls_ecdsa_sign(LIBSSH2_SESSION *session, + libssh2_ecdsa_ctx *ctx, + const unsigned char *hash, + unsigned long hash_len, + unsigned char **signature, + size_t *signature_len); +libssh2_curve_type +_libssh2_mbedtls_ecdsa_key_get_curve_type(libssh2_ecdsa_ctx *ctx); +int +_libssh2_mbedtls_ecdsa_curve_type_from_name(const char *name, + libssh2_curve_type *type); +void +_libssh2_mbedtls_ecdsa_free(libssh2_ecdsa_ctx *ctx); +#endif /* LIBSSH2_ECDSA */ extern void _libssh2_dh_init(_libssh2_dh_ctx *dhctx); @@ -445,3 +582,5 @@ _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, _libssh2_bn *f, _libssh2_bn *p); extern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); + +#endif /* __LIBSSH2_MBEDTLS_H */ diff --git a/vendor/libssh2/src/misc.c b/vendor/libssh2/src/misc.c index bd084c854..594b2d1f7 100644 --- a/vendor/libssh2/src/misc.c +++ b/vendor/libssh2/src/misc.c @@ -141,19 +141,16 @@ _libssh2_recv(libssh2_socket_t sock, void *buffer, size_t length, #ifdef WIN32 if(rc < 0) return -wsa2errno(); -#elif defined(__VMS) - if(rc < 0) { - if(errno == EWOULDBLOCK) - return -EAGAIN; - else - return -errno; - } #else if(rc < 0) { /* Sometimes the first recv() function call sets errno to ENOENT on Solaris and HP-UX */ if(errno == ENOENT) return -EAGAIN; +#ifdef EWOULDBLOCK /* For VMS and other special unixes */ + else if(errno == EWOULDBLOCK) + return -EAGAIN; +#endif else return -errno; } @@ -177,16 +174,14 @@ _libssh2_send(libssh2_socket_t sock, const void *buffer, size_t length, #ifdef WIN32 if(rc < 0) return -wsa2errno(); -#elif defined(__VMS) +#else if(rc < 0) { - if(errno == EWOULDBLOCK) - return -EAGAIN; - else - return -errno; +#ifdef EWOULDBLOCK /* For VMS and other special unixes */ + if(errno == EWOULDBLOCK) + return -EAGAIN; +#endif + return -errno; } -#else - if(rc < 0) - return -errno; #endif return rc; } @@ -196,7 +191,10 @@ _libssh2_send(libssh2_socket_t sock, const void *buffer, size_t length, unsigned int _libssh2_ntohu32(const unsigned char *buf) { - return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; + return (((unsigned int)buf[0] << 24) + | ((unsigned int)buf[1] << 16) + | ((unsigned int)buf[2] << 8) + | ((unsigned int)buf[3])); } diff --git a/vendor/libssh2/src/openssl.c b/vendor/libssh2/src/openssl.c index 04d5ec2ff..7a6810f13 100644 --- a/vendor/libssh2/src/openssl.c +++ b/vendor/libssh2/src/openssl.c @@ -259,16 +259,16 @@ _libssh2_dsa_sha1_verify(libssh2_dsa_ctx * dsactx, #if LIBSSH2_ECDSA -/* _libssh2_ecdsa_key_get_curve_type +/* _libssh2_ecdsa_get_curve_type * * returns key curve type that maps to libssh2_curve_type * */ libssh2_curve_type -_libssh2_ecdsa_key_get_curve_type(_libssh2_ec_key *key) +_libssh2_ecdsa_get_curve_type(libssh2_ecdsa_ctx *ec_ctx) { - const EC_GROUP *group = EC_KEY_get0_group(key); + const EC_GROUP *group = EC_KEY_get0_group(ec_ctx); return EC_GROUP_get_curve_name(group); } @@ -355,7 +355,7 @@ _libssh2_ecdsa_verify(libssh2_ecdsa_ctx * ctx, { int ret = 0; EC_KEY *ec_key = (EC_KEY*)ctx; - libssh2_curve_type type = _libssh2_ecdsa_key_get_curve_type(ec_key); + libssh2_curve_type type = _libssh2_ecdsa_get_curve_type(ec_key); #ifdef HAVE_OPAQUE_STRUCTS ECDSA_SIG *ecdsa_sig = ECDSA_SIG_new(); @@ -427,10 +427,19 @@ _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx, #else ret = EVP_Cipher(ctx, buf, block, blocksize); #endif +#if defined(OPENSSL_VERSION_MAJOR) && OPENSSL_VERSION_MAJOR >= 3 + if(ret != -1) { +#else if(ret == 1) { +#endif memcpy(block, buf, blocksize); } + +#if defined(OPENSSL_VERSION_MAJOR) && OPENSSL_VERSION_MAJOR >= 3 + return ret != -1 ? 0 : 1; +#else return ret == 1 ? 0 : 1; +#endif } #if LIBSSH2_AES_CTR && !defined(HAVE_EVP_AES_128_CTR) @@ -445,6 +454,10 @@ typedef struct unsigned char ctr[AES_BLOCK_SIZE]; } aes_ctr_ctx; +static EVP_CIPHER * aes_128_ctr_cipher = NULL; +static EVP_CIPHER * aes_192_ctr_cipher = NULL; +static EVP_CIPHER * aes_256_ctr_cipher = NULL; + static int aes_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc) /* init key */ @@ -589,14 +602,16 @@ const EVP_CIPHER * _libssh2_EVP_aes_128_ctr(void) { #ifdef HAVE_OPAQUE_STRUCTS - static EVP_CIPHER * aes_ctr_cipher; - return !aes_ctr_cipher ? - make_ctr_evp(16, &aes_ctr_cipher, NID_aes_128_ctr) : aes_ctr_cipher; + return !aes_128_ctr_cipher ? + make_ctr_evp(16, &aes_128_ctr_cipher, NID_aes_128_ctr) : + aes_128_ctr_cipher; #else static EVP_CIPHER aes_ctr_cipher; - static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher; - return !aes_ctr_cipher.key_len ? - make_ctr_evp(16, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher; + if(!aes_128_ctr_cipher) { + aes_128_ctr_cipher = &aes_ctr_cipher; + make_ctr_evp(16, &aes_128_ctr_cipher, 0); + } + return aes_128_ctr_cipher; #endif } @@ -604,14 +619,16 @@ const EVP_CIPHER * _libssh2_EVP_aes_192_ctr(void) { #ifdef HAVE_OPAQUE_STRUCTS - static EVP_CIPHER * aes_ctr_cipher; - return !aes_ctr_cipher ? - make_ctr_evp(24, &aes_ctr_cipher, NID_aes_192_ctr) : aes_ctr_cipher; + return !aes_192_ctr_cipher ? + make_ctr_evp(24, &aes_192_ctr_cipher, NID_aes_192_ctr) : + aes_192_ctr_cipher; #else static EVP_CIPHER aes_ctr_cipher; - static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher; - return !aes_ctr_cipher.key_len ? - make_ctr_evp(24, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher; + if(!aes_192_ctr_cipher) { + aes_192_ctr_cipher = &aes_ctr_cipher; + make_ctr_evp(24, &aes_192_ctr_cipher, 0); + } + return aes_192_ctr_cipher; #endif } @@ -619,24 +636,20 @@ const EVP_CIPHER * _libssh2_EVP_aes_256_ctr(void) { #ifdef HAVE_OPAQUE_STRUCTS - static EVP_CIPHER * aes_ctr_cipher; - return !aes_ctr_cipher ? - make_ctr_evp(32, &aes_ctr_cipher, NID_aes_256_ctr) : aes_ctr_cipher; + return !aes_256_ctr_cipher ? + make_ctr_evp(32, &aes_256_ctr_cipher, NID_aes_256_ctr) : + aes_256_ctr_cipher; #else static EVP_CIPHER aes_ctr_cipher; - static EVP_CIPHER * aes_ctr_cipher_ptr = &aes_ctr_cipher; - return !aes_ctr_cipher.key_len ? - make_ctr_evp(32, &aes_ctr_cipher_ptr, 0) : &aes_ctr_cipher; + if(!aes_256_ctr_cipher) { + aes_256_ctr_cipher = &aes_ctr_cipher; + make_ctr_evp(32, &aes_256_ctr_cipher, 0); + } + return aes_256_ctr_cipher; #endif } -#endif /* LIBSSH2_AES_CTR */ - -#ifndef HAVE_EVP_AES_128_CTR -static EVP_CIPHER * aes_128_ctr_cipher = NULL; -static EVP_CIPHER * aes_192_ctr_cipher = NULL; -static EVP_CIPHER * aes_256_ctr_cipher = NULL; -#endif +#endif /* LIBSSH2_AES_CTR && !defined(HAVE_EVP_AES_128_CTR) */ void _libssh2_openssl_crypto_init(void) { @@ -655,16 +668,16 @@ void _libssh2_openssl_crypto_init(void) ENGINE_register_all_complete(); #endif #endif -#ifndef HAVE_EVP_AES_128_CTR - aes_128_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_128_ctr(); - aes_192_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_192_ctr(); - aes_256_ctr_cipher = (EVP_CIPHER *)_libssh2_EVP_aes_256_ctr(); +#if LIBSSH2_AES_CTR && !defined(HAVE_EVP_AES_128_CTR) + aes_128_ctr_cipher = (EVP_CIPHER *) _libssh2_EVP_aes_128_ctr(); + aes_192_ctr_cipher = (EVP_CIPHER *) _libssh2_EVP_aes_192_ctr(); + aes_256_ctr_cipher = (EVP_CIPHER *) _libssh2_EVP_aes_256_ctr(); #endif } void _libssh2_openssl_crypto_exit(void) { -#ifndef HAVE_EVP_AES_128_CTR +#if LIBSSH2_AES_CTR && !defined(HAVE_EVP_AES_128_CTR) #ifdef HAVE_OPAQUE_STRUCTS if(aes_128_ctr_cipher) { EVP_CIPHER_meth_free(aes_128_ctr_cipher); @@ -762,7 +775,6 @@ _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa, pem_read_bio_func read_rsa = (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey; - (void) session; _libssh2_init_if_needed(); @@ -834,7 +846,7 @@ gen_publickey_from_rsa_evp(LIBSSH2_SESSION *session, _libssh2_debug(session, LIBSSH2_TRACE_AUTH, - "Computing public key from RSA private key envelop"); + "Computing public key from RSA private key envelope"); rsa = EVP_PKEY_get1_RSA(pk); if(rsa == NULL) { @@ -1113,7 +1125,6 @@ _libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa, pem_read_bio_func read_rsa = (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey; - (void) session; _libssh2_init_if_needed(); @@ -1139,7 +1150,6 @@ _libssh2_dsa_new_private_frommemory(libssh2_dsa_ctx ** dsa, pem_read_bio_func read_dsa = (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey; - (void) session; _libssh2_init_if_needed(); @@ -1225,7 +1235,7 @@ gen_publickey_from_dsa_evp(LIBSSH2_SESSION *session, _libssh2_debug(session, LIBSSH2_TRACE_AUTH, - "Computing public key from DSA private key envelop"); + "Computing public key from DSA private key envelope"); dsa = EVP_PKEY_get1_DSA(pk); if(dsa == NULL) { @@ -1415,7 +1425,6 @@ _libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa, pem_read_bio_func read_dsa = (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey; - (void) session; _libssh2_init_if_needed(); @@ -1444,7 +1453,6 @@ _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx, pem_read_bio_func read_ec = (pem_read_bio_func) &PEM_read_bio_ECPrivateKey; - (void) session; _libssh2_init_if_needed(); @@ -1466,89 +1474,53 @@ _libssh2_ecdsa_new_private_frommemory(libssh2_ecdsa_ctx ** ec_ctx, #if LIBSSH2_ED25519 int -_libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_x25519_ctx **out_ctx, +_libssh2_curve25519_new(LIBSSH2_SESSION *session, unsigned char **out_public_key, unsigned char **out_private_key) { EVP_PKEY *key = NULL; EVP_PKEY_CTX *pctx = NULL; - PKCS8_PRIV_KEY_INFO *info = NULL; - ASN1_OCTET_STRING *oct = NULL; - X509_PUBKEY *pubkey = NULL; - libssh2_ed25519_ctx *ctx = NULL; - const unsigned char *pkcs, *priv, *pub; - int privLen, pubLen, pkcsLen; + unsigned char *priv = NULL, *pub = NULL; + size_t privLen, pubLen; int rc = -1; pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_X25519, NULL); if(pctx == NULL) return -1; - EVP_PKEY_keygen_init(pctx); - EVP_PKEY_keygen(pctx, &key); - info = EVP_PKEY2PKCS8(key); - - if(info == NULL || !PKCS8_pkey_get0(NULL, &pkcs, &pkcsLen, NULL, info)) - goto cleanExit; - - oct = d2i_ASN1_OCTET_STRING(NULL, &pkcs, pkcsLen); - if(oct == NULL) { + if(EVP_PKEY_keygen_init(pctx) != 1 || + EVP_PKEY_keygen(pctx, &key) != 1) { goto cleanExit; } - priv = ASN1_STRING_get0_data(oct); - privLen = ASN1_STRING_length(oct); - - if(privLen != LIBSSH2_ED25519_KEY_LEN) - goto cleanExit; - - pubkey = X509_PUBKEY_new(); - if(pubkey == NULL || !X509_PUBKEY_set(&pubkey, key)) - goto cleanExit; - - if(!X509_PUBKEY_get0_param(NULL, &pub, &pubLen, NULL, pubkey)) - goto cleanExit; - - if(pubLen != LIBSSH2_ED25519_KEY_LEN) - goto cleanExit; - if(out_private_key != NULL) { - *out_private_key = LIBSSH2_ALLOC(session, LIBSSH2_ED25519_KEY_LEN); - if(*out_private_key == NULL) + privLen = LIBSSH2_ED25519_KEY_LEN; + priv = LIBSSH2_ALLOC(session, privLen); + if(priv == NULL) goto cleanExit; - memcpy(*out_private_key, priv, LIBSSH2_ED25519_KEY_LEN); - } - - if(out_public_key != NULL) { - *out_public_key = LIBSSH2_ALLOC(session, LIBSSH2_ED25519_KEY_LEN); - if(*out_public_key == NULL) + if(EVP_PKEY_get_raw_private_key(key, priv, &privLen) != 1 || + privLen != LIBSSH2_ED25519_KEY_LEN) { goto cleanExit; + } - memcpy(*out_public_key, pub, LIBSSH2_ED25519_KEY_LEN); + *out_private_key = priv; + priv = NULL; } - if(out_ctx != NULL) { - ctx = malloc(sizeof(libssh2_x25519_ctx)); - if(ctx == NULL) + if(out_public_key != NULL) { + pubLen = LIBSSH2_ED25519_KEY_LEN; + pub = LIBSSH2_ALLOC(session, pubLen); + if(pub == NULL) goto cleanExit; - ctx->private_key = - EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, - (const unsigned char *)priv, - LIBSSH2_ED25519_KEY_LEN); - - ctx->public_key = - EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL, - (const unsigned char *)pub, - LIBSSH2_ED25519_KEY_LEN); - - if(ctx->public_key == NULL || ctx->private_key == NULL) { - _libssh2_x25519_free(ctx); + if(EVP_PKEY_get_raw_public_key(key, pub, &pubLen) != 1 || + pubLen != LIBSSH2_ED25519_KEY_LEN) { goto cleanExit; } - *out_ctx = ctx; + *out_public_key = pub; + pub = NULL; } /* success */ @@ -1556,20 +1528,84 @@ _libssh2_curve25519_new(LIBSSH2_SESSION *session, libssh2_x25519_ctx **out_ctx, cleanExit: - if(info) - PKCS8_PRIV_KEY_INFO_free(info); if(pctx) EVP_PKEY_CTX_free(pctx); - if(oct) - ASN1_OCTET_STRING_free(oct); - if(pubkey) - X509_PUBKEY_free(pubkey); if(key) EVP_PKEY_free(key); + if(priv) + LIBSSH2_FREE(session, priv); + if(pub) + LIBSSH2_FREE(session, pub); return rc; } + +static int +gen_publickey_from_ed_evp(LIBSSH2_SESSION *session, + unsigned char **method, + size_t *method_len, + unsigned char **pubkeydata, + size_t *pubkeydata_len, + EVP_PKEY *pk) +{ + const char methodName[] = "ssh-ed25519"; + unsigned char *methodBuf = NULL; + size_t rawKeyLen = 0; + unsigned char *keyBuf = NULL; + size_t bufLen = 0; + unsigned char *bufPos = NULL; + + _libssh2_debug(session, LIBSSH2_TRACE_AUTH, + "Computing public key from ED private key envelope"); + + methodBuf = LIBSSH2_ALLOC(session, sizeof(methodName) - 1); + if(!methodBuf) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); + goto fail; + } + memcpy(methodBuf, methodName, sizeof(methodName) - 1); + + if(EVP_PKEY_get_raw_public_key(pk, NULL, &rawKeyLen) != 1) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "EVP_PKEY_get_raw_public_key failed"); + goto fail; + } + + /* Key form is: type_len(4) + type(11) + pub_key_len(4) + pub_key(32). */ + bufLen = 4 + sizeof(methodName) - 1 + 4 + rawKeyLen; + bufPos = keyBuf = LIBSSH2_ALLOC(session, bufLen); + if(!keyBuf) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); + goto fail; + } + + _libssh2_store_str(&bufPos, methodName, sizeof(methodName) - 1); + _libssh2_store_u32(&bufPos, rawKeyLen); + + if(EVP_PKEY_get_raw_public_key(pk, bufPos, &rawKeyLen) != 1) { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "EVP_PKEY_get_raw_public_key failed"); + goto fail; + } + + *method = methodBuf; + *method_len = sizeof(methodName) - 1; + *pubkeydata = keyBuf; + *pubkeydata_len = bufLen; + return 0; + +fail: + if(methodBuf) + LIBSSH2_FREE(session, methodBuf); + if(keyBuf) + LIBSSH2_FREE(session, keyBuf); + return -1; +} + + static int gen_publickey_from_ed25519_openssh_priv_data(LIBSSH2_SESSION *session, struct string_buf *decrypted, @@ -1606,25 +1642,11 @@ gen_publickey_from_ed25519_openssh_priv_data(LIBSSH2_SESSION *session, goto clean_exit; } - ctx = _libssh2_ed25519_new_ctx(); - if(ctx == NULL) { - _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for ed25519 key"); - ret = -1; - goto clean_exit; - } - /* first 32 bytes of priv_key is the private key, the last 32 bytes are the public key */ - ctx->private_key = - EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, - (const unsigned char *)priv_key, - LIBSSH2_ED25519_KEY_LEN); - - ctx->public_key = - EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL, - (const unsigned char *)pub_key, - LIBSSH2_ED25519_KEY_LEN); + ctx = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, + (const unsigned char *)priv_key, + LIBSSH2_ED25519_KEY_LEN); /* comment */ if(_libssh2_get_string(decrypted, &buf, &tmp_len)) { @@ -1664,10 +1686,12 @@ gen_publickey_from_ed25519_openssh_priv_data(LIBSSH2_SESSION *session, _libssh2_debug(session, LIBSSH2_TRACE_AUTH, "Computing public key from ED25519 " - "private key envelop"); + "private key envelope"); method_buf = LIBSSH2_ALLOC(session, 11); /* ssh-ed25519. */ if(method_buf == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for ED25519 key"); goto clean_exit; } @@ -1676,6 +1700,8 @@ gen_publickey_from_ed25519_openssh_priv_data(LIBSSH2_SESSION *session, key_len = LIBSSH2_ED25519_KEY_LEN + 19; key = LIBSSH2_CALLOC(session, key_len); if(key == NULL) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for ED25519 key"); goto clean_exit; } @@ -1798,6 +1824,24 @@ _libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx ** ed_ctx, size_t filedata_len, unsigned const char *passphrase) { + libssh2_ed25519_ctx *ctx = NULL; + + _libssh2_init_if_needed(); + + if(read_private_key_from_memory((void **)&ctx, + (pem_read_bio_func) + &PEM_read_bio_PrivateKey, + filedata, filedata_len, passphrase) == 0) { + if(EVP_PKEY_id(ctx) != EVP_PKEY_ED25519) { + _libssh2_ed25519_free(ctx); + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Private key is not an ED25519 key"); + } + + *ed_ctx = ctx; + return 0; + } + return read_openssh_private_key_from_memory((void **)ed_ctx, session, "ssh-ed25519", filedata, filedata_len, @@ -1811,38 +1855,26 @@ _libssh2_ed25519_new_public(libssh2_ed25519_ctx ** ed_ctx, const uint8_t key_len) { libssh2_ed25519_ctx *ctx = NULL; - EVP_PKEY *public_key = NULL; if(ed_ctx == NULL) return -1; - public_key = - EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL, - (const unsigned char *)raw_pub_key, - key_len); - if(public_key == NULL) { + ctx = EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL, + raw_pub_key, key_len); + if(!ctx) return _libssh2_error(session, LIBSSH2_ERROR_PROTO, "could not create ED25519 public key"); - } - - ctx = _libssh2_ed25519_new_ctx(); - if(ctx == NULL) { - return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, - "could not alloc public/private key"); - } - - ctx->public_key = public_key; if(ed_ctx != NULL) *ed_ctx = ctx; - else if(ctx != NULL) + else if(ctx) _libssh2_ed25519_free(ctx); return 0; } - #endif /* LIBSSH2_ED25519 */ + int _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, libssh2_rsa_ctx * rsactx, @@ -2193,6 +2225,19 @@ _libssh2_sha512(const unsigned char *message, unsigned long len, int _libssh2_md5_init(libssh2_md5_ctx *ctx) { + /* MD5 digest is not supported in OpenSSL FIPS mode + * Trying to init it will result in a latent OpenSSL error: + * "digital envelope routines:FIPS_DIGESTINIT:disabled for fips" + * So, just return 0 in FIPS mode + */ +#if OPENSSL_VERSION_NUMBER >= 0x000907000L && \ + defined(OPENSSL_VERSION_MAJOR) && \ + OPENSSL_VERSION_MAJOR < 3 && \ + !defined(LIBRESSL_VERSION_NUMBER) + if(FIPS_mode() != 0) + return 0; +#endif + #ifdef HAVE_OPAQUE_STRUCTS *ctx = EVP_MD_CTX_new(); @@ -2237,7 +2282,7 @@ gen_publickey_from_ec_evp(LIBSSH2_SESSION *session, _libssh2_debug(session, LIBSSH2_TRACE_AUTH, - "Computing public key from EC private key envelop"); + "Computing public key from EC private key envelope"); bn_ctx = BN_CTX_new(); if(bn_ctx == NULL) @@ -2251,7 +2296,7 @@ gen_publickey_from_ec_evp(LIBSSH2_SESSION *session, public_key = EC_KEY_get0_public_key(ec); group = EC_KEY_get0_group(ec); - type = _libssh2_ecdsa_key_get_curve_type(ec); + type = _libssh2_ecdsa_get_curve_type(ec); method_buf = LIBSSH2_ALLOC(session, 19); if(method_buf == NULL) { @@ -2383,6 +2428,7 @@ gen_publickey_from_ecdsa_openssh_priv_data(LIBSSH2_SESSION *session, if((rc = _libssh2_ecdsa_curve_name_with_octal_new(&ec_key, point_buf, pointlen, curve_type)) != 0) { + rc = -1; _libssh2_error(session, LIBSSH2_ERROR_PROTO, "ECDSA could not create key"); goto fail; @@ -2391,6 +2437,8 @@ gen_publickey_from_ecdsa_openssh_priv_data(LIBSSH2_SESSION *session, bn_exponent = BN_new(); if(bn_exponent == NULL) { rc = -1; + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for private key data"); goto fail; } @@ -2417,15 +2465,10 @@ gen_publickey_from_ecdsa_openssh_priv_data(LIBSSH2_SESSION *session, return rc; fail: - if(ec_key != NULL) EC_KEY_free(ec_key); - return _libssh2_error(session, - LIBSSH2_ERROR_ALLOC, - "Unable to allocate memory for private key data"); - - + return rc; } static int @@ -2495,7 +2538,6 @@ _libssh2_ecdsa_new_private(libssh2_ecdsa_ctx ** ec_ctx, int rc; pem_read_bio_func read_ec = (pem_read_bio_func) &PEM_read_bio_ECPrivateKey; - (void) session; _libssh2_init_if_needed(); @@ -2668,7 +2710,7 @@ _libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session, unsigned char *sig = NULL; if(md_ctx != NULL) { - if(EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, ctx->private_key) != 1) + if(EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, ctx) != 1) goto clean_exit; if(EVP_DigestSign(md_ctx, NULL, &sig_len, message, message_len) != 1) goto clean_exit; @@ -2785,7 +2827,7 @@ _libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s, if(NULL == md_ctx) return -1; - ret = EVP_DigestVerifyInit(md_ctx, NULL, NULL, NULL, ctx->public_key); + ret = EVP_DigestVerifyInit(md_ctx, NULL, NULL, NULL, ctx); if(ret != 1) goto clean_exit; @@ -2962,6 +3004,12 @@ _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, #endif switch(pktype) { +#if LIBSSH2_ED25519 + case EVP_PKEY_ED25519 : + st = gen_publickey_from_ed_evp( + session, method, method_len, pubkeydata, pubkeydata_len, pk); + break; +#endif /* LIBSSH2_ED25519 */ case EVP_PKEY_RSA : st = gen_publickey_from_rsa_evp( session, method, method_len, pubkeydata, pubkeydata_len, pk); @@ -3013,17 +3061,13 @@ _libssh2_pub_priv_openssh_keyfilememory(LIBSSH2_SESSION *session, if(key_ctx != NULL) *key_ctx = NULL; - if(session == NULL) { - _libssh2_error(session, LIBSSH2_ERROR_PROTO, - "Session is required"); - return -1; - } + if(session == NULL) + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Session is required"); - if(key_type != NULL && (strlen(key_type) > 11 || strlen(key_type) < 7)) { - _libssh2_error(session, LIBSSH2_ERROR_PROTO, - "type is invalid"); - return -1; - } + if(key_type != NULL && (strlen(key_type) > 11 || strlen(key_type) < 7)) + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "type is invalid"); _libssh2_init_if_needed(); @@ -3031,20 +3075,18 @@ _libssh2_pub_priv_openssh_keyfilememory(LIBSSH2_SESSION *session, privatekeydata, privatekeydata_len, &decrypted); - if(rc) { + if(rc) return rc; - } /* We have a new key file, now try and parse it using supported types */ rc = _libssh2_get_string(decrypted, &buf, NULL); - if(rc != 0 || buf == NULL) { - _libssh2_error(session, LIBSSH2_ERROR_PROTO, - "Public key type in decrypted key data not found"); - return -1; - } + if(rc != 0 || buf == NULL) + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Public key type in decrypted " + "key data not found"); - rc = -1; + rc = LIBSSH2_ERROR_FILE; #if LIBSSH2_ED25519 if(strcmp("ssh-ed25519", (const char *)buf) == 0) { @@ -3098,6 +3140,11 @@ _libssh2_pub_priv_openssh_keyfilememory(LIBSSH2_SESSION *session, } #endif + if(rc == LIBSSH2_ERROR_FILE) + rc = _libssh2_error(session, LIBSSH2_ERROR_FILE, + "Unable to extract public key from private key file: " + "invalid/unrecognized private key file format"); + if(decrypted) _libssh2_string_buf_free(session, decrypted); @@ -3137,10 +3184,10 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, "Computing public key from private key."); bp = BIO_new_mem_buf((char *)privatekeydata, privatekeydata_len); - if(!bp) { - return -1; - } - + if(!bp) + return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory when" + "computing public key"); BIO_reset(bp); pk = PEM_read_bio_PrivateKey(bp, NULL, NULL, (void *)passphrase); BIO_free(bp); @@ -3155,15 +3202,8 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, privatekeydata, privatekeydata_len, (unsigned const char *)passphrase); - if(st != 0) { - return _libssh2_error(session, - LIBSSH2_ERROR_FILE, - "Unable to extract public key " - "from private key file: " - "Wrong passphrase or invalid/unrecognized " - "private key file format"); - } - + if(st != 0) + return st; return 0; } @@ -3174,6 +3214,12 @@ _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, #endif switch(pktype) { +#if LIBSSH2_ED25519 + case EVP_PKEY_ED25519 : + st = gen_publickey_from_ed_evp( + session, method, method_len, pubkeydata, pubkeydata_len, pk); + break; +#endif /* LIBSSH2_ED25519 */ case EVP_PKEY_RSA : st = gen_publickey_from_rsa_evp(session, method, method_len, pubkeydata, pubkeydata_len, pk); diff --git a/vendor/libssh2/src/openssl.h b/vendor/libssh2/src/openssl.h index 15518e0a6..658b040d6 100644 --- a/vendor/libssh2/src/openssl.h +++ b/vendor/libssh2/src/openssl.h @@ -1,3 +1,5 @@ +#ifndef __LIBSSH2_OPENSSL_H +#define __LIBSSH2_OPENSSL_H /* Copyright (C) 2009, 2010 Simon Josefsson * Copyright (C) 2006, 2007 The Written Word, Inc. All rights reserved. * @@ -135,7 +137,7 @@ #define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) -#define _libssh2_random(buf, len) RAND_bytes ((buf), (len)) +#define _libssh2_random(buf, len) (RAND_bytes((buf), (len)) == 1 ? 0 : -1) #define libssh2_prepare_iovec(vec, len) /* Empty. */ @@ -306,7 +308,7 @@ extern void _libssh2_openssl_crypto_exit(void); #define _libssh2_dsa_free(dsactx) DSA_free(dsactx) -#ifdef LIBSSH2_ECDSA +#if LIBSSH2_ECDSA #define libssh2_ecdsa_ctx EC_KEY #define _libssh2_ecdsa_free(ecdsactx) EC_KEY_free(ecdsactx) #define _libssh2_ec_key EC_KEY @@ -321,27 +323,10 @@ libssh2_curve_type; #define _libssh2_ec_key void #endif /* LIBSSH2_ECDSA */ -#ifdef LIBSSH2_ED25519 - -typedef struct { - EVP_PKEY *public_key; - EVP_PKEY *private_key; -} libssh2_curve25519_keys; - -#define libssh2_ed25519_ctx libssh2_curve25519_keys -#define libssh2_x25519_ctx libssh2_curve25519_keys - -#define _libssh2_ed25519_new_ctx() calloc(1, sizeof(libssh2_ed25519_ctx)) -#define _libssh2_ed25519_free(ctx) do { \ - if(ctx) { \ - if(ctx->public_key) EVP_PKEY_free(ctx->public_key); \ - if(ctx->private_key) EVP_PKEY_free(ctx->private_key); \ - free(ctx); \ - } \ -} while(0) - -#define _libssh2_x25519_free(ctx) _libssh2_ed25519_free(ctx) +#if LIBSSH2_ED25519 +#define libssh2_ed25519_ctx EVP_PKEY +#define _libssh2_ed25519_free(ctx) EVP_PKEY_free(ctx) #endif /* ED25519 */ #define _libssh2_cipher_type(name) const EVP_CIPHER *(*name)(void) @@ -407,3 +392,5 @@ extern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); const EVP_CIPHER *_libssh2_EVP_aes_128_ctr(void); const EVP_CIPHER *_libssh2_EVP_aes_192_ctr(void); const EVP_CIPHER *_libssh2_EVP_aes_256_ctr(void); + +#endif /* __LIBSSH2_OPENSSL_H */ diff --git a/vendor/libssh2/src/packet.c b/vendor/libssh2/src/packet.c index 2e01bfc5d..04937d62a 100644 --- a/vendor/libssh2/src/packet.c +++ b/vendor/libssh2/src/packet.c @@ -85,30 +85,53 @@ packet_queue_listener(LIBSSH2_SESSION * session, unsigned char *data, char failure_code = SSH_OPEN_ADMINISTRATIVELY_PROHIBITED; int rc; - (void) datalen; - if(listen_state->state == libssh2_NB_state_idle) { - unsigned char *s = data + (sizeof("forwarded-tcpip") - 1) + 5; - listen_state->sender_channel = _libssh2_ntohu32(s); - s += 4; - - listen_state->initial_window_size = _libssh2_ntohu32(s); - s += 4; - listen_state->packet_size = _libssh2_ntohu32(s); - s += 4; - - listen_state->host_len = _libssh2_ntohu32(s); - s += 4; - listen_state->host = s; - s += listen_state->host_len; - listen_state->port = _libssh2_ntohu32(s); - s += 4; - - listen_state->shost_len = _libssh2_ntohu32(s); - s += 4; - listen_state->shost = s; - s += listen_state->shost_len; - listen_state->sport = _libssh2_ntohu32(s); + unsigned long offset = (sizeof("forwarded-tcpip") - 1) + 5; + size_t temp_len = 0; + struct string_buf buf; + buf.data = data; + buf.dataptr = buf.data; + buf.len = datalen; + + if(datalen < offset) { + return _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, + "Unexpected packet size"); + } + + buf.dataptr += offset; + + if(_libssh2_get_u32(&buf, &(listen_state->sender_channel))) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short extracting channel"); + } + if(_libssh2_get_u32(&buf, &(listen_state->initial_window_size))) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short extracting window size"); + } + if(_libssh2_get_u32(&buf, &(listen_state->packet_size))) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short extracting packet"); + } + if(_libssh2_get_string(&buf, &(listen_state->host), &temp_len)) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short extracting host"); + } + listen_state->host_len = (uint32_t)temp_len; + + if(_libssh2_get_u32(&buf, &(listen_state->port))) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short extracting port"); + } + if(_libssh2_get_string(&buf, &(listen_state->shost), &temp_len)) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short extracting shost"); + } + listen_state->shost_len = (uint32_t)temp_len; + + if(_libssh2_get_u32(&buf, &(listen_state->sport))) { + return _libssh2_error(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL, + "Data too short extracting sport"); + } _libssh2_debug(session, LIBSSH2_TRACE_CONN, "Remote received connection from %s:%ld to %s:%ld", @@ -272,21 +295,56 @@ packet_x11_open(LIBSSH2_SESSION * session, unsigned char *data, LIBSSH2_CHANNEL *channel = x11open_state->channel; int rc; - (void) datalen; - if(x11open_state->state == libssh2_NB_state_idle) { - unsigned char *s = data + (sizeof("x11") - 1) + 5; - x11open_state->sender_channel = _libssh2_ntohu32(s); - s += 4; - x11open_state->initial_window_size = _libssh2_ntohu32(s); - s += 4; - x11open_state->packet_size = _libssh2_ntohu32(s); - s += 4; - x11open_state->shost_len = _libssh2_ntohu32(s); - s += 4; - x11open_state->shost = s; - s += x11open_state->shost_len; - x11open_state->sport = _libssh2_ntohu32(s); + + unsigned long offset = (sizeof("x11") - 1) + 5; + size_t temp_len = 0; + struct string_buf buf; + buf.data = data; + buf.dataptr = buf.data; + buf.len = datalen; + + if(datalen < offset) { + _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "unexpected data length"); + failure_code = SSH_OPEN_CONNECT_FAILED; + goto x11_exit; + } + + buf.dataptr += offset; + + if(_libssh2_get_u32(&buf, &(x11open_state->sender_channel))) { + _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "unexpected sender channel size"); + failure_code = SSH_OPEN_CONNECT_FAILED; + goto x11_exit; + } + if(_libssh2_get_u32(&buf, &(x11open_state->initial_window_size))) { + _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "unexpected window size"); + failure_code = SSH_OPEN_CONNECT_FAILED; + goto x11_exit; + } + if(_libssh2_get_u32(&buf, &(x11open_state->packet_size))) { + _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "unexpected window size"); + failure_code = SSH_OPEN_CONNECT_FAILED; + goto x11_exit; + } + if(_libssh2_get_string(&buf, &(x11open_state->shost), &temp_len)) { + _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "unexpected host size"); + failure_code = SSH_OPEN_CONNECT_FAILED; + goto x11_exit; + } + x11open_state->shost_len = (uint32_t)temp_len; + + if(_libssh2_get_u32(&buf, &(x11open_state->sport))) { + _libssh2_error(session, LIBSSH2_ERROR_INVAL, + "unexpected port size"); + failure_code = SSH_OPEN_CONNECT_FAILED; + goto x11_exit; + } _libssh2_debug(session, LIBSSH2_TRACE_CONN, "X11 Connection Received from %s:%ld on channel %lu", @@ -1265,9 +1323,11 @@ _libssh2_packet_requirev(LIBSSH2_SESSION *session, if(strchr((char *) packet_types, ret)) { /* Be lazy, let packet_ask pull it out of the brigade */ - return _libssh2_packet_askv(session, packet_types, data, + int ret = _libssh2_packet_askv(session, packet_types, data, data_len, match_ofs, match_buf, match_len); + state->start = 0; + return ret; } } diff --git a/vendor/libssh2/src/packet.h b/vendor/libssh2/src/packet.h index d66b15b50..79018bcf1 100644 --- a/vendor/libssh2/src/packet.h +++ b/vendor/libssh2/src/packet.h @@ -1,5 +1,5 @@ -#ifndef LIBSSH2_PACKET_H -#define LIBSSH2_PACKET_H +#ifndef __LIBSSH2_PACKET_H +#define __LIBSSH2_PACKET_H /* * Copyright (C) 2010 by Daniel Stenberg * Author: Daniel Stenberg @@ -73,4 +73,4 @@ int _libssh2_packet_write(LIBSSH2_SESSION * session, unsigned char *data, int _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, size_t datalen, int macstate); -#endif /* LIBSSH2_PACKET_H */ +#endif /* __LIBSSH2_PACKET_H */ diff --git a/vendor/libssh2/src/pem.c b/vendor/libssh2/src/pem.c index 53f58c2ef..3416bd528 100644 --- a/vendor/libssh2/src/pem.c +++ b/vendor/libssh2/src/pem.c @@ -176,6 +176,8 @@ _libssh2_pem_parse(LIBSSH2_SESSION * session, linelen = strlen(line); tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); if(!tmp) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for PEM parsing"); ret = -1; goto out; } @@ -319,6 +321,8 @@ _libssh2_pem_parse_memory(LIBSSH2_SESSION * session, linelen = strlen(line); tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); if(!tmp) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for PEM parsing"); ret = -1; goto out; } @@ -690,6 +694,8 @@ _libssh2_openssh_pem_parse(LIBSSH2_SESSION * session, linelen = strlen(line); tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); if(!tmp) { + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for PEM parsing"); ret = -1; goto out; } @@ -738,17 +744,17 @@ _libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session, size_t off = 0; int ret; - if(filedata == NULL || filedata_len <= 0) { - return -1; - } + if(filedata == NULL || filedata_len <= 0) + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Error parsing PEM: filedata missing"); do { *line = '\0'; - if(off >= filedata_len) { - return -1; - } + if(off >= filedata_len) + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Error parsing PEM: offset out of bounds"); if(readline_memory(line, LINE_SIZE, filedata, filedata_len, &off)) { return -1; @@ -766,7 +772,9 @@ _libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session, linelen = strlen(line); tmp = LIBSSH2_REALLOC(session, b64data, b64datalen + linelen); if(!tmp) { - ret = -1; + ret = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for " + "PEM parsing"); goto out; } memcpy(tmp + b64datalen, line, linelen); @@ -777,7 +785,8 @@ _libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session, *line = '\0'; if(off >= filedata_len) { - ret = -1; + ret = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Error parsing PEM: offset out of bounds"); goto out; } @@ -787,9 +796,9 @@ _libssh2_openssh_pem_parse_memory(LIBSSH2_SESSION * session, } } while(strcmp(line, OPENSSH_HEADER_END) != 0); - if(!b64data) { - return -1; - } + if(!b64data) + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Error parsing PEM: base 64 data missing"); ret = _libssh2_openssh_pem_parse_data(session, passphrase, b64data, b64datalen, decrypted_buf); diff --git a/vendor/libssh2/src/scp.c b/vendor/libssh2/src/scp.c index a9d2db535..8cb3d65c3 100644 --- a/vendor/libssh2/src/scp.c +++ b/vendor/libssh2/src/scp.c @@ -65,13 +65,13 @@ current argument word, add the apostrophe in quotation marks "", and open a new argument word instead (_ indicate the input string characters): - _____ _ _ + _____ _ _ 'doesn' "'" 't' Sequences of apostrophes are combined in one pair of quotation marks: a'''b becomes - _ ___ _ + _ ___ _ 'a'"'''"'b' o If the string contains an exclamation mark (!), the C-Shell @@ -84,7 +84,7 @@ a!b become - _ _ _ + _ _ _ 'a'\!'b' The result buffer must be large enough for the expanded result. A diff --git a/vendor/libssh2/src/session.c b/vendor/libssh2/src/session.c index e439acde5..212560b88 100644 --- a/vendor/libssh2/src/session.c +++ b/vendor/libssh2/src/session.c @@ -219,7 +219,7 @@ banner_send(LIBSSH2_SESSION * session) } else { memcpy(banner_dup, banner, 255); - banner[255] = '\0'; + banner_dup[255] = '\0'; } _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Sending Banner: %s", @@ -589,7 +589,7 @@ int _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t start_time) session->err_code = LIBSSH2_ERROR_NONE; rc = libssh2_keepalive_send(session, &seconds_to_next); - if(rc < 0) + if(rc) return rc; ms_to_next = seconds_to_next * 1000; diff --git a/vendor/libssh2/src/session.h b/vendor/libssh2/src/session.h index 7b6c291e2..9f8f2c706 100644 --- a/vendor/libssh2/src/session.h +++ b/vendor/libssh2/src/session.h @@ -1,5 +1,5 @@ -#ifndef LIBSSH2_SESSION_H -#define LIBSSH2_SESSION_H +#ifndef __LIBSSH2_SESSION_H +#define __LIBSSH2_SESSION_H /* Copyright (c) 2004-2007 Sara Golemon * Copyright (c) 2009-2010 by Daniel Stenberg * Copyright (c) 2010 Simon Josefsson @@ -90,4 +90,4 @@ int _libssh2_wait_socket(LIBSSH2_SESSION *session, time_t entry_time); /* this is the lib-internal set blocking function */ int _libssh2_session_set_blocking(LIBSSH2_SESSION * session, int blocking); -#endif /* LIBSSH2_SESSION_H */ +#endif /* __LIBSSH2_SESSION_H */ diff --git a/vendor/libssh2/src/sftp.c b/vendor/libssh2/src/sftp.c index ece590e51..ac7ee0162 100644 --- a/vendor/libssh2/src/sftp.c +++ b/vendor/libssh2/src/sftp.c @@ -1428,7 +1428,7 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer, /* 'count' is how much more data to ask for, and 'already' is how much data that already has been asked for but not yet returned. - Specificly, 'count' means how much data that have or will be + Specifically, 'count' means how much data that have or will be asked for by the nodes that are already added to the linked list. Some of those read requests may not actually have been sent off successfully yet. diff --git a/vendor/libssh2/src/sftp.h b/vendor/libssh2/src/sftp.h index ae4162f10..129b8f085 100644 --- a/vendor/libssh2/src/sftp.h +++ b/vendor/libssh2/src/sftp.h @@ -1,5 +1,5 @@ -#ifndef _LIBSSH2_SFTP_H -#define _LIBSSH2_SFTP_H +#ifndef __LIBSSH2_SFTP_H +#define __LIBSSH2_SFTP_H /* * Copyright (C) 2010 - 2012 by Daniel Stenberg * Author: Daniel Stenberg @@ -235,4 +235,4 @@ struct _LIBSSH2_SFTP uint32_t symlink_request_id; }; -#endif +#endif /* __LIBSSH2_SFTP_H */ diff --git a/vendor/libssh2/src/transport.c b/vendor/libssh2/src/transport.c index 45e445c74..17af3e4da 100644 --- a/vendor/libssh2/src/transport.c +++ b/vendor/libssh2/src/transport.c @@ -323,7 +323,7 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) do { if(session->socket_state == LIBSSH2_SOCKET_DISCONNECTED) { - return LIBSSH2_ERROR_NONE; + return LIBSSH2_ERROR_SOCKET_DISCONNECT; } if(session->state & LIBSSH2_STATE_NEWKEYS) { @@ -465,7 +465,7 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) * or less (including length, padding length, payload, * padding, and MAC.)." */ - if(total_num > LIBSSH2_PACKET_MAXPAYLOAD) { + if(total_num > LIBSSH2_PACKET_MAXPAYLOAD || total_num == 0) { return LIBSSH2_ERROR_OUT_OF_BOUNDARY; } @@ -488,6 +488,8 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) p->wptr += blocksize - 5; /* advance write pointer */ } else { + if(p->payload) + LIBSSH2_FREE(session, p->payload); return LIBSSH2_ERROR_OUT_OF_BOUNDARY; } } @@ -570,6 +572,8 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session) memcpy(p->wptr, &p->buf[p->readidx], numbytes); } else { + if(p->payload) + LIBSSH2_FREE(session, p->payload); return LIBSSH2_ERROR_OUT_OF_BOUNDARY; } @@ -765,7 +769,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, ((session->state & LIBSSH2_STATE_AUTHENTICATED) || session->local.comp->use_in_auth); - if(encrypted && compressed) { + if(encrypted && compressed && session->local.comp_abstract) { /* the idea here is that these function must fail if the output gets larger than what fits in the assigned buffer so thus they don't check the input size as we don't know how much it compresses */ @@ -858,7 +862,10 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session, p->outbuf[4] = (unsigned char)padding_length; /* fill the padding area with random junk */ - _libssh2_random(p->outbuf + 5 + data_len, padding_length); + if(_libssh2_random(p->outbuf + 5 + data_len, padding_length)) { + return _libssh2_error(session, LIBSSH2_ERROR_RANDGEN, + "Unable to get random bytes for packet padding"); + } if(encrypted) { size_t i; diff --git a/vendor/libssh2/src/transport.h b/vendor/libssh2/src/transport.h index 89982a67f..7d395d0e7 100644 --- a/vendor/libssh2/src/transport.h +++ b/vendor/libssh2/src/transport.h @@ -1,6 +1,5 @@ #ifndef __LIBSSH2_TRANSPORT_H #define __LIBSSH2_TRANSPORT_H - /* Copyright (C) 2007 The Written Word, Inc. All rights reserved. * Copyright (C) 2009-2010 by Daniel Stenberg * Author: Daniel Stenberg diff --git a/vendor/libssh2/src/userauth.c b/vendor/libssh2/src/userauth.c index 949dc1c66..40ef9153a 100644 --- a/vendor/libssh2/src/userauth.c +++ b/vendor/libssh2/src/userauth.c @@ -629,7 +629,7 @@ file_read_publickey(LIBSSH2_SESSION * session, unsigned char **method, sp1++; - sp_len = sp1 > pubkey ? (sp1 - pubkey) - 1 : 0; + sp_len = sp1 > pubkey ? (sp1 - pubkey) : 0; sp2 = memchr(sp1, ' ', pubkey_len - sp_len); if(sp2 == NULL) { /* Assume that the id string is missing, but that it's okay */ @@ -828,11 +828,6 @@ userauth_hostbased_fromfile(LIBSSH2_SESSION *session, { int rc; -#if !LIBSSH2_RSA - return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, - "RSA is not supported by crypto backend"); -#endif - if(session->userauth_host_state == libssh2_NB_state_idle) { const LIBSSH2_HOSTKEY_METHOD *privkeyobj; unsigned char *pubkeydata = NULL; @@ -1075,7 +1070,21 @@ libssh2_userauth_hostbased_fromfile_ex(LIBSSH2_SESSION *session, return rc; } - +static int plain_method_len(const char *method, size_t method_len) +{ + if(!strncmp("ecdsa-sha2-nistp256-cert-v01@openssh.com", + method, + method_len) || + !strncmp("ecdsa-sha2-nistp384-cert-v01@openssh.com", + method, + method_len) || + !strncmp("ecdsa-sha2-nistp521-cert-v01@openssh.com", + method, + method_len)) { + return 19; + } + return method_len; +} int _libssh2_userauth_publickey(LIBSSH2_SESSION *session, @@ -1340,6 +1349,10 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, s = session->userauth_pblc_packet + session->userauth_pblc_packet_len; session->userauth_pblc_b = NULL; + session->userauth_pblc_method_len = + plain_method_len((const char *)session->userauth_pblc_method, + session->userauth_pblc_method_len); + _libssh2_store_u32(&s, 4 + session->userauth_pblc_method_len + 4 + sig_len); @@ -1438,11 +1451,6 @@ userauth_publickey_frommemory(LIBSSH2_SESSION *session, void *abstract = &privkey_file; int rc; -#if !LIBSSH2_RSA - return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, - "RSA is not supported by crypto backend"); -#endif - privkey_file.filename = privatekeydata; privkey_file.passphrase = passphrase; @@ -1457,15 +1465,14 @@ userauth_publickey_frommemory(LIBSSH2_SESSION *session, } else if(privatekeydata_len && privatekeydata) { /* Compute public key from private key. */ - if(_libssh2_pub_priv_keyfilememory(session, + rc = _libssh2_pub_priv_keyfilememory(session, &session->userauth_pblc_method, &session->userauth_pblc_method_len, &pubkeydata, &pubkeydata_len, privatekeydata, privatekeydata_len, - passphrase)) - return _libssh2_error(session, LIBSSH2_ERROR_FILE, - "Unable to extract public key " - "from private key."); + passphrase); + if(rc) + return rc; } else { return _libssh2_error(session, LIBSSH2_ERROR_FILE, @@ -1500,11 +1507,6 @@ userauth_publickey_fromfile(LIBSSH2_SESSION *session, void *abstract = &privkey_file; int rc; -#if !LIBSSH2_RSA - return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, - "RSA is not supported by crypto backend"); -#endif - privkey_file.filename = privatekey; privkey_file.passphrase = passphrase; diff --git a/vendor/libssh2/src/userauth.h b/vendor/libssh2/src/userauth.h index a7b0a9846..6b402ddbf 100644 --- a/vendor/libssh2/src/userauth.h +++ b/vendor/libssh2/src/userauth.h @@ -1,5 +1,5 @@ -#ifndef LIBSSH2_USERAUTH_H -#define LIBSSH2_USERAUTH_H +#ifndef __LIBSSH2_USERAUTH_H +#define __LIBSSH2_USERAUTH_H /* Copyright (c) 2004-2007, Sara Golemon * Copyright (c) 2009-2010 by Daniel Stenberg * All rights reserved. @@ -48,4 +48,4 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, ((*sign_callback)), void *abstract); -#endif /* LIBSSH2_USERAUTH_H */ +#endif /* __LIBSSH2_USERAUTH_H */ diff --git a/vendor/libssh2/src/wincng.c b/vendor/libssh2/src/wincng.c index 4bebc6407..cbb2b61cb 100755 --- a/vendor/libssh2/src/wincng.c +++ b/vendor/libssh2/src/wincng.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013-2015 Marc Hoersken + * Copyright (C) 2013-2020 Marc Hoersken * All rights reserved. * * Redistribution and use in source and binary forms, @@ -58,6 +58,7 @@ #include #include +#include #include #include "misc.h" @@ -98,6 +99,10 @@ #define BCRYPT_SHA256_ALGORITHM L"SHA256" #endif +#ifndef BCRYPT_SHA384_ALGORITHM +#define BCRYPT_SHA384_ALGORITHM L"SHA384" +#endif + #ifndef BCRYPT_SHA512_ALGORITHM #define BCRYPT_SHA512_ALGORITHM L"SHA512" #endif @@ -122,6 +127,15 @@ #define BCRYPT_3DES_ALGORITHM L"3DES" #endif +#ifndef BCRYPT_DH_ALGORITHM +#define BCRYPT_DH_ALGORITHM L"DH" +#endif + +/* BCRYPT_KDF_RAW_SECRET is available from Windows 8.1 and onwards */ +#ifndef BCRYPT_KDF_RAW_SECRET +#define BCRYPT_KDF_RAW_SECRET L"TRUNCATE" +#endif + #ifndef BCRYPT_ALG_HANDLE_HMAC_FLAG #define BCRYPT_ALG_HANDLE_HMAC_FLAG 0x00000008 #endif @@ -208,40 +222,88 @@ * Windows CNG backend: Generic functions */ +struct _libssh2_wincng_ctx _libssh2_wincng; + void _libssh2_wincng_init(void) { int ret; - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG, + memset(&_libssh2_wincng, 0, sizeof(_libssh2_wincng)); + + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG, BCRYPT_RNG_ALGORITHM, NULL, 0); + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgRNG = NULL; + } - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashMD5, + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashMD5, BCRYPT_MD5_ALGORITHM, NULL, 0); - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA1, + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHashMD5 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA1, BCRYPT_SHA1_ALGORITHM, NULL, 0); - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256, + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHashSHA1 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256, BCRYPT_SHA256_ALGORITHM, NULL, 0); - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512, + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHashSHA256 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA384, + BCRYPT_SHA384_ALGORITHM, NULL, 0); + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHashSHA384 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512, BCRYPT_SHA512_ALGORITHM, NULL, 0); + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHashSHA512 = NULL; + } - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacMD5, + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacMD5, BCRYPT_MD5_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA1, + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHmacMD5 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA1, BCRYPT_SHA1_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA256, + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHmacSHA1 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA256, BCRYPT_SHA256_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA512, + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHmacSHA256 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA384, + BCRYPT_SHA384_ALGORITHM, NULL, + BCRYPT_ALG_HANDLE_HMAC_FLAG); + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHmacSHA384 = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA512, BCRYPT_SHA512_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgHmacSHA512 = NULL; + } - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRSA, + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRSA, BCRYPT_RSA_ALGORITHM, NULL, 0); - (void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDSA, + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgRSA = NULL; + } + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDSA, BCRYPT_DSA_ALGORITHM, NULL, 0); + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgDSA = NULL; + } ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC, BCRYPT_AES_ALGORITHM, NULL, 0); @@ -251,7 +313,10 @@ _libssh2_wincng_init(void) (PBYTE)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0); if(!BCRYPT_SUCCESS(ret)) { - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0); + ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0); + if(BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgAES_CBC = NULL; + } } } @@ -263,7 +328,10 @@ _libssh2_wincng_init(void) (PBYTE)BCRYPT_CHAIN_MODE_ECB, sizeof(BCRYPT_CHAIN_MODE_ECB), 0); if(!BCRYPT_SUCCESS(ret)) { - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_ECB, 0); + ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_ECB, 0); + if(BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgAES_ECB = NULL; + } } } @@ -275,7 +343,10 @@ _libssh2_wincng_init(void) (PBYTE)BCRYPT_CHAIN_MODE_NA, sizeof(BCRYPT_CHAIN_MODE_NA), 0); if(!BCRYPT_SUCCESS(ret)) { - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0); + ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0); + if(BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgRC4_NA = NULL; + } } } @@ -287,29 +358,58 @@ _libssh2_wincng_init(void) (PBYTE)BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC), 0); if(!BCRYPT_SUCCESS(ret)) { - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, + ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0); + if(BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlg3DES_CBC = NULL; + } } } + + ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDH, + BCRYPT_DH_ALGORITHM, NULL, 0); + if(!BCRYPT_SUCCESS(ret)) { + _libssh2_wincng.hAlgDH = NULL; + } } void _libssh2_wincng_free(void) { - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRNG, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashMD5, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA1, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA256, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA512, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacMD5, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA1, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA256, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA512, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRSA, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDSA, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0); - (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0); + if(_libssh2_wincng.hAlgRNG) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRNG, 0); + if(_libssh2_wincng.hAlgHashMD5) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashMD5, 0); + if(_libssh2_wincng.hAlgHashSHA1) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA1, 0); + if(_libssh2_wincng.hAlgHashSHA256) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA256, 0); + if(_libssh2_wincng.hAlgHashSHA384) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA384, 0); + if(_libssh2_wincng.hAlgHashSHA512) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA512, 0); + if(_libssh2_wincng.hAlgHmacMD5) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacMD5, 0); + if(_libssh2_wincng.hAlgHmacSHA1) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA1, 0); + if(_libssh2_wincng.hAlgHmacSHA256) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA256, 0); + if(_libssh2_wincng.hAlgHmacSHA384) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA384, 0); + if(_libssh2_wincng.hAlgHmacSHA512) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA512, 0); + if(_libssh2_wincng.hAlgRSA) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRSA, 0); + if(_libssh2_wincng.hAlgDSA) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDSA, 0); + if(_libssh2_wincng.hAlgAES_CBC) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0); + if(_libssh2_wincng.hAlgRC4_NA) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0); + if(_libssh2_wincng.hAlg3DES_CBC) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0); + if(_libssh2_wincng.hAlgDH) + (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDH, 0); memset(&_libssh2_wincng, 0, sizeof(_libssh2_wincng)); } @@ -342,6 +442,24 @@ _libssh2_wincng_safe_free(void *buf, int len) free(buf); } +/* Copy a big endian set of bits from src to dest. + * if the size of src is smaller than dest then pad the "left" (MSB) + * end with zeroes and copy the bits into the "right" (LSB) end. */ +static void +memcpy_with_be_padding(unsigned char *dest, unsigned long dest_len, + unsigned char *src, unsigned long src_len) +{ + if(dest_len > src_len) { + memset(dest, 0, dest_len - src_len); + } + memcpy((dest + dest_len) - src_len, src, src_len); +} + +static int +round_down(int number, int multiple) +{ + return (number / multiple) * multiple; +} /*******************************************************************/ /* @@ -1914,7 +2032,8 @@ _libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom) if(!rnd) return -1; - length = (unsigned long)(ceil((float)bits / 8) * sizeof(unsigned char)); + length = (unsigned long) (ceil(((double)bits) / 8.0) * + sizeof(unsigned char)); if(_libssh2_wincng_bignum_resize(rnd, length)) return -1; @@ -1925,15 +2044,17 @@ _libssh2_wincng_bignum_rand(_libssh2_bn *rnd, int bits, int top, int bottom) /* calculate significant bits in most significant byte */ bits %= 8; + if(bits == 0) + bits = 8; /* fill most significant byte with zero padding */ - bignum[0] &= (1 << (8 - bits)) - 1; + bignum[0] &= ((1 << bits) - 1); - /* set some special last bits in most significant byte */ + /* set most significant bits in most significant byte */ if(top == 0) - bignum[0] |= (1 << (7 - bits)); + bignum[0] |= (1 << (bits - 1)); else if(top == 1) - bignum[0] |= (3 << (6 - bits)); + bignum[0] |= (3 << (bits - 2)); /* make odd by setting first bit in least significant byte */ if(bottom) @@ -1978,11 +2099,10 @@ _libssh2_wincng_bignum_mod_exp(_libssh2_bn *r, offset += p->length; memcpy(key + offset, m->bignum, m->length); + offset = 0; ret = BCryptImportKeyPair(_libssh2_wincng.hAlgRSA, NULL, - BCRYPT_RSAPUBLIC_BLOB, &hKey, key, keylen, - BCRYPT_NO_KEY_VALIDATION); - + BCRYPT_RSAPUBLIC_BLOB, &hKey, key, keylen, 0); if(BCRYPT_SUCCESS(ret)) { ret = BCryptEncrypt(hKey, a->bignum, a->length, NULL, NULL, 0, NULL, 0, &length, BCRYPT_PAD_NONE); @@ -1991,9 +2111,8 @@ _libssh2_wincng_bignum_mod_exp(_libssh2_bn *r, length = max(a->length, length); bignum = malloc(length); if(bignum) { - offset = length - a->length; - memset(bignum, 0, offset); - memcpy(bignum + offset, a->bignum, a->length); + memcpy_with_be_padding(bignum, length, + a->bignum, a->length); ret = BCryptEncrypt(hKey, bignum, length, NULL, NULL, 0, r->bignum, r->length, &offset, @@ -2032,8 +2151,9 @@ _libssh2_wincng_bignum_set_word(_libssh2_bn *bn, unsigned long word) number = word; while(number >>= 1) bits++; + bits++; - length = (unsigned long) (ceil(((double)(bits + 1)) / 8.0) * + length = (unsigned long) (ceil(((double)bits) / 8.0) * sizeof(unsigned char)); if(_libssh2_wincng_bignum_resize(bn, length)) return -1; @@ -2050,21 +2170,18 @@ _libssh2_wincng_bignum_bits(const _libssh2_bn *bn) unsigned char number; unsigned long offset, length, bits; - if(!bn) + if(!bn || !bn->bignum || !bn->length) return 0; - length = bn->length - 1; - offset = 0; - while(!(*(bn->bignum + offset)) && (offset < length)) + length = bn->length - 1; + while(!bn->bignum[offset] && offset < length) offset++; bits = (length - offset) * 8; number = bn->bignum[offset]; - while(number >>= 1) bits++; - bits++; return bits; @@ -2127,6 +2244,7 @@ _libssh2_wincng_bignum_free(_libssh2_bn *bn) } +/*******************************************************************/ /* * Windows CNG backend: Diffie-Hellman support. */ @@ -2134,35 +2252,342 @@ _libssh2_wincng_bignum_free(_libssh2_bn *bn) void _libssh2_dh_init(_libssh2_dh_ctx *dhctx) { - *dhctx = _libssh2_wincng_bignum_init(); /* Random from client */ + /* Random from client */ + dhctx->bn = NULL; + dhctx->dh_handle = NULL; + dhctx->dh_params = NULL; } +void +_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) +{ + if(dhctx->dh_handle) { + BCryptDestroyKey(dhctx->dh_handle); + dhctx->dh_handle = NULL; + } + if(dhctx->dh_params) { + /* Since public dh_params are shared in clear text, + * we don't need to securely zero them out here */ + free(dhctx->dh_params); + dhctx->dh_params = NULL; + } + if(dhctx->bn) { + _libssh2_wincng_bignum_free(dhctx->bn); + dhctx->bn = NULL; + } +} + +/* Generates a Diffie-Hellman key pair using base `g', prime `p' and the given + * `group_order'. Can use the given big number context `bnctx' if needed. The + * private key is stored as opaque in the Diffie-Hellman context `*dhctx' and + * the public key is returned in `public'. 0 is returned upon success, else + * -1. */ int _libssh2_dh_key_pair(_libssh2_dh_ctx *dhctx, _libssh2_bn *public, _libssh2_bn *g, _libssh2_bn *p, int group_order) { + const int hasAlgDHwithKDF = _libssh2_wincng.hasAlgDHwithKDF; + while(_libssh2_wincng.hAlgDH && hasAlgDHwithKDF != -1) { + BCRYPT_DH_PARAMETER_HEADER *dh_params = NULL; + unsigned long dh_params_len; + unsigned char *blob = NULL; + int status; + /* Note that the DH provider requires that keys be multiples of 64 bits + * in length. At the time of writing a practical observed group_order + * value is 257, so we need to round down to 8 bytes of length (64/8) + * in order for kex to succeed */ + DWORD key_length_bytes = max(round_down(group_order, 8), + max(g->length, p->length)); + BCRYPT_DH_KEY_BLOB *dh_key_blob; + LPCWSTR key_type; + + /* Prepare a key pair; pass the in the bit length of the key, + * but the key is not ready for consumption until it is finalized. */ + status = BCryptGenerateKeyPair(_libssh2_wincng.hAlgDH, + &dhctx->dh_handle, + key_length_bytes * 8, 0); + if(!BCRYPT_SUCCESS(status)) { + return -1; + } + + dh_params_len = sizeof(*dh_params) + 2 * key_length_bytes; + blob = malloc(dh_params_len); + if(!blob) { + return -1; + } + + /* Populate DH parameters blob; after the header follows the `p` + * value and the `g` value. */ + dh_params = (BCRYPT_DH_PARAMETER_HEADER*)blob; + dh_params->cbLength = dh_params_len; + dh_params->dwMagic = BCRYPT_DH_PARAMETERS_MAGIC; + dh_params->cbKeyLength = key_length_bytes; + memcpy_with_be_padding(blob + sizeof(*dh_params), key_length_bytes, + p->bignum, p->length); + memcpy_with_be_padding(blob + sizeof(*dh_params) + key_length_bytes, + key_length_bytes, g->bignum, g->length); + + status = BCryptSetProperty(dhctx->dh_handle, BCRYPT_DH_PARAMETERS, + blob, dh_params_len, 0); + if(hasAlgDHwithKDF == -1) { + /* We know that the raw KDF is not supported, so discard this. */ + free(blob); + } + else { + /* Pass ownership to dhctx; these parameters will be freed when + * the context is destroyed. We need to keep the parameters more + * easily available so that we have access to the `g` value when + * _libssh2_dh_secret is called later. */ + dhctx->dh_params = dh_params; + } + dh_params = NULL; + blob = NULL; + + if(!BCRYPT_SUCCESS(status)) { + return -1; + } + + status = BCryptFinalizeKeyPair(dhctx->dh_handle, 0); + if(!BCRYPT_SUCCESS(status)) { + return -1; + } + + key_length_bytes = 0; + if(hasAlgDHwithKDF == 1) { + /* Now we need to extract the public portion of the key so that we + * set it in the `public` bignum to satisfy our caller. + * First measure up the size of the required buffer. */ + key_type = BCRYPT_DH_PUBLIC_BLOB; + } + else { + /* We also need to extract the private portion of the key to + * set it in the `*dhctx' bignum if the raw KDF is not supported. + * First measure up the size of the required buffer. */ + key_type = BCRYPT_DH_PRIVATE_BLOB; + } + status = BCryptExportKey(dhctx->dh_handle, NULL, key_type, + NULL, 0, &key_length_bytes, 0); + if(!BCRYPT_SUCCESS(status)) { + return -1; + } + + blob = malloc(key_length_bytes); + if(!blob) { + return -1; + } + + status = BCryptExportKey(dhctx->dh_handle, NULL, key_type, + blob, key_length_bytes, + &key_length_bytes, 0); + if(!BCRYPT_SUCCESS(status)) { + if(hasAlgDHwithKDF == 1) { + /* We have no private data, because raw KDF is supported */ + free(blob); + } + else { /* we may have potentially private data, use secure free */ + _libssh2_wincng_safe_free(blob, key_length_bytes); + } + return -1; + } + + if(hasAlgDHwithKDF == -1) { + /* We know that the raw KDF is not supported, so discard this */ + BCryptDestroyKey(dhctx->dh_handle); + dhctx->dh_handle = NULL; + } + + /* BCRYPT_DH_PUBLIC_BLOB corresponds to a BCRYPT_DH_KEY_BLOB header + * followed by the Modulus, Generator and Public data. Those components + * each have equal size, specified by dh_key_blob->cbKey. */ + dh_key_blob = (BCRYPT_DH_KEY_BLOB*)blob; + if(_libssh2_wincng_bignum_resize(public, dh_key_blob->cbKey)) { + if(hasAlgDHwithKDF == 1) { + /* We have no private data, because raw KDF is supported */ + free(blob); + } + else { /* we may have potentially private data, use secure free */ + _libssh2_wincng_safe_free(blob, key_length_bytes); + } + return -1; + } + + /* Copy the public key data into the public bignum data buffer */ + memcpy(public->bignum, + blob + sizeof(*dh_key_blob) + 2 * dh_key_blob->cbKey, + dh_key_blob->cbKey); + + if(dh_key_blob->dwMagic == BCRYPT_DH_PRIVATE_MAGIC) { + /* BCRYPT_DH_PRIVATE_BLOB additionally contains the Private data */ + dhctx->bn = _libssh2_wincng_bignum_init(); + if(!dhctx->bn) { + _libssh2_wincng_safe_free(blob, key_length_bytes); + return -1; + } + if(_libssh2_wincng_bignum_resize(dhctx->bn, dh_key_blob->cbKey)) { + _libssh2_wincng_safe_free(blob, key_length_bytes); + return -1; + } + + /* Copy the private key data into the dhctx bignum data buffer */ + memcpy(dhctx->bn->bignum, + blob + sizeof(*dh_key_blob) + 3 * dh_key_blob->cbKey, + dh_key_blob->cbKey); + + /* Make sure the private key is an odd number, because only + * odd primes can be used with the RSA-based fallback while + * DH itself does not seem to care about it being odd or not. */ + if(!(dhctx->bn->bignum[dhctx->bn->length-1] % 2)) { + _libssh2_wincng_safe_free(blob, key_length_bytes); + /* discard everything first, then try again */ + _libssh2_dh_dtor(dhctx); + _libssh2_dh_init(dhctx); + continue; + } + } + + return 0; + } + /* Generate x and e */ - if(_libssh2_wincng_bignum_rand(*dhctx, group_order * 8 - 1, 0, -1)) + dhctx->bn = _libssh2_wincng_bignum_init(); + if(!dhctx->bn) + return -1; + if(_libssh2_wincng_bignum_rand(dhctx->bn, group_order * 8 - 1, 0, -1)) return -1; - if(_libssh2_wincng_bignum_mod_exp(public, g, *dhctx, p)) + if(_libssh2_wincng_bignum_mod_exp(public, g, dhctx->bn, p)) return -1; + return 0; } +/* Computes the Diffie-Hellman secret from the previously created context + * `*dhctx', the public key `f' from the other party and the same prime `p' + * used at context creation. The result is stored in `secret'. 0 is returned + * upon success, else -1. */ int _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, _libssh2_bn *f, _libssh2_bn *p) { - /* Compute the shared secret */ - _libssh2_wincng_bignum_mod_exp(secret, f, *dhctx, p); - return 0; -} + if(_libssh2_wincng.hAlgDH && _libssh2_wincng.hasAlgDHwithKDF != -1 && + dhctx->dh_handle && dhctx->dh_params && f) { + BCRYPT_KEY_HANDLE peer_public = NULL; + BCRYPT_SECRET_HANDLE agreement = NULL; + ULONG secret_len_bytes = 0; + unsigned char *blob; + int status; + unsigned char *start, *end; + BCRYPT_DH_KEY_BLOB *public_blob = NULL; + DWORD key_length_bytes = max(f->length, dhctx->dh_params->cbKeyLength); + DWORD public_blob_len = sizeof(*public_blob) + 3 * key_length_bytes; + + { + /* Populate a BCRYPT_DH_KEY_BLOB; after the header follows the + * Modulus, Generator and Public data. Those components must have + * equal size in this representation. */ + unsigned char *dest; + unsigned char *src; + + blob = malloc(public_blob_len); + if(!blob) { + return -1; + } + public_blob = (BCRYPT_DH_KEY_BLOB*)blob; + public_blob->dwMagic = BCRYPT_DH_PUBLIC_MAGIC; + public_blob->cbKey = key_length_bytes; + + dest = (unsigned char *)(public_blob + 1); + src = (unsigned char *)(dhctx->dh_params + 1); + + /* Modulus (the p-value from the first call) */ + memcpy_with_be_padding(dest, key_length_bytes, src, + dhctx->dh_params->cbKeyLength); + /* Generator (the g-value from the first call) */ + memcpy_with_be_padding(dest + key_length_bytes, key_length_bytes, + src + dhctx->dh_params->cbKeyLength, + dhctx->dh_params->cbKeyLength); + /* Public from the peer */ + memcpy_with_be_padding(dest + 2*key_length_bytes, key_length_bytes, + f->bignum, f->length); + } -void -_libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) -{ - _libssh2_wincng_bignum_free(*dhctx); - *dhctx = NULL; + /* Import the peer public key information */ + status = BCryptImportKeyPair(_libssh2_wincng.hAlgDH, NULL, + BCRYPT_DH_PUBLIC_BLOB, &peer_public, blob, + public_blob_len, 0); + if(!BCRYPT_SUCCESS(status)) { + goto out; + } + + /* Set up a handle that we can use to establish the shared secret + * between ourselves (our saved dh_handle) and the peer. */ + status = BCryptSecretAgreement(dhctx->dh_handle, peer_public, + &agreement, 0); + if(!BCRYPT_SUCCESS(status)) { + goto out; + } + + /* Compute the size of the buffer that is needed to hold the derived + * shared secret. */ + status = BCryptDeriveKey(agreement, BCRYPT_KDF_RAW_SECRET, NULL, NULL, + 0, &secret_len_bytes, 0); + if(!BCRYPT_SUCCESS(status)) { + if(status == STATUS_NOT_SUPPORTED) { + _libssh2_wincng.hasAlgDHwithKDF = -1; + } + goto out; + } + + /* Expand the secret bignum to be ready to receive the derived secret + * */ + if(_libssh2_wincng_bignum_resize(secret, secret_len_bytes)) { + status = STATUS_NO_MEMORY; + goto out; + } + + /* And populate the secret bignum */ + status = BCryptDeriveKey(agreement, BCRYPT_KDF_RAW_SECRET, NULL, + secret->bignum, secret_len_bytes, + &secret_len_bytes, 0); + if(!BCRYPT_SUCCESS(status)) { + if(status == STATUS_NOT_SUPPORTED) { + _libssh2_wincng.hasAlgDHwithKDF = -1; + } + goto out; + } + + /* Counter to all the other data in the BCrypt APIs, the raw secret is + * returned to us in host byte order, so we need to swap it to big + * endian order. */ + start = secret->bignum; + end = secret->bignum + secret->length - 1; + while(start < end) { + unsigned char tmp = *end; + *end = *start; + *start = tmp; + start++; + end--; + } + + status = 0; + _libssh2_wincng.hasAlgDHwithKDF = 1; + +out: + if(peer_public) { + BCryptDestroyKey(peer_public); + } + if(agreement) { + BCryptDestroySecret(agreement); + } + if(status == STATUS_NOT_SUPPORTED && + _libssh2_wincng.hasAlgDHwithKDF == -1) { + goto fb; /* fallback to RSA-based implementation */ + } + return BCRYPT_SUCCESS(status) ? 0 : -1; + } + +fb: + /* Compute the shared secret */ + return _libssh2_wincng_bignum_mod_exp(secret, f, dhctx->bn, p); } #endif /* LIBSSH2_WINCNG */ diff --git a/vendor/libssh2/src/wincng.h b/vendor/libssh2/src/wincng.h index f5838d0e6..eaf6f9051 100755 --- a/vendor/libssh2/src/wincng.h +++ b/vendor/libssh2/src/wincng.h @@ -1,5 +1,7 @@ +#ifndef __LIBSSH2_WINCNG_H +#define __LIBSSH2_WINCNG_H /* - * Copyright (C) 2013-2015 Marc Hoersken + * Copyright (C) 2013-2020 Marc Hoersken * All rights reserved. * * Redistribution and use in source and binary forms, @@ -47,7 +49,6 @@ #include #include - #define LIBSSH2_MD5 1 #define LIBSSH2_HMAC_RIPEMD 0 @@ -69,6 +70,7 @@ #define MD5_DIGEST_LENGTH 16 #define SHA_DIGEST_LENGTH 20 #define SHA256_DIGEST_LENGTH 32 +#define SHA384_DIGEST_LENGTH 48 #define SHA512_DIGEST_LENGTH 64 #define EC_MAX_POINT_LEN ((528 * 2 / 8) + 1) @@ -88,10 +90,12 @@ struct _libssh2_wincng_ctx { BCRYPT_ALG_HANDLE hAlgHashMD5; BCRYPT_ALG_HANDLE hAlgHashSHA1; BCRYPT_ALG_HANDLE hAlgHashSHA256; + BCRYPT_ALG_HANDLE hAlgHashSHA384; BCRYPT_ALG_HANDLE hAlgHashSHA512; BCRYPT_ALG_HANDLE hAlgHmacMD5; BCRYPT_ALG_HANDLE hAlgHmacSHA1; BCRYPT_ALG_HANDLE hAlgHmacSHA256; + BCRYPT_ALG_HANDLE hAlgHmacSHA384; BCRYPT_ALG_HANDLE hAlgHmacSHA512; BCRYPT_ALG_HANDLE hAlgRSA; BCRYPT_ALG_HANDLE hAlgDSA; @@ -99,9 +103,11 @@ struct _libssh2_wincng_ctx { BCRYPT_ALG_HANDLE hAlgAES_ECB; BCRYPT_ALG_HANDLE hAlgRC4_NA; BCRYPT_ALG_HANDLE hAlg3DES_CBC; + BCRYPT_ALG_HANDLE hAlgDH; + volatile int hasAlgDHwithKDF; /* -1=no, 0=maybe, 1=yes */ }; -struct _libssh2_wincng_ctx _libssh2_wincng; +extern struct _libssh2_wincng_ctx _libssh2_wincng; /*******************************************************************/ @@ -162,7 +168,17 @@ typedef struct __libssh2_wincng_hash_ctx { #define libssh2_sha256(data, datalen, hash) \ _libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA256, \ hash, SHA256_DIGEST_LENGTH) - +#define libssh2_sha384_ctx _libssh2_wincng_hash_ctx +#define libssh2_sha384_init(ctx) \ + (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA384, \ + SHA384_DIGEST_LENGTH, NULL, 0) == 0) +#define libssh2_sha384_update(ctx, data, datalen) \ + _libssh2_wincng_hash_update(&ctx, (unsigned char *) data, datalen) +#define libssh2_sha384_final(ctx, hash) \ + _libssh2_wincng_hash_final(&ctx, hash) +#define libssh2_sha384(data, datalen, hash) \ +_libssh2_wincng_hash(data, datalen, _libssh2_wincng.hAlgHashSHA384, \ + hash, SHA384_DIGEST_LENGTH) #define libssh2_sha512_ctx _libssh2_wincng_hash_ctx #define libssh2_sha512_init(ctx) \ (_libssh2_wincng_hash_init(ctx, _libssh2_wincng.hAlgHashSHA512, \ @@ -385,7 +401,17 @@ _libssh2_bn *_libssh2_wincng_bignum_init(void); * Windows CNG backend: Diffie-Hellman support */ -#define _libssh2_dh_ctx struct _libssh2_wincng_bignum * +typedef struct { + /* holds our private and public key components */ + BCRYPT_KEY_HANDLE dh_handle; + /* records the parsed out modulus and generator + * parameters that are shared with the peer */ + BCRYPT_DH_PARAMETER_HEADER *dh_params; + /* records the parsed out private key component for + * fallback if the DH API raw KDF is not supported */ + struct _libssh2_wincng_bignum *bn; +} _libssh2_dh_ctx; + #define libssh2_dh_init(dhctx) _libssh2_dh_init(dhctx) #define libssh2_dh_key_pair(dhctx, public, g, p, group_order, bnctx) \ _libssh2_dh_key_pair(dhctx, public, g, p, group_order) @@ -569,3 +595,5 @@ _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, _libssh2_bn *f, _libssh2_bn *p); extern void _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx); + +#endif /* __LIBSSH2_WINCNG_H */ diff --git a/vendor/libssh2/test-driver b/vendor/libssh2/test-driver index b8521a482..9759384aa 100755 --- a/vendor/libssh2/test-driver +++ b/vendor/libssh2/test-driver @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# Copyright (C) 2011-2020 Free Software Foundation, Inc. # # 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 @@ -42,11 +42,13 @@ print_usage () { cat </dev/null 2>&1;; \ esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + check recheck distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -184,8 +194,6 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no @@ -368,8 +376,8 @@ am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) -AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver @@ -390,9 +398,35 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) +DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ @@ -408,6 +442,12 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -418,6 +458,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ @@ -451,6 +492,7 @@ LIBSSL_PREFIX = @LIBSSL_PREFIX@ LIBTOOL = @LIBTOOL@ LIBZ = @LIBZ@ LIBZ_PREFIX = @LIBZ_PREFIX@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBBCRYPT = @LTLIBBCRYPT@ @@ -492,6 +534,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ @@ -539,6 +582,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ +SUBDIRS = ossfuzz AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include -I$(top_builddir)/src LDADD = ../src/libssh2.la @SSHD_TRUE@ssh2_SOURCES = ssh2.c @@ -547,25 +591,66 @@ TESTS = $(ctests) mansyntax.sh $(am__append_1) check_PROGRAMS = $(ctests) TESTS_ENVIRONMENT = SSHD=$(SSHD) EXEEXT=$(EXEEXT) \ srcdir=$(top_srcdir)/tests builddir=$(top_builddir)/tests -EXTRA_DIST = ssh2.sh mansyntax.sh etc/host etc/host.pub etc/user \ - etc/user.pub CMakeLists.txt libssh2_config_cmake.h.in \ - sshd_fixture.sh.in key_dsa key_dsa.pub key_dsa_wrong \ - key_dsa_wrong.pub key_rsa key_rsa.pub \ - openssh_server/authorized_keys openssh_server/Dockerfile \ - openssh_server/ssh_host_rsa_key openssh_fixture.c \ - openssh_fixture.h runner.c session_fixture.c session_fixture.h \ - test_hostkey.c test_hostkey_hash.c \ - test_keyboard_interactive_auth_fails_with_wrong_response.c \ - test_keyboard_interactive_auth_succeeds_with_correct_response.c \ - test_password_auth_fails_with_wrong_password.c \ - test_password_auth_fails_with_wrong_username.c \ - test_password_auth_succeeds_with_correct_credentials.c \ - test_public_key_auth_fails_with_wrong_key.c \ - test_public_key_auth_succeeds_with_correct_dsa_key.c \ - test_public_key_auth_succeeds_with_correct_rsa_key.c \ - test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c \ - $(am__append_2) -all: all-am +EXTRA_DIST = \ + CMakeLists.txt \ + etc/host \ + etc/host.pub \ + etc/user \ + etc/user.pub \ + key_dsa \ + key_dsa.pub \ + key_dsa_wrong \ + key_dsa_wrong.pub \ + key_ecdsa \ + key_ecdsa.pub \ + key_ed25519 \ + key_ed25519.pub \ + key_ed25519_encrypted \ + key_ed25519_encrypted.pub \ + key_rsa \ + key_rsa.pub \ + key_rsa_encrypted \ + key_rsa_encrypted.pub \ + key_rsa_openssh \ + key_rsa_openssh.pub \ + libssh2_config_cmake.h.in \ + mansyntax.sh \ + openssh_fixture.c \ + openssh_fixture.h \ + openssh_server/Dockerfile \ + openssh_server/authorized_keys \ + openssh_server/ca_ecdsa \ + openssh_server/ca_ecdsa.pub \ + openssh_server/ssh_host_ecdsa_key \ + openssh_server/ssh_host_ed25519_key \ + openssh_server/ssh_host_rsa_key \ + runner.c \ + session_fixture.c \ + session_fixture.h \ + simple.c \ + ssh2.c \ + ssh2.sh \ + sshd_fixture.sh.in \ + test_agent_forward_succeeds.c \ + test_hostkey.c \ + test_hostkey_hash.c \ + test_keyboard_interactive_auth_fails_with_wrong_response.c \ + test_keyboard_interactive_auth_succeeds_with_correct_response.c \ + test_password_auth_fails_with_wrong_password.c \ + test_password_auth_fails_with_wrong_username.c \ + test_password_auth_succeeds_with_correct_credentials.c \ + test_public_key_auth_fails_with_wrong_key.c \ + test_public_key_auth_succeeds_with_correct_dsa_key.c \ + test_public_key_auth_succeeds_with_correct_ed25519_key.c \ + test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c \ + test_public_key_auth_succeeds_with_correct_ecdsa_key.c \ + test_public_key_auth_succeeds_with_correct_signed_ecdsa_key.c \ + test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c \ + test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c \ + test_public_key_auth_succeeds_with_correct_rsa_key.c \ + test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c + +all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs @@ -667,14 +752,61 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am +tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ @@ -687,7 +819,7 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $$unique; \ fi; \ fi -ctags: ctags-am +ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) @@ -700,7 +832,7 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am +cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ @@ -826,7 +958,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS) test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ - echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ @@ -895,7 +1027,6 @@ ssh2.sh.log: ssh2.sh @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) - distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am @@ -929,21 +1060,47 @@ distdir-am: $(DISTFILES) || exit 1; \ fi; \ done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-am +check: check-recursive all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -installcheck: installcheck-am +installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ @@ -968,83 +1125,84 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -clean: clean-am +clean: clean-recursive clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstPROGRAMS mostlyclean-am -distclean: distclean-am +distclean: distclean-recursive -rm -f ./$(DEPDIR)/simple.Po -rm -f ./$(DEPDIR)/ssh2.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags -dvi: dvi-am +dvi: dvi-recursive dvi-am: -html: html-am +html: html-recursive html-am: -info: info-am +info: info-recursive info-am: install-data-am: -install-dvi: install-dvi-am +install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: -install-html: install-html-am +install-html: install-html-recursive install-html-am: -install-info: install-info-am +install-info: install-info-recursive install-info-am: install-man: -install-pdf: install-pdf-am +install-pdf: install-pdf-recursive install-pdf-am: -install-ps: install-ps-am +install-ps: install-ps-recursive install-ps-am: installcheck-am: -maintainer-clean: maintainer-clean-am +maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/simple.Po -rm -f ./$(DEPDIR)/ssh2.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -mostlyclean: mostlyclean-am +mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool -pdf: pdf-am +pdf: pdf-recursive pdf-am: -ps: ps-am +ps: ps-recursive ps-am: uninstall-am: -.MAKE: check-am install-am install-strip +.MAKE: $(am__recursive_targets) check-am install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ - check-am clean clean-checkPROGRAMS clean-generic clean-libtool \ +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ @@ -1053,10 +1211,10 @@ uninstall-am: install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am recheck tags tags-am uninstall \ - uninstall-am + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ + uninstall uninstall-am .PRECIOUS: Makefile diff --git a/vendor/libssh2/tests/key_ecdsa b/vendor/libssh2/tests/key_ecdsa new file mode 100644 index 000000000..6ed60773f --- /dev/null +++ b/vendor/libssh2/tests/key_ecdsa @@ -0,0 +1,10 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAiAAAABNlY2RzYS +1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQTosiScH/oRSazpIpPSEFcY4YVZyNby +peARi49N3qy78OE118KGc5T8eifd+n1PSb7z8PnfDwOL4jBHxW5nWx0RCocIt7tb2a349J +gfEl8PegHGcF/DwC+eesIKJvv0MfkAAADIKLgw6yi4MOsAAAATZWNkc2Etc2hhMi1uaXN0 +cDM4NAAAAAhuaXN0cDM4NAAAAGEE6LIknB/6EUms6SKT0hBXGOGFWcjW8qXgEYuPTd6su/ +DhNdfChnOU/Hon3fp9T0m+8/D53w8Di+IwR8VuZ1sdEQqHCLe7W9mt+PSYHxJfD3oBxnBf +w8AvnnrCCib79DH5AAAAMGYdHu+u2/L8zC/0S9bao9y6vKiLSuTEfZpCIsyE5jWj/vrS0n +r1lzv9kKj+5A86aQAAAAA= +-----END OPENSSH PRIVATE KEY----- diff --git a/vendor/libssh2/tests/key_ecdsa.pub b/vendor/libssh2/tests/key_ecdsa.pub new file mode 100644 index 000000000..597f63fcd --- /dev/null +++ b/vendor/libssh2/tests/key_ecdsa.pub @@ -0,0 +1 @@ +ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBOiyJJwf+hFJrOkik9IQVxjhhVnI1vKl4BGLj03erLvw4TXXwoZzlPx6J936fU9JvvPw+d8PA4viMEfFbmdbHREKhwi3u1vZrfj0mB8SXw96AcZwX8PAL556wgom+/Qx+Q== diff --git a/vendor/libssh2/tests/key_ed25519 b/vendor/libssh2/tests/key_ed25519 new file mode 100644 index 000000000..bfb1ad566 --- /dev/null +++ b/vendor/libssh2/tests/key_ed25519 @@ -0,0 +1,7 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6JgAAAJg8nvUxPJ71 +MQAAAAtzc2gtZWQyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6Jg +AAAECnhCuTDYdz3kUn48BXkaCXXdbKdH7wSIQ/CUx1cbnR0Ixtdyg2ZRXE70UwyPVUH3Uy +fDBV8GX5cPF636P6hjomAAAAEHdpbGxAaUN1YmUubG9jYWwBAgMEBQ== +-----END OPENSSH PRIVATE KEY----- diff --git a/vendor/libssh2/tests/key_ed25519.pub b/vendor/libssh2/tests/key_ed25519.pub new file mode 100644 index 000000000..cd592194b --- /dev/null +++ b/vendor/libssh2/tests/key_ed25519.pub @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIxtdyg2ZRXE70UwyPVUH3UyfDBV8GX5cPF636P6hjom diff --git a/vendor/libssh2/tests/key_ed25519_encrypted b/vendor/libssh2/tests/key_ed25519_encrypted new file mode 100644 index 000000000..109de4448 --- /dev/null +++ b/vendor/libssh2/tests/key_ed25519_encrypted @@ -0,0 +1,8 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABD4qdu8J/ +EAqXFQERrvzMerAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAICHxEyUTOVHXvdMF +ARedFQ+H9DW/n8Zy3daKKRqnTDMqAAAAoO05oxXUkLz8cMQcMeeRSc4UvsaWnCvfN4Qm15 +NaVwSjb/09AcGGVeF1xxwPEIjwsIRftAjjgLuauI6XpXzyeDOlr2HnwzgpZtmeaHzbB7lS +NjpSENP+fXipXinSfgZqGOItPbbismEVWX4sQn/Zla6/f/JAcDV60TK2ZhVEZ5072t0NcA +eZQeSzBnpoRhlB7IDO7/7pmu1kNysUzH94Bw8= +-----END OPENSSH PRIVATE KEY----- diff --git a/vendor/libssh2/tests/key_ed25519_encrypted.pub b/vendor/libssh2/tests/key_ed25519_encrypted.pub new file mode 100644 index 000000000..bc331555a --- /dev/null +++ b/vendor/libssh2/tests/key_ed25519_encrypted.pub @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICHxEyUTOVHXvdMFARedFQ+H9DW/n8Zy3daKKRqnTDMq diff --git a/vendor/libssh2/tests/key_rsa_encrypted b/vendor/libssh2/tests/key_rsa_encrypted new file mode 100644 index 000000000..2f5e05752 --- /dev/null +++ b/vendor/libssh2/tests/key_rsa_encrypted @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,E030CC29AE4C20669EE41DF3DE4C0886 + +gLMMWawVUpqtAtpSVnr7HcH+P0gHKFU00hUhNY18TNJRfFIhPqc9R9xsLHgBac7k +vHtD2nzUuWLVMIKQoS3+1IF/KO6Xj1zSqnyk49hyKWxFiD3U1YdZAiZNgJ/s6olg +J/h4mNNsz8Nh6Swp3HwP2jtLHWHV8fOzsaE3dvnVYZ5gPnec7XAYcQycbOV0t2Wd +NGlP09ooAQRWWuf1TaBewjj7Jm40l8OQat5EKZKzydUZZQYAqfJQ7fIw7jI/lQYF +KJj9tq0ceFdxvk8LYMr5a+ixnDwirxgg4L0X3fjLocfLVt42qDKkfOGXGg9VI8CO +gjTu/MbodGCWKe/5eeCSSLrKo486S/5B6RzN0Ax4QBb1iYAN5IECsV91Ekk0socY +DBZmDMEGHppHJhNhbBzfMYeKssWbOQf9z0y+gDPesImV2gXNoMgTcmZrCLOJWj6L +ifQAtTKc8P5fV+TLhg3dKmxCt1UMlCHpWWl7tPTsO3WaaXi50f9ypRfpbpH0hket +SO//bZqF0lF+Ci8uC6ndXBniIfinFoMWPsY01bxyHvmEMwCTVApZEkrZtGlHnavy +d2oYJ0Oc+eeSjnx2BccQ9GdoI3292CVJVgPiibr42updecFwTry+j//IY8H3d62m +UYUXJQgIL04o2/1UIT0mPWwPigF3sJSZOwT5arn4MgUyBCC18p6OTmGmvIyrz3YB +imbhndok/30sMwtJocgXKTdyreMUp0s8Hpw/2z4LQ0qlOstKwa8KnDcFAqaSFNGD +8tGTobAcGRhqq93PRrn3aRibk1T3KDpMF/oqRaajgBmXFVYOk1yuLy6meB+wAJFD +VVIokZaygYs13SMX+hau0Gd6PmVh8QF0RmvG69ga7k4dfJMbe2uU59wf9uABmyvd ++Ju+uXGiF0wYfcyv6HJarPIqA3630TPKR/z8dDWC3rJ83xx7hIpoEAA+b7RA3Vtx +Gv0EoDK6zeq4UJK0tqxMZJuy+FHBDZhv+gAeB/PmIGPIbF+jV+flmCrUgHg2Ka8I +Iaap+lQKMj5lzOv/1bbcZ6cpj717MGvo3XOwOD4x5b3wRX6DWphB0+oRWiVU3Vrd +PiZ0gtlX31Rj+h+QB4DrMKZWMu++qEDF6NPLz2ktNcjOYBT29VVqX8ALKKFO+jOK +ZASnUXXE3XnwbccwU9VIQ+3mom3K+GjJRGxsWNZsrPy364eQHckomcOptgk5ldI1 +eF7t5w0xQ4hx6jrJBcKJL29SQAcmUO+vu+6Vg6synBpnlqM9mSe8Xlo3SQ9bROJ9 +1unhrml0Jr1tJZfbM/kX7xhFUVc2kQHqYz6pwYl3fYceHk5dVj9IWaJj82Sfi1QQ +il3DQb9t3y4oJcYQxR9OzyjiKPiCAkIDakYshZP/bb/ZfDy1szIIL0e3mKLUcdFc +3sqAvcBsPt+SngnTtodkAK1ddTuxjHUN3+XpIAUoNtqv02g47JCmvSQ0NGsPyXIz +2krWQoMlmYaG3N74ybMajTXW3Y8+wbe5moJ+Yt4bPUo61d8rMOVI/+3lU7YIyUj1 +TqbwgHCvZRvaiXJQbC9lP7mbQipQhtwQgGMw9TdQB/oHldmDNETF4eNX11LC73+G +-----END RSA PRIVATE KEY----- diff --git a/vendor/libssh2/tests/key_rsa_encrypted.pub b/vendor/libssh2/tests/key_rsa_encrypted.pub new file mode 100644 index 000000000..5c041d8e0 --- /dev/null +++ b/vendor/libssh2/tests/key_rsa_encrypted.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC92YlGoc4PJy6DzX916JJZhxkvmkWBLGJdWOL7R9B6iaYEKebBxzTE3P1RcnxnuI06kklVq/KcDP9sLlgawTZcDg7ifM7HncPOi18OON8vvVVzodikHzuupjhpI5YTT9wwV2fDVi2URsBjvX4AFiZ5WM3/NwqdKpYABzWieBikXGJ58Tsnw+zQw2qMmKKESBuzSN538loTAj5iEH/GAKYDbbH9t2a17qhNCNEw4vrtURT9JqwO1cOg7N1OKpmqCPEbK0wuSTljNC230VJ06X/8UqahWWSH6MreGy6gwpPi6i9wFiFLur301R0dTPiKVhz6bguhcC1EAlhSgjfelFJt awl03@bounty diff --git a/vendor/libssh2/tests/key_rsa_openssh b/vendor/libssh2/tests/key_rsa_openssh new file mode 100644 index 000000000..3562a1636 --- /dev/null +++ b/vendor/libssh2/tests/key_rsa_openssh @@ -0,0 +1,27 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn +NhAAAAAwEAAQAAAQEA03tZTdi/8nrdDGtSc15EH97dX/qWrgC3nNhbBmcvOykSVtQDsXE0 +4nj45RcD9cn0itZVl0Prn9G+tYJCqqkedhQ5MtuByVrmJX15REDJ9nfzzQzVQw2zuE1ysj +ccVBxSeqmDDXeJFozh/uq5mKFirFlft5g0Wx2oG1TxGC/MHqfDk6ijqq7lS1T82cmGZAbZ ++FzhYulBPFioklXStQJtTuVMb5Q/ebd9nmHIesEPWs4DKo2urKXvy+VCYD/N0GRZJ1Qt8D +2VpI6qJlRapdBaWkHJRDcMmPzmTMa9HE/3+2wi+rOAP9V6W7BpgtMWpOP0xx2zp/tC3SHo +9pxlfCRaEQAAA8gL9Cg6C/QoOgAAAAdzc2gtcnNhAAABAQDTe1lN2L/yet0Ma1JzXkQf3t +1f+pauALec2FsGZy87KRJW1AOxcTTiePjlFwP1yfSK1lWXQ+uf0b61gkKqqR52FDky24HJ +WuYlfXlEQMn2d/PNDNVDDbO4TXKyNxxUHFJ6qYMNd4kWjOH+6rmYoWKsWV+3mDRbHagbVP +EYL8wep8OTqKOqruVLVPzZyYZkBtn4XOFi6UE8WKiSVdK1Am1O5UxvlD95t32eYch6wQ9a +zgMqja6spe/L5UJgP83QZFknVC3wPZWkjqomVFql0FpaQclENwyY/OZMxr0cT/f7bCL6s4 +A/1XpbsGmC0xak4/THHbOn+0LdIej2nGV8JFoRAAAAAwEAAQAAAQAykM27lVXf7oyoCYk/ +WIzFag5YgpxAop9Ee17YWxep95oQ9MSlSsIwXGh2rlgeDtnP0IvKjUzre8UztR+nmqRT62 +X5yQ5xTLC2yheSwEMKEYhTwPvE+qO8L5h7ED5Pxi3acmmJcMlwgOMQhqM14XCscPo39cae ++qpVTqwO8m7F7Tu/GCQWKTDE6FekoX13/bYbnsgd7FZGTyc37rQ2kuergYeIRewrdTD3JB +ne6LmRVbMEuGh9WbXfXFLr+5p79xgnTPs+whdoyQTY8+O3052D8yMV7UcU+T9A0zHFyU9E +VT/SvTgMTF7icThTtVR6Vn095ahe77wh363N0JEe1rwBAAAAgQCSqhkKVowJSPw+Ho6PNk +lKcXWCutA8sVg+x+MaIdnzTe9TbxItm/XW4zj1Ax1rJeEgAaCKQVwH5oJDeC3awNZZ5ZY9 +GK6h4ueyolzVP5wwalR9HeY/S+wdRgaIvYmIpHewLAj/o5ykE2Ijzgf3+HdaNlRxwWXz1i +8ArMV1AwB8WwAAAIEA75OHcAo8RUM7EoU165FZp7nqBphKuGMb8Os/p2xbNC8MYz5CyDXy +fzYZC3i67uGXyTTVLtl54+kzuciuZ/qLHJT49JY/AtOm+rmpXKACNQIZeEnCML8AewLDEg +ugXuFCMIFR4/fupCjGv/tTVHvsh6LJ/td3+DQmisVG3uDnGDEAAACBAOH6xeQ5Z/VPFV1b ++ZxutTMjFghLce50L6fSHpBbIN00vS+9I4TmXYI1XFvaFjHShYUrFifWiMFGBNjuoqRY+c +9/8UDvptdiXLqqLkw3SNB/UqUQRtZkD384Eazxud+FMfMguFBrgmkWYwAh9EVAzXrbzxQd +U9To5SerEitsWsfhAAAAEHdpbGxAaUN1YmUubG9jYWwBAg== +-----END OPENSSH PRIVATE KEY----- diff --git a/vendor/libssh2/tests/key_rsa_openssh.pub b/vendor/libssh2/tests/key_rsa_openssh.pub new file mode 100644 index 000000000..9fc4ac274 --- /dev/null +++ b/vendor/libssh2/tests/key_rsa_openssh.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTe1lN2L/yet0Ma1JzXkQf3t1f+pauALec2FsGZy87KRJW1AOxcTTiePjlFwP1yfSK1lWXQ+uf0b61gkKqqR52FDky24HJWuYlfXlEQMn2d/PNDNVDDbO4TXKyNxxUHFJ6qYMNd4kWjOH+6rmYoWKsWV+3mDRbHagbVPEYL8wep8OTqKOqruVLVPzZyYZkBtn4XOFi6UE8WKiSVdK1Am1O5UxvlD95t32eYch6wQ9azgMqja6spe/L5UJgP83QZFknVC3wPZWkjqomVFql0FpaQclENwyY/OZMxr0cT/f7bCL6s4A/1XpbsGmC0xak4/THHbOn+0LdIej2nGV8JFoR will@iCube.local diff --git a/vendor/libssh2/tests/openssh_fixture.c b/vendor/libssh2/tests/openssh_fixture.c index 093f31e0e..0480c5d54 100644 --- a/vendor/libssh2/tests/openssh_fixture.c +++ b/vendor/libssh2/tests/openssh_fixture.c @@ -62,10 +62,12 @@ static int run_command_varg(char **output, const char *command, va_list args) { FILE *pipe; + char redirect_stderr[] = "%s 2>&1"; char command_buf[BUFSIZ]; char buf[BUFSIZ]; - char *p; int ret; + size_t buf_len; + if(output) { *output = NULL; } @@ -78,26 +80,33 @@ static int run_command_varg(char **output, const char *command, va_list args) } /* Rewrite the command to redirect stderr to stdout to we can output it */ - if(strlen(command_buf) + 6 >= sizeof(command_buf)) { + if(strlen(command_buf) + strlen(redirect_stderr) >= sizeof(buf)) { fprintf(stderr, "Unable to rewrite command (%s)\n", command); return -1; } - strncat(command_buf, " 2>&1", 6); + ret = snprintf(buf, sizeof(buf), redirect_stderr, command_buf); + if(ret < 0 || ret >= BUFSIZ) { + fprintf(stderr, "Unable to rewrite command (%s)\n", command); + return -1; + } fprintf(stdout, "Command: %s\n", command); #ifdef WIN32 - pipe = _popen(command_buf, "r"); + pipe = _popen(buf, "r"); #else - pipe = popen(command_buf, "r"); + pipe = popen(buf, "r"); #endif if(!pipe) { fprintf(stderr, "Unable to execute command '%s'\n", command); return -1; } - p = buf; - while(fgets(p, sizeof(buf) - (p - buf), pipe) != NULL) - ; + buf[0] = 0; + buf_len = 0; + while(buf_len < (sizeof(buf) - 1) && + fgets(&buf[buf_len], sizeof(buf) - buf_len, pipe) != NULL) { + buf_len = strlen(buf); + } #ifdef WIN32 ret = _pclose(pipe); @@ -112,9 +121,9 @@ static int run_command_varg(char **output, const char *command, va_list args) if(output) { /* command output may contain a trailing newline, so we trim * whitespace here */ - size_t end = strlen(buf) - 1; - while(end > 0 && isspace(buf[end])) { - buf[end] = '\0'; + size_t end = strlen(buf); + while(end > 0 && isspace(buf[end - 1])) { + buf[end - 1] = '\0'; } *output = strdup(buf); @@ -134,16 +143,31 @@ static int run_command(char **output, const char *command, ...) return ret; } -static int build_openssh_server_docker_image() +static int build_openssh_server_docker_image(void) { - return run_command(NULL, "docker build -t libssh2/openssh_server openssh_server"); + return run_command(NULL, "docker build -t libssh2/openssh_server " + "openssh_server"); +} + +static const char *openssh_server_port(void) +{ + return getenv("OPENSSH_SERVER_PORT"); } static int start_openssh_server(char **container_id_out) { - return run_command(container_id_out, - "docker run --detach -P libssh2/openssh_server" - ); + const char *container_host_port = openssh_server_port(); + if(container_host_port != NULL) { + return run_command(container_id_out, + "docker run --rm -d -p %s:22 " + "libssh2/openssh_server", + container_host_port); + } + else { + return run_command(container_id_out, + "docker run --rm -d -p 22 " + "libssh2/openssh_server"); + } } static int stop_openssh_server(char *container_id) @@ -151,11 +175,48 @@ static int stop_openssh_server(char *container_id) return run_command(NULL, "docker stop %s", container_id); } -static const char *docker_machine_name() +static const char *docker_machine_name(void) { return getenv("DOCKER_MACHINE_NAME"); } +static int is_running_inside_a_container() +{ +#ifdef WIN32 + return 0; +#else + const char *cgroup_filename = "/proc/self/cgroup"; + FILE *f = NULL; + char *line = NULL; + size_t len = 0; + ssize_t read = 0; + int found = 0; + f = fopen(cgroup_filename, "r"); + if(f == NULL) { + /* Don't go further, we are not in a container */ + return 0; + } + while((read = getline(&line, &len, f)) != -1) { + if(strstr(line, "docker") != NULL) { + found = 1; + break; + } + } + fclose(f); + free(line); + return found; +#endif +} + +static unsigned int portable_sleep(unsigned int seconds) +{ +#ifdef WIN32 + Sleep(seconds); +#else + sleep(seconds); +#endif +} + static int ip_address_from_container(char *container_id, char **ip_address_out) { const char *active_docker_machine = docker_machine_name(); @@ -167,9 +228,12 @@ static int ip_address_from_container(char *container_id, char **ip_address_out) int attempt_no = 0; int wait_time = 500; for(;;) { - return run_command(ip_address_out, "docker-machine ip %s", active_docker_machine); - - if(attempt_no > 5) { + int ret = run_command(ip_address_out, "docker-machine ip %s", + active_docker_machine); + if(ret == 0) { + return 0; + } + else if(attempt_no > 5) { fprintf( stderr, "Unable to get IP from docker-machine after %d attempts\n", @@ -177,35 +241,44 @@ static int ip_address_from_container(char *container_id, char **ip_address_out) return -1; } else { -#ifdef WIN32 -#pragma warning(push) -#pragma warning(disable : 4996) - _sleep(wait_time); -#pragma warning(pop) -#else - sleep(wait_time); -#endif + portable_sleep(wait_time); ++attempt_no; wait_time *= 2; } } } else { - return run_command(ip_address_out, - "docker inspect --format " - "\"{{ index (index (index .NetworkSettings.Ports " - "\\\"22/tcp\\\") 0) \\\"HostIp\\\" }}\" %s", - container_id); + if(is_running_inside_a_container()) { + return run_command(ip_address_out, + "docker inspect --format " + "\"{{ .NetworkSettings.IPAddress }}\"" + " %s", + container_id); + } + else { + return run_command(ip_address_out, + "docker inspect --format " + "\"{{ index (index (index " + ".NetworkSettings.Ports " + "\\\"22/tcp\\\") 0) \\\"HostIp\\\" }}\" %s", + container_id); + } } } static int port_from_container(char *container_id, char **port_out) { - return run_command(port_out, - "docker inspect --format " - "\"{{ index (index (index .NetworkSettings.Ports " - "\\\"22/tcp\\\") 0) \\\"HostPort\\\" }}\" %s", - container_id); + if(is_running_inside_a_container()) { + *port_out = strdup("22"); + return 0; + } + else { + return run_command(port_out, + "docker inspect --format " + "\"{{ index (index (index .NetworkSettings.Ports " + "\\\"22/tcp\\\") 0) \\\"HostPort\\\" }}\" %s", + container_id); + } } static int open_socket_to_container(char *container_id) @@ -215,20 +288,31 @@ static int open_socket_to_container(char *container_id) unsigned long hostaddr; int sock; struct sockaddr_in sin; + int counter = 0; int ret = ip_address_from_container(container_id, &ip_address); if(ret != 0) { - fprintf(stderr, "Failed to get IP address for container %s\n", container_id); + fprintf(stderr, "Failed to get IP address for container %s\n", + container_id); ret = -1; goto cleanup; } ret = port_from_container(container_id, &port_string); if(ret != 0) { - fprintf(stderr, "Failed to get port for container %s\n", container_id); + fprintf(stderr, "Failed to get port for container %s\n", + container_id); ret = -1; } + /* 0.0.0.0 is returned by Docker for Windows, because the container + is reachable from anywhere. But we cannot connect to 0.0.0.0, + instead we assume localhost and try to connect to 127.0.0.1. */ + if(ip_address && strcmp(ip_address, "0.0.0.0") == 0) { + free(ip_address); + ip_address = strdup("127.0.0.1"); + } + hostaddr = inet_addr(ip_address); if(hostaddr == (unsigned long)(-1)) { fprintf(stderr, "Failed to convert %s host address\n", ip_address); @@ -247,15 +331,26 @@ static int open_socket_to_container(char *container_id) sin.sin_port = htons((short)strtol(port_string, NULL, 0)); sin.sin_addr.s_addr = hostaddr; - if(connect(sock, (struct sockaddr *)(&sin), - sizeof(struct sockaddr_in)) != 0) { - fprintf(stderr, "Failed to connect to %s:%s\n", ip_address, port_string); - ret = -1; + for(counter = 0; counter < 3; ++counter) { + if(connect(sock, (struct sockaddr *)(&sin), + sizeof(struct sockaddr_in)) != 0) { + ret = -1; + fprintf(stderr, + "Connection to %s:%s attempt #%d failed: retrying...\n", + ip_address, port_string, counter); + portable_sleep(1 + 2*counter); + } + else { + ret = sock; + break; + } + } + if(ret == -1) { + fprintf(stderr, "Failed to connect to %s:%s\n", + ip_address, port_string); goto cleanup; } - ret = sock; - cleanup: free(ip_address); free(port_string); diff --git a/vendor/libssh2/tests/openssh_server/Dockerfile b/vendor/libssh2/tests/openssh_server/Dockerfile index 72e24bfe3..c5ce2224d 100644 --- a/vendor/libssh2/tests/openssh_server/Dockerfile +++ b/vendor/libssh2/tests/openssh_server/Dockerfile @@ -58,10 +58,19 @@ COPY ssh_host_ed25519_key /tmp/etc/ssh/ssh_host_ed25519_key RUN mv /tmp/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_ed25519_key RUN chmod 600 /etc/ssh/ssh_host_ed25519_key +COPY ca_ecdsa.pub /tmp/etc/ssh/ca_ecdsa.pub +RUN mv /tmp/etc/ssh/ca_ecdsa.pub /etc/ssh/ca_ecdsa.pub +RUN chmod 600 /etc/ssh/ca_ecdsa.pub + +COPY ca_ecdsa /tmp/etc/ssh/ca_ecdsa +RUN mv /tmp/etc/ssh/ca_ecdsa /etc/ssh/ca_ecdsa +RUN chmod 600 /etc/ssh/ca_ecdsa + RUN adduser --disabled-password --gecos 'Test user for libssh2 integration tests' libssh2 RUN echo 'libssh2:my test password' | chpasswd RUN sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config +RUN echo "TrustedUserCAKeys /etc/ssh/ca_ecdsa.pub" >> /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd diff --git a/vendor/libssh2/tests/openssh_server/authorized_keys b/vendor/libssh2/tests/openssh_server/authorized_keys index 870f9a2f2..cdd6eef50 100644 --- a/vendor/libssh2/tests/openssh_server/authorized_keys +++ b/vendor/libssh2/tests/openssh_server/authorized_keys @@ -4,3 +4,4 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC92YlGoc4PJy6DzX916JJZhxkvmkWBLGJdWOL7R9B6 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTe1lN2L/yet0Ma1JzXkQf3t1f+pauALec2FsGZy87KRJW1AOxcTTiePjlFwP1yfSK1lWXQ+uf0b61gkKqqR52FDky24HJWuYlfXlEQMn2d/PNDNVDDbO4TXKyNxxUHFJ6qYMNd4kWjOH+6rmYoWKsWV+3mDRbHagbVPEYL8wep8OTqKOqruVLVPzZyYZkBtn4XOFi6UE8WKiSVdK1Am1O5UxvlD95t32eYch6wQ9azgMqja6spe/L5UJgP83QZFknVC3wPZWkjqomVFql0FpaQclENwyY/OZMxr0cT/f7bCL6s4A/1XpbsGmC0xak4/THHbOn+0LdIej2nGV8JFoR ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIxtdyg2ZRXE70UwyPVUH3UyfDBV8GX5cPF636P6hjom ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICHxEyUTOVHXvdMFARedFQ+H9DW/n8Zy3daKKRqnTDMq +ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBOiyJJwf+hFJrOkik9IQVxjhhVnI1vKl4BGLj03erLvw4TXXwoZzlPx6J936fU9JvvPw+d8PA4viMEfFbmdbHREKhwi3u1vZrfj0mB8SXw96AcZwX8PAL556wgom+/Qx+Q== diff --git a/vendor/libssh2/tests/openssh_server/ca_ecdsa b/vendor/libssh2/tests/openssh_server/ca_ecdsa new file mode 100644 index 000000000..d6b670c58 --- /dev/null +++ b/vendor/libssh2/tests/openssh_server/ca_ecdsa @@ -0,0 +1,12 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAArAAAABNlY2RzYS +1zaGEyLW5pc3RwNTIxAAAACG5pc3RwNTIxAAAAhQQAfv15s+G2xg56J+audKAM4G9qOTFr +bZRo0CTwvkb/oHrf9/2RSWqYsx/0m5mYCZVlecnZqwRHAOolXbc/Yb4cGjsALUj3UDirsn +YR7Ve+SwnunkpvW/H3a98sA3sS+HCpd5RbpfWClSBOI9JEAlPtS1CrEQ7EmO7hmlFOH2cL +0qfHCyYAAAEA763VSe+t1UkAAAATZWNkc2Etc2hhMi1uaXN0cDUyMQAAAAhuaXN0cDUyMQ +AAAIUEAH79ebPhtsYOeifmrnSgDOBvajkxa22UaNAk8L5G/6B63/f9kUlqmLMf9JuZmAmV +ZXnJ2asERwDqJV23P2G+HBo7AC1I91A4q7J2Ee1XvksJ7p5Kb1vx92vfLAN7EvhwqXeUW6 +X1gpUgTiPSRAJT7UtQqxEOxJju4ZpRTh9nC9KnxwsmAAAAQgD8VJwi9RHYN13CAfhvdmjW +xVjH55J5jDjPlENU2Z+cnm01SQ+9mPFEY4wDSvfiovD1VstNJX/P97WbHw+e5XL+HwAAAA +JDQQ== +-----END OPENSSH PRIVATE KEY----- diff --git a/vendor/libssh2/tests/openssh_server/ca_ecdsa.pub b/vendor/libssh2/tests/openssh_server/ca_ecdsa.pub new file mode 100644 index 000000000..5086eabe4 --- /dev/null +++ b/vendor/libssh2/tests/openssh_server/ca_ecdsa.pub @@ -0,0 +1 @@ +ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAB+/Xmz4bbGDnon5q50oAzgb2o5MWttlGjQJPC+Rv+get/3/ZFJapizH/SbmZgJlWV5ydmrBEcA6iVdtz9hvhwaOwAtSPdQOKuydhHtV75LCe6eSm9b8fdr3ywDexL4cKl3lFul9YKVIE4j0kQCU+1LUKsRDsSY7uGaUU4fZwvSp8cLJg== CA diff --git a/vendor/libssh2/tests/openssh_server/ssh_host_ecdsa_key b/vendor/libssh2/tests/openssh_server/ssh_host_ecdsa_key new file mode 100644 index 000000000..0164b523e --- /dev/null +++ b/vendor/libssh2/tests/openssh_server/ssh_host_ecdsa_key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIKdqGrp+52U1ehslMI4fX0cmvgHFmKSkMzQGmj6B07ecoAoGCCqGSM49 +AwEHoUQDQgAEL7+zLJ4okP10LZkf1DuIkZF5HhgzetQIyxLKeTJeiN19IKUYIxjs +m9aW3fQRKNi/GhN9JEbHpa9qpgr+8+hhDg== +-----END EC PRIVATE KEY----- diff --git a/vendor/libssh2/tests/openssh_server/ssh_host_ed25519_key b/vendor/libssh2/tests/openssh_server/ssh_host_ed25519_key new file mode 100644 index 000000000..bfb1ad566 --- /dev/null +++ b/vendor/libssh2/tests/openssh_server/ssh_host_ed25519_key @@ -0,0 +1,7 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6JgAAAJg8nvUxPJ71 +MQAAAAtzc2gtZWQyNTUxOQAAACCMbXcoNmUVxO9FMMj1VB91MnwwVfBl+XDxet+j+oY6Jg +AAAECnhCuTDYdz3kUn48BXkaCXXdbKdH7wSIQ/CUx1cbnR0Ixtdyg2ZRXE70UwyPVUH3Uy +fDBV8GX5cPF636P6hjomAAAAEHdpbGxAaUN1YmUubG9jYWwBAgMEBQ== +-----END OPENSSH PRIVATE KEY----- diff --git a/vendor/libssh2/tests/ossfuzz/Makefile.am b/vendor/libssh2/tests/ossfuzz/Makefile.am new file mode 100644 index 000000000..a7e95825a --- /dev/null +++ b/vendor/libssh2/tests/ossfuzz/Makefile.am @@ -0,0 +1,32 @@ +AM_CPPFLAGS = -I$(top_builddir)/include +LDADD = $(top_builddir)/src/libssh2.la + +if USE_OSSFUZZ_FLAG +FUZZ_FLAG = $(LIB_FUZZING_ENGINE) +else +if USE_OSSFUZZ_STATIC +LDADD += $(LIB_FUZZING_ENGINE) +FUZZ_FLAG = +else +LDADD += libstandaloneengine.a +FUZZ_FLAG = +endif +endif + +noinst_PROGRAMS = +noinst_LIBRARIES = + +if USE_OSSFUZZERS +noinst_PROGRAMS += \ + ssh2_client_fuzzer + +noinst_LIBRARIES += \ + libstandaloneengine.a +endif + +ssh2_client_fuzzer_SOURCES = ssh2_client_fuzzer.cc testinput.h +ssh2_client_fuzzer_CXXFLAGS = $(AM_CXXFLAGS) $(FUZZ_FLAG) +ssh2_client_fuzzer_LDFLAGS = $(AM_LDFLAGS) -static + +libstandaloneengine_a_SOURCES = standaloneengine.cc +libstandaloneengine_a_CXXFLAGS = $(AM_CXXFLAGS) diff --git a/vendor/libssh2/tests/ossfuzz/Makefile.in b/vendor/libssh2/tests/ossfuzz/Makefile.in new file mode 100644 index 000000000..9fa6d259c --- /dev/null +++ b/vendor/libssh2/tests/ossfuzz/Makefile.in @@ -0,0 +1,731 @@ +# Makefile.in generated by automake 1.16.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_TRUE@am__append_1 = $(LIB_FUZZING_ENGINE) +@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_FALSE@am__append_2 = libstandaloneengine.a +noinst_PROGRAMS = $(am__EXEEXT_1) +@USE_OSSFUZZERS_TRUE@am__append_3 = \ +@USE_OSSFUZZERS_TRUE@ ssh2_client_fuzzer + +@USE_OSSFUZZERS_TRUE@am__append_4 = \ +@USE_OSSFUZZERS_TRUE@ libstandaloneengine.a + +subdir = tests/ossfuzz +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/libssh2_config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@USE_OSSFUZZERS_TRUE@am__EXEEXT_1 = ssh2_client_fuzzer$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libstandaloneengine_a_AR = $(AR) $(ARFLAGS) +libstandaloneengine_a_LIBADD = +am_libstandaloneengine_a_OBJECTS = \ + libstandaloneengine_a-standaloneengine.$(OBJEXT) +libstandaloneengine_a_OBJECTS = $(am_libstandaloneengine_a_OBJECTS) +am_ssh2_client_fuzzer_OBJECTS = \ + ssh2_client_fuzzer-ssh2_client_fuzzer.$(OBJEXT) +ssh2_client_fuzzer_OBJECTS = $(am_ssh2_client_fuzzer_OBJECTS) +ssh2_client_fuzzer_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +ssh2_client_fuzzer_DEPENDENCIES = $(top_builddir)/src/libssh2.la \ + $(am__DEPENDENCIES_2) $(am__append_2) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +ssh2_client_fuzzer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(ssh2_client_fuzzer_CXXFLAGS) $(CXXFLAGS) \ + $(ssh2_client_fuzzer_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = \ + ./$(DEPDIR)/libstandaloneengine_a-standaloneengine.Po \ + ./$(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Po +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libstandaloneengine_a_SOURCES) \ + $(ssh2_client_fuzzer_SOURCES) +DIST_SOURCES = $(libstandaloneengine_a_SOURCES) \ + $(ssh2_client_fuzzer_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_LIBBCRYPT = @HAVE_LIBBCRYPT@ +HAVE_LIBCRYPT32 = @HAVE_LIBCRYPT32@ +HAVE_LIBGCRYPT = @HAVE_LIBGCRYPT@ +HAVE_LIBMBEDCRYPTO = @HAVE_LIBMBEDCRYPTO@ +HAVE_LIBSSL = @HAVE_LIBSSL@ +HAVE_LIBZ = @HAVE_LIBZ@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBBCRYPT = @LIBBCRYPT@ +LIBBCRYPT_PREFIX = @LIBBCRYPT_PREFIX@ +LIBCRYPT32 = @LIBCRYPT32@ +LIBCRYPT32_PREFIX = @LIBCRYPT32_PREFIX@ +LIBGCRYPT = @LIBGCRYPT@ +LIBGCRYPT_PREFIX = @LIBGCRYPT_PREFIX@ +LIBMBEDCRYPTO = @LIBMBEDCRYPTO@ +LIBMBEDCRYPTO_PREFIX = @LIBMBEDCRYPTO_PREFIX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSREQUIRED = @LIBSREQUIRED@ +LIBSSH2VER = @LIBSSH2VER@ +LIBSSL = @LIBSSL@ +LIBSSL_PREFIX = @LIBSSL_PREFIX@ +LIBTOOL = @LIBTOOL@ +LIBZ = @LIBZ@ +LIBZ_PREFIX = @LIBZ_PREFIX@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBBCRYPT = @LTLIBBCRYPT@ +LTLIBCRYPT32 = @LTLIBCRYPT32@ +LTLIBGCRYPT = @LTLIBGCRYPT@ +LTLIBMBEDCRYPTO = @LTLIBMBEDCRYPTO@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBSSL = @LTLIBSSL@ +LTLIBZ = @LTLIBZ@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SSHD = @SSHD@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I$(top_builddir)/include +LDADD = $(top_builddir)/src/libssh2.la $(am__append_1) $(am__append_2) +@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_FALSE@FUZZ_FLAG = +@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_TRUE@FUZZ_FLAG = +@USE_OSSFUZZ_FLAG_TRUE@FUZZ_FLAG = $(LIB_FUZZING_ENGINE) +noinst_LIBRARIES = $(am__append_4) +ssh2_client_fuzzer_SOURCES = ssh2_client_fuzzer.cc testinput.h +ssh2_client_fuzzer_CXXFLAGS = $(AM_CXXFLAGS) $(FUZZ_FLAG) +ssh2_client_fuzzer_LDFLAGS = $(AM_LDFLAGS) -static +libstandaloneengine_a_SOURCES = standaloneengine.cc +libstandaloneengine_a_CXXFLAGS = $(AM_CXXFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/ossfuzz/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/ossfuzz/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libstandaloneengine.a: $(libstandaloneengine_a_OBJECTS) $(libstandaloneengine_a_DEPENDENCIES) $(EXTRA_libstandaloneengine_a_DEPENDENCIES) + $(AM_V_at)-rm -f libstandaloneengine.a + $(AM_V_AR)$(libstandaloneengine_a_AR) libstandaloneengine.a $(libstandaloneengine_a_OBJECTS) $(libstandaloneengine_a_LIBADD) + $(AM_V_at)$(RANLIB) libstandaloneengine.a + +ssh2_client_fuzzer$(EXEEXT): $(ssh2_client_fuzzer_OBJECTS) $(ssh2_client_fuzzer_DEPENDENCIES) $(EXTRA_ssh2_client_fuzzer_DEPENDENCIES) + @rm -f ssh2_client_fuzzer$(EXEEXT) + $(AM_V_CXXLD)$(ssh2_client_fuzzer_LINK) $(ssh2_client_fuzzer_OBJECTS) $(ssh2_client_fuzzer_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstandaloneengine_a-standaloneengine.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +libstandaloneengine_a-standaloneengine.o: standaloneengine.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstandaloneengine_a_CXXFLAGS) $(CXXFLAGS) -MT libstandaloneengine_a-standaloneengine.o -MD -MP -MF $(DEPDIR)/libstandaloneengine_a-standaloneengine.Tpo -c -o libstandaloneengine_a-standaloneengine.o `test -f 'standaloneengine.cc' || echo '$(srcdir)/'`standaloneengine.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstandaloneengine_a-standaloneengine.Tpo $(DEPDIR)/libstandaloneengine_a-standaloneengine.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='standaloneengine.cc' object='libstandaloneengine_a-standaloneengine.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstandaloneengine_a_CXXFLAGS) $(CXXFLAGS) -c -o libstandaloneengine_a-standaloneengine.o `test -f 'standaloneengine.cc' || echo '$(srcdir)/'`standaloneengine.cc + +libstandaloneengine_a-standaloneengine.obj: standaloneengine.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstandaloneengine_a_CXXFLAGS) $(CXXFLAGS) -MT libstandaloneengine_a-standaloneengine.obj -MD -MP -MF $(DEPDIR)/libstandaloneengine_a-standaloneengine.Tpo -c -o libstandaloneengine_a-standaloneengine.obj `if test -f 'standaloneengine.cc'; then $(CYGPATH_W) 'standaloneengine.cc'; else $(CYGPATH_W) '$(srcdir)/standaloneengine.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstandaloneengine_a-standaloneengine.Tpo $(DEPDIR)/libstandaloneengine_a-standaloneengine.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='standaloneengine.cc' object='libstandaloneengine_a-standaloneengine.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libstandaloneengine_a_CXXFLAGS) $(CXXFLAGS) -c -o libstandaloneengine_a-standaloneengine.obj `if test -f 'standaloneengine.cc'; then $(CYGPATH_W) 'standaloneengine.cc'; else $(CYGPATH_W) '$(srcdir)/standaloneengine.cc'; fi` + +ssh2_client_fuzzer-ssh2_client_fuzzer.o: ssh2_client_fuzzer.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ssh2_client_fuzzer_CXXFLAGS) $(CXXFLAGS) -MT ssh2_client_fuzzer-ssh2_client_fuzzer.o -MD -MP -MF $(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Tpo -c -o ssh2_client_fuzzer-ssh2_client_fuzzer.o `test -f 'ssh2_client_fuzzer.cc' || echo '$(srcdir)/'`ssh2_client_fuzzer.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Tpo $(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssh2_client_fuzzer.cc' object='ssh2_client_fuzzer-ssh2_client_fuzzer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ssh2_client_fuzzer_CXXFLAGS) $(CXXFLAGS) -c -o ssh2_client_fuzzer-ssh2_client_fuzzer.o `test -f 'ssh2_client_fuzzer.cc' || echo '$(srcdir)/'`ssh2_client_fuzzer.cc + +ssh2_client_fuzzer-ssh2_client_fuzzer.obj: ssh2_client_fuzzer.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ssh2_client_fuzzer_CXXFLAGS) $(CXXFLAGS) -MT ssh2_client_fuzzer-ssh2_client_fuzzer.obj -MD -MP -MF $(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Tpo -c -o ssh2_client_fuzzer-ssh2_client_fuzzer.obj `if test -f 'ssh2_client_fuzzer.cc'; then $(CYGPATH_W) 'ssh2_client_fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/ssh2_client_fuzzer.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Tpo $(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssh2_client_fuzzer.cc' object='ssh2_client_fuzzer-ssh2_client_fuzzer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ssh2_client_fuzzer_CXXFLAGS) $(CXXFLAGS) -c -o ssh2_client_fuzzer-ssh2_client_fuzzer.obj `if test -f 'ssh2_client_fuzzer.cc'; then $(CYGPATH_W) 'ssh2_client_fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/ssh2_client_fuzzer.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/libstandaloneengine_a-standaloneengine.Po + -rm -f ./$(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/libstandaloneengine_a-standaloneengine.Po + -rm -f ./$(DEPDIR)/ssh2_client_fuzzer-ssh2_client_fuzzer.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libtool clean-noinstLIBRARIES \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/libssh2/tests/ossfuzz/ssh2_client_fuzzer.cc b/vendor/libssh2/tests/ossfuzz/ssh2_client_fuzzer.cc new file mode 100644 index 000000000..d9f5ab516 --- /dev/null +++ b/vendor/libssh2/tests/ossfuzz/ssh2_client_fuzzer.cc @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "testinput.h" + +#define FUZZ_ASSERT(COND) \ + if(!(COND)) \ + { \ + fprintf(stderr, "Assertion failed: " #COND "\n%s", \ + strerror(errno)); \ + assert((COND)); \ + } + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + int socket_fds[2] = {-1, -1}; + ssize_t written; + int rc; + LIBSSH2_SESSION *session = NULL; + int handshake_completed = 0; + + rc = libssh2_init(0); + + if(rc != 0) { + fprintf(stderr, "libssh2 initialization failed (%d)\n", rc); + goto EXIT_LABEL; + } + + // Create a socket pair so data can be sent in. + rc = socketpair(AF_UNIX, SOCK_STREAM, 0, socket_fds); + FUZZ_ASSERT(rc == 0); + + written = send(socket_fds[1], data, size, 0); + + if (written != size) + { + // Handle whatever error case we're in. + fprintf(stderr, "send() of %zu bytes returned %zu (%d)\n", + size, + written, + errno); + goto EXIT_LABEL; + } + + rc = shutdown(socket_fds[1], SHUT_WR); + if (rc != 0) + { + fprintf(stderr, "socket shutdown failed (%d)\n", rc); + goto EXIT_LABEL; + } + + // Create a session and start the handshake using the fuzz data passed in. + session = libssh2_session_init(); + if(session) { + libssh2_session_set_blocking(session, 1); + } + + if(libssh2_session_handshake(session, socket_fds[0])) { + goto EXIT_LABEL; + } + + // If we get here the handshake actually completed. + handshake_completed = 1; + +EXIT_LABEL: + + if (session != NULL) + { + if (handshake_completed) + { + libssh2_session_disconnect(session, + "Normal Shutdown, Thank you for playing"); + } + + libssh2_session_free(session); + } + + libssh2_exit(); + + close(socket_fds[0]); + close(socket_fds[1]); + + return 0; +} diff --git a/vendor/libssh2/tests/ossfuzz/standaloneengine.cc b/vendor/libssh2/tests/ossfuzz/standaloneengine.cc new file mode 100644 index 000000000..175360e4a --- /dev/null +++ b/vendor/libssh2/tests/ossfuzz/standaloneengine.cc @@ -0,0 +1,74 @@ +#include +#include +#include + +#include "testinput.h" + +/** + * Main procedure for standalone fuzzing engine. + * + * Reads filenames from the argument array. For each filename, read the file + * into memory and then call the fuzzing interface with the data. + */ +int main(int argc, char **argv) +{ + int ii; + for(ii = 1; ii < argc; ii++) + { + FILE *infile; + printf("[%s] ", argv[ii]); + + /* Try and open the file. */ + infile = fopen(argv[ii], "rb"); + if(infile) + { + uint8_t *buffer = NULL; + size_t buffer_len; + + printf("Opened.. "); + + /* Get the length of the file. */ + fseek(infile, 0L, SEEK_END); + buffer_len = ftell(infile); + + /* Reset the file indicator to the beginning of the file. */ + fseek(infile, 0L, SEEK_SET); + + /* Allocate a buffer for the file contents. */ + buffer = (uint8_t *)calloc(buffer_len, sizeof(uint8_t)); + if(buffer) + { + /* Read all the text from the file into the buffer. */ + fread(buffer, sizeof(uint8_t), buffer_len, infile); + printf("Read %zu bytes, fuzzing.. ", buffer_len); + + /* Call the fuzzer with the data. */ + LLVMFuzzerTestOneInput(buffer, buffer_len); + + printf("complete !!"); + + /* Free the buffer as it's no longer needed. */ + free(buffer); + buffer = NULL; + } + else + { + fprintf(stderr, + "[%s] Failed to allocate %zu bytes \n", + argv[ii], + buffer_len); + } + + /* Close the file as it's no longer needed. */ + fclose(infile); + infile = NULL; + } + else + { + /* Failed to open the file. Maybe wrong name or wrong permissions? */ + fprintf(stderr, "[%s] Open failed. \n", argv[ii]); + } + + printf("\n"); + } +} diff --git a/vendor/libssh2/tests/ossfuzz/testinput.h b/vendor/libssh2/tests/ossfuzz/testinput.h new file mode 100644 index 000000000..6ab9b515e --- /dev/null +++ b/vendor/libssh2/tests/ossfuzz/testinput.h @@ -0,0 +1,3 @@ +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); diff --git a/vendor/libssh2/tests/ssh2.c b/vendor/libssh2/tests/ssh2.c index d349ab904..f903e0758 100644 --- a/vendor/libssh2/tests/ssh2.c +++ b/vendor/libssh2/tests/ssh2.c @@ -84,7 +84,8 @@ int main(int argc, char *argv[]) } /* Create a session instance and start it up - * This will trade welcome banners, exchange keys, and setup crypto, compression, and MAC layers + * This will trade welcome banners, exchange keys, + * and setup crypto, compression, and MAC layers */ session = libssh2_session_init(); if(libssh2_session_startup(session, sock)) { @@ -92,9 +93,11 @@ int main(int argc, char *argv[]) return 1; } - /* At this point we havn't authenticated, - * The first thing to do is check the hostkey's fingerprint against our known hosts - * Your app may have it hard coded, may go to a file, may present it to the user, that's your call + /* At this point we haven't authenticated, + * The first thing to do is check the hostkey's + * fingerprint against our known hosts + * Your app may have it hard coded, may go to a file, + * may present it to the user, that's your call */ fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); printf("Fingerprint: "); @@ -118,7 +121,8 @@ int main(int argc, char *argv[]) if(auth_pw & 4) { /* Authenticate by public key */ - if(libssh2_userauth_publickey_fromfile(session, username, pubkeyfile, privkeyfile, password)) { + if(libssh2_userauth_publickey_fromfile(session, username, pubkeyfile, + privkeyfile, password)) { printf("\tAuthentication by public key failed!\n"); goto shutdown; } diff --git a/vendor/libssh2/tests/test_agent_forward_succeeds.c b/vendor/libssh2/tests/test_agent_forward_succeeds.c new file mode 100644 index 000000000..daf7bd5ac --- /dev/null +++ b/vendor/libssh2/tests/test_agent_forward_succeeds.c @@ -0,0 +1,51 @@ +#include "session_fixture.h" + +#include + +#include + +const char *USERNAME = "libssh2"; /* set in Dockerfile */ +const char *KEY_FILE_PRIVATE = "key_rsa"; +const char *KEY_FILE_PUBLIC = "key_rsa.pub"; /* set in Dockerfile */ + +int test(LIBSSH2_SESSION *session) +{ + int rc; + LIBSSH2_CHANNEL *channel; + + const char *userauth_list = + libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + rc = libssh2_userauth_publickey_fromfile_ex( + session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, + NULL); + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + channel = libssh2_channel_open_session(session); + /* if(channel == NULL) { */ + /* printf("Error opening channel\n"); */ + /* return 1; */ + /* } */ + + rc = libssh2_channel_request_auth_agent(channel); + if(rc != 0) { + fprintf(stderr, "Auth agent request for agent forwarding failed, " + "error code %d\n", rc); + return 1; + } + + return 0; +} diff --git a/vendor/libssh2/tests/test_hostkey.c b/vendor/libssh2/tests/test_hostkey.c index e09a76747..e33f68f96 100644 --- a/vendor/libssh2/tests/test_hostkey.c +++ b/vendor/libssh2/tests/test_hostkey.c @@ -32,11 +32,13 @@ int test(LIBSSH2_SESSION *session) if(type == LIBSSH2_HOSTKEY_TYPE_ECDSA_256) { rc = libssh2_base64_decode(session, &expected_hostkey, &expected_len, - EXPECTED_ECDSA_HOSTKEY, strlen(EXPECTED_ECDSA_HOSTKEY)); + EXPECTED_ECDSA_HOSTKEY, + strlen(EXPECTED_ECDSA_HOSTKEY)); } else if(type == LIBSSH2_HOSTKEY_TYPE_RSA) { rc = libssh2_base64_decode(session, &expected_hostkey, &expected_len, - EXPECTED_RSA_HOSTKEY, strlen(EXPECTED_RSA_HOSTKEY)); + EXPECTED_RSA_HOSTKEY, + strlen(EXPECTED_RSA_HOSTKEY)); } else { fprintf(stderr, "Unexpected type of hostkey: %i\n", type); @@ -49,7 +51,7 @@ int test(LIBSSH2_SESSION *session) } if(len != expected_len) { - fprintf(stderr, "Hostkey does not have the expected length %ld != %d\n", + fprintf(stderr, "Hostkey does not have the expected length %ld!=%d\n", (unsigned long)len, expected_len); return 1; } diff --git a/vendor/libssh2/tests/test_hostkey_hash.c b/vendor/libssh2/tests/test_hostkey_hash.c index 0576120b4..112b491f2 100644 --- a/vendor/libssh2/tests/test_hostkey_hash.c +++ b/vendor/libssh2/tests/test_hostkey_hash.c @@ -17,19 +17,23 @@ static const char *EXPECTED_ECDSA_HOSTKEY = "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC+/syyeKJD9dC2ZH" "9Q7iJGReR4YM3rUCMsSynkyXojdfSClGCMY7JvWlt30ESjYvxoTfSRGx6WvaqYK/vPoYQ4="; -static const char *EXPECTED_RSA_MD5_HASH_DIGEST = "0C0ED1A5BB10275F76924CE187CE5C5E"; +static const char *EXPECTED_RSA_MD5_HASH_DIGEST = + "0C0ED1A5BB10275F76924CE187CE5C5E"; static const char *EXPECTED_RSA_SHA1_HASH_DIGEST = "F3CD59E2913F4422B80F7B0A82B2B89EAE449387"; -static const char *EXPECTED_RSA_SHA256_HASH_DIGEST = "92E3DA49DF3C7F99A828F505ED8239397A5D1F62914459760F878F7510F563A3"; +static const char *EXPECTED_RSA_SHA256_HASH_DIGEST = + "92E3DA49DF3C7F99A828F505ED8239397A5D1F62914459760F878F7510F563A3"; -static const char *EXPECTED_ECDSA_MD5_HASH_DIGEST = "0402E4D897580BBC911379CBD88BCD3D"; +static const char *EXPECTED_ECDSA_MD5_HASH_DIGEST = + "0402E4D897580BBC911379CBD88BCD3D"; static const char *EXPECTED_ECDSA_SHA1_HASH_DIGEST = "12FDAD1E3B31B10BABB00F2A8D1B9A62C326BD2F"; -static const char *EXPECTED_ECDSA_SHA256_HASH_DIGEST = "56FCD975B166C3F0342D0036E44C311A86C0EAE40713B53FC776369BAE7F5264"; +static const char *EXPECTED_ECDSA_SHA256_HASH_DIGEST = + "56FCD975B166C3F0342D0036E44C311A86C0EAE40713B53FC776369BAE7F5264"; static const int MD5_HASH_SIZE = 16; static const int SHA1_HASH_SIZE = 20; @@ -51,6 +55,7 @@ int test(LIBSSH2_SESSION *session) { char buf[BUFSIZ]; + const char *hostkey; const char *md5_hash; const char *sha1_hash; const char *sha256_hash; @@ -61,7 +66,7 @@ int test(LIBSSH2_SESSION *session) (void)EXPECTED_RSA_HOSTKEY; (void)EXPECTED_ECDSA_HOSTKEY; - const char *hostkey = libssh2_session_hostkey(session, &len, &type); + hostkey = libssh2_session_hostkey(session, &len, &type); if(hostkey == NULL) { print_last_session_error("libssh2_session_hostkey"); return 1; @@ -79,8 +84,9 @@ int test(LIBSSH2_SESSION *session) calculate_digest(md5_hash, MD5_HASH_SIZE, buf, BUFSIZ); if(strcmp(buf, EXPECTED_ECDSA_MD5_HASH_DIGEST) != 0) { - fprintf(stderr, "ECDSA MD5 hash not as expected - digest %s != %s\n", buf, - EXPECTED_ECDSA_MD5_HASH_DIGEST); + fprintf(stderr, + "ECDSA MD5 hash not as expected - digest %s != %s\n", + buf, EXPECTED_ECDSA_MD5_HASH_DIGEST); return 1; } @@ -94,12 +100,14 @@ int test(LIBSSH2_SESSION *session) calculate_digest(sha1_hash, SHA1_HASH_SIZE, buf, BUFSIZ); if(strcmp(buf, EXPECTED_ECDSA_SHA1_HASH_DIGEST) != 0) { - fprintf(stderr, "ECDSA SHA1 hash not as expected - digest %s != %s\n", buf, - EXPECTED_ECDSA_SHA1_HASH_DIGEST); + fprintf(stderr, + "ECDSA SHA1 hash not as expected - digest %s != %s\n", + buf, EXPECTED_ECDSA_SHA1_HASH_DIGEST); return 1; } - sha256_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256); + sha256_hash = libssh2_hostkey_hash(session, + LIBSSH2_HOSTKEY_HASH_SHA256); if(sha256_hash == NULL) { print_last_session_error( "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA256)"); @@ -109,8 +117,9 @@ int test(LIBSSH2_SESSION *session) calculate_digest(sha256_hash, SHA256_HASH_SIZE, buf, BUFSIZ); if(strcmp(buf, EXPECTED_ECDSA_SHA256_HASH_DIGEST) != 0) { - fprintf(stderr, "ECDSA SHA256 hash not as expected - digest %s != %s\n", buf, - EXPECTED_ECDSA_SHA256_HASH_DIGEST); + fprintf(stderr, + "ECDSA SHA256 hash not as expected - digest %s != %s\n", + buf, EXPECTED_ECDSA_SHA256_HASH_DIGEST); return 1; } @@ -127,8 +136,9 @@ int test(LIBSSH2_SESSION *session) calculate_digest(md5_hash, MD5_HASH_SIZE, buf, BUFSIZ); if(strcmp(buf, EXPECTED_RSA_MD5_HASH_DIGEST) != 0) { - fprintf(stderr, "MD5 hash not as expected - digest %s != %s\n", buf, - EXPECTED_RSA_MD5_HASH_DIGEST); + fprintf(stderr, + "MD5 hash not as expected - digest %s != %s\n", + buf, EXPECTED_RSA_MD5_HASH_DIGEST); return 1; } @@ -142,12 +152,14 @@ int test(LIBSSH2_SESSION *session) calculate_digest(sha1_hash, SHA1_HASH_SIZE, buf, BUFSIZ); if(strcmp(buf, EXPECTED_RSA_SHA1_HASH_DIGEST) != 0) { - fprintf(stderr, "SHA1 hash not as expected - digest %s != %s\n", buf, - EXPECTED_RSA_SHA1_HASH_DIGEST); + fprintf(stderr, + "SHA1 hash not as expected - digest %s != %s\n", + buf, EXPECTED_RSA_SHA1_HASH_DIGEST); return 1; } - sha256_hash = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256); + sha256_hash = libssh2_hostkey_hash(session, + LIBSSH2_HOSTKEY_HASH_SHA256); if(sha256_hash == NULL) { print_last_session_error( "libssh2_hostkey_hash(LIBSSH2_HOSTKEY_HASH_SHA256)"); @@ -157,8 +169,9 @@ int test(LIBSSH2_SESSION *session) calculate_digest(sha256_hash, SHA256_HASH_SIZE, buf, BUFSIZ); if(strcmp(buf, EXPECTED_RSA_SHA256_HASH_DIGEST) != 0) { - fprintf(stderr, "SHA256 hash not as expected - digest %s != %s\n", buf, - EXPECTED_RSA_SHA256_HASH_DIGEST); + fprintf(stderr, + "SHA256 hash not as expected - digest %s != %s\n", + buf, EXPECTED_RSA_SHA256_HASH_DIGEST); return 1; } } diff --git a/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c b/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c index 995d9f1d3..56b1ba549 100644 --- a/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c +++ b/vendor/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c @@ -4,11 +4,11 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; /* set in Dockerfile */ static const char *WRONG_PASSWORD = "i'm not the password"; static void kbd_callback(const char *name, int name_len, - const char *instruction, int instruction_len, + const char *instruct, int instruct_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, @@ -17,7 +17,7 @@ static void kbd_callback(const char *name, int name_len, int i; (void)abstract; fprintf(stdout, "Kb-int name: %.*s\n", name_len, name); - fprintf(stdout, "Kb-int instruction: %.*s\n", instruction_len, instruction); + fprintf(stdout, "Kb-int instruction: %.*s\n", instruct_len, instruct); for(i = 0; i < num_prompts; ++i) { fprintf(stdout, "Kb-int prompt %d: %.*s\n", i, prompts[i].length, prompts[i].text); diff --git a/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c b/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c index 06b9e68c7..0ccf5dd90 100644 --- a/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c +++ b/vendor/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c @@ -4,11 +4,12 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -static const char *PASSWORD = "my test password"; /* configured in Dockerfile */ +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; +static const char *PASSWORD = "my test password"; static void kbd_callback(const char *name, int name_len, - const char *instruction, int instruction_len, + const char *instruct, int instruct_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, @@ -18,7 +19,7 @@ static void kbd_callback(const char *name, int name_len, (void)abstract; fprintf(stdout, "Kb-int name: %.*s\n", name_len, name); - fprintf(stdout, "Kb-int instruction: %.*s\n", instruction_len, instruction); + fprintf(stdout, "Kb-int instruction: %.*s\n", instruct_len, instruct); for(i = 0; i < num_prompts; ++i) { fprintf(stdout, "Kb-int prompt %d: %.*s\n", i, prompts[i].length, prompts[i].text); diff --git a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c index af906df40..2b895d08e 100644 --- a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c +++ b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_password.c @@ -4,7 +4,7 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; /* set in Dockerfile */ static const char *WRONG_PASSWORD = "i'm not the password"; int test(LIBSSH2_SESSION *session) diff --git a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c index 81df36f39..b78617a49 100644 --- a/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c +++ b/vendor/libssh2/tests/test_password_auth_fails_with_wrong_username.c @@ -4,7 +4,8 @@ #include -static const char *PASSWORD = "my test password"; /* configured in Dockerfile */ +/* configured in Dockerfile */ +static const char *PASSWORD = "my test password"; static const char *WRONG_USERNAME = "i dont exist"; int test(LIBSSH2_SESSION *session) diff --git a/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c b/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c index f39e6d6a5..94b86b879 100644 --- a/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c +++ b/vendor/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c @@ -4,8 +4,9 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ -static const char *PASSWORD = "my test password"; /* configured in Dockerfile */ +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; +static const char *PASSWORD = "my test password"; int test(LIBSSH2_SESSION *session) { diff --git a/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c b/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c index 4da7068b7..dd2d254f5 100644 --- a/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c @@ -4,7 +4,7 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; /* set in Dockerfile */ static const char *KEY_FILE_PRIVATE = "key_dsa_wrong"; static const char *KEY_FILE_PUBLIC = "key_dsa_wrong.pub"; diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c index 46bcc26ab..187c1313f 100644 --- a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c @@ -4,9 +4,10 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; static const char *KEY_FILE_PRIVATE = "key_dsa"; -static const char *KEY_FILE_PUBLIC = "key_dsa.pub"; /* configured in Dockerfile */ +static const char *KEY_FILE_PUBLIC = "key_dsa.pub"; int test(LIBSSH2_SESSION *session) { diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ecdsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ecdsa_key.c new file mode 100644 index 000000000..2ea3a3699 --- /dev/null +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ecdsa_key.c @@ -0,0 +1,38 @@ +#include "session_fixture.h" + +#include + +#include + +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; +static const char *KEY_FILE_PRIVATE = "key_ecdsa"; +static const char *KEY_FILE_PUBLIC = "key_ecdsa.pub"; + +int test(LIBSSH2_SESSION *session) +{ + int rc; + const char *userauth_list = NULL; + + userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + rc = libssh2_userauth_publickey_fromfile_ex( + session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, + NULL); + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + return 0; +} diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key.c new file mode 100644 index 000000000..c52830d94 --- /dev/null +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key.c @@ -0,0 +1,38 @@ +#include "session_fixture.h" + +#include + +#include + +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; +static const char *KEY_FILE_PRIVATE = "key_ed25519"; +static const char *KEY_FILE_PUBLIC = "key_ed25519.pub"; + +int test(LIBSSH2_SESSION *session) +{ + int rc; + const char *userauth_list = NULL; + + userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + rc = libssh2_userauth_publickey_fromfile_ex( + session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, + NULL); + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + return 0; +} diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c new file mode 100644 index 000000000..a79d1b518 --- /dev/null +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c @@ -0,0 +1,98 @@ +#include "session_fixture.h" + +#include + +#include +#include + +static const char *USERNAME = "libssh2"; /* set in Dockerfile */ +static const char *KEY_FILE_ED25519_PRIVATE = "key_ed25519"; + +int read_file(const char *path, char **buf, size_t *len); + +int test(LIBSSH2_SESSION *session) +{ + int rc; + char *buffer = NULL; + size_t len = 0; + const char *userauth_list = NULL; + + userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + if(read_file(KEY_FILE_ED25519_PRIVATE, &buffer, &len)) { + fprintf(stderr, "Reading key file failed."); + return 1; + } + + rc = libssh2_userauth_publickey_frommemory(session, + USERNAME, strlen(USERNAME), + NULL, 0, + buffer, len, + NULL); + + free(buffer); + + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + return 0; +} + +int read_file(const char *path, char **out_buffer, size_t *out_len) +{ + FILE *fp = NULL; + char *buffer = NULL; + size_t len = 0; + + if(out_buffer == NULL || out_len == NULL || path == NULL) { + fprintf(stderr, "invalid params."); + return 1; + } + + *out_buffer = NULL; + *out_len = 0; + + fp = fopen(path, "r"); + + if(!fp) { + fprintf(stderr, "File could not be read."); + return 1; + } + + fseek(fp, 0L, SEEK_END); + len = ftell(fp); + rewind(fp); + + buffer = calloc(1, len + 1); + if(!buffer) { + fclose(fp); + fprintf(stderr, "Could not alloc memory."); + return 1; + } + + if(1 != fread(buffer, len, 1, fp)) { + fclose(fp); + free(buffer); + fprintf(stderr, "Could not read file into memory."); + return 1; + } + + fclose(fp); + + *out_buffer = buffer; + *out_len = len; + + return 0; +} diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c new file mode 100644 index 000000000..553023a99 --- /dev/null +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c @@ -0,0 +1,39 @@ +#include "session_fixture.h" + +#include + +#include + +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; +static const char *PASSWORD = "libssh2"; +static const char *KEY_FILE_PRIVATE = "key_ed25519_encrypted"; +static const char *KEY_FILE_PUBLIC = "key_ed25519_encrypted.pub"; + +int test(LIBSSH2_SESSION *session) +{ + int rc; + const char *userauth_list = NULL; + + userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + rc = libssh2_userauth_publickey_fromfile_ex( + session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, + PASSWORD); + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + return 0; +} diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c index 6b9451359..ba98ac7c4 100644 --- a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c @@ -4,10 +4,11 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; static const char *PASSWORD = "libssh2"; static const char *KEY_FILE_PRIVATE = "key_rsa_encrypted"; -static const char *KEY_FILE_PUBLIC = "key_rsa_encrypted.pub"; /* configured in Dockerfile */ +static const char *KEY_FILE_PUBLIC = "key_rsa_encrypted.pub"; int test(LIBSSH2_SESSION *session) { diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c index d9e87c613..0cf2a6331 100644 --- a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c @@ -4,9 +4,10 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; static const char *KEY_FILE_PRIVATE = "key_rsa"; -static const char *KEY_FILE_PUBLIC = "key_rsa.pub"; /* configured in Dockerfile */ +static const char *KEY_FILE_PUBLIC = "key_rsa.pub"; int test(LIBSSH2_SESSION *session) { diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c index e7fd7373e..a067d729b 100644 --- a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c @@ -4,9 +4,10 @@ #include -static const char *USERNAME = "libssh2"; /* configured in Dockerfile */ +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; static const char *KEY_FILE_PRIVATE = "key_rsa_openssh"; -static const char *KEY_FILE_PUBLIC = "key_rsa_openssh.pub"; /* configured in Dockerfile */ +static const char *KEY_FILE_PUBLIC = "key_rsa_openssh.pub"; int test(LIBSSH2_SESSION *session) { diff --git a/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_ecdsa_key.c b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_ecdsa_key.c new file mode 100644 index 000000000..10b33cbb8 --- /dev/null +++ b/vendor/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_ecdsa_key.c @@ -0,0 +1,38 @@ +#include "session_fixture.h" + +#include + +#include + +/* configured in Dockerfile */ +static const char *USERNAME = "libssh2"; +static const char *KEY_FILE_PRIVATE = "signed_key_ecdsa"; +static const char *KEY_FILE_PUBLIC = "signed_key_ecdsa-cert.pub"; + +int test(LIBSSH2_SESSION *session) +{ + int rc; + const char *userauth_list = NULL; + + userauth_list = libssh2_userauth_list(session, USERNAME, strlen(USERNAME)); + if(userauth_list == NULL) { + print_last_session_error("libssh2_userauth_list"); + return 1; + } + + if(strstr(userauth_list, "publickey") == NULL) { + fprintf(stderr, "'publickey' was expected in userauth list: %s\n", + userauth_list); + return 1; + } + + rc = libssh2_userauth_publickey_fromfile_ex( + session, USERNAME, strlen(USERNAME), KEY_FILE_PUBLIC, KEY_FILE_PRIVATE, + NULL); + if(rc != 0) { + print_last_session_error("libssh2_userauth_publickey_fromfile_ex"); + return 1; + } + + return 0; +} diff --git a/vendor/libssh2/vms/libssh2_make_help.dcl b/vendor/libssh2/vms/libssh2_make_help.dcl index b36512ecb..652671da3 100644 --- a/vendor/libssh2/vms/libssh2_make_help.dcl +++ b/vendor/libssh2/vms/libssh2_make_help.dcl @@ -29,7 +29,7 @@ $ man2help -a [-.docs]AUTHORS.; libssh2.hlp -b 2 $ man2help -a [-.docs]BINDINGS.; libssh2.hlp -b 2 $ man2help -a [-.docs]HACKING.; libssh2.hlp -b 2 $ if f$search("[]HACKING_CRYPTO.") .nes. "" then delete []HACKING_CRYPTO.;* -$ copy [-.docs]HACKING.CRYPTO; []HACKING_CRYPTO. +$ copy [-.docs]HACKING-CRYPTO; []HACKING_CRYPTO. $ man2help -a []HACKING_CRYPTO.; libssh2.hlp -b 2 $ man2help -a [-.docs]TODO.; libssh2.hlp -b 2 $! @@ -56,18 +56,18 @@ $! $ thisdir = f$environment( "procedure" ) $ thisdir = f$parse(thisdir,,,"device") + f$parse(thisdir,,,"directory") $ set default 'thisdir' -$! +$! $ say = "write sys$output" $! -$ pipe search [-.include]*.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - +$ pipe search [-.include]*.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - define/job majorv &l ) -$ pipe search [-.include]*.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - +$ pipe search [-.include]*.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - define/job minorv &l ) -$ pipe search [-.include]*.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - +$ pipe search [-.include]*.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - define/job patchv &l ) $! $ majorv = f$trnlnm("majorv") -$ minorv = f$integer(f$trnlnm("minorv")) +$ minorv = f$integer(f$trnlnm("minorv")) $ patchv = f$integer( f$trnlnm("patchv")) $! $ helpversion = "This help library is based on build version ''majorv'.''minorv'.''patchv' of libssh2." @@ -81,15 +81,15 @@ $ then $ cc man2help $ link man2help $ endif -$! -$ man2help := $'thisdir'man2help.exe $! -$ if f$search("libssh2.hlp") .nes. "" -$ then +$ man2help := $'thisdir'man2help.exe +$! +$ if f$search("libssh2.hlp") .nes. "" +$ then $ delete libssh2.hlp;* $ endif -$ if f$search("libssh2.hlb") .nes. "" -$ then +$ if f$search("libssh2.hlb") .nes. "" +$ then $ delete libssh2.hlb;* $ endif $return diff --git a/vendor/libssh2/win32/libssh2.dsp b/vendor/libssh2/win32/libssh2.dsp index 42a51b949..1657c7bf8 100644 --- a/vendor/libssh2/win32/libssh2.dsp +++ b/vendor/libssh2/win32/libssh2.dsp @@ -263,6 +263,10 @@ SOURCE=..\src\agent.c # End Source File # Begin Source File +SOURCE=..\src\agent_win.c +# End Source File +# Begin Source File + SOURCE=..\src\bcrypt_pbkdf.c # End Source File # Begin Source File @@ -363,6 +367,10 @@ SOURCE=..\src\wincng.c # PROP Default_Filter "h;hpp;hxx" # Begin Source File +SOURCE=..\src\agent.h +# End Source File +# Begin Source File + SOURCE=..\src\blf.h # End Source File # Begin Source File From b2e01cdf5eb34b3e0f05b65a2c867b2d2820c2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Wed, 3 Nov 2021 18:54:55 +0100 Subject: [PATCH 342/545] changes after review --- .../templates/manual/repository/statistics.cc | 65 +++++++++++++------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index 8c17c7deb..d6837f126 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -83,12 +83,23 @@ void CommitsGraph::AddNode(const std::string &oidStr, const std::vector parents {}; - std::set children {}; + std::unordered_set parents {}; + std::unordered_set children {}; // start from the root commmits for (CommitsGraphNode *root : m_roots) { @@ -271,8 +282,9 @@ struct OdbObjectsData struct { std::unordered_map info {}; std::unordered_set unreachables {}; - // tree of commits (graph) to be built while reading the object database, - // in order to calculate the maximum history depth + // Tree of commits (graph) to be built after having read the object + // database, and pruned unreachable objects. + // Used to calculate the maximum history depth. CommitsGraph graph {}; size_t totalSize {0}; size_t maxSize {0}; @@ -317,7 +329,7 @@ struct OdbObjectsData * \class WorkItemOid * WorkItem storing odb oids for the WorkPool. */ -class WorkItemOid : public WorkItem{ +class WorkItemOid : public WorkItem { public: WorkItemOid(const git_oid &oid) : m_oid(oid) {} @@ -352,7 +364,7 @@ class WorkerStoreOdbData : public IWorker bool Execute(std::unique_ptr &&work); private: - OdbObjectsData::TreeInfoAndStats thisTreeInfoAndStats(git_tree *tree, size_t size, size_t numEntries); + OdbObjectsData::TreeInfoAndStats thisTreeInfoAndStats(const git_tree *tree, size_t size, size_t numEntries); std::string m_repoPath {}; git_repository *m_repo {nullptr}; @@ -532,27 +544,23 @@ bool WorkerStoreOdbData::Execute(std::unique_ptr &&work) * \param numEntries number of entries of this tree. * \return this tree's data and partial statistics. */ -OdbObjectsData::TreeInfoAndStats WorkerStoreOdbData::thisTreeInfoAndStats(git_tree *tree, size_t size, +OdbObjectsData::TreeInfoAndStats WorkerStoreOdbData::thisTreeInfoAndStats(const git_tree *tree, size_t size, size_t numEntries) { - const git_tree_entry *te {nullptr}; - git_object_t te_type {GIT_OBJECT_INVALID}; - const char *teName {nullptr}; - size_t teNameLen {0}; - const git_oid *te_oid {nullptr}; - OdbObjectsData::TreeInfoAndStats treeInfoAndStats {}; treeInfoAndStats.size = size; treeInfoAndStats.numEntries = numEntries; for (size_t i = 0; i < numEntries; ++i) { - te = git_tree_entry_byindex(tree, i); + const git_tree_entry *te = git_tree_entry_byindex(tree, i); if (te == nullptr) { continue; } - - te_type = git_tree_entry_type(te); + git_object_t te_type = git_tree_entry_type(te); + const char *teName {nullptr}; + size_t teNameLen {0}; + const git_oid *te_oid {nullptr}; switch (te_type) { @@ -585,7 +593,7 @@ OdbObjectsData::TreeInfoAndStats WorkerStoreOdbData::thisTreeInfoAndStats(git_tr case GIT_OBJECT_TREE: { - // We store tree's name lenght to compare in posterior stage, after threads work + // We store tree's name length to compare in posterior stage, after threads work teName = git_tree_entry_name(te); teNameLen = std::char_traits::length(teName); @@ -608,7 +616,7 @@ OdbObjectsData::TreeInfoAndStats WorkerStoreOdbData::thisTreeInfoAndStats(git_tr * \class WorkItemOidStrType * WorkItem storing pointers to object info structs for the WorkPool. */ -class WorkItemOidStrType : public WorkItem{ +class WorkItemOidStrType : public WorkItem { public: WorkItemOidStrType(void *objectInfo, git_object_t type) : m_objectInfo(objectInfo), m_oid_type(type) {} @@ -896,22 +904,31 @@ class RepoAnalysis /** * RepoAnalysis::Analyze + * To obtain the final result, the whole process is run in different stages. + * If a stage leverages threads via a worker pool, the worker pool is created + * and we wait until all the threads are done to continue with the next stage. */ int RepoAnalysis::Analyze() { int errorCode {GIT_OK}; + // stage 1 if ((errorCode = storeObjectsInfo() != GIT_OK)) { return errorCode; } + // stage 2 if (!setObjectsReachability()) { return GIT_EUSER; } + + // stage 3 pruneUnreachables(); + // stage 4 statsCountAndMax(); + // stage 5 if (!statsHistoryAndBiggestCheckouts()) { return GIT_EUSER; } @@ -946,7 +963,8 @@ v8::Local RepoAnalysis::StatisticsToJS() const /** * RepoAnalysis::storeObjectsInfo * Store information from read odb objects. - * Build a container with only reachable objects (avoid dangling objects). + * Starts building a container which eventually will hold only reachable objects. + * Leverages threads via a worker pool . */ int RepoAnalysis::storeObjectsInfo() { @@ -1077,7 +1095,11 @@ int RepoAnalysis::storeAndCountRefs() /** * RepoAnalysis::setObjectsReachability - * Leverages threads to set reachability from tags, commits, and trees. + * Leverages threads via a worker pool to + * set reachability from tags, commits, and trees. + * NOTE: the worker pool leveraged in this method runs at a different stage than the + * worker pool leveraged in previous stages, meaning they do not run at the same time, hence + * access to 'm_odbObjectsData->....info' won't suffer from a data race. * NOTE: performance didn't improve leveraging threads for adding objects to unreachables container. * \return false if the workerPool finished with errors; true otherwise */ @@ -1477,7 +1499,8 @@ bool RepoAnalysis::statsHistoryAndBiggestCheckouts() /** * RepoAnalysis::calculateBiggestCheckouts * - * Once threads have collected data from objects, biggest checkouts can be calculated. + * Once threads have collected data from objects and unreachable objects + * have been pruned, biggest checkouts can be calculated. * Threads have already collected partial non-recursive tree statistics. * \return true if success; false if something went wrong. */ From 3017aae063debbd37b6da90d345b389d235c4406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Fri, 5 Nov 2021 16:03:10 +0100 Subject: [PATCH 343/545] stop workerPool if main thread returns with error Also, make some variables const --- .../templates/manual/repository/statistics.cc | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index d6837f126..fb9f4bdae 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -48,7 +48,7 @@ class CommitsGraph */ void CommitsGraph::AddNode(const std::string &oidStr, const std::vector &parents) { - uint32_t numParents = static_cast(parents.size()); + const uint32_t numParents = static_cast(parents.size()); auto emplacePair = m_mapOidNode.emplace(std::make_pair( oidStr, std::make_unique(numParents))); @@ -429,11 +429,11 @@ bool WorkerStoreOdbData::Execute(std::unique_ptr &&work) git_object_free(target); return false; } - size_t size = git_odb_object_size(obj); + const size_t size = git_odb_object_size(obj); git_odb_object_free(obj); // obtain CommitInfo - unsigned int numParents = git_commit_parentcount(commit); + const unsigned int numParents = git_commit_parentcount(commit); std::vector parents {}; for (unsigned int i = 0; i < numParents; ++i) { parents.emplace_back(reinterpret_cast(git_commit_parent_id(commit, i)->id), @@ -461,7 +461,7 @@ bool WorkerStoreOdbData::Execute(std::unique_ptr &&work) git_tree *tree = (git_tree*)target; // do not count empty trees, like git's empty tree "4b825dc642cb6eb9a060e54bf8d69288fbee4904" - size_t numEntries = git_tree_entrycount(tree); + const size_t numEntries = git_tree_entrycount(tree); if (numEntries == 0) { git_object_free(target); return true; @@ -473,7 +473,7 @@ bool WorkerStoreOdbData::Execute(std::unique_ptr &&work) git_object_free(target); return false; } - size_t size = git_odb_object_size(obj); + const size_t size = git_odb_object_size(obj); git_odb_object_free(obj); // obtain tree data and calculate statistics for only this tree (not recursively) @@ -492,7 +492,7 @@ bool WorkerStoreOdbData::Execute(std::unique_ptr &&work) case GIT_OBJECT_BLOB: { git_blob *blob = (git_blob*)target; - size_t size = git_blob_rawsize(blob); + const size_t size = git_blob_rawsize(blob); OdbObjectsData::BlobInfo blobInfo {size, OdbObjectsData::kUnreachable}; { // lock @@ -557,7 +557,7 @@ OdbObjectsData::TreeInfoAndStats WorkerStoreOdbData::thisTreeInfoAndStats(const if (te == nullptr) { continue; } - git_object_t te_type = git_tree_entry_type(te); + const git_object_t te_type = git_tree_entry_type(te); const char *teName {nullptr}; size_t teNameLen {0}; const git_oid *te_oid {nullptr}; @@ -763,7 +763,7 @@ void WorkerReachCounter::setReachabilityFromCommits(void *objectInfo) { const OdbObjectsData::CommitInfo *commitInfo = static_cast(objectInfo); - size_t numParents = commitInfo->parents.size(); + const size_t numParents = commitInfo->parents.size(); // set parents' reachability for (size_t i = 0; i < numParents; ++i) { @@ -977,8 +977,8 @@ int RepoAnalysis::storeObjectsInfo() } // initialize workers for the worker pool - std::string repoPath = git_repository_path(m_repo); - unsigned int numThreads = + const std::string repoPath = git_repository_path(m_repo); + const unsigned int numThreads = std::max(std::thread::hardware_concurrency(), static_cast(kMinThreads)); std::vector< std::shared_ptr > workers {}; @@ -998,6 +998,8 @@ int RepoAnalysis::storeObjectsInfo() // main thread will work on the refs while waiting for the threads to finish if ((errorCode = storeAndCountRefs() != GIT_OK)) { + workerPool.Shutdown(); + git_odb_free(odb); return errorCode; } @@ -1036,7 +1038,7 @@ int RepoAnalysis::storeAndCountRefs() { // lookup ref git_reference *ref {nullptr}; - int refLookupError = git_reference_lookup(&ref, m_repo, ref_list.strings[i]); + const int refLookupError = git_reference_lookup(&ref, m_repo, ref_list.strings[i]); if (refLookupError == GIT_ENOTFOUND || refLookupError == GIT_EINVALIDSPEC) { continue; } @@ -1074,10 +1076,10 @@ int RepoAnalysis::storeAndCountRefs() if (oid_ref != nullptr) { git_object *target {nullptr}; - if (git_object_lookup(&target, m_repo, oid_ref, GIT_OBJECT_ANY) != GIT_OK) { + if ((errorCode = git_object_lookup(&target, m_repo, oid_ref, GIT_OBJECT_ANY)) != GIT_OK) { git_reference_free(ref); git_strarray_dispose(&ref_list); - return false; + return errorCode; } m_peeledRefs.emplace(std::make_pair( @@ -1108,7 +1110,7 @@ bool RepoAnalysis::setObjectsReachability() // references are not objects, hence they won't be sent to the worker threads setReachabilityFromRefs(); - unsigned int numThreads = + const unsigned int numThreads = std::max(std::thread::hardware_concurrency(), static_cast(kMinThreads)); std::vector< std::shared_ptr > workers {}; for (unsigned int i = 0; i < numThreads; ++i) { @@ -1348,7 +1350,7 @@ void RepoAnalysis::pruneUnreachableCommits() if (itCommitInfo != m_odbObjectsData.commits.info.end()) { // decrease commit's parents reachability and add them as newUnreachable - size_t numParents = itCommitInfo->second.parents.size(); + const size_t numParents = itCommitInfo->second.parents.size(); for (size_t i = 0; i < numParents; ++i) { OdbObjectsData::iterCommitInfo itParentCommitInfo = m_odbObjectsData.commits.info.find(itCommitInfo->second.parents.at(i)); @@ -1441,13 +1443,15 @@ void RepoAnalysis::pruneUnreachableBlobs() */ void RepoAnalysis::statsCountAndMax() { + size_t objectSize {}; + // commits for (auto &info : m_odbObjectsData.commits.info) { OdbObjectsData::CommitInfo &commitInfo = info.second; - size_t size = commitInfo.size; + objectSize = commitInfo.size; - m_odbObjectsData.commits.totalSize += size; - m_odbObjectsData.commits.maxSize = std::max(m_odbObjectsData.commits.maxSize, size); + m_odbObjectsData.commits.totalSize += objectSize; + m_odbObjectsData.commits.maxSize = std::max(m_odbObjectsData.commits.maxSize, objectSize); m_odbObjectsData.commits.maxParents = std::max( m_odbObjectsData.commits.maxParents, commitInfo.parents.size()); @@ -1457,20 +1461,20 @@ void RepoAnalysis::statsCountAndMax() // trees for (auto &info : m_odbObjectsData.trees.info) { OdbObjectsData::TreeInfoAndStats &treeInfo = info.second; - size_t size = treeInfo.size; - size_t numEntries = treeInfo.numEntries; + const size_t numEntries = treeInfo.numEntries; + objectSize = treeInfo.size; - m_odbObjectsData.trees.totalSize += size; + m_odbObjectsData.trees.totalSize += objectSize; m_odbObjectsData.trees.totalEntries += numEntries; m_odbObjectsData.trees.maxEntries = std::max(m_odbObjectsData.trees.maxEntries, numEntries); } // blobs for (auto &info : m_odbObjectsData.blobs.info) { OdbObjectsData::BlobInfo &blobInfo = info.second; - size_t size = blobInfo.size; + objectSize = blobInfo.size; - m_odbObjectsData.blobs.totalSize += size; - m_odbObjectsData.blobs.maxSize = std::max(m_odbObjectsData.blobs.maxSize, size); + m_odbObjectsData.blobs.totalSize += objectSize; + m_odbObjectsData.blobs.maxSize = std::max(m_odbObjectsData.blobs.maxSize, objectSize); } // no need to process tags here (we already have the count) } @@ -1542,6 +1546,9 @@ bool RepoAnalysis::calculateBiggestCheckouts() * * Calculates tree statistics recursively, considering individual tree's statistics * have already been calculated. + * The maximum number of recursive calls depend directly on the maximum path depth of + * the repository. For instance, the linux repository have a maximum path depth of 13, + * so it should be safe against stack overflow. * Returns an iterator to the tree info container, or to end if something went wrong. */ OdbObjectsData::iterTreeInfo RepoAnalysis::calculateTreeStatistics(const std::string &oidTree) From f8121228e3351b6974b890874327dd409057f3fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Aveill=C3=A1n?= Date: Fri, 5 Nov 2021 18:19:47 +0100 Subject: [PATCH 344/545] scope variables and trust trivial compiler optimization --- generate/templates/manual/repository/statistics.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index fb9f4bdae..bca4aa268 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -1443,12 +1443,10 @@ void RepoAnalysis::pruneUnreachableBlobs() */ void RepoAnalysis::statsCountAndMax() { - size_t objectSize {}; - // commits for (auto &info : m_odbObjectsData.commits.info) { OdbObjectsData::CommitInfo &commitInfo = info.second; - objectSize = commitInfo.size; + const size_t objectSize = commitInfo.size; m_odbObjectsData.commits.totalSize += objectSize; m_odbObjectsData.commits.maxSize = std::max(m_odbObjectsData.commits.maxSize, objectSize); @@ -1462,7 +1460,7 @@ void RepoAnalysis::statsCountAndMax() for (auto &info : m_odbObjectsData.trees.info) { OdbObjectsData::TreeInfoAndStats &treeInfo = info.second; const size_t numEntries = treeInfo.numEntries; - objectSize = treeInfo.size; + const size_t objectSize = treeInfo.size; m_odbObjectsData.trees.totalSize += objectSize; m_odbObjectsData.trees.totalEntries += numEntries; @@ -1471,7 +1469,7 @@ void RepoAnalysis::statsCountAndMax() // blobs for (auto &info : m_odbObjectsData.blobs.info) { OdbObjectsData::BlobInfo &blobInfo = info.second; - objectSize = blobInfo.size; + const size_t objectSize = blobInfo.size; m_odbObjectsData.blobs.totalSize += objectSize; m_odbObjectsData.blobs.maxSize = std::max(m_odbObjectsData.blobs.maxSize, objectSize); From 59e0a0a98267bbd287190543c3874401f0374d5b Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 8 Nov 2021 11:24:04 -0700 Subject: [PATCH 345/545] Allow download of prebuilt OpenSSL --- guides/install/from-source/README.md | 2 +- utils/acquireOpenSSL.js | 56 ++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/guides/install/from-source/README.md b/guides/install/from-source/README.md index 7de3c9adf..f65d550af 100644 --- a/guides/install/from-source/README.md +++ b/guides/install/from-source/README.md @@ -72,7 +72,7 @@ A local version of OpenSSL is required when building for Electron on Windows and - We rely on the Visual Studio dev tools to be installed, specifically `vcvarsall.bat` to provide access to the tools. If this is not in the default location for VS2017, you'll need to `npm config set vcvarsall_path ` or set the environment variable `npm_config_vcvarsall_path` pointing to it. - See [Compilation and Installation](https://wiki.openssl.org/index.php/Compilation_and_Installation#Windows) regarding required dependencies, specifically `Perl` (Strawberry Perl is known to work) and `NASM`. Make sure they're on the PATH. -Alternatively, you can provide your own OpenSSL binaries and headers. These can either go in `vendor/openssl` (e.g. `/vendor/openssl/{lib,bin,include}` should exist) or in an external directory located by `npm config set openssl_dir` or the environment variable `npm_config_openssl_dir`. +Alternatively, you can provide your own OpenSSL binaries and headers. These can either go in `vendor/openssl` (e.g. `/vendor/openssl/{lib,bin,include}` should exist) or in an external directory located by `npm config set openssl_dir ` or the environment variable `npm_config_openssl_dir`. Additionally, you can `npm config set openssl_bin_url ` or the environment variable `npm_config_openssl_bin_url` to download and extract prebuilt binaries (only supports tar.gz files). `npm config set openssl_bin_sha256 ` or the environment variable `npm_config_openssl_bin_sha256` can be set to verify the download. ##### A note on environment variables in Windows ##### In many of the npm scripts (and examples above), things are run like diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 34936f7f7..4f8e337fe 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -110,6 +110,17 @@ const removeOpenSSLIfOudated = async (openSSLVersion) => { } }; +const makeOnStreamDownloadProgress = () => { + let lastReport = performance.now(); + return ({ percent, transferred, total }) => { + const currentTime = performance.now(); + if (currentTime - lastReport > 1 * 1000) { + lastReport = currentTime; + console.log(`progress: ${transferred}/${total} (${(percent * 100).toFixed(2)}%)`) + } + }; +}; + const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => { if (process.platform !== "darwin" && process.platform !== "win32") { console.log(`Skipping OpenSSL build, not required on ${process.platform}`); @@ -130,14 +141,7 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => const openSSLSha256 = (await got(openSSLSha256Url)).body.trim(); const downloadStream = got.stream(openSSLUrl); - let lastReport = performance.now(); - downloadStream.on("downloadProgress", ({ percent, transferred, total }) => { - const currentTime = performance.now(); - if (currentTime - lastReport > 1 * 1000) { - lastReport = currentTime; - console.log(`progress: ${transferred}/${total} (${(percent * 100).toFixed(2)}%)`) - } - }); + downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); await pipeline( downloadStream, @@ -161,8 +165,44 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => console.log("Build finished."); } +const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) => { + if (process.platform !== "darwin" && process.platform !== "win32") { + console.log(`Skipping OpenSSL download, not required on ${process.platform}`); + return; + } + + try { + await fs.stat(extractPath); + console.log("Skipping OpenSSL download, dir exists"); + return; + } catch {} + + const downloadStream = got.stream(downloadBinUrl); + downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); + + const pipelineSteps = [ + downloadStream, + maybeDownloadSha256 ? new HashVerify("sha256", maybeDownloadSha256) : null, + zlib.createGunzip(), + tar.extract(extractPath) + ].filter(step => step !== null); + await pipeline( + ...pipelineSteps + ); + + console.log(`OpenSSL download + extract complete${maybeDownloadSha256 ? ": SHA256 OK." : "."}`); + console.log("Download finished."); +} + const acquireOpenSSL = async () => { try { + const maybeDownloadBinUrl = process.env.npm_config_openssl_bin_url; + if (maybeDownloadBinUrl) { + const maybeDownloadSha256 = process.env.npm_config_openssl_bin_sha256; + await downloadOpenSSLIfNecessary(maybeDownloadBinUrl, maybeDownloadSha256); + return; + } + let macOsDeploymentTarget; if (process.platform === "darwin") { macOsDeploymentTarget = process.argv[2]; From 84d46493d05ffdcbdc6ba04dc4642a06b0dcdd95 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 10 Nov 2021 18:03:17 -0700 Subject: [PATCH 346/545] Ignore libssh2 generated files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3d571d1c7..8dc977fe1 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,8 @@ /vendor/libssh2/src/stamp-h1 /vendor/libssh2/tests/.deps/ /vendor/libssh2/tests/Makefile +/vendor/libssh2/tests/ossfuzz/.deps +/vendor/libssh2/tests/ossfuzz/Makefile *.log .DS_STORE From 7a1dea0bcb6331479cd3e074dbadfba12f8f8ac8 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 11 Nov 2021 11:13:05 -0700 Subject: [PATCH 347/545] Bump to v0.28.0-alpha.10 --- CHANGELOG.md | 24 +++++++++++++++++++++++- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1085de631..75a06b9d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Change Log +## v0.28.0-alpha.10 [(2021-11-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.10) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.9...v0.28.0-alpha.10) + +#### Summary of changes +- Reworked CI due to GitHub dropping Ubuntu 16.04 support +- When building for Electron on Windows/macOS and prebuilts are unavailable: NodeGit will attempt to build OpenSSL locally by default. This is due to Conan changing their API/provided OpenSSL binaries. There are options for pointing to an installed OpenSSL location or URL for downloading prebuilt binaries, see [Building from source](http://www.nodegit.org/guides/install/from-source/). +- Updated OpenSSL to 1.1.1l +- Updated libssh2 to 1.10.0 +- Added `Repo.prototype.statistics` method for calculating repository statistics +- More progress towards becoming context-aware + +#### Merged PRs into NodeGit +- [Allow download of prebuilt OpenSSL](https://github.com/nodegit/nodegit/pull/1875) +- [Update libssh2 to 1.10.0](https://github.com/nodegit/nodegit/pull/1874) +- [Statistics with same output as "git-sizer -j"](https://github.com/nodegit/nodegit/pull/1846) +- [Fix memory leak on context shutdown](https://github.com/nodegit/nodegit/pull/1856) +- [Build OpenSSL locally for Electron](https://github.com/nodegit/nodegit/pull/1870) +- [Fix a reference error when compiling with VC2019](https://github.com/nodegit/nodegit/pull/1859) +- [Use containers for Linux CI](https://github.com/nodegit/nodegit/pull/1860) + + ## v0.28.0-alpha.9 [(2021-06-04)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.9) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.8...v0.28.0-alpha.9) @@ -73,7 +95,7 @@ - NodeGit.Cherrypick - NodeGit.Cherrypick.commit - NodeGit.Merge - - NodeGit.Patch.fromBlobs + - NodeGit.PatchBlobs - NodeGit.Rebase.open - NodeGit.Remote.prototype.connect - NodeGit.Remote.prototype.download diff --git a/package-lock.json b/package-lock.json index 56d8e9034..7dc9f9924 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.9", + "version": "0.28.0-alpha.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 860c41b07..70db2ef1a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.9", + "version": "0.28.0-alpha.10", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From ed0b777a5ad5fe2338edd6504a60ea3ae678adfe Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 19 Nov 2021 19:05:33 -0700 Subject: [PATCH 348/545] Don't build shared OpenSSL libs We statically link OpenSSL --- utils/acquireOpenSSL.js | 2 +- utils/build-openssl.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 4f8e337fe..53e8214d8 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -41,7 +41,7 @@ class HashVerify extends stream.Transform { } const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { - await execPromise(`./Configure darwin64-x86_64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${ + await execPromise(`./Configure darwin64-x86_64-cc no-shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${ extractPath }" --openssldir="${extractPath}" -mmacosx-version-min=${macOsDeploymentTarget}`, { cwd: buildCwd diff --git a/utils/build-openssl.bat b/utils/build-openssl.bat index dd9ee6a9c..6e146cf89 100644 --- a/utils/build-openssl.bat +++ b/utils/build-openssl.bat @@ -1,6 +1,6 @@ @call %1 %2 -perl .\Configure %3 shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." || goto :error +perl .\Configure %3 no-shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." || goto :error nmake || goto :error nmake test || goto :error From 7797550bb87198130ad321ccdf795ce3b5f3c5be Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 1 Dec 2021 16:11:36 -0700 Subject: [PATCH 349/545] Support building OpenSSL on M1 macs --- utils/acquireOpenSSL.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 53e8214d8..7363f6bcb 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -41,7 +41,13 @@ class HashVerify extends stream.Transform { } const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { - await execPromise(`./Configure darwin64-x86_64-cc no-shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${ + const triplet = process.arch === 'x64' + ? 'darwin64-x86_64-cc' + : 'darwin64-arm64-cc'; + + await execPromise(`./Configure ${ + triplet + } no-shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${ extractPath }" --openssldir="${extractPath}" -mmacosx-version-min=${macOsDeploymentTarget}`, { cwd: buildCwd From 1845be35aa3aa94d385df4ce7fa5b1307a76efa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Wed, 29 Dec 2021 15:47:17 +0100 Subject: [PATCH 350/545] Fix typos in examples --- examples/create-new-repo.js | 2 +- examples/general.js | 4 ++-- examples/merge-with-conflicts.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/create-new-repo.js b/examples/create-new-repo.js index cdf345ea3..1df93fbbc 100644 --- a/examples/create-new-repo.js +++ b/examples/create-new-repo.js @@ -23,7 +23,7 @@ const repoDir = "../newRepo"; const committer = nodegit.Signature.now("Scott A Chacon", "scott@github.com"); - // Since we're creating an inital commit, it has no parents. Note that unlike + // Since we're creating an initial commit, it has no parents. Note that unlike // normal we don't get the head either, because there isn't one yet. const commitId = await repo.createCommit("HEAD", author, committer, "message", oid, []); console.log("New Commit: ", commitId); diff --git a/examples/general.js b/examples/general.js index ea6ada149..b06c4d795 100644 --- a/examples/general.js +++ b/examples/general.js @@ -256,9 +256,9 @@ const path = require("path"); // Now that we have the starting point pushed onto the walker, we 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 + // for as commit oids. We can then lookup and parse the commits 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 + // since the raw contents of the commit object will be cached in memory. async function walk() { let oid; diff --git a/examples/merge-with-conflicts.js b/examples/merge-with-conflicts.js index 77e78340e..55fb87d3b 100644 --- a/examples/merge-with-conflicts.js +++ b/examples/merge-with-conflicts.js @@ -175,8 +175,8 @@ fse.remove(path.resolve(__dirname, repoDir)) } }) -// we need to get a new index as the other one isnt backed to -// the repository in the usual fashion, and just behaves weirdly +// we need to get a new index as the other one is not backed to +// the repository in the usual fashion, and just behaves weirdly. .then(function() { return repository.refreshIndex() .then(function(index) { From e10f4338688dc2406c82a31f8f03a8f4c1fbea26 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Tue, 11 Jan 2022 12:43:24 +0100 Subject: [PATCH 351/545] RSA SHA2 256/512 key upgrade support RFC 8332 #536 (#626) Notes: * Host Key RSA 256/512 support #536 * Client side key hash upgrading for RFC 8332 * Support for server-sig-algs, ext-info-c server messages * Customizing preferred server-sig-algs via the preference LIBSSH2_METHOD_SIGN_ALGO Credit: Anders Borum, Will Cosgrove --- vendor/libssh2/docs/HACKING-CRYPTO | 37 ++++ vendor/libssh2/docs/libssh2_session_methods.3 | 7 +- vendor/libssh2/include/libssh2.h | 1 + vendor/libssh2/src/crypto.h | 32 +++ vendor/libssh2/src/hostkey.c | 198 +++++++++++++++++- vendor/libssh2/src/kex.c | 22 ++ vendor/libssh2/src/libgcrypt.c | 18 ++ vendor/libssh2/src/libgcrypt.h | 1 + vendor/libssh2/src/libssh2_priv.h | 8 + vendor/libssh2/src/mbedtls.c | 19 ++ vendor/libssh2/src/mbedtls.h | 1 + vendor/libssh2/src/openssl.c | 94 ++++++++- vendor/libssh2/src/openssl.h | 2 + vendor/libssh2/src/packet.c | 69 ++++++ vendor/libssh2/src/userauth.c | 159 +++++++++++++- vendor/libssh2/src/wincng.c | 18 ++ vendor/libssh2/src/wincng.h | 1 + 17 files changed, 666 insertions(+), 21 deletions(-) diff --git a/vendor/libssh2/docs/HACKING-CRYPTO b/vendor/libssh2/docs/HACKING-CRYPTO index ca9477286..85d813aa6 100644 --- a/vendor/libssh2/docs/HACKING-CRYPTO +++ b/vendor/libssh2/docs/HACKING-CRYPTO @@ -637,6 +637,32 @@ Note: this procedure is not used if macro _libssh2_rsa_sha1_signv() is defined. void _libssh2_rsa_free(libssh2_rsa_ctx *rsactx); Releases the RSA computation context at rsactx. +LIBSSH2_RSA_SHA2 +#define as 1 if the crypto library supports RSA SHA2 256/512, else 0. +If defined as 0, the rest of this section can be omitted. + +int _libssh2_rsa_sha2_sign(LIBSSH2_SESSION * session, + libssh2_rsa_ctx * rsactx, + const unsigned char *hash, + size_t hash_len, + unsigned char **signature, + size_t *signature_len); +RSA signs the (hash, hashlen) SHA-2 hash bytes based on hash length and stores +the allocated signature at (signature, signature_len). +Signature buffer must be allocated from the given session. +Returns 0 if OK, else -1. +This procedure is already prototyped in crypto.h. +Note: this procedure is not used if macro _libssh2_rsa_sha1_signv() is defined. + +int _libssh2_rsa_sha2_verify(libssh2_rsa_ctx * rsa, + size_t hash_len, + const unsigned char *sig, + unsigned long sig_len, + const unsigned char *m, unsigned long m_len); +Verify (sig, sig_len) signature of (m, m_len) using an SHA-2 hash based on +hash length and the RSA context. +Return 0 if OK, else -1. +This procedure is already prototyped in crypto.h. 7.2) DSA LIBSSH2_DSA @@ -900,3 +926,14 @@ If this is not needed, it should be defined as an empty macro. int _libssh2_random(unsigned char *buf, int len); Store len random bytes at buf. Returns 0 if OK, else -1. + +const char * _libssh2_supported_key_sign_algorithms(LIBSSH2_SESSION *session, + unsigned char *key_method, + size_t key_method_len); + +This function is for implementing key hash upgrading as defined in RFC 8332. + +Based on the incoming key_method value, this function will return a +list of supported algorithms that can upgrade the original key method algorithm +as a comma seperated list, if there is no upgrade option this function should +return NULL. diff --git a/vendor/libssh2/docs/libssh2_session_methods.3 b/vendor/libssh2/docs/libssh2_session_methods.3 index cc4f6d49f..0e7f79fa9 100644 --- a/vendor/libssh2/docs/libssh2_session_methods.3 +++ b/vendor/libssh2/docs/libssh2_session_methods.3 @@ -1,4 +1,4 @@ -.TH libssh2_session_methods 3 "1 Jun 2007" "libssh2 0.15" "libssh2 manual" +.TH libssh2_session_methods 3 "8 Nov 2021" "libssh2 1.11" "libssh2 manual" .SH NAME libssh2_session_methods - return the currently active algorithms .SH SYNOPSIS @@ -8,13 +8,14 @@ const char * libssh2_session_methods(LIBSSH2_SESSION *session, int method_type); .SH DESCRIPTION -\fIsession\fP - Session instance as returned by +\fIsession\fP - Session instance as returned by .BR libssh2_session_init_ex(3) \fImethod_type\fP - one of the method type constants: LIBSSH2_METHOD_KEX, LIBSSH2_METHOD_HOSTKEY, LIBSSH2_METHOD_CRYPT_CS, LIBSSH2_METHOD_CRYPT_SC, LIBSSH2_METHOD_MAC_CS, LIBSSH2_METHOD_MAC_SC, LIBSSH2_METHOD_COMP_CS, -LIBSSH2_METHOD_COMP_SC, LIBSSH2_METHOD_LANG_CS, LIBSSH2_METHOD_LANG_SC. +LIBSSH2_METHOD_COMP_SC, LIBSSH2_METHOD_LANG_CS, LIBSSH2_METHOD_LANG_SC, +LIBSSH2_METHOD_SIGN_ALGO. Returns the actual method negotiated for a particular transport parameter. .SH RETURN VALUE diff --git a/vendor/libssh2/include/libssh2.h b/vendor/libssh2/include/libssh2.h index 995d83ed0..295e18245 100644 --- a/vendor/libssh2/include/libssh2.h +++ b/vendor/libssh2/include/libssh2.h @@ -356,6 +356,7 @@ typedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE #define LIBSSH2_METHOD_COMP_SC 7 #define LIBSSH2_METHOD_LANG_CS 8 #define LIBSSH2_METHOD_LANG_SC 9 +#define LIBSSH2_METHOD_SIGN_ALGO 10 /* flags */ #define LIBSSH2_FLAG_SIGPIPE 1 diff --git a/vendor/libssh2/src/crypto.h b/vendor/libssh2/src/crypto.h index f512d6039..809aef7e9 100644 --- a/vendor/libssh2/src/crypto.h +++ b/vendor/libssh2/src/crypto.h @@ -93,6 +93,19 @@ int _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, size_t hash_len, unsigned char **signature, size_t *signature_len); +#if LIBSSH2_RSA_SHA2 +int _libssh2_rsa_sha2_sign(LIBSSH2_SESSION * session, + libssh2_rsa_ctx * rsactx, + const unsigned char *hash, + size_t hash_len, + unsigned char **signature, + size_t *signature_len); +int _libssh2_rsa_sha2_verify(libssh2_rsa_ctx * rsa, + size_t hash_len, + const unsigned char *sig, + unsigned long sig_len, + const unsigned char *m, unsigned long m_len); +#endif int _libssh2_rsa_new_private_frommemory(libssh2_rsa_ctx ** rsa, LIBSSH2_SESSION * session, const char *filedata, @@ -245,4 +258,23 @@ int _libssh2_pub_priv_keyfilememory(LIBSSH2_SESSION *session, size_t privatekeydata_len, const char *passphrase); + +/** + * @function _libssh2_supported_key_sign_algorithms + * @abstract Returns supported algorithms used for upgrading public + * key signing RFC 8332 + * @discussion Based on the incoming key_method value, this function + * will return supported algorithms that can upgrade the key method + * @related _libssh2_key_sign_algorithm() + * @param key_method current key method, usually the default key sig method + * @param key_method_len length of the key method buffer + * @result comma seperated list of supported upgrade options per RFC 8332, if + * there is no upgrade option return NULL + */ + +const char * +_libssh2_supported_key_sign_algorithms(LIBSSH2_SESSION *session, + unsigned char *key_method, + size_t key_method_len); + #endif /* __LIBSSH2_CRYPTO_H */ diff --git a/vendor/libssh2/src/hostkey.c b/vendor/libssh2/src/hostkey.c index d87a4c744..eeb9e579e 100644 --- a/vendor/libssh2/src/hostkey.c +++ b/vendor/libssh2/src/hostkey.c @@ -64,8 +64,8 @@ hostkey_method_ssh_rsa_init(LIBSSH2_SESSION * session, void **abstract) { libssh2_rsa_ctx *rsactx; - unsigned char *e, *n; - size_t e_len, n_len; + unsigned char *e, *n, *type; + size_t e_len, n_len, type_len; struct string_buf buf; if(*abstract) { @@ -83,8 +83,27 @@ hostkey_method_ssh_rsa_init(LIBSSH2_SESSION * session, buf.dataptr = buf.data; buf.len = hostkey_data_len; - if(_libssh2_match_string(&buf, "ssh-rsa")) + if(_libssh2_get_string(&buf, &type, &type_len)) { return -1; + } + + /* we accept one of 3 header types */ + if(type_len == 7 && strncmp("ssh-rsa", (char *)type, 7) == 0) { + /* ssh-rsa */ + } +#if LIBSSH2_RSA_SHA2 + else if(type_len == 12 && strncmp("rsa-sha2-256", (char *)type, 12) == 0) { + /* rsa-sha2-256 */ + } + else if(type_len == 12 && strncmp("rsa-sha2-512", (char *)type, 12) == 0) { + /* rsa-sha2-512 */ + } +#endif + else { + _libssh2_debug(session, LIBSSH2_TRACE_ERROR, + "unexpected rsa type: %.*s", type_len, type); + return -1; + } if(_libssh2_get_string(&buf, &e, &e_len)) return -1; @@ -227,6 +246,146 @@ hostkey_method_ssh_rsa_signv(LIBSSH2_SESSION * session, #endif } +/* + * hostkey_method_ssh_rsa_sha2_256_sig_verify + * + * Verify signature created by remote + */ +#if LIBSSH2_RSA_SHA2 + +static int +hostkey_method_ssh_rsa_sha2_256_sig_verify(LIBSSH2_SESSION * session, + const unsigned char *sig, + size_t sig_len, + const unsigned char *m, + size_t m_len, void **abstract) +{ + libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract); + (void) session; + + /* Skip past keyname_len(4) + keyname(12){"rsa-sha2-256"} + + signature_len(4) */ + if(sig_len < 20) + return -1; + + sig += 20; + sig_len -= 20; + return _libssh2_rsa_sha2_verify(rsactx, SHA256_DIGEST_LENGTH, sig, sig_len, + m, m_len); +} + +/* + * hostkey_method_ssh_rsa_sha2_256_signv + * + * Construct a signature from an array of vectors + */ + +static int +hostkey_method_ssh_rsa_sha2_256_signv(LIBSSH2_SESSION * session, + unsigned char **signature, + size_t *signature_len, + int veccount, + const struct iovec datavec[], + void **abstract) +{ + libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract); + +#ifdef _libssh2_rsa_sha2_256_signv + return _libssh2_rsa_sha2_256_signv(session, signature, signature_len, + veccount, datavec, rsactx); +#else + int ret; + int i; + unsigned char hash[SHA256_DIGEST_LENGTH]; + libssh2_sha256_ctx ctx; + + libssh2_sha256_init(&ctx); + for(i = 0; i < veccount; i++) { + libssh2_sha256_update(ctx, datavec[i].iov_base, datavec[i].iov_len); + } + libssh2_sha256_final(ctx, hash); + + ret = _libssh2_rsa_sha2_sign(session, rsactx, hash, SHA256_DIGEST_LENGTH, + signature, signature_len); + if(ret) { + return -1; + } + + return 0; +#endif +} + +/* + * hostkey_method_ssh_rsa_sha2_512_sig_verify + * + * Verify signature created by remote + */ + +static int +hostkey_method_ssh_rsa_sha2_512_sig_verify(LIBSSH2_SESSION * session, + const unsigned char *sig, + size_t sig_len, + const unsigned char *m, + size_t m_len, void **abstract) +{ + libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract); + (void) session; + + /* Skip past keyname_len(4) + keyname(12){"rsa-sha2-512"} + + signature_len(4) */ + if(sig_len < 20) + return -1; + + sig += 20; + sig_len -= 20; + return _libssh2_rsa_sha2_verify(rsactx, SHA512_DIGEST_LENGTH, sig, + sig_len, m, m_len); +} + + +/* + * hostkey_method_ssh_rsa_sha2_512_signv + * + * Construct a signature from an array of vectors + */ +static int +hostkey_method_ssh_rsa_sha2_512_signv(LIBSSH2_SESSION * session, + unsigned char **signature, + size_t *signature_len, + int veccount, + const struct iovec datavec[], + void **abstract) +{ + libssh2_rsa_ctx *rsactx = (libssh2_rsa_ctx *) (*abstract); + +#ifdef _libssh2_rsa_sha2_512_signv + return _libssh2_rsa_sha2_512_signv(session, signature, signature_len, + veccount, datavec, rsactx); +#else + int ret; + int i; + unsigned char hash[SHA512_DIGEST_LENGTH]; + libssh2_sha512_ctx ctx; + + libssh2_sha512_init(&ctx); + for(i = 0; i < veccount; i++) { + libssh2_sha512_update(ctx, datavec[i].iov_base, datavec[i].iov_len); + } + libssh2_sha512_final(ctx, hash); + + ret = _libssh2_rsa_sha2_sign(session, rsactx, hash, SHA512_DIGEST_LENGTH, + signature, signature_len); + if(ret) { + return -1; + } + + return 0; +#endif +} + +#endif /* LIBSSH2_RSA_SHA2 */ + + /* * hostkey_method_ssh_rsa_dtor * @@ -260,6 +419,35 @@ static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_rsa = { NULL, /* encrypt */ hostkey_method_ssh_rsa_dtor, }; + +#if LIBSSH2_RSA_SHA2 + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_rsa_sha2_256 = { + "rsa-sha2-256", + SHA256_DIGEST_LENGTH, + hostkey_method_ssh_rsa_init, + hostkey_method_ssh_rsa_initPEM, + hostkey_method_ssh_rsa_initPEMFromMemory, + hostkey_method_ssh_rsa_sha2_256_sig_verify, + hostkey_method_ssh_rsa_sha2_256_signv, + NULL, /* encrypt */ + hostkey_method_ssh_rsa_dtor, +}; + +static const LIBSSH2_HOSTKEY_METHOD hostkey_method_ssh_rsa_sha2_512 = { + "rsa-sha2-512", + SHA512_DIGEST_LENGTH, + hostkey_method_ssh_rsa_init, + hostkey_method_ssh_rsa_initPEM, + hostkey_method_ssh_rsa_initPEMFromMemory, + hostkey_method_ssh_rsa_sha2_512_sig_verify, + hostkey_method_ssh_rsa_sha2_512_signv, + NULL, /* encrypt */ + hostkey_method_ssh_rsa_dtor, +}; + +#endif /* LIBSSH2_RSA_SHA2 */ + #endif /* LIBSSH2_RSA */ #if LIBSSH2_DSA @@ -1043,6 +1231,10 @@ static const LIBSSH2_HOSTKEY_METHOD *hostkey_methods[] = { &hostkey_method_ssh_ed25519, #endif #if LIBSSH2_RSA +#if LIBSSH2_RSA_SHA2 + &hostkey_method_ssh_rsa_sha2_512, + &hostkey_method_ssh_rsa_sha2_256, +#endif /* LIBSSH2_RSA_SHA2 */ &hostkey_method_ssh_rsa, #endif /* LIBSSH2_RSA */ #if LIBSSH2_DSA diff --git a/vendor/libssh2/src/kex.c b/vendor/libssh2/src/kex.c index 9f3ef7992..f45d48a2b 100644 --- a/vendor/libssh2/src/kex.c +++ b/vendor/libssh2/src/kex.c @@ -3026,6 +3026,17 @@ kex_method_ssh_curve25519_sha256 = { }; #endif +/* this kex method signals that client can receive extensions + * as described in https://datatracker.ietf.org/doc/html/rfc8308 +*/ + +static const LIBSSH2_KEX_METHOD +kex_method_extension_negotiation = { + "ext-info-c", + NULL, + 0, +}; + static const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = { #if LIBSSH2_ED25519 &kex_method_ssh_curve25519_sha256, @@ -3043,6 +3054,7 @@ static const LIBSSH2_KEX_METHOD *libssh2_kex_methods[] = { &kex_method_diffie_helman_group14_sha1, &kex_method_diffie_helman_group1_sha1, &kex_method_diffie_helman_group_exchange_sha1, + &kex_method_extension_negotiation, NULL }; @@ -3978,6 +3990,11 @@ libssh2_session_method_pref(LIBSSH2_SESSION * session, int method_type, mlist = NULL; break; + case LIBSSH2_METHOD_SIGN_ALGO: + prefvar = &session->sign_algo_prefs; + mlist = NULL; + break; + default: return _libssh2_error(session, LIBSSH2_ERROR_INVAL, "Invalid parameter specified for method_type"); @@ -4073,6 +4090,11 @@ LIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session, _libssh2_comp_methods(session); break; + case LIBSSH2_METHOD_SIGN_ALGO: + /* no built-in supported list due to backend support */ + mlist = NULL; + break; + default: return _libssh2_error(session, LIBSSH2_ERROR_METHOD_NOT_SUPPORTED, "Unknown method type"); diff --git a/vendor/libssh2/src/libgcrypt.c b/vendor/libssh2/src/libgcrypt.c index 0aff176a6..f6e9b64a3 100644 --- a/vendor/libssh2/src/libgcrypt.c +++ b/vendor/libssh2/src/libgcrypt.c @@ -664,4 +664,22 @@ _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) *dhctx = NULL; } +/* _libssh2_supported_key_sign_algorithms + * + * Return supported key hash algo upgrades, see crypto.h + * + */ + +const char * +_libssh2_supported_key_sign_algorithms(LIBSSH2_SESSION *session, + unsigned char *key_method, + size_t key_method_len) +{ + (void)session; + (void)key_method; + (void)key_method_len; + + return NULL; +} + #endif /* LIBSSH2_LIBGCRYPT */ diff --git a/vendor/libssh2/src/libgcrypt.h b/vendor/libssh2/src/libgcrypt.h index 298c65ed0..95876b96d 100644 --- a/vendor/libssh2/src/libgcrypt.h +++ b/vendor/libssh2/src/libgcrypt.h @@ -55,6 +55,7 @@ #define LIBSSH2_3DES 1 #define LIBSSH2_RSA 1 +#define LIBSSH2_RSA_SHA2 0 #define LIBSSH2_DSA 1 #define LIBSSH2_ECDSA 0 #define LIBSSH2_ED25519 0 diff --git a/vendor/libssh2/src/libssh2_priv.h b/vendor/libssh2/src/libssh2_priv.h index da488b744..aff791e7c 100644 --- a/vendor/libssh2/src/libssh2_priv.h +++ b/vendor/libssh2/src/libssh2_priv.h @@ -640,6 +640,13 @@ struct _LIBSSH2_SESSION unsigned char server_hostkey_sha256[SHA256_DIGEST_LENGTH]; int server_hostkey_sha256_valid; + /* public key algorithms accepted as comma separated list */ + char *server_sign_algorithms; + size_t server_sign_algorithms_len; + + /* key signing algorithm preferences -- NULL yields server order */ + char *sign_algo_prefs; + /* (remote as source of data -- packet_read ) */ libssh2_endpoint_data remote; @@ -1006,6 +1013,7 @@ _libssh2_debug(LIBSSH2_SESSION * session, int context, const char *format, ...) #define SSH_MSG_DEBUG 4 #define SSH_MSG_SERVICE_REQUEST 5 #define SSH_MSG_SERVICE_ACCEPT 6 +#define SSH_MSG_EXT_INFO 7 #define SSH_MSG_KEXINIT 20 #define SSH_MSG_NEWKEYS 21 diff --git a/vendor/libssh2/src/mbedtls.c b/vendor/libssh2/src/mbedtls.c index 4629ce4a9..dc76ef59a 100644 --- a/vendor/libssh2/src/mbedtls.c +++ b/vendor/libssh2/src/mbedtls.c @@ -1247,5 +1247,24 @@ _libssh2_mbedtls_ecdsa_free(libssh2_ecdsa_ctx *ctx) mbedtls_free(ctx); } + +/* _libssh2_supported_key_sign_algorithms + * + * Return supported key hash algo upgrades, see crypto.h + * + */ + +const char * +_libssh2_supported_key_sign_algorithms(LIBSSH2_SESSION *session, + unsigned char *key_method, + size_t key_method_len) +{ + (void)session; + (void)key_method; + (void)key_method_len; + + return NULL; +} + #endif /* LIBSSH2_ECDSA */ #endif /* LIBSSH2_MBEDTLS */ diff --git a/vendor/libssh2/src/mbedtls.h b/vendor/libssh2/src/mbedtls.h index 671932c58..0450113f0 100644 --- a/vendor/libssh2/src/mbedtls.h +++ b/vendor/libssh2/src/mbedtls.h @@ -71,6 +71,7 @@ #define LIBSSH2_3DES 1 #define LIBSSH2_RSA 1 +#define LIBSSH2_RSA_SHA2 0 #define LIBSSH2_DSA 0 #ifdef MBEDTLS_ECDSA_C # define LIBSSH2_ECDSA 1 diff --git a/vendor/libssh2/src/openssl.c b/vendor/libssh2/src/openssl.c index 7a6810f13..72a85b3b6 100644 --- a/vendor/libssh2/src/openssl.c +++ b/vendor/libssh2/src/openssl.c @@ -154,21 +154,57 @@ _libssh2_rsa_new(libssh2_rsa_ctx ** rsa, } int -_libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsactx, +_libssh2_rsa_sha2_verify(libssh2_rsa_ctx * rsactx, + size_t hash_len, const unsigned char *sig, unsigned long sig_len, const unsigned char *m, unsigned long m_len) { - unsigned char hash[SHA_DIGEST_LENGTH]; int ret; + int nid_type; + unsigned char *hash = malloc(hash_len); + if(hash == NULL) + return -1; + + if(hash_len == SHA_DIGEST_LENGTH) { + nid_type = NID_sha1; + ret = _libssh2_sha1(m, m_len, hash); + } + else if(hash_len == SHA256_DIGEST_LENGTH) { + nid_type = NID_sha256; + ret = _libssh2_sha256(m, m_len, hash); + + } + else if(hash_len == SHA512_DIGEST_LENGTH) { + nid_type = NID_sha512; + ret = _libssh2_sha512(m, m_len, hash); + } + else + ret = -1; /* unsupported digest */ - if(_libssh2_sha1(m, m_len, hash)) + if(ret != 0) { + free(hash); return -1; /* failure */ - ret = RSA_verify(NID_sha1, hash, SHA_DIGEST_LENGTH, + } + + ret = RSA_verify(nid_type, hash, hash_len, (unsigned char *) sig, sig_len, rsactx); + + free(hash); + return (ret == 1) ? 0 : -1; } +int +_libssh2_rsa_sha1_verify(libssh2_rsa_ctx * rsactx, + const unsigned char *sig, + unsigned long sig_len, + const unsigned char *m, unsigned long m_len) +{ + return _libssh2_rsa_sha2_verify(rsactx, SHA_DIGEST_LENGTH, sig, sig_len, m, + m_len); +} + #if LIBSSH2_DSA int _libssh2_dsa_new(libssh2_dsa_ctx ** dsactx, @@ -1876,7 +1912,7 @@ _libssh2_ed25519_new_public(libssh2_ed25519_ctx ** ed_ctx, int -_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, +_libssh2_rsa_sha2_sign(LIBSSH2_SESSION * session, libssh2_rsa_ctx * rsactx, const unsigned char *hash, size_t hash_len, @@ -1893,7 +1929,17 @@ _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, return -1; } - ret = RSA_sign(NID_sha1, hash, hash_len, sig, &sig_len, rsactx); + if(hash_len == SHA_DIGEST_LENGTH) + ret = RSA_sign(NID_sha1, hash, hash_len, sig, &sig_len, rsactx); + else if(hash_len == SHA256_DIGEST_LENGTH) + ret = RSA_sign(NID_sha256, hash, hash_len, sig, &sig_len, rsactx); + else if(hash_len == SHA512_DIGEST_LENGTH) + ret = RSA_sign(NID_sha512, hash, hash_len, sig, &sig_len, rsactx); + else { + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unsupported hash digest length"); + ret = -1; + } if(!ret) { LIBSSH2_FREE(session, sig); @@ -1906,6 +1952,19 @@ _libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, return 0; } + +int +_libssh2_rsa_sha1_sign(LIBSSH2_SESSION * session, + libssh2_rsa_ctx * rsactx, + const unsigned char *hash, + size_t hash_len, + unsigned char **signature, size_t *signature_len) +{ + return _libssh2_rsa_sha2_sign(session, rsactx, hash, hash_len, + signature, signature_len); +} + + #if LIBSSH2_DSA int _libssh2_dsa_sha1_sign(libssh2_dsa_ctx * dsactx, @@ -3283,4 +3342,27 @@ _libssh2_dh_dtor(_libssh2_dh_ctx *dhctx) *dhctx = NULL; } +/* _libssh2_supported_key_sign_algorithms + * + * Return supported key hash algo upgrades, see crypto.h + * + */ + +const char * +_libssh2_supported_key_sign_algorithms(LIBSSH2_SESSION *session, + unsigned char *key_method, + size_t key_method_len) +{ + (void)session; + +#if LIBSSH2_RSA_SHA2 + if(key_method_len == 7 && + memcmp(key_method, "ssh-rsa", key_method_len) == 0) { + return "rsa-sha2-512,rsa-sha2-256,ssh-rsa"; + } +#endif + + return NULL; +} + #endif /* LIBSSH2_OPENSSL */ diff --git a/vendor/libssh2/src/openssl.h b/vendor/libssh2/src/openssl.h index 658b040d6..2a002b41e 100644 --- a/vendor/libssh2/src/openssl.h +++ b/vendor/libssh2/src/openssl.h @@ -64,8 +64,10 @@ #ifdef OPENSSL_NO_RSA # define LIBSSH2_RSA 0 +# define LIBSSH2_RSA_SHA2 0 #else # define LIBSSH2_RSA 1 +# define LIBSSH2_RSA_SHA2 1 #endif #ifdef OPENSSL_NO_DSA diff --git a/vendor/libssh2/src/packet.c b/vendor/libssh2/src/packet.c index 04937d62a..686be5cc7 100644 --- a/vendor/libssh2/src/packet.c +++ b/vendor/libssh2/src/packet.c @@ -615,6 +615,75 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, session->packAdd_state = libssh2_NB_state_idle; return 0; + /* + byte SSH_MSG_EXT_INFO + uint32 nr-extensions + [repeat "nr-extensions" times] + string extension-name [RFC8308] + string extension-value (binary) + */ + + case SSH_MSG_EXT_INFO: + if(datalen >= 5) { + uint32_t nr_extensions = 0; + struct string_buf buf; + buf.data = (unsigned char *)data; + buf.dataptr = buf.data; + buf.len = datalen; + buf.dataptr += 1; /* advance past type */ + + if(_libssh2_get_u32(&buf, &nr_extensions) != 0) { + rc = _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Invalid extension info received"); + } + + while(rc == 0 && nr_extensions > 0) { + + size_t name_len = 0; + size_t value_len = 0; + unsigned char *name = NULL; + unsigned char *value = NULL; + + nr_extensions -= 1; + + _libssh2_get_string(&buf, &name, &name_len); + _libssh2_get_string(&buf, &value, &value_len); + + if(name != NULL && value != NULL) { + _libssh2_debug(session, + LIBSSH2_TRACE_KEX, + "Server to Client extension %.*s: %.*s", + name_len, name, value_len, value); + } + + if(name_len == 15 && + memcmp(name, "server-sig-algs", 15) == 0) { + if(session->server_sign_algorithms) { + LIBSSH2_FREE(session, + session->server_sign_algorithms); + } + + session->server_sign_algorithms = + LIBSSH2_ALLOC(session, + value_len); + + if(session->server_sign_algorithms) { + session->server_sign_algorithms_len = value_len; + memcpy(session->server_sign_algorithms, + value, value_len); + } + else { + rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "memory for server sign algo"); + } + } + } + } + + LIBSSH2_FREE(session, data); + session->packAdd_state = libssh2_NB_state_idle; + return rc; + /* byte SSH_MSG_GLOBAL_REQUEST string request name in US-ASCII only diff --git a/vendor/libssh2/src/userauth.c b/vendor/libssh2/src/userauth.c index 40ef9153a..d56c5eb17 100644 --- a/vendor/libssh2/src/userauth.c +++ b/vendor/libssh2/src/userauth.c @@ -1086,6 +1086,148 @@ static int plain_method_len(const char *method, size_t method_len) return method_len; } +/** + * @function _libssh2_key_sign_algorithm + * @abstract Upgrades the algorithm used for public key signing RFC 8332 + * @discussion Based on the incoming key_method value, this function + * will upgrade the key method input based on user preferences, + * server support algos and crypto backend support + * @related _libssh2_supported_key_sign_algorithms() + * @param key_method current key method, usually the default key sig method + * @param key_method_len length of the key method buffer + * @result error code or zero on success + */ + +static int +_libssh2_key_sign_algorithm(LIBSSH2_SESSION *session, + unsigned char **key_method, + size_t *key_method_len) +{ + const char *s = NULL; + const char *a = NULL; + const char *match = NULL; + const char *p = NULL; + const char *f = NULL; + char *i = NULL; + int p_len = 0; + int f_len = 0; + int rc = 0; + int match_len = 0; + char *filtered_algs = NULL; + + const char *supported_algs = + _libssh2_supported_key_sign_algorithms(session, + *key_method, + *key_method_len); + + if(supported_algs == NULL || session->server_sign_algorithms == NULL) { + /* no upgrading key algorithm supported, do nothing */ + return LIBSSH2_ERROR_NONE; + } + + filtered_algs = LIBSSH2_ALLOC(session, strlen(supported_algs) + 1); + if(!filtered_algs) { + rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate filtered algs"); + return rc; + } + + s = session->server_sign_algorithms; + i = filtered_algs; + + /* this walks the server algo list and the supported algo list and creates + a filtered list that includes matches */ + + while(s && *s) { + p = strchr(s, ','); + p_len = p ? (p - s) : (int) strlen(s); + a = supported_algs; + + while(a && *a) { + f = strchr(a, ','); + f_len = f ? (f - a) : (int) strlen(a); + + if(f_len == p_len && memcmp(a, s, p_len)) { + + if(i != filtered_algs) { + memcpy(i, ",", 1); + i += 1; + } + + memcpy(i, s, p_len); + i += p_len; + } + + a = f ? (f + 1) : NULL; + } + + s = p ? (p + 1) : NULL; + } + + filtered_algs[i - filtered_algs] = '\0'; + + if(session->sign_algo_prefs) { + s = session->sign_algo_prefs; + } + else { + s = supported_algs; + } + + /* now that we have the possible supported algos, match based on the prefs + or what is supported by the crypto backend, look for a match */ + + while(s && *s && !match) { + p = strchr(s, ','); + p_len = p ? (p - s) : (int) strlen(s); + a = filtered_algs; + + while(a && *a && !match) { + f = strchr(a, ','); + f_len = f ? (f - a) : (int) strlen(a); + + if(f_len == p_len && memcmp(a, s, p_len)) { + /* found a match, upgrade key method */ + match = s; + match_len = p_len; + } + else { + a = f ? (f + 1) : NULL; + } + } + + s = p ? (p + 1) : NULL; + } + + if(match != NULL) { + if(*key_method) + LIBSSH2_FREE(session, *key_method); + + *key_method = LIBSSH2_ALLOC(session, match_len); + if(key_method) { + memcpy(*key_method, match, match_len); + *key_method_len = match_len; + + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Signing using %.*s", match_len, match); + } + else { + *key_method_len = 0; + rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate key method upgrade"); + } + } + else { + /* no match was found */ + rc = _libssh2_error(session, LIBSSH2_ERROR_METHOD_NONE, + "No signing signature matched"); + } + + if(filtered_algs) + LIBSSH2_FREE(session, filtered_algs); + + return rc; +} + int _libssh2_userauth_publickey(LIBSSH2_SESSION *session, const char *username, @@ -1144,15 +1286,14 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, memcpy(session->userauth_pblc_method, pubkeydata + 4, session->userauth_pblc_method_len); } - /* - * The length of the method name read from plaintext prefix in the - * file must match length embedded in the key. - * TODO: The data should match too but we don't check that. Should we? - */ - else if(session->userauth_pblc_method_len != - _libssh2_ntohu32(pubkeydata)) - return _libssh2_error(session, LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED, - "Invalid public key"); + + /* upgrade key key signing algo needed */ + rc = _libssh2_key_sign_algorithm(session, + &session->userauth_pblc_method, + &session->userauth_pblc_method_len); + + if(rc) + return rc; /* * 45 = packet_type(1) + username_len(4) + servicename_len(4) + diff --git a/vendor/libssh2/src/wincng.c b/vendor/libssh2/src/wincng.c index cbb2b61cb..654f50db0 100755 --- a/vendor/libssh2/src/wincng.c +++ b/vendor/libssh2/src/wincng.c @@ -2590,4 +2590,22 @@ _libssh2_dh_secret(_libssh2_dh_ctx *dhctx, _libssh2_bn *secret, return _libssh2_wincng_bignum_mod_exp(secret, f, dhctx->bn, p); } +/* _libssh2_supported_key_sign_algorithms + * + * Return supported key hash algo upgrades, see crypto.h + * + */ + +const char * +_libssh2_supported_key_sign_algorithms(LIBSSH2_SESSION *session, + unsigned char *key_method, + size_t key_method_len) +{ + (void)session; + (void)key_method; + (void)key_method_len; + + return NULL; +} + #endif /* LIBSSH2_WINCNG */ diff --git a/vendor/libssh2/src/wincng.h b/vendor/libssh2/src/wincng.h index eaf6f9051..538cc4314 100755 --- a/vendor/libssh2/src/wincng.h +++ b/vendor/libssh2/src/wincng.h @@ -63,6 +63,7 @@ #define LIBSSH2_3DES 1 #define LIBSSH2_RSA 1 +#define LIBSSH2_RSA_SHA2 0 #define LIBSSH2_DSA 1 #define LIBSSH2_ECDSA 0 #define LIBSSH2_ED25519 0 From 06b90ef9eb4d979e9b2f52363144925e78ba68d8 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Tue, 11 Jan 2022 17:27:23 +0100 Subject: [PATCH 352/545] Fix a memcmp errors in code that was changed from memmem to memcmp (#656 ) Notes: Fixed supported algo prefs list check when upgrading rsa keys Credit: Michael Buckley --- vendor/libssh2/src/userauth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/libssh2/src/userauth.c b/vendor/libssh2/src/userauth.c index d56c5eb17..ae9650d20 100644 --- a/vendor/libssh2/src/userauth.c +++ b/vendor/libssh2/src/userauth.c @@ -1147,7 +1147,7 @@ _libssh2_key_sign_algorithm(LIBSSH2_SESSION *session, f = strchr(a, ','); f_len = f ? (f - a) : (int) strlen(a); - if(f_len == p_len && memcmp(a, s, p_len)) { + if(f_len == p_len && memcmp(a, s, p_len) == 0) { if(i != filtered_algs) { memcpy(i, ",", 1); @@ -1185,7 +1185,7 @@ _libssh2_key_sign_algorithm(LIBSSH2_SESSION *session, f = strchr(a, ','); f_len = f ? (f - a) : (int) strlen(a); - if(f_len == p_len && memcmp(a, s, p_len)) { + if(f_len == p_len && memcmp(a, s, p_len) == 0) { /* found a match, upgrade key method */ match = s; match_len = p_len; From 1d5251292ac7ded559f41addbbb042e715b3939f Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Fri, 14 Jan 2022 10:02:18 +0100 Subject: [PATCH 353/545] ssh: Add support for userauth banner. The new libssh2_userauth_banner API allows to get an optional userauth banner sent with SSH_MSG_USERAUTH_BANNER packet by the server. Closes issue 610 --- vendor/libssh2/docs/CMakeLists.txt | 1 + vendor/libssh2/docs/Makefile.am | 1 + vendor/libssh2/docs/libssh2_userauth_banner.3 | 30 +++++++ vendor/libssh2/include/libssh2.h | 3 + vendor/libssh2/src/libssh2_priv.h | 1 + vendor/libssh2/src/session.c | 3 + vendor/libssh2/src/userauth.c | 81 ++++++++++++++++++- 7 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 vendor/libssh2/docs/libssh2_userauth_banner.3 diff --git a/vendor/libssh2/docs/CMakeLists.txt b/vendor/libssh2/docs/CMakeLists.txt index 6abf0e498..b69ccced5 100644 --- a/vendor/libssh2/docs/CMakeLists.txt +++ b/vendor/libssh2/docs/CMakeLists.txt @@ -193,6 +193,7 @@ set(MAN_PAGES libssh2_trace.3 libssh2_trace_sethandler.3 libssh2_userauth_authenticated.3 + libssh2_userauth_banner.3 libssh2_userauth_hostbased_fromfile.3 libssh2_userauth_hostbased_fromfile_ex.3 libssh2_userauth_keyboard_interactive.3 diff --git a/vendor/libssh2/docs/Makefile.am b/vendor/libssh2/docs/Makefile.am index a80943122..a69a16ca6 100644 --- a/vendor/libssh2/docs/Makefile.am +++ b/vendor/libssh2/docs/Makefile.am @@ -163,6 +163,7 @@ dist_man_MANS = \ libssh2_trace.3 \ libssh2_trace_sethandler.3 \ libssh2_userauth_authenticated.3 \ + libssh2_userauth_banner.3 \ libssh2_userauth_hostbased_fromfile.3 \ libssh2_userauth_hostbased_fromfile_ex.3 \ libssh2_userauth_keyboard_interactive.3 \ diff --git a/vendor/libssh2/docs/libssh2_userauth_banner.3 b/vendor/libssh2/docs/libssh2_userauth_banner.3 new file mode 100644 index 000000000..1003b65ad --- /dev/null +++ b/vendor/libssh2/docs/libssh2_userauth_banner.3 @@ -0,0 +1,30 @@ +.TH libssh2_userauth_banner 3 "1 Jun 2021" "libssh2 1.9.0" "libssh2 manual" +.SH NAME +libssh2_userauth_banner - get the server's userauth banner message +.SH SYNOPSIS +.nf +#include + +int +libssh2_userauth_banner(LIBSSH2_SESSION *session, char **banner); +.SH DESCRIPTION +\fIsession\fP - Session instance as returned by +.BR libssh2_session_init_ex(3) + +\fIbanner\fP - Should point to a pointer that gets filled with banner message. + +After an authentication has been attempted, such as a +\fBSSH_USERAUTH_NONE\fP request sent by +.BR libssh2_userauth_list(3) , +this function can be called to retrieve the userauth banner sent by +the server. If no such banner is sent, or if an authentication has not +yet been attempted, returns LIBSSH2_ERROR_MISSING_USERAUTH_BANNER. +.SH RETURN VALUE +On success returns 0 and an UTF-8 NUL-terminated string is stored in the +\fIbanner\fP. This string is internally managed by libssh2 and will be +deallocated upon session termination. +On failure returns +LIBSSH2_ERROR_MISSING_USERAUTH_BANNER. +.SH SEE ALSO +.BR libssh2_session_init_ex(3), +.BR libssh2_userauth_list(3) diff --git a/vendor/libssh2/include/libssh2.h b/vendor/libssh2/include/libssh2.h index 295e18245..3f6cdad6f 100644 --- a/vendor/libssh2/include/libssh2.h +++ b/vendor/libssh2/include/libssh2.h @@ -507,6 +507,7 @@ typedef struct _LIBSSH2_POLLFD { #define LIBSSH2_ERROR_CHANNEL_WINDOW_FULL -47 #define LIBSSH2_ERROR_KEYFILE_AUTH_FAILED -48 #define LIBSSH2_ERROR_RANDGEN -49 +#define LIBSSH2_ERROR_MISSING_USERAUTH_BANNER -50 /* this is a define to provide the old (<= 1.2.7) name */ #define LIBSSH2_ERROR_BANNER_NONE LIBSSH2_ERROR_BANNER_RECV @@ -615,6 +616,8 @@ LIBSSH2_API const char *libssh2_session_banner_get(LIBSSH2_SESSION *session); LIBSSH2_API char *libssh2_userauth_list(LIBSSH2_SESSION *session, const char *username, unsigned int username_len); +LIBSSH2_API int libssh2_userauth_banner(LIBSSH2_SESSION *session, + char **banner); LIBSSH2_API int libssh2_userauth_authenticated(LIBSSH2_SESSION *session); LIBSSH2_API int diff --git a/vendor/libssh2/src/libssh2_priv.h b/vendor/libssh2/src/libssh2_priv.h index aff791e7c..f218a836d 100644 --- a/vendor/libssh2/src/libssh2_priv.h +++ b/vendor/libssh2/src/libssh2_priv.h @@ -720,6 +720,7 @@ struct _LIBSSH2_SESSION libssh2_nonblocking_states userauth_list_state; unsigned char *userauth_list_data; size_t userauth_list_data_len; + char *userauth_banner; packet_requirev_state_t userauth_list_packet_requirev_state; /* State variables used in libssh2_userauth_password_ex() */ diff --git a/vendor/libssh2/src/session.c b/vendor/libssh2/src/session.c index 212560b88..0de5ab3fd 100644 --- a/vendor/libssh2/src/session.c +++ b/vendor/libssh2/src/session.c @@ -994,6 +994,9 @@ session_free(LIBSSH2_SESSION *session) if(session->userauth_list_data) { LIBSSH2_FREE(session, session->userauth_list_data); } + if(session->userauth_banner) { + LIBSSH2_FREE(session, session->userauth_banner); + } if(session->userauth_pswd_data) { LIBSSH2_FREE(session, session->userauth_pswd_data); } diff --git a/vendor/libssh2/src/userauth.c b/vendor/libssh2/src/userauth.c index ae9650d20..3d85143a1 100644 --- a/vendor/libssh2/src/userauth.c +++ b/vendor/libssh2/src/userauth.c @@ -63,11 +63,13 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, unsigned int username_len) { - static const unsigned char reply_codes[3] = - { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, 0 }; + unsigned char reply_codes[4] = + { SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, + SSH_MSG_USERAUTH_BANNER, 0 }; /* packet_type(1) + username_len(4) + service_len(4) + service(14)"ssh-connection" + method_len(4) = 27 */ unsigned long methods_len; + unsigned int banner_len; unsigned char *s; int rc; @@ -134,6 +136,57 @@ static char *userauth_list(LIBSSH2_SESSION *session, const char *username, return NULL; } + if(session->userauth_list_data[0] == SSH_MSG_USERAUTH_BANNER) { + if(session->userauth_list_data_len < 5) { + LIBSSH2_FREE(session, session->userauth_list_data); + session->userauth_list_data = NULL; + _libssh2_error(session, LIBSSH2_ERROR_PROTO, + "Unexpected packet size"); + return NULL; + } + banner_len = _libssh2_ntohu32(session->userauth_list_data + 1); + if(banner_len >= session->userauth_list_data_len - 5) { + LIBSSH2_FREE(session, session->userauth_list_data); + session->userauth_list_data = NULL; + _libssh2_error(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY, + "Unexpected userauth banner size"); + return NULL; + } + session->userauth_banner = LIBSSH2_ALLOC(session, banner_len); + if(!session->userauth_banner) { + LIBSSH2_FREE(session, session->userauth_list_data); + session->userauth_list_data = NULL; + _libssh2_error(session, LIBSSH2_ERROR_ALLOC, + "Unable to allocate memory for userauth_banner"); + return NULL; + } + memmove(session->userauth_banner, session->userauth_list_data + 5, + banner_len); + session->userauth_banner[banner_len] = '\0'; + _libssh2_debug(session, LIBSSH2_TRACE_AUTH, + "Banner: %s", + session->userauth_banner); + LIBSSH2_FREE(session, session->userauth_list_data); + session->userauth_list_data = NULL; + /* SSH_MSG_USERAUTH_BANNER has been handled */ + reply_codes[2] = 0; + rc = _libssh2_packet_requirev(session, reply_codes, + &session->userauth_list_data, + &session->userauth_list_data_len, 0, + NULL, 0, + &session->userauth_list_packet_requirev_state); + if(rc == LIBSSH2_ERROR_EAGAIN) { + _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, + "Would block requesting userauth list"); + return NULL; + } + else if(rc || (session->userauth_list_data_len < 1)) { + _libssh2_error(session, rc, "Failed getting response"); + session->userauth_list_state = libssh2_NB_state_idle; + return NULL; + } + } + if(session->userauth_list_data[0] == SSH_MSG_USERAUTH_SUCCESS) { /* Wow, who'dve thought... */ _libssh2_error(session, LIBSSH2_ERROR_NONE, "No error"); @@ -189,6 +242,30 @@ libssh2_userauth_list(LIBSSH2_SESSION * session, const char *user, return ptr; } +/* libssh2_userauth_banner + * + * Retrieve banner message from server, if available. + * When no such message is sent by server or if no authentication attempt has + * been made, this function returns LIBSSH2_ERROR_MISSING_AUTH_BANNER. + */ +LIBSSH2_API int +libssh2_userauth_banner(LIBSSH2_SESSION *session, char **banner) +{ + if(NULL == session) + return LIBSSH2_ERROR_MISSING_USERAUTH_BANNER; + + if(!session->userauth_banner) { + return _libssh2_error(session, + LIBSSH2_ERROR_MISSING_USERAUTH_BANNER, + "Missing userauth banner"); + } + + if(banner != NULL) + *banner = session->userauth_banner; + + return LIBSSH2_ERROR_NONE; +} + /* * libssh2_userauth_authenticated * From 48f3c8ae791bb8b6a21a80a833c6ce247baba03a Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Fri, 14 Jan 2022 10:04:06 +0100 Subject: [PATCH 354/545] Support rsa-sha2 agent flags (PR 661) File: agent.c Notes: implements rsa-sha2 flags used to tell the agent which signing algo to use. https://tools.ietf.org/id/draft-miller-ssh-agent-01.html#rfc.section.4.5.1 Credit: Ian Hattendorf --- vendor/libssh2/src/agent.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/vendor/libssh2/src/agent.c b/vendor/libssh2/src/agent.c index 85c3e34af..fe1e0ddd0 100644 --- a/vendor/libssh2/src/agent.c +++ b/vendor/libssh2/src/agent.c @@ -94,6 +94,10 @@ #define SSH_AGENT_CONSTRAIN_LIFETIME 1 #define SSH_AGENT_CONSTRAIN_CONFIRM 2 +/* Signature request methods */ +#define SSH_AGENT_RSA_SHA2_256 2 +#define SSH_AGENT_RSA_SHA2_512 4 + #ifdef PF_UNIX static int agent_connect_unix(LIBSSH2_AGENT *agent) @@ -375,6 +379,7 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, ssize_t method_len; unsigned char *s; int rc; + uint32_t sign_flags = 0; /* Create a request to sign the data */ if(transctx->state == agent_NB_state_init) { @@ -391,7 +396,18 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, _libssh2_store_str(&s, (const char *)data, data_len); /* flags */ - _libssh2_store_u32(&s, 0); + if(session->userauth_pblc_method_len > 0 && + session->userauth_pblc_method) { + if(session->userauth_pblc_method_len == 12 && + !memcmp(session->userauth_pblc_method, "rsa-sha2-512", 12)) { + sign_flags = SSH_AGENT_RSA_SHA2_512; + } + else if(session->userauth_pblc_method_len == 12 && + !memcmp(session->userauth_pblc_method, "rsa-sha2-256", 12)) { + sign_flags = SSH_AGENT_RSA_SHA2_256; + } + } + _libssh2_store_u32(&s, sign_flags); transctx->request_len = s - transctx->request; transctx->send_recv_total = 0; From 7502bd90f10bb4c545ef9b40fa5c7a86371cd4a2 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Fri, 14 Jan 2022 17:05:59 +0100 Subject: [PATCH 355/545] Legacy Agent support for rsa2 key upgrading/downgrading Files: libssh2.h, agent.c, userauth.c Notes: Part 2 of the fix for issue 659. This adds rsa key downgrading for agents that don't support sha2 upgrading. It also adds better trace output for debugging/logging around key upgrading. Credit: Will Cosgrove (signed off by Michael Buckley) --- vendor/libssh2/include/libssh2.h | 1 + vendor/libssh2/src/agent.c | 33 ++++++++++++++++++++++++ vendor/libssh2/src/userauth.c | 43 +++++++++++++++++++++++++------- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/vendor/libssh2/include/libssh2.h b/vendor/libssh2/include/libssh2.h index 3f6cdad6f..88f4bbcdf 100644 --- a/vendor/libssh2/include/libssh2.h +++ b/vendor/libssh2/include/libssh2.h @@ -508,6 +508,7 @@ typedef struct _LIBSSH2_POLLFD { #define LIBSSH2_ERROR_KEYFILE_AUTH_FAILED -48 #define LIBSSH2_ERROR_RANDGEN -49 #define LIBSSH2_ERROR_MISSING_USERAUTH_BANNER -50 +#define LIBSSH2_ERROR_ALGO_UNSUPPORTED -51 /* this is a define to provide the old (<= 1.2.7) name */ #define LIBSSH2_ERROR_BANNER_NONE LIBSSH2_ERROR_BANNER_RECV diff --git a/vendor/libssh2/src/agent.c b/vendor/libssh2/src/agent.c index fe1e0ddd0..4dc2c9a51 100644 --- a/vendor/libssh2/src/agent.c +++ b/vendor/libssh2/src/agent.c @@ -379,6 +379,7 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, ssize_t method_len; unsigned char *s; int rc; + unsigned char *method_name; uint32_t sign_flags = 0; /* Create a request to sign the data */ @@ -465,8 +466,38 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, rc = LIBSSH2_ERROR_AGENT_PROTOCOL; goto error; } + + /* method name */ + method_name = LIBSSH2_ALLOC(session, method_len); + if(!method_name) { + rc = LIBSSH2_ERROR_ALLOC; + goto error; + } + memcpy(method_name, s, method_len); s += method_len; + /* check to see if we match requested */ + if((size_t)method_len == session->userauth_pblc_method_len) { + if(memcmp(method_name, session->userauth_pblc_method, method_len)) { + _libssh2_debug(session, + LIBSSH2_TRACE_KEX, + "Agent sign method %.*s", + method_len, method_name); + + rc = LIBSSH2_ERROR_ALGO_UNSUPPORTED; + goto error; + } + } + else { + _libssh2_debug(session, + LIBSSH2_TRACE_KEX, + "Agent sign method %.*s", + method_len, method_name); + + rc = LIBSSH2_ERROR_ALGO_UNSUPPORTED; + goto error; + } + /* Read the signature */ len -= 4; if(len < 0) { @@ -495,6 +526,8 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, LIBSSH2_FREE(session, transctx->response); transctx->response = NULL; + transctx->state = agent_NB_state_init; + return _libssh2_error(session, rc, "agent sign failure"); } diff --git a/vendor/libssh2/src/userauth.c b/vendor/libssh2/src/userauth.c index 3d85143a1..e5a270c6d 100644 --- a/vendor/libssh2/src/userauth.c +++ b/vendor/libssh2/src/userauth.c @@ -1283,9 +1283,6 @@ _libssh2_key_sign_algorithm(LIBSSH2_SESSION *session, if(key_method) { memcpy(*key_method, match, match_len); *key_method_len = match_len; - - _libssh2_debug(session, LIBSSH2_TRACE_KEX, - "Signing using %.*s", match_len, match); } else { *key_method_len = 0; @@ -1321,6 +1318,10 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, }; int rc; unsigned char *s; + int auth_attempts = 0; + + retry_auth: + auth_attempts++; if(session->userauth_pblc_state == libssh2_NB_state_idle) { @@ -1364,13 +1365,26 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, session->userauth_pblc_method_len); } - /* upgrade key key signing algo needed */ - rc = _libssh2_key_sign_algorithm(session, - &session->userauth_pblc_method, - &session->userauth_pblc_method_len); + /* upgrade key signing algo if it is supported and + * it is our first auth attempt, otherwise fallback to + * the key default algo */ + if(auth_attempts == 1) { + rc = _libssh2_key_sign_algorithm(session, + &session->userauth_pblc_method, + &session->userauth_pblc_method_len); - if(rc) - return rc; + if(rc) + return rc; + } + + if(session->userauth_pblc_method_len && + session->userauth_pblc_method) { + _libssh2_debug(session, + LIBSSH2_TRACE_KEX, + "Signing using %.*s", + session->userauth_pblc_method_len, + session->userauth_pblc_method); + } /* * 45 = packet_type(1) + username_len(4) + servicename_len(4) + @@ -1528,6 +1542,17 @@ _libssh2_userauth_publickey(LIBSSH2_SESSION *session, return _libssh2_error(session, LIBSSH2_ERROR_EAGAIN, "Would block"); } + else if(rc == LIBSSH2_ERROR_ALGO_UNSUPPORTED && auth_attempts == 1) { + /* try again with the default key algo */ + LIBSSH2_FREE(session, session->userauth_pblc_method); + session->userauth_pblc_method = NULL; + LIBSSH2_FREE(session, session->userauth_pblc_packet); + session->userauth_pblc_packet = NULL; + session->userauth_pblc_state = libssh2_NB_state_idle; + + rc = LIBSSH2_ERROR_NONE; + goto retry_auth; + } else if(rc) { LIBSSH2_FREE(session, session->userauth_pblc_method); session->userauth_pblc_method = NULL; From 429c5eae0d7b0bebc2a07be11f3efa735bc543a4 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Tue, 8 Feb 2022 12:52:57 +0100 Subject: [PATCH 356/545] New test: clone with ssh using agent with no sha2 signing support Only for windows --- .jshintrc | 4 +-- package.json | 2 +- test/tests/clone.js | 59 ++++++++++++++++++++++++++++++++++++++++ vendor/pageant.exe | Bin 147456 -> 679128 bytes vendor/pageant_sha1.exe | Bin 0 -> 147456 bytes 5 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 vendor/pageant_sha1.exe diff --git a/.jshintrc b/.jshintrc index 0fd02f29b..437878c8c 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,8 +1,8 @@ { + "esversion": 9, "boss": true, "curly": true, "eqnull": true, - "esnext": true, "evil": true, "futurehostile": true, "globals": { @@ -16,7 +16,7 @@ "it": true }, "immed": false, - "maxlen": 80, + "maxlen": 120, "node": true, "predef": [ "Promise", diff --git a/package.json b/package.json index 70db2ef1a..b3b80c908 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "coveralls": "^3.0.2", "istanbul": "^0.4.5", "js-beautify": "~1.5.10", - "jshint": "^2.9.6", + "jshint": "^2.10.0", "lcov-result-merger": "^3.1.0", "mocha": "^5.2.0", "walk": "^2.3.9" diff --git a/test/tests/clone.js b/test/tests/clone.js index e69076f9d..c57df0019 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -3,6 +3,9 @@ var assert = require("assert"); var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); var _ = require("lodash"); +const util = require("util"); +const exec = util.promisify(require("child_process").exec); + const generatePathWithLength = (base, length) => { let path = `${base}/`; @@ -286,6 +289,62 @@ describe("Clone", function() { }); }); + if (process.platform === "win32") { + it("can clone with ssh using old agent with sha1 signing support only", + async function () { + var pageant = local("../../vendor/pageant.exe"); + var old_pageant = local("../../vendor/pageant_sha1.exe"); + var privateKey = local("../../vendor/private.ppk"); + var test = this; + var url = "git@github.com:nodegit/test.git"; + var opts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0, + credentials: function(url, userName) { + return NodeGit.Credential.sshKeyFromAgent(userName); + } + } + } + }; + + try { + await exec("taskkill /im pageant.exe /f /t"); + } catch (e) { + try { + await exec("taskkill /im pageant_sha1.exe /f /t"); + } catch(e) {} + } + try { + await exec(`powershell -command "Start-Process ${old_pageant} ${privateKey}`); + } catch (e) { + try { + await exec(`powershell -command "Start-Process ${pageant} ${privateKey}`); + } catch (e) {} + return assert.fail("Cannot run old pageant"); + } + + try { + const repo = await Clone(url, clonePath, opts); + test.repository = repo; + } catch(e) { + return assert.fail("Clone error: " + e.message); + } + + try { + await exec("taskkill /im pageant_sha1.exe /f /t"); + } catch(e) {} + + try { + await exec(`powershell -command "Start-Process ${pageant} ${privateKey}`); + } catch (e) { + return assert.fail("Cannot run pageant"); + } + + return assert.ok(test.repository instanceof Repository); + }); + } + it("can clone with ssh", function() { var test = this; var url = "git@github.com:nodegit/test.git"; diff --git a/vendor/pageant.exe b/vendor/pageant.exe index f11c3780025ac6010753ca49a9fa029ecd658b8a..a57f2a466b1dd44a9b04d76714d305922da294b6 100644 GIT binary patch literal 679128 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%0DK$gD?z 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 z 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

v{)(xF3<(%5xkYR8GocSH}GuWH4ML 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 NhKK9I##U@>{{|rRDlPy3 literal 147456 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

9e)kJ^9)_>C#6xU(w1|Pwk$}yt_Om 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 Urs$DCT65;8wi;G7uyPIj5C2^W5dZ)H diff --git a/vendor/pageant_sha1.exe b/vendor/pageant_sha1.exe new file mode 100644 index 0000000000000000000000000000000000000000..f11c3780025ac6010753ca49a9fa029ecd658b8a GIT binary patch literal 147456 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 Urs$DCT65;8wi;G7uyPIj5C2^W5dZ)H literal 0 HcmV?d00001 From bbf444aaa7708ff7b64ec8d8f0a717eb6107831c Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Wed, 19 Jan 2022 09:14:35 +0100 Subject: [PATCH 357/545] free RSA2 related memory Free `server_sign_algorithms` and `sign_algo_prefs`. --- vendor/libssh2/src/session.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vendor/libssh2/src/session.c b/vendor/libssh2/src/session.c index 0de5ab3fd..ae6132c27 100644 --- a/vendor/libssh2/src/session.c +++ b/vendor/libssh2/src/session.c @@ -981,6 +981,12 @@ session_free(LIBSSH2_SESSION *session) if(session->remote.lang_prefs) { LIBSSH2_FREE(session, session->remote.lang_prefs); } + if(session->server_sign_algorithms) { + LIBSSH2_FREE(session, session->server_sign_algorithms); + } + if(session->sign_algo_prefs) { + LIBSSH2_FREE(session, session->sign_algo_prefs); + } /* * Make sure all memory used in the state variables are free From 089f1e46870e2338c2810903a82165fd9b37dd2a Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Fri, 4 Feb 2022 10:14:00 +0100 Subject: [PATCH 358/545] NULL terminate server_sign_algorithms string (libssh2 PR:669) files: packet.c, libssh2_priv.h notes: * Fix heap buffer overflow in _libssh2_key_sign_algorithm When allocating `session->server_sign_algorithms` which is a `char*` is is important to also allocate space for the string-terminating null byte at the end and make sure the string is actually null terminated. Without this fix, the `strchr()` call inside the `_libssh2_key_sign_algorithm` (line 1219) function will try to parse the string and go out of buffer on the last invocation. Credit: tihmstar Co-authored-by: Will Cosgrove --- vendor/libssh2/src/libssh2_priv.h | 1 - vendor/libssh2/src/packet.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/vendor/libssh2/src/libssh2_priv.h b/vendor/libssh2/src/libssh2_priv.h index f218a836d..be16ad2e3 100644 --- a/vendor/libssh2/src/libssh2_priv.h +++ b/vendor/libssh2/src/libssh2_priv.h @@ -642,7 +642,6 @@ struct _LIBSSH2_SESSION /* public key algorithms accepted as comma separated list */ char *server_sign_algorithms; - size_t server_sign_algorithms_len; /* key signing algorithm preferences -- NULL yields server order */ char *sign_algo_prefs; diff --git a/vendor/libssh2/src/packet.c b/vendor/libssh2/src/packet.c index 686be5cc7..c3756a8ea 100644 --- a/vendor/libssh2/src/packet.c +++ b/vendor/libssh2/src/packet.c @@ -665,12 +665,12 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data, session->server_sign_algorithms = LIBSSH2_ALLOC(session, - value_len); + value_len + 1); if(session->server_sign_algorithms) { - session->server_sign_algorithms_len = value_len; memcpy(session->server_sign_algorithms, value, value_len); + session->server_sign_algorithms[value_len] = '\0'; } else { rc = _libssh2_error(session, LIBSSH2_ERROR_ALLOC, From e31e62cd9aa361a48d8bc36200b10b529ba5aba6 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 8 Feb 2022 11:59:27 -0700 Subject: [PATCH 359/545] Bump to v0.28.0-alpha.10 --- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a06b9d7..e694fe95c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## v0.28.0-alpha.11 [(2022-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.11) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.10...v0.28.0-alpha.11) + +#### Summary of changes +- Updated libssh2 to add RSA SHA2 256/512 SSH key support + +#### Merged PRs into NodeGit +- [RSA SHA2 256/512 key upgrade support RFC 8332 #536 (#626)](https://github.com/nodegit/nodegit/pull/1888) +- [Fix typos in examples](https://github.com/nodegit/nodegit/pull/1884) +- [Don't build shared OpenSSL libs](https://github.com/nodegit/nodegit/pull/1877) + ## v0.28.0-alpha.10 [(2021-11-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.10) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.9...v0.28.0-alpha.10) diff --git a/package-lock.json b/package-lock.json index 7dc9f9924..b843955a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.10", + "version": "0.28.0-alpha.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b3b80c908..e522820c2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.10", + "version": "0.28.0-alpha.11", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 2e63ec9c361d83b9e2224bf22f3f81b6ad71e1b3 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 8 Feb 2022 12:35:29 -0700 Subject: [PATCH 360/545] Update package-lock.json --- package-lock.json | 287 ++-------------------------------------------- 1 file changed, 12 insertions(+), 275 deletions(-) diff --git a/package-lock.json b/package-lock.json index b843955a4..9af463154 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1004,13 +1004,6 @@ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true, - "optional": true - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1302,13 +1295,6 @@ "object-visit": "^1.0.0" } }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true, - "optional": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -1341,19 +1327,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "optional": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", @@ -1467,13 +1440,6 @@ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", "dev": true }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true, - "optional": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1727,13 +1693,6 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, - "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", - "dev": true, - "optional": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1853,31 +1812,11 @@ "is-extglob": "^1.0.0" } }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "optional": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true, - "optional": true - }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -1895,16 +1834,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "optional": true, - "requires": { - "pend": "~1.2.0" - } - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -2893,17 +2822,6 @@ } } }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "optional": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -2941,7 +2859,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -3213,13 +3131,6 @@ "is-unc-path": "^1.0.0" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "optional": true - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3383,24 +3294,26 @@ "dev": true }, "jshint": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz", - "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==", + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", + "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", "dev": true, "requires": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", - "lodash": "~4.17.10", + "lodash": "~4.17.21", "minimatch": "~3.0.2", - "phantom": "~4.0.1", - "phantomjs-prebuilt": "~2.1.7", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x", - "unicode-5.2.0": "^0.7.5" + "strip-json-comments": "1.0.x" }, "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -3480,13 +3393,6 @@ "verror": "1.10.0" } }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true, - "optional": true - }, "keyv": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", @@ -4454,79 +4360,11 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true, - "optional": true - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "phantom": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz", - "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==", - "dev": true, - "optional": true, - "requires": { - "phantomjs-prebuilt": "^2.1.16", - "split": "^1.0.1", - "winston": "^2.4.0" - } - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "dev": true, - "optional": true, - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - } - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "optional": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "optional": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -4558,13 +4396,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true, - "optional": true - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -5163,16 +4994,6 @@ } } }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "optional": true, - "requires": { - "throttleit": "^1.0.0" - } - }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -5279,12 +5100,6 @@ } } }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -5451,16 +5266,6 @@ "dev": true, "optional": true }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "optional": true, - "requires": { - "through": "2" - } - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -5493,13 +5298,6 @@ "tweetnacl": "~0.14.0" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true, - "optional": true - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -5631,20 +5429,6 @@ "xtend": "^4.0.0" } }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true, - "optional": true - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true, - "optional": true - }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", @@ -5790,13 +5574,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==" }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true, - "optional": true - }, "uglify-js": { "version": "3.5.15", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", @@ -5830,12 +5607,6 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, - "unicode-5.2.0": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz", - "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==", - "dev": true - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -6089,30 +5860,6 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, - "winston": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", - "dev": true, - "optional": true, - "requires": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", - "dev": true, - "optional": true - } - } - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -6179,16 +5926,6 @@ "window-size": "^0.1.2", "y18n": "^3.2.0" } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "optional": true, - "requires": { - "fd-slicer": "~1.0.1" - } } } } From 01fcecab12a8298aa373266a2a9a17986fec8bc5 Mon Sep 17 00:00:00 2001 From: Alex A Date: Tue, 14 Dec 2021 10:41:42 +0100 Subject: [PATCH 361/545] Remove unused code - ThreadPoolImpl doesn't need to keep a pointer of context. - Methods RunJSThreadCallbacksFromOrchestrator not used. --- generate/templates/manual/src/thread_pool.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index fa95ccb42..238fef521 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -479,10 +479,6 @@ namespace nodegit { void QueueCallbackOnJSThread(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork); - static void RunJSThreadCallbacksFromOrchestrator(uv_async_t *handle); - - void RunJSThreadCallbacksFromOrchestrator(); - static void RunLoopCallbacks(uv_async_t *handle); void Shutdown(std::unique_ptr cleanupHandle); @@ -498,7 +494,6 @@ namespace nodegit { private: bool isMarkedForDeletion; - nodegit::Context *currentContext; struct JSThreadCallback { JSThreadCallback(ThreadPool::Callback callback, ThreadPool::Callback cancelCallback, bool isWork) @@ -539,9 +534,9 @@ namespace nodegit { std::vector orchestrators; }; + // context required to be passed to Orchestrators, but ThreadPoolImpl doesn't need to keep it ThreadPoolImpl::ThreadPoolImpl(int numberOfThreads, uv_loop_t *loop, nodegit::Context *context) : isMarkedForDeletion(false), - currentContext(context), orchestratorJobMutex(new std::mutex), jsThreadCallbackMutex(new std::mutex) { From 1aaf2ee148664854f49b623dc7dadad7192f1952 Mon Sep 17 00:00:00 2001 From: Alex A Date: Sun, 23 Jan 2022 20:16:16 +0100 Subject: [PATCH 362/545] Test deadlock in callbacks We want to test two scenarios: - When libgit2 spawns threads to do the work (when doing a checkout). - When libigt2 leverages a single thread to do the work (for example when working with submodules). In each scenario, we'll run synchronous work inside the callbacks, where no locking is applied, so they should succeed. We'll also run asynchronous work inside the callbacks that lock the same objects already locked. These tests should be able to run by temporary unlocking those objects until the callback ends. --- test/tests/filter.js | 74 +++++++++++++++++++++++++++++++++++++++++ test/tests/submodule.js | 34 +++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/test/tests/filter.js b/test/tests/filter.js index 324375fce..b371be036 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -333,6 +333,80 @@ describe("Filter", function() { }); }); + it("can run sync callback on checkout without deadlocking", function() { // jshint ignore:line + var test = this; + var syncCallbackResult = true; + + return Registry.register(filterName, { + apply: function() { + syncCallbackResult = test.repository.isEmpty(); + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout", + { encoding: "utf-8" } + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + assert.strictEqual(syncCallbackResult, 0); + }); + }); + + // 'Checkout.head' and 'Submodule.lookup' do work with the repo locked. + // They should work together without deadlocking. + it("can run async callback on checkout without deadlocking", function() { // jshint ignore:line + var test = this; + var submoduleNameIn = "vendor/libgit2"; + var asyncCallbackResult = ""; + + return Registry.register(filterName, { + apply: function() { + return NodeGit.Submodule.lookup(test.repository, submoduleNameIn) + .then(function(submodule) { + return submodule.name(); + }) + .then(function(name) { + asyncCallbackResult = name; + return NodeGit.Error.CODE.OK; + }); + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0) + .then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return fse.writeFile( + packageJsonPath, + "Changing content to trigger checkout", + { encoding: "utf-8" } + ); + }) + .then(function() { + var opts = { + checkoutStrategy: Checkout.STRATEGY.FORCE, + paths: "package.json" + }; + return Checkout.head(test.repository, opts); + }) + .then(function() { + assert.equal(asyncCallbackResult, submoduleNameIn); + }); + }); + // this test is useless on 32 bit CI, because we cannot construct // a buffer big enough to test anything of significance :)... if (process.arch === "x64") { diff --git a/test/tests/submodule.js b/test/tests/submodule.js index f42758b12..2323fa56c 100644 --- a/test/tests/submodule.js +++ b/test/tests/submodule.js @@ -157,4 +157,38 @@ describe("Submodule", function() { assert.equal(entries[1].path, submodulePath); }); }); + + it("can run sync callback without deadlocking", function() { + var repo = this.workdirRepository; + var submodules = []; + var submoduleCallback = function(submodule, name, payload) { + var submoduleName = submodule.name(); + assert.equal(submoduleName, name); + submodules.push(name); + }; + + return Submodule.foreach(repo, submoduleCallback).then(function() { + assert.equal(submodules.length, 1); + }); + }); + + // 'Submodule.foreach' and 'Submodule.lookup' do work with the repo locked. + // They should work together without deadlocking. + it("can run async callback without deadlocking", function() { + var repo = this.workdirRepository; + var submodules = []; + var submoduleCallback = function(submodule, name, payload) { + var owner = submodule.owner(); + + return Submodule.lookup(owner, name) + .then(function(submodule) { + assert.equal(submodule.name(), name); + submodules.push(name); + }); + }; + + return Submodule.foreach(repo, submoduleCallback).then(function() { + assert.equal(submodules.length, 1); + }); + }); }); From 7b248d9b7900796a79e58da85980c023def873d7 Mon Sep 17 00:00:00 2001 From: Alex A Date: Sun, 23 Jan 2022 20:20:24 +0100 Subject: [PATCH 363/545] Unsafe temporary workaround for LFS checkout lost performance This is a temporary workaround in order to avoid the lost of performance with LFS checkout. The change is limited to the processing of callbacks from Workers that leverage threaded libgit2 functions. Basically what it does is allowing the callbacks from executorEventsQueue to be queued in jsThreadCallbackQueue without waiting for the current one to end. It is unsafe because with threaded libgit2 functions there is a potential risk of deadlock if the callbacks need to lock an object. This commit will be reverted when nodegit-lfs is integrated into nodegit. --- .../templates/manual/include/thread_pool.h | 18 +++++- generate/templates/manual/src/async_baton.cc | 20 +++++-- generate/templates/manual/src/thread_pool.cc | 58 +++++++++++++++++-- test/tests/filter.js | 3 +- 4 files changed, 86 insertions(+), 13 deletions(-) diff --git a/generate/templates/manual/include/thread_pool.h b/generate/templates/manual/include/thread_pool.h index 7e6e3b605..4653e8079 100644 --- a/generate/templates/manual/include/thread_pool.h +++ b/generate/templates/manual/include/thread_pool.h @@ -8,6 +8,20 @@ #include "async_worker.h" +// Temporary workaround for LFS checkout. Comment added to be reverted. +// With the threadpool rewrite, a Worker will execute its callbacks with +// objects temporary unlock (to prevent deadlocks), and we'll wait until +// the callback is done to lock them back again (to make sure it's thread-safe). +// LFS checkout lost performance after this, and the proper way to fix it is +// to integrate nodegit-lfs into nodegit. Until this is implemented, a +// temporary workaround has been applied, which affects only Workers leveraging +// threaded libgit2 functions (at the moment only checkout) and does the +// following: +// - do not wait for the current callback to end, so that it can send the +// next callback to the main JS thread. +// - do not temporary unlock the objects, since they would be locked back +// again before the callback is executed. + namespace nodegit { class Context; class AsyncContextCleanupHandle; @@ -17,7 +31,9 @@ namespace nodegit { public: typedef std::function Callback; typedef std::function QueueCallbackFn; - typedef std::function OnPostCallbackFn; + // Temporary workaround for LFS checkout. Code modified to be reverted. + // typedef std::function OnPostCallbackFn; + typedef std::function OnPostCallbackFn; // Initializes thread pool and spins up the requested number of threads // The provided loop will be used for completion callbacks, whenever diff --git a/generate/templates/manual/src/async_baton.cc b/generate/templates/manual/src/async_baton.cc index 8078c0c45..56694f33f 100644 --- a/generate/templates/manual/src/async_baton.cc +++ b/generate/templates/manual/src/async_baton.cc @@ -46,7 +46,8 @@ namespace nodegit { ThreadPool::PostCallbackEvent( [jsCallback, cancelCallback]( ThreadPool::QueueCallbackFn queueCallback, - ThreadPool::Callback callbackCompleted + ThreadPool::Callback callbackCompleted, + bool isThreaded // Temporary workaround for LFS checkout. Code added to be reverted. ) -> ThreadPool::Callback { queueCallback(jsCallback, cancelCallback); callbackCompleted(); @@ -58,13 +59,22 @@ namespace nodegit { ThreadPool::PostCallbackEvent( [this, jsCallback, cancelCallback]( ThreadPool::QueueCallbackFn queueCallback, - ThreadPool::Callback callbackCompleted + ThreadPool::Callback callbackCompleted, + bool isThreaded // Temporary workaround for LFS checkout. Code added to be reverted. ) -> ThreadPool::Callback { - this->onCompletion = callbackCompleted; + // Temporary workaround for LFS checkout. Code modified to be reverted. + if (!isThreaded) { + this->onCompletion = callbackCompleted; - queueCallback(jsCallback, cancelCallback); + queueCallback(jsCallback, cancelCallback); - return std::bind(&AsyncBaton::SignalCompletion, this); + return std::bind(&AsyncBaton::SignalCompletion, this); + } + else { + this->onCompletion = std::bind(&AsyncBaton::SignalCompletion, this); + queueCallback(jsCallback, cancelCallback); + return []() {}; + } } ); diff --git a/generate/templates/manual/src/thread_pool.cc b/generate/templates/manual/src/thread_pool.cc index 238fef521..4cd5c095a 100644 --- a/generate/templates/manual/src/thread_pool.cc +++ b/generate/templates/manual/src/thread_pool.cc @@ -7,6 +7,7 @@ #include #include #include +#include // Temporary workaround for LFS checkout. Code added to be reverted. extern "C" { #include @@ -81,8 +82,11 @@ namespace nodegit { : Event(CALLBACK_TYPE), callback(initCallback) {} - ThreadPool::Callback operator()(ThreadPool::QueueCallbackFn queueCb, ThreadPool::Callback completedCb) { - return callback(queueCb, completedCb); + // Temporary workaround for LFS checkout. Code modified to be reverted. + // ThreadPool::Callback operator()(ThreadPool::QueueCallbackFn queueCb, ThreadPool::Callback completedCb) { + // return callback(queueCb, completedCb); + ThreadPool::Callback operator()(ThreadPool::QueueCallbackFn queueCb, ThreadPool::Callback completedCb, bool isThreaded) { + return callback(queueCb, completedCb, isThreaded); } private: @@ -102,6 +106,10 @@ namespace nodegit { // the Orchestrator's memory void WaitForThreadClose(); + // Temporary workaround for LFS checkout. Code added to be reverted. + // Returns true if the task running spawned threads within libgit2 + bool IsGitThreaded() { return currentGitThreads > kInitialGitThreads; } + static Nan::AsyncResource *GetCurrentAsyncResource(); static const nodegit::Context *GetCurrentContext(); @@ -139,6 +147,12 @@ namespace nodegit { PostCompletedEventToOrchestratorFn postCompletedEventToOrchestrator; TakeNextTaskFn takeNextTask; std::thread thread; + + // Temporary workaround for LFS checkout. Code added to be reverted. + static constexpr int kInitialGitThreads {0}; + // Number of threads spawned internally by libgit2 to deal with + // the task of this Executor instance. Defaults to kInitialGitThreads. + std::atomic currentGitThreads {kInitialGitThreads}; }; Executor::Executor( @@ -170,6 +184,9 @@ namespace nodegit { WorkTask *workTask = static_cast(task.get()); + // Temporary workaround for LFS checkout. Code added to be reverted. + currentGitThreads = kInitialGitThreads; + currentAsyncResource = workTask->asyncResource; currentCallbackErrorHandle = workTask->callbackErrorHandle; workTask->callback(); @@ -221,6 +238,8 @@ namespace nodegit { } void *Executor::RetrieveTLSForLibgit2ChildThread() { + // Temporary workaround for LFS checkout. Code added to be reverted. + ++Executor::executor->currentGitThreads; return Executor::executor; } @@ -230,6 +249,8 @@ namespace nodegit { void Executor::TeardownTLSOnLibgit2ChildThread() { if (!isExecutorThread) { + // Temporary workaround for LFS checkout. Code added to be reverted. + --Executor::executor->currentGitThreads; Executor::executor = nullptr; } } @@ -378,21 +399,46 @@ namespace nodegit { std::shared_ptr callbackCondition(new std::condition_variable); bool hasCompleted = false; - LockMaster::TemporaryUnlock temporaryUnlock; + // Temporary workaround for LFS checkout. Code removed to be reverted. + //LockMaster::TemporaryUnlock temporaryUnlock; + + // Temporary workaround for LFS checkout. Code added to be reverted. + bool isWorkerThreaded = executor.IsGitThreaded(); + ThreadPool::Callback callbackCompleted = []() {}; + if (!isWorkerThreaded) { + callbackCompleted = [callbackCondition, callbackMutex, &hasCompleted]() { + std::lock_guard lock(*callbackMutex); + hasCompleted = true; + callbackCondition->notify_one(); + }; + } + std::unique_ptr temporaryUnlock {nullptr}; + if (!isWorkerThreaded) { + temporaryUnlock = std::make_unique(); + } + auto onCompletedCallback = (*callbackEvent)( [this](ThreadPool::Callback callback, ThreadPool::Callback cancelCallback) { queueCallbackOnJSThread(callback, cancelCallback, false); }, + // Temporary workaround for LFS checkout. Code modified to be reverted. + /* [callbackCondition, callbackMutex, &hasCompleted]() { std::lock_guard lock(*callbackMutex); hasCompleted = true; callbackCondition->notify_one(); } + */ + callbackCompleted, + isWorkerThreaded ); - std::unique_lock lock(*callbackMutex); - while (!hasCompleted) callbackCondition->wait(lock); - onCompletedCallback(); + // Temporary workaround for LFS checkout. Code modified to be reverted. + if (!isWorkerThreaded) { + std::unique_lock lock(*callbackMutex); + while (!hasCompleted) callbackCondition->wait(lock); + onCompletedCallback(); + } } queueCallbackOnJSThread( diff --git a/test/tests/filter.js b/test/tests/filter.js index b371be036..73fac9568 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -367,7 +367,8 @@ describe("Filter", function() { // 'Checkout.head' and 'Submodule.lookup' do work with the repo locked. // They should work together without deadlocking. - it("can run async callback on checkout without deadlocking", function() { // jshint ignore:line + // Temporary workaround for LFS checkout. Test skipped to be reverted. + it.skip("can run async callback on checkout without deadlocking", function() { // jshint ignore:line var test = this; var submoduleNameIn = "vendor/libgit2"; var asyncCallbackResult = ""; From caec8195155d169495b53cf16238c01c9597f114 Mon Sep 17 00:00:00 2001 From: Alex A Date: Thu, 17 Feb 2022 09:44:32 +0100 Subject: [PATCH 364/545] Tests on worker thread terminate while doing a checkout Checkout leverages libgit2 threads and when applying filters it runs JS callbacks. These tests check that when running checkout on a worker thread and this is terminated, it exists gracefully without memory leaks. --- test/tests/filter.js | 5 +- test/tests/worker.js | 84 +++++++++++++++++++ test/utils/loop_checkout.js | 91 +++++++++++++++++++++ test/utils/worker_checkout.js | 51 ++++++++++++ test/utils/worker_context_aware.js | 4 +- test/utils/worker_context_aware_checkout.js | 66 +++++++++++++++ 6 files changed, 297 insertions(+), 4 deletions(-) create mode 100644 test/utils/loop_checkout.js create mode 100644 test/utils/worker_checkout.js create mode 100644 test/utils/worker_context_aware_checkout.js diff --git a/test/tests/filter.js b/test/tests/filter.js index 73fac9568..3cb7467e8 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -335,7 +335,7 @@ describe("Filter", function() { it("can run sync callback on checkout without deadlocking", function() { // jshint ignore:line var test = this; - var syncCallbackResult = true; + var syncCallbackResult = 1; return Registry.register(filterName, { apply: function() { @@ -365,9 +365,10 @@ describe("Filter", function() { }); }); + // Temporary workaround for LFS checkout. Test skipped. + // To activate when reverting workaround. // 'Checkout.head' and 'Submodule.lookup' do work with the repo locked. // They should work together without deadlocking. - // Temporary workaround for LFS checkout. Test skipped to be reverted. it.skip("can run async callback on checkout without deadlocking", function() { // jshint ignore:line var test = this; var submoduleNameIn = "vendor/libgit2"; diff --git a/test/tests/worker.js b/test/tests/worker.js index b68b47e42..5fbfeacee 100644 --- a/test/tests/worker.js +++ b/test/tests/worker.js @@ -2,7 +2,9 @@ const path = require("path"); const assert = require("assert"); const fse = require("fs-extra"); const local = path.join.bind(path, __dirname); +const NodeGit = require("../../"); +let filterName = "psuedo_filter"; let Worker; try { @@ -24,6 +26,15 @@ if (Worker) { }); }); + afterEach(function() { + return NodeGit.FilterRegistry.unregister(filterName) + .catch(function(error) { + if (error === NodeGit.Error.CODE.ERROR) { + throw new Error("Cannot unregister filter"); + } + }); + }); + it("can perform basic functionality via worker thread", function(done) { const workerPath = local("../utils/worker.js"); const worker = new Worker(workerPath, { @@ -127,5 +138,78 @@ if (Worker) { } }); }); + + // This tests that while calling filter's apply callbacks and the worker + // is terminated, node exits gracefully. To make sure we terminate the + // worker during a checkout, continuous checkouts will be running in a loop. + it("can kill worker thread while doing a checkout and exit gracefully", function(done) { // jshint ignore:line + const workerPath = local("../utils/worker_checkout.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "init": + // give enough time for the worker to start applying the filter + // during continuous checkouts + setTimeout(() => { worker.terminate(); }, 10000); + break; + case "success": + assert.fail(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code == 1) { + done(); + } else { + assert.fail(); + } + }); + }); + + // This tests that after calling filter's apply callbacks and the worker + // is terminated, there will be no memory leaks. + it("can track objects to free on context shutdown after multiple checkouts", function(done) { // jshint ignore:line + let testOk; + const workerPath = local("../utils/worker_context_aware_checkout.js"); + const worker = new Worker(workerPath, { + workerData: { + clonePath, + url: "https://github.com/nodegit/test.git" + } + }); + worker.on("message", (message) => { + switch (message) { + case "numbersMatch": + testOk = true; + worker.terminate(); + break; + case "numbersDoNotMatch": + testOk = false; + worker.terminate(); + break; + case "failure": + assert.fail(); + break; + } + }); + worker.on("error", () => assert.fail()); + worker.on("exit", (code) => { + if (code === 1 && testOk === true) { + done(); + } + else { + assert.fail(); + } + }); + }); }); } diff --git a/test/utils/loop_checkout.js b/test/utils/loop_checkout.js new file mode 100644 index 000000000..f6e6c0736 --- /dev/null +++ b/test/utils/loop_checkout.js @@ -0,0 +1,91 @@ +const fse = require("fs-extra"); +const path = require("path"); +const NodeGit = require("../../"); + +const getDirExtFiles = function(dir, ext, done) { + let results = []; + fse.readdir(dir, function(err, list) { + if (err) { + return done(err); + } + let i = 0; + (function next() { + let file = list[i++]; + if (!file) { + return done(null, results); + } + file = path.resolve(dir, file); + fse.stat(file, function(err, stat) { + if (stat && stat.isDirectory()) { + getDirExtFiles(file, ext, function(err, res) { + results = results.concat(res); + next(); + }); + } else { + if (path.extname(file) == ".".concat(ext)) { + results.push(file); + } + next(); + } + }); + })(); + }); +}; + +const getDirFilesToChange = function(dir, ext) { + return new Promise(function(resolve, reject) { + getDirExtFiles(dir, ext, function(err, results) { + if (err) { + reject(err); + } + resolve(results); + }); + }); +}; + +// Changes the content of files with extension 'ext' +// in directory 'dir' recursively. +// Returns relative file paths +const changeDirExtFiles = function (dir, ext, newText) { + let filesChanged = []; + return getDirFilesToChange(dir, ext) + .then(function(filesWithExt) { + filesWithExt.forEach(function(file) { + fse.writeFile( + file, + newText, + { encoding: "utf-8" } + ); + filesChanged.push(path.relative(dir, file)); + }); + return filesChanged; + }) + .catch(function(err) { + throw new Error("Error getting files with extension .".concat(ext)); + }); +}; + +// 'times' to limit the number of iterations in the loop. +// 0 means no limit. +const loopingCheckoutHead = async function(repoPath, repo, times) { + const text0 = "Text0: changing content to trigger checkout"; + const text1 = "Text1: changing content to trigger checkout"; + + let iteration = 0; + for (let i = 0; true; i = ++i%2) { + const newText = (i == 0) ? text0 : text1; + const jsRelativeFilePahts = await changeDirExtFiles(repoPath, "js", newText); // jshint ignore:line + let checkoutOpts = { + checkoutStrategy: NodeGit.Checkout.STRATEGY.FORCE, + paths: jsRelativeFilePahts + }; + await NodeGit.Checkout.head(repo, checkoutOpts); + + if (++iteration == times) { + break; + } + } + return; +}; + +module.exports = loopingCheckoutHead; \ No newline at end of file diff --git a/test/utils/worker_checkout.js b/test/utils/worker_checkout.js new file mode 100644 index 000000000..adfb7aa7c --- /dev/null +++ b/test/utils/worker_checkout.js @@ -0,0 +1,51 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const assert = require("assert"); +const NodeGit = require("../../"); +const loopingCheckoutHead = require("./loop_checkout.js"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +parentPort.postMessage("init"); + +const { clonePath, url } = workerData; +const cloneOpts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +let filterName = "psuedo_filter"; +let applyCallbackResult = 1; + +return NodeGit.Clone(url, clonePath, cloneOpts) +.then(function(_repository) { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return NodeGit.FilterRegistry.register(filterName, { + apply: function() { + applyCallbackResult = 0; + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0); +}) +.then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return loopingCheckoutHead(clonePath, repository, 0); +}).then(function() { + assert.strictEqual(applyCallbackResult, 0); + parentPort.postMessage("success"); +}) +.catch((err) => { + parentPort.postMessage("failure"); +}); \ No newline at end of file diff --git a/test/utils/worker_context_aware.js b/test/utils/worker_context_aware.js index a1a00fbc6..b7784fdae 100644 --- a/test/utils/worker_context_aware.js +++ b/test/utils/worker_context_aware.js @@ -41,7 +41,7 @@ return NodeGit.Clone(url, clonePath, opts) garbageCollect(); // Count total of objects left after being created/destroyed - const selfFreeingCount = + const freeingCount = NodeGit.Cert.getNonSelfFreeingConstructedCount() + NodeGit.Repository.getSelfFreeingInstanceCount() + NodeGit.Commit.getSelfFreeingInstanceCount() + @@ -50,7 +50,7 @@ return NodeGit.Clone(url, clonePath, opts) const numberOfTrackedObjects = NodeGit.getNumberOfTrackedObjects(); - if (selfFreeingCount === numberOfTrackedObjects) { + if (freeingCount === numberOfTrackedObjects) { parentPort.postMessage("numbersMatch"); } else { diff --git a/test/utils/worker_context_aware_checkout.js b/test/utils/worker_context_aware_checkout.js new file mode 100644 index 000000000..6562915a4 --- /dev/null +++ b/test/utils/worker_context_aware_checkout.js @@ -0,0 +1,66 @@ +const { + isMainThread, + parentPort, + workerData +} = require("worker_threads"); +const garbageCollect = require("./garbage_collect.js"); +const assert = require("assert"); +const NodeGit = require("../../"); +const loopingCheckoutHead = require("./loop_checkout.js"); +const { promisify } = require("util"); + +if (isMainThread) { + throw new Error("Must be run via worker thread"); +} + +const { clonePath, url } = workerData; +const cloneOpts = { + fetchOpts: { + callbacks: { + certificateCheck: () => 0 + } + } +}; + +let repository; +let filterName = "psuedo_filter"; +let applyCallbackResult = 1; + +return NodeGit.Clone(url, clonePath, cloneOpts) +.then(function(_repository) { + repository = _repository; + assert.ok(repository instanceof NodeGit.Repository); + return NodeGit.FilterRegistry.register(filterName, { + apply: function() { + applyCallbackResult = 0; + }, + check: function() { + return NodeGit.Error.CODE.OK; + } + }, 0); +}) +.then(function(result) { + assert.strictEqual(result, NodeGit.Error.CODE.OK); + return loopingCheckoutHead(clonePath, repository, 10); +}).then(function() { + assert.strictEqual(applyCallbackResult, 0); + // Tracked objects must work too when the Garbage Collector is triggered + garbageCollect(); + + // Count total of objects left after being created/destroyed + const freeingCount = + NodeGit.Cert.getNonSelfFreeingConstructedCount() + + NodeGit.FilterSource.getNonSelfFreeingConstructedCount() + + NodeGit.Buf.getNonSelfFreeingConstructedCount() + + NodeGit.Repository.getSelfFreeingInstanceCount(); + + const numberOfTrackedObjects = NodeGit.getNumberOfTrackedObjects(); + + if (freeingCount === numberOfTrackedObjects) { + parentPort.postMessage("numbersMatch"); + } + else { + parentPort.postMessage("numbersDoNotMatch"); + } + return promisify(setTimeout)(50000); +}).catch((err) => parentPort.postMessage("failure")); \ No newline at end of file From 4912695f50722eaaa5ad33c70b4704cb4af9999b Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 3 Mar 2022 09:16:15 -0700 Subject: [PATCH 365/545] Update github workflows --- .github/workflows/tests.yml | 11 +++++++---- lifecycleScripts/install.js | 0 lifecycleScripts/preinstall.js | 0 3 files changed, 7 insertions(+), 4 deletions(-) mode change 100644 => 100755 lifecycleScripts/install.js mode change 100644 => 100755 lifecycleScripts/preinstall.js diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 221e6cb88..c81e6ad36 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,13 +14,13 @@ jobs: name: "Linux Tests" strategy: matrix: - node: [12, 14] + node: [12, 14, 16] runs-on: ubuntu-latest container: ubuntu:16.04 steps: - name: Install Dependencies for Ubuntu # git >= 2.18 required for actions/checkout git support - run: apt update && apt install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt update && apt install -y git build-essential clang python3 libssl-dev libkrb5-dev libc++-dev + run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang python3 libssl-dev libkrb5-dev libc++-dev env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true @@ -52,7 +52,10 @@ jobs: npm_config_clang: 1 GYP_DEFINES: use_obsolete_asm=true # There is a race condition in node/generate that needs to be fixed + # Node 16 changed the logic it uses to select it's UID which means to make node run as root and not 1001, we need to chwon the current directory. More Details: + # https://stackoverflow.com/questions/70298238/getting-eaccess-when-running-npm-8-as-root run: | + chown root.root -R . npm set unsafe-perm true node utils/retry npm install @@ -79,7 +82,7 @@ jobs: name: "macOS Tests" strategy: matrix: - node: [12, 14] + node: [12, 14, 16] runs-on: macOS-10.15 # This is mostly the same as the Linux steps, waiting for anchor support # https://github.com/actions/runner/issues/1182 @@ -137,7 +140,7 @@ jobs: name: Windows Tests strategy: matrix: - node: [12, 14] + node: [12, 14, 16] arch: [x86, x64] runs-on: windows-2016 steps: diff --git a/lifecycleScripts/install.js b/lifecycleScripts/install.js old mode 100644 new mode 100755 diff --git a/lifecycleScripts/preinstall.js b/lifecycleScripts/preinstall.js old mode 100644 new mode 100755 From c303953efd39bdb3b7acf16fb9151d191fa1ff78 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Fri, 11 Mar 2022 17:48:47 +0100 Subject: [PATCH 366/545] Update windows 2016 CI to 2019 To update Windows box we need to upgrade node-gyp, so we need python 3.6 in ubuntu 16.04, but last version is 3.5. This is the reason Python 3.6 is build from source. --- .github/workflows/tests.yml | 18 ++++++++++++++++-- package.json | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c81e6ad36..cd5b96cc7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,10 +20,24 @@ jobs: steps: - name: Install Dependencies for Ubuntu # git >= 2.18 required for actions/checkout git support - run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang python3 libssl-dev libkrb5-dev libc++-dev + run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang libssl-dev libkrb5-dev libc++-dev wget env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true + - name: Setup python 3.6 + env: + CC: clang + CXX: clang++ + run: | + mkdir ~/python + cd ~/python + wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz + tar -xvf Python-3.6.15.tgz + cd Python-3.6.15 + ./configure + make + make install + - name: Setup Environment run: | mkdir ~/.ssh_tests @@ -142,7 +156,7 @@ jobs: matrix: node: [12, 14, 16] arch: [x86, x64] - runs-on: windows-2016 + runs-on: windows-2019 steps: - name: Setup Environment run: | diff --git a/package.json b/package.json index e522820c2..9b8df7965 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "nan": "^2.14.1", - "node-gyp": "^7.1.2", - "node-pre-gyp": "^0.13.0", + "node-gyp": "^9.0.0", + "@mapbox/node-pre-gyp": "^1.0.8", "ramda": "^0.25.0", "tar-fs": "^1.16.3" }, From 647ea9ff1d90fae5a677293f4f5d7d4fd6844cde Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Thu, 17 Mar 2022 16:10:45 +0100 Subject: [PATCH 367/545] Skip "can clone with git" test Since 15 March 2022 the unauthenticated git protocol on port 9418 is no longer supported in Github. https://github.blog/2021-09-01-improving-git-protocol-security-github/ --- test/tests/clone.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/tests/clone.js b/test/tests/clone.js index c57df0019..000c2a4be 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -414,7 +414,9 @@ describe("Clone", function() { }); }); - it("can clone with git", function() { + // Since 15 March the unauthenticated git protocol on port 9418 is no longer supported in Github. + // https://github.blog/2021-09-01-improving-git-protocol-security-github/ + it.skip("can clone with git", function() { var test = this; var url = "git://github.com/nodegit/test.git"; var opts = { From 0f897b2e04c135cb6d832902041941bd8ee4c7fc Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Thu, 17 Mar 2022 19:21:29 +0100 Subject: [PATCH 368/545] Update node-pre-gyp to use @mapbox/node-pre-gyp No longer supporting node_pre_gyp_accessKeyId & node_pre_gyp_secretAccessKey, use AWS_ACCESS_KEY_ID & AWS_SECRET_ACCESS_KEY instead to authenticate against s3 --- .github/workflows/tests.yml | 18 +- package-lock.json | 9400 +++++++++++++++++++++++++++++++++-- package.json | 2 +- 3 files changed, 8991 insertions(+), 429 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cd5b96cc7..ece7ac30e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -84,10 +84,10 @@ jobs: if: startsWith(github.ref, 'refs/tags/v') env: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} - node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} - node_pre_gyp_secretAccessKey: ${{ secrets.node_pre_gyp_secretAccessKey }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} run: | - npm install -g node-pre-gyp aws-sdk + npm install -g @mapbox/node-pre-gyp aws-sdk node lifecycleScripts/clean node-pre-gyp package node-pre-gyp publish @@ -142,10 +142,10 @@ jobs: if: startsWith(github.ref, 'refs/tags/v') env: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} - node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} - node_pre_gyp_secretAccessKey: ${{ secrets.node_pre_gyp_secretAccessKey }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} run: | - npm install -g node-pre-gyp aws-sdk + npm install -g @mapbox/node-pre-gyp aws-sdk node lifecycleScripts/clean node-pre-gyp package node-pre-gyp publish @@ -192,7 +192,7 @@ jobs: # and it treats each additional step past the first as an orphaned process. - name: Deploy (Dependencies) if: startsWith(github.ref, 'refs/tags/v') - run: npm install -g node-pre-gyp aws-sdk + run: npm install -g @mapbox/node-pre-gyp aws-sdk - name: Deploy (Clean) if: startsWith(github.ref, 'refs/tags/v') @@ -206,6 +206,6 @@ jobs: if: startsWith(github.ref, 'refs/tags/v') env: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} - node_pre_gyp_accessKeyId: ${{ secrets.node_pre_gyp_accessKeyId }} - node_pre_gyp_secretAccessKey: ${{ secrets.node_pre_gyp_secretAccessKey }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} run: node-pre-gyp publish diff --git a/package-lock.json b/package-lock.json index 9af463154..1a1849c28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,8207 @@ { "name": "nodegit", "version": "0.28.0-alpha.11", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "nodegit", + "version": "0.28.0-alpha.11", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.8", + "fs-extra": "^7.0.0", + "got": "^10.7.0", + "json5": "^2.1.0", + "lodash": "^4.17.14", + "nan": "^2.14.1", + "node-gyp": "^9.0.0", + "ramda": "^0.25.0", + "tar-fs": "^1.16.3" + }, + "devDependencies": { + "aws-sdk": "^2.1095.0", + "babel-cli": "^6.7.7", + "babel-preset-es2015": "^6.6.0", + "cheerio": "^1.0.0-rc.2", + "clean-for-publish": "~1.0.2", + "combyne": "~0.8.1", + "coveralls": "^3.0.2", + "istanbul": "^0.4.5", + "js-beautify": "~1.5.10", + "jshint": "^2.10.0", + "lcov-result-merger": "^3.1.0", + "mocha": "^5.2.0", + "walk": "^2.3.9" + }, + "engines": { + "node": ">= 12.19.0 < 13 || >= 14.10.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", + "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "dependencies": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sindresorhus/is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", + "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" + }, + "node_modules/@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", + "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agentkeepalive/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": true, + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true, + "optional": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "optional": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sdk": { + "version": "2.1095.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1095.0.tgz", + "integrity": "sha512-OrZq2pTDsnfOJYsAdRlw+NXTGLQYqWldSZR3HugW8JT4JPWyFZrgB2yPP2ElFHX+4J4SZg5QvkAXl/7s9gLTgA==", + "dev": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "node_modules/babel-cli": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", + "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", + "dev": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" + }, + "bin": { + "babel": "bin/babel.js", + "babel-doctor": "bin/babel-doctor.js", + "babel-external-helpers": "bin/babel-external-helpers.js", + "babel-node": "bin/babel-node.js" + }, + "optionalDependencies": { + "chokidar": "^1.6.1" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-core/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "dependencies": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "dependencies": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "dependencies": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "dependencies": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.10.0" + } + }, + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + } + }, + "node_modules/babel-polyfill/node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + }, + "node_modules/babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", + "dev": true, + "dependencies": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "optional": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "optional": true, + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "node_modules/cacache": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.1.tgz", + "integrity": "sha512-tHPtfdZDqQpZ15eaEZeLspIqS5mK5fOBDZi6AjuqaIi53QNVXH3dQv6uKT3YuUu6uxV/8pjU9in0CoJ8fgaHqw==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.1.2", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^7.2.0", + "infer-owner": "^1.0.4", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", + "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "optional": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "dependencies": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "optionalDependencies": { + "fsevents": "^1.0.0" + } + }, + "node_modules/chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "optional": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-for-publish": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clean-for-publish/-/clean-for-publish-1.0.4.tgz", + "integrity": "sha1-KZMj50qzSwXSIHBsWd+B3QTKAYo=", + "dev": true, + "dependencies": { + "fs-extra": "^0.26.2", + "glob": "~5.0.15", + "yargs": "~3.29.0" + }, + "bin": { + "clean-for-publish": "lib/cli.js" + } + }, + "node_modules/clean-for-publish/node_modules/fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/clean-for-publish/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "optional": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/combyne": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", + "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", + "dev": true + }, + "node_modules/commander": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", + "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true, + "optional": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/coveralls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", + "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", + "dev": true, + "dependencies": { + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.85.0" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/coveralls/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coveralls/node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/coveralls/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/coveralls/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "dependencies": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "node_modules/domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "deprecated": "update to domelementtype@1.3.1", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "optional": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "optional": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "optional": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "optional": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/fsevents/node_modules/abbrev": { + "version": "1.1.1", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/are-we-there-yet": { + "version": "1.1.5", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fsevents/node_modules/chownr": { + "version": "1.1.1", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/code-point-at": { + "version": "1.1.0", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/console-control-strings": { + "version": "1.1.0", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/core-util-is": { + "version": "1.0.2", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/debug": { + "version": "4.1.1", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.6.0", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fsevents/node_modules/delegates": { + "version": "1.0.0", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "inBundle": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.5", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/fsevents/node_modules/glob": { + "version": "7.1.3", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/has-unicode": { + "version": "2.0.1", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/iconv-lite": { + "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.1", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fsevents/node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.3", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/ini": { + "version": "1.3.5", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/minimist": { + "version": "0.0.8", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/minipass": { + "version": "2.3.5", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.2.1", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.1", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fsevents/node_modules/ms": { + "version": "2.1.1", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "node_modules/fsevents/node_modules/needle": { + "version": "2.3.0", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.12.0", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.1", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.0.6", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.4.1", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npmlog": { + "version": "4.1.2", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/fsevents/node_modules/number-is-nan": { + "version": "1.0.1", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/object-assign": { + "version": "4.1.1", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/os-homedir": { + "version": "1.0.2", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/os-tmpdir": { + "version": "1.0.2", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/fsevents/node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/process-nextick-args": { + "version": "2.0.0", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.8", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/fsevents/node_modules/rc/node_modules/minimist": { + "version": "1.2.0", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.6", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fsevents/node_modules/rimraf": { + "version": "2.6.3", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fsevents/node_modules/safe-buffer": { + "version": "5.1.2", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/semver": { + "version": "5.7.0", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true, + "inBundle": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fsevents/node_modules/set-blocking": { + "version": "2.0.0", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/string_decoder": { + "version": "1.1.1", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.8", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/wide-align": { + "version": "1.1.3", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.0.3", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-stream/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": true, + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/got": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "dependencies": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "optional": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/htmlparser2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "optional": true, + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "optional": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", + "dev": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/istanbul/node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "node_modules/istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-beautify": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.5.10.tgz", + "integrity": "sha1-TZU3FwJpk0SlFsomv1nwonu3Vxk=", + "dev": true, + "dependencies": { + "config-chain": "~1.1.5", + "mkdirp": "~0.5.0", + "nopt": "~3.0.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + } + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/jshint": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", + "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", + "dev": true, + "dependencies": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" + } + }, + "node_modules/jshint/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/jshint/node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/keyv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", + "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "node_modules/lcov-result-merger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.1.0.tgz", + "integrity": "sha512-vGXaMNGZRr4cYvW+xMVg+rg7qd5DX9SbGXl+0S3k85+gRZVK4K7UvxPWzKb/qiMwe+4bx3EOrW2o4mbdb1WnsA==", + "dev": true, + "dependencies": { + "through2": "^2.0.3", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.2" + }, + "bin": { + "lcov-result-merger": "bin/lcov-result-merger.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.6.tgz", + "integrity": "sha512-4Gfh6lV3TLXmj7qz79hBFuvVqjYSMW6v2+sxtdX4LFQU0rK3V/txRjE0DoZb7X0IF3t9f8NO3CxPSWlvdckhVA==", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^8.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", + "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "optional": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true, + "optional": true + }, + "node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": true, + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "dependencies": { + "mime-db": "~1.36.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minipass-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.0.3.tgz", + "integrity": "sha512-VA+eiiUtaIvpQJXISwE3OiMvQwAWrgKb97F0aXlCS1Ahikr8fEQq8m3Hf7Kv9KT3nokuHigJKsDMB6atU04olQ==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "optional": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "optional": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "dependencies": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mocha/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", + "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.22 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/node-gyp/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", + "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/node-gyp/node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/node-gyp/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/now-and-later": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", + "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "optional": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "optional": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "optional": true, + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "optional": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-event": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", + "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "optional": true, + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "node_modules/psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" + }, + "node_modules/randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "optional": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "optional": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/request/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true, + "optional": true + }, + "node_modules/responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "optional": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "optional": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "optional": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "optional": true, + "dependencies": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true, + "optional": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "optional": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "dashdash": "^1.12.0", + "getpass": "^0.1.1", + "safer-buffer": "^2.0.2" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + }, + "optionalDependencies": { + "bcrypt-pbkdf": "^1.0.0", + "ecc-jsbn": "~0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ssri/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "optional": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dependencies": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "node_modules/tar-fs/node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "optional": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uglify-js": { + "version": "3.5.15", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", + "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", + "dev": true, + "optional": true, + "dependencies": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "optional": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "dependencies": { + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "optional": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "optional": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true, + "optional": true + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true, + "bin": { + "user-home": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "dependencies": { + "user-home": "^1.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/walk": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", + "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "dev": true, + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "node_modules/yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "dev": true, + "dependencies": { + "camelcase": "^1.2.1", + "cliui": "^3.0.3", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + } + }, "dependencies": { + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", + "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "@sindresorhus/is": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", @@ -17,6 +8215,11 @@ "defer-to-connect": "^2.0.0" } }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, "@types/cacheable-request": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", @@ -59,6 +8262,63 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -114,15 +8374,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -167,6 +8418,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -174,7 +8426,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "assign-symbols": { "version": "1.0.0", @@ -199,7 +8452,8 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "atob": { "version": "2.1.2", @@ -209,39 +8463,33 @@ "optional": true }, "aws-sdk": { - "version": "2.326.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.326.0.tgz", - "integrity": "sha512-R8CzUxH7TKsmQTT59CoXGQSXYscmc5TiU/OXb/R0xq1WYEngiznBy+J+cahJOjugSjN+5VQWTGbEzBC3Bc75kQ==", + "version": "2.1095.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1095.0.tgz", + "integrity": "sha512-OrZq2pTDsnfOJYsAdRlw+NXTGLQYqWldSZR3HugW8JT4JPWyFZrgB2yPP2ElFHX+4J4SZg5QvkAXl/7s9gLTgA==", "dev": true, "requires": { - "buffer": "4.9.1", + "buffer": "4.9.2", "events": "1.1.1", - "ieee754": "1.1.8", - "jmespath": "0.15.0", + "ieee754": "1.1.13", + "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.1.0", + "uuid": "3.3.2", "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - } } }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "babel-cli": { "version": "6.26.0", @@ -905,15 +9153,16 @@ } }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -969,9 +9218,9 @@ "dev": true }, "buffer": { - "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -988,22 +9237,106 @@ "buffer-fill": "^1.0.0" } }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "cacache": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.1.tgz", + "integrity": "sha512-tHPtfdZDqQpZ15eaEZeLspIqS5mK5fOBDZi6AjuqaIi53QNVXH3dQv6uKT3YuUu6uxV/8pjU9in0CoJ8fgaHqw==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.1.2", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^7.2.0", + "infer-owner": "^1.0.4", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "lru-cache": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", + "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==" + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1063,7 +9396,8 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { "version": "1.1.3", @@ -1208,6 +9542,11 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -1295,10 +9634,16 @@ "object-visit": "^1.0.0" } }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -1444,6 +9789,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -1484,11 +9830,6 @@ "mimic-response": "^2.0.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1571,13 +9912,19 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -1668,12 +10015,38 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "optional": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -1693,6 +10066,11 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1777,7 +10155,8 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "3.0.2", @@ -1815,7 +10194,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fast-deep-equal": { "version": "1.1.0", @@ -1826,7 +10206,8 @@ "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -1891,12 +10272,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -1938,14 +10321,6 @@ } } }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "requires": { - "minipass": "^2.2.1" - } - }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -2443,24 +10818,24 @@ "dev": true, "optional": true }, - "string-width": { - "version": "1.0.2", + "string_decoder": { + "version": "1.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "safe-buffer": "~5.1.0" } }, - "string_decoder": { - "version": "1.1.1", + "string-width": { + "version": "1.0.2", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -2528,21 +10903,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -2573,14 +10933,15 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2718,7 +11079,8 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { "version": "5.1.0", @@ -2882,37 +11244,94 @@ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "requires": { + "ms": "^2.0.0" } }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "requires": { - "minimatch": "^3.0.4" - } + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", @@ -2931,7 +11350,8 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "invariant": { "version": "2.2.4", @@ -2948,6 +11368,11 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -3073,6 +11498,11 @@ "is-extglob": "^1.0.0" } }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -3134,7 +11564,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-unc-path": { "version": "1.0.0", @@ -3186,7 +11617,8 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "istanbul": { "version": "0.4.5", @@ -3241,9 +11673,9 @@ } }, "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", "dev": true }, "js-beautify": { @@ -3285,6 +11717,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, "optional": true }, "jsesc": { @@ -3330,7 +11763,8 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.3.1", @@ -3350,7 +11784,8 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json5": { "version": "2.1.0", @@ -3386,6 +11821,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -3514,6 +11950,64 @@ } } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "make-fetch-happen": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.6.tgz", + "integrity": "sha512-4Gfh6lV3TLXmj7qz79hBFuvVqjYSMW6v2+sxtdX4LFQU0rK3V/txRjE0DoZb7X0IF3t9f8NO3CxPSWlvdckhVA==", + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^8.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", + "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==" + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3563,12 +12057,14 @@ "mime-db": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true }, "mime-types": { "version": "2.1.20", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, "requires": { "mime-db": "~1.36.0" } @@ -3591,19 +12087,121 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, - "minipass": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", - "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "minipass": "^3.0.0" }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.0.3.tgz", + "integrity": "sha512-VA+eiiUtaIvpQJXISwE3OiMvQwAWrgKb97F0aXlCS1Ahikr8fEQq8m3Hf7Kv9KT3nokuHigJKsDMB6atU04olQ==", + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -3617,9 +12215,9 @@ }, "dependencies": { "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "requires": { "yallist": "^4.0.0" } @@ -3730,8 +12328,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { "version": "2.14.1", @@ -3781,35 +12378,10 @@ } } }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - } - } + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.1", @@ -3817,32 +12389,43 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", + "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", + "npmlog": "^6.0.0", "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", "which": "^2.0.2" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" } }, "chownr": { @@ -3850,11 +12433,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -3863,17 +12441,19 @@ "minipass": "^3.0.0" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "gauge": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", + "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" } }, "graceful-fs": { @@ -3881,24 +12461,15 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "requires": { "yallist": "^4.0.0" } @@ -3916,36 +12487,25 @@ "abbrev": "1" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "rimraf": { @@ -3956,11 +12516,6 @@ "glob": "^7.1.3" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -3969,10 +12524,28 @@ "lru-cache": "^6.0.0" } }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3982,15 +12555,6 @@ "yallist": "^4.0.0" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4006,34 +12570,6 @@ } } }, - "node-pre-gyp": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", - "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -4066,31 +12602,6 @@ "once": "^1.3.2" } }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" - }, - "npm-packlist": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", - "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", @@ -4108,7 +12619,8 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, "object-assign": { "version": "4.1.1", @@ -4258,7 +12770,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "1.4.0", @@ -4272,16 +12785,8 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "output-file-sync": { "version": "1.1.2", @@ -4312,6 +12817,14 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-timeout": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", @@ -4363,7 +12876,8 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "posix-character-classes": { "version": "0.1.1", @@ -4396,6 +12910,20 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -4405,7 +12933,8 @@ "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true }, "pump": { "version": "2.0.1", @@ -4437,7 +12966,8 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystring": { "version": "0.2.0", @@ -4478,24 +13008,6 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -5031,10 +13543,16 @@ "dev": true, "optional": true }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "^7.0.5" } @@ -5057,7 +13575,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true }, "sax": { "version": "1.2.1", @@ -5065,11 +13584,6 @@ "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", "dev": true }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5101,9 +13615,9 @@ } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "slash": { "version": "1.0.0", @@ -5111,6 +13625,11 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -5230,6 +13749,40 @@ "kind-of": "^3.2.0" } }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -5286,6 +13839,7 @@ "version": "1.14.2", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -5298,6 +13852,29 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + }, + "dependencies": { + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -5327,6 +13904,14 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -5337,14 +13922,6 @@ "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -5353,46 +13930,12 @@ "ansi-regex": "^2.0.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "requires": { - "minipass": "^2.2.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, "tar-fs": { "version": "1.16.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", @@ -5540,6 +14083,11 @@ "punycode": "^1.4.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -5550,6 +14098,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -5558,6 +14107,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, "optional": true }, "type-check": { @@ -5620,6 +14170,22 @@ "set-value": "^2.0.1" } }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, "unique-stream": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", @@ -5686,21 +14252,6 @@ } } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -5747,7 +14298,8 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, "v8flags": { "version": "2.1.1", @@ -5768,6 +14320,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -5837,6 +14390,20 @@ "foreachasync": "^3.0.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -5847,11 +14414,11 @@ } }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "window-size": { @@ -5908,11 +14475,6 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - }, "yargs": { "version": "3.29.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", diff --git a/package.json b/package.json index 9b8df7965..8d75d4f97 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "tar-fs": "^1.16.3" }, "devDependencies": { - "aws-sdk": "^2.326.0", + "aws-sdk": "^2.1095.0", "babel-cli": "^6.7.7", "babel-preset-es2015": "^6.6.0", "cheerio": "^1.0.0-rc.2", From ef19f59e7034c4fe1f8b2ec42f7fb4fffcbb5405 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 18 Mar 2022 08:15:30 -0700 Subject: [PATCH 369/545] Bump to v0.28.0-alpha.12 --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e694fe95c..2a1e3e412 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## v0.28.0-alpha.12 [(2022-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.12) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.11...v0.28.0-alpha.12) + +#### Summary of changes +- Updated CI because of GitHub deprecations +- Added workaround for LFS performance regression + +#### Merged PRs into NodeGit +- [Update windows 2016 CI to 2019](https://github.com/nodegit/nodegit/pull/1897) +- [Skip "can clone with git" test, unauthenticated git protocol is no longer supported in Github](https://github.com/nodegit/nodegit/pull/1899) +- [UNSAFE Temporary workaround for LFS checkout performance regression](https://github.com/nodegit/nodegit/pull/1883) +- [Update Github Actions for node 16](https://github.com/nodegit/nodegit/pull/1896) + ## v0.28.0-alpha.11 [(2022-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.11) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.10...v0.28.0-alpha.11) diff --git a/package-lock.json b/package-lock.json index 1a1849c28..63b7aae60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.11", + "version": "0.28.0-alpha.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.11", + "version": "0.28.0-alpha.12", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 8d75d4f97..337d88ab2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.11", + "version": "0.28.0-alpha.12", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 9e28bd30a62f75d8dcc66cfa4d420826f1421e76 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 18 Mar 2022 15:07:26 -0700 Subject: [PATCH 370/545] Remove babel, update nan --- .gitignore | 1 - lifecycleScripts/postinstall.js | 2 +- package-lock.json | 14544 ++++++++---------------------- package.json | 14 +- 4 files changed, 3631 insertions(+), 10930 deletions(-) diff --git a/.gitignore b/.gitignore index 8dc977fe1..30f7dbc25 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ /build/ /coverage/ -/dist/ /include/ /lib/enums.js /lib/nodegit.js diff --git a/lifecycleScripts/postinstall.js b/lifecycleScripts/postinstall.js index 7e44aef28..f55a4f0fb 100755 --- a/lifecycleScripts/postinstall.js +++ b/lifecycleScripts/postinstall.js @@ -30,7 +30,7 @@ module.exports = function install() { return Promise.resolve(); } - return exec("node \"" + path.join(rootPath, "dist/nodegit.js\"")) + return exec("node \"" + path.join(rootPath, "lib/nodegit.js\"")) .catch(function(e) { if (~e.toString().indexOf("Module version mismatch")) { console.warn( diff --git a/package-lock.json b/package-lock.json index 63b7aae60..209c1c4fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,15 +15,13 @@ "got": "^10.7.0", "json5": "^2.1.0", "lodash": "^4.17.14", - "nan": "^2.14.1", + "nan": "^2.15.0", "node-gyp": "^9.0.0", "ramda": "^0.25.0", "tar-fs": "^1.16.3" }, "devDependencies": { "aws-sdk": "^2.1095.0", - "babel-cli": "^6.7.7", - "babel-preset-es2015": "^6.6.0", "cheerio": "^1.0.0-rc.2", "clean-for-publish": "~1.0.2", "combyne": "~0.8.1", @@ -83,25 +81,6 @@ "node": ">=10" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -129,28 +108,6 @@ "node": ">=8" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -203,20 +160,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@mapbox/node-pre-gyp/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -241,27 +184,6 @@ "node": ">=8" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@npmcli/fs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", @@ -271,20 +193,6 @@ "semver": "^7.3.5" } }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/move-file": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", @@ -405,27 +313,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/agentkeepalive": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", @@ -439,27 +326,6 @@ "node": ">= 8.0.0" } }, - "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agentkeepalive/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -502,26 +368,6 @@ "node": ">=0.10.0" } }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, "node_modules/append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -539,56 +385,38 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, + "node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "dependencies": { - "arr-flatten": "^1.0.1" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "optional": true, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "sprintf-js": "~1.0.2" } }, "node_modules/asn1": { @@ -609,48 +437,18 @@ "node": ">=0.8" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, - "node_modules/async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true, - "optional": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "optional": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/aws-sdk": { "version": "2.1095.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1095.0.tgz", @@ -686,2483 +484,2150 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "node_modules/babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - }, - "bin": { - "babel": "bin/babel.js", - "babel-doctor": "bin/babel-doctor.js", - "babel-external-helpers": "bin/babel-external-helpers.js", - "babel-node": "bin/babel-node.js" - }, - "optionalDependencies": { - "chokidar": "^1.6.1" - } - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "node_modules/babel-core/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, - "bin": { - "json5": "lib/cli.js" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, + "optional": true, "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "tweetnacl": "^0.14.3" } }, - "node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, + "node_modules/bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "node_modules/babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "node_modules/babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, - "node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true, - "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, + "node_modules/cacache": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.2.tgz", + "integrity": "sha512-Q17j7s8X81i/QYVrKVQ/qwWGT+pYLfpTcZ+X+p/Qw9FULy9JEfb2FECYTTt6mPV6A/vk92nRZ80ncpKxiGTrIA==", "dependencies": { - "babel-runtime": "^6.22.0" + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.1.2", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^7.2.0", + "infer-owner": "^1.0.4", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "node_modules/cacache/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" } }, - "node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", + "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==", + "engines": { + "node": ">=12" } }, - "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, + "node_modules/cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, + "node_modules/cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, - "node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "node_modules/cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true }, - "node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, - "node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } + "node_modules/chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, - "node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "node_modules/clean-for-publish": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clean-for-publish/-/clean-for-publish-1.0.4.tgz", + "integrity": "sha1-KZMj50qzSwXSIHBsWd+B3QTKAYo=", "dev": true, "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "fs-extra": "^0.26.2", + "glob": "~5.0.15", + "yargs": "~3.29.0" + }, + "bin": { + "clean-for-publish": "lib/cli.js" } }, - "node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "node_modules/clean-for-publish/node_modules/fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", "dev": true, "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "node_modules/clean-for-publish/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" } }, - "node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", "dev": true, "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" } }, - "node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=0.8" } }, - "node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "engines": { + "node": ">= 0.10" } }, - "node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dependencies": { - "babel-runtime": "^6.22.0" + "mimic-response": "^1.0.0" } }, - "node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" } }, - "node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, - "node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true, - "dependencies": { - "regenerator-transform": "^0.10.0" + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" } }, - "node_modules/babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "node_modules/combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "dependencies": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/babel-polyfill/node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "node_modules/combyne": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", + "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", "dev": true }, - "node_modules/babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "date-now": "^0.1.4" } }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "safe-buffer": "~5.1.1" } }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/coveralls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", + "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", "dev": true, "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.85.0" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=4.0.0" } }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "node_modules/coveralls/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "node_modules/coveralls/node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "engines": { + "node": ">=4.x" } }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "node_modules/coveralls/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, "bin": { - "babylon": "bin/babylon.js" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "node_modules/coveralls/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, - "optional": true, "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, - "optional": true, "dependencies": { - "is-descriptor": "^1.0.0" + "assert-plus": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "kind-of": "^6.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, + "node_modules/decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "mimic-response": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/base/node_modules/kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, - "optional": true, + "dependencies": { + "object-keys": "^1.0.12" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "dependencies": { - "tweetnacl": "^0.14.3" + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "node_modules/dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", "dev": true }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/dom-serializer/node_modules/entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "node_modules/domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "deprecated": "update to domelementtype@1.3.1", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "domelementtype": "1" } }, - "node_modules/braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, - "optional": true, "dependencies": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" + "dom-serializer": "0", + "domelementtype": "1" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "node_modules/duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "dev": true, "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true, - "engines": { - "node": ">=0.4.0" + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" } }, - "node_modules/buffer-fill": { + "node_modules/end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true }, - "node_modules/cacache": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.1.tgz", - "integrity": "sha512-tHPtfdZDqQpZ15eaEZeLspIqS5mK5fOBDZi6AjuqaIi53QNVXH3dQv6uKT3YuUu6uxV/8pjU9in0CoJ8fgaHqw==", - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.1.2", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^7.2.0", - "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=6" } }, - "node_modules/cacache/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, "engines": { - "node": ">=10" + "node": ">=0.8.0" } }, - "node_modules/cacache/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">= 8" + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", - "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/cacache/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true, "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", "dev": true, - "optional": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/cache-base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true, - "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "dependencies": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^2.0.0" - }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.4.x" } }, - "node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "engines": { - "node": ">= 0.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" } }, - "node_modules/cheerio/node_modules/entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", "dev": true }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true, - "dependencies": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "engines": { + "node": "*" } }, - "node_modules/chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "node_modules/form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, - "optional": true, "dependencies": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" }, - "optionalDependencies": { - "fsevents": "^1.0.0" + "engines": { + "node": ">= 0.12" } }, - "node_modules/chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "optional": true, + "node_modules/fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dependencies": { - "is-descriptor": "^0.1.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/class-utils/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, - "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/clean-for-publish": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clean-for-publish/-/clean-for-publish-1.0.4.tgz", - "integrity": "sha1-KZMj50qzSwXSIHBsWd+B3QTKAYo=", - "dev": true, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", + "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", "dependencies": { - "fs-extra": "^0.26.2", - "glob": "~5.0.15", - "yargs": "~3.29.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, - "bin": { - "clean-for-publish": "lib/cli.js" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/clean-for-publish/node_modules/fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" } }, - "node_modules/clean-for-publish/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, + "node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" + "pump": "^3.0.0" }, "engines": { - "node": ">=0.2.5" + "node": ">=8" } }, - "node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, + "node_modules/get-stream/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, - "engines": { - "node": ">=0.8" + "dependencies": { + "assert-plus": "^1.0.0" } }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">= 0.10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, "engines": { - "node": ">=4" + "node": ">= 0.10" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "node_modules/cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "node_modules/glob-stream/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "engines": { "node": ">=0.10.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, - "optional": true, "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "is-extglob": "^2.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, + "node_modules/got": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", "dependencies": { - "delayed-stream": "~1.0.0" + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/combyne": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", - "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", - "dev": true - }, - "node_modules/commander": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", - "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true, - "optional": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "dependencies": { - "date-now": "^0.1.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" + "node_modules/graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.x" } }, - "node_modules/core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/coveralls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", - "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", + "node_modules/handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "dependencies": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.85.0" + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1" }, "bin": { - "coveralls": "bin/coveralls.js" + "handlebars": "bin/handlebars" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/coveralls/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/coveralls/node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true, "engines": { - "node": ">=4.x" + "node": ">=4" } }, - "node_modules/coveralls/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "deprecated": "this library is no longer supported", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "ajv": "^5.3.0", + "har-schema": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=4" } }, - "node_modules/coveralls/node_modules/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true, - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "node_modules/has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" } }, - "node_modules/date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "node_modules/htmlparser2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "dependencies": { - "ms": "2.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, - "node_modules/decompress-response": { + "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dependencies": { - "mimic-response": "^2.0.0" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, "engines": { - "node": ">=10" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dependencies": { - "object-keys": "^1.0.12" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 0.4" + "node": ">= 6" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "optional": true, "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dependencies": { - "kind-of": "^6.0.0" - }, + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/define-property/node_modules/is-data-descriptor": { + "node_modules/invert-kv": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, - "optional": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true, - "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/delayed-stream": { + "node_modules/is-relative": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" } }, - "node_modules/delegates": { + "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "dependencies": { - "repeating": "^2.0.0" + "unc-path-regex": "^0.1.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=0.10.0" } }, - "node_modules/dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, - "dependencies": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "node_modules/domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "deprecated": "update to domelementtype@1.3.1", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "node_modules/domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "node_modules/istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", "dev": true, "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" } }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "node_modules/duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } + "node_modules/istanbul/node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "node_modules/istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, - "optional": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "node_modules/istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "has-flag": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">= 0.6.0" } }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "node_modules/js-beautify": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.5.10.tgz", + "integrity": "sha1-TZU3FwJpk0SlFsomv1nwonu3Vxk=", "dev": true, "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "config-chain": "~1.1.5", + "mkdirp": "~0.5.0", + "nopt": "~3.0.1" }, "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, - "optional": true, "dependencies": { - "amdefine": ">=0.0.4" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=0.8.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true, - "engines": { - "node": ">=0.4.x" + "node": ">=4" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "optional": true }, - "node_modules/expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "node_modules/jshint": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", + "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", "dev": true, - "optional": true, "dependencies": { - "is-posix-bracket": "^0.1.0" + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "jshint": "bin/jshint" } }, - "node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "node_modules/jshint/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/jshint/node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true, - "optional": true, - "dependencies": { - "fill-range": "^2.1.0" + "bin": { + "strip-json-comments": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, - "node_modules/extend-shallow/node_modules/is-extendable": { + "node_modules/json-stable-stringify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, - "optional": true, "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" + "jsonify": "~0.0.0" } }, - "node_modules/extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", "dependencies": { - "is-extglob": "^1.0.0" + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "node_modules/json5/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, - "node_modules/filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true, - "optional": true, - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "node_modules/for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, + "node_modules/keyv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", + "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==", "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "json-buffer": "3.0.1" } }, - "node_modules/foreachasync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", - "dev": true - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, - "engines": { - "node": "*" + "optionalDependencies": { + "graceful-fs": "^4.1.9" } }, - "node_modules/form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "readable-stream": "^2.0.5" }, "engines": { - "node": ">= 0.12" + "node": ">= 0.6.3" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, - "optional": true, "dependencies": { - "map-cache": "^0.2.2" + "invert-kv": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "node_modules/lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true }, - "node_modules/fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "node_modules/lcov-result-merger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.1.0.tgz", + "integrity": "sha512-vGXaMNGZRr4cYvW+xMVg+rg7qd5DX9SbGXl+0S3k85+gRZVK4K7UvxPWzKb/qiMwe+4bx3EOrW2o4mbdb1WnsA==", + "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "through2": "^2.0.3", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.2" + }, + "bin": { + "lcov-result-merger": "bin/lcov-result-merger.js" }, "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node": ">=4" } }, - "node_modules/fs-mkdirp-stream": { + "node_modules/lead": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "dependencies": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" + "flush-write-stream": "^1.0.2" }, "engines": { "node": ">= 0.10" } }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "bundleDependencies": [ - "node-pre-gyp" - ], - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "dependencies": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=4.0" + "node": ">= 0.8.0" } }, - "node_modules/fsevents/node_modules/abbrev": { - "version": "1.1.1", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "inBundle": true, - "optional": true + "node_modules/lodash": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" }, - "node_modules/fsevents/node_modules/ansi-regex": { - "version": "2.1.1", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true, - "inBundle": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.6" } }, - "node_modules/fsevents/node_modules/aproba": { - "version": "1.2.0", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/are-we-there-yet": { - "version": "1.1.5", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" } }, - "node_modules/fsevents/node_modules/balanced-match": { - "version": "1.0.0", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/brace-expansion": { - "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/fsevents/node_modules/chownr": { - "version": "1.1.1", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/code-point-at": { - "version": "1.1.0", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fsevents/node_modules/concat-map": { - "version": "0.0.1", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/console-control-strings": { - "version": "1.1.0", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/core-util-is": { - "version": "1.0.2", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "inBundle": true, - "optional": true + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/fsevents/node_modules/debug": { - "version": "4.1.1", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/make-fetch-happen": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.6.tgz", + "integrity": "sha512-4Gfh6lV3TLXmj7qz79hBFuvVqjYSMW6v2+sxtdX4LFQU0rK3V/txRjE0DoZb7X0IF3t9f8NO3CxPSWlvdckhVA==", "dependencies": { - "ms": "^2.1.1" + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^8.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/fsevents/node_modules/deep-extend": { - "version": "0.6.0", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", + "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==", "engines": { - "node": ">=4.0.0" + "node": ">=12" } }, - "node_modules/fsevents/node_modules/delegates": { - "version": "1.0.0", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/detect-libc": { - "version": "1.0.3", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "node_modules/mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", "dev": true, - "inBundle": true, - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">= 0.6" } }, - "node_modules/fsevents/node_modules/fs-minipass": { - "version": "1.2.5", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "node_modules/mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "minipass": "^2.2.1" + "mime-db": "~1.36.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/fsevents/node_modules/fs.realpath": { - "version": "1.0.0", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/gauge": { - "version": "2.7.4", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fsevents/node_modules/glob": { - "version": "7.1.3", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, - "node_modules/fsevents/node_modules/has-unicode": { - "version": "2.0.1", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "inBundle": true, - "optional": true + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, - "node_modules/fsevents/node_modules/iconv-lite": { - "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/ignore-walk": { - "version": "3.0.1", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "minimatch": "^3.0.4" + "node": ">=8" } }, - "node_modules/fsevents/node_modules/inflight": { - "version": "1.0.6", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/fsevents/node_modules/inherits": { + "node_modules/minipass-fetch": { "version": "2.0.3", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/ini": { - "version": "1.3.5", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", - "dev": true, - "inBundle": true, - "optional": true, + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.0.3.tgz", + "integrity": "sha512-VA+eiiUtaIvpQJXISwE3OiMvQwAWrgKb97F0aXlCS1Ahikr8fEQq8m3Hf7Kv9KT3nokuHigJKsDMB6atU04olQ==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": "*" + "node": "^12.13.0 || ^14.15.0 || >=16" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/fsevents/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dependencies": { - "number-is-nan": "^1.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/fsevents/node_modules/isarray": { - "version": "1.0.0", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dependencies": { - "brace-expansion": "^1.1.7" + "minipass": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/fsevents/node_modules/minimist": { - "version": "0.0.8", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/minipass": { - "version": "2.3.5", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/fsevents/node_modules/minizlib": { - "version": "1.2.1", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dependencies": { - "minipass": "^2.2.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/fsevents/node_modules/mkdirp": { + "node_modules/mkdirp": { "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "inBundle": true, - "optional": true, "dependencies": { "minimist": "0.0.8" }, @@ -3170,7739 +2635,2613 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/fsevents/node_modules/ms": { - "version": "2.1.1", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "node_modules/fsevents/node_modules/needle": { - "version": "2.3.0", - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "node_modules/mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" }, "bin": { - "needle": "bin/needle" + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">= 4.4.x" + "node": ">= 4.0.0" } }, - "node_modules/fsevents/node_modules/node-pre-gyp": { - "version": "0.12.0", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", + "node_modules/mocha/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "ms": "2.0.0" } }, - "node_modules/fsevents/node_modules/nopt": { - "version": "4.0.1", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": "*" } }, - "node_modules/fsevents/node_modules/npm-bundled": { - "version": "1.0.6", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/npm-packlist": { - "version": "1.4.1", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "node_modules/mocha/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "engines": { + "node": ">=4" } }, - "node_modules/fsevents/node_modules/npmlog": { - "version": "4.1.2", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "node_modules/mocha/node_modules/supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/fsevents/node_modules/number-is-nan": { - "version": "1.0.1", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "inBundle": true, - "optional": true, + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/fsevents/node_modules/object-assign": { - "version": "4.1.1", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/fsevents/node_modules/once": { - "version": "1.4.0", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "wrappy": "1" - } + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" }, - "node_modules/fsevents/node_modules/os-homedir": { - "version": "1.0.2", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/fsevents/node_modules/os-tmpdir": { - "version": "1.0.2", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true }, - "node_modules/fsevents/node_modules/osenv": { - "version": "0.1.5", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/fsevents/node_modules/path-is-absolute": { - "version": "1.0.1", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "inBundle": true, - "optional": true, + "whatwg-url": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/fsevents/node_modules/process-nextick-args": { - "version": "2.0.0", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/rc": { - "version": "1.2.8", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/node-gyp": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", + "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "bin": { - "rc": "cli.js" + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.22 || ^14.13 || >=16" } }, - "node_modules/fsevents/node_modules/rc/node_modules/minimist": { - "version": "1.2.0", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "inBundle": true, - "optional": true + "node_modules/node-gyp/node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, - "node_modules/fsevents/node_modules/readable-stream": { - "version": "2.3.6", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/fsevents/node_modules/rimraf": { - "version": "2.6.3", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fsevents/node_modules/safe-buffer": { - "version": "5.1.2", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/safer-buffer": { - "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/sax": { - "version": "1.2.4", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/semver": { - "version": "5.7.0", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "semver": "bin/semver" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/fsevents/node_modules/set-blocking": { - "version": "2.0.0", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/signal-exit": { - "version": "3.0.2", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/string_decoder": { - "version": "1.1.1", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "safe-buffer": "~5.1.0" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/fsevents/node_modules/string-width": { - "version": "1.0.2", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "remove-trailing-separator": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/fsevents/node_modules/strip-ansi": { - "version": "3.0.1", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/fsevents/node_modules/strip-json-comments": { - "version": "2.0.1", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "node_modules/now-and-later": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", + "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", "dev": true, - "inBundle": true, - "optional": true, + "dependencies": { + "once": "^1.3.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/fsevents/node_modules/tar": { - "version": "4.4.8", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "inBundle": true, - "optional": true, + "node_modules/npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" }, "engines": { - "node": ">=4.5" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/fsevents/node_modules/util-deprecate": { - "version": "1.0.2", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/wide-align": { - "version": "1.1.3", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "node_modules/nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "dev": true, - "inBundle": true, - "optional": true, "dependencies": { - "string-width": "^1.0.2 || 2" + "boolbase": "~1.0.0" } }, - "node_modules/fsevents/node_modules/wrappy": { - "version": "1.0.2", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/yallist": { - "version": "3.0.3", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dependencies": { - "pump": "^3.0.0" - }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/get-stream/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "optional": true, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "engines": { "node": ">=0.10.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "node_modules/object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dependencies": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "wrappy": "1" } }, - "node_modules/glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, - "optional": true, "dependencies": { - "is-glob": "^2.0.0" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, - "node_modules/glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "node_modules/optimist/node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true, - "dependencies": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, "engines": { - "node": ">= 0.10" + "node": ">=0.4.0" } }, - "node_modules/glob-stream/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "node_modules/optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/glob-stream/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": "^2.0.1" } }, - "node_modules/glob-stream/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "dependencies": { - "is-extglob": "^2.1.0" + "lcid": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true, + "node_modules/p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/got": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", - "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", - "dependencies": { - "@sindresorhus/is": "^2.0.0", - "@szmarczak/http-timer": "^4.0.0", - "@types/cacheable-request": "^6.0.1", - "cacheable-lookup": "^2.0.0", - "cacheable-request": "^7.0.1", - "decompress-response": "^5.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^5.0.0", - "lowercase-keys": "^2.0.0", - "mimic-response": "^2.1.0", - "p-cancelable": "^2.0.0", - "p-event": "^4.0.0", - "responselike": "^2.0.0", - "to-readable-stream": "^2.0.0", - "type-fest": "^0.10.0" + "node_modules/p-event": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", + "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "dependencies": { + "p-timeout": "^2.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">=8" } }, - "node_modules/graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">=4.x" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", - "dev": true, + "node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dependencies": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1" - }, - "bin": { - "handlebars": "bin/handlebars" + "p-finally": "^1.0.0" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">=4" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/node": "*" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "deprecated": "this library is no longer supported", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true, - "dependencies": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/has-ansi": { + "node_modules/process-nextick-args": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dependencies": { - "ansi-regex": "^2.0.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true }, - "node_modules/has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true, - "engines": { - "node": ">= 0.4" - } + "node_modules/psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true }, - "node_modules/has-unicode": { + "node_modules/pump": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, - "optional": true, "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, - "node_modules/has-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" } }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.x" } }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, + "node_modules/ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" + }, + "node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, - "optional": true, "dependencies": { - "is-buffer": "^1.1.5" + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "dev": true, - "optional": true, "dependencies": { - "is-buffer": "^1.1.5" + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true, - "bin": { - "he": "bin/he" + "engines": { + "node": ">= 0.10" } }, - "node_modules/home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } + "node_modules/request/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, - "node_modules/htmlparser2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/htmlparser2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "node_modules/responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, + "lowercase-keys": "^2.0.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "engines": { - "node": ">= 6" + "node": ">= 4" } }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "glob": "^7.0.5" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "bin": { + "rimraf": "bin.js" } }, - "node_modules/http-proxy-agent/node_modules/ms": { + "node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=10" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "dependencies": { - "agent-base": "6", - "debug": "4" + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 6" + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", "dependencies": { - "ms": "2.1.2" + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "node_modules/sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, "dependencies": { - "ms": "^2.0.0" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "dashdash": "^1.12.0", + "getpass": "^0.1.1", + "safer-buffer": "^2.0.2" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + }, + "optionalDependencies": { + "bcrypt-pbkdf": "^1.0.0", + "ecc-jsbn": "~0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "node_modules/stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", - "dev": true, - "engines": { - "node": "*" + "safe-buffer": "~5.1.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dependencies": { - "kind-of": "^3.0.2" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, + "node_modules/tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "node_modules/tar-fs/node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dependencies": { - "kind-of": "^3.0.2" + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "node_modules/through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, - "node_modules/is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "node_modules/through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", "dev": true, - "optional": true, "dependencies": { - "is-primitive": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "through2": "~2.0.0", + "xtend": "~4.0.0" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, - "optional": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "optional": true, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", "dev": true, "dependencies": { - "number-is-nan": "^1.0.0" + "through2": "^2.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "dependencies": { - "number-is-nan": "^1.0.0" + "psl": "^1.1.24", + "punycode": "^1.4.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, - "optional": true, "dependencies": { - "is-extglob": "^1.0.0" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" - }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, - "optional": true, "dependencies": { - "kind-of": "^3.0.2" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/uglify-js": { + "version": "3.5.15", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", + "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", "dev": true, "optional": true, "dependencies": { - "isobject": "^3.0.1" + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/is-plain-object/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/uglify-js/node_modules/commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true, - "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "unique-slug": "^2.0.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" + "imurmurhash": "^0.1.4" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "node_modules/unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", "dev": true, - "optional": true, "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "punycode": "1.3.2", + "querystring": "0.2.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, - "node_modules/istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, "bin": { - "istanbul": "lib/cli.js" + "uuid": "bin/uuid" } }, - "node_modules/istanbul/node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "node_modules/istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">= 0.10" } }, - "node_modules/istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "node_modules/vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 0.10" } }, - "node_modules/js-beautify": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.5.10.tgz", - "integrity": "sha1-TZU3FwJpk0SlFsomv1nwonu3Vxk=", - "dev": true, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, "dependencies": { - "config-chain": "~1.1.5", - "mkdirp": "~0.5.0", - "nopt": "~3.0.1" + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" + "engines": { + "node": ">= 0.10" } }, - "node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.10" } }, - "node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/walk": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", + "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "dependencies": { + "foreachasync": "^3.0.0" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, - "node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/jshint": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", - "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==", + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "strip-json-comments": "1.0.x" + "isexe": "^2.0.0" }, "bin": { - "jshint": "bin/jshint" + "which": "bin/which" } }, - "node_modules/jshint/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } }, - "node_modules/jshint/node_modules/strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true, "bin": { - "strip-json-comments": "cli.js" + "window-size": "cli.js" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "node_modules/json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "dependencies": { - "jsonify": "~0.0.0" + "node": ">= 0.10.0" } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "node_modules/json5": { + "node_modules/wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/json5/node_modules/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" } }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true, "engines": { - "node": "*" + "node": ">=4.0" } }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "node_modules/xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" } }, - "node_modules/keyv": { + "node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", - "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==", - "dependencies": { - "json-buffer": "3.0.1" - } + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", "dev": true, - "optional": true, "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" + "camelcase": "^1.2.1", + "cliui": "^3.0.3", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" } + } + }, + "dependencies": { + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" + "@mapbox/node-pre-gyp": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", + "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, - "node_modules/lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "node_modules/lcov-result-merger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.1.0.tgz", - "integrity": "sha512-vGXaMNGZRr4cYvW+xMVg+rg7qd5DX9SbGXl+0S3k85+gRZVK4K7UvxPWzKb/qiMwe+4bx3EOrW2o4mbdb1WnsA==", - "dev": true, - "dependencies": { - "through2": "^2.0.3", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.2" - }, - "bin": { - "lcov-result-merger": "bin/lcov-result-merger.js" - }, - "engines": { - "node": ">=4" + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, - "node_modules/lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "dependencies": { - "flush-write-stream": "^1.0.2" + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } } }, - "node_modules/lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" - }, - "node_modules/log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true, - "engines": { - "node": ">=0.8.6" - } + "@sindresorhus/is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", + "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==" }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "requires": { + "defer-to-connect": "^2.0.0" } }, - "node_modules/lowercase-keys": { + "@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" } }, - "node_modules/lru-cache/node_modules/yallist": { + "@types/http-cache-semantics": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "requires": { + "@types/node": "*" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } + "@types/node": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", + "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" }, - "node_modules/make-fetch-happen": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.6.tgz", - "integrity": "sha512-4Gfh6lV3TLXmj7qz79hBFuvVqjYSMW6v2+sxtdX4LFQU0rK3V/txRjE0DoZb7X0IF3t9f8NO3CxPSWlvdckhVA==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.0.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.1.1", - "ssri": "^8.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", - "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==", - "engines": { - "node": ">=12" - } + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" } }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, - "optional": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, - "node_modules/math-random": { + "amdefine": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true, "optional": true }, - "node_modules/micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "engines": { - "node": ">=0.10.0" - } + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "node_modules/mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, - "engines": { - "node": ">= 0.6" + "requires": { + "buffer-equal": "^1.0.0" } }, - "node_modules/mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "dependencies": { - "mime-db": "~1.36.0" - }, - "engines": { - "node": ">= 0.6" - } + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "engines": { - "node": ">=8" + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, - "node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" } }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, - "node_modules/minipass-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.0.3.tgz", - "integrity": "sha512-VA+eiiUtaIvpQJXISwE3OiMvQwAWrgKb97F0aXlCS1Ahikr8fEQq8m3Hf7Kv9KT3nokuHigJKsDMB6atU04olQ==", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "aws-sdk": { + "version": "2.1095.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1095.0.tgz", + "integrity": "sha512-OrZq2pTDsnfOJYsAdRlw+NXTGLQYqWldSZR3HugW8JT4JPWyFZrgB2yPP2ElFHX+4J4SZg5QvkAXl/7s9gLTgA==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" } }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, - "optional": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, - "node_modules/mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "dependencies": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/mocha/node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, - "node_modules/mocha/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "cacache": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.2.tgz", + "integrity": "sha512-Q17j7s8X81i/QYVrKVQ/qwWGT+pYLfpTcZ+X+p/Qw9FULy9JEfb2FECYTTt6mPV6A/vk92nRZ80ncpKxiGTrIA==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.1.2", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^7.2.0", + "infer-owner": "^1.0.4", + "lru-cache": "^7.5.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" }, - "engines": { - "node": "*" + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "lru-cache": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", + "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" + "cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "requires": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true }, - "node_modules/nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + } } }, - "node_modules/nanomatch/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, - "node_modules/nanomatch/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "clean-for-publish": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clean-for-publish/-/clean-for-publish-1.0.4.tgz", + "integrity": "sha1-KZMj50qzSwXSIHBsWd+B3QTKAYo=", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "fs-extra": "^0.26.2", + "glob": "~5.0.15", + "yargs": "~3.29.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "node_modules/neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true + "dependencies": { + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" } } }, - "node_modules/node-gyp": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", - "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, - "node_modules/node-gyp/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, - "node_modules/node-gyp/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, - "node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", - "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" } }, - "node_modules/node-gyp/node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "combyne": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", + "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", + "dev": true }, - "node_modules/node-gyp/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/node-gyp/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" } }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" } }, - "node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "node_modules/node-gyp/node_modules/rimraf": { + "coveralls": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", + "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", + "dev": true, + "requires": { + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.85.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, - "node_modules/node-gyp/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" } }, - "node_modules/node-gyp/node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" } }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "dependencies": { - "abbrev": "1" + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "node_modules/normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "engines": { - "node": ">=8" + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "requires": { + "mimic-response": "^2.0.0" } }, - "node_modules/now-and-later": { + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defer-to-connect": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", - "dev": true, - "dependencies": { - "once": "^1.3.2" - }, - "engines": { - "node": ">= 0.10" - } + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" }, - "node_modules/nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, - "dependencies": { - "boolbase": "~1.0.0" + "requires": { + "object-keys": "^1.0.12" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, - "node_modules/object-copy": { + "dom-serializer": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, - "optional": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true }, - "node_modules/object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "dev": true, - "engines": { - "node": ">= 0.4" + "requires": { + "domelementtype": "1" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, - "optional": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "dom-serializer": "0", + "domelementtype": "1" } }, - "node_modules/object-visit/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "node_modules/object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "optional": true, - "dependencies": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "optional": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/object.pick/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" + "requires": { + "iconv-lite": "^0.6.2" } }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" } }, - "node_modules/optimist/node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true }, - "node_modules/optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, - "node_modules/ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.1" - } + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, - "dependencies": { - "lcid": "^1.0.0" + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, "dependencies": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } } }, - "node_modules/p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", - "engines": { - "node": ">=8" - } + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true }, - "node_modules/p-event": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", - "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", - "dependencies": { - "p-timeout": "^2.0.1" - }, - "engines": { - "node": ">=8" - } + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "dependencies": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, - "node_modules/preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true }, - "node_modules/process-nextick-args": { + "fast-json-stable-stringify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "node_modules/psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" } }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", "dev": true }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "engines": { - "node": ">=0.6" - } + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, - "engines": { - "node": ">=0.4.x" + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" } }, - "node_modules/ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "node_modules/randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "engines": { - "node": ">= 0.10.0" + "dependencies": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + } } }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" } }, - "node_modules/randomatic/node_modules/kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/readdirp/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-data-descriptor": { + "fs-mkdirp-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "node_modules/regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, - "optional": true, - "dependencies": { - "is-equal-shallow": "^0.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "dependencies": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "node_modules/resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "dependencies": { - "value-or-function": "^3.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true, - "optional": true - }, - "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "dependencies": { - "glob": "^7.0.5" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "optional": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "optional": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socks-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "optional": true, - "dependencies": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true, - "optional": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "dashdash": "^1.12.0", - "getpass": "^0.1.1", - "safer-buffer": "^2.0.2" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - }, - "optionalDependencies": { - "bcrypt-pbkdf": "^1.0.0", - "ecc-jsbn": "~0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ssri/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "dependencies": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - } - }, - "node_modules/tar-fs/node_modules/pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "node_modules/through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "dependencies": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "node_modules/to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-readable-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", - "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "dependencies": { - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", - "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", - "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", - "dev": true, - "optional": true, - "dependencies": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "dependencies": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "optional": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "optional": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true, - "optional": true - }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true, - "bin": { - "user-home": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "dependencies": { - "user-home": "^1.1.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "dependencies": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "dependencies": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/walk": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", - "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", - "dev": true, - "dependencies": { - "foreachasync": "^3.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true, - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "node_modules/yargs": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", - "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", - "dev": true, - "dependencies": { - "camelcase": "^1.2.1", - "cliui": "^3.0.3", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } - } - }, - "dependencies": { - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@sindresorhus/is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", - "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==" - }, - "@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" - }, - "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" - }, - "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", - "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "optional": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "optional": true - }, - "aws-sdk": { - "version": "2.1095.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1095.0.tgz", - "integrity": "sha512-OrZq2pTDsnfOJYsAdRlw+NXTGLQYqWldSZR3HugW8JT4JPWyFZrgB2yPP2ElFHX+4J4SZg5QvkAXl/7s9gLTgA==", - "dev": true, - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "optional": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true, - "optional": true - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "cacache": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.1.tgz", - "integrity": "sha512-tHPtfdZDqQpZ15eaEZeLspIqS5mK5fOBDZi6AjuqaIi53QNVXH3dQv6uKT3YuUu6uxV/8pjU9in0CoJ8fgaHqw==", - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.1.2", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^7.2.0", - "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "lru-cache": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", - "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==" - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "optional": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - } - } - }, - "cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "requires": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - } - }, - "cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^2.0.0" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - } - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - } - } - }, - "clean-for-publish": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clean-for-publish/-/clean-for-publish-1.0.4.tgz", - "integrity": "sha1-KZMj50qzSwXSIHBsWd+B3QTKAYo=", - "dev": true, - "requires": { - "fs-extra": "^0.26.2", - "glob": "~5.0.15", - "yargs": "~3.29.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - } - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "optional": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "combyne": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", - "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", - "dev": true - }, - "commander": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", - "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "optional": true - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "coveralls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", - "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", - "dev": true, - "requires": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.85.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true - }, - "decompress-response": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreachasync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "optional": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", + "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "string-width": "^1.0.2 || 2" + "ansi-regex": "^5.0.1" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -10922,13 +5261,6 @@ } } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "optional": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -10951,27 +5283,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^2.0.0" - } - }, "glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", @@ -11017,12 +5328,6 @@ } } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, "got": { "version": "10.7.0", "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", @@ -11092,15 +5397,6 @@ "har-schema": "^2.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", @@ -11118,88 +5414,12 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", @@ -11252,21 +5472,6 @@ "@tootallnate/once": "2", "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "http-signature": { @@ -11287,21 +5492,6 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "humanize-ms": { @@ -11312,6 +5502,15 @@ "ms": "^2.0.0" } }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -11339,147 +5538,47 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "requires": { - "is-primitive": "^2.0.0" + "wrappy": "1" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "is-extglob": { + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "invert-kv": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -11488,16 +5587,6 @@ "number-is-nan": "^1.0.0" } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -11509,49 +5598,6 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true - }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -11604,16 +5650,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -11689,12 +5725,6 @@ "nopt": "~3.0.1" } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -11720,12 +5750,6 @@ "dev": true, "optional": true }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, "jshint": { "version": "2.13.4", "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", @@ -11837,16 +5861,6 @@ "json-buffer": "3.0.1" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", @@ -11921,15 +5935,6 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -11941,13 +5946,6 @@ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "make-dir": { @@ -11989,71 +5987,12 @@ }, "dependencies": { "lru-cache": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.6.0.tgz", - "integrity": "sha512-zjOf6cyMI7rcN+5MtLsT4GnDjc6D9XHi8kYcsfXTqWC+yLdSiU3/jtEPX9wZE77+XLtnmdIWu3+291hkizfH+Q==" - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", + "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==" } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "optional": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "optional": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true, - "optional": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, "mime-db": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", @@ -12087,27 +6026,20 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, "minipass-collect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minipass-fetch": { @@ -12119,21 +6051,6 @@ "minipass": "^3.1.6", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minipass-flush": { @@ -12142,21 +6059,6 @@ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minipass-pipeline": { @@ -12165,21 +6067,6 @@ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minipass-sized": { @@ -12188,21 +6075,6 @@ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minizlib": { @@ -12212,44 +6084,6 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "optional": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } } }, "mkdirp": { @@ -12331,52 +6165,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true - } - } + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" }, "negotiator": { "version": "0.6.3", @@ -12414,98 +6205,17 @@ "which": "^2.0.2" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "gauge": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", - "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abbrev": "1" } }, "rimraf": { @@ -12516,45 +6226,6 @@ "glob": "^7.1.3" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12562,11 +6233,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -12602,6 +6268,17 @@ "once": "^1.3.2" } }, + "npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + } + }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", @@ -12627,55 +6304,12 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "optional": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - } - } - }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -12688,36 +6322,6 @@ "object-keys": "^1.0.11" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "optional": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - } - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12767,12 +6371,6 @@ "readable-stream": "^2.0.1" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -12782,23 +6380,6 @@ "lcid": "^1.0.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, "p-cancelable": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", @@ -12833,19 +6414,6 @@ "p-finally": "^1.0.0" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", @@ -12855,13 +6423,6 @@ "@types/node": "*" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "optional": true - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -12879,32 +6440,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "optional": true - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -12980,34 +6521,6 @@ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -13022,398 +6535,6 @@ "util-deprecate": "~1.0.1" } }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -13431,39 +6552,16 @@ "dev": true, "requires": { "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" } }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -13521,13 +6619,6 @@ "value-or-function": "^3.0.0" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true, - "optional": true - }, "responselike": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", @@ -13536,13 +6627,6 @@ "lowercase-keys": "^2.0.0" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "optional": true - }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -13562,16 +6646,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "optional": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -13584,171 +6658,29 @@ "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", "dev": true }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "optional": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "optional": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true, - "optional": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.2.0" - } - }, "socks": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", @@ -13766,67 +6698,6 @@ "agent-base": "^6.0.2", "debug": "^4.3.1", "socks": "^2.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "optional": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true, - "optional": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -13858,44 +6729,6 @@ "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "requires": { "minipass": "^3.1.1" - }, - "dependencies": { - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "optional": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } } }, "stream-shift": { @@ -13930,11 +6763,30 @@ "ansi-regex": "^2.0.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } }, "tar-fs": { "version": "1.16.3", @@ -14007,63 +6859,11 @@ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, "to-readable-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==" }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "optional": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, "to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", @@ -14088,12 +6888,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -14157,19 +6951,6 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -14201,64 +6982,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "optional": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "optional": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true, - "optional": true - }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -14277,19 +7000,6 @@ } } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "optional": true - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14301,15 +7011,6 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - }, "value-or-function": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", @@ -14475,6 +7176,11 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "3.29.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", diff --git a/package.json b/package.json index 337d88ab2..71491be3a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "email": "tylerw@axosoft.com" } ], - "main": "dist/nodegit.js", + "main": "lib/nodegit.js", "repository": { "type": "git", "url": "git://github.com/nodegit/nodegit.git" @@ -38,20 +38,18 @@ "node": ">= 12.19.0 < 13 || >= 14.10.0" }, "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^10.7.0", "json5": "^2.1.0", "lodash": "^4.17.14", - "nan": "^2.14.1", + "nan": "^2.15.0", "node-gyp": "^9.0.0", - "@mapbox/node-pre-gyp": "^1.0.8", "ramda": "^0.25.0", "tar-fs": "^1.16.3" }, "devDependencies": { "aws-sdk": "^2.1095.0", - "babel-cli": "^6.7.7", - "babel-preset-es2015": "^6.6.0", "cheerio": "^1.0.0-rc.2", "clean-for-publish": "~1.0.2", "combyne": "~0.8.1", @@ -69,7 +67,6 @@ "host": "https://axonodegit.s3.amazonaws.com/nodegit/nodegit/" }, "scripts": { - "babel": "babel --presets es2015 -d ./dist ./lib", "cov": "npm run cppcov && npm run filtercov && npm run mergecov", "coveralls": "cat ./test/coverage/merged.lcov | coveralls", "cppcov": "mkdir -p test/coverage/cpp && ./lcov-1.10/bin/lcov --gcov-tool /usr/bin/gcov-4.9 --capture --directory build/Release/obj.target/nodegit/src --output-file test/coverage/cpp/lcov_full.info", @@ -84,9 +81,8 @@ "mocha": "mocha --expose-gc test/runner test/tests --timeout 15000", "mochaDebug": "mocha --expose-gc --debug-brk test/runner test/tests --timeout 15000", "postinstall": "node lifecycleScripts/postinstall", - "prepublish": "npm run babel", - "rebuild": "node generate && npm run babel && node-gyp configure build", - "rebuildDebug": "node generate && npm run babel && node-gyp configure --debug build", + "rebuild": "node generate && node-gyp configure build", + "rebuildDebug": "node generate && node-gyp configure --debug build", "recompile": "node-gyp configure build", "recompileDebug": "node-gyp configure --debug build", "test": "npm run lint && node --expose-gc test", From b24e9a5e5f65f8fe405dee4c357ef040ca114b77 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 21 Mar 2022 07:40:45 -0700 Subject: [PATCH 371/545] Downgrade node-gyp to 8.4.1 Issues with mac and openssl_fips --- package-lock.json | 200 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 87 insertions(+), 115 deletions(-) diff --git a/package-lock.json b/package-lock.json index 209c1c4fd..5869a1fbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "nan": "^2.15.0", - "node-gyp": "^9.0.0", + "node-gyp": "^8.4.1", "ramda": "^0.25.0", "tar-fs": "^1.16.3" }, @@ -253,11 +253,11 @@ } }, "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "engines": { - "node": ">= 10" + "node": ">= 6" } }, "node_modules/@types/cacheable-request": { @@ -589,31 +589,31 @@ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, "node_modules/cacache": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.2.tgz", - "integrity": "sha512-Q17j7s8X81i/QYVrKVQ/qwWGT+pYLfpTcZ+X+p/Qw9FULy9JEfb2FECYTTt6mPV6A/vk92nRZ80ncpKxiGTrIA==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dependencies": { "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.1.2", + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^7.2.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.1.11", + "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">= 10" } }, "node_modules/cacache/node_modules/chownr": { @@ -624,14 +624,6 @@ "node": ">=10" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", - "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==", - "engines": { - "node": ">=12" - } - }, "node_modules/cacache/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -1838,11 +1830,11 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dependencies": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, @@ -2459,37 +2451,29 @@ } }, "node_modules/make-fetch-happen": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.6.tgz", - "integrity": "sha512-4Gfh6lV3TLXmj7qz79hBFuvVqjYSMW6v2+sxtdX4LFQU0rK3V/txRjE0DoZb7X0IF3t9f8NO3CxPSWlvdckhVA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.0.0", + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", + "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^0.6.2", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.1.1", - "ssri": "^8.0.1" + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", - "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==", - "engines": { - "node": ">=12" + "node": ">= 10" } }, "node_modules/mime-db": { @@ -2563,19 +2547,19 @@ } }, "node_modules/minipass-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.0.3.tgz", - "integrity": "sha512-VA+eiiUtaIvpQJXISwE3OiMvQwAWrgKb97F0aXlCS1Ahikr8fEQq8m3Hf7Kv9KT3nokuHigJKsDMB6atU04olQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "dependencies": { - "minipass": "^3.1.6", + "minipass": "^3.1.0", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=8" }, "optionalDependencies": { - "encoding": "^0.1.13" + "encoding": "^0.1.12" } }, "node_modules/minipass-flush": { @@ -2758,14 +2742,14 @@ } }, "node_modules/node-gyp": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", - "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^9.1.0", "nopt": "^5.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -2777,7 +2761,7 @@ "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": ">= 10.12.0" } }, "node_modules/node-gyp/node_modules/graceful-fs": { @@ -4158,9 +4142,9 @@ } }, "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, "@types/cacheable-request": { "version": "6.0.1", @@ -4443,27 +4427,27 @@ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, "cacache": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.2.tgz", - "integrity": "sha512-Q17j7s8X81i/QYVrKVQ/qwWGT+pYLfpTcZ+X+p/Qw9FULy9JEfb2FECYTTt6mPV6A/vk92nRZ80ncpKxiGTrIA==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "requires": { "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.1.2", + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^7.2.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", - "tar": "^6.1.11", + "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "dependencies": { @@ -4472,11 +4456,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "lru-cache": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", - "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==" - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -5465,11 +5444,11 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "requires": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } @@ -5964,33 +5943,26 @@ } }, "make-fetch-happen": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.6.tgz", - "integrity": "sha512-4Gfh6lV3TLXmj7qz79hBFuvVqjYSMW6v2+sxtdX4LFQU0rK3V/txRjE0DoZb7X0IF3t9f8NO3CxPSWlvdckhVA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.0.0", + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", + "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.5.1", - "minipass": "^3.1.6", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^0.6.2", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.1.1", - "ssri": "^8.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", - "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==" - } + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" } }, "mime-db": { @@ -6043,14 +6015,14 @@ } }, "minipass-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.0.3.tgz", - "integrity": "sha512-VA+eiiUtaIvpQJXISwE3OiMvQwAWrgKb97F0aXlCS1Ahikr8fEQq8m3Hf7Kv9KT3nokuHigJKsDMB6atU04olQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", + "encoding": "^0.1.12", + "minipass": "^3.1.0", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^2.0.0" } }, "minipass-flush": { @@ -6189,14 +6161,14 @@ } }, "node-gyp": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", - "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^9.1.0", "nopt": "^5.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", diff --git a/package.json b/package.json index 71491be3a..3ce2b0765 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "nan": "^2.15.0", - "node-gyp": "^9.0.0", + "node-gyp": "^8.4.1", "ramda": "^0.25.0", "tar-fs": "^1.16.3" }, From 527853b32aebe997de68fb8cf0929a3115e14984 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 21 Mar 2022 07:49:52 -0700 Subject: [PATCH 372/545] Rebuild package-lock.json Bring in newer packages, we're getting issues with outdated packages --- package-lock.json | 4504 ++++++++++++++++++++++++++------------------- 1 file changed, 2641 insertions(+), 1863 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5869a1fbd..faac7024d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,129 +61,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@npmcli/fs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", @@ -216,24 +93,10 @@ "node": ">=10" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@sindresorhus/is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", - "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", "engines": { "node": ">=10" }, @@ -242,9 +105,9 @@ } }, "node_modules/@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -261,9 +124,9 @@ } }, "node_modules/@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "*", @@ -272,22 +135,22 @@ } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "node_modules/@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", - "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" }, "node_modules/@types/responselike": { "version": "1.0.0", @@ -298,9 +161,9 @@ } }, "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" }, "node_modules/agent-base": { "version": "6.0.2", @@ -339,15 +202,19 @@ } }, "node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/amdefine": { @@ -361,11 +228,11 @@ } }, "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/append-buffer": { @@ -381,33 +248,20 @@ } }, "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "node_modules/are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "node": ">=10" } }, "node_modules/argparse": { @@ -420,9 +274,9 @@ } }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "dependencies": { "safer-buffer": "~2.1.0" @@ -450,9 +304,9 @@ "dev": true }, "node_modules/aws-sdk": { - "version": "2.1095.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1095.0.tgz", - "integrity": "sha512-OrZq2pTDsnfOJYsAdRlw+NXTGLQYqWldSZR3HugW8JT4JPWyFZrgB2yPP2ElFHX+4J4SZg5QvkAXl/7s9gLTgA==", + "version": "2.1096.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1096.0.tgz", + "integrity": "sha512-q+hotU57U8bGpz1pf5CkO4z630ay0xGJ9HedahKPZ0Xk3/X0GH+QFYPBWJ5IMTtO30bjfPH0zTaL2vJmMXLBrQ==", "dev": true, "dependencies": { "buffer": "4.9.2", @@ -479,15 +333,15 @@ } }, "node_modules/aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -514,20 +368,46 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -616,12 +496,23 @@ "node": ">= 10" } }, - "node_modules/cacache/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/cacache/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/mkdirp": { @@ -635,20 +526,6 @@ "node": ">=10" } }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/cacheable-lookup": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", @@ -662,22 +539,35 @@ } }, "node_modules/cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", + "normalize-url": "^6.0.1", "responselike": "^2.0.0" }, "engines": { "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", @@ -694,46 +584,49 @@ "dev": true }, "node_modules/cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", "dev": true, "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/cheerio/node_modules/entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "node_modules/cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", "dev": true, "dependencies": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } }, "node_modules/clean-for-publish": { "version": "1.0.4", @@ -762,20 +655,45 @@ "rimraf": "^2.2.8" } }, - "node_modules/clean-for-publish/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "node_modules/clean-for-publish/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/clean-for-publish/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/clean-for-publish/node_modules/rimraf/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { + "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "2 || 3", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/clean-stack": { @@ -799,6 +717,26 @@ "node": ">=0.2.5" } }, + "node_modules/cli/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -810,6 +748,53 @@ "wrap-ansi": "^2.0.0" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -851,9 +836,9 @@ "dev": true }, "node_modules/cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -861,20 +846,41 @@ "readable-stream": "^2.3.5" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -888,9 +894,9 @@ } }, "node_modules/combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { "delayed-stream": "~1.0.0" @@ -905,15 +911,21 @@ "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", "dev": true }, + "node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "dependencies": { "ini": "^1.3.4", @@ -935,99 +947,70 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "node_modules/convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/coveralls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", - "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", "dev": true, "dependencies": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.85.0" + "minimist": "^1.2.5", + "request": "^2.88.2" }, "bin": { "coveralls": "bin/coveralls.js" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/coveralls/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coveralls/node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/coveralls/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">=6" } }, - "node_modules/coveralls/node_modules/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true, "engines": { - "node": "*" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/dashdash": { @@ -1064,11 +1047,6 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -1090,15 +1068,15 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { "node": ">=10" } @@ -1158,51 +1136,58 @@ } }, "node_modules/dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "dependencies": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, "node_modules/domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "deprecated": "update to domelementtype@1.3.1", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, "node_modules/domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/duplexer3": { @@ -1211,9 +1196,9 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "node_modules/duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "dependencies": { "end-of-stream": "^1.0.0", @@ -1222,12 +1207,41 @@ "stream-shift": "^1.0.0" } }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -1248,18 +1262,21 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } }, "node_modules/entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/env-paths": { "version": "2.2.1", @@ -1305,19 +1322,6 @@ "source-map": "~0.2.0" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", @@ -1341,9 +1345,9 @@ } }, "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1351,7 +1355,7 @@ }, "node_modules/events": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true, "engines": { @@ -1383,15 +1387,15 @@ ] }, "node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { @@ -1401,13 +1405,43 @@ "dev": true }, "node_modules/flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, "node_modules/foreachasync": { @@ -1426,13 +1460,13 @@ } }, "node_modules/form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" }, "engines": { @@ -1445,9 +1479,9 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -1457,14 +1491,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -1501,81 +1527,50 @@ "dev": true }, "node_modules/gauge": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", - "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "wide-align": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { "pump": "^3.0.0" }, "engines": { "node": ">=8" - } - }, - "node_modules/get-stream/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/getpass": { @@ -1588,22 +1583,29 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" } }, "node_modules/glob-stream": { @@ -1627,35 +1629,54 @@ "node": ">= 0.10" } }, - "node_modules/glob-stream/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "node_modules/glob-stream/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-stream/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/glob-stream/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "node_modules/glob-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "~5.1.0" } }, "node_modules/got": { @@ -1687,12 +1708,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "engines": { - "node": ">=0.4.0" - } + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "node_modules/growl": { "version": "1.10.5", @@ -1704,14 +1722,15 @@ } }, "node_modules/handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "dependencies": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1" + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" }, "bin": { "handlebars": "bin/handlebars" @@ -1742,17 +1761,29 @@ } }, "node_modules/har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", "dev": true, "dependencies": { - "ajv": "^5.3.0", + "ajv": "^6.12.3", "har-schema": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, "node_modules/has-flag": { @@ -1765,12 +1796,15 @@ } }, "node_modules/has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-unicode": { @@ -1788,42 +1822,24 @@ } }, "node_modules/htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "node_modules/htmlparser2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/htmlparser2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -1926,19 +1942,15 @@ } }, "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", - "dev": true, - "engines": { - "node": "*" - } + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/invert-kv": { "version": "1.0.0", @@ -1973,20 +1985,38 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" }, "node_modules/is-negated-glob": { @@ -2094,38 +2124,16 @@ "istanbul": "lib/cli.js" } }, - "node_modules/istanbul/node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "node_modules/istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/istanbul/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "dependencies": { - "has-flag": "^1.0.0" + "abbrev": "1" }, - "engines": { - "node": ">=0.8.0" + "bin": { + "nopt": "bin/nopt.js" } }, "node_modules/jmespath": { @@ -2153,10 +2161,22 @@ "js-beautify": "js/bin/js-beautify.js" } }, + "node_modules/js-beautify/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -2183,8 +2203,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "node_modules/jshint": { "version": "2.13.4", @@ -2204,49 +2223,139 @@ "jshint": "bin/jshint" } }, - "node_modules/jshint/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "node_modules/jshint/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jshint/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "node_modules/jshint/node_modules/strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "node_modules/jshint/node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "dev": true, - "bin": { - "strip-json-comments": "cli.js" + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/jshint/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/jshint/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "node_modules/jshint/node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/jshint/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/jshint/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.8.0" + "node": "*" + } + }, + "node_modules/jshint/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, + "node_modules/jshint/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-stable-stringify": { + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "dependencies": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -2255,11 +2364,11 @@ "dev": true }, "node_modules/json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dependencies": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" }, "bin": { "json5": "lib/cli.js" @@ -2268,48 +2377,33 @@ "node": ">=6" } }, - "node_modules/json5/node_modules/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, "node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/keyv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", - "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", + "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", "dependencies": { "json-buffer": "3.0.1" } @@ -2324,9 +2418,9 @@ } }, "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "dependencies": { "readable-stream": "^2.0.5" @@ -2335,6 +2429,36 @@ "node": ">= 0.6.3" } }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2348,10 +2472,13 @@ } }, "node_modules/lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "dev": true, + "bin": { + "lcov-parse": "bin/cli.js" + } }, "node_modules/lcov-result-merger": { "version": "3.1.0", @@ -2396,9 +2523,9 @@ } }, "node_modules/lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/log-driver": { "version": "1.2.7", @@ -2477,21 +2604,21 @@ } }, "node_modules/mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "~1.36.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -2509,9 +2636,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2520,9 +2647,9 @@ } }, "node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "node_modules/minipass": { "version": "3.1.6", @@ -2608,12 +2735,11 @@ } }, "node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dependencies": { - "minimist": "0.0.8" + "minimist": "^1.2.5" }, "bin": { "mkdirp": "bin/cmd.js" @@ -2645,12 +2771,6 @@ "node": ">= 4.0.0" } }, - "node_modules/mocha/node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, "node_modules/mocha/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -2686,22 +2806,59 @@ "node": ">=4" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "node_modules/mocha/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/ms": { + "node_modules/mocha/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { "version": "2.15.0", @@ -2717,9 +2874,9 @@ } }, "node_modules/neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "node_modules/node-fetch": { @@ -2764,39 +2921,69 @@ "node": ">= 10.12.0" } }, - "node_modules/node-gyp/node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "dependencies": { - "abbrev": "1" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", + "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { - "glob": "^7.1.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, "node_modules/node-gyp/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2812,15 +2999,17 @@ } }, "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/normalize-path": { @@ -2836,17 +3025,20 @@ } }, "node_modules/normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/now-and-later": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", "dev": true, "dependencies": { "once": "^1.3.2" @@ -2856,32 +3048,33 @@ } }, "node_modules/npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dependencies": { - "are-we-there-yet": "^3.0.0", + "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", + "gauge": "^3.0.0", "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" } }, "node_modules/nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "dependencies": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2904,27 +3097,30 @@ } }, "node_modules/object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { @@ -2935,37 +3131,18 @@ "wrappy": "1" } }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "node_modules/optimist/node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "dependencies": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" }, "engines": { "node": ">= 0.8.0" @@ -2980,6 +3157,36 @@ "readable-stream": "^2.0.1" } }, + "node_modules/ordered-read-streams/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/ordered-read-streams/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -2993,22 +3200,25 @@ } }, "node_modules/p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { "node": ">=8" } }, "node_modules/p-event": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", - "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "dependencies": { - "p-timeout": "^2.0.1" + "p-timeout": "^3.1.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-finally": { @@ -3034,23 +3244,29 @@ } }, "node_modules/p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dependencies": { "p-finally": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, "dependencies": { - "@types/node": "*" + "parse5": "^6.0.1" } }, "node_modules/path-dirname": { @@ -3083,9 +3299,9 @@ } }, "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -3111,16 +3327,15 @@ "dev": true }, "node_modules/psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -3137,16 +3352,29 @@ "pump": "^2.0.0" } }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -3168,17 +3396,16 @@ "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" }, "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/remove-bom-buffer": { @@ -3215,18 +3442,18 @@ "dev": true }, "node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true, "engines": { "node": ">= 0.10" } }, "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { @@ -3237,7 +3464,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -3247,20 +3474,14 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "engines": { - "node": ">= 4" + "node": ">= 6" } }, - "node_modules/request/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -3296,38 +3517,73 @@ } }, "node_modules/rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "glob": "^7.0.5" + "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3383,6 +3639,19 @@ "node": ">= 10" } }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3390,16 +3659,20 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", - "safer-buffer": "^2.0.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", @@ -3408,12 +3681,6 @@ }, "engines": { "node": ">=0.10.0" - }, - "optionalDependencies": { - "bcrypt-pbkdf": "^1.0.0", - "ecc-jsbn": "~0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" } }, "node_modules/ssri": { @@ -3428,41 +3695,65 @@ } }, "node_modules/stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" } }, "node_modules/tar": { @@ -3492,6 +3783,11 @@ "tar-stream": "^1.1.2" } }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/tar-fs/node_modules/pump": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", @@ -3518,12 +3814,31 @@ "node": ">= 0.8.0" } }, - "node_modules/tar/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, "node_modules/tar/node_modules/mkdirp": { @@ -3538,25 +3853,55 @@ } }, "node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "dependencies": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "node_modules/through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "dependencies": { "through2": "~2.0.0", "xtend": "~4.0.0" } }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", @@ -3596,13 +3941,13 @@ } }, "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { "node": ">=0.8" @@ -3613,6 +3958,12 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3629,8 +3980,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "node_modules/type-check": { "version": "0.3.2", @@ -3656,15 +4006,11 @@ } }, "node_modules/uglify-js": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", - "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", + "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", "dev": true, "optional": true, - "dependencies": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -3672,23 +4018,6 @@ "node": ">=0.8.0" } }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -3715,13 +4044,13 @@ } }, "node_modules/unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "dependencies": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" } }, "node_modules/universalify": { @@ -3732,6 +4061,15 @@ "node": ">= 4.0.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -3787,9 +4125,9 @@ } }, "node_modules/vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "dependencies": { "clone": "^2.1.1", @@ -3831,6 +4169,36 @@ "node": ">= 0.10" } }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/vinyl-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/vinyl-sourcemap": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", @@ -3850,9 +4218,9 @@ } }, "node_modules/walk": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", - "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", "dev": true, "dependencies": { "foreachasync": "^3.0.0" @@ -3904,6 +4272,15 @@ "node": ">= 0.10.0" } }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -3923,42 +4300,89 @@ "node": ">=0.10.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "node_modules/yallist": { @@ -4001,98 +4425,6 @@ "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "@npmcli/fs": { @@ -4117,26 +4449,18 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } } } }, "@sindresorhus/is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz", - "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==" }, "@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "requires": { "defer-to-connect": "^2.0.0" } @@ -4147,9 +4471,9 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", "requires": { "@types/http-cache-semantics": "*", "@types/keyv": "*", @@ -4158,22 +4482,22 @@ } }, "@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "requires": { "@types/node": "*" } }, "@types/node": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", - "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" }, "@types/responselike": { "version": "1.0.0", @@ -4184,9 +4508,9 @@ } }, "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" }, "agent-base": { "version": "6.0.2", @@ -4216,15 +4540,15 @@ } }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "amdefine": { @@ -4235,9 +4559,9 @@ "optional": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "append-buffer": { "version": "1.0.2", @@ -4249,29 +4573,17 @@ } }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "argparse": { @@ -4284,9 +4596,9 @@ } }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -4311,9 +4623,9 @@ "dev": true }, "aws-sdk": { - "version": "2.1095.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1095.0.tgz", - "integrity": "sha512-OrZq2pTDsnfOJYsAdRlw+NXTGLQYqWldSZR3HugW8JT4JPWyFZrgB2yPP2ElFHX+4J4SZg5QvkAXl/7s9gLTgA==", + "version": "2.1096.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1096.0.tgz", + "integrity": "sha512-q+hotU57U8bGpz1pf5CkO4z630ay0xGJ9HedahKPZ0Xk3/X0GH+QFYPBWJ5IMTtO30bjfPH0zTaL2vJmMXLBrQ==", "dev": true, "requires": { "buffer": "4.9.2", @@ -4334,15 +4646,15 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -4355,18 +4667,46 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } }, "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "boolbase": { @@ -4451,23 +4791,23 @@ "unique-filename": "^1.1.1" }, "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } } } }, @@ -4481,19 +4821,29 @@ } }, "cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", + "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", @@ -4507,45 +4857,37 @@ "dev": true }, "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", "dev": true, "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - } + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "clean-for-publish": { "version": "1.0.4", @@ -4571,17 +4913,38 @@ "rimraf": "^2.2.8" } }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "graceful-fs": "^4.1.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } } } @@ -4599,6 +4962,22 @@ "requires": { "exit": "0.1.2", "glob": "^7.1.1" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "cliui": { @@ -4610,6 +4989,43 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "clone": { @@ -4646,36 +5062,63 @@ "dev": true }, "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, "requires": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -4687,15 +5130,21 @@ "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", "dev": true }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "requires": { "ini": "^1.3.4", @@ -4717,12 +5166,20 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "core-util-is": { @@ -4731,65 +5188,35 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "coveralls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", - "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", "dev": true, "requires": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.85.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "minimist": "^1.2.5", + "request": "^2.88.2" } }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true }, "dashdash": { @@ -4813,13 +5240,6 @@ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "decamelize": { @@ -4837,15 +5257,15 @@ } }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, "define-properties": { "version": "1.1.3", @@ -4884,52 +5304,40 @@ "dev": true }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - } + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" } }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "duplexer3": { @@ -4938,15 +5346,47 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "ecc-jsbn": { @@ -4954,7 +5394,6 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -4975,17 +5414,17 @@ } }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, "env-paths": { @@ -5015,18 +5454,6 @@ "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } } }, "esprima": { @@ -5042,14 +5469,14 @@ "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "events": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, @@ -5072,15 +5499,15 @@ "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { @@ -5090,13 +5517,45 @@ "dev": true }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "foreachasync": { @@ -5112,13 +5571,13 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -5128,23 +5587,13 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - } } }, "fs-minipass": { @@ -5177,67 +5626,38 @@ "dev": true }, "gauge": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", - "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "requires": { "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } + "wide-align": "^1.1.2" + } + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" } }, "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } } }, "getpass": { @@ -5250,18 +5670,28 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, "requires": { - "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, "glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", @@ -5280,29 +5710,48 @@ "unique-stream": "^2.0.2" }, "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "safe-buffer": "~5.1.0" } } } @@ -5330,9 +5779,9 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "growl": { "version": "1.10.5", @@ -5341,15 +5790,16 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" }, "dependencies": { "source-map": { @@ -5367,15 +5817,24 @@ "dev": true }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", @@ -5383,59 +5842,32 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, "http-cache-semantics": { @@ -5521,14 +5953,14 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "invert-kv": { @@ -5558,12 +5990,24 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "is-extglob": "^2.1.0" } }, "is-lambda": { @@ -5657,32 +6101,13 @@ "wordwrap": "^1.0.0" }, "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "abbrev": "1" } } } @@ -5702,12 +6127,23 @@ "config-chain": "~1.1.5", "mkdirp": "~0.5.0", "nopt": "~3.0.1" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + } } }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5726,8 +6162,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jshint": { "version": "2.13.4", @@ -5744,16 +6179,105 @@ "strip-json-comments": "1.0.x" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } } @@ -5764,25 +6288,22 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -5791,51 +6312,37 @@ "dev": true }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } + "minimist": "^1.2.5" } }, "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, "keyv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", - "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", + "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", "requires": { "json-buffer": "3.0.1" } @@ -5850,12 +6357,44 @@ } }, "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "requires": { "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "lcid": { @@ -5868,9 +6407,9 @@ } }, "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, "lcov-result-merger": { @@ -5904,9 +6443,9 @@ } }, "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "log-driver": { "version": "1.2.7", @@ -5966,18 +6505,18 @@ } }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "~1.36.0" + "mime-db": "1.52.0" } }, "mimic-response": { @@ -5986,17 +6525,17 @@ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.6", @@ -6059,11 +6598,11 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "mocha": { @@ -6085,12 +6624,6 @@ "supports-color": "5.4.0" }, "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -6120,6 +6653,36 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -6132,9 +6695,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nan": { "version": "2.15.0", @@ -6147,9 +6710,9 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "node-fetch": { @@ -6177,25 +6740,52 @@ "which": "^2.0.2" }, "dependencies": { - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "gauge": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", + "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", "requires": { - "abbrev": "1" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { - "glob": "^7.1.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" } }, "which": { @@ -6209,10 +6799,9 @@ } }, "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "requires": { "abbrev": "1" } @@ -6227,43 +6816,44 @@ } }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "now-and-later": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", "dev": true, "requires": { "once": "^1.3.2" } }, "npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "requires": { - "are-we-there-yet": "^3.0.0", + "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", + "gauge": "^3.0.0", "set-blocking": "^2.0.0" } }, "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true }, "oauth-sign": { "version": "0.9.0", @@ -6277,21 +6867,21 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "once": { @@ -6302,36 +6892,18 @@ "wrappy": "1" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "ordered-read-streams": { @@ -6341,6 +6913,38 @@ "dev": true, "requires": { "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "os-locale": { @@ -6353,16 +6957,16 @@ } }, "p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" }, "p-event": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", - "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "requires": { - "p-timeout": "^2.0.1" + "p-timeout": "^3.1.0" } }, "p-finally": { @@ -6379,20 +6983,26 @@ } }, "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "requires": { "p-finally": "^1.0.0" } }, "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, "requires": { - "@types/node": "*" + "parse5": "^6.0.1" } }, "path-dirname": { @@ -6419,9 +7029,9 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", @@ -6444,16 +7054,15 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6468,18 +7077,30 @@ "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "querystring": { @@ -6494,17 +7115,13 @@ "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" }, "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "remove-bom-buffer": { @@ -6535,15 +7152,15 @@ "dev": true }, "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -6553,7 +7170,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -6563,17 +7180,9 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } } }, "resolve": { @@ -6605,18 +7214,32 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -6626,7 +7249,7 @@ }, "sax": { "version": "1.2.1", - "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", "dev": true }, @@ -6672,6 +7295,16 @@ "socks": "^2.6.1" } }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6679,9 +7312,9 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -6704,35 +7337,50 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" } }, "tar": { @@ -6748,11 +7396,6 @@ "yallist": "^4.0.0" }, "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -6771,6 +7414,11 @@ "tar-stream": "^1.1.2" }, "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "pump": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", @@ -6794,22 +7442,83 @@ "readable-stream": "^2.3.0", "to-buffer": "^1.1.1", "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { "through2": "~2.0.0", @@ -6846,13 +7555,13 @@ } }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { @@ -6860,6 +7569,12 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6873,8 +7588,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -6891,31 +7605,11 @@ "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==" }, "uglify-js": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", - "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", + "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } + "optional": true }, "unc-path-regex": { "version": "0.1.2", @@ -6940,13 +7634,13 @@ } }, "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" } }, "universalify": { @@ -6954,6 +7648,15 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -7001,9 +7704,9 @@ } }, "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "requires": { "clone": "^2.1.1", @@ -7037,6 +7740,38 @@ "value-or-function": "^3.0.0", "vinyl": "^2.0.0", "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "vinyl-sourcemap": { @@ -7055,9 +7790,9 @@ } }, "walk": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", - "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", "dev": true, "requires": { "foreachasync": "^3.0.0" @@ -7100,6 +7835,12 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -7114,6 +7855,43 @@ "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "wrappy": { @@ -7138,14 +7916,14 @@ "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "yallist": { From 3f8616f0289ca9415908e49c74f31370078b479b Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 22 Mar 2022 07:24:21 -0700 Subject: [PATCH 373/545] Bump to v0.28.0-alpha.13 --- CHANGELOG.md | 12 +++++++++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a1e3e412..1df30901b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ # Change Log -## v0.28.0-alpha.12 [(2022-02-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.12) +## v0.28.0-alpha.13 [(2022-03-22)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.13) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.12...v0.28.0-alpha.13) + +#### Summary of changes +- Partially fix issue with building for Electron + +#### Merged PRs into NodeGit +- [Fix electron build](https://github.com/nodegit/nodegit/pull/1901) + +## v0.28.0-alpha.12 [(2022-03-18)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.12) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.11...v0.28.0-alpha.12) diff --git a/package-lock.json b/package-lock.json index faac7024d..d0a721628 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.12", + "version": "0.28.0-alpha.13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.12", + "version": "0.28.0-alpha.13", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3ce2b0765..c01b49664 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.12", + "version": "0.28.0-alpha.13", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From a2897b9efe7be84a6663ae62606c487aa80cae94 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 23 Feb 2022 15:37:49 -0700 Subject: [PATCH 374/545] Upgrade libgit2 and generation --- .clangd | 15 + generate/input/callbacks.json | 33 +- generate/input/descriptor.json | 65 + generate/input/libgit2-docs.json | 4080 ++++++++++------- generate/input/libgit2-supplement.json | 47 - generate/scripts/utils.js | 2 +- generate/templates/manual/libgit2/opts.cc | 24 - .../templates/manual/src/convenient_hunk.cc | 4 +- .../templates/partials/callback_helpers.cc | 2 +- .../partials/configurable_callbacks.cc | 66 +- lib/buf.js | 36 +- lib/libgit2.js | 6 - lib/rebase.js | 59 +- vendor/libgit2 | 2 +- vendor/libgit2.gyp | 7 +- 15 files changed, 2751 insertions(+), 1697 deletions(-) create mode 100644 .clangd delete mode 100644 lib/libgit2.js diff --git a/.clangd b/.clangd new file mode 100644 index 000000000..b14fb9b59 --- /dev/null +++ b/.clangd @@ -0,0 +1,15 @@ +If: + PathMatch: [src/.*, include/.*] + +CompileFlags: + Add: [ + -I../node_modules/nan, + -I../vendor/libssh2/include, + -I../vendor/libgit2/include, + -I/home/johna/.cache/node-gyp/14.19.0/include/node, + -I/home/johna/.cache/node-gyp/14.19.0/src, + -I/home/johna/.cache/node-gyp/14.19.0/deps/openssl/config, + -I/home/johna/.cache/node-gyp/14.19.0/deps/openssl/openssl/include, + -I/home/johna/.cache/node-gyp/14.19.0/deps/uv/include, + -I/home/johna/.cache/node-gyp/14.19.0/deps/zlib, + -I/home/johna/.cache/node-gyp/14.19.0/deps/v8/include] \ No newline at end of file diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index e1cf6d828..c548266bd 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -135,20 +135,41 @@ "throttle": 100 } }, - "git_commit_signing_cb": { + "git_commit_create_cb": { "args": [ { - "name": "signature", - "cType": "git_buf *" + "name": "out", + "cType": "git_oid *", + "isReturn": true }, { - "name": "signature_field", - "cType": "git_buf *" + "name": "author", + "cType": "const git_signature *" }, { - "name": "commit_content", + "name": "committer", + "cType": "const git_signature *" + }, + { + "name": "message_encoding", "cType": "const char *" }, + { + "name": "message", + "cType": "const char *" + }, + { + "name": "tree", + "cType": "const git_tree *" + }, + { + "name": "parent_count", + "cType": "size_t" + }, + { + "name": "parents", + "cType": "const git_oid * []" + }, { "name": "payload", "cType": "void *" diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index a5e8448d1..9f3b7115a 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1667,6 +1667,20 @@ "return": { "isResultOrError": true } + }, + "git_graph_reachable_from_any": { + "args": { + "descendant_array": { + "cType": "git_oid *", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitOid" + } + }, + "isAsync": true, + "return": { + "isErrorCode": true + } } } }, @@ -3091,6 +3105,57 @@ } } }, + "rebase_options": { + "fields": { + "signing_cb": { + "ignore": true + }, + "commit_create_cb": { + "args": [ + { + "name": "out", + "cType": "git_oid *" + }, + { + "name": "author", + "cType": "const git_signature *" + }, + { + "name": "committer", + "cType": "const git_signature *" + }, + { + "name": "message_encoding", + "cType": "const char *" + }, + { + "name": "message", + "cType": "const char *" + }, + { + "name": "tree", + "cType": "const git_tree *" + }, + { + "name": "parent_count", + "cType": "size_t" + }, + { + "name": "parents", + "cType": "const git_oid **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitOid", + "arrayLengthArgumentName": "parent_count" + }, + { + "name": "payload", + "cType": "void *" + } + ] + } + } + }, "refdb": { "selfFreeing": true, "functions": { diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index e9f259a71..5bd855577 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -23,21 +23,24 @@ "git_apply" ], "meta": {}, - "lines": 145 + "lines": 147 }, { "file": "git2/attr.h", "functions": [ "git_attr_value", "git_attr_get", + "git_attr_get_ext", "git_attr_get_many", + "git_attr_get_many_ext", "git_attr_foreach_cb", "git_attr_foreach", + "git_attr_foreach_ext", "git_attr_cache_flush", "git_attr_add_macro" ], "meta": {}, - "lines": 261 + "lines": 356 }, { "file": "git2/blame.h", @@ -51,7 +54,7 @@ "git_blame_free" ], "meta": {}, - "lines": 226 + "lines": 277 }, { "file": "git2/blob.h", @@ -74,7 +77,7 @@ "git_blob_dup" ], "meta": {}, - "lines": 276 + "lines": 294 }, { "file": "git2/branch.h", @@ -95,10 +98,11 @@ "git_branch_is_checked_out", "git_branch_remote_name", "git_branch_upstream_remote", + "git_branch_upstream_merge", "git_branch_name_is_valid" ], "meta": {}, - "lines": 317 + "lines": 330 }, { "file": "git2/buffer.h", @@ -118,7 +122,7 @@ "git_transport_certificate_check_cb" ], "meta": {}, - "lines": 167 + "lines": 168 }, { "file": "git2/checkout.h", @@ -132,7 +136,7 @@ "git_checkout_tree" ], "meta": {}, - "lines": 394 + "lines": 410 }, { "file": "git2/cherrypick.h", @@ -189,10 +193,10 @@ "git_commit_create_buffer", "git_commit_create_with_signature", "git_commit_dup", - "git_commit_signing_cb" + "git_commit_create_cb" ], "meta": {}, - "lines": 524 + "lines": 540 }, { "file": "git2/common.h", @@ -202,7 +206,7 @@ "git_libgit2_opts" ], "meta": {}, - "lines": 423 + "lines": 456 }, { "file": "git2/config.h", @@ -286,8 +290,18 @@ "file": "git2/deprecated.h", "functions": [ "git_blob_filtered_content", + "git_filter_list_stream_data", + "git_filter_list_apply_to_data", "git_treebuilder_write_with_buffer", + "git_buf_grow", + "git_buf_set", + "git_buf_is_binary", + "git_buf_contains_nul", "git_buf_free", + "git_commit_signing_cb", + "git_diff_format_email", + "git_diff_commit_as_email", + "git_diff_format_email_options_init", "giterr_last", "giterr_clear", "giterr_set_str", @@ -296,13 +310,14 @@ "git_remote_is_valid_name", "git_reference_is_valid_name", "git_oid_iszero", + "git_oidarray_free", "git_headlist_cb", "git_strarray_copy", "git_strarray_free", "git_blame_init_options" ], "meta": {}, - "lines": 667 + "lines": 897 }, { "file": "git2/describe.h", @@ -355,14 +370,17 @@ "git_diff_stats_deletions", "git_diff_stats_to_buf", "git_diff_stats_free", - "git_diff_format_email", - "git_diff_commit_as_email", - "git_diff_format_email_options_init", "git_diff_patchid_options_init", "git_diff_patchid" ], "meta": {}, - "lines": 1504 + "lines": 1425 + }, + { + "file": "git2/email.h", + "functions": [], + "meta": {}, + "lines": 38 }, { "file": "git2/errors.h", @@ -379,17 +397,18 @@ "file": "git2/filter.h", "functions": [ "git_filter_list_load", + "git_filter_list_load_ext", "git_filter_list_contains", - "git_filter_list_apply_to_data", + "git_filter_list_apply_to_buffer", "git_filter_list_apply_to_file", "git_filter_list_apply_to_blob", - "git_filter_list_stream_data", + "git_filter_list_stream_buffer", "git_filter_list_stream_file", "git_filter_list_stream_blob", "git_filter_list_free" ], "meta": {}, - "lines": 218 + "lines": 264 }, { "file": "git2/global.h", @@ -404,10 +423,11 @@ "file": "git2/graph.h", "functions": [ "git_graph_ahead_behind", - "git_graph_descendant_of" + "git_graph_descendant_of", + "git_graph_reachable_from_any" ], "meta": {}, - "lines": 54 + "lines": 72 }, { "file": "git2/ignore.h", @@ -482,7 +502,7 @@ "git_indexer_free" ], "meta": {}, - "lines": 142 + "lines": 143 }, { "file": "git2/mailmap.h", @@ -606,6 +626,7 @@ "git_odb_stream_free", "git_odb_open_rstream", "git_odb_write_pack", + "git_odb_write_multi_pack_index", "git_odb_hash", "git_odb_hashfile", "git_odb_object_dup", @@ -617,10 +638,11 @@ "git_odb_add_backend", "git_odb_add_alternate", "git_odb_num_backends", - "git_odb_get_backend" + "git_odb_get_backend", + "git_odb_set_commit_graph" ], "meta": {}, - "lines": 545 + "lines": 569 }, { "file": "git2/odb_backend.h", @@ -661,10 +683,10 @@ { "file": "git2/oidarray.h", "functions": [ - "git_oidarray_free" + "git_oidarray_dispose" ], "meta": {}, - "lines": 34 + "lines": 31 }, { "file": "git2/pack.h", @@ -761,7 +783,7 @@ "git_rebase_free" ], "meta": {}, - "lines": 363 + "lines": 387 }, { "file": "git2/refdb.h", @@ -842,7 +864,7 @@ "git_reference_shorthand" ], "meta": {}, - "lines": 764 + "lines": 767 }, { "file": "git2/refspec.h", @@ -879,6 +901,8 @@ "git_remote_pushurl", "git_remote_set_url", "git_remote_set_pushurl", + "git_remote_set_instance_url", + "git_remote_set_instance_pushurl", "git_remote_add_fetch", "git_remote_get_fetch_refspecs", "git_remote_add_push", @@ -896,6 +920,7 @@ "git_push_negotiation", "git_push_update_reference_cb", "git_url_resolve_cb", + "git_remote_ready_cb", "git_remote_init_callbacks", "git_fetch_options_init", "git_push_options_init", @@ -915,7 +940,7 @@ "git_remote_default_branch" ], "meta": {}, - "lines": 952 + "lines": 1004 }, { "file": "git2/repository.h", @@ -968,7 +993,7 @@ "git_repository_set_ident" ], "meta": {}, - "lines": 943 + "lines": 945 }, { "file": "git2/reset.h", @@ -1068,7 +1093,7 @@ "git_status_should_ignore" ], "meta": {}, - "lines": 383 + "lines": 439 }, { "file": "git2/strarray.h", @@ -1086,6 +1111,7 @@ "git_submodule_update_options_init", "git_submodule_update", "git_submodule_lookup", + "git_submodule_dup", "git_submodule_free", "git_submodule_foreach", "git_submodule_add_setup", @@ -1118,7 +1144,13 @@ "git_submodule_location" ], "meta": {}, - "lines": 650 + "lines": 659 + }, + { + "file": "git2/sys/commit_graph.h", + "functions": [], + "meta": {}, + "lines": 98 }, { "file": "git2/sys/filter.h", @@ -1154,7 +1186,7 @@ "file": "git2/sys/transport.h", "functions": [], "meta": {}, - "lines": 292 + "lines": 293 }, { "file": "git2/tag.h", @@ -1257,13 +1289,13 @@ "git_tree_create_updated" ], "meta": {}, - "lines": 467 + "lines": 469 }, { "file": "git2/types.h", "functions": [], "meta": {}, - "lines": 357 + "lines": 366 }, { "file": "git2/worktree.h", @@ -1285,7 +1317,7 @@ "git_worktree_prune" ], "meta": {}, - "lines": 251 + "lines": 252 } ], "functions": { @@ -1322,7 +1354,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_from_ref-1" + "ex/v1.3.0/checkout.html#git_annotated_commit_from_ref-1" ] } }, @@ -1455,12 +1487,12 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_id-2" + "ex/v1.3.0/checkout.html#git_annotated_commit_id-2" ], "merge.c": [ - "ex/HEAD/merge.html#git_annotated_commit_id-1", - "ex/HEAD/merge.html#git_annotated_commit_id-2", - "ex/HEAD/merge.html#git_annotated_commit_id-3" + "ex/v1.3.0/merge.html#git_annotated_commit_id-1", + "ex/v1.3.0/merge.html#git_annotated_commit_id-2", + "ex/v1.3.0/merge.html#git_annotated_commit_id-3" ] } }, @@ -1487,9 +1519,9 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_ref-3", - "ex/HEAD/checkout.html#git_annotated_commit_ref-4", - "ex/HEAD/checkout.html#git_annotated_commit_ref-5" + "ex/v1.3.0/checkout.html#git_annotated_commit_ref-3", + "ex/v1.3.0/checkout.html#git_annotated_commit_ref-4", + "ex/v1.3.0/checkout.html#git_annotated_commit_ref-5" ] } }, @@ -1516,15 +1548,15 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_annotated_commit_free-6" + "ex/v1.3.0/checkout.html#git_annotated_commit_free-6" ] } }, "git_apply_to_tree": { "type": "function", "file": "git2/apply.h", - "line": 104, - "lineto": 109, + "line": 105, + "lineto": 110, "args": [ { "name": "out", @@ -1556,7 +1588,7 @@ "sig": "git_index **::git_repository *::git_tree *::git_diff *::const git_apply_options *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, "description": "

Apply a git_diff to a git_tree, and return the resulting image\n as an index.

\n", "comments": "", @@ -1565,8 +1597,8 @@ "git_apply": { "type": "function", "file": "git2/apply.h", - "line": 141, - "lineto": 145, + "line": 143, + "lineto": 147, "args": [ { "name": "repo", @@ -1593,7 +1625,7 @@ "sig": "git_repository *::git_diff *::git_apply_location_t::const git_apply_options *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, "description": "

Apply a git_diff to the given repository, making changes directly\n in the working directory, the index, or both.

\n", "comments": "", @@ -1624,8 +1656,8 @@ "git_attr_get": { "type": "function", "file": "git2/attr.h", - "line": 152, - "lineto": 157, + "line": 181, + "lineto": 186, "args": [ { "name": "value_out", @@ -1663,11 +1695,53 @@ "comments": "", "group": "attr" }, + "git_attr_get_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 203, + "lineto": 208, + "args": [ + { + "name": "value_out", + "type": "const char **", + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the attribute to look up." + } + ], + "argline": "const char **value_out, git_repository *repo, git_attr_options *opts, const char *path, const char *name", + "sig": "const char **::git_repository *::git_attr_options *::const char *::const char *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Look up the value of one git attribute for path with extended options.

\n", + "comments": "", + "group": "attr" + }, "git_attr_get_many": { "type": "function", "file": "git2/attr.h", - "line": 188, - "lineto": 194, + "line": 239, + "lineto": 245, "args": [ { "name": "values_out", @@ -1710,11 +1784,58 @@ "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", "group": "attr" }, + "git_attr_get_many_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 263, + "lineto": 269, + "args": [ + { + "name": "values_out", + "type": "const char **", + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + }, + { + "name": "num_attr", + "type": "size_t", + "comment": "The number of attributes being looked up" + }, + { + "name": "names", + "type": "const char **", + "comment": "An array of num_attr strings containing attribute names." + } + ], + "argline": "const char **values_out, git_repository *repo, git_attr_options *opts, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::git_attr_options *::const char *::size_t::const char **", + "return": { + "type": "int", + "comment": null + }, + "description": "

Look up a list of git attributes for path with extended options.

\n", + "comments": "", + "group": "attr" + }, "git_attr_foreach": { "type": "function", "file": "git2/attr.h", - "line": 227, - "lineto": 232, + "line": 302, + "lineto": 307, "args": [ { "name": "repo", @@ -1752,11 +1873,53 @@ "comments": "", "group": "attr" }, + "git_attr_foreach_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 322, + "lineto": 327, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + }, + { + "name": "callback", + "type": "git_attr_foreach_cb", + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + }, + { + "name": "payload", + "type": "void *", + "comment": "Passed on as extra parameter to callback function." + } + ], + "argline": "git_repository *repo, git_attr_options *opts, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::git_attr_options *::const char *::git_attr_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the git attributes for a path with extended options.

\n", + "comments": "", + "group": "attr" + }, "git_attr_cache_flush": { "type": "function", "file": "git2/attr.h", - "line": 245, - "lineto": 246, + "line": 340, + "lineto": 341, "args": [ { "name": "repo", @@ -1777,8 +1940,8 @@ "git_attr_add_macro": { "type": "function", "file": "git2/attr.h", - "line": 258, - "lineto": 261, + "line": 353, + "lineto": 356, "args": [ { "name": "repo", @@ -1809,8 +1972,8 @@ "git_blame_options_init": { "type": "function", "file": "git2/blame.h", - "line": 105, - "lineto": 107, + "line": 138, + "lineto": 140, "args": [ { "name": "opts", @@ -1836,8 +1999,8 @@ "git_blame_get_hunk_count": { "type": "function", "file": "git2/blame.h", - "line": 156, - "lineto": 156, + "line": 207, + "lineto": 207, "args": [ { "name": "blame", @@ -1858,8 +2021,8 @@ "git_blame_get_hunk_byindex": { "type": "function", "file": "git2/blame.h", - "line": 165, - "lineto": 167, + "line": 216, + "lineto": 218, "args": [ { "name": "blame", @@ -1885,8 +2048,8 @@ "git_blame_get_hunk_byline": { "type": "function", "file": "git2/blame.h", - "line": 176, - "lineto": 178, + "line": 227, + "lineto": 229, "args": [ { "name": "blame", @@ -1910,15 +2073,15 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_get_hunk_byline-1" + "ex/v1.3.0/blame.html#git_blame_get_hunk_byline-1" ] } }, "git_blame_file": { "type": "function", "file": "git2/blame.h", - "line": 191, - "lineto": 195, + "line": 242, + "lineto": 246, "args": [ { "name": "out", @@ -1952,15 +2115,15 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_file-2" + "ex/v1.3.0/blame.html#git_blame_file-2" ] } }, "git_blame_buffer": { "type": "function", "file": "git2/blame.h", - "line": 215, - "lineto": 219, + "line": 266, + "lineto": 270, "args": [ { "name": "out", @@ -1996,8 +2159,8 @@ "git_blame_free": { "type": "function", "file": "git2/blame.h", - "line": 226, - "lineto": 226, + "line": 277, + "lineto": 277, "args": [ { "name": "blame", @@ -2016,7 +2179,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blame_free-3" + "ex/v1.3.0/blame.html#git_blame_free-3" ] } }, @@ -2053,10 +2216,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_lookup-4" + "ex/v1.3.0/blame.html#git_blob_lookup-4" ], "general.c": [ - "ex/HEAD/general.html#git_blob_lookup-1" + "ex/v1.3.0/general.html#git_blob_lookup-1" ] } }, @@ -2120,10 +2283,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_free-5" + "ex/v1.3.0/blame.html#git_blob_free-5" ], "general.c": [ - "ex/HEAD/general.html#git_blob_free-2" + "ex/v1.3.0/general.html#git_blob_free-2" ] } }, @@ -2194,13 +2357,13 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_rawcontent-6" + "ex/v1.3.0/blame.html#git_blob_rawcontent-6" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_blob_rawcontent-1" + "ex/v1.3.0/cat-file.html#git_blob_rawcontent-1" ], "general.c": [ - "ex/HEAD/general.html#git_blob_rawcontent-3" + "ex/v1.3.0/general.html#git_blob_rawcontent-3" ] } }, @@ -2227,22 +2390,22 @@ "group": "blob", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_blob_rawsize-7" + "ex/v1.3.0/blame.html#git_blob_rawsize-7" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_blob_rawsize-2" + "ex/v1.3.0/cat-file.html#git_blob_rawsize-2" ], "general.c": [ - "ex/HEAD/general.html#git_blob_rawsize-4", - "ex/HEAD/general.html#git_blob_rawsize-5" + "ex/v1.3.0/general.html#git_blob_rawsize-4", + "ex/v1.3.0/general.html#git_blob_rawsize-5" ] } }, "git_blob_filter_options_init": { "type": "function", "file": "git2/blob.h", - "line": 146, - "lineto": 146, + "line": 164, + "lineto": 164, "args": [ { "name": "opts", @@ -2268,8 +2431,8 @@ "git_blob_filter": { "type": "function", "file": "git2/blob.h", - "line": 170, - "lineto": 174, + "line": 188, + "lineto": 192, "args": [ { "name": "out", @@ -2305,8 +2468,8 @@ "git_blob_create_from_workdir": { "type": "function", "file": "git2/blob.h", - "line": 187, - "lineto": 187, + "line": 205, + "lineto": 205, "args": [ { "name": "id", @@ -2337,8 +2500,8 @@ "git_blob_create_from_disk": { "type": "function", "file": "git2/blob.h", - "line": 199, - "lineto": 199, + "line": 217, + "lineto": 217, "args": [ { "name": "id", @@ -2369,8 +2532,8 @@ "git_blob_create_from_stream": { "type": "function", "file": "git2/blob.h", - "line": 226, - "lineto": 229, + "line": 244, + "lineto": 247, "args": [ { "name": "out", @@ -2401,8 +2564,8 @@ "git_blob_create_from_stream_commit": { "type": "function", "file": "git2/blob.h", - "line": 240, - "lineto": 242, + "line": 258, + "lineto": 260, "args": [ { "name": "out", @@ -2428,8 +2591,8 @@ "git_blob_create_from_buffer": { "type": "function", "file": "git2/blob.h", - "line": 253, - "lineto": 254, + "line": 271, + "lineto": 272, "args": [ { "name": "id", @@ -2439,7 +2602,7 @@ { "name": "repo", "type": "git_repository *", - "comment": "repository where to blob will be written" + "comment": "repository where the blob will be written" }, { "name": "buffer", @@ -2465,8 +2628,8 @@ "git_blob_is_binary": { "type": "function", "file": "git2/blob.h", - "line": 267, - "lineto": 267, + "line": 285, + "lineto": 285, "args": [ { "name": "blob", @@ -2487,8 +2650,8 @@ "git_blob_dup": { "type": "function", "file": "git2/blob.h", - "line": 276, - "lineto": 276, + "line": 294, + "lineto": 294, "args": [ { "name": "out", @@ -2596,7 +2759,7 @@ "group": "branch", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_branch_create_from_annotated-7" + "ex/v1.3.0/checkout.html#git_branch_create_from_annotated-7" ] } }, @@ -2810,7 +2973,7 @@ "group": "branch", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_branch_name-4" + "ex/v1.3.0/merge.html#git_branch_name-4" ] } }, @@ -3008,11 +3171,43 @@ "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", "group": "branch" }, + "git_branch_upstream_merge": { + "type": "function", + "file": "git2/branch.h", + "line": 318, + "lineto": 318, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Retrieve the upstream merge of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.merge" for a given branch. This branch must be local.

\n", + "group": "branch" + }, "git_branch_name_is_valid": { "type": "function", "file": "git2/branch.h", - "line": 317, - "lineto": 317, + "line": 330, + "lineto": 330, "args": [ { "name": "valid", @@ -3058,19 +3253,19 @@ "group": "buf", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_buf_dispose-1", - "ex/HEAD/diff.html#git_buf_dispose-2" + "ex/v1.3.0/diff.html#git_buf_dispose-1", + "ex/v1.3.0/diff.html#git_buf_dispose-2" ], "tag.c": [ - "ex/HEAD/tag.html#git_buf_dispose-1" + "ex/v1.3.0/tag.html#git_buf_dispose-1" ] } }, "git_buf_grow": { "type": "function", - "file": "git2/buffer.h", - "line": 101, - "lineto": 101, + "file": "git2/deprecated.h", + "line": 220, + "lineto": 220, "args": [ { "name": "buffer", @@ -3095,9 +3290,9 @@ }, "git_buf_set": { "type": "function", - "file": "git2/buffer.h", - "line": 111, - "lineto": 112, + "file": "git2/deprecated.h", + "line": 230, + "lineto": 231, "args": [ { "name": "buffer", @@ -3127,9 +3322,9 @@ }, "git_buf_is_binary": { "type": "function", - "file": "git2/buffer.h", - "line": 120, - "lineto": 120, + "file": "git2/deprecated.h", + "line": 239, + "lineto": 239, "args": [ { "name": "buf", @@ -3149,9 +3344,9 @@ }, "git_buf_contains_nul": { "type": "function", - "file": "git2/buffer.h", - "line": 128, - "lineto": 128, + "file": "git2/deprecated.h", + "line": 247, + "lineto": 247, "args": [ { "name": "buf", @@ -3172,8 +3367,8 @@ "git_checkout_options_init": { "type": "function", "file": "git2/checkout.h", - "line": 341, - "lineto": 343, + "line": 357, + "lineto": 359, "args": [ { "name": "opts", @@ -3199,8 +3394,8 @@ "git_checkout_head": { "type": "function", "file": "git2/checkout.h", - "line": 362, - "lineto": 364, + "line": 378, + "lineto": 380, "args": [ { "name": "repo", @@ -3226,8 +3421,8 @@ "git_checkout_index": { "type": "function", "file": "git2/checkout.h", - "line": 375, - "lineto": 378, + "line": 391, + "lineto": 394, "args": [ { "name": "repo", @@ -3258,8 +3453,8 @@ "git_checkout_tree": { "type": "function", "file": "git2/checkout.h", - "line": 391, - "lineto": 394, + "line": 407, + "lineto": 410, "args": [ { "name": "repo", @@ -3288,10 +3483,10 @@ "group": "checkout", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_checkout_tree-8" + "ex/v1.3.0/checkout.html#git_checkout_tree-8" ], "merge.c": [ - "ex/HEAD/merge.html#git_checkout_tree-5" + "ex/v1.3.0/merge.html#git_checkout_tree-5" ] } }, @@ -3498,18 +3693,18 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_lookup-9" + "ex/v1.3.0/checkout.html#git_commit_lookup-9" ], "general.c": [ - "ex/HEAD/general.html#git_commit_lookup-6", - "ex/HEAD/general.html#git_commit_lookup-7", - "ex/HEAD/general.html#git_commit_lookup-8" + "ex/v1.3.0/general.html#git_commit_lookup-6", + "ex/v1.3.0/general.html#git_commit_lookup-7", + "ex/v1.3.0/general.html#git_commit_lookup-8" ], "log.c": [ - "ex/HEAD/log.html#git_commit_lookup-1" + "ex/v1.3.0/log.html#git_commit_lookup-1" ], "merge.c": [ - "ex/HEAD/merge.html#git_commit_lookup-6" + "ex/v1.3.0/merge.html#git_commit_lookup-6" ] } }, @@ -3573,20 +3768,20 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_commit_free-10" + "ex/v1.3.0/checkout.html#git_commit_free-10" ], "general.c": [ - "ex/HEAD/general.html#git_commit_free-9", - "ex/HEAD/general.html#git_commit_free-10", - "ex/HEAD/general.html#git_commit_free-11", - "ex/HEAD/general.html#git_commit_free-12", - "ex/HEAD/general.html#git_commit_free-13" + "ex/v1.3.0/general.html#git_commit_free-9", + "ex/v1.3.0/general.html#git_commit_free-10", + "ex/v1.3.0/general.html#git_commit_free-11", + "ex/v1.3.0/general.html#git_commit_free-12", + "ex/v1.3.0/general.html#git_commit_free-13" ], "log.c": [ - "ex/HEAD/log.html#git_commit_free-2", - "ex/HEAD/log.html#git_commit_free-3", - "ex/HEAD/log.html#git_commit_free-4", - "ex/HEAD/log.html#git_commit_free-5" + "ex/v1.3.0/log.html#git_commit_free-2", + "ex/v1.3.0/log.html#git_commit_free-3", + "ex/v1.3.0/log.html#git_commit_free-4", + "ex/v1.3.0/log.html#git_commit_free-5" ] } }, @@ -3613,10 +3808,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_id-14" + "ex/v1.3.0/general.html#git_commit_id-14" ], "log.c": [ - "ex/HEAD/log.html#git_commit_id-6" + "ex/v1.3.0/log.html#git_commit_id-6" ] } }, @@ -3643,8 +3838,8 @@ "group": "commit", "examples": { "log.c": [ - "ex/HEAD/log.html#git_commit_owner-7", - "ex/HEAD/log.html#git_commit_owner-8" + "ex/v1.3.0/log.html#git_commit_owner-7", + "ex/v1.3.0/log.html#git_commit_owner-8" ] } }, @@ -3693,21 +3888,21 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_message-3", - "ex/HEAD/cat-file.html#git_commit_message-4" + "ex/v1.3.0/cat-file.html#git_commit_message-3", + "ex/v1.3.0/cat-file.html#git_commit_message-4" ], "general.c": [ - "ex/HEAD/general.html#git_commit_message-15", - "ex/HEAD/general.html#git_commit_message-16", - "ex/HEAD/general.html#git_commit_message-17" + "ex/v1.3.0/general.html#git_commit_message-15", + "ex/v1.3.0/general.html#git_commit_message-16", + "ex/v1.3.0/general.html#git_commit_message-17" ], "log.c": [ - "ex/HEAD/log.html#git_commit_message-9", - "ex/HEAD/log.html#git_commit_message-10", - "ex/HEAD/log.html#git_commit_message-11" + "ex/v1.3.0/log.html#git_commit_message-9", + "ex/v1.3.0/log.html#git_commit_message-10", + "ex/v1.3.0/log.html#git_commit_message-11" ], "tag.c": [ - "ex/HEAD/tag.html#git_commit_message-2" + "ex/v1.3.0/tag.html#git_commit_message-2" ] } }, @@ -3800,8 +3995,8 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_time-18", - "ex/HEAD/general.html#git_commit_time-19" + "ex/v1.3.0/general.html#git_commit_time-18", + "ex/v1.3.0/general.html#git_commit_time-19" ] } }, @@ -3850,13 +4045,13 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_committer-5" + "ex/v1.3.0/cat-file.html#git_commit_committer-5" ], "general.c": [ - "ex/HEAD/general.html#git_commit_committer-20" + "ex/v1.3.0/general.html#git_commit_committer-20" ], "log.c": [ - "ex/HEAD/log.html#git_commit_committer-12" + "ex/v1.3.0/log.html#git_commit_committer-12" ] } }, @@ -3883,15 +4078,15 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_author-6" + "ex/v1.3.0/cat-file.html#git_commit_author-6" ], "general.c": [ - "ex/HEAD/general.html#git_commit_author-21", - "ex/HEAD/general.html#git_commit_author-22" + "ex/v1.3.0/general.html#git_commit_author-21", + "ex/v1.3.0/general.html#git_commit_author-22" ], "log.c": [ - "ex/HEAD/log.html#git_commit_author-13", - "ex/HEAD/log.html#git_commit_author-14" + "ex/v1.3.0/log.html#git_commit_author-13", + "ex/v1.3.0/log.html#git_commit_author-14" ] } }, @@ -4009,11 +4204,11 @@ "group": "commit", "examples": { "log.c": [ - "ex/HEAD/log.html#git_commit_tree-15", - "ex/HEAD/log.html#git_commit_tree-16", - "ex/HEAD/log.html#git_commit_tree-17", - "ex/HEAD/log.html#git_commit_tree-18", - "ex/HEAD/log.html#git_commit_tree-19" + "ex/v1.3.0/log.html#git_commit_tree-15", + "ex/v1.3.0/log.html#git_commit_tree-16", + "ex/v1.3.0/log.html#git_commit_tree-17", + "ex/v1.3.0/log.html#git_commit_tree-18", + "ex/v1.3.0/log.html#git_commit_tree-19" ] } }, @@ -4040,7 +4235,7 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_tree_id-7" + "ex/v1.3.0/cat-file.html#git_commit_tree_id-7" ] } }, @@ -4067,14 +4262,14 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_parentcount-8" + "ex/v1.3.0/cat-file.html#git_commit_parentcount-8" ], "general.c": [ - "ex/HEAD/general.html#git_commit_parentcount-23" + "ex/v1.3.0/general.html#git_commit_parentcount-23" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parentcount-20", - "ex/HEAD/log.html#git_commit_parentcount-21" + "ex/v1.3.0/log.html#git_commit_parentcount-20", + "ex/v1.3.0/log.html#git_commit_parentcount-21" ] } }, @@ -4111,11 +4306,11 @@ "group": "commit", "examples": { "general.c": [ - "ex/HEAD/general.html#git_commit_parent-24" + "ex/v1.3.0/general.html#git_commit_parent-24" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parent-22", - "ex/HEAD/log.html#git_commit_parent-23" + "ex/v1.3.0/log.html#git_commit_parent-22", + "ex/v1.3.0/log.html#git_commit_parent-23" ] } }, @@ -4147,10 +4342,10 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_commit_parent_id-9" + "ex/v1.3.0/cat-file.html#git_commit_parent_id-9" ], "log.c": [ - "ex/HEAD/log.html#git_commit_parent_id-24" + "ex/v1.3.0/log.html#git_commit_parent_id-24" ] } }, @@ -4328,7 +4523,7 @@ "group": "commit", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_commit_create-7" + "ex/v1.3.0/merge.html#git_commit_create-7" ] } }, @@ -4395,13 +4590,13 @@ "group": "commit", "examples": { "commit.c": [ - "ex/HEAD/commit.html#git_commit_create_v-1" + "ex/v1.3.0/commit.html#git_commit_create_v-1" ], "general.c": [ - "ex/HEAD/general.html#git_commit_create_v-25" + "ex/v1.3.0/general.html#git_commit_create_v-25" ], "init.c": [ - "ex/HEAD/init.html#git_commit_create_v-1" + "ex/v1.3.0/init.html#git_commit_create_v-1" ] } }, @@ -4644,8 +4839,8 @@ "git_libgit2_opts": { "type": "function", "file": "git2/common.h", - "line": 423, - "lineto": 423, + "line": 456, + "lineto": 456, "args": [ { "name": "option", @@ -4660,7 +4855,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n", "group": "libgit2" }, "git_config_entry_free": { @@ -4683,7 +4878,13 @@ }, "description": "

Free a config entry

\n", "comments": "", - "group": "config" + "group": "config", + "examples": { + "config.c": [ + "ex/v1.3.0/config.html#git_config_entry_free-1", + "ex/v1.3.0/config.html#git_config_entry_free-2" + ] + } }, "git_config_find_global": { "type": "function", @@ -4887,7 +5088,7 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_open_ondisk-26" + "ex/v1.3.0/general.html#git_config_open_ondisk-26" ] } }, @@ -4999,9 +5200,12 @@ "comments": "", "group": "config", "examples": { + "config.c": [ + "ex/v1.3.0/config.html#git_config_free-3" + ], "general.c": [ - "ex/HEAD/general.html#git_config_free-27", - "ex/HEAD/general.html#git_config_free-28" + "ex/v1.3.0/general.html#git_config_free-27", + "ex/v1.3.0/general.html#git_config_free-28" ] } }, @@ -5035,7 +5239,12 @@ }, "description": "

Get the git_config_entry of a config variable.

\n", "comments": "

Free the git_config_entry after use with git_config_entry_free().

\n", - "group": "config" + "group": "config", + "examples": { + "config.c": [ + "ex/v1.3.0/config.html#git_config_get_entry-4" + ] + } }, "git_config_get_int32": { "type": "function", @@ -5070,8 +5279,8 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_get_int32-29", - "ex/HEAD/general.html#git_config_get_int32-30" + "ex/v1.3.0/general.html#git_config_get_int32-29", + "ex/v1.3.0/general.html#git_config_get_int32-30" ] } }, @@ -5204,8 +5413,8 @@ "group": "config", "examples": { "general.c": [ - "ex/HEAD/general.html#git_config_get_string-31", - "ex/HEAD/general.html#git_config_get_string-32" + "ex/v1.3.0/general.html#git_config_get_string-31", + "ex/v1.3.0/general.html#git_config_get_string-32" ] } }, @@ -5495,7 +5704,12 @@ }, "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", - "group": "config" + "group": "config", + "examples": { + "config.c": [ + "ex/v1.3.0/config.html#git_config_set_string-5" + ] + } }, "git_config_set_multivar": { "type": "function", @@ -6359,8 +6573,8 @@ "git_blob_filtered_content": { "type": "function", "file": "git2/deprecated.h", - "line": 114, - "lineto": 118, + "line": 115, + "lineto": 119, "args": [ { "name": "out", @@ -6393,11 +6607,75 @@ "comments": "", "group": "blob" }, + "git_filter_list_stream_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 139, + "lineto": 142, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": null + }, + { + "name": "data", + "type": "git_buf *", + "comment": null + }, + { + "name": "target", + "type": "git_writestream *", + "comment": null + } + ], + "argline": "git_filter_list *filters, git_buf *data, git_writestream *target", + "sig": "git_filter_list *::git_buf *::git_writestream *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Deprecated in favor of git_filter_list_stream_buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 149, + "lineto": 152, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": null + }, + { + "name": "in", + "type": "git_buf *", + "comment": null + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_buf *in", + "sig": "git_buf *::git_filter_list *::git_buf *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Deprecated in favor of git_filter_list_apply_to_buffer.

\n", + "comments": "", + "group": "filter" + }, "git_treebuilder_write_with_buffer": { "type": "function", "file": "git2/deprecated.h", - "line": 144, - "lineto": 145, + "line": 178, + "lineto": 179, "args": [ { "name": "oid", @@ -6428,8 +6706,8 @@ "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 170, - "lineto": 170, + "line": 259, + "lineto": 259, "args": [ { "name": "buffer", @@ -6447,11 +6725,122 @@ "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", "group": "buf" }, + "git_diff_format_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 357, + "lineto": 360, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "diff", + "type": "git_diff *", + "comment": null + }, + { + "name": "opts", + "type": "const git_diff_format_email_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_diff *diff, const git_diff_format_email_options *opts", + "sig": "git_buf *::git_diff *::const git_diff_format_email_options *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create an e-mail ready patch from a diff.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_commit_as_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 368, + "lineto": 375, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "repo", + "type": "git_repository *", + "comment": null + }, + { + "name": "commit", + "type": "git_commit *", + "comment": null + }, + { + "name": "patch_no", + "type": "size_t", + "comment": null + }, + { + "name": "total_patches", + "type": "size_t", + "comment": null + }, + { + "name": "flags", + "type": "uint32_t", + "comment": null + }, + { + "name": "diff_opts", + "type": "const git_diff_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", + "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create an e-mail ready patch for a commit.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_format_email_options_init": { + "type": "function", + "file": "git2/deprecated.h", + "line": 387, + "lineto": 389, + "args": [ + { + "name": "opts", + "type": "git_diff_format_email_options *", + "comment": "The `git_blame_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_format_email_options *opts, unsigned int version", + "sig": "git_diff_format_email_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_format_email_options structure

\n", + "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", + "group": "diff" + }, "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 244, - "lineto": 244, + "line": 450, + "lineto": 450, "args": [], "argline": "", "sig": "", @@ -6466,8 +6855,8 @@ "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 256, - "lineto": 256, + "line": 462, + "lineto": 462, "args": [], "argline": "", "sig": "", @@ -6482,8 +6871,8 @@ "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 268, - "lineto": 268, + "line": 474, + "lineto": 474, "args": [ { "name": "error_class", @@ -6509,8 +6898,8 @@ "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 280, - "lineto": 280, + "line": 486, + "lineto": 486, "args": [], "argline": "", "sig": "", @@ -6525,8 +6914,8 @@ "git_object__size": { "type": "function", "file": "git2/deprecated.h", - "line": 370, - "lineto": 370, + "line": 576, + "lineto": 576, "args": [ { "name": "type", @@ -6547,8 +6936,8 @@ "git_remote_is_valid_name": { "type": "function", "file": "git2/deprecated.h", - "line": 391, - "lineto": 391, + "line": 597, + "lineto": 597, "args": [ { "name": "remote_name", @@ -6569,8 +6958,8 @@ "git_reference_is_valid_name": { "type": "function", "file": "git2/deprecated.h", - "line": 435, - "lineto": 435, + "line": 641, + "lineto": 641, "args": [ { "name": "refname", @@ -6591,8 +6980,8 @@ "git_oid_iszero": { "type": "function", "file": "git2/deprecated.h", - "line": 572, - "lineto": 572, + "line": 778, + "lineto": 778, "args": [ { "name": "id", @@ -6610,6 +6999,28 @@ "comments": "

These types are retained for backward compatibility. The newer versions of these values should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility values at this time.

\n\n

@{

\n", "group": "oid" }, + "git_oidarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 802, + "lineto": 802, + "args": [ + { + "name": "array", + "type": "git_oidarray *", + "comment": null + } + ], + "argline": "git_oidarray *array", + "sig": "git_oidarray *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory referred to by the git_oidarray. This is an alias of\n git_oidarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "oidarray" + }, "git_strarray_copy": { "type": "function", "file": "git2/strarray.h", @@ -6640,8 +7051,8 @@ "git_strarray_free": { "type": "function", "file": "git2/deprecated.h", - "line": 653, - "lineto": 653, + "line": 883, + "lineto": 883, "args": [ { "name": "array", @@ -6662,8 +7073,8 @@ "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 667, - "lineto": 667, + "line": 897, + "lineto": 897, "args": [ { "name": "opts", @@ -6714,7 +7125,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_options_init-1" + "ex/v1.3.0/describe.html#git_describe_options_init-1" ] } }, @@ -6746,7 +7157,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_format_options_init-2" + "ex/v1.3.0/describe.html#git_describe_format_options_init-2" ] } }, @@ -6783,7 +7194,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_commit-3" + "ex/v1.3.0/describe.html#git_describe_commit-3" ] } }, @@ -6820,7 +7231,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_workdir-4" + "ex/v1.3.0/describe.html#git_describe_workdir-4" ] } }, @@ -6857,7 +7268,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/HEAD/describe.html#git_describe_format-5" + "ex/v1.3.0/describe.html#git_describe_format-5" ] } }, @@ -6886,8 +7297,8 @@ "git_diff_options_init": { "type": "function", "file": "git2/diff.h", - "line": 454, - "lineto": 456, + "line": 468, + "lineto": 470, "args": [ { "name": "opts", @@ -6913,8 +7324,8 @@ "git_diff_find_options_init": { "type": "function", "file": "git2/diff.h", - "line": 787, - "lineto": 789, + "line": 801, + "lineto": 803, "args": [ { "name": "opts", @@ -6940,8 +7351,8 @@ "git_diff_free": { "type": "function", "file": "git2/diff.h", - "line": 803, - "lineto": 803, + "line": 817, + "lineto": 817, "args": [ { "name": "diff", @@ -6960,19 +7371,19 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_free-3" + "ex/v1.3.0/diff.html#git_diff_free-3" ], "log.c": [ - "ex/HEAD/log.html#git_diff_free-25", - "ex/HEAD/log.html#git_diff_free-26" + "ex/v1.3.0/log.html#git_diff_free-25", + "ex/v1.3.0/log.html#git_diff_free-26" ] } }, "git_diff_tree_to_tree": { "type": "function", "file": "git2/diff.h", - "line": 821, - "lineto": 826, + "line": 835, + "lineto": 840, "args": [ { "name": "diff", @@ -7011,19 +7422,19 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_tree-4" + "ex/v1.3.0/diff.html#git_diff_tree_to_tree-4" ], "log.c": [ - "ex/HEAD/log.html#git_diff_tree_to_tree-27", - "ex/HEAD/log.html#git_diff_tree_to_tree-28" + "ex/v1.3.0/log.html#git_diff_tree_to_tree-27", + "ex/v1.3.0/log.html#git_diff_tree_to_tree-28" ] } }, "git_diff_tree_to_index": { "type": "function", "file": "git2/diff.h", - "line": 847, - "lineto": 852, + "line": 861, + "lineto": 866, "args": [ { "name": "diff", @@ -7062,15 +7473,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_index-5" + "ex/v1.3.0/diff.html#git_diff_tree_to_index-5" ] } }, "git_diff_index_to_workdir": { "type": "function", "file": "git2/diff.h", - "line": 874, - "lineto": 878, + "line": 888, + "lineto": 892, "args": [ { "name": "diff", @@ -7104,15 +7515,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_index_to_workdir-6" + "ex/v1.3.0/diff.html#git_diff_index_to_workdir-6" ] } }, "git_diff_tree_to_workdir": { "type": "function", "file": "git2/diff.h", - "line": 903, - "lineto": 907, + "line": 917, + "lineto": 921, "args": [ { "name": "diff", @@ -7146,15 +7557,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir-7" + "ex/v1.3.0/diff.html#git_diff_tree_to_workdir-7" ] } }, "git_diff_tree_to_workdir_with_index": { "type": "function", "file": "git2/diff.h", - "line": 922, - "lineto": 926, + "line": 936, + "lineto": 940, "args": [ { "name": "diff", @@ -7188,15 +7599,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_tree_to_workdir_with_index-8" + "ex/v1.3.0/diff.html#git_diff_tree_to_workdir_with_index-8" ] } }, "git_diff_index_to_index": { "type": "function", "file": "git2/diff.h", - "line": 940, - "lineto": 945, + "line": 954, + "lineto": 959, "args": [ { "name": "diff", @@ -7237,8 +7648,8 @@ "git_diff_merge": { "type": "function", "file": "git2/diff.h", - "line": 960, - "lineto": 962, + "line": 974, + "lineto": 976, "args": [ { "name": "onto", @@ -7264,8 +7675,8 @@ "git_diff_find_similar": { "type": "function", "file": "git2/diff.h", - "line": 976, - "lineto": 978, + "line": 990, + "lineto": 992, "args": [ { "name": "diff", @@ -7289,15 +7700,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_find_similar-9" + "ex/v1.3.0/diff.html#git_diff_find_similar-9" ] } }, "git_diff_num_deltas": { "type": "function", "file": "git2/diff.h", - "line": 996, - "lineto": 996, + "line": 1010, + "lineto": 1010, "args": [ { "name": "diff", @@ -7316,15 +7727,15 @@ "group": "diff", "examples": { "log.c": [ - "ex/HEAD/log.html#git_diff_num_deltas-29" + "ex/v1.3.0/log.html#git_diff_num_deltas-29" ] } }, "git_diff_num_deltas_of_type": { "type": "function", "file": "git2/diff.h", - "line": 1009, - "lineto": 1010, + "line": 1023, + "lineto": 1024, "args": [ { "name": "diff", @@ -7344,14 +7755,14 @@ "comment": " Count of number of deltas matching delta_t type" }, "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", - "comments": "

This works just like git_diff_entrycount() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", + "comments": "

This works just like git_diff_num_deltas() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", "group": "diff" }, "git_diff_get_delta": { "type": "function", "file": "git2/diff.h", - "line": 1029, - "lineto": 1030, + "line": 1043, + "lineto": 1044, "args": [ { "name": "diff", @@ -7377,8 +7788,8 @@ "git_diff_is_sorted_icase": { "type": "function", "file": "git2/diff.h", - "line": 1038, - "lineto": 1038, + "line": 1052, + "lineto": 1052, "args": [ { "name": "diff", @@ -7399,8 +7810,8 @@ "git_diff_foreach": { "type": "function", "file": "git2/diff.h", - "line": 1066, - "lineto": 1072, + "line": 1080, + "lineto": 1086, "args": [ { "name": "diff", @@ -7446,8 +7857,8 @@ "git_diff_status_char": { "type": "function", "file": "git2/diff.h", - "line": 1085, - "lineto": 1085, + "line": 1099, + "lineto": 1099, "args": [ { "name": "status", @@ -7468,8 +7879,8 @@ "git_diff_print": { "type": "function", "file": "git2/diff.h", - "line": 1111, - "lineto": 1115, + "line": 1125, + "lineto": 1129, "args": [ { "name": "diff", @@ -7503,18 +7914,18 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_print-10" + "ex/v1.3.0/diff.html#git_diff_print-10" ], "log.c": [ - "ex/HEAD/log.html#git_diff_print-30" + "ex/v1.3.0/log.html#git_diff_print-30" ] } }, "git_diff_to_buf": { "type": "function", "file": "git2/diff.h", - "line": 1127, - "lineto": 1130, + "line": 1141, + "lineto": 1144, "args": [ { "name": "out", @@ -7545,8 +7956,8 @@ "git_diff_blobs": { "type": "function", "file": "git2/diff.h", - "line": 1167, - "lineto": 1177, + "line": 1181, + "lineto": 1191, "args": [ { "name": "old_blob", @@ -7612,8 +8023,8 @@ "git_diff_blob_to_buffer": { "type": "function", "file": "git2/diff.h", - "line": 1204, - "lineto": 1215, + "line": 1218, + "lineto": 1229, "args": [ { "name": "old_blob", @@ -7684,8 +8095,8 @@ "git_diff_buffers": { "type": "function", "file": "git2/diff.h", - "line": 1238, - "lineto": 1250, + "line": 1252, + "lineto": 1264, "args": [ { "name": "old_buffer", @@ -7761,8 +8172,8 @@ "git_diff_from_buffer": { "type": "function", "file": "git2/diff.h", - "line": 1271, - "lineto": 1274, + "line": 1285, + "lineto": 1288, "args": [ { "name": "out", @@ -7791,15 +8202,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_from_buffer-11" + "ex/v1.3.0/diff.html#git_diff_from_buffer-11" ] } }, "git_diff_get_stats": { "type": "function", "file": "git2/diff.h", - "line": 1310, - "lineto": 1312, + "line": 1324, + "lineto": 1326, "args": [ { "name": "out", @@ -7823,15 +8234,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_get_stats-12" + "ex/v1.3.0/diff.html#git_diff_get_stats-12" ] } }, "git_diff_stats_files_changed": { "type": "function", "file": "git2/diff.h", - "line": 1320, - "lineto": 1321, + "line": 1334, + "lineto": 1335, "args": [ { "name": "stats", @@ -7852,8 +8263,8 @@ "git_diff_stats_insertions": { "type": "function", "file": "git2/diff.h", - "line": 1329, - "lineto": 1330, + "line": 1343, + "lineto": 1344, "args": [ { "name": "stats", @@ -7874,8 +8285,8 @@ "git_diff_stats_deletions": { "type": "function", "file": "git2/diff.h", - "line": 1338, - "lineto": 1339, + "line": 1352, + "lineto": 1353, "args": [ { "name": "stats", @@ -7896,8 +8307,8 @@ "git_diff_stats_to_buf": { "type": "function", "file": "git2/diff.h", - "line": 1350, - "lineto": 1354, + "line": 1364, + "lineto": 1368, "args": [ { "name": "out", @@ -7931,15 +8342,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_to_buf-13" + "ex/v1.3.0/diff.html#git_diff_stats_to_buf-13" ] } }, "git_diff_stats_free": { "type": "function", "file": "git2/diff.h", - "line": 1362, - "lineto": 1362, + "line": 1376, + "lineto": 1376, "args": [ { "name": "stats", @@ -7958,126 +8369,15 @@ "group": "diff", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_diff_stats_free-14" + "ex/v1.3.0/diff.html#git_diff_stats_free-14" ] } }, - "git_diff_format_email": { - "type": "function", - "file": "git2/diff.h", - "line": 1415, - "lineto": 1418, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer to store the e-mail patch in" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "containing the commit" - }, - { - "name": "opts", - "type": "const git_diff_format_email_options *", - "comment": "structure with options to influence content and formatting." - } - ], - "argline": "git_buf *out, git_diff *diff, const git_diff_format_email_options *opts", - "sig": "git_buf *::git_diff *::const git_diff_format_email_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an e-mail ready patch from a diff.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_commit_as_email": { - "type": "function", - "file": "git2/diff.h", - "line": 1434, - "lineto": 1441, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer to store the e-mail patch in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "containing the commit" - }, - { - "name": "commit", - "type": "git_commit *", - "comment": "pointer to up commit" - }, - { - "name": "patch_no", - "type": "size_t", - "comment": "patch number of the commit" - }, - { - "name": "total_patches", - "type": "size_t", - "comment": "total number of patches in the patch set" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "determines the formatting of the e-mail" - }, - { - "name": "diff_opts", - "type": "const git_diff_options *", - "comment": "structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", - "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an e-mail ready patch for a commit.

\n", - "comments": "

Does not support creating patches for merge commits (yet).

\n", - "group": "diff" - }, - "git_diff_format_email_options_init": { - "type": "function", - "file": "git2/diff.h", - "line": 1453, - "lineto": 1455, - "args": [ - { - "name": "opts", - "type": "git_diff_format_email_options *", - "comment": "The `git_blame_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_format_email_options *opts, unsigned int version", - "sig": "git_diff_format_email_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_format_email_options structure

\n", - "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", - "group": "diff" - }, "git_diff_patchid_options_init": { "type": "function", "file": "git2/diff.h", - "line": 1481, - "lineto": 1483, + "line": 1402, + "lineto": 1404, "args": [ { "name": "opts", @@ -8103,8 +8403,8 @@ "git_diff_patchid": { "type": "function", "file": "git2/diff.h", - "line": 1504, - "lineto": 1504, + "line": 1425, + "lineto": 1425, "args": [ { "name": "out", @@ -8149,20 +8449,25 @@ "group": "error", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_error_last-11", - "ex/HEAD/checkout.html#git_error_last-12", - "ex/HEAD/checkout.html#git_error_last-13", - "ex/HEAD/checkout.html#git_error_last-14" + "ex/v1.3.0/checkout.html#git_error_last-11", + "ex/v1.3.0/checkout.html#git_error_last-12", + "ex/v1.3.0/checkout.html#git_error_last-13", + "ex/v1.3.0/checkout.html#git_error_last-14" ], "commit.c": [ - "ex/HEAD/commit.html#git_error_last-2" + "ex/v1.3.0/commit.html#git_error_last-2" + ], + "config.c": [ + "ex/v1.3.0/config.html#git_error_last-6", + "ex/v1.3.0/config.html#git_error_last-7", + "ex/v1.3.0/config.html#git_error_last-8" ], "general.c": [ - "ex/HEAD/general.html#git_error_last-33" + "ex/v1.3.0/general.html#git_error_last-33" ], "merge.c": [ - "ex/HEAD/merge.html#git_error_last-8", - "ex/HEAD/merge.html#git_error_last-9" + "ex/v1.3.0/merge.html#git_error_last-8", + "ex/v1.3.0/merge.html#git_error_last-9" ] } }, @@ -8228,8 +8533,8 @@ "git_filter_list_load": { "type": "function", "file": "git2/filter.h", - "line": 98, - "lineto": 104, + "line": 129, + "lineto": 135, "args": [ { "name": "filters", @@ -8272,11 +8577,58 @@ "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", "group": "filter" }, + "git_filter_list_load_ext": { + "type": "function", + "file": "git2/filter.h", + "line": 152, + "lineto": 158, + "args": [ + { + "name": "filters", + "type": "git_filter_list **", + "comment": "Output newly created git_filter_list (or NULL)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object that contains `path`" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "The blob to which the filter will be applied (if known)" + }, + { + "name": "path", + "type": "const char *", + "comment": "Relative path of the file to be filtered" + }, + { + "name": "mode", + "type": "git_filter_mode_t", + "comment": "Filtering direction (WT->ODB or ODB->WT)" + }, + { + "name": "opts", + "type": "git_filter_options *", + "comment": "The `git_filter_options` to use when loading filters" + } + ], + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, git_filter_options *opts", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::git_filter_options *", + "return": { + "type": "int", + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + }, + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "group": "filter" + }, "git_filter_list_contains": { "type": "function", "file": "git2/filter.h", - "line": 118, - "lineto": 120, + "line": 172, + "lineto": 174, "args": [ { "name": "filters", @@ -8299,11 +8651,11 @@ "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", "group": "filter" }, - "git_filter_list_apply_to_data": { + "git_filter_list_apply_to_buffer": { "type": "function", "file": "git2/filter.h", - "line": 142, - "lineto": 145, + "line": 185, + "lineto": 189, "args": [ { "name": "out", @@ -8317,25 +8669,30 @@ }, { "name": "in", - "type": "git_buf *", + "type": "const char *", "comment": "Buffer containing the data to filter" + }, + { + "name": "in_len", + "type": "size_t", + "comment": "The length of the input buffer" } ], - "argline": "git_buf *out, git_filter_list *filters, git_buf *in", - "sig": "git_buf *::git_filter_list *::git_buf *", + "argline": "git_buf *out, git_filter_list *filters, const char *in, size_t in_len", + "sig": "git_buf *::git_filter_list *::const char *::size_t", "return": { "type": "int", "comment": " 0 on success, an error code otherwise" }, "description": "

Apply filter list to a data buffer.

\n", - "comments": "

See git2/buffer.h for background on git_buf objects.

\n\n

If the in buffer holds data allocated by libgit2 (i.e. in->asize is not zero), then it will be overwritten when applying the filters. If not, then it will be left untouched.

\n\n

If there are no filters to apply (or filters is NULL), then the out buffer will reference the in buffer data (with asize set to zero) instead of allocating data. This keeps allocations to a minimum, but it means you have to be careful about freeing the in data since out may be pointing to it!

\n", + "comments": "", "group": "filter" }, "git_filter_list_apply_to_file": { "type": "function", "file": "git2/filter.h", - "line": 156, - "lineto": 160, + "line": 200, + "lineto": 204, "args": [ { "name": "out", @@ -8371,8 +8728,8 @@ "git_filter_list_apply_to_blob": { "type": "function", "file": "git2/filter.h", - "line": 169, - "lineto": 172, + "line": 213, + "lineto": 216, "args": [ { "name": "out", @@ -8400,11 +8757,11 @@ "comments": "", "group": "filter" }, - "git_filter_list_stream_data": { + "git_filter_list_stream_buffer": { "type": "function", "file": "git2/filter.h", - "line": 181, - "lineto": 184, + "line": 226, + "lineto": 230, "args": [ { "name": "filters", @@ -8412,18 +8769,23 @@ "comment": "the list of filters to apply" }, { - "name": "data", - "type": "git_buf *", + "name": "buffer", + "type": "const char *", "comment": "the buffer to filter" }, + { + "name": "len", + "type": "size_t", + "comment": "the size of the buffer" + }, { "name": "target", "type": "git_writestream *", "comment": "the stream into which the data will be written" } ], - "argline": "git_filter_list *filters, git_buf *data, git_writestream *target", - "sig": "git_filter_list *::git_buf *::git_writestream *", + "argline": "git_filter_list *filters, const char *buffer, size_t len, git_writestream *target", + "sig": "git_filter_list *::const char *::size_t::git_writestream *", "return": { "type": "int", "comment": null @@ -8435,8 +8797,8 @@ "git_filter_list_stream_file": { "type": "function", "file": "git2/filter.h", - "line": 195, - "lineto": 199, + "line": 241, + "lineto": 245, "args": [ { "name": "filters", @@ -8472,8 +8834,8 @@ "git_filter_list_stream_blob": { "type": "function", "file": "git2/filter.h", - "line": 208, - "lineto": 211, + "line": 254, + "lineto": 257, "args": [ { "name": "filters", @@ -8504,8 +8866,8 @@ "git_filter_list_free": { "type": "function", "file": "git2/filter.h", - "line": 218, - "lineto": 218, + "line": 264, + "lineto": 264, "args": [ { "name": "filters", @@ -8540,7 +8902,7 @@ "group": "libgit2", "examples": { "general.c": [ - "ex/HEAD/general.html#git_libgit2_init-34" + "ex/v1.3.0/general.html#git_libgit2_init-34" ] } }, @@ -8605,23 +8967,23 @@ "git_graph_descendant_of": { "type": "function", "file": "git2/graph.h", - "line": 51, - "lineto": 54, + "line": 52, + "lineto": 55, "args": [ { "name": "repo", "type": "git_repository *", - "comment": null + "comment": "the repository where the commits exist" }, { "name": "commit", "type": "const git_oid *", - "comment": "a previously loaded commit." + "comment": "a previously loaded commit" }, { "name": "ancestor", "type": "const git_oid *", - "comment": "a potential ancestor commit." + "comment": "a potential ancestor commit" } ], "argline": "git_repository *repo, const git_oid *commit, const git_oid *ancestor", @@ -8634,6 +8996,43 @@ "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", "group": "graph" }, + "git_graph_reachable_from_any": { + "type": "function", + "file": "git2/graph.h", + "line": 68, + "lineto": 72, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "commit", + "type": "const git_oid *", + "comment": "a previously loaded commit" + }, + { + "name": "descendant_array", + "type": "const git_oid []", + "comment": "oids of the commits" + }, + { + "name": "length", + "type": "size_t", + "comment": "the number of commits in the provided `descendant_array`" + } + ], + "argline": "git_repository *repo, const git_oid *commit, const git_oid [] descendant_array, size_t length", + "sig": "git_repository *::const git_oid *::const git_oid []::size_t", + "return": { + "type": "int", + "comment": " 1 if the given commit is an ancestor of any of the given potential\n descendants, 0 if not, error code otherwise." + }, + "description": "

Determine if a commit is reachable from any of a list of commits by\n following parent edges.

\n", + "comments": "", + "group": "graph" + }, "git_ignore_add_rule": { "type": "function", "file": "git2/ignore.h", @@ -8787,19 +9186,19 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_free-1" + "ex/v1.3.0/add.html#git_index_free-1" ], "commit.c": [ - "ex/HEAD/commit.html#git_index_free-3" + "ex/v1.3.0/commit.html#git_index_free-3" ], "general.c": [ - "ex/HEAD/general.html#git_index_free-35" + "ex/v1.3.0/general.html#git_index_free-35" ], "init.c": [ - "ex/HEAD/init.html#git_index_free-2" + "ex/v1.3.0/init.html#git_index_free-2" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_free-1" + "ex/v1.3.0/ls-files.html#git_index_free-1" ] } }, @@ -8973,10 +9372,10 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_write-2" + "ex/v1.3.0/add.html#git_index_write-2" ], "commit.c": [ - "ex/HEAD/commit.html#git_index_write-4" + "ex/v1.3.0/commit.html#git_index_write-4" ] } }, @@ -9079,13 +9478,13 @@ "group": "index", "examples": { "commit.c": [ - "ex/HEAD/commit.html#git_index_write_tree-5" + "ex/v1.3.0/commit.html#git_index_write_tree-5" ], "init.c": [ - "ex/HEAD/init.html#git_index_write_tree-3" + "ex/v1.3.0/init.html#git_index_write_tree-3" ], "merge.c": [ - "ex/HEAD/merge.html#git_index_write_tree-10" + "ex/v1.3.0/merge.html#git_index_write_tree-10" ] } }, @@ -9144,10 +9543,10 @@ "group": "index", "examples": { "general.c": [ - "ex/HEAD/general.html#git_index_entrycount-36" + "ex/v1.3.0/general.html#git_index_entrycount-36" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_entrycount-2" + "ex/v1.3.0/ls-files.html#git_index_entrycount-2" ] } }, @@ -9201,10 +9600,10 @@ "group": "index", "examples": { "general.c": [ - "ex/HEAD/general.html#git_index_get_byindex-37" + "ex/v1.3.0/general.html#git_index_get_byindex-37" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_get_byindex-3" + "ex/v1.3.0/ls-files.html#git_index_get_byindex-3" ] } }, @@ -9241,7 +9640,7 @@ "group": "index", "examples": { "ls-files.c": [ - "ex/HEAD/ls-files.html#git_index_get_bypath-4" + "ex/v1.3.0/ls-files.html#git_index_get_bypath-4" ] } }, @@ -9590,7 +9989,7 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_add_all-3" + "ex/v1.3.0/add.html#git_index_add_all-3" ] } }, @@ -9669,7 +10068,7 @@ "group": "index", "examples": { "add.c": [ - "ex/HEAD/add.html#git_index_update_all-4" + "ex/v1.3.0/add.html#git_index_update_all-4" ] } }, @@ -9699,7 +10098,7 @@ "sig": "size_t *::git_index *::const char *", "return": { "type": "int", - "comment": " a zero-based position in the index if found; GIT_ENOTFOUND otherwise" + "comment": " 0 or an error code" }, "description": "

Find the first position of any entries which point to given\n path in the Git index.

\n", "comments": "", @@ -9731,7 +10130,7 @@ "sig": "size_t *::git_index *::const char *", "return": { "type": "int", - "comment": " 0 with valid value in at_pos; an error code otherwise" + "comment": " 0 or an error code" }, "description": "

Find the first position of any entries matching a prefix. To find the first position\n of a path inside a given folder, suffix the prefix with a '/'.

\n", "comments": "", @@ -9888,7 +10287,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_has_conflicts-11" + "ex/v1.3.0/merge.html#git_index_has_conflicts-11" ] } }, @@ -9920,7 +10319,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_new-12" + "ex/v1.3.0/merge.html#git_index_conflict_iterator_new-12" ] } }, @@ -9962,7 +10361,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_next-13" + "ex/v1.3.0/merge.html#git_index_conflict_next-13" ] } }, @@ -9989,15 +10388,15 @@ "group": "index", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_index_conflict_iterator_free-14" + "ex/v1.3.0/merge.html#git_index_conflict_iterator_free-14" ] } }, "git_indexer_options_init": { "type": "function", "file": "git2/indexer.h", - "line": 85, - "lineto": 87, + "line": 86, + "lineto": 88, "args": [ { "name": "opts", @@ -10023,8 +10422,8 @@ "git_indexer_new": { "type": "function", "file": "git2/indexer.h", - "line": 101, - "lineto": 106, + "line": 102, + "lineto": 107, "args": [ { "name": "out", @@ -10065,8 +10464,8 @@ "git_indexer_append": { "type": "function", "file": "git2/indexer.h", - "line": 116, - "lineto": 116, + "line": 117, + "lineto": 117, "args": [ { "name": "idx", @@ -10102,8 +10501,8 @@ "git_indexer_commit": { "type": "function", "file": "git2/indexer.h", - "line": 125, - "lineto": 125, + "line": 126, + "lineto": 126, "args": [ { "name": "idx", @@ -10129,8 +10528,8 @@ "git_indexer_hash": { "type": "function", "file": "git2/indexer.h", - "line": 135, - "lineto": 135, + "line": 136, + "lineto": 136, "args": [ { "name": "idx", @@ -10151,8 +10550,8 @@ "git_indexer_free": { "type": "function", "file": "git2/indexer.h", - "line": 142, - "lineto": 142, + "line": 143, + "lineto": 143, "args": [ { "name": "idx", @@ -10513,7 +10912,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge_analysis-15" + "ex/v1.3.0/merge.html#git_merge_analysis-15" ] } }, @@ -10602,10 +11001,10 @@ "group": "merge", "examples": { "log.c": [ - "ex/HEAD/log.html#git_merge_base-31" + "ex/v1.3.0/log.html#git_merge_base-31" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_merge_base-1" + "ex/v1.3.0/rev-parse.html#git_merge_base-1" ] } }, @@ -11000,7 +11399,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_merge-16" + "ex/v1.3.0/merge.html#git_merge-16" ] } }, @@ -11697,10 +12096,10 @@ "group": "object", "examples": { "log.c": [ - "ex/HEAD/log.html#git_object_lookup-32" + "ex/v1.3.0/log.html#git_object_lookup-32" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_lookup-17" + "ex/v1.3.0/merge.html#git_object_lookup-17" ] } }, @@ -11806,27 +12205,27 @@ "group": "object", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_object_id-8", - "ex/HEAD/blame.html#git_object_id-9", - "ex/HEAD/blame.html#git_object_id-10", - "ex/HEAD/blame.html#git_object_id-11" + "ex/v1.3.0/blame.html#git_object_id-8", + "ex/v1.3.0/blame.html#git_object_id-9", + "ex/v1.3.0/blame.html#git_object_id-10", + "ex/v1.3.0/blame.html#git_object_id-11" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_id-10", - "ex/HEAD/cat-file.html#git_object_id-11" + "ex/v1.3.0/cat-file.html#git_object_id-10", + "ex/v1.3.0/cat-file.html#git_object_id-11" ], "log.c": [ - "ex/HEAD/log.html#git_object_id-33", - "ex/HEAD/log.html#git_object_id-34", - "ex/HEAD/log.html#git_object_id-35", - "ex/HEAD/log.html#git_object_id-36" + "ex/v1.3.0/log.html#git_object_id-33", + "ex/v1.3.0/log.html#git_object_id-34", + "ex/v1.3.0/log.html#git_object_id-35", + "ex/v1.3.0/log.html#git_object_id-36" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_object_id-2", - "ex/HEAD/rev-parse.html#git_object_id-3", - "ex/HEAD/rev-parse.html#git_object_id-4", - "ex/HEAD/rev-parse.html#git_object_id-5", - "ex/HEAD/rev-parse.html#git_object_id-6" + "ex/v1.3.0/rev-parse.html#git_object_id-2", + "ex/v1.3.0/rev-parse.html#git_object_id-3", + "ex/v1.3.0/rev-parse.html#git_object_id-4", + "ex/v1.3.0/rev-parse.html#git_object_id-5", + "ex/v1.3.0/rev-parse.html#git_object_id-6" ] } }, @@ -11858,7 +12257,7 @@ "group": "object", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_object_short_id-3" + "ex/v1.3.0/tag.html#git_object_short_id-3" ] } }, @@ -11885,12 +12284,12 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_type-12", - "ex/HEAD/cat-file.html#git_object_type-13", - "ex/HEAD/cat-file.html#git_object_type-14" + "ex/v1.3.0/cat-file.html#git_object_type-12", + "ex/v1.3.0/cat-file.html#git_object_type-13", + "ex/v1.3.0/cat-file.html#git_object_type-14" ], "tag.c": [ - "ex/HEAD/tag.html#git_object_type-4" + "ex/v1.3.0/tag.html#git_object_type-4" ] } }, @@ -11939,33 +12338,33 @@ "group": "object", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_object_free-12", - "ex/HEAD/blame.html#git_object_free-13", - "ex/HEAD/blame.html#git_object_free-14", - "ex/HEAD/blame.html#git_object_free-15" + "ex/v1.3.0/blame.html#git_object_free-12", + "ex/v1.3.0/blame.html#git_object_free-13", + "ex/v1.3.0/blame.html#git_object_free-14", + "ex/v1.3.0/blame.html#git_object_free-15" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_free-15" + "ex/v1.3.0/cat-file.html#git_object_free-15" ], "general.c": [ - "ex/HEAD/general.html#git_object_free-38" + "ex/v1.3.0/general.html#git_object_free-38" ], "log.c": [ - "ex/HEAD/log.html#git_object_free-37" + "ex/v1.3.0/log.html#git_object_free-37" ], "merge.c": [ - "ex/HEAD/merge.html#git_object_free-18" + "ex/v1.3.0/merge.html#git_object_free-18" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_object_free-7", - "ex/HEAD/rev-parse.html#git_object_free-8", - "ex/HEAD/rev-parse.html#git_object_free-9" + "ex/v1.3.0/rev-parse.html#git_object_free-7", + "ex/v1.3.0/rev-parse.html#git_object_free-8", + "ex/v1.3.0/rev-parse.html#git_object_free-9" ], "tag.c": [ - "ex/HEAD/tag.html#git_object_free-5", - "ex/HEAD/tag.html#git_object_free-6", - "ex/HEAD/tag.html#git_object_free-7", - "ex/HEAD/tag.html#git_object_free-8" + "ex/v1.3.0/tag.html#git_object_free-5", + "ex/v1.3.0/tag.html#git_object_free-6", + "ex/v1.3.0/tag.html#git_object_free-7", + "ex/v1.3.0/tag.html#git_object_free-8" ] } }, @@ -11992,14 +12391,14 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_object_type2string-16", - "ex/HEAD/cat-file.html#git_object_type2string-17", - "ex/HEAD/cat-file.html#git_object_type2string-18", - "ex/HEAD/cat-file.html#git_object_type2string-19" + "ex/v1.3.0/cat-file.html#git_object_type2string-16", + "ex/v1.3.0/cat-file.html#git_object_type2string-17", + "ex/v1.3.0/cat-file.html#git_object_type2string-18", + "ex/v1.3.0/cat-file.html#git_object_type2string-19" ], "general.c": [ - "ex/HEAD/general.html#git_object_type2string-39", - "ex/HEAD/general.html#git_object_type2string-40" + "ex/v1.3.0/general.html#git_object_type2string-39", + "ex/v1.3.0/general.html#git_object_type2string-40" ] } }, @@ -12176,7 +12575,7 @@ "sig": "git_odb *::const char *", "return": { "type": "int", - "comment": " 0 on success; error code otherwise" + "comment": " 0 on success, error code otherwise" }, "description": "

Add an on-disk alternate to an existing Object DB.

\n", "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", @@ -12205,18 +12604,18 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_free-20" + "ex/v1.3.0/cat-file.html#git_odb_free-20" ], "general.c": [ - "ex/HEAD/general.html#git_odb_free-41" + "ex/v1.3.0/general.html#git_odb_free-41" ] } }, "git_odb_read": { "type": "function", "file": "git2/odb.h", - "line": 101, - "lineto": 101, + "line": 100, + "lineto": 100, "args": [ { "name": "out", @@ -12238,25 +12637,25 @@ "sig": "git_odb_object **::git_odb *::const git_oid *", "return": { "type": "int", - "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database." + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is\n not in the database." }, "description": "

Read an object from the database.

\n", "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_read-21" + "ex/v1.3.0/cat-file.html#git_odb_read-21" ], "general.c": [ - "ex/HEAD/general.html#git_odb_read-42" + "ex/v1.3.0/general.html#git_odb_read-42" ] } }, "git_odb_read_prefix": { "type": "function", "file": "git2/odb.h", - "line": 130, - "lineto": 130, + "line": 128, + "lineto": 128, "args": [ { "name": "out", @@ -12283,7 +12682,7 @@ "sig": "git_odb_object **::git_odb *::const git_oid *::size_t", "return": { "type": "int", - "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database.\n - GIT_EAMBIGUOUS if the prefix is ambiguous (several objects match the prefix)" + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not in the\n database. GIT_EAMBIGUOUS if the prefix is ambiguous\n (several objects match the prefix)" }, "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", "comments": "

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.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", @@ -12292,8 +12691,8 @@ "git_odb_read_header": { "type": "function", "file": "git2/odb.h", - "line": 150, - "lineto": 150, + "line": 147, + "lineto": 147, "args": [ { "name": "len_out", @@ -12320,7 +12719,7 @@ "sig": "size_t *::git_object_t *::git_odb *::const git_oid *", "return": { "type": "int", - "comment": " - 0 if the object was read;\n - GIT_ENOTFOUND if the object is not in the database." + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not\n in the database." }, "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", "comments": "

The header includes the length and the type of an object.

\n\n

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.

\n", @@ -12329,8 +12728,8 @@ "git_odb_exists": { "type": "function", "file": "git2/odb.h", - "line": 161, - "lineto": 161, + "line": 156, + "lineto": 156, "args": [ { "name": "db", @@ -12347,7 +12746,7 @@ "sig": "git_odb *::const git_oid *", "return": { "type": "int", - "comment": " - 1, if the object was found\n - 0, otherwise" + "comment": " 1 if the object was found, 0 otherwise" }, "description": "

Determine if the given object can be found in the object database.

\n", "comments": "", @@ -12356,8 +12755,8 @@ "git_odb_exists_prefix": { "type": "function", "file": "git2/odb.h", - "line": 174, - "lineto": 175, + "line": 169, + "lineto": 170, "args": [ { "name": "out", @@ -12393,8 +12792,8 @@ "git_odb_expand_ids": { "type": "function", "file": "git2/odb.h", - "line": 216, - "lineto": 219, + "line": 211, + "lineto": 214, "args": [ { "name": "db", @@ -12425,8 +12824,8 @@ "git_odb_refresh": { "type": "function", "file": "git2/odb.h", - "line": 239, - "lineto": 239, + "line": 234, + "lineto": 234, "args": [ { "name": "db", @@ -12447,8 +12846,8 @@ "git_odb_foreach": { "type": "function", "file": "git2/odb.h", - "line": 254, - "lineto": 254, + "line": 249, + "lineto": 249, "args": [ { "name": "db", @@ -12479,8 +12878,8 @@ "git_odb_write": { "type": "function", "file": "git2/odb.h", - "line": 274, - "lineto": 274, + "line": 269, + "lineto": 269, "args": [ { "name": "out", @@ -12519,15 +12918,15 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_write-43" + "ex/v1.3.0/general.html#git_odb_write-43" ] } }, "git_odb_open_wstream": { "type": "function", "file": "git2/odb.h", - "line": 297, - "lineto": 297, + "line": 292, + "lineto": 292, "args": [ { "name": "out", @@ -12563,8 +12962,8 @@ "git_odb_stream_write": { "type": "function", "file": "git2/odb.h", - "line": 310, - "lineto": 310, + "line": 305, + "lineto": 305, "args": [ { "name": "stream", @@ -12586,7 +12985,7 @@ "sig": "git_odb_stream *::const char *::size_t", "return": { "type": "int", - "comment": " 0 if the write succeeded; error code otherwise" + "comment": " 0 if the write succeeded, error code otherwise" }, "description": "

Write to an odb stream

\n", "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", @@ -12595,8 +12994,8 @@ "git_odb_stream_finalize_write": { "type": "function", "file": "git2/odb.h", - "line": 325, - "lineto": 325, + "line": 320, + "lineto": 320, "args": [ { "name": "out", @@ -12613,7 +13012,7 @@ "sig": "git_oid *::git_odb_stream *", "return": { "type": "int", - "comment": " 0 on success; an error code otherwise" + "comment": " 0 on success, an error code otherwise" }, "description": "

Finish writing to an odb stream

\n", "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", @@ -12622,8 +13021,8 @@ "git_odb_stream_read": { "type": "function", "file": "git2/odb.h", - "line": 332, - "lineto": 332, + "line": 327, + "lineto": 327, "args": [ { "name": "stream", @@ -12654,8 +13053,8 @@ "git_odb_stream_free": { "type": "function", "file": "git2/odb.h", - "line": 339, - "lineto": 339, + "line": 334, + "lineto": 334, "args": [ { "name": "stream", @@ -12676,8 +13075,8 @@ "git_odb_open_rstream": { "type": "function", "file": "git2/odb.h", - "line": 367, - "lineto": 372, + "line": 362, + "lineto": 367, "args": [ { "name": "out", @@ -12709,7 +13108,7 @@ "sig": "git_odb_stream **::size_t *::git_object_t *::git_odb *::const git_oid *", "return": { "type": "int", - "comment": " 0 if the stream was created; error code otherwise" + "comment": " 0 if the stream was created, error code otherwise" }, "description": "

Open a stream to read an object from the ODB

\n", "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", @@ -12718,8 +13117,8 @@ "git_odb_write_pack": { "type": "function", "file": "git2/odb.h", - "line": 392, - "lineto": 396, + "line": 387, + "lineto": 391, "args": [ { "name": "out", @@ -12752,11 +13151,33 @@ "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", "group": "odb" }, + "git_odb_write_multi_pack_index": { + "type": "function", + "file": "git2/odb.h", + "line": 404, + "lineto": 405, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the `multi-pack-index` file will be written." + } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Write a multi-pack-index file from all the .pack files in the ODB.

\n", + "comments": "

If the ODB layer understands pack files, then this will create a file called multi-pack-index next to the .pack and .idx files, which will contain an index of all objects stored in .pack files. This will allow for O(log n) lookup for n objects (regardless of how many packfiles there exist).

\n", + "group": "odb" + }, "git_odb_hash": { "type": "function", "file": "git2/odb.h", - "line": 410, - "lineto": 410, + "line": 419, + "lineto": 419, "args": [ { "name": "out", @@ -12792,8 +13213,8 @@ "git_odb_hashfile": { "type": "function", "file": "git2/odb.h", - "line": 425, - "lineto": 425, + "line": 434, + "lineto": 434, "args": [ { "name": "out", @@ -12824,8 +13245,8 @@ "git_odb_object_dup": { "type": "function", "file": "git2/odb.h", - "line": 439, - "lineto": 439, + "line": 448, + "lineto": 448, "args": [ { "name": "dest", @@ -12851,8 +13272,8 @@ "git_odb_object_free": { "type": "function", "file": "git2/odb.h", - "line": 449, - "lineto": 449, + "line": 458, + "lineto": 458, "args": [ { "name": "object", @@ -12871,18 +13292,18 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_object_free-22" + "ex/v1.3.0/cat-file.html#git_odb_object_free-22" ], "general.c": [ - "ex/HEAD/general.html#git_odb_object_free-44" + "ex/v1.3.0/general.html#git_odb_object_free-44" ] } }, "git_odb_object_id": { "type": "function", "file": "git2/odb.h", - "line": 459, - "lineto": 459, + "line": 468, + "lineto": 468, "args": [ { "name": "object", @@ -12903,8 +13324,8 @@ "git_odb_object_data": { "type": "function", "file": "git2/odb.h", - "line": 472, - "lineto": 472, + "line": 481, + "lineto": 481, "args": [ { "name": "object", @@ -12923,15 +13344,15 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_object_data-45" + "ex/v1.3.0/general.html#git_odb_object_data-45" ] } }, "git_odb_object_size": { "type": "function", "file": "git2/odb.h", - "line": 483, - "lineto": 483, + "line": 492, + "lineto": 492, "args": [ { "name": "object", @@ -12950,18 +13371,18 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_odb_object_size-23" + "ex/v1.3.0/cat-file.html#git_odb_object_size-23" ], "general.c": [ - "ex/HEAD/general.html#git_odb_object_size-46" + "ex/v1.3.0/general.html#git_odb_object_size-46" ] } }, "git_odb_object_type": { "type": "function", "file": "git2/odb.h", - "line": 491, - "lineto": 491, + "line": 500, + "lineto": 500, "args": [ { "name": "object", @@ -12980,15 +13401,15 @@ "group": "odb", "examples": { "general.c": [ - "ex/HEAD/general.html#git_odb_object_type-47" + "ex/v1.3.0/general.html#git_odb_object_type-47" ] } }, "git_odb_add_backend": { "type": "function", "file": "git2/odb.h", - "line": 506, - "lineto": 506, + "line": 515, + "lineto": 515, "args": [ { "name": "odb", @@ -13010,7 +13431,7 @@ "sig": "git_odb *::git_odb_backend *::int", "return": { "type": "int", - "comment": " 0 on success; error code otherwise" + "comment": " 0 on success, error code otherwise" }, "description": "

Add a custom backend to an existing Object DB

\n", "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", @@ -13019,8 +13440,8 @@ "git_odb_add_alternate": { "type": "function", "file": "git2/odb.h", - "line": 527, - "lineto": 527, + "line": 536, + "lineto": 536, "args": [ { "name": "odb", @@ -13042,7 +13463,7 @@ "sig": "git_odb *::git_odb_backend *::int", "return": { "type": "int", - "comment": " 0 on success; error code otherwise" + "comment": " 0 on success, error code otherwise" }, "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", @@ -13051,8 +13472,8 @@ "git_odb_num_backends": { "type": "function", "file": "git2/odb.h", - "line": 535, - "lineto": 535, + "line": 544, + "lineto": 544, "args": [ { "name": "odb", @@ -13073,8 +13494,8 @@ "git_odb_get_backend": { "type": "function", "file": "git2/odb.h", - "line": 545, - "lineto": 545, + "line": 554, + "lineto": 554, "args": [ { "name": "out", @@ -13096,12 +13517,39 @@ "sig": "git_odb_backend **::git_odb *::size_t", "return": { "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if pos is invalid; other errors \n<\n 0" + "comment": " 0 on success, GIT_ENOTFOUND if pos is invalid, other errors \n<\n 0" }, "description": "

Lookup an ODB backend object by index

\n", "comments": "", "group": "odb" }, + "git_odb_set_commit_graph": { + "type": "function", + "file": "git2/odb.h", + "line": 569, + "lineto": 569, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "object database" + }, + { + "name": "cgraph", + "type": "git_commit_graph *", + "comment": "the git commit-graph" + } + ], + "argline": "git_odb *odb, git_commit_graph *cgraph", + "sig": "git_odb *::git_commit_graph *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Set the git commit-graph for the ODB.

\n", + "comments": "

After a successfull call, the ownership of the cgraph parameter will be transferred to libgit2, and the caller should not free it.

\n\n

The commit-graph can also be unset by explicitly passing NULL as the cgraph parameter.

\n", + "group": "odb" + }, "git_odb_backend_pack": { "type": "function", "file": "git2/odb_backend.h", @@ -13231,14 +13679,14 @@ "group": "oid", "examples": { "general.c": [ - "ex/HEAD/general.html#git_oid_fromstr-48", - "ex/HEAD/general.html#git_oid_fromstr-49", - "ex/HEAD/general.html#git_oid_fromstr-50", - "ex/HEAD/general.html#git_oid_fromstr-51", - "ex/HEAD/general.html#git_oid_fromstr-52", - "ex/HEAD/general.html#git_oid_fromstr-53", - "ex/HEAD/general.html#git_oid_fromstr-54", - "ex/HEAD/general.html#git_oid_fromstr-55" + "ex/v1.3.0/general.html#git_oid_fromstr-48", + "ex/v1.3.0/general.html#git_oid_fromstr-49", + "ex/v1.3.0/general.html#git_oid_fromstr-50", + "ex/v1.3.0/general.html#git_oid_fromstr-51", + "ex/v1.3.0/general.html#git_oid_fromstr-52", + "ex/v1.3.0/general.html#git_oid_fromstr-53", + "ex/v1.3.0/general.html#git_oid_fromstr-54", + "ex/v1.3.0/general.html#git_oid_fromstr-55" ] } }, @@ -13356,18 +13804,18 @@ "group": "oid", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_oid_fmt-1", - "ex/HEAD/fetch.html#git_oid_fmt-2" + "ex/v1.3.0/fetch.html#git_oid_fmt-1", + "ex/v1.3.0/fetch.html#git_oid_fmt-2" ], "general.c": [ - "ex/HEAD/general.html#git_oid_fmt-56", - "ex/HEAD/general.html#git_oid_fmt-57", - "ex/HEAD/general.html#git_oid_fmt-58", - "ex/HEAD/general.html#git_oid_fmt-59", - "ex/HEAD/general.html#git_oid_fmt-60" + "ex/v1.3.0/general.html#git_oid_fmt-56", + "ex/v1.3.0/general.html#git_oid_fmt-57", + "ex/v1.3.0/general.html#git_oid_fmt-58", + "ex/v1.3.0/general.html#git_oid_fmt-59", + "ex/v1.3.0/general.html#git_oid_fmt-60" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_oid_fmt-1" + "ex/v1.3.0/ls-remote.html#git_oid_fmt-1" ] } }, @@ -13453,8 +13901,8 @@ "group": "oid", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_oid_tostr_s-19", - "ex/HEAD/merge.html#git_oid_tostr_s-20" + "ex/v1.3.0/merge.html#git_oid_tostr_s-19", + "ex/v1.3.0/merge.html#git_oid_tostr_s-20" ] } }, @@ -13491,25 +13939,25 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_tostr-16", - "ex/HEAD/blame.html#git_oid_tostr-17" + "ex/v1.3.0/blame.html#git_oid_tostr-16", + "ex/v1.3.0/blame.html#git_oid_tostr-17" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_oid_tostr-24", - "ex/HEAD/cat-file.html#git_oid_tostr-25", - "ex/HEAD/cat-file.html#git_oid_tostr-26", - "ex/HEAD/cat-file.html#git_oid_tostr-27", - "ex/HEAD/cat-file.html#git_oid_tostr-28" + "ex/v1.3.0/cat-file.html#git_oid_tostr-24", + "ex/v1.3.0/cat-file.html#git_oid_tostr-25", + "ex/v1.3.0/cat-file.html#git_oid_tostr-26", + "ex/v1.3.0/cat-file.html#git_oid_tostr-27", + "ex/v1.3.0/cat-file.html#git_oid_tostr-28" ], "log.c": [ - "ex/HEAD/log.html#git_oid_tostr-38", - "ex/HEAD/log.html#git_oid_tostr-39" + "ex/v1.3.0/log.html#git_oid_tostr-38", + "ex/v1.3.0/log.html#git_oid_tostr-39" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_oid_tostr-10", - "ex/HEAD/rev-parse.html#git_oid_tostr-11", - "ex/HEAD/rev-parse.html#git_oid_tostr-12", - "ex/HEAD/rev-parse.html#git_oid_tostr-13" + "ex/v1.3.0/rev-parse.html#git_oid_tostr-10", + "ex/v1.3.0/rev-parse.html#git_oid_tostr-11", + "ex/v1.3.0/rev-parse.html#git_oid_tostr-12", + "ex/v1.3.0/rev-parse.html#git_oid_tostr-13" ] } }, @@ -13541,9 +13989,9 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_cpy-18", - "ex/HEAD/blame.html#git_oid_cpy-19", - "ex/HEAD/blame.html#git_oid_cpy-20" + "ex/v1.3.0/blame.html#git_oid_cpy-18", + "ex/v1.3.0/blame.html#git_oid_cpy-19", + "ex/v1.3.0/blame.html#git_oid_cpy-20" ] } }, @@ -13710,10 +14158,10 @@ "group": "oid", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_oid_is_zero-21" + "ex/v1.3.0/blame.html#git_oid_is_zero-21" ], "fetch.c": [ - "ex/HEAD/fetch.html#git_oid_is_zero-3" + "ex/v1.3.0/fetch.html#git_oid_is_zero-3" ] } }, @@ -13788,11 +14236,11 @@ "comments": "", "group": "oid" }, - "git_oidarray_free": { + "git_oidarray_dispose": { "type": "function", "file": "git2/oidarray.h", - "line": 34, - "lineto": 34, + "line": 31, + "lineto": 31, "args": [ { "name": "array", @@ -13806,8 +14254,8 @@ "type": "void", "comment": null }, - "description": "

Free the OID array

\n", - "comments": "

This method must (and must only) be called on git_oidarray objects where the array is allocated by the library. Not doing so, will result in a memory leak.

\n\n

This does not free the git_oidarray itself, since the library will never allocate that object directly itself (it is more commonly embedded inside another struct or created on the stack).

\n", + "description": "

Free the object IDs contained in an oid_array. This method should\n be called on git_oidarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", + "comments": "

This does not free the git_oidarray itself, since the library will never allocate that object directly itself.

\n", "group": "oidarray" }, "git_packbuilder_new": { @@ -14441,7 +14889,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_patch_from_buffers-15" + "ex/v1.3.0/diff.html#git_patch_from_buffers-15" ] } }, @@ -14468,7 +14916,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_patch_free-16" + "ex/v1.3.0/diff.html#git_patch_free-16" ] } }, @@ -14751,7 +15199,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/HEAD/diff.html#git_patch_to_buf-17" + "ex/v1.3.0/diff.html#git_patch_to_buf-17" ] } }, @@ -14783,7 +15231,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_new-40" + "ex/v1.3.0/log.html#git_pathspec_new-40" ] } }, @@ -14810,7 +15258,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_free-41" + "ex/v1.3.0/log.html#git_pathspec_free-41" ] } }, @@ -14958,7 +15406,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/HEAD/log.html#git_pathspec_match_tree-42" + "ex/v1.3.0/log.html#git_pathspec_match_tree-42" ] } }, @@ -15176,8 +15624,8 @@ "git_rebase_options_init": { "type": "function", "file": "git2/rebase.h", - "line": 175, - "lineto": 177, + "line": 199, + "lineto": 201, "args": [ { "name": "opts", @@ -15203,8 +15651,8 @@ "git_rebase_init": { "type": "function", "file": "git2/rebase.h", - "line": 196, - "lineto": 202, + "line": 220, + "lineto": 226, "args": [ { "name": "out", @@ -15250,8 +15698,8 @@ "git_rebase_open": { "type": "function", "file": "git2/rebase.h", - "line": 213, - "lineto": 216, + "line": 237, + "lineto": 240, "args": [ { "name": "out", @@ -15282,8 +15730,8 @@ "git_rebase_orig_head_name": { "type": "function", "file": "git2/rebase.h", - "line": 223, - "lineto": 223, + "line": 247, + "lineto": 247, "args": [ { "name": "rebase", @@ -15304,8 +15752,8 @@ "git_rebase_orig_head_id": { "type": "function", "file": "git2/rebase.h", - "line": 230, - "lineto": 230, + "line": 254, + "lineto": 254, "args": [ { "name": "rebase", @@ -15326,8 +15774,8 @@ "git_rebase_onto_name": { "type": "function", "file": "git2/rebase.h", - "line": 237, - "lineto": 237, + "line": 261, + "lineto": 261, "args": [ { "name": "rebase", @@ -15348,8 +15796,8 @@ "git_rebase_onto_id": { "type": "function", "file": "git2/rebase.h", - "line": 244, - "lineto": 244, + "line": 268, + "lineto": 268, "args": [ { "name": "rebase", @@ -15370,8 +15818,8 @@ "git_rebase_operation_entrycount": { "type": "function", "file": "git2/rebase.h", - "line": 252, - "lineto": 252, + "line": 276, + "lineto": 276, "args": [ { "name": "rebase", @@ -15392,8 +15840,8 @@ "git_rebase_operation_current": { "type": "function", "file": "git2/rebase.h", - "line": 263, - "lineto": 263, + "line": 287, + "lineto": 287, "args": [ { "name": "rebase", @@ -15414,8 +15862,8 @@ "git_rebase_operation_byindex": { "type": "function", "file": "git2/rebase.h", - "line": 272, - "lineto": 274, + "line": 296, + "lineto": 298, "args": [ { "name": "rebase", @@ -15441,8 +15889,8 @@ "git_rebase_next": { "type": "function", "file": "git2/rebase.h", - "line": 287, - "lineto": 289, + "line": 311, + "lineto": 313, "args": [ { "name": "operation", @@ -15468,8 +15916,8 @@ "git_rebase_inmemory_index": { "type": "function", "file": "git2/rebase.h", - "line": 302, - "lineto": 304, + "line": 326, + "lineto": 328, "args": [ { "name": "index", @@ -15495,8 +15943,8 @@ "git_rebase_commit": { "type": "function", "file": "git2/rebase.h", - "line": 328, - "lineto": 334, + "line": 352, + "lineto": 358, "args": [ { "name": "id", @@ -15542,8 +15990,8 @@ "git_rebase_abort": { "type": "function", "file": "git2/rebase.h", - "line": 344, - "lineto": 344, + "line": 368, + "lineto": 368, "args": [ { "name": "rebase", @@ -15564,8 +16012,8 @@ "git_rebase_finish": { "type": "function", "file": "git2/rebase.h", - "line": 354, - "lineto": 356, + "line": 378, + "lineto": 380, "args": [ { "name": "rebase", @@ -15591,8 +16039,8 @@ "git_rebase_free": { "type": "function", "file": "git2/rebase.h", - "line": 363, - "lineto": 363, + "line": 387, + "lineto": 387, "args": [ { "name": "rebase", @@ -16082,14 +16530,14 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_lookup-15", - "ex/HEAD/checkout.html#git_reference_lookup-16" + "ex/v1.3.0/checkout.html#git_reference_lookup-15", + "ex/v1.3.0/checkout.html#git_reference_lookup-16" ], "general.c": [ - "ex/HEAD/general.html#git_reference_lookup-61" + "ex/v1.3.0/general.html#git_reference_lookup-61" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_lookup-21" + "ex/v1.3.0/merge.html#git_reference_lookup-21" ] } }, @@ -16158,15 +16606,15 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_dwim-22" + "ex/v1.3.0/merge.html#git_reference_dwim-22" ] } }, "git_reference_symbolic_create_matching": { "type": "function", "file": "git2/refs.h", - "line": 109, - "lineto": 109, + "line": 112, + "lineto": 112, "args": [ { "name": "out", @@ -16211,14 +16659,14 @@ "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" }, "description": "

Conditionally create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n\n

If current_value is all zeros, this function will return GIT_EMODIFIED if the ref already exists.

\n", "group": "reference" }, "git_reference_symbolic_create": { "type": "function", "file": "git2/refs.h", - "line": 145, - "lineto": 145, + "line": 148, + "lineto": 148, "args": [ { "name": "out", @@ -16264,8 +16712,8 @@ "git_reference_create": { "type": "function", "file": "git2/refs.h", - "line": 182, - "lineto": 182, + "line": 185, + "lineto": 185, "args": [ { "name": "out", @@ -16309,15 +16757,15 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_create-23" + "ex/v1.3.0/merge.html#git_reference_create-23" ] } }, "git_reference_create_matching": { "type": "function", "file": "git2/refs.h", - "line": 225, - "lineto": 225, + "line": 228, + "lineto": 228, "args": [ { "name": "out", @@ -16368,8 +16816,8 @@ "git_reference_target": { "type": "function", "file": "git2/refs.h", - "line": 240, - "lineto": 240, + "line": 243, + "lineto": 243, "args": [ { "name": "ref", @@ -16388,15 +16836,15 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_target-62" + "ex/v1.3.0/general.html#git_reference_target-62" ] } }, "git_reference_target_peel": { "type": "function", "file": "git2/refs.h", - "line": 251, - "lineto": 251, + "line": 254, + "lineto": 254, "args": [ { "name": "ref", @@ -16417,8 +16865,8 @@ "git_reference_symbolic_target": { "type": "function", "file": "git2/refs.h", - "line": 261, - "lineto": 261, + "line": 264, + "lineto": 264, "args": [ { "name": "ref", @@ -16437,18 +16885,18 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_symbolic_target-63" + "ex/v1.3.0/general.html#git_reference_symbolic_target-63" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_symbolic_target-24" + "ex/v1.3.0/merge.html#git_reference_symbolic_target-24" ] } }, "git_reference_type": { "type": "function", "file": "git2/refs.h", - "line": 271, - "lineto": 271, + "line": 274, + "lineto": 274, "args": [ { "name": "ref", @@ -16467,15 +16915,15 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_type-64" + "ex/v1.3.0/general.html#git_reference_type-64" ] } }, "git_reference_name": { "type": "function", "file": "git2/refs.h", - "line": 281, - "lineto": 281, + "line": 284, + "lineto": 284, "args": [ { "name": "ref", @@ -16494,18 +16942,18 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_name-17" + "ex/v1.3.0/checkout.html#git_reference_name-17" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_name-25" + "ex/v1.3.0/merge.html#git_reference_name-25" ] } }, "git_reference_resolve": { "type": "function", "file": "git2/refs.h", - "line": 299, - "lineto": 299, + "line": 302, + "lineto": 302, "args": [ { "name": "out", @@ -16531,8 +16979,8 @@ "git_reference_owner": { "type": "function", "file": "git2/refs.h", - "line": 307, - "lineto": 307, + "line": 310, + "lineto": 310, "args": [ { "name": "ref", @@ -16553,8 +17001,8 @@ "git_reference_symbolic_set_target": { "type": "function", "file": "git2/refs.h", - "line": 329, - "lineto": 333, + "line": 332, + "lineto": 336, "args": [ { "name": "out", @@ -16590,8 +17038,8 @@ "git_reference_set_target": { "type": "function", "file": "git2/refs.h", - "line": 349, - "lineto": 353, + "line": 352, + "lineto": 356, "args": [ { "name": "out", @@ -16625,15 +17073,15 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_set_target-26" + "ex/v1.3.0/merge.html#git_reference_set_target-26" ] } }, "git_reference_rename": { "type": "function", "file": "git2/refs.h", - "line": 378, - "lineto": 383, + "line": 381, + "lineto": 386, "args": [ { "name": "new_ref", @@ -16674,8 +17122,8 @@ "git_reference_delete": { "type": "function", "file": "git2/refs.h", - "line": 398, - "lineto": 398, + "line": 401, + "lineto": 401, "args": [ { "name": "ref", @@ -16696,8 +17144,8 @@ "git_reference_remove": { "type": "function", "file": "git2/refs.h", - "line": 409, - "lineto": 409, + "line": 412, + "lineto": 412, "args": [ { "name": "repo", @@ -16723,8 +17171,8 @@ "git_reference_list": { "type": "function", "file": "git2/refs.h", - "line": 423, - "lineto": 423, + "line": 426, + "lineto": 426, "args": [ { "name": "array", @@ -16748,15 +17196,15 @@ "group": "reference", "examples": { "general.c": [ - "ex/HEAD/general.html#git_reference_list-65" + "ex/v1.3.0/general.html#git_reference_list-65" ] } }, "git_reference_foreach": { "type": "function", "file": "git2/refs.h", - "line": 463, - "lineto": 466, + "line": 466, + "lineto": 469, "args": [ { "name": "repo", @@ -16787,8 +17235,8 @@ "git_reference_foreach_name": { "type": "function", "file": "git2/refs.h", - "line": 481, - "lineto": 484, + "line": 484, + "lineto": 487, "args": [ { "name": "repo", @@ -16819,8 +17267,8 @@ "git_reference_dup": { "type": "function", "file": "git2/refs.h", - "line": 495, - "lineto": 495, + "line": 498, + "lineto": 498, "args": [ { "name": "dest", @@ -16846,8 +17294,8 @@ "git_reference_free": { "type": "function", "file": "git2/refs.h", - "line": 502, - "lineto": 502, + "line": 505, + "lineto": 505, "args": [ { "name": "ref", @@ -16866,28 +17314,28 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_free-18", - "ex/HEAD/checkout.html#git_reference_free-19", - "ex/HEAD/checkout.html#git_reference_free-20" + "ex/v1.3.0/checkout.html#git_reference_free-18", + "ex/v1.3.0/checkout.html#git_reference_free-19", + "ex/v1.3.0/checkout.html#git_reference_free-20" ], "general.c": [ - "ex/HEAD/general.html#git_reference_free-66" + "ex/v1.3.0/general.html#git_reference_free-66" ], "merge.c": [ - "ex/HEAD/merge.html#git_reference_free-27", - "ex/HEAD/merge.html#git_reference_free-28", - "ex/HEAD/merge.html#git_reference_free-29" + "ex/v1.3.0/merge.html#git_reference_free-27", + "ex/v1.3.0/merge.html#git_reference_free-28", + "ex/v1.3.0/merge.html#git_reference_free-29" ], "status.c": [ - "ex/HEAD/status.html#git_reference_free-1" + "ex/v1.3.0/status.html#git_reference_free-1" ] } }, "git_reference_cmp": { "type": "function", "file": "git2/refs.h", - "line": 511, - "lineto": 513, + "line": 514, + "lineto": 516, "args": [ { "name": "ref1", @@ -16913,8 +17361,8 @@ "git_reference_iterator_new": { "type": "function", "file": "git2/refs.h", - "line": 522, - "lineto": 524, + "line": 525, + "lineto": 527, "args": [ { "name": "out", @@ -16940,8 +17388,8 @@ "git_reference_iterator_glob_new": { "type": "function", "file": "git2/refs.h", - "line": 535, - "lineto": 538, + "line": 538, + "lineto": 541, "args": [ { "name": "out", @@ -16972,8 +17420,8 @@ "git_reference_next": { "type": "function", "file": "git2/refs.h", - "line": 547, - "lineto": 547, + "line": 550, + "lineto": 550, "args": [ { "name": "out", @@ -16999,8 +17447,8 @@ "git_reference_next_name": { "type": "function", "file": "git2/refs.h", - "line": 560, - "lineto": 560, + "line": 563, + "lineto": 563, "args": [ { "name": "out", @@ -17026,8 +17474,8 @@ "git_reference_iterator_free": { "type": "function", "file": "git2/refs.h", - "line": 567, - "lineto": 567, + "line": 570, + "lineto": 570, "args": [ { "name": "iter", @@ -17048,8 +17496,8 @@ "git_reference_foreach_glob": { "type": "function", "file": "git2/refs.h", - "line": 587, - "lineto": 591, + "line": 590, + "lineto": 594, "args": [ { "name": "repo", @@ -17085,8 +17533,8 @@ "git_reference_has_log": { "type": "function", "file": "git2/refs.h", - "line": 601, - "lineto": 601, + "line": 604, + "lineto": 604, "args": [ { "name": "repo", @@ -17112,8 +17560,8 @@ "git_reference_ensure_log": { "type": "function", "file": "git2/refs.h", - "line": 613, - "lineto": 613, + "line": 616, + "lineto": 616, "args": [ { "name": "repo", @@ -17139,8 +17587,8 @@ "git_reference_is_branch": { "type": "function", "file": "git2/refs.h", - "line": 623, - "lineto": 623, + "line": 626, + "lineto": 626, "args": [ { "name": "ref", @@ -17161,8 +17609,8 @@ "git_reference_is_remote": { "type": "function", "file": "git2/refs.h", - "line": 633, - "lineto": 633, + "line": 636, + "lineto": 636, "args": [ { "name": "ref", @@ -17181,15 +17629,15 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_reference_is_remote-21" + "ex/v1.3.0/checkout.html#git_reference_is_remote-21" ] } }, "git_reference_is_tag": { "type": "function", "file": "git2/refs.h", - "line": 643, - "lineto": 643, + "line": 646, + "lineto": 646, "args": [ { "name": "ref", @@ -17210,8 +17658,8 @@ "git_reference_is_note": { "type": "function", "file": "git2/refs.h", - "line": 653, - "lineto": 653, + "line": 656, + "lineto": 656, "args": [ { "name": "ref", @@ -17232,8 +17680,8 @@ "git_reference_normalize_name": { "type": "function", "file": "git2/refs.h", - "line": 709, - "lineto": 713, + "line": 712, + "lineto": 716, "args": [ { "name": "buffer_out", @@ -17269,8 +17717,8 @@ "git_reference_peel": { "type": "function", "file": "git2/refs.h", - "line": 730, - "lineto": 733, + "line": 733, + "lineto": 736, "args": [ { "name": "out", @@ -17299,15 +17747,15 @@ "group": "reference", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_reference_peel-30" + "ex/v1.3.0/merge.html#git_reference_peel-30" ] } }, "git_reference_name_is_valid": { "type": "function", "file": "git2/refs.h", - "line": 750, - "lineto": 750, + "line": 753, + "lineto": 753, "args": [ { "name": "valid", @@ -17333,8 +17781,8 @@ "git_reference_shorthand": { "type": "function", "file": "git2/refs.h", - "line": 764, - "lineto": 764, + "line": 767, + "lineto": 767, "args": [ { "name": "ref", @@ -17353,7 +17801,7 @@ "group": "reference", "examples": { "status.c": [ - "ex/HEAD/status.html#git_reference_shorthand-2" + "ex/v1.3.0/status.html#git_reference_shorthand-2" ] } }, @@ -17677,7 +18125,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_create-1" + "ex/v1.3.0/remote.html#git_remote_create-1" ] } }, @@ -17815,10 +18263,10 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_create_anonymous-4" + "ex/v1.3.0/fetch.html#git_remote_create_anonymous-4" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_create_anonymous-2" + "ex/v1.3.0/ls-remote.html#git_remote_create_anonymous-2" ] } }, @@ -17882,16 +18330,16 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_lookup-5" + "ex/v1.3.0/fetch.html#git_remote_lookup-5" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_lookup-3" + "ex/v1.3.0/ls-remote.html#git_remote_lookup-3" ], "push.c": [ - "ex/HEAD/push.html#git_remote_lookup-1" + "ex/v1.3.0/push.html#git_remote_lookup-1" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_lookup-2" + "ex/v1.3.0/remote.html#git_remote_lookup-2" ] } }, @@ -17969,8 +18417,8 @@ "git_remote_url": { "type": "function", "file": "git2/remote.h", - "line": 220, - "lineto": 220, + "line": 221, + "lineto": 221, "args": [ { "name": "remote", @@ -17985,19 +18433,19 @@ "comment": " a pointer to the url" }, "description": "

Get the remote's url

\n", - "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL.

\n", + "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_url-3" + "ex/v1.3.0/remote.html#git_remote_url-3" ] } }, "git_remote_pushurl": { "type": "function", "file": "git2/remote.h", - "line": 231, - "lineto": 231, + "line": 233, + "lineto": 233, "args": [ { "name": "remote", @@ -18011,20 +18459,20 @@ "type": "const char *", "comment": " a pointer to the url or NULL if no special url for pushing is set" }, - "description": "

Get the remote's url for pushing

\n", - "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL.

\n", + "description": "

Get the remote's url for pushing.

\n", + "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_pushurl-4" + "ex/v1.3.0/remote.html#git_remote_pushurl-4" ] } }, "git_remote_set_url": { "type": "function", "file": "git2/remote.h", - "line": 244, - "lineto": 244, + "line": 246, + "lineto": 246, "args": [ { "name": "repo", @@ -18053,15 +18501,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_set_url-5" + "ex/v1.3.0/remote.html#git_remote_set_url-5" ] } }, "git_remote_set_pushurl": { "type": "function", "file": "git2/remote.h", - "line": 257, - "lineto": 257, + "line": 260, + "lineto": 260, "args": [ { "name": "repo", @@ -18083,22 +18531,76 @@ "sig": "git_repository *::const char *::const char *", "return": { "type": "int", - "comment": null + "comment": " 0, or an error code" }, "description": "

Set the remote's url for pushing in the configuration.

\n", "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_set_pushurl-6" + "ex/v1.3.0/remote.html#git_remote_set_pushurl-6" ] } }, - "git_remote_add_fetch": { + "git_remote_set_instance_url": { "type": "function", "file": "git2/remote.h", "line": 270, "lineto": 270, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the url to set" + } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error value" + }, + "description": "

Set the url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_set_instance_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the url to set" + } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error value" + }, + "description": "

Set the push url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_add_fetch": { + "type": "function", + "file": "git2/remote.h", + "line": 293, + "lineto": 293, "args": [ { "name": "repo", @@ -18129,8 +18631,8 @@ "git_remote_get_fetch_refspecs": { "type": "function", "file": "git2/remote.h", - "line": 281, - "lineto": 281, + "line": 304, + "lineto": 304, "args": [ { "name": "array", @@ -18156,8 +18658,8 @@ "git_remote_add_push": { "type": "function", "file": "git2/remote.h", - "line": 294, - "lineto": 294, + "line": 317, + "lineto": 317, "args": [ { "name": "repo", @@ -18188,8 +18690,8 @@ "git_remote_get_push_refspecs": { "type": "function", "file": "git2/remote.h", - "line": 305, - "lineto": 305, + "line": 328, + "lineto": 328, "args": [ { "name": "array", @@ -18215,8 +18717,8 @@ "git_remote_refspec_count": { "type": "function", "file": "git2/remote.h", - "line": 313, - "lineto": 313, + "line": 336, + "lineto": 336, "args": [ { "name": "remote", @@ -18237,8 +18739,8 @@ "git_remote_get_refspec": { "type": "function", "file": "git2/remote.h", - "line": 322, - "lineto": 322, + "line": 345, + "lineto": 345, "args": [ { "name": "remote", @@ -18264,8 +18766,8 @@ "git_remote_connect": { "type": "function", "file": "git2/remote.h", - "line": 339, - "lineto": 339, + "line": 362, + "lineto": 362, "args": [ { "name": "remote", @@ -18304,15 +18806,15 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_connect-4" + "ex/v1.3.0/ls-remote.html#git_remote_connect-4" ] } }, "git_remote_ls": { "type": "function", "file": "git2/remote.h", - "line": 361, - "lineto": 361, + "line": 384, + "lineto": 384, "args": [ { "name": "out", @@ -18341,15 +18843,15 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_ls-5" + "ex/v1.3.0/ls-remote.html#git_remote_ls-5" ] } }, "git_remote_connected": { "type": "function", "file": "git2/remote.h", - "line": 372, - "lineto": 372, + "line": 395, + "lineto": 395, "args": [ { "name": "remote", @@ -18370,8 +18872,8 @@ "git_remote_stop": { "type": "function", "file": "git2/remote.h", - "line": 383, - "lineto": 383, + "line": 406, + "lineto": 406, "args": [ { "name": "remote", @@ -18392,8 +18894,8 @@ "git_remote_disconnect": { "type": "function", "file": "git2/remote.h", - "line": 393, - "lineto": 393, + "line": 416, + "lineto": 416, "args": [ { "name": "remote", @@ -18414,8 +18916,8 @@ "git_remote_free": { "type": "function", "file": "git2/remote.h", - "line": 403, - "lineto": 403, + "line": 426, + "lineto": 426, "args": [ { "name": "remote", @@ -18434,22 +18936,22 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_free-6", - "ex/HEAD/fetch.html#git_remote_free-7" + "ex/v1.3.0/fetch.html#git_remote_free-6", + "ex/v1.3.0/fetch.html#git_remote_free-7" ], "ls-remote.c": [ - "ex/HEAD/ls-remote.html#git_remote_free-6" + "ex/v1.3.0/ls-remote.html#git_remote_free-6" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_free-7" + "ex/v1.3.0/remote.html#git_remote_free-7" ] } }, "git_remote_list": { "type": "function", "file": "git2/remote.h", - "line": 414, - "lineto": 414, + "line": 437, + "lineto": 437, "args": [ { "name": "out", @@ -18473,18 +18975,18 @@ "group": "remote", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_remote_list-22" + "ex/v1.3.0/checkout.html#git_remote_list-22" ], "remote.c": [ - "ex/HEAD/remote.html#git_remote_list-8" + "ex/v1.3.0/remote.html#git_remote_list-8" ] } }, "git_remote_init_callbacks": { "type": "function", "file": "git2/remote.h", - "line": 601, - "lineto": 603, + "line": 651, + "lineto": 653, "args": [ { "name": "opts", @@ -18510,8 +19012,8 @@ "git_fetch_options_init": { "type": "function", "file": "git2/remote.h", - "line": 707, - "lineto": 709, + "line": 757, + "lineto": 759, "args": [ { "name": "opts", @@ -18537,8 +19039,8 @@ "git_push_options_init": { "type": "function", "file": "git2/remote.h", - "line": 757, - "lineto": 759, + "line": 807, + "lineto": 809, "args": [ { "name": "opts", @@ -18562,15 +19064,15 @@ "group": "push", "examples": { "push.c": [ - "ex/HEAD/push.html#git_push_options_init-2" + "ex/v1.3.0/push.html#git_push_options_init-2" ] } }, "git_remote_download": { "type": "function", "file": "git2/remote.h", - "line": 777, - "lineto": 777, + "line": 827, + "lineto": 827, "args": [ { "name": "remote", @@ -18601,8 +19103,8 @@ "git_remote_upload": { "type": "function", "file": "git2/remote.h", - "line": 791, - "lineto": 791, + "line": 841, + "lineto": 841, "args": [ { "name": "remote", @@ -18633,8 +19135,8 @@ "git_remote_update_tips": { "type": "function", "file": "git2/remote.h", - "line": 807, - "lineto": 812, + "line": 857, + "lineto": 862, "args": [ { "name": "remote", @@ -18675,8 +19177,8 @@ "git_remote_fetch": { "type": "function", "file": "git2/remote.h", - "line": 828, - "lineto": 832, + "line": 878, + "lineto": 882, "args": [ { "name": "remote", @@ -18710,15 +19212,15 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_fetch-8" + "ex/v1.3.0/fetch.html#git_remote_fetch-8" ] } }, "git_remote_prune": { "type": "function", "file": "git2/remote.h", - "line": 841, - "lineto": 841, + "line": 891, + "lineto": 891, "args": [ { "name": "remote", @@ -18744,8 +19246,8 @@ "git_remote_push": { "type": "function", "file": "git2/remote.h", - "line": 853, - "lineto": 855, + "line": 903, + "lineto": 905, "args": [ { "name": "remote", @@ -18774,15 +19276,15 @@ "group": "remote", "examples": { "push.c": [ - "ex/HEAD/push.html#git_remote_push-3" + "ex/v1.3.0/push.html#git_remote_push-3" ] } }, "git_remote_stats": { "type": "function", "file": "git2/remote.h", - "line": 860, - "lineto": 860, + "line": 910, + "lineto": 910, "args": [ { "name": "remote", @@ -18801,15 +19303,15 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/HEAD/fetch.html#git_remote_stats-9" + "ex/v1.3.0/fetch.html#git_remote_stats-9" ] } }, "git_remote_autotag": { "type": "function", "file": "git2/remote.h", - "line": 868, - "lineto": 868, + "line": 918, + "lineto": 918, "args": [ { "name": "remote", @@ -18830,8 +19332,8 @@ "git_remote_set_autotag": { "type": "function", "file": "git2/remote.h", - "line": 880, - "lineto": 880, + "line": 931, + "lineto": 931, "args": [ { "name": "repo", @@ -18853,7 +19355,7 @@ "sig": "git_repository *::const char *::git_remote_autotag_option_t", "return": { "type": "int", - "comment": null + "comment": " 0, or an error code." }, "description": "

Set the remote's tag following setting.

\n", "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", @@ -18862,8 +19364,8 @@ "git_remote_prune_refs": { "type": "function", "file": "git2/remote.h", - "line": 887, - "lineto": 887, + "line": 939, + "lineto": 939, "args": [ { "name": "remote", @@ -18884,8 +19386,8 @@ "git_remote_rename": { "type": "function", "file": "git2/remote.h", - "line": 909, - "lineto": 913, + "line": 961, + "lineto": 965, "args": [ { "name": "problems", @@ -18919,15 +19421,15 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_rename-9" + "ex/v1.3.0/remote.html#git_remote_rename-9" ] } }, "git_remote_name_is_valid": { "type": "function", "file": "git2/remote.h", - "line": 922, - "lineto": 922, + "line": 974, + "lineto": 974, "args": [ { "name": "valid", @@ -18953,8 +19455,8 @@ "git_remote_delete": { "type": "function", "file": "git2/remote.h", - "line": 934, - "lineto": 934, + "line": 986, + "lineto": 986, "args": [ { "name": "repo", @@ -18978,20 +19480,20 @@ "group": "remote", "examples": { "remote.c": [ - "ex/HEAD/remote.html#git_remote_delete-10" + "ex/v1.3.0/remote.html#git_remote_delete-10" ] } }, "git_remote_default_branch": { "type": "function", "file": "git2/remote.h", - "line": 952, - "lineto": 952, + "line": 1004, + "lineto": 1004, "args": [ { "name": "out", "type": "git_buf *", - "comment": "the buffern in which to store the reference name" + "comment": "the buffer in which to store the reference name" }, { "name": "remote", @@ -19037,7 +19539,7 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_open-67" + "ex/v1.3.0/general.html#git_repository_open-67" ] } }, @@ -19170,7 +19672,7 @@ "group": "repository", "examples": { "log.c": [ - "ex/HEAD/log.html#git_repository_open_ext-43" + "ex/v1.3.0/log.html#git_repository_open_ext-43" ] } }, @@ -19224,10 +19726,10 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_free-68" + "ex/v1.3.0/general.html#git_repository_free-68" ], "init.c": [ - "ex/HEAD/init.html#git_repository_free-4" + "ex/v1.3.0/init.html#git_repository_free-4" ] } }, @@ -19264,7 +19766,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_init-5" + "ex/v1.3.0/init.html#git_repository_init-5" ] } }, @@ -19328,7 +19830,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_init_ext-6" + "ex/v1.3.0/init.html#git_repository_init_ext-6" ] } }, @@ -19360,11 +19862,11 @@ "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_head-31", - "ex/HEAD/merge.html#git_repository_head-32" + "ex/v1.3.0/merge.html#git_repository_head-31", + "ex/v1.3.0/merge.html#git_repository_head-32" ], "status.c": [ - "ex/HEAD/status.html#git_repository_head-3" + "ex/v1.3.0/status.html#git_repository_head-3" ] } }, @@ -19548,10 +20050,10 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_path-7" + "ex/v1.3.0/init.html#git_repository_path-7" ], "status.c": [ - "ex/HEAD/status.html#git_repository_path-4" + "ex/v1.3.0/status.html#git_repository_path-4" ] } }, @@ -19578,7 +20080,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/HEAD/init.html#git_repository_workdir-8" + "ex/v1.3.0/init.html#git_repository_workdir-8" ] } }, @@ -19659,7 +20161,7 @@ "group": "repository", "examples": { "status.c": [ - "ex/HEAD/status.html#git_repository_is_bare-5" + "ex/v1.3.0/status.html#git_repository_is_bare-5" ] } }, @@ -19710,7 +20212,12 @@ }, "description": "

Get the configuration file for this repository.

\n", "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", - "group": "repository" + "group": "repository", + "examples": { + "config.c": [ + "ex/v1.3.0/config.html#git_repository_config-9" + ] + } }, "git_repository_config_snapshot": { "type": "function", @@ -19740,8 +20247,8 @@ "group": "repository", "examples": { "general.c": [ - "ex/HEAD/general.html#git_repository_config_snapshot-69", - "ex/HEAD/general.html#git_repository_config_snapshot-70" + "ex/v1.3.0/general.html#git_repository_config_snapshot-69", + "ex/v1.3.0/general.html#git_repository_config_snapshot-70" ] } }, @@ -19773,10 +20280,10 @@ "group": "repository", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_repository_odb-29" + "ex/v1.3.0/cat-file.html#git_repository_odb-29" ], "general.c": [ - "ex/HEAD/general.html#git_repository_odb-71" + "ex/v1.3.0/general.html#git_repository_odb-71" ] } }, @@ -19835,22 +20342,22 @@ "group": "repository", "examples": { "add.c": [ - "ex/HEAD/add.html#git_repository_index-5" + "ex/v1.3.0/add.html#git_repository_index-5" ], "commit.c": [ - "ex/HEAD/commit.html#git_repository_index-6" + "ex/v1.3.0/commit.html#git_repository_index-6" ], "general.c": [ - "ex/HEAD/general.html#git_repository_index-72" + "ex/v1.3.0/general.html#git_repository_index-72" ], "init.c": [ - "ex/HEAD/init.html#git_repository_index-9" + "ex/v1.3.0/init.html#git_repository_index-9" ], "ls-files.c": [ - "ex/HEAD/ls-files.html#git_repository_index-5" + "ex/v1.3.0/ls-files.html#git_repository_index-5" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_index-33" + "ex/v1.3.0/merge.html#git_repository_index-33" ] } }, @@ -19926,7 +20433,7 @@ "group": "repository", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_repository_state_cleanup-34" + "ex/v1.3.0/merge.html#git_repository_state_cleanup-34" ] } }, @@ -19997,8 +20504,8 @@ "git_repository_hashfile": { "type": "function", "file": "git2/repository.h", - "line": 774, - "lineto": 779, + "line": 776, + "lineto": 781, "args": [ { "name": "out", @@ -20013,7 +20520,7 @@ { "name": "path", "type": "const char *", - "comment": "Path to file on disk whose contents should be hashed. If the\n repository is not NULL, this can be a relative path." + "comment": "Path to file on disk whose contents should be hashed. This\n may be an absolute path or a relative path, in which case it\n will be treated as a path within the working directory." }, { "name": "type", @@ -20023,7 +20530,7 @@ { "name": "as_path", "type": "const char *", - "comment": "The path to use to look up filtering rules. If this is\n NULL, then the `path` parameter will be used instead. If\n this is passed as the empty string, then no filters will be\n applied when calculating the hash." + "comment": "The path to use to look up filtering rules. If this is\n an empty string then no filters will be applied when\n calculating the hash. If this is `NULL` and the `path`\n parameter is a file within the repository's working\n directory, then the `path` will be used." } ], "argline": "git_oid *out, git_repository *repo, const char *path, git_object_t type, const char *as_path", @@ -20039,8 +20546,8 @@ "git_repository_set_head": { "type": "function", "file": "git2/repository.h", - "line": 799, - "lineto": 801, + "line": 801, + "lineto": 803, "args": [ { "name": "repo", @@ -20064,15 +20571,15 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head-23" + "ex/v1.3.0/checkout.html#git_repository_set_head-23" ] } }, "git_repository_set_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 819, - "lineto": 821, + "line": 821, + "lineto": 823, "args": [ { "name": "repo", @@ -20098,8 +20605,8 @@ "git_repository_set_head_detached_from_annotated": { "type": "function", "file": "git2/repository.h", - "line": 835, - "lineto": 837, + "line": 837, + "lineto": 839, "args": [ { "name": "repo", @@ -20123,15 +20630,15 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_set_head_detached_from_annotated-24" + "ex/v1.3.0/checkout.html#git_repository_set_head_detached_from_annotated-24" ] } }, "git_repository_detach_head": { "type": "function", "file": "git2/repository.h", - "line": 856, - "lineto": 857, + "line": 858, + "lineto": 859, "args": [ { "name": "repo", @@ -20152,8 +20659,8 @@ "git_repository_state": { "type": "function", "file": "git2/repository.h", - "line": 887, - "lineto": 887, + "line": 889, + "lineto": 889, "args": [ { "name": "repo", @@ -20172,18 +20679,18 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_repository_state-25" + "ex/v1.3.0/checkout.html#git_repository_state-25" ], "merge.c": [ - "ex/HEAD/merge.html#git_repository_state-35" + "ex/v1.3.0/merge.html#git_repository_state-35" ] } }, "git_repository_set_namespace": { "type": "function", "file": "git2/repository.h", - "line": 901, - "lineto": 901, + "line": 903, + "lineto": 903, "args": [ { "name": "repo", @@ -20209,8 +20716,8 @@ "git_repository_get_namespace": { "type": "function", "file": "git2/repository.h", - "line": 909, - "lineto": 909, + "line": 911, + "lineto": 911, "args": [ { "name": "repo", @@ -20231,8 +20738,8 @@ "git_repository_is_shallow": { "type": "function", "file": "git2/repository.h", - "line": 918, - "lineto": 918, + "line": 920, + "lineto": 920, "args": [ { "name": "repo", @@ -20253,8 +20760,8 @@ "git_repository_ident": { "type": "function", "file": "git2/repository.h", - "line": 930, - "lineto": 930, + "line": 932, + "lineto": 932, "args": [ { "name": "name", @@ -20285,8 +20792,8 @@ "git_repository_set_ident": { "type": "function", "file": "git2/repository.h", - "line": 943, - "lineto": 943, + "line": 945, + "lineto": 945, "args": [ { "name": "repo", @@ -20559,22 +21066,22 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_revparse_single-22" + "ex/v1.3.0/blame.html#git_revparse_single-22" ], "cat-file.c": [ - "ex/HEAD/cat-file.html#git_revparse_single-30" + "ex/v1.3.0/cat-file.html#git_revparse_single-30" ], "describe.c": [ - "ex/HEAD/describe.html#git_revparse_single-6" + "ex/v1.3.0/describe.html#git_revparse_single-6" ], "log.c": [ - "ex/HEAD/log.html#git_revparse_single-44" + "ex/v1.3.0/log.html#git_revparse_single-44" ], "tag.c": [ - "ex/HEAD/tag.html#git_revparse_single-9", - "ex/HEAD/tag.html#git_revparse_single-10", - "ex/HEAD/tag.html#git_revparse_single-11", - "ex/HEAD/tag.html#git_revparse_single-12" + "ex/v1.3.0/tag.html#git_revparse_single-9", + "ex/v1.3.0/tag.html#git_revparse_single-10", + "ex/v1.3.0/tag.html#git_revparse_single-11", + "ex/v1.3.0/tag.html#git_revparse_single-12" ] } }, @@ -20616,7 +21123,7 @@ "group": "revparse", "examples": { "commit.c": [ - "ex/HEAD/commit.html#git_revparse_ext-7" + "ex/v1.3.0/commit.html#git_revparse_ext-7" ] } }, @@ -20653,14 +21160,14 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/HEAD/blame.html#git_revparse-23" + "ex/v1.3.0/blame.html#git_revparse-23" ], "log.c": [ - "ex/HEAD/log.html#git_revparse-45" + "ex/v1.3.0/log.html#git_revparse-45" ], "rev-parse.c": [ - "ex/HEAD/rev-parse.html#git_revparse-14", - "ex/HEAD/rev-parse.html#git_revparse-15" + "ex/v1.3.0/rev-parse.html#git_revparse-14", + "ex/v1.3.0/rev-parse.html#git_revparse-15" ] } }, @@ -20692,11 +21199,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_new-73" + "ex/v1.3.0/general.html#git_revwalk_new-73" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_new-46", - "ex/HEAD/log.html#git_revwalk_new-47" + "ex/v1.3.0/log.html#git_revwalk_new-46", + "ex/v1.3.0/log.html#git_revwalk_new-47" ] } }, @@ -20750,10 +21257,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_push-74" + "ex/v1.3.0/general.html#git_revwalk_push-74" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_push-48" + "ex/v1.3.0/log.html#git_revwalk_push-48" ] } }, @@ -20807,7 +21314,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/HEAD/log.html#git_revwalk_push_head-49" + "ex/v1.3.0/log.html#git_revwalk_push_head-49" ] } }, @@ -20839,7 +21346,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/HEAD/log.html#git_revwalk_hide-50" + "ex/v1.3.0/log.html#git_revwalk_hide-50" ] } }, @@ -20974,10 +21481,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_next-75" + "ex/v1.3.0/general.html#git_revwalk_next-75" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_next-51" + "ex/v1.3.0/log.html#git_revwalk_next-51" ] } }, @@ -21009,11 +21516,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_sorting-76" + "ex/v1.3.0/general.html#git_revwalk_sorting-76" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_sorting-52", - "ex/HEAD/log.html#git_revwalk_sorting-53" + "ex/v1.3.0/log.html#git_revwalk_sorting-52", + "ex/v1.3.0/log.html#git_revwalk_sorting-53" ] } }, @@ -21089,10 +21596,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/HEAD/general.html#git_revwalk_free-77" + "ex/v1.3.0/general.html#git_revwalk_free-77" ], "log.c": [ - "ex/HEAD/log.html#git_revwalk_free-54" + "ex/v1.3.0/log.html#git_revwalk_free-54" ] } }, @@ -21193,8 +21700,8 @@ "group": "signature", "examples": { "general.c": [ - "ex/HEAD/general.html#git_signature_new-78", - "ex/HEAD/general.html#git_signature_new-79" + "ex/v1.3.0/general.html#git_signature_new-78", + "ex/v1.3.0/general.html#git_signature_new-79" ] } }, @@ -21231,7 +21738,7 @@ "group": "signature", "examples": { "merge.c": [ - "ex/HEAD/merge.html#git_signature_now-36" + "ex/v1.3.0/merge.html#git_signature_now-36" ] } }, @@ -21263,13 +21770,13 @@ "group": "signature", "examples": { "commit.c": [ - "ex/HEAD/commit.html#git_signature_default-8" + "ex/v1.3.0/commit.html#git_signature_default-8" ], "init.c": [ - "ex/HEAD/init.html#git_signature_default-10" + "ex/v1.3.0/init.html#git_signature_default-10" ], "tag.c": [ - "ex/HEAD/tag.html#git_signature_default-13" + "ex/v1.3.0/tag.html#git_signature_default-13" ] } }, @@ -21350,17 +21857,17 @@ "group": "signature", "examples": { "commit.c": [ - "ex/HEAD/commit.html#git_signature_free-9" + "ex/v1.3.0/commit.html#git_signature_free-9" ], "general.c": [ - "ex/HEAD/general.html#git_signature_free-80", - "ex/HEAD/general.html#git_signature_free-81" + "ex/v1.3.0/general.html#git_signature_free-80", + "ex/v1.3.0/general.html#git_signature_free-81" ], "init.c": [ - "ex/HEAD/init.html#git_signature_free-11" + "ex/v1.3.0/init.html#git_signature_free-11" ], "tag.c": [ - "ex/HEAD/tag.html#git_signature_free-14" + "ex/v1.3.0/tag.html#git_signature_free-14" ] } }, @@ -21559,8 +22066,8 @@ "git_status_options_init": { "type": "function", "file": "git2/status.h", - "line": 212, - "lineto": 214, + "line": 268, + "lineto": 270, "args": [ { "name": "opts", @@ -21586,8 +22093,8 @@ "git_status_foreach": { "type": "function", "file": "git2/status.h", - "line": 252, - "lineto": 255, + "line": 308, + "lineto": 311, "args": [ { "name": "repo", @@ -21616,15 +22123,15 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_foreach-6" + "ex/v1.3.0/status.html#git_status_foreach-6" ] } }, "git_status_foreach_ext": { "type": "function", "file": "git2/status.h", - "line": 276, - "lineto": 280, + "line": 332, + "lineto": 336, "args": [ { "name": "repo", @@ -21658,15 +22165,15 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_foreach_ext-7" + "ex/v1.3.0/status.html#git_status_foreach_ext-7" ] } }, "git_status_file": { "type": "function", "file": "git2/status.h", - "line": 308, - "lineto": 311, + "line": 364, + "lineto": 367, "args": [ { "name": "status_flags", @@ -21695,15 +22202,15 @@ "group": "status", "examples": { "add.c": [ - "ex/HEAD/add.html#git_status_file-6" + "ex/v1.3.0/add.html#git_status_file-6" ] } }, "git_status_list_new": { "type": "function", "file": "git2/status.h", - "line": 326, - "lineto": 329, + "line": 382, + "lineto": 385, "args": [ { "name": "out", @@ -21732,16 +22239,16 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_new-8", - "ex/HEAD/status.html#git_status_list_new-9" + "ex/v1.3.0/status.html#git_status_list_new-8", + "ex/v1.3.0/status.html#git_status_list_new-9" ] } }, "git_status_list_entrycount": { "type": "function", "file": "git2/status.h", - "line": 340, - "lineto": 341, + "line": 396, + "lineto": 397, "args": [ { "name": "statuslist", @@ -21760,16 +22267,16 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_entrycount-10", - "ex/HEAD/status.html#git_status_list_entrycount-11" + "ex/v1.3.0/status.html#git_status_list_entrycount-10", + "ex/v1.3.0/status.html#git_status_list_entrycount-11" ] } }, "git_status_byindex": { "type": "function", "file": "git2/status.h", - "line": 352, - "lineto": 354, + "line": 408, + "lineto": 410, "args": [ { "name": "statuslist", @@ -21793,20 +22300,20 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_byindex-12", - "ex/HEAD/status.html#git_status_byindex-13", - "ex/HEAD/status.html#git_status_byindex-14", - "ex/HEAD/status.html#git_status_byindex-15", - "ex/HEAD/status.html#git_status_byindex-16", - "ex/HEAD/status.html#git_status_byindex-17" + "ex/v1.3.0/status.html#git_status_byindex-12", + "ex/v1.3.0/status.html#git_status_byindex-13", + "ex/v1.3.0/status.html#git_status_byindex-14", + "ex/v1.3.0/status.html#git_status_byindex-15", + "ex/v1.3.0/status.html#git_status_byindex-16", + "ex/v1.3.0/status.html#git_status_byindex-17" ] } }, "git_status_list_free": { "type": "function", "file": "git2/status.h", - "line": 361, - "lineto": 362, + "line": 417, + "lineto": 418, "args": [ { "name": "statuslist", @@ -21825,15 +22332,15 @@ "group": "status", "examples": { "status.c": [ - "ex/HEAD/status.html#git_status_list_free-18" + "ex/v1.3.0/status.html#git_status_list_free-18" ] } }, "git_status_should_ignore": { "type": "function", "file": "git2/status.h", - "line": 380, - "lineto": 383, + "line": 436, + "lineto": 439, "args": [ { "name": "ignored", @@ -21884,17 +22391,17 @@ "group": "strarray", "examples": { "checkout.c": [ - "ex/HEAD/checkout.html#git_strarray_dispose-26" + "ex/v1.3.0/checkout.html#git_strarray_dispose-26" ], "general.c": [ - "ex/HEAD/general.html#git_strarray_dispose-82" + "ex/v1.3.0/general.html#git_strarray_dispose-82" ], "remote.c": [ - "ex/HEAD/remote.html#git_strarray_dispose-11", - "ex/HEAD/remote.html#git_strarray_dispose-12" + "ex/v1.3.0/remote.html#git_strarray_dispose-11", + "ex/v1.3.0/remote.html#git_strarray_dispose-12" ], "tag.c": [ - "ex/HEAD/tag.html#git_strarray_dispose-15" + "ex/v1.3.0/tag.html#git_strarray_dispose-15" ] } }, @@ -21989,11 +22496,38 @@ "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config, but does "exist" in the working directory (i.e. there is a subdirectory that appears to be a Git repository). In this case, this function returns GIT_EEXISTS to indicate a sub-repository exists but not in a state where a git_submodule can be instantiated. - The submodule is not mentioned in the HEAD, index, or config and the working directory doesn't contain a value git repo at that path. There may or may not be anything else at that path, but nothing that looks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", "group": "submodule" }, + "git_submodule_dup": { + "type": "function", + "file": "git2/submodule.h", + "line": 233, + "lineto": 233, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "Pointer to store the copy of the submodule." + }, + { + "name": "source", + "type": "git_submodule *", + "comment": "Original submodule to copy." + } + ], + "argline": "git_submodule **out, git_submodule *source", + "sig": "git_submodule **::git_submodule *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create an in-memory copy of a submodule. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "submodule" + }, "git_submodule_free": { "type": "function", "file": "git2/submodule.h", - "line": 231, - "lineto": 231, + "line": 240, + "lineto": 240, "args": [ { "name": "submodule", @@ -22014,8 +22548,8 @@ "git_submodule_foreach": { "type": "function", "file": "git2/submodule.h", - "line": 251, - "lineto": 254, + "line": 260, + "lineto": 263, "args": [ { "name": "repo", @@ -22044,15 +22578,15 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_foreach-19" + "ex/v1.3.0/status.html#git_submodule_foreach-19" ] } }, "git_submodule_add_setup": { "type": "function", "file": "git2/submodule.h", - "line": 282, - "lineto": 287, + "line": 291, + "lineto": 296, "args": [ { "name": "out", @@ -22093,8 +22627,8 @@ "git_submodule_clone": { "type": "function", "file": "git2/submodule.h", - "line": 300, - "lineto": 303, + "line": 309, + "lineto": 312, "args": [ { "name": "out", @@ -22125,8 +22659,8 @@ "git_submodule_add_finalize": { "type": "function", "file": "git2/submodule.h", - "line": 315, - "lineto": 315, + "line": 324, + "lineto": 324, "args": [ { "name": "submodule", @@ -22147,8 +22681,8 @@ "git_submodule_add_to_index": { "type": "function", "file": "git2/submodule.h", - "line": 327, - "lineto": 329, + "line": 336, + "lineto": 338, "args": [ { "name": "submodule", @@ -22174,8 +22708,8 @@ "git_submodule_owner": { "type": "function", "file": "git2/submodule.h", - "line": 342, - "lineto": 342, + "line": 351, + "lineto": 351, "args": [ { "name": "submodule", @@ -22196,8 +22730,8 @@ "git_submodule_name": { "type": "function", "file": "git2/submodule.h", - "line": 350, - "lineto": 350, + "line": 359, + "lineto": 359, "args": [ { "name": "submodule", @@ -22216,15 +22750,15 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_name-20" + "ex/v1.3.0/status.html#git_submodule_name-20" ] } }, "git_submodule_path": { "type": "function", "file": "git2/submodule.h", - "line": 361, - "lineto": 361, + "line": 370, + "lineto": 370, "args": [ { "name": "submodule", @@ -22243,15 +22777,15 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_path-21" + "ex/v1.3.0/status.html#git_submodule_path-21" ] } }, "git_submodule_url": { "type": "function", "file": "git2/submodule.h", - "line": 369, - "lineto": 369, + "line": 378, + "lineto": 378, "args": [ { "name": "submodule", @@ -22272,8 +22806,8 @@ "git_submodule_resolve_url": { "type": "function", "file": "git2/submodule.h", - "line": 379, - "lineto": 379, + "line": 388, + "lineto": 388, "args": [ { "name": "out", @@ -22304,8 +22838,8 @@ "git_submodule_branch": { "type": "function", "file": "git2/submodule.h", - "line": 387, - "lineto": 387, + "line": 396, + "lineto": 396, "args": [ { "name": "submodule", @@ -22326,8 +22860,8 @@ "git_submodule_set_branch": { "type": "function", "file": "git2/submodule.h", - "line": 400, - "lineto": 400, + "line": 409, + "lineto": 409, "args": [ { "name": "repo", @@ -22358,8 +22892,8 @@ "git_submodule_set_url": { "type": "function", "file": "git2/submodule.h", - "line": 414, - "lineto": 414, + "line": 423, + "lineto": 423, "args": [ { "name": "repo", @@ -22390,8 +22924,8 @@ "git_submodule_index_id": { "type": "function", "file": "git2/submodule.h", - "line": 422, - "lineto": 422, + "line": 431, + "lineto": 431, "args": [ { "name": "submodule", @@ -22412,8 +22946,8 @@ "git_submodule_head_id": { "type": "function", "file": "git2/submodule.h", - "line": 430, - "lineto": 430, + "line": 439, + "lineto": 439, "args": [ { "name": "submodule", @@ -22434,8 +22968,8 @@ "git_submodule_wd_id": { "type": "function", "file": "git2/submodule.h", - "line": 443, - "lineto": 443, + "line": 452, + "lineto": 452, "args": [ { "name": "submodule", @@ -22456,8 +22990,8 @@ "git_submodule_ignore": { "type": "function", "file": "git2/submodule.h", - "line": 468, - "lineto": 469, + "line": 477, + "lineto": 478, "args": [ { "name": "submodule", @@ -22478,8 +23012,8 @@ "git_submodule_set_ignore": { "type": "function", "file": "git2/submodule.h", - "line": 481, - "lineto": 484, + "line": 490, + "lineto": 493, "args": [ { "name": "repo", @@ -22510,8 +23044,8 @@ "git_submodule_update_strategy": { "type": "function", "file": "git2/submodule.h", - "line": 496, - "lineto": 497, + "line": 505, + "lineto": 506, "args": [ { "name": "submodule", @@ -22532,8 +23066,8 @@ "git_submodule_set_update": { "type": "function", "file": "git2/submodule.h", - "line": 509, - "lineto": 512, + "line": 518, + "lineto": 521, "args": [ { "name": "repo", @@ -22564,8 +23098,8 @@ "git_submodule_fetch_recurse_submodules": { "type": "function", "file": "git2/submodule.h", - "line": 525, - "lineto": 526, + "line": 534, + "lineto": 535, "args": [ { "name": "submodule", @@ -22586,8 +23120,8 @@ "git_submodule_set_fetch_recurse_submodules": { "type": "function", "file": "git2/submodule.h", - "line": 538, - "lineto": 541, + "line": 547, + "lineto": 550, "args": [ { "name": "repo", @@ -22618,8 +23152,8 @@ "git_submodule_init": { "type": "function", "file": "git2/submodule.h", - "line": 556, - "lineto": 556, + "line": 565, + "lineto": 565, "args": [ { "name": "submodule", @@ -22645,8 +23179,8 @@ "git_submodule_repo_init": { "type": "function", "file": "git2/submodule.h", - "line": 571, - "lineto": 574, + "line": 580, + "lineto": 583, "args": [ { "name": "out", @@ -22677,8 +23211,8 @@ "git_submodule_sync": { "type": "function", "file": "git2/submodule.h", - "line": 584, - "lineto": 584, + "line": 593, + "lineto": 593, "args": [ { "name": "submodule", @@ -22699,8 +23233,8 @@ "git_submodule_open": { "type": "function", "file": "git2/submodule.h", - "line": 598, - "lineto": 600, + "line": 607, + "lineto": 609, "args": [ { "name": "repo", @@ -22726,8 +23260,8 @@ "git_submodule_reload": { "type": "function", "file": "git2/submodule.h", - "line": 612, - "lineto": 612, + "line": 621, + "lineto": 621, "args": [ { "name": "submodule", @@ -22753,8 +23287,8 @@ "git_submodule_status": { "type": "function", "file": "git2/submodule.h", - "line": 628, - "lineto": 632, + "line": 637, + "lineto": 641, "args": [ { "name": "status", @@ -22788,15 +23322,15 @@ "group": "submodule", "examples": { "status.c": [ - "ex/HEAD/status.html#git_submodule_status-22" + "ex/v1.3.0/status.html#git_submodule_status-22" ] } }, "git_submodule_location": { "type": "function", "file": "git2/submodule.h", - "line": 648, - "lineto": 650, + "line": 657, + "lineto": 659, "args": [ { "name": "location_status", @@ -22852,7 +23386,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_lookup-83" + "ex/v1.3.0/general.html#git_tag_lookup-83" ] } }, @@ -22916,7 +23450,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_free-84" + "ex/v1.3.0/general.html#git_tag_free-84" ] } }, @@ -22992,7 +23526,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tag_target-85" + "ex/v1.3.0/general.html#git_tag_target-85" ] } }, @@ -23019,7 +23553,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_target_id-31" + "ex/v1.3.0/cat-file.html#git_tag_target_id-31" ] } }, @@ -23046,10 +23580,10 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_target_type-32" + "ex/v1.3.0/cat-file.html#git_tag_target_type-32" ], "general.c": [ - "ex/HEAD/general.html#git_tag_target_type-86" + "ex/v1.3.0/general.html#git_tag_target_type-86" ] } }, @@ -23076,13 +23610,13 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_name-33" + "ex/v1.3.0/cat-file.html#git_tag_name-33" ], "general.c": [ - "ex/HEAD/general.html#git_tag_name-87" + "ex/v1.3.0/general.html#git_tag_name-87" ], "tag.c": [ - "ex/HEAD/tag.html#git_tag_name-16" + "ex/v1.3.0/tag.html#git_tag_name-16" ] } }, @@ -23109,7 +23643,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_tagger-34" + "ex/v1.3.0/cat-file.html#git_tag_tagger-34" ] } }, @@ -23136,14 +23670,14 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tag_message-35", - "ex/HEAD/cat-file.html#git_tag_message-36" + "ex/v1.3.0/cat-file.html#git_tag_message-35", + "ex/v1.3.0/cat-file.html#git_tag_message-36" ], "general.c": [ - "ex/HEAD/general.html#git_tag_message-88" + "ex/v1.3.0/general.html#git_tag_message-88" ], "tag.c": [ - "ex/HEAD/tag.html#git_tag_message-17" + "ex/v1.3.0/tag.html#git_tag_message-17" ] } }, @@ -23200,7 +23734,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_create-18" + "ex/v1.3.0/tag.html#git_tag_create-18" ] } }, @@ -23331,7 +23865,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_create_lightweight-19" + "ex/v1.3.0/tag.html#git_tag_create_lightweight-19" ] } }, @@ -23363,7 +23897,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_delete-20" + "ex/v1.3.0/tag.html#git_tag_delete-20" ] } }, @@ -23427,7 +23961,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/HEAD/tag.html#git_tag_list_match-21" + "ex/v1.3.0/tag.html#git_tag_list_match-21" ] } }, @@ -23845,17 +24379,17 @@ "group": "tree", "examples": { "commit.c": [ - "ex/HEAD/commit.html#git_tree_lookup-10" + "ex/v1.3.0/commit.html#git_tree_lookup-10" ], "general.c": [ - "ex/HEAD/general.html#git_tree_lookup-89", - "ex/HEAD/general.html#git_tree_lookup-90" + "ex/v1.3.0/general.html#git_tree_lookup-89", + "ex/v1.3.0/general.html#git_tree_lookup-90" ], "init.c": [ - "ex/HEAD/init.html#git_tree_lookup-12" + "ex/v1.3.0/init.html#git_tree_lookup-12" ], "merge.c": [ - "ex/HEAD/merge.html#git_tree_lookup-37" + "ex/v1.3.0/merge.html#git_tree_lookup-37" ] } }, @@ -23919,25 +24453,25 @@ "group": "tree", "examples": { "commit.c": [ - "ex/HEAD/commit.html#git_tree_free-11" + "ex/v1.3.0/commit.html#git_tree_free-11" ], "diff.c": [ - "ex/HEAD/diff.html#git_tree_free-18", - "ex/HEAD/diff.html#git_tree_free-19" + "ex/v1.3.0/diff.html#git_tree_free-18", + "ex/v1.3.0/diff.html#git_tree_free-19" ], "general.c": [ - "ex/HEAD/general.html#git_tree_free-91", - "ex/HEAD/general.html#git_tree_free-92" + "ex/v1.3.0/general.html#git_tree_free-91", + "ex/v1.3.0/general.html#git_tree_free-92" ], "init.c": [ - "ex/HEAD/init.html#git_tree_free-13" + "ex/v1.3.0/init.html#git_tree_free-13" ], "log.c": [ - "ex/HEAD/log.html#git_tree_free-55", - "ex/HEAD/log.html#git_tree_free-56", - "ex/HEAD/log.html#git_tree_free-57", - "ex/HEAD/log.html#git_tree_free-58", - "ex/HEAD/log.html#git_tree_free-59" + "ex/v1.3.0/log.html#git_tree_free-55", + "ex/v1.3.0/log.html#git_tree_free-56", + "ex/v1.3.0/log.html#git_tree_free-57", + "ex/v1.3.0/log.html#git_tree_free-58", + "ex/v1.3.0/log.html#git_tree_free-59" ] } }, @@ -24008,10 +24542,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entrycount-37" + "ex/v1.3.0/cat-file.html#git_tree_entrycount-37" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entrycount-93" + "ex/v1.3.0/general.html#git_tree_entrycount-93" ] } }, @@ -24043,7 +24577,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_entry_byname-94" + "ex/v1.3.0/general.html#git_tree_entry_byname-94" ] } }, @@ -24075,10 +24609,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_byindex-38" + "ex/v1.3.0/cat-file.html#git_tree_entry_byindex-38" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entry_byindex-95" + "ex/v1.3.0/general.html#git_tree_entry_byindex-95" ] } }, @@ -24213,11 +24747,11 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_name-39" + "ex/v1.3.0/cat-file.html#git_tree_entry_name-39" ], "general.c": [ - "ex/HEAD/general.html#git_tree_entry_name-96", - "ex/HEAD/general.html#git_tree_entry_name-97" + "ex/v1.3.0/general.html#git_tree_entry_name-96", + "ex/v1.3.0/general.html#git_tree_entry_name-97" ] } }, @@ -24244,7 +24778,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_id-40" + "ex/v1.3.0/cat-file.html#git_tree_entry_id-40" ] } }, @@ -24271,7 +24805,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_type-41" + "ex/v1.3.0/cat-file.html#git_tree_entry_type-41" ] } }, @@ -24298,7 +24832,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/HEAD/cat-file.html#git_tree_entry_filemode-42" + "ex/v1.3.0/cat-file.html#git_tree_entry_filemode-42" ] } }, @@ -24384,7 +24918,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/HEAD/general.html#git_tree_entry_to_object-98" + "ex/v1.3.0/general.html#git_tree_entry_to_object-98" ] } }, @@ -24558,8 +25092,8 @@ "git_treebuilder_remove": { "type": "function", "file": "git2/tree.h", - "line": 338, - "lineto": 339, + "line": 339, + "lineto": 340, "args": [ { "name": "bld", @@ -24576,7 +25110,7 @@ "sig": "git_treebuilder *::const char *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, "description": "

Remove an entry from the builder by its filename

\n", "comments": "", @@ -24585,8 +25119,8 @@ "git_treebuilder_filter": { "type": "function", "file": "git2/tree.h", - "line": 363, - "lineto": 366, + "line": 364, + "lineto": 367, "args": [ { "name": "bld", @@ -24617,8 +25151,8 @@ "git_treebuilder_write": { "type": "function", "file": "git2/tree.h", - "line": 378, - "lineto": 379, + "line": 379, + "lineto": 380, "args": [ { "name": "id", @@ -24644,8 +25178,8 @@ "git_tree_walk": { "type": "function", "file": "git2/tree.h", - "line": 408, - "lineto": 412, + "line": 409, + "lineto": 413, "args": [ { "name": "tree", @@ -24681,8 +25215,8 @@ "git_tree_dup": { "type": "function", "file": "git2/tree.h", - "line": 421, - "lineto": 421, + "line": 422, + "lineto": 422, "args": [ { "name": "out", @@ -24708,8 +25242,8 @@ "git_tree_create_updated": { "type": "function", "file": "git2/tree.h", - "line": 467, - "lineto": 467, + "line": 469, + "lineto": 469, "args": [ { "name": "out", @@ -24741,7 +25275,7 @@ "sig": "git_oid *::git_repository *::git_tree *::size_t::const git_tree_update *", "return": { "type": "int", - "comment": null + "comment": " 0 or an error code" }, "description": "

Create a tree based on another one with the specified modifications

\n", "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", @@ -25069,8 +25603,8 @@ "git_worktree_prune_options_init": { "type": "function", "file": "git2/worktree.h", - "line": 217, - "lineto": 219, + "line": 218, + "lineto": 220, "args": [ { "name": "opts", @@ -25096,8 +25630,8 @@ "git_worktree_is_prunable": { "type": "function", "file": "git2/worktree.h", - "line": 235, - "lineto": 236, + "line": 236, + "lineto": 237, "args": [ { "name": "wt", @@ -25123,8 +25657,8 @@ "git_worktree_prune": { "type": "function", "file": "git2/worktree.h", - "line": 250, - "lineto": 251, + "line": 251, + "lineto": 252, "args": [ { "name": "wt", @@ -25204,8 +25738,8 @@ "git_attr_foreach_cb": { "type": "callback", "file": "git2/attr.h", - "line": 212, - "lineto": 212, + "line": 287, + "lineto": 287, "args": [ { "name": "name", @@ -25235,12 +25769,12 @@ "git_transport_certificate_check_cb": { "type": "callback", "file": "git2/cert.h", - "line": 71, - "lineto": 71, + "line": 72, + "lineto": 72, "args": [ { "name": "cert", - "type": "struct git_cert *", + "type": "git_cert *", "comment": "The host certificate" }, { @@ -25259,8 +25793,8 @@ "comment": "Payload provided by the caller" } ], - "argline": "struct git_cert *cert, int valid, const char *host, void *payload", - "sig": "struct git_cert *::int::const char *::void *", + "argline": "git_cert *cert, int valid, const char *host, void *payload", + "sig": "git_cert *::int::const char *::void *", "return": { "type": "int", "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" @@ -25271,8 +25805,8 @@ "git_checkout_notify_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 236, - "lineto": 242, + "line": 252, + "lineto": 258, "args": [ { "name": "why", @@ -25317,8 +25851,8 @@ "git_checkout_progress_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 245, - "lineto": 249, + "line": 261, + "lineto": 265, "args": [ { "name": "path", @@ -25353,8 +25887,8 @@ "git_checkout_perfdata_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 252, - "lineto": 254, + "line": 268, + "lineto": 270, "args": [ { "name": "perfdata", @@ -25453,41 +25987,66 @@ "description": "

The signature of a function matchin git_repository_init, with an\n aditional void * as callback payload.

\n", "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" }, - "git_commit_signing_cb": { + "git_commit_create_cb": { "type": "callback", "file": "git2/commit.h", - "line": 523, - "lineto": 524, + "line": 531, + "lineto": 540, "args": [ { - "name": "signature", - "type": "git_buf *", - "comment": null + "name": "out", + "type": "git_oid *", + "comment": "pointer that this callback will populate with the object\n id of the commit that is created" }, { - "name": "signature_field", - "type": "git_buf *", - "comment": null + "name": "author", + "type": "const git_signature *", + "comment": "the author name and time of the commit" }, { - "name": "commit_content", + "name": "committer", + "type": "const git_signature *", + "comment": "the committer name and time of the commit" + }, + { + "name": "message_encoding", "type": "const char *", - "comment": null + "comment": "the encoding of the given message, or NULL\n to assume UTF8" + }, + { + "name": "message", + "type": "const char *", + "comment": "the commit message" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "the tree to be committed" + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "the number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "the commit parents" }, { "name": "payload", "type": "void *", - "comment": null + "comment": "the payload pointer in the rebase options" } ], - "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", - "sig": "git_buf *::git_buf *::const char *::void *", + "argline": "git_oid *out, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents, void *payload", + "sig": "git_oid *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]::void *", "return": { "type": "int", - "comment": null + "comment": " 0 if this callback has created the commit and populated the out\n parameter, GIT_PASSTHROUGH if the callback has not created a\n commit and wants the calling function to create the commit as\n if no callback had been specified, any other value to stop\n and return a failure" }, - "description": "

Commit signing callback.

\n", - "comments": "

The callback will be called with the commit content, giving a user an opportunity to sign the commit content. The signature_field buf may be left empty to specify the default field "gpgsig".

\n\n

Signatures can take the form of any string, and can be created on an arbitrary header field. Signatures are most commonly used for verifying authorship of a commit using GPG or a similar cryptographically secure signing algorithm. See https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work for more details.

\n\n

When the callback: - returns GIT_PASSTHROUGH, no signature will be added to the commit. - returns < 0, commit creation will be aborted. - returns GIT_OK, the signature parameter is expected to be filled.

\n" + "description": "

Commit creation callback: used when a function is going to create\n commits (for example, in git_rebase_commit) to allow callers to\n override the commit creation behavior. For example, users may\n wish to sign commits by providing this information to\n git_commit_create_buffer, signing that buffer, then calling\n git_commit_create_with_signature. The resultant commit id\n should be set in the out object id parameter.

\n", + "comments": "" }, "git_config_foreach_cb": { "type": "callback", @@ -25556,11 +26115,47 @@ "description": "

Credential acquisition callback.

\n", "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" }, + "git_commit_signing_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 276, + "lineto": 280, + "args": [ + { + "name": "signature", + "type": "git_buf *", + "comment": null + }, + { + "name": "signature_field", + "type": "git_buf *", + "comment": null + }, + { + "name": "commit_content", + "type": "const char *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", + "sig": "git_buf *::git_buf *::const char *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Provide a commit signature during commit creation.

\n", + "comments": "

Callers should instead define a git_commit_create_cb that generates a commit buffer using git_commit_create_buffer, sign that buffer and call git_commit_create_with_signature.

\n" + }, "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 617, - "lineto": 617, + "line": 847, + "lineto": 847, "args": [ { "name": "rhead", @@ -25585,8 +26180,8 @@ "git_diff_notify_cb": { "type": "callback", "file": "git2/diff.h", - "line": 331, - "lineto": 335, + "line": 345, + "lineto": 349, "args": [ { "name": "diff_so_far", @@ -25621,8 +26216,8 @@ "git_diff_progress_cb": { "type": "callback", "file": "git2/diff.h", - "line": 347, - "lineto": 351, + "line": 361, + "lineto": 365, "args": [ { "name": "diff_so_far", @@ -25657,8 +26252,8 @@ "git_diff_file_cb": { "type": "callback", "file": "git2/diff.h", - "line": 465, - "lineto": 468, + "line": 479, + "lineto": 482, "args": [ { "name": "delta", @@ -25688,8 +26283,8 @@ "git_diff_binary_cb": { "type": "callback", "file": "git2/diff.h", - "line": 531, - "lineto": 534, + "line": 545, + "lineto": 548, "args": [ { "name": "delta", @@ -25719,8 +26314,8 @@ "git_diff_hunk_cb": { "type": "callback", "file": "git2/diff.h", - "line": 557, - "lineto": 560, + "line": 571, + "lineto": 574, "args": [ { "name": "delta", @@ -25750,8 +26345,8 @@ "git_diff_line_cb": { "type": "callback", "file": "git2/diff.h", - "line": 618, - "lineto": 622, + "line": 632, + "lineto": 636, "args": [ { "name": "delta", @@ -25823,7 +26418,7 @@ { "name": "stats", "type": "const git_indexer_progress *", - "comment": "Structure containing information about the state of the tran sfer" + "comment": "Structure containing information about the state of the transfer" }, { "name": "payload", @@ -25967,8 +26562,8 @@ "git_reference_foreach_cb": { "type": "callback", "file": "git2/refs.h", - "line": 434, - "lineto": 434, + "line": 437, + "lineto": 437, "args": [ { "name": "reference", @@ -25993,8 +26588,8 @@ "git_reference_foreach_name_cb": { "type": "callback", "file": "git2/refs.h", - "line": 445, - "lineto": 445, + "line": 448, + "lineto": 448, "args": [ { "name": "name", @@ -26019,8 +26614,8 @@ "git_push_transfer_progress_cb": { "type": "callback", "file": "git2/remote.h", - "line": 427, - "lineto": 431, + "line": 450, + "lineto": 454, "args": [ { "name": "current", @@ -26055,8 +26650,8 @@ "git_push_negotiation": { "type": "callback", "file": "git2/remote.h", - "line": 463, - "lineto": 463, + "line": 486, + "lineto": 486, "args": [ { "name": "updates", @@ -26086,8 +26681,8 @@ "git_push_update_reference_cb": { "type": "callback", "file": "git2/remote.h", - "line": 477, - "lineto": 477, + "line": 500, + "lineto": 500, "args": [ { "name": "refname", @@ -26117,8 +26712,8 @@ "git_url_resolve_cb": { "type": "callback", "file": "git2/remote.h", - "line": 491, - "lineto": 491, + "line": 516, + "lineto": 516, "args": [ { "name": "url_resolved", @@ -26145,11 +26740,42 @@ "sig": "git_buf *::const char *::int::void *", "return": { "type": "int", - "comment": " 0 on success, GIT_PASSTHROUGH or an error" + "comment": " 0 on success, GIT_PASSTHROUGH or an error\n " }, "description": "

Callback to resolve URLs before connecting to remote

\n", "comments": "

If you return GIT_PASSTHROUGH, you don't need to write anything to url_resolved.

\n" }, + "git_remote_ready_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 529, + "lineto": 529, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "The remote to be connected" + }, + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_remote *remote, int direction, void *payload", + "sig": "git_remote *::int::void *", + "return": { + "type": "int", + "comment": " 0 on success, or an error" + }, + "description": "

Callback invoked immediately before we attempt to connect to the\n given url. Callers may change the URL before the connection by\n calling git_remote_set_instance_url in the callback.

\n", + "comments": "" + }, "git_repository_fetchhead_foreach_cb": { "type": "callback", "file": "git2/repository.h", @@ -26489,8 +27115,8 @@ "git_treebuilder_filter_cb": { "type": "callback", "file": "git2/tree.h", - "line": 348, - "lineto": 349, + "line": 349, + "lineto": 350, "args": [ { "name": "entry", @@ -26515,8 +27141,8 @@ "git_treewalk_cb": { "type": "callback", "file": "git2/tree.h", - "line": 382, - "lineto": 383, + "line": 383, + "lineto": 384, "args": [ { "name": "root", @@ -26553,8 +27179,8 @@ "type": "struct", "value": "git_annotated_commit", "file": "git2/types.h", - "line": 189, - "lineto": 189, + "line": 198, + "lineto": 198, "tdef": "typedef", "description": " Annotated commits, the input to merge and rebase. ", "comments": "", @@ -26617,8 +27243,8 @@ ], "type": "enum", "file": "git2/apply.h", - "line": 112, - "lineto": 130, + "line": 113, + "lineto": 131, "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", "tdef": "typedef", "description": " Possible application locations for git_apply ", @@ -26706,6 +27332,56 @@ } } ], + [ + "git_attr_options", + { + "decl": [ + "unsigned int version", + "unsigned int flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_attr_options", + "file": "git2/attr.h", + "line": 144, + "lineto": 161, + "block": "unsigned int version\nunsigned int flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " An options structure for querying attributes.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " A combination of GIT_ATTR_CHECK flags " + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": "" + }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_ATTR_CHECK_INCLUDE_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": [ + "git_attr_foreach_ext", + "git_attr_get_ext", + "git_attr_get_many_ext" + ] + } + } + ], [ "git_attr_value_t", { @@ -26764,8 +27440,8 @@ "type": "struct", "value": "git_blame", "file": "git2/blame.h", - "line": 151, - "lineto": 151, + "line": 202, + "lineto": 202, "tdef": "typedef", "description": " Opaque structure to hold blame results ", "comments": "", @@ -26803,7 +27479,7 @@ "type": "enum", "file": "git2/blame.h", "line": 26, - "lineto": 52, + "lineto": 77, "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", "tdef": "typedef", "description": " Flags for indicating option behavior for git_blame APIs.", @@ -26818,37 +27494,37 @@ { "type": "int", "name": "GIT_BLAME_TRACK_COPIES_SAME_FILE", - "comments": "

Track lines that have moved within a file (like git blame -M).\n NOT IMPLEMENTED.

\n", + "comments": "

Track lines that have moved within a file (like git blame -M).

\n\n

This is not yet implemented and reserved for future use.

\n", "value": 1 }, { "type": "int", "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", - "comments": "

Track lines that have moved across files in the same commit (like git blame -C).\n NOT IMPLEMENTED.

\n", + "comments": "

Track lines that have moved across files in the same commit\n (like git blame -C).

\n\n

This is not yet implemented and reserved for future use.

\n", "value": 2 }, { "type": "int", "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", - "comments": "

Track lines that have been copied from another file that exists in the\n same commit (like git blame -CC). Implies SAME_FILE.\n NOT IMPLEMENTED.

\n", + "comments": "

Track lines that have been copied from another file that exists\n in the same commit (like git blame -CC). Implies SAME_FILE.

\n\n

This is not yet implemented and reserved for future use.

\n", "value": 4 }, { "type": "int", "name": "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", - "comments": "

Track lines that have been copied from another file that exists in any\n commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.\n NOT IMPLEMENTED.

\n", + "comments": "

Track lines that have been copied from another file that exists in\n any commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.

\n\n

This is not yet implemented and reserved for future use.

\n", "value": 8 }, { "type": "int", "name": "GIT_BLAME_FIRST_PARENT", - "comments": "

Restrict the search of commits to those reachable following only the\n first parents.

\n", + "comments": "

Restrict the search of commits to those reachable following only\n the first parents.

\n", "value": 16 }, { "type": "int", "name": "GIT_BLAME_USE_MAILMAP", - "comments": "

Use mailmap file to map author and committer names and email addresses\n to canonical real names and email addresses. The mailmap will be read\n from the working directory, or HEAD in a bare repository.

\n", + "comments": "

Use mailmap file to map author and committer names and email\n addresses to canonical real names and email addresses. The\n mailmap will be read from the working directory, or HEAD in a\n bare repository.

\n", "value": 32 }, { @@ -26881,57 +27557,57 @@ "type": "struct", "value": "git_blame_hunk", "file": "git2/blame.h", - "line": 134, - "lineto": 147, + "line": 145, + "lineto": 198, "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", "tdef": "typedef", "description": " Structure that represents a blame hunk.", - "comments": "
    \n
  • lines_in_hunk is the number of lines in this hunk - final_commit_id is the OID of the commit where this line was last changed. - final_start_line_number is the 1-based line number where this hunk begins, in the final version of the file - final_signature is the author of final_commit_id. If GIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical real name and email address. - orig_commit_id is the OID of the commit where this hunk was found. This will usually be the same as final_commit_id, except when GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES has been specified. - orig_path is the path to the file where this hunk originated, as of the commit specified by orig_commit_id. - orig_start_line_number is the 1-based line number where this hunk begins in the file named by orig_path in the commit specified by orig_commit_id. - orig_signature is the author of orig_commit_id. If GIT_BLAME_USE_MAILMAP has been specified, it will contain the canonical real name and email address. - boundary is 1 iff the hunk has been tracked to a boundary commit (the root, or the commit specified in git_blame_options.oldest_commit)
  • \n
\n", + "comments": "", "fields": [ { "type": "size_t", "name": "lines_in_hunk", - "comments": "" + "comments": " The number of lines in this hunk." }, { "type": "git_oid", "name": "final_commit_id", - "comments": "" + "comments": " The OID of the commit where this line was last changed." }, { "type": "size_t", "name": "final_start_line_number", - "comments": "" + "comments": " The 1-based line number where this hunk begins, in the final version\n of the file." }, { "type": "git_signature *", "name": "final_signature", - "comments": "" + "comments": " The author of `final_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." }, { "type": "git_oid", "name": "orig_commit_id", - "comments": "" + "comments": " The OID of the commit where this hunk was found.\n This will usually be the same as `final_commit_id`, except when\n `GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES` has been specified." }, { "type": "const char *", "name": "orig_path", - "comments": "" + "comments": " The path to the file where this hunk originated, as of the commit\n specified by `orig_commit_id`." }, { "type": "size_t", "name": "orig_start_line_number", - "comments": "" + "comments": " The 1-based line number where this hunk begins in the file named by\n `orig_path` in the commit specified by `orig_commit_id`." }, { "type": "git_signature *", "name": "orig_signature", - "comments": "" + "comments": " The author of `orig_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." }, { "type": "char", "name": "boundary", - "comments": "" + "comments": " The 1 iff the hunk has been tracked to a boundary commit (the root,\n or the commit specified in git_blame_options.oldest_commit)" } ], "used": { @@ -26958,8 +27634,8 @@ "type": "struct", "value": "git_blame_options", "file": "git2/blame.h", - "line": 61, - "lineto": 90, + "line": 86, + "lineto": 123, "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", "tdef": "typedef", "description": " Blame options structure", @@ -26978,7 +27654,7 @@ { "type": "uint16_t", "name": "min_match_characters", - "comments": " The lower bound on the number of alphanumeric\n characters that must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value is 20.\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." + "comments": " The lower bound on the number of alphanumeric characters that\n must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value\n is 20.\n\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." }, { "type": "git_oid", @@ -27018,8 +27694,8 @@ "type": "struct", "value": "git_blob", "file": "git2/types.h", - "line": 124, - "lineto": 124, + "line": 133, + "lineto": 133, "tdef": "typedef", "description": " In-memory representation of a blob object. ", "comments": "", @@ -27042,6 +27718,7 @@ "git_diff_blobs", "git_filter_list_apply_to_blob", "git_filter_list_load", + "git_filter_list_load_ext", "git_filter_list_stream_blob", "git_patch_from_blob_and_buffer", "git_patch_from_blobs" @@ -27055,13 +27732,14 @@ "decl": [ "GIT_BLOB_FILTER_CHECK_FOR_BINARY", "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", - "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD" + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT" ], "type": "enum", "file": "git2/blob.h", "line": 102, - "lineto": 117, - "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "lineto": 123, + "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", "tdef": "typedef", "description": " Flags to control the functionality of `git_blob_filter`.", "comments": "", @@ -27083,6 +27761,12 @@ "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", "value": 4 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the specified commit.

\n", + "value": 8 } ], "used": { @@ -27096,14 +27780,16 @@ { "decl": [ "int version", - "uint32_t flags" + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" ], "type": "struct", "value": "git_blob_filter_options", "file": "git2/blob.h", - "line": 126, - "lineto": 131, - "block": "int version\nuint32_t flags", + "line": 132, + "lineto": 149, + "block": "int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", "tdef": "typedef", "description": " The options used when applying filter options to a file.", "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n", @@ -27117,6 +27803,16 @@ "type": "uint32_t", "name": "flags", "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above " + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": "" + }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." } ], "used": { @@ -27160,8 +27856,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 206, - "lineto": 210, + "line": 215, + "lineto": 219, "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", "tdef": "typedef", "description": " Basic type of any Git branch. ", @@ -27236,6 +27932,7 @@ "git_blob_filter", "git_blob_filtered_content", "git_branch_remote_name", + "git_branch_upstream_merge", "git_branch_upstream_name", "git_branch_upstream_remote", "git_buf_contains_nul", @@ -27261,6 +27958,7 @@ "git_diff_stats_to_buf", "git_diff_to_buf", "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_stream_data", @@ -27290,8 +27988,8 @@ "type": "struct", "value": "git_cert", "file": "git2/types.h", - "line": 253, - "lineto": 253, + "line": 262, + "lineto": 262, "block": "git_cert_t cert_type", "tdef": "typedef", "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", @@ -27315,7 +28013,7 @@ "git_cert_hostkey", { "decl": [ - "struct git_cert parent", + "git_cert parent", "git_cert_ssh_t type", "unsigned char [16] hash_md5", "unsigned char [20] hash_sha1", @@ -27327,15 +28025,15 @@ "type": "struct", "value": "git_cert_hostkey", "file": "git2/cert.h", - "line": 107, - "lineto": 150, - "block": "struct git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", + "line": 108, + "lineto": 151, + "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", "tdef": "typedef", "description": " Hostkey information taken from libssh2", "comments": "", "fields": [ { - "type": "struct git_cert", + "type": "git_cert", "name": "parent", "comments": " The parent cert " }, @@ -27392,8 +28090,8 @@ ], "type": "enum", "file": "git2/cert.h", - "line": 76, - "lineto": 85, + "line": 77, + "lineto": 86, "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256\nGIT_CERT_SSH_RAW", "tdef": "typedef", "description": " Type of SSH host fingerprint", @@ -27441,8 +28139,8 @@ ], "type": "enum", "file": "git2/cert.h", - "line": 24, - "lineto": 47, + "line": 25, + "lineto": 48, "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", "tdef": "typedef", "description": " Type of host certificate structure that is passed to the check callback", @@ -27483,22 +28181,22 @@ "git_cert_x509", { "decl": [ - "struct git_cert parent", + "git_cert parent", "void * data", "size_t len" ], "type": "struct", "value": "git_cert_x509", "file": "git2/cert.h", - "line": 155, - "lineto": 167, - "block": "struct git_cert parent\nvoid * data\nsize_t len", + "line": 156, + "lineto": 168, + "block": "git_cert parent\nvoid * data\nsize_t len", "tdef": "typedef", "description": " X.509 certificate information", "comments": "", "fields": [ { - "type": "struct git_cert", + "type": "git_cert", "name": "parent", "comments": " The parent cert " }, @@ -27533,12 +28231,12 @@ ], "type": "enum", "file": "git2/checkout.h", - "line": 217, - "lineto": 226, + "line": 211, + "lineto": 242, "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", "tdef": "typedef", "description": " Checkout notification flags", - "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n
    \n
  • GIT_CHECKOUT_NOTIFY_CONFLICT invokes checkout on conflicting paths.

  • \n
  • GIT_CHECKOUT_NOTIFY_DIRTY notifies about "dirty" files, i.e. those that do not need an update but no longer match the baseline. Core git displays these files when checkout runs, but won't stop the checkout.

  • \n
  • GIT_CHECKOUT_NOTIFY_UPDATED sends notification for any file changed.

  • \n
  • GIT_CHECKOUT_NOTIFY_UNTRACKED notifies about untracked files.

  • \n
  • GIT_CHECKOUT_NOTIFY_IGNORED notifies about ignored files.

  • \n
\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", + "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", "fields": [ { "type": "int", @@ -27549,37 +28247,37 @@ { "type": "int", "name": "GIT_CHECKOUT_NOTIFY_CONFLICT", - "comments": "", + "comments": "

Invokes checkout on conflicting paths.

\n", "value": 1 }, { "type": "int", "name": "GIT_CHECKOUT_NOTIFY_DIRTY", - "comments": "", + "comments": "

Notifies about "dirty" files, i.e. those that do not need an update\n but no longer match the baseline. Core git displays these files when\n checkout runs, but won't stop the checkout.

\n", "value": 2 }, { "type": "int", "name": "GIT_CHECKOUT_NOTIFY_UPDATED", - "comments": "", + "comments": "

Sends notification for any file changed.

\n", "value": 4 }, { "type": "int", "name": "GIT_CHECKOUT_NOTIFY_UNTRACKED", - "comments": "", + "comments": "

Notifies about untracked files.

\n", "value": 8 }, { "type": "int", "name": "GIT_CHECKOUT_NOTIFY_IGNORED", - "comments": "", + "comments": "

Notifies about ignored files.

\n", "value": 16 }, { "type": "int", "name": "GIT_CHECKOUT_NOTIFY_ALL", - "comments": "", + "comments": "

Notifies about ignored files.

\n", "value": 65535 } ], @@ -27619,8 +28317,8 @@ "type": "struct", "value": "git_checkout_options", "file": "git2/checkout.h", - "line": 263, - "lineto": 326, + "line": 279, + "lineto": 342, "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", "tdef": "typedef", "description": " Checkout options structure", @@ -27752,8 +28450,8 @@ "type": "struct", "value": "git_checkout_perfdata", "file": "git2/checkout.h", - "line": 229, - "lineto": 233, + "line": 245, + "lineto": 249, "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", "tdef": "typedef", "description": " Checkout performance-reporting structure ", @@ -27807,14 +28505,15 @@ "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", "GIT_CHECKOUT_DONT_REMOVE_EXISTING", "GIT_CHECKOUT_DONT_WRITE_INDEX", + "GIT_CHECKOUT_DRY_RUN", "GIT_CHECKOUT_UPDATE_SUBMODULES", "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" ], "type": "enum", "file": "git2/checkout.h", "line": 106, - "lineto": 189, - "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "lineto": 195, + "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", "tdef": "typedef", "description": " Checkout behavior flags", "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", @@ -27939,6 +28638,12 @@ "comments": "

Normally checkout writes the index upon completion; this prevents that.

\n", "value": 8388608 }, + { + "type": "int", + "name": "GIT_CHECKOUT_DRY_RUN", + "comments": "

Show what would be done by a checkout. Stop after sending\n notifications; don't update the working directory or index.

\n", + "value": 16777216 + }, { "type": "int", "name": "GIT_CHECKOUT_UPDATE_SUBMODULES", @@ -28148,8 +28853,8 @@ "type": "struct", "value": "git_commit", "file": "git2/types.h", - "line": 127, - "lineto": 127, + "line": 136, + "lineto": 136, "tdef": "typedef", "description": " Parsed representation of a commit object. ", "comments": "", @@ -28167,6 +28872,7 @@ "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", + "git_commit_create_cb", "git_commit_dup", "git_commit_free", "git_commit_header_field", @@ -28193,12 +28899,79 @@ "git_note_commit_iterator_new", "git_note_commit_read", "git_note_commit_remove", + "git_odb_set_commit_graph", "git_revert", "git_revert_commit" ] } } ], + [ + "git_commit_graph", + { + "decl": "git_commit_graph", + "type": "struct", + "value": "git_commit_graph", + "file": "git2/types.h", + "line": 109, + "lineto": 109, + "tdef": "typedef", + "description": " A git commit-graph ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_set_commit_graph" + ] + } + } + ], + [ + "git_commit_graph_split_strategy_t", + { + "decl": [ + "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE" + ], + "type": "enum", + "file": "git2/sys/commit_graph.h", + "line": 92, + "lineto": 98, + "block": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "tdef": "typedef", + "description": " The strategy to use when adding a new set of commits to a pre-existing\n commit-graph chain.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "comments": "

Do not split commit-graph files. The other split strategy-related option\n fields are ignored.

\n", + "value": 0 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_commit_graph_writer", + { + "decl": "git_commit_graph_writer", + "type": "struct", + "value": "git_commit_graph_writer", + "file": "git2/types.h", + "line": 112, + "lineto": 112, + "tdef": "typedef", + "description": " a writer for commit-graph files. ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_config", { @@ -28206,8 +28979,8 @@ "type": "struct", "value": "git_config", "file": "git2/types.h", - "line": 148, - "lineto": 148, + "line": 157, + "lineto": 157, "tdef": "typedef", "description": " Memory representation of a set of config files ", "comments": "", @@ -28263,8 +29036,8 @@ "type": "struct", "value": "git_config_backend", "file": "git2/types.h", - "line": 151, - "lineto": 151, + "line": 160, + "lineto": 160, "tdef": "typedef", "description": " Interface to access a configuration file ", "comments": "", @@ -28774,8 +29547,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 220, - "lineto": 232, + "line": 223, + "lineto": 235, "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", "tdef": "typedef", "description": " What type of change is described by a git_diff_delta?", @@ -29040,8 +29813,8 @@ "type": "struct", "value": "git_diff", "file": "git2/diff.h", - "line": 193, - "lineto": 193, + "line": 196, + "lineto": 196, "tdef": "typedef", "description": " The diff object that contains all individual file deltas.", "comments": "

A diff represents the cumulative list of differences between two snapshots of a repository (possibly filtered by a set of file name patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of diffs then traversing it. This makes is easier to share logic across the various types of diffs (tree vs tree, workdir vs index, etc.), and also allows you to insert optional diff post-processing phases, such as rename detection, in between the steps. When you are done with a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", @@ -29119,8 +29892,8 @@ "type": "struct", "value": "git_diff_binary", "file": "git2/diff.h", - "line": 513, - "lineto": 525, + "line": 527, + "lineto": 539, "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", "tdef": "typedef", "description": " Structure describing the binary contents of a diff.", @@ -29166,8 +29939,8 @@ "type": "struct", "value": "git_diff_binary_file", "file": "git2/diff.h", - "line": 490, - "lineto": 502, + "line": 504, + "lineto": 516, "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", "tdef": "typedef", "description": " The contents of one of the files in a binary diff. ", @@ -29210,8 +29983,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 478, - "lineto": 487, + "line": 492, + "lineto": 501, "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", "tdef": "typedef", "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", @@ -29256,8 +30029,8 @@ "type": "struct", "value": "git_diff_delta", "file": "git2/diff.h", - "line": 309, - "lineto": 316, + "line": 323, + "lineto": 330, "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", "tdef": "typedef", "description": " Description of changes to one entry.", @@ -29325,42 +30098,42 @@ "type": "struct", "value": "git_diff_file", "file": "git2/diff.h", - "line": 260, - "lineto": 267, + "line": 244, + "lineto": 281, "block": "git_oid id\nconst char * path\ngit_object_size_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", "tdef": "typedef", "description": " Description of one side of a delta.", - "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n\n

The id is the git_oid of the item. If the entry represents an absent side of a diff (e.g. the old_file of a GIT_DELTA_ADDED delta), then the oid will be zeroes.

\n\n

path is the NUL-terminated path to the entry relative to the working directory of the repository.

\n\n

size is the size of the entry in bytes.

\n\n

flags is a combination of the git_diff_flag_t types

\n\n

mode is, roughly, the stat() st_mode value for the item. This will be restricted to one of the git_filemode_t values.

\n\n

The id_abbrev represents the known length of the id field, when converted to a hex string. It is generally GIT_OID_HEXSZ, unless this delta was created from reading a patch file, in which case it may be abbreviated to something reasonable, like 7 characters.

\n", + "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n", "fields": [ { "type": "git_oid", "name": "id", - "comments": "" + "comments": " The `git_oid` of the item. If the entry represents an\n absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta),\n then the oid will be zeroes." }, { "type": "const char *", "name": "path", - "comments": "" + "comments": " The NUL-terminated path to the entry relative to the working\n directory of the repository." }, { "type": "git_object_size_t", "name": "size", - "comments": "" + "comments": " The size of the entry in bytes." }, { "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " A combination of the `git_diff_flag_t` types" }, { "type": "uint16_t", "name": "mode", - "comments": "" + "comments": " Roughly, the stat() `st_mode` value for the item. This will\n be restricted to one of the `git_filemode_t` values." }, { "type": "uint16_t", "name": "id_abbrev", - "comments": "" + "comments": " Represents the known length of the `id` field, when\n converted to a hex string. It is generally `GIT_OID_HEXSZ`, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters." } ], "used": { @@ -29391,8 +30164,8 @@ "type": "struct", "value": "git_diff_find_options", "file": "git2/diff.h", - "line": 718, - "lineto": 772, + "line": 732, + "lineto": 786, "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", "tdef": "typedef", "description": " Control behavior of rename and copy detection", @@ -29471,8 +30244,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 627, - "lineto": 696, + "line": 641, + "lineto": 710, "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", "tdef": "typedef", "description": " Flags to control the behavior of diff rename/copy detection.", @@ -29592,8 +30365,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 203, - "lineto": 208, + "line": 206, + "lineto": 211, "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS", "tdef": "typedef", "description": " Flags for the delta object and the file objects on each side.", @@ -29638,9 +30411,9 @@ "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER" ], "type": "enum", - "file": "git2/diff.h", - "line": 1367, - "lineto": 1374, + "file": "git2/deprecated.h", + "line": 311, + "lineto": 318, "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", "tdef": "typedef", "description": " Formatting options for diff e-mail generation", @@ -29680,9 +30453,9 @@ ], "type": "struct", "value": "git_diff_format_email_options", - "file": "git2/diff.h", - "line": 1379, - "lineto": 1402, + "file": "git2/deprecated.h", + "line": 323, + "lineto": 346, "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", "tdef": "typedef", "description": " Options for controlling the formatting of the generated e-mail.", @@ -29751,8 +30524,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 1090, - "lineto": 1097, + "line": 1104, + "lineto": 1111, "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", "tdef": "typedef", "description": " Possible output formats for diff data", @@ -29818,8 +30591,8 @@ "type": "struct", "value": "git_diff_hunk", "file": "git2/diff.h", - "line": 545, - "lineto": 552, + "line": 559, + "lineto": 566, "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", "tdef": "typedef", "description": " Structure describing a hunk of a diff.", @@ -29886,8 +30659,8 @@ "type": "struct", "value": "git_diff_line", "file": "git2/diff.h", - "line": 600, - "lineto": 608, + "line": 614, + "lineto": 622, "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", "tdef": "typedef", "description": " Structure describing a line (or data span) of a diff.", @@ -29960,8 +30733,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 571, - "lineto": 587, + "line": 585, + "lineto": 601, "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", "tdef": "typedef", "description": " Line origin constants.", @@ -30052,6 +30825,7 @@ "GIT_DIFF_INCLUDE_UNREADABLE", "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", "GIT_DIFF_INDENT_HEURISTIC", + "GIT_DIFF_IGNORE_BLANK_LINES", "GIT_DIFF_FORCE_TEXT", "GIT_DIFF_FORCE_BINARY", "GIT_DIFF_IGNORE_WHITESPACE", @@ -30066,8 +30840,8 @@ "type": "enum", "file": "git2/diff.h", "line": 28, - "lineto": 171, - "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", + "lineto": 174, + "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_IGNORE_BLANK_LINES\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", "tdef": "typedef", "description": " Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.", "comments": "", @@ -30192,6 +30966,12 @@ "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", "value": 262144 }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_BLANK_LINES", + "comments": "

Ignore blank lines

\n", + "value": 524288 + }, { "type": "int", "name": "GIT_DIFF_FORCE_TEXT", @@ -30280,8 +31060,8 @@ "type": "struct", "value": "git_diff_options", "file": "git2/diff.h", - "line": 361, - "lineto": 433, + "line": 375, + "lineto": 447, "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", "tdef": "typedef", "description": " Structure describing options about how the diff should be executed.", @@ -30383,8 +31163,8 @@ "type": "struct", "value": "git_diff_patchid_options", "file": "git2/diff.h", - "line": 1464, - "lineto": 1466, + "line": 1385, + "lineto": 1387, "block": "unsigned int version", "tdef": "typedef", "description": " Patch ID options structure", @@ -30418,8 +31198,8 @@ "type": "struct", "value": "git_diff_similarity_metric", "file": "git2/diff.h", - "line": 701, - "lineto": 711, + "line": 715, + "lineto": 725, "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", "tdef": "typedef", "description": " Pluggable similarity metric", @@ -30464,8 +31244,8 @@ "type": "struct", "value": "git_diff_stats", "file": "git2/diff.h", - "line": 1281, - "lineto": 1281, + "line": 1295, + "lineto": 1295, "tdef": "typedef", "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", "comments": "", @@ -30494,8 +31274,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 1286, - "lineto": 1301, + "line": 1300, + "lineto": 1315, "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", "tdef": "typedef", "description": " Formatting options for diff stats", @@ -30579,6 +31359,55 @@ } } ], + [ + "git_email_create_flags_t", + { + "decl": [ + "GIT_EMAIL_CREATE_DEFAULT", + "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "GIT_EMAIL_CREATE_NO_RENAMES" + ], + "type": "enum", + "file": "git2/email.h", + "line": 23, + "lineto": 38, + "block": "GIT_EMAIL_CREATE_DEFAULT\nGIT_EMAIL_CREATE_OMIT_NUMBERS\nGIT_EMAIL_CREATE_ALWAYS_NUMBER\nGIT_EMAIL_CREATE_NO_RENAMES", + "tdef": "typedef", + "description": " Formatting options for diff e-mail generation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_EMAIL_CREATE_DEFAULT", + "comments": "

Normal patch, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "comments": "

Do not include patch numbers in the subject prefix.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "comments": "

Include numbers in the subject prefix even when the\n patch is for a single commit (1/1).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_NO_RENAMES", + "comments": "

Do not perform rename or similarity detection.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_error", { @@ -31184,8 +32013,8 @@ "type": "struct", "value": "git_fetch_options", "file": "git2/remote.h", - "line": 654, - "lineto": 691, + "line": 704, + "lineto": 741, "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Fetch options structure.", @@ -31247,8 +32076,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 606, - "lineto": 619, + "line": 656, + "lineto": 669, "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", "description": " Acceptable prune settings when fetching ", @@ -31292,8 +32121,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 213, - "lineto": 220, + "line": 222, + "lineto": 229, "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", "tdef": "typedef", "description": " Valid modes for index and tree entries. ", @@ -31354,8 +32183,8 @@ "type": "struct", "value": "git_filter", "file": "git2/filter.h", - "line": 69, - "lineto": 69, + "line": 100, + "lineto": 100, "tdef": "typedef", "description": " A filter that can transform file data", "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", @@ -31363,12 +32192,15 @@ "returns": [], "needs": [ "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_contains", "git_filter_list_free", "git_filter_list_load", + "git_filter_list_load_ext", "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", "git_filter_list_stream_data", "git_filter_list_stream_file" ] @@ -31382,13 +32214,14 @@ "GIT_FILTER_DEFAULT", "GIT_FILTER_ALLOW_UNSAFE", "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", - "GIT_FILTER_ATTRIBUTES_FROM_HEAD" + "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_FILTER_ATTRIBUTES_FROM_COMMIT" ], "type": "enum", "file": "git2/filter.h", "line": 41, - "lineto": 52, - "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD", + "lineto": 58, + "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_FILTER_ATTRIBUTES_FROM_COMMIT", "tdef": "typedef", "description": " Filter option flags.", "comments": "", @@ -31416,6 +32249,12 @@ "name": "GIT_FILTER_ATTRIBUTES_FROM_HEAD", "comments": "

Load attributes from .gitattributes in the root of HEAD

\n", "value": 4 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

Load attributes from .gitattributes in a given commit.\n This can only be specified in a git_filter_options.

\n", + "value": 8 } ], "used": { @@ -31431,8 +32270,8 @@ "type": "struct", "value": "git_filter_list", "file": "git2/filter.h", - "line": 81, - "lineto": 81, + "line": 112, + "lineto": 112, "tdef": "typedef", "description": " List of filters to be applied", "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", @@ -31440,12 +32279,15 @@ "returns": [], "needs": [ "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_contains", "git_filter_list_free", "git_filter_list_load", + "git_filter_list_load_ext", "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", "git_filter_list_stream_data", "git_filter_list_stream_file" ] @@ -31498,7 +32340,56 @@ "used": { "returns": [], "needs": [ - "git_filter_list_load" + "git_filter_list_load", + "git_filter_list_load_ext" + ] + } + } + ], + [ + "git_filter_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_filter_options", + "file": "git2/filter.h", + "line": 63, + "lineto": 80, + "block": "unsigned int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " Filtering options", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_filter_flag_t` above " + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": "" + }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": [ + "git_filter_list_load_ext" ] } } @@ -31577,8 +32468,8 @@ "type": "struct", "value": "git_index", "file": "git2/types.h", - "line": 139, - "lineto": 139, + "line": 148, + "lineto": 148, "tdef": "typedef", "description": " Memory representation of an index file. ", "comments": "", @@ -31763,8 +32654,8 @@ "type": "struct", "value": "git_index_conflict_iterator", "file": "git2/types.h", - "line": 145, - "lineto": 145, + "line": 154, + "lineto": 154, "tdef": "typedef", "description": " An iterator for conflicts in the index. ", "comments": "", @@ -31976,8 +32867,8 @@ "type": "struct", "value": "git_index_iterator", "file": "git2/types.h", - "line": 142, - "lineto": 142, + "line": 151, + "lineto": 151, "tdef": "typedef", "description": " An iterator for entries in the index. ", "comments": "", @@ -32124,7 +33015,7 @@ "value": "git_indexer_options", "file": "git2/indexer.h", "line": 62, - "lineto": 72, + "lineto": 73, "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", "tdef": "typedef", "description": " Options for indexer configuration", @@ -32266,13 +33157,17 @@ "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", "GIT_OPT_GET_MWINDOW_FILE_LIMIT", - "GIT_OPT_SET_MWINDOW_FILE_LIMIT" + "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "GIT_OPT_GET_EXTENSIONS", + "GIT_OPT_SET_EXTENSIONS" ], "type": "enum", "file": "git2/common.h", "line": 179, - "lineto": 211, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT", + "lineto": 215, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS", "tdef": "typedef", "description": " Global library options", "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", @@ -32462,6 +33357,30 @@ "name": "GIT_OPT_SET_MWINDOW_FILE_LIMIT", "comments": "", "value": 30 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "comments": "", + "value": 31 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_OPT_GET_EXTENSIONS", + "comments": "", + "value": 33 + }, + { + "type": "int", + "name": "GIT_OPT_SET_EXTENSIONS", + "comments": "", + "value": 34 } ], "used": { @@ -32477,8 +33396,8 @@ "type": "struct", "value": "git_mailmap", "file": "git2/types.h", - "line": 357, - "lineto": 357, + "line": 366, + "lineto": 366, "tdef": "typedef", "description": " Representation of .mailmap file state. ", "comments": "", @@ -33144,6 +34063,24 @@ } } ], + [ + "git_midx_writer", + { + "decl": "git_midx_writer", + "type": "struct", + "value": "git_midx_writer", + "file": "git2/types.h", + "line": 100, + "lineto": 100, + "tdef": "typedef", + "description": " a writer for multi-pack-index files. ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], [ "git_note", { @@ -33151,8 +34088,8 @@ "type": "struct", "value": "git_note", "file": "git2/types.h", - "line": 160, - "lineto": 160, + "line": 169, + "lineto": 169, "tdef": "typedef", "description": " Representation of a git note ", "comments": "", @@ -33205,8 +34142,8 @@ "type": "struct", "value": "git_object", "file": "git2/types.h", - "line": 115, - "lineto": 115, + "line": 124, + "lineto": 124, "tdef": "typedef", "description": " Representation of a generic object in a repository ", "comments": "", @@ -33399,11 +34336,13 @@ "git_odb_read_header", "git_odb_read_prefix", "git_odb_refresh", + "git_odb_set_commit_graph", "git_odb_stream_finalize_write", "git_odb_stream_free", "git_odb_stream_read", "git_odb_stream_write", "git_odb_write", + "git_odb_write_multi_pack_index", "git_odb_write_pack", "git_repository_odb", "git_repository_wrap_odb" @@ -33447,8 +34386,8 @@ "type": "struct", "value": "git_odb_expand_id", "file": "git2/odb.h", - "line": 181, - "lineto": 196, + "line": 176, + "lineto": 191, "block": "git_oid id\nunsigned short length\ngit_object_t type", "tdef": "typedef", "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", @@ -33724,6 +34663,7 @@ "git_blob_lookup_prefix", "git_commit_amend", "git_commit_create", + "git_commit_create_cb", "git_commit_create_v", "git_commit_create_with_signature", "git_commit_extract_signature", @@ -33732,6 +34672,7 @@ "git_diff_patchid", "git_graph_ahead_behind", "git_graph_descendant_of", + "git_graph_reachable_from_any", "git_index_write_tree", "git_index_write_tree_to", "git_merge_base", @@ -33779,6 +34720,7 @@ "git_oid_streq", "git_oid_tostr", "git_oid_tostr_s", + "git_oidarray_dispose", "git_oidarray_free", "git_packbuilder_insert", "git_packbuilder_insert_commit", @@ -33875,6 +34817,7 @@ "needs": [ "git_merge_bases", "git_merge_bases_many", + "git_oidarray_dispose", "git_oidarray_free" ] } @@ -33887,8 +34830,8 @@ "type": "struct", "value": "git_packbuilder", "file": "git2/types.h", - "line": 163, - "lineto": 163, + "line": 172, + "lineto": 172, "tdef": "typedef", "description": " Representation of a git packbuilder ", "comments": "", @@ -34266,8 +35209,8 @@ "type": "struct", "value": "git_push", "file": "git2/types.h", - "line": 244, - "lineto": 244, + "line": 253, + "lineto": 253, "tdef": "typedef", "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", "comments": "", @@ -34295,8 +35238,8 @@ "type": "struct", "value": "git_push_options", "file": "git2/remote.h", - "line": 715, - "lineto": 742, + "line": 765, + "lineto": 792, "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", @@ -34350,8 +35293,8 @@ "type": "struct", "value": "git_push_update", "file": "git2/remote.h", - "line": 436, - "lineto": 453, + "line": 459, + "lineto": 476, "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", "tdef": "typedef", "description": " Represents an update which will be performed on the remote during push", @@ -34393,8 +35336,8 @@ "type": "struct", "value": "git_rebase", "file": "git2/types.h", - "line": 195, - "lineto": 195, + "line": 204, + "lineto": 204, "tdef": "typedef", "description": " Representation of a rebase ", "comments": "", @@ -34434,8 +35377,8 @@ "type": "struct", "value": "git_rebase_operation", "file": "git2/rebase.h", - "line": 148, - "lineto": 163, + "line": 172, + "lineto": 187, "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", "tdef": "typedef", "description": " A rebase operation", @@ -34480,8 +35423,8 @@ ], "type": "enum", "file": "git2/rebase.h", - "line": 96, - "lineto": 132, + "line": 120, + "lineto": 156, "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "tdef": "typedef", "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", @@ -34540,15 +35483,16 @@ "const char * rewrite_notes_ref", "git_merge_options merge_options", "git_checkout_options checkout_options", - "git_commit_signing_cb signing_cb", + "git_commit_create_cb commit_create_cb", + "int (*)(git_buf *, git_buf *, const char *, void *) signing_cb", "void * payload" ], "type": "struct", "value": "git_rebase_options", "file": "git2/rebase.h", "line": 32, - "lineto": 91, - "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_signing_cb signing_cb\nvoid * payload", + "lineto": 115, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_create_cb commit_create_cb\nint (*)(git_buf *, git_buf *, const char *, void *) signing_cb\nvoid * payload", "tdef": "typedef", "description": " Rebase options", "comments": "

Use to tell the rebase machinery how to operate.

\n", @@ -34584,9 +35528,14 @@ "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." }, { - "type": "git_commit_signing_cb", + "type": "git_commit_create_cb", + "name": "commit_create_cb", + "comments": " Optional callback that allows users to override commit\n creation in `git_rebase_commit`. If specified, users can\n create their own commit and provide the commit ID, which\n may be useful for signing commits or otherwise customizing\n the commit creation.\n\n If this callback returns `GIT_PASSTHROUGH`, then\n `git_rebase_commit` will continue to create the commit." + }, + { + "type": "int (*)(git_buf *, git_buf *, const char *, void *)", "name": "signing_cb", - "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n This field is only used when performing git_rebase_commit." + "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n\n This field is only used when performing git_rebase_commit.\n\n This callback is not invoked if a `git_commit_create_cb` is\n specified.\n\n This callback is deprecated; users should provide a\n creation callback as `commit_create_cb` that produces a\n commit buffer, signs it, and commits it." }, { "type": "void *", @@ -34611,8 +35560,8 @@ "type": "struct", "value": "git_refdb", "file": "git2/types.h", - "line": 100, - "lineto": 100, + "line": 103, + "lineto": 103, "tdef": "typedef", "description": " An open refs database handle. ", "comments": "", @@ -34635,8 +35584,8 @@ "type": "struct", "value": "git_refdb_backend", "file": "git2/types.h", - "line": 103, - "lineto": 103, + "line": 106, + "lineto": 106, "tdef": "typedef", "description": " A custom backend for refs ", "comments": "", @@ -34653,8 +35602,8 @@ "type": "struct", "value": "git_reference", "file": "git2/types.h", - "line": 180, - "lineto": 180, + "line": 189, + "lineto": 189, "tdef": "typedef", "description": " In-memory representation of a reference. ", "comments": "", @@ -34729,8 +35678,8 @@ ], "type": "enum", "file": "git2/refs.h", - "line": 658, - "lineto": 687, + "line": 661, + "lineto": 690, "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", "tdef": "typedef", "description": " Normalization options for reference lookup", @@ -34774,8 +35723,8 @@ "type": "struct", "value": "git_reference_iterator", "file": "git2/types.h", - "line": 183, - "lineto": 183, + "line": 192, + "lineto": 192, "tdef": "typedef", "description": " Iterator for references ", "comments": "", @@ -34802,8 +35751,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 198, - "lineto": 203, + "line": 207, + "lineto": 212, "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", "tdef": "typedef", "description": " Basic type of any Git reference. ", @@ -34849,8 +35798,8 @@ "type": "struct", "value": "git_reflog", "file": "git2/types.h", - "line": 157, - "lineto": 157, + "line": 166, + "lineto": 166, "tdef": "typedef", "description": " Representation of a reference log ", "comments": "", @@ -34882,8 +35831,8 @@ "type": "struct", "value": "git_reflog_entry", "file": "git2/types.h", - "line": 154, - "lineto": 154, + "line": 163, + "lineto": 163, "tdef": "typedef", "description": " Representation of a reference log entry ", "comments": "", @@ -34907,8 +35856,8 @@ "type": "struct", "value": "git_refspec", "file": "git2/types.h", - "line": 226, - "lineto": 226, + "line": 235, + "lineto": 235, "tdef": "typedef", "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", "comments": "", @@ -34939,8 +35888,8 @@ "type": "struct", "value": "git_remote", "file": "git2/types.h", - "line": 232, - "lineto": 232, + "line": 241, + "lineto": 241, "tdef": "typedef", "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entires).", "comments": "", @@ -34978,8 +35927,11 @@ "git_remote_prune_refs", "git_remote_push", "git_remote_pushurl", + "git_remote_ready_cb", "git_remote_refspec_count", "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", "git_remote_stats", "git_remote_stop", "git_remote_update_tips", @@ -35001,8 +35953,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 626, - "lineto": 644, + "line": 676, + "lineto": 694, "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", "tdef": "typedef", "description": " Automatic tag following option", @@ -35060,15 +36012,16 @@ "git_push_update_reference_cb push_update_reference", "git_push_negotiation push_negotiation", "git_transport_cb transport", + "git_remote_ready_cb remote_ready", "void * payload", "git_url_resolve_cb resolve_url" ], "type": "struct", "value": "git_remote_callbacks", "file": "git2/remote.h", - "line": 499, - "lineto": 588, - "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\nvoid * payload\ngit_url_resolve_cb resolve_url", + "line": 537, + "lineto": 638, + "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url", "tdef": null, "description": " The callback settings structure", "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", @@ -35133,6 +36086,11 @@ "name": "transport", "comments": " Create the transport to use for this operation. Leave NULL\n to auto-detect." }, + { + "type": "git_remote_ready_cb", + "name": "remote_ready", + "comments": " Callback when the remote is ready to connect." + }, { "type": "void *", "name": "payload", @@ -35141,7 +36099,7 @@ { "type": "git_url_resolve_cb", "name": "resolve_url", - "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead." + "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead.\n\n This callback is deprecated; users should use\n git_remote_ready_cb and configure the instance URL instead." } ], "used": { @@ -35165,8 +36123,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 420, - "lineto": 424, + "line": 443, + "lineto": 447, "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", "tdef": "typedef", "description": " Argument to the completion callback which tells it which operation\n finished.", @@ -35349,8 +36307,8 @@ "type": "struct", "value": "git_repository", "file": "git2/types.h", - "line": 109, - "lineto": 109, + "line": 118, + "lineto": 118, "tdef": "typedef", "description": " Representation of an existing git repository,\n including all its object contents", "comments": "", @@ -35378,8 +36336,11 @@ "git_attr_add_macro", "git_attr_cache_flush", "git_attr_foreach", + "git_attr_foreach_ext", "git_attr_get", + "git_attr_get_ext", "git_attr_get_many", + "git_attr_get_many_ext", "git_blame_file", "git_blob_create_from_buffer", "git_blob_create_from_disk", @@ -35392,6 +36353,7 @@ "git_branch_iterator_new", "git_branch_lookup", "git_branch_remote_name", + "git_branch_upstream_merge", "git_branch_upstream_name", "git_branch_upstream_remote", "git_checkout_head", @@ -35418,9 +36380,11 @@ "git_diff_tree_to_workdir_with_index", "git_filter_list_apply_to_file", "git_filter_list_load", + "git_filter_list_load_ext", "git_filter_list_stream_file", "git_graph_ahead_behind", "git_graph_descendant_of", + "git_graph_reachable_from_any", "git_ignore_add_rule", "git_ignore_clear_internal_rules", "git_ignore_path_is_ignored", @@ -35975,8 +36939,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 865, - "lineto": 878, + "line": 867, + "lineto": 880, "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", "tdef": "typedef", "description": " Repository state", @@ -36246,8 +37210,8 @@ "type": "struct", "value": "git_revwalk", "file": "git2/types.h", - "line": 118, - "lineto": 118, + "line": 127, + "lineto": 127, "tdef": "typedef", "description": " Representation of an in-progress walk through the commits in a repo ", "comments": "", @@ -36287,8 +37251,8 @@ "type": "struct", "value": "git_signature", "file": "git2/types.h", - "line": 173, - "lineto": 177, + "line": 182, + "lineto": 186, "block": "char * name\nchar * email\ngit_time when", "tdef": "typedef", "description": " An action signature (e.g. for committers, taggers, etc) ", @@ -36325,6 +37289,7 @@ "git_commit_committer_with_mailmap", "git_commit_create", "git_commit_create_buffer", + "git_commit_create_cb", "git_commit_create_v", "git_mailmap_resolve_signature", "git_note_commit_create", @@ -36360,8 +37325,8 @@ ], "type": "enum", "file": "git2/sys/transport.h", - "line": 287, - "lineto": 292, + "line": 288, + "lineto": 293, "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", "tdef": "typedef", "description": " Actions that the smart transport can ask a subtransport to perform ", @@ -36677,8 +37642,8 @@ "type": "struct", "value": "git_status_entry", "file": "git2/status.h", - "line": 230, - "lineto": 234, + "line": 286, + "lineto": 290, "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", "tdef": "typedef", "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", @@ -36715,8 +37680,8 @@ "type": "struct", "value": "git_status_list", "file": "git2/types.h", - "line": 192, - "lineto": 192, + "line": 201, + "lineto": 201, "tdef": "typedef", "description": " Representation of a status collection ", "comments": "", @@ -36754,107 +37719,107 @@ ], "type": "enum", "file": "git2/status.h", - "line": 139, - "lineto": 156, + "line": 101, + "lineto": 208, "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", "tdef": "typedef", "description": " Flags to control status callbacks", - "comments": "
    \n
  • GIT_STATUS_OPT_INCLUDE_UNTRACKED says that callbacks should be made on untracked files. These will only be made if the workdir files are included in the status "show" option. - GIT_STATUS_OPT_INCLUDE_IGNORED says that ignored files get callbacks. Again, these callbacks will only be made if the workdir files are included in the status "show" option. - GIT_STATUS_OPT_INCLUDE_UNMODIFIED indicates that callback should be made even on unmodified files. - GIT_STATUS_OPT_EXCLUDE_SUBMODULES indicates that submodules should be skipped. This only applies if there are no pending typechanges to the submodule (either from or to another type). - GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS indicates that all files in untracked directories should be included. Normally if an entire directory is new, then just the top-level directory is included (with a trailing slash on the entry name). This flag says to include all of the individual files in the directory instead. - GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH indicates that the given path should be treated as a literal path, and not as a pathspec pattern. - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of ignored directories should be included in the status. This is like doing git ls-files -o -i --exclude-standard with core git. - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that rename detection should be processed between the head and the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status flag. - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that rename detection should be run between the index and the working directory and enabled GIT_STATUS_WT_RENAMED as a possible status flag. - GIT_STATUS_OPT_SORT_CASE_SENSITIVELY overrides the native case sensitivity for the file system and forces the output to be in case-sensitive order - GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY overrides the native case sensitivity for the file system and forces the output to be in case-insensitive order - GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection should include rewritten files - GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of doing a "soft" index reload (i.e. reloading the index data if the file on disk has been modified outside libgit2). - GIT_STATUS_OPT_UPDATE_INDEX tells libgit2 to refresh the stat cache in the index for files that are unchanged but have out of date stat information in the index. It will result in less work being done on subsequent calls to get status. This is mutually exclusive with the NO_REFRESH option.
  • \n
\n\n

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", + "comments": "

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", "fields": [ { "type": "int", "name": "GIT_STATUS_OPT_INCLUDE_UNTRACKED", - "comments": "", + "comments": "

Says that callbacks should be made on untracked files.\n These will only be made if the workdir files are included in the status\n "show" option.

\n", "value": 1 }, { "type": "int", "name": "GIT_STATUS_OPT_INCLUDE_IGNORED", - "comments": "", + "comments": "

Says that ignored files get callbacks.\n Again, these callbacks will only be made if the workdir files are\n included in the status "show" option.

\n", "value": 2 }, { "type": "int", "name": "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", - "comments": "", + "comments": "

Indicates that callback should be made even on unmodified files.

\n", "value": 4 }, { "type": "int", "name": "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", - "comments": "", + "comments": "

Indicates that submodules should be skipped.\n This only applies if there are no pending typechanges to the submodule\n (either from or to another type).

\n", "value": 8 }, { "type": "int", "name": "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", - "comments": "", + "comments": "

Indicates that all files in untracked directories should be included.\n Normally if an entire directory is new, then just the top-level\n directory is included (with a trailing slash on the entry name).\n This flag says to include all of the individual files in the directory\n instead.

\n", "value": 16 }, { "type": "int", "name": "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", - "comments": "", + "comments": "

Indicates that the given path should be treated as a literal path,\n and not as a pathspec pattern.

\n", "value": 32 }, { "type": "int", "name": "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", - "comments": "", + "comments": "

Indicates that the contents of ignored directories should be included\n in the status. This is like doing git ls-files -o -i --exclude-standard\n with core git.

\n", "value": 64 }, { "type": "int", "name": "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", - "comments": "", + "comments": "

Indicates that rename detection should be processed between the head and\n the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status\n flag.

\n", "value": 128 }, { "type": "int", "name": "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", - "comments": "", + "comments": "

Indicates that rename detection should be run between the index and the\n working directory and enabled GIT_STATUS_WT_RENAMED as a possible status\n flag.

\n", "value": 256 }, { "type": "int", "name": "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", - "comments": "", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-sensitive order.

\n", "value": 512 }, { "type": "int", "name": "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", - "comments": "", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-insensitive order.

\n", "value": 1024 }, { "type": "int", "name": "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", - "comments": "", + "comments": "

Iindicates that rename detection should include rewritten files.

\n", "value": 2048 }, { "type": "int", "name": "GIT_STATUS_OPT_NO_REFRESH", - "comments": "", + "comments": "

Bypasses the default status behavior of doing a "soft" index reload\n (i.e. reloading the index data if the file on disk has been modified\n outside libgit2).

\n", "value": 4096 }, { "type": "int", "name": "GIT_STATUS_OPT_UPDATE_INDEX", - "comments": "", + "comments": "

Tells libgit2 to refresh the stat cache in the index for files that are\n unchanged but have out of date stat einformation in the index.\n It will result in less work being done on subsequent calls to get status.\n This is mutually exclusive with the NO_REFRESH option.

\n", "value": 8192 }, { "type": "int", "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE", - "comments": "", + "comments": "

Normally files that cannot be opened or read are ignored as\n these are often transient files; this option will return\n unreadable files as GIT_STATUS_WT_UNREADABLE.

\n", "value": 16384 }, { "type": "int", "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", - "comments": "", + "comments": "

Unreadable files will be detected and given the status\n untracked instead of unreadable.

\n", "value": 32768 } ], @@ -36877,8 +37842,8 @@ "type": "struct", "value": "git_status_options", "file": "git2/status.h", - "line": 170, - "lineto": 197, + "line": 222, + "lineto": 253, "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline", "tdef": "typedef", "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", @@ -36887,7 +37852,7 @@ { "type": "unsigned int", "name": "version", - "comments": " The version " + "comments": " The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." }, { "type": "git_status_show_t", @@ -36897,17 +37862,17 @@ { "type": "unsigned int", "name": "flags", - "comments": " The `flags` value is an OR'ed combination of the `git_status_opt_t`\n values above." + "comments": " The `flags` value is an OR'ed combination of the\n `git_status_opt_t` values above." }, { "type": "git_strarray", "name": "pathspec", - "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match exactly if\n `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified in the flags." + "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match\n exactly if `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified\n in the flags." }, { "type": "git_tree *", "name": "baseline", - "comments": " The `baseline` is the tree to be used for comparison to the working directory\n and index; defaults to HEAD." + "comments": " The `baseline` is the tree to be used for comparison to the\n working directory and index; defaults to HEAD." } ], "used": { @@ -36930,29 +37895,29 @@ ], "type": "enum", "file": "git2/status.h", - "line": 81, - "lineto": 85, + "line": 73, + "lineto": 91, "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", "tdef": "typedef", "description": " Select the files on which to report status.", - "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n\n
    \n
  • GIT_STATUS_SHOW_INDEX_AND_WORKDIR is the default. This roughly matches git status --porcelain regarding which files are included and in what order. - GIT_STATUS_SHOW_INDEX_ONLY only gives status based on HEAD to index comparison, not looking at working directory changes. - GIT_STATUS_SHOW_WORKDIR_ONLY only gives status based on index to working directory comparison, not comparing the index to the HEAD.
  • \n
\n", + "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n", "fields": [ { "type": "int", "name": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", - "comments": "", + "comments": "

The default. This roughly matches git status --porcelain regarding\n which files are included and in what order.

\n", "value": 0 }, { "type": "int", "name": "GIT_STATUS_SHOW_INDEX_ONLY", - "comments": "", + "comments": "

Only gives status based on HEAD to index comparison, not looking at\n working directory changes.

\n", "value": 1 }, { "type": "int", "name": "GIT_STATUS_SHOW_WORKDIR_ONLY", - "comments": "", + "comments": "

Only gives status based on index to working directory comparison,\n not comparing the index to the HEAD.

\n", "value": 2 } ], @@ -37179,8 +38144,8 @@ "type": "struct", "value": "git_submodule", "file": "git2/types.h", - "line": 258, - "lineto": 258, + "line": 267, + "lineto": 267, "tdef": "typedef", "description": " Opaque structure representing a submodule.", "comments": "", @@ -37197,6 +38162,7 @@ "git_submodule_branch", "git_submodule_cb", "git_submodule_clone", + "git_submodule_dup", "git_submodule_fetch_recurse_submodules", "git_submodule_foreach", "git_submodule_free", @@ -37238,8 +38204,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 322, - "lineto": 329, + "line": 331, + "lineto": 338, "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", "tdef": "typedef", "description": " Submodule ignore values", @@ -37297,8 +38263,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 341, - "lineto": 345, + "line": 350, + "lineto": 354, "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", "tdef": "typedef", "description": " Options for submodule recurse.", @@ -37514,8 +38480,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 286, - "lineto": 293, + "line": 295, + "lineto": 302, "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", "tdef": "typedef", "description": " Submodule update values", @@ -37569,8 +38535,8 @@ "type": "struct", "value": "git_tag", "file": "git2/types.h", - "line": 121, - "lineto": 121, + "line": 130, + "lineto": 130, "tdef": "typedef", "description": " Parsed representation of a tag object. ", "comments": "", @@ -37606,8 +38572,8 @@ "type": "struct", "value": "git_time", "file": "git2/types.h", - "line": 166, - "lineto": 170, + "line": 175, + "lineto": 179, "block": "git_time_t time\nint offset\nchar sign", "tdef": "typedef", "description": " Time in a signature ", @@ -37719,8 +38685,8 @@ "type": "struct", "value": "git_transaction", "file": "git2/types.h", - "line": 186, - "lineto": 186, + "line": 195, + "lineto": 195, "tdef": "typedef", "description": " Transactional interface to references ", "comments": "", @@ -37747,8 +38713,8 @@ "type": "struct", "value": "git_transport", "file": "git2/types.h", - "line": 238, - "lineto": 238, + "line": 247, + "lineto": 247, "tdef": "typedef", "description": " Interface which represents a transport to communicate with a\n remote.", "comments": "", @@ -37767,8 +38733,8 @@ "type": "struct", "value": "git_tree", "file": "git2/types.h", - "line": 133, - "lineto": 133, + "line": 142, + "lineto": 142, "tdef": "typedef", "description": " Representation of a tree object. ", "comments": "", @@ -37784,6 +38750,7 @@ "git_commit_amend", "git_commit_create", "git_commit_create_buffer", + "git_commit_create_cb", "git_commit_create_v", "git_commit_tree", "git_diff_tree_to_index", @@ -37838,8 +38805,8 @@ "type": "struct", "value": "git_tree_entry", "file": "git2/types.h", - "line": 130, - "lineto": 130, + "line": 139, + "lineto": 139, "tdef": "typedef", "description": " Representation of each one of the entries in a tree object. ", "comments": "", @@ -37880,8 +38847,8 @@ "type": "struct", "value": "git_tree_update", "file": "git2/tree.h", - "line": 436, - "lineto": 445, + "line": 437, + "lineto": 446, "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "tdef": "typedef", "description": " An action to perform during the update of a tree", @@ -37925,8 +38892,8 @@ ], "type": "enum", "file": "git2/tree.h", - "line": 426, - "lineto": 431, + "line": 427, + "lineto": 432, "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", "tdef": "typedef", "description": " The kind of update to perform", @@ -37958,8 +38925,8 @@ "type": "struct", "value": "git_treebuilder", "file": "git2/types.h", - "line": 136, - "lineto": 136, + "line": 145, + "lineto": 145, "tdef": "typedef", "description": " Constructor for in-memory trees ", "comments": "", @@ -37989,8 +38956,8 @@ ], "type": "enum", "file": "git2/tree.h", - "line": 386, - "lineto": 389, + "line": 387, + "lineto": 390, "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", "tdef": "typedef", "description": " Tree traversal modes ", @@ -38024,8 +38991,8 @@ "type": "struct", "value": "git_worktree", "file": "git2/types.h", - "line": 112, - "lineto": 112, + "line": 121, + "lineto": 121, "tdef": "typedef", "description": " Representation of a working tree ", "comments": "", @@ -38105,7 +39072,7 @@ "value": "git_worktree_prune_options", "file": "git2/worktree.h", "line": 198, - "lineto": 202, + "lineto": 203, "block": "unsigned int version\nuint32_t flags", "tdef": "typedef", "description": " Worktree prune options structure", @@ -38119,7 +39086,7 @@ { "type": "uint32_t", "name": "flags", - "comments": "" + "comments": " A combination of `git_worktree_prune_t` " } ], "used": { @@ -38185,8 +39152,8 @@ "type": "struct", "value": "git_writestream", "file": "git2/types.h", - "line": 350, - "lineto": 354, + "line": 359, + "lineto": 363, "tdef": null, "description": " A type to write in a streaming fashion, for example, for filters. ", "comments": "", @@ -38214,6 +39181,7 @@ "git_blob_create_from_stream", "git_blob_create_from_stream_commit", "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", "git_filter_list_stream_data", "git_filter_list_stream_file" ] @@ -38248,8 +39216,11 @@ "git_attr_add_macro", "git_attr_cache_flush", "git_attr_foreach", + "git_attr_foreach_ext", "git_attr_get", + "git_attr_get_ext", "git_attr_get_many", + "git_attr_get_many_ext", "git_attr_value" ] ], @@ -38306,6 +39277,7 @@ "git_branch_remote_name", "git_branch_set_upstream", "git_branch_upstream", + "git_branch_upstream_merge", "git_branch_upstream_name", "git_branch_upstream_remote" ] @@ -38515,12 +39487,15 @@ "filter", [ "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_contains", "git_filter_list_free", "git_filter_list_load", + "git_filter_list_load_ext", "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", "git_filter_list_stream_data", "git_filter_list_stream_file" ] @@ -38538,7 +39513,8 @@ "graph", [ "git_graph_ahead_behind", - "git_graph_descendant_of" + "git_graph_descendant_of", + "git_graph_reachable_from_any" ] ], [ @@ -38732,11 +39708,13 @@ "git_odb_read_header", "git_odb_read_prefix", "git_odb_refresh", + "git_odb_set_commit_graph", "git_odb_stream_finalize_write", "git_odb_stream_free", "git_odb_stream_read", "git_odb_stream_write", "git_odb_write", + "git_odb_write_multi_pack_index", "git_odb_write_pack" ] ], @@ -38768,6 +39746,7 @@ [ "oidarray", [ + "git_oidarray_dispose", "git_oidarray_free" ] ], @@ -38991,6 +39970,8 @@ "git_remote_refspec_count", "git_remote_rename", "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", "git_remote_set_pushurl", "git_remote_set_url", "git_remote_stats", @@ -39147,6 +40128,7 @@ "git_submodule_add_to_index", "git_submodule_branch", "git_submodule_clone", + "git_submodule_dup", "git_submodule_fetch_recurse_submodules", "git_submodule_foreach", "git_submodule_free", @@ -39289,119 +40271,119 @@ "examples": [ [ "add.c", - "ex/HEAD/add.html" + "ex/v1.3.0/add.html" ], [ "args.c", - "ex/HEAD/args.html" + "ex/v1.3.0/args.html" ], [ "blame.c", - "ex/HEAD/blame.html" + "ex/v1.3.0/blame.html" ], [ "cat-file.c", - "ex/HEAD/cat-file.html" + "ex/v1.3.0/cat-file.html" ], [ "checkout.c", - "ex/HEAD/checkout.html" + "ex/v1.3.0/checkout.html" ], [ "clone.c", - "ex/HEAD/clone.html" + "ex/v1.3.0/clone.html" ], [ "commit.c", - "ex/HEAD/commit.html" + "ex/v1.3.0/commit.html" ], [ "common.c", - "ex/HEAD/common.html" + "ex/v1.3.0/common.html" ], [ "config.c", - "ex/HEAD/config.html" + "ex/v1.3.0/config.html" ], [ "describe.c", - "ex/HEAD/describe.html" + "ex/v1.3.0/describe.html" ], [ "diff.c", - "ex/HEAD/diff.html" + "ex/v1.3.0/diff.html" ], [ "fetch.c", - "ex/HEAD/fetch.html" + "ex/v1.3.0/fetch.html" ], [ "for-each-ref.c", - "ex/HEAD/for-each-ref.html" + "ex/v1.3.0/for-each-ref.html" ], [ "general.c", - "ex/HEAD/general.html" + "ex/v1.3.0/general.html" ], [ "index-pack.c", - "ex/HEAD/index-pack.html" + "ex/v1.3.0/index-pack.html" ], [ "init.c", - "ex/HEAD/init.html" + "ex/v1.3.0/init.html" ], [ "lg2.c", - "ex/HEAD/lg2.html" + "ex/v1.3.0/lg2.html" ], [ "log.c", - "ex/HEAD/log.html" + "ex/v1.3.0/log.html" ], [ "ls-files.c", - "ex/HEAD/ls-files.html" + "ex/v1.3.0/ls-files.html" ], [ "ls-remote.c", - "ex/HEAD/ls-remote.html" + "ex/v1.3.0/ls-remote.html" ], [ "merge.c", - "ex/HEAD/merge.html" + "ex/v1.3.0/merge.html" ], [ "push.c", - "ex/HEAD/push.html" + "ex/v1.3.0/push.html" ], [ "remote.c", - "ex/HEAD/remote.html" + "ex/v1.3.0/remote.html" ], [ "rev-list.c", - "ex/HEAD/rev-list.html" + "ex/v1.3.0/rev-list.html" ], [ "rev-parse.c", - "ex/HEAD/rev-parse.html" + "ex/v1.3.0/rev-parse.html" ], [ "show-index.c", - "ex/HEAD/show-index.html" + "ex/v1.3.0/show-index.html" ], [ "stash.c", - "ex/HEAD/stash.html" + "ex/v1.3.0/stash.html" ], [ "status.c", - "ex/HEAD/status.html" + "ex/v1.3.0/status.html" ], [ "tag.c", - "ex/HEAD/tag.html" + "ex/v1.3.0/tag.html" ] ] -} +} \ No newline at end of file diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 7ecec06c9..7bf82ac89 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1454,53 +1454,6 @@ "type": "enum" } ], - [ - "git_rebase_options", - { - "type": "struct", - "fields": [ - { - "type": "unsigned int", - "name": "version" - }, - { - "type": "int", - "name": "quiet" - }, - { - "type": "const char *", - "name": "rewrite_notes_ref" - }, - { - "type": "git_checkout_options", - "name": "checkout_options" - }, - { - "type": "git_merge_options", - "name": "merge_options" - }, - { - "type": "git_commit_signing_cb", - "name": "signing_cb" - }, - { - "type": "void *", - "name": "payload" - }, - { - "type": "int", - "name": "inmemory" - } - ], - "used": { - "needs": [ - "git_rebase_init_options", - "git_checkout_init_options", - "git_merge_init_options" - ] - } - } - ], [ "git_remote_autotag_option_t", { diff --git a/generate/scripts/utils.js b/generate/scripts/utils.js index 90a96f23e..c6e843134 100644 --- a/generate/scripts/utils.js +++ b/generate/scripts/utils.js @@ -9,7 +9,7 @@ const path = require("path"); var local = path.join.bind(null, __dirname, "../"); var util = { - arrayTypeRegex: /\s\[\d+\]\s*/, + arrayTypeRegex: /\[\d*\]\s*/, pointerRegex: /\s*\*\s*/, doublePointerRegex: /\s*\*\*\s*/, diff --git a/generate/templates/manual/libgit2/opts.cc b/generate/templates/manual/libgit2/opts.cc index 3e7f1483d..d6ed362c4 100644 --- a/generate/templates/manual/libgit2/opts.cc +++ b/generate/templates/manual/libgit2/opts.cc @@ -23,15 +23,6 @@ NAN_METHOD(GitLibgit2::Opts) to = Nan::New(option_value); break; } - // GET bool - case GIT_OPT_GET_WINDOWS_LONGPATHS: { - int option_value; - if (git_libgit2_opts(from_option, &option_value)) { - return Nan::ThrowError("git_libgit2_opts failed"); - } - to = option_value ? Nan::True() : Nan::False(); - break; - } // GET unsigned long case GIT_OPT_GET_WINDOWS_SHAREMODE: { unsigned long option_value; @@ -94,21 +85,6 @@ NAN_METHOD(GitLibgit2::Opts) } break; } - // SET bool - case GIT_OPT_SET_WINDOWS_LONGPATHS: { - int option_arg; - if (info.Length() < 2) { - option_arg = 0; - } else { - const Nan::Maybe maybeIsTruthy = Nan::To(info[1]); - const bool isTruthy = maybeIsTruthy.IsJust() && maybeIsTruthy.FromJust(); - option_arg = isTruthy ? 1 : 0; - } - if (git_libgit2_opts(from_option, option_arg)) { - return Nan::ThrowError("git_libgit2_opts failed"); - } - break; - } // SET size_t case GIT_OPT_SET_MWINDOW_SIZE: case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc index e1ba23343..38dd8c078 100644 --- a/generate/templates/manual/src/convenient_hunk.cc +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -69,9 +69,9 @@ NAN_METHOD(ConvenientHunk::JSNewFunction) { info.GetReturnValue().Set(info.This()); } -Local ConvenientHunk::New(void *raw) { +Local ConvenientHunk::New(void *raw) { Nan::EscapableHandleScope scope; - Local argv[1] = { Nan::New((void *)raw) }; + Local argv[1] = { Nan::New((void *)raw) }; nodegit::Context *nodegitContext = nodegit::Context::GetCurrentContext(); Local constructor_template = nodegitContext->GetFromPersistent("ConvenientHunk::Template").As(); return scope.Escape(Nan::NewInstance(constructor_template, 1, argv).ToLocalChecked()); diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index 36e20891c..5050350e4 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -36,7 +36,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(void {% endif %} {% endeach %} - v8::Local argv[{{ cbFunction.args|callbackArgsCount }}] = { + v8::Local argv[{{ cbFunction.args|callbackArgsCount }}] = { {% each cbFunction.args|callbackArgsInfo as arg %} {% if not arg.firstArg %}, {% endif %} {% if arg.isEnum %} diff --git a/generate/templates/partials/configurable_callbacks.cc b/generate/templates/partials/configurable_callbacks.cc index 3b2866074..225aa43f3 100644 --- a/generate/templates/partials/configurable_callbacks.cc +++ b/generate/templates/partials/configurable_callbacks.cc @@ -1,3 +1,4 @@ +#include {% each fields|fieldsInfo as field %} {% if not field.ignore %} {% if field.isCallbackFunction %} @@ -84,14 +85,25 @@ return; } + {% each field.args|callbackArgsInfo as arg %} + {% if arg.cppClassName == "Array" %} + v8::Local _{{arg.name}}_array = Nan::New(baton->{{ arg.arrayLengthArgumentName }}); + for(uint32_t i = 0; i < _{{arg.name}}_array->Length(); i++) { + Nan::Set(_{{arg.name}}_array, i, {{arg.arrayElementCppClassName}}::New(baton->{{arg.name}}[i], false)); + } + {% endif %} + {% endeach %} + {% if field.args|callbackArgsCount == 0 %} - v8::Local *argv = NULL; + v8::Local *argv = NULL; {% else %} - v8::Local argv[{{ field.args|callbackArgsCount }}] = { + v8::Local argv[{{ field.args|callbackArgsCount }}] = { {% each field.args|callbackArgsInfo as arg %} {% if not arg.firstArg %},{% endif %} {% if arg.isEnum %} Nan::New((int)baton->{{ arg.name }}) + {% elsif arg.cppClassName == "Array" %} + _{{arg.name}}_array {% elsif arg.isLibgitType %} {{ arg.cppClassName }}::New(baton->{{ arg.name }}, false) {% elsif arg.cType == "size_t" %} @@ -133,18 +145,22 @@ } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); - wrapper->selfFreeing = false; + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); + wrapper->selfFreeing = false; - *baton->{{ _return.name }} = wrapper->GetValue(); - baton->result = {{ field.return.success }}; + {% if _return.cppClassName == "GitOid" %} + git_oid_cpy(baton->{{ _return.name }}, wrapper->GetValue()); + {% else %} + *baton->{{ _return.name }} = wrapper->GetValue(); + {% endif %} + baton->result = {{ field.return.success }}; {% else %} - if (result->IsNumber()) { - baton->result = Nan::To(result).FromJust(); - } - else { - baton->result = baton->defaultResult; - } + if (result->IsNumber()) { + baton->result = Nan::To(result).FromJust(); + } + else { + baton->result = baton->defaultResult; + } {% endif %} } else { @@ -169,18 +185,22 @@ } else if (!result->IsNull() && !result->IsUndefined()) { {% if _return.isOutParam %} - {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); - wrapper->selfFreeing = false; - - *baton->{{ _return.name }} = wrapper->GetValue(); - baton->result = {{ field.return.success }}; + {{ _return.cppClassName }}* wrapper = Nan::ObjectWrap::Unwrap<{{ _return.cppClassName }}>(Nan::To(result).ToLocalChecked()); + wrapper->selfFreeing = false; + + {% if _return.cppClassName == "GitOid" %} + git_oid_cpy(baton->{{ _return.name }}, wrapper->GetValue()); + {% else %} + *baton->{{ _return.name }} = wrapper->GetValue(); + {% endif %} + baton->result = {{ field.return.success }}; {% else %} - if (result->IsNumber()) { - baton->result = Nan::To(result).FromJust(); - } - else{ - baton->result = baton->defaultResult; - } + if (result->IsNumber()) { + baton->result = Nan::To(result).FromJust(); + } + else { + baton->result = baton->defaultResult; + } {% endif %} } else { diff --git a/lib/buf.js b/lib/buf.js index 28f34c2a3..aec6ba693 100644 --- a/lib/buf.js +++ b/lib/buf.js @@ -1,11 +1,43 @@ -const { Buf } = require("../"); +var util = require("util"); +var NodeGit = require("../"); +var Buf = NodeGit.Buf; + +var _set = Buf.prototype.set; +var _grow = Buf.prototype.grow; +var _isBinary = Buf.prototype.isBinary; +var _containsNul = Buf.prototype.containsNul; /** * Sets the content of a GitBuf to a string. * @param {string} The utf8 value to set in the buffer. * The string will be null terminated. */ -Buf.prototype.setString = function(content) { +var _setString = function(content) { const buf = Buffer.from(content + "\0", "utf8"); this.set(buf, buf.length); }; + +Buf.prototype.set = util.deprecate( + _set, + "NodeGit.Buf.prototype.set is deprecated." +); + +Buf.prototype.setString = util.deprecate( + _setString, + "NodeGit.Buf.prototype.setString is deprecated." +); + +Buf.prototype.grow = util.deprecate( + _grow, + "NodeGit.Buf.prototype.grow is deprecated." +); + +Buf.prototype.isBinary = util.deprecate( + _isBinary, + "NodeGit.Buf.prototype.isBinary is deprecated." +); + +Buf.prototype.containsNul = util.deprecate( + _containsNul, + "NodeGit.Buf.prototype.containsNul is deprecated." +); \ No newline at end of file diff --git a/lib/libgit2.js b/lib/libgit2.js deleted file mode 100644 index 40730278d..000000000 --- a/lib/libgit2.js +++ /dev/null @@ -1,6 +0,0 @@ -var NodeGit = require("../"); - -var Libgit2 = NodeGit.Libgit2; - -Libgit2.OPT.SET_WINDOWS_LONGPATHS = 31; -Libgit2.OPT.GET_WINDOWS_LONGPATHS = 32; diff --git a/lib/rebase.js b/lib/rebase.js index 92e0de95b..bbe502bf5 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -4,46 +4,37 @@ var Rebase = NodeGit.Rebase; var _init = Rebase.init; var _open = Rebase.open; -function defaultRebaseOptions(options, checkoutStrategy) { +function defaultRebaseOptions(repository, options, checkoutStrategy) { if (options) { // Ensure we don't modify the passed-in options object. - // This could lead to us recursing signingCb if the same + // This could lead to us recursing commitCreateCb if the same // options object is later re-used. options = Object.assign({}, options); - if (options.signingCb) { + if(options.signingCb && !options.commitCreateCb) { + console.warn("signingCb is deperecated, use commitCreateCb instead."); + let signingCb = options.signingCb; - options.signingCb = function ( - signatureBuf, - signatureFieldBuf, - commitContent + options.commitCreateCb = function ( + author, + committer, + message_encoding, + message, + tree, + parent_count, + parents ) { - try { - const signingCbResult = signingCb(commitContent); - - return Promise.resolve(signingCbResult) - .then(function({ code, field, signedData }) { - if (code === NodeGit.Error.CODE.OK) { - signatureBuf.setString(signedData); - if (field) { - signatureFieldBuf.setString(field); - } - } - - return code; - }) - .catch(function(error) { - if (error && error.code) { - return error.code; - } - return NodeGit.Error.CODE.ERROR; - }); - } catch (error) { - if (error && error.code) { - return error.code; - } - return NodeGit.Error.CODE.ERROR; - } + return repository.createCommitWithSignature( + null, + author, + committer, + message, + tree, + parents, + signingCb).then((oid) => { + console.log(oid.toString()); + return oid; + }); }; } } else if (checkoutStrategy) { @@ -73,6 +64,7 @@ function defaultRebaseOptions(options, checkoutStrategy) { */ Rebase.init = function(repository, branch, upstream, onto, options) { return _init(repository, branch, upstream, onto, defaultRebaseOptions( + repository, options, NodeGit.Checkout.STRATEGY.FORCE )); @@ -88,6 +80,7 @@ Rebase.init = function(repository, branch, upstream, onto, options) { */ Rebase.open = function(repository, options) { return _open(repository, defaultRebaseOptions( + repository, options, NodeGit.Checkout.STRATEGY.SAFE )); diff --git a/vendor/libgit2 b/vendor/libgit2 index a807e37df..089b7778b 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit a807e37df4ca3f60df7e9675e3c8049a21dd6283 +Subproject commit 089b7778bdf5f465ac7da71963ceff13323a6a82 diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 270e2b39c..63ebdf65a 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -74,8 +74,6 @@ "libgit2/src/blob.h", "libgit2/src/branch.c", "libgit2/src/branch.h", - "libgit2/src/buf_text.c", - "libgit2/src/buf_text.h", "libgit2/src/buffer.c", "libgit2/src/buffer.h", "libgit2/src/cache.c", @@ -297,6 +295,8 @@ "libgit2/src/userdiff.h", "libgit2/src/util.c", "libgit2/src/util.h", + "libgit2/src/utf8.c", + "libgit2/src/utf8.h", "libgit2/src/varint.c", "libgit2/src/varint.h", "libgit2/src/vector.c", @@ -674,6 +674,9 @@ "libgit2/deps/ntlmclient/util.c", "libgit2/deps/ntlmclient/util.h" ], + "defines": [ + "UNICODE_BUILTIN" + ], "conditions": [ ["OS=='mac' and <(is_electron) == 1", { "include_dirs": ["<(electron_openssl_root)/include"] From f19d402733d33dc3eb2d1f151d4275d0a23c39be Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 23 Feb 2022 15:44:41 -0700 Subject: [PATCH 375/545] fix tests --- test/tests/clone.js | 52 -------------------------------------------- test/tests/filter.js | 2 +- test/tests/graph.js | 1 + test/tests/rebase.js | 15 +++++++------ 4 files changed, 10 insertions(+), 60 deletions(-) diff --git a/test/tests/clone.js b/test/tests/clone.js index 000c2a4be..4f2b58d27 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -43,10 +43,6 @@ describe("Clone", function() { this.timeout(30000); beforeEach(function() { - if (process.platform === "win32") { - NodeGit.Libgit2.opts(NodeGit.Libgit2.OPT.SET_WINDOWS_LONGPATHS, 0); - } - return fse.remove(clonePath) .then(function() { return fse.remove(longClonePath); @@ -84,54 +80,6 @@ describe("Clone", function() { }); }); - it("can clone into long path if opt set", function() { - var test = this; - var url = "https://github.com/nodegit/test.git"; - var opts = { - fetchOpts: { - callbacks: { - certificateCheck: () => 0 - } - } - }; - - fse.ensureDirSync(longClonePath); - - if (process.platform === "win32") { - NodeGit.Libgit2.opts(NodeGit.Libgit2.OPT.SET_WINDOWS_LONGPATHS, 1); - } - - return Clone(url, longClonePath, opts).then(function(repo) { - assert.ok(repo instanceof Repository); - test.repository = repo; - }); - }); - - it("can't clone into long path if opt not set on win32", function() { - if (process.platform !== "win32") { - this.skip(); - } - - var url = "https://github.com/nodegit/test.git"; - var opts = { - fetchOpts: { - callbacks: { - certificateCheck: () => 0 - } - } - }; - - fse.ensureDirSync(longClonePath); - - NodeGit.Libgit2.opts(NodeGit.Libgit2.OPT.SET_WINDOWS_LONGPATHS, 0); - - return Clone(url, longClonePath, opts).then(function(repo) { - assert.fail("Clone should not succeed"); - }).catch(function(error) { - assert.ok(error instanceof Error); - }); - }); - it("can clone twice with https using same config object", function() { var test = this; var url = "https://github.com/nodegit/test.git"; diff --git a/test/tests/filter.js b/test/tests/filter.js index 3cb7467e8..06e138ba5 100644 --- a/test/tests/filter.js +++ b/test/tests/filter.js @@ -220,7 +220,7 @@ describe("Filter", function() { it("should apply filter when check succeeds", function() { var test = this; - var applied = true; + var applied = false; return Registry.register(filterName, { apply: function() { diff --git a/test/tests/graph.js b/test/tests/graph.js index 34805cda0..5242ef674 100644 --- a/test/tests/graph.js +++ b/test/tests/graph.js @@ -59,6 +59,7 @@ describe("Graph", function() { ) .catch(function(result) { assert(~result.message.indexOf("81b06fac")); + assert(~result.message.indexOf("object not found - no match for id")); }); }); }); diff --git a/test/tests/rebase.js b/test/tests/rebase.js index 89ab43515..3974cf57b 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -1874,7 +1874,7 @@ describe("Rebase", function() { }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed"); + "617cd03370dd799f372e9dcfcd0b097aede1bd7f"); // git_rebase_operation_current returns the index of the rebase // operation that was last applied, so after the first operation, it @@ -1891,13 +1891,13 @@ describe("Rebase", function() { .then(function(commit) { // verify that the "ours" branch has moved to the correct place assert.equal(commit.id().toString(), - "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed"); + "617cd03370dd799f372e9dcfcd0b097aede1bd7f"); return Promise.all([ commit.parent(0), NodeGit.Commit.extractSignature( repository, - "24250fe6bd8a782ec1aaca8b2c9a2456a90517ed", + "617cd03370dd799f372e9dcfcd0b097aede1bd7f", "moose-sig" ) ]); @@ -2416,7 +2416,7 @@ describe("Rebase", function() { }); }); - + it("rebase signs correctly if rebaseOptions are re-used", function () { const ourFileName = "ourNewFile.txt"; const theirFileName = "theirNewFile.txt"; @@ -2434,7 +2434,7 @@ describe("Rebase", function() { let rebase; let newCommitOid; - + const rebaseOptions = { signingCb: () => ({ code: NodeGit.Error.CODE.OK, @@ -2442,7 +2442,7 @@ describe("Rebase", function() { signedData: "A moose was here." }) }; - + const repository = this.repository; // Create two commits on master @@ -2521,13 +2521,14 @@ describe("Rebase", function() { .then((_newCommitOid) => { newCommitOid = _newCommitOid; assert.strictEqual(newCommitOid.toString(), - "89ad8168264267bcc50ee60ade3bc3804f55aa72"); + "9909e435b52322a71dc341d747b29c392a34c745"); return rebase.next(); }) .then(() => { assert.fail("should throw"); }) .catch((error) => { + console.log(error); assert(error.errno === NodeGit.Error.CODE.ITEROVER); assert.strictEqual(rebase.finish(ourSignature), 0); return NodeGit.Commit.extractSignature( From 5bc06fb4fdf8ebae806eaaee999df8494188b89e Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 23 Feb 2022 16:25:25 -0700 Subject: [PATCH 376/545] remove .clangd and fix rebase error woops --- .clangd | 15 --------------- .gitignore | 1 + test/tests/graph.js | 1 - 3 files changed, 1 insertion(+), 16 deletions(-) delete mode 100644 .clangd diff --git a/.clangd b/.clangd deleted file mode 100644 index b14fb9b59..000000000 --- a/.clangd +++ /dev/null @@ -1,15 +0,0 @@ -If: - PathMatch: [src/.*, include/.*] - -CompileFlags: - Add: [ - -I../node_modules/nan, - -I../vendor/libssh2/include, - -I../vendor/libgit2/include, - -I/home/johna/.cache/node-gyp/14.19.0/include/node, - -I/home/johna/.cache/node-gyp/14.19.0/src, - -I/home/johna/.cache/node-gyp/14.19.0/deps/openssl/config, - -I/home/johna/.cache/node-gyp/14.19.0/deps/openssl/openssl/include, - -I/home/johna/.cache/node-gyp/14.19.0/deps/uv/include, - -I/home/johna/.cache/node-gyp/14.19.0/deps/zlib, - -I/home/johna/.cache/node-gyp/14.19.0/deps/v8/include] \ No newline at end of file diff --git a/.gitignore b/.gitignore index 30f7dbc25..99a83fc4a 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ *.log .DS_STORE .idea +.clangd .vscode jsconfig.json diff --git a/test/tests/graph.js b/test/tests/graph.js index 5242ef674..01c088654 100644 --- a/test/tests/graph.js +++ b/test/tests/graph.js @@ -58,7 +58,6 @@ describe("Graph", function() { "26744fc697849d370246749b67ac43b792a4af0c" ) .catch(function(result) { - assert(~result.message.indexOf("81b06fac")); assert(~result.message.indexOf("object not found - no match for id")); }); }); From b20218d23f497abe986e6960eacecbb93fc2a7d6 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 14 Mar 2022 10:23:36 -0700 Subject: [PATCH 377/545] add missing callback --- generate/input/callbacks.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index c548266bd..aa0842995 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -648,6 +648,27 @@ "cancel": -1 } }, + "git_remote_ready_cb": { + "args": [ + { + "name": "remote", + "cType": "git_remote *" + }, + { + "name": "direction", + "cType": "int" + }, + { + "name": "payload", + "cType": "void *" + } + ], + "return": { + "type": "int", + "success": 0, + "error": -1 + } + }, "git_repository_create_cb": { "args": [ { From c997841446a12e0c07391d66c38ff7fddd98dad8 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 14 Mar 2022 13:51:08 -0700 Subject: [PATCH 378/545] Add missing email files --- vendor/libgit2.gyp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 63ebdf65a..cd4560c54 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -120,6 +120,8 @@ "libgit2/src/diff.h", "libgit2/src/errors.c", "libgit2/src/errors.h", + "libgit2/src/email.c", + "libgit2/src/email.h", "libgit2/src/fetch.c", "libgit2/src/fetch.h", "libgit2/src/fetchhead.c", From 9e1649ba9ad1e8ecfd18852487904f6125844ce1 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 23 Mar 2022 08:47:16 -0700 Subject: [PATCH 379/545] Some more small fixes --- generate/input/libgit2-supplement.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 7bf82ac89..26995b0d5 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1104,7 +1104,7 @@ [ "git_apply_options", { - "type": "sctruct", + "type": "struct", "fields": [ { "type": "unsigned int", diff --git a/package.json b/package.json index c01b49664..139ba4a8b 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "lint": "jshint lib test/tests test/utils lifecycleScripts", "mergecov": "lcov-result-merger 'test/**/*.info' 'test/coverage/merged.lcov' && ./lcov-1.10/bin/genhtml test/coverage/merged.lcov --output-directory test/coverage/report", "mocha": "mocha --expose-gc test/runner test/tests --timeout 15000", - "mochaDebug": "mocha --expose-gc --debug-brk test/runner test/tests --timeout 15000", + "mochaDebug": "mocha --expose-gc --inspect-brk test/runner test/tests --timeout 15000", "postinstall": "node lifecycleScripts/postinstall", "rebuild": "node generate && node-gyp configure build", "rebuildDebug": "node generate && node-gyp configure --debug build", From f7d63bb9fcb9512369035cfd31e4010d51700a2b Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 4 Apr 2022 08:35:43 -0700 Subject: [PATCH 380/545] Address Comments, fix ReachableFromAny --- generate/input/descriptor.json | 2 +- .../partials/configurable_callbacks.cc | 1 - .../templates/partials/convert_from_v8.cc | 23 +++++++++++++++++-- lib/graph.js | 15 ++++++++++++ lib/rebase.js | 3 +-- test/tests/graph.js | 14 +++++++++++ test/tests/rebase.js | 1 - 7 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 lib/graph.js diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 9f3b7115a..bf0efcd0a 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1679,7 +1679,7 @@ }, "isAsync": true, "return": { - "isErrorCode": true + "isResultOrError": true } } } diff --git a/generate/templates/partials/configurable_callbacks.cc b/generate/templates/partials/configurable_callbacks.cc index 225aa43f3..79eef554b 100644 --- a/generate/templates/partials/configurable_callbacks.cc +++ b/generate/templates/partials/configurable_callbacks.cc @@ -1,4 +1,3 @@ -#include {% each fields|fieldsInfo as field %} {% if not field.ignore %} {% if field.isCallbackFunction %} diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index 01462281f..8b928e7f4 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -49,12 +49,31 @@ v8::Local tmp_{{ name }} = v8::Local::Cast(info[{{ jsArg }}]); from_{{ name }} = ({{ cType }})malloc(tmp_{{ name }}->Length() * sizeof({{ cType|unPointer }})); - for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) { + for (unsigned int i = 0; i < tmp_{{ name }}->Length(); i++) { {%-- // FIXME: should recursively call convertFromv8. --%} - from_{{ name }}[i] = {%if not cType|isDoublePointer %}*{%endif%}Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(Nan::To(Nan::Get(tmp_{{ name }}, Nan::New(static_cast(i))).ToLocalChecked()).ToLocalChecked())->GetValue(); + const v8::Local arrayVal = Nan::Get(tmp_{{ name }},i).ToLocalChecked(); + {%if arrayElementCppClassName == 'GitOid'%} + if (arrayVal->IsString()) { + // Try and parse in a string to a git_oid + Nan::Utf8String oidString(Nan::To(arrayVal).ToLocalChecked()); + + if (git_oid_fromstr(&from_{{ name }}[i], (const char *) strdup(*oidString)) != GIT_OK) { + if (git_error_last()) { + return Nan::ThrowError(git_error_last()->message); + } else { + return Nan::ThrowError("Unknown Error"); + } + } + } + else { + git_oid_cpy(&from_{{ name }}[i], Nan::ObjectWrap::Unwrap(Nan::To(arrayVal).ToLocalChecked())->GetValue()); } + {%else%} + from_{{ name }}[i] = Nan::ObjectWrap::Unwrap<{{ arrayElementCppClassName }}>(Nan::To(arrayVal).ToLocalChecked())->GetValue(); + {%endif%} + } {%elsif cppClassName == 'Function'%} {%elsif cppClassName == 'Buffer'%} diff --git a/lib/graph.js b/lib/graph.js new file mode 100644 index 000000000..737141007 --- /dev/null +++ b/lib/graph.js @@ -0,0 +1,15 @@ +var NodeGit = require("../"); + +var Graph = NodeGit.Graph; + +var _reachableFromAny = Graph.reachableFromAny; + +/** + * Determine if a commit is reachable from any of a list of commits by following parent edges. + * @param {repository} the repository where the commits exist + * @param {commit} a previously loaded commit + * @param {descendant_array} oids of the commits + */ +Graph.reachableFromAny = function(repository, commit, descendant_array) { + return _reachableFromAny(repository, commit, descendant_array, descendant_array.length); +}; diff --git a/lib/rebase.js b/lib/rebase.js index bbe502bf5..821d470dd 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -11,7 +11,7 @@ function defaultRebaseOptions(repository, options, checkoutStrategy) { // options object is later re-used. options = Object.assign({}, options); - if(options.signingCb && !options.commitCreateCb) { + if (options.signingCb && !options.commitCreateCb) { console.warn("signingCb is deperecated, use commitCreateCb instead."); let signingCb = options.signingCb; @@ -32,7 +32,6 @@ function defaultRebaseOptions(repository, options, checkoutStrategy) { tree, parents, signingCb).then((oid) => { - console.log(oid.toString()); return oid; }); }; diff --git a/test/tests/graph.js b/test/tests/graph.js index 01c088654..87dcfda54 100644 --- a/test/tests/graph.js +++ b/test/tests/graph.js @@ -61,4 +61,18 @@ describe("Graph", function() { assert(~result.message.indexOf("object not found - no match for id")); }); }); + + it("can tell if a commit is reachable from any of a list of commits", function() { + return Graph.reachableFromAny( + this.repository, + "32789a79e71fbc9e04d3eff7425e1771eb595150", + [ + "1729c73906bb8467f4095c2f4044083016b4dfde", + "e0aeedcff0584ebe00aed2c03c8ecd10839df908" + ] + ) + .then(function(result) { + assert.equal(result, 0); + }); + }); }); diff --git a/test/tests/rebase.js b/test/tests/rebase.js index 3974cf57b..d9aae1fbc 100644 --- a/test/tests/rebase.js +++ b/test/tests/rebase.js @@ -2528,7 +2528,6 @@ describe("Rebase", function() { assert.fail("should throw"); }) .catch((error) => { - console.log(error); assert(error.errno === NodeGit.Error.CODE.ITEROVER); assert.strictEqual(rebase.finish(ourSignature), 0); return NodeGit.Commit.extractSignature( From 205605809607b809b4a1e9391551eb819aeea0ef Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 5 Apr 2022 15:31:55 -0700 Subject: [PATCH 381/545] Implement new win32 Longpaths tests --- test/runner.js | 10 +++++++++ test/tests/checkout.js | 47 ++++++++++++++++++++++++++++++++++++++++++ vendor/libgit2.gyp | 2 ++ 3 files changed, 59 insertions(+) diff --git a/test/runner.js b/test/runner.js index 96629f4a5..5e7a5e026 100644 --- a/test/runner.js +++ b/test/runner.js @@ -28,12 +28,22 @@ before(function() { .then(function() { return exec("git clone " + url + " " + workdirPath); }) + .then(function() { + //to checkout the longpaths-checkout branch + if(process.platform === "win32") { + return exec("git config core.longpaths true", {cwd: workdirPath}); + } + return Promise.resolve(); + }) .then(function() { return exec("git checkout rev-walk", {cwd: workdirPath}); }) .then(function() { return exec("git checkout checkout-test", {cwd: workdirPath}); }) + .then(function() { + return exec("git checkout longpaths-checkout", {cwd: workdirPath}); + }) .then(function() { return exec("git checkout master", {cwd: workdirPath}); }) diff --git a/test/tests/checkout.js b/test/tests/checkout.js index e821016da..c10d50d3a 100644 --- a/test/tests/checkout.js +++ b/test/tests/checkout.js @@ -14,6 +14,7 @@ describe("Checkout", function() { var readMePath = local("../repos/workdir/" + readMeName); var packageJsonPath = local("../repos/workdir/" + packageJsonName); var checkoutBranchName = "checkout-test"; + var longpathBranchName = "longpaths-checkout"; beforeEach(function() { var test = this; @@ -35,6 +36,52 @@ describe("Checkout", function() { }); }); + it("can checkout a branch with a long file path", function() { + var test = this; + + return (function () { + if(process.platform === "win32") { + return test.repository.config() + .then(function(config) { + return config.setBool("core.longpaths", true); + }); + } + + return Promise.resolve(); + })() + .then(function() { + return test.repository.checkoutBranch(longpathBranchName); + }) + .then(function() { + return test.repository.getStatus(); + }) + .then(function(statuses) { + assert.equal(statuses.length, 0); + }); + }); + + it("cannot checkout long path file if core.longpaths is not set on win32", function() { + var test = this; + + if (process.platform !== "win32") { + this.skip(); + } + + return test.repository.config() + .then(function(config) { + config.setBool("core.longpaths", false); + }) + .then(function () { + return test.repository.checkoutBranch(longpathBranchName); + }) + .then(function() { + assert.fail(); + }) + .catch(function(err) { + assert(~err.message.indexOf("path too long")); + }); + }); + it("can force checkout a single file", function() { var test = this; diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index cd4560c54..05e29d7fc 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -248,6 +248,8 @@ "libgit2/src/signature.h", "libgit2/src/streams/socket.c", "libgit2/src/streams/socket.h", + "libgit2/src/streams/openssl_legacy.c", + "libgit2/src/streams/openssl_legacy.h", "libgit2/src/sortedcache.c", "libgit2/src/sortedcache.h", "libgit2/src/stash.c", From f96444d8ecf600565856913337fa05017e81959a Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 15 Apr 2022 10:03:59 -0700 Subject: [PATCH 382/545] Update libgit2 Submodule to 1.3.1 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 089b7778b..30d5c088a 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 089b7778bdf5f465ac7da71963ceff13323a6a82 +Subproject commit 30d5c088a45b29ac819aac890d70ed0ca5f7b194 From ad32cdab8381cc741866fce2bafce2383e76a949 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 15 Apr 2022 10:58:11 -0700 Subject: [PATCH 383/545] mark test repos safe --- test/runner.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/runner.js b/test/runner.js index 5e7a5e026..da72fd759 100644 --- a/test/runner.js +++ b/test/runner.js @@ -35,6 +35,12 @@ before(function() { } return Promise.resolve(); }) + .then(function() { + return exec(`git config --global --add safe.directory ${workdirPath}`); + }) + .then(function() { + return exec(`git config --global --add safe.directory ${constworkdir}`); + }) .then(function() { return exec("git checkout rev-walk", {cwd: workdirPath}); }) From 8a48d37798ae4f971ca730cd49a305d104806c1c Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 19 Apr 2022 08:10:52 -0700 Subject: [PATCH 384/545] switch to actually constant repo --- test/runner.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/runner.js b/test/runner.js index da72fd759..bc05f5e70 100644 --- a/test/runner.js +++ b/test/runner.js @@ -11,7 +11,8 @@ var constWorkdirPath = local("repos/constworkdir"); before(function() { this.timeout(350000); - var url = "https://github.com/nodegit/test"; + var testUrl = "https://github.com/nodegit/test"; + var constTestUrl = "https://github.com/nodegit/test-frozen"; return fse.remove(local("repos")) .then(function() { fse.remove(local("home")) @@ -23,10 +24,10 @@ before(function() { return exec("git init " + local("repos", "empty")); }) .then(function() { - return exec("git clone " + url + " " + constWorkdirPath); + return exec("git clone " + constTestUrl + " " + constWorkdirPath); }) .then(function() { - return exec("git clone " + url + " " + workdirPath); + return exec("git clone " + testUrl + " " + workdirPath); }) .then(function() { //to checkout the longpaths-checkout branch @@ -35,12 +36,6 @@ before(function() { } return Promise.resolve(); }) - .then(function() { - return exec(`git config --global --add safe.directory ${workdirPath}`); - }) - .then(function() { - return exec(`git config --global --add safe.directory ${constworkdir}`); - }) .then(function() { return exec("git checkout rev-walk", {cwd: workdirPath}); }) @@ -66,6 +61,12 @@ before(function() { .then(function() { return fse.writeFile(local("home", ".gitconfig"), "[user]\n name = John Doe\n email = johndoe@example.com"); + }) + .then(function() { + return exec(`git config --global --add safe.directory ${workdirPath}`); + }) + .then(function() { + return exec(`git config --global --add safe.directory ${constWorkdirPath}`); }); }); From 4ecc7856ff127b50b55038ef420a7fd00031b7ae Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 22 Apr 2022 10:25:48 -0700 Subject: [PATCH 385/545] Fix win32 tests --- test/runner.js | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/test/runner.js b/test/runner.js index bc05f5e70..3ca48486b 100644 --- a/test/runner.js +++ b/test/runner.js @@ -8,6 +8,31 @@ var NodeGit = require('..'); var workdirPath = local("repos/workdir"); var constWorkdirPath = local("repos/constworkdir"); +const testRepos = [ + "repos/bare", + "repos/blameRepo", + "repos/cherrypick", + "repos/clone", + "repos/constworkdir", + "repos/convenientLineTest", + "repos/empty", + "repos/index", + "repos/index", + "repos/merge", + "repos/merge-head", + "repos/new", + "repos/newrepo", + "repos/nonrepo", + "repos/rebase", + "repos/renamedFileRepo", + "repos/revertRepo", + "repos/stagingRepo", + "repos/submodule", + "repos/submodule/nodegittest/", + "repos/tree/", + "repos/workdir", +]; + before(function() { this.timeout(350000); @@ -62,12 +87,12 @@ before(function() { return fse.writeFile(local("home", ".gitconfig"), "[user]\n name = John Doe\n email = johndoe@example.com"); }) - .then(function() { - return exec(`git config --global --add safe.directory ${workdirPath}`); + .then( async function() { + //mark all test repos as safe + for(let repo of testRepos) { + await exec(`git config --global --add safe.directory ${local(repo)}`); + } }) - .then(function() { - return exec(`git config --global --add safe.directory ${constWorkdirPath}`); - }); }); beforeEach(function() { From 4d4be3458fea5b9d6da03018e53ce58d2a5cefbe Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 31 Mar 2022 14:50:23 -0700 Subject: [PATCH 386/545] Statically Link OpenSSL on linux --- generate/templates/templates/binding.gyp | 38 +++--- utils/acquireOpenSSL.js | 116 ++++++++++++++---- utils/configureLibssh2.js | 4 +- vendor/libgit2.gyp | 81 ++++++------ vendor/patches/README.md | 12 ++ ...001-unix_force_getentropy_dso_lookup.patch | 23 ++++ 6 files changed, 193 insertions(+), 81 deletions(-) create mode 100644 vendor/patches/README.md create mode 100644 vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 8b641cc29..83b0c4cdf 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -10,7 +10,7 @@ { "target_name": "acquireOpenSSL", "conditions": [ - ["<(is_electron) == 1 and OS != 'linux' and `https://www.openssl.org/source/openssl-${version}.tar.gz`; @@ -27,7 +28,7 @@ class HashVerify extends stream.Transform { this.expected = expected; this.hash = crypto.createHash(algorithm); } - + _transform(chunk, encoding, callback) { this.hash.update(chunk, encoding); callback(null, chunk); @@ -40,28 +41,97 @@ class HashVerify extends stream.Transform { } } +// currently this only needs to be done on linux +const applyOpenSSLPatches = async (buildCwd) => { + try { + for(const patchFilename of await fse.readdir(opensslPatchPath)) { + if(patchFilename.split('.').pop() == 'patch') { + console.log(`applying ${patchFilename}`); + await execPromise(`patch -up0 -i ${path.join(patchPath, patchFilename)}`, { + cwd: buildCwd + }, { pipeOutput: true }); + } + } + } catch(e) { + console.log("Patch application failed: ", e); + return; + } +} + const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { - const triplet = process.arch === 'x64' - ? 'darwin64-x86_64-cc' - : 'darwin64-arm64-cc'; - - await execPromise(`./Configure ${ - triplet - } no-shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --prefix="${ - extractPath - }" --openssldir="${extractPath}" -mmacosx-version-min=${macOsDeploymentTarget}`, { + const arguments = [ + process.arch === 'x64' ? 'darwin64-x86_64-cc' : 'darwin64-arm64-cc', + // speed up ecdh on little-endian platform with 128bit int support + 'enable-ec_nistp_64_gcc_128', + // compile static library + 'no-shared', + // disable ssl2, ssl3, and compression + 'no-ssl2', + 'no-ssl3', + 'no-comp', + //set build/install directory + `--prefix="${extractPath}"`, + `--openssldir="${extractPath}"`, + //set macos version requirement + `-mmacosx-version-min=${macOsDeploymentTarget}` + ]; + + await execPromise(`./Configure ${arguments.join(' ')}`, { cwd: buildCwd }, { pipeOutput: true }); - await execPromise("make", { + // only build the libraries, not the tests/fuzzer or apps + await execPromise('make build_libs', { cwd: buildCwd }, { pipeOutput: true }); - await execPromise("make test", { + await execPromise('make test', { cwd: buildCwd }, { pipeOutput: true }); - await execPromise("make install", { + await execPromise('make install_sw', { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 // we should really just use spawn + }, { pipeOutput: true }); +}; + +const buildLinux = async (buildCwd) => { + const arguments = [ + 'linux-x86_64', + // Electron(at least on centos7) imports the libcups library at runtime, which has a + // dependency on the system libssl/libcrypto which causes symbol conflicts and segfaults. + // To fix this we need to remove hide all the internal openssl symbols to prevent them + // from being overridden, this only affects shared libraries, which in this case + // is nodegit + '-fvisibility=hidden', + // compile static library + 'no-shared', + // disable ssl2, ssl3, and compression + 'no-ssl2', + 'no-ssl3', + 'no-comp', + //set build/install directory + `--prefix="${extractPath}"`, + `--openssldir="${extractPath}"` + ]; + await execPromise(`./Configure ${arguments.join(" ")}`, { + cwd: buildCwd + }, { pipeOutput: true }); + + await applyOpenSSLPatches(buildCwd); + + // only build the libraries, not the tests/fuzzer or apps + await execPromise("make build_libs", { + cwd: buildCwd + }, { pipeOutput: true }); + + //TODO: uncomment + // await execPromise("make test", { + // cwd: buildCwd + // }, { pipeOutput: true }); + + //only install software, not the docs + await execPromise("make install_sw", { cwd: buildCwd, maxBuffer: 10 * 1024 * 1024 // we should really just use spawn }, { pipeOutput: true }); @@ -80,7 +150,7 @@ const buildWin32 = async (buildCwd) => { } catch { throw new Error(`vcvarsall.bat not found at ${vcvarsallPath}`); } - + const vcTarget = vcvarsallArch === "x64" ? "VC-WIN64A" : "VC-WIN32"; await execPromise(`"${win32BatPath}" "${vcvarsallPath}" ${vcvarsallArch} ${vcTarget}`, { cwd: buildCwd, @@ -128,13 +198,8 @@ const makeOnStreamDownloadProgress = () => { }; const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => { - if (process.platform !== "darwin" && process.platform !== "win32") { - console.log(`Skipping OpenSSL build, not required on ${process.platform}`); - return; - } - await removeOpenSSLIfOudated(openSSLVersion); - + try { await fs.stat(extractPath); console.log("Skipping OpenSSL build, dir exists"); @@ -148,7 +213,7 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => const downloadStream = got.stream(openSSLUrl); downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); - + await pipeline( downloadStream, new HashVerify("sha256", openSSLSha256), @@ -162,6 +227,8 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => if (process.platform === "darwin") { await buildDarwin(buildCwd, macOsDeploymentTarget); + } else if (process.platform === "linux") { + await buildLinux(buildCwd); } else if (process.platform === "win32") { await buildWin32(buildCwd); } else { @@ -172,11 +239,6 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => } const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) => { - if (process.platform !== "darwin" && process.platform !== "win32") { - console.log(`Skipping OpenSSL download, not required on ${process.platform}`); - return; - } - try { await fs.stat(extractPath); console.log("Skipping OpenSSL download, dir exists"); @@ -185,7 +247,7 @@ const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) = const downloadStream = got.stream(downloadBinUrl); downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); - + const pipelineSteps = [ downloadStream, maybeDownloadSha256 ? new HashVerify("sha256", maybeDownloadSha256) : null, diff --git a/utils/configureLibssh2.js b/utils/configureLibssh2.js index befdb4594..6af92cec4 100644 --- a/utils/configureLibssh2.js +++ b/utils/configureLibssh2.js @@ -2,6 +2,7 @@ var cp = require("child_process"); var fse = require("fs-extra"); var path = require("path"); +const opensslVendorDirectory = path.resolve(__dirname, "..", "vendor", "openssl"); const libssh2VendorDirectory = path.resolve(__dirname, "..", "vendor", "libssh2"); const libssh2ConfigureScript = path.join(libssh2VendorDirectory, "configure"); const libssh2StaticConfigDirectory = path.resolve(__dirname, "..", "vendor", "static_config", "libssh2"); @@ -24,8 +25,9 @@ module.exports = function retrieveExternalDependencies() { newEnv[key] = process.env[key]; }); + let cpArgs = `--with-libssl-prefix=${opensslVendorDirectory}`; cp.exec( - libssh2ConfigureScript, + `${libssh2ConfigureScript} ${cpArgs}`, { cwd: libssh2VendorDirectory, env: newEnv diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 05e29d7fc..6715b1a8d 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -338,36 +338,36 @@ ] }], ["OS=='mac'", { - "conditions": [ - ["<(is_electron) == 1", { - "include_dirs": [ - "<(electron_openssl_root)/include" - ] - }] - ], - "defines": [ - "GIT_SECURE_TRANSPORT", - "GIT_USE_STAT_MTIMESPEC", - "GIT_REGEX_REGCOMP_L", - "GIT_USE_ICONV" - ], - "sources": [ - "libgit2/src/streams/stransport.c", - "libgit2/src/streams/stransport.h" - ], - "libraries": [ - "-liconv", - ], - "link_settings": { - "xcode_settings": { - "OTHER_LDFLAGS": [ - "-framework Security", - "-framework CoreFoundation" - ], - } - } + "defines": [ + "GIT_SECURE_TRANSPORT", + "GIT_USE_STAT_MTIMESPEC", + "GIT_REGEX_REGCOMP_L", + "GIT_USE_ICONV" + ], + "sources": [ + "libgit2/src/streams/stransport.c", + "libgit2/src/streams/stransport.h" + ], + "libraries": [ + "-liconv", + ], + "link_settings": { + "xcode_settings": { + "OTHER_LDFLAGS": [ + "-framework Security", + "-framework CoreFoundation" + ], + } + } }], ["OS=='mac' or OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { + "conditions": [ + ["<(is_electron) == 1", { + "include_dirs": [ + "<(electron_openssl_root)/include" + ] + }] + ], "dependencies": [ "ntlmclient" ], @@ -620,10 +620,14 @@ ] }, "conditions": [ - ["OS=='mac' and <(is_electron) == 1", { - "include_dirs": [ - "<(electron_openssl_root)/include", - ] + ["OS=='mac' or OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { + "conditions": [ + ["<(is_electron) == 1", { + "include_dirs": [ + "<(electron_openssl_root)/include" + ] + }] + ], }], ["OS=='win'", { "conditions": [ @@ -682,10 +686,12 @@ "UNICODE_BUILTIN" ], "conditions": [ - ["OS=='mac' and <(is_electron) == 1", { - "include_dirs": ["<(electron_openssl_root)/include"] - }], ["OS=='mac'", { + "conditions": [ + ["<(is_electron) == 1", { + "include_dirs": ["<(electron_openssl_root)/include"] + }] + ], "sources": [ "libgit2/deps/ntlmclient/crypt_commoncrypto.c", "libgit2/deps/ntlmclient/crypt_commoncrypto.h" @@ -695,6 +701,11 @@ ] }], ["OS=='linux'", { + "conditions": [ + ["<(is_electron) == 1", { + "include_dirs": ["<(electron_openssl_root)/include"] + }] + ], "sources": [ "libgit2/deps/ntlmclient/crypt_openssl.c", "libgit2/deps/ntlmclient/crypt_openssl.h" diff --git a/vendor/patches/README.md b/vendor/patches/README.md new file mode 100644 index 000000000..6f025a762 --- /dev/null +++ b/vendor/patches/README.md @@ -0,0 +1,12 @@ +# Patches directory +Patches for modifying vendor code without including it. + +Patches will be applied from 000 to 999 + +### Naming Convention + +`-.patch` + +### Content + +All patches should start with a description of what they do and why they're needed. \ No newline at end of file diff --git a/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch b/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch new file mode 100644 index 000000000..eece09621 --- /dev/null +++ b/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch @@ -0,0 +1,23 @@ +openssl doesn't have any sort of gaurd around this section of code other than +checking if we're compiling an elf binary on gnu linux. the syscall wrapper +`getentropy` is only available on glibc >= 2.25 which is a problem if we want +to support platforms like centos7 which ships with glibc 2.17. Attempting to +load this code on centos7 causes a runtime "undefined symbol error since glibc +doesn't provide it. +luckily openssl provides a backup lookup method in form of a dlopen call but +theres no way to configure for it, hence this patch. +Note further that centos7 doesn't have this function or the syscall it wraps +so the symbol lookup will fail and it will fallback to reading from /dev/random. +hence this patch just fixes compilation. +JZA +--- crypto/rand/rand_unix.c ++++ crypto/rand/rand_unix.c +@@ -372,7 +372,7 @@ static ssize_t syscall_random(void *buf, size_t buflen) + * Note: Sometimes getentropy() can be provided but not implemented + * internally. So we need to check errno for ENOSYS + */ +-# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux) ++# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux) && 0 + extern int getentropy(void *buffer, size_t length) __attribute__((weak)); + + if (getentropy != NULL) { From b506c5902db48e6d8496e7ea14750d1ba5337c2c Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 31 Mar 2022 16:28:35 -0700 Subject: [PATCH 387/545] Stop building action-only targets --- generate/templates/templates/binding.gyp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 83b0c4cdf..5e1fb8e54 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -9,6 +9,7 @@ "targets": [ { "target_name": "acquireOpenSSL", + "type": "none", "conditions": [ ["<(is_electron) == 1 and Date: Thu, 31 Mar 2022 17:04:50 -0700 Subject: [PATCH 388/545] Minor cleanups --- utils/acquireOpenSSL.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 3e4b1b6ca..87319d90d 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -114,24 +114,23 @@ const buildLinux = async (buildCwd) => { `--prefix="${extractPath}"`, `--openssldir="${extractPath}"` ]; - await execPromise(`./Configure ${arguments.join(" ")}`, { + await execPromise(`./Configure ${arguments.join(' ')}`, { cwd: buildCwd }, { pipeOutput: true }); await applyOpenSSLPatches(buildCwd); // only build the libraries, not the tests/fuzzer or apps - await execPromise("make build_libs", { + await execPromise('make build_libs', { cwd: buildCwd }, { pipeOutput: true }); - //TODO: uncomment - // await execPromise("make test", { - // cwd: buildCwd - // }, { pipeOutput: true }); + await execPromise('make test', { + cwd: buildCwd + }, { pipeOutput: true }); //only install software, not the docs - await execPromise("make install_sw", { + await execPromise('make install_sw', { cwd: buildCwd, maxBuffer: 10 * 1024 * 1024 // we should really just use spawn }, { pipeOutput: true }); From 5f283e569ecb31fddbefc759f7fbbb648df0e268 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 1 Apr 2022 09:09:53 -0700 Subject: [PATCH 389/545] =?UTF-8?q?=F0=9F=91=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/acquireOpenSSL.js | 15 +++++++-------- .../001-unix_force_getentropy_dso_lookup.patch | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 87319d90d..e19dc86c7 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -61,15 +61,15 @@ const applyOpenSSLPatches = async (buildCwd) => { const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { const arguments = [ process.arch === 'x64' ? 'darwin64-x86_64-cc' : 'darwin64-arm64-cc', - // speed up ecdh on little-endian platform with 128bit int support + // speed up ecdh on little-endian platforms with 128bit int support 'enable-ec_nistp_64_gcc_128', - // compile static library + // compile static libraries 'no-shared', // disable ssl2, ssl3, and compression 'no-ssl2', 'no-ssl3', 'no-comp', - //set build/install directory + //set install directory `--prefix="${extractPath}"`, `--openssldir="${extractPath}"`, //set macos version requirement @@ -100,17 +100,16 @@ const buildLinux = async (buildCwd) => { 'linux-x86_64', // Electron(at least on centos7) imports the libcups library at runtime, which has a // dependency on the system libssl/libcrypto which causes symbol conflicts and segfaults. - // To fix this we need to remove hide all the internal openssl symbols to prevent them - // from being overridden, this only affects shared libraries, which in this case - // is nodegit + // To fix this we need to hide all the openssl symbols to prevent them from being overridden + // by the runtime linker. '-fvisibility=hidden', - // compile static library + // compile static libraries 'no-shared', // disable ssl2, ssl3, and compression 'no-ssl2', 'no-ssl3', 'no-comp', - //set build/install directory + //set install directory `--prefix="${extractPath}"`, `--openssldir="${extractPath}"` ]; diff --git a/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch b/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch index eece09621..6802c7fa5 100644 --- a/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch +++ b/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch @@ -1,4 +1,4 @@ -openssl doesn't have any sort of gaurd around this section of code other than +openssl doesn't have any sort of guard around this section of code other than checking if we're compiling an elf binary on gnu linux. the syscall wrapper `getentropy` is only available on glibc >= 2.25 which is a problem if we want to support platforms like centos7 which ships with glibc 2.17. Attempting to @@ -9,7 +9,7 @@ theres no way to configure for it, hence this patch. Note further that centos7 doesn't have this function or the syscall it wraps so the symbol lookup will fail and it will fallback to reading from /dev/random. hence this patch just fixes compilation. -JZA +author: JZA --- crypto/rand/rand_unix.c +++ crypto/rand/rand_unix.c @@ -372,7 +372,7 @@ static ssize_t syscall_random(void *buf, size_t buflen) From 094bafaeeec45522408bd5e1d21c31f128eb8bd5 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 25 Apr 2022 12:47:46 -0700 Subject: [PATCH 390/545] Match NodeGit style --- utils/acquireOpenSSL.js | 52 ++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index e19dc86c7..b34341291 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -44,8 +44,8 @@ class HashVerify extends stream.Transform { // currently this only needs to be done on linux const applyOpenSSLPatches = async (buildCwd) => { try { - for(const patchFilename of await fse.readdir(opensslPatchPath)) { - if(patchFilename.split('.').pop() == 'patch') { + for (const patchFilename of await fse.readdir(opensslPatchPath)) { + if (patchFilename.split(".").pop() === "patch") { console.log(`applying ${patchFilename}`); await execPromise(`patch -up0 -i ${path.join(patchPath, patchFilename)}`, { cwd: buildCwd @@ -60,36 +60,36 @@ const applyOpenSSLPatches = async (buildCwd) => { const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { const arguments = [ - process.arch === 'x64' ? 'darwin64-x86_64-cc' : 'darwin64-arm64-cc', + process.arch === "x64" ? "darwin64-x86_64-cc" : "darwin64-arm64-cc", // speed up ecdh on little-endian platforms with 128bit int support - 'enable-ec_nistp_64_gcc_128', + "enable-ec_nistp_64_gcc_128", // compile static libraries - 'no-shared', + "no-shared", // disable ssl2, ssl3, and compression - 'no-ssl2', - 'no-ssl3', - 'no-comp', - //set install directory + "no-ssl2", + "no-ssl3", + "no-comp", + // set install directory `--prefix="${extractPath}"`, `--openssldir="${extractPath}"`, - //set macos version requirement + // set macos version requirement `-mmacosx-version-min=${macOsDeploymentTarget}` ]; - await execPromise(`./Configure ${arguments.join(' ')}`, { + await execPromise(`./Configure ${arguments.join(" ")}`, { cwd: buildCwd }, { pipeOutput: true }); // only build the libraries, not the tests/fuzzer or apps - await execPromise('make build_libs', { + await execPromise("make build_libs", { cwd: buildCwd }, { pipeOutput: true }); - await execPromise('make test', { + await execPromise("make test", { cwd: buildCwd }, { pipeOutput: true }); - await execPromise('make install_sw', { + await execPromise("make install_sw", { cwd: buildCwd, maxBuffer: 10 * 1024 * 1024 // we should really just use spawn }, { pipeOutput: true }); @@ -97,39 +97,39 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { const buildLinux = async (buildCwd) => { const arguments = [ - 'linux-x86_64', + "linux-x86_64", // Electron(at least on centos7) imports the libcups library at runtime, which has a // dependency on the system libssl/libcrypto which causes symbol conflicts and segfaults. // To fix this we need to hide all the openssl symbols to prevent them from being overridden // by the runtime linker. - '-fvisibility=hidden', + "-fvisibility=hidden", // compile static libraries - 'no-shared', + "no-shared", // disable ssl2, ssl3, and compression - 'no-ssl2', - 'no-ssl3', - 'no-comp', - //set install directory + "no-ssl2", + "no-ssl3", + "no-comp", + // set install directory `--prefix="${extractPath}"`, `--openssldir="${extractPath}"` ]; - await execPromise(`./Configure ${arguments.join(' ')}`, { + await execPromise(`./Configure ${arguments.join(" ")}`, { cwd: buildCwd }, { pipeOutput: true }); await applyOpenSSLPatches(buildCwd); // only build the libraries, not the tests/fuzzer or apps - await execPromise('make build_libs', { + await execPromise("make build_libs", { cwd: buildCwd }, { pipeOutput: true }); - await execPromise('make test', { + await execPromise("make test", { cwd: buildCwd }, { pipeOutput: true }); - //only install software, not the docs - await execPromise('make install_sw', { + // only install software, not the docs + await execPromise("make install_sw", { cwd: buildCwd, maxBuffer: 10 * 1024 * 1024 // we should really just use spawn }, { pipeOutput: true }); From fb9c1c94477d830c48665a85df6a343ff51087b6 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 25 Apr 2022 12:50:44 -0700 Subject: [PATCH 391/545] Throw if patch application fails --- utils/acquireOpenSSL.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index b34341291..92ff231e4 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -54,7 +54,7 @@ const applyOpenSSLPatches = async (buildCwd) => { } } catch(e) { console.log("Patch application failed: ", e); - return; + throw e; } } From 39e76217ad0795ab35b517f76e8d16a70efa23e5 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 25 Apr 2022 15:07:26 -0700 Subject: [PATCH 392/545] Use correct patch path variable --- utils/acquireOpenSSL.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 92ff231e4..fb0682ddf 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -47,7 +47,7 @@ const applyOpenSSLPatches = async (buildCwd) => { for (const patchFilename of await fse.readdir(opensslPatchPath)) { if (patchFilename.split(".").pop() === "patch") { console.log(`applying ${patchFilename}`); - await execPromise(`patch -up0 -i ${path.join(patchPath, patchFilename)}`, { + await execPromise(`patch -up0 -i ${path.join(opensslPatchPath, patchFilename)}`, { cwd: buildCwd }, { pipeOutput: true }); } From 38d64f2567b8aa6707b70efb56884c81d3dbbb20 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 25 Apr 2022 17:24:30 -0700 Subject: [PATCH 393/545] Default to dynamically linking OpenSSL on Linux Statically link if NODEGIT_OPENSSL_STATIC_LINK=1 --- generate/templates/templates/binding.gyp | 11 +++++++++-- guides/install/from-source/README.md | 2 +- utils/acquireOpenSSL.js | 22 +++++++++++++++++++++- utils/configureLibssh2.js | 6 ++++-- vendor/libgit2.gyp | 7 ++++--- 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 5e1fb8e54..26b1f197d 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -3,6 +3,7 @@ "is_electron%": " { }; const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => { + if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== 'linux') { + console.log(`Skipping OpenSSL build, not required on ${process.platform}`); + return; + } + + if (process.platform === 'linux' && process.env.NODEGIT_OPENSSL_STATIC_LINK !== '1') { + console.log(`Skipping OpenSSL build, NODEGIT_OPENSSL_STATIC_LINK !== 1`); + return; + } + await removeOpenSSLIfOudated(openSSLVersion); try { @@ -225,7 +235,7 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => if (process.platform === "darwin") { await buildDarwin(buildCwd, macOsDeploymentTarget); - } else if (process.platform === "linux") { + } else if (process.platform === "linux" && process.env.NODEGIT_OPENSSL_STATIC_LINK === '1') { await buildLinux(buildCwd); } else if (process.platform === "win32") { await buildWin32(buildCwd); @@ -237,6 +247,16 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => } const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) => { + if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== 'linux') { + console.log(`Skipping OpenSSL download, not required on ${process.platform}`); + return; + } + + if (process.platform === 'linux' && process.env.NODEGIT_OPENSSL_STATIC_LINK !== '1') { + console.log(`Skipping OpenSSL download, NODEGIT_OPENSSL_STATIC_LINK !== 1`); + return; + } + try { await fs.stat(extractPath); console.log("Skipping OpenSSL download, dir exists"); diff --git a/utils/configureLibssh2.js b/utils/configureLibssh2.js index 6af92cec4..95328ebdb 100644 --- a/utils/configureLibssh2.js +++ b/utils/configureLibssh2.js @@ -25,9 +25,11 @@ module.exports = function retrieveExternalDependencies() { newEnv[key] = process.env[key]; }); - let cpArgs = `--with-libssl-prefix=${opensslVendorDirectory}`; + let cpArgs = process.env.NODEGIT_OPENSSL_STATIC_LINK === '1' + ? ` --with-libssl-prefix=${opensslVendorDirectory}` + : ''; cp.exec( - `${libssh2ConfigureScript} ${cpArgs}`, + `${libssh2ConfigureScript}${cpArgs}`, { cwd: libssh2VendorDirectory, env: newEnv diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 6715b1a8d..7d78eb95d 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -11,6 +11,7 @@ "is_clang%": 0, "is_IBMi%": " Date: Mon, 2 May 2022 12:41:32 -0700 Subject: [PATCH 394/545] Bump to v0.28.0-alpha.14 --- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1df30901b..249833e3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## v0.28.0-alpha.14 [(2022-05-02)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.14) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.13...v0.28.0-alpha.14) + +#### Summary of changes +- Allow statically linking OpenSSL on Linux +- Update libgit2 to 1.3.1 + +#### Merged PRs into NodeGit +- [Statically compile OpenSSL on linux for electron](https://github.com/nodegit/nodegit/pull/1905) +- [Upgrade libgit2 to 1.3.1](https://github.com/nodegit/nodegit/pull/1894) + ## v0.28.0-alpha.13 [(2022-03-22)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.13) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.12...v0.28.0-alpha.13) diff --git a/package-lock.json b/package-lock.json index d0a721628..239a4940c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.13", + "version": "0.28.0-alpha.14", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.13", + "version": "0.28.0-alpha.14", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 139ba4a8b..83168031e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.13", + "version": "0.28.0-alpha.14", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 2ad53cc58bf8caa5ef8a507d53319d8763f0f388 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 4 May 2022 18:36:11 -0700 Subject: [PATCH 395/545] Expose get/set owner validation opts GIT_OPT_GET_OWNER_VALIDATION and GIT_OPT_SET_OWNER_VALIDATION --- generate/input/libgit2-docs.json | 1009 +++++++++++---------- generate/templates/manual/libgit2/opts.cc | 12 +- 2 files changed, 526 insertions(+), 495 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 5bd855577..aa0f54e35 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -206,7 +206,7 @@ "git_libgit2_opts" ], "meta": {}, - "lines": 456 + "lines": 466 }, { "file": "git2/config.h", @@ -391,7 +391,7 @@ "git_error_set_oom" ], "meta": {}, - "lines": 160 + "lines": 161 }, { "file": "git2/filter.h", @@ -1354,7 +1354,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_annotated_commit_from_ref-1" + "ex/v1.3.1/checkout.html#git_annotated_commit_from_ref-1" ] } }, @@ -1487,12 +1487,12 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_annotated_commit_id-2" + "ex/v1.3.1/checkout.html#git_annotated_commit_id-2" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_annotated_commit_id-1", - "ex/v1.3.0/merge.html#git_annotated_commit_id-2", - "ex/v1.3.0/merge.html#git_annotated_commit_id-3" + "ex/v1.3.1/merge.html#git_annotated_commit_id-1", + "ex/v1.3.1/merge.html#git_annotated_commit_id-2", + "ex/v1.3.1/merge.html#git_annotated_commit_id-3" ] } }, @@ -1519,9 +1519,9 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_annotated_commit_ref-3", - "ex/v1.3.0/checkout.html#git_annotated_commit_ref-4", - "ex/v1.3.0/checkout.html#git_annotated_commit_ref-5" + "ex/v1.3.1/checkout.html#git_annotated_commit_ref-3", + "ex/v1.3.1/checkout.html#git_annotated_commit_ref-4", + "ex/v1.3.1/checkout.html#git_annotated_commit_ref-5" ] } }, @@ -1548,7 +1548,7 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_annotated_commit_free-6" + "ex/v1.3.1/checkout.html#git_annotated_commit_free-6" ] } }, @@ -2073,7 +2073,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_blame_get_hunk_byline-1" + "ex/v1.3.1/blame.html#git_blame_get_hunk_byline-1" ] } }, @@ -2115,7 +2115,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_blame_file-2" + "ex/v1.3.1/blame.html#git_blame_file-2" ] } }, @@ -2179,7 +2179,7 @@ "group": "blame", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_blame_free-3" + "ex/v1.3.1/blame.html#git_blame_free-3" ] } }, @@ -2216,10 +2216,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_blob_lookup-4" + "ex/v1.3.1/blame.html#git_blob_lookup-4" ], "general.c": [ - "ex/v1.3.0/general.html#git_blob_lookup-1" + "ex/v1.3.1/general.html#git_blob_lookup-1" ] } }, @@ -2283,10 +2283,10 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_blob_free-5" + "ex/v1.3.1/blame.html#git_blob_free-5" ], "general.c": [ - "ex/v1.3.0/general.html#git_blob_free-2" + "ex/v1.3.1/general.html#git_blob_free-2" ] } }, @@ -2357,13 +2357,13 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_blob_rawcontent-6" + "ex/v1.3.1/blame.html#git_blob_rawcontent-6" ], "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_blob_rawcontent-1" + "ex/v1.3.1/cat-file.html#git_blob_rawcontent-1" ], "general.c": [ - "ex/v1.3.0/general.html#git_blob_rawcontent-3" + "ex/v1.3.1/general.html#git_blob_rawcontent-3" ] } }, @@ -2390,14 +2390,14 @@ "group": "blob", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_blob_rawsize-7" + "ex/v1.3.1/blame.html#git_blob_rawsize-7" ], "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_blob_rawsize-2" + "ex/v1.3.1/cat-file.html#git_blob_rawsize-2" ], "general.c": [ - "ex/v1.3.0/general.html#git_blob_rawsize-4", - "ex/v1.3.0/general.html#git_blob_rawsize-5" + "ex/v1.3.1/general.html#git_blob_rawsize-4", + "ex/v1.3.1/general.html#git_blob_rawsize-5" ] } }, @@ -2759,7 +2759,7 @@ "group": "branch", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_branch_create_from_annotated-7" + "ex/v1.3.1/checkout.html#git_branch_create_from_annotated-7" ] } }, @@ -2973,7 +2973,7 @@ "group": "branch", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_branch_name-4" + "ex/v1.3.1/merge.html#git_branch_name-4" ] } }, @@ -3253,11 +3253,11 @@ "group": "buf", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_buf_dispose-1", - "ex/v1.3.0/diff.html#git_buf_dispose-2" + "ex/v1.3.1/diff.html#git_buf_dispose-1", + "ex/v1.3.1/diff.html#git_buf_dispose-2" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_buf_dispose-1" + "ex/v1.3.1/tag.html#git_buf_dispose-1" ] } }, @@ -3483,10 +3483,10 @@ "group": "checkout", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_checkout_tree-8" + "ex/v1.3.1/checkout.html#git_checkout_tree-8" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_checkout_tree-5" + "ex/v1.3.1/merge.html#git_checkout_tree-5" ] } }, @@ -3693,18 +3693,18 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_commit_lookup-9" + "ex/v1.3.1/checkout.html#git_commit_lookup-9" ], "general.c": [ - "ex/v1.3.0/general.html#git_commit_lookup-6", - "ex/v1.3.0/general.html#git_commit_lookup-7", - "ex/v1.3.0/general.html#git_commit_lookup-8" + "ex/v1.3.1/general.html#git_commit_lookup-6", + "ex/v1.3.1/general.html#git_commit_lookup-7", + "ex/v1.3.1/general.html#git_commit_lookup-8" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_lookup-1" + "ex/v1.3.1/log.html#git_commit_lookup-1" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_commit_lookup-6" + "ex/v1.3.1/merge.html#git_commit_lookup-6" ] } }, @@ -3768,20 +3768,20 @@ "group": "commit", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_commit_free-10" + "ex/v1.3.1/checkout.html#git_commit_free-10" ], "general.c": [ - "ex/v1.3.0/general.html#git_commit_free-9", - "ex/v1.3.0/general.html#git_commit_free-10", - "ex/v1.3.0/general.html#git_commit_free-11", - "ex/v1.3.0/general.html#git_commit_free-12", - "ex/v1.3.0/general.html#git_commit_free-13" + "ex/v1.3.1/general.html#git_commit_free-9", + "ex/v1.3.1/general.html#git_commit_free-10", + "ex/v1.3.1/general.html#git_commit_free-11", + "ex/v1.3.1/general.html#git_commit_free-12", + "ex/v1.3.1/general.html#git_commit_free-13" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_free-2", - "ex/v1.3.0/log.html#git_commit_free-3", - "ex/v1.3.0/log.html#git_commit_free-4", - "ex/v1.3.0/log.html#git_commit_free-5" + "ex/v1.3.1/log.html#git_commit_free-2", + "ex/v1.3.1/log.html#git_commit_free-3", + "ex/v1.3.1/log.html#git_commit_free-4", + "ex/v1.3.1/log.html#git_commit_free-5" ] } }, @@ -3808,10 +3808,10 @@ "group": "commit", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_commit_id-14" + "ex/v1.3.1/general.html#git_commit_id-14" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_id-6" + "ex/v1.3.1/log.html#git_commit_id-6" ] } }, @@ -3838,8 +3838,8 @@ "group": "commit", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_commit_owner-7", - "ex/v1.3.0/log.html#git_commit_owner-8" + "ex/v1.3.1/log.html#git_commit_owner-7", + "ex/v1.3.1/log.html#git_commit_owner-8" ] } }, @@ -3888,21 +3888,21 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_commit_message-3", - "ex/v1.3.0/cat-file.html#git_commit_message-4" + "ex/v1.3.1/cat-file.html#git_commit_message-3", + "ex/v1.3.1/cat-file.html#git_commit_message-4" ], "general.c": [ - "ex/v1.3.0/general.html#git_commit_message-15", - "ex/v1.3.0/general.html#git_commit_message-16", - "ex/v1.3.0/general.html#git_commit_message-17" + "ex/v1.3.1/general.html#git_commit_message-15", + "ex/v1.3.1/general.html#git_commit_message-16", + "ex/v1.3.1/general.html#git_commit_message-17" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_message-9", - "ex/v1.3.0/log.html#git_commit_message-10", - "ex/v1.3.0/log.html#git_commit_message-11" + "ex/v1.3.1/log.html#git_commit_message-9", + "ex/v1.3.1/log.html#git_commit_message-10", + "ex/v1.3.1/log.html#git_commit_message-11" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_commit_message-2" + "ex/v1.3.1/tag.html#git_commit_message-2" ] } }, @@ -3995,8 +3995,8 @@ "group": "commit", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_commit_time-18", - "ex/v1.3.0/general.html#git_commit_time-19" + "ex/v1.3.1/general.html#git_commit_time-18", + "ex/v1.3.1/general.html#git_commit_time-19" ] } }, @@ -4045,13 +4045,13 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_commit_committer-5" + "ex/v1.3.1/cat-file.html#git_commit_committer-5" ], "general.c": [ - "ex/v1.3.0/general.html#git_commit_committer-20" + "ex/v1.3.1/general.html#git_commit_committer-20" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_committer-12" + "ex/v1.3.1/log.html#git_commit_committer-12" ] } }, @@ -4078,15 +4078,15 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_commit_author-6" + "ex/v1.3.1/cat-file.html#git_commit_author-6" ], "general.c": [ - "ex/v1.3.0/general.html#git_commit_author-21", - "ex/v1.3.0/general.html#git_commit_author-22" + "ex/v1.3.1/general.html#git_commit_author-21", + "ex/v1.3.1/general.html#git_commit_author-22" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_author-13", - "ex/v1.3.0/log.html#git_commit_author-14" + "ex/v1.3.1/log.html#git_commit_author-13", + "ex/v1.3.1/log.html#git_commit_author-14" ] } }, @@ -4204,11 +4204,11 @@ "group": "commit", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_commit_tree-15", - "ex/v1.3.0/log.html#git_commit_tree-16", - "ex/v1.3.0/log.html#git_commit_tree-17", - "ex/v1.3.0/log.html#git_commit_tree-18", - "ex/v1.3.0/log.html#git_commit_tree-19" + "ex/v1.3.1/log.html#git_commit_tree-15", + "ex/v1.3.1/log.html#git_commit_tree-16", + "ex/v1.3.1/log.html#git_commit_tree-17", + "ex/v1.3.1/log.html#git_commit_tree-18", + "ex/v1.3.1/log.html#git_commit_tree-19" ] } }, @@ -4235,7 +4235,7 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_commit_tree_id-7" + "ex/v1.3.1/cat-file.html#git_commit_tree_id-7" ] } }, @@ -4262,14 +4262,14 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_commit_parentcount-8" + "ex/v1.3.1/cat-file.html#git_commit_parentcount-8" ], "general.c": [ - "ex/v1.3.0/general.html#git_commit_parentcount-23" + "ex/v1.3.1/general.html#git_commit_parentcount-23" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_parentcount-20", - "ex/v1.3.0/log.html#git_commit_parentcount-21" + "ex/v1.3.1/log.html#git_commit_parentcount-20", + "ex/v1.3.1/log.html#git_commit_parentcount-21" ] } }, @@ -4306,11 +4306,11 @@ "group": "commit", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_commit_parent-24" + "ex/v1.3.1/general.html#git_commit_parent-24" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_parent-22", - "ex/v1.3.0/log.html#git_commit_parent-23" + "ex/v1.3.1/log.html#git_commit_parent-22", + "ex/v1.3.1/log.html#git_commit_parent-23" ] } }, @@ -4342,10 +4342,10 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_commit_parent_id-9" + "ex/v1.3.1/cat-file.html#git_commit_parent_id-9" ], "log.c": [ - "ex/v1.3.0/log.html#git_commit_parent_id-24" + "ex/v1.3.1/log.html#git_commit_parent_id-24" ] } }, @@ -4523,7 +4523,7 @@ "group": "commit", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_commit_create-7" + "ex/v1.3.1/merge.html#git_commit_create-7" ] } }, @@ -4590,13 +4590,13 @@ "group": "commit", "examples": { "commit.c": [ - "ex/v1.3.0/commit.html#git_commit_create_v-1" + "ex/v1.3.1/commit.html#git_commit_create_v-1" ], "general.c": [ - "ex/v1.3.0/general.html#git_commit_create_v-25" + "ex/v1.3.1/general.html#git_commit_create_v-25" ], "init.c": [ - "ex/v1.3.0/init.html#git_commit_create_v-1" + "ex/v1.3.1/init.html#git_commit_create_v-1" ] } }, @@ -4839,8 +4839,8 @@ "git_libgit2_opts": { "type": "function", "file": "git2/common.h", - "line": 456, - "lineto": 456, + "line": 466, + "lineto": 466, "args": [ { "name": "option", @@ -4855,7 +4855,7 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n", "group": "libgit2" }, "git_config_entry_free": { @@ -4881,8 +4881,8 @@ "group": "config", "examples": { "config.c": [ - "ex/v1.3.0/config.html#git_config_entry_free-1", - "ex/v1.3.0/config.html#git_config_entry_free-2" + "ex/v1.3.1/config.html#git_config_entry_free-1", + "ex/v1.3.1/config.html#git_config_entry_free-2" ] } }, @@ -5088,7 +5088,7 @@ "group": "config", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_config_open_ondisk-26" + "ex/v1.3.1/general.html#git_config_open_ondisk-26" ] } }, @@ -5201,11 +5201,11 @@ "group": "config", "examples": { "config.c": [ - "ex/v1.3.0/config.html#git_config_free-3" + "ex/v1.3.1/config.html#git_config_free-3" ], "general.c": [ - "ex/v1.3.0/general.html#git_config_free-27", - "ex/v1.3.0/general.html#git_config_free-28" + "ex/v1.3.1/general.html#git_config_free-27", + "ex/v1.3.1/general.html#git_config_free-28" ] } }, @@ -5242,7 +5242,7 @@ "group": "config", "examples": { "config.c": [ - "ex/v1.3.0/config.html#git_config_get_entry-4" + "ex/v1.3.1/config.html#git_config_get_entry-4" ] } }, @@ -5279,8 +5279,8 @@ "group": "config", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_config_get_int32-29", - "ex/v1.3.0/general.html#git_config_get_int32-30" + "ex/v1.3.1/general.html#git_config_get_int32-29", + "ex/v1.3.1/general.html#git_config_get_int32-30" ] } }, @@ -5413,8 +5413,8 @@ "group": "config", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_config_get_string-31", - "ex/v1.3.0/general.html#git_config_get_string-32" + "ex/v1.3.1/general.html#git_config_get_string-31", + "ex/v1.3.1/general.html#git_config_get_string-32" ] } }, @@ -5707,7 +5707,7 @@ "group": "config", "examples": { "config.c": [ - "ex/v1.3.0/config.html#git_config_set_string-5" + "ex/v1.3.1/config.html#git_config_set_string-5" ] } }, @@ -7125,7 +7125,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v1.3.0/describe.html#git_describe_options_init-1" + "ex/v1.3.1/describe.html#git_describe_options_init-1" ] } }, @@ -7157,7 +7157,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v1.3.0/describe.html#git_describe_format_options_init-2" + "ex/v1.3.1/describe.html#git_describe_format_options_init-2" ] } }, @@ -7194,7 +7194,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v1.3.0/describe.html#git_describe_commit-3" + "ex/v1.3.1/describe.html#git_describe_commit-3" ] } }, @@ -7231,7 +7231,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v1.3.0/describe.html#git_describe_workdir-4" + "ex/v1.3.1/describe.html#git_describe_workdir-4" ] } }, @@ -7268,7 +7268,7 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v1.3.0/describe.html#git_describe_format-5" + "ex/v1.3.1/describe.html#git_describe_format-5" ] } }, @@ -7371,11 +7371,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_free-3" + "ex/v1.3.1/diff.html#git_diff_free-3" ], "log.c": [ - "ex/v1.3.0/log.html#git_diff_free-25", - "ex/v1.3.0/log.html#git_diff_free-26" + "ex/v1.3.1/log.html#git_diff_free-25", + "ex/v1.3.1/log.html#git_diff_free-26" ] } }, @@ -7422,11 +7422,11 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_tree_to_tree-4" + "ex/v1.3.1/diff.html#git_diff_tree_to_tree-4" ], "log.c": [ - "ex/v1.3.0/log.html#git_diff_tree_to_tree-27", - "ex/v1.3.0/log.html#git_diff_tree_to_tree-28" + "ex/v1.3.1/log.html#git_diff_tree_to_tree-27", + "ex/v1.3.1/log.html#git_diff_tree_to_tree-28" ] } }, @@ -7473,7 +7473,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_tree_to_index-5" + "ex/v1.3.1/diff.html#git_diff_tree_to_index-5" ] } }, @@ -7515,7 +7515,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_index_to_workdir-6" + "ex/v1.3.1/diff.html#git_diff_index_to_workdir-6" ] } }, @@ -7557,7 +7557,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_tree_to_workdir-7" + "ex/v1.3.1/diff.html#git_diff_tree_to_workdir-7" ] } }, @@ -7599,7 +7599,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_tree_to_workdir_with_index-8" + "ex/v1.3.1/diff.html#git_diff_tree_to_workdir_with_index-8" ] } }, @@ -7700,7 +7700,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_find_similar-9" + "ex/v1.3.1/diff.html#git_diff_find_similar-9" ] } }, @@ -7727,7 +7727,7 @@ "group": "diff", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_diff_num_deltas-29" + "ex/v1.3.1/log.html#git_diff_num_deltas-29" ] } }, @@ -7914,10 +7914,10 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_print-10" + "ex/v1.3.1/diff.html#git_diff_print-10" ], "log.c": [ - "ex/v1.3.0/log.html#git_diff_print-30" + "ex/v1.3.1/log.html#git_diff_print-30" ] } }, @@ -8202,7 +8202,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_from_buffer-11" + "ex/v1.3.1/diff.html#git_diff_from_buffer-11" ] } }, @@ -8234,7 +8234,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_get_stats-12" + "ex/v1.3.1/diff.html#git_diff_get_stats-12" ] } }, @@ -8342,7 +8342,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_stats_to_buf-13" + "ex/v1.3.1/diff.html#git_diff_stats_to_buf-13" ] } }, @@ -8369,7 +8369,7 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_diff_stats_free-14" + "ex/v1.3.1/diff.html#git_diff_stats_free-14" ] } }, @@ -8435,8 +8435,8 @@ "git_error_last": { "type": "function", "file": "git2/errors.h", - "line": 125, - "lineto": 125, + "line": 126, + "lineto": 126, "args": [], "argline": "", "sig": "", @@ -8449,33 +8449,33 @@ "group": "error", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_error_last-11", - "ex/v1.3.0/checkout.html#git_error_last-12", - "ex/v1.3.0/checkout.html#git_error_last-13", - "ex/v1.3.0/checkout.html#git_error_last-14" + "ex/v1.3.1/checkout.html#git_error_last-11", + "ex/v1.3.1/checkout.html#git_error_last-12", + "ex/v1.3.1/checkout.html#git_error_last-13", + "ex/v1.3.1/checkout.html#git_error_last-14" ], "commit.c": [ - "ex/v1.3.0/commit.html#git_error_last-2" + "ex/v1.3.1/commit.html#git_error_last-2" ], "config.c": [ - "ex/v1.3.0/config.html#git_error_last-6", - "ex/v1.3.0/config.html#git_error_last-7", - "ex/v1.3.0/config.html#git_error_last-8" + "ex/v1.3.1/config.html#git_error_last-6", + "ex/v1.3.1/config.html#git_error_last-7", + "ex/v1.3.1/config.html#git_error_last-8" ], "general.c": [ - "ex/v1.3.0/general.html#git_error_last-33" + "ex/v1.3.1/general.html#git_error_last-33" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_error_last-8", - "ex/v1.3.0/merge.html#git_error_last-9" + "ex/v1.3.1/merge.html#git_error_last-8", + "ex/v1.3.1/merge.html#git_error_last-9" ] } }, "git_error_clear": { "type": "function", "file": "git2/errors.h", - "line": 130, - "lineto": 130, + "line": 131, + "lineto": 131, "args": [], "argline": "", "sig": "", @@ -8490,8 +8490,8 @@ "git_error_set_str": { "type": "function", "file": "git2/errors.h", - "line": 149, - "lineto": 149, + "line": 150, + "lineto": 150, "args": [ { "name": "error_class", @@ -8517,8 +8517,8 @@ "git_error_set_oom": { "type": "function", "file": "git2/errors.h", - "line": 160, - "lineto": 160, + "line": 161, + "lineto": 161, "args": [], "argline": "", "sig": "", @@ -8902,7 +8902,7 @@ "group": "libgit2", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_libgit2_init-34" + "ex/v1.3.1/general.html#git_libgit2_init-34" ] } }, @@ -9186,19 +9186,19 @@ "group": "index", "examples": { "add.c": [ - "ex/v1.3.0/add.html#git_index_free-1" + "ex/v1.3.1/add.html#git_index_free-1" ], "commit.c": [ - "ex/v1.3.0/commit.html#git_index_free-3" + "ex/v1.3.1/commit.html#git_index_free-3" ], "general.c": [ - "ex/v1.3.0/general.html#git_index_free-35" + "ex/v1.3.1/general.html#git_index_free-35" ], "init.c": [ - "ex/v1.3.0/init.html#git_index_free-2" + "ex/v1.3.1/init.html#git_index_free-2" ], "ls-files.c": [ - "ex/v1.3.0/ls-files.html#git_index_free-1" + "ex/v1.3.1/ls-files.html#git_index_free-1" ] } }, @@ -9372,10 +9372,10 @@ "group": "index", "examples": { "add.c": [ - "ex/v1.3.0/add.html#git_index_write-2" + "ex/v1.3.1/add.html#git_index_write-2" ], "commit.c": [ - "ex/v1.3.0/commit.html#git_index_write-4" + "ex/v1.3.1/commit.html#git_index_write-4" ] } }, @@ -9478,13 +9478,13 @@ "group": "index", "examples": { "commit.c": [ - "ex/v1.3.0/commit.html#git_index_write_tree-5" + "ex/v1.3.1/commit.html#git_index_write_tree-5" ], "init.c": [ - "ex/v1.3.0/init.html#git_index_write_tree-3" + "ex/v1.3.1/init.html#git_index_write_tree-3" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_index_write_tree-10" + "ex/v1.3.1/merge.html#git_index_write_tree-10" ] } }, @@ -9543,10 +9543,10 @@ "group": "index", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_index_entrycount-36" + "ex/v1.3.1/general.html#git_index_entrycount-36" ], "ls-files.c": [ - "ex/v1.3.0/ls-files.html#git_index_entrycount-2" + "ex/v1.3.1/ls-files.html#git_index_entrycount-2" ] } }, @@ -9600,10 +9600,10 @@ "group": "index", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_index_get_byindex-37" + "ex/v1.3.1/general.html#git_index_get_byindex-37" ], "ls-files.c": [ - "ex/v1.3.0/ls-files.html#git_index_get_byindex-3" + "ex/v1.3.1/ls-files.html#git_index_get_byindex-3" ] } }, @@ -9640,7 +9640,7 @@ "group": "index", "examples": { "ls-files.c": [ - "ex/v1.3.0/ls-files.html#git_index_get_bypath-4" + "ex/v1.3.1/ls-files.html#git_index_get_bypath-4" ] } }, @@ -9989,7 +9989,7 @@ "group": "index", "examples": { "add.c": [ - "ex/v1.3.0/add.html#git_index_add_all-3" + "ex/v1.3.1/add.html#git_index_add_all-3" ] } }, @@ -10068,7 +10068,7 @@ "group": "index", "examples": { "add.c": [ - "ex/v1.3.0/add.html#git_index_update_all-4" + "ex/v1.3.1/add.html#git_index_update_all-4" ] } }, @@ -10287,7 +10287,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_index_has_conflicts-11" + "ex/v1.3.1/merge.html#git_index_has_conflicts-11" ] } }, @@ -10319,7 +10319,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_index_conflict_iterator_new-12" + "ex/v1.3.1/merge.html#git_index_conflict_iterator_new-12" ] } }, @@ -10361,7 +10361,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_index_conflict_next-13" + "ex/v1.3.1/merge.html#git_index_conflict_next-13" ] } }, @@ -10388,7 +10388,7 @@ "group": "index", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_index_conflict_iterator_free-14" + "ex/v1.3.1/merge.html#git_index_conflict_iterator_free-14" ] } }, @@ -10912,7 +10912,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_merge_analysis-15" + "ex/v1.3.1/merge.html#git_merge_analysis-15" ] } }, @@ -11001,10 +11001,10 @@ "group": "merge", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_merge_base-31" + "ex/v1.3.1/log.html#git_merge_base-31" ], "rev-parse.c": [ - "ex/v1.3.0/rev-parse.html#git_merge_base-1" + "ex/v1.3.1/rev-parse.html#git_merge_base-1" ] } }, @@ -11399,7 +11399,7 @@ "group": "merge", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_merge-16" + "ex/v1.3.1/merge.html#git_merge-16" ] } }, @@ -12096,10 +12096,10 @@ "group": "object", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_object_lookup-32" + "ex/v1.3.1/log.html#git_object_lookup-32" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_object_lookup-17" + "ex/v1.3.1/merge.html#git_object_lookup-17" ] } }, @@ -12205,27 +12205,27 @@ "group": "object", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_object_id-8", - "ex/v1.3.0/blame.html#git_object_id-9", - "ex/v1.3.0/blame.html#git_object_id-10", - "ex/v1.3.0/blame.html#git_object_id-11" + "ex/v1.3.1/blame.html#git_object_id-8", + "ex/v1.3.1/blame.html#git_object_id-9", + "ex/v1.3.1/blame.html#git_object_id-10", + "ex/v1.3.1/blame.html#git_object_id-11" ], "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_object_id-10", - "ex/v1.3.0/cat-file.html#git_object_id-11" + "ex/v1.3.1/cat-file.html#git_object_id-10", + "ex/v1.3.1/cat-file.html#git_object_id-11" ], "log.c": [ - "ex/v1.3.0/log.html#git_object_id-33", - "ex/v1.3.0/log.html#git_object_id-34", - "ex/v1.3.0/log.html#git_object_id-35", - "ex/v1.3.0/log.html#git_object_id-36" + "ex/v1.3.1/log.html#git_object_id-33", + "ex/v1.3.1/log.html#git_object_id-34", + "ex/v1.3.1/log.html#git_object_id-35", + "ex/v1.3.1/log.html#git_object_id-36" ], "rev-parse.c": [ - "ex/v1.3.0/rev-parse.html#git_object_id-2", - "ex/v1.3.0/rev-parse.html#git_object_id-3", - "ex/v1.3.0/rev-parse.html#git_object_id-4", - "ex/v1.3.0/rev-parse.html#git_object_id-5", - "ex/v1.3.0/rev-parse.html#git_object_id-6" + "ex/v1.3.1/rev-parse.html#git_object_id-2", + "ex/v1.3.1/rev-parse.html#git_object_id-3", + "ex/v1.3.1/rev-parse.html#git_object_id-4", + "ex/v1.3.1/rev-parse.html#git_object_id-5", + "ex/v1.3.1/rev-parse.html#git_object_id-6" ] } }, @@ -12257,7 +12257,7 @@ "group": "object", "examples": { "tag.c": [ - "ex/v1.3.0/tag.html#git_object_short_id-3" + "ex/v1.3.1/tag.html#git_object_short_id-3" ] } }, @@ -12284,12 +12284,12 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_object_type-12", - "ex/v1.3.0/cat-file.html#git_object_type-13", - "ex/v1.3.0/cat-file.html#git_object_type-14" + "ex/v1.3.1/cat-file.html#git_object_type-12", + "ex/v1.3.1/cat-file.html#git_object_type-13", + "ex/v1.3.1/cat-file.html#git_object_type-14" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_object_type-4" + "ex/v1.3.1/tag.html#git_object_type-4" ] } }, @@ -12338,33 +12338,33 @@ "group": "object", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_object_free-12", - "ex/v1.3.0/blame.html#git_object_free-13", - "ex/v1.3.0/blame.html#git_object_free-14", - "ex/v1.3.0/blame.html#git_object_free-15" + "ex/v1.3.1/blame.html#git_object_free-12", + "ex/v1.3.1/blame.html#git_object_free-13", + "ex/v1.3.1/blame.html#git_object_free-14", + "ex/v1.3.1/blame.html#git_object_free-15" ], "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_object_free-15" + "ex/v1.3.1/cat-file.html#git_object_free-15" ], "general.c": [ - "ex/v1.3.0/general.html#git_object_free-38" + "ex/v1.3.1/general.html#git_object_free-38" ], "log.c": [ - "ex/v1.3.0/log.html#git_object_free-37" + "ex/v1.3.1/log.html#git_object_free-37" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_object_free-18" + "ex/v1.3.1/merge.html#git_object_free-18" ], "rev-parse.c": [ - "ex/v1.3.0/rev-parse.html#git_object_free-7", - "ex/v1.3.0/rev-parse.html#git_object_free-8", - "ex/v1.3.0/rev-parse.html#git_object_free-9" + "ex/v1.3.1/rev-parse.html#git_object_free-7", + "ex/v1.3.1/rev-parse.html#git_object_free-8", + "ex/v1.3.1/rev-parse.html#git_object_free-9" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_object_free-5", - "ex/v1.3.0/tag.html#git_object_free-6", - "ex/v1.3.0/tag.html#git_object_free-7", - "ex/v1.3.0/tag.html#git_object_free-8" + "ex/v1.3.1/tag.html#git_object_free-5", + "ex/v1.3.1/tag.html#git_object_free-6", + "ex/v1.3.1/tag.html#git_object_free-7", + "ex/v1.3.1/tag.html#git_object_free-8" ] } }, @@ -12391,14 +12391,14 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_object_type2string-16", - "ex/v1.3.0/cat-file.html#git_object_type2string-17", - "ex/v1.3.0/cat-file.html#git_object_type2string-18", - "ex/v1.3.0/cat-file.html#git_object_type2string-19" + "ex/v1.3.1/cat-file.html#git_object_type2string-16", + "ex/v1.3.1/cat-file.html#git_object_type2string-17", + "ex/v1.3.1/cat-file.html#git_object_type2string-18", + "ex/v1.3.1/cat-file.html#git_object_type2string-19" ], "general.c": [ - "ex/v1.3.0/general.html#git_object_type2string-39", - "ex/v1.3.0/general.html#git_object_type2string-40" + "ex/v1.3.1/general.html#git_object_type2string-39", + "ex/v1.3.1/general.html#git_object_type2string-40" ] } }, @@ -12604,10 +12604,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_odb_free-20" + "ex/v1.3.1/cat-file.html#git_odb_free-20" ], "general.c": [ - "ex/v1.3.0/general.html#git_odb_free-41" + "ex/v1.3.1/general.html#git_odb_free-41" ] } }, @@ -12644,10 +12644,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_odb_read-21" + "ex/v1.3.1/cat-file.html#git_odb_read-21" ], "general.c": [ - "ex/v1.3.0/general.html#git_odb_read-42" + "ex/v1.3.1/general.html#git_odb_read-42" ] } }, @@ -12918,7 +12918,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_odb_write-43" + "ex/v1.3.1/general.html#git_odb_write-43" ] } }, @@ -13292,10 +13292,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_odb_object_free-22" + "ex/v1.3.1/cat-file.html#git_odb_object_free-22" ], "general.c": [ - "ex/v1.3.0/general.html#git_odb_object_free-44" + "ex/v1.3.1/general.html#git_odb_object_free-44" ] } }, @@ -13344,7 +13344,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_odb_object_data-45" + "ex/v1.3.1/general.html#git_odb_object_data-45" ] } }, @@ -13371,10 +13371,10 @@ "group": "odb", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_odb_object_size-23" + "ex/v1.3.1/cat-file.html#git_odb_object_size-23" ], "general.c": [ - "ex/v1.3.0/general.html#git_odb_object_size-46" + "ex/v1.3.1/general.html#git_odb_object_size-46" ] } }, @@ -13401,7 +13401,7 @@ "group": "odb", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_odb_object_type-47" + "ex/v1.3.1/general.html#git_odb_object_type-47" ] } }, @@ -13679,14 +13679,14 @@ "group": "oid", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_oid_fromstr-48", - "ex/v1.3.0/general.html#git_oid_fromstr-49", - "ex/v1.3.0/general.html#git_oid_fromstr-50", - "ex/v1.3.0/general.html#git_oid_fromstr-51", - "ex/v1.3.0/general.html#git_oid_fromstr-52", - "ex/v1.3.0/general.html#git_oid_fromstr-53", - "ex/v1.3.0/general.html#git_oid_fromstr-54", - "ex/v1.3.0/general.html#git_oid_fromstr-55" + "ex/v1.3.1/general.html#git_oid_fromstr-48", + "ex/v1.3.1/general.html#git_oid_fromstr-49", + "ex/v1.3.1/general.html#git_oid_fromstr-50", + "ex/v1.3.1/general.html#git_oid_fromstr-51", + "ex/v1.3.1/general.html#git_oid_fromstr-52", + "ex/v1.3.1/general.html#git_oid_fromstr-53", + "ex/v1.3.1/general.html#git_oid_fromstr-54", + "ex/v1.3.1/general.html#git_oid_fromstr-55" ] } }, @@ -13804,18 +13804,18 @@ "group": "oid", "examples": { "fetch.c": [ - "ex/v1.3.0/fetch.html#git_oid_fmt-1", - "ex/v1.3.0/fetch.html#git_oid_fmt-2" + "ex/v1.3.1/fetch.html#git_oid_fmt-1", + "ex/v1.3.1/fetch.html#git_oid_fmt-2" ], "general.c": [ - "ex/v1.3.0/general.html#git_oid_fmt-56", - "ex/v1.3.0/general.html#git_oid_fmt-57", - "ex/v1.3.0/general.html#git_oid_fmt-58", - "ex/v1.3.0/general.html#git_oid_fmt-59", - "ex/v1.3.0/general.html#git_oid_fmt-60" + "ex/v1.3.1/general.html#git_oid_fmt-56", + "ex/v1.3.1/general.html#git_oid_fmt-57", + "ex/v1.3.1/general.html#git_oid_fmt-58", + "ex/v1.3.1/general.html#git_oid_fmt-59", + "ex/v1.3.1/general.html#git_oid_fmt-60" ], "ls-remote.c": [ - "ex/v1.3.0/ls-remote.html#git_oid_fmt-1" + "ex/v1.3.1/ls-remote.html#git_oid_fmt-1" ] } }, @@ -13901,8 +13901,8 @@ "group": "oid", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_oid_tostr_s-19", - "ex/v1.3.0/merge.html#git_oid_tostr_s-20" + "ex/v1.3.1/merge.html#git_oid_tostr_s-19", + "ex/v1.3.1/merge.html#git_oid_tostr_s-20" ] } }, @@ -13939,25 +13939,25 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_oid_tostr-16", - "ex/v1.3.0/blame.html#git_oid_tostr-17" + "ex/v1.3.1/blame.html#git_oid_tostr-16", + "ex/v1.3.1/blame.html#git_oid_tostr-17" ], "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_oid_tostr-24", - "ex/v1.3.0/cat-file.html#git_oid_tostr-25", - "ex/v1.3.0/cat-file.html#git_oid_tostr-26", - "ex/v1.3.0/cat-file.html#git_oid_tostr-27", - "ex/v1.3.0/cat-file.html#git_oid_tostr-28" + "ex/v1.3.1/cat-file.html#git_oid_tostr-24", + "ex/v1.3.1/cat-file.html#git_oid_tostr-25", + "ex/v1.3.1/cat-file.html#git_oid_tostr-26", + "ex/v1.3.1/cat-file.html#git_oid_tostr-27", + "ex/v1.3.1/cat-file.html#git_oid_tostr-28" ], "log.c": [ - "ex/v1.3.0/log.html#git_oid_tostr-38", - "ex/v1.3.0/log.html#git_oid_tostr-39" + "ex/v1.3.1/log.html#git_oid_tostr-38", + "ex/v1.3.1/log.html#git_oid_tostr-39" ], "rev-parse.c": [ - "ex/v1.3.0/rev-parse.html#git_oid_tostr-10", - "ex/v1.3.0/rev-parse.html#git_oid_tostr-11", - "ex/v1.3.0/rev-parse.html#git_oid_tostr-12", - "ex/v1.3.0/rev-parse.html#git_oid_tostr-13" + "ex/v1.3.1/rev-parse.html#git_oid_tostr-10", + "ex/v1.3.1/rev-parse.html#git_oid_tostr-11", + "ex/v1.3.1/rev-parse.html#git_oid_tostr-12", + "ex/v1.3.1/rev-parse.html#git_oid_tostr-13" ] } }, @@ -13989,9 +13989,9 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_oid_cpy-18", - "ex/v1.3.0/blame.html#git_oid_cpy-19", - "ex/v1.3.0/blame.html#git_oid_cpy-20" + "ex/v1.3.1/blame.html#git_oid_cpy-18", + "ex/v1.3.1/blame.html#git_oid_cpy-19", + "ex/v1.3.1/blame.html#git_oid_cpy-20" ] } }, @@ -14158,10 +14158,10 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_oid_is_zero-21" + "ex/v1.3.1/blame.html#git_oid_is_zero-21" ], "fetch.c": [ - "ex/v1.3.0/fetch.html#git_oid_is_zero-3" + "ex/v1.3.1/fetch.html#git_oid_is_zero-3" ] } }, @@ -14889,7 +14889,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_patch_from_buffers-15" + "ex/v1.3.1/diff.html#git_patch_from_buffers-15" ] } }, @@ -14916,7 +14916,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_patch_free-16" + "ex/v1.3.1/diff.html#git_patch_free-16" ] } }, @@ -15199,7 +15199,7 @@ "group": "patch", "examples": { "diff.c": [ - "ex/v1.3.0/diff.html#git_patch_to_buf-17" + "ex/v1.3.1/diff.html#git_patch_to_buf-17" ] } }, @@ -15231,7 +15231,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_pathspec_new-40" + "ex/v1.3.1/log.html#git_pathspec_new-40" ] } }, @@ -15258,7 +15258,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_pathspec_free-41" + "ex/v1.3.1/log.html#git_pathspec_free-41" ] } }, @@ -15406,7 +15406,7 @@ "group": "pathspec", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_pathspec_match_tree-42" + "ex/v1.3.1/log.html#git_pathspec_match_tree-42" ] } }, @@ -16530,14 +16530,14 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_reference_lookup-15", - "ex/v1.3.0/checkout.html#git_reference_lookup-16" + "ex/v1.3.1/checkout.html#git_reference_lookup-15", + "ex/v1.3.1/checkout.html#git_reference_lookup-16" ], "general.c": [ - "ex/v1.3.0/general.html#git_reference_lookup-61" + "ex/v1.3.1/general.html#git_reference_lookup-61" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_lookup-21" + "ex/v1.3.1/merge.html#git_reference_lookup-21" ] } }, @@ -16606,7 +16606,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_dwim-22" + "ex/v1.3.1/merge.html#git_reference_dwim-22" ] } }, @@ -16757,7 +16757,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_create-23" + "ex/v1.3.1/merge.html#git_reference_create-23" ] } }, @@ -16836,7 +16836,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_reference_target-62" + "ex/v1.3.1/general.html#git_reference_target-62" ] } }, @@ -16885,10 +16885,10 @@ "group": "reference", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_reference_symbolic_target-63" + "ex/v1.3.1/general.html#git_reference_symbolic_target-63" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_symbolic_target-24" + "ex/v1.3.1/merge.html#git_reference_symbolic_target-24" ] } }, @@ -16915,7 +16915,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_reference_type-64" + "ex/v1.3.1/general.html#git_reference_type-64" ] } }, @@ -16942,10 +16942,10 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_reference_name-17" + "ex/v1.3.1/checkout.html#git_reference_name-17" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_name-25" + "ex/v1.3.1/merge.html#git_reference_name-25" ] } }, @@ -17073,7 +17073,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_set_target-26" + "ex/v1.3.1/merge.html#git_reference_set_target-26" ] } }, @@ -17196,7 +17196,7 @@ "group": "reference", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_reference_list-65" + "ex/v1.3.1/general.html#git_reference_list-65" ] } }, @@ -17314,20 +17314,20 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_reference_free-18", - "ex/v1.3.0/checkout.html#git_reference_free-19", - "ex/v1.3.0/checkout.html#git_reference_free-20" + "ex/v1.3.1/checkout.html#git_reference_free-18", + "ex/v1.3.1/checkout.html#git_reference_free-19", + "ex/v1.3.1/checkout.html#git_reference_free-20" ], "general.c": [ - "ex/v1.3.0/general.html#git_reference_free-66" + "ex/v1.3.1/general.html#git_reference_free-66" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_free-27", - "ex/v1.3.0/merge.html#git_reference_free-28", - "ex/v1.3.0/merge.html#git_reference_free-29" + "ex/v1.3.1/merge.html#git_reference_free-27", + "ex/v1.3.1/merge.html#git_reference_free-28", + "ex/v1.3.1/merge.html#git_reference_free-29" ], "status.c": [ - "ex/v1.3.0/status.html#git_reference_free-1" + "ex/v1.3.1/status.html#git_reference_free-1" ] } }, @@ -17629,7 +17629,7 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_reference_is_remote-21" + "ex/v1.3.1/checkout.html#git_reference_is_remote-21" ] } }, @@ -17747,7 +17747,7 @@ "group": "reference", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_reference_peel-30" + "ex/v1.3.1/merge.html#git_reference_peel-30" ] } }, @@ -17801,7 +17801,7 @@ "group": "reference", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_reference_shorthand-2" + "ex/v1.3.1/status.html#git_reference_shorthand-2" ] } }, @@ -18125,7 +18125,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_create-1" + "ex/v1.3.1/remote.html#git_remote_create-1" ] } }, @@ -18263,10 +18263,10 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v1.3.0/fetch.html#git_remote_create_anonymous-4" + "ex/v1.3.1/fetch.html#git_remote_create_anonymous-4" ], "ls-remote.c": [ - "ex/v1.3.0/ls-remote.html#git_remote_create_anonymous-2" + "ex/v1.3.1/ls-remote.html#git_remote_create_anonymous-2" ] } }, @@ -18330,16 +18330,16 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v1.3.0/fetch.html#git_remote_lookup-5" + "ex/v1.3.1/fetch.html#git_remote_lookup-5" ], "ls-remote.c": [ - "ex/v1.3.0/ls-remote.html#git_remote_lookup-3" + "ex/v1.3.1/ls-remote.html#git_remote_lookup-3" ], "push.c": [ - "ex/v1.3.0/push.html#git_remote_lookup-1" + "ex/v1.3.1/push.html#git_remote_lookup-1" ], "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_lookup-2" + "ex/v1.3.1/remote.html#git_remote_lookup-2" ] } }, @@ -18437,7 +18437,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_url-3" + "ex/v1.3.1/remote.html#git_remote_url-3" ] } }, @@ -18464,7 +18464,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_pushurl-4" + "ex/v1.3.1/remote.html#git_remote_pushurl-4" ] } }, @@ -18501,7 +18501,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_set_url-5" + "ex/v1.3.1/remote.html#git_remote_set_url-5" ] } }, @@ -18538,7 +18538,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_set_pushurl-6" + "ex/v1.3.1/remote.html#git_remote_set_pushurl-6" ] } }, @@ -18806,7 +18806,7 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/v1.3.0/ls-remote.html#git_remote_connect-4" + "ex/v1.3.1/ls-remote.html#git_remote_connect-4" ] } }, @@ -18843,7 +18843,7 @@ "group": "remote", "examples": { "ls-remote.c": [ - "ex/v1.3.0/ls-remote.html#git_remote_ls-5" + "ex/v1.3.1/ls-remote.html#git_remote_ls-5" ] } }, @@ -18936,14 +18936,14 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v1.3.0/fetch.html#git_remote_free-6", - "ex/v1.3.0/fetch.html#git_remote_free-7" + "ex/v1.3.1/fetch.html#git_remote_free-6", + "ex/v1.3.1/fetch.html#git_remote_free-7" ], "ls-remote.c": [ - "ex/v1.3.0/ls-remote.html#git_remote_free-6" + "ex/v1.3.1/ls-remote.html#git_remote_free-6" ], "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_free-7" + "ex/v1.3.1/remote.html#git_remote_free-7" ] } }, @@ -18975,10 +18975,10 @@ "group": "remote", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_remote_list-22" + "ex/v1.3.1/checkout.html#git_remote_list-22" ], "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_list-8" + "ex/v1.3.1/remote.html#git_remote_list-8" ] } }, @@ -19064,7 +19064,7 @@ "group": "push", "examples": { "push.c": [ - "ex/v1.3.0/push.html#git_push_options_init-2" + "ex/v1.3.1/push.html#git_push_options_init-2" ] } }, @@ -19212,7 +19212,7 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v1.3.0/fetch.html#git_remote_fetch-8" + "ex/v1.3.1/fetch.html#git_remote_fetch-8" ] } }, @@ -19276,7 +19276,7 @@ "group": "remote", "examples": { "push.c": [ - "ex/v1.3.0/push.html#git_remote_push-3" + "ex/v1.3.1/push.html#git_remote_push-3" ] } }, @@ -19303,7 +19303,7 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v1.3.0/fetch.html#git_remote_stats-9" + "ex/v1.3.1/fetch.html#git_remote_stats-9" ] } }, @@ -19421,7 +19421,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_rename-9" + "ex/v1.3.1/remote.html#git_remote_rename-9" ] } }, @@ -19480,7 +19480,7 @@ "group": "remote", "examples": { "remote.c": [ - "ex/v1.3.0/remote.html#git_remote_delete-10" + "ex/v1.3.1/remote.html#git_remote_delete-10" ] } }, @@ -19539,7 +19539,7 @@ "group": "repository", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_repository_open-67" + "ex/v1.3.1/general.html#git_repository_open-67" ] } }, @@ -19672,7 +19672,7 @@ "group": "repository", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_repository_open_ext-43" + "ex/v1.3.1/log.html#git_repository_open_ext-43" ] } }, @@ -19726,10 +19726,10 @@ "group": "repository", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_repository_free-68" + "ex/v1.3.1/general.html#git_repository_free-68" ], "init.c": [ - "ex/v1.3.0/init.html#git_repository_free-4" + "ex/v1.3.1/init.html#git_repository_free-4" ] } }, @@ -19766,7 +19766,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/v1.3.0/init.html#git_repository_init-5" + "ex/v1.3.1/init.html#git_repository_init-5" ] } }, @@ -19830,7 +19830,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/v1.3.0/init.html#git_repository_init_ext-6" + "ex/v1.3.1/init.html#git_repository_init_ext-6" ] } }, @@ -19862,11 +19862,11 @@ "group": "repository", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_repository_head-31", - "ex/v1.3.0/merge.html#git_repository_head-32" + "ex/v1.3.1/merge.html#git_repository_head-31", + "ex/v1.3.1/merge.html#git_repository_head-32" ], "status.c": [ - "ex/v1.3.0/status.html#git_repository_head-3" + "ex/v1.3.1/status.html#git_repository_head-3" ] } }, @@ -20050,10 +20050,10 @@ "group": "repository", "examples": { "init.c": [ - "ex/v1.3.0/init.html#git_repository_path-7" + "ex/v1.3.1/init.html#git_repository_path-7" ], "status.c": [ - "ex/v1.3.0/status.html#git_repository_path-4" + "ex/v1.3.1/status.html#git_repository_path-4" ] } }, @@ -20080,7 +20080,7 @@ "group": "repository", "examples": { "init.c": [ - "ex/v1.3.0/init.html#git_repository_workdir-8" + "ex/v1.3.1/init.html#git_repository_workdir-8" ] } }, @@ -20161,7 +20161,7 @@ "group": "repository", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_repository_is_bare-5" + "ex/v1.3.1/status.html#git_repository_is_bare-5" ] } }, @@ -20215,7 +20215,7 @@ "group": "repository", "examples": { "config.c": [ - "ex/v1.3.0/config.html#git_repository_config-9" + "ex/v1.3.1/config.html#git_repository_config-9" ] } }, @@ -20247,8 +20247,8 @@ "group": "repository", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_repository_config_snapshot-69", - "ex/v1.3.0/general.html#git_repository_config_snapshot-70" + "ex/v1.3.1/general.html#git_repository_config_snapshot-69", + "ex/v1.3.1/general.html#git_repository_config_snapshot-70" ] } }, @@ -20280,10 +20280,10 @@ "group": "repository", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_repository_odb-29" + "ex/v1.3.1/cat-file.html#git_repository_odb-29" ], "general.c": [ - "ex/v1.3.0/general.html#git_repository_odb-71" + "ex/v1.3.1/general.html#git_repository_odb-71" ] } }, @@ -20342,22 +20342,22 @@ "group": "repository", "examples": { "add.c": [ - "ex/v1.3.0/add.html#git_repository_index-5" + "ex/v1.3.1/add.html#git_repository_index-5" ], "commit.c": [ - "ex/v1.3.0/commit.html#git_repository_index-6" + "ex/v1.3.1/commit.html#git_repository_index-6" ], "general.c": [ - "ex/v1.3.0/general.html#git_repository_index-72" + "ex/v1.3.1/general.html#git_repository_index-72" ], "init.c": [ - "ex/v1.3.0/init.html#git_repository_index-9" + "ex/v1.3.1/init.html#git_repository_index-9" ], "ls-files.c": [ - "ex/v1.3.0/ls-files.html#git_repository_index-5" + "ex/v1.3.1/ls-files.html#git_repository_index-5" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_repository_index-33" + "ex/v1.3.1/merge.html#git_repository_index-33" ] } }, @@ -20433,7 +20433,7 @@ "group": "repository", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_repository_state_cleanup-34" + "ex/v1.3.1/merge.html#git_repository_state_cleanup-34" ] } }, @@ -20571,7 +20571,7 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_repository_set_head-23" + "ex/v1.3.1/checkout.html#git_repository_set_head-23" ] } }, @@ -20630,7 +20630,7 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_repository_set_head_detached_from_annotated-24" + "ex/v1.3.1/checkout.html#git_repository_set_head_detached_from_annotated-24" ] } }, @@ -20679,10 +20679,10 @@ "group": "repository", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_repository_state-25" + "ex/v1.3.1/checkout.html#git_repository_state-25" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_repository_state-35" + "ex/v1.3.1/merge.html#git_repository_state-35" ] } }, @@ -21066,22 +21066,22 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_revparse_single-22" + "ex/v1.3.1/blame.html#git_revparse_single-22" ], "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_revparse_single-30" + "ex/v1.3.1/cat-file.html#git_revparse_single-30" ], "describe.c": [ - "ex/v1.3.0/describe.html#git_revparse_single-6" + "ex/v1.3.1/describe.html#git_revparse_single-6" ], "log.c": [ - "ex/v1.3.0/log.html#git_revparse_single-44" + "ex/v1.3.1/log.html#git_revparse_single-44" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_revparse_single-9", - "ex/v1.3.0/tag.html#git_revparse_single-10", - "ex/v1.3.0/tag.html#git_revparse_single-11", - "ex/v1.3.0/tag.html#git_revparse_single-12" + "ex/v1.3.1/tag.html#git_revparse_single-9", + "ex/v1.3.1/tag.html#git_revparse_single-10", + "ex/v1.3.1/tag.html#git_revparse_single-11", + "ex/v1.3.1/tag.html#git_revparse_single-12" ] } }, @@ -21123,7 +21123,7 @@ "group": "revparse", "examples": { "commit.c": [ - "ex/v1.3.0/commit.html#git_revparse_ext-7" + "ex/v1.3.1/commit.html#git_revparse_ext-7" ] } }, @@ -21160,14 +21160,14 @@ "group": "revparse", "examples": { "blame.c": [ - "ex/v1.3.0/blame.html#git_revparse-23" + "ex/v1.3.1/blame.html#git_revparse-23" ], "log.c": [ - "ex/v1.3.0/log.html#git_revparse-45" + "ex/v1.3.1/log.html#git_revparse-45" ], "rev-parse.c": [ - "ex/v1.3.0/rev-parse.html#git_revparse-14", - "ex/v1.3.0/rev-parse.html#git_revparse-15" + "ex/v1.3.1/rev-parse.html#git_revparse-14", + "ex/v1.3.1/rev-parse.html#git_revparse-15" ] } }, @@ -21199,11 +21199,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_revwalk_new-73" + "ex/v1.3.1/general.html#git_revwalk_new-73" ], "log.c": [ - "ex/v1.3.0/log.html#git_revwalk_new-46", - "ex/v1.3.0/log.html#git_revwalk_new-47" + "ex/v1.3.1/log.html#git_revwalk_new-46", + "ex/v1.3.1/log.html#git_revwalk_new-47" ] } }, @@ -21257,10 +21257,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_revwalk_push-74" + "ex/v1.3.1/general.html#git_revwalk_push-74" ], "log.c": [ - "ex/v1.3.0/log.html#git_revwalk_push-48" + "ex/v1.3.1/log.html#git_revwalk_push-48" ] } }, @@ -21314,7 +21314,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_revwalk_push_head-49" + "ex/v1.3.1/log.html#git_revwalk_push_head-49" ] } }, @@ -21346,7 +21346,7 @@ "group": "revwalk", "examples": { "log.c": [ - "ex/v1.3.0/log.html#git_revwalk_hide-50" + "ex/v1.3.1/log.html#git_revwalk_hide-50" ] } }, @@ -21481,10 +21481,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_revwalk_next-75" + "ex/v1.3.1/general.html#git_revwalk_next-75" ], "log.c": [ - "ex/v1.3.0/log.html#git_revwalk_next-51" + "ex/v1.3.1/log.html#git_revwalk_next-51" ] } }, @@ -21516,11 +21516,11 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_revwalk_sorting-76" + "ex/v1.3.1/general.html#git_revwalk_sorting-76" ], "log.c": [ - "ex/v1.3.0/log.html#git_revwalk_sorting-52", - "ex/v1.3.0/log.html#git_revwalk_sorting-53" + "ex/v1.3.1/log.html#git_revwalk_sorting-52", + "ex/v1.3.1/log.html#git_revwalk_sorting-53" ] } }, @@ -21596,10 +21596,10 @@ "group": "revwalk", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_revwalk_free-77" + "ex/v1.3.1/general.html#git_revwalk_free-77" ], "log.c": [ - "ex/v1.3.0/log.html#git_revwalk_free-54" + "ex/v1.3.1/log.html#git_revwalk_free-54" ] } }, @@ -21700,8 +21700,8 @@ "group": "signature", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_signature_new-78", - "ex/v1.3.0/general.html#git_signature_new-79" + "ex/v1.3.1/general.html#git_signature_new-78", + "ex/v1.3.1/general.html#git_signature_new-79" ] } }, @@ -21738,7 +21738,7 @@ "group": "signature", "examples": { "merge.c": [ - "ex/v1.3.0/merge.html#git_signature_now-36" + "ex/v1.3.1/merge.html#git_signature_now-36" ] } }, @@ -21770,13 +21770,13 @@ "group": "signature", "examples": { "commit.c": [ - "ex/v1.3.0/commit.html#git_signature_default-8" + "ex/v1.3.1/commit.html#git_signature_default-8" ], "init.c": [ - "ex/v1.3.0/init.html#git_signature_default-10" + "ex/v1.3.1/init.html#git_signature_default-10" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_signature_default-13" + "ex/v1.3.1/tag.html#git_signature_default-13" ] } }, @@ -21857,17 +21857,17 @@ "group": "signature", "examples": { "commit.c": [ - "ex/v1.3.0/commit.html#git_signature_free-9" + "ex/v1.3.1/commit.html#git_signature_free-9" ], "general.c": [ - "ex/v1.3.0/general.html#git_signature_free-80", - "ex/v1.3.0/general.html#git_signature_free-81" + "ex/v1.3.1/general.html#git_signature_free-80", + "ex/v1.3.1/general.html#git_signature_free-81" ], "init.c": [ - "ex/v1.3.0/init.html#git_signature_free-11" + "ex/v1.3.1/init.html#git_signature_free-11" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_signature_free-14" + "ex/v1.3.1/tag.html#git_signature_free-14" ] } }, @@ -22123,7 +22123,7 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_status_foreach-6" + "ex/v1.3.1/status.html#git_status_foreach-6" ] } }, @@ -22165,7 +22165,7 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_status_foreach_ext-7" + "ex/v1.3.1/status.html#git_status_foreach_ext-7" ] } }, @@ -22202,7 +22202,7 @@ "group": "status", "examples": { "add.c": [ - "ex/v1.3.0/add.html#git_status_file-6" + "ex/v1.3.1/add.html#git_status_file-6" ] } }, @@ -22239,8 +22239,8 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_status_list_new-8", - "ex/v1.3.0/status.html#git_status_list_new-9" + "ex/v1.3.1/status.html#git_status_list_new-8", + "ex/v1.3.1/status.html#git_status_list_new-9" ] } }, @@ -22267,8 +22267,8 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_status_list_entrycount-10", - "ex/v1.3.0/status.html#git_status_list_entrycount-11" + "ex/v1.3.1/status.html#git_status_list_entrycount-10", + "ex/v1.3.1/status.html#git_status_list_entrycount-11" ] } }, @@ -22300,12 +22300,12 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_status_byindex-12", - "ex/v1.3.0/status.html#git_status_byindex-13", - "ex/v1.3.0/status.html#git_status_byindex-14", - "ex/v1.3.0/status.html#git_status_byindex-15", - "ex/v1.3.0/status.html#git_status_byindex-16", - "ex/v1.3.0/status.html#git_status_byindex-17" + "ex/v1.3.1/status.html#git_status_byindex-12", + "ex/v1.3.1/status.html#git_status_byindex-13", + "ex/v1.3.1/status.html#git_status_byindex-14", + "ex/v1.3.1/status.html#git_status_byindex-15", + "ex/v1.3.1/status.html#git_status_byindex-16", + "ex/v1.3.1/status.html#git_status_byindex-17" ] } }, @@ -22332,7 +22332,7 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_status_list_free-18" + "ex/v1.3.1/status.html#git_status_list_free-18" ] } }, @@ -22391,17 +22391,17 @@ "group": "strarray", "examples": { "checkout.c": [ - "ex/v1.3.0/checkout.html#git_strarray_dispose-26" + "ex/v1.3.1/checkout.html#git_strarray_dispose-26" ], "general.c": [ - "ex/v1.3.0/general.html#git_strarray_dispose-82" + "ex/v1.3.1/general.html#git_strarray_dispose-82" ], "remote.c": [ - "ex/v1.3.0/remote.html#git_strarray_dispose-11", - "ex/v1.3.0/remote.html#git_strarray_dispose-12" + "ex/v1.3.1/remote.html#git_strarray_dispose-11", + "ex/v1.3.1/remote.html#git_strarray_dispose-12" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_strarray_dispose-15" + "ex/v1.3.1/tag.html#git_strarray_dispose-15" ] } }, @@ -22578,7 +22578,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_submodule_foreach-19" + "ex/v1.3.1/status.html#git_submodule_foreach-19" ] } }, @@ -22750,7 +22750,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_submodule_name-20" + "ex/v1.3.1/status.html#git_submodule_name-20" ] } }, @@ -22777,7 +22777,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_submodule_path-21" + "ex/v1.3.1/status.html#git_submodule_path-21" ] } }, @@ -23322,7 +23322,7 @@ "group": "submodule", "examples": { "status.c": [ - "ex/v1.3.0/status.html#git_submodule_status-22" + "ex/v1.3.1/status.html#git_submodule_status-22" ] } }, @@ -23386,7 +23386,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_tag_lookup-83" + "ex/v1.3.1/general.html#git_tag_lookup-83" ] } }, @@ -23450,7 +23450,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_tag_free-84" + "ex/v1.3.1/general.html#git_tag_free-84" ] } }, @@ -23526,7 +23526,7 @@ "group": "tag", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_tag_target-85" + "ex/v1.3.1/general.html#git_tag_target-85" ] } }, @@ -23553,7 +23553,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tag_target_id-31" + "ex/v1.3.1/cat-file.html#git_tag_target_id-31" ] } }, @@ -23580,10 +23580,10 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tag_target_type-32" + "ex/v1.3.1/cat-file.html#git_tag_target_type-32" ], "general.c": [ - "ex/v1.3.0/general.html#git_tag_target_type-86" + "ex/v1.3.1/general.html#git_tag_target_type-86" ] } }, @@ -23610,13 +23610,13 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tag_name-33" + "ex/v1.3.1/cat-file.html#git_tag_name-33" ], "general.c": [ - "ex/v1.3.0/general.html#git_tag_name-87" + "ex/v1.3.1/general.html#git_tag_name-87" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_tag_name-16" + "ex/v1.3.1/tag.html#git_tag_name-16" ] } }, @@ -23643,7 +23643,7 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tag_tagger-34" + "ex/v1.3.1/cat-file.html#git_tag_tagger-34" ] } }, @@ -23670,14 +23670,14 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tag_message-35", - "ex/v1.3.0/cat-file.html#git_tag_message-36" + "ex/v1.3.1/cat-file.html#git_tag_message-35", + "ex/v1.3.1/cat-file.html#git_tag_message-36" ], "general.c": [ - "ex/v1.3.0/general.html#git_tag_message-88" + "ex/v1.3.1/general.html#git_tag_message-88" ], "tag.c": [ - "ex/v1.3.0/tag.html#git_tag_message-17" + "ex/v1.3.1/tag.html#git_tag_message-17" ] } }, @@ -23734,7 +23734,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v1.3.0/tag.html#git_tag_create-18" + "ex/v1.3.1/tag.html#git_tag_create-18" ] } }, @@ -23865,7 +23865,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v1.3.0/tag.html#git_tag_create_lightweight-19" + "ex/v1.3.1/tag.html#git_tag_create_lightweight-19" ] } }, @@ -23897,7 +23897,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v1.3.0/tag.html#git_tag_delete-20" + "ex/v1.3.1/tag.html#git_tag_delete-20" ] } }, @@ -23961,7 +23961,7 @@ "group": "tag", "examples": { "tag.c": [ - "ex/v1.3.0/tag.html#git_tag_list_match-21" + "ex/v1.3.1/tag.html#git_tag_list_match-21" ] } }, @@ -24379,17 +24379,17 @@ "group": "tree", "examples": { "commit.c": [ - "ex/v1.3.0/commit.html#git_tree_lookup-10" + "ex/v1.3.1/commit.html#git_tree_lookup-10" ], "general.c": [ - "ex/v1.3.0/general.html#git_tree_lookup-89", - "ex/v1.3.0/general.html#git_tree_lookup-90" + "ex/v1.3.1/general.html#git_tree_lookup-89", + "ex/v1.3.1/general.html#git_tree_lookup-90" ], "init.c": [ - "ex/v1.3.0/init.html#git_tree_lookup-12" + "ex/v1.3.1/init.html#git_tree_lookup-12" ], "merge.c": [ - "ex/v1.3.0/merge.html#git_tree_lookup-37" + "ex/v1.3.1/merge.html#git_tree_lookup-37" ] } }, @@ -24453,25 +24453,25 @@ "group": "tree", "examples": { "commit.c": [ - "ex/v1.3.0/commit.html#git_tree_free-11" + "ex/v1.3.1/commit.html#git_tree_free-11" ], "diff.c": [ - "ex/v1.3.0/diff.html#git_tree_free-18", - "ex/v1.3.0/diff.html#git_tree_free-19" + "ex/v1.3.1/diff.html#git_tree_free-18", + "ex/v1.3.1/diff.html#git_tree_free-19" ], "general.c": [ - "ex/v1.3.0/general.html#git_tree_free-91", - "ex/v1.3.0/general.html#git_tree_free-92" + "ex/v1.3.1/general.html#git_tree_free-91", + "ex/v1.3.1/general.html#git_tree_free-92" ], "init.c": [ - "ex/v1.3.0/init.html#git_tree_free-13" + "ex/v1.3.1/init.html#git_tree_free-13" ], "log.c": [ - "ex/v1.3.0/log.html#git_tree_free-55", - "ex/v1.3.0/log.html#git_tree_free-56", - "ex/v1.3.0/log.html#git_tree_free-57", - "ex/v1.3.0/log.html#git_tree_free-58", - "ex/v1.3.0/log.html#git_tree_free-59" + "ex/v1.3.1/log.html#git_tree_free-55", + "ex/v1.3.1/log.html#git_tree_free-56", + "ex/v1.3.1/log.html#git_tree_free-57", + "ex/v1.3.1/log.html#git_tree_free-58", + "ex/v1.3.1/log.html#git_tree_free-59" ] } }, @@ -24542,10 +24542,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tree_entrycount-37" + "ex/v1.3.1/cat-file.html#git_tree_entrycount-37" ], "general.c": [ - "ex/v1.3.0/general.html#git_tree_entrycount-93" + "ex/v1.3.1/general.html#git_tree_entrycount-93" ] } }, @@ -24577,7 +24577,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_tree_entry_byname-94" + "ex/v1.3.1/general.html#git_tree_entry_byname-94" ] } }, @@ -24609,10 +24609,10 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tree_entry_byindex-38" + "ex/v1.3.1/cat-file.html#git_tree_entry_byindex-38" ], "general.c": [ - "ex/v1.3.0/general.html#git_tree_entry_byindex-95" + "ex/v1.3.1/general.html#git_tree_entry_byindex-95" ] } }, @@ -24747,11 +24747,11 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tree_entry_name-39" + "ex/v1.3.1/cat-file.html#git_tree_entry_name-39" ], "general.c": [ - "ex/v1.3.0/general.html#git_tree_entry_name-96", - "ex/v1.3.0/general.html#git_tree_entry_name-97" + "ex/v1.3.1/general.html#git_tree_entry_name-96", + "ex/v1.3.1/general.html#git_tree_entry_name-97" ] } }, @@ -24778,7 +24778,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tree_entry_id-40" + "ex/v1.3.1/cat-file.html#git_tree_entry_id-40" ] } }, @@ -24805,7 +24805,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tree_entry_type-41" + "ex/v1.3.1/cat-file.html#git_tree_entry_type-41" ] } }, @@ -24832,7 +24832,7 @@ "group": "tree", "examples": { "cat-file.c": [ - "ex/v1.3.0/cat-file.html#git_tree_entry_filemode-42" + "ex/v1.3.1/cat-file.html#git_tree_entry_filemode-42" ] } }, @@ -24918,7 +24918,7 @@ "group": "tree", "examples": { "general.c": [ - "ex/v1.3.0/general.html#git_tree_entry_to_object-98" + "ex/v1.3.1/general.html#git_tree_entry_to_object-98" ] } }, @@ -31418,8 +31418,8 @@ "type": "struct", "value": "git_error", "file": "git2/errors.h", - "line": 69, - "lineto": 72, + "line": 70, + "lineto": 73, "block": "char * message\nint klass", "tdef": "typedef", "description": " Structure to store extra details of the last error that occurred.", @@ -31478,13 +31478,14 @@ "GIT_RETRY", "GIT_EMISMATCH", "GIT_EINDEXDIRTY", - "GIT_EAPPLYFAIL" + "GIT_EAPPLYFAIL", + "GIT_EOWNER" ], "type": "enum", "file": "git2/errors.h", "line": 21, - "lineto": 61, - "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL", + "lineto": 62, + "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL\nGIT_EOWNER", "tdef": "typedef", "description": " Generic return codes ", "comments": "", @@ -31668,6 +31669,12 @@ "name": "GIT_EAPPLYFAIL", "comments": "

Patch application failed

\n", "value": -35 + }, + { + "type": "int", + "name": "GIT_EOWNER", + "comments": "

The object is not owned by the current user

\n", + "value": -36 } ], "used": { @@ -31719,8 +31726,8 @@ ], "type": "enum", "file": "git2/errors.h", - "line": 75, - "lineto": 112, + "line": 76, + "lineto": 113, "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA1\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL", "tdef": "typedef", "description": " Error classes ", @@ -33161,13 +33168,15 @@ "GIT_OPT_SET_ODB_PACKED_PRIORITY", "GIT_OPT_SET_ODB_LOOSE_PRIORITY", "GIT_OPT_GET_EXTENSIONS", - "GIT_OPT_SET_EXTENSIONS" + "GIT_OPT_SET_EXTENSIONS", + "GIT_OPT_GET_OWNER_VALIDATION", + "GIT_OPT_SET_OWNER_VALIDATION" ], "type": "enum", "file": "git2/common.h", "line": 179, - "lineto": 215, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS", + "lineto": 217, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION", "tdef": "typedef", "description": " Global library options", "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", @@ -33381,6 +33390,18 @@ "name": "GIT_OPT_SET_EXTENSIONS", "comments": "", "value": 34 + }, + { + "type": "int", + "name": "GIT_OPT_GET_OWNER_VALIDATION", + "comments": "", + "value": 35 + }, + { + "type": "int", + "name": "GIT_OPT_SET_OWNER_VALIDATION", + "comments": "", + "value": 36 } ], "used": { @@ -40271,119 +40292,119 @@ "examples": [ [ "add.c", - "ex/v1.3.0/add.html" + "ex/v1.3.1/add.html" ], [ "args.c", - "ex/v1.3.0/args.html" + "ex/v1.3.1/args.html" ], [ "blame.c", - "ex/v1.3.0/blame.html" + "ex/v1.3.1/blame.html" ], [ "cat-file.c", - "ex/v1.3.0/cat-file.html" + "ex/v1.3.1/cat-file.html" ], [ "checkout.c", - "ex/v1.3.0/checkout.html" + "ex/v1.3.1/checkout.html" ], [ "clone.c", - "ex/v1.3.0/clone.html" + "ex/v1.3.1/clone.html" ], [ "commit.c", - "ex/v1.3.0/commit.html" + "ex/v1.3.1/commit.html" ], [ "common.c", - "ex/v1.3.0/common.html" + "ex/v1.3.1/common.html" ], [ "config.c", - "ex/v1.3.0/config.html" + "ex/v1.3.1/config.html" ], [ "describe.c", - "ex/v1.3.0/describe.html" + "ex/v1.3.1/describe.html" ], [ "diff.c", - "ex/v1.3.0/diff.html" + "ex/v1.3.1/diff.html" ], [ "fetch.c", - "ex/v1.3.0/fetch.html" + "ex/v1.3.1/fetch.html" ], [ "for-each-ref.c", - "ex/v1.3.0/for-each-ref.html" + "ex/v1.3.1/for-each-ref.html" ], [ "general.c", - "ex/v1.3.0/general.html" + "ex/v1.3.1/general.html" ], [ "index-pack.c", - "ex/v1.3.0/index-pack.html" + "ex/v1.3.1/index-pack.html" ], [ "init.c", - "ex/v1.3.0/init.html" + "ex/v1.3.1/init.html" ], [ "lg2.c", - "ex/v1.3.0/lg2.html" + "ex/v1.3.1/lg2.html" ], [ "log.c", - "ex/v1.3.0/log.html" + "ex/v1.3.1/log.html" ], [ "ls-files.c", - "ex/v1.3.0/ls-files.html" + "ex/v1.3.1/ls-files.html" ], [ "ls-remote.c", - "ex/v1.3.0/ls-remote.html" + "ex/v1.3.1/ls-remote.html" ], [ "merge.c", - "ex/v1.3.0/merge.html" + "ex/v1.3.1/merge.html" ], [ "push.c", - "ex/v1.3.0/push.html" + "ex/v1.3.1/push.html" ], [ "remote.c", - "ex/v1.3.0/remote.html" + "ex/v1.3.1/remote.html" ], [ "rev-list.c", - "ex/v1.3.0/rev-list.html" + "ex/v1.3.1/rev-list.html" ], [ "rev-parse.c", - "ex/v1.3.0/rev-parse.html" + "ex/v1.3.1/rev-parse.html" ], [ "show-index.c", - "ex/v1.3.0/show-index.html" + "ex/v1.3.1/show-index.html" ], [ "stash.c", - "ex/v1.3.0/stash.html" + "ex/v1.3.1/stash.html" ], [ "status.c", - "ex/v1.3.0/status.html" + "ex/v1.3.1/status.html" ], [ "tag.c", - "ex/v1.3.0/tag.html" + "ex/v1.3.1/tag.html" ] ] } \ No newline at end of file diff --git a/generate/templates/manual/libgit2/opts.cc b/generate/templates/manual/libgit2/opts.cc index d6ed362c4..5829adc6c 100644 --- a/generate/templates/manual/libgit2/opts.cc +++ b/generate/templates/manual/libgit2/opts.cc @@ -23,6 +23,15 @@ NAN_METHOD(GitLibgit2::Opts) to = Nan::New(option_value); break; } + // GET int + case GIT_OPT_GET_OWNER_VALIDATION: { + int option_value; + if (git_libgit2_opts(from_option, &option_value)) { + return Nan::ThrowError("git_libgit2_opts failed"); + } + to = Nan::New(option_value); + break; + } // GET unsigned long case GIT_OPT_GET_WINDOWS_SHAREMODE: { unsigned long option_value; @@ -75,7 +84,8 @@ NAN_METHOD(GitLibgit2::Opts) case GIT_OPT_ENABLE_FSYNC_GITDIR: case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION: case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY: - case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: { + case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: + case GIT_OPT_SET_OWNER_VALIDATION: { if (info.Length() < 2 || !info[1]->IsNumber()) { return Nan::ThrowError("Number option is required."); } From 5ca5a844f07ca4e6020ff1fe8585de2f63da6e03 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 5 May 2022 07:47:27 -0700 Subject: [PATCH 396/545] Bump to v0.28.0-alpha.15 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 249833e3f..84b6895ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.15 [(2022-05-05)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.15) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.14...v0.28.0-alpha.15) + +#### Summary of changes +- Expose `GIT_OPT_GET_OWNER_VALIDATION` and `GIT_OPT_SET_OWNER_VALIDATION` + +#### Merged PRs into NodeGit +- [Expose get/set owner validation opts](https://github.com/nodegit/nodegit/pull/1910) + ## v0.28.0-alpha.14 [(2022-05-02)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.14) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.13...v0.28.0-alpha.14) diff --git a/package-lock.json b/package-lock.json index 239a4940c..bd5893ddc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.14", + "version": "0.28.0-alpha.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.14", + "version": "0.28.0-alpha.15", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 83168031e..04e7beb60 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.14", + "version": "0.28.0-alpha.15", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 355ea13e71044e8b6aabd90f7ac47175f26636c6 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 6 May 2022 17:18:28 -0700 Subject: [PATCH 397/545] Include julianmesa-gitkraken/disabled-filters-checkout --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 30d5c088a..fe44f25a9 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 30d5c088a45b29ac819aac890d70ed0ca5f7b194 +Subproject commit fe44f25a98bc89ee958800f6166458d38ba9e255 From 3f23c211a92f9c59cd4330f5681d884172e376d7 Mon Sep 17 00:00:00 2001 From: Alex A Date: Fri, 6 May 2022 20:29:47 +0200 Subject: [PATCH 398/545] Supplement disabled_filters in git_checkout_options --- generate/input/libgit2-supplement.json | 132 +++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 26995b0d5..99b32dc21 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -82,6 +82,138 @@ }, "git_note_iterator": { "decl": "git_iterator" + }, + "git_checkout_options": { + "decl": [ + "unsigned int version", + "unsigned int checkout_strategy", + "int disable_filters", + "unsigned int dir_mode", + "unsigned int file_mode", + "int file_open_flags", + "unsigned int notify_flags", + "git_checkout_notify_cb notify_cb", + "void * notify_payload", + "git_checkout_progress_cb progress_cb", + "void * progress_payload", + "git_strarray paths", + "git_tree * baseline", + "git_index * baseline_index", + "const char * target_directory", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_checkout_perfdata_cb perfdata_cb", + "void * perfdata_payload", + "git_strarray disabled_filters" + ], + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "unsigned int", + "name": "checkout_strategy", + "comments": " default will be a safe checkout " + }, + { + "type": "int", + "name": "disable_filters", + "comments": " don't apply filters like CRLF conversion " + }, + { + "type": "unsigned int", + "name": "dir_mode", + "comments": " default is 0755 " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " default is 0644 or 0755 as dictated by blob " + }, + { + "type": "int", + "name": "file_open_flags", + "comments": " default is O_CREAT | O_TRUNC | O_WRONLY " + }, + { + "type": "unsigned int", + "name": "notify_flags", + "comments": " see `git_checkout_notify_t` above " + }, + { + "type": "git_checkout_notify_cb", + "name": "notify_cb", + "comments": " Optional callback to get notifications on specific file states.\n " + }, + { + "type": "void *", + "name": "notify_payload", + "comments": " Payload passed to notify_cb " + }, + { + "type": "git_checkout_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of checkout progress. " + }, + { + "type": "void *", + "name": "progress_payload", + "comments": " Payload passed to progress_cb " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." + }, + { + "type": "git_index *", + "name": "baseline_index", + "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." + }, + { + "type": "const char *", + "name": "target_directory", + "comments": " alternative checkout path to workdir " + }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " the name of the common ancestor side of conflicts " + }, + { + "type": "const char *", + "name": "our_label", + "comments": " the name of the \"our\" side of conflicts " + }, + { + "type": "const char *", + "name": "their_label", + "comments": " the name of the \"their\" side of conflicts " + }, + { + "type": "git_checkout_perfdata_cb", + "name": "perfdata_cb", + "comments": " Optional callback to notify the consumer of performance data. " + }, + { + "type": "void *", + "name": "perfdata_payload", + "comments": " Payload passed to perfdata_cb " + }, + { + "type": "git_strarray", + "name": "disabled_filters", + "comments": " A list filters to disable during checkout." + } + ] } }, "new" : { From 5601740f929805f9649be8e9f5f9892b43a39fba Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 9 May 2022 08:23:58 -0700 Subject: [PATCH 399/545] Bump to v0.28.0-alpha.16 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84b6895ae..f411040d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.16 [(2022-05-09)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.16) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.15...v0.28.0-alpha.16) + +#### Summary of changes +- Allow disabling specific filters during checkout + +#### Merged PRs into NodeGit +- [Allow disabling specific filters during checkout](https://github.com/nodegit/nodegit/pull/1911) + ## v0.28.0-alpha.15 [(2022-05-05)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.15) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.14...v0.28.0-alpha.15) diff --git a/package-lock.json b/package-lock.json index bd5893ddc..6cbe81ccb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.15", + "version": "0.28.0-alpha.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.15", + "version": "0.28.0-alpha.16", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 04e7beb60..daabfaccd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.15", + "version": "0.28.0-alpha.16", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 5472cc19135c5bdc39d7223248befc7910188780 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Mon, 16 May 2022 08:56:39 +0200 Subject: [PATCH 400/545] Enable GIT_USE_NSEC This will improve performance on LFS and big repos --- vendor/libgit2 | 2 +- vendor/libgit2.gyp | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index fe44f25a9..013d4162e 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit fe44f25a98bc89ee958800f6166458d38ba9e255 +Subproject commit 013d4162e9f158d1b931ceffbebed0b2c6515c47 diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 7d78eb95d..4767545bc 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -23,11 +23,7 @@ "GIT_SSH_MEMORY_CREDENTIALS", "LIBGIT2_NO_FEATURES_H", "GIT_SHA1_COLLISIONDETECT", - # "GIT_USE_NSEC", We've been shipping without NSEC for awhile - # Turning NSEC on should be left up to application maintainer - # There may be negative performance impacts using nodegit with - # NSEC turned on in a repository that was cloned with nodegit - # with NSEC turned off + "GIT_USE_NSEC", "GIT_HTTPS", # Node's util.h may be accidentally included so use this to guard # against compilation error. From 711bb656d63396312972b5a00b71afa48bc97642 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Mon, 23 May 2022 14:23:33 +0200 Subject: [PATCH 401/545] Improve Diff.patches to allow an index array Instead load all patches you can load the required patches in the array --- generate/input/libgit2-supplement.json | 4 + .../manual/patches/convenient_patches.cc | 93 ++++++++++++++----- lib/diff.js | 4 +- 3 files changed, 77 insertions(+), 24 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 99b32dc21..ee785e0c2 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -673,6 +673,10 @@ "name": "diff", "type": "git_diff *" }, + { + "name": "indexes", + "type": "std::vector" + }, { "name": "out", "type": "std::vector *" diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index 9d46cb3bf..e183afb75 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -13,6 +13,19 @@ NAN_METHOD(GitPatch::ConvenientFromDiff) { baton->error = NULL; baton->diff = Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked())->GetValue(); + + if (info[1]->IsArray()) { + v8::Local context = Nan::GetCurrentContext(); + const v8::Local indexesArray = info[1].As(); + const uint32_t numIndexes = indexesArray->Length(); + + for (uint32_t i = 0; i < numIndexes; ++i) { + v8::Local value = indexesArray->Get(context, i).ToLocalChecked(); + int idx = value.As()->Value(); + baton->indexes.push_back(idx); + } + } + baton->out = new std::vector; baton->out->reserve(git_diff_num_deltas(baton->diff)); @@ -37,37 +50,73 @@ void GitPatch::ConvenientFromDiffWorker::Execute() { std::vector patchesToBeFreed; - for (std::size_t i = 0; i < git_diff_num_deltas(baton->diff); ++i) { - git_patch *nextPatch; - int result = git_patch_from_diff(&nextPatch, baton->diff, i); + if (baton->indexes.size() > 0) { + for (int idx : baton->indexes) { + git_patch *nextPatch; + int result = git_patch_from_diff(&nextPatch, baton->diff, idx); + + if (result) { + while (!patchesToBeFreed.empty()) + { + git_patch_free(patchesToBeFreed.back()); + patchesToBeFreed.pop_back(); + } + + while (!baton->out->empty()) { + PatchDataFree(baton->out->back()); + baton->out->pop_back(); + } + + baton->error_code = result; + + if (git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); + } - if (result) { - while (!patchesToBeFreed.empty()) - { - git_patch_free(patchesToBeFreed.back()); - patchesToBeFreed.pop_back(); + delete baton->out; + baton->out = NULL; + + return; } - while (!baton->out->empty()) { - PatchDataFree(baton->out->back()); - baton->out->pop_back(); + if (nextPatch != NULL) { + baton->out->push_back(createFromRaw(nextPatch)); + patchesToBeFreed.push_back(nextPatch); } + } + } else { + for (std::size_t i = 0; i < git_diff_num_deltas(baton->diff); ++i) { + git_patch *nextPatch; + int result = git_patch_from_diff(&nextPatch, baton->diff, i); - baton->error_code = result; + if (result) { + while (!patchesToBeFreed.empty()) + { + git_patch_free(patchesToBeFreed.back()); + patchesToBeFreed.pop_back(); + } - if (git_error_last() != NULL) { - baton->error = git_error_dup(git_error_last()); - } + while (!baton->out->empty()) { + PatchDataFree(baton->out->back()); + baton->out->pop_back(); + } - delete baton->out; - baton->out = NULL; + baton->error_code = result; - return; - } + if (git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); + } - if (nextPatch != NULL) { - baton->out->push_back(createFromRaw(nextPatch)); - patchesToBeFreed.push_back(nextPatch); + delete baton->out; + baton->out = NULL; + + return; + } + + if (nextPatch != NULL) { + baton->out->push_back(createFromRaw(nextPatch)); + patchesToBeFreed.push_back(nextPatch); + } } } diff --git a/lib/diff.js b/lib/diff.js index feda0aa74..2ae41a62b 100644 --- a/lib/diff.js +++ b/lib/diff.js @@ -62,6 +62,6 @@ Diff.blobToBuffer= function( * @return {Array} a promise that resolves to an array of * ConvenientPatches */ -Diff.prototype.patches = function() { - return Patch.convenientFromDiff(this); +Diff.prototype.patches = function(idxs) { + return Patch.convenientFromDiff(this, idxs); }; From f9aceffaffb1de6fab76bd448cf6a7c1583158a7 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 24 May 2022 07:50:52 -0700 Subject: [PATCH 402/545] Bump to v0.28.0-alpha.17 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f411040d2..5e394c21f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.17 [(2022-05-24)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.17) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.16...v0.28.0-alpha.17) + +#### Summary of changes +- Enable nanosecond precision for file operations + +#### Merged PRs into NodeGit +- [Enable GIT_USE_NSEC](https://github.com/nodegit/nodegit/pull/1912) + ## v0.28.0-alpha.16 [(2022-05-09)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.16) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.15...v0.28.0-alpha.16) diff --git a/package-lock.json b/package-lock.json index 6cbe81ccb..74ea1264e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.16", + "version": "0.28.0-alpha.17", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.16", + "version": "0.28.0-alpha.17", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index daabfaccd..91e1f8dba 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.16", + "version": "0.28.0-alpha.17", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 86447b64cbcc415d39f39ed8792296328b7bc31f Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 26 May 2022 08:26:40 -0700 Subject: [PATCH 403/545] Bring in GIT_USE_NSEC fix https://github.com/nodegit/libgit2/pull/8 --- vendor/libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libgit2 b/vendor/libgit2 index 013d4162e..4c98283d2 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 013d4162e9f158d1b931ceffbebed0b2c6515c47 +Subproject commit 4c98283d2a7f1444b246dd1dba0439ea85bba80c From 36c0e3f103f02144229fd549f6bce1a49cc68b4d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 27 May 2022 10:54:11 -0700 Subject: [PATCH 404/545] Bump to v0.28.0-alpha.18 --- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e394c21f..54e01a704 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## v0.28.0-alpha.18 [(2022-05-27)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.18) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.17...v0.28.0-alpha.18) + +#### Summary of changes +- Allow fetching partial patches from diff +- Fix nanosecond comparison typo + +#### Merged PRs into NodeGit +- [Improve Diff.patches to allow an index array](https://github.com/nodegit/nodegit/pull/1916) +- [Bring in GIT_USE_NSEC fix](https://github.com/nodegit/nodegit/pull/1917) + ## v0.28.0-alpha.17 [(2022-05-24)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.17) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.16...v0.28.0-alpha.17) diff --git a/package-lock.json b/package-lock.json index 74ea1264e..6d9e95944 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.17", + "version": "0.28.0-alpha.18", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.17", + "version": "0.28.0-alpha.18", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 91e1f8dba..3aabe35ac 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.17", + "version": "0.28.0-alpha.18", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 9617630bb6e984983610c42bf78202ca78cef9ba Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Mon, 20 Jun 2022 09:38:41 +0200 Subject: [PATCH 405/545] Add getAllFilepaths function in tree object --- generate/input/libgit2-supplement.json | 32 ++++ .../manual/tree/get_all_filepaths.cc | 157 ++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 generate/templates/manual/tree/get_all_filepaths.cc diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index ee785e0c2..557410cfc 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1013,6 +1013,32 @@ "type": "int" }, "group": "status_list" + }, + "git_tree_get_all_filepaths": { + "args": [ + { + "name": "tree", + "type": "git_tree *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "out", + "type": "std::vector *" + } + ], + "type": "function", + "isManual": true, + "cFile": "generate/templates/manual/tree/get_all_filepaths.cc", + "isAsync": true, + "isPrototypeMethod": true, + "group": "tree", + "return": { + "type": "int", + "isErrorCode": true + } } }, "groups": [ @@ -1223,6 +1249,12 @@ "git_status_list_new" ] ], + [ + "tree", + [ + "git_tree_get_all_filepaths" + ] + ], [ "tree_entry", [ diff --git a/generate/templates/manual/tree/get_all_filepaths.cc b/generate/templates/manual/tree/get_all_filepaths.cc new file mode 100644 index 000000000..53334a127 --- /dev/null +++ b/generate/templates/manual/tree/get_all_filepaths.cc @@ -0,0 +1,157 @@ + +namespace TreeFilepathsHelpers { + +int iterateTreePaths(git_repository *repo, git_tree *tree, std::vector *paths,std::string *buffer) { + size_t size = git_tree_entrycount(tree); + for (size_t i = 0; i < size; i++) { + const git_tree_entry *entry = git_tree_entry_byindex(tree, i); + const git_filemode_t filemode = git_tree_entry_filemode(entry); + if (filemode == GIT_FILEMODE_BLOB || filemode == GIT_FILEMODE_BLOB_EXECUTABLE) { + paths->push_back(*buffer + std::string(git_tree_entry_name(entry))); + } + else if (filemode == GIT_FILEMODE_TREE) { + git_tree *subtree; + int error = git_tree_lookup(&subtree, repo, git_tree_entry_id(entry)); + if (error == GIT_OK) { + size_t size = buffer->size(); + /* append the next entry to the path */ + buffer->append(git_tree_entry_name(entry)); + buffer->append("/"); + error = iterateTreePaths(repo, subtree, paths, buffer); + git_tree_free(subtree); + buffer->resize(size); + } + + if (error < 0 ) { + return error; + } + + } + } + return GIT_OK; +} + +} // end anonymous namespace + +NAN_METHOD(GitTree::GetAllFilepaths) +{ + if (!info[info.Length() - 1]->IsFunction()) { + return Nan::ThrowError("Callback is required and must be a Function."); + } + + GetAllFilepathsBaton* baton = new GetAllFilepathsBaton(); + + baton->error_code = GIT_OK; + baton->error = NULL; + baton->tree = Nan::ObjectWrap::Unwrap(info.This())->GetValue(); + baton->out = new std::vector; + baton->repo = git_tree_owner(baton->tree); + + Nan::Callback *callback = new Nan::Callback(Local::Cast(info[info.Length() - 1])); + std::map> cleanupHandles; + GetAllFilepathsWorker *worker = new GetAllFilepathsWorker(baton, callback, cleanupHandles); + worker->Reference("tree", info.This()); + nodegit::Context *nodegitContext = reinterpret_cast(info.Data().As()->Value()); + nodegitContext->QueueWorker(worker); + + return; +} + +nodegit::LockMaster GitTree::GetAllFilepathsWorker::AcquireLocks() { + nodegit::LockMaster lockMaster(true, baton->tree, baton->repo); + return lockMaster; +} + +void GitTree::GetAllFilepathsWorker::Execute() +{ + std::string buffer; + buffer.reserve(4096); + baton->error_code = TreeFilepathsHelpers::iterateTreePaths(baton->repo, baton->tree, baton->out, &buffer); + if (baton->error_code != GIT_OK && git_error_last() != NULL) { + baton->error = git_error_dup(git_error_last()); + } +} + +void GitTree::GetAllFilepathsWorker::HandleErrorCallback() { + if (baton->error) { + if (baton->error->message) { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + + delete baton->out; + + delete baton; +} + +void GitTree::GetAllFilepathsWorker::HandleOKCallback() +{ + if (baton->error_code == GIT_OK) { + std::vector &paths = *(baton->out); + v8::Local result = Nan::New(paths.size()); + for (unsigned int i = 0; i < paths.size(); i++) { + Nan::Set(result, i, Nan::New(paths[i]).ToLocalChecked()); + } + + v8::Local argv[2] = {Nan::Null(), result}; + callback->Call(2, argv, async_resource); + } + else + { + if (baton->error) + { + Local err; + if (baton->error->message) { + err = Nan::To(Nan::Error(baton->error->message)).ToLocalChecked(); + } else { + err = Nan::To(Nan::Error("Method getAllFilepaths has thrown an error.")).ToLocalChecked(); + } + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Tree.getAllFilepaths").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + if (baton->error->message) + { + free((void *)baton->error->message); + } + + free((void *)baton->error); + } + else if (baton->error_code < 0) + { + bool callbackFired = false; + if (!callbackErrorHandle.IsEmpty()) { + v8::Local maybeError = Nan::New(callbackErrorHandle); + if (!maybeError->IsNull() && !maybeError->IsUndefined()) { + v8::Local argv[1] = { + maybeError + }; + callback->Call(1, argv, async_resource); + callbackFired = true; + } + } + + if (!callbackFired) + { + Local err = Nan::To(Nan::Error("Method getAllFilepaths has thrown an error.")).ToLocalChecked(); + Nan::Set(err, Nan::New("errno").ToLocalChecked(), Nan::New(baton->error_code)); + Nan::Set(err, Nan::New("errorFunction").ToLocalChecked(), Nan::New("Revwalk.getAllFilepaths").ToLocalChecked()); + Local argv[1] = { + err + }; + callback->Call(1, argv, async_resource); + } + } + else + { + callback->Call(0, NULL, async_resource); + } + } + + delete baton->out; + delete baton; +} From e746e62cc94dc6cc5468ce1ad2351c7ac80bbeb5 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Mon, 13 Jun 2022 12:55:54 +0200 Subject: [PATCH 406/545] Add tests --- test/tests/tree.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/tests/tree.js b/test/tests/tree.js index 68765bf74..052459a80 100644 --- a/test/tests/tree.js +++ b/test/tests/tree.js @@ -112,4 +112,13 @@ describe("Tree", function() { ); }); }); + + it("get all paths from a tree", async function () { + const tree = await this.commit.getTree(); + const paths = await tree.getAllFilepaths(); + assert.equal(paths.length, 512); + assert.equal(paths[0], ".gitignore"); + assert.equal(paths[511], "wscript"); + }); + }); From ab6aa7de24fed13f17b5b28369c4af22f1f85313 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Fri, 8 Jul 2022 13:15:48 +0200 Subject: [PATCH 407/545] Improve performance using LTO and disabling asserts --- generate/templates/templates/binding.gyp | 26 ++++++++++++++++++++++++ vendor/libgit2.gyp | 25 +++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 26b1f197d..0bb014540 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -7,6 +7,32 @@ "macOS_deployment_target": "10.11" }, + 'target_defaults': { + 'default_configuration': 'Debug', + 'configurations': { + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'cflags': [ '-flto' ], + 'xcode_settings': { + 'LLVM_LTO': 'YES' + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'true' + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'LinkTimeCodeGeneration': 1 + } + } + } + } + }, + "targets": [ { "target_name": "acquireOpenSSL", diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 4767545bc..f0276796d 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -13,6 +13,31 @@ "electron_openssl_root%": " Date: Wed, 6 Jul 2022 13:19:01 +0200 Subject: [PATCH 408/545] Fix linux tests --- .github/workflows/tests.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ece7ac30e..1d54f4c74 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Install Dependencies for Ubuntu # git >= 2.18 required for actions/checkout git support - run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang libssl-dev libkrb5-dev libc++-dev wget + run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang-8 lld-8 libssl-dev libkrb5-dev libc++-dev wget env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true @@ -29,6 +29,9 @@ jobs: CC: clang CXX: clang++ run: | + update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-8 100 + update-alternatives --install /usr/bin/clang clang /usr/bin/clang-8 100 + update-alternatives --install /usr/bin/ld ld /usr/bin/lld-8 100 mkdir ~/python cd ~/python wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz @@ -65,10 +68,17 @@ jobs: CXX: clang++ npm_config_clang: 1 GYP_DEFINES: use_obsolete_asm=true + AR: "/usr/lib/llvm-8/bin/llvm-ar" + NM: "/usr/lib/llvm-8/bin/llvm-nm" + # ranlib is not needed, and doesn't support .bc files in .a + RANLIB: /bin/true # There is a race condition in node/generate that needs to be fixed # Node 16 changed the logic it uses to select it's UID which means to make node run as root and not 1001, we need to chwon the current directory. More Details: # https://stackoverflow.com/questions/70298238/getting-eaccess-when-running-npm-8-as-root run: | + update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-8 100 + update-alternatives --install /usr/bin/clang clang /usr/bin/clang-8 100 + update-alternatives --install /usr/bin/ld ld /usr/bin/lld-8 100 chown root.root -R . npm set unsafe-perm true node utils/retry npm install From 750c319fc40b002ba70562d5424fa2203129b2cf Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 29 Sep 2022 08:00:34 -0700 Subject: [PATCH 409/545] Revert "Improve performance using LTO and disabling asserts" --- .github/workflows/tests.yml | 12 +---------- generate/templates/templates/binding.gyp | 26 ------------------------ vendor/libgit2.gyp | 25 ----------------------- 3 files changed, 1 insertion(+), 62 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1d54f4c74..ece7ac30e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Install Dependencies for Ubuntu # git >= 2.18 required for actions/checkout git support - run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang-8 lld-8 libssl-dev libkrb5-dev libc++-dev wget + run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang libssl-dev libkrb5-dev libc++-dev wget env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true @@ -29,9 +29,6 @@ jobs: CC: clang CXX: clang++ run: | - update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-8 100 - update-alternatives --install /usr/bin/clang clang /usr/bin/clang-8 100 - update-alternatives --install /usr/bin/ld ld /usr/bin/lld-8 100 mkdir ~/python cd ~/python wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz @@ -68,17 +65,10 @@ jobs: CXX: clang++ npm_config_clang: 1 GYP_DEFINES: use_obsolete_asm=true - AR: "/usr/lib/llvm-8/bin/llvm-ar" - NM: "/usr/lib/llvm-8/bin/llvm-nm" - # ranlib is not needed, and doesn't support .bc files in .a - RANLIB: /bin/true # There is a race condition in node/generate that needs to be fixed # Node 16 changed the logic it uses to select it's UID which means to make node run as root and not 1001, we need to chwon the current directory. More Details: # https://stackoverflow.com/questions/70298238/getting-eaccess-when-running-npm-8-as-root run: | - update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-8 100 - update-alternatives --install /usr/bin/clang clang /usr/bin/clang-8 100 - update-alternatives --install /usr/bin/ld ld /usr/bin/lld-8 100 chown root.root -R . npm set unsafe-perm true node utils/retry npm install diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 0bb014540..26b1f197d 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -7,32 +7,6 @@ "macOS_deployment_target": "10.11" }, - 'target_defaults': { - 'default_configuration': 'Debug', - 'configurations': { - 'Debug': { - 'defines': [ 'DEBUG', '_DEBUG' ], - }, - 'Release': { - 'defines': [ 'NDEBUG' ], - 'cflags': [ '-flto' ], - 'xcode_settings': { - 'LLVM_LTO': 'YES' - }, - 'msvs_settings': { - 'VCCLCompilerTool': { - 'WholeProgramOptimization': 'true' - }, - 'VCLibrarianTool': { - }, - 'VCLinkerTool': { - 'LinkTimeCodeGeneration': 1 - } - } - } - } - }, - "targets": [ { "target_name": "acquireOpenSSL", diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index f0276796d..4767545bc 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -13,31 +13,6 @@ "electron_openssl_root%": " Date: Thu, 13 Oct 2022 12:14:35 +0200 Subject: [PATCH 410/545] type is a call --- lib/repository.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/repository.js b/lib/repository.js index 00ce320c1..64d566dcd 100644 --- a/lib/repository.js +++ b/lib/repository.js @@ -340,7 +340,7 @@ Repository.discover = function(startPath, acrossFs, ceilingDirs) { Repository.getReferences = function(repo, type, refNamesOnly) { return repo.getReferences().then(function(refList) { var filteredRefList = refList.filter(function(reference) { - return type === Reference.TYPE.ALL || reference.type === type; + return type === Reference.TYPE.ALL || reference.type( ) === type; }); if (refNamesOnly) { From be64459a46c20ba5c7e819b22c77f4457449acd9 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Thu, 20 Oct 2022 07:57:56 +0200 Subject: [PATCH 411/545] Fix tag createWithSignature function Also tests fixed --- lib/tag.js | 4 +-- test/tests/tag.js | 72 ++++++++++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 31 deletions(-) diff --git a/lib/tag.js b/lib/tag.js index 4c21f45aa..8f2312a2c 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -53,7 +53,7 @@ Tag.createBuffer = function(repo, tagName, target, tagger, message) { * @async * @param {Repository} repo * @param {String} tagName - * @param {Oid} target + * @param {Object} target * @param {Signature} tagger * @param {String} message * @param {Number} force @@ -71,7 +71,7 @@ Tag.createWithSignature = function( signingCallback ) { let tagBuffer; - return Tag.createBuffer(repo, tagName, target, tagger, message) + return Tag.createBuffer(repo, tagName, target.id(), tagger, message) .then((tagBufferResult) => { tagBuffer = tagBufferResult; return signingCallback(tagBuffer); diff --git a/test/tests/tag.js b/test/tests/tag.js index 844fa43be..62a6c78eb 100644 --- a/test/tests/tag.js +++ b/test/tests/tag.js @@ -322,8 +322,8 @@ describe("Tag", function() { it( "can create a tag with a signature and extract the signature", function() { - const targetOid = Oid.fromString(commitPointedTo); - const otherTargetOid = Oid.fromString(commitPointedTo2); + var targetCommit; + var otherTargetCommit; const name = "created-signed-tag-annotationCreate"; const repository = this.repository; const signature = Signature.create( @@ -359,14 +359,19 @@ describe("Tag", function() { let oid; let object; - return repository.odb() - .then((odbResult) => { + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return repository.getCommit(commitPointedTo2); + }).then((commit) => { + otherTargetCommit = commit; + return repository.odb(); + }).then((odbResult) => { odb = odbResult; return Tag.createWithSignature( repository, name, - targetOid, + targetCommit, signature, message, 1, @@ -409,7 +414,7 @@ describe("Tag", function() { return Tag.createWithSignature( repository, name, - targetOid, + targetCommit, signature, message, 1, @@ -421,7 +426,7 @@ describe("Tag", function() { return Tag.createWithSignature( repository, name, - otherTargetOid, + otherTargetCommit, signature, message, 0, @@ -442,8 +447,8 @@ describe("Tag", function() { ); it("can optionally skip the signing process", function() { - const targetOid = Oid.fromString(commitPointedTo); - const otherTargetOid = Oid.fromString(commitPointedTo2); + var targetCommit; + var otherTargetCommit; const name = "created-signed-tag-annotationCreate"; const repository = this.repository; const signature = Signature.create( @@ -461,14 +466,19 @@ describe("Tag", function() { let oid; let object; - return repository.odb() - .then((odbResult) => { + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return repository.getCommit(commitPointedTo2); + }).then((commit) => { + otherTargetCommit = commit; + return repository.odb(); + }).then((odbResult) => { odb = odbResult; return Tag.createWithSignature( repository, name, - targetOid, + targetCommit, signature, message, 1, @@ -514,7 +524,7 @@ describe("Tag", function() { return Tag.createWithSignature( repository, name, - targetOid, + targetCommit, signature, message, 1, @@ -526,7 +536,7 @@ describe("Tag", function() { return Tag.createWithSignature( repository, name, - otherTargetOid, + otherTargetCommit, signature, message, 0, @@ -544,7 +554,7 @@ describe("Tag", function() { }); it("will throw if signing callback returns an error code", function() { - const targetOid = Oid.fromString(commitPointedTo); + var targetCommit; const name = "created-signed-tag-annotationCreate"; const repository = this.repository; const signature = Signature.create( @@ -559,16 +569,18 @@ describe("Tag", function() { }); - return Tag.createWithSignature( - repository, - name, - targetOid, - signature, - message, - 1, - signingCallback - ) - .then(function() { + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return Tag.createWithSignature( + repository, + name, + targetCommit, + signature, + message, + 1, + signingCallback + ); + }).then(function() { assert.fail("Should not have been able to create tag"); }, function(error) { if (error && error.errno === NodeGit.Error.CODE.ERROR) { @@ -581,14 +593,16 @@ describe("Tag", function() { it("can create a new signed tag with Tag.annotationCreate", function() { - var oid = Oid.fromString(commitPointedTo); + var targetCommit; var name = "created-signed-tag-annotationCreate"; var repository = this.repository; var signature = null; var odb = null; - return Signature.default(repository) - .then(function(signatureResult) { + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return Signature.default(repository); + }).then(function(signatureResult) { signature = signatureResult; return repository.odb(); }) @@ -597,7 +611,7 @@ describe("Tag", function() { }) .then(function() { return Tag.annotationCreate( - repository, name, oid, signature, tagMessage); + repository, name, targetCommit, signature, tagMessage); }) .then(function(oid) { return odb.read(oid); From fc3743c639a4a6fda2b5cffe36a5b0bb63edeb8a Mon Sep 17 00:00:00 2001 From: Jacob Watson Date: Wed, 10 Aug 2022 11:18:08 -0700 Subject: [PATCH 412/545] add patch for openssl 1.1.1q --- .../openssl/002-darwin-fix_test_compilation.patch | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 vendor/patches/openssl/002-darwin-fix_test_compilation.patch diff --git a/vendor/patches/openssl/002-darwin-fix_test_compilation.patch b/vendor/patches/openssl/002-darwin-fix_test_compilation.patch new file mode 100644 index 000000000..6ce8f0a83 --- /dev/null +++ b/vendor/patches/openssl/002-darwin-fix_test_compilation.patch @@ -0,0 +1,14 @@ +openssl 1.1.1q has a problem where a `memcmp` call is not declared before its +usage in a test file. due to this, MacOS is not able to compile the test for +1.1.1q without screwing around with compiler flags. this patch introduces the +`memcmp` declaration +--- test/v3ext.c ++++ test/v3ext.c +@@ -8,6 +8,7 @@ + */ + + #include ++#include + #include + #include + #include From 1bcdcdba7bc8f242ba1e11f54cb5943540bf677c Mon Sep 17 00:00:00 2001 From: Jacob Watson Date: Wed, 10 Aug 2022 11:18:38 -0700 Subject: [PATCH 413/545] make patch system support OS-specific patches --- utils/acquireOpenSSL.js | 10 +++++++--- vendor/patches/README.md | 4 +++- ...tch => 001-linux-force_getentropy_dso_lookup.patch} | 0 3 files changed, 10 insertions(+), 4 deletions(-) rename vendor/patches/openssl/{001-unix_force_getentropy_dso_lookup.patch => 001-linux-force_getentropy_dso_lookup.patch} (100%) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index e8b8c8f4a..cdeb75196 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -42,10 +42,10 @@ class HashVerify extends stream.Transform { } // currently this only needs to be done on linux -const applyOpenSSLPatches = async (buildCwd) => { +const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { try { for (const patchFilename of await fse.readdir(opensslPatchPath)) { - if (patchFilename.split(".").pop() === "patch") { + if (patchFilename.split(".").pop() === "patch" && patchFilename.split("-")[1] === operatingSystem) { console.log(`applying ${patchFilename}`); await execPromise(`patch -up0 -i ${path.join(opensslPatchPath, patchFilename)}`, { cwd: buildCwd @@ -80,6 +80,8 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { cwd: buildCwd }, { pipeOutput: true }); + await applyOpenSSLPatches(buildCwd, "linux"); + // only build the libraries, not the tests/fuzzer or apps await execPromise("make build_libs", { cwd: buildCwd @@ -117,7 +119,7 @@ const buildLinux = async (buildCwd) => { cwd: buildCwd }, { pipeOutput: true }); - await applyOpenSSLPatches(buildCwd); + await applyOpenSSLPatches(buildCwd, "linux"); // only build the libraries, not the tests/fuzzer or apps await execPromise("make build_libs", { @@ -136,6 +138,8 @@ const buildLinux = async (buildCwd) => { }; const buildWin32 = async (buildCwd) => { + await applyOpenSSLPatches(buildCwd, "win32"); + const vcvarsallArch = process.arch === "x64" ? "x64" : "x86"; const programFilesPath = (vcvarsallArch === "x64" ? process.env["ProgramFiles(x86)"] diff --git a/vendor/patches/README.md b/vendor/patches/README.md index 6f025a762..f0ad3ae21 100644 --- a/vendor/patches/README.md +++ b/vendor/patches/README.md @@ -5,7 +5,9 @@ Patches will be applied from 000 to 999 ### Naming Convention -`-.patch` +`--.patch` + +Operating system is either "win32", "darwin", or "linux". ### Content diff --git a/vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch b/vendor/patches/openssl/001-linux-force_getentropy_dso_lookup.patch similarity index 100% rename from vendor/patches/openssl/001-unix_force_getentropy_dso_lookup.patch rename to vendor/patches/openssl/001-linux-force_getentropy_dso_lookup.patch From ff125a913cd2e48578ed6bc6319654ab7a5a1687 Mon Sep 17 00:00:00 2001 From: Jacob Watson Date: Thu, 11 Aug 2022 14:51:36 -0700 Subject: [PATCH 414/545] remove win32 from patch support --- utils/acquireOpenSSL.js | 4 +--- vendor/patches/README.md | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index cdeb75196..ca7838d0c 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -80,7 +80,7 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { cwd: buildCwd }, { pipeOutput: true }); - await applyOpenSSLPatches(buildCwd, "linux"); + await applyOpenSSLPatches(buildCwd, "darwin"); // only build the libraries, not the tests/fuzzer or apps await execPromise("make build_libs", { @@ -138,8 +138,6 @@ const buildLinux = async (buildCwd) => { }; const buildWin32 = async (buildCwd) => { - await applyOpenSSLPatches(buildCwd, "win32"); - const vcvarsallArch = process.arch === "x64" ? "x64" : "x86"; const programFilesPath = (vcvarsallArch === "x64" ? process.env["ProgramFiles(x86)"] diff --git a/vendor/patches/README.md b/vendor/patches/README.md index f0ad3ae21..3dda6ac59 100644 --- a/vendor/patches/README.md +++ b/vendor/patches/README.md @@ -7,7 +7,7 @@ Patches will be applied from 000 to 999 `--.patch` -Operating system is either "win32", "darwin", or "linux". +Operating system is either "darwin" or "linux". ### Content From a4d5aa9d48c6dbb26a7e276fbbda1e31ba56e22a Mon Sep 17 00:00:00 2001 From: Jacob Watson Date: Mon, 15 Aug 2022 12:25:53 -0700 Subject: [PATCH 415/545] allow patch to be applied to all operating systems --- utils/acquireOpenSSL.js | 3 ++- vendor/patches/README.md | 2 +- ...st_compilation.patch => 002-all-fix_test_compilation.patch} | 0 3 files changed, 3 insertions(+), 2 deletions(-) rename vendor/patches/openssl/{002-darwin-fix_test_compilation.patch => 002-all-fix_test_compilation.patch} (100%) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index ca7838d0c..58e1a87dd 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -45,7 +45,8 @@ class HashVerify extends stream.Transform { const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { try { for (const patchFilename of await fse.readdir(opensslPatchPath)) { - if (patchFilename.split(".").pop() === "patch" && patchFilename.split("-")[1] === operatingSystem) { + const patchTarget = patchFilename.split("-")[1]; + if (patchFilename.split(".").pop() === "patch" && (patchTarget === operatingSystem || patchTarget === "all")) { console.log(`applying ${patchFilename}`); await execPromise(`patch -up0 -i ${path.join(opensslPatchPath, patchFilename)}`, { cwd: buildCwd diff --git a/vendor/patches/README.md b/vendor/patches/README.md index 3dda6ac59..898a965fe 100644 --- a/vendor/patches/README.md +++ b/vendor/patches/README.md @@ -7,7 +7,7 @@ Patches will be applied from 000 to 999 `--.patch` -Operating system is either "darwin" or "linux". +Operating system is either "darwin", "linux", or "all". ### Content diff --git a/vendor/patches/openssl/002-darwin-fix_test_compilation.patch b/vendor/patches/openssl/002-all-fix_test_compilation.patch similarity index 100% rename from vendor/patches/openssl/002-darwin-fix_test_compilation.patch rename to vendor/patches/openssl/002-all-fix_test_compilation.patch From 5901640fe3fa9ac9d39e33a9b9443d4cd948c1ed Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Tue, 25 Oct 2022 10:26:50 +0200 Subject: [PATCH 416/545] Add deprecation warning --- lib/tag.js | 94 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 29 deletions(-) diff --git a/lib/tag.js b/lib/tag.js index 8f2312a2c..d5f96d4e5 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -1,3 +1,4 @@ +var util = require("util"); var NodeGit = require("../"); var LookupWrapper = NodeGit.Utils.lookupWrapper; var Tag = NodeGit.Tag; @@ -49,6 +50,10 @@ Tag.createBuffer = function(repo, tagName, target, tagger, message) { }); }; +const deprecatedCreateWithSignatureHelper = util.deprecate(function(repo, oidTarget) { + return repo.getCommit(oidTarget); +}, "Tag.createWithSignature target should be a Git Object, not Oid"); + /** * @async * @param {Repository} repo @@ -70,37 +75,68 @@ Tag.createWithSignature = function( force, signingCallback ) { - let tagBuffer; - return Tag.createBuffer(repo, tagName, target.id(), tagger, message) - .then((tagBufferResult) => { - tagBuffer = tagBufferResult; - return signingCallback(tagBuffer); - }) - .then(({ code, signedData }) => { - switch (code) { - case NodeGit.Error.CODE.OK: { - const normalizedEnding = signedData.endsWith("\n") ? "" : "\n"; - const signedTagString = tagBuffer + signedData + normalizedEnding; - return Tag.createFromBuffer(repo, signedTagString, force); - } - case NodeGit.Error.CODE.PASSTHROUGH: - return Tag.create( - repo, - tagName, - target, - tagger, - message, - force - ); - default: { - const error = new Error( - `Tag.createWithSignature threw with error code ${code}` - ); - error.errno = code; - throw error; + + const createTag = function(repo, + tagName, + target, + tagger, + message, + force, + signingCallback) { + let tagBuffer; + + return Tag.createBuffer(repo, tagName, target.id(), tagger, message) + .then((tagBufferResult) => { + tagBuffer = tagBufferResult; + return signingCallback(tagBuffer); + }) + .then(({ code, signedData }) => { + switch (code) { + case NodeGit.Error.CODE.OK: { + const normalizedEnding = signedData.endsWith("\n") ? "" : "\n"; + const signedTagString = tagBuffer + signedData + normalizedEnding; + return Tag.createFromBuffer(repo, signedTagString, force); + } + case NodeGit.Error.CODE.PASSTHROUGH: + return Tag.create( + repo, + tagName, + target, + tagger, + message, + force + ); + default: { + const error = new Error( + `Tag.createWithSignature threw with error code ${code}` + ); + error.errno = code; + throw error; + } } - } + }); + }; + + if (!target.id) { + deprecatedCreateWithSignatureHelper(repo, target).then((targetOid) => { + return createTag(repo, + tagName, + targetOid, + tagger, + message, + force, + signingCallback); }); + } else { + return createTag(repo, + tagName, + target, + tagger, + message, + force, + signingCallback); + } + }; /** From abb3a70df7ccbd91a94096dfad603bc0ca657af2 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Fri, 28 Oct 2022 10:07:09 +0200 Subject: [PATCH 417/545] free method_name From this commit: https://github.com/libssh2/libssh2/pull/662/commits/b11d07dc2df92e0870c4e6457e2e05a3c1782e36 --- vendor/libssh2/src/agent.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vendor/libssh2/src/agent.c b/vendor/libssh2/src/agent.c index 4dc2c9a51..7ad4ef471 100644 --- a/vendor/libssh2/src/agent.c +++ b/vendor/libssh2/src/agent.c @@ -520,6 +520,10 @@ agent_sign(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, memcpy(*sig, s, *sig_len); error: + + if(method_name) + LIBSSH2_FREE(session, method_name); + LIBSSH2_FREE(session, transctx->request); transctx->request = NULL; From 01f0f521d715d9578cfb656c382df9d6d40a16e0 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 28 Oct 2022 12:10:36 -0700 Subject: [PATCH 418/545] Switch CI to macOS-11 10.15 is no longer supported by GitHub Actions --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ece7ac30e..9e88bb565 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -97,7 +97,7 @@ jobs: strategy: matrix: node: [12, 14, 16] - runs-on: macOS-10.15 + runs-on: macOS-11 # This is mostly the same as the Linux steps, waiting for anchor support # https://github.com/actions/runner/issues/1182 steps: From b4e6f4d1582884e147752797c0ccb456cef83a88 Mon Sep 17 00:00:00 2001 From: Jacob Watson Date: Wed, 22 Jun 2022 14:13:54 -0700 Subject: [PATCH 419/545] implement test for stash with options --- test/tests/stash.js | 70 +++++++++++++++++++++++++++++++++++++++++++++ vendor/libgit2 | 2 +- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/test/tests/stash.js b/test/tests/stash.js index a8720438b..811a0c509 100644 --- a/test/tests/stash.js +++ b/test/tests/stash.js @@ -257,4 +257,74 @@ describe("Stash", function() { assert.equal(fileContentB, content); }); }); + + it("can partial stash the workdir and pop it", function() { + const repo = this.repository; + + const fileName1 = "README.md"; + const fileName2 = "install.js"; + const fileName3 = "LICENSE"; + + const fileContentA = "Hi. It's me. I'm the dog. My name is the dog."; + const fileContentB = "Everyone likes me. I'm cute."; + + let oldContentA; + let oldContentB; + let oldContentC; + + const filePath1 = path.join(repo.workdir(), fileName1); + const filePath2 = path.join(repo.workdir(), fileName2); + const filePath3 = path.join(repo.workdir(), fileName3); + + const options = { + flags: 0, + message: "stast test", + paths: [fileName1, fileName2] + }; + + return fse.readFile(filePath1, "utf-8") + .then((content) => { + oldContentA = content; + return fse.readFile(filePath2, "utf-8"); + }) + .then((content) => { + oldContentB = content; + return fse.readFile(filePath3, "utf-8"); + }) + .then((content) => { + oldContentC = content; + return fse.writeFile(filePath1, fileContentA); + }) + .then(() => fse.writeFile(filePath2, fileContentB)) + .then(() => repo.defaultSignature()) + .then((signature) => { + options.stasher = signature; + return Stash.saveWithOpts(repo, options); + }) + .then(() => fse.readFile(filePath1, "utf-8")) + .then((content) => { + assert.equal(oldContentA, content); + return fse.readFile(filePath2, "utf-8"); + }) + .then((content) => { + assert.equal(oldContentB, content); + return fse.readFile(filePath3, "utf-8"); + }) + .then((content) => { + assert.equal(oldContentC, content); + return Stash.pop(repo, 0); + }) + .then(() => fse.readFile(filePath1, "utf-8")) + .then((content) => { + assert.equal(fileContentA, content); + return fse.readFile(filePath2, "utf-8"); + }) + .then((content) => { + assert.equal(fileContentB, content); + return fse.readFile(filePath3, "utf-8"); + }) + .then((content) => { + assert.equal(oldContentC, content); + }); + }); }); diff --git a/vendor/libgit2 b/vendor/libgit2 index 4c98283d2..0ac7af7cd 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 4c98283d2a7f1444b246dd1dba0439ea85bba80c +Subproject commit 0ac7af7cd914316e2d3c7d7337ae78618c19c2a2 From 0676f9558065dc73f18862f15d7ae05d105a63b7 Mon Sep 17 00:00:00 2001 From: Jacob Watson Date: Tue, 5 Jul 2022 09:29:45 -0700 Subject: [PATCH 420/545] partial stashing input docs --- generate/input/descriptor.json | 3 + generate/input/libgit2-docs.json | 134 ++++++++++++++++++++++++++++++- 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index bf0efcd0a..c43cb8fee 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3957,6 +3957,9 @@ "git_stash_apply_options_init": { "ignore": true }, + "git_stash_save_options_init": { + "ignore": true + }, "git_stash_drop": { "isAsync": true, "return": { diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index aa0f54e35..a9467b1de 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -1067,7 +1067,9 @@ "file": "git2/stash.h", "functions": [ "git_stash_save", + "git_stash_save_with_opts", "git_stash_apply_progress_cb", + "git_stash_save_options_init", "git_stash_apply_options_init", "git_stash_apply", "git_stash_cb", @@ -21913,6 +21915,65 @@ "comments": "", "group": "stash" }, + "git_stash_save_with_opts": { + "type": "function", + "file": "git2/stash.h", + "line": 67, + "lineto": 72, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "opts", + "type": "git_stash_save_options *", + "comment": "dee dee doo doo" + } + ], + "argline": "git_oid *out, git_repository *repo, git_stash_save_options *opts", + "sig": "git_oid *::git_repository *::git_stash_save_options*", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_save_options_init": { + "type": "function", + "file": "git2/stash.h", + "line": 156, + "lineto": 157, + "args": [ + { + "name": "opts", + "type": "git_stash_save_options *", + "comment": "The `git_stash_save_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STASH_SAVE_OPTIONS_VERSION`." + } + ], + "argline": "git_stash_save_options *opts, unsigned int version", + "sig": "git_stash_save_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_stash_save_options structure

\n", + "comments": "

Initializes a git_stash_save_options with default values. Equivalent to creating an instance with GIT_STASH_SAVE_OPTIONS_INIT.

\n", + "group": "stash" + }, "git_stash_apply_options_init": { "type": "function", "file": "git2/stash.h", @@ -34763,6 +34824,7 @@ "git_revwalk_push", "git_stash_cb", "git_stash_save", + "git_stash_save_with_opts", "git_tag_annotation_create", "git_tag_create", "git_tag_create_from_buffer", @@ -36530,6 +36592,7 @@ "git_stash_foreach", "git_stash_pop", "git_stash_save", + "git_stash_save_with_opts", "git_status_file", "git_status_foreach", "git_status_foreach_ext", @@ -37327,6 +37390,7 @@ "git_signature_new", "git_signature_now", "git_stash_save", + "git_stash_save_with_opts", "git_tag_annotation_create", "git_tag_create", "git_transaction_set_symbolic_target", @@ -37433,6 +37497,61 @@ } } ], + [ + "git_stash_save_options", + { + "decl": [ + "unsigned int version", + "const git_signature *stasher", + "const char *message", + "uint32_t flags", + "git_strarray paths" + ], + "type": "struct", + "value": "git_stash_save_options", + "file": "git2/stash.h", + "line": 126, + "lineto": 138, + "block": "unsigned int version\nconst git_signature *stasher\nconst char *message\nuint32_t flags\ngit_strarray paths", + "tdef": "typedef", + "description": " bebebebebeeb", + "comments": "

Initialize with GIT_STASH_SAVE_OPTIONS_INIT. Alternatively, you can use git_stash_save_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "const git_signature *", + "name": "stasher", + "comments": "" + }, + { + "type": "const char *", + "name": "message", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": "" + }, + { + "type": "git_strarray", + "name": "paths", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_save_with_opts", + "git_stash_save_options_init" + ] + } + } + ], [ "git_stash_apply_flags", { @@ -37610,13 +37729,14 @@ "GIT_STASH_DEFAULT", "GIT_STASH_KEEP_INDEX", "GIT_STASH_INCLUDE_UNTRACKED", - "GIT_STASH_INCLUDE_IGNORED" + "GIT_STASH_INCLUDE_IGNORED", + "GIT_STASH_KEEP_ALL" ], "type": "enum", "file": "git2/stash.h", "line": 25, "lineto": 48, - "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", + "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED\nGIT_STASH_KEEP_ALL", "tdef": "typedef", "description": " Stash flags", "comments": "", @@ -37644,6 +37764,12 @@ "name": "GIT_STASH_INCLUDE_IGNORED", "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_KEEP_ALL", + "comments": "

All changes in the index and working directory are left intact

\n", + "value": 8 } ], "used": { @@ -40112,11 +40238,13 @@ "stash", [ "git_stash_apply", + "git_stash_save_options_init", "git_stash_apply_options_init", "git_stash_drop", "git_stash_foreach", "git_stash_pop", - "git_stash_save" + "git_stash_save", + "git_stash_save_with_opts" ] ], [ From 23500c86994876cbf410caa2f61b82f2cc076823 Mon Sep 17 00:00:00 2001 From: Jacob Watson Date: Wed, 27 Jul 2022 11:05:32 -0700 Subject: [PATCH 421/545] fix libgit2 docs --- generate/input/libgit2-docs.json | 134 +------------------------ generate/input/libgit2-supplement.json | 112 +++++++++++++++++++++ 2 files changed, 115 insertions(+), 131 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index a9467b1de..aa0f54e35 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -1067,9 +1067,7 @@ "file": "git2/stash.h", "functions": [ "git_stash_save", - "git_stash_save_with_opts", "git_stash_apply_progress_cb", - "git_stash_save_options_init", "git_stash_apply_options_init", "git_stash_apply", "git_stash_cb", @@ -21915,65 +21913,6 @@ "comments": "", "group": "stash" }, - "git_stash_save_with_opts": { - "type": "function", - "file": "git2/stash.h", - "line": 67, - "lineto": 72, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "opts", - "type": "git_stash_save_options *", - "comment": "dee dee doo doo" - } - ], - "argline": "git_oid *out, git_repository *repo, git_stash_save_options *opts", - "sig": "git_oid *::git_repository *::git_stash_save_options*", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." - }, - "description": "

Save the local modifications to a new stash.

\n", - "comments": "", - "group": "stash" - }, - "git_stash_save_options_init": { - "type": "function", - "file": "git2/stash.h", - "line": 156, - "lineto": 157, - "args": [ - { - "name": "opts", - "type": "git_stash_save_options *", - "comment": "The `git_stash_save_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_STASH_SAVE_OPTIONS_VERSION`." - } - ], - "argline": "git_stash_save_options *opts, unsigned int version", - "sig": "git_stash_save_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_stash_save_options structure

\n", - "comments": "

Initializes a git_stash_save_options with default values. Equivalent to creating an instance with GIT_STASH_SAVE_OPTIONS_INIT.

\n", - "group": "stash" - }, "git_stash_apply_options_init": { "type": "function", "file": "git2/stash.h", @@ -34824,7 +34763,6 @@ "git_revwalk_push", "git_stash_cb", "git_stash_save", - "git_stash_save_with_opts", "git_tag_annotation_create", "git_tag_create", "git_tag_create_from_buffer", @@ -36592,7 +36530,6 @@ "git_stash_foreach", "git_stash_pop", "git_stash_save", - "git_stash_save_with_opts", "git_status_file", "git_status_foreach", "git_status_foreach_ext", @@ -37390,7 +37327,6 @@ "git_signature_new", "git_signature_now", "git_stash_save", - "git_stash_save_with_opts", "git_tag_annotation_create", "git_tag_create", "git_transaction_set_symbolic_target", @@ -37497,61 +37433,6 @@ } } ], - [ - "git_stash_save_options", - { - "decl": [ - "unsigned int version", - "const git_signature *stasher", - "const char *message", - "uint32_t flags", - "git_strarray paths" - ], - "type": "struct", - "value": "git_stash_save_options", - "file": "git2/stash.h", - "line": 126, - "lineto": 138, - "block": "unsigned int version\nconst git_signature *stasher\nconst char *message\nuint32_t flags\ngit_strarray paths", - "tdef": "typedef", - "description": " bebebebebeeb", - "comments": "

Initialize with GIT_STASH_SAVE_OPTIONS_INIT. Alternatively, you can use git_stash_save_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "const git_signature *", - "name": "stasher", - "comments": "" - }, - { - "type": "const char *", - "name": "message", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": "" - }, - { - "type": "git_strarray", - "name": "paths", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_stash_save_with_opts", - "git_stash_save_options_init" - ] - } - } - ], [ "git_stash_apply_flags", { @@ -37729,14 +37610,13 @@ "GIT_STASH_DEFAULT", "GIT_STASH_KEEP_INDEX", "GIT_STASH_INCLUDE_UNTRACKED", - "GIT_STASH_INCLUDE_IGNORED", - "GIT_STASH_KEEP_ALL" + "GIT_STASH_INCLUDE_IGNORED" ], "type": "enum", "file": "git2/stash.h", "line": 25, "lineto": 48, - "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED\nGIT_STASH_KEEP_ALL", + "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", "tdef": "typedef", "description": " Stash flags", "comments": "", @@ -37764,12 +37644,6 @@ "name": "GIT_STASH_INCLUDE_IGNORED", "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", "value": 4 - }, - { - "type": "int", - "name": "GIT_STASH_KEEP_ALL", - "comments": "

All changes in the index and working directory are left intact

\n", - "value": 8 } ], "used": { @@ -40238,13 +40112,11 @@ "stash", [ "git_stash_apply", - "git_stash_save_options_init", "git_stash_apply_options_init", "git_stash_drop", "git_stash_foreach", "git_stash_pop", - "git_stash_save", - "git_stash_save_with_opts" + "git_stash_save" ] ], [ diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 557410cfc..98f8eb8d8 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1014,6 +1014,44 @@ }, "group": "status_list" }, + "git_stash_save_options_init": { + "file": "git2/stash.h", + "args": [ + { + "name": "opts", + "type": "git_stash_save_options *" + }, + { + "name": "version", + "type": "unsigned int" + } + ], + "return": { + "type": "int" + }, + "group": "stash" + }, + "git_stash_save_with_opts": { + "file": "git2/stash.h", + "args": [ + { + "name": "out", + "type": "git_oid *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "opts", + "type": "git_stash_save_options *" + } + ], + "return": { + "type": "int" + }, + "group": "stash" + }, "git_tree_get_all_filepaths": { "args": [ { @@ -1240,6 +1278,13 @@ "git_revwalk_file_history_walk" ] ], + [ + "stash", + [ + "git_stash_save_options_init", + "git_stash_save_with_opts" + ] + ], [ "status_list", [ @@ -1854,6 +1899,73 @@ } } ], + [ + "git_stash_flags", + { + "type": "enum", + "fields": [ + { + "type": "unsigned int", + "name": "GIT_STASH_DEFAULT", + "value": 0 + }, + { + "type": "unsigned int", + "name": "GIT_STASH_KEEP_INDEX", + "value": 1 + }, + { + "type": "unsigned int", + "name": "GIT_STASH_INCLUDE_UNTRACKED", + "value": 2 + }, + { + "type": "unsigned int", + "name": "GIT_STASH_INCLUDE_IGNORED", + "value": 4 + }, + { + "type": "unsigned int", + "name": "GIT_STASH_KEEP_ALL", + "value": 8 + } + ] + } + ], + [ + "git_stash_save_options", + { + "type": "struct", + "fields": [ + { + "type": "unsigned int", + "name": "version" + }, + { + "type": "const git_signature *", + "name": "stasher" + }, + { + "type": "const char *", + "name": "message" + }, + { + "type": "uint32_t", + "name": "flags" + }, + { + "type": "git_strarray", + "name": "paths" + } + ], + "used": { + "needs": [ + "git_stash_save_with_opts", + "git_stash_save_options_init" + ] + } + } + ], [ "git_status_options", { From ff46a51d9bc1ba8ae1f5a4990964127d78f88039 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 25 Oct 2022 15:43:16 -0700 Subject: [PATCH 422/545] Bump OpenSSL to 1.1.1q --- utils/acquireOpenSSL.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 58e1a87dd..0dafa5448 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -14,6 +14,7 @@ const zlib = require("zlib"); const pipeline = promisify(stream.pipeline); +const OPENSSL_VERSION = "1.1.1q"; const win32BatPath = path.join(__dirname, "build-openssl.bat"); const vendorPath = path.resolve(__dirname, "..", "vendor"); const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); @@ -300,7 +301,7 @@ const acquireOpenSSL = async () => { } } - await buildOpenSSLIfNecessary("1.1.1l", macOsDeploymentTarget); + await buildOpenSSLIfNecessary(OPENSSL_VERSION, macOsDeploymentTarget); } catch (err) { console.error("Acquire failed: ", err); process.exit(1); From 1aba42276a9775db6c6b1b5d25e1cc26fad89fa4 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 20 Oct 2022 12:59:04 -0700 Subject: [PATCH 423/545] Build OpenSSL package --- utils/acquireOpenSSL.js | 47 +++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 0dafa5448..7e2b3fbeb 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -20,6 +20,10 @@ const vendorPath = path.resolve(__dirname, "..", "vendor"); const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); const extractPath = path.join(vendorPath, "openssl"); +const pathsToIncludeForPackage = [ + "bin", "include", "lib" +]; + const getOpenSSLSourceUrl = (version) => `https://www.openssl.org/source/openssl-${version}.tar.gz`; const getOpenSSLSourceSha256Url = (version) => `${getOpenSSLSourceUrl(version)}.sha256`; @@ -200,12 +204,12 @@ const makeOnStreamDownloadProgress = () => { }; const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => { - if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== 'linux') { + if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== "linux") { console.log(`Skipping OpenSSL build, not required on ${process.platform}`); return; } - if (process.platform === 'linux' && process.env.NODEGIT_OPENSSL_STATIC_LINK !== '1') { + if (process.platform === "linux" && process.env.NODEGIT_OPENSSL_STATIC_LINK !== "1") { console.log(`Skipping OpenSSL build, NODEGIT_OPENSSL_STATIC_LINK !== 1`); return; } @@ -239,7 +243,7 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => if (process.platform === "darwin") { await buildDarwin(buildCwd, macOsDeploymentTarget); - } else if (process.platform === "linux" && process.env.NODEGIT_OPENSSL_STATIC_LINK === '1') { + } else if (process.platform === "linux") { await buildLinux(buildCwd); } else if (process.platform === "win32") { await buildWin32(buildCwd); @@ -251,12 +255,12 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => } const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) => { - if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== 'linux') { + if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== "linux") { console.log(`Skipping OpenSSL download, not required on ${process.platform}`); return; } - if (process.platform === 'linux' && process.env.NODEGIT_OPENSSL_STATIC_LINK !== '1') { + if (process.platform === "linux" && process.env.NODEGIT_OPENSSL_STATIC_LINK !== "1") { console.log(`Skipping OpenSSL download, NODEGIT_OPENSSL_STATIC_LINK !== 1`); return; } @@ -284,6 +288,23 @@ const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) = console.log("Download finished."); } +const getOpenSSLPackageName = () => { + let arch = process.arch; + if (process.platform === "win32" && process.arch === "ia32") { + arch = "x86"; + } + + return `openssl-${OPENSSL_VERSION}-${process.platform}-${arch}.tar.gz`; +} + +const buildPackage = async () => { + await pipeline( + tar.pack(extractPath, { entries: pathsToIncludeForPackage }), + zlib.createGzip(), + fsNonPromise.createWriteStream(getOpenSSLPackageName()) + ); +}; + const acquireOpenSSL = async () => { try { const maybeDownloadBinUrl = process.env.npm_config_openssl_bin_url; @@ -302,10 +323,24 @@ const acquireOpenSSL = async () => { } await buildOpenSSLIfNecessary(OPENSSL_VERSION, macOsDeploymentTarget); + if (process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { + await buildPackage(); + } } catch (err) { console.error("Acquire failed: ", err); process.exit(1); } }; -acquireOpenSSL(); +module.exports = { + acquireOpenSSL, + getOpenSSLPackageName, + OPENSSL_VERSION +}; + +if (require.main === module) { + acquireOpenSSL().catch((error) => { + console.error("Acquire OpenSSL failed: ", error); + process.exit(1); + }); +} From d421b92cd4ad4195f62f02801e68e8ced27a9d58 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 20 Oct 2022 13:05:11 -0700 Subject: [PATCH 424/545] Support 32 bit OpenSSL builds on Windows --- utils/acquireOpenSSL.js | 59 ++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 7e2b3fbeb..ce95240d8 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -65,6 +65,10 @@ const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { } const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { + if (!macOsDeploymentTarget) { + throw new Error("Expected macOsDeploymentTarget to be specified"); + } + const arguments = [ process.arch === "x64" ? "darwin64-x86_64-cc" : "darwin64-arm64-cc", // speed up ecdh on little-endian platforms with 128bit int support @@ -143,9 +147,12 @@ const buildLinux = async (buildCwd) => { }, { pipeOutput: true }); }; -const buildWin32 = async (buildCwd) => { - const vcvarsallArch = process.arch === "x64" ? "x64" : "x86"; - const programFilesPath = (vcvarsallArch === "x64" +const buildWin32 = async (buildCwd, vsBuildArch) => { + if (!vsBuildArch) { + throw new Error("Expected vsBuildArch to be specified"); + } + + const programFilesPath = (process.arch === "x64" ? process.env["ProgramFiles(x86)"] : process.env.ProgramFiles) || "C:\\Program Files"; const vcvarsallPath = process.env.npm_config_vcvarsall_path || `${ @@ -157,8 +164,24 @@ const buildWin32 = async (buildCwd) => { throw new Error(`vcvarsall.bat not found at ${vcvarsallPath}`); } - const vcTarget = vcvarsallArch === "x64" ? "VC-WIN64A" : "VC-WIN32"; - await execPromise(`"${win32BatPath}" "${vcvarsallPath}" ${vcvarsallArch} ${vcTarget}`, { + let vcTarget; + switch (vsBuildArch) { + case "x64": { + vcTarget = "VC-WIN64A"; + break; + } + + case "x86": { + vcTarget = "VC-WIN32"; + break; + } + + default: { + throw new Error(`Unknown vsBuildArch: ${vsBuildArch}`); + } + } + + await execPromise(`"${win32BatPath}" "${vcvarsallPath}" ${vsBuildArch} ${vcTarget}`, { cwd: buildCwd, maxBuffer: 10 * 1024 * 1024 // we should really just use spawn }, { pipeOutput: true }); @@ -203,7 +226,11 @@ const makeOnStreamDownloadProgress = () => { }; }; -const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => { +const buildOpenSSLIfNecessary = async ({ + macOsDeploymentTarget, + openSSLVersion, + vsBuildArch +}) => { if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== "linux") { console.log(`Skipping OpenSSL build, not required on ${process.platform}`); return; @@ -246,7 +273,7 @@ const buildOpenSSLIfNecessary = async (openSSLVersion, macOsDeploymentTarget) => } else if (process.platform === "linux") { await buildLinux(buildCwd); } else if (process.platform === "win32") { - await buildWin32(buildCwd); + await buildWin32(buildCwd, vsBuildArch); } else { throw new Error(`Unknown platform: ${process.platform}`); } @@ -290,7 +317,9 @@ const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) = const getOpenSSLPackageName = () => { let arch = process.arch; - if (process.platform === "win32" && process.arch === "ia32") { + if (process.platform === "win32" && ( + process.arch === "ia32" || process.env.NODEGIT_VS_BUILD_ARCH === "x86" + )) { arch = "x86"; } @@ -322,7 +351,19 @@ const acquireOpenSSL = async () => { } } - await buildOpenSSLIfNecessary(OPENSSL_VERSION, macOsDeploymentTarget); + let vsBuildArch; + if (process.platform === "win32") { + vsBuildArch = process.env.NODEGIT_VS_BUILD_ARCH || (process.arch === "x64" ? "x64" : "x86"); + if (!["x64", "x86"].includes(vsBuildArch)) { + throw new Error(`Invalid vsBuildArch: ${vsBuildArch}`); + } + } + + await buildOpenSSLIfNecessary({ + openSSLVersion: OPENSSL_VERSION, + macOsDeploymentTarget, + vsBuildArch + }); if (process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { await buildPackage(); } From b6b87aff8832bd97acb57f01775d1e31300e9777 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 20 Oct 2022 13:06:50 -0700 Subject: [PATCH 425/545] Bump tar-fs --- package-lock.json | 326 ++++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 99 insertions(+), 229 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d9e95944..e363d9047 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "nan": "^2.15.0", "node-gyp": "^8.4.1", "ramda": "^0.25.0", - "tar-fs": "^1.16.3" + "tar-fs": "^2.1.1" }, "devDependencies": { "aws-sdk": "^2.1095.0", @@ -347,7 +347,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -373,39 +372,36 @@ } }, "node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/bl/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "safe-buffer": "~5.1.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "node_modules/boolbase": { @@ -440,20 +436,6 @@ "isarray": "^1.0.0" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, "node_modules/buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", @@ -463,11 +445,6 @@ "node": ">=0.4.0" } }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, "node_modules/cacache": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", @@ -964,7 +941,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "node_modules/coveralls": { "version": "3.1.1", @@ -1908,8 +1886,7 @@ "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "node_modules/imurmurhash": { "version": "0.1.4", @@ -2085,7 +2062,8 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -2738,6 +2716,7 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, "dependencies": { "minimist": "^1.2.5" }, @@ -2745,6 +2724,11 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", @@ -3301,7 +3285,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -3773,14 +3758,14 @@ } }, "node_modules/tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dependencies": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, "node_modules/tar-fs/node_modules/chownr": { @@ -3788,57 +3773,19 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "node_modules/tar-fs/node_modules/pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/tar-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">=6" } }, "node_modules/tar/node_modules/mkdirp": { @@ -3915,11 +3862,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, "node_modules/to-readable-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", @@ -4375,6 +4317,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, "engines": { "node": ">=0.4" } @@ -4659,8 +4602,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -4672,39 +4614,22 @@ } }, "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } } } @@ -4741,31 +4666,12 @@ "isarray": "^1.0.0" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, "cacache": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", @@ -5185,7 +5091,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "coveralls": { "version": "3.1.1", @@ -5925,8 +5832,7 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "imurmurhash": { "version": "0.1.4", @@ -6066,7 +5972,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -6601,10 +6508,16 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, "requires": { "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", @@ -7031,7 +6944,8 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "promise-inflight": { "version": "1.0.1", @@ -7404,73 +7318,33 @@ } }, "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" }, "dependencies": { "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } } } }, "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" } }, "through2": { @@ -7535,11 +7409,6 @@ "is-negated-glob": "^1.0.0" } }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, "to-readable-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", @@ -7918,7 +7787,8 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { "version": "3.2.2", diff --git a/package.json b/package.json index 3aabe35ac..9d15dd3b2 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "nan": "^2.15.0", "node-gyp": "^8.4.1", "ramda": "^0.25.0", - "tar-fs": "^1.16.3" + "tar-fs": "^2.1.1" }, "devDependencies": { "aws-sdk": "^2.1095.0", From c56cb06b25eda3448d8edec38f419f312cfe2d79 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 20 Oct 2022 13:07:45 -0700 Subject: [PATCH 426/545] Exclude unnecessary files, set file modes --- utils/acquireOpenSSL.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index ce95240d8..27a98be37 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -21,7 +21,7 @@ const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); const extractPath = path.join(vendorPath, "openssl"); const pathsToIncludeForPackage = [ - "bin", "include", "lib" + "include", "lib" ]; const getOpenSSLSourceUrl = (version) => `https://www.openssl.org/source/openssl-${version}.tar.gz`; @@ -328,7 +328,16 @@ const getOpenSSLPackageName = () => { const buildPackage = async () => { await pipeline( - tar.pack(extractPath, { entries: pathsToIncludeForPackage }), + tar.pack(extractPath, { + entries: pathsToIncludeForPackage, + ignore: (name) => { + // Ignore pkgconfig files + return path.extname(name) === ".pc" + || path.basename(name) === "pkgconfig"; + }, + dmode: 0755, + fmode: 0644 + }), zlib.createGzip(), fsNonPromise.createWriteStream(getOpenSSLPackageName()) ); From 715389aab3cc2272a2582965391042cbfb9004da Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 20 Oct 2022 13:44:32 -0700 Subject: [PATCH 427/545] Download OpenSSL from S3 by default --- guides/install/from-source/README.md | 2 +- utils/acquireOpenSSL.js | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/guides/install/from-source/README.md b/guides/install/from-source/README.md index 30ffdbef6..eadd8306d 100644 --- a/guides/install/from-source/README.md +++ b/guides/install/from-source/README.md @@ -67,7 +67,7 @@ npm install nodegit --msvs_version=2013 ### Electron and OpenSSL ### A local version of OpenSSL is required when building for Electron on Windows and macOS. This is due to Electron using BoringSSL, as we are not able to link to it like we are OpenSSL in Node. Additionally, OpenSSL can be statically linked on Linux by setting the `NODEGIT_OPENSSL_STATIC_LINK` environment variable to `1`. -`acquireOpenSSL.js` will attempt to download and build OpenSSL locally. On macOS, this should Just Work(tm). On Windows, things are a little trickier. +`acquireOpenSSL.js` will attempt to download OpenSSL prebuilts from S3. If preferred, it can also be built locally by setting the environment variable `npm_config_openssl_bin_url=skip`. On macOS, this should Just Work(tm). On Windows, things are a little trickier. - We rely on the Visual Studio dev tools to be installed, specifically `vcvarsall.bat` to provide access to the tools. If this is not in the default location for VS2017, you'll need to `npm config set vcvarsall_path ` or set the environment variable `npm_config_vcvarsall_path` pointing to it. - See [Compilation and Installation](https://wiki.openssl.org/index.php/Compilation_and_Installation#Windows) regarding required dependencies, specifically `Perl` (Strawberry Perl is known to work) and `NASM`. Make sure they're on the PATH. diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 27a98be37..af8e7e7a5 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -14,6 +14,8 @@ const zlib = require("zlib"); const pipeline = promisify(stream.pipeline); +const packageJson = require('../package.json') + const OPENSSL_VERSION = "1.1.1q"; const win32BatPath = path.join(__dirname, "build-openssl.bat"); const vendorPath = path.resolve(__dirname, "..", "vendor"); @@ -326,6 +328,8 @@ const getOpenSSLPackageName = () => { return `openssl-${OPENSSL_VERSION}-${process.platform}-${arch}.tar.gz`; } +const getOpenSSLPackageUrl = () => `${packageJson.binary.host}${getOpenSSLPackageName()}`; + const buildPackage = async () => { await pipeline( tar.pack(extractPath, { @@ -345,10 +349,18 @@ const buildPackage = async () => { const acquireOpenSSL = async () => { try { - const maybeDownloadBinUrl = process.env.npm_config_openssl_bin_url; - if (maybeDownloadBinUrl) { - const maybeDownloadSha256 = process.env.npm_config_openssl_bin_sha256; - await downloadOpenSSLIfNecessary(maybeDownloadBinUrl, maybeDownloadSha256); + const downloadBinUrl = process.env.npm_config_openssl_bin_url || getOpenSSLPackageUrl(); + if (downloadBinUrl !== 'skip' && !process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { + let maybeDownloadSha256; + if (process.env.npm_config_openssl_bin_sha256 !== 'skip') { + if (process.env.npm_config_openssl_bin_sha256) { + maybeDownloadSha256 = process.env.npm_config_openssl_bin_sha256; + } else { + maybeDownloadSha256 = (await got(`${getOpenSSLPackageUrl()}.sha256`)).body.trim(); + } + } + + await downloadOpenSSLIfNecessary(downloadBinUrl, maybeDownloadSha256); return; } From 47c0071d18c16d04c8cf8ba7181bfb87af4de629 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 3 Nov 2022 15:40:55 -0700 Subject: [PATCH 428/545] Use custom nan --- generate/templates/templates/binding.gyp | 2 +- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 26b1f197d..668a3e753 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -81,7 +81,7 @@ "include_dirs": [ "vendor/libv8-convert", "vendor/libssh2/include", - "= 12.19.0 < 13 || >= 14.10.0" } }, + "node_modules/@axosoft/nan": { + "version": "2.18.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.1.tgz", + "integrity": "sha512-rBLCaXNfzbM/XakZhvuambkKatlFBHVtAgiMKV/YmNZvcBKWocNGJSyXiDPUDHJ7fCTVgEe1h66vfzdE4vBJTQ==" + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -2844,11 +2849,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -4349,6 +4349,11 @@ } }, "dependencies": { + "@axosoft/nan": { + "version": "2.18.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.1.tgz", + "integrity": "sha512-rBLCaXNfzbM/XakZhvuambkKatlFBHVtAgiMKV/YmNZvcBKWocNGJSyXiDPUDHJ7fCTVgEe1h66vfzdE4vBJTQ==" + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -6612,11 +6617,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", diff --git a/package.json b/package.json index 9d15dd3b2..dc95ec4da 100644 --- a/package.json +++ b/package.json @@ -38,12 +38,12 @@ "node": ">= 12.19.0 < 13 || >= 14.10.0" }, "dependencies": { + "@axosoft/nan": "^2.18.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^10.7.0", "json5": "^2.1.0", "lodash": "^4.17.14", - "nan": "^2.15.0", "node-gyp": "^8.4.1", "ramda": "^0.25.0", "tar-fs": "^2.1.1" From 1a8571061589faf251955856caf6e75961c77b56 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 2 Nov 2022 16:30:53 -0700 Subject: [PATCH 429/545] Bump template internal field count --- generate/templates/manual/src/convenient_hunk.cc | 2 +- generate/templates/manual/src/convenient_patch.cc | 2 +- generate/templates/manual/src/promise_completion.cc | 2 +- generate/templates/manual/src/wrapper.cc | 2 +- generate/templates/templates/class_content.cc | 2 +- generate/templates/templates/struct_content.cc | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/generate/templates/manual/src/convenient_hunk.cc b/generate/templates/manual/src/convenient_hunk.cc index 38dd8c078..2d33e50b6 100644 --- a/generate/templates/manual/src/convenient_hunk.cc +++ b/generate/templates/manual/src/convenient_hunk.cc @@ -39,7 +39,7 @@ void ConvenientHunk::InitializeComponent(Local target, nodegit::Cont Local nodegitExternal = Nan::New(nodegitContext); Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->InstanceTemplate()->SetInternalFieldCount(2); tpl->SetClassName(Nan::New("ConvenientHunk").ToLocalChecked()); Nan::SetPrototypeMethod(tpl, "size", Size, nodegitExternal); diff --git a/generate/templates/manual/src/convenient_patch.cc b/generate/templates/manual/src/convenient_patch.cc index f60f53257..22e6e6b49 100644 --- a/generate/templates/manual/src/convenient_patch.cc +++ b/generate/templates/manual/src/convenient_patch.cc @@ -136,7 +136,7 @@ void ConvenientPatch::InitializeComponent(Local target, nodegit::Con Local nodegitExternal = Nan::New(nodegitContext); Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->InstanceTemplate()->SetInternalFieldCount(2); tpl->SetClassName(Nan::New("ConvenientPatch").ToLocalChecked()); Nan::SetPrototypeMethod(tpl, "hunks", Hunks, nodegitExternal); diff --git a/generate/templates/manual/src/promise_completion.cc b/generate/templates/manual/src/promise_completion.cc index dfc560682..d3e4f4426 100644 --- a/generate/templates/manual/src/promise_completion.cc +++ b/generate/templates/manual/src/promise_completion.cc @@ -6,7 +6,7 @@ void PromiseCompletion::InitializeComponent(nodegit::Context *nodegitContext) { Nan::HandleScope scope; v8::Local nodegitExternal = Nan::New(nodegitContext); v8::Local newTemplate = Nan::New(New, nodegitExternal); - newTemplate->InstanceTemplate()->SetInternalFieldCount(1); + newTemplate->InstanceTemplate()->SetInternalFieldCount(2); nodegitContext->SaveToPersistent( "PromiseCompletion::Template", diff --git a/generate/templates/manual/src/wrapper.cc b/generate/templates/manual/src/wrapper.cc index 9daae7848..3bad23c7d 100644 --- a/generate/templates/manual/src/wrapper.cc +++ b/generate/templates/manual/src/wrapper.cc @@ -22,7 +22,7 @@ void Wrapper::InitializeComponent(Local target, nodegit::Context *no Local nodegitExternal = Nan::New(nodegitContext); Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->InstanceTemplate()->SetInternalFieldCount(2); tpl->SetClassName(Nan::New("Wrapper").ToLocalChecked()); Nan::SetPrototypeMethod(tpl, "toBuffer", ToBuffer, nodegitExternal); diff --git a/generate/templates/templates/class_content.cc b/generate/templates/templates/class_content.cc index 275e4f8b0..3dfd71839 100644 --- a/generate/templates/templates/class_content.cc +++ b/generate/templates/templates/class_content.cc @@ -48,7 +48,7 @@ using namespace node; v8::Local nodegitExternal = Nan::New(nodegitContext); v8::Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->InstanceTemplate()->SetInternalFieldCount(2); tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); {% each functions as function %} diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index d5c927af9..e2f01ca58 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -89,7 +89,7 @@ using namespace std; Local nodegitExternal = Nan::New(nodegitContext); Local tpl = Nan::New(JSNewFunction, nodegitExternal); - tpl->InstanceTemplate()->SetInternalFieldCount(1); + tpl->InstanceTemplate()->SetInternalFieldCount(2); tpl->SetClassName(Nan::New("{{ jsClassName }}").ToLocalChecked()); {% each fields as field %} From f700bb696f425258a3b98a3b7a1448326484aae2 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 4 Nov 2022 09:31:52 -0700 Subject: [PATCH 430/545] Bump OpenSSL to 1.1.1s --- utils/acquireOpenSSL.js | 2 +- .../openssl/002-all-fix_test_compilation.patch | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 vendor/patches/openssl/002-all-fix_test_compilation.patch diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index af8e7e7a5..8d774de9c 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -16,7 +16,7 @@ const pipeline = promisify(stream.pipeline); const packageJson = require('../package.json') -const OPENSSL_VERSION = "1.1.1q"; +const OPENSSL_VERSION = "1.1.1s"; const win32BatPath = path.join(__dirname, "build-openssl.bat"); const vendorPath = path.resolve(__dirname, "..", "vendor"); const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); diff --git a/vendor/patches/openssl/002-all-fix_test_compilation.patch b/vendor/patches/openssl/002-all-fix_test_compilation.patch deleted file mode 100644 index 6ce8f0a83..000000000 --- a/vendor/patches/openssl/002-all-fix_test_compilation.patch +++ /dev/null @@ -1,14 +0,0 @@ -openssl 1.1.1q has a problem where a `memcmp` call is not declared before its -usage in a test file. due to this, MacOS is not able to compile the test for -1.1.1q without screwing around with compiler flags. this patch introduces the -`memcmp` declaration ---- test/v3ext.c -+++ test/v3ext.c -@@ -8,6 +8,7 @@ - */ - - #include -+#include - #include - #include - #include From 464e11e4413fd2348d1dc198f24fc54d754baf88 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 4 Nov 2022 09:32:38 -0700 Subject: [PATCH 431/545] Create OpenSSL .sha256 file --- utils/acquireOpenSSL.js | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 8d774de9c..6bdd303b4 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -30,9 +30,9 @@ const getOpenSSLSourceUrl = (version) => `https://www.openssl.org/source/openssl const getOpenSSLSourceSha256Url = (version) => `${getOpenSSLSourceUrl(version)}.sha256`; class HashVerify extends stream.Transform { - constructor(algorithm, expected) { + constructor(algorithm, onFinal) { super(); - this.expected = expected; + this.onFinal = onFinal; this.hash = crypto.createHash(algorithm); } @@ -43,11 +43,18 @@ class HashVerify extends stream.Transform { _final(callback) { const digest = this.hash.digest("hex"); - const digestOk = digest === this.expected; - callback(digestOk ? null : new Error(`Digest not OK: ${digest} !== ${this.expected}`)); + const onFinalResult = this.onFinal(digest); + callback(onFinalResult); } } +const makeHashVerifyOnFinal = (expected) => (digest) => { + const digestOk = digest === expected; + return digestOk + ? null + : new Error(`Digest not OK: ${digest} !== ${this.expected}`); +}; + // currently this only needs to be done on linux const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { try { @@ -261,7 +268,7 @@ const buildOpenSSLIfNecessary = async ({ await pipeline( downloadStream, - new HashVerify("sha256", openSSLSha256), + new HashVerify("sha256", makeHashVerifyOnFinal(openSSLSha256)), zlib.createGunzip(), tar.extract(extractPath) ); @@ -305,7 +312,9 @@ const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) = const pipelineSteps = [ downloadStream, - maybeDownloadSha256 ? new HashVerify("sha256", maybeDownloadSha256) : null, + maybeDownloadSha256 + ? new HashVerify("sha256", makeHashVerifyOnFinal(maybeDownloadSha256)) + : null, zlib.createGunzip(), tar.extract(extractPath) ].filter(step => step !== null); @@ -331,6 +340,11 @@ const getOpenSSLPackageName = () => { const getOpenSSLPackageUrl = () => `${packageJson.binary.host}${getOpenSSLPackageName()}`; const buildPackage = async () => { + let resolve, reject; + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }); await pipeline( tar.pack(extractPath, { entries: pathsToIncludeForPackage, @@ -343,8 +357,13 @@ const buildPackage = async () => { fmode: 0644 }), zlib.createGzip(), + new HashVerify("sha256", (digest) => { + resolve(digest); + }), fsNonPromise.createWriteStream(getOpenSSLPackageName()) ); + const digest = await promise; + await fs.writeFile(`${getOpenSSLPackageName()}.sha256`, digest); }; const acquireOpenSSL = async () => { From 2b4483e39f6df1a19a1d8de7d92ff46bc6c3cd0a Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 4 Nov 2022 13:33:42 -0700 Subject: [PATCH 432/545] Only download OpenSSL sha256 if necessary --- utils/acquireOpenSSL.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 6bdd303b4..c79311b11 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -290,7 +290,11 @@ const buildOpenSSLIfNecessary = async ({ console.log("Build finished."); } -const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) => { +const downloadOpenSSLIfNecessary = async ({ + downloadBinUrl, + maybeDownloadSha256, + maybeDownloadSha256Url +}) => { if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== "linux") { console.log(`Skipping OpenSSL download, not required on ${process.platform}`); return; @@ -306,6 +310,10 @@ const downloadOpenSSLIfNecessary = async (downloadBinUrl, maybeDownloadSha256) = console.log("Skipping OpenSSL download, dir exists"); return; } catch {} + + if (maybeDownloadSha256Url) { + maybeDownloadSha256 = (await got(maybeDownloadSha256Url)).body.trim(); + } const downloadStream = got.stream(downloadBinUrl); downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); @@ -370,16 +378,16 @@ const acquireOpenSSL = async () => { try { const downloadBinUrl = process.env.npm_config_openssl_bin_url || getOpenSSLPackageUrl(); if (downloadBinUrl !== 'skip' && !process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { - let maybeDownloadSha256; + const downloadOptions = { downloadBinUrl }; if (process.env.npm_config_openssl_bin_sha256 !== 'skip') { if (process.env.npm_config_openssl_bin_sha256) { - maybeDownloadSha256 = process.env.npm_config_openssl_bin_sha256; + downloadOptions.maybeDownloadSha256 = process.env.npm_config_openssl_bin_sha256; } else { - maybeDownloadSha256 = (await got(`${getOpenSSLPackageUrl()}.sha256`)).body.trim(); + downloadOptions.maybeDownloadSha256Url = `${getOpenSSLPackageUrl()}.sha256`; } } - await downloadOpenSSLIfNecessary(downloadBinUrl, maybeDownloadSha256); + await downloadOpenSSLIfNecessary(downloadOptions); return; } From 75404d30d4ec97ce7ca2419a1250cbea7cd8edfb Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 4 Nov 2022 13:45:28 -0700 Subject: [PATCH 433/545] Don't auto-download OpenSSL on Linux --- utils/acquireOpenSSL.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index c79311b11..6f8280ca2 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -376,8 +376,9 @@ const buildPackage = async () => { const acquireOpenSSL = async () => { try { - const downloadBinUrl = process.env.npm_config_openssl_bin_url || getOpenSSLPackageUrl(); - if (downloadBinUrl !== 'skip' && !process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { + const downloadBinUrl = process.env.npm_config_openssl_bin_url + || (['win32', 'darwin'].includes(process.platform) ? getOpenSSLPackageUrl() : undefined); + if (downloadBinUrl && downloadBinUrl !== 'skip' && !process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { const downloadOptions = { downloadBinUrl }; if (process.env.npm_config_openssl_bin_sha256 !== 'skip') { if (process.env.npm_config_openssl_bin_sha256) { From 9da0cdbd6f2f71906086e362419c51fdb1737513 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 4 Nov 2022 13:49:41 -0700 Subject: [PATCH 434/545] Allow overriding C++ standard Electron 20+ requires C++17 but older node versions only require C++14 --- generate/templates/templates/binding.gyp | 16 ++++++++++++---- utils/defaultCxxStandard.js | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 utils/defaultCxxStandard.js diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 668a3e753..6b6bac6f9 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -1,9 +1,14 @@ { "variables": { + "variables": { + "target%": "none", + }, "is_electron%": "= 20; +} else { + // Node 18 === 108 + isNode18OrElectron20AndUp = Number.parseInt(process.versions.modules) >= 108; +} + +const defaultCxxStandard = isNode18OrElectron20AndUp + ? '17' + : '14'; + +process.stdout.write(defaultCxxStandard); From a1e954e3a2c4ef9af1a6d788f54d173ec7bfddc2 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 7 Nov 2022 16:37:31 -0700 Subject: [PATCH 435/545] Bump to v0.28.0-alpha.19 --- CHANGELOG.md | 22 ++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54e01a704..e7868307a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Change Log +## v0.28.0-alpha.19 [(2022-11-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.19) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.18...v0.28.0-alpha.19) + +#### Summary of changes +- OpenSSL bump +- OpenSSL binaries will be automatically downloaded when building for Electron on Windows and macOS +- Crash fix on Electron 18+ due to Nan bug +- Partial stash support + +#### Merged PRs into NodeGit +- [Allow overriding C++ standard](https://github.com/nodegit/nodegit/pull/1953) +- [Bump OpenSSL to 1.1.1s](https://github.com/nodegit/nodegit/pull/1952) +- [Fix intermittent crash on Electron 18+](https://github.com/nodegit/nodegit/pull/1951) +- [type is a call](https://github.com/nodegit/nodegit/pull/1942) +- [Fix leak in agent](https://github.com/nodegit/nodegit/pull/1947) +- [Default to using precompiled OpenSSL for Electron](https://github.com/nodegit/nodegit/pull/1949) +- [Partial stash support](https://github.com/nodegit/nodegit/pull/1948) +- [Switch CI to macOS-11](https://github.com/nodegit/nodegit/pull/1950) +- [Preemptively Patch OpenSSL 1.1.1q](https://github.com/nodegit/nodegit/pull/1928) +- [Add getAllFilepaths function in tree object](https://github.com/nodegit/nodegit/pull/1919) + ## v0.28.0-alpha.18 [(2022-05-27)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.18) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.17...v0.28.0-alpha.18) diff --git a/package-lock.json b/package-lock.json index 953c0487f..d1aefdd49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.18", + "version": "0.28.0-alpha.19", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.18", + "version": "0.28.0-alpha.19", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index dc95ec4da..febd73793 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.18", + "version": "0.28.0-alpha.19", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From bb33c59beeffc4e101ebafdcc9ab5b3b6c6555c0 Mon Sep 17 00:00:00 2001 From: Julian Mesa Date: Tue, 8 Nov 2022 19:48:22 +0100 Subject: [PATCH 436/545] Update createWithSignature function using async/await Added a test to verify deprecation warning --- lib/tag.js | 86 +++++++++++++++-------------------------------- test/tests/tag.js | 36 ++++++++++++++++++++ 2 files changed, 64 insertions(+), 58 deletions(-) diff --git a/lib/tag.js b/lib/tag.js index d5f96d4e5..aae20c930 100644 --- a/lib/tag.js +++ b/lib/tag.js @@ -66,7 +66,7 @@ const deprecatedCreateWithSignatureHelper = util.deprecate(function(repo, oidTar * representing the signed message * @return {Oid} */ -Tag.createWithSignature = function( +Tag.createWithSignature = async ( repo, tagName, target, @@ -74,69 +74,39 @@ Tag.createWithSignature = function( message, force, signingCallback -) { - - const createTag = function(repo, - tagName, - target, - tagger, - message, - force, - signingCallback) { - let tagBuffer; - - return Tag.createBuffer(repo, tagName, target.id(), tagger, message) - .then((tagBufferResult) => { - tagBuffer = tagBufferResult; - return signingCallback(tagBuffer); - }) - .then(({ code, signedData }) => { - switch (code) { - case NodeGit.Error.CODE.OK: { - const normalizedEnding = signedData.endsWith("\n") ? "" : "\n"; - const signedTagString = tagBuffer + signedData + normalizedEnding; - return Tag.createFromBuffer(repo, signedTagString, force); - } - case NodeGit.Error.CODE.PASSTHROUGH: - return Tag.create( - repo, - tagName, - target, - tagger, - message, - force - ); - default: { - const error = new Error( - `Tag.createWithSignature threw with error code ${code}` - ); - error.errno = code; - throw error; - } - } - }); - }; - +) => { + let targetOid; if (!target.id) { - deprecatedCreateWithSignatureHelper(repo, target).then((targetOid) => { - return createTag(repo, + targetOid = await deprecatedCreateWithSignatureHelper(repo, target); + } else { + targetOid = target; + } + + const tagBuffer = await Tag.createBuffer(repo, tagName, targetOid.id(), tagger, message); + const { code, signedData } = await signingCallback(tagBuffer); + switch (code) { + case NodeGit.Error.CODE.OK: { + const normalizedEnding = signedData.endsWith("\n") ? "" : "\n"; + const signedTagString = tagBuffer + signedData + normalizedEnding; + return Tag.createFromBuffer(repo, signedTagString, force); + } + case NodeGit.Error.CODE.PASSTHROUGH: + return Tag.create( + repo, tagName, targetOid, tagger, message, - force, - signingCallback); - }); - } else { - return createTag(repo, - tagName, - target, - tagger, - message, - force, - signingCallback); + force + ); + default: { + const error = new Error( + `Tag.createWithSignature threw with error code ${code}` + ); + error.errno = code; + throw error; + } } - }; /** diff --git a/test/tests/tag.js b/test/tests/tag.js index 62a6c78eb..21acdcc1b 100644 --- a/test/tests/tag.js +++ b/test/tests/tag.js @@ -591,6 +591,42 @@ describe("Tag", function() { }); }); + it("will show a deprecation warning if createWithSignature use oid instead object", function() { + var targetCommit; + const name = "created-signed-tag-annotationCreate"; + const repository = this.repository; + const signature = Signature.create( + "Shaggy Rogers", + "shaggy@mystery.com", + 987654321, + 90 + ); + const message = "I'm a teapot"; + const signingCallback = () => ({ + code: NodeGit.Error.CODE.ERROR + }); + + + return repository.getCommit(commitPointedTo).then((commit) => { + targetCommit = commit; + return Tag.createWithSignature( + repository, + name, + targetCommit.id(), + signature, + message, + 1, + signingCallback + ); + }).then(function() { + assert.fail("Should not have been able to create tag"); + }, function(error) { + if (error && error.errno === NodeGit.Error.CODE.ERROR) { + return; + } + throw error; + }); + }); it("can create a new signed tag with Tag.annotationCreate", function() { var targetCommit; From 2da1f9d66e356f6ffb96ac003cb42f9faef16964 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 9 Nov 2022 13:07:09 -0700 Subject: [PATCH 437/545] hopefully fix build issues --- generate/templates/templates/binding.gyp | 4 +- lifecycleScripts/postinstall.js | 2 +- package-lock.json | 451 ++++++++++++++--------- package.json | 2 +- 4 files changed, 277 insertions(+), 182 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 6b6bac6f9..771eca54f 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -9,7 +9,9 @@ "electron_openssl_static%": "=16.0.0" } }, "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/move-file/node_modules/mkdirp": { @@ -121,11 +125,11 @@ } }, "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/@types/cacheable-request": { @@ -451,52 +455,78 @@ } }, "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/cacache/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cacache/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -1093,7 +1123,7 @@ "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "engines": { "node": ">= 0.6" } @@ -1829,11 +1859,11 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dependencies": { - "@tootallnate/once": "1", + "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, @@ -1871,7 +1901,7 @@ "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dependencies": { "ms": "^2.0.0" } @@ -1896,7 +1926,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } @@ -1944,9 +1974,9 @@ } }, "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "node_modules/is-absolute": { "version": "1.0.0", @@ -1999,7 +2029,7 @@ "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" }, "node_modules/is-negated-glob": { "version": "1.0.0", @@ -2561,29 +2591,37 @@ } }, "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "engines": { + "node": ">=12" } }, "node_modules/mime-db": { @@ -2657,19 +2695,19 @@ } }, "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dependencies": { - "minipass": "^3.1.0", + "minipass": "^3.1.6", "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "minizlib": "^2.1.2" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, "optionalDependencies": { - "encoding": "^0.1.12" + "encoding": "^0.1.13" } }, "node_modules/minipass-flush": { @@ -2883,15 +2921,15 @@ } }, "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", + "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", @@ -2902,7 +2940,7 @@ "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 10.12.0" + "node": "^12.22 || ^14.13 || >=16" } }, "node_modules/node-gyp/node_modules/are-we-there-yet": { @@ -2954,6 +2992,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/node-gyp/node_modules/npmlog": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", @@ -3291,7 +3343,7 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" }, "node_modules/promise-retry": { "version": "2.0.1", @@ -3496,7 +3548,7 @@ "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "engines": { "node": ">= 4" } @@ -3599,11 +3651,11 @@ } }, "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dependencies": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { @@ -3612,13 +3664,13 @@ } }, "node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dependencies": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { "node": ">= 10" @@ -3669,14 +3721,14 @@ } }, "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dependencies": { "minipass": "^3.1.1" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/stream-shift": { @@ -3970,19 +4022,25 @@ } }, "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dependencies": { - "unique-slug": "^2.0.0" + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dependencies": { "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/unique-stream": { @@ -4376,18 +4434,18 @@ } }, "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "requires": { - "@gar/promisify": "^1.0.1", + "@gar/promisify": "^1.1.3", "semver": "^7.3.5" } }, "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "requires": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -4414,9 +4472,9 @@ } }, "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" }, "@types/cacheable-request": { "version": "6.0.2", @@ -4678,41 +4736,61 @@ "dev": true }, "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "requires": { + "brace-expansion": "^2.0.1" } }, "mkdirp": { @@ -5202,7 +5280,7 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" }, "detect-libc": { "version": "1.0.3", @@ -5788,11 +5866,11 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "requires": { - "@tootallnate/once": "1", + "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } @@ -5820,7 +5898,7 @@ "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "requires": { "ms": "^2.0.0" } @@ -5842,7 +5920,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "indent-string": { "version": "4.0.0", @@ -5881,9 +5959,9 @@ "dev": true }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "is-absolute": { "version": "1.0.0", @@ -5924,7 +6002,7 @@ "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" }, "is-negated-glob": { "version": "1.0.0", @@ -6394,26 +6472,33 @@ } }, "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + } } }, "mime-db": { @@ -6466,14 +6551,14 @@ } }, "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", + "encoding": "^0.1.13", + "minipass": "^3.1.6", "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "minizlib": "^2.1.2" } }, "minipass-flush": { @@ -6637,15 +6722,15 @@ } }, "node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", + "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", @@ -6690,6 +6775,14 @@ "path-is-absolute": "^1.0.0" } }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "requires": { + "abbrev": "^1.0.0" + } + }, "npmlog": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", @@ -6950,7 +7043,7 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" }, "promise-retry": { "version": "2.0.1", @@ -7125,7 +7218,7 @@ "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" }, "rimraf": { "version": "3.0.2", @@ -7191,22 +7284,22 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "requires": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "requires": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" } }, "source-map": { @@ -7243,9 +7336,9 @@ } }, "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "requires": { "minipass": "^3.1.1" } @@ -7487,17 +7580,17 @@ "dev": true }, "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "^3.0.0" } }, "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "requires": { "imurmurhash": "^0.1.4" } diff --git a/package.json b/package.json index febd73793..a864ba4db 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "got": "^10.7.0", "json5": "^2.1.0", "lodash": "^4.17.14", - "node-gyp": "^8.4.1", + "node-gyp": "^9.3.0", "ramda": "^0.25.0", "tar-fs": "^2.1.1" }, From e2ed24d315e45ac9c2c40c2887887b3cd3e3a14d Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 11 Nov 2022 09:31:28 -0700 Subject: [PATCH 438/545] Bump to v0.28.0-alpha.20 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7868307a..5ccf66019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.20 [(2022-11-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.20) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.19...v0.28.0-alpha.20) + +#### Summary of changes +- Fix electron build issues + +#### Merged PRs into NodeGit +- [Fix electron build issues](https://github.com/nodegit/nodegit/pull/1955) + ## v0.28.0-alpha.19 [(2022-11-08)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.19) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.18...v0.28.0-alpha.19) diff --git a/package-lock.json b/package-lock.json index b37f4a427..a385694c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.19", + "version": "0.28.0-alpha.20", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.19", + "version": "0.28.0-alpha.20", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a864ba4db..9aa2cf256 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.19", + "version": "0.28.0-alpha.20", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 2ee24ccc81cb8299c8e940cd7003ddd2ea19cba5 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 2 Feb 2023 15:16:02 -0700 Subject: [PATCH 439/545] Update got to 11.x --- package-lock.json | 263 ++++++++++++++++++---------------------------- package.json | 2 +- 2 files changed, 103 insertions(+), 162 deletions(-) diff --git a/package-lock.json b/package-lock.json index a385694c8..e2b52e7d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@axosoft/nan": "^2.18.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", - "got": "^10.7.0", + "got": "^11.8.6", "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^9.3.0", @@ -103,9 +103,9 @@ } }, "node_modules/@sindresorhus/is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", - "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, @@ -539,15 +539,11 @@ } }, "node_modules/cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "dependencies": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - }, + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "engines": { - "node": ">=10" + "node": ">=10.6.0" } }, "node_modules/cacheable-request": { @@ -1070,14 +1066,17 @@ } }, "node_modules/decompress-response": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { - "mimic-response": "^2.0.0" + "mimic-response": "^3.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/deep-is": { @@ -1203,11 +1202,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -1693,28 +1687,24 @@ } }, "node_modules/got": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", - "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { - "@sindresorhus/is": "^2.0.0", - "@szmarczak/http-timer": "^4.0.0", + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", - "cacheable-lookup": "^2.0.0", - "cacheable-request": "^7.0.1", - "decompress-response": "^5.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^5.0.0", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", - "mimic-response": "^2.1.0", "p-cancelable": "^2.0.0", - "p-event": "^4.0.0", - "responselike": "^2.0.0", - "to-readable-stream": "^2.0.0", - "type-fest": "^0.10.0" + "responselike": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=10.19.0" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" @@ -1886,6 +1876,18 @@ "npm": ">=1.3.7" } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -2646,11 +2648,11 @@ } }, "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3243,28 +3245,6 @@ "node": ">=8" } }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } - }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -3279,17 +3259,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -3427,6 +3396,17 @@ "node": ">=0.4.x" } }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ramda": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", @@ -3525,6 +3505,11 @@ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "node_modules/resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -3914,14 +3899,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-readable-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", - "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", - "engines": { - "node": ">=8" - } - }, "node_modules/to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", @@ -3988,17 +3965,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", - "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/uglify-js": { "version": "3.15.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", @@ -4459,9 +4425,9 @@ } }, "@sindresorhus/is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", - "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, "@szmarczak/http-timer": { "version": "4.0.6", @@ -4801,13 +4767,9 @@ } }, "cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "requires": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { "version": "7.0.2", @@ -5239,11 +5201,11 @@ "dev": true }, "decompress-response": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "requires": { - "mimic-response": "^2.0.0" + "mimic-response": "^3.1.0" } }, "deep-is": { @@ -5330,11 +5292,6 @@ "domhandler": "^4.2.0" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -5747,25 +5704,21 @@ } }, "got": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", - "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "requires": { - "@sindresorhus/is": "^2.0.0", - "@szmarczak/http-timer": "^4.0.0", + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", - "cacheable-lookup": "^2.0.0", - "cacheable-request": "^7.0.1", - "decompress-response": "^5.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^5.0.0", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", - "mimic-response": "^2.1.0", "p-cancelable": "^2.0.0", - "p-event": "^4.0.0", - "responselike": "^2.0.0", - "to-readable-stream": "^2.0.0", - "type-fest": "^0.10.0" + "responselike": "^2.0.0" } }, "graceful-fs": { @@ -5886,6 +5839,15 @@ "sshpk": "^1.7.0" } }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -6517,9 +6479,9 @@ } }, "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" }, "minimatch": { "version": "3.1.2", @@ -6967,19 +6929,6 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "requires": { - "p-timeout": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -6988,14 +6937,6 @@ "aggregate-error": "^3.0.0" } }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" - } - }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -7116,6 +7057,11 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, "ramda": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", @@ -7198,6 +7144,11 @@ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -7502,11 +7453,6 @@ "is-negated-glob": "^1.0.0" } }, - "to-readable-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", - "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==" - }, "to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", @@ -7561,11 +7507,6 @@ "prelude-ls": "~1.1.2" } }, - "type-fest": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", - "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==" - }, "uglify-js": { "version": "3.15.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", diff --git a/package.json b/package.json index 9aa2cf256..2f278c24c 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@axosoft/nan": "^2.18.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", - "got": "^10.7.0", + "got": "^11.8.6", "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^9.3.0", From c55355cde1e598dca09c64f125046b01989aa3cd Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 2 Feb 2023 15:16:09 -0700 Subject: [PATCH 440/545] npm audit fix --- package-lock.json | 300 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 259 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2b52e7d8..b8142ea69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -244,6 +244,21 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -893,6 +908,24 @@ "node": ">=0.10.0" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -1298,6 +1331,15 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1552,6 +1594,15 @@ "node": ">=10" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -1608,7 +1659,7 @@ "node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "dependencies": { "is-glob": "^3.1.0", @@ -1618,7 +1669,7 @@ "node_modules/glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", "dev": true, "dependencies": { "extend": "^3.0.0", @@ -1844,9 +1895,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-proxy-agent": { "version": "5.0.0", @@ -2379,12 +2430,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -2496,20 +2544,76 @@ } }, "node_modules/lcov-result-merger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.1.0.tgz", - "integrity": "sha512-vGXaMNGZRr4cYvW+xMVg+rg7qd5DX9SbGXl+0S3k85+gRZVK4K7UvxPWzKb/qiMwe+4bx3EOrW2o4mbdb1WnsA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.3.0.tgz", + "integrity": "sha512-Krg9p24jGaIT93RBMA8b5qLHDEiAXTavaTiEdMAZaJS93PsBKIcg/89cw/8rgeSfRuQX+I9x7h73SHFjCZ6cHg==", "dev": true, "dependencies": { "through2": "^2.0.3", "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.2" + "vinyl-fs": "^3.0.2", + "yargs": "^16.2.0" }, "bin": { "lcov-result-merger": "bin/lcov-result-merger.js" }, "engines": { - "node": ">=4" + "node": ">=10" + } + }, + "node_modules/lcov-result-merger/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/lcov-result-merger/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lcov-result-merger/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lcov-result-merger/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, "node_modules/lead": { @@ -2670,9 +2774,13 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { "version": "3.1.6", @@ -2850,13 +2958,13 @@ "node_modules/mocha/node_modules/minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", "dev": true }, "node_modules/mocha/node_modules/mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", "dev": true, "dependencies": { @@ -3499,6 +3607,15 @@ "node": ">= 6" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -4370,6 +4487,15 @@ "window-size": "^0.1.2", "y18n": "^3.2.0" } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } } }, "dependencies": { @@ -4535,6 +4661,15 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -5061,6 +5196,21 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -5384,6 +5534,12 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -5588,6 +5744,12 @@ "wide-align": "^1.1.2" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -5632,7 +5794,7 @@ "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -5642,7 +5804,7 @@ "glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", "dev": true, "requires": { "extend": "^3.0.0", @@ -5814,9 +5976,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-proxy-agent": { "version": "5.0.0", @@ -6264,12 +6426,9 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "4.0.0", @@ -6365,14 +6524,60 @@ "dev": true }, "lcov-result-merger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.1.0.tgz", - "integrity": "sha512-vGXaMNGZRr4cYvW+xMVg+rg7qd5DX9SbGXl+0S3k85+gRZVK4K7UvxPWzKb/qiMwe+4bx3EOrW2o4mbdb1WnsA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.3.0.tgz", + "integrity": "sha512-Krg9p24jGaIT93RBMA8b5qLHDEiAXTavaTiEdMAZaJS93PsBKIcg/89cw/8rgeSfRuQX+I9x7h73SHFjCZ6cHg==", "dev": true, "requires": { "through2": "^2.0.3", "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.2" + "vinyl-fs": "^3.0.2", + "yargs": "^16.2.0" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } } }, "lead": { @@ -6492,9 +6697,10 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true }, "minipass": { "version": "3.1.6", @@ -6630,13 +6836,13 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", "dev": true, "requires": { "minimist": "0.0.8" @@ -7138,6 +7344,12 @@ "uuid": "^3.3.2" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -7848,6 +8060,12 @@ "window-size": "^0.1.2", "y18n": "^3.2.0" } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true } } } From 10130b696e65af9e26a79ee43222aca6cf383905 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 7 Feb 2023 14:11:17 -0700 Subject: [PATCH 441/545] Bump OpenSSL to 1.1.1t --- utils/acquireOpenSSL.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.js b/utils/acquireOpenSSL.js index 6f8280ca2..4e639ecf1 100644 --- a/utils/acquireOpenSSL.js +++ b/utils/acquireOpenSSL.js @@ -16,7 +16,7 @@ const pipeline = promisify(stream.pipeline); const packageJson = require('../package.json') -const OPENSSL_VERSION = "1.1.1s"; +const OPENSSL_VERSION = "1.1.1t"; const win32BatPath = path.join(__dirname, "build-openssl.bat"); const vendorPath = path.resolve(__dirname, "..", "vendor"); const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); From 7f42bf0dfb5e120bb63a3f5df2c95783df59ad18 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 10 Feb 2023 09:47:00 -0700 Subject: [PATCH 442/545] Bump macOS runner to macOS 12 Odd test failures with 11 --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9e88bb565..c8838843d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -97,7 +97,7 @@ jobs: strategy: matrix: node: [12, 14, 16] - runs-on: macOS-11 + runs-on: macOS-12 # This is mostly the same as the Linux steps, waiting for anchor support # https://github.com/actions/runner/issues/1182 steps: From 6ce1ebfe07f4f59b6aebacc127eff1b7cc9a7424 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 10 Feb 2023 11:19:54 -0700 Subject: [PATCH 443/545] Bump to v0.28.0-alpha.21 --- CHANGELOG.md | 14 ++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ccf66019..4b8afd361 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## v0.28.0-alpha.21 [(2023-02-10)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.21) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.20...v0.28.0-alpha.21) + +#### Summary of changes +- Update OpenSSL to 1.1.1t +- Update got + other packages with security vulnerabilities +- Fix tag.createWithSignature function definition + +#### Merged PRs into NodeGit +- [Bump OpenSSL to 1.1.1t](https://github.com/nodegit/nodegit/pull/1971) +- [Update got + other locked package versions](https://github.com/nodegit/nodegit/pull/1969) +- [Fix tag createWithSignature function](https://github.com/nodegit/nodegit/pull/1945) + ## v0.28.0-alpha.20 [(2022-11-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.20) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.19...v0.28.0-alpha.20) diff --git a/package-lock.json b/package-lock.json index b8142ea69..381b66297 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.20", + "version": "0.28.0-alpha.21", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.20", + "version": "0.28.0-alpha.21", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 2f278c24c..d5ebfe0f0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.20", + "version": "0.28.0-alpha.21", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 80669d6a696e52058cebff3c9b8288141b5f8008 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 29 Jan 2024 10:08:48 -0700 Subject: [PATCH 444/545] Bump node-gyp to 10.0.1 node-gyp < 10 doesn't support Python 3.12+ --- package-lock.json | 1411 ++++++++++++++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 957 insertions(+), 456 deletions(-) diff --git a/package-lock.json b/package-lock.json index 381b66297..5ed5d49ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "got": "^11.8.6", "json5": "^2.1.0", "lodash": "^4.17.14", - "node-gyp": "^9.3.0", + "node-gyp": "^10.0.1", "ramda": "^0.25.0", "tar-fs": "^2.1.1" }, @@ -42,10 +42,94 @@ "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.1.tgz", "integrity": "sha512-rBLCaXNfzbM/XakZhvuambkKatlFBHVtAgiMKV/YmNZvcBKWocNGJSyXiDPUDHJ7fCTVgEe1h66vfzdE4vBJTQ==" }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.8", @@ -66,40 +150,70 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "node_modules/@npmcli/agent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", + "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "debug": "^4.3.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 14" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">=10" + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" } }, "node_modules/@sindresorhus/is": { @@ -124,14 +238,6 @@ "node": ">=10" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, "node_modules/@types/cacheable-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", @@ -185,19 +291,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -248,7 +341,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -470,31 +562,25 @@ } }, "node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "unique-filename": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/brace-expansion": { @@ -505,52 +591,66 @@ "balanced-match": "^1.0.0" } }, + "node_modules/cacache/node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/cacache/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" } }, "node_modules/cacheable-lookup": { @@ -912,7 +1012,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -923,8 +1022,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-support": { "version": "1.1.3", @@ -1027,6 +1125,33 @@ "node": ">=6" } }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/css-select": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", @@ -1152,14 +1277,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -1277,6 +1394,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1420,6 +1542,11 @@ "node": ">= 0.8.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1499,6 +1626,32 @@ "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", "dev": true }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1900,16 +2053,26 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/http-signature": { @@ -1951,14 +2114,6 @@ "node": ">= 6" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -1992,11 +2147,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2202,6 +2352,23 @@ "nopt": "bin/nopt.js" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", @@ -2697,37 +2864,32 @@ } }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mime-db": { @@ -2794,32 +2956,48 @@ } }, "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dependencies": { - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -3031,117 +3209,121 @@ } }, "node_modules/node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", "dependencies": { "env-paths": "^2.2.0", - "glob": "^7.1.4", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", - "which": "^2.0.2" + "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, + "node_modules/node-gyp/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", - "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "balanced-match": "^1.0.0" } }, "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { - "abbrev": "^1.0.0" + "brace-expansion": "^2.0.1" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": ">=16 || 14 >=14.17" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "node_modules/node-gyp/node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/nopt": { @@ -3396,6 +3578,45 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -3411,17 +3632,20 @@ "node": ">= 0.8.0" } }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -3738,6 +3962,25 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -3766,16 +4009,27 @@ } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/source-map": { @@ -3823,14 +4077,22 @@ } }, "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dependencies": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/stream-shift": { @@ -3847,7 +4109,21 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string-width": { + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -3871,6 +4147,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -4105,25 +4393,25 @@ } }, "node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dependencies": { - "unique-slug": "^3.0.0" + "unique-slug": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-stream": { @@ -4383,6 +4671,23 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -4504,10 +4809,63 @@ "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.1.tgz", "integrity": "sha512-rBLCaXNfzbM/XakZhvuambkKatlFBHVtAgiMKV/YmNZvcBKWocNGJSyXiDPUDHJ7fCTVgEe1h66vfzdE4vBJTQ==" }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } }, "@mapbox/node-pre-gyp": { "version": "1.0.8", @@ -4525,31 +4883,56 @@ "tar": "^6.1.11" } }, - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "@npmcli/agent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", + "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" }, "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, + "lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" } } }, + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "requires": { + "semver": "^7.3.5" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -4563,11 +4946,6 @@ "defer-to-connect": "^2.0.0" } }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" - }, "@types/cacheable-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", @@ -4618,16 +4996,6 @@ "debug": "4" } }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -4665,7 +5033,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -4837,28 +5204,22 @@ "dev": true }, "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "unique-filename": "^3.0.0" }, "dependencies": { "brace-expansion": { @@ -4869,35 +5230,43 @@ "balanced-match": "^1.0.0" } }, + "fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "requires": { + "minipass": "^7.0.3" + } + }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "requires": { "brace-expansion": "^2.0.1" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" } } }, @@ -5200,7 +5569,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -5208,8 +5576,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-support": { "version": "1.1.3", @@ -5302,6 +5669,26 @@ "request": "^2.88.2" } }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "css-select": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", @@ -5389,11 +5776,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -5486,6 +5868,11 @@ } } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -5589,6 +5976,11 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5667,6 +6059,22 @@ "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", "dev": true }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -5981,13 +6389,22 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "dependencies": { + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + } } }, "http-signature": { @@ -6019,14 +6436,6 @@ "debug": "4" } }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "requires": { - "ms": "^2.0.0" - } - }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -6051,11 +6460,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6226,6 +6630,15 @@ } } }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", @@ -6639,32 +7052,27 @@ } }, "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "requires": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^10.0.0" }, "dependencies": { - "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" } } }, @@ -6711,22 +7119,36 @@ } }, "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "requires": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + } } }, "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "requires": { "encoding": "^0.1.13", - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + } } }, "minipass-flush": { @@ -6890,84 +7312,79 @@ } }, "node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", "requires": { "env-paths": "^2.2.0", - "glob": "^7.1.4", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", - "which": "^2.0.2" + "which": "^4.0.0" }, "dependencies": { - "are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } + "abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==" }, - "gauge": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.3.tgz", - "integrity": "sha512-ICw1DhAwMtb22rYFwEHgJcx1JCwJGv3x6G0OQUq56Nge+H4Q8JEwr8iveS0XFlsUNSI67F5ffMGK25bK4Pmskw==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "balanced-match": "^1.0.0" } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "requires": { - "abbrev": "^1.0.0" + "brace-expansion": "^2.0.1" } }, - "npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + }, + "nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" + "abbrev": "^2.0.0" } }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "requires": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" } } } @@ -7169,6 +7586,32 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + } + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -7181,17 +7624,17 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" - }, "promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -7436,6 +7879,19 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -7456,13 +7912,23 @@ } }, "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "dependencies": { + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + } } }, "source-map": { @@ -7499,11 +7965,18 @@ } }, "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "requires": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + } } }, "stream-shift": { @@ -7530,6 +8003,16 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7538,6 +8021,14 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -7733,17 +8224,17 @@ "dev": true }, "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "requires": { - "unique-slug": "^3.0.0" + "unique-slug": "^4.0.0" } }, "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "requires": { "imurmurhash": "^0.1.4" } @@ -8009,6 +8500,16 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index d5ebfe0f0..4dc380551 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "got": "^11.8.6", "json5": "^2.1.0", "lodash": "^4.17.14", - "node-gyp": "^9.3.0", + "node-gyp": "^10.0.1", "ramda": "^0.25.0", "tar-fs": "^2.1.1" }, From bf8e5181f72eed512c69d4347fe7f93c04779521 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 29 Jan 2024 10:19:00 -0700 Subject: [PATCH 445/545] Deprecate Node < 16 EOL, no longer supported by node-gyp --- .github/workflows/tests.yml | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c8838843d..68143985c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,7 @@ jobs: name: "Linux Tests" strategy: matrix: - node: [12, 14, 16] + node: [16] # 18+ requires GLIBC 2.28+ runs-on: ubuntu-latest container: ubuntu:16.04 steps: @@ -96,7 +96,7 @@ jobs: name: "macOS Tests" strategy: matrix: - node: [12, 14, 16] + node: [16, 18, 20] runs-on: macOS-12 # This is mostly the same as the Linux steps, waiting for anchor support # https://github.com/actions/runner/issues/1182 @@ -154,7 +154,7 @@ jobs: name: Windows Tests strategy: matrix: - node: [12, 14, 16] + node: [16, 18, 20] arch: [x86, x64] runs-on: windows-2019 steps: diff --git a/package.json b/package.json index 4dc380551..473b5d4b0 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "lib": "./lib" }, "engines": { - "node": ">= 12.19.0 < 13 || >= 14.10.0" + "node": ">= 16" }, "dependencies": { "@axosoft/nan": "^2.18.0-gk.1", From 0f02eab2a49e64986571f97b8133f428158b285f Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 29 Jan 2024 10:30:06 -0700 Subject: [PATCH 446/545] Use latest actions/setup-* versions Move off of setup-node fork --- .github/workflows/tests.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 68143985c..6d5114d6a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -49,10 +49,12 @@ jobs: git config --global user.name "John Doe" git config --global user.email johndoe@example.com - - uses: actions/checkout@v2 + # v4 requires node 20, which won't run due to GLIBC 2.28+ requirement + - uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v2 + # v4 requires node 20, which won't run due to GLIBC 2.28+ requirement + uses: actions/setup-node@v3 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: @@ -112,10 +114,10 @@ jobs: git config --global user.name "John Doe" git config --global user.email johndoe@example.com - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: @@ -166,16 +168,16 @@ jobs: git config --global user.name "John Doe" git config --global user.email johndoe@example.com - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Use Node.js - uses: implausible/setup-node@feature/expose-architecture-override + uses: actions/setup-node@v4 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} check-latest: true - node-arch: ${{ matrix.arch }} + architecture: ${{ matrix.arch }} - name: Install run: npm install From ec794c68226cafc60b6605274e7e95ea70681de1 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 29 Jan 2024 09:42:26 -0700 Subject: [PATCH 447/545] bump nan --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ed5d49ee..c9c0fd427 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@axosoft/nan": "^2.18.0-gk.1", + "@axosoft/nan": "^2.18.0-gk.2", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", @@ -38,9 +38,9 @@ } }, "node_modules/@axosoft/nan": { - "version": "2.18.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.1.tgz", - "integrity": "sha512-rBLCaXNfzbM/XakZhvuambkKatlFBHVtAgiMKV/YmNZvcBKWocNGJSyXiDPUDHJ7fCTVgEe1h66vfzdE4vBJTQ==" + "version": "2.18.0-gk.2", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.2.tgz", + "integrity": "sha512-R85blIk4tODD/tIQ1nezCs4O6RhWzPqB1Ls79fBEfUtZ9Zgq5s2c5mPGmWiS2+wAXaw2YgRhsBfqLFURH9mcPw==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -4805,9 +4805,9 @@ }, "dependencies": { "@axosoft/nan": { - "version": "2.18.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.1.tgz", - "integrity": "sha512-rBLCaXNfzbM/XakZhvuambkKatlFBHVtAgiMKV/YmNZvcBKWocNGJSyXiDPUDHJ7fCTVgEe1h66vfzdE4vBJTQ==" + "version": "2.18.0-gk.2", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.2.tgz", + "integrity": "sha512-R85blIk4tODD/tIQ1nezCs4O6RhWzPqB1Ls79fBEfUtZ9Zgq5s2c5mPGmWiS2+wAXaw2YgRhsBfqLFURH9mcPw==" }, "@isaacs/cliui": { "version": "8.0.2", diff --git a/package.json b/package.json index 473b5d4b0..ecaa80582 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "node": ">= 16" }, "dependencies": { - "@axosoft/nan": "^2.18.0-gk.1", + "@axosoft/nan": "^2.18.0-gk.2", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", From c829448334186af31157dcac81c4355942739dd2 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 29 Jan 2024 19:17:03 -0700 Subject: [PATCH 448/545] disable flaky test --- test/tests/worker.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/tests/worker.js b/test/tests/worker.js index 5fbfeacee..f39e19e6d 100644 --- a/test/tests/worker.js +++ b/test/tests/worker.js @@ -64,9 +64,10 @@ if (Worker) { }); for (let i = 0; i < 5; ++i) { - it(`can kill worker thread while in use #${i}`, function(done) { // jshint ignore:line + // disabled until we can address flakiness + it.skip(`can kill worker thread while in use #${i}`, function(done) { // jshint ignore:line const workerPath = local("../utils/worker.js"); - const worker = new Worker(workerPath, { + const worker = new Worker(workerPath, { workerData: { clonePath, url: "https://github.com/nodegit/test.git" From 38f05802c0de7c9ae9c1d33ebf21cc507c1f70ec Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 5 Feb 2024 11:00:48 -0700 Subject: [PATCH 449/545] Bump to v0.28.0-alpha.22 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b8afd361..58721e15e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.28.0-alpha.22 [(2024-02-05)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.22) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.21...v0.28.0-alpha.22) + +#### Summary of changes +- Compatibility with Electron 28 + +#### Merged PRs into NodeGit +- [Fix electron 28 build failure](https://github.com/nodegit/nodegit/pull/1988) +- [Bump node-gyp to 10.0.1](https://github.com/nodegit/nodegit/pull/1989) + ## v0.28.0-alpha.21 [(2023-02-10)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.21) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.20...v0.28.0-alpha.21) diff --git a/package-lock.json b/package-lock.json index c9c0fd427..87c97a163 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.21", + "version": "0.28.0-alpha.22", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.21", + "version": "0.28.0-alpha.22", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index ecaa80582..2c5be0627 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.21", + "version": "0.28.0-alpha.22", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From ca65ba373438734a1b0fc75f2d2a340e6deffb3c Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 5 Feb 2024 16:20:53 -0700 Subject: [PATCH 450/545] Clarify supported Node version (Node 16+) --- CHANGELOG.md | 1 + package-lock.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58721e15e..07caa1e75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ #### Summary of changes - Compatibility with Electron 28 +- NodeGit now requires Node 16+ #### Merged PRs into NodeGit - [Fix electron 28 build failure](https://github.com/nodegit/nodegit/pull/1988) diff --git a/package-lock.json b/package-lock.json index 87c97a163..8517e7dc5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "walk": "^2.3.9" }, "engines": { - "node": ">= 12.19.0 < 13 || >= 14.10.0" + "node": ">= 16" } }, "node_modules/@axosoft/nan": { From 9691cf02b0999055112ae23974a0ea642e1a8a9d Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 7 Feb 2024 10:09:03 -0700 Subject: [PATCH 451/545] update libgit2 submodule to 1.7.2 --- generate/input/README.md | 2 +- generate/input/libgit2-docs.json | 81145 +++++++++++++++-------------- vendor/libgit2 | 2 +- vendor/libgit2.gyp | 553 +- 4 files changed, 40956 insertions(+), 40746 deletions(-) diff --git a/generate/input/README.md b/generate/input/README.md index 9ab9b51d6..f0d7573ee 100644 --- a/generate/input/README.md +++ b/generate/input/README.md @@ -8,7 +8,7 @@ Customize the generated code using this configuration file. Enter the function's signature, arguments and their metadata and which functions can be skipped in this file. If you are using a manual template, remove all of its references from this file. #### libgit2-docs.json - These are provided by the libgit2 team. It includes all the metadata about the API provided by the libgit2 library. To grab the latest version of this file, download https://libgit2.github.com/libgit2/HEAD.json. + These are provided by the libgit2 team. It includes all the metadata about the API provided by the libgit2 library. To grab the latest version of this file, download https://libgit2.org/libgit2/HEAD.json. #### libgit2-supplement.json Use this confiuration file to group and override parts of the generated code. NodeGit tries its best to generate the right classes and structs, if it is not quite right, then use this config file to group/remove the functions. diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index aa0f54e35..32160fef8 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -1,40410 +1,40797 @@ { - "files": [ - { - "file": "git2/annotated_commit.h", - "functions": [ - "git_annotated_commit_from_ref", - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_lookup", - "git_annotated_commit_from_revspec", - "git_annotated_commit_id", - "git_annotated_commit_ref", - "git_annotated_commit_free" - ], - "meta": {}, - "lines": 121 - }, - { - "file": "git2/apply.h", - "functions": [ - "git_apply_delta_cb", - "git_apply_hunk_cb", - "git_apply_to_tree", - "git_apply" - ], - "meta": {}, - "lines": 147 - }, - { - "file": "git2/attr.h", - "functions": [ - "git_attr_value", - "git_attr_get", - "git_attr_get_ext", - "git_attr_get_many", - "git_attr_get_many_ext", - "git_attr_foreach_cb", - "git_attr_foreach", - "git_attr_foreach_ext", - "git_attr_cache_flush", - "git_attr_add_macro" - ], - "meta": {}, - "lines": 356 - }, - { - "file": "git2/blame.h", - "functions": [ - "git_blame_options_init", - "git_blame_get_hunk_count", - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline", - "git_blame_file", - "git_blame_buffer", - "git_blame_free" - ], - "meta": {}, - "lines": 277 - }, - { - "file": "git2/blob.h", - "functions": [ - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_blob_free", - "git_blob_id", - "git_blob_owner", - "git_blob_rawcontent", - "git_blob_rawsize", - "git_blob_filter_options_init", - "git_blob_filter", - "git_blob_create_from_workdir", - "git_blob_create_from_disk", - "git_blob_create_from_stream", - "git_blob_create_from_stream_commit", - "git_blob_create_from_buffer", - "git_blob_is_binary", - "git_blob_dup" - ], - "meta": {}, - "lines": 294 - }, - { - "file": "git2/branch.h", - "functions": [ - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_delete", - "git_branch_iterator_new", - "git_branch_next", - "git_branch_iterator_free", - "git_branch_move", - "git_branch_lookup", - "git_branch_name", - "git_branch_upstream", - "git_branch_set_upstream", - "git_branch_upstream_name", - "git_branch_is_head", - "git_branch_is_checked_out", - "git_branch_remote_name", - "git_branch_upstream_remote", - "git_branch_upstream_merge", - "git_branch_name_is_valid" - ], - "meta": {}, - "lines": 330 - }, - { - "file": "git2/buffer.h", - "functions": [ - "git_buf_dispose", - "git_buf_grow", - "git_buf_set", - "git_buf_is_binary", - "git_buf_contains_nul" - ], - "meta": {}, - "lines": 128 - }, - { - "file": "git2/cert.h", - "functions": [ - "git_transport_certificate_check_cb" - ], - "meta": {}, - "lines": 168 - }, - { - "file": "git2/checkout.h", - "functions": [ - "git_checkout_notify_cb", - "git_checkout_progress_cb", - "git_checkout_perfdata_cb", - "git_checkout_options_init", - "git_checkout_head", - "git_checkout_index", - "git_checkout_tree" - ], - "meta": {}, - "lines": 410 - }, - { - "file": "git2/cherrypick.h", - "functions": [ - "git_cherrypick_options_init", - "git_cherrypick_commit", - "git_cherrypick" - ], - "meta": {}, - "lines": 86 - }, - { - "file": "git2/clone.h", - "functions": [ - "git_remote_create_cb", - "git_repository_create_cb", - "git_clone_options_init", - "git_clone" - ], - "meta": {}, - "lines": 205 - }, - { - "file": "git2/commit.h", - "functions": [ - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_commit_free", - "git_commit_id", - "git_commit_owner", - "git_commit_message_encoding", - "git_commit_message", - "git_commit_message_raw", - "git_commit_summary", - "git_commit_body", - "git_commit_time", - "git_commit_time_offset", - "git_commit_committer", - "git_commit_author", - "git_commit_committer_with_mailmap", - "git_commit_author_with_mailmap", - "git_commit_raw_header", - "git_commit_tree", - "git_commit_tree_id", - "git_commit_parentcount", - "git_commit_parent", - "git_commit_parent_id", - "git_commit_nth_gen_ancestor", - "git_commit_header_field", - "git_commit_extract_signature", - "git_commit_create", - "git_commit_create_v", - "git_commit_amend", - "git_commit_create_buffer", - "git_commit_create_with_signature", - "git_commit_dup", - "git_commit_create_cb" - ], - "meta": {}, - "lines": 540 - }, - { - "file": "git2/common.h", - "functions": [ - "git_libgit2_version", - "git_libgit2_features", - "git_libgit2_opts" - ], - "meta": {}, - "lines": 466 - }, - { - "file": "git2/config.h", - "functions": [ - "git_config_entry_free", - "git_config_foreach_cb", - "git_config_find_global", - "git_config_find_xdg", - "git_config_find_system", - "git_config_find_programdata", - "git_config_open_default", - "git_config_new", - "git_config_add_file_ondisk", - "git_config_open_ondisk", - "git_config_open_level", - "git_config_open_global", - "git_config_snapshot", - "git_config_free", - "git_config_get_entry", - "git_config_get_int32", - "git_config_get_int64", - "git_config_get_bool", - "git_config_get_path", - "git_config_get_string", - "git_config_get_string_buf", - "git_config_get_multivar_foreach", - "git_config_multivar_iterator_new", - "git_config_next", - "git_config_iterator_free", - "git_config_set_int32", - "git_config_set_int64", - "git_config_set_bool", - "git_config_set_string", - "git_config_set_multivar", - "git_config_delete_entry", - "git_config_delete_multivar", - "git_config_foreach", - "git_config_iterator_new", - "git_config_iterator_glob_new", - "git_config_foreach_match", - "git_config_get_mapped", - "git_config_lookup_map_value", - "git_config_parse_bool", - "git_config_parse_int32", - "git_config_parse_int64", - "git_config_parse_path", - "git_config_backend_foreach_match", - "git_config_lock" - ], - "meta": {}, - "lines": 762 - }, - { - "file": "git2/credential.h", - "functions": [ - "git_credential_acquire_cb", - "git_credential_free", - "git_credential_has_username", - "git_credential_get_username", - "git_credential_userpass_plaintext_new", - "git_credential_default_new", - "git_credential_username_new", - "git_credential_ssh_key_new", - "git_credential_ssh_key_memory_new", - "git_credential_ssh_interactive_new", - "git_credential_ssh_key_from_agent", - "git_credential_ssh_custom_new" - ], - "meta": {}, - "lines": 310 - }, - { - "file": "git2/credential_helpers.h", - "functions": [ - "git_credential_userpass" - ], - "meta": {}, - "lines": 48 - }, - { - "file": "git2/deprecated.h", - "functions": [ - "git_blob_filtered_content", - "git_filter_list_stream_data", - "git_filter_list_apply_to_data", - "git_treebuilder_write_with_buffer", - "git_buf_grow", - "git_buf_set", - "git_buf_is_binary", - "git_buf_contains_nul", - "git_buf_free", - "git_commit_signing_cb", - "git_diff_format_email", - "git_diff_commit_as_email", - "git_diff_format_email_options_init", - "giterr_last", - "giterr_clear", - "giterr_set_str", - "giterr_set_oom", - "git_object__size", - "git_remote_is_valid_name", - "git_reference_is_valid_name", - "git_oid_iszero", - "git_oidarray_free", - "git_headlist_cb", - "git_strarray_copy", - "git_strarray_free", - "git_blame_init_options" - ], - "meta": {}, - "lines": 897 - }, - { - "file": "git2/describe.h", - "functions": [ - "git_describe_options_init", - "git_describe_format_options_init", - "git_describe_commit", - "git_describe_workdir", - "git_describe_format", - "git_describe_result_free" - ], - "meta": {}, - "lines": 184 - }, - { - "file": "git2/diff.h", - "functions": [ - "git_diff_notify_cb", - "git_diff_progress_cb", - "git_diff_options_init", - "git_diff_file_cb", - "git_diff_binary_cb", - "git_diff_hunk_cb", - "git_diff_line_cb", - "git_diff_find_options_init", - "git_diff_free", - "git_diff_tree_to_tree", - "git_diff_tree_to_index", - "git_diff_index_to_workdir", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_diff_index_to_index", - "git_diff_merge", - "git_diff_find_similar", - "git_diff_num_deltas", - "git_diff_num_deltas_of_type", - "git_diff_get_delta", - "git_diff_is_sorted_icase", - "git_diff_foreach", - "git_diff_status_char", - "git_diff_print", - "git_diff_to_buf", - "git_diff_blobs", - "git_diff_blob_to_buffer", - "git_diff_buffers", - "git_diff_from_buffer", - "git_diff_get_stats", - "git_diff_stats_files_changed", - "git_diff_stats_insertions", - "git_diff_stats_deletions", - "git_diff_stats_to_buf", - "git_diff_stats_free", - "git_diff_patchid_options_init", - "git_diff_patchid" - ], - "meta": {}, - "lines": 1425 - }, - { - "file": "git2/email.h", - "functions": [], - "meta": {}, - "lines": 38 - }, - { - "file": "git2/errors.h", - "functions": [ - "git_error_last", - "git_error_clear", - "git_error_set_str", - "git_error_set_oom" - ], - "meta": {}, - "lines": 161 - }, - { - "file": "git2/filter.h", - "functions": [ - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_contains", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_file", - "git_filter_list_apply_to_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_file", - "git_filter_list_stream_blob", - "git_filter_list_free" - ], - "meta": {}, - "lines": 264 - }, - { - "file": "git2/global.h", - "functions": [ - "git_libgit2_init", - "git_libgit2_shutdown" - ], - "meta": {}, - "lines": 39 - }, - { - "file": "git2/graph.h", - "functions": [ - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any" - ], - "meta": {}, - "lines": 72 - }, - { - "file": "git2/ignore.h", - "functions": [ - "git_ignore_add_rule", - "git_ignore_clear_internal_rules", - "git_ignore_path_is_ignored" - ], - "meta": {}, - "lines": 74 - }, - { - "file": "git2/index.h", - "functions": [ - "git_index_matched_path_cb", - "git_index_open", - "git_index_new", - "git_index_free", - "git_index_owner", - "git_index_caps", - "git_index_set_caps", - "git_index_version", - "git_index_set_version", - "git_index_read", - "git_index_write", - "git_index_path", - "git_index_checksum", - "git_index_read_tree", - "git_index_write_tree", - "git_index_write_tree_to", - "git_index_entrycount", - "git_index_clear", - "git_index_get_byindex", - "git_index_get_bypath", - "git_index_remove", - "git_index_remove_directory", - "git_index_add", - "git_index_entry_stage", - "git_index_entry_is_conflict", - "git_index_iterator_new", - "git_index_iterator_next", - "git_index_iterator_free", - "git_index_add_bypath", - "git_index_add_from_buffer", - "git_index_remove_bypath", - "git_index_add_all", - "git_index_remove_all", - "git_index_update_all", - "git_index_find", - "git_index_find_prefix", - "git_index_conflict_add", - "git_index_conflict_get", - "git_index_conflict_remove", - "git_index_conflict_cleanup", - "git_index_has_conflicts", - "git_index_conflict_iterator_new", - "git_index_conflict_next", - "git_index_conflict_iterator_free" - ], - "meta": {}, - "lines": 829 - }, - { - "file": "git2/indexer.h", - "functions": [ - "git_indexer_progress_cb", - "git_indexer_options_init", - "git_indexer_new", - "git_indexer_append", - "git_indexer_commit", - "git_indexer_hash", - "git_indexer_free" - ], - "meta": {}, - "lines": 143 - }, - { - "file": "git2/mailmap.h", - "functions": [ - "git_mailmap_new", - "git_mailmap_free", - "git_mailmap_add_entry", - "git_mailmap_from_buffer", - "git_mailmap_from_repository", - "git_mailmap_resolve", - "git_mailmap_resolve_signature" - ], - "meta": {}, - "lines": 111 - }, - { - "file": "git2/merge.h", - "functions": [ - "git_merge_file_input_init", - "git_merge_file_options_init", - "git_merge_options_init", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_merge_base", - "git_merge_bases", - "git_merge_base_many", - "git_merge_bases_many", - "git_merge_base_octopus", - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_result_free", - "git_merge_trees", - "git_merge_commits", - "git_merge" - ], - "meta": {}, - "lines": 602 - }, - { - "file": "git2/message.h", - "functions": [ - "git_message_prettify", - "git_message_trailers", - "git_message_trailer_array_free" - ], - "meta": {}, - "lines": 79 - }, - { - "file": "git2/net.h", - "functions": [], - "meta": {}, - "lines": 50 - }, - { - "file": "git2/notes.h", - "functions": [ - "git_note_foreach_cb", - "git_note_iterator_new", - "git_note_commit_iterator_new", - "git_note_iterator_free", - "git_note_next", - "git_note_read", - "git_note_commit_read", - "git_note_author", - "git_note_committer", - "git_note_message", - "git_note_id", - "git_note_create", - "git_note_commit_create", - "git_note_remove", - "git_note_commit_remove", - "git_note_free", - "git_note_default_ref", - "git_note_foreach" - ], - "meta": {}, - "lines": 302 - }, - { - "file": "git2/object.h", - "functions": [ - "git_object_lookup", - "git_object_lookup_prefix", - "git_object_lookup_bypath", - "git_object_id", - "git_object_short_id", - "git_object_type", - "git_object_owner", - "git_object_free", - "git_object_type2string", - "git_object_string2type", - "git_object_typeisloose", - "git_object_peel", - "git_object_dup" - ], - "meta": {}, - "lines": 225 - }, - { - "file": "git2/odb.h", - "functions": [ - "git_odb_foreach_cb", - "git_odb_new", - "git_odb_open", - "git_odb_add_disk_alternate", - "git_odb_free", - "git_odb_read", - "git_odb_read_prefix", - "git_odb_read_header", - "git_odb_exists", - "git_odb_exists_prefix", - "git_odb_expand_ids", - "git_odb_refresh", - "git_odb_foreach", - "git_odb_write", - "git_odb_open_wstream", - "git_odb_stream_write", - "git_odb_stream_finalize_write", - "git_odb_stream_read", - "git_odb_stream_free", - "git_odb_open_rstream", - "git_odb_write_pack", - "git_odb_write_multi_pack_index", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_data", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_add_backend", - "git_odb_add_alternate", - "git_odb_num_backends", - "git_odb_get_backend", - "git_odb_set_commit_graph" - ], - "meta": {}, - "lines": 569 - }, - { - "file": "git2/odb_backend.h", - "functions": [ - "git_odb_backend_pack", - "git_odb_backend_loose", - "git_odb_backend_one_pack" - ], - "meta": {}, - "lines": 131 - }, - { - "file": "git2/oid.h", - "functions": [ - "git_oid_fromstr", - "git_oid_fromstrp", - "git_oid_fromstrn", - "git_oid_fromraw", - "git_oid_fmt", - "git_oid_nfmt", - "git_oid_pathfmt", - "git_oid_tostr_s", - "git_oid_tostr", - "git_oid_cpy", - "git_oid_cmp", - "git_oid_equal", - "git_oid_ncmp", - "git_oid_streq", - "git_oid_strcmp", - "git_oid_is_zero", - "git_oid_shorten_new", - "git_oid_shorten_add", - "git_oid_shorten_free" - ], - "meta": {}, - "lines": 269 - }, - { - "file": "git2/oidarray.h", - "functions": [ - "git_oidarray_dispose" - ], - "meta": {}, - "lines": 31 - }, - { - "file": "git2/pack.h", - "functions": [ - "git_packbuilder_new", - "git_packbuilder_set_threads", - "git_packbuilder_insert", - "git_packbuilder_insert_tree", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_walk", - "git_packbuilder_insert_recur", - "git_packbuilder_write_buf", - "git_packbuilder_write", - "git_packbuilder_hash", - "git_packbuilder_foreach_cb", - "git_packbuilder_foreach", - "git_packbuilder_object_count", - "git_packbuilder_written", - "git_packbuilder_progress", - "git_packbuilder_set_callbacks", - "git_packbuilder_free" - ], - "meta": {}, - "lines": 247 - }, - { - "file": "git2/patch.h", - "functions": [ - "git_patch_owner", - "git_patch_from_diff", - "git_patch_from_blobs", - "git_patch_from_blob_and_buffer", - "git_patch_from_buffers", - "git_patch_free", - "git_patch_get_delta", - "git_patch_num_hunks", - "git_patch_line_stats", - "git_patch_get_hunk", - "git_patch_num_lines_in_hunk", - "git_patch_get_line_in_hunk", - "git_patch_size", - "git_patch_print", - "git_patch_to_buf" - ], - "meta": {}, - "lines": 276 - }, - { - "file": "git2/pathspec.h", - "functions": [ - "git_pathspec_new", - "git_pathspec_free", - "git_pathspec_matches_path", - "git_pathspec_match_workdir", - "git_pathspec_match_index", - "git_pathspec_match_tree", - "git_pathspec_match_diff", - "git_pathspec_match_list_free", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_failed_entry" - ], - "meta": {}, - "lines": 277 - }, - { - "file": "git2/proxy.h", - "functions": [ - "git_proxy_options_init" - ], - "meta": {}, - "lines": 94 - }, - { - "file": "git2/rebase.h", - "functions": [ - "git_rebase_options_init", - "git_rebase_init", - "git_rebase_open", - "git_rebase_orig_head_name", - "git_rebase_orig_head_id", - "git_rebase_onto_name", - "git_rebase_onto_id", - "git_rebase_operation_entrycount", - "git_rebase_operation_current", - "git_rebase_operation_byindex", - "git_rebase_next", - "git_rebase_inmemory_index", - "git_rebase_commit", - "git_rebase_abort", - "git_rebase_finish", - "git_rebase_free" - ], - "meta": {}, - "lines": 387 - }, - { - "file": "git2/refdb.h", - "functions": [ - "git_refdb_new", - "git_refdb_open", - "git_refdb_compress", - "git_refdb_free" - ], - "meta": {}, - "lines": 63 - }, - { - "file": "git2/reflog.h", - "functions": [ - "git_reflog_read", - "git_reflog_write", - "git_reflog_append", - "git_reflog_rename", - "git_reflog_delete", - "git_reflog_entrycount", - "git_reflog_entry_byindex", - "git_reflog_drop", - "git_reflog_entry_id_old", - "git_reflog_entry_id_new", - "git_reflog_entry_committer", - "git_reflog_entry_message", - "git_reflog_free" - ], - "meta": {}, - "lines": 166 - }, - { - "file": "git2/refs.h", - "functions": [ - "git_reference_lookup", - "git_reference_name_to_id", - "git_reference_dwim", - "git_reference_symbolic_create_matching", - "git_reference_symbolic_create", - "git_reference_create", - "git_reference_create_matching", - "git_reference_target", - "git_reference_target_peel", - "git_reference_symbolic_target", - "git_reference_type", - "git_reference_name", - "git_reference_resolve", - "git_reference_owner", - "git_reference_symbolic_set_target", - "git_reference_set_target", - "git_reference_rename", - "git_reference_delete", - "git_reference_remove", - "git_reference_list", - "git_reference_foreach_cb", - "git_reference_foreach_name_cb", - "git_reference_foreach", - "git_reference_foreach_name", - "git_reference_dup", - "git_reference_free", - "git_reference_cmp", - "git_reference_iterator_new", - "git_reference_iterator_glob_new", - "git_reference_next", - "git_reference_next_name", - "git_reference_iterator_free", - "git_reference_foreach_glob", - "git_reference_has_log", - "git_reference_ensure_log", - "git_reference_is_branch", - "git_reference_is_remote", - "git_reference_is_tag", - "git_reference_is_note", - "git_reference_normalize_name", - "git_reference_peel", - "git_reference_name_is_valid", - "git_reference_shorthand" - ], - "meta": {}, - "lines": 767 - }, - { - "file": "git2/refspec.h", - "functions": [ - "git_refspec_parse", - "git_refspec_free", - "git_refspec_src", - "git_refspec_dst", - "git_refspec_string", - "git_refspec_force", - "git_refspec_direction", - "git_refspec_src_matches", - "git_refspec_dst_matches", - "git_refspec_transform", - "git_refspec_rtransform" - ], - "meta": {}, - "lines": 117 - }, - { - "file": "git2/remote.h", - "functions": [ - "git_remote_create", - "git_remote_create_options_init", - "git_remote_create_with_opts", - "git_remote_create_with_fetchspec", - "git_remote_create_anonymous", - "git_remote_create_detached", - "git_remote_lookup", - "git_remote_dup", - "git_remote_owner", - "git_remote_name", - "git_remote_url", - "git_remote_pushurl", - "git_remote_set_url", - "git_remote_set_pushurl", - "git_remote_set_instance_url", - "git_remote_set_instance_pushurl", - "git_remote_add_fetch", - "git_remote_get_fetch_refspecs", - "git_remote_add_push", - "git_remote_get_push_refspecs", - "git_remote_refspec_count", - "git_remote_get_refspec", - "git_remote_connect", - "git_remote_ls", - "git_remote_connected", - "git_remote_stop", - "git_remote_disconnect", - "git_remote_free", - "git_remote_list", - "git_push_transfer_progress_cb", - "git_push_negotiation", - "git_push_update_reference_cb", - "git_url_resolve_cb", - "git_remote_ready_cb", - "git_remote_init_callbacks", - "git_fetch_options_init", - "git_push_options_init", - "git_remote_download", - "git_remote_upload", - "git_remote_update_tips", - "git_remote_fetch", - "git_remote_prune", - "git_remote_push", - "git_remote_stats", - "git_remote_autotag", - "git_remote_set_autotag", - "git_remote_prune_refs", - "git_remote_rename", - "git_remote_name_is_valid", - "git_remote_delete", - "git_remote_default_branch" - ], - "meta": {}, - "lines": 1004 - }, - { - "file": "git2/repository.h", - "functions": [ - "git_repository_open", - "git_repository_open_from_worktree", - "git_repository_wrap_odb", - "git_repository_discover", - "git_repository_open_ext", - "git_repository_open_bare", - "git_repository_free", - "git_repository_init", - "git_repository_init_options_init", - "git_repository_init_ext", - "git_repository_head", - "git_repository_head_for_worktree", - "git_repository_head_detached", - "git_repository_head_detached_for_worktree", - "git_repository_head_unborn", - "git_repository_is_empty", - "git_repository_item_path", - "git_repository_path", - "git_repository_workdir", - "git_repository_commondir", - "git_repository_set_workdir", - "git_repository_is_bare", - "git_repository_is_worktree", - "git_repository_config", - "git_repository_config_snapshot", - "git_repository_odb", - "git_repository_refdb", - "git_repository_index", - "git_repository_message", - "git_repository_message_remove", - "git_repository_state_cleanup", - "git_repository_fetchhead_foreach_cb", - "git_repository_fetchhead_foreach", - "git_repository_mergehead_foreach_cb", - "git_repository_mergehead_foreach", - "git_repository_hashfile", - "git_repository_set_head", - "git_repository_set_head_detached", - "git_repository_set_head_detached_from_annotated", - "git_repository_detach_head", - "git_repository_state", - "git_repository_set_namespace", - "git_repository_get_namespace", - "git_repository_is_shallow", - "git_repository_ident", - "git_repository_set_ident" - ], - "meta": {}, - "lines": 945 - }, - { - "file": "git2/reset.h", - "functions": [ - "git_reset", - "git_reset_from_annotated", - "git_reset_default" - ], - "meta": {}, - "lines": 107 - }, - { - "file": "git2/revert.h", - "functions": [ - "git_revert_options_init", - "git_revert_commit", - "git_revert" - ], - "meta": {}, - "lines": 86 - }, - { - "file": "git2/revparse.h", - "functions": [ - "git_revparse_single", - "git_revparse_ext", - "git_revparse" - ], - "meta": {}, - "lines": 108 - }, - { - "file": "git2/revwalk.h", - "functions": [ - "git_revwalk_new", - "git_revwalk_reset", - "git_revwalk_push", - "git_revwalk_push_glob", - "git_revwalk_push_head", - "git_revwalk_hide", - "git_revwalk_hide_glob", - "git_revwalk_hide_head", - "git_revwalk_push_ref", - "git_revwalk_hide_ref", - "git_revwalk_next", - "git_revwalk_sorting", - "git_revwalk_push_range", - "git_revwalk_simplify_first_parent", - "git_revwalk_free", - "git_revwalk_repository", - "git_revwalk_hide_cb", - "git_revwalk_add_hide_cb" - ], - "meta": {}, - "lines": 295 - }, - { - "file": "git2/signature.h", - "functions": [ - "git_signature_new", - "git_signature_now", - "git_signature_default", - "git_signature_from_buffer", - "git_signature_dup", - "git_signature_free" - ], - "meta": {}, - "lines": 99 - }, - { - "file": "git2/stash.h", - "functions": [ - "git_stash_save", - "git_stash_apply_progress_cb", - "git_stash_apply_options_init", - "git_stash_apply", - "git_stash_cb", - "git_stash_foreach", - "git_stash_drop", - "git_stash_pop" - ], - "meta": {}, - "lines": 256 - }, - { - "file": "git2/status.h", - "functions": [ - "git_status_cb", - "git_status_options_init", - "git_status_foreach", - "git_status_foreach_ext", - "git_status_file", - "git_status_list_new", - "git_status_list_entrycount", - "git_status_byindex", - "git_status_list_free", - "git_status_should_ignore" - ], - "meta": {}, - "lines": 439 - }, - { - "file": "git2/strarray.h", - "functions": [ - "git_strarray_dispose", - "git_strarray_copy" - ], - "meta": {}, - "lines": 49 - }, - { - "file": "git2/submodule.h", - "functions": [ - "git_submodule_cb", - "git_submodule_update_options_init", - "git_submodule_update", - "git_submodule_lookup", - "git_submodule_dup", - "git_submodule_free", - "git_submodule_foreach", - "git_submodule_add_setup", - "git_submodule_clone", - "git_submodule_add_finalize", - "git_submodule_add_to_index", - "git_submodule_owner", - "git_submodule_name", - "git_submodule_path", - "git_submodule_url", - "git_submodule_resolve_url", - "git_submodule_branch", - "git_submodule_set_branch", - "git_submodule_set_url", - "git_submodule_index_id", - "git_submodule_head_id", - "git_submodule_wd_id", - "git_submodule_ignore", - "git_submodule_set_ignore", - "git_submodule_update_strategy", - "git_submodule_set_update", - "git_submodule_fetch_recurse_submodules", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_init", - "git_submodule_repo_init", - "git_submodule_sync", - "git_submodule_open", - "git_submodule_reload", - "git_submodule_status", - "git_submodule_location" - ], - "meta": {}, - "lines": 659 - }, - { - "file": "git2/sys/commit_graph.h", - "functions": [], - "meta": {}, - "lines": 98 - }, - { - "file": "git2/sys/filter.h", - "functions": [], - "meta": {}, - "lines": 95 - }, - { - "file": "git2/sys/hashsig.h", - "functions": [], - "meta": {}, - "lines": 45 - }, - { - "file": "git2/sys/merge.h", - "functions": [], - "meta": {}, - "lines": 41 - }, - { - "file": "git2/sys/path.h", - "functions": [], - "meta": {}, - "lines": 41 - }, - { - "file": "git2/sys/stream.h", - "functions": [], - "meta": {}, - "lines": 83 - }, - { - "file": "git2/sys/transport.h", - "functions": [], - "meta": {}, - "lines": 293 - }, - { - "file": "git2/tag.h", - "functions": [ - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_tag_free", - "git_tag_id", - "git_tag_owner", - "git_tag_target", - "git_tag_target_id", - "git_tag_target_type", - "git_tag_name", - "git_tag_tagger", - "git_tag_message", - "git_tag_create", - "git_tag_annotation_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_delete", - "git_tag_list", - "git_tag_list_match", - "git_tag_foreach_cb", - "git_tag_foreach", - "git_tag_peel", - "git_tag_dup", - "git_tag_name_is_valid" - ], - "meta": {}, - "lines": 378 - }, - { - "file": "git2/trace.h", - "functions": [ - "git_trace_cb", - "git_trace_set" - ], - "meta": {}, - "lines": 63 - }, - { - "file": "git2/transaction.h", - "functions": [ - "git_transaction_new", - "git_transaction_lock_ref", - "git_transaction_set_target", - "git_transaction_set_symbolic_target", - "git_transaction_set_reflog", - "git_transaction_remove", - "git_transaction_commit", - "git_transaction_free" - ], - "meta": {}, - "lines": 117 - }, - { - "file": "git2/transport.h", - "functions": [ - "git_transport_message_cb", - "git_transport_cb" - ], - "meta": {}, - "lines": 37 - }, - { - "file": "git2/tree.h", - "functions": [ - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_tree_free", - "git_tree_id", - "git_tree_owner", - "git_tree_entrycount", - "git_tree_entry_byname", - "git_tree_entry_byindex", - "git_tree_entry_byid", - "git_tree_entry_bypath", - "git_tree_entry_dup", - "git_tree_entry_free", - "git_tree_entry_name", - "git_tree_entry_id", - "git_tree_entry_type", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_cmp", - "git_tree_entry_to_object", - "git_treebuilder_new", - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_remove", - "git_treebuilder_filter_cb", - "git_treebuilder_filter", - "git_treebuilder_write", - "git_treewalk_cb", - "git_tree_walk", - "git_tree_dup", - "git_tree_create_updated" - ], - "meta": {}, - "lines": 469 - }, - { - "file": "git2/types.h", - "functions": [], - "meta": {}, - "lines": 366 - }, - { - "file": "git2/worktree.h", - "functions": [ - "git_worktree_list", - "git_worktree_lookup", - "git_worktree_open_from_repository", - "git_worktree_free", - "git_worktree_validate", - "git_worktree_add_options_init", - "git_worktree_add", - "git_worktree_lock", - "git_worktree_unlock", - "git_worktree_is_locked", - "git_worktree_name", - "git_worktree_path", - "git_worktree_prune_options_init", - "git_worktree_is_prunable", - "git_worktree_prune" - ], - "meta": {}, - "lines": 252 - } - ], - "functions": { - "git_annotated_commit_from_ref": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 33, - "lineto": 36, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given reference" - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "reference to use to lookup the git_annotated_commit" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const git_reference *ref", - "sig": "git_annotated_commit **::git_repository *::const git_reference *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_annotated_commit_from_ref-1" - ] - } - }, - "git_annotated_commit_from_fetchhead": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 50, - "lineto": 55, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given commit" - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "name of the (remote) branch" - }, - { - "name": "remote_url", - "type": "const char *", - "comment": "url of the remote" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the commit object id of the remote branch" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const char *branch_name, const char *remote_url, const git_oid *id", - "sig": "git_annotated_commit **::git_repository *::const char *::const char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from the given fetch head data.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "", - "group": "annotated" - }, - "git_annotated_commit_lookup": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 75, - "lineto": 78, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given commit" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the commit object id to lookup" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const git_oid *id", - "sig": "git_annotated_commit **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "

An annotated commit contains information about how it was looked up, which may be useful for functions like merge or rebase to provide context to the operation. For example, conflict files will include the name of the source or target branches being merged. It is therefore preferable to use the most specific function (eg git_annotated_commit_from_ref) instead of this one when that data is known.

\n", - "group": "annotated" - }, - "git_annotated_commit_from_revspec": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 92, - "lineto": 95, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given commit" - }, - { - "name": "revspec", - "type": "const char *", - "comment": "the extended sha syntax string to use to lookup the commit" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const char *revspec", - "sig": "git_annotated_commit **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", - "group": "annotated" - }, - "git_annotated_commit_id": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 103, - "lineto": 104, - "args": [ - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": "the given annotated commit" - } - ], - "argline": "const git_annotated_commit *commit", - "sig": "const git_annotated_commit *", - "return": { - "type": "const git_oid *", - "comment": " commit id" - }, - "description": "

Gets the commit ID that the given git_annotated_commit refers to.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_annotated_commit_id-2" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_annotated_commit_id-1", - "ex/v1.3.1/merge.html#git_annotated_commit_id-2", - "ex/v1.3.1/merge.html#git_annotated_commit_id-3" - ] - } - }, - "git_annotated_commit_ref": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 112, - "lineto": 113, - "args": [ - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": "the given annotated commit" - } - ], - "argline": "const git_annotated_commit *commit", - "sig": "const git_annotated_commit *", - "return": { - "type": "const char *", - "comment": " ref name." - }, - "description": "

Get the refname that the given git_annotated_commit refers to.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_annotated_commit_ref-3", - "ex/v1.3.1/checkout.html#git_annotated_commit_ref-4", - "ex/v1.3.1/checkout.html#git_annotated_commit_ref-5" - ] - } - }, - "git_annotated_commit_free": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 120, - "lineto": 121, - "args": [ - { - "name": "commit", - "type": "git_annotated_commit *", - "comment": "annotated commit to free" - } - ], - "argline": "git_annotated_commit *commit", - "sig": "git_annotated_commit *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees a git_annotated_commit.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_annotated_commit_free-6" - ] - } - }, - "git_apply_to_tree": { - "type": "function", - "file": "git2/apply.h", - "line": 105, - "lineto": 110, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "the postimage of the application" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to apply" - }, - { - "name": "preimage", - "type": "git_tree *", - "comment": "the tree to apply the diff to" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "the diff to apply" - }, - { - "name": "options", - "type": "const git_apply_options *", - "comment": "the options for the apply (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, git_tree *preimage, git_diff *diff, const git_apply_options *options", - "sig": "git_index **::git_repository *::git_tree *::git_diff *::const git_apply_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Apply a git_diff to a git_tree, and return the resulting image\n as an index.

\n", - "comments": "", - "group": "apply" - }, - "git_apply": { - "type": "function", - "file": "git2/apply.h", - "line": 143, - "lineto": 147, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to apply to" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "the diff to apply" - }, - { - "name": "location", - "type": "git_apply_location_t", - "comment": "the location to apply (workdir, index or both)" - }, - { - "name": "options", - "type": "const git_apply_options *", - "comment": "the options for the apply (or null for defaults)" - } - ], - "argline": "git_repository *repo, git_diff *diff, git_apply_location_t location, const git_apply_options *options", - "sig": "git_repository *::git_diff *::git_apply_location_t::const git_apply_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Apply a git_diff to the given repository, making changes directly\n in the working directory, the index, or both.

\n", - "comments": "", - "group": "apply" - }, - "git_attr_value": { - "type": "function", - "file": "git2/attr.h", - "line": 102, - "lineto": 102, - "args": [ - { - "name": "attr", - "type": "const char *", - "comment": "The attribute" - } - ], - "argline": "const char *attr", - "sig": "const char *", - "return": { - "type": "git_attr_value_t", - "comment": " the value type for the attribute" - }, - "description": "

Return the value type for a given attribute.

\n", - "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute was not set at all), or VALUE, if the attribute was set to an actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally as a NULL-terminated C string.

\n", - "group": "attr" - }, - "git_attr_get": { - "type": "function", - "file": "git2/attr.h", - "line": 181, - "lineto": 186, - "args": [ - { - "name": "value_out", - "type": "const char **", - "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the attribute to look up." - } - ], - "argline": "const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name", - "sig": "const char **::git_repository *::uint32_t::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Look up the value of one git attribute for path.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_get_ext": { - "type": "function", - "file": "git2/attr.h", - "line": 203, - "lineto": 208, - "args": [ - { - "name": "value_out", - "type": "const char **", - "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "opts", - "type": "git_attr_options *", - "comment": "The `git_attr_options` to use when querying these attributes." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the attribute to look up." - } - ], - "argline": "const char **value_out, git_repository *repo, git_attr_options *opts, const char *path, const char *name", - "sig": "const char **::git_repository *::git_attr_options *::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Look up the value of one git attribute for path with extended options.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_get_many": { - "type": "function", - "file": "git2/attr.h", - "line": 239, - "lineto": 245, - "args": [ - { - "name": "values_out", - "type": "const char **", - "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." - }, - { - "name": "num_attr", - "type": "size_t", - "comment": "The number of attributes being looked up" - }, - { - "name": "names", - "type": "const char **", - "comment": "An array of num_attr strings containing attribute names." - } - ], - "argline": "const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names", - "sig": "const char **::git_repository *::uint32_t::const char *::size_t::const char **", - "return": { - "type": "int", - "comment": null - }, - "description": "

Look up a list of git attributes for path.

\n", - "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", - "group": "attr" - }, - "git_attr_get_many_ext": { - "type": "function", - "file": "git2/attr.h", - "line": 263, - "lineto": 269, - "args": [ - { - "name": "values_out", - "type": "const char **", - "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "opts", - "type": "git_attr_options *", - "comment": "The `git_attr_options` to use when querying these attributes." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." - }, - { - "name": "num_attr", - "type": "size_t", - "comment": "The number of attributes being looked up" - }, - { - "name": "names", - "type": "const char **", - "comment": "An array of num_attr strings containing attribute names." - } - ], - "argline": "const char **values_out, git_repository *repo, git_attr_options *opts, const char *path, size_t num_attr, const char **names", - "sig": "const char **::git_repository *::git_attr_options *::const char *::size_t::const char **", - "return": { - "type": "int", - "comment": null - }, - "description": "

Look up a list of git attributes for path with extended options.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_foreach": { - "type": "function", - "file": "git2/attr.h", - "line": 302, - "lineto": 307, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." - }, - { - "name": "path", - "type": "const char *", - "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." - }, - { - "name": "callback", - "type": "git_attr_foreach_cb", - "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." - }, - { - "name": "payload", - "type": "void *", - "comment": "Passed on as extra parameter to callback function." - } - ], - "argline": "git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload", - "sig": "git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all the git attributes for a path.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_foreach_ext": { - "type": "function", - "file": "git2/attr.h", - "line": 322, - "lineto": 327, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "opts", - "type": "git_attr_options *", - "comment": "The `git_attr_options` to use when querying these attributes." - }, - { - "name": "path", - "type": "const char *", - "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." - }, - { - "name": "callback", - "type": "git_attr_foreach_cb", - "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." - }, - { - "name": "payload", - "type": "void *", - "comment": "Passed on as extra parameter to callback function." - } - ], - "argline": "git_repository *repo, git_attr_options *opts, const char *path, git_attr_foreach_cb callback, void *payload", - "sig": "git_repository *::git_attr_options *::const char *::git_attr_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all the git attributes for a path with extended options.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_cache_flush": { - "type": "function", - "file": "git2/attr.h", - "line": 340, - "lineto": 341, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the gitattributes cache" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Flush the gitattributes cache.

\n", - "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", - "group": "attr" - }, - "git_attr_add_macro": { - "type": "function", - "file": "git2/attr.h", - "line": 353, - "lineto": 356, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "name", - "type": "const char *", - "comment": null - }, - { - "name": "values", - "type": "const char *", - "comment": null - } - ], - "argline": "git_repository *repo, const char *name, const char *values", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Add a macro definition.

\n", - "comments": "

Macros will automatically be loaded from the top level .gitattributes file of the repository (plus the build-in "binary" macro). This function allows you to add others. For example, to add the default macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", - "group": "attr" - }, - "git_blame_options_init": { - "type": "function", - "file": "git2/blame.h", - "line": 138, - "lineto": 140, - "args": [ - { - "name": "opts", - "type": "git_blame_options *", - "comment": "The `git_blame_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_BLAME_OPTIONS_VERSION`." - } - ], - "argline": "git_blame_options *opts, unsigned int version", - "sig": "git_blame_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_blame_options structure

\n", - "comments": "

Initializes a git_blame_options with default values. Equivalent to creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", - "group": "blame" - }, - "git_blame_get_hunk_count": { - "type": "function", - "file": "git2/blame.h", - "line": 207, - "lineto": 207, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": null - } - ], - "argline": "git_blame *blame", - "sig": "git_blame *", - "return": { - "type": "uint32_t", - "comment": null - }, - "description": "

Gets the number of hunks that exist in the blame structure.

\n", - "comments": "", - "group": "blame" - }, - "git_blame_get_hunk_byindex": { - "type": "function", - "file": "git2/blame.h", - "line": 216, - "lineto": 218, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": "the blame structure to query" - }, - { - "name": "index", - "type": "uint32_t", - "comment": "index of the hunk to retrieve" - } - ], - "argline": "git_blame *blame, uint32_t index", - "sig": "git_blame *::uint32_t", - "return": { - "type": "const git_blame_hunk *", - "comment": " the hunk at the given index, or NULL on error" - }, - "description": "

Gets the blame hunk at the given index.

\n", - "comments": "", - "group": "blame" - }, - "git_blame_get_hunk_byline": { - "type": "function", - "file": "git2/blame.h", - "line": 227, - "lineto": 229, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": "the blame structure to query" - }, - { - "name": "lineno", - "type": "size_t", - "comment": "the (1-based) line number to find a hunk for" - } - ], - "argline": "git_blame *blame, size_t lineno", - "sig": "git_blame *::size_t", - "return": { - "type": "const git_blame_hunk *", - "comment": " the hunk that contains the given line, or NULL on error" - }, - "description": "

Gets the hunk that relates to the given line number in the newest commit.

\n", - "comments": "", - "group": "blame", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_blame_get_hunk_byline-1" - ] - } - }, - "git_blame_file": { - "type": "function", - "file": "git2/blame.h", - "line": 242, - "lineto": 246, - "args": [ - { - "name": "out", - "type": "git_blame **", - "comment": "pointer that will receive the blame object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository whose history is to be walked" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to file to consider" - }, - { - "name": "options", - "type": "git_blame_options *", - "comment": "options for the blame operation. If NULL, this is treated as\n though GIT_BLAME_OPTIONS_INIT were passed." - } - ], - "argline": "git_blame **out, git_repository *repo, const char *path, git_blame_options *options", - "sig": "git_blame **::git_repository *::const char *::git_blame_options *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error.)" - }, - "description": "

Get the blame for a single file.

\n", - "comments": "", - "group": "blame", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_blame_file-2" - ] - } - }, - "git_blame_buffer": { - "type": "function", - "file": "git2/blame.h", - "line": 266, - "lineto": 270, - "args": [ - { - "name": "out", - "type": "git_blame **", - "comment": "pointer that will receive the resulting blame data" - }, - { - "name": "reference", - "type": "git_blame *", - "comment": "cached blame from the history of the file (usually the output\n from git_blame_file)" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "the (possibly) modified contents of the file" - }, - { - "name": "buffer_len", - "type": "size_t", - "comment": "number of valid bytes in the buffer" - } - ], - "argline": "git_blame **out, git_blame *reference, const char *buffer, size_t buffer_len", - "sig": "git_blame **::git_blame *::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" - }, - "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", - "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", - "group": "blame" - }, - "git_blame_free": { - "type": "function", - "file": "git2/blame.h", - "line": 277, - "lineto": 277, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": "the blame structure to free" - } - ], - "argline": "git_blame *blame", - "sig": "git_blame *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free memory allocated by git_blame_file or git_blame_buffer.

\n", - "comments": "", - "group": "blame", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_blame_free-3" - ] - } - }, - "git_blob_lookup": { - "type": "function", - "file": "git2/blob.h", - "line": 33, - "lineto": 33, - "args": [ - { - "name": "blob", - "type": "git_blob **", - "comment": "pointer to the looked up blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the blob." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the blob to locate." - } - ], - "argline": "git_blob **blob, git_repository *repo, const git_oid *id", - "sig": "git_blob **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a blob object from a repository.

\n", - "comments": "", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_blob_lookup-4" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_blob_lookup-1" - ] - } - }, - "git_blob_lookup_prefix": { - "type": "function", - "file": "git2/blob.h", - "line": 47, - "lineto": 47, - "args": [ - { - "name": "blob", - "type": "git_blob **", - "comment": "pointer to the looked up blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the blob." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the blob to locate." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_blob **blob, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_blob **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a blob object from a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "", - "group": "blob" - }, - "git_blob_free": { - "type": "function", - "file": "git2/blob.h", - "line": 60, - "lineto": 60, - "args": [ - { - "name": "blob", - "type": "git_blob *", - "comment": "the blob to close" - } - ], - "argline": "git_blob *blob", - "sig": "git_blob *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open blob

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_blob_free-5" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_blob_free-2" - ] - } - }, - "git_blob_id": { - "type": "function", - "file": "git2/blob.h", - "line": 68, - "lineto": 68, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "a previously loaded blob." - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "const git_oid *", - "comment": " SHA1 hash for this blob." - }, - "description": "

Get the id of a blob.

\n", - "comments": "", - "group": "blob" - }, - "git_blob_owner": { - "type": "function", - "file": "git2/blob.h", - "line": 76, - "lineto": 76, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "A previously loaded blob." - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this blob." - }, - "description": "

Get the repository that contains the blob.

\n", - "comments": "", - "group": "blob" - }, - "git_blob_rawcontent": { - "type": "function", - "file": "git2/blob.h", - "line": 89, - "lineto": 89, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "pointer to the blob" - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "const void *", - "comment": " the pointer, or NULL on error" - }, - "description": "

Get a read-only buffer with the raw content of a blob.

\n", - "comments": "

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.

\n", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_blob_rawcontent-6" - ], - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_blob_rawcontent-1" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_blob_rawcontent-3" - ] - } - }, - "git_blob_rawsize": { - "type": "function", - "file": "git2/blob.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "pointer to the blob" - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "git_object_size_t", - "comment": " size on bytes" - }, - "description": "

Get the size in bytes of the contents of a blob

\n", - "comments": "", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_blob_rawsize-7" - ], - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_blob_rawsize-2" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_blob_rawsize-4", - "ex/v1.3.1/general.html#git_blob_rawsize-5" - ] - } - }, - "git_blob_filter_options_init": { - "type": "function", - "file": "git2/blob.h", - "line": 164, - "lineto": 164, - "args": [ - { - "name": "opts", - "type": "git_blob_filter_options *", - "comment": "The `git_blob_filter_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_BLOB_FILTER_OPTIONS_VERSION`." - } - ], - "argline": "git_blob_filter_options *opts, unsigned int version", - "sig": "git_blob_filter_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_blob_filter_options structure

\n", - "comments": "

Initializes a git_blob_filter_options with default values. Equivalent to creating an instance with GIT_BLOB_FILTER_OPTIONS_INIT.

\n", - "group": "blob" - }, - "git_blob_filter": { - "type": "function", - "file": "git2/blob.h", - "line": 188, - "lineto": 192, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The git_buf to be filled in" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "Pointer to the blob" - }, - { - "name": "as_path", - "type": "const char *", - "comment": "Path used for file attribute lookups, etc." - }, - { - "name": "opts", - "type": "git_blob_filter_options *", - "comment": "Options to use for filtering the blob" - } - ], - "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", - "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Get a buffer with the filtered content of a blob.

\n", - "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", - "group": "blob" - }, - "git_blob_create_from_workdir": { - "type": "function", - "file": "git2/blob.h", - "line": 205, - "lineto": 205, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "return the id of the written blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the blob will be written.\n\tthis repository cannot be bare" - }, - { - "name": "relative_path", - "type": "const char *", - "comment": "file from which the blob will be created,\n\trelative to the repository's working dir" - } - ], - "argline": "git_oid *id, git_repository *repo, const char *relative_path", - "sig": "git_oid *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read a file from the working folder of a repository\n and write it to the Object Database as a loose blob

\n", - "comments": "", - "group": "blob" - }, - "git_blob_create_from_disk": { - "type": "function", - "file": "git2/blob.h", - "line": 217, - "lineto": 217, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "return the id of the written blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the blob will be written.\n\tthis repository can be bare or not" - }, - { - "name": "path", - "type": "const char *", - "comment": "file from which the blob will be created" - } - ], - "argline": "git_oid *id, git_repository *repo, const char *path", - "sig": "git_oid *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read a file from the filesystem and write its content\n to the Object Database as a loose blob

\n", - "comments": "", - "group": "blob" - }, - "git_blob_create_from_stream": { - "type": "function", - "file": "git2/blob.h", - "line": 244, - "lineto": 247, - "args": [ - { - "name": "out", - "type": "git_writestream **", - "comment": "the stream into which to write" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where the blob will be written.\n This repository can be bare or not." - }, - { - "name": "hintpath", - "type": "const char *", - "comment": "If not NULL, will be used to select data filters\n to apply onto the content of the blob to be created." - } - ], - "argline": "git_writestream **out, git_repository *repo, const char *hintpath", - "sig": "git_writestream **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or error code" - }, - "description": "

Create a stream to write a new blob into the object db

\n", - "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_from_buffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_from_stream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", - "group": "blob" - }, - "git_blob_create_from_stream_commit": { - "type": "function", - "file": "git2/blob.h", - "line": 258, - "lineto": 260, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the id of the new blob" - }, - { - "name": "stream", - "type": "git_writestream *", - "comment": "the stream to close" - } - ], - "argline": "git_oid *out, git_writestream *stream", - "sig": "git_oid *::git_writestream *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Close the stream and write the blob to the object db

\n", - "comments": "

The stream will be closed and freed.

\n", - "group": "blob" - }, - "git_blob_create_from_buffer": { - "type": "function", - "file": "git2/blob.h", - "line": 271, - "lineto": 272, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "return the id of the written blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the blob will be written" - }, - { - "name": "buffer", - "type": "const void *", - "comment": "data to be written into the blob" - }, - { - "name": "len", - "type": "size_t", - "comment": "length of the data" - } - ], - "argline": "git_oid *id, git_repository *repo, const void *buffer, size_t len", - "sig": "git_oid *::git_repository *::const void *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an in-memory buffer to the ODB as a blob

\n", - "comments": "", - "group": "blob" - }, - "git_blob_is_binary": { - "type": "function", - "file": "git2/blob.h", - "line": 285, - "lineto": 285, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "The blob which content should be analyzed" - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "int", - "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." - }, - "description": "

Determine if the blob content is most certainly binary or not.

\n", - "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", - "group": "blob" - }, - "git_blob_dup": { - "type": "function", - "file": "git2/blob.h", - "line": 294, - "lineto": 294, - "args": [ - { - "name": "out", - "type": "git_blob **", - "comment": "Pointer to store the copy of the object" - }, - { - "name": "source", - "type": "git_blob *", - "comment": "Original object to copy" - } - ], - "argline": "git_blob **out, git_blob *source", - "sig": "git_blob **::git_blob *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an in-memory copy of a blob. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "blob" - }, - "git_branch_create": { - "type": "function", - "file": "git2/branch.h", - "line": 50, - "lineto": 55, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer where to store the underlying reference." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." - }, - { - "name": "target", - "type": "const git_commit *", - "comment": "Commit to which this branch should point. This object\n must belong to the given `repo`." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing branch." - } - ], - "argline": "git_reference **out, git_repository *repo, const char *branch_name, const git_commit *target, int force", - "sig": "git_reference **::git_repository *::const char *::const git_commit *::int", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit." - }, - "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

A new direct reference will be created pointing to this target commit. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "branch" - }, - "git_branch_create_from_annotated": { - "type": "function", - "file": "git2/branch.h", - "line": 68, - "lineto": 73, - "args": [ - { - "name": "ref_out", - "type": "git_reference **", - "comment": null - }, - { - "name": "repository", - "type": "git_repository *", - "comment": null - }, - { - "name": "branch_name", - "type": "const char *", - "comment": null - }, - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": null - }, - { - "name": "force", - "type": "int", - "comment": null - } - ], - "argline": "git_reference **ref_out, git_repository *repository, const char *branch_name, const git_annotated_commit *commit, int force", - "sig": "git_reference **::git_repository *::const char *::const git_annotated_commit *::int", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", - "group": "branch", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_branch_create_from_annotated-7" - ] - } - }, - "git_branch_delete": { - "type": "function", - "file": "git2/branch.h", - "line": 85, - "lineto": 85, - "args": [ - { - "name": "branch", - "type": "git_reference *", - "comment": "A valid reference representing a branch" - } - ], - "argline": "git_reference *branch", - "sig": "git_reference *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code." - }, - "description": "

Delete an existing branch reference.

\n", - "comments": "

Note that if the deletion succeeds, the reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", - "group": "branch" - }, - "git_branch_iterator_new": { - "type": "function", - "file": "git2/branch.h", - "line": 101, - "lineto": 104, - "args": [ - { - "name": "out", - "type": "git_branch_iterator **", - "comment": "the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the branches." - }, - { - "name": "list_flags", - "type": "git_branch_t", - "comment": "Filtering flags for the branch\n listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE\n or GIT_BRANCH_ALL." - } - ], - "argline": "git_branch_iterator **out, git_repository *repo, git_branch_t list_flags", - "sig": "git_branch_iterator **::git_repository *::git_branch_t", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Create an iterator which loops over the requested branches.

\n", - "comments": "", - "group": "branch" - }, - "git_branch_next": { - "type": "function", - "file": "git2/branch.h", - "line": 114, - "lineto": 114, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "the reference" - }, - { - "name": "out_type", - "type": "git_branch_t *", - "comment": "the type of branch (local or remote-tracking)" - }, - { - "name": "iter", - "type": "git_branch_iterator *", - "comment": "the branch iterator" - } - ], - "argline": "git_reference **out, git_branch_t *out_type, git_branch_iterator *iter", - "sig": "git_reference **::git_branch_t *::git_branch_iterator *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ITEROVER if there are no more branches or an error code." - }, - "description": "

Retrieve the next branch from the iterator

\n", - "comments": "", - "group": "branch" - }, - "git_branch_iterator_free": { - "type": "function", - "file": "git2/branch.h", - "line": 121, - "lineto": 121, - "args": [ - { - "name": "iter", - "type": "git_branch_iterator *", - "comment": "the iterator to free" - } - ], - "argline": "git_branch_iterator *iter", - "sig": "git_branch_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a branch iterator

\n", - "comments": "", - "group": "branch" - }, - "git_branch_move": { - "type": "function", - "file": "git2/branch.h", - "line": 144, - "lineto": 148, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "New reference object for the updated name." - }, - { - "name": "branch", - "type": "git_reference *", - "comment": "Current underlying reference of the branch." - }, - { - "name": "new_branch_name", - "type": "const char *", - "comment": "Target name of the branch once the move\n is performed; this name is validated for consistency." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing branch." - } - ], - "argline": "git_reference **out, git_reference *branch, const char *new_branch_name, int force", - "sig": "git_reference **::git_reference *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." - }, - "description": "

Move/rename an existing local branch reference.

\n", - "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

Note that if the move succeeds, the old reference object will not + be valid anymore, and should be freed immediately by the user using + git_reference_free().

\n", - "group": "branch" - }, - "git_branch_lookup": { - "type": "function", - "file": "git2/branch.h", - "line": 168, - "lineto": 172, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the looked-up branch reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the branch" - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "Name of the branch to be looked-up;\n this name is validated for consistency." - }, - { - "name": "branch_type", - "type": "git_branch_t", - "comment": "Type of the considered branch. This should\n be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE." - } - ], - "argline": "git_reference **out, git_repository *repo, const char *branch_name, git_branch_t branch_type", - "sig": "git_reference **::git_repository *::const char *::git_branch_t", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." - }, - "description": "

Lookup a branch by its name in a repository.

\n", - "comments": "

The generated reference must be freed by the user. The branch name will be checked for validity.

\n", - "group": "branch" - }, - "git_branch_name": { - "type": "function", - "file": "git2/branch.h", - "line": 189, - "lineto": 191, - "args": [ - { - "name": "out", - "type": "const char **", - "comment": "Pointer to the abbreviated reference name.\n Owned by ref, do not free." - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "A reference object, ideally pointing to a branch" - } - ], - "argline": "const char **out, const git_reference *ref", - "sig": "const char **::const git_reference *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_EINVALID if the reference isn't either a local or\n remote branch, otherwise an error code." - }, - "description": "

Get the branch name

\n", - "comments": "

Given a reference object, this will check that it really is a branch (ie. it lives under "refs/heads/" or "refs/remotes/"), and return the branch part of it.

\n", - "group": "branch", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_branch_name-4" - ] - } - }, - "git_branch_upstream": { - "type": "function", - "file": "git2/branch.h", - "line": 207, - "lineto": 209, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer where to store the retrieved reference." - }, - { - "name": "branch", - "type": "const git_reference *", - "comment": "Current underlying reference of the branch." - } - ], - "argline": "git_reference **out, const git_reference *branch", - "sig": "git_reference **::const git_reference *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code." - }, - "description": "

Get the upstream of a branch

\n", - "comments": "

Given a reference, this will return a new reference object corresponding to its remote tracking branch. The reference must be a local branch.

\n", - "group": "branch" - }, - "git_branch_set_upstream": { - "type": "function", - "file": "git2/branch.h", - "line": 226, - "lineto": 228, - "args": [ - { - "name": "branch", - "type": "git_reference *", - "comment": "the branch to configure" - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "remote-tracking or local branch to set as upstream." - } - ], - "argline": "git_reference *branch, const char *branch_name", - "sig": "git_reference *::const char *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" - }, - "description": "

Set a branch's upstream branch

\n", - "comments": "

This will update the configuration to set the branch named branch_name as the upstream of branch. Pass a NULL name to unset the upstream information.

\n", - "group": "branch" - }, - "git_branch_upstream_name": { - "type": "function", - "file": "git2/branch.h", - "line": 244, - "lineto": 247, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer into which the name will be written." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the branches live." - }, - { - "name": "refname", - "type": "const char *", - "comment": "reference name of the local branch." - } - ], - "argline": "git_buf *out, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND when no remote tracking reference exists,\n or an error code." - }, - "description": "

Get the upstream name of a branch

\n", - "comments": "

Given a local branch, this will return its remote-tracking branch information, as a full reference name, ie. "feature/nice" would become "refs/remote/origin/feature/nice", depending on that branch's configuration.

\n", - "group": "branch" - }, - "git_branch_is_head": { - "type": "function", - "file": "git2/branch.h", - "line": 257, - "lineto": 258, - "args": [ - { - "name": "branch", - "type": "const git_reference *", - "comment": "A reference to a local branch." - } - ], - "argline": "const git_reference *branch", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 if HEAD points at the branch, 0 if it isn't, or a negative value\n \t\t as an error code." - }, - "description": "

Determine if HEAD points to the given branch

\n", - "comments": "", - "group": "branch" - }, - "git_branch_is_checked_out": { - "type": "function", - "file": "git2/branch.h", - "line": 270, - "lineto": 271, - "args": [ - { - "name": "branch", - "type": "const git_reference *", - "comment": "A reference to a local branch." - } - ], - "argline": "const git_reference *branch", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 if branch is checked out, 0 if it isn't, an error code otherwise." - }, - "description": "

Determine if any HEAD points to the current branch

\n", - "comments": "

This will iterate over all known linked repositories (usually in the form of worktrees) and report whether any HEAD is pointing at the current branch.

\n", - "group": "branch" - }, - "git_branch_remote_name": { - "type": "function", - "file": "git2/branch.h", - "line": 289, - "lineto": 292, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The buffer into which the name will be written." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository where the branch lives." - }, - { - "name": "refname", - "type": "const char *", - "comment": "complete name of the remote tracking branch." - } - ], - "argline": "git_buf *out, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND when no matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." - }, - "description": "

Find the remote name of a remote-tracking branch

\n", - "comments": "

This will return the name of the remote whose fetch refspec is matching the given branch. E.g. given a branch "refs/remotes/test/master", it will extract the "test" part. If refspecs from multiple remotes match, the function will return GIT_EAMBIGUOUS.

\n", - "group": "branch" - }, - "git_branch_upstream_remote": { - "type": "function", - "file": "git2/branch.h", - "line": 305, - "lineto": 305, - "args": [ - { - "name": "buf", - "type": "git_buf *", - "comment": "the buffer into which to write the name" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the full name of the branch" - } - ], - "argline": "git_buf *buf, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Retrieve the upstream remote of a local branch

\n", - "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", - "group": "branch" - }, - "git_branch_upstream_merge": { - "type": "function", - "file": "git2/branch.h", - "line": 318, - "lineto": 318, - "args": [ - { - "name": "buf", - "type": "git_buf *", - "comment": "the buffer into which to write the name" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the full name of the branch" - } - ], - "argline": "git_buf *buf, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Retrieve the upstream merge of a local branch

\n", - "comments": "

This will return the currently configured "branch.*.merge" for a given branch. This branch must be local.

\n", - "group": "branch" - }, - "git_branch_name_is_valid": { - "type": "function", - "file": "git2/branch.h", - "line": 330, - "lineto": 330, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given branch name" - }, - { - "name": "name", - "type": "const char *", - "comment": "a branch name to test" - } - ], - "argline": "int *valid, const char *name", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Determine whether a branch name is valid, meaning that (when prefixed\n with refs/heads/) that it is a valid reference name, and that any\n additional branch name restrictions are imposed (eg, it cannot start\n with a -).

\n", - "comments": "", - "group": "branch" - }, - "git_buf_dispose": { - "type": "function", - "file": "git2/buffer.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": "The buffer to deallocate" - } - ], - "argline": "git_buf *buffer", - "sig": "git_buf *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_buf.

\n", - "comments": "

Note that this does not free the git_buf itself, just the memory pointed to by buffer->ptr. This will not free the memory if it looks like it was not allocated internally, but it will clear the buffer back to the empty state.

\n", - "group": "buf", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_buf_dispose-1", - "ex/v1.3.1/diff.html#git_buf_dispose-2" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_buf_dispose-1" - ] - } - }, - "git_buf_grow": { - "type": "function", - "file": "git2/deprecated.h", - "line": 220, - "lineto": 220, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": "The buffer to be resized; may or may not be allocated yet" - }, - { - "name": "target_size", - "type": "size_t", - "comment": "The desired available size" - } - ], - "argline": "git_buf *buffer, size_t target_size", - "sig": "git_buf *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, -1 on allocation failure" - }, - "description": "

Resize the buffer allocation to make more space.

\n", - "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e. the asize field is zero), then ptr will be replaced with a newly allocated block of data. Be careful so that memory allocated by the caller is not lost. As a special variant, if you pass target_size as 0 and the memory is not allocated by libgit2, this will allocate a new buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be marked as invalid for future operations, invaliding the contents.

\n", - "group": "buf" - }, - "git_buf_set": { - "type": "function", - "file": "git2/deprecated.h", - "line": 230, - "lineto": 231, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": "The buffer to set" - }, - { - "name": "data", - "type": "const void *", - "comment": "The data to copy into the buffer" - }, - { - "name": "datalen", - "type": "size_t", - "comment": "The length of the data to copy into the buffer" - } - ], - "argline": "git_buf *buffer, const void *data, size_t datalen", - "sig": "git_buf *::const void *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, -1 on allocation failure" - }, - "description": "

Set buffer to a copy of some raw data.

\n", - "comments": "", - "group": "buf" - }, - "git_buf_is_binary": { - "type": "function", - "file": "git2/deprecated.h", - "line": 239, - "lineto": 239, - "args": [ - { - "name": "buf", - "type": "const git_buf *", - "comment": "Buffer to check" - } - ], - "argline": "const git_buf *buf", - "sig": "const git_buf *", - "return": { - "type": "int", - "comment": " 1 if buffer looks like non-text data" - }, - "description": "

Check quickly if buffer looks like it contains binary data

\n", - "comments": "", - "group": "buf" - }, - "git_buf_contains_nul": { - "type": "function", - "file": "git2/deprecated.h", - "line": 247, - "lineto": 247, - "args": [ - { - "name": "buf", - "type": "const git_buf *", - "comment": "Buffer to check" - } - ], - "argline": "const git_buf *buf", - "sig": "const git_buf *", - "return": { - "type": "int", - "comment": " 1 if buffer contains a NUL byte" - }, - "description": "

Check quickly if buffer contains a NUL byte

\n", - "comments": "", - "group": "buf" - }, - "git_checkout_options_init": { - "type": "function", - "file": "git2/checkout.h", - "line": 357, - "lineto": 359, - "args": [ - { - "name": "opts", - "type": "git_checkout_options *", - "comment": "The `git_checkout_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_CHECKOUT_OPTIONS_VERSION`." - } - ], - "argline": "git_checkout_options *opts, unsigned int version", - "sig": "git_checkout_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_checkout_options structure

\n", - "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", - "group": "checkout" - }, - "git_checkout_head": { - "type": "function", - "file": "git2/checkout.h", - "line": 378, - "lineto": 380, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository to check out (must be non-bare)" - }, - { - "name": "opts", - "type": "const git_checkout_options *", - "comment": "specifies checkout options (may be NULL)" - } - ], - "argline": "git_repository *repo, const git_checkout_options *opts", - "sig": "git_repository *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use git_error_last for error details)" - }, - "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", - "comments": "

Note that this is not the correct mechanism used to switch branches; do not change your HEAD and then call this method, that would leave you with checkout conflicts since your working directory would then appear to be dirty. Instead, checkout the target of the branch and then update HEAD using git_repository_set_head to point to the branch you checked out.

\n", - "group": "checkout" - }, - "git_checkout_index": { - "type": "function", - "file": "git2/checkout.h", - "line": 391, - "lineto": 394, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository into which to check out (must be non-bare)" - }, - { - "name": "index", - "type": "git_index *", - "comment": "index to be checked out (or NULL to use repository index)" - }, - { - "name": "opts", - "type": "const git_checkout_options *", - "comment": "specifies checkout options (may be NULL)" - } - ], - "argline": "git_repository *repo, git_index *index, const git_checkout_options *opts", - "sig": "git_repository *::git_index *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" - }, - "description": "

Updates files in the working tree to match the content of the index.

\n", - "comments": "", - "group": "checkout" - }, - "git_checkout_tree": { - "type": "function", - "file": "git2/checkout.h", - "line": 407, - "lineto": 410, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository to check out (must be non-bare)" - }, - { - "name": "treeish", - "type": "const git_object *", - "comment": "a commit, tag or tree which content will be used to update\n the working directory (or NULL to use HEAD)" - }, - { - "name": "opts", - "type": "const git_checkout_options *", - "comment": "specifies checkout options (may be NULL)" - } - ], - "argline": "git_repository *repo, const git_object *treeish, const git_checkout_options *opts", - "sig": "git_repository *::const git_object *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" - }, - "description": "

Updates files in the index and working tree to match the content of the\n tree pointed at by the treeish.

\n", - "comments": "", - "group": "checkout", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_checkout_tree-8" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_checkout_tree-5" - ] - } - }, - "git_cherrypick_options_init": { - "type": "function", - "file": "git2/cherrypick.h", - "line": 49, - "lineto": 51, - "args": [ - { - "name": "opts", - "type": "git_cherrypick_options *", - "comment": "The `git_cherrypick_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_CHERRYPICK_OPTIONS_VERSION`." - } - ], - "argline": "git_cherrypick_options *opts, unsigned int version", - "sig": "git_cherrypick_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_cherrypick_options structure

\n", - "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", - "group": "cherrypick" - }, - "git_cherrypick_commit": { - "type": "function", - "file": "git2/cherrypick.h", - "line": 67, - "lineto": 73, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository that contains the given commits" - }, - { - "name": "cherrypick_commit", - "type": "git_commit *", - "comment": "the commit to cherry-pick" - }, - { - "name": "our_commit", - "type": "git_commit *", - "comment": "the commit to cherry-pick against (eg, HEAD)" - }, - { - "name": "mainline", - "type": "unsigned int", - "comment": "the parent of the `cherrypick_commit`, if it is a merge" - }, - { - "name": "merge_options", - "type": "const git_merge_options *", - "comment": "the merge options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, git_commit *cherrypick_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", - "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Cherry-picks the given commit against the given "our" commit, producing an\n index that reflects the result of the cherry-pick.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "cherrypick" - }, - "git_cherrypick": { - "type": "function", - "file": "git2/cherrypick.h", - "line": 83, - "lineto": 86, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to cherry-pick" - }, - { - "name": "commit", - "type": "git_commit *", - "comment": "the commit to cherry-pick" - }, - { - "name": "cherrypick_options", - "type": "const git_cherrypick_options *", - "comment": "the cherry-pick options (or null for defaults)" - } - ], - "argline": "git_repository *repo, git_commit *commit, const git_cherrypick_options *cherrypick_options", - "sig": "git_repository *::git_commit *::const git_cherrypick_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Cherry-pick the given commit, producing changes in the index and working directory.

\n", - "comments": "", - "group": "cherrypick" - }, - "git_clone_options_init": { - "type": "function", - "file": "git2/clone.h", - "line": 181, - "lineto": 183, - "args": [ - { - "name": "opts", - "type": "git_clone_options *", - "comment": "The `git_clone_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_CLONE_OPTIONS_VERSION`." - } - ], - "argline": "git_clone_options *opts, unsigned int version", - "sig": "git_clone_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_clone_options structure

\n", - "comments": "

Initializes a git_clone_options with default values. Equivalent to creating an instance with GIT_CLONE_OPTIONS_INIT.

\n", - "group": "clone" - }, - "git_clone": { - "type": "function", - "file": "git2/clone.h", - "line": 201, - "lineto": 205, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "pointer that will receive the resulting repository object" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote repository to clone" - }, - { - "name": "local_path", - "type": "const char *", - "comment": "local directory to clone to" - }, - { - "name": "options", - "type": "const git_clone_options *", - "comment": "configuration options for the clone. If NULL, the\n function works as though GIT_OPTIONS_INIT were passed." - } - ], - "argline": "git_repository **out, const char *url, const char *local_path, const git_clone_options *options", - "sig": "git_repository **::const char *::const char *::const git_clone_options *", - "return": { - "type": "int", - "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" - }, - "description": "

Clone a remote repository.

\n", - "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n", - "group": "clone" - }, - "git_commit_lookup": { - "type": "function", - "file": "git2/commit.h", - "line": 36, - "lineto": 37, - "args": [ - { - "name": "commit", - "type": "git_commit **", - "comment": "pointer to the looked up commit" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the commit." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." - } - ], - "argline": "git_commit **commit, git_repository *repo, const git_oid *id", - "sig": "git_commit **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a commit object from a repository.

\n", - "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", - "group": "commit", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_commit_lookup-9" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_commit_lookup-6", - "ex/v1.3.1/general.html#git_commit_lookup-7", - "ex/v1.3.1/general.html#git_commit_lookup-8" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_lookup-1" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_commit_lookup-6" - ] - } - }, - "git_commit_lookup_prefix": { - "type": "function", - "file": "git2/commit.h", - "line": 55, - "lineto": 56, - "args": [ - { - "name": "commit", - "type": "git_commit **", - "comment": "pointer to the looked up commit" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the commit." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_commit **commit, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_commit **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n", - "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", - "group": "commit" - }, - "git_commit_free": { - "type": "function", - "file": "git2/commit.h", - "line": 70, - "lineto": 70, - "args": [ - { - "name": "commit", - "type": "git_commit *", - "comment": "the commit to close" - } - ], - "argline": "git_commit *commit", - "sig": "git_commit *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open commit

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", - "group": "commit", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_commit_free-10" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_commit_free-9", - "ex/v1.3.1/general.html#git_commit_free-10", - "ex/v1.3.1/general.html#git_commit_free-11", - "ex/v1.3.1/general.html#git_commit_free-12", - "ex/v1.3.1/general.html#git_commit_free-13" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_free-2", - "ex/v1.3.1/log.html#git_commit_free-3", - "ex/v1.3.1/log.html#git_commit_free-4", - "ex/v1.3.1/log.html#git_commit_free-5" - ] - } - }, - "git_commit_id": { - "type": "function", - "file": "git2/commit.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_oid *", - "comment": " object identity for the commit." - }, - "description": "

Get the id of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_commit_id-14" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_id-6" - ] - } - }, - "git_commit_owner": { - "type": "function", - "file": "git2/commit.h", - "line": 86, - "lineto": 86, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "A previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this commit." - }, - "description": "

Get the repository that contains the commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_commit_owner-7", - "ex/v1.3.1/log.html#git_commit_owner-8" - ] - } - }, - "git_commit_message_encoding": { - "type": "function", - "file": "git2/commit.h", - "line": 98, - "lineto": 98, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " NULL, or the encoding" - }, - "description": "

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n", - "comments": "

The encoding may be NULL if the encoding header in the commit is missing; in that case UTF-8 is assumed.

\n", - "group": "commit" - }, - "git_commit_message": { - "type": "function", - "file": "git2/commit.h", - "line": 109, - "lineto": 109, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " the message of a commit" - }, - "description": "

Get the full message of a commit.

\n", - "comments": "

The returned message will be slightly prettified by removing any potential leading newlines.

\n", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_commit_message-3", - "ex/v1.3.1/cat-file.html#git_commit_message-4" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_commit_message-15", - "ex/v1.3.1/general.html#git_commit_message-16", - "ex/v1.3.1/general.html#git_commit_message-17" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_message-9", - "ex/v1.3.1/log.html#git_commit_message-10", - "ex/v1.3.1/log.html#git_commit_message-11" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_commit_message-2" - ] - } - }, - "git_commit_message_raw": { - "type": "function", - "file": "git2/commit.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " the raw message of a commit" - }, - "description": "

Get the full raw message of a commit.

\n", - "comments": "", - "group": "commit" - }, - "git_commit_summary": { - "type": "function", - "file": "git2/commit.h", - "line": 128, - "lineto": 128, - "args": [ - { - "name": "commit", - "type": "git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "git_commit *commit", - "sig": "git_commit *", - "return": { - "type": "const char *", - "comment": " the summary of a commit or NULL on error" - }, - "description": "

Get the short "summary" of the git commit message.

\n", - "comments": "

The returned message is the summary of the commit, comprising the first paragraph of the message with whitespace trimmed and squashed.

\n", - "group": "commit" - }, - "git_commit_body": { - "type": "function", - "file": "git2/commit.h", - "line": 141, - "lineto": 141, - "args": [ - { - "name": "commit", - "type": "git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "git_commit *commit", - "sig": "git_commit *", - "return": { - "type": "const char *", - "comment": " the body of a commit or NULL when no the message only\n consists of a summary" - }, - "description": "

Get the long "body" of the git commit message.

\n", - "comments": "

The returned message is the body of the commit, comprising everything but the first paragraph of the message. Leading and trailing whitespaces are trimmed.

\n", - "group": "commit" - }, - "git_commit_time": { - "type": "function", - "file": "git2/commit.h", - "line": 149, - "lineto": 149, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "git_time_t", - "comment": " the time of a commit" - }, - "description": "

Get the commit time (i.e. committer time) of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_commit_time-18", - "ex/v1.3.1/general.html#git_commit_time-19" - ] - } - }, - "git_commit_time_offset": { - "type": "function", - "file": "git2/commit.h", - "line": 157, - "lineto": 157, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "int", - "comment": " positive or negative timezone offset, in minutes from UTC" - }, - "description": "

Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.

\n", - "comments": "", - "group": "commit" - }, - "git_commit_committer": { - "type": "function", - "file": "git2/commit.h", - "line": 165, - "lineto": 165, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_signature *", - "comment": " the committer of a commit" - }, - "description": "

Get the committer of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_commit_committer-5" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_commit_committer-20" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_committer-12" - ] - } - }, - "git_commit_author": { - "type": "function", - "file": "git2/commit.h", - "line": 173, - "lineto": 173, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_signature *", - "comment": " the author of a commit" - }, - "description": "

Get the author of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_commit_author-6" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_commit_author-21", - "ex/v1.3.1/general.html#git_commit_author-22" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_author-13", - "ex/v1.3.1/log.html#git_commit_author-14" - ] - } - }, - "git_commit_committer_with_mailmap": { - "type": "function", - "file": "git2/commit.h", - "line": 186, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "a pointer to store the resolved signature." - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "mailmap", - "type": "const git_mailmap *", - "comment": "the mailmap to resolve with. (may be NULL)" - } - ], - "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", - "sig": "git_signature **::const git_commit *::const git_mailmap *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the committer of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", - "comments": "

Call git_signature_free to free the signature.

\n", - "group": "commit" - }, - "git_commit_author_with_mailmap": { - "type": "function", - "file": "git2/commit.h", - "line": 200, - "lineto": 201, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "a pointer to store the resolved signature." - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "mailmap", - "type": "const git_mailmap *", - "comment": "the mailmap to resolve with. (may be NULL)" - } - ], - "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", - "sig": "git_signature **::const git_commit *::const git_mailmap *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the author of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", - "comments": "

Call git_signature_free to free the signature.

\n", - "group": "commit" - }, - "git_commit_raw_header": { - "type": "function", - "file": "git2/commit.h", - "line": 209, - "lineto": 209, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit" - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " the header text of the commit" - }, - "description": "

Get the full raw text of the commit header.

\n", - "comments": "", - "group": "commit" - }, - "git_commit_tree": { - "type": "function", - "file": "git2/commit.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "tree_out", - "type": "git_tree **", - "comment": "pointer where to store the tree object" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "git_tree **tree_out, const git_commit *commit", - "sig": "git_tree **::const git_commit *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the tree pointed to by a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_commit_tree-15", - "ex/v1.3.1/log.html#git_commit_tree-16", - "ex/v1.3.1/log.html#git_commit_tree-17", - "ex/v1.3.1/log.html#git_commit_tree-18", - "ex/v1.3.1/log.html#git_commit_tree-19" - ] - } - }, - "git_commit_tree_id": { - "type": "function", - "file": "git2/commit.h", - "line": 228, - "lineto": 228, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_oid *", - "comment": " the id of tree pointed to by commit." - }, - "description": "

Get the id of the tree pointed to by a commit. This differs from\n git_commit_tree in that no attempts are made to fetch an object\n from the ODB.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_commit_tree_id-7" - ] - } - }, - "git_commit_parentcount": { - "type": "function", - "file": "git2/commit.h", - "line": 236, - "lineto": 236, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "unsigned int", - "comment": " integer of count of parents" - }, - "description": "

Get the number of parents of this commit

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_commit_parentcount-8" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_commit_parentcount-23" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_parentcount-20", - "ex/v1.3.1/log.html#git_commit_parentcount-21" - ] - } - }, - "git_commit_parent": { - "type": "function", - "file": "git2/commit.h", - "line": 246, - "lineto": 249, - "args": [ - { - "name": "out", - "type": "git_commit **", - "comment": "Pointer where to store the parent commit" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "n", - "type": "unsigned int", - "comment": "the position of the parent (from 0 to `parentcount`)" - } - ], - "argline": "git_commit **out, const git_commit *commit, unsigned int n", - "sig": "git_commit **::const git_commit *::unsigned int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the specified parent of the commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_commit_parent-24" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_parent-22", - "ex/v1.3.1/log.html#git_commit_parent-23" - ] - } - }, - "git_commit_parent_id": { - "type": "function", - "file": "git2/commit.h", - "line": 260, - "lineto": 262, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "n", - "type": "unsigned int", - "comment": "the position of the parent (from 0 to `parentcount`)" - } - ], - "argline": "const git_commit *commit, unsigned int n", - "sig": "const git_commit *::unsigned int", - "return": { - "type": "const git_oid *", - "comment": " the id of the parent, NULL on error." - }, - "description": "

Get the oid of a specified parent for a commit. This is different from\n git_commit_parent, which will attempt to load the parent commit from\n the ODB.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_commit_parent_id-9" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_commit_parent_id-24" - ] - } - }, - "git_commit_nth_gen_ancestor": { - "type": "function", - "file": "git2/commit.h", - "line": 278, - "lineto": 281, - "args": [ - { - "name": "ancestor", - "type": "git_commit **", - "comment": "Pointer where to store the ancestor commit" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "n", - "type": "unsigned int", - "comment": "the requested generation" - } - ], - "argline": "git_commit **ancestor, const git_commit *commit, unsigned int n", - "sig": "git_commit **::const git_commit *::unsigned int", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code" - }, - "description": "

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n", - "comments": "

Passing 0 as the generation number returns another instance of the base commit itself.

\n", - "group": "commit" - }, - "git_commit_header_field": { - "type": "function", - "file": "git2/commit.h", - "line": 293, - "lineto": 293, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer to fill; existing content will be\n overwritten" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "the commit to look in" - }, - { - "name": "field", - "type": "const char *", - "comment": "the header field to return" - } - ], - "argline": "git_buf *out, const git_commit *commit, const char *field", - "sig": "git_buf *::const git_commit *::const char *", - "return": { - "type": "int", - "comment": " 0 on succeess, GIT_ENOTFOUND if the field does not exist,\n or an error code" - }, - "description": "

Get an arbitrary header field

\n", - "comments": "", - "group": "commit" - }, - "git_commit_extract_signature": { - "type": "function", - "file": "git2/commit.h", - "line": 313, - "lineto": 313, - "args": [ - { - "name": "signature", - "type": "git_buf *", - "comment": "the signature block; existing content will be\n overwritten" - }, - { - "name": "signed_data", - "type": "git_buf *", - "comment": "signed data; this is the commit contents minus the signature block;\n existing content will be overwritten" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which the commit exists" - }, - { - "name": "commit_id", - "type": "git_oid *", - "comment": "the commit from which to extract the data" - }, - { - "name": "field", - "type": "const char *", - "comment": "the name of the header field containing the signature\n block; pass `NULL` to extract the default 'gpgsig'" - } - ], - "argline": "git_buf *signature, git_buf *signed_data, git_repository *repo, git_oid *commit_id, const char *field", - "sig": "git_buf *::git_buf *::git_repository *::git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." - }, - "description": "

Extract the signature from a commit

\n", - "comments": "

If the id is not for a commit, the error class will be GIT_ERROR_INVALID. If the commit does not have a signature, the error class will be GIT_ERROR_OBJECT.

\n", - "group": "commit" - }, - "git_commit_create": { - "type": "function", - "file": "git2/commit.h", - "line": 359, - "lineto": 369, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "Pointer in which to store the OID of the newly created commit" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the commit" - }, - { - "name": "update_ref", - "type": "const char *", - "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "Signature with author and author time of commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "Signature with committer and * commit time of commit" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this commit" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." - }, - { - "name": "parent_count", - "type": "size_t", - "comment": "Number of parents for this commit" - }, - { - "name": "parents", - "type": "const git_commit *[]", - "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." - } - ], - "argline": "git_oid *id, 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, size_t parent_count, const git_commit *[] parents", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", - "return": { - "type": "int", - "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" - }, - "description": "

Create new commit in the repository from a list of git_object pointers

\n", - "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", - "group": "commit", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_commit_create-7" - ] - } - }, - "git_commit_create_v": { - "type": "function", - "file": "git2/commit.h", - "line": 385, - "lineto": 395, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": null - }, - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "update_ref", - "type": "const char *", - "comment": null - }, - { - "name": "author", - "type": "const git_signature *", - "comment": null - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": null - }, - { - "name": "message", - "type": "const char *", - "comment": null - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": null - }, - { - "name": "parent_count", - "type": "size_t", - "comment": null - } - ], - "argline": "git_oid *id, 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, size_t parent_count", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create new commit in the repository using a variable argument list.

\n", - "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", - "group": "commit", - "examples": { - "commit.c": [ - "ex/v1.3.1/commit.html#git_commit_create_v-1" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_commit_create_v-25" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_commit_create_v-1" - ] - } - }, - "git_commit_amend": { - "type": "function", - "file": "git2/commit.h", - "line": 418, - "lineto": 426, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": null - }, - { - "name": "commit_to_amend", - "type": "const git_commit *", - "comment": null - }, - { - "name": "update_ref", - "type": "const char *", - "comment": null - }, - { - "name": "author", - "type": "const git_signature *", - "comment": null - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": null - }, - { - "name": "message", - "type": "const char *", - "comment": null - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": null - } - ], - "argline": "git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree", - "sig": "git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Amend an existing commit by replacing only non-NULL values.

\n", - "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", - "group": "commit" - }, - "git_commit_create_buffer": { - "type": "function", - "file": "git2/commit.h", - "line": 463, - "lineto": 472, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer into which to write the commit object content" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where the referenced tree and parents live" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "Signature with author and author time of commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "Signature with committer and * commit time of commit" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this commit" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." - }, - { - "name": "parent_count", - "type": "size_t", - "comment": "Number of parents for this commit" - }, - { - "name": "parents", - "type": "const git_commit *[]", - "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." - } - ], - "argline": "git_buf *out, git_repository *repo, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents", - "sig": "git_buf *::git_repository *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a commit and write it into a buffer

\n", - "comments": "

Create a commit as with git_commit_create() but instead of writing it to the objectdb, write the contents of the object into a buffer.

\n", - "group": "commit" - }, - "git_commit_create_with_signature": { - "type": "function", - "file": "git2/commit.h", - "line": 489, - "lineto": 494, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the resulting commit id" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "commit_content", - "type": "const char *", - "comment": "the content of the unsigned commit object" - }, - { - "name": "signature", - "type": "const char *", - "comment": "the signature to add to the commit. Leave `NULL`\n to create a commit without adding a signature field." - }, - { - "name": "signature_field", - "type": "const char *", - "comment": "which header field should contain this\n signature. Leave `NULL` for the default of \"gpgsig\"" - } - ], - "argline": "git_oid *out, git_repository *repo, const char *commit_content, const char *signature, const char *signature_field", - "sig": "git_oid *::git_repository *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a commit object from the given buffer and signature

\n", - "comments": "

Given the unsigned commit object's contents, its signature and the header field in which to store the signature, attach the signature to the commit and write it into the given repository.

\n", - "group": "commit" - }, - "git_commit_dup": { - "type": "function", - "file": "git2/commit.h", - "line": 503, - "lineto": 503, - "args": [ - { - "name": "out", - "type": "git_commit **", - "comment": "Pointer to store the copy of the commit" - }, - { - "name": "source", - "type": "git_commit *", - "comment": "Original commit to copy" - } - ], - "argline": "git_commit **out, git_commit *source", - "sig": "git_commit **::git_commit *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an in-memory copy of a commit. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "commit" - }, - "git_libgit2_version": { - "type": "function", - "file": "git2/common.h", - "line": 122, - "lineto": 122, - "args": [ - { - "name": "major", - "type": "int *", - "comment": "Store the major version number" - }, - { - "name": "minor", - "type": "int *", - "comment": "Store the minor version number" - }, - { - "name": "rev", - "type": "int *", - "comment": "Store the revision (patch) number" - } - ], - "argline": "int *major, int *minor, int *rev", - "sig": "int *::int *::int *", - "return": { - "type": "int", - "comment": " 0 on success or an error code on failure" - }, - "description": "

Return the version of the libgit2 library\n being currently used.

\n", - "comments": "", - "group": "libgit2" - }, - "git_libgit2_features": { - "type": "function", - "file": "git2/common.h", - "line": 171, - "lineto": 171, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": " A combination of GIT_FEATURE_* values." - }, - "description": "

Query compile time options for libgit2.

\n", - "comments": "
    \n
  • GIT_FEATURE_THREADS Libgit2 was compiled with thread support. Note that thread support is still to be seen as a 'work in progress' - basic object lookups are believed to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS Libgit2 supports the https:// protocol. This requires the openssl library to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH Libgit2 supports the SSH protocol for network operations. This requires the libssh2 library to be found when compiling libgit2

  • \n
\n", - "group": "libgit2" - }, - "git_libgit2_opts": { - "type": "function", - "file": "git2/common.h", - "line": 466, - "lineto": 466, - "args": [ - { - "name": "option", - "type": "int", - "comment": "Option key" - } - ], - "argline": "int option", - "sig": "int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n", - "group": "libgit2" - }, - "git_config_entry_free": { - "type": "function", - "file": "git2/config.h", - "line": 76, - "lineto": 76, - "args": [ - { - "name": "", - "type": "git_config_entry *", - "comment": null - } - ], - "argline": "git_config_entry *", - "sig": "git_config_entry *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a config entry

\n", - "comments": "", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.3.1/config.html#git_config_entry_free-1", - "ex/v1.3.1/config.html#git_config_entry_free-2" - ] - } - }, - "git_config_find_global": { - "type": "function", - "file": "git2/config.h", - "line": 127, - "lineto": 127, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a global configuration file has been found. Its path will be stored in `out`." - }, - "description": "

Locate the path to the global configuration file

\n", - "comments": "

The user or global configuration file is usually located in $HOME/.gitconfig.

\n\n

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.

\n\n

This method will not guess the path to the xdg compatible config file (.config/git/config).

\n", - "group": "config" - }, - "git_config_find_xdg": { - "type": "function", - "file": "git2/config.h", - "line": 144, - "lineto": 144, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`." - }, - "description": "

Locate the path to the global xdg compatible configuration file

\n", - "comments": "

The xdg compatible configuration file is usually located in $HOME/.config/git/config.

\n\n

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 xdg compatible configuration file.

\n", - "group": "config" - }, - "git_config_find_system": { - "type": "function", - "file": "git2/config.h", - "line": 156, - "lineto": 156, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`." - }, - "description": "

Locate the path to the system configuration file

\n", - "comments": "

If /etc/gitconfig doesn't exist, it will look for %PROGRAMFILES%.

\n", - "group": "config" - }, - "git_config_find_programdata": { - "type": "function", - "file": "git2/config.h", - "line": 167, - "lineto": 167, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a ProgramData configuration file has been\n\tfound. Its path will be stored in `out`." - }, - "description": "

Locate the path to the configuration file in ProgramData

\n", - "comments": "

Look for the file in %PROGRAMDATA% used by portable git.

\n", - "group": "config" - }, - "git_config_open_default": { - "type": "function", - "file": "git2/config.h", - "line": 179, - "lineto": 179, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "Pointer to store the config instance" - } - ], - "argline": "git_config **out", - "sig": "git_config **", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open the global, XDG and system configuration files

\n", - "comments": "

Utility wrapper that finds the global, XDG and system configuration files and opens them into a single prioritized config object that can be used when accessing default config data outside a repository.

\n", - "group": "config" - }, - "git_config_new": { - "type": "function", - "file": "git2/config.h", - "line": 190, - "lineto": 190, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "pointer to the new configuration" - } - ], - "argline": "git_config **out", - "sig": "git_config **", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Allocate a new configuration object

\n", - "comments": "

This object is empty, so you have to add a file to it before you can do anything with it.

\n", - "group": "config" - }, - "git_config_add_file_ondisk": { - "type": "function", - "file": "git2/config.h", - "line": 219, - "lineto": 224, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration to add the file to" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to the configuration file to add" - }, - { - "name": "level", - "type": "git_config_level_t", - "comment": "the priority level of the backend" - }, - { - "name": "repo", - "type": "const git_repository *", - "comment": "optional repository to allow parsing of\n conditional includes" - }, - { - "name": "force", - "type": "int", - "comment": "replace config file at the given priority level" - } - ], - "argline": "git_config *cfg, const char *path, git_config_level_t level, const git_repository *repo, int force", - "sig": "git_config *::const char *::git_config_level_t::const git_repository *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code" - }, - "description": "

Add an on-disk config file instance to an existing config

\n", - "comments": "

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).

\n\n

If the file does not exist, the file will still be added and it will be created the first time we write to it.

\n\n

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", - "group": "config" - }, - "git_config_open_ondisk": { - "type": "function", - "file": "git2/config.h", - "line": 238, - "lineto": 238, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "The configuration instance to create" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to the on-disk file to open" - } - ], - "argline": "git_config **out, const char *path", - "sig": "git_config **::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new config instance containing a single on-disk file

\n", - "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", - "group": "config", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_config_open_ondisk-26" - ] - } - }, - "git_config_open_level": { - "type": "function", - "file": "git2/config.h", - "line": 256, - "lineto": 259, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "The configuration instance to create" - }, - { - "name": "parent", - "type": "const git_config *", - "comment": "Multi-level config to search for the given level" - }, - { - "name": "level", - "type": "git_config_level_t", - "comment": "Configuration level to search for" - } - ], - "argline": "git_config **out, const git_config *parent, git_config_level_t level", - "sig": "git_config **::const git_config *::git_config_level_t", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code" - }, - "description": "

Build a single-level focused config object from a multi-level one.

\n", - "comments": "

The returned config object can be used to perform get/set/delete operations on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config will return different config instances, but containing the same config_file instance.

\n", - "group": "config" - }, - "git_config_open_global": { - "type": "function", - "file": "git2/config.h", - "line": 273, - "lineto": 273, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "pointer in which to store the config object" - }, - { - "name": "config", - "type": "git_config *", - "comment": "the config object in which to look" - } - ], - "argline": "git_config **out, git_config *config", - "sig": "git_config **::git_config *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Open the global/XDG configuration file according to git's rules

\n", - "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatibility, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", - "group": "config" - }, - "git_config_snapshot": { - "type": "function", - "file": "git2/config.h", - "line": 289, - "lineto": 289, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "pointer in which to store the snapshot config object" - }, - { - "name": "config", - "type": "git_config *", - "comment": "configuration to snapshot" - } - ], - "argline": "git_config **out, git_config *config", - "sig": "git_config **::git_config *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a snapshot of the configuration

\n", - "comments": "

Create a snapshot of the current state of a configuration, which allows you to look into a consistent view of the configuration for looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid until it is freed.

\n", - "group": "config" - }, - "git_config_free": { - "type": "function", - "file": "git2/config.h", - "line": 296, - "lineto": 296, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration to free" - } - ], - "argline": "git_config *cfg", - "sig": "git_config *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the configuration and its associated memory and files

\n", - "comments": "", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.3.1/config.html#git_config_free-3" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_config_free-27", - "ex/v1.3.1/general.html#git_config_free-28" - ] - } - }, - "git_config_get_entry": { - "type": "function", - "file": "git2/config.h", - "line": 308, - "lineto": 311, - "args": [ - { - "name": "out", - "type": "git_config_entry **", - "comment": "pointer to the variable git_config_entry" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "git_config_entry **out, const git_config *cfg, const char *name", - "sig": "git_config_entry **::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the git_config_entry of a config variable.

\n", - "comments": "

Free the git_config_entry after use with git_config_entry_free().

\n", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.3.1/config.html#git_config_get_entry-4" - ] - } - }, - "git_config_get_int32": { - "type": "function", - "file": "git2/config.h", - "line": 325, - "lineto": 325, - "args": [ - { - "name": "out", - "type": "int32_t *", - "comment": "pointer to the variable where the value should be stored" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "int32_t *out, const git_config *cfg, const char *name", - "sig": "int32_t *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of an integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_config_get_int32-29", - "ex/v1.3.1/general.html#git_config_get_int32-30" - ] - } - }, - "git_config_get_int64": { - "type": "function", - "file": "git2/config.h", - "line": 339, - "lineto": 339, - "args": [ - { - "name": "out", - "type": "int64_t *", - "comment": "pointer to the variable where the value should be stored" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "int64_t *out, const git_config *cfg, const char *name", - "sig": "int64_t *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a long integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_bool": { - "type": "function", - "file": "git2/config.h", - "line": 356, - "lineto": 356, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "pointer to the variable where the value should be stored" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "int *out, const git_config *cfg, const char *name", - "sig": "int *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a boolean config variable.

\n", - "comments": "

This function uses the usual C convention of 0 being false and anything else true.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_path": { - "type": "function", - "file": "git2/config.h", - "line": 374, - "lineto": 374, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer in which to store the result" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "git_buf *out, const git_config *cfg, const char *name", - "sig": "git_buf *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a path config variable.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_string": { - "type": "function", - "file": "git2/config.h", - "line": 392, - "lineto": 392, - "args": [ - { - "name": "out", - "type": "const char **", - "comment": "pointer to the string" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "const char **out, const git_config *cfg, const char *name", - "sig": "const char **::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a string config variable.

\n", - "comments": "

This function can only be used on snapshot config objects. The string is owned by the config and should not be freed by the user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_config_get_string-31", - "ex/v1.3.1/general.html#git_config_get_string-32" - ] - } - }, - "git_config_get_string_buf": { - "type": "function", - "file": "git2/config.h", - "line": 408, - "lineto": 408, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer in which to store the string" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "git_buf *out, const git_config *cfg, const char *name", - "sig": "git_buf *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a string config variable.

\n", - "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_multivar_foreach": { - "type": "function", - "file": "git2/config.h", - "line": 426, - "lineto": 426, - "args": [ - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to be called on each value of the variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "opaque pointer to pass to the callback" - } - ], - "argline": "const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload", - "sig": "const git_config *::const char *::const char *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Get each value of a multivar in a foreach callback

\n", - "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_multivar_iterator_new": { - "type": "function", - "file": "git2/config.h", - "line": 441, - "lineto": 441, - "args": [ - { - "name": "out", - "type": "git_config_iterator **", - "comment": "pointer to store the iterator" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" - } - ], - "argline": "git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp", - "sig": "git_config_iterator **::const git_config *::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Get each value of a multivar

\n", - "comments": "

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_next": { - "type": "function", - "file": "git2/config.h", - "line": 453, - "lineto": 453, - "args": [ - { - "name": "entry", - "type": "git_config_entry **", - "comment": "pointer to store the entry" - }, - { - "name": "iter", - "type": "git_config_iterator *", - "comment": "the iterator" - } - ], - "argline": "git_config_entry **entry, git_config_iterator *iter", - "sig": "git_config_entry **::git_config_iterator *", - "return": { - "type": "int", - "comment": " 0 or an error code. GIT_ITEROVER if the iteration has completed" - }, - "description": "

Return the current entry and advance the iterator

\n", - "comments": "

The pointers returned by this function are valid until the iterator is freed.

\n", - "group": "config" - }, - "git_config_iterator_free": { - "type": "function", - "file": "git2/config.h", - "line": 460, - "lineto": 460, - "args": [ - { - "name": "iter", - "type": "git_config_iterator *", - "comment": "the iterator to free" - } - ], - "argline": "git_config_iterator *iter", - "sig": "git_config_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a config iterator

\n", - "comments": "", - "group": "config" - }, - "git_config_set_int32": { - "type": "function", - "file": "git2/config.h", - "line": 471, - "lineto": 471, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "int32_t", - "comment": "Integer value for the variable" - } - ], - "argline": "git_config *cfg, const char *name, int32_t value", - "sig": "git_config *::const char *::int32_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_set_int64": { - "type": "function", - "file": "git2/config.h", - "line": 482, - "lineto": 482, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "int64_t", - "comment": "Long integer value for the variable" - } - ], - "argline": "git_config *cfg, const char *name, int64_t value", - "sig": "git_config *::const char *::int64_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_set_bool": { - "type": "function", - "file": "git2/config.h", - "line": 493, - "lineto": 493, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "int", - "comment": "the value to store" - } - ], - "argline": "git_config *cfg, const char *name, int value", - "sig": "git_config *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of a boolean config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_set_string": { - "type": "function", - "file": "git2/config.h", - "line": 507, - "lineto": 507, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "const char *", - "comment": "the string to store." - } - ], - "argline": "git_config *cfg, const char *name, const char *value", - "sig": "git_config *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.3.1/config.html#git_config_set_string-5" - ] - } - }, - "git_config_set_multivar": { - "type": "function", - "file": "git2/config.h", - "line": 519, - "lineto": 519, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "a regular expression to indicate which values to replace" - }, - { - "name": "value", - "type": "const char *", - "comment": "the new value." - } - ], - "argline": "git_config *cfg, const char *name, const char *regexp, const char *value", - "sig": "git_config *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Set a multivar in the local config file.

\n", - "comments": "

The regular expression is applied case-sensitively on the value.

\n", - "group": "config" - }, - "git_config_delete_entry": { - "type": "function", - "file": "git2/config.h", - "line": 528, - "lineto": 528, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable to delete" - } - ], - "argline": "git_config *cfg, const char *name", - "sig": "git_config *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Delete a config variable from the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_delete_multivar": { - "type": "function", - "file": "git2/config.h", - "line": 541, - "lineto": 541, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variables" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "a regular expression to indicate which values to delete" - } - ], - "argline": "git_config *cfg, const char *name, const char *regexp", - "sig": "git_config *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Deletes one or several entries from a multivar in the local config file.

\n", - "comments": "

The regular expression is applied case-sensitively on the value.

\n", - "group": "config" - }, - "git_config_foreach": { - "type": "function", - "file": "git2/config.h", - "line": 559, - "lineto": 562, - "args": [ - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to get the variables from" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to call on each variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "the data to pass to the callback" - } - ], - "argline": "const git_config *cfg, git_config_foreach_cb callback, void *payload", - "sig": "const git_config *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Perform an operation on each config variable.

\n", - "comments": "

The callback receives the normalized name and value of each variable in the config backend, and the data pointer passed to this function. If the callback returns a non-zero value, the function stops iterating and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the iteration is ongoing.

\n", - "group": "config" - }, - "git_config_iterator_new": { - "type": "function", - "file": "git2/config.h", - "line": 573, - "lineto": 573, - "args": [ - { - "name": "out", - "type": "git_config_iterator **", - "comment": "pointer to store the iterator" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to ge the variables from" - } - ], - "argline": "git_config_iterator **out, const git_config *cfg", - "sig": "git_config_iterator **::const git_config *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Iterate over all the config variables

\n", - "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n", - "group": "config" - }, - "git_config_iterator_glob_new": { - "type": "function", - "file": "git2/config.h", - "line": 589, - "lineto": 589, - "args": [ - { - "name": "out", - "type": "git_config_iterator **", - "comment": "pointer to store the iterator" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to ge the variables from" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to match the names" - } - ], - "argline": "git_config_iterator **out, const git_config *cfg, const char *regexp", - "sig": "git_config_iterator **::const git_config *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Iterate over all the config variables whose name matches a pattern

\n", - "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_foreach_match": { - "type": "function", - "file": "git2/config.h", - "line": 611, - "lineto": 615, - "args": [ - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to get the variables from" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to match against config names" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to call on each variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "the data to pass to the callback" - } - ], - "argline": "const git_config *cfg, const char *regexp, git_config_foreach_cb callback, void *payload", - "sig": "const git_config *::const char *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 or the return value of the callback which didn't return 0" - }, - "description": "

Perform an operation on each config variable matching a regular expression.

\n", - "comments": "

This behaves like git_config_foreach with an additional filter of a regular expression that filters which config keys are passed to the callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the case-insensitive parts are lower-case.

\n", - "group": "config" - }, - "git_config_get_mapped": { - "type": "function", - "file": "git2/config.h", - "line": 651, - "lineto": 656, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "place to store the result of the mapping" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "config file to get the variables from" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the config variable to lookup" - }, - { - "name": "maps", - "type": "const git_configmap *", - "comment": "array of `git_configmap` objects specifying the possible mappings" - }, - { - "name": "map_n", - "type": "size_t", - "comment": "number of mapping objects in `maps`" - } - ], - "argline": "int *out, const git_config *cfg, const char *name, const git_configmap *maps, size_t map_n", - "sig": "int *::const git_config *::const char *::const git_configmap *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", - "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_configmap autocrlf_mapping[] = {        {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", - "group": "config" - }, - "git_config_lookup_map_value": { - "type": "function", - "file": "git2/config.h", - "line": 666, - "lineto": 670, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "place to store the result of the parsing" - }, - { - "name": "maps", - "type": "const git_configmap *", - "comment": "array of `git_configmap` objects specifying the possible mappings" - }, - { - "name": "map_n", - "type": "size_t", - "comment": "number of mapping objects in `maps`" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int *out, const git_configmap *maps, size_t map_n, const char *value", - "sig": "int *::const git_configmap *::size_t::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Maps a string value to an integer constant

\n", - "comments": "", - "group": "config" - }, - "git_config_parse_bool": { - "type": "function", - "file": "git2/config.h", - "line": 682, - "lineto": 682, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "place to store the result of the parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int *out, const char *value", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Parse a string value as a bool.

\n", - "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any number different from 0 Valid values for false are: 'false', 'no', 'off', 0

\n", - "group": "config" - }, - "git_config_parse_int32": { - "type": "function", - "file": "git2/config.h", - "line": 694, - "lineto": 694, - "args": [ - { - "name": "out", - "type": "int32_t *", - "comment": "place to store the result of the parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int32_t *out, const char *value", - "sig": "int32_t *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Parse a string value as an int32.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", - "group": "config" - }, - "git_config_parse_int64": { - "type": "function", - "file": "git2/config.h", - "line": 706, - "lineto": 706, - "args": [ - { - "name": "out", - "type": "int64_t *", - "comment": "place to store the result of the parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int64_t *out, const char *value", - "sig": "int64_t *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Parse a string value as an int64.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", - "group": "config" - }, - "git_config_parse_path": { - "type": "function", - "file": "git2/config.h", - "line": 721, - "lineto": 721, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "placae to store the result of parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "the path to evaluate" - } - ], - "argline": "git_buf *out, const char *value", - "sig": "git_buf *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Parse a string value as a path.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be returned.

\n", - "group": "config" - }, - "git_config_backend_foreach_match": { - "type": "function", - "file": "git2/config.h", - "line": 739, - "lineto": 743, - "args": [ - { - "name": "backend", - "type": "git_config_backend *", - "comment": "where to get the variables from" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to match against config names (can be NULL)" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to call on each variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "the data to pass to the callback" - } - ], - "argline": "git_config_backend *backend, const char *regexp, git_config_foreach_cb callback, void *payload", - "sig": "git_config_backend *::const char *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Perform an operation on each config variable in a given config backend,\n matching a regular expression.

\n", - "comments": "

This behaves like git_config_foreach_match except that only config entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_lock": { - "type": "function", - "file": "git2/config.h", - "line": 762, - "lineto": 762, - "args": [ - { - "name": "tx", - "type": "git_transaction **", - "comment": "the resulting transaction, use this to commit or undo the\n changes" - }, - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration in which to lock" - } - ], - "argline": "git_transaction **tx, git_config *cfg", - "sig": "git_transaction **::git_config *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lock the backend with the highest priority

\n", - "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", - "group": "config" - }, - "git_credential_free": { - "type": "function", - "file": "git2/credential.h", - "line": 146, - "lineto": 146, - "args": [ - { - "name": "cred", - "type": "git_credential *", - "comment": "the object to free" - } - ], - "argline": "git_credential *cred", - "sig": "git_credential *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a credential.

\n", - "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", - "group": "credential" - }, - "git_credential_has_username": { - "type": "function", - "file": "git2/credential.h", - "line": 154, - "lineto": 154, - "args": [ - { - "name": "cred", - "type": "git_credential *", - "comment": "object to check" - } - ], - "argline": "git_credential *cred", - "sig": "git_credential *", - "return": { - "type": "int", - "comment": " 1 if the credential object has non-NULL username, 0 otherwise" - }, - "description": "

Check whether a credential object contains username information.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_get_username": { - "type": "function", - "file": "git2/credential.h", - "line": 162, - "lineto": 162, - "args": [ - { - "name": "cred", - "type": "git_credential *", - "comment": "object to check" - } - ], - "argline": "git_credential *cred", - "sig": "git_credential *", - "return": { - "type": "const char *", - "comment": " the credential username, or NULL if not applicable" - }, - "description": "

Return the username associated with a credential object.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_userpass_plaintext_new": { - "type": "function", - "file": "git2/credential.h", - "line": 173, - "lineto": 176, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "The username of the credential." - }, - { - "name": "password", - "type": "const char *", - "comment": "The password of the credential." - } - ], - "argline": "git_credential **out, const char *username, const char *password", - "sig": "git_credential **::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_default_new": { - "type": "function", - "file": "git2/credential.h", - "line": 185, - "lineto": 185, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - } - ], - "argline": "git_credential **out", - "sig": "git_credential **", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_username_new": { - "type": "function", - "file": "git2/credential.h", - "line": 197, - "lineto": 197, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "The username to authenticate with" - } - ], - "argline": "git_credential **out, const char *username", - "sig": "git_credential **::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a credential to specify a username.

\n", - "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", - "group": "credential" - }, - "git_credential_ssh_key_new": { - "type": "function", - "file": "git2/credential.h", - "line": 210, - "lineto": 215, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The path to the public key of the credential." - }, - { - "name": "privatekey", - "type": "const char *", - "comment": "The path to the private key of the credential." - }, - { - "name": "passphrase", - "type": "const char *", - "comment": "The passphrase of the credential." - } - ], - "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_credential **::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_key_memory_new": { - "type": "function", - "file": "git2/credential.h", - "line": 227, - "lineto": 232, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate." - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The public key of the credential." - }, - { - "name": "privatekey", - "type": "const char *", - "comment": "The private key of the credential." - }, - { - "name": "passphrase", - "type": "const char *", - "comment": "The passphrase of the credential." - } - ], - "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_credential **::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new ssh key credential object reading the keys from memory.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_interactive_new": { - "type": "function", - "file": "git2/credential.h", - "line": 262, - "lineto": 266, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": null - }, - { - "name": "username", - "type": "const char *", - "comment": "Username to use to authenticate." - }, - { - "name": "prompt_callback", - "type": "git_credential_ssh_interactive_cb", - "comment": "The callback method used for prompts." - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback." - } - ], - "argline": "git_credential **out, const char *username, git_credential_ssh_interactive_cb prompt_callback, void *payload", - "sig": "git_credential **::const char *::git_credential_ssh_interactive_cb::void *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure." - }, - "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_key_from_agent": { - "type": "function", - "file": "git2/credential.h", - "line": 276, - "lineto": 278, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - } - ], - "argline": "git_credential **out, const char *username", - "sig": "git_credential **::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_custom_new": { - "type": "function", - "file": "git2/credential.h", - "line": 304, - "lineto": 310, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The bytes of the public key." - }, - { - "name": "publickey_len", - "type": "size_t", - "comment": "The length of the public key in bytes." - }, - { - "name": "sign_callback", - "type": "git_credential_sign_cb", - "comment": "The callback method to sign the data during the challenge." - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback." - } - ], - "argline": "git_credential **out, const char *username, const char *publickey, size_t publickey_len, git_credential_sign_cb sign_callback, void *payload", - "sig": "git_credential **::const char *::const char *::size_t::git_credential_sign_cb::void *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create an ssh key credential with a custom signing function.

\n", - "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", - "group": "credential" - }, - "git_credential_userpass": { - "type": "function", - "file": "git2/credential_helpers.h", - "line": 43, - "lineto": 48, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "url", - "type": "const char *", - "comment": "The resource for which we are demanding a credential." - }, - { - "name": "user_from_url", - "type": "const char *", - "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." - }, - { - "name": "allowed_types", - "type": "unsigned int", - "comment": "A bitmask stating which credential types are OK to return." - }, - { - "name": "payload", - "type": "void *", - "comment": "The payload provided when specifying this callback. (This is\n interpreted as a `git_credential_userpass_payload*`.)" - } - ], - "argline": "git_credential **out, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload", - "sig": "git_credential **::const char *::const char *::unsigned int::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Stock callback usable as a git_credential_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDENTIAL_USERPASS_PLAINTEXT as an allowed type.

\n", - "comments": "", - "group": "credential" - }, - "git_blob_filtered_content": { - "type": "function", - "file": "git2/deprecated.h", - "line": 115, - "lineto": 119, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "blob", - "type": "git_blob *", - "comment": null - }, - { - "name": "as_path", - "type": "const char *", - "comment": null - }, - { - "name": "check_for_binary_data", - "type": "int", - "comment": null - } - ], - "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", - "sig": "git_buf *::git_blob *::const char *::int", - "return": { - "type": "int", - "comment": null - }, - "description": "

Deprecated in favor of git_blob_filter.

\n", - "comments": "", - "group": "blob" - }, - "git_filter_list_stream_data": { - "type": "function", - "file": "git2/deprecated.h", - "line": 139, - "lineto": 142, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": null - }, - { - "name": "data", - "type": "git_buf *", - "comment": null - }, - { - "name": "target", - "type": "git_writestream *", - "comment": null - } - ], - "argline": "git_filter_list *filters, git_buf *data, git_writestream *target", - "sig": "git_filter_list *::git_buf *::git_writestream *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Deprecated in favor of git_filter_list_stream_buffer.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_apply_to_data": { - "type": "function", - "file": "git2/deprecated.h", - "line": 149, - "lineto": 152, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": null - }, - { - "name": "in", - "type": "git_buf *", - "comment": null - } - ], - "argline": "git_buf *out, git_filter_list *filters, git_buf *in", - "sig": "git_buf *::git_filter_list *::git_buf *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Deprecated in favor of git_filter_list_apply_to_buffer.

\n", - "comments": "", - "group": "filter" - }, - "git_treebuilder_write_with_buffer": { - "type": "function", - "file": "git2/deprecated.h", - "line": 178, - "lineto": 179, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": null - }, - { - "name": "bld", - "type": "git_treebuilder *", - "comment": null - }, - { - "name": "tree", - "type": "git_buf *", - "comment": null - } - ], - "argline": "git_oid *oid, git_treebuilder *bld, git_buf *tree", - "sig": "git_oid *::git_treebuilder *::git_buf *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Write the contents of the tree builder as a tree object.\n This is an alias of git_treebuilder_write and is preserved\n for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "treebuilder" - }, - "git_buf_free": { - "type": "function", - "file": "git2/deprecated.h", - "line": 259, - "lineto": 259, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": null - } - ], - "argline": "git_buf *buffer", - "sig": "git_buf *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_buf. This is an alias of\n git_buf_dispose and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "buf" - }, - "git_diff_format_email": { - "type": "function", - "file": "git2/deprecated.h", - "line": 357, - "lineto": 360, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "diff", - "type": "git_diff *", - "comment": null - }, - { - "name": "opts", - "type": "const git_diff_format_email_options *", - "comment": null - } - ], - "argline": "git_buf *out, git_diff *diff, const git_diff_format_email_options *opts", - "sig": "git_buf *::git_diff *::const git_diff_format_email_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an e-mail ready patch from a diff.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_commit_as_email": { - "type": "function", - "file": "git2/deprecated.h", - "line": 368, - "lineto": 375, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "commit", - "type": "git_commit *", - "comment": null - }, - { - "name": "patch_no", - "type": "size_t", - "comment": null - }, - { - "name": "total_patches", - "type": "size_t", - "comment": null - }, - { - "name": "flags", - "type": "uint32_t", - "comment": null - }, - { - "name": "diff_opts", - "type": "const git_diff_options *", - "comment": null - } - ], - "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", - "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an e-mail ready patch for a commit.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_format_email_options_init": { - "type": "function", - "file": "git2/deprecated.h", - "line": 387, - "lineto": 389, - "args": [ - { - "name": "opts", - "type": "git_diff_format_email_options *", - "comment": "The `git_blame_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_format_email_options *opts, unsigned int version", - "sig": "git_diff_format_email_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_format_email_options structure

\n", - "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", - "group": "diff" - }, - "giterr_last": { - "type": "function", - "file": "git2/deprecated.h", - "line": 450, - "lineto": 450, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "const git_error *", - "comment": null - }, - "description": "

Return the last git_error object that was generated for the\n current thread. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "giterr_clear": { - "type": "function", - "file": "git2/deprecated.h", - "line": 462, - "lineto": 462, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Clear the last error. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "giterr_set_str": { - "type": "function", - "file": "git2/deprecated.h", - "line": 474, - "lineto": 474, - "args": [ - { - "name": "error_class", - "type": "int", - "comment": null - }, - { - "name": "string", - "type": "const char *", - "comment": null - } - ], - "argline": "int error_class, const char *string", - "sig": "int::const char *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Sets the error message to the given string. This is an alias of\n git_error_set_str and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "giterr_set_oom": { - "type": "function", - "file": "git2/deprecated.h", - "line": 486, - "lineto": 486, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Indicates that an out-of-memory situation occurred. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "git_object__size": { - "type": "function", - "file": "git2/deprecated.h", - "line": 576, - "lineto": 576, - "args": [ - { - "name": "type", - "type": "git_object_t", - "comment": "object type to get its size" - } - ], - "argline": "git_object_t type", - "sig": "git_object_t", - "return": { - "type": "size_t", - "comment": " size in bytes of the object" - }, - "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", - "comments": "

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.

\n", - "group": "object" - }, - "git_remote_is_valid_name": { - "type": "function", - "file": "git2/deprecated.h", - "line": 597, - "lineto": 597, - "args": [ - { - "name": "remote_name", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "const char *remote_name", - "sig": "const char *", - "return": { - "type": "int", - "comment": " 1 if the reference name is acceptable; 0 if it isn't" - }, - "description": "

Ensure the remote name is well-formed.

\n", - "comments": "", - "group": "remote" - }, - "git_reference_is_valid_name": { - "type": "function", - "file": "git2/deprecated.h", - "line": 641, - "lineto": 641, - "args": [ - { - "name": "refname", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "const char *refname", - "sig": "const char *", - "return": { - "type": "int", - "comment": " 1 if the reference name is acceptable; 0 if it isn't" - }, - "description": "

Ensure the reference name is well-formed.

\n", - "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", - "group": "reference" - }, - "git_oid_iszero": { - "type": "function", - "file": "git2/deprecated.h", - "line": 778, - "lineto": 778, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": null - } - ], - "argline": "const git_oid *id", - "sig": "const git_oid *", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "

These types are retained for backward compatibility. The newer versions of these values should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility values at this time.

\n\n

@{

\n", - "group": "oid" - }, - "git_oidarray_free": { - "type": "function", - "file": "git2/deprecated.h", - "line": 802, - "lineto": 802, - "args": [ - { - "name": "array", - "type": "git_oidarray *", - "comment": null - } - ], - "argline": "git_oidarray *array", - "sig": "git_oidarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_oidarray. This is an alias of\n git_oidarray_dispose and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "oidarray" - }, - "git_strarray_copy": { - "type": "function", - "file": "git2/strarray.h", - "line": 49, - "lineto": 49, - "args": [ - { - "name": "tgt", - "type": "git_strarray *", - "comment": "target" - }, - { - "name": "src", - "type": "const git_strarray *", - "comment": "source" - } - ], - "argline": "git_strarray *tgt, const git_strarray *src", - "sig": "git_strarray *::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n 0 on allocation failure" - }, - "description": "

Copy a string array object from source to target.

\n", - "comments": "

Note: target is overwritten and hence should be empty, otherwise its contents are leaked. Call git_strarray_free() if necessary.

\n", - "group": "strarray" - }, - "git_strarray_free": { - "type": "function", - "file": "git2/deprecated.h", - "line": 883, - "lineto": 883, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": null - } - ], - "argline": "git_strarray *array", - "sig": "git_strarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_strarray. This is an alias of\n git_strarray_dispose and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "strarray" - }, - "git_blame_init_options": { - "type": "function", - "file": "git2/deprecated.h", - "line": 897, - "lineto": 897, - "args": [ - { - "name": "opts", - "type": "git_blame_options *", - "comment": null - }, - { - "name": "version", - "type": "unsigned int", - "comment": null - } - ], - "argline": "git_blame_options *opts, unsigned int version", - "sig": "git_blame_options *::unsigned int", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility functions at this time.

\n\n

@{

\n", - "group": "blame" - }, - "git_describe_options_init": { - "type": "function", - "file": "git2/describe.h", - "line": 82, - "lineto": 82, - "args": [ - { - "name": "opts", - "type": "git_describe_options *", - "comment": "The `git_describe_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DESCRIBE_OPTIONS_VERSION`." - } - ], - "argline": "git_describe_options *opts, unsigned int version", - "sig": "git_describe_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_describe_options structure

\n", - "comments": "

Initializes a git_describe_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.3.1/describe.html#git_describe_options_init-1" - ] - } - }, - "git_describe_format_options_init": { - "type": "function", - "file": "git2/describe.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "opts", - "type": "git_describe_format_options *", - "comment": "The `git_describe_format_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DESCRIBE_FORMAT_OPTIONS_VERSION`." - } - ], - "argline": "git_describe_format_options *opts, unsigned int version", - "sig": "git_describe_format_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_describe_format_options structure

\n", - "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.3.1/describe.html#git_describe_format_options_init-2" - ] - } - }, - "git_describe_commit": { - "type": "function", - "file": "git2/describe.h", - "line": 146, - "lineto": 149, - "args": [ - { - "name": "result", - "type": "git_describe_result **", - "comment": "pointer to store the result. You must free this once\n you're done with it." - }, - { - "name": "committish", - "type": "git_object *", - "comment": "a committish to describe" - }, - { - "name": "opts", - "type": "git_describe_options *", - "comment": "the lookup options (or NULL for defaults)" - } - ], - "argline": "git_describe_result **result, git_object *committish, git_describe_options *opts", - "sig": "git_describe_result **::git_object *::git_describe_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Describe a commit

\n", - "comments": "

Perform the describe operation on the given committish object.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.3.1/describe.html#git_describe_commit-3" - ] - } - }, - "git_describe_workdir": { - "type": "function", - "file": "git2/describe.h", - "line": 163, - "lineto": 166, - "args": [ - { - "name": "out", - "type": "git_describe_result **", - "comment": "pointer to store the result. You must free this once\n you're done with it." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the describe" - }, - { - "name": "opts", - "type": "git_describe_options *", - "comment": "the lookup options (or NULL for defaults)" - } - ], - "argline": "git_describe_result **out, git_repository *repo, git_describe_options *opts", - "sig": "git_describe_result **::git_repository *::git_describe_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Describe a commit

\n", - "comments": "

Perform the describe operation on the current commit and the worktree. After peforming describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.3.1/describe.html#git_describe_workdir-4" - ] - } - }, - "git_describe_format": { - "type": "function", - "file": "git2/describe.h", - "line": 176, - "lineto": 179, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The buffer to store the result" - }, - { - "name": "result", - "type": "const git_describe_result *", - "comment": "the result from `git_describe_commit()` or\n `git_describe_workdir()`." - }, - { - "name": "opts", - "type": "const git_describe_format_options *", - "comment": "the formatting options (or NULL for defaults)" - } - ], - "argline": "git_buf *out, const git_describe_result *result, const git_describe_format_options *opts", - "sig": "git_buf *::const git_describe_result *::const git_describe_format_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Print the describe result to a buffer

\n", - "comments": "", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.3.1/describe.html#git_describe_format-5" - ] - } - }, - "git_describe_result_free": { - "type": "function", - "file": "git2/describe.h", - "line": 184, - "lineto": 184, - "args": [ - { - "name": "result", - "type": "git_describe_result *", - "comment": null - } - ], - "argline": "git_describe_result *result", - "sig": "git_describe_result *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the describe result.

\n", - "comments": "", - "group": "describe" - }, - "git_diff_options_init": { - "type": "function", - "file": "git2/diff.h", - "line": 468, - "lineto": 470, - "args": [ - { - "name": "opts", - "type": "git_diff_options *", - "comment": "The `git_diff_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_options *opts, unsigned int version", - "sig": "git_diff_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_options structure

\n", - "comments": "

Initializes a git_diff_options with default values. Equivalent to creating an instance with GIT_DIFF_OPTIONS_INIT.

\n", - "group": "diff" - }, - "git_diff_find_options_init": { - "type": "function", - "file": "git2/diff.h", - "line": 801, - "lineto": 803, - "args": [ - { - "name": "opts", - "type": "git_diff_find_options *", - "comment": "The `git_diff_find_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_FIND_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_find_options *opts, unsigned int version", - "sig": "git_diff_find_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_find_options structure

\n", - "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", - "group": "diff" - }, - "git_diff_free": { - "type": "function", - "file": "git2/diff.h", - "line": 817, - "lineto": 817, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "The previously created diff; cannot be used after free." - } - ], - "argline": "git_diff *diff", - "sig": "git_diff *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Deallocate a diff.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_free-3" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_diff_free-25", - "ex/v1.3.1/log.html#git_diff_free-26" - ] - } - }, - "git_diff_tree_to_tree": { - "type": "function", - "file": "git2/diff.h", - "line": 835, - "lineto": 840, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the trees." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "new_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff to, or NULL for empty tree." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_tree *new_tree, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::git_tree *::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a diff with the difference between two tree objects.

\n", - "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_tree_to_tree-4" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_diff_tree_to_tree-27", - "ex/v1.3.1/log.html#git_diff_tree_to_tree-28" - ] - } - }, - "git_diff_tree_to_index": { - "type": "function", - "file": "git2/diff.h", - "line": 861, - "lineto": 866, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the tree and index." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to diff with; repo index used if NULL." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_index *index, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::git_index *::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a diff between a tree and repository index.

\n", - "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_tree_to_index-5" - ] - } - }, - "git_diff_index_to_workdir": { - "type": "function", - "file": "git2/diff.h", - "line": 888, - "lineto": 892, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository." - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to diff from; repo index used if NULL." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_index *index, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_index *::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a diff between the repository index and the workdir directory.

\n", - "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_index_to_workdir-6" - ] - } - }, - "git_diff_tree_to_workdir": { - "type": "function", - "file": "git2/diff.h", - "line": 917, - "lineto": 921, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "A pointer to a git_diff pointer that will be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the tree." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a diff between a tree and the working directory.

\n", - "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_tree_to_workdir-7" - ] - } - }, - "git_diff_tree_to_workdir_with_index": { - "type": "function", - "file": "git2/diff.h", - "line": 936, - "lineto": 940, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "A pointer to a git_diff pointer that will be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the tree." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n", - "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_tree_to_workdir_with_index-8" - ] - } - }, - "git_diff_index_to_index": { - "type": "function", - "file": "git2/diff.h", - "line": 954, - "lineto": 959, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the indexes." - }, - { - "name": "old_index", - "type": "git_index *", - "comment": "A git_index object to diff from." - }, - { - "name": "new_index", - "type": "git_index *", - "comment": "A git_index object to diff to." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_index *old_index, git_index *new_index, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_index *::git_index *::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a diff with the difference between two index objects.

\n", - "comments": "

The first index will be used for the "old_file" side of the delta and the second index will be used for the "new_file" side of the delta.

\n", - "group": "diff" - }, - "git_diff_merge": { - "type": "function", - "file": "git2/diff.h", - "line": 974, - "lineto": 976, - "args": [ - { - "name": "onto", - "type": "git_diff *", - "comment": "Diff to merge into." - }, - { - "name": "from", - "type": "const git_diff *", - "comment": "Diff to merge." - } - ], - "argline": "git_diff *onto, const git_diff *from", - "sig": "git_diff *::const git_diff *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Merge one diff into another.

\n", - "comments": "

This merges items from the "from" list into the "onto" list. The resulting diff will have all items that appear in either list. If an item appears in both lists, then it will be "merged" to appear as if the old version was from the "onto" list and the new version is from the "from" list (with the exception that if the item has a pending DELETE in the middle, then it will show as deleted).

\n", - "group": "diff" - }, - "git_diff_find_similar": { - "type": "function", - "file": "git2/diff.h", - "line": 990, - "lineto": 992, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "diff to run detection algorithms on" - }, - { - "name": "options", - "type": "const git_diff_find_options *", - "comment": "Control how detection should be run, NULL for defaults" - } - ], - "argline": "git_diff *diff, const git_diff_find_options *options", - "sig": "git_diff *::const git_diff_find_options *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on failure" - }, - "description": "

Transform a diff marking file renames, copies, etc.

\n", - "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_find_similar-9" - ] - } - }, - "git_diff_num_deltas": { - "type": "function", - "file": "git2/diff.h", - "line": 1010, - "lineto": 1010, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "A git_diff generated by one of the above functions" - } - ], - "argline": "const git_diff *diff", - "sig": "const git_diff *", - "return": { - "type": "size_t", - "comment": " Count of number of deltas in the list" - }, - "description": "

Query how many diff records are there in a diff.

\n", - "comments": "", - "group": "diff", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_diff_num_deltas-29" - ] - } - }, - "git_diff_num_deltas_of_type": { - "type": "function", - "file": "git2/diff.h", - "line": 1023, - "lineto": 1024, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "A git_diff generated by one of the above functions" - }, - { - "name": "type", - "type": "git_delta_t", - "comment": "A git_delta_t value to filter the count" - } - ], - "argline": "const git_diff *diff, git_delta_t type", - "sig": "const git_diff *::git_delta_t", - "return": { - "type": "size_t", - "comment": " Count of number of deltas matching delta_t type" - }, - "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", - "comments": "

This works just like git_diff_num_deltas() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", - "group": "diff" - }, - "git_diff_get_delta": { - "type": "function", - "file": "git2/diff.h", - "line": 1043, - "lineto": 1044, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "Diff list object" - }, - { - "name": "idx", - "type": "size_t", - "comment": "Index into diff list" - } - ], - "argline": "const git_diff *diff, size_t idx", - "sig": "const git_diff *::size_t", - "return": { - "type": "const git_diff_delta *", - "comment": " Pointer to git_diff_delta (or NULL if `idx` out of range)" - }, - "description": "

Return the diff delta for an entry in the diff list.

\n", - "comments": "

The git_diff_delta pointer points to internal data and you do not have to release it when you are done with it. It will go away when the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary content or not may not be set if there are no attributes set for the file and there has been no reason to load the file data at this point. For now, if you need those flags to be up to date, your only option is to either use git_diff_foreach or create a git_patch.

\n", - "group": "diff" - }, - "git_diff_is_sorted_icase": { - "type": "function", - "file": "git2/diff.h", - "line": 1052, - "lineto": 1052, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "diff to check" - } - ], - "argline": "const git_diff *diff", - "sig": "const git_diff *", - "return": { - "type": "int", - "comment": " 0 if case sensitive, 1 if case is ignored" - }, - "description": "

Check if deltas are sorted case sensitively or insensitively.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_foreach": { - "type": "function", - "file": "git2/diff.h", - "line": 1080, - "lineto": 1086, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback function to make per file in the diff." - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Optional callback to make for binary files." - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Optional callback to make per hunk of text diff. This\n callback is called to describe a range of lines in the\n diff. It will not be issued for binary files." - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Optional callback to make per line of diff text. This\n same callback will be made for context lines, added, and\n removed lines, and even for a deleted trailing newline." - }, - { - "name": "payload", - "type": "void *", - "comment": "Reference pointer that will be passed to your callbacks." - } - ], - "argline": "git_diff *diff, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "git_diff *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all deltas in a diff issuing callbacks.

\n", - "comments": "

This will iterate through all of the files described in a diff. You should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the files will only be calculated if they are not NULL. Of course, these callbacks will not be invoked for binary files on the diff or for files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate the iteration and return the value to the user.

\n", - "group": "diff" - }, - "git_diff_status_char": { - "type": "function", - "file": "git2/diff.h", - "line": 1099, - "lineto": 1099, - "args": [ - { - "name": "status", - "type": "git_delta_t", - "comment": "The git_delta_t value to look up" - } - ], - "argline": "git_delta_t status", - "sig": "git_delta_t", - "return": { - "type": "char", - "comment": " The single character label for that code" - }, - "description": "

Look up the single character abbreviation for a delta status code.

\n", - "comments": "

When you run git diff --name-status it uses single letter codes in the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. This function converts a git_delta_t value into these letters for your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", - "group": "diff" - }, - "git_diff_print": { - "type": "function", - "file": "git2/diff.h", - "line": 1125, - "lineto": 1129, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - }, - { - "name": "format", - "type": "git_diff_format_t", - "comment": "A git_diff_format_t value to pick the text format." - }, - { - "name": "print_cb", - "type": "git_diff_line_cb", - "comment": "Callback to make per line of diff text." - }, - { - "name": "payload", - "type": "void *", - "comment": "Reference pointer that will be passed to your callback." - } - ], - "argline": "git_diff *diff, git_diff_format_t format, git_diff_line_cb print_cb, void *payload", - "sig": "git_diff *::git_diff_format_t::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Iterate over a diff generating formatted text output.

\n", - "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_print-10" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_diff_print-30" - ] - } - }, - "git_diff_to_buf": { - "type": "function", - "file": "git2/diff.h", - "line": 1141, - "lineto": 1144, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "A pointer to a user-allocated git_buf that will\n contain the diff text" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - }, - { - "name": "format", - "type": "git_diff_format_t", - "comment": "A git_diff_format_t value to pick the text format." - } - ], - "argline": "git_buf *out, git_diff *diff, git_diff_format_t format", - "sig": "git_buf *::git_diff *::git_diff_format_t", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Produce the complete formatted text output from a diff into a\n buffer.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_blobs": { - "type": "function", - "file": "git2/diff.h", - "line": 1181, - "lineto": 1191, - "args": [ - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "new_blob", - "type": "const git_blob *", - "comment": "Blob for new side of diff, or NULL for empty blob" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat new blob as if it had this filename; can be NULL" - }, - { - "name": "options", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Callback for binary files; can be NULL" - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Callback for each hunk in diff; can be NULL" - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Callback for each line in diff; can be NULL" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to each callback function" - } - ], - "argline": "const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Directly run a diff on two blobs.

\n", - "comments": "

Compared to a file, a blob lacks some contextual information. As such, the git_diff_file given to the callback will have some fake data; i.e. mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated as an empty blob, with the oid set to NULL in the git_diff_file data. Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob looks like binary data, the git_diff_delta binary attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass GIT_DIFF_FORCE_TEXT of course).

\n", - "group": "diff" - }, - "git_diff_blob_to_buffer": { - "type": "function", - "file": "git2/diff.h", - "line": 1218, - "lineto": 1229, - "args": [ - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "buffer_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "buffer_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "options", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Callback for binary files; can be NULL" - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Callback for each hunk in diff; can be NULL" - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Callback for each line in diff; can be NULL" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to each callback function" - } - ], - "argline": "const git_blob *old_blob, const char *old_as_path, const char *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "const git_blob *::const char *::const char *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Directly run a diff between a blob and a buffer.

\n", - "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the entire content of the buffer added). Passing NULL to the buffer will do the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", - "group": "diff" - }, - "git_diff_buffers": { - "type": "function", - "file": "git2/diff.h", - "line": 1252, - "lineto": 1264, - "args": [ - { - "name": "old_buffer", - "type": "const void *", - "comment": "Raw data for old side of diff, or NULL for empty" - }, - { - "name": "old_len", - "type": "size_t", - "comment": "Length of the raw data for old side of the diff" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old buffer as if it had this filename; can be NULL" - }, - { - "name": "new_buffer", - "type": "const void *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "new_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "options", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Callback for binary files; can be NULL" - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Callback for each hunk in diff; can be NULL" - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Callback for each line in diff; can be NULL" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to each callback function" - } - ], - "argline": "const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Directly run a diff between two buffers.

\n", - "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n", - "group": "diff" - }, - "git_diff_from_buffer": { - "type": "function", - "file": "git2/diff.h", - "line": 1285, - "lineto": 1288, - "args": [ - { - "name": "out", - "type": "git_diff **", - "comment": "A pointer to a git_diff pointer that will be allocated." - }, - { - "name": "content", - "type": "const char *", - "comment": "The contents of a patch file" - }, - { - "name": "content_len", - "type": "size_t", - "comment": "The length of the patch file contents" - } - ], - "argline": "git_diff **out, const char *content, size_t content_len", - "sig": "git_diff **::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the contents of a git patch file into a git_diff object.

\n", - "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_from_buffer-11" - ] - } - }, - "git_diff_get_stats": { - "type": "function", - "file": "git2/diff.h", - "line": 1324, - "lineto": 1326, - "args": [ - { - "name": "out", - "type": "git_diff_stats **", - "comment": "Structure containg the diff statistics." - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - } - ], - "argline": "git_diff_stats **out, git_diff *diff", - "sig": "git_diff_stats **::git_diff *", - "return": { - "type": "int", - "comment": " 0 on success; non-zero on error" - }, - "description": "

Accumulate diff statistics for all patches.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_get_stats-12" - ] - } - }, - "git_diff_stats_files_changed": { - "type": "function", - "file": "git2/diff.h", - "line": 1334, - "lineto": 1335, - "args": [ - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - } - ], - "argline": "const git_diff_stats *stats", - "sig": "const git_diff_stats *", - "return": { - "type": "size_t", - "comment": " total number of files changed in the diff" - }, - "description": "

Get the total number of files changed in a diff

\n", - "comments": "", - "group": "diff" - }, - "git_diff_stats_insertions": { - "type": "function", - "file": "git2/diff.h", - "line": 1343, - "lineto": 1344, - "args": [ - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - } - ], - "argline": "const git_diff_stats *stats", - "sig": "const git_diff_stats *", - "return": { - "type": "size_t", - "comment": " total number of insertions in the diff" - }, - "description": "

Get the total number of insertions in a diff

\n", - "comments": "", - "group": "diff" - }, - "git_diff_stats_deletions": { - "type": "function", - "file": "git2/diff.h", - "line": 1352, - "lineto": 1353, - "args": [ - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - } - ], - "argline": "const git_diff_stats *stats", - "sig": "const git_diff_stats *", - "return": { - "type": "size_t", - "comment": " total number of deletions in the diff" - }, - "description": "

Get the total number of deletions in a diff

\n", - "comments": "", - "group": "diff" - }, - "git_diff_stats_to_buf": { - "type": "function", - "file": "git2/diff.h", - "line": 1364, - "lineto": 1368, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer to store the formatted diff statistics in." - }, - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - }, - { - "name": "format", - "type": "git_diff_stats_format_t", - "comment": "Formatting option." - }, - { - "name": "width", - "type": "size_t", - "comment": "Target width for output (only affects GIT_DIFF_STATS_FULL)" - } - ], - "argline": "git_buf *out, const git_diff_stats *stats, git_diff_stats_format_t format, size_t width", - "sig": "git_buf *::const git_diff_stats *::git_diff_stats_format_t::size_t", - "return": { - "type": "int", - "comment": " 0 on success; non-zero on error" - }, - "description": "

Print diff statistics to a git_buf.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_stats_to_buf-13" - ] - } - }, - "git_diff_stats_free": { - "type": "function", - "file": "git2/diff.h", - "line": 1376, - "lineto": 1376, - "args": [ - { - "name": "stats", - "type": "git_diff_stats *", - "comment": "The previously created statistics object;\n cannot be used after free." - } - ], - "argline": "git_diff_stats *stats", - "sig": "git_diff_stats *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Deallocate a git_diff_stats.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_diff_stats_free-14" - ] - } - }, - "git_diff_patchid_options_init": { - "type": "function", - "file": "git2/diff.h", - "line": 1402, - "lineto": 1404, - "args": [ - { - "name": "opts", - "type": "git_diff_patchid_options *", - "comment": "The `git_diff_patchid_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_PATCHID_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_patchid_options *opts, unsigned int version", - "sig": "git_diff_patchid_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_patchid_options structure

\n", - "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", - "group": "diff" - }, - "git_diff_patchid": { - "type": "function", - "file": "git2/diff.h", - "line": 1425, - "lineto": 1425, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where the calculated patch ID should be stored" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "The diff to calculate the ID for" - }, - { - "name": "opts", - "type": "git_diff_patchid_options *", - "comment": "Options for how to calculate the patch ID. This is\n intended for future changes, as currently no options are\n available." - } - ], - "argline": "git_oid *out, git_diff *diff, git_diff_patchid_options *opts", - "sig": "git_oid *::git_diff *::git_diff_patchid_options *", - "return": { - "type": "int", - "comment": " 0 on success, an error code otherwise." - }, - "description": "

Calculate the patch ID for the given patch.

\n", - "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", - "group": "diff" - }, - "git_error_last": { - "type": "function", - "file": "git2/errors.h", - "line": 126, - "lineto": 126, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "const git_error *", - "comment": " A git_error object." - }, - "description": "

Return the last git_error object that was generated for the\n current thread.

\n", - "comments": "

The default behaviour of this function is to return NULL if no previous error has occurred. However, libgit2's error strings are not cleared aggressively, so a prior (unrelated) error may be returned. This can be avoided by only calling this function if the prior call to a libgit2 API returned an error.

\n", - "group": "error", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_error_last-11", - "ex/v1.3.1/checkout.html#git_error_last-12", - "ex/v1.3.1/checkout.html#git_error_last-13", - "ex/v1.3.1/checkout.html#git_error_last-14" - ], - "commit.c": [ - "ex/v1.3.1/commit.html#git_error_last-2" - ], - "config.c": [ - "ex/v1.3.1/config.html#git_error_last-6", - "ex/v1.3.1/config.html#git_error_last-7", - "ex/v1.3.1/config.html#git_error_last-8" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_error_last-33" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_error_last-8", - "ex/v1.3.1/merge.html#git_error_last-9" - ] - } - }, - "git_error_clear": { - "type": "function", - "file": "git2/errors.h", - "line": 131, - "lineto": 131, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Clear the last library error that occurred for this thread.

\n", - "comments": "", - "group": "error" - }, - "git_error_set_str": { - "type": "function", - "file": "git2/errors.h", - "line": 150, - "lineto": 150, - "args": [ - { - "name": "error_class", - "type": "int", - "comment": "One of the `git_error_t` enum above describing the\n general subsystem that is responsible for the error." - }, - { - "name": "string", - "type": "const char *", - "comment": "The formatted error message to keep" - } - ], - "argline": "int error_class, const char *string", - "sig": "int::const char *", - "return": { - "type": "int", - "comment": " 0 on success or -1 on failure" - }, - "description": "

Set the error message string for this thread.

\n", - "comments": "

This function is public so that custom ODB backends and the like can relay an error message through libgit2. Most regular users of libgit2 will never need to call this function -- actually, calling it in most circumstances (for example, calling from within a callback function) will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies to the particular thread that this libgit2 call is made from.

\n", - "group": "error" - }, - "git_error_set_oom": { - "type": "function", - "file": "git2/errors.h", - "line": 161, - "lineto": 161, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Set the error message to a special value for memory allocation failure.

\n", - "comments": "

The normal git_error_set_str() function attempts to strdup() the string that is passed in. This is not a good idea when the error in question is a memory allocation failure. That circumstance has a special setter function that sets the error string to a known and statically allocated internal value.

\n", - "group": "error" - }, - "git_filter_list_load": { - "type": "function", - "file": "git2/filter.h", - "line": 129, - "lineto": 135, - "args": [ - { - "name": "filters", - "type": "git_filter_list **", - "comment": "Output newly created git_filter_list (or NULL)" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object that contains `path`" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "The blob to which the filter will be applied (if known)" - }, - { - "name": "path", - "type": "const char *", - "comment": "Relative path of the file to be filtered" - }, - { - "name": "mode", - "type": "git_filter_mode_t", - "comment": "Filtering direction (WT->ODB or ODB->WT)" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of `git_filter_flag_t` flags" - } - ], - "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags", - "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t", - "return": { - "type": "int", - "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" - }, - "description": "

Load the filter list for a given path.

\n", - "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", - "group": "filter" - }, - "git_filter_list_load_ext": { - "type": "function", - "file": "git2/filter.h", - "line": 152, - "lineto": 158, - "args": [ - { - "name": "filters", - "type": "git_filter_list **", - "comment": "Output newly created git_filter_list (or NULL)" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object that contains `path`" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "The blob to which the filter will be applied (if known)" - }, - { - "name": "path", - "type": "const char *", - "comment": "Relative path of the file to be filtered" - }, - { - "name": "mode", - "type": "git_filter_mode_t", - "comment": "Filtering direction (WT->ODB or ODB->WT)" - }, - { - "name": "opts", - "type": "git_filter_options *", - "comment": "The `git_filter_options` to use when loading filters" - } - ], - "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, git_filter_options *opts", - "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::git_filter_options *", - "return": { - "type": "int", - "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" - }, - "description": "

Load the filter list for a given path.

\n", - "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", - "group": "filter" - }, - "git_filter_list_contains": { - "type": "function", - "file": "git2/filter.h", - "line": 172, - "lineto": 174, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "A loaded git_filter_list (or NULL)" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the filter to query" - } - ], - "argline": "git_filter_list *filters, const char *name", - "sig": "git_filter_list *::const char *", - "return": { - "type": "int", - "comment": " 1 if the filter is in the list, 0 otherwise" - }, - "description": "

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n", - "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", - "group": "filter" - }, - "git_filter_list_apply_to_buffer": { - "type": "function", - "file": "git2/filter.h", - "line": 185, - "lineto": 189, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Buffer to store the result of the filtering" - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": "A loaded git_filter_list (or NULL)" - }, - { - "name": "in", - "type": "const char *", - "comment": "Buffer containing the data to filter" - }, - { - "name": "in_len", - "type": "size_t", - "comment": "The length of the input buffer" - } - ], - "argline": "git_buf *out, git_filter_list *filters, const char *in, size_t in_len", - "sig": "git_buf *::git_filter_list *::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, an error code otherwise" - }, - "description": "

Apply filter list to a data buffer.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_apply_to_file": { - "type": "function", - "file": "git2/filter.h", - "line": 200, - "lineto": 204, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer into which to store the filtered file" - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the filtering" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" - } - ], - "argline": "git_buf *out, git_filter_list *filters, git_repository *repo, const char *path", - "sig": "git_buf *::git_filter_list *::git_repository *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Apply a filter list to the contents of a file on disk

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_apply_to_blob": { - "type": "function", - "file": "git2/filter.h", - "line": 213, - "lineto": 216, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer into which to store the filtered file" - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "the blob to filter" - } - ], - "argline": "git_buf *out, git_filter_list *filters, git_blob *blob", - "sig": "git_buf *::git_filter_list *::git_blob *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Apply a filter list to the contents of a blob

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_stream_buffer": { - "type": "function", - "file": "git2/filter.h", - "line": 226, - "lineto": 230, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "the buffer to filter" - }, - { - "name": "len", - "type": "size_t", - "comment": "the size of the buffer" - }, - { - "name": "target", - "type": "git_writestream *", - "comment": "the stream into which the data will be written" - } - ], - "argline": "git_filter_list *filters, const char *buffer, size_t len, git_writestream *target", - "sig": "git_filter_list *::const char *::size_t::git_writestream *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Apply a filter list to an arbitrary buffer as a stream

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_stream_file": { - "type": "function", - "file": "git2/filter.h", - "line": 241, - "lineto": 245, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the filtering" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" - }, - { - "name": "target", - "type": "git_writestream *", - "comment": "the stream into which the data will be written" - } - ], - "argline": "git_filter_list *filters, git_repository *repo, const char *path, git_writestream *target", - "sig": "git_filter_list *::git_repository *::const char *::git_writestream *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Apply a filter list to a file as a stream

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_stream_blob": { - "type": "function", - "file": "git2/filter.h", - "line": 254, - "lineto": 257, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "the blob to filter" - }, - { - "name": "target", - "type": "git_writestream *", - "comment": "the stream into which the data will be written" - } - ], - "argline": "git_filter_list *filters, git_blob *blob, git_writestream *target", - "sig": "git_filter_list *::git_blob *::git_writestream *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Apply a filter list to a blob as a stream

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_free": { - "type": "function", - "file": "git2/filter.h", - "line": 264, - "lineto": 264, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "A git_filter_list created by `git_filter_list_load`" - } - ], - "argline": "git_filter_list *filters", - "sig": "git_filter_list *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a git_filter_list

\n", - "comments": "", - "group": "filter" - }, - "git_libgit2_init": { - "type": "function", - "file": "git2/global.h", - "line": 26, - "lineto": 26, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": " the number of initializations of the library, or an error code." - }, - "description": "

Init the global state

\n", - "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", - "group": "libgit2", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_libgit2_init-34" - ] - } - }, - "git_libgit2_shutdown": { - "type": "function", - "file": "git2/global.h", - "line": 39, - "lineto": 39, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": " the number of remaining initializations of the library, or an\n error code." - }, - "description": "

Shutdown the global state

\n", - "comments": "

Clean up the global state and threading context after calling it as many times as git_libgit2_init() was called - it will return the number of remainining initializations that have not been shutdown (after this one).

\n", - "group": "libgit2" - }, - "git_graph_ahead_behind": { - "type": "function", - "file": "git2/graph.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "ahead", - "type": "size_t *", - "comment": "number of unique from commits in `upstream`" - }, - { - "name": "behind", - "type": "size_t *", - "comment": "number of unique from commits in `local`" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "local", - "type": "const git_oid *", - "comment": "the commit for local" - }, - { - "name": "upstream", - "type": "const git_oid *", - "comment": "the commit for upstream" - } - ], - "argline": "size_t *ahead, size_t *behind, git_repository *repo, const git_oid *local, const git_oid *upstream", - "sig": "size_t *::size_t *::git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Count the number of unique commits between two commit objects

\n", - "comments": "

There is no need for branches containing the commits to have any upstream relationship, but it helps to think of one as a branch and the other as its upstream, the ahead and behind values will be what git would report for the branches.

\n", - "group": "graph" - }, - "git_graph_descendant_of": { - "type": "function", - "file": "git2/graph.h", - "line": 52, - "lineto": 55, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "commit", - "type": "const git_oid *", - "comment": "a previously loaded commit" - }, - { - "name": "ancestor", - "type": "const git_oid *", - "comment": "a potential ancestor commit" - } - ], - "argline": "git_repository *repo, const git_oid *commit, const git_oid *ancestor", - "sig": "git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise." - }, - "description": "

Determine if a commit is the descendant of another commit.

\n", - "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", - "group": "graph" - }, - "git_graph_reachable_from_any": { - "type": "function", - "file": "git2/graph.h", - "line": 68, - "lineto": 72, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "commit", - "type": "const git_oid *", - "comment": "a previously loaded commit" - }, - { - "name": "descendant_array", - "type": "const git_oid []", - "comment": "oids of the commits" - }, - { - "name": "length", - "type": "size_t", - "comment": "the number of commits in the provided `descendant_array`" - } - ], - "argline": "git_repository *repo, const git_oid *commit, const git_oid [] descendant_array, size_t length", - "sig": "git_repository *::const git_oid *::const git_oid []::size_t", - "return": { - "type": "int", - "comment": " 1 if the given commit is an ancestor of any of the given potential\n descendants, 0 if not, error code otherwise." - }, - "description": "

Determine if a commit is reachable from any of a list of commits by\n following parent edges.

\n", - "comments": "", - "group": "graph" - }, - "git_ignore_add_rule": { - "type": "function", - "file": "git2/ignore.h", - "line": 37, - "lineto": 39, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository to add ignore rules to." - }, - { - "name": "rules", - "type": "const char *", - "comment": "Text of rules, a la the contents of a .gitignore file.\n It is okay to have multiple rules in the text; if so,\n each rule should be terminated with a newline." - } - ], - "argline": "git_repository *repo, const char *rules", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success" - }, - "description": "

Add ignore rules for a repository.

\n", - "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from .gitignore files in the repository tree or from a shared system file only if a "core.excludesfile" config value is set. The library also keeps a set of per-repository internal ignores that can be configured in-memory and will not persist. This function allows you to add to that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c/ with space");\n
\n\n

This would add three rules to the ignores.

\n", - "group": "ignore" - }, - "git_ignore_clear_internal_rules": { - "type": "function", - "file": "git2/ignore.h", - "line": 52, - "lineto": 53, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository to remove ignore rules from." - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success" - }, - "description": "

Clear ignore rules that were explicitly added.

\n", - "comments": "

Resets to the default internal ignore rules. This will not turn off rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", - "group": "ignore" - }, - "git_ignore_path_is_ignored": { - "type": "function", - "file": "git2/ignore.h", - "line": 71, - "lineto": 74, - "args": [ - { - "name": "ignored", - "type": "int *", - "comment": "boolean returning 0 if the file is not ignored, 1 if it is" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - }, - { - "name": "path", - "type": "const char *", - "comment": "the file to check ignores for, relative to the repo's workdir." - } - ], - "argline": "int *ignored, git_repository *repo, const char *path", - "sig": "int *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." - }, - "description": "

Test if the ignore rules apply to a given path.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index" on the given file, would it be shown or not?

\n", - "group": "ignore" - }, - "git_index_open": { - "type": "function", - "file": "git2/index.h", - "line": 187, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "the pointer for the new index" - }, - { - "name": "index_path", - "type": "const char *", - "comment": "the path to the index file in disk" - } - ], - "argline": "git_index **out, const char *index_path", - "sig": "git_index **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new bare Git index object as a memory representation\n of the Git index file in 'index_path', without a repository\n to back it.

\n", - "comments": "

Since there is no ODB or working directory behind this index, any Index methods which rely on these (e.g. index_add_bypath) will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository, use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n", - "group": "index" - }, - "git_index_new": { - "type": "function", - "file": "git2/index.h", - "line": 200, - "lineto": 200, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "the pointer for the new index" - } - ], - "argline": "git_index **out", - "sig": "git_index **", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an in-memory index object.

\n", - "comments": "

This index object cannot be read/written to the filesystem, but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n", - "group": "index" - }, - "git_index_free": { - "type": "function", - "file": "git2/index.h", - "line": 207, - "lineto": 207, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an existing index object.

\n", - "comments": "", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.3.1/add.html#git_index_free-1" - ], - "commit.c": [ - "ex/v1.3.1/commit.html#git_index_free-3" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_index_free-35" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_index_free-2" - ], - "ls-files.c": [ - "ex/v1.3.1/ls-files.html#git_index_free-1" - ] - } - }, - "git_index_owner": { - "type": "function", - "file": "git2/index.h", - "line": 215, - "lineto": 215, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "The index" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "git_repository *", - "comment": " A pointer to the repository" - }, - "description": "

Get the repository this index relates to

\n", - "comments": "", - "group": "index" - }, - "git_index_caps": { - "type": "function", - "file": "git2/index.h", - "line": 223, - "lineto": 223, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "An existing index object" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "int", - "comment": " A combination of GIT_INDEX_CAPABILITY values" - }, - "description": "

Read index capabilities flags.

\n", - "comments": "", - "group": "index" - }, - "git_index_set_caps": { - "type": "function", - "file": "git2/index.h", - "line": 236, - "lineto": 236, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "caps", - "type": "int", - "comment": "A combination of GIT_INDEX_CAPABILITY values" - } - ], - "argline": "git_index *index, int caps", - "sig": "git_index *::int", - "return": { - "type": "int", - "comment": " 0 on success, -1 on failure" - }, - "description": "

Set index capabilities flags.

\n", - "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then capabilities will be read from the config of the owner object, looking at core.ignorecase, core.filemode, core.symlinks.

\n", - "group": "index" - }, - "git_index_version": { - "type": "function", - "file": "git2/index.h", - "line": 248, - "lineto": 248, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "unsigned int", - "comment": " the index version" - }, - "description": "

Get index on-disk version.

\n", - "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index with version 2 may be written instead, if the extension data in version 3 is not necessary.

\n", - "group": "index" - }, - "git_index_set_version": { - "type": "function", - "file": "git2/index.h", - "line": 261, - "lineto": 261, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The new version number" - } - ], - "argline": "git_index *index, unsigned int version", - "sig": "git_index *::unsigned int", - "return": { - "type": "int", - "comment": " 0 on success, -1 on failure" - }, - "description": "

Set index on-disk version.

\n", - "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may write an index with version 3 instead, if necessary to accurately represent the index.

\n", - "group": "index" - }, - "git_index_read": { - "type": "function", - "file": "git2/index.h", - "line": 280, - "lineto": 280, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "force", - "type": "int", - "comment": "if true, always reload, vs. only read if file has changed" - } - ], - "argline": "git_index *index, int force", - "sig": "git_index *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n", - "comments": "

If force is true, this performs a "hard" read that discards in-memory changes and always reloads the on-disk index data. If there is no on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index data from disk only if it has changed since the last time it was loaded. Purely in-memory index data will be untouched. Be aware: if there are changes on disk, unwritten in-memory changes are discarded.

\n", - "group": "index" - }, - "git_index_write": { - "type": "function", - "file": "git2/index.h", - "line": 289, - "lineto": 289, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an existing index object from memory back to disk\n using an atomic file lock.

\n", - "comments": "", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.3.1/add.html#git_index_write-2" - ], - "commit.c": [ - "ex/v1.3.1/commit.html#git_index_write-4" - ] - } - }, - "git_index_path": { - "type": "function", - "file": "git2/index.h", - "line": 297, - "lineto": 297, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "an existing index object" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "const char *", - "comment": " path to index file or NULL for in-memory index" - }, - "description": "

Get the full path to the index file on disk.

\n", - "comments": "", - "group": "index" - }, - "git_index_checksum": { - "type": "function", - "file": "git2/index.h", - "line": 309, - "lineto": 309, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the checksum of the index" - }, - "description": "

Get the checksum of the index

\n", - "comments": "

This checksum is the SHA-1 hash over the index file (except the last 20 bytes which are the checksum itself). In cases where the index does not exist on-disk, it will be zeroed out.

\n", - "group": "index" - }, - "git_index_read_tree": { - "type": "function", - "file": "git2/index.h", - "line": 320, - "lineto": 320, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "tree to read" - } - ], - "argline": "git_index *index, const git_tree *tree", - "sig": "git_index *::const git_tree *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read a tree into the index file with stats

\n", - "comments": "

The current index contents will be replaced by the specified tree.

\n", - "group": "index" - }, - "git_index_write_tree": { - "type": "function", - "file": "git2/index.h", - "line": 341, - "lineto": 341, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the written tree" - }, - { - "name": "index", - "type": "git_index *", - "comment": "Index to write" - } - ], - "argline": "git_oid *out, git_index *index", - "sig": "git_oid *::git_index *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" - }, - "description": "

Write the index as a tree

\n", - "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", - "group": "index", - "examples": { - "commit.c": [ - "ex/v1.3.1/commit.html#git_index_write_tree-5" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_index_write_tree-3" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_index_write_tree-10" - ] - } - }, - "git_index_write_tree_to": { - "type": "function", - "file": "git2/index.h", - "line": 358, - "lineto": 358, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where to store OID of the written tree" - }, - { - "name": "index", - "type": "git_index *", - "comment": "Index to write" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to write the tree" - } - ], - "argline": "git_oid *out, git_index *index, git_repository *repo", - "sig": "git_oid *::git_index *::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" - }, - "description": "

Write the index as a tree to the given repository

\n", - "comments": "

This method will do the same as git_index_write_tree, but letting the user choose the repository where the tree will be written.

\n\n

The index must not contain any file in conflict.

\n", - "group": "index" - }, - "git_index_entrycount": { - "type": "function", - "file": "git2/index.h", - "line": 377, - "lineto": 377, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "an existing index object" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "size_t", - "comment": " integer of count of current entries" - }, - "description": "

Get the count of entries currently in the index

\n", - "comments": "", - "group": "index", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_index_entrycount-36" - ], - "ls-files.c": [ - "ex/v1.3.1/ls-files.html#git_index_entrycount-2" - ] - } - }, - "git_index_clear": { - "type": "function", - "file": "git2/index.h", - "line": 388, - "lineto": 388, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "int", - "comment": " 0 on success, error code \n<\n 0 on failure" - }, - "description": "

Clear the contents (all the entries) of an index object.

\n", - "comments": "

This clears the index object in memory; changes must be explicitly written to disk for them to take effect persistently.

\n", - "group": "index" - }, - "git_index_get_byindex": { - "type": "function", - "file": "git2/index.h", - "line": 401, - "lineto": 402, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "n", - "type": "size_t", - "comment": "the position of the entry" - } - ], - "argline": "git_index *index, size_t n", - "sig": "git_index *::size_t", - "return": { - "type": "const git_index_entry *", - "comment": " a pointer to the entry; NULL if out of bounds" - }, - "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", - "group": "index", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_index_get_byindex-37" - ], - "ls-files.c": [ - "ex/v1.3.1/ls-files.html#git_index_get_byindex-3" - ] - } - }, - "git_index_get_bypath": { - "type": "function", - "file": "git2/index.h", - "line": 416, - "lineto": 417, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - }, - { - "name": "stage", - "type": "int", - "comment": "stage to search" - } - ], - "argline": "git_index *index, const char *path, int stage", - "sig": "git_index *::const char *::int", - "return": { - "type": "const git_index_entry *", - "comment": " a pointer to the entry; NULL if it was not found" - }, - "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", - "group": "index", - "examples": { - "ls-files.c": [ - "ex/v1.3.1/ls-files.html#git_index_get_bypath-4" - ] - } - }, - "git_index_remove": { - "type": "function", - "file": "git2/index.h", - "line": 427, - "lineto": 427, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - }, - { - "name": "stage", - "type": "int", - "comment": "stage to search" - } - ], - "argline": "git_index *index, const char *path, int stage", - "sig": "git_index *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove an entry from the index

\n", - "comments": "", - "group": "index" - }, - "git_index_remove_directory": { - "type": "function", - "file": "git2/index.h", - "line": 437, - "lineto": 438, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "dir", - "type": "const char *", - "comment": "container directory path" - }, - { - "name": "stage", - "type": "int", - "comment": "stage to search" - } - ], - "argline": "git_index *index, const char *dir, int stage", - "sig": "git_index *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove all entries from the index under a given directory

\n", - "comments": "", - "group": "index" - }, - "git_index_add": { - "type": "function", - "file": "git2/index.h", - "line": 454, - "lineto": 454, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "source_entry", - "type": "const git_index_entry *", - "comment": "new entry object" - } - ], - "argline": "git_index *index, const git_index_entry *source_entry", - "sig": "git_index *::const git_index_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an index entry from an in-memory struct

\n", - "comments": "

If a previous index entry exists that has the same path and stage as the given 'source_entry', it will be replaced. Otherwise, the 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given 'source_entry' will be inserted on the index.

\n", - "group": "index" - }, - "git_index_entry_stage": { - "type": "function", - "file": "git2/index.h", - "line": 466, - "lineto": 466, - "args": [ - { - "name": "entry", - "type": "const git_index_entry *", - "comment": "The entry" - } - ], - "argline": "const git_index_entry *entry", - "sig": "const git_index_entry *", - "return": { - "type": "int", - "comment": " the stage number" - }, - "description": "

Return the stage number from a git index entry

\n", - "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags & GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT\n
\n", - "group": "index" - }, - "git_index_entry_is_conflict": { - "type": "function", - "file": "git2/index.h", - "line": 475, - "lineto": 475, - "args": [ - { - "name": "entry", - "type": "const git_index_entry *", - "comment": "The entry" - } - ], - "argline": "const git_index_entry *entry", - "sig": "const git_index_entry *", - "return": { - "type": "int", - "comment": " 1 if the entry is a conflict entry, 0 otherwise" - }, - "description": "

Return whether the given index entry is a conflict (has a high stage\n entry). This is simply shorthand for git_index_entry_stage > 0.

\n", - "comments": "", - "group": "index" - }, - "git_index_iterator_new": { - "type": "function", - "file": "git2/index.h", - "line": 495, - "lineto": 497, - "args": [ - { - "name": "iterator_out", - "type": "git_index_iterator **", - "comment": "The newly created iterator" - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to iterate" - } - ], - "argline": "git_index_iterator **iterator_out, git_index *index", - "sig": "git_index_iterator **::git_index *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an iterator that will return every entry contained in the\n index at the time of creation. Entries are returned in order,\n sorted by path. This iterator is backed by a snapshot that allows\n callers to modify the index while iterating without affecting the\n iterator.

\n", - "comments": "", - "group": "index" - }, - "git_index_iterator_next": { - "type": "function", - "file": "git2/index.h", - "line": 506, - "lineto": 508, - "args": [ - { - "name": "out", - "type": "const git_index_entry **", - "comment": "Pointer to store the index entry in" - }, - { - "name": "iterator", - "type": "git_index_iterator *", - "comment": "The iterator" - } - ], - "argline": "const git_index_entry **out, git_index_iterator *iterator", - "sig": "const git_index_entry **::git_index_iterator *", - "return": { - "type": "int", - "comment": " 0, GIT_ITEROVER on iteration completion or an error code" - }, - "description": "

Return the next index entry in-order from the iterator.

\n", - "comments": "", - "group": "index" - }, - "git_index_iterator_free": { - "type": "function", - "file": "git2/index.h", - "line": 515, - "lineto": 515, - "args": [ - { - "name": "iterator", - "type": "git_index_iterator *", - "comment": "The iterator to free" - } - ], - "argline": "git_index_iterator *iterator", - "sig": "git_index_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the index iterator

\n", - "comments": "", - "group": "index" - }, - "git_index_add_bypath": { - "type": "function", - "file": "git2/index.h", - "line": 546, - "lineto": 546, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "filename to add" - } - ], - "argline": "git_index *index, const char *path", - "sig": "git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an index entry from a file on disk

\n", - "comments": "

The file path must be relative to the repository's working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", - "group": "index" - }, - "git_index_add_from_buffer": { - "type": "function", - "file": "git2/index.h", - "line": 574, - "lineto": 577, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "entry", - "type": "const git_index_entry *", - "comment": "filename to add" - }, - { - "name": "buffer", - "type": "const void *", - "comment": "data to be written into the blob" - }, - { - "name": "len", - "type": "size_t", - "comment": "length of the data" - } - ], - "argline": "git_index *index, const git_index_entry *entry, const void *buffer, size_t len", - "sig": "git_index *::const git_index_entry *::const void *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an index entry from a buffer in memory

\n", - "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", - "group": "index" - }, - "git_index_remove_bypath": { - "type": "function", - "file": "git2/index.h", - "line": 593, - "lineto": 593, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "filename to remove" - } - ], - "argline": "git_index *index, const char *path", - "sig": "git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove an index entry corresponding to a file on disk

\n", - "comments": "

The file path must be relative to the repository's working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", - "group": "index" - }, - "git_index_add_all": { - "type": "function", - "file": "git2/index.h", - "line": 641, - "lineto": 646, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "array of path patterns" - }, - { - "name": "flags", - "type": "unsigned int", - "comment": "combination of git_index_add_option_t flags" - }, - { - "name": "callback", - "type": "git_index_matched_path_cb", - "comment": "notification callback for each added/updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." - }, - { - "name": "payload", - "type": "void *", - "comment": "payload passed through to callback function" - } - ], - "argline": "git_index *index, const git_strarray *pathspec, unsigned int flags, git_index_matched_path_cb callback, void *payload", - "sig": "git_index *::const git_strarray *::unsigned int::git_index_matched_path_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, negative callback return value, or error code" - }, - "description": "

Add or update index entries matching files in the working directory.

\n", - "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.3.1/add.html#git_index_add_all-3" - ] - } - }, - "git_index_remove_all": { - "type": "function", - "file": "git2/index.h", - "line": 663, - "lineto": 667, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "array of path patterns" - }, - { - "name": "callback", - "type": "git_index_matched_path_cb", - "comment": "notification callback for each removed path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." - }, - { - "name": "payload", - "type": "void *", - "comment": "payload passed through to callback function" - } - ], - "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", - "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, negative callback return value, or error code" - }, - "description": "

Remove all matching index entries.

\n", - "comments": "

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is removed. Return 0 to remove the item, > 0 to skip the item, and < 0 to abort the scan.

\n", - "group": "index" - }, - "git_index_update_all": { - "type": "function", - "file": "git2/index.h", - "line": 692, - "lineto": 696, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "array of path patterns" - }, - { - "name": "callback", - "type": "git_index_matched_path_cb", - "comment": "notification callback for each updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." - }, - { - "name": "payload", - "type": "void *", - "comment": "payload passed through to callback function" - } - ], - "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", - "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, negative callback return value, or error code" - }, - "description": "

Update all index entries to match the working directory

\n", - "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.3.1/add.html#git_index_update_all-4" - ] - } - }, - "git_index_find": { - "type": "function", - "file": "git2/index.h", - "line": 707, - "lineto": 707, - "args": [ - { - "name": "at_pos", - "type": "size_t *", - "comment": "the address to which the position of the index entry is written (optional)" - }, - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - } - ], - "argline": "size_t *at_pos, git_index *index, const char *path", - "sig": "size_t *::git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Find the first position of any entries which point to given\n path in the Git index.

\n", - "comments": "", - "group": "index" - }, - "git_index_find_prefix": { - "type": "function", - "file": "git2/index.h", - "line": 718, - "lineto": 718, - "args": [ - { - "name": "at_pos", - "type": "size_t *", - "comment": "the address to which the position of the index entry is written (optional)" - }, - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "prefix", - "type": "const char *", - "comment": "the prefix to search for" - } - ], - "argline": "size_t *at_pos, git_index *index, const char *prefix", - "sig": "size_t *::git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Find the first position of any entries matching a prefix. To find the first position\n of a path inside a given folder, suffix the prefix with a '/'.

\n", - "comments": "", - "group": "index" - }, - "git_index_conflict_add": { - "type": "function", - "file": "git2/index.h", - "line": 743, - "lineto": 747, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "ancestor_entry", - "type": "const git_index_entry *", - "comment": "the entry data for the ancestor of the conflict" - }, - { - "name": "our_entry", - "type": "const git_index_entry *", - "comment": "the entry data for our side of the merge conflict" - }, - { - "name": "their_entry", - "type": "const git_index_entry *", - "comment": "the entry data for their side of the merge conflict" - } - ], - "argline": "git_index *index, const git_index_entry *ancestor_entry, const git_index_entry *our_entry, const git_index_entry *their_entry", - "sig": "git_index *::const git_index_entry *::const git_index_entry *::const git_index_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n", - "comments": "

The entries are the entries from the tree included in the merge. Any entry may be null to indicate that that file was not present in the trees during the merge. For example, ancestor_entry may be NULL to indicate that a file was added in both branches and must be resolved.

\n", - "group": "index" - }, - "git_index_conflict_get": { - "type": "function", - "file": "git2/index.h", - "line": 763, - "lineto": 768, - "args": [ - { - "name": "ancestor_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the ancestor entry" - }, - { - "name": "our_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the our entry" - }, - { - "name": "their_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the their entry" - }, - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - } - ], - "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index *index, const char *path", - "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the index entries that represent a conflict of a single file.

\n", - "comments": "

The entries are not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", - "group": "index" - }, - "git_index_conflict_remove": { - "type": "function", - "file": "git2/index.h", - "line": 777, - "lineto": 777, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to remove conflicts for" - } - ], - "argline": "git_index *index, const char *path", - "sig": "git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Removes the index entries that represent a conflict of a single file.

\n", - "comments": "", - "group": "index" - }, - "git_index_conflict_cleanup": { - "type": "function", - "file": "git2/index.h", - "line": 785, - "lineto": 785, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove all conflicts in the index (entries with a stage greater than 0).

\n", - "comments": "", - "group": "index" - }, - "git_index_has_conflicts": { - "type": "function", - "file": "git2/index.h", - "line": 792, - "lineto": 792, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": null - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "int", - "comment": " 1 if at least one conflict is found, 0 otherwise." - }, - "description": "

Determine if the index contains entries representing file conflicts.

\n", - "comments": "", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_index_has_conflicts-11" - ] - } - }, - "git_index_conflict_iterator_new": { - "type": "function", - "file": "git2/index.h", - "line": 803, - "lineto": 805, - "args": [ - { - "name": "iterator_out", - "type": "git_index_conflict_iterator **", - "comment": "The newly created conflict iterator" - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to scan" - } - ], - "argline": "git_index_conflict_iterator **iterator_out, git_index *index", - "sig": "git_index_conflict_iterator **::git_index *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an iterator for the conflicts in the index.

\n", - "comments": "

The index must not be modified while iterating; the results are undefined.

\n", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_index_conflict_iterator_new-12" - ] - } - }, - "git_index_conflict_next": { - "type": "function", - "file": "git2/index.h", - "line": 817, - "lineto": 821, - "args": [ - { - "name": "ancestor_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the ancestor side of the conflict" - }, - { - "name": "our_out", - "type": "const git_index_entry **", - "comment": "Pointer to store our side of the conflict" - }, - { - "name": "their_out", - "type": "const git_index_entry **", - "comment": "Pointer to store their side of the conflict" - }, - { - "name": "iterator", - "type": "git_index_conflict_iterator *", - "comment": null - } - ], - "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index_conflict_iterator *iterator", - "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index_conflict_iterator *", - "return": { - "type": "int", - "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" - }, - "description": "

Returns the current conflict (ancestor, ours and theirs entry) and\n advance the iterator internally to the next value.

\n", - "comments": "", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_index_conflict_next-13" - ] - } - }, - "git_index_conflict_iterator_free": { - "type": "function", - "file": "git2/index.h", - "line": 828, - "lineto": 829, - "args": [ - { - "name": "iterator", - "type": "git_index_conflict_iterator *", - "comment": "pointer to the iterator" - } - ], - "argline": "git_index_conflict_iterator *iterator", - "sig": "git_index_conflict_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees a git_index_conflict_iterator.

\n", - "comments": "", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_index_conflict_iterator_free-14" - ] - } - }, - "git_indexer_options_init": { - "type": "function", - "file": "git2/indexer.h", - "line": 86, - "lineto": 88, - "args": [ - { - "name": "opts", - "type": "git_indexer_options *", - "comment": "the `git_indexer_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION`" - } - ], - "argline": "git_indexer_options *opts, unsigned int version", - "sig": "git_indexer_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_indexer_options with default values. Equivalent to\n creating an instance with GIT_INDEXER_OPTIONS_INIT.

\n", - "comments": "", - "group": "indexer" - }, - "git_indexer_new": { - "type": "function", - "file": "git2/indexer.h", - "line": 102, - "lineto": 107, - "args": [ - { - "name": "out", - "type": "git_indexer **", - "comment": "where to store the indexer instance" - }, - { - "name": "path", - "type": "const char *", - "comment": "to the directory where the packfile should be stored" - }, - { - "name": "mode", - "type": "unsigned int", - "comment": "permissions to use creating packfile or 0 for defaults" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "object database from which to read base objects when\n fixing thin packs. Pass NULL if no thin pack is expected (an error\n will be returned if there are bases missing)" - }, - { - "name": "opts", - "type": "git_indexer_options *", - "comment": "Optional structure containing additional options. See\n `git_indexer_options` above." - } - ], - "argline": "git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_indexer_options *opts", - "sig": "git_indexer **::const char *::unsigned int::git_odb *::git_indexer_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a new indexer instance

\n", - "comments": "", - "group": "indexer" - }, - "git_indexer_append": { - "type": "function", - "file": "git2/indexer.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "idx", - "type": "git_indexer *", - "comment": "the indexer" - }, - { - "name": "data", - "type": "const void *", - "comment": "the data to add" - }, - { - "name": "size", - "type": "size_t", - "comment": "the size of the data in bytes" - }, - { - "name": "stats", - "type": "git_indexer_progress *", - "comment": "stat storage" - } - ], - "argline": "git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats", - "sig": "git_indexer *::const void *::size_t::git_indexer_progress *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Add data to the indexer

\n", - "comments": "", - "group": "indexer" - }, - "git_indexer_commit": { - "type": "function", - "file": "git2/indexer.h", - "line": 126, - "lineto": 126, - "args": [ - { - "name": "idx", - "type": "git_indexer *", - "comment": "the indexer" - }, - { - "name": "stats", - "type": "git_indexer_progress *", - "comment": null - } - ], - "argline": "git_indexer *idx, git_indexer_progress *stats", - "sig": "git_indexer *::git_indexer_progress *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Finalize the pack and index

\n", - "comments": "

Resolve any pending deltas and write out the index file

\n", - "group": "indexer" - }, - "git_indexer_hash": { - "type": "function", - "file": "git2/indexer.h", - "line": 136, - "lineto": 136, - "args": [ - { - "name": "idx", - "type": "const git_indexer *", - "comment": "the indexer instance" - } - ], - "argline": "const git_indexer *idx", - "sig": "const git_indexer *", - "return": { - "type": "const git_oid *", - "comment": null - }, - "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the index has been finalized.

\n", - "group": "indexer" - }, - "git_indexer_free": { - "type": "function", - "file": "git2/indexer.h", - "line": 143, - "lineto": 143, - "args": [ - { - "name": "idx", - "type": "git_indexer *", - "comment": "the indexer to free" - } - ], - "argline": "git_indexer *idx", - "sig": "git_indexer *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the indexer and its resources

\n", - "comments": "", - "group": "indexer" - }, - "git_mailmap_new": { - "type": "function", - "file": "git2/mailmap.h", - "line": 32, - "lineto": 32, - "args": [ - { - "name": "out", - "type": "git_mailmap **", - "comment": "pointer to store the new mailmap" - } - ], - "argline": "git_mailmap **out", - "sig": "git_mailmap **", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Allocate a new mailmap object.

\n", - "comments": "

This object is empty, so you'll have to add a mailmap file before you can do anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", - "group": "mailmap" - }, - "git_mailmap_free": { - "type": "function", - "file": "git2/mailmap.h", - "line": 39, - "lineto": 39, - "args": [ - { - "name": "mm", - "type": "git_mailmap *", - "comment": "the mailmap to free" - } - ], - "argline": "git_mailmap *mm", - "sig": "git_mailmap *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the mailmap and its associated memory.

\n", - "comments": "", - "group": "mailmap" - }, - "git_mailmap_add_entry": { - "type": "function", - "file": "git2/mailmap.h", - "line": 52, - "lineto": 54, - "args": [ - { - "name": "mm", - "type": "git_mailmap *", - "comment": "mailmap to add the entry to" - }, - { - "name": "real_name", - "type": "const char *", - "comment": "the real name to use, or NULL" - }, - { - "name": "real_email", - "type": "const char *", - "comment": "the real email to use, or NULL" - }, - { - "name": "replace_name", - "type": "const char *", - "comment": "the name to replace, or NULL" - }, - { - "name": "replace_email", - "type": "const char *", - "comment": "the email to replace" - } - ], - "argline": "git_mailmap *mm, const char *real_name, const char *real_email, const char *replace_name, const char *replace_email", - "sig": "git_mailmap *::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Add a single entry to the given mailmap object. If the entry already exists,\n it will be replaced with the new entry.

\n", - "comments": "", - "group": "mailmap" - }, - "git_mailmap_from_buffer": { - "type": "function", - "file": "git2/mailmap.h", - "line": 64, - "lineto": 65, - "args": [ - { - "name": "out", - "type": "git_mailmap **", - "comment": "pointer to store the new mailmap" - }, - { - "name": "buf", - "type": "const char *", - "comment": "buffer to parse the mailmap from" - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the input buffer" - } - ], - "argline": "git_mailmap **out, const char *buf, size_t len", - "sig": "git_mailmap **::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new mailmap instance containing a single mailmap file

\n", - "comments": "", - "group": "mailmap" - }, - "git_mailmap_from_repository": { - "type": "function", - "file": "git2/mailmap.h", - "line": 81, - "lineto": 82, - "args": [ - { - "name": "out", - "type": "git_mailmap **", - "comment": "pointer to store the new mailmap" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository to load mailmap information from" - } - ], - "argline": "git_mailmap **out, git_repository *repo", - "sig": "git_mailmap **::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new mailmap instance from a repository, loading mailmap files based\n on the repository's configuration.

\n", - "comments": "

Mailmaps are loaded in the following order: 1. '.mailmap' in the root of the repository's working directory, if present. 2. The blob object identified by the 'mailmap.blob' config entry, if set. [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories] 3. The path in the 'mailmap.file' config entry, if set.

\n", - "group": "mailmap" - }, - "git_mailmap_resolve": { - "type": "function", - "file": "git2/mailmap.h", - "line": 96, - "lineto": 98, - "args": [ - { - "name": "real_name", - "type": "const char **", - "comment": "pointer to store the real name" - }, - { - "name": "real_email", - "type": "const char **", - "comment": "pointer to store the real email" - }, - { - "name": "mm", - "type": "const git_mailmap *", - "comment": "the mailmap to perform a lookup with (may be NULL)" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name to look up" - }, - { - "name": "email", - "type": "const char *", - "comment": "the email to look up" - } - ], - "argline": "const char **real_name, const char **real_email, const git_mailmap *mm, const char *name, const char *email", - "sig": "const char **::const char **::const git_mailmap *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Resolve a name and email to the corresponding real name and email.

\n", - "comments": "

The lifetime of the strings are tied to mm, name, and email parameters.

\n", - "group": "mailmap" - }, - "git_mailmap_resolve_signature": { - "type": "function", - "file": "git2/mailmap.h", - "line": 110, - "lineto": 111, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature" - }, - { - "name": "mm", - "type": "const git_mailmap *", - "comment": "mailmap to resolve with" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to resolve" - } - ], - "argline": "git_signature **out, const git_mailmap *mm, const git_signature *sig", - "sig": "git_signature **::const git_mailmap *::const git_signature *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Resolve a signature to use real names and emails with a mailmap.

\n", - "comments": "

Call git_signature_free() to free the data.

\n", - "group": "mailmap" - }, - "git_merge_file_input_init": { - "type": "function", - "file": "git2/merge.h", - "line": 60, - "lineto": 62, - "args": [ - { - "name": "opts", - "type": "git_merge_file_input *", - "comment": "the `git_merge_file_input` instance to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_MERGE_FILE_INPUT_VERSION` here." - } - ], - "argline": "git_merge_file_input *opts, unsigned int version", - "sig": "git_merge_file_input *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_merge_file_input with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_INPUT_INIT.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_file_options_init": { - "type": "function", - "file": "git2/merge.h", - "line": 215, - "lineto": 215, - "args": [ - { - "name": "opts", - "type": "git_merge_file_options *", - "comment": "The `git_merge_file_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_MERGE_FILE_OPTIONS_VERSION`." - } - ], - "argline": "git_merge_file_options *opts, unsigned int version", - "sig": "git_merge_file_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_merge_file_options structure

\n", - "comments": "

Initializes a git_merge_file_options with default values. Equivalent to creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", - "group": "merge" - }, - "git_merge_options_init": { - "type": "function", - "file": "git2/merge.h", - "line": 311, - "lineto": 311, - "args": [ - { - "name": "opts", - "type": "git_merge_options *", - "comment": "The `git_merge_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_MERGE_OPTIONS_VERSION`." - } - ], - "argline": "git_merge_options *opts, unsigned int version", - "sig": "git_merge_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_merge_options structure

\n", - "comments": "

Initializes a git_merge_options with default values. Equivalent to creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", - "group": "merge" - }, - "git_merge_analysis": { - "type": "function", - "file": "git2/merge.h", - "line": 380, - "lineto": 385, - "args": [ - { - "name": "analysis_out", - "type": "git_merge_analysis_t *", - "comment": "analysis enumeration that the result is written into" - }, - { - "name": "preference_out", - "type": "git_merge_preference_t *", - "comment": null - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to merge" - }, - { - "name": "their_heads", - "type": "const git_annotated_commit **", - "comment": "the heads to merge into" - }, - { - "name": "their_heads_len", - "type": "size_t", - "comment": "the number of heads to merge" - } - ], - "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len", - "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::const git_annotated_commit **::size_t", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into the HEAD of the repository.

\n", - "comments": "", - "group": "merge", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_merge_analysis-15" - ] - } - }, - "git_merge_analysis_for_ref": { - "type": "function", - "file": "git2/merge.h", - "line": 398, - "lineto": 404, - "args": [ - { - "name": "analysis_out", - "type": "git_merge_analysis_t *", - "comment": "analysis enumeration that the result is written into" - }, - { - "name": "preference_out", - "type": "git_merge_preference_t *", - "comment": null - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to merge" - }, - { - "name": "our_ref", - "type": "git_reference *", - "comment": "the reference to perform the analysis from" - }, - { - "name": "their_heads", - "type": "const git_annotated_commit **", - "comment": "the heads to merge into" - }, - { - "name": "their_heads_len", - "type": "size_t", - "comment": "the number of heads to merge" - } - ], - "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, git_reference *our_ref, const git_annotated_commit **their_heads, size_t their_heads_len", - "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::git_reference *::const git_annotated_commit **::size_t", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into a reference.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_base": { - "type": "function", - "file": "git2/merge.h", - "line": 415, - "lineto": 419, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the OID of a merge base between 'one' and 'two'" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "one", - "type": "const git_oid *", - "comment": "one of the commits" - }, - { - "name": "two", - "type": "const git_oid *", - "comment": "the other commit" - } - ], - "argline": "git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two", - "sig": "git_oid *::git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" - }, - "description": "

Find a merge base between two commits

\n", - "comments": "", - "group": "merge", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_merge_base-31" - ], - "rev-parse.c": [ - "ex/v1.3.1/rev-parse.html#git_merge_base-1" - ] - } - }, - "git_merge_bases": { - "type": "function", - "file": "git2/merge.h", - "line": 430, - "lineto": 434, - "args": [ - { - "name": "out", - "type": "git_oidarray *", - "comment": "array in which to store the resulting ids" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "one", - "type": "const git_oid *", - "comment": "one of the commits" - }, - { - "name": "two", - "type": "const git_oid *", - "comment": "the other commit" - } - ], - "argline": "git_oidarray *out, git_repository *repo, const git_oid *one, const git_oid *two", - "sig": "git_oidarray *::git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" - }, - "description": "

Find merge bases between two commits

\n", - "comments": "", - "group": "merge" - }, - "git_merge_base_many": { - "type": "function", - "file": "git2/merge.h", - "line": 445, - "lineto": 449, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the OID of a merge base considering all the commits" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "length", - "type": "size_t", - "comment": "The number of commits in the provided `input_array`" - }, - { - "name": "input_array", - "type": "const git_oid []", - "comment": "oids of the commits" - } - ], - "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", - "sig": "git_oid *::git_repository *::size_t::const git_oid []", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." - }, - "description": "

Find a merge base given a list of commits

\n", - "comments": "", - "group": "merge" - }, - "git_merge_bases_many": { - "type": "function", - "file": "git2/merge.h", - "line": 460, - "lineto": 464, - "args": [ - { - "name": "out", - "type": "git_oidarray *", - "comment": "array in which to store the resulting ids" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "length", - "type": "size_t", - "comment": "The number of commits in the provided `input_array`" - }, - { - "name": "input_array", - "type": "const git_oid []", - "comment": "oids of the commits" - } - ], - "argline": "git_oidarray *out, git_repository *repo, size_t length, const git_oid [] input_array", - "sig": "git_oidarray *::git_repository *::size_t::const git_oid []", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." - }, - "description": "

Find all merge bases given a list of commits

\n", - "comments": "", - "group": "merge" - }, - "git_merge_base_octopus": { - "type": "function", - "file": "git2/merge.h", - "line": 475, - "lineto": 479, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the OID of a merge base considering all the commits" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "length", - "type": "size_t", - "comment": "The number of commits in the provided `input_array`" - }, - { - "name": "input_array", - "type": "const git_oid []", - "comment": "oids of the commits" - } - ], - "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", - "sig": "git_oid *::git_repository *::size_t::const git_oid []", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." - }, - "description": "

Find a merge base in preparation for an octopus merge

\n", - "comments": "", - "group": "merge" - }, - "git_merge_file": { - "type": "function", - "file": "git2/merge.h", - "line": 497, - "lineto": 502, - "args": [ - { - "name": "out", - "type": "git_merge_file_result *", - "comment": "The git_merge_file_result to be filled in" - }, - { - "name": "ancestor", - "type": "const git_merge_file_input *", - "comment": "The contents of the ancestor file" - }, - { - "name": "ours", - "type": "const git_merge_file_input *", - "comment": "The contents of the file in \"our\" side" - }, - { - "name": "theirs", - "type": "const git_merge_file_input *", - "comment": "The contents of the file in \"their\" side" - }, - { - "name": "opts", - "type": "const git_merge_file_options *", - "comment": "The merge file options or `NULL` for defaults" - } - ], - "argline": "git_merge_file_result *out, const git_merge_file_input *ancestor, const git_merge_file_input *ours, const git_merge_file_input *theirs, const git_merge_file_options *opts", - "sig": "git_merge_file_result *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n", - "comments": "

Note that this function does not reference a repository and any configuration must be passed as git_merge_file_options.

\n", - "group": "merge" - }, - "git_merge_file_from_index": { - "type": "function", - "file": "git2/merge.h", - "line": 518, - "lineto": 524, - "args": [ - { - "name": "out", - "type": "git_merge_file_result *", - "comment": "The git_merge_file_result to be filled in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - }, - { - "name": "ancestor", - "type": "const git_index_entry *", - "comment": "The index entry for the ancestor file (stage level 1)" - }, - { - "name": "ours", - "type": "const git_index_entry *", - "comment": "The index entry for our file (stage level 2)" - }, - { - "name": "theirs", - "type": "const git_index_entry *", - "comment": "The index entry for their file (stage level 3)" - }, - { - "name": "opts", - "type": "const git_merge_file_options *", - "comment": "The merge file options or NULL" - } - ], - "argline": "git_merge_file_result *out, git_repository *repo, const git_index_entry *ancestor, const git_index_entry *ours, const git_index_entry *theirs, const git_merge_file_options *opts", - "sig": "git_merge_file_result *::git_repository *::const git_index_entry *::const git_index_entry *::const git_index_entry *::const git_merge_file_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two files as they exist in the index, using the given common\n ancestor as the baseline, producing a git_merge_file_result that\n reflects the merge result. The git_merge_file_result must be freed with\n git_merge_file_result_free.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_file_result_free": { - "type": "function", - "file": "git2/merge.h", - "line": 531, - "lineto": 531, - "args": [ - { - "name": "result", - "type": "git_merge_file_result *", - "comment": "The result to free or `NULL`" - } - ], - "argline": "git_merge_file_result *result", - "sig": "git_merge_file_result *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees a git_merge_file_result.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_trees": { - "type": "function", - "file": "git2/merge.h", - "line": 549, - "lineto": 555, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given trees" - }, - { - "name": "ancestor_tree", - "type": "const git_tree *", - "comment": "the common ancestor between the trees (or null if none)" - }, - { - "name": "our_tree", - "type": "const git_tree *", - "comment": "the tree that reflects the destination tree" - }, - { - "name": "their_tree", - "type": "const git_tree *", - "comment": "the tree to merge in to `our_tree`" - }, - { - "name": "opts", - "type": "const git_merge_options *", - "comment": "the merge tree options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, const git_tree *ancestor_tree, const git_tree *our_tree, const git_tree *their_tree, const git_merge_options *opts", - "sig": "git_index **::git_repository *::const git_tree *::const git_tree *::const git_tree *::const git_merge_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two trees, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "merge" - }, - "git_merge_commits": { - "type": "function", - "file": "git2/merge.h", - "line": 572, - "lineto": 577, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given trees" - }, - { - "name": "our_commit", - "type": "const git_commit *", - "comment": "the commit that reflects the destination tree" - }, - { - "name": "their_commit", - "type": "const git_commit *", - "comment": "the commit to merge in to `our_commit`" - }, - { - "name": "opts", - "type": "const git_merge_options *", - "comment": "the merge tree options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, const git_commit *our_commit, const git_commit *their_commit, const git_merge_options *opts", - "sig": "git_index **::git_repository *::const git_commit *::const git_commit *::const git_merge_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two commits, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "merge" - }, - "git_merge": { - "type": "function", - "file": "git2/merge.h", - "line": 597, - "lineto": 602, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to merge" - }, - { - "name": "their_heads", - "type": "const git_annotated_commit **", - "comment": "the heads to merge into" - }, - { - "name": "their_heads_len", - "type": "size_t", - "comment": "the number of heads to merge" - }, - { - "name": "merge_opts", - "type": "const git_merge_options *", - "comment": "merge options" - }, - { - "name": "checkout_opts", - "type": "const git_checkout_options *", - "comment": "checkout options" - } - ], - "argline": "git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len, const git_merge_options *merge_opts, const git_checkout_options *checkout_opts", - "sig": "git_repository *::const git_annotated_commit **::size_t::const git_merge_options *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", - "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the uses wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", - "group": "merge", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_merge-16" - ] - } - }, - "git_message_prettify": { - "type": "function", - "file": "git2/message.h", - "line": 38, - "lineto": 38, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The user-allocated git_buf which will be filled with the\n cleaned up message." - }, - { - "name": "message", - "type": "const char *", - "comment": "The message to be prettified." - }, - { - "name": "strip_comments", - "type": "int", - "comment": "Non-zero to remove comment lines, 0 to leave them in." - }, - { - "name": "comment_char", - "type": "char", - "comment": "Comment character. Lines starting with this character\n are considered to be comments and removed if `strip_comments` is non-zero." - } - ], - "argline": "git_buf *out, const char *message, int strip_comments, char comment_char", - "sig": "git_buf *::const char *::int::char", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Clean up excess whitespace and make sure there is a trailing newline in the message.

\n", - "comments": "

Optionally, it can remove lines which start with the comment character.

\n", - "group": "message" - }, - "git_message_trailers": { - "type": "function", - "file": "git2/message.h", - "line": 73, - "lineto": 73, - "args": [ - { - "name": "arr", - "type": "git_message_trailer_array *", - "comment": "A pre-allocated git_message_trailer_array struct to be filled in\n with any trailers found during parsing." - }, - { - "name": "message", - "type": "const char *", - "comment": "The message to be parsed" - } - ], - "argline": "git_message_trailer_array *arr, const char *message", - "sig": "git_message_trailer_array *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or non-zero on error." - }, - "description": "

Parse trailers out of a message, filling the array pointed to by +arr+.

\n", - "comments": "

Trailers are key/value pairs in the last paragraph of a message, not including any patches or conflicts that may be present.

\n", - "group": "message" - }, - "git_message_trailer_array_free": { - "type": "function", - "file": "git2/message.h", - "line": 79, - "lineto": 79, - "args": [ - { - "name": "arr", - "type": "git_message_trailer_array *", - "comment": null - } - ], - "argline": "git_message_trailer_array *arr", - "sig": "git_message_trailer_array *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Clean's up any allocated memory in the git_message_trailer_array filled by\n a call to git_message_trailers.

\n", - "comments": "", - "group": "message" - }, - "git_note_iterator_new": { - "type": "function", - "file": "git2/notes.h", - "line": 49, - "lineto": 52, - "args": [ - { - "name": "out", - "type": "git_note_iterator **", - "comment": "pointer to the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" - } - ], - "argline": "git_note_iterator **out, git_repository *repo, const char *notes_ref", - "sig": "git_note_iterator **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Creates a new iterator for notes

\n", - "comments": "

The iterator must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_commit_iterator_new": { - "type": "function", - "file": "git2/notes.h", - "line": 64, - "lineto": 66, - "args": [ - { - "name": "out", - "type": "git_note_iterator **", - "comment": "pointer to the iterator" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - } - ], - "argline": "git_note_iterator **out, git_commit *notes_commit", - "sig": "git_note_iterator **::git_commit *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Creates a new iterator for notes from a commit

\n", - "comments": "

The iterator must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_iterator_free": { - "type": "function", - "file": "git2/notes.h", - "line": 73, - "lineto": 73, - "args": [ - { - "name": "it", - "type": "git_note_iterator *", - "comment": "pointer to the iterator" - } - ], - "argline": "git_note_iterator *it", - "sig": "git_note_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees an git_note_iterator

\n", - "comments": "", - "group": "note" - }, - "git_note_next": { - "type": "function", - "file": "git2/notes.h", - "line": 86, - "lineto": 89, - "args": [ - { - "name": "note_id", - "type": "git_oid *", - "comment": "id of blob containing the message" - }, - { - "name": "annotated_id", - "type": "git_oid *", - "comment": "id of the git object being annotated" - }, - { - "name": "it", - "type": "git_note_iterator *", - "comment": "pointer to the iterator" - } - ], - "argline": "git_oid *note_id, git_oid *annotated_id, git_note_iterator *it", - "sig": "git_oid *::git_oid *::git_note_iterator *", - "return": { - "type": "int", - "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" - }, - "description": "

Return the current item (note_id and annotated_id) and advance the iterator\n internally to the next value

\n", - "comments": "", - "group": "note" - }, - "git_note_read": { - "type": "function", - "file": "git2/notes.h", - "line": 105, - "lineto": 109, - "args": [ - { - "name": "out", - "type": "git_note **", - "comment": "pointer to the read note; NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to read the note from" - } - ], - "argline": "git_note **out, git_repository *repo, const char *notes_ref, const git_oid *oid", - "sig": "git_note **::git_repository *::const char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the note for an object

\n", - "comments": "

The note must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_commit_read": { - "type": "function", - "file": "git2/notes.h", - "line": 124, - "lineto": 128, - "args": [ - { - "name": "out", - "type": "git_note **", - "comment": "pointer to the read note; NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to read the note from" - } - ], - "argline": "git_note **out, git_repository *repo, git_commit *notes_commit, const git_oid *oid", - "sig": "git_note **::git_repository *::git_commit *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the note for an object from a note commit

\n", - "comments": "

The note must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_author": { - "type": "function", - "file": "git2/notes.h", - "line": 136, - "lineto": 136, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_signature *", - "comment": " the author" - }, - "description": "

Get the note author

\n", - "comments": "", - "group": "note" - }, - "git_note_committer": { - "type": "function", - "file": "git2/notes.h", - "line": 144, - "lineto": 144, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_signature *", - "comment": " the committer" - }, - "description": "

Get the note committer

\n", - "comments": "", - "group": "note" - }, - "git_note_message": { - "type": "function", - "file": "git2/notes.h", - "line": 153, - "lineto": 153, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const char *", - "comment": " the note message" - }, - "description": "

Get the note message

\n", - "comments": "", - "group": "note" - }, - "git_note_id": { - "type": "function", - "file": "git2/notes.h", - "line": 162, - "lineto": 162, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_oid *", - "comment": " the note object's id" - }, - "description": "

Get the note object's id

\n", - "comments": "", - "group": "note" - }, - "git_note_create": { - "type": "function", - "file": "git2/notes.h", - "line": 179, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer to store the OID (optional); NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to store the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to decorate" - }, - { - "name": "note", - "type": "const char *", - "comment": "Content of the note to add for object oid" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing note" - } - ], - "argline": "git_oid *out, git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int force", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_commit_create": { - "type": "function", - "file": "git2/notes.h", - "line": 209, - "lineto": 218, - "args": [ - { - "name": "notes_commit_out", - "type": "git_oid *", - "comment": "pointer to store the commit (optional);\n\t\t\t\t\tNULL in case of error" - }, - { - "name": "notes_blob_out", - "type": "git_oid *", - "comment": "a point to the id of a note blob (optional)" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note will live" - }, - { - "name": "parent", - "type": "git_commit *", - "comment": "Pointer to parent note\n\t\t\t\t\tor NULL if this shall start a new notes tree" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to decorate" - }, - { - "name": "note", - "type": "const char *", - "comment": "Content of the note to add for object oid" - }, - { - "name": "allow_note_overwrite", - "type": "int", - "comment": "Overwrite existing note" - } - ], - "argline": "git_oid *notes_commit_out, git_oid *notes_blob_out, git_repository *repo, git_commit *parent, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int allow_note_overwrite", - "sig": "git_oid *::git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a note for an object from a commit

\n", - "comments": "

This function will create a notes commit for a given object, the commit is a dangling commit, no reference is created.

\n", - "group": "note" - }, - "git_note_remove": { - "type": "function", - "file": "git2/notes.h", - "line": 232, - "lineto": 237, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note lives" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to remove the note from" - } - ], - "argline": "git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid", - "sig": "git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove the note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_commit_remove": { - "type": "function", - "file": "git2/notes.h", - "line": 257, - "lineto": 263, - "args": [ - { - "name": "notes_commit_out", - "type": "git_oid *", - "comment": "pointer to store the new notes commit (optional);\n\t\t\t\t\tNULL in case of error.\n\t\t\t\t\tWhen removing a note a new tree containing all notes\n\t\t\t\t\tsans the note to be removed is created and a new commit\n\t\t\t\t\tpointing to that tree is also created.\n\t\t\t\t\tIn the case where the resulting tree is an empty tree\n\t\t\t\t\ta new commit pointing to this empty tree will be returned." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note lives" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to remove the note from" - } - ], - "argline": "git_oid *notes_commit_out, git_repository *repo, git_commit *notes_commit, const git_signature *author, const git_signature *committer, const git_oid *oid", - "sig": "git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove the note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_free": { - "type": "function", - "file": "git2/notes.h", - "line": 270, - "lineto": 270, - "args": [ - { - "name": "note", - "type": "git_note *", - "comment": "git_note object" - } - ], - "argline": "git_note *note", - "sig": "git_note *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a git_note object

\n", - "comments": "", - "group": "note" - }, - "git_note_default_ref": { - "type": "function", - "file": "git2/notes.h", - "line": 280, - "lineto": 280, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer in which to store the name of the default notes reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The Git repository" - } - ], - "argline": "git_buf *out, git_repository *repo", - "sig": "git_buf *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the default notes reference for a repository

\n", - "comments": "", - "group": "note" - }, - "git_note_foreach": { - "type": "function", - "file": "git2/notes.h", - "line": 298, - "lineto": 302, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the notes." - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "Reference to read from (optional); defaults to\n \"refs/notes/commits\"." - }, - { - "name": "note_cb", - "type": "git_note_foreach_cb", - "comment": "Callback to invoke per found annotation. Return non-zero\n to stop looping." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra parameter to callback function." - } - ], - "argline": "git_repository *repo, const char *notes_ref, git_note_foreach_cb note_cb, void *payload", - "sig": "git_repository *::const char *::git_note_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all the notes within a specified namespace\n and issue a callback for each one.

\n", - "comments": "", - "group": "note" - }, - "git_object_lookup": { - "type": "function", - "file": "git2/object.h", - "line": 44, - "lineto": 48, - "args": [ - { - "name": "object", - "type": "git_object **", - "comment": "pointer to the looked-up object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the object" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the unique identifier for the object" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "the type of the object" - } - ], - "argline": "git_object **object, git_repository *repo, const git_oid *id, git_object_t type", - "sig": "git_object **::git_repository *::const git_oid *::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a reference to one of the objects in a repository.

\n", - "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", - "group": "object", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_object_lookup-32" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_object_lookup-17" - ] - } - }, - "git_object_lookup_prefix": { - "type": "function", - "file": "git2/object.h", - "line": 77, - "lineto": 82, - "args": [ - { - "name": "object_out", - "type": "git_object **", - "comment": "pointer where to store the looked-up object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the object" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "a short identifier for the object" - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "the type of the object" - } - ], - "argline": "git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_object_t type", - "sig": "git_object **::git_repository *::const git_oid *::size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", - "group": "object" - }, - "git_object_lookup_bypath": { - "type": "function", - "file": "git2/object.h", - "line": 95, - "lineto": 99, - "args": [ - { - "name": "out", - "type": "git_object **", - "comment": "buffer that receives a pointer to the object (which must be freed\n by the caller)" - }, - { - "name": "treeish", - "type": "const git_object *", - "comment": "root object that can be peeled to a tree" - }, - { - "name": "path", - "type": "const char *", - "comment": "relative path from the root object to the desired object" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "type of object desired" - } - ], - "argline": "git_object **out, const git_object *treeish, const char *path, git_object_t type", - "sig": "git_object **::const git_object *::const char *::git_object_t", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Lookup an object that represents a tree entry.

\n", - "comments": "", - "group": "object" - }, - "git_object_id": { - "type": "function", - "file": "git2/object.h", - "line": 107, - "lineto": 107, - "args": [ - { - "name": "obj", - "type": "const git_object *", - "comment": "the repository object" - } - ], - "argline": "const git_object *obj", - "sig": "const git_object *", - "return": { - "type": "const git_oid *", - "comment": " the SHA1 id" - }, - "description": "

Get the id (SHA1) of a repository object

\n", - "comments": "", - "group": "object", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_object_id-8", - "ex/v1.3.1/blame.html#git_object_id-9", - "ex/v1.3.1/blame.html#git_object_id-10", - "ex/v1.3.1/blame.html#git_object_id-11" - ], - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_object_id-10", - "ex/v1.3.1/cat-file.html#git_object_id-11" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_object_id-33", - "ex/v1.3.1/log.html#git_object_id-34", - "ex/v1.3.1/log.html#git_object_id-35", - "ex/v1.3.1/log.html#git_object_id-36" - ], - "rev-parse.c": [ - "ex/v1.3.1/rev-parse.html#git_object_id-2", - "ex/v1.3.1/rev-parse.html#git_object_id-3", - "ex/v1.3.1/rev-parse.html#git_object_id-4", - "ex/v1.3.1/rev-parse.html#git_object_id-5", - "ex/v1.3.1/rev-parse.html#git_object_id-6" - ] - } - }, - "git_object_short_id": { - "type": "function", - "file": "git2/object.h", - "line": 121, - "lineto": 121, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Buffer to write string into" - }, - { - "name": "obj", - "type": "const git_object *", - "comment": "The object to get an ID for" - } - ], - "argline": "git_buf *out, const git_object *obj", - "sig": "git_buf *::const git_object *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 for error" - }, - "description": "

Get a short abbreviated OID string for the object

\n", - "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", - "group": "object", - "examples": { - "tag.c": [ - "ex/v1.3.1/tag.html#git_object_short_id-3" - ] - } - }, - "git_object_type": { - "type": "function", - "file": "git2/object.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "obj", - "type": "const git_object *", - "comment": "the repository object" - } - ], - "argline": "const git_object *obj", - "sig": "const git_object *", - "return": { - "type": "git_object_t", - "comment": " the object's type" - }, - "description": "

Get the object type of an object

\n", - "comments": "", - "group": "object", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_object_type-12", - "ex/v1.3.1/cat-file.html#git_object_type-13", - "ex/v1.3.1/cat-file.html#git_object_type-14" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_object_type-4" - ] - } - }, - "git_object_owner": { - "type": "function", - "file": "git2/object.h", - "line": 143, - "lineto": 143, - "args": [ - { - "name": "obj", - "type": "const git_object *", - "comment": "the object" - } - ], - "argline": "const git_object *obj", - "sig": "const git_object *", - "return": { - "type": "git_repository *", - "comment": " the repository who owns this object" - }, - "description": "

Get the repository that owns this object

\n", - "comments": "

Freeing or calling git_repository_close on the returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without affecting the object.

\n", - "group": "object" - }, - "git_object_free": { - "type": "function", - "file": "git2/object.h", - "line": 160, - "lineto": 160, - "args": [ - { - "name": "object", - "type": "git_object *", - "comment": "the object to close" - } - ], - "argline": "git_object *object", - "sig": "git_object *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open object

\n", - "comments": "

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 aggressive is the caching mechanism used by the repository.

\n\n

IMPORTANT: It is necessary to call this method when you stop using an object. Failure to do so will cause a memory leak.

\n", - "group": "object", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_object_free-12", - "ex/v1.3.1/blame.html#git_object_free-13", - "ex/v1.3.1/blame.html#git_object_free-14", - "ex/v1.3.1/blame.html#git_object_free-15" - ], - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_object_free-15" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_object_free-38" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_object_free-37" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_object_free-18" - ], - "rev-parse.c": [ - "ex/v1.3.1/rev-parse.html#git_object_free-7", - "ex/v1.3.1/rev-parse.html#git_object_free-8", - "ex/v1.3.1/rev-parse.html#git_object_free-9" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_object_free-5", - "ex/v1.3.1/tag.html#git_object_free-6", - "ex/v1.3.1/tag.html#git_object_free-7", - "ex/v1.3.1/tag.html#git_object_free-8" - ] - } - }, - "git_object_type2string": { - "type": "function", - "file": "git2/object.h", - "line": 171, - "lineto": 171, - "args": [ - { - "name": "type", - "type": "git_object_t", - "comment": "object type to convert." - } - ], - "argline": "git_object_t type", - "sig": "git_object_t", - "return": { - "type": "const char *", - "comment": " the corresponding string representation." - }, - "description": "

Convert an object type to its string representation.

\n", - "comments": "

The result is a pointer to a string in static memory and should not be free()'ed.

\n", - "group": "object", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_object_type2string-16", - "ex/v1.3.1/cat-file.html#git_object_type2string-17", - "ex/v1.3.1/cat-file.html#git_object_type2string-18", - "ex/v1.3.1/cat-file.html#git_object_type2string-19" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_object_type2string-39", - "ex/v1.3.1/general.html#git_object_type2string-40" - ] - } - }, - "git_object_string2type": { - "type": "function", - "file": "git2/object.h", - "line": 179, - "lineto": 179, - "args": [ - { - "name": "str", - "type": "const char *", - "comment": "the string to convert." - } - ], - "argline": "const char *str", - "sig": "const char *", - "return": { - "type": "git_object_t", - "comment": " the corresponding git_object_t." - }, - "description": "

Convert a string object type representation to it's git_object_t.

\n", - "comments": "", - "group": "object" - }, - "git_object_typeisloose": { - "type": "function", - "file": "git2/object.h", - "line": 188, - "lineto": 188, - "args": [ - { - "name": "type", - "type": "git_object_t", - "comment": "object type to test." - } - ], - "argline": "git_object_t type", - "sig": "git_object_t", - "return": { - "type": "int", - "comment": " true if the type represents a valid loose object type,\n false otherwise." - }, - "description": "

Determine if the given git_object_t is a valid loose object type.

\n", - "comments": "", - "group": "object" - }, - "git_object_peel": { - "type": "function", - "file": "git2/object.h", - "line": 213, - "lineto": 216, - "args": [ - { - "name": "peeled", - "type": "git_object **", - "comment": "Pointer to the peeled git_object" - }, - { - "name": "object", - "type": "const git_object *", - "comment": "The object to be processed" - }, - { - "name": "target_type", - "type": "git_object_t", - "comment": "The type of the requested object (a GIT_OBJECT_ value)" - } - ], - "argline": "git_object **peeled, const git_object *object, git_object_t target_type", - "sig": "git_object **::const git_object *::git_object_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" - }, - "description": "

Recursively peel an object until an object of the specified type is met.

\n", - "comments": "

If the query cannot be satisfied due to the object model, GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until the type changes. A tag will be peeled until the referenced object is no longer a tag, and a commit will be peeled to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to the target type due to the object model, GIT_EPEEL will be returned.

\n\n

You must free the returned object.

\n", - "group": "object" - }, - "git_object_dup": { - "type": "function", - "file": "git2/object.h", - "line": 225, - "lineto": 225, - "args": [ - { - "name": "dest", - "type": "git_object **", - "comment": "Pointer to store the copy of the object" - }, - { - "name": "source", - "type": "git_object *", - "comment": "Original object to copy" - } - ], - "argline": "git_object **dest, git_object *source", - "sig": "git_object **::git_object *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an in-memory copy of a Git object. The copy must be\n explicitly free'd or it will leak.

\n", - "comments": "", - "group": "object" - }, - "git_odb_new": { - "type": "function", - "file": "git2/odb.h", - "line": 40, - "lineto": 40, - "args": [ - { - "name": "out", - "type": "git_odb **", - "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." - } - ], - "argline": "git_odb **out", - "sig": "git_odb **", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new object database with no backends.

\n", - "comments": "

Before the ODB can be used for read/writing, a custom database backend must be manually added using git_odb_add_backend()

\n", - "group": "odb" - }, - "git_odb_open": { - "type": "function", - "file": "git2/odb.h", - "line": 58, - "lineto": 58, - "args": [ - { - "name": "out", - "type": "git_odb **", - "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." - }, - { - "name": "objects_dir", - "type": "const char *", - "comment": "path of the backends' \"objects\" directory." - } - ], - "argline": "git_odb **out, const char *objects_dir", - "sig": "git_odb **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new object database and automatically add\n the two default backends:

\n", - "comments": "
- git_odb_backend_loose: read and write loose object files      from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,        assuming `objects_dir` as the Objects folder which      contains a 'pack/' folder with the corresponding data\n
\n", - "group": "odb" - }, - "git_odb_add_disk_alternate": { - "type": "function", - "file": "git2/odb.h", - "line": 75, - "lineto": 75, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "database to add the backend to" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to the objects folder for the alternate" - } - ], - "argline": "git_odb *odb, const char *path", - "sig": "git_odb *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Add an on-disk alternate to an existing Object DB.

\n", - "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", - "group": "odb" - }, - "git_odb_free": { - "type": "function", - "file": "git2/odb.h", - "line": 82, - "lineto": 82, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "database pointer to close. If NULL no action is taken." - } - ], - "argline": "git_odb *db", - "sig": "git_odb *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open object database.

\n", - "comments": "", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_odb_free-20" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_odb_free-41" - ] - } - }, - "git_odb_read": { - "type": "function", - "file": "git2/odb.h", - "line": 100, - "lineto": 100, - "args": [ - { - "name": "out", - "type": "git_odb_object **", - "comment": "pointer where to store the read object" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "database to search for the object in." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the object to read." - } - ], - "argline": "git_odb_object **out, git_odb *db, const git_oid *id", - "sig": "git_odb_object **::git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is\n not in the database." - }, - "description": "

Read an object from the database.

\n", - "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_odb_read-21" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_odb_read-42" - ] - } - }, - "git_odb_read_prefix": { - "type": "function", - "file": "git2/odb.h", - "line": 128, - "lineto": 128, - "args": [ - { - "name": "out", - "type": "git_odb_object **", - "comment": "pointer where to store the read object" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "database to search for the object in." - }, - { - "name": "short_id", - "type": "const git_oid *", - "comment": "a prefix of the id of the object to read." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the prefix" - } - ], - "argline": "git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len", - "sig": "git_odb_object **::git_odb *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not in the\n database. GIT_EAMBIGUOUS if the prefix is ambiguous\n (several objects match the prefix)" - }, - "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", - "comments": "

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.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", - "group": "odb" - }, - "git_odb_read_header": { - "type": "function", - "file": "git2/odb.h", - "line": 147, - "lineto": 147, - "args": [ - { - "name": "len_out", - "type": "size_t *", - "comment": "pointer where to store the length" - }, - { - "name": "type_out", - "type": "git_object_t *", - "comment": "pointer where to store the type" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "database to search for the object in." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the object to read." - } - ], - "argline": "size_t *len_out, git_object_t *type_out, git_odb *db, const git_oid *id", - "sig": "size_t *::git_object_t *::git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not\n in the database." - }, - "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", - "comments": "

The header includes the length and the type of an object.

\n\n

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.

\n", - "group": "odb" - }, - "git_odb_exists": { - "type": "function", - "file": "git2/odb.h", - "line": 156, - "lineto": 156, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "database to be searched for the given object." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the object to search for." - } - ], - "argline": "git_odb *db, const git_oid *id", - "sig": "git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 1 if the object was found, 0 otherwise" - }, - "description": "

Determine if the given object can be found in the object database.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_exists_prefix": { - "type": "function", - "file": "git2/odb.h", - "line": 169, - "lineto": 170, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "The full OID of the found object if just one is found." - }, - { - "name": "db", - "type": "git_odb *", - "comment": "The database to be searched for the given object." - }, - { - "name": "short_id", - "type": "const git_oid *", - "comment": "A prefix of the id of the object to read." - }, - { - "name": "len", - "type": "size_t", - "comment": "The length of the prefix." - } - ], - "argline": "git_oid *out, git_odb *db, const git_oid *short_id, size_t len", - "sig": "git_oid *::git_odb *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 if found, GIT_ENOTFOUND if not found, GIT_EAMBIGUOUS if multiple\n matches were found, other value \n<\n 0 if there was a read error." - }, - "description": "

Determine if an object can be found in the object database by an\n abbreviated object ID.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_expand_ids": { - "type": "function", - "file": "git2/odb.h", - "line": 211, - "lineto": 214, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "The database to be searched for the given objects." - }, - { - "name": "ids", - "type": "git_odb_expand_id *", - "comment": "An array of short object IDs to search for" - }, - { - "name": "count", - "type": "size_t", - "comment": "The length of the `ids` array" - } - ], - "argline": "git_odb *db, git_odb_expand_id *ids, size_t count", - "sig": "git_odb *::git_odb_expand_id *::size_t", - "return": { - "type": "int", - "comment": " 0 on success or an error code on failure" - }, - "description": "

Determine if one or more objects can be found in the object database\n by their abbreviated object ID and type. The given array will be\n updated in place: for each abbreviated ID that is unique in the\n database, and of the given type (if specified), the full object ID,\n object ID length (GIT_OID_HEXSZ) and type will be written back to\n the array. For IDs that are not found (or are ambiguous), the\n array entry will be zeroed.

\n", - "comments": "

Note that since this function operates on multiple objects, the underlying database will not be asked to be reloaded if an object is not found (which is unlike other object database operations.)

\n", - "group": "odb" - }, - "git_odb_refresh": { - "type": "function", - "file": "git2/odb.h", - "line": 234, - "lineto": 234, - "args": [ - { - "name": "db", - "type": "struct git_odb *", - "comment": "database to refresh" - } - ], - "argline": "struct git_odb *db", - "sig": "struct git_odb *", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Refresh the object database to load newly added files.

\n", - "comments": "

If the object databases have changed on disk while the library is running, this function will force a reload of the underlying indexes.

\n\n

Use this function when you're confident that an external application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The library will automatically attempt to refresh the ODB when a lookup fails, to see if the looked up object exists on disk but hasn't been loaded yet.

\n", - "group": "odb" - }, - "git_odb_foreach": { - "type": "function", - "file": "git2/odb.h", - "line": 249, - "lineto": 249, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "database to use" - }, - { - "name": "cb", - "type": "git_odb_foreach_cb", - "comment": "the callback to call for each object" - }, - { - "name": "payload", - "type": "void *", - "comment": "data to pass to the callback" - } - ], - "argline": "git_odb *db, git_odb_foreach_cb cb, void *payload", - "sig": "git_odb *::git_odb_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

List all objects available in the database

\n", - "comments": "

The callback will be called for each object available in the database. Note that the objects are likely to be returned in the index order, which would make accessing the objects in that order inefficient. Return a non-zero value from the callback to stop looping.

\n", - "group": "odb" - }, - "git_odb_write": { - "type": "function", - "file": "git2/odb.h", - "line": 269, - "lineto": 269, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer to store the OID result of the write" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "object database where to store the object" - }, - { - "name": "data", - "type": "const void *", - "comment": "buffer with the data to store" - }, - { - "name": "len", - "type": "size_t", - "comment": "size of the buffer" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "type of the data to store" - } - ], - "argline": "git_oid *out, git_odb *odb, const void *data, size_t len, git_object_t type", - "sig": "git_oid *::git_odb *::const void *::size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an object directly into the ODB

\n", - "comments": "

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.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", - "group": "odb", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_odb_write-43" - ] - } - }, - "git_odb_open_wstream": { - "type": "function", - "file": "git2/odb.h", - "line": 292, - "lineto": 292, - "args": [ - { - "name": "out", - "type": "git_odb_stream **", - "comment": "pointer where to store the stream" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the stream will write" - }, - { - "name": "size", - "type": "git_object_size_t", - "comment": "final size of the object that will be written" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "type of the object that will be written" - } - ], - "argline": "git_odb_stream **out, git_odb *db, git_object_size_t size, git_object_t type", - "sig": "git_odb_stream **::git_odb *::git_object_size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 if the stream was created; error code otherwise" - }, - "description": "

Open a stream to write an object into the ODB

\n", - "comments": "

The type and final length of the object must be specified when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it won't be effective until git_odb_stream_finalize_write is called and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or will leak memory.

\n", - "group": "odb" - }, - "git_odb_stream_write": { - "type": "function", - "file": "git2/odb.h", - "line": 305, - "lineto": 305, - "args": [ - { - "name": "stream", - "type": "git_odb_stream *", - "comment": "the stream" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "the data to write" - }, - { - "name": "len", - "type": "size_t", - "comment": "the buffer's length" - } - ], - "argline": "git_odb_stream *stream, const char *buffer, size_t len", - "sig": "git_odb_stream *::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 if the write succeeded, error code otherwise" - }, - "description": "

Write to an odb stream

\n", - "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", - "group": "odb" - }, - "git_odb_stream_finalize_write": { - "type": "function", - "file": "git2/odb.h", - "line": 320, - "lineto": 320, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer to store the resulting object's id" - }, - { - "name": "stream", - "type": "git_odb_stream *", - "comment": "the stream" - } - ], - "argline": "git_oid *out, git_odb_stream *stream", - "sig": "git_oid *::git_odb_stream *", - "return": { - "type": "int", - "comment": " 0 on success, an error code otherwise" - }, - "description": "

Finish writing to an odb stream

\n", - "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", - "group": "odb" - }, - "git_odb_stream_read": { - "type": "function", - "file": "git2/odb.h", - "line": 327, - "lineto": 327, - "args": [ - { - "name": "stream", - "type": "git_odb_stream *", - "comment": null - }, - { - "name": "buffer", - "type": "char *", - "comment": null - }, - { - "name": "len", - "type": "size_t", - "comment": null - } - ], - "argline": "git_odb_stream *stream, char *buffer, size_t len", - "sig": "git_odb_stream *::char *::size_t", - "return": { - "type": "int", - "comment": null - }, - "description": "

Read from an odb stream

\n", - "comments": "

Most backends don't implement streaming reads

\n", - "group": "odb" - }, - "git_odb_stream_free": { - "type": "function", - "file": "git2/odb.h", - "line": 334, - "lineto": 334, - "args": [ - { - "name": "stream", - "type": "git_odb_stream *", - "comment": "the stream to free" - } - ], - "argline": "git_odb_stream *stream", - "sig": "git_odb_stream *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an odb stream

\n", - "comments": "", - "group": "odb" - }, - "git_odb_open_rstream": { - "type": "function", - "file": "git2/odb.h", - "line": 362, - "lineto": 367, - "args": [ - { - "name": "out", - "type": "git_odb_stream **", - "comment": "pointer where to store the stream" - }, - { - "name": "len", - "type": "size_t *", - "comment": "pointer where to store the length of the object" - }, - { - "name": "type", - "type": "git_object_t *", - "comment": "pointer where to store the type of the object" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the stream will read from" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "oid of the object the stream will read from" - } - ], - "argline": "git_odb_stream **out, size_t *len, git_object_t *type, git_odb *db, const git_oid *oid", - "sig": "git_odb_stream **::size_t *::git_object_t *::git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 if the stream was created, error code otherwise" - }, - "description": "

Open a stream to read an object from the ODB

\n", - "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", - "group": "odb" - }, - "git_odb_write_pack": { - "type": "function", - "file": "git2/odb.h", - "line": 387, - "lineto": 391, - "args": [ - { - "name": "out", - "type": "git_odb_writepack **", - "comment": "pointer to the writepack functions" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the stream will read from" - }, - { - "name": "progress_cb", - "type": "git_indexer_progress_cb", - "comment": "function to call with progress information.\n Be aware that this is called inline with network and indexing operations,\n so performance may be affected." - }, - { - "name": "progress_payload", - "type": "void *", - "comment": "payload for the progress callback" - } - ], - "argline": "git_odb_writepack **out, git_odb *db, git_indexer_progress_cb progress_cb, void *progress_payload", - "sig": "git_odb_writepack **::git_odb *::git_indexer_progress_cb::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Open a stream for writing a pack file to the ODB.

\n", - "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", - "group": "odb" - }, - "git_odb_write_multi_pack_index": { - "type": "function", - "file": "git2/odb.h", - "line": 404, - "lineto": 405, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the `multi-pack-index` file will be written." - } - ], - "argline": "git_odb *db", - "sig": "git_odb *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Write a multi-pack-index file from all the .pack files in the ODB.

\n", - "comments": "

If the ODB layer understands pack files, then this will create a file called multi-pack-index next to the .pack and .idx files, which will contain an index of all objects stored in .pack files. This will allow for O(log n) lookup for n objects (regardless of how many packfiles there exist).

\n", - "group": "odb" - }, - "git_odb_hash": { - "type": "function", - "file": "git2/odb.h", - "line": 419, - "lineto": 419, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the resulting object-ID." - }, - { - "name": "data", - "type": "const void *", - "comment": "data to hash" - }, - { - "name": "len", - "type": "size_t", - "comment": "size of the data" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "of the data to hash" - } - ], - "argline": "git_oid *out, const void *data, size_t len, git_object_t type", - "sig": "git_oid *::const void *::size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Determine the object-ID (sha1 hash) of a data buffer

\n", - "comments": "

The resulting SHA-1 OID will be the identifier for the data buffer as if the data buffer it were to written to the ODB.

\n", - "group": "odb" - }, - "git_odb_hashfile": { - "type": "function", - "file": "git2/odb.h", - "line": 434, - "lineto": 434, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "oid structure the result is written into." - }, - { - "name": "path", - "type": "const char *", - "comment": "file to read and determine object id for" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "the type of the object that will be hashed" - } - ], - "argline": "git_oid *out, const char *path, git_object_t type", - "sig": "git_oid *::const char *::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read a file from disk and fill a git_oid with the object id\n that the file would have if it were written to the Object\n Database as an object of the given type (w/o applying filters).\n Similar functionality to git.git's git hash-object without\n the -w flag, however, with the --no-filters flag.\n If you need filters, see git_repository_hashfile.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_object_dup": { - "type": "function", - "file": "git2/odb.h", - "line": 448, - "lineto": 448, - "args": [ - { - "name": "dest", - "type": "git_odb_object **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "git_odb_object *", - "comment": "object to copy" - } - ], - "argline": "git_odb_object **dest, git_odb_object *source", - "sig": "git_odb_object **::git_odb_object *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an odb_object

\n", - "comments": "

The returned copy must be manually freed with git_odb_object_free. Note that because of an implementation detail, the returned copy will be the same pointer as source: the object is internally refcounted, so the copy still needs to be freed twice.

\n", - "group": "odb" - }, - "git_odb_object_free": { - "type": "function", - "file": "git2/odb.h", - "line": 458, - "lineto": 458, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "object to close" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an ODB object

\n", - "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_odb_object_free-22" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_odb_object_free-44" - ] - } - }, - "git_odb_object_id": { - "type": "function", - "file": "git2/odb.h", - "line": 468, - "lineto": 468, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the OID" - }, - "description": "

Return the OID of an ODB object

\n", - "comments": "

This is the OID from which the object was read from

\n", - "group": "odb" - }, - "git_odb_object_data": { - "type": "function", - "file": "git2/odb.h", - "line": 481, - "lineto": 481, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "const void *", - "comment": " a pointer to the data" - }, - "description": "

Return the data of an ODB object

\n", - "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", - "group": "odb", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_odb_object_data-45" - ] - } - }, - "git_odb_object_size": { - "type": "function", - "file": "git2/odb.h", - "line": 492, - "lineto": 492, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "size_t", - "comment": " the size" - }, - "description": "

Return the size of an ODB object

\n", - "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_odb_object_size-23" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_odb_object_size-46" - ] - } - }, - "git_odb_object_type": { - "type": "function", - "file": "git2/odb.h", - "line": 500, - "lineto": 500, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "git_object_t", - "comment": " the type" - }, - "description": "

Return the type of an ODB object

\n", - "comments": "", - "group": "odb", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_odb_object_type-47" - ] - } - }, - "git_odb_add_backend": { - "type": "function", - "file": "git2/odb.h", - "line": 515, - "lineto": 515, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "database to add the backend to" - }, - { - "name": "backend", - "type": "git_odb_backend *", - "comment": "pointer to a git_odb_backend instance" - }, - { - "name": "priority", - "type": "int", - "comment": "Value for ordering the backends queue" - } - ], - "argline": "git_odb *odb, git_odb_backend *backend, int priority", - "sig": "git_odb *::git_odb_backend *::int", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Add a custom backend to an existing Object DB

\n", - "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", - "group": "odb" - }, - "git_odb_add_alternate": { - "type": "function", - "file": "git2/odb.h", - "line": 536, - "lineto": 536, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "database to add the backend to" - }, - { - "name": "backend", - "type": "git_odb_backend *", - "comment": "pointer to a git_odb_backend instance" - }, - { - "name": "priority", - "type": "int", - "comment": "Value for ordering the backends queue" - } - ], - "argline": "git_odb *odb, git_odb_backend *backend, int priority", - "sig": "git_odb *::git_odb_backend *::int", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", - "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", - "group": "odb" - }, - "git_odb_num_backends": { - "type": "function", - "file": "git2/odb.h", - "line": 544, - "lineto": 544, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "object database" - } - ], - "argline": "git_odb *odb", - "sig": "git_odb *", - "return": { - "type": "size_t", - "comment": " number of backends in the ODB" - }, - "description": "

Get the number of ODB backend objects

\n", - "comments": "", - "group": "odb" - }, - "git_odb_get_backend": { - "type": "function", - "file": "git2/odb.h", - "line": 554, - "lineto": 554, - "args": [ - { - "name": "out", - "type": "git_odb_backend **", - "comment": "output pointer to ODB backend at pos" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "object database" - }, - { - "name": "pos", - "type": "size_t", - "comment": "index into object database backend list" - } - ], - "argline": "git_odb_backend **out, git_odb *odb, size_t pos", - "sig": "git_odb_backend **::git_odb *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if pos is invalid, other errors \n<\n 0" - }, - "description": "

Lookup an ODB backend object by index

\n", - "comments": "", - "group": "odb" - }, - "git_odb_set_commit_graph": { - "type": "function", - "file": "git2/odb.h", - "line": 569, - "lineto": 569, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "object database" - }, - { - "name": "cgraph", - "type": "git_commit_graph *", - "comment": "the git commit-graph" - } - ], - "argline": "git_odb *odb, git_commit_graph *cgraph", - "sig": "git_odb *::git_commit_graph *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Set the git commit-graph for the ODB.

\n", - "comments": "

After a successfull call, the ownership of the cgraph parameter will be transferred to libgit2, and the caller should not free it.

\n\n

The commit-graph can also be unset by explicitly passing NULL as the cgraph parameter.

\n", - "group": "odb" - }, - "git_odb_backend_pack": { - "type": "function", - "file": "git2/odb_backend.h", - "line": 35, - "lineto": 35, - "args": [ - { - "name": "out", - "type": "git_odb_backend **", - "comment": "location to store the odb backend pointer" - }, - { - "name": "objects_dir", - "type": "const char *", - "comment": "the Git repository's objects directory" - } - ], - "argline": "git_odb_backend **out, const char *objects_dir", - "sig": "git_odb_backend **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a backend for the packfiles.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_backend_loose": { - "type": "function", - "file": "git2/odb_backend.h", - "line": 49, - "lineto": 55, - "args": [ - { - "name": "out", - "type": "git_odb_backend **", - "comment": "location to store the odb backend pointer" - }, - { - "name": "objects_dir", - "type": "const char *", - "comment": "the Git repository's objects directory" - }, - { - "name": "compression_level", - "type": "int", - "comment": "zlib compression level to use" - }, - { - "name": "do_fsync", - "type": "int", - "comment": "whether to do an fsync() after writing" - }, - { - "name": "dir_mode", - "type": "unsigned int", - "comment": "permissions to use creating a directory or 0 for defaults" - }, - { - "name": "file_mode", - "type": "unsigned int", - "comment": "permissions to use creating a file or 0 for defaults" - } - ], - "argline": "git_odb_backend **out, const char *objects_dir, int compression_level, int do_fsync, unsigned int dir_mode, unsigned int file_mode", - "sig": "git_odb_backend **::const char *::int::int::unsigned int::unsigned int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a backend for loose objects

\n", - "comments": "", - "group": "odb" - }, - "git_odb_backend_one_pack": { - "type": "function", - "file": "git2/odb_backend.h", - "line": 68, - "lineto": 68, - "args": [ - { - "name": "out", - "type": "git_odb_backend **", - "comment": "location to store the odb backend pointer" - }, - { - "name": "index_file", - "type": "const char *", - "comment": "path to the packfile's .idx file" - } - ], - "argline": "git_odb_backend **out, const char *index_file", - "sig": "git_odb_backend **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a backend out of a single packfile

\n", - "comments": "

This can be useful for inspecting the contents of a single packfile.

\n", - "group": "odb" - }, - "git_oid_fromstr": { - "type": "function", - "file": "git2/oid.h", - "line": 47, - "lineto": 47, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "oid structure the result is written into." - }, - { - "name": "str", - "type": "const char *", - "comment": "input hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes)." - } - ], - "argline": "git_oid *out, const char *str", - "sig": "git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Parse a hex formatted object id into a git_oid.

\n", - "comments": "", - "group": "oid", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_oid_fromstr-48", - "ex/v1.3.1/general.html#git_oid_fromstr-49", - "ex/v1.3.1/general.html#git_oid_fromstr-50", - "ex/v1.3.1/general.html#git_oid_fromstr-51", - "ex/v1.3.1/general.html#git_oid_fromstr-52", - "ex/v1.3.1/general.html#git_oid_fromstr-53", - "ex/v1.3.1/general.html#git_oid_fromstr-54", - "ex/v1.3.1/general.html#git_oid_fromstr-55" - ] - } - }, - "git_oid_fromstrp": { - "type": "function", - "file": "git2/oid.h", - "line": 56, - "lineto": 56, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "oid structure the result is written into." - }, - { - "name": "str", - "type": "const char *", - "comment": "input hex string; must be null-terminated." - } - ], - "argline": "git_oid *out, const char *str", - "sig": "git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Parse a hex formatted null-terminated string into a git_oid.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_fromstrn": { - "type": "function", - "file": "git2/oid.h", - "line": 69, - "lineto": 69, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "oid structure the result is written into." - }, - { - "name": "str", - "type": "const char *", - "comment": "input hex string of at least size `length`" - }, - { - "name": "length", - "type": "size_t", - "comment": "length of the input string" - } - ], - "argline": "git_oid *out, const char *str, size_t length", - "sig": "git_oid *::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Parse N characters of a hex formatted object id into a git_oid.

\n", - "comments": "

If N is odd, the last byte's high nibble will be read in and the low nibble set to zero.

\n", - "group": "oid" - }, - "git_oid_fromraw": { - "type": "function", - "file": "git2/oid.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "oid structure the result is written into." - }, - { - "name": "raw", - "type": "const unsigned char *", - "comment": "the raw input bytes to be copied." - } - ], - "argline": "git_oid *out, const unsigned char *raw", - "sig": "git_oid *::const unsigned char *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Copy an already raw oid into a git_oid structure.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_fmt": { - "type": "function", - "file": "git2/oid.h", - "line": 91, - "lineto": 91, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes). Only the\n\t\toid digits are written; a '\n\\\n0' terminator must be added\n\t\tby the caller if it is required." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure to format." - } - ], - "argline": "char *out, const git_oid *id", - "sig": "char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Format a git_oid into a hex string.

\n", - "comments": "", - "group": "oid", - "examples": { - "fetch.c": [ - "ex/v1.3.1/fetch.html#git_oid_fmt-1", - "ex/v1.3.1/fetch.html#git_oid_fmt-2" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_oid_fmt-56", - "ex/v1.3.1/general.html#git_oid_fmt-57", - "ex/v1.3.1/general.html#git_oid_fmt-58", - "ex/v1.3.1/general.html#git_oid_fmt-59", - "ex/v1.3.1/general.html#git_oid_fmt-60" - ], - "ls-remote.c": [ - "ex/v1.3.1/ls-remote.html#git_oid_fmt-1" - ] - } - }, - "git_oid_nfmt": { - "type": "function", - "file": "git2/oid.h", - "line": 103, - "lineto": 103, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "output hex string; you say how many bytes to write.\n\t\tIf the number of bytes is > GIT_OID_HEXSZ, extra bytes\n\t\twill be zeroed; if not, a '\n\\\n0' terminator is NOT added." - }, - { - "name": "n", - "type": "size_t", - "comment": "number of characters to write into out string" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure to format." - } - ], - "argline": "char *out, size_t n, const git_oid *id", - "sig": "char *::size_t::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Format a git_oid into a partial hex string.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_pathfmt": { - "type": "function", - "file": "git2/oid.h", - "line": 119, - "lineto": 119, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (41 bytes). Only the\n\t\toid digits are written; a '\n\\\n0' terminator must be added\n\t\tby the caller if it is required." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure to format." - } - ], - "argline": "char *out, const git_oid *id", - "sig": "char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Format a git_oid into a loose-object path string.

\n", - "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", - "group": "oid" - }, - "git_oid_tostr_s": { - "type": "function", - "file": "git2/oid.h", - "line": 132, - "lineto": 132, - "args": [ - { - "name": "oid", - "type": "const git_oid *", - "comment": "The oid structure to format" - } - ], - "argline": "const git_oid *oid", - "sig": "const git_oid *", - "return": { - "type": "char *", - "comment": " the c-string" - }, - "description": "

Format a git_oid into a statically allocated c-string.

\n", - "comments": "

The c-string is owned by the library and should not be freed by the user. If libgit2 is built with thread support, the string will be stored in TLS (i.e. one buffer per thread) to allow for concurrent calls of the function.

\n", - "group": "oid", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_oid_tostr_s-19", - "ex/v1.3.1/merge.html#git_oid_tostr_s-20" - ] - } - }, - "git_oid_tostr": { - "type": "function", - "file": "git2/oid.h", - "line": 151, - "lineto": 151, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "the buffer into which the oid string is output." - }, - { - "name": "n", - "type": "size_t", - "comment": "the size of the out buffer." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the oid structure to format." - } - ], - "argline": "char *out, size_t n, const git_oid *id", - "sig": "char *::size_t::const git_oid *", - "return": { - "type": "char *", - "comment": " the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string." - }, - "description": "

Format a git_oid into a buffer as a hex format c-string.

\n", - "comments": "

If the buffer is smaller than GIT_OID_HEXSZ+1, then the resulting oid c-string will be truncated to n-1 characters (but will still be NUL-byte terminated).

\n\n

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.

\n", - "group": "oid", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_oid_tostr-16", - "ex/v1.3.1/blame.html#git_oid_tostr-17" - ], - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_oid_tostr-24", - "ex/v1.3.1/cat-file.html#git_oid_tostr-25", - "ex/v1.3.1/cat-file.html#git_oid_tostr-26", - "ex/v1.3.1/cat-file.html#git_oid_tostr-27", - "ex/v1.3.1/cat-file.html#git_oid_tostr-28" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_oid_tostr-38", - "ex/v1.3.1/log.html#git_oid_tostr-39" - ], - "rev-parse.c": [ - "ex/v1.3.1/rev-parse.html#git_oid_tostr-10", - "ex/v1.3.1/rev-parse.html#git_oid_tostr-11", - "ex/v1.3.1/rev-parse.html#git_oid_tostr-12", - "ex/v1.3.1/rev-parse.html#git_oid_tostr-13" - ] - } - }, - "git_oid_cpy": { - "type": "function", - "file": "git2/oid.h", - "line": 160, - "lineto": 160, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "oid structure the result is written into." - }, - { - "name": "src", - "type": "const git_oid *", - "comment": "oid structure to copy from." - } - ], - "argline": "git_oid *out, const git_oid *src", - "sig": "git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Copy an oid from one structure to another.

\n", - "comments": "", - "group": "oid", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_oid_cpy-18", - "ex/v1.3.1/blame.html#git_oid_cpy-19", - "ex/v1.3.1/blame.html#git_oid_cpy-20" - ] - } - }, - "git_oid_cmp": { - "type": "function", - "file": "git2/oid.h", - "line": 169, - "lineto": 169, - "args": [ - { - "name": "a", - "type": "const git_oid *", - "comment": "first oid structure." - }, - { - "name": "b", - "type": "const git_oid *", - "comment": "second oid structure." - } - ], - "argline": "const git_oid *a, const git_oid *b", - "sig": "const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " \n<\n0, 0, >0 if a \n<\n b, a == b, a > b." - }, - "description": "

Compare two oid structures.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_equal": { - "type": "function", - "file": "git2/oid.h", - "line": 178, - "lineto": 178, - "args": [ - { - "name": "a", - "type": "const git_oid *", - "comment": "first oid structure." - }, - { - "name": "b", - "type": "const git_oid *", - "comment": "second oid structure." - } - ], - "argline": "const git_oid *a, const git_oid *b", - "sig": "const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " true if equal, false otherwise" - }, - "description": "

Compare two oid structures for equality

\n", - "comments": "", - "group": "oid" - }, - "git_oid_ncmp": { - "type": "function", - "file": "git2/oid.h", - "line": 189, - "lineto": 189, - "args": [ - { - "name": "a", - "type": "const git_oid *", - "comment": "first oid structure." - }, - { - "name": "b", - "type": "const git_oid *", - "comment": "second oid structure." - }, - { - "name": "len", - "type": "size_t", - "comment": "the number of hex chars to compare" - } - ], - "argline": "const git_oid *a, const git_oid *b, size_t len", - "sig": "const git_oid *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 in case of a match" - }, - "description": "

Compare the first 'len' hexadecimal characters (packets of 4 bits)\n of two oid structures.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_streq": { - "type": "function", - "file": "git2/oid.h", - "line": 198, - "lineto": 198, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure." - }, - { - "name": "str", - "type": "const char *", - "comment": "input hex string of an object id." - } - ], - "argline": "const git_oid *id, const char *str", - "sig": "const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 in case of a match, -1 otherwise." - }, - "description": "

Check if an oid equals an hex formatted object id.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_strcmp": { - "type": "function", - "file": "git2/oid.h", - "line": 208, - "lineto": 208, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure." - }, - { - "name": "str", - "type": "const char *", - "comment": "input hex string of an object id." - } - ], - "argline": "const git_oid *id, const char *str", - "sig": "const git_oid *::const char *", - "return": { - "type": "int", - "comment": " -1 if str is not valid, \n<\n0 if id sorts before str,\n 0 if id matches str, >0 if id sorts after str." - }, - "description": "

Compare an oid to an hex formatted object id.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_is_zero": { - "type": "function", - "file": "git2/oid.h", - "line": 215, - "lineto": 215, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": null - } - ], - "argline": "const git_oid *id", - "sig": "const git_oid *", - "return": { - "type": "int", - "comment": " 1 if all zeros, 0 otherwise." - }, - "description": "

Check is an oid is all zeros.

\n", - "comments": "", - "group": "oid", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_oid_is_zero-21" - ], - "fetch.c": [ - "ex/v1.3.1/fetch.html#git_oid_is_zero-3" - ] - } - }, - "git_oid_shorten_new": { - "type": "function", - "file": "git2/oid.h", - "line": 236, - "lineto": 236, - "args": [ - { - "name": "min_length", - "type": "size_t", - "comment": "The minimal length for all identifiers,\n\t\twhich will be used even if shorter OIDs would still\n\t\tbe unique." - } - ], - "argline": "size_t min_length", - "sig": "size_t", - "return": { - "type": "git_oid_shorten *", - "comment": " a `git_oid_shorten` instance, NULL if OOM" - }, - "description": "

Create a new OID shortener.

\n", - "comments": "

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.

\n\n

E.g. look at the result of git log --abbrev.

\n", - "group": "oid" - }, - "git_oid_shorten_add": { - "type": "function", - "file": "git2/oid.h", - "line": 262, - "lineto": 262, - "args": [ - { - "name": "os", - "type": "git_oid_shorten *", - "comment": "a `git_oid_shorten` instance" - }, - { - "name": "text_id", - "type": "const char *", - "comment": "an OID in text form" - } - ], - "argline": "git_oid_shorten *os, const char *text_id", - "sig": "git_oid_shorten *::const char *", - "return": { - "type": "int", - "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." - }, - "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", - "comments": "

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.

\n\n

For performance reasons, there is a hard-limit of how many OIDs can be added to a single set (around ~32000, assuming a mostly randomized distribution), which should be enough for any kind of program, and keeps the algorithm fast and memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a GIT_ERROR_INVALID error

\n", - "group": "oid" - }, - "git_oid_shorten_free": { - "type": "function", - "file": "git2/oid.h", - "line": 269, - "lineto": 269, - "args": [ - { - "name": "os", - "type": "git_oid_shorten *", - "comment": "a `git_oid_shorten` instance" - } - ], - "argline": "git_oid_shorten *os", - "sig": "git_oid_shorten *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an OID shortener instance

\n", - "comments": "", - "group": "oid" - }, - "git_oidarray_dispose": { - "type": "function", - "file": "git2/oidarray.h", - "line": 31, - "lineto": 31, - "args": [ - { - "name": "array", - "type": "git_oidarray *", - "comment": "git_oidarray from which to free oid data" - } - ], - "argline": "git_oidarray *array", - "sig": "git_oidarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the object IDs contained in an oid_array. This method should\n be called on git_oidarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", - "comments": "

This does not free the git_oidarray itself, since the library will never allocate that object directly itself.

\n", - "group": "oidarray" - }, - "git_packbuilder_new": { - "type": "function", - "file": "git2/pack.h", - "line": 65, - "lineto": 65, - "args": [ - { - "name": "out", - "type": "git_packbuilder **", - "comment": "The new packbuilder object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - } - ], - "argline": "git_packbuilder **out, git_repository *repo", - "sig": "git_packbuilder **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Initialize a new packbuilder

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_set_threads": { - "type": "function", - "file": "git2/pack.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "n", - "type": "unsigned int", - "comment": "Number of threads to spawn" - } - ], - "argline": "git_packbuilder *pb, unsigned int n", - "sig": "git_packbuilder *::unsigned int", - "return": { - "type": "unsigned int", - "comment": " number of actual threads to be used" - }, - "description": "

Set number of threads to spawn

\n", - "comments": "

By default, libgit2 won't spawn any threads at all; when set to 0, libgit2 will autodetect the number of CPUs.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert": { - "type": "function", - "file": "git2/pack.h", - "line": 92, - "lineto": 92, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The oid of the commit" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name; might be NULL" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id, const char *name", - "sig": "git_packbuilder *::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert a single object

\n", - "comments": "

For an optimal pack it's mandatory to insert objects in recency order, commits followed by trees and blobs.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_tree": { - "type": "function", - "file": "git2/pack.h", - "line": 104, - "lineto": 104, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The oid of the root tree" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id", - "sig": "git_packbuilder *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert a root tree object

\n", - "comments": "

This will add the tree as well as all referenced trees and blobs.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_commit": { - "type": "function", - "file": "git2/pack.h", - "line": 116, - "lineto": 116, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The oid of the commit" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id", - "sig": "git_packbuilder *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert a commit object

\n", - "comments": "

This will add a commit as well as the completed referenced tree.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_walk": { - "type": "function", - "file": "git2/pack.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - }, - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the revwalk to use to fill the packbuilder" - } - ], - "argline": "git_packbuilder *pb, git_revwalk *walk", - "sig": "git_packbuilder *::git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert objects as given by the walk

\n", - "comments": "

Those commits and all objects they reference will be inserted into the packbuilder.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_recur": { - "type": "function", - "file": "git2/pack.h", - "line": 141, - "lineto": 141, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the id of the root object to insert" - }, - { - "name": "name", - "type": "const char *", - "comment": "optional name for the object" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id, const char *name", - "sig": "git_packbuilder *::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Recursively insert an object and its referenced objects

\n", - "comments": "

Insert the object as well as any object it references.

\n", - "group": "packbuilder" - }, - "git_packbuilder_write_buf": { - "type": "function", - "file": "git2/pack.h", - "line": 152, - "lineto": 152, - "args": [ - { - "name": "buf", - "type": "git_buf *", - "comment": "Buffer where to write the packfile" - }, - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - } - ], - "argline": "git_buf *buf, git_packbuilder *pb", - "sig": "git_buf *::git_packbuilder *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Write the contents of the packfile to an in-memory buffer

\n", - "comments": "

The contents of the buffer will become a valid packfile, even though there will be no attached index

\n", - "group": "packbuilder" - }, - "git_packbuilder_write": { - "type": "function", - "file": "git2/pack.h", - "line": 165, - "lineto": 170, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to the directory where the packfile and index should be stored, or NULL for default location" - }, - { - "name": "mode", - "type": "unsigned int", - "comment": "permissions to use creating a packfile or 0 for defaults" - }, - { - "name": "progress_cb", - "type": "git_indexer_progress_cb", - "comment": "function to call with progress information from the indexer (optional)" - }, - { - "name": "progress_cb_payload", - "type": "void *", - "comment": "payload for the progress callback (optional)" - } - ], - "argline": "git_packbuilder *pb, const char *path, unsigned int mode, git_indexer_progress_cb progress_cb, void *progress_cb_payload", - "sig": "git_packbuilder *::const char *::unsigned int::git_indexer_progress_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write the new pack and corresponding index file to path.

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_hash": { - "type": "function", - "file": "git2/pack.h", - "line": 180, - "lineto": 180, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder object" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "const git_oid *", - "comment": null - }, - "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the packfile has been written.

\n", - "group": "packbuilder" - }, - "git_packbuilder_foreach": { - "type": "function", - "file": "git2/pack.h", - "line": 202, - "lineto": 202, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - }, - { - "name": "cb", - "type": "git_packbuilder_foreach_cb", - "comment": "the callback to call with each packed object's buffer" - }, - { - "name": "payload", - "type": "void *", - "comment": "the callback's data" - } - ], - "argline": "git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload", - "sig": "git_packbuilder *::git_packbuilder_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create the new pack and pass each object to the callback

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_object_count": { - "type": "function", - "file": "git2/pack.h", - "line": 210, - "lineto": 210, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "size_t", - "comment": " the number of objects in the packfile" - }, - "description": "

Get the total number of objects the packbuilder will write out

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_written": { - "type": "function", - "file": "git2/pack.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "size_t", - "comment": " the number of objects which have already been written" - }, - "description": "

Get the number of objects the packbuilder has already written out

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_set_callbacks": { - "type": "function", - "file": "git2/pack.h", - "line": 237, - "lineto": 240, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder object" - }, - { - "name": "progress_cb", - "type": "git_packbuilder_progress", - "comment": "Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected." - }, - { - "name": "progress_cb_payload", - "type": "void *", - "comment": "Payload for progress callback." - } - ], - "argline": "git_packbuilder *pb, git_packbuilder_progress progress_cb, void *progress_cb_payload", - "sig": "git_packbuilder *::git_packbuilder_progress::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the callbacks for a packbuilder

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_free": { - "type": "function", - "file": "git2/pack.h", - "line": 247, - "lineto": 247, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the packbuilder and all associated data

\n", - "comments": "", - "group": "packbuilder" - }, - "git_patch_owner": { - "type": "function", - "file": "git2/patch.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": "the patch" - } - ], - "argline": "const git_patch *patch", - "sig": "const git_patch *", - "return": { - "type": "git_repository *", - "comment": " a pointer to the repository" - }, - "description": "

Get the repository associated with this patch. May be NULL.

\n", - "comments": "", - "group": "patch" - }, - "git_patch_from_diff": { - "type": "function", - "file": "git2/patch.h", - "line": 59, - "lineto": 60, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "Output parameter for the delta patch object" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "Diff list object" - }, - { - "name": "idx", - "type": "size_t", - "comment": "Index into diff list" - } - ], - "argline": "git_patch **out, git_diff *diff, size_t idx", - "sig": "git_patch **::git_diff *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, other value \n<\n 0 on error" - }, - "description": "

Return a patch for an entry in the diff list.

\n", - "comments": "

The git_patch is a newly created object contains the text diffs for the delta. You have to call git_patch_free() when you are done with it. You can use the patch object to loop over all the hunks and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be created, the output will be set to NULL, and the binary flag will be set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass NULL for the git_patch, then the text diff will not be calculated.

\n", - "group": "patch" - }, - "git_patch_from_blobs": { - "type": "function", - "file": "git2/patch.h", - "line": 78, - "lineto": 84, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "The generated patch; NULL on error" - }, - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "new_blob", - "type": "const git_blob *", - "comment": "Blob for new side of diff, or NULL for empty blob" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat new blob as if it had this filename; can be NULL" - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - } - ], - "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *opts", - "sig": "git_patch **::const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code \n<\n 0" - }, - "description": "

Directly generate a patch from the difference between two blobs.

\n", - "comments": "

This is just like git_diff_blobs() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", - "group": "patch" - }, - "git_patch_from_blob_and_buffer": { - "type": "function", - "file": "git2/patch.h", - "line": 103, - "lineto": 110, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "The generated patch; NULL on error" - }, - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "buffer", - "type": "const void *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "buffer_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "buffer_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - } - ], - "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const void *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *opts", - "sig": "git_patch **::const git_blob *::const char *::const void *::size_t::const char *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code \n<\n 0" - }, - "description": "

Directly generate a patch from the difference between a blob and a buffer.

\n", - "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", - "group": "patch" - }, - "git_patch_from_buffers": { - "type": "function", - "file": "git2/patch.h", - "line": 130, - "lineto": 138, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "The generated patch; NULL on error" - }, - { - "name": "old_buffer", - "type": "const void *", - "comment": "Raw data for old side of diff, or NULL for empty" - }, - { - "name": "old_len", - "type": "size_t", - "comment": "Length of the raw data for old side of the diff" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old buffer as if it had this filename; can be NULL" - }, - { - "name": "new_buffer", - "type": "const void *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "new_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - } - ], - "argline": "git_patch **out, const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *opts", - "sig": "git_patch **::const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code \n<\n 0" - }, - "description": "

Directly generate a patch from the difference between two buffers.

\n", - "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", - "group": "patch", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_patch_from_buffers-15" - ] - } - }, - "git_patch_free": { - "type": "function", - "file": "git2/patch.h", - "line": 143, - "lineto": 143, - "args": [ - { - "name": "patch", - "type": "git_patch *", - "comment": null - } - ], - "argline": "git_patch *patch", - "sig": "git_patch *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a git_patch object.

\n", - "comments": "", - "group": "patch", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_patch_free-16" - ] - } - }, - "git_patch_get_delta": { - "type": "function", - "file": "git2/patch.h", - "line": 149, - "lineto": 149, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": null - } - ], - "argline": "const git_patch *patch", - "sig": "const git_patch *", - "return": { - "type": "const git_diff_delta *", - "comment": null - }, - "description": "

Get the delta associated with a patch. This delta points to internal\n data and you do not have to release it when you are done with it.

\n", - "comments": "", - "group": "patch" - }, - "git_patch_num_hunks": { - "type": "function", - "file": "git2/patch.h", - "line": 154, - "lineto": 154, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": null - } - ], - "argline": "const git_patch *patch", - "sig": "const git_patch *", - "return": { - "type": "size_t", - "comment": null - }, - "description": "

Get the number of hunks in a patch

\n", - "comments": "", - "group": "patch" - }, - "git_patch_line_stats": { - "type": "function", - "file": "git2/patch.h", - "line": 172, - "lineto": 176, - "args": [ - { - "name": "total_context", - "type": "size_t *", - "comment": "Count of context lines in output, can be NULL." - }, - { - "name": "total_additions", - "type": "size_t *", - "comment": "Count of addition lines in output, can be NULL." - }, - { - "name": "total_deletions", - "type": "size_t *", - "comment": "Count of deletion lines in output, can be NULL." - }, - { - "name": "patch", - "type": "const git_patch *", - "comment": "The git_patch object" - } - ], - "argline": "size_t *total_context, size_t *total_additions, size_t *total_deletions, const git_patch *patch", - "sig": "size_t *::size_t *::size_t *::const git_patch *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Get line counts of each type in a patch.

\n", - "comments": "

This helps imitate a diff --numstat type of output. For that purpose, you only need the total_additions and total_deletions values, but we include the total_context line count in case you want the total number of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", - "group": "patch" - }, - "git_patch_get_hunk": { - "type": "function", - "file": "git2/patch.h", - "line": 191, - "lineto": 195, - "args": [ - { - "name": "out", - "type": "const git_diff_hunk **", - "comment": "Output pointer to git_diff_hunk of hunk" - }, - { - "name": "lines_in_hunk", - "type": "size_t *", - "comment": "Output count of total lines in this hunk" - }, - { - "name": "patch", - "type": "git_patch *", - "comment": "Input pointer to patch object" - }, - { - "name": "hunk_idx", - "type": "size_t", - "comment": "Input index of hunk to get information about" - } - ], - "argline": "const git_diff_hunk **out, size_t *lines_in_hunk, git_patch *patch, size_t hunk_idx", - "sig": "const git_diff_hunk **::size_t *::git_patch *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error" - }, - "description": "

Get the information about a hunk in a patch

\n", - "comments": "

Given a patch and a hunk index into the patch, this returns detailed information about that hunk. Any of the output pointers can be passed as NULL if you don't care about that particular piece of information.

\n", - "group": "patch" - }, - "git_patch_num_lines_in_hunk": { - "type": "function", - "file": "git2/patch.h", - "line": 204, - "lineto": 206, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": "The git_patch object" - }, - { - "name": "hunk_idx", - "type": "size_t", - "comment": "Index of the hunk" - } - ], - "argline": "const git_patch *patch, size_t hunk_idx", - "sig": "const git_patch *::size_t", - "return": { - "type": "int", - "comment": " Number of lines in hunk or GIT_ENOTFOUND if invalid hunk index" - }, - "description": "

Get the number of lines in a hunk.

\n", - "comments": "", - "group": "patch" - }, - "git_patch_get_line_in_hunk": { - "type": "function", - "file": "git2/patch.h", - "line": 222, - "lineto": 226, - "args": [ - { - "name": "out", - "type": "const git_diff_line **", - "comment": "The git_diff_line data for this line" - }, - { - "name": "patch", - "type": "git_patch *", - "comment": "The patch to look in" - }, - { - "name": "hunk_idx", - "type": "size_t", - "comment": "The index of the hunk" - }, - { - "name": "line_of_hunk", - "type": "size_t", - "comment": "The index of the line in the hunk" - } - ], - "argline": "const git_diff_line **out, git_patch *patch, size_t hunk_idx, size_t line_of_hunk", - "sig": "const git_diff_line **::git_patch *::size_t::size_t", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Get data about a line in a hunk of a patch.

\n", - "comments": "

Given a patch, a hunk index, and a line index in the hunk, this will return a lot of details about that line. If you pass a hunk index larger than the number of hunks or a line index larger than the number of lines in the hunk, this will return -1.

\n", - "group": "patch" - }, - "git_patch_size": { - "type": "function", - "file": "git2/patch.h", - "line": 244, - "lineto": 248, - "args": [ - { - "name": "patch", - "type": "git_patch *", - "comment": "A git_patch representing changes to one file" - }, - { - "name": "include_context", - "type": "int", - "comment": "Include context lines in size if non-zero" - }, - { - "name": "include_hunk_headers", - "type": "int", - "comment": "Include hunk header lines if non-zero" - }, - { - "name": "include_file_headers", - "type": "int", - "comment": "Include file header lines if non-zero" - } - ], - "argline": "git_patch *patch, int include_context, int include_hunk_headers, int include_file_headers", - "sig": "git_patch *::int::int::int", - "return": { - "type": "size_t", - "comment": " The number of bytes of data" - }, - "description": "

Look up size of patch diff data in bytes

\n", - "comments": "

This returns the raw size of the patch data. This only includes the actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size of all of the diff output; if you pass it as false (zero), this will only include the actual changed lines (as if context_lines was 0).

\n", - "group": "patch" - }, - "git_patch_print": { - "type": "function", - "file": "git2/patch.h", - "line": 262, - "lineto": 265, - "args": [ - { - "name": "patch", - "type": "git_patch *", - "comment": "A git_patch representing changes to one file" - }, - { - "name": "print_cb", - "type": "git_diff_line_cb", - "comment": "Callback function to output lines of the patch. Will be\n called for file headers, hunk headers, and diff lines." - }, - { - "name": "payload", - "type": "void *", - "comment": "Reference pointer that will be passed to your callbacks." - } - ], - "argline": "git_patch *patch, git_diff_line_cb print_cb, void *payload", - "sig": "git_patch *::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Serialize the patch to text via callback.

\n", - "comments": "

Returning a non-zero value from the callback will terminate the iteration and return that value to the caller.

\n", - "group": "patch" - }, - "git_patch_to_buf": { - "type": "function", - "file": "git2/patch.h", - "line": 274, - "lineto": 276, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The git_buf to be filled in" - }, - { - "name": "patch", - "type": "git_patch *", - "comment": "A git_patch representing changes to one file" - } - ], - "argline": "git_buf *out, git_patch *patch", - "sig": "git_buf *::git_patch *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure." - }, - "description": "

Get the content of a patch as a single diff text.

\n", - "comments": "", - "group": "patch", - "examples": { - "diff.c": [ - "ex/v1.3.1/diff.html#git_patch_to_buf-17" - ] - } - }, - "git_pathspec_new": { - "type": "function", - "file": "git2/pathspec.h", - "line": 82, - "lineto": 83, - "args": [ - { - "name": "out", - "type": "git_pathspec **", - "comment": "Output of the compiled pathspec" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "A git_strarray of the paths to match" - } - ], - "argline": "git_pathspec **out, const git_strarray *pathspec", - "sig": "git_pathspec **::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Compile a pathspec

\n", - "comments": "", - "group": "pathspec", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_pathspec_new-40" - ] - } - }, - "git_pathspec_free": { - "type": "function", - "file": "git2/pathspec.h", - "line": 90, - "lineto": 90, - "args": [ - { - "name": "ps", - "type": "git_pathspec *", - "comment": "The compiled pathspec" - } - ], - "argline": "git_pathspec *ps", - "sig": "git_pathspec *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a pathspec

\n", - "comments": "", - "group": "pathspec", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_pathspec_free-41" - ] - } - }, - "git_pathspec_matches_path": { - "type": "function", - "file": "git2/pathspec.h", - "line": 105, - "lineto": 106, - "args": [ - { - "name": "ps", - "type": "const git_pathspec *", - "comment": "The compiled pathspec" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "path", - "type": "const char *", - "comment": "The pathname to attempt to match" - } - ], - "argline": "const git_pathspec *ps, uint32_t flags, const char *path", - "sig": "const git_pathspec *::uint32_t::const char *", - "return": { - "type": "int", - "comment": " 1 is path matches spec, 0 if it does not" - }, - "description": "

Try to match a path against a pathspec

\n", - "comments": "

Unlike most of the other pathspec matching functions, this will not fall back on the native case-sensitivity for your platform. You must explicitly pass flags to control case sensitivity or else this will fall back on being case sensitive.

\n", - "group": "pathspec" - }, - "git_pathspec_match_workdir": { - "type": "function", - "file": "git2/pathspec.h", - "line": 130, - "lineto": 134, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository in which to match; bare repo is an error" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" - }, - "description": "

Match a pathspec against the working directory of a repository.

\n", - "comments": "

This matches the pathspec against the current files in the working directory of the repository. It is an error to invoke this on a bare repo. This handles git ignores (i.e. ignored files will not be considered to match the pathspec unless the file is tracked in the index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec" - }, - "git_pathspec_match_index": { - "type": "function", - "file": "git2/pathspec.h", - "line": 159, - "lineto": 163, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to match against" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" - }, - "description": "

Match a pathspec against entries in an index.

\n", - "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled by the current case-sensitivity of the index object itself and the USE_CASE and IGNORE_CASE flags will have no effect. This behavior will be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec" - }, - "git_pathspec_match_tree": { - "type": "function", - "file": "git2/pathspec.h", - "line": 183, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "tree", - "type": "git_tree *", - "comment": "The root-level tree to match against" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" - }, - "description": "

Match a pathspec against files in a tree.

\n", - "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_pathspec_match_tree-42" - ] - } - }, - "git_pathspec_match_diff": { - "type": "function", - "file": "git2/pathspec.h", - "line": 207, - "lineto": 211, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "A generated diff list" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" - }, - "description": "

Match a pathspec against files in a diff list.

\n", - "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_free": { - "type": "function", - "file": "git2/pathspec.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "m", - "type": "git_pathspec_match_list *", - "comment": "The git_pathspec_match_list to be freed" - } - ], - "argline": "git_pathspec_match_list *m", - "sig": "git_pathspec_match_list *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free memory associates with a git_pathspec_match_list

\n", - "comments": "", - "group": "pathspec" - }, - "git_pathspec_match_list_entrycount": { - "type": "function", - "file": "git2/pathspec.h", - "line": 226, - "lineto": 227, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - } - ], - "argline": "const git_pathspec_match_list *m", - "sig": "const git_pathspec_match_list *", - "return": { - "type": "size_t", - "comment": " Number of items in match list" - }, - "description": "

Get the number of items in a match list.

\n", - "comments": "", - "group": "pathspec" - }, - "git_pathspec_match_list_entry": { - "type": "function", - "file": "git2/pathspec.h", - "line": 239, - "lineto": 240, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - }, - { - "name": "pos", - "type": "size_t", - "comment": "The index into the list" - } - ], - "argline": "const git_pathspec_match_list *m, size_t pos", - "sig": "const git_pathspec_match_list *::size_t", - "return": { - "type": "const char *", - "comment": " The filename of the match" - }, - "description": "

Get a matching filename by position.

\n", - "comments": "

This routine cannot be used if the match list was generated by git_pathspec_match_diff. If so, it will always return NULL.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_diff_entry": { - "type": "function", - "file": "git2/pathspec.h", - "line": 252, - "lineto": 253, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - }, - { - "name": "pos", - "type": "size_t", - "comment": "The index into the list" - } - ], - "argline": "const git_pathspec_match_list *m, size_t pos", - "sig": "const git_pathspec_match_list *::size_t", - "return": { - "type": "const git_diff_delta *", - "comment": " The filename of the match" - }, - "description": "

Get a matching diff delta by position.

\n", - "comments": "

This routine can only be used if the match list was generated by git_pathspec_match_diff. Otherwise it will always return NULL.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_failed_entrycount": { - "type": "function", - "file": "git2/pathspec.h", - "line": 264, - "lineto": 265, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - } - ], - "argline": "const git_pathspec_match_list *m", - "sig": "const git_pathspec_match_list *", - "return": { - "type": "size_t", - "comment": " Number of items in original pathspec that had no matches" - }, - "description": "

Get the number of pathspec items that did not match.

\n", - "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when generating the git_pathspec_match_list.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_failed_entry": { - "type": "function", - "file": "git2/pathspec.h", - "line": 276, - "lineto": 277, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - }, - { - "name": "pos", - "type": "size_t", - "comment": "The index into the failed items" - } - ], - "argline": "const git_pathspec_match_list *m, size_t pos", - "sig": "const git_pathspec_match_list *::size_t", - "return": { - "type": "const char *", - "comment": " The pathspec pattern that didn't match anything" - }, - "description": "

Get an original pathspec string that had no matches.

\n", - "comments": "

This will be return NULL for positions out of range.

\n", - "group": "pathspec" - }, - "git_proxy_options_init": { - "type": "function", - "file": "git2/proxy.h", - "line": 94, - "lineto": 94, - "args": [ - { - "name": "opts", - "type": "git_proxy_options *", - "comment": "The `git_proxy_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_PROXY_OPTIONS_VERSION`." - } - ], - "argline": "git_proxy_options *opts, unsigned int version", - "sig": "git_proxy_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_proxy_options structure

\n", - "comments": "

Initializes a git_proxy_options with default values. Equivalent to creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", - "group": "proxy" - }, - "git_rebase_options_init": { - "type": "function", - "file": "git2/rebase.h", - "line": 199, - "lineto": 201, - "args": [ - { - "name": "opts", - "type": "git_rebase_options *", - "comment": "The `git_rebase_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REBASE_OPTIONS_VERSION`." - } - ], - "argline": "git_rebase_options *opts, unsigned int version", - "sig": "git_rebase_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_rebase_options structure

\n", - "comments": "

Initializes a git_rebase_options with default values. Equivalent to creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", - "group": "rebase" - }, - "git_rebase_init": { - "type": "function", - "file": "git2/rebase.h", - "line": 220, - "lineto": 226, - "args": [ - { - "name": "out", - "type": "git_rebase **", - "comment": "Pointer to store the rebase object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository to perform the rebase" - }, - { - "name": "branch", - "type": "const git_annotated_commit *", - "comment": "The terminal commit to rebase, or NULL to rebase the\n current branch" - }, - { - "name": "upstream", - "type": "const git_annotated_commit *", - "comment": "The commit to begin rebasing from, or NULL to rebase all\n reachable commits" - }, - { - "name": "onto", - "type": "const git_annotated_commit *", - "comment": "The branch to rebase onto, or NULL to rebase onto the given\n upstream" - }, - { - "name": "opts", - "type": "const git_rebase_options *", - "comment": "Options to specify how rebase is performed, or NULL" - } - ], - "argline": "git_rebase **out, git_repository *repo, const git_annotated_commit *branch, const git_annotated_commit *upstream, const git_annotated_commit *onto, const git_rebase_options *opts", - "sig": "git_rebase **::git_repository *::const git_annotated_commit *::const git_annotated_commit *::const git_annotated_commit *::const git_rebase_options *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a rebase operation to rebase the changes in branch\n relative to upstream onto another branch. To begin the rebase\n process, call git_rebase_next. When you have finished with this\n object, call git_rebase_free.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_open": { - "type": "function", - "file": "git2/rebase.h", - "line": 237, - "lineto": 240, - "args": [ - { - "name": "out", - "type": "git_rebase **", - "comment": "Pointer to store the rebase object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository that has a rebase in-progress" - }, - { - "name": "opts", - "type": "const git_rebase_options *", - "comment": "Options to specify how rebase is performed" - } - ], - "argline": "git_rebase **out, git_repository *repo, const git_rebase_options *opts", - "sig": "git_rebase **::git_repository *::const git_rebase_options *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Opens an existing rebase that was previously started by either an\n invocation of git_rebase_init or by another client.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_orig_head_name": { - "type": "function", - "file": "git2/rebase.h", - "line": 247, - "lineto": 247, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": null - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const char *", - "comment": " The original `HEAD` ref name" - }, - "description": "

Gets the original HEAD ref name for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_orig_head_id": { - "type": "function", - "file": "git2/rebase.h", - "line": 254, - "lineto": 254, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": null - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const git_oid *", - "comment": " The original `HEAD` id" - }, - "description": "

Gets the original HEAD id for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_onto_name": { - "type": "function", - "file": "git2/rebase.h", - "line": 261, - "lineto": 261, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": null - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const char *", - "comment": " The `onto` ref name" - }, - "description": "

Gets the onto ref name for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_onto_id": { - "type": "function", - "file": "git2/rebase.h", - "line": 268, - "lineto": 268, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": null - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const git_oid *", - "comment": " The `onto` id" - }, - "description": "

Gets the onto id for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_operation_entrycount": { - "type": "function", - "file": "git2/rebase.h", - "line": 276, - "lineto": 276, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "size_t", - "comment": " The number of rebase operations in total" - }, - "description": "

Gets the count of rebase operations that are to be applied.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_operation_current": { - "type": "function", - "file": "git2/rebase.h", - "line": 287, - "lineto": 287, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "size_t", - "comment": " The index of the rebase operation currently being applied." - }, - "description": "

Gets the index of the rebase operation that is currently being applied.\n If the first operation has not yet been applied (because you have\n called init but not yet next) then this returns\n GIT_REBASE_NO_OPERATION.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_operation_byindex": { - "type": "function", - "file": "git2/rebase.h", - "line": 296, - "lineto": 298, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase" - }, - { - "name": "idx", - "type": "size_t", - "comment": "The index of the rebase operation to retrieve" - } - ], - "argline": "git_rebase *rebase, size_t idx", - "sig": "git_rebase *::size_t", - "return": { - "type": "git_rebase_operation *", - "comment": " The rebase operation or NULL if `idx` was out of bounds" - }, - "description": "

Gets the rebase operation specified by the given index.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_next": { - "type": "function", - "file": "git2/rebase.h", - "line": 311, - "lineto": 313, - "args": [ - { - "name": "operation", - "type": "git_rebase_operation **", - "comment": "Pointer to store the rebase operation that is to be performed next" - }, - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase in progress" - } - ], - "argline": "git_rebase_operation **operation, git_rebase *rebase", - "sig": "git_rebase_operation **::git_rebase *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Performs the next rebase operation and returns the information about it.\n If the operation is one that applies a patch (which is any operation except\n GIT_REBASE_OPERATION_EXEC) then the patch will be applied and the index and\n working directory will be updated with the changes. If there are conflicts,\n you will need to address those before committing the changes.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_inmemory_index": { - "type": "function", - "file": "git2/rebase.h", - "line": 326, - "lineto": 328, - "args": [ - { - "name": "index", - "type": "git_index **", - "comment": null - }, - { - "name": "rebase", - "type": "git_rebase *", - "comment": null - } - ], - "argline": "git_index **index, git_rebase *rebase", - "sig": "git_index **::git_rebase *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Gets the index produced by the last operation, which is the result\n of git_rebase_next and which will be committed by the next\n invocation of git_rebase_commit. This is useful for resolving\n conflicts in an in-memory rebase before committing them. You must\n call git_index_free when you are finished with this.

\n", - "comments": "

This is only applicable for in-memory rebases; for rebases within a working directory, the changes were applied to the repository's index.

\n", - "group": "rebase" - }, - "git_rebase_commit": { - "type": "function", - "file": "git2/rebase.h", - "line": 352, - "lineto": 358, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "Pointer in which to store the OID of the newly created commit" - }, - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase that is in-progress" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "The author of the updated commit, or NULL to keep the\n author from the original commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "The committer of the rebase" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "The encoding for the message in the commit,\n represented with a standard encoding name. If message is NULL,\n this should also be NULL, and the encoding from the original\n commit will be maintained. If message is specified, this may be\n NULL to indicate that \"UTF-8\" is to be used." - }, - { - "name": "message", - "type": "const char *", - "comment": "The message for this commit, or NULL to use the message\n from the original commit." - } - ], - "argline": "git_oid *id, git_rebase *rebase, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message", - "sig": "git_oid *::git_rebase *::const git_signature *::const git_signature *::const char *::const char *", - "return": { - "type": "int", - "comment": " Zero on success, GIT_EUNMERGED if there are unmerged changes in\n the index, GIT_EAPPLIED if the current commit has already\n been applied to the upstream and there is nothing to commit,\n -1 on failure." - }, - "description": "

Commits the current patch. You must have resolved any conflicts that\n were introduced during the patch application from the git_rebase_next\n invocation.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_abort": { - "type": "function", - "file": "git2/rebase.h", - "line": 368, - "lineto": 368, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase that is in-progress" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND if a rebase is not in progress,\n -1 on other errors." - }, - "description": "

Aborts a rebase that is currently in progress, resetting the repository\n and working directory to their state before rebase began.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_finish": { - "type": "function", - "file": "git2/rebase.h", - "line": 378, - "lineto": 380, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase that is in-progress" - }, - { - "name": "signature", - "type": "const git_signature *", - "comment": "The identity that is finishing the rebase (optional)" - } - ], - "argline": "git_rebase *rebase, const git_signature *signature", - "sig": "git_rebase *::const git_signature *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on error" - }, - "description": "

Finishes a rebase that is currently in progress once all patches have\n been applied.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_free": { - "type": "function", - "file": "git2/rebase.h", - "line": 387, - "lineto": 387, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase object" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees the git_rebase object.

\n", - "comments": "", - "group": "rebase" - }, - "git_refdb_new": { - "type": "function", - "file": "git2/refdb.h", - "line": 35, - "lineto": 35, - "args": [ - { - "name": "out", - "type": "git_refdb **", - "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_refdb **out, git_repository *repo", - "sig": "git_refdb **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new reference database with no backends.

\n", - "comments": "

Before the Ref DB can be used for read/writing, a custom database backend must be manually set using git_refdb_set_backend()

\n", - "group": "refdb" - }, - "git_refdb_open": { - "type": "function", - "file": "git2/refdb.h", - "line": 49, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_refdb **", - "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_refdb **out, git_repository *repo", - "sig": "git_refdb **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new reference database and automatically add\n the default backends:

\n", - "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs from disk, assuming the repository dir as the folder
  • \n
\n", - "group": "refdb" - }, - "git_refdb_compress": { - "type": "function", - "file": "git2/refdb.h", - "line": 56, - "lineto": 56, - "args": [ - { - "name": "refdb", - "type": "git_refdb *", - "comment": null - } - ], - "argline": "git_refdb *refdb", - "sig": "git_refdb *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. For on-disk reference\n databases, for example, this may pack all loose references.

\n", - "comments": "", - "group": "refdb" - }, - "git_refdb_free": { - "type": "function", - "file": "git2/refdb.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "refdb", - "type": "git_refdb *", - "comment": "reference database pointer or NULL" - } - ], - "argline": "git_refdb *refdb", - "sig": "git_refdb *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open reference database.

\n", - "comments": "", - "group": "refdb" - }, - "git_reflog_read": { - "type": "function", - "file": "git2/reflog.h", - "line": 38, - "lineto": 38, - "args": [ - { - "name": "out", - "type": "git_reflog **", - "comment": "pointer to reflog" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repostiory" - }, - { - "name": "name", - "type": "const char *", - "comment": "reference to look up" - } - ], - "argline": "git_reflog **out, git_repository *repo, const char *name", - "sig": "git_reflog **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the reflog for the given reference

\n", - "comments": "

If there is no reflog file for the given reference yet, an empty reflog object will be returned.

\n\n

The reflog must be freed manually by using git_reflog_free().

\n", - "group": "reflog" - }, - "git_reflog_write": { - "type": "function", - "file": "git2/reflog.h", - "line": 47, - "lineto": 47, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "an existing reflog object" - } - ], - "argline": "git_reflog *reflog", - "sig": "git_reflog *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an existing in-memory reflog object back to disk\n using an atomic file lock.

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_append": { - "type": "function", - "file": "git2/reflog.h", - "line": 60, - "lineto": 60, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "an existing reflog object" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the OID the reference is now pointing to" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "the signature of the committer" - }, - { - "name": "msg", - "type": "const char *", - "comment": "the reflog message" - } - ], - "argline": "git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg", - "sig": "git_reflog *::const git_oid *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a new entry to the in-memory reflog.

\n", - "comments": "

msg is optional and can be NULL.

\n", - "group": "reflog" - }, - "git_reflog_rename": { - "type": "function", - "file": "git2/reflog.h", - "line": 75, - "lineto": 75, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "old_name", - "type": "const char *", - "comment": "the old name of the reference" - }, - { - "name": "name", - "type": "const char *", - "comment": "the new name of the reference" - } - ], - "argline": "git_repository *repo, const char *old_name, const char *name", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Rename a reflog

\n", - "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity. See git_reference_create_symbolic() for rules about valid names.

\n", - "group": "reflog" - }, - "git_reflog_delete": { - "type": "function", - "file": "git2/reflog.h", - "line": 84, - "lineto": 84, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "name", - "type": "const char *", - "comment": "the reflog to delete" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Delete the reflog for the given reference

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entrycount": { - "type": "function", - "file": "git2/reflog.h", - "line": 92, - "lineto": 92, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "the previously loaded reflog" - } - ], - "argline": "git_reflog *reflog", - "sig": "git_reflog *", - "return": { - "type": "size_t", - "comment": " the number of log entries" - }, - "description": "

Get the number of log entries in a reflog

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_byindex": { - "type": "function", - "file": "git2/reflog.h", - "line": 105, - "lineto": 105, - "args": [ - { - "name": "reflog", - "type": "const git_reflog *", - "comment": "a previously loaded reflog" - }, - { - "name": "idx", - "type": "size_t", - "comment": "the position of the entry to lookup. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." - } - ], - "argline": "const git_reflog *reflog, size_t idx", - "sig": "const git_reflog *::size_t", - "return": { - "type": "const git_reflog_entry *", - "comment": " the entry; NULL if not found" - }, - "description": "

Lookup an entry by its index

\n", - "comments": "

Requesting the reflog entry with an index of 0 (zero) will return the most recently created entry.

\n", - "group": "reflog" - }, - "git_reflog_drop": { - "type": "function", - "file": "git2/reflog.h", - "line": 124, - "lineto": 127, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "a previously loaded reflog." - }, - { - "name": "idx", - "type": "size_t", - "comment": "the position of the entry to remove. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." - }, - { - "name": "rewrite_previous_entry", - "type": "int", - "comment": "1 to rewrite the history; 0 otherwise." - } - ], - "argline": "git_reflog *reflog, size_t idx, int rewrite_previous_entry", - "sig": "git_reflog *::size_t::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code." - }, - "description": "

Remove an entry from the reflog by its index

\n", - "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry param value to 1. When deleting entry n, member old_oid of entry n-1 (if any) will be updated with the value of member new_oid of entry n+1.

\n", - "group": "reflog" - }, - "git_reflog_entry_id_old": { - "type": "function", - "file": "git2/reflog.h", - "line": 135, - "lineto": 135, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const git_oid *", - "comment": " the old oid" - }, - "description": "

Get the old oid

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_id_new": { - "type": "function", - "file": "git2/reflog.h", - "line": 143, - "lineto": 143, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const git_oid *", - "comment": " the new oid at this time" - }, - "description": "

Get the new oid

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_committer": { - "type": "function", - "file": "git2/reflog.h", - "line": 151, - "lineto": 151, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const git_signature *", - "comment": " the committer" - }, - "description": "

Get the committer of this entry

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_message": { - "type": "function", - "file": "git2/reflog.h", - "line": 159, - "lineto": 159, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const char *", - "comment": " the log msg" - }, - "description": "

Get the log message

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_free": { - "type": "function", - "file": "git2/reflog.h", - "line": 166, - "lineto": 166, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "reflog to free" - } - ], - "argline": "git_reflog *reflog", - "sig": "git_reflog *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the reflog

\n", - "comments": "", - "group": "reflog" - }, - "git_reference_lookup": { - "type": "function", - "file": "git2/refs.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the looked-up reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the reference" - }, - { - "name": "name", - "type": "const char *", - "comment": "the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name", - "sig": "git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." - }, - "description": "

Lookup a reference by name in a repository.

\n", - "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_reference_lookup-15", - "ex/v1.3.1/checkout.html#git_reference_lookup-16" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_reference_lookup-61" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_lookup-21" - ] - } - }, - "git_reference_name_to_id": { - "type": "function", - "file": "git2/refs.h", - "line": 54, - "lineto": 55, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer to oid to be filled in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository in which to look up the reference" - }, - { - "name": "name", - "type": "const char *", - "comment": "The long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" - } - ], - "argline": "git_oid *out, git_repository *repo, const char *name", - "sig": "git_oid *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." - }, - "description": "

Lookup a reference by name and resolve immediately to OID.

\n", - "comments": "

This function provides a quick way to resolve a reference name straight through to the object id that it refers to. This avoids having to allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference" - }, - "git_reference_dwim": { - "type": "function", - "file": "git2/refs.h", - "line": 68, - "lineto": 68, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer in which to store the reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "shorthand", - "type": "const char *", - "comment": "the short name for the reference" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *shorthand", - "sig": "git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a reference by DWIMing its short name

\n", - "comments": "

Apply the git precendence rules to the given shorthand to determine which reference the user is referring to.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_dwim-22" - ] - } - }, - "git_reference_symbolic_create_matching": { - "type": "function", - "file": "git2/refs.h", - "line": 112, - "lineto": 112, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "target", - "type": "const char *", - "comment": "The target of the reference" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "current_value", - "type": "const char *", - "comment": "The expected value of the reference when updating" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *current_value, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" - }, - "description": "

Conditionally create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n\n

If current_value is all zeros, this function will return GIT_EMODIFIED if the ref already exists.

\n", - "group": "reference" - }, - "git_reference_symbolic_create": { - "type": "function", - "file": "git2/refs.h", - "line": 148, - "lineto": 148, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "target", - "type": "const char *", - "comment": "The target of the reference" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", - "group": "reference" - }, - "git_reference_create": { - "type": "function", - "file": "git2/refs.h", - "line": 185, - "lineto": 185, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The object id pointed to by the reference." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Create a new direct reference.

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_create-23" - ] - } - }, - "git_reference_create_matching": { - "type": "function", - "file": "git2/refs.h", - "line": 228, - "lineto": 228, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The object id pointed to by the reference." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "current_id", - "type": "const git_oid *", - "comment": "The expected value of the reference at the time of update" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_oid *current_id, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Conditionally create new direct reference

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", - "group": "reference" - }, - "git_reference_target": { - "type": "function", - "file": "git2/refs.h", - "line": 243, - "lineto": 243, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the oid if available, NULL otherwise" - }, - "description": "

Get the OID pointed to by a direct reference.

\n", - "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_reference_target-62" - ] - } - }, - "git_reference_target_peel": { - "type": "function", - "file": "git2/refs.h", - "line": 254, - "lineto": 254, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the oid if available, NULL otherwise" - }, - "description": "

Return the peeled OID target of this reference.

\n", - "comments": "

This peeled OID only applies to direct references that point to a hard Tag object: it is the result of peeling such Tag.

\n", - "group": "reference" - }, - "git_reference_symbolic_target": { - "type": "function", - "file": "git2/refs.h", - "line": 264, - "lineto": 264, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const char *", - "comment": " a pointer to the name if available, NULL otherwise" - }, - "description": "

Get full name to the reference pointed to by a symbolic reference.

\n", - "comments": "

Only available if the reference is symbolic.

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_reference_symbolic_target-63" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_symbolic_target-24" - ] - } - }, - "git_reference_type": { - "type": "function", - "file": "git2/refs.h", - "line": 274, - "lineto": 274, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "git_reference_t", - "comment": " the type" - }, - "description": "

Get the type of a reference.

\n", - "comments": "

Either direct (GIT_REFERENCE_DIRECT) or symbolic (GIT_REFERENCE_SYMBOLIC)

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_reference_type-64" - ] - } - }, - "git_reference_name": { - "type": "function", - "file": "git2/refs.h", - "line": 284, - "lineto": 284, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const char *", - "comment": " the full name for the ref" - }, - "description": "

Get the full name of a reference.

\n", - "comments": "

See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_reference_name-17" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_name-25" - ] - } - }, - "git_reference_resolve": { - "type": "function", - "file": "git2/refs.h", - "line": 302, - "lineto": 302, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the peeled reference" - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "git_reference **out, const git_reference *ref", - "sig": "git_reference **::const git_reference *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Resolve a symbolic reference to a direct reference.

\n", - "comments": "

This method iteratively peels a symbolic reference until it resolves to a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that reference is returned. This copy must be manually freed too.

\n", - "group": "reference" - }, - "git_reference_owner": { - "type": "function", - "file": "git2/refs.h", - "line": 310, - "lineto": 310, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "git_repository *", - "comment": " a pointer to the repo" - }, - "description": "

Get the repository where a reference resides.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_symbolic_set_target": { - "type": "function", - "file": "git2/refs.h", - "line": 332, - "lineto": 336, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference" - }, - { - "name": "target", - "type": "const char *", - "comment": "The new target for the reference" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_reference *ref, const char *target, const char *log_message", - "sig": "git_reference **::git_reference *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", - "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", - "group": "reference" - }, - "git_reference_set_target": { - "type": "function", - "file": "git2/refs.h", - "line": 352, - "lineto": 356, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The new target OID for the reference" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_reference *ref, const git_oid *id, const char *log_message", - "sig": "git_reference **::git_reference *::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed since it was read, or an error code" - }, - "description": "

Conditionally create a new reference with the same name as the given reference but a\n different OID target. The reference must be a direct reference, otherwise\n this will fail.

\n", - "comments": "

The new reference will be written to disk, overwriting the given reference.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_set_target-26" - ] - } - }, - "git_reference_rename": { - "type": "function", - "file": "git2/refs.h", - "line": 381, - "lineto": 386, - "args": [ - { - "name": "new_ref", - "type": "git_reference **", - "comment": null - }, - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference to rename" - }, - { - "name": "new_name", - "type": "const char *", - "comment": "The new name for the reference" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite an existing reference" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **new_ref, git_reference *ref, const char *new_name, int force, const char *log_message", - "sig": "git_reference **::git_reference *::const char *::int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Rename an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already a reference with the given name, the renaming will fail.

\n\n

IMPORTANT: The user needs to write a proper reflog entry if the reflog is enabled for the repository. We only rename the reflog if it exists.

\n", - "group": "reference" - }, - "git_reference_delete": { - "type": "function", - "file": "git2/refs.h", - "line": 401, - "lineto": 401, - "args": [ - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference to remove" - } - ], - "argline": "git_reference *ref", - "sig": "git_reference *", - "return": { - "type": "int", - "comment": " 0, GIT_EMODIFIED or an error code" - }, - "description": "

Delete an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references. The reference will be immediately removed on disk but the memory will not be freed. Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed from the time it was looked up.

\n", - "group": "reference" - }, - "git_reference_remove": { - "type": "function", - "file": "git2/refs.h", - "line": 412, - "lineto": 412, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "name", - "type": "const char *", - "comment": "The reference to remove" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Delete an existing reference by name

\n", - "comments": "

This method removes the named reference from the repository without looking at its old value.

\n", - "group": "reference" - }, - "git_reference_list": { - "type": "function", - "file": "git2/refs.h", - "line": 426, - "lineto": 426, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "Pointer to a git_strarray structure where\n\t\tthe reference names will be stored" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - } - ], - "argline": "git_strarray *array, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Fill a list with all the references that can be found in a repository.

\n", - "comments": "

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().

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_reference_list-65" - ] - } - }, - "git_reference_foreach": { - "type": "function", - "file": "git2/refs.h", - "line": 466, - "lineto": 469, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - }, - { - "name": "callback", - "type": "git_reference_foreach_cb", - "comment": "Function which will be called for every listed ref" - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback" - } - ], - "argline": "git_repository *repo, git_reference_foreach_cb callback, void *payload", - "sig": "git_repository *::git_reference_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Perform a callback on each reference in the repository.

\n", - "comments": "

The callback function will be called for each reference in the repository, receiving the reference object and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free on each reference passed to it.

\n", - "group": "reference" - }, - "git_reference_foreach_name": { - "type": "function", - "file": "git2/refs.h", - "line": 484, - "lineto": 487, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - }, - { - "name": "callback", - "type": "git_reference_foreach_name_cb", - "comment": "Function which will be called for every listed ref name" - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback" - } - ], - "argline": "git_repository *repo, git_reference_foreach_name_cb callback, void *payload", - "sig": "git_repository *::git_reference_foreach_name_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Perform a callback on the fully-qualified name of each reference.

\n", - "comments": "

The callback function will be called for each reference in the repository, receiving the name of the reference and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n", - "group": "reference" - }, - "git_reference_dup": { - "type": "function", - "file": "git2/refs.h", - "line": 498, - "lineto": 498, - "args": [ - { - "name": "dest", - "type": "git_reference **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "git_reference *", - "comment": "object to copy" - } - ], - "argline": "git_reference **dest, git_reference *source", - "sig": "git_reference **::git_reference *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an existing reference.

\n", - "comments": "

Call git_reference_free to free the data.

\n", - "group": "reference" - }, - "git_reference_free": { - "type": "function", - "file": "git2/refs.h", - "line": 505, - "lineto": 505, - "args": [ - { - "name": "ref", - "type": "git_reference *", - "comment": "git_reference" - } - ], - "argline": "git_reference *ref", - "sig": "git_reference *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the given reference.

\n", - "comments": "", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_reference_free-18", - "ex/v1.3.1/checkout.html#git_reference_free-19", - "ex/v1.3.1/checkout.html#git_reference_free-20" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_reference_free-66" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_free-27", - "ex/v1.3.1/merge.html#git_reference_free-28", - "ex/v1.3.1/merge.html#git_reference_free-29" - ], - "status.c": [ - "ex/v1.3.1/status.html#git_reference_free-1" - ] - } - }, - "git_reference_cmp": { - "type": "function", - "file": "git2/refs.h", - "line": 514, - "lineto": 516, - "args": [ - { - "name": "ref1", - "type": "const git_reference *", - "comment": "The first git_reference" - }, - { - "name": "ref2", - "type": "const git_reference *", - "comment": "The second git_reference" - } - ], - "argline": "const git_reference *ref1, const git_reference *ref2", - "sig": "const git_reference *::const git_reference *", - "return": { - "type": "int", - "comment": " 0 if the same, else a stable but meaningless ordering." - }, - "description": "

Compare two references.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_iterator_new": { - "type": "function", - "file": "git2/refs.h", - "line": 525, - "lineto": 527, - "args": [ - { - "name": "out", - "type": "git_reference_iterator **", - "comment": "pointer in which to store the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_reference_iterator **out, git_repository *repo", - "sig": "git_reference_iterator **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an iterator for the repo's references

\n", - "comments": "", - "group": "reference" - }, - "git_reference_iterator_glob_new": { - "type": "function", - "file": "git2/refs.h", - "line": 538, - "lineto": 541, - "args": [ - { - "name": "out", - "type": "git_reference_iterator **", - "comment": "pointer in which to store the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "glob", - "type": "const char *", - "comment": "the glob to match against the reference names" - } - ], - "argline": "git_reference_iterator **out, git_repository *repo, const char *glob", - "sig": "git_reference_iterator **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an iterator for the repo's references that match the\n specified glob

\n", - "comments": "", - "group": "reference" - }, - "git_reference_next": { - "type": "function", - "file": "git2/refs.h", - "line": 550, - "lineto": 550, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer in which to store the reference" - }, - { - "name": "iter", - "type": "git_reference_iterator *", - "comment": "the iterator" - } - ], - "argline": "git_reference **out, git_reference_iterator *iter", - "sig": "git_reference **::git_reference_iterator *", - "return": { - "type": "int", - "comment": " 0, GIT_ITEROVER if there are no more; or an error code" - }, - "description": "

Get the next reference

\n", - "comments": "", - "group": "reference" - }, - "git_reference_next_name": { - "type": "function", - "file": "git2/refs.h", - "line": 563, - "lineto": 563, - "args": [ - { - "name": "out", - "type": "const char **", - "comment": "pointer in which to store the string" - }, - { - "name": "iter", - "type": "git_reference_iterator *", - "comment": "the iterator" - } - ], - "argline": "const char **out, git_reference_iterator *iter", - "sig": "const char **::git_reference_iterator *", - "return": { - "type": "int", - "comment": " 0, GIT_ITEROVER if there are no more; or an error code" - }, - "description": "

Get the next reference's name

\n", - "comments": "

This function is provided for convenience in case only the names are interesting as it avoids the allocation of the git_reference object which git_reference_next() needs.

\n", - "group": "reference" - }, - "git_reference_iterator_free": { - "type": "function", - "file": "git2/refs.h", - "line": 570, - "lineto": 570, - "args": [ - { - "name": "iter", - "type": "git_reference_iterator *", - "comment": "the iterator to free" - } - ], - "argline": "git_reference_iterator *iter", - "sig": "git_reference_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the iterator and its associated resources

\n", - "comments": "", - "group": "reference" - }, - "git_reference_foreach_glob": { - "type": "function", - "file": "git2/refs.h", - "line": 590, - "lineto": 594, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - }, - { - "name": "glob", - "type": "const char *", - "comment": "Pattern to match (fnmatch-style) against reference name." - }, - { - "name": "callback", - "type": "git_reference_foreach_name_cb", - "comment": "Function which will be called for every listed ref" - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback" - } - ], - "argline": "git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload", - "sig": "git_repository *::const char *::git_reference_foreach_name_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUSER on non-zero callback, or error code" - }, - "description": "

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n", - "comments": "

This function acts like git_reference_foreach() with an additional pattern match being applied to the reference name before issuing the callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches any sequence of letters, a '?' matches any letter, and square brackets can be used to define character ranges (such as "[0-9]" for digits).

\n", - "group": "reference" - }, - "git_reference_has_log": { - "type": "function", - "file": "git2/refs.h", - "line": 604, - "lineto": 604, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference's name" - } - ], - "argline": "git_repository *repo, const char *refname", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 when no reflog can be found, 1 when it exists;\n otherwise an error code." - }, - "description": "

Check if a reflog exists for the specified reference.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_ensure_log": { - "type": "function", - "file": "git2/refs.h", - "line": 616, - "lineto": 616, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference's name" - } - ], - "argline": "git_repository *repo, const char *refname", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Ensure there is a reflog for a particular reference.

\n", - "comments": "

Make sure that successive updates to the reference will append to its log.

\n", - "group": "reference" - }, - "git_reference_is_branch": { - "type": "function", - "file": "git2/refs.h", - "line": 626, - "lineto": 626, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/heads\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a local branch.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_is_remote": { - "type": "function", - "file": "git2/refs.h", - "line": 636, - "lineto": 636, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/remotes\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a remote tracking branch

\n", - "comments": "", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_reference_is_remote-21" - ] - } - }, - "git_reference_is_tag": { - "type": "function", - "file": "git2/refs.h", - "line": 646, - "lineto": 646, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/tags\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a tag

\n", - "comments": "", - "group": "reference" - }, - "git_reference_is_note": { - "type": "function", - "file": "git2/refs.h", - "line": 656, - "lineto": 656, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/notes\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a note

\n", - "comments": "", - "group": "reference" - }, - "git_reference_normalize_name": { - "type": "function", - "file": "git2/refs.h", - "line": 712, - "lineto": 716, - "args": [ - { - "name": "buffer_out", - "type": "char *", - "comment": "User allocated buffer to store normalized name" - }, - { - "name": "buffer_size", - "type": "size_t", - "comment": "Size of buffer_out" - }, - { - "name": "name", - "type": "const char *", - "comment": "Reference name to be checked." - }, - { - "name": "flags", - "type": "unsigned int", - "comment": "Flags to constrain name validation rules - see the\n GIT_REFERENCE_FORMAT constants above." - } - ], - "argline": "char *buffer_out, size_t buffer_size, const char *name, unsigned int flags", - "sig": "char *::size_t::const char *::unsigned int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code." - }, - "description": "

Normalize reference name and check validity.

\n", - "comments": "

This will normalize the reference name by removing any leading slash '/' characters and collapsing runs of adjacent slashes between name components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference" - }, - "git_reference_peel": { - "type": "function", - "file": "git2/refs.h", - "line": 733, - "lineto": 736, - "args": [ - { - "name": "out", - "type": "git_object **", - "comment": "Pointer to the peeled git_object" - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference to be processed" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "The type of the requested object (GIT_OBJECT_COMMIT,\n GIT_OBJECT_TAG, GIT_OBJECT_TREE, GIT_OBJECT_BLOB or GIT_OBJECT_ANY)." - } - ], - "argline": "git_object **out, const git_reference *ref, git_object_t type", - "sig": "git_object **::const git_reference *::git_object_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" - }, - "description": "

Recursively peel reference until object of the specified type is found.

\n", - "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_reference_peel-30" - ] - } - }, - "git_reference_name_is_valid": { - "type": "function", - "file": "git2/refs.h", - "line": 753, - "lineto": 753, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given reference name" - }, - { - "name": "refname", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "int *valid, const char *refname", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Ensure the reference name is well-formed.

\n", - "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", - "group": "reference" - }, - "git_reference_shorthand": { - "type": "function", - "file": "git2/refs.h", - "line": 767, - "lineto": 767, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "a reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const char *", - "comment": " the human-readable version of the name" - }, - "description": "

Get the reference's short name

\n", - "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", - "group": "reference", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_reference_shorthand-2" - ] - } - }, - "git_refspec_parse": { - "type": "function", - "file": "git2/refspec.h", - "line": 32, - "lineto": 32, - "args": [ - { - "name": "refspec", - "type": "git_refspec **", - "comment": "a pointer to hold the refspec handle" - }, - { - "name": "input", - "type": "const char *", - "comment": "the refspec string" - }, - { - "name": "is_fetch", - "type": "int", - "comment": "is this a refspec for a fetch" - } - ], - "argline": "git_refspec **refspec, const char *input, int is_fetch", - "sig": "git_refspec **::const char *::int", - "return": { - "type": "int", - "comment": " 0 if the refspec string could be parsed, -1 otherwise" - }, - "description": "

Parse a given refspec string

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_free": { - "type": "function", - "file": "git2/refspec.h", - "line": 39, - "lineto": 39, - "args": [ - { - "name": "refspec", - "type": "git_refspec *", - "comment": "the refspec object" - } - ], - "argline": "git_refspec *refspec", - "sig": "git_refspec *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a refspec object which has been created by git_refspec_parse

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_src": { - "type": "function", - "file": "git2/refspec.h", - "line": 47, - "lineto": 47, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "const char *", - "comment": " the refspec's source specifier" - }, - "description": "

Get the source specifier

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_dst": { - "type": "function", - "file": "git2/refspec.h", - "line": 55, - "lineto": 55, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "const char *", - "comment": " the refspec's destination specifier" - }, - "description": "

Get the destination specifier

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_string": { - "type": "function", - "file": "git2/refspec.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "const char *", - "comment": null - }, - "description": "

Get the refspec's string

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_force": { - "type": "function", - "file": "git2/refspec.h", - "line": 71, - "lineto": 71, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "int", - "comment": " 1 if force update has been set, 0 otherwise" - }, - "description": "

Get the force update setting

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_direction": { - "type": "function", - "file": "git2/refspec.h", - "line": 79, - "lineto": 79, - "args": [ - { - "name": "spec", - "type": "const git_refspec *", - "comment": "refspec" - } - ], - "argline": "const git_refspec *spec", - "sig": "const git_refspec *", - "return": { - "type": "git_direction", - "comment": " GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" - }, - "description": "

Get the refspec's direction.

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_src_matches": { - "type": "function", - "file": "git2/refspec.h", - "line": 88, - "lineto": 88, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the name of the reference to check" - } - ], - "argline": "const git_refspec *refspec, const char *refname", - "sig": "const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 1 if the refspec matches, 0 otherwise" - }, - "description": "

Check if a refspec's source descriptor matches a reference

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_dst_matches": { - "type": "function", - "file": "git2/refspec.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the name of the reference to check" - } - ], - "argline": "const git_refspec *refspec, const char *refname", - "sig": "const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 1 if the refspec matches, 0 otherwise" - }, - "description": "

Check if a refspec's destination descriptor matches a reference

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_transform": { - "type": "function", - "file": "git2/refspec.h", - "line": 107, - "lineto": 107, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "where to store the target name" - }, - { - "name": "spec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the reference to transform" - } - ], - "argline": "git_buf *out, const git_refspec *spec, const char *name", - "sig": "git_buf *::const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EBUFS or another error" - }, - "description": "

Transform a reference to its target following the refspec's rules

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_rtransform": { - "type": "function", - "file": "git2/refspec.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "where to store the source reference name" - }, - { - "name": "spec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the reference to transform" - } - ], - "argline": "git_buf *out, const git_refspec *spec, const char *name", - "sig": "git_buf *::const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EBUFS or another error" - }, - "description": "

Transform a target reference to its source reference following the refspec's rules

\n", - "comments": "", - "group": "refspec" - }, - "git_remote_create": { - "type": "function", - "file": "git2/remote.h", - "line": 38, - "lineto": 42, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the remote" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name, const char *url", - "sig": "git_remote **::git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Add a remote with the default fetch refspec to the repository's configuration.

\n", - "comments": "", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_create-1" - ] - } - }, - "git_remote_create_options_init": { - "type": "function", - "file": "git2/remote.h", - "line": 97, - "lineto": 99, - "args": [ - { - "name": "opts", - "type": "git_remote_create_options *", - "comment": "The `git_remote_create_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REMOTE_CREATE_OPTIONS_VERSION`." - } - ], - "argline": "git_remote_create_options *opts, unsigned int version", - "sig": "git_remote_create_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_remote_create_options structure

\n", - "comments": "

Initializes a git_remote_create_options with default values. Equivalent to creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", - "group": "remote" - }, - "git_remote_create_with_opts": { - "type": "function", - "file": "git2/remote.h", - "line": 113, - "lineto": 116, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - }, - { - "name": "opts", - "type": "const git_remote_create_options *", - "comment": "the remote creation options" - } - ], - "argline": "git_remote **out, const char *url, const git_remote_create_options *opts", - "sig": "git_remote **::const char *::const git_remote_create_options *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Create a remote, with options.

\n", - "comments": "

This function allows more fine-grained control over the remote creation.

\n\n

Passing NULL as the opts argument will result in a detached remote.

\n", - "group": "remote" - }, - "git_remote_create_with_fetchspec": { - "type": "function", - "file": "git2/remote.h", - "line": 129, - "lineto": 134, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the remote" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - }, - { - "name": "fetch", - "type": "const char *", - "comment": "the remote fetch value" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch", - "sig": "git_remote **::git_repository *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Add a remote with the provided fetch refspec (or default if NULL) to the repository's\n configuration.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_create_anonymous": { - "type": "function", - "file": "git2/remote.h", - "line": 147, - "lineto": 150, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "pointer to the new remote objects" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the associated repository" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote repository's URL" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *url", - "sig": "git_remote **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an anonymous remote

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.3.1/fetch.html#git_remote_create_anonymous-4" - ], - "ls-remote.c": [ - "ex/v1.3.1/ls-remote.html#git_remote_create_anonymous-2" - ] - } - }, - "git_remote_create_detached": { - "type": "function", - "file": "git2/remote.h", - "line": 166, - "lineto": 168, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "pointer to the new remote objects" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote repository's URL" - } - ], - "argline": "git_remote **out, const char *url", - "sig": "git_remote **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a remote without a connected local repo

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote will not consider any repo configuration values (such as insteadof url substitutions).

\n", - "group": "remote" - }, - "git_remote_lookup": { - "type": "function", - "file": "git2/remote.h", - "line": 181, - "lineto": 181, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "pointer to the new remote object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the associated repository" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name", - "sig": "git_remote **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Get the information for a particular remote

\n", - "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.3.1/fetch.html#git_remote_lookup-5" - ], - "ls-remote.c": [ - "ex/v1.3.1/ls-remote.html#git_remote_lookup-3" - ], - "push.c": [ - "ex/v1.3.1/push.html#git_remote_lookup-1" - ], - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_lookup-2" - ] - } - }, - "git_remote_dup": { - "type": "function", - "file": "git2/remote.h", - "line": 193, - "lineto": 193, - "args": [ - { - "name": "dest", - "type": "git_remote **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "git_remote *", - "comment": "object to copy" - } - ], - "argline": "git_remote **dest, git_remote *source", - "sig": "git_remote **::git_remote *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an existing remote. All internal strings are also\n duplicated. Callbacks are not duplicated.

\n", - "comments": "

Call git_remote_free to free the data.

\n", - "group": "remote" - }, - "git_remote_owner": { - "type": "function", - "file": "git2/remote.h", - "line": 201, - "lineto": 201, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "git_repository *", - "comment": " a pointer to the repository" - }, - "description": "

Get the remote's repository

\n", - "comments": "", - "group": "remote" - }, - "git_remote_name": { - "type": "function", - "file": "git2/remote.h", - "line": 209, - "lineto": 209, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "const char *", - "comment": " a pointer to the name or NULL for in-memory remotes" - }, - "description": "

Get the remote's name

\n", - "comments": "", - "group": "remote" - }, - "git_remote_url": { - "type": "function", - "file": "git2/remote.h", - "line": 221, - "lineto": 221, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "const char *", - "comment": " a pointer to the url" - }, - "description": "

Get the remote's url

\n", - "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_url-3" - ] - } - }, - "git_remote_pushurl": { - "type": "function", - "file": "git2/remote.h", - "line": 233, - "lineto": 233, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "const char *", - "comment": " a pointer to the url or NULL if no special url for pushing is set" - }, - "description": "

Get the remote's url for pushing.

\n", - "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_pushurl-4" - ] - } - }, - "git_remote_set_url": { - "type": "function", - "file": "git2/remote.h", - "line": 246, - "lineto": 246, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the change" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_repository *repo, const char *remote, const char *url", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error value" - }, - "description": "

Set the remote's url in the configuration

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_set_url-5" - ] - } - }, - "git_remote_set_pushurl": { - "type": "function", - "file": "git2/remote.h", - "line": 260, - "lineto": 260, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the change" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_repository *repo, const char *remote, const char *url", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Set the remote's url for pushing in the configuration.

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_set_pushurl-6" - ] - } - }, - "git_remote_set_instance_url": { - "type": "function", - "file": "git2/remote.h", - "line": 270, - "lineto": 270, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_remote *remote, const char *url", - "sig": "git_remote *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error value" - }, - "description": "

Set the url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_set_instance_pushurl": { - "type": "function", - "file": "git2/remote.h", - "line": 280, - "lineto": 280, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_remote *remote, const char *url", - "sig": "git_remote *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error value" - }, - "description": "

Set the push url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_add_fetch": { - "type": "function", - "file": "git2/remote.h", - "line": 293, - "lineto": 293, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to change the configuration" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the name of the remote to change" - }, - { - "name": "refspec", - "type": "const char *", - "comment": "the new fetch refspec" - } - ], - "argline": "git_repository *repo, const char *remote, const char *refspec", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" - }, - "description": "

Add a fetch refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the fetch list in the configuration. No loaded remote instances will be affected.

\n", - "group": "remote" - }, - "git_remote_get_fetch_refspecs": { - "type": "function", - "file": "git2/remote.h", - "line": 304, - "lineto": 304, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "pointer to the array in which to store the strings" - }, - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "git_strarray *array, const git_remote *remote", - "sig": "git_strarray *::const git_remote *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Get the remote's list of fetch refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", - "group": "remote" - }, - "git_remote_add_push": { - "type": "function", - "file": "git2/remote.h", - "line": 317, - "lineto": 317, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to change the configuration" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the name of the remote to change" - }, - { - "name": "refspec", - "type": "const char *", - "comment": "the new push refspec" - } - ], - "argline": "git_repository *repo, const char *remote, const char *refspec", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" - }, - "description": "

Add a push refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the push list in the configuration. No loaded remote instances will be affected.

\n", - "group": "remote" - }, - "git_remote_get_push_refspecs": { - "type": "function", - "file": "git2/remote.h", - "line": 328, - "lineto": 328, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "pointer to the array in which to store the strings" - }, - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "git_strarray *array, const git_remote *remote", - "sig": "git_strarray *::const git_remote *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Get the remote's list of push refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", - "group": "remote" - }, - "git_remote_refspec_count": { - "type": "function", - "file": "git2/remote.h", - "line": 336, - "lineto": 336, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "size_t", - "comment": " the amount of refspecs configured in this remote" - }, - "description": "

Get the number of refspecs for a remote

\n", - "comments": "", - "group": "remote" - }, - "git_remote_get_refspec": { - "type": "function", - "file": "git2/remote.h", - "line": 345, - "lineto": 345, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - }, - { - "name": "n", - "type": "size_t", - "comment": "the refspec to get" - } - ], - "argline": "const git_remote *remote, size_t n", - "sig": "const git_remote *::size_t", - "return": { - "type": "const git_refspec *", - "comment": " the nth refspec" - }, - "description": "

Get a refspec from the remote

\n", - "comments": "", - "group": "remote" - }, - "git_remote_connect": { - "type": "function", - "file": "git2/remote.h", - "line": 362, - "lineto": 362, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to connect to" - }, - { - "name": "direction", - "type": "git_direction", - "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" - }, - { - "name": "callbacks", - "type": "const git_remote_callbacks *", - "comment": "the callbacks to use for this connection" - }, - { - "name": "proxy_opts", - "type": "const git_proxy_options *", - "comment": "proxy settings" - }, - { - "name": "custom_headers", - "type": "const git_strarray *", - "comment": "extra HTTP headers to use in this connection" - } - ], - "argline": "git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_proxy_options *proxy_opts, const git_strarray *custom_headers", - "sig": "git_remote *::git_direction::const git_remote_callbacks *::const git_proxy_options *::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open a connection to a remote

\n", - "comments": "

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.

\n", - "group": "remote", - "examples": { - "ls-remote.c": [ - "ex/v1.3.1/ls-remote.html#git_remote_connect-4" - ] - } - }, - "git_remote_ls": { - "type": "function", - "file": "git2/remote.h", - "line": 384, - "lineto": 384, - "args": [ - { - "name": "out", - "type": "const git_remote_head ***", - "comment": "pointer to the array" - }, - { - "name": "size", - "type": "size_t *", - "comment": "the number of remote heads" - }, - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote_head ***out, size_t *size, git_remote *remote", - "sig": "const git_remote_head ***::size_t *::git_remote *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Get the remote repository's reference advertisement list

\n", - "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", - "group": "remote", - "examples": { - "ls-remote.c": [ - "ex/v1.3.1/ls-remote.html#git_remote_ls-5" - ] - } - }, - "git_remote_connected": { - "type": "function", - "file": "git2/remote.h", - "line": 395, - "lineto": 395, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "int", - "comment": " 1 if it's connected, 0 otherwise." - }, - "description": "

Check whether the remote is connected

\n", - "comments": "

Check whether the remote's underlying transport is connected to the remote host.

\n", - "group": "remote" - }, - "git_remote_stop": { - "type": "function", - "file": "git2/remote.h", - "line": 406, - "lineto": 406, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Cancel the operation

\n", - "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", - "group": "remote" - }, - "git_remote_disconnect": { - "type": "function", - "file": "git2/remote.h", - "line": 416, - "lineto": 416, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to disconnect from" - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Disconnect from the remote

\n", - "comments": "

Close the connection to the remote.

\n", - "group": "remote" - }, - "git_remote_free": { - "type": "function", - "file": "git2/remote.h", - "line": 426, - "lineto": 426, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to free" - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory associated with a remote

\n", - "comments": "

This also disconnects from the remote, if the connection has not been closed yet (using git_remote_disconnect).

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.3.1/fetch.html#git_remote_free-6", - "ex/v1.3.1/fetch.html#git_remote_free-7" - ], - "ls-remote.c": [ - "ex/v1.3.1/ls-remote.html#git_remote_free-6" - ], - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_free-7" - ] - } - }, - "git_remote_list": { - "type": "function", - "file": "git2/remote.h", - "line": 437, - "lineto": 437, - "args": [ - { - "name": "out", - "type": "git_strarray *", - "comment": "a string array which receives the names of the remotes" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to query" - } - ], - "argline": "git_strarray *out, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get a list of the configured remotes for a repo

\n", - "comments": "

The string array must be freed by the user.

\n", - "group": "remote", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_remote_list-22" - ], - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_list-8" - ] - } - }, - "git_remote_init_callbacks": { - "type": "function", - "file": "git2/remote.h", - "line": 651, - "lineto": 653, - "args": [ - { - "name": "opts", - "type": "git_remote_callbacks *", - "comment": "the `git_remote_callbacks` struct to initialize" - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION`" - } - ], - "argline": "git_remote_callbacks *opts, unsigned int version", - "sig": "git_remote_callbacks *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_remote_callbacks with default values. Equivalent to\n creating an instance with GIT_REMOTE_CALLBACKS_INIT.

\n", - "comments": "", - "group": "remote" - }, - "git_fetch_options_init": { - "type": "function", - "file": "git2/remote.h", - "line": 757, - "lineto": 759, - "args": [ - { - "name": "opts", - "type": "git_fetch_options *", - "comment": "The `git_fetch_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_FETCH_OPTIONS_VERSION`." - } - ], - "argline": "git_fetch_options *opts, unsigned int version", - "sig": "git_fetch_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_fetch_options structure

\n", - "comments": "

Initializes a git_fetch_options with default values. Equivalent to creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", - "group": "fetch" - }, - "git_push_options_init": { - "type": "function", - "file": "git2/remote.h", - "line": 807, - "lineto": 809, - "args": [ - { - "name": "opts", - "type": "git_push_options *", - "comment": "The `git_push_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_PUSH_OPTIONS_VERSION`." - } - ], - "argline": "git_push_options *opts, unsigned int version", - "sig": "git_push_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_push_options structure

\n", - "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", - "group": "push", - "examples": { - "push.c": [ - "ex/v1.3.1/push.html#git_push_options_init-2" - ] - } - }, - "git_remote_download": { - "type": "function", - "file": "git2/remote.h", - "line": 827, - "lineto": 827, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for this negotiation and\n download. Use NULL or an empty array to use the base refspecs" - }, - { - "name": "opts", - "type": "const git_fetch_options *", - "comment": "the options to use for this fetch" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts", - "sig": "git_remote *::const git_strarray *::const git_fetch_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Download and index the packfile

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, download and index the packfile.

\n\n

The .idx file will be created and both it and the packfile with be renamed to their final name.

\n", - "group": "remote" - }, - "git_remote_upload": { - "type": "function", - "file": "git2/remote.h", - "line": 841, - "lineto": 841, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for this negotiation and\n upload. Use NULL or an empty array to use the base refspecs" - }, - { - "name": "opts", - "type": "const git_push_options *", - "comment": "the options to use for this push" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", - "sig": "git_remote *::const git_strarray *::const git_push_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a packfile and send it to the server

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, create a packfile with the missing objects and send it.

\n", - "group": "remote" - }, - "git_remote_update_tips": { - "type": "function", - "file": "git2/remote.h", - "line": 857, - "lineto": 862, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to update" - }, - { - "name": "callbacks", - "type": "const git_remote_callbacks *", - "comment": "pointer to the callback structure to use" - }, - { - "name": "update_fetchhead", - "type": "int", - "comment": "whether to write to FETCH_HEAD. Pass 1 to behave like git." - }, - { - "name": "download_tags", - "type": "git_remote_autotag_option_t", - "comment": "what the behaviour for downloading tags is for this fetch. This is\n ignored for push. This must be the same value passed to `git_remote_download()`." - }, - { - "name": "reflog_message", - "type": "const char *", - "comment": "The message to insert into the reflogs. If\n NULL and fetching, the default is \"fetch \n\", where \n is\n the name of the remote (or its url, for in-memory remotes). This\n parameter is ignored when pushing." - } - ], - "argline": "git_remote *remote, const git_remote_callbacks *callbacks, int update_fetchhead, git_remote_autotag_option_t download_tags, const char *reflog_message", - "sig": "git_remote *::const git_remote_callbacks *::int::git_remote_autotag_option_t::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Update the tips to the new state

\n", - "comments": "", - "group": "remote" - }, - "git_remote_fetch": { - "type": "function", - "file": "git2/remote.h", - "line": 878, - "lineto": 882, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to fetch from" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for this fetch. Pass NULL or an\n empty array to use the base refspecs." - }, - { - "name": "opts", - "type": "const git_fetch_options *", - "comment": "options to use for this fetch" - }, - { - "name": "reflog_message", - "type": "const char *", - "comment": "The message to insert into the reflogs. If NULL, the\n\t\t\t\t\t\t\t\t default is \"fetch\"" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts, const char *reflog_message", - "sig": "git_remote *::const git_strarray *::const git_fetch_options *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Download new data and update tips

\n", - "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.3.1/fetch.html#git_remote_fetch-8" - ] - } - }, - "git_remote_prune": { - "type": "function", - "file": "git2/remote.h", - "line": 891, - "lineto": 891, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to prune" - }, - { - "name": "callbacks", - "type": "const git_remote_callbacks *", - "comment": "callbacks to use for this prune" - } - ], - "argline": "git_remote *remote, const git_remote_callbacks *callbacks", - "sig": "git_remote *::const git_remote_callbacks *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Prune tracking refs that are no longer present on remote

\n", - "comments": "", - "group": "remote" - }, - "git_remote_push": { - "type": "function", - "file": "git2/remote.h", - "line": 903, - "lineto": 905, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to push to" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for pushing. If NULL or an empty\n array, the configured refspecs will be used" - }, - { - "name": "opts", - "type": "const git_push_options *", - "comment": "options to use for this push" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", - "sig": "git_remote *::const git_strarray *::const git_push_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Perform a push

\n", - "comments": "

Peform all the steps from a push.

\n", - "group": "remote", - "examples": { - "push.c": [ - "ex/v1.3.1/push.html#git_remote_push-3" - ] - } - }, - "git_remote_stats": { - "type": "function", - "file": "git2/remote.h", - "line": 910, - "lineto": 910, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": null - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "const git_indexer_progress *", - "comment": null - }, - "description": "

Get the statistics structure that is filled in by the fetch operation.

\n", - "comments": "", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.3.1/fetch.html#git_remote_stats-9" - ] - } - }, - "git_remote_autotag": { - "type": "function", - "file": "git2/remote.h", - "line": 918, - "lineto": 918, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "git_remote_autotag_option_t", - "comment": " the auto-follow setting" - }, - "description": "

Retrieve the tag auto-follow setting

\n", - "comments": "", - "group": "remote" - }, - "git_remote_set_autotag": { - "type": "function", - "file": "git2/remote.h", - "line": 931, - "lineto": 931, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to make the change" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the name of the remote" - }, - { - "name": "value", - "type": "git_remote_autotag_option_t", - "comment": "the new value to take." - } - ], - "argline": "git_repository *repo, const char *remote, git_remote_autotag_option_t value", - "sig": "git_repository *::const char *::git_remote_autotag_option_t", - "return": { - "type": "int", - "comment": " 0, or an error code." - }, - "description": "

Set the remote's tag following setting.

\n", - "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", - "group": "remote" - }, - "git_remote_prune_refs": { - "type": "function", - "file": "git2/remote.h", - "line": 939, - "lineto": 939, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "int", - "comment": " the ref-prune setting" - }, - "description": "

Retrieve the ref-prune setting

\n", - "comments": "", - "group": "remote" - }, - "git_remote_rename": { - "type": "function", - "file": "git2/remote.h", - "line": 961, - "lineto": 965, - "args": [ - { - "name": "problems", - "type": "git_strarray *", - "comment": "non-default refspecs cannot be renamed and will be\n stored here for further processing by the caller. Always free this\n strarray on successful return." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to rename" - }, - { - "name": "name", - "type": "const char *", - "comment": "the current name of the remote" - }, - { - "name": "new_name", - "type": "const char *", - "comment": "the new name the remote should bear" - } - ], - "argline": "git_strarray *problems, git_repository *repo, const char *name, const char *new_name", - "sig": "git_strarray *::git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Give the remote a new name

\n", - "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_rename-9" - ] - } - }, - "git_remote_name_is_valid": { - "type": "function", - "file": "git2/remote.h", - "line": 974, - "lineto": 974, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given remote name" - }, - { - "name": "remote_name", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "int *valid, const char *remote_name", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Ensure the remote name is well-formed.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_delete": { - "type": "function", - "file": "git2/remote.h", - "line": 986, - "lineto": 986, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to act" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the remote to delete" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code." - }, - "description": "

Delete an existing persisted remote.

\n", - "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.3.1/remote.html#git_remote_delete-10" - ] - } - }, - "git_remote_default_branch": { - "type": "function", - "file": "git2/remote.h", - "line": 1004, - "lineto": 1004, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer in which to store the reference name" - }, - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - } - ], - "argline": "git_buf *out, git_remote *remote", - "sig": "git_buf *::git_remote *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message." - }, - "description": "

Retrieve the name of the remote's default branch

\n", - "comments": "

The default branch of a repository is the branch which HEAD points to. If the remote does not support reporting this information directly, it performs the guess as git does; that is, if there are multiple branches which point to the same commit, the first one is chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", - "group": "remote" - }, - "git_repository_open": { - "type": "function", - "file": "git2/repository.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "pointer to the repo which will be opened" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path to the repository" - } - ], - "argline": "git_repository **out, const char *path", - "sig": "git_repository **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open a git repository.

\n", - "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n", - "group": "repository", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_repository_open-67" - ] - } - }, - "git_repository_open_from_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 48, - "lineto": 48, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Output pointer containing opened repository" - }, - { - "name": "wt", - "type": "git_worktree *", - "comment": "Working tree to open" - } - ], - "argline": "git_repository **out, git_worktree *wt", - "sig": "git_repository **::git_worktree *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open working tree as a repository

\n", - "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", - "group": "repository" - }, - "git_repository_wrap_odb": { - "type": "function", - "file": "git2/repository.h", - "line": 61, - "lineto": 61, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "pointer to the repo" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "the object database to wrap" - } - ], - "argline": "git_repository **out, git_odb *odb", - "sig": "git_repository **::git_odb *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a "fake" repository to wrap an object database

\n", - "comments": "

Create a repository object to wrap an object database to be used with the API when all you have is an object database. This doesn't have any paths associated with it, so use with care.

\n", - "group": "repository" - }, - "git_repository_discover": { - "type": "function", - "file": "git2/repository.h", - "line": 89, - "lineto": 93, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "A pointer to a user-allocated git_buf which will contain\n the found path." - }, - { - "name": "start_path", - "type": "const char *", - "comment": "The base path where the lookup starts." - }, - { - "name": "across_fs", - "type": "int", - "comment": "If true, then the lookup will not stop when a\n filesystem device change is detected while exploring parent directories." - }, - { - "name": "ceiling_dirs", - "type": "const char *", - "comment": "A GIT_PATH_LIST_SEPARATOR separated list of\n absolute symbolic link free paths. The lookup will stop when any\n of this paths is reached. Note that the lookup always performs on\n start_path no matter start_path appears in ceiling_dirs ceiling_dirs\n might be NULL (which is equivalent to an empty string)" - } - ], - "argline": "git_buf *out, const char *start_path, int across_fs, const char *ceiling_dirs", - "sig": "git_buf *::const char *::int::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", - "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n", - "group": "repository" - }, - "git_repository_open_ext": { - "type": "function", - "file": "git2/repository.h", - "line": 165, - "lineto": 169, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Pointer to the repo which will be opened. This can\n actually be NULL if you only want to use the error code to\n see if a repo at this path could be opened." - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to open as git repository. If the flags\n permit \"searching\", then this can be a path to a subdirectory\n inside the working directory of the repository. May be NULL if\n flags is GIT_REPOSITORY_OPEN_FROM_ENV." - }, - { - "name": "flags", - "type": "unsigned int", - "comment": "A combination of the GIT_REPOSITORY_OPEN flags above." - }, - { - "name": "ceiling_dirs", - "type": "const char *", - "comment": "A GIT_PATH_LIST_SEPARATOR delimited list of path\n prefixes at which the search for a containing repository should\n terminate." - } - ], - "argline": "git_repository **out, const char *path, unsigned int flags, const char *ceiling_dirs", - "sig": "git_repository **::const char *::unsigned int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if no repository could be found,\n or -1 if there was a repository but open failed for some reason\n (such as repo corruption or system errors)." - }, - "description": "

Find and open a repository with extended controls.

\n", - "comments": "", - "group": "repository", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_repository_open_ext-43" - ] - } - }, - "git_repository_open_bare": { - "type": "function", - "file": "git2/repository.h", - "line": 182, - "lineto": 182, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Pointer to the repo which will be opened." - }, - { - "name": "bare_path", - "type": "const char *", - "comment": "Direct path to the bare repository" - } - ], - "argline": "git_repository **out, const char *bare_path", - "sig": "git_repository **::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Open a bare repository on the serverside.

\n", - "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n", - "group": "repository" - }, - "git_repository_free": { - "type": "function", - "file": "git2/repository.h", - "line": 195, - "lineto": 195, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository handle to close. If NULL nothing occurs." - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a previously allocated repository

\n", - "comments": "

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_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", - "group": "repository", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_repository_free-68" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_repository_free-4" - ] - } - }, - "git_repository_init": { - "type": "function", - "file": "git2/repository.h", - "line": 212, - "lineto": 215, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "pointer to the repo which will be created or reinitialized" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path to the repository" - }, - { - "name": "is_bare", - "type": "unsigned int", - "comment": "if true, a Git repository without a working directory is\n\t\tcreated at the pointed path. If false, provided path will be\n\t\tconsidered as the working directory into which the .git directory\n\t\twill be created." - } - ], - "argline": "git_repository **out, const char *path, unsigned int is_bare", - "sig": "git_repository **::const char *::unsigned int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Creates a new Git repository in the given folder.

\n", - "comments": "

TODO: - Reinit the repository

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.3.1/init.html#git_repository_init-5" - ] - } - }, - "git_repository_init_options_init": { - "type": "function", - "file": "git2/repository.h", - "line": 369, - "lineto": 371, - "args": [ - { - "name": "opts", - "type": "git_repository_init_options *", - "comment": "The `git_repository_init_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`." - } - ], - "argline": "git_repository_init_options *opts, unsigned int version", - "sig": "git_repository_init_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_repository_init_options structure

\n", - "comments": "

Initializes a git_repository_init_options with default values. Equivalent to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", - "group": "repository" - }, - "git_repository_init_ext": { - "type": "function", - "file": "git2/repository.h", - "line": 386, - "lineto": 389, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Pointer to the repo which will be created or reinitialized." - }, - { - "name": "repo_path", - "type": "const char *", - "comment": "The path to the repository." - }, - { - "name": "opts", - "type": "git_repository_init_options *", - "comment": "Pointer to git_repository_init_options struct." - } - ], - "argline": "git_repository **out, const char *repo_path, git_repository_init_options *opts", - "sig": "git_repository **::const char *::git_repository_init_options *", - "return": { - "type": "int", - "comment": " 0 or an error code on failure." - }, - "description": "

Create a new Git repository in the given folder with extended controls.

\n", - "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.3.1/init.html#git_repository_init_ext-6" - ] - } - }, - "git_repository_head": { - "type": "function", - "file": "git2/repository.h", - "line": 404, - "lineto": 404, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the reference which will be retrieved" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - } - ], - "argline": "git_reference **out, git_repository *repo", - "sig": "git_reference **::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise" - }, - "description": "

Retrieve and resolve the reference pointed at by HEAD.

\n", - "comments": "

The returned git_reference will be owned by caller and git_reference_free() must be called when done with it to release the allocated memory and prevent a leak.

\n", - "group": "repository", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_repository_head-31", - "ex/v1.3.1/merge.html#git_repository_head-32" - ], - "status.c": [ - "ex/v1.3.1/status.html#git_repository_head-3" - ] - } - }, - "git_repository_head_for_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 414, - "lineto": 415, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the reference which will be retrieved" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the worktree to retrieve HEAD for" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name", - "sig": "git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 when successful, error-code otherwise" - }, - "description": "

Retrieve the referenced HEAD for the worktree

\n", - "comments": "", - "group": "repository" - }, - "git_repository_head_detached": { - "type": "function", - "file": "git2/repository.h", - "line": 427, - "lineto": 427, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repo to test" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if HEAD is detached, 0 if it's not; error code if there\n was an error." - }, - "description": "

Check if a repository's HEAD is detached

\n", - "comments": "

A repository's HEAD is detached when it points directly to a commit instead of a branch.

\n", - "group": "repository" - }, - "git_repository_head_detached_for_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 440, - "lineto": 441, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the worktree to retrieve HEAD for" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 1 if HEAD is detached, 0 if its not; error code if\n there was an error" - }, - "description": "

Check if a worktree's HEAD is detached

\n", - "comments": "

A worktree's HEAD is detached when it points directly to a commit instead of a branch.

\n", - "group": "repository" - }, - "git_repository_head_unborn": { - "type": "function", - "file": "git2/repository.h", - "line": 453, - "lineto": 453, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repo to test" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error" - }, - "description": "

Check if the current branch is unborn

\n", - "comments": "

An unborn 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.

\n", - "group": "repository" - }, - "git_repository_is_empty": { - "type": "function", - "file": "git2/repository.h", - "line": 465, - "lineto": 465, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repo to test" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted" - }, - "description": "

Check if a repository is empty

\n", - "comments": "

An empty repository has just been initialized and contains no references apart from HEAD, which must be pointing to the unborn master branch.

\n", - "group": "repository" - }, - "git_repository_item_path": { - "type": "function", - "file": "git2/repository.h", - "line": 502, - "lineto": 502, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Buffer to store the path at" - }, - { - "name": "repo", - "type": "const git_repository *", - "comment": "Repository to get path for" - }, - { - "name": "item", - "type": "git_repository_item_t", - "comment": "The repository item for which to retrieve the path" - } - ], - "argline": "git_buf *out, const git_repository *repo, git_repository_item_t item", - "sig": "git_buf *::const git_repository *::git_repository_item_t", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the path cannot exist or an error code" - }, - "description": "

Get the location of a specific repository file or directory

\n", - "comments": "

This function will retrieve the path of a specific repository item. It will thereby honor things like the repository's common directory, gitdir, etc. In case a file path cannot exist for a given item (e.g. the working directory of a bare repository), GIT_ENOTFOUND is returned.

\n", - "group": "repository" - }, - "git_repository_path": { - "type": "function", - "file": "git2/repository.h", - "line": 513, - "lineto": 513, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "A repository object" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "const char *", - "comment": " the path to the repository" - }, - "description": "

Get the path of this repository

\n", - "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.3.1/init.html#git_repository_path-7" - ], - "status.c": [ - "ex/v1.3.1/status.html#git_repository_path-4" - ] - } - }, - "git_repository_workdir": { - "type": "function", - "file": "git2/repository.h", - "line": 524, - "lineto": 524, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "A repository object" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "const char *", - "comment": " the path to the working dir, if it exists" - }, - "description": "

Get the path of the working directory for this repository

\n", - "comments": "

If the repository is bare, this function will always return NULL.

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.3.1/init.html#git_repository_workdir-8" - ] - } - }, - "git_repository_commondir": { - "type": "function", - "file": "git2/repository.h", - "line": 536, - "lineto": 536, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "A repository object" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "const char *", - "comment": " the path to the common dir" - }, - "description": "

Get the path of the shared common directory for this repository.

\n", - "comments": "

If the repository is bare, it is the root directory for the repository. If the repository is a worktree, it is the parent repo's gitdir. Otherwise, it is the gitdir.

\n", - "group": "repository" - }, - "git_repository_set_workdir": { - "type": "function", - "file": "git2/repository.h", - "line": 555, - "lineto": 556, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "workdir", - "type": "const char *", - "comment": "The path to a working directory" - }, - { - "name": "update_gitlink", - "type": "int", - "comment": "Create/update gitlink in workdir and set config\n \"core.worktree\" (if workdir is not the parent of the .git directory)" - } - ], - "argline": "git_repository *repo, const char *workdir, int update_gitlink", - "sig": "git_repository *::const char *::int", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Set the path to the working directory for this repository

\n", - "comments": "

The working directory doesn't need to be the same one that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory will turn it into a normal repository, capable of performing all the common workdir operations (checkout, status, index manipulation, etc).

\n", - "group": "repository" - }, - "git_repository_is_bare": { - "type": "function", - "file": "git2/repository.h", - "line": 564, - "lineto": 564, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "Repo to test" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "int", - "comment": " 1 if the repository is bare, 0 otherwise." - }, - "description": "

Check if a repository is bare

\n", - "comments": "", - "group": "repository", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_repository_is_bare-5" - ] - } - }, - "git_repository_is_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 572, - "lineto": 572, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "Repo to test" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "int", - "comment": " 1 if the repository is a linked work tree, 0 otherwise." - }, - "description": "

Check if a repository is a linked work tree

\n", - "comments": "", - "group": "repository" - }, - "git_repository_config": { - "type": "function", - "file": "git2/repository.h", - "line": 588, - "lineto": 588, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "Pointer to store the loaded configuration" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_config **out, git_repository *repo", - "sig": "git_config **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the configuration file for this repository.

\n", - "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "config.c": [ - "ex/v1.3.1/config.html#git_repository_config-9" - ] - } - }, - "git_repository_config_snapshot": { - "type": "function", - "file": "git2/repository.h", - "line": 604, - "lineto": 604, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "Pointer to store the loaded configuration" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_config **out, git_repository *repo", - "sig": "git_config **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get a snapshot of the repository's configuration

\n", - "comments": "

Convenience function to take a snapshot from the repository's configuration. The contents of this snapshot will not change, even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_repository_config_snapshot-69", - "ex/v1.3.1/general.html#git_repository_config_snapshot-70" - ] - } - }, - "git_repository_odb": { - "type": "function", - "file": "git2/repository.h", - "line": 620, - "lineto": 620, - "args": [ - { - "name": "out", - "type": "git_odb **", - "comment": "Pointer to store the loaded ODB" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_odb **out, git_repository *repo", - "sig": "git_odb **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the Object Database for this repository.

\n", - "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_repository_odb-29" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_repository_odb-71" - ] - } - }, - "git_repository_refdb": { - "type": "function", - "file": "git2/repository.h", - "line": 636, - "lineto": 636, - "args": [ - { - "name": "out", - "type": "git_refdb **", - "comment": "Pointer to store the loaded refdb" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_refdb **out, git_repository *repo", - "sig": "git_refdb **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the Reference Database Backend for this repository.

\n", - "comments": "

If a custom refsdb has not been set, the default database for the repository will be returned (the one that manipulates loose and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by the user.

\n", - "group": "repository" - }, - "git_repository_index": { - "type": "function", - "file": "git2/repository.h", - "line": 652, - "lineto": 652, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "Pointer to store the loaded index" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_index **out, git_repository *repo", - "sig": "git_index **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the Index file for this repository.

\n", - "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "add.c": [ - "ex/v1.3.1/add.html#git_repository_index-5" - ], - "commit.c": [ - "ex/v1.3.1/commit.html#git_repository_index-6" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_repository_index-72" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_repository_index-9" - ], - "ls-files.c": [ - "ex/v1.3.1/ls-files.html#git_repository_index-5" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_repository_index-33" - ] - } - }, - "git_repository_message": { - "type": "function", - "file": "git2/repository.h", - "line": 670, - "lineto": 670, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "git_buf to write data into" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository to read prepared message from" - } - ], - "argline": "git_buf *out, git_repository *repo", - "sig": "git_buf *::git_repository *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if no message exists or an error code" - }, - "description": "

Retrieve git's prepared message

\n", - "comments": "

Operations such as git revert/cherry-pick/merge with the -n option stop just short of creating a commit with the changes and save their prepared message in .git/MERGE_MSG so the next git-commit execution can present it to the user for them to amend if they wish.

\n\n

Use this function to get the contents of this file. Don't forget to remove the file after you create the commit.

\n", - "group": "repository" - }, - "git_repository_message_remove": { - "type": "function", - "file": "git2/repository.h", - "line": 677, - "lineto": 677, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Remove git's prepared message.

\n", - "comments": "

Remove the message that git_repository_message retrieves.

\n", - "group": "repository" - }, - "git_repository_state_cleanup": { - "type": "function", - "file": "git2/repository.h", - "line": 686, - "lineto": 686, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, or error" - }, - "description": "

Remove all the metadata associated with an ongoing command like merge,\n revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc.

\n", - "comments": "", - "group": "repository", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_repository_state_cleanup-34" - ] - } - }, - "git_repository_fetchhead_foreach": { - "type": "function", - "file": "git2/repository.h", - "line": 717, - "lineto": 720, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "callback", - "type": "git_repository_fetchhead_foreach_cb", - "comment": "Callback function" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to callback data (optional)" - } - ], - "argline": "git_repository *repo, git_repository_fetchhead_foreach_cb callback, void *payload", - "sig": "git_repository *::git_repository_fetchhead_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no FETCH_HEAD file, or other error code." - }, - "description": "

Invoke 'callback' for each entry in the given FETCH_HEAD file.

\n", - "comments": "

Return a non-zero value from the callback to stop the loop.

\n", - "group": "repository" - }, - "git_repository_mergehead_foreach": { - "type": "function", - "file": "git2/repository.h", - "line": 746, - "lineto": 749, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "callback", - "type": "git_repository_mergehead_foreach_cb", - "comment": "Callback function" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to callback data (optional)" - } - ], - "argline": "git_repository *repo, git_repository_mergehead_foreach_cb callback, void *payload", - "sig": "git_repository *::git_repository_mergehead_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no MERGE_HEAD file, or other error code." - }, - "description": "

If a merge is in progress, invoke 'callback' for each commit ID in the\n MERGE_HEAD file.

\n", - "comments": "

Return a non-zero value from the callback to stop the loop.

\n", - "group": "repository" - }, - "git_repository_hashfile": { - "type": "function", - "file": "git2/repository.h", - "line": 776, - "lineto": 781, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Output value of calculated SHA" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to file on disk whose contents should be hashed. This\n may be an absolute path or a relative path, in which case it\n will be treated as a path within the working directory." - }, - { - "name": "type", - "type": "git_object_t", - "comment": "The object type to hash as (e.g. GIT_OBJECT_BLOB)" - }, - { - "name": "as_path", - "type": "const char *", - "comment": "The path to use to look up filtering rules. If this is\n an empty string then no filters will be applied when\n calculating the hash. If this is `NULL` and the `path`\n parameter is a file within the repository's working\n directory, then the `path` will be used." - } - ], - "argline": "git_oid *out, git_repository *repo, const char *path, git_object_t type, const char *as_path", - "sig": "git_oid *::git_repository *::const char *::git_object_t::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Calculate hash of file using repository filtering rules.

\n", - "comments": "

If you simply want to calculate the hash of a file on disk with no filters, you can just use the git_odb_hashfile() API. However, if you want to hash a file in the repository and you want to apply filtering rules (e.g. crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the filtering triggers that failure, then this function will return an error and not calculate the hash of the file.

\n", - "group": "repository" - }, - "git_repository_set_head": { - "type": "function", - "file": "git2/repository.h", - "line": 801, - "lineto": 803, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - }, - { - "name": "refname", - "type": "const char *", - "comment": "Canonical name of the reference the HEAD should point at" - } - ], - "argline": "git_repository *repo, const char *refname", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Make the repository HEAD point to the specified reference.

\n", - "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", - "group": "repository", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_repository_set_head-23" - ] - } - }, - "git_repository_set_head_detached": { - "type": "function", - "file": "git2/repository.h", - "line": 821, - "lineto": 823, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - }, - { - "name": "commitish", - "type": "const git_oid *", - "comment": "Object id of the Commit the HEAD should point to" - } - ], - "argline": "git_repository *repo, const git_oid *commitish", - "sig": "git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

If the provided committish cannot be found in the repository, the HEAD is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided commitish cannot be peeled into a commit, the HEAD is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to the peeled Commit.

\n", - "group": "repository" - }, - "git_repository_set_head_detached_from_annotated": { - "type": "function", - "file": "git2/repository.h", - "line": 837, - "lineto": 839, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "commitish", - "type": "const git_annotated_commit *", - "comment": null - } - ], - "argline": "git_repository *repo, const git_annotated_commit *commitish", - "sig": "git_repository *::const git_annotated_commit *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", - "group": "repository", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_repository_set_head_detached_from_annotated-24" - ] - } - }, - "git_repository_detach_head": { - "type": "function", - "file": "git2/repository.h", - "line": 858, - "lineto": 859, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code" - }, - "description": "

Detach the HEAD.

\n", - "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non commitish, the HEAD is unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", - "group": "repository" - }, - "git_repository_state": { - "type": "function", - "file": "git2/repository.h", - "line": 889, - "lineto": 889, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " The state of the repository" - }, - "description": "

Determines the status of a git repository - ie, whether an operation\n (merge, cherry-pick, etc) is in progress.

\n", - "comments": "", - "group": "repository", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_repository_state-25" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_repository_state-35" - ] - } - }, - "git_repository_set_namespace": { - "type": "function", - "file": "git2/repository.h", - "line": 903, - "lineto": 903, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repo" - }, - { - "name": "nmspace", - "type": "const char *", - "comment": "The namespace. This should not include the refs\n\tfolder, e.g. to namespace all references under `refs/namespaces/foo/`,\n\tuse `foo` as the namespace." - } - ], - "argline": "git_repository *repo, const char *nmspace", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error" - }, - "description": "

Sets the active namespace for this Git Repository

\n", - "comments": "

This namespace affects all reference operations for the repo. See man gitnamespaces

\n", - "group": "repository" - }, - "git_repository_get_namespace": { - "type": "function", - "file": "git2/repository.h", - "line": 911, - "lineto": 911, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repo" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "const char *", - "comment": " the active namespace, or NULL if there isn't one" - }, - "description": "

Get the currently active namespace for this repository

\n", - "comments": "", - "group": "repository" - }, - "git_repository_is_shallow": { - "type": "function", - "file": "git2/repository.h", - "line": 920, - "lineto": 920, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if shallow, zero if not" - }, - "description": "

Determine if the repository was a shallow clone

\n", - "comments": "", - "group": "repository" - }, - "git_repository_ident": { - "type": "function", - "file": "git2/repository.h", - "line": 932, - "lineto": 932, - "args": [ - { - "name": "name", - "type": "const char **", - "comment": "where to store the pointer to the name" - }, - { - "name": "email", - "type": "const char **", - "comment": "where to store the pointer to the email" - }, - { - "name": "repo", - "type": "const git_repository *", - "comment": "the repository" - } - ], - "argline": "const char **name, const char **email, const git_repository *repo", - "sig": "const char **::const char **::const git_repository *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Retrieve the configured identity to use for reflogs

\n", - "comments": "

The memory is owned by the repository and must not be freed by the user.

\n", - "group": "repository" - }, - "git_repository_set_ident": { - "type": "function", - "file": "git2/repository.h", - "line": 945, - "lineto": 945, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to configure" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name to use for the reflog entries" - }, - { - "name": "email", - "type": "const char *", - "comment": "the email to use for the reflog entries" - } - ], - "argline": "git_repository *repo, const char *name, const char *email", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Set the identity to be used for writing reflogs

\n", - "comments": "

If both are set, this name and email will be used to write to the reflog. Pass NULL to unset. When unset, the identity will be taken from the repository's configuration.

\n", - "group": "repository" - }, - "git_reset": { - "type": "function", - "file": "git2/reset.h", - "line": 62, - "lineto": 66, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to perform the reset operation." - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Committish to which the Head should be moved to. This object\n must belong to the given `repo` and can either be a git_commit or a\n git_tag. When a git_tag is being passed, it should be dereferencable\n to a git_commit which oid will be used as the target of the branch." - }, - { - "name": "reset_type", - "type": "git_reset_t", - "comment": "Kind of reset operation to perform." - }, - { - "name": "checkout_opts", - "type": "const git_checkout_options *", - "comment": "Optional checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks." - } - ], - "argline": "git_repository *repo, const git_object *target, git_reset_t reset_type, const git_checkout_options *checkout_opts", - "sig": "git_repository *::const git_object *::git_reset_t::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be replaced with the content of the index. (Untracked and ignored files will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", - "group": "reset" - }, - "git_reset_from_annotated": { - "type": "function", - "file": "git2/reset.h", - "line": 80, - "lineto": 84, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": null - }, - { - "name": "reset_type", - "type": "git_reset_t", - "comment": null - }, - { - "name": "checkout_opts", - "type": "const git_checkout_options *", - "comment": null - } - ], - "argline": "git_repository *repo, const git_annotated_commit *commit, git_reset_t reset_type, const git_checkout_options *checkout_opts", - "sig": "git_repository *::const git_annotated_commit *::git_reset_t::const git_checkout_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", - "group": "reset" - }, - "git_reset_default": { - "type": "function", - "file": "git2/reset.h", - "line": 104, - "lineto": 107, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to perform the reset operation." - }, - { - "name": "target", - "type": "const git_object *", - "comment": "The committish which content will be used to reset the content\n of the index." - }, - { - "name": "pathspecs", - "type": "const git_strarray *", - "comment": "List of pathspecs to operate on." - } - ], - "argline": "git_repository *repo, const git_object *target, const git_strarray *pathspecs", - "sig": "git_repository *::const git_object *::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 on success or an error code \n<\n 0" - }, - "description": "

Updates some entries in the index from the target commit tree.

\n", - "comments": "

The scope of the updated entries is determined by the paths being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing entries in the index matching the provided pathspecs.

\n", - "group": "reset" - }, - "git_revert_options_init": { - "type": "function", - "file": "git2/revert.h", - "line": 49, - "lineto": 51, - "args": [ - { - "name": "opts", - "type": "git_revert_options *", - "comment": "The `git_revert_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REVERT_OPTIONS_VERSION`." - } - ], - "argline": "git_revert_options *opts, unsigned int version", - "sig": "git_revert_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_revert_options structure

\n", - "comments": "

Initializes a git_revert_options with default values. Equivalent to creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", - "group": "revert" - }, - "git_revert_commit": { - "type": "function", - "file": "git2/revert.h", - "line": 67, - "lineto": 73, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository that contains the given commits" - }, - { - "name": "revert_commit", - "type": "git_commit *", - "comment": "the commit to revert" - }, - { - "name": "our_commit", - "type": "git_commit *", - "comment": "the commit to revert against (eg, HEAD)" - }, - { - "name": "mainline", - "type": "unsigned int", - "comment": "the parent of the revert commit, if it is a merge" - }, - { - "name": "merge_options", - "type": "const git_merge_options *", - "comment": "the merge options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, git_commit *revert_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", - "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Reverts the given commit against the given "our" commit, producing an\n index that reflects the result of the revert.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "revert" - }, - "git_revert": { - "type": "function", - "file": "git2/revert.h", - "line": 83, - "lineto": 86, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to revert" - }, - { - "name": "commit", - "type": "git_commit *", - "comment": "the commit to revert" - }, - { - "name": "given_opts", - "type": "const git_revert_options *", - "comment": "the revert options (or null for defaults)" - } - ], - "argline": "git_repository *repo, git_commit *commit, const git_revert_options *given_opts", - "sig": "git_repository *::git_commit *::const git_revert_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Reverts the given commit, producing changes in the index and working directory.

\n", - "comments": "", - "group": "revert" - }, - "git_revparse_single": { - "type": "function", - "file": "git2/revparse.h", - "line": 37, - "lineto": 38, - "args": [ - { - "name": "out", - "type": "git_object **", - "comment": "pointer to output object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to search in" - }, - { - "name": "spec", - "type": "const char *", - "comment": "the textual specification for an object" - } - ], - "argline": "git_object **out, git_repository *repo, const char *spec", - "sig": "git_object **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Find a single object, as specified by a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", - "group": "revparse", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_revparse_single-22" - ], - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_revparse_single-30" - ], - "describe.c": [ - "ex/v1.3.1/describe.html#git_revparse_single-6" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_revparse_single-44" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_revparse_single-9", - "ex/v1.3.1/tag.html#git_revparse_single-10", - "ex/v1.3.1/tag.html#git_revparse_single-11", - "ex/v1.3.1/tag.html#git_revparse_single-12" - ] - } - }, - "git_revparse_ext": { - "type": "function", - "file": "git2/revparse.h", - "line": 61, - "lineto": 65, - "args": [ - { - "name": "object_out", - "type": "git_object **", - "comment": "pointer to output object" - }, - { - "name": "reference_out", - "type": "git_reference **", - "comment": "pointer to output reference or NULL" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to search in" - }, - { - "name": "spec", - "type": "const char *", - "comment": "the textual specification for an object" - } - ], - "argline": "git_object **object_out, git_reference **reference_out, git_repository *repo, const char *spec", - "sig": "git_object **::git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code" - }, - "description": "

Find a single object and intermediate reference by a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", - "group": "revparse", - "examples": { - "commit.c": [ - "ex/v1.3.1/commit.html#git_revparse_ext-7" - ] - } - }, - "git_revparse": { - "type": "function", - "file": "git2/revparse.h", - "line": 105, - "lineto": 108, - "args": [ - { - "name": "revspec", - "type": "git_revspec *", - "comment": "Pointer to an user-allocated git_revspec struct where\n\t the result of the rev-parse will be stored" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to search in" - }, - { - "name": "spec", - "type": "const char *", - "comment": "the rev-parse spec to parse" - } - ], - "argline": "git_revspec *revspec, git_repository *repo, const char *spec", - "sig": "git_revspec *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code" - }, - "description": "

Parse a revision string for from, to, and intent.

\n", - "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", - "group": "revparse", - "examples": { - "blame.c": [ - "ex/v1.3.1/blame.html#git_revparse-23" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_revparse-45" - ], - "rev-parse.c": [ - "ex/v1.3.1/rev-parse.html#git_revparse-14", - "ex/v1.3.1/rev-parse.html#git_revparse-15" - ] - } - }, - "git_revwalk_new": { - "type": "function", - "file": "git2/revwalk.h", - "line": 73, - "lineto": 73, - "args": [ - { - "name": "out", - "type": "git_revwalk **", - "comment": "pointer to the new revision walker" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to walk through" - } - ], - "argline": "git_revwalk **out, git_repository *repo", - "sig": "git_revwalk **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Allocate a new revision walker to iterate through a repo.

\n", - "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

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.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_revwalk_new-73" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_revwalk_new-46", - "ex/v1.3.1/log.html#git_revwalk_new-47" - ] - } - }, - "git_revwalk_reset": { - "type": "function", - "file": "git2/revwalk.h", - "line": 89, - "lineto": 89, - "args": [ - { - "name": "walker", - "type": "git_revwalk *", - "comment": "handle to reset." - } - ], - "argline": "git_revwalk *walker", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Reset the revision walker for reuse.

\n", - "comments": "

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.

\n\n

The revision walk is automatically reset when a walk is over.

\n", - "group": "revwalk" - }, - "git_revwalk_push": { - "type": "function", - "file": "git2/revwalk.h", - "line": 108, - "lineto": 108, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the oid of the commit to start from." - } - ], - "argline": "git_revwalk *walk, const git_oid *id", - "sig": "git_revwalk *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a new root for the traversal

\n", - "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_revwalk_push-74" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_revwalk_push-48" - ] - } - }, - "git_revwalk_push_glob": { - "type": "function", - "file": "git2/revwalk.h", - "line": 126, - "lineto": 126, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "glob", - "type": "const char *", - "comment": "the glob pattern references should match" - } - ], - "argline": "git_revwalk *walk, const char *glob", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push matching references

\n", - "comments": "

The OIDs pointed to by the references that match the given glob pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", - "group": "revwalk" - }, - "git_revwalk_push_head": { - "type": "function", - "file": "git2/revwalk.h", - "line": 134, - "lineto": 134, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push the repository's HEAD

\n", - "comments": "", - "group": "revwalk", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_revwalk_push_head-49" - ] - } - }, - "git_revwalk_hide": { - "type": "function", - "file": "git2/revwalk.h", - "line": 149, - "lineto": 149, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal." - }, - { - "name": "commit_id", - "type": "const git_oid *", - "comment": "the oid of commit that will be ignored during the traversal" - } - ], - "argline": "git_revwalk *walk, const git_oid *commit_id", - "sig": "git_revwalk *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", - "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", - "group": "revwalk", - "examples": { - "log.c": [ - "ex/v1.3.1/log.html#git_revwalk_hide-50" - ] - } - }, - "git_revwalk_hide_glob": { - "type": "function", - "file": "git2/revwalk.h", - "line": 168, - "lineto": 168, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "glob", - "type": "const char *", - "comment": "the glob pattern references should match" - } - ], - "argline": "git_revwalk *walk, const char *glob", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Hide matching references.

\n", - "comments": "

The OIDs pointed to by the references that match the given glob pattern and their ancestors will be hidden from the output on the revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", - "group": "revwalk" - }, - "git_revwalk_hide_head": { - "type": "function", - "file": "git2/revwalk.h", - "line": 176, - "lineto": 176, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Hide the repository's HEAD

\n", - "comments": "", - "group": "revwalk" - }, - "git_revwalk_push_ref": { - "type": "function", - "file": "git2/revwalk.h", - "line": 187, - "lineto": 187, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to push" - } - ], - "argline": "git_revwalk *walk, const char *refname", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push the OID pointed to by a reference

\n", - "comments": "

The reference must point to a committish.

\n", - "group": "revwalk" - }, - "git_revwalk_hide_ref": { - "type": "function", - "file": "git2/revwalk.h", - "line": 198, - "lineto": 198, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to hide" - } - ], - "argline": "git_revwalk *walk, const char *refname", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Hide the OID pointed to by a reference

\n", - "comments": "

The reference must point to a committish.

\n", - "group": "revwalk" - }, - "git_revwalk_next": { - "type": "function", - "file": "git2/revwalk.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where to store the oid of the next commit" - }, - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker to pop the commit from." - } - ], - "argline": "git_oid *out, git_revwalk *walk", - "sig": "git_oid *::git_revwalk *", - "return": { - "type": "int", - "comment": " 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate" - }, - "description": "

Get the next commit from the revision walk.

\n", - "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

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).

\n\n

The revision walker is reset when the walk is over.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_revwalk_next-75" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_revwalk_next-51" - ] - } - }, - "git_revwalk_sorting": { - "type": "function", - "file": "git2/revwalk.h", - "line": 230, - "lineto": 230, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal." - }, - { - "name": "sort_mode", - "type": "unsigned int", - "comment": "combination of GIT_SORT_XXX flags" - } - ], - "argline": "git_revwalk *walk, unsigned int sort_mode", - "sig": "git_revwalk *::unsigned int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Change the sorting mode when iterating through the\n repository's contents.

\n", - "comments": "

Changing the sorting mode resets the walker.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_revwalk_sorting-76" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_revwalk_sorting-52", - "ex/v1.3.1/log.html#git_revwalk_sorting-53" - ] - } - }, - "git_revwalk_push_range": { - "type": "function", - "file": "git2/revwalk.h", - "line": 245, - "lineto": 245, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "range", - "type": "const char *", - "comment": "the range" - } - ], - "argline": "git_revwalk *walk, const char *range", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push and hide the respective endpoints of the given range.

\n", - "comments": "

The range should be of the form .. where each is in the form accepted by 'git_revparse_single'. The left-hand commit will be hidden and the right-hand commit pushed.

\n", - "group": "revwalk" - }, - "git_revwalk_simplify_first_parent": { - "type": "function", - "file": "git2/revwalk.h", - "line": 254, - "lineto": 254, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": null - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Simplify the history by first-parent

\n", - "comments": "

No parents other than the first for each commit will be enqueued.

\n", - "group": "revwalk" - }, - "git_revwalk_free": { - "type": "function", - "file": "git2/revwalk.h", - "line": 262, - "lineto": 262, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "traversal handle to close. If NULL nothing occurs." - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a revision walker previously allocated.

\n", - "comments": "", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_revwalk_free-77" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_revwalk_free-54" - ] - } - }, - "git_revwalk_repository": { - "type": "function", - "file": "git2/revwalk.h", - "line": 271, - "lineto": 271, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the revision walker" - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "git_repository *", - "comment": " the repository being walked" - }, - "description": "

Return the repository on which this walker\n is operating.

\n", - "comments": "", - "group": "revwalk" - }, - "git_revwalk_add_hide_cb": { - "type": "function", - "file": "git2/revwalk.h", - "line": 292, - "lineto": 295, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the revision walker" - }, - { - "name": "hide_cb", - "type": "git_revwalk_hide_cb", - "comment": "callback function to hide a commit and its parents" - }, - { - "name": "payload", - "type": "void *", - "comment": "data payload to be passed to callback function" - } - ], - "argline": "git_revwalk *walk, git_revwalk_hide_cb hide_cb, void *payload", - "sig": "git_revwalk *::git_revwalk_hide_cb::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Adds, changes or removes a callback function to hide a commit and its parents

\n", - "comments": "", - "group": "revwalk" - }, - "git_signature_new": { - "type": "function", - "file": "git2/signature.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature, in case of error NULL" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the person" - }, - { - "name": "email", - "type": "const char *", - "comment": "email of the person" - }, - { - "name": "time", - "type": "git_time_t", - "comment": "time (in seconds from epoch) when the action happened" - }, - { - "name": "offset", - "type": "int", - "comment": "timezone offset (in minutes) for the time" - } - ], - "argline": "git_signature **out, const char *name, const char *email, git_time_t time, int offset", - "sig": "git_signature **::const char *::const char *::git_time_t::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new action signature.

\n", - "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('<' and '>') characters are not allowed to be used in either the name or the email parameter.

\n", - "group": "signature", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_signature_new-78", - "ex/v1.3.1/general.html#git_signature_new-79" - ] - } - }, - "git_signature_now": { - "type": "function", - "file": "git2/signature.h", - "line": 49, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature, in case of error NULL" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the person" - }, - { - "name": "email", - "type": "const char *", - "comment": "email of the person" - } - ], - "argline": "git_signature **out, const char *name, const char *email", - "sig": "git_signature **::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new action signature with a timestamp of 'now'.

\n", - "comments": "

Call git_signature_free() to free the data.

\n", - "group": "signature", - "examples": { - "merge.c": [ - "ex/v1.3.1/merge.html#git_signature_now-36" - ] - } - }, - "git_signature_default": { - "type": "function", - "file": "git2/signature.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository pointer" - } - ], - "argline": "git_signature **out, git_repository *repo", - "sig": "git_signature **::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" - }, - "description": "

Create a new action signature with default user and now timestamp.

\n", - "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", - "group": "signature", - "examples": { - "commit.c": [ - "ex/v1.3.1/commit.html#git_signature_default-8" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_signature_default-10" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_signature_default-13" - ] - } - }, - "git_signature_from_buffer": { - "type": "function", - "file": "git2/signature.h", - "line": 76, - "lineto": 76, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature" - }, - { - "name": "buf", - "type": "const char *", - "comment": "signature string" - } - ], - "argline": "git_signature **out, const char *buf", - "sig": "git_signature **::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new signature by parsing the given buffer, which is\n expected to be in the format "Real Name \n<email

\n\n
\n

timestamp tzoffset",\n where timestamp is the number of seconds since the Unix epoch and\n tzoffset is the timezone offset in hhmm format (note the lack\n of a colon separator).

\n
\n", - "comments": "", - "group": "signature" - }, - "git_signature_dup": { - "type": "function", - "file": "git2/signature.h", - "line": 88, - "lineto": 88, - "args": [ - { - "name": "dest", - "type": "git_signature **", - "comment": "pointer where to store the copy" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to duplicate" - } - ], - "argline": "git_signature **dest, const git_signature *sig", - "sig": "git_signature **::const git_signature *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an existing signature. All internal strings are also\n duplicated.

\n", - "comments": "

Call git_signature_free() to free the data.

\n", - "group": "signature" - }, - "git_signature_free": { - "type": "function", - "file": "git2/signature.h", - "line": 99, - "lineto": 99, - "args": [ - { - "name": "sig", - "type": "git_signature *", - "comment": "signature to free" - } - ], - "argline": "git_signature *sig", - "sig": "git_signature *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an existing signature.

\n", - "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", - "group": "signature", - "examples": { - "commit.c": [ - "ex/v1.3.1/commit.html#git_signature_free-9" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_signature_free-80", - "ex/v1.3.1/general.html#git_signature_free-81" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_signature_free-11" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_signature_free-14" - ] - } - }, - "git_stash_save": { - "type": "function", - "file": "git2/stash.h", - "line": 67, - "lineto": 72, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "stasher", - "type": "const git_signature *", - "comment": "The identity of the person performing the stashing." - }, - { - "name": "message", - "type": "const char *", - "comment": "Optional description along with the stashed state." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" - } - ], - "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", - "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." - }, - "description": "

Save the local modifications to a new stash.

\n", - "comments": "", - "group": "stash" - }, - "git_stash_apply_options_init": { - "type": "function", - "file": "git2/stash.h", - "line": 156, - "lineto": 157, - "args": [ - { - "name": "opts", - "type": "git_stash_apply_options *", - "comment": "The `git_stash_apply_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_STASH_APPLY_OPTIONS_VERSION`." - } - ], - "argline": "git_stash_apply_options *opts, unsigned int version", - "sig": "git_stash_apply_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_stash_apply_options structure

\n", - "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", - "group": "stash" - }, - "git_stash_apply": { - "type": "function", - "file": "git2/stash.h", - "line": 185, - "lineto": 188, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - }, - { - "name": "options", - "type": "const git_stash_apply_options *", - "comment": "Optional options to control how stashes are applied." - } - ], - "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", - "sig": "git_repository *::size_t::const git_stash_apply_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" - }, - "description": "

Apply a single stashed state from the stash list.

\n", - "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", - "group": "stash" - }, - "git_stash_foreach": { - "type": "function", - "file": "git2/stash.h", - "line": 221, - "lineto": 224, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the stash." - }, - { - "name": "callback", - "type": "git_stash_cb", - "comment": "Callback to invoke per found stashed state. The most\n recent stash state will be enumerated first." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra parameter to callback function." - } - ], - "argline": "git_repository *repo, git_stash_cb callback, void *payload", - "sig": "git_repository *::git_stash_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code." - }, - "description": "

Loop over all the stashed states and issue a callback for each one.

\n", - "comments": "

If the callback returns a non-zero value, this will stop looping.

\n", - "group": "stash" - }, - "git_stash_drop": { - "type": "function", - "file": "git2/stash.h", - "line": 237, - "lineto": 239, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - } - ], - "argline": "git_repository *repo, size_t index", - "sig": "git_repository *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code." - }, - "description": "

Remove a single stashed state from the stash list.

\n", - "comments": "", - "group": "stash" - }, - "git_stash_pop": { - "type": "function", - "file": "git2/stash.h", - "line": 253, - "lineto": 256, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - }, - { - "name": "options", - "type": "const git_stash_apply_options *", - "comment": "Optional options to control how stashes are applied." - } - ], - "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", - "sig": "git_repository *::size_t::const git_stash_apply_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code. (see git_stash_apply() above for details)" - }, - "description": "

Apply a single stashed state from the stash list and remove it from the list\n if successful.

\n", - "comments": "", - "group": "stash" - }, - "git_status_options_init": { - "type": "function", - "file": "git2/status.h", - "line": 268, - "lineto": 270, - "args": [ - { - "name": "opts", - "type": "git_status_options *", - "comment": "The `git_status_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." - } - ], - "argline": "git_status_options *opts, unsigned int version", - "sig": "git_status_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_status_options structure

\n", - "comments": "

Initializes a git_status_options with default values. Equivalent to creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", - "group": "status" - }, - "git_status_foreach": { - "type": "function", - "file": "git2/status.h", - "line": 308, - "lineto": 311, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "callback", - "type": "git_status_cb", - "comment": "The function to call on each file" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to pass through to callback function" - } - ], - "argline": "git_repository *repo, git_status_cb callback, void *payload", - "sig": "git_repository *::git_status_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Gather file statuses and run a callback for each one.

\n", - "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_status_foreach-6" - ] - } - }, - "git_status_foreach_ext": { - "type": "function", - "file": "git2/status.h", - "line": 332, - "lineto": 336, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object" - }, - { - "name": "opts", - "type": "const git_status_options *", - "comment": "Status options structure" - }, - { - "name": "callback", - "type": "git_status_cb", - "comment": "The function to call on each file" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to pass through to callback function" - } - ], - "argline": "git_repository *repo, const git_status_options *opts, git_status_cb callback, void *payload", - "sig": "git_repository *::const git_status_options *::git_status_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Gather file status information and run callbacks as requested.

\n", - "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_status_foreach_ext-7" - ] - } - }, - "git_status_file": { - "type": "function", - "file": "git2/status.h", - "line": 364, - "lineto": 367, - "args": [ - { - "name": "status_flags", - "type": "unsigned int *", - "comment": "Output combination of git_status_t values for file" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "path", - "type": "const char *", - "comment": "The exact path to retrieve status for relative to the\n repository working directory" - } - ], - "argline": "unsigned int *status_flags, git_repository *repo, const char *path", - "sig": "unsigned int *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors." - }, - "description": "

Get file status for a single file.

\n", - "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", - "group": "status", - "examples": { - "add.c": [ - "ex/v1.3.1/add.html#git_status_file-6" - ] - } - }, - "git_status_list_new": { - "type": "function", - "file": "git2/status.h", - "line": 382, - "lineto": 385, - "args": [ - { - "name": "out", - "type": "git_status_list **", - "comment": "Pointer to store the status results in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object" - }, - { - "name": "opts", - "type": "const git_status_options *", - "comment": "Status options structure" - } - ], - "argline": "git_status_list **out, git_repository *repo, const git_status_options *opts", - "sig": "git_status_list **::git_repository *::const git_status_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Gather file status information and populate the git_status_list.

\n", - "comments": "

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_status_list_new-8", - "ex/v1.3.1/status.html#git_status_list_new-9" - ] - } - }, - "git_status_list_entrycount": { - "type": "function", - "file": "git2/status.h", - "line": 396, - "lineto": 397, - "args": [ - { - "name": "statuslist", - "type": "git_status_list *", - "comment": "Existing status list object" - } - ], - "argline": "git_status_list *statuslist", - "sig": "git_status_list *", - "return": { - "type": "size_t", - "comment": " the number of status entries" - }, - "description": "

Gets the count of status entries in this list.

\n", - "comments": "

If there are no changes in status (at least according the options given when the status list was created), this can return 0.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_status_list_entrycount-10", - "ex/v1.3.1/status.html#git_status_list_entrycount-11" - ] - } - }, - "git_status_byindex": { - "type": "function", - "file": "git2/status.h", - "line": 408, - "lineto": 410, - "args": [ - { - "name": "statuslist", - "type": "git_status_list *", - "comment": "Existing status list object" - }, - { - "name": "idx", - "type": "size_t", - "comment": "Position of the entry" - } - ], - "argline": "git_status_list *statuslist, size_t idx", - "sig": "git_status_list *::size_t", - "return": { - "type": "const git_status_entry *", - "comment": " Pointer to the entry; NULL if out of bounds" - }, - "description": "

Get a pointer to one of the entries in the status list.

\n", - "comments": "

The entry is not modifiable and should not be freed.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_status_byindex-12", - "ex/v1.3.1/status.html#git_status_byindex-13", - "ex/v1.3.1/status.html#git_status_byindex-14", - "ex/v1.3.1/status.html#git_status_byindex-15", - "ex/v1.3.1/status.html#git_status_byindex-16", - "ex/v1.3.1/status.html#git_status_byindex-17" - ] - } - }, - "git_status_list_free": { - "type": "function", - "file": "git2/status.h", - "line": 417, - "lineto": 418, - "args": [ - { - "name": "statuslist", - "type": "git_status_list *", - "comment": "Existing status list object" - } - ], - "argline": "git_status_list *statuslist", - "sig": "git_status_list *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an existing status list

\n", - "comments": "", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_status_list_free-18" - ] - } - }, - "git_status_should_ignore": { - "type": "function", - "file": "git2/status.h", - "line": 436, - "lineto": 439, - "args": [ - { - "name": "ignored", - "type": "int *", - "comment": "Boolean returning 0 if the file is not ignored, 1 if it is" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "path", - "type": "const char *", - "comment": "The file to check ignores for, rooted at the repo's workdir." - } - ], - "argline": "int *ignored, git_repository *repo, const char *path", - "sig": "int *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." - }, - "description": "

Test if the ignore rules apply to a given file.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", - "group": "status" - }, - "git_strarray_dispose": { - "type": "function", - "file": "git2/strarray.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "The git_strarray that contains strings to free" - } - ], - "argline": "git_strarray *array", - "sig": "git_strarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the strings contained in a string array. This method should\n be called on git_strarray objects that were provided by the\n library. Not doing so, will result in a memory leak.

\n", - "comments": "

This does not free the git_strarray itself, since the library will never allocate that object directly itself.

\n", - "group": "strarray", - "examples": { - "checkout.c": [ - "ex/v1.3.1/checkout.html#git_strarray_dispose-26" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_strarray_dispose-82" - ], - "remote.c": [ - "ex/v1.3.1/remote.html#git_strarray_dispose-11", - "ex/v1.3.1/remote.html#git_strarray_dispose-12" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_strarray_dispose-15" - ] - } - }, - "git_submodule_update_options_init": { - "type": "function", - "file": "git2/submodule.h", - "line": 171, - "lineto": 172, - "args": [ - { - "name": "opts", - "type": "git_submodule_update_options *", - "comment": "The `git_submodule_update_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`." - } - ], - "argline": "git_submodule_update_options *opts, unsigned int version", - "sig": "git_submodule_update_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_submodule_update_options structure

\n", - "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", - "group": "submodule" - }, - "git_submodule_update": { - "type": "function", - "file": "git2/submodule.h", - "line": 192, - "lineto": 192, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule object" - }, - { - "name": "init", - "type": "int", - "comment": "If the submodule is not initialized, setting this flag to true\n will initialize the submodule before updating. Otherwise, this will\n return an error if attempting to update an uninitialzed repository.\n but setting this to true forces them to be updated." - }, - { - "name": "options", - "type": "git_submodule_update_options *", - "comment": "configuration options for the update. If NULL, the\n function works as though GIT_SUBMODULE_UPDATE_OPTIONS_INIT was passed." - } - ], - "argline": "git_submodule *submodule, int init, git_submodule_update_options *options", - "sig": "git_submodule *::int::git_submodule_update_options *", - "return": { - "type": "int", - "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)." - }, - "description": "

Update a submodule. This will clone a missing submodule and\n checkout the subrepository to the commit specified in the index of\n the containing repository. If the submodule repository doesn't contain\n the target commit (e.g. because fetchRecurseSubmodules isn't set), then\n the submodule is fetched using the fetch options supplied in options.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_lookup": { - "type": "function", - "file": "git2/submodule.h", - "line": 221, - "lineto": 224, - "args": [ - { - "name": "out", - "type": "git_submodule **", - "comment": "Output ptr to submodule; pass NULL to just get return code" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The parent repository" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of or path to the submodule; trailing slashes okay" - } - ], - "argline": "git_submodule **out, git_repository *repo, const char *name", - "sig": "git_submodule **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors." - }, - "description": "

Lookup submodule information by name or path.

\n", - "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config, but does "exist" in the working directory (i.e. there is a subdirectory that appears to be a Git repository). In this case, this function returns GIT_EEXISTS to indicate a sub-repository exists but not in a state where a git_submodule can be instantiated. - The submodule is not mentioned in the HEAD, index, or config and the working directory doesn't contain a value git repo at that path. There may or may not be anything else at that path, but nothing that looks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", - "group": "submodule" - }, - "git_submodule_dup": { - "type": "function", - "file": "git2/submodule.h", - "line": 233, - "lineto": 233, - "args": [ - { - "name": "out", - "type": "git_submodule **", - "comment": "Pointer to store the copy of the submodule." - }, - { - "name": "source", - "type": "git_submodule *", - "comment": "Original submodule to copy." - } - ], - "argline": "git_submodule **out, git_submodule *source", - "sig": "git_submodule **::git_submodule *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an in-memory copy of a submodule. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_free": { - "type": "function", - "file": "git2/submodule.h", - "line": 240, - "lineto": 240, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Release a submodule

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_foreach": { - "type": "function", - "file": "git2/submodule.h", - "line": 260, - "lineto": 263, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - }, - { - "name": "callback", - "type": "git_submodule_cb", - "comment": "Function to be called with the name of each submodule.\n Return a non-zero value to terminate the iteration." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra data to pass to callback" - } - ], - "argline": "git_repository *repo, git_submodule_cb callback, void *payload", - "sig": "git_repository *::git_submodule_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, or non-zero return value of callback" - }, - "description": "

Iterate over all tracked submodules of a repository.

\n", - "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_submodule_foreach-19" - ] - } - }, - "git_submodule_add_setup": { - "type": "function", - "file": "git2/submodule.h", - "line": 291, - "lineto": 296, - "args": [ - { - "name": "out", - "type": "git_submodule **", - "comment": "The newly created submodule ready to open for clone" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository in which you want to create the submodule" - }, - { - "name": "url", - "type": "const char *", - "comment": "URL for the submodule's remote" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path at which the submodule should be created" - }, - { - "name": "use_gitlink", - "type": "int", - "comment": "Should workdir contain a gitlink to the repo in\n .git/modules vs. repo directly in workdir." - } - ], - "argline": "git_submodule **out, git_repository *repo, const char *url, const char *path, int use_gitlink", - "sig": "git_submodule **::git_repository *::const char *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." - }, - "description": "

Set up a new git submodule for checkout.

\n", - "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed (if you don't need anything custom see git_submodule_add_clone()). Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", - "group": "submodule" - }, - "git_submodule_clone": { - "type": "function", - "file": "git2/submodule.h", - "line": 309, - "lineto": 312, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "The newly created repository object. Optional." - }, - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule currently waiting for its clone." - }, - { - "name": "opts", - "type": "const git_submodule_update_options *", - "comment": "The options to use." - } - ], - "argline": "git_repository **out, git_submodule *submodule, const git_submodule_update_options *opts", - "sig": "git_repository **::git_submodule *::const git_submodule_update_options *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on other errors (see git_clone)." - }, - "description": "

Perform the clone step for a newly created submodule.

\n", - "comments": "

This performs the necessary git_clone to setup a newly-created submodule.

\n", - "group": "submodule" - }, - "git_submodule_add_finalize": { - "type": "function", - "file": "git2/submodule.h", - "line": 324, - "lineto": 324, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to finish adding." - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Resolve the setup of a new git submodule.

\n", - "comments": "

This should be called on a submodule once you have called add setup and done the clone of the submodule. This adds the .gitmodules file and the newly cloned submodule to the index to be ready to be committed (but doesn't actually do the commit).

\n", - "group": "submodule" - }, - "git_submodule_add_to_index": { - "type": "function", - "file": "git2/submodule.h", - "line": 336, - "lineto": 338, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to add to the index" - }, - { - "name": "write_index", - "type": "int", - "comment": "Boolean if this should immediately write the index\n file. If you pass this as false, you will have to get the\n git_index and explicitly call `git_index_write()` on it to\n save the change." - } - ], - "argline": "git_submodule *submodule, int write_index", - "sig": "git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Add current submodule HEAD commit to index of superproject.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_owner": { - "type": "function", - "file": "git2/submodule.h", - "line": 351, - "lineto": 351, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_repository *", - "comment": " Pointer to `git_repository`" - }, - "description": "

Get the containing repository for a submodule.

\n", - "comments": "

This returns a pointer to the repository that contains the submodule. This is a just a reference to the repository that was passed to the original git_submodule_lookup() call, so if that repository has been freed, then this may be a dangling reference.

\n", - "group": "submodule" - }, - "git_submodule_name": { - "type": "function", - "file": "git2/submodule.h", - "line": 359, - "lineto": 359, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule name" - }, - "description": "

Get the name of submodule.

\n", - "comments": "", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_submodule_name-20" - ] - } - }, - "git_submodule_path": { - "type": "function", - "file": "git2/submodule.h", - "line": 370, - "lineto": 370, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule path" - }, - "description": "

Get the path to the submodule.

\n", - "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_submodule_path-21" - ] - } - }, - "git_submodule_url": { - "type": "function", - "file": "git2/submodule.h", - "line": 378, - "lineto": 378, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule url" - }, - "description": "

Get the URL for the submodule.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_resolve_url": { - "type": "function", - "file": "git2/submodule.h", - "line": 388, - "lineto": 388, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer to store the absolute submodule url in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Pointer to repository object" - }, - { - "name": "url", - "type": "const char *", - "comment": "Relative url" - } - ], - "argline": "git_buf *out, git_repository *repo, const char *url", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Resolve a submodule url relative to the given repository.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_branch": { - "type": "function", - "file": "git2/submodule.h", - "line": 396, - "lineto": 396, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule branch" - }, - "description": "

Get the branch for the submodule.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_set_branch": { - "type": "function", - "file": "git2/submodule.h", - "line": 409, - "lineto": 409, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submodule to configure" - }, - { - "name": "branch", - "type": "const char *", - "comment": "Branch that should be used for the submodule" - } - ], - "argline": "git_repository *repo, const char *name, const char *branch", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Set the branch for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", - "group": "submodule" - }, - "git_submodule_set_url": { - "type": "function", - "file": "git2/submodule.h", - "line": 423, - "lineto": 423, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submodule to configure" - }, - { - "name": "url", - "type": "const char *", - "comment": "URL that should be used for the submodule" - } - ], - "argline": "git_repository *repo, const char *name, const char *url", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Set the URL for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", - "group": "submodule" - }, - "git_submodule_index_id": { - "type": "function", - "file": "git2/submodule.h", - "line": 431, - "lineto": 431, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const git_oid *", - "comment": " Pointer to git_oid or NULL if submodule is not in index." - }, - "description": "

Get the OID for the submodule in the index.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_head_id": { - "type": "function", - "file": "git2/submodule.h", - "line": 439, - "lineto": 439, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const git_oid *", - "comment": " Pointer to git_oid or NULL if submodule is not in the HEAD." - }, - "description": "

Get the OID for the submodule in the current HEAD tree.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_wd_id": { - "type": "function", - "file": "git2/submodule.h", - "line": 452, - "lineto": 452, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const git_oid *", - "comment": " Pointer to git_oid or NULL if submodule is not checked out." - }, - "description": "

Get the OID for the submodule in the current working directory.

\n", - "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked out submodule. If there are pending changes in the index or anything else, this won't notice that. You should call git_submodule_status() for a more complete picture about the state of the working directory.

\n", - "group": "submodule" - }, - "git_submodule_ignore": { - "type": "function", - "file": "git2/submodule.h", - "line": 477, - "lineto": 478, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to check" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_submodule_ignore_t", - "comment": " The current git_submodule_ignore_t valyue what will be used for\n this submodule." - }, - "description": "

Get the ignore rule that will be used for the submodule.

\n", - "comments": "

These values control the behavior of git_submodule_status() for this submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents of the submodule from a clean checkout to be dirty, including the addition of untracked files. This is the default if unspecified. - GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the working tree (i.e. call git_status_foreach() on the submodule) but UNTRACKED files will not count as making the submodule dirty. - GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the submodule has moved for status. This is fast since it does not need to scan the working tree of the submodule at all. - GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo. The working directory will be consider clean so long as there is a checked out version present.
  • \n
\n", - "group": "submodule" - }, - "git_submodule_set_ignore": { - "type": "function", - "file": "git2/submodule.h", - "line": 490, - "lineto": 493, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submdule" - }, - { - "name": "ignore", - "type": "git_submodule_ignore_t", - "comment": "The new value for the ignore rule" - } - ], - "argline": "git_repository *repo, const char *name, git_submodule_ignore_t ignore", - "sig": "git_repository *::const char *::git_submodule_ignore_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the ignore rule for the submodule in the configuration

\n", - "comments": "

This does not affect any currently-loaded instances.

\n", - "group": "submodule" - }, - "git_submodule_update_strategy": { - "type": "function", - "file": "git2/submodule.h", - "line": 505, - "lineto": 506, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to check" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_submodule_update_t", - "comment": " The current git_submodule_update_t value that will be used\n for this submodule." - }, - "description": "

Get the update rule that will be used for the submodule.

\n", - "comments": "

This value controls the behavior of the git submodule update command. There are four useful values documented with git_submodule_update_t.

\n", - "group": "submodule" - }, - "git_submodule_set_update": { - "type": "function", - "file": "git2/submodule.h", - "line": 518, - "lineto": 521, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submodule to configure" - }, - { - "name": "update", - "type": "git_submodule_update_t", - "comment": "The new value to use" - } - ], - "argline": "git_repository *repo, const char *name, git_submodule_update_t update", - "sig": "git_repository *::const char *::git_submodule_update_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the update rule for the submodule in the configuration

\n", - "comments": "

This setting won't affect any existing instances.

\n", - "group": "submodule" - }, - "git_submodule_fetch_recurse_submodules": { - "type": "function", - "file": "git2/submodule.h", - "line": 534, - "lineto": 535, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": null - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_submodule_recurse_t", - "comment": " 0 if fetchRecurseSubmodules is false, 1 if true" - }, - "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", - "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", - "group": "submodule" - }, - "git_submodule_set_fetch_recurse_submodules": { - "type": "function", - "file": "git2/submodule.h", - "line": 547, - "lineto": 550, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the submodule to configure" - }, - { - "name": "fetch_recurse_submodules", - "type": "git_submodule_recurse_t", - "comment": "Boolean value" - } - ], - "argline": "git_repository *repo, const char *name, git_submodule_recurse_t fetch_recurse_submodules", - "sig": "git_repository *::const char *::git_submodule_recurse_t", - "return": { - "type": "int", - "comment": " old value for fetchRecurseSubmodules" - }, - "description": "

Set the fetchRecurseSubmodules rule for a submodule in the configuration

\n", - "comments": "

This setting won't affect any existing instances.

\n", - "group": "submodule" - }, - "git_submodule_init": { - "type": "function", - "file": "git2/submodule.h", - "line": 565, - "lineto": 565, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to write into the superproject config" - }, - { - "name": "overwrite", - "type": "int", - "comment": "By default, existing entries will not be overwritten,\n but setting this to true forces them to be updated." - } - ], - "argline": "git_submodule *submodule, int overwrite", - "sig": "git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure." - }, - "description": "

Copy submodule info into ".git/config" file.

\n", - "comments": "

Just like "git submodule init", this copies information about the submodule into ".git/config". You can use the accessor functions above to alter the in-memory git_submodule object and control what is written to the config, overriding what is in .gitmodules.

\n", - "group": "submodule" - }, - "git_submodule_repo_init": { - "type": "function", - "file": "git2/submodule.h", - "line": 580, - "lineto": 583, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Output pointer to the created git repository." - }, - { - "name": "sm", - "type": "const git_submodule *", - "comment": "The submodule to create a new subrepository from." - }, - { - "name": "use_gitlink", - "type": "int", - "comment": "Should the workdir contain a gitlink to\n the repo in .git/modules vs. repo directly in workdir." - } - ], - "argline": "git_repository **out, const git_submodule *sm, int use_gitlink", - "sig": "git_repository **::const git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure." - }, - "description": "

Set up the subrepository for a submodule in preparation for clone.

\n", - "comments": "

This function can be called to init and set up a submodule repository from a submodule in preparation to clone it from its remote.

\n", - "group": "submodule" - }, - "git_submodule_sync": { - "type": "function", - "file": "git2/submodule.h", - "line": 593, - "lineto": 593, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": null - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Copy submodule remote info into submodule repo.

\n", - "comments": "

This copies the information about the submodules URL into the checked out submodule config, acting like "git submodule sync". This is useful if you have altered the URL for the submodule (or it has been altered by a fetch of upstream changes) and you need to update your local repo.

\n", - "group": "submodule" - }, - "git_submodule_open": { - "type": "function", - "file": "git2/submodule.h", - "line": 607, - "lineto": 609, - "args": [ - { - "name": "repo", - "type": "git_repository **", - "comment": "Pointer to the submodule repo which was opened" - }, - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule to be opened" - } - ], - "argline": "git_repository **repo, git_submodule *submodule", - "sig": "git_repository **::git_submodule *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 if submodule repo could not be opened." - }, - "description": "

Open the repository for a submodule.

\n", - "comments": "

This is a newly opened repository object. The caller is responsible for calling git_repository_free() on it when done. Multiple calls to this function will return distinct git_repository objects. This will only work if the submodule is checked out into the working directory.

\n", - "group": "submodule" - }, - "git_submodule_reload": { - "type": "function", - "file": "git2/submodule.h", - "line": 621, - "lineto": 621, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to reload" - }, - { - "name": "force", - "type": "int", - "comment": "Force reload even if the data doesn't seem out of date" - } - ], - "argline": "git_submodule *submodule, int force", - "sig": "git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Reread submodule info from config, index, and HEAD.

\n", - "comments": "

Call this to reread cached submodule information for this submodule if you have reason to believe that it has changed.

\n", - "group": "submodule" - }, - "git_submodule_status": { - "type": "function", - "file": "git2/submodule.h", - "line": 637, - "lineto": 641, - "args": [ - { - "name": "status", - "type": "unsigned int *", - "comment": "Combination of `GIT_SUBMODULE_STATUS` flags" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the submodule" - }, - { - "name": "ignore", - "type": "git_submodule_ignore_t", - "comment": "the ignore rules to follow" - } - ], - "argline": "unsigned int *status, git_repository *repo, const char *name, git_submodule_ignore_t ignore", - "sig": "unsigned int *::git_repository *::const char *::git_submodule_ignore_t", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Get the status for a submodule.

\n", - "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.3.1/status.html#git_submodule_status-22" - ] - } - }, - "git_submodule_location": { - "type": "function", - "file": "git2/submodule.h", - "line": 657, - "lineto": 659, - "args": [ - { - "name": "location_status", - "type": "unsigned int *", - "comment": "Combination of first four `GIT_SUBMODULE_STATUS` flags" - }, - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule for which to get status" - } - ], - "argline": "unsigned int *location_status, git_submodule *submodule", - "sig": "unsigned int *::git_submodule *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Get the locations of submodule information.

\n", - "comments": "

This is a bit like a very lightweight version of git_submodule_status. It just returns a made of the first four submodule status values (i.e. the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). This can be useful if you want to know if the submodule is present in the working directory at this point in time, etc.

\n", - "group": "submodule" - }, - "git_tag_lookup": { - "type": "function", - "file": "git2/tag.h", - "line": 33, - "lineto": 34, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "pointer to the looked up tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tag." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tag to locate." - } - ], - "argline": "git_tag **out, git_repository *repo, const git_oid *id", - "sig": "git_tag **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tag object from the repository.

\n", - "comments": "", - "group": "tag", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_tag_lookup-83" - ] - } - }, - "git_tag_lookup_prefix": { - "type": "function", - "file": "git2/tag.h", - "line": 48, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "pointer to the looked up tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tag." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tag to locate." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_tag **out, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_tag **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n", - "comments": "", - "group": "tag" - }, - "git_tag_free": { - "type": "function", - "file": "git2/tag.h", - "line": 61, - "lineto": 61, - "args": [ - { - "name": "tag", - "type": "git_tag *", - "comment": "the tag to close" - } - ], - "argline": "git_tag *tag", - "sig": "git_tag *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open tag

\n", - "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", - "group": "tag", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_tag_free-84" - ] - } - }, - "git_tag_id": { - "type": "function", - "file": "git2/tag.h", - "line": 69, - "lineto": 69, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_oid *", - "comment": " object identity for the tag." - }, - "description": "

Get the id of a tag.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_owner": { - "type": "function", - "file": "git2/tag.h", - "line": 77, - "lineto": 77, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "A previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this tag." - }, - "description": "

Get the repository that contains the tag.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_target": { - "type": "function", - "file": "git2/tag.h", - "line": 89, - "lineto": 89, - "args": [ - { - "name": "target_out", - "type": "git_object **", - "comment": "pointer where to store the target" - }, - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "git_object **target_out, const git_tag *tag", - "sig": "git_object **::const git_tag *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the tagged object of a tag

\n", - "comments": "

This method performs a repository lookup for the given object and returns it

\n", - "group": "tag", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_tag_target-85" - ] - } - }, - "git_tag_target_id": { - "type": "function", - "file": "git2/tag.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_oid *", - "comment": " pointer to the OID" - }, - "description": "

Get the OID of the tagged object of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tag_target_id-31" - ] - } - }, - "git_tag_target_type": { - "type": "function", - "file": "git2/tag.h", - "line": 105, - "lineto": 105, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "git_object_t", - "comment": " type of the tagged object" - }, - "description": "

Get the type of a tag's tagged object

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tag_target_type-32" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tag_target_type-86" - ] - } - }, - "git_tag_name": { - "type": "function", - "file": "git2/tag.h", - "line": 113, - "lineto": 113, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const char *", - "comment": " name of the tag" - }, - "description": "

Get the name of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tag_name-33" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tag_name-87" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_tag_name-16" - ] - } - }, - "git_tag_tagger": { - "type": "function", - "file": "git2/tag.h", - "line": 121, - "lineto": 121, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_signature *", - "comment": " reference to the tag's author or NULL when unspecified" - }, - "description": "

Get the tagger (author) of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tag_tagger-34" - ] - } - }, - "git_tag_message": { - "type": "function", - "file": "git2/tag.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const char *", - "comment": " message of the tag or NULL when unspecified" - }, - "description": "

Get the message of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tag_message-35", - "ex/v1.3.1/cat-file.html#git_tag_message-36" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tag_message-88" - ], - "tag.c": [ - "ex/v1.3.1/tag.html#git_tag_message-17" - ] - } - }, - "git_tag_create": { - "type": "function", - "file": "git2/tag.h", - "line": 171, - "lineto": 178, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the\n newly created tag. If the tag already exists, this parameter\n will be the oid of the existing tag, and the function will\n return a GIT_EEXISTS error code." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Object to which this tag points. This object\n must belong to the given `repo`." - }, - { - "name": "tagger", - "type": "const git_signature *", - "comment": "Signature of the tagger for this tag, and\n of the tagging time" - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this tag" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message, int force", - "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it" - }, - "description": "

Create a new tag in the repository from an object

\n", - "comments": "

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.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.3.1/tag.html#git_tag_create-18" - ] - } - }, - "git_tag_annotation_create": { - "type": "function", - "file": "git2/tag.h", - "line": 203, - "lineto": 209, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the\n newly created tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name for the tag" - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Object to which this tag points. This object\n must belong to the given `repo`." - }, - { - "name": "tagger", - "type": "const git_signature *", - "comment": "Signature of the tagger for this tag, and\n of the tagging time" - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this tag" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message", - "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Create a new tag in the object database pointing to a git_object

\n", - "comments": "

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n", - "group": "tag" - }, - "git_tag_create_from_buffer": { - "type": "function", - "file": "git2/tag.h", - "line": 220, - "lineto": 224, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the newly created tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the tag" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "Raw tag data" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing tags" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *buffer, int force", - "sig": "git_oid *::git_repository *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Create a new tag in the repository from a buffer

\n", - "comments": "", - "group": "tag" - }, - "git_tag_create_lightweight": { - "type": "function", - "file": "git2/tag.h", - "line": 256, - "lineto": 261, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the provided\n target object. If the tag already exists, this parameter\n will be filled with the oid of the existing pointed object\n and the function will return a GIT_EEXISTS error code." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the lightweight tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Object to which this tag points. This object\n must belong to the given `repo`." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, int force", - "sig": "git_oid *::git_repository *::const char *::const git_object *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object" - }, - "description": "

Create a new lightweight tag pointing at a target object

\n", - "comments": "

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.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.3.1/tag.html#git_tag_create_lightweight-19" - ] - } - }, - "git_tag_delete": { - "type": "function", - "file": "git2/tag.h", - "line": 276, - "lineto": 278, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where lives the tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name of the tag to be deleted;\n this name is validated for consistency." - } - ], - "argline": "git_repository *repo, const char *tag_name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Delete an existing tag reference.

\n", - "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.3.1/tag.html#git_tag_delete-20" - ] - } - }, - "git_tag_list": { - "type": "function", - "file": "git2/tag.h", - "line": 293, - "lineto": 295, - "args": [ - { - "name": "tag_names", - "type": "git_strarray *", - "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the tags" - } - ], - "argline": "git_strarray *tag_names, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Fill a list with all the tags in the Repository

\n", - "comments": "

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.

\n", - "group": "tag" - }, - "git_tag_list_match": { - "type": "function", - "file": "git2/tag.h", - "line": 315, - "lineto": 318, - "args": [ - { - "name": "tag_names", - "type": "git_strarray *", - "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" - }, - { - "name": "pattern", - "type": "const char *", - "comment": "Standard fnmatch pattern" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the tags" - } - ], - "argline": "git_strarray *tag_names, const char *pattern, git_repository *repo", - "sig": "git_strarray *::const char *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", - "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

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.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.3.1/tag.html#git_tag_list_match-21" - ] - } - }, - "git_tag_foreach": { - "type": "function", - "file": "git2/tag.h", - "line": 339, - "lineto": 342, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository" - }, - { - "name": "callback", - "type": "git_tag_foreach_cb", - "comment": "Callback function" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to callback data (optional)" - } - ], - "argline": "git_repository *repo, git_tag_foreach_cb callback, void *payload", - "sig": "git_repository *::git_tag_foreach_cb::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Call callback `cb' for each tag in the repository

\n", - "comments": "", - "group": "tag" - }, - "git_tag_peel": { - "type": "function", - "file": "git2/tag.h", - "line": 355, - "lineto": 357, - "args": [ - { - "name": "tag_target_out", - "type": "git_object **", - "comment": "Pointer to the peeled git_object" - }, - { - "name": "tag", - "type": "const git_tag *", - "comment": "The tag to be processed" - } - ], - "argline": "git_object **tag_target_out, const git_tag *tag", - "sig": "git_object **::const git_tag *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Recursively peel a tag until a non tag git_object is found

\n", - "comments": "

The retrieved tag_target object is owned by the repository and should be closed with the git_object_free method.

\n", - "group": "tag" - }, - "git_tag_dup": { - "type": "function", - "file": "git2/tag.h", - "line": 366, - "lineto": 366, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "Pointer to store the copy of the tag" - }, - { - "name": "source", - "type": "git_tag *", - "comment": "Original tag to copy" - } - ], - "argline": "git_tag **out, git_tag *source", - "sig": "git_tag **::git_tag *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an in-memory copy of a tag. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_name_is_valid": { - "type": "function", - "file": "git2/tag.h", - "line": 378, - "lineto": 378, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given tag name" - }, - { - "name": "name", - "type": "const char *", - "comment": "a tag name to test" - } - ], - "argline": "int *valid, const char *name", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Determine whether a tag name is valid, meaning that (when prefixed\n with refs/tags/) that it is a valid reference name, and that any\n additional tag name restrictions are imposed (eg, it cannot start\n with a -).

\n", - "comments": "", - "group": "tag" - }, - "git_trace_set": { - "type": "function", - "file": "git2/trace.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "level", - "type": "git_trace_level_t", - "comment": "Level to set tracing to" - }, - { - "name": "cb", - "type": "git_trace_cb", - "comment": "Function to call with trace data" - } - ], - "argline": "git_trace_level_t level, git_trace_cb cb", - "sig": "git_trace_level_t::git_trace_cb", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Sets the system tracing configuration to the specified level with the\n specified callback. When system events occur at a level equal to, or\n lower than, the given level they will be reported to the given callback.

\n", - "comments": "", - "group": "trace" - }, - "git_transaction_new": { - "type": "function", - "file": "git2/transaction.h", - "line": 32, - "lineto": 32, - "args": [ - { - "name": "out", - "type": "git_transaction **", - "comment": "the resulting transaction" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to lock" - } - ], - "argline": "git_transaction **out, git_repository *repo", - "sig": "git_transaction **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new transaction object

\n", - "comments": "

This does not lock anything, but sets up the transaction object to know from which repository to lock.

\n", - "group": "transaction" - }, - "git_transaction_lock_ref": { - "type": "function", - "file": "git2/transaction.h", - "line": 44, - "lineto": 44, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to lock" - } - ], - "argline": "git_transaction *tx, const char *refname", - "sig": "git_transaction *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error message" - }, - "description": "

Lock a reference

\n", - "comments": "

Lock the specified reference. This is the first step to updating a reference.

\n", - "group": "transaction" - }, - "git_transaction_set_target": { - "type": "function", - "file": "git2/transaction.h", - "line": 59, - "lineto": 59, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "reference to update" - }, - { - "name": "target", - "type": "const git_oid *", - "comment": "target to set the reference to" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to use in the reflog; pass NULL to read the identity from the config" - }, - { - "name": "msg", - "type": "const char *", - "comment": "message to use in the reflog" - } - ], - "argline": "git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg", - "sig": "git_transaction *::const char *::const git_oid *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Set the target of a reference

\n", - "comments": "

Set the target of the specified reference. This reference must be locked.

\n", - "group": "transaction" - }, - "git_transaction_set_symbolic_target": { - "type": "function", - "file": "git2/transaction.h", - "line": 74, - "lineto": 74, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "reference to update" - }, - { - "name": "target", - "type": "const char *", - "comment": "target to set the reference to" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to use in the reflog; pass NULL to read the identity from the config" - }, - { - "name": "msg", - "type": "const char *", - "comment": "message to use in the reflog" - } - ], - "argline": "git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg", - "sig": "git_transaction *::const char *::const char *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Set the target of a reference

\n", - "comments": "

Set the target of the specified reference. This reference must be locked.

\n", - "group": "transaction" - }, - "git_transaction_set_reflog": { - "type": "function", - "file": "git2/transaction.h", - "line": 87, - "lineto": 87, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference whose reflog to set" - }, - { - "name": "reflog", - "type": "const git_reflog *", - "comment": "the reflog as it should be written out" - } - ], - "argline": "git_transaction *tx, const char *refname, const git_reflog *reflog", - "sig": "git_transaction *::const char *::const git_reflog *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Set the reflog of a reference

\n", - "comments": "

Set the specified reference's reflog. If this is combined with setting the target, that update won't be written to the reflog.

\n", - "group": "transaction" - }, - "git_transaction_remove": { - "type": "function", - "file": "git2/transaction.h", - "line": 96, - "lineto": 96, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to remove" - } - ], - "argline": "git_transaction *tx, const char *refname", - "sig": "git_transaction *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Remove a reference

\n", - "comments": "", - "group": "transaction" - }, - "git_transaction_commit": { - "type": "function", - "file": "git2/transaction.h", - "line": 107, - "lineto": 107, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - } - ], - "argline": "git_transaction *tx", - "sig": "git_transaction *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Commit the changes from the transaction

\n", - "comments": "

Perform the changes that have been queued. The updates will be made one by one, and the first failure will stop the processing.

\n", - "group": "transaction" - }, - "git_transaction_free": { - "type": "function", - "file": "git2/transaction.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - } - ], - "argline": "git_transaction *tx", - "sig": "git_transaction *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the resources allocated by this transaction

\n", - "comments": "

If any references remain locked, they will be unlocked without any changes made to them.

\n", - "group": "transaction" - }, - "git_tree_lookup": { - "type": "function", - "file": "git2/tree.h", - "line": 32, - "lineto": 33, - "args": [ - { - "name": "out", - "type": "git_tree **", - "comment": "Pointer to the looked up tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repo to use when locating the tree." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "Identity of the tree to locate." - } - ], - "argline": "git_tree **out, git_repository *repo, const git_oid *id", - "sig": "git_tree **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tree object from the repository.

\n", - "comments": "", - "group": "tree", - "examples": { - "commit.c": [ - "ex/v1.3.1/commit.html#git_tree_lookup-10" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tree_lookup-89", - "ex/v1.3.1/general.html#git_tree_lookup-90" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_tree_lookup-12" - ], - "merge.c": [ - "ex/v1.3.1/merge.html#git_tree_lookup-37" - ] - } - }, - "git_tree_lookup_prefix": { - "type": "function", - "file": "git2/tree.h", - "line": 47, - "lineto": 51, - "args": [ - { - "name": "out", - "type": "git_tree **", - "comment": "pointer to the looked up tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tree." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tree to locate." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_tree **out, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_tree **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tree object from the repository,\n given a prefix of its identifier (short id).

\n", - "comments": "", - "group": "tree" - }, - "git_tree_free": { - "type": "function", - "file": "git2/tree.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "tree", - "type": "git_tree *", - "comment": "The tree to close" - } - ], - "argline": "git_tree *tree", - "sig": "git_tree *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open tree

\n", - "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", - "group": "tree", - "examples": { - "commit.c": [ - "ex/v1.3.1/commit.html#git_tree_free-11" - ], - "diff.c": [ - "ex/v1.3.1/diff.html#git_tree_free-18", - "ex/v1.3.1/diff.html#git_tree_free-19" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tree_free-91", - "ex/v1.3.1/general.html#git_tree_free-92" - ], - "init.c": [ - "ex/v1.3.1/init.html#git_tree_free-13" - ], - "log.c": [ - "ex/v1.3.1/log.html#git_tree_free-55", - "ex/v1.3.1/log.html#git_tree_free-56", - "ex/v1.3.1/log.html#git_tree_free-57", - "ex/v1.3.1/log.html#git_tree_free-58", - "ex/v1.3.1/log.html#git_tree_free-59" - ] - } - }, - "git_tree_id": { - "type": "function", - "file": "git2/tree.h", - "line": 71, - "lineto": 71, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - } - ], - "argline": "const git_tree *tree", - "sig": "const git_tree *", - "return": { - "type": "const git_oid *", - "comment": " object identity for the tree." - }, - "description": "

Get the id of a tree.

\n", - "comments": "", - "group": "tree" - }, - "git_tree_owner": { - "type": "function", - "file": "git2/tree.h", - "line": 79, - "lineto": 79, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "A previously loaded tree." - } - ], - "argline": "const git_tree *tree", - "sig": "const git_tree *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this tree." - }, - "description": "

Get the repository that contains the tree.

\n", - "comments": "", - "group": "tree" - }, - "git_tree_entrycount": { - "type": "function", - "file": "git2/tree.h", - "line": 87, - "lineto": 87, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - } - ], - "argline": "const git_tree *tree", - "sig": "const git_tree *", - "return": { - "type": "size_t", - "comment": " the number of entries in the tree" - }, - "description": "

Get the number of entries listed in a tree

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tree_entrycount-37" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tree_entrycount-93" - ] - } - }, - "git_tree_entry_byname": { - "type": "function", - "file": "git2/tree.h", - "line": 99, - "lineto": 100, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - }, - { - "name": "filename", - "type": "const char *", - "comment": "the filename of the desired entry" - } - ], - "argline": "const git_tree *tree, const char *filename", - "sig": "const git_tree *::const char *", - "return": { - "type": "const git_tree_entry *", - "comment": " the tree entry; NULL if not found" - }, - "description": "

Lookup a tree entry by its filename

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", - "group": "tree", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_tree_entry_byname-94" - ] - } - }, - "git_tree_entry_byindex": { - "type": "function", - "file": "git2/tree.h", - "line": 112, - "lineto": 113, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - }, - { - "name": "idx", - "type": "size_t", - "comment": "the position in the entry list" - } - ], - "argline": "const git_tree *tree, size_t idx", - "sig": "const git_tree *::size_t", - "return": { - "type": "const git_tree_entry *", - "comment": " the tree entry; NULL if not found" - }, - "description": "

Lookup a tree entry by its position in the tree

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tree_entry_byindex-38" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tree_entry_byindex-95" - ] - } - }, - "git_tree_entry_byid": { - "type": "function", - "file": "git2/tree.h", - "line": 127, - "lineto": 128, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the sha being looked for" - } - ], - "argline": "const git_tree *tree, const git_oid *id", - "sig": "const git_tree *::const git_oid *", - "return": { - "type": "const git_tree_entry *", - "comment": " the tree entry; NULL if not found" - }, - "description": "

Lookup a tree entry by SHA value.

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", - "group": "tree" - }, - "git_tree_entry_bypath": { - "type": "function", - "file": "git2/tree.h", - "line": 142, - "lineto": 145, - "args": [ - { - "name": "out", - "type": "git_tree_entry **", - "comment": "Pointer where to store the tree entry" - }, - { - "name": "root", - "type": "const git_tree *", - "comment": "Previously loaded tree which is the root of the relative path" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to the contained entry" - } - ], - "argline": "git_tree_entry **out, const git_tree *root, const char *path", - "sig": "git_tree_entry **::const git_tree *::const char *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if the path does not exist" - }, - "description": "

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n", - "comments": "

Unlike the other lookup functions, the returned tree entry is owned by the user and must be freed explicitly with git_tree_entry_free().

\n", - "group": "tree" - }, - "git_tree_entry_dup": { - "type": "function", - "file": "git2/tree.h", - "line": 157, - "lineto": 157, - "args": [ - { - "name": "dest", - "type": "git_tree_entry **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "const git_tree_entry *", - "comment": "tree entry to duplicate" - } - ], - "argline": "git_tree_entry **dest, const git_tree_entry *source", - "sig": "git_tree_entry **::const git_tree_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Duplicate a tree entry

\n", - "comments": "

Create a copy of a tree entry. The returned copy is owned by the user, and must be freed explicitly with git_tree_entry_free().

\n", - "group": "tree" - }, - "git_tree_entry_free": { - "type": "function", - "file": "git2/tree.h", - "line": 168, - "lineto": 168, - "args": [ - { - "name": "entry", - "type": "git_tree_entry *", - "comment": "The entry to free" - } - ], - "argline": "git_tree_entry *entry", - "sig": "git_tree_entry *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a user-owned tree entry

\n", - "comments": "

IMPORTANT: This function is only needed for tree entries owned by the user, such as the ones returned by git_tree_entry_dup() or git_tree_entry_bypath().

\n", - "group": "tree" - }, - "git_tree_entry_name": { - "type": "function", - "file": "git2/tree.h", - "line": 176, - "lineto": 176, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "const char *", - "comment": " the name of the file" - }, - "description": "

Get the filename of a tree entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tree_entry_name-39" - ], - "general.c": [ - "ex/v1.3.1/general.html#git_tree_entry_name-96", - "ex/v1.3.1/general.html#git_tree_entry_name-97" - ] - } - }, - "git_tree_entry_id": { - "type": "function", - "file": "git2/tree.h", - "line": 184, - "lineto": 184, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "const git_oid *", - "comment": " the oid of the object" - }, - "description": "

Get the id of the object pointed by the entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tree_entry_id-40" - ] - } - }, - "git_tree_entry_type": { - "type": "function", - "file": "git2/tree.h", - "line": 192, - "lineto": 192, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "git_object_t", - "comment": " the type of the pointed object" - }, - "description": "

Get the type of the object pointed by the entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tree_entry_type-41" - ] - } - }, - "git_tree_entry_filemode": { - "type": "function", - "file": "git2/tree.h", - "line": 200, - "lineto": 200, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "git_filemode_t", - "comment": " filemode as an integer" - }, - "description": "

Get the UNIX file attributes of a tree entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.3.1/cat-file.html#git_tree_entry_filemode-42" - ] - } - }, - "git_tree_entry_filemode_raw": { - "type": "function", - "file": "git2/tree.h", - "line": 212, - "lineto": 212, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "git_filemode_t", - "comment": " filemode as an integer" - }, - "description": "

Get the raw UNIX file attributes of a tree entry

\n", - "comments": "

This function does not perform any normalization and is only useful if you need to be able to recreate the original tree object.

\n", - "group": "tree" - }, - "git_tree_entry_cmp": { - "type": "function", - "file": "git2/tree.h", - "line": 220, - "lineto": 220, - "args": [ - { - "name": "e1", - "type": "const git_tree_entry *", - "comment": "first tree entry" - }, - { - "name": "e2", - "type": "const git_tree_entry *", - "comment": "second tree entry" - } - ], - "argline": "const git_tree_entry *e1, const git_tree_entry *e2", - "sig": "const git_tree_entry *::const git_tree_entry *", - "return": { - "type": "int", - "comment": " \n<\n0 if e1 is before e2, 0 if e1 == e2, >0 if e1 is after e2" - }, - "description": "

Compare two tree entries

\n", - "comments": "", - "group": "tree" - }, - "git_tree_entry_to_object": { - "type": "function", - "file": "git2/tree.h", - "line": 232, - "lineto": 235, - "args": [ - { - "name": "object_out", - "type": "git_object **", - "comment": "pointer to the converted object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to lookup the pointed object" - }, - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "git_object **object_out, git_repository *repo, const git_tree_entry *entry", - "sig": "git_object **::git_repository *::const git_tree_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Convert a tree entry to the git_object it points to.

\n", - "comments": "

You must call git_object_free() on the object when you are done with it.

\n", - "group": "tree", - "examples": { - "general.c": [ - "ex/v1.3.1/general.html#git_tree_entry_to_object-98" - ] - } - }, - "git_treebuilder_new": { - "type": "function", - "file": "git2/tree.h", - "line": 254, - "lineto": 255, - "args": [ - { - "name": "out", - "type": "git_treebuilder **", - "comment": "Pointer where to store the tree builder" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository in which to store the object" - }, - { - "name": "source", - "type": "const git_tree *", - "comment": "Source tree to initialize the builder (optional)" - } - ], - "argline": "git_treebuilder **out, git_repository *repo, const git_tree *source", - "sig": "git_treebuilder **::git_repository *::const git_tree *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Create a new tree builder.

\n", - "comments": "

The tree builder can be used to create or modify trees in memory and write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no entries and will have to be filled manually.

\n", - "group": "treebuilder" - }, - "git_treebuilder_clear": { - "type": "function", - "file": "git2/tree.h", - "line": 263, - "lineto": 263, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Builder to clear" - } - ], - "argline": "git_treebuilder *bld", - "sig": "git_treebuilder *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Clear all the entires in the builder

\n", - "comments": "", - "group": "treebuilder" - }, - "git_treebuilder_entrycount": { - "type": "function", - "file": "git2/tree.h", - "line": 271, - "lineto": 271, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "a previously loaded treebuilder." - } - ], - "argline": "git_treebuilder *bld", - "sig": "git_treebuilder *", - "return": { - "type": "size_t", - "comment": " the number of entries in the treebuilder" - }, - "description": "

Get the number of entries listed in a treebuilder

\n", - "comments": "", - "group": "treebuilder" - }, - "git_treebuilder_free": { - "type": "function", - "file": "git2/tree.h", - "line": 282, - "lineto": 282, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Builder to free" - } - ], - "argline": "git_treebuilder *bld", - "sig": "git_treebuilder *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a tree builder

\n", - "comments": "

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

\n", - "group": "treebuilder" - }, - "git_treebuilder_get": { - "type": "function", - "file": "git2/tree.h", - "line": 294, - "lineto": 295, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filename", - "type": "const char *", - "comment": "Name of the entry" - } - ], - "argline": "git_treebuilder *bld, const char *filename", - "sig": "git_treebuilder *::const char *", - "return": { - "type": "const git_tree_entry *", - "comment": " pointer to the entry; NULL if not found" - }, - "description": "

Get an entry from the builder from its filename

\n", - "comments": "

The returned entry is owned by the builder and should not be freed manually.

\n", - "group": "treebuilder" - }, - "git_treebuilder_insert": { - "type": "function", - "file": "git2/tree.h", - "line": 325, - "lineto": 330, - "args": [ - { - "name": "out", - "type": "const git_tree_entry **", - "comment": "Pointer to store the entry (optional)" - }, - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filename", - "type": "const char *", - "comment": "Filename of the entry" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "SHA1 oid of the entry" - }, - { - "name": "filemode", - "type": "git_filemode_t", - "comment": "Folder attributes of the entry. This parameter must\n\t\t\tbe valued with one of the following entries: 0040000, 0100644,\n\t\t\t0100755, 0120000 or 0160000." - } - ], - "argline": "const git_tree_entry **out, git_treebuilder *bld, const char *filename, const git_oid *id, git_filemode_t filemode", - "sig": "const git_tree_entry **::git_treebuilder *::const char *::const git_oid *::git_filemode_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an entry to the builder

\n", - "comments": "

Insert a new entry for filename in the builder with the given attributes.

\n\n

If an entry named filename already exists, its attributes will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the newly created/updated entry. Pass NULL if you do not need it. The pointer may not be valid past the next operation in this builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for validity; that it exists in the object database and is of the correct type. If you do not want this behavior, set the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", - "group": "treebuilder" - }, - "git_treebuilder_remove": { - "type": "function", - "file": "git2/tree.h", - "line": 339, - "lineto": 340, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filename", - "type": "const char *", - "comment": "Filename of the entry to remove" - } - ], - "argline": "git_treebuilder *bld, const char *filename", - "sig": "git_treebuilder *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove an entry from the builder by its filename

\n", - "comments": "", - "group": "treebuilder" - }, - "git_treebuilder_filter": { - "type": "function", - "file": "git2/tree.h", - "line": 364, - "lineto": 367, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filter", - "type": "git_treebuilder_filter_cb", - "comment": "Callback to filter entries" - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra data to pass to filter callback" - } - ], - "argline": "git_treebuilder *bld, git_treebuilder_filter_cb filter, void *payload", - "sig": "git_treebuilder *::git_treebuilder_filter_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Selectively remove entries in the tree

\n", - "comments": "

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 non-zero, the entry will be filtered (removed from the builder).

\n", - "group": "treebuilder" - }, - "git_treebuilder_write": { - "type": "function", - "file": "git2/tree.h", - "line": 379, - "lineto": 380, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "Pointer to store the OID of the newly written tree" - }, - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder to write" - } - ], - "argline": "git_oid *id, git_treebuilder *bld", - "sig": "git_oid *::git_treebuilder *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write the contents of the tree builder as a tree object

\n", - "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", - "group": "treebuilder" - }, - "git_tree_walk": { - "type": "function", - "file": "git2/tree.h", - "line": 409, - "lineto": 413, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "The tree to walk" - }, - { - "name": "mode", - "type": "git_treewalk_mode", - "comment": "Traversal mode (pre or post-order)" - }, - { - "name": "callback", - "type": "git_treewalk_cb", - "comment": "Function to call on each tree entry" - }, - { - "name": "payload", - "type": "void *", - "comment": "Opaque pointer to be passed on each callback" - } - ], - "argline": "const git_tree *tree, git_treewalk_mode mode, git_treewalk_cb callback, void *payload", - "sig": "const git_tree *::git_treewalk_mode::git_treewalk_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Traverse the entries in a tree and its subtrees in post or pre order.

\n", - "comments": "

The entries will be traversed in the specified order, children subtrees will be automatically loaded as required, and the callback will be called once per entry with the current (relative) root for the entry and the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be skipped on the traversal (in pre mode). A negative value stops the walk.

\n", - "group": "tree" - }, - "git_tree_dup": { - "type": "function", - "file": "git2/tree.h", - "line": 422, - "lineto": 422, - "args": [ - { - "name": "out", - "type": "git_tree **", - "comment": "Pointer to store the copy of the tree" - }, - { - "name": "source", - "type": "git_tree *", - "comment": "Original tree to copy" - } - ], - "argline": "git_tree **out, git_tree *source", - "sig": "git_tree **::git_tree *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an in-memory copy of a tree. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "tree" - }, - "git_tree_create_updated": { - "type": "function", - "file": "git2/tree.h", - "line": 469, - "lineto": 469, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "id of the new tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the tree, must be the\n same as for `baseline`" - }, - { - "name": "baseline", - "type": "git_tree *", - "comment": "the tree to base these changes on" - }, - { - "name": "nupdates", - "type": "size_t", - "comment": "the number of elements in the update list" - }, - { - "name": "updates", - "type": "const git_tree_update *", - "comment": "the list of updates to perform" - } - ], - "argline": "git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates", - "sig": "git_oid *::git_repository *::git_tree *::size_t::const git_tree_update *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a tree based on another one with the specified modifications

\n", - "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", - "group": "tree" - }, - "git_worktree_list": { - "type": "function", - "file": "git2/worktree.h", - "line": 34, - "lineto": 34, - "args": [ - { - "name": "out", - "type": "git_strarray *", - "comment": "pointer to the array of working tree names" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when listing working trees" - } - ], - "argline": "git_strarray *out, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

List names of linked working trees

\n", - "comments": "

The returned list should be released with git_strarray_free when no longer needed.

\n", - "group": "worktree" - }, - "git_worktree_lookup": { - "type": "function", - "file": "git2/worktree.h", - "line": 44, - "lineto": 44, - "args": [ - { - "name": "out", - "type": "git_worktree **", - "comment": "Output pointer to looked up worktree or `NULL`" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing worktrees" - }, - { - "name": "name", - "type": "const char *", - "comment": "Name of the working tree to look up" - } - ], - "argline": "git_worktree **out, git_repository *repo, const char *name", - "sig": "git_worktree **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a working tree by its name for a given repository

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_open_from_repository": { - "type": "function", - "file": "git2/worktree.h", - "line": 56, - "lineto": 56, - "args": [ - { - "name": "out", - "type": "git_worktree **", - "comment": "Out-pointer for the newly allocated worktree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository to look up worktree for" - } - ], - "argline": "git_worktree **out, git_repository *repo", - "sig": "git_worktree **::git_repository *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Open a worktree of a given repository

\n", - "comments": "

If a repository is not the main tree but a worktree, this function will look up the worktree inside the parent repository and create a new git_worktree structure.

\n", - "group": "worktree" - }, - "git_worktree_free": { - "type": "function", - "file": "git2/worktree.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "worktree handle to close. If NULL nothing occurs." - } - ], - "argline": "git_worktree *wt", - "sig": "git_worktree *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a previously allocated worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_validate": { - "type": "function", - "file": "git2/worktree.h", - "line": 75, - "lineto": 75, - "args": [ - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to check" - } - ], - "argline": "const git_worktree *wt", - "sig": "const git_worktree *", - "return": { - "type": "int", - "comment": " 0 when worktree is valid, error-code otherwise" - }, - "description": "

Check if worktree is valid

\n", - "comments": "

A valid worktree requires both the git data structures inside the linked parent repository and the linked working copy to be present.

\n", - "group": "worktree" - }, - "git_worktree_add_options_init": { - "type": "function", - "file": "git2/worktree.h", - "line": 104, - "lineto": 105, - "args": [ - { - "name": "opts", - "type": "git_worktree_add_options *", - "comment": "The `git_worktree_add_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`." - } - ], - "argline": "git_worktree_add_options *opts, unsigned int version", - "sig": "git_worktree_add_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_worktree_add_options structure

\n", - "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", - "group": "worktree" - }, - "git_worktree_add": { - "type": "function", - "file": "git2/worktree.h", - "line": 121, - "lineto": 123, - "args": [ - { - "name": "out", - "type": "git_worktree **", - "comment": "Output pointer containing new working tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository to create working tree for" - }, - { - "name": "name", - "type": "const char *", - "comment": "Name of the working tree" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to create working tree at" - }, - { - "name": "opts", - "type": "const git_worktree_add_options *", - "comment": "Options to modify default behavior. May be NULL" - } - ], - "argline": "git_worktree **out, git_repository *repo, const char *name, const char *path, const git_worktree_add_options *opts", - "sig": "git_worktree **::git_repository *::const char *::const char *::const git_worktree_add_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a new working tree

\n", - "comments": "

Add a new working tree for the repository, that is create the required data structures inside the repository and check out the current HEAD at path

\n", - "group": "worktree" - }, - "git_worktree_lock": { - "type": "function", - "file": "git2/worktree.h", - "line": 135, - "lineto": 135, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "Worktree to lock" - }, - { - "name": "reason", - "type": "const char *", - "comment": "Reason why the working tree is being locked" - } - ], - "argline": "git_worktree *wt, const char *reason", - "sig": "git_worktree *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero otherwise" - }, - "description": "

Lock worktree if not already locked

\n", - "comments": "

Lock a worktree, optionally specifying a reason why the linked working tree is being locked.

\n", - "group": "worktree" - }, - "git_worktree_unlock": { - "type": "function", - "file": "git2/worktree.h", - "line": 144, - "lineto": 144, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "Worktree to unlock" - } - ], - "argline": "git_worktree *wt", - "sig": "git_worktree *", - "return": { - "type": "int", - "comment": " 0 on success, 1 if worktree was not locked, error-code\n otherwise" - }, - "description": "

Unlock a locked worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_is_locked": { - "type": "function", - "file": "git2/worktree.h", - "line": 158, - "lineto": 158, - "args": [ - { - "name": "reason", - "type": "git_buf *", - "comment": "Buffer to store reason in. If NULL no reason is stored." - }, - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to check" - } - ], - "argline": "git_buf *reason, const git_worktree *wt", - "sig": "git_buf *::const git_worktree *", - "return": { - "type": "int", - "comment": " 0 when the working tree not locked, a value greater\n than zero if it is locked, less than zero if there was an\n error" - }, - "description": "

Check if worktree is locked

\n", - "comments": "

A worktree may be locked if the linked working tree is stored on a portable device which is not available.

\n", - "group": "worktree" - }, - "git_worktree_name": { - "type": "function", - "file": "git2/worktree.h", - "line": 167, - "lineto": 167, - "args": [ - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to get the name for" - } - ], - "argline": "const git_worktree *wt", - "sig": "const git_worktree *", - "return": { - "type": "const char *", - "comment": " The worktree's name. The pointer returned is valid for the\n lifetime of the git_worktree" - }, - "description": "

Retrieve the name of the worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_path": { - "type": "function", - "file": "git2/worktree.h", - "line": 176, - "lineto": 176, - "args": [ - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to get the path for" - } - ], - "argline": "const git_worktree *wt", - "sig": "const git_worktree *", - "return": { - "type": "const char *", - "comment": " The worktree's filesystem path. The pointer returned\n is valid for the lifetime of the git_worktree." - }, - "description": "

Retrieve the filesystem path for the worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_prune_options_init": { - "type": "function", - "file": "git2/worktree.h", - "line": 218, - "lineto": 220, - "args": [ - { - "name": "opts", - "type": "git_worktree_prune_options *", - "comment": "The `git_worktree_prune_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_WORKTREE_PRUNE_OPTIONS_VERSION`." - } - ], - "argline": "git_worktree_prune_options *opts, unsigned int version", - "sig": "git_worktree_prune_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_worktree_prune_options structure

\n", - "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", - "group": "worktree" - }, - "git_worktree_is_prunable": { - "type": "function", - "file": "git2/worktree.h", - "line": 236, - "lineto": 237, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": null - }, - { - "name": "opts", - "type": "git_worktree_prune_options *", - "comment": null - } - ], - "argline": "git_worktree *wt, git_worktree_prune_options *opts", - "sig": "git_worktree *::git_worktree_prune_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Is the worktree prunable with the given options?

\n", - "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The valid member will cause this check to be ignored. - the worktree is locked. The locked flag will cause this check to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above flags have been passed in, this function will return a positive value.

\n", - "group": "worktree" - }, - "git_worktree_prune": { - "type": "function", - "file": "git2/worktree.h", - "line": 251, - "lineto": 252, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "Worktree to prune" - }, - { - "name": "opts", - "type": "git_worktree_prune_options *", - "comment": "Specifies which checks to override. See\n `git_worktree_is_prunable`. May be NULL" - } - ], - "argline": "git_worktree *wt, git_worktree_prune_options *opts", - "sig": "git_worktree *::git_worktree_prune_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Prune working tree

\n", - "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", - "group": "worktree" - } - }, - "callbacks": { - "git_apply_delta_cb": { - "type": "callback", - "file": "git2/apply.h", - "line": 36, - "lineto": 38, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": "The delta to be applied" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified payload" - } - ], - "argline": "const git_diff_delta *delta, void *payload", - "sig": "const git_diff_delta *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When applying a patch, callback that will be made per delta (file).

\n", - "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the delta will not be applied, but the apply process continues - returns 0, the delta is applied, and the apply process continues.

\n" - }, - "git_apply_hunk_cb": { - "type": "callback", - "file": "git2/apply.h", - "line": 52, - "lineto": 54, - "args": [ - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": "The hunk to be applied" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified payload" - } - ], - "argline": "const git_diff_hunk *hunk, void *payload", - "sig": "const git_diff_hunk *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When applying a patch, callback that will be made per hunk.

\n", - "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n" - }, - "git_attr_foreach_cb": { - "type": "callback", - "file": "git2/attr.h", - "line": 287, - "lineto": 287, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The attribute name." - }, - { - "name": "value", - "type": "const char *", - "comment": "The attribute value. May be NULL if the attribute is explicitly\n set to UNSPECIFIED using the '!' sign." - }, - { - "name": "payload", - "type": "void *", - "comment": "A user-specified pointer." - } - ], - "argline": "const char *name, const char *value, void *payload", - "sig": "const char *::const char *::void *", - "return": { - "type": "int", - "comment": " 0 to continue looping, non-zero to stop. This value will be returned\n from git_attr_foreach." - }, - "description": "

The callback used with git_attr_foreach.

\n", - "comments": "

This callback will be invoked only once per attribute name, even if there are multiple rules for a given file. The highest priority rule will be used.

\n" - }, - "git_transport_certificate_check_cb": { - "type": "callback", - "file": "git2/cert.h", - "line": 72, - "lineto": 72, - "args": [ - { - "name": "cert", - "type": "git_cert *", - "comment": "The host certificate" - }, - { - "name": "valid", - "type": "int", - "comment": "Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid" - }, - { - "name": "host", - "type": "const char *", - "comment": "Hostname of the host libgit2 connected to" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "git_cert *cert, int valid, const char *host, void *payload", - "sig": "git_cert *::int::const char *::void *", - "return": { - "type": "int", - "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" - }, - "description": "

Callback for the user's custom certificate checks.

\n", - "comments": "" - }, - "git_checkout_notify_cb": { - "type": "callback", - "file": "git2/checkout.h", - "line": 252, - "lineto": 258, - "args": [ - { - "name": "why", - "type": "git_checkout_notify_t", - "comment": null - }, - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "baseline", - "type": "const git_diff_file *", - "comment": null - }, - { - "name": "target", - "type": "const git_diff_file *", - "comment": null - }, - { - "name": "workdir", - "type": "const git_diff_file *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload", - "sig": "git_checkout_notify_t::const char *::const git_diff_file *::const git_diff_file *::const git_diff_file *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Checkout notification callback function

\n", - "comments": "" - }, - "git_checkout_progress_cb": { - "type": "callback", - "file": "git2/checkout.h", - "line": 261, - "lineto": 265, - "args": [ - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "completed_steps", - "type": "size_t", - "comment": null - }, - { - "name": "total_steps", - "type": "size_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *path, size_t completed_steps, size_t total_steps, void *payload", - "sig": "const char *::size_t::size_t::void *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Checkout progress notification function

\n", - "comments": "" - }, - "git_checkout_perfdata_cb": { - "type": "callback", - "file": "git2/checkout.h", - "line": 268, - "lineto": 270, - "args": [ - { - "name": "perfdata", - "type": "const git_checkout_perfdata *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_checkout_perfdata *perfdata, void *payload", - "sig": "const git_checkout_perfdata *::void *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Checkout perfdata notification function

\n", - "comments": "" - }, - "git_remote_create_cb": { - "type": "callback", - "file": "git2/clone.h", - "line": 69, - "lineto": 74, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the remote" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - }, - { - "name": "payload", - "type": "void *", - "comment": "an opaque payload" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, void *payload", - "sig": "git_remote **::git_repository *::const char *::const char *::void *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n", - "comments": "

Callers of git_clone may provide a function matching this signature to override the remote creation and customization process during a clone operation.

\n" - }, - "git_repository_create_cb": { - "type": "callback", - "file": "git2/clone.h", - "line": 90, - "lineto": 94, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "the resulting repository" - }, - { - "name": "path", - "type": "const char *", - "comment": "path in which to create the repository" - }, - { - "name": "bare", - "type": "int", - "comment": "whether the repository is bare. This is the value from the clone options" - }, - { - "name": "payload", - "type": "void *", - "comment": "payload specified by the options" - } - ], - "argline": "git_repository **out, const char *path, int bare, void *payload", - "sig": "git_repository **::const char *::int::void *", - "return": { - "type": "int", - "comment": " 0, or a negative value to indicate error" - }, - "description": "

The signature of a function matchin git_repository_init, with an\n aditional void * as callback payload.

\n", - "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" - }, - "git_commit_create_cb": { - "type": "callback", - "file": "git2/commit.h", - "line": 531, - "lineto": 540, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer that this callback will populate with the object\n id of the commit that is created" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "the author name and time of the commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "the committer name and time of the commit" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "the encoding of the given message, or NULL\n to assume UTF8" - }, - { - "name": "message", - "type": "const char *", - "comment": "the commit message" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "the tree to be committed" - }, - { - "name": "parent_count", - "type": "size_t", - "comment": "the number of parents for this commit" - }, - { - "name": "parents", - "type": "const git_commit *[]", - "comment": "the commit parents" - }, - { - "name": "payload", - "type": "void *", - "comment": "the payload pointer in the rebase options" - } - ], - "argline": "git_oid *out, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents, void *payload", - "sig": "git_oid *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]::void *", - "return": { - "type": "int", - "comment": " 0 if this callback has created the commit and populated the out\n parameter, GIT_PASSTHROUGH if the callback has not created a\n commit and wants the calling function to create the commit as\n if no callback had been specified, any other value to stop\n and return a failure" - }, - "description": "

Commit creation callback: used when a function is going to create\n commits (for example, in git_rebase_commit) to allow callers to\n override the commit creation behavior. For example, users may\n wish to sign commits by providing this information to\n git_commit_create_buffer, signing that buffer, then calling\n git_commit_create_with_signature. The resultant commit id\n should be set in the out object id parameter.

\n", - "comments": "" - }, - "git_config_foreach_cb": { - "type": "callback", - "file": "git2/config.h", - "line": 84, - "lineto": 84, - "args": [ - { - "name": "entry", - "type": "const git_config_entry *", - "comment": "the entry currently being enumerated" - }, - { - "name": "payload", - "type": "void *", - "comment": "a user-specified pointer" - } - ], - "argline": "const git_config_entry *entry, void *payload", - "sig": "const git_config_entry *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

A config enumeration callback

\n", - "comments": "" - }, - "git_credential_acquire_cb": { - "type": "callback", - "file": "git2/credential.h", - "line": 131, - "lineto": 136, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "url", - "type": "const char *", - "comment": "The resource for which we are demanding a credential." - }, - { - "name": "username_from_url", - "type": "const char *", - "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." - }, - { - "name": "allowed_types", - "type": "unsigned int", - "comment": "A bitmask stating which credential types are OK to return." - }, - { - "name": "payload", - "type": "void *", - "comment": "The payload provided when specifying this callback." - } - ], - "argline": "git_credential **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", - "sig": "git_credential **::const char *::const char *::unsigned int::void *", - "return": { - "type": "int", - "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" - }, - "description": "

Credential acquisition callback.

\n", - "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" - }, - "git_commit_signing_cb": { - "type": "callback", - "file": "git2/deprecated.h", - "line": 276, - "lineto": 280, - "args": [ - { - "name": "signature", - "type": "git_buf *", - "comment": null - }, - { - "name": "signature_field", - "type": "git_buf *", - "comment": null - }, - { - "name": "commit_content", - "type": "const char *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", - "sig": "git_buf *::git_buf *::const char *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Provide a commit signature during commit creation.

\n", - "comments": "

Callers should instead define a git_commit_create_cb that generates a commit buffer using git_commit_create_buffer, sign that buffer and call git_commit_create_with_signature.

\n" - }, - "git_headlist_cb": { - "type": "callback", - "file": "git2/deprecated.h", - "line": 847, - "lineto": 847, - "args": [ - { - "name": "rhead", - "type": "git_remote_head *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_remote_head *rhead, void *payload", - "sig": "git_remote_head *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for listing the remote heads

\n", - "comments": "" - }, - "git_diff_notify_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 345, - "lineto": 349, - "args": [ - { - "name": "diff_so_far", - "type": "const git_diff *", - "comment": null - }, - { - "name": "delta_to_add", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "matched_pathspec", - "type": "const char *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff *diff_so_far, const git_diff_delta *delta_to_add, const char *matched_pathspec, void *payload", - "sig": "const git_diff *::const git_diff_delta *::const char *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Diff notification callback function.

\n", - "comments": "

The callback will be called for each file, just before the git_diff_delta gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" - }, - "git_diff_progress_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 361, - "lineto": 365, - "args": [ - { - "name": "diff_so_far", - "type": "const git_diff *", - "comment": "The diff being generated." - }, - { - "name": "old_path", - "type": "const char *", - "comment": "The path to the old file or NULL." - }, - { - "name": "new_path", - "type": "const char *", - "comment": "The path to the new file or NULL." - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff *diff_so_far, const char *old_path, const char *new_path, void *payload", - "sig": "const git_diff *::const char *::const char *::void *", - "return": { - "type": "int", - "comment": " Non-zero to abort the diff." - }, - "description": "

Diff progress callback.

\n", - "comments": "

Called before each file comparison.

\n" - }, - "git_diff_file_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 479, - "lineto": 482, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": "A pointer to the delta data for the file" - }, - { - "name": "progress", - "type": "float", - "comment": "Goes from 0 to 1 over the diff" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified pointer from foreach function" - } - ], - "argline": "const git_diff_delta *delta, float progress, void *payload", - "sig": "const git_diff_delta *::float::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made per file.

\n", - "comments": "" - }, - "git_diff_binary_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 545, - "lineto": 548, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "binary", - "type": "const git_diff_binary *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff_delta *delta, const git_diff_binary *binary, void *payload", - "sig": "const git_diff_delta *::const git_diff_binary *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made for\n binary content within the diff.

\n", - "comments": "" - }, - "git_diff_hunk_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 571, - "lineto": 574, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload", - "sig": "const git_diff_delta *::const git_diff_hunk *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made per hunk.

\n", - "comments": "" - }, - "git_diff_line_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 632, - "lineto": 636, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": null - }, - { - "name": "line", - "type": "const git_diff_line *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", - "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", - "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" - }, - "git_index_matched_path_cb": { - "type": "callback", - "file": "git2/index.h", - "line": 135, - "lineto": 136, - "args": [ - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "matched_pathspec", - "type": "const char *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *path, const char *matched_pathspec, void *payload", - "sig": "const char *::const char *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", - "comments": "" - }, - "git_indexer_progress_cb": { - "type": "callback", - "file": "git2/indexer.h", - "line": 57, - "lineto": 57, - "args": [ - { - "name": "stats", - "type": "const git_indexer_progress *", - "comment": "Structure containing information about the state of the transfer" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by caller" - } - ], - "argline": "const git_indexer_progress *stats, void *payload", - "sig": "const git_indexer_progress *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Type for progress callbacks during indexing. Return a value less\n than zero to cancel the indexing or download.

\n", - "comments": "" - }, - "git_note_foreach_cb": { - "type": "callback", - "file": "git2/notes.h", - "line": 29, - "lineto": 30, - "args": [ - { - "name": "blob_id", - "type": "const git_oid *", - "comment": null - }, - { - "name": "annotated_object_id", - "type": "const git_oid *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_oid *blob_id, const git_oid *annotated_object_id, void *payload", - "sig": "const git_oid *::const git_oid *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for git_note_foreach.

\n", - "comments": "

Receives: - blob_id: Oid of the blob containing the message - annotated_object_id: Oid of the git object being annotated - payload: Payload data passed to git_note_foreach

\n" - }, - "git_odb_foreach_cb": { - "type": "callback", - "file": "git2/odb.h", - "line": 28, - "lineto": 28, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_oid *id, void *payload", - "sig": "const git_oid *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Function type for callbacks from git_odb_foreach.

\n", - "comments": "" - }, - "git_packbuilder_foreach_cb": { - "type": "callback", - "file": "git2/pack.h", - "line": 192, - "lineto": 192, - "args": [ - { - "name": "buf", - "type": "void *", - "comment": "A pointer to the object's data" - }, - { - "name": "size", - "type": "size_t", - "comment": "The size of the underlying object" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_packbuilder_foreach" - } - ], - "argline": "void *buf, size_t size, void *payload", - "sig": "void *::size_t::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over packed objects

\n", - "comments": "" - }, - "git_packbuilder_progress": { - "type": "callback", - "file": "git2/pack.h", - "line": 221, - "lineto": 225, - "args": [ - { - "name": "stage", - "type": "int", - "comment": null - }, - { - "name": "current", - "type": "uint32_t", - "comment": null - }, - { - "name": "total", - "type": "uint32_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "int stage, uint32_t current, uint32_t total, void *payload", - "sig": "int::uint32_t::uint32_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Packbuilder progress notification function

\n", - "comments": "" - }, - "git_reference_foreach_cb": { - "type": "callback", - "file": "git2/refs.h", - "line": 437, - "lineto": 437, - "args": [ - { - "name": "reference", - "type": "git_reference *", - "comment": "The reference object" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_reference_foreach" - } - ], - "argline": "git_reference *reference, void *payload", - "sig": "git_reference *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over references

\n", - "comments": "" - }, - "git_reference_foreach_name_cb": { - "type": "callback", - "file": "git2/refs.h", - "line": 448, - "lineto": 448, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The reference name" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_reference_foreach_name" - } - ], - "argline": "const char *name, void *payload", - "sig": "const char *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over reference names

\n", - "comments": "" - }, - "git_push_transfer_progress_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 450, - "lineto": 454, - "args": [ - { - "name": "current", - "type": "unsigned int", - "comment": null - }, - { - "name": "total", - "type": "unsigned int", - "comment": null - }, - { - "name": "bytes", - "type": "size_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "unsigned int current, unsigned int total, size_t bytes, void *payload", - "sig": "unsigned int::unsigned int::size_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Push network progress notification function

\n", - "comments": "" - }, - "git_push_negotiation": { - "type": "callback", - "file": "git2/remote.h", - "line": 486, - "lineto": 486, - "args": [ - { - "name": "updates", - "type": "const git_push_update **", - "comment": "an array containing the updates which will be sent\n as commands to the destination." - }, - { - "name": "len", - "type": "size_t", - "comment": "number of elements in `updates`" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "const git_push_update **updates, size_t len, void *payload", - "sig": "const git_push_update **::size_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback used to inform of upcoming updates.

\n", - "comments": "" - }, - "git_push_update_reference_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 500, - "lineto": 500, - "args": [ - { - "name": "refname", - "type": "const char *", - "comment": "refname specifying to the remote ref" - }, - { - "name": "status", - "type": "const char *", - "comment": "status message sent from the remote" - }, - { - "name": "data", - "type": "void *", - "comment": "data provided by the caller" - } - ], - "argline": "const char *refname, const char *status, void *data", - "sig": "const char *::const char *::void *", - "return": { - "type": "int", - "comment": " 0 on success, otherwise an error" - }, - "description": "

Callback used to inform of the update status from the remote.

\n", - "comments": "

Called for each updated reference on push. If status is not NULL, the update was rejected by the remote server and status contains the reason given.

\n" - }, - "git_url_resolve_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 516, - "lineto": 516, - "args": [ - { - "name": "url_resolved", - "type": "git_buf *", - "comment": "The buffer to write the resolved URL to" - }, - { - "name": "url", - "type": "const char *", - "comment": "The URL to resolve" - }, - { - "name": "direction", - "type": "int", - "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "git_buf *url_resolved, const char *url, int direction, void *payload", - "sig": "git_buf *::const char *::int::void *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_PASSTHROUGH or an error\n " - }, - "description": "

Callback to resolve URLs before connecting to remote

\n", - "comments": "

If you return GIT_PASSTHROUGH, you don't need to write anything to url_resolved.

\n" - }, - "git_remote_ready_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 529, - "lineto": 529, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "The remote to be connected" - }, - { - "name": "direction", - "type": "int", - "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "git_remote *remote, int direction, void *payload", - "sig": "git_remote *::int::void *", - "return": { - "type": "int", - "comment": " 0 on success, or an error" - }, - "description": "

Callback invoked immediately before we attempt to connect to the\n given url. Callers may change the URL before the connection by\n calling git_remote_set_instance_url in the callback.

\n", - "comments": "" - }, - "git_repository_fetchhead_foreach_cb": { - "type": "callback", - "file": "git2/repository.h", - "line": 700, - "lineto": 704, - "args": [ - { - "name": "ref_name", - "type": "const char *", - "comment": "The reference name" - }, - { - "name": "remote_url", - "type": "const char *", - "comment": "The remote URL" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "The reference target OID" - }, - { - "name": "is_merge", - "type": "unsigned int", - "comment": "Was the reference the result of a merge" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_repository_fetchhead_foreach" - } - ], - "argline": "const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload", - "sig": "const char *::const char *::const git_oid *::unsigned int::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over each FETCH_HEAD entry

\n", - "comments": "" - }, - "git_repository_mergehead_foreach_cb": { - "type": "callback", - "file": "git2/repository.h", - "line": 731, - "lineto": 732, - "args": [ - { - "name": "oid", - "type": "const git_oid *", - "comment": "The merge OID" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_repository_mergehead_foreach" - } - ], - "argline": "const git_oid *oid, void *payload", - "sig": "const git_oid *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over each MERGE_HEAD entry

\n", - "comments": "" - }, - "git_revwalk_hide_cb": { - "type": "callback", - "file": "git2/revwalk.h", - "line": 281, - "lineto": 283, - "args": [ - { - "name": "commit_id", - "type": "const git_oid *", - "comment": "oid of Commit" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified pointer to data to be passed as data payload" - } - ], - "argline": "const git_oid *commit_id, void *payload", - "sig": "const git_oid *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

This is a callback function that user can provide to hide a\n commit and its parents. If the callback function returns non-zero value,\n then this commit and its parents will be hidden.

\n", - "comments": "" - }, - "git_stash_apply_progress_cb": { - "type": "callback", - "file": "git2/stash.h", - "line": 115, - "lineto": 117, - "args": [ - { - "name": "progress", - "type": "git_stash_apply_progress_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_stash_apply_progress_t progress, void *payload", - "sig": "git_stash_apply_progress_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Stash application progress notification function.\n Return 0 to continue processing, or a negative value to\n abort the stash application.

\n", - "comments": "" - }, - "git_stash_cb": { - "type": "callback", - "file": "git2/stash.h", - "line": 201, - "lineto": 205, - "args": [ - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - }, - { - "name": "message", - "type": "const char *", - "comment": "The stash message." - }, - { - "name": "stash_id", - "type": "const git_oid *", - "comment": "The commit oid of the stashed state." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra parameter to callback function." - } - ], - "argline": "size_t index, const char *message, const git_oid *stash_id, void *payload", - "sig": "size_t::const char *::const git_oid *::void *", - "return": { - "type": "int", - "comment": " 0 to continue iterating or non-zero to stop." - }, - "description": "

This is a callback function you can provide to iterate over all the\n stashed states that will be invoked per entry.

\n", - "comments": "" - }, - "git_status_cb": { - "type": "callback", - "file": "git2/status.h", - "line": 63, - "lineto": 64, - "args": [ - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "status_flags", - "type": "unsigned int", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *path, unsigned int status_flags, void *payload", - "sig": "const char *::unsigned int::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Function pointer to receive status on individual files

\n", - "comments": "

path is the relative path to the file from the root of the repository.

\n\n

status_flags is a combination of git_status_t values that apply.

\n\n

payload is the value you passed to the foreach function as payload.

\n" - }, - "git_submodule_cb": { - "type": "callback", - "file": "git2/submodule.h", - "line": 118, - "lineto": 119, - "args": [ - { - "name": "sm", - "type": "git_submodule *", - "comment": "git_submodule currently being visited" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the submodule" - }, - { - "name": "payload", - "type": "void *", - "comment": "value you passed to the foreach function as payload" - } - ], - "argline": "git_submodule *sm, const char *name, void *payload", - "sig": "git_submodule *::const char *::void *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Function pointer to receive each submodule

\n", - "comments": "" - }, - "git_tag_foreach_cb": { - "type": "callback", - "file": "git2/tag.h", - "line": 330, - "lineto": 330, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The tag name" - }, - { - "name": "oid", - "type": "git_oid *", - "comment": "The tag's OID" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_tag_foreach" - } - ], - "argline": "const char *name, git_oid *oid, void *payload", - "sig": "const char *::git_oid *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over tag names

\n", - "comments": "" - }, - "git_trace_cb": { - "type": "callback", - "file": "git2/trace.h", - "line": 52, - "lineto": 52, - "args": [ - { - "name": "level", - "type": "git_trace_level_t", - "comment": null - }, - { - "name": "msg", - "type": "const char *", - "comment": null - } - ], - "argline": "git_trace_level_t level, const char *msg", - "sig": "git_trace_level_t::const char *", - "return": { - "type": "void", - "comment": null - }, - "description": "

An instance for a tracing function

\n", - "comments": "" - }, - "git_transport_message_cb": { - "type": "callback", - "file": "git2/transport.h", - "line": 34, - "lineto": 34, - "args": [ - { - "name": "str", - "type": "const char *", - "comment": "The message from the transport" - }, - { - "name": "len", - "type": "int", - "comment": "The length of the message" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "const char *str, int len, void *payload", - "sig": "const char *::int::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for messages received by the transport.

\n", - "comments": "

Return a negative value to cancel the network operation.

\n" - }, - "git_transport_cb": { - "type": "callback", - "file": "git2/transport.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_transport **", - "comment": null - }, - { - "name": "owner", - "type": "git_remote *", - "comment": null - }, - { - "name": "param", - "type": "void *", - "comment": null - } - ], - "argline": "git_transport **out, git_remote *owner, void *param", - "sig": "git_transport **::git_remote *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Signature of a function which creates a transport

\n", - "comments": "" - }, - "git_treebuilder_filter_cb": { - "type": "callback", - "file": "git2/tree.h", - "line": 349, - "lineto": 350, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_tree_entry *entry, void *payload", - "sig": "const git_tree_entry *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for git_treebuilder_filter

\n", - "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" - }, - "git_treewalk_cb": { - "type": "callback", - "file": "git2/tree.h", - "line": 383, - "lineto": 384, - "args": [ - { - "name": "root", - "type": "const char *", - "comment": null - }, - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *root, const git_tree_entry *entry, void *payload", - "sig": "const char *::const git_tree_entry *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for the tree traversal method

\n", - "comments": "" - } - }, - "globals": {}, - "types": [ - [ - "git_annotated_commit", - { - "decl": "git_annotated_commit", - "type": "struct", - "value": "git_annotated_commit", - "file": "git2/types.h", - "line": 198, - "lineto": 198, - "tdef": "typedef", - "description": " Annotated commits, the input to merge and rebase. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_annotated_commit_free", - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_from_ref", - "git_annotated_commit_from_revspec", - "git_annotated_commit_id", - "git_annotated_commit_lookup", - "git_annotated_commit_ref", - "git_branch_create_from_annotated", - "git_merge", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_rebase_init", - "git_repository_set_head_detached_from_annotated", - "git_reset_from_annotated" - ] - } - } - ], - [ - "git_apply_flags_t", - { - "decl": [ - "GIT_APPLY_CHECK" - ], - "type": "enum", - "file": "git2/apply.h", - "line": 57, - "lineto": 63, - "block": "GIT_APPLY_CHECK", - "tdef": "typedef", - "description": " Flags controlling the behavior of git_apply ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_APPLY_CHECK", - "comments": "

Don't actually make changes, just test that the patch applies.\n This is the equivalent of git apply --check.

\n", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_apply_location_t", - { - "decl": [ - "GIT_APPLY_LOCATION_WORKDIR", - "GIT_APPLY_LOCATION_INDEX", - "GIT_APPLY_LOCATION_BOTH" - ], - "type": "enum", - "file": "git2/apply.h", - "line": 113, - "lineto": 131, - "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", - "tdef": "typedef", - "description": " Possible application locations for git_apply ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_APPLY_LOCATION_WORKDIR", - "comments": "

Apply the patch to the workdir, leaving the index untouched.\n This is the equivalent of git apply with no location argument.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_APPLY_LOCATION_INDEX", - "comments": "

Apply the patch to the index, leaving the working directory\n untouched. This is the equivalent of git apply --cached.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_APPLY_LOCATION_BOTH", - "comments": "

Apply the patch to both the working directory and the index.\n This is the equivalent of git apply --index.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [ - "git_apply" - ] - } - } - ], - [ - "git_apply_options", - { - "decl": [ - "unsigned int version", - "git_apply_delta_cb delta_cb", - "git_apply_hunk_cb hunk_cb", - "void * payload", - "unsigned int flags" - ], - "type": "struct", - "value": "git_apply_options", - "file": "git2/apply.h", - "line": 73, - "lineto": 87, - "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload\nunsigned int flags", - "tdef": "typedef", - "description": " Apply options structure", - "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The version " - }, - { - "type": "git_apply_delta_cb", - "name": "delta_cb", - "comments": " When applying a patch, callback that will be made per delta (file). " - }, - { - "type": "git_apply_hunk_cb", - "name": "hunk_cb", - "comments": " When applying a patch, callback that will be made per hunk. " - }, - { - "type": "void *", - "name": "payload", - "comments": " Payload passed to both delta_cb \n&\n hunk_cb. " - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " Bitmask of git_apply_flags_t " - } - ], - "used": { - "returns": [], - "needs": [ - "git_apply", - "git_apply_to_tree" - ] - } - } - ], - [ - "git_attr_options", - { - "decl": [ - "unsigned int version", - "unsigned int flags", - "git_oid * commit_id", - "git_oid attr_commit_id" - ], - "type": "struct", - "value": "git_attr_options", - "file": "git2/attr.h", - "line": 144, - "lineto": 161, - "block": "unsigned int version\nunsigned int flags\ngit_oid * commit_id\ngit_oid attr_commit_id", - "tdef": "typedef", - "description": " An options structure for querying attributes.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " A combination of GIT_ATTR_CHECK flags " - }, - { - "type": "git_oid *", - "name": "commit_id", - "comments": "" - }, - { - "type": "git_oid", - "name": "attr_commit_id", - "comments": " The commit to load attributes from, when\n `GIT_ATTR_CHECK_INCLUDE_COMMIT` is specified." - } - ], - "used": { - "returns": [], - "needs": [ - "git_attr_foreach_ext", - "git_attr_get_ext", - "git_attr_get_many_ext" - ] - } - } - ], - [ - "git_attr_value_t", - { - "decl": [ - "GIT_ATTR_VALUE_UNSPECIFIED", - "GIT_ATTR_VALUE_TRUE", - "GIT_ATTR_VALUE_FALSE", - "GIT_ATTR_VALUE_STRING" - ], - "type": "enum", - "file": "git2/attr.h", - "line": 82, - "lineto": 87, - "block": "GIT_ATTR_VALUE_UNSPECIFIED\nGIT_ATTR_VALUE_TRUE\nGIT_ATTR_VALUE_FALSE\nGIT_ATTR_VALUE_STRING", - "tdef": "typedef", - "description": " Possible states for an attribute", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_ATTR_VALUE_UNSPECIFIED", - "comments": "

The attribute has been left unspecified

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_ATTR_VALUE_TRUE", - "comments": "

The attribute has been set

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_ATTR_VALUE_FALSE", - "comments": "

The attribute has been unset

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_ATTR_VALUE_STRING", - "comments": "

This attribute has a value

\n", - "value": 3 - } - ], - "used": { - "returns": [ - "git_attr_value" - ], - "needs": [] - } - } - ], - [ - "git_blame", - { - "decl": "git_blame", - "type": "struct", - "value": "git_blame", - "file": "git2/blame.h", - "line": 202, - "lineto": 202, - "tdef": "typedef", - "description": " Opaque structure to hold blame results ", - "comments": "", - "used": { - "returns": [ - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline" - ], - "needs": [ - "git_blame_buffer", - "git_blame_file", - "git_blame_free", - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline", - "git_blame_get_hunk_count", - "git_blame_init_options", - "git_blame_options_init" - ] - } - } - ], - [ - "git_blame_flag_t", - { - "decl": [ - "GIT_BLAME_NORMAL", - "GIT_BLAME_TRACK_COPIES_SAME_FILE", - "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", - "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", - "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", - "GIT_BLAME_FIRST_PARENT", - "GIT_BLAME_USE_MAILMAP", - "GIT_BLAME_IGNORE_WHITESPACE" - ], - "type": "enum", - "file": "git2/blame.h", - "line": 26, - "lineto": 77, - "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", - "tdef": "typedef", - "description": " Flags for indicating option behavior for git_blame APIs.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_BLAME_NORMAL", - "comments": "

Normal blame, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_SAME_FILE", - "comments": "

Track lines that have moved within a file (like git blame -M).

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", - "comments": "

Track lines that have moved across files in the same commit\n (like git blame -C).

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", - "comments": "

Track lines that have been copied from another file that exists\n in the same commit (like git blame -CC). Implies SAME_FILE.

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", - "comments": "

Track lines that have been copied from another file that exists in\n any commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_BLAME_FIRST_PARENT", - "comments": "

Restrict the search of commits to those reachable following only\n the first parents.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_BLAME_USE_MAILMAP", - "comments": "

Use mailmap file to map author and committer names and email\n addresses to canonical real names and email addresses. The\n mailmap will be read from the working directory, or HEAD in a\n bare repository.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_BLAME_IGNORE_WHITESPACE", - "comments": "

Ignore whitespace differences

\n", - "value": 64 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_blame_hunk", - { - "decl": [ - "size_t lines_in_hunk", - "git_oid final_commit_id", - "size_t final_start_line_number", - "git_signature * final_signature", - "git_oid orig_commit_id", - "const char * orig_path", - "size_t orig_start_line_number", - "git_signature * orig_signature", - "char boundary" - ], - "type": "struct", - "value": "git_blame_hunk", - "file": "git2/blame.h", - "line": 145, - "lineto": 198, - "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", - "tdef": "typedef", - "description": " Structure that represents a blame hunk.", - "comments": "", - "fields": [ - { - "type": "size_t", - "name": "lines_in_hunk", - "comments": " The number of lines in this hunk." - }, - { - "type": "git_oid", - "name": "final_commit_id", - "comments": " The OID of the commit where this line was last changed." - }, - { - "type": "size_t", - "name": "final_start_line_number", - "comments": " The 1-based line number where this hunk begins, in the final version\n of the file." - }, - { - "type": "git_signature *", - "name": "final_signature", - "comments": " The author of `final_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." - }, - { - "type": "git_oid", - "name": "orig_commit_id", - "comments": " The OID of the commit where this hunk was found.\n This will usually be the same as `final_commit_id`, except when\n `GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES` has been specified." - }, - { - "type": "const char *", - "name": "orig_path", - "comments": " The path to the file where this hunk originated, as of the commit\n specified by `orig_commit_id`." - }, - { - "type": "size_t", - "name": "orig_start_line_number", - "comments": " The 1-based line number where this hunk begins in the file named by\n `orig_path` in the commit specified by `orig_commit_id`." - }, - { - "type": "git_signature *", - "name": "orig_signature", - "comments": " The author of `orig_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." - }, - { - "type": "char", - "name": "boundary", - "comments": " The 1 iff the hunk has been tracked to a boundary commit (the root,\n or the commit specified in git_blame_options.oldest_commit)" - } - ], - "used": { - "returns": [ - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline" - ], - "needs": [] - } - } - ], - [ - "git_blame_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "uint16_t min_match_characters", - "git_oid newest_commit", - "git_oid oldest_commit", - "size_t min_line", - "size_t max_line" - ], - "type": "struct", - "value": "git_blame_options", - "file": "git2/blame.h", - "line": 86, - "lineto": 123, - "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", - "tdef": "typedef", - "description": " Blame options structure", - "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can use git_blame_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of `git_blame_flag_t` " - }, - { - "type": "uint16_t", - "name": "min_match_characters", - "comments": " The lower bound on the number of alphanumeric characters that\n must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value\n is 20.\n\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." - }, - { - "type": "git_oid", - "name": "newest_commit", - "comments": " The id of the newest commit to consider. The default is HEAD. " - }, - { - "type": "git_oid", - "name": "oldest_commit", - "comments": " The id of the oldest commit to consider.\n The default is the first commit encountered with a NULL parent." - }, - { - "type": "size_t", - "name": "min_line", - "comments": " The first line in the file to blame.\n The default is 1 (line numbers start with 1)." - }, - { - "type": "size_t", - "name": "max_line", - "comments": " The last line in the file to blame.\n The default is the last line of the file." - } - ], - "used": { - "returns": [], - "needs": [ - "git_blame_file", - "git_blame_init_options", - "git_blame_options_init" - ] - } - } - ], - [ - "git_blob", - { - "decl": "git_blob", - "type": "struct", - "value": "git_blob", - "file": "git2/types.h", - "line": 133, - "lineto": 133, - "tdef": "typedef", - "description": " In-memory representation of a blob object. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_blob_dup", - "git_blob_filter", - "git_blob_filter_options_init", - "git_blob_filtered_content", - "git_blob_free", - "git_blob_id", - "git_blob_is_binary", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_blob_owner", - "git_blob_rawcontent", - "git_blob_rawsize", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_filter_list_apply_to_blob", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs" - ] - } - } - ], - [ - "git_blob_filter_flag_t", - { - "decl": [ - "GIT_BLOB_FILTER_CHECK_FOR_BINARY", - "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", - "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", - "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT" - ], - "type": "enum", - "file": "git2/blob.h", - "line": 102, - "lineto": 123, - "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", - "tdef": "typedef", - "description": " Flags to control the functionality of `git_blob_filter`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_BLOB_FILTER_CHECK_FOR_BINARY", - "comments": "

When set, filters will not be applied to binary files.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", - "comments": "

When set, filters will not load configuration from the\n system-wide gitattributes in /etc (or system equivalent).

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", - "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", - "comments": "

When set, filters will be loaded from a .gitattributes file\n in the specified commit.

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_blob_filter_options", - { - "decl": [ - "int version", - "uint32_t flags", - "git_oid * commit_id", - "git_oid attr_commit_id" - ], - "type": "struct", - "value": "git_blob_filter_options", - "file": "git2/blob.h", - "line": 132, - "lineto": 149, - "block": "int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", - "tdef": "typedef", - "description": " The options used when applying filter options to a file.", - "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n", - "fields": [ - { - "type": "int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above " - }, - { - "type": "git_oid *", - "name": "commit_id", - "comments": "" - }, - { - "type": "git_oid", - "name": "attr_commit_id", - "comments": " The commit to load attributes from, when\n `GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." - } - ], - "used": { - "returns": [], - "needs": [ - "git_blob_filter", - "git_blob_filter_options_init" - ] - } - } - ], - [ - "git_branch_iterator", - { - "decl": "git_branch_iterator", - "type": "struct", - "value": "git_branch_iterator", - "file": "git2/branch.h", - "line": 88, - "lineto": 88, - "tdef": "typedef", - "description": " Iterator type for branches ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_branch_iterator_free", - "git_branch_iterator_new", - "git_branch_next" - ] - } - } - ], - [ - "git_branch_t", - { - "decl": [ - "GIT_BRANCH_LOCAL", - "GIT_BRANCH_REMOTE", - "GIT_BRANCH_ALL" - ], - "type": "enum", - "file": "git2/types.h", - "line": 215, - "lineto": 219, - "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", - "tdef": "typedef", - "description": " Basic type of any Git branch. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_BRANCH_LOCAL", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_BRANCH_REMOTE", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_BRANCH_ALL", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [ - "git_branch_iterator_new", - "git_branch_lookup", - "git_branch_next" - ] - } - } - ], - [ - "git_buf", - { - "decl": [ - "char * ptr", - "size_t asize", - "size_t size" - ], - "type": "struct", - "value": "git_buf", - "file": "git2/buffer.h", - "line": 39, - "lineto": 61, - "block": "char * ptr\nsize_t asize\nsize_t size", - "tdef": "typedef", - "description": " A data buffer for exporting data from libgit2", - "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. This can be awkward if the caller does not have easy access to the same allocation functions that libgit2 is using. In those cases, libgit2 will fill in a git_buf and the caller can use git_buf_dispose() to release it when they are done.

\n\n

A git_buf may also be used for the caller to pass in a reference to a block of memory they hold. In this case, libgit2 will not resize or free the memory, but will read from it as needed.

\n\n

Some APIs may occasionally do something slightly unusual with a buffer, such as setting ptr to a value that was passed in by the user. In those cases, the behavior will be clearly documented by the API.

\n", - "fields": [ - { - "type": "char *", - "name": "ptr", - "comments": " The buffer contents.\n\n `ptr` points to the start of the allocated memory. If it is NULL,\n then the `git_buf` is considered empty and libgit2 will feel free\n to overwrite it with new data." - }, - { - "type": "size_t", - "name": "asize", - "comments": " `asize` holds the known total amount of allocated memory if the `ptr`\n was allocated by libgit2. It may be larger than `size`. If `ptr`\n was not allocated by libgit2 and should not be resized and/or freed,\n then `asize` will be set to zero." - }, - { - "type": "size_t", - "name": "size", - "comments": " `size` holds the size (in bytes) of the data that is actually used." - } - ], - "used": { - "returns": [], - "needs": [ - "git_blob_filter", - "git_blob_filtered_content", - "git_branch_remote_name", - "git_branch_upstream_merge", - "git_branch_upstream_name", - "git_branch_upstream_remote", - "git_buf_contains_nul", - "git_buf_dispose", - "git_buf_free", - "git_buf_grow", - "git_buf_is_binary", - "git_buf_set", - "git_commit_create_buffer", - "git_commit_extract_signature", - "git_commit_header_field", - "git_commit_signing_cb", - "git_config_find_global", - "git_config_find_programdata", - "git_config_find_system", - "git_config_find_xdg", - "git_config_get_path", - "git_config_get_string_buf", - "git_config_parse_path", - "git_describe_format", - "git_diff_commit_as_email", - "git_diff_format_email", - "git_diff_stats_to_buf", - "git_diff_to_buf", - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_stream_data", - "git_message_prettify", - "git_note_default_ref", - "git_object_short_id", - "git_packbuilder_write_buf", - "git_patch_to_buf", - "git_refspec_rtransform", - "git_refspec_transform", - "git_remote_default_branch", - "git_repository_discover", - "git_repository_item_path", - "git_repository_message", - "git_submodule_resolve_url", - "git_treebuilder_write_with_buffer", - "git_url_resolve_cb", - "git_worktree_is_locked" - ] - } - } - ], - [ - "git_cert", - { - "decl": "git_cert", - "type": "struct", - "value": "git_cert", - "file": "git2/types.h", - "line": 262, - "lineto": 262, - "block": "git_cert_t cert_type", - "tdef": "typedef", - "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", - "comments": "", - "fields": [ - { - "type": "git_cert_t", - "name": "cert_type", - "comments": " Type of certificate. A `GIT_CERT_` value." - } - ], - "used": { - "returns": [], - "needs": [ - "git_transport_certificate_check_cb" - ] - } - } - ], - [ - "git_cert_hostkey", - { - "decl": [ - "git_cert parent", - "git_cert_ssh_t type", - "unsigned char [16] hash_md5", - "unsigned char [20] hash_sha1", - "unsigned char [32] hash_sha256", - "git_cert_ssh_raw_type_t raw_type", - "const char * hostkey", - "size_t hostkey_len" - ], - "type": "struct", - "value": "git_cert_hostkey", - "file": "git2/cert.h", - "line": 108, - "lineto": 151, - "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", - "tdef": "typedef", - "description": " Hostkey information taken from libssh2", - "comments": "", - "fields": [ - { - "type": "git_cert", - "name": "parent", - "comments": " The parent cert " - }, - { - "type": "git_cert_ssh_t", - "name": "type", - "comments": " A bitmask containing the available fields." - }, - { - "type": "unsigned char [16]", - "name": "hash_md5", - "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey." - }, - { - "type": "unsigned char [20]", - "name": "hash_sha1", - "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." - }, - { - "type": "unsigned char [32]", - "name": "hash_sha256", - "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." - }, - { - "type": "git_cert_ssh_raw_type_t", - "name": "raw_type", - "comments": " Raw hostkey type. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the type of the raw hostkey." - }, - { - "type": "const char *", - "name": "hostkey", - "comments": " Pointer to the raw hostkey. If `type` has `GIT_CERT_SSH_RAW` set,\n this will have the raw contents of the hostkey." - }, - { - "type": "size_t", - "name": "hostkey_len", - "comments": " Raw hostkey length. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the length of the raw contents of the hostkey." - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cert_ssh_t", - { - "decl": [ - "GIT_CERT_SSH_MD5", - "GIT_CERT_SSH_SHA1", - "GIT_CERT_SSH_SHA256", - "GIT_CERT_SSH_RAW" - ], - "type": "enum", - "file": "git2/cert.h", - "line": 77, - "lineto": 86, - "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256\nGIT_CERT_SSH_RAW", - "tdef": "typedef", - "description": " Type of SSH host fingerprint", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CERT_SSH_MD5", - "comments": "

MD5 is available

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CERT_SSH_SHA1", - "comments": "

SHA-1 is available

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CERT_SSH_SHA256", - "comments": "

SHA-256 is available

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CERT_SSH_RAW", - "comments": "

Raw hostkey is available

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cert_t", - { - "decl": [ - "GIT_CERT_NONE", - "GIT_CERT_X509", - "GIT_CERT_HOSTKEY_LIBSSH2", - "GIT_CERT_STRARRAY" - ], - "type": "enum", - "file": "git2/cert.h", - "line": 25, - "lineto": 48, - "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", - "tdef": "typedef", - "description": " Type of host certificate structure that is passed to the check callback", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CERT_NONE", - "comments": "

No information about the certificate is available. This may\n happen when using curl.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CERT_X509", - "comments": "

The data argument to the callback will be a pointer to\n the DER-encoded data.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CERT_HOSTKEY_LIBSSH2", - "comments": "

The data argument to the callback will be a pointer to a\n git_cert_hostkey structure.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CERT_STRARRAY", - "comments": "

The data argument to the callback will be a pointer to a\n git_strarray with name:content strings containing\n information about the certificate. This is used when using\n curl.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cert_x509", - { - "decl": [ - "git_cert parent", - "void * data", - "size_t len" - ], - "type": "struct", - "value": "git_cert_x509", - "file": "git2/cert.h", - "line": 156, - "lineto": 168, - "block": "git_cert parent\nvoid * data\nsize_t len", - "tdef": "typedef", - "description": " X.509 certificate information", - "comments": "", - "fields": [ - { - "type": "git_cert", - "name": "parent", - "comments": " The parent cert " - }, - { - "type": "void *", - "name": "data", - "comments": " Pointer to the X.509 certificate data" - }, - { - "type": "size_t", - "name": "len", - "comments": " Length of the memory block pointed to by `data`." - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_checkout_notify_t", - { - "decl": [ - "GIT_CHECKOUT_NOTIFY_NONE", - "GIT_CHECKOUT_NOTIFY_CONFLICT", - "GIT_CHECKOUT_NOTIFY_DIRTY", - "GIT_CHECKOUT_NOTIFY_UPDATED", - "GIT_CHECKOUT_NOTIFY_UNTRACKED", - "GIT_CHECKOUT_NOTIFY_IGNORED", - "GIT_CHECKOUT_NOTIFY_ALL" - ], - "type": "enum", - "file": "git2/checkout.h", - "line": 211, - "lineto": 242, - "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", - "tdef": "typedef", - "description": " Checkout notification flags", - "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_CONFLICT", - "comments": "

Invokes checkout on conflicting paths.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_DIRTY", - "comments": "

Notifies about "dirty" files, i.e. those that do not need an update\n but no longer match the baseline. Core git displays these files when\n checkout runs, but won't stop the checkout.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_UPDATED", - "comments": "

Sends notification for any file changed.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_UNTRACKED", - "comments": "

Notifies about untracked files.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_IGNORED", - "comments": "

Notifies about ignored files.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_ALL", - "comments": "

Notifies about ignored files.

\n", - "value": 65535 - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_notify_cb" - ] - } - } - ], - [ - "git_checkout_options", - { - "decl": [ - "unsigned int version", - "unsigned int checkout_strategy", - "int disable_filters", - "unsigned int dir_mode", - "unsigned int file_mode", - "int file_open_flags", - "unsigned int notify_flags", - "git_checkout_notify_cb notify_cb", - "void * notify_payload", - "git_checkout_progress_cb progress_cb", - "void * progress_payload", - "git_strarray paths", - "git_tree * baseline", - "git_index * baseline_index", - "const char * target_directory", - "const char * ancestor_label", - "const char * our_label", - "const char * their_label", - "git_checkout_perfdata_cb perfdata_cb", - "void * perfdata_payload" - ], - "type": "struct", - "value": "git_checkout_options", - "file": "git2/checkout.h", - "line": 279, - "lineto": 342, - "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", - "tdef": "typedef", - "description": " Checkout options structure", - "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The version " - }, - { - "type": "unsigned int", - "name": "checkout_strategy", - "comments": " default will be a safe checkout " - }, - { - "type": "int", - "name": "disable_filters", - "comments": " don't apply filters like CRLF conversion " - }, - { - "type": "unsigned int", - "name": "dir_mode", - "comments": " default is 0755 " - }, - { - "type": "unsigned int", - "name": "file_mode", - "comments": " default is 0644 or 0755 as dictated by blob " - }, - { - "type": "int", - "name": "file_open_flags", - "comments": " default is O_CREAT | O_TRUNC | O_WRONLY " - }, - { - "type": "unsigned int", - "name": "notify_flags", - "comments": " see `git_checkout_notify_t` above " - }, - { - "type": "git_checkout_notify_cb", - "name": "notify_cb", - "comments": " Optional callback to get notifications on specific file states.\n " - }, - { - "type": "void *", - "name": "notify_payload", - "comments": " Payload passed to notify_cb " - }, - { - "type": "git_checkout_progress_cb", - "name": "progress_cb", - "comments": " Optional callback to notify the consumer of checkout progress. " - }, - { - "type": "void *", - "name": "progress_payload", - "comments": " Payload passed to progress_cb " - }, - { - "type": "git_strarray", - "name": "paths", - "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." - }, - { - "type": "git_tree *", - "name": "baseline", - "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." - }, - { - "type": "git_index *", - "name": "baseline_index", - "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." - }, - { - "type": "const char *", - "name": "target_directory", - "comments": " alternative checkout path to workdir " - }, - { - "type": "const char *", - "name": "ancestor_label", - "comments": " the name of the common ancestor side of conflicts " - }, - { - "type": "const char *", - "name": "our_label", - "comments": " the name of the \"our\" side of conflicts " - }, - { - "type": "const char *", - "name": "their_label", - "comments": " the name of the \"their\" side of conflicts " - }, - { - "type": "git_checkout_perfdata_cb", - "name": "perfdata_cb", - "comments": " Optional callback to notify the consumer of performance data. " - }, - { - "type": "void *", - "name": "perfdata_payload", - "comments": " Payload passed to perfdata_cb " - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_head", - "git_checkout_index", - "git_checkout_options_init", - "git_checkout_tree", - "git_merge", - "git_reset", - "git_reset_from_annotated" - ] - } - } - ], - [ - "git_checkout_perfdata", - { - "decl": [ - "size_t mkdir_calls", - "size_t stat_calls", - "size_t chmod_calls" - ], - "type": "struct", - "value": "git_checkout_perfdata", - "file": "git2/checkout.h", - "line": 245, - "lineto": 249, - "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", - "tdef": "typedef", - "description": " Checkout performance-reporting structure ", - "comments": "", - "fields": [ - { - "type": "size_t", - "name": "mkdir_calls", - "comments": "" - }, - { - "type": "size_t", - "name": "stat_calls", - "comments": "" - }, - { - "type": "size_t", - "name": "chmod_calls", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_perfdata_cb" - ] - } - } - ], - [ - "git_checkout_strategy_t", - { - "decl": [ - "GIT_CHECKOUT_NONE", - "GIT_CHECKOUT_SAFE", - "GIT_CHECKOUT_FORCE", - "GIT_CHECKOUT_RECREATE_MISSING", - "GIT_CHECKOUT_ALLOW_CONFLICTS", - "GIT_CHECKOUT_REMOVE_UNTRACKED", - "GIT_CHECKOUT_REMOVE_IGNORED", - "GIT_CHECKOUT_UPDATE_ONLY", - "GIT_CHECKOUT_DONT_UPDATE_INDEX", - "GIT_CHECKOUT_NO_REFRESH", - "GIT_CHECKOUT_SKIP_UNMERGED", - "GIT_CHECKOUT_USE_OURS", - "GIT_CHECKOUT_USE_THEIRS", - "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", - "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", - "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", - "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", - "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", - "GIT_CHECKOUT_DONT_REMOVE_EXISTING", - "GIT_CHECKOUT_DONT_WRITE_INDEX", - "GIT_CHECKOUT_DRY_RUN", - "GIT_CHECKOUT_UPDATE_SUBMODULES", - "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" - ], - "type": "enum", - "file": "git2/checkout.h", - "line": 106, - "lineto": 195, - "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", - "tdef": "typedef", - "description": " Checkout behavior flags", - "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_CHECKOUT_NONE", - "comments": "

default is a dry run, no actual updates

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_SAFE", - "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked out files,\n the checkout will still proceed, leaving the changes intact.

\n\n

Mutually exclusive with GIT_CHECKOUT_FORCE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_FORCE", - "comments": "

Allow all updates to force working directory to look like index.

\n\n

Mutually exclusive with GIT_CHECKOUT_SAFE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_RECREATE_MISSING", - "comments": "

Allow checkout to recreate missing files

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_ALLOW_CONFLICTS", - "comments": "

Allow checkout to make safe updates even if conflicts are found

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_REMOVE_UNTRACKED", - "comments": "

Remove untracked files not in index (that are not ignored)

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_REMOVE_IGNORED", - "comments": "

Remove ignored files not in index

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_UPDATE_ONLY", - "comments": "

Only update existing files, don't create new ones

\n", - "value": 128 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_UPDATE_INDEX", - "comments": "

Normally checkout updates index entries as it goes; this stops that.\n Implies GIT_CHECKOUT_DONT_WRITE_INDEX.

\n", - "value": 256 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NO_REFRESH", - "comments": "

Don't refresh index/config/etc before doing checkout

\n", - "value": 512 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_SKIP_UNMERGED", - "comments": "

Allow checkout to skip unmerged files

\n", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_USE_OURS", - "comments": "

For unmerged files, checkout stage 2 from index

\n", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_USE_THEIRS", - "comments": "

For unmerged files, checkout stage 3 from index

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", - "comments": "

Treat pathspec as simple list of exact match file paths

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", - "comments": "

Ignore directories in use, they will be left empty

\n", - "value": 262144 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", - "comments": "

Don't overwrite ignored files that exist in the checkout target

\n", - "value": 524288 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", - "comments": "

Write normal merge files for conflicts

\n", - "value": 1048576 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", - "comments": "

Include common ancestor data in diff3 format files for conflicts

\n", - "value": 2097152 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_REMOVE_EXISTING", - "comments": "

Don't overwrite existing files or folders

\n", - "value": 4194304 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_WRITE_INDEX", - "comments": "

Normally checkout writes the index upon completion; this prevents that.

\n", - "value": 8388608 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DRY_RUN", - "comments": "

Show what would be done by a checkout. Stop after sending\n notifications; don't update the working directory or index.

\n", - "value": 16777216 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_UPDATE_SUBMODULES", - "comments": "

Recursively checkout submodules with same options (NOT IMPLEMENTED)

\n", - "value": 65536 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", - "comments": "

Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED)

\n", - "value": 131072 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cherrypick_options", - { - "decl": [ - "unsigned int version", - "unsigned int mainline", - "git_merge_options merge_opts", - "git_checkout_options checkout_opts" - ], - "type": "struct", - "value": "git_cherrypick_options", - "file": "git2/cherrypick.h", - "line": 26, - "lineto": 34, - "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", - "tdef": "typedef", - "description": " Cherry-pick options", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "mainline", - "comments": " For merge commits, the \"mainline\" is treated as the parent. " - }, - { - "type": "git_merge_options", - "name": "merge_opts", - "comments": " Options for the merging " - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " Options for the checkout " - } - ], - "used": { - "returns": [], - "needs": [ - "git_cherrypick", - "git_cherrypick_options_init" - ] - } - } - ], - [ - "git_clone_local_t", - { - "decl": [ - "GIT_CLONE_LOCAL_AUTO", - "GIT_CLONE_LOCAL", - "GIT_CLONE_NO_LOCAL", - "GIT_CLONE_LOCAL_NO_LINKS" - ], - "type": "enum", - "file": "git2/clone.h", - "line": 33, - "lineto": 53, - "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", - "tdef": "typedef", - "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CLONE_LOCAL_AUTO", - "comments": "

Auto-detect (default), libgit2 will bypass the git-aware\n transport for local paths, but use a normal fetch for\n file:// urls.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CLONE_LOCAL", - "comments": "

Bypass the git-aware transport even for a file:// url.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CLONE_NO_LOCAL", - "comments": "

Do no bypass the git-aware transport

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CLONE_LOCAL_NO_LINKS", - "comments": "

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_clone_options", - { - "decl": [ - "unsigned int version", - "git_checkout_options checkout_opts", - "git_fetch_options fetch_opts", - "int bare", - "git_clone_local_t local", - "const char * checkout_branch", - "git_repository_create_cb repository_cb", - "void * repository_cb_payload", - "git_remote_create_cb remote_cb", - "void * remote_cb_payload" - ], - "type": "struct", - "value": "git_clone_options", - "file": "git2/clone.h", - "line": 103, - "lineto": 164, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", - "tdef": "typedef", - "description": " Clone options structure", - "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`." - }, - { - "type": "git_fetch_options", - "name": "fetch_opts", - "comments": " Options which control the fetch, including callbacks.\n\n The callbacks are used for reporting fetch progress, and for acquiring\n credentials in the event they are needed." - }, - { - "type": "int", - "name": "bare", - "comments": " Set to zero (false) to create a standard repo, or non-zero\n for a bare repo" - }, - { - "type": "git_clone_local_t", - "name": "local", - "comments": " Whether to use a fetch or copy the object database." - }, - { - "type": "const char *", - "name": "checkout_branch", - "comments": " The name of the branch to checkout. NULL means use the\n remote's default branch." - }, - { - "type": "git_repository_create_cb", - "name": "repository_cb", - "comments": " A callback used to create the new repository into which to\n clone. If NULL, the 'bare' field will be used to determine\n whether to create a bare repository." - }, - { - "type": "void *", - "name": "repository_cb_payload", - "comments": " An opaque payload to pass to the git_repository creation callback.\n This parameter is ignored unless repository_cb is non-NULL." - }, - { - "type": "git_remote_create_cb", - "name": "remote_cb", - "comments": " A callback used to create the git_remote, prior to its being\n used to perform the clone operation. See the documentation for\n git_remote_create_cb for details. This parameter may be NULL,\n indicating that git_clone should provide default behavior." - }, - { - "type": "void *", - "name": "remote_cb_payload", - "comments": " An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL." - } - ], - "used": { - "returns": [], - "needs": [ - "git_clone", - "git_clone_options_init" - ] - } - } - ], - [ - "git_commit", - { - "decl": "git_commit", - "type": "struct", - "value": "git_commit", - "file": "git2/types.h", - "line": 136, - "lineto": 136, - "tdef": "typedef", - "description": " Parsed representation of a commit object. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_branch_create", - "git_cherrypick", - "git_cherrypick_commit", - "git_commit_amend", - "git_commit_author", - "git_commit_author_with_mailmap", - "git_commit_body", - "git_commit_committer", - "git_commit_committer_with_mailmap", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_cb", - "git_commit_dup", - "git_commit_free", - "git_commit_header_field", - "git_commit_id", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_commit_message", - "git_commit_message_encoding", - "git_commit_message_raw", - "git_commit_nth_gen_ancestor", - "git_commit_owner", - "git_commit_parent", - "git_commit_parent_id", - "git_commit_parentcount", - "git_commit_raw_header", - "git_commit_summary", - "git_commit_time", - "git_commit_time_offset", - "git_commit_tree", - "git_commit_tree_id", - "git_diff_commit_as_email", - "git_merge_commits", - "git_note_commit_create", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_commit_remove", - "git_odb_set_commit_graph", - "git_revert", - "git_revert_commit" - ] - } - } - ], - [ - "git_commit_graph", - { - "decl": "git_commit_graph", - "type": "struct", - "value": "git_commit_graph", - "file": "git2/types.h", - "line": 109, - "lineto": 109, - "tdef": "typedef", - "description": " A git commit-graph ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_odb_set_commit_graph" - ] - } - } - ], - [ - "git_commit_graph_split_strategy_t", - { - "decl": [ - "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE" - ], - "type": "enum", - "file": "git2/sys/commit_graph.h", - "line": 92, - "lineto": 98, - "block": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", - "tdef": "typedef", - "description": " The strategy to use when adding a new set of commits to a pre-existing\n commit-graph chain.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", - "comments": "

Do not split commit-graph files. The other split strategy-related option\n fields are ignored.

\n", - "value": 0 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_commit_graph_writer", - { - "decl": "git_commit_graph_writer", - "type": "struct", - "value": "git_commit_graph_writer", - "file": "git2/types.h", - "line": 112, - "lineto": 112, - "tdef": "typedef", - "description": " a writer for commit-graph files. ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_config", - { - "decl": "git_config", - "type": "struct", - "value": "git_config", - "file": "git2/types.h", - "line": 157, - "lineto": 157, - "tdef": "typedef", - "description": " Memory representation of a set of config files ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_add_file_ondisk", - "git_config_backend_foreach_match", - "git_config_delete_entry", - "git_config_delete_multivar", - "git_config_entry_free", - "git_config_foreach", - "git_config_foreach_cb", - "git_config_foreach_match", - "git_config_free", - "git_config_get_bool", - "git_config_get_entry", - "git_config_get_int32", - "git_config_get_int64", - "git_config_get_mapped", - "git_config_get_multivar_foreach", - "git_config_get_path", - "git_config_get_string", - "git_config_get_string_buf", - "git_config_iterator_free", - "git_config_iterator_glob_new", - "git_config_iterator_new", - "git_config_lock", - "git_config_lookup_map_value", - "git_config_multivar_iterator_new", - "git_config_new", - "git_config_next", - "git_config_open_default", - "git_config_open_global", - "git_config_open_level", - "git_config_open_ondisk", - "git_config_set_bool", - "git_config_set_int32", - "git_config_set_int64", - "git_config_set_multivar", - "git_config_set_string", - "git_config_snapshot", - "git_repository_config", - "git_repository_config_snapshot" - ] - } - } - ], - [ - "git_config_backend", - { - "decl": "git_config_backend", - "type": "struct", - "value": "git_config_backend", - "file": "git2/types.h", - "line": 160, - "lineto": 160, - "tdef": "typedef", - "description": " Interface to access a configuration file ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_backend_foreach_match" - ] - } - } - ], - [ - "git_config_entry", - { - "decl": [ - "const char * name", - "const char * value", - "unsigned int include_depth", - "git_config_level_t level", - "void (*)(struct git_config_entry *) free", - "void * payload" - ], - "type": "struct", - "value": "git_config_entry", - "file": "git2/config.h", - "line": 64, - "lineto": 71, - "block": "const char * name\nconst char * value\nunsigned int include_depth\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free\nvoid * payload", - "tdef": "typedef", - "description": " An entry in a configuration file", - "comments": "", - "fields": [ - { - "type": "const char *", - "name": "name", - "comments": " Name of the entry (normalised) " - }, - { - "type": "const char *", - "name": "value", - "comments": " String value of the entry " - }, - { - "type": "unsigned int", - "name": "include_depth", - "comments": " Depth of includes where this variable was found " - }, - { - "type": "git_config_level_t", - "name": "level", - "comments": " Which config file this was found in " - }, - { - "type": "void (*)(struct git_config_entry *)", - "name": "free", - "comments": "" - }, - { - "type": "void *", - "name": "payload", - "comments": " Opaque value for the free function. Do not read or write " - } - ], - "used": { - "returns": [], - "needs": [ - "git_config_entry_free", - "git_config_foreach_cb", - "git_config_get_entry", - "git_config_next" - ] - } - } - ], - [ - "git_config_iterator", - { - "decl": "git_config_iterator", - "type": "struct", - "value": "git_config_iterator", - "file": "git2/config.h", - "line": 89, - "lineto": 89, - "tdef": "typedef", - "description": " An opaque structure for a configuration iterator", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_iterator_free", - "git_config_iterator_glob_new", - "git_config_iterator_new", - "git_config_multivar_iterator_new", - "git_config_next" - ] - } - } - ], - [ - "git_config_level_t", - { - "decl": [ - "GIT_CONFIG_LEVEL_PROGRAMDATA", - "GIT_CONFIG_LEVEL_SYSTEM", - "GIT_CONFIG_LEVEL_XDG", - "GIT_CONFIG_LEVEL_GLOBAL", - "GIT_CONFIG_LEVEL_LOCAL", - "GIT_CONFIG_LEVEL_APP", - "GIT_CONFIG_HIGHEST_LEVEL" - ], - "type": "enum", - "file": "git2/config.h", - "line": 31, - "lineto": 59, - "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", - "tdef": "typedef", - "description": " Priority level of a config file.\n These priority levels correspond to the natural escalation logic\n (from higher to lower) when searching for config entries in git.git.", - "comments": "

git_config_open_default() and git_repository_config() honor those priority levels as well.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_PROGRAMDATA", - "comments": "

System-wide on Windows, for compatibility with portable git

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_SYSTEM", - "comments": "

System-wide configuration file; /etc/gitconfig on Linux systems

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_XDG", - "comments": "

XDG compatible configuration file; typically ~/.config/git/config

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_GLOBAL", - "comments": "

User-specific configuration file (also called Global configuration\n file); typically ~/.gitconfig

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_LOCAL", - "comments": "

Repository specific configuration file; $WORK_DIR/.git/config on\n non-bare repos

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_APP", - "comments": "

Application specific configuration file; freely defined by applications

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_CONFIG_HIGHEST_LEVEL", - "comments": "

Represents the highest level available config file (i.e. the most\n specific config file available that actually is loaded)

\n", - "value": -1 - } - ], - "used": { - "returns": [], - "needs": [ - "git_config_add_file_ondisk", - "git_config_open_level" - ] - } - } - ], - [ - "git_configmap", - { - "decl": [ - "git_configmap_t type", - "const char * str_match", - "int map_value" - ], - "type": "struct", - "value": "git_configmap", - "file": "git2/config.h", - "line": 104, - "lineto": 108, - "block": "git_configmap_t type\nconst char * str_match\nint map_value", - "tdef": "typedef", - "description": " Mapping from config variables to values.", - "comments": "", - "fields": [ - { - "type": "git_configmap_t", - "name": "type", - "comments": "" - }, - { - "type": "const char *", - "name": "str_match", - "comments": "" - }, - { - "type": "int", - "name": "map_value", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_config_get_mapped", - "git_config_lookup_map_value" - ] - } - } - ], - [ - "git_configmap_t", - { - "decl": [ - "GIT_CONFIGMAP_FALSE", - "GIT_CONFIGMAP_TRUE", - "GIT_CONFIGMAP_INT32", - "GIT_CONFIGMAP_STRING" - ], - "type": "enum", - "file": "git2/config.h", - "line": 94, - "lineto": 99, - "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", - "tdef": "typedef", - "description": " Config var type", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CONFIGMAP_FALSE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CONFIGMAP_TRUE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CONFIGMAP_INT32", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CONFIGMAP_STRING", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential", - { - "decl": "git_credential", - "type": "struct", - "value": "git_credential", - "file": "git2/credential.h", - "line": 84, - "lineto": 84, - "tdef": "typedef", - "description": " The base structure for all credential types", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_credential_acquire_cb", - "git_credential_default_new", - "git_credential_free", - "git_credential_get_username", - "git_credential_has_username", - "git_credential_ssh_custom_new", - "git_credential_ssh_interactive_new", - "git_credential_ssh_key_from_agent", - "git_credential_ssh_key_memory_new", - "git_credential_ssh_key_new", - "git_credential_username_new", - "git_credential_userpass", - "git_credential_userpass_plaintext_new" - ] - } - } - ], - [ - "git_credential_default", - { - "decl": "git_credential_default", - "type": "struct", - "value": "git_credential_default", - "file": "git2/credential.h", - "line": 92, - "lineto": 92, - "tdef": "typedef", - "description": " A key for NTLM/Kerberos \"default\" credentials ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_ssh_custom", - { - "decl": "git_credential_ssh_custom", - "type": "struct", - "value": "git_credential_ssh_custom", - "file": "git2/credential.h", - "line": 107, - "lineto": 107, - "tdef": "typedef", - "description": " A key with a custom signature function", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_ssh_interactive", - { - "decl": "git_credential_ssh_interactive", - "type": "struct", - "value": "git_credential_ssh_interactive", - "file": "git2/credential.h", - "line": 102, - "lineto": 102, - "tdef": "typedef", - "description": " Keyboard-interactive based ssh authentication", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_credential_ssh_interactive_new" - ] - } - } - ], - [ - "git_credential_ssh_key", - { - "decl": "git_credential_ssh_key", - "type": "struct", - "value": "git_credential_ssh_key", - "file": "git2/credential.h", - "line": 97, - "lineto": 97, - "tdef": "typedef", - "description": " A ssh key from disk", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_t", - { - "decl": [ - "GIT_CREDENTIAL_USERPASS_PLAINTEXT", - "GIT_CREDENTIAL_SSH_KEY", - "GIT_CREDENTIAL_SSH_CUSTOM", - "GIT_CREDENTIAL_DEFAULT", - "GIT_CREDENTIAL_SSH_INTERACTIVE", - "GIT_CREDENTIAL_USERNAME", - "GIT_CREDENTIAL_SSH_MEMORY" - ], - "type": "enum", - "file": "git2/credential.h", - "line": 27, - "lineto": 79, - "block": "GIT_CREDENTIAL_USERPASS_PLAINTEXT\nGIT_CREDENTIAL_SSH_KEY\nGIT_CREDENTIAL_SSH_CUSTOM\nGIT_CREDENTIAL_DEFAULT\nGIT_CREDENTIAL_SSH_INTERACTIVE\nGIT_CREDENTIAL_USERNAME\nGIT_CREDENTIAL_SSH_MEMORY", - "tdef": "typedef", - "description": " Supported credential types", - "comments": "

This represents the various types of authentication methods supported by the library.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_CREDENTIAL_USERPASS_PLAINTEXT", - "comments": "

A vanilla user/password request

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_KEY", - "comments": "

An SSH key-based authentication request

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_CUSTOM", - "comments": "

An SSH key-based authentication request, with a custom signature

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_DEFAULT", - "comments": "

An NTLM/Negotiate-based authentication request.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_INTERACTIVE", - "comments": "

An SSH interactive authentication request

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_USERNAME", - "comments": "

Username-only authentication request

\n\n

Used as a pre-authentication step if the underlying transport\n (eg. SSH, with no username in its URL) does not know which username\n to use.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_MEMORY", - "comments": "

An SSH key-based authentication request

\n\n

Allows credentials to be read from memory instead of files.\n Note that because of differences in crypto backend support, it might\n not be functional.

\n", - "value": 64 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_username", - { - "decl": "git_credential_username", - "type": "struct", - "value": "git_credential_username", - "file": "git2/credential.h", - "line": 89, - "lineto": 89, - "tdef": "typedef", - "description": " Username-only credential information ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_userpass_payload", - { - "decl": [ - "const char * username", - "const char * password" - ], - "type": "struct", - "value": "git_credential_userpass_payload", - "file": "git2/credential_helpers.h", - "line": 24, - "lineto": 27, - "block": "const char * username\nconst char * password", - "tdef": "typedef", - "description": " Payload for git_credential_userpass_plaintext.", - "comments": "", - "fields": [ - { - "type": "const char *", - "name": "username", - "comments": "" - }, - { - "type": "const char *", - "name": "password", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_delta_t", - { - "decl": [ - "GIT_DELTA_UNMODIFIED", - "GIT_DELTA_ADDED", - "GIT_DELTA_DELETED", - "GIT_DELTA_MODIFIED", - "GIT_DELTA_RENAMED", - "GIT_DELTA_COPIED", - "GIT_DELTA_IGNORED", - "GIT_DELTA_UNTRACKED", - "GIT_DELTA_TYPECHANGE", - "GIT_DELTA_UNREADABLE", - "GIT_DELTA_CONFLICTED" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 223, - "lineto": 235, - "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", - "tdef": "typedef", - "description": " What type of change is described by a git_diff_delta?", - "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE in the option flags (otherwise type changes will be split into ADDED / DELETED pairs).

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DELTA_UNMODIFIED", - "comments": "

no changes

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DELTA_ADDED", - "comments": "

entry does not exist in old version

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DELTA_DELETED", - "comments": "

entry does not exist in new version

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DELTA_MODIFIED", - "comments": "

entry content changed between old and new

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_DELTA_RENAMED", - "comments": "

entry was renamed between old and new

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DELTA_COPIED", - "comments": "

entry was copied from another old entry

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_DELTA_IGNORED", - "comments": "

entry is ignored item in workdir

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_DELTA_UNTRACKED", - "comments": "

entry is untracked item in workdir

\n", - "value": 7 - }, - { - "type": "int", - "name": "GIT_DELTA_TYPECHANGE", - "comments": "

type of entry changed between old and new

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_DELTA_UNREADABLE", - "comments": "

entry is unreadable

\n", - "value": 9 - }, - { - "type": "int", - "name": "GIT_DELTA_CONFLICTED", - "comments": "

entry in the index is conflicted

\n", - "value": 10 - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_num_deltas_of_type", - "git_diff_status_char" - ] - } - } - ], - [ - "git_describe_format_options", - { - "decl": [ - "unsigned int version", - "unsigned int abbreviated_size", - "int always_use_long_format", - "const char * dirty_suffix" - ], - "type": "struct", - "value": "git_describe_format_options", - "file": "git2/describe.h", - "line": 91, - "lineto": 111, - "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", - "tdef": "typedef", - "description": " Describe format options structure", - "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "abbreviated_size", - "comments": " Size of the abbreviated commit id to use. This value is the\n lower bound for the length of the abbreviated string. The\n default is 7." - }, - { - "type": "int", - "name": "always_use_long_format", - "comments": " Set to use the long format even when a shorter name could be used." - }, - { - "type": "const char *", - "name": "dirty_suffix", - "comments": " If the workdir is dirty and this is set, this string will\n be appended to the description string." - } - ], - "used": { - "returns": [], - "needs": [ - "git_describe_format", - "git_describe_format_options_init" - ] - } - } - ], - [ - "git_describe_options", - { - "decl": [ - "unsigned int version", - "unsigned int max_candidates_tags", - "unsigned int describe_strategy", - "const char * pattern", - "int only_follow_first_parent", - "int show_commit_oid_as_fallback" - ], - "type": "struct", - "value": "git_describe_options", - "file": "git2/describe.h", - "line": 43, - "lineto": 61, - "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", - "tdef": "typedef", - "description": " Describe options structure", - "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can use git_describe_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "max_candidates_tags", - "comments": " default: 10 " - }, - { - "type": "unsigned int", - "name": "describe_strategy", - "comments": " default: GIT_DESCRIBE_DEFAULT " - }, - { - "type": "const char *", - "name": "pattern", - "comments": "" - }, - { - "type": "int", - "name": "only_follow_first_parent", - "comments": " When calculating the distance from the matching tag or\n reference, only walk down the first-parent ancestry." - }, - { - "type": "int", - "name": "show_commit_oid_as_fallback", - "comments": " If no matching tag or reference is found, the describe\n operation would normally fail. If this option is set, it\n will instead fall back to showing the full id of the\n commit." - } - ], - "used": { - "returns": [], - "needs": [ - "git_describe_commit", - "git_describe_options_init", - "git_describe_workdir" - ] - } - } - ], - [ - "git_describe_result", - { - "decl": "git_describe_result", - "type": "struct", - "value": "git_describe_result", - "file": "git2/describe.h", - "line": 134, - "lineto": 134, - "tdef": "typedef", - "description": " A struct that stores the result of a describe operation.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_describe_commit", - "git_describe_format", - "git_describe_result_free", - "git_describe_workdir" - ] - } - } - ], - [ - "git_describe_strategy_t", - { - "decl": [ - "GIT_DESCRIBE_DEFAULT", - "GIT_DESCRIBE_TAGS", - "GIT_DESCRIBE_ALL" - ], - "type": "enum", - "file": "git2/describe.h", - "line": 30, - "lineto": 34, - "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", - "tdef": "typedef", - "description": " Reference lookup strategy", - "comments": "

These behave like the --tags and --all options to git-describe, namely they say to look for any reference in either refs/tags/ or refs/ respectively.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DESCRIBE_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DESCRIBE_TAGS", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DESCRIBE_ALL", - "comments": "", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff", - { - "decl": "git_diff", - "type": "struct", - "value": "git_diff", - "file": "git2/diff.h", - "line": 196, - "lineto": 196, - "tdef": "typedef", - "description": " The diff object that contains all individual file deltas.", - "comments": "

A diff represents the cumulative list of differences between two snapshots of a repository (possibly filtered by a set of file name patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of diffs then traversing it. This makes is easier to share logic across the various types of diffs (tree vs tree, workdir vs index, etc.), and also allows you to insert optional diff post-processing phases, such as rename detection, in between the steps. When you are done with a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", - "used": { - "returns": [ - "git_diff_get_delta", - "git_patch_get_delta", - "git_pathspec_match_list_diff_entry" - ], - "needs": [ - "git_apply", - "git_apply_delta_cb", - "git_apply_hunk_cb", - "git_apply_to_tree", - "git_checkout_notify_cb", - "git_diff_binary_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_commit_as_email", - "git_diff_file_cb", - "git_diff_find_options_init", - "git_diff_find_similar", - "git_diff_foreach", - "git_diff_format_email", - "git_diff_format_email_options_init", - "git_diff_free", - "git_diff_from_buffer", - "git_diff_get_delta", - "git_diff_get_stats", - "git_diff_hunk_cb", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_is_sorted_icase", - "git_diff_line_cb", - "git_diff_merge", - "git_diff_notify_cb", - "git_diff_num_deltas", - "git_diff_num_deltas_of_type", - "git_diff_options_init", - "git_diff_patchid", - "git_diff_patchid_options_init", - "git_diff_print", - "git_diff_progress_cb", - "git_diff_stats_deletions", - "git_diff_stats_files_changed", - "git_diff_stats_free", - "git_diff_stats_insertions", - "git_diff_stats_to_buf", - "git_diff_to_buf", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers", - "git_patch_from_diff", - "git_patch_get_hunk", - "git_patch_get_line_in_hunk", - "git_patch_print", - "git_pathspec_match_diff" - ] - } - } - ], - [ - "git_diff_binary", - { - "decl": [ - "unsigned int contains_data", - "git_diff_binary_file old_file", - "git_diff_binary_file new_file" - ], - "type": "struct", - "value": "git_diff_binary", - "file": "git2/diff.h", - "line": 527, - "lineto": 539, - "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", - "tdef": "typedef", - "description": " Structure describing the binary contents of a diff.", - "comments": "

A binary file / delta is a file (or pair) for which no text diffs should be generated. A diff can contain delta entries that are binary, but no diff content will be output for those files. There is a base heuristic for binary detection and you can further tune the behavior with git attributes or diff flags and option settings.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "contains_data", - "comments": " Whether there is data in this binary structure or not.\n\n If this is `1`, then this was produced and included binary content.\n If this is `0` then this was generated knowing only that a binary\n file changed but without providing the data, probably from a patch\n that said `Binary files a/file.txt and b/file.txt differ`." - }, - { - "type": "git_diff_binary_file", - "name": "old_file", - "comments": " The contents of the old file. " - }, - { - "type": "git_diff_binary_file", - "name": "new_file", - "comments": " The contents of the new file. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_binary_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach" - ] - } - } - ], - [ - "git_diff_binary_file", - { - "decl": [ - "git_diff_binary_t type", - "const char * data", - "size_t datalen", - "size_t inflatedlen" - ], - "type": "struct", - "value": "git_diff_binary_file", - "file": "git2/diff.h", - "line": 504, - "lineto": 516, - "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", - "tdef": "typedef", - "description": " The contents of one of the files in a binary diff. ", - "comments": "", - "fields": [ - { - "type": "git_diff_binary_t", - "name": "type", - "comments": " The type of binary data for this file. " - }, - { - "type": "const char *", - "name": "data", - "comments": " The binary data, deflated. " - }, - { - "type": "size_t", - "name": "datalen", - "comments": " The length of the binary data. " - }, - { - "type": "size_t", - "name": "inflatedlen", - "comments": " The length of the binary data after inflation. " - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_binary_t", - { - "decl": [ - "GIT_DIFF_BINARY_NONE", - "GIT_DIFF_BINARY_LITERAL", - "GIT_DIFF_BINARY_DELTA" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 492, - "lineto": 501, - "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", - "tdef": "typedef", - "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_BINARY_NONE", - "comments": "

There is no binary delta.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_BINARY_LITERAL", - "comments": "

The binary data is the literal contents of the file.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_BINARY_DELTA", - "comments": "

The binary data is the delta from one side to the other.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_delta", - { - "decl": [ - "git_delta_t status", - "uint32_t flags", - "uint16_t similarity", - "uint16_t nfiles", - "git_diff_file old_file", - "git_diff_file new_file" - ], - "type": "struct", - "value": "git_diff_delta", - "file": "git2/diff.h", - "line": 323, - "lineto": 330, - "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", - "tdef": "typedef", - "description": " Description of changes to one entry.", - "comments": "

A delta is a file pair with an old and new revision. The old version may be absent if the file was just created and the new version may be absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file represents to "to" side of the diff. What those means depend on the function that was used to generate the diff and will be documented below. You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file", they actually may correspond to entries that represent a file, a symbolic link, a submodule commit id, or even a tree (if you are tracking type changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will be filled in, but we generally try to fill in as much as possible. One example is that the "flags" field may not have either the BINARY or the NOT_BINARY flag set to avoid examining file contents if you do not pass in hunk and/or line callbacks to the diff foreach iteration function. It will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar() which does a similarity analysis of files in the diff. Use that function to do rename and copy detection, and to split heavily modified files in add/delete pairs. After that call, deltas with a status of GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to break, but to not actually break the records, then GIT_DELTA_MODIFIED records may have a non-zero similarity score if the self-similarity is below the split threshold. To display this value like core Git, invert the score (a la printf("M%03d", 100 - delta->similarity)).

\n", - "fields": [ - { - "type": "git_delta_t", - "name": "status", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " git_diff_flag_t values " - }, - { - "type": "uint16_t", - "name": "similarity", - "comments": " for RENAMED and COPIED, value 0-100 " - }, - { - "type": "uint16_t", - "name": "nfiles", - "comments": " number of files in this delta " - }, - { - "type": "git_diff_file", - "name": "old_file", - "comments": "" - }, - { - "type": "git_diff_file", - "name": "new_file", - "comments": "" - } - ], - "used": { - "returns": [ - "git_diff_get_delta", - "git_patch_get_delta", - "git_pathspec_match_list_diff_entry" - ], - "needs": [ - "git_apply_delta_cb", - "git_diff_binary_cb", - "git_diff_file_cb", - "git_diff_hunk_cb", - "git_diff_line_cb", - "git_diff_notify_cb" - ] - } - } - ], - [ - "git_diff_file", - { - "decl": [ - "git_oid id", - "const char * path", - "git_object_size_t size", - "uint32_t flags", - "uint16_t mode", - "uint16_t id_abbrev" - ], - "type": "struct", - "value": "git_diff_file", - "file": "git2/diff.h", - "line": 244, - "lineto": 281, - "block": "git_oid id\nconst char * path\ngit_object_size_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", - "tdef": "typedef", - "description": " Description of one side of a delta.", - "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n", - "fields": [ - { - "type": "git_oid", - "name": "id", - "comments": " The `git_oid` of the item. If the entry represents an\n absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta),\n then the oid will be zeroes." - }, - { - "type": "const char *", - "name": "path", - "comments": " The NUL-terminated path to the entry relative to the working\n directory of the repository." - }, - { - "type": "git_object_size_t", - "name": "size", - "comments": " The size of the entry in bytes." - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of the `git_diff_flag_t` types" - }, - { - "type": "uint16_t", - "name": "mode", - "comments": " Roughly, the stat() `st_mode` value for the item. This will\n be restricted to one of the `git_filemode_t` values." - }, - { - "type": "uint16_t", - "name": "id_abbrev", - "comments": " Represents the known length of the `id` field, when\n converted to a hex string. It is generally `GIT_OID_HEXSZ`, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters." - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_notify_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach" - ] - } - } - ], - [ - "git_diff_find_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "uint16_t rename_threshold", - "uint16_t rename_from_rewrite_threshold", - "uint16_t copy_threshold", - "uint16_t break_rewrite_threshold", - "size_t rename_limit", - "git_diff_similarity_metric * metric" - ], - "type": "struct", - "value": "git_diff_find_options", - "file": "git2/diff.h", - "line": 732, - "lineto": 786, - "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", - "tdef": "typedef", - "description": " Control behavior of rename and copy detection", - "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing." - }, - { - "type": "uint16_t", - "name": "rename_threshold", - "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." - }, - { - "type": "uint16_t", - "name": "rename_from_rewrite_threshold", - "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." - }, - { - "type": "uint16_t", - "name": "copy_threshold", - "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." - }, - { - "type": "uint16_t", - "name": "break_rewrite_threshold", - "comments": " Treshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." - }, - { - "type": "size_t", - "name": "rename_limit", - "comments": " Maximum number of matches to consider for a particular file.\n\n This is a little different from the `-l` option from Git because we\n will still process up to this many matches before abandoning the search.\n Defaults to 200." - }, - { - "type": "git_diff_similarity_metric *", - "name": "metric", - "comments": " The `metric` option allows you to plug in a custom similarity metric.\n\n Set it to NULL to use the default internal metric.\n\n The default metric is based on sampling hashes of ranges of data in\n the file, which is a pretty good similarity approximation that should\n work fairly well for both text and binary data while still being\n pretty fast with a fixed memory overhead." - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_find_options_init", - "git_diff_find_similar" - ] - } - } - ], - [ - "git_diff_find_t", - { - "decl": [ - "GIT_DIFF_FIND_BY_CONFIG", - "GIT_DIFF_FIND_RENAMES", - "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", - "GIT_DIFF_FIND_COPIES", - "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", - "GIT_DIFF_FIND_REWRITES", - "GIT_DIFF_BREAK_REWRITES", - "GIT_DIFF_FIND_AND_BREAK_REWRITES", - "GIT_DIFF_FIND_FOR_UNTRACKED", - "GIT_DIFF_FIND_ALL", - "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", - "GIT_DIFF_FIND_IGNORE_WHITESPACE", - "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", - "GIT_DIFF_FIND_EXACT_MATCH_ONLY", - "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", - "GIT_DIFF_FIND_REMOVE_UNMODIFIED" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 641, - "lineto": 710, - "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", - "tdef": "typedef", - "description": " Flags to control the behavior of diff rename/copy detection.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FIND_BY_CONFIG", - "comments": "

Obey diff.renames. Overridden by any other GIT_DIFF_FIND_... flag.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_RENAMES", - "comments": "

Look for renames? (--find-renames)

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", - "comments": "

Consider old side of MODIFIED for renames? (--break-rewrites=N)

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_COPIES", - "comments": "

Look for copies? (a la --find-copies).

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", - "comments": "

Consider UNMODIFIED as copy sources? (--find-copies-harder).

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNMODIFIED when\n the initial git_diff is being generated.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_REWRITES", - "comments": "

Mark significant rewrites for split (--break-rewrites=/M)

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_DIFF_BREAK_REWRITES", - "comments": "

Actually split large rewrites into delete/add pairs

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_AND_BREAK_REWRITES", - "comments": "

Mark rewrites for split and break into delete/add pairs

\n", - "value": 48 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_FOR_UNTRACKED", - "comments": "

Find renames/copies for UNTRACKED items in working directory.

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNTRACKED when the\n initial git_diff is being generated (and obviously the diff must\n be against the working directory for this to make sense).

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_ALL", - "comments": "

Turn on all finding features.

\n", - "value": 255 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", - "comments": "

Measure similarity ignoring leading whitespace (default)

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_IGNORE_WHITESPACE", - "comments": "

Measure similarity ignoring all whitespace

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", - "comments": "

Measure similarity including all data

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_EXACT_MATCH_ONLY", - "comments": "

Measure similarity only by comparing SHAs (fast and cheap)

\n", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", - "comments": "

Do not break rewrites unless they contribute to a rename.

\n\n

Normally, GIT_DIFF_FIND_AND_BREAK_REWRITES will measure the self-\n similarity of modified files and split the ones that have changed a\n lot into a DELETE / ADD pair. Then the sides of that pair will be\n considered candidates for rename and copy detection.

\n\n

If you add this flag in and the split pair is not used for an\n actual rename or copy, then the modified record will be restored to\n a regular MODIFIED record instead of being split.

\n", - "value": 32768 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_REMOVE_UNMODIFIED", - "comments": "

Remove any UNMODIFIED deltas after find_similar is done.

\n\n

Using GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED to emulate the\n --find-copies-harder behavior requires building a diff with the\n GIT_DIFF_INCLUDE_UNMODIFIED flag. If you do not want UNMODIFIED\n records in the final result, pass this flag to have them removed.

\n", - "value": 65536 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_flag_t", - { - "decl": [ - "GIT_DIFF_FLAG_BINARY", - "GIT_DIFF_FLAG_NOT_BINARY", - "GIT_DIFF_FLAG_VALID_ID", - "GIT_DIFF_FLAG_EXISTS" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 206, - "lineto": 211, - "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS", - "tdef": "typedef", - "description": " Flags for the delta object and the file objects on each side.", - "comments": "

These flags are used for both the flags value of the git_diff_delta and the flags for the git_diff_file objects representing the old and new sides of the delta. Values outside of this public range should be considered reserved for internal or future use.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FLAG_BINARY", - "comments": "

file(s) treated as binary data

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_FLAG_NOT_BINARY", - "comments": "

file(s) treated as text data

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_FLAG_VALID_ID", - "comments": "

id value is known correct

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_FLAG_EXISTS", - "comments": "

file exists at this side of the delta

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_format_email_flags_t", - { - "decl": [ - "GIT_DIFF_FORMAT_EMAIL_NONE", - "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER" - ], - "type": "enum", - "file": "git2/deprecated.h", - "line": 311, - "lineto": 318, - "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", - "tdef": "typedef", - "description": " Formatting options for diff e-mail generation", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FORMAT_EMAIL_NONE", - "comments": "

Normal patch, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", - "comments": "

Don't insert "[PATCH]" in the subject header

\n", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_format_email_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "size_t patch_no", - "size_t total_patches", - "const git_oid * id", - "const char * summary", - "const char * body", - "const git_signature * author" - ], - "type": "struct", - "value": "git_diff_format_email_options", - "file": "git2/deprecated.h", - "line": 323, - "lineto": 346, - "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", - "tdef": "typedef", - "description": " Options for controlling the formatting of the generated e-mail.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " see `git_diff_format_email_flags_t` above " - }, - { - "type": "size_t", - "name": "patch_no", - "comments": " This patch number " - }, - { - "type": "size_t", - "name": "total_patches", - "comments": " Total number of patches in this series " - }, - { - "type": "const git_oid *", - "name": "id", - "comments": " id to use for the commit " - }, - { - "type": "const char *", - "name": "summary", - "comments": " Summary of the change " - }, - { - "type": "const char *", - "name": "body", - "comments": " Commit message's body " - }, - { - "type": "const git_signature *", - "name": "author", - "comments": " Author of the change " - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_format_email", - "git_diff_format_email_options_init" - ] - } - } - ], - [ - "git_diff_format_t", - { - "decl": [ - "GIT_DIFF_FORMAT_PATCH", - "GIT_DIFF_FORMAT_PATCH_HEADER", - "GIT_DIFF_FORMAT_RAW", - "GIT_DIFF_FORMAT_NAME_ONLY", - "GIT_DIFF_FORMAT_NAME_STATUS", - "GIT_DIFF_FORMAT_PATCH_ID" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 1104, - "lineto": 1111, - "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", - "tdef": "typedef", - "description": " Possible output formats for diff data", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FORMAT_PATCH", - "comments": "

full git diff

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_PATCH_HEADER", - "comments": "

just the file headers of patch

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_RAW", - "comments": "

like git diff --raw

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_NAME_ONLY", - "comments": "

like git diff --name-only

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_NAME_STATUS", - "comments": "

like git diff --name-status

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_PATCH_ID", - "comments": "

git diff as used by git patch-id

\n", - "value": 6 - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_print", - "git_diff_to_buf" - ] - } - } - ], - [ - "git_diff_hunk", - { - "decl": [ - "int old_start", - "int old_lines", - "int new_start", - "int new_lines", - "size_t header_len", - "char [128] header" - ], - "type": "struct", - "value": "git_diff_hunk", - "file": "git2/diff.h", - "line": 559, - "lineto": 566, - "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", - "tdef": "typedef", - "description": " Structure describing a hunk of a diff.", - "comments": "

A hunk is a span of modified lines in a delta along with some stable surrounding context. You can configure the amount of context and other properties of how hunks are generated. Each hunk also comes with a header that described where it starts and ends in both the old and new versions in the delta.

\n", - "fields": [ - { - "type": "int", - "name": "old_start", - "comments": " Starting line number in old_file " - }, - { - "type": "int", - "name": "old_lines", - "comments": " Number of lines in old_file " - }, - { - "type": "int", - "name": "new_start", - "comments": " Starting line number in new_file " - }, - { - "type": "int", - "name": "new_lines", - "comments": " Number of lines in new_file " - }, - { - "type": "size_t", - "name": "header_len", - "comments": " Number of bytes in header text " - }, - { - "type": "char [128]", - "name": "header", - "comments": " Header text, NUL-byte terminated " - } - ], - "used": { - "returns": [], - "needs": [ - "git_apply_hunk_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach", - "git_diff_hunk_cb", - "git_diff_line_cb", - "git_patch_get_hunk" - ] - } - } - ], - [ - "git_diff_line", - { - "decl": [ - "char origin", - "int old_lineno", - "int new_lineno", - "int num_lines", - "size_t content_len", - "git_off_t content_offset", - "const char * content" - ], - "type": "struct", - "value": "git_diff_line", - "file": "git2/diff.h", - "line": 614, - "lineto": 622, - "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", - "tdef": "typedef", - "description": " Structure describing a line (or data span) of a diff.", - "comments": "

A line is a range of characters inside a hunk. It could be a context line (i.e. in both old and new versions), an added line (i.e. only in the new version), or a removed line (i.e. only in the old version). Unfortunately, we don't know anything about the encoding of data in the file being diffed, so we cannot tell you much about the line content. Line data will not be NUL-byte terminated, however, because it will be just a span of bytes inside the larger file.

\n", - "fields": [ - { - "type": "char", - "name": "origin", - "comments": " A git_diff_line_t value " - }, - { - "type": "int", - "name": "old_lineno", - "comments": " Line number in old file or -1 for added line " - }, - { - "type": "int", - "name": "new_lineno", - "comments": " Line number in new file or -1 for deleted line " - }, - { - "type": "int", - "name": "num_lines", - "comments": " Number of newline characters in content " - }, - { - "type": "size_t", - "name": "content_len", - "comments": " Number of bytes of data " - }, - { - "type": "git_off_t", - "name": "content_offset", - "comments": " Offset in the original file to the content " - }, - { - "type": "const char *", - "name": "content", - "comments": " Pointer to diff text, not NUL-byte terminated " - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach", - "git_diff_line_cb", - "git_diff_print", - "git_patch_get_line_in_hunk", - "git_patch_print" - ] - } - } - ], - [ - "git_diff_line_t", - { - "decl": [ - "GIT_DIFF_LINE_CONTEXT", - "GIT_DIFF_LINE_ADDITION", - "GIT_DIFF_LINE_DELETION", - "GIT_DIFF_LINE_CONTEXT_EOFNL", - "GIT_DIFF_LINE_ADD_EOFNL", - "GIT_DIFF_LINE_DEL_EOFNL", - "GIT_DIFF_LINE_FILE_HDR", - "GIT_DIFF_LINE_HUNK_HDR", - "GIT_DIFF_LINE_BINARY" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 585, - "lineto": 601, - "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", - "tdef": "typedef", - "description": " Line origin constants.", - "comments": "

These values describe where a line came from and will be passed to the git_diff_line_cb when iterating over a diff. There are some special origin constants at the end that are used for the text output callbacks to demarcate lines that are actually part of the file or hunk headers.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_LINE_CONTEXT", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_ADDITION", - "comments": "", - "value": 43 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_DELETION", - "comments": "", - "value": 45 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_CONTEXT_EOFNL", - "comments": "

Both files have no LF at end

\n", - "value": 61 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_ADD_EOFNL", - "comments": "

Old has no LF at end, new does

\n", - "value": 62 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_DEL_EOFNL", - "comments": "

Old has LF at end, new does not

\n", - "value": 60 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_FILE_HDR", - "comments": "", - "value": 70 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_HUNK_HDR", - "comments": "", - "value": 72 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_BINARY", - "comments": "

For "Binary files x and y differ"

\n", - "value": 66 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_option_t", - { - "decl": [ - "GIT_DIFF_NORMAL", - "GIT_DIFF_REVERSE", - "GIT_DIFF_INCLUDE_IGNORED", - "GIT_DIFF_RECURSE_IGNORED_DIRS", - "GIT_DIFF_INCLUDE_UNTRACKED", - "GIT_DIFF_RECURSE_UNTRACKED_DIRS", - "GIT_DIFF_INCLUDE_UNMODIFIED", - "GIT_DIFF_INCLUDE_TYPECHANGE", - "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", - "GIT_DIFF_IGNORE_FILEMODE", - "GIT_DIFF_IGNORE_SUBMODULES", - "GIT_DIFF_IGNORE_CASE", - "GIT_DIFF_INCLUDE_CASECHANGE", - "GIT_DIFF_DISABLE_PATHSPEC_MATCH", - "GIT_DIFF_SKIP_BINARY_CHECK", - "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", - "GIT_DIFF_UPDATE_INDEX", - "GIT_DIFF_INCLUDE_UNREADABLE", - "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", - "GIT_DIFF_INDENT_HEURISTIC", - "GIT_DIFF_IGNORE_BLANK_LINES", - "GIT_DIFF_FORCE_TEXT", - "GIT_DIFF_FORCE_BINARY", - "GIT_DIFF_IGNORE_WHITESPACE", - "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", - "GIT_DIFF_IGNORE_WHITESPACE_EOL", - "GIT_DIFF_SHOW_UNTRACKED_CONTENT", - "GIT_DIFF_SHOW_UNMODIFIED", - "GIT_DIFF_PATIENCE", - "GIT_DIFF_MINIMAL", - "GIT_DIFF_SHOW_BINARY" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 28, - "lineto": 174, - "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_IGNORE_BLANK_LINES\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", - "tdef": "typedef", - "description": " Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_NORMAL", - "comments": "

Normal diff, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_REVERSE", - "comments": "

Reverse the sides of the diff

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_IGNORED", - "comments": "

Include ignored files in the diff

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_RECURSE_IGNORED_DIRS", - "comments": "

Even with GIT_DIFF_INCLUDE_IGNORED, an entire ignored directory\n will be marked with only a single entry in the diff; this flag\n adds all files under the directory as IGNORED entries, too.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNTRACKED", - "comments": "

Include untracked files in the diff

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_DIFF_RECURSE_UNTRACKED_DIRS", - "comments": "

Even with GIT_DIFF_INCLUDE_UNTRACKED, an entire untracked\n directory will be marked with only a single entry in the diff\n (a la what core Git does in git status); this flag adds all\n files under untracked directories as UNTRACKED entries, too.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNMODIFIED", - "comments": "

Include unmodified files in the diff

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_TYPECHANGE", - "comments": "

Normally, a type change between files will be converted into a\n DELETED record for the old and an ADDED record for the new; this\n options enabled the generation of TYPECHANGE delta records.

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", - "comments": "

Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still\n generally show as a DELETED blob. This flag tries to correctly\n label blob->tree transitions as TYPECHANGE records with new_file's\n mode set to tree. Note: the tree SHA will not be available.

\n", - "value": 128 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_FILEMODE", - "comments": "

Ignore file mode changes

\n", - "value": 256 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_SUBMODULES", - "comments": "

Treat all submodules as unmodified

\n", - "value": 512 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_CASE", - "comments": "

Use case insensitive filename comparisons

\n", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_CASECHANGE", - "comments": "

May be combined with GIT_DIFF_IGNORE_CASE to specify that a file\n that has changed case will be returned as an add/delete pair.

\n", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_DIFF_DISABLE_PATHSPEC_MATCH", - "comments": "

If the pathspec is set in the diff options, this flags indicates\n that the paths will be treated as literal paths instead of\n fnmatch patterns. Each path in the list must either be a full\n path to a file or a directory. (A trailing slash indicates that\n the path will only match a directory). If a directory is\n specified, all children will be included.

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_DIFF_SKIP_BINARY_CHECK", - "comments": "

Disable updating of the binary flag in delta records. This is\n useful when iterating over a diff if you don't need hunk and data\n callbacks and want to avoid having to load file completely.

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", - "comments": "

When diff finds an untracked directory, to match the behavior of\n core Git, it scans the contents for IGNORED and UNTRACKED files.\n If all contents are IGNORED, then the directory is IGNORED; if\n any contents are not IGNORED, then the directory is UNTRACKED.\n This is extra work that may not matter in many cases. This flag\n turns off that scan and immediately labels an untracked directory\n as UNTRACKED (changing the behavior to not match core Git).

\n", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_DIFF_UPDATE_INDEX", - "comments": "

When diff finds a file in the working directory with stat\n information different from the index, but the OID ends up being the\n same, write the correct stat information into the index. Note:\n without this flag, diff will always leave the index untouched.

\n", - "value": 32768 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNREADABLE", - "comments": "

Include unreadable files in the diff

\n", - "value": 65536 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", - "comments": "

Include unreadable files in the diff

\n", - "value": 131072 - }, - { - "type": "int", - "name": "GIT_DIFF_INDENT_HEURISTIC", - "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", - "value": 262144 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_BLANK_LINES", - "comments": "

Ignore blank lines

\n", - "value": 524288 - }, - { - "type": "int", - "name": "GIT_DIFF_FORCE_TEXT", - "comments": "

Treat all files as text, disabling binary attributes \n&\n detection

\n", - "value": 1048576 - }, - { - "type": "int", - "name": "GIT_DIFF_FORCE_BINARY", - "comments": "

Treat all files as binary, disabling text diffs

\n", - "value": 2097152 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_WHITESPACE", - "comments": "

Ignore all whitespace

\n", - "value": 4194304 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", - "comments": "

Ignore changes in amount of whitespace

\n", - "value": 8388608 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_WHITESPACE_EOL", - "comments": "

Ignore whitespace at end of line

\n", - "value": 16777216 - }, - { - "type": "int", - "name": "GIT_DIFF_SHOW_UNTRACKED_CONTENT", - "comments": "

When generating patch text, include the content of untracked\n files. This automatically turns on GIT_DIFF_INCLUDE_UNTRACKED but\n it does not turn on GIT_DIFF_RECURSE_UNTRACKED_DIRS. Add that\n flag if you want the content of every single UNTRACKED file.

\n", - "value": 33554432 - }, - { - "type": "int", - "name": "GIT_DIFF_SHOW_UNMODIFIED", - "comments": "

When generating output, include the names of unmodified files if\n they are included in the git_diff. Normally these are skipped in\n the formats that list files (e.g. name-only, name-status, raw).\n Even with this, these will not be included in patch format.

\n", - "value": 67108864 - }, - { - "type": "int", - "name": "GIT_DIFF_PATIENCE", - "comments": "

Use the "patience diff" algorithm

\n", - "value": 268435456 - }, - { - "type": "int", - "name": "GIT_DIFF_MINIMAL", - "comments": "

Take extra time to find minimal diff

\n", - "value": 536870912 - }, - { - "type": "int", - "name": "GIT_DIFF_SHOW_BINARY", - "comments": "

Include the necessary deflate / delta information so that git-apply\n can apply given diff information to binary files.

\n", - "value": 1073741824 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "git_submodule_ignore_t ignore_submodules", - "git_strarray pathspec", - "git_diff_notify_cb notify_cb", - "git_diff_progress_cb progress_cb", - "void * payload", - "uint32_t context_lines", - "uint32_t interhunk_lines", - "uint16_t id_abbrev", - "git_off_t max_size", - "const char * old_prefix", - "const char * new_prefix" - ], - "type": "struct", - "value": "git_diff_options", - "file": "git2/diff.h", - "line": 375, - "lineto": 447, - "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", - "tdef": "typedef", - "description": " Structure describing options about how the diff should be executed.", - "comments": "

Setting all values of the structure to zero will yield the default values. Similarly, passing NULL for the options structure will give the defaults. The default values are marked below.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " version for the struct " - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" - }, - { - "type": "git_submodule_ignore_t", - "name": "ignore_submodules", - "comments": " Overrides the submodule ignore setting for all submodules in the diff. " - }, - { - "type": "git_strarray", - "name": "pathspec", - "comments": " An array of paths / fnmatch patterns to constrain diff.\n All paths are included by default." - }, - { - "type": "git_diff_notify_cb", - "name": "notify_cb", - "comments": " An optional callback function, notifying the consumer of changes to\n the diff as new deltas are added." - }, - { - "type": "git_diff_progress_cb", - "name": "progress_cb", - "comments": " An optional callback function, notifying the consumer of which files\n are being examined as the diff is generated." - }, - { - "type": "void *", - "name": "payload", - "comments": " The payload to pass to the callback functions. " - }, - { - "type": "uint32_t", - "name": "context_lines", - "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." - }, - { - "type": "uint32_t", - "name": "interhunk_lines", - "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." - }, - { - "type": "uint16_t", - "name": "id_abbrev", - "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." - }, - { - "type": "git_off_t", - "name": "max_size", - "comments": " A size (in bytes) above which a blob will be marked as binary\n automatically; pass a negative value to disable.\n Defaults to 512MB." - }, - { - "type": "const char *", - "name": "old_prefix", - "comments": " The virtual \"directory\" prefix for old file names in hunk headers.\n Default is \"a\"." - }, - { - "type": "const char *", - "name": "new_prefix", - "comments": " The virtual \"directory\" prefix for new file names in hunk headers.\n Defaults to \"b\"." - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_commit_as_email", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_options_init", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers" - ] - } - } - ], - [ - "git_diff_patchid_options", - { - "decl": [ - "unsigned int version" - ], - "type": "struct", - "value": "git_diff_patchid_options", - "file": "git2/diff.h", - "line": 1385, - "lineto": 1387, - "block": "unsigned int version", - "tdef": "typedef", - "description": " Patch ID options structure", - "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_patchid", - "git_diff_patchid_options_init" - ] - } - } - ], - [ - "git_diff_similarity_metric", - { - "decl": [ - "int (*)(void **, const git_diff_file *, const char *, void *) file_signature", - "int (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature", - "void (*)(void *, void *) free_signature", - "int (*)(int *, void *, void *, void *) similarity", - "void * payload" - ], - "type": "struct", - "value": "git_diff_similarity_metric", - "file": "git2/diff.h", - "line": 715, - "lineto": 725, - "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", - "tdef": "typedef", - "description": " Pluggable similarity metric", - "comments": "", - "fields": [ - { - "type": "int (*)(void **, const git_diff_file *, const char *, void *)", - "name": "file_signature", - "comments": "" - }, - { - "type": "int (*)(void **, const git_diff_file *, const char *, size_t, void *)", - "name": "buffer_signature", - "comments": "" - }, - { - "type": "void (*)(void *, void *)", - "name": "free_signature", - "comments": "" - }, - { - "type": "int (*)(int *, void *, void *, void *)", - "name": "similarity", - "comments": "" - }, - { - "type": "void *", - "name": "payload", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_stats", - { - "decl": "git_diff_stats", - "type": "struct", - "value": "git_diff_stats", - "file": "git2/diff.h", - "line": 1295, - "lineto": 1295, - "tdef": "typedef", - "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_diff_get_stats", - "git_diff_stats_deletions", - "git_diff_stats_files_changed", - "git_diff_stats_free", - "git_diff_stats_insertions", - "git_diff_stats_to_buf" - ] - } - } - ], - [ - "git_diff_stats_format_t", - { - "decl": [ - "GIT_DIFF_STATS_NONE", - "GIT_DIFF_STATS_FULL", - "GIT_DIFF_STATS_SHORT", - "GIT_DIFF_STATS_NUMBER", - "GIT_DIFF_STATS_INCLUDE_SUMMARY" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 1300, - "lineto": 1315, - "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", - "tdef": "typedef", - "description": " Formatting options for diff stats", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_STATS_NONE", - "comments": "

No stats

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_FULL", - "comments": "

Full statistics, equivalent of --stat

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_SHORT", - "comments": "

Short statistics, equivalent of --shortstat

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_NUMBER", - "comments": "

Number statistics, equivalent of --numstat

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_INCLUDE_SUMMARY", - "comments": "

Extended header information such as creations, renames and mode changes, equivalent of --summary

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_stats_to_buf" - ] - } - } - ], - [ - "git_direction", - { - "decl": [ - "GIT_DIRECTION_FETCH", - "GIT_DIRECTION_PUSH" - ], - "type": "enum", - "file": "git2/net.h", - "line": 31, - "lineto": 34, - "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", - "tdef": "typedef", - "description": " Direction of the connection.", - "comments": "

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.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DIRECTION_FETCH", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIRECTION_PUSH", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [ - "git_refspec_direction" - ], - "needs": [ - "git_remote_connect" - ] - } - } - ], - [ - "git_email_create_flags_t", - { - "decl": [ - "GIT_EMAIL_CREATE_DEFAULT", - "GIT_EMAIL_CREATE_OMIT_NUMBERS", - "GIT_EMAIL_CREATE_ALWAYS_NUMBER", - "GIT_EMAIL_CREATE_NO_RENAMES" - ], - "type": "enum", - "file": "git2/email.h", - "line": 23, - "lineto": 38, - "block": "GIT_EMAIL_CREATE_DEFAULT\nGIT_EMAIL_CREATE_OMIT_NUMBERS\nGIT_EMAIL_CREATE_ALWAYS_NUMBER\nGIT_EMAIL_CREATE_NO_RENAMES", - "tdef": "typedef", - "description": " Formatting options for diff e-mail generation", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_EMAIL_CREATE_DEFAULT", - "comments": "

Normal patch, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_EMAIL_CREATE_OMIT_NUMBERS", - "comments": "

Do not include patch numbers in the subject prefix.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_EMAIL_CREATE_ALWAYS_NUMBER", - "comments": "

Include numbers in the subject prefix even when the\n patch is for a single commit (1/1).

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_EMAIL_CREATE_NO_RENAMES", - "comments": "

Do not perform rename or similarity detection.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_error", - { - "decl": [ - "char * message", - "int klass" - ], - "type": "struct", - "value": "git_error", - "file": "git2/errors.h", - "line": 70, - "lineto": 73, - "block": "char * message\nint klass", - "tdef": "typedef", - "description": " Structure to store extra details of the last error that occurred.", - "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", - "fields": [ - { - "type": "char *", - "name": "message", - "comments": "" - }, - { - "type": "int", - "name": "klass", - "comments": "" - } - ], - "used": { - "returns": [ - "git_error_last", - "giterr_last" - ], - "needs": [] - } - } - ], - [ - "git_error_code", - { - "decl": [ - "GIT_OK", - "GIT_ERROR", - "GIT_ENOTFOUND", - "GIT_EEXISTS", - "GIT_EAMBIGUOUS", - "GIT_EBUFS", - "GIT_EUSER", - "GIT_EBAREREPO", - "GIT_EUNBORNBRANCH", - "GIT_EUNMERGED", - "GIT_ENONFASTFORWARD", - "GIT_EINVALIDSPEC", - "GIT_ECONFLICT", - "GIT_ELOCKED", - "GIT_EMODIFIED", - "GIT_EAUTH", - "GIT_ECERTIFICATE", - "GIT_EAPPLIED", - "GIT_EPEEL", - "GIT_EEOF", - "GIT_EINVALID", - "GIT_EUNCOMMITTED", - "GIT_EDIRECTORY", - "GIT_EMERGECONFLICT", - "GIT_PASSTHROUGH", - "GIT_ITEROVER", - "GIT_RETRY", - "GIT_EMISMATCH", - "GIT_EINDEXDIRTY", - "GIT_EAPPLYFAIL", - "GIT_EOWNER" - ], - "type": "enum", - "file": "git2/errors.h", - "line": 21, - "lineto": 62, - "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL\nGIT_EOWNER", - "tdef": "typedef", - "description": " Generic return codes ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_OK", - "comments": "

No error

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_ERROR", - "comments": "

Generic error

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_ENOTFOUND", - "comments": "

Requested object could not be found

\n", - "value": -3 - }, - { - "type": "int", - "name": "GIT_EEXISTS", - "comments": "

Object exists preventing operation

\n", - "value": -4 - }, - { - "type": "int", - "name": "GIT_EAMBIGUOUS", - "comments": "

More than one object matches

\n", - "value": -5 - }, - { - "type": "int", - "name": "GIT_EBUFS", - "comments": "

Output buffer too short to hold data

\n", - "value": -6 - }, - { - "type": "int", - "name": "GIT_EUSER", - "comments": "

GIT_EUSER is a special error that is never generated by libgit2\n code. You can return it from a callback (e.g to stop an iteration)\n to know that it was generated by the callback and not by libgit2.

\n", - "value": -7 - }, - { - "type": "int", - "name": "GIT_EBAREREPO", - "comments": "

Operation not allowed on bare repository

\n", - "value": -8 - }, - { - "type": "int", - "name": "GIT_EUNBORNBRANCH", - "comments": "

HEAD refers to branch with no commits

\n", - "value": -9 - }, - { - "type": "int", - "name": "GIT_EUNMERGED", - "comments": "

Merge in progress prevented operation

\n", - "value": -10 - }, - { - "type": "int", - "name": "GIT_ENONFASTFORWARD", - "comments": "

Reference was not fast-forwardable

\n", - "value": -11 - }, - { - "type": "int", - "name": "GIT_EINVALIDSPEC", - "comments": "

Name/ref spec was not in a valid format

\n", - "value": -12 - }, - { - "type": "int", - "name": "GIT_ECONFLICT", - "comments": "

Checkout conflicts prevented operation

\n", - "value": -13 - }, - { - "type": "int", - "name": "GIT_ELOCKED", - "comments": "

Lock file prevented operation

\n", - "value": -14 - }, - { - "type": "int", - "name": "GIT_EMODIFIED", - "comments": "

Reference value does not match expected

\n", - "value": -15 - }, - { - "type": "int", - "name": "GIT_EAUTH", - "comments": "

Authentication error

\n", - "value": -16 - }, - { - "type": "int", - "name": "GIT_ECERTIFICATE", - "comments": "

Server certificate is invalid

\n", - "value": -17 - }, - { - "type": "int", - "name": "GIT_EAPPLIED", - "comments": "

Patch/merge has already been applied

\n", - "value": -18 - }, - { - "type": "int", - "name": "GIT_EPEEL", - "comments": "

The requested peel operation is not possible

\n", - "value": -19 - }, - { - "type": "int", - "name": "GIT_EEOF", - "comments": "

Unexpected EOF

\n", - "value": -20 - }, - { - "type": "int", - "name": "GIT_EINVALID", - "comments": "

Invalid operation or input

\n", - "value": -21 - }, - { - "type": "int", - "name": "GIT_EUNCOMMITTED", - "comments": "

Uncommitted changes in index prevented operation

\n", - "value": -22 - }, - { - "type": "int", - "name": "GIT_EDIRECTORY", - "comments": "

The operation is not valid for a directory

\n", - "value": -23 - }, - { - "type": "int", - "name": "GIT_EMERGECONFLICT", - "comments": "

A merge conflict exists and cannot continue

\n", - "value": -24 - }, - { - "type": "int", - "name": "GIT_PASSTHROUGH", - "comments": "

A user-configured callback refused to act

\n", - "value": -30 - }, - { - "type": "int", - "name": "GIT_ITEROVER", - "comments": "

Signals end of iteration with iterator

\n", - "value": -31 - }, - { - "type": "int", - "name": "GIT_RETRY", - "comments": "

Internal only

\n", - "value": -32 - }, - { - "type": "int", - "name": "GIT_EMISMATCH", - "comments": "

Hashsum mismatch in object

\n", - "value": -33 - }, - { - "type": "int", - "name": "GIT_EINDEXDIRTY", - "comments": "

Unsaved changes in the index would be overwritten

\n", - "value": -34 - }, - { - "type": "int", - "name": "GIT_EAPPLYFAIL", - "comments": "

Patch application failed

\n", - "value": -35 - }, - { - "type": "int", - "name": "GIT_EOWNER", - "comments": "

The object is not owned by the current user

\n", - "value": -36 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_error_t", - { - "decl": [ - "GIT_ERROR_NONE", - "GIT_ERROR_NOMEMORY", - "GIT_ERROR_OS", - "GIT_ERROR_INVALID", - "GIT_ERROR_REFERENCE", - "GIT_ERROR_ZLIB", - "GIT_ERROR_REPOSITORY", - "GIT_ERROR_CONFIG", - "GIT_ERROR_REGEX", - "GIT_ERROR_ODB", - "GIT_ERROR_INDEX", - "GIT_ERROR_OBJECT", - "GIT_ERROR_NET", - "GIT_ERROR_TAG", - "GIT_ERROR_TREE", - "GIT_ERROR_INDEXER", - "GIT_ERROR_SSL", - "GIT_ERROR_SUBMODULE", - "GIT_ERROR_THREAD", - "GIT_ERROR_STASH", - "GIT_ERROR_CHECKOUT", - "GIT_ERROR_FETCHHEAD", - "GIT_ERROR_MERGE", - "GIT_ERROR_SSH", - "GIT_ERROR_FILTER", - "GIT_ERROR_REVERT", - "GIT_ERROR_CALLBACK", - "GIT_ERROR_CHERRYPICK", - "GIT_ERROR_DESCRIBE", - "GIT_ERROR_REBASE", - "GIT_ERROR_FILESYSTEM", - "GIT_ERROR_PATCH", - "GIT_ERROR_WORKTREE", - "GIT_ERROR_SHA1", - "GIT_ERROR_HTTP", - "GIT_ERROR_INTERNAL" - ], - "type": "enum", - "file": "git2/errors.h", - "line": 76, - "lineto": 113, - "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA1\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL", - "tdef": "typedef", - "description": " Error classes ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_ERROR_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_ERROR_NOMEMORY", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_ERROR_OS", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_ERROR_INVALID", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_ERROR_REFERENCE", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_ERROR_ZLIB", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_ERROR_REPOSITORY", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_ERROR_CONFIG", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_ERROR_REGEX", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_ERROR_ODB", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_ERROR_INDEX", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_ERROR_OBJECT", - "comments": "", - "value": 11 - }, - { - "type": "int", - "name": "GIT_ERROR_NET", - "comments": "", - "value": 12 - }, - { - "type": "int", - "name": "GIT_ERROR_TAG", - "comments": "", - "value": 13 - }, - { - "type": "int", - "name": "GIT_ERROR_TREE", - "comments": "", - "value": 14 - }, - { - "type": "int", - "name": "GIT_ERROR_INDEXER", - "comments": "", - "value": 15 - }, - { - "type": "int", - "name": "GIT_ERROR_SSL", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_ERROR_SUBMODULE", - "comments": "", - "value": 17 - }, - { - "type": "int", - "name": "GIT_ERROR_THREAD", - "comments": "", - "value": 18 - }, - { - "type": "int", - "name": "GIT_ERROR_STASH", - "comments": "", - "value": 19 - }, - { - "type": "int", - "name": "GIT_ERROR_CHECKOUT", - "comments": "", - "value": 20 - }, - { - "type": "int", - "name": "GIT_ERROR_FETCHHEAD", - "comments": "", - "value": 21 - }, - { - "type": "int", - "name": "GIT_ERROR_MERGE", - "comments": "", - "value": 22 - }, - { - "type": "int", - "name": "GIT_ERROR_SSH", - "comments": "", - "value": 23 - }, - { - "type": "int", - "name": "GIT_ERROR_FILTER", - "comments": "", - "value": 24 - }, - { - "type": "int", - "name": "GIT_ERROR_REVERT", - "comments": "", - "value": 25 - }, - { - "type": "int", - "name": "GIT_ERROR_CALLBACK", - "comments": "", - "value": 26 - }, - { - "type": "int", - "name": "GIT_ERROR_CHERRYPICK", - "comments": "", - "value": 27 - }, - { - "type": "int", - "name": "GIT_ERROR_DESCRIBE", - "comments": "", - "value": 28 - }, - { - "type": "int", - "name": "GIT_ERROR_REBASE", - "comments": "", - "value": 29 - }, - { - "type": "int", - "name": "GIT_ERROR_FILESYSTEM", - "comments": "", - "value": 30 - }, - { - "type": "int", - "name": "GIT_ERROR_PATCH", - "comments": "", - "value": 31 - }, - { - "type": "int", - "name": "GIT_ERROR_WORKTREE", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_ERROR_SHA1", - "comments": "", - "value": 33 - }, - { - "type": "int", - "name": "GIT_ERROR_HTTP", - "comments": "", - "value": 34 - }, - { - "type": "int", - "name": "GIT_ERROR_INTERNAL", - "comments": "", - "value": 35 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_feature_t", - { - "decl": [ - "GIT_FEATURE_THREADS", - "GIT_FEATURE_HTTPS", - "GIT_FEATURE_SSH", - "GIT_FEATURE_NSEC" - ], - "type": "enum", - "file": "git2/common.h", - "line": 128, - "lineto": 151, - "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", - "tdef": "typedef", - "description": " Combinations of these values describe the features with which libgit2\n was compiled", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FEATURE_THREADS", - "comments": "

If set, libgit2 was built thread-aware and can be safely used from multiple\n threads.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FEATURE_HTTPS", - "comments": "

If set, libgit2 was built with and linked against a TLS implementation.\n Custom TLS streams may still be added by the user to support HTTPS\n regardless of this.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_FEATURE_SSH", - "comments": "

If set, libgit2 was built with and linked against libssh2. A custom\n transport may still be added by the user to support libssh2 regardless of\n this.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_FEATURE_NSEC", - "comments": "

If set, libgit2 was built with support for sub-second resolution in file\n modification times.

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_fetch_options", - { - "decl": [ - "int version", - "git_remote_callbacks callbacks", - "git_fetch_prune_t prune", - "int update_fetchhead", - "git_remote_autotag_option_t download_tags", - "git_proxy_options proxy_opts", - "git_strarray custom_headers" - ], - "type": "struct", - "value": "git_fetch_options", - "file": "git2/remote.h", - "line": 704, - "lineto": 741, - "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", - "tdef": "typedef", - "description": " Fetch options structure.", - "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", - "fields": [ - { - "type": "int", - "name": "version", - "comments": "" - }, - { - "type": "git_remote_callbacks", - "name": "callbacks", - "comments": " Callbacks to use for this fetch operation" - }, - { - "type": "git_fetch_prune_t", - "name": "prune", - "comments": " Whether to perform a prune after the fetch" - }, - { - "type": "int", - "name": "update_fetchhead", - "comments": " Whether to write the results to FETCH_HEAD. Defaults to\n on. Leave this default in order to behave like git." - }, - { - "type": "git_remote_autotag_option_t", - "name": "download_tags", - "comments": " Determines how to behave regarding tags on the remote, such\n as auto-downloading tags for objects we're downloading or\n downloading all of them.\n\n The default is to auto-follow tags." - }, - { - "type": "git_proxy_options", - "name": "proxy_opts", - "comments": " Proxy options to use, by default no proxy is used." - }, - { - "type": "git_strarray", - "name": "custom_headers", - "comments": " Extra headers for this fetch operation" - } - ], - "used": { - "returns": [], - "needs": [ - "git_fetch_options_init", - "git_remote_download", - "git_remote_fetch" - ] - } - } - ], - [ - "git_fetch_prune_t", - { - "decl": [ - "GIT_FETCH_PRUNE_UNSPECIFIED", - "GIT_FETCH_PRUNE", - "GIT_FETCH_NO_PRUNE" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 656, - "lineto": 669, - "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", - "tdef": "typedef", - "description": " Acceptable prune settings when fetching ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FETCH_PRUNE_UNSPECIFIED", - "comments": "

Use the setting from the configuration

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FETCH_PRUNE", - "comments": "

Force pruning on

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FETCH_NO_PRUNE", - "comments": "

Force pruning off

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_filemode_t", - { - "decl": [ - "GIT_FILEMODE_UNREADABLE", - "GIT_FILEMODE_TREE", - "GIT_FILEMODE_BLOB", - "GIT_FILEMODE_BLOB_EXECUTABLE", - "GIT_FILEMODE_LINK", - "GIT_FILEMODE_COMMIT" - ], - "type": "enum", - "file": "git2/types.h", - "line": 222, - "lineto": 229, - "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", - "tdef": "typedef", - "description": " Valid modes for index and tree entries. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FILEMODE_UNREADABLE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILEMODE_TREE", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_FILEMODE_BLOB", - "comments": "", - "value": 33188 - }, - { - "type": "int", - "name": "GIT_FILEMODE_BLOB_EXECUTABLE", - "comments": "", - "value": 33261 - }, - { - "type": "int", - "name": "GIT_FILEMODE_LINK", - "comments": "", - "value": 40960 - }, - { - "type": "int", - "name": "GIT_FILEMODE_COMMIT", - "comments": "", - "value": 57344 - } - ], - "used": { - "returns": [ - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw" - ], - "needs": [ - "git_treebuilder_insert" - ] - } - } - ], - [ - "git_filter", - { - "decl": "git_filter", - "type": "struct", - "value": "git_filter", - "file": "git2/filter.h", - "line": 100, - "lineto": 100, - "tdef": "typedef", - "description": " A filter that can transform file data", - "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", - "used": { - "returns": [], - "needs": [ - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_contains", - "git_filter_list_free", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] - } - } - ], - [ - "git_filter_flag_t", - { - "decl": [ - "GIT_FILTER_DEFAULT", - "GIT_FILTER_ALLOW_UNSAFE", - "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", - "GIT_FILTER_ATTRIBUTES_FROM_HEAD", - "GIT_FILTER_ATTRIBUTES_FROM_COMMIT" - ], - "type": "enum", - "file": "git2/filter.h", - "line": 41, - "lineto": 58, - "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_FILTER_ATTRIBUTES_FROM_COMMIT", - "tdef": "typedef", - "description": " Filter option flags.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FILTER_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILTER_ALLOW_UNSAFE", - "comments": "

Don't error for safecrlf violations, allow them to continue.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", - "comments": "

Don't load /etc/gitattributes (or the system equivalent)

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_FILTER_ATTRIBUTES_FROM_HEAD", - "comments": "

Load attributes from .gitattributes in the root of HEAD

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_FILTER_ATTRIBUTES_FROM_COMMIT", - "comments": "

Load attributes from .gitattributes in a given commit.\n This can only be specified in a git_filter_options.

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_filter_list", - { - "decl": "git_filter_list", - "type": "struct", - "value": "git_filter_list", - "file": "git2/filter.h", - "line": 112, - "lineto": 112, - "tdef": "typedef", - "description": " List of filters to be applied", - "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", - "used": { - "returns": [], - "needs": [ - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_contains", - "git_filter_list_free", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] - } - } - ], - [ - "git_filter_mode_t", - { - "decl": [ - "GIT_FILTER_TO_WORKTREE", - "GIT_FILTER_SMUDGE", - "GIT_FILTER_TO_ODB", - "GIT_FILTER_CLEAN" - ], - "type": "enum", - "file": "git2/filter.h", - "line": 31, - "lineto": 36, - "block": "GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN", - "tdef": "typedef", - "description": " Filters are applied in one of two directions: smudging - which is\n exporting a file from the Git object database to the working directory,\n and cleaning - which is importing a file from the working directory to\n the Git object database. These values control which direction of\n change is being applied.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FILTER_TO_WORKTREE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILTER_SMUDGE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILTER_TO_ODB", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FILTER_CLEAN", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [ - "git_filter_list_load", - "git_filter_list_load_ext" - ] - } - } - ], - [ - "git_filter_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "git_oid * commit_id", - "git_oid attr_commit_id" - ], - "type": "struct", - "value": "git_filter_options", - "file": "git2/filter.h", - "line": 63, - "lineto": 80, - "block": "unsigned int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", - "tdef": "typedef", - "description": " Filtering options", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " See `git_filter_flag_t` above " - }, - { - "type": "git_oid *", - "name": "commit_id", - "comments": "" - }, - { - "type": "git_oid", - "name": "attr_commit_id", - "comments": " The commit to load attributes from, when\n `GIT_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." - } - ], - "used": { - "returns": [], - "needs": [ - "git_filter_list_load_ext" - ] - } - } - ], - [ - "git_filter_source", - { - "decl": "git_filter_source", - "type": "struct", - "value": "git_filter_source", - "file": "git2/sys/filter.h", - "line": 95, - "lineto": 95, - "tdef": "typedef", - "description": " A filter source represents a file/blob to be processed", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_hashsig_option_t", - { - "decl": [ - "GIT_HASHSIG_NORMAL", - "GIT_HASHSIG_IGNORE_WHITESPACE", - "GIT_HASHSIG_SMART_WHITESPACE", - "GIT_HASHSIG_ALLOW_SMALL_FILES" - ], - "type": "enum", - "file": "git2/sys/hashsig.h", - "line": 25, - "lineto": 45, - "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", - "tdef": "typedef", - "description": " Options for hashsig computation", - "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_HASHSIG_NORMAL", - "comments": "

Use all data

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_HASHSIG_IGNORE_WHITESPACE", - "comments": "

Ignore whitespace

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_HASHSIG_SMART_WHITESPACE", - "comments": "

Ignore

\n\n

and all space after

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_HASHSIG_ALLOW_SMALL_FILES", - "comments": "

Allow hashing of small files

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index", - { - "decl": "git_index", - "type": "struct", - "value": "git_index", - "file": "git2/types.h", - "line": 148, - "lineto": 148, - "tdef": "typedef", - "description": " Memory representation of an index file. ", - "comments": "", - "used": { - "returns": [ - "git_index_get_byindex", - "git_index_get_bypath", - "git_remote_stats" - ], - "needs": [ - "git_apply_to_tree", - "git_checkout_index", - "git_cherrypick_commit", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_tree_to_index", - "git_index_add", - "git_index_add_all", - "git_index_add_bypath", - "git_index_add_from_buffer", - "git_index_caps", - "git_index_checksum", - "git_index_clear", - "git_index_conflict_add", - "git_index_conflict_cleanup", - "git_index_conflict_get", - "git_index_conflict_iterator_free", - "git_index_conflict_iterator_new", - "git_index_conflict_next", - "git_index_conflict_remove", - "git_index_entry_is_conflict", - "git_index_entry_stage", - "git_index_entrycount", - "git_index_find", - "git_index_find_prefix", - "git_index_free", - "git_index_get_byindex", - "git_index_get_bypath", - "git_index_has_conflicts", - "git_index_iterator_free", - "git_index_iterator_new", - "git_index_iterator_next", - "git_index_new", - "git_index_open", - "git_index_owner", - "git_index_path", - "git_index_read", - "git_index_read_tree", - "git_index_remove", - "git_index_remove_all", - "git_index_remove_bypath", - "git_index_remove_directory", - "git_index_set_caps", - "git_index_set_version", - "git_index_update_all", - "git_index_version", - "git_index_write", - "git_index_write_tree", - "git_index_write_tree_to", - "git_indexer_append", - "git_indexer_commit", - "git_indexer_free", - "git_indexer_hash", - "git_indexer_new", - "git_indexer_options_init", - "git_indexer_progress_cb", - "git_merge_commits", - "git_merge_file_from_index", - "git_merge_trees", - "git_odb_write_pack", - "git_packbuilder_write", - "git_pathspec_match_index", - "git_rebase_inmemory_index", - "git_repository_index", - "git_revert_commit" - ] - } - } - ], - [ - "git_index_add_option_t", - { - "decl": [ - "GIT_INDEX_ADD_DEFAULT", - "GIT_INDEX_ADD_FORCE", - "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", - "GIT_INDEX_ADD_CHECK_PATHSPEC" - ], - "type": "enum", - "file": "git2/index.h", - "line": 139, - "lineto": 144, - "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", - "tdef": "typedef", - "description": " Flags for APIs that add files matching pathspec ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_ADD_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_INDEX_ADD_FORCE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_INDEX_ADD_CHECK_PATHSPEC", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_capability_t", - { - "decl": [ - "GIT_INDEX_CAPABILITY_IGNORE_CASE", - "GIT_INDEX_CAPABILITY_NO_FILEMODE", - "GIT_INDEX_CAPABILITY_NO_SYMLINKS", - "GIT_INDEX_CAPABILITY_FROM_OWNER" - ], - "type": "enum", - "file": "git2/index.h", - "line": 126, - "lineto": 131, - "block": "GIT_INDEX_CAPABILITY_IGNORE_CASE\nGIT_INDEX_CAPABILITY_NO_FILEMODE\nGIT_INDEX_CAPABILITY_NO_SYMLINKS\nGIT_INDEX_CAPABILITY_FROM_OWNER", - "tdef": "typedef", - "description": " Capabilities of system that affect index actions. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_IGNORE_CASE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_NO_FILEMODE", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_NO_SYMLINKS", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_FROM_OWNER", - "comments": "", - "value": -1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_conflict_iterator", - { - "decl": "git_index_conflict_iterator", - "type": "struct", - "value": "git_index_conflict_iterator", - "file": "git2/types.h", - "line": 154, - "lineto": 154, - "tdef": "typedef", - "description": " An iterator for conflicts in the index. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_index_conflict_iterator_free", - "git_index_conflict_iterator_new", - "git_index_conflict_next" - ] - } - } - ], - [ - "git_index_entry", - { - "decl": [ - "git_index_time ctime", - "git_index_time mtime", - "uint32_t dev", - "uint32_t ino", - "uint32_t mode", - "uint32_t uid", - "uint32_t gid", - "uint32_t file_size", - "git_oid id", - "uint16_t flags", - "uint16_t flags_extended", - "const char * path" - ], - "type": "struct", - "value": "git_index_entry", - "file": "git2/index.h", - "line": 53, - "lineto": 70, - "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", - "tdef": "typedef", - "description": " In-memory representation of a file entry in the index.", - "comments": "

This is a public structure that represents a file entry in the index. The meaning of the fields corresponds to core Git's documentation (in "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be accessed via the first set of GIT_INDEX_ENTRY_... bitmasks below. These flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be accessed via the later GIT_INDEX_ENTRY_... bitmasks below. Some of these flags are read from and written to disk, but some are set aside for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This is enough to detect changes, which is enough for the index to function as a cache, but it should not be taken as an authoritative source for that data.

\n", - "fields": [ - { - "type": "git_index_time", - "name": "ctime", - "comments": "" - }, - { - "type": "git_index_time", - "name": "mtime", - "comments": "" - }, - { - "type": "uint32_t", - "name": "dev", - "comments": "" - }, - { - "type": "uint32_t", - "name": "ino", - "comments": "" - }, - { - "type": "uint32_t", - "name": "mode", - "comments": "" - }, - { - "type": "uint32_t", - "name": "uid", - "comments": "" - }, - { - "type": "uint32_t", - "name": "gid", - "comments": "" - }, - { - "type": "uint32_t", - "name": "file_size", - "comments": "" - }, - { - "type": "git_oid", - "name": "id", - "comments": "" - }, - { - "type": "uint16_t", - "name": "flags", - "comments": "" - }, - { - "type": "uint16_t", - "name": "flags_extended", - "comments": "" - }, - { - "type": "const char *", - "name": "path", - "comments": "" - } - ], - "used": { - "returns": [ - "git_index_get_byindex", - "git_index_get_bypath" - ], - "needs": [ - "git_index_add", - "git_index_add_from_buffer", - "git_index_conflict_add", - "git_index_conflict_get", - "git_index_conflict_next", - "git_index_entry_is_conflict", - "git_index_entry_stage", - "git_index_iterator_next", - "git_merge_file_from_index" - ] - } - } - ], - [ - "git_index_entry_extended_flag_t", - { - "decl": [ - "GIT_INDEX_ENTRY_INTENT_TO_ADD", - "GIT_INDEX_ENTRY_SKIP_WORKTREE", - "GIT_INDEX_ENTRY_EXTENDED_FLAGS", - "GIT_INDEX_ENTRY_UPTODATE" - ], - "type": "enum", - "file": "git2/index.h", - "line": 116, - "lineto": 123, - "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", - "tdef": "typedef", - "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", - "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_ENTRY_INTENT_TO_ADD", - "comments": "", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_SKIP_WORKTREE", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_EXTENDED_FLAGS", - "comments": "", - "value": 24576 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_UPTODATE", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_entry_flag_t", - { - "decl": [ - "GIT_INDEX_ENTRY_EXTENDED", - "GIT_INDEX_ENTRY_VALID" - ], - "type": "enum", - "file": "git2/index.h", - "line": 87, - "lineto": 90, - "block": "GIT_INDEX_ENTRY_EXTENDED\nGIT_INDEX_ENTRY_VALID", - "tdef": "typedef", - "description": " Flags for index entries", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_ENTRY_EXTENDED", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_VALID", - "comments": "", - "value": 32768 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_iterator", - { - "decl": "git_index_iterator", - "type": "struct", - "value": "git_index_iterator", - "file": "git2/types.h", - "line": 151, - "lineto": 151, - "tdef": "typedef", - "description": " An iterator for entries in the index. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_index_iterator_free", - "git_index_iterator_new", - "git_index_iterator_next" - ] - } - } - ], - [ - "git_index_stage_t", - { - "decl": [ - "GIT_INDEX_STAGE_ANY", - "GIT_INDEX_STAGE_NORMAL", - "GIT_INDEX_STAGE_ANCESTOR", - "GIT_INDEX_STAGE_OURS", - "GIT_INDEX_STAGE_THEIRS" - ], - "type": "enum", - "file": "git2/index.h", - "line": 147, - "lineto": 167, - "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", - "tdef": "typedef", - "description": " Git index stage states ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_STAGE_ANY", - "comments": "

Match any index stage.

\n\n

Some index APIs take a stage to match; pass this value to match\n any entry matching the path regardless of stage.

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_NORMAL", - "comments": "

A normal staged file in the index.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_ANCESTOR", - "comments": "

The ancestor side of a conflict.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_OURS", - "comments": "

The "ours" side of a conflict.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_THEIRS", - "comments": "

The "theirs" side of a conflict.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_time", - { - "decl": [ - "int32_t seconds", - "uint32_t nanoseconds" - ], - "type": "struct", - "value": "git_index_time", - "file": "git2/index.h", - "line": 26, - "lineto": 30, - "block": "int32_t seconds\nuint32_t nanoseconds", - "tdef": "typedef", - "description": " Time structure used in a git index entry ", - "comments": "", - "fields": [ - { - "type": "int32_t", - "name": "seconds", - "comments": "" - }, - { - "type": "uint32_t", - "name": "nanoseconds", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_indexer", - { - "decl": "git_indexer", - "type": "struct", - "value": "git_indexer", - "file": "git2/indexer.h", - "line": 17, - "lineto": 17, - "tdef": "typedef", - "description": " A git indexer object ", - "comments": "", - "used": { - "returns": [ - "git_remote_stats" - ], - "needs": [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_free", - "git_indexer_hash", - "git_indexer_new", - "git_indexer_options_init", - "git_indexer_progress_cb", - "git_odb_write_pack", - "git_packbuilder_write" - ] - } - } - ], - [ - "git_indexer_options", - { - "decl": [ - "unsigned int version", - "git_indexer_progress_cb progress_cb", - "void * progress_cb_payload", - "unsigned char verify" - ], - "type": "struct", - "value": "git_indexer_options", - "file": "git2/indexer.h", - "line": 62, - "lineto": 73, - "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", - "tdef": "typedef", - "description": " Options for indexer configuration", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_indexer_progress_cb", - "name": "progress_cb", - "comments": " progress_cb function to call with progress information " - }, - { - "type": "void *", - "name": "progress_cb_payload", - "comments": " progress_cb_payload payload for the progress callback " - }, - { - "type": "unsigned char", - "name": "verify", - "comments": " Do connectivity checks for the received pack " - } - ], - "used": { - "returns": [], - "needs": [ - "git_indexer_new", - "git_indexer_options_init" - ] - } - } - ], - [ - "git_indexer_progress", - { - "decl": [ - "unsigned int total_objects", - "unsigned int indexed_objects", - "unsigned int received_objects", - "unsigned int local_objects", - "unsigned int total_deltas", - "unsigned int indexed_deltas", - "size_t received_bytes" - ], - "type": "struct", - "value": "git_indexer_progress", - "file": "git2/indexer.h", - "line": 24, - "lineto": 48, - "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", - "tdef": "typedef", - "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "total_objects", - "comments": " number of objects in the packfile being indexed " - }, - { - "type": "unsigned int", - "name": "indexed_objects", - "comments": " received objects that have been hashed " - }, - { - "type": "unsigned int", - "name": "received_objects", - "comments": " received_objects: objects which have been downloaded " - }, - { - "type": "unsigned int", - "name": "local_objects", - "comments": " locally-available objects that have been injected in order\n to fix a thin pack" - }, - { - "type": "unsigned int", - "name": "total_deltas", - "comments": " number of deltas in the packfile being indexed " - }, - { - "type": "unsigned int", - "name": "indexed_deltas", - "comments": " received deltas that have been indexed " - }, - { - "type": "size_t", - "name": "received_bytes", - "comments": " size of the packfile received up to now " - } - ], - "used": { - "returns": [ - "git_remote_stats" - ], - "needs": [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_progress_cb", - "git_odb_write_pack", - "git_packbuilder_write" - ] - } - } - ], - [ - "git_libgit2_opt_t", - { - "decl": [ - "GIT_OPT_GET_MWINDOW_SIZE", - "GIT_OPT_SET_MWINDOW_SIZE", - "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", - "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", - "GIT_OPT_GET_SEARCH_PATH", - "GIT_OPT_SET_SEARCH_PATH", - "GIT_OPT_SET_CACHE_OBJECT_LIMIT", - "GIT_OPT_SET_CACHE_MAX_SIZE", - "GIT_OPT_ENABLE_CACHING", - "GIT_OPT_GET_CACHED_MEMORY", - "GIT_OPT_GET_TEMPLATE_PATH", - "GIT_OPT_SET_TEMPLATE_PATH", - "GIT_OPT_SET_SSL_CERT_LOCATIONS", - "GIT_OPT_SET_USER_AGENT", - "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", - "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", - "GIT_OPT_SET_SSL_CIPHERS", - "GIT_OPT_GET_USER_AGENT", - "GIT_OPT_ENABLE_OFS_DELTA", - "GIT_OPT_ENABLE_FSYNC_GITDIR", - "GIT_OPT_GET_WINDOWS_SHAREMODE", - "GIT_OPT_SET_WINDOWS_SHAREMODE", - "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", - "GIT_OPT_SET_ALLOCATOR", - "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", - "GIT_OPT_GET_PACK_MAX_OBJECTS", - "GIT_OPT_SET_PACK_MAX_OBJECTS", - "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", - "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", - "GIT_OPT_GET_MWINDOW_FILE_LIMIT", - "GIT_OPT_SET_MWINDOW_FILE_LIMIT", - "GIT_OPT_SET_ODB_PACKED_PRIORITY", - "GIT_OPT_SET_ODB_LOOSE_PRIORITY", - "GIT_OPT_GET_EXTENSIONS", - "GIT_OPT_SET_EXTENSIONS", - "GIT_OPT_GET_OWNER_VALIDATION", - "GIT_OPT_SET_OWNER_VALIDATION" - ], - "type": "enum", - "file": "git2/common.h", - "line": 179, - "lineto": 217, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION", - "tdef": "typedef", - "description": " Global library options", - "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", - "fields": [ - { - "type": "int", - "name": "GIT_OPT_GET_MWINDOW_SIZE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_OPT_SET_MWINDOW_SIZE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_OPT_GET_SEARCH_PATH", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SEARCH_PATH", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_OPT_SET_CACHE_OBJECT_LIMIT", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_OPT_SET_CACHE_MAX_SIZE", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_CACHING", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_OPT_GET_CACHED_MEMORY", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_OPT_GET_TEMPLATE_PATH", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_OPT_SET_TEMPLATE_PATH", - "comments": "", - "value": 11 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SSL_CERT_LOCATIONS", - "comments": "", - "value": 12 - }, - { - "type": "int", - "name": "GIT_OPT_SET_USER_AGENT", - "comments": "", - "value": 13 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", - "comments": "", - "value": 14 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", - "comments": "", - "value": 15 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SSL_CIPHERS", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_OPT_GET_USER_AGENT", - "comments": "", - "value": 17 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_OFS_DELTA", - "comments": "", - "value": 18 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_FSYNC_GITDIR", - "comments": "", - "value": 19 - }, - { - "type": "int", - "name": "GIT_OPT_GET_WINDOWS_SHAREMODE", - "comments": "", - "value": 20 - }, - { - "type": "int", - "name": "GIT_OPT_SET_WINDOWS_SHAREMODE", - "comments": "", - "value": 21 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", - "comments": "", - "value": 22 - }, - { - "type": "int", - "name": "GIT_OPT_SET_ALLOCATOR", - "comments": "", - "value": 23 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", - "comments": "", - "value": 24 - }, - { - "type": "int", - "name": "GIT_OPT_GET_PACK_MAX_OBJECTS", - "comments": "", - "value": 25 - }, - { - "type": "int", - "name": "GIT_OPT_SET_PACK_MAX_OBJECTS", - "comments": "", - "value": 26 - }, - { - "type": "int", - "name": "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", - "comments": "", - "value": 27 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", - "comments": "", - "value": 28 - }, - { - "type": "int", - "name": "GIT_OPT_GET_MWINDOW_FILE_LIMIT", - "comments": "", - "value": 29 - }, - { - "type": "int", - "name": "GIT_OPT_SET_MWINDOW_FILE_LIMIT", - "comments": "", - "value": 30 - }, - { - "type": "int", - "name": "GIT_OPT_SET_ODB_PACKED_PRIORITY", - "comments": "", - "value": 31 - }, - { - "type": "int", - "name": "GIT_OPT_SET_ODB_LOOSE_PRIORITY", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_OPT_GET_EXTENSIONS", - "comments": "", - "value": 33 - }, - { - "type": "int", - "name": "GIT_OPT_SET_EXTENSIONS", - "comments": "", - "value": 34 - }, - { - "type": "int", - "name": "GIT_OPT_GET_OWNER_VALIDATION", - "comments": "", - "value": 35 - }, - { - "type": "int", - "name": "GIT_OPT_SET_OWNER_VALIDATION", - "comments": "", - "value": 36 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_mailmap", - { - "decl": "git_mailmap", - "type": "struct", - "value": "git_mailmap", - "file": "git2/types.h", - "line": 366, - "lineto": 366, - "tdef": "typedef", - "description": " Representation of .mailmap file state. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_commit_author_with_mailmap", - "git_commit_committer_with_mailmap", - "git_mailmap_add_entry", - "git_mailmap_free", - "git_mailmap_from_buffer", - "git_mailmap_from_repository", - "git_mailmap_new", - "git_mailmap_resolve", - "git_mailmap_resolve_signature" - ] - } - } - ], - [ - "git_merge_analysis_t", - { - "decl": [ - "GIT_MERGE_ANALYSIS_NONE", - "GIT_MERGE_ANALYSIS_NORMAL", - "GIT_MERGE_ANALYSIS_UP_TO_DATE", - "GIT_MERGE_ANALYSIS_FASTFORWARD", - "GIT_MERGE_ANALYSIS_UNBORN" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 316, - "lineto": 345, - "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", - "tdef": "typedef", - "description": " The results of `git_merge_analysis` indicate the merge opportunities.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_NONE", - "comments": "

No merge is possible. (Unused.)

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_NORMAL", - "comments": "

A "normal" merge; both HEAD and the given merge input have diverged\n from their common ancestor. The divergent commits must be merged.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_UP_TO_DATE", - "comments": "

All given merge inputs are reachable from HEAD, meaning the\n repository is up-to-date and no merge needs to be performed.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_FASTFORWARD", - "comments": "

The given merge input is a fast-forward from HEAD and no merge\n needs to be performed. Instead, the client can check out the\n given merge input.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_UNBORN", - "comments": "

The HEAD of the current repository is "unborn" and does not point to\n a valid commit. No merge can be performed, but the caller may wish\n to simply set HEAD to the target commit(s).

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_analysis", - "git_merge_analysis_for_ref" - ] - } - } - ], - [ - "git_merge_driver_source", - { - "decl": "git_merge_driver_source", - "type": "struct", - "value": "git_merge_driver_source", - "file": "git2/sys/merge.h", - "line": 41, - "lineto": 41, - "tdef": "typedef", - "description": " A merge driver source represents the file to be merged", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_file_favor_t", - { - "decl": [ - "GIT_MERGE_FILE_FAVOR_NORMAL", - "GIT_MERGE_FILE_FAVOR_OURS", - "GIT_MERGE_FILE_FAVOR_THEIRS", - "GIT_MERGE_FILE_FAVOR_UNION" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 101, - "lineto": 131, - "block": "GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION", - "tdef": "typedef", - "description": " Merge file favor options for `git_merge_options` instruct the file-level\n merging functionality how to deal with conflicting regions of the files.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_NORMAL", - "comments": "

When a region of a file is changed in both branches, a conflict\n will be recorded in the index so that git_checkout can produce\n a merge file with conflict markers in the working directory.\n This is the default.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_OURS", - "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "ours" side of any conflicting\n region. The index will not record a conflict.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_THEIRS", - "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "theirs" side of any conflicting\n region. The index will not record a conflict.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_UNION", - "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain each unique line from each side,\n which has the result of combining both files. The index will not\n record a conflict.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_file_flag_t", - { - "decl": [ - "GIT_MERGE_FILE_DEFAULT", - "GIT_MERGE_FILE_STYLE_MERGE", - "GIT_MERGE_FILE_STYLE_DIFF3", - "GIT_MERGE_FILE_SIMPLIFY_ALNUM", - "GIT_MERGE_FILE_IGNORE_WHITESPACE", - "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", - "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", - "GIT_MERGE_FILE_DIFF_PATIENCE", - "GIT_MERGE_FILE_DIFF_MINIMAL" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 136, - "lineto": 163, - "block": "GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL", - "tdef": "typedef", - "description": " File merging flags", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_FILE_DEFAULT", - "comments": "

Defaults

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_STYLE_MERGE", - "comments": "

Create standard conflicted merge files

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_STYLE_DIFF3", - "comments": "

Create diff3-style files

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_SIMPLIFY_ALNUM", - "comments": "

Condense non-alphanumeric regions for simplified diff file

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE", - "comments": "

Ignore all whitespace

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", - "comments": "

Ignore changes in amount of whitespace

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", - "comments": "

Ignore whitespace at end of line

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_DIFF_PATIENCE", - "comments": "

Use the "patience diff" algorithm

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_DIFF_MINIMAL", - "comments": "

Take extra time to find minimal diff

\n", - "value": 128 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_file_input", - { - "decl": [ - "unsigned int version", - "const char * ptr", - "size_t size", - "const char * path", - "unsigned int mode" - ], - "type": "struct", - "value": "git_merge_file_input", - "file": "git2/merge.h", - "line": 32, - "lineto": 46, - "block": "unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode", - "tdef": "typedef", - "description": " The file inputs to `git_merge_file`. Callers should populate the\n `git_merge_file_input` structure with descriptions of the files in\n each side of the conflict for use in producing the merge file.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "const char *", - "name": "ptr", - "comments": " Pointer to the contents of the file. " - }, - { - "type": "size_t", - "name": "size", - "comments": " Size of the contents pointed to in `ptr`. " - }, - { - "type": "const char *", - "name": "path", - "comments": " File name of the conflicted file, or `NULL` to not merge the path. " - }, - { - "type": "unsigned int", - "name": "mode", - "comments": " File mode of the conflicted file, or `0` to not merge the mode. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_file", - "git_merge_file_input_init" - ] - } - } - ], - [ - "git_merge_file_options", - { - "decl": [ - "unsigned int version", - "const char * ancestor_label", - "const char * our_label", - "const char * their_label", - "git_merge_file_favor_t favor", - "uint32_t flags", - "unsigned short marker_size" - ], - "type": "struct", - "value": "git_merge_file_options", - "file": "git2/merge.h", - "line": 170, - "lineto": 200, - "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nuint32_t flags\nunsigned short marker_size", - "tdef": "typedef", - "description": " Options for merging a file", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "const char *", - "name": "ancestor_label", - "comments": " Label for the ancestor file side of the conflict which will be prepended\n to labels in diff3-format merge files." - }, - { - "type": "const char *", - "name": "our_label", - "comments": " Label for our file side of the conflict which will be prepended\n to labels in merge files." - }, - { - "type": "const char *", - "name": "their_label", - "comments": " Label for their file side of the conflict which will be prepended\n to labels in merge files." - }, - { - "type": "git_merge_file_favor_t", - "name": "favor", - "comments": " The file to favor in region conflicts. " - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " see `git_merge_file_flag_t` above " - }, - { - "type": "unsigned short", - "name": "marker_size", - "comments": " The size of conflict markers (eg, \"\n<\n<\n<\n<\n<\n<\n<\n\"). Default is\n GIT_MERGE_CONFLICT_MARKER_SIZE. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_options_init" - ] - } - } - ], - [ - "git_merge_file_result", - { - "decl": [ - "unsigned int automergeable", - "const char * path", - "unsigned int mode", - "const char * ptr", - "size_t len" - ], - "type": "struct", - "value": "git_merge_file_result", - "file": "git2/merge.h", - "line": 220, - "lineto": 241, - "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", - "tdef": "typedef", - "description": " Information about file-level merging", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "automergeable", - "comments": " True if the output was automerged, false if the output contains\n conflict markers." - }, - { - "type": "const char *", - "name": "path", - "comments": " The path that the resultant merge file should use, or NULL if a\n filename conflict would occur." - }, - { - "type": "unsigned int", - "name": "mode", - "comments": " The mode that the resultant merge file should use. " - }, - { - "type": "const char *", - "name": "ptr", - "comments": " The contents of the merge. " - }, - { - "type": "size_t", - "name": "len", - "comments": " The length of the merge contents. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_result_free" - ] - } - } - ], - [ - "git_merge_flag_t", - { - "decl": [ - "GIT_MERGE_FIND_RENAMES", - "GIT_MERGE_FAIL_ON_CONFLICT", - "GIT_MERGE_SKIP_REUC", - "GIT_MERGE_NO_RECURSIVE" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 68, - "lineto": 95, - "block": "GIT_MERGE_FIND_RENAMES\nGIT_MERGE_FAIL_ON_CONFLICT\nGIT_MERGE_SKIP_REUC\nGIT_MERGE_NO_RECURSIVE", - "tdef": "typedef", - "description": " Flags for `git_merge` options. A combination of these flags can be\n passed in via the `flags` value in the `git_merge_options`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_FIND_RENAMES", - "comments": "

Detect renames that occur between the common ancestor and the "ours"\n side or the common ancestor and the "theirs" side. This will enable\n the ability to merge between a modified and renamed file.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_FAIL_ON_CONFLICT", - "comments": "

If a conflict occurs, exit immediately instead of attempting to\n continue resolving conflicts. The merge operation will fail with\n GIT_EMERGECONFLICT and no index will be returned.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_SKIP_REUC", - "comments": "

Do not write the REUC extension on the generated index

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_MERGE_NO_RECURSIVE", - "comments": "

If the commits being merged have multiple merge bases, do not build\n a recursive merge base (by merging the multiple merge bases),\n instead simply use the first base. This flag provides a similar\n merge base to git-merge-resolve.

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "unsigned int rename_threshold", - "unsigned int target_limit", - "git_diff_similarity_metric * metric", - "unsigned int recursion_limit", - "const char * default_driver", - "git_merge_file_favor_t file_favor", - "uint32_t file_flags" - ], - "type": "struct", - "value": "git_merge_options", - "file": "git2/merge.h", - "line": 246, - "lineto": 295, - "block": "unsigned int version\nuint32_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\nuint32_t file_flags", - "tdef": "typedef", - "description": " Merging options", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " See `git_merge_flag_t` above " - }, - { - "type": "unsigned int", - "name": "rename_threshold", - "comments": " Similarity to consider a file renamed (default 50). If\n `GIT_MERGE_FIND_RENAMES` is enabled, added files will be compared\n with deleted files to determine their similarity. Files that are\n more similar than the rename threshold (percentage-wise) will be\n treated as a rename." - }, - { - "type": "unsigned int", - "name": "target_limit", - "comments": " Maximum similarity sources to examine for renames (default 200).\n If the number of rename candidates (add / delete pairs) is greater\n than this value, inexact rename detection is aborted.\n\n This setting overrides the `merge.renameLimit` configuration value." - }, - { - "type": "git_diff_similarity_metric *", - "name": "metric", - "comments": " Pluggable similarity metric; pass NULL to use internal metric " - }, - { - "type": "unsigned int", - "name": "recursion_limit", - "comments": " Maximum number of times to merge common ancestors to build a\n virtual merge base when faced with criss-cross merges. When this\n limit is reached, the next ancestor will simply be used instead of\n attempting to merge it. The default is unlimited." - }, - { - "type": "const char *", - "name": "default_driver", - "comments": " Default merge driver to be used when both sides of a merge have\n changed. The default is the `text` driver." - }, - { - "type": "git_merge_file_favor_t", - "name": "file_favor", - "comments": " Flags for handling conflicting content, to be used with the standard\n (`text`) merge driver." - }, - { - "type": "uint32_t", - "name": "file_flags", - "comments": " see `git_merge_file_flag_t` above " - } - ], - "used": { - "returns": [], - "needs": [ - "git_cherrypick_commit", - "git_merge", - "git_merge_commits", - "git_merge_options_init", - "git_merge_trees", - "git_revert_commit" - ] - } - } - ], - [ - "git_merge_preference_t", - { - "decl": [ - "GIT_MERGE_PREFERENCE_NONE", - "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", - "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 350, - "lineto": 368, - "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", - "tdef": "typedef", - "description": " The user's stated preference for merges.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_PREFERENCE_NONE", - "comments": "

No configuration was found that suggests a preferred behavior for\n merge.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", - "comments": "

There is a merge.ff=false configuration setting, suggesting that\n the user does not want to allow a fast-forward merge.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", - "comments": "

There is a merge.ff=only configuration setting, suggesting that\n the user only wants fast-forward merges.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_analysis", - "git_merge_analysis_for_ref" - ] - } - } - ], - [ - "git_message_trailer", - { - "decl": [ - "const char * key", - "const char * value" - ], - "type": "struct", - "value": "git_message_trailer", - "file": "git2/message.h", - "line": 43, - "lineto": 46, - "block": "const char * key\nconst char * value", - "tdef": "typedef", - "description": " Represents a single git message trailer.", - "comments": "", - "fields": [ - { - "type": "const char *", - "name": "key", - "comments": "" - }, - { - "type": "const char *", - "name": "value", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - } - } - ], - [ - "git_message_trailer_array", - { - "decl": [ - "git_message_trailer * trailers", - "size_t count", - "char * _trailer_block" - ], - "type": "struct", - "value": "git_message_trailer_array", - "file": "git2/message.h", - "line": 54, - "lineto": 60, - "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", - "tdef": "typedef", - "description": " Represents an array of git message trailers.", - "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", - "fields": [ - { - "type": "git_message_trailer *", - "name": "trailers", - "comments": "" - }, - { - "type": "size_t", - "name": "count", - "comments": "" - }, - { - "type": "char *", - "name": "_trailer_block", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - } - } - ], - [ - "git_midx_writer", - { - "decl": "git_midx_writer", - "type": "struct", - "value": "git_midx_writer", - "file": "git2/types.h", - "line": 100, - "lineto": 100, - "tdef": "typedef", - "description": " a writer for multi-pack-index files. ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_note", - { - "decl": "git_note", - "type": "struct", - "value": "git_note", - "file": "git2/types.h", - "line": 169, - "lineto": 169, - "tdef": "typedef", - "description": " Representation of a git note ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_note_author", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_committer", - "git_note_foreach", - "git_note_free", - "git_note_id", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_message", - "git_note_next", - "git_note_read" - ] - } - } - ], - [ - "git_note_iterator", - { - "decl": "git_note_iterator", - "type": "struct", - "value": "git_note_iterator", - "file": "git2/notes.h", - "line": 35, - "lineto": 35, - "tdef": "typedef", - "description": " note iterator", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_note_commit_iterator_new", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_next" - ] - } - } - ], - [ - "git_object", - { - "decl": "git_object", - "type": "struct", - "value": "git_object", - "file": "git2/types.h", - "line": 124, - "lineto": 124, - "tdef": "typedef", - "description": " Representation of a generic object in a repository ", - "comments": "", - "used": { - "returns": [ - "git_blob_rawsize", - "git_object_string2type", - "git_object_type", - "git_odb_object_type", - "git_tag_target_type", - "git_tree_entry_type" - ], - "needs": [ - "git_checkout_tree", - "git_describe_commit", - "git_object__size", - "git_object_dup", - "git_object_free", - "git_object_id", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_owner", - "git_object_peel", - "git_object_short_id", - "git_object_type", - "git_object_type2string", - "git_object_typeisloose", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read_header", - "git_odb_write", - "git_reference_peel", - "git_repository_hashfile", - "git_reset", - "git_reset_default", - "git_revparse_ext", - "git_revparse_single", - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_lightweight", - "git_tag_peel", - "git_tag_target", - "git_tree_entry_to_object" - ] - } - } - ], - [ - "git_object_t", - { - "decl": [ - "GIT_OBJECT_ANY", - "GIT_OBJECT_INVALID", - "GIT_OBJECT_COMMIT", - "GIT_OBJECT_TREE", - "GIT_OBJECT_BLOB", - "GIT_OBJECT_TAG", - "GIT_OBJECT_OFS_DELTA", - "GIT_OBJECT_REF_DELTA" - ], - "type": "enum", - "file": "git2/types.h", - "line": 73, - "lineto": 82, - "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", - "tdef": "typedef", - "description": " Basic type (loose or packed) of any Git object. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_OBJECT_ANY", - "comments": "

Object can be any of the following

\n", - "value": -2 - }, - { - "type": "int", - "name": "GIT_OBJECT_INVALID", - "comments": "

Object is invalid.

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_OBJECT_COMMIT", - "comments": "

A commit object.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_OBJECT_TREE", - "comments": "

A tree (directory listing) object.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_OBJECT_BLOB", - "comments": "

A file revision object.

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_OBJECT_TAG", - "comments": "

An annotated tag object.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_OBJECT_OFS_DELTA", - "comments": "

A delta, base is given by an offset.

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_OBJECT_REF_DELTA", - "comments": "

A delta, base is given by object id.

\n", - "value": 7 - } - ], - "used": { - "returns": [ - "git_object_string2type", - "git_object_type", - "git_odb_object_type", - "git_tag_target_type", - "git_tree_entry_type" - ], - "needs": [ - "git_object__size", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_peel", - "git_object_type2string", - "git_object_typeisloose", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read_header", - "git_odb_write", - "git_reference_peel", - "git_repository_hashfile" - ] - } - } - ], - [ - "git_odb", - { - "decl": "git_odb", - "type": "struct", - "value": "git_odb", - "file": "git2/types.h", - "line": 85, - "lineto": 85, - "tdef": "typedef", - "description": " An open object database handle. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_indexer_new", - "git_odb_add_alternate", - "git_odb_add_backend", - "git_odb_add_disk_alternate", - "git_odb_backend_loose", - "git_odb_backend_one_pack", - "git_odb_backend_pack", - "git_odb_exists", - "git_odb_exists_prefix", - "git_odb_expand_ids", - "git_odb_foreach", - "git_odb_free", - "git_odb_get_backend", - "git_odb_new", - "git_odb_num_backends", - "git_odb_object_data", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_open", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read", - "git_odb_read_header", - "git_odb_read_prefix", - "git_odb_refresh", - "git_odb_set_commit_graph", - "git_odb_stream_finalize_write", - "git_odb_stream_free", - "git_odb_stream_read", - "git_odb_stream_write", - "git_odb_write", - "git_odb_write_multi_pack_index", - "git_odb_write_pack", - "git_repository_odb", - "git_repository_wrap_odb" - ] - } - } - ], - [ - "git_odb_backend", - { - "decl": "git_odb_backend", - "type": "struct", - "value": "git_odb_backend", - "file": "git2/types.h", - "line": 88, - "lineto": 88, - "tdef": "typedef", - "description": " A custom backend in an ODB ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_odb_add_alternate", - "git_odb_add_backend", - "git_odb_backend_loose", - "git_odb_backend_one_pack", - "git_odb_backend_pack", - "git_odb_get_backend" - ] - } - } - ], - [ - "git_odb_expand_id", - { - "decl": [ - "git_oid id", - "unsigned short length", - "git_object_t type" - ], - "type": "struct", - "value": "git_odb_expand_id", - "file": "git2/odb.h", - "line": 176, - "lineto": 191, - "block": "git_oid id\nunsigned short length\ngit_object_t type", - "tdef": "typedef", - "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", - "comments": "", - "fields": [ - { - "type": "git_oid", - "name": "id", - "comments": " The object ID to expand " - }, - { - "type": "unsigned short", - "name": "length", - "comments": " The length of the object ID (in nibbles, or packets of 4 bits; the\n number of hex characters)" - }, - { - "type": "git_object_t", - "name": "type", - "comments": " The (optional) type of the object to search for; leave as `0` or set\n to `GIT_OBJECT_ANY` to query for any object matching the ID." - } - ], - "used": { - "returns": [], - "needs": [ - "git_odb_expand_ids" - ] - } - } - ], - [ - "git_odb_object", - { - "decl": "git_odb_object", - "type": "struct", - "value": "git_odb_object", - "file": "git2/types.h", - "line": 91, - "lineto": 91, - "tdef": "typedef", - "description": " An object read from the ODB ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_odb_object_data", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_read", - "git_odb_read_prefix" - ] - } - } - ], - [ - "git_odb_stream", - { - "decl": "git_odb_stream", - "type": "struct", - "value": "git_odb_stream", - "file": "git2/types.h", - "line": 94, - "lineto": 94, - "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_object_size_t declared_size\ngit_object_size_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", - "tdef": "typedef", - "description": " A stream to read/write from the ODB ", - "comments": "", - "fields": [ - { - "type": "git_odb_backend *", - "name": "backend", - "comments": "" - }, - { - "type": "unsigned int", - "name": "mode", - "comments": "" - }, - { - "type": "void *", - "name": "hash_ctx", - "comments": "" - }, - { - "type": "git_object_size_t", - "name": "declared_size", - "comments": "" - }, - { - "type": "git_object_size_t", - "name": "received_bytes", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream *, char *, size_t)", - "name": "read", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream *, const char *, size_t)", - "name": "write", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream *, const git_oid *)", - "name": "finalize_write", - "comments": "" - }, - { - "type": "void (*)(git_odb_stream *)", - "name": "free", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_stream_finalize_write", - "git_odb_stream_free", - "git_odb_stream_read", - "git_odb_stream_write" - ] - } - } - ], - [ - "git_odb_stream_t", - { - "decl": [ - "GIT_STREAM_RDONLY", - "GIT_STREAM_WRONLY", - "GIT_STREAM_RW" - ], - "type": "enum", - "file": "git2/odb_backend.h", - "line": 71, - "lineto": 75, - "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", - "tdef": "typedef", - "description": " Streaming mode ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STREAM_RDONLY", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STREAM_WRONLY", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STREAM_RW", - "comments": "", - "value": 6 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_odb_writepack", - { - "decl": "git_odb_writepack", - "type": "struct", - "value": "git_odb_writepack", - "file": "git2/types.h", - "line": 97, - "lineto": 97, - "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", - "tdef": "typedef", - "description": " A stream to write a packfile to the ODB ", - "comments": "", - "fields": [ - { - "type": "git_odb_backend *", - "name": "backend", - "comments": "" - }, - { - "type": "int (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *)", - "name": "append", - "comments": "" - }, - { - "type": "int (*)(git_odb_writepack *, git_indexer_progress *)", - "name": "commit", - "comments": "" - }, - { - "type": "void (*)(git_odb_writepack *)", - "name": "free", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_odb_write_pack" - ] - } - } - ], - [ - "git_oid", - { - "decl": [ - "unsigned char [20] id" - ], - "type": "struct", - "value": "git_oid", - "file": "git2/oid.h", - "line": 33, - "lineto": 36, - "block": "unsigned char [20] id", - "tdef": "typedef", - "description": " Unique identity of any object (commit, tree, blob, tag). ", - "comments": "", - "fields": [ - { - "type": "unsigned char [20]", - "name": "id", - "comments": " raw binary formatted id " - } - ], - "used": { - "returns": [ - "git_annotated_commit_id", - "git_blob_id", - "git_commit_id", - "git_commit_parent_id", - "git_commit_tree_id", - "git_index_checksum", - "git_indexer_hash", - "git_note_id", - "git_object_id", - "git_odb_object_id", - "git_oid_shorten_new", - "git_packbuilder_hash", - "git_rebase_onto_id", - "git_rebase_orig_head_id", - "git_reference_target", - "git_reference_target_peel", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_submodule_head_id", - "git_submodule_index_id", - "git_submodule_wd_id", - "git_tag_id", - "git_tag_target_id", - "git_tree_entry_id", - "git_tree_id" - ], - "needs": [ - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_lookup", - "git_blob_create_from_buffer", - "git_blob_create_from_disk", - "git_blob_create_from_stream_commit", - "git_blob_create_from_workdir", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_commit_amend", - "git_commit_create", - "git_commit_create_cb", - "git_commit_create_v", - "git_commit_create_with_signature", - "git_commit_extract_signature", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_diff_patchid", - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any", - "git_index_write_tree", - "git_index_write_tree_to", - "git_merge_base", - "git_merge_base_many", - "git_merge_base_octopus", - "git_merge_bases", - "git_merge_bases_many", - "git_note_commit_create", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_create", - "git_note_foreach_cb", - "git_note_next", - "git_note_read", - "git_note_remove", - "git_object_lookup", - "git_object_lookup_prefix", - "git_odb_exists", - "git_odb_exists_prefix", - "git_odb_foreach_cb", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_open_rstream", - "git_odb_read", - "git_odb_read_header", - "git_odb_read_prefix", - "git_odb_stream_finalize_write", - "git_odb_write", - "git_oid_cmp", - "git_oid_cpy", - "git_oid_equal", - "git_oid_fmt", - "git_oid_fromraw", - "git_oid_fromstr", - "git_oid_fromstrn", - "git_oid_fromstrp", - "git_oid_is_zero", - "git_oid_iszero", - "git_oid_ncmp", - "git_oid_nfmt", - "git_oid_pathfmt", - "git_oid_shorten_add", - "git_oid_shorten_free", - "git_oid_strcmp", - "git_oid_streq", - "git_oid_tostr", - "git_oid_tostr_s", - "git_oidarray_dispose", - "git_oidarray_free", - "git_packbuilder_insert", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_recur", - "git_packbuilder_insert_tree", - "git_rebase_commit", - "git_reference_create", - "git_reference_create_matching", - "git_reference_name_to_id", - "git_reference_set_target", - "git_reflog_append", - "git_repository_fetchhead_foreach_cb", - "git_repository_hashfile", - "git_repository_mergehead_foreach_cb", - "git_repository_set_head_detached", - "git_revwalk_hide", - "git_revwalk_hide_cb", - "git_revwalk_next", - "git_revwalk_push", - "git_stash_cb", - "git_stash_save", - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_foreach_cb", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_transaction_set_target", - "git_tree_create_updated", - "git_tree_entry_byid", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_treebuilder_insert", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer" - ] - } - } - ], - [ - "git_oid_shorten", - { - "decl": "git_oid_shorten", - "type": "struct", - "value": "git_oid_shorten", - "file": "git2/oid.h", - "line": 220, - "lineto": 220, - "tdef": "typedef", - "description": " OID Shortener object", - "comments": "", - "used": { - "returns": [ - "git_oid_shorten_new" - ], - "needs": [ - "git_oid_shorten_add", - "git_oid_shorten_free" - ] - } - } - ], - [ - "git_oidarray", - { - "decl": [ - "git_oid * ids", - "size_t count" - ], - "type": "struct", - "value": "git_oidarray", - "file": "git2/oidarray.h", - "line": 16, - "lineto": 19, - "block": "git_oid * ids\nsize_t count", - "tdef": "typedef", - "description": " Array of object ids ", - "comments": "", - "fields": [ - { - "type": "git_oid *", - "name": "ids", - "comments": "" - }, - { - "type": "size_t", - "name": "count", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_bases", - "git_merge_bases_many", - "git_oidarray_dispose", - "git_oidarray_free" - ] - } - } - ], - [ - "git_packbuilder", - { - "decl": "git_packbuilder", - "type": "struct", - "value": "git_packbuilder", - "file": "git2/types.h", - "line": 172, - "lineto": 172, - "tdef": "typedef", - "description": " Representation of a git packbuilder ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_packbuilder_foreach", - "git_packbuilder_free", - "git_packbuilder_hash", - "git_packbuilder_insert", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_recur", - "git_packbuilder_insert_tree", - "git_packbuilder_insert_walk", - "git_packbuilder_new", - "git_packbuilder_object_count", - "git_packbuilder_set_callbacks", - "git_packbuilder_set_threads", - "git_packbuilder_write", - "git_packbuilder_write_buf", - "git_packbuilder_written" - ] - } - } - ], - [ - "git_packbuilder_stage_t", - { - "decl": [ - "GIT_PACKBUILDER_ADDING_OBJECTS", - "GIT_PACKBUILDER_DELTAFICATION" - ], - "type": "enum", - "file": "git2/pack.h", - "line": 52, - "lineto": 55, - "block": "GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION", - "tdef": "typedef", - "description": " Stages that are reported by the packbuilder progress callback.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PACKBUILDER_ADDING_OBJECTS", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PACKBUILDER_DELTAFICATION", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_patch", - { - "decl": "git_patch", - "type": "struct", - "value": "git_patch", - "file": "git2/patch.h", - "line": 29, - "lineto": 29, - "tdef": "typedef", - "description": " The diff patch is used to store all the text diffs for a delta.", - "comments": "

You can easily loop over the content of patches and get information about them.

\n", - "used": { - "returns": [], - "needs": [ - "git_patch_free", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers", - "git_patch_from_diff", - "git_patch_get_delta", - "git_patch_get_hunk", - "git_patch_get_line_in_hunk", - "git_patch_line_stats", - "git_patch_num_hunks", - "git_patch_num_lines_in_hunk", - "git_patch_owner", - "git_patch_print", - "git_patch_size", - "git_patch_to_buf" - ] - } - } - ], - [ - "git_path_fs", - { - "decl": [ - "GIT_PATH_FS_GENERIC", - "GIT_PATH_FS_NTFS", - "GIT_PATH_FS_HFS" - ], - "type": "enum", - "file": "git2/sys/path.h", - "line": 34, - "lineto": 41, - "block": "GIT_PATH_FS_GENERIC\nGIT_PATH_FS_NTFS\nGIT_PATH_FS_HFS", - "tdef": "typedef", - "description": " The kinds of checks to perform according to which filesystem we are trying to\n protect.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PATH_FS_GENERIC", - "comments": "

Do both NTFS- and HFS-specific checks

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PATH_FS_NTFS", - "comments": "

Do NTFS-specific checks only

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_PATH_FS_HFS", - "comments": "

Do HFS-specific checks only

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_pathspec", - { - "decl": "git_pathspec", - "type": "struct", - "value": "git_pathspec", - "file": "git2/pathspec.h", - "line": 20, - "lineto": 20, - "tdef": "typedef", - "description": " Compiled pathspec", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_pathspec_free", - "git_pathspec_match_diff", - "git_pathspec_match_index", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_failed_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_free", - "git_pathspec_match_tree", - "git_pathspec_match_workdir", - "git_pathspec_matches_path", - "git_pathspec_new" - ] - } - } - ], - [ - "git_pathspec_flag_t", - { - "decl": [ - "GIT_PATHSPEC_DEFAULT", - "GIT_PATHSPEC_IGNORE_CASE", - "GIT_PATHSPEC_USE_CASE", - "GIT_PATHSPEC_NO_GLOB", - "GIT_PATHSPEC_NO_MATCH_ERROR", - "GIT_PATHSPEC_FIND_FAILURES", - "GIT_PATHSPEC_FAILURES_ONLY" - ], - "type": "enum", - "file": "git2/pathspec.h", - "line": 30, - "lineto": 73, - "block": "GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY", - "tdef": "typedef", - "description": " Options controlling how pathspec match should be executed", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PATHSPEC_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_IGNORE_CASE", - "comments": "

GIT_PATHSPEC_IGNORE_CASE forces match to ignore case; otherwise\n match will use native case sensitivity of platform filesystem

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_USE_CASE", - "comments": "

GIT_PATHSPEC_USE_CASE forces case sensitive match; otherwise\n match will use native case sensitivity of platform filesystem

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_NO_GLOB", - "comments": "

GIT_PATHSPEC_NO_GLOB disables glob patterns and just uses simple\n string comparison for matching

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_NO_MATCH_ERROR", - "comments": "

GIT_PATHSPEC_NO_MATCH_ERROR means the match functions return error\n code GIT_ENOTFOUND if no matches are found; otherwise no matches is\n still success (return 0) but git_pathspec_match_list_entrycount\n will indicate 0 matches.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_FIND_FAILURES", - "comments": "

GIT_PATHSPEC_FIND_FAILURES means that the git_pathspec_match_list\n should track which patterns matched which files so that at the end of\n the match we can identify patterns that did not match any files.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_FAILURES_ONLY", - "comments": "

GIT_PATHSPEC_FAILURES_ONLY means that the git_pathspec_match_list\n does not need to keep the actual matching filenames. Use this to\n just test if there were any matches at all or in combination with\n GIT_PATHSPEC_FIND_FAILURES to validate a pathspec.

\n", - "value": 32 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_pathspec_match_list", - { - "decl": "git_pathspec_match_list", - "type": "struct", - "value": "git_pathspec_match_list", - "file": "git2/pathspec.h", - "line": 25, - "lineto": 25, - "tdef": "typedef", - "description": " List of filenames matching a pathspec", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_pathspec_match_diff", - "git_pathspec_match_index", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_failed_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_free", - "git_pathspec_match_tree", - "git_pathspec_match_workdir" - ] - } - } - ], - [ - "git_proxy_options", - { - "decl": [ - "unsigned int version", - "git_proxy_t type", - "const char * url", - "git_credential_acquire_cb credentials", - "git_transport_certificate_check_cb certificate_check", - "void * payload" - ], - "type": "struct", - "value": "git_proxy_options", - "file": "git2/proxy.h", - "line": 44, - "lineto": 79, - "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", - "tdef": "typedef", - "description": " Options for connecting through a proxy", - "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + "files": [ + { + "file": "git2/annotated_commit.h", + "functions": [ + "git_annotated_commit_from_ref", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_lookup", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_ref", + "git_annotated_commit_free" + ], + "meta": {}, + "lines": 121 + }, + { + "file": "git2/apply.h", + "functions": [ + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_options_init", + "git_apply_to_tree", + "git_apply" + ], + "meta": {}, + "lines": 161 + }, + { + "file": "git2/attr.h", + "functions": [ + "git_attr_value", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_attr_foreach_cb", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_cache_flush", + "git_attr_add_macro" + ], + "meta": {}, + "lines": 365 + }, + { + "file": "git2/blame.h", + "functions": [ + "git_blame_options_init", + "git_blame_get_hunk_count", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_file", + "git_blame_buffer", + "git_blame_free" + ], + "meta": {}, + "lines": 280 + }, + { + "file": "git2/blob.h", + "functions": [ + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_free", + "git_blob_id", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize", + "git_blob_filter_options_init", + "git_blob_filter", + "git_blob_create_from_workdir", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_buffer", + "git_blob_is_binary", + "git_blob_data_is_binary", + "git_blob_dup" + ], + "meta": {}, + "lines": 307 + }, + { + "file": "git2/branch.h", + "functions": [ + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_iterator_new", + "git_branch_next", + "git_branch_iterator_free", + "git_branch_move", + "git_branch_lookup", + "git_branch_name", + "git_branch_upstream", + "git_branch_set_upstream", + "git_branch_upstream_name", + "git_branch_is_head", + "git_branch_is_checked_out", + "git_branch_remote_name", + "git_branch_upstream_remote", + "git_branch_upstream_merge", + "git_branch_name_is_valid" + ], + "meta": {}, + "lines": 332 + }, + { + "file": "git2/buffer.h", + "functions": [ + "git_buf_dispose" + ], + "meta": {}, + "lines": 68 + }, + { + "file": "git2/cert.h", + "functions": [ + "git_transport_certificate_check_cb" + ], + "meta": {}, + "lines": 168 + }, + { + "file": "git2/checkout.h", + "functions": [ + "git_checkout_notify_cb", + "git_checkout_progress_cb", + "git_checkout_perfdata_cb", + "git_checkout_options_init", + "git_checkout_head", + "git_checkout_index", + "git_checkout_tree" + ], + "meta": {}, + "lines": 413 + }, + { + "file": "git2/cherrypick.h", + "functions": [ + "git_cherrypick_options_init", + "git_cherrypick_commit", + "git_cherrypick" + ], + "meta": {}, + "lines": 86 + }, + { + "file": "git2/clone.h", + "functions": [ + "git_remote_create_cb", + "git_repository_create_cb", + "git_clone_options_init", + "git_clone" + ], + "meta": {}, + "lines": 205 + }, + { + "file": "git2/commit.h", + "functions": [ + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_free", + "git_commit_id", + "git_commit_owner", + "git_commit_message_encoding", + "git_commit_message", + "git_commit_message_raw", + "git_commit_summary", + "git_commit_body", + "git_commit_time", + "git_commit_time_offset", + "git_commit_committer", + "git_commit_author", + "git_commit_committer_with_mailmap", + "git_commit_author_with_mailmap", + "git_commit_raw_header", + "git_commit_tree", + "git_commit_tree_id", + "git_commit_parentcount", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_nth_gen_ancestor", + "git_commit_header_field", + "git_commit_extract_signature", + "git_commit_create", + "git_commit_create_v", + "git_commit_amend", + "git_commit_create_buffer", + "git_commit_create_with_signature", + "git_commit_dup", + "git_commit_create_cb" + ], + "meta": {}, + "lines": 542 + }, + { + "file": "git2/common.h", + "functions": [ + "git_libgit2_version", + "git_libgit2_prerelease", + "git_libgit2_features", + "git_libgit2_opts" + ], + "meta": {}, + "lines": 512 + }, + { + "file": "git2/config.h", + "functions": [ + "git_config_entry_free", + "git_config_foreach_cb", + "git_config_find_global", + "git_config_find_xdg", + "git_config_find_system", + "git_config_find_programdata", + "git_config_open_default", + "git_config_new", + "git_config_add_file_ondisk", + "git_config_open_ondisk", + "git_config_open_level", + "git_config_open_global", + "git_config_snapshot", + "git_config_free", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_bool", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_get_multivar_foreach", + "git_config_multivar_iterator_new", + "git_config_next", + "git_config_iterator_free", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_bool", + "git_config_set_string", + "git_config_set_multivar", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_foreach", + "git_config_iterator_new", + "git_config_iterator_glob_new", + "git_config_foreach_match", + "git_config_get_mapped", + "git_config_lookup_map_value", + "git_config_parse_bool", + "git_config_parse_int32", + "git_config_parse_int64", + "git_config_parse_path", + "git_config_backend_foreach_match", + "git_config_lock" + ], + "meta": {}, + "lines": 778 + }, + { + "file": "git2/credential.h", + "functions": [ + "git_credential_acquire_cb", + "git_credential_free", + "git_credential_has_username", + "git_credential_get_username", + "git_credential_userpass_plaintext_new", + "git_credential_default_new", + "git_credential_username_new", + "git_credential_ssh_key_new", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_custom_new" + ], + "meta": {}, + "lines": 311 + }, + { + "file": "git2/credential_helpers.h", + "functions": [ + "git_credential_userpass" + ], + "meta": {}, + "lines": 49 + }, + { + "file": "git2/deprecated.h", + "functions": [ + "git_blob_filtered_content", + "git_filter_list_stream_data", + "git_filter_list_apply_to_data", + "git_treebuilder_write_with_buffer", + "git_buf_grow", + "git_buf_set", + "git_buf_is_binary", + "git_buf_contains_nul", + "git_buf_free", + "git_commit_signing_cb", + "git_diff_format_email", + "git_diff_commit_as_email", + "git_diff_format_email_options_init", + "giterr_last", + "giterr_clear", + "giterr_set_str", + "giterr_set_oom", + "git_object__size", + "git_remote_is_valid_name", + "git_reference_is_valid_name", + "git_oidarray_free", + "git_headlist_cb", + "git_strarray_copy", + "git_strarray_free", + "git_blame_init_options" + ], + "meta": {}, + "lines": 905 + }, + { + "file": "git2/describe.h", + "functions": [ + "git_describe_options_init", + "git_describe_format_options_init", + "git_describe_commit", + "git_describe_workdir", + "git_describe_format", + "git_describe_result_free" + ], + "meta": {}, + "lines": 189 + }, + { + "file": "git2/diff.h", + "functions": [ + "git_diff_notify_cb", + "git_diff_progress_cb", + "git_diff_options_init", + "git_diff_file_cb", + "git_diff_binary_cb", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_diff_find_options_init", + "git_diff_free", + "git_diff_tree_to_tree", + "git_diff_tree_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_diff_index_to_index", + "git_diff_merge", + "git_diff_find_similar", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_get_delta", + "git_diff_is_sorted_icase", + "git_diff_foreach", + "git_diff_status_char", + "git_diff_print", + "git_diff_to_buf", + "git_diff_blobs", + "git_diff_blob_to_buffer", + "git_diff_buffers", + "git_diff_from_buffer", + "git_diff_get_stats", + "git_diff_stats_files_changed", + "git_diff_stats_insertions", + "git_diff_stats_deletions", + "git_diff_stats_to_buf", + "git_diff_stats_free", + "git_diff_patchid_options_init", + "git_diff_patchid" + ], + "meta": {}, + "lines": 1471 + }, + { + "file": "git2/email.h", + "functions": [], + "meta": {}, + "lines": 38 + }, + { + "file": "git2/errors.h", + "functions": [ + "git_error_last", + "git_error_clear", + "git_error_set", + "git_error_set_str", + "git_error_set_oom" + ], + "meta": {}, + "lines": 177 + }, + { + "file": "git2/filter.h", + "functions": [ + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_contains", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_file", + "git_filter_list_apply_to_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_file", + "git_filter_list_stream_blob", + "git_filter_list_free" + ], + "meta": {}, + "lines": 269 + }, + { + "file": "git2/global.h", + "functions": [ + "git_libgit2_init", + "git_libgit2_shutdown" + ], + "meta": {}, + "lines": 39 + }, + { + "file": "git2/graph.h", + "functions": [ + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any" + ], + "meta": {}, + "lines": 73 + }, + { + "file": "git2/ignore.h", + "functions": [ + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored" + ], + "meta": {}, + "lines": 74 + }, + { + "file": "git2/index.h", + "functions": [ + "git_index_matched_path_cb", + "git_index_free", + "git_index_owner", + "git_index_caps", + "git_index_set_caps", + "git_index_version", + "git_index_set_version", + "git_index_read", + "git_index_write", + "git_index_path", + "git_index_checksum", + "git_index_read_tree", + "git_index_write_tree", + "git_index_write_tree_to", + "git_index_entrycount", + "git_index_clear", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_remove", + "git_index_remove_directory", + "git_index_add", + "git_index_entry_stage", + "git_index_entry_is_conflict", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_iterator_free", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_remove_bypath", + "git_index_add_all", + "git_index_remove_all", + "git_index_update_all", + "git_index_find", + "git_index_find_prefix", + "git_index_conflict_add", + "git_index_conflict_get", + "git_index_conflict_remove", + "git_index_conflict_cleanup", + "git_index_has_conflicts", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_iterator_free" + ], + "meta": {}, + "lines": 844 + }, + { + "file": "git2/indexer.h", + "functions": [ + "git_indexer_progress_cb", + "git_indexer_options_init", + "git_indexer_new", + "git_indexer_append", + "git_indexer_commit", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_free" + ], + "meta": {}, + "lines": 191 + }, + { + "file": "git2/mailmap.h", + "functions": [ + "git_mailmap_new", + "git_mailmap_free", + "git_mailmap_add_entry", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ], + "meta": {}, + "lines": 111 + }, + { + "file": "git2/merge.h", + "functions": [ + "git_merge_file_input_init", + "git_merge_file_options_init", + "git_merge_options_init", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_bases", + "git_merge_base_many", + "git_merge_bases_many", + "git_merge_base_octopus", + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_result_free", + "git_merge_trees", + "git_merge_commits", + "git_merge" + ], + "meta": {}, + "lines": 622 + }, + { + "file": "git2/message.h", + "functions": [ + "git_message_prettify", + "git_message_trailers", + "git_message_trailer_array_free" + ], + "meta": {}, + "lines": 81 + }, + { + "file": "git2/net.h", + "functions": [], + "meta": {}, + "lines": 50 + }, + { + "file": "git2/notes.h", + "functions": [ + "git_note_foreach_cb", + "git_note_iterator_new", + "git_note_commit_iterator_new", + "git_note_iterator_free", + "git_note_next", + "git_note_read", + "git_note_commit_read", + "git_note_author", + "git_note_committer", + "git_note_message", + "git_note_id", + "git_note_create", + "git_note_commit_create", + "git_note_remove", + "git_note_commit_remove", + "git_note_free", + "git_note_default_ref", + "git_note_foreach" + ], + "meta": {}, + "lines": 302 + }, + { + "file": "git2/object.h", + "functions": [ + "git_object_lookup", + "git_object_lookup_prefix", + "git_object_lookup_bypath", + "git_object_id", + "git_object_short_id", + "git_object_type", + "git_object_owner", + "git_object_free", + "git_object_type2string", + "git_object_string2type", + "git_object_typeisloose", + "git_object_peel", + "git_object_dup", + "git_object_rawcontent_is_valid" + ], + "meta": {}, + "lines": 273 + }, + { + "file": "git2/odb.h", + "functions": [ + "git_odb_foreach_cb", + "git_odb_add_disk_alternate", + "git_odb_free", + "git_odb_read", + "git_odb_read_prefix", + "git_odb_read_header", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_refresh", + "git_odb_foreach", + "git_odb_write", + "git_odb_open_wstream", + "git_odb_stream_write", + "git_odb_stream_finalize_write", + "git_odb_stream_read", + "git_odb_stream_free", + "git_odb_open_rstream", + "git_odb_write_pack", + "git_odb_write_multi_pack_index", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_data", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_add_backend", + "git_odb_add_alternate", + "git_odb_num_backends", + "git_odb_get_backend", + "git_odb_set_commit_graph" + ], + "meta": {}, + "lines": 650 + }, + { + "file": "git2/odb_backend.h", + "functions": [], + "meta": {}, + "lines": 219 + }, + { + "file": "git2/oid.h", + "functions": [ + "git_oid_fmt", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_tostr_s", + "git_oid_tostr", + "git_oid_cpy", + "git_oid_cmp", + "git_oid_equal", + "git_oid_ncmp", + "git_oid_streq", + "git_oid_strcmp", + "git_oid_is_zero", + "git_oid_shorten_new", + "git_oid_shorten_add", + "git_oid_shorten_free" + ], + "meta": {}, + "lines": 369 + }, + { + "file": "git2/oidarray.h", + "functions": [ + "git_oidarray_dispose" + ], + "meta": {}, + "lines": 31 + }, + { + "file": "git2/pack.h", + "functions": [ + "git_packbuilder_new", + "git_packbuilder_set_threads", + "git_packbuilder_insert", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_walk", + "git_packbuilder_insert_recur", + "git_packbuilder_write_buf", + "git_packbuilder_write", + "git_packbuilder_hash", + "git_packbuilder_name", + "git_packbuilder_foreach_cb", + "git_packbuilder_foreach", + "git_packbuilder_object_count", + "git_packbuilder_written", + "git_packbuilder_progress", + "git_packbuilder_set_callbacks", + "git_packbuilder_free" + ], + "meta": {}, + "lines": 263 + }, + { + "file": "git2/patch.h", + "functions": [ + "git_patch_owner", + "git_patch_from_diff", + "git_patch_from_blobs", + "git_patch_from_blob_and_buffer", + "git_patch_from_buffers", + "git_patch_free", + "git_patch_get_delta", + "git_patch_num_hunks", + "git_patch_line_stats", + "git_patch_get_hunk", + "git_patch_num_lines_in_hunk", + "git_patch_get_line_in_hunk", + "git_patch_size", + "git_patch_print", + "git_patch_to_buf" + ], + "meta": {}, + "lines": 284 + }, + { + "file": "git2/pathspec.h", + "functions": [ + "git_pathspec_new", + "git_pathspec_free", + "git_pathspec_matches_path", + "git_pathspec_match_workdir", + "git_pathspec_match_index", + "git_pathspec_match_tree", + "git_pathspec_match_diff", + "git_pathspec_match_list_free", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_failed_entry" + ], + "meta": {}, + "lines": 277 + }, + { + "file": "git2/proxy.h", + "functions": [ + "git_proxy_options_init" + ], + "meta": {}, + "lines": 94 + }, + { + "file": "git2/rebase.h", + "functions": [ + "git_rebase_options_init", + "git_rebase_init", + "git_rebase_open", + "git_rebase_orig_head_name", + "git_rebase_orig_head_id", + "git_rebase_onto_name", + "git_rebase_onto_id", + "git_rebase_operation_entrycount", + "git_rebase_operation_current", + "git_rebase_operation_byindex", + "git_rebase_next", + "git_rebase_inmemory_index", + "git_rebase_commit", + "git_rebase_abort", + "git_rebase_finish", + "git_rebase_free" + ], + "meta": {}, + "lines": 395 + }, + { + "file": "git2/refdb.h", + "functions": [ + "git_refdb_new", + "git_refdb_open", + "git_refdb_compress", + "git_refdb_free" + ], + "meta": {}, + "lines": 66 + }, + { + "file": "git2/reflog.h", + "functions": [ + "git_reflog_read", + "git_reflog_write", + "git_reflog_append", + "git_reflog_rename", + "git_reflog_delete", + "git_reflog_entrycount", + "git_reflog_entry_byindex", + "git_reflog_drop", + "git_reflog_entry_id_old", + "git_reflog_entry_id_new", + "git_reflog_entry_committer", + "git_reflog_entry_message", + "git_reflog_free" + ], + "meta": {}, + "lines": 166 + }, + { + "file": "git2/refs.h", + "functions": [ + "git_reference_lookup", + "git_reference_name_to_id", + "git_reference_dwim", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_create", + "git_reference_create", + "git_reference_create_matching", + "git_reference_target", + "git_reference_target_peel", + "git_reference_symbolic_target", + "git_reference_type", + "git_reference_name", + "git_reference_resolve", + "git_reference_owner", + "git_reference_symbolic_set_target", + "git_reference_set_target", + "git_reference_rename", + "git_reference_delete", + "git_reference_remove", + "git_reference_list", + "git_reference_foreach_cb", + "git_reference_foreach_name_cb", + "git_reference_foreach", + "git_reference_foreach_name", + "git_reference_dup", + "git_reference_free", + "git_reference_cmp", + "git_reference_iterator_new", + "git_reference_iterator_glob_new", + "git_reference_next", + "git_reference_next_name", + "git_reference_iterator_free", + "git_reference_foreach_glob", + "git_reference_has_log", + "git_reference_ensure_log", + "git_reference_is_branch", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_is_note", + "git_reference_normalize_name", + "git_reference_peel", + "git_reference_name_is_valid", + "git_reference_shorthand" + ], + "meta": {}, + "lines": 767 + }, + { + "file": "git2/refspec.h", + "functions": [ + "git_refspec_parse", + "git_refspec_free", + "git_refspec_src", + "git_refspec_dst", + "git_refspec_string", + "git_refspec_force", + "git_refspec_direction", + "git_refspec_src_matches", + "git_refspec_dst_matches", + "git_refspec_transform", + "git_refspec_rtransform" + ], + "meta": {}, + "lines": 117 + }, + { + "file": "git2/remote.h", + "functions": [ + "git_remote_create", + "git_remote_create_options_init", + "git_remote_create_with_opts", + "git_remote_create_with_fetchspec", + "git_remote_create_anonymous", + "git_remote_create_detached", + "git_remote_lookup", + "git_remote_dup", + "git_remote_owner", + "git_remote_name", + "git_remote_url", + "git_remote_pushurl", + "git_remote_set_url", + "git_remote_set_pushurl", + "git_remote_set_instance_url", + "git_remote_set_instance_pushurl", + "git_remote_add_fetch", + "git_remote_get_fetch_refspecs", + "git_remote_add_push", + "git_remote_get_push_refspecs", + "git_remote_refspec_count", + "git_remote_get_refspec", + "git_remote_ls", + "git_remote_connected", + "git_remote_stop", + "git_remote_disconnect", + "git_remote_free", + "git_remote_list", + "git_push_transfer_progress_cb", + "git_push_negotiation", + "git_push_update_reference_cb", + "git_url_resolve_cb", + "git_remote_ready_cb", + "git_remote_init_callbacks", + "git_fetch_options_init", + "git_push_options_init", + "git_remote_connect_options_init", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_download", + "git_remote_upload", + "git_remote_update_tips", + "git_remote_fetch", + "git_remote_prune", + "git_remote_push", + "git_remote_stats", + "git_remote_autotag", + "git_remote_set_autotag", + "git_remote_prune_refs", + "git_remote_rename", + "git_remote_name_is_valid", + "git_remote_delete", + "git_remote_default_branch" + ], + "meta": {}, + "lines": 1169 + }, + { + "file": "git2/repository.h", + "functions": [ + "git_repository_open", + "git_repository_open_from_worktree", + "git_repository_discover", + "git_repository_open_ext", + "git_repository_open_bare", + "git_repository_free", + "git_repository_init", + "git_repository_init_options_init", + "git_repository_init_ext", + "git_repository_head", + "git_repository_head_for_worktree", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_unborn", + "git_repository_is_empty", + "git_repository_item_path", + "git_repository_path", + "git_repository_workdir", + "git_repository_commondir", + "git_repository_set_workdir", + "git_repository_is_bare", + "git_repository_is_worktree", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_odb", + "git_repository_refdb", + "git_repository_index", + "git_repository_message", + "git_repository_message_remove", + "git_repository_state_cleanup", + "git_repository_fetchhead_foreach_cb", + "git_repository_fetchhead_foreach", + "git_repository_mergehead_foreach_cb", + "git_repository_mergehead_foreach", + "git_repository_hashfile", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_detach_head", + "git_repository_state", + "git_repository_set_namespace", + "git_repository_get_namespace", + "git_repository_is_shallow", + "git_repository_ident", + "git_repository_set_ident", + "git_repository_oid_type" + ], + "meta": {}, + "lines": 979 + }, + { + "file": "git2/reset.h", + "functions": [ + "git_reset", + "git_reset_from_annotated", + "git_reset_default" + ], + "meta": {}, + "lines": 107 + }, + { + "file": "git2/revert.h", + "functions": [ + "git_revert_options_init", + "git_revert_commit", + "git_revert" + ], + "meta": {}, + "lines": 86 + }, + { + "file": "git2/revparse.h", + "functions": [ + "git_revparse_single", + "git_revparse_ext", + "git_revparse" + ], + "meta": {}, + "lines": 108 + }, + { + "file": "git2/revwalk.h", + "functions": [ + "git_revwalk_new", + "git_revwalk_reset", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_push_ref", + "git_revwalk_hide_ref", + "git_revwalk_next", + "git_revwalk_sorting", + "git_revwalk_push_range", + "git_revwalk_simplify_first_parent", + "git_revwalk_free", + "git_revwalk_repository", + "git_revwalk_hide_cb", + "git_revwalk_add_hide_cb" + ], + "meta": {}, + "lines": 298 + }, + { + "file": "git2/signature.h", + "functions": [ + "git_signature_new", + "git_signature_now", + "git_signature_default", + "git_signature_from_buffer", + "git_signature_dup", + "git_signature_free" + ], + "meta": {}, + "lines": 99 + }, + { + "file": "git2/stash.h", + "functions": [ + "git_stash_save", + "git_stash_save_options_init", + "git_stash_save_with_opts", + "git_stash_apply_progress_cb", + "git_stash_apply_options_init", + "git_stash_apply", + "git_stash_cb", + "git_stash_foreach", + "git_stash_drop", + "git_stash_pop" + ], + "meta": {}, + "lines": 310 + }, + { + "file": "git2/status.h", + "functions": [ + "git_status_cb", + "git_status_options_init", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_file", + "git_status_list_new", + "git_status_list_entrycount", + "git_status_byindex", + "git_status_list_free", + "git_status_should_ignore" + ], + "meta": {}, + "lines": 448 + }, + { + "file": "git2/strarray.h", + "functions": [ + "git_strarray_dispose" + ], + "meta": {}, + "lines": 37 + }, + { + "file": "git2/submodule.h", + "functions": [ + "git_submodule_cb", + "git_submodule_update_options_init", + "git_submodule_update", + "git_submodule_lookup", + "git_submodule_dup", + "git_submodule_free", + "git_submodule_foreach", + "git_submodule_add_setup", + "git_submodule_clone", + "git_submodule_add_finalize", + "git_submodule_add_to_index", + "git_submodule_owner", + "git_submodule_name", + "git_submodule_path", + "git_submodule_url", + "git_submodule_resolve_url", + "git_submodule_branch", + "git_submodule_set_branch", + "git_submodule_set_url", + "git_submodule_index_id", + "git_submodule_head_id", + "git_submodule_wd_id", + "git_submodule_ignore", + "git_submodule_set_ignore", + "git_submodule_update_strategy", + "git_submodule_set_update", + "git_submodule_fetch_recurse_submodules", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_init", + "git_submodule_repo_init", + "git_submodule_sync", + "git_submodule_open", + "git_submodule_reload", + "git_submodule_status", + "git_submodule_location" + ], + "meta": {}, + "lines": 664 + }, + { + "file": "git2/sys/commit_graph.h", + "functions": [], + "meta": {}, + "lines": 108 + }, + { + "file": "git2/sys/filter.h", + "functions": [], + "meta": {}, + "lines": 95 + }, + { + "file": "git2/sys/hashsig.h", + "functions": [], + "meta": {}, + "lines": 45 + }, + { + "file": "git2/sys/merge.h", + "functions": [], + "meta": {}, + "lines": 41 + }, + { + "file": "git2/sys/path.h", + "functions": [], + "meta": {}, + "lines": 41 + }, + { + "file": "git2/sys/stream.h", + "functions": [], + "meta": {}, + "lines": 97 + }, + { + "file": "git2/sys/transport.h", + "functions": [], + "meta": {}, + "lines": 318 + }, + { + "file": "git2/tag.h", + "functions": [ + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_free", + "git_tag_id", + "git_tag_owner", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type", + "git_tag_name", + "git_tag_tagger", + "git_tag_message", + "git_tag_create", + "git_tag_annotation_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_list", + "git_tag_list_match", + "git_tag_foreach_cb", + "git_tag_foreach", + "git_tag_peel", + "git_tag_dup", + "git_tag_name_is_valid" + ], + "meta": {}, + "lines": 379 + }, + { + "file": "git2/trace.h", + "functions": [ + "git_trace_cb", + "git_trace_set" + ], + "meta": {}, + "lines": 63 + }, + { + "file": "git2/transaction.h", + "functions": [ + "git_transaction_new", + "git_transaction_lock_ref", + "git_transaction_set_target", + "git_transaction_set_symbolic_target", + "git_transaction_set_reflog", + "git_transaction_remove", + "git_transaction_commit", + "git_transaction_free" + ], + "meta": {}, + "lines": 117 + }, + { + "file": "git2/transport.h", + "functions": [ + "git_transport_message_cb", + "git_transport_cb" + ], + "meta": {}, + "lines": 37 + }, + { + "file": "git2/tree.h", + "functions": [ + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_free", + "git_tree_id", + "git_tree_owner", + "git_tree_entrycount", + "git_tree_entry_byname", + "git_tree_entry_byindex", + "git_tree_entry_byid", + "git_tree_entry_bypath", + "git_tree_entry_dup", + "git_tree_entry_free", + "git_tree_entry_name", + "git_tree_entry_id", + "git_tree_entry_type", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_cmp", + "git_tree_entry_to_object", + "git_treebuilder_new", + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_remove", + "git_treebuilder_filter_cb", + "git_treebuilder_filter", + "git_treebuilder_write", + "git_treewalk_cb", + "git_tree_walk", + "git_tree_dup", + "git_tree_create_updated" + ], + "meta": {}, + "lines": 470 + }, + { + "file": "git2/types.h", + "functions": [], + "meta": {}, + "lines": 366 + }, + { + "file": "git2/worktree.h", + "functions": [ + "git_worktree_list", + "git_worktree_lookup", + "git_worktree_open_from_repository", + "git_worktree_free", + "git_worktree_validate", + "git_worktree_add_options_init", + "git_worktree_add", + "git_worktree_lock", + "git_worktree_unlock", + "git_worktree_is_locked", + "git_worktree_name", + "git_worktree_path", + "git_worktree_prune_options_init", + "git_worktree_is_prunable", + "git_worktree_prune" + ], + "meta": {}, + "lines": 264 + } + ], + "functions": { + "git_annotated_commit_from_ref": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 33, + "lineto": 36, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given reference" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "reference to use to lookup the git_annotated_commit" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const git_reference *ref", + "sig": "git_annotated_commit **::git_repository *::const git_reference *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_annotated_commit_from_ref-1" + ] + } + }, + "git_annotated_commit_from_fetchhead": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 50, + "lineto": 55, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "name of the (remote) branch" + }, + { + "name": "remote_url", + "type": "const char *", + "comment": "url of the remote" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the commit object id of the remote branch" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const char *branch_name, const char *remote_url, const git_oid *id", + "sig": "git_annotated_commit **::git_repository *::const char *::const char *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Creates a git_annotated_commit from the given fetch head data.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "", + "group": "annotated" + }, + "git_annotated_commit_lookup": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 75, + "lineto": 78, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the commit object id to lookup" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const git_oid *id", + "sig": "git_annotated_commit **::git_repository *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "

An annotated commit contains information about how it was looked up, which may be useful for functions like merge or rebase to provide context to the operation. For example, conflict files will include the name of the source or target branches being merged. It is therefore preferable to use the most specific function (eg git_annotated_commit_from_ref) instead of this one when that data is known.

\n", + "group": "annotated" + }, + "git_annotated_commit_from_revspec": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 92, + "lineto": 95, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "revspec", + "type": "const char *", + "comment": "the extended sha syntax string to use to lookup the commit" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const char *revspec", + "sig": "git_annotated_commit **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Creates a git_annotated_commit from a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "group": "annotated" + }, + "git_annotated_commit_id": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 103, + "lineto": 104, + "args": [ + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": "the given annotated commit" + } + ], + "argline": "const git_annotated_commit *commit", + "sig": "const git_annotated_commit *", + "return": { + "type": "const git_oid *", + "comment": " commit id" + }, + "description": "

Gets the commit ID that the given git_annotated_commit refers to.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_annotated_commit_id-2" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_annotated_commit_id-1", + "ex/v1.7.2/merge.html#git_annotated_commit_id-2", + "ex/v1.7.2/merge.html#git_annotated_commit_id-3" + ] + } + }, + "git_annotated_commit_ref": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 112, + "lineto": 113, + "args": [ + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": "the given annotated commit" + } + ], + "argline": "const git_annotated_commit *commit", + "sig": "const git_annotated_commit *", + "return": { + "type": "const char *", + "comment": " ref name." + }, + "description": "

Get the refname that the given git_annotated_commit refers to.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_annotated_commit_ref-3", + "ex/v1.7.2/checkout.html#git_annotated_commit_ref-4", + "ex/v1.7.2/checkout.html#git_annotated_commit_ref-5" + ] + } + }, + "git_annotated_commit_free": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 120, + "lineto": 121, + "args": [ + { + "name": "commit", + "type": "git_annotated_commit *", + "comment": "annotated commit to free" + } + ], + "argline": "git_annotated_commit *commit", + "sig": "git_annotated_commit *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Frees a git_annotated_commit.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_annotated_commit_free-6" + ] + } + }, + "git_apply_options_init": { + "type": "function", + "file": "git2/apply.h", + "line": 106, + "lineto": 106, + "args": [ + { + "name": "opts", + "type": "git_apply_options *", + "comment": "The `git_apply_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_APPLY_OPTIONS_VERSION`" + } + ], + "argline": "git_apply_options *opts, unsigned int version", + "sig": "git_apply_options *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success or -1 on failure." + }, + "description": "

Initialize git_apply_options structure

\n", + "comments": "

Initialize a git_apply_options with default values. Equivalent to creating an instance with GIT_APPLY_OPTIONS_INIT.

\n", + "group": "apply" + }, + "git_apply_to_tree": { + "type": "function", + "file": "git2/apply.h", + "line": 119, + "lineto": 124, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "the postimage of the application" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply" + }, + { + "name": "preimage", + "type": "git_tree *", + "comment": "the tree to apply the diff to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_tree *preimage, git_diff *diff, const git_apply_options *options", + "sig": "git_index **::git_repository *::git_tree *::git_diff *::const git_apply_options *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Apply a git_diff to a git_tree, and return the resulting image\n as an index.

\n", + "comments": "", + "group": "apply" + }, + "git_apply": { + "type": "function", + "file": "git2/apply.h", + "line": 157, + "lineto": 161, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "location", + "type": "git_apply_location_t", + "comment": "the location to apply (workdir, index or both)" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_diff *diff, git_apply_location_t location, const git_apply_options *options", + "sig": "git_repository *::git_diff *::git_apply_location_t::const git_apply_options *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Apply a git_diff to the given repository, making changes directly\n in the working directory, the index, or both.

\n", + "comments": "", + "group": "apply" + }, + "git_attr_value": { + "type": "function", + "file": "git2/attr.h", + "line": 102, + "lineto": 102, + "args": [ + { + "name": "attr", + "type": "const char *", + "comment": "The attribute" + } + ], + "argline": "const char *attr", + "sig": "const char *", + "return": { + "type": "git_attr_value_t", + "comment": " the value type for the attribute" + }, + "description": "

Return the value type for a given attribute.

\n", + "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute was not set at all), or VALUE, if the attribute was set to an actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally as a NULL-terminated C string.

\n", + "group": "attr" + }, + "git_attr_get": { + "type": "function", + "file": "git2/attr.h", + "line": 182, + "lineto": 187, + "args": [ + { + "name": "value_out", + "type": "const char **", + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the attribute to look up." + } + ], + "argline": "const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name", + "sig": "const char **::git_repository *::uint32_t::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Look up the value of one git attribute for path.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_get_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 205, + "lineto": 210, + "args": [ + { + "name": "value_out", + "type": "const char **", + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the attribute to look up." + } + ], + "argline": "const char **value_out, git_repository *repo, git_attr_options *opts, const char *path, const char *name", + "sig": "const char **::git_repository *::git_attr_options *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Look up the value of one git attribute for path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_get_many": { + "type": "function", + "file": "git2/attr.h", + "line": 242, + "lineto": 248, + "args": [ + { + "name": "values_out", + "type": "const char **", + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + }, + { + "name": "num_attr", + "type": "size_t", + "comment": "The number of attributes being looked up" + }, + { + "name": "names", + "type": "const char **", + "comment": "An array of num_attr strings containing attribute names." + } + ], + "argline": "const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::uint32_t::const char *::size_t::const char **", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Look up a list of git attributes for path.

\n", + "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", + "group": "attr" + }, + "git_attr_get_many_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 267, + "lineto": 273, + "args": [ + { + "name": "values_out", + "type": "const char **", + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + }, + { + "name": "num_attr", + "type": "size_t", + "comment": "The number of attributes being looked up" + }, + { + "name": "names", + "type": "const char **", + "comment": "An array of num_attr strings containing attribute names." + } + ], + "argline": "const char **values_out, git_repository *repo, git_attr_options *opts, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::git_attr_options *::const char *::size_t::const char **", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Look up a list of git attributes for path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_foreach": { + "type": "function", + "file": "git2/attr.h", + "line": 306, + "lineto": 311, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + }, + { + "name": "callback", + "type": "git_attr_foreach_cb", + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + }, + { + "name": "payload", + "type": "void *", + "comment": "Passed on as extra parameter to callback function." + } + ], + "argline": "git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the git attributes for a path.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_foreach_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 326, + "lineto": 331, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + }, + { + "name": "callback", + "type": "git_attr_foreach_cb", + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + }, + { + "name": "payload", + "type": "void *", + "comment": "Passed on as extra parameter to callback function." + } + ], + "argline": "git_repository *repo, git_attr_options *opts, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::git_attr_options *::const char *::git_attr_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the git attributes for a path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_cache_flush": { + "type": "function", + "file": "git2/attr.h", + "line": 344, + "lineto": 345, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the gitattributes cache" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Flush the gitattributes cache.

\n", + "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", + "group": "attr" + }, + "git_attr_add_macro": { + "type": "function", + "file": "git2/attr.h", + "line": 362, + "lineto": 365, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to add the macro in." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the macro." + }, + { + "name": "values", + "type": "const char *", + "comment": "The value for the macro." + } + ], + "argline": "git_repository *repo, const char *name, const char *values", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Add a macro definition.

\n", + "comments": "

Macros will automatically be loaded from the top level .gitattributes file of the repository (plus the built-in "binary" macro). This function allows you to add others. For example, to add the default macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", + "group": "attr" + }, + "git_blame_options_init": { + "type": "function", + "file": "git2/blame.h", + "line": 138, + "lineto": 140, + "args": [ + { + "name": "opts", + "type": "git_blame_options *", + "comment": "The `git_blame_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_BLAME_OPTIONS_VERSION`." + } + ], + "argline": "git_blame_options *opts, unsigned int version", + "sig": "git_blame_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_blame_options structure

\n", + "comments": "

Initializes a git_blame_options with default values. Equivalent to creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", + "group": "blame" + }, + "git_blame_get_hunk_count": { + "type": "function", + "file": "git2/blame.h", + "line": 210, + "lineto": 210, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "The blame structure to query." + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { + "type": "uint32_t", + "comment": " The number of hunks." + }, + "description": "

Gets the number of hunks that exist in the blame structure.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byindex": { + "type": "function", + "file": "git2/blame.h", + "line": 219, + "lineto": 221, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "index", + "type": "uint32_t", + "comment": "index of the hunk to retrieve" + } + ], + "argline": "git_blame *blame, uint32_t index", + "sig": "git_blame *::uint32_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk at the given index, or NULL on error" + }, + "description": "

Gets the blame hunk at the given index.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byline": { + "type": "function", + "file": "git2/blame.h", + "line": 230, + "lineto": 232, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "lineno", + "type": "size_t", + "comment": "the (1-based) line number to find a hunk for" + } + ], + "argline": "git_blame *blame, size_t lineno", + "sig": "git_blame *::size_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk that contains the given line, or NULL on error" + }, + "description": "

Gets the hunk that relates to the given line number in the newest commit.

\n", + "comments": "", + "group": "blame", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_blame_get_hunk_byline-1" + ] + } + }, + "git_blame_file": { + "type": "function", + "file": "git2/blame.h", + "line": 245, + "lineto": 249, + "args": [ + { + "name": "out", + "type": "git_blame **", + "comment": "pointer that will receive the blame object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository whose history is to be walked" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to file to consider" + }, + { + "name": "options", + "type": "git_blame_options *", + "comment": "options for the blame operation. If NULL, this is treated as\n though GIT_BLAME_OPTIONS_INIT were passed." + } + ], + "argline": "git_blame **out, git_repository *repo, const char *path, git_blame_options *options", + "sig": "git_blame **::git_repository *::const char *::git_blame_options *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error.)" + }, + "description": "

Get the blame for a single file.

\n", + "comments": "", + "group": "blame", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_blame_file-2" + ] + } + }, + "git_blame_buffer": { + "type": "function", + "file": "git2/blame.h", + "line": 269, + "lineto": 273, + "args": [ + { + "name": "out", + "type": "git_blame **", + "comment": "pointer that will receive the resulting blame data" + }, + { + "name": "reference", + "type": "git_blame *", + "comment": "cached blame from the history of the file (usually the output\n from git_blame_file)" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the (possibly) modified contents of the file" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "number of valid bytes in the buffer" + } + ], + "argline": "git_blame **out, git_blame *reference, const char *buffer, size_t buffer_len", + "sig": "git_blame **::git_blame *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" + }, + "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", + "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", + "group": "blame" + }, + "git_blame_free": { + "type": "function", + "file": "git2/blame.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to free" + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free memory allocated by git_blame_file or git_blame_buffer.

\n", + "comments": "", + "group": "blame", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_blame_free-3" + ] + } + }, + "git_blob_lookup": { + "type": "function", + "file": "git2/blob.h", + "line": 33, + "lineto": 33, + "args": [ + { + "name": "blob", + "type": "git_blob **", + "comment": "pointer to the looked up blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the blob." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the blob to locate." + } + ], + "argline": "git_blob **blob, git_repository *repo, const git_oid *id", + "sig": "git_blob **::git_repository *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a blob object from a repository.

\n", + "comments": "", + "group": "blob", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_blob_lookup-4" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_blob_lookup-1" + ] + } + }, + "git_blob_lookup_prefix": { + "type": "function", + "file": "git2/blob.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "blob", + "type": "git_blob **", + "comment": "pointer to the looked up blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the blob." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the blob to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_blob **blob, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_blob **::git_repository *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a blob object from a repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "blob" + }, + "git_blob_free": { + "type": "function", + "file": "git2/blob.h", + "line": 60, + "lineto": 60, + "args": [ + { + "name": "blob", + "type": "git_blob *", + "comment": "the blob to close" + } + ], + "argline": "git_blob *blob", + "sig": "git_blob *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an open blob

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", + "group": "blob", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_blob_free-5" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_blob_free-2" + ] + } + }, + "git_blob_id": { + "type": "function", + "file": "git2/blob.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "a previously loaded blob." + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "const git_oid *", + "comment": " SHA1 hash for this blob." + }, + "description": "

Get the id of a blob.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_owner": { + "type": "function", + "file": "git2/blob.h", + "line": 76, + "lineto": 76, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "A previously loaded blob." + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this blob." + }, + "description": "

Get the repository that contains the blob.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_rawcontent": { + "type": "function", + "file": "git2/blob.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "pointer to the blob" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "const void *", + "comment": " the pointer, or NULL on error" + }, + "description": "

Get a read-only buffer with the raw content of a blob.

\n", + "comments": "

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.

\n", + "group": "blob", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_blob_rawcontent-6" + ], + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_blob_rawcontent-1" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_blob_rawcontent-3" + ] + } + }, + "git_blob_rawsize": { + "type": "function", + "file": "git2/blob.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "pointer to the blob" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "git_object_size_t", + "comment": " size on bytes" + }, + "description": "

Get the size in bytes of the contents of a blob

\n", + "comments": "", + "group": "blob", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_blob_rawsize-7" + ], + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_blob_rawsize-2" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_blob_rawsize-4", + "ex/v1.7.2/general.html#git_blob_rawsize-5" + ] + } + }, + "git_blob_filter_options_init": { + "type": "function", + "file": "git2/blob.h", + "line": 164, + "lineto": 164, + "args": [ + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "The `git_blob_filter_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_BLOB_FILTER_OPTIONS_VERSION`." + } + ], + "argline": "git_blob_filter_options *opts, unsigned int version", + "sig": "git_blob_filter_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_blob_filter_options structure

\n", + "comments": "

Initializes a git_blob_filter_options with default values. Equivalent to creating an instance with GIT_BLOB_FILTER_OPTIONS_INIT.

\n", + "group": "blob" + }, + "git_blob_filter": { + "type": "function", + "file": "git2/blob.h", + "line": 188, + "lineto": 192, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The git_buf to be filled in" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "Pointer to the blob" + }, + { + "name": "as_path", + "type": "const char *", + "comment": "Path used for file attribute lookups, etc." + }, + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "Options to use for filtering the blob" + } + ], + "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", + "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Get a buffer with the filtered content of a blob.

\n", + "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", + "group": "blob" + }, + "git_blob_create_from_workdir": { + "type": "function", + "file": "git2/blob.h", + "line": 205, + "lineto": 205, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written.\n\tthis repository cannot be bare" + }, + { + "name": "relative_path", + "type": "const char *", + "comment": "file from which the blob will be created,\n\trelative to the repository's working dir" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *relative_path", + "sig": "git_oid *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Read a file from the working folder of a repository\n and write it to the Object Database as a loose blob

\n", + "comments": "", + "group": "blob" + }, + "git_blob_create_from_disk": { + "type": "function", + "file": "git2/blob.h", + "line": 217, + "lineto": 217, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written.\n\tthis repository can be bare or not" + }, + { + "name": "path", + "type": "const char *", + "comment": "file from which the blob will be created" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *path", + "sig": "git_oid *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Read a file from the filesystem and write its content\n to the Object Database as a loose blob

\n", + "comments": "", + "group": "blob" + }, + "git_blob_create_from_stream": { + "type": "function", + "file": "git2/blob.h", + "line": 244, + "lineto": 247, + "args": [ + { + "name": "out", + "type": "git_writestream **", + "comment": "the stream into which to write" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where the blob will be written.\n This repository can be bare or not." + }, + { + "name": "hintpath", + "type": "const char *", + "comment": "If not NULL, will be used to select data filters\n to apply onto the content of the blob to be created." + } + ], + "argline": "git_writestream **out, git_repository *repo, const char *hintpath", + "sig": "git_writestream **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or error code" + }, + "description": "

Create a stream to write a new blob into the object db

\n", + "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_from_buffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_from_stream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", + "group": "blob" + }, + "git_blob_create_from_stream_commit": { + "type": "function", + "file": "git2/blob.h", + "line": 258, + "lineto": 260, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the id of the new blob" + }, + { + "name": "stream", + "type": "git_writestream *", + "comment": "the stream to close" + } + ], + "argline": "git_oid *out, git_writestream *stream", + "sig": "git_oid *::git_writestream *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Close the stream and write the blob to the object db

\n", + "comments": "

The stream will be closed and freed.

\n", + "group": "blob" + }, + "git_blob_create_from_buffer": { + "type": "function", + "file": "git2/blob.h", + "line": 271, + "lineto": 272, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "data to be written into the blob" + }, + { + "name": "len", + "type": "size_t", + "comment": "length of the data" + } + ], + "argline": "git_oid *id, git_repository *repo, const void *buffer, size_t len", + "sig": "git_oid *::git_repository *::const void *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Write an in-memory buffer to the ODB as a blob

\n", + "comments": "", + "group": "blob" + }, + "git_blob_is_binary": { + "type": "function", + "file": "git2/blob.h", + "line": 285, + "lineto": 285, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "The blob which content should be analyzed" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "int", + "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." + }, + "description": "

Determine if the blob content is most certainly binary or not.

\n", + "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", + "group": "blob" + }, + "git_blob_data_is_binary": { + "type": "function", + "file": "git2/blob.h", + "line": 297, + "lineto": 297, + "args": [ + { + "name": "data", + "type": "const char *", + "comment": "The blob data which content should be analyzed" + }, + { + "name": "len", + "type": "size_t", + "comment": "The length of the data" + } + ], + "argline": "const char *data, size_t len", + "sig": "const char *::size_t", + "return": { + "type": "int", + "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." + }, + "description": "

Determine if the given content is most certainly binary or not;\n this is the same mechanism used by git_blob_is_binary but only\n looking at raw data.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_dup": { + "type": "function", + "file": "git2/blob.h", + "line": 307, + "lineto": 307, + "args": [ + { + "name": "out", + "type": "git_blob **", + "comment": "Pointer to store the copy of the object" + }, + { + "name": "source", + "type": "git_blob *", + "comment": "Original object to copy" + } + ], + "argline": "git_blob **out, git_blob *source", + "sig": "git_blob **::git_blob *", + "return": { + "type": "int", + "comment": " 0." + }, + "description": "

Create an in-memory copy of a blob. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "blob" + }, + "git_branch_create": { + "type": "function", + "file": "git2/branch.h", + "line": 52, + "lineto": 57, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer where to store the underlying reference." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the branch in." + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." + }, + { + "name": "target", + "type": "const git_commit *", + "comment": "Commit to which this branch should point. This object\n must belong to the given `repo`." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } + ], + "argline": "git_reference **out, git_repository *repo, const char *branch_name, const git_commit *target, int force", + "sig": "git_reference **::git_repository *::const char *::const git_commit *::int", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit." + }, + "description": "

Create a new branch pointing at a target commit

\n", + "comments": "

A new direct reference will be created pointing to this target commit. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "branch" + }, + "git_branch_create_from_annotated": { + "type": "function", + "file": "git2/branch.h", + "line": 70, + "lineto": 75, + "args": [ + { + "name": "ref_out", + "type": "git_reference **", + "comment": null + }, + { + "name": "repository", + "type": "git_repository *", + "comment": null + }, + { + "name": "branch_name", + "type": "const char *", + "comment": null + }, + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": null + }, + { + "name": "force", + "type": "int", + "comment": null + } + ], + "argline": "git_reference **ref_out, git_repository *repository, const char *branch_name, const git_annotated_commit *commit, int force", + "sig": "git_reference **::git_repository *::const char *::const git_annotated_commit *::int", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create a new branch pointing at a target commit

\n", + "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", + "group": "branch", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_branch_create_from_annotated-7" + ] + } + }, + "git_branch_delete": { + "type": "function", + "file": "git2/branch.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "branch", + "type": "git_reference *", + "comment": "A valid reference representing a branch" + } + ], + "argline": "git_reference *branch", + "sig": "git_reference *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code." + }, + "description": "

Delete an existing branch reference.

\n", + "comments": "

Note that if the deletion succeeds, the reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", + "group": "branch" + }, + "git_branch_iterator_new": { + "type": "function", + "file": "git2/branch.h", + "line": 103, + "lineto": 106, + "args": [ + { + "name": "out", + "type": "git_branch_iterator **", + "comment": "the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the branches." + }, + { + "name": "list_flags", + "type": "git_branch_t", + "comment": "Filtering flags for the branch\n listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE\n or GIT_BRANCH_ALL." + } + ], + "argline": "git_branch_iterator **out, git_repository *repo, git_branch_t list_flags", + "sig": "git_branch_iterator **::git_repository *::git_branch_t", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Create an iterator which loops over the requested branches.

\n", + "comments": "", + "group": "branch" + }, + "git_branch_next": { + "type": "function", + "file": "git2/branch.h", + "line": 116, + "lineto": 116, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "the reference" + }, + { + "name": "out_type", + "type": "git_branch_t *", + "comment": "the type of branch (local or remote-tracking)" + }, + { + "name": "iter", + "type": "git_branch_iterator *", + "comment": "the branch iterator" + } + ], + "argline": "git_reference **out, git_branch_t *out_type, git_branch_iterator *iter", + "sig": "git_reference **::git_branch_t *::git_branch_iterator *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ITEROVER if there are no more branches or an error code." + }, + "description": "

Retrieve the next branch from the iterator

\n", + "comments": "", + "group": "branch" + }, + "git_branch_iterator_free": { + "type": "function", + "file": "git2/branch.h", + "line": 123, + "lineto": 123, + "args": [ + { + "name": "iter", + "type": "git_branch_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_branch_iterator *iter", + "sig": "git_branch_iterator *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a branch iterator

\n", + "comments": "", + "group": "branch" + }, + "git_branch_move": { + "type": "function", + "file": "git2/branch.h", + "line": 146, + "lineto": 150, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "New reference object for the updated name." + }, + { + "name": "branch", + "type": "git_reference *", + "comment": "Current underlying reference of the branch." + }, + { + "name": "new_branch_name", + "type": "const char *", + "comment": "Target name of the branch once the move\n is performed; this name is validated for consistency." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } + ], + "argline": "git_reference **out, git_reference *branch, const char *new_branch_name, int force", + "sig": "git_reference **::git_reference *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Move/rename an existing local branch reference.

\n", + "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

Note that if the move succeeds, the old reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", + "group": "branch" + }, + "git_branch_lookup": { + "type": "function", + "file": "git2/branch.h", + "line": 170, + "lineto": 174, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the looked-up branch reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the branch" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name of the branch to be looked-up;\n this name is validated for consistency." + }, + { + "name": "branch_type", + "type": "git_branch_t", + "comment": "Type of the considered branch. This should\n be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE." + } + ], + "argline": "git_reference **out, git_repository *repo, const char *branch_name, git_branch_t branch_type", + "sig": "git_reference **::git_repository *::const char *::git_branch_t", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." + }, + "description": "

Lookup a branch by its name in a repository.

\n", + "comments": "

The generated reference must be freed by the user. The branch name will be checked for validity.

\n", + "group": "branch" + }, + "git_branch_name": { + "type": "function", + "file": "git2/branch.h", + "line": 191, + "lineto": 193, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "Pointer to the abbreviated reference name.\n Owned by ref, do not free." + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "A reference object, ideally pointing to a branch" + } + ], + "argline": "const char **out, const git_reference *ref", + "sig": "const char **::const git_reference *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_EINVALID if the reference isn't either a local or\n remote branch, otherwise an error code." + }, + "description": "

Get the branch name

\n", + "comments": "

Given a reference object, this will check that it really is a branch (ie. it lives under "refs/heads/" or "refs/remotes/"), and return the branch part of it.

\n", + "group": "branch", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_branch_name-4" + ] + } + }, + "git_branch_upstream": { + "type": "function", + "file": "git2/branch.h", + "line": 209, + "lineto": 211, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer where to store the retrieved reference." + }, + { + "name": "branch", + "type": "const git_reference *", + "comment": "Current underlying reference of the branch." + } + ], + "argline": "git_reference **out, const git_reference *branch", + "sig": "git_reference **::const git_reference *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code." + }, + "description": "

Get the upstream of a branch

\n", + "comments": "

Given a reference, this will return a new reference object corresponding to its remote tracking branch. The reference must be a local branch.

\n", + "group": "branch" + }, + "git_branch_set_upstream": { + "type": "function", + "file": "git2/branch.h", + "line": 228, + "lineto": 230, + "args": [ + { + "name": "branch", + "type": "git_reference *", + "comment": "the branch to configure" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "remote-tracking or local branch to set as upstream." + } + ], + "argline": "git_reference *branch, const char *branch_name", + "sig": "git_reference *::const char *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" + }, + "description": "

Set a branch's upstream branch

\n", + "comments": "

This will update the configuration to set the branch named branch_name as the upstream of branch. Pass a NULL name to unset the upstream information.

\n", + "group": "branch" + }, + "git_branch_upstream_name": { + "type": "function", + "file": "git2/branch.h", + "line": 246, + "lineto": 249, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer into which the name will be written." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the branches live." + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference name of the local branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND when no remote tracking reference exists,\n or an error code." + }, + "description": "

Get the upstream name of a branch

\n", + "comments": "

Given a local branch, this will return its remote-tracking branch information, as a full reference name, ie. "feature/nice" would become "refs/remote/origin/feature/nice", depending on that branch's configuration.

\n", + "group": "branch" + }, + "git_branch_is_head": { + "type": "function", + "file": "git2/branch.h", + "line": 259, + "lineto": 260, + "args": [ + { + "name": "branch", + "type": "const git_reference *", + "comment": "A reference to a local branch." + } + ], + "argline": "const git_reference *branch", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 if HEAD points at the branch, 0 if it isn't, or a negative value\n \t\t as an error code." + }, + "description": "

Determine if HEAD points to the given branch

\n", + "comments": "", + "group": "branch" + }, + "git_branch_is_checked_out": { + "type": "function", + "file": "git2/branch.h", + "line": 272, + "lineto": 273, + "args": [ + { + "name": "branch", + "type": "const git_reference *", + "comment": "A reference to a local branch." + } + ], + "argline": "const git_reference *branch", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 if branch is checked out, 0 if it isn't, an error code otherwise." + }, + "description": "

Determine if any HEAD points to the current branch

\n", + "comments": "

This will iterate over all known linked repositories (usually in the form of worktrees) and report whether any HEAD is pointing at the current branch.

\n", + "group": "branch" + }, + "git_branch_remote_name": { + "type": "function", + "file": "git2/branch.h", + "line": 291, + "lineto": 294, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The buffer into which the name will be written." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository where the branch lives." + }, + { + "name": "refname", + "type": "const char *", + "comment": "complete name of the remote tracking branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND when no matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." + }, + "description": "

Find the remote name of a remote-tracking branch

\n", + "comments": "

This will return the name of the remote whose fetch refspec is matching the given branch. E.g. given a branch "refs/remotes/test/master", it will extract the "test" part. If refspecs from multiple remotes match, the function will return GIT_EAMBIGUOUS.

\n", + "group": "branch" + }, + "git_branch_upstream_remote": { + "type": "function", + "file": "git2/branch.h", + "line": 307, + "lineto": 307, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Retrieve the upstream remote of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", + "group": "branch" + }, + "git_branch_upstream_merge": { + "type": "function", + "file": "git2/branch.h", + "line": 320, + "lineto": 320, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Retrieve the upstream merge of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.merge" for a given branch. This branch must be local.

\n", + "group": "branch" + }, + "git_branch_name_is_valid": { + "type": "function", + "file": "git2/branch.h", + "line": 332, + "lineto": 332, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given branch name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a branch name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Determine whether a branch name is valid, meaning that (when prefixed\n with refs/heads/) that it is a valid reference name, and that any\n additional branch name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "branch" + }, + "git_buf_dispose": { + "type": "function", + "file": "git2/buffer.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to deallocate" + } + ], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory referred to by the git_buf.

\n", + "comments": "

Note that this does not free the git_buf itself, just the memory pointed to by buffer->ptr.

\n", + "group": "buf", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_buf_dispose-1", + "ex/v1.7.2/diff.html#git_buf_dispose-2" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_buf_dispose-1" + ] + } + }, + "git_checkout_options_init": { + "type": "function", + "file": "git2/checkout.h", + "line": 360, + "lineto": 362, + "args": [ + { + "name": "opts", + "type": "git_checkout_options *", + "comment": "The `git_checkout_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CHECKOUT_OPTIONS_VERSION`." + } + ], + "argline": "git_checkout_options *opts, unsigned int version", + "sig": "git_checkout_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_checkout_options structure

\n", + "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", + "group": "checkout" + }, + "git_checkout_head": { + "type": "function", + "file": "git2/checkout.h", + "line": 381, + "lineto": 383, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to check out (must be non-bare)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, const git_checkout_options *opts", + "sig": "git_repository *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", + "comments": "

Note that this is not the correct mechanism used to switch branches; do not change your HEAD and then call this method, that would leave you with checkout conflicts since your working directory would then appear to be dirty. Instead, checkout the target of the branch and then update HEAD using git_repository_set_head to point to the branch you checked out.

\n", + "group": "checkout" + }, + "git_checkout_index": { + "type": "function", + "file": "git2/checkout.h", + "line": 394, + "lineto": 397, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository into which to check out (must be non-bare)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "index to be checked out (or NULL to use repository index)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, git_index *index, const git_checkout_options *opts", + "sig": "git_repository *::git_index *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the working tree to match the content of the index.

\n", + "comments": "", + "group": "checkout" + }, + "git_checkout_tree": { + "type": "function", + "file": "git2/checkout.h", + "line": 410, + "lineto": 413, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to check out (must be non-bare)" + }, + { + "name": "treeish", + "type": "const git_object *", + "comment": "a commit, tag or tree which content will be used to update\n the working directory (or NULL to use HEAD)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, const git_object *treeish, const git_checkout_options *opts", + "sig": "git_repository *::const git_object *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the index and working tree to match the content of the\n tree pointed at by the treeish.

\n", + "comments": "", + "group": "checkout", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_checkout_tree-8" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_checkout_tree-5" + ] + } + }, + "git_cherrypick_options_init": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 49, + "lineto": 51, + "args": [ + { + "name": "opts", + "type": "git_cherrypick_options *", + "comment": "The `git_cherrypick_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CHERRYPICK_OPTIONS_VERSION`." + } + ], + "argline": "git_cherrypick_options *opts, unsigned int version", + "sig": "git_cherrypick_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_cherrypick_options structure

\n", + "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", + "group": "cherrypick" + }, + "git_cherrypick_commit": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 67, + "lineto": 73, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository that contains the given commits" + }, + { + "name": "cherrypick_commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick" + }, + { + "name": "our_commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick against (eg, HEAD)" + }, + { + "name": "mainline", + "type": "unsigned int", + "comment": "the parent of the `cherrypick_commit`, if it is a merge" + }, + { + "name": "merge_options", + "type": "const git_merge_options *", + "comment": "the merge options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_commit *cherrypick_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", + "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Cherry-picks the given commit against the given "our" commit, producing an\n index that reflects the result of the cherry-pick.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "cherrypick" + }, + "git_cherrypick": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 83, + "lineto": 86, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to cherry-pick" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick" + }, + { + "name": "cherrypick_options", + "type": "const git_cherrypick_options *", + "comment": "the cherry-pick options (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_commit *commit, const git_cherrypick_options *cherrypick_options", + "sig": "git_repository *::git_commit *::const git_cherrypick_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Cherry-pick the given commit, producing changes in the index and working directory.

\n", + "comments": "", + "group": "cherrypick" + }, + "git_clone_options_init": { + "type": "function", + "file": "git2/clone.h", + "line": 181, + "lineto": 183, + "args": [ + { + "name": "opts", + "type": "git_clone_options *", + "comment": "The `git_clone_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CLONE_OPTIONS_VERSION`." + } + ], + "argline": "git_clone_options *opts, unsigned int version", + "sig": "git_clone_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_clone_options structure

\n", + "comments": "

Initializes a git_clone_options with default values. Equivalent to creating an instance with GIT_CLONE_OPTIONS_INIT.

\n", + "group": "clone" + }, + "git_clone": { + "type": "function", + "file": "git2/clone.h", + "line": 201, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer that will receive the resulting repository object" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository to clone" + }, + { + "name": "local_path", + "type": "const char *", + "comment": "local directory to clone to" + }, + { + "name": "options", + "type": "const git_clone_options *", + "comment": "configuration options for the clone. If NULL, the\n function works as though GIT_OPTIONS_INIT were passed." + } + ], + "argline": "git_repository **out, const char *url, const char *local_path, const git_clone_options *options", + "sig": "git_repository **::const char *::const char *::const git_clone_options *", + "return": { + "type": "int", + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" + }, + "description": "

Clone a remote repository.

\n", + "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n", + "group": "clone" + }, + "git_commit_lookup": { + "type": "function", + "file": "git2/commit.h", + "line": 36, + "lineto": 37, + "args": [ + { + "name": "commit", + "type": "git_commit **", + "comment": "pointer to the looked up commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the commit." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." + } + ], + "argline": "git_commit **commit, git_repository *repo, const git_oid *id", + "sig": "git_commit **::git_repository *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a commit object from a repository.

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "group": "commit", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_commit_lookup-9" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_commit_lookup-6", + "ex/v1.7.2/general.html#git_commit_lookup-7", + "ex/v1.7.2/general.html#git_commit_lookup-8" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_lookup-1" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_commit_lookup-6" + ] + } + }, + "git_commit_lookup_prefix": { + "type": "function", + "file": "git2/commit.h", + "line": 55, + "lineto": 56, + "args": [ + { + "name": "commit", + "type": "git_commit **", + "comment": "pointer to the looked up commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the commit." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_commit **commit, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_commit **::git_repository *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "group": "commit" + }, + "git_commit_free": { + "type": "function", + "file": "git2/commit.h", + "line": 70, + "lineto": 70, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to close" + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an open commit

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", + "group": "commit", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_commit_free-10" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_commit_free-9", + "ex/v1.7.2/general.html#git_commit_free-10", + "ex/v1.7.2/general.html#git_commit_free-11", + "ex/v1.7.2/general.html#git_commit_free-12", + "ex/v1.7.2/general.html#git_commit_free-13" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_free-2", + "ex/v1.7.2/log.html#git_commit_free-3", + "ex/v1.7.2/log.html#git_commit_free-4", + "ex/v1.7.2/log.html#git_commit_free-5" + ] + } + }, + "git_commit_id": { + "type": "function", + "file": "git2/commit.h", + "line": 78, + "lineto": 78, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the commit." + }, + "description": "

Get the id of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_commit_id-14" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_id-6" + ] + } + }, + "git_commit_owner": { + "type": "function", + "file": "git2/commit.h", + "line": 86, + "lineto": 86, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "A previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this commit." + }, + "description": "

Get the repository that contains the commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_commit_owner-7", + "ex/v1.7.2/log.html#git_commit_owner-8" + ] + } + }, + "git_commit_message_encoding": { + "type": "function", + "file": "git2/commit.h", + "line": 98, + "lineto": 98, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " NULL, or the encoding" + }, + "description": "

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n", + "comments": "

The encoding may be NULL if the encoding header in the commit is missing; in that case UTF-8 is assumed.

\n", + "group": "commit" + }, + "git_commit_message": { + "type": "function", + "file": "git2/commit.h", + "line": 109, + "lineto": 109, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the message of a commit" + }, + "description": "

Get the full message of a commit.

\n", + "comments": "

The returned message will be slightly prettified by removing any potential leading newlines.

\n", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_commit_message-3", + "ex/v1.7.2/cat-file.html#git_commit_message-4" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_commit_message-15", + "ex/v1.7.2/general.html#git_commit_message-16", + "ex/v1.7.2/general.html#git_commit_message-17" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_message-9", + "ex/v1.7.2/log.html#git_commit_message-10", + "ex/v1.7.2/log.html#git_commit_message-11" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_commit_message-2" + ] + } + }, + "git_commit_message_raw": { + "type": "function", + "file": "git2/commit.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the raw message of a commit" + }, + "description": "

Get the full raw message of a commit.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_summary": { + "type": "function", + "file": "git2/commit.h", + "line": 128, + "lineto": 128, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { + "type": "const char *", + "comment": " the summary of a commit or NULL on error" + }, + "description": "

Get the short "summary" of the git commit message.

\n", + "comments": "

The returned message is the summary of the commit, comprising the first paragraph of the message with whitespace trimmed and squashed.

\n", + "group": "commit" + }, + "git_commit_body": { + "type": "function", + "file": "git2/commit.h", + "line": 141, + "lineto": 141, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { + "type": "const char *", + "comment": " the body of a commit or NULL when no the message only\n consists of a summary" + }, + "description": "

Get the long "body" of the git commit message.

\n", + "comments": "

The returned message is the body of the commit, comprising everything but the first paragraph of the message. Leading and trailing whitespaces are trimmed.

\n", + "group": "commit" + }, + "git_commit_time": { + "type": "function", + "file": "git2/commit.h", + "line": 149, + "lineto": 149, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "git_time_t", + "comment": " the time of a commit" + }, + "description": "

Get the commit time (i.e. committer time) of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_commit_time-18", + "ex/v1.7.2/general.html#git_commit_time-19" + ] + } + }, + "git_commit_time_offset": { + "type": "function", + "file": "git2/commit.h", + "line": 157, + "lineto": 157, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "int", + "comment": " positive or negative timezone offset, in minutes from UTC" + }, + "description": "

Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_committer": { + "type": "function", + "file": "git2/commit.h", + "line": 165, + "lineto": 165, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_signature *", + "comment": " the committer of a commit" + }, + "description": "

Get the committer of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_commit_committer-5" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_commit_committer-20" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_committer-12" + ] + } + }, + "git_commit_author": { + "type": "function", + "file": "git2/commit.h", + "line": 173, + "lineto": 173, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_signature *", + "comment": " the author of a commit" + }, + "description": "

Get the author of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_commit_author-6" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_commit_author-21", + "ex/v1.7.2/general.html#git_commit_author-22" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_author-13", + "ex/v1.7.2/log.html#git_commit_author-14" + ] + } + }, + "git_commit_committer_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 186, + "lineto": 187, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the committer of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, + "git_commit_author_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 200, + "lineto": 201, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the author of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, + "git_commit_raw_header": { + "type": "function", + "file": "git2/commit.h", + "line": 209, + "lineto": 209, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit" + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the header text of the commit" + }, + "description": "

Get the full raw text of the commit header.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_tree": { + "type": "function", + "file": "git2/commit.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "tree_out", + "type": "git_tree **", + "comment": "pointer where to store the tree object" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_tree **tree_out, const git_commit *commit", + "sig": "git_tree **::const git_commit *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the tree pointed to by a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_commit_tree-15", + "ex/v1.7.2/log.html#git_commit_tree-16", + "ex/v1.7.2/log.html#git_commit_tree-17", + "ex/v1.7.2/log.html#git_commit_tree-18", + "ex/v1.7.2/log.html#git_commit_tree-19" + ] + } + }, + "git_commit_tree_id": { + "type": "function", + "file": "git2/commit.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_oid *", + "comment": " the id of tree pointed to by commit." + }, + "description": "

Get the id of the tree pointed to by a commit. This differs from\n git_commit_tree in that no attempts are made to fetch an object\n from the ODB.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_commit_tree_id-7" + ] + } + }, + "git_commit_parentcount": { + "type": "function", + "file": "git2/commit.h", + "line": 236, + "lineto": 236, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "unsigned int", + "comment": " integer of count of parents" + }, + "description": "

Get the number of parents of this commit

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_commit_parentcount-8" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_commit_parentcount-23" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_parentcount-20", + "ex/v1.7.2/log.html#git_commit_parentcount-21" + ] + } + }, + "git_commit_parent": { + "type": "function", + "file": "git2/commit.h", + "line": 246, + "lineto": 249, + "args": [ + { + "name": "out", + "type": "git_commit **", + "comment": "Pointer where to store the parent commit" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the position of the parent (from 0 to `parentcount`)" + } + ], + "argline": "git_commit **out, const git_commit *commit, unsigned int n", + "sig": "git_commit **::const git_commit *::unsigned int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the specified parent of the commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_commit_parent-24" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_parent-22", + "ex/v1.7.2/log.html#git_commit_parent-23" + ] + } + }, + "git_commit_parent_id": { + "type": "function", + "file": "git2/commit.h", + "line": 260, + "lineto": 262, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the position of the parent (from 0 to `parentcount`)" + } + ], + "argline": "const git_commit *commit, unsigned int n", + "sig": "const git_commit *::unsigned int", + "return": { + "type": "const git_oid *", + "comment": " the id of the parent, NULL on error." + }, + "description": "

Get the oid of a specified parent for a commit. This is different from\n git_commit_parent, which will attempt to load the parent commit from\n the ODB.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_commit_parent_id-9" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_commit_parent_id-24" + ] + } + }, + "git_commit_nth_gen_ancestor": { + "type": "function", + "file": "git2/commit.h", + "line": 278, + "lineto": 281, + "args": [ + { + "name": "ancestor", + "type": "git_commit **", + "comment": "Pointer where to store the ancestor commit" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the requested generation" + } + ], + "argline": "git_commit **ancestor, const git_commit *commit, unsigned int n", + "sig": "git_commit **::const git_commit *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code" + }, + "description": "

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n", + "comments": "

Passing 0 as the generation number returns another instance of the base commit itself.

\n", + "group": "commit" + }, + "git_commit_header_field": { + "type": "function", + "file": "git2/commit.h", + "line": 293, + "lineto": 293, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer to fill; existing content will be\n overwritten" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "the commit to look in" + }, + { + "name": "field", + "type": "const char *", + "comment": "the header field to return" + } + ], + "argline": "git_buf *out, const git_commit *commit, const char *field", + "sig": "git_buf *::const git_commit *::const char *", + "return": { + "type": "int", + "comment": " 0 on succeess, GIT_ENOTFOUND if the field does not exist,\n or an error code" + }, + "description": "

Get an arbitrary header field

\n", + "comments": "", + "group": "commit" + }, + "git_commit_extract_signature": { + "type": "function", + "file": "git2/commit.h", + "line": 313, + "lineto": 313, + "args": [ + { + "name": "signature", + "type": "git_buf *", + "comment": "the signature block; existing content will be\n overwritten" + }, + { + "name": "signed_data", + "type": "git_buf *", + "comment": "signed data; this is the commit contents minus the signature block;\n existing content will be overwritten" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which the commit exists" + }, + { + "name": "commit_id", + "type": "git_oid *", + "comment": "the commit from which to extract the data" + }, + { + "name": "field", + "type": "const char *", + "comment": "the name of the header field containing the signature\n block; pass `NULL` to extract the default 'gpgsig'" + } + ], + "argline": "git_buf *signature, git_buf *signed_data, git_repository *repo, git_oid *commit_id, const char *field", + "sig": "git_buf *::git_buf *::git_repository *::git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." + }, + "description": "

Extract the signature from a commit

\n", + "comments": "

If the id is not for a commit, the error class will be GIT_ERROR_INVALID. If the commit does not have a signature, the error class will be GIT_ERROR_OBJECT.

\n", + "group": "commit" + }, + "git_commit_create": { + "type": "function", + "file": "git2/commit.h", + "line": 359, + "lineto": 369, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the commit" + }, + { + "name": "update_ref", + "type": "const char *", + "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." + } + ], + "argline": "git_oid *id, 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, size_t parent_count, const git_commit *[] parents", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", + "return": { + "type": "int", + "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" + }, + "description": "

Create new commit in the repository from a list of git_object pointers

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", + "group": "commit", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_commit_create-7" + ] + } + }, + "git_commit_create_v": { + "type": "function", + "file": "git2/commit.h", + "line": 385, + "lineto": 395, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": null + }, + { + "name": "repo", + "type": "git_repository *", + "comment": null + }, + { + "name": "update_ref", + "type": "const char *", + "comment": null + }, + { + "name": "author", + "type": "const git_signature *", + "comment": null + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": null + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": null + }, + { + "name": "message", + "type": "const char *", + "comment": null + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": null + }, + { + "name": "parent_count", + "type": "size_t", + "comment": null + } + ], + "argline": "git_oid *id, 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, size_t parent_count", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create new commit in the repository using a variable argument list.

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", + "group": "commit", + "examples": { + "commit.c": [ + "ex/v1.7.2/commit.html#git_commit_create_v-1" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_commit_create_v-25" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_commit_create_v-1" + ] + } + }, + "git_commit_amend": { + "type": "function", + "file": "git2/commit.h", + "line": 418, + "lineto": 426, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": null + }, + { + "name": "commit_to_amend", + "type": "const git_commit *", + "comment": null + }, + { + "name": "update_ref", + "type": "const char *", + "comment": null + }, + { + "name": "author", + "type": "const git_signature *", + "comment": null + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": null + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": null + }, + { + "name": "message", + "type": "const char *", + "comment": null + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": null + } + ], + "argline": "git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree", + "sig": "git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Amend an existing commit by replacing only non-NULL values.

\n", + "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", + "group": "commit" + }, + "git_commit_create_buffer": { + "type": "function", + "file": "git2/commit.h", + "line": 463, + "lineto": 472, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer into which to write the commit object content" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where the referenced tree and parents live" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." + } + ], + "argline": "git_buf *out, git_repository *repo, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents", + "sig": "git_buf *::git_repository *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a commit and write it into a buffer

\n", + "comments": "

Create a commit as with git_commit_create() but instead of writing it to the objectdb, write the contents of the object into a buffer.

\n", + "group": "commit" + }, + "git_commit_create_with_signature": { + "type": "function", + "file": "git2/commit.h", + "line": 490, + "lineto": 495, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the resulting commit id" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the commit in." + }, + { + "name": "commit_content", + "type": "const char *", + "comment": "the content of the unsigned commit object" + }, + { + "name": "signature", + "type": "const char *", + "comment": "the signature to add to the commit. Leave `NULL`\n to create a commit without adding a signature field." + }, + { + "name": "signature_field", + "type": "const char *", + "comment": "which header field should contain this\n signature. Leave `NULL` for the default of \"gpgsig\"" + } + ], + "argline": "git_oid *out, git_repository *repo, const char *commit_content, const char *signature, const char *signature_field", + "sig": "git_oid *::git_repository *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a commit object from the given buffer and signature

\n", + "comments": "

Given the unsigned commit object's contents, its signature and the header field in which to store the signature, attach the signature to the commit and write it into the given repository.

\n", + "group": "commit" + }, + "git_commit_dup": { + "type": "function", + "file": "git2/commit.h", + "line": 505, + "lineto": 505, + "args": [ + { + "name": "out", + "type": "git_commit **", + "comment": "Pointer to store the copy of the commit" + }, + { + "name": "source", + "type": "git_commit *", + "comment": "Original commit to copy" + } + ], + "argline": "git_commit **out, git_commit *source", + "sig": "git_commit **::git_commit *", + "return": { + "type": "int", + "comment": " 0" + }, + "description": "

Create an in-memory copy of a commit. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "commit" + }, + "git_libgit2_version": { + "type": "function", + "file": "git2/common.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "major", + "type": "int *", + "comment": "Store the major version number" + }, + { + "name": "minor", + "type": "int *", + "comment": "Store the minor version number" + }, + { + "name": "rev", + "type": "int *", + "comment": "Store the revision (patch) number" + } + ], + "argline": "int *major, int *minor, int *rev", + "sig": "int *::int *::int *", + "return": { + "type": "int", + "comment": " 0 on success or an error code on failure" + }, + "description": "

Return the version of the libgit2 library\n being currently used.

\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_prerelease": { + "type": "function", + "file": "git2/common.h", + "line": 128, + "lineto": 128, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const char *", + "comment": " the name of the prerelease state or NULL" + }, + "description": "

Return the prerelease state of the libgit2 library currently being\n used. For nightly builds during active development, this will be\n "alpha". Releases may have a "beta" or release candidate ("rc1",\n "rc2", etc) prerelease. For a final release, this function returns\n NULL.

\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_features": { + "type": "function", + "file": "git2/common.h", + "line": 180, + "lineto": 180, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " A combination of GIT_FEATURE_* values." + }, + "description": "

Query compile time options for libgit2.

\n", + "comments": "
    \n
  • GIT_FEATURE_THREADS Libgit2 was compiled with thread support. Note that thread support is still to be seen as a 'work in progress' - basic object lookups are believed to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS Libgit2 supports the https:// protocol. This requires the openssl library to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH Libgit2 supports the SSH protocol for network operations. This requires the libssh2 library to be found when compiling libgit2

  • \n
  • GIT_FEATURE_NSEC Libgit2 supports the sub-second resolution in file modification times.

  • \n
\n", + "group": "libgit2" + }, + "git_libgit2_opts": { + "type": "function", + "file": "git2/common.h", + "line": 512, + "lineto": 512, + "args": [ + { + "name": "option", + "type": "int", + "comment": "Option key" + } + ], + "argline": "int option", + "sig": "int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set or query a library global option

\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n\n

opts(GIT_OPT_GET_HOMEDIR, git_buf *out) > Gets the current user's home directory, as it will be used > for file lookups. The path is written to the out buffer.

\n\n

opts(GIT_OPT_SET_HOMEDIR, const char *path) > Sets the directory used as the current user's home directory, > for file lookups. > > - path directory of home directory.

\n\n

opts(GIT_OPT_GET_SERVER_CONNECT_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) to attempt connections to > a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_CONNECT_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) to attempt connections to > a remote server. This is supported only for HTTP(S) connections > and is not supported by SSH. Set to 0 to use the system default. > Note that this may not be able to be configured longer than the > system default, typically 75 seconds.

\n\n

opts(GIT_OPT_GET_SERVER_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) for reading from and writing > to a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) for reading from and writing > to a remote server. This is supported only for HTTP(S) > connections and is not supported by SSH. Set to 0 to use the > system default.

\n", + "group": "libgit2" + }, + "git_config_entry_free": { + "type": "function", + "file": "git2/config.h", + "line": 78, + "lineto": 78, + "args": [ + { + "name": "entry", + "type": "git_config_entry *", + "comment": "The entry to free." + } + ], + "argline": "git_config_entry *entry", + "sig": "git_config_entry *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a config entry

\n", + "comments": "", + "group": "config", + "examples": { + "config.c": [ + "ex/v1.7.2/config.html#git_config_entry_free-1", + "ex/v1.7.2/config.html#git_config_entry_free-2" + ] + } + }, + "git_config_find_global": { + "type": "function", + "file": "git2/config.h", + "line": 130, + "lineto": 130, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a global configuration file has been found. Its path will be stored in `out`." + }, + "description": "

Locate the path to the global configuration file

\n", + "comments": "

The user or global configuration file is usually located in $HOME/.gitconfig.

\n\n

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.

\n\n

This method will not guess the path to the xdg compatible config file (.config/git/config).

\n", + "group": "config" + }, + "git_config_find_xdg": { + "type": "function", + "file": "git2/config.h", + "line": 147, + "lineto": 147, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the global xdg compatible configuration file

\n", + "comments": "

The xdg compatible configuration file is usually located in $HOME/.config/git/config.

\n\n

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 xdg compatible configuration file.

\n", + "group": "config" + }, + "git_config_find_system": { + "type": "function", + "file": "git2/config.h", + "line": 159, + "lineto": 159, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the system configuration file

\n", + "comments": "

If /etc/gitconfig doesn't exist, it will look for %PROGRAMFILES%.

\n", + "group": "config" + }, + "git_config_find_programdata": { + "type": "function", + "file": "git2/config.h", + "line": 170, + "lineto": 170, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a ProgramData configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the configuration file in ProgramData

\n", + "comments": "

Look for the file in %PROGRAMDATA% used by portable git.

\n", + "group": "config" + }, + "git_config_open_default": { + "type": "function", + "file": "git2/config.h", + "line": 182, + "lineto": 182, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the config instance" + } + ], + "argline": "git_config **out", + "sig": "git_config **", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Open the global, XDG and system configuration files

\n", + "comments": "

Utility wrapper that finds the global, XDG and system configuration files and opens them into a single prioritized config object that can be used when accessing default config data outside a repository.

\n", + "group": "config" + }, + "git_config_new": { + "type": "function", + "file": "git2/config.h", + "line": 193, + "lineto": 193, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer to the new configuration" + } + ], + "argline": "git_config **out", + "sig": "git_config **", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Allocate a new configuration object

\n", + "comments": "

This object is empty, so you have to add a file to it before you can do anything with it.

\n", + "group": "config" + }, + "git_config_add_file_ondisk": { + "type": "function", + "file": "git2/config.h", + "line": 222, + "lineto": 227, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to add the file to" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to the configuration file to add" + }, + { + "name": "level", + "type": "git_config_level_t", + "comment": "the priority level of the backend" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "optional repository to allow parsing of\n conditional includes" + }, + { + "name": "force", + "type": "int", + "comment": "replace config file at the given priority level" + } + ], + "argline": "git_config *cfg, const char *path, git_config_level_t level, const git_repository *repo, int force", + "sig": "git_config *::const char *::git_config_level_t::const git_repository *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code" + }, + "description": "

Add an on-disk config file instance to an existing config

\n", + "comments": "

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).

\n\n

If the file does not exist, the file will still be added and it will be created the first time we write to it.

\n\n

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", + "group": "config" + }, + "git_config_open_ondisk": { + "type": "function", + "file": "git2/config.h", + "line": 241, + "lineto": 241, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "The configuration instance to create" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the on-disk file to open" + } + ], + "argline": "git_config **out, const char *path", + "sig": "git_config **::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Create a new config instance containing a single on-disk file

\n", + "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", + "group": "config", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_config_open_ondisk-26" + ] + } + }, + "git_config_open_level": { + "type": "function", + "file": "git2/config.h", + "line": 259, + "lineto": 262, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "The configuration instance to create" + }, + { + "name": "parent", + "type": "const git_config *", + "comment": "Multi-level config to search for the given level" + }, + { + "name": "level", + "type": "git_config_level_t", + "comment": "Configuration level to search for" + } + ], + "argline": "git_config **out, const git_config *parent, git_config_level_t level", + "sig": "git_config **::const git_config *::git_config_level_t", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code" + }, + "description": "

Build a single-level focused config object from a multi-level one.

\n", + "comments": "

The returned config object can be used to perform get/set/delete operations on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config will return different config instances, but containing the same config_file instance.

\n", + "group": "config" + }, + "git_config_open_global": { + "type": "function", + "file": "git2/config.h", + "line": 277, + "lineto": 277, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer in which to store the config object" + }, + { + "name": "config", + "type": "git_config *", + "comment": "the config object in which to look" + } + ], + "argline": "git_config **out, git_config *config", + "sig": "git_config **::git_config *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Open the global/XDG configuration file according to git's rules

\n", + "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatibility, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", + "group": "config" + }, + "git_config_snapshot": { + "type": "function", + "file": "git2/config.h", + "line": 293, + "lineto": 293, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer in which to store the snapshot config object" + }, + { + "name": "config", + "type": "git_config *", + "comment": "configuration to snapshot" + } + ], + "argline": "git_config **out, git_config *config", + "sig": "git_config **::git_config *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a snapshot of the configuration

\n", + "comments": "

Create a snapshot of the current state of a configuration, which allows you to look into a consistent view of the configuration for looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid until it is freed.

\n", + "group": "config" + }, + "git_config_free": { + "type": "function", + "file": "git2/config.h", + "line": 300, + "lineto": 300, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to free" + } + ], + "argline": "git_config *cfg", + "sig": "git_config *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the configuration and its associated memory and files

\n", + "comments": "", + "group": "config", + "examples": { + "config.c": [ + "ex/v1.7.2/config.html#git_config_free-3" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_config_free-27", + "ex/v1.7.2/general.html#git_config_free-28" + ] + } + }, + "git_config_get_entry": { + "type": "function", + "file": "git2/config.h", + "line": 312, + "lineto": 315, + "args": [ + { + "name": "out", + "type": "git_config_entry **", + "comment": "pointer to the variable git_config_entry" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_config_entry **out, const git_config *cfg, const char *name", + "sig": "git_config_entry **::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the git_config_entry of a config variable.

\n", + "comments": "

Free the git_config_entry after use with git_config_entry_free().

\n", + "group": "config", + "examples": { + "config.c": [ + "ex/v1.7.2/config.html#git_config_get_entry-4" + ] + } + }, + "git_config_get_int32": { + "type": "function", + "file": "git2/config.h", + "line": 329, + "lineto": 329, + "args": [ + { + "name": "out", + "type": "int32_t *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int32_t *out, const git_config *cfg, const char *name", + "sig": "int32_t *::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the value of an integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_config_get_int32-29", + "ex/v1.7.2/general.html#git_config_get_int32-30" + ] + } + }, + "git_config_get_int64": { + "type": "function", + "file": "git2/config.h", + "line": 343, + "lineto": 343, + "args": [ + { + "name": "out", + "type": "int64_t *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int64_t *out, const git_config *cfg, const char *name", + "sig": "int64_t *::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the value of a long integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_bool": { + "type": "function", + "file": "git2/config.h", + "line": 360, + "lineto": 360, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int *out, const git_config *cfg, const char *name", + "sig": "int *::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the value of a boolean config variable.

\n", + "comments": "

This function uses the usual C convention of 0 being false and anything else true.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_path": { + "type": "function", + "file": "git2/config.h", + "line": 378, + "lineto": 378, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer in which to store the result" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_buf *out, const git_config *cfg, const char *name", + "sig": "git_buf *::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the value of a path config variable.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_string": { + "type": "function", + "file": "git2/config.h", + "line": 396, + "lineto": 396, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "pointer to the string" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "const char **out, const git_config *cfg, const char *name", + "sig": "const char **::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the value of a string config variable.

\n", + "comments": "

This function can only be used on snapshot config objects. The string is owned by the config and should not be freed by the user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_config_get_string-31", + "ex/v1.7.2/general.html#git_config_get_string-32" + ] + } + }, + "git_config_get_string_buf": { + "type": "function", + "file": "git2/config.h", + "line": 412, + "lineto": 412, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer in which to store the string" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_buf *out, const git_config *cfg, const char *name", + "sig": "git_buf *::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the value of a string config variable.

\n", + "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_multivar_foreach": { + "type": "function", + "file": "git2/config.h", + "line": 431, + "lineto": 431, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to be called on each value of the variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "opaque pointer to pass to the callback" + } + ], + "argline": "const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::const char *::const char *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Get each value of a multivar in a foreach callback

\n", + "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_multivar_iterator_new": { + "type": "function", + "file": "git2/config.h", + "line": 447, + "lineto": 447, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp", + "sig": "git_config_iterator **::const git_config *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Get each value of a multivar

\n", + "comments": "

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_next": { + "type": "function", + "file": "git2/config.h", + "line": 459, + "lineto": 459, + "args": [ + { + "name": "entry", + "type": "git_config_entry **", + "comment": "pointer to store the entry" + }, + { + "name": "iter", + "type": "git_config_iterator *", + "comment": "the iterator" + } + ], + "argline": "git_config_entry **entry, git_config_iterator *iter", + "sig": "git_config_entry **::git_config_iterator *", + "return": { + "type": "int", + "comment": " 0 or an error code. GIT_ITEROVER if the iteration has completed" + }, + "description": "

Return the current entry and advance the iterator

\n", + "comments": "

The pointers returned by this function are valid until the next call to git_config_next or until the iterator is freed.

\n", + "group": "config" + }, + "git_config_iterator_free": { + "type": "function", + "file": "git2/config.h", + "line": 466, + "lineto": 466, + "args": [ + { + "name": "iter", + "type": "git_config_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_config_iterator *iter", + "sig": "git_config_iterator *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a config iterator

\n", + "comments": "", + "group": "config" + }, + "git_config_set_int32": { + "type": "function", + "file": "git2/config.h", + "line": 477, + "lineto": 477, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "int32_t", + "comment": "Integer value for the variable" + } + ], + "argline": "git_config *cfg, const char *name, int32_t value", + "sig": "git_config *::const char *::int32_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_int64": { + "type": "function", + "file": "git2/config.h", + "line": 488, + "lineto": 488, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "int64_t", + "comment": "Long integer value for the variable" + } + ], + "argline": "git_config *cfg, const char *name, int64_t value", + "sig": "git_config *::const char *::int64_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_bool": { + "type": "function", + "file": "git2/config.h", + "line": 499, + "lineto": 499, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "int", + "comment": "the value to store" + } + ], + "argline": "git_config *cfg, const char *name, int value", + "sig": "git_config *::const char *::int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Set the value of a boolean config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_string": { + "type": "function", + "file": "git2/config.h", + "line": 513, + "lineto": 513, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "const char *", + "comment": "the string to store." + } + ], + "argline": "git_config *cfg, const char *name, const char *value", + "sig": "git_config *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", + "group": "config", + "examples": { + "config.c": [ + "ex/v1.7.2/config.html#git_config_set_string-5" + ] + } + }, + "git_config_set_multivar": { + "type": "function", + "file": "git2/config.h", + "line": 526, + "lineto": 526, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "a regular expression to indicate which values to replace" + }, + { + "name": "value", + "type": "const char *", + "comment": "the new value." + } + ], + "argline": "git_config *cfg, const char *name, const char *regexp, const char *value", + "sig": "git_config *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Set a multivar in the local config file.

\n", + "comments": "

The regular expression is applied case-sensitively on the value.

\n", + "group": "config" + }, + "git_config_delete_entry": { + "type": "function", + "file": "git2/config.h", + "line": 536, + "lineto": 536, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable to delete" + } + ], + "argline": "git_config *cfg, const char *name", + "sig": "git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Delete a config variable from the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_delete_multivar": { + "type": "function", + "file": "git2/config.h", + "line": 549, + "lineto": 549, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variables" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "a regular expression to indicate which values to delete" + } + ], + "argline": "git_config *cfg, const char *name, const char *regexp", + "sig": "git_config *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Deletes one or several entries from a multivar in the local config file.

\n", + "comments": "

The regular expression is applied case-sensitively on the value.

\n", + "group": "config" + }, + "git_config_foreach": { + "type": "function", + "file": "git2/config.h", + "line": 567, + "lineto": 570, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "const git_config *cfg, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform an operation on each config variable.

\n", + "comments": "

The callback receives the normalized name and value of each variable in the config backend, and the data pointer passed to this function. If the callback returns a non-zero value, the function stops iterating and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the iteration is ongoing.

\n", + "group": "config" + }, + "git_config_iterator_new": { + "type": "function", + "file": "git2/config.h", + "line": 582, + "lineto": 582, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg", + "sig": "git_config_iterator **::const git_config *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Iterate over all the config variables

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n", + "group": "config" + }, + "git_config_iterator_glob_new": { + "type": "function", + "file": "git2/config.h", + "line": 599, + "lineto": 599, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to ge the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match the names" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg, const char *regexp", + "sig": "git_config_iterator **::const git_config *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Iterate over all the config variables whose name matches a pattern

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_foreach_match": { + "type": "function", + "file": "git2/config.h", + "line": 621, + "lineto": 625, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match against config names" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "const git_config *cfg, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::const char *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 or the return value of the callback which didn't return 0" + }, + "description": "

Perform an operation on each config variable matching a regular expression.

\n", + "comments": "

This behaves like git_config_foreach with an additional filter of a regular expression that filters which config keys are passed to the callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the case-insensitive parts are lower-case.

\n", + "group": "config" + }, + "git_config_get_mapped": { + "type": "function", + "file": "git2/config.h", + "line": 661, + "lineto": 666, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the mapping" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "config file to get the variables from" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the config variable to lookup" + }, + { + "name": "maps", + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" + }, + { + "name": "map_n", + "type": "size_t", + "comment": "number of mapping objects in `maps`" + } + ], + "argline": "int *out, const git_config *cfg, const char *name, const git_configmap *maps, size_t map_n", + "sig": "int *::const git_config *::const char *::const git_configmap *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", + "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_configmap autocrlf_mapping[] = {        {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", + "group": "config" + }, + "git_config_lookup_map_value": { + "type": "function", + "file": "git2/config.h", + "line": 677, + "lineto": 681, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the parsing" + }, + { + "name": "maps", + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" + }, + { + "name": "map_n", + "type": "size_t", + "comment": "number of mapping objects in `maps`" + }, + { + "name": "value", + "type": "const char *", + "comment": "value to parse" + } + ], + "argline": "int *out, const git_configmap *maps, size_t map_n, const char *value", + "sig": "int *::const git_configmap *::size_t::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Maps a string value to an integer constant

\n", + "comments": "", + "group": "config" + }, + "git_config_parse_bool": { + "type": "function", + "file": "git2/config.h", + "line": 694, + "lineto": 694, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the parsing" + }, + { + "name": "value", + "type": "const char *", + "comment": "value to parse" + } + ], + "argline": "int *out, const char *value", + "sig": "int *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Parse a string value as a bool.

\n", + "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any number different from 0 Valid values for false are: 'false', 'no', 'off', 0

\n", + "group": "config" + }, + "git_config_parse_int32": { + "type": "function", + "file": "git2/config.h", + "line": 707, + "lineto": 707, + "args": [ + { + "name": "out", + "type": "int32_t *", + "comment": "place to store the result of the parsing" + }, + { + "name": "value", + "type": "const char *", + "comment": "value to parse" + } + ], + "argline": "int32_t *out, const char *value", + "sig": "int32_t *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Parse a string value as an int32.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "group": "config" + }, + "git_config_parse_int64": { + "type": "function", + "file": "git2/config.h", + "line": 720, + "lineto": 720, + "args": [ + { + "name": "out", + "type": "int64_t *", + "comment": "place to store the result of the parsing" + }, + { + "name": "value", + "type": "const char *", + "comment": "value to parse" + } + ], + "argline": "int64_t *out, const char *value", + "sig": "int64_t *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Parse a string value as an int64.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "group": "config" + }, + "git_config_parse_path": { + "type": "function", + "file": "git2/config.h", + "line": 736, + "lineto": 736, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "placae to store the result of parsing" + }, + { + "name": "value", + "type": "const char *", + "comment": "the path to evaluate" + } + ], + "argline": "git_buf *out, const char *value", + "sig": "git_buf *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Parse a string value as a path.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be returned.

\n", + "group": "config" + }, + "git_config_backend_foreach_match": { + "type": "function", + "file": "git2/config.h", + "line": 755, + "lineto": 759, + "args": [ + { + "name": "backend", + "type": "git_config_backend *", + "comment": "where to get the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match against config names (can be NULL)" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "git_config_backend *backend, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "git_config_backend *::const char *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Perform an operation on each config variable in a given config backend,\n matching a regular expression.

\n", + "comments": "

This behaves like git_config_foreach_match except that only config entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_lock": { + "type": "function", + "file": "git2/config.h", + "line": 778, + "lineto": 778, + "args": [ + { + "name": "tx", + "type": "git_transaction **", + "comment": "the resulting transaction, use this to commit or undo the\n changes" + }, + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration in which to lock" + } + ], + "argline": "git_transaction **tx, git_config *cfg", + "sig": "git_transaction **::git_config *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lock the backend with the highest priority

\n", + "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", + "group": "config" + }, + "git_credential_free": { + "type": "function", + "file": "git2/credential.h", + "line": 146, + "lineto": 146, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "the object to free" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a credential.

\n", + "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", + "group": "credential" + }, + "git_credential_has_username": { + "type": "function", + "file": "git2/credential.h", + "line": 154, + "lineto": 154, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "object to check" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { + "type": "int", + "comment": " 1 if the credential object has non-NULL username, 0 otherwise" + }, + "description": "

Check whether a credential object contains username information.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_get_username": { + "type": "function", + "file": "git2/credential.h", + "line": 162, + "lineto": 162, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "object to check" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { + "type": "const char *", + "comment": " the credential username, or NULL if not applicable" + }, + "description": "

Return the username associated with a credential object.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_userpass_plaintext_new": { + "type": "function", + "file": "git2/credential.h", + "line": 173, + "lineto": 176, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "The username of the credential." + }, + { + "name": "password", + "type": "const char *", + "comment": "The password of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *password", + "sig": "git_credential **::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_default_new": { + "type": "function", + "file": "git2/credential.h", + "line": 185, + "lineto": 185, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + } + ], + "argline": "git_credential **out", + "sig": "git_credential **", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_username_new": { + "type": "function", + "file": "git2/credential.h", + "line": 197, + "lineto": 197, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "The username to authenticate with" + } + ], + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a credential to specify a username.

\n", + "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", + "group": "credential" + }, + "git_credential_ssh_key_new": { + "type": "function", + "file": "git2/credential.h", + "line": 210, + "lineto": 215, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The path to the public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The path to the private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_key_memory_new": { + "type": "function", + "file": "git2/credential.h", + "line": 227, + "lineto": 232, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate." + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object reading the keys from memory.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_interactive_new": { + "type": "function", + "file": "git2/credential.h", + "line": 263, + "lineto": 267, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "Username to use to authenticate." + }, + { + "name": "prompt_callback", + "type": "git_credential_ssh_interactive_cb", + "comment": "The callback method used for prompts." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_credential **out, const char *username, git_credential_ssh_interactive_cb prompt_callback, void *payload", + "sig": "git_credential **::const char *::git_credential_ssh_interactive_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure." + }, + "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_key_from_agent": { + "type": "function", + "file": "git2/credential.h", + "line": 277, + "lineto": 279, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + } + ], + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_custom_new": { + "type": "function", + "file": "git2/credential.h", + "line": 305, + "lineto": 311, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The bytes of the public key." + }, + { + "name": "publickey_len", + "type": "size_t", + "comment": "The length of the public key in bytes." + }, + { + "name": "sign_callback", + "type": "git_credential_sign_cb", + "comment": "The callback method to sign the data during the challenge." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, size_t publickey_len, git_credential_sign_cb sign_callback, void *payload", + "sig": "git_credential **::const char *::const char *::size_t::git_credential_sign_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create an ssh key credential with a custom signing function.

\n", + "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", + "group": "credential" + }, + "git_credential_userpass": { + "type": "function", + "file": "git2/credential_helpers.h", + "line": 44, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "url", + "type": "const char *", + "comment": "The resource for which we are demanding a credential." + }, + { + "name": "user_from_url", + "type": "const char *", + "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." + }, + { + "name": "allowed_types", + "type": "unsigned int", + "comment": "A bitmask stating which credential types are OK to return." + }, + { + "name": "payload", + "type": "void *", + "comment": "The payload provided when specifying this callback. (This is\n interpreted as a `git_credential_userpass_payload*`.)" + } + ], + "argline": "git_credential **out, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Stock callback usable as a git_credential_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDENTIAL_USERPASS_PLAINTEXT as an allowed type.

\n", + "comments": "", + "group": "credential" + }, + "git_blob_filtered_content": { + "type": "function", + "file": "git2/deprecated.h", + "line": 115, + "lineto": 119, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "blob", + "type": "git_blob *", + "comment": null + }, + { + "name": "as_path", + "type": "const char *", + "comment": null + }, + { + "name": "check_for_binary_data", + "type": "int", + "comment": null + } + ], + "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", + "sig": "git_buf *::git_blob *::const char *::int", + "return": { + "type": "int", + "comment": null + }, + "description": "

Deprecated in favor of git_blob_filter.

\n", + "comments": "", + "group": "blob" + }, + "git_filter_list_stream_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 139, + "lineto": 142, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": null + }, + { + "name": "data", + "type": "git_buf *", + "comment": null + }, + { + "name": "target", + "type": "git_writestream *", + "comment": null + } + ], + "argline": "git_filter_list *filters, git_buf *data, git_writestream *target", + "sig": "git_filter_list *::git_buf *::git_writestream *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Deprecated in favor of git_filter_list_stream_buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 149, + "lineto": 152, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": null + }, + { + "name": "in", + "type": "git_buf *", + "comment": null + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_buf *in", + "sig": "git_buf *::git_filter_list *::git_buf *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Deprecated in favor of git_filter_list_apply_to_buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_treebuilder_write_with_buffer": { + "type": "function", + "file": "git2/deprecated.h", + "line": 178, + "lineto": 179, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": null + }, + { + "name": "bld", + "type": "git_treebuilder *", + "comment": null + }, + { + "name": "tree", + "type": "git_buf *", + "comment": null + } + ], + "argline": "git_oid *oid, git_treebuilder *bld, git_buf *tree", + "sig": "git_oid *::git_treebuilder *::git_buf *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Write the contents of the tree builder as a tree object.\n This is an alias of git_treebuilder_write and is preserved\n for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "treebuilder" + }, + "git_buf_grow": { + "type": "function", + "file": "git2/deprecated.h", + "line": 220, + "lineto": 220, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to be resized; may or may not be allocated yet" + }, + { + "name": "target_size", + "type": "size_t", + "comment": "The desired available size" + } + ], + "argline": "git_buf *buffer, size_t target_size", + "sig": "git_buf *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, -1 on allocation failure" + }, + "description": "

Resize the buffer allocation to make more space.

\n", + "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e. the asize field is zero), then ptr will be replaced with a newly allocated block of data. Be careful so that memory allocated by the caller is not lost. As a special variant, if you pass target_size as 0 and the memory is not allocated by libgit2, this will allocate a new buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be marked as invalid for future operations, invaliding the contents.

\n", + "group": "buf" + }, + "git_buf_set": { + "type": "function", + "file": "git2/deprecated.h", + "line": 230, + "lineto": 231, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to set" + }, + { + "name": "data", + "type": "const void *", + "comment": "The data to copy into the buffer" + }, + { + "name": "datalen", + "type": "size_t", + "comment": "The length of the data to copy into the buffer" + } + ], + "argline": "git_buf *buffer, const void *data, size_t datalen", + "sig": "git_buf *::const void *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, -1 on allocation failure" + }, + "description": "

Set buffer to a copy of some raw data.

\n", + "comments": "", + "group": "buf" + }, + "git_buf_is_binary": { + "type": "function", + "file": "git2/deprecated.h", + "line": 239, + "lineto": 239, + "args": [ + { + "name": "buf", + "type": "const git_buf *", + "comment": "Buffer to check" + } + ], + "argline": "const git_buf *buf", + "sig": "const git_buf *", + "return": { + "type": "int", + "comment": " 1 if buffer looks like non-text data" + }, + "description": "

Check quickly if buffer looks like it contains binary data

\n", + "comments": "", + "group": "buf" + }, + "git_buf_contains_nul": { + "type": "function", + "file": "git2/deprecated.h", + "line": 247, + "lineto": 247, + "args": [ + { + "name": "buf", + "type": "const git_buf *", + "comment": "Buffer to check" + } + ], + "argline": "const git_buf *buf", + "sig": "const git_buf *", + "return": { + "type": "int", + "comment": " 1 if buffer contains a NUL byte" + }, + "description": "

Check quickly if buffer contains a NUL byte

\n", + "comments": "", + "group": "buf" + }, + "git_buf_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 259, + "lineto": 259, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": null + } + ], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory referred to by the git_buf. This is an alias of\n git_buf_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "buf" + }, + "git_diff_format_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 357, + "lineto": 360, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "diff", + "type": "git_diff *", + "comment": null + }, + { + "name": "opts", + "type": "const git_diff_format_email_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_diff *diff, const git_diff_format_email_options *opts", + "sig": "git_buf *::git_diff *::const git_diff_format_email_options *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create an e-mail ready patch from a diff.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_commit_as_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 368, + "lineto": 375, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": null + }, + { + "name": "repo", + "type": "git_repository *", + "comment": null + }, + { + "name": "commit", + "type": "git_commit *", + "comment": null + }, + { + "name": "patch_no", + "type": "size_t", + "comment": null + }, + { + "name": "total_patches", + "type": "size_t", + "comment": null + }, + { + "name": "flags", + "type": "uint32_t", + "comment": null + }, + { + "name": "diff_opts", + "type": "const git_diff_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", + "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Create an e-mail ready patch for a commit.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_format_email_options_init": { + "type": "function", + "file": "git2/deprecated.h", + "line": 387, + "lineto": 389, + "args": [ + { + "name": "opts", + "type": "git_diff_format_email_options *", + "comment": "The `git_blame_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_format_email_options *opts, unsigned int version", + "sig": "git_diff_format_email_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_format_email_options structure

\n", + "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", + "group": "diff" + }, + "giterr_last": { + "type": "function", + "file": "git2/deprecated.h", + "line": 452, + "lineto": 452, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const git_error *", + "comment": null + }, + "description": "

Return the last git_error object that was generated for the\n current thread. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_clear": { + "type": "function", + "file": "git2/deprecated.h", + "line": 464, + "lineto": 464, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "void", + "comment": null + }, + "description": "

Clear the last error. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_set_str": { + "type": "function", + "file": "git2/deprecated.h", + "line": 476, + "lineto": 476, + "args": [ + { + "name": "error_class", + "type": "int", + "comment": null + }, + { + "name": "string", + "type": "const char *", + "comment": null + } + ], + "argline": "int error_class, const char *string", + "sig": "int::const char *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Sets the error message to the given string. This is an alias of\n git_error_set_str and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_set_oom": { + "type": "function", + "file": "git2/deprecated.h", + "line": 488, + "lineto": 488, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "void", + "comment": null + }, + "description": "

Indicates that an out-of-memory situation occurred. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "git_object__size": { + "type": "function", + "file": "git2/deprecated.h", + "line": 578, + "lineto": 578, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to get its size" + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "size_t", + "comment": " size in bytes of the object" + }, + "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", + "comments": "

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.

\n", + "group": "object" + }, + "git_remote_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 599, + "lineto": 599, + "args": [ + { + "name": "remote_name", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *remote_name", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the remote name is well-formed.

\n", + "comments": "", + "group": "remote" + }, + "git_reference_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 643, + "lineto": 643, + "args": [ + { + "name": "refname", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *refname", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the reference name is well-formed.

\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "group": "reference" + }, + "git_oidarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 810, + "lineto": 810, + "args": [ + { + "name": "array", + "type": "git_oidarray *", + "comment": null + } + ], + "argline": "git_oidarray *array", + "sig": "git_oidarray *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory referred to by the git_oidarray. This is an alias of\n git_oidarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "oidarray" + }, + "git_strarray_copy": { + "type": "function", + "file": "git2/deprecated.h", + "line": 879, + "lineto": 879, + "args": [ + { + "name": "tgt", + "type": "git_strarray *", + "comment": "target" + }, + { + "name": "src", + "type": "const git_strarray *", + "comment": "source" + } + ], + "argline": "git_strarray *tgt, const git_strarray *src", + "sig": "git_strarray *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n 0 on allocation failure" + }, + "description": "

Copy a string array object from source to target.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "strarray" + }, + "git_strarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 891, + "lineto": 891, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": null + } + ], + "argline": "git_strarray *array", + "sig": "git_strarray *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory referred to by the git_strarray. This is an alias of\n git_strarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "strarray" + }, + "git_blame_init_options": { + "type": "function", + "file": "git2/deprecated.h", + "line": 905, + "lineto": 905, + "args": [ + { + "name": "opts", + "type": "git_blame_options *", + "comment": null + }, + { + "name": "version", + "type": "unsigned int", + "comment": null + } + ], + "argline": "git_blame_options *opts, unsigned int version", + "sig": "git_blame_options *::unsigned int", + "return": { + "type": "int", + "comment": null + }, + "description": "", + "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility functions at this time.

\n\n

@{

\n", + "group": "blame" + }, + "git_describe_options_init": { + "type": "function", + "file": "git2/describe.h", + "line": 82, + "lineto": 82, + "args": [ + { + "name": "opts", + "type": "git_describe_options *", + "comment": "The `git_describe_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_options *opts, unsigned int version", + "sig": "git_describe_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_options structure

\n", + "comments": "

Initializes a git_describe_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/v1.7.2/describe.html#git_describe_options_init-1" + ] + } + }, + "git_describe_format_options_init": { + "type": "function", + "file": "git2/describe.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "opts", + "type": "git_describe_format_options *", + "comment": "The `git_describe_format_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_FORMAT_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_format_options *opts, unsigned int version", + "sig": "git_describe_format_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_format_options structure

\n", + "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/v1.7.2/describe.html#git_describe_format_options_init-2" + ] + } + }, + "git_describe_commit": { + "type": "function", + "file": "git2/describe.h", + "line": 147, + "lineto": 150, + "args": [ + { + "name": "result", + "type": "git_describe_result **", + "comment": "pointer to store the result. You must free this once\n you're done with it." + }, + { + "name": "committish", + "type": "git_object *", + "comment": "a committish to describe" + }, + { + "name": "opts", + "type": "git_describe_options *", + "comment": "the lookup options (or NULL for defaults)" + } + ], + "argline": "git_describe_result **result, git_object *committish, git_describe_options *opts", + "sig": "git_describe_result **::git_object *::git_describe_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Describe a commit

\n", + "comments": "

Perform the describe operation on the given committish object.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/v1.7.2/describe.html#git_describe_commit-3" + ] + } + }, + "git_describe_workdir": { + "type": "function", + "file": "git2/describe.h", + "line": 165, + "lineto": 168, + "args": [ + { + "name": "out", + "type": "git_describe_result **", + "comment": "pointer to store the result. You must free this once\n you're done with it." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the describe" + }, + { + "name": "opts", + "type": "git_describe_options *", + "comment": "the lookup options (or NULL for defaults)" + } + ], + "argline": "git_describe_result **out, git_repository *repo, git_describe_options *opts", + "sig": "git_describe_result **::git_repository *::git_describe_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Describe a commit

\n", + "comments": "

Perform the describe operation on the current commit and the worktree. After performing describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/v1.7.2/describe.html#git_describe_workdir-4" + ] + } + }, + "git_describe_format": { + "type": "function", + "file": "git2/describe.h", + "line": 179, + "lineto": 182, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The buffer to store the result" + }, + { + "name": "result", + "type": "const git_describe_result *", + "comment": "the result from `git_describe_commit()` or\n `git_describe_workdir()`." + }, + { + "name": "opts", + "type": "const git_describe_format_options *", + "comment": "the formatting options (or NULL for defaults)" + } + ], + "argline": "git_buf *out, const git_describe_result *result, const git_describe_format_options *opts", + "sig": "git_buf *::const git_describe_result *::const git_describe_format_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Print the describe result to a buffer

\n", + "comments": "", + "group": "describe", + "examples": { + "describe.c": [ + "ex/v1.7.2/describe.html#git_describe_format-5" + ] + } + }, + "git_describe_result_free": { + "type": "function", + "file": "git2/describe.h", + "line": 189, + "lineto": 189, + "args": [ + { + "name": "result", + "type": "git_describe_result *", + "comment": "The result to free." + } + ], + "argline": "git_describe_result *result", + "sig": "git_describe_result *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the describe result.

\n", + "comments": "", + "group": "describe" + }, + "git_diff_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 485, + "lineto": 487, + "args": [ + { + "name": "opts", + "type": "git_diff_options *", + "comment": "The `git_diff_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_options *opts, unsigned int version", + "sig": "git_diff_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_options structure

\n", + "comments": "

Initializes a git_diff_options with default values. Equivalent to creating an instance with GIT_DIFF_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_find_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 818, + "lineto": 820, + "args": [ + { + "name": "opts", + "type": "git_diff_find_options *", + "comment": "The `git_diff_find_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_FIND_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_find_options *opts, unsigned int version", + "sig": "git_diff_find_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_find_options structure

\n", + "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_free": { + "type": "function", + "file": "git2/diff.h", + "line": 834, + "lineto": 834, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "The previously created diff; cannot be used after free." + } + ], + "argline": "git_diff *diff", + "sig": "git_diff *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Deallocate a diff.

\n", + "comments": "", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_free-3" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_diff_free-25", + "ex/v1.7.2/log.html#git_diff_free-26" + ] + } + }, + "git_diff_tree_to_tree": { + "type": "function", + "file": "git2/diff.h", + "line": 853, + "lineto": 858, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the trees." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "new_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff to, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_tree *new_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::git_tree *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create a diff with the difference between two tree objects.

\n", + "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_tree_to_tree-4" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_diff_tree_to_tree-27", + "ex/v1.7.2/log.html#git_diff_tree_to_tree-28" + ] + } + }, + "git_diff_tree_to_index": { + "type": "function", + "file": "git2/diff.h", + "line": 880, + "lineto": 885, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree and index." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to diff with; repo index used if NULL." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_index *index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::git_index *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create a diff between a tree and repository index.

\n", + "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_tree_to_index-5" + ] + } + }, + "git_diff_index_to_workdir": { + "type": "function", + "file": "git2/diff.h", + "line": 908, + "lineto": 912, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository." + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to diff from; repo index used if NULL." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_index *index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_index *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create a diff between the repository index and the workdir directory.

\n", + "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_index_to_workdir-6" + ] + } + }, + "git_diff_tree_to_workdir": { + "type": "function", + "file": "git2/diff.h", + "line": 938, + "lineto": 942, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create a diff between a tree and the working directory.

\n", + "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_tree_to_workdir-7" + ] + } + }, + "git_diff_tree_to_workdir_with_index": { + "type": "function", + "file": "git2/diff.h", + "line": 958, + "lineto": 962, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n", + "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_tree_to_workdir_with_index-8" + ] + } + }, + "git_diff_index_to_index": { + "type": "function", + "file": "git2/diff.h", + "line": 977, + "lineto": 982, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the indexes." + }, + { + "name": "old_index", + "type": "git_index *", + "comment": "A git_index object to diff from." + }, + { + "name": "new_index", + "type": "git_index *", + "comment": "A git_index object to diff to." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_index *old_index, git_index *new_index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_index *::git_index *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create a diff with the difference between two index objects.

\n", + "comments": "

The first index will be used for the "old_file" side of the delta and the second index will be used for the "new_file" side of the delta.

\n", + "group": "diff" + }, + "git_diff_merge": { + "type": "function", + "file": "git2/diff.h", + "line": 998, + "lineto": 1000, + "args": [ + { + "name": "onto", + "type": "git_diff *", + "comment": "Diff to merge into." + }, + { + "name": "from", + "type": "const git_diff *", + "comment": "Diff to merge." + } + ], + "argline": "git_diff *onto, const git_diff *from", + "sig": "git_diff *::const git_diff *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Merge one diff into another.

\n", + "comments": "

This merges items from the "from" list into the "onto" list. The resulting diff will have all items that appear in either list. If an item appears in both lists, then it will be "merged" to appear as if the old version was from the "onto" list and the new version is from the "from" list (with the exception that if the item has a pending DELETE in the middle, then it will show as deleted).

\n", + "group": "diff" + }, + "git_diff_find_similar": { + "type": "function", + "file": "git2/diff.h", + "line": 1014, + "lineto": 1016, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "diff to run detection algorithms on" + }, + { + "name": "options", + "type": "const git_diff_find_options *", + "comment": "Control how detection should be run, NULL for defaults" + } + ], + "argline": "git_diff *diff, const git_diff_find_options *options", + "sig": "git_diff *::const git_diff_find_options *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on failure" + }, + "description": "

Transform a diff marking file renames, copies, etc.

\n", + "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_find_similar-9" + ] + } + }, + "git_diff_num_deltas": { + "type": "function", + "file": "git2/diff.h", + "line": 1034, + "lineto": 1034, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "A git_diff generated by one of the above functions" + } + ], + "argline": "const git_diff *diff", + "sig": "const git_diff *", + "return": { + "type": "size_t", + "comment": " Count of number of deltas in the list" + }, + "description": "

Query how many diff records are there in a diff.

\n", + "comments": "", + "group": "diff", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_diff_num_deltas-29" + ] + } + }, + "git_diff_num_deltas_of_type": { + "type": "function", + "file": "git2/diff.h", + "line": 1047, + "lineto": 1048, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "A git_diff generated by one of the above functions" + }, + { + "name": "type", + "type": "git_delta_t", + "comment": "A git_delta_t value to filter the count" + } + ], + "argline": "const git_diff *diff, git_delta_t type", + "sig": "const git_diff *::git_delta_t", + "return": { + "type": "size_t", + "comment": " Count of number of deltas matching delta_t type" + }, + "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", + "comments": "

This works just like git_diff_num_deltas() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", + "group": "diff" + }, + "git_diff_get_delta": { + "type": "function", + "file": "git2/diff.h", + "line": 1067, + "lineto": 1068, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "Diff list object" + }, + { + "name": "idx", + "type": "size_t", + "comment": "Index into diff list" + } + ], + "argline": "const git_diff *diff, size_t idx", + "sig": "const git_diff *::size_t", + "return": { + "type": "const git_diff_delta *", + "comment": " Pointer to git_diff_delta (or NULL if `idx` out of range)" + }, + "description": "

Return the diff delta for an entry in the diff list.

\n", + "comments": "

The git_diff_delta pointer points to internal data and you do not have to release it when you are done with it. It will go away when the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary content or not may not be set if there are no attributes set for the file and there has been no reason to load the file data at this point. For now, if you need those flags to be up to date, your only option is to either use git_diff_foreach or create a git_patch.

\n", + "group": "diff" + }, + "git_diff_is_sorted_icase": { + "type": "function", + "file": "git2/diff.h", + "line": 1076, + "lineto": 1076, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "diff to check" + } + ], + "argline": "const git_diff *diff", + "sig": "const git_diff *", + "return": { + "type": "int", + "comment": " 0 if case sensitive, 1 if case is ignored" + }, + "description": "

Check if deltas are sorted case sensitively or insensitively.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_foreach": { + "type": "function", + "file": "git2/diff.h", + "line": 1104, + "lineto": 1110, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback function to make per file in the diff." + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Optional callback to make for binary files." + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Optional callback to make per hunk of text diff. This\n callback is called to describe a range of lines in the\n diff. It will not be issued for binary files." + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Optional callback to make per line of diff text. This\n same callback will be made for context lines, added, and\n removed lines, and even for a deleted trailing newline." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callbacks." + } + ], + "argline": "git_diff *diff, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "git_diff *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all deltas in a diff issuing callbacks.

\n", + "comments": "

This will iterate through all of the files described in a diff. You should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the files will only be calculated if they are not NULL. Of course, these callbacks will not be invoked for binary files on the diff or for files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate the iteration and return the value to the user.

\n", + "group": "diff" + }, + "git_diff_status_char": { + "type": "function", + "file": "git2/diff.h", + "line": 1123, + "lineto": 1123, + "args": [ + { + "name": "status", + "type": "git_delta_t", + "comment": "The git_delta_t value to look up" + } + ], + "argline": "git_delta_t status", + "sig": "git_delta_t", + "return": { + "type": "char", + "comment": " The single character label for that code" + }, + "description": "

Look up the single character abbreviation for a delta status code.

\n", + "comments": "

When you run git diff --name-status it uses single letter codes in the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. This function converts a git_delta_t value into these letters for your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", + "group": "diff" + }, + "git_diff_print": { + "type": "function", + "file": "git2/diff.h", + "line": 1149, + "lineto": 1153, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_format_t", + "comment": "A git_diff_format_t value to pick the text format." + }, + { + "name": "print_cb", + "type": "git_diff_line_cb", + "comment": "Callback to make per line of diff text." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callback." + } + ], + "argline": "git_diff *diff, git_diff_format_t format, git_diff_line_cb print_cb, void *payload", + "sig": "git_diff *::git_diff_format_t::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Iterate over a diff generating formatted text output.

\n", + "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_print-10" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_diff_print-30" + ] + } + }, + "git_diff_to_buf": { + "type": "function", + "file": "git2/diff.h", + "line": 1165, + "lineto": 1168, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "A pointer to a user-allocated git_buf that will\n contain the diff text" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_format_t", + "comment": "A git_diff_format_t value to pick the text format." + } + ], + "argline": "git_buf *out, git_diff *diff, git_diff_format_t format", + "sig": "git_buf *::git_diff *::git_diff_format_t", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Produce the complete formatted text output from a diff into a\n buffer.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_blobs": { + "type": "function", + "file": "git2/diff.h", + "line": 1204, + "lineto": 1214, + "args": [ + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "new_blob", + "type": "const git_blob *", + "comment": "Blob for new side of diff, or NULL for empty blob" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat new blob as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff on two blobs.

\n", + "comments": "

Compared to a file, a blob lacks some contextual information. As such, the git_diff_file given to the callback will have some fake data; i.e. mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated as an empty blob, with the oid set to NULL in the git_diff_file data. Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob looks like binary data, the git_diff_delta binary attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass GIT_DIFF_FORCE_TEXT of course).

\n", + "group": "diff" + }, + "git_diff_blob_to_buffer": { + "type": "function", + "file": "git2/diff.h", + "line": 1241, + "lineto": 1252, + "args": [ + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "buffer_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const git_blob *old_blob, const char *old_as_path, const char *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const git_blob *::const char *::const char *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff between a blob and a buffer.

\n", + "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the entire content of the buffer added). Passing NULL to the buffer will do the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", + "group": "diff" + }, + "git_diff_buffers": { + "type": "function", + "file": "git2/diff.h", + "line": 1275, + "lineto": 1287, + "args": [ + { + "name": "old_buffer", + "type": "const void *", + "comment": "Raw data for old side of diff, or NULL for empty" + }, + { + "name": "old_len", + "type": "size_t", + "comment": "Length of the raw data for old side of the diff" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old buffer as if it had this filename; can be NULL" + }, + { + "name": "new_buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "new_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff between two buffers.

\n", + "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n", + "group": "diff" + }, + "git_diff_from_buffer": { + "type": "function", + "file": "git2/diff.h", + "line": 1327, + "lineto": 1334, + "args": [ + { + "name": "out", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "content", + "type": "const char *", + "comment": "The contents of a patch file" + }, + { + "name": "content_len", + "type": "size_t", + "comment": "The length of the patch file contents" + } + ], + "argline": "git_diff **out, const char *content, size_t content_len", + "sig": "git_diff **::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Read the contents of a git patch file into a git_diff object.

\n", + "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_from_buffer-11", + "ex/v1.7.2/diff.html#git_diff_from_buffer-12" + ] + } + }, + "git_diff_get_stats": { + "type": "function", + "file": "git2/diff.h", + "line": 1370, + "lineto": 1372, + "args": [ + { + "name": "out", + "type": "git_diff_stats **", + "comment": "Structure containing the diff statistics." + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + } + ], + "argline": "git_diff_stats **out, git_diff *diff", + "sig": "git_diff_stats **::git_diff *", + "return": { + "type": "int", + "comment": " 0 on success; non-zero on error" + }, + "description": "

Accumulate diff statistics for all patches.

\n", + "comments": "", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_get_stats-13" + ] + } + }, + "git_diff_stats_files_changed": { + "type": "function", + "file": "git2/diff.h", + "line": 1380, + "lineto": 1381, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of files changed in the diff" + }, + "description": "

Get the total number of files changed in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_insertions": { + "type": "function", + "file": "git2/diff.h", + "line": 1389, + "lineto": 1390, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of insertions in the diff" + }, + "description": "

Get the total number of insertions in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_deletions": { + "type": "function", + "file": "git2/diff.h", + "line": 1398, + "lineto": 1399, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of deletions in the diff" + }, + "description": "

Get the total number of deletions in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_to_buf": { + "type": "function", + "file": "git2/diff.h", + "line": 1410, + "lineto": 1414, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the formatted diff statistics in." + }, + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_stats_format_t", + "comment": "Formatting option." + }, + { + "name": "width", + "type": "size_t", + "comment": "Target width for output (only affects GIT_DIFF_STATS_FULL)" + } + ], + "argline": "git_buf *out, const git_diff_stats *stats, git_diff_stats_format_t format, size_t width", + "sig": "git_buf *::const git_diff_stats *::git_diff_stats_format_t::size_t", + "return": { + "type": "int", + "comment": " 0 on success; non-zero on error" + }, + "description": "

Print diff statistics to a git_buf.

\n", + "comments": "", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_stats_to_buf-14" + ] + } + }, + "git_diff_stats_free": { + "type": "function", + "file": "git2/diff.h", + "line": 1422, + "lineto": 1422, + "args": [ + { + "name": "stats", + "type": "git_diff_stats *", + "comment": "The previously created statistics object;\n cannot be used after free." + } + ], + "argline": "git_diff_stats *stats", + "sig": "git_diff_stats *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Deallocate a git_diff_stats.

\n", + "comments": "", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_diff_stats_free-15" + ] + } + }, + "git_diff_patchid_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 1448, + "lineto": 1450, + "args": [ + { + "name": "opts", + "type": "git_diff_patchid_options *", + "comment": "The `git_diff_patchid_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_PATCHID_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_patchid_options *opts, unsigned int version", + "sig": "git_diff_patchid_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_patchid_options structure

\n", + "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_patchid": { + "type": "function", + "file": "git2/diff.h", + "line": 1471, + "lineto": 1471, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where the calculated patch ID should be stored" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "The diff to calculate the ID for" + }, + { + "name": "opts", + "type": "git_diff_patchid_options *", + "comment": "Options for how to calculate the patch ID. This is\n intended for future changes, as currently no options are\n available." + } + ], + "argline": "git_oid *out, git_diff *diff, git_diff_patchid_options *opts", + "sig": "git_oid *::git_diff *::git_diff_patchid_options *", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise." + }, + "description": "

Calculate the patch ID for the given patch.

\n", + "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", + "group": "diff" + }, + "git_error_last": { + "type": "function", + "file": "git2/errors.h", + "line": 128, + "lineto": 128, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const git_error *", + "comment": " A git_error object." + }, + "description": "

Return the last git_error object that was generated for the\n current thread.

\n", + "comments": "

The default behaviour of this function is to return NULL if no previous error has occurred. However, libgit2's error strings are not cleared aggressively, so a prior (unrelated) error may be returned. This can be avoided by only calling this function if the prior call to a libgit2 API returned an error.

\n", + "group": "error", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_error_last-11", + "ex/v1.7.2/checkout.html#git_error_last-12", + "ex/v1.7.2/checkout.html#git_error_last-13", + "ex/v1.7.2/checkout.html#git_error_last-14" + ], + "commit.c": [ + "ex/v1.7.2/commit.html#git_error_last-2" + ], + "config.c": [ + "ex/v1.7.2/config.html#git_error_last-6", + "ex/v1.7.2/config.html#git_error_last-7", + "ex/v1.7.2/config.html#git_error_last-8" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_error_last-33" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_error_last-8", + "ex/v1.7.2/merge.html#git_error_last-9" + ] + } + }, + "git_error_clear": { + "type": "function", + "file": "git2/errors.h", + "line": 133, + "lineto": 133, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "void", + "comment": null + }, + "description": "

Clear the last library error that occurred for this thread.

\n", + "comments": "", + "group": "error" + }, + "git_error_set": { + "type": "function", + "file": "git2/errors.h", + "line": 153, + "lineto": 154, + "args": [ + { + "name": "error_class", + "type": "int", + "comment": "One of the `git_error_t` enum above describing the\n general subsystem that is responsible for the error." + }, + { + "name": "fmt", + "type": "const char *", + "comment": "The `printf`-style format string; subsequent arguments must\n be the arguments for the format string." + } + ], + "argline": "int error_class, const char *fmt", + "sig": "int::const char *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Set the error message string for this thread, using printf-style\n formatting.

\n", + "comments": "

This function is public so that custom ODB backends and the like can relay an error message through libgit2. Most regular users of libgit2 will never need to call this function -- actually, calling it in most circumstances (for example, calling from within a callback function) will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies to the particular thread that this libgit2 call is made from.

\n", + "group": "error" + }, + "git_error_set_str": { + "type": "function", + "file": "git2/errors.h", + "line": 166, + "lineto": 166, + "args": [ + { + "name": "error_class", + "type": "int", + "comment": "One of the `git_error_t` enum above describing the\n general subsystem that is responsible for the error." + }, + { + "name": "string", + "type": "const char *", + "comment": "The error message to keep" + } + ], + "argline": "int error_class, const char *string", + "sig": "int::const char *", + "return": { + "type": "int", + "comment": " 0 on success or -1 on failure" + }, + "description": "

Set the error message string for this thread. This function is like\n git_error_set but takes a static string instead of a printf-style\n format.

\n", + "comments": "", + "group": "error" + }, + "git_error_set_oom": { + "type": "function", + "file": "git2/errors.h", + "line": 177, + "lineto": 177, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "void", + "comment": null + }, + "description": "

Set the error message to a special value for memory allocation failure.

\n", + "comments": "

The normal git_error_set_str() function attempts to strdup() the string that is passed in. This is not a good idea when the error in question is a memory allocation failure. That circumstance has a special setter function that sets the error string to a known and statically allocated internal value.

\n", + "group": "error" + }, + "git_filter_list_load": { + "type": "function", + "file": "git2/filter.h", + "line": 129, + "lineto": 135, + "args": [ + { + "name": "filters", + "type": "git_filter_list **", + "comment": "Output newly created git_filter_list (or NULL)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object that contains `path`" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "The blob to which the filter will be applied (if known)" + }, + { + "name": "path", + "type": "const char *", + "comment": "Relative path of the file to be filtered" + }, + { + "name": "mode", + "type": "git_filter_mode_t", + "comment": "Filtering direction (WT->ODB or ODB->WT)" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of `git_filter_flag_t` flags" + } + ], + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t", + "return": { + "type": "int", + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + }, + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "group": "filter" + }, + "git_filter_list_load_ext": { + "type": "function", + "file": "git2/filter.h", + "line": 152, + "lineto": 158, + "args": [ + { + "name": "filters", + "type": "git_filter_list **", + "comment": "Output newly created git_filter_list (or NULL)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object that contains `path`" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "The blob to which the filter will be applied (if known)" + }, + { + "name": "path", + "type": "const char *", + "comment": "Relative path of the file to be filtered" + }, + { + "name": "mode", + "type": "git_filter_mode_t", + "comment": "Filtering direction (WT->ODB or ODB->WT)" + }, + { + "name": "opts", + "type": "git_filter_options *", + "comment": "The `git_filter_options` to use when loading filters" + } + ], + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, git_filter_options *opts", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::git_filter_options *", + "return": { + "type": "int", + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + }, + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "group": "filter" + }, + "git_filter_list_contains": { + "type": "function", + "file": "git2/filter.h", + "line": 172, + "lineto": 174, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A loaded git_filter_list (or NULL)" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the filter to query" + } + ], + "argline": "git_filter_list *filters, const char *name", + "sig": "git_filter_list *::const char *", + "return": { + "type": "int", + "comment": " 1 if the filter is in the list, 0 otherwise" + }, + "description": "

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n", + "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", + "group": "filter" + }, + "git_filter_list_apply_to_buffer": { + "type": "function", + "file": "git2/filter.h", + "line": 185, + "lineto": 189, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to store the result of the filtering" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A loaded git_filter_list (or NULL)" + }, + { + "name": "in", + "type": "const char *", + "comment": "Buffer containing the data to filter" + }, + { + "name": "in_len", + "type": "size_t", + "comment": "The length of the input buffer" + } + ], + "argline": "git_buf *out, git_filter_list *filters, const char *in, size_t in_len", + "sig": "git_buf *::git_filter_list *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise" + }, + "description": "

Apply filter list to a data buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_file": { + "type": "function", + "file": "git2/filter.h", + "line": 201, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer into which to store the filtered file" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the filtering" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_repository *repo, const char *path", + "sig": "git_buf *::git_filter_list *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Apply a filter list to the contents of a file on disk

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_blob": { + "type": "function", + "file": "git2/filter.h", + "line": 215, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer into which to store the filtered file" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "the blob to filter" + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_blob *blob", + "sig": "git_buf *::git_filter_list *::git_blob *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Apply a filter list to the contents of a blob

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_buffer": { + "type": "function", + "file": "git2/filter.h", + "line": 229, + "lineto": 233, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the buffer to filter" + }, + { + "name": "len", + "type": "size_t", + "comment": "the size of the buffer" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, const char *buffer, size_t len, git_writestream *target", + "sig": "git_filter_list *::const char *::size_t::git_writestream *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Apply a filter list to an arbitrary buffer as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_file": { + "type": "function", + "file": "git2/filter.h", + "line": 245, + "lineto": 249, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the filtering" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, git_repository *repo, const char *path, git_writestream *target", + "sig": "git_filter_list *::git_repository *::const char *::git_writestream *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Apply a filter list to a file as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_blob": { + "type": "function", + "file": "git2/filter.h", + "line": 259, + "lineto": 262, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "the blob to filter" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, git_blob *blob, git_writestream *target", + "sig": "git_filter_list *::git_blob *::git_writestream *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Apply a filter list to a blob as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_free": { + "type": "function", + "file": "git2/filter.h", + "line": 269, + "lineto": 269, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A git_filter_list created by `git_filter_list_load`" + } + ], + "argline": "git_filter_list *filters", + "sig": "git_filter_list *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a git_filter_list

\n", + "comments": "", + "group": "filter" + }, + "git_libgit2_init": { + "type": "function", + "file": "git2/global.h", + "line": 26, + "lineto": 26, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " the number of initializations of the library, or an error code." + }, + "description": "

Init the global state

\n", + "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", + "group": "libgit2", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_libgit2_init-34" + ] + } + }, + "git_libgit2_shutdown": { + "type": "function", + "file": "git2/global.h", + "line": 39, + "lineto": 39, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " the number of remaining initializations of the library, or an\n error code." + }, + "description": "

Shutdown the global state

\n", + "comments": "

Clean up the global state and threading context after calling it as many times as git_libgit2_init() was called - it will return the number of remainining initializations that have not been shutdown (after this one).

\n", + "group": "libgit2" + }, + "git_graph_ahead_behind": { + "type": "function", + "file": "git2/graph.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "ahead", + "type": "size_t *", + "comment": "number of unique from commits in `upstream`" + }, + { + "name": "behind", + "type": "size_t *", + "comment": "number of unique from commits in `local`" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "local", + "type": "const git_oid *", + "comment": "the commit for local" + }, + { + "name": "upstream", + "type": "const git_oid *", + "comment": "the commit for upstream" + } + ], + "argline": "size_t *ahead, size_t *behind, git_repository *repo, const git_oid *local, const git_oid *upstream", + "sig": "size_t *::size_t *::git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Count the number of unique commits between two commit objects

\n", + "comments": "

There is no need for branches containing the commits to have any upstream relationship, but it helps to think of one as a branch and the other as its upstream, the ahead and behind values will be what git would report for the branches.

\n", + "group": "graph" + }, + "git_graph_descendant_of": { + "type": "function", + "file": "git2/graph.h", + "line": 53, + "lineto": 56, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "commit", + "type": "const git_oid *", + "comment": "a previously loaded commit" + }, + { + "name": "ancestor", + "type": "const git_oid *", + "comment": "a potential ancestor commit" + } + ], + "argline": "git_repository *repo, const git_oid *commit, const git_oid *ancestor", + "sig": "git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise." + }, + "description": "

Determine if a commit is the descendant of another commit.

\n", + "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", + "group": "graph" + }, + "git_graph_reachable_from_any": { + "type": "function", + "file": "git2/graph.h", + "line": 69, + "lineto": 73, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "commit", + "type": "const git_oid *", + "comment": "a previously loaded commit" + }, + { + "name": "descendant_array", + "type": "const git_oid []", + "comment": "oids of the commits" + }, + { + "name": "length", + "type": "size_t", + "comment": "the number of commits in the provided `descendant_array`" + } + ], + "argline": "git_repository *repo, const git_oid *commit, const git_oid [] descendant_array, size_t length", + "sig": "git_repository *::const git_oid *::const git_oid []::size_t", + "return": { + "type": "int", + "comment": " 1 if the given commit is an ancestor of any of the given potential\n descendants, 0 if not, error code otherwise." + }, + "description": "

Determine if a commit is reachable from any of a list of commits by\n following parent edges.

\n", + "comments": "", + "group": "graph" + }, + "git_ignore_add_rule": { + "type": "function", + "file": "git2/ignore.h", + "line": 37, + "lineto": 39, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to add ignore rules to." + }, + { + "name": "rules", + "type": "const char *", + "comment": "Text of rules, the contents to add on a .gitignore file.\n It is okay to have multiple rules in the text; if so,\n each rule should be terminated with a newline." + } + ], + "argline": "git_repository *repo, const char *rules", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success" + }, + "description": "

Add ignore rules for a repository.

\n", + "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from .gitignore files in the repository tree or from a shared system file only if a "core.excludesfile" config value is set. The library also keeps a set of per-repository internal ignores that can be configured in-memory and will not persist. This function allows you to add to that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c/ with space");\n
\n\n

This would add three rules to the ignores.

\n", + "group": "ignore" + }, + "git_ignore_clear_internal_rules": { + "type": "function", + "file": "git2/ignore.h", + "line": 52, + "lineto": 53, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to remove ignore rules from." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 0 on success" + }, + "description": "

Clear ignore rules that were explicitly added.

\n", + "comments": "

Resets to the default internal ignore rules. This will not turn off rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", + "group": "ignore" + }, + "git_ignore_path_is_ignored": { + "type": "function", + "file": "git2/ignore.h", + "line": 71, + "lineto": 74, + "args": [ + { + "name": "ignored", + "type": "int *", + "comment": "boolean returning 0 if the file is not ignored, 1 if it is" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "the file to check ignores for, relative to the repo's workdir." + } + ], + "argline": "int *ignored, git_repository *repo, const char *path", + "sig": "int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." + }, + "description": "

Test if the ignore rules apply to a given path.

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index" on the given file, would it be shown or not?

\n", + "group": "ignore" + }, + "git_index_free": { + "type": "function", + "file": "git2/index.h", + "line": 216, + "lineto": 216, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free an existing index object.

\n", + "comments": "", + "group": "index", + "examples": { + "add.c": [ + "ex/v1.7.2/add.html#git_index_free-1" + ], + "commit.c": [ + "ex/v1.7.2/commit.html#git_index_free-3" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_index_free-35" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_index_free-2" + ], + "ls-files.c": [ + "ex/v1.7.2/ls-files.html#git_index_free-1" + ] + } + }, + "git_index_owner": { + "type": "function", + "file": "git2/index.h", + "line": 224, + "lineto": 224, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "The index" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "git_repository *", + "comment": " A pointer to the repository" + }, + "description": "

Get the repository this index relates to

\n", + "comments": "", + "group": "index" + }, + "git_index_caps": { + "type": "function", + "file": "git2/index.h", + "line": 232, + "lineto": 232, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "An existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "int", + "comment": " A combination of GIT_INDEX_CAPABILITY values" + }, + "description": "

Read index capabilities flags.

\n", + "comments": "", + "group": "index" + }, + "git_index_set_caps": { + "type": "function", + "file": "git2/index.h", + "line": 245, + "lineto": 245, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "caps", + "type": "int", + "comment": "A combination of GIT_INDEX_CAPABILITY values" + } + ], + "argline": "git_index *index, int caps", + "sig": "git_index *::int", + "return": { + "type": "int", + "comment": " 0 on success, -1 on failure" + }, + "description": "

Set index capabilities flags.

\n", + "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then capabilities will be read from the config of the owner object, looking at core.ignorecase, core.filemode, core.symlinks.

\n", + "group": "index" + }, + "git_index_version": { + "type": "function", + "file": "git2/index.h", + "line": 257, + "lineto": 257, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "unsigned int", + "comment": " the index version" + }, + "description": "

Get index on-disk version.

\n", + "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index with version 2 may be written instead, if the extension data in version 3 is not necessary.

\n", + "group": "index" + }, + "git_index_set_version": { + "type": "function", + "file": "git2/index.h", + "line": 270, + "lineto": 270, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The new version number" + } + ], + "argline": "git_index *index, unsigned int version", + "sig": "git_index *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success, -1 on failure" + }, + "description": "

Set index on-disk version.

\n", + "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may write an index with version 3 instead, if necessary to accurately represent the index.

\n", + "group": "index" + }, + "git_index_read": { + "type": "function", + "file": "git2/index.h", + "line": 289, + "lineto": 289, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "force", + "type": "int", + "comment": "if true, always reload, vs. only read if file has changed" + } + ], + "argline": "git_index *index, int force", + "sig": "git_index *::int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n", + "comments": "

If force is true, this performs a "hard" read that discards in-memory changes and always reloads the on-disk index data. If there is no on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index data from disk only if it has changed since the last time it was loaded. Purely in-memory index data will be untouched. Be aware: if there are changes on disk, unwritten in-memory changes are discarded.

\n", + "group": "index" + }, + "git_index_write": { + "type": "function", + "file": "git2/index.h", + "line": 298, + "lineto": 298, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Write an existing index object from memory back to disk\n using an atomic file lock.

\n", + "comments": "", + "group": "index", + "examples": { + "add.c": [ + "ex/v1.7.2/add.html#git_index_write-2" + ], + "commit.c": [ + "ex/v1.7.2/commit.html#git_index_write-4" + ] + } + }, + "git_index_path": { + "type": "function", + "file": "git2/index.h", + "line": 306, + "lineto": 306, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "an existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "const char *", + "comment": " path to index file or NULL for in-memory index" + }, + "description": "

Get the full path to the index file on disk.

\n", + "comments": "", + "group": "index" + }, + "git_index_checksum": { + "type": "function", + "file": "git2/index.h", + "line": 320, + "lineto": 320, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the checksum of the index" + }, + "description": "

Get the checksum of the index

\n", + "comments": "

This checksum is the SHA-1 hash over the index file (except the last 20 bytes which are the checksum itself). In cases where the index does not exist on-disk, it will be zeroed out.

\n", + "group": "index" + }, + "git_index_read_tree": { + "type": "function", + "file": "git2/index.h", + "line": 332, + "lineto": 332, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "tree to read" + } + ], + "argline": "git_index *index, const git_tree *tree", + "sig": "git_index *::const git_tree *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Read a tree into the index file with stats

\n", + "comments": "

The current index contents will be replaced by the specified tree.

\n", + "group": "index" + }, + "git_index_write_tree": { + "type": "function", + "file": "git2/index.h", + "line": 353, + "lineto": 353, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the written tree" + }, + { + "name": "index", + "type": "git_index *", + "comment": "Index to write" + } + ], + "argline": "git_oid *out, git_index *index", + "sig": "git_oid *::git_index *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" + }, + "description": "

Write the index as a tree

\n", + "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", + "group": "index", + "examples": { + "commit.c": [ + "ex/v1.7.2/commit.html#git_index_write_tree-5" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_index_write_tree-3" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_index_write_tree-10" + ] + } + }, + "git_index_write_tree_to": { + "type": "function", + "file": "git2/index.h", + "line": 370, + "lineto": 370, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store OID of the written tree" + }, + { + "name": "index", + "type": "git_index *", + "comment": "Index to write" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to write the tree" + } + ], + "argline": "git_oid *out, git_index *index, git_repository *repo", + "sig": "git_oid *::git_index *::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" + }, + "description": "

Write the index as a tree to the given repository

\n", + "comments": "

This method will do the same as git_index_write_tree, but letting the user choose the repository where the tree will be written.

\n\n

The index must not contain any file in conflict.

\n", + "group": "index" + }, + "git_index_entrycount": { + "type": "function", + "file": "git2/index.h", + "line": 389, + "lineto": 389, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "an existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "size_t", + "comment": " integer of count of current entries" + }, + "description": "

Get the count of entries currently in the index

\n", + "comments": "", + "group": "index", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_index_entrycount-36" + ], + "ls-files.c": [ + "ex/v1.7.2/ls-files.html#git_index_entrycount-2" + ] + } + }, + "git_index_clear": { + "type": "function", + "file": "git2/index.h", + "line": 400, + "lineto": 400, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "int", + "comment": " 0 on success, error code \n<\n 0 on failure" + }, + "description": "

Clear the contents (all the entries) of an index object.

\n", + "comments": "

This clears the index object in memory; changes must be explicitly written to disk for them to take effect persistently.

\n", + "group": "index" + }, + "git_index_get_byindex": { + "type": "function", + "file": "git2/index.h", + "line": 413, + "lineto": 414, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "n", + "type": "size_t", + "comment": "the position of the entry" + } + ], + "argline": "git_index *index, size_t n", + "sig": "git_index *::size_t", + "return": { + "type": "const git_index_entry *", + "comment": " a pointer to the entry; NULL if out of bounds" + }, + "description": "

Get a pointer to one of the entries in the index

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_index_get_byindex-37" + ], + "ls-files.c": [ + "ex/v1.7.2/ls-files.html#git_index_get_byindex-3" + ] + } + }, + "git_index_get_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 428, + "lineto": 429, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to search" + }, + { + "name": "stage", + "type": "int", + "comment": "stage to search" + } + ], + "argline": "git_index *index, const char *path, int stage", + "sig": "git_index *::const char *::int", + "return": { + "type": "const git_index_entry *", + "comment": " a pointer to the entry; NULL if it was not found" + }, + "description": "

Get a pointer to one of the entries in the index

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index", + "examples": { + "ls-files.c": [ + "ex/v1.7.2/ls-files.html#git_index_get_bypath-4" + ] + } + }, + "git_index_remove": { + "type": "function", + "file": "git2/index.h", + "line": 439, + "lineto": 439, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to search" + }, + { + "name": "stage", + "type": "int", + "comment": "stage to search" + } + ], + "argline": "git_index *index, const char *path, int stage", + "sig": "git_index *::const char *::int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove an entry from the index

\n", + "comments": "", + "group": "index" + }, + "git_index_remove_directory": { + "type": "function", + "file": "git2/index.h", + "line": 449, + "lineto": 450, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "dir", + "type": "const char *", + "comment": "container directory path" + }, + { + "name": "stage", + "type": "int", + "comment": "stage to search" + } + ], + "argline": "git_index *index, const char *dir, int stage", + "sig": "git_index *::const char *::int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove all entries from the index under a given directory

\n", + "comments": "", + "group": "index" + }, + "git_index_add": { + "type": "function", + "file": "git2/index.h", + "line": 466, + "lineto": 466, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "source_entry", + "type": "const git_index_entry *", + "comment": "new entry object" + } + ], + "argline": "git_index *index, const git_index_entry *source_entry", + "sig": "git_index *::const git_index_entry *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add or update an index entry from an in-memory struct

\n", + "comments": "

If a previous index entry exists that has the same path and stage as the given 'source_entry', it will be replaced. Otherwise, the 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given 'source_entry' will be inserted on the index.

\n", + "group": "index" + }, + "git_index_entry_stage": { + "type": "function", + "file": "git2/index.h", + "line": 478, + "lineto": 478, + "args": [ + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "The entry" + } + ], + "argline": "const git_index_entry *entry", + "sig": "const git_index_entry *", + "return": { + "type": "int", + "comment": " the stage number" + }, + "description": "

Return the stage number from a git index entry

\n", + "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags & GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT\n
\n", + "group": "index" + }, + "git_index_entry_is_conflict": { + "type": "function", + "file": "git2/index.h", + "line": 487, + "lineto": 487, + "args": [ + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "The entry" + } + ], + "argline": "const git_index_entry *entry", + "sig": "const git_index_entry *", + "return": { + "type": "int", + "comment": " 1 if the entry is a conflict entry, 0 otherwise" + }, + "description": "

Return whether the given index entry is a conflict (has a high stage\n entry). This is simply shorthand for git_index_entry_stage > 0.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_new": { + "type": "function", + "file": "git2/index.h", + "line": 508, + "lineto": 510, + "args": [ + { + "name": "iterator_out", + "type": "git_index_iterator **", + "comment": "The newly created iterator" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to iterate" + } + ], + "argline": "git_index_iterator **iterator_out, git_index *index", + "sig": "git_index_iterator **::git_index *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create an iterator that will return every entry contained in the\n index at the time of creation. Entries are returned in order,\n sorted by path. This iterator is backed by a snapshot that allows\n callers to modify the index while iterating without affecting the\n iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_next": { + "type": "function", + "file": "git2/index.h", + "line": 519, + "lineto": 521, + "args": [ + { + "name": "out", + "type": "const git_index_entry **", + "comment": "Pointer to store the index entry in" + }, + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator" + } + ], + "argline": "const git_index_entry **out, git_index_iterator *iterator", + "sig": "const git_index_entry **::git_index_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER on iteration completion or an error code" + }, + "description": "

Return the next index entry in-order from the iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_free": { + "type": "function", + "file": "git2/index.h", + "line": 528, + "lineto": 528, + "args": [ + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator to free" + } + ], + "argline": "git_index_iterator *iterator", + "sig": "git_index_iterator *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the index iterator

\n", + "comments": "", + "group": "index" + }, + "git_index_add_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 559, + "lineto": 559, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "filename to add" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add or update an index entry from a file on disk

\n", + "comments": "

The file path must be relative to the repository's working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_add_from_buffer": { + "type": "function", + "file": "git2/index.h", + "line": 587, + "lineto": 590, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "filename to add" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "data to be written into the blob" + }, + { + "name": "len", + "type": "size_t", + "comment": "length of the data" + } + ], + "argline": "git_index *index, const git_index_entry *entry, const void *buffer, size_t len", + "sig": "git_index *::const git_index_entry *::const void *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add or update an index entry from a buffer in memory

\n", + "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_remove_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 606, + "lineto": 606, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "filename to remove" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove an index entry corresponding to a file on disk

\n", + "comments": "

The file path must be relative to the repository's working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_add_all": { + "type": "function", + "file": "git2/index.h", + "line": 654, + "lineto": 659, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "combination of git_index_add_option_t flags" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each added/updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, unsigned int flags, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::unsigned int::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Add or update index entries matching files in the working directory.

\n", + "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", + "group": "index", + "examples": { + "add.c": [ + "ex/v1.7.2/add.html#git_index_add_all-3" + ] + } + }, + "git_index_remove_all": { + "type": "function", + "file": "git2/index.h", + "line": 676, + "lineto": 680, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each removed path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Remove all matching index entries.

\n", + "comments": "

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is removed. Return 0 to remove the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "group": "index" + }, + "git_index_update_all": { + "type": "function", + "file": "git2/index.h", + "line": 705, + "lineto": 709, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Update all index entries to match the working directory

\n", + "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "group": "index", + "examples": { + "add.c": [ + "ex/v1.7.2/add.html#git_index_update_all-4" + ] + } + }, + "git_index_find": { + "type": "function", + "file": "git2/index.h", + "line": 720, + "lineto": 720, + "args": [ + { + "name": "at_pos", + "type": "size_t *", + "comment": "the address to which the position of the index entry is written (optional)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to search" + } + ], + "argline": "size_t *at_pos, git_index *index, const char *path", + "sig": "size_t *::git_index *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Find the first position of any entries which point to given\n path in the Git index.

\n", + "comments": "", + "group": "index" + }, + "git_index_find_prefix": { + "type": "function", + "file": "git2/index.h", + "line": 731, + "lineto": 731, + "args": [ + { + "name": "at_pos", + "type": "size_t *", + "comment": "the address to which the position of the index entry is written (optional)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "prefix", + "type": "const char *", + "comment": "the prefix to search for" + } + ], + "argline": "size_t *at_pos, git_index *index, const char *prefix", + "sig": "size_t *::git_index *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Find the first position of any entries matching a prefix. To find the first position\n of a path inside a given folder, suffix the prefix with a '/'.

\n", + "comments": "", + "group": "index" + }, + "git_index_conflict_add": { + "type": "function", + "file": "git2/index.h", + "line": 756, + "lineto": 760, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "ancestor_entry", + "type": "const git_index_entry *", + "comment": "the entry data for the ancestor of the conflict" + }, + { + "name": "our_entry", + "type": "const git_index_entry *", + "comment": "the entry data for our side of the merge conflict" + }, + { + "name": "their_entry", + "type": "const git_index_entry *", + "comment": "the entry data for their side of the merge conflict" + } + ], + "argline": "git_index *index, const git_index_entry *ancestor_entry, const git_index_entry *our_entry, const git_index_entry *their_entry", + "sig": "git_index *::const git_index_entry *::const git_index_entry *::const git_index_entry *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n", + "comments": "

The entries are the entries from the tree included in the merge. Any entry may be null to indicate that that file was not present in the trees during the merge. For example, ancestor_entry may be NULL to indicate that a file was added in both branches and must be resolved.

\n", + "group": "index" + }, + "git_index_conflict_get": { + "type": "function", + "file": "git2/index.h", + "line": 776, + "lineto": 781, + "args": [ + { + "name": "ancestor_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the ancestor entry" + }, + { + "name": "our_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the our entry" + }, + { + "name": "their_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the their entry" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to search" + } + ], + "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index *index, const char *path", + "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the index entries that represent a conflict of a single file.

\n", + "comments": "

The entries are not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index" + }, + "git_index_conflict_remove": { + "type": "function", + "file": "git2/index.h", + "line": 790, + "lineto": 790, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to remove conflicts for" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Removes the index entries that represent a conflict of a single file.

\n", + "comments": "", + "group": "index" + }, + "git_index_conflict_cleanup": { + "type": "function", + "file": "git2/index.h", + "line": 798, + "lineto": 798, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove all conflicts in the index (entries with a stage greater than 0).

\n", + "comments": "", + "group": "index" + }, + "git_index_has_conflicts": { + "type": "function", + "file": "git2/index.h", + "line": 806, + "lineto": 806, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "An existing index object." + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "int", + "comment": " 1 if at least one conflict is found, 0 otherwise." + }, + "description": "

Determine if the index contains entries representing file conflicts.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_index_has_conflicts-11" + ] + } + }, + "git_index_conflict_iterator_new": { + "type": "function", + "file": "git2/index.h", + "line": 817, + "lineto": 819, + "args": [ + { + "name": "iterator_out", + "type": "git_index_conflict_iterator **", + "comment": "The newly created conflict iterator" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to scan" + } + ], + "argline": "git_index_conflict_iterator **iterator_out, git_index *index", + "sig": "git_index_conflict_iterator **::git_index *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create an iterator for the conflicts in the index.

\n", + "comments": "

The index must not be modified while iterating; the results are undefined.

\n", + "group": "index", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_index_conflict_iterator_new-12" + ] + } + }, + "git_index_conflict_next": { + "type": "function", + "file": "git2/index.h", + "line": 832, + "lineto": 836, + "args": [ + { + "name": "ancestor_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the ancestor side of the conflict" + }, + { + "name": "our_out", + "type": "const git_index_entry **", + "comment": "Pointer to store our side of the conflict" + }, + { + "name": "their_out", + "type": "const git_index_entry **", + "comment": "Pointer to store their side of the conflict" + }, + { + "name": "iterator", + "type": "git_index_conflict_iterator *", + "comment": "The conflict iterator." + } + ], + "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index_conflict_iterator *iterator", + "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index_conflict_iterator *", + "return": { + "type": "int", + "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" + }, + "description": "

Returns the current conflict (ancestor, ours and theirs entry) and\n advance the iterator internally to the next value.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_index_conflict_next-13" + ] + } + }, + "git_index_conflict_iterator_free": { + "type": "function", + "file": "git2/index.h", + "line": 843, + "lineto": 844, + "args": [ + { + "name": "iterator", + "type": "git_index_conflict_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_index_conflict_iterator *iterator", + "sig": "git_index_conflict_iterator *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Frees a git_index_conflict_iterator.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_index_conflict_iterator_free-14" + ] + } + }, + "git_indexer_options_init": { + "type": "function", + "file": "git2/indexer.h", + "line": 99, + "lineto": 101, + "args": [ + { + "name": "opts", + "type": "git_indexer_options *", + "comment": "the `git_indexer_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION`" + } + ], + "argline": "git_indexer_options *opts, unsigned int version", + "sig": "git_indexer_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_indexer_options with default values. Equivalent to\n creating an instance with GIT_INDEXER_OPTIONS_INIT.

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_new": { + "type": "function", + "file": "git2/indexer.h", + "line": 131, + "lineto": 136, + "args": [ + { + "name": "out", + "type": "git_indexer **", + "comment": "where to store the indexer instance" + }, + { + "name": "path", + "type": "const char *", + "comment": "to the directory where the packfile should be stored" + }, + { + "name": "mode", + "type": "unsigned int", + "comment": "permissions to use creating packfile or 0 for defaults" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "object database from which to read base objects when\n fixing thin packs. Pass NULL if no thin pack is expected (an error\n will be returned if there are bases missing)" + }, + { + "name": "opts", + "type": "git_indexer_options *", + "comment": "Optional structure containing additional options. See\n `git_indexer_options` above." + } + ], + "argline": "git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_indexer_options *opts", + "sig": "git_indexer **::const char *::unsigned int::git_odb *::git_indexer_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Create a new indexer instance

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_append": { + "type": "function", + "file": "git2/indexer.h", + "line": 148, + "lineto": 148, + "args": [ + { + "name": "idx", + "type": "git_indexer *", + "comment": "the indexer" + }, + { + "name": "data", + "type": "const void *", + "comment": "the data to add" + }, + { + "name": "size", + "type": "size_t", + "comment": "the size of the data in bytes" + }, + { + "name": "stats", + "type": "git_indexer_progress *", + "comment": "stat storage" + } + ], + "argline": "git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats", + "sig": "git_indexer *::const void *::size_t::git_indexer_progress *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Add data to the indexer

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_commit": { + "type": "function", + "file": "git2/indexer.h", + "line": 159, + "lineto": 159, + "args": [ + { + "name": "idx", + "type": "git_indexer *", + "comment": "the indexer" + }, + { + "name": "stats", + "type": "git_indexer_progress *", + "comment": "Stat storage." + } + ], + "argline": "git_indexer *idx, git_indexer_progress *stats", + "sig": "git_indexer *::git_indexer_progress *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Finalize the pack and index

\n", + "comments": "

Resolve any pending deltas and write out the index file

\n", + "group": "indexer" + }, + "git_indexer_hash": { + "type": "function", + "file": "git2/indexer.h", + "line": 172, + "lineto": 172, + "args": [ + { + "name": "idx", + "type": "const git_indexer *", + "comment": "the indexer instance" + } + ], + "argline": "const git_indexer *idx", + "sig": "const git_indexer *", + "return": { + "type": "const git_oid *", + "comment": " the packfile's hash" + }, + "description": "

Get the packfile's hash

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the index has been finalized.

\n", + "group": "indexer" + }, + "git_indexer_name": { + "type": "function", + "file": "git2/indexer.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "idx", + "type": "const git_indexer *", + "comment": "the indexer instance" + } + ], + "argline": "const git_indexer *idx", + "sig": "const git_indexer *", + "return": { + "type": "const char *", + "comment": " a NUL terminated string for the packfile name" + }, + "description": "

Get the unique name for the resulting packfile.

\n", + "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the index has been finalized.

\n", + "group": "indexer" + }, + "git_indexer_free": { + "type": "function", + "file": "git2/indexer.h", + "line": 191, + "lineto": 191, + "args": [ + { + "name": "idx", + "type": "git_indexer *", + "comment": "the indexer to free" + } + ], + "argline": "git_indexer *idx", + "sig": "git_indexer *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the indexer and its resources

\n", + "comments": "", + "group": "indexer" + }, + "git_mailmap_new": { + "type": "function", + "file": "git2/mailmap.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + } + ], + "argline": "git_mailmap **out", + "sig": "git_mailmap **", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Allocate a new mailmap object.

\n", + "comments": "

This object is empty, so you'll have to add a mailmap file before you can do anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", + "group": "mailmap" + }, + "git_mailmap_free": { + "type": "function", + "file": "git2/mailmap.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "the mailmap to free" + } + ], + "argline": "git_mailmap *mm", + "sig": "git_mailmap *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the mailmap and its associated memory.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_add_entry": { + "type": "function", + "file": "git2/mailmap.h", + "line": 52, + "lineto": 54, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "mailmap to add the entry to" + }, + { + "name": "real_name", + "type": "const char *", + "comment": "the real name to use, or NULL" + }, + { + "name": "real_email", + "type": "const char *", + "comment": "the real email to use, or NULL" + }, + { + "name": "replace_name", + "type": "const char *", + "comment": "the name to replace, or NULL" + }, + { + "name": "replace_email", + "type": "const char *", + "comment": "the email to replace" + } + ], + "argline": "git_mailmap *mm, const char *real_name, const char *real_email, const char *replace_name, const char *replace_email", + "sig": "git_mailmap *::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Add a single entry to the given mailmap object. If the entry already exists,\n it will be replaced with the new entry.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_buffer": { + "type": "function", + "file": "git2/mailmap.h", + "line": 64, + "lineto": 65, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "buf", + "type": "const char *", + "comment": "buffer to parse the mailmap from" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the input buffer" + } + ], + "argline": "git_mailmap **out, const char *buf, size_t len", + "sig": "git_mailmap **::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Create a new mailmap instance containing a single mailmap file

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_repository": { + "type": "function", + "file": "git2/mailmap.h", + "line": 81, + "lineto": 82, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to load mailmap information from" + } + ], + "argline": "git_mailmap **out, git_repository *repo", + "sig": "git_mailmap **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Create a new mailmap instance from a repository, loading mailmap files based\n on the repository's configuration.

\n", + "comments": "

Mailmaps are loaded in the following order: 1. '.mailmap' in the root of the repository's working directory, if present. 2. The blob object identified by the 'mailmap.blob' config entry, if set. [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories] 3. The path in the 'mailmap.file' config entry, if set.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve": { + "type": "function", + "file": "git2/mailmap.h", + "line": 96, + "lineto": 98, + "args": [ + { + "name": "real_name", + "type": "const char **", + "comment": "pointer to store the real name" + }, + { + "name": "real_email", + "type": "const char **", + "comment": "pointer to store the real email" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "the mailmap to perform a lookup with (may be NULL)" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name to look up" + }, + { + "name": "email", + "type": "const char *", + "comment": "the email to look up" + } + ], + "argline": "const char **real_name, const char **real_email, const git_mailmap *mm, const char *name, const char *email", + "sig": "const char **::const char **::const git_mailmap *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Resolve a name and email to the corresponding real name and email.

\n", + "comments": "

The lifetime of the strings are tied to mm, name, and email parameters.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve_signature": { + "type": "function", + "file": "git2/mailmap.h", + "line": 110, + "lineto": 111, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "mailmap to resolve with" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to resolve" + } + ], + "argline": "git_signature **out, const git_mailmap *mm, const git_signature *sig", + "sig": "git_signature **::const git_mailmap *::const git_signature *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Resolve a signature to use real names and emails with a mailmap.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "mailmap" + }, + "git_merge_file_input_init": { + "type": "function", + "file": "git2/merge.h", + "line": 60, + "lineto": 62, + "args": [ + { + "name": "opts", + "type": "git_merge_file_input *", + "comment": "the `git_merge_file_input` instance to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "the version of the struct; you should pass\n `GIT_MERGE_FILE_INPUT_VERSION` here." + } + ], + "argline": "git_merge_file_input *opts, unsigned int version", + "sig": "git_merge_file_input *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_merge_file_input with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_INPUT_INIT.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file_options_init": { + "type": "function", + "file": "git2/merge.h", + "line": 233, + "lineto": 233, + "args": [ + { + "name": "opts", + "type": "git_merge_file_options *", + "comment": "The `git_merge_file_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_MERGE_FILE_OPTIONS_VERSION`." + } + ], + "argline": "git_merge_file_options *opts, unsigned int version", + "sig": "git_merge_file_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_merge_file_options structure

\n", + "comments": "

Initializes a git_merge_file_options with default values. Equivalent to creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", + "group": "merge" + }, + "git_merge_options_init": { + "type": "function", + "file": "git2/merge.h", + "line": 329, + "lineto": 329, + "args": [ + { + "name": "opts", + "type": "git_merge_options *", + "comment": "The `git_merge_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_MERGE_OPTIONS_VERSION`." + } + ], + "argline": "git_merge_options *opts, unsigned int version", + "sig": "git_merge_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_merge_options structure

\n", + "comments": "

Initializes a git_merge_options with default values. Equivalent to creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", + "group": "merge" + }, + "git_merge_analysis": { + "type": "function", + "file": "git2/merge.h", + "line": 399, + "lineto": 404, + "args": [ + { + "name": "analysis_out", + "type": "git_merge_analysis_t *", + "comment": "analysis enumeration that the result is written into" + }, + { + "name": "preference_out", + "type": "git_merge_preference_t *", + "comment": "One of the `git_merge_preference_t` flag." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + } + ], + "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len", + "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::const git_annotated_commit **::size_t", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into the HEAD of the repository.

\n", + "comments": "", + "group": "merge", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_merge_analysis-15" + ] + } + }, + "git_merge_analysis_for_ref": { + "type": "function", + "file": "git2/merge.h", + "line": 418, + "lineto": 424, + "args": [ + { + "name": "analysis_out", + "type": "git_merge_analysis_t *", + "comment": "analysis enumeration that the result is written into" + }, + { + "name": "preference_out", + "type": "git_merge_preference_t *", + "comment": "One of the `git_merge_preference_t` flag." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "our_ref", + "type": "git_reference *", + "comment": "the reference to perform the analysis from" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + } + ], + "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, git_reference *our_ref, const git_annotated_commit **their_heads, size_t their_heads_len", + "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::git_reference *::const git_annotated_commit **::size_t", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into a reference.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base": { + "type": "function", + "file": "git2/merge.h", + "line": 435, + "lineto": 439, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base between 'one' and 'two'" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "one", + "type": "const git_oid *", + "comment": "one of the commits" + }, + { + "name": "two", + "type": "const git_oid *", + "comment": "the other commit" + } + ], + "argline": "git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two", + "sig": "git_oid *::git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" + }, + "description": "

Find a merge base between two commits

\n", + "comments": "", + "group": "merge", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_merge_base-31" + ], + "rev-parse.c": [ + "ex/v1.7.2/rev-parse.html#git_merge_base-1" + ] + } + }, + "git_merge_bases": { + "type": "function", + "file": "git2/merge.h", + "line": 450, + "lineto": 454, + "args": [ + { + "name": "out", + "type": "git_oidarray *", + "comment": "array in which to store the resulting ids" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "one", + "type": "const git_oid *", + "comment": "one of the commits" + }, + { + "name": "two", + "type": "const git_oid *", + "comment": "the other commit" + } + ], + "argline": "git_oidarray *out, git_repository *repo, const git_oid *one, const git_oid *two", + "sig": "git_oidarray *::git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" + }, + "description": "

Find merge bases between two commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base_many": { + "type": "function", + "file": "git2/merge.h", + "line": 465, + "lineto": 469, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base considering all the commits" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oid *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find a merge base given a list of commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_bases_many": { + "type": "function", + "file": "git2/merge.h", + "line": 480, + "lineto": 484, + "args": [ + { + "name": "out", + "type": "git_oidarray *", + "comment": "array in which to store the resulting ids" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oidarray *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oidarray *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find all merge bases given a list of commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base_octopus": { + "type": "function", + "file": "git2/merge.h", + "line": 495, + "lineto": 499, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base considering all the commits" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oid *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find a merge base in preparation for an octopus merge

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file": { + "type": "function", + "file": "git2/merge.h", + "line": 517, + "lineto": 522, + "args": [ + { + "name": "out", + "type": "git_merge_file_result *", + "comment": "The git_merge_file_result to be filled in" + }, + { + "name": "ancestor", + "type": "const git_merge_file_input *", + "comment": "The contents of the ancestor file" + }, + { + "name": "ours", + "type": "const git_merge_file_input *", + "comment": "The contents of the file in \"our\" side" + }, + { + "name": "theirs", + "type": "const git_merge_file_input *", + "comment": "The contents of the file in \"their\" side" + }, + { + "name": "opts", + "type": "const git_merge_file_options *", + "comment": "The merge file options or `NULL` for defaults" + } + ], + "argline": "git_merge_file_result *out, const git_merge_file_input *ancestor, const git_merge_file_input *ours, const git_merge_file_input *theirs, const git_merge_file_options *opts", + "sig": "git_merge_file_result *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n", + "comments": "

Note that this function does not reference a repository and any configuration must be passed as git_merge_file_options.

\n", + "group": "merge" + }, + "git_merge_file_from_index": { + "type": "function", + "file": "git2/merge.h", + "line": 538, + "lineto": 544, + "args": [ + { + "name": "out", + "type": "git_merge_file_result *", + "comment": "The git_merge_file_result to be filled in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + }, + { + "name": "ancestor", + "type": "const git_index_entry *", + "comment": "The index entry for the ancestor file (stage level 1)" + }, + { + "name": "ours", + "type": "const git_index_entry *", + "comment": "The index entry for our file (stage level 2)" + }, + { + "name": "theirs", + "type": "const git_index_entry *", + "comment": "The index entry for their file (stage level 3)" + }, + { + "name": "opts", + "type": "const git_merge_file_options *", + "comment": "The merge file options or NULL" + } + ], + "argline": "git_merge_file_result *out, git_repository *repo, const git_index_entry *ancestor, const git_index_entry *ours, const git_index_entry *theirs, const git_merge_file_options *opts", + "sig": "git_merge_file_result *::git_repository *::const git_index_entry *::const git_index_entry *::const git_index_entry *::const git_merge_file_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Merge two files as they exist in the index, using the given common\n ancestor as the baseline, producing a git_merge_file_result that\n reflects the merge result. The git_merge_file_result must be freed with\n git_merge_file_result_free.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file_result_free": { + "type": "function", + "file": "git2/merge.h", + "line": 551, + "lineto": 551, + "args": [ + { + "name": "result", + "type": "git_merge_file_result *", + "comment": "The result to free or `NULL`" + } + ], + "argline": "git_merge_file_result *result", + "sig": "git_merge_file_result *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Frees a git_merge_file_result.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_trees": { + "type": "function", + "file": "git2/merge.h", + "line": 569, + "lineto": 575, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given trees" + }, + { + "name": "ancestor_tree", + "type": "const git_tree *", + "comment": "the common ancestor between the trees (or null if none)" + }, + { + "name": "our_tree", + "type": "const git_tree *", + "comment": "the tree that reflects the destination tree" + }, + { + "name": "their_tree", + "type": "const git_tree *", + "comment": "the tree to merge in to `our_tree`" + }, + { + "name": "opts", + "type": "const git_merge_options *", + "comment": "the merge tree options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, const git_tree *ancestor_tree, const git_tree *our_tree, const git_tree *their_tree, const git_merge_options *opts", + "sig": "git_index **::git_repository *::const git_tree *::const git_tree *::const git_tree *::const git_merge_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Merge two trees, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "merge" + }, + "git_merge_commits": { + "type": "function", + "file": "git2/merge.h", + "line": 592, + "lineto": 597, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given trees" + }, + { + "name": "our_commit", + "type": "const git_commit *", + "comment": "the commit that reflects the destination tree" + }, + { + "name": "their_commit", + "type": "const git_commit *", + "comment": "the commit to merge in to `our_commit`" + }, + { + "name": "opts", + "type": "const git_merge_options *", + "comment": "the merge tree options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, const git_commit *our_commit, const git_commit *their_commit, const git_merge_options *opts", + "sig": "git_index **::git_repository *::const git_commit *::const git_commit *::const git_merge_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Merge two commits, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "merge" + }, + "git_merge": { + "type": "function", + "file": "git2/merge.h", + "line": 617, + "lineto": 622, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + }, + { + "name": "merge_opts", + "type": "const git_merge_options *", + "comment": "merge options" + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": "checkout options" + } + ], + "argline": "git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len, const git_merge_options *merge_opts, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_annotated_commit **::size_t::const git_merge_options *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", + "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the user wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", + "group": "merge", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_merge-16" + ] + } + }, + "git_message_prettify": { + "type": "function", + "file": "git2/message.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The user-allocated git_buf which will be filled with the\n cleaned up message." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message to be prettified." + }, + { + "name": "strip_comments", + "type": "int", + "comment": "Non-zero to remove comment lines, 0 to leave them in." + }, + { + "name": "comment_char", + "type": "char", + "comment": "Comment character. Lines starting with this character\n are considered to be comments and removed if `strip_comments` is non-zero." + } + ], + "argline": "git_buf *out, const char *message, int strip_comments, char comment_char", + "sig": "git_buf *::const char *::int::char", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Clean up excess whitespace and make sure there is a trailing newline in the message.

\n", + "comments": "

Optionally, it can remove lines which start with the comment character.

\n", + "group": "message" + }, + "git_message_trailers": { + "type": "function", + "file": "git2/message.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "arr", + "type": "git_message_trailer_array *", + "comment": "A pre-allocated git_message_trailer_array struct to be filled in\n with any trailers found during parsing." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message to be parsed" + } + ], + "argline": "git_message_trailer_array *arr, const char *message", + "sig": "git_message_trailer_array *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or non-zero on error." + }, + "description": "

Parse trailers out of a message, filling the array pointed to by +arr+.

\n", + "comments": "

Trailers are key/value pairs in the last paragraph of a message, not including any patches or conflicts that may be present.

\n", + "group": "message" + }, + "git_message_trailer_array_free": { + "type": "function", + "file": "git2/message.h", + "line": 81, + "lineto": 81, + "args": [ + { + "name": "arr", + "type": "git_message_trailer_array *", + "comment": "The trailer to free." + } + ], + "argline": "git_message_trailer_array *arr", + "sig": "git_message_trailer_array *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Clean's up any allocated memory in the git_message_trailer_array filled by\n a call to git_message_trailers.

\n", + "comments": "", + "group": "message" + }, + "git_note_iterator_new": { + "type": "function", + "file": "git2/notes.h", + "line": 49, + "lineto": 52, + "args": [ + { + "name": "out", + "type": "git_note_iterator **", + "comment": "pointer to the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to look up the note" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" + } + ], + "argline": "git_note_iterator **out, git_repository *repo, const char *notes_ref", + "sig": "git_note_iterator **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Creates a new iterator for notes

\n", + "comments": "

The iterator must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_commit_iterator_new": { + "type": "function", + "file": "git2/notes.h", + "line": 64, + "lineto": 66, + "args": [ + { + "name": "out", + "type": "git_note_iterator **", + "comment": "pointer to the iterator" + }, + { + "name": "notes_commit", + "type": "git_commit *", + "comment": "a pointer to the notes commit object" + } + ], + "argline": "git_note_iterator **out, git_commit *notes_commit", + "sig": "git_note_iterator **::git_commit *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Creates a new iterator for notes from a commit

\n", + "comments": "

The iterator must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_iterator_free": { + "type": "function", + "file": "git2/notes.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "it", + "type": "git_note_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_note_iterator *it", + "sig": "git_note_iterator *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Frees an git_note_iterator

\n", + "comments": "", + "group": "note" + }, + "git_note_next": { + "type": "function", + "file": "git2/notes.h", + "line": 86, + "lineto": 89, + "args": [ + { + "name": "note_id", + "type": "git_oid *", + "comment": "id of blob containing the message" + }, + { + "name": "annotated_id", + "type": "git_oid *", + "comment": "id of the git object being annotated" + }, + { + "name": "it", + "type": "git_note_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_oid *note_id, git_oid *annotated_id, git_note_iterator *it", + "sig": "git_oid *::git_oid *::git_note_iterator *", + "return": { + "type": "int", + "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" + }, + "description": "

Return the current item (note_id and annotated_id) and advance the iterator\n internally to the next value

\n", + "comments": "", + "group": "note" + }, + "git_note_read": { + "type": "function", + "file": "git2/notes.h", + "line": 105, + "lineto": 109, + "args": [ + { + "name": "out", + "type": "git_note **", + "comment": "pointer to the read note; NULL in case of error" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to look up the note" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to read the note from" + } + ], + "argline": "git_note **out, git_repository *repo, const char *notes_ref, const git_oid *oid", + "sig": "git_note **::git_repository *::const char *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Read the note for an object

\n", + "comments": "

The note must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_commit_read": { + "type": "function", + "file": "git2/notes.h", + "line": 124, + "lineto": 128, + "args": [ + { + "name": "out", + "type": "git_note **", + "comment": "pointer to the read note; NULL in case of error" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to look up the note" + }, + { + "name": "notes_commit", + "type": "git_commit *", + "comment": "a pointer to the notes commit object" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to read the note from" + } + ], + "argline": "git_note **out, git_repository *repo, git_commit *notes_commit, const git_oid *oid", + "sig": "git_note **::git_repository *::git_commit *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Read the note for an object from a note commit

\n", + "comments": "

The note must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_author": { + "type": "function", + "file": "git2/notes.h", + "line": 136, + "lineto": 136, + "args": [ + { + "name": "note", + "type": "const git_note *", + "comment": "the note" + } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { + "type": "const git_signature *", + "comment": " the author" + }, + "description": "

Get the note author

\n", + "comments": "", + "group": "note" + }, + "git_note_committer": { + "type": "function", + "file": "git2/notes.h", + "line": 144, + "lineto": 144, + "args": [ + { + "name": "note", + "type": "const git_note *", + "comment": "the note" + } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { + "type": "const git_signature *", + "comment": " the committer" + }, + "description": "

Get the note committer

\n", + "comments": "", + "group": "note" + }, + "git_note_message": { + "type": "function", + "file": "git2/notes.h", + "line": 153, + "lineto": 153, + "args": [ + { + "name": "note", + "type": "const git_note *", + "comment": "the note" + } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { + "type": "const char *", + "comment": " the note message" + }, + "description": "

Get the note message

\n", + "comments": "", + "group": "note" + }, + "git_note_id": { + "type": "function", + "file": "git2/notes.h", + "line": 162, + "lineto": 162, + "args": [ + { + "name": "note", + "type": "const git_note *", + "comment": "the note" + } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { + "type": "const git_oid *", + "comment": " the note object's id" + }, + "description": "

Get the note object's id

\n", + "comments": "", + "group": "note" + }, + "git_note_create": { + "type": "function", + "file": "git2/notes.h", + "line": 179, + "lineto": 187, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the OID (optional); NULL in case of error" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to store the note" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to decorate" + }, + { + "name": "note", + "type": "const char *", + "comment": "Content of the note to add for object oid" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing note" + } + ], + "argline": "git_oid *out, git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int force", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *::const char *::int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add a note for an object

\n", + "comments": "", + "group": "note" + }, + "git_note_commit_create": { + "type": "function", + "file": "git2/notes.h", + "line": 209, + "lineto": 218, + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *", + "comment": "pointer to store the commit (optional);\n\t\t\t\t\tNULL in case of error" + }, + { + "name": "notes_blob_out", + "type": "git_oid *", + "comment": "a point to the id of a note blob (optional)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the note will live" + }, + { + "name": "parent", + "type": "git_commit *", + "comment": "Pointer to parent note\n\t\t\t\t\tor NULL if this shall start a new notes tree" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to decorate" + }, + { + "name": "note", + "type": "const char *", + "comment": "Content of the note to add for object oid" + }, + { + "name": "allow_note_overwrite", + "type": "int", + "comment": "Overwrite existing note" + } + ], + "argline": "git_oid *notes_commit_out, git_oid *notes_blob_out, git_repository *repo, git_commit *parent, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int allow_note_overwrite", + "sig": "git_oid *::git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *::const char *::int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add a note for an object from a commit

\n", + "comments": "

This function will create a notes commit for a given object, the commit is a dangling commit, no reference is created.

\n", + "group": "note" + }, + "git_note_remove": { + "type": "function", + "file": "git2/notes.h", + "line": 232, + "lineto": 237, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the note lives" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to remove the note from" + } + ], + "argline": "git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid", + "sig": "git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove the note for an object

\n", + "comments": "", + "group": "note" + }, + "git_note_commit_remove": { + "type": "function", + "file": "git2/notes.h", + "line": 257, + "lineto": 263, + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *", + "comment": "pointer to store the new notes commit (optional);\n\t\t\t\t\tNULL in case of error.\n\t\t\t\t\tWhen removing a note a new tree containing all notes\n\t\t\t\t\tsans the note to be removed is created and a new commit\n\t\t\t\t\tpointing to that tree is also created.\n\t\t\t\t\tIn the case where the resulting tree is an empty tree\n\t\t\t\t\ta new commit pointing to this empty tree will be returned." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the note lives" + }, + { + "name": "notes_commit", + "type": "git_commit *", + "comment": "a pointer to the notes commit object" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to remove the note from" + } + ], + "argline": "git_oid *notes_commit_out, git_repository *repo, git_commit *notes_commit, const git_signature *author, const git_signature *committer, const git_oid *oid", + "sig": "git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove the note for an object

\n", + "comments": "", + "group": "note" + }, + "git_note_free": { + "type": "function", + "file": "git2/notes.h", + "line": 270, + "lineto": 270, + "args": [ + { + "name": "note", + "type": "git_note *", + "comment": "git_note object" + } + ], + "argline": "git_note *note", + "sig": "git_note *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a git_note object

\n", + "comments": "", + "group": "note" + }, + "git_note_default_ref": { + "type": "function", + "file": "git2/notes.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer in which to store the name of the default notes reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The Git repository" + } + ], + "argline": "git_buf *out, git_repository *repo", + "sig": "git_buf *::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the default notes reference for a repository

\n", + "comments": "", + "group": "note" + }, + "git_note_foreach": { + "type": "function", + "file": "git2/notes.h", + "line": 298, + "lineto": 302, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the notes." + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "Reference to read from (optional); defaults to\n \"refs/notes/commits\"." + }, + { + "name": "note_cb", + "type": "git_note_foreach_cb", + "comment": "Callback to invoke per found annotation. Return non-zero\n to stop looping." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "git_repository *repo, const char *notes_ref, git_note_foreach_cb note_cb, void *payload", + "sig": "git_repository *::const char *::git_note_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the notes within a specified namespace\n and issue a callback for each one.

\n", + "comments": "", + "group": "note" + }, + "git_object_lookup": { + "type": "function", + "file": "git2/object.h", + "line": 44, + "lineto": 48, + "args": [ + { + "name": "object", + "type": "git_object **", + "comment": "pointer to the looked-up object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the unique identifier for the object" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "the type of the object" + } + ], + "argline": "git_object **object, git_repository *repo, const git_oid *id, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::git_object_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a reference to one of the objects in a repository.

\n", + "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", + "group": "object", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_object_lookup-32" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_object_lookup-17" + ] + } + }, + "git_object_lookup_prefix": { + "type": "function", + "file": "git2/object.h", + "line": 77, + "lineto": 82, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer where to store the looked-up object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "a short identifier for the object" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "the type of the object" + } + ], + "argline": "git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::size_t::git_object_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", + "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", + "group": "object" + }, + "git_object_lookup_bypath": { + "type": "function", + "file": "git2/object.h", + "line": 95, + "lineto": 99, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "buffer that receives a pointer to the object (which must be freed\n by the caller)" + }, + { + "name": "treeish", + "type": "const git_object *", + "comment": "root object that can be peeled to a tree" + }, + { + "name": "path", + "type": "const char *", + "comment": "relative path from the root object to the desired object" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of object desired" + } + ], + "argline": "git_object **out, const git_object *treeish, const char *path, git_object_t type", + "sig": "git_object **::const git_object *::const char *::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Lookup an object that represents a tree entry.

\n", + "comments": "", + "group": "object" + }, + "git_object_id": { + "type": "function", + "file": "git2/object.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "obj", + "type": "const git_object *", + "comment": "the repository object" + } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { + "type": "const git_oid *", + "comment": " the SHA1 id" + }, + "description": "

Get the id (SHA1) of a repository object

\n", + "comments": "", + "group": "object", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_object_id-8", + "ex/v1.7.2/blame.html#git_object_id-9", + "ex/v1.7.2/blame.html#git_object_id-10", + "ex/v1.7.2/blame.html#git_object_id-11" + ], + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_object_id-10", + "ex/v1.7.2/cat-file.html#git_object_id-11" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_object_id-33", + "ex/v1.7.2/log.html#git_object_id-34", + "ex/v1.7.2/log.html#git_object_id-35", + "ex/v1.7.2/log.html#git_object_id-36" + ], + "rev-parse.c": [ + "ex/v1.7.2/rev-parse.html#git_object_id-2", + "ex/v1.7.2/rev-parse.html#git_object_id-3", + "ex/v1.7.2/rev-parse.html#git_object_id-4", + "ex/v1.7.2/rev-parse.html#git_object_id-5", + "ex/v1.7.2/rev-parse.html#git_object_id-6" + ] + } + }, + "git_object_short_id": { + "type": "function", + "file": "git2/object.h", + "line": 121, + "lineto": 121, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to write string into" + }, + { + "name": "obj", + "type": "const git_object *", + "comment": "The object to get an ID for" + } + ], + "argline": "git_buf *out, const git_object *obj", + "sig": "git_buf *::const git_object *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 for error" + }, + "description": "

Get a short abbreviated OID string for the object

\n", + "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", + "group": "object", + "examples": { + "tag.c": [ + "ex/v1.7.2/tag.html#git_object_short_id-3" + ] + } + }, + "git_object_type": { + "type": "function", + "file": "git2/object.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "obj", + "type": "const git_object *", + "comment": "the repository object" + } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { + "type": "git_object_t", + "comment": " the object's type" + }, + "description": "

Get the object type of an object

\n", + "comments": "", + "group": "object", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_object_type-12", + "ex/v1.7.2/cat-file.html#git_object_type-13", + "ex/v1.7.2/cat-file.html#git_object_type-14" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_object_type-4" + ] + } + }, + "git_object_owner": { + "type": "function", + "file": "git2/object.h", + "line": 143, + "lineto": 143, + "args": [ + { + "name": "obj", + "type": "const git_object *", + "comment": "the object" + } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { + "type": "git_repository *", + "comment": " the repository who owns this object" + }, + "description": "

Get the repository that owns this object

\n", + "comments": "

Freeing or calling git_repository_close on the returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without affecting the object.

\n", + "group": "object" + }, + "git_object_free": { + "type": "function", + "file": "git2/object.h", + "line": 160, + "lineto": 160, + "args": [ + { + "name": "object", + "type": "git_object *", + "comment": "the object to close" + } + ], + "argline": "git_object *object", + "sig": "git_object *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an open object

\n", + "comments": "

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 aggressive is the caching mechanism used by the repository.

\n\n

IMPORTANT: It is necessary to call this method when you stop using an object. Failure to do so will cause a memory leak.

\n", + "group": "object", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_object_free-12", + "ex/v1.7.2/blame.html#git_object_free-13", + "ex/v1.7.2/blame.html#git_object_free-14", + "ex/v1.7.2/blame.html#git_object_free-15" + ], + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_object_free-15" + ], + "commit.c": [ + "ex/v1.7.2/commit.html#git_object_free-6" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_object_free-38" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_object_free-37" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_object_free-18" + ], + "rev-parse.c": [ + "ex/v1.7.2/rev-parse.html#git_object_free-7", + "ex/v1.7.2/rev-parse.html#git_object_free-8", + "ex/v1.7.2/rev-parse.html#git_object_free-9" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_object_free-5", + "ex/v1.7.2/tag.html#git_object_free-6", + "ex/v1.7.2/tag.html#git_object_free-7", + "ex/v1.7.2/tag.html#git_object_free-8" + ] + } + }, + "git_object_type2string": { + "type": "function", + "file": "git2/object.h", + "line": 171, + "lineto": 171, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to convert." + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "const char *", + "comment": " the corresponding string representation." + }, + "description": "

Convert an object type to its string representation.

\n", + "comments": "

The result is a pointer to a string in static memory and should not be free()'ed.

\n", + "group": "object", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_object_type2string-16", + "ex/v1.7.2/cat-file.html#git_object_type2string-17", + "ex/v1.7.2/cat-file.html#git_object_type2string-18", + "ex/v1.7.2/cat-file.html#git_object_type2string-19" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_object_type2string-39", + "ex/v1.7.2/general.html#git_object_type2string-40" + ] + } + }, + "git_object_string2type": { + "type": "function", + "file": "git2/object.h", + "line": 179, + "lineto": 179, + "args": [ + { + "name": "str", + "type": "const char *", + "comment": "the string to convert." + } + ], + "argline": "const char *str", + "sig": "const char *", + "return": { + "type": "git_object_t", + "comment": " the corresponding git_object_t." + }, + "description": "

Convert a string object type representation to it's git_object_t.

\n", + "comments": "", + "group": "object" + }, + "git_object_typeisloose": { + "type": "function", + "file": "git2/object.h", + "line": 188, + "lineto": 188, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to test." + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "int", + "comment": " true if the type represents a valid loose object type,\n false otherwise." + }, + "description": "

Determine if the given git_object_t is a valid loose object type.

\n", + "comments": "", + "group": "object" + }, + "git_object_peel": { + "type": "function", + "file": "git2/object.h", + "line": 213, + "lineto": 216, + "args": [ + { + "name": "peeled", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "object", + "type": "const git_object *", + "comment": "The object to be processed" + }, + { + "name": "target_type", + "type": "git_object_t", + "comment": "The type of the requested object (a GIT_OBJECT_ value)" + } + ], + "argline": "git_object **peeled, const git_object *object, git_object_t target_type", + "sig": "git_object **::const git_object *::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" + }, + "description": "

Recursively peel an object until an object of the specified type is met.

\n", + "comments": "

If the query cannot be satisfied due to the object model, GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until the type changes. A tag will be peeled until the referenced object is no longer a tag, and a commit will be peeled to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to the target type due to the object model, GIT_EPEEL will be returned.

\n\n

You must free the returned object.

\n", + "group": "object" + }, + "git_object_dup": { + "type": "function", + "file": "git2/object.h", + "line": 226, + "lineto": 226, + "args": [ + { + "name": "dest", + "type": "git_object **", + "comment": "Pointer to store the copy of the object" + }, + { + "name": "source", + "type": "git_object *", + "comment": "Original object to copy" + } + ], + "argline": "git_object **dest, git_object *source", + "sig": "git_object **::git_object *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create an in-memory copy of a Git object. The copy must be\n explicitly free'd or it will leak.

\n", + "comments": "", + "group": "object" + }, + "git_object_rawcontent_is_valid": { + "type": "function", + "file": "git2/object.h", + "line": 269, + "lineto": 273, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "Output pointer to set with validity of the object content" + }, + { + "name": "buf", + "type": "const char *", + "comment": "The contents to validate" + }, + { + "name": "len", + "type": "size_t", + "comment": "The length of the buffer" + }, + { + "name": "object_type", + "type": "git_object_t", + "comment": "The type of the object in the buffer" + } + ], + "argline": "int *valid, const char *buf, size_t len, git_object_t object_type", + "sig": "int *::const char *::size_t::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Analyzes a buffer of raw object content and determines its validity.\n Tree, commit, and tag objects will be parsed and ensured that they\n are valid, parseable content. (Blobs are always valid by definition.)\n An error message will be set with an informative message if the object\n is not valid.

\n", + "comments": "", + "group": "object" + }, + "git_odb_add_disk_alternate": { + "type": "function", + "file": "git2/odb.h", + "line": 118, + "lineto": 118, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to the objects folder for the alternate" + } + ], + "argline": "git_odb *odb, const char *path", + "sig": "git_odb *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add an on-disk alternate to an existing Object DB.

\n", + "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", + "group": "odb" + }, + "git_odb_free": { + "type": "function", + "file": "git2/odb.h", + "line": 125, + "lineto": 125, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database pointer to close. If NULL no action is taken." + } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an open object database.

\n", + "comments": "", + "group": "odb", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_odb_free-20" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_odb_free-41" + ] + } + }, + "git_odb_read": { + "type": "function", + "file": "git2/odb.h", + "line": 143, + "lineto": 143, + "args": [ + { + "name": "out", + "type": "git_odb_object **", + "comment": "pointer where to store the read object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the object to read." + } + ], + "argline": "git_odb_object **out, git_odb *db, const git_oid *id", + "sig": "git_odb_object **::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is\n not in the database." + }, + "description": "

Read an object from the database.

\n", + "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "group": "odb", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_odb_read-21" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_odb_read-42" + ] + } + }, + "git_odb_read_prefix": { + "type": "function", + "file": "git2/odb.h", + "line": 171, + "lineto": 171, + "args": [ + { + "name": "out", + "type": "git_odb_object **", + "comment": "pointer where to store the read object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "short_id", + "type": "const git_oid *", + "comment": "a prefix of the id of the object to read." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the prefix" + } + ], + "argline": "git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len", + "sig": "git_odb_object **::git_odb *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not in the\n database. GIT_EAMBIGUOUS if the prefix is ambiguous\n (several objects match the prefix)" + }, + "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", + "comments": "

This method queries all available ODB backends trying to match the 'len' first hexadecimal characters of the 'short_id'. The remaining (GIT_OID_SHA1_HEXSIZE-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.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "group": "odb" + }, + "git_odb_read_header": { + "type": "function", + "file": "git2/odb.h", + "line": 190, + "lineto": 190, + "args": [ + { + "name": "len_out", + "type": "size_t *", + "comment": "pointer where to store the length" + }, + { + "name": "type_out", + "type": "git_object_t *", + "comment": "pointer where to store the type" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the object to read." + } + ], + "argline": "size_t *len_out, git_object_t *type_out, git_odb *db, const git_oid *id", + "sig": "size_t *::git_object_t *::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not\n in the database." + }, + "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", + "comments": "

The header includes the length and the type of an object.

\n\n

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.

\n", + "group": "odb" + }, + "git_odb_exists": { + "type": "function", + "file": "git2/odb.h", + "line": 199, + "lineto": 199, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database to be searched for the given object." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the object to search for." + } + ], + "argline": "git_odb *db, const git_oid *id", + "sig": "git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 1 if the object was found, 0 otherwise" + }, + "description": "

Determine if the given object can be found in the object database.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_exists_ext": { + "type": "function", + "file": "git2/odb.h", + "line": 210, + "lineto": 210, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database to be searched for the given object." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the object to search for." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "flags affecting the lookup (see `git_odb_lookup_flags_t`)" + } + ], + "argline": "git_odb *db, const git_oid *id, unsigned int flags", + "sig": "git_odb *::const git_oid *::unsigned int", + "return": { + "type": "int", + "comment": " 1 if the object was found, 0 otherwise" + }, + "description": "

Determine if the given object can be found in the object database, with\n extended options.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_exists_prefix": { + "type": "function", + "file": "git2/odb.h", + "line": 223, + "lineto": 224, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "The full OID of the found object if just one is found." + }, + { + "name": "db", + "type": "git_odb *", + "comment": "The database to be searched for the given object." + }, + { + "name": "short_id", + "type": "const git_oid *", + "comment": "A prefix of the id of the object to read." + }, + { + "name": "len", + "type": "size_t", + "comment": "The length of the prefix." + } + ], + "argline": "git_oid *out, git_odb *db, const git_oid *short_id, size_t len", + "sig": "git_oid *::git_odb *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 if found, GIT_ENOTFOUND if not found, GIT_EAMBIGUOUS if multiple\n matches were found, other value \n<\n 0 if there was a read error." + }, + "description": "

Determine if an object can be found in the object database by an\n abbreviated object ID.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_expand_ids": { + "type": "function", + "file": "git2/odb.h", + "line": 266, + "lineto": 269, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "The database to be searched for the given objects." + }, + { + "name": "ids", + "type": "git_odb_expand_id *", + "comment": "An array of short object IDs to search for" + }, + { + "name": "count", + "type": "size_t", + "comment": "The length of the `ids` array" + } + ], + "argline": "git_odb *db, git_odb_expand_id *ids, size_t count", + "sig": "git_odb *::git_odb_expand_id *::size_t", + "return": { + "type": "int", + "comment": " 0 on success or an error code on failure" + }, + "description": "

Determine if one or more objects can be found in the object database\n by their abbreviated object ID and type.

\n", + "comments": "

The given array will be updated in place: for each abbreviated ID that is unique in the database, and of the given type (if specified), the full object ID, object ID length (GIT_OID_SHA1_HEXSIZE) and type will be written back to the array. For IDs that are not found (or are ambiguous), the array entry will be zeroed.

\n\n

Note that since this function operates on multiple objects, the underlying database will not be asked to be reloaded if an object is not found (which is unlike other object database operations.)

\n", + "group": "odb" + }, + "git_odb_refresh": { + "type": "function", + "file": "git2/odb.h", + "line": 289, + "lineto": 289, + "args": [ + { + "name": "db", + "type": "struct git_odb *", + "comment": "database to refresh" + } + ], + "argline": "struct git_odb *db", + "sig": "struct git_odb *", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Refresh the object database to load newly added files.

\n", + "comments": "

If the object databases have changed on disk while the library is running, this function will force a reload of the underlying indexes.

\n\n

Use this function when you're confident that an external application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The library will automatically attempt to refresh the ODB when a lookup fails, to see if the looked up object exists on disk but hasn't been loaded yet.

\n", + "group": "odb" + }, + "git_odb_foreach": { + "type": "function", + "file": "git2/odb.h", + "line": 304, + "lineto": 304, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database to use" + }, + { + "name": "cb", + "type": "git_odb_foreach_cb", + "comment": "the callback to call for each object" + }, + { + "name": "payload", + "type": "void *", + "comment": "data to pass to the callback" + } + ], + "argline": "git_odb *db, git_odb_foreach_cb cb, void *payload", + "sig": "git_odb *::git_odb_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

List all objects available in the database

\n", + "comments": "

The callback will be called for each object available in the database. Note that the objects are likely to be returned in the index order, which would make accessing the objects in that order inefficient. Return a non-zero value from the callback to stop looping.

\n", + "group": "odb" + }, + "git_odb_write": { + "type": "function", + "file": "git2/odb.h", + "line": 324, + "lineto": 324, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the OID result of the write" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "object database where to store the object" + }, + { + "name": "data", + "type": "const void *", + "comment": "buffer with the data to store" + }, + { + "name": "len", + "type": "size_t", + "comment": "size of the buffer" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of the data to store" + } + ], + "argline": "git_oid *out, git_odb *odb, const void *data, size_t len, git_object_t type", + "sig": "git_oid *::git_odb *::const void *::size_t::git_object_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Write an object directly into the ODB

\n", + "comments": "

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.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", + "group": "odb", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_odb_write-43" + ] + } + }, + "git_odb_open_wstream": { + "type": "function", + "file": "git2/odb.h", + "line": 347, + "lineto": 347, + "args": [ + { + "name": "out", + "type": "git_odb_stream **", + "comment": "pointer where to store the stream" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will write" + }, + { + "name": "size", + "type": "git_object_size_t", + "comment": "final size of the object that will be written" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of the object that will be written" + } + ], + "argline": "git_odb_stream **out, git_odb *db, git_object_size_t size, git_object_t type", + "sig": "git_odb_stream **::git_odb *::git_object_size_t::git_object_t", + "return": { + "type": "int", + "comment": " 0 if the stream was created; error code otherwise" + }, + "description": "

Open a stream to write an object into the ODB

\n", + "comments": "

The type and final length of the object must be specified when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it won't be effective until git_odb_stream_finalize_write is called and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or will leak memory.

\n", + "group": "odb" + }, + "git_odb_stream_write": { + "type": "function", + "file": "git2/odb.h", + "line": 360, + "lineto": 360, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the data to write" + }, + { + "name": "len", + "type": "size_t", + "comment": "the buffer's length" + } + ], + "argline": "git_odb_stream *stream, const char *buffer, size_t len", + "sig": "git_odb_stream *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 if the write succeeded, error code otherwise" + }, + "description": "

Write to an odb stream

\n", + "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", + "group": "odb" + }, + "git_odb_stream_finalize_write": { + "type": "function", + "file": "git2/odb.h", + "line": 375, + "lineto": 375, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the resulting object's id" + }, + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + } + ], + "argline": "git_oid *out, git_odb_stream *stream", + "sig": "git_oid *::git_odb_stream *", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise" + }, + "description": "

Finish writing to an odb stream

\n", + "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", + "group": "odb" + }, + "git_odb_stream_read": { + "type": "function", + "file": "git2/odb.h", + "line": 387, + "lineto": 387, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + }, + { + "name": "buffer", + "type": "char *", + "comment": "a user-allocated buffer to store the data in." + }, + { + "name": "len", + "type": "size_t", + "comment": "the buffer's length" + } + ], + "argline": "git_odb_stream *stream, char *buffer, size_t len", + "sig": "git_odb_stream *::char *::size_t", + "return": { + "type": "int", + "comment": " 0 if the read succeeded, error code otherwise" + }, + "description": "

Read from an odb stream

\n", + "comments": "

Most backends don't implement streaming reads

\n", + "group": "odb" + }, + "git_odb_stream_free": { + "type": "function", + "file": "git2/odb.h", + "line": 394, + "lineto": 394, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream to free" + } + ], + "argline": "git_odb_stream *stream", + "sig": "git_odb_stream *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free an odb stream

\n", + "comments": "", + "group": "odb" + }, + "git_odb_open_rstream": { + "type": "function", + "file": "git2/odb.h", + "line": 422, + "lineto": 427, + "args": [ + { + "name": "out", + "type": "git_odb_stream **", + "comment": "pointer where to store the stream" + }, + { + "name": "len", + "type": "size_t *", + "comment": "pointer where to store the length of the object" + }, + { + "name": "type", + "type": "git_object_t *", + "comment": "pointer where to store the type of the object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will read from" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "oid of the object the stream will read from" + } + ], + "argline": "git_odb_stream **out, size_t *len, git_object_t *type, git_odb *db, const git_oid *oid", + "sig": "git_odb_stream **::size_t *::git_object_t *::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the stream was created, error code otherwise" + }, + "description": "

Open a stream to read an object from the ODB

\n", + "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", + "group": "odb" + }, + "git_odb_write_pack": { + "type": "function", + "file": "git2/odb.h", + "line": 448, + "lineto": 452, + "args": [ + { + "name": "out", + "type": "git_odb_writepack **", + "comment": "pointer to the writepack functions" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will read from" + }, + { + "name": "progress_cb", + "type": "git_indexer_progress_cb", + "comment": "function to call with progress information.\n Be aware that this is called inline with network and indexing operations,\n so performance may be affected." + }, + { + "name": "progress_payload", + "type": "void *", + "comment": "payload for the progress callback" + } + ], + "argline": "git_odb_writepack **out, git_odb *db, git_indexer_progress_cb progress_cb, void *progress_payload", + "sig": "git_odb_writepack **::git_odb *::git_indexer_progress_cb::void *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Open a stream for writing a pack file to the ODB.

\n", + "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", + "group": "odb" + }, + "git_odb_write_multi_pack_index": { + "type": "function", + "file": "git2/odb.h", + "line": 466, + "lineto": 467, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the `multi-pack-index` file will be written." + } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Write a multi-pack-index file from all the .pack files in the ODB.

\n", + "comments": "

If the ODB layer understands pack files, then this will create a file called multi-pack-index next to the .pack and .idx files, which will contain an index of all objects stored in .pack files. This will allow for O(log n) lookup for n objects (regardless of how many packfiles there exist).

\n", + "group": "odb" + }, + "git_odb_object_dup": { + "type": "function", + "file": "git2/odb.h", + "line": 529, + "lineto": 529, + "args": [ + { + "name": "dest", + "type": "git_odb_object **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_odb_object *", + "comment": "object to copy" + } + ], + "argline": "git_odb_object **dest, git_odb_object *source", + "sig": "git_odb_object **::git_odb_object *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a copy of an odb_object

\n", + "comments": "

The returned copy must be manually freed with git_odb_object_free. Note that because of an implementation detail, the returned copy will be the same pointer as source: the object is internally refcounted, so the copy still needs to be freed twice.

\n", + "group": "odb" + }, + "git_odb_object_free": { + "type": "function", + "file": "git2/odb.h", + "line": 539, + "lineto": 539, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "object to close" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an ODB object

\n", + "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", + "group": "odb", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_odb_object_free-22" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_odb_object_free-44" + ] + } + }, + "git_odb_object_id": { + "type": "function", + "file": "git2/odb.h", + "line": 549, + "lineto": 549, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the OID" + }, + "description": "

Return the OID of an ODB object

\n", + "comments": "

This is the OID from which the object was read from

\n", + "group": "odb" + }, + "git_odb_object_data": { + "type": "function", + "file": "git2/odb.h", + "line": 562, + "lineto": 562, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "const void *", + "comment": " a pointer to the data" + }, + "description": "

Return the data of an ODB object

\n", + "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", + "group": "odb", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_odb_object_data-45" + ] + } + }, + "git_odb_object_size": { + "type": "function", + "file": "git2/odb.h", + "line": 573, + "lineto": 573, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "size_t", + "comment": " the size" + }, + "description": "

Return the size of an ODB object

\n", + "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", + "group": "odb", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_odb_object_size-23" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_odb_object_size-46" + ] + } + }, + "git_odb_object_type": { + "type": "function", + "file": "git2/odb.h", + "line": 581, + "lineto": 581, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "git_object_t", + "comment": " the type" + }, + "description": "

Return the type of an ODB object

\n", + "comments": "", + "group": "odb", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_odb_object_type-47" + ] + } + }, + "git_odb_add_backend": { + "type": "function", + "file": "git2/odb.h", + "line": 596, + "lineto": 596, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "backend", + "type": "git_odb_backend *", + "comment": "pointer to a git_odb_backend instance" + }, + { + "name": "priority", + "type": "int", + "comment": "Value for ordering the backends queue" + } + ], + "argline": "git_odb *odb, git_odb_backend *backend, int priority", + "sig": "git_odb *::git_odb_backend *::int", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add a custom backend to an existing Object DB

\n", + "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", + "group": "odb" + }, + "git_odb_add_alternate": { + "type": "function", + "file": "git2/odb.h", + "line": 617, + "lineto": 617, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "backend", + "type": "git_odb_backend *", + "comment": "pointer to a git_odb_backend instance" + }, + { + "name": "priority", + "type": "int", + "comment": "Value for ordering the backends queue" + } + ], + "argline": "git_odb *odb, git_odb_backend *backend, int priority", + "sig": "git_odb *::git_odb_backend *::int", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", + "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", + "group": "odb" + }, + "git_odb_num_backends": { + "type": "function", + "file": "git2/odb.h", + "line": 625, + "lineto": 625, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "object database" + } + ], + "argline": "git_odb *odb", + "sig": "git_odb *", + "return": { + "type": "size_t", + "comment": " number of backends in the ODB" + }, + "description": "

Get the number of ODB backend objects

\n", + "comments": "", + "group": "odb" + }, + "git_odb_get_backend": { + "type": "function", + "file": "git2/odb.h", + "line": 635, + "lineto": 635, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "output pointer to ODB backend at pos" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "object database" + }, + { + "name": "pos", + "type": "size_t", + "comment": "index into object database backend list" + } + ], + "argline": "git_odb_backend **out, git_odb *odb, size_t pos", + "sig": "git_odb_backend **::git_odb *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if pos is invalid, other errors \n<\n 0" + }, + "description": "

Lookup an ODB backend object by index

\n", + "comments": "", + "group": "odb" + }, + "git_odb_set_commit_graph": { + "type": "function", + "file": "git2/odb.h", + "line": 650, + "lineto": 650, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "object database" + }, + { + "name": "cgraph", + "type": "git_commit_graph *", + "comment": "the git commit-graph" + } + ], + "argline": "git_odb *odb, git_commit_graph *cgraph", + "sig": "git_odb *::git_commit_graph *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Set the git commit-graph for the ODB.

\n", + "comments": "

After a successful call, the ownership of the cgraph parameter will be transferred to libgit2, and the caller should not free it.

\n\n

The commit-graph can also be unset by explicitly passing NULL as the cgraph parameter.

\n", + "group": "odb" + }, + "git_oid_fmt": { + "type": "function", + "file": "git2/oid.h", + "line": 188, + "lineto": 188, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes for SHA1,\n\t\t64 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it is\n\t\trequired." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, const git_oid *id", + "sig": "char *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Format a git_oid into a hex string.

\n", + "comments": "", + "group": "oid", + "examples": { + "fetch.c": [ + "ex/v1.7.2/fetch.html#git_oid_fmt-1", + "ex/v1.7.2/fetch.html#git_oid_fmt-2" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_oid_fmt-48", + "ex/v1.7.2/general.html#git_oid_fmt-49", + "ex/v1.7.2/general.html#git_oid_fmt-50", + "ex/v1.7.2/general.html#git_oid_fmt-51", + "ex/v1.7.2/general.html#git_oid_fmt-52" + ], + "ls-remote.c": [ + "ex/v1.7.2/ls-remote.html#git_oid_fmt-1" + ] + } + }, + "git_oid_nfmt": { + "type": "function", + "file": "git2/oid.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; you say how many bytes to write.\n\t\tIf the number of bytes is > GIT_OID_SHA1_HEXSIZE, extra bytes\n\t\twill be zeroed; if not, a '\n\\\n0' terminator is NOT added." + }, + { + "name": "n", + "type": "size_t", + "comment": "number of characters to write into out string" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, size_t n, const git_oid *id", + "sig": "char *::size_t::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Format a git_oid into a partial hex string.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_pathfmt": { + "type": "function", + "file": "git2/oid.h", + "line": 217, + "lineto": 217, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (41 bytes for SHA1,\n\t\t65 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it\n\t\tis required." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, const git_oid *id", + "sig": "char *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Format a git_oid into a loose-object path string.

\n", + "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", + "group": "oid" + }, + "git_oid_tostr_s": { + "type": "function", + "file": "git2/oid.h", + "line": 230, + "lineto": 230, + "args": [ + { + "name": "oid", + "type": "const git_oid *", + "comment": "The oid structure to format" + } + ], + "argline": "const git_oid *oid", + "sig": "const git_oid *", + "return": { + "type": "char *", + "comment": " the c-string or NULL on failure" + }, + "description": "

Format a git_oid into a statically allocated c-string.

\n", + "comments": "

The c-string is owned by the library and should not be freed by the user. If libgit2 is built with thread support, the string will be stored in TLS (i.e. one buffer per thread) to allow for concurrent calls of the function.

\n", + "group": "oid", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_oid_tostr_s-19", + "ex/v1.7.2/merge.html#git_oid_tostr_s-20" + ] + } + }, + "git_oid_tostr": { + "type": "function", + "file": "git2/oid.h", + "line": 251, + "lineto": 251, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "the buffer into which the oid string is output." + }, + { + "name": "n", + "type": "size_t", + "comment": "the size of the out buffer." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the oid structure to format." + } + ], + "argline": "char *out, size_t n, const git_oid *id", + "sig": "char *::size_t::const git_oid *", + "return": { + "type": "char *", + "comment": " the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string." + }, + "description": "

Format a git_oid into a buffer as a hex format c-string.

\n", + "comments": "

If the buffer is smaller than the size of a hex-formatted oid string plus an additional byte (GIT_OID_SHA_HEXSIZE + 1 for SHA1 or GIT_OID_SHA256_HEXSIZE + 1 for SHA256), then the resulting oid c-string will be truncated to n-1 characters (but will still be NUL-byte terminated).

\n\n

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.

\n", + "group": "oid", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_oid_tostr-16", + "ex/v1.7.2/blame.html#git_oid_tostr-17" + ], + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_oid_tostr-24", + "ex/v1.7.2/cat-file.html#git_oid_tostr-25", + "ex/v1.7.2/cat-file.html#git_oid_tostr-26", + "ex/v1.7.2/cat-file.html#git_oid_tostr-27", + "ex/v1.7.2/cat-file.html#git_oid_tostr-28" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_oid_tostr-38", + "ex/v1.7.2/log.html#git_oid_tostr-39" + ], + "rev-parse.c": [ + "ex/v1.7.2/rev-parse.html#git_oid_tostr-10", + "ex/v1.7.2/rev-parse.html#git_oid_tostr-11", + "ex/v1.7.2/rev-parse.html#git_oid_tostr-12", + "ex/v1.7.2/rev-parse.html#git_oid_tostr-13" + ] + } + }, + "git_oid_cpy": { + "type": "function", + "file": "git2/oid.h", + "line": 260, + "lineto": 260, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "src", + "type": "const git_oid *", + "comment": "oid structure to copy from." + } + ], + "argline": "git_oid *out, const git_oid *src", + "sig": "git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Copy an oid from one structure to another.

\n", + "comments": "", + "group": "oid", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_oid_cpy-18", + "ex/v1.7.2/blame.html#git_oid_cpy-19", + "ex/v1.7.2/blame.html#git_oid_cpy-20" + ] + } + }, + "git_oid_cmp": { + "type": "function", + "file": "git2/oid.h", + "line": 269, + "lineto": 269, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + } + ], + "argline": "const git_oid *a, const git_oid *b", + "sig": "const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " \n<\n0, 0, >0 if a \n<\n b, a == b, a > b." + }, + "description": "

Compare two oid structures.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_equal": { + "type": "function", + "file": "git2/oid.h", + "line": 278, + "lineto": 278, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + } + ], + "argline": "const git_oid *a, const git_oid *b", + "sig": "const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " true if equal, false otherwise" + }, + "description": "

Compare two oid structures for equality

\n", + "comments": "", + "group": "oid" + }, + "git_oid_ncmp": { + "type": "function", + "file": "git2/oid.h", + "line": 289, + "lineto": 289, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + }, + { + "name": "len", + "type": "size_t", + "comment": "the number of hex chars to compare" + } + ], + "argline": "const git_oid *a, const git_oid *b, size_t len", + "sig": "const git_oid *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 in case of a match" + }, + "description": "

Compare the first 'len' hexadecimal characters (packets of 4 bits)\n of two oid structures.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_streq": { + "type": "function", + "file": "git2/oid.h", + "line": 298, + "lineto": 298, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of an object id." + } + ], + "argline": "const git_oid *id, const char *str", + "sig": "const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 in case of a match, -1 otherwise." + }, + "description": "

Check if an oid equals an hex formatted object id.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_strcmp": { + "type": "function", + "file": "git2/oid.h", + "line": 308, + "lineto": 308, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of an object id." + } + ], + "argline": "const git_oid *id, const char *str", + "sig": "const git_oid *::const char *", + "return": { + "type": "int", + "comment": " -1 if str is not valid, \n<\n0 if id sorts before str,\n 0 if id matches str, >0 if id sorts after str." + }, + "description": "

Compare an oid to an hex formatted object id.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_is_zero": { + "type": "function", + "file": "git2/oid.h", + "line": 315, + "lineto": 315, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": null + } + ], + "argline": "const git_oid *id", + "sig": "const git_oid *", + "return": { + "type": "int", + "comment": " 1 if all zeros, 0 otherwise." + }, + "description": "

Check is an oid is all zeros.

\n", + "comments": "", + "group": "oid", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_oid_is_zero-21" + ], + "fetch.c": [ + "ex/v1.7.2/fetch.html#git_oid_is_zero-3" + ] + } + }, + "git_oid_shorten_new": { + "type": "function", + "file": "git2/oid.h", + "line": 336, + "lineto": 336, + "args": [ + { + "name": "min_length", + "type": "size_t", + "comment": "The minimal length for all identifiers,\n\t\twhich will be used even if shorter OIDs would still\n\t\tbe unique." + } + ], + "argline": "size_t min_length", + "sig": "size_t", + "return": { + "type": "git_oid_shorten *", + "comment": " a `git_oid_shorten` instance, NULL if OOM" + }, + "description": "

Create a new OID shortener.

\n", + "comments": "

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.

\n\n

E.g. look at the result of git log --abbrev.

\n", + "group": "oid" + }, + "git_oid_shorten_add": { + "type": "function", + "file": "git2/oid.h", + "line": 362, + "lineto": 362, + "args": [ + { + "name": "os", + "type": "git_oid_shorten *", + "comment": "a `git_oid_shorten` instance" + }, + { + "name": "text_id", + "type": "const char *", + "comment": "an OID in text form" + } + ], + "argline": "git_oid_shorten *os, const char *text_id", + "sig": "git_oid_shorten *::const char *", + "return": { + "type": "int", + "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." + }, + "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", + "comments": "

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.

\n\n

For performance reasons, there is a hard-limit of how many OIDs can be added to a single set (around ~32000, assuming a mostly randomized distribution), which should be enough for any kind of program, and keeps the algorithm fast and memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a GIT_ERROR_INVALID error

\n", + "group": "oid" + }, + "git_oid_shorten_free": { + "type": "function", + "file": "git2/oid.h", + "line": 369, + "lineto": 369, + "args": [ + { + "name": "os", + "type": "git_oid_shorten *", + "comment": "a `git_oid_shorten` instance" + } + ], + "argline": "git_oid_shorten *os", + "sig": "git_oid_shorten *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free an OID shortener instance

\n", + "comments": "", + "group": "oid" + }, + "git_oidarray_dispose": { + "type": "function", + "file": "git2/oidarray.h", + "line": 31, + "lineto": 31, + "args": [ + { + "name": "array", + "type": "git_oidarray *", + "comment": "git_oidarray from which to free oid data" + } + ], + "argline": "git_oidarray *array", + "sig": "git_oidarray *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the object IDs contained in an oid_array. This method should\n be called on git_oidarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", + "comments": "

This does not free the git_oidarray itself, since the library will never allocate that object directly itself.

\n", + "group": "oidarray" + }, + "git_packbuilder_new": { + "type": "function", + "file": "git2/pack.h", + "line": 65, + "lineto": 65, + "args": [ + { + "name": "out", + "type": "git_packbuilder **", + "comment": "The new packbuilder object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + } + ], + "argline": "git_packbuilder **out, git_repository *repo", + "sig": "git_packbuilder **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Initialize a new packbuilder

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_set_threads": { + "type": "function", + "file": "git2/pack.h", + "line": 78, + "lineto": 78, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "n", + "type": "unsigned int", + "comment": "Number of threads to spawn" + } + ], + "argline": "git_packbuilder *pb, unsigned int n", + "sig": "git_packbuilder *::unsigned int", + "return": { + "type": "unsigned int", + "comment": " number of actual threads to be used" + }, + "description": "

Set number of threads to spawn

\n", + "comments": "

By default, libgit2 won't spawn any threads at all; when set to 0, libgit2 will autodetect the number of CPUs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert": { + "type": "function", + "file": "git2/pack.h", + "line": 92, + "lineto": 92, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the commit" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name; might be NULL" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id, const char *name", + "sig": "git_packbuilder *::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Insert a single object

\n", + "comments": "

For an optimal pack it's mandatory to insert objects in recency order, commits followed by trees and blobs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_tree": { + "type": "function", + "file": "git2/pack.h", + "line": 104, + "lineto": 104, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the root tree" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id", + "sig": "git_packbuilder *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Insert a root tree object

\n", + "comments": "

This will add the tree as well as all referenced trees and blobs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_commit": { + "type": "function", + "file": "git2/pack.h", + "line": 116, + "lineto": 116, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the commit" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id", + "sig": "git_packbuilder *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Insert a commit object

\n", + "comments": "

This will add a commit as well as the completed referenced tree.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_walk": { + "type": "function", + "file": "git2/pack.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revwalk to use to fill the packbuilder" + } + ], + "argline": "git_packbuilder *pb, git_revwalk *walk", + "sig": "git_packbuilder *::git_revwalk *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Insert objects as given by the walk

\n", + "comments": "

Those commits and all objects they reference will be inserted into the packbuilder.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_recur": { + "type": "function", + "file": "git2/pack.h", + "line": 141, + "lineto": 141, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the id of the root object to insert" + }, + { + "name": "name", + "type": "const char *", + "comment": "optional name for the object" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id, const char *name", + "sig": "git_packbuilder *::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Recursively insert an object and its referenced objects

\n", + "comments": "

Insert the object as well as any object it references.

\n", + "group": "packbuilder" + }, + "git_packbuilder_write_buf": { + "type": "function", + "file": "git2/pack.h", + "line": 153, + "lineto": 153, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "Buffer where to write the packfile" + }, + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + } + ], + "argline": "git_buf *buf, git_packbuilder *pb", + "sig": "git_buf *::git_packbuilder *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Write the contents of the packfile to an in-memory buffer

\n", + "comments": "

The contents of the buffer will become a valid packfile, even though there will be no attached index

\n", + "group": "packbuilder" + }, + "git_packbuilder_write": { + "type": "function", + "file": "git2/pack.h", + "line": 166, + "lineto": 171, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the directory where the packfile and index should be stored, or NULL for default location" + }, + { + "name": "mode", + "type": "unsigned int", + "comment": "permissions to use creating a packfile or 0 for defaults" + }, + { + "name": "progress_cb", + "type": "git_indexer_progress_cb", + "comment": "function to call with progress information from the indexer (optional)" + }, + { + "name": "progress_cb_payload", + "type": "void *", + "comment": "payload for the progress callback (optional)" + } + ], + "argline": "git_packbuilder *pb, const char *path, unsigned int mode, git_indexer_progress_cb progress_cb, void *progress_cb_payload", + "sig": "git_packbuilder *::const char *::unsigned int::git_indexer_progress_cb::void *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Write the new pack and corresponding index file to path.

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_hash": { + "type": "function", + "file": "git2/pack.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder object" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "const git_oid *", + "comment": " 0 or an error code" + }, + "description": "

Get the packfile's hash

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the packfile has been written.

\n", + "group": "packbuilder" + }, + "git_packbuilder_name": { + "type": "function", + "file": "git2/pack.h", + "line": 196, + "lineto": 196, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder instance" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "const char *", + "comment": " a NUL terminated string for the packfile name" + }, + "description": "

Get the unique name for the resulting packfile.

\n", + "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the packfile has been written.

\n", + "group": "packbuilder" + }, + "git_packbuilder_foreach": { + "type": "function", + "file": "git2/pack.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "cb", + "type": "git_packbuilder_foreach_cb", + "comment": "the callback to call with each packed object's buffer" + }, + { + "name": "payload", + "type": "void *", + "comment": "the callback's data" + } + ], + "argline": "git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload", + "sig": "git_packbuilder *::git_packbuilder_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create the new pack and pass each object to the callback

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_object_count": { + "type": "function", + "file": "git2/pack.h", + "line": 226, + "lineto": 226, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "size_t", + "comment": " the number of objects in the packfile" + }, + "description": "

Get the total number of objects the packbuilder will write out

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_written": { + "type": "function", + "file": "git2/pack.h", + "line": 234, + "lineto": 234, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "size_t", + "comment": " the number of objects which have already been written" + }, + "description": "

Get the number of objects the packbuilder has already written out

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_set_callbacks": { + "type": "function", + "file": "git2/pack.h", + "line": 253, + "lineto": 256, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder object" + }, + { + "name": "progress_cb", + "type": "git_packbuilder_progress", + "comment": "Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected." + }, + { + "name": "progress_cb_payload", + "type": "void *", + "comment": "Payload for progress callback." + } + ], + "argline": "git_packbuilder *pb, git_packbuilder_progress progress_cb, void *progress_cb_payload", + "sig": "git_packbuilder *::git_packbuilder_progress::void *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Set the callbacks for a packbuilder

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_free": { + "type": "function", + "file": "git2/pack.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the packbuilder and all associated data

\n", + "comments": "", + "group": "packbuilder" + }, + "git_patch_owner": { + "type": "function", + "file": "git2/patch.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "the patch" + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repository" + }, + "description": "

Get the repository associated with this patch. May be NULL.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_from_diff": { + "type": "function", + "file": "git2/patch.h", + "line": 59, + "lineto": 60, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "Output parameter for the delta patch object" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "Diff list object" + }, + { + "name": "idx", + "type": "size_t", + "comment": "Index into diff list" + } + ], + "argline": "git_patch **out, git_diff *diff, size_t idx", + "sig": "git_patch **::git_diff *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, other value \n<\n 0 on error" + }, + "description": "

Return a patch for an entry in the diff list.

\n", + "comments": "

The git_patch is a newly created object contains the text diffs for the delta. You have to call git_patch_free() when you are done with it. You can use the patch object to loop over all the hunks and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be created, the output will be set to NULL, and the binary flag will be set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass NULL for the git_patch, then the text diff will not be calculated.

\n", + "group": "patch" + }, + "git_patch_from_blobs": { + "type": "function", + "file": "git2/patch.h", + "line": 78, + "lineto": 84, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "new_blob", + "type": "const git_blob *", + "comment": "Blob for new side of diff, or NULL for empty blob" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat new blob as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *opts", + "sig": "git_patch **::const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between two blobs.

\n", + "comments": "

This is just like git_diff_blobs() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch" + }, + "git_patch_from_blob_and_buffer": { + "type": "function", + "file": "git2/patch.h", + "line": 103, + "lineto": 110, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "buffer_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const void *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *opts", + "sig": "git_patch **::const git_blob *::const char *::const void *::size_t::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between a blob and a buffer.

\n", + "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch" + }, + "git_patch_from_buffers": { + "type": "function", + "file": "git2/patch.h", + "line": 130, + "lineto": 138, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_buffer", + "type": "const void *", + "comment": "Raw data for old side of diff, or NULL for empty" + }, + { + "name": "old_len", + "type": "size_t", + "comment": "Length of the raw data for old side of the diff" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old buffer as if it had this filename; can be NULL" + }, + { + "name": "new_buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "new_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *opts", + "sig": "git_patch **::const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between two buffers.

\n", + "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_patch_from_buffers-16" + ] + } + }, + "git_patch_free": { + "type": "function", + "file": "git2/patch.h", + "line": 145, + "lineto": 145, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "The patch to free." + } + ], + "argline": "git_patch *patch", + "sig": "git_patch *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a git_patch object.

\n", + "comments": "", + "group": "patch", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_patch_free-17" + ] + } + }, + "git_patch_get_delta": { + "type": "function", + "file": "git2/patch.h", + "line": 154, + "lineto": 154, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The patch in which to get the delta." + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "const git_diff_delta *", + "comment": " The delta associated with the patch." + }, + "description": "

Get the delta associated with a patch. This delta points to internal\n data and you do not have to release it when you are done with it.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_num_hunks": { + "type": "function", + "file": "git2/patch.h", + "line": 162, + "lineto": 162, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The patch in which to get the number of hunks." + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "size_t", + "comment": " The number of hunks of the patch." + }, + "description": "

Get the number of hunks in a patch

\n", + "comments": "", + "group": "patch" + }, + "git_patch_line_stats": { + "type": "function", + "file": "git2/patch.h", + "line": 180, + "lineto": 184, + "args": [ + { + "name": "total_context", + "type": "size_t *", + "comment": "Count of context lines in output, can be NULL." + }, + { + "name": "total_additions", + "type": "size_t *", + "comment": "Count of addition lines in output, can be NULL." + }, + { + "name": "total_deletions", + "type": "size_t *", + "comment": "Count of deletion lines in output, can be NULL." + }, + { + "name": "patch", + "type": "const git_patch *", + "comment": "The git_patch object" + } + ], + "argline": "size_t *total_context, size_t *total_additions, size_t *total_deletions, const git_patch *patch", + "sig": "size_t *::size_t *::size_t *::const git_patch *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on error" + }, + "description": "

Get line counts of each type in a patch.

\n", + "comments": "

This helps imitate a diff --numstat type of output. For that purpose, you only need the total_additions and total_deletions values, but we include the total_context line count in case you want the total number of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", + "group": "patch" + }, + "git_patch_get_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 199, + "lineto": 203, + "args": [ + { + "name": "out", + "type": "const git_diff_hunk **", + "comment": "Output pointer to git_diff_hunk of hunk" + }, + { + "name": "lines_in_hunk", + "type": "size_t *", + "comment": "Output count of total lines in this hunk" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "Input pointer to patch object" + }, + { + "name": "hunk_idx", + "type": "size_t", + "comment": "Input index of hunk to get information about" + } + ], + "argline": "const git_diff_hunk **out, size_t *lines_in_hunk, git_patch *patch, size_t hunk_idx", + "sig": "const git_diff_hunk **::size_t *::git_patch *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error" + }, + "description": "

Get the information about a hunk in a patch

\n", + "comments": "

Given a patch and a hunk index into the patch, this returns detailed information about that hunk. Any of the output pointers can be passed as NULL if you don't care about that particular piece of information.

\n", + "group": "patch" + }, + "git_patch_num_lines_in_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 212, + "lineto": 214, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The git_patch object" + }, + { + "name": "hunk_idx", + "type": "size_t", + "comment": "Index of the hunk" + } + ], + "argline": "const git_patch *patch, size_t hunk_idx", + "sig": "const git_patch *::size_t", + "return": { + "type": "int", + "comment": " Number of lines in hunk or GIT_ENOTFOUND if invalid hunk index" + }, + "description": "

Get the number of lines in a hunk.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_get_line_in_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 230, + "lineto": 234, + "args": [ + { + "name": "out", + "type": "const git_diff_line **", + "comment": "The git_diff_line data for this line" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "The patch to look in" + }, + { + "name": "hunk_idx", + "type": "size_t", + "comment": "The index of the hunk" + }, + { + "name": "line_of_hunk", + "type": "size_t", + "comment": "The index of the line in the hunk" + } + ], + "argline": "const git_diff_line **out, git_patch *patch, size_t hunk_idx, size_t line_of_hunk", + "sig": "const git_diff_line **::git_patch *::size_t::size_t", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Get data about a line in a hunk of a patch.

\n", + "comments": "

Given a patch, a hunk index, and a line index in the hunk, this will return a lot of details about that line. If you pass a hunk index larger than the number of hunks or a line index larger than the number of lines in the hunk, this will return -1.

\n", + "group": "patch" + }, + "git_patch_size": { + "type": "function", + "file": "git2/patch.h", + "line": 252, + "lineto": 256, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + }, + { + "name": "include_context", + "type": "int", + "comment": "Include context lines in size if non-zero" + }, + { + "name": "include_hunk_headers", + "type": "int", + "comment": "Include hunk header lines if non-zero" + }, + { + "name": "include_file_headers", + "type": "int", + "comment": "Include file header lines if non-zero" + } + ], + "argline": "git_patch *patch, int include_context, int include_hunk_headers, int include_file_headers", + "sig": "git_patch *::int::int::int", + "return": { + "type": "size_t", + "comment": " The number of bytes of data" + }, + "description": "

Look up size of patch diff data in bytes

\n", + "comments": "

This returns the raw size of the patch data. This only includes the actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size of all of the diff output; if you pass it as false (zero), this will only include the actual changed lines (as if context_lines was 0).

\n", + "group": "patch" + }, + "git_patch_print": { + "type": "function", + "file": "git2/patch.h", + "line": 270, + "lineto": 273, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + }, + { + "name": "print_cb", + "type": "git_diff_line_cb", + "comment": "Callback function to output lines of the patch. Will be\n called for file headers, hunk headers, and diff lines." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callbacks." + } + ], + "argline": "git_patch *patch, git_diff_line_cb print_cb, void *payload", + "sig": "git_patch *::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Serialize the patch to text via callback.

\n", + "comments": "

Returning a non-zero value from the callback will terminate the iteration and return that value to the caller.

\n", + "group": "patch" + }, + "git_patch_to_buf": { + "type": "function", + "file": "git2/patch.h", + "line": 282, + "lineto": 284, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The git_buf to be filled in" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + } + ], + "argline": "git_buf *out, git_patch *patch", + "sig": "git_buf *::git_patch *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Get the content of a patch as a single diff text.

\n", + "comments": "", + "group": "patch", + "examples": { + "diff.c": [ + "ex/v1.7.2/diff.html#git_patch_to_buf-18" + ] + } + }, + "git_pathspec_new": { + "type": "function", + "file": "git2/pathspec.h", + "line": 82, + "lineto": 83, + "args": [ + { + "name": "out", + "type": "git_pathspec **", + "comment": "Output of the compiled pathspec" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "A git_strarray of the paths to match" + } + ], + "argline": "git_pathspec **out, const git_strarray *pathspec", + "sig": "git_pathspec **::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Compile a pathspec

\n", + "comments": "", + "group": "pathspec", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_pathspec_new-40" + ] + } + }, + "git_pathspec_free": { + "type": "function", + "file": "git2/pathspec.h", + "line": 90, + "lineto": 90, + "args": [ + { + "name": "ps", + "type": "git_pathspec *", + "comment": "The compiled pathspec" + } + ], + "argline": "git_pathspec *ps", + "sig": "git_pathspec *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a pathspec

\n", + "comments": "", + "group": "pathspec", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_pathspec_free-41" + ] + } + }, + "git_pathspec_matches_path": { + "type": "function", + "file": "git2/pathspec.h", + "line": 105, + "lineto": 106, + "args": [ + { + "name": "ps", + "type": "const git_pathspec *", + "comment": "The compiled pathspec" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "path", + "type": "const char *", + "comment": "The pathname to attempt to match" + } + ], + "argline": "const git_pathspec *ps, uint32_t flags, const char *path", + "sig": "const git_pathspec *::uint32_t::const char *", + "return": { + "type": "int", + "comment": " 1 is path matches spec, 0 if it does not" + }, + "description": "

Try to match a path against a pathspec

\n", + "comments": "

Unlike most of the other pathspec matching functions, this will not fall back on the native case-sensitivity for your platform. You must explicitly pass flags to control case sensitivity or else this will fall back on being case sensitive.

\n", + "group": "pathspec" + }, + "git_pathspec_match_workdir": { + "type": "function", + "file": "git2/pathspec.h", + "line": 130, + "lineto": 134, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which to match; bare repo is an error" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" + }, + "description": "

Match a pathspec against the working directory of a repository.

\n", + "comments": "

This matches the pathspec against the current files in the working directory of the repository. It is an error to invoke this on a bare repo. This handles git ignores (i.e. ignored files will not be considered to match the pathspec unless the file is tracked in the index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_index": { + "type": "function", + "file": "git2/pathspec.h", + "line": 159, + "lineto": 163, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to match against" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against entries in an index.

\n", + "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled by the current case-sensitivity of the index object itself and the USE_CASE and IGNORE_CASE flags will have no effect. This behavior will be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_tree": { + "type": "function", + "file": "git2/pathspec.h", + "line": 183, + "lineto": 187, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "tree", + "type": "git_tree *", + "comment": "The root-level tree to match against" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against files in a tree.

\n", + "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_pathspec_match_tree-42" + ] + } + }, + "git_pathspec_match_diff": { + "type": "function", + "file": "git2/pathspec.h", + "line": 207, + "lineto": 211, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A generated diff list" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against files in a diff list.

\n", + "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_free": { + "type": "function", + "file": "git2/pathspec.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "m", + "type": "git_pathspec_match_list *", + "comment": "The git_pathspec_match_list to be freed" + } + ], + "argline": "git_pathspec_match_list *m", + "sig": "git_pathspec_match_list *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free memory associates with a git_pathspec_match_list

\n", + "comments": "", + "group": "pathspec" + }, + "git_pathspec_match_list_entrycount": { + "type": "function", + "file": "git2/pathspec.h", + "line": 226, + "lineto": 227, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + } + ], + "argline": "const git_pathspec_match_list *m", + "sig": "const git_pathspec_match_list *", + "return": { + "type": "size_t", + "comment": " Number of items in match list" + }, + "description": "

Get the number of items in a match list.

\n", + "comments": "", + "group": "pathspec" + }, + "git_pathspec_match_list_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 239, + "lineto": 240, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the list" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const char *", + "comment": " The filename of the match" + }, + "description": "

Get a matching filename by position.

\n", + "comments": "

This routine cannot be used if the match list was generated by git_pathspec_match_diff. If so, it will always return NULL.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_diff_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 252, + "lineto": 253, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the list" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const git_diff_delta *", + "comment": " The filename of the match" + }, + "description": "

Get a matching diff delta by position.

\n", + "comments": "

This routine can only be used if the match list was generated by git_pathspec_match_diff. Otherwise it will always return NULL.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_failed_entrycount": { + "type": "function", + "file": "git2/pathspec.h", + "line": 264, + "lineto": 265, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + } + ], + "argline": "const git_pathspec_match_list *m", + "sig": "const git_pathspec_match_list *", + "return": { + "type": "size_t", + "comment": " Number of items in original pathspec that had no matches" + }, + "description": "

Get the number of pathspec items that did not match.

\n", + "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when generating the git_pathspec_match_list.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_failed_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 276, + "lineto": 277, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the failed items" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const char *", + "comment": " The pathspec pattern that didn't match anything" + }, + "description": "

Get an original pathspec string that had no matches.

\n", + "comments": "

This will be return NULL for positions out of range.

\n", + "group": "pathspec" + }, + "git_proxy_options_init": { + "type": "function", + "file": "git2/proxy.h", + "line": 94, + "lineto": 94, + "args": [ + { + "name": "opts", + "type": "git_proxy_options *", + "comment": "The `git_proxy_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_PROXY_OPTIONS_VERSION`." + } + ], + "argline": "git_proxy_options *opts, unsigned int version", + "sig": "git_proxy_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_proxy_options structure

\n", + "comments": "

Initializes a git_proxy_options with default values. Equivalent to creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", + "group": "proxy" + }, + "git_rebase_options_init": { + "type": "function", + "file": "git2/rebase.h", + "line": 199, + "lineto": 201, + "args": [ + { + "name": "opts", + "type": "git_rebase_options *", + "comment": "The `git_rebase_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REBASE_OPTIONS_VERSION`." + } + ], + "argline": "git_rebase_options *opts, unsigned int version", + "sig": "git_rebase_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_rebase_options structure

\n", + "comments": "

Initializes a git_rebase_options with default values. Equivalent to creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", + "group": "rebase" + }, + "git_rebase_init": { + "type": "function", + "file": "git2/rebase.h", + "line": 220, + "lineto": 226, + "args": [ + { + "name": "out", + "type": "git_rebase **", + "comment": "Pointer to store the rebase object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to perform the rebase" + }, + { + "name": "branch", + "type": "const git_annotated_commit *", + "comment": "The terminal commit to rebase, or NULL to rebase the\n current branch" + }, + { + "name": "upstream", + "type": "const git_annotated_commit *", + "comment": "The commit to begin rebasing from, or NULL to rebase all\n reachable commits" + }, + { + "name": "onto", + "type": "const git_annotated_commit *", + "comment": "The branch to rebase onto, or NULL to rebase onto the given\n upstream" + }, + { + "name": "opts", + "type": "const git_rebase_options *", + "comment": "Options to specify how rebase is performed, or NULL" + } + ], + "argline": "git_rebase **out, git_repository *repo, const git_annotated_commit *branch, const git_annotated_commit *upstream, const git_annotated_commit *onto, const git_rebase_options *opts", + "sig": "git_rebase **::git_repository *::const git_annotated_commit *::const git_annotated_commit *::const git_annotated_commit *::const git_rebase_options *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a rebase operation to rebase the changes in branch\n relative to upstream onto another branch. To begin the rebase\n process, call git_rebase_next. When you have finished with this\n object, call git_rebase_free.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_open": { + "type": "function", + "file": "git2/rebase.h", + "line": 237, + "lineto": 240, + "args": [ + { + "name": "out", + "type": "git_rebase **", + "comment": "Pointer to store the rebase object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository that has a rebase in-progress" + }, + { + "name": "opts", + "type": "const git_rebase_options *", + "comment": "Options to specify how rebase is performed" + } + ], + "argline": "git_rebase **out, git_repository *repo, const git_rebase_options *opts", + "sig": "git_rebase **::git_repository *::const git_rebase_options *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Opens an existing rebase that was previously started by either an\n invocation of git_rebase_init or by another client.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_orig_head_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 248, + "lineto": 248, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const char *", + "comment": " The original `HEAD` ref name" + }, + "description": "

Gets the original HEAD ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_orig_head_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 256, + "lineto": 256, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const git_oid *", + "comment": " The original `HEAD` id" + }, + "description": "

Gets the original HEAD id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 264, + "lineto": 264, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const char *", + "comment": " The `onto` ref name" + }, + "description": "

Gets the onto ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 272, + "lineto": 272, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const git_oid *", + "comment": " The `onto` id" + }, + "description": "

Gets the onto id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_entrycount": { + "type": "function", + "file": "git2/rebase.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "size_t", + "comment": " The number of rebase operations in total" + }, + "description": "

Gets the count of rebase operations that are to be applied.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_current": { + "type": "function", + "file": "git2/rebase.h", + "line": 291, + "lineto": 291, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "size_t", + "comment": " The index of the rebase operation currently being applied." + }, + "description": "

Gets the index of the rebase operation that is currently being applied.\n If the first operation has not yet been applied (because you have\n called init but not yet next) then this returns\n GIT_REBASE_NO_OPERATION.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_byindex": { + "type": "function", + "file": "git2/rebase.h", + "line": 300, + "lineto": 302, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + }, + { + "name": "idx", + "type": "size_t", + "comment": "The index of the rebase operation to retrieve" + } + ], + "argline": "git_rebase *rebase, size_t idx", + "sig": "git_rebase *::size_t", + "return": { + "type": "git_rebase_operation *", + "comment": " The rebase operation or NULL if `idx` was out of bounds" + }, + "description": "

Gets the rebase operation specified by the given index.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_next": { + "type": "function", + "file": "git2/rebase.h", + "line": 315, + "lineto": 317, + "args": [ + { + "name": "operation", + "type": "git_rebase_operation **", + "comment": "Pointer to store the rebase operation that is to be performed next" + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase in progress" + } + ], + "argline": "git_rebase_operation **operation, git_rebase *rebase", + "sig": "git_rebase_operation **::git_rebase *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Performs the next rebase operation and returns the information about it.\n If the operation is one that applies a patch (which is any operation except\n GIT_REBASE_OPERATION_EXEC) then the patch will be applied and the index and\n working directory will be updated with the changes. If there are conflicts,\n you will need to address those before committing the changes.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_inmemory_index": { + "type": "function", + "file": "git2/rebase.h", + "line": 334, + "lineto": 336, + "args": [ + { + "name": "index", + "type": "git_index **", + "comment": "The result index of the last operation." + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_index **index, git_rebase *rebase", + "sig": "git_index **::git_rebase *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Gets the index produced by the last operation, which is the result\n of git_rebase_next and which will be committed by the next\n invocation of git_rebase_commit. This is useful for resolving\n conflicts in an in-memory rebase before committing them. You must\n call git_index_free when you are finished with this.

\n", + "comments": "

This is only applicable for in-memory rebases; for rebases within a working directory, the changes were applied to the repository's index.

\n", + "group": "rebase" + }, + "git_rebase_commit": { + "type": "function", + "file": "git2/rebase.h", + "line": 360, + "lineto": 366, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "The author of the updated commit, or NULL to keep the\n author from the original commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "The committer of the rebase" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the commit,\n represented with a standard encoding name. If message is NULL,\n this should also be NULL, and the encoding from the original\n commit will be maintained. If message is specified, this may be\n NULL to indicate that \"UTF-8\" is to be used." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message for this commit, or NULL to use the message\n from the original commit." + } + ], + "argline": "git_oid *id, git_rebase *rebase, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message", + "sig": "git_oid *::git_rebase *::const git_signature *::const git_signature *::const char *::const char *", + "return": { + "type": "int", + "comment": " Zero on success, GIT_EUNMERGED if there are unmerged changes in\n the index, GIT_EAPPLIED if the current commit has already\n been applied to the upstream and there is nothing to commit,\n -1 on failure." + }, + "description": "

Commits the current patch. You must have resolved any conflicts that\n were introduced during the patch application from the git_rebase_next\n invocation.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_abort": { + "type": "function", + "file": "git2/rebase.h", + "line": 376, + "lineto": 376, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND if a rebase is not in progress,\n -1 on other errors." + }, + "description": "

Aborts a rebase that is currently in progress, resetting the repository\n and working directory to their state before rebase began.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_finish": { + "type": "function", + "file": "git2/rebase.h", + "line": 386, + "lineto": 388, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + }, + { + "name": "signature", + "type": "const git_signature *", + "comment": "The identity that is finishing the rebase (optional)" + } + ], + "argline": "git_rebase *rebase, const git_signature *signature", + "sig": "git_rebase *::const git_signature *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on error" + }, + "description": "

Finishes a rebase that is currently in progress once all patches have\n been applied.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_free": { + "type": "function", + "file": "git2/rebase.h", + "line": 395, + "lineto": 395, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase object" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Frees the git_rebase object.

\n", + "comments": "", + "group": "rebase" + }, + "git_refdb_new": { + "type": "function", + "file": "git2/refdb.h", + "line": 35, + "lineto": 35, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a new reference database with no backends.

\n", + "comments": "

Before the Ref DB can be used for read/writing, a custom database backend must be manually set using git_refdb_set_backend()

\n", + "group": "refdb" + }, + "git_refdb_open": { + "type": "function", + "file": "git2/refdb.h", + "line": 49, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a new reference database and automatically add\n the default backends:

\n", + "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs from disk, assuming the repository dir as the folder
  • \n
\n", + "group": "refdb" + }, + "git_refdb_compress": { + "type": "function", + "file": "git2/refdb.h", + "line": 59, + "lineto": 59, + "args": [ + { + "name": "refdb", + "type": "git_refdb *", + "comment": "The reference database to optimize." + } + ], + "argline": "git_refdb *refdb", + "sig": "git_refdb *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. For on-disk reference\n databases, for example, this may pack all loose references.

\n", + "comments": "", + "group": "refdb" + }, + "git_refdb_free": { + "type": "function", + "file": "git2/refdb.h", + "line": 66, + "lineto": 66, + "args": [ + { + "name": "refdb", + "type": "git_refdb *", + "comment": "reference database pointer or NULL" + } + ], + "argline": "git_refdb *refdb", + "sig": "git_refdb *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an open reference database.

\n", + "comments": "", + "group": "refdb" + }, + "git_reflog_read": { + "type": "function", + "file": "git2/reflog.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_reflog **", + "comment": "pointer to reflog" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "reference to look up" + } + ], + "argline": "git_reflog **out, git_repository *repo, const char *name", + "sig": "git_reflog **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Read the reflog for the given reference

\n", + "comments": "

If there is no reflog file for the given reference yet, an empty reflog object will be returned.

\n\n

The reflog must be freed manually by using git_reflog_free().

\n", + "group": "reflog" + }, + "git_reflog_write": { + "type": "function", + "file": "git2/reflog.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "an existing reflog object" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Write an existing in-memory reflog object back to disk\n using an atomic file lock.

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_append": { + "type": "function", + "file": "git2/reflog.h", + "line": 60, + "lineto": 60, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "an existing reflog object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the OID the reference is now pointing to" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "the signature of the committer" + }, + { + "name": "msg", + "type": "const char *", + "comment": "the reflog message" + } + ], + "argline": "git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg", + "sig": "git_reflog *::const git_oid *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add a new entry to the in-memory reflog.

\n", + "comments": "

msg is optional and can be NULL.

\n", + "group": "reflog" + }, + "git_reflog_rename": { + "type": "function", + "file": "git2/reflog.h", + "line": 75, + "lineto": 75, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "old_name", + "type": "const char *", + "comment": "the old name of the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "the new name of the reference" + } + ], + "argline": "git_repository *repo, const char *old_name, const char *name", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Rename a reflog

\n", + "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity. See git_reference_create_symbolic() for rules about valid names.

\n", + "group": "reflog" + }, + "git_reflog_delete": { + "type": "function", + "file": "git2/reflog.h", + "line": 84, + "lineto": 84, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "the reflog to delete" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Delete the reflog for the given reference

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entrycount": { + "type": "function", + "file": "git2/reflog.h", + "line": 92, + "lineto": 92, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "the previously loaded reflog" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { + "type": "size_t", + "comment": " the number of log entries" + }, + "description": "

Get the number of log entries in a reflog

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_byindex": { + "type": "function", + "file": "git2/reflog.h", + "line": 105, + "lineto": 105, + "args": [ + { + "name": "reflog", + "type": "const git_reflog *", + "comment": "a previously loaded reflog" + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position of the entry to lookup. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." + } + ], + "argline": "const git_reflog *reflog, size_t idx", + "sig": "const git_reflog *::size_t", + "return": { + "type": "const git_reflog_entry *", + "comment": " the entry; NULL if not found" + }, + "description": "

Lookup an entry by its index

\n", + "comments": "

Requesting the reflog entry with an index of 0 (zero) will return the most recently created entry.

\n", + "group": "reflog" + }, + "git_reflog_drop": { + "type": "function", + "file": "git2/reflog.h", + "line": 124, + "lineto": 127, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "a previously loaded reflog." + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position of the entry to remove. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." + }, + { + "name": "rewrite_previous_entry", + "type": "int", + "comment": "1 to rewrite the history; 0 otherwise." + } + ], + "argline": "git_reflog *reflog, size_t idx, int rewrite_previous_entry", + "sig": "git_reflog *::size_t::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code." + }, + "description": "

Remove an entry from the reflog by its index

\n", + "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry param value to 1. When deleting entry n, member old_oid of entry n-1 (if any) will be updated with the value of member new_oid of entry n+1.

\n", + "group": "reflog" + }, + "git_reflog_entry_id_old": { + "type": "function", + "file": "git2/reflog.h", + "line": 135, + "lineto": 135, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const git_oid *", + "comment": " the old oid" + }, + "description": "

Get the old oid

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_id_new": { + "type": "function", + "file": "git2/reflog.h", + "line": 143, + "lineto": 143, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const git_oid *", + "comment": " the new oid at this time" + }, + "description": "

Get the new oid

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_committer": { + "type": "function", + "file": "git2/reflog.h", + "line": 151, + "lineto": 151, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const git_signature *", + "comment": " the committer" + }, + "description": "

Get the committer of this entry

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_message": { + "type": "function", + "file": "git2/reflog.h", + "line": 159, + "lineto": 159, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const char *", + "comment": " the log msg" + }, + "description": "

Get the log message

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_free": { + "type": "function", + "file": "git2/reflog.h", + "line": 166, + "lineto": 166, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "reflog to free" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the reflog

\n", + "comments": "", + "group": "reflog" + }, + "git_reference_lookup": { + "type": "function", + "file": "git2/refs.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the looked-up reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name", + "sig": "git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Lookup a reference by name in a repository.

\n", + "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_reference_lookup-15", + "ex/v1.7.2/checkout.html#git_reference_lookup-16" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_reference_lookup-53" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_lookup-21" + ] + } + }, + "git_reference_name_to_id": { + "type": "function", + "file": "git2/refs.h", + "line": 54, + "lineto": 55, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer to oid to be filled in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which to look up the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "The long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" + } + ], + "argline": "git_oid *out, git_repository *repo, const char *name", + "sig": "git_oid *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Lookup a reference by name and resolve immediately to OID.

\n", + "comments": "

This function provides a quick way to resolve a reference name straight through to the object id that it refers to. This avoids having to allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference" + }, + "git_reference_dwim": { + "type": "function", + "file": "git2/refs.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer in which to store the reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "shorthand", + "type": "const char *", + "comment": "the short name for the reference" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *shorthand", + "sig": "git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a reference by DWIMing its short name

\n", + "comments": "

Apply the git precedence rules to the given shorthand to determine which reference the user is referring to.

\n", + "group": "reference", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_dwim-22" + ] + } + }, + "git_reference_symbolic_create_matching": { + "type": "function", + "file": "git2/refs.h", + "line": 112, + "lineto": 112, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The target of the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "current_value", + "type": "const char *", + "comment": "The expected value of the reference when updating" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *current_value, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" + }, + "description": "

Conditionally create a new symbolic reference.

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n\n

If current_value is all zeros, this function will return GIT_EMODIFIED if the ref already exists.

\n", + "group": "reference" + }, + "git_reference_symbolic_create": { + "type": "function", + "file": "git2/refs.h", + "line": 148, + "lineto": 148, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The target of the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new symbolic reference.

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference" + }, + "git_reference_create": { + "type": "function", + "file": "git2/refs.h", + "line": 185, + "lineto": 185, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The object id pointed to by the reference." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new direct reference.

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_create-23" + ] + } + }, + "git_reference_create_matching": { + "type": "function", + "file": "git2/refs.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The object id pointed to by the reference." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "current_id", + "type": "const git_oid *", + "comment": "The expected value of the reference at the time of update" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_oid *current_id, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Conditionally create new direct reference

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", + "group": "reference" + }, + "git_reference_target": { + "type": "function", + "file": "git2/refs.h", + "line": 243, + "lineto": 243, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the oid if available, NULL otherwise" + }, + "description": "

Get the OID pointed to by a direct reference.

\n", + "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", + "group": "reference", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_reference_target-54" + ] + } + }, + "git_reference_target_peel": { + "type": "function", + "file": "git2/refs.h", + "line": 254, + "lineto": 254, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the oid if available, NULL otherwise" + }, + "description": "

Return the peeled OID target of this reference.

\n", + "comments": "

This peeled OID only applies to direct references that point to a hard Tag object: it is the result of peeling such Tag.

\n", + "group": "reference" + }, + "git_reference_symbolic_target": { + "type": "function", + "file": "git2/refs.h", + "line": 264, + "lineto": 264, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " a pointer to the name if available, NULL otherwise" + }, + "description": "

Get full name to the reference pointed to by a symbolic reference.

\n", + "comments": "

Only available if the reference is symbolic.

\n", + "group": "reference", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_reference_symbolic_target-55" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_symbolic_target-24" + ] + } + }, + "git_reference_type": { + "type": "function", + "file": "git2/refs.h", + "line": 274, + "lineto": 274, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "git_reference_t", + "comment": " the type" + }, + "description": "

Get the type of a reference.

\n", + "comments": "

Either direct (GIT_REFERENCE_DIRECT) or symbolic (GIT_REFERENCE_SYMBOLIC)

\n", + "group": "reference", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_reference_type-56" + ] + } + }, + "git_reference_name": { + "type": "function", + "file": "git2/refs.h", + "line": 284, + "lineto": 284, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " the full name for the ref" + }, + "description": "

Get the full name of a reference.

\n", + "comments": "

See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_reference_name-17" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_name-25" + ] + } + }, + "git_reference_resolve": { + "type": "function", + "file": "git2/refs.h", + "line": 302, + "lineto": 302, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the peeled reference" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "git_reference **out, const git_reference *ref", + "sig": "git_reference **::const git_reference *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Resolve a symbolic reference to a direct reference.

\n", + "comments": "

This method iteratively peels a symbolic reference until it resolves to a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that reference is returned. This copy must be manually freed too.

\n", + "group": "reference" + }, + "git_reference_owner": { + "type": "function", + "file": "git2/refs.h", + "line": 310, + "lineto": 310, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repo" + }, + "description": "

Get the repository where a reference resides.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_symbolic_set_target": { + "type": "function", + "file": "git2/refs.h", + "line": 332, + "lineto": 336, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The new target for the reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_reference *ref, const char *target, const char *log_message", + "sig": "git_reference **::git_reference *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference" + }, + "git_reference_set_target": { + "type": "function", + "file": "git2/refs.h", + "line": 352, + "lineto": 356, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The new target OID for the reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_reference *ref, const git_oid *id, const char *log_message", + "sig": "git_reference **::git_reference *::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed since it was read, or an error code" + }, + "description": "

Conditionally create a new reference with the same name as the given reference but a\n different OID target. The reference must be a direct reference, otherwise\n this will fail.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n", + "group": "reference", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_set_target-26" + ] + } + }, + "git_reference_rename": { + "type": "function", + "file": "git2/refs.h", + "line": 381, + "lineto": 386, + "args": [ + { + "name": "new_ref", + "type": "git_reference **", + "comment": null + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference to rename" + }, + { + "name": "new_name", + "type": "const char *", + "comment": "The new name for the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite an existing reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **new_ref, git_reference *ref, const char *new_name, int force, const char *log_message", + "sig": "git_reference **::git_reference *::const char *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Rename an existing reference.

\n", + "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already a reference with the given name, the renaming will fail.

\n\n

IMPORTANT: The user needs to write a proper reflog entry if the reflog is enabled for the repository. We only rename the reflog if it exists.

\n", + "group": "reference" + }, + "git_reference_delete": { + "type": "function", + "file": "git2/refs.h", + "line": 401, + "lineto": 401, + "args": [ + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference to remove" + } + ], + "argline": "git_reference *ref", + "sig": "git_reference *", + "return": { + "type": "int", + "comment": " 0, GIT_EMODIFIED or an error code" + }, + "description": "

Delete an existing reference.

\n", + "comments": "

This method works for both direct and symbolic references. The reference will be immediately removed on disk but the memory will not be freed. Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed from the time it was looked up.

\n", + "group": "reference" + }, + "git_reference_remove": { + "type": "function", + "file": "git2/refs.h", + "line": 412, + "lineto": 412, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": null + }, + { + "name": "name", + "type": "const char *", + "comment": "The reference to remove" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Delete an existing reference by name

\n", + "comments": "

This method removes the named reference from the repository without looking at its old value.

\n", + "group": "reference" + }, + "git_reference_list": { + "type": "function", + "file": "git2/refs.h", + "line": 426, + "lineto": 426, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe reference names will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + } + ], + "argline": "git_strarray *array, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Fill a list with all the references that can be found in a repository.

\n", + "comments": "

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().

\n", + "group": "reference", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_reference_list-57" + ] + } + }, + "git_reference_foreach": { + "type": "function", + "file": "git2/refs.h", + "line": 466, + "lineto": 469, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "callback", + "type": "git_reference_foreach_cb", + "comment": "Function which will be called for every listed ref" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, git_reference_foreach_cb callback, void *payload", + "sig": "git_repository *::git_reference_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform a callback on each reference in the repository.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the reference object and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free on each reference passed to it.

\n", + "group": "reference" + }, + "git_reference_foreach_name": { + "type": "function", + "file": "git2/refs.h", + "line": 484, + "lineto": 487, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "callback", + "type": "git_reference_foreach_name_cb", + "comment": "Function which will be called for every listed ref name" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, git_reference_foreach_name_cb callback, void *payload", + "sig": "git_repository *::git_reference_foreach_name_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform a callback on the fully-qualified name of each reference.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the name of the reference and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n", + "group": "reference" + }, + "git_reference_dup": { + "type": "function", + "file": "git2/refs.h", + "line": 498, + "lineto": 498, + "args": [ + { + "name": "dest", + "type": "git_reference **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_reference *", + "comment": "object to copy" + } + ], + "argline": "git_reference **dest, git_reference *source", + "sig": "git_reference **::git_reference *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a copy of an existing reference.

\n", + "comments": "

Call git_reference_free to free the data.

\n", + "group": "reference" + }, + "git_reference_free": { + "type": "function", + "file": "git2/refs.h", + "line": 505, + "lineto": 505, + "args": [ + { + "name": "ref", + "type": "git_reference *", + "comment": "git_reference" + } + ], + "argline": "git_reference *ref", + "sig": "git_reference *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the given reference.

\n", + "comments": "", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_reference_free-18", + "ex/v1.7.2/checkout.html#git_reference_free-19", + "ex/v1.7.2/checkout.html#git_reference_free-20" + ], + "commit.c": [ + "ex/v1.7.2/commit.html#git_reference_free-7" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_reference_free-58" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_free-27", + "ex/v1.7.2/merge.html#git_reference_free-28", + "ex/v1.7.2/merge.html#git_reference_free-29" + ], + "status.c": [ + "ex/v1.7.2/status.html#git_reference_free-1" + ] + } + }, + "git_reference_cmp": { + "type": "function", + "file": "git2/refs.h", + "line": 514, + "lineto": 516, + "args": [ + { + "name": "ref1", + "type": "const git_reference *", + "comment": "The first git_reference" + }, + { + "name": "ref2", + "type": "const git_reference *", + "comment": "The second git_reference" + } + ], + "argline": "const git_reference *ref1, const git_reference *ref2", + "sig": "const git_reference *::const git_reference *", + "return": { + "type": "int", + "comment": " 0 if the same, else a stable but meaningless ordering." + }, + "description": "

Compare two references.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_iterator_new": { + "type": "function", + "file": "git2/refs.h", + "line": 525, + "lineto": 527, + "args": [ + { + "name": "out", + "type": "git_reference_iterator **", + "comment": "pointer in which to store the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_reference_iterator **out, git_repository *repo", + "sig": "git_reference_iterator **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create an iterator for the repo's references

\n", + "comments": "", + "group": "reference" + }, + "git_reference_iterator_glob_new": { + "type": "function", + "file": "git2/refs.h", + "line": 538, + "lineto": 541, + "args": [ + { + "name": "out", + "type": "git_reference_iterator **", + "comment": "pointer in which to store the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob to match against the reference names" + } + ], + "argline": "git_reference_iterator **out, git_repository *repo, const char *glob", + "sig": "git_reference_iterator **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create an iterator for the repo's references that match the\n specified glob

\n", + "comments": "", + "group": "reference" + }, + "git_reference_next": { + "type": "function", + "file": "git2/refs.h", + "line": 550, + "lineto": 550, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer in which to store the reference" + }, + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator" + } + ], + "argline": "git_reference **out, git_reference_iterator *iter", + "sig": "git_reference **::git_reference_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER if there are no more; or an error code" + }, + "description": "

Get the next reference

\n", + "comments": "", + "group": "reference" + }, + "git_reference_next_name": { + "type": "function", + "file": "git2/refs.h", + "line": 563, + "lineto": 563, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "pointer in which to store the string" + }, + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator" + } + ], + "argline": "const char **out, git_reference_iterator *iter", + "sig": "const char **::git_reference_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER if there are no more; or an error code" + }, + "description": "

Get the next reference's name

\n", + "comments": "

This function is provided for convenience in case only the names are interesting as it avoids the allocation of the git_reference object which git_reference_next() needs.

\n", + "group": "reference" + }, + "git_reference_iterator_free": { + "type": "function", + "file": "git2/refs.h", + "line": 570, + "lineto": 570, + "args": [ + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_reference_iterator *iter", + "sig": "git_reference_iterator *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the iterator and its associated resources

\n", + "comments": "", + "group": "reference" + }, + "git_reference_foreach_glob": { + "type": "function", + "file": "git2/refs.h", + "line": 590, + "lineto": 594, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "glob", + "type": "const char *", + "comment": "Pattern to match (fnmatch-style) against reference name." + }, + { + "name": "callback", + "type": "git_reference_foreach_name_cb", + "comment": "Function which will be called for every listed ref" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload", + "sig": "git_repository *::const char *::git_reference_foreach_name_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUSER on non-zero callback, or error code" + }, + "description": "

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n", + "comments": "

This function acts like git_reference_foreach() with an additional pattern match being applied to the reference name before issuing the callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches any sequence of letters, a '?' matches any letter, and square brackets can be used to define character ranges (such as "[0-9]" for digits).

\n", + "group": "reference" + }, + "git_reference_has_log": { + "type": "function", + "file": "git2/refs.h", + "line": 604, + "lineto": 604, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference's name" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 when no reflog can be found, 1 when it exists;\n otherwise an error code." + }, + "description": "

Check if a reflog exists for the specified reference.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_ensure_log": { + "type": "function", + "file": "git2/refs.h", + "line": 616, + "lineto": 616, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference's name" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Ensure there is a reflog for a particular reference.

\n", + "comments": "

Make sure that successive updates to the reference will append to its log.

\n", + "group": "reference" + }, + "git_reference_is_branch": { + "type": "function", + "file": "git2/refs.h", + "line": 626, + "lineto": 626, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/heads\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a local branch.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_is_remote": { + "type": "function", + "file": "git2/refs.h", + "line": 636, + "lineto": 636, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/remotes\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a remote tracking branch

\n", + "comments": "", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_reference_is_remote-21" + ] + } + }, + "git_reference_is_tag": { + "type": "function", + "file": "git2/refs.h", + "line": 646, + "lineto": 646, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/tags\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a tag

\n", + "comments": "", + "group": "reference" + }, + "git_reference_is_note": { + "type": "function", + "file": "git2/refs.h", + "line": 656, + "lineto": 656, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/notes\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a note

\n", + "comments": "", + "group": "reference" + }, + "git_reference_normalize_name": { + "type": "function", + "file": "git2/refs.h", + "line": 712, + "lineto": 716, + "args": [ + { + "name": "buffer_out", + "type": "char *", + "comment": "User allocated buffer to store normalized name" + }, + { + "name": "buffer_size", + "type": "size_t", + "comment": "Size of buffer_out" + }, + { + "name": "name", + "type": "const char *", + "comment": "Reference name to be checked." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "Flags to constrain name validation rules - see the\n GIT_REFERENCE_FORMAT constants above." + } + ], + "argline": "char *buffer_out, size_t buffer_size, const char *name, unsigned int flags", + "sig": "char *::size_t::const char *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code." + }, + "description": "

Normalize reference name and check validity.

\n", + "comments": "

This will normalize the reference name by removing any leading slash '/' characters and collapsing runs of adjacent slashes between name components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference" + }, + "git_reference_peel": { + "type": "function", + "file": "git2/refs.h", + "line": 733, + "lineto": 736, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference to be processed" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "The type of the requested object (GIT_OBJECT_COMMIT,\n GIT_OBJECT_TAG, GIT_OBJECT_TREE, GIT_OBJECT_BLOB or GIT_OBJECT_ANY)." + } + ], + "argline": "git_object **out, const git_reference *ref, git_object_t type", + "sig": "git_object **::const git_reference *::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" + }, + "description": "

Recursively peel reference until object of the specified type is found.

\n", + "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", + "group": "reference", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_reference_peel-30" + ] + } + }, + "git_reference_name_is_valid": { + "type": "function", + "file": "git2/refs.h", + "line": 753, + "lineto": 753, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given reference name" + }, + { + "name": "refname", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "int *valid, const char *refname", + "sig": "int *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Ensure the reference name is well-formed.

\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "group": "reference" + }, + "git_reference_shorthand": { + "type": "function", + "file": "git2/refs.h", + "line": 767, + "lineto": 767, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "a reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " the human-readable version of the name" + }, + "description": "

Get the reference's short name

\n", + "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", + "group": "reference", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_reference_shorthand-2" + ] + } + }, + "git_refspec_parse": { + "type": "function", + "file": "git2/refspec.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "refspec", + "type": "git_refspec **", + "comment": "a pointer to hold the refspec handle" + }, + { + "name": "input", + "type": "const char *", + "comment": "the refspec string" + }, + { + "name": "is_fetch", + "type": "int", + "comment": "is this a refspec for a fetch" + } + ], + "argline": "git_refspec **refspec, const char *input, int is_fetch", + "sig": "git_refspec **::const char *::int", + "return": { + "type": "int", + "comment": " 0 if the refspec string could be parsed, -1 otherwise" + }, + "description": "

Parse a given refspec string

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_free": { + "type": "function", + "file": "git2/refspec.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "refspec", + "type": "git_refspec *", + "comment": "the refspec object" + } + ], + "argline": "git_refspec *refspec", + "sig": "git_refspec *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a refspec object which has been created by git_refspec_parse

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_src": { + "type": "function", + "file": "git2/refspec.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's source specifier" + }, + "description": "

Get the source specifier

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_dst": { + "type": "function", + "file": "git2/refspec.h", + "line": 55, + "lineto": 55, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's destination specifier" + }, + "description": "

Get the destination specifier

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_string": { + "type": "function", + "file": "git2/refspec.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": null + }, + "description": "

Get the refspec's string

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_force": { + "type": "function", + "file": "git2/refspec.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "int", + "comment": " 1 if force update has been set, 0 otherwise" + }, + "description": "

Get the force update setting

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_direction": { + "type": "function", + "file": "git2/refspec.h", + "line": 79, + "lineto": 79, + "args": [ + { + "name": "spec", + "type": "const git_refspec *", + "comment": "refspec" + } + ], + "argline": "const git_refspec *spec", + "sig": "const git_refspec *", + "return": { + "type": "git_direction", + "comment": " GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + "description": "

Get the refspec's direction.

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_src_matches": { + "type": "function", + "file": "git2/refspec.h", + "line": 88, + "lineto": 88, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, + "description": "

Check if a refspec's source descriptor matches a reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_dst_matches": { + "type": "function", + "file": "git2/refspec.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, + "description": "

Check if a refspec's destination descriptor matches a reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_transform": { + "type": "function", + "file": "git2/refspec.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "where to store the target name" + }, + { + "name": "spec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the reference to transform" + } + ], + "argline": "git_buf *out, const git_refspec *spec, const char *name", + "sig": "git_buf *::const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EBUFS or another error" + }, + "description": "

Transform a reference to its target following the refspec's rules

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_rtransform": { + "type": "function", + "file": "git2/refspec.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "where to store the source reference name" + }, + { + "name": "spec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the reference to transform" + } + ], + "argline": "git_buf *out, const git_refspec *spec, const char *name", + "sig": "git_buf *::const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EBUFS or another error" + }, + "description": "

Transform a target reference to its source reference following the refspec's rules

\n", + "comments": "", + "group": "refspec" + }, + "git_remote_create": { + "type": "function", + "file": "git2/remote.h", + "line": 38, + "lineto": 42, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url", + "sig": "git_remote **::git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Add a remote with the default fetch refspec to the repository's configuration.

\n", + "comments": "", + "group": "remote", + "examples": { + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_create-1" + ] + } + }, + "git_remote_create_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 121, + "lineto": 123, + "args": [ + { + "name": "opts", + "type": "git_remote_create_options *", + "comment": "The `git_remote_create_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REMOTE_CREATE_OPTIONS_VERSION`." + } + ], + "argline": "git_remote_create_options *opts, unsigned int version", + "sig": "git_remote_create_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_remote_create_options structure

\n", + "comments": "

Initializes a git_remote_create_options with default values. Equivalent to creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", + "group": "remote" + }, + "git_remote_create_with_opts": { + "type": "function", + "file": "git2/remote.h", + "line": 137, + "lineto": 140, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "opts", + "type": "const git_remote_create_options *", + "comment": "the remote creation options" + } + ], + "argline": "git_remote **out, const char *url, const git_remote_create_options *opts", + "sig": "git_remote **::const char *::const git_remote_create_options *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Create a remote, with options.

\n", + "comments": "

This function allows more fine-grained control over the remote creation.

\n\n

Passing NULL as the opts argument will result in a detached remote.

\n", + "group": "remote" + }, + "git_remote_create_with_fetchspec": { + "type": "function", + "file": "git2/remote.h", + "line": 153, + "lineto": 158, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "fetch", + "type": "const char *", + "comment": "the remote fetch value" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch", + "sig": "git_remote **::git_repository *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Add a remote with the provided fetch refspec (or default if NULL) to the repository's\n configuration.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_create_anonymous": { + "type": "function", + "file": "git2/remote.h", + "line": 171, + "lineto": 174, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote objects" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the associated repository" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository's URL" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *url", + "sig": "git_remote **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create an anonymous remote

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", + "group": "remote", + "examples": { + "fetch.c": [ + "ex/v1.7.2/fetch.html#git_remote_create_anonymous-4" + ], + "ls-remote.c": [ + "ex/v1.7.2/ls-remote.html#git_remote_create_anonymous-2" + ] + } + }, + "git_remote_create_detached": { + "type": "function", + "file": "git2/remote.h", + "line": 190, + "lineto": 192, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote objects" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository's URL" + } + ], + "argline": "git_remote **out, const char *url", + "sig": "git_remote **::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a remote without a connected local repo

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote will not consider any repo configuration values (such as insteadof url substitutions).

\n", + "group": "remote" + }, + "git_remote_lookup": { + "type": "function", + "file": "git2/remote.h", + "line": 205, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the associated repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name", + "sig": "git_remote **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Get the information for a particular remote

\n", + "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "remote", + "examples": { + "fetch.c": [ + "ex/v1.7.2/fetch.html#git_remote_lookup-5" + ], + "ls-remote.c": [ + "ex/v1.7.2/ls-remote.html#git_remote_lookup-3" + ], + "push.c": [ + "ex/v1.7.2/push.html#git_remote_lookup-1" + ], + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_lookup-2" + ] + } + }, + "git_remote_dup": { + "type": "function", + "file": "git2/remote.h", + "line": 217, + "lineto": 217, + "args": [ + { + "name": "dest", + "type": "git_remote **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_remote *", + "comment": "object to copy" + } + ], + "argline": "git_remote **dest, git_remote *source", + "sig": "git_remote **::git_remote *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a copy of an existing remote. All internal strings are also\n duplicated. Callbacks are not duplicated.

\n", + "comments": "

Call git_remote_free to free the data.

\n", + "group": "remote" + }, + "git_remote_owner": { + "type": "function", + "file": "git2/remote.h", + "line": 225, + "lineto": 225, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repository" + }, + "description": "

Get the remote's repository

\n", + "comments": "", + "group": "remote" + }, + "git_remote_name": { + "type": "function", + "file": "git2/remote.h", + "line": 233, + "lineto": 233, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "const char *", + "comment": " a pointer to the name or NULL for in-memory remotes" + }, + "description": "

Get the remote's name

\n", + "comments": "", + "group": "remote" + }, + "git_remote_url": { + "type": "function", + "file": "git2/remote.h", + "line": 245, + "lineto": 245, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "const char *", + "comment": " a pointer to the url" + }, + "description": "

Get the remote's url

\n", + "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", + "group": "remote", + "examples": { + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_url-3" + ] + } + }, + "git_remote_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 257, + "lineto": 257, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "const char *", + "comment": " a pointer to the url or NULL if no special url for pushing is set" + }, + "description": "

Get the remote's url for pushing.

\n", + "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", + "group": "remote", + "examples": { + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_pushurl-4" + ] + } + }, + "git_remote_set_url": { + "type": "function", + "file": "git2/remote.h", + "line": 270, + "lineto": 270, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the url to set" + } + ], + "argline": "git_repository *repo, const char *remote, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error value" + }, + "description": "

Set the remote's url in the configuration

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "group": "remote", + "examples": { + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_set_url-5" + ] + } + }, + "git_remote_set_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 284, + "lineto": 284, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the url to set" + } + ], + "argline": "git_repository *repo, const char *remote, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, or an error code" + }, + "description": "

Set the remote's url for pushing in the configuration.

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "group": "remote", + "examples": { + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_set_pushurl-6" + ] + } + }, + "git_remote_set_instance_url": { + "type": "function", + "file": "git2/remote.h", + "line": 294, + "lineto": 294, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the url to set" + } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error value" + }, + "description": "

Set the url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_set_instance_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 304, + "lineto": 304, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the url to set" + } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error value" + }, + "description": "

Set the push url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_add_fetch": { + "type": "function", + "file": "git2/remote.h", + "line": 317, + "lineto": 317, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to change the configuration" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote to change" + }, + { + "name": "refspec", + "type": "const char *", + "comment": "the new fetch refspec" + } + ], + "argline": "git_repository *repo, const char *remote, const char *refspec", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" + }, + "description": "

Add a fetch refspec to the remote's configuration

\n", + "comments": "

Add the given refspec to the fetch list in the configuration. No loaded remote instances will be affected.

\n", + "group": "remote" + }, + "git_remote_get_fetch_refspecs": { + "type": "function", + "file": "git2/remote.h", + "line": 329, + "lineto": 329, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "pointer to the array in which to store the strings" + }, + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "git_strarray *array, const git_remote *remote", + "sig": "git_strarray *::const git_remote *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Get the remote's list of fetch refspecs

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "group": "remote" + }, + "git_remote_add_push": { + "type": "function", + "file": "git2/remote.h", + "line": 342, + "lineto": 342, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to change the configuration" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote to change" + }, + { + "name": "refspec", + "type": "const char *", + "comment": "the new push refspec" + } + ], + "argline": "git_repository *repo, const char *remote, const char *refspec", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" + }, + "description": "

Add a push refspec to the remote's configuration

\n", + "comments": "

Add the given refspec to the push list in the configuration. No loaded remote instances will be affected.

\n", + "group": "remote" + }, + "git_remote_get_push_refspecs": { + "type": "function", + "file": "git2/remote.h", + "line": 354, + "lineto": 354, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "pointer to the array in which to store the strings" + }, + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "git_strarray *array, const git_remote *remote", + "sig": "git_strarray *::const git_remote *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Get the remote's list of push refspecs

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "group": "remote" + }, + "git_remote_refspec_count": { + "type": "function", + "file": "git2/remote.h", + "line": 362, + "lineto": 362, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "size_t", + "comment": " the amount of refspecs configured in this remote" + }, + "description": "

Get the number of refspecs for a remote

\n", + "comments": "", + "group": "remote" + }, + "git_remote_get_refspec": { + "type": "function", + "file": "git2/remote.h", + "line": 371, + "lineto": 371, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + }, + { + "name": "n", + "type": "size_t", + "comment": "the refspec to get" + } + ], + "argline": "const git_remote *remote, size_t n", + "sig": "const git_remote *::size_t", + "return": { + "type": "const git_refspec *", + "comment": " the nth refspec" + }, + "description": "

Get a refspec from the remote

\n", + "comments": "", + "group": "remote" + }, + "git_remote_ls": { + "type": "function", + "file": "git2/remote.h", + "line": 393, + "lineto": 393, + "args": [ + { + "name": "out", + "type": "const git_remote_head ***", + "comment": "pointer to the array" + }, + { + "name": "size", + "type": "size_t *", + "comment": "the number of remote heads" + }, + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote_head ***out, size_t *size, git_remote *remote", + "sig": "const git_remote_head ***::size_t *::git_remote *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Get the remote repository's reference advertisement list

\n", + "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", + "group": "remote", + "examples": { + "ls-remote.c": [ + "ex/v1.7.2/ls-remote.html#git_remote_ls-4" + ] + } + }, + "git_remote_connected": { + "type": "function", + "file": "git2/remote.h", + "line": 404, + "lineto": 404, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "int", + "comment": " 1 if it's connected, 0 otherwise." + }, + "description": "

Check whether the remote is connected

\n", + "comments": "

Check whether the remote's underlying transport is connected to the remote host.

\n", + "group": "remote" + }, + "git_remote_stop": { + "type": "function", + "file": "git2/remote.h", + "line": 415, + "lineto": 415, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Cancel the operation

\n", + "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", + "group": "remote" + }, + "git_remote_disconnect": { + "type": "function", + "file": "git2/remote.h", + "line": 425, + "lineto": 425, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to disconnect from" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Disconnect from the remote

\n", + "comments": "

Close the connection to the remote.

\n", + "group": "remote" + }, + "git_remote_free": { + "type": "function", + "file": "git2/remote.h", + "line": 435, + "lineto": 435, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to free" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the memory associated with a remote

\n", + "comments": "

This also disconnects from the remote, if the connection has not been closed yet (using git_remote_disconnect).

\n", + "group": "remote", + "examples": { + "fetch.c": [ + "ex/v1.7.2/fetch.html#git_remote_free-6", + "ex/v1.7.2/fetch.html#git_remote_free-7" + ], + "ls-remote.c": [ + "ex/v1.7.2/ls-remote.html#git_remote_free-5" + ], + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_free-7" + ] + } + }, + "git_remote_list": { + "type": "function", + "file": "git2/remote.h", + "line": 446, + "lineto": 446, + "args": [ + { + "name": "out", + "type": "git_strarray *", + "comment": "a string array which receives the names of the remotes" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to query" + } + ], + "argline": "git_strarray *out, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get a list of the configured remotes for a repo

\n", + "comments": "

The string array must be freed by the user.

\n", + "group": "remote", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_remote_list-22" + ], + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_list-8" + ] + } + }, + "git_remote_init_callbacks": { + "type": "function", + "file": "git2/remote.h", + "line": 660, + "lineto": 662, + "args": [ + { + "name": "opts", + "type": "git_remote_callbacks *", + "comment": "the `git_remote_callbacks` struct to initialize" + }, + { + "name": "version", + "type": "unsigned int", + "comment": "Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION`" + } + ], + "argline": "git_remote_callbacks *opts, unsigned int version", + "sig": "git_remote_callbacks *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_remote_callbacks with default values. Equivalent to\n creating an instance with GIT_REMOTE_CALLBACKS_INIT.

\n", + "comments": "", + "group": "remote" + }, + "git_fetch_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 791, + "lineto": 793, + "args": [ + { + "name": "opts", + "type": "git_fetch_options *", + "comment": "The `git_fetch_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_FETCH_OPTIONS_VERSION`." + } + ], + "argline": "git_fetch_options *opts, unsigned int version", + "sig": "git_fetch_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_fetch_options structure

\n", + "comments": "

Initializes a git_fetch_options with default values. Equivalent to creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", + "group": "fetch" + }, + "git_push_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 848, + "lineto": 850, + "args": [ + { + "name": "opts", + "type": "git_push_options *", + "comment": "The `git_push_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_PUSH_OPTIONS_VERSION`." + } + ], + "argline": "git_push_options *opts, unsigned int version", + "sig": "git_push_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_push_options structure

\n", + "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", + "group": "push", + "examples": { + "push.c": [ + "ex/v1.7.2/push.html#git_push_options_init-2" + ] + } + }, + "git_remote_connect_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 896, + "lineto": 898, + "args": [ + { + "name": "opts", + "type": "git_remote_connect_options *", + "comment": "The `git_remote_connect_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REMOTE_CONNECT_OPTIONS_VERSION`." + } + ], + "argline": "git_remote_connect_options *opts, unsigned int version", + "sig": "git_remote_connect_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_remote_connect_options structure.

\n", + "comments": "

Initializes a git_remote_connect_options with default values. Equivalent to creating an instance with GIT_REMOTE_CONNECT_OPTIONS_INIT.

\n", + "group": "remote" + }, + "git_remote_connect": { + "type": "function", + "file": "git2/remote.h", + "line": 915, + "lineto": 920, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to connect to" + }, + { + "name": "direction", + "type": "git_direction", + "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "the callbacks to use for this connection" + }, + { + "name": "proxy_opts", + "type": "const git_proxy_options *", + "comment": "proxy settings" + }, + { + "name": "custom_headers", + "type": "const git_strarray *", + "comment": "extra HTTP headers to use in this connection" + } + ], + "argline": "git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_proxy_options *proxy_opts, const git_strarray *custom_headers", + "sig": "git_remote *::git_direction::const git_remote_callbacks *::const git_proxy_options *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Open a connection to a remote.

\n", + "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n", + "group": "remote", + "examples": { + "ls-remote.c": [ + "ex/v1.7.2/ls-remote.html#git_remote_connect-6" + ] + } + }, + "git_remote_connect_ext": { + "type": "function", + "file": "git2/remote.h", + "line": 940, + "lineto": 943, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to connect to" + }, + { + "name": "direction", + "type": "git_direction", + "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" + }, + { + "name": "opts", + "type": "const git_remote_connect_options *", + "comment": "the remote connection options" + } + ], + "argline": "git_remote *remote, git_direction direction, const git_remote_connect_options *opts", + "sig": "git_remote *::git_direction::const git_remote_connect_options *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Open a connection to a remote with extended options.

\n", + "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n\n

The given options structure will form the defaults for connection options and callback setup. Callers may override these defaults by specifying git_fetch_options or git_push_options in subsequent calls.

\n", + "group": "remote" + }, + "git_remote_download": { + "type": "function", + "file": "git2/remote.h", + "line": 965, + "lineto": 968, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this negotiation and\n download. Use NULL or an empty array to use the base refspecs" + }, + { + "name": "opts", + "type": "const git_fetch_options *", + "comment": "the options to use for this fetch or NULL" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts", + "sig": "git_remote *::const git_strarray *::const git_fetch_options *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Download and index the packfile.

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, download and index the packfile.

\n\n

The .idx file will be created and both it and the packfile with be renamed to their final name.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote" + }, + "git_remote_upload": { + "type": "function", + "file": "git2/remote.h", + "line": 987, + "lineto": 990, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this negotiation and\n upload. Use NULL or an empty array to use the base refspecs" + }, + { + "name": "opts", + "type": "const git_push_options *", + "comment": "the options to use for this push" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", + "sig": "git_remote *::const git_strarray *::const git_push_options *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a packfile and send it to the server

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, create a packfile with the missing objects and send it.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote" + }, + "git_remote_update_tips": { + "type": "function", + "file": "git2/remote.h", + "line": 1009, + "lineto": 1014, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to update" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "pointer to the callback structure to use or NULL" + }, + { + "name": "update_fetchhead", + "type": "int", + "comment": "whether to write to FETCH_HEAD. Pass 1 to behave like git." + }, + { + "name": "download_tags", + "type": "git_remote_autotag_option_t", + "comment": "what the behaviour for downloading tags is for this fetch. This is\n ignored for push. This must be the same value passed to `git_remote_download()`." + }, + { + "name": "reflog_message", + "type": "const char *", + "comment": "The message to insert into the reflogs. If\n NULL and fetching, the default is \"fetch \n\", where \n is\n the name of the remote (or its url, for in-memory remotes). This\n parameter is ignored when pushing." + } + ], + "argline": "git_remote *remote, const git_remote_callbacks *callbacks, int update_fetchhead, git_remote_autotag_option_t download_tags, const char *reflog_message", + "sig": "git_remote *::const git_remote_callbacks *::int::git_remote_autotag_option_t::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Update the tips to the new state.

\n", + "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", + "group": "remote" + }, + "git_remote_fetch": { + "type": "function", + "file": "git2/remote.h", + "line": 1034, + "lineto": 1038, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to fetch from" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this fetch. Pass NULL or an\n empty array to use the base refspecs." + }, + { + "name": "opts", + "type": "const git_fetch_options *", + "comment": "options to use for this fetch or NULL" + }, + { + "name": "reflog_message", + "type": "const char *", + "comment": "The message to insert into the reflogs. If NULL, the\n\t\t\t\t\t\t\t\t default is \"fetch\"" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts, const char *reflog_message", + "sig": "git_remote *::const git_strarray *::const git_fetch_options *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Download new data and update tips.

\n", + "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote", + "examples": { + "fetch.c": [ + "ex/v1.7.2/fetch.html#git_remote_fetch-8" + ] + } + }, + "git_remote_prune": { + "type": "function", + "file": "git2/remote.h", + "line": 1050, + "lineto": 1052, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to prune" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "callbacks to use for this prune" + } + ], + "argline": "git_remote *remote, const git_remote_callbacks *callbacks", + "sig": "git_remote *::const git_remote_callbacks *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Prune tracking refs that are no longer present on remote.

\n", + "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", + "group": "remote" + }, + "git_remote_push": { + "type": "function", + "file": "git2/remote.h", + "line": 1067, + "lineto": 1070, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to push to" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for pushing. If NULL or an empty\n array, the configured refspecs will be used" + }, + { + "name": "opts", + "type": "const git_push_options *", + "comment": "options to use for this push" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", + "sig": "git_remote *::const git_strarray *::const git_push_options *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Perform a push.

\n", + "comments": "

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote", + "examples": { + "push.c": [ + "ex/v1.7.2/push.html#git_remote_push-3" + ] + } + }, + "git_remote_stats": { + "type": "function", + "file": "git2/remote.h", + "line": 1075, + "lineto": 1075, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": null + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { + "type": "const git_indexer_progress *", + "comment": null + }, + "description": "

Get the statistics structure that is filled in by the fetch operation.

\n", + "comments": "", + "group": "remote", + "examples": { + "fetch.c": [ + "ex/v1.7.2/fetch.html#git_remote_stats-9" + ] + } + }, + "git_remote_autotag": { + "type": "function", + "file": "git2/remote.h", + "line": 1083, + "lineto": 1083, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "git_remote_autotag_option_t", + "comment": " the auto-follow setting" + }, + "description": "

Retrieve the tag auto-follow setting

\n", + "comments": "", + "group": "remote" + }, + "git_remote_set_autotag": { + "type": "function", + "file": "git2/remote.h", + "line": 1096, + "lineto": 1096, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to make the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote" + }, + { + "name": "value", + "type": "git_remote_autotag_option_t", + "comment": "the new value to take." + } + ], + "argline": "git_repository *repo, const char *remote, git_remote_autotag_option_t value", + "sig": "git_repository *::const char *::git_remote_autotag_option_t", + "return": { + "type": "int", + "comment": " 0, or an error code." + }, + "description": "

Set the remote's tag following setting.

\n", + "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", + "group": "remote" + }, + "git_remote_prune_refs": { + "type": "function", + "file": "git2/remote.h", + "line": 1104, + "lineto": 1104, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "int", + "comment": " the ref-prune setting" + }, + "description": "

Retrieve the ref-prune setting

\n", + "comments": "", + "group": "remote" + }, + "git_remote_rename": { + "type": "function", + "file": "git2/remote.h", + "line": 1126, + "lineto": 1130, + "args": [ + { + "name": "problems", + "type": "git_strarray *", + "comment": "non-default refspecs cannot be renamed and will be\n stored here for further processing by the caller. Always free this\n strarray on successful return." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to rename" + }, + { + "name": "name", + "type": "const char *", + "comment": "the current name of the remote" + }, + { + "name": "new_name", + "type": "const char *", + "comment": "the new name the remote should bear" + } + ], + "argline": "git_strarray *problems, git_repository *repo, const char *name, const char *new_name", + "sig": "git_strarray *::git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Give the remote a new name

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", + "group": "remote", + "examples": { + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_rename-9" + ] + } + }, + "git_remote_name_is_valid": { + "type": "function", + "file": "git2/remote.h", + "line": 1139, + "lineto": 1139, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given remote name" + }, + { + "name": "remote_name", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "int *valid, const char *remote_name", + "sig": "int *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Ensure the remote name is well-formed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_delete": { + "type": "function", + "file": "git2/remote.h", + "line": 1151, + "lineto": 1151, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to act" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the remote to delete" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code." + }, + "description": "

Delete an existing persisted remote.

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", + "group": "remote", + "examples": { + "remote.c": [ + "ex/v1.7.2/remote.html#git_remote_delete-10" + ] + } + }, + "git_remote_default_branch": { + "type": "function", + "file": "git2/remote.h", + "line": 1169, + "lineto": 1169, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer in which to store the reference name" + }, + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote" + } + ], + "argline": "git_buf *out, git_remote *remote", + "sig": "git_buf *::git_remote *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message." + }, + "description": "

Retrieve the name of the remote's default branch

\n", + "comments": "

The default branch of a repository is the branch which HEAD points to. If the remote does not support reporting this information directly, it performs the guess as git does; that is, if there are multiple branches which point to the same commit, the first one is chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", + "group": "remote" + }, + "git_repository_open": { + "type": "function", + "file": "git2/repository.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo which will be opened" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the repository" + } + ], + "argline": "git_repository **out, const char *path", + "sig": "git_repository **::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Open a git repository.

\n", + "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n", + "group": "repository", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_repository_open-59" + ] + } + }, + "git_repository_open_from_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 48, + "lineto": 48, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Output pointer containing opened repository" + }, + { + "name": "wt", + "type": "git_worktree *", + "comment": "Working tree to open" + } + ], + "argline": "git_repository **out, git_worktree *wt", + "sig": "git_repository **::git_worktree *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Open working tree as a repository

\n", + "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", + "group": "repository" + }, + "git_repository_discover": { + "type": "function", + "file": "git2/repository.h", + "line": 99, + "lineto": 103, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "A pointer to a user-allocated git_buf which will contain\n the found path." + }, + { + "name": "start_path", + "type": "const char *", + "comment": "The base path where the lookup starts." + }, + { + "name": "across_fs", + "type": "int", + "comment": "If true, then the lookup will not stop when a\n filesystem device change is detected while exploring parent directories." + }, + { + "name": "ceiling_dirs", + "type": "const char *", + "comment": "A GIT_PATH_LIST_SEPARATOR separated list of\n absolute symbolic link free paths. The lookup will stop when any\n of this paths is reached. Note that the lookup always performs on\n start_path no matter start_path appears in ceiling_dirs ceiling_dirs\n might be NULL (which is equivalent to an empty string)" + } + ], + "argline": "git_buf *out, const char *start_path, int across_fs, const char *ceiling_dirs", + "sig": "git_buf *::const char *::int::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", + "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n", + "group": "repository" + }, + "git_repository_open_ext": { + "type": "function", + "file": "git2/repository.h", + "line": 175, + "lineto": 179, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be opened. This can\n actually be NULL if you only want to use the error code to\n see if a repo at this path could be opened." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to open as git repository. If the flags\n permit \"searching\", then this can be a path to a subdirectory\n inside the working directory of the repository. May be NULL if\n flags is GIT_REPOSITORY_OPEN_FROM_ENV." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "A combination of the GIT_REPOSITORY_OPEN flags above." + }, + { + "name": "ceiling_dirs", + "type": "const char *", + "comment": "A GIT_PATH_LIST_SEPARATOR delimited list of path\n prefixes at which the search for a containing repository should\n terminate." + } + ], + "argline": "git_repository **out, const char *path, unsigned int flags, const char *ceiling_dirs", + "sig": "git_repository **::const char *::unsigned int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if no repository could be found,\n or -1 if there was a repository but open failed for some reason\n (such as repo corruption or system errors)." + }, + "description": "

Find and open a repository with extended controls.

\n", + "comments": "", + "group": "repository", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_repository_open_ext-43" + ] + } + }, + "git_repository_open_bare": { + "type": "function", + "file": "git2/repository.h", + "line": 192, + "lineto": 192, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be opened." + }, + { + "name": "bare_path", + "type": "const char *", + "comment": "Direct path to the bare repository" + } + ], + "argline": "git_repository **out, const char *bare_path", + "sig": "git_repository **::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Open a bare repository on the serverside.

\n", + "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n", + "group": "repository" + }, + "git_repository_free": { + "type": "function", + "file": "git2/repository.h", + "line": 205, + "lineto": 205, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository handle to close. If NULL nothing occurs." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a previously allocated repository

\n", + "comments": "

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_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", + "group": "repository", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_repository_free-60" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_repository_free-4" + ] + } + }, + "git_repository_init": { + "type": "function", + "file": "git2/repository.h", + "line": 222, + "lineto": 225, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo which will be created or reinitialized" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the repository" + }, + { + "name": "is_bare", + "type": "unsigned int", + "comment": "if true, a Git repository without a working directory is\n\t\tcreated at the pointed path. If false, provided path will be\n\t\tconsidered as the working directory into which the .git directory\n\t\twill be created." + } + ], + "argline": "git_repository **out, const char *path, unsigned int is_bare", + "sig": "git_repository **::const char *::unsigned int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Creates a new Git repository in the given folder.

\n", + "comments": "

TODO: - Reinit the repository

\n", + "group": "repository", + "examples": { + "init.c": [ + "ex/v1.7.2/init.html#git_repository_init-5" + ] + } + }, + "git_repository_init_options_init": { + "type": "function", + "file": "git2/repository.h", + "line": 388, + "lineto": 390, + "args": [ + { + "name": "opts", + "type": "git_repository_init_options *", + "comment": "The `git_repository_init_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`." + } + ], + "argline": "git_repository_init_options *opts, unsigned int version", + "sig": "git_repository_init_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_repository_init_options structure

\n", + "comments": "

Initializes a git_repository_init_options with default values. Equivalent to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", + "group": "repository" + }, + "git_repository_init_ext": { + "type": "function", + "file": "git2/repository.h", + "line": 405, + "lineto": 408, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be created or reinitialized." + }, + { + "name": "repo_path", + "type": "const char *", + "comment": "The path to the repository." + }, + { + "name": "opts", + "type": "git_repository_init_options *", + "comment": "Pointer to git_repository_init_options struct." + } + ], + "argline": "git_repository **out, const char *repo_path, git_repository_init_options *opts", + "sig": "git_repository **::const char *::git_repository_init_options *", + "return": { + "type": "int", + "comment": " 0 or an error code on failure." + }, + "description": "

Create a new Git repository in the given folder with extended controls.

\n", + "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n", + "group": "repository", + "examples": { + "init.c": [ + "ex/v1.7.2/init.html#git_repository_init_ext-6" + ] + } + }, + "git_repository_head": { + "type": "function", + "file": "git2/repository.h", + "line": 423, + "lineto": 423, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the reference which will be retrieved" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + } + ], + "argline": "git_reference **out, git_repository *repo", + "sig": "git_reference **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise" + }, + "description": "

Retrieve and resolve the reference pointed at by HEAD.

\n", + "comments": "

The returned git_reference will be owned by caller and git_reference_free() must be called when done with it to release the allocated memory and prevent a leak.

\n", + "group": "repository", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_repository_head-31", + "ex/v1.7.2/merge.html#git_repository_head-32" + ], + "status.c": [ + "ex/v1.7.2/status.html#git_repository_head-3" + ] + } + }, + "git_repository_head_for_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 433, + "lineto": 434, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the reference which will be retrieved" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the worktree to retrieve HEAD for" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name", + "sig": "git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 when successful, error-code otherwise" + }, + "description": "

Retrieve the referenced HEAD for the worktree

\n", + "comments": "", + "group": "repository" + }, + "git_repository_head_detached": { + "type": "function", + "file": "git2/repository.h", + "line": 446, + "lineto": 446, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if HEAD is detached, 0 if it's not; error code if there\n was an error." + }, + "description": "

Check if a repository's HEAD is detached

\n", + "comments": "

A repository's HEAD is detached when it points directly to a commit instead of a branch.

\n", + "group": "repository" + }, + "git_repository_head_detached_for_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 459, + "lineto": 460, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the worktree to retrieve HEAD for" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 1 if HEAD is detached, 0 if its not; error code if\n there was an error" + }, + "description": "

Check if a worktree's HEAD is detached

\n", + "comments": "

A worktree's HEAD is detached when it points directly to a commit instead of a branch.

\n", + "group": "repository" + }, + "git_repository_head_unborn": { + "type": "function", + "file": "git2/repository.h", + "line": 472, + "lineto": 472, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error" + }, + "description": "

Check if the current branch is unborn

\n", + "comments": "

An unborn 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.

\n", + "group": "repository" + }, + "git_repository_is_empty": { + "type": "function", + "file": "git2/repository.h", + "line": 486, + "lineto": 486, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted" + }, + "description": "

Check if a repository is empty

\n", + "comments": "

An empty repository has just been initialized and contains no references apart from HEAD, which must be pointing to the unborn master branch, or the branch specified for the repository in the init.defaultBranch configuration variable.

\n", + "group": "repository" + }, + "git_repository_item_path": { + "type": "function", + "file": "git2/repository.h", + "line": 523, + "lineto": 523, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to store the path at" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repository to get path for" + }, + { + "name": "item", + "type": "git_repository_item_t", + "comment": "The repository item for which to retrieve the path" + } + ], + "argline": "git_buf *out, const git_repository *repo, git_repository_item_t item", + "sig": "git_buf *::const git_repository *::git_repository_item_t", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the path cannot exist or an error code" + }, + "description": "

Get the location of a specific repository file or directory

\n", + "comments": "

This function will retrieve the path of a specific repository item. It will thereby honor things like the repository's common directory, gitdir, etc. In case a file path cannot exist for a given item (e.g. the working directory of a bare repository), GIT_ENOTFOUND is returned.

\n", + "group": "repository" + }, + "git_repository_path": { + "type": "function", + "file": "git2/repository.h", + "line": 534, + "lineto": 534, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the repository" + }, + "description": "

Get the path of this repository

\n", + "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", + "group": "repository", + "examples": { + "init.c": [ + "ex/v1.7.2/init.html#git_repository_path-7" + ], + "status.c": [ + "ex/v1.7.2/status.html#git_repository_path-4" + ] + } + }, + "git_repository_workdir": { + "type": "function", + "file": "git2/repository.h", + "line": 545, + "lineto": 545, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the working dir, if it exists" + }, + "description": "

Get the path of the working directory for this repository

\n", + "comments": "

If the repository is bare, this function will always return NULL.

\n", + "group": "repository", + "examples": { + "init.c": [ + "ex/v1.7.2/init.html#git_repository_workdir-8" + ] + } + }, + "git_repository_commondir": { + "type": "function", + "file": "git2/repository.h", + "line": 557, + "lineto": 557, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the common dir" + }, + "description": "

Get the path of the shared common directory for this repository.

\n", + "comments": "

If the repository is bare, it is the root directory for the repository. If the repository is a worktree, it is the parent repo's gitdir. Otherwise, it is the gitdir.

\n", + "group": "repository" + }, + "git_repository_set_workdir": { + "type": "function", + "file": "git2/repository.h", + "line": 576, + "lineto": 577, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "workdir", + "type": "const char *", + "comment": "The path to a working directory" + }, + { + "name": "update_gitlink", + "type": "int", + "comment": "Create/update gitlink in workdir and set config\n \"core.worktree\" (if workdir is not the parent of the .git directory)" + } + ], + "argline": "git_repository *repo, const char *workdir, int update_gitlink", + "sig": "git_repository *::const char *::int", + "return": { + "type": "int", + "comment": " 0, or an error code" + }, + "description": "

Set the path to the working directory for this repository

\n", + "comments": "

The working directory doesn't need to be the same one that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory will turn it into a normal repository, capable of performing all the common workdir operations (checkout, status, index manipulation, etc).

\n", + "group": "repository" + }, + "git_repository_is_bare": { + "type": "function", + "file": "git2/repository.h", + "line": 585, + "lineto": 585, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repo to test" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is bare, 0 otherwise." + }, + "description": "

Check if a repository is bare

\n", + "comments": "", + "group": "repository", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_repository_is_bare-5" + ] + } + }, + "git_repository_is_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 593, + "lineto": 593, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repo to test" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is a linked work tree, 0 otherwise." + }, + "description": "

Check if a repository is a linked work tree

\n", + "comments": "", + "group": "repository" + }, + "git_repository_config": { + "type": "function", + "file": "git2/repository.h", + "line": 609, + "lineto": 609, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the loaded configuration" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_config **out, git_repository *repo", + "sig": "git_config **::git_repository *", + "return": { + "type": "int", + "comment": " 0, or an error code" + }, + "description": "

Get the configuration file for this repository.

\n", + "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "config.c": [ + "ex/v1.7.2/config.html#git_repository_config-9" + ] + } + }, + "git_repository_config_snapshot": { + "type": "function", + "file": "git2/repository.h", + "line": 625, + "lineto": 625, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the loaded configuration" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_config **out, git_repository *repo", + "sig": "git_config **::git_repository *", + "return": { + "type": "int", + "comment": " 0, or an error code" + }, + "description": "

Get a snapshot of the repository's configuration

\n", + "comments": "

Convenience function to take a snapshot from the repository's configuration. The contents of this snapshot will not change, even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_repository_config_snapshot-61", + "ex/v1.7.2/general.html#git_repository_config_snapshot-62" + ] + } + }, + "git_repository_odb": { + "type": "function", + "file": "git2/repository.h", + "line": 641, + "lineto": 641, + "args": [ + { + "name": "out", + "type": "git_odb **", + "comment": "Pointer to store the loaded ODB" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_odb **out, git_repository *repo", + "sig": "git_odb **::git_repository *", + "return": { + "type": "int", + "comment": " 0, or an error code" + }, + "description": "

Get the Object Database for this repository.

\n", + "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_repository_odb-29" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_repository_odb-63" + ] + } + }, + "git_repository_refdb": { + "type": "function", + "file": "git2/repository.h", + "line": 657, + "lineto": 657, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "Pointer to store the loaded refdb" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { + "type": "int", + "comment": " 0, or an error code" + }, + "description": "

Get the Reference Database Backend for this repository.

\n", + "comments": "

If a custom refsdb has not been set, the default database for the repository will be returned (the one that manipulates loose and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by the user.

\n", + "group": "repository" + }, + "git_repository_index": { + "type": "function", + "file": "git2/repository.h", + "line": 673, + "lineto": 673, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "Pointer to store the loaded index" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_index **out, git_repository *repo", + "sig": "git_index **::git_repository *", + "return": { + "type": "int", + "comment": " 0, or an error code" + }, + "description": "

Get the Index file for this repository.

\n", + "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "add.c": [ + "ex/v1.7.2/add.html#git_repository_index-5" + ], + "commit.c": [ + "ex/v1.7.2/commit.html#git_repository_index-8" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_repository_index-64" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_repository_index-9" + ], + "ls-files.c": [ + "ex/v1.7.2/ls-files.html#git_repository_index-5" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_repository_index-33" + ] + } + }, + "git_repository_message": { + "type": "function", + "file": "git2/repository.h", + "line": 691, + "lineto": 691, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "git_buf to write data into" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to read prepared message from" + } + ], + "argline": "git_buf *out, git_repository *repo", + "sig": "git_buf *::git_repository *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if no message exists or an error code" + }, + "description": "

Retrieve git's prepared message

\n", + "comments": "

Operations such as git revert/cherry-pick/merge with the -n option stop just short of creating a commit with the changes and save their prepared message in .git/MERGE_MSG so the next git-commit execution can present it to the user for them to amend if they wish.

\n\n

Use this function to get the contents of this file. Don't forget to remove the file after you create the commit.

\n", + "group": "repository" + }, + "git_repository_message_remove": { + "type": "function", + "file": "git2/repository.h", + "line": 701, + "lineto": 701, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to remove prepared message from." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Remove git's prepared message.

\n", + "comments": "

Remove the message that git_repository_message retrieves.

\n", + "group": "repository" + }, + "git_repository_state_cleanup": { + "type": "function", + "file": "git2/repository.h", + "line": 710, + "lineto": 710, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, or error" + }, + "description": "

Remove all the metadata associated with an ongoing command like merge,\n revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc.

\n", + "comments": "", + "group": "repository", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_repository_state_cleanup-34" + ] + } + }, + "git_repository_fetchhead_foreach": { + "type": "function", + "file": "git2/repository.h", + "line": 741, + "lineto": 744, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_repository_fetchhead_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_repository_fetchhead_foreach_cb callback, void *payload", + "sig": "git_repository *::git_repository_fetchhead_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no FETCH_HEAD file, or other error code." + }, + "description": "

Invoke 'callback' for each entry in the given FETCH_HEAD file.

\n", + "comments": "

Return a non-zero value from the callback to stop the loop.

\n", + "group": "repository" + }, + "git_repository_mergehead_foreach": { + "type": "function", + "file": "git2/repository.h", + "line": 770, + "lineto": 773, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_repository_mergehead_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_repository_mergehead_foreach_cb callback, void *payload", + "sig": "git_repository *::git_repository_mergehead_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no MERGE_HEAD file, or other error code." + }, + "description": "

If a merge is in progress, invoke 'callback' for each commit ID in the\n MERGE_HEAD file.

\n", + "comments": "

Return a non-zero value from the callback to stop the loop.

\n", + "group": "repository" + }, + "git_repository_hashfile": { + "type": "function", + "file": "git2/repository.h", + "line": 800, + "lineto": 805, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Output value of calculated SHA" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to file on disk whose contents should be hashed. This\n may be an absolute path or a relative path, in which case it\n will be treated as a path within the working directory." + }, + { + "name": "type", + "type": "git_object_t", + "comment": "The object type to hash as (e.g. GIT_OBJECT_BLOB)" + }, + { + "name": "as_path", + "type": "const char *", + "comment": "The path to use to look up filtering rules. If this is\n an empty string then no filters will be applied when\n calculating the hash. If this is `NULL` and the `path`\n parameter is a file within the repository's working\n directory, then the `path` will be used." + } + ], + "argline": "git_oid *out, git_repository *repo, const char *path, git_object_t type, const char *as_path", + "sig": "git_oid *::git_repository *::const char *::git_object_t::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Calculate hash of file using repository filtering rules.

\n", + "comments": "

If you simply want to calculate the hash of a file on disk with no filters, you can just use the git_odb_hashfile() API. However, if you want to hash a file in the repository and you want to apply filtering rules (e.g. crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the filtering triggers that failure, then this function will return an error and not calculate the hash of the file.

\n", + "group": "repository" + }, + "git_repository_set_head": { + "type": "function", + "file": "git2/repository.h", + "line": 825, + "lineto": 827, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "refname", + "type": "const char *", + "comment": "Canonical name of the reference the HEAD should point at" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Make the repository HEAD point to the specified reference.

\n", + "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", + "group": "repository", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_repository_set_head-23" + ] + } + }, + "git_repository_set_head_detached": { + "type": "function", + "file": "git2/repository.h", + "line": 845, + "lineto": 847, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "committish", + "type": "const git_oid *", + "comment": "Object id of the Commit the HEAD should point to" + } + ], + "argline": "git_repository *repo, const git_oid *committish", + "sig": "git_repository *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code" + }, + "description": "

Make the repository HEAD directly point to the Commit.

\n", + "comments": "

If the provided committish cannot be found in the repository, the HEAD is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided committish cannot be peeled into a commit, the HEAD is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to the peeled Commit.

\n", + "group": "repository" + }, + "git_repository_set_head_detached_from_annotated": { + "type": "function", + "file": "git2/repository.h", + "line": 861, + "lineto": 863, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": null + }, + { + "name": "committish", + "type": "const git_annotated_commit *", + "comment": null + } + ], + "argline": "git_repository *repo, const git_annotated_commit *committish", + "sig": "git_repository *::const git_annotated_commit *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Make the repository HEAD directly point to the Commit.

\n", + "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", + "group": "repository", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_repository_set_head_detached_from_annotated-24" + ] + } + }, + "git_repository_detach_head": { + "type": "function", + "file": "git2/repository.h", + "line": 882, + "lineto": 883, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code" + }, + "description": "

Detach the HEAD.

\n", + "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non committish, the HEAD is unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", + "group": "repository" + }, + "git_repository_state": { + "type": "function", + "file": "git2/repository.h", + "line": 913, + "lineto": 913, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " The state of the repository" + }, + "description": "

Determines the status of a git repository - ie, whether an operation\n (merge, cherry-pick, etc) is in progress.

\n", + "comments": "", + "group": "repository", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_repository_state-25" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_repository_state-35" + ] + } + }, + "git_repository_set_namespace": { + "type": "function", + "file": "git2/repository.h", + "line": 927, + "lineto": 927, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repo" + }, + { + "name": "nmspace", + "type": "const char *", + "comment": "The namespace. This should not include the refs\n\tfolder, e.g. to namespace all references under `refs/namespaces/foo/`,\n\tuse `foo` as the namespace." + } + ], + "argline": "git_repository *repo, const char *nmspace", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error" + }, + "description": "

Sets the active namespace for this Git Repository

\n", + "comments": "

This namespace affects all reference operations for the repo. See man gitnamespaces

\n", + "group": "repository" + }, + "git_repository_get_namespace": { + "type": "function", + "file": "git2/repository.h", + "line": 935, + "lineto": 935, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repo" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "const char *", + "comment": " the active namespace, or NULL if there isn't one" + }, + "description": "

Get the currently active namespace for this repository

\n", + "comments": "", + "group": "repository" + }, + "git_repository_is_shallow": { + "type": "function", + "file": "git2/repository.h", + "line": 944, + "lineto": 944, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if shallow, zero if not" + }, + "description": "

Determine if the repository was a shallow clone

\n", + "comments": "", + "group": "repository" + }, + "git_repository_ident": { + "type": "function", + "file": "git2/repository.h", + "line": 957, + "lineto": 957, + "args": [ + { + "name": "name", + "type": "const char **", + "comment": "where to store the pointer to the name" + }, + { + "name": "email", + "type": "const char **", + "comment": "where to store the pointer to the email" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "the repository" + } + ], + "argline": "const char **name, const char **email, const git_repository *repo", + "sig": "const char **::const char **::const git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Retrieve the configured identity to use for reflogs

\n", + "comments": "

The memory is owned by the repository and must not be freed by the user.

\n", + "group": "repository" + }, + "git_repository_set_ident": { + "type": "function", + "file": "git2/repository.h", + "line": 971, + "lineto": 971, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to configure" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name to use for the reflog entries" + }, + { + "name": "email", + "type": "const char *", + "comment": "the email to use for the reflog entries" + } + ], + "argline": "git_repository *repo, const char *name, const char *email", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Set the identity to be used for writing reflogs

\n", + "comments": "

If both are set, this name and email will be used to write to the reflog. Pass NULL to unset. When unset, the identity will be taken from the repository's configuration.

\n", + "group": "repository" + }, + "git_repository_oid_type": { + "type": "function", + "file": "git2/repository.h", + "line": 979, + "lineto": 979, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "git_oid_t", + "comment": " the object id type" + }, + "description": "

Gets the object type used by this repository.

\n", + "comments": "", + "group": "repository" + }, + "git_reset": { + "type": "function", + "file": "git2/reset.h", + "line": 62, + "lineto": 66, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Committish to which the Head should be moved to. This object\n must belong to the given `repo` and can either be a git_commit or a\n git_tag. When a git_tag is being passed, it should be dereferenceable\n to a git_commit which oid will be used as the target of the branch." + }, + { + "name": "reset_type", + "type": "git_reset_t", + "comment": "Kind of reset operation to perform." + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": "Optional checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks." + } + ], + "argline": "git_repository *repo, const git_object *target, git_reset_t reset_type, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_object *::git_reset_t::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", + "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be replaced with the content of the index. (Untracked and ignored files will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", + "group": "reset" + }, + "git_reset_from_annotated": { + "type": "function", + "file": "git2/reset.h", + "line": 80, + "lineto": 84, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": null + }, + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": null + }, + { + "name": "reset_type", + "type": "git_reset_t", + "comment": null + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": null + } + ], + "argline": "git_repository *repo, const git_annotated_commit *commit, git_reset_t reset_type, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_annotated_commit *::git_reset_t::const git_checkout_options *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", + "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", + "group": "reset" + }, + "git_reset_default": { + "type": "function", + "file": "git2/reset.h", + "line": 104, + "lineto": 107, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", + "type": "const git_object *", + "comment": "The committish which content will be used to reset the content\n of the index." + }, + { + "name": "pathspecs", + "type": "const git_strarray *", + "comment": "List of pathspecs to operate on." + } + ], + "argline": "git_repository *repo, const git_object *target, const git_strarray *pathspecs", + "sig": "git_repository *::const git_object *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success or an error code \n<\n 0" + }, + "description": "

Updates some entries in the index from the target commit tree.

\n", + "comments": "

The scope of the updated entries is determined by the paths being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing entries in the index matching the provided pathspecs.

\n", + "group": "reset" + }, + "git_revert_options_init": { + "type": "function", + "file": "git2/revert.h", + "line": 49, + "lineto": 51, + "args": [ + { + "name": "opts", + "type": "git_revert_options *", + "comment": "The `git_revert_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REVERT_OPTIONS_VERSION`." + } + ], + "argline": "git_revert_options *opts, unsigned int version", + "sig": "git_revert_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_revert_options structure

\n", + "comments": "

Initializes a git_revert_options with default values. Equivalent to creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", + "group": "revert" + }, + "git_revert_commit": { + "type": "function", + "file": "git2/revert.h", + "line": 67, + "lineto": 73, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository that contains the given commits" + }, + { + "name": "revert_commit", + "type": "git_commit *", + "comment": "the commit to revert" + }, + { + "name": "our_commit", + "type": "git_commit *", + "comment": "the commit to revert against (eg, HEAD)" + }, + { + "name": "mainline", + "type": "unsigned int", + "comment": "the parent of the revert commit, if it is a merge" + }, + { + "name": "merge_options", + "type": "const git_merge_options *", + "comment": "the merge options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_commit *revert_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", + "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Reverts the given commit against the given "our" commit, producing an\n index that reflects the result of the revert.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "revert" + }, + "git_revert": { + "type": "function", + "file": "git2/revert.h", + "line": 83, + "lineto": 86, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to revert" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to revert" + }, + { + "name": "given_opts", + "type": "const git_revert_options *", + "comment": "the revert options (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_commit *commit, const git_revert_options *given_opts", + "sig": "git_repository *::git_commit *::const git_revert_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Reverts the given commit, producing changes in the index and working directory.

\n", + "comments": "", + "group": "revert" + }, + "git_revparse_single": { + "type": "function", + "file": "git2/revparse.h", + "line": 37, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "pointer to output object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the textual specification for an object" + } + ], + "argline": "git_object **out, git_repository *repo, const char *spec", + "sig": "git_object **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Find a single object, as specified by a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", + "group": "revparse", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_revparse_single-22" + ], + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_revparse_single-30" + ], + "describe.c": [ + "ex/v1.7.2/describe.html#git_revparse_single-6" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_revparse_single-44" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_revparse_single-9", + "ex/v1.7.2/tag.html#git_revparse_single-10", + "ex/v1.7.2/tag.html#git_revparse_single-11", + "ex/v1.7.2/tag.html#git_revparse_single-12" + ] + } + }, + "git_revparse_ext": { + "type": "function", + "file": "git2/revparse.h", + "line": 61, + "lineto": 65, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer to output object" + }, + { + "name": "reference_out", + "type": "git_reference **", + "comment": "pointer to output reference or NULL" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the textual specification for an object" + } + ], + "argline": "git_object **object_out, git_reference **reference_out, git_repository *repo, const char *spec", + "sig": "git_object **::git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code" + }, + "description": "

Find a single object and intermediate reference by a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", + "group": "revparse", + "examples": { + "commit.c": [ + "ex/v1.7.2/commit.html#git_revparse_ext-9" + ] + } + }, + "git_revparse": { + "type": "function", + "file": "git2/revparse.h", + "line": 105, + "lineto": 108, + "args": [ + { + "name": "revspec", + "type": "git_revspec *", + "comment": "Pointer to an user-allocated git_revspec struct where\n\t the result of the rev-parse will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the rev-parse spec to parse" + } + ], + "argline": "git_revspec *revspec, git_repository *repo, const char *spec", + "sig": "git_revspec *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code" + }, + "description": "

Parse a revision string for from, to, and intent.

\n", + "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "group": "revparse", + "examples": { + "blame.c": [ + "ex/v1.7.2/blame.html#git_revparse-23" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_revparse-45" + ], + "rev-parse.c": [ + "ex/v1.7.2/rev-parse.html#git_revparse-14", + "ex/v1.7.2/rev-parse.html#git_revparse-15" + ] + } + }, + "git_revwalk_new": { + "type": "function", + "file": "git2/revwalk.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "out", + "type": "git_revwalk **", + "comment": "pointer to the new revision walker" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to walk through" + } + ], + "argline": "git_revwalk **out, git_repository *repo", + "sig": "git_revwalk **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Allocate a new revision walker to iterate through a repo.

\n", + "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

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.

\n", + "group": "revwalk", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_revwalk_new-65" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_revwalk_new-46", + "ex/v1.7.2/log.html#git_revwalk_new-47" + ] + } + }, + "git_revwalk_reset": { + "type": "function", + "file": "git2/revwalk.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "walker", + "type": "git_revwalk *", + "comment": "handle to reset." + } + ], + "argline": "git_revwalk *walker", + "sig": "git_revwalk *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Reset the revision walker for reuse.

\n", + "comments": "

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.

\n\n

The revision walk is automatically reset when a walk is over.

\n", + "group": "revwalk" + }, + "git_revwalk_push": { + "type": "function", + "file": "git2/revwalk.h", + "line": 108, + "lineto": 108, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the oid of the commit to start from." + } + ], + "argline": "git_revwalk *walk, const git_oid *id", + "sig": "git_revwalk *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add a new root for the traversal

\n", + "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", + "group": "revwalk", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_revwalk_push-66" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_revwalk_push-48" + ] + } + }, + "git_revwalk_push_glob": { + "type": "function", + "file": "git2/revwalk.h", + "line": 126, + "lineto": 126, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob pattern references should match" + } + ], + "argline": "git_revwalk *walk, const char *glob", + "sig": "git_revwalk *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Push matching references

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "group": "revwalk" + }, + "git_revwalk_push_head": { + "type": "function", + "file": "git2/revwalk.h", + "line": 134, + "lineto": 134, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Push the repository's HEAD

\n", + "comments": "", + "group": "revwalk", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_revwalk_push_head-49" + ] + } + }, + "git_revwalk_hide": { + "type": "function", + "file": "git2/revwalk.h", + "line": 149, + "lineto": 149, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "commit_id", + "type": "const git_oid *", + "comment": "the oid of commit that will be ignored during the traversal" + } + ], + "argline": "git_revwalk *walk, const git_oid *commit_id", + "sig": "git_revwalk *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", + "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", + "group": "revwalk", + "examples": { + "log.c": [ + "ex/v1.7.2/log.html#git_revwalk_hide-50" + ] + } + }, + "git_revwalk_hide_glob": { + "type": "function", + "file": "git2/revwalk.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob pattern references should match" + } + ], + "argline": "git_revwalk *walk, const char *glob", + "sig": "git_revwalk *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Hide matching references.

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern and their ancestors will be hidden from the output on the revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "group": "revwalk" + }, + "git_revwalk_hide_head": { + "type": "function", + "file": "git2/revwalk.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Hide the repository's HEAD

\n", + "comments": "", + "group": "revwalk" + }, + "git_revwalk_push_ref": { + "type": "function", + "file": "git2/revwalk.h", + "line": 187, + "lineto": 187, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to push" + } + ], + "argline": "git_revwalk *walk, const char *refname", + "sig": "git_revwalk *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Push the OID pointed to by a reference

\n", + "comments": "

The reference must point to a committish.

\n", + "group": "revwalk" + }, + "git_revwalk_hide_ref": { + "type": "function", + "file": "git2/revwalk.h", + "line": 198, + "lineto": 198, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to hide" + } + ], + "argline": "git_revwalk *walk, const char *refname", + "sig": "git_revwalk *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Hide the OID pointed to by a reference

\n", + "comments": "

The reference must point to a committish.

\n", + "group": "revwalk" + }, + "git_revwalk_next": { + "type": "function", + "file": "git2/revwalk.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store the oid of the next commit" + }, + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker to pop the commit from." + } + ], + "argline": "git_oid *out, git_revwalk *walk", + "sig": "git_oid *::git_revwalk *", + "return": { + "type": "int", + "comment": " 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate" + }, + "description": "

Get the next commit from the revision walk.

\n", + "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

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).

\n\n

The revision walker is reset when the walk is over.

\n", + "group": "revwalk", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_revwalk_next-67" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_revwalk_next-51" + ] + } + }, + "git_revwalk_sorting": { + "type": "function", + "file": "git2/revwalk.h", + "line": 230, + "lineto": 230, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "sort_mode", + "type": "unsigned int", + "comment": "combination of GIT_SORT_XXX flags" + } + ], + "argline": "git_revwalk *walk, unsigned int sort_mode", + "sig": "git_revwalk *::unsigned int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Change the sorting mode when iterating through the\n repository's contents.

\n", + "comments": "

Changing the sorting mode resets the walker.

\n", + "group": "revwalk", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_revwalk_sorting-68" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_revwalk_sorting-52", + "ex/v1.7.2/log.html#git_revwalk_sorting-53" + ] + } + }, + "git_revwalk_push_range": { + "type": "function", + "file": "git2/revwalk.h", + "line": 245, + "lineto": 245, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "range", + "type": "const char *", + "comment": "the range" + } + ], + "argline": "git_revwalk *walk, const char *range", + "sig": "git_revwalk *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Push and hide the respective endpoints of the given range.

\n", + "comments": "

The range should be of the form .. where each is in the form accepted by 'git_revparse_single'. The left-hand commit will be hidden and the right-hand commit pushed.

\n", + "group": "revwalk" + }, + "git_revwalk_simplify_first_parent": { + "type": "function", + "file": "git2/revwalk.h", + "line": 255, + "lineto": 255, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "The revision walker." + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Simplify the history by first-parent

\n", + "comments": "

No parents other than the first for each commit will be enqueued.

\n", + "group": "revwalk" + }, + "git_revwalk_free": { + "type": "function", + "file": "git2/revwalk.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "traversal handle to close. If NULL nothing occurs." + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a revision walker previously allocated.

\n", + "comments": "", + "group": "revwalk", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_revwalk_free-69" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_revwalk_free-54" + ] + } + }, + "git_revwalk_repository": { + "type": "function", + "file": "git2/revwalk.h", + "line": 272, + "lineto": 272, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revision walker" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { + "type": "git_repository *", + "comment": " the repository being walked" + }, + "description": "

Return the repository on which this walker\n is operating.

\n", + "comments": "", + "group": "revwalk" + }, + "git_revwalk_add_hide_cb": { + "type": "function", + "file": "git2/revwalk.h", + "line": 295, + "lineto": 298, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revision walker" + }, + { + "name": "hide_cb", + "type": "git_revwalk_hide_cb", + "comment": "callback function to hide a commit and its parents" + }, + { + "name": "payload", + "type": "void *", + "comment": "data payload to be passed to callback function" + } + ], + "argline": "git_revwalk *walk, git_revwalk_hide_cb hide_cb, void *payload", + "sig": "git_revwalk *::git_revwalk_hide_cb::void *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Adds, changes or removes a callback function to hide a commit and its parents

\n", + "comments": "", + "group": "revwalk" + }, + "git_signature_new": { + "type": "function", + "file": "git2/signature.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature, in case of error NULL" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the person" + }, + { + "name": "email", + "type": "const char *", + "comment": "email of the person" + }, + { + "name": "time", + "type": "git_time_t", + "comment": "time (in seconds from epoch) when the action happened" + }, + { + "name": "offset", + "type": "int", + "comment": "timezone offset (in minutes) for the time" + } + ], + "argline": "git_signature **out, const char *name, const char *email, git_time_t time, int offset", + "sig": "git_signature **::const char *::const char *::git_time_t::int", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a new action signature.

\n", + "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('<' and '>') characters are not allowed to be used in either the name or the email parameter.

\n", + "group": "signature", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_signature_new-70", + "ex/v1.7.2/general.html#git_signature_new-71" + ] + } + }, + "git_signature_now": { + "type": "function", + "file": "git2/signature.h", + "line": 49, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature, in case of error NULL" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the person" + }, + { + "name": "email", + "type": "const char *", + "comment": "email of the person" + } + ], + "argline": "git_signature **out, const char *name, const char *email", + "sig": "git_signature **::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a new action signature with a timestamp of 'now'.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "signature", + "examples": { + "merge.c": [ + "ex/v1.7.2/merge.html#git_signature_now-36" + ] + } + }, + "git_signature_default": { + "type": "function", + "file": "git2/signature.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository pointer" + } + ], + "argline": "git_signature **out, git_repository *repo", + "sig": "git_signature **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" + }, + "description": "

Create a new action signature with default user and now timestamp.

\n", + "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", + "group": "signature", + "examples": { + "commit.c": [ + "ex/v1.7.2/commit.html#git_signature_default-10" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_signature_default-10" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_signature_default-13" + ] + } + }, + "git_signature_from_buffer": { + "type": "function", + "file": "git2/signature.h", + "line": 76, + "lineto": 76, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "buf", + "type": "const char *", + "comment": "signature string" + } + ], + "argline": "git_signature **out, const char *buf", + "sig": "git_signature **::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALID if the signature is not parseable, or an error code" + }, + "description": "

Create a new signature by parsing the given buffer, which is\n expected to be in the format "Real Name \n<email

\n\n
\n

timestamp tzoffset",\n where timestamp is the number of seconds since the Unix epoch and\n tzoffset is the timezone offset in hhmm format (note the lack\n of a colon separator).

\n
\n", + "comments": "", + "group": "signature" + }, + "git_signature_dup": { + "type": "function", + "file": "git2/signature.h", + "line": 88, + "lineto": 88, + "args": [ + { + "name": "dest", + "type": "git_signature **", + "comment": "pointer where to store the copy" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to duplicate" + } + ], + "argline": "git_signature **dest, const git_signature *sig", + "sig": "git_signature **::const git_signature *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a copy of an existing signature. All internal strings are also\n duplicated.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "signature" + }, + "git_signature_free": { + "type": "function", + "file": "git2/signature.h", + "line": 99, + "lineto": 99, + "args": [ + { + "name": "sig", + "type": "git_signature *", + "comment": "signature to free" + } + ], + "argline": "git_signature *sig", + "sig": "git_signature *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free an existing signature.

\n", + "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", + "group": "signature", + "examples": { + "commit.c": [ + "ex/v1.7.2/commit.html#git_signature_free-11" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_signature_free-72", + "ex/v1.7.2/general.html#git_signature_free-73" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_signature_free-11" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_signature_free-14" + ] + } + }, + "git_stash_save": { + "type": "function", + "file": "git2/stash.h", + "line": 67, + "lineto": 72, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "stasher", + "type": "const git_signature *", + "comment": "The identity of the person performing the stashing." + }, + { + "name": "message", + "type": "const char *", + "comment": "Optional description along with the stashed state." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" + } + ], + "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", + "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_save_options_init": { + "type": "function", + "file": "git2/stash.h", + "line": 110, + "lineto": 111, + "args": [ + { + "name": "opts", + "type": "git_stash_save_options *", + "comment": "The `git_stash_save_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STASH_SAVE_OPTIONS_VERSION`." + } + ], + "argline": "git_stash_save_options *opts, unsigned int version", + "sig": "git_stash_save_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_stash_save_options structure

\n", + "comments": "

Initializes a git_stash_save_options with default values. Equivalent to creating an instance with GIT_STASH_SAVE_OPTIONS_INIT.

\n", + "group": "stash" + }, + "git_stash_save_with_opts": { + "type": "function", + "file": "git2/stash.h", + "line": 123, + "lineto": 126, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "opts", + "type": "const git_stash_save_options *", + "comment": "The stash options." + } + ], + "argline": "git_oid *out, git_repository *repo, const git_stash_save_options *opts", + "sig": "git_oid *::git_repository *::const git_stash_save_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash, with options.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_apply_options_init": { + "type": "function", + "file": "git2/stash.h", + "line": 210, + "lineto": 211, + "args": [ + { + "name": "opts", + "type": "git_stash_apply_options *", + "comment": "The `git_stash_apply_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STASH_APPLY_OPTIONS_VERSION`." + } + ], + "argline": "git_stash_apply_options *opts, unsigned int version", + "sig": "git_stash_apply_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_stash_apply_options structure

\n", + "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", + "group": "stash" + }, + "git_stash_apply": { + "type": "function", + "file": "git2/stash.h", + "line": 239, + "lineto": 242, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "options", + "type": "const git_stash_apply_options *", + "comment": "Optional options to control how stashes are applied." + } + ], + "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", + "sig": "git_repository *::size_t::const git_stash_apply_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" + }, + "description": "

Apply a single stashed state from the stash list.

\n", + "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", + "group": "stash" + }, + "git_stash_foreach": { + "type": "function", + "file": "git2/stash.h", + "line": 275, + "lineto": 278, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the stash." + }, + { + "name": "callback", + "type": "git_stash_cb", + "comment": "Callback to invoke per found stashed state. The most\n recent stash state will be enumerated first." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "git_repository *repo, git_stash_cb callback, void *payload", + "sig": "git_repository *::git_stash_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code." + }, + "description": "

Loop over all the stashed states and issue a callback for each one.

\n", + "comments": "

If the callback returns a non-zero value, this will stop looping.

\n", + "group": "stash" + }, + "git_stash_drop": { + "type": "function", + "file": "git2/stash.h", + "line": 291, + "lineto": 293, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + } + ], + "argline": "git_repository *repo, size_t index", + "sig": "git_repository *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code." + }, + "description": "

Remove a single stashed state from the stash list.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_pop": { + "type": "function", + "file": "git2/stash.h", + "line": 307, + "lineto": 310, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "options", + "type": "const git_stash_apply_options *", + "comment": "Optional options to control how stashes are applied." + } + ], + "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", + "sig": "git_repository *::size_t::const git_stash_apply_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code. (see git_stash_apply() above for details)" + }, + "description": "

Apply a single stashed state from the stash list and remove it from the list\n if successful.

\n", + "comments": "", + "group": "stash" + }, + "git_status_options_init": { + "type": "function", + "file": "git2/status.h", + "line": 277, + "lineto": 279, + "args": [ + { + "name": "opts", + "type": "git_status_options *", + "comment": "The `git_status_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." + } + ], + "argline": "git_status_options *opts, unsigned int version", + "sig": "git_status_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_status_options structure

\n", + "comments": "

Initializes a git_status_options with default values. Equivalent to creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", + "group": "status" + }, + "git_status_foreach": { + "type": "function", + "file": "git2/status.h", + "line": 317, + "lineto": 320, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_status_cb", + "comment": "The function to call on each file" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to pass through to callback function" + } + ], + "argline": "git_repository *repo, git_status_cb callback, void *payload", + "sig": "git_repository *::git_status_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Gather file statuses and run a callback for each one.

\n", + "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_status_foreach-6" + ] + } + }, + "git_status_foreach_ext": { + "type": "function", + "file": "git2/status.h", + "line": 341, + "lineto": 345, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object" + }, + { + "name": "opts", + "type": "const git_status_options *", + "comment": "Status options structure" + }, + { + "name": "callback", + "type": "git_status_cb", + "comment": "The function to call on each file" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to pass through to callback function" + } + ], + "argline": "git_repository *repo, const git_status_options *opts, git_status_cb callback, void *payload", + "sig": "git_repository *::const git_status_options *::git_status_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Gather file status information and run callbacks as requested.

\n", + "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_status_foreach_ext-7" + ] + } + }, + "git_status_file": { + "type": "function", + "file": "git2/status.h", + "line": 373, + "lineto": 376, + "args": [ + { + "name": "status_flags", + "type": "unsigned int *", + "comment": "Output combination of git_status_t values for file" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "The exact path to retrieve status for relative to the\n repository working directory" + } + ], + "argline": "unsigned int *status_flags, git_repository *repo, const char *path", + "sig": "unsigned int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors." + }, + "description": "

Get file status for a single file.

\n", + "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", + "group": "status", + "examples": { + "add.c": [ + "ex/v1.7.2/add.html#git_status_file-6" + ] + } + }, + "git_status_list_new": { + "type": "function", + "file": "git2/status.h", + "line": 391, + "lineto": 394, + "args": [ + { + "name": "out", + "type": "git_status_list **", + "comment": "Pointer to store the status results in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object" + }, + { + "name": "opts", + "type": "const git_status_options *", + "comment": "Status options structure" + } + ], + "argline": "git_status_list **out, git_repository *repo, const git_status_options *opts", + "sig": "git_status_list **::git_repository *::const git_status_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Gather file status information and populate the git_status_list.

\n", + "comments": "

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_status_list_new-8", + "ex/v1.7.2/status.html#git_status_list_new-9" + ] + } + }, + "git_status_list_entrycount": { + "type": "function", + "file": "git2/status.h", + "line": 405, + "lineto": 406, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + } + ], + "argline": "git_status_list *statuslist", + "sig": "git_status_list *", + "return": { + "type": "size_t", + "comment": " the number of status entries" + }, + "description": "

Gets the count of status entries in this list.

\n", + "comments": "

If there are no changes in status (at least according the options given when the status list was created), this can return 0.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_status_list_entrycount-10", + "ex/v1.7.2/status.html#git_status_list_entrycount-11" + ] + } + }, + "git_status_byindex": { + "type": "function", + "file": "git2/status.h", + "line": 417, + "lineto": 419, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + }, + { + "name": "idx", + "type": "size_t", + "comment": "Position of the entry" + } + ], + "argline": "git_status_list *statuslist, size_t idx", + "sig": "git_status_list *::size_t", + "return": { + "type": "const git_status_entry *", + "comment": " Pointer to the entry; NULL if out of bounds" + }, + "description": "

Get a pointer to one of the entries in the status list.

\n", + "comments": "

The entry is not modifiable and should not be freed.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_status_byindex-12", + "ex/v1.7.2/status.html#git_status_byindex-13", + "ex/v1.7.2/status.html#git_status_byindex-14", + "ex/v1.7.2/status.html#git_status_byindex-15", + "ex/v1.7.2/status.html#git_status_byindex-16", + "ex/v1.7.2/status.html#git_status_byindex-17" + ] + } + }, + "git_status_list_free": { + "type": "function", + "file": "git2/status.h", + "line": 426, + "lineto": 427, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + } + ], + "argline": "git_status_list *statuslist", + "sig": "git_status_list *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free an existing status list

\n", + "comments": "", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_status_list_free-18" + ] + } + }, + "git_status_should_ignore": { + "type": "function", + "file": "git2/status.h", + "line": 445, + "lineto": 448, + "args": [ + { + "name": "ignored", + "type": "int *", + "comment": "Boolean returning 0 if the file is not ignored, 1 if it is" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "The file to check ignores for, rooted at the repo's workdir." + } + ], + "argline": "int *ignored, git_repository *repo, const char *path", + "sig": "int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." + }, + "description": "

Test if the ignore rules apply to a given file.

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", + "group": "status" + }, + "git_strarray_dispose": { + "type": "function", + "file": "git2/strarray.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "The git_strarray that contains strings to free" + } + ], + "argline": "git_strarray *array", + "sig": "git_strarray *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the strings contained in a string array. This method should\n be called on git_strarray objects that were provided by the\n library. Not doing so, will result in a memory leak.

\n", + "comments": "

This does not free the git_strarray itself, since the library will never allocate that object directly itself.

\n", + "group": "strarray", + "examples": { + "checkout.c": [ + "ex/v1.7.2/checkout.html#git_strarray_dispose-26" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_strarray_dispose-74" + ], + "remote.c": [ + "ex/v1.7.2/remote.html#git_strarray_dispose-11", + "ex/v1.7.2/remote.html#git_strarray_dispose-12" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_strarray_dispose-15" + ] + } + }, + "git_submodule_update_options_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 171, + "lineto": 172, + "args": [ + { + "name": "opts", + "type": "git_submodule_update_options *", + "comment": "The `git_submodule_update_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`." + } + ], + "argline": "git_submodule_update_options *opts, unsigned int version", + "sig": "git_submodule_update_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_submodule_update_options structure

\n", + "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", + "group": "submodule" + }, + "git_submodule_update": { + "type": "function", + "file": "git2/submodule.h", + "line": 192, + "lineto": 192, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule object" + }, + { + "name": "init", + "type": "int", + "comment": "If the submodule is not initialized, setting this flag to true\n will initialize the submodule before updating. Otherwise, this will\n return an error if attempting to update an uninitialized repository.\n but setting this to true forces them to be updated." + }, + { + "name": "options", + "type": "git_submodule_update_options *", + "comment": "configuration options for the update. If NULL, the\n function works as though GIT_SUBMODULE_UPDATE_OPTIONS_INIT was passed." + } + ], + "argline": "git_submodule *submodule, int init, git_submodule_update_options *options", + "sig": "git_submodule *::int::git_submodule_update_options *", + "return": { + "type": "int", + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)." + }, + "description": "

Update a submodule. This will clone a missing submodule and\n checkout the subrepository to the commit specified in the index of\n the containing repository. If the submodule repository doesn't contain\n the target commit (e.g. because fetchRecurseSubmodules isn't set), then\n the submodule is fetched using the fetch options supplied in options.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_lookup": { + "type": "function", + "file": "git2/submodule.h", + "line": 221, + "lineto": 224, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "Output ptr to submodule; pass NULL to just get return code" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The parent repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of or path to the submodule; trailing slashes okay" + } + ], + "argline": "git_submodule **out, git_repository *repo, const char *name", + "sig": "git_submodule **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors." + }, + "description": "

Lookup submodule information by name or path.

\n", + "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config, but does "exist" in the working directory (i.e. there is a subdirectory that appears to be a Git repository). In this case, this function returns GIT_EEXISTS to indicate a sub-repository exists but not in a state where a git_submodule can be instantiated. - The submodule is not mentioned in the HEAD, index, or config and the working directory doesn't contain a value git repo at that path. There may or may not be anything else at that path, but nothing that looks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", + "group": "submodule" + }, + "git_submodule_dup": { + "type": "function", + "file": "git2/submodule.h", + "line": 234, + "lineto": 234, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "Pointer to store the copy of the submodule." + }, + { + "name": "source", + "type": "git_submodule *", + "comment": "Original submodule to copy." + } + ], + "argline": "git_submodule **out, git_submodule *source", + "sig": "git_submodule **::git_submodule *", + "return": { + "type": "int", + "comment": " 0" + }, + "description": "

Create an in-memory copy of a submodule. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_free": { + "type": "function", + "file": "git2/submodule.h", + "line": 241, + "lineto": 241, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Release a submodule

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_foreach": { + "type": "function", + "file": "git2/submodule.h", + "line": 261, + "lineto": 264, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + }, + { + "name": "callback", + "type": "git_submodule_cb", + "comment": "Function to be called with the name of each submodule.\n Return a non-zero value to terminate the iteration." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra data to pass to callback" + } + ], + "argline": "git_repository *repo, git_submodule_cb callback, void *payload", + "sig": "git_repository *::git_submodule_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, or non-zero return value of callback" + }, + "description": "

Iterate over all tracked submodules of a repository.

\n", + "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", + "group": "submodule", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_submodule_foreach-19" + ] + } + }, + "git_submodule_add_setup": { + "type": "function", + "file": "git2/submodule.h", + "line": 292, + "lineto": 297, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "The newly created submodule ready to open for clone" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which you want to create the submodule" + }, + { + "name": "url", + "type": "const char *", + "comment": "URL for the submodule's remote" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path at which the submodule should be created" + }, + { + "name": "use_gitlink", + "type": "int", + "comment": "Should workdir contain a gitlink to the repo in\n .git/modules vs. repo directly in workdir." + } + ], + "argline": "git_submodule **out, git_repository *repo, const char *url, const char *path, int use_gitlink", + "sig": "git_submodule **::git_repository *::const char *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." + }, + "description": "

Set up a new git submodule for checkout.

\n", + "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed (if you don't need anything custom see git_submodule_add_clone()). Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", + "group": "submodule" + }, + "git_submodule_clone": { + "type": "function", + "file": "git2/submodule.h", + "line": 310, + "lineto": 313, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "The newly created repository object. Optional." + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule currently waiting for its clone." + }, + { + "name": "opts", + "type": "const git_submodule_update_options *", + "comment": "The options to use." + } + ], + "argline": "git_repository **out, git_submodule *submodule, const git_submodule_update_options *opts", + "sig": "git_repository **::git_submodule *::const git_submodule_update_options *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on other errors (see git_clone)." + }, + "description": "

Perform the clone step for a newly created submodule.

\n", + "comments": "

This performs the necessary git_clone to setup a newly-created submodule.

\n", + "group": "submodule" + }, + "git_submodule_add_finalize": { + "type": "function", + "file": "git2/submodule.h", + "line": 326, + "lineto": 326, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to finish adding." + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Resolve the setup of a new git submodule.

\n", + "comments": "

This should be called on a submodule once you have called add setup and done the clone of the submodule. This adds the .gitmodules file and the newly cloned submodule to the index to be ready to be committed (but doesn't actually do the commit).

\n", + "group": "submodule" + }, + "git_submodule_add_to_index": { + "type": "function", + "file": "git2/submodule.h", + "line": 338, + "lineto": 340, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to add to the index" + }, + { + "name": "write_index", + "type": "int", + "comment": "Boolean if this should immediately write the index\n file. If you pass this as false, you will have to get the\n git_index and explicitly call `git_index_write()` on it to\n save the change." + } + ], + "argline": "git_submodule *submodule, int write_index", + "sig": "git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Add current submodule HEAD commit to index of superproject.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_owner": { + "type": "function", + "file": "git2/submodule.h", + "line": 353, + "lineto": 353, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_repository *", + "comment": " Pointer to `git_repository`" + }, + "description": "

Get the containing repository for a submodule.

\n", + "comments": "

This returns a pointer to the repository that contains the submodule. This is a just a reference to the repository that was passed to the original git_submodule_lookup() call, so if that repository has been freed, then this may be a dangling reference.

\n", + "group": "submodule" + }, + "git_submodule_name": { + "type": "function", + "file": "git2/submodule.h", + "line": 361, + "lineto": 361, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule name" + }, + "description": "

Get the name of submodule.

\n", + "comments": "", + "group": "submodule", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_submodule_name-20" + ] + } + }, + "git_submodule_path": { + "type": "function", + "file": "git2/submodule.h", + "line": 372, + "lineto": 372, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule path" + }, + "description": "

Get the path to the submodule.

\n", + "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", + "group": "submodule", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_submodule_path-21" + ] + } + }, + "git_submodule_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 380, + "lineto": 380, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule url" + }, + "description": "

Get the URL for the submodule.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_resolve_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 390, + "lineto": 390, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the absolute submodule url in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Pointer to repository object" + }, + { + "name": "url", + "type": "const char *", + "comment": "Relative url" + } + ], + "argline": "git_buf *out, git_repository *repo, const char *url", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Resolve a submodule url relative to the given repository.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_branch": { + "type": "function", + "file": "git2/submodule.h", + "line": 398, + "lineto": 398, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule branch" + }, + "description": "

Get the branch for the submodule.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_set_branch": { + "type": "function", + "file": "git2/submodule.h", + "line": 411, + "lineto": 411, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "branch", + "type": "const char *", + "comment": "Branch that should be used for the submodule" + } + ], + "argline": "git_repository *repo, const char *name, const char *branch", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set the branch for the submodule in the configuration

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "group": "submodule" + }, + "git_submodule_set_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 425, + "lineto": 425, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "url", + "type": "const char *", + "comment": "URL that should be used for the submodule" + } + ], + "argline": "git_repository *repo, const char *name, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set the URL for the submodule in the configuration

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "group": "submodule" + }, + "git_submodule_index_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 433, + "lineto": 433, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not in index." + }, + "description": "

Get the OID for the submodule in the index.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_head_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 441, + "lineto": 441, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not in the HEAD." + }, + "description": "

Get the OID for the submodule in the current HEAD tree.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_wd_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 454, + "lineto": 454, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not checked out." + }, + "description": "

Get the OID for the submodule in the current working directory.

\n", + "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked out submodule. If there are pending changes in the index or anything else, this won't notice that. You should call git_submodule_status() for a more complete picture about the state of the working directory.

\n", + "group": "submodule" + }, + "git_submodule_ignore": { + "type": "function", + "file": "git2/submodule.h", + "line": 479, + "lineto": 480, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to check" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_ignore_t", + "comment": " The current git_submodule_ignore_t valyue what will be used for\n this submodule." + }, + "description": "

Get the ignore rule that will be used for the submodule.

\n", + "comments": "

These values control the behavior of git_submodule_status() for this submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents of the submodule from a clean checkout to be dirty, including the addition of untracked files. This is the default if unspecified. - GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the working tree (i.e. call git_status_foreach() on the submodule) but UNTRACKED files will not count as making the submodule dirty. - GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the submodule has moved for status. This is fast since it does not need to scan the working tree of the submodule at all. - GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo. The working directory will be consider clean so long as there is a checked out version present.
  • \n
\n", + "group": "submodule" + }, + "git_submodule_set_ignore": { + "type": "function", + "file": "git2/submodule.h", + "line": 492, + "lineto": 495, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submdule" + }, + { + "name": "ignore", + "type": "git_submodule_ignore_t", + "comment": "The new value for the ignore rule" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_ignore_t ignore", + "sig": "git_repository *::const char *::git_submodule_ignore_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Set the ignore rule for the submodule in the configuration

\n", + "comments": "

This does not affect any currently-loaded instances.

\n", + "group": "submodule" + }, + "git_submodule_update_strategy": { + "type": "function", + "file": "git2/submodule.h", + "line": 507, + "lineto": 508, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to check" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_update_t", + "comment": " The current git_submodule_update_t value that will be used\n for this submodule." + }, + "description": "

Get the update rule that will be used for the submodule.

\n", + "comments": "

This value controls the behavior of the git submodule update command. There are four useful values documented with git_submodule_update_t.

\n", + "group": "submodule" + }, + "git_submodule_set_update": { + "type": "function", + "file": "git2/submodule.h", + "line": 520, + "lineto": 523, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "update", + "type": "git_submodule_update_t", + "comment": "The new value to use" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_update_t update", + "sig": "git_repository *::const char *::git_submodule_update_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Set the update rule for the submodule in the configuration

\n", + "comments": "

This setting won't affect any existing instances.

\n", + "group": "submodule" + }, + "git_submodule_fetch_recurse_submodules": { + "type": "function", + "file": "git2/submodule.h", + "line": 536, + "lineto": 537, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": null + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_recurse_t", + "comment": " 0 if fetchRecurseSubmodules is false, 1 if true" + }, + "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", + "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", + "group": "submodule" + }, + "git_submodule_set_fetch_recurse_submodules": { + "type": "function", + "file": "git2/submodule.h", + "line": 549, + "lineto": 552, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the submodule to configure" + }, + { + "name": "fetch_recurse_submodules", + "type": "git_submodule_recurse_t", + "comment": "Boolean value" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_recurse_t fetch_recurse_submodules", + "sig": "git_repository *::const char *::git_submodule_recurse_t", + "return": { + "type": "int", + "comment": " old value for fetchRecurseSubmodules" + }, + "description": "

Set the fetchRecurseSubmodules rule for a submodule in the configuration

\n", + "comments": "

This setting won't affect any existing instances.

\n", + "group": "submodule" + }, + "git_submodule_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 567, + "lineto": 567, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to write into the superproject config" + }, + { + "name": "overwrite", + "type": "int", + "comment": "By default, existing entries will not be overwritten,\n but setting this to true forces them to be updated." + } + ], + "argline": "git_submodule *submodule, int overwrite", + "sig": "git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Copy submodule info into ".git/config" file.

\n", + "comments": "

Just like "git submodule init", this copies information about the submodule into ".git/config". You can use the accessor functions above to alter the in-memory git_submodule object and control what is written to the config, overriding what is in .gitmodules.

\n", + "group": "submodule" + }, + "git_submodule_repo_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 582, + "lineto": 585, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Output pointer to the created git repository." + }, + { + "name": "sm", + "type": "const git_submodule *", + "comment": "The submodule to create a new subrepository from." + }, + { + "name": "use_gitlink", + "type": "int", + "comment": "Should the workdir contain a gitlink to\n the repo in .git/modules vs. repo directly in workdir." + } + ], + "argline": "git_repository **out, const git_submodule *sm, int use_gitlink", + "sig": "git_repository **::const git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Set up the subrepository for a submodule in preparation for clone.

\n", + "comments": "

This function can be called to init and set up a submodule repository from a submodule in preparation to clone it from its remote.

\n", + "group": "submodule" + }, + "git_submodule_sync": { + "type": "function", + "file": "git2/submodule.h", + "line": 598, + "lineto": 598, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to copy." + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "int", + "comment": " 0 or an error code." + }, + "description": "

Copy submodule remote info into submodule repo.

\n", + "comments": "

This copies the information about the submodules URL into the checked out submodule config, acting like "git submodule sync". This is useful if you have altered the URL for the submodule (or it has been altered by a fetch of upstream changes) and you need to update your local repo.

\n", + "group": "submodule" + }, + "git_submodule_open": { + "type": "function", + "file": "git2/submodule.h", + "line": 612, + "lineto": 614, + "args": [ + { + "name": "repo", + "type": "git_repository **", + "comment": "Pointer to the submodule repo which was opened" + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule to be opened" + } + ], + "argline": "git_repository **repo, git_submodule *submodule", + "sig": "git_repository **::git_submodule *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 if submodule repo could not be opened." + }, + "description": "

Open the repository for a submodule.

\n", + "comments": "

This is a newly opened repository object. The caller is responsible for calling git_repository_free() on it when done. Multiple calls to this function will return distinct git_repository objects. This will only work if the submodule is checked out into the working directory.

\n", + "group": "submodule" + }, + "git_submodule_reload": { + "type": "function", + "file": "git2/submodule.h", + "line": 626, + "lineto": 626, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to reload" + }, + { + "name": "force", + "type": "int", + "comment": "Force reload even if the data doesn't seem out of date" + } + ], + "argline": "git_submodule *submodule, int force", + "sig": "git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on error" + }, + "description": "

Reread submodule info from config, index, and HEAD.

\n", + "comments": "

Call this to reread cached submodule information for this submodule if you have reason to believe that it has changed.

\n", + "group": "submodule" + }, + "git_submodule_status": { + "type": "function", + "file": "git2/submodule.h", + "line": 642, + "lineto": 646, + "args": [ + { + "name": "status", + "type": "unsigned int *", + "comment": "Combination of `GIT_SUBMODULE_STATUS` flags" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the submodule" + }, + { + "name": "ignore", + "type": "git_submodule_ignore_t", + "comment": "the ignore rules to follow" + } + ], + "argline": "unsigned int *status, git_repository *repo, const char *name, git_submodule_ignore_t ignore", + "sig": "unsigned int *::git_repository *::const char *::git_submodule_ignore_t", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on error" + }, + "description": "

Get the status for a submodule.

\n", + "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", + "group": "submodule", + "examples": { + "status.c": [ + "ex/v1.7.2/status.html#git_submodule_status-22" + ] + } + }, + "git_submodule_location": { + "type": "function", + "file": "git2/submodule.h", + "line": 662, + "lineto": 664, + "args": [ + { + "name": "location_status", + "type": "unsigned int *", + "comment": "Combination of first four `GIT_SUBMODULE_STATUS` flags" + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule for which to get status" + } + ], + "argline": "unsigned int *location_status, git_submodule *submodule", + "sig": "unsigned int *::git_submodule *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on error" + }, + "description": "

Get the locations of submodule information.

\n", + "comments": "

This is a bit like a very lightweight version of git_submodule_status. It just returns a made of the first four submodule status values (i.e. the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). This can be useful if you want to know if the submodule is present in the working directory at this point in time, etc.

\n", + "group": "submodule" + }, + "git_tag_lookup": { + "type": "function", + "file": "git2/tag.h", + "line": 33, + "lineto": 34, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tag." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tag to locate." + } + ], + "argline": "git_tag **out, git_repository *repo, const git_oid *id", + "sig": "git_tag **::git_repository *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a tag object from the repository.

\n", + "comments": "", + "group": "tag", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_tag_lookup-75" + ] + } + }, + "git_tag_lookup_prefix": { + "type": "function", + "file": "git2/tag.h", + "line": 48, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tag." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tag to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_tag **out, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_tag **::git_repository *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "tag" + }, + "git_tag_free": { + "type": "function", + "file": "git2/tag.h", + "line": 61, + "lineto": 61, + "args": [ + { + "name": "tag", + "type": "git_tag *", + "comment": "the tag to close" + } + ], + "argline": "git_tag *tag", + "sig": "git_tag *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an open tag

\n", + "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", + "group": "tag", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_tag_free-76" + ] + } + }, + "git_tag_id": { + "type": "function", + "file": "git2/tag.h", + "line": 69, + "lineto": 69, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the tag." + }, + "description": "

Get the id of a tag.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_owner": { + "type": "function", + "file": "git2/tag.h", + "line": 77, + "lineto": 77, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "A previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this tag." + }, + "description": "

Get the repository that contains the tag.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_target": { + "type": "function", + "file": "git2/tag.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "target_out", + "type": "git_object **", + "comment": "pointer where to store the target" + }, + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "git_object **target_out, const git_tag *tag", + "sig": "git_object **::const git_tag *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Get the tagged object of a tag

\n", + "comments": "

This method performs a repository lookup for the given object and returns it

\n", + "group": "tag", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_tag_target-77" + ] + } + }, + "git_tag_target_id": { + "type": "function", + "file": "git2/tag.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const git_oid *", + "comment": " pointer to the OID" + }, + "description": "

Get the OID of the tagged object of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tag_target_id-31" + ] + } + }, + "git_tag_target_type": { + "type": "function", + "file": "git2/tag.h", + "line": 105, + "lineto": 105, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "git_object_t", + "comment": " type of the tagged object" + }, + "description": "

Get the type of a tag's tagged object

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tag_target_type-32" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tag_target_type-78" + ] + } + }, + "git_tag_name": { + "type": "function", + "file": "git2/tag.h", + "line": 113, + "lineto": 113, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const char *", + "comment": " name of the tag" + }, + "description": "

Get the name of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tag_name-33" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tag_name-79" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_tag_name-16" + ] + } + }, + "git_tag_tagger": { + "type": "function", + "file": "git2/tag.h", + "line": 121, + "lineto": 121, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const git_signature *", + "comment": " reference to the tag's author or NULL when unspecified" + }, + "description": "

Get the tagger (author) of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tag_tagger-34" + ] + } + }, + "git_tag_message": { + "type": "function", + "file": "git2/tag.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const char *", + "comment": " message of the tag or NULL when unspecified" + }, + "description": "

Get the message of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tag_message-35", + "ex/v1.7.2/cat-file.html#git_tag_message-36" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tag_message-80" + ], + "tag.c": [ + "ex/v1.7.2/tag.html#git_tag_message-17" + ] + } + }, + "git_tag_create": { + "type": "function", + "file": "git2/tag.h", + "line": 171, + "lineto": 178, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the\n newly created tag. If the tag already exists, this parameter\n will be the oid of the existing tag, and the function will\n return a GIT_EEXISTS error code." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "tagger", + "type": "const git_signature *", + "comment": "Signature of the tagger for this tag, and\n of the tagging time" + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this tag" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message, int force", + "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it" + }, + "description": "

Create a new tag in the repository from an object

\n", + "comments": "

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.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", + "group": "tag", + "examples": { + "tag.c": [ + "ex/v1.7.2/tag.html#git_tag_create-18" + ] + } + }, + "git_tag_annotation_create": { + "type": "function", + "file": "git2/tag.h", + "line": 203, + "lineto": 209, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the\n newly created tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "tagger", + "type": "const git_signature *", + "comment": "Signature of the tagger for this tag, and\n of the tagging time" + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this tag" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message", + "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Create a new tag in the object database pointing to a git_object

\n", + "comments": "

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n", + "group": "tag" + }, + "git_tag_create_from_buffer": { + "type": "function", + "file": "git2/tag.h", + "line": 220, + "lineto": 224, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the newly created tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "Raw tag data" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing tags" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *buffer, int force", + "sig": "git_oid *::git_repository *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Create a new tag in the repository from a buffer

\n", + "comments": "", + "group": "tag" + }, + "git_tag_create_lightweight": { + "type": "function", + "file": "git2/tag.h", + "line": 256, + "lineto": 261, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the provided\n target object. If the tag already exists, this parameter\n will be filled with the oid of the existing pointed object\n and the function will return a GIT_EEXISTS error code." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the lightweight tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, int force", + "sig": "git_oid *::git_repository *::const char *::const git_object *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object" + }, + "description": "

Create a new lightweight tag pointing at a target object

\n", + "comments": "

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.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "tag", + "examples": { + "tag.c": [ + "ex/v1.7.2/tag.html#git_tag_create_lightweight-19" + ] + } + }, + "git_tag_delete": { + "type": "function", + "file": "git2/tag.h", + "line": 276, + "lineto": 278, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where lives the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name of the tag to be deleted;\n this name is validated for consistency." + } + ], + "argline": "git_repository *repo, const char *tag_name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Delete an existing tag reference.

\n", + "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "tag", + "examples": { + "tag.c": [ + "ex/v1.7.2/tag.html#git_tag_delete-20" + ] + } + }, + "git_tag_list": { + "type": "function", + "file": "git2/tag.h", + "line": 293, + "lineto": 295, + "args": [ + { + "name": "tag_names", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the tags" + } + ], + "argline": "git_strarray *tag_names, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Fill a list with all the tags in the Repository

\n", + "comments": "

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.

\n", + "group": "tag" + }, + "git_tag_list_match": { + "type": "function", + "file": "git2/tag.h", + "line": 315, + "lineto": 318, + "args": [ + { + "name": "tag_names", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" + }, + { + "name": "pattern", + "type": "const char *", + "comment": "Standard fnmatch pattern" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the tags" + } + ], + "argline": "git_strarray *tag_names, const char *pattern, git_repository *repo", + "sig": "git_strarray *::const char *::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", + "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

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.

\n", + "group": "tag", + "examples": { + "tag.c": [ + "ex/v1.7.2/tag.html#git_tag_list_match-21" + ] + } + }, + "git_tag_foreach": { + "type": "function", + "file": "git2/tag.h", + "line": 339, + "lineto": 342, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository" + }, + { + "name": "callback", + "type": "git_tag_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_tag_foreach_cb callback, void *payload", + "sig": "git_repository *::git_tag_foreach_cb::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Call callback `cb' for each tag in the repository

\n", + "comments": "", + "group": "tag" + }, + "git_tag_peel": { + "type": "function", + "file": "git2/tag.h", + "line": 355, + "lineto": 357, + "args": [ + { + "name": "tag_target_out", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "tag", + "type": "const git_tag *", + "comment": "The tag to be processed" + } + ], + "argline": "git_object **tag_target_out, const git_tag *tag", + "sig": "git_object **::const git_tag *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Recursively peel a tag until a non tag git_object is found

\n", + "comments": "

The retrieved tag_target object is owned by the repository and should be closed with the git_object_free method.

\n", + "group": "tag" + }, + "git_tag_dup": { + "type": "function", + "file": "git2/tag.h", + "line": 367, + "lineto": 367, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "Pointer to store the copy of the tag" + }, + { + "name": "source", + "type": "git_tag *", + "comment": "Original tag to copy" + } + ], + "argline": "git_tag **out, git_tag *source", + "sig": "git_tag **::git_tag *", + "return": { + "type": "int", + "comment": " 0" + }, + "description": "

Create an in-memory copy of a tag. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_name_is_valid": { + "type": "function", + "file": "git2/tag.h", + "line": 379, + "lineto": 379, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given tag name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a tag name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { + "type": "int", + "comment": " 0 on success or an error code" + }, + "description": "

Determine whether a tag name is valid, meaning that (when prefixed\n with refs/tags/) that it is a valid reference name, and that any\n additional tag name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "tag" + }, + "git_trace_set": { + "type": "function", + "file": "git2/trace.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "level", + "type": "git_trace_level_t", + "comment": "Level to set tracing to" + }, + { + "name": "cb", + "type": "git_trace_cb", + "comment": "Function to call with trace data" + } + ], + "argline": "git_trace_level_t level, git_trace_cb cb", + "sig": "git_trace_level_t::git_trace_cb", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Sets the system tracing configuration to the specified level with the\n specified callback. When system events occur at a level equal to, or\n lower than, the given level they will be reported to the given callback.

\n", + "comments": "", + "group": "trace" + }, + "git_transaction_new": { + "type": "function", + "file": "git2/transaction.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "out", + "type": "git_transaction **", + "comment": "the resulting transaction" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to lock" + } + ], + "argline": "git_transaction **out, git_repository *repo", + "sig": "git_transaction **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a new transaction object

\n", + "comments": "

This does not lock anything, but sets up the transaction object to know from which repository to lock.

\n", + "group": "transaction" + }, + "git_transaction_lock_ref": { + "type": "function", + "file": "git2/transaction.h", + "line": 44, + "lineto": 44, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to lock" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error message" + }, + "description": "

Lock a reference

\n", + "comments": "

Lock the specified reference. This is the first step to updating a reference.

\n", + "group": "transaction" + }, + "git_transaction_set_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 59, + "lineto": 59, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const git_oid *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const git_oid *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", + "group": "transaction" + }, + "git_transaction_set_symbolic_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 74, + "lineto": 74, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const char *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const char *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", + "group": "transaction" + }, + "git_transaction_set_reflog": { + "type": "function", + "file": "git2/transaction.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference whose reflog to set" + }, + { + "name": "reflog", + "type": "const git_reflog *", + "comment": "the reflog as it should be written out" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_reflog *reflog", + "sig": "git_transaction *::const char *::const git_reflog *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the reflog of a reference

\n", + "comments": "

Set the specified reference's reflog. If this is combined with setting the target, that update won't be written to the reflog.

\n", + "group": "transaction" + }, + "git_transaction_remove": { + "type": "function", + "file": "git2/transaction.h", + "line": 96, + "lineto": 96, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to remove" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Remove a reference

\n", + "comments": "", + "group": "transaction" + }, + "git_transaction_commit": { + "type": "function", + "file": "git2/transaction.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Commit the changes from the transaction

\n", + "comments": "

Perform the changes that have been queued. The updates will be made one by one, and the first failure will stop the processing.

\n", + "group": "transaction" + }, + "git_transaction_free": { + "type": "function", + "file": "git2/transaction.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free the resources allocated by this transaction

\n", + "comments": "

If any references remain locked, they will be unlocked without any changes made to them.

\n", + "group": "transaction" + }, + "git_tree_lookup": { + "type": "function", + "file": "git2/tree.h", + "line": 32, + "lineto": 33, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "Pointer to the looked up tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repo to use when locating the tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "Identity of the tree to locate." + } + ], + "argline": "git_tree **out, git_repository *repo, const git_oid *id", + "sig": "git_tree **::git_repository *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a tree object from the repository.

\n", + "comments": "", + "group": "tree", + "examples": { + "commit.c": [ + "ex/v1.7.2/commit.html#git_tree_lookup-12" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tree_lookup-81", + "ex/v1.7.2/general.html#git_tree_lookup-82" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_tree_lookup-12" + ], + "merge.c": [ + "ex/v1.7.2/merge.html#git_tree_lookup-37" + ] + } + }, + "git_tree_lookup_prefix": { + "type": "function", + "file": "git2/tree.h", + "line": 47, + "lineto": 51, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "pointer to the looked up tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tree to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_tree **out, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_tree **::git_repository *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a tree object from the repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "tree" + }, + "git_tree_free": { + "type": "function", + "file": "git2/tree.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "tree", + "type": "git_tree *", + "comment": "The tree to close" + } + ], + "argline": "git_tree *tree", + "sig": "git_tree *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Close an open tree

\n", + "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", + "group": "tree", + "examples": { + "commit.c": [ + "ex/v1.7.2/commit.html#git_tree_free-13" + ], + "diff.c": [ + "ex/v1.7.2/diff.html#git_tree_free-19", + "ex/v1.7.2/diff.html#git_tree_free-20" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tree_free-83", + "ex/v1.7.2/general.html#git_tree_free-84" + ], + "init.c": [ + "ex/v1.7.2/init.html#git_tree_free-13" + ], + "log.c": [ + "ex/v1.7.2/log.html#git_tree_free-55", + "ex/v1.7.2/log.html#git_tree_free-56", + "ex/v1.7.2/log.html#git_tree_free-57", + "ex/v1.7.2/log.html#git_tree_free-58", + "ex/v1.7.2/log.html#git_tree_free-59" + ] + } + }, + "git_tree_id": { + "type": "function", + "file": "git2/tree.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the tree." + }, + "description": "

Get the id of a tree.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_owner": { + "type": "function", + "file": "git2/tree.h", + "line": 79, + "lineto": 79, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "A previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this tree." + }, + "description": "

Get the repository that contains the tree.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_entrycount": { + "type": "function", + "file": "git2/tree.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "size_t", + "comment": " the number of entries in the tree" + }, + "description": "

Get the number of entries listed in a tree

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tree_entrycount-37" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tree_entrycount-85" + ] + } + }, + "git_tree_entry_byname": { + "type": "function", + "file": "git2/tree.h", + "line": 99, + "lineto": 100, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "filename", + "type": "const char *", + "comment": "the filename of the desired entry" + } + ], + "argline": "const git_tree *tree, const char *filename", + "sig": "const git_tree *::const char *", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by its filename

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "group": "tree", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_tree_entry_byname-86" + ] + } + }, + "git_tree_entry_byindex": { + "type": "function", + "file": "git2/tree.h", + "line": 112, + "lineto": 113, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position in the entry list" + } + ], + "argline": "const git_tree *tree, size_t idx", + "sig": "const git_tree *::size_t", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by its position in the tree

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "group": "tree", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tree_entry_byindex-38" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tree_entry_byindex-87" + ] + } + }, + "git_tree_entry_byid": { + "type": "function", + "file": "git2/tree.h", + "line": 127, + "lineto": 128, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the sha being looked for" + } + ], + "argline": "const git_tree *tree, const git_oid *id", + "sig": "const git_tree *::const git_oid *", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by SHA value.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", + "group": "tree" + }, + "git_tree_entry_bypath": { + "type": "function", + "file": "git2/tree.h", + "line": 142, + "lineto": 145, + "args": [ + { + "name": "out", + "type": "git_tree_entry **", + "comment": "Pointer where to store the tree entry" + }, + { + "name": "root", + "type": "const git_tree *", + "comment": "Previously loaded tree which is the root of the relative path" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the contained entry" + } + ], + "argline": "git_tree_entry **out, const git_tree *root, const char *path", + "sig": "git_tree_entry **::const git_tree *::const char *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if the path does not exist" + }, + "description": "

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n", + "comments": "

Unlike the other lookup functions, the returned tree entry is owned by the user and must be freed explicitly with git_tree_entry_free().

\n", + "group": "tree" + }, + "git_tree_entry_dup": { + "type": "function", + "file": "git2/tree.h", + "line": 157, + "lineto": 157, + "args": [ + { + "name": "dest", + "type": "git_tree_entry **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "const git_tree_entry *", + "comment": "tree entry to duplicate" + } + ], + "argline": "git_tree_entry **dest, const git_tree_entry *source", + "sig": "git_tree_entry **::const git_tree_entry *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Duplicate a tree entry

\n", + "comments": "

Create a copy of a tree entry. The returned copy is owned by the user, and must be freed explicitly with git_tree_entry_free().

\n", + "group": "tree" + }, + "git_tree_entry_free": { + "type": "function", + "file": "git2/tree.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "entry", + "type": "git_tree_entry *", + "comment": "The entry to free" + } + ], + "argline": "git_tree_entry *entry", + "sig": "git_tree_entry *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a user-owned tree entry

\n", + "comments": "

IMPORTANT: This function is only needed for tree entries owned by the user, such as the ones returned by git_tree_entry_dup() or git_tree_entry_bypath().

\n", + "group": "tree" + }, + "git_tree_entry_name": { + "type": "function", + "file": "git2/tree.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "const char *", + "comment": " the name of the file" + }, + "description": "

Get the filename of a tree entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tree_entry_name-39" + ], + "general.c": [ + "ex/v1.7.2/general.html#git_tree_entry_name-88", + "ex/v1.7.2/general.html#git_tree_entry_name-89" + ] + } + }, + "git_tree_entry_id": { + "type": "function", + "file": "git2/tree.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "const git_oid *", + "comment": " the oid of the object" + }, + "description": "

Get the id of the object pointed by the entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tree_entry_id-40" + ] + } + }, + "git_tree_entry_type": { + "type": "function", + "file": "git2/tree.h", + "line": 192, + "lineto": 192, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_object_t", + "comment": " the type of the pointed object" + }, + "description": "

Get the type of the object pointed by the entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tree_entry_type-41" + ] + } + }, + "git_tree_entry_filemode": { + "type": "function", + "file": "git2/tree.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_filemode_t", + "comment": " filemode as an integer" + }, + "description": "

Get the UNIX file attributes of a tree entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": [ + "ex/v1.7.2/cat-file.html#git_tree_entry_filemode-42" + ] + } + }, + "git_tree_entry_filemode_raw": { + "type": "function", + "file": "git2/tree.h", + "line": 212, + "lineto": 212, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_filemode_t", + "comment": " filemode as an integer" + }, + "description": "

Get the raw UNIX file attributes of a tree entry

\n", + "comments": "

This function does not perform any normalization and is only useful if you need to be able to recreate the original tree object.

\n", + "group": "tree" + }, + "git_tree_entry_cmp": { + "type": "function", + "file": "git2/tree.h", + "line": 220, + "lineto": 220, + "args": [ + { + "name": "e1", + "type": "const git_tree_entry *", + "comment": "first tree entry" + }, + { + "name": "e2", + "type": "const git_tree_entry *", + "comment": "second tree entry" + } + ], + "argline": "const git_tree_entry *e1, const git_tree_entry *e2", + "sig": "const git_tree_entry *::const git_tree_entry *", + "return": { + "type": "int", + "comment": " \n<\n0 if e1 is before e2, 0 if e1 == e2, >0 if e1 is after e2" + }, + "description": "

Compare two tree entries

\n", + "comments": "", + "group": "tree" + }, + "git_tree_entry_to_object": { + "type": "function", + "file": "git2/tree.h", + "line": 232, + "lineto": 235, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer to the converted object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to lookup the pointed object" + }, + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "git_object **object_out, git_repository *repo, const git_tree_entry *entry", + "sig": "git_object **::git_repository *::const git_tree_entry *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Convert a tree entry to the git_object it points to.

\n", + "comments": "

You must call git_object_free() on the object when you are done with it.

\n", + "group": "tree", + "examples": { + "general.c": [ + "ex/v1.7.2/general.html#git_tree_entry_to_object-90" + ] + } + }, + "git_treebuilder_new": { + "type": "function", + "file": "git2/tree.h", + "line": 254, + "lineto": 255, + "args": [ + { + "name": "out", + "type": "git_treebuilder **", + "comment": "Pointer where to store the tree builder" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository in which to store the object" + }, + { + "name": "source", + "type": "const git_tree *", + "comment": "Source tree to initialize the builder (optional)" + } + ], + "argline": "git_treebuilder **out, git_repository *repo, const git_tree *source", + "sig": "git_treebuilder **::git_repository *::const git_tree *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Create a new tree builder.

\n", + "comments": "

The tree builder can be used to create or modify trees in memory and write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no entries and will have to be filled manually.

\n", + "group": "treebuilder" + }, + "git_treebuilder_clear": { + "type": "function", + "file": "git2/tree.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Builder to clear" + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Clear all the entries in the builder

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_entrycount": { + "type": "function", + "file": "git2/tree.h", + "line": 271, + "lineto": 271, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "a previously loaded treebuilder." + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { + "type": "size_t", + "comment": " the number of entries in the treebuilder" + }, + "description": "

Get the number of entries listed in a treebuilder

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_free": { + "type": "function", + "file": "git2/tree.h", + "line": 282, + "lineto": 282, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Builder to free" + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a tree builder

\n", + "comments": "

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

\n", + "group": "treebuilder" + }, + "git_treebuilder_get": { + "type": "function", + "file": "git2/tree.h", + "line": 294, + "lineto": 295, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Name of the entry" + } + ], + "argline": "git_treebuilder *bld, const char *filename", + "sig": "git_treebuilder *::const char *", + "return": { + "type": "const git_tree_entry *", + "comment": " pointer to the entry; NULL if not found" + }, + "description": "

Get an entry from the builder from its filename

\n", + "comments": "

The returned entry is owned by the builder and should not be freed manually.

\n", + "group": "treebuilder" + }, + "git_treebuilder_insert": { + "type": "function", + "file": "git2/tree.h", + "line": 325, + "lineto": 330, + "args": [ + { + "name": "out", + "type": "const git_tree_entry **", + "comment": "Pointer to store the entry (optional)" + }, + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Filename of the entry" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "SHA1 oid of the entry" + }, + { + "name": "filemode", + "type": "git_filemode_t", + "comment": "Folder attributes of the entry. This parameter must\n\t\t\tbe valued with one of the following entries: 0040000, 0100644,\n\t\t\t0100755, 0120000 or 0160000." + } + ], + "argline": "const git_tree_entry **out, git_treebuilder *bld, const char *filename, const git_oid *id, git_filemode_t filemode", + "sig": "const git_tree_entry **::git_treebuilder *::const char *::const git_oid *::git_filemode_t", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add or update an entry to the builder

\n", + "comments": "

Insert a new entry for filename in the builder with the given attributes.

\n\n

If an entry named filename already exists, its attributes will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the newly created/updated entry. Pass NULL if you do not need it. The pointer may not be valid past the next operation in this builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for validity; that it exists in the object database and is of the correct type. If you do not want this behavior, set the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", + "group": "treebuilder" + }, + "git_treebuilder_remove": { + "type": "function", + "file": "git2/tree.h", + "line": 339, + "lineto": 340, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Filename of the entry to remove" + } + ], + "argline": "git_treebuilder *bld, const char *filename", + "sig": "git_treebuilder *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Remove an entry from the builder by its filename

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_filter": { + "type": "function", + "file": "git2/tree.h", + "line": 364, + "lineto": 367, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filter", + "type": "git_treebuilder_filter_cb", + "comment": "Callback to filter entries" + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra data to pass to filter callback" + } + ], + "argline": "git_treebuilder *bld, git_treebuilder_filter_cb filter, void *payload", + "sig": "git_treebuilder *::git_treebuilder_filter_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Selectively remove entries in the tree

\n", + "comments": "

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 non-zero, the entry will be filtered (removed from the builder).

\n", + "group": "treebuilder" + }, + "git_treebuilder_write": { + "type": "function", + "file": "git2/tree.h", + "line": 379, + "lineto": 380, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer to store the OID of the newly written tree" + }, + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder to write" + } + ], + "argline": "git_oid *id, git_treebuilder *bld", + "sig": "git_oid *::git_treebuilder *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Write the contents of the tree builder as a tree object

\n", + "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", + "group": "treebuilder" + }, + "git_tree_walk": { + "type": "function", + "file": "git2/tree.h", + "line": 409, + "lineto": 413, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "The tree to walk" + }, + { + "name": "mode", + "type": "git_treewalk_mode", + "comment": "Traversal mode (pre or post-order)" + }, + { + "name": "callback", + "type": "git_treewalk_cb", + "comment": "Function to call on each tree entry" + }, + { + "name": "payload", + "type": "void *", + "comment": "Opaque pointer to be passed on each callback" + } + ], + "argline": "const git_tree *tree, git_treewalk_mode mode, git_treewalk_cb callback, void *payload", + "sig": "const git_tree *::git_treewalk_mode::git_treewalk_cb::void *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Traverse the entries in a tree and its subtrees in post or pre order.

\n", + "comments": "

The entries will be traversed in the specified order, children subtrees will be automatically loaded as required, and the callback will be called once per entry with the current (relative) root for the entry and the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be skipped on the traversal (in pre mode). A negative value stops the walk.

\n", + "group": "tree" + }, + "git_tree_dup": { + "type": "function", + "file": "git2/tree.h", + "line": 423, + "lineto": 423, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "Pointer to store the copy of the tree" + }, + { + "name": "source", + "type": "git_tree *", + "comment": "Original tree to copy" + } + ], + "argline": "git_tree **out, git_tree *source", + "sig": "git_tree **::git_tree *", + "return": { + "type": "int", + "comment": " 0" + }, + "description": "

Create an in-memory copy of a tree. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_create_updated": { + "type": "function", + "file": "git2/tree.h", + "line": 470, + "lineto": 470, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "id of the new tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the tree, must be the\n same as for `baseline`" + }, + { + "name": "baseline", + "type": "git_tree *", + "comment": "the tree to base these changes on" + }, + { + "name": "nupdates", + "type": "size_t", + "comment": "the number of elements in the update list" + }, + { + "name": "updates", + "type": "const git_tree_update *", + "comment": "the list of updates to perform" + } + ], + "argline": "git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates", + "sig": "git_oid *::git_repository *::git_tree *::size_t::const git_tree_update *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Create a tree based on another one with the specified modifications

\n", + "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", + "group": "tree" + }, + "git_worktree_list": { + "type": "function", + "file": "git2/worktree.h", + "line": 34, + "lineto": 34, + "args": [ + { + "name": "out", + "type": "git_strarray *", + "comment": "pointer to the array of working tree names" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when listing working trees" + } + ], + "argline": "git_strarray *out, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

List names of linked working trees

\n", + "comments": "

The returned list should be released with git_strarray_free when no longer needed.

\n", + "group": "worktree" + }, + "git_worktree_lookup": { + "type": "function", + "file": "git2/worktree.h", + "line": 44, + "lineto": 44, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Output pointer to looked up worktree or `NULL`" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing worktrees" + }, + { + "name": "name", + "type": "const char *", + "comment": "Name of the working tree to look up" + } + ], + "argline": "git_worktree **out, git_repository *repo, const char *name", + "sig": "git_worktree **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Lookup a working tree by its name for a given repository

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_open_from_repository": { + "type": "function", + "file": "git2/worktree.h", + "line": 57, + "lineto": 57, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Out-pointer for the newly allocated worktree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to look up worktree for" + } + ], + "argline": "git_worktree **out, git_repository *repo", + "sig": "git_worktree **::git_repository *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Open a worktree of a given repository

\n", + "comments": "

If a repository is not the main tree but a worktree, this function will look up the worktree inside the parent repository and create a new git_worktree structure.

\n", + "group": "worktree" + }, + "git_worktree_free": { + "type": "function", + "file": "git2/worktree.h", + "line": 64, + "lineto": 64, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "worktree handle to close. If NULL nothing occurs." + } + ], + "argline": "git_worktree *wt", + "sig": "git_worktree *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Free a previously allocated worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_validate": { + "type": "function", + "file": "git2/worktree.h", + "line": 76, + "lineto": 76, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to check" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "int", + "comment": " 0 when worktree is valid, error-code otherwise" + }, + "description": "

Check if worktree is valid

\n", + "comments": "

A valid worktree requires both the git data structures inside the linked parent repository and the linked working copy to be present.

\n", + "group": "worktree" + }, + "git_worktree_add_options_init": { + "type": "function", + "file": "git2/worktree.h", + "line": 110, + "lineto": 111, + "args": [ + { + "name": "opts", + "type": "git_worktree_add_options *", + "comment": "The `git_worktree_add_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`." + } + ], + "argline": "git_worktree_add_options *opts, unsigned int version", + "sig": "git_worktree_add_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_worktree_add_options structure

\n", + "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", + "group": "worktree" + }, + "git_worktree_add": { + "type": "function", + "file": "git2/worktree.h", + "line": 127, + "lineto": 129, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Output pointer containing new working tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to create working tree for" + }, + { + "name": "name", + "type": "const char *", + "comment": "Name of the working tree" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to create working tree at" + }, + { + "name": "opts", + "type": "const git_worktree_add_options *", + "comment": "Options to modify default behavior. May be NULL" + } + ], + "argline": "git_worktree **out, git_repository *repo, const char *name, const char *path, const git_worktree_add_options *opts", + "sig": "git_worktree **::git_repository *::const char *::const char *::const git_worktree_add_options *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Add a new working tree

\n", + "comments": "

Add a new working tree for the repository, that is create the required data structures inside the repository and check out the current HEAD at path

\n", + "group": "worktree" + }, + "git_worktree_lock": { + "type": "function", + "file": "git2/worktree.h", + "line": 141, + "lineto": 141, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to lock" + }, + { + "name": "reason", + "type": "const char *", + "comment": "Reason why the working tree is being locked" + } + ], + "argline": "git_worktree *wt, const char *reason", + "sig": "git_worktree *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero otherwise" + }, + "description": "

Lock worktree if not already locked

\n", + "comments": "

Lock a worktree, optionally specifying a reason why the linked working tree is being locked.

\n", + "group": "worktree" + }, + "git_worktree_unlock": { + "type": "function", + "file": "git2/worktree.h", + "line": 150, + "lineto": 150, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to unlock" + } + ], + "argline": "git_worktree *wt", + "sig": "git_worktree *", + "return": { + "type": "int", + "comment": " 0 on success, 1 if worktree was not locked, error-code\n otherwise" + }, + "description": "

Unlock a locked worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_is_locked": { + "type": "function", + "file": "git2/worktree.h", + "line": 164, + "lineto": 164, + "args": [ + { + "name": "reason", + "type": "git_buf *", + "comment": "Buffer to store reason in. If NULL no reason is stored." + }, + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to check" + } + ], + "argline": "git_buf *reason, const git_worktree *wt", + "sig": "git_buf *::const git_worktree *", + "return": { + "type": "int", + "comment": " 0 when the working tree not locked, a value greater\n than zero if it is locked, less than zero if there was an\n error" + }, + "description": "

Check if worktree is locked

\n", + "comments": "

A worktree may be locked if the linked working tree is stored on a portable device which is not available.

\n", + "group": "worktree" + }, + "git_worktree_name": { + "type": "function", + "file": "git2/worktree.h", + "line": 173, + "lineto": 173, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the name for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's name. The pointer returned is valid for the\n lifetime of the git_worktree" + }, + "description": "

Retrieve the name of the worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_path": { + "type": "function", + "file": "git2/worktree.h", + "line": 182, + "lineto": 182, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the path for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's filesystem path. The pointer returned\n is valid for the lifetime of the git_worktree." + }, + "description": "

Retrieve the filesystem path for the worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_prune_options_init": { + "type": "function", + "file": "git2/worktree.h", + "line": 224, + "lineto": 226, + "args": [ + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "The `git_worktree_prune_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_WORKTREE_PRUNE_OPTIONS_VERSION`." + } + ], + "argline": "git_worktree_prune_options *opts, unsigned int version", + "sig": "git_worktree_prune_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_worktree_prune_options structure

\n", + "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", + "group": "worktree" + }, + "git_worktree_is_prunable": { + "type": "function", + "file": "git2/worktree.h", + "line": 248, + "lineto": 249, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to check." + }, + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "The prunable options." + } + ], + "argline": "git_worktree *wt, git_worktree_prune_options *opts", + "sig": "git_worktree *::git_worktree_prune_options *", + "return": { + "type": "int", + "comment": " 1 if the worktree is prunable, 0 otherwise, or an error code." + }, + "description": "

Is the worktree prunable with the given options?

\n", + "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The valid member will cause this check to be ignored. - the worktree is locked. The locked flag will cause this check to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above flags have been passed in, this function will return a positive value. If the worktree is not prunable, an error message will be set (visible in giterr_last) with details about why.

\n", + "group": "worktree" + }, + "git_worktree_prune": { + "type": "function", + "file": "git2/worktree.h", + "line": 263, + "lineto": 264, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to prune" + }, + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "Specifies which checks to override. See\n `git_worktree_is_prunable`. May be NULL" + } + ], + "argline": "git_worktree *wt, git_worktree_prune_options *opts", + "sig": "git_worktree *::git_worktree_prune_options *", + "return": { + "type": "int", + "comment": " 0 or an error code" + }, + "description": "

Prune working tree

\n", + "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", + "group": "worktree" + } + }, + "callbacks": { + "git_apply_delta_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 38, + "lineto": 40, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "The delta to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_delta *delta, void *payload", + "sig": "const git_diff_delta *::void *", + "return": { + "type": "int", + "comment": " 0 if the delta is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the delta will not be applied." + }, + "description": "

When applying a patch, callback that will be made per delta (file).

\n", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the delta will not be applied, but the apply process continues - returns 0, the delta is applied, and the apply process continues.

\n" + }, + "git_apply_hunk_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 56, + "lineto": 58, + "args": [ + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "The hunk to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_hunk *hunk, void *payload", + "sig": "const git_diff_hunk *::void *", + "return": { + "type": "int", + "comment": " 0 if the hunk is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the hunk will not be applied." + }, + "description": "

When applying a patch, callback that will be made per hunk.

\n", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n" + }, + "git_attr_foreach_cb": { + "type": "callback", + "file": "git2/attr.h", + "line": 291, + "lineto": 291, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The attribute name." + }, + { + "name": "value", + "type": "const char *", + "comment": "The attribute value. May be NULL if the attribute is explicitly\n set to UNSPECIFIED using the '!' sign." + }, + { + "name": "payload", + "type": "void *", + "comment": "A user-specified pointer." + } + ], + "argline": "const char *name, const char *value, void *payload", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to continue looping, non-zero to stop. This value will be returned\n from git_attr_foreach." + }, + "description": "

The callback used with git_attr_foreach.

\n", + "comments": "

This callback will be invoked only once per attribute name, even if there are multiple rules for a given file. The highest priority rule will be used.

\n" + }, + "git_transport_certificate_check_cb": { + "type": "callback", + "file": "git2/cert.h", + "line": 72, + "lineto": 72, + "args": [ + { + "name": "cert", + "type": "git_cert *", + "comment": "The host certificate" + }, + { + "name": "valid", + "type": "int", + "comment": "Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid" + }, + { + "name": "host", + "type": "const char *", + "comment": "Hostname of the host libgit2 connected to" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_cert *cert, int valid, const char *host, void *payload", + "sig": "git_cert *::int::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" + }, + "description": "

Callback for the user's custom certificate checks.

\n", "comments": "" - }, - { - "type": "git_proxy_t", - "name": "type", - "comments": " The type of proxy to use, by URL, auto-detect." - }, - { - "type": "const char *", - "name": "url", - "comments": " The URL of the proxy." - }, - { - "type": "git_credential_acquire_cb", - "name": "credentials", - "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." - }, - { - "type": "git_transport_certificate_check_cb", - "name": "certificate_check", - "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." - }, - { - "type": "void *", - "name": "payload", - "comments": " Payload to be provided to the credentials and certificate\n check callbacks." - } - ], - "used": { - "returns": [], - "needs": [ - "git_proxy_options_init", - "git_remote_connect" - ] - } - } - ], - [ - "git_proxy_t", - { - "decl": [ - "GIT_PROXY_NONE", - "GIT_PROXY_AUTO", - "GIT_PROXY_SPECIFIED" - ], - "type": "enum", - "file": "git2/proxy.h", - "line": 20, - "lineto": 36, - "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", - "tdef": "typedef", - "description": " The type of proxy to use.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PROXY_NONE", - "comments": "

Do not attempt to connect through a proxy

\n\n

If built against libcurl, it itself may attempt to connect\n to a proxy if the environment variables specify it.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PROXY_AUTO", - "comments": "

Try to auto-detect the proxy from the git configuration.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_PROXY_SPECIFIED", - "comments": "

Connect via the URL given in the options

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_push", - { - "decl": "git_push", - "type": "struct", - "value": "git_push", - "file": "git2/types.h", - "line": 253, - "lineto": 253, - "tdef": "typedef", - "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_push_negotiation", - "git_push_options_init", - "git_remote_push", - "git_remote_upload" - ] - } - } - ], - [ - "git_push_options", - { - "decl": [ - "unsigned int version", - "unsigned int pb_parallelism", - "git_remote_callbacks callbacks", - "git_proxy_options proxy_opts", - "git_strarray custom_headers" - ], - "type": "struct", - "value": "git_push_options", - "file": "git2/remote.h", - "line": 765, - "lineto": 792, - "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_strarray custom_headers", - "tdef": "typedef", - "description": " Controls the behavior of a git_push object.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_checkout_notify_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 255, + "lineto": 261, + "args": [ + { + "name": "why", + "type": "git_checkout_notify_t", + "comment": null + }, + { + "name": "path", + "type": "const char *", + "comment": null + }, + { + "name": "baseline", + "type": "const git_diff_file *", + "comment": null + }, + { + "name": "target", + "type": "const git_diff_file *", + "comment": null + }, + { + "name": "workdir", + "type": "const git_diff_file *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload", + "sig": "git_checkout_notify_t::const char *::const git_diff_file *::const git_diff_file *::const git_diff_file *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Checkout notification callback function

\n", "comments": "" - }, - { - "type": "unsigned int", - "name": "pb_parallelism", - "comments": " If the transport being used to push to the remote requires the creation\n of a pack file, this controls the number of worker threads used by\n the packbuilder when creating that pack file to be sent to the remote.\n\n If set to 0, the packbuilder will auto-detect the number of threads\n to create. The default value is 1." - }, - { - "type": "git_remote_callbacks", - "name": "callbacks", - "comments": " Callbacks to use for this push operation" - }, - { - "type": "git_proxy_options", - "name": "proxy_opts", - "comments": " Proxy options to use, by default no proxy is used." - }, - { - "type": "git_strarray", - "name": "custom_headers", - "comments": " Extra headers for this push operation" - } - ], - "used": { - "returns": [], - "needs": [ - "git_push_options_init", - "git_remote_push", - "git_remote_upload" - ] - } - } - ], - [ - "git_push_update", - { - "decl": [ - "char * src_refname", - "char * dst_refname", - "git_oid src", - "git_oid dst" - ], - "type": "struct", - "value": "git_push_update", - "file": "git2/remote.h", - "line": 459, - "lineto": 476, - "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", - "tdef": "typedef", - "description": " Represents an update which will be performed on the remote during push", - "comments": "", - "fields": [ - { - "type": "char *", - "name": "src_refname", - "comments": " The source name of the reference" - }, - { - "type": "char *", - "name": "dst_refname", - "comments": " The name of the reference to update on the server" - }, - { - "type": "git_oid", - "name": "src", - "comments": " The current target of the reference" - }, - { - "type": "git_oid", - "name": "dst", - "comments": " The new target for the reference" - } - ], - "used": { - "returns": [], - "needs": [ - "git_push_negotiation" - ] - } - } - ], - [ - "git_rebase", - { - "decl": "git_rebase", - "type": "struct", - "value": "git_rebase", - "file": "git2/types.h", - "line": 204, - "lineto": 204, - "tdef": "typedef", - "description": " Representation of a rebase ", - "comments": "", - "used": { - "returns": [ - "git_rebase_operation_byindex" - ], - "needs": [ - "git_rebase_abort", - "git_rebase_commit", - "git_rebase_finish", - "git_rebase_free", - "git_rebase_init", - "git_rebase_inmemory_index", - "git_rebase_next", - "git_rebase_onto_id", - "git_rebase_onto_name", - "git_rebase_open", - "git_rebase_operation_byindex", - "git_rebase_operation_current", - "git_rebase_operation_entrycount", - "git_rebase_options_init", - "git_rebase_orig_head_id", - "git_rebase_orig_head_name" - ] - } - } - ], - [ - "git_rebase_operation", - { - "decl": [ - "git_rebase_operation_t type", - "const git_oid id", - "const char * exec" - ], - "type": "struct", - "value": "git_rebase_operation", - "file": "git2/rebase.h", - "line": 172, - "lineto": 187, - "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", - "tdef": "typedef", - "description": " A rebase operation", - "comments": "

Describes a single instruction/operation to be performed during the rebase.

\n", - "fields": [ - { - "type": "git_rebase_operation_t", - "name": "type", - "comments": " The type of rebase operation. " - }, - { - "type": "const git_oid", - "name": "id", - "comments": " The commit ID being cherry-picked. This will be populated for\n all operations except those of type `GIT_REBASE_OPERATION_EXEC`." - }, - { - "type": "const char *", - "name": "exec", - "comments": " The executable the user has requested be run. This will only\n be populated for operations of type `GIT_REBASE_OPERATION_EXEC`." - } - ], - "used": { - "returns": [ - "git_rebase_operation_byindex" - ], - "needs": [ - "git_rebase_next" - ] - } - } - ], - [ - "git_rebase_operation_t", - { - "decl": [ - "GIT_REBASE_OPERATION_PICK", - "GIT_REBASE_OPERATION_REWORD", - "GIT_REBASE_OPERATION_EDIT", - "GIT_REBASE_OPERATION_SQUASH", - "GIT_REBASE_OPERATION_FIXUP", - "GIT_REBASE_OPERATION_EXEC" - ], - "type": "enum", - "file": "git2/rebase.h", - "line": 120, - "lineto": 156, - "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", - "tdef": "typedef", - "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REBASE_OPERATION_PICK", - "comments": "

The given commit is to be cherry-picked. The client should commit\n the changes and continue if there are no conflicts.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_REWORD", - "comments": "

The given commit is to be cherry-picked, but the client should prompt\n the user to provide an updated commit message.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_EDIT", - "comments": "

The given commit is to be cherry-picked, but the client should stop\n to allow the user to edit the changes before committing them.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_SQUASH", - "comments": "

The given commit is to be squashed into the previous commit. The\n commit message will be merged with the previous message.

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_FIXUP", - "comments": "

The given commit is to be squashed into the previous commit. The\n commit message from this commit will be discarded.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_EXEC", - "comments": "

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n", - "value": 5 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_rebase_options", - { - "decl": [ - "unsigned int version", - "int quiet", - "int inmemory", - "const char * rewrite_notes_ref", - "git_merge_options merge_options", - "git_checkout_options checkout_options", - "git_commit_create_cb commit_create_cb", - "int (*)(git_buf *, git_buf *, const char *, void *) signing_cb", - "void * payload" - ], - "type": "struct", - "value": "git_rebase_options", - "file": "git2/rebase.h", - "line": 32, - "lineto": 115, - "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_create_cb commit_create_cb\nint (*)(git_buf *, git_buf *, const char *, void *) signing_cb\nvoid * payload", - "tdef": "typedef", - "description": " Rebase options", - "comments": "

Use to tell the rebase machinery how to operate.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_checkout_progress_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 264, + "lineto": 268, + "args": [ + { + "name": "path", + "type": "const char *", + "comment": null + }, + { + "name": "completed_steps", + "type": "size_t", + "comment": null + }, + { + "name": "total_steps", + "type": "size_t", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const char *path, size_t completed_steps, size_t total_steps, void *payload", + "sig": "const char *::size_t::size_t::void *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Checkout progress notification function

\n", "comments": "" - }, - { - "type": "int", - "name": "quiet", - "comments": " Used by `git_rebase_init`, this will instruct other clients working\n on this rebase that you want a quiet rebase experience, which they\n may choose to provide in an application-specific manner. This has no\n effect upon libgit2 directly, but is provided for interoperability\n between Git tools." - }, - { - "type": "int", - "name": "inmemory", - "comments": " Used by `git_rebase_init`, this will begin an in-memory rebase,\n which will allow callers to step through the rebase operations and\n commit the rebased changes, but will not rewind HEAD or update the\n repository to be in a rebasing state. This will not interfere with\n the working directory (if there is one)." - }, - { - "type": "const char *", - "name": "rewrite_notes_ref", - "comments": " Used by `git_rebase_finish`, this is the name of the notes reference\n used to rewrite notes for rebased commits when finishing the rebase;\n if NULL, the contents of the configuration option `notes.rewriteRef`\n is examined, unless the configuration option `notes.rewrite.rebase`\n is set to false. If `notes.rewriteRef` is also NULL, notes will\n not be rewritten." - }, - { - "type": "git_merge_options", - "name": "merge_options", - "comments": " Options to control how trees are merged during `git_rebase_next`." - }, - { - "type": "git_checkout_options", - "name": "checkout_options", - "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." - }, - { - "type": "git_commit_create_cb", - "name": "commit_create_cb", - "comments": " Optional callback that allows users to override commit\n creation in `git_rebase_commit`. If specified, users can\n create their own commit and provide the commit ID, which\n may be useful for signing commits or otherwise customizing\n the commit creation.\n\n If this callback returns `GIT_PASSTHROUGH`, then\n `git_rebase_commit` will continue to create the commit." - }, - { - "type": "int (*)(git_buf *, git_buf *, const char *, void *)", - "name": "signing_cb", - "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n\n This field is only used when performing git_rebase_commit.\n\n This callback is not invoked if a `git_commit_create_cb` is\n specified.\n\n This callback is deprecated; users should provide a\n creation callback as `commit_create_cb` that produces a\n commit buffer, signs it, and commits it." - }, - { - "type": "void *", - "name": "payload", - "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." - } - ], - "used": { - "returns": [], - "needs": [ - "git_rebase_init", - "git_rebase_open", - "git_rebase_options_init" - ] - } - } - ], - [ - "git_refdb", - { - "decl": "git_refdb", - "type": "struct", - "value": "git_refdb", - "file": "git2/types.h", - "line": 103, - "lineto": 103, - "tdef": "typedef", - "description": " An open refs database handle. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_refdb_compress", - "git_refdb_free", - "git_refdb_new", - "git_refdb_open", - "git_repository_refdb" - ] - } - } - ], - [ - "git_refdb_backend", - { - "decl": "git_refdb_backend", - "type": "struct", - "value": "git_refdb_backend", - "file": "git2/types.h", - "line": 106, - "lineto": 106, - "tdef": "typedef", - "description": " A custom backend for refs ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_reference", - { - "decl": "git_reference", - "type": "struct", - "value": "git_reference", - "file": "git2/types.h", - "line": 189, - "lineto": 189, - "tdef": "typedef", - "description": " In-memory representation of a reference. ", - "comments": "", - "used": { - "returns": [ - "git_reference_type" - ], - "needs": [ - "git_annotated_commit_from_ref", - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_delete", - "git_branch_is_checked_out", - "git_branch_is_head", - "git_branch_lookup", - "git_branch_move", - "git_branch_name", - "git_branch_next", - "git_branch_set_upstream", - "git_branch_upstream", - "git_merge_analysis_for_ref", - "git_reference_cmp", - "git_reference_create", - "git_reference_create_matching", - "git_reference_delete", - "git_reference_dup", - "git_reference_dwim", - "git_reference_foreach", - "git_reference_foreach_cb", - "git_reference_foreach_glob", - "git_reference_foreach_name", - "git_reference_free", - "git_reference_is_branch", - "git_reference_is_note", - "git_reference_is_remote", - "git_reference_is_tag", - "git_reference_iterator_free", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_lookup", - "git_reference_name", - "git_reference_next", - "git_reference_next_name", - "git_reference_owner", - "git_reference_peel", - "git_reference_rename", - "git_reference_resolve", - "git_reference_set_target", - "git_reference_shorthand", - "git_reference_symbolic_create", - "git_reference_symbolic_create_matching", - "git_reference_symbolic_set_target", - "git_reference_symbolic_target", - "git_reference_target", - "git_reference_target_peel", - "git_reference_type", - "git_repository_head", - "git_repository_head_for_worktree", - "git_revparse_ext" - ] - } - } - ], - [ - "git_reference_format_t", - { - "decl": [ - "GIT_REFERENCE_FORMAT_NORMAL", - "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", - "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", - "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND" - ], - "type": "enum", - "file": "git2/refs.h", - "line": 661, - "lineto": 690, - "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", - "tdef": "typedef", - "description": " Normalization options for reference lookup", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_NORMAL", - "comments": "

No particular normalization.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", - "comments": "

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", - "comments": "

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", - "comments": "

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_reference_iterator", - { - "decl": "git_reference_iterator", - "type": "struct", - "value": "git_reference_iterator", - "file": "git2/types.h", - "line": 192, - "lineto": 192, - "tdef": "typedef", - "description": " Iterator for references ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_reference_iterator_free", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_next", - "git_reference_next_name" - ] - } - } - ], - [ - "git_reference_t", - { - "decl": [ - "GIT_REFERENCE_INVALID", - "GIT_REFERENCE_DIRECT", - "GIT_REFERENCE_SYMBOLIC", - "GIT_REFERENCE_ALL" - ], - "type": "enum", - "file": "git2/types.h", - "line": 207, - "lineto": 212, - "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", - "tdef": "typedef", - "description": " Basic type of any Git reference. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REFERENCE_INVALID", - "comments": "

Invalid reference

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REFERENCE_DIRECT", - "comments": "

A reference that points at an object id

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REFERENCE_SYMBOLIC", - "comments": "

A reference that points at another reference

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REFERENCE_ALL", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [ - "git_reference_type" - ], - "needs": [] - } - } - ], - [ - "git_reflog", - { - "decl": "git_reflog", - "type": "struct", - "value": "git_reflog", - "file": "git2/types.h", - "line": 166, - "lineto": 166, - "tdef": "typedef", - "description": " Representation of a reference log ", - "comments": "", - "used": { - "returns": [ - "git_reflog_entry_byindex" - ], - "needs": [ - "git_reflog_append", - "git_reflog_drop", - "git_reflog_entry_byindex", - "git_reflog_entry_committer", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_reflog_entry_message", - "git_reflog_entrycount", - "git_reflog_free", - "git_reflog_read", - "git_reflog_write", - "git_transaction_set_reflog" - ] - } - } - ], - [ - "git_reflog_entry", - { - "decl": "git_reflog_entry", - "type": "struct", - "value": "git_reflog_entry", - "file": "git2/types.h", - "line": 163, - "lineto": 163, - "tdef": "typedef", - "description": " Representation of a reference log entry ", - "comments": "", - "used": { - "returns": [ - "git_reflog_entry_byindex" - ], - "needs": [ - "git_reflog_entry_committer", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_reflog_entry_message" - ] - } - } - ], - [ - "git_refspec", - { - "decl": "git_refspec", - "type": "struct", - "value": "git_refspec", - "file": "git2/types.h", - "line": 235, - "lineto": 235, - "tdef": "typedef", - "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", - "comments": "", - "used": { - "returns": [ - "git_remote_get_refspec" - ], - "needs": [ - "git_refspec_direction", - "git_refspec_dst", - "git_refspec_dst_matches", - "git_refspec_force", - "git_refspec_free", - "git_refspec_parse", - "git_refspec_rtransform", - "git_refspec_src", - "git_refspec_src_matches", - "git_refspec_string", - "git_refspec_transform" - ] - } - } - ], - [ - "git_remote", - { - "decl": "git_remote", - "type": "struct", - "value": "git_remote", - "file": "git2/types.h", - "line": 241, - "lineto": 241, - "tdef": "typedef", - "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entires).", - "comments": "", - "used": { - "returns": [ - "git_remote_autotag" - ], - "needs": [ - "git_headlist_cb", - "git_remote_autotag", - "git_remote_connect", - "git_remote_connected", - "git_remote_create", - "git_remote_create_anonymous", - "git_remote_create_cb", - "git_remote_create_detached", - "git_remote_create_options_init", - "git_remote_create_with_fetchspec", - "git_remote_create_with_opts", - "git_remote_default_branch", - "git_remote_disconnect", - "git_remote_download", - "git_remote_dup", - "git_remote_fetch", - "git_remote_free", - "git_remote_get_fetch_refspecs", - "git_remote_get_push_refspecs", - "git_remote_get_refspec", - "git_remote_init_callbacks", - "git_remote_lookup", - "git_remote_ls", - "git_remote_name", - "git_remote_owner", - "git_remote_prune", - "git_remote_prune_refs", - "git_remote_push", - "git_remote_pushurl", - "git_remote_ready_cb", - "git_remote_refspec_count", - "git_remote_set_autotag", - "git_remote_set_instance_pushurl", - "git_remote_set_instance_url", - "git_remote_stats", - "git_remote_stop", - "git_remote_update_tips", - "git_remote_upload", - "git_remote_url", - "git_transport_cb" - ] - } - } - ], - [ - "git_remote_autotag_option_t", - { - "decl": [ - "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", - "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", - "GIT_REMOTE_DOWNLOAD_TAGS_NONE", - "GIT_REMOTE_DOWNLOAD_TAGS_ALL" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 676, - "lineto": 694, - "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", - "tdef": "typedef", - "description": " Automatic tag following option", - "comments": "

Lets us select the --tags option to use.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", - "comments": "

Use the setting from the configuration.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", - "comments": "

Ask the server for tags pointing to objects we're already\n downloading.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_NONE", - "comments": "

Don't ask for any tags beyond the refspecs.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_ALL", - "comments": "

Ask for the all the tags.

\n", - "value": 3 - } - ], - "used": { - "returns": [ - "git_remote_autotag" - ], - "needs": [ - "git_remote_set_autotag", - "git_remote_update_tips" - ] - } - } - ], - [ - "git_remote_callbacks", - { - "decl": [ - "unsigned int version", - "git_transport_message_cb sideband_progress", - "int (*)(git_remote_completion_t, void *) completion", - "git_credential_acquire_cb credentials", - "git_transport_certificate_check_cb certificate_check", - "git_indexer_progress_cb transfer_progress", - "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", - "git_packbuilder_progress pack_progress", - "git_push_transfer_progress_cb push_transfer_progress", - "git_push_update_reference_cb push_update_reference", - "git_push_negotiation push_negotiation", - "git_transport_cb transport", - "git_remote_ready_cb remote_ready", - "void * payload", - "git_url_resolve_cb resolve_url" - ], - "type": "struct", - "value": "git_remote_callbacks", - "file": "git2/remote.h", - "line": 537, - "lineto": 638, - "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url", - "tdef": null, - "description": " The callback settings structure", - "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The version " - }, - { - "type": "git_transport_message_cb", - "name": "sideband_progress", - "comments": " Textual progress from the remote. Text send over the\n progress side-band will be passed to this function (this is\n the 'counting objects' output)." - }, - { - "type": "int (*)(git_remote_completion_t, void *)", - "name": "completion", + }, + "git_checkout_perfdata_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 271, + "lineto": 273, + "args": [ + { + "name": "perfdata", + "type": "const git_checkout_perfdata *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_checkout_perfdata *perfdata, void *payload", + "sig": "const git_checkout_perfdata *::void *", + "return": { + "type": "void", + "comment": null + }, + "description": "

Checkout perfdata notification function

\n", "comments": "" - }, - { - "type": "git_credential_acquire_cb", - "name": "credentials", - "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." - }, - { - "type": "git_transport_certificate_check_cb", - "name": "certificate_check", - "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." - }, - { - "type": "git_indexer_progress_cb", - "name": "transfer_progress", - "comments": " During the download of new data, this will be regularly\n called with the current count of progress done by the\n indexer." - }, - { - "type": "int (*)(const char *, const git_oid *, const git_oid *, void *)", - "name": "update_tips", + }, + "git_remote_create_cb": { + "type": "callback", + "file": "git2/clone.h", + "line": 69, + "lineto": 74, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "payload", + "type": "void *", + "comment": "an opaque payload" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, void *payload", + "sig": "git_remote **::git_repository *::const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n", + "comments": "

Callers of git_clone may provide a function matching this signature to override the remote creation and customization process during a clone operation.

\n" + }, + "git_repository_create_cb": { + "type": "callback", + "file": "git2/clone.h", + "line": 90, + "lineto": 94, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "the resulting repository" + }, + { + "name": "path", + "type": "const char *", + "comment": "path in which to create the repository" + }, + { + "name": "bare", + "type": "int", + "comment": "whether the repository is bare. This is the value from the clone options" + }, + { + "name": "payload", + "type": "void *", + "comment": "payload specified by the options" + } + ], + "argline": "git_repository **out, const char *path, int bare, void *payload", + "sig": "git_repository **::const char *::int::void *", + "return": { + "type": "int", + "comment": " 0, or a negative value to indicate error" + }, + "description": "

The signature of a function matching git_repository_init, with an\n additional void * as callback payload.

\n", + "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" + }, + "git_commit_create_cb": { + "type": "callback", + "file": "git2/commit.h", + "line": 533, + "lineto": 542, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer that this callback will populate with the object\n id of the commit that is created" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "the author name and time of the commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "the committer name and time of the commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "the encoding of the given message, or NULL\n to assume UTF8" + }, + { + "name": "message", + "type": "const char *", + "comment": "the commit message" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "the tree to be committed" + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "the number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "the commit parents" + }, + { + "name": "payload", + "type": "void *", + "comment": "the payload pointer in the rebase options" + } + ], + "argline": "git_oid *out, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents, void *payload", + "sig": "git_oid *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]::void *", + "return": { + "type": "int", + "comment": " 0 if this callback has created the commit and populated the out\n parameter, GIT_PASSTHROUGH if the callback has not created a\n commit and wants the calling function to create the commit as\n if no callback had been specified, any other value to stop\n and return a failure" + }, + "description": "

Commit creation callback: used when a function is going to create\n commits (for example, in git_rebase_commit) to allow callers to\n override the commit creation behavior. For example, users may\n wish to sign commits by providing this information to\n git_commit_create_buffer, signing that buffer, then calling\n git_commit_create_with_signature. The resultant commit id\n should be set in the out object id parameter.

\n", "comments": "" - }, - { - "type": "git_packbuilder_progress", - "name": "pack_progress", - "comments": " Function to call with progress information during pack\n building. Be aware that this is called inline with pack\n building operations, so performance may be affected." - }, - { - "type": "git_push_transfer_progress_cb", - "name": "push_transfer_progress", - "comments": " Function to call with progress information during the\n upload portion of a push. Be aware that this is called\n inline with pack building operations, so performance may be\n affected." - }, - { - "type": "git_push_update_reference_cb", - "name": "push_update_reference", - "comments": " See documentation of git_push_update_reference_cb" - }, - { - "type": "git_push_negotiation", - "name": "push_negotiation", - "comments": " Called once between the negotiation step and the upload. It\n provides information about what updates will be performed." - }, - { - "type": "git_transport_cb", - "name": "transport", - "comments": " Create the transport to use for this operation. Leave NULL\n to auto-detect." - }, - { - "type": "git_remote_ready_cb", - "name": "remote_ready", - "comments": " Callback when the remote is ready to connect." - }, - { - "type": "void *", - "name": "payload", - "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." - }, - { - "type": "git_url_resolve_cb", - "name": "resolve_url", - "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead.\n\n This callback is deprecated; users should use\n git_remote_ready_cb and configure the instance URL instead." - } - ], - "used": { - "returns": [], - "needs": [ - "git_remote_connect", - "git_remote_init_callbacks", - "git_remote_prune", - "git_remote_update_tips" - ] - } - } - ], - [ - "git_remote_completion_t", - { - "decl": [ - "GIT_REMOTE_COMPLETION_DOWNLOAD", - "GIT_REMOTE_COMPLETION_INDEXING", - "GIT_REMOTE_COMPLETION_ERROR" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 443, - "lineto": 447, - "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", - "tdef": "typedef", - "description": " Argument to the completion callback which tells it which operation\n finished.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REMOTE_COMPLETION_DOWNLOAD", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REMOTE_COMPLETION_INDEXING", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REMOTE_COMPLETION_ERROR", - "comments": "", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_remote_create_flags", - { - "decl": [ - "GIT_REMOTE_CREATE_SKIP_INSTEADOF", - "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 47, - "lineto": 53, - "block": "GIT_REMOTE_CREATE_SKIP_INSTEADOF\nGIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", - "tdef": "typedef", - "description": " Remote creation options flags", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REMOTE_CREATE_SKIP_INSTEADOF", - "comments": "

Ignore the repository apply.insteadOf configuration

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", - "comments": "

Don't build a fetchspec from the name if none is set

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_remote_create_options", - { - "decl": [ - "unsigned int version", - "git_repository * repository", - "const char * name", - "const char * fetchspec", - "unsigned int flags" - ], - "type": "struct", - "value": "git_remote_create_options", - "file": "git2/remote.h", - "line": 62, - "lineto": 82, - "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", - "tdef": "typedef", - "description": " Remote creation options structure", - "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_config_foreach_cb": { + "type": "callback", + "file": "git2/config.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "entry", + "type": "const git_config_entry *", + "comment": "the entry currently being enumerated" + }, + { + "name": "payload", + "type": "void *", + "comment": "a user-specified pointer" + } + ], + "argline": "const git_config_entry *entry, void *payload", + "sig": "const git_config_entry *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration." + }, + "description": "

A config enumeration callback

\n", "comments": "" - }, - { - "type": "git_repository *", - "name": "repository", - "comments": " The repository that should own the remote.\n Setting this to NULL results in a detached remote." - }, - { - "type": "const char *", - "name": "name", - "comments": " The remote's name.\n Setting this to NULL results in an in-memory/anonymous remote." - }, - { - "type": "const char *", - "name": "fetchspec", - "comments": " The fetchspec the remote should use. " - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " Additional flags for the remote. See git_remote_create_flags. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_remote_create_options_init", - "git_remote_create_with_opts" - ] - } - } - ], - [ - "git_remote_head", - { - "decl": [ - "int local", - "git_oid oid", - "git_oid loid", - "char * name", - "char * symref_target" - ], - "type": "struct", - "value": "git_remote_head", - "file": "git2/net.h", - "line": 40, - "lineto": 50, - "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", - "tdef": null, - "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "local", + }, + "git_credential_acquire_cb": { + "type": "callback", + "file": "git2/credential.h", + "line": 131, + "lineto": 136, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "url", + "type": "const char *", + "comment": "The resource for which we are demanding a credential." + }, + { + "name": "username_from_url", + "type": "const char *", + "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." + }, + { + "name": "allowed_types", + "type": "unsigned int", + "comment": "A bitmask stating which credential types are OK to return." + }, + { + "name": "payload", + "type": "void *", + "comment": "The payload provided when specifying this callback." + } + ], + "argline": "git_credential **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", + "return": { + "type": "int", + "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" + }, + "description": "

Credential acquisition callback.

\n", + "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" + }, + "git_commit_signing_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 276, + "lineto": 280, + "args": [ + { + "name": "signature", + "type": "git_buf *", + "comment": null + }, + { + "name": "signature_field", + "type": "git_buf *", + "comment": null + }, + { + "name": "commit_content", + "type": "const char *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", + "sig": "git_buf *::git_buf *::const char *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Provide a commit signature during commit creation.

\n", + "comments": "

Callers should instead define a git_commit_create_cb that generates a commit buffer using git_commit_create_buffer, sign that buffer and call git_commit_create_with_signature.

\n" + }, + "git_headlist_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 855, + "lineto": 855, + "args": [ + { + "name": "rhead", + "type": "git_remote_head *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_remote_head *rhead, void *payload", + "sig": "git_remote_head *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for listing the remote heads

\n", "comments": "" - }, - { - "type": "git_oid", - "name": "oid", + }, + "git_diff_notify_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 346, + "lineto": 350, + "args": [ + { + "name": "diff_so_far", + "type": "const git_diff *", + "comment": null + }, + { + "name": "delta_to_add", + "type": "const git_diff_delta *", + "comment": null + }, + { + "name": "matched_pathspec", + "type": "const char *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_diff *diff_so_far, const git_diff_delta *delta_to_add, const char *matched_pathspec, void *payload", + "sig": "const git_diff *::const git_diff_delta *::const char *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Diff notification callback function.

\n", + "comments": "

The callback will be called for each file, just before the git_diff_delta gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" + }, + "git_diff_progress_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 362, + "lineto": 366, + "args": [ + { + "name": "diff_so_far", + "type": "const git_diff *", + "comment": "The diff being generated." + }, + { + "name": "old_path", + "type": "const char *", + "comment": "The path to the old file or NULL." + }, + { + "name": "new_path", + "type": "const char *", + "comment": "The path to the new file or NULL." + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_diff *diff_so_far, const char *old_path, const char *new_path, void *payload", + "sig": "const git_diff *::const char *::const char *::void *", + "return": { + "type": "int", + "comment": " Non-zero to abort the diff." + }, + "description": "

Diff progress callback.

\n", + "comments": "

Called before each file comparison.

\n" + }, + "git_diff_file_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 496, + "lineto": 499, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "A pointer to the delta data for the file" + }, + { + "name": "progress", + "type": "float", + "comment": "Goes from 0 to 1 over the diff" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified pointer from foreach function" + } + ], + "argline": "const git_diff_delta *delta, float progress, void *payload", + "sig": "const git_diff_delta *::float::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

When iterating over a diff, callback that will be made per file.

\n", "comments": "" - }, - { - "type": "git_oid", - "name": "loid", + }, + "git_diff_binary_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 562, + "lineto": 565, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": null + }, + { + "name": "binary", + "type": "const git_diff_binary *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_diff_delta *delta, const git_diff_binary *binary, void *payload", + "sig": "const git_diff_delta *::const git_diff_binary *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

When iterating over a diff, callback that will be made for\n binary content within the diff.

\n", "comments": "" - }, - { - "type": "char *", - "name": "name", + }, + "git_diff_hunk_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 588, + "lineto": 591, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": null + }, + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload", + "sig": "const git_diff_delta *::const git_diff_hunk *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

When iterating over a diff, callback that will be made per hunk.

\n", "comments": "" - }, - { - "type": "char *", - "name": "symref_target", - "comments": " If the server send a symref mapping for this ref, this will\n point to the target." - } - ], - "used": { - "returns": [], - "needs": [ - "git_headlist_cb", - "git_remote_ls" - ] - } - } - ], - [ - "git_repository", - { - "decl": "git_repository", - "type": "struct", - "value": "git_repository", - "file": "git2/types.h", - "line": 118, - "lineto": 118, - "tdef": "typedef", - "description": " Representation of an existing git repository,\n including all its object contents", - "comments": "", - "used": { - "returns": [ - "git_blob_owner", - "git_commit_owner", - "git_index_owner", - "git_object_owner", - "git_patch_owner", - "git_reference_owner", - "git_remote_owner", - "git_revwalk_repository", - "git_submodule_owner", - "git_tag_owner", - "git_tree_owner" - ], - "needs": [ - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_from_ref", - "git_annotated_commit_from_revspec", - "git_annotated_commit_lookup", - "git_apply", - "git_apply_to_tree", - "git_attr_add_macro", - "git_attr_cache_flush", - "git_attr_foreach", - "git_attr_foreach_ext", - "git_attr_get", - "git_attr_get_ext", - "git_attr_get_many", - "git_attr_get_many_ext", - "git_blame_file", - "git_blob_create_from_buffer", - "git_blob_create_from_disk", - "git_blob_create_from_stream", - "git_blob_create_from_workdir", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_iterator_new", - "git_branch_lookup", - "git_branch_remote_name", - "git_branch_upstream_merge", - "git_branch_upstream_name", - "git_branch_upstream_remote", - "git_checkout_head", - "git_checkout_index", - "git_checkout_tree", - "git_cherrypick", - "git_cherrypick_commit", - "git_clone", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_v", - "git_commit_create_with_signature", - "git_commit_extract_signature", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_config_add_file_ondisk", - "git_describe_workdir", - "git_diff_commit_as_email", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_filter_list_apply_to_file", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_file", - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any", - "git_ignore_add_rule", - "git_ignore_clear_internal_rules", - "git_ignore_path_is_ignored", - "git_index_write_tree_to", - "git_mailmap_from_repository", - "git_merge", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_merge_base", - "git_merge_base_many", - "git_merge_base_octopus", - "git_merge_bases", - "git_merge_bases_many", - "git_merge_commits", - "git_merge_file_from_index", - "git_merge_trees", - "git_note_commit_create", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_create", - "git_note_default_ref", - "git_note_foreach", - "git_note_iterator_new", - "git_note_read", - "git_note_remove", - "git_object_lookup", - "git_object_lookup_prefix", - "git_packbuilder_new", - "git_pathspec_match_workdir", - "git_rebase_init", - "git_rebase_open", - "git_refdb_new", - "git_refdb_open", - "git_reference_create", - "git_reference_create_matching", - "git_reference_dwim", - "git_reference_ensure_log", - "git_reference_foreach", - "git_reference_foreach_glob", - "git_reference_foreach_name", - "git_reference_has_log", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_list", - "git_reference_lookup", - "git_reference_name_to_id", - "git_reference_remove", - "git_reference_symbolic_create", - "git_reference_symbolic_create_matching", - "git_reflog_delete", - "git_reflog_read", - "git_reflog_rename", - "git_remote_add_fetch", - "git_remote_add_push", - "git_remote_create", - "git_remote_create_anonymous", - "git_remote_create_cb", - "git_remote_create_with_fetchspec", - "git_remote_delete", - "git_remote_list", - "git_remote_lookup", - "git_remote_rename", - "git_remote_set_autotag", - "git_remote_set_pushurl", - "git_remote_set_url", - "git_repository_commondir", - "git_repository_config", - "git_repository_config_snapshot", - "git_repository_create_cb", - "git_repository_detach_head", - "git_repository_fetchhead_foreach", - "git_repository_free", - "git_repository_get_namespace", - "git_repository_hashfile", - "git_repository_head", - "git_repository_head_detached", - "git_repository_head_detached_for_worktree", - "git_repository_head_for_worktree", - "git_repository_head_unborn", - "git_repository_ident", - "git_repository_index", - "git_repository_init", - "git_repository_init_ext", - "git_repository_init_options_init", - "git_repository_is_bare", - "git_repository_is_empty", - "git_repository_is_shallow", - "git_repository_is_worktree", - "git_repository_item_path", - "git_repository_mergehead_foreach", - "git_repository_message", - "git_repository_message_remove", - "git_repository_odb", - "git_repository_open", - "git_repository_open_bare", - "git_repository_open_ext", - "git_repository_open_from_worktree", - "git_repository_path", - "git_repository_refdb", - "git_repository_set_head", - "git_repository_set_head_detached", - "git_repository_set_head_detached_from_annotated", - "git_repository_set_ident", - "git_repository_set_namespace", - "git_repository_set_workdir", - "git_repository_state", - "git_repository_state_cleanup", - "git_repository_workdir", - "git_repository_wrap_odb", - "git_reset", - "git_reset_default", - "git_reset_from_annotated", - "git_revert", - "git_revert_commit", - "git_revparse", - "git_revparse_ext", - "git_revparse_single", - "git_revwalk_new", - "git_signature_default", - "git_stash_apply", - "git_stash_drop", - "git_stash_foreach", - "git_stash_pop", - "git_stash_save", - "git_status_file", - "git_status_foreach", - "git_status_foreach_ext", - "git_status_list_new", - "git_status_should_ignore", - "git_submodule_add_setup", - "git_submodule_clone", - "git_submodule_foreach", - "git_submodule_lookup", - "git_submodule_open", - "git_submodule_repo_init", - "git_submodule_resolve_url", - "git_submodule_set_branch", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_set_ignore", - "git_submodule_set_update", - "git_submodule_set_url", - "git_submodule_status", - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_delete", - "git_tag_foreach", - "git_tag_list", - "git_tag_list_match", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_transaction_new", - "git_tree_create_updated", - "git_tree_entry_to_object", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_treebuilder_new", - "git_worktree_add", - "git_worktree_list", - "git_worktree_lookup", - "git_worktree_open_from_repository" - ] - } - } - ], - [ - "git_repository_init_flag_t", - { - "decl": [ - "GIT_REPOSITORY_INIT_BARE", - "GIT_REPOSITORY_INIT_NO_REINIT", - "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", - "GIT_REPOSITORY_INIT_MKDIR", - "GIT_REPOSITORY_INIT_MKPATH", - "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", - "GIT_REPOSITORY_INIT_RELATIVE_GITLINK" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 225, - "lineto": 271, - "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", - "tdef": "typedef", - "description": " Option flags for `git_repository_init_ext`.", - "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_BARE", - "comments": "

Create a bare repository with no working directory.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_NO_REINIT", - "comments": "

Return an GIT_EEXISTS error if the repo_path appears to already be\n an git repository.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", - "comments": "

Normally a "/.git/" will be appended to the repo path for\n non-bare repos (if it is not already there), but passing this flag\n prevents that behavior.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_MKDIR", - "comments": "

Make the repo_path (and workdir_path) as needed. Init is always willing\n to create the ".git" directory even without this flag. This flag tells\n init to create the trailing component of the repo and workdir paths\n as needed.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_MKPATH", - "comments": "

Recursively make all components of the repo and workdir paths as\n necessary.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", - "comments": "

libgit2 normally uses internal templates to initialize a new repo.\n This flags enables external templates, looking the "template_path" from\n the options if set, or the init.templatedir global config if not,\n or falling back on "/usr/share/git-core/templates" if it exists.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_RELATIVE_GITLINK", - "comments": "

If an alternate workdir is specified, use relative paths for the gitdir\n and core.worktree.

\n", - "value": 64 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_repository_init_mode_t", - { - "decl": [ - "GIT_REPOSITORY_INIT_SHARED_UMASK", - "GIT_REPOSITORY_INIT_SHARED_GROUP", - "GIT_REPOSITORY_INIT_SHARED_ALL" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 280, - "lineto": 296, - "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", - "tdef": "typedef", - "description": " Mode options for `git_repository_init_ext`.", - "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the defined modes.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_SHARED_UMASK", - "comments": "

Use permissions configured by umask - the default.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_SHARED_GROUP", - "comments": "

Use "--shared=group" behavior, chmod'ing the new repo to be group\n writable and "g+sx" for sticky group assignment.

\n", - "value": 1533 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_SHARED_ALL", - "comments": "

Use "--shared=all" behavior, adding world readability.

\n", - "value": 1535 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_repository_init_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "uint32_t mode", - "const char * workdir_path", - "const char * description", - "const char * template_path", - "const char * initial_head", - "const char * origin_url" - ], - "type": "struct", - "value": "git_repository_init_options", - "file": "git2/repository.h", - "line": 304, - "lineto": 354, - "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", - "tdef": "typedef", - "description": " Extended options structure for `git_repository_init_ext`.", - "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_diff_line_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 649, + "lineto": 653, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": null + }, + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": null + }, + { + "name": "line", + "type": "const git_diff_line *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", + "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", + "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" + }, + "git_index_matched_path_cb": { + "type": "callback", + "file": "git2/index.h", + "line": 135, + "lineto": 136, + "args": [ + { + "name": "path", + "type": "const char *", + "comment": null + }, + { + "name": "matched_pathspec", + "type": "const char *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const char *path, const char *matched_pathspec, void *payload", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " Combination of GIT_REPOSITORY_INIT flags above." - }, - { - "type": "uint32_t", - "name": "mode", - "comments": " Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants\n above, or to a custom value that you would like." - }, - { - "type": "const char *", - "name": "workdir_path", - "comments": " The path to the working dir or NULL for default (i.e. repo_path parent\n on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED\n RELATIVE TO THE REPO_PATH. If this is not the \"natural\" working\n directory, a .git gitlink file will be created here linking to the\n repo_path." - }, - { - "type": "const char *", - "name": "description", - "comments": " If set, this will be used to initialize the \"description\" file in the\n repository, instead of using the template content." - }, - { - "type": "const char *", - "name": "template_path", - "comments": " When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains\n the path to use for the template directory. If this is NULL, the config\n or default directory options will be used instead." - }, - { - "type": "const char *", - "name": "initial_head", - "comments": " The name of the head to point HEAD at. If NULL, then this will be\n treated as \"master\" and the HEAD ref will be set to \"refs/heads/master\".\n If this begins with \"refs/\" it will be used verbatim;\n otherwise \"refs/heads/\" will be prefixed." - }, - { - "type": "const char *", - "name": "origin_url", - "comments": " If this is non-NULL, then after the rest of the repository\n initialization is completed, an \"origin\" remote will be added\n pointing to this URL." - } - ], - "used": { - "returns": [], - "needs": [ - "git_repository_init_ext", - "git_repository_init_options_init" - ] - } - } - ], - [ - "git_repository_item_t", - { - "decl": [ - "GIT_REPOSITORY_ITEM_GITDIR", - "GIT_REPOSITORY_ITEM_WORKDIR", - "GIT_REPOSITORY_ITEM_COMMONDIR", - "GIT_REPOSITORY_ITEM_INDEX", - "GIT_REPOSITORY_ITEM_OBJECTS", - "GIT_REPOSITORY_ITEM_REFS", - "GIT_REPOSITORY_ITEM_PACKED_REFS", - "GIT_REPOSITORY_ITEM_REMOTES", - "GIT_REPOSITORY_ITEM_CONFIG", - "GIT_REPOSITORY_ITEM_INFO", - "GIT_REPOSITORY_ITEM_HOOKS", - "GIT_REPOSITORY_ITEM_LOGS", - "GIT_REPOSITORY_ITEM_MODULES", - "GIT_REPOSITORY_ITEM_WORKTREES", - "GIT_REPOSITORY_ITEM__LAST" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 470, - "lineto": 486, - "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM__LAST", - "tdef": "typedef", - "description": " List of items which belong to the git repository layout", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_GITDIR", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_WORKDIR", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_COMMONDIR", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_INDEX", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_OBJECTS", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_REFS", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_PACKED_REFS", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_REMOTES", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_CONFIG", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_INFO", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_HOOKS", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_LOGS", - "comments": "", - "value": 11 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_MODULES", - "comments": "", - "value": 12 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_WORKTREES", - "comments": "", - "value": 13 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM__LAST", - "comments": "", - "value": 14 - } - ], - "used": { - "returns": [], - "needs": [ - "git_repository_item_path" - ] - } - } - ], - [ - "git_repository_open_flag_t", - { - "decl": [ - "GIT_REPOSITORY_OPEN_NO_SEARCH", - "GIT_REPOSITORY_OPEN_CROSS_FS", - "GIT_REPOSITORY_OPEN_BARE", - "GIT_REPOSITORY_OPEN_NO_DOTGIT", - "GIT_REPOSITORY_OPEN_FROM_ENV" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 98, - "lineto": 145, - "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", - "tdef": "typedef", - "description": " Option flags for `git_repository_open_ext`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_NO_SEARCH", - "comments": "

Only open the repository if it can be immediately found in the\n start_path. Do not walk up from the start_path looking at parent\n directories.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_CROSS_FS", - "comments": "

Unless this flag is set, open will not continue searching across\n filesystem boundaries (i.e. when st_dev changes from the stat\n system call). For example, searching in a user's home directory at\n "/home/user/source/" will not return "/.git/" as the found repo if\n "/" is a different filesystem than "/home".

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_BARE", - "comments": "

Open repository as a bare repo regardless of core.bare config, and\n defer loading config file for faster setup.\n Unlike git_repository_open_bare, this can follow gitlinks.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_NO_DOTGIT", - "comments": "

Do not check for a repository by appending /.git to the start_path;\n only open the repository if start_path itself points to the git\n directory.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_FROM_ENV", - "comments": "

Find and open a git repository, respecting the environment variables\n used by the git command-line tools.\n If set, git_repository_open_ext will ignore the other flags and\n the ceiling_dirs argument, and will allow a NULL path to use\n GIT_DIR or search from the current directory.\n The search for a repository will respect $GIT_CEILING_DIRECTORIES and\n $GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\n respect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n $GIT_ALTERNATE_OBJECT_DIRECTORIES.\n In the future, this flag will also cause git_repository_open_ext\n to respect $GIT_WORK_TREE and $GIT_COMMON_DIR; currently,\n git_repository_open_ext with this flag will error out if either\n $GIT_WORK_TREE or $GIT_COMMON_DIR is set.

\n", - "value": 16 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_repository_state_t", - { - "decl": [ - "GIT_REPOSITORY_STATE_NONE", - "GIT_REPOSITORY_STATE_MERGE", - "GIT_REPOSITORY_STATE_REVERT", - "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", - "GIT_REPOSITORY_STATE_CHERRYPICK", - "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", - "GIT_REPOSITORY_STATE_BISECT", - "GIT_REPOSITORY_STATE_REBASE", - "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", - "GIT_REPOSITORY_STATE_REBASE_MERGE", - "GIT_REPOSITORY_STATE_APPLY_MAILBOX", - "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 867, - "lineto": 880, - "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", - "tdef": "typedef", - "description": " Repository state", - "comments": "

These values represent possible states for the repository to be in, based on the current operation which is ongoing.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_MERGE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REVERT", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_CHERRYPICK", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_BISECT", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REBASE", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REBASE_MERGE", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", - "comments": "", - "value": 11 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_reset_t", - { - "decl": [ - "GIT_RESET_SOFT", - "GIT_RESET_MIXED", - "GIT_RESET_HARD" - ], - "type": "enum", - "file": "git2/reset.h", - "line": 26, - "lineto": 30, - "block": "GIT_RESET_SOFT\nGIT_RESET_MIXED\nGIT_RESET_HARD", - "tdef": "typedef", - "description": " Kinds of reset operation", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_RESET_SOFT", - "comments": "

Move the head to the given commit

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_RESET_MIXED", - "comments": "

SOFT plus reset index to the commit

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_RESET_HARD", - "comments": "

MIXED plus changes in working tree discarded

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [ - "git_reset", - "git_reset_from_annotated" - ] - } - } - ], - [ - "git_revert_options", - { - "decl": [ - "unsigned int version", - "unsigned int mainline", - "git_merge_options merge_opts", - "git_checkout_options checkout_opts" - ], - "type": "struct", - "value": "git_revert_options", - "file": "git2/revert.h", - "line": 26, - "lineto": 34, - "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", - "tdef": "typedef", - "description": " Options for revert", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_indexer_progress_cb": { + "type": "callback", + "file": "git2/indexer.h", + "line": 57, + "lineto": 57, + "args": [ + { + "name": "stats", + "type": "const git_indexer_progress *", + "comment": "Structure containing information about the state of the transfer" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by caller" + } + ], + "argline": "const git_indexer_progress *stats, void *payload", + "sig": "const git_indexer_progress *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Type for progress callbacks during indexing. Return a value less\n than zero to cancel the indexing or download.

\n", "comments": "" - }, - { - "type": "unsigned int", - "name": "mainline", - "comments": " For merge commits, the \"mainline\" is treated as the parent. " - }, - { - "type": "git_merge_options", - "name": "merge_opts", - "comments": " Options for the merging " - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " Options for the checkout " - } - ], - "used": { - "returns": [], - "needs": [ - "git_revert", - "git_revert_options_init" - ] - } - } - ], - [ - "git_revspec", - { - "decl": [ - "git_object * from", - "git_object * to", - "unsigned int flags" - ], - "type": "struct", - "value": "git_revspec", - "file": "git2/revparse.h", - "line": 83, - "lineto": 90, - "block": "git_object * from\ngit_object * to\nunsigned int flags", - "tdef": "typedef", - "description": " Git Revision Spec: output of a `git_revparse` operation", - "comments": "", - "fields": [ - { - "type": "git_object *", - "name": "from", - "comments": " The left element of the revspec; must be freed by the user " - }, - { - "type": "git_object *", - "name": "to", - "comments": " The right element of the revspec; must be freed by the user " - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " The intent of the revspec (i.e. `git_revspec_mode_t` flags) " - } - ], - "used": { - "returns": [], - "needs": [ - "git_revparse" - ] - } - } - ], - [ - "git_revspec_t", - { - "decl": [ - "GIT_REVSPEC_SINGLE", - "GIT_REVSPEC_RANGE", - "GIT_REVSPEC_MERGE_BASE" - ], - "type": "enum", - "file": "git2/revparse.h", - "line": 71, - "lineto": 78, - "block": "GIT_REVSPEC_SINGLE\nGIT_REVSPEC_RANGE\nGIT_REVSPEC_MERGE_BASE", - "tdef": "typedef", - "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REVSPEC_SINGLE", - "comments": "

The spec targeted a single object.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REVSPEC_RANGE", - "comments": "

The spec targeted a range of commits.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REVSPEC_MERGE_BASE", - "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_revwalk", - { - "decl": "git_revwalk", - "type": "struct", - "value": "git_revwalk", - "file": "git2/types.h", - "line": 127, - "lineto": 127, - "tdef": "typedef", - "description": " Representation of an in-progress walk through the commits in a repo ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_packbuilder_insert_walk", - "git_revwalk_add_hide_cb", - "git_revwalk_free", - "git_revwalk_hide", - "git_revwalk_hide_glob", - "git_revwalk_hide_head", - "git_revwalk_hide_ref", - "git_revwalk_new", - "git_revwalk_next", - "git_revwalk_push", - "git_revwalk_push_glob", - "git_revwalk_push_head", - "git_revwalk_push_range", - "git_revwalk_push_ref", - "git_revwalk_repository", - "git_revwalk_reset", - "git_revwalk_simplify_first_parent", - "git_revwalk_sorting" - ] - } - } - ], - [ - "git_signature", - { - "decl": [ - "char * name", - "char * email", - "git_time when" - ], - "type": "struct", - "value": "git_signature", - "file": "git2/types.h", - "line": 182, - "lineto": 186, - "block": "char * name\nchar * email\ngit_time when", - "tdef": "typedef", - "description": " An action signature (e.g. for committers, taggers, etc) ", - "comments": "", - "fields": [ - { - "type": "char *", - "name": "name", - "comments": " full name of the author " - }, - { - "type": "char *", - "name": "email", - "comments": " email of the author " - }, - { - "type": "git_time", - "name": "when", - "comments": " time when the action happened " - } - ], - "used": { - "returns": [ - "git_commit_author", - "git_commit_committer", - "git_note_author", - "git_note_committer", - "git_reflog_entry_committer", - "git_tag_tagger" - ], - "needs": [ - "git_commit_amend", - "git_commit_author_with_mailmap", - "git_commit_committer_with_mailmap", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_cb", - "git_commit_create_v", - "git_mailmap_resolve_signature", - "git_note_commit_create", - "git_note_commit_remove", - "git_note_create", - "git_note_remove", - "git_rebase_commit", - "git_rebase_finish", - "git_reflog_append", - "git_signature_default", - "git_signature_dup", - "git_signature_free", - "git_signature_from_buffer", - "git_signature_new", - "git_signature_now", - "git_stash_save", - "git_tag_annotation_create", - "git_tag_create", - "git_transaction_set_symbolic_target", - "git_transaction_set_target" - ] - } - } - ], - [ - "git_smart_service_t", - { - "decl": [ - "GIT_SERVICE_UPLOADPACK_LS", - "GIT_SERVICE_UPLOADPACK", - "GIT_SERVICE_RECEIVEPACK_LS", - "GIT_SERVICE_RECEIVEPACK" - ], - "type": "enum", - "file": "git2/sys/transport.h", - "line": 288, - "lineto": 293, - "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", - "tdef": "typedef", - "description": " Actions that the smart transport can ask a subtransport to perform ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_SERVICE_UPLOADPACK_LS", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SERVICE_UPLOADPACK", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SERVICE_RECEIVEPACK_LS", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_SERVICE_RECEIVEPACK", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_sort_t", - { - "decl": [ - "GIT_SORT_NONE", - "GIT_SORT_TOPOLOGICAL", - "GIT_SORT_TIME", - "GIT_SORT_REVERSE" - ], - "type": "enum", - "file": "git2/revwalk.h", - "line": 26, - "lineto": 53, - "block": "GIT_SORT_NONE\nGIT_SORT_TOPOLOGICAL\nGIT_SORT_TIME\nGIT_SORT_REVERSE", - "tdef": "typedef", - "description": " Flags to specify the sorting which a revwalk should perform.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_SORT_NONE", - "comments": "

Sort the output with the same default method from git: reverse\n chronological order. This is the default sorting for new walkers.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_SORT_TOPOLOGICAL", - "comments": "

Sort the repository contents in topological order (no parents before\n all of its children are shown); this sorting mode can be combined\n with time sorting to produce git's --date-order`.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SORT_TIME", - "comments": "

Sort the repository contents by commit time;\n this sorting mode can be combined with\n topological sorting.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SORT_REVERSE", - "comments": "

Iterate through the repository contents in reverse\n order; this sorting mode can be combined with\n any of the above.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_stash_apply_flags", - { - "decl": [ - "GIT_STASH_APPLY_DEFAULT", - "GIT_STASH_APPLY_REINSTATE_INDEX" - ], - "type": "enum", - "file": "git2/stash.h", - "line": 75, - "lineto": 82, - "block": "GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX", - "tdef": "typedef", - "description": " Stash application flags. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STASH_APPLY_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_REINSTATE_INDEX", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_stash_apply_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "git_checkout_options checkout_options", - "git_stash_apply_progress_cb progress_cb", - "void * progress_payload" - ], - "type": "struct", - "value": "git_stash_apply_options", - "file": "git2/stash.h", - "line": 126, - "lineto": 138, - "block": "unsigned int version\nuint32_t flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", - "tdef": "typedef", - "description": " Stash application options structure", - "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can use git_stash_apply_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_note_foreach_cb": { + "type": "callback", + "file": "git2/notes.h", + "line": 29, + "lineto": 30, + "args": [ + { + "name": "blob_id", + "type": "const git_oid *", + "comment": null + }, + { + "name": "annotated_object_id", + "type": "const git_oid *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_oid *blob_id, const git_oid *annotated_object_id, void *payload", + "sig": "const git_oid *::const git_oid *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for git_note_foreach.

\n", + "comments": "

Receives: - blob_id: Oid of the blob containing the message - annotated_object_id: Oid of the git object being annotated - payload: Payload data passed to git_note_foreach

\n" + }, + "git_odb_foreach_cb": { + "type": "callback", + "file": "git2/odb.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_oid *id, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Function type for callbacks from git_odb_foreach.

\n", "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " See `git_stash_apply_flags`, above. " - }, - { - "type": "git_checkout_options", - "name": "checkout_options", - "comments": " Options to use when writing files to the working directory. " - }, - { - "type": "git_stash_apply_progress_cb", - "name": "progress_cb", - "comments": " Optional callback to notify the consumer of application progress. " - }, - { - "type": "void *", - "name": "progress_payload", + }, + "git_packbuilder_foreach_cb": { + "type": "callback", + "file": "git2/pack.h", + "line": 208, + "lineto": 208, + "args": [ + { + "name": "buf", + "type": "void *", + "comment": "A pointer to the object's data" + }, + { + "name": "size", + "type": "size_t", + "comment": "The size of the underlying object" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_packbuilder_foreach" + } + ], + "argline": "void *buf, size_t size, void *payload", + "sig": "void *::size_t::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over packed objects

\n", "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_stash_apply", - "git_stash_apply_options_init", - "git_stash_pop" - ] - } - } - ], - [ - "git_stash_apply_progress_t", - { - "decl": [ - "GIT_STASH_APPLY_PROGRESS_NONE", - "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", - "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", - "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", - "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", - "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", - "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", - "GIT_STASH_APPLY_PROGRESS_DONE" - ], - "type": "enum", - "file": "git2/stash.h", - "line": 85, - "lineto": 108, - "block": "GIT_STASH_APPLY_PROGRESS_NONE\nGIT_STASH_APPLY_PROGRESS_LOADING_STASH\nGIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX\nGIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED\nGIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED\nGIT_STASH_APPLY_PROGRESS_DONE", - "tdef": "typedef", - "description": " Stash apply progression states ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", - "comments": "

Loading the stashed data from the object database.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", - "comments": "

The stored index is being analyzed.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", - "comments": "

The modified files are being analyzed.

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", - "comments": "

The untracked and ignored files are being analyzed.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", - "comments": "

The untracked files are being written to disk.

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", - "comments": "

The modified files are being written to disk.

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_DONE", - "comments": "

The stash was applied successfully.

\n", - "value": 7 - } - ], - "used": { - "returns": [], - "needs": [ - "git_stash_apply_progress_cb" - ] - } - } - ], - [ - "git_stash_flags", - { - "decl": [ - "GIT_STASH_DEFAULT", - "GIT_STASH_KEEP_INDEX", - "GIT_STASH_INCLUDE_UNTRACKED", - "GIT_STASH_INCLUDE_IGNORED" - ], - "type": "enum", - "file": "git2/stash.h", - "line": 25, - "lineto": 48, - "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED", - "tdef": "typedef", - "description": " Stash flags", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STASH_DEFAULT", - "comments": "

No option, default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STASH_KEEP_INDEX", - "comments": "

All changes already added to the index are left intact in\n the working directory

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STASH_INCLUDE_UNTRACKED", - "comments": "

All untracked files are also stashed and then cleaned up\n from the working directory

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STASH_INCLUDE_IGNORED", - "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_status_entry", - { - "decl": [ - "git_status_t status", - "git_diff_delta * head_to_index", - "git_diff_delta * index_to_workdir" - ], - "type": "struct", - "value": "git_status_entry", - "file": "git2/status.h", - "line": 286, - "lineto": 290, - "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", - "tdef": "typedef", - "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", - "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the differences between the file in the index and the file in the working directory.

\n", - "fields": [ - { - "type": "git_status_t", - "name": "status", + }, + "git_packbuilder_progress": { + "type": "callback", + "file": "git2/pack.h", + "line": 237, + "lineto": 241, + "args": [ + { + "name": "stage", + "type": "int", + "comment": null + }, + { + "name": "current", + "type": "uint32_t", + "comment": null + }, + { + "name": "total", + "type": "uint32_t", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "int stage, uint32_t current, uint32_t total, void *payload", + "sig": "int::uint32_t::uint32_t::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Packbuilder progress notification function

\n", "comments": "" - }, - { - "type": "git_diff_delta *", - "name": "head_to_index", + }, + "git_reference_foreach_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 437, + "lineto": 437, + "args": [ + { + "name": "reference", + "type": "git_reference *", + "comment": "The reference object" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_reference_foreach" + } + ], + "argline": "git_reference *reference, void *payload", + "sig": "git_reference *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over references

\n", "comments": "" - }, - { - "type": "git_diff_delta *", - "name": "index_to_workdir", + }, + "git_reference_foreach_name_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 448, + "lineto": 448, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The reference name" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_reference_foreach_name" + } + ], + "argline": "const char *name, void *payload", + "sig": "const char *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over reference names

\n", "comments": "" - } - ], - "used": { - "returns": [ - "git_status_byindex" - ], - "needs": [] - } - } - ], - [ - "git_status_list", - { - "decl": "git_status_list", - "type": "struct", - "value": "git_status_list", - "file": "git2/types.h", - "line": 201, - "lineto": 201, - "tdef": "typedef", - "description": " Representation of a status collection ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_status_byindex", - "git_status_list_entrycount", - "git_status_list_free", - "git_status_list_new" - ] - } - } - ], - [ - "git_status_opt_t", - { - "decl": [ - "GIT_STATUS_OPT_INCLUDE_UNTRACKED", - "GIT_STATUS_OPT_INCLUDE_IGNORED", - "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", - "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", - "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", - "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", - "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", - "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", - "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", - "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", - "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", - "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", - "GIT_STATUS_OPT_NO_REFRESH", - "GIT_STATUS_OPT_UPDATE_INDEX", - "GIT_STATUS_OPT_INCLUDE_UNREADABLE", - "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED" - ], - "type": "enum", - "file": "git2/status.h", - "line": 101, - "lineto": 208, - "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", - "tdef": "typedef", - "description": " Flags to control status callbacks", - "comments": "

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNTRACKED", - "comments": "

Says that callbacks should be made on untracked files.\n These will only be made if the workdir files are included in the status\n "show" option.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_IGNORED", - "comments": "

Says that ignored files get callbacks.\n Again, these callbacks will only be made if the workdir files are\n included in the status "show" option.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", - "comments": "

Indicates that callback should be made even on unmodified files.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", - "comments": "

Indicates that submodules should be skipped.\n This only applies if there are no pending typechanges to the submodule\n (either from or to another type).

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", - "comments": "

Indicates that all files in untracked directories should be included.\n Normally if an entire directory is new, then just the top-level\n directory is included (with a trailing slash on the entry name).\n This flag says to include all of the individual files in the directory\n instead.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", - "comments": "

Indicates that the given path should be treated as a literal path,\n and not as a pathspec pattern.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", - "comments": "

Indicates that the contents of ignored directories should be included\n in the status. This is like doing git ls-files -o -i --exclude-standard\n with core git.

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", - "comments": "

Indicates that rename detection should be processed between the head and\n the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status\n flag.

\n", - "value": 128 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", - "comments": "

Indicates that rename detection should be run between the index and the\n working directory and enabled GIT_STATUS_WT_RENAMED as a possible status\n flag.

\n", - "value": 256 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", - "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-sensitive order.

\n", - "value": 512 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", - "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-insensitive order.

\n", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", - "comments": "

Iindicates that rename detection should include rewritten files.

\n", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_NO_REFRESH", - "comments": "

Bypasses the default status behavior of doing a "soft" index reload\n (i.e. reloading the index data if the file on disk has been modified\n outside libgit2).

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_UPDATE_INDEX", - "comments": "

Tells libgit2 to refresh the stat cache in the index for files that are\n unchanged but have out of date stat einformation in the index.\n It will result in less work being done on subsequent calls to get status.\n This is mutually exclusive with the NO_REFRESH option.

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE", - "comments": "

Normally files that cannot be opened or read are ignored as\n these are often transient files; this option will return\n unreadable files as GIT_STATUS_WT_UNREADABLE.

\n", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", - "comments": "

Unreadable files will be detected and given the status\n untracked instead of unreadable.

\n", - "value": 32768 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_status_options", - { - "decl": [ - "unsigned int version", - "git_status_show_t show", - "unsigned int flags", - "git_strarray pathspec", - "git_tree * baseline" - ], - "type": "struct", - "value": "git_status_options", - "file": "git2/status.h", - "line": 222, - "lineto": 253, - "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline", - "tdef": "typedef", - "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", - "comments": "

Initialize with GIT_STATUS_OPTIONS_INIT. Alternatively, you can use git_status_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." - }, - { - "type": "git_status_show_t", - "name": "show", - "comments": " The `show` value is one of the `git_status_show_t` constants that\n control which files to scan and in what order." - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " The `flags` value is an OR'ed combination of the\n `git_status_opt_t` values above." - }, - { - "type": "git_strarray", - "name": "pathspec", - "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match\n exactly if `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified\n in the flags." - }, - { - "type": "git_tree *", - "name": "baseline", - "comments": " The `baseline` is the tree to be used for comparison to the\n working directory and index; defaults to HEAD." - } - ], - "used": { - "returns": [], - "needs": [ - "git_status_foreach_ext", - "git_status_list_new", - "git_status_options_init" - ] - } - } - ], - [ - "git_status_show_t", - { - "decl": [ - "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", - "GIT_STATUS_SHOW_INDEX_ONLY", - "GIT_STATUS_SHOW_WORKDIR_ONLY" - ], - "type": "enum", - "file": "git2/status.h", - "line": 73, - "lineto": 91, - "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", - "tdef": "typedef", - "description": " Select the files on which to report status.", - "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", - "comments": "

The default. This roughly matches git status --porcelain regarding\n which files are included and in what order.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STATUS_SHOW_INDEX_ONLY", - "comments": "

Only gives status based on HEAD to index comparison, not looking at\n working directory changes.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STATUS_SHOW_WORKDIR_ONLY", - "comments": "

Only gives status based on index to working directory comparison,\n not comparing the index to the HEAD.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_status_t", - { - "decl": [ - "GIT_STATUS_CURRENT", - "GIT_STATUS_INDEX_NEW", - "GIT_STATUS_INDEX_MODIFIED", - "GIT_STATUS_INDEX_DELETED", - "GIT_STATUS_INDEX_RENAMED", - "GIT_STATUS_INDEX_TYPECHANGE", - "GIT_STATUS_WT_NEW", - "GIT_STATUS_WT_MODIFIED", - "GIT_STATUS_WT_DELETED", - "GIT_STATUS_WT_TYPECHANGE", - "GIT_STATUS_WT_RENAMED", - "GIT_STATUS_WT_UNREADABLE", - "GIT_STATUS_IGNORED", - "GIT_STATUS_CONFLICTED" - ], - "type": "enum", - "file": "git2/status.h", - "line": 34, - "lineto": 52, - "block": "GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED", - "tdef": "typedef", - "description": " Status flags for a single file.", - "comments": "

A combination of these values will be returned to indicate the status of a file. Status compares the working directory, the index, and the current HEAD of the repository. The GIT_STATUS_INDEX set of flags represents the status of file in the index relative to the HEAD, and the GIT_STATUS_WT set of flags represent the status of the file in the working directory relative to the index.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_STATUS_CURRENT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_NEW", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_MODIFIED", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_DELETED", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_RENAMED", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_TYPECHANGE", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_NEW", - "comments": "", - "value": 128 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_MODIFIED", - "comments": "", - "value": 256 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_DELETED", - "comments": "", - "value": 512 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_TYPECHANGE", - "comments": "", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_RENAMED", - "comments": "", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_UNREADABLE", - "comments": "", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_STATUS_IGNORED", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_STATUS_CONFLICTED", - "comments": "", - "value": 32768 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_strarray", - { - "decl": [ - "char ** strings", - "size_t count" - ], - "type": "struct", - "value": "git_strarray", - "file": "git2/strarray.h", - "line": 22, - "lineto": 25, - "block": "char ** strings\nsize_t count", - "tdef": "typedef", - "description": " Array of strings ", - "comments": "", - "fields": [ - { - "type": "char **", - "name": "strings", + }, + "git_push_transfer_progress_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 459, + "lineto": 463, + "args": [ + { + "name": "current", + "type": "unsigned int", + "comment": null + }, + { + "name": "total", + "type": "unsigned int", + "comment": null + }, + { + "name": "bytes", + "type": "size_t", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "unsigned int current, unsigned int total, size_t bytes, void *payload", + "sig": "unsigned int::unsigned int::size_t::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Push network progress notification function

\n", "comments": "" - }, - { - "type": "size_t", - "name": "count", + }, + "git_push_negotiation": { + "type": "callback", + "file": "git2/remote.h", + "line": 495, + "lineto": 495, + "args": [ + { + "name": "updates", + "type": "const git_push_update **", + "comment": "an array containing the updates which will be sent\n as commands to the destination." + }, + { + "name": "len", + "type": "size_t", + "comment": "number of elements in `updates`" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "const git_push_update **updates, size_t len, void *payload", + "sig": "const git_push_update **::size_t::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback used to inform of upcoming updates.

\n", "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_index_add_all", - "git_index_remove_all", - "git_index_update_all", - "git_pathspec_new", - "git_reference_list", - "git_remote_connect", - "git_remote_download", - "git_remote_fetch", - "git_remote_get_fetch_refspecs", - "git_remote_get_push_refspecs", - "git_remote_list", - "git_remote_push", - "git_remote_rename", - "git_remote_upload", - "git_reset_default", - "git_strarray_copy", - "git_strarray_dispose", - "git_strarray_free", - "git_tag_list", - "git_tag_list_match", - "git_worktree_list" - ] - } - } - ], - [ - "git_stream_t", - { - "decl": [ - "GIT_STREAM_STANDARD", - "GIT_STREAM_TLS" - ], - "type": "enum", - "file": "git2/sys/stream.h", - "line": 77, - "lineto": 83, - "block": "GIT_STREAM_STANDARD\nGIT_STREAM_TLS", - "tdef": "typedef", - "description": " The type of stream to register.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STREAM_STANDARD", - "comments": "

A standard (non-TLS) socket.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STREAM_TLS", - "comments": "

A TLS-encrypted socket.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_submodule", - { - "decl": "git_submodule", - "type": "struct", - "value": "git_submodule", - "file": "git2/types.h", - "line": 267, - "lineto": 267, - "tdef": "typedef", - "description": " Opaque structure representing a submodule.", - "comments": "", - "used": { - "returns": [ - "git_submodule_fetch_recurse_submodules", - "git_submodule_ignore", - "git_submodule_update_strategy" - ], - "needs": [ - "git_submodule_add_finalize", - "git_submodule_add_setup", - "git_submodule_add_to_index", - "git_submodule_branch", - "git_submodule_cb", - "git_submodule_clone", - "git_submodule_dup", - "git_submodule_fetch_recurse_submodules", - "git_submodule_foreach", - "git_submodule_free", - "git_submodule_head_id", - "git_submodule_ignore", - "git_submodule_index_id", - "git_submodule_init", - "git_submodule_location", - "git_submodule_lookup", - "git_submodule_name", - "git_submodule_open", - "git_submodule_owner", - "git_submodule_path", - "git_submodule_reload", - "git_submodule_repo_init", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_set_ignore", - "git_submodule_set_update", - "git_submodule_status", - "git_submodule_sync", - "git_submodule_update", - "git_submodule_update_options_init", - "git_submodule_update_strategy", - "git_submodule_url", - "git_submodule_wd_id" - ] - } - } - ], - [ - "git_submodule_ignore_t", - { - "decl": [ - "GIT_SUBMODULE_IGNORE_UNSPECIFIED", - "GIT_SUBMODULE_IGNORE_NONE", - "GIT_SUBMODULE_IGNORE_UNTRACKED", - "GIT_SUBMODULE_IGNORE_DIRTY", - "GIT_SUBMODULE_IGNORE_ALL" - ], - "type": "enum", - "file": "git2/types.h", - "line": 331, - "lineto": 338, - "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", - "tdef": "typedef", - "description": " Submodule ignore values", - "comments": "

These values represent settings for the submodule.$name.ignore configuration value which says how deeply to look at the working directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with git_submodule_set_ignore() and can write the changed value to disk with git_submodule_save(). If you have overwritten the value, you can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an untracked file, will mark the submodule as dirty. Ignored files are still ignored, of course. - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes to tracked files, or the index or the HEAD commit will matter. - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory, only considering changes if the HEAD of submodule has moved from the value in the superproject. - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer when we don't want any particular ignore rule to be specified.
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_UNSPECIFIED", - "comments": "

use the submodule's configuration

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_NONE", - "comments": "

any change or untracked == dirty

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_UNTRACKED", - "comments": "

dirty if tracked files change

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_DIRTY", - "comments": "

only dirty if HEAD moved

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_ALL", - "comments": "

never dirty

\n", - "value": 4 - } - ], - "used": { - "returns": [ - "git_submodule_ignore" - ], - "needs": [ - "git_submodule_set_ignore", - "git_submodule_status" - ] - } - } - ], - [ - "git_submodule_recurse_t", - { - "decl": [ - "GIT_SUBMODULE_RECURSE_NO", - "GIT_SUBMODULE_RECURSE_YES", - "GIT_SUBMODULE_RECURSE_ONDEMAND" - ], - "type": "enum", - "file": "git2/types.h", - "line": 350, - "lineto": 354, - "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", - "tdef": "typedef", - "description": " Options for submodule recurse.", - "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules * GIT_SUBMODULE_RECURSE_YES - recurse into submodules * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when commit not already in local clone
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_RECURSE_NO", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_RECURSE_YES", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_RECURSE_ONDEMAND", - "comments": "", - "value": 2 - } - ], - "used": { - "returns": [ - "git_submodule_fetch_recurse_submodules" - ], - "needs": [ - "git_submodule_set_fetch_recurse_submodules" - ] - } - } - ], - [ - "git_submodule_status_t", - { - "decl": [ - "GIT_SUBMODULE_STATUS_IN_HEAD", - "GIT_SUBMODULE_STATUS_IN_INDEX", - "GIT_SUBMODULE_STATUS_IN_CONFIG", - "GIT_SUBMODULE_STATUS_IN_WD", - "GIT_SUBMODULE_STATUS_INDEX_ADDED", - "GIT_SUBMODULE_STATUS_INDEX_DELETED", - "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", - "GIT_SUBMODULE_STATUS_WD_ADDED", - "GIT_SUBMODULE_STATUS_WD_DELETED", - "GIT_SUBMODULE_STATUS_WD_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_UNTRACKED" - ], - "type": "enum", - "file": "git2/submodule.h", - "line": 74, - "lineto": 89, - "block": "GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED", - "tdef": "typedef", - "description": " Return codes for submodule status.", - "comments": "

A combination of these flags will be returned to describe the status of a submodule. Depending on the "ignore" property of the submodule, some of the flags may never be returned because they indicate changes that are supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config files (both .git/config and .gitmodules), and the working directory. Any or all of those places might be missing information about the submodule depending on what state the repo is in. We consider all four places to build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info about what sources of submodule data are available. These will be returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule * IN_INDEX - superproject index contains submodule * IN_CONFIG - superproject gitmodules has submodule * IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head * INDEX_DELETED - in head, not in index * INDEX_MODIFIED - index and head don't match * WD_UNINITIALIZED - workdir contains empty directory * WD_ADDED - in workdir, not index * WD_DELETED - in index, not workdir * WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty * WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_HEAD", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_INDEX", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_CONFIG", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_WD", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_INDEX_ADDED", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_INDEX_DELETED", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", - "comments": "", - "value": 64 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", - "comments": "", - "value": 128 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_ADDED", - "comments": "", - "value": 256 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_DELETED", - "comments": "", - "value": 512 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_MODIFIED", - "comments": "", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", - "comments": "", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", - "comments": "", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_UNTRACKED", - "comments": "", - "value": 8192 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_submodule_update_options", - { - "decl": [ - "unsigned int version", - "git_checkout_options checkout_opts", - "git_fetch_options fetch_opts", - "int allow_fetch" - ], - "type": "struct", - "value": "git_submodule_update_options", - "file": "git2/submodule.h", - "line": 128, - "lineto": 153, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", - "tdef": "typedef", - "description": " Submodule update options structure", - "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_push_update_reference_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 509, + "lineto": 509, + "args": [ + { + "name": "refname", + "type": "const char *", + "comment": "refname specifying to the remote ref" + }, + { + "name": "status", + "type": "const char *", + "comment": "status message sent from the remote" + }, + { + "name": "data", + "type": "void *", + "comment": "data provided by the caller" + } + ], + "argline": "const char *refname, const char *status, void *data", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 on success, otherwise an error" + }, + "description": "

Callback used to inform of the update status from the remote.

\n", + "comments": "

Called for each updated reference on push. If status is not NULL, the update was rejected by the remote server and status contains the reason given.

\n" + }, + "git_url_resolve_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 525, + "lineto": 525, + "args": [ + { + "name": "url_resolved", + "type": "git_buf *", + "comment": "The buffer to write the resolved URL to" + }, + { + "name": "url", + "type": "const char *", + "comment": "The URL to resolve" + }, + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_buf *url_resolved, const char *url, int direction, void *payload", + "sig": "git_buf *::const char *::int::void *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_PASSTHROUGH or an error\n " + }, + "description": "

Callback to resolve URLs before connecting to remote

\n", + "comments": "

If you return GIT_PASSTHROUGH, you don't need to write anything to url_resolved.

\n" + }, + "git_remote_ready_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 538, + "lineto": 538, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "The remote to be connected" + }, + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_remote *remote, int direction, void *payload", + "sig": "git_remote *::int::void *", + "return": { + "type": "int", + "comment": " 0 on success, or an error" + }, + "description": "

Callback invoked immediately before we attempt to connect to the\n given url. Callers may change the URL before the connection by\n calling git_remote_set_instance_url in the callback.

\n", "comments": "" - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory." - }, - { - "type": "git_fetch_options", - "name": "fetch_opts", - "comments": " Options which control the fetch, including callbacks.\n\n The callbacks to use for reporting fetch progress, and for acquiring\n credentials in the event they are needed." - }, - { - "type": "int", - "name": "allow_fetch", - "comments": " Allow fetching from the submodule's default remote if the target\n commit isn't found. Enabled by default." - } - ], - "used": { - "returns": [], - "needs": [ - "git_submodule_clone", - "git_submodule_update", - "git_submodule_update_options_init" - ] - } - } - ], - [ - "git_submodule_update_t", - { - "decl": [ - "GIT_SUBMODULE_UPDATE_CHECKOUT", - "GIT_SUBMODULE_UPDATE_REBASE", - "GIT_SUBMODULE_UPDATE_MERGE", - "GIT_SUBMODULE_UPDATE_NONE", - "GIT_SUBMODULE_UPDATE_DEFAULT" - ], - "type": "enum", - "file": "git2/types.h", - "line": 295, - "lineto": 302, - "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", - "tdef": "typedef", - "description": " Submodule update values", - "comments": "

These values represent settings for the submodule.$name.update configuration value which says how to handle git submodule update for this submodule. The value is usually set in the ".gitmodules" file and copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with git_submodule_set_update() and write the changed value to disk using git_submodule_save(). If you have overwritten the value, you can revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is updated, checkout the new detached HEAD to the submodule directory. - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked out branch onto the commit from the superproject. - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the superproject into the current checkout out branch of the submodule. - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when the commit in the superproject is updated. - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer when we don't want any particular update rule to be specified.
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_CHECKOUT", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_REBASE", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_MERGE", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_NONE", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_DEFAULT", - "comments": "", - "value": 0 - } - ], - "used": { - "returns": [ - "git_submodule_update_strategy" - ], - "needs": [ - "git_submodule_set_update" - ] - } - } - ], - [ - "git_tag", - { - "decl": "git_tag", - "type": "struct", - "value": "git_tag", - "file": "git2/types.h", - "line": 130, - "lineto": 130, - "tdef": "typedef", - "description": " Parsed representation of a tag object. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_tag_dup", - "git_tag_foreach", - "git_tag_free", - "git_tag_id", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_tag_message", - "git_tag_name", - "git_tag_owner", - "git_tag_peel", - "git_tag_tagger", - "git_tag_target", - "git_tag_target_id", - "git_tag_target_type" - ] - } - } - ], - [ - "git_time", - { - "decl": [ - "git_time_t time", - "int offset", - "char sign" - ], - "type": "struct", - "value": "git_time", - "file": "git2/types.h", - "line": 175, - "lineto": 179, - "block": "git_time_t time\nint offset\nchar sign", - "tdef": "typedef", - "description": " Time in a signature ", - "comments": "", - "fields": [ - { - "type": "git_time_t", - "name": "time", - "comments": " time in seconds from epoch " - }, - { - "type": "int", - "name": "offset", - "comments": " timezone offset, in minutes " - }, - { - "type": "char", - "name": "sign", - "comments": " indicator for questionable '-0000' offsets in signature " - } - ], - "used": { - "returns": [ - "git_commit_time" - ], - "needs": [ - "git_signature_new" - ] - } - } - ], - [ - "git_trace_level_t", - { - "decl": [ - "GIT_TRACE_NONE", - "GIT_TRACE_FATAL", - "GIT_TRACE_ERROR", - "GIT_TRACE_WARN", - "GIT_TRACE_INFO", - "GIT_TRACE_DEBUG", - "GIT_TRACE_TRACE" - ], - "type": "enum", - "file": "git2/trace.h", - "line": 26, - "lineto": 47, - "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", - "tdef": "typedef", - "description": " Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_TRACE_NONE", - "comments": "

No tracing will be performed.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_TRACE_FATAL", - "comments": "

Severe errors that may impact the program's execution

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_TRACE_ERROR", - "comments": "

Errors that do not impact the program's execution

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_TRACE_WARN", - "comments": "

Warnings that suggest abnormal data

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_TRACE_INFO", - "comments": "

Informational messages about program execution

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_TRACE_DEBUG", - "comments": "

Detailed data that allows for debugging

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_TRACE_TRACE", - "comments": "

Exceptionally detailed debugging data

\n", - "value": 6 - } - ], - "used": { - "returns": [], - "needs": [ - "git_trace_cb", - "git_trace_set" - ] - } - } - ], - [ - "git_transaction", - { - "decl": "git_transaction", - "type": "struct", - "value": "git_transaction", - "file": "git2/types.h", - "line": 195, - "lineto": 195, - "tdef": "typedef", - "description": " Transactional interface to references ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_lock", - "git_transaction_commit", - "git_transaction_free", - "git_transaction_lock_ref", - "git_transaction_new", - "git_transaction_remove", - "git_transaction_set_reflog", - "git_transaction_set_symbolic_target", - "git_transaction_set_target" - ] - } - } - ], - [ - "git_transport", - { - "decl": "git_transport", - "type": "struct", - "value": "git_transport", - "file": "git2/types.h", - "line": 247, - "lineto": 247, - "tdef": "typedef", - "description": " Interface which represents a transport to communicate with a\n remote.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_transport_cb" - ] - } - } - ], - [ - "git_tree", - { - "decl": "git_tree", - "type": "struct", - "value": "git_tree", - "file": "git2/types.h", - "line": 142, - "lineto": 142, - "tdef": "typedef", - "description": " Representation of a tree object. ", - "comments": "", - "used": { - "returns": [ - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_treebuilder_get" - ], - "needs": [ - "git_apply_to_tree", - "git_commit_amend", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_cb", - "git_commit_create_v", - "git_commit_tree", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_index_read_tree", - "git_merge_trees", - "git_pathspec_match_tree", - "git_tree_create_updated", - "git_tree_dup", - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_tree_entry_bypath", - "git_tree_entry_cmp", - "git_tree_entry_dup", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_free", - "git_tree_entry_id", - "git_tree_entry_name", - "git_tree_entry_to_object", - "git_tree_entry_type", - "git_tree_entrycount", - "git_tree_free", - "git_tree_id", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_tree_owner", - "git_tree_walk", - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_filter", - "git_treebuilder_filter_cb", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_new", - "git_treebuilder_remove", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer", - "git_treewalk_cb" - ] - } - } - ], - [ - "git_tree_entry", - { - "decl": "git_tree_entry", - "type": "struct", - "value": "git_tree_entry", - "file": "git2/types.h", - "line": 139, - "lineto": 139, - "tdef": "typedef", - "description": " Representation of each one of the entries in a tree object. ", - "comments": "", - "used": { - "returns": [ - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_treebuilder_get" - ], - "needs": [ - "git_tree_entry_bypath", - "git_tree_entry_cmp", - "git_tree_entry_dup", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_free", - "git_tree_entry_id", - "git_tree_entry_name", - "git_tree_entry_to_object", - "git_tree_entry_type", - "git_treebuilder_filter_cb", - "git_treebuilder_insert", - "git_treewalk_cb" - ] - } - } - ], - [ - "git_tree_update", - { - "decl": [ - "git_tree_update_t action", - "git_oid id", - "git_filemode_t filemode", - "const char * path" - ], - "type": "struct", - "value": "git_tree_update", - "file": "git2/tree.h", - "line": 437, - "lineto": 446, - "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", - "tdef": "typedef", - "description": " An action to perform during the update of a tree", - "comments": "", - "fields": [ - { - "type": "git_tree_update_t", - "name": "action", - "comments": " Update action. If it's an removal, only the path is looked at " - }, - { - "type": "git_oid", - "name": "id", - "comments": " The entry's id " - }, - { - "type": "git_filemode_t", - "name": "filemode", - "comments": " The filemode/kind of object " - }, - { - "type": "const char *", - "name": "path", - "comments": " The full path from the root tree " - } - ], - "used": { - "returns": [], - "needs": [ - "git_tree_create_updated" - ] - } - } - ], - [ - "git_tree_update_t", - { - "decl": [ - "GIT_TREE_UPDATE_UPSERT", - "GIT_TREE_UPDATE_REMOVE" - ], - "type": "enum", - "file": "git2/tree.h", - "line": 427, - "lineto": 432, - "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", - "tdef": "typedef", - "description": " The kind of update to perform", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_TREE_UPDATE_UPSERT", - "comments": "

Update or insert an entry at the specified path

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_TREE_UPDATE_REMOVE", - "comments": "

Remove an entry from the specified path

\n", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_treebuilder", - { - "decl": "git_treebuilder", - "type": "struct", - "value": "git_treebuilder", - "file": "git2/types.h", - "line": 145, - "lineto": 145, - "tdef": "typedef", - "description": " Constructor for in-memory trees ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_filter", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_new", - "git_treebuilder_remove", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer" - ] - } - } - ], - [ - "git_treewalk_mode", - { - "decl": [ - "GIT_TREEWALK_PRE", - "GIT_TREEWALK_POST" - ], - "type": "enum", - "file": "git2/tree.h", - "line": 387, - "lineto": 390, - "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", - "tdef": "typedef", - "description": " Tree traversal modes ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_TREEWALK_PRE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_TREEWALK_POST", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [ - "git_tree_walk" - ] - } - } - ], - [ - "git_worktree", - { - "decl": "git_worktree", - "type": "struct", - "value": "git_worktree", - "file": "git2/types.h", - "line": 121, - "lineto": 121, - "tdef": "typedef", - "description": " Representation of a working tree ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_repository_open_from_worktree", - "git_worktree_add", - "git_worktree_add_options_init", - "git_worktree_free", - "git_worktree_is_locked", - "git_worktree_is_prunable", - "git_worktree_lock", - "git_worktree_lookup", - "git_worktree_name", - "git_worktree_open_from_repository", - "git_worktree_path", - "git_worktree_prune", - "git_worktree_prune_options_init", - "git_worktree_unlock", - "git_worktree_validate" - ] - } - } - ], - [ - "git_worktree_add_options", - { - "decl": [ - "unsigned int version", - "int lock", - "git_reference * ref" - ], - "type": "struct", - "value": "git_worktree_add_options", - "file": "git2/worktree.h", - "line": 84, - "lineto": 89, - "block": "unsigned int version\nint lock\ngit_reference * ref", - "tdef": "typedef", - "description": " Worktree add options structure", - "comments": "

Initialize with GIT_WORKTREE_ADD_OPTIONS_INIT. Alternatively, you can use git_worktree_add_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_repository_fetchhead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 724, + "lineto": 728, + "args": [ + { + "name": "ref_name", + "type": "const char *", + "comment": "The reference name" + }, + { + "name": "remote_url", + "type": "const char *", + "comment": "The remote URL" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "The reference target OID" + }, + { + "name": "is_merge", + "type": "unsigned int", + "comment": "Was the reference the result of a merge" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_repository_fetchhead_foreach" + } + ], + "argline": "const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload", + "sig": "const char *::const char *::const git_oid *::unsigned int::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over each FETCH_HEAD entry

\n", "comments": "" - }, - { - "type": "int", - "name": "lock", - "comments": " lock newly created worktree " - }, - { - "type": "git_reference *", - "name": "ref", - "comments": " reference to use for the new worktree HEAD " - } - ], - "used": { - "returns": [], - "needs": [ - "git_worktree_add", - "git_worktree_add_options_init" - ] - } - } - ], - [ - "git_worktree_prune_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags" - ], - "type": "struct", - "value": "git_worktree_prune_options", - "file": "git2/worktree.h", - "line": 198, - "lineto": 203, - "block": "unsigned int version\nuint32_t flags", - "tdef": "typedef", - "description": " Worktree prune options structure", - "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", + }, + "git_repository_mergehead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 755, + "lineto": 756, + "args": [ + { + "name": "oid", + "type": "const git_oid *", + "comment": "The merge OID" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_repository_mergehead_foreach" + } + ], + "argline": "const git_oid *oid, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over each MERGE_HEAD entry

\n", "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of `git_worktree_prune_t` " - } - ], - "used": { - "returns": [], - "needs": [ - "git_worktree_is_prunable", - "git_worktree_prune", - "git_worktree_prune_options_init" - ] - } - } - ], - [ - "git_worktree_prune_t", - { - "decl": [ - "GIT_WORKTREE_PRUNE_VALID", - "GIT_WORKTREE_PRUNE_LOCKED", - "GIT_WORKTREE_PRUNE_WORKING_TREE" - ], - "type": "enum", - "file": "git2/worktree.h", - "line": 182, - "lineto": 189, - "block": "GIT_WORKTREE_PRUNE_VALID\nGIT_WORKTREE_PRUNE_LOCKED\nGIT_WORKTREE_PRUNE_WORKING_TREE", - "tdef": "typedef", - "description": " Flags which can be passed to git_worktree_prune to alter its\n behavior.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_WORKTREE_PRUNE_VALID", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_WORKTREE_PRUNE_LOCKED", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_WORKTREE_PRUNE_WORKING_TREE", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_writestream", - { - "decl": [ - "int (*)(git_writestream *, const char *, size_t) write", - "int (*)(git_writestream *) close", - "void (*)(git_writestream *) free" - ], - "type": "struct", - "value": "git_writestream", - "file": "git2/types.h", - "line": 359, - "lineto": 363, - "tdef": null, - "description": " A type to write in a streaming fashion, for example, for filters. ", - "comments": "", - "fields": [ - { - "type": "int (*)(git_writestream *, const char *, size_t)", - "name": "write", + }, + "git_revwalk_hide_cb": { + "type": "callback", + "file": "git2/revwalk.h", + "line": 283, + "lineto": 285, + "args": [ + { + "name": "commit_id", + "type": "const git_oid *", + "comment": "oid of Commit" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified pointer to data to be passed as data payload" + } + ], + "argline": "const git_oid *commit_id, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to hide the commmit and it parent." + }, + "description": "

This is a callback function that user can provide to hide a\n commit and its parents. If the callback function returns non-zero value,\n then this commit and its parents will be hidden.

\n", + "comments": "" + }, + "git_stash_apply_progress_cb": { + "type": "callback", + "file": "git2/stash.h", + "line": 169, + "lineto": 171, + "args": [ + { + "name": "progress", + "type": "git_stash_apply_progress_t", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "git_stash_apply_progress_t progress, void *payload", + "sig": "git_stash_apply_progress_t::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Stash application progress notification function.\n Return 0 to continue processing, or a negative value to\n abort the stash application.

\n", + "comments": "" + }, + "git_stash_cb": { + "type": "callback", + "file": "git2/stash.h", + "line": 255, + "lineto": 259, + "args": [ + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "message", + "type": "const char *", + "comment": "The stash message." + }, + { + "name": "stash_id", + "type": "const git_oid *", + "comment": "The commit oid of the stashed state." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "size_t index, const char *message, const git_oid *stash_id, void *payload", + "sig": "size_t::const char *::const git_oid *::void *", + "return": { + "type": "int", + "comment": " 0 to continue iterating or non-zero to stop." + }, + "description": "

This is a callback function you can provide to iterate over all the\n stashed states that will be invoked per entry.

\n", + "comments": "" + }, + "git_status_cb": { + "type": "callback", + "file": "git2/status.h", + "line": 63, + "lineto": 64, + "args": [ + { + "name": "path", + "type": "const char *", + "comment": null + }, + { + "name": "status_flags", + "type": "unsigned int", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const char *path, unsigned int status_flags, void *payload", + "sig": "const char *::unsigned int::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Function pointer to receive status on individual files

\n", + "comments": "

path is the relative path to the file from the root of the repository.

\n\n

status_flags is a combination of git_status_t values that apply.

\n\n

payload is the value you passed to the foreach function as payload.

\n" + }, + "git_submodule_cb": { + "type": "callback", + "file": "git2/submodule.h", + "line": 118, + "lineto": 119, + "args": [ + { + "name": "sm", + "type": "git_submodule *", + "comment": "git_submodule currently being visited" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the submodule" + }, + { + "name": "payload", + "type": "void *", + "comment": "value you passed to the foreach function as payload" + } + ], + "argline": "git_submodule *sm, const char *name, void *payload", + "sig": "git_submodule *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 on success or error code" + }, + "description": "

Function pointer to receive each submodule

\n", + "comments": "" + }, + "git_tag_foreach_cb": { + "type": "callback", + "file": "git2/tag.h", + "line": 330, + "lineto": 330, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The tag name" + }, + { + "name": "oid", + "type": "git_oid *", + "comment": "The tag's OID" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_tag_foreach" + } + ], + "argline": "const char *name, git_oid *oid, void *payload", + "sig": "const char *::git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over tag names

\n", + "comments": "" + }, + "git_trace_cb": { + "type": "callback", + "file": "git2/trace.h", + "line": 52, + "lineto": 52, + "args": [ + { + "name": "level", + "type": "git_trace_level_t", + "comment": null + }, + { + "name": "msg", + "type": "const char *", + "comment": null + } + ], + "argline": "git_trace_level_t level, const char *msg", + "sig": "git_trace_level_t::const char *", + "return": { + "type": "void", + "comment": null + }, + "description": "

An instance for a tracing function

\n", "comments": "" - }, - { - "type": "int (*)(git_writestream *)", - "name": "close", + }, + "git_transport_message_cb": { + "type": "callback", + "file": "git2/transport.h", + "line": 34, + "lineto": 34, + "args": [ + { + "name": "str", + "type": "const char *", + "comment": "The message from the transport" + }, + { + "name": "len", + "type": "int", + "comment": "The length of the message" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "const char *str, int len, void *payload", + "sig": "const char *::int::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for messages received by the transport.

\n", + "comments": "

Return a negative value to cancel the network operation.

\n" + }, + "git_transport_cb": { + "type": "callback", + "file": "git2/transport.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_transport **", + "comment": null + }, + { + "name": "owner", + "type": "git_remote *", + "comment": null + }, + { + "name": "param", + "type": "void *", + "comment": null + } + ], + "argline": "git_transport **out, git_remote *owner, void *param", + "sig": "git_transport **::git_remote *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Signature of a function which creates a transport

\n", "comments": "" - }, - { - "type": "void (*)(git_writestream *)", - "name": "free", + }, + "git_treebuilder_filter_cb": { + "type": "callback", + "file": "git2/tree.h", + "line": 349, + "lineto": 350, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const git_tree_entry *entry, void *payload", + "sig": "const git_tree_entry *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for git_treebuilder_filter

\n", + "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" + }, + "git_treewalk_cb": { + "type": "callback", + "file": "git2/tree.h", + "line": 383, + "lineto": 384, + "args": [ + { + "name": "root", + "type": "const char *", + "comment": null + }, + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": null + }, + { + "name": "payload", + "type": "void *", + "comment": null + } + ], + "argline": "const char *root, const git_tree_entry *entry, void *payload", + "sig": "const char *::const git_tree_entry *::void *", + "return": { + "type": "int", + "comment": null + }, + "description": "

Callback for the tree traversal method

\n", "comments": "" - } - ], - "block": "int (*)(git_writestream *, const char *, size_t) write\nint (*)(git_writestream *) close\nvoid (*)(git_writestream *) free", - "used": { - "returns": [], - "needs": [ - "git_blob_create_from_stream", - "git_blob_create_from_stream_commit", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] } - } - ] - ], - "prefix": "include", - "groups": [ - [ - "annotated", - [ - "git_annotated_commit_free", - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_from_ref", - "git_annotated_commit_from_revspec", - "git_annotated_commit_id", - "git_annotated_commit_lookup", - "git_annotated_commit_ref" - ] - ], - [ - "apply", - [ - "git_apply", - "git_apply_to_tree" - ] - ], - [ - "attr", - [ - "git_attr_add_macro", - "git_attr_cache_flush", - "git_attr_foreach", - "git_attr_foreach_ext", - "git_attr_get", - "git_attr_get_ext", - "git_attr_get_many", - "git_attr_get_many_ext", - "git_attr_value" - ] - ], - [ - "blame", - [ - "git_blame_buffer", - "git_blame_file", - "git_blame_free", - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline", - "git_blame_get_hunk_count", - "git_blame_init_options", - "git_blame_options_init" - ] - ], - [ - "blob", - [ - "git_blob_create_from_buffer", - "git_blob_create_from_disk", - "git_blob_create_from_stream", - "git_blob_create_from_stream_commit", - "git_blob_create_from_workdir", - "git_blob_dup", - "git_blob_filter", - "git_blob_filter_options_init", - "git_blob_filtered_content", - "git_blob_free", - "git_blob_id", - "git_blob_is_binary", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_blob_owner", - "git_blob_rawcontent", - "git_blob_rawsize" - ] - ], - [ - "branch", - [ - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_delete", - "git_branch_is_checked_out", - "git_branch_is_head", - "git_branch_iterator_free", - "git_branch_iterator_new", - "git_branch_lookup", - "git_branch_move", - "git_branch_name", - "git_branch_name_is_valid", - "git_branch_next", - "git_branch_remote_name", - "git_branch_set_upstream", - "git_branch_upstream", - "git_branch_upstream_merge", - "git_branch_upstream_name", - "git_branch_upstream_remote" - ] - ], - [ - "buf", - [ - "git_buf_contains_nul", - "git_buf_dispose", - "git_buf_free", - "git_buf_grow", - "git_buf_is_binary", - "git_buf_set" - ] - ], - [ - "checkout", - [ - "git_checkout_head", - "git_checkout_index", - "git_checkout_options_init", - "git_checkout_tree" - ] - ], - [ - "cherrypick", - [ - "git_cherrypick", - "git_cherrypick_commit", - "git_cherrypick_options_init" - ] - ], - [ - "clone", - [ - "git_clone", - "git_clone_options_init" - ] - ], - [ - "commit", - [ - "git_commit_amend", - "git_commit_author", - "git_commit_author_with_mailmap", - "git_commit_body", - "git_commit_committer", - "git_commit_committer_with_mailmap", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_v", - "git_commit_create_with_signature", - "git_commit_dup", - "git_commit_extract_signature", - "git_commit_free", - "git_commit_header_field", - "git_commit_id", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_commit_message", - "git_commit_message_encoding", - "git_commit_message_raw", - "git_commit_nth_gen_ancestor", - "git_commit_owner", - "git_commit_parent", - "git_commit_parent_id", - "git_commit_parentcount", - "git_commit_raw_header", - "git_commit_summary", - "git_commit_time", - "git_commit_time_offset", - "git_commit_tree", - "git_commit_tree_id" - ] - ], - [ - "config", - [ - "git_config_add_file_ondisk", - "git_config_backend_foreach_match", - "git_config_delete_entry", - "git_config_delete_multivar", - "git_config_entry_free", - "git_config_find_global", - "git_config_find_programdata", - "git_config_find_system", - "git_config_find_xdg", - "git_config_foreach", - "git_config_foreach_match", - "git_config_free", - "git_config_get_bool", - "git_config_get_entry", - "git_config_get_int32", - "git_config_get_int64", - "git_config_get_mapped", - "git_config_get_multivar_foreach", - "git_config_get_path", - "git_config_get_string", - "git_config_get_string_buf", - "git_config_iterator_free", - "git_config_iterator_glob_new", - "git_config_iterator_new", - "git_config_lock", - "git_config_lookup_map_value", - "git_config_multivar_iterator_new", - "git_config_new", - "git_config_next", - "git_config_open_default", - "git_config_open_global", - "git_config_open_level", - "git_config_open_ondisk", - "git_config_parse_bool", - "git_config_parse_int32", - "git_config_parse_int64", - "git_config_parse_path", - "git_config_set_bool", - "git_config_set_int32", - "git_config_set_int64", - "git_config_set_multivar", - "git_config_set_string", - "git_config_snapshot" - ] - ], - [ - "credential", - [ - "git_credential_default_new", - "git_credential_free", - "git_credential_get_username", - "git_credential_has_username", - "git_credential_ssh_custom_new", - "git_credential_ssh_interactive_new", - "git_credential_ssh_key_from_agent", - "git_credential_ssh_key_memory_new", - "git_credential_ssh_key_new", - "git_credential_username_new", - "git_credential_userpass", - "git_credential_userpass_plaintext_new" - ] - ], - [ - "describe", - [ - "git_describe_commit", - "git_describe_format", - "git_describe_format_options_init", - "git_describe_options_init", - "git_describe_result_free", - "git_describe_workdir" - ] - ], - [ - "diff", - [ - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_commit_as_email", - "git_diff_find_options_init", - "git_diff_find_similar", - "git_diff_foreach", - "git_diff_format_email", - "git_diff_format_email_options_init", - "git_diff_free", - "git_diff_from_buffer", - "git_diff_get_delta", - "git_diff_get_stats", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_is_sorted_icase", - "git_diff_merge", - "git_diff_num_deltas", - "git_diff_num_deltas_of_type", - "git_diff_options_init", - "git_diff_patchid", - "git_diff_patchid_options_init", - "git_diff_print", - "git_diff_stats_deletions", - "git_diff_stats_files_changed", - "git_diff_stats_free", - "git_diff_stats_insertions", - "git_diff_stats_to_buf", - "git_diff_status_char", - "git_diff_to_buf", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index" - ] - ], - [ - "error", - [ - "git_error_clear", - "git_error_last", - "git_error_set_oom", - "git_error_set_str" - ] - ], - [ - "fetch", - [ - "git_fetch_options_init" - ] - ], - [ - "filter", - [ - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_contains", - "git_filter_list_free", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] - ], - [ - "giterr", - [ - "giterr_clear", - "giterr_last", - "giterr_set_oom", - "giterr_set_str" - ] - ], - [ - "graph", - [ - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any" - ] - ], - [ - "ignore", - [ - "git_ignore_add_rule", - "git_ignore_clear_internal_rules", - "git_ignore_path_is_ignored" - ] - ], - [ - "index", - [ - "git_index_add", - "git_index_add_all", - "git_index_add_bypath", - "git_index_add_from_buffer", - "git_index_caps", - "git_index_checksum", - "git_index_clear", - "git_index_conflict_add", - "git_index_conflict_cleanup", - "git_index_conflict_get", - "git_index_conflict_iterator_free", - "git_index_conflict_iterator_new", - "git_index_conflict_next", - "git_index_conflict_remove", - "git_index_entry_is_conflict", - "git_index_entry_stage", - "git_index_entrycount", - "git_index_find", - "git_index_find_prefix", - "git_index_free", - "git_index_get_byindex", - "git_index_get_bypath", - "git_index_has_conflicts", - "git_index_iterator_free", - "git_index_iterator_new", - "git_index_iterator_next", - "git_index_new", - "git_index_open", - "git_index_owner", - "git_index_path", - "git_index_read", - "git_index_read_tree", - "git_index_remove", - "git_index_remove_all", - "git_index_remove_bypath", - "git_index_remove_directory", - "git_index_set_caps", - "git_index_set_version", - "git_index_update_all", - "git_index_version", - "git_index_write", - "git_index_write_tree", - "git_index_write_tree_to" - ] - ], - [ - "indexer", - [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_free", - "git_indexer_hash", - "git_indexer_new", - "git_indexer_options_init" - ] - ], - [ - "libgit2", - [ - "git_libgit2_features", - "git_libgit2_init", - "git_libgit2_opts", - "git_libgit2_shutdown", - "git_libgit2_version" - ] - ], - [ - "mailmap", - [ - "git_mailmap_add_entry", - "git_mailmap_free", - "git_mailmap_from_buffer", - "git_mailmap_from_repository", - "git_mailmap_new", - "git_mailmap_resolve", - "git_mailmap_resolve_signature" - ] - ], - [ - "merge", - [ - "git_merge", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_merge_base", - "git_merge_base_many", - "git_merge_base_octopus", - "git_merge_bases", - "git_merge_bases_many", - "git_merge_commits", - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_input_init", - "git_merge_file_options_init", - "git_merge_file_result_free", - "git_merge_options_init", - "git_merge_trees" - ] - ], - [ - "message", - [ - "git_message_prettify", - "git_message_trailer_array_free", - "git_message_trailers" - ] - ], - [ - "note", - [ - "git_note_author", - "git_note_commit_create", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_committer", - "git_note_create", - "git_note_default_ref", - "git_note_foreach", - "git_note_free", - "git_note_id", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_message", - "git_note_next", - "git_note_read", - "git_note_remove" - ] - ], - [ - "object", - [ - "git_object__size", - "git_object_dup", - "git_object_free", - "git_object_id", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_owner", - "git_object_peel", - "git_object_short_id", - "git_object_string2type", - "git_object_type", - "git_object_type2string", - "git_object_typeisloose" - ] - ], - [ - "odb", - [ - "git_odb_add_alternate", - "git_odb_add_backend", - "git_odb_add_disk_alternate", - "git_odb_backend_loose", - "git_odb_backend_one_pack", - "git_odb_backend_pack", - "git_odb_exists", - "git_odb_exists_prefix", - "git_odb_expand_ids", - "git_odb_foreach", - "git_odb_free", - "git_odb_get_backend", - "git_odb_hash", - "git_odb_hashfile", - "git_odb_new", - "git_odb_num_backends", - "git_odb_object_data", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_open", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read", - "git_odb_read_header", - "git_odb_read_prefix", - "git_odb_refresh", - "git_odb_set_commit_graph", - "git_odb_stream_finalize_write", - "git_odb_stream_free", - "git_odb_stream_read", - "git_odb_stream_write", - "git_odb_write", - "git_odb_write_multi_pack_index", - "git_odb_write_pack" - ] - ], - [ - "oid", - [ - "git_oid_cmp", - "git_oid_cpy", - "git_oid_equal", - "git_oid_fmt", - "git_oid_fromraw", - "git_oid_fromstr", - "git_oid_fromstrn", - "git_oid_fromstrp", - "git_oid_is_zero", - "git_oid_iszero", - "git_oid_ncmp", - "git_oid_nfmt", - "git_oid_pathfmt", - "git_oid_shorten_add", - "git_oid_shorten_free", - "git_oid_shorten_new", - "git_oid_strcmp", - "git_oid_streq", - "git_oid_tostr", - "git_oid_tostr_s" - ] - ], - [ - "oidarray", - [ - "git_oidarray_dispose", - "git_oidarray_free" - ] - ], - [ - "packbuilder", - [ - "git_packbuilder_foreach", - "git_packbuilder_free", - "git_packbuilder_hash", - "git_packbuilder_insert", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_recur", - "git_packbuilder_insert_tree", - "git_packbuilder_insert_walk", - "git_packbuilder_new", - "git_packbuilder_object_count", - "git_packbuilder_set_callbacks", - "git_packbuilder_set_threads", - "git_packbuilder_write", - "git_packbuilder_write_buf", - "git_packbuilder_written" - ] - ], - [ - "patch", - [ - "git_patch_free", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers", - "git_patch_from_diff", - "git_patch_get_delta", - "git_patch_get_hunk", - "git_patch_get_line_in_hunk", - "git_patch_line_stats", - "git_patch_num_hunks", - "git_patch_num_lines_in_hunk", - "git_patch_owner", - "git_patch_print", - "git_patch_size", - "git_patch_to_buf" - ] - ], - [ - "pathspec", - [ - "git_pathspec_free", - "git_pathspec_match_diff", - "git_pathspec_match_index", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_failed_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_free", - "git_pathspec_match_tree", - "git_pathspec_match_workdir", - "git_pathspec_matches_path", - "git_pathspec_new" - ] - ], - [ - "proxy", - [ - "git_proxy_options_init" - ] - ], - [ - "push", - [ - "git_push_options_init" - ] - ], - [ - "rebase", - [ - "git_rebase_abort", - "git_rebase_commit", - "git_rebase_finish", - "git_rebase_free", - "git_rebase_init", - "git_rebase_inmemory_index", - "git_rebase_next", - "git_rebase_onto_id", - "git_rebase_onto_name", - "git_rebase_open", - "git_rebase_operation_byindex", - "git_rebase_operation_current", - "git_rebase_operation_entrycount", - "git_rebase_options_init", - "git_rebase_orig_head_id", - "git_rebase_orig_head_name" - ] - ], - [ - "refdb", - [ - "git_refdb_compress", - "git_refdb_free", - "git_refdb_new", - "git_refdb_open" - ] - ], - [ - "reference", - [ - "git_reference_cmp", - "git_reference_create", - "git_reference_create_matching", - "git_reference_delete", - "git_reference_dup", - "git_reference_dwim", - "git_reference_ensure_log", - "git_reference_foreach", - "git_reference_foreach_glob", - "git_reference_foreach_name", - "git_reference_free", - "git_reference_has_log", - "git_reference_is_branch", - "git_reference_is_note", - "git_reference_is_remote", - "git_reference_is_tag", - "git_reference_is_valid_name", - "git_reference_iterator_free", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_list", - "git_reference_lookup", - "git_reference_name", - "git_reference_name_is_valid", - "git_reference_name_to_id", - "git_reference_next", - "git_reference_next_name", - "git_reference_normalize_name", - "git_reference_owner", - "git_reference_peel", - "git_reference_remove", - "git_reference_rename", - "git_reference_resolve", - "git_reference_set_target", - "git_reference_shorthand", - "git_reference_symbolic_create", - "git_reference_symbolic_create_matching", - "git_reference_symbolic_set_target", - "git_reference_symbolic_target", - "git_reference_target", - "git_reference_target_peel", - "git_reference_type" - ] - ], - [ - "reflog", - [ - "git_reflog_append", - "git_reflog_delete", - "git_reflog_drop", - "git_reflog_entry_byindex", - "git_reflog_entry_committer", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_reflog_entry_message", - "git_reflog_entrycount", - "git_reflog_free", - "git_reflog_read", - "git_reflog_rename", - "git_reflog_write" - ] - ], - [ - "refspec", - [ - "git_refspec_direction", - "git_refspec_dst", - "git_refspec_dst_matches", - "git_refspec_force", - "git_refspec_free", - "git_refspec_parse", - "git_refspec_rtransform", - "git_refspec_src", - "git_refspec_src_matches", - "git_refspec_string", - "git_refspec_transform" - ] - ], - [ - "remote", - [ - "git_remote_add_fetch", - "git_remote_add_push", - "git_remote_autotag", - "git_remote_connect", - "git_remote_connected", - "git_remote_create", - "git_remote_create_anonymous", - "git_remote_create_detached", - "git_remote_create_options_init", - "git_remote_create_with_fetchspec", - "git_remote_create_with_opts", - "git_remote_default_branch", - "git_remote_delete", - "git_remote_disconnect", - "git_remote_download", - "git_remote_dup", - "git_remote_fetch", - "git_remote_free", - "git_remote_get_fetch_refspecs", - "git_remote_get_push_refspecs", - "git_remote_get_refspec", - "git_remote_init_callbacks", - "git_remote_is_valid_name", - "git_remote_list", - "git_remote_lookup", - "git_remote_ls", - "git_remote_name", - "git_remote_name_is_valid", - "git_remote_owner", - "git_remote_prune", - "git_remote_prune_refs", - "git_remote_push", - "git_remote_pushurl", - "git_remote_refspec_count", - "git_remote_rename", - "git_remote_set_autotag", - "git_remote_set_instance_pushurl", - "git_remote_set_instance_url", - "git_remote_set_pushurl", - "git_remote_set_url", - "git_remote_stats", - "git_remote_stop", - "git_remote_update_tips", - "git_remote_upload", - "git_remote_url" - ] - ], - [ - "repository", - [ - "git_repository_commondir", - "git_repository_config", - "git_repository_config_snapshot", - "git_repository_detach_head", - "git_repository_discover", - "git_repository_fetchhead_foreach", - "git_repository_free", - "git_repository_get_namespace", - "git_repository_hashfile", - "git_repository_head", - "git_repository_head_detached", - "git_repository_head_detached_for_worktree", - "git_repository_head_for_worktree", - "git_repository_head_unborn", - "git_repository_ident", - "git_repository_index", - "git_repository_init", - "git_repository_init_ext", - "git_repository_init_options_init", - "git_repository_is_bare", - "git_repository_is_empty", - "git_repository_is_shallow", - "git_repository_is_worktree", - "git_repository_item_path", - "git_repository_mergehead_foreach", - "git_repository_message", - "git_repository_message_remove", - "git_repository_odb", - "git_repository_open", - "git_repository_open_bare", - "git_repository_open_ext", - "git_repository_open_from_worktree", - "git_repository_path", - "git_repository_refdb", - "git_repository_set_head", - "git_repository_set_head_detached", - "git_repository_set_head_detached_from_annotated", - "git_repository_set_ident", - "git_repository_set_namespace", - "git_repository_set_workdir", - "git_repository_state", - "git_repository_state_cleanup", - "git_repository_workdir", - "git_repository_wrap_odb" - ] - ], - [ - "reset", - [ - "git_reset", - "git_reset_default", - "git_reset_from_annotated" - ] - ], - [ - "revert", - [ - "git_revert", - "git_revert_commit", - "git_revert_options_init" - ] - ], - [ - "revparse", - [ - "git_revparse", - "git_revparse_ext", - "git_revparse_single" - ] - ], - [ - "revwalk", - [ - "git_revwalk_add_hide_cb", - "git_revwalk_free", - "git_revwalk_hide", - "git_revwalk_hide_glob", - "git_revwalk_hide_head", - "git_revwalk_hide_ref", - "git_revwalk_new", - "git_revwalk_next", - "git_revwalk_push", - "git_revwalk_push_glob", - "git_revwalk_push_head", - "git_revwalk_push_range", - "git_revwalk_push_ref", - "git_revwalk_repository", - "git_revwalk_reset", - "git_revwalk_simplify_first_parent", - "git_revwalk_sorting" - ] - ], - [ - "signature", - [ - "git_signature_default", - "git_signature_dup", - "git_signature_free", - "git_signature_from_buffer", - "git_signature_new", - "git_signature_now" - ] - ], - [ - "stash", - [ - "git_stash_apply", - "git_stash_apply_options_init", - "git_stash_drop", - "git_stash_foreach", - "git_stash_pop", - "git_stash_save" - ] - ], - [ - "status", - [ - "git_status_byindex", - "git_status_file", - "git_status_foreach", - "git_status_foreach_ext", - "git_status_list_entrycount", - "git_status_list_free", - "git_status_list_new", - "git_status_options_init", - "git_status_should_ignore" - ] - ], - [ - "strarray", - [ - "git_strarray_copy", - "git_strarray_dispose", - "git_strarray_free" - ] - ], - [ - "submodule", - [ - "git_submodule_add_finalize", - "git_submodule_add_setup", - "git_submodule_add_to_index", - "git_submodule_branch", - "git_submodule_clone", - "git_submodule_dup", - "git_submodule_fetch_recurse_submodules", - "git_submodule_foreach", - "git_submodule_free", - "git_submodule_head_id", - "git_submodule_ignore", - "git_submodule_index_id", - "git_submodule_init", - "git_submodule_location", - "git_submodule_lookup", - "git_submodule_name", - "git_submodule_open", - "git_submodule_owner", - "git_submodule_path", - "git_submodule_reload", - "git_submodule_repo_init", - "git_submodule_resolve_url", - "git_submodule_set_branch", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_set_ignore", - "git_submodule_set_update", - "git_submodule_set_url", - "git_submodule_status", - "git_submodule_sync", - "git_submodule_update", - "git_submodule_update_options_init", - "git_submodule_update_strategy", - "git_submodule_url", - "git_submodule_wd_id" - ] - ], - [ - "tag", - [ - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_delete", - "git_tag_dup", - "git_tag_foreach", - "git_tag_free", - "git_tag_id", - "git_tag_list", - "git_tag_list_match", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_tag_message", - "git_tag_name", - "git_tag_name_is_valid", - "git_tag_owner", - "git_tag_peel", - "git_tag_tagger", - "git_tag_target", - "git_tag_target_id", - "git_tag_target_type" - ] - ], - [ - "trace", - [ - "git_trace_set" - ] - ], - [ - "transaction", - [ - "git_transaction_commit", - "git_transaction_free", - "git_transaction_lock_ref", - "git_transaction_new", - "git_transaction_remove", - "git_transaction_set_reflog", - "git_transaction_set_symbolic_target", - "git_transaction_set_target" - ] - ], - [ - "tree", - [ - "git_tree_create_updated", - "git_tree_dup", - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_tree_entry_bypath", - "git_tree_entry_cmp", - "git_tree_entry_dup", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_free", - "git_tree_entry_id", - "git_tree_entry_name", - "git_tree_entry_to_object", - "git_tree_entry_type", - "git_tree_entrycount", - "git_tree_free", - "git_tree_id", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_tree_owner", - "git_tree_walk" - ] - ], - [ - "treebuilder", - [ - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_filter", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_new", - "git_treebuilder_remove", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer" - ] - ], - [ - "worktree", - [ - "git_worktree_add", - "git_worktree_add_options_init", - "git_worktree_free", - "git_worktree_is_locked", - "git_worktree_is_prunable", - "git_worktree_list", - "git_worktree_lock", - "git_worktree_lookup", - "git_worktree_name", - "git_worktree_open_from_repository", - "git_worktree_path", - "git_worktree_prune", - "git_worktree_prune_options_init", - "git_worktree_unlock", - "git_worktree_validate" - ] - ] - ], - "examples": [ - [ - "add.c", - "ex/v1.3.1/add.html" - ], - [ - "args.c", - "ex/v1.3.1/args.html" - ], - [ - "blame.c", - "ex/v1.3.1/blame.html" - ], - [ - "cat-file.c", - "ex/v1.3.1/cat-file.html" - ], - [ - "checkout.c", - "ex/v1.3.1/checkout.html" - ], - [ - "clone.c", - "ex/v1.3.1/clone.html" - ], - [ - "commit.c", - "ex/v1.3.1/commit.html" - ], - [ - "common.c", - "ex/v1.3.1/common.html" - ], - [ - "config.c", - "ex/v1.3.1/config.html" - ], - [ - "describe.c", - "ex/v1.3.1/describe.html" - ], - [ - "diff.c", - "ex/v1.3.1/diff.html" - ], - [ - "fetch.c", - "ex/v1.3.1/fetch.html" - ], - [ - "for-each-ref.c", - "ex/v1.3.1/for-each-ref.html" - ], - [ - "general.c", - "ex/v1.3.1/general.html" - ], - [ - "index-pack.c", - "ex/v1.3.1/index-pack.html" - ], - [ - "init.c", - "ex/v1.3.1/init.html" - ], - [ - "lg2.c", - "ex/v1.3.1/lg2.html" - ], - [ - "log.c", - "ex/v1.3.1/log.html" - ], - [ - "ls-files.c", - "ex/v1.3.1/ls-files.html" - ], - [ - "ls-remote.c", - "ex/v1.3.1/ls-remote.html" - ], - [ - "merge.c", - "ex/v1.3.1/merge.html" - ], - [ - "push.c", - "ex/v1.3.1/push.html" - ], - [ - "remote.c", - "ex/v1.3.1/remote.html" - ], - [ - "rev-list.c", - "ex/v1.3.1/rev-list.html" - ], - [ - "rev-parse.c", - "ex/v1.3.1/rev-parse.html" - ], - [ - "show-index.c", - "ex/v1.3.1/show-index.html" - ], - [ - "stash.c", - "ex/v1.3.1/stash.html" + }, + "globals": {}, + "types": [ + [ + "git_annotated_commit", + { + "decl": "git_annotated_commit", + "type": "struct", + "value": "git_annotated_commit", + "file": "git2/types.h", + "line": 198, + "lineto": 198, + "tdef": "typedef", + "description": " Annotated commits, the input to merge and rebase. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_annotated_commit_free", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_lookup", + "git_annotated_commit_ref", + "git_branch_create_from_annotated", + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_rebase_init", + "git_repository_set_head_detached_from_annotated", + "git_reset_from_annotated" + ] + } + } + ], + [ + "git_apply_flags_t", + { + "decl": [ + "GIT_APPLY_CHECK" + ], + "type": "enum", + "file": "git2/apply.h", + "line": 61, + "lineto": 67, + "block": "GIT_APPLY_CHECK", + "tdef": "typedef", + "description": " Flags controlling the behavior of git_apply ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_CHECK", + "comments": "

Don't actually make changes, just test that the patch applies.\n This is the equivalent of git apply --check.

\n", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_apply_location_t", + { + "decl": [ + "GIT_APPLY_LOCATION_WORKDIR", + "GIT_APPLY_LOCATION_INDEX", + "GIT_APPLY_LOCATION_BOTH" + ], + "type": "enum", + "file": "git2/apply.h", + "line": 127, + "lineto": 145, + "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", + "tdef": "typedef", + "description": " Possible application locations for git_apply ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_LOCATION_WORKDIR", + "comments": "

Apply the patch to the workdir, leaving the index untouched.\n This is the equivalent of git apply with no location argument.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_INDEX", + "comments": "

Apply the patch to the index, leaving the working directory\n untouched. This is the equivalent of git apply --cached.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_BOTH", + "comments": "

Apply the patch to both the working directory and the index.\n This is the equivalent of git apply --index.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [ + "git_apply" + ] + } + } + ], + [ + "git_apply_options", + { + "decl": [ + "unsigned int version", + "git_apply_delta_cb delta_cb", + "git_apply_hunk_cb hunk_cb", + "void * payload", + "unsigned int flags" + ], + "type": "struct", + "value": "git_apply_options", + "file": "git2/apply.h", + "line": 77, + "lineto": 91, + "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload\nunsigned int flags", + "tdef": "typedef", + "description": " Apply options structure", + "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "git_apply_delta_cb", + "name": "delta_cb", + "comments": " When applying a patch, callback that will be made per delta (file). " + }, + { + "type": "git_apply_hunk_cb", + "name": "hunk_cb", + "comments": " When applying a patch, callback that will be made per hunk. " + }, + { + "type": "void *", + "name": "payload", + "comments": " Payload passed to both delta_cb \n&\n hunk_cb. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Bitmask of git_apply_flags_t " + } + ], + "used": { + "returns": [], + "needs": [ + "git_apply", + "git_apply_options_init", + "git_apply_to_tree" + ] + } + } + ], + [ + "git_attr_options", + { + "decl": [ + "unsigned int version", + "unsigned int flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_attr_options", + "file": "git2/attr.h", + "line": 144, + "lineto": 161, + "block": "unsigned int version\nunsigned int flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " An options structure for querying attributes.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " A combination of GIT_ATTR_CHECK flags " + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": "" + }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_ATTR_CHECK_INCLUDE_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": [ + "git_attr_foreach_ext", + "git_attr_get_ext", + "git_attr_get_many_ext" + ] + } + } + ], + [ + "git_attr_value_t", + { + "decl": [ + "GIT_ATTR_VALUE_UNSPECIFIED", + "GIT_ATTR_VALUE_TRUE", + "GIT_ATTR_VALUE_FALSE", + "GIT_ATTR_VALUE_STRING" + ], + "type": "enum", + "file": "git2/attr.h", + "line": 82, + "lineto": 87, + "block": "GIT_ATTR_VALUE_UNSPECIFIED\nGIT_ATTR_VALUE_TRUE\nGIT_ATTR_VALUE_FALSE\nGIT_ATTR_VALUE_STRING", + "tdef": "typedef", + "description": " Possible states for an attribute", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ATTR_VALUE_UNSPECIFIED", + "comments": "

The attribute has been left unspecified

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_TRUE", + "comments": "

The attribute has been set

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_FALSE", + "comments": "

The attribute has been unset

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_STRING", + "comments": "

This attribute has a value

\n", + "value": 3 + } + ], + "used": { + "returns": [ + "git_attr_value" + ], + "needs": [] + } + } + ], + [ + "git_blame", + { + "decl": "git_blame", + "type": "struct", + "value": "git_blame", + "file": "git2/blame.h", + "line": 202, + "lineto": 202, + "tdef": "typedef", + "description": " Opaque structure to hold blame results ", + "comments": "", + "used": { + "returns": [ + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline" + ], + "needs": [ + "git_blame_buffer", + "git_blame_file", + "git_blame_free", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_get_hunk_count", + "git_blame_init_options", + "git_blame_options_init" + ] + } + } + ], + [ + "git_blame_flag_t", + { + "decl": [ + "GIT_BLAME_NORMAL", + "GIT_BLAME_TRACK_COPIES_SAME_FILE", + "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", + "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", + "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", + "GIT_BLAME_FIRST_PARENT", + "GIT_BLAME_USE_MAILMAP", + "GIT_BLAME_IGNORE_WHITESPACE" + ], + "type": "enum", + "file": "git2/blame.h", + "line": 26, + "lineto": 77, + "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", + "tdef": "typedef", + "description": " Flags for indicating option behavior for git_blame APIs.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BLAME_NORMAL", + "comments": "

Normal blame, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_FILE", + "comments": "

Track lines that have moved within a file (like git blame -M).

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", + "comments": "

Track lines that have moved across files in the same commit\n (like git blame -C).

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", + "comments": "

Track lines that have been copied from another file that exists\n in the same commit (like git blame -CC). Implies SAME_FILE.

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", + "comments": "

Track lines that have been copied from another file that exists in\n any commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_BLAME_FIRST_PARENT", + "comments": "

Restrict the search of commits to those reachable following only\n the first parents.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_BLAME_USE_MAILMAP", + "comments": "

Use mailmap file to map author and committer names and email\n addresses to canonical real names and email addresses. The\n mailmap will be read from the working directory, or HEAD in a\n bare repository.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_BLAME_IGNORE_WHITESPACE", + "comments": "

Ignore whitespace differences

\n", + "value": 64 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_blame_hunk", + { + "decl": [ + "size_t lines_in_hunk", + "git_oid final_commit_id", + "size_t final_start_line_number", + "git_signature * final_signature", + "git_oid orig_commit_id", + "const char * orig_path", + "size_t orig_start_line_number", + "git_signature * orig_signature", + "char boundary" + ], + "type": "struct", + "value": "git_blame_hunk", + "file": "git2/blame.h", + "line": 145, + "lineto": 198, + "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", + "tdef": "typedef", + "description": " Structure that represents a blame hunk.", + "comments": "", + "fields": [ + { + "type": "size_t", + "name": "lines_in_hunk", + "comments": " The number of lines in this hunk." + }, + { + "type": "git_oid", + "name": "final_commit_id", + "comments": " The OID of the commit where this line was last changed." + }, + { + "type": "size_t", + "name": "final_start_line_number", + "comments": " The 1-based line number where this hunk begins, in the final version\n of the file." + }, + { + "type": "git_signature *", + "name": "final_signature", + "comments": " The author of `final_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." + }, + { + "type": "git_oid", + "name": "orig_commit_id", + "comments": " The OID of the commit where this hunk was found.\n This will usually be the same as `final_commit_id`, except when\n `GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES` has been specified." + }, + { + "type": "const char *", + "name": "orig_path", + "comments": " The path to the file where this hunk originated, as of the commit\n specified by `orig_commit_id`." + }, + { + "type": "size_t", + "name": "orig_start_line_number", + "comments": " The 1-based line number where this hunk begins in the file named by\n `orig_path` in the commit specified by `orig_commit_id`." + }, + { + "type": "git_signature *", + "name": "orig_signature", + "comments": " The author of `orig_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." + }, + { + "type": "char", + "name": "boundary", + "comments": " The 1 iff the hunk has been tracked to a boundary commit (the root,\n or the commit specified in git_blame_options.oldest_commit)" + } + ], + "used": { + "returns": [ + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline" + ], + "needs": [] + } + } + ], + [ + "git_blame_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint16_t min_match_characters", + "git_oid newest_commit", + "git_oid oldest_commit", + "size_t min_line", + "size_t max_line" + ], + "type": "struct", + "value": "git_blame_options", + "file": "git2/blame.h", + "line": 86, + "lineto": 123, + "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", + "tdef": "typedef", + "description": " Blame options structure", + "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can use git_blame_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_blame_flag_t` " + }, + { + "type": "uint16_t", + "name": "min_match_characters", + "comments": " The lower bound on the number of alphanumeric characters that\n must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value\n is 20.\n\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." + }, + { + "type": "git_oid", + "name": "newest_commit", + "comments": " The id of the newest commit to consider. The default is HEAD. " + }, + { + "type": "git_oid", + "name": "oldest_commit", + "comments": " The id of the oldest commit to consider.\n The default is the first commit encountered with a NULL parent." + }, + { + "type": "size_t", + "name": "min_line", + "comments": " The first line in the file to blame.\n The default is 1 (line numbers start with 1)." + }, + { + "type": "size_t", + "name": "max_line", + "comments": " The last line in the file to blame.\n The default is the last line of the file." + } + ], + "used": { + "returns": [], + "needs": [ + "git_blame_file", + "git_blame_init_options", + "git_blame_options_init" + ] + } + } + ], + [ + "git_blob", + { + "decl": "git_blob", + "type": "struct", + "value": "git_blob", + "file": "git2/types.h", + "line": 133, + "lineto": 133, + "tdef": "typedef", + "description": " In-memory representation of a blob object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_blob_dup", + "git_blob_filter", + "git_blob_filter_options_init", + "git_blob_filtered_content", + "git_blob_free", + "git_blob_id", + "git_blob_is_binary", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_filter_list_apply_to_blob", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs" + ] + } + } + ], + [ + "git_blob_filter_flag_t", + { + "decl": [ + "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT" + ], + "type": "enum", + "file": "git2/blob.h", + "line": 102, + "lineto": 123, + "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", + "tdef": "typedef", + "description": " Flags to control the functionality of `git_blob_filter`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "comments": "

When set, filters will not be applied to binary files.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

When set, filters will not load configuration from the\n system-wide gitattributes in /etc (or system equivalent).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the specified commit.

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_blob_filter_options", + { + "decl": [ + "int version", + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_blob_filter_options", + "file": "git2/blob.h", + "line": 132, + "lineto": 149, + "block": "int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " The options used when applying filter options to a file.", + "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n", + "fields": [ + { + "type": "int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above " + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": "" + }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": [ + "git_blob_filter", + "git_blob_filter_options_init" + ] + } + } + ], + [ + "git_branch_iterator", + { + "decl": "git_branch_iterator", + "type": "struct", + "value": "git_branch_iterator", + "file": "git2/branch.h", + "line": 90, + "lineto": 90, + "tdef": "typedef", + "description": " Iterator type for branches ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_branch_iterator_free", + "git_branch_iterator_new", + "git_branch_next" + ] + } + } + ], + [ + "git_branch_t", + { + "decl": [ + "GIT_BRANCH_LOCAL", + "GIT_BRANCH_REMOTE", + "GIT_BRANCH_ALL" + ], + "type": "enum", + "file": "git2/types.h", + "line": 215, + "lineto": 219, + "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", + "tdef": "typedef", + "description": " Basic type of any Git branch. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BRANCH_LOCAL", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BRANCH_REMOTE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BRANCH_ALL", + "comments": "", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [ + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_next" + ] + } + } + ], + [ + "git_buf", + { + "decl": [ + "char * ptr", + "size_t reserved", + "size_t size" + ], + "type": "struct", + "value": "git_buf", + "file": "git2/buffer.h", + "line": 33, + "lineto": 52, + "block": "char * ptr\nsize_t reserved\nsize_t size", + "tdef": "typedef", + "description": " A data buffer for exporting data from libgit2", + "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. To make ownership clear in these cases, libgit2 uses git_buf to return this data. Callers should use git_buf_dispose() to release the memory when they are done.

\n\n

A git_buf contains a pointer to a NUL-terminated C string, and the length of the string (not including the NUL terminator).

\n", + "fields": [ + { + "type": "char *", + "name": "ptr", + "comments": " The buffer contents. `ptr` points to the start of the buffer\n being returned. The buffer's length (in bytes) is specified\n by the `size` member of the structure, and contains a NUL\n terminator at position `(size + 1)`." + }, + { + "type": "size_t", + "name": "reserved", + "comments": " This field is reserved and unused." + }, + { + "type": "size_t", + "name": "size", + "comments": " The length (in bytes) of the buffer pointed to by `ptr`,\n not including a NUL terminator." + } + ], + "used": { + "returns": [], + "needs": [ + "git_blob_filter", + "git_blob_filtered_content", + "git_branch_remote_name", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote", + "git_buf_contains_nul", + "git_buf_dispose", + "git_buf_free", + "git_buf_grow", + "git_buf_is_binary", + "git_buf_set", + "git_commit_create_buffer", + "git_commit_extract_signature", + "git_commit_header_field", + "git_commit_signing_cb", + "git_config_find_global", + "git_config_find_programdata", + "git_config_find_system", + "git_config_find_xdg", + "git_config_get_path", + "git_config_get_string_buf", + "git_config_parse_path", + "git_describe_format", + "git_diff_commit_as_email", + "git_diff_format_email", + "git_diff_stats_to_buf", + "git_diff_to_buf", + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_stream_data", + "git_message_prettify", + "git_note_default_ref", + "git_object_short_id", + "git_packbuilder_write_buf", + "git_patch_to_buf", + "git_refspec_rtransform", + "git_refspec_transform", + "git_remote_default_branch", + "git_repository_discover", + "git_repository_item_path", + "git_repository_message", + "git_submodule_resolve_url", + "git_treebuilder_write_with_buffer", + "git_url_resolve_cb", + "git_worktree_is_locked" + ] + } + } + ], + [ + "git_cert", + { + "decl": "git_cert", + "type": "struct", + "value": "git_cert", + "file": "git2/types.h", + "line": 262, + "lineto": 262, + "block": "git_cert_t cert_type", + "tdef": "typedef", + "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", + "comments": "", + "fields": [ + { + "type": "git_cert_t", + "name": "cert_type", + "comments": " Type of certificate. A `GIT_CERT_` value." + } + ], + "used": { + "returns": [], + "needs": [ + "git_transport_certificate_check_cb" + ] + } + } + ], + [ + "git_cert_hostkey", + { + "decl": [ + "git_cert parent", + "git_cert_ssh_t type", + "unsigned char [16] hash_md5", + "unsigned char [20] hash_sha1", + "unsigned char [32] hash_sha256", + "git_cert_ssh_raw_type_t raw_type", + "const char * hostkey", + "size_t hostkey_len" + ], + "type": "struct", + "value": "git_cert_hostkey", + "file": "git2/cert.h", + "line": 108, + "lineto": 151, + "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", + "tdef": "typedef", + "description": " Hostkey information taken from libssh2", + "comments": "", + "fields": [ + { + "type": "git_cert", + "name": "parent", + "comments": " The parent cert " + }, + { + "type": "git_cert_ssh_t", + "name": "type", + "comments": " A bitmask containing the available fields." + }, + { + "type": "unsigned char [16]", + "name": "hash_md5", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey." + }, + { + "type": "unsigned char [20]", + "name": "hash_sha1", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." + }, + { + "type": "unsigned char [32]", + "name": "hash_sha256", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." + }, + { + "type": "git_cert_ssh_raw_type_t", + "name": "raw_type", + "comments": " Raw hostkey type. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the type of the raw hostkey." + }, + { + "type": "const char *", + "name": "hostkey", + "comments": " Pointer to the raw hostkey. If `type` has `GIT_CERT_SSH_RAW` set,\n this will have the raw contents of the hostkey." + }, + { + "type": "size_t", + "name": "hostkey_len", + "comments": " Raw hostkey length. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the length of the raw contents of the hostkey." + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_cert_ssh_t", + { + "decl": [ + "GIT_CERT_SSH_MD5", + "GIT_CERT_SSH_SHA1", + "GIT_CERT_SSH_SHA256", + "GIT_CERT_SSH_RAW" + ], + "type": "enum", + "file": "git2/cert.h", + "line": 77, + "lineto": 86, + "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256\nGIT_CERT_SSH_RAW", + "tdef": "typedef", + "description": " Type of SSH host fingerprint", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CERT_SSH_MD5", + "comments": "

MD5 is available

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_SHA1", + "comments": "

SHA-1 is available

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_SHA256", + "comments": "

SHA-256 is available

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_RAW", + "comments": "

Raw hostkey is available

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_cert_t", + { + "decl": [ + "GIT_CERT_NONE", + "GIT_CERT_X509", + "GIT_CERT_HOSTKEY_LIBSSH2", + "GIT_CERT_STRARRAY" + ], + "type": "enum", + "file": "git2/cert.h", + "line": 25, + "lineto": 48, + "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", + "tdef": "typedef", + "description": " Type of host certificate structure that is passed to the check callback", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CERT_NONE", + "comments": "

No information about the certificate is available. This may\n happen when using curl.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CERT_X509", + "comments": "

The data argument to the callback will be a pointer to\n the DER-encoded data.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CERT_HOSTKEY_LIBSSH2", + "comments": "

The data argument to the callback will be a pointer to a\n git_cert_hostkey structure.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CERT_STRARRAY", + "comments": "

The data argument to the callback will be a pointer to a\n git_strarray with name:content strings containing\n information about the certificate. This is used when using\n curl.

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_cert_x509", + { + "decl": [ + "git_cert parent", + "void * data", + "size_t len" + ], + "type": "struct", + "value": "git_cert_x509", + "file": "git2/cert.h", + "line": 156, + "lineto": 168, + "block": "git_cert parent\nvoid * data\nsize_t len", + "tdef": "typedef", + "description": " X.509 certificate information", + "comments": "", + "fields": [ + { + "type": "git_cert", + "name": "parent", + "comments": " The parent cert " + }, + { + "type": "void *", + "name": "data", + "comments": " Pointer to the X.509 certificate data" + }, + { + "type": "size_t", + "name": "len", + "comments": " Length of the memory block pointed to by `data`." + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_checkout_notify_t", + { + "decl": [ + "GIT_CHECKOUT_NOTIFY_NONE", + "GIT_CHECKOUT_NOTIFY_CONFLICT", + "GIT_CHECKOUT_NOTIFY_DIRTY", + "GIT_CHECKOUT_NOTIFY_UPDATED", + "GIT_CHECKOUT_NOTIFY_UNTRACKED", + "GIT_CHECKOUT_NOTIFY_IGNORED", + "GIT_CHECKOUT_NOTIFY_ALL" + ], + "type": "enum", + "file": "git2/checkout.h", + "line": 214, + "lineto": 245, + "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", + "tdef": "typedef", + "description": " Checkout notification flags", + "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_CONFLICT", + "comments": "

Invokes checkout on conflicting paths.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_DIRTY", + "comments": "

Notifies about "dirty" files, i.e. those that do not need an update\n but no longer match the baseline. Core git displays these files when\n checkout runs, but won't stop the checkout.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_UPDATED", + "comments": "

Sends notification for any file changed.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_UNTRACKED", + "comments": "

Notifies about untracked files.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_IGNORED", + "comments": "

Notifies about ignored files.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_ALL", + "comments": "

Notifies about ignored files.

\n", + "value": 65535 + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_notify_cb" + ] + } + } + ], + [ + "git_checkout_options", + { + "decl": [ + "unsigned int version", + "unsigned int checkout_strategy", + "int disable_filters", + "unsigned int dir_mode", + "unsigned int file_mode", + "int file_open_flags", + "unsigned int notify_flags", + "git_checkout_notify_cb notify_cb", + "void * notify_payload", + "git_checkout_progress_cb progress_cb", + "void * progress_payload", + "git_strarray paths", + "git_tree * baseline", + "git_index * baseline_index", + "const char * target_directory", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_checkout_perfdata_cb perfdata_cb", + "void * perfdata_payload" + ], + "type": "struct", + "value": "git_checkout_options", + "file": "git2/checkout.h", + "line": 282, + "lineto": 345, + "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", + "tdef": "typedef", + "description": " Checkout options structure", + "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "unsigned int", + "name": "checkout_strategy", + "comments": " default will be a safe checkout " + }, + { + "type": "int", + "name": "disable_filters", + "comments": " don't apply filters like CRLF conversion " + }, + { + "type": "unsigned int", + "name": "dir_mode", + "comments": " default is 0755 " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " default is 0644 or 0755 as dictated by blob " + }, + { + "type": "int", + "name": "file_open_flags", + "comments": " default is O_CREAT | O_TRUNC | O_WRONLY " + }, + { + "type": "unsigned int", + "name": "notify_flags", + "comments": " see `git_checkout_notify_t` above " + }, + { + "type": "git_checkout_notify_cb", + "name": "notify_cb", + "comments": " Optional callback to get notifications on specific file states.\n " + }, + { + "type": "void *", + "name": "notify_payload", + "comments": " Payload passed to notify_cb " + }, + { + "type": "git_checkout_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of checkout progress. " + }, + { + "type": "void *", + "name": "progress_payload", + "comments": " Payload passed to progress_cb " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." + }, + { + "type": "git_index *", + "name": "baseline_index", + "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." + }, + { + "type": "const char *", + "name": "target_directory", + "comments": " alternative checkout path to workdir " + }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " the name of the common ancestor side of conflicts " + }, + { + "type": "const char *", + "name": "our_label", + "comments": " the name of the \"our\" side of conflicts " + }, + { + "type": "const char *", + "name": "their_label", + "comments": " the name of the \"their\" side of conflicts " + }, + { + "type": "git_checkout_perfdata_cb", + "name": "perfdata_cb", + "comments": " Optional callback to notify the consumer of performance data. " + }, + { + "type": "void *", + "name": "perfdata_payload", + "comments": " Payload passed to perfdata_cb " + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_head", + "git_checkout_index", + "git_checkout_options_init", + "git_checkout_tree", + "git_merge", + "git_reset", + "git_reset_from_annotated" + ] + } + } + ], + [ + "git_checkout_perfdata", + { + "decl": [ + "size_t mkdir_calls", + "size_t stat_calls", + "size_t chmod_calls" + ], + "type": "struct", + "value": "git_checkout_perfdata", + "file": "git2/checkout.h", + "line": 248, + "lineto": 252, + "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", + "tdef": "typedef", + "description": " Checkout performance-reporting structure ", + "comments": "", + "fields": [ + { + "type": "size_t", + "name": "mkdir_calls", + "comments": "" + }, + { + "type": "size_t", + "name": "stat_calls", + "comments": "" + }, + { + "type": "size_t", + "name": "chmod_calls", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_perfdata_cb" + ] + } + } + ], + [ + "git_checkout_strategy_t", + { + "decl": [ + "GIT_CHECKOUT_NONE", + "GIT_CHECKOUT_SAFE", + "GIT_CHECKOUT_FORCE", + "GIT_CHECKOUT_RECREATE_MISSING", + "GIT_CHECKOUT_ALLOW_CONFLICTS", + "GIT_CHECKOUT_REMOVE_UNTRACKED", + "GIT_CHECKOUT_REMOVE_IGNORED", + "GIT_CHECKOUT_UPDATE_ONLY", + "GIT_CHECKOUT_DONT_UPDATE_INDEX", + "GIT_CHECKOUT_NO_REFRESH", + "GIT_CHECKOUT_SKIP_UNMERGED", + "GIT_CHECKOUT_USE_OURS", + "GIT_CHECKOUT_USE_THEIRS", + "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", + "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", + "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", + "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", + "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", + "GIT_CHECKOUT_DONT_REMOVE_EXISTING", + "GIT_CHECKOUT_DONT_WRITE_INDEX", + "GIT_CHECKOUT_DRY_RUN", + "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", + "GIT_CHECKOUT_UPDATE_SUBMODULES", + "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" + ], + "type": "enum", + "file": "git2/checkout.h", + "line": 106, + "lineto": 198, + "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "tdef": "typedef", + "description": " Checkout behavior flags", + "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_CHECKOUT_NONE", + "comments": "

default is a dry run, no actual updates

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SAFE", + "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked out files,\n the checkout will still proceed, leaving the changes intact.

\n\n

Mutually exclusive with GIT_CHECKOUT_FORCE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_FORCE", + "comments": "

Allow all updates to force working directory to look like index.

\n\n

Mutually exclusive with GIT_CHECKOUT_SAFE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_RECREATE_MISSING", + "comments": "

Allow checkout to recreate missing files

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_ALLOW_CONFLICTS", + "comments": "

Allow checkout to make safe updates even if conflicts are found

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_REMOVE_UNTRACKED", + "comments": "

Remove untracked files not in index (that are not ignored)

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_REMOVE_IGNORED", + "comments": "

Remove ignored files not in index

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_ONLY", + "comments": "

Only update existing files, don't create new ones

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_UPDATE_INDEX", + "comments": "

Normally checkout updates index entries as it goes; this stops that.\n Implies GIT_CHECKOUT_DONT_WRITE_INDEX.

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NO_REFRESH", + "comments": "

Don't refresh index/config/etc before doing checkout

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SKIP_UNMERGED", + "comments": "

Allow checkout to skip unmerged files

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_USE_OURS", + "comments": "

For unmerged files, checkout stage 2 from index

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_USE_THEIRS", + "comments": "

For unmerged files, checkout stage 3 from index

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", + "comments": "

Treat pathspec as simple list of exact match file paths

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", + "comments": "

Ignore directories in use, they will be left empty

\n", + "value": 262144 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", + "comments": "

Don't overwrite ignored files that exist in the checkout target

\n", + "value": 524288 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", + "comments": "

Write normal merge files for conflicts

\n", + "value": 1048576 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", + "comments": "

Include common ancestor data in diff3 format files for conflicts

\n", + "value": 2097152 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_REMOVE_EXISTING", + "comments": "

Don't overwrite existing files or folders

\n", + "value": 4194304 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_WRITE_INDEX", + "comments": "

Normally checkout writes the index upon completion; this prevents that.

\n", + "value": 8388608 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DRY_RUN", + "comments": "

Show what would be done by a checkout. Stop after sending\n notifications; don't update the working directory or index.

\n", + "value": 16777216 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", + "comments": "

Include common ancestor data in zdiff3 format for conflicts

\n", + "value": 33554432 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_SUBMODULES", + "comments": "

Recursively checkout submodules with same options (NOT IMPLEMENTED)

\n", + "value": 65536 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "comments": "

Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED)

\n", + "value": 131072 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_cherrypick_options", + { + "decl": [ + "unsigned int version", + "unsigned int mainline", + "git_merge_options merge_opts", + "git_checkout_options checkout_opts" + ], + "type": "struct", + "value": "git_cherrypick_options", + "file": "git2/cherrypick.h", + "line": 26, + "lineto": 34, + "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", + "tdef": "typedef", + "description": " Cherry-pick options", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "unsigned int", + "name": "mainline", + "comments": " For merge commits, the \"mainline\" is treated as the parent. " + }, + { + "type": "git_merge_options", + "name": "merge_opts", + "comments": " Options for the merging " + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " Options for the checkout " + } + ], + "used": { + "returns": [], + "needs": [ + "git_cherrypick", + "git_cherrypick_options_init" + ] + } + } + ], + [ + "git_clone_local_t", + { + "decl": [ + "GIT_CLONE_LOCAL_AUTO", + "GIT_CLONE_LOCAL", + "GIT_CLONE_NO_LOCAL", + "GIT_CLONE_LOCAL_NO_LINKS" + ], + "type": "enum", + "file": "git2/clone.h", + "line": 33, + "lineto": 53, + "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", + "tdef": "typedef", + "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CLONE_LOCAL_AUTO", + "comments": "

Auto-detect (default), libgit2 will bypass the git-aware\n transport for local paths, but use a normal fetch for\n file:// urls.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CLONE_LOCAL", + "comments": "

Bypass the git-aware transport even for a file:// url.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CLONE_NO_LOCAL", + "comments": "

Do no bypass the git-aware transport

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CLONE_LOCAL_NO_LINKS", + "comments": "

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_clone_options", + { + "decl": [ + "unsigned int version", + "git_checkout_options checkout_opts", + "git_fetch_options fetch_opts", + "int bare", + "git_clone_local_t local", + "const char * checkout_branch", + "git_repository_create_cb repository_cb", + "void * repository_cb_payload", + "git_remote_create_cb remote_cb", + "void * remote_cb_payload" + ], + "type": "struct", + "value": "git_clone_options", + "file": "git2/clone.h", + "line": 103, + "lineto": 164, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", + "tdef": "typedef", + "description": " Clone options structure", + "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`." + }, + { + "type": "git_fetch_options", + "name": "fetch_opts", + "comments": " Options which control the fetch, including callbacks.\n\n The callbacks are used for reporting fetch progress, and for acquiring\n credentials in the event they are needed." + }, + { + "type": "int", + "name": "bare", + "comments": " Set to zero (false) to create a standard repo, or non-zero\n for a bare repo" + }, + { + "type": "git_clone_local_t", + "name": "local", + "comments": " Whether to use a fetch or copy the object database." + }, + { + "type": "const char *", + "name": "checkout_branch", + "comments": " The name of the branch to checkout. NULL means use the\n remote's default branch." + }, + { + "type": "git_repository_create_cb", + "name": "repository_cb", + "comments": " A callback used to create the new repository into which to\n clone. If NULL, the 'bare' field will be used to determine\n whether to create a bare repository." + }, + { + "type": "void *", + "name": "repository_cb_payload", + "comments": " An opaque payload to pass to the git_repository creation callback.\n This parameter is ignored unless repository_cb is non-NULL." + }, + { + "type": "git_remote_create_cb", + "name": "remote_cb", + "comments": " A callback used to create the git_remote, prior to its being\n used to perform the clone operation. See the documentation for\n git_remote_create_cb for details. This parameter may be NULL,\n indicating that git_clone should provide default behavior." + }, + { + "type": "void *", + "name": "remote_cb_payload", + "comments": " An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL." + } + ], + "used": { + "returns": [], + "needs": [ + "git_clone", + "git_clone_options_init" + ] + } + } + ], + [ + "git_commit", + { + "decl": "git_commit", + "type": "struct", + "value": "git_commit", + "file": "git2/types.h", + "line": 136, + "lineto": 136, + "tdef": "typedef", + "description": " Parsed representation of a commit object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_branch_create", + "git_cherrypick", + "git_cherrypick_commit", + "git_commit_amend", + "git_commit_author", + "git_commit_author_with_mailmap", + "git_commit_body", + "git_commit_committer", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_dup", + "git_commit_free", + "git_commit_header_field", + "git_commit_id", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_message", + "git_commit_message_encoding", + "git_commit_message_raw", + "git_commit_nth_gen_ancestor", + "git_commit_owner", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_parentcount", + "git_commit_raw_header", + "git_commit_summary", + "git_commit_time", + "git_commit_time_offset", + "git_commit_tree", + "git_commit_tree_id", + "git_diff_commit_as_email", + "git_merge_commits", + "git_note_commit_create", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_commit_remove", + "git_odb_set_commit_graph", + "git_revert", + "git_revert_commit" + ] + } + } + ], + [ + "git_commit_graph", + { + "decl": "git_commit_graph", + "type": "struct", + "value": "git_commit_graph", + "file": "git2/types.h", + "line": 109, + "lineto": 109, + "tdef": "typedef", + "description": " A git commit-graph ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_set_commit_graph" + ] + } + } + ], + [ + "git_commit_graph_split_strategy_t", + { + "decl": [ + "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE" + ], + "type": "enum", + "file": "git2/sys/commit_graph.h", + "line": 102, + "lineto": 108, + "block": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "tdef": "typedef", + "description": " The strategy to use when adding a new set of commits to a pre-existing\n commit-graph chain.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "comments": "

Do not split commit-graph files. The other split strategy-related option\n fields are ignored.

\n", + "value": 0 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_commit_graph_writer", + { + "decl": "git_commit_graph_writer", + "type": "struct", + "value": "git_commit_graph_writer", + "file": "git2/types.h", + "line": 112, + "lineto": 112, + "tdef": "typedef", + "description": " a writer for commit-graph files. ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_config", + { + "decl": "git_config", + "type": "struct", + "value": "git_config", + "file": "git2/types.h", + "line": 157, + "lineto": 157, + "tdef": "typedef", + "description": " Memory representation of a set of config files ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_add_file_ondisk", + "git_config_backend_foreach_match", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_entry_free", + "git_config_foreach", + "git_config_foreach_cb", + "git_config_foreach_match", + "git_config_free", + "git_config_get_bool", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_mapped", + "git_config_get_multivar_foreach", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_lock", + "git_config_lookup_map_value", + "git_config_multivar_iterator_new", + "git_config_new", + "git_config_next", + "git_config_open_default", + "git_config_open_global", + "git_config_open_level", + "git_config_open_ondisk", + "git_config_set_bool", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_multivar", + "git_config_set_string", + "git_config_snapshot", + "git_repository_config", + "git_repository_config_snapshot" + ] + } + } + ], + [ + "git_config_backend", + { + "decl": "git_config_backend", + "type": "struct", + "value": "git_config_backend", + "file": "git2/types.h", + "line": 160, + "lineto": 160, + "tdef": "typedef", + "description": " Interface to access a configuration file ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_backend_foreach_match" + ] + } + } + ], + [ + "git_config_entry", + { + "decl": [ + "const char * name", + "const char * value", + "unsigned int include_depth", + "git_config_level_t level", + "void (*)(struct git_config_entry *) free", + "void * payload" + ], + "type": "struct", + "value": "git_config_entry", + "file": "git2/config.h", + "line": 64, + "lineto": 71, + "block": "const char * name\nconst char * value\nunsigned int include_depth\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free\nvoid * payload", + "tdef": "typedef", + "description": " An entry in a configuration file", + "comments": "", + "fields": [ + { + "type": "const char *", + "name": "name", + "comments": " Name of the entry (normalised) " + }, + { + "type": "const char *", + "name": "value", + "comments": " String value of the entry " + }, + { + "type": "unsigned int", + "name": "include_depth", + "comments": " Depth of includes where this variable was found " + }, + { + "type": "git_config_level_t", + "name": "level", + "comments": " Which config file this was found in " + }, + { + "type": "void (*)(struct git_config_entry *)", + "name": "free", + "comments": "" + }, + { + "type": "void *", + "name": "payload", + "comments": " Opaque value for the free function. Do not read or write " + } + ], + "used": { + "returns": [], + "needs": [ + "git_config_entry_free", + "git_config_foreach_cb", + "git_config_get_entry", + "git_config_next" + ] + } + } + ], + [ + "git_config_iterator", + { + "decl": "git_config_iterator", + "type": "struct", + "value": "git_config_iterator", + "file": "git2/config.h", + "line": 92, + "lineto": 92, + "tdef": "typedef", + "description": " An opaque structure for a configuration iterator", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_multivar_iterator_new", + "git_config_next" + ] + } + } + ], + [ + "git_config_level_t", + { + "decl": [ + "GIT_CONFIG_LEVEL_PROGRAMDATA", + "GIT_CONFIG_LEVEL_SYSTEM", + "GIT_CONFIG_LEVEL_XDG", + "GIT_CONFIG_LEVEL_GLOBAL", + "GIT_CONFIG_LEVEL_LOCAL", + "GIT_CONFIG_LEVEL_APP", + "GIT_CONFIG_HIGHEST_LEVEL" + ], + "type": "enum", + "file": "git2/config.h", + "line": 31, + "lineto": 59, + "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", + "tdef": "typedef", + "description": " Priority level of a config file.\n These priority levels correspond to the natural escalation logic\n (from higher to lower) when searching for config entries in git.git.", + "comments": "

git_config_open_default() and git_repository_config() honor those priority levels as well.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_PROGRAMDATA", + "comments": "

System-wide on Windows, for compatibility with portable git

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_SYSTEM", + "comments": "

System-wide configuration file; /etc/gitconfig on Linux systems

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_XDG", + "comments": "

XDG compatible configuration file; typically ~/.config/git/config

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_GLOBAL", + "comments": "

User-specific configuration file (also called Global configuration\n file); typically ~/.gitconfig

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_LOCAL", + "comments": "

Repository specific configuration file; $WORK_DIR/.git/config on\n non-bare repos

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_APP", + "comments": "

Application specific configuration file; freely defined by applications

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_CONFIG_HIGHEST_LEVEL", + "comments": "

Represents the highest level available config file (i.e. the most\n specific config file available that actually is loaded)

\n", + "value": -1 + } + ], + "used": { + "returns": [], + "needs": [ + "git_config_add_file_ondisk", + "git_config_open_level" + ] + } + } + ], + [ + "git_configmap", + { + "decl": [ + "git_configmap_t type", + "const char * str_match", + "int map_value" + ], + "type": "struct", + "value": "git_configmap", + "file": "git2/config.h", + "line": 107, + "lineto": 111, + "block": "git_configmap_t type\nconst char * str_match\nint map_value", + "tdef": "typedef", + "description": " Mapping from config variables to values.", + "comments": "", + "fields": [ + { + "type": "git_configmap_t", + "name": "type", + "comments": "" + }, + { + "type": "const char *", + "name": "str_match", + "comments": "" + }, + { + "type": "int", + "name": "map_value", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_config_get_mapped", + "git_config_lookup_map_value" + ] + } + } + ], + [ + "git_configmap_t", + { + "decl": [ + "GIT_CONFIGMAP_FALSE", + "GIT_CONFIGMAP_TRUE", + "GIT_CONFIGMAP_INT32", + "GIT_CONFIGMAP_STRING" + ], + "type": "enum", + "file": "git2/config.h", + "line": 97, + "lineto": 102, + "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", + "tdef": "typedef", + "description": " Config var type", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CONFIGMAP_FALSE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_TRUE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_INT32", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_STRING", + "comments": "", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_credential", + { + "decl": "git_credential", + "type": "struct", + "value": "git_credential", + "file": "git2/credential.h", + "line": 84, + "lineto": 84, + "tdef": "typedef", + "description": " The base structure for all credential types", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_credential_acquire_cb", + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" + ] + } + } + ], + [ + "git_credential_default", + { + "decl": "git_credential_default", + "type": "struct", + "value": "git_credential_default", + "file": "git2/credential.h", + "line": 92, + "lineto": 92, + "tdef": "typedef", + "description": " A key for NTLM/Kerberos \"default\" credentials ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_credential_ssh_custom", + { + "decl": "git_credential_ssh_custom", + "type": "struct", + "value": "git_credential_ssh_custom", + "file": "git2/credential.h", + "line": 107, + "lineto": 107, + "tdef": "typedef", + "description": " A key with a custom signature function", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_credential_ssh_interactive", + { + "decl": "git_credential_ssh_interactive", + "type": "struct", + "value": "git_credential_ssh_interactive", + "file": "git2/credential.h", + "line": 102, + "lineto": 102, + "tdef": "typedef", + "description": " Keyboard-interactive based ssh authentication", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_credential_ssh_interactive_new" + ] + } + } + ], + [ + "git_credential_ssh_key", + { + "decl": "git_credential_ssh_key", + "type": "struct", + "value": "git_credential_ssh_key", + "file": "git2/credential.h", + "line": 97, + "lineto": 97, + "tdef": "typedef", + "description": " A ssh key from disk", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_credential_t", + { + "decl": [ + "GIT_CREDENTIAL_USERPASS_PLAINTEXT", + "GIT_CREDENTIAL_SSH_KEY", + "GIT_CREDENTIAL_SSH_CUSTOM", + "GIT_CREDENTIAL_DEFAULT", + "GIT_CREDENTIAL_SSH_INTERACTIVE", + "GIT_CREDENTIAL_USERNAME", + "GIT_CREDENTIAL_SSH_MEMORY" + ], + "type": "enum", + "file": "git2/credential.h", + "line": 27, + "lineto": 79, + "block": "GIT_CREDENTIAL_USERPASS_PLAINTEXT\nGIT_CREDENTIAL_SSH_KEY\nGIT_CREDENTIAL_SSH_CUSTOM\nGIT_CREDENTIAL_DEFAULT\nGIT_CREDENTIAL_SSH_INTERACTIVE\nGIT_CREDENTIAL_USERNAME\nGIT_CREDENTIAL_SSH_MEMORY", + "tdef": "typedef", + "description": " Supported credential types", + "comments": "

This represents the various types of authentication methods supported by the library.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CREDENTIAL_USERPASS_PLAINTEXT", + "comments": "

A vanilla user/password request

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_KEY", + "comments": "

An SSH key-based authentication request

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_CUSTOM", + "comments": "

An SSH key-based authentication request, with a custom signature

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_DEFAULT", + "comments": "

An NTLM/Negotiate-based authentication request.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_INTERACTIVE", + "comments": "

An SSH interactive authentication request

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_USERNAME", + "comments": "

Username-only authentication request

\n\n

Used as a pre-authentication step if the underlying transport\n (eg. SSH, with no username in its URL) does not know which username\n to use.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_MEMORY", + "comments": "

An SSH key-based authentication request

\n\n

Allows credentials to be read from memory instead of files.\n Note that because of differences in crypto backend support, it might\n not be functional.

\n", + "value": 64 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_credential_username", + { + "decl": "git_credential_username", + "type": "struct", + "value": "git_credential_username", + "file": "git2/credential.h", + "line": 89, + "lineto": 89, + "tdef": "typedef", + "description": " Username-only credential information ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_credential_userpass_payload", + { + "decl": [ + "const char * username", + "const char * password" + ], + "type": "struct", + "value": "git_credential_userpass_payload", + "file": "git2/credential_helpers.h", + "line": 24, + "lineto": 27, + "block": "const char * username\nconst char * password", + "tdef": "typedef", + "description": " Payload for git_credential_userpass_plaintext.", + "comments": "", + "fields": [ + { + "type": "const char *", + "name": "username", + "comments": "" + }, + { + "type": "const char *", + "name": "password", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_delta_t", + { + "decl": [ + "GIT_DELTA_UNMODIFIED", + "GIT_DELTA_ADDED", + "GIT_DELTA_DELETED", + "GIT_DELTA_MODIFIED", + "GIT_DELTA_RENAMED", + "GIT_DELTA_COPIED", + "GIT_DELTA_IGNORED", + "GIT_DELTA_UNTRACKED", + "GIT_DELTA_TYPECHANGE", + "GIT_DELTA_UNREADABLE", + "GIT_DELTA_CONFLICTED" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 224, + "lineto": 236, + "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", + "tdef": "typedef", + "description": " What type of change is described by a git_diff_delta?", + "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE in the option flags (otherwise type changes will be split into ADDED / DELETED pairs).

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DELTA_UNMODIFIED", + "comments": "

no changes

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DELTA_ADDED", + "comments": "

entry does not exist in old version

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DELTA_DELETED", + "comments": "

entry does not exist in new version

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DELTA_MODIFIED", + "comments": "

entry content changed between old and new

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_DELTA_RENAMED", + "comments": "

entry was renamed between old and new

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DELTA_COPIED", + "comments": "

entry was copied from another old entry

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_DELTA_IGNORED", + "comments": "

entry is ignored item in workdir

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_DELTA_UNTRACKED", + "comments": "

entry is untracked item in workdir

\n", + "value": 7 + }, + { + "type": "int", + "name": "GIT_DELTA_TYPECHANGE", + "comments": "

type of entry changed between old and new

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DELTA_UNREADABLE", + "comments": "

entry is unreadable

\n", + "value": 9 + }, + { + "type": "int", + "name": "GIT_DELTA_CONFLICTED", + "comments": "

entry in the index is conflicted

\n", + "value": 10 + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_num_deltas_of_type", + "git_diff_status_char" + ] + } + } + ], + [ + "git_describe_format_options", + { + "decl": [ + "unsigned int version", + "unsigned int abbreviated_size", + "int always_use_long_format", + "const char * dirty_suffix" + ], + "type": "struct", + "value": "git_describe_format_options", + "file": "git2/describe.h", + "line": 91, + "lineto": 111, + "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", + "tdef": "typedef", + "description": " Describe format options structure", + "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "unsigned int", + "name": "abbreviated_size", + "comments": " Size of the abbreviated commit id to use. This value is the\n lower bound for the length of the abbreviated string. The\n default is 7." + }, + { + "type": "int", + "name": "always_use_long_format", + "comments": " Set to use the long format even when a shorter name could be used." + }, + { + "type": "const char *", + "name": "dirty_suffix", + "comments": " If the workdir is dirty and this is set, this string will\n be appended to the description string." + } + ], + "used": { + "returns": [], + "needs": [ + "git_describe_format", + "git_describe_format_options_init" + ] + } + } + ], + [ + "git_describe_options", + { + "decl": [ + "unsigned int version", + "unsigned int max_candidates_tags", + "unsigned int describe_strategy", + "const char * pattern", + "int only_follow_first_parent", + "int show_commit_oid_as_fallback" + ], + "type": "struct", + "value": "git_describe_options", + "file": "git2/describe.h", + "line": 43, + "lineto": 61, + "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", + "tdef": "typedef", + "description": " Describe options structure", + "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can use git_describe_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "unsigned int", + "name": "max_candidates_tags", + "comments": " default: 10 " + }, + { + "type": "unsigned int", + "name": "describe_strategy", + "comments": " default: GIT_DESCRIBE_DEFAULT " + }, + { + "type": "const char *", + "name": "pattern", + "comments": "" + }, + { + "type": "int", + "name": "only_follow_first_parent", + "comments": " When calculating the distance from the matching tag or\n reference, only walk down the first-parent ancestry." + }, + { + "type": "int", + "name": "show_commit_oid_as_fallback", + "comments": " If no matching tag or reference is found, the describe\n operation would normally fail. If this option is set, it\n will instead fall back to showing the full id of the\n commit." + } + ], + "used": { + "returns": [], + "needs": [ + "git_describe_commit", + "git_describe_options_init", + "git_describe_workdir" + ] + } + } + ], + [ + "git_describe_result", + { + "decl": "git_describe_result", + "type": "struct", + "value": "git_describe_result", + "file": "git2/describe.h", + "line": 134, + "lineto": 134, + "tdef": "typedef", + "description": " A struct that stores the result of a describe operation.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_describe_commit", + "git_describe_format", + "git_describe_result_free", + "git_describe_workdir" + ] + } + } + ], + [ + "git_describe_strategy_t", + { + "decl": [ + "GIT_DESCRIBE_DEFAULT", + "GIT_DESCRIBE_TAGS", + "GIT_DESCRIBE_ALL" + ], + "type": "enum", + "file": "git2/describe.h", + "line": 30, + "lineto": 34, + "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", + "tdef": "typedef", + "description": " Reference lookup strategy", + "comments": "

These behave like the --tags and --all options to git-describe, namely they say to look for any reference in either refs/tags/ or refs/ respectively.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DESCRIBE_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DESCRIBE_TAGS", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DESCRIBE_ALL", + "comments": "", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff", + { + "decl": "git_diff", + "type": "struct", + "value": "git_diff", + "file": "git2/diff.h", + "line": 196, + "lineto": 196, + "tdef": "typedef", + "description": " The diff object that contains all individual file deltas.", + "comments": "

A diff represents the cumulative list of differences between two snapshots of a repository (possibly filtered by a set of file name patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of diffs then traversing it. This makes is easier to share logic across the various types of diffs (tree vs tree, workdir vs index, etc.), and also allows you to insert optional diff post-processing phases, such as rename detection, in between the steps. When you are done with a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", + "used": { + "returns": [ + "git_diff_get_delta", + "git_patch_get_delta", + "git_pathspec_match_list_diff_entry" + ], + "needs": [ + "git_apply", + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_to_tree", + "git_checkout_notify_cb", + "git_diff_binary_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_file_cb", + "git_diff_find_options_init", + "git_diff_find_similar", + "git_diff_foreach", + "git_diff_format_email", + "git_diff_format_email_options_init", + "git_diff_free", + "git_diff_from_buffer", + "git_diff_get_delta", + "git_diff_get_stats", + "git_diff_hunk_cb", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_is_sorted_icase", + "git_diff_line_cb", + "git_diff_merge", + "git_diff_notify_cb", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_options_init", + "git_diff_patchid", + "git_diff_patchid_options_init", + "git_diff_print", + "git_diff_progress_cb", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf", + "git_diff_to_buf", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_print", + "git_pathspec_match_diff" + ] + } + } + ], + [ + "git_diff_binary", + { + "decl": [ + "unsigned int contains_data", + "git_diff_binary_file old_file", + "git_diff_binary_file new_file" + ], + "type": "struct", + "value": "git_diff_binary", + "file": "git2/diff.h", + "line": 544, + "lineto": 556, + "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", + "tdef": "typedef", + "description": " Structure describing the binary contents of a diff.", + "comments": "

A binary file / delta is a file (or pair) for which no text diffs should be generated. A diff can contain delta entries that are binary, but no diff content will be output for those files. There is a base heuristic for binary detection and you can further tune the behavior with git attributes or diff flags and option settings.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "contains_data", + "comments": " Whether there is data in this binary structure or not.\n\n If this is `1`, then this was produced and included binary content.\n If this is `0` then this was generated knowing only that a binary\n file changed but without providing the data, probably from a patch\n that said `Binary files a/file.txt and b/file.txt differ`." + }, + { + "type": "git_diff_binary_file", + "name": "old_file", + "comments": " The contents of the old file. " + }, + { + "type": "git_diff_binary_file", + "name": "new_file", + "comments": " The contents of the new file. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_binary_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach" + ] + } + } + ], + [ + "git_diff_binary_file", + { + "decl": [ + "git_diff_binary_t type", + "const char * data", + "size_t datalen", + "size_t inflatedlen" + ], + "type": "struct", + "value": "git_diff_binary_file", + "file": "git2/diff.h", + "line": 521, + "lineto": 533, + "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", + "tdef": "typedef", + "description": " The contents of one of the files in a binary diff. ", + "comments": "", + "fields": [ + { + "type": "git_diff_binary_t", + "name": "type", + "comments": " The type of binary data for this file. " + }, + { + "type": "const char *", + "name": "data", + "comments": " The binary data, deflated. " + }, + { + "type": "size_t", + "name": "datalen", + "comments": " The length of the binary data. " + }, + { + "type": "size_t", + "name": "inflatedlen", + "comments": " The length of the binary data after inflation. " + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_binary_t", + { + "decl": [ + "GIT_DIFF_BINARY_NONE", + "GIT_DIFF_BINARY_LITERAL", + "GIT_DIFF_BINARY_DELTA" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 509, + "lineto": 518, + "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", + "tdef": "typedef", + "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_BINARY_NONE", + "comments": "

There is no binary delta.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_BINARY_LITERAL", + "comments": "

The binary data is the literal contents of the file.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_BINARY_DELTA", + "comments": "

The binary data is the delta from one side to the other.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_delta", + { + "decl": [ + "git_delta_t status", + "uint32_t flags", + "uint16_t similarity", + "uint16_t nfiles", + "git_diff_file old_file", + "git_diff_file new_file" + ], + "type": "struct", + "value": "git_diff_delta", + "file": "git2/diff.h", + "line": 324, + "lineto": 331, + "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", + "tdef": "typedef", + "description": " Description of changes to one entry.", + "comments": "

A delta is a file pair with an old and new revision. The old version may be absent if the file was just created and the new version may be absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file represents to "to" side of the diff. What those means depend on the function that was used to generate the diff and will be documented below. You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file", they actually may correspond to entries that represent a file, a symbolic link, a submodule commit id, or even a tree (if you are tracking type changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will be filled in, but we generally try to fill in as much as possible. One example is that the "flags" field may not have either the BINARY or the NOT_BINARY flag set to avoid examining file contents if you do not pass in hunk and/or line callbacks to the diff foreach iteration function. It will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar() which does a similarity analysis of files in the diff. Use that function to do rename and copy detection, and to split heavily modified files in add/delete pairs. After that call, deltas with a status of GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to break, but to not actually break the records, then GIT_DELTA_MODIFIED records may have a non-zero similarity score if the self-similarity is below the split threshold. To display this value like core Git, invert the score (a la printf("M%03d", 100 - delta->similarity)).

\n", + "fields": [ + { + "type": "git_delta_t", + "name": "status", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " git_diff_flag_t values " + }, + { + "type": "uint16_t", + "name": "similarity", + "comments": " for RENAMED and COPIED, value 0-100 " + }, + { + "type": "uint16_t", + "name": "nfiles", + "comments": " number of files in this delta " + }, + { + "type": "git_diff_file", + "name": "old_file", + "comments": "" + }, + { + "type": "git_diff_file", + "name": "new_file", + "comments": "" + } + ], + "used": { + "returns": [ + "git_diff_get_delta", + "git_patch_get_delta", + "git_pathspec_match_list_diff_entry" + ], + "needs": [ + "git_apply_delta_cb", + "git_diff_binary_cb", + "git_diff_file_cb", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_diff_notify_cb" + ] + } + } + ], + [ + "git_diff_file", + { + "decl": [ + "git_oid id", + "const char * path", + "git_object_size_t size", + "uint32_t flags", + "uint16_t mode", + "uint16_t id_abbrev" + ], + "type": "struct", + "value": "git_diff_file", + "file": "git2/diff.h", + "line": 245, + "lineto": 282, + "block": "git_oid id\nconst char * path\ngit_object_size_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", + "tdef": "typedef", + "description": " Description of one side of a delta.", + "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n", + "fields": [ + { + "type": "git_oid", + "name": "id", + "comments": " The `git_oid` of the item. If the entry represents an\n absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta),\n then the oid will be zeroes." + }, + { + "type": "const char *", + "name": "path", + "comments": " The NUL-terminated path to the entry relative to the working\n directory of the repository." + }, + { + "type": "git_object_size_t", + "name": "size", + "comments": " The size of the entry in bytes." + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of the `git_diff_flag_t` types" + }, + { + "type": "uint16_t", + "name": "mode", + "comments": " Roughly, the stat() `st_mode` value for the item. This will\n be restricted to one of the `git_filemode_t` values." + }, + { + "type": "uint16_t", + "name": "id_abbrev", + "comments": " Represents the known length of the `id` field, when\n converted to a hex string. It is generally `GIT_OID_SHA1_HEXSIZE`, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters." + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_notify_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach" + ] + } + } + ], + [ + "git_diff_find_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint16_t rename_threshold", + "uint16_t rename_from_rewrite_threshold", + "uint16_t copy_threshold", + "uint16_t break_rewrite_threshold", + "size_t rename_limit", + "git_diff_similarity_metric * metric" + ], + "type": "struct", + "value": "git_diff_find_options", + "file": "git2/diff.h", + "line": 749, + "lineto": 803, + "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", + "tdef": "typedef", + "description": " Control behavior of rename and copy detection", + "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing." + }, + { + "type": "uint16_t", + "name": "rename_threshold", + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "rename_from_rewrite_threshold", + "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "copy_threshold", + "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "break_rewrite_threshold", + "comments": " Threshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." + }, + { + "type": "size_t", + "name": "rename_limit", + "comments": " Maximum number of matches to consider for a particular file.\n\n This is a little different from the `-l` option from Git because we\n will still process up to this many matches before abandoning the search.\n Defaults to 1000." + }, + { + "type": "git_diff_similarity_metric *", + "name": "metric", + "comments": " The `metric` option allows you to plug in a custom similarity metric.\n\n Set it to NULL to use the default internal metric.\n\n The default metric is based on sampling hashes of ranges of data in\n the file, which is a pretty good similarity approximation that should\n work fairly well for both text and binary data while still being\n pretty fast with a fixed memory overhead." + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_find_options_init", + "git_diff_find_similar" + ] + } + } + ], + [ + "git_diff_find_t", + { + "decl": [ + "GIT_DIFF_FIND_BY_CONFIG", + "GIT_DIFF_FIND_RENAMES", + "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", + "GIT_DIFF_FIND_COPIES", + "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", + "GIT_DIFF_FIND_REWRITES", + "GIT_DIFF_BREAK_REWRITES", + "GIT_DIFF_FIND_AND_BREAK_REWRITES", + "GIT_DIFF_FIND_FOR_UNTRACKED", + "GIT_DIFF_FIND_ALL", + "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", + "GIT_DIFF_FIND_IGNORE_WHITESPACE", + "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", + "GIT_DIFF_FIND_EXACT_MATCH_ONLY", + "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", + "GIT_DIFF_FIND_REMOVE_UNMODIFIED" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 658, + "lineto": 727, + "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", + "tdef": "typedef", + "description": " Flags to control the behavior of diff rename/copy detection.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FIND_BY_CONFIG", + "comments": "

Obey diff.renames. Overridden by any other GIT_DIFF_FIND_... flag.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_RENAMES", + "comments": "

Look for renames? (--find-renames)

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", + "comments": "

Consider old side of MODIFIED for renames? (--break-rewrites=N)

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_COPIES", + "comments": "

Look for copies? (a la --find-copies).

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", + "comments": "

Consider UNMODIFIED as copy sources? (--find-copies-harder).

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNMODIFIED when\n the initial git_diff is being generated.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_REWRITES", + "comments": "

Mark significant rewrites for split (--break-rewrites=/M)

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_DIFF_BREAK_REWRITES", + "comments": "

Actually split large rewrites into delete/add pairs

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_AND_BREAK_REWRITES", + "comments": "

Mark rewrites for split and break into delete/add pairs

\n", + "value": 48 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_FOR_UNTRACKED", + "comments": "

Find renames/copies for UNTRACKED items in working directory.

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNTRACKED when the\n initial git_diff is being generated (and obviously the diff must\n be against the working directory for this to make sense).

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_ALL", + "comments": "

Turn on all finding features.

\n", + "value": 255 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", + "comments": "

Measure similarity ignoring leading whitespace (default)

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_IGNORE_WHITESPACE", + "comments": "

Measure similarity ignoring all whitespace

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", + "comments": "

Measure similarity including all data

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_EXACT_MATCH_ONLY", + "comments": "

Measure similarity only by comparing SHAs (fast and cheap)

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", + "comments": "

Do not break rewrites unless they contribute to a rename.

\n\n

Normally, GIT_DIFF_FIND_AND_BREAK_REWRITES will measure the self-\n similarity of modified files and split the ones that have changed a\n lot into a DELETE / ADD pair. Then the sides of that pair will be\n considered candidates for rename and copy detection.

\n\n

If you add this flag in and the split pair is not used for an\n actual rename or copy, then the modified record will be restored to\n a regular MODIFIED record instead of being split.

\n", + "value": 32768 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_REMOVE_UNMODIFIED", + "comments": "

Remove any UNMODIFIED deltas after find_similar is done.

\n\n

Using GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED to emulate the\n --find-copies-harder behavior requires building a diff with the\n GIT_DIFF_INCLUDE_UNMODIFIED flag. If you do not want UNMODIFIED\n records in the final result, pass this flag to have them removed.

\n", + "value": 65536 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_flag_t", + { + "decl": [ + "GIT_DIFF_FLAG_BINARY", + "GIT_DIFF_FLAG_NOT_BINARY", + "GIT_DIFF_FLAG_VALID_ID", + "GIT_DIFF_FLAG_EXISTS", + "GIT_DIFF_FLAG_VALID_SIZE" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 206, + "lineto": 212, + "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS\nGIT_DIFF_FLAG_VALID_SIZE", + "tdef": "typedef", + "description": " Flags for the delta object and the file objects on each side.", + "comments": "

These flags are used for both the flags value of the git_diff_delta and the flags for the git_diff_file objects representing the old and new sides of the delta. Values outside of this public range should be considered reserved for internal or future use.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FLAG_BINARY", + "comments": "

file(s) treated as binary data

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_NOT_BINARY", + "comments": "

file(s) treated as text data

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_VALID_ID", + "comments": "

id value is known correct

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_EXISTS", + "comments": "

file exists at this side of the delta

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_VALID_SIZE", + "comments": "

file size value is known correct

\n", + "value": 16 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_format_email_flags_t", + { + "decl": [ + "GIT_DIFF_FORMAT_EMAIL_NONE", + "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER" + ], + "type": "enum", + "file": "git2/deprecated.h", + "line": 311, + "lineto": 318, + "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", + "tdef": "typedef", + "description": " Formatting options for diff e-mail generation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FORMAT_EMAIL_NONE", + "comments": "

Normal patch, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", + "comments": "

Don't insert "[PATCH]" in the subject header

\n", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_format_email_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "size_t patch_no", + "size_t total_patches", + "const git_oid * id", + "const char * summary", + "const char * body", + "const git_signature * author" + ], + "type": "struct", + "value": "git_diff_format_email_options", + "file": "git2/deprecated.h", + "line": 323, + "lineto": 346, + "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", + "tdef": "typedef", + "description": " Options for controlling the formatting of the generated e-mail.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_diff_format_email_flags_t` above " + }, + { + "type": "size_t", + "name": "patch_no", + "comments": " This patch number " + }, + { + "type": "size_t", + "name": "total_patches", + "comments": " Total number of patches in this series " + }, + { + "type": "const git_oid *", + "name": "id", + "comments": " id to use for the commit " + }, + { + "type": "const char *", + "name": "summary", + "comments": " Summary of the change " + }, + { + "type": "const char *", + "name": "body", + "comments": " Commit message's body " + }, + { + "type": "const git_signature *", + "name": "author", + "comments": " Author of the change " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_format_email", + "git_diff_format_email_options_init" + ] + } + } + ], + [ + "git_diff_format_t", + { + "decl": [ + "GIT_DIFF_FORMAT_PATCH", + "GIT_DIFF_FORMAT_PATCH_HEADER", + "GIT_DIFF_FORMAT_RAW", + "GIT_DIFF_FORMAT_NAME_ONLY", + "GIT_DIFF_FORMAT_NAME_STATUS", + "GIT_DIFF_FORMAT_PATCH_ID" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 1128, + "lineto": 1135, + "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", + "tdef": "typedef", + "description": " Possible output formats for diff data", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH", + "comments": "

full git diff

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH_HEADER", + "comments": "

just the file headers of patch

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_RAW", + "comments": "

like git diff --raw

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_NAME_ONLY", + "comments": "

like git diff --name-only

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_NAME_STATUS", + "comments": "

like git diff --name-status

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH_ID", + "comments": "

git diff as used by git patch-id

\n", + "value": 6 + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_print", + "git_diff_to_buf" + ] + } + } + ], + [ + "git_diff_hunk", + { + "decl": [ + "int old_start", + "int old_lines", + "int new_start", + "int new_lines", + "size_t header_len", + "char [128] header" + ], + "type": "struct", + "value": "git_diff_hunk", + "file": "git2/diff.h", + "line": 576, + "lineto": 583, + "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", + "tdef": "typedef", + "description": " Structure describing a hunk of a diff.", + "comments": "

A hunk is a span of modified lines in a delta along with some stable surrounding context. You can configure the amount of context and other properties of how hunks are generated. Each hunk also comes with a header that described where it starts and ends in both the old and new versions in the delta.

\n", + "fields": [ + { + "type": "int", + "name": "old_start", + "comments": " Starting line number in old_file " + }, + { + "type": "int", + "name": "old_lines", + "comments": " Number of lines in old_file " + }, + { + "type": "int", + "name": "new_start", + "comments": " Starting line number in new_file " + }, + { + "type": "int", + "name": "new_lines", + "comments": " Number of lines in new_file " + }, + { + "type": "size_t", + "name": "header_len", + "comments": " Number of bytes in header text " + }, + { + "type": "char [128]", + "name": "header", + "comments": " Header text, NUL-byte terminated " + } + ], + "used": { + "returns": [], + "needs": [ + "git_apply_hunk_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_patch_get_hunk" + ] + } + } + ], + [ + "git_diff_line", + { + "decl": [ + "char origin", + "int old_lineno", + "int new_lineno", + "int num_lines", + "size_t content_len", + "git_off_t content_offset", + "const char * content" + ], + "type": "struct", + "value": "git_diff_line", + "file": "git2/diff.h", + "line": 631, + "lineto": 639, + "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", + "tdef": "typedef", + "description": " Structure describing a line (or data span) of a diff.", + "comments": "

A line is a range of characters inside a hunk. It could be a context line (i.e. in both old and new versions), an added line (i.e. only in the new version), or a removed line (i.e. only in the old version). Unfortunately, we don't know anything about the encoding of data in the file being diffed, so we cannot tell you much about the line content. Line data will not be NUL-byte terminated, however, because it will be just a span of bytes inside the larger file.

\n", + "fields": [ + { + "type": "char", + "name": "origin", + "comments": " A git_diff_line_t value " + }, + { + "type": "int", + "name": "old_lineno", + "comments": " Line number in old file or -1 for added line " + }, + { + "type": "int", + "name": "new_lineno", + "comments": " Line number in new file or -1 for deleted line " + }, + { + "type": "int", + "name": "num_lines", + "comments": " Number of newline characters in content " + }, + { + "type": "size_t", + "name": "content_len", + "comments": " Number of bytes of data " + }, + { + "type": "git_off_t", + "name": "content_offset", + "comments": " Offset in the original file to the content " + }, + { + "type": "const char *", + "name": "content", + "comments": " Pointer to diff text, not NUL-byte terminated " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach", + "git_diff_line_cb", + "git_diff_print", + "git_patch_get_line_in_hunk", + "git_patch_print" + ] + } + } + ], + [ + "git_diff_line_t", + { + "decl": [ + "GIT_DIFF_LINE_CONTEXT", + "GIT_DIFF_LINE_ADDITION", + "GIT_DIFF_LINE_DELETION", + "GIT_DIFF_LINE_CONTEXT_EOFNL", + "GIT_DIFF_LINE_ADD_EOFNL", + "GIT_DIFF_LINE_DEL_EOFNL", + "GIT_DIFF_LINE_FILE_HDR", + "GIT_DIFF_LINE_HUNK_HDR", + "GIT_DIFF_LINE_BINARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 602, + "lineto": 618, + "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", + "tdef": "typedef", + "description": " Line origin constants.", + "comments": "

These values describe where a line came from and will be passed to the git_diff_line_cb when iterating over a diff. There are some special origin constants at the end that are used for the text output callbacks to demarcate lines that are actually part of the file or hunk headers.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_LINE_CONTEXT", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_ADDITION", + "comments": "", + "value": 43 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_DELETION", + "comments": "", + "value": 45 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_CONTEXT_EOFNL", + "comments": "

Both files have no LF at end

\n", + "value": 61 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_ADD_EOFNL", + "comments": "

Old has no LF at end, new does

\n", + "value": 62 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_DEL_EOFNL", + "comments": "

Old has LF at end, new does not

\n", + "value": 60 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_FILE_HDR", + "comments": "", + "value": 70 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_HUNK_HDR", + "comments": "", + "value": 72 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_BINARY", + "comments": "

For "Binary files x and y differ"

\n", + "value": 66 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_option_t", + { + "decl": [ + "GIT_DIFF_NORMAL", + "GIT_DIFF_REVERSE", + "GIT_DIFF_INCLUDE_IGNORED", + "GIT_DIFF_RECURSE_IGNORED_DIRS", + "GIT_DIFF_INCLUDE_UNTRACKED", + "GIT_DIFF_RECURSE_UNTRACKED_DIRS", + "GIT_DIFF_INCLUDE_UNMODIFIED", + "GIT_DIFF_INCLUDE_TYPECHANGE", + "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", + "GIT_DIFF_IGNORE_FILEMODE", + "GIT_DIFF_IGNORE_SUBMODULES", + "GIT_DIFF_IGNORE_CASE", + "GIT_DIFF_INCLUDE_CASECHANGE", + "GIT_DIFF_DISABLE_PATHSPEC_MATCH", + "GIT_DIFF_SKIP_BINARY_CHECK", + "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", + "GIT_DIFF_UPDATE_INDEX", + "GIT_DIFF_INCLUDE_UNREADABLE", + "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", + "GIT_DIFF_INDENT_HEURISTIC", + "GIT_DIFF_IGNORE_BLANK_LINES", + "GIT_DIFF_FORCE_TEXT", + "GIT_DIFF_FORCE_BINARY", + "GIT_DIFF_IGNORE_WHITESPACE", + "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", + "GIT_DIFF_IGNORE_WHITESPACE_EOL", + "GIT_DIFF_SHOW_UNTRACKED_CONTENT", + "GIT_DIFF_SHOW_UNMODIFIED", + "GIT_DIFF_PATIENCE", + "GIT_DIFF_MINIMAL", + "GIT_DIFF_SHOW_BINARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 28, + "lineto": 174, + "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_IGNORE_BLANK_LINES\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", + "tdef": "typedef", + "description": " Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_NORMAL", + "comments": "

Normal diff, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_REVERSE", + "comments": "

Reverse the sides of the diff

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_IGNORED", + "comments": "

Include ignored files in the diff

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_RECURSE_IGNORED_DIRS", + "comments": "

Even with GIT_DIFF_INCLUDE_IGNORED, an entire ignored directory\n will be marked with only a single entry in the diff; this flag\n adds all files under the directory as IGNORED entries, too.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNTRACKED", + "comments": "

Include untracked files in the diff

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_RECURSE_UNTRACKED_DIRS", + "comments": "

Even with GIT_DIFF_INCLUDE_UNTRACKED, an entire untracked\n directory will be marked with only a single entry in the diff\n (a la what core Git does in git status); this flag adds all\n files under untracked directories as UNTRACKED entries, too.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNMODIFIED", + "comments": "

Include unmodified files in the diff

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_TYPECHANGE", + "comments": "

Normally, a type change between files will be converted into a\n DELETED record for the old and an ADDED record for the new; this\n options enabled the generation of TYPECHANGE delta records.

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", + "comments": "

Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still\n generally show as a DELETED blob. This flag tries to correctly\n label blob->tree transitions as TYPECHANGE records with new_file's\n mode set to tree. Note: the tree SHA will not be available.

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_FILEMODE", + "comments": "

Ignore file mode changes

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_SUBMODULES", + "comments": "

Treat all submodules as unmodified

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_CASE", + "comments": "

Use case insensitive filename comparisons

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_CASECHANGE", + "comments": "

May be combined with GIT_DIFF_IGNORE_CASE to specify that a file\n that has changed case will be returned as an add/delete pair.

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_DIFF_DISABLE_PATHSPEC_MATCH", + "comments": "

If the pathspec is set in the diff options, this flags indicates\n that the paths will be treated as literal paths instead of\n fnmatch patterns. Each path in the list must either be a full\n path to a file or a directory. (A trailing slash indicates that\n the path will only match a directory). If a directory is\n specified, all children will be included.

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_DIFF_SKIP_BINARY_CHECK", + "comments": "

Disable updating of the binary flag in delta records. This is\n useful when iterating over a diff if you don't need hunk and data\n callbacks and want to avoid having to load file completely.

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", + "comments": "

When diff finds an untracked directory, to match the behavior of\n core Git, it scans the contents for IGNORED and UNTRACKED files.\n If all contents are IGNORED, then the directory is IGNORED; if\n any contents are not IGNORED, then the directory is UNTRACKED.\n This is extra work that may not matter in many cases. This flag\n turns off that scan and immediately labels an untracked directory\n as UNTRACKED (changing the behavior to not match core Git).

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_DIFF_UPDATE_INDEX", + "comments": "

When diff finds a file in the working directory with stat\n information different from the index, but the OID ends up being the\n same, write the correct stat information into the index. Note:\n without this flag, diff will always leave the index untouched.

\n", + "value": 32768 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNREADABLE", + "comments": "

Include unreadable files in the diff

\n", + "value": 65536 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", + "comments": "

Include unreadable files in the diff

\n", + "value": 131072 + }, + { + "type": "int", + "name": "GIT_DIFF_INDENT_HEURISTIC", + "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", + "value": 262144 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_BLANK_LINES", + "comments": "

Ignore blank lines

\n", + "value": 524288 + }, + { + "type": "int", + "name": "GIT_DIFF_FORCE_TEXT", + "comments": "

Treat all files as text, disabling binary attributes \n&\n detection

\n", + "value": 1048576 + }, + { + "type": "int", + "name": "GIT_DIFF_FORCE_BINARY", + "comments": "

Treat all files as binary, disabling text diffs

\n", + "value": 2097152 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE", + "comments": "

Ignore all whitespace

\n", + "value": 4194304 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", + "comments": "

Ignore changes in amount of whitespace

\n", + "value": 8388608 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE_EOL", + "comments": "

Ignore whitespace at end of line

\n", + "value": 16777216 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_UNTRACKED_CONTENT", + "comments": "

When generating patch text, include the content of untracked\n files. This automatically turns on GIT_DIFF_INCLUDE_UNTRACKED but\n it does not turn on GIT_DIFF_RECURSE_UNTRACKED_DIRS. Add that\n flag if you want the content of every single UNTRACKED file.

\n", + "value": 33554432 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_UNMODIFIED", + "comments": "

When generating output, include the names of unmodified files if\n they are included in the git_diff. Normally these are skipped in\n the formats that list files (e.g. name-only, name-status, raw).\n Even with this, these will not be included in patch format.

\n", + "value": 67108864 + }, + { + "type": "int", + "name": "GIT_DIFF_PATIENCE", + "comments": "

Use the "patience diff" algorithm

\n", + "value": 268435456 + }, + { + "type": "int", + "name": "GIT_DIFF_MINIMAL", + "comments": "

Take extra time to find minimal diff

\n", + "value": 536870912 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_BINARY", + "comments": "

Include the necessary deflate / delta information so that git-apply\n can apply given diff information to binary files.

\n", + "value": 1073741824 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_submodule_ignore_t ignore_submodules", + "git_strarray pathspec", + "git_diff_notify_cb notify_cb", + "git_diff_progress_cb progress_cb", + "void * payload", + "uint32_t context_lines", + "uint32_t interhunk_lines", + "git_oid_t oid_type", + "uint16_t id_abbrev", + "git_off_t max_size", + "const char * old_prefix", + "const char * new_prefix" + ], + "type": "struct", + "value": "git_diff_options", + "file": "git2/diff.h", + "line": 376, + "lineto": 464, + "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\ngit_oid_t oid_type\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", + "tdef": "typedef", + "description": " Structure describing options about how the diff should be executed.", + "comments": "

Setting all values of the structure to zero will yield the default values. Similarly, passing NULL for the options structure will give the defaults. The default values are marked below.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" + }, + { + "type": "git_submodule_ignore_t", + "name": "ignore_submodules", + "comments": " Overrides the submodule ignore setting for all submodules in the diff. " + }, + { + "type": "git_strarray", + "name": "pathspec", + "comments": " An array of paths / fnmatch patterns to constrain diff.\n All paths are included by default." + }, + { + "type": "git_diff_notify_cb", + "name": "notify_cb", + "comments": " An optional callback function, notifying the consumer of changes to\n the diff as new deltas are added." + }, + { + "type": "git_diff_progress_cb", + "name": "progress_cb", + "comments": " An optional callback function, notifying the consumer of which files\n are being examined as the diff is generated." + }, + { + "type": "void *", + "name": "payload", + "comments": " The payload to pass to the callback functions. " + }, + { + "type": "uint32_t", + "name": "context_lines", + "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." + }, + { + "type": "uint32_t", + "name": "interhunk_lines", + "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " The object ID type to emit in diffs; this is used by functions\n that operate without a repository - namely `git_diff_buffers`,\n or `git_diff_blobs` and `git_diff_blob_to_buffer` when one blob\n is `NULL`.\n\n This may be omitted (set to `0`). If a repository is available,\n the object ID format of the repository will be used. If no\n repository is available then the default is `GIT_OID_SHA`.\n\n If this is specified and a repository is available, then the\n specified `oid_type` must match the repository's object ID\n format." + }, + { + "type": "uint16_t", + "name": "id_abbrev", + "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." + }, + { + "type": "git_off_t", + "name": "max_size", + "comments": " A size (in bytes) above which a blob will be marked as binary\n automatically; pass a negative value to disable.\n Defaults to 512MB." + }, + { + "type": "const char *", + "name": "old_prefix", + "comments": " The virtual \"directory\" prefix for old file names in hunk headers.\n Default is \"a\"." + }, + { + "type": "const char *", + "name": "new_prefix", + "comments": " The virtual \"directory\" prefix for new file names in hunk headers.\n Defaults to \"b\"." + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_options_init", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers" + ] + } + } + ], + [ + "git_diff_parse_options", + { + "decl": [ + "unsigned int version", + "git_oid_t oid_type" + ], + "type": "struct", + "value": "git_diff_parse_options", + "file": "git2/diff.h", + "line": 1294, + "lineto": 1297, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for parsing a diff / patch file.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_patchid_options", + { + "decl": [ + "unsigned int version" + ], + "type": "struct", + "value": "git_diff_patchid_options", + "file": "git2/diff.h", + "line": 1431, + "lineto": 1433, + "block": "unsigned int version", + "tdef": "typedef", + "description": " Patch ID options structure", + "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_patchid", + "git_diff_patchid_options_init" + ] + } + } + ], + [ + "git_diff_similarity_metric", + { + "decl": [ + "int (*)(void **, const git_diff_file *, const char *, void *) file_signature", + "int (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature", + "void (*)(void *, void *) free_signature", + "int (*)(int *, void *, void *, void *) similarity", + "void * payload" + ], + "type": "struct", + "value": "git_diff_similarity_metric", + "file": "git2/diff.h", + "line": 732, + "lineto": 742, + "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", + "tdef": "typedef", + "description": " Pluggable similarity metric", + "comments": "", + "fields": [ + { + "type": "int (*)(void **, const git_diff_file *, const char *, void *)", + "name": "file_signature", + "comments": "" + }, + { + "type": "int (*)(void **, const git_diff_file *, const char *, size_t, void *)", + "name": "buffer_signature", + "comments": "" + }, + { + "type": "void (*)(void *, void *)", + "name": "free_signature", + "comments": "" + }, + { + "type": "int (*)(int *, void *, void *, void *)", + "name": "similarity", + "comments": "" + }, + { + "type": "void *", + "name": "payload", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_diff_stats", + { + "decl": "git_diff_stats", + "type": "struct", + "value": "git_diff_stats", + "file": "git2/diff.h", + "line": 1341, + "lineto": 1341, + "tdef": "typedef", + "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_diff_get_stats", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf" + ] + } + } + ], + [ + "git_diff_stats_format_t", + { + "decl": [ + "GIT_DIFF_STATS_NONE", + "GIT_DIFF_STATS_FULL", + "GIT_DIFF_STATS_SHORT", + "GIT_DIFF_STATS_NUMBER", + "GIT_DIFF_STATS_INCLUDE_SUMMARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 1346, + "lineto": 1361, + "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", + "tdef": "typedef", + "description": " Formatting options for diff stats", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_STATS_NONE", + "comments": "

No stats

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_FULL", + "comments": "

Full statistics, equivalent of --stat

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_SHORT", + "comments": "

Short statistics, equivalent of --shortstat

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_NUMBER", + "comments": "

Number statistics, equivalent of --numstat

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_INCLUDE_SUMMARY", + "comments": "

Extended header information such as creations, renames and mode changes, equivalent of --summary

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_stats_to_buf" + ] + } + } + ], + [ + "git_direction", + { + "decl": [ + "GIT_DIRECTION_FETCH", + "GIT_DIRECTION_PUSH" + ], + "type": "enum", + "file": "git2/net.h", + "line": 31, + "lineto": 34, + "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", + "tdef": "typedef", + "description": " Direction of the connection.", + "comments": "

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.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIRECTION_FETCH", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIRECTION_PUSH", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": [ + "git_refspec_direction" + ], + "needs": [ + "git_remote_connect", + "git_remote_connect_ext" + ] + } + } + ], + [ + "git_email_create_flags_t", + { + "decl": [ + "GIT_EMAIL_CREATE_DEFAULT", + "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "GIT_EMAIL_CREATE_NO_RENAMES" + ], + "type": "enum", + "file": "git2/email.h", + "line": 23, + "lineto": 38, + "block": "GIT_EMAIL_CREATE_DEFAULT\nGIT_EMAIL_CREATE_OMIT_NUMBERS\nGIT_EMAIL_CREATE_ALWAYS_NUMBER\nGIT_EMAIL_CREATE_NO_RENAMES", + "tdef": "typedef", + "description": " Formatting options for diff e-mail generation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_EMAIL_CREATE_DEFAULT", + "comments": "

Normal patch, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "comments": "

Do not include patch numbers in the subject prefix.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "comments": "

Include numbers in the subject prefix even when the\n patch is for a single commit (1/1).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_NO_RENAMES", + "comments": "

Do not perform rename or similarity detection.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_error", + { + "decl": [ + "char * message", + "int klass" + ], + "type": "struct", + "value": "git_error", + "file": "git2/errors.h", + "line": 71, + "lineto": 74, + "block": "char * message\nint klass", + "tdef": "typedef", + "description": " Structure to store extra details of the last error that occurred.", + "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", + "fields": [ + { + "type": "char *", + "name": "message", + "comments": "" + }, + { + "type": "int", + "name": "klass", + "comments": "" + } + ], + "used": { + "returns": [ + "git_error_last", + "giterr_last" + ], + "needs": [] + } + } + ], + [ + "git_error_code", + { + "decl": [ + "GIT_OK", + "GIT_ERROR", + "GIT_ENOTFOUND", + "GIT_EEXISTS", + "GIT_EAMBIGUOUS", + "GIT_EBUFS", + "GIT_EUSER", + "GIT_EBAREREPO", + "GIT_EUNBORNBRANCH", + "GIT_EUNMERGED", + "GIT_ENONFASTFORWARD", + "GIT_EINVALIDSPEC", + "GIT_ECONFLICT", + "GIT_ELOCKED", + "GIT_EMODIFIED", + "GIT_EAUTH", + "GIT_ECERTIFICATE", + "GIT_EAPPLIED", + "GIT_EPEEL", + "GIT_EEOF", + "GIT_EINVALID", + "GIT_EUNCOMMITTED", + "GIT_EDIRECTORY", + "GIT_EMERGECONFLICT", + "GIT_PASSTHROUGH", + "GIT_ITEROVER", + "GIT_RETRY", + "GIT_EMISMATCH", + "GIT_EINDEXDIRTY", + "GIT_EAPPLYFAIL", + "GIT_EOWNER", + "GIT_TIMEOUT" + ], + "type": "enum", + "file": "git2/errors.h", + "line": 21, + "lineto": 63, + "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL\nGIT_EOWNER\nGIT_TIMEOUT", + "tdef": "typedef", + "description": " Generic return codes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OK", + "comments": "

No error

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ERROR", + "comments": "

Generic error

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_ENOTFOUND", + "comments": "

Requested object could not be found

\n", + "value": -3 + }, + { + "type": "int", + "name": "GIT_EEXISTS", + "comments": "

Object exists preventing operation

\n", + "value": -4 + }, + { + "type": "int", + "name": "GIT_EAMBIGUOUS", + "comments": "

More than one object matches

\n", + "value": -5 + }, + { + "type": "int", + "name": "GIT_EBUFS", + "comments": "

Output buffer too short to hold data

\n", + "value": -6 + }, + { + "type": "int", + "name": "GIT_EUSER", + "comments": "

GIT_EUSER is a special error that is never generated by libgit2\n code. You can return it from a callback (e.g to stop an iteration)\n to know that it was generated by the callback and not by libgit2.

\n", + "value": -7 + }, + { + "type": "int", + "name": "GIT_EBAREREPO", + "comments": "

Operation not allowed on bare repository

\n", + "value": -8 + }, + { + "type": "int", + "name": "GIT_EUNBORNBRANCH", + "comments": "

HEAD refers to branch with no commits

\n", + "value": -9 + }, + { + "type": "int", + "name": "GIT_EUNMERGED", + "comments": "

Merge in progress prevented operation

\n", + "value": -10 + }, + { + "type": "int", + "name": "GIT_ENONFASTFORWARD", + "comments": "

Reference was not fast-forwardable

\n", + "value": -11 + }, + { + "type": "int", + "name": "GIT_EINVALIDSPEC", + "comments": "

Name/ref spec was not in a valid format

\n", + "value": -12 + }, + { + "type": "int", + "name": "GIT_ECONFLICT", + "comments": "

Checkout conflicts prevented operation

\n", + "value": -13 + }, + { + "type": "int", + "name": "GIT_ELOCKED", + "comments": "

Lock file prevented operation

\n", + "value": -14 + }, + { + "type": "int", + "name": "GIT_EMODIFIED", + "comments": "

Reference value does not match expected

\n", + "value": -15 + }, + { + "type": "int", + "name": "GIT_EAUTH", + "comments": "

Authentication error

\n", + "value": -16 + }, + { + "type": "int", + "name": "GIT_ECERTIFICATE", + "comments": "

Server certificate is invalid

\n", + "value": -17 + }, + { + "type": "int", + "name": "GIT_EAPPLIED", + "comments": "

Patch/merge has already been applied

\n", + "value": -18 + }, + { + "type": "int", + "name": "GIT_EPEEL", + "comments": "

The requested peel operation is not possible

\n", + "value": -19 + }, + { + "type": "int", + "name": "GIT_EEOF", + "comments": "

Unexpected EOF

\n", + "value": -20 + }, + { + "type": "int", + "name": "GIT_EINVALID", + "comments": "

Invalid operation or input

\n", + "value": -21 + }, + { + "type": "int", + "name": "GIT_EUNCOMMITTED", + "comments": "

Uncommitted changes in index prevented operation

\n", + "value": -22 + }, + { + "type": "int", + "name": "GIT_EDIRECTORY", + "comments": "

The operation is not valid for a directory

\n", + "value": -23 + }, + { + "type": "int", + "name": "GIT_EMERGECONFLICT", + "comments": "

A merge conflict exists and cannot continue

\n", + "value": -24 + }, + { + "type": "int", + "name": "GIT_PASSTHROUGH", + "comments": "

A user-configured callback refused to act

\n", + "value": -30 + }, + { + "type": "int", + "name": "GIT_ITEROVER", + "comments": "

Signals end of iteration with iterator

\n", + "value": -31 + }, + { + "type": "int", + "name": "GIT_RETRY", + "comments": "

Internal only

\n", + "value": -32 + }, + { + "type": "int", + "name": "GIT_EMISMATCH", + "comments": "

Hashsum mismatch in object

\n", + "value": -33 + }, + { + "type": "int", + "name": "GIT_EINDEXDIRTY", + "comments": "

Unsaved changes in the index would be overwritten

\n", + "value": -34 + }, + { + "type": "int", + "name": "GIT_EAPPLYFAIL", + "comments": "

Patch application failed

\n", + "value": -35 + }, + { + "type": "int", + "name": "GIT_EOWNER", + "comments": "

The object is not owned by the current user

\n", + "value": -36 + }, + { + "type": "int", + "name": "GIT_TIMEOUT", + "comments": "

The operation timed out

\n", + "value": -37 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_error_t", + { + "decl": [ + "GIT_ERROR_NONE", + "GIT_ERROR_NOMEMORY", + "GIT_ERROR_OS", + "GIT_ERROR_INVALID", + "GIT_ERROR_REFERENCE", + "GIT_ERROR_ZLIB", + "GIT_ERROR_REPOSITORY", + "GIT_ERROR_CONFIG", + "GIT_ERROR_REGEX", + "GIT_ERROR_ODB", + "GIT_ERROR_INDEX", + "GIT_ERROR_OBJECT", + "GIT_ERROR_NET", + "GIT_ERROR_TAG", + "GIT_ERROR_TREE", + "GIT_ERROR_INDEXER", + "GIT_ERROR_SSL", + "GIT_ERROR_SUBMODULE", + "GIT_ERROR_THREAD", + "GIT_ERROR_STASH", + "GIT_ERROR_CHECKOUT", + "GIT_ERROR_FETCHHEAD", + "GIT_ERROR_MERGE", + "GIT_ERROR_SSH", + "GIT_ERROR_FILTER", + "GIT_ERROR_REVERT", + "GIT_ERROR_CALLBACK", + "GIT_ERROR_CHERRYPICK", + "GIT_ERROR_DESCRIBE", + "GIT_ERROR_REBASE", + "GIT_ERROR_FILESYSTEM", + "GIT_ERROR_PATCH", + "GIT_ERROR_WORKTREE", + "GIT_ERROR_SHA", + "GIT_ERROR_HTTP", + "GIT_ERROR_INTERNAL", + "GIT_ERROR_GRAFTS" + ], + "type": "enum", + "file": "git2/errors.h", + "line": 77, + "lineto": 115, + "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL\nGIT_ERROR_GRAFTS", + "tdef": "typedef", + "description": " Error classes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ERROR_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ERROR_NOMEMORY", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_ERROR_OS", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_ERROR_INVALID", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_ERROR_REFERENCE", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_ERROR_ZLIB", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_ERROR_REPOSITORY", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_ERROR_CONFIG", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_ERROR_REGEX", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_ERROR_ODB", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_ERROR_INDEX", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_ERROR_OBJECT", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_ERROR_NET", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_ERROR_TAG", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_ERROR_TREE", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_ERROR_INDEXER", + "comments": "", + "value": 15 + }, + { + "type": "int", + "name": "GIT_ERROR_SSL", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_ERROR_SUBMODULE", + "comments": "", + "value": 17 + }, + { + "type": "int", + "name": "GIT_ERROR_THREAD", + "comments": "", + "value": 18 + }, + { + "type": "int", + "name": "GIT_ERROR_STASH", + "comments": "", + "value": 19 + }, + { + "type": "int", + "name": "GIT_ERROR_CHECKOUT", + "comments": "", + "value": 20 + }, + { + "type": "int", + "name": "GIT_ERROR_FETCHHEAD", + "comments": "", + "value": 21 + }, + { + "type": "int", + "name": "GIT_ERROR_MERGE", + "comments": "", + "value": 22 + }, + { + "type": "int", + "name": "GIT_ERROR_SSH", + "comments": "", + "value": 23 + }, + { + "type": "int", + "name": "GIT_ERROR_FILTER", + "comments": "", + "value": 24 + }, + { + "type": "int", + "name": "GIT_ERROR_REVERT", + "comments": "", + "value": 25 + }, + { + "type": "int", + "name": "GIT_ERROR_CALLBACK", + "comments": "", + "value": 26 + }, + { + "type": "int", + "name": "GIT_ERROR_CHERRYPICK", + "comments": "", + "value": 27 + }, + { + "type": "int", + "name": "GIT_ERROR_DESCRIBE", + "comments": "", + "value": 28 + }, + { + "type": "int", + "name": "GIT_ERROR_REBASE", + "comments": "", + "value": 29 + }, + { + "type": "int", + "name": "GIT_ERROR_FILESYSTEM", + "comments": "", + "value": 30 + }, + { + "type": "int", + "name": "GIT_ERROR_PATCH", + "comments": "", + "value": 31 + }, + { + "type": "int", + "name": "GIT_ERROR_WORKTREE", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_ERROR_SHA", + "comments": "", + "value": 33 + }, + { + "type": "int", + "name": "GIT_ERROR_HTTP", + "comments": "", + "value": 34 + }, + { + "type": "int", + "name": "GIT_ERROR_INTERNAL", + "comments": "", + "value": 35 + }, + { + "type": "int", + "name": "GIT_ERROR_GRAFTS", + "comments": "", + "value": 36 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_feature_t", + { + "decl": [ + "GIT_FEATURE_THREADS", + "GIT_FEATURE_HTTPS", + "GIT_FEATURE_SSH", + "GIT_FEATURE_NSEC" + ], + "type": "enum", + "file": "git2/common.h", + "line": 134, + "lineto": 157, + "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", + "tdef": "typedef", + "description": " Combinations of these values describe the features with which libgit2\n was compiled", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FEATURE_THREADS", + "comments": "

If set, libgit2 was built thread-aware and can be safely used from multiple\n threads.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FEATURE_HTTPS", + "comments": "

If set, libgit2 was built with and linked against a TLS implementation.\n Custom TLS streams may still be added by the user to support HTTPS\n regardless of this.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_FEATURE_SSH", + "comments": "

If set, libgit2 was built with and linked against libssh2. A custom\n transport may still be added by the user to support libssh2 regardless of\n this.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_FEATURE_NSEC", + "comments": "

If set, libgit2 was built with support for sub-second resolution in file\n modification times.

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_fetch_depth_t", + { + "decl": [ + "GIT_FETCH_DEPTH_FULL", + "GIT_FETCH_DEPTH_UNSHALLOW" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 706, + "lineto": 712, + "block": "GIT_FETCH_DEPTH_FULL\nGIT_FETCH_DEPTH_UNSHALLOW", + "tdef": "typedef", + "description": " Constants for fetch depth (shallowness of fetch). ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FETCH_DEPTH_FULL", + "comments": "

The fetch is "full" (not shallow). This is the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FETCH_DEPTH_UNSHALLOW", + "comments": "

The fetch should "unshallow" and fetch missing data.

\n", + "value": 2147483647 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_fetch_options", + { + "decl": [ + "int version", + "git_remote_callbacks callbacks", + "git_fetch_prune_t prune", + "int update_fetchhead", + "git_remote_autotag_option_t download_tags", + "git_proxy_options proxy_opts", + "int depth", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers" + ], + "type": "struct", + "value": "git_fetch_options", + "file": "git2/remote.h", + "line": 722, + "lineto": 775, + "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\nint depth\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", + "tdef": "typedef", + "description": " Fetch options structure.", + "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", + "fields": [ + { + "type": "int", + "name": "version", + "comments": "" + }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this fetch operation" + }, + { + "type": "git_fetch_prune_t", + "name": "prune", + "comments": " Whether to perform a prune after the fetch" + }, + { + "type": "int", + "name": "update_fetchhead", + "comments": " Whether to write the results to FETCH_HEAD. Defaults to\n on. Leave this default in order to behave like git." + }, + { + "type": "git_remote_autotag_option_t", + "name": "download_tags", + "comments": " Determines how to behave regarding tags on the remote, such\n as auto-downloading tags for objects we're downloading or\n downloading all of them.\n\n The default is to auto-follow tags." + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " Proxy options to use, by default no proxy is used." + }, + { + "type": "int", + "name": "depth", + "comments": " Depth of the fetch to perform, or `GIT_FETCH_DEPTH_FULL`\n (or `0`) for full history, or `GIT_FETCH_DEPTH_UNSHALLOW`\n to \"unshallow\" a shallow repository.\n\n The default is full (`GIT_FETCH_DEPTH_FULL` or `0`)." + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra headers for this fetch operation" + } + ], + "used": { + "returns": [], + "needs": [ + "git_fetch_options_init", + "git_remote_download", + "git_remote_fetch" + ] + } + } + ], + [ + "git_fetch_prune_t", + { + "decl": [ + "GIT_FETCH_PRUNE_UNSPECIFIED", + "GIT_FETCH_PRUNE", + "GIT_FETCH_NO_PRUNE" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 665, + "lineto": 678, + "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", + "tdef": "typedef", + "description": " Acceptable prune settings when fetching ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FETCH_PRUNE_UNSPECIFIED", + "comments": "

Use the setting from the configuration

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FETCH_PRUNE", + "comments": "

Force pruning on

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FETCH_NO_PRUNE", + "comments": "

Force pruning off

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_filemode_t", + { + "decl": [ + "GIT_FILEMODE_UNREADABLE", + "GIT_FILEMODE_TREE", + "GIT_FILEMODE_BLOB", + "GIT_FILEMODE_BLOB_EXECUTABLE", + "GIT_FILEMODE_LINK", + "GIT_FILEMODE_COMMIT" + ], + "type": "enum", + "file": "git2/types.h", + "line": 222, + "lineto": 229, + "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", + "tdef": "typedef", + "description": " Valid modes for index and tree entries. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILEMODE_UNREADABLE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILEMODE_TREE", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_FILEMODE_BLOB", + "comments": "", + "value": 33188 + }, + { + "type": "int", + "name": "GIT_FILEMODE_BLOB_EXECUTABLE", + "comments": "", + "value": 33261 + }, + { + "type": "int", + "name": "GIT_FILEMODE_LINK", + "comments": "", + "value": 40960 + }, + { + "type": "int", + "name": "GIT_FILEMODE_COMMIT", + "comments": "", + "value": 57344 + } + ], + "used": { + "returns": [ + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw" + ], + "needs": [ + "git_treebuilder_insert" + ] + } + } + ], + [ + "git_filter", + { + "decl": "git_filter", + "type": "struct", + "value": "git_filter", + "file": "git2/filter.h", + "line": 100, + "lineto": 100, + "tdef": "typedef", + "description": " A filter that can transform file data", + "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", + "used": { + "returns": [], + "needs": [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ], + [ + "git_filter_flag_t", + { + "decl": [ + "GIT_FILTER_DEFAULT", + "GIT_FILTER_ALLOW_UNSAFE", + "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_FILTER_ATTRIBUTES_FROM_COMMIT" + ], + "type": "enum", + "file": "git2/filter.h", + "line": 41, + "lineto": 58, + "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_FILTER_ATTRIBUTES_FROM_COMMIT", + "tdef": "typedef", + "description": " Filter option flags.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILTER_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_ALLOW_UNSAFE", + "comments": "

Don't error for safecrlf violations, allow them to continue.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

Don't load /etc/gitattributes (or the system equivalent)

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "comments": "

Load attributes from .gitattributes in the root of HEAD

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

Load attributes from .gitattributes in a given commit.\n This can only be specified in a git_filter_options.

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_filter_list", + { + "decl": "git_filter_list", + "type": "struct", + "value": "git_filter_list", + "file": "git2/filter.h", + "line": 112, + "lineto": 112, + "tdef": "typedef", + "description": " List of filters to be applied", + "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", + "used": { + "returns": [], + "needs": [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ], + [ + "git_filter_mode_t", + { + "decl": [ + "GIT_FILTER_TO_WORKTREE", + "GIT_FILTER_SMUDGE", + "GIT_FILTER_TO_ODB", + "GIT_FILTER_CLEAN" + ], + "type": "enum", + "file": "git2/filter.h", + "line": 31, + "lineto": 36, + "block": "GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN", + "tdef": "typedef", + "description": " Filters are applied in one of two directions: smudging - which is\n exporting a file from the Git object database to the working directory,\n and cleaning - which is importing a file from the working directory to\n the Git object database. These values control which direction of\n change is being applied.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILTER_TO_WORKTREE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_SMUDGE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_TO_ODB", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FILTER_CLEAN", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [ + "git_filter_list_load", + "git_filter_list_load_ext" + ] + } + } + ], + [ + "git_filter_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_filter_options", + "file": "git2/filter.h", + "line": 63, + "lineto": 80, + "block": "unsigned int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " Filtering options", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_filter_flag_t` above " + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": "" + }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": [ + "git_filter_list_load_ext" + ] + } + } + ], + [ + "git_filter_source", + { + "decl": "git_filter_source", + "type": "struct", + "value": "git_filter_source", + "file": "git2/sys/filter.h", + "line": 95, + "lineto": 95, + "tdef": "typedef", + "description": " A filter source represents a file/blob to be processed", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_hashsig_option_t", + { + "decl": [ + "GIT_HASHSIG_NORMAL", + "GIT_HASHSIG_IGNORE_WHITESPACE", + "GIT_HASHSIG_SMART_WHITESPACE", + "GIT_HASHSIG_ALLOW_SMALL_FILES" + ], + "type": "enum", + "file": "git2/sys/hashsig.h", + "line": 25, + "lineto": 45, + "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", + "tdef": "typedef", + "description": " Options for hashsig computation", + "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_HASHSIG_NORMAL", + "comments": "

Use all data

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_HASHSIG_IGNORE_WHITESPACE", + "comments": "

Ignore whitespace

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_HASHSIG_SMART_WHITESPACE", + "comments": "

Ignore

\n\n

and all space after

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_HASHSIG_ALLOW_SMALL_FILES", + "comments": "

Allow hashing of small files

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index", + { + "decl": "git_index", + "type": "struct", + "value": "git_index", + "file": "git2/types.h", + "line": 148, + "lineto": 148, + "tdef": "typedef", + "description": " Memory representation of an index file. ", + "comments": "", + "used": { + "returns": [ + "git_index_get_byindex", + "git_index_get_bypath", + "git_remote_stats" + ], + "needs": [ + "git_apply_to_tree", + "git_checkout_index", + "git_cherrypick_commit", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_index", + "git_index_add", + "git_index_add_all", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_caps", + "git_index_checksum", + "git_index_clear", + "git_index_conflict_add", + "git_index_conflict_cleanup", + "git_index_conflict_get", + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_remove", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_entrycount", + "git_index_find", + "git_index_find_prefix", + "git_index_free", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_owner", + "git_index_path", + "git_index_read", + "git_index_read_tree", + "git_index_remove", + "git_index_remove_all", + "git_index_remove_bypath", + "git_index_remove_directory", + "git_index_set_caps", + "git_index_set_version", + "git_index_update_all", + "git_index_version", + "git_index_write", + "git_index_write_tree", + "git_index_write_tree_to", + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", + "git_merge_commits", + "git_merge_file_from_index", + "git_merge_trees", + "git_odb_write_pack", + "git_packbuilder_write", + "git_pathspec_match_index", + "git_rebase_inmemory_index", + "git_repository_index", + "git_revert_commit" + ] + } + } + ], + [ + "git_index_add_option_t", + { + "decl": [ + "GIT_INDEX_ADD_DEFAULT", + "GIT_INDEX_ADD_FORCE", + "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", + "GIT_INDEX_ADD_CHECK_PATHSPEC" + ], + "type": "enum", + "file": "git2/index.h", + "line": 139, + "lineto": 144, + "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", + "tdef": "typedef", + "description": " Flags for APIs that add files matching pathspec ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ADD_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_FORCE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_CHECK_PATHSPEC", + "comments": "", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index_capability_t", + { + "decl": [ + "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "GIT_INDEX_CAPABILITY_FROM_OWNER" + ], + "type": "enum", + "file": "git2/index.h", + "line": 126, + "lineto": 131, + "block": "GIT_INDEX_CAPABILITY_IGNORE_CASE\nGIT_INDEX_CAPABILITY_NO_FILEMODE\nGIT_INDEX_CAPABILITY_NO_SYMLINKS\nGIT_INDEX_CAPABILITY_FROM_OWNER", + "tdef": "typedef", + "description": " Capabilities of system that affect index actions. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_FROM_OWNER", + "comments": "", + "value": -1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index_conflict_iterator", + { + "decl": "git_index_conflict_iterator", + "type": "struct", + "value": "git_index_conflict_iterator", + "file": "git2/types.h", + "line": 154, + "lineto": 154, + "tdef": "typedef", + "description": " An iterator for conflicts in the index. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next" + ] + } + } + ], + [ + "git_index_entry", + { + "decl": [ + "git_index_time ctime", + "git_index_time mtime", + "uint32_t dev", + "uint32_t ino", + "uint32_t mode", + "uint32_t uid", + "uint32_t gid", + "uint32_t file_size", + "git_oid id", + "uint16_t flags", + "uint16_t flags_extended", + "const char * path" + ], + "type": "struct", + "value": "git_index_entry", + "file": "git2/index.h", + "line": 53, + "lineto": 70, + "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", + "tdef": "typedef", + "description": " In-memory representation of a file entry in the index.", + "comments": "

This is a public structure that represents a file entry in the index. The meaning of the fields corresponds to core Git's documentation (in "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be accessed via the first set of GIT_INDEX_ENTRY_... bitmasks below. These flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be accessed via the later GIT_INDEX_ENTRY_... bitmasks below. Some of these flags are read from and written to disk, but some are set aside for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This is enough to detect changes, which is enough for the index to function as a cache, but it should not be taken as an authoritative source for that data.

\n", + "fields": [ + { + "type": "git_index_time", + "name": "ctime", + "comments": "" + }, + { + "type": "git_index_time", + "name": "mtime", + "comments": "" + }, + { + "type": "uint32_t", + "name": "dev", + "comments": "" + }, + { + "type": "uint32_t", + "name": "ino", + "comments": "" + }, + { + "type": "uint32_t", + "name": "mode", + "comments": "" + }, + { + "type": "uint32_t", + "name": "uid", + "comments": "" + }, + { + "type": "uint32_t", + "name": "gid", + "comments": "" + }, + { + "type": "uint32_t", + "name": "file_size", + "comments": "" + }, + { + "type": "git_oid", + "name": "id", + "comments": "" + }, + { + "type": "uint16_t", + "name": "flags", + "comments": "" + }, + { + "type": "uint16_t", + "name": "flags_extended", + "comments": "" + }, + { + "type": "const char *", + "name": "path", + "comments": "" + } + ], + "used": { + "returns": [ + "git_index_get_byindex", + "git_index_get_bypath" + ], + "needs": [ + "git_index_add", + "git_index_add_from_buffer", + "git_index_conflict_add", + "git_index_conflict_get", + "git_index_conflict_next", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_iterator_next", + "git_merge_file_from_index" + ] + } + } + ], + [ + "git_index_entry_extended_flag_t", + { + "decl": [ + "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "GIT_INDEX_ENTRY_UPTODATE" + ], + "type": "enum", + "file": "git2/index.h", + "line": 116, + "lineto": 123, + "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", + "tdef": "typedef", + "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", + "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "comments": "", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "comments": "", + "value": 24576 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_UPTODATE", + "comments": "", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index_entry_flag_t", + { + "decl": [ + "GIT_INDEX_ENTRY_EXTENDED", + "GIT_INDEX_ENTRY_VALID" + ], + "type": "enum", + "file": "git2/index.h", + "line": 87, + "lineto": 90, + "block": "GIT_INDEX_ENTRY_EXTENDED\nGIT_INDEX_ENTRY_VALID", + "tdef": "typedef", + "description": " Flags for index entries", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_VALID", + "comments": "", + "value": 32768 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index_iterator", + { + "decl": "git_index_iterator", + "type": "struct", + "value": "git_index_iterator", + "file": "git2/types.h", + "line": 151, + "lineto": 151, + "tdef": "typedef", + "description": " An iterator for entries in the index. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next" + ] + } + } + ], + [ + "git_index_stage_t", + { + "decl": [ + "GIT_INDEX_STAGE_ANY", + "GIT_INDEX_STAGE_NORMAL", + "GIT_INDEX_STAGE_ANCESTOR", + "GIT_INDEX_STAGE_OURS", + "GIT_INDEX_STAGE_THEIRS" + ], + "type": "enum", + "file": "git2/index.h", + "line": 147, + "lineto": 167, + "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", + "tdef": "typedef", + "description": " Git index stage states ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANY", + "comments": "

Match any index stage.

\n\n

Some index APIs take a stage to match; pass this value to match\n any entry matching the path regardless of stage.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_NORMAL", + "comments": "

A normal staged file in the index.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANCESTOR", + "comments": "

The ancestor side of a conflict.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_OURS", + "comments": "

The "ours" side of a conflict.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_THEIRS", + "comments": "

The "theirs" side of a conflict.

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_index_time", + { + "decl": [ + "int32_t seconds", + "uint32_t nanoseconds" + ], + "type": "struct", + "value": "git_index_time", + "file": "git2/index.h", + "line": 26, + "lineto": 30, + "block": "int32_t seconds\nuint32_t nanoseconds", + "tdef": "typedef", + "description": " Time structure used in a git index entry ", + "comments": "", + "fields": [ + { + "type": "int32_t", + "name": "seconds", + "comments": "" + }, + { + "type": "uint32_t", + "name": "nanoseconds", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_indexer", + { + "decl": "git_indexer", + "type": "struct", + "value": "git_indexer", + "file": "git2/indexer.h", + "line": 17, + "lineto": 17, + "tdef": "typedef", + "description": " A git indexer object ", + "comments": "", + "used": { + "returns": [ + "git_remote_stats" + ], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + } + } + ], + [ + "git_indexer_options", + { + "decl": [ + "unsigned int version", + "git_indexer_progress_cb progress_cb", + "void * progress_cb_payload", + "unsigned char verify" + ], + "type": "struct", + "value": "git_indexer_options", + "file": "git2/indexer.h", + "line": 62, + "lineto": 86, + "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", + "tdef": "typedef", + "description": " Options for indexer configuration", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_indexer_progress_cb", + "name": "progress_cb", + "comments": " progress_cb function to call with progress information " + }, + { + "type": "void *", + "name": "progress_cb_payload", + "comments": " progress_cb_payload payload for the progress callback " + }, + { + "type": "unsigned char", + "name": "verify", + "comments": " Do connectivity checks for the received pack " + } + ], + "used": { + "returns": [], + "needs": [ + "git_indexer_new", + "git_indexer_options_init" + ] + } + } + ], + [ + "git_indexer_progress", + { + "decl": [ + "unsigned int total_objects", + "unsigned int indexed_objects", + "unsigned int received_objects", + "unsigned int local_objects", + "unsigned int total_deltas", + "unsigned int indexed_deltas", + "size_t received_bytes" + ], + "type": "struct", + "value": "git_indexer_progress", + "file": "git2/indexer.h", + "line": 24, + "lineto": 48, + "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", + "tdef": "typedef", + "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "total_objects", + "comments": " number of objects in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_objects", + "comments": " received objects that have been hashed " + }, + { + "type": "unsigned int", + "name": "received_objects", + "comments": " received_objects: objects which have been downloaded " + }, + { + "type": "unsigned int", + "name": "local_objects", + "comments": " locally-available objects that have been injected in order\n to fix a thin pack" + }, + { + "type": "unsigned int", + "name": "total_deltas", + "comments": " number of deltas in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_deltas", + "comments": " received deltas that have been indexed " + }, + { + "type": "size_t", + "name": "received_bytes", + "comments": " size of the packfile received up to now " + } + ], + "used": { + "returns": [ + "git_remote_stats" + ], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + } + } + ], + [ + "git_libgit2_opt_t", + { + "decl": [ + "GIT_OPT_GET_MWINDOW_SIZE", + "GIT_OPT_SET_MWINDOW_SIZE", + "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", + "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", + "GIT_OPT_GET_SEARCH_PATH", + "GIT_OPT_SET_SEARCH_PATH", + "GIT_OPT_SET_CACHE_OBJECT_LIMIT", + "GIT_OPT_SET_CACHE_MAX_SIZE", + "GIT_OPT_ENABLE_CACHING", + "GIT_OPT_GET_CACHED_MEMORY", + "GIT_OPT_GET_TEMPLATE_PATH", + "GIT_OPT_SET_TEMPLATE_PATH", + "GIT_OPT_SET_SSL_CERT_LOCATIONS", + "GIT_OPT_SET_USER_AGENT", + "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", + "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", + "GIT_OPT_SET_SSL_CIPHERS", + "GIT_OPT_GET_USER_AGENT", + "GIT_OPT_ENABLE_OFS_DELTA", + "GIT_OPT_ENABLE_FSYNC_GITDIR", + "GIT_OPT_GET_WINDOWS_SHAREMODE", + "GIT_OPT_SET_WINDOWS_SHAREMODE", + "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "GIT_OPT_SET_ALLOCATOR", + "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "GIT_OPT_GET_PACK_MAX_OBJECTS", + "GIT_OPT_SET_PACK_MAX_OBJECTS", + "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "GIT_OPT_GET_EXTENSIONS", + "GIT_OPT_SET_EXTENSIONS", + "GIT_OPT_GET_OWNER_VALIDATION", + "GIT_OPT_SET_OWNER_VALIDATION", + "GIT_OPT_GET_HOMEDIR", + "GIT_OPT_SET_HOMEDIR", + "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", + "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", + "GIT_OPT_SET_SERVER_TIMEOUT", + "GIT_OPT_GET_SERVER_TIMEOUT" + ], + "type": "enum", + "file": "git2/common.h", + "line": 188, + "lineto": 232, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION\nGIT_OPT_GET_HOMEDIR\nGIT_OPT_SET_HOMEDIR\nGIT_OPT_SET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_GET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_SET_SERVER_TIMEOUT\nGIT_OPT_GET_SERVER_TIMEOUT", + "tdef": "typedef", + "description": " Global library options", + "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", + "fields": [ + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_SIZE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_SIZE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SEARCH_PATH", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SEARCH_PATH", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_OPT_SET_CACHE_OBJECT_LIMIT", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_OPT_SET_CACHE_MAX_SIZE", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_CACHING", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_OPT_GET_CACHED_MEMORY", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_OPT_GET_TEMPLATE_PATH", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_OPT_SET_TEMPLATE_PATH", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SSL_CERT_LOCATIONS", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_OPT_SET_USER_AGENT", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", + "comments": "", + "value": 15 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SSL_CIPHERS", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_OPT_GET_USER_AGENT", + "comments": "", + "value": 17 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_OFS_DELTA", + "comments": "", + "value": 18 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_FSYNC_GITDIR", + "comments": "", + "value": 19 + }, + { + "type": "int", + "name": "GIT_OPT_GET_WINDOWS_SHAREMODE", + "comments": "", + "value": 20 + }, + { + "type": "int", + "name": "GIT_OPT_SET_WINDOWS_SHAREMODE", + "comments": "", + "value": 21 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "comments": "", + "value": 22 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ALLOCATOR", + "comments": "", + "value": 23 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "comments": "", + "value": 24 + }, + { + "type": "int", + "name": "GIT_OPT_GET_PACK_MAX_OBJECTS", + "comments": "", + "value": 25 + }, + { + "type": "int", + "name": "GIT_OPT_SET_PACK_MAX_OBJECTS", + "comments": "", + "value": 26 + }, + { + "type": "int", + "name": "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "comments": "", + "value": 27 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "comments": "", + "value": 28 + }, + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 29 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 30 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "comments": "", + "value": 31 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_OPT_GET_EXTENSIONS", + "comments": "", + "value": 33 + }, + { + "type": "int", + "name": "GIT_OPT_SET_EXTENSIONS", + "comments": "", + "value": 34 + }, + { + "type": "int", + "name": "GIT_OPT_GET_OWNER_VALIDATION", + "comments": "", + "value": 35 + }, + { + "type": "int", + "name": "GIT_OPT_SET_OWNER_VALIDATION", + "comments": "", + "value": 36 + }, + { + "type": "int", + "name": "GIT_OPT_GET_HOMEDIR", + "comments": "", + "value": 37 + }, + { + "type": "int", + "name": "GIT_OPT_SET_HOMEDIR", + "comments": "", + "value": 38 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", + "comments": "", + "value": 39 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", + "comments": "", + "value": 40 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SERVER_TIMEOUT", + "comments": "", + "value": 41 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SERVER_TIMEOUT", + "comments": "", + "value": 42 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_mailmap", + { + "decl": "git_mailmap", + "type": "struct", + "value": "git_mailmap", + "file": "git2/types.h", + "line": 366, + "lineto": 366, + "tdef": "typedef", + "description": " Representation of .mailmap file state. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + } + } + ], + [ + "git_merge_analysis_t", + { + "decl": [ + "GIT_MERGE_ANALYSIS_NONE", + "GIT_MERGE_ANALYSIS_NORMAL", + "GIT_MERGE_ANALYSIS_UP_TO_DATE", + "GIT_MERGE_ANALYSIS_FASTFORWARD", + "GIT_MERGE_ANALYSIS_UNBORN" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 334, + "lineto": 363, + "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", + "tdef": "typedef", + "description": " The results of `git_merge_analysis` indicate the merge opportunities.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_NONE", + "comments": "

No merge is possible. (Unused.)

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_NORMAL", + "comments": "

A "normal" merge; both HEAD and the given merge input have diverged\n from their common ancestor. The divergent commits must be merged.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_UP_TO_DATE", + "comments": "

All given merge inputs are reachable from HEAD, meaning the\n repository is up-to-date and no merge needs to be performed.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_FASTFORWARD", + "comments": "

The given merge input is a fast-forward from HEAD and no merge\n needs to be performed. Instead, the client can check out the\n given merge input.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_UNBORN", + "comments": "

The HEAD of the current repository is "unborn" and does not point to\n a valid commit. No merge can be performed, but the caller may wish\n to simply set HEAD to the target commit(s).

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_analysis", + "git_merge_analysis_for_ref" + ] + } + } + ], + [ + "git_merge_driver_source", + { + "decl": "git_merge_driver_source", + "type": "struct", + "value": "git_merge_driver_source", + "file": "git2/sys/merge.h", + "line": 41, + "lineto": 41, + "tdef": "typedef", + "description": " A merge driver source represents the file to be merged", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_merge_file_favor_t", + { + "decl": [ + "GIT_MERGE_FILE_FAVOR_NORMAL", + "GIT_MERGE_FILE_FAVOR_OURS", + "GIT_MERGE_FILE_FAVOR_THEIRS", + "GIT_MERGE_FILE_FAVOR_UNION" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 109, + "lineto": 139, + "block": "GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION", + "tdef": "typedef", + "description": " Merge file favor options for `git_merge_options` instruct the file-level\n merging functionality how to deal with conflicting regions of the files.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_NORMAL", + "comments": "

When a region of a file is changed in both branches, a conflict\n will be recorded in the index so that git_checkout can produce\n a merge file with conflict markers in the working directory.\n This is the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_OURS", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "ours" side of any conflicting\n region. The index will not record a conflict.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_THEIRS", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "theirs" side of any conflicting\n region. The index will not record a conflict.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_UNION", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain each unique line from each side,\n which has the result of combining both files. The index will not\n record a conflict.

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_merge_file_flag_t", + { + "decl": [ + "GIT_MERGE_FILE_DEFAULT", + "GIT_MERGE_FILE_STYLE_MERGE", + "GIT_MERGE_FILE_STYLE_DIFF3", + "GIT_MERGE_FILE_SIMPLIFY_ALNUM", + "GIT_MERGE_FILE_IGNORE_WHITESPACE", + "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", + "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", + "GIT_MERGE_FILE_DIFF_PATIENCE", + "GIT_MERGE_FILE_DIFF_MINIMAL", + "GIT_MERGE_FILE_STYLE_ZDIFF3", + "GIT_MERGE_FILE_ACCEPT_CONFLICTS" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 144, + "lineto": 181, + "block": "GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL\nGIT_MERGE_FILE_STYLE_ZDIFF3\nGIT_MERGE_FILE_ACCEPT_CONFLICTS", + "tdef": "typedef", + "description": " File merging flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FILE_DEFAULT", + "comments": "

Defaults

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_MERGE", + "comments": "

Create standard conflicted merge files

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_DIFF3", + "comments": "

Create diff3-style files

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_SIMPLIFY_ALNUM", + "comments": "

Condense non-alphanumeric regions for simplified diff file

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE", + "comments": "

Ignore all whitespace

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", + "comments": "

Ignore changes in amount of whitespace

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", + "comments": "

Ignore whitespace at end of line

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_DIFF_PATIENCE", + "comments": "

Use the "patience diff" algorithm

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_DIFF_MINIMAL", + "comments": "

Take extra time to find minimal diff

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_ZDIFF3", + "comments": "

Create zdiff3 ("zealous diff3")-style files

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_ACCEPT_CONFLICTS", + "comments": "

Do not produce file conflicts when common regions have\n changed; keep the conflict markers in the file and accept\n that as the merge result.

\n", + "value": 512 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_merge_file_input", + { + "decl": [ + "unsigned int version", + "const char * ptr", + "size_t size", + "const char * path", + "unsigned int mode" + ], + "type": "struct", + "value": "git_merge_file_input", + "file": "git2/merge.h", + "line": 32, + "lineto": 46, + "block": "unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode", + "tdef": "typedef", + "description": " The file inputs to `git_merge_file`. Callers should populate the\n `git_merge_file_input` structure with descriptions of the files in\n each side of the conflict for use in producing the merge file.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "const char *", + "name": "ptr", + "comments": " Pointer to the contents of the file. " + }, + { + "type": "size_t", + "name": "size", + "comments": " Size of the contents pointed to in `ptr`. " + }, + { + "type": "const char *", + "name": "path", + "comments": " File name of the conflicted file, or `NULL` to not merge the path. " + }, + { + "type": "unsigned int", + "name": "mode", + "comments": " File mode of the conflicted file, or `0` to not merge the mode. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_file", + "git_merge_file_input_init" + ] + } + } + ], + [ + "git_merge_file_options", + { + "decl": [ + "unsigned int version", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_merge_file_favor_t favor", + "uint32_t flags", + "unsigned short marker_size" + ], + "type": "struct", + "value": "git_merge_file_options", + "file": "git2/merge.h", + "line": 188, + "lineto": 218, + "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nuint32_t flags\nunsigned short marker_size", + "tdef": "typedef", + "description": " Options for merging a file", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " Label for the ancestor file side of the conflict which will be prepended\n to labels in diff3-format merge files." + }, + { + "type": "const char *", + "name": "our_label", + "comments": " Label for our file side of the conflict which will be prepended\n to labels in merge files." + }, + { + "type": "const char *", + "name": "their_label", + "comments": " Label for their file side of the conflict which will be prepended\n to labels in merge files." + }, + { + "type": "git_merge_file_favor_t", + "name": "favor", + "comments": " The file to favor in region conflicts. " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_merge_file_flag_t` above " + }, + { + "type": "unsigned short", + "name": "marker_size", + "comments": " The size of conflict markers (eg, \"\n<\n<\n<\n<\n<\n<\n<\n\"). Default is\n GIT_MERGE_CONFLICT_MARKER_SIZE. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_options_init" + ] + } + } + ], + [ + "git_merge_file_result", + { + "decl": [ + "unsigned int automergeable", + "const char * path", + "unsigned int mode", + "const char * ptr", + "size_t len" + ], + "type": "struct", + "value": "git_merge_file_result", + "file": "git2/merge.h", + "line": 238, + "lineto": 259, + "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", + "tdef": "typedef", + "description": " Information about file-level merging", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "automergeable", + "comments": " True if the output was automerged, false if the output contains\n conflict markers." + }, + { + "type": "const char *", + "name": "path", + "comments": " The path that the resultant merge file should use, or NULL if a\n filename conflict would occur." + }, + { + "type": "unsigned int", + "name": "mode", + "comments": " The mode that the resultant merge file should use. " + }, + { + "type": "const char *", + "name": "ptr", + "comments": " The contents of the merge. " + }, + { + "type": "size_t", + "name": "len", + "comments": " The length of the merge contents. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_result_free" + ] + } + } + ], + [ + "git_merge_flag_t", + { + "decl": [ + "GIT_MERGE_FIND_RENAMES", + "GIT_MERGE_FAIL_ON_CONFLICT", + "GIT_MERGE_SKIP_REUC", + "GIT_MERGE_NO_RECURSIVE", + "GIT_MERGE_VIRTUAL_BASE" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 68, + "lineto": 103, + "block": "GIT_MERGE_FIND_RENAMES\nGIT_MERGE_FAIL_ON_CONFLICT\nGIT_MERGE_SKIP_REUC\nGIT_MERGE_NO_RECURSIVE\nGIT_MERGE_VIRTUAL_BASE", + "tdef": "typedef", + "description": " Flags for `git_merge` options. A combination of these flags can be\n passed in via the `flags` value in the `git_merge_options`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FIND_RENAMES", + "comments": "

Detect renames that occur between the common ancestor and the "ours"\n side or the common ancestor and the "theirs" side. This will enable\n the ability to merge between a modified and renamed file.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FAIL_ON_CONFLICT", + "comments": "

If a conflict occurs, exit immediately instead of attempting to\n continue resolving conflicts. The merge operation will fail with\n GIT_EMERGECONFLICT and no index will be returned.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_SKIP_REUC", + "comments": "

Do not write the REUC extension on the generated index

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_NO_RECURSIVE", + "comments": "

If the commits being merged have multiple merge bases, do not build\n a recursive merge base (by merging the multiple merge bases),\n instead simply use the first base. This flag provides a similar\n merge base to git-merge-resolve.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_MERGE_VIRTUAL_BASE", + "comments": "

Treat this merge as if it is to produce the virtual base\n of a recursive merge. This will ensure that there are\n no conflicts, any conflicting regions will keep conflict\n markers in the merge result.

\n", + "value": 16 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_merge_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "unsigned int rename_threshold", + "unsigned int target_limit", + "git_diff_similarity_metric * metric", + "unsigned int recursion_limit", + "const char * default_driver", + "git_merge_file_favor_t file_favor", + "uint32_t file_flags" + ], + "type": "struct", + "value": "git_merge_options", + "file": "git2/merge.h", + "line": 264, + "lineto": 313, + "block": "unsigned int version\nuint32_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\nuint32_t file_flags", + "tdef": "typedef", + "description": " Merging options", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_merge_flag_t` above " + }, + { + "type": "unsigned int", + "name": "rename_threshold", + "comments": " Similarity to consider a file renamed (default 50). If\n `GIT_MERGE_FIND_RENAMES` is enabled, added files will be compared\n with deleted files to determine their similarity. Files that are\n more similar than the rename threshold (percentage-wise) will be\n treated as a rename." + }, + { + "type": "unsigned int", + "name": "target_limit", + "comments": " Maximum similarity sources to examine for renames (default 200).\n If the number of rename candidates (add / delete pairs) is greater\n than this value, inexact rename detection is aborted.\n\n This setting overrides the `merge.renameLimit` configuration value." + }, + { + "type": "git_diff_similarity_metric *", + "name": "metric", + "comments": " Pluggable similarity metric; pass NULL to use internal metric " + }, + { + "type": "unsigned int", + "name": "recursion_limit", + "comments": " Maximum number of times to merge common ancestors to build a\n virtual merge base when faced with criss-cross merges. When this\n limit is reached, the next ancestor will simply be used instead of\n attempting to merge it. The default is unlimited." + }, + { + "type": "const char *", + "name": "default_driver", + "comments": " Default merge driver to be used when both sides of a merge have\n changed. The default is the `text` driver." + }, + { + "type": "git_merge_file_favor_t", + "name": "file_favor", + "comments": " Flags for handling conflicting content, to be used with the standard\n (`text`) merge driver." + }, + { + "type": "uint32_t", + "name": "file_flags", + "comments": " see `git_merge_file_flag_t` above " + } + ], + "used": { + "returns": [], + "needs": [ + "git_cherrypick_commit", + "git_merge", + "git_merge_commits", + "git_merge_options_init", + "git_merge_trees", + "git_revert_commit" + ] + } + } + ], + [ + "git_merge_preference_t", + { + "decl": [ + "GIT_MERGE_PREFERENCE_NONE", + "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", + "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 368, + "lineto": 386, + "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", + "tdef": "typedef", + "description": " The user's stated preference for merges.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_NONE", + "comments": "

No configuration was found that suggests a preferred behavior for\n merge.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", + "comments": "

There is a merge.ff=false configuration setting, suggesting that\n the user does not want to allow a fast-forward merge.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", + "comments": "

There is a merge.ff=only configuration setting, suggesting that\n the user only wants fast-forward merges.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_analysis", + "git_merge_analysis_for_ref" + ] + } + } + ], + [ + "git_message_trailer", + { + "decl": [ + "const char * key", + "const char * value" + ], + "type": "struct", + "value": "git_message_trailer", + "file": "git2/message.h", + "line": 43, + "lineto": 46, + "block": "const char * key\nconst char * value", + "tdef": "typedef", + "description": " Represents a single git message trailer.", + "comments": "", + "fields": [ + { + "type": "const char *", + "name": "key", + "comments": "" + }, + { + "type": "const char *", + "name": "value", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_message_trailer_array_free", + "git_message_trailers" + ] + } + } + ], + [ + "git_message_trailer_array", + { + "decl": [ + "git_message_trailer * trailers", + "size_t count", + "char * _trailer_block" + ], + "type": "struct", + "value": "git_message_trailer_array", + "file": "git2/message.h", + "line": 54, + "lineto": 60, + "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", + "tdef": "typedef", + "description": " Represents an array of git message trailers.", + "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", + "fields": [ + { + "type": "git_message_trailer *", + "name": "trailers", + "comments": "" + }, + { + "type": "size_t", + "name": "count", + "comments": "" + }, + { + "type": "char *", + "name": "_trailer_block", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_message_trailer_array_free", + "git_message_trailers" + ] + } + } + ], + [ + "git_midx_writer", + { + "decl": "git_midx_writer", + "type": "struct", + "value": "git_midx_writer", + "file": "git2/types.h", + "line": 100, + "lineto": 100, + "tdef": "typedef", + "description": " a writer for multi-pack-index files. ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_note", + { + "decl": "git_note", + "type": "struct", + "value": "git_note", + "file": "git2/types.h", + "line": 169, + "lineto": 169, + "tdef": "typedef", + "description": " Representation of a git note ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_note_author", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_committer", + "git_note_foreach", + "git_note_free", + "git_note_id", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_message", + "git_note_next", + "git_note_read" + ] + } + } + ], + [ + "git_note_iterator", + { + "decl": "git_note_iterator", + "type": "struct", + "value": "git_note_iterator", + "file": "git2/notes.h", + "line": 35, + "lineto": 35, + "tdef": "typedef", + "description": " note iterator", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_note_commit_iterator_new", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_next" + ] + } + } + ], + [ + "git_object", + { + "decl": "git_object", + "type": "struct", + "value": "git_object", + "file": "git2/types.h", + "line": 124, + "lineto": 124, + "tdef": "typedef", + "description": " Representation of a generic object in a repository ", + "comments": "", + "used": { + "returns": [ + "git_blob_rawsize", + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_checkout_tree", + "git_describe_commit", + "git_object__size", + "git_object_dup", + "git_object_free", + "git_object_id", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_owner", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_short_id", + "git_object_type", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile", + "git_reset", + "git_reset_default", + "git_revparse_ext", + "git_revparse_single", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_lightweight", + "git_tag_peel", + "git_tag_target", + "git_tree_entry_to_object" + ] + } + } + ], + [ + "git_object_t", + { + "decl": [ + "GIT_OBJECT_ANY", + "GIT_OBJECT_INVALID", + "GIT_OBJECT_COMMIT", + "GIT_OBJECT_TREE", + "GIT_OBJECT_BLOB", + "GIT_OBJECT_TAG", + "GIT_OBJECT_OFS_DELTA", + "GIT_OBJECT_REF_DELTA" + ], + "type": "enum", + "file": "git2/types.h", + "line": 73, + "lineto": 82, + "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", + "tdef": "typedef", + "description": " Basic type (loose or packed) of any Git object. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OBJECT_ANY", + "comments": "

Object can be any of the following

\n", + "value": -2 + }, + { + "type": "int", + "name": "GIT_OBJECT_INVALID", + "comments": "

Object is invalid.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_OBJECT_COMMIT", + "comments": "

A commit object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_OBJECT_TREE", + "comments": "

A tree (directory listing) object.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_OBJECT_BLOB", + "comments": "

A file revision object.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_OBJECT_TAG", + "comments": "

An annotated tag object.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_OBJECT_OFS_DELTA", + "comments": "

A delta, base is given by an offset.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_OBJECT_REF_DELTA", + "comments": "

A delta, base is given by object id.

\n", + "value": 7 + } + ], + "used": { + "returns": [ + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_object__size", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile" + ] + } + } + ], + [ + "git_odb", + { + "decl": "git_odb", + "type": "struct", + "value": "git_odb", + "file": "git2/types.h", + "line": 85, + "lineto": 85, + "tdef": "typedef", + "description": " An open object database handle. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_indexer_new", + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_add_disk_alternate", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_foreach", + "git_odb_free", + "git_odb_get_backend", + "git_odb_num_backends", + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_refresh", + "git_odb_set_commit_graph", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write", + "git_odb_write", + "git_odb_write_multi_pack_index", + "git_odb_write_pack", + "git_repository_odb" + ] + } + } + ], + [ + "git_odb_backend", + { + "decl": "git_odb_backend", + "type": "struct", + "value": "git_odb_backend", + "file": "git2/types.h", + "line": 88, + "lineto": 88, + "tdef": "typedef", + "description": " A custom backend in an ODB ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_get_backend" + ] + } + } + ], + [ + "git_odb_backend_loose_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "int compression_level", + "unsigned int dir_mode", + "unsigned int file_mode", + "git_oid_t oid_type" + ], + "type": "struct", + "value": "git_odb_backend_loose_options", + "file": "git2/odb_backend.h", + "line": 93, + "lineto": 119, + "block": "unsigned int version\nuint32_t flags\nint compression_level\nunsigned int dir_mode\nunsigned int file_mode\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a loose object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of the `git_odb_backend_loose_flag_t` types. " + }, + { + "type": "int", + "name": "compression_level", + "comments": " zlib compression level to use (0-9), where 1 is the fastest\n at the expense of larger files, and 9 produces the best\n compression at the expense of speed. 0 indicates that no\n compression should be performed. -1 is the default (currently\n optimizing for speed)." + }, + { + "type": "unsigned int", + "name": "dir_mode", + "comments": " Permissions to use creating a directory or 0 for defaults " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " Permissions to use creating a file or 0 for defaults " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_odb_backend_pack_options", + { + "decl": [ + "unsigned int version", + "git_oid_t oid_type" + ], + "type": "struct", + "value": "git_odb_backend_pack_options", + "file": "git2/odb_backend.h", + "line": 28, + "lineto": 36, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a packfile object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_odb_expand_id", + { + "decl": [ + "git_oid id", + "unsigned short length", + "git_object_t type" + ], + "type": "struct", + "value": "git_odb_expand_id", + "file": "git2/odb.h", + "line": 230, + "lineto": 245, + "block": "git_oid id\nunsigned short length\ngit_object_t type", + "tdef": "typedef", + "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", + "comments": "", + "fields": [ + { + "type": "git_oid", + "name": "id", + "comments": " The object ID to expand " + }, + { + "type": "unsigned short", + "name": "length", + "comments": " The length of the object ID (in nibbles, or packets of 4 bits; the\n number of hex characters)" + }, + { + "type": "git_object_t", + "name": "type", + "comments": " The (optional) type of the object to search for; leave as `0` or set\n to `GIT_OBJECT_ANY` to query for any object matching the ID." + } + ], + "used": { + "returns": [], + "needs": [ + "git_odb_expand_ids" + ] + } + } + ], + [ + "git_odb_lookup_flags_t", + { + "decl": [ + "GIT_ODB_LOOKUP_NO_REFRESH" + ], + "type": "enum", + "file": "git2/odb.h", + "line": 26, + "lineto": 34, + "block": "GIT_ODB_LOOKUP_NO_REFRESH", + "tdef": "typedef", + "description": " Flags controlling the behavior of ODB lookup operations ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ODB_LOOKUP_NO_REFRESH", + "comments": "

Don't call git_odb_refresh if the lookup fails. Useful when doing\n a batch of lookup operations for objects that may legitimately not\n exist. When using this flag, you may wish to manually call\n git_odb_refresh before processing a batch of objects.

\n", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_odb_object", + { + "decl": "git_odb_object", + "type": "struct", + "value": "git_odb_object", + "file": "git2/types.h", + "line": 91, + "lineto": 91, + "tdef": "typedef", + "description": " An object read from the ODB ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_read", + "git_odb_read_prefix" + ] + } + } + ], + [ + "git_odb_options", + { + "decl": [ + "unsigned int version", + "git_oid_t oid_type" + ], + "type": "struct", + "value": "git_odb_options", + "file": "git2/odb.h", + "line": 42, + "lineto": 50, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a loose object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_odb_stream", + { + "decl": "git_odb_stream", + "type": "struct", + "value": "git_odb_stream", + "file": "git2/types.h", + "line": 94, + "lineto": 94, + "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_object_size_t declared_size\ngit_object_size_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", + "tdef": "typedef", + "description": " A stream to read/write from the ODB ", + "comments": "", + "fields": [ + { + "type": "git_odb_backend *", + "name": "backend", + "comments": "" + }, + { + "type": "unsigned int", + "name": "mode", + "comments": "" + }, + { + "type": "void *", + "name": "hash_ctx", + "comments": "" + }, + { + "type": "git_object_size_t", + "name": "declared_size", + "comments": "" + }, + { + "type": "git_object_size_t", + "name": "received_bytes", + "comments": "" + }, + { + "type": "int (*)(git_odb_stream *, char *, size_t)", + "name": "read", + "comments": "" + }, + { + "type": "int (*)(git_odb_stream *, const char *, size_t)", + "name": "write", + "comments": "" + }, + { + "type": "int (*)(git_odb_stream *, const git_oid *)", + "name": "finalize_write", + "comments": "" + }, + { + "type": "void (*)(git_odb_stream *)", + "name": "free", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write" + ] + } + } + ], + [ + "git_odb_stream_t", + { + "decl": [ + "GIT_STREAM_RDONLY", + "GIT_STREAM_WRONLY", + "GIT_STREAM_RW" + ], + "type": "enum", + "file": "git2/odb_backend.h", + "line": 155, + "lineto": 159, + "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", + "tdef": "typedef", + "description": " Streaming mode ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STREAM_RDONLY", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STREAM_WRONLY", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STREAM_RW", + "comments": "", + "value": 6 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_odb_writepack", + { + "decl": "git_odb_writepack", + "type": "struct", + "value": "git_odb_writepack", + "file": "git2/types.h", + "line": 97, + "lineto": 97, + "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", + "tdef": "typedef", + "description": " A stream to write a packfile to the ODB ", + "comments": "", + "fields": [ + { + "type": "git_odb_backend *", + "name": "backend", + "comments": "" + }, + { + "type": "int (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *)", + "name": "append", + "comments": "" + }, + { + "type": "int (*)(git_odb_writepack *, git_indexer_progress *)", + "name": "commit", + "comments": "" + }, + { + "type": "void (*)(git_odb_writepack *)", + "name": "free", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_odb_write_pack" + ] + } + } + ], + [ + "git_oid", + { + "decl": [ + "unsigned char [20] id" + ], + "type": "struct", + "value": "git_oid", + "file": "git2/oid.h", + "line": 99, + "lineto": 108, + "block": "unsigned char [20] id", + "tdef": "typedef", + "description": " Unique identity of any object (commit, tree, blob, tag). ", + "comments": "", + "fields": [ + { + "type": "unsigned char [20]", + "name": "id", + "comments": " raw binary formatted id " + } + ], + "used": { + "returns": [ + "git_annotated_commit_id", + "git_blob_id", + "git_commit_id", + "git_commit_parent_id", + "git_commit_tree_id", + "git_index_checksum", + "git_indexer_hash", + "git_note_id", + "git_object_id", + "git_odb_object_id", + "git_oid_shorten_new", + "git_packbuilder_hash", + "git_rebase_onto_id", + "git_rebase_orig_head_id", + "git_reference_target", + "git_reference_target_peel", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_repository_oid_type", + "git_submodule_head_id", + "git_submodule_index_id", + "git_submodule_wd_id", + "git_tag_id", + "git_tag_target_id", + "git_tree_entry_id", + "git_tree_id" + ], + "needs": [ + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_lookup", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_commit_amend", + "git_commit_create", + "git_commit_create_cb", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_extract_signature", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_diff_patchid", + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any", + "git_index_write_tree", + "git_index_write_tree_to", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_note_commit_create", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_create", + "git_note_foreach_cb", + "git_note_next", + "git_note_read", + "git_note_remove", + "git_object_lookup", + "git_object_lookup_prefix", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_foreach_cb", + "git_odb_open_rstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_stream_finalize_write", + "git_odb_write", + "git_oid_cmp", + "git_oid_cpy", + "git_oid_equal", + "git_oid_fmt", + "git_oid_is_zero", + "git_oid_ncmp", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_strcmp", + "git_oid_streq", + "git_oid_tostr", + "git_oid_tostr_s", + "git_oidarray_dispose", + "git_oidarray_free", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_rebase_commit", + "git_reference_create", + "git_reference_create_matching", + "git_reference_name_to_id", + "git_reference_set_target", + "git_reflog_append", + "git_repository_fetchhead_foreach_cb", + "git_repository_hashfile", + "git_repository_mergehead_foreach_cb", + "git_repository_set_head_detached", + "git_revwalk_hide", + "git_revwalk_hide_cb", + "git_revwalk_next", + "git_revwalk_push", + "git_stash_cb", + "git_stash_save", + "git_stash_save_with_opts", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_foreach_cb", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_transaction_set_target", + "git_tree_create_updated", + "git_tree_entry_byid", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_treebuilder_insert", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + } + } + ], + [ + "git_oid_shorten", + { + "decl": "git_oid_shorten", + "type": "struct", + "value": "git_oid_shorten", + "file": "git2/oid.h", + "line": 320, + "lineto": 320, + "tdef": "typedef", + "description": " OID Shortener object", + "comments": "", + "used": { + "returns": [ + "git_oid_shorten_new" + ], + "needs": [ + "git_oid_shorten_add", + "git_oid_shorten_free" + ] + } + } + ], + [ + "git_oid_t", + { + "decl": [ + "GIT_OID_SHA1" + ], + "type": "enum", + "file": "git2/oid.h", + "line": 24, + "lineto": 33, + "block": "GIT_OID_SHA1", + "tdef": "typedef", + "description": " The type of object id. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OID_SHA1", + "comments": "

SHA1

\n", + "value": 1 + } + ], + "used": { + "returns": [ + "git_repository_oid_type" + ], + "needs": [] + } + } + ], + [ + "git_oidarray", + { + "decl": [ + "git_oid * ids", + "size_t count" + ], + "type": "struct", + "value": "git_oidarray", + "file": "git2/oidarray.h", + "line": 16, + "lineto": 19, + "block": "git_oid * ids\nsize_t count", + "tdef": "typedef", + "description": " Array of object ids ", + "comments": "", + "fields": [ + { + "type": "git_oid *", + "name": "ids", + "comments": "" + }, + { + "type": "size_t", + "name": "count", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_bases", + "git_merge_bases_many", + "git_oidarray_dispose", + "git_oidarray_free" + ] + } + } + ], + [ + "git_packbuilder", + { + "decl": "git_packbuilder", + "type": "struct", + "value": "git_packbuilder", + "file": "git2/types.h", + "line": 172, + "lineto": 172, + "tdef": "typedef", + "description": " Representation of a git packbuilder ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_packbuilder_foreach", + "git_packbuilder_free", + "git_packbuilder_hash", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_walk", + "git_packbuilder_name", + "git_packbuilder_new", + "git_packbuilder_object_count", + "git_packbuilder_set_callbacks", + "git_packbuilder_set_threads", + "git_packbuilder_write", + "git_packbuilder_write_buf", + "git_packbuilder_written" + ] + } + } + ], + [ + "git_packbuilder_stage_t", + { + "decl": [ + "GIT_PACKBUILDER_ADDING_OBJECTS", + "GIT_PACKBUILDER_DELTAFICATION" + ], + "type": "enum", + "file": "git2/pack.h", + "line": 52, + "lineto": 55, + "block": "GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION", + "tdef": "typedef", + "description": " Stages that are reported by the packbuilder progress callback.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PACKBUILDER_ADDING_OBJECTS", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PACKBUILDER_DELTAFICATION", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_patch", + { + "decl": "git_patch", + "type": "struct", + "value": "git_patch", + "file": "git2/patch.h", + "line": 29, + "lineto": 29, + "tdef": "typedef", + "description": " The diff patch is used to store all the text diffs for a delta.", + "comments": "

You can easily loop over the content of patches and get information about them.

\n", + "used": { + "returns": [], + "needs": [ + "git_patch_free", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_delta", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_line_stats", + "git_patch_num_hunks", + "git_patch_num_lines_in_hunk", + "git_patch_owner", + "git_patch_print", + "git_patch_size", + "git_patch_to_buf" + ] + } + } + ], + [ + "git_path_fs", + { + "decl": [ + "GIT_PATH_FS_GENERIC", + "GIT_PATH_FS_NTFS", + "GIT_PATH_FS_HFS" + ], + "type": "enum", + "file": "git2/sys/path.h", + "line": 34, + "lineto": 41, + "block": "GIT_PATH_FS_GENERIC\nGIT_PATH_FS_NTFS\nGIT_PATH_FS_HFS", + "tdef": "typedef", + "description": " The kinds of checks to perform according to which filesystem we are trying to\n protect.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PATH_FS_GENERIC", + "comments": "

Do both NTFS- and HFS-specific checks

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATH_FS_NTFS", + "comments": "

Do NTFS-specific checks only

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATH_FS_HFS", + "comments": "

Do HFS-specific checks only

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_pathspec", + { + "decl": "git_pathspec", + "type": "struct", + "value": "git_pathspec", + "file": "git2/pathspec.h", + "line": 20, + "lineto": 20, + "tdef": "typedef", + "description": " Compiled pathspec", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_pathspec_free", + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir", + "git_pathspec_matches_path", + "git_pathspec_new" + ] + } + } + ], + [ + "git_pathspec_flag_t", + { + "decl": [ + "GIT_PATHSPEC_DEFAULT", + "GIT_PATHSPEC_IGNORE_CASE", + "GIT_PATHSPEC_USE_CASE", + "GIT_PATHSPEC_NO_GLOB", + "GIT_PATHSPEC_NO_MATCH_ERROR", + "GIT_PATHSPEC_FIND_FAILURES", + "GIT_PATHSPEC_FAILURES_ONLY" + ], + "type": "enum", + "file": "git2/pathspec.h", + "line": 30, + "lineto": 73, + "block": "GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY", + "tdef": "typedef", + "description": " Options controlling how pathspec match should be executed", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PATHSPEC_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_IGNORE_CASE", + "comments": "

GIT_PATHSPEC_IGNORE_CASE forces match to ignore case; otherwise\n match will use native case sensitivity of platform filesystem

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_USE_CASE", + "comments": "

GIT_PATHSPEC_USE_CASE forces case sensitive match; otherwise\n match will use native case sensitivity of platform filesystem

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_NO_GLOB", + "comments": "

GIT_PATHSPEC_NO_GLOB disables glob patterns and just uses simple\n string comparison for matching

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_NO_MATCH_ERROR", + "comments": "

GIT_PATHSPEC_NO_MATCH_ERROR means the match functions return error\n code GIT_ENOTFOUND if no matches are found; otherwise no matches is\n still success (return 0) but git_pathspec_match_list_entrycount\n will indicate 0 matches.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_FIND_FAILURES", + "comments": "

GIT_PATHSPEC_FIND_FAILURES means that the git_pathspec_match_list\n should track which patterns matched which files so that at the end of\n the match we can identify patterns that did not match any files.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_FAILURES_ONLY", + "comments": "

GIT_PATHSPEC_FAILURES_ONLY means that the git_pathspec_match_list\n does not need to keep the actual matching filenames. Use this to\n just test if there were any matches at all or in combination with\n GIT_PATHSPEC_FIND_FAILURES to validate a pathspec.

\n", + "value": 32 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_pathspec_match_list", + { + "decl": "git_pathspec_match_list", + "type": "struct", + "value": "git_pathspec_match_list", + "file": "git2/pathspec.h", + "line": 25, + "lineto": 25, + "tdef": "typedef", + "description": " List of filenames matching a pathspec", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir" + ] + } + } + ], + [ + "git_proxy_options", + { + "decl": [ + "unsigned int version", + "git_proxy_t type", + "const char * url", + "git_credential_acquire_cb credentials", + "git_transport_certificate_check_cb certificate_check", + "void * payload" + ], + "type": "struct", + "value": "git_proxy_options", + "file": "git2/proxy.h", + "line": 44, + "lineto": 79, + "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", + "tdef": "typedef", + "description": " Options for connecting through a proxy", + "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_proxy_t", + "name": "type", + "comments": " The type of proxy to use, by URL, auto-detect." + }, + { + "type": "const char *", + "name": "url", + "comments": " The URL of the proxy." + }, + { + "type": "git_credential_acquire_cb", + "name": "credentials", + "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." + }, + { + "type": "git_transport_certificate_check_cb", + "name": "certificate_check", + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." + }, + { + "type": "void *", + "name": "payload", + "comments": " Payload to be provided to the credentials and certificate\n check callbacks." + } + ], + "used": { + "returns": [], + "needs": [ + "git_proxy_options_init", + "git_remote_connect" + ] + } + } + ], + [ + "git_proxy_t", + { + "decl": [ + "GIT_PROXY_NONE", + "GIT_PROXY_AUTO", + "GIT_PROXY_SPECIFIED" + ], + "type": "enum", + "file": "git2/proxy.h", + "line": 20, + "lineto": 36, + "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", + "tdef": "typedef", + "description": " The type of proxy to use.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PROXY_NONE", + "comments": "

Do not attempt to connect through a proxy

\n\n

If built against libcurl, it itself may attempt to connect\n to a proxy if the environment variables specify it.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PROXY_AUTO", + "comments": "

Try to auto-detect the proxy from the git configuration.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PROXY_SPECIFIED", + "comments": "

Connect via the URL given in the options

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_push", + { + "decl": "git_push", + "type": "struct", + "value": "git_push", + "file": "git2/types.h", + "line": 253, + "lineto": 253, + "tdef": "typedef", + "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_push_negotiation", + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + } + } + ], + [ + "git_push_options", + { + "decl": [ + "unsigned int version", + "unsigned int pb_parallelism", + "git_remote_callbacks callbacks", + "git_proxy_options proxy_opts", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers" + ], + "type": "struct", + "value": "git_push_options", + "file": "git2/remote.h", + "line": 799, + "lineto": 833, + "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", + "tdef": "typedef", + "description": " Controls the behavior of a git_push object.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "unsigned int", + "name": "pb_parallelism", + "comments": " If the transport being used to push to the remote requires the creation\n of a pack file, this controls the number of worker threads used by\n the packbuilder when creating that pack file to be sent to the remote.\n\n If set to 0, the packbuilder will auto-detect the number of threads\n to create. The default value is 1." + }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this push operation" + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " Proxy options to use, by default no proxy is used." + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra headers for this push operation" + } + ], + "used": { + "returns": [], + "needs": [ + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + } + } + ], + [ + "git_push_update", + { + "decl": [ + "char * src_refname", + "char * dst_refname", + "git_oid src", + "git_oid dst" + ], + "type": "struct", + "value": "git_push_update", + "file": "git2/remote.h", + "line": 468, + "lineto": 485, + "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", + "tdef": "typedef", + "description": " Represents an update which will be performed on the remote during push", + "comments": "", + "fields": [ + { + "type": "char *", + "name": "src_refname", + "comments": " The source name of the reference" + }, + { + "type": "char *", + "name": "dst_refname", + "comments": " The name of the reference to update on the server" + }, + { + "type": "git_oid", + "name": "src", + "comments": " The current target of the reference" + }, + { + "type": "git_oid", + "name": "dst", + "comments": " The new target for the reference" + } + ], + "used": { + "returns": [], + "needs": [ + "git_push_negotiation" + ] + } + } + ], + [ + "git_rebase", + { + "decl": "git_rebase", + "type": "struct", + "value": "git_rebase", + "file": "git2/types.h", + "line": 204, + "lineto": 204, + "tdef": "typedef", + "description": " Representation of a rebase ", + "comments": "", + "used": { + "returns": [ + "git_rebase_operation_byindex" + ], + "needs": [ + "git_rebase_abort", + "git_rebase_commit", + "git_rebase_finish", + "git_rebase_free", + "git_rebase_init", + "git_rebase_inmemory_index", + "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", + "git_rebase_open", + "git_rebase_operation_byindex", + "git_rebase_operation_current", + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" + ] + } + } + ], + [ + "git_rebase_operation", + { + "decl": [ + "git_rebase_operation_t type", + "const git_oid id", + "const char * exec" + ], + "type": "struct", + "value": "git_rebase_operation", + "file": "git2/rebase.h", + "line": 172, + "lineto": 187, + "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", + "tdef": "typedef", + "description": " A rebase operation", + "comments": "

Describes a single instruction/operation to be performed during the rebase.

\n", + "fields": [ + { + "type": "git_rebase_operation_t", + "name": "type", + "comments": " The type of rebase operation. " + }, + { + "type": "const git_oid", + "name": "id", + "comments": " The commit ID being cherry-picked. This will be populated for\n all operations except those of type `GIT_REBASE_OPERATION_EXEC`." + }, + { + "type": "const char *", + "name": "exec", + "comments": " The executable the user has requested be run. This will only\n be populated for operations of type `GIT_REBASE_OPERATION_EXEC`." + } + ], + "used": { + "returns": [ + "git_rebase_operation_byindex" + ], + "needs": [ + "git_rebase_next" + ] + } + } + ], + [ + "git_rebase_operation_t", + { + "decl": [ + "GIT_REBASE_OPERATION_PICK", + "GIT_REBASE_OPERATION_REWORD", + "GIT_REBASE_OPERATION_EDIT", + "GIT_REBASE_OPERATION_SQUASH", + "GIT_REBASE_OPERATION_FIXUP", + "GIT_REBASE_OPERATION_EXEC" + ], + "type": "enum", + "file": "git2/rebase.h", + "line": 120, + "lineto": 156, + "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", + "tdef": "typedef", + "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REBASE_OPERATION_PICK", + "comments": "

The given commit is to be cherry-picked. The client should commit\n the changes and continue if there are no conflicts.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_REWORD", + "comments": "

The given commit is to be cherry-picked, but the client should prompt\n the user to provide an updated commit message.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_EDIT", + "comments": "

The given commit is to be cherry-picked, but the client should stop\n to allow the user to edit the changes before committing them.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_SQUASH", + "comments": "

The given commit is to be squashed into the previous commit. The\n commit message will be merged with the previous message.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_FIXUP", + "comments": "

The given commit is to be squashed into the previous commit. The\n commit message from this commit will be discarded.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_EXEC", + "comments": "

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n", + "value": 5 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_rebase_options", + { + "decl": [ + "unsigned int version", + "int quiet", + "int inmemory", + "const char * rewrite_notes_ref", + "git_merge_options merge_options", + "git_checkout_options checkout_options", + "git_commit_create_cb commit_create_cb", + "int (*)(git_buf *, git_buf *, const char *, void *) signing_cb", + "void * payload" + ], + "type": "struct", + "value": "git_rebase_options", + "file": "git2/rebase.h", + "line": 32, + "lineto": 115, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_create_cb commit_create_cb\nint (*)(git_buf *, git_buf *, const char *, void *) signing_cb\nvoid * payload", + "tdef": "typedef", + "description": " Rebase options", + "comments": "

Use to tell the rebase machinery how to operate.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "int", + "name": "quiet", + "comments": " Used by `git_rebase_init`, this will instruct other clients working\n on this rebase that you want a quiet rebase experience, which they\n may choose to provide in an application-specific manner. This has no\n effect upon libgit2 directly, but is provided for interoperability\n between Git tools." + }, + { + "type": "int", + "name": "inmemory", + "comments": " Used by `git_rebase_init`, this will begin an in-memory rebase,\n which will allow callers to step through the rebase operations and\n commit the rebased changes, but will not rewind HEAD or update the\n repository to be in a rebasing state. This will not interfere with\n the working directory (if there is one)." + }, + { + "type": "const char *", + "name": "rewrite_notes_ref", + "comments": " Used by `git_rebase_finish`, this is the name of the notes reference\n used to rewrite notes for rebased commits when finishing the rebase;\n if NULL, the contents of the configuration option `notes.rewriteRef`\n is examined, unless the configuration option `notes.rewrite.rebase`\n is set to false. If `notes.rewriteRef` is also NULL, notes will\n not be rewritten." + }, + { + "type": "git_merge_options", + "name": "merge_options", + "comments": " Options to control how trees are merged during `git_rebase_next`." + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." + }, + { + "type": "git_commit_create_cb", + "name": "commit_create_cb", + "comments": " Optional callback that allows users to override commit\n creation in `git_rebase_commit`. If specified, users can\n create their own commit and provide the commit ID, which\n may be useful for signing commits or otherwise customizing\n the commit creation.\n\n If this callback returns `GIT_PASSTHROUGH`, then\n `git_rebase_commit` will continue to create the commit." + }, + { + "type": "int (*)(git_buf *, git_buf *, const char *, void *)", + "name": "signing_cb", + "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n\n This field is only used when performing git_rebase_commit.\n\n This callback is not invoked if a `git_commit_create_cb` is\n specified.\n\n This callback is deprecated; users should provide a\n creation callback as `commit_create_cb` that produces a\n commit buffer, signs it, and commits it." + }, + { + "type": "void *", + "name": "payload", + "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." + } + ], + "used": { + "returns": [], + "needs": [ + "git_rebase_init", + "git_rebase_open", + "git_rebase_options_init" + ] + } + } + ], + [ + "git_refdb", + { + "decl": "git_refdb", + "type": "struct", + "value": "git_refdb", + "file": "git2/types.h", + "line": 103, + "lineto": 103, + "tdef": "typedef", + "description": " An open refs database handle. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_refdb_compress", + "git_refdb_free", + "git_refdb_new", + "git_refdb_open", + "git_repository_refdb" + ] + } + } + ], + [ + "git_refdb_backend", + { + "decl": "git_refdb_backend", + "type": "struct", + "value": "git_refdb_backend", + "file": "git2/types.h", + "line": 106, + "lineto": 106, + "tdef": "typedef", + "description": " A custom backend for refs ", + "comments": "", + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_reference", + { + "decl": "git_reference", + "type": "struct", + "value": "git_reference", + "file": "git2/types.h", + "line": 189, + "lineto": 189, + "tdef": "typedef", + "description": " In-memory representation of a reference. ", + "comments": "", + "used": { + "returns": [ + "git_reference_type" + ], + "needs": [ + "git_annotated_commit_from_ref", + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_is_checked_out", + "git_branch_is_head", + "git_branch_lookup", + "git_branch_move", + "git_branch_name", + "git_branch_next", + "git_branch_set_upstream", + "git_branch_upstream", + "git_merge_analysis_for_ref", + "git_reference_cmp", + "git_reference_create", + "git_reference_create_matching", + "git_reference_delete", + "git_reference_dup", + "git_reference_dwim", + "git_reference_foreach", + "git_reference_foreach_cb", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_free", + "git_reference_is_branch", + "git_reference_is_note", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_lookup", + "git_reference_name", + "git_reference_next", + "git_reference_next_name", + "git_reference_owner", + "git_reference_peel", + "git_reference_rename", + "git_reference_resolve", + "git_reference_set_target", + "git_reference_shorthand", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_set_target", + "git_reference_symbolic_target", + "git_reference_target", + "git_reference_target_peel", + "git_reference_type", + "git_repository_head", + "git_repository_head_for_worktree", + "git_revparse_ext" + ] + } + } + ], + [ + "git_reference_format_t", + { + "decl": [ + "GIT_REFERENCE_FORMAT_NORMAL", + "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND" + ], + "type": "enum", + "file": "git2/refs.h", + "line": 661, + "lineto": 690, + "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "tdef": "typedef", + "description": " Normalization options for reference lookup", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_NORMAL", + "comments": "

No particular normalization.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "comments": "

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "comments": "

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "comments": "

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_reference_iterator", + { + "decl": "git_reference_iterator", + "type": "struct", + "value": "git_reference_iterator", + "file": "git2/types.h", + "line": 192, + "lineto": 192, + "tdef": "typedef", + "description": " Iterator for references ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_next", + "git_reference_next_name" + ] + } + } + ], + [ + "git_reference_t", + { + "decl": [ + "GIT_REFERENCE_INVALID", + "GIT_REFERENCE_DIRECT", + "GIT_REFERENCE_SYMBOLIC", + "GIT_REFERENCE_ALL" + ], + "type": "enum", + "file": "git2/types.h", + "line": 207, + "lineto": 212, + "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", + "tdef": "typedef", + "description": " Basic type of any Git reference. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REFERENCE_INVALID", + "comments": "

Invalid reference

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REFERENCE_DIRECT", + "comments": "

A reference that points at an object id

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REFERENCE_SYMBOLIC", + "comments": "

A reference that points at another reference

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REFERENCE_ALL", + "comments": "", + "value": 3 + } + ], + "used": { + "returns": [ + "git_reference_type" + ], + "needs": [] + } + } + ], + [ + "git_reflog", + { + "decl": "git_reflog", + "type": "struct", + "value": "git_reflog", + "file": "git2/types.h", + "line": 166, + "lineto": 166, + "tdef": "typedef", + "description": " Representation of a reference log ", + "comments": "", + "used": { + "returns": [ + "git_reflog_entry_byindex" + ], + "needs": [ + "git_reflog_append", + "git_reflog_drop", + "git_reflog_entry_byindex", + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message", + "git_reflog_entrycount", + "git_reflog_free", + "git_reflog_read", + "git_reflog_write", + "git_transaction_set_reflog" + ] + } + } + ], + [ + "git_reflog_entry", + { + "decl": "git_reflog_entry", + "type": "struct", + "value": "git_reflog_entry", + "file": "git2/types.h", + "line": 163, + "lineto": 163, + "tdef": "typedef", + "description": " Representation of a reference log entry ", + "comments": "", + "used": { + "returns": [ + "git_reflog_entry_byindex" + ], + "needs": [ + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message" + ] + } + } + ], + [ + "git_refspec", + { + "decl": "git_refspec", + "type": "struct", + "value": "git_refspec", + "file": "git2/types.h", + "line": 235, + "lineto": 235, + "tdef": "typedef", + "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", + "comments": "", + "used": { + "returns": [ + "git_remote_get_refspec" + ], + "needs": [ + "git_refspec_direction", + "git_refspec_dst", + "git_refspec_dst_matches", + "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", + "git_refspec_rtransform", + "git_refspec_src", + "git_refspec_src_matches", + "git_refspec_string", + "git_refspec_transform" + ] + } + } + ], + [ + "git_remote", + { + "decl": "git_remote", + "type": "struct", + "value": "git_remote", + "file": "git2/types.h", + "line": 241, + "lineto": 241, + "tdef": "typedef", + "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entries).", + "comments": "", + "used": { + "returns": [ + "git_remote_autotag" + ], + "needs": [ + "git_headlist_cb", + "git_remote_autotag", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_connect_options_init", + "git_remote_connected", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_cb", + "git_remote_create_detached", + "git_remote_create_options_init", + "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", + "git_remote_default_branch", + "git_remote_disconnect", + "git_remote_download", + "git_remote_dup", + "git_remote_fetch", + "git_remote_free", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_get_refspec", + "git_remote_init_callbacks", + "git_remote_lookup", + "git_remote_ls", + "git_remote_name", + "git_remote_owner", + "git_remote_prune", + "git_remote_prune_refs", + "git_remote_push", + "git_remote_pushurl", + "git_remote_ready_cb", + "git_remote_refspec_count", + "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", + "git_remote_stats", + "git_remote_stop", + "git_remote_update_tips", + "git_remote_upload", + "git_remote_url", + "git_transport_cb" + ] + } + } + ], + [ + "git_remote_autotag_option_t", + { + "decl": [ + "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", + "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", + "GIT_REMOTE_DOWNLOAD_TAGS_NONE", + "GIT_REMOTE_DOWNLOAD_TAGS_ALL" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 685, + "lineto": 703, + "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", + "tdef": "typedef", + "description": " Automatic tag following option", + "comments": "

Lets us select the --tags option to use.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", + "comments": "

Use the setting from the configuration.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", + "comments": "

Ask the server for tags pointing to objects we're already\n downloading.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_NONE", + "comments": "

Don't ask for any tags beyond the refspecs.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_ALL", + "comments": "

Ask for the all the tags.

\n", + "value": 3 + } + ], + "used": { + "returns": [ + "git_remote_autotag" + ], + "needs": [ + "git_remote_set_autotag", + "git_remote_update_tips" + ] + } + } + ], + [ + "git_remote_callbacks", + { + "decl": [ + "unsigned int version", + "git_transport_message_cb sideband_progress", + "int (*)(git_remote_completion_t, void *) completion", + "git_credential_acquire_cb credentials", + "git_transport_certificate_check_cb certificate_check", + "git_indexer_progress_cb transfer_progress", + "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", + "git_packbuilder_progress pack_progress", + "git_push_transfer_progress_cb push_transfer_progress", + "git_push_update_reference_cb push_update_reference", + "git_push_negotiation push_negotiation", + "git_transport_cb transport", + "git_remote_ready_cb remote_ready", + "void * payload", + "git_url_resolve_cb resolve_url" + ], + "type": "struct", + "value": "git_remote_callbacks", + "file": "git2/remote.h", + "line": 546, + "lineto": 647, + "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url", + "tdef": null, + "description": " The callback settings structure", + "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "git_transport_message_cb", + "name": "sideband_progress", + "comments": " Textual progress from the remote. Text send over the\n progress side-band will be passed to this function (this is\n the 'counting objects' output)." + }, + { + "type": "int (*)(git_remote_completion_t, void *)", + "name": "completion", + "comments": "" + }, + { + "type": "git_credential_acquire_cb", + "name": "credentials", + "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." + }, + { + "type": "git_transport_certificate_check_cb", + "name": "certificate_check", + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." + }, + { + "type": "git_indexer_progress_cb", + "name": "transfer_progress", + "comments": " During the download of new data, this will be regularly\n called with the current count of progress done by the\n indexer." + }, + { + "type": "int (*)(const char *, const git_oid *, const git_oid *, void *)", + "name": "update_tips", + "comments": "" + }, + { + "type": "git_packbuilder_progress", + "name": "pack_progress", + "comments": " Function to call with progress information during pack\n building. Be aware that this is called inline with pack\n building operations, so performance may be affected." + }, + { + "type": "git_push_transfer_progress_cb", + "name": "push_transfer_progress", + "comments": " Function to call with progress information during the\n upload portion of a push. Be aware that this is called\n inline with pack building operations, so performance may be\n affected." + }, + { + "type": "git_push_update_reference_cb", + "name": "push_update_reference", + "comments": " See documentation of git_push_update_reference_cb" + }, + { + "type": "git_push_negotiation", + "name": "push_negotiation", + "comments": " Called once between the negotiation step and the upload. It\n provides information about what updates will be performed." + }, + { + "type": "git_transport_cb", + "name": "transport", + "comments": " Create the transport to use for this operation. Leave NULL\n to auto-detect." + }, + { + "type": "git_remote_ready_cb", + "name": "remote_ready", + "comments": " Callback when the remote is ready to connect." + }, + { + "type": "void *", + "name": "payload", + "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." + }, + { + "type": "git_url_resolve_cb", + "name": "resolve_url", + "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead.\n\n This callback is deprecated; users should use\n git_remote_ready_cb and configure the instance URL instead." + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_connect", + "git_remote_init_callbacks", + "git_remote_prune", + "git_remote_update_tips" + ] + } + } + ], + [ + "git_remote_completion_t", + { + "decl": [ + "GIT_REMOTE_COMPLETION_DOWNLOAD", + "GIT_REMOTE_COMPLETION_INDEXING", + "GIT_REMOTE_COMPLETION_ERROR" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 452, + "lineto": 456, + "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", + "tdef": "typedef", + "description": " Argument to the completion callback which tells it which operation\n finished.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_DOWNLOAD", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_INDEXING", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_ERROR", + "comments": "", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_remote_connect_options", + { + "decl": [ + "unsigned int version", + "git_remote_callbacks callbacks", + "git_proxy_options proxy_opts", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers" + ], + "type": "struct", + "value": "git_remote_connect_options", + "file": "git2/remote.h", + "line": 859, + "lineto": 877, + "block": "unsigned int version\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", + "tdef": "typedef", + "description": " Remote creation options structure", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this connection " + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " HTTP Proxy settings " + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra HTTP headers to use in this connection " + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_connect_ext", + "git_remote_connect_options_init" + ] + } + } + ], + [ + "git_remote_create_flags", + { + "decl": [ + "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 71, + "lineto": 77, + "block": "GIT_REMOTE_CREATE_SKIP_INSTEADOF\nGIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "tdef": "typedef", + "description": " Remote creation options flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "comments": "

Ignore the repository apply.insteadOf configuration

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "comments": "

Don't build a fetchspec from the name if none is set

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_remote_create_options", + { + "decl": [ + "unsigned int version", + "git_repository * repository", + "const char * name", + "const char * fetchspec", + "unsigned int flags" + ], + "type": "struct", + "value": "git_remote_create_options", + "file": "git2/remote.h", + "line": 86, + "lineto": 106, + "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", + "tdef": "typedef", + "description": " Remote creation options structure", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_repository *", + "name": "repository", + "comments": " The repository that should own the remote.\n Setting this to NULL results in a detached remote." + }, + { + "type": "const char *", + "name": "name", + "comments": " The remote's name.\n Setting this to NULL results in an in-memory/anonymous remote." + }, + { + "type": "const char *", + "name": "fetchspec", + "comments": " The fetchspec the remote should use. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Additional flags for the remote. See git_remote_create_flags. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_create_options_init", + "git_remote_create_with_opts" + ] + } + } + ], + [ + "git_remote_head", + { + "decl": [ + "int local", + "git_oid oid", + "git_oid loid", + "char * name", + "char * symref_target" + ], + "type": "struct", + "value": "git_remote_head", + "file": "git2/net.h", + "line": 40, + "lineto": 50, + "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", + "tdef": null, + "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "local", + "comments": "" + }, + { + "type": "git_oid", + "name": "oid", + "comments": "" + }, + { + "type": "git_oid", + "name": "loid", + "comments": "" + }, + { + "type": "char *", + "name": "name", + "comments": "" + }, + { + "type": "char *", + "name": "symref_target", + "comments": " If the server send a symref mapping for this ref, this will\n point to the target." + } + ], + "used": { + "returns": [], + "needs": [ + "git_headlist_cb", + "git_remote_ls" + ] + } + } + ], + [ + "git_remote_redirect_t", + { + "decl": [ + "GIT_REMOTE_REDIRECT_NONE", + "GIT_REMOTE_REDIRECT_INITIAL", + "GIT_REMOTE_REDIRECT_ALL" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 49, + "lineto": 66, + "block": "GIT_REMOTE_REDIRECT_NONE\nGIT_REMOTE_REDIRECT_INITIAL\nGIT_REMOTE_REDIRECT_ALL", + "tdef": "typedef", + "description": " Remote redirection settings; whether redirects to another host\n are permitted. By default, git will follow a redirect on the\n initial request (`/info/refs`), but not subsequent requests.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_NONE", + "comments": "

Do not follow any off-site redirects at any stage of\n the fetch or push.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_INITIAL", + "comments": "

Allow off-site redirects only upon the initial request.\n This is the default.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_ALL", + "comments": "

Allow redirects at any stage in the fetch or push.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_repository", + { + "decl": "git_repository", + "type": "struct", + "value": "git_repository", + "file": "git2/types.h", + "line": 118, + "lineto": 118, + "tdef": "typedef", + "description": " Representation of an existing git repository,\n including all its object contents", + "comments": "", + "used": { + "returns": [ + "git_blob_owner", + "git_commit_owner", + "git_index_owner", + "git_object_owner", + "git_patch_owner", + "git_reference_owner", + "git_remote_owner", + "git_revwalk_repository", + "git_submodule_owner", + "git_tag_owner", + "git_tree_owner" + ], + "needs": [ + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_lookup", + "git_apply", + "git_apply_to_tree", + "git_attr_add_macro", + "git_attr_cache_flush", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_blame_file", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_workdir", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_remote_name", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote", + "git_checkout_head", + "git_checkout_index", + "git_checkout_tree", + "git_cherrypick", + "git_cherrypick_commit", + "git_clone", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_extract_signature", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_config_add_file_ondisk", + "git_describe_workdir", + "git_diff_commit_as_email", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_filter_list_apply_to_file", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_file", + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any", + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored", + "git_index_write_tree_to", + "git_mailmap_from_repository", + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_merge_commits", + "git_merge_file_from_index", + "git_merge_trees", + "git_note_commit_create", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_create", + "git_note_default_ref", + "git_note_foreach", + "git_note_iterator_new", + "git_note_read", + "git_note_remove", + "git_object_lookup", + "git_object_lookup_prefix", + "git_packbuilder_new", + "git_pathspec_match_workdir", + "git_rebase_init", + "git_rebase_open", + "git_refdb_new", + "git_refdb_open", + "git_reference_create", + "git_reference_create_matching", + "git_reference_dwim", + "git_reference_ensure_log", + "git_reference_foreach", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_has_log", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_list", + "git_reference_lookup", + "git_reference_name_to_id", + "git_reference_remove", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reflog_delete", + "git_reflog_read", + "git_reflog_rename", + "git_remote_add_fetch", + "git_remote_add_push", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_cb", + "git_remote_create_with_fetchspec", + "git_remote_delete", + "git_remote_list", + "git_remote_lookup", + "git_remote_rename", + "git_remote_set_autotag", + "git_remote_set_pushurl", + "git_remote_set_url", + "git_repository_commondir", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_create_cb", + "git_repository_detach_head", + "git_repository_fetchhead_foreach", + "git_repository_free", + "git_repository_get_namespace", + "git_repository_hashfile", + "git_repository_head", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_for_worktree", + "git_repository_head_unborn", + "git_repository_ident", + "git_repository_index", + "git_repository_init", + "git_repository_init_ext", + "git_repository_init_options_init", + "git_repository_is_bare", + "git_repository_is_empty", + "git_repository_is_shallow", + "git_repository_is_worktree", + "git_repository_item_path", + "git_repository_mergehead_foreach", + "git_repository_message", + "git_repository_message_remove", + "git_repository_odb", + "git_repository_oid_type", + "git_repository_open", + "git_repository_open_bare", + "git_repository_open_ext", + "git_repository_open_from_worktree", + "git_repository_path", + "git_repository_refdb", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_set_ident", + "git_repository_set_namespace", + "git_repository_set_workdir", + "git_repository_state", + "git_repository_state_cleanup", + "git_repository_workdir", + "git_reset", + "git_reset_default", + "git_reset_from_annotated", + "git_revert", + "git_revert_commit", + "git_revparse", + "git_revparse_ext", + "git_revparse_single", + "git_revwalk_new", + "git_signature_default", + "git_stash_apply", + "git_stash_drop", + "git_stash_foreach", + "git_stash_pop", + "git_stash_save", + "git_stash_save_with_opts", + "git_status_file", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_list_new", + "git_status_should_ignore", + "git_submodule_add_setup", + "git_submodule_clone", + "git_submodule_foreach", + "git_submodule_lookup", + "git_submodule_open", + "git_submodule_repo_init", + "git_submodule_resolve_url", + "git_submodule_set_branch", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_set_url", + "git_submodule_status", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_foreach", + "git_tag_list", + "git_tag_list_match", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_transaction_new", + "git_tree_create_updated", + "git_tree_entry_to_object", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_treebuilder_new", + "git_worktree_add", + "git_worktree_list", + "git_worktree_lookup", + "git_worktree_open_from_repository" + ] + } + } + ], + [ + "git_repository_init_flag_t", + { + "decl": [ + "GIT_REPOSITORY_INIT_BARE", + "GIT_REPOSITORY_INIT_NO_REINIT", + "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", + "GIT_REPOSITORY_INIT_MKDIR", + "GIT_REPOSITORY_INIT_MKPATH", + "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", + "GIT_REPOSITORY_INIT_RELATIVE_GITLINK" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 235, + "lineto": 281, + "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", + "tdef": "typedef", + "description": " Option flags for `git_repository_init_ext`.", + "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_BARE", + "comments": "

Create a bare repository with no working directory.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_NO_REINIT", + "comments": "

Return an GIT_EEXISTS error if the repo_path appears to already be\n an git repository.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", + "comments": "

Normally a "/.git/" will be appended to the repo path for\n non-bare repos (if it is not already there), but passing this flag\n prevents that behavior.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_MKDIR", + "comments": "

Make the repo_path (and workdir_path) as needed. Init is always willing\n to create the ".git" directory even without this flag. This flag tells\n init to create the trailing component of the repo and workdir paths\n as needed.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_MKPATH", + "comments": "

Recursively make all components of the repo and workdir paths as\n necessary.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", + "comments": "

libgit2 normally uses internal templates to initialize a new repo.\n This flags enables external templates, looking the "template_path" from\n the options if set, or the init.templatedir global config if not,\n or falling back on "/usr/share/git-core/templates" if it exists.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_RELATIVE_GITLINK", + "comments": "

If an alternate workdir is specified, use relative paths for the gitdir\n and core.worktree.

\n", + "value": 64 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_repository_init_mode_t", + { + "decl": [ + "GIT_REPOSITORY_INIT_SHARED_UMASK", + "GIT_REPOSITORY_INIT_SHARED_GROUP", + "GIT_REPOSITORY_INIT_SHARED_ALL" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 290, + "lineto": 306, + "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", + "tdef": "typedef", + "description": " Mode options for `git_repository_init_ext`.", + "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the defined modes.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_UMASK", + "comments": "

Use permissions configured by umask - the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_GROUP", + "comments": "

Use "--shared=group" behavior, chmod'ing the new repo to be group\n writable and "g+sx" for sticky group assignment.

\n", + "value": 1533 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_ALL", + "comments": "

Use "--shared=all" behavior, adding world readability.

\n", + "value": 1535 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_repository_init_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint32_t mode", + "const char * workdir_path", + "const char * description", + "const char * template_path", + "const char * initial_head", + "const char * origin_url" + ], + "type": "struct", + "value": "git_repository_init_options", + "file": "git2/repository.h", + "line": 314, + "lineto": 373, + "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", + "tdef": "typedef", + "description": " Extended options structure for `git_repository_init_ext`.", + "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Combination of GIT_REPOSITORY_INIT flags above." + }, + { + "type": "uint32_t", + "name": "mode", + "comments": " Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants\n above, or to a custom value that you would like." + }, + { + "type": "const char *", + "name": "workdir_path", + "comments": " The path to the working dir or NULL for default (i.e. repo_path parent\n on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED\n RELATIVE TO THE REPO_PATH. If this is not the \"natural\" working\n directory, a .git gitlink file will be created here linking to the\n repo_path." + }, + { + "type": "const char *", + "name": "description", + "comments": " If set, this will be used to initialize the \"description\" file in the\n repository, instead of using the template content." + }, + { + "type": "const char *", + "name": "template_path", + "comments": " When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains\n the path to use for the template directory. If this is NULL, the config\n or default directory options will be used instead." + }, + { + "type": "const char *", + "name": "initial_head", + "comments": " The name of the head to point HEAD at. If NULL, then this will be\n treated as \"master\" and the HEAD ref will be set to \"refs/heads/master\".\n If this begins with \"refs/\" it will be used verbatim;\n otherwise \"refs/heads/\" will be prefixed." + }, + { + "type": "const char *", + "name": "origin_url", + "comments": " If this is non-NULL, then after the rest of the repository\n initialization is completed, an \"origin\" remote will be added\n pointing to this URL." + } + ], + "used": { + "returns": [], + "needs": [ + "git_repository_init_ext", + "git_repository_init_options_init" + ] + } + } + ], + [ + "git_repository_item_t", + { + "decl": [ + "GIT_REPOSITORY_ITEM_GITDIR", + "GIT_REPOSITORY_ITEM_WORKDIR", + "GIT_REPOSITORY_ITEM_COMMONDIR", + "GIT_REPOSITORY_ITEM_INDEX", + "GIT_REPOSITORY_ITEM_OBJECTS", + "GIT_REPOSITORY_ITEM_REFS", + "GIT_REPOSITORY_ITEM_PACKED_REFS", + "GIT_REPOSITORY_ITEM_REMOTES", + "GIT_REPOSITORY_ITEM_CONFIG", + "GIT_REPOSITORY_ITEM_INFO", + "GIT_REPOSITORY_ITEM_HOOKS", + "GIT_REPOSITORY_ITEM_LOGS", + "GIT_REPOSITORY_ITEM_MODULES", + "GIT_REPOSITORY_ITEM_WORKTREES", + "GIT_REPOSITORY_ITEM__LAST" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 491, + "lineto": 507, + "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM__LAST", + "tdef": "typedef", + "description": " List of items which belong to the git repository layout", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_GITDIR", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKDIR", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_COMMONDIR", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_INDEX", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_OBJECTS", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_REFS", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_PACKED_REFS", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_REMOTES", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_CONFIG", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_INFO", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_HOOKS", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_LOGS", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_MODULES", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKTREES", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM__LAST", + "comments": "", + "value": 14 + } + ], + "used": { + "returns": [], + "needs": [ + "git_repository_item_path" + ] + } + } + ], + [ + "git_repository_open_flag_t", + { + "decl": [ + "GIT_REPOSITORY_OPEN_NO_SEARCH", + "GIT_REPOSITORY_OPEN_CROSS_FS", + "GIT_REPOSITORY_OPEN_BARE", + "GIT_REPOSITORY_OPEN_NO_DOTGIT", + "GIT_REPOSITORY_OPEN_FROM_ENV" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 108, + "lineto": 155, + "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", + "tdef": "typedef", + "description": " Option flags for `git_repository_open_ext`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_NO_SEARCH", + "comments": "

Only open the repository if it can be immediately found in the\n start_path. Do not walk up from the start_path looking at parent\n directories.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_CROSS_FS", + "comments": "

Unless this flag is set, open will not continue searching across\n filesystem boundaries (i.e. when st_dev changes from the stat\n system call). For example, searching in a user's home directory at\n "/home/user/source/" will not return "/.git/" as the found repo if\n "/" is a different filesystem than "/home".

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_BARE", + "comments": "

Open repository as a bare repo regardless of core.bare config, and\n defer loading config file for faster setup.\n Unlike git_repository_open_bare, this can follow gitlinks.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_NO_DOTGIT", + "comments": "

Do not check for a repository by appending /.git to the start_path;\n only open the repository if start_path itself points to the git\n directory.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_FROM_ENV", + "comments": "

Find and open a git repository, respecting the environment variables\n used by the git command-line tools.\n If set, git_repository_open_ext will ignore the other flags and\n the ceiling_dirs argument, and will allow a NULL path to use\n GIT_DIR or search from the current directory.\n The search for a repository will respect $GIT_CEILING_DIRECTORIES and\n $GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\n respect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n $GIT_ALTERNATE_OBJECT_DIRECTORIES.\n In the future, this flag will also cause git_repository_open_ext\n to respect $GIT_WORK_TREE and $GIT_COMMON_DIR; currently,\n git_repository_open_ext with this flag will error out if either\n $GIT_WORK_TREE or $GIT_COMMON_DIR is set.

\n", + "value": 16 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_repository_state_t", + { + "decl": [ + "GIT_REPOSITORY_STATE_NONE", + "GIT_REPOSITORY_STATE_MERGE", + "GIT_REPOSITORY_STATE_REVERT", + "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", + "GIT_REPOSITORY_STATE_CHERRYPICK", + "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", + "GIT_REPOSITORY_STATE_BISECT", + "GIT_REPOSITORY_STATE_REBASE", + "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", + "GIT_REPOSITORY_STATE_REBASE_MERGE", + "GIT_REPOSITORY_STATE_APPLY_MAILBOX", + "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 891, + "lineto": 904, + "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", + "tdef": "typedef", + "description": " Repository state", + "comments": "

These values represent possible states for the repository to be in, based on the current operation which is ongoing.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_MERGE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REVERT", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_CHERRYPICK", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_BISECT", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE_MERGE", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", + "comments": "", + "value": 11 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_reset_t", + { + "decl": [ + "GIT_RESET_SOFT", + "GIT_RESET_MIXED", + "GIT_RESET_HARD" + ], + "type": "enum", + "file": "git2/reset.h", + "line": 26, + "lineto": 30, + "block": "GIT_RESET_SOFT\nGIT_RESET_MIXED\nGIT_RESET_HARD", + "tdef": "typedef", + "description": " Kinds of reset operation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_RESET_SOFT", + "comments": "

Move the head to the given commit

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_RESET_MIXED", + "comments": "

SOFT plus reset index to the commit

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_RESET_HARD", + "comments": "

MIXED plus changes in working tree discarded

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [ + "git_reset", + "git_reset_from_annotated" + ] + } + } + ], + [ + "git_revert_options", + { + "decl": [ + "unsigned int version", + "unsigned int mainline", + "git_merge_options merge_opts", + "git_checkout_options checkout_opts" + ], + "type": "struct", + "value": "git_revert_options", + "file": "git2/revert.h", + "line": 26, + "lineto": 34, + "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", + "tdef": "typedef", + "description": " Options for revert", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "unsigned int", + "name": "mainline", + "comments": " For merge commits, the \"mainline\" is treated as the parent. " + }, + { + "type": "git_merge_options", + "name": "merge_opts", + "comments": " Options for the merging " + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " Options for the checkout " + } + ], + "used": { + "returns": [], + "needs": [ + "git_revert", + "git_revert_options_init" + ] + } + } + ], + [ + "git_revspec", + { + "decl": [ + "git_object * from", + "git_object * to", + "unsigned int flags" + ], + "type": "struct", + "value": "git_revspec", + "file": "git2/revparse.h", + "line": 83, + "lineto": 90, + "block": "git_object * from\ngit_object * to\nunsigned int flags", + "tdef": "typedef", + "description": " Git Revision Spec: output of a `git_revparse` operation", + "comments": "", + "fields": [ + { + "type": "git_object *", + "name": "from", + "comments": " The left element of the revspec; must be freed by the user " + }, + { + "type": "git_object *", + "name": "to", + "comments": " The right element of the revspec; must be freed by the user " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " The intent of the revspec (i.e. `git_revspec_mode_t` flags) " + } + ], + "used": { + "returns": [], + "needs": [ + "git_revparse" + ] + } + } + ], + [ + "git_revspec_t", + { + "decl": [ + "GIT_REVSPEC_SINGLE", + "GIT_REVSPEC_RANGE", + "GIT_REVSPEC_MERGE_BASE" + ], + "type": "enum", + "file": "git2/revparse.h", + "line": 71, + "lineto": 78, + "block": "GIT_REVSPEC_SINGLE\nGIT_REVSPEC_RANGE\nGIT_REVSPEC_MERGE_BASE", + "tdef": "typedef", + "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REVSPEC_SINGLE", + "comments": "

The spec targeted a single object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REVSPEC_RANGE", + "comments": "

The spec targeted a range of commits.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REVSPEC_MERGE_BASE", + "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_revwalk", + { + "decl": "git_revwalk", + "type": "struct", + "value": "git_revwalk", + "file": "git2/types.h", + "line": 127, + "lineto": 127, + "tdef": "typedef", + "description": " Representation of an in-progress walk through the commits in a repo ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_packbuilder_insert_walk", + "git_revwalk_add_hide_cb", + "git_revwalk_free", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_hide_ref", + "git_revwalk_new", + "git_revwalk_next", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_push_range", + "git_revwalk_push_ref", + "git_revwalk_repository", + "git_revwalk_reset", + "git_revwalk_simplify_first_parent", + "git_revwalk_sorting" + ] + } + } + ], + [ + "git_signature", + { + "decl": [ + "char * name", + "char * email", + "git_time when" + ], + "type": "struct", + "value": "git_signature", + "file": "git2/types.h", + "line": 182, + "lineto": 186, + "block": "char * name\nchar * email\ngit_time when", + "tdef": "typedef", + "description": " An action signature (e.g. for committers, taggers, etc) ", + "comments": "", + "fields": [ + { + "type": "char *", + "name": "name", + "comments": " full name of the author " + }, + { + "type": "char *", + "name": "email", + "comments": " email of the author " + }, + { + "type": "git_time", + "name": "when", + "comments": " time when the action happened " + } + ], + "used": { + "returns": [ + "git_commit_author", + "git_commit_committer", + "git_note_author", + "git_note_committer", + "git_reflog_entry_committer", + "git_tag_tagger" + ], + "needs": [ + "git_commit_amend", + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_v", + "git_mailmap_resolve_signature", + "git_note_commit_create", + "git_note_commit_remove", + "git_note_create", + "git_note_remove", + "git_rebase_commit", + "git_rebase_finish", + "git_reflog_append", + "git_signature_default", + "git_signature_dup", + "git_signature_free", + "git_signature_from_buffer", + "git_signature_new", + "git_signature_now", + "git_stash_save", + "git_tag_annotation_create", + "git_tag_create", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + } + } + ], + [ + "git_smart_service_t", + { + "decl": [ + "GIT_SERVICE_UPLOADPACK_LS", + "GIT_SERVICE_UPLOADPACK", + "GIT_SERVICE_RECEIVEPACK_LS", + "GIT_SERVICE_RECEIVEPACK" + ], + "type": "enum", + "file": "git2/sys/transport.h", + "line": 313, + "lineto": 318, + "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", + "tdef": "typedef", + "description": " Actions that the smart transport can ask a subtransport to perform ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK_LS", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK_LS", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK", + "comments": "", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_sort_t", + { + "decl": [ + "GIT_SORT_NONE", + "GIT_SORT_TOPOLOGICAL", + "GIT_SORT_TIME", + "GIT_SORT_REVERSE" + ], + "type": "enum", + "file": "git2/revwalk.h", + "line": 26, + "lineto": 53, + "block": "GIT_SORT_NONE\nGIT_SORT_TOPOLOGICAL\nGIT_SORT_TIME\nGIT_SORT_REVERSE", + "tdef": "typedef", + "description": " Flags to specify the sorting which a revwalk should perform.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_SORT_NONE", + "comments": "

Sort the output with the same default method from git: reverse\n chronological order. This is the default sorting for new walkers.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_SORT_TOPOLOGICAL", + "comments": "

Sort the repository contents in topological order (no parents before\n all of its children are shown); this sorting mode can be combined\n with time sorting to produce git's --date-order`.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SORT_TIME", + "comments": "

Sort the repository contents by commit time;\n this sorting mode can be combined with\n topological sorting.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SORT_REVERSE", + "comments": "

Iterate through the repository contents in reverse\n order; this sorting mode can be combined with\n any of the above.

\n", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_stash_apply_flags", + { + "decl": [ + "GIT_STASH_APPLY_DEFAULT", + "GIT_STASH_APPLY_REINSTATE_INDEX" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 129, + "lineto": 136, + "block": "GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX", + "tdef": "typedef", + "description": " Stash application flags. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_REINSTATE_INDEX", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_stash_apply_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_checkout_options checkout_options", + "git_stash_apply_progress_cb progress_cb", + "void * progress_payload" + ], + "type": "struct", + "value": "git_stash_apply_options", + "file": "git2/stash.h", + "line": 180, + "lineto": 192, + "block": "unsigned int version\nuint32_t flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", + "tdef": "typedef", + "description": " Stash application options structure", + "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can use git_stash_apply_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_stash_apply_flags`, above. " + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to use when writing files to the working directory. " + }, + { + "type": "git_stash_apply_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of application progress. " + }, + { + "type": "void *", + "name": "progress_payload", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_apply", + "git_stash_apply_options_init", + "git_stash_pop" + ] + } + } + ], + [ + "git_stash_apply_progress_t", + { + "decl": [ + "GIT_STASH_APPLY_PROGRESS_NONE", + "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_DONE" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 139, + "lineto": 162, + "block": "GIT_STASH_APPLY_PROGRESS_NONE\nGIT_STASH_APPLY_PROGRESS_LOADING_STASH\nGIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX\nGIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED\nGIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED\nGIT_STASH_APPLY_PROGRESS_DONE", + "tdef": "typedef", + "description": " Stash apply progression states ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "comments": "

Loading the stashed data from the object database.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "comments": "

The stored index is being analyzed.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "comments": "

The modified files are being analyzed.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "comments": "

The untracked and ignored files are being analyzed.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "comments": "

The untracked files are being written to disk.

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "comments": "

The modified files are being written to disk.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_DONE", + "comments": "

The stash was applied successfully.

\n", + "value": 7 + } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_apply_progress_cb" + ] + } + } + ], + [ + "git_stash_flags", + { + "decl": [ + "GIT_STASH_DEFAULT", + "GIT_STASH_KEEP_INDEX", + "GIT_STASH_INCLUDE_UNTRACKED", + "GIT_STASH_INCLUDE_IGNORED", + "GIT_STASH_KEEP_ALL" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 25, + "lineto": 53, + "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED\nGIT_STASH_KEEP_ALL", + "tdef": "typedef", + "description": " Stash flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_DEFAULT", + "comments": "

No option, default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_KEEP_INDEX", + "comments": "

All changes already added to the index are left intact in\n the working directory

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_INCLUDE_UNTRACKED", + "comments": "

All untracked files are also stashed and then cleaned up\n from the working directory

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_INCLUDE_IGNORED", + "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_KEEP_ALL", + "comments": "

All changes in the index and working directory are left intact

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_stash_save_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "const git_signature * stasher", + "const char * message", + "git_strarray paths" + ], + "type": "struct", + "value": "git_stash_save_options", + "file": "git2/stash.h", + "line": 81, + "lineto": 95, + "block": "unsigned int version\nuint32_t flags\nconst git_signature * stasher\nconst char * message\ngit_strarray paths", + "tdef": "typedef", + "description": " Stash save options structure", + "comments": "

Initialize with GIT_STASH_SAVE_OPTIONS_INIT. Alternatively, you can use git_stash_save_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Flags to control the stashing process. (see GIT_STASH_* above) " + }, + { + "type": "const git_signature *", + "name": "stasher", + "comments": " The identity of the person performing the stashing. " + }, + { + "type": "const char *", + "name": "message", + "comments": " Optional description along with the stashed state. " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " Optional paths that control which files are stashed. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_save_options_init", + "git_stash_save_with_opts" + ] + } + } + ], + [ + "git_status_entry", + { + "decl": [ + "git_status_t status", + "git_diff_delta * head_to_index", + "git_diff_delta * index_to_workdir" + ], + "type": "struct", + "value": "git_status_entry", + "file": "git2/status.h", + "line": 295, + "lineto": 299, + "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", + "tdef": "typedef", + "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", + "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the differences between the file in the index and the file in the working directory.

\n", + "fields": [ + { + "type": "git_status_t", + "name": "status", + "comments": "" + }, + { + "type": "git_diff_delta *", + "name": "head_to_index", + "comments": "" + }, + { + "type": "git_diff_delta *", + "name": "index_to_workdir", + "comments": "" + } + ], + "used": { + "returns": [ + "git_status_byindex" + ], + "needs": [] + } + } + ], + [ + "git_status_list", + { + "decl": "git_status_list", + "type": "struct", + "value": "git_status_list", + "file": "git2/types.h", + "line": 201, + "lineto": 201, + "tdef": "typedef", + "description": " Representation of a status collection ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_status_byindex", + "git_status_list_entrycount", + "git_status_list_free", + "git_status_list_new" + ] + } + } + ], + [ + "git_status_opt_t", + { + "decl": [ + "GIT_STATUS_OPT_INCLUDE_UNTRACKED", + "GIT_STATUS_OPT_INCLUDE_IGNORED", + "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", + "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", + "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", + "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", + "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", + "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", + "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", + "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", + "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", + "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", + "GIT_STATUS_OPT_NO_REFRESH", + "GIT_STATUS_OPT_UPDATE_INDEX", + "GIT_STATUS_OPT_INCLUDE_UNREADABLE", + "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED" + ], + "type": "enum", + "file": "git2/status.h", + "line": 101, + "lineto": 208, + "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", + "tdef": "typedef", + "description": " Flags to control status callbacks", + "comments": "

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNTRACKED", + "comments": "

Says that callbacks should be made on untracked files.\n These will only be made if the workdir files are included in the status\n "show" option.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_IGNORED", + "comments": "

Says that ignored files get callbacks.\n Again, these callbacks will only be made if the workdir files are\n included in the status "show" option.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", + "comments": "

Indicates that callback should be made even on unmodified files.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", + "comments": "

Indicates that submodules should be skipped.\n This only applies if there are no pending typechanges to the submodule\n (either from or to another type).

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", + "comments": "

Indicates that all files in untracked directories should be included.\n Normally if an entire directory is new, then just the top-level\n directory is included (with a trailing slash on the entry name).\n This flag says to include all of the individual files in the directory\n instead.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", + "comments": "

Indicates that the given path should be treated as a literal path,\n and not as a pathspec pattern.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", + "comments": "

Indicates that the contents of ignored directories should be included\n in the status. This is like doing git ls-files -o -i --exclude-standard\n with core git.

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", + "comments": "

Indicates that rename detection should be processed between the head and\n the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status\n flag.

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", + "comments": "

Indicates that rename detection should be run between the index and the\n working directory and enabled GIT_STATUS_WT_RENAMED as a possible status\n flag.

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-sensitive order.

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-insensitive order.

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", + "comments": "

Iindicates that rename detection should include rewritten files.

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_NO_REFRESH", + "comments": "

Bypasses the default status behavior of doing a "soft" index reload\n (i.e. reloading the index data if the file on disk has been modified\n outside libgit2).

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_UPDATE_INDEX", + "comments": "

Tells libgit2 to refresh the stat cache in the index for files that are\n unchanged but have out of date stat einformation in the index.\n It will result in less work being done on subsequent calls to get status.\n This is mutually exclusive with the NO_REFRESH option.

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE", + "comments": "

Normally files that cannot be opened or read are ignored as\n these are often transient files; this option will return\n unreadable files as GIT_STATUS_WT_UNREADABLE.

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", + "comments": "

Unreadable files will be detected and given the status\n untracked instead of unreadable.

\n", + "value": 32768 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_status_options", + { + "decl": [ + "unsigned int version", + "git_status_show_t show", + "unsigned int flags", + "git_strarray pathspec", + "git_tree * baseline", + "uint16_t rename_threshold" + ], + "type": "struct", + "value": "git_status_options", + "file": "git2/status.h", + "line": 222, + "lineto": 262, + "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline\nuint16_t rename_threshold", + "tdef": "typedef", + "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", + "comments": "

Initialize with GIT_STATUS_OPTIONS_INIT. Alternatively, you can use git_status_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." + }, + { + "type": "git_status_show_t", + "name": "show", + "comments": " The `show` value is one of the `git_status_show_t` constants that\n control which files to scan and in what order. The default is\n `GIT_STATUS_SHOW_INDEX_AND_WORKDIR`." + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " The `flags` value is an OR'ed combination of the\n `git_status_opt_t` values above. The default is\n `GIT_STATUS_OPT_DEFAULTS`, which matches git's default\n behavior." + }, + { + "type": "git_strarray", + "name": "pathspec", + "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match\n exactly if `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified\n in the flags." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The `baseline` is the tree to be used for comparison to the\n working directory and index; defaults to HEAD." + }, + { + "type": "uint16_t", + "name": "rename_threshold", + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." + } + ], + "used": { + "returns": [], + "needs": [ + "git_status_foreach_ext", + "git_status_list_new", + "git_status_options_init" + ] + } + } + ], + [ + "git_status_show_t", + { + "decl": [ + "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", + "GIT_STATUS_SHOW_INDEX_ONLY", + "GIT_STATUS_SHOW_WORKDIR_ONLY" + ], + "type": "enum", + "file": "git2/status.h", + "line": 73, + "lineto": 91, + "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", + "tdef": "typedef", + "description": " Select the files on which to report status.", + "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", + "comments": "

The default. This roughly matches git status --porcelain regarding\n which files are included and in what order.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STATUS_SHOW_INDEX_ONLY", + "comments": "

Only gives status based on HEAD to index comparison, not looking at\n working directory changes.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_SHOW_WORKDIR_ONLY", + "comments": "

Only gives status based on index to working directory comparison,\n not comparing the index to the HEAD.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_status_t", + { + "decl": [ + "GIT_STATUS_CURRENT", + "GIT_STATUS_INDEX_NEW", + "GIT_STATUS_INDEX_MODIFIED", + "GIT_STATUS_INDEX_DELETED", + "GIT_STATUS_INDEX_RENAMED", + "GIT_STATUS_INDEX_TYPECHANGE", + "GIT_STATUS_WT_NEW", + "GIT_STATUS_WT_MODIFIED", + "GIT_STATUS_WT_DELETED", + "GIT_STATUS_WT_TYPECHANGE", + "GIT_STATUS_WT_RENAMED", + "GIT_STATUS_WT_UNREADABLE", + "GIT_STATUS_IGNORED", + "GIT_STATUS_CONFLICTED" + ], + "type": "enum", + "file": "git2/status.h", + "line": 34, + "lineto": 52, + "block": "GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED", + "tdef": "typedef", + "description": " Status flags for a single file.", + "comments": "

A combination of these values will be returned to indicate the status of a file. Status compares the working directory, the index, and the current HEAD of the repository. The GIT_STATUS_INDEX set of flags represents the status of file in the index relative to the HEAD, and the GIT_STATUS_WT set of flags represent the status of the file in the working directory relative to the index.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_CURRENT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_NEW", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_MODIFIED", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_DELETED", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_RENAMED", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_TYPECHANGE", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_NEW", + "comments": "", + "value": 128 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_MODIFIED", + "comments": "", + "value": 256 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_DELETED", + "comments": "", + "value": 512 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_TYPECHANGE", + "comments": "", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_RENAMED", + "comments": "", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_UNREADABLE", + "comments": "", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_STATUS_IGNORED", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_STATUS_CONFLICTED", + "comments": "", + "value": 32768 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_strarray", + { + "decl": [ + "char ** strings", + "size_t count" + ], + "type": "struct", + "value": "git_strarray", + "file": "git2/strarray.h", + "line": 22, + "lineto": 25, + "block": "char ** strings\nsize_t count", + "tdef": "typedef", + "description": " Array of strings ", + "comments": "", + "fields": [ + { + "type": "char **", + "name": "strings", + "comments": "" + }, + { + "type": "size_t", + "name": "count", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_index_add_all", + "git_index_remove_all", + "git_index_update_all", + "git_pathspec_new", + "git_reference_list", + "git_remote_connect", + "git_remote_download", + "git_remote_fetch", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_list", + "git_remote_push", + "git_remote_rename", + "git_remote_upload", + "git_reset_default", + "git_strarray_copy", + "git_strarray_dispose", + "git_strarray_free", + "git_tag_list", + "git_tag_list_match", + "git_worktree_list" + ] + } + } + ], + [ + "git_stream_t", + { + "decl": [ + "GIT_STREAM_STANDARD", + "GIT_STREAM_TLS" + ], + "type": "enum", + "file": "git2/sys/stream.h", + "line": 91, + "lineto": 97, + "block": "GIT_STREAM_STANDARD\nGIT_STREAM_TLS", + "tdef": "typedef", + "description": " The type of stream to register.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STREAM_STANDARD", + "comments": "

A standard (non-TLS) socket.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STREAM_TLS", + "comments": "

A TLS-encrypted socket.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_submodule", + { + "decl": "git_submodule", + "type": "struct", + "value": "git_submodule", + "file": "git2/types.h", + "line": 267, + "lineto": 267, + "tdef": "typedef", + "description": " Opaque structure representing a submodule.", + "comments": "", + "used": { + "returns": [ + "git_submodule_fetch_recurse_submodules", + "git_submodule_ignore", + "git_submodule_update_strategy" + ], + "needs": [ + "git_submodule_add_finalize", + "git_submodule_add_setup", + "git_submodule_add_to_index", + "git_submodule_branch", + "git_submodule_cb", + "git_submodule_clone", + "git_submodule_dup", + "git_submodule_fetch_recurse_submodules", + "git_submodule_foreach", + "git_submodule_free", + "git_submodule_head_id", + "git_submodule_ignore", + "git_submodule_index_id", + "git_submodule_init", + "git_submodule_location", + "git_submodule_lookup", + "git_submodule_name", + "git_submodule_open", + "git_submodule_owner", + "git_submodule_path", + "git_submodule_reload", + "git_submodule_repo_init", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_status", + "git_submodule_sync", + "git_submodule_update", + "git_submodule_update_options_init", + "git_submodule_update_strategy", + "git_submodule_url", + "git_submodule_wd_id" + ] + } + } + ], + [ + "git_submodule_ignore_t", + { + "decl": [ + "GIT_SUBMODULE_IGNORE_UNSPECIFIED", + "GIT_SUBMODULE_IGNORE_NONE", + "GIT_SUBMODULE_IGNORE_UNTRACKED", + "GIT_SUBMODULE_IGNORE_DIRTY", + "GIT_SUBMODULE_IGNORE_ALL" + ], + "type": "enum", + "file": "git2/types.h", + "line": 331, + "lineto": 338, + "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", + "tdef": "typedef", + "description": " Submodule ignore values", + "comments": "

These values represent settings for the submodule.$name.ignore configuration value which says how deeply to look at the working directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with git_submodule_set_ignore() and can write the changed value to disk with git_submodule_save(). If you have overwritten the value, you can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an untracked file, will mark the submodule as dirty. Ignored files are still ignored, of course. - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes to tracked files, or the index or the HEAD commit will matter. - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory, only considering changes if the HEAD of submodule has moved from the value in the superproject. - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer when we don't want any particular ignore rule to be specified.
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_UNSPECIFIED", + "comments": "

use the submodule's configuration

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_NONE", + "comments": "

any change or untracked == dirty

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_UNTRACKED", + "comments": "

dirty if tracked files change

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_DIRTY", + "comments": "

only dirty if HEAD moved

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_ALL", + "comments": "

never dirty

\n", + "value": 4 + } + ], + "used": { + "returns": [ + "git_submodule_ignore" + ], + "needs": [ + "git_submodule_set_ignore", + "git_submodule_status" + ] + } + } + ], + [ + "git_submodule_recurse_t", + { + "decl": [ + "GIT_SUBMODULE_RECURSE_NO", + "GIT_SUBMODULE_RECURSE_YES", + "GIT_SUBMODULE_RECURSE_ONDEMAND" + ], + "type": "enum", + "file": "git2/types.h", + "line": 350, + "lineto": 354, + "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", + "tdef": "typedef", + "description": " Options for submodule recurse.", + "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules * GIT_SUBMODULE_RECURSE_YES - recurse into submodules * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when commit not already in local clone
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_NO", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_YES", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_ONDEMAND", + "comments": "", + "value": 2 + } + ], + "used": { + "returns": [ + "git_submodule_fetch_recurse_submodules" + ], + "needs": [ + "git_submodule_set_fetch_recurse_submodules" + ] + } + } + ], + [ + "git_submodule_status_t", + { + "decl": [ + "GIT_SUBMODULE_STATUS_IN_HEAD", + "GIT_SUBMODULE_STATUS_IN_INDEX", + "GIT_SUBMODULE_STATUS_IN_CONFIG", + "GIT_SUBMODULE_STATUS_IN_WD", + "GIT_SUBMODULE_STATUS_INDEX_ADDED", + "GIT_SUBMODULE_STATUS_INDEX_DELETED", + "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", + "GIT_SUBMODULE_STATUS_WD_ADDED", + "GIT_SUBMODULE_STATUS_WD_DELETED", + "GIT_SUBMODULE_STATUS_WD_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_UNTRACKED" + ], + "type": "enum", + "file": "git2/submodule.h", + "line": 74, + "lineto": 89, + "block": "GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED", + "tdef": "typedef", + "description": " Return codes for submodule status.", + "comments": "

A combination of these flags will be returned to describe the status of a submodule. Depending on the "ignore" property of the submodule, some of the flags may never be returned because they indicate changes that are supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config files (both .git/config and .gitmodules), and the working directory. Any or all of those places might be missing information about the submodule depending on what state the repo is in. We consider all four places to build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info about what sources of submodule data are available. These will be returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule * IN_INDEX - superproject index contains submodule * IN_CONFIG - superproject gitmodules has submodule * IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head * INDEX_DELETED - in head, not in index * INDEX_MODIFIED - index and head don't match * WD_UNINITIALIZED - workdir contains empty directory * WD_ADDED - in workdir, not index * WD_DELETED - in index, not workdir * WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty * WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_HEAD", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_INDEX", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_CONFIG", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_WD", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_ADDED", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_DELETED", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", + "comments": "", + "value": 64 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", + "comments": "", + "value": 128 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_ADDED", + "comments": "", + "value": 256 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_DELETED", + "comments": "", + "value": 512 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_MODIFIED", + "comments": "", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", + "comments": "", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", + "comments": "", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_UNTRACKED", + "comments": "", + "value": 8192 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_submodule_update_options", + { + "decl": [ + "unsigned int version", + "git_checkout_options checkout_opts", + "git_fetch_options fetch_opts", + "int allow_fetch" + ], + "type": "struct", + "value": "git_submodule_update_options", + "file": "git2/submodule.h", + "line": 128, + "lineto": 153, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", + "tdef": "typedef", + "description": " Submodule update options structure", + "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory." + }, + { + "type": "git_fetch_options", + "name": "fetch_opts", + "comments": " Options which control the fetch, including callbacks.\n\n The callbacks to use for reporting fetch progress, and for acquiring\n credentials in the event they are needed." + }, + { + "type": "int", + "name": "allow_fetch", + "comments": " Allow fetching from the submodule's default remote if the target\n commit isn't found. Enabled by default." + } + ], + "used": { + "returns": [], + "needs": [ + "git_submodule_clone", + "git_submodule_update", + "git_submodule_update_options_init" + ] + } + } + ], + [ + "git_submodule_update_t", + { + "decl": [ + "GIT_SUBMODULE_UPDATE_CHECKOUT", + "GIT_SUBMODULE_UPDATE_REBASE", + "GIT_SUBMODULE_UPDATE_MERGE", + "GIT_SUBMODULE_UPDATE_NONE", + "GIT_SUBMODULE_UPDATE_DEFAULT" + ], + "type": "enum", + "file": "git2/types.h", + "line": 295, + "lineto": 302, + "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", + "tdef": "typedef", + "description": " Submodule update values", + "comments": "

These values represent settings for the submodule.$name.update configuration value which says how to handle git submodule update for this submodule. The value is usually set in the ".gitmodules" file and copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with git_submodule_set_update() and write the changed value to disk using git_submodule_save(). If you have overwritten the value, you can revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is updated, checkout the new detached HEAD to the submodule directory. - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked out branch onto the commit from the superproject. - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the superproject into the current checkout out branch of the submodule. - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when the commit in the superproject is updated. - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer when we don't want any particular update rule to be specified.
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_CHECKOUT", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_REBASE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_MERGE", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_NONE", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_DEFAULT", + "comments": "", + "value": 0 + } + ], + "used": { + "returns": [ + "git_submodule_update_strategy" + ], + "needs": [ + "git_submodule_set_update" + ] + } + } + ], + [ + "git_tag", + { + "decl": "git_tag", + "type": "struct", + "value": "git_tag", + "file": "git2/types.h", + "line": 130, + "lineto": 130, + "tdef": "typedef", + "description": " Parsed representation of a tag object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_tag_dup", + "git_tag_foreach", + "git_tag_free", + "git_tag_id", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_message", + "git_tag_name", + "git_tag_owner", + "git_tag_peel", + "git_tag_tagger", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type" + ] + } + } + ], + [ + "git_time", + { + "decl": [ + "git_time_t time", + "int offset", + "char sign" + ], + "type": "struct", + "value": "git_time", + "file": "git2/types.h", + "line": 175, + "lineto": 179, + "block": "git_time_t time\nint offset\nchar sign", + "tdef": "typedef", + "description": " Time in a signature ", + "comments": "", + "fields": [ + { + "type": "git_time_t", + "name": "time", + "comments": " time in seconds from epoch " + }, + { + "type": "int", + "name": "offset", + "comments": " timezone offset, in minutes " + }, + { + "type": "char", + "name": "sign", + "comments": " indicator for questionable '-0000' offsets in signature " + } + ], + "used": { + "returns": [ + "git_commit_time" + ], + "needs": [ + "git_signature_new" + ] + } + } + ], + [ + "git_trace_level_t", + { + "decl": [ + "GIT_TRACE_NONE", + "GIT_TRACE_FATAL", + "GIT_TRACE_ERROR", + "GIT_TRACE_WARN", + "GIT_TRACE_INFO", + "GIT_TRACE_DEBUG", + "GIT_TRACE_TRACE" + ], + "type": "enum", + "file": "git2/trace.h", + "line": 26, + "lineto": 47, + "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", + "tdef": "typedef", + "description": " Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TRACE_NONE", + "comments": "

No tracing will be performed.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TRACE_FATAL", + "comments": "

Severe errors that may impact the program's execution

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_TRACE_ERROR", + "comments": "

Errors that do not impact the program's execution

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_TRACE_WARN", + "comments": "

Warnings that suggest abnormal data

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_TRACE_INFO", + "comments": "

Informational messages about program execution

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_TRACE_DEBUG", + "comments": "

Detailed data that allows for debugging

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_TRACE_TRACE", + "comments": "

Exceptionally detailed debugging data

\n", + "value": 6 + } + ], + "used": { + "returns": [], + "needs": [ + "git_trace_cb", + "git_trace_set" + ] + } + } + ], + [ + "git_transaction", + { + "decl": "git_transaction", + "type": "struct", + "value": "git_transaction", + "file": "git2/types.h", + "line": 195, + "lineto": 195, + "tdef": "typedef", + "description": " Transactional interface to references ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_lock", + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + } + } + ], + [ + "git_transport", + { + "decl": "git_transport", + "type": "struct", + "value": "git_transport", + "file": "git2/types.h", + "line": 247, + "lineto": 247, + "tdef": "typedef", + "description": " Interface which represents a transport to communicate with a\n remote.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_transport_cb" + ] + } + } + ], + [ + "git_tree", + { + "decl": "git_tree", + "type": "struct", + "value": "git_tree", + "file": "git2/types.h", + "line": 142, + "lineto": 142, + "tdef": "typedef", + "description": " Representation of a tree object. ", + "comments": "", + "used": { + "returns": [ + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_treebuilder_get" + ], + "needs": [ + "git_apply_to_tree", + "git_commit_amend", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_v", + "git_commit_tree", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_index_read_tree", + "git_merge_trees", + "git_pathspec_match_tree", + "git_tree_create_updated", + "git_tree_dup", + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_tree_entrycount", + "git_tree_free", + "git_tree_id", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_owner", + "git_tree_walk", + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_filter_cb", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer", + "git_treewalk_cb" + ] + } + } + ], + [ + "git_tree_entry", + { + "decl": "git_tree_entry", + "type": "struct", + "value": "git_tree_entry", + "file": "git2/types.h", + "line": 139, + "lineto": 139, + "tdef": "typedef", + "description": " Representation of each one of the entries in a tree object. ", + "comments": "", + "used": { + "returns": [ + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_treebuilder_get" + ], + "needs": [ + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_treebuilder_filter_cb", + "git_treebuilder_insert", + "git_treewalk_cb" + ] + } + } + ], + [ + "git_tree_update", + { + "decl": [ + "git_tree_update_t action", + "git_oid id", + "git_filemode_t filemode", + "const char * path" + ], + "type": "struct", + "value": "git_tree_update", + "file": "git2/tree.h", + "line": 438, + "lineto": 447, + "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", + "tdef": "typedef", + "description": " An action to perform during the update of a tree", + "comments": "", + "fields": [ + { + "type": "git_tree_update_t", + "name": "action", + "comments": " Update action. If it's an removal, only the path is looked at " + }, + { + "type": "git_oid", + "name": "id", + "comments": " The entry's id " + }, + { + "type": "git_filemode_t", + "name": "filemode", + "comments": " The filemode/kind of object " + }, + { + "type": "const char *", + "name": "path", + "comments": " The full path from the root tree " + } + ], + "used": { + "returns": [], + "needs": [ + "git_tree_create_updated" + ] + } + } + ], + [ + "git_tree_update_t", + { + "decl": [ + "GIT_TREE_UPDATE_UPSERT", + "GIT_TREE_UPDATE_REMOVE" + ], + "type": "enum", + "file": "git2/tree.h", + "line": 428, + "lineto": 433, + "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", + "tdef": "typedef", + "description": " The kind of update to perform", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TREE_UPDATE_UPSERT", + "comments": "

Update or insert an entry at the specified path

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TREE_UPDATE_REMOVE", + "comments": "

Remove an entry from the specified path

\n", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_treebuilder", + { + "decl": "git_treebuilder", + "type": "struct", + "value": "git_treebuilder", + "file": "git2/types.h", + "line": 145, + "lineto": 145, + "tdef": "typedef", + "description": " Constructor for in-memory trees ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + } + } + ], + [ + "git_treewalk_mode", + { + "decl": [ + "GIT_TREEWALK_PRE", + "GIT_TREEWALK_POST" + ], + "type": "enum", + "file": "git2/tree.h", + "line": 387, + "lineto": 390, + "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", + "tdef": "typedef", + "description": " Tree traversal modes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TREEWALK_PRE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TREEWALK_POST", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": [ + "git_tree_walk" + ] + } + } + ], + [ + "git_worktree", + { + "decl": "git_worktree", + "type": "struct", + "value": "git_worktree", + "file": "git2/types.h", + "line": 121, + "lineto": 121, + "tdef": "typedef", + "description": " Representation of a working tree ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_repository_open_from_worktree", + "git_worktree_add", + "git_worktree_add_options_init", + "git_worktree_free", + "git_worktree_is_locked", + "git_worktree_is_prunable", + "git_worktree_lock", + "git_worktree_lookup", + "git_worktree_name", + "git_worktree_open_from_repository", + "git_worktree_path", + "git_worktree_prune", + "git_worktree_prune_options_init", + "git_worktree_unlock", + "git_worktree_validate" + ] + } + } + ], + [ + "git_worktree_prune_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags" + ], + "type": "struct", + "value": "git_worktree_prune_options", + "file": "git2/worktree.h", + "line": 204, + "lineto": 209, + "block": "unsigned int version\nuint32_t flags", + "tdef": "typedef", + "description": " Worktree prune options structure", + "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": "" + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_worktree_prune_t` " + } + ], + "used": { + "returns": [], + "needs": [ + "git_worktree_is_prunable", + "git_worktree_prune", + "git_worktree_prune_options_init" + ] + } + } + ], + [ + "git_worktree_prune_t", + { + "decl": [ + "GIT_WORKTREE_PRUNE_VALID", + "GIT_WORKTREE_PRUNE_LOCKED", + "GIT_WORKTREE_PRUNE_WORKING_TREE" + ], + "type": "enum", + "file": "git2/worktree.h", + "line": 188, + "lineto": 195, + "block": "GIT_WORKTREE_PRUNE_VALID\nGIT_WORKTREE_PRUNE_LOCKED\nGIT_WORKTREE_PRUNE_WORKING_TREE", + "tdef": "typedef", + "description": " Flags which can be passed to git_worktree_prune to alter its\n behavior.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_VALID", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_LOCKED", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_WORKING_TREE", + "comments": "", + "value": 4 + } + ], + "used": { + "returns": [], + "needs": [] + } + } + ], + [ + "git_writestream", + { + "decl": [ + "int (*)(git_writestream *, const char *, size_t) write", + "int (*)(git_writestream *) close", + "void (*)(git_writestream *) free" + ], + "type": "struct", + "value": "git_writestream", + "file": "git2/types.h", + "line": 359, + "lineto": 363, + "tdef": null, + "description": " A type to write in a streaming fashion, for example, for filters. ", + "comments": "", + "fields": [ + { + "type": "int (*)(git_writestream *, const char *, size_t)", + "name": "write", + "comments": "" + }, + { + "type": "int (*)(git_writestream *)", + "name": "close", + "comments": "" + }, + { + "type": "void (*)(git_writestream *)", + "name": "free", + "comments": "" + } + ], + "block": "int (*)(git_writestream *, const char *, size_t) write\nint (*)(git_writestream *) close\nvoid (*)(git_writestream *) free", + "used": { + "returns": [], + "needs": [ + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ] ], - [ - "status.c", - "ex/v1.3.1/status.html" + "prefix": "include", + "groups": [ + [ + "annotated", + [ + "git_annotated_commit_free", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_lookup", + "git_annotated_commit_ref" + ] + ], + [ + "apply", + [ + "git_apply", + "git_apply_options_init", + "git_apply_to_tree" + ] + ], + [ + "attr", + [ + "git_attr_add_macro", + "git_attr_cache_flush", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_attr_value" + ] + ], + [ + "blame", + [ + "git_blame_buffer", + "git_blame_file", + "git_blame_free", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_get_hunk_count", + "git_blame_init_options", + "git_blame_options_init" + ] + ], + [ + "blob", + [ + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", + "git_blob_data_is_binary", + "git_blob_dup", + "git_blob_filter", + "git_blob_filter_options_init", + "git_blob_filtered_content", + "git_blob_free", + "git_blob_id", + "git_blob_is_binary", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize" + ] + ], + [ + "branch", + [ + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_is_checked_out", + "git_branch_is_head", + "git_branch_iterator_free", + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_move", + "git_branch_name", + "git_branch_name_is_valid", + "git_branch_next", + "git_branch_remote_name", + "git_branch_set_upstream", + "git_branch_upstream", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote" + ] + ], + [ + "buf", + [ + "git_buf_contains_nul", + "git_buf_dispose", + "git_buf_free", + "git_buf_grow", + "git_buf_is_binary", + "git_buf_set" + ] + ], + [ + "checkout", + [ + "git_checkout_head", + "git_checkout_index", + "git_checkout_options_init", + "git_checkout_tree" + ] + ], + [ + "cherrypick", + [ + "git_cherrypick", + "git_cherrypick_commit", + "git_cherrypick_options_init" + ] + ], + [ + "clone", + [ + "git_clone", + "git_clone_options_init" + ] + ], + [ + "commit", + [ + "git_commit_amend", + "git_commit_author", + "git_commit_author_with_mailmap", + "git_commit_body", + "git_commit_committer", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_dup", + "git_commit_extract_signature", + "git_commit_free", + "git_commit_header_field", + "git_commit_id", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_message", + "git_commit_message_encoding", + "git_commit_message_raw", + "git_commit_nth_gen_ancestor", + "git_commit_owner", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_parentcount", + "git_commit_raw_header", + "git_commit_summary", + "git_commit_time", + "git_commit_time_offset", + "git_commit_tree", + "git_commit_tree_id" + ] + ], + [ + "config", + [ + "git_config_add_file_ondisk", + "git_config_backend_foreach_match", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_entry_free", + "git_config_find_global", + "git_config_find_programdata", + "git_config_find_system", + "git_config_find_xdg", + "git_config_foreach", + "git_config_foreach_match", + "git_config_free", + "git_config_get_bool", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_mapped", + "git_config_get_multivar_foreach", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_lock", + "git_config_lookup_map_value", + "git_config_multivar_iterator_new", + "git_config_new", + "git_config_next", + "git_config_open_default", + "git_config_open_global", + "git_config_open_level", + "git_config_open_ondisk", + "git_config_parse_bool", + "git_config_parse_int32", + "git_config_parse_int64", + "git_config_parse_path", + "git_config_set_bool", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_multivar", + "git_config_set_string", + "git_config_snapshot" + ] + ], + [ + "credential", + [ + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" + ] + ], + [ + "describe", + [ + "git_describe_commit", + "git_describe_format", + "git_describe_format_options_init", + "git_describe_options_init", + "git_describe_result_free", + "git_describe_workdir" + ] + ], + [ + "diff", + [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_find_options_init", + "git_diff_find_similar", + "git_diff_foreach", + "git_diff_format_email", + "git_diff_format_email_options_init", + "git_diff_free", + "git_diff_from_buffer", + "git_diff_get_delta", + "git_diff_get_stats", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_is_sorted_icase", + "git_diff_merge", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_options_init", + "git_diff_patchid", + "git_diff_patchid_options_init", + "git_diff_print", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf", + "git_diff_status_char", + "git_diff_to_buf", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index" + ] + ], + [ + "error", + [ + "git_error_clear", + "git_error_last", + "git_error_set", + "git_error_set_oom", + "git_error_set_str" + ] + ], + [ + "fetch", + [ + "git_fetch_options_init" + ] + ], + [ + "filter", + [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + ], + [ + "giterr", + [ + "giterr_clear", + "giterr_last", + "giterr_set_oom", + "giterr_set_str" + ] + ], + [ + "graph", + [ + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any" + ] + ], + [ + "ignore", + [ + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored" + ] + ], + [ + "index", + [ + "git_index_add", + "git_index_add_all", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_caps", + "git_index_checksum", + "git_index_clear", + "git_index_conflict_add", + "git_index_conflict_cleanup", + "git_index_conflict_get", + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_remove", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_entrycount", + "git_index_find", + "git_index_find_prefix", + "git_index_free", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_owner", + "git_index_path", + "git_index_read", + "git_index_read_tree", + "git_index_remove", + "git_index_remove_all", + "git_index_remove_bypath", + "git_index_remove_directory", + "git_index_set_caps", + "git_index_set_version", + "git_index_update_all", + "git_index_version", + "git_index_write", + "git_index_write_tree", + "git_index_write_tree_to" + ] + ], + [ + "indexer", + [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init" + ] + ], + [ + "libgit2", + [ + "git_libgit2_features", + "git_libgit2_init", + "git_libgit2_opts", + "git_libgit2_prerelease", + "git_libgit2_shutdown", + "git_libgit2_version" + ] + ], + [ + "mailmap", + [ + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + ], + [ + "merge", + [ + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_merge_commits", + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_input_init", + "git_merge_file_options_init", + "git_merge_file_result_free", + "git_merge_options_init", + "git_merge_trees" + ] + ], + [ + "message", + [ + "git_message_prettify", + "git_message_trailer_array_free", + "git_message_trailers" + ] + ], + [ + "note", + [ + "git_note_author", + "git_note_commit_create", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_committer", + "git_note_create", + "git_note_default_ref", + "git_note_foreach", + "git_note_free", + "git_note_id", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_message", + "git_note_next", + "git_note_read", + "git_note_remove" + ] + ], + [ + "object", + [ + "git_object__size", + "git_object_dup", + "git_object_free", + "git_object_id", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_owner", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_short_id", + "git_object_string2type", + "git_object_type", + "git_object_type2string", + "git_object_typeisloose" + ] + ], + [ + "odb", + [ + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_add_disk_alternate", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_foreach", + "git_odb_free", + "git_odb_get_backend", + "git_odb_num_backends", + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_refresh", + "git_odb_set_commit_graph", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write", + "git_odb_write", + "git_odb_write_multi_pack_index", + "git_odb_write_pack" + ] + ], + [ + "oid", + [ + "git_oid_cmp", + "git_oid_cpy", + "git_oid_equal", + "git_oid_fmt", + "git_oid_is_zero", + "git_oid_ncmp", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_shorten_new", + "git_oid_strcmp", + "git_oid_streq", + "git_oid_tostr", + "git_oid_tostr_s" + ] + ], + [ + "oidarray", + [ + "git_oidarray_dispose", + "git_oidarray_free" + ] + ], + [ + "packbuilder", + [ + "git_packbuilder_foreach", + "git_packbuilder_free", + "git_packbuilder_hash", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_walk", + "git_packbuilder_name", + "git_packbuilder_new", + "git_packbuilder_object_count", + "git_packbuilder_set_callbacks", + "git_packbuilder_set_threads", + "git_packbuilder_write", + "git_packbuilder_write_buf", + "git_packbuilder_written" + ] + ], + [ + "patch", + [ + "git_patch_free", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_delta", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_line_stats", + "git_patch_num_hunks", + "git_patch_num_lines_in_hunk", + "git_patch_owner", + "git_patch_print", + "git_patch_size", + "git_patch_to_buf" + ] + ], + [ + "pathspec", + [ + "git_pathspec_free", + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir", + "git_pathspec_matches_path", + "git_pathspec_new" + ] + ], + [ + "proxy", + [ + "git_proxy_options_init" + ] + ], + [ + "push", + [ + "git_push_options_init" + ] + ], + [ + "rebase", + [ + "git_rebase_abort", + "git_rebase_commit", + "git_rebase_finish", + "git_rebase_free", + "git_rebase_init", + "git_rebase_inmemory_index", + "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", + "git_rebase_open", + "git_rebase_operation_byindex", + "git_rebase_operation_current", + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" + ] + ], + [ + "refdb", + [ + "git_refdb_compress", + "git_refdb_free", + "git_refdb_new", + "git_refdb_open" + ] + ], + [ + "reference", + [ + "git_reference_cmp", + "git_reference_create", + "git_reference_create_matching", + "git_reference_delete", + "git_reference_dup", + "git_reference_dwim", + "git_reference_ensure_log", + "git_reference_foreach", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_free", + "git_reference_has_log", + "git_reference_is_branch", + "git_reference_is_note", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_is_valid_name", + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_list", + "git_reference_lookup", + "git_reference_name", + "git_reference_name_is_valid", + "git_reference_name_to_id", + "git_reference_next", + "git_reference_next_name", + "git_reference_normalize_name", + "git_reference_owner", + "git_reference_peel", + "git_reference_remove", + "git_reference_rename", + "git_reference_resolve", + "git_reference_set_target", + "git_reference_shorthand", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_set_target", + "git_reference_symbolic_target", + "git_reference_target", + "git_reference_target_peel", + "git_reference_type" + ] + ], + [ + "reflog", + [ + "git_reflog_append", + "git_reflog_delete", + "git_reflog_drop", + "git_reflog_entry_byindex", + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message", + "git_reflog_entrycount", + "git_reflog_free", + "git_reflog_read", + "git_reflog_rename", + "git_reflog_write" + ] + ], + [ + "refspec", + [ + "git_refspec_direction", + "git_refspec_dst", + "git_refspec_dst_matches", + "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", + "git_refspec_rtransform", + "git_refspec_src", + "git_refspec_src_matches", + "git_refspec_string", + "git_refspec_transform" + ] + ], + [ + "remote", + [ + "git_remote_add_fetch", + "git_remote_add_push", + "git_remote_autotag", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_connect_options_init", + "git_remote_connected", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_detached", + "git_remote_create_options_init", + "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", + "git_remote_default_branch", + "git_remote_delete", + "git_remote_disconnect", + "git_remote_download", + "git_remote_dup", + "git_remote_fetch", + "git_remote_free", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_get_refspec", + "git_remote_init_callbacks", + "git_remote_is_valid_name", + "git_remote_list", + "git_remote_lookup", + "git_remote_ls", + "git_remote_name", + "git_remote_name_is_valid", + "git_remote_owner", + "git_remote_prune", + "git_remote_prune_refs", + "git_remote_push", + "git_remote_pushurl", + "git_remote_refspec_count", + "git_remote_rename", + "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", + "git_remote_set_pushurl", + "git_remote_set_url", + "git_remote_stats", + "git_remote_stop", + "git_remote_update_tips", + "git_remote_upload", + "git_remote_url" + ] + ], + [ + "repository", + [ + "git_repository_commondir", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_detach_head", + "git_repository_discover", + "git_repository_fetchhead_foreach", + "git_repository_free", + "git_repository_get_namespace", + "git_repository_hashfile", + "git_repository_head", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_for_worktree", + "git_repository_head_unborn", + "git_repository_ident", + "git_repository_index", + "git_repository_init", + "git_repository_init_ext", + "git_repository_init_options_init", + "git_repository_is_bare", + "git_repository_is_empty", + "git_repository_is_shallow", + "git_repository_is_worktree", + "git_repository_item_path", + "git_repository_mergehead_foreach", + "git_repository_message", + "git_repository_message_remove", + "git_repository_odb", + "git_repository_oid_type", + "git_repository_open", + "git_repository_open_bare", + "git_repository_open_ext", + "git_repository_open_from_worktree", + "git_repository_path", + "git_repository_refdb", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_set_ident", + "git_repository_set_namespace", + "git_repository_set_workdir", + "git_repository_state", + "git_repository_state_cleanup", + "git_repository_workdir" + ] + ], + [ + "reset", + [ + "git_reset", + "git_reset_default", + "git_reset_from_annotated" + ] + ], + [ + "revert", + [ + "git_revert", + "git_revert_commit", + "git_revert_options_init" + ] + ], + [ + "revparse", + [ + "git_revparse", + "git_revparse_ext", + "git_revparse_single" + ] + ], + [ + "revwalk", + [ + "git_revwalk_add_hide_cb", + "git_revwalk_free", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_hide_ref", + "git_revwalk_new", + "git_revwalk_next", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_push_range", + "git_revwalk_push_ref", + "git_revwalk_repository", + "git_revwalk_reset", + "git_revwalk_simplify_first_parent", + "git_revwalk_sorting" + ] + ], + [ + "signature", + [ + "git_signature_default", + "git_signature_dup", + "git_signature_free", + "git_signature_from_buffer", + "git_signature_new", + "git_signature_now" + ] + ], + [ + "stash", + [ + "git_stash_apply", + "git_stash_apply_options_init", + "git_stash_drop", + "git_stash_foreach", + "git_stash_pop", + "git_stash_save", + "git_stash_save_options_init", + "git_stash_save_with_opts" + ] + ], + [ + "status", + [ + "git_status_byindex", + "git_status_file", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_list_entrycount", + "git_status_list_free", + "git_status_list_new", + "git_status_options_init", + "git_status_should_ignore" + ] + ], + [ + "strarray", + [ + "git_strarray_copy", + "git_strarray_dispose", + "git_strarray_free" + ] + ], + [ + "submodule", + [ + "git_submodule_add_finalize", + "git_submodule_add_setup", + "git_submodule_add_to_index", + "git_submodule_branch", + "git_submodule_clone", + "git_submodule_dup", + "git_submodule_fetch_recurse_submodules", + "git_submodule_foreach", + "git_submodule_free", + "git_submodule_head_id", + "git_submodule_ignore", + "git_submodule_index_id", + "git_submodule_init", + "git_submodule_location", + "git_submodule_lookup", + "git_submodule_name", + "git_submodule_open", + "git_submodule_owner", + "git_submodule_path", + "git_submodule_reload", + "git_submodule_repo_init", + "git_submodule_resolve_url", + "git_submodule_set_branch", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_set_url", + "git_submodule_status", + "git_submodule_sync", + "git_submodule_update", + "git_submodule_update_options_init", + "git_submodule_update_strategy", + "git_submodule_url", + "git_submodule_wd_id" + ] + ], + [ + "tag", + [ + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_dup", + "git_tag_foreach", + "git_tag_free", + "git_tag_id", + "git_tag_list", + "git_tag_list_match", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_message", + "git_tag_name", + "git_tag_name_is_valid", + "git_tag_owner", + "git_tag_peel", + "git_tag_tagger", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type" + ] + ], + [ + "trace", + [ + "git_trace_set" + ] + ], + [ + "transaction", + [ + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + ], + [ + "tree", + [ + "git_tree_create_updated", + "git_tree_dup", + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_tree_entrycount", + "git_tree_free", + "git_tree_id", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_owner", + "git_tree_walk" + ] + ], + [ + "treebuilder", + [ + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + ], + [ + "worktree", + [ + "git_worktree_add", + "git_worktree_add_options_init", + "git_worktree_free", + "git_worktree_is_locked", + "git_worktree_is_prunable", + "git_worktree_list", + "git_worktree_lock", + "git_worktree_lookup", + "git_worktree_name", + "git_worktree_open_from_repository", + "git_worktree_path", + "git_worktree_prune", + "git_worktree_prune_options_init", + "git_worktree_unlock", + "git_worktree_validate" + ] + ] ], - [ - "tag.c", - "ex/v1.3.1/tag.html" + "examples": [ + [ + "add.c", + "ex/v1.7.2/add.html" + ], + [ + "args.c", + "ex/v1.7.2/args.html" + ], + [ + "blame.c", + "ex/v1.7.2/blame.html" + ], + [ + "cat-file.c", + "ex/v1.7.2/cat-file.html" + ], + [ + "checkout.c", + "ex/v1.7.2/checkout.html" + ], + [ + "clone.c", + "ex/v1.7.2/clone.html" + ], + [ + "commit.c", + "ex/v1.7.2/commit.html" + ], + [ + "common.c", + "ex/v1.7.2/common.html" + ], + [ + "config.c", + "ex/v1.7.2/config.html" + ], + [ + "describe.c", + "ex/v1.7.2/describe.html" + ], + [ + "diff.c", + "ex/v1.7.2/diff.html" + ], + [ + "fetch.c", + "ex/v1.7.2/fetch.html" + ], + [ + "for-each-ref.c", + "ex/v1.7.2/for-each-ref.html" + ], + [ + "general.c", + "ex/v1.7.2/general.html" + ], + [ + "index-pack.c", + "ex/v1.7.2/index-pack.html" + ], + [ + "init.c", + "ex/v1.7.2/init.html" + ], + [ + "lg2.c", + "ex/v1.7.2/lg2.html" + ], + [ + "log.c", + "ex/v1.7.2/log.html" + ], + [ + "ls-files.c", + "ex/v1.7.2/ls-files.html" + ], + [ + "ls-remote.c", + "ex/v1.7.2/ls-remote.html" + ], + [ + "merge.c", + "ex/v1.7.2/merge.html" + ], + [ + "push.c", + "ex/v1.7.2/push.html" + ], + [ + "remote.c", + "ex/v1.7.2/remote.html" + ], + [ + "rev-list.c", + "ex/v1.7.2/rev-list.html" + ], + [ + "rev-parse.c", + "ex/v1.7.2/rev-parse.html" + ], + [ + "show-index.c", + "ex/v1.7.2/show-index.html" + ], + [ + "stash.c", + "ex/v1.7.2/stash.html" + ], + [ + "status.c", + "ex/v1.7.2/status.html" + ], + [ + "tag.c", + "ex/v1.7.2/tag.html" + ] ] - ] } \ No newline at end of file diff --git a/vendor/libgit2 b/vendor/libgit2 index 0ac7af7cd..efdaa4ac7 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 0ac7af7cd914316e2d3c7d7337ae78618c19c2a2 +Subproject commit efdaa4ac71e067f0c178e94a0c7d4e197bded48d diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 4767545bc..1c5d1c876 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -22,7 +22,8 @@ "GIT_SSH", "GIT_SSH_MEMORY_CREDENTIALS", "LIBGIT2_NO_FEATURES_H", - "GIT_SHA1_COLLISIONDETECT", + "GIT_SHA1_OPENSSL", + "GIT_SHA256_OPENSSL", "GIT_USE_NSEC", "GIT_HTTPS", # Node's util.h may be accidentally included so use this to guard @@ -35,294 +36,160 @@ "libssh2" ], "sources": [ - "libgit2/include/git2/sys/hashsig.h", - "libgit2/include/git2/sys/merge.h", - "libgit2/include/git2/worktree.h", - "libgit2/src/allocators/failalloc.c", - "libgit2/src/allocators/failalloc.h", - "libgit2/src/allocators/stdalloc.c", - "libgit2/src/allocators/stdalloc.h", - "libgit2/src/commit.c", - "libgit2/src/commit.h", - "libgit2/src/commit_graph.c", - "libgit2/src/commit_graph.h", - "libgit2/src/custom_tls.c", - "libgit2/src/custom_tls.h", - "libgit2/src/alloc.c", - "libgit2/src/alloc.h", - "libgit2/src/annotated_commit.c", - "libgit2/src/annotated_commit.h", - "libgit2/src/apply.c", - "libgit2/src/apply.h", - "libgit2/src/array.h", - "libgit2/src/assert_safe.h", - "libgit2/src/attr_file.c", - "libgit2/src/attr_file.h", - "libgit2/src/attr.c", - "libgit2/src/attr.h", - "libgit2/src/attrcache.c", - "libgit2/src/attrcache.h", - "libgit2/src/bitvec.h", - "libgit2/src/blame_git.c", - "libgit2/src/blame_git.h", - "libgit2/src/blame.c", - "libgit2/src/blame.h", - "libgit2/src/blob.c", - "libgit2/src/blob.h", - "libgit2/src/branch.c", - "libgit2/src/branch.h", - "libgit2/src/buffer.c", - "libgit2/src/buffer.h", - "libgit2/src/cache.c", - "libgit2/src/cache.h", - "libgit2/src/cc-compat.h", - "libgit2/src/checkout.c", - "libgit2/src/checkout.h", - "libgit2/src/cherrypick.c", - "libgit2/src/clone.c", - "libgit2/src/clone.h", - "libgit2/src/commit_list.c", - "libgit2/src/commit_list.h", - "libgit2/src/common.h", - "libgit2/src/config_backend.h", - "libgit2/src/config_cache.c", - "libgit2/src/config_entries.c", - "libgit2/src/config_entries.h", - "libgit2/src/config_file.c", - "libgit2/src/config_mem.c", - "libgit2/src/config_parse.c", - "libgit2/src/config_parse.h", - "libgit2/src/config_snapshot.c", - "libgit2/src/config.c", - "libgit2/src/config.h", - "libgit2/src/crlf.c", - "libgit2/src/date.c", - "libgit2/src/delta.c", - "libgit2/src/delta.h", - "libgit2/src/diff_driver.c", - "libgit2/src/diff_driver.h", - "libgit2/src/diff_file.c", - "libgit2/src/diff_file.h", - "libgit2/src/diff_generate.c", - "libgit2/src/diff_generate.h", - "libgit2/src/diff_parse.c", - "libgit2/src/diff_parse.h", - "libgit2/src/diff_print.c", - "libgit2/src/diff_stats.c", - "libgit2/src/diff_tform.c", - "libgit2/src/diff_tform.h", - "libgit2/src/diff_xdiff.c", - "libgit2/src/diff_xdiff.h", - "libgit2/src/diff.c", - "libgit2/src/diff.h", - "libgit2/src/errors.c", - "libgit2/src/errors.h", - "libgit2/src/email.c", - "libgit2/src/email.h", - "libgit2/src/fetch.c", - "libgit2/src/fetch.h", - "libgit2/src/fetchhead.c", - "libgit2/src/fetchhead.h", - "libgit2/src/filebuf.c", - "libgit2/src/filebuf.h", - "libgit2/src/futils.c", - "libgit2/src/futils.h", - "libgit2/src/filter.c", - "libgit2/src/filter.h", - "libgit2/src/global.h", - "libgit2/src/graph.c", - "libgit2/src/hash.c", - "libgit2/src/hash.h", - "libgit2/src/hash/sha1.h", - "libgit2/src/hash/sha1/sha1dc/sha1.c", - "libgit2/src/hash/sha1/sha1dc/sha1.h", - "libgit2/src/hash/sha1/sha1dc/ubc_check.c", - "libgit2/src/hash/sha1/sha1dc/ubc_check.h", - "libgit2/src/hash/sha1/collisiondetect.c", - "libgit2/src/hash/sha1/collisiondetect.h", - "libgit2/src/hashsig.c", - "libgit2/src/ident.c", - "libgit2/src/idxmap.c", - "libgit2/src/ignore.c", - "libgit2/src/ignore.h", - "libgit2/src/index.c", - "libgit2/src/index.h", - "libgit2/src/indexer.c", - "libgit2/src/indexer.h", - "libgit2/src/iterator.c", - "libgit2/src/iterator.h", - "libgit2/src/khash.h", - "libgit2/src/libgit2.c", - "libgit2/src/libgit2.h", - "libgit2/src/mailmap.c", - "libgit2/src/mailmap.h", - "libgit2/src/map.h", - "libgit2/src/midx.c", - "libgit2/src/midx.h", - "libgit2/src/merge_driver.c", - "libgit2/src/merge_file.c", - "libgit2/src/merge.c", - "libgit2/src/merge.h", - "libgit2/src/message.c", - "libgit2/src/message.h", - "libgit2/src/mwindow.c", - "libgit2/src/mwindow.h", - "libgit2/src/net.c", - "libgit2/src/net.h", - "libgit2/src/netops.c", - "libgit2/src/netops.h", - "libgit2/src/notes.c", - "libgit2/src/notes.h", - "libgit2/src/object_api.c", - "libgit2/src/object.c", - "libgit2/src/object.h", - "libgit2/src/odb_loose.c", - "libgit2/src/odb_mempack.c", - "libgit2/src/odb_pack.c", - "libgit2/src/odb.c", - "libgit2/src/odb.h", - "libgit2/src/offmap.c", - "libgit2/src/offmap.h", - "libgit2/src/oid.c", - "libgit2/src/oid.h", - "libgit2/src/oidarray.c", - "libgit2/src/oidarray.h", - "libgit2/src/oidmap.c", - "libgit2/src/oidmap.h", - "libgit2/src/pack-objects.c", - "libgit2/src/pack-objects.h", - "libgit2/src/pack.c", - "libgit2/src/pack.h", - "libgit2/src/parse.c", - "libgit2/src/parse.h", - "libgit2/src/patch_generate.c", - "libgit2/src/patch_generate.h", - "libgit2/src/patch_parse.c", - "libgit2/src/patch_parse.h", - "libgit2/src/patch.c", - "libgit2/src/patch.h", - "libgit2/src/path.c", - "libgit2/src/path.h", - "libgit2/src/pathspec.c", - "libgit2/src/pathspec.h", - "libgit2/src/pool.c", - "libgit2/src/pool.h", - "libgit2/src/posix.c", - "libgit2/src/posix.h", - "libgit2/src/pqueue.c", - "libgit2/src/pqueue.h", - "libgit2/src/proxy.c", - "libgit2/src/push.c", - "libgit2/src/push.h", - "libgit2/src/reader.c", - "libgit2/src/reader.h", - "libgit2/src/rebase.c", - "libgit2/src/refdb_fs.c", - "libgit2/src/refdb.c", - "libgit2/src/refdb.h", - "libgit2/src/reflog.c", - "libgit2/src/reflog.h", - "libgit2/src/refs.c", - "libgit2/src/refs.h", - "libgit2/src/refspec.c", - "libgit2/src/refspec.h", - "libgit2/src/regexp.c", - "libgit2/src/regexp.h", - "libgit2/src/remote.c", - "libgit2/src/remote.h", - "libgit2/src/repo_template.h", - "libgit2/src/repository.c", - "libgit2/src/repository.h", - "libgit2/src/reset.c", - "libgit2/src/revert.c", - "libgit2/src/revparse.c", - "libgit2/src/revwalk.c", - "libgit2/src/revwalk.h", - "libgit2/src/runtime.c", - "libgit2/src/runtime.h", - "libgit2/src/settings.h", - "libgit2/src/signature.c", - "libgit2/src/signature.h", - "libgit2/src/streams/socket.c", - "libgit2/src/streams/socket.h", - "libgit2/src/streams/openssl_legacy.c", - "libgit2/src/streams/openssl_legacy.h", - "libgit2/src/sortedcache.c", - "libgit2/src/sortedcache.h", - "libgit2/src/stash.c", - "libgit2/src/status.c", - "libgit2/src/status.h", - "libgit2/src/strarray.c", - "libgit2/src/streams/mbedtls.c", - "libgit2/src/streams/mbedtls.h", - "libgit2/src/streams/openssl.c", - "libgit2/src/streams/openssl.h", - "libgit2/src/streams/registry.c", - "libgit2/src/streams/registry.h", - "libgit2/src/strmap.c", - "libgit2/src/strmap.h", - "libgit2/src/strnlen.h", - "libgit2/src/submodule.c", - "libgit2/src/submodule.h", - "libgit2/src/sysdir.c", - "libgit2/src/sysdir.h", - "libgit2/src/tag.c", - "libgit2/src/tag.h", - "libgit2/src/thread.c", - "libgit2/src/thread.h", - "libgit2/src/threadstate.c", - "libgit2/src/threadstate.h", - "libgit2/src/trace.c", - "libgit2/src/trace.h", - "libgit2/src/trailer.c", - "libgit2/src/transaction.c", - "libgit2/src/transport.c", - "libgit2/src/transports/credential_helpers.c", - "libgit2/src/transports/credential.c", - "libgit2/src/transports/git.c", - "libgit2/src/transports/local.c", - "libgit2/src/transports/httpclient.h", - "libgit2/src/transports/httpclient.c", - "libgit2/src/transports/smart_pkt.c", - "libgit2/src/transports/smart_protocol.c", - "libgit2/src/transports/smart.c", - "libgit2/src/transports/smart.h", - "libgit2/src/transports/ssh.c", - "libgit2/src/tree-cache.c", - "libgit2/src/tree-cache.h", - "libgit2/src/tree.c", - "libgit2/src/tree.h", - "libgit2/src/tsort.c", - "libgit2/src/userdiff.h", - "libgit2/src/util.c", - "libgit2/src/util.h", - "libgit2/src/utf8.c", - "libgit2/src/utf8.h", - "libgit2/src/varint.c", - "libgit2/src/varint.h", - "libgit2/src/vector.c", - "libgit2/src/vector.h", - "libgit2/src/wildmatch.c", - "libgit2/src/wildmatch.h", - "libgit2/src/worktree.c", - "libgit2/src/worktree.h", - "libgit2/src/xdiff/xdiff.h", - "libgit2/src/xdiff/xdiffi.c", - "libgit2/src/xdiff/xdiffi.h", - "libgit2/src/xdiff/xemit.c", - "libgit2/src/xdiff/xemit.h", - "libgit2/src/xdiff/xhistogram.c", - "libgit2/src/xdiff/xinclude.h", - "libgit2/src/xdiff/xmacros.h", - "libgit2/src/xdiff/xmerge.c", - "libgit2/src/xdiff/xpatience.c", - "libgit2/src/xdiff/xprepare.c", - "libgit2/src/xdiff/xprepare.h", - "libgit2/src/xdiff/xtypes.h", - "libgit2/src/xdiff/xutils.c", - "libgit2/src/xdiff/xutils.h", - "libgit2/src/zstream.c", - "libgit2/src/zstream.h" + "libgit2/src/libgit2/annotated_commit.c", + "libgit2/src/libgit2/apply.c", + "libgit2/src/libgit2/attr.c", + "libgit2/src/libgit2/attr_file.c", + "libgit2/src/libgit2/attrcache.c", + "libgit2/src/libgit2/blame.c", + "libgit2/src/libgit2/blame_git.c", + "libgit2/src/libgit2/blob.c", + "libgit2/src/libgit2/branch.c", + "libgit2/src/libgit2/buf.c", + "libgit2/src/libgit2/cache.c", + "libgit2/src/libgit2/checkout.c", + "libgit2/src/libgit2/cherrypick.c", + "libgit2/src/libgit2/clone.c", + "libgit2/src/libgit2/commit.c", + "libgit2/src/libgit2/commit_graph.c", + "libgit2/src/libgit2/commit_list.c", + "libgit2/src/libgit2/config.c", + "libgit2/src/libgit2/config_cache.c", + "libgit2/src/libgit2/config_entries.c", + "libgit2/src/libgit2/config_file.c", + "libgit2/src/libgit2/config_mem.c", + "libgit2/src/libgit2/config_parse.c", + "libgit2/src/libgit2/config_snapshot.c", + "libgit2/src/libgit2/crlf.c", + "libgit2/src/libgit2/delta.c", + "libgit2/src/libgit2/diff.c", + "libgit2/src/libgit2/diff_driver.c", + "libgit2/src/libgit2/diff_file.c", + "libgit2/src/libgit2/diff_generate.c", + "libgit2/src/libgit2/diff_parse.c", + "libgit2/src/libgit2/diff_print.c", + "libgit2/src/libgit2/diff_stats.c", + "libgit2/src/libgit2/diff_tform.c", + "libgit2/src/libgit2/diff_xdiff.c", + "libgit2/src/libgit2/email.c", + "libgit2/src/libgit2/errors.c", + "libgit2/src/libgit2/fetch.c", + "libgit2/src/libgit2/fetchhead.c", + "libgit2/src/libgit2/filter.c", + "libgit2/src/libgit2/graph.c", + "libgit2/src/libgit2/hashsig.c", + "libgit2/src/libgit2/ident.c", + "libgit2/src/libgit2/idxmap.c", + "libgit2/src/libgit2/ignore.c", + "libgit2/src/libgit2/index.c", + "libgit2/src/libgit2/indexer.c", + "libgit2/src/libgit2/iterator.c", + "libgit2/src/libgit2/libgit2.c", + "libgit2/src/libgit2/mailmap.c", + "libgit2/src/libgit2/merge.c", + "libgit2/src/libgit2/merge_driver.c", + "libgit2/src/libgit2/merge_file.c", + "libgit2/src/libgit2/message.c", + "libgit2/src/libgit2/midx.c", + "libgit2/src/libgit2/mwindow.c", + "libgit2/src/libgit2/notes.c", + "libgit2/src/libgit2/object.c", + "libgit2/src/libgit2/object_api.c", + "libgit2/src/libgit2/odb.c", + "libgit2/src/libgit2/odb_loose.c", + "libgit2/src/libgit2/odb_mempack.c", + "libgit2/src/libgit2/odb_pack.c", + "libgit2/src/libgit2/offmap.c", + "libgit2/src/libgit2/oid.c", + "libgit2/src/libgit2/oidarray.c", + "libgit2/src/libgit2/oidmap.c", + "libgit2/src/libgit2/pack-objects.c", + "libgit2/src/libgit2/pack.c", + "libgit2/src/libgit2/parse.c", + "libgit2/src/libgit2/patch.c", + "libgit2/src/libgit2/patch_generate.c", + "libgit2/src/libgit2/patch_parse.c", + "libgit2/src/libgit2/path.c", + "libgit2/src/libgit2/pathspec.c", + "libgit2/src/libgit2/proxy.c", + "libgit2/src/libgit2/push.c", + "libgit2/src/libgit2/reader.c", + "libgit2/src/libgit2/rebase.c", + "libgit2/src/libgit2/refdb.c", + "libgit2/src/libgit2/refdb_fs.c", + "libgit2/src/libgit2/reflog.c", + "libgit2/src/libgit2/refs.c", + "libgit2/src/libgit2/refspec.c", + "libgit2/src/libgit2/remote.c", + "libgit2/src/libgit2/repository.c", + "libgit2/src/libgit2/reset.c", + "libgit2/src/libgit2/revert.c", + "libgit2/src/libgit2/revparse.c", + "libgit2/src/libgit2/revwalk.c", + "libgit2/src/libgit2/signature.c", + "libgit2/src/libgit2/stash.c", + "libgit2/src/libgit2/status.c", + "libgit2/src/libgit2/strarray.c", + "libgit2/src/libgit2/streams/mbedtls.c", + "libgit2/src/libgit2/streams/openssl.c", + "libgit2/src/libgit2/streams/openssl_legacy.c", + "libgit2/src/libgit2/streams/registry.c", + "libgit2/src/libgit2/streams/socket.c", + "libgit2/src/libgit2/submodule.c", + "libgit2/src/libgit2/sysdir.c", + "libgit2/src/libgit2/tag.c", + "libgit2/src/libgit2/threadstate.c", + "libgit2/src/libgit2/trace.c", + "libgit2/src/libgit2/trailer.c", + "libgit2/src/libgit2/transaction.c", + "libgit2/src/libgit2/transport.c", + "libgit2/src/libgit2/transports/credential.c", + "libgit2/src/libgit2/transports/credential_helpers.c", + "libgit2/src/libgit2/transports/git.c", + "libgit2/src/libgit2/transports/httpclient.c", + "libgit2/src/libgit2/transports/local.c", + "libgit2/src/libgit2/transports/smart.c", + "libgit2/src/libgit2/transports/smart_pkt.c", + "libgit2/src/libgit2/transports/smart_protocol.c", + "libgit2/src/libgit2/transports/ssh.c", + "libgit2/src/libgit2/tree-cache.c", + "libgit2/src/libgit2/tree.c", + "libgit2/src/libgit2/worktree.c", + "libgit2/deps/xdiff/xdiffi.c", + "libgit2/deps/xdiff/xemit.c", + "libgit2/deps/xdiff/xhistogram.c", + "libgit2/deps/xdiff/xmerge.c", + "libgit2/deps/xdiff/xpatience.c", + "libgit2/deps/xdiff/xprepare.c", + "libgit2/deps/xdiff/xutils.c", + "libgit2/src/util/alloc.c", + "libgit2/src/util/allocators/failalloc.c", + "libgit2/src/util/allocators/stdalloc.c", + "libgit2/src/util/custom_tls.c", + "libgit2/src/util/date.c", + "libgit2/src/util/filebuf.c", + "libgit2/src/util/fs_path.c", + "libgit2/src/util/futils.c", + "libgit2/src/util/hash.c", + "libgit2/src/util/hash/openssl.c", + "libgit2/src/util/net.c", + "libgit2/src/util/pool.c", + "libgit2/src/util/posix.c", + "libgit2/src/util/pqueue.c", + "libgit2/src/util/rand.c", + "libgit2/src/util/regexp.c", + "libgit2/src/util/runtime.c", + "libgit2/src/util/sortedcache.c", + "libgit2/src/util/str.c", + "libgit2/src/util/strmap.c", + "libgit2/src/util/thread.c", + "libgit2/src/util/tsort.c", + "libgit2/src/util/utf8.c", + "libgit2/src/util/util.c", + "libgit2/src/util/varint.c", + "libgit2/src/util/vector.c", + "libgit2/src/util/wildmatch.c", + "libgit2/src/util/zstream.c", ], "conditions": [ ["target_arch=='x64'", { @@ -342,8 +209,7 @@ "GIT_USE_ICONV" ], "sources": [ - "libgit2/src/streams/stransport.c", - "libgit2/src/streams/stransport.h" + "libgit2/src/libgit2/streams/stransport.c", ], "libraries": [ "-liconv", @@ -368,22 +234,18 @@ "dependencies": [ "ntlmclient" ], - "include_dirs": ["libgit2/deps/ntlmclient"], + "include_dirs": [ + "libgit2/deps/ntlmclient" + ], "defines": [ "GIT_NTLM", - "GIT_GSSAPI" + "GIT_GSSAPI", + "GIT_IO_POLL" # theres a chance this breaks bsd ], "sources": [ - "libgit2/src/transports/http.c", - "libgit2/src/transports/http.h", - "libgit2/src/transports/auth.h", - "libgit2/src/transports/auth.c", - "libgit2/src/transports/auth_negotiate.c", - "libgit2/src/transports/auth_negotiate.h", - "libgit2/src/transports/auth_ntlm.c", - "libgit2/src/transports/auth_ntlm.h", - "libgit2/src/streams/tls.c", - "libgit2/src/streams/tls.h" + "libgit2/src/libgit2/streams/tls.c", + "libgit2/src/libgit2/transports/auth.c", + "libgit2/src/libgit2/transports/http.c", ], "cflags": [ " Date: Wed, 7 Feb 2024 12:52:20 -0700 Subject: [PATCH 452/545] remove partial-stash supplement definitions this has been upstreamed --- generate/input/libgit2-supplement.json | 112 ------------------------- 1 file changed, 112 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 98f8eb8d8..557410cfc 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1014,44 +1014,6 @@ }, "group": "status_list" }, - "git_stash_save_options_init": { - "file": "git2/stash.h", - "args": [ - { - "name": "opts", - "type": "git_stash_save_options *" - }, - { - "name": "version", - "type": "unsigned int" - } - ], - "return": { - "type": "int" - }, - "group": "stash" - }, - "git_stash_save_with_opts": { - "file": "git2/stash.h", - "args": [ - { - "name": "out", - "type": "git_oid *" - }, - { - "name": "repo", - "type": "git_repository *" - }, - { - "name": "opts", - "type": "git_stash_save_options *" - } - ], - "return": { - "type": "int" - }, - "group": "stash" - }, "git_tree_get_all_filepaths": { "args": [ { @@ -1278,13 +1240,6 @@ "git_revwalk_file_history_walk" ] ], - [ - "stash", - [ - "git_stash_save_options_init", - "git_stash_save_with_opts" - ] - ], [ "status_list", [ @@ -1899,73 +1854,6 @@ } } ], - [ - "git_stash_flags", - { - "type": "enum", - "fields": [ - { - "type": "unsigned int", - "name": "GIT_STASH_DEFAULT", - "value": 0 - }, - { - "type": "unsigned int", - "name": "GIT_STASH_KEEP_INDEX", - "value": 1 - }, - { - "type": "unsigned int", - "name": "GIT_STASH_INCLUDE_UNTRACKED", - "value": 2 - }, - { - "type": "unsigned int", - "name": "GIT_STASH_INCLUDE_IGNORED", - "value": 4 - }, - { - "type": "unsigned int", - "name": "GIT_STASH_KEEP_ALL", - "value": 8 - } - ] - } - ], - [ - "git_stash_save_options", - { - "type": "struct", - "fields": [ - { - "type": "unsigned int", - "name": "version" - }, - { - "type": "const git_signature *", - "name": "stasher" - }, - { - "type": "const char *", - "name": "message" - }, - { - "type": "uint32_t", - "name": "flags" - }, - { - "type": "git_strarray", - "name": "paths" - } - ], - "used": { - "needs": [ - "git_stash_save_with_opts", - "git_stash_save_options_init" - ] - } - } - ], [ "git_status_options", { From ca3720e6855f226236dfb3306cae7040006aa5ea Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 7 Feb 2024 12:53:05 -0700 Subject: [PATCH 453/545] fix nodegit post-upgrade build errors --- generate/input/descriptor.json | 21 ++++++++++++++++--- .../templates/manual/src/git_buf_converter.cc | 2 +- generate/templates/partials/async_function.cc | 2 +- vendor/libgit2.gyp | 3 +++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index c43cb8fee..48e32ba8e 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -70,6 +70,10 @@ "owner": "Object", "removeString": "OBJ_" }, + "oid": { + "JsName": "TYPE", + "owner": "Oid" + }, "proxy": { "JsName": "PROXY", "isMask": false @@ -158,6 +162,9 @@ "return": { "isErrorCode": true } + }, + "git_apply_options_init": { + "ignore": true } } }, @@ -3399,6 +3406,12 @@ "isErrorCode": true } }, + "git_remote_connect_ext": { + "isAsync": true + }, + "git_remote_connect_options_init": { + "ignore": true + }, "git_remote_disconnect": { "isAsync": true, "return": { @@ -3596,6 +3609,11 @@ } } }, + "remote_connect_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, "remote_callbacks": { "fields": { "completion": { @@ -3687,9 +3705,6 @@ }, "isAsync": false }, - "git_repository_init_init_options": { - "ignore": true - }, "git_repository_init_options_init": { "ignore": true }, diff --git a/generate/templates/manual/src/git_buf_converter.cc b/generate/templates/manual/src/git_buf_converter.cc index 1558d39fe..da6f425f8 100644 --- a/generate/templates/manual/src/git_buf_converter.cc +++ b/generate/templates/manual/src/git_buf_converter.cc @@ -22,7 +22,7 @@ git_buf *GitBufConverter::Convert(Local val) { memcpy(memory, v8String.c_str(), stringLength); - result->asize = stringLength; + result->reserved = stringLength; result->size = stringLength; result->ptr = reinterpret_cast(memory); return result; diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 6041c16f3..1f3b1eaa3 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -98,7 +98,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { baton->{{arg.name}} = ({{ arg.cType }})malloc(sizeof({{ arg.cType|replace '*' '' }})); {%if arg.cppClassName == "GitBuf" %} baton->{{arg.name}}->ptr = NULL; - baton->{{arg.name}}->size = baton->{{arg.name}}->asize = 0; + baton->{{arg.name}}->size = baton->{{arg.name}}->reserved = 0; {%endif%} {%endif%} {%endeach%} diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 1c5d1c876..ea0b5dab4 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -77,6 +77,7 @@ "libgit2/src/libgit2/fetchhead.c", "libgit2/src/libgit2/filter.c", "libgit2/src/libgit2/graph.c", + "libgit2/src/libgit2/grafts.c", "libgit2/src/libgit2/hashsig.c", "libgit2/src/libgit2/ident.c", "libgit2/src/libgit2/idxmap.c", @@ -245,6 +246,8 @@ "sources": [ "libgit2/src/libgit2/streams/tls.c", "libgit2/src/libgit2/transports/auth.c", + "libgit2/src/libgit2/transports/auth_gssapi.c", + "libgit2/src/libgit2/transports/auth_ntlmclient.c", "libgit2/src/libgit2/transports/http.c", ], "cflags": [ From 7968f0011b7f53b7e46f667730797cd7e4d00f02 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 7 Feb 2024 15:54:43 -0700 Subject: [PATCH 454/545] fix missing Oid.fromString function this is now missing from the auto-generated libgit2 documentation because the function declaration is behind a preprocessor check --- generate/input/descriptor.json | 13 ++++++++++++- generate/input/libgit2-supplement.json | 25 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 48e32ba8e..828a20311 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2696,7 +2696,18 @@ }, "git_oid_fromstrp": { "isAsync": false, - "jsFunctionName": "fromString" + "jsFunctionName": "fromString", + "args": { + "out": { + "isReturn": true + }, + "str": { + "shouldAlloc": false + } + }, + "return": { + "isErrorCode": true + } }, "git_oid_nfmt": { "ignore": true diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 557410cfc..4f1ddf864 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -667,6 +667,25 @@ }, "group": "index_reuc_entry" }, + "git_oid_fromstrp": { + "type": "function", + "file": "oid.h", + "args": [ + { + "name": "out", + "type": "git_oid *" + }, + { + "name": "str", + "type": "const char *" + } + ], + "return": { + "type": "int" + }, + "isAsync": false, + "group": "oid" + }, "git_patch_convenient_from_diff": { "args": [ { @@ -1152,6 +1171,12 @@ "git_merge_file_result_free" ] ], + [ + "oid", + [ + "git_oid_fromstrp" + ] + ], [ "odb_object", [ From 999b8a12176228267101efb9fa302ab96789ce7d Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 7 Feb 2024 16:39:59 -0700 Subject: [PATCH 455/545] fix merge conflicts test the OID of the resulting commit has changed because the conflicts list of a Merge conflict is no longer commented, thus changing the commit message. the other content of the commit is unchanged --- test/tests/merge.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests/merge.js b/test/tests/merge.js index 00387da82..a5010925b 100644 --- a/test/tests/merge.js +++ b/test/tests/merge.js @@ -1592,7 +1592,7 @@ describe("Merge", function() { }) .then(function(commitOid) { assert.equal(commitOid.toString(), - "03ba156a7a1660f179b6b2dbc6a542fcf88d022d"); + "8221726e3f96e3d3e0258f655e107383dc3c7335"); // merge isn't cleaned up automatically assert.ok(fse.existsSync(path.join(repoGitPath, "MERGE_HEAD"))); From 9c4e40cf510af3ac9789eb3040d6640095c123da Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 7 Feb 2024 16:59:17 -0700 Subject: [PATCH 456/545] fix rename reference test nothing changed about this function but for some reason, the last message in the reflog is now a clone message, instead of the reflog we expect. --- test/tests/refs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests/refs.js b/test/tests/refs.js index 68b114e85..1cad9f408 100644 --- a/test/tests/refs.js +++ b/test/tests/refs.js @@ -109,7 +109,7 @@ describe("Reference", function() { }) .then(function(reflog) { var refEntryMessage = reflog - .entryByIndex(reflog.entrycount() - 1) + .entryByIndex(0) .message(); // The reflog should have the message passed to // the rename From 4027c95737a4573e5b5cc4f9304d3ee75fd57883 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 8 Feb 2024 14:40:24 -0700 Subject: [PATCH 457/545] fix windows build --- vendor/libgit2.gyp | 2 -- 1 file changed, 2 deletions(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index ea0b5dab4..fe98c956f 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -327,8 +327,6 @@ "libgit2/src/util/allocators/win32_leakcheck.c", "libgit2/src/util/win32/dir.c", "libgit2/src/util/win32/error.c", - "libgit2/src/util/win32/findfile.c", - "libgit2/src/util/win32/git2.rc", "libgit2/src/util/win32/map.c", "libgit2/src/util/win32/path_w32.c", "libgit2/src/util/win32/posix_w32.c", From ebe186467aca5f7f1e51a54de66649be16c38814 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Wed, 14 Feb 2024 15:51:38 -0700 Subject: [PATCH 458/545] Bump to v0.28.0-alpha.23 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07caa1e75..306f6d99e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.23 [(2024-02-14)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.23) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.22...v0.28.0-alpha.23) + +#### Summary of changes +- Bump libgit2 to 1.7.2 + +#### Merged PRs into NodeGit +- [Bump libgit2 to 1.7.2](https://github.com/nodegit/nodegit/pull/1990) + ## v0.28.0-alpha.22 [(2024-02-05)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.22) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.21...v0.28.0-alpha.22) diff --git a/package-lock.json b/package-lock.json index 8517e7dc5..3c19c3fc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.22", + "version": "0.28.0-alpha.23", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.22", + "version": "0.28.0-alpha.23", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 2c5be0627..948cf7167 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.22", + "version": "0.28.0-alpha.23", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From b853b3d244fc64749fdd1f86382c0a52208a45d4 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 20 Feb 2024 15:34:50 -0700 Subject: [PATCH 459/545] Ensure OpenSSL root included in win32 Electron builds --- vendor/libgit2.gyp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index fe98c956f..4fe4c8969 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -283,6 +283,13 @@ "GIT_WINHTTP", "GIT_IO_WSAPOLL" ], + "conditions": [ + ["<(is_electron) == 1", { + "include_dirs": [ + "<(electron_openssl_root)/include" + ] + }] + ], "msvs_settings": { "VCLinkerTool": { "AdditionalDependencies": [ @@ -304,9 +311,6 @@ "/MACHINE:x86", ], }, - }], - ["<(is_electron) == 1", { - "include_dirs": ["<(electron_openssl_root)/include"] }] ], }, From 5bccff63aa097b79c087048a11d1fe65e266920c Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 16 Aug 2022 10:05:22 -0700 Subject: [PATCH 460/545] use builtin SHA1 for libgit compilation apparently this is recommended by both ed and the upstream git project. In fact it's so recommended they're considering deprecating any alternatives. --- vendor/libgit2.gyp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 4fe4c8969..b2ea9471b 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -22,7 +22,7 @@ "GIT_SSH", "GIT_SSH_MEMORY_CREDENTIALS", "LIBGIT2_NO_FEATURES_H", - "GIT_SHA1_OPENSSL", + "GIT_SHA1_COLLISIONDETECT", "GIT_SHA256_OPENSSL", "GIT_USE_NSEC", "GIT_HTTPS", @@ -172,7 +172,10 @@ "libgit2/src/util/fs_path.c", "libgit2/src/util/futils.c", "libgit2/src/util/hash.c", + "libgit2/src/util/hash/collisiondetect.c", "libgit2/src/util/hash/openssl.c", + "libgit2/src/util/hash/sha1dc/sha1.c", + "libgit2/src/util/hash/sha1dc/ubc_check.c", "libgit2/src/util/net.c", "libgit2/src/util/pool.c", "libgit2/src/util/posix.c", From 80b12acfc61d147461f0faa1bdef6bee16a207ce Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 20 Feb 2024 16:37:28 -0700 Subject: [PATCH 461/545] Bump to v0.28.0-alpha.24 --- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 306f6d99e..a45fdbe1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Change Log +## v0.28.0-alpha.24 [(2024-02-20)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.24) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.23...v0.28.0-alpha.24) + +#### Summary of changes +- Use Collision Detection SHA1 implementation +- Fix win32 Electron build due to incorrect OpenSSL include path + +#### Merged PRs into NodeGit +- [Use builtin SHA1 for libgit compilation](https://github.com/nodegit/nodegit/pull/1992) +- [Ensure OpenSSL root included in win32 Electron builds](https://github.com/nodegit/nodegit/pull/1991) + ## v0.28.0-alpha.23 [(2024-02-14)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.23) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.22...v0.28.0-alpha.23) diff --git a/package-lock.json b/package-lock.json index 3c19c3fc4..cd7102078 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.23", + "version": "0.28.0-alpha.24", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.23", + "version": "0.28.0-alpha.24", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 948cf7167..9bdcdd544 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.23", + "version": "0.28.0-alpha.24", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From e132dca1795443feb5cdffd2242ae3b0fca44937 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 11 Apr 2024 10:19:52 -0700 Subject: [PATCH 462/545] fix use-after-free in getReferences we didn't create the repo so we can't be the ones to free it --- generate/templates/manual/repository/get_references.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index 1db6c542f..e57ba97ff 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -61,7 +61,6 @@ void GitRepository::GetReferencesWorker::Execute() } git_strarray_free(&reference_names); - git_repository_free(repo); delete baton->out; baton->out = NULL; return; From c024dfb60d33b4fa59eb1d24a3a83b211a3ca5be Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 11 Apr 2024 10:20:13 -0700 Subject: [PATCH 463/545] fix memory leak of repo object in getReferences --- generate/templates/manual/repository/get_remotes.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 647498837..800b08d0f 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -51,6 +51,8 @@ void GitRepository::GetRemotesWorker::Execute() if (giterr_last() != NULL) { baton->error = git_error_dup(giterr_last()); } + + git_repository_free(repo); delete baton->out; baton->out = NULL; return; @@ -82,6 +84,9 @@ void GitRepository::GetRemotesWorker::Execute() baton->out->push_back(remote); } + + git_strarray_free(&remote_names); + git_repository_free(repo); } void GitRepository::GetRemotesWorker::HandleErrorCallback() { From c12c5a423808e427056d67e0f9b53af8034927c1 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 12 Apr 2024 10:56:04 -0700 Subject: [PATCH 464/545] fix node-pre-gyp spawn on windows with node 18+ spawning cmd files without shell: true wasn't really allowed before, but not it's expressly disallowed because of a recent vulnerability reported to node --- lifecycleScripts/install.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lifecycleScripts/install.js b/lifecycleScripts/install.js index dc44c836b..ddbb90e9c 100755 --- a/lifecycleScripts/install.js +++ b/lifecycleScripts/install.js @@ -29,11 +29,13 @@ module.exports = function install() { } return new Promise(function(resolve, reject) { + const gypPath = path.join(__dirname, "..", "node_modules", "node-gyp", "bin", "node-gyp.js"); var spawnedNodePreGyp = spawn(nodePreGyp, args, { - env: Object.assign({}, process.env, { - npm_config_node_gyp: path.join(__dirname, "..", "node_modules", - "node-gyp", "bin", "node-gyp.js") - }) + env: { + ...process.env, + npm_config_node_gyp: gypPath + }, + shell: process.platform === "win32" }); spawnedNodePreGyp.stdout.on("data", function(data) { From a71141672c8fcb657fb19d59d76c4f7907324c4f Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Mon, 15 Apr 2024 20:43:47 -0700 Subject: [PATCH 465/545] Bump to v0.28.0-alpha.25 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a45fdbe1e..558e35414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.25 [(2024-04-15)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.25) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.24...v0.28.0-alpha.25) + +#### Summary of changes +- Fix use-after-free in getReferences + +#### Merged PRs into NodeGit +- [Don't free the given repo on error in getReferences and getRemotes](https://github.com/nodegit/nodegit/pull/1995) + ## v0.28.0-alpha.24 [(2024-02-20)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.24) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.23...v0.28.0-alpha.24) diff --git a/package-lock.json b/package-lock.json index cd7102078..01f4ed94d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.24", + "version": "0.28.0-alpha.25", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.24", + "version": "0.28.0-alpha.25", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 9bdcdd544..26953e555 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.24", + "version": "0.28.0-alpha.25", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From b854f7500a5a73187711a055a6a641331ee2243a Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 18 Apr 2024 17:11:10 -0700 Subject: [PATCH 466/545] don't duplicate repo when getting remotes I didn't realize this beforehand but the git_remote object takes the pointer to the repo it's looked up on. Then when we construct a GitRemote, we create a wrapper around *that* repo pointer(because we create a new repository instance per-remote...) which gets garbage collected later. I still don't see a good reason to duplicate the repo pointer and we don't in other cases of constructing GitRemote so I'm gonna remove it. --- generate/templates/manual/repository/get_references.cc | 2 ++ generate/templates/manual/repository/get_remotes.cc | 8 +------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/generate/templates/manual/repository/get_references.cc b/generate/templates/manual/repository/get_references.cc index e57ba97ff..56bc12ac3 100644 --- a/generate/templates/manual/repository/get_references.cc +++ b/generate/templates/manual/repository/get_references.cc @@ -79,6 +79,8 @@ void GitRepository::GetReferencesWorker::Execute() baton->out->push_back(reference); } } + + git_strarray_free(&reference_names); } void GitRepository::GetReferencesWorker::HandleErrorCallback() { diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 800b08d0f..46b5f5da2 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -29,11 +29,7 @@ void GitRepository::GetRemotesWorker::Execute() { giterr_clear(); - git_repository *repo; - { - nodegit::LockMaster lockMaster(true, baton->repo); - baton->error_code = git_repository_open(&repo, git_repository_workdir(baton->repo)); - } + git_repository *repo = baton->repo; if (baton->error_code != GIT_OK) { if (giterr_last() != NULL) { @@ -52,7 +48,6 @@ void GitRepository::GetRemotesWorker::Execute() baton->error = git_error_dup(giterr_last()); } - git_repository_free(repo); delete baton->out; baton->out = NULL; return; @@ -86,7 +81,6 @@ void GitRepository::GetRemotesWorker::Execute() } git_strarray_free(&remote_names); - git_repository_free(repo); } void GitRepository::GetRemotesWorker::HandleErrorCallback() { From 26a25cce45c3aca5cd3d940df96f02c56218621c Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 19 Apr 2024 10:01:00 -0700 Subject: [PATCH 467/545] fix left-over free --- generate/templates/manual/repository/get_remotes.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/generate/templates/manual/repository/get_remotes.cc b/generate/templates/manual/repository/get_remotes.cc index 46b5f5da2..a7c316bb0 100644 --- a/generate/templates/manual/repository/get_remotes.cc +++ b/generate/templates/manual/repository/get_remotes.cc @@ -71,7 +71,6 @@ void GitRepository::GetRemotesWorker::Execute() } git_strarray_free(&remote_names); - git_repository_free(repo); delete baton->out; baton->out = NULL; return; From feab8b02ac9dec7e0ae717a21ca187be14ddd8eb Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Fri, 19 Apr 2024 10:16:27 -0700 Subject: [PATCH 468/545] Bump to v0.28.0-alpha.26 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 558e35414..3fd3ef4e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.26 [(2024-04-19)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.26) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.25...v0.28.0-alpha.26) + +#### Summary of changes +- Fix use-after-free in getRemotes + +#### Merged PRs into NodeGit +- [Fix double-free introduced trying to fix other double-free](https://github.com/nodegit/nodegit/pull/1996) + ## v0.28.0-alpha.25 [(2024-04-15)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.25) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.24...v0.28.0-alpha.25) diff --git a/package-lock.json b/package-lock.json index 01f4ed94d..799afbdea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.25", + "version": "0.28.0-alpha.26", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.25", + "version": "0.28.0-alpha.26", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 26953e555..e5f85e8f0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.25", + "version": "0.28.0-alpha.26", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 8031ded1384e2f4882414f549f7ab117ea670faf Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 30 May 2024 14:16:36 -0700 Subject: [PATCH 469/545] bump nan fixes build failure on electron 29+ --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 799afbdea..ed7d298bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@axosoft/nan": "^2.18.0-gk.2", + "@axosoft/nan": "^2.19.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", @@ -38,9 +38,9 @@ } }, "node_modules/@axosoft/nan": { - "version": "2.18.0-gk.2", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.2.tgz", - "integrity": "sha512-R85blIk4tODD/tIQ1nezCs4O6RhWzPqB1Ls79fBEfUtZ9Zgq5s2c5mPGmWiS2+wAXaw2YgRhsBfqLFURH9mcPw==" + "version": "2.19.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.19.0-gk.1.tgz", + "integrity": "sha512-Ovw3ZF814D1FEebGOD0jUseIpN7m8k0Y981qs75FUx+Dgnb3Y1T1Ey/02XccY+7WpLvX+KpSqKAV1TDDuSBH3A==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -4805,9 +4805,9 @@ }, "dependencies": { "@axosoft/nan": { - "version": "2.18.0-gk.2", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.18.0-gk.2.tgz", - "integrity": "sha512-R85blIk4tODD/tIQ1nezCs4O6RhWzPqB1Ls79fBEfUtZ9Zgq5s2c5mPGmWiS2+wAXaw2YgRhsBfqLFURH9mcPw==" + "version": "2.19.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.19.0-gk.1.tgz", + "integrity": "sha512-Ovw3ZF814D1FEebGOD0jUseIpN7m8k0Y981qs75FUx+Dgnb3Y1T1Ey/02XccY+7WpLvX+KpSqKAV1TDDuSBH3A==" }, "@isaacs/cliui": { "version": "8.0.2", diff --git a/package.json b/package.json index e5f85e8f0..8f4e496bb 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "node": ">= 16" }, "dependencies": { - "@axosoft/nan": "^2.18.0-gk.2", + "@axosoft/nan": "^2.19.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", From 0690072e0e85abcdfbf816a49c53632cd67c4e82 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Thu, 6 Jun 2024 16:29:29 -0700 Subject: [PATCH 470/545] Bump to v0.28.0-alpha.27 --- CHANGELOG.md | 12 +++++++++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fd3ef4e3..1ebde8c92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ # Change Log -## v0.28.0-alpha.26 [(2024-04-19)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.26) +## v0.28.0-alpha.27 [(2024-06-06)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.27) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.26...v0.28.0-alpha.27) + +#### Summary of changes +- Build on Electron 29+ + +#### Merged PRs into NodeGit +- [Fix build failure on electron 29+](https://github.com/nodegit/nodegit/pull/1998) + +## v0.28.0-alpha.26 [(2024-04-19)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.26) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.25...v0.28.0-alpha.26) diff --git a/package-lock.json b/package-lock.json index ed7d298bd..6e78198bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.26", + "version": "0.28.0-alpha.27", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.26", + "version": "0.28.0-alpha.27", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 8f4e496bb..3a6e3eb8d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.26", + "version": "0.28.0-alpha.27", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 137e9ccf58c48ac39e1b7e2d9b62c6586ae4c9c4 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 24 Jun 2024 09:59:30 -0700 Subject: [PATCH 471/545] bump nan again for electron 31 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e78198bb..58f48126b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@axosoft/nan": "^2.19.0-gk.1", + "@axosoft/nan": "^2.20.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", @@ -38,9 +38,9 @@ } }, "node_modules/@axosoft/nan": { - "version": "2.19.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.19.0-gk.1.tgz", - "integrity": "sha512-Ovw3ZF814D1FEebGOD0jUseIpN7m8k0Y981qs75FUx+Dgnb3Y1T1Ey/02XccY+7WpLvX+KpSqKAV1TDDuSBH3A==" + "version": "2.20.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.20.0-gk.1.tgz", + "integrity": "sha512-IHQhM1EddFkgPuLMWvMU/qpNyNaNTlCMTXp79Pb36HJRgV/vai3gxPh0csluVqDyXS4zdqXRiuw1lVs+N12R0g==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -4805,9 +4805,9 @@ }, "dependencies": { "@axosoft/nan": { - "version": "2.19.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.19.0-gk.1.tgz", - "integrity": "sha512-Ovw3ZF814D1FEebGOD0jUseIpN7m8k0Y981qs75FUx+Dgnb3Y1T1Ey/02XccY+7WpLvX+KpSqKAV1TDDuSBH3A==" + "version": "2.20.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.20.0-gk.1.tgz", + "integrity": "sha512-IHQhM1EddFkgPuLMWvMU/qpNyNaNTlCMTXp79Pb36HJRgV/vai3gxPh0csluVqDyXS4zdqXRiuw1lVs+N12R0g==" }, "@isaacs/cliui": { "version": "8.0.2", diff --git a/package.json b/package.json index 3a6e3eb8d..c6cb59a15 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "node": ">= 16" }, "dependencies": { - "@axosoft/nan": "^2.19.0-gk.1", + "@axosoft/nan": "^2.20.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", From e10267ba307e26d6ec2ea095de1d9fe5e1214cf6 Mon Sep 17 00:00:00 2001 From: Ian Hattendorf Date: Tue, 2 Jul 2024 11:52:43 -0700 Subject: [PATCH 472/545] Bump to v0.28.0-alpha.28 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ebde8c92..247721a00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.28 [(2024-07-01)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.28) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.27...v0.28.0-alpha.28) + +#### Summary of changes +- Build on Electron 31+ + +#### Merged PRs into NodeGit +- [Bump nan again for electron 31](https://github.com/nodegit/nodegit/pull/2000) + ## v0.28.0-alpha.27 [(2024-06-06)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.27) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.26...v0.28.0-alpha.27) diff --git a/package-lock.json b/package-lock.json index 58f48126b..33bad9ebb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.27", + "version": "0.28.0-alpha.28", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.27", + "version": "0.28.0-alpha.28", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index c6cb59a15..6dba1e13f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.27", + "version": "0.28.0-alpha.28", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From a4be2f56ed84fd01ccd31e6b5195da2d176940da Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Mon, 3 Feb 2025 15:53:05 +0300 Subject: [PATCH 473/545] fix linux actions --- .github/workflows/tests.yml | 74 ++++++++++--------------------------- 1 file changed, 19 insertions(+), 55 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6d5114d6a..2c3e9e4ff 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,29 +14,12 @@ jobs: name: "Linux Tests" strategy: matrix: - node: [16] # 18+ requires GLIBC 2.28+ - runs-on: ubuntu-latest - container: ubuntu:16.04 + node: [16, 18, 20, 22] + fail-fast: false + runs-on: ubuntu-20.04 steps: - name: Install Dependencies for Ubuntu - # git >= 2.18 required for actions/checkout git support - run: apt-get update && apt-get install -y software-properties-common && add-apt-repository -y ppa:git-core/ppa && apt-get update && apt-get install -y git build-essential clang libssl-dev libkrb5-dev libc++-dev wget - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - - - name: Setup python 3.6 - env: - CC: clang - CXX: clang++ - run: | - mkdir ~/python - cd ~/python - wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz - tar -xvf Python-3.6.15.tgz - cd Python-3.6.15 - ./configure - make - make install + run: sudo apt-get update && sudo apt-get install -y software-properties-common git build-essential clang libssl-dev libkrb5-dev libc++-dev wget zlib1g-dev - name: Setup Environment run: | @@ -49,31 +32,20 @@ jobs: git config --global user.name "John Doe" git config --global user.email johndoe@example.com - # v4 requires node 20, which won't run due to GLIBC 2.28+ requirement - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.6" - name: Use Node.js - # v4 requires node 20, which won't run due to GLIBC 2.28+ requirement - uses: actions/setup-node@v3 - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} check-latest: true - name: Install - env: - CC: clang - CXX: clang++ - npm_config_clang: 1 - GYP_DEFINES: use_obsolete_asm=true - # There is a race condition in node/generate that needs to be fixed - # Node 16 changed the logic it uses to select it's UID which means to make node run as root and not 1001, we need to chwon the current directory. More Details: - # https://stackoverflow.com/questions/70298238/getting-eaccess-when-running-npm-8-as-root - run: | - chown root.root -R . - npm set unsafe-perm true - node utils/retry npm install + run: npm install - name: Test run: | @@ -98,10 +70,11 @@ jobs: name: "macOS Tests" strategy: matrix: - node: [16, 18, 20] - runs-on: macOS-12 - # This is mostly the same as the Linux steps, waiting for anchor support - # https://github.com/actions/runner/issues/1182 + node: [16, 18, 20, 22] + fail-fast: false + runs-on: macOS-13 + # This is mostly the same as the Linux steps, waiting for anchor support + # https://github.com/actions/runner/issues/1182 steps: - name: Setup Environment run: | @@ -118,20 +91,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} check-latest: true - name: Install - env: - CC: clang - CXX: clang++ - npm_config_clang: 1 - GYP_DEFINES: use_obsolete_asm=true - # There is a race condition in node/generate that needs to be fixed - run: node utils/retry npm install + run: npm install - name: Test run: | @@ -156,8 +121,9 @@ jobs: name: Windows Tests strategy: matrix: - node: [16, 18, 20] + node: [16, 18, 20, 22] arch: [x86, x64] + fail-fast: false runs-on: windows-2019 steps: - name: Setup Environment @@ -172,8 +138,6 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: node-version: ${{ matrix.node }} check-latest: true From 053e0bffc6d5cc5c88c99373de620f10bac2605b Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 4 Feb 2025 15:03:06 -0700 Subject: [PATCH 474/545] update test ssh key --- test/id_rsa.enc | 2 +- test/id_rsa.pub | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/id_rsa.enc b/test/id_rsa.enc index cd8879bef..8c992bebd 100644 --- a/test/id_rsa.enc +++ b/test/id_rsa.enc @@ -1 +1 @@ -LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBd1pCektEVVVaQjJEUk94SjBDM1JjVElGWEtob0RUMkE0YTFvaXpKV0xzNlpoSEZKCjRjRnQ4eldpR3VDZGlaUnBFVFlHR1ZZbXRTSE5WZDVLQ1R4TjJEdHZuc1FIeVFTRDNtK2p0YWd3QTNOb1JSUjgKM2R2TUpoeWxKRHV0Y3M2Tm1ZdzBIMmhGYll6ZC9XSXN0ZlFHM1hUZDI4emE0TDdrRStlK0gydWtZSVpka1gzbgpDbUR1KzRod05VUmx5QlhQSVhsMVNGTGxGZjR4NDIrZWxxcUJ4L0w4cmRRNmxNL1BhTW9oNnZBcEx0S3N5amZOCkFqb1htVDdIZ05STDA5TTVTSUcxd2NjSW96ZU1VWnJ5Snl0SHdlU25QYTk1SFhSOXJVKzFkUFd6aFNiTHhrR2sKSmtOVmhVd3FvNlFSY05RaHluRzN6eXpzV3k2VlNFZllNc2ROMFFJREFRQUJBb0lCQUJzWk5QWUJFRnkvd1B2cQpOSjgvZXQzbENka2gvb2MwQUJJWUs5V284MlhVS0t2aERGM2RyWjNwK1VyWC9WWWdmK0VYOWh5ZjhnVlR1U0ozClgxZ1JxRGhJZ2VUeFBzSEdyd3Q2QjZwTDVJVG5LRWJiaW11bzlOaTFFKzJScVVPMFpTQ0UvMXNTUnY0Q1JhWE8KazhIWmF3aWY3dHR4djRiTlVyTHlzNnhFYnB2UWxPTXpnczRzL09CQi9YTUVxbkZSR1BKZWVUeThia09XeVR3bApMajA2bnEyYnJzNHFLNGVpakkvTW9HeTFDRDhKQ3BMNGdHMzlHUFRYZDhHcHVkWG1kZWxEbjFFMHQ5bmhMNlNlCmFPTWFpUGh5N2tCSkQ0d1ovL1daVFNSMVh5ak5CSDNER2tOWnhQSVdjWCt3SkZ5Tm9MYlNiVlNkYS83RHR2cDMKQ1BmaU5oRUNnWUVBLyszSnN3U3pjVkVBTk5GNU9MWjc2eCtUT0RrWjlUNllGNFNSOC91SmpOVmlXZ1VwWDd2dwpteVhGKzJBd3pOYW90YkJLbU5HNjE5QmNVZU1tUUI3NmMrVWlNTGVKdUpjVC9KajB4bUVVb3BIb25HcUVJY3ZnCkhnNmNhZkUxaXM3ZCtsNjY5YmZqaXRseCszbXVGMkNZbnlsU04xTFdIeElJVFZVajNCbWNXcVVDZ1lFQXdaNDUKV2RhSGZLN0c2R2pJN2xpRFFUNFpsc2xBOGRtTHYySmwyRXhCQk1vWTNtM1NyZTQyOHoyWkZhNE8vbnNCWVAwYQpEeGdZbVgyMGZRR2NiUHVnS2RDWUhjN0hrS2JNVTFHd2lWQ0dwRFlaQ20yZ0pLVHZhbTNkWU5haUFmcTVEeWhQCnpEQ1pOSjVyclNNcHJYc3VSdjJPNGM1dThxdEo1QnlhT0pCak9yMENnWUJNbGtBeHprcFVzc1M1Q2FhWkRpTHYKTGJmRXIzSFJMallkYzVLcHpMQlE4TnBKemhtZmlJSnNLMVdmOEIwcWIySjFYSmcyT3kwS3dGT2dQYldJb3J5WQpTZzE5UHE5OENkbjFVV0NPclNhYnI4WklhS2U1NVdUZ0djYzgvTzNrNkJzTmZhTzlQSlpmU3NzTlVsQ0N0bWwxCjE4dSt1bzlSSlBoUERCZDdHajdyOFFLQmdGcmF4V3k3dDI0eGtaTURnSzRmaU0vM3RRaEZ2aHovQ1kyd1BieEcKNUFlOFVma21MY09DVWZUSVJlcWZkOWZBbnNBRlpOSUthNWl6SFJ1L3dzaDlOd1lJSlNsdm04UHNFVnRUclBSeQpmZ3ZXZXQraTI0LzJlWVpHc2FnOGIxOWdhTENOS1F6WERUMWN6WWc4Uk5Wc1JTWDQyN0JvTHpYZVhOa1c5dU51CkZiSTlBb0dBVjJreGNkY0tTNEJ0TkhLUGVHZ1Y4N2RNMERXaFFhQXRFWEVJY1FxdUZ0YmEwbEFYaW9HSGc4VTQKemVpdWdsNFF6Y2h3azVxZDN3blo0U09oeDBzMTYvNWdRRGxua2JqRlI2RVJFVW52TFJ3VjkyekJYVVRPR0lraApaN1o0cmNnVUtsVkFhSFQzT0hOL2xUeXFKRy9pYitLNHdaaGJ6dGwvb3grSlVGc3ZEOTg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== \ No newline at end of file +LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUNGd0FBQUFkemMyZ3RjbgpOaEFBQUFBd0VBQVFBQUFnRUFzRG5CRGV2dVZTNzFLVHg0OEdiRzlMeHp3UUJ1OVVYc25Qd3ROdGh3bHdpRmpYL1M5U0lKCnhwNENIdVBjS3JYdjJLcTI1NnRMby9jcENkZk9waFhjSWNpZ09RNzc1MGQwSDAvZkpyMHpzWjh3akFiZ1ZPOXpPanlRbXUKbE15WWNzWmpkMURESjQ2djBwNGU4YTZsbldwbHduVFNzVVB3OVVXRkt0MDRDcDZSNVpXaHdlTDg5cmI2Qk13SEJySURNWQpWY2VZSVlGZFRsZWU5MStGQWhLZVVFVE9LNzF6aWRPQXY0Ti9jdnRUQWNtYmlhTTgvUEtXVDEvRDFCeDJ6YzJsY0d3Y2RWCkJiaUxWQmNZKzJReGZzWjVlMGk5SGhKdjdCcWw4SXgxTTYzaVlkQU0yQUFseEZkTU1ONEMwUW1YeDlkSkxTdFdFcXRXZ2gKSHNGY05MSnpDTUs5MGRnSEh3OHZnOTFtdGNMVjVUS01nb3RXaEI2YjRMdkZEUUlac2V5RnY0cVJnM2NOb1hlUFY3bmg3OQp1YVlhL0NremJrNEdZQytsbXhENndFZDhHOGM4d0s4cjJ3NW04ZTAwWmdrQUVhbnovZGZRZ1dzdHBkajRmK05RdUVXRnN6CnNpeGlrTUtOVnJhWnpoRmFUaE9DbTNUUHNmY05LZ2NBN3VXVGJZNllNMlQ1SmowU3ZHRW5Ka1EzUitIK1RIamxqc0wrMnUKWVRCM2NlZ2dXc1dzSmlyazFTdjNlMURxUlhUeGNTcDlyRWlMaHVxV0NLL0t4QzZyWGpBMGJWSkgxMENnRjJNZWtVRTJtNApmeVZjUE5ML0VYWVN1V2t6elZzTDFjdzJSc3psS3RIQVJMNzRISlp6Z3RZMjZ2SlFLOTlub09QMk10aEc0dWI5aWRyajN1CmtBQUFkQVVoVnBRRklWYVVBQUFBQUhjM05vTFhKellRQUFBZ0VBc0RuQkRldnVWUzcxS1R4NDhHYkc5THh6d1FCdTlVWHMKblB3dE50aHdsd2lGalgvUzlTSUp4cDRDSHVQY0tyWHYyS3EyNTZ0TG8vY3BDZGZPcGhYY0ljaWdPUTc3NTBkMEgwL2ZKcgowenNaOHdqQWJnVk85ek9qeVFtdWxNeVljc1pqZDFEREo0NnYwcDRlOGE2bG5XcGx3blRTc1VQdzlVV0ZLdDA0Q3A2UjVaCldod2VMODlyYjZCTXdIQnJJRE1ZVmNlWUlZRmRUbGVlOTErRkFoS2VVRVRPSzcxemlkT0F2NE4vY3Z0VEFjbWJpYU04L1AKS1dUMS9EMUJ4MnpjMmxjR3djZFZCYmlMVkJjWSsyUXhmc1o1ZTBpOUhoSnY3QnFsOEl4MU02M2lZZEFNMkFBbHhGZE1NTgo0QzBRbVh4OWRKTFN0V0VxdFdnaEhzRmNOTEp6Q01LOTBkZ0hIdzh2ZzkxbXRjTFY1VEtNZ290V2hCNmI0THZGRFFJWnNlCnlGdjRxUmczY05vWGVQVjduaDc5dWFZYS9Da3piazRHWUMrbG14RDZ3RWQ4RzhjOHdLOHIydzVtOGUwMFpna0FFYW56L2QKZlFnV3N0cGRqNGYrTlF1RVdGc3pzaXhpa01LTlZyYVp6aEZhVGhPQ20zVFBzZmNOS2djQTd1V1RiWTZZTTJUNUpqMFN2RwpFbkprUTNSK0grVEhqbGpzTCsydVlUQjNjZWdnV3NXc0ppcmsxU3YzZTFEcVJYVHhjU3A5ckVpTGh1cVdDSy9LeEM2clhqCkEwYlZKSDEwQ2dGMk1la1VFMm00ZnlWY1BOTC9FWFlTdVdrenpWc0wxY3cyUnN6bEt0SEFSTDc0SEpaemd0WTI2dkpRSzkKOW5vT1AyTXRoRzR1YjlpZHJqM3VrQUFBQURBUUFCQUFBQ0FGL2pUUlNTSitEWjZEUkQzMXFQMGZvaEFLc24zVGhBai9ycgpqSDZuVHJ3ZnV1dS9mYjQ4Z3kwN2xOUFNFRjU5R01EQVF6M1RpeGp3eDdlL1lZWWxwdDRMR0lOemo4WE1yM2JLTXhZVkpTCmVsQXZsdVZHcGkwRVFENkhzaUx0SUpaek5IUWIwZFNZWXpzckpwTkRBSUtpL2pQTTlVZlhQQ2w1Wm5ob1hySUlqa0pxSk4KWW0rSllXQWZ6U041Q0JGQlBDQ1F0a3FrNVd4WGFQd1pVWHBMUHpGVi93ajEwUVJSdldCMzRNVmowMHJKdElReitsOTRjQwpsSVpubm44dzBRdE5CelF4amlYS3dLVkUzQ2NONFpDbDFqd3EzQnljMDZHWTdtbnhRMlNYWFBMMERja0thNEptTGVMNUtuCmNyelJiRUllRWVEM3VoRnpVM0kwckVOUVJoNjY5SXByYWpmUnpMY0Z4bkM3M0JTMVJUeWNmcGRTR0ZPUFhULzJOZDM2MlgKU2VwNlZOeFN0NWE2d2tXZ0hKaDJIOGRQY25pREgxRG1yQWRQOTdBa2VpMWxtWHFiekNJVjlwaWQzbWZNQUpiSm00UmhRcApURHZldUU4TmlCZ0k2MlRrd3Vjb1cyeTNMZFN2MTM3aUpCbkpTYzExRzlBNWJHMnlRWEUyYWlYUXhIeW9UMlF0VmY1WklYClJhVkx1YlFuY1NnTEJqZ0NkMUNsakI1amxSWU10U2M4YkZhL1RKNW9YT1ZNdENYNHhhcVo3Z3JHS05CcUJsRFRXblRnWk0KbXZ3UFZ1Y2xlNzI4MzZPSlBYbzFMajNLM2ttcnhDMXVORzA3NjMvemJLOWl2QWF1SFRMMnQ0cHkra0k0NC9ZcERvR2sybgp4bFdNZEQzTDNKVXgzUXo5THhBQUFCQVFDVzh6YVI5T2VPMXAzWGkxNFg5MDNuOWNjY1JVcGRMOEZSUDZ5MWkrVFpmN2RSClpla3ltWDZGbU9qbTAvbm9XM0hwZVoyYmJEaUFQRFp1VzRmUW1nWjBnemxvZERDZUp2UHF2U1FzUWVISjRjMkdzVG4xVHMKMzNYU1RWeFVLd3dqbEZ2TGpvMkJBdmlBaGZ3YUN3UmxUaGlrRy9CdC8wbVhObTF6cHFZbnFBc1pXb3JqOVVWQTYyT1c4MQpDVVgxL2RVMWtjUkFpY2NsUWxqTlNEWGJ6aWJVN2pvdXpzQzNFVUVEcG1HZG1UUVh4WHNCNTFVTmh5eVZoMmdBVnFDMDAyCm1Kd2dFVXNqcHFzYUw2TTczYXo4Mzg4b0RwWGJwMUNLTER5aDh2SnBJTkgwak5OZEQxd1dvQVJRZUhzL05iUUZLUThJTkkKdlBzWnowWkdmRzcvdVMrSkFBQUJBUURiVG94anFOUHJGT1piWDkzeDZONTVJV05DVUt1cUwxVks2MURIYUtYZmlpd0hEeQpRYjEzUnhPREk2RlNXMElIeVpqMDh5ZjBTVElGOXNZTUFwNy9GS1FORElqVVZyMVI2Z0RFZ0F3K2N5L2dpeWowVWxxSE1zCmdUUnNnSmEvSjJQYnViRDRWMzdZUkQ4enB2a0tmOFNKMGJRalEwaUx0YUNVYm9BUDVmYWFYbElLdmUyeHpLdVgzT0l2TTMKTyt1UTBJMDZqZGtMc2JBRzEvZ0E5emJmaW1wTHdJQkJkVUl6djdoRTJqOGJoak9HbTVTSU5rczRZZVROVFZXZHhmcjdiLwowVlFPSXJDd0RQKytCaGM5N2QrWDdZVVVkUUgzUHBTV3JWb0pOc0hNcHVUWmhpd0NnRk1NT1RYSEdWbGpFOHJnZGVTbFBzCmdCMXNRaHhyUlNNQitmQUFBQkFRRE50ZTQrMW5sWUtWNkVRWXhyeUpVQUtPdE1LSmZBNVhSVHNzWGhzRXlSMDBxL1djd3QKcmZmMzV3N2ZBWEJWd2VOemVlaXlwZXZKc1lnUnBBdTlPTVl0d1hFQlY1Rit5SUJRa2lHMTdiU2V6L3NibnlvaVdVNkJBWApHYmRDamZhNGVVRVRGemJjbGp0S2xnQUJSR2pXRDdQRk82V2ZwQWpRcGNqYVFwSVQ2WHpYZnVmV2d0bG5Ga1d5UGRXekpMCjQyV1lDemNhU3JKU0ZLZnpORHZtUjNzbllOZHB1bE1aUEtlRnZtZTJUWmp1VFJSRTd1OEtaRnhQalBkK0E4R2FuQnJOUGkKalBjSXE1SmFDWnpMMzVkaGlYcGJCQzJTMlh5cktwbWMrWEpRODJxZU93ZDZlOW9KVjEzUDdKU3NZYUVqdlFUeU5yNkE2bgo0ODIvcW1SZHUxUjNBQUFBQm01dmJtRnRaUUVDQXdRPQotLS0tLUVORCBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0K \ No newline at end of file diff --git a/test/id_rsa.pub b/test/id_rsa.pub index aed84e47b..77f36c653 100644 --- a/test/id_rsa.pub +++ b/test/id_rsa.pub @@ -1 +1 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCwOcEN6+5VLvUpPHjwZsb0vHPBAG71Reyc/C022HCXCIWNf9L1IgnGngIe49wqte/Yqrbnq0uj9ykJ186mFdwhyKA5DvvnR3QfT98mvTOxnzCMBuBU73M6PJCa6UzJhyxmN3UMMnjq/Snh7xrqWdamXCdNKxQ/D1RYUq3TgKnpHllaHB4vz2tvoEzAcGsgMxhVx5ghgV1OV573X4UCEp5QRM4rvXOJ04C/g39y+1MByZuJozz88pZPX8PUHHbNzaVwbBx1UFuItUFxj7ZDF+xnl7SL0eEm/sGqXwjHUzreJh0AzYACXEV0ww3gLRCZfH10ktK1YSq1aCEewVw0snMIwr3R2AcfDy+D3Wa1wtXlMoyCi1aEHpvgu8UNAhmx7IW/ipGDdw2hd49XueHv25phr8KTNuTgZgL6WbEPrAR3wbxzzAryvbDmbx7TRmCQARqfP919CBay2l2Ph/41C4RYWzOyLGKQwo1WtpnOEVpOE4KbdM+x9w0qBwDu5ZNtjpgzZPkmPRK8YScmRDdH4f5MeOWOwv7a5hMHdx6CBaxawmKuTVK/d7UOpFdPFxKn2sSIuG6pYIr8rELqteMDRtUkfXQKAXYx6RQTabh/JVw80v8RdhK5aTPNWwvVzDZGzOUq0cBEvvgclnOC1jbq8lAr32eg4/Yy2Ebi5v2J2uPe6Q== noname From 35596615d92dc08654927ad72941ea2fe2e966dd Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Wed, 5 Feb 2025 10:11:45 +0300 Subject: [PATCH 475/545] use updated key for tests --- .github/workflows/tests.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2c3e9e4ff..a9ef00d07 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -21,19 +21,20 @@ jobs: - name: Install Dependencies for Ubuntu run: sudo apt-get update && sudo apt-get install -y software-properties-common git build-essential clang libssl-dev libkrb5-dev libc++-dev wget zlib1g-dev + - uses: actions/checkout@v4 + - name: Setup Environment run: | + set -e mkdir ~/.ssh_tests chmod 700 ~/.ssh_tests printf "%b" "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config - printf "%b" "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R\n" > ~/.ssh_tests/id_rsa.pub - printf "%b" "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----\n" > ~/.ssh_tests/id_rsa + cat test/id_rsa.pub > ~/.ssh_tests/id_rsa.pub + cat test/id_rsa.enc | base64 -d > ~/.ssh_tests/id_rsa chmod 600 ~/.ssh_tests/id_rsa* git config --global user.name "John Doe" git config --global user.email johndoe@example.com - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 with: python-version: "3.6" @@ -76,19 +77,19 @@ jobs: # This is mostly the same as the Linux steps, waiting for anchor support # https://github.com/actions/runner/issues/1182 steps: + - uses: actions/checkout@v4 + - name: Setup Environment run: | mkdir ~/.ssh_tests chmod 700 ~/.ssh_tests printf "%b" "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh_tests/config - printf "%b" "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBkHMoNRRkHYNE7EnQLdFxMgVcqGgNPYDhrWiLMlYuzpmEcUnhwW3zNaIa4J2JlGkRNgYZVia1Ic1V3koJPE3YO2+exAfJBIPeb6O1qDADc2hFFHzd28wmHKUkO61yzo2ZjDQfaEVtjN39Yiy19AbddN3bzNrgvuQT574fa6Rghl2RfecKYO77iHA1RGXIFc8heXVIUuUV/jHjb56WqoHH8vyt1DqUz89oyiHq8Cku0qzKN80COheZPseA1EvT0zlIgbXBxwijN4xRmvInK0fB5Kc9r3kddH2tT7V09bOFJsvGQaQmQ1WFTCqjpBFw1CHKcbfPLOxbLpVIR9gyx03R\n" > ~/.ssh_tests/id_rsa.pub - printf "%b" "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAwZBzKDUUZB2DROxJ0C3RcTIFXKhoDT2A4a1oizJWLs6ZhHFJ\n4cFt8zWiGuCdiZRpETYGGVYmtSHNVd5KCTxN2DtvnsQHyQSD3m+jtagwA3NoRRR8\n3dvMJhylJDutcs6NmYw0H2hFbYzd/WIstfQG3XTd28za4L7kE+e+H2ukYIZdkX3n\nCmDu+4hwNURlyBXPIXl1SFLlFf4x42+elqqBx/L8rdQ6lM/PaMoh6vApLtKsyjfN\nAjoXmT7HgNRL09M5SIG1wccIozeMUZryJytHweSnPa95HXR9rU+1dPWzhSbLxkGk\nJkNVhUwqo6QRcNQhynG3zyzsWy6VSEfYMsdN0QIDAQABAoIBABsZNPYBEFy/wPvq\nNJ8/et3lCdkh/oc0ABIYK9Wo82XUKKvhDF3drZ3p+UrX/VYgf+EX9hyf8gVTuSJ3\nX1gRqDhIgeTxPsHGrwt6B6pL5ITnKEbbimuo9Ni1E+2RqUO0ZSCE/1sSRv4CRaXO\nk8HZawif7ttxv4bNUrLys6xEbpvQlOMzgs4s/OBB/XMEqnFRGPJeeTy8bkOWyTwl\nLj06nq2brs4qK4eijI/MoGy1CD8JCpL4gG39GPTXd8GpudXmdelDn1E0t9nhL6Se\naOMaiPhy7kBJD4wZ//WZTSR1XyjNBH3DGkNZxPIWcX+wJFyNoLbSbVSda/7Dtvp3\nCPfiNhECgYEA/+3JswSzcVEANNF5OLZ76x+TODkZ9T6YF4SR8/uJjNViWgUpX7vw\nmyXF+2AwzNaotbBKmNG619BcUeMmQB76c+UiMLeJuJcT/Jj0xmEUopHonGqEIcvg\nHg6cafE1is7d+l669bfjitlx+3muF2CYnylSN1LWHxIITVUj3BmcWqUCgYEAwZ45\nWdaHfK7G6GjI7liDQT4ZlslA8dmLv2Jl2ExBBMoY3m3Sre428z2ZFa4O/nsBYP0a\nDxgYmX20fQGcbPugKdCYHc7HkKbMU1GwiVCGpDYZCm2gJKTvam3dYNaiAfq5DyhP\nzDCZNJ5rrSMprXsuRv2O4c5u8qtJ5ByaOJBjOr0CgYBMlkAxzkpUssS5CaaZDiLv\nLbfEr3HRLjYdc5KpzLBQ8NpJzhmfiIJsK1Wf8B0qb2J1XJg2Oy0KwFOgPbWIoryY\nSg19Pq98Cdn1UWCOrSabr8ZIaKe55WTgGcc8/O3k6BsNfaO9PJZfSssNUlCCtml1\n18u+uo9RJPhPDBd7Gj7r8QKBgFraxWy7t24xkZMDgK4fiM/3tQhFvhz/CY2wPbxG\n5Ae8UfkmLcOCUfTIReqfd9fAnsAFZNIKa5izHRu/wsh9NwYIJSlvm8PsEVtTrPRy\nfgvWet+i24/2eYZGsag8b19gaLCNKQzXDT1czYg8RNVsRSX427BoLzXeXNkW9uNu\nFbI9AoGAV2kxcdcKS4BtNHKPeGgV87dM0DWhQaAtEXEIcQquFtba0lAXioGHg8U4\nzeiugl4Qzchwk5qd3wnZ4SOhx0s16/5gQDlnkbjFR6EREUnvLRwV92zBXUTOGIkh\nZ7Z4rcgUKlVAaHT3OHN/lTyqJG/ib+K4wZhbztl/ox+JUFsvD98=\n-----END RSA PRIVATE KEY-----\n" > ~/.ssh_tests/id_rsa + cat test/id_rsa.pub > ~/.ssh_tests/id_rsa.pub + cat test/id_rsa.enc | base64 -d > ~/.ssh_tests/id_rsa chmod 600 ~/.ssh_tests/id_rsa* git config --global user.name "John Doe" git config --global user.email johndoe@example.com - - uses: actions/checkout@v4 - - name: Use Node.js uses: actions/setup-node@v4 with: From 085a0d0d404e4ce138a933b2903e87eef19e8178 Mon Sep 17 00:00:00 2001 From: Sergey Glukhov Date: Tue, 4 Feb 2025 09:51:21 +0300 Subject: [PATCH 476/545] Replace istanbul with nyc to fix 'Unexpected token' error --- package-lock.json | 2649 +++++++++++++++++++++++++++++++++++++-------- package.json | 2 +- test/index.js | 9 +- 3 files changed, 2177 insertions(+), 483 deletions(-) diff --git a/package-lock.json b/package-lock.json index 33bad9ebb..c59d00deb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,22 +26,310 @@ "clean-for-publish": "~1.0.2", "combyne": "~0.8.1", "coveralls": "^3.0.2", - "istanbul": "^0.4.5", "js-beautify": "~1.5.10", "jshint": "^2.10.0", "lcov-result-merger": "^3.1.0", "mocha": "^5.2.0", + "nyc": "^17.1.0", "walk": "^2.3.9" }, "engines": { "node": ">= 16" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@axosoft/nan": { "version": "2.20.0-gk.1", "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.20.0-gk.1.tgz", "integrity": "sha512-IHQhM1EddFkgPuLMWvMU/qpNyNaNTlCMTXp79Pb36HJRgV/vai3gxPh0csluVqDyXS4zdqXRiuw1lVs+N12R0g==" }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -131,6 +419,96 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", @@ -319,16 +697,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -363,11 +731,31 @@ "node": ">=0.10.0" } }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -407,12 +795,6 @@ "node": ">=0.8" } }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -541,6 +923,39 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -678,6 +1093,22 @@ "node": ">=8" } }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -700,6 +1131,27 @@ "node": ">=0.10.0" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1056,6 +1508,13 @@ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1237,11 +1696,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/defer-to-connect": { "version": "2.0.1", @@ -1409,6 +1878,13 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", + "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1453,11 +1929,19 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1471,59 +1955,6 @@ "node": ">=0.8.0" } }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" - } - }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -1574,11 +2005,37 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/flush-write-stream": { "version": "1.1.1", @@ -1627,9 +2084,10 @@ "dev": true }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -1675,6 +2133,27 @@ "node": ">= 0.12" } }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -1747,6 +2226,16 @@ "node": ">=10" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1770,6 +2259,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1890,6 +2389,16 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", @@ -1928,36 +2437,6 @@ "node": ">=4.x" } }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -1993,15 +2472,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -2019,6 +2489,23 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -2028,6 +2515,13 @@ "he": "bin/he" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -2255,6 +2749,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2314,42 +2821,178 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "node_modules/istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", - "dev": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" }, - "bin": { - "istanbul": "lib/cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/istanbul/node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "abbrev": "1" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", "bin": { - "nopt": "bin/nopt.js" + "uuid": "dist/bin/uuid" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jackspeak": { @@ -2406,6 +3049,13 @@ "nopt": "bin/nopt.js" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -2438,6 +3088,19 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jshint": { "version": "2.13.4", "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", @@ -2795,17 +3458,17 @@ "node": ">= 0.10" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, "node_modules/lodash": { @@ -2813,6 +3476,13 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, "node_modules/log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -2830,17 +3500,6 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -3183,12 +3842,6 @@ "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -3326,6 +3979,26 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -3407,6 +4080,164 @@ "node": ">=0.10.0" } }, + "node_modules/nyc": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -3459,23 +4290,6 @@ "wrappy": "1" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -3535,6 +4349,35 @@ "node": ">=8" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -3549,6 +4392,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -3570,6 +4439,16 @@ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3623,13 +4502,24 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, "node_modules/proc-log": { @@ -3646,6 +4536,19 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -3757,6 +4660,19 @@ "node": ">= 6" } }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -3840,17 +4756,28 @@ "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" }, "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -3944,12 +4871,10 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4032,17 +4957,52 @@ "node": ">= 14" } }, - "node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "optional": true, + "license": "ISC", "dependencies": { - "amdefine": ">=0.0.4" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/spawn-wrap/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/sprintf-js": { @@ -4159,6 +5119,16 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -4171,18 +5141,6 @@ "node": ">=0.8.0" } }, - "node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", @@ -4237,8 +5195,45 @@ "bin": { "mkdirp": "bin/cmd.js" }, - "engines": { - "node": ">=10" + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/through2": { @@ -4358,29 +5353,24 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" } }, "node_modules/unc-path-regex": { @@ -4432,6 +5422,37 @@ "node": ">= 4.0.0" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4611,17 +5632,12 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } + "license": "ISC" }, "node_modules/wide-align": { "version": "1.1.5", @@ -4643,21 +5659,6 @@ "node": ">= 0.10.0" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "node_modules/wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -4740,6 +5741,19 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -4804,11 +5818,218 @@ } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@axosoft/nan": { "version": "2.20.0-gk.1", "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.20.0-gk.1.tgz", "integrity": "sha512-IHQhM1EddFkgPuLMWvMU/qpNyNaNTlCMTXp79Pb36HJRgV/vai3gxPh0csluVqDyXS4zdqXRiuw1lVs+N12R0g==" }, + "@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true + }, + "@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "requires": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "dev": true, + "requires": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + } + }, + "@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "dev": true, + "requires": { + "@babel/types": "^7.26.7" + } + }, + "@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -4867,6 +6088,72 @@ } } }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@mapbox/node-pre-gyp": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", @@ -5017,13 +6304,6 @@ "uri-js": "^4.2.2" } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5046,11 +6326,26 @@ "buffer-equal": "^1.0.0" } }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -5084,12 +6379,6 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5186,6 +6475,18 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + } + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -5289,6 +6590,18 @@ "responselike": "^2.0.0" } }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5305,6 +6618,12 @@ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -5604,6 +6923,12 @@ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5745,11 +7070,14 @@ "mimic-response": "^3.1.0" } }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } }, "defer-to-connect": { "version": "2.0.1", @@ -5883,6 +7211,12 @@ "safer-buffer": "^2.1.0" } }, + "electron-to-chromium": { + "version": "1.5.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", + "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5921,10 +7255,16 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -5933,37 +7273,6 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -6005,11 +7314,26 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } }, "flush-write-stream": { "version": "1.1.1", @@ -6060,9 +7384,9 @@ "dev": true }, "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -6092,6 +7416,12 @@ "mime-types": "^2.1.12" } }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -6152,6 +7482,12 @@ "wide-align": "^1.1.2" } }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -6169,6 +7505,12 @@ "has-symbols": "^1.0.1" } }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -6273,6 +7615,12 @@ } } }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, "got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", @@ -6302,27 +7650,6 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -6348,12 +7675,6 @@ "function-bind": "^1.1.1" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -6365,12 +7686,28 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -6547,6 +7884,12 @@ "is-unc-path": "^1.0.0" } }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -6597,39 +7940,131 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "requires": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" }, "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { - "abbrev": "1" + "aggregate-error": "^3.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "jackspeak": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", @@ -6667,6 +8102,12 @@ } } }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -6691,6 +8132,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, "jshint": { "version": "2.13.4", "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz", @@ -7002,14 +8449,13 @@ "flush-write-stream": "^1.0.2" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "p-locate": "^4.1.0" } }, "lodash": { @@ -7017,6 +8463,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -7028,14 +8480,6 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -7297,12 +8741,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -7389,6 +8827,21 @@ } } }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -7446,6 +8899,129 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nyc": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -7483,20 +9059,6 @@ "wrappy": "1" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -7552,6 +9114,24 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -7560,6 +9140,24 @@ "aggregate-error": "^3.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -7581,6 +9179,12 @@ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -7618,12 +9222,21 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, "proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -7635,6 +9248,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, "promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -7726,6 +9348,15 @@ "util-deprecate": "^1.0.1" } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -7793,10 +9424,10 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve-alpn": { @@ -7804,6 +9435,12 @@ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, "resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -7867,12 +9504,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==" }, "set-blocking": { "version": "2.0.0", @@ -7931,14 +9565,39 @@ } } }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "optional": true, "requires": { - "amdefine": ">=0.0.4" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "sprintf-js": { @@ -8029,21 +9688,18 @@ "ansi-regex": "^5.0.1" } }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, "tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", @@ -8094,6 +9750,33 @@ "readable-stream": "^3.1.1" } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -8201,22 +9884,21 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "is-typedarray": "^1.0.0" } }, - "uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", - "dev": true, - "optional": true - }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -8254,6 +9936,16 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8418,14 +10110,11 @@ "webidl-conversions": "^3.0.0" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true }, "wide-align": { "version": "1.1.5", @@ -8441,18 +10130,6 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -8515,6 +10192,18 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", diff --git a/package.json b/package.json index 6dba1e13f..85daada4f 100644 --- a/package.json +++ b/package.json @@ -54,11 +54,11 @@ "clean-for-publish": "~1.0.2", "combyne": "~0.8.1", "coveralls": "^3.0.2", - "istanbul": "^0.4.5", "js-beautify": "~1.5.10", "jshint": "^2.10.0", "lcov-result-merger": "^3.1.0", "mocha": "^5.2.0", + "nyc": "^17.1.0", "walk": "^2.3.9" }, "binary": { diff --git a/test/index.js b/test/index.js index 4891a0dba..b138525e1 100644 --- a/test/index.js +++ b/test/index.js @@ -2,8 +2,13 @@ var fork = require("child_process").fork; var path = require("path"); var fs = require('fs'); -var bin = "./node_modules/.bin/istanbul"; -var cov = "cover --report=lcov --dir=test/coverage/js _mocha --".split(" "); +var bin = "./node_modules/.bin/nyc"; +var cov = [ + "--reporter=lcov", + "--reporter=text-summary", + "--report-dir=test/coverage/js", + "mocha" +] if (process.platform === 'win32') { bin = "./node_modules/mocha/bin/mocha"; From efeb29ae166701c6f11b4e28ef9cd8caeb5881f2 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 21 Oct 2024 16:45:29 -0700 Subject: [PATCH 477/545] remove unneccessary constructor declarations c++20 got stricter with it's requirements for aggregate initialization I guess, and these structs are POD so there should be no point in specifying any constructors at all --- .../templates/manual/repository/statistics.cc | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index bca4aa268..8b7f84fe0 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -206,13 +206,6 @@ struct OdbObjectsData static constexpr uint32_t kUnreachable = 0; struct CommitInfo { - CommitInfo() = default; - ~CommitInfo() = default; - CommitInfo(const CommitInfo &other) = delete; - CommitInfo(CommitInfo &&other) = default; - CommitInfo& operator=(const CommitInfo &other) = delete; - CommitInfo& operator=(CommitInfo &&other) = default; - std::string oidTree {}; size_t size {0}; std::vector parents {}; @@ -222,13 +215,6 @@ struct OdbObjectsData }; struct TreeInfoAndStats { - TreeInfoAndStats() = default; - ~TreeInfoAndStats() = default; - TreeInfoAndStats(const TreeInfoAndStats &other) = delete; - TreeInfoAndStats(TreeInfoAndStats &&other) = default; - TreeInfoAndStats& operator=(const TreeInfoAndStats &other) = delete; - TreeInfoAndStats& operator=(TreeInfoAndStats &&other) = default; - size_t size {0}; size_t numEntries {0}; std::vector entryBlobs {}; @@ -241,13 +227,6 @@ struct OdbObjectsData }; struct BlobInfo { - BlobInfo() = default; - ~BlobInfo() = default; - BlobInfo(const BlobInfo &other) = delete; - BlobInfo(BlobInfo &&other) = default; - BlobInfo& operator=(const BlobInfo &other) = delete; - BlobInfo& operator=(BlobInfo &&other) = default; - size_t size {0}; // number of sources from which a blob can be reached: // a tree's entry, or a tag @@ -257,13 +236,6 @@ struct OdbObjectsData struct TagInfo { static constexpr uint32_t kUnsetDepth = 0; - TagInfo() = default; - ~TagInfo() = default; - TagInfo(const TagInfo &other) = delete; - TagInfo(TagInfo &&other) = default; - TagInfo& operator=(const TagInfo &other) = delete; - TagInfo& operator=(TagInfo &&other) = default; - std::string oidTarget {}; git_object_t typeTarget {GIT_OBJECT_INVALID}; uint32_t depth {kUnsetDepth}; From 461962a70d5a3dc376471337a2aa8a6d662921fa Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 20 Jan 2025 12:43:47 -0700 Subject: [PATCH 478/545] update cxxStandard determination for C++20 --- utils/defaultCxxStandard.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/utils/defaultCxxStandard.js b/utils/defaultCxxStandard.js index bc42a39a6..5a7d7beb5 100644 --- a/utils/defaultCxxStandard.js +++ b/utils/defaultCxxStandard.js @@ -1,18 +1,24 @@ const targetSpecified = process.argv[2] !== 'none'; -let isNode18OrElectron20AndUp = false; +let cxxStandard = '14'; + if (targetSpecified) { // Assume electron if target is specified. // If building node 18 / 19 via target, will need to specify C++ standard manually const majorVersion = process.argv[2].split('.')[0]; - isNode18OrElectron20AndUp = majorVersion >= 20; + if (Number.parseInt(majorVersion) >= 32) { + cxxStandard = '20'; + } else if (Number.parseInt(majorVersion) >= 21) { + cxxStandard = '17'; + } } else { + const abiVersion = Number.parseInt(process.versions.modules) ?? 0; // Node 18 === 108 - isNode18OrElectron20AndUp = Number.parseInt(process.versions.modules) >= 108; + if (abiVersion >= 131) { + cxxStandard = '20'; + } else if (abiVersion >= 108) { + cxxStandard = '17'; + } } -const defaultCxxStandard = isNode18OrElectron20AndUp - ? '17' - : '14'; - -process.stdout.write(defaultCxxStandard); +process.stdout.write(cxxStandard); From f353fe1e4b5265ea4073c074e4e81e9d679286f9 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 31 Jan 2025 12:30:22 -0700 Subject: [PATCH 479/545] bump nan --- package-lock.json | 15 ++++++++------- package.json | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c59d00deb..b737a2300 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@axosoft/nan": "^2.20.0-gk.1", + "@axosoft/nan": "^2.22.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", @@ -52,9 +52,10 @@ } }, "node_modules/@axosoft/nan": { - "version": "2.20.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.20.0-gk.1.tgz", - "integrity": "sha512-IHQhM1EddFkgPuLMWvMU/qpNyNaNTlCMTXp79Pb36HJRgV/vai3gxPh0csluVqDyXS4zdqXRiuw1lVs+N12R0g==" + "version": "2.22.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.22.0-gk.1.tgz", + "integrity": "sha512-C4xrZ5HQoWwoq/WZnKDhf/Jd/czIaa0gsjHV792qUp7b7H+4Xtw1Um10BiiU/zrgmGhQuA92dedU2/rGvKErNg==", + "license": "MIT" }, "node_modules/@babel/code-frame": { "version": "7.26.2", @@ -5829,9 +5830,9 @@ } }, "@axosoft/nan": { - "version": "2.20.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.20.0-gk.1.tgz", - "integrity": "sha512-IHQhM1EddFkgPuLMWvMU/qpNyNaNTlCMTXp79Pb36HJRgV/vai3gxPh0csluVqDyXS4zdqXRiuw1lVs+N12R0g==" + "version": "2.22.0-gk.1", + "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.22.0-gk.1.tgz", + "integrity": "sha512-C4xrZ5HQoWwoq/WZnKDhf/Jd/czIaa0gsjHV792qUp7b7H+4Xtw1Um10BiiU/zrgmGhQuA92dedU2/rGvKErNg==" }, "@babel/code-frame": { "version": "7.26.2", diff --git a/package.json b/package.json index 85daada4f..621ed7131 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "node": ">= 16" }, "dependencies": { - "@axosoft/nan": "^2.20.0-gk.1", + "@axosoft/nan": "^2.22.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", "got": "^11.8.6", From 3abb8fcd583ca73290e9516b74aa2c8d775aa79a Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 10 Feb 2025 12:41:19 -0700 Subject: [PATCH 480/545] fix use-after-free causing intermittent failures in Repository::statistics() git_reference_target just returns a pointer to the git_reference's oid, it does not clone it so freeing the reference then wipes the oid --- .../templates/manual/repository/statistics.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index 8b7f84fe0..8b04cc31a 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -1020,11 +1020,13 @@ int RepoAnalysis::storeAndCountRefs() } // obtain peeled oid of the reference - const git_oid *oid_ref {nullptr}; + bool found_oid = false; + git_oid oid_ref; switch (git_reference_type(ref)) { case GIT_REFERENCE_DIRECT: - oid_ref = git_reference_target(ref); + git_oid_cpy(&oid_ref, git_reference_target(ref)); + found_oid = true; break; case GIT_REFERENCE_SYMBOLIC: @@ -1035,7 +1037,8 @@ int RepoAnalysis::storeAndCountRefs() git_strarray_dispose(&ref_list); return errorCode; } - oid_ref = git_reference_target(ref_resolved); + git_oid_cpy(&oid_ref, git_reference_target(ref_resolved)); + found_oid = true; git_reference_free(ref_resolved); } break; @@ -1045,17 +1048,17 @@ int RepoAnalysis::storeAndCountRefs() } // store object's oid and type - if (oid_ref != nullptr) + if (found_oid) { git_object *target {nullptr}; - if ((errorCode = git_object_lookup(&target, m_repo, oid_ref, GIT_OBJECT_ANY)) != GIT_OK) { + if ((errorCode = git_object_lookup(&target, m_repo, &oid_ref, GIT_OBJECT_ANY)) != GIT_OK) { git_reference_free(ref); git_strarray_dispose(&ref_list); return errorCode; } m_peeledRefs.emplace(std::make_pair( - std::string(reinterpret_cast(oid_ref->id), GIT_OID_RAWSZ), + std::string(reinterpret_cast(oid_ref.id), GIT_OID_RAWSZ), git_object_type(target))); git_object_free(target); From 13836c6ad0b4c4871c3d5bb53caad94f1e6865df Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 10 Feb 2025 12:41:38 -0700 Subject: [PATCH 481/545] ignore nyc output --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 99a83fc4a..feb22eaa2 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ .DS_STORE .idea .clangd +.nyc_output/ .vscode jsconfig.json From 68dbe802cae3cdcff6cad1f1f0d7c45df3e42a20 Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 11 Feb 2025 14:55:05 -0700 Subject: [PATCH 482/545] Bump to v0.28.0-alpha.29 --- CHANGELOG.md | 19 ++++++++++++++----- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 247721a00..af39f9095 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## v0.28.0-alpha.29 [(2025-02-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.29) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.28...v0.28.0-alpha.29) + +#### Summary of Changes +- Build on Electron 34+ +- fix use-after-free in Repository::statistics() + +#### Merged PRs into NodeGit +- [Bump @axosoft/nan and add ability to compile for c++20](https://github.com/nodegit/nodegit/pull/2012) +- [Fix Github Action workflow](https://github.com/nodegit/nodegit/pull/2014) + + ## v0.28.0-alpha.28 [(2024-07-01)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.28) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.27...v0.28.0-alpha.28) @@ -4094,8 +4107,4 @@ We have added Node 6 as a supported platform! Going forward we aim to have 1:1 s [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.0.1...v0.0.2) -## v0.0.1 [(2011-03-10)](https://github.com/nodegit/nodegit/tree/v0.0.1) - - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* +## v0.0.1 [(2011-03-10)](https://github.com/nodegit/nodegit/tree/v0.0.1) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b737a2300..19c0840ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodegit", - "version": "0.28.0-alpha.28", + "version": "0.28.0-alpha.29", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 621ed7131..df260834f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.28", + "version": "0.28.0-alpha.29", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From dba7cb85cc380cec50ff75b3e5b7c4177ddf46f7 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 13 Feb 2025 11:22:14 -0700 Subject: [PATCH 483/545] define NOMINMAX on windows necessary until node23 for building on newere versions of v8 --- generate/templates/templates/binding.gyp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 771eca54f..09ca6713c 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -152,7 +152,8 @@ }] ], "defines": [ - "_HAS_EXCEPTIONS=1" + "_HAS_EXCEPTIONS=1", + "NOMINMAX=1" ], "msvs_settings": { "VCCLCompilerTool": { From 8f485fab438f41ce891f74d7ebe8a018e2e2fe2d Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 13 Feb 2025 16:13:57 -0700 Subject: [PATCH 484/545] bump to 0.28.0-alpha.30 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19c0840ff..c4e3f1604 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.29", + "version": "0.28.0-alpha.30", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.28", + "version": "0.28.0-alpha.30", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index df260834f..2406899fa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.29", + "version": "0.28.0-alpha.30", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From d19dcd77082b87e7250073d908459eef9e3bba0a Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 20 May 2025 09:42:18 -0700 Subject: [PATCH 485/545] bump libgit2 and fix build config fixup --- generate/input/libgit2-docs.json | 78145 ++++++++--------- generate/templates/templates/class_header.h | 1 + generate/templates/templates/struct_header.h | 1 + vendor/libgit2 | 2 +- vendor/libgit2.gyp | 20 +- 5 files changed, 37402 insertions(+), 40767 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 32160fef8..5870c608a 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -1,40797 +1,37418 @@ { - "files": [ - { - "file": "git2/annotated_commit.h", - "functions": [ - "git_annotated_commit_from_ref", - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_lookup", - "git_annotated_commit_from_revspec", - "git_annotated_commit_id", - "git_annotated_commit_ref", - "git_annotated_commit_free" - ], - "meta": {}, - "lines": 121 - }, - { - "file": "git2/apply.h", - "functions": [ - "git_apply_delta_cb", - "git_apply_hunk_cb", - "git_apply_options_init", - "git_apply_to_tree", - "git_apply" - ], - "meta": {}, - "lines": 161 - }, - { - "file": "git2/attr.h", - "functions": [ - "git_attr_value", - "git_attr_get", - "git_attr_get_ext", - "git_attr_get_many", - "git_attr_get_many_ext", - "git_attr_foreach_cb", - "git_attr_foreach", - "git_attr_foreach_ext", - "git_attr_cache_flush", - "git_attr_add_macro" - ], - "meta": {}, - "lines": 365 - }, - { - "file": "git2/blame.h", - "functions": [ - "git_blame_options_init", - "git_blame_get_hunk_count", - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline", - "git_blame_file", - "git_blame_buffer", - "git_blame_free" - ], - "meta": {}, - "lines": 280 - }, - { - "file": "git2/blob.h", - "functions": [ - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_blob_free", - "git_blob_id", - "git_blob_owner", - "git_blob_rawcontent", - "git_blob_rawsize", - "git_blob_filter_options_init", - "git_blob_filter", - "git_blob_create_from_workdir", - "git_blob_create_from_disk", - "git_blob_create_from_stream", - "git_blob_create_from_stream_commit", - "git_blob_create_from_buffer", - "git_blob_is_binary", - "git_blob_data_is_binary", - "git_blob_dup" - ], - "meta": {}, - "lines": 307 - }, - { - "file": "git2/branch.h", - "functions": [ - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_delete", - "git_branch_iterator_new", - "git_branch_next", - "git_branch_iterator_free", - "git_branch_move", - "git_branch_lookup", - "git_branch_name", - "git_branch_upstream", - "git_branch_set_upstream", - "git_branch_upstream_name", - "git_branch_is_head", - "git_branch_is_checked_out", - "git_branch_remote_name", - "git_branch_upstream_remote", - "git_branch_upstream_merge", - "git_branch_name_is_valid" - ], - "meta": {}, - "lines": 332 - }, - { - "file": "git2/buffer.h", - "functions": [ - "git_buf_dispose" - ], - "meta": {}, - "lines": 68 - }, - { - "file": "git2/cert.h", - "functions": [ - "git_transport_certificate_check_cb" - ], - "meta": {}, - "lines": 168 - }, - { - "file": "git2/checkout.h", - "functions": [ - "git_checkout_notify_cb", - "git_checkout_progress_cb", - "git_checkout_perfdata_cb", - "git_checkout_options_init", - "git_checkout_head", - "git_checkout_index", - "git_checkout_tree" - ], - "meta": {}, - "lines": 413 - }, - { - "file": "git2/cherrypick.h", - "functions": [ - "git_cherrypick_options_init", - "git_cherrypick_commit", - "git_cherrypick" - ], - "meta": {}, - "lines": 86 - }, - { - "file": "git2/clone.h", - "functions": [ - "git_remote_create_cb", - "git_repository_create_cb", - "git_clone_options_init", - "git_clone" - ], - "meta": {}, - "lines": 205 - }, - { - "file": "git2/commit.h", - "functions": [ - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_commit_free", - "git_commit_id", - "git_commit_owner", - "git_commit_message_encoding", - "git_commit_message", - "git_commit_message_raw", - "git_commit_summary", - "git_commit_body", - "git_commit_time", - "git_commit_time_offset", - "git_commit_committer", - "git_commit_author", - "git_commit_committer_with_mailmap", - "git_commit_author_with_mailmap", - "git_commit_raw_header", - "git_commit_tree", - "git_commit_tree_id", - "git_commit_parentcount", - "git_commit_parent", - "git_commit_parent_id", - "git_commit_nth_gen_ancestor", - "git_commit_header_field", - "git_commit_extract_signature", - "git_commit_create", - "git_commit_create_v", - "git_commit_amend", - "git_commit_create_buffer", - "git_commit_create_with_signature", - "git_commit_dup", - "git_commit_create_cb" - ], - "meta": {}, - "lines": 542 - }, - { - "file": "git2/common.h", - "functions": [ - "git_libgit2_version", - "git_libgit2_prerelease", - "git_libgit2_features", - "git_libgit2_opts" - ], - "meta": {}, - "lines": 512 - }, - { - "file": "git2/config.h", - "functions": [ - "git_config_entry_free", - "git_config_foreach_cb", - "git_config_find_global", - "git_config_find_xdg", - "git_config_find_system", - "git_config_find_programdata", - "git_config_open_default", - "git_config_new", - "git_config_add_file_ondisk", - "git_config_open_ondisk", - "git_config_open_level", - "git_config_open_global", - "git_config_snapshot", - "git_config_free", - "git_config_get_entry", - "git_config_get_int32", - "git_config_get_int64", - "git_config_get_bool", - "git_config_get_path", - "git_config_get_string", - "git_config_get_string_buf", - "git_config_get_multivar_foreach", - "git_config_multivar_iterator_new", - "git_config_next", - "git_config_iterator_free", - "git_config_set_int32", - "git_config_set_int64", - "git_config_set_bool", - "git_config_set_string", - "git_config_set_multivar", - "git_config_delete_entry", - "git_config_delete_multivar", - "git_config_foreach", - "git_config_iterator_new", - "git_config_iterator_glob_new", - "git_config_foreach_match", - "git_config_get_mapped", - "git_config_lookup_map_value", - "git_config_parse_bool", - "git_config_parse_int32", - "git_config_parse_int64", - "git_config_parse_path", - "git_config_backend_foreach_match", - "git_config_lock" - ], - "meta": {}, - "lines": 778 - }, - { - "file": "git2/credential.h", - "functions": [ - "git_credential_acquire_cb", - "git_credential_free", - "git_credential_has_username", - "git_credential_get_username", - "git_credential_userpass_plaintext_new", - "git_credential_default_new", - "git_credential_username_new", - "git_credential_ssh_key_new", - "git_credential_ssh_key_memory_new", - "git_credential_ssh_interactive_new", - "git_credential_ssh_key_from_agent", - "git_credential_ssh_custom_new" - ], - "meta": {}, - "lines": 311 - }, - { - "file": "git2/credential_helpers.h", - "functions": [ - "git_credential_userpass" - ], - "meta": {}, - "lines": 49 - }, - { - "file": "git2/deprecated.h", - "functions": [ - "git_blob_filtered_content", - "git_filter_list_stream_data", - "git_filter_list_apply_to_data", - "git_treebuilder_write_with_buffer", - "git_buf_grow", - "git_buf_set", - "git_buf_is_binary", - "git_buf_contains_nul", - "git_buf_free", - "git_commit_signing_cb", - "git_diff_format_email", - "git_diff_commit_as_email", - "git_diff_format_email_options_init", - "giterr_last", - "giterr_clear", - "giterr_set_str", - "giterr_set_oom", - "git_object__size", - "git_remote_is_valid_name", - "git_reference_is_valid_name", - "git_oidarray_free", - "git_headlist_cb", - "git_strarray_copy", - "git_strarray_free", - "git_blame_init_options" - ], - "meta": {}, - "lines": 905 - }, - { - "file": "git2/describe.h", - "functions": [ - "git_describe_options_init", - "git_describe_format_options_init", - "git_describe_commit", - "git_describe_workdir", - "git_describe_format", - "git_describe_result_free" - ], - "meta": {}, - "lines": 189 - }, - { - "file": "git2/diff.h", - "functions": [ - "git_diff_notify_cb", - "git_diff_progress_cb", - "git_diff_options_init", - "git_diff_file_cb", - "git_diff_binary_cb", - "git_diff_hunk_cb", - "git_diff_line_cb", - "git_diff_find_options_init", - "git_diff_free", - "git_diff_tree_to_tree", - "git_diff_tree_to_index", - "git_diff_index_to_workdir", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_diff_index_to_index", - "git_diff_merge", - "git_diff_find_similar", - "git_diff_num_deltas", - "git_diff_num_deltas_of_type", - "git_diff_get_delta", - "git_diff_is_sorted_icase", - "git_diff_foreach", - "git_diff_status_char", - "git_diff_print", - "git_diff_to_buf", - "git_diff_blobs", - "git_diff_blob_to_buffer", - "git_diff_buffers", - "git_diff_from_buffer", - "git_diff_get_stats", - "git_diff_stats_files_changed", - "git_diff_stats_insertions", - "git_diff_stats_deletions", - "git_diff_stats_to_buf", - "git_diff_stats_free", - "git_diff_patchid_options_init", - "git_diff_patchid" - ], - "meta": {}, - "lines": 1471 - }, - { - "file": "git2/email.h", - "functions": [], - "meta": {}, - "lines": 38 - }, - { - "file": "git2/errors.h", - "functions": [ - "git_error_last", - "git_error_clear", - "git_error_set", - "git_error_set_str", - "git_error_set_oom" - ], - "meta": {}, - "lines": 177 - }, - { - "file": "git2/filter.h", - "functions": [ - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_contains", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_file", - "git_filter_list_apply_to_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_file", - "git_filter_list_stream_blob", - "git_filter_list_free" - ], - "meta": {}, - "lines": 269 - }, - { - "file": "git2/global.h", - "functions": [ - "git_libgit2_init", - "git_libgit2_shutdown" - ], - "meta": {}, - "lines": 39 - }, - { - "file": "git2/graph.h", - "functions": [ - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any" - ], - "meta": {}, - "lines": 73 - }, - { - "file": "git2/ignore.h", - "functions": [ - "git_ignore_add_rule", - "git_ignore_clear_internal_rules", - "git_ignore_path_is_ignored" - ], - "meta": {}, - "lines": 74 - }, - { - "file": "git2/index.h", - "functions": [ - "git_index_matched_path_cb", - "git_index_free", - "git_index_owner", - "git_index_caps", - "git_index_set_caps", - "git_index_version", - "git_index_set_version", - "git_index_read", - "git_index_write", - "git_index_path", - "git_index_checksum", - "git_index_read_tree", - "git_index_write_tree", - "git_index_write_tree_to", - "git_index_entrycount", - "git_index_clear", - "git_index_get_byindex", - "git_index_get_bypath", - "git_index_remove", - "git_index_remove_directory", - "git_index_add", - "git_index_entry_stage", - "git_index_entry_is_conflict", - "git_index_iterator_new", - "git_index_iterator_next", - "git_index_iterator_free", - "git_index_add_bypath", - "git_index_add_from_buffer", - "git_index_remove_bypath", - "git_index_add_all", - "git_index_remove_all", - "git_index_update_all", - "git_index_find", - "git_index_find_prefix", - "git_index_conflict_add", - "git_index_conflict_get", - "git_index_conflict_remove", - "git_index_conflict_cleanup", - "git_index_has_conflicts", - "git_index_conflict_iterator_new", - "git_index_conflict_next", - "git_index_conflict_iterator_free" - ], - "meta": {}, - "lines": 844 - }, - { - "file": "git2/indexer.h", - "functions": [ - "git_indexer_progress_cb", - "git_indexer_options_init", - "git_indexer_new", - "git_indexer_append", - "git_indexer_commit", - "git_indexer_hash", - "git_indexer_name", - "git_indexer_free" - ], - "meta": {}, - "lines": 191 - }, - { - "file": "git2/mailmap.h", - "functions": [ - "git_mailmap_new", - "git_mailmap_free", - "git_mailmap_add_entry", - "git_mailmap_from_buffer", - "git_mailmap_from_repository", - "git_mailmap_resolve", - "git_mailmap_resolve_signature" - ], - "meta": {}, - "lines": 111 - }, - { - "file": "git2/merge.h", - "functions": [ - "git_merge_file_input_init", - "git_merge_file_options_init", - "git_merge_options_init", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_merge_base", - "git_merge_bases", - "git_merge_base_many", - "git_merge_bases_many", - "git_merge_base_octopus", - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_result_free", - "git_merge_trees", - "git_merge_commits", - "git_merge" - ], - "meta": {}, - "lines": 622 - }, - { - "file": "git2/message.h", - "functions": [ - "git_message_prettify", - "git_message_trailers", - "git_message_trailer_array_free" - ], - "meta": {}, - "lines": 81 - }, - { - "file": "git2/net.h", - "functions": [], - "meta": {}, - "lines": 50 - }, - { - "file": "git2/notes.h", - "functions": [ - "git_note_foreach_cb", - "git_note_iterator_new", - "git_note_commit_iterator_new", - "git_note_iterator_free", - "git_note_next", - "git_note_read", - "git_note_commit_read", - "git_note_author", - "git_note_committer", - "git_note_message", - "git_note_id", - "git_note_create", - "git_note_commit_create", - "git_note_remove", - "git_note_commit_remove", - "git_note_free", - "git_note_default_ref", - "git_note_foreach" - ], - "meta": {}, - "lines": 302 - }, - { - "file": "git2/object.h", - "functions": [ - "git_object_lookup", - "git_object_lookup_prefix", - "git_object_lookup_bypath", - "git_object_id", - "git_object_short_id", - "git_object_type", - "git_object_owner", - "git_object_free", - "git_object_type2string", - "git_object_string2type", - "git_object_typeisloose", - "git_object_peel", - "git_object_dup", - "git_object_rawcontent_is_valid" - ], - "meta": {}, - "lines": 273 - }, - { - "file": "git2/odb.h", - "functions": [ - "git_odb_foreach_cb", - "git_odb_add_disk_alternate", - "git_odb_free", - "git_odb_read", - "git_odb_read_prefix", - "git_odb_read_header", - "git_odb_exists", - "git_odb_exists_ext", - "git_odb_exists_prefix", - "git_odb_expand_ids", - "git_odb_refresh", - "git_odb_foreach", - "git_odb_write", - "git_odb_open_wstream", - "git_odb_stream_write", - "git_odb_stream_finalize_write", - "git_odb_stream_read", - "git_odb_stream_free", - "git_odb_open_rstream", - "git_odb_write_pack", - "git_odb_write_multi_pack_index", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_data", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_add_backend", - "git_odb_add_alternate", - "git_odb_num_backends", - "git_odb_get_backend", - "git_odb_set_commit_graph" - ], - "meta": {}, - "lines": 650 - }, - { - "file": "git2/odb_backend.h", - "functions": [], - "meta": {}, - "lines": 219 - }, - { - "file": "git2/oid.h", - "functions": [ - "git_oid_fmt", - "git_oid_nfmt", - "git_oid_pathfmt", - "git_oid_tostr_s", - "git_oid_tostr", - "git_oid_cpy", - "git_oid_cmp", - "git_oid_equal", - "git_oid_ncmp", - "git_oid_streq", - "git_oid_strcmp", - "git_oid_is_zero", - "git_oid_shorten_new", - "git_oid_shorten_add", - "git_oid_shorten_free" - ], - "meta": {}, - "lines": 369 - }, - { - "file": "git2/oidarray.h", - "functions": [ - "git_oidarray_dispose" - ], - "meta": {}, - "lines": 31 - }, - { - "file": "git2/pack.h", - "functions": [ - "git_packbuilder_new", - "git_packbuilder_set_threads", - "git_packbuilder_insert", - "git_packbuilder_insert_tree", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_walk", - "git_packbuilder_insert_recur", - "git_packbuilder_write_buf", - "git_packbuilder_write", - "git_packbuilder_hash", - "git_packbuilder_name", - "git_packbuilder_foreach_cb", - "git_packbuilder_foreach", - "git_packbuilder_object_count", - "git_packbuilder_written", - "git_packbuilder_progress", - "git_packbuilder_set_callbacks", - "git_packbuilder_free" - ], - "meta": {}, - "lines": 263 - }, - { - "file": "git2/patch.h", - "functions": [ - "git_patch_owner", - "git_patch_from_diff", - "git_patch_from_blobs", - "git_patch_from_blob_and_buffer", - "git_patch_from_buffers", - "git_patch_free", - "git_patch_get_delta", - "git_patch_num_hunks", - "git_patch_line_stats", - "git_patch_get_hunk", - "git_patch_num_lines_in_hunk", - "git_patch_get_line_in_hunk", - "git_patch_size", - "git_patch_print", - "git_patch_to_buf" - ], - "meta": {}, - "lines": 284 - }, - { - "file": "git2/pathspec.h", - "functions": [ - "git_pathspec_new", - "git_pathspec_free", - "git_pathspec_matches_path", - "git_pathspec_match_workdir", - "git_pathspec_match_index", - "git_pathspec_match_tree", - "git_pathspec_match_diff", - "git_pathspec_match_list_free", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_failed_entry" - ], - "meta": {}, - "lines": 277 - }, - { - "file": "git2/proxy.h", - "functions": [ - "git_proxy_options_init" - ], - "meta": {}, - "lines": 94 - }, - { - "file": "git2/rebase.h", - "functions": [ - "git_rebase_options_init", - "git_rebase_init", - "git_rebase_open", - "git_rebase_orig_head_name", - "git_rebase_orig_head_id", - "git_rebase_onto_name", - "git_rebase_onto_id", - "git_rebase_operation_entrycount", - "git_rebase_operation_current", - "git_rebase_operation_byindex", - "git_rebase_next", - "git_rebase_inmemory_index", - "git_rebase_commit", - "git_rebase_abort", - "git_rebase_finish", - "git_rebase_free" - ], - "meta": {}, - "lines": 395 - }, - { - "file": "git2/refdb.h", - "functions": [ - "git_refdb_new", - "git_refdb_open", - "git_refdb_compress", - "git_refdb_free" - ], - "meta": {}, - "lines": 66 - }, - { - "file": "git2/reflog.h", - "functions": [ - "git_reflog_read", - "git_reflog_write", - "git_reflog_append", - "git_reflog_rename", - "git_reflog_delete", - "git_reflog_entrycount", - "git_reflog_entry_byindex", - "git_reflog_drop", - "git_reflog_entry_id_old", - "git_reflog_entry_id_new", - "git_reflog_entry_committer", - "git_reflog_entry_message", - "git_reflog_free" - ], - "meta": {}, - "lines": 166 - }, - { - "file": "git2/refs.h", - "functions": [ - "git_reference_lookup", - "git_reference_name_to_id", - "git_reference_dwim", - "git_reference_symbolic_create_matching", - "git_reference_symbolic_create", - "git_reference_create", - "git_reference_create_matching", - "git_reference_target", - "git_reference_target_peel", - "git_reference_symbolic_target", - "git_reference_type", - "git_reference_name", - "git_reference_resolve", - "git_reference_owner", - "git_reference_symbolic_set_target", - "git_reference_set_target", - "git_reference_rename", - "git_reference_delete", - "git_reference_remove", - "git_reference_list", - "git_reference_foreach_cb", - "git_reference_foreach_name_cb", - "git_reference_foreach", - "git_reference_foreach_name", - "git_reference_dup", - "git_reference_free", - "git_reference_cmp", - "git_reference_iterator_new", - "git_reference_iterator_glob_new", - "git_reference_next", - "git_reference_next_name", - "git_reference_iterator_free", - "git_reference_foreach_glob", - "git_reference_has_log", - "git_reference_ensure_log", - "git_reference_is_branch", - "git_reference_is_remote", - "git_reference_is_tag", - "git_reference_is_note", - "git_reference_normalize_name", - "git_reference_peel", - "git_reference_name_is_valid", - "git_reference_shorthand" - ], - "meta": {}, - "lines": 767 - }, - { - "file": "git2/refspec.h", - "functions": [ - "git_refspec_parse", - "git_refspec_free", - "git_refspec_src", - "git_refspec_dst", - "git_refspec_string", - "git_refspec_force", - "git_refspec_direction", - "git_refspec_src_matches", - "git_refspec_dst_matches", - "git_refspec_transform", - "git_refspec_rtransform" - ], - "meta": {}, - "lines": 117 - }, - { - "file": "git2/remote.h", - "functions": [ - "git_remote_create", - "git_remote_create_options_init", - "git_remote_create_with_opts", - "git_remote_create_with_fetchspec", - "git_remote_create_anonymous", - "git_remote_create_detached", - "git_remote_lookup", - "git_remote_dup", - "git_remote_owner", - "git_remote_name", - "git_remote_url", - "git_remote_pushurl", - "git_remote_set_url", - "git_remote_set_pushurl", - "git_remote_set_instance_url", - "git_remote_set_instance_pushurl", - "git_remote_add_fetch", - "git_remote_get_fetch_refspecs", - "git_remote_add_push", - "git_remote_get_push_refspecs", - "git_remote_refspec_count", - "git_remote_get_refspec", - "git_remote_ls", - "git_remote_connected", - "git_remote_stop", - "git_remote_disconnect", - "git_remote_free", - "git_remote_list", - "git_push_transfer_progress_cb", - "git_push_negotiation", - "git_push_update_reference_cb", - "git_url_resolve_cb", - "git_remote_ready_cb", - "git_remote_init_callbacks", - "git_fetch_options_init", - "git_push_options_init", - "git_remote_connect_options_init", - "git_remote_connect", - "git_remote_connect_ext", - "git_remote_download", - "git_remote_upload", - "git_remote_update_tips", - "git_remote_fetch", - "git_remote_prune", - "git_remote_push", - "git_remote_stats", - "git_remote_autotag", - "git_remote_set_autotag", - "git_remote_prune_refs", - "git_remote_rename", - "git_remote_name_is_valid", - "git_remote_delete", - "git_remote_default_branch" - ], - "meta": {}, - "lines": 1169 - }, - { - "file": "git2/repository.h", - "functions": [ - "git_repository_open", - "git_repository_open_from_worktree", - "git_repository_discover", - "git_repository_open_ext", - "git_repository_open_bare", - "git_repository_free", - "git_repository_init", - "git_repository_init_options_init", - "git_repository_init_ext", - "git_repository_head", - "git_repository_head_for_worktree", - "git_repository_head_detached", - "git_repository_head_detached_for_worktree", - "git_repository_head_unborn", - "git_repository_is_empty", - "git_repository_item_path", - "git_repository_path", - "git_repository_workdir", - "git_repository_commondir", - "git_repository_set_workdir", - "git_repository_is_bare", - "git_repository_is_worktree", - "git_repository_config", - "git_repository_config_snapshot", - "git_repository_odb", - "git_repository_refdb", - "git_repository_index", - "git_repository_message", - "git_repository_message_remove", - "git_repository_state_cleanup", - "git_repository_fetchhead_foreach_cb", - "git_repository_fetchhead_foreach", - "git_repository_mergehead_foreach_cb", - "git_repository_mergehead_foreach", - "git_repository_hashfile", - "git_repository_set_head", - "git_repository_set_head_detached", - "git_repository_set_head_detached_from_annotated", - "git_repository_detach_head", - "git_repository_state", - "git_repository_set_namespace", - "git_repository_get_namespace", - "git_repository_is_shallow", - "git_repository_ident", - "git_repository_set_ident", - "git_repository_oid_type" - ], - "meta": {}, - "lines": 979 - }, - { - "file": "git2/reset.h", - "functions": [ - "git_reset", - "git_reset_from_annotated", - "git_reset_default" - ], - "meta": {}, - "lines": 107 - }, - { - "file": "git2/revert.h", - "functions": [ - "git_revert_options_init", - "git_revert_commit", - "git_revert" - ], - "meta": {}, - "lines": 86 - }, - { - "file": "git2/revparse.h", - "functions": [ - "git_revparse_single", - "git_revparse_ext", - "git_revparse" - ], - "meta": {}, - "lines": 108 - }, - { - "file": "git2/revwalk.h", - "functions": [ - "git_revwalk_new", - "git_revwalk_reset", - "git_revwalk_push", - "git_revwalk_push_glob", - "git_revwalk_push_head", - "git_revwalk_hide", - "git_revwalk_hide_glob", - "git_revwalk_hide_head", - "git_revwalk_push_ref", - "git_revwalk_hide_ref", - "git_revwalk_next", - "git_revwalk_sorting", - "git_revwalk_push_range", - "git_revwalk_simplify_first_parent", - "git_revwalk_free", - "git_revwalk_repository", - "git_revwalk_hide_cb", - "git_revwalk_add_hide_cb" - ], - "meta": {}, - "lines": 298 - }, - { - "file": "git2/signature.h", - "functions": [ - "git_signature_new", - "git_signature_now", - "git_signature_default", - "git_signature_from_buffer", - "git_signature_dup", - "git_signature_free" - ], - "meta": {}, - "lines": 99 - }, - { - "file": "git2/stash.h", - "functions": [ - "git_stash_save", - "git_stash_save_options_init", - "git_stash_save_with_opts", - "git_stash_apply_progress_cb", - "git_stash_apply_options_init", - "git_stash_apply", - "git_stash_cb", - "git_stash_foreach", - "git_stash_drop", - "git_stash_pop" - ], - "meta": {}, - "lines": 310 - }, - { - "file": "git2/status.h", - "functions": [ - "git_status_cb", - "git_status_options_init", - "git_status_foreach", - "git_status_foreach_ext", - "git_status_file", - "git_status_list_new", - "git_status_list_entrycount", - "git_status_byindex", - "git_status_list_free", - "git_status_should_ignore" - ], - "meta": {}, - "lines": 448 - }, - { - "file": "git2/strarray.h", - "functions": [ - "git_strarray_dispose" - ], - "meta": {}, - "lines": 37 - }, - { - "file": "git2/submodule.h", - "functions": [ - "git_submodule_cb", - "git_submodule_update_options_init", - "git_submodule_update", - "git_submodule_lookup", - "git_submodule_dup", - "git_submodule_free", - "git_submodule_foreach", - "git_submodule_add_setup", - "git_submodule_clone", - "git_submodule_add_finalize", - "git_submodule_add_to_index", - "git_submodule_owner", - "git_submodule_name", - "git_submodule_path", - "git_submodule_url", - "git_submodule_resolve_url", - "git_submodule_branch", - "git_submodule_set_branch", - "git_submodule_set_url", - "git_submodule_index_id", - "git_submodule_head_id", - "git_submodule_wd_id", - "git_submodule_ignore", - "git_submodule_set_ignore", - "git_submodule_update_strategy", - "git_submodule_set_update", - "git_submodule_fetch_recurse_submodules", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_init", - "git_submodule_repo_init", - "git_submodule_sync", - "git_submodule_open", - "git_submodule_reload", - "git_submodule_status", - "git_submodule_location" - ], - "meta": {}, - "lines": 664 - }, - { - "file": "git2/sys/commit_graph.h", - "functions": [], - "meta": {}, - "lines": 108 - }, - { - "file": "git2/sys/filter.h", - "functions": [], - "meta": {}, - "lines": 95 - }, - { - "file": "git2/sys/hashsig.h", - "functions": [], - "meta": {}, - "lines": 45 - }, - { - "file": "git2/sys/merge.h", - "functions": [], - "meta": {}, - "lines": 41 - }, - { - "file": "git2/sys/path.h", - "functions": [], - "meta": {}, - "lines": 41 - }, - { - "file": "git2/sys/stream.h", - "functions": [], - "meta": {}, - "lines": 97 - }, - { - "file": "git2/sys/transport.h", - "functions": [], - "meta": {}, - "lines": 318 - }, - { - "file": "git2/tag.h", - "functions": [ - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_tag_free", - "git_tag_id", - "git_tag_owner", - "git_tag_target", - "git_tag_target_id", - "git_tag_target_type", - "git_tag_name", - "git_tag_tagger", - "git_tag_message", - "git_tag_create", - "git_tag_annotation_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_delete", - "git_tag_list", - "git_tag_list_match", - "git_tag_foreach_cb", - "git_tag_foreach", - "git_tag_peel", - "git_tag_dup", - "git_tag_name_is_valid" - ], - "meta": {}, - "lines": 379 - }, - { - "file": "git2/trace.h", - "functions": [ - "git_trace_cb", - "git_trace_set" - ], - "meta": {}, - "lines": 63 - }, - { - "file": "git2/transaction.h", - "functions": [ - "git_transaction_new", - "git_transaction_lock_ref", - "git_transaction_set_target", - "git_transaction_set_symbolic_target", - "git_transaction_set_reflog", - "git_transaction_remove", - "git_transaction_commit", - "git_transaction_free" - ], - "meta": {}, - "lines": 117 - }, - { - "file": "git2/transport.h", - "functions": [ - "git_transport_message_cb", - "git_transport_cb" - ], - "meta": {}, - "lines": 37 - }, - { - "file": "git2/tree.h", - "functions": [ - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_tree_free", - "git_tree_id", - "git_tree_owner", - "git_tree_entrycount", - "git_tree_entry_byname", - "git_tree_entry_byindex", - "git_tree_entry_byid", - "git_tree_entry_bypath", - "git_tree_entry_dup", - "git_tree_entry_free", - "git_tree_entry_name", - "git_tree_entry_id", - "git_tree_entry_type", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_cmp", - "git_tree_entry_to_object", - "git_treebuilder_new", - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_remove", - "git_treebuilder_filter_cb", - "git_treebuilder_filter", - "git_treebuilder_write", - "git_treewalk_cb", - "git_tree_walk", - "git_tree_dup", - "git_tree_create_updated" - ], - "meta": {}, - "lines": 470 - }, - { - "file": "git2/types.h", - "functions": [], - "meta": {}, - "lines": 366 - }, - { - "file": "git2/worktree.h", - "functions": [ - "git_worktree_list", - "git_worktree_lookup", - "git_worktree_open_from_repository", - "git_worktree_free", - "git_worktree_validate", - "git_worktree_add_options_init", - "git_worktree_add", - "git_worktree_lock", - "git_worktree_unlock", - "git_worktree_is_locked", - "git_worktree_name", - "git_worktree_path", - "git_worktree_prune_options_init", - "git_worktree_is_prunable", - "git_worktree_prune" - ], - "meta": {}, - "lines": 264 - } - ], - "functions": { - "git_annotated_commit_from_ref": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 33, - "lineto": 36, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given reference" - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "reference to use to lookup the git_annotated_commit" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const git_reference *ref", - "sig": "git_annotated_commit **::git_repository *::const git_reference *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_annotated_commit_from_ref-1" - ] - } - }, - "git_annotated_commit_from_fetchhead": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 50, - "lineto": 55, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given commit" - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "name of the (remote) branch" - }, - { - "name": "remote_url", - "type": "const char *", - "comment": "url of the remote" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the commit object id of the remote branch" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const char *branch_name, const char *remote_url, const git_oid *id", - "sig": "git_annotated_commit **::git_repository *::const char *::const char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from the given fetch head data.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "", - "group": "annotated" - }, - "git_annotated_commit_lookup": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 75, - "lineto": 78, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given commit" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the commit object id to lookup" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const git_oid *id", - "sig": "git_annotated_commit **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", - "comments": "

An annotated commit contains information about how it was looked up, which may be useful for functions like merge or rebase to provide context to the operation. For example, conflict files will include the name of the source or target branches being merged. It is therefore preferable to use the most specific function (eg git_annotated_commit_from_ref) instead of this one when that data is known.

\n", - "group": "annotated" - }, - "git_annotated_commit_from_revspec": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 92, - "lineto": 95, - "args": [ - { - "name": "out", - "type": "git_annotated_commit **", - "comment": "pointer to store the git_annotated_commit result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given commit" - }, - { - "name": "revspec", - "type": "const char *", - "comment": "the extended sha syntax string to use to lookup the commit" - } - ], - "argline": "git_annotated_commit **out, git_repository *repo, const char *revspec", - "sig": "git_annotated_commit **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Creates a git_annotated_commit from a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", - "group": "annotated" - }, - "git_annotated_commit_id": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 103, - "lineto": 104, - "args": [ - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": "the given annotated commit" - } - ], - "argline": "const git_annotated_commit *commit", - "sig": "const git_annotated_commit *", - "return": { - "type": "const git_oid *", - "comment": " commit id" - }, - "description": "

Gets the commit ID that the given git_annotated_commit refers to.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_annotated_commit_id-2" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_annotated_commit_id-1", - "ex/v1.7.2/merge.html#git_annotated_commit_id-2", - "ex/v1.7.2/merge.html#git_annotated_commit_id-3" - ] - } - }, - "git_annotated_commit_ref": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 112, - "lineto": 113, - "args": [ - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": "the given annotated commit" - } - ], - "argline": "const git_annotated_commit *commit", - "sig": "const git_annotated_commit *", - "return": { - "type": "const char *", - "comment": " ref name." - }, - "description": "

Get the refname that the given git_annotated_commit refers to.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_annotated_commit_ref-3", - "ex/v1.7.2/checkout.html#git_annotated_commit_ref-4", - "ex/v1.7.2/checkout.html#git_annotated_commit_ref-5" - ] - } - }, - "git_annotated_commit_free": { - "type": "function", - "file": "git2/annotated_commit.h", - "line": 120, - "lineto": 121, - "args": [ - { - "name": "commit", - "type": "git_annotated_commit *", - "comment": "annotated commit to free" - } - ], - "argline": "git_annotated_commit *commit", - "sig": "git_annotated_commit *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees a git_annotated_commit.

\n", - "comments": "", - "group": "annotated", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_annotated_commit_free-6" - ] - } - }, - "git_apply_options_init": { - "type": "function", - "file": "git2/apply.h", - "line": 106, - "lineto": 106, - "args": [ - { - "name": "opts", - "type": "git_apply_options *", - "comment": "The `git_apply_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_APPLY_OPTIONS_VERSION`" - } - ], - "argline": "git_apply_options *opts, unsigned int version", - "sig": "git_apply_options *::unsigned int", - "return": { - "type": "int", - "comment": " 0 on success or -1 on failure." - }, - "description": "

Initialize git_apply_options structure

\n", - "comments": "

Initialize a git_apply_options with default values. Equivalent to creating an instance with GIT_APPLY_OPTIONS_INIT.

\n", - "group": "apply" - }, - "git_apply_to_tree": { - "type": "function", - "file": "git2/apply.h", - "line": 119, - "lineto": 124, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "the postimage of the application" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to apply" - }, - { - "name": "preimage", - "type": "git_tree *", - "comment": "the tree to apply the diff to" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "the diff to apply" - }, - { - "name": "options", - "type": "const git_apply_options *", - "comment": "the options for the apply (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, git_tree *preimage, git_diff *diff, const git_apply_options *options", - "sig": "git_index **::git_repository *::git_tree *::git_diff *::const git_apply_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Apply a git_diff to a git_tree, and return the resulting image\n as an index.

\n", - "comments": "", - "group": "apply" - }, - "git_apply": { - "type": "function", - "file": "git2/apply.h", - "line": 157, - "lineto": 161, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to apply to" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "the diff to apply" - }, - { - "name": "location", - "type": "git_apply_location_t", - "comment": "the location to apply (workdir, index or both)" - }, - { - "name": "options", - "type": "const git_apply_options *", - "comment": "the options for the apply (or null for defaults)" - } - ], - "argline": "git_repository *repo, git_diff *diff, git_apply_location_t location, const git_apply_options *options", - "sig": "git_repository *::git_diff *::git_apply_location_t::const git_apply_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Apply a git_diff to the given repository, making changes directly\n in the working directory, the index, or both.

\n", - "comments": "", - "group": "apply" - }, - "git_attr_value": { - "type": "function", - "file": "git2/attr.h", - "line": 102, - "lineto": 102, - "args": [ - { - "name": "attr", - "type": "const char *", - "comment": "The attribute" - } - ], - "argline": "const char *attr", - "sig": "const char *", - "return": { - "type": "git_attr_value_t", - "comment": " the value type for the attribute" - }, - "description": "

Return the value type for a given attribute.

\n", - "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute was not set at all), or VALUE, if the attribute was set to an actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally as a NULL-terminated C string.

\n", - "group": "attr" - }, - "git_attr_get": { - "type": "function", - "file": "git2/attr.h", - "line": 182, - "lineto": 187, - "args": [ - { - "name": "value_out", - "type": "const char **", - "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the attribute to look up." - } - ], - "argline": "const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name", - "sig": "const char **::git_repository *::uint32_t::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Look up the value of one git attribute for path.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_get_ext": { - "type": "function", - "file": "git2/attr.h", - "line": 205, - "lineto": 210, - "args": [ - { - "name": "value_out", - "type": "const char **", - "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "opts", - "type": "git_attr_options *", - "comment": "The `git_attr_options` to use when querying these attributes." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the attribute to look up." - } - ], - "argline": "const char **value_out, git_repository *repo, git_attr_options *opts, const char *path, const char *name", - "sig": "const char **::git_repository *::git_attr_options *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Look up the value of one git attribute for path with extended options.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_get_many": { - "type": "function", - "file": "git2/attr.h", - "line": 242, - "lineto": 248, - "args": [ - { - "name": "values_out", - "type": "const char **", - "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." - }, - { - "name": "num_attr", - "type": "size_t", - "comment": "The number of attributes being looked up" - }, - { - "name": "names", - "type": "const char **", - "comment": "An array of num_attr strings containing attribute names." - } - ], - "argline": "const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names", - "sig": "const char **::git_repository *::uint32_t::const char *::size_t::const char **", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Look up a list of git attributes for path.

\n", - "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", - "group": "attr" - }, - "git_attr_get_many_ext": { - "type": "function", - "file": "git2/attr.h", - "line": 267, - "lineto": 273, - "args": [ - { - "name": "values_out", - "type": "const char **", - "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "opts", - "type": "git_attr_options *", - "comment": "The `git_attr_options` to use when querying these attributes." - }, - { - "name": "path", - "type": "const char *", - "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." - }, - { - "name": "num_attr", - "type": "size_t", - "comment": "The number of attributes being looked up" - }, - { - "name": "names", - "type": "const char **", - "comment": "An array of num_attr strings containing attribute names." - } - ], - "argline": "const char **values_out, git_repository *repo, git_attr_options *opts, const char *path, size_t num_attr, const char **names", - "sig": "const char **::git_repository *::git_attr_options *::const char *::size_t::const char **", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Look up a list of git attributes for path with extended options.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_foreach": { - "type": "function", - "file": "git2/attr.h", - "line": 306, - "lineto": 311, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "A combination of GIT_ATTR_CHECK... flags." - }, - { - "name": "path", - "type": "const char *", - "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." - }, - { - "name": "callback", - "type": "git_attr_foreach_cb", - "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." - }, - { - "name": "payload", - "type": "void *", - "comment": "Passed on as extra parameter to callback function." - } - ], - "argline": "git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload", - "sig": "git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all the git attributes for a path.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_foreach_ext": { - "type": "function", - "file": "git2/attr.h", - "line": 326, - "lineto": 331, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the path." - }, - { - "name": "opts", - "type": "git_attr_options *", - "comment": "The `git_attr_options` to use when querying these attributes." - }, - { - "name": "path", - "type": "const char *", - "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." - }, - { - "name": "callback", - "type": "git_attr_foreach_cb", - "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." - }, - { - "name": "payload", - "type": "void *", - "comment": "Passed on as extra parameter to callback function." - } - ], - "argline": "git_repository *repo, git_attr_options *opts, const char *path, git_attr_foreach_cb callback, void *payload", - "sig": "git_repository *::git_attr_options *::const char *::git_attr_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all the git attributes for a path with extended options.

\n", - "comments": "", - "group": "attr" - }, - "git_attr_cache_flush": { - "type": "function", - "file": "git2/attr.h", - "line": 344, - "lineto": 345, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the gitattributes cache" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Flush the gitattributes cache.

\n", - "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", - "group": "attr" - }, - "git_attr_add_macro": { - "type": "function", - "file": "git2/attr.h", - "line": 362, - "lineto": 365, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository to add the macro in." - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the macro." - }, - { - "name": "values", - "type": "const char *", - "comment": "The value for the macro." - } - ], - "argline": "git_repository *repo, const char *name, const char *values", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Add a macro definition.

\n", - "comments": "

Macros will automatically be loaded from the top level .gitattributes file of the repository (plus the built-in "binary" macro). This function allows you to add others. For example, to add the default macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", - "group": "attr" - }, - "git_blame_options_init": { - "type": "function", - "file": "git2/blame.h", - "line": 138, - "lineto": 140, - "args": [ - { - "name": "opts", - "type": "git_blame_options *", - "comment": "The `git_blame_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_BLAME_OPTIONS_VERSION`." - } - ], - "argline": "git_blame_options *opts, unsigned int version", - "sig": "git_blame_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_blame_options structure

\n", - "comments": "

Initializes a git_blame_options with default values. Equivalent to creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", - "group": "blame" - }, - "git_blame_get_hunk_count": { - "type": "function", - "file": "git2/blame.h", - "line": 210, - "lineto": 210, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": "The blame structure to query." - } - ], - "argline": "git_blame *blame", - "sig": "git_blame *", - "return": { - "type": "uint32_t", - "comment": " The number of hunks." - }, - "description": "

Gets the number of hunks that exist in the blame structure.

\n", - "comments": "", - "group": "blame" - }, - "git_blame_get_hunk_byindex": { - "type": "function", - "file": "git2/blame.h", - "line": 219, - "lineto": 221, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": "the blame structure to query" - }, - { - "name": "index", - "type": "uint32_t", - "comment": "index of the hunk to retrieve" - } - ], - "argline": "git_blame *blame, uint32_t index", - "sig": "git_blame *::uint32_t", - "return": { - "type": "const git_blame_hunk *", - "comment": " the hunk at the given index, or NULL on error" - }, - "description": "

Gets the blame hunk at the given index.

\n", - "comments": "", - "group": "blame" - }, - "git_blame_get_hunk_byline": { - "type": "function", - "file": "git2/blame.h", - "line": 230, - "lineto": 232, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": "the blame structure to query" - }, - { - "name": "lineno", - "type": "size_t", - "comment": "the (1-based) line number to find a hunk for" - } - ], - "argline": "git_blame *blame, size_t lineno", - "sig": "git_blame *::size_t", - "return": { - "type": "const git_blame_hunk *", - "comment": " the hunk that contains the given line, or NULL on error" - }, - "description": "

Gets the hunk that relates to the given line number in the newest commit.

\n", - "comments": "", - "group": "blame", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_blame_get_hunk_byline-1" - ] - } - }, - "git_blame_file": { - "type": "function", - "file": "git2/blame.h", - "line": 245, - "lineto": 249, - "args": [ - { - "name": "out", - "type": "git_blame **", - "comment": "pointer that will receive the blame object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository whose history is to be walked" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to file to consider" - }, - { - "name": "options", - "type": "git_blame_options *", - "comment": "options for the blame operation. If NULL, this is treated as\n though GIT_BLAME_OPTIONS_INIT were passed." - } - ], - "argline": "git_blame **out, git_repository *repo, const char *path, git_blame_options *options", - "sig": "git_blame **::git_repository *::const char *::git_blame_options *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error.)" - }, - "description": "

Get the blame for a single file.

\n", - "comments": "", - "group": "blame", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_blame_file-2" - ] - } - }, - "git_blame_buffer": { - "type": "function", - "file": "git2/blame.h", - "line": 269, - "lineto": 273, - "args": [ - { - "name": "out", - "type": "git_blame **", - "comment": "pointer that will receive the resulting blame data" - }, - { - "name": "reference", - "type": "git_blame *", - "comment": "cached blame from the history of the file (usually the output\n from git_blame_file)" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "the (possibly) modified contents of the file" - }, - { - "name": "buffer_len", - "type": "size_t", - "comment": "number of valid bytes in the buffer" - } - ], - "argline": "git_blame **out, git_blame *reference, const char *buffer, size_t buffer_len", - "sig": "git_blame **::git_blame *::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" - }, - "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", - "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", - "group": "blame" - }, - "git_blame_free": { - "type": "function", - "file": "git2/blame.h", - "line": 280, - "lineto": 280, - "args": [ - { - "name": "blame", - "type": "git_blame *", - "comment": "the blame structure to free" - } - ], - "argline": "git_blame *blame", - "sig": "git_blame *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free memory allocated by git_blame_file or git_blame_buffer.

\n", - "comments": "", - "group": "blame", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_blame_free-3" - ] - } - }, - "git_blob_lookup": { - "type": "function", - "file": "git2/blob.h", - "line": 33, - "lineto": 33, - "args": [ - { - "name": "blob", - "type": "git_blob **", - "comment": "pointer to the looked up blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the blob." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the blob to locate." - } - ], - "argline": "git_blob **blob, git_repository *repo, const git_oid *id", - "sig": "git_blob **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a blob object from a repository.

\n", - "comments": "", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_blob_lookup-4" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_blob_lookup-1" - ] - } - }, - "git_blob_lookup_prefix": { - "type": "function", - "file": "git2/blob.h", - "line": 47, - "lineto": 47, - "args": [ - { - "name": "blob", - "type": "git_blob **", - "comment": "pointer to the looked up blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the blob." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the blob to locate." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_blob **blob, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_blob **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a blob object from a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "", - "group": "blob" - }, - "git_blob_free": { - "type": "function", - "file": "git2/blob.h", - "line": 60, - "lineto": 60, - "args": [ - { - "name": "blob", - "type": "git_blob *", - "comment": "the blob to close" - } - ], - "argline": "git_blob *blob", - "sig": "git_blob *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open blob

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_blob_free-5" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_blob_free-2" - ] - } - }, - "git_blob_id": { - "type": "function", - "file": "git2/blob.h", - "line": 68, - "lineto": 68, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "a previously loaded blob." - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "const git_oid *", - "comment": " SHA1 hash for this blob." - }, - "description": "

Get the id of a blob.

\n", - "comments": "", - "group": "blob" - }, - "git_blob_owner": { - "type": "function", - "file": "git2/blob.h", - "line": 76, - "lineto": 76, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "A previously loaded blob." - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this blob." - }, - "description": "

Get the repository that contains the blob.

\n", - "comments": "", - "group": "blob" - }, - "git_blob_rawcontent": { - "type": "function", - "file": "git2/blob.h", - "line": 89, - "lineto": 89, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "pointer to the blob" - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "const void *", - "comment": " the pointer, or NULL on error" - }, - "description": "

Get a read-only buffer with the raw content of a blob.

\n", - "comments": "

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.

\n", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_blob_rawcontent-6" - ], - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_blob_rawcontent-1" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_blob_rawcontent-3" - ] - } - }, - "git_blob_rawsize": { - "type": "function", - "file": "git2/blob.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "pointer to the blob" - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "git_object_size_t", - "comment": " size on bytes" - }, - "description": "

Get the size in bytes of the contents of a blob

\n", - "comments": "", - "group": "blob", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_blob_rawsize-7" - ], - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_blob_rawsize-2" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_blob_rawsize-4", - "ex/v1.7.2/general.html#git_blob_rawsize-5" - ] - } - }, - "git_blob_filter_options_init": { - "type": "function", - "file": "git2/blob.h", - "line": 164, - "lineto": 164, - "args": [ - { - "name": "opts", - "type": "git_blob_filter_options *", - "comment": "The `git_blob_filter_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_BLOB_FILTER_OPTIONS_VERSION`." - } - ], - "argline": "git_blob_filter_options *opts, unsigned int version", - "sig": "git_blob_filter_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_blob_filter_options structure

\n", - "comments": "

Initializes a git_blob_filter_options with default values. Equivalent to creating an instance with GIT_BLOB_FILTER_OPTIONS_INIT.

\n", - "group": "blob" - }, - "git_blob_filter": { - "type": "function", - "file": "git2/blob.h", - "line": 188, - "lineto": 192, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The git_buf to be filled in" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "Pointer to the blob" - }, - { - "name": "as_path", - "type": "const char *", - "comment": "Path used for file attribute lookups, etc." - }, - { - "name": "opts", - "type": "git_blob_filter_options *", - "comment": "Options to use for filtering the blob" - } - ], - "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", - "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Get a buffer with the filtered content of a blob.

\n", - "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", - "group": "blob" - }, - "git_blob_create_from_workdir": { - "type": "function", - "file": "git2/blob.h", - "line": 205, - "lineto": 205, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "return the id of the written blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the blob will be written.\n\tthis repository cannot be bare" - }, - { - "name": "relative_path", - "type": "const char *", - "comment": "file from which the blob will be created,\n\trelative to the repository's working dir" - } - ], - "argline": "git_oid *id, git_repository *repo, const char *relative_path", - "sig": "git_oid *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read a file from the working folder of a repository\n and write it to the Object Database as a loose blob

\n", - "comments": "", - "group": "blob" - }, - "git_blob_create_from_disk": { - "type": "function", - "file": "git2/blob.h", - "line": 217, - "lineto": 217, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "return the id of the written blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the blob will be written.\n\tthis repository can be bare or not" - }, - { - "name": "path", - "type": "const char *", - "comment": "file from which the blob will be created" - } - ], - "argline": "git_oid *id, git_repository *repo, const char *path", - "sig": "git_oid *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read a file from the filesystem and write its content\n to the Object Database as a loose blob

\n", - "comments": "", - "group": "blob" - }, - "git_blob_create_from_stream": { - "type": "function", - "file": "git2/blob.h", - "line": 244, - "lineto": 247, - "args": [ - { - "name": "out", - "type": "git_writestream **", - "comment": "the stream into which to write" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where the blob will be written.\n This repository can be bare or not." - }, - { - "name": "hintpath", - "type": "const char *", - "comment": "If not NULL, will be used to select data filters\n to apply onto the content of the blob to be created." - } - ], - "argline": "git_writestream **out, git_repository *repo, const char *hintpath", - "sig": "git_writestream **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or error code" - }, - "description": "

Create a stream to write a new blob into the object db

\n", - "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_from_buffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_from_stream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", - "group": "blob" - }, - "git_blob_create_from_stream_commit": { - "type": "function", - "file": "git2/blob.h", - "line": 258, - "lineto": 260, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the id of the new blob" - }, - { - "name": "stream", - "type": "git_writestream *", - "comment": "the stream to close" - } - ], - "argline": "git_oid *out, git_writestream *stream", - "sig": "git_oid *::git_writestream *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Close the stream and write the blob to the object db

\n", - "comments": "

The stream will be closed and freed.

\n", - "group": "blob" - }, - "git_blob_create_from_buffer": { - "type": "function", - "file": "git2/blob.h", - "line": 271, - "lineto": 272, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "return the id of the written blob" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the blob will be written" - }, - { - "name": "buffer", - "type": "const void *", - "comment": "data to be written into the blob" - }, - { - "name": "len", - "type": "size_t", - "comment": "length of the data" - } - ], - "argline": "git_oid *id, git_repository *repo, const void *buffer, size_t len", - "sig": "git_oid *::git_repository *::const void *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an in-memory buffer to the ODB as a blob

\n", - "comments": "", - "group": "blob" - }, - "git_blob_is_binary": { - "type": "function", - "file": "git2/blob.h", - "line": 285, - "lineto": 285, - "args": [ - { - "name": "blob", - "type": "const git_blob *", - "comment": "The blob which content should be analyzed" - } - ], - "argline": "const git_blob *blob", - "sig": "const git_blob *", - "return": { - "type": "int", - "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." - }, - "description": "

Determine if the blob content is most certainly binary or not.

\n", - "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", - "group": "blob" - }, - "git_blob_data_is_binary": { - "type": "function", - "file": "git2/blob.h", - "line": 297, - "lineto": 297, - "args": [ - { - "name": "data", - "type": "const char *", - "comment": "The blob data which content should be analyzed" - }, - { - "name": "len", - "type": "size_t", - "comment": "The length of the data" - } - ], - "argline": "const char *data, size_t len", - "sig": "const char *::size_t", - "return": { - "type": "int", - "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." - }, - "description": "

Determine if the given content is most certainly binary or not;\n this is the same mechanism used by git_blob_is_binary but only\n looking at raw data.

\n", - "comments": "", - "group": "blob" - }, - "git_blob_dup": { - "type": "function", - "file": "git2/blob.h", - "line": 307, - "lineto": 307, - "args": [ - { - "name": "out", - "type": "git_blob **", - "comment": "Pointer to store the copy of the object" - }, - { - "name": "source", - "type": "git_blob *", - "comment": "Original object to copy" - } - ], - "argline": "git_blob **out, git_blob *source", - "sig": "git_blob **::git_blob *", - "return": { - "type": "int", - "comment": " 0." - }, - "description": "

Create an in-memory copy of a blob. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "blob" - }, - "git_branch_create": { - "type": "function", - "file": "git2/branch.h", - "line": 52, - "lineto": 57, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer where to store the underlying reference." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to create the branch in." - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." - }, - { - "name": "target", - "type": "const git_commit *", - "comment": "Commit to which this branch should point. This object\n must belong to the given `repo`." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing branch." - } - ], - "argline": "git_reference **out, git_repository *repo, const char *branch_name, const git_commit *target, int force", - "sig": "git_reference **::git_repository *::const char *::const git_commit *::int", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit." - }, - "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

A new direct reference will be created pointing to this target commit. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "branch" - }, - "git_branch_create_from_annotated": { - "type": "function", - "file": "git2/branch.h", - "line": 70, - "lineto": 75, - "args": [ - { - "name": "ref_out", - "type": "git_reference **", - "comment": null - }, - { - "name": "repository", - "type": "git_repository *", - "comment": null - }, - { - "name": "branch_name", - "type": "const char *", - "comment": null - }, - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": null - }, - { - "name": "force", - "type": "int", - "comment": null - } - ], - "argline": "git_reference **ref_out, git_repository *repository, const char *branch_name, const git_annotated_commit *commit, int force", - "sig": "git_reference **::git_repository *::const char *::const git_annotated_commit *::int", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", - "group": "branch", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_branch_create_from_annotated-7" - ] - } - }, - "git_branch_delete": { - "type": "function", - "file": "git2/branch.h", - "line": 87, - "lineto": 87, - "args": [ - { - "name": "branch", - "type": "git_reference *", - "comment": "A valid reference representing a branch" - } - ], - "argline": "git_reference *branch", - "sig": "git_reference *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code." - }, - "description": "

Delete an existing branch reference.

\n", - "comments": "

Note that if the deletion succeeds, the reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", - "group": "branch" - }, - "git_branch_iterator_new": { - "type": "function", - "file": "git2/branch.h", - "line": 103, - "lineto": 106, - "args": [ - { - "name": "out", - "type": "git_branch_iterator **", - "comment": "the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the branches." - }, - { - "name": "list_flags", - "type": "git_branch_t", - "comment": "Filtering flags for the branch\n listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE\n or GIT_BRANCH_ALL." - } - ], - "argline": "git_branch_iterator **out, git_repository *repo, git_branch_t list_flags", - "sig": "git_branch_iterator **::git_repository *::git_branch_t", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Create an iterator which loops over the requested branches.

\n", - "comments": "", - "group": "branch" - }, - "git_branch_next": { - "type": "function", - "file": "git2/branch.h", - "line": 116, - "lineto": 116, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "the reference" - }, - { - "name": "out_type", - "type": "git_branch_t *", - "comment": "the type of branch (local or remote-tracking)" - }, - { - "name": "iter", - "type": "git_branch_iterator *", - "comment": "the branch iterator" - } - ], - "argline": "git_reference **out, git_branch_t *out_type, git_branch_iterator *iter", - "sig": "git_reference **::git_branch_t *::git_branch_iterator *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ITEROVER if there are no more branches or an error code." - }, - "description": "

Retrieve the next branch from the iterator

\n", - "comments": "", - "group": "branch" - }, - "git_branch_iterator_free": { - "type": "function", - "file": "git2/branch.h", - "line": 123, - "lineto": 123, - "args": [ - { - "name": "iter", - "type": "git_branch_iterator *", - "comment": "the iterator to free" - } - ], - "argline": "git_branch_iterator *iter", - "sig": "git_branch_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a branch iterator

\n", - "comments": "", - "group": "branch" - }, - "git_branch_move": { - "type": "function", - "file": "git2/branch.h", - "line": 146, - "lineto": 150, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "New reference object for the updated name." - }, - { - "name": "branch", - "type": "git_reference *", - "comment": "Current underlying reference of the branch." - }, - { - "name": "new_branch_name", - "type": "const char *", - "comment": "Target name of the branch once the move\n is performed; this name is validated for consistency." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing branch." - } - ], - "argline": "git_reference **out, git_reference *branch, const char *new_branch_name, int force", - "sig": "git_reference **::git_reference *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." - }, - "description": "

Move/rename an existing local branch reference.

\n", - "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

Note that if the move succeeds, the old reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", - "group": "branch" - }, - "git_branch_lookup": { - "type": "function", - "file": "git2/branch.h", - "line": 170, - "lineto": 174, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the looked-up branch reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the branch" - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "Name of the branch to be looked-up;\n this name is validated for consistency." - }, - { - "name": "branch_type", - "type": "git_branch_t", - "comment": "Type of the considered branch. This should\n be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE." - } - ], - "argline": "git_reference **out, git_repository *repo, const char *branch_name, git_branch_t branch_type", - "sig": "git_reference **::git_repository *::const char *::git_branch_t", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." - }, - "description": "

Lookup a branch by its name in a repository.

\n", - "comments": "

The generated reference must be freed by the user. The branch name will be checked for validity.

\n", - "group": "branch" - }, - "git_branch_name": { - "type": "function", - "file": "git2/branch.h", - "line": 191, - "lineto": 193, - "args": [ - { - "name": "out", - "type": "const char **", - "comment": "Pointer to the abbreviated reference name.\n Owned by ref, do not free." - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "A reference object, ideally pointing to a branch" - } - ], - "argline": "const char **out, const git_reference *ref", - "sig": "const char **::const git_reference *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_EINVALID if the reference isn't either a local or\n remote branch, otherwise an error code." - }, - "description": "

Get the branch name

\n", - "comments": "

Given a reference object, this will check that it really is a branch (ie. it lives under "refs/heads/" or "refs/remotes/"), and return the branch part of it.

\n", - "group": "branch", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_branch_name-4" - ] - } - }, - "git_branch_upstream": { - "type": "function", - "file": "git2/branch.h", - "line": 209, - "lineto": 211, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer where to store the retrieved reference." - }, - { - "name": "branch", - "type": "const git_reference *", - "comment": "Current underlying reference of the branch." - } - ], - "argline": "git_reference **out, const git_reference *branch", - "sig": "git_reference **::const git_reference *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code." - }, - "description": "

Get the upstream of a branch

\n", - "comments": "

Given a reference, this will return a new reference object corresponding to its remote tracking branch. The reference must be a local branch.

\n", - "group": "branch" - }, - "git_branch_set_upstream": { - "type": "function", - "file": "git2/branch.h", - "line": 228, - "lineto": 230, - "args": [ - { - "name": "branch", - "type": "git_reference *", - "comment": "the branch to configure" - }, - { - "name": "branch_name", - "type": "const char *", - "comment": "remote-tracking or local branch to set as upstream." - } - ], - "argline": "git_reference *branch, const char *branch_name", - "sig": "git_reference *::const char *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" - }, - "description": "

Set a branch's upstream branch

\n", - "comments": "

This will update the configuration to set the branch named branch_name as the upstream of branch. Pass a NULL name to unset the upstream information.

\n", - "group": "branch" - }, - "git_branch_upstream_name": { - "type": "function", - "file": "git2/branch.h", - "line": 246, - "lineto": 249, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer into which the name will be written." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the branches live." - }, - { - "name": "refname", - "type": "const char *", - "comment": "reference name of the local branch." - } - ], - "argline": "git_buf *out, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND when no remote tracking reference exists,\n or an error code." - }, - "description": "

Get the upstream name of a branch

\n", - "comments": "

Given a local branch, this will return its remote-tracking branch information, as a full reference name, ie. "feature/nice" would become "refs/remote/origin/feature/nice", depending on that branch's configuration.

\n", - "group": "branch" - }, - "git_branch_is_head": { - "type": "function", - "file": "git2/branch.h", - "line": 259, - "lineto": 260, - "args": [ - { - "name": "branch", - "type": "const git_reference *", - "comment": "A reference to a local branch." - } - ], - "argline": "const git_reference *branch", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 if HEAD points at the branch, 0 if it isn't, or a negative value\n \t\t as an error code." - }, - "description": "

Determine if HEAD points to the given branch

\n", - "comments": "", - "group": "branch" - }, - "git_branch_is_checked_out": { - "type": "function", - "file": "git2/branch.h", - "line": 272, - "lineto": 273, - "args": [ - { - "name": "branch", - "type": "const git_reference *", - "comment": "A reference to a local branch." - } - ], - "argline": "const git_reference *branch", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 if branch is checked out, 0 if it isn't, an error code otherwise." - }, - "description": "

Determine if any HEAD points to the current branch

\n", - "comments": "

This will iterate over all known linked repositories (usually in the form of worktrees) and report whether any HEAD is pointing at the current branch.

\n", - "group": "branch" - }, - "git_branch_remote_name": { - "type": "function", - "file": "git2/branch.h", - "line": 291, - "lineto": 294, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The buffer into which the name will be written." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository where the branch lives." - }, - { - "name": "refname", - "type": "const char *", - "comment": "complete name of the remote tracking branch." - } - ], - "argline": "git_buf *out, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND when no matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." - }, - "description": "

Find the remote name of a remote-tracking branch

\n", - "comments": "

This will return the name of the remote whose fetch refspec is matching the given branch. E.g. given a branch "refs/remotes/test/master", it will extract the "test" part. If refspecs from multiple remotes match, the function will return GIT_EAMBIGUOUS.

\n", - "group": "branch" - }, - "git_branch_upstream_remote": { - "type": "function", - "file": "git2/branch.h", - "line": 307, - "lineto": 307, - "args": [ - { - "name": "buf", - "type": "git_buf *", - "comment": "the buffer into which to write the name" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the full name of the branch" - } - ], - "argline": "git_buf *buf, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Retrieve the upstream remote of a local branch

\n", - "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", - "group": "branch" - }, - "git_branch_upstream_merge": { - "type": "function", - "file": "git2/branch.h", - "line": 320, - "lineto": 320, - "args": [ - { - "name": "buf", - "type": "git_buf *", - "comment": "the buffer into which to write the name" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the full name of the branch" - } - ], - "argline": "git_buf *buf, git_repository *repo, const char *refname", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Retrieve the upstream merge of a local branch

\n", - "comments": "

This will return the currently configured "branch.*.merge" for a given branch. This branch must be local.

\n", - "group": "branch" - }, - "git_branch_name_is_valid": { - "type": "function", - "file": "git2/branch.h", - "line": 332, - "lineto": 332, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given branch name" - }, - { - "name": "name", - "type": "const char *", - "comment": "a branch name to test" - } - ], - "argline": "int *valid, const char *name", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Determine whether a branch name is valid, meaning that (when prefixed\n with refs/heads/) that it is a valid reference name, and that any\n additional branch name restrictions are imposed (eg, it cannot start\n with a -).

\n", - "comments": "", - "group": "branch" - }, - "git_buf_dispose": { - "type": "function", - "file": "git2/buffer.h", - "line": 68, - "lineto": 68, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": "The buffer to deallocate" - } - ], - "argline": "git_buf *buffer", - "sig": "git_buf *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_buf.

\n", - "comments": "

Note that this does not free the git_buf itself, just the memory pointed to by buffer->ptr.

\n", - "group": "buf", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_buf_dispose-1", - "ex/v1.7.2/diff.html#git_buf_dispose-2" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_buf_dispose-1" - ] - } - }, - "git_checkout_options_init": { - "type": "function", - "file": "git2/checkout.h", - "line": 360, - "lineto": 362, - "args": [ - { - "name": "opts", - "type": "git_checkout_options *", - "comment": "The `git_checkout_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_CHECKOUT_OPTIONS_VERSION`." - } - ], - "argline": "git_checkout_options *opts, unsigned int version", - "sig": "git_checkout_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_checkout_options structure

\n", - "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", - "group": "checkout" - }, - "git_checkout_head": { - "type": "function", - "file": "git2/checkout.h", - "line": 381, - "lineto": 383, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository to check out (must be non-bare)" - }, - { - "name": "opts", - "type": "const git_checkout_options *", - "comment": "specifies checkout options (may be NULL)" - } - ], - "argline": "git_repository *repo, const git_checkout_options *opts", - "sig": "git_repository *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use git_error_last for error details)" - }, - "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", - "comments": "

Note that this is not the correct mechanism used to switch branches; do not change your HEAD and then call this method, that would leave you with checkout conflicts since your working directory would then appear to be dirty. Instead, checkout the target of the branch and then update HEAD using git_repository_set_head to point to the branch you checked out.

\n", - "group": "checkout" - }, - "git_checkout_index": { - "type": "function", - "file": "git2/checkout.h", - "line": 394, - "lineto": 397, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository into which to check out (must be non-bare)" - }, - { - "name": "index", - "type": "git_index *", - "comment": "index to be checked out (or NULL to use repository index)" - }, - { - "name": "opts", - "type": "const git_checkout_options *", - "comment": "specifies checkout options (may be NULL)" - } - ], - "argline": "git_repository *repo, git_index *index, const git_checkout_options *opts", - "sig": "git_repository *::git_index *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" - }, - "description": "

Updates files in the working tree to match the content of the index.

\n", - "comments": "", - "group": "checkout" - }, - "git_checkout_tree": { - "type": "function", - "file": "git2/checkout.h", - "line": 410, - "lineto": 413, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository to check out (must be non-bare)" - }, - { - "name": "treeish", - "type": "const git_object *", - "comment": "a commit, tag or tree which content will be used to update\n the working directory (or NULL to use HEAD)" - }, - { - "name": "opts", - "type": "const git_checkout_options *", - "comment": "specifies checkout options (may be NULL)" - } - ], - "argline": "git_repository *repo, const git_object *treeish, const git_checkout_options *opts", - "sig": "git_repository *::const git_object *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" - }, - "description": "

Updates files in the index and working tree to match the content of the\n tree pointed at by the treeish.

\n", - "comments": "", - "group": "checkout", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_checkout_tree-8" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_checkout_tree-5" - ] - } - }, - "git_cherrypick_options_init": { - "type": "function", - "file": "git2/cherrypick.h", - "line": 49, - "lineto": 51, - "args": [ - { - "name": "opts", - "type": "git_cherrypick_options *", - "comment": "The `git_cherrypick_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_CHERRYPICK_OPTIONS_VERSION`." - } - ], - "argline": "git_cherrypick_options *opts, unsigned int version", - "sig": "git_cherrypick_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_cherrypick_options structure

\n", - "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", - "group": "cherrypick" - }, - "git_cherrypick_commit": { - "type": "function", - "file": "git2/cherrypick.h", - "line": 67, - "lineto": 73, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository that contains the given commits" - }, - { - "name": "cherrypick_commit", - "type": "git_commit *", - "comment": "the commit to cherry-pick" - }, - { - "name": "our_commit", - "type": "git_commit *", - "comment": "the commit to cherry-pick against (eg, HEAD)" - }, - { - "name": "mainline", - "type": "unsigned int", - "comment": "the parent of the `cherrypick_commit`, if it is a merge" - }, - { - "name": "merge_options", - "type": "const git_merge_options *", - "comment": "the merge options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, git_commit *cherrypick_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", - "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Cherry-picks the given commit against the given "our" commit, producing an\n index that reflects the result of the cherry-pick.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "cherrypick" - }, - "git_cherrypick": { - "type": "function", - "file": "git2/cherrypick.h", - "line": 83, - "lineto": 86, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to cherry-pick" - }, - { - "name": "commit", - "type": "git_commit *", - "comment": "the commit to cherry-pick" - }, - { - "name": "cherrypick_options", - "type": "const git_cherrypick_options *", - "comment": "the cherry-pick options (or null for defaults)" - } - ], - "argline": "git_repository *repo, git_commit *commit, const git_cherrypick_options *cherrypick_options", - "sig": "git_repository *::git_commit *::const git_cherrypick_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Cherry-pick the given commit, producing changes in the index and working directory.

\n", - "comments": "", - "group": "cherrypick" - }, - "git_clone_options_init": { - "type": "function", - "file": "git2/clone.h", - "line": 181, - "lineto": 183, - "args": [ - { - "name": "opts", - "type": "git_clone_options *", - "comment": "The `git_clone_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_CLONE_OPTIONS_VERSION`." - } - ], - "argline": "git_clone_options *opts, unsigned int version", - "sig": "git_clone_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_clone_options structure

\n", - "comments": "

Initializes a git_clone_options with default values. Equivalent to creating an instance with GIT_CLONE_OPTIONS_INIT.

\n", - "group": "clone" - }, - "git_clone": { - "type": "function", - "file": "git2/clone.h", - "line": 201, - "lineto": 205, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "pointer that will receive the resulting repository object" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote repository to clone" - }, - { - "name": "local_path", - "type": "const char *", - "comment": "local directory to clone to" - }, - { - "name": "options", - "type": "const git_clone_options *", - "comment": "configuration options for the clone. If NULL, the\n function works as though GIT_OPTIONS_INIT were passed." - } - ], - "argline": "git_repository **out, const char *url, const char *local_path, const git_clone_options *options", - "sig": "git_repository **::const char *::const char *::const git_clone_options *", - "return": { - "type": "int", - "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" - }, - "description": "

Clone a remote repository.

\n", - "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n", - "group": "clone" - }, - "git_commit_lookup": { - "type": "function", - "file": "git2/commit.h", - "line": 36, - "lineto": 37, - "args": [ - { - "name": "commit", - "type": "git_commit **", - "comment": "pointer to the looked up commit" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the commit." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." - } - ], - "argline": "git_commit **commit, git_repository *repo, const git_oid *id", - "sig": "git_commit **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a commit object from a repository.

\n", - "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", - "group": "commit", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_commit_lookup-9" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_commit_lookup-6", - "ex/v1.7.2/general.html#git_commit_lookup-7", - "ex/v1.7.2/general.html#git_commit_lookup-8" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_lookup-1" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_commit_lookup-6" - ] - } - }, - "git_commit_lookup_prefix": { - "type": "function", - "file": "git2/commit.h", - "line": 55, - "lineto": 56, - "args": [ - { - "name": "commit", - "type": "git_commit **", - "comment": "pointer to the looked up commit" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the commit." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_commit **commit, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_commit **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n", - "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", - "group": "commit" - }, - "git_commit_free": { - "type": "function", - "file": "git2/commit.h", - "line": 70, - "lineto": 70, - "args": [ - { - "name": "commit", - "type": "git_commit *", - "comment": "the commit to close" - } - ], - "argline": "git_commit *commit", - "sig": "git_commit *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open commit

\n", - "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", - "group": "commit", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_commit_free-10" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_commit_free-9", - "ex/v1.7.2/general.html#git_commit_free-10", - "ex/v1.7.2/general.html#git_commit_free-11", - "ex/v1.7.2/general.html#git_commit_free-12", - "ex/v1.7.2/general.html#git_commit_free-13" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_free-2", - "ex/v1.7.2/log.html#git_commit_free-3", - "ex/v1.7.2/log.html#git_commit_free-4", - "ex/v1.7.2/log.html#git_commit_free-5" - ] - } - }, - "git_commit_id": { - "type": "function", - "file": "git2/commit.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_oid *", - "comment": " object identity for the commit." - }, - "description": "

Get the id of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_commit_id-14" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_id-6" - ] - } - }, - "git_commit_owner": { - "type": "function", - "file": "git2/commit.h", - "line": 86, - "lineto": 86, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "A previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this commit." - }, - "description": "

Get the repository that contains the commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_commit_owner-7", - "ex/v1.7.2/log.html#git_commit_owner-8" - ] - } - }, - "git_commit_message_encoding": { - "type": "function", - "file": "git2/commit.h", - "line": 98, - "lineto": 98, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " NULL, or the encoding" - }, - "description": "

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n", - "comments": "

The encoding may be NULL if the encoding header in the commit is missing; in that case UTF-8 is assumed.

\n", - "group": "commit" - }, - "git_commit_message": { - "type": "function", - "file": "git2/commit.h", - "line": 109, - "lineto": 109, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " the message of a commit" - }, - "description": "

Get the full message of a commit.

\n", - "comments": "

The returned message will be slightly prettified by removing any potential leading newlines.

\n", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_commit_message-3", - "ex/v1.7.2/cat-file.html#git_commit_message-4" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_commit_message-15", - "ex/v1.7.2/general.html#git_commit_message-16", - "ex/v1.7.2/general.html#git_commit_message-17" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_message-9", - "ex/v1.7.2/log.html#git_commit_message-10", - "ex/v1.7.2/log.html#git_commit_message-11" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_commit_message-2" - ] - } - }, - "git_commit_message_raw": { - "type": "function", - "file": "git2/commit.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " the raw message of a commit" - }, - "description": "

Get the full raw message of a commit.

\n", - "comments": "", - "group": "commit" - }, - "git_commit_summary": { - "type": "function", - "file": "git2/commit.h", - "line": 128, - "lineto": 128, - "args": [ - { - "name": "commit", - "type": "git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "git_commit *commit", - "sig": "git_commit *", - "return": { - "type": "const char *", - "comment": " the summary of a commit or NULL on error" - }, - "description": "

Get the short "summary" of the git commit message.

\n", - "comments": "

The returned message is the summary of the commit, comprising the first paragraph of the message with whitespace trimmed and squashed.

\n", - "group": "commit" - }, - "git_commit_body": { - "type": "function", - "file": "git2/commit.h", - "line": 141, - "lineto": 141, - "args": [ - { - "name": "commit", - "type": "git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "git_commit *commit", - "sig": "git_commit *", - "return": { - "type": "const char *", - "comment": " the body of a commit or NULL when no the message only\n consists of a summary" - }, - "description": "

Get the long "body" of the git commit message.

\n", - "comments": "

The returned message is the body of the commit, comprising everything but the first paragraph of the message. Leading and trailing whitespaces are trimmed.

\n", - "group": "commit" - }, - "git_commit_time": { - "type": "function", - "file": "git2/commit.h", - "line": 149, - "lineto": 149, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "git_time_t", - "comment": " the time of a commit" - }, - "description": "

Get the commit time (i.e. committer time) of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_commit_time-18", - "ex/v1.7.2/general.html#git_commit_time-19" - ] - } - }, - "git_commit_time_offset": { - "type": "function", - "file": "git2/commit.h", - "line": 157, - "lineto": 157, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "int", - "comment": " positive or negative timezone offset, in minutes from UTC" - }, - "description": "

Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.

\n", - "comments": "", - "group": "commit" - }, - "git_commit_committer": { - "type": "function", - "file": "git2/commit.h", - "line": 165, - "lineto": 165, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_signature *", - "comment": " the committer of a commit" - }, - "description": "

Get the committer of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_commit_committer-5" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_commit_committer-20" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_committer-12" - ] - } - }, - "git_commit_author": { - "type": "function", - "file": "git2/commit.h", - "line": 173, - "lineto": 173, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_signature *", - "comment": " the author of a commit" - }, - "description": "

Get the author of a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_commit_author-6" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_commit_author-21", - "ex/v1.7.2/general.html#git_commit_author-22" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_author-13", - "ex/v1.7.2/log.html#git_commit_author-14" - ] - } - }, - "git_commit_committer_with_mailmap": { - "type": "function", - "file": "git2/commit.h", - "line": 186, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "a pointer to store the resolved signature." - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "mailmap", - "type": "const git_mailmap *", - "comment": "the mailmap to resolve with. (may be NULL)" - } - ], - "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", - "sig": "git_signature **::const git_commit *::const git_mailmap *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the committer of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", - "comments": "

Call git_signature_free to free the signature.

\n", - "group": "commit" - }, - "git_commit_author_with_mailmap": { - "type": "function", - "file": "git2/commit.h", - "line": 200, - "lineto": 201, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "a pointer to store the resolved signature." - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "mailmap", - "type": "const git_mailmap *", - "comment": "the mailmap to resolve with. (may be NULL)" - } - ], - "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", - "sig": "git_signature **::const git_commit *::const git_mailmap *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the author of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", - "comments": "

Call git_signature_free to free the signature.

\n", - "group": "commit" - }, - "git_commit_raw_header": { - "type": "function", - "file": "git2/commit.h", - "line": 209, - "lineto": 209, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit" - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const char *", - "comment": " the header text of the commit" - }, - "description": "

Get the full raw text of the commit header.

\n", - "comments": "", - "group": "commit" - }, - "git_commit_tree": { - "type": "function", - "file": "git2/commit.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "tree_out", - "type": "git_tree **", - "comment": "pointer where to store the tree object" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "git_tree **tree_out, const git_commit *commit", - "sig": "git_tree **::const git_commit *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the tree pointed to by a commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_commit_tree-15", - "ex/v1.7.2/log.html#git_commit_tree-16", - "ex/v1.7.2/log.html#git_commit_tree-17", - "ex/v1.7.2/log.html#git_commit_tree-18", - "ex/v1.7.2/log.html#git_commit_tree-19" - ] - } - }, - "git_commit_tree_id": { - "type": "function", - "file": "git2/commit.h", - "line": 228, - "lineto": 228, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "const git_oid *", - "comment": " the id of tree pointed to by commit." - }, - "description": "

Get the id of the tree pointed to by a commit. This differs from\n git_commit_tree in that no attempts are made to fetch an object\n from the ODB.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_commit_tree_id-7" - ] - } - }, - "git_commit_parentcount": { - "type": "function", - "file": "git2/commit.h", - "line": 236, - "lineto": 236, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - } - ], - "argline": "const git_commit *commit", - "sig": "const git_commit *", - "return": { - "type": "unsigned int", - "comment": " integer of count of parents" - }, - "description": "

Get the number of parents of this commit

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_commit_parentcount-8" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_commit_parentcount-23" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_parentcount-20", - "ex/v1.7.2/log.html#git_commit_parentcount-21" - ] - } - }, - "git_commit_parent": { - "type": "function", - "file": "git2/commit.h", - "line": 246, - "lineto": 249, - "args": [ - { - "name": "out", - "type": "git_commit **", - "comment": "Pointer where to store the parent commit" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "n", - "type": "unsigned int", - "comment": "the position of the parent (from 0 to `parentcount`)" - } - ], - "argline": "git_commit **out, const git_commit *commit, unsigned int n", - "sig": "git_commit **::const git_commit *::unsigned int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the specified parent of the commit.

\n", - "comments": "", - "group": "commit", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_commit_parent-24" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_parent-22", - "ex/v1.7.2/log.html#git_commit_parent-23" - ] - } - }, - "git_commit_parent_id": { - "type": "function", - "file": "git2/commit.h", - "line": 260, - "lineto": 262, - "args": [ - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "n", - "type": "unsigned int", - "comment": "the position of the parent (from 0 to `parentcount`)" - } - ], - "argline": "const git_commit *commit, unsigned int n", - "sig": "const git_commit *::unsigned int", - "return": { - "type": "const git_oid *", - "comment": " the id of the parent, NULL on error." - }, - "description": "

Get the oid of a specified parent for a commit. This is different from\n git_commit_parent, which will attempt to load the parent commit from\n the ODB.

\n", - "comments": "", - "group": "commit", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_commit_parent_id-9" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_commit_parent_id-24" - ] - } - }, - "git_commit_nth_gen_ancestor": { - "type": "function", - "file": "git2/commit.h", - "line": 278, - "lineto": 281, - "args": [ - { - "name": "ancestor", - "type": "git_commit **", - "comment": "Pointer where to store the ancestor commit" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "a previously loaded commit." - }, - { - "name": "n", - "type": "unsigned int", - "comment": "the requested generation" - } - ], - "argline": "git_commit **ancestor, const git_commit *commit, unsigned int n", - "sig": "git_commit **::const git_commit *::unsigned int", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code" - }, - "description": "

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n", - "comments": "

Passing 0 as the generation number returns another instance of the base commit itself.

\n", - "group": "commit" - }, - "git_commit_header_field": { - "type": "function", - "file": "git2/commit.h", - "line": 293, - "lineto": 293, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer to fill; existing content will be\n overwritten" - }, - { - "name": "commit", - "type": "const git_commit *", - "comment": "the commit to look in" - }, - { - "name": "field", - "type": "const char *", - "comment": "the header field to return" - } - ], - "argline": "git_buf *out, const git_commit *commit, const char *field", - "sig": "git_buf *::const git_commit *::const char *", - "return": { - "type": "int", - "comment": " 0 on succeess, GIT_ENOTFOUND if the field does not exist,\n or an error code" - }, - "description": "

Get an arbitrary header field

\n", - "comments": "", - "group": "commit" - }, - "git_commit_extract_signature": { - "type": "function", - "file": "git2/commit.h", - "line": 313, - "lineto": 313, - "args": [ - { - "name": "signature", - "type": "git_buf *", - "comment": "the signature block; existing content will be\n overwritten" - }, - { - "name": "signed_data", - "type": "git_buf *", - "comment": "signed data; this is the commit contents minus the signature block;\n existing content will be overwritten" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which the commit exists" - }, - { - "name": "commit_id", - "type": "git_oid *", - "comment": "the commit from which to extract the data" - }, - { - "name": "field", - "type": "const char *", - "comment": "the name of the header field containing the signature\n block; pass `NULL` to extract the default 'gpgsig'" - } - ], - "argline": "git_buf *signature, git_buf *signed_data, git_repository *repo, git_oid *commit_id, const char *field", - "sig": "git_buf *::git_buf *::git_repository *::git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." - }, - "description": "

Extract the signature from a commit

\n", - "comments": "

If the id is not for a commit, the error class will be GIT_ERROR_INVALID. If the commit does not have a signature, the error class will be GIT_ERROR_OBJECT.

\n", - "group": "commit" - }, - "git_commit_create": { - "type": "function", - "file": "git2/commit.h", - "line": 359, - "lineto": 369, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "Pointer in which to store the OID of the newly created commit" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the commit" - }, - { - "name": "update_ref", - "type": "const char *", - "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "Signature with author and author time of commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "Signature with committer and * commit time of commit" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this commit" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." - }, - { - "name": "parent_count", - "type": "size_t", - "comment": "Number of parents for this commit" - }, - { - "name": "parents", - "type": "const git_commit *[]", - "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." - } - ], - "argline": "git_oid *id, 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, size_t parent_count, const git_commit *[] parents", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", - "return": { - "type": "int", - "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" - }, - "description": "

Create new commit in the repository from a list of git_object pointers

\n", - "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", - "group": "commit", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_commit_create-7" - ] - } - }, - "git_commit_create_v": { - "type": "function", - "file": "git2/commit.h", - "line": 385, - "lineto": 395, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": null - }, - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "update_ref", - "type": "const char *", - "comment": null - }, - { - "name": "author", - "type": "const git_signature *", - "comment": null - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": null - }, - { - "name": "message", - "type": "const char *", - "comment": null - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": null - }, - { - "name": "parent_count", - "type": "size_t", - "comment": null - } - ], - "argline": "git_oid *id, 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, size_t parent_count", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create new commit in the repository using a variable argument list.

\n", - "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", - "group": "commit", - "examples": { - "commit.c": [ - "ex/v1.7.2/commit.html#git_commit_create_v-1" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_commit_create_v-25" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_commit_create_v-1" - ] - } - }, - "git_commit_amend": { - "type": "function", - "file": "git2/commit.h", - "line": 418, - "lineto": 426, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": null - }, - { - "name": "commit_to_amend", - "type": "const git_commit *", - "comment": null - }, - { - "name": "update_ref", - "type": "const char *", - "comment": null - }, - { - "name": "author", - "type": "const git_signature *", - "comment": null - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": null - }, - { - "name": "message", - "type": "const char *", - "comment": null - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": null - } - ], - "argline": "git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree", - "sig": "git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Amend an existing commit by replacing only non-NULL values.

\n", - "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", - "group": "commit" - }, - "git_commit_create_buffer": { - "type": "function", - "file": "git2/commit.h", - "line": 463, - "lineto": 472, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer into which to write the commit object content" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where the referenced tree and parents live" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "Signature with author and author time of commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "Signature with committer and * commit time of commit" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this commit" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." - }, - { - "name": "parent_count", - "type": "size_t", - "comment": "Number of parents for this commit" - }, - { - "name": "parents", - "type": "const git_commit *[]", - "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." - } - ], - "argline": "git_buf *out, git_repository *repo, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents", - "sig": "git_buf *::git_repository *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a commit and write it into a buffer

\n", - "comments": "

Create a commit as with git_commit_create() but instead of writing it to the objectdb, write the contents of the object into a buffer.

\n", - "group": "commit" - }, - "git_commit_create_with_signature": { - "type": "function", - "file": "git2/commit.h", - "line": 490, - "lineto": 495, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the resulting commit id" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to create the commit in." - }, - { - "name": "commit_content", - "type": "const char *", - "comment": "the content of the unsigned commit object" - }, - { - "name": "signature", - "type": "const char *", - "comment": "the signature to add to the commit. Leave `NULL`\n to create a commit without adding a signature field." - }, - { - "name": "signature_field", - "type": "const char *", - "comment": "which header field should contain this\n signature. Leave `NULL` for the default of \"gpgsig\"" - } - ], - "argline": "git_oid *out, git_repository *repo, const char *commit_content, const char *signature, const char *signature_field", - "sig": "git_oid *::git_repository *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a commit object from the given buffer and signature

\n", - "comments": "

Given the unsigned commit object's contents, its signature and the header field in which to store the signature, attach the signature to the commit and write it into the given repository.

\n", - "group": "commit" - }, - "git_commit_dup": { - "type": "function", - "file": "git2/commit.h", - "line": 505, - "lineto": 505, - "args": [ - { - "name": "out", - "type": "git_commit **", - "comment": "Pointer to store the copy of the commit" - }, - { - "name": "source", - "type": "git_commit *", - "comment": "Original commit to copy" - } - ], - "argline": "git_commit **out, git_commit *source", - "sig": "git_commit **::git_commit *", - "return": { - "type": "int", - "comment": " 0" - }, - "description": "

Create an in-memory copy of a commit. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "commit" - }, - "git_libgit2_version": { - "type": "function", - "file": "git2/common.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "major", - "type": "int *", - "comment": "Store the major version number" - }, - { - "name": "minor", - "type": "int *", - "comment": "Store the minor version number" - }, - { - "name": "rev", - "type": "int *", - "comment": "Store the revision (patch) number" - } - ], - "argline": "int *major, int *minor, int *rev", - "sig": "int *::int *::int *", - "return": { - "type": "int", - "comment": " 0 on success or an error code on failure" - }, - "description": "

Return the version of the libgit2 library\n being currently used.

\n", - "comments": "", - "group": "libgit2" - }, - "git_libgit2_prerelease": { - "type": "function", - "file": "git2/common.h", - "line": 128, - "lineto": 128, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "const char *", - "comment": " the name of the prerelease state or NULL" - }, - "description": "

Return the prerelease state of the libgit2 library currently being\n used. For nightly builds during active development, this will be\n "alpha". Releases may have a "beta" or release candidate ("rc1",\n "rc2", etc) prerelease. For a final release, this function returns\n NULL.

\n", - "comments": "", - "group": "libgit2" - }, - "git_libgit2_features": { - "type": "function", - "file": "git2/common.h", - "line": 180, - "lineto": 180, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": " A combination of GIT_FEATURE_* values." - }, - "description": "

Query compile time options for libgit2.

\n", - "comments": "
    \n
  • GIT_FEATURE_THREADS Libgit2 was compiled with thread support. Note that thread support is still to be seen as a 'work in progress' - basic object lookups are believed to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS Libgit2 supports the https:// protocol. This requires the openssl library to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH Libgit2 supports the SSH protocol for network operations. This requires the libssh2 library to be found when compiling libgit2

  • \n
  • GIT_FEATURE_NSEC Libgit2 supports the sub-second resolution in file modification times.

  • \n
\n", - "group": "libgit2" - }, - "git_libgit2_opts": { - "type": "function", - "file": "git2/common.h", - "line": 512, - "lineto": 512, - "args": [ - { - "name": "option", - "type": "int", - "comment": "Option key" - } - ], - "argline": "int option", - "sig": "int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the User-Agent header.  This value will be       > appended to "git/1.0", for compatibility with other git clients.      >       > - `user_agent` is the value that will be delivered as the     >   User-Agent header on HTTP requests.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n\n

opts(GIT_OPT_GET_HOMEDIR, git_buf *out) > Gets the current user's home directory, as it will be used > for file lookups. The path is written to the out buffer.

\n\n

opts(GIT_OPT_SET_HOMEDIR, const char *path) > Sets the directory used as the current user's home directory, > for file lookups. > > - path directory of home directory.

\n\n

opts(GIT_OPT_GET_SERVER_CONNECT_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) to attempt connections to > a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_CONNECT_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) to attempt connections to > a remote server. This is supported only for HTTP(S) connections > and is not supported by SSH. Set to 0 to use the system default. > Note that this may not be able to be configured longer than the > system default, typically 75 seconds.

\n\n

opts(GIT_OPT_GET_SERVER_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) for reading from and writing > to a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) for reading from and writing > to a remote server. This is supported only for HTTP(S) > connections and is not supported by SSH. Set to 0 to use the > system default.

\n", - "group": "libgit2" - }, - "git_config_entry_free": { - "type": "function", - "file": "git2/config.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "entry", - "type": "git_config_entry *", - "comment": "The entry to free." - } - ], - "argline": "git_config_entry *entry", - "sig": "git_config_entry *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a config entry

\n", - "comments": "", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.7.2/config.html#git_config_entry_free-1", - "ex/v1.7.2/config.html#git_config_entry_free-2" - ] - } - }, - "git_config_find_global": { - "type": "function", - "file": "git2/config.h", - "line": 130, - "lineto": 130, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a global configuration file has been found. Its path will be stored in `out`." - }, - "description": "

Locate the path to the global configuration file

\n", - "comments": "

The user or global configuration file is usually located in $HOME/.gitconfig.

\n\n

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.

\n\n

This method will not guess the path to the xdg compatible config file (.config/git/config).

\n", - "group": "config" - }, - "git_config_find_xdg": { - "type": "function", - "file": "git2/config.h", - "line": 147, - "lineto": 147, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`." - }, - "description": "

Locate the path to the global xdg compatible configuration file

\n", - "comments": "

The xdg compatible configuration file is usually located in $HOME/.config/git/config.

\n\n

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 xdg compatible configuration file.

\n", - "group": "config" - }, - "git_config_find_system": { - "type": "function", - "file": "git2/config.h", - "line": 159, - "lineto": 159, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`." - }, - "description": "

Locate the path to the system configuration file

\n", - "comments": "

If /etc/gitconfig doesn't exist, it will look for %PROGRAMFILES%.

\n", - "group": "config" - }, - "git_config_find_programdata": { - "type": "function", - "file": "git2/config.h", - "line": 170, - "lineto": 170, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Pointer to a user-allocated git_buf in which to store the path" - } - ], - "argline": "git_buf *out", - "sig": "git_buf *", - "return": { - "type": "int", - "comment": " 0 if a ProgramData configuration file has been\n\tfound. Its path will be stored in `out`." - }, - "description": "

Locate the path to the configuration file in ProgramData

\n", - "comments": "

Look for the file in %PROGRAMDATA% used by portable git.

\n", - "group": "config" - }, - "git_config_open_default": { - "type": "function", - "file": "git2/config.h", - "line": 182, - "lineto": 182, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "Pointer to store the config instance" - } - ], - "argline": "git_config **out", - "sig": "git_config **", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open the global, XDG and system configuration files

\n", - "comments": "

Utility wrapper that finds the global, XDG and system configuration files and opens them into a single prioritized config object that can be used when accessing default config data outside a repository.

\n", - "group": "config" - }, - "git_config_new": { - "type": "function", - "file": "git2/config.h", - "line": 193, - "lineto": 193, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "pointer to the new configuration" - } - ], - "argline": "git_config **out", - "sig": "git_config **", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Allocate a new configuration object

\n", - "comments": "

This object is empty, so you have to add a file to it before you can do anything with it.

\n", - "group": "config" - }, - "git_config_add_file_ondisk": { - "type": "function", - "file": "git2/config.h", - "line": 222, - "lineto": 227, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration to add the file to" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to the configuration file to add" - }, - { - "name": "level", - "type": "git_config_level_t", - "comment": "the priority level of the backend" - }, - { - "name": "repo", - "type": "const git_repository *", - "comment": "optional repository to allow parsing of\n conditional includes" - }, - { - "name": "force", - "type": "int", - "comment": "replace config file at the given priority level" - } - ], - "argline": "git_config *cfg, const char *path, git_config_level_t level, const git_repository *repo, int force", - "sig": "git_config *::const char *::git_config_level_t::const git_repository *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code" - }, - "description": "

Add an on-disk config file instance to an existing config

\n", - "comments": "

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).

\n\n

If the file does not exist, the file will still be added and it will be created the first time we write to it.

\n\n

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", - "group": "config" - }, - "git_config_open_ondisk": { - "type": "function", - "file": "git2/config.h", - "line": 241, - "lineto": 241, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "The configuration instance to create" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to the on-disk file to open" - } - ], - "argline": "git_config **out, const char *path", - "sig": "git_config **::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new config instance containing a single on-disk file

\n", - "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", - "group": "config", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_config_open_ondisk-26" - ] - } - }, - "git_config_open_level": { - "type": "function", - "file": "git2/config.h", - "line": 259, - "lineto": 262, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "The configuration instance to create" - }, - { - "name": "parent", - "type": "const git_config *", - "comment": "Multi-level config to search for the given level" - }, - { - "name": "level", - "type": "git_config_level_t", - "comment": "Configuration level to search for" - } - ], - "argline": "git_config **out, const git_config *parent, git_config_level_t level", - "sig": "git_config **::const git_config *::git_config_level_t", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code" - }, - "description": "

Build a single-level focused config object from a multi-level one.

\n", - "comments": "

The returned config object can be used to perform get/set/delete operations on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config will return different config instances, but containing the same config_file instance.

\n", - "group": "config" - }, - "git_config_open_global": { - "type": "function", - "file": "git2/config.h", - "line": 277, - "lineto": 277, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "pointer in which to store the config object" - }, - { - "name": "config", - "type": "git_config *", - "comment": "the config object in which to look" - } - ], - "argline": "git_config **out, git_config *config", - "sig": "git_config **::git_config *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Open the global/XDG configuration file according to git's rules

\n", - "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatibility, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", - "group": "config" - }, - "git_config_snapshot": { - "type": "function", - "file": "git2/config.h", - "line": 293, - "lineto": 293, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "pointer in which to store the snapshot config object" - }, - { - "name": "config", - "type": "git_config *", - "comment": "configuration to snapshot" - } - ], - "argline": "git_config **out, git_config *config", - "sig": "git_config **::git_config *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a snapshot of the configuration

\n", - "comments": "

Create a snapshot of the current state of a configuration, which allows you to look into a consistent view of the configuration for looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid until it is freed.

\n", - "group": "config" - }, - "git_config_free": { - "type": "function", - "file": "git2/config.h", - "line": 300, - "lineto": 300, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration to free" - } - ], - "argline": "git_config *cfg", - "sig": "git_config *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the configuration and its associated memory and files

\n", - "comments": "", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.7.2/config.html#git_config_free-3" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_config_free-27", - "ex/v1.7.2/general.html#git_config_free-28" - ] - } - }, - "git_config_get_entry": { - "type": "function", - "file": "git2/config.h", - "line": 312, - "lineto": 315, - "args": [ - { - "name": "out", - "type": "git_config_entry **", - "comment": "pointer to the variable git_config_entry" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "git_config_entry **out, const git_config *cfg, const char *name", - "sig": "git_config_entry **::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the git_config_entry of a config variable.

\n", - "comments": "

Free the git_config_entry after use with git_config_entry_free().

\n", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.7.2/config.html#git_config_get_entry-4" - ] - } - }, - "git_config_get_int32": { - "type": "function", - "file": "git2/config.h", - "line": 329, - "lineto": 329, - "args": [ - { - "name": "out", - "type": "int32_t *", - "comment": "pointer to the variable where the value should be stored" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "int32_t *out, const git_config *cfg, const char *name", - "sig": "int32_t *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of an integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_config_get_int32-29", - "ex/v1.7.2/general.html#git_config_get_int32-30" - ] - } - }, - "git_config_get_int64": { - "type": "function", - "file": "git2/config.h", - "line": 343, - "lineto": 343, - "args": [ - { - "name": "out", - "type": "int64_t *", - "comment": "pointer to the variable where the value should be stored" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "int64_t *out, const git_config *cfg, const char *name", - "sig": "int64_t *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a long integer config variable.

\n", - "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_bool": { - "type": "function", - "file": "git2/config.h", - "line": 360, - "lineto": 360, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "pointer to the variable where the value should be stored" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "int *out, const git_config *cfg, const char *name", - "sig": "int *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a boolean config variable.

\n", - "comments": "

This function uses the usual C convention of 0 being false and anything else true.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_path": { - "type": "function", - "file": "git2/config.h", - "line": 378, - "lineto": 378, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer in which to store the result" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "git_buf *out, const git_config *cfg, const char *name", - "sig": "git_buf *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a path config variable.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_string": { - "type": "function", - "file": "git2/config.h", - "line": 396, - "lineto": 396, - "args": [ - { - "name": "out", - "type": "const char **", - "comment": "pointer to the string" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "const char **out, const git_config *cfg, const char *name", - "sig": "const char **::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a string config variable.

\n", - "comments": "

This function can only be used on snapshot config objects. The string is owned by the config and should not be freed by the user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_config_get_string-31", - "ex/v1.7.2/general.html#git_config_get_string-32" - ] - } - }, - "git_config_get_string_buf": { - "type": "function", - "file": "git2/config.h", - "line": 412, - "lineto": 412, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer in which to store the string" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - } - ], - "argline": "git_buf *out, const git_config *cfg, const char *name", - "sig": "git_buf *::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the value of a string config variable.

\n", - "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", - "group": "config" - }, - "git_config_get_multivar_foreach": { - "type": "function", - "file": "git2/config.h", - "line": 431, - "lineto": 431, - "args": [ - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to be called on each value of the variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "opaque pointer to pass to the callback" - } - ], - "argline": "const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload", - "sig": "const git_config *::const char *::const char *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Get each value of a multivar in a foreach callback

\n", - "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_multivar_iterator_new": { - "type": "function", - "file": "git2/config.h", - "line": 447, - "lineto": 447, - "args": [ - { - "name": "out", - "type": "git_config_iterator **", - "comment": "pointer to store the iterator" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" - } - ], - "argline": "git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp", - "sig": "git_config_iterator **::const git_config *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Get each value of a multivar

\n", - "comments": "

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_next": { - "type": "function", - "file": "git2/config.h", - "line": 459, - "lineto": 459, - "args": [ - { - "name": "entry", - "type": "git_config_entry **", - "comment": "pointer to store the entry" - }, - { - "name": "iter", - "type": "git_config_iterator *", - "comment": "the iterator" - } - ], - "argline": "git_config_entry **entry, git_config_iterator *iter", - "sig": "git_config_entry **::git_config_iterator *", - "return": { - "type": "int", - "comment": " 0 or an error code. GIT_ITEROVER if the iteration has completed" - }, - "description": "

Return the current entry and advance the iterator

\n", - "comments": "

The pointers returned by this function are valid until the next call to git_config_next or until the iterator is freed.

\n", - "group": "config" - }, - "git_config_iterator_free": { - "type": "function", - "file": "git2/config.h", - "line": 466, - "lineto": 466, - "args": [ - { - "name": "iter", - "type": "git_config_iterator *", - "comment": "the iterator to free" - } - ], - "argline": "git_config_iterator *iter", - "sig": "git_config_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a config iterator

\n", - "comments": "", - "group": "config" - }, - "git_config_set_int32": { - "type": "function", - "file": "git2/config.h", - "line": 477, - "lineto": 477, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "int32_t", - "comment": "Integer value for the variable" - } - ], - "argline": "git_config *cfg, const char *name, int32_t value", - "sig": "git_config *::const char *::int32_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_set_int64": { - "type": "function", - "file": "git2/config.h", - "line": 488, - "lineto": 488, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "int64_t", - "comment": "Long integer value for the variable" - } - ], - "argline": "git_config *cfg, const char *name, int64_t value", - "sig": "git_config *::const char *::int64_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_set_bool": { - "type": "function", - "file": "git2/config.h", - "line": 499, - "lineto": 499, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "int", - "comment": "the value to store" - } - ], - "argline": "git_config *cfg, const char *name, int value", - "sig": "git_config *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of a boolean config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_set_string": { - "type": "function", - "file": "git2/config.h", - "line": 513, - "lineto": 513, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "value", - "type": "const char *", - "comment": "the string to store." - } - ], - "argline": "git_config *cfg, const char *name, const char *value", - "sig": "git_config *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", - "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", - "group": "config", - "examples": { - "config.c": [ - "ex/v1.7.2/config.html#git_config_set_string-5" - ] - } - }, - "git_config_set_multivar": { - "type": "function", - "file": "git2/config.h", - "line": 526, - "lineto": 526, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variable" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "a regular expression to indicate which values to replace" - }, - { - "name": "value", - "type": "const char *", - "comment": "the new value." - } - ], - "argline": "git_config *cfg, const char *name, const char *regexp, const char *value", - "sig": "git_config *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Set a multivar in the local config file.

\n", - "comments": "

The regular expression is applied case-sensitively on the value.

\n", - "group": "config" - }, - "git_config_delete_entry": { - "type": "function", - "file": "git2/config.h", - "line": 536, - "lineto": 536, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable to delete" - } - ], - "argline": "git_config *cfg, const char *name", - "sig": "git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Delete a config variable from the config file\n with the highest level (usually the local one).

\n", - "comments": "", - "group": "config" - }, - "git_config_delete_multivar": { - "type": "function", - "file": "git2/config.h", - "line": 549, - "lineto": 549, - "args": [ - { - "name": "cfg", - "type": "git_config *", - "comment": "where to look for the variables" - }, - { - "name": "name", - "type": "const char *", - "comment": "the variable's name" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "a regular expression to indicate which values to delete" - } - ], - "argline": "git_config *cfg, const char *name, const char *regexp", - "sig": "git_config *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Deletes one or several entries from a multivar in the local config file.

\n", - "comments": "

The regular expression is applied case-sensitively on the value.

\n", - "group": "config" - }, - "git_config_foreach": { - "type": "function", - "file": "git2/config.h", - "line": 567, - "lineto": 570, - "args": [ - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to get the variables from" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to call on each variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "the data to pass to the callback" - } - ], - "argline": "const git_config *cfg, git_config_foreach_cb callback, void *payload", - "sig": "const git_config *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Perform an operation on each config variable.

\n", - "comments": "

The callback receives the normalized name and value of each variable in the config backend, and the data pointer passed to this function. If the callback returns a non-zero value, the function stops iterating and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the iteration is ongoing.

\n", - "group": "config" - }, - "git_config_iterator_new": { - "type": "function", - "file": "git2/config.h", - "line": 582, - "lineto": 582, - "args": [ - { - "name": "out", - "type": "git_config_iterator **", - "comment": "pointer to store the iterator" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to get the variables from" - } - ], - "argline": "git_config_iterator **out, const git_config *cfg", - "sig": "git_config_iterator **::const git_config *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Iterate over all the config variables

\n", - "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n", - "group": "config" - }, - "git_config_iterator_glob_new": { - "type": "function", - "file": "git2/config.h", - "line": 599, - "lineto": 599, - "args": [ - { - "name": "out", - "type": "git_config_iterator **", - "comment": "pointer to store the iterator" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to ge the variables from" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to match the names" - } - ], - "argline": "git_config_iterator **out, const git_config *cfg, const char *regexp", - "sig": "git_config_iterator **::const git_config *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Iterate over all the config variables whose name matches a pattern

\n", - "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_foreach_match": { - "type": "function", - "file": "git2/config.h", - "line": 621, - "lineto": 625, - "args": [ - { - "name": "cfg", - "type": "const git_config *", - "comment": "where to get the variables from" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to match against config names" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to call on each variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "the data to pass to the callback" - } - ], - "argline": "const git_config *cfg, const char *regexp, git_config_foreach_cb callback, void *payload", - "sig": "const git_config *::const char *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 or the return value of the callback which didn't return 0" - }, - "description": "

Perform an operation on each config variable matching a regular expression.

\n", - "comments": "

This behaves like git_config_foreach with an additional filter of a regular expression that filters which config keys are passed to the callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the case-insensitive parts are lower-case.

\n", - "group": "config" - }, - "git_config_get_mapped": { - "type": "function", - "file": "git2/config.h", - "line": 661, - "lineto": 666, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "place to store the result of the mapping" - }, - { - "name": "cfg", - "type": "const git_config *", - "comment": "config file to get the variables from" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the config variable to lookup" - }, - { - "name": "maps", - "type": "const git_configmap *", - "comment": "array of `git_configmap` objects specifying the possible mappings" - }, - { - "name": "map_n", - "type": "size_t", - "comment": "number of mapping objects in `maps`" - } - ], - "argline": "int *out, const git_config *cfg, const char *name, const git_configmap *maps, size_t map_n", - "sig": "int *::const git_config *::const char *::const git_configmap *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", - "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_configmap autocrlf_mapping[] = {        {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", - "group": "config" - }, - "git_config_lookup_map_value": { - "type": "function", - "file": "git2/config.h", - "line": 677, - "lineto": 681, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "place to store the result of the parsing" - }, - { - "name": "maps", - "type": "const git_configmap *", - "comment": "array of `git_configmap` objects specifying the possible mappings" - }, - { - "name": "map_n", - "type": "size_t", - "comment": "number of mapping objects in `maps`" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int *out, const git_configmap *maps, size_t map_n, const char *value", - "sig": "int *::const git_configmap *::size_t::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Maps a string value to an integer constant

\n", - "comments": "", - "group": "config" - }, - "git_config_parse_bool": { - "type": "function", - "file": "git2/config.h", - "line": 694, - "lineto": 694, - "args": [ - { - "name": "out", - "type": "int *", - "comment": "place to store the result of the parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int *out, const char *value", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Parse a string value as a bool.

\n", - "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any number different from 0 Valid values for false are: 'false', 'no', 'off', 0

\n", - "group": "config" - }, - "git_config_parse_int32": { - "type": "function", - "file": "git2/config.h", - "line": 707, - "lineto": 707, - "args": [ - { - "name": "out", - "type": "int32_t *", - "comment": "place to store the result of the parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int32_t *out, const char *value", - "sig": "int32_t *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Parse a string value as an int32.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", - "group": "config" - }, - "git_config_parse_int64": { - "type": "function", - "file": "git2/config.h", - "line": 720, - "lineto": 720, - "args": [ - { - "name": "out", - "type": "int64_t *", - "comment": "place to store the result of the parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "value to parse" - } - ], - "argline": "int64_t *out, const char *value", - "sig": "int64_t *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Parse a string value as an int64.

\n", - "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", - "group": "config" - }, - "git_config_parse_path": { - "type": "function", - "file": "git2/config.h", - "line": 736, - "lineto": 736, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "placae to store the result of parsing" - }, - { - "name": "value", - "type": "const char *", - "comment": "the path to evaluate" - } - ], - "argline": "git_buf *out, const char *value", - "sig": "git_buf *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Parse a string value as a path.

\n", - "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be returned.

\n", - "group": "config" - }, - "git_config_backend_foreach_match": { - "type": "function", - "file": "git2/config.h", - "line": 755, - "lineto": 759, - "args": [ - { - "name": "backend", - "type": "git_config_backend *", - "comment": "where to get the variables from" - }, - { - "name": "regexp", - "type": "const char *", - "comment": "regular expression to match against config names (can be NULL)" - }, - { - "name": "callback", - "type": "git_config_foreach_cb", - "comment": "the function to call on each variable" - }, - { - "name": "payload", - "type": "void *", - "comment": "the data to pass to the callback" - } - ], - "argline": "git_config_backend *backend, const char *regexp, git_config_foreach_cb callback, void *payload", - "sig": "git_config_backend *::const char *::git_config_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Perform an operation on each config variable in a given config backend,\n matching a regular expression.

\n", - "comments": "

This behaves like git_config_foreach_match except that only config entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", - "group": "config" - }, - "git_config_lock": { - "type": "function", - "file": "git2/config.h", - "line": 778, - "lineto": 778, - "args": [ - { - "name": "tx", - "type": "git_transaction **", - "comment": "the resulting transaction, use this to commit or undo the\n changes" - }, - { - "name": "cfg", - "type": "git_config *", - "comment": "the configuration in which to lock" - } - ], - "argline": "git_transaction **tx, git_config *cfg", - "sig": "git_transaction **::git_config *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lock the backend with the highest priority

\n", - "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", - "group": "config" - }, - "git_credential_free": { - "type": "function", - "file": "git2/credential.h", - "line": 146, - "lineto": 146, - "args": [ - { - "name": "cred", - "type": "git_credential *", - "comment": "the object to free" - } - ], - "argline": "git_credential *cred", - "sig": "git_credential *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a credential.

\n", - "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", - "group": "credential" - }, - "git_credential_has_username": { - "type": "function", - "file": "git2/credential.h", - "line": 154, - "lineto": 154, - "args": [ - { - "name": "cred", - "type": "git_credential *", - "comment": "object to check" - } - ], - "argline": "git_credential *cred", - "sig": "git_credential *", - "return": { - "type": "int", - "comment": " 1 if the credential object has non-NULL username, 0 otherwise" - }, - "description": "

Check whether a credential object contains username information.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_get_username": { - "type": "function", - "file": "git2/credential.h", - "line": 162, - "lineto": 162, - "args": [ - { - "name": "cred", - "type": "git_credential *", - "comment": "object to check" - } - ], - "argline": "git_credential *cred", - "sig": "git_credential *", - "return": { - "type": "const char *", - "comment": " the credential username, or NULL if not applicable" - }, - "description": "

Return the username associated with a credential object.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_userpass_plaintext_new": { - "type": "function", - "file": "git2/credential.h", - "line": 173, - "lineto": 176, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "The username of the credential." - }, - { - "name": "password", - "type": "const char *", - "comment": "The password of the credential." - } - ], - "argline": "git_credential **out, const char *username, const char *password", - "sig": "git_credential **::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_default_new": { - "type": "function", - "file": "git2/credential.h", - "line": 185, - "lineto": 185, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - } - ], - "argline": "git_credential **out", - "sig": "git_credential **", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_username_new": { - "type": "function", - "file": "git2/credential.h", - "line": 197, - "lineto": 197, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "The username to authenticate with" - } - ], - "argline": "git_credential **out, const char *username", - "sig": "git_credential **::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a credential to specify a username.

\n", - "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", - "group": "credential" - }, - "git_credential_ssh_key_new": { - "type": "function", - "file": "git2/credential.h", - "line": 210, - "lineto": 215, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The path to the public key of the credential." - }, - { - "name": "privatekey", - "type": "const char *", - "comment": "The path to the private key of the credential." - }, - { - "name": "passphrase", - "type": "const char *", - "comment": "The passphrase of the credential." - } - ], - "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_credential **::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_key_memory_new": { - "type": "function", - "file": "git2/credential.h", - "line": 227, - "lineto": 232, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate." - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The public key of the credential." - }, - { - "name": "privatekey", - "type": "const char *", - "comment": "The private key of the credential." - }, - { - "name": "passphrase", - "type": "const char *", - "comment": "The passphrase of the credential." - } - ], - "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", - "sig": "git_credential **::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new ssh key credential object reading the keys from memory.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_interactive_new": { - "type": "function", - "file": "git2/credential.h", - "line": 263, - "lineto": 267, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "Username to use to authenticate." - }, - { - "name": "prompt_callback", - "type": "git_credential_ssh_interactive_cb", - "comment": "The callback method used for prompts." - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback." - } - ], - "argline": "git_credential **out, const char *username, git_credential_ssh_interactive_cb prompt_callback, void *payload", - "sig": "git_credential **::const char *::git_credential_ssh_interactive_cb::void *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure." - }, - "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_key_from_agent": { - "type": "function", - "file": "git2/credential.h", - "line": 277, - "lineto": 279, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - } - ], - "argline": "git_credential **out, const char *username", - "sig": "git_credential **::const char *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", - "comments": "", - "group": "credential" - }, - "git_credential_ssh_custom_new": { - "type": "function", - "file": "git2/credential.h", - "line": 305, - "lineto": 311, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "username", - "type": "const char *", - "comment": "username to use to authenticate" - }, - { - "name": "publickey", - "type": "const char *", - "comment": "The bytes of the public key." - }, - { - "name": "publickey_len", - "type": "size_t", - "comment": "The length of the public key in bytes." - }, - { - "name": "sign_callback", - "type": "git_credential_sign_cb", - "comment": "The callback method to sign the data during the challenge." - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback." - } - ], - "argline": "git_credential **out, const char *username, const char *publickey, size_t publickey_len, git_credential_sign_cb sign_callback, void *payload", - "sig": "git_credential **::const char *::const char *::size_t::git_credential_sign_cb::void *", - "return": { - "type": "int", - "comment": " 0 for success or an error code for failure" - }, - "description": "

Create an ssh key credential with a custom signing function.

\n", - "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", - "group": "credential" - }, - "git_credential_userpass": { - "type": "function", - "file": "git2/credential_helpers.h", - "line": 44, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "url", - "type": "const char *", - "comment": "The resource for which we are demanding a credential." - }, - { - "name": "user_from_url", - "type": "const char *", - "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." - }, - { - "name": "allowed_types", - "type": "unsigned int", - "comment": "A bitmask stating which credential types are OK to return." - }, - { - "name": "payload", - "type": "void *", - "comment": "The payload provided when specifying this callback. (This is\n interpreted as a `git_credential_userpass_payload*`.)" - } - ], - "argline": "git_credential **out, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload", - "sig": "git_credential **::const char *::const char *::unsigned int::void *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Stock callback usable as a git_credential_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDENTIAL_USERPASS_PLAINTEXT as an allowed type.

\n", - "comments": "", - "group": "credential" - }, - "git_blob_filtered_content": { - "type": "function", - "file": "git2/deprecated.h", - "line": 115, - "lineto": 119, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "blob", - "type": "git_blob *", - "comment": null - }, - { - "name": "as_path", - "type": "const char *", - "comment": null - }, - { - "name": "check_for_binary_data", - "type": "int", - "comment": null - } - ], - "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", - "sig": "git_buf *::git_blob *::const char *::int", - "return": { - "type": "int", - "comment": null - }, - "description": "

Deprecated in favor of git_blob_filter.

\n", - "comments": "", - "group": "blob" - }, - "git_filter_list_stream_data": { - "type": "function", - "file": "git2/deprecated.h", - "line": 139, - "lineto": 142, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": null - }, - { - "name": "data", - "type": "git_buf *", - "comment": null - }, - { - "name": "target", - "type": "git_writestream *", - "comment": null - } - ], - "argline": "git_filter_list *filters, git_buf *data, git_writestream *target", - "sig": "git_filter_list *::git_buf *::git_writestream *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Deprecated in favor of git_filter_list_stream_buffer.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_apply_to_data": { - "type": "function", - "file": "git2/deprecated.h", - "line": 149, - "lineto": 152, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": null - }, - { - "name": "in", - "type": "git_buf *", - "comment": null - } - ], - "argline": "git_buf *out, git_filter_list *filters, git_buf *in", - "sig": "git_buf *::git_filter_list *::git_buf *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Deprecated in favor of git_filter_list_apply_to_buffer.

\n", - "comments": "", - "group": "filter" - }, - "git_treebuilder_write_with_buffer": { - "type": "function", - "file": "git2/deprecated.h", - "line": 178, - "lineto": 179, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": null - }, - { - "name": "bld", - "type": "git_treebuilder *", - "comment": null - }, - { - "name": "tree", - "type": "git_buf *", - "comment": null - } - ], - "argline": "git_oid *oid, git_treebuilder *bld, git_buf *tree", - "sig": "git_oid *::git_treebuilder *::git_buf *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Write the contents of the tree builder as a tree object.\n This is an alias of git_treebuilder_write and is preserved\n for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "treebuilder" - }, - "git_buf_grow": { - "type": "function", - "file": "git2/deprecated.h", - "line": 220, - "lineto": 220, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": "The buffer to be resized; may or may not be allocated yet" - }, - { - "name": "target_size", - "type": "size_t", - "comment": "The desired available size" - } - ], - "argline": "git_buf *buffer, size_t target_size", - "sig": "git_buf *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, -1 on allocation failure" - }, - "description": "

Resize the buffer allocation to make more space.

\n", - "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e. the asize field is zero), then ptr will be replaced with a newly allocated block of data. Be careful so that memory allocated by the caller is not lost. As a special variant, if you pass target_size as 0 and the memory is not allocated by libgit2, this will allocate a new buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be marked as invalid for future operations, invaliding the contents.

\n", - "group": "buf" - }, - "git_buf_set": { - "type": "function", - "file": "git2/deprecated.h", - "line": 230, - "lineto": 231, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": "The buffer to set" - }, - { - "name": "data", - "type": "const void *", - "comment": "The data to copy into the buffer" - }, - { - "name": "datalen", - "type": "size_t", - "comment": "The length of the data to copy into the buffer" - } - ], - "argline": "git_buf *buffer, const void *data, size_t datalen", - "sig": "git_buf *::const void *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, -1 on allocation failure" - }, - "description": "

Set buffer to a copy of some raw data.

\n", - "comments": "", - "group": "buf" - }, - "git_buf_is_binary": { - "type": "function", - "file": "git2/deprecated.h", - "line": 239, - "lineto": 239, - "args": [ - { - "name": "buf", - "type": "const git_buf *", - "comment": "Buffer to check" - } - ], - "argline": "const git_buf *buf", - "sig": "const git_buf *", - "return": { - "type": "int", - "comment": " 1 if buffer looks like non-text data" - }, - "description": "

Check quickly if buffer looks like it contains binary data

\n", - "comments": "", - "group": "buf" - }, - "git_buf_contains_nul": { - "type": "function", - "file": "git2/deprecated.h", - "line": 247, - "lineto": 247, - "args": [ - { - "name": "buf", - "type": "const git_buf *", - "comment": "Buffer to check" - } - ], - "argline": "const git_buf *buf", - "sig": "const git_buf *", - "return": { - "type": "int", - "comment": " 1 if buffer contains a NUL byte" - }, - "description": "

Check quickly if buffer contains a NUL byte

\n", - "comments": "", - "group": "buf" - }, - "git_buf_free": { - "type": "function", - "file": "git2/deprecated.h", - "line": 259, - "lineto": 259, - "args": [ - { - "name": "buffer", - "type": "git_buf *", - "comment": null - } - ], - "argline": "git_buf *buffer", - "sig": "git_buf *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_buf. This is an alias of\n git_buf_dispose and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "buf" - }, - "git_diff_format_email": { - "type": "function", - "file": "git2/deprecated.h", - "line": 357, - "lineto": 360, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "diff", - "type": "git_diff *", - "comment": null - }, - { - "name": "opts", - "type": "const git_diff_format_email_options *", - "comment": null - } - ], - "argline": "git_buf *out, git_diff *diff, const git_diff_format_email_options *opts", - "sig": "git_buf *::git_diff *::const git_diff_format_email_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an e-mail ready patch from a diff.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_commit_as_email": { - "type": "function", - "file": "git2/deprecated.h", - "line": 368, - "lineto": 375, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": null - }, - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "commit", - "type": "git_commit *", - "comment": null - }, - { - "name": "patch_no", - "type": "size_t", - "comment": null - }, - { - "name": "total_patches", - "type": "size_t", - "comment": null - }, - { - "name": "flags", - "type": "uint32_t", - "comment": null - }, - { - "name": "diff_opts", - "type": "const git_diff_options *", - "comment": null - } - ], - "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", - "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Create an e-mail ready patch for a commit.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_format_email_options_init": { - "type": "function", - "file": "git2/deprecated.h", - "line": 387, - "lineto": 389, - "args": [ - { - "name": "opts", - "type": "git_diff_format_email_options *", - "comment": "The `git_blame_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_format_email_options *opts, unsigned int version", - "sig": "git_diff_format_email_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_format_email_options structure

\n", - "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", - "group": "diff" - }, - "giterr_last": { - "type": "function", - "file": "git2/deprecated.h", - "line": 452, - "lineto": 452, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "const git_error *", - "comment": null - }, - "description": "

Return the last git_error object that was generated for the\n current thread. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "giterr_clear": { - "type": "function", - "file": "git2/deprecated.h", - "line": 464, - "lineto": 464, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Clear the last error. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "giterr_set_str": { - "type": "function", - "file": "git2/deprecated.h", - "line": 476, - "lineto": 476, - "args": [ - { - "name": "error_class", - "type": "int", - "comment": null - }, - { - "name": "string", - "type": "const char *", - "comment": null - } - ], - "argline": "int error_class, const char *string", - "sig": "int::const char *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Sets the error message to the given string. This is an alias of\n git_error_set_str and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "giterr_set_oom": { - "type": "function", - "file": "git2/deprecated.h", - "line": 488, - "lineto": 488, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Indicates that an out-of-memory situation occurred. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "giterr" - }, - "git_object__size": { - "type": "function", - "file": "git2/deprecated.h", - "line": 578, - "lineto": 578, - "args": [ - { - "name": "type", - "type": "git_object_t", - "comment": "object type to get its size" - } - ], - "argline": "git_object_t type", - "sig": "git_object_t", - "return": { - "type": "size_t", - "comment": " size in bytes of the object" - }, - "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", - "comments": "

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.

\n", - "group": "object" - }, - "git_remote_is_valid_name": { - "type": "function", - "file": "git2/deprecated.h", - "line": 599, - "lineto": 599, - "args": [ - { - "name": "remote_name", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "const char *remote_name", - "sig": "const char *", - "return": { - "type": "int", - "comment": " 1 if the reference name is acceptable; 0 if it isn't" - }, - "description": "

Ensure the remote name is well-formed.

\n", - "comments": "", - "group": "remote" - }, - "git_reference_is_valid_name": { - "type": "function", - "file": "git2/deprecated.h", - "line": 643, - "lineto": 643, - "args": [ - { - "name": "refname", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "const char *refname", - "sig": "const char *", - "return": { - "type": "int", - "comment": " 1 if the reference name is acceptable; 0 if it isn't" - }, - "description": "

Ensure the reference name is well-formed.

\n", - "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", - "group": "reference" - }, - "git_oidarray_free": { - "type": "function", - "file": "git2/deprecated.h", - "line": 810, - "lineto": 810, - "args": [ - { - "name": "array", - "type": "git_oidarray *", - "comment": null - } - ], - "argline": "git_oidarray *array", - "sig": "git_oidarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_oidarray. This is an alias of\n git_oidarray_dispose and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "oidarray" - }, - "git_strarray_copy": { - "type": "function", - "file": "git2/deprecated.h", - "line": 879, - "lineto": 879, - "args": [ - { - "name": "tgt", - "type": "git_strarray *", - "comment": "target" - }, - { - "name": "src", - "type": "const git_strarray *", - "comment": "source" - } - ], - "argline": "git_strarray *tgt, const git_strarray *src", - "sig": "git_strarray *::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n 0 on allocation failure" - }, - "description": "

Copy a string array object from source to target.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "strarray" - }, - "git_strarray_free": { - "type": "function", - "file": "git2/deprecated.h", - "line": 891, - "lineto": 891, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": null - } - ], - "argline": "git_strarray *array", - "sig": "git_strarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory referred to by the git_strarray. This is an alias of\n git_strarray_dispose and is preserved for backward compatibility.

\n", - "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", - "group": "strarray" - }, - "git_blame_init_options": { - "type": "function", - "file": "git2/deprecated.h", - "line": 905, - "lineto": 905, - "args": [ - { - "name": "opts", - "type": "git_blame_options *", - "comment": null - }, - { - "name": "version", - "type": "unsigned int", - "comment": null - } - ], - "argline": "git_blame_options *opts, unsigned int version", - "sig": "git_blame_options *::unsigned int", - "return": { - "type": "int", - "comment": null - }, - "description": "", - "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility functions at this time.

\n\n

@{

\n", - "group": "blame" - }, - "git_describe_options_init": { - "type": "function", - "file": "git2/describe.h", - "line": 82, - "lineto": 82, - "args": [ - { - "name": "opts", - "type": "git_describe_options *", - "comment": "The `git_describe_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DESCRIBE_OPTIONS_VERSION`." - } - ], - "argline": "git_describe_options *opts, unsigned int version", - "sig": "git_describe_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_describe_options structure

\n", - "comments": "

Initializes a git_describe_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.7.2/describe.html#git_describe_options_init-1" - ] - } - }, - "git_describe_format_options_init": { - "type": "function", - "file": "git2/describe.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "opts", - "type": "git_describe_format_options *", - "comment": "The `git_describe_format_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DESCRIBE_FORMAT_OPTIONS_VERSION`." - } - ], - "argline": "git_describe_format_options *opts, unsigned int version", - "sig": "git_describe_format_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_describe_format_options structure

\n", - "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.7.2/describe.html#git_describe_format_options_init-2" - ] - } - }, - "git_describe_commit": { - "type": "function", - "file": "git2/describe.h", - "line": 147, - "lineto": 150, - "args": [ - { - "name": "result", - "type": "git_describe_result **", - "comment": "pointer to store the result. You must free this once\n you're done with it." - }, - { - "name": "committish", - "type": "git_object *", - "comment": "a committish to describe" - }, - { - "name": "opts", - "type": "git_describe_options *", - "comment": "the lookup options (or NULL for defaults)" - } - ], - "argline": "git_describe_result **result, git_object *committish, git_describe_options *opts", - "sig": "git_describe_result **::git_object *::git_describe_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Describe a commit

\n", - "comments": "

Perform the describe operation on the given committish object.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.7.2/describe.html#git_describe_commit-3" - ] - } - }, - "git_describe_workdir": { - "type": "function", - "file": "git2/describe.h", - "line": 165, - "lineto": 168, - "args": [ - { - "name": "out", - "type": "git_describe_result **", - "comment": "pointer to store the result. You must free this once\n you're done with it." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the describe" - }, - { - "name": "opts", - "type": "git_describe_options *", - "comment": "the lookup options (or NULL for defaults)" - } - ], - "argline": "git_describe_result **out, git_repository *repo, git_describe_options *opts", - "sig": "git_describe_result **::git_repository *::git_describe_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Describe a commit

\n", - "comments": "

Perform the describe operation on the current commit and the worktree. After performing describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.7.2/describe.html#git_describe_workdir-4" - ] - } - }, - "git_describe_format": { - "type": "function", - "file": "git2/describe.h", - "line": 179, - "lineto": 182, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The buffer to store the result" - }, - { - "name": "result", - "type": "const git_describe_result *", - "comment": "the result from `git_describe_commit()` or\n `git_describe_workdir()`." - }, - { - "name": "opts", - "type": "const git_describe_format_options *", - "comment": "the formatting options (or NULL for defaults)" - } - ], - "argline": "git_buf *out, const git_describe_result *result, const git_describe_format_options *opts", - "sig": "git_buf *::const git_describe_result *::const git_describe_format_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Print the describe result to a buffer

\n", - "comments": "", - "group": "describe", - "examples": { - "describe.c": [ - "ex/v1.7.2/describe.html#git_describe_format-5" - ] - } - }, - "git_describe_result_free": { - "type": "function", - "file": "git2/describe.h", - "line": 189, - "lineto": 189, - "args": [ - { - "name": "result", - "type": "git_describe_result *", - "comment": "The result to free." - } - ], - "argline": "git_describe_result *result", - "sig": "git_describe_result *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the describe result.

\n", - "comments": "", - "group": "describe" - }, - "git_diff_options_init": { - "type": "function", - "file": "git2/diff.h", - "line": 485, - "lineto": 487, - "args": [ - { - "name": "opts", - "type": "git_diff_options *", - "comment": "The `git_diff_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_options *opts, unsigned int version", - "sig": "git_diff_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_options structure

\n", - "comments": "

Initializes a git_diff_options with default values. Equivalent to creating an instance with GIT_DIFF_OPTIONS_INIT.

\n", - "group": "diff" - }, - "git_diff_find_options_init": { - "type": "function", - "file": "git2/diff.h", - "line": 818, - "lineto": 820, - "args": [ - { - "name": "opts", - "type": "git_diff_find_options *", - "comment": "The `git_diff_find_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_FIND_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_find_options *opts, unsigned int version", - "sig": "git_diff_find_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_find_options structure

\n", - "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", - "group": "diff" - }, - "git_diff_free": { - "type": "function", - "file": "git2/diff.h", - "line": 834, - "lineto": 834, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "The previously created diff; cannot be used after free." - } - ], - "argline": "git_diff *diff", - "sig": "git_diff *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Deallocate a diff.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_free-3" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_diff_free-25", - "ex/v1.7.2/log.html#git_diff_free-26" - ] - } - }, - "git_diff_tree_to_tree": { - "type": "function", - "file": "git2/diff.h", - "line": 853, - "lineto": 858, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the trees." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "new_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff to, or NULL for empty tree." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_tree *new_tree, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::git_tree *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create a diff with the difference between two tree objects.

\n", - "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_tree_to_tree-4" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_diff_tree_to_tree-27", - "ex/v1.7.2/log.html#git_diff_tree_to_tree-28" - ] - } - }, - "git_diff_tree_to_index": { - "type": "function", - "file": "git2/diff.h", - "line": 880, - "lineto": 885, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the tree and index." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to diff with; repo index used if NULL." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_index *index, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::git_index *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create a diff between a tree and repository index.

\n", - "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_tree_to_index-5" - ] - } - }, - "git_diff_index_to_workdir": { - "type": "function", - "file": "git2/diff.h", - "line": 908, - "lineto": 912, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository." - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to diff from; repo index used if NULL." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_index *index, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_index *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create a diff between the repository index and the workdir directory.

\n", - "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_index_to_workdir-6" - ] - } - }, - "git_diff_tree_to_workdir": { - "type": "function", - "file": "git2/diff.h", - "line": 938, - "lineto": 942, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "A pointer to a git_diff pointer that will be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the tree." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create a diff between a tree and the working directory.

\n", - "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_tree_to_workdir-7" - ] - } - }, - "git_diff_tree_to_workdir_with_index": { - "type": "function", - "file": "git2/diff.h", - "line": 958, - "lineto": 962, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "A pointer to a git_diff pointer that will be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the tree." - }, - { - "name": "old_tree", - "type": "git_tree *", - "comment": "A git_tree object to diff from, or NULL for empty tree." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n", - "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_tree_to_workdir_with_index-8" - ] - } - }, - "git_diff_index_to_index": { - "type": "function", - "file": "git2/diff.h", - "line": 977, - "lineto": 982, - "args": [ - { - "name": "diff", - "type": "git_diff **", - "comment": "Output pointer to a git_diff pointer to be allocated." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing the indexes." - }, - { - "name": "old_index", - "type": "git_index *", - "comment": "A git_index object to diff from." - }, - { - "name": "new_index", - "type": "git_index *", - "comment": "A git_index object to diff to." - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Structure with options to influence diff or NULL for defaults." - } - ], - "argline": "git_diff **diff, git_repository *repo, git_index *old_index, git_index *new_index, const git_diff_options *opts", - "sig": "git_diff **::git_repository *::git_index *::git_index *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create a diff with the difference between two index objects.

\n", - "comments": "

The first index will be used for the "old_file" side of the delta and the second index will be used for the "new_file" side of the delta.

\n", - "group": "diff" - }, - "git_diff_merge": { - "type": "function", - "file": "git2/diff.h", - "line": 998, - "lineto": 1000, - "args": [ - { - "name": "onto", - "type": "git_diff *", - "comment": "Diff to merge into." - }, - { - "name": "from", - "type": "const git_diff *", - "comment": "Diff to merge." - } - ], - "argline": "git_diff *onto, const git_diff *from", - "sig": "git_diff *::const git_diff *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Merge one diff into another.

\n", - "comments": "

This merges items from the "from" list into the "onto" list. The resulting diff will have all items that appear in either list. If an item appears in both lists, then it will be "merged" to appear as if the old version was from the "onto" list and the new version is from the "from" list (with the exception that if the item has a pending DELETE in the middle, then it will show as deleted).

\n", - "group": "diff" - }, - "git_diff_find_similar": { - "type": "function", - "file": "git2/diff.h", - "line": 1014, - "lineto": 1016, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "diff to run detection algorithms on" - }, - { - "name": "options", - "type": "const git_diff_find_options *", - "comment": "Control how detection should be run, NULL for defaults" - } - ], - "argline": "git_diff *diff, const git_diff_find_options *options", - "sig": "git_diff *::const git_diff_find_options *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on failure" - }, - "description": "

Transform a diff marking file renames, copies, etc.

\n", - "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_find_similar-9" - ] - } - }, - "git_diff_num_deltas": { - "type": "function", - "file": "git2/diff.h", - "line": 1034, - "lineto": 1034, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "A git_diff generated by one of the above functions" - } - ], - "argline": "const git_diff *diff", - "sig": "const git_diff *", - "return": { - "type": "size_t", - "comment": " Count of number of deltas in the list" - }, - "description": "

Query how many diff records are there in a diff.

\n", - "comments": "", - "group": "diff", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_diff_num_deltas-29" - ] - } - }, - "git_diff_num_deltas_of_type": { - "type": "function", - "file": "git2/diff.h", - "line": 1047, - "lineto": 1048, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "A git_diff generated by one of the above functions" - }, - { - "name": "type", - "type": "git_delta_t", - "comment": "A git_delta_t value to filter the count" - } - ], - "argline": "const git_diff *diff, git_delta_t type", - "sig": "const git_diff *::git_delta_t", - "return": { - "type": "size_t", - "comment": " Count of number of deltas matching delta_t type" - }, - "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", - "comments": "

This works just like git_diff_num_deltas() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", - "group": "diff" - }, - "git_diff_get_delta": { - "type": "function", - "file": "git2/diff.h", - "line": 1067, - "lineto": 1068, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "Diff list object" - }, - { - "name": "idx", - "type": "size_t", - "comment": "Index into diff list" - } - ], - "argline": "const git_diff *diff, size_t idx", - "sig": "const git_diff *::size_t", - "return": { - "type": "const git_diff_delta *", - "comment": " Pointer to git_diff_delta (or NULL if `idx` out of range)" - }, - "description": "

Return the diff delta for an entry in the diff list.

\n", - "comments": "

The git_diff_delta pointer points to internal data and you do not have to release it when you are done with it. It will go away when the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary content or not may not be set if there are no attributes set for the file and there has been no reason to load the file data at this point. For now, if you need those flags to be up to date, your only option is to either use git_diff_foreach or create a git_patch.

\n", - "group": "diff" - }, - "git_diff_is_sorted_icase": { - "type": "function", - "file": "git2/diff.h", - "line": 1076, - "lineto": 1076, - "args": [ - { - "name": "diff", - "type": "const git_diff *", - "comment": "diff to check" - } - ], - "argline": "const git_diff *diff", - "sig": "const git_diff *", - "return": { - "type": "int", - "comment": " 0 if case sensitive, 1 if case is ignored" - }, - "description": "

Check if deltas are sorted case sensitively or insensitively.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_foreach": { - "type": "function", - "file": "git2/diff.h", - "line": 1104, - "lineto": 1110, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback function to make per file in the diff." - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Optional callback to make for binary files." - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Optional callback to make per hunk of text diff. This\n callback is called to describe a range of lines in the\n diff. It will not be issued for binary files." - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Optional callback to make per line of diff text. This\n same callback will be made for context lines, added, and\n removed lines, and even for a deleted trailing newline." - }, - { - "name": "payload", - "type": "void *", - "comment": "Reference pointer that will be passed to your callbacks." - } - ], - "argline": "git_diff *diff, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "git_diff *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all deltas in a diff issuing callbacks.

\n", - "comments": "

This will iterate through all of the files described in a diff. You should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the files will only be calculated if they are not NULL. Of course, these callbacks will not be invoked for binary files on the diff or for files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate the iteration and return the value to the user.

\n", - "group": "diff" - }, - "git_diff_status_char": { - "type": "function", - "file": "git2/diff.h", - "line": 1123, - "lineto": 1123, - "args": [ - { - "name": "status", - "type": "git_delta_t", - "comment": "The git_delta_t value to look up" - } - ], - "argline": "git_delta_t status", - "sig": "git_delta_t", - "return": { - "type": "char", - "comment": " The single character label for that code" - }, - "description": "

Look up the single character abbreviation for a delta status code.

\n", - "comments": "

When you run git diff --name-status it uses single letter codes in the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. This function converts a git_delta_t value into these letters for your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", - "group": "diff" - }, - "git_diff_print": { - "type": "function", - "file": "git2/diff.h", - "line": 1149, - "lineto": 1153, - "args": [ - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - }, - { - "name": "format", - "type": "git_diff_format_t", - "comment": "A git_diff_format_t value to pick the text format." - }, - { - "name": "print_cb", - "type": "git_diff_line_cb", - "comment": "Callback to make per line of diff text." - }, - { - "name": "payload", - "type": "void *", - "comment": "Reference pointer that will be passed to your callback." - } - ], - "argline": "git_diff *diff, git_diff_format_t format, git_diff_line_cb print_cb, void *payload", - "sig": "git_diff *::git_diff_format_t::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Iterate over a diff generating formatted text output.

\n", - "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_print-10" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_diff_print-30" - ] - } - }, - "git_diff_to_buf": { - "type": "function", - "file": "git2/diff.h", - "line": 1165, - "lineto": 1168, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "A pointer to a user-allocated git_buf that will\n contain the diff text" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - }, - { - "name": "format", - "type": "git_diff_format_t", - "comment": "A git_diff_format_t value to pick the text format." - } - ], - "argline": "git_buf *out, git_diff *diff, git_diff_format_t format", - "sig": "git_buf *::git_diff *::git_diff_format_t", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Produce the complete formatted text output from a diff into a\n buffer.

\n", - "comments": "", - "group": "diff" - }, - "git_diff_blobs": { - "type": "function", - "file": "git2/diff.h", - "line": 1204, - "lineto": 1214, - "args": [ - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "new_blob", - "type": "const git_blob *", - "comment": "Blob for new side of diff, or NULL for empty blob" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat new blob as if it had this filename; can be NULL" - }, - { - "name": "options", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Callback for binary files; can be NULL" - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Callback for each hunk in diff; can be NULL" - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Callback for each line in diff; can be NULL" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to each callback function" - } - ], - "argline": "const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Directly run a diff on two blobs.

\n", - "comments": "

Compared to a file, a blob lacks some contextual information. As such, the git_diff_file given to the callback will have some fake data; i.e. mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated as an empty blob, with the oid set to NULL in the git_diff_file data. Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob looks like binary data, the git_diff_delta binary attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass GIT_DIFF_FORCE_TEXT of course).

\n", - "group": "diff" - }, - "git_diff_blob_to_buffer": { - "type": "function", - "file": "git2/diff.h", - "line": 1241, - "lineto": 1252, - "args": [ - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "buffer_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "buffer_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "options", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Callback for binary files; can be NULL" - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Callback for each hunk in diff; can be NULL" - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Callback for each line in diff; can be NULL" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to each callback function" - } - ], - "argline": "const git_blob *old_blob, const char *old_as_path, const char *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "const git_blob *::const char *::const char *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Directly run a diff between a blob and a buffer.

\n", - "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the entire content of the buffer added). Passing NULL to the buffer will do the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", - "group": "diff" - }, - "git_diff_buffers": { - "type": "function", - "file": "git2/diff.h", - "line": 1275, - "lineto": 1287, - "args": [ - { - "name": "old_buffer", - "type": "const void *", - "comment": "Raw data for old side of diff, or NULL for empty" - }, - { - "name": "old_len", - "type": "size_t", - "comment": "Length of the raw data for old side of the diff" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old buffer as if it had this filename; can be NULL" - }, - { - "name": "new_buffer", - "type": "const void *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "new_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "options", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - }, - { - "name": "file_cb", - "type": "git_diff_file_cb", - "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" - }, - { - "name": "binary_cb", - "type": "git_diff_binary_cb", - "comment": "Callback for binary files; can be NULL" - }, - { - "name": "hunk_cb", - "type": "git_diff_hunk_cb", - "comment": "Callback for each hunk in diff; can be NULL" - }, - { - "name": "line_cb", - "type": "git_diff_line_cb", - "comment": "Callback for each line in diff; can be NULL" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to each callback function" - } - ], - "argline": "const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", - "sig": "const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Directly run a diff between two buffers.

\n", - "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n", - "group": "diff" - }, - "git_diff_from_buffer": { - "type": "function", - "file": "git2/diff.h", - "line": 1327, - "lineto": 1334, - "args": [ - { - "name": "out", - "type": "git_diff **", - "comment": "A pointer to a git_diff pointer that will be allocated." - }, - { - "name": "content", - "type": "const char *", - "comment": "The contents of a patch file" - }, - { - "name": "content_len", - "type": "size_t", - "comment": "The length of the patch file contents" - } - ], - "argline": "git_diff **out, const char *content, size_t content_len", - "sig": "git_diff **::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the contents of a git patch file into a git_diff object.

\n", - "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_from_buffer-11", - "ex/v1.7.2/diff.html#git_diff_from_buffer-12" - ] - } - }, - "git_diff_get_stats": { - "type": "function", - "file": "git2/diff.h", - "line": 1370, - "lineto": 1372, - "args": [ - { - "name": "out", - "type": "git_diff_stats **", - "comment": "Structure containing the diff statistics." - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "A git_diff generated by one of the above functions." - } - ], - "argline": "git_diff_stats **out, git_diff *diff", - "sig": "git_diff_stats **::git_diff *", - "return": { - "type": "int", - "comment": " 0 on success; non-zero on error" - }, - "description": "

Accumulate diff statistics for all patches.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_get_stats-13" - ] - } - }, - "git_diff_stats_files_changed": { - "type": "function", - "file": "git2/diff.h", - "line": 1380, - "lineto": 1381, - "args": [ - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - } - ], - "argline": "const git_diff_stats *stats", - "sig": "const git_diff_stats *", - "return": { - "type": "size_t", - "comment": " total number of files changed in the diff" - }, - "description": "

Get the total number of files changed in a diff

\n", - "comments": "", - "group": "diff" - }, - "git_diff_stats_insertions": { - "type": "function", - "file": "git2/diff.h", - "line": 1389, - "lineto": 1390, - "args": [ - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - } - ], - "argline": "const git_diff_stats *stats", - "sig": "const git_diff_stats *", - "return": { - "type": "size_t", - "comment": " total number of insertions in the diff" - }, - "description": "

Get the total number of insertions in a diff

\n", - "comments": "", - "group": "diff" - }, - "git_diff_stats_deletions": { - "type": "function", - "file": "git2/diff.h", - "line": 1398, - "lineto": 1399, - "args": [ - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - } - ], - "argline": "const git_diff_stats *stats", - "sig": "const git_diff_stats *", - "return": { - "type": "size_t", - "comment": " total number of deletions in the diff" - }, - "description": "

Get the total number of deletions in a diff

\n", - "comments": "", - "group": "diff" - }, - "git_diff_stats_to_buf": { - "type": "function", - "file": "git2/diff.h", - "line": 1410, - "lineto": 1414, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer to store the formatted diff statistics in." - }, - { - "name": "stats", - "type": "const git_diff_stats *", - "comment": "A `git_diff_stats` generated by one of the above functions." - }, - { - "name": "format", - "type": "git_diff_stats_format_t", - "comment": "Formatting option." - }, - { - "name": "width", - "type": "size_t", - "comment": "Target width for output (only affects GIT_DIFF_STATS_FULL)" - } - ], - "argline": "git_buf *out, const git_diff_stats *stats, git_diff_stats_format_t format, size_t width", - "sig": "git_buf *::const git_diff_stats *::git_diff_stats_format_t::size_t", - "return": { - "type": "int", - "comment": " 0 on success; non-zero on error" - }, - "description": "

Print diff statistics to a git_buf.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_stats_to_buf-14" - ] - } - }, - "git_diff_stats_free": { - "type": "function", - "file": "git2/diff.h", - "line": 1422, - "lineto": 1422, - "args": [ - { - "name": "stats", - "type": "git_diff_stats *", - "comment": "The previously created statistics object;\n cannot be used after free." - } - ], - "argline": "git_diff_stats *stats", - "sig": "git_diff_stats *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Deallocate a git_diff_stats.

\n", - "comments": "", - "group": "diff", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_diff_stats_free-15" - ] - } - }, - "git_diff_patchid_options_init": { - "type": "function", - "file": "git2/diff.h", - "line": 1448, - "lineto": 1450, - "args": [ - { - "name": "opts", - "type": "git_diff_patchid_options *", - "comment": "The `git_diff_patchid_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_DIFF_PATCHID_OPTIONS_VERSION`." - } - ], - "argline": "git_diff_patchid_options *opts, unsigned int version", - "sig": "git_diff_patchid_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_diff_patchid_options structure

\n", - "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", - "group": "diff" - }, - "git_diff_patchid": { - "type": "function", - "file": "git2/diff.h", - "line": 1471, - "lineto": 1471, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where the calculated patch ID should be stored" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "The diff to calculate the ID for" - }, - { - "name": "opts", - "type": "git_diff_patchid_options *", - "comment": "Options for how to calculate the patch ID. This is\n intended for future changes, as currently no options are\n available." - } - ], - "argline": "git_oid *out, git_diff *diff, git_diff_patchid_options *opts", - "sig": "git_oid *::git_diff *::git_diff_patchid_options *", - "return": { - "type": "int", - "comment": " 0 on success, an error code otherwise." - }, - "description": "

Calculate the patch ID for the given patch.

\n", - "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", - "group": "diff" - }, - "git_error_last": { - "type": "function", - "file": "git2/errors.h", - "line": 128, - "lineto": 128, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "const git_error *", - "comment": " A git_error object." - }, - "description": "

Return the last git_error object that was generated for the\n current thread.

\n", - "comments": "

The default behaviour of this function is to return NULL if no previous error has occurred. However, libgit2's error strings are not cleared aggressively, so a prior (unrelated) error may be returned. This can be avoided by only calling this function if the prior call to a libgit2 API returned an error.

\n", - "group": "error", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_error_last-11", - "ex/v1.7.2/checkout.html#git_error_last-12", - "ex/v1.7.2/checkout.html#git_error_last-13", - "ex/v1.7.2/checkout.html#git_error_last-14" - ], - "commit.c": [ - "ex/v1.7.2/commit.html#git_error_last-2" - ], - "config.c": [ - "ex/v1.7.2/config.html#git_error_last-6", - "ex/v1.7.2/config.html#git_error_last-7", - "ex/v1.7.2/config.html#git_error_last-8" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_error_last-33" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_error_last-8", - "ex/v1.7.2/merge.html#git_error_last-9" - ] - } - }, - "git_error_clear": { - "type": "function", - "file": "git2/errors.h", - "line": 133, - "lineto": 133, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Clear the last library error that occurred for this thread.

\n", - "comments": "", - "group": "error" - }, - "git_error_set": { - "type": "function", - "file": "git2/errors.h", - "line": 153, - "lineto": 154, - "args": [ - { - "name": "error_class", - "type": "int", - "comment": "One of the `git_error_t` enum above describing the\n general subsystem that is responsible for the error." - }, - { - "name": "fmt", - "type": "const char *", - "comment": "The `printf`-style format string; subsequent arguments must\n be the arguments for the format string." - } - ], - "argline": "int error_class, const char *fmt", - "sig": "int::const char *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Set the error message string for this thread, using printf-style\n formatting.

\n", - "comments": "

This function is public so that custom ODB backends and the like can relay an error message through libgit2. Most regular users of libgit2 will never need to call this function -- actually, calling it in most circumstances (for example, calling from within a callback function) will just end up having the value overwritten by libgit2 internals.

\n\n

This error message is stored in thread-local storage and only applies to the particular thread that this libgit2 call is made from.

\n", - "group": "error" - }, - "git_error_set_str": { - "type": "function", - "file": "git2/errors.h", - "line": 166, - "lineto": 166, - "args": [ - { - "name": "error_class", - "type": "int", - "comment": "One of the `git_error_t` enum above describing the\n general subsystem that is responsible for the error." - }, - { - "name": "string", - "type": "const char *", - "comment": "The error message to keep" - } - ], - "argline": "int error_class, const char *string", - "sig": "int::const char *", - "return": { - "type": "int", - "comment": " 0 on success or -1 on failure" - }, - "description": "

Set the error message string for this thread. This function is like\n git_error_set but takes a static string instead of a printf-style\n format.

\n", - "comments": "", - "group": "error" - }, - "git_error_set_oom": { - "type": "function", - "file": "git2/errors.h", - "line": 177, - "lineto": 177, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "void", - "comment": null - }, - "description": "

Set the error message to a special value for memory allocation failure.

\n", - "comments": "

The normal git_error_set_str() function attempts to strdup() the string that is passed in. This is not a good idea when the error in question is a memory allocation failure. That circumstance has a special setter function that sets the error string to a known and statically allocated internal value.

\n", - "group": "error" - }, - "git_filter_list_load": { - "type": "function", - "file": "git2/filter.h", - "line": 129, - "lineto": 135, - "args": [ - { - "name": "filters", - "type": "git_filter_list **", - "comment": "Output newly created git_filter_list (or NULL)" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object that contains `path`" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "The blob to which the filter will be applied (if known)" - }, - { - "name": "path", - "type": "const char *", - "comment": "Relative path of the file to be filtered" - }, - { - "name": "mode", - "type": "git_filter_mode_t", - "comment": "Filtering direction (WT->ODB or ODB->WT)" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of `git_filter_flag_t` flags" - } - ], - "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags", - "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t", - "return": { - "type": "int", - "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" - }, - "description": "

Load the filter list for a given path.

\n", - "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", - "group": "filter" - }, - "git_filter_list_load_ext": { - "type": "function", - "file": "git2/filter.h", - "line": 152, - "lineto": 158, - "args": [ - { - "name": "filters", - "type": "git_filter_list **", - "comment": "Output newly created git_filter_list (or NULL)" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object that contains `path`" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "The blob to which the filter will be applied (if known)" - }, - { - "name": "path", - "type": "const char *", - "comment": "Relative path of the file to be filtered" - }, - { - "name": "mode", - "type": "git_filter_mode_t", - "comment": "Filtering direction (WT->ODB or ODB->WT)" - }, - { - "name": "opts", - "type": "git_filter_options *", - "comment": "The `git_filter_options` to use when loading filters" - } - ], - "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, git_filter_options *opts", - "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::git_filter_options *", - "return": { - "type": "int", - "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" - }, - "description": "

Load the filter list for a given path.

\n", - "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", - "group": "filter" - }, - "git_filter_list_contains": { - "type": "function", - "file": "git2/filter.h", - "line": 172, - "lineto": 174, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "A loaded git_filter_list (or NULL)" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the filter to query" - } - ], - "argline": "git_filter_list *filters, const char *name", - "sig": "git_filter_list *::const char *", - "return": { - "type": "int", - "comment": " 1 if the filter is in the list, 0 otherwise" - }, - "description": "

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n", - "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", - "group": "filter" - }, - "git_filter_list_apply_to_buffer": { - "type": "function", - "file": "git2/filter.h", - "line": 185, - "lineto": 189, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Buffer to store the result of the filtering" - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": "A loaded git_filter_list (or NULL)" - }, - { - "name": "in", - "type": "const char *", - "comment": "Buffer containing the data to filter" - }, - { - "name": "in_len", - "type": "size_t", - "comment": "The length of the input buffer" - } - ], - "argline": "git_buf *out, git_filter_list *filters, const char *in, size_t in_len", - "sig": "git_buf *::git_filter_list *::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, an error code otherwise" - }, - "description": "

Apply filter list to a data buffer.

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_apply_to_file": { - "type": "function", - "file": "git2/filter.h", - "line": 201, - "lineto": 205, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer into which to store the filtered file" - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the filtering" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" - } - ], - "argline": "git_buf *out, git_filter_list *filters, git_repository *repo, const char *path", - "sig": "git_buf *::git_filter_list *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Apply a filter list to the contents of a file on disk

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_apply_to_blob": { - "type": "function", - "file": "git2/filter.h", - "line": 215, - "lineto": 218, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer into which to store the filtered file" - }, - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "the blob to filter" - } - ], - "argline": "git_buf *out, git_filter_list *filters, git_blob *blob", - "sig": "git_buf *::git_filter_list *::git_blob *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Apply a filter list to the contents of a blob

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_stream_buffer": { - "type": "function", - "file": "git2/filter.h", - "line": 229, - "lineto": 233, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "the buffer to filter" - }, - { - "name": "len", - "type": "size_t", - "comment": "the size of the buffer" - }, - { - "name": "target", - "type": "git_writestream *", - "comment": "the stream into which the data will be written" - } - ], - "argline": "git_filter_list *filters, const char *buffer, size_t len, git_writestream *target", - "sig": "git_filter_list *::const char *::size_t::git_writestream *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Apply a filter list to an arbitrary buffer as a stream

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_stream_file": { - "type": "function", - "file": "git2/filter.h", - "line": 245, - "lineto": 249, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the filtering" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" - }, - { - "name": "target", - "type": "git_writestream *", - "comment": "the stream into which the data will be written" - } - ], - "argline": "git_filter_list *filters, git_repository *repo, const char *path, git_writestream *target", - "sig": "git_filter_list *::git_repository *::const char *::git_writestream *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Apply a filter list to a file as a stream

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_stream_blob": { - "type": "function", - "file": "git2/filter.h", - "line": 259, - "lineto": 262, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "the list of filters to apply" - }, - { - "name": "blob", - "type": "git_blob *", - "comment": "the blob to filter" - }, - { - "name": "target", - "type": "git_writestream *", - "comment": "the stream into which the data will be written" - } - ], - "argline": "git_filter_list *filters, git_blob *blob, git_writestream *target", - "sig": "git_filter_list *::git_blob *::git_writestream *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Apply a filter list to a blob as a stream

\n", - "comments": "", - "group": "filter" - }, - "git_filter_list_free": { - "type": "function", - "file": "git2/filter.h", - "line": 269, - "lineto": 269, - "args": [ - { - "name": "filters", - "type": "git_filter_list *", - "comment": "A git_filter_list created by `git_filter_list_load`" - } - ], - "argline": "git_filter_list *filters", - "sig": "git_filter_list *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a git_filter_list

\n", - "comments": "", - "group": "filter" - }, - "git_libgit2_init": { - "type": "function", - "file": "git2/global.h", - "line": 26, - "lineto": 26, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": " the number of initializations of the library, or an error code." - }, - "description": "

Init the global state

\n", - "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", - "group": "libgit2", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_libgit2_init-34" - ] - } - }, - "git_libgit2_shutdown": { - "type": "function", - "file": "git2/global.h", - "line": 39, - "lineto": 39, - "args": [], - "argline": "", - "sig": "", - "return": { - "type": "int", - "comment": " the number of remaining initializations of the library, or an\n error code." - }, - "description": "

Shutdown the global state

\n", - "comments": "

Clean up the global state and threading context after calling it as many times as git_libgit2_init() was called - it will return the number of remainining initializations that have not been shutdown (after this one).

\n", - "group": "libgit2" - }, - "git_graph_ahead_behind": { - "type": "function", - "file": "git2/graph.h", - "line": 38, - "lineto": 38, - "args": [ - { - "name": "ahead", - "type": "size_t *", - "comment": "number of unique from commits in `upstream`" - }, - { - "name": "behind", - "type": "size_t *", - "comment": "number of unique from commits in `local`" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "local", - "type": "const git_oid *", - "comment": "the commit for local" - }, - { - "name": "upstream", - "type": "const git_oid *", - "comment": "the commit for upstream" - } - ], - "argline": "size_t *ahead, size_t *behind, git_repository *repo, const git_oid *local, const git_oid *upstream", - "sig": "size_t *::size_t *::git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Count the number of unique commits between two commit objects

\n", - "comments": "

There is no need for branches containing the commits to have any upstream relationship, but it helps to think of one as a branch and the other as its upstream, the ahead and behind values will be what git would report for the branches.

\n", - "group": "graph" - }, - "git_graph_descendant_of": { - "type": "function", - "file": "git2/graph.h", - "line": 53, - "lineto": 56, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "commit", - "type": "const git_oid *", - "comment": "a previously loaded commit" - }, - { - "name": "ancestor", - "type": "const git_oid *", - "comment": "a potential ancestor commit" - } - ], - "argline": "git_repository *repo, const git_oid *commit, const git_oid *ancestor", - "sig": "git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise." - }, - "description": "

Determine if a commit is the descendant of another commit.

\n", - "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", - "group": "graph" - }, - "git_graph_reachable_from_any": { - "type": "function", - "file": "git2/graph.h", - "line": 69, - "lineto": 73, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "commit", - "type": "const git_oid *", - "comment": "a previously loaded commit" - }, - { - "name": "descendant_array", - "type": "const git_oid []", - "comment": "oids of the commits" - }, - { - "name": "length", - "type": "size_t", - "comment": "the number of commits in the provided `descendant_array`" - } - ], - "argline": "git_repository *repo, const git_oid *commit, const git_oid [] descendant_array, size_t length", - "sig": "git_repository *::const git_oid *::const git_oid []::size_t", - "return": { - "type": "int", - "comment": " 1 if the given commit is an ancestor of any of the given potential\n descendants, 0 if not, error code otherwise." - }, - "description": "

Determine if a commit is reachable from any of a list of commits by\n following parent edges.

\n", - "comments": "", - "group": "graph" - }, - "git_ignore_add_rule": { - "type": "function", - "file": "git2/ignore.h", - "line": 37, - "lineto": 39, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository to add ignore rules to." - }, - { - "name": "rules", - "type": "const char *", - "comment": "Text of rules, the contents to add on a .gitignore file.\n It is okay to have multiple rules in the text; if so,\n each rule should be terminated with a newline." - } - ], - "argline": "git_repository *repo, const char *rules", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success" - }, - "description": "

Add ignore rules for a repository.

\n", - "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from .gitignore files in the repository tree or from a shared system file only if a "core.excludesfile" config value is set. The library also keeps a set of per-repository internal ignores that can be configured in-memory and will not persist. This function allows you to add to that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c/ with space");\n
\n\n

This would add three rules to the ignores.

\n", - "group": "ignore" - }, - "git_ignore_clear_internal_rules": { - "type": "function", - "file": "git2/ignore.h", - "line": 52, - "lineto": 53, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository to remove ignore rules from." - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success" - }, - "description": "

Clear ignore rules that were explicitly added.

\n", - "comments": "

Resets to the default internal ignore rules. This will not turn off rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", - "group": "ignore" - }, - "git_ignore_path_is_ignored": { - "type": "function", - "file": "git2/ignore.h", - "line": 71, - "lineto": 74, - "args": [ - { - "name": "ignored", - "type": "int *", - "comment": "boolean returning 0 if the file is not ignored, 1 if it is" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - }, - { - "name": "path", - "type": "const char *", - "comment": "the file to check ignores for, relative to the repo's workdir." - } - ], - "argline": "int *ignored, git_repository *repo, const char *path", - "sig": "int *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." - }, - "description": "

Test if the ignore rules apply to a given path.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index" on the given file, would it be shown or not?

\n", - "group": "ignore" - }, - "git_index_free": { - "type": "function", - "file": "git2/index.h", - "line": 216, - "lineto": 216, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an existing index object.

\n", - "comments": "", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.7.2/add.html#git_index_free-1" - ], - "commit.c": [ - "ex/v1.7.2/commit.html#git_index_free-3" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_index_free-35" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_index_free-2" - ], - "ls-files.c": [ - "ex/v1.7.2/ls-files.html#git_index_free-1" - ] - } - }, - "git_index_owner": { - "type": "function", - "file": "git2/index.h", - "line": 224, - "lineto": 224, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "The index" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "git_repository *", - "comment": " A pointer to the repository" - }, - "description": "

Get the repository this index relates to

\n", - "comments": "", - "group": "index" - }, - "git_index_caps": { - "type": "function", - "file": "git2/index.h", - "line": 232, - "lineto": 232, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "An existing index object" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "int", - "comment": " A combination of GIT_INDEX_CAPABILITY values" - }, - "description": "

Read index capabilities flags.

\n", - "comments": "", - "group": "index" - }, - "git_index_set_caps": { - "type": "function", - "file": "git2/index.h", - "line": 245, - "lineto": 245, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "caps", - "type": "int", - "comment": "A combination of GIT_INDEX_CAPABILITY values" - } - ], - "argline": "git_index *index, int caps", - "sig": "git_index *::int", - "return": { - "type": "int", - "comment": " 0 on success, -1 on failure" - }, - "description": "

Set index capabilities flags.

\n", - "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then capabilities will be read from the config of the owner object, looking at core.ignorecase, core.filemode, core.symlinks.

\n", - "group": "index" - }, - "git_index_version": { - "type": "function", - "file": "git2/index.h", - "line": 257, - "lineto": 257, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "unsigned int", - "comment": " the index version" - }, - "description": "

Get index on-disk version.

\n", - "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index with version 2 may be written instead, if the extension data in version 3 is not necessary.

\n", - "group": "index" - }, - "git_index_set_version": { - "type": "function", - "file": "git2/index.h", - "line": 270, - "lineto": 270, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The new version number" - } - ], - "argline": "git_index *index, unsigned int version", - "sig": "git_index *::unsigned int", - "return": { - "type": "int", - "comment": " 0 on success, -1 on failure" - }, - "description": "

Set index on-disk version.

\n", - "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may write an index with version 3 instead, if necessary to accurately represent the index.

\n", - "group": "index" - }, - "git_index_read": { - "type": "function", - "file": "git2/index.h", - "line": 289, - "lineto": 289, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "force", - "type": "int", - "comment": "if true, always reload, vs. only read if file has changed" - } - ], - "argline": "git_index *index, int force", - "sig": "git_index *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n", - "comments": "

If force is true, this performs a "hard" read that discards in-memory changes and always reloads the on-disk index data. If there is no on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index data from disk only if it has changed since the last time it was loaded. Purely in-memory index data will be untouched. Be aware: if there are changes on disk, unwritten in-memory changes are discarded.

\n", - "group": "index" - }, - "git_index_write": { - "type": "function", - "file": "git2/index.h", - "line": 298, - "lineto": 298, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an existing index object from memory back to disk\n using an atomic file lock.

\n", - "comments": "", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.7.2/add.html#git_index_write-2" - ], - "commit.c": [ - "ex/v1.7.2/commit.html#git_index_write-4" - ] - } - }, - "git_index_path": { - "type": "function", - "file": "git2/index.h", - "line": 306, - "lineto": 306, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "an existing index object" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "const char *", - "comment": " path to index file or NULL for in-memory index" - }, - "description": "

Get the full path to the index file on disk.

\n", - "comments": "", - "group": "index" - }, - "git_index_checksum": { - "type": "function", - "file": "git2/index.h", - "line": 320, - "lineto": 320, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the checksum of the index" - }, - "description": "

Get the checksum of the index

\n", - "comments": "

This checksum is the SHA-1 hash over the index file (except the last 20 bytes which are the checksum itself). In cases where the index does not exist on-disk, it will be zeroed out.

\n", - "group": "index" - }, - "git_index_read_tree": { - "type": "function", - "file": "git2/index.h", - "line": 332, - "lineto": 332, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "tree to read" - } - ], - "argline": "git_index *index, const git_tree *tree", - "sig": "git_index *::const git_tree *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read a tree into the index file with stats

\n", - "comments": "

The current index contents will be replaced by the specified tree.

\n", - "group": "index" - }, - "git_index_write_tree": { - "type": "function", - "file": "git2/index.h", - "line": 353, - "lineto": 353, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the written tree" - }, - { - "name": "index", - "type": "git_index *", - "comment": "Index to write" - } - ], - "argline": "git_oid *out, git_index *index", - "sig": "git_oid *::git_index *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" - }, - "description": "

Write the index as a tree

\n", - "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", - "group": "index", - "examples": { - "commit.c": [ - "ex/v1.7.2/commit.html#git_index_write_tree-5" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_index_write_tree-3" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_index_write_tree-10" - ] - } - }, - "git_index_write_tree_to": { - "type": "function", - "file": "git2/index.h", - "line": 370, - "lineto": 370, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where to store OID of the written tree" - }, - { - "name": "index", - "type": "git_index *", - "comment": "Index to write" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to write the tree" - } - ], - "argline": "git_oid *out, git_index *index, git_repository *repo", - "sig": "git_oid *::git_index *::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" - }, - "description": "

Write the index as a tree to the given repository

\n", - "comments": "

This method will do the same as git_index_write_tree, but letting the user choose the repository where the tree will be written.

\n\n

The index must not contain any file in conflict.

\n", - "group": "index" - }, - "git_index_entrycount": { - "type": "function", - "file": "git2/index.h", - "line": 389, - "lineto": 389, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "an existing index object" - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "size_t", - "comment": " integer of count of current entries" - }, - "description": "

Get the count of entries currently in the index

\n", - "comments": "", - "group": "index", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_index_entrycount-36" - ], - "ls-files.c": [ - "ex/v1.7.2/ls-files.html#git_index_entrycount-2" - ] - } - }, - "git_index_clear": { - "type": "function", - "file": "git2/index.h", - "line": 400, - "lineto": 400, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "int", - "comment": " 0 on success, error code \n<\n 0 on failure" - }, - "description": "

Clear the contents (all the entries) of an index object.

\n", - "comments": "

This clears the index object in memory; changes must be explicitly written to disk for them to take effect persistently.

\n", - "group": "index" - }, - "git_index_get_byindex": { - "type": "function", - "file": "git2/index.h", - "line": 413, - "lineto": 414, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "n", - "type": "size_t", - "comment": "the position of the entry" - } - ], - "argline": "git_index *index, size_t n", - "sig": "git_index *::size_t", - "return": { - "type": "const git_index_entry *", - "comment": " a pointer to the entry; NULL if out of bounds" - }, - "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", - "group": "index", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_index_get_byindex-37" - ], - "ls-files.c": [ - "ex/v1.7.2/ls-files.html#git_index_get_byindex-3" - ] - } - }, - "git_index_get_bypath": { - "type": "function", - "file": "git2/index.h", - "line": 428, - "lineto": 429, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - }, - { - "name": "stage", - "type": "int", - "comment": "stage to search" - } - ], - "argline": "git_index *index, const char *path, int stage", - "sig": "git_index *::const char *::int", - "return": { - "type": "const git_index_entry *", - "comment": " a pointer to the entry; NULL if it was not found" - }, - "description": "

Get a pointer to one of the entries in the index

\n", - "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", - "group": "index", - "examples": { - "ls-files.c": [ - "ex/v1.7.2/ls-files.html#git_index_get_bypath-4" - ] - } - }, - "git_index_remove": { - "type": "function", - "file": "git2/index.h", - "line": 439, - "lineto": 439, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - }, - { - "name": "stage", - "type": "int", - "comment": "stage to search" - } - ], - "argline": "git_index *index, const char *path, int stage", - "sig": "git_index *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove an entry from the index

\n", - "comments": "", - "group": "index" - }, - "git_index_remove_directory": { - "type": "function", - "file": "git2/index.h", - "line": 449, - "lineto": 450, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "dir", - "type": "const char *", - "comment": "container directory path" - }, - { - "name": "stage", - "type": "int", - "comment": "stage to search" - } - ], - "argline": "git_index *index, const char *dir, int stage", - "sig": "git_index *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove all entries from the index under a given directory

\n", - "comments": "", - "group": "index" - }, - "git_index_add": { - "type": "function", - "file": "git2/index.h", - "line": 466, - "lineto": 466, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "source_entry", - "type": "const git_index_entry *", - "comment": "new entry object" - } - ], - "argline": "git_index *index, const git_index_entry *source_entry", - "sig": "git_index *::const git_index_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an index entry from an in-memory struct

\n", - "comments": "

If a previous index entry exists that has the same path and stage as the given 'source_entry', it will be replaced. Otherwise, the 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given 'source_entry' will be inserted on the index.

\n", - "group": "index" - }, - "git_index_entry_stage": { - "type": "function", - "file": "git2/index.h", - "line": 478, - "lineto": 478, - "args": [ - { - "name": "entry", - "type": "const git_index_entry *", - "comment": "The entry" - } - ], - "argline": "const git_index_entry *entry", - "sig": "const git_index_entry *", - "return": { - "type": "int", - "comment": " the stage number" - }, - "description": "

Return the stage number from a git index entry

\n", - "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags & GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT\n
\n", - "group": "index" - }, - "git_index_entry_is_conflict": { - "type": "function", - "file": "git2/index.h", - "line": 487, - "lineto": 487, - "args": [ - { - "name": "entry", - "type": "const git_index_entry *", - "comment": "The entry" - } - ], - "argline": "const git_index_entry *entry", - "sig": "const git_index_entry *", - "return": { - "type": "int", - "comment": " 1 if the entry is a conflict entry, 0 otherwise" - }, - "description": "

Return whether the given index entry is a conflict (has a high stage\n entry). This is simply shorthand for git_index_entry_stage > 0.

\n", - "comments": "", - "group": "index" - }, - "git_index_iterator_new": { - "type": "function", - "file": "git2/index.h", - "line": 508, - "lineto": 510, - "args": [ - { - "name": "iterator_out", - "type": "git_index_iterator **", - "comment": "The newly created iterator" - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to iterate" - } - ], - "argline": "git_index_iterator **iterator_out, git_index *index", - "sig": "git_index_iterator **::git_index *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create an iterator that will return every entry contained in the\n index at the time of creation. Entries are returned in order,\n sorted by path. This iterator is backed by a snapshot that allows\n callers to modify the index while iterating without affecting the\n iterator.

\n", - "comments": "", - "group": "index" - }, - "git_index_iterator_next": { - "type": "function", - "file": "git2/index.h", - "line": 519, - "lineto": 521, - "args": [ - { - "name": "out", - "type": "const git_index_entry **", - "comment": "Pointer to store the index entry in" - }, - { - "name": "iterator", - "type": "git_index_iterator *", - "comment": "The iterator" - } - ], - "argline": "const git_index_entry **out, git_index_iterator *iterator", - "sig": "const git_index_entry **::git_index_iterator *", - "return": { - "type": "int", - "comment": " 0, GIT_ITEROVER on iteration completion or an error code" - }, - "description": "

Return the next index entry in-order from the iterator.

\n", - "comments": "", - "group": "index" - }, - "git_index_iterator_free": { - "type": "function", - "file": "git2/index.h", - "line": 528, - "lineto": 528, - "args": [ - { - "name": "iterator", - "type": "git_index_iterator *", - "comment": "The iterator to free" - } - ], - "argline": "git_index_iterator *iterator", - "sig": "git_index_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the index iterator

\n", - "comments": "", - "group": "index" - }, - "git_index_add_bypath": { - "type": "function", - "file": "git2/index.h", - "line": 559, - "lineto": 559, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "filename to add" - } - ], - "argline": "git_index *index, const char *path", - "sig": "git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an index entry from a file on disk

\n", - "comments": "

The file path must be relative to the repository's working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", - "group": "index" - }, - "git_index_add_from_buffer": { - "type": "function", - "file": "git2/index.h", - "line": 587, - "lineto": 590, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "entry", - "type": "const git_index_entry *", - "comment": "filename to add" - }, - { - "name": "buffer", - "type": "const void *", - "comment": "data to be written into the blob" - }, - { - "name": "len", - "type": "size_t", - "comment": "length of the data" - } - ], - "argline": "git_index *index, const git_index_entry *entry, const void *buffer, size_t len", - "sig": "git_index *::const git_index_entry *::const void *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an index entry from a buffer in memory

\n", - "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", - "group": "index" - }, - "git_index_remove_bypath": { - "type": "function", - "file": "git2/index.h", - "line": 606, - "lineto": 606, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "filename to remove" - } - ], - "argline": "git_index *index, const char *path", - "sig": "git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove an index entry corresponding to a file on disk

\n", - "comments": "

The file path must be relative to the repository's working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", - "group": "index" - }, - "git_index_add_all": { - "type": "function", - "file": "git2/index.h", - "line": 654, - "lineto": 659, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "array of path patterns" - }, - { - "name": "flags", - "type": "unsigned int", - "comment": "combination of git_index_add_option_t flags" - }, - { - "name": "callback", - "type": "git_index_matched_path_cb", - "comment": "notification callback for each added/updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." - }, - { - "name": "payload", - "type": "void *", - "comment": "payload passed through to callback function" - } - ], - "argline": "git_index *index, const git_strarray *pathspec, unsigned int flags, git_index_matched_path_cb callback, void *payload", - "sig": "git_index *::const git_strarray *::unsigned int::git_index_matched_path_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, negative callback return value, or error code" - }, - "description": "

Add or update index entries matching files in the working directory.

\n", - "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.7.2/add.html#git_index_add_all-3" - ] - } - }, - "git_index_remove_all": { - "type": "function", - "file": "git2/index.h", - "line": 676, - "lineto": 680, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "array of path patterns" - }, - { - "name": "callback", - "type": "git_index_matched_path_cb", - "comment": "notification callback for each removed path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." - }, - { - "name": "payload", - "type": "void *", - "comment": "payload passed through to callback function" - } - ], - "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", - "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, negative callback return value, or error code" - }, - "description": "

Remove all matching index entries.

\n", - "comments": "

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is removed. Return 0 to remove the item, > 0 to skip the item, and < 0 to abort the scan.

\n", - "group": "index" - }, - "git_index_update_all": { - "type": "function", - "file": "git2/index.h", - "line": 705, - "lineto": 709, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "An existing index object" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "array of path patterns" - }, - { - "name": "callback", - "type": "git_index_matched_path_cb", - "comment": "notification callback for each updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." - }, - { - "name": "payload", - "type": "void *", - "comment": "payload passed through to callback function" - } - ], - "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", - "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, negative callback return value, or error code" - }, - "description": "

Update all index entries to match the working directory

\n", - "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", - "group": "index", - "examples": { - "add.c": [ - "ex/v1.7.2/add.html#git_index_update_all-4" - ] - } - }, - "git_index_find": { - "type": "function", - "file": "git2/index.h", - "line": 720, - "lineto": 720, - "args": [ - { - "name": "at_pos", - "type": "size_t *", - "comment": "the address to which the position of the index entry is written (optional)" - }, - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - } - ], - "argline": "size_t *at_pos, git_index *index, const char *path", - "sig": "size_t *::git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Find the first position of any entries which point to given\n path in the Git index.

\n", - "comments": "", - "group": "index" - }, - "git_index_find_prefix": { - "type": "function", - "file": "git2/index.h", - "line": 731, - "lineto": 731, - "args": [ - { - "name": "at_pos", - "type": "size_t *", - "comment": "the address to which the position of the index entry is written (optional)" - }, - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "prefix", - "type": "const char *", - "comment": "the prefix to search for" - } - ], - "argline": "size_t *at_pos, git_index *index, const char *prefix", - "sig": "size_t *::git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Find the first position of any entries matching a prefix. To find the first position\n of a path inside a given folder, suffix the prefix with a '/'.

\n", - "comments": "", - "group": "index" - }, - "git_index_conflict_add": { - "type": "function", - "file": "git2/index.h", - "line": 756, - "lineto": 760, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "ancestor_entry", - "type": "const git_index_entry *", - "comment": "the entry data for the ancestor of the conflict" - }, - { - "name": "our_entry", - "type": "const git_index_entry *", - "comment": "the entry data for our side of the merge conflict" - }, - { - "name": "their_entry", - "type": "const git_index_entry *", - "comment": "the entry data for their side of the merge conflict" - } - ], - "argline": "git_index *index, const git_index_entry *ancestor_entry, const git_index_entry *our_entry, const git_index_entry *their_entry", - "sig": "git_index *::const git_index_entry *::const git_index_entry *::const git_index_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n", - "comments": "

The entries are the entries from the tree included in the merge. Any entry may be null to indicate that that file was not present in the trees during the merge. For example, ancestor_entry may be NULL to indicate that a file was added in both branches and must be resolved.

\n", - "group": "index" - }, - "git_index_conflict_get": { - "type": "function", - "file": "git2/index.h", - "line": 776, - "lineto": 781, - "args": [ - { - "name": "ancestor_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the ancestor entry" - }, - { - "name": "our_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the our entry" - }, - { - "name": "their_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the their entry" - }, - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to search" - } - ], - "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index *index, const char *path", - "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the index entries that represent a conflict of a single file.

\n", - "comments": "

The entries are not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", - "group": "index" - }, - "git_index_conflict_remove": { - "type": "function", - "file": "git2/index.h", - "line": 790, - "lineto": 790, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to remove conflicts for" - } - ], - "argline": "git_index *index, const char *path", - "sig": "git_index *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Removes the index entries that represent a conflict of a single file.

\n", - "comments": "", - "group": "index" - }, - "git_index_conflict_cleanup": { - "type": "function", - "file": "git2/index.h", - "line": 798, - "lineto": 798, - "args": [ - { - "name": "index", - "type": "git_index *", - "comment": "an existing index object" - } - ], - "argline": "git_index *index", - "sig": "git_index *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove all conflicts in the index (entries with a stage greater than 0).

\n", - "comments": "", - "group": "index" - }, - "git_index_has_conflicts": { - "type": "function", - "file": "git2/index.h", - "line": 806, - "lineto": 806, - "args": [ - { - "name": "index", - "type": "const git_index *", - "comment": "An existing index object." - } - ], - "argline": "const git_index *index", - "sig": "const git_index *", - "return": { - "type": "int", - "comment": " 1 if at least one conflict is found, 0 otherwise." - }, - "description": "

Determine if the index contains entries representing file conflicts.

\n", - "comments": "", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_index_has_conflicts-11" - ] - } - }, - "git_index_conflict_iterator_new": { - "type": "function", - "file": "git2/index.h", - "line": 817, - "lineto": 819, - "args": [ - { - "name": "iterator_out", - "type": "git_index_conflict_iterator **", - "comment": "The newly created conflict iterator" - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to scan" - } - ], - "argline": "git_index_conflict_iterator **iterator_out, git_index *index", - "sig": "git_index_conflict_iterator **::git_index *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an iterator for the conflicts in the index.

\n", - "comments": "

The index must not be modified while iterating; the results are undefined.

\n", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_index_conflict_iterator_new-12" - ] - } - }, - "git_index_conflict_next": { - "type": "function", - "file": "git2/index.h", - "line": 832, - "lineto": 836, - "args": [ - { - "name": "ancestor_out", - "type": "const git_index_entry **", - "comment": "Pointer to store the ancestor side of the conflict" - }, - { - "name": "our_out", - "type": "const git_index_entry **", - "comment": "Pointer to store our side of the conflict" - }, - { - "name": "their_out", - "type": "const git_index_entry **", - "comment": "Pointer to store their side of the conflict" - }, - { - "name": "iterator", - "type": "git_index_conflict_iterator *", - "comment": "The conflict iterator." - } - ], - "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index_conflict_iterator *iterator", - "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index_conflict_iterator *", - "return": { - "type": "int", - "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" - }, - "description": "

Returns the current conflict (ancestor, ours and theirs entry) and\n advance the iterator internally to the next value.

\n", - "comments": "", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_index_conflict_next-13" - ] - } - }, - "git_index_conflict_iterator_free": { - "type": "function", - "file": "git2/index.h", - "line": 843, - "lineto": 844, - "args": [ - { - "name": "iterator", - "type": "git_index_conflict_iterator *", - "comment": "pointer to the iterator" - } - ], - "argline": "git_index_conflict_iterator *iterator", - "sig": "git_index_conflict_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees a git_index_conflict_iterator.

\n", - "comments": "", - "group": "index", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_index_conflict_iterator_free-14" - ] - } - }, - "git_indexer_options_init": { - "type": "function", - "file": "git2/indexer.h", - "line": 99, - "lineto": 101, - "args": [ - { - "name": "opts", - "type": "git_indexer_options *", - "comment": "the `git_indexer_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION`" - } - ], - "argline": "git_indexer_options *opts, unsigned int version", - "sig": "git_indexer_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_indexer_options with default values. Equivalent to\n creating an instance with GIT_INDEXER_OPTIONS_INIT.

\n", - "comments": "", - "group": "indexer" - }, - "git_indexer_new": { - "type": "function", - "file": "git2/indexer.h", - "line": 131, - "lineto": 136, - "args": [ - { - "name": "out", - "type": "git_indexer **", - "comment": "where to store the indexer instance" - }, - { - "name": "path", - "type": "const char *", - "comment": "to the directory where the packfile should be stored" - }, - { - "name": "mode", - "type": "unsigned int", - "comment": "permissions to use creating packfile or 0 for defaults" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "object database from which to read base objects when\n fixing thin packs. Pass NULL if no thin pack is expected (an error\n will be returned if there are bases missing)" - }, - { - "name": "opts", - "type": "git_indexer_options *", - "comment": "Optional structure containing additional options. See\n `git_indexer_options` above." - } - ], - "argline": "git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_indexer_options *opts", - "sig": "git_indexer **::const char *::unsigned int::git_odb *::git_indexer_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Create a new indexer instance

\n", - "comments": "", - "group": "indexer" - }, - "git_indexer_append": { - "type": "function", - "file": "git2/indexer.h", - "line": 148, - "lineto": 148, - "args": [ - { - "name": "idx", - "type": "git_indexer *", - "comment": "the indexer" - }, - { - "name": "data", - "type": "const void *", - "comment": "the data to add" - }, - { - "name": "size", - "type": "size_t", - "comment": "the size of the data in bytes" - }, - { - "name": "stats", - "type": "git_indexer_progress *", - "comment": "stat storage" - } - ], - "argline": "git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats", - "sig": "git_indexer *::const void *::size_t::git_indexer_progress *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Add data to the indexer

\n", - "comments": "", - "group": "indexer" - }, - "git_indexer_commit": { - "type": "function", - "file": "git2/indexer.h", - "line": 159, - "lineto": 159, - "args": [ - { - "name": "idx", - "type": "git_indexer *", - "comment": "the indexer" - }, - { - "name": "stats", - "type": "git_indexer_progress *", - "comment": "Stat storage." - } - ], - "argline": "git_indexer *idx, git_indexer_progress *stats", - "sig": "git_indexer *::git_indexer_progress *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Finalize the pack and index

\n", - "comments": "

Resolve any pending deltas and write out the index file

\n", - "group": "indexer" - }, - "git_indexer_hash": { - "type": "function", - "file": "git2/indexer.h", - "line": 172, - "lineto": 172, - "args": [ - { - "name": "idx", - "type": "const git_indexer *", - "comment": "the indexer instance" - } - ], - "argline": "const git_indexer *idx", - "sig": "const git_indexer *", - "return": { - "type": "const git_oid *", - "comment": " the packfile's hash" - }, - "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the index has been finalized.

\n", - "group": "indexer" - }, - "git_indexer_name": { - "type": "function", - "file": "git2/indexer.h", - "line": 184, - "lineto": 184, - "args": [ - { - "name": "idx", - "type": "const git_indexer *", - "comment": "the indexer instance" - } - ], - "argline": "const git_indexer *idx", - "sig": "const git_indexer *", - "return": { - "type": "const char *", - "comment": " a NUL terminated string for the packfile name" - }, - "description": "

Get the unique name for the resulting packfile.

\n", - "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the index has been finalized.

\n", - "group": "indexer" - }, - "git_indexer_free": { - "type": "function", - "file": "git2/indexer.h", - "line": 191, - "lineto": 191, - "args": [ - { - "name": "idx", - "type": "git_indexer *", - "comment": "the indexer to free" - } - ], - "argline": "git_indexer *idx", - "sig": "git_indexer *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the indexer and its resources

\n", - "comments": "", - "group": "indexer" - }, - "git_mailmap_new": { - "type": "function", - "file": "git2/mailmap.h", - "line": 32, - "lineto": 32, - "args": [ - { - "name": "out", - "type": "git_mailmap **", - "comment": "pointer to store the new mailmap" - } - ], - "argline": "git_mailmap **out", - "sig": "git_mailmap **", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Allocate a new mailmap object.

\n", - "comments": "

This object is empty, so you'll have to add a mailmap file before you can do anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", - "group": "mailmap" - }, - "git_mailmap_free": { - "type": "function", - "file": "git2/mailmap.h", - "line": 39, - "lineto": 39, - "args": [ - { - "name": "mm", - "type": "git_mailmap *", - "comment": "the mailmap to free" - } - ], - "argline": "git_mailmap *mm", - "sig": "git_mailmap *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the mailmap and its associated memory.

\n", - "comments": "", - "group": "mailmap" - }, - "git_mailmap_add_entry": { - "type": "function", - "file": "git2/mailmap.h", - "line": 52, - "lineto": 54, - "args": [ - { - "name": "mm", - "type": "git_mailmap *", - "comment": "mailmap to add the entry to" - }, - { - "name": "real_name", - "type": "const char *", - "comment": "the real name to use, or NULL" - }, - { - "name": "real_email", - "type": "const char *", - "comment": "the real email to use, or NULL" - }, - { - "name": "replace_name", - "type": "const char *", - "comment": "the name to replace, or NULL" - }, - { - "name": "replace_email", - "type": "const char *", - "comment": "the email to replace" - } - ], - "argline": "git_mailmap *mm, const char *real_name, const char *real_email, const char *replace_name, const char *replace_email", - "sig": "git_mailmap *::const char *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Add a single entry to the given mailmap object. If the entry already exists,\n it will be replaced with the new entry.

\n", - "comments": "", - "group": "mailmap" - }, - "git_mailmap_from_buffer": { - "type": "function", - "file": "git2/mailmap.h", - "line": 64, - "lineto": 65, - "args": [ - { - "name": "out", - "type": "git_mailmap **", - "comment": "pointer to store the new mailmap" - }, - { - "name": "buf", - "type": "const char *", - "comment": "buffer to parse the mailmap from" - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the input buffer" - } - ], - "argline": "git_mailmap **out, const char *buf, size_t len", - "sig": "git_mailmap **::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new mailmap instance containing a single mailmap file

\n", - "comments": "", - "group": "mailmap" - }, - "git_mailmap_from_repository": { - "type": "function", - "file": "git2/mailmap.h", - "line": 81, - "lineto": 82, - "args": [ - { - "name": "out", - "type": "git_mailmap **", - "comment": "pointer to store the new mailmap" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository to load mailmap information from" - } - ], - "argline": "git_mailmap **out, git_repository *repo", - "sig": "git_mailmap **::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Create a new mailmap instance from a repository, loading mailmap files based\n on the repository's configuration.

\n", - "comments": "

Mailmaps are loaded in the following order: 1. '.mailmap' in the root of the repository's working directory, if present. 2. The blob object identified by the 'mailmap.blob' config entry, if set. [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories] 3. The path in the 'mailmap.file' config entry, if set.

\n", - "group": "mailmap" - }, - "git_mailmap_resolve": { - "type": "function", - "file": "git2/mailmap.h", - "line": 96, - "lineto": 98, - "args": [ - { - "name": "real_name", - "type": "const char **", - "comment": "pointer to store the real name" - }, - { - "name": "real_email", - "type": "const char **", - "comment": "pointer to store the real email" - }, - { - "name": "mm", - "type": "const git_mailmap *", - "comment": "the mailmap to perform a lookup with (may be NULL)" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name to look up" - }, - { - "name": "email", - "type": "const char *", - "comment": "the email to look up" - } - ], - "argline": "const char **real_name, const char **real_email, const git_mailmap *mm, const char *name, const char *email", - "sig": "const char **::const char **::const git_mailmap *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Resolve a name and email to the corresponding real name and email.

\n", - "comments": "

The lifetime of the strings are tied to mm, name, and email parameters.

\n", - "group": "mailmap" - }, - "git_mailmap_resolve_signature": { - "type": "function", - "file": "git2/mailmap.h", - "line": 110, - "lineto": 111, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature" - }, - { - "name": "mm", - "type": "const git_mailmap *", - "comment": "mailmap to resolve with" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to resolve" - } - ], - "argline": "git_signature **out, const git_mailmap *mm, const git_signature *sig", - "sig": "git_signature **::const git_mailmap *::const git_signature *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Resolve a signature to use real names and emails with a mailmap.

\n", - "comments": "

Call git_signature_free() to free the data.

\n", - "group": "mailmap" - }, - "git_merge_file_input_init": { - "type": "function", - "file": "git2/merge.h", - "line": 60, - "lineto": 62, - "args": [ - { - "name": "opts", - "type": "git_merge_file_input *", - "comment": "the `git_merge_file_input` instance to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "the version of the struct; you should pass\n `GIT_MERGE_FILE_INPUT_VERSION` here." - } - ], - "argline": "git_merge_file_input *opts, unsigned int version", - "sig": "git_merge_file_input *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_merge_file_input with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_INPUT_INIT.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_file_options_init": { - "type": "function", - "file": "git2/merge.h", - "line": 233, - "lineto": 233, - "args": [ - { - "name": "opts", - "type": "git_merge_file_options *", - "comment": "The `git_merge_file_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_MERGE_FILE_OPTIONS_VERSION`." - } - ], - "argline": "git_merge_file_options *opts, unsigned int version", - "sig": "git_merge_file_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_merge_file_options structure

\n", - "comments": "

Initializes a git_merge_file_options with default values. Equivalent to creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", - "group": "merge" - }, - "git_merge_options_init": { - "type": "function", - "file": "git2/merge.h", - "line": 329, - "lineto": 329, - "args": [ - { - "name": "opts", - "type": "git_merge_options *", - "comment": "The `git_merge_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_MERGE_OPTIONS_VERSION`." - } - ], - "argline": "git_merge_options *opts, unsigned int version", - "sig": "git_merge_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_merge_options structure

\n", - "comments": "

Initializes a git_merge_options with default values. Equivalent to creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", - "group": "merge" - }, - "git_merge_analysis": { - "type": "function", - "file": "git2/merge.h", - "line": 399, - "lineto": 404, - "args": [ - { - "name": "analysis_out", - "type": "git_merge_analysis_t *", - "comment": "analysis enumeration that the result is written into" - }, - { - "name": "preference_out", - "type": "git_merge_preference_t *", - "comment": "One of the `git_merge_preference_t` flag." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to merge" - }, - { - "name": "their_heads", - "type": "const git_annotated_commit **", - "comment": "the heads to merge into" - }, - { - "name": "their_heads_len", - "type": "size_t", - "comment": "the number of heads to merge" - } - ], - "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len", - "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::const git_annotated_commit **::size_t", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into the HEAD of the repository.

\n", - "comments": "", - "group": "merge", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_merge_analysis-15" - ] - } - }, - "git_merge_analysis_for_ref": { - "type": "function", - "file": "git2/merge.h", - "line": 418, - "lineto": 424, - "args": [ - { - "name": "analysis_out", - "type": "git_merge_analysis_t *", - "comment": "analysis enumeration that the result is written into" - }, - { - "name": "preference_out", - "type": "git_merge_preference_t *", - "comment": "One of the `git_merge_preference_t` flag." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to merge" - }, - { - "name": "our_ref", - "type": "git_reference *", - "comment": "the reference to perform the analysis from" - }, - { - "name": "their_heads", - "type": "const git_annotated_commit **", - "comment": "the heads to merge into" - }, - { - "name": "their_heads_len", - "type": "size_t", - "comment": "the number of heads to merge" - } - ], - "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, git_reference *our_ref, const git_annotated_commit **their_heads, size_t their_heads_len", - "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::git_reference *::const git_annotated_commit **::size_t", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into a reference.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_base": { - "type": "function", - "file": "git2/merge.h", - "line": 435, - "lineto": 439, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the OID of a merge base between 'one' and 'two'" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "one", - "type": "const git_oid *", - "comment": "one of the commits" - }, - { - "name": "two", - "type": "const git_oid *", - "comment": "the other commit" - } - ], - "argline": "git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two", - "sig": "git_oid *::git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" - }, - "description": "

Find a merge base between two commits

\n", - "comments": "", - "group": "merge", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_merge_base-31" - ], - "rev-parse.c": [ - "ex/v1.7.2/rev-parse.html#git_merge_base-1" - ] - } - }, - "git_merge_bases": { - "type": "function", - "file": "git2/merge.h", - "line": 450, - "lineto": 454, - "args": [ - { - "name": "out", - "type": "git_oidarray *", - "comment": "array in which to store the resulting ids" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "one", - "type": "const git_oid *", - "comment": "one of the commits" - }, - { - "name": "two", - "type": "const git_oid *", - "comment": "the other commit" - } - ], - "argline": "git_oidarray *out, git_repository *repo, const git_oid *one, const git_oid *two", - "sig": "git_oidarray *::git_repository *::const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" - }, - "description": "

Find merge bases between two commits

\n", - "comments": "", - "group": "merge" - }, - "git_merge_base_many": { - "type": "function", - "file": "git2/merge.h", - "line": 465, - "lineto": 469, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the OID of a merge base considering all the commits" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "length", - "type": "size_t", - "comment": "The number of commits in the provided `input_array`" - }, - { - "name": "input_array", - "type": "const git_oid []", - "comment": "oids of the commits" - } - ], - "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", - "sig": "git_oid *::git_repository *::size_t::const git_oid []", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." - }, - "description": "

Find a merge base given a list of commits

\n", - "comments": "", - "group": "merge" - }, - "git_merge_bases_many": { - "type": "function", - "file": "git2/merge.h", - "line": 480, - "lineto": 484, - "args": [ - { - "name": "out", - "type": "git_oidarray *", - "comment": "array in which to store the resulting ids" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "length", - "type": "size_t", - "comment": "The number of commits in the provided `input_array`" - }, - { - "name": "input_array", - "type": "const git_oid []", - "comment": "oids of the commits" - } - ], - "argline": "git_oidarray *out, git_repository *repo, size_t length, const git_oid [] input_array", - "sig": "git_oidarray *::git_repository *::size_t::const git_oid []", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." - }, - "description": "

Find all merge bases given a list of commits

\n", - "comments": "", - "group": "merge" - }, - "git_merge_base_octopus": { - "type": "function", - "file": "git2/merge.h", - "line": 495, - "lineto": 499, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "the OID of a merge base considering all the commits" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository where the commits exist" - }, - { - "name": "length", - "type": "size_t", - "comment": "The number of commits in the provided `input_array`" - }, - { - "name": "input_array", - "type": "const git_oid []", - "comment": "oids of the commits" - } - ], - "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", - "sig": "git_oid *::git_repository *::size_t::const git_oid []", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." - }, - "description": "

Find a merge base in preparation for an octopus merge

\n", - "comments": "", - "group": "merge" - }, - "git_merge_file": { - "type": "function", - "file": "git2/merge.h", - "line": 517, - "lineto": 522, - "args": [ - { - "name": "out", - "type": "git_merge_file_result *", - "comment": "The git_merge_file_result to be filled in" - }, - { - "name": "ancestor", - "type": "const git_merge_file_input *", - "comment": "The contents of the ancestor file" - }, - { - "name": "ours", - "type": "const git_merge_file_input *", - "comment": "The contents of the file in \"our\" side" - }, - { - "name": "theirs", - "type": "const git_merge_file_input *", - "comment": "The contents of the file in \"their\" side" - }, - { - "name": "opts", - "type": "const git_merge_file_options *", - "comment": "The merge file options or `NULL` for defaults" - } - ], - "argline": "git_merge_file_result *out, const git_merge_file_input *ancestor, const git_merge_file_input *ours, const git_merge_file_input *theirs, const git_merge_file_options *opts", - "sig": "git_merge_file_result *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n", - "comments": "

Note that this function does not reference a repository and any configuration must be passed as git_merge_file_options.

\n", - "group": "merge" - }, - "git_merge_file_from_index": { - "type": "function", - "file": "git2/merge.h", - "line": 538, - "lineto": 544, - "args": [ - { - "name": "out", - "type": "git_merge_file_result *", - "comment": "The git_merge_file_result to be filled in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - }, - { - "name": "ancestor", - "type": "const git_index_entry *", - "comment": "The index entry for the ancestor file (stage level 1)" - }, - { - "name": "ours", - "type": "const git_index_entry *", - "comment": "The index entry for our file (stage level 2)" - }, - { - "name": "theirs", - "type": "const git_index_entry *", - "comment": "The index entry for their file (stage level 3)" - }, - { - "name": "opts", - "type": "const git_merge_file_options *", - "comment": "The merge file options or NULL" - } - ], - "argline": "git_merge_file_result *out, git_repository *repo, const git_index_entry *ancestor, const git_index_entry *ours, const git_index_entry *theirs, const git_merge_file_options *opts", - "sig": "git_merge_file_result *::git_repository *::const git_index_entry *::const git_index_entry *::const git_index_entry *::const git_merge_file_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two files as they exist in the index, using the given common\n ancestor as the baseline, producing a git_merge_file_result that\n reflects the merge result. The git_merge_file_result must be freed with\n git_merge_file_result_free.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_file_result_free": { - "type": "function", - "file": "git2/merge.h", - "line": 551, - "lineto": 551, - "args": [ - { - "name": "result", - "type": "git_merge_file_result *", - "comment": "The result to free or `NULL`" - } - ], - "argline": "git_merge_file_result *result", - "sig": "git_merge_file_result *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees a git_merge_file_result.

\n", - "comments": "", - "group": "merge" - }, - "git_merge_trees": { - "type": "function", - "file": "git2/merge.h", - "line": 569, - "lineto": 575, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given trees" - }, - { - "name": "ancestor_tree", - "type": "const git_tree *", - "comment": "the common ancestor between the trees (or null if none)" - }, - { - "name": "our_tree", - "type": "const git_tree *", - "comment": "the tree that reflects the destination tree" - }, - { - "name": "their_tree", - "type": "const git_tree *", - "comment": "the tree to merge in to `our_tree`" - }, - { - "name": "opts", - "type": "const git_merge_options *", - "comment": "the merge tree options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, const git_tree *ancestor_tree, const git_tree *our_tree, const git_tree *their_tree, const git_merge_options *opts", - "sig": "git_index **::git_repository *::const git_tree *::const git_tree *::const git_tree *::const git_merge_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two trees, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "merge" - }, - "git_merge_commits": { - "type": "function", - "file": "git2/merge.h", - "line": 592, - "lineto": 597, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository that contains the given trees" - }, - { - "name": "our_commit", - "type": "const git_commit *", - "comment": "the commit that reflects the destination tree" - }, - { - "name": "their_commit", - "type": "const git_commit *", - "comment": "the commit to merge in to `our_commit`" - }, - { - "name": "opts", - "type": "const git_merge_options *", - "comment": "the merge tree options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, const git_commit *our_commit, const git_commit *their_commit, const git_merge_options *opts", - "sig": "git_index **::git_repository *::const git_commit *::const git_commit *::const git_merge_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merge two commits, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "merge" - }, - "git_merge": { - "type": "function", - "file": "git2/merge.h", - "line": 617, - "lineto": 622, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to merge" - }, - { - "name": "their_heads", - "type": "const git_annotated_commit **", - "comment": "the heads to merge into" - }, - { - "name": "their_heads_len", - "type": "size_t", - "comment": "the number of heads to merge" - }, - { - "name": "merge_opts", - "type": "const git_merge_options *", - "comment": "merge options" - }, - { - "name": "checkout_opts", - "type": "const git_checkout_options *", - "comment": "checkout options" - } - ], - "argline": "git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len, const git_merge_options *merge_opts, const git_checkout_options *checkout_opts", - "sig": "git_repository *::const git_annotated_commit **::size_t::const git_merge_options *::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", - "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the user wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", - "group": "merge", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_merge-16" - ] - } - }, - "git_message_prettify": { - "type": "function", - "file": "git2/message.h", - "line": 38, - "lineto": 38, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The user-allocated git_buf which will be filled with the\n cleaned up message." - }, - { - "name": "message", - "type": "const char *", - "comment": "The message to be prettified." - }, - { - "name": "strip_comments", - "type": "int", - "comment": "Non-zero to remove comment lines, 0 to leave them in." - }, - { - "name": "comment_char", - "type": "char", - "comment": "Comment character. Lines starting with this character\n are considered to be comments and removed if `strip_comments` is non-zero." - } - ], - "argline": "git_buf *out, const char *message, int strip_comments, char comment_char", - "sig": "git_buf *::const char *::int::char", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Clean up excess whitespace and make sure there is a trailing newline in the message.

\n", - "comments": "

Optionally, it can remove lines which start with the comment character.

\n", - "group": "message" - }, - "git_message_trailers": { - "type": "function", - "file": "git2/message.h", - "line": 73, - "lineto": 73, - "args": [ - { - "name": "arr", - "type": "git_message_trailer_array *", - "comment": "A pre-allocated git_message_trailer_array struct to be filled in\n with any trailers found during parsing." - }, - { - "name": "message", - "type": "const char *", - "comment": "The message to be parsed" - } - ], - "argline": "git_message_trailer_array *arr, const char *message", - "sig": "git_message_trailer_array *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or non-zero on error." - }, - "description": "

Parse trailers out of a message, filling the array pointed to by +arr+.

\n", - "comments": "

Trailers are key/value pairs in the last paragraph of a message, not including any patches or conflicts that may be present.

\n", - "group": "message" - }, - "git_message_trailer_array_free": { - "type": "function", - "file": "git2/message.h", - "line": 81, - "lineto": 81, - "args": [ - { - "name": "arr", - "type": "git_message_trailer_array *", - "comment": "The trailer to free." - } - ], - "argline": "git_message_trailer_array *arr", - "sig": "git_message_trailer_array *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Clean's up any allocated memory in the git_message_trailer_array filled by\n a call to git_message_trailers.

\n", - "comments": "", - "group": "message" - }, - "git_note_iterator_new": { - "type": "function", - "file": "git2/notes.h", - "line": 49, - "lineto": 52, - "args": [ - { - "name": "out", - "type": "git_note_iterator **", - "comment": "pointer to the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" - } - ], - "argline": "git_note_iterator **out, git_repository *repo, const char *notes_ref", - "sig": "git_note_iterator **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Creates a new iterator for notes

\n", - "comments": "

The iterator must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_commit_iterator_new": { - "type": "function", - "file": "git2/notes.h", - "line": 64, - "lineto": 66, - "args": [ - { - "name": "out", - "type": "git_note_iterator **", - "comment": "pointer to the iterator" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - } - ], - "argline": "git_note_iterator **out, git_commit *notes_commit", - "sig": "git_note_iterator **::git_commit *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Creates a new iterator for notes from a commit

\n", - "comments": "

The iterator must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_iterator_free": { - "type": "function", - "file": "git2/notes.h", - "line": 73, - "lineto": 73, - "args": [ - { - "name": "it", - "type": "git_note_iterator *", - "comment": "pointer to the iterator" - } - ], - "argline": "git_note_iterator *it", - "sig": "git_note_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees an git_note_iterator

\n", - "comments": "", - "group": "note" - }, - "git_note_next": { - "type": "function", - "file": "git2/notes.h", - "line": 86, - "lineto": 89, - "args": [ - { - "name": "note_id", - "type": "git_oid *", - "comment": "id of blob containing the message" - }, - { - "name": "annotated_id", - "type": "git_oid *", - "comment": "id of the git object being annotated" - }, - { - "name": "it", - "type": "git_note_iterator *", - "comment": "pointer to the iterator" - } - ], - "argline": "git_oid *note_id, git_oid *annotated_id, git_note_iterator *it", - "sig": "git_oid *::git_oid *::git_note_iterator *", - "return": { - "type": "int", - "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" - }, - "description": "

Return the current item (note_id and annotated_id) and advance the iterator\n internally to the next value

\n", - "comments": "", - "group": "note" - }, - "git_note_read": { - "type": "function", - "file": "git2/notes.h", - "line": 105, - "lineto": 109, - "args": [ - { - "name": "out", - "type": "git_note **", - "comment": "pointer to the read note; NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to read the note from" - } - ], - "argline": "git_note **out, git_repository *repo, const char *notes_ref, const git_oid *oid", - "sig": "git_note **::git_repository *::const char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the note for an object

\n", - "comments": "

The note must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_commit_read": { - "type": "function", - "file": "git2/notes.h", - "line": 124, - "lineto": 128, - "args": [ - { - "name": "out", - "type": "git_note **", - "comment": "pointer to the read note; NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to read the note from" - } - ], - "argline": "git_note **out, git_repository *repo, git_commit *notes_commit, const git_oid *oid", - "sig": "git_note **::git_repository *::git_commit *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the note for an object from a note commit

\n", - "comments": "

The note must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_author": { - "type": "function", - "file": "git2/notes.h", - "line": 136, - "lineto": 136, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_signature *", - "comment": " the author" - }, - "description": "

Get the note author

\n", - "comments": "", - "group": "note" - }, - "git_note_committer": { - "type": "function", - "file": "git2/notes.h", - "line": 144, - "lineto": 144, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_signature *", - "comment": " the committer" - }, - "description": "

Get the note committer

\n", - "comments": "", - "group": "note" - }, - "git_note_message": { - "type": "function", - "file": "git2/notes.h", - "line": 153, - "lineto": 153, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const char *", - "comment": " the note message" - }, - "description": "

Get the note message

\n", - "comments": "", - "group": "note" - }, - "git_note_id": { - "type": "function", - "file": "git2/notes.h", - "line": 162, - "lineto": 162, - "args": [ - { - "name": "note", - "type": "const git_note *", - "comment": "the note" - } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_oid *", - "comment": " the note object's id" - }, - "description": "

Get the note object's id

\n", - "comments": "", - "group": "note" - }, - "git_note_create": { - "type": "function", - "file": "git2/notes.h", - "line": 179, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer to store the OID (optional); NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to store the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to decorate" - }, - { - "name": "note", - "type": "const char *", - "comment": "Content of the note to add for object oid" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing note" - } - ], - "argline": "git_oid *out, git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int force", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_commit_create": { - "type": "function", - "file": "git2/notes.h", - "line": 209, - "lineto": 218, - "args": [ - { - "name": "notes_commit_out", - "type": "git_oid *", - "comment": "pointer to store the commit (optional);\n\t\t\t\t\tNULL in case of error" - }, - { - "name": "notes_blob_out", - "type": "git_oid *", - "comment": "a point to the id of a note blob (optional)" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note will live" - }, - { - "name": "parent", - "type": "git_commit *", - "comment": "Pointer to parent note\n\t\t\t\t\tor NULL if this shall start a new notes tree" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to decorate" - }, - { - "name": "note", - "type": "const char *", - "comment": "Content of the note to add for object oid" - }, - { - "name": "allow_note_overwrite", - "type": "int", - "comment": "Overwrite existing note" - } - ], - "argline": "git_oid *notes_commit_out, git_oid *notes_blob_out, git_repository *repo, git_commit *parent, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int allow_note_overwrite", - "sig": "git_oid *::git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *::const char *::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a note for an object from a commit

\n", - "comments": "

This function will create a notes commit for a given object, the commit is a dangling commit, no reference is created.

\n", - "group": "note" - }, - "git_note_remove": { - "type": "function", - "file": "git2/notes.h", - "line": 232, - "lineto": 237, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note lives" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to remove the note from" - } - ], - "argline": "git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid", - "sig": "git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove the note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_commit_remove": { - "type": "function", - "file": "git2/notes.h", - "line": 257, - "lineto": 263, - "args": [ - { - "name": "notes_commit_out", - "type": "git_oid *", - "comment": "pointer to store the new notes commit (optional);\n\t\t\t\t\tNULL in case of error.\n\t\t\t\t\tWhen removing a note a new tree containing all notes\n\t\t\t\t\tsans the note to be removed is created and a new commit\n\t\t\t\t\tpointing to that tree is also created.\n\t\t\t\t\tIn the case where the resulting tree is an empty tree\n\t\t\t\t\ta new commit pointing to this empty tree will be returned." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note lives" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to remove the note from" - } - ], - "argline": "git_oid *notes_commit_out, git_repository *repo, git_commit *notes_commit, const git_signature *author, const git_signature *committer, const git_oid *oid", - "sig": "git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove the note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_free": { - "type": "function", - "file": "git2/notes.h", - "line": 270, - "lineto": 270, - "args": [ - { - "name": "note", - "type": "git_note *", - "comment": "git_note object" - } - ], - "argline": "git_note *note", - "sig": "git_note *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a git_note object

\n", - "comments": "", - "group": "note" - }, - "git_note_default_ref": { - "type": "function", - "file": "git2/notes.h", - "line": 280, - "lineto": 280, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer in which to store the name of the default notes reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The Git repository" - } - ], - "argline": "git_buf *out, git_repository *repo", - "sig": "git_buf *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the default notes reference for a repository

\n", - "comments": "", - "group": "note" - }, - "git_note_foreach": { - "type": "function", - "file": "git2/notes.h", - "line": 298, - "lineto": 302, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the notes." - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "Reference to read from (optional); defaults to\n \"refs/notes/commits\"." - }, - { - "name": "note_cb", - "type": "git_note_foreach_cb", - "comment": "Callback to invoke per found annotation. Return non-zero\n to stop looping." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra parameter to callback function." - } - ], - "argline": "git_repository *repo, const char *notes_ref, git_note_foreach_cb note_cb, void *payload", - "sig": "git_repository *::const char *::git_note_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all the notes within a specified namespace\n and issue a callback for each one.

\n", - "comments": "", - "group": "note" - }, - "git_object_lookup": { - "type": "function", - "file": "git2/object.h", - "line": 44, - "lineto": 48, - "args": [ - { - "name": "object", - "type": "git_object **", - "comment": "pointer to the looked-up object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the object" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the unique identifier for the object" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "the type of the object" - } - ], - "argline": "git_object **object, git_repository *repo, const git_oid *id, git_object_t type", - "sig": "git_object **::git_repository *::const git_oid *::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a reference to one of the objects in a repository.

\n", - "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", - "group": "object", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_object_lookup-32" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_object_lookup-17" - ] - } - }, - "git_object_lookup_prefix": { - "type": "function", - "file": "git2/object.h", - "line": 77, - "lineto": 82, - "args": [ - { - "name": "object_out", - "type": "git_object **", - "comment": "pointer where to store the looked-up object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the object" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "a short identifier for the object" - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "the type of the object" - } - ], - "argline": "git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_object_t type", - "sig": "git_object **::git_repository *::const git_oid *::size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", - "group": "object" - }, - "git_object_lookup_bypath": { - "type": "function", - "file": "git2/object.h", - "line": 95, - "lineto": 99, - "args": [ - { - "name": "out", - "type": "git_object **", - "comment": "buffer that receives a pointer to the object (which must be freed\n by the caller)" - }, - { - "name": "treeish", - "type": "const git_object *", - "comment": "root object that can be peeled to a tree" - }, - { - "name": "path", - "type": "const char *", - "comment": "relative path from the root object to the desired object" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "type of object desired" - } - ], - "argline": "git_object **out, const git_object *treeish, const char *path, git_object_t type", - "sig": "git_object **::const git_object *::const char *::git_object_t", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Lookup an object that represents a tree entry.

\n", - "comments": "", - "group": "object" - }, - "git_object_id": { - "type": "function", - "file": "git2/object.h", - "line": 107, - "lineto": 107, - "args": [ - { - "name": "obj", - "type": "const git_object *", - "comment": "the repository object" - } - ], - "argline": "const git_object *obj", - "sig": "const git_object *", - "return": { - "type": "const git_oid *", - "comment": " the SHA1 id" - }, - "description": "

Get the id (SHA1) of a repository object

\n", - "comments": "", - "group": "object", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_object_id-8", - "ex/v1.7.2/blame.html#git_object_id-9", - "ex/v1.7.2/blame.html#git_object_id-10", - "ex/v1.7.2/blame.html#git_object_id-11" - ], - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_object_id-10", - "ex/v1.7.2/cat-file.html#git_object_id-11" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_object_id-33", - "ex/v1.7.2/log.html#git_object_id-34", - "ex/v1.7.2/log.html#git_object_id-35", - "ex/v1.7.2/log.html#git_object_id-36" - ], - "rev-parse.c": [ - "ex/v1.7.2/rev-parse.html#git_object_id-2", - "ex/v1.7.2/rev-parse.html#git_object_id-3", - "ex/v1.7.2/rev-parse.html#git_object_id-4", - "ex/v1.7.2/rev-parse.html#git_object_id-5", - "ex/v1.7.2/rev-parse.html#git_object_id-6" - ] - } - }, - "git_object_short_id": { - "type": "function", - "file": "git2/object.h", - "line": 121, - "lineto": 121, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Buffer to write string into" - }, - { - "name": "obj", - "type": "const git_object *", - "comment": "The object to get an ID for" - } - ], - "argline": "git_buf *out, const git_object *obj", - "sig": "git_buf *::const git_object *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 for error" - }, - "description": "

Get a short abbreviated OID string for the object

\n", - "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", - "group": "object", - "examples": { - "tag.c": [ - "ex/v1.7.2/tag.html#git_object_short_id-3" - ] - } - }, - "git_object_type": { - "type": "function", - "file": "git2/object.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "obj", - "type": "const git_object *", - "comment": "the repository object" - } - ], - "argline": "const git_object *obj", - "sig": "const git_object *", - "return": { - "type": "git_object_t", - "comment": " the object's type" - }, - "description": "

Get the object type of an object

\n", - "comments": "", - "group": "object", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_object_type-12", - "ex/v1.7.2/cat-file.html#git_object_type-13", - "ex/v1.7.2/cat-file.html#git_object_type-14" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_object_type-4" - ] - } - }, - "git_object_owner": { - "type": "function", - "file": "git2/object.h", - "line": 143, - "lineto": 143, - "args": [ - { - "name": "obj", - "type": "const git_object *", - "comment": "the object" - } - ], - "argline": "const git_object *obj", - "sig": "const git_object *", - "return": { - "type": "git_repository *", - "comment": " the repository who owns this object" - }, - "description": "

Get the repository that owns this object

\n", - "comments": "

Freeing or calling git_repository_close on the returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without affecting the object.

\n", - "group": "object" - }, - "git_object_free": { - "type": "function", - "file": "git2/object.h", - "line": 160, - "lineto": 160, - "args": [ - { - "name": "object", - "type": "git_object *", - "comment": "the object to close" - } - ], - "argline": "git_object *object", - "sig": "git_object *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open object

\n", - "comments": "

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 aggressive is the caching mechanism used by the repository.

\n\n

IMPORTANT: It is necessary to call this method when you stop using an object. Failure to do so will cause a memory leak.

\n", - "group": "object", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_object_free-12", - "ex/v1.7.2/blame.html#git_object_free-13", - "ex/v1.7.2/blame.html#git_object_free-14", - "ex/v1.7.2/blame.html#git_object_free-15" - ], - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_object_free-15" - ], - "commit.c": [ - "ex/v1.7.2/commit.html#git_object_free-6" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_object_free-38" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_object_free-37" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_object_free-18" - ], - "rev-parse.c": [ - "ex/v1.7.2/rev-parse.html#git_object_free-7", - "ex/v1.7.2/rev-parse.html#git_object_free-8", - "ex/v1.7.2/rev-parse.html#git_object_free-9" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_object_free-5", - "ex/v1.7.2/tag.html#git_object_free-6", - "ex/v1.7.2/tag.html#git_object_free-7", - "ex/v1.7.2/tag.html#git_object_free-8" - ] - } - }, - "git_object_type2string": { - "type": "function", - "file": "git2/object.h", - "line": 171, - "lineto": 171, - "args": [ - { - "name": "type", - "type": "git_object_t", - "comment": "object type to convert." - } - ], - "argline": "git_object_t type", - "sig": "git_object_t", - "return": { - "type": "const char *", - "comment": " the corresponding string representation." - }, - "description": "

Convert an object type to its string representation.

\n", - "comments": "

The result is a pointer to a string in static memory and should not be free()'ed.

\n", - "group": "object", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_object_type2string-16", - "ex/v1.7.2/cat-file.html#git_object_type2string-17", - "ex/v1.7.2/cat-file.html#git_object_type2string-18", - "ex/v1.7.2/cat-file.html#git_object_type2string-19" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_object_type2string-39", - "ex/v1.7.2/general.html#git_object_type2string-40" - ] - } - }, - "git_object_string2type": { - "type": "function", - "file": "git2/object.h", - "line": 179, - "lineto": 179, - "args": [ - { - "name": "str", - "type": "const char *", - "comment": "the string to convert." - } - ], - "argline": "const char *str", - "sig": "const char *", - "return": { - "type": "git_object_t", - "comment": " the corresponding git_object_t." - }, - "description": "

Convert a string object type representation to it's git_object_t.

\n", - "comments": "", - "group": "object" - }, - "git_object_typeisloose": { - "type": "function", - "file": "git2/object.h", - "line": 188, - "lineto": 188, - "args": [ - { - "name": "type", - "type": "git_object_t", - "comment": "object type to test." - } - ], - "argline": "git_object_t type", - "sig": "git_object_t", - "return": { - "type": "int", - "comment": " true if the type represents a valid loose object type,\n false otherwise." - }, - "description": "

Determine if the given git_object_t is a valid loose object type.

\n", - "comments": "", - "group": "object" - }, - "git_object_peel": { - "type": "function", - "file": "git2/object.h", - "line": 213, - "lineto": 216, - "args": [ - { - "name": "peeled", - "type": "git_object **", - "comment": "Pointer to the peeled git_object" - }, - { - "name": "object", - "type": "const git_object *", - "comment": "The object to be processed" - }, - { - "name": "target_type", - "type": "git_object_t", - "comment": "The type of the requested object (a GIT_OBJECT_ value)" - } - ], - "argline": "git_object **peeled, const git_object *object, git_object_t target_type", - "sig": "git_object **::const git_object *::git_object_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" - }, - "description": "

Recursively peel an object until an object of the specified type is met.

\n", - "comments": "

If the query cannot be satisfied due to the object model, GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until the type changes. A tag will be peeled until the referenced object is no longer a tag, and a commit will be peeled to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to the target type due to the object model, GIT_EPEEL will be returned.

\n\n

You must free the returned object.

\n", - "group": "object" - }, - "git_object_dup": { - "type": "function", - "file": "git2/object.h", - "line": 226, - "lineto": 226, - "args": [ - { - "name": "dest", - "type": "git_object **", - "comment": "Pointer to store the copy of the object" - }, - { - "name": "source", - "type": "git_object *", - "comment": "Original object to copy" - } - ], - "argline": "git_object **dest, git_object *source", - "sig": "git_object **::git_object *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an in-memory copy of a Git object. The copy must be\n explicitly free'd or it will leak.

\n", - "comments": "", - "group": "object" - }, - "git_object_rawcontent_is_valid": { - "type": "function", - "file": "git2/object.h", - "line": 269, - "lineto": 273, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "Output pointer to set with validity of the object content" - }, - { - "name": "buf", - "type": "const char *", - "comment": "The contents to validate" - }, - { - "name": "len", - "type": "size_t", - "comment": "The length of the buffer" - }, - { - "name": "object_type", - "type": "git_object_t", - "comment": "The type of the object in the buffer" - } - ], - "argline": "int *valid, const char *buf, size_t len, git_object_t object_type", - "sig": "int *::const char *::size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Analyzes a buffer of raw object content and determines its validity.\n Tree, commit, and tag objects will be parsed and ensured that they\n are valid, parseable content. (Blobs are always valid by definition.)\n An error message will be set with an informative message if the object\n is not valid.

\n", - "comments": "", - "group": "object" - }, - "git_odb_add_disk_alternate": { - "type": "function", - "file": "git2/odb.h", - "line": 118, - "lineto": 118, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "database to add the backend to" - }, - { - "name": "path", - "type": "const char *", - "comment": "path to the objects folder for the alternate" - } - ], - "argline": "git_odb *odb, const char *path", - "sig": "git_odb *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Add an on-disk alternate to an existing Object DB.

\n", - "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", - "group": "odb" - }, - "git_odb_free": { - "type": "function", - "file": "git2/odb.h", - "line": 125, - "lineto": 125, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "database pointer to close. If NULL no action is taken." - } - ], - "argline": "git_odb *db", - "sig": "git_odb *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open object database.

\n", - "comments": "", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_odb_free-20" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_odb_free-41" - ] - } - }, - "git_odb_read": { - "type": "function", - "file": "git2/odb.h", - "line": 143, - "lineto": 143, - "args": [ - { - "name": "out", - "type": "git_odb_object **", - "comment": "pointer where to store the read object" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "database to search for the object in." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the object to read." - } - ], - "argline": "git_odb_object **out, git_odb *db, const git_oid *id", - "sig": "git_odb_object **::git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is\n not in the database." - }, - "description": "

Read an object from the database.

\n", - "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_odb_read-21" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_odb_read-42" - ] - } - }, - "git_odb_read_prefix": { - "type": "function", - "file": "git2/odb.h", - "line": 171, - "lineto": 171, - "args": [ - { - "name": "out", - "type": "git_odb_object **", - "comment": "pointer where to store the read object" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "database to search for the object in." - }, - { - "name": "short_id", - "type": "const git_oid *", - "comment": "a prefix of the id of the object to read." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the prefix" - } - ], - "argline": "git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len", - "sig": "git_odb_object **::git_odb *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not in the\n database. GIT_EAMBIGUOUS if the prefix is ambiguous\n (several objects match the prefix)" - }, - "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", - "comments": "

This method queries all available ODB backends trying to match the 'len' first hexadecimal characters of the 'short_id'. The remaining (GIT_OID_SHA1_HEXSIZE-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.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", - "group": "odb" - }, - "git_odb_read_header": { - "type": "function", - "file": "git2/odb.h", - "line": 190, - "lineto": 190, - "args": [ - { - "name": "len_out", - "type": "size_t *", - "comment": "pointer where to store the length" - }, - { - "name": "type_out", - "type": "git_object_t *", - "comment": "pointer where to store the type" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "database to search for the object in." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the object to read." - } - ], - "argline": "size_t *len_out, git_object_t *type_out, git_odb *db, const git_oid *id", - "sig": "size_t *::git_object_t *::git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not\n in the database." - }, - "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", - "comments": "

The header includes the length and the type of an object.

\n\n

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.

\n", - "group": "odb" - }, - "git_odb_exists": { - "type": "function", - "file": "git2/odb.h", - "line": 199, - "lineto": 199, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "database to be searched for the given object." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the object to search for." - } - ], - "argline": "git_odb *db, const git_oid *id", - "sig": "git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 1 if the object was found, 0 otherwise" - }, - "description": "

Determine if the given object can be found in the object database.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_exists_ext": { - "type": "function", - "file": "git2/odb.h", - "line": 210, - "lineto": 210, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "database to be searched for the given object." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the object to search for." - }, - { - "name": "flags", - "type": "unsigned int", - "comment": "flags affecting the lookup (see `git_odb_lookup_flags_t`)" - } - ], - "argline": "git_odb *db, const git_oid *id, unsigned int flags", - "sig": "git_odb *::const git_oid *::unsigned int", - "return": { - "type": "int", - "comment": " 1 if the object was found, 0 otherwise" - }, - "description": "

Determine if the given object can be found in the object database, with\n extended options.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_exists_prefix": { - "type": "function", - "file": "git2/odb.h", - "line": 223, - "lineto": 224, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "The full OID of the found object if just one is found." - }, - { - "name": "db", - "type": "git_odb *", - "comment": "The database to be searched for the given object." - }, - { - "name": "short_id", - "type": "const git_oid *", - "comment": "A prefix of the id of the object to read." - }, - { - "name": "len", - "type": "size_t", - "comment": "The length of the prefix." - } - ], - "argline": "git_oid *out, git_odb *db, const git_oid *short_id, size_t len", - "sig": "git_oid *::git_odb *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 if found, GIT_ENOTFOUND if not found, GIT_EAMBIGUOUS if multiple\n matches were found, other value \n<\n 0 if there was a read error." - }, - "description": "

Determine if an object can be found in the object database by an\n abbreviated object ID.

\n", - "comments": "", - "group": "odb" - }, - "git_odb_expand_ids": { - "type": "function", - "file": "git2/odb.h", - "line": 266, - "lineto": 269, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "The database to be searched for the given objects." - }, - { - "name": "ids", - "type": "git_odb_expand_id *", - "comment": "An array of short object IDs to search for" - }, - { - "name": "count", - "type": "size_t", - "comment": "The length of the `ids` array" - } - ], - "argline": "git_odb *db, git_odb_expand_id *ids, size_t count", - "sig": "git_odb *::git_odb_expand_id *::size_t", - "return": { - "type": "int", - "comment": " 0 on success or an error code on failure" - }, - "description": "

Determine if one or more objects can be found in the object database\n by their abbreviated object ID and type.

\n", - "comments": "

The given array will be updated in place: for each abbreviated ID that is unique in the database, and of the given type (if specified), the full object ID, object ID length (GIT_OID_SHA1_HEXSIZE) and type will be written back to the array. For IDs that are not found (or are ambiguous), the array entry will be zeroed.

\n\n

Note that since this function operates on multiple objects, the underlying database will not be asked to be reloaded if an object is not found (which is unlike other object database operations.)

\n", - "group": "odb" - }, - "git_odb_refresh": { - "type": "function", - "file": "git2/odb.h", - "line": 289, - "lineto": 289, - "args": [ - { - "name": "db", - "type": "struct git_odb *", - "comment": "database to refresh" - } - ], - "argline": "struct git_odb *db", - "sig": "struct git_odb *", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Refresh the object database to load newly added files.

\n", - "comments": "

If the object databases have changed on disk while the library is running, this function will force a reload of the underlying indexes.

\n\n

Use this function when you're confident that an external application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The library will automatically attempt to refresh the ODB when a lookup fails, to see if the looked up object exists on disk but hasn't been loaded yet.

\n", - "group": "odb" - }, - "git_odb_foreach": { - "type": "function", - "file": "git2/odb.h", - "line": 304, - "lineto": 304, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "database to use" - }, - { - "name": "cb", - "type": "git_odb_foreach_cb", - "comment": "the callback to call for each object" - }, - { - "name": "payload", - "type": "void *", - "comment": "data to pass to the callback" - } - ], - "argline": "git_odb *db, git_odb_foreach_cb cb, void *payload", - "sig": "git_odb *::git_odb_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

List all objects available in the database

\n", - "comments": "

The callback will be called for each object available in the database. Note that the objects are likely to be returned in the index order, which would make accessing the objects in that order inefficient. Return a non-zero value from the callback to stop looping.

\n", - "group": "odb" - }, - "git_odb_write": { - "type": "function", - "file": "git2/odb.h", - "line": 324, - "lineto": 324, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer to store the OID result of the write" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "object database where to store the object" - }, - { - "name": "data", - "type": "const void *", - "comment": "buffer with the data to store" - }, - { - "name": "len", - "type": "size_t", - "comment": "size of the buffer" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "type of the data to store" - } - ], - "argline": "git_oid *out, git_odb *odb, const void *data, size_t len, git_object_t type", - "sig": "git_oid *::git_odb *::const void *::size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an object directly into the ODB

\n", - "comments": "

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.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", - "group": "odb", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_odb_write-43" - ] - } - }, - "git_odb_open_wstream": { - "type": "function", - "file": "git2/odb.h", - "line": 347, - "lineto": 347, - "args": [ - { - "name": "out", - "type": "git_odb_stream **", - "comment": "pointer where to store the stream" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the stream will write" - }, - { - "name": "size", - "type": "git_object_size_t", - "comment": "final size of the object that will be written" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "type of the object that will be written" - } - ], - "argline": "git_odb_stream **out, git_odb *db, git_object_size_t size, git_object_t type", - "sig": "git_odb_stream **::git_odb *::git_object_size_t::git_object_t", - "return": { - "type": "int", - "comment": " 0 if the stream was created; error code otherwise" - }, - "description": "

Open a stream to write an object into the ODB

\n", - "comments": "

The type and final length of the object must be specified when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it won't be effective until git_odb_stream_finalize_write is called and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or will leak memory.

\n", - "group": "odb" - }, - "git_odb_stream_write": { - "type": "function", - "file": "git2/odb.h", - "line": 360, - "lineto": 360, - "args": [ - { - "name": "stream", - "type": "git_odb_stream *", - "comment": "the stream" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "the data to write" - }, - { - "name": "len", - "type": "size_t", - "comment": "the buffer's length" - } - ], - "argline": "git_odb_stream *stream, const char *buffer, size_t len", - "sig": "git_odb_stream *::const char *::size_t", - "return": { - "type": "int", - "comment": " 0 if the write succeeded, error code otherwise" - }, - "description": "

Write to an odb stream

\n", - "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", - "group": "odb" - }, - "git_odb_stream_finalize_write": { - "type": "function", - "file": "git2/odb.h", - "line": 375, - "lineto": 375, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer to store the resulting object's id" - }, - { - "name": "stream", - "type": "git_odb_stream *", - "comment": "the stream" - } - ], - "argline": "git_oid *out, git_odb_stream *stream", - "sig": "git_oid *::git_odb_stream *", - "return": { - "type": "int", - "comment": " 0 on success, an error code otherwise" - }, - "description": "

Finish writing to an odb stream

\n", - "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", - "group": "odb" - }, - "git_odb_stream_read": { - "type": "function", - "file": "git2/odb.h", - "line": 387, - "lineto": 387, - "args": [ - { - "name": "stream", - "type": "git_odb_stream *", - "comment": "the stream" - }, - { - "name": "buffer", - "type": "char *", - "comment": "a user-allocated buffer to store the data in." - }, - { - "name": "len", - "type": "size_t", - "comment": "the buffer's length" - } - ], - "argline": "git_odb_stream *stream, char *buffer, size_t len", - "sig": "git_odb_stream *::char *::size_t", - "return": { - "type": "int", - "comment": " 0 if the read succeeded, error code otherwise" - }, - "description": "

Read from an odb stream

\n", - "comments": "

Most backends don't implement streaming reads

\n", - "group": "odb" - }, - "git_odb_stream_free": { - "type": "function", - "file": "git2/odb.h", - "line": 394, - "lineto": 394, - "args": [ - { - "name": "stream", - "type": "git_odb_stream *", - "comment": "the stream to free" - } - ], - "argline": "git_odb_stream *stream", - "sig": "git_odb_stream *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an odb stream

\n", - "comments": "", - "group": "odb" - }, - "git_odb_open_rstream": { - "type": "function", - "file": "git2/odb.h", - "line": 422, - "lineto": 427, - "args": [ - { - "name": "out", - "type": "git_odb_stream **", - "comment": "pointer where to store the stream" - }, - { - "name": "len", - "type": "size_t *", - "comment": "pointer where to store the length of the object" - }, - { - "name": "type", - "type": "git_object_t *", - "comment": "pointer where to store the type of the object" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the stream will read from" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "oid of the object the stream will read from" - } - ], - "argline": "git_odb_stream **out, size_t *len, git_object_t *type, git_odb *db, const git_oid *oid", - "sig": "git_odb_stream **::size_t *::git_object_t *::git_odb *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 if the stream was created, error code otherwise" - }, - "description": "

Open a stream to read an object from the ODB

\n", - "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", - "group": "odb" - }, - "git_odb_write_pack": { - "type": "function", - "file": "git2/odb.h", - "line": 448, - "lineto": 452, - "args": [ - { - "name": "out", - "type": "git_odb_writepack **", - "comment": "pointer to the writepack functions" - }, - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the stream will read from" - }, - { - "name": "progress_cb", - "type": "git_indexer_progress_cb", - "comment": "function to call with progress information.\n Be aware that this is called inline with network and indexing operations,\n so performance may be affected." - }, - { - "name": "progress_payload", - "type": "void *", - "comment": "payload for the progress callback" - } - ], - "argline": "git_odb_writepack **out, git_odb *db, git_indexer_progress_cb progress_cb, void *progress_payload", - "sig": "git_odb_writepack **::git_odb *::git_indexer_progress_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Open a stream for writing a pack file to the ODB.

\n", - "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", - "group": "odb" - }, - "git_odb_write_multi_pack_index": { - "type": "function", - "file": "git2/odb.h", - "line": 466, - "lineto": 467, - "args": [ - { - "name": "db", - "type": "git_odb *", - "comment": "object database where the `multi-pack-index` file will be written." - } - ], - "argline": "git_odb *db", - "sig": "git_odb *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Write a multi-pack-index file from all the .pack files in the ODB.

\n", - "comments": "

If the ODB layer understands pack files, then this will create a file called multi-pack-index next to the .pack and .idx files, which will contain an index of all objects stored in .pack files. This will allow for O(log n) lookup for n objects (regardless of how many packfiles there exist).

\n", - "group": "odb" - }, - "git_odb_object_dup": { - "type": "function", - "file": "git2/odb.h", - "line": 529, - "lineto": 529, - "args": [ - { - "name": "dest", - "type": "git_odb_object **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "git_odb_object *", - "comment": "object to copy" - } - ], - "argline": "git_odb_object **dest, git_odb_object *source", - "sig": "git_odb_object **::git_odb_object *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an odb_object

\n", - "comments": "

The returned copy must be manually freed with git_odb_object_free. Note that because of an implementation detail, the returned copy will be the same pointer as source: the object is internally refcounted, so the copy still needs to be freed twice.

\n", - "group": "odb" - }, - "git_odb_object_free": { - "type": "function", - "file": "git2/odb.h", - "line": 539, - "lineto": 539, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "object to close" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an ODB object

\n", - "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_odb_object_free-22" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_odb_object_free-44" - ] - } - }, - "git_odb_object_id": { - "type": "function", - "file": "git2/odb.h", - "line": 549, - "lineto": 549, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the OID" - }, - "description": "

Return the OID of an ODB object

\n", - "comments": "

This is the OID from which the object was read from

\n", - "group": "odb" - }, - "git_odb_object_data": { - "type": "function", - "file": "git2/odb.h", - "line": 562, - "lineto": 562, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "const void *", - "comment": " a pointer to the data" - }, - "description": "

Return the data of an ODB object

\n", - "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", - "group": "odb", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_odb_object_data-45" - ] - } - }, - "git_odb_object_size": { - "type": "function", - "file": "git2/odb.h", - "line": 573, - "lineto": 573, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "size_t", - "comment": " the size" - }, - "description": "

Return the size of an ODB object

\n", - "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", - "group": "odb", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_odb_object_size-23" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_odb_object_size-46" - ] - } - }, - "git_odb_object_type": { - "type": "function", - "file": "git2/odb.h", - "line": 581, - "lineto": 581, - "args": [ - { - "name": "object", - "type": "git_odb_object *", - "comment": "the object" - } - ], - "argline": "git_odb_object *object", - "sig": "git_odb_object *", - "return": { - "type": "git_object_t", - "comment": " the type" - }, - "description": "

Return the type of an ODB object

\n", - "comments": "", - "group": "odb", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_odb_object_type-47" - ] - } - }, - "git_odb_add_backend": { - "type": "function", - "file": "git2/odb.h", - "line": 596, - "lineto": 596, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "database to add the backend to" - }, - { - "name": "backend", - "type": "git_odb_backend *", - "comment": "pointer to a git_odb_backend instance" - }, - { - "name": "priority", - "type": "int", - "comment": "Value for ordering the backends queue" - } - ], - "argline": "git_odb *odb, git_odb_backend *backend, int priority", - "sig": "git_odb *::git_odb_backend *::int", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Add a custom backend to an existing Object DB

\n", - "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", - "group": "odb" - }, - "git_odb_add_alternate": { - "type": "function", - "file": "git2/odb.h", - "line": 617, - "lineto": 617, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "database to add the backend to" - }, - { - "name": "backend", - "type": "git_odb_backend *", - "comment": "pointer to a git_odb_backend instance" - }, - { - "name": "priority", - "type": "int", - "comment": "Value for ordering the backends queue" - } - ], - "argline": "git_odb *odb, git_odb_backend *backend, int priority", - "sig": "git_odb *::git_odb_backend *::int", - "return": { - "type": "int", - "comment": " 0 on success, error code otherwise" - }, - "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", - "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", - "group": "odb" - }, - "git_odb_num_backends": { - "type": "function", - "file": "git2/odb.h", - "line": 625, - "lineto": 625, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "object database" - } - ], - "argline": "git_odb *odb", - "sig": "git_odb *", - "return": { - "type": "size_t", - "comment": " number of backends in the ODB" - }, - "description": "

Get the number of ODB backend objects

\n", - "comments": "", - "group": "odb" - }, - "git_odb_get_backend": { - "type": "function", - "file": "git2/odb.h", - "line": 635, - "lineto": 635, - "args": [ - { - "name": "out", - "type": "git_odb_backend **", - "comment": "output pointer to ODB backend at pos" - }, - { - "name": "odb", - "type": "git_odb *", - "comment": "object database" - }, - { - "name": "pos", - "type": "size_t", - "comment": "index into object database backend list" - } - ], - "argline": "git_odb_backend **out, git_odb *odb, size_t pos", - "sig": "git_odb_backend **::git_odb *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if pos is invalid, other errors \n<\n 0" - }, - "description": "

Lookup an ODB backend object by index

\n", - "comments": "", - "group": "odb" - }, - "git_odb_set_commit_graph": { - "type": "function", - "file": "git2/odb.h", - "line": 650, - "lineto": 650, - "args": [ - { - "name": "odb", - "type": "git_odb *", - "comment": "object database" - }, - { - "name": "cgraph", - "type": "git_commit_graph *", - "comment": "the git commit-graph" - } - ], - "argline": "git_odb *odb, git_commit_graph *cgraph", - "sig": "git_odb *::git_commit_graph *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Set the git commit-graph for the ODB.

\n", - "comments": "

After a successful call, the ownership of the cgraph parameter will be transferred to libgit2, and the caller should not free it.

\n\n

The commit-graph can also be unset by explicitly passing NULL as the cgraph parameter.

\n", - "group": "odb" - }, - "git_oid_fmt": { - "type": "function", - "file": "git2/oid.h", - "line": 188, - "lineto": 188, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes for SHA1,\n\t\t64 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it is\n\t\trequired." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure to format." - } - ], - "argline": "char *out, const git_oid *id", - "sig": "char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Format a git_oid into a hex string.

\n", - "comments": "", - "group": "oid", - "examples": { - "fetch.c": [ - "ex/v1.7.2/fetch.html#git_oid_fmt-1", - "ex/v1.7.2/fetch.html#git_oid_fmt-2" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_oid_fmt-48", - "ex/v1.7.2/general.html#git_oid_fmt-49", - "ex/v1.7.2/general.html#git_oid_fmt-50", - "ex/v1.7.2/general.html#git_oid_fmt-51", - "ex/v1.7.2/general.html#git_oid_fmt-52" - ], - "ls-remote.c": [ - "ex/v1.7.2/ls-remote.html#git_oid_fmt-1" - ] - } - }, - "git_oid_nfmt": { - "type": "function", - "file": "git2/oid.h", - "line": 200, - "lineto": 200, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "output hex string; you say how many bytes to write.\n\t\tIf the number of bytes is > GIT_OID_SHA1_HEXSIZE, extra bytes\n\t\twill be zeroed; if not, a '\n\\\n0' terminator is NOT added." - }, - { - "name": "n", - "type": "size_t", - "comment": "number of characters to write into out string" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure to format." - } - ], - "argline": "char *out, size_t n, const git_oid *id", - "sig": "char *::size_t::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Format a git_oid into a partial hex string.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_pathfmt": { - "type": "function", - "file": "git2/oid.h", - "line": 217, - "lineto": 217, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (41 bytes for SHA1,\n\t\t65 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it\n\t\tis required." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure to format." - } - ], - "argline": "char *out, const git_oid *id", - "sig": "char *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Format a git_oid into a loose-object path string.

\n", - "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", - "group": "oid" - }, - "git_oid_tostr_s": { - "type": "function", - "file": "git2/oid.h", - "line": 230, - "lineto": 230, - "args": [ - { - "name": "oid", - "type": "const git_oid *", - "comment": "The oid structure to format" - } - ], - "argline": "const git_oid *oid", - "sig": "const git_oid *", - "return": { - "type": "char *", - "comment": " the c-string or NULL on failure" - }, - "description": "

Format a git_oid into a statically allocated c-string.

\n", - "comments": "

The c-string is owned by the library and should not be freed by the user. If libgit2 is built with thread support, the string will be stored in TLS (i.e. one buffer per thread) to allow for concurrent calls of the function.

\n", - "group": "oid", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_oid_tostr_s-19", - "ex/v1.7.2/merge.html#git_oid_tostr_s-20" - ] - } - }, - "git_oid_tostr": { - "type": "function", - "file": "git2/oid.h", - "line": 251, - "lineto": 251, - "args": [ - { - "name": "out", - "type": "char *", - "comment": "the buffer into which the oid string is output." - }, - { - "name": "n", - "type": "size_t", - "comment": "the size of the out buffer." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the oid structure to format." - } - ], - "argline": "char *out, size_t n, const git_oid *id", - "sig": "char *::size_t::const git_oid *", - "return": { - "type": "char *", - "comment": " the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string." - }, - "description": "

Format a git_oid into a buffer as a hex format c-string.

\n", - "comments": "

If the buffer is smaller than the size of a hex-formatted oid string plus an additional byte (GIT_OID_SHA_HEXSIZE + 1 for SHA1 or GIT_OID_SHA256_HEXSIZE + 1 for SHA256), then the resulting oid c-string will be truncated to n-1 characters (but will still be NUL-byte terminated).

\n\n

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.

\n", - "group": "oid", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_oid_tostr-16", - "ex/v1.7.2/blame.html#git_oid_tostr-17" - ], - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_oid_tostr-24", - "ex/v1.7.2/cat-file.html#git_oid_tostr-25", - "ex/v1.7.2/cat-file.html#git_oid_tostr-26", - "ex/v1.7.2/cat-file.html#git_oid_tostr-27", - "ex/v1.7.2/cat-file.html#git_oid_tostr-28" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_oid_tostr-38", - "ex/v1.7.2/log.html#git_oid_tostr-39" - ], - "rev-parse.c": [ - "ex/v1.7.2/rev-parse.html#git_oid_tostr-10", - "ex/v1.7.2/rev-parse.html#git_oid_tostr-11", - "ex/v1.7.2/rev-parse.html#git_oid_tostr-12", - "ex/v1.7.2/rev-parse.html#git_oid_tostr-13" - ] - } - }, - "git_oid_cpy": { - "type": "function", - "file": "git2/oid.h", - "line": 260, - "lineto": 260, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "oid structure the result is written into." - }, - { - "name": "src", - "type": "const git_oid *", - "comment": "oid structure to copy from." - } - ], - "argline": "git_oid *out, const git_oid *src", - "sig": "git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Copy an oid from one structure to another.

\n", - "comments": "", - "group": "oid", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_oid_cpy-18", - "ex/v1.7.2/blame.html#git_oid_cpy-19", - "ex/v1.7.2/blame.html#git_oid_cpy-20" - ] - } - }, - "git_oid_cmp": { - "type": "function", - "file": "git2/oid.h", - "line": 269, - "lineto": 269, - "args": [ - { - "name": "a", - "type": "const git_oid *", - "comment": "first oid structure." - }, - { - "name": "b", - "type": "const git_oid *", - "comment": "second oid structure." - } - ], - "argline": "const git_oid *a, const git_oid *b", - "sig": "const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " \n<\n0, 0, >0 if a \n<\n b, a == b, a > b." - }, - "description": "

Compare two oid structures.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_equal": { - "type": "function", - "file": "git2/oid.h", - "line": 278, - "lineto": 278, - "args": [ - { - "name": "a", - "type": "const git_oid *", - "comment": "first oid structure." - }, - { - "name": "b", - "type": "const git_oid *", - "comment": "second oid structure." - } - ], - "argline": "const git_oid *a, const git_oid *b", - "sig": "const git_oid *::const git_oid *", - "return": { - "type": "int", - "comment": " true if equal, false otherwise" - }, - "description": "

Compare two oid structures for equality

\n", - "comments": "", - "group": "oid" - }, - "git_oid_ncmp": { - "type": "function", - "file": "git2/oid.h", - "line": 289, - "lineto": 289, - "args": [ - { - "name": "a", - "type": "const git_oid *", - "comment": "first oid structure." - }, - { - "name": "b", - "type": "const git_oid *", - "comment": "second oid structure." - }, - { - "name": "len", - "type": "size_t", - "comment": "the number of hex chars to compare" - } - ], - "argline": "const git_oid *a, const git_oid *b, size_t len", - "sig": "const git_oid *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 in case of a match" - }, - "description": "

Compare the first 'len' hexadecimal characters (packets of 4 bits)\n of two oid structures.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_streq": { - "type": "function", - "file": "git2/oid.h", - "line": 298, - "lineto": 298, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure." - }, - { - "name": "str", - "type": "const char *", - "comment": "input hex string of an object id." - } - ], - "argline": "const git_oid *id, const char *str", - "sig": "const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 in case of a match, -1 otherwise." - }, - "description": "

Check if an oid equals an hex formatted object id.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_strcmp": { - "type": "function", - "file": "git2/oid.h", - "line": 308, - "lineto": 308, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": "oid structure." - }, - { - "name": "str", - "type": "const char *", - "comment": "input hex string of an object id." - } - ], - "argline": "const git_oid *id, const char *str", - "sig": "const git_oid *::const char *", - "return": { - "type": "int", - "comment": " -1 if str is not valid, \n<\n0 if id sorts before str,\n 0 if id matches str, >0 if id sorts after str." - }, - "description": "

Compare an oid to an hex formatted object id.

\n", - "comments": "", - "group": "oid" - }, - "git_oid_is_zero": { - "type": "function", - "file": "git2/oid.h", - "line": 315, - "lineto": 315, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": null - } - ], - "argline": "const git_oid *id", - "sig": "const git_oid *", - "return": { - "type": "int", - "comment": " 1 if all zeros, 0 otherwise." - }, - "description": "

Check is an oid is all zeros.

\n", - "comments": "", - "group": "oid", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_oid_is_zero-21" - ], - "fetch.c": [ - "ex/v1.7.2/fetch.html#git_oid_is_zero-3" - ] - } - }, - "git_oid_shorten_new": { - "type": "function", - "file": "git2/oid.h", - "line": 336, - "lineto": 336, - "args": [ - { - "name": "min_length", - "type": "size_t", - "comment": "The minimal length for all identifiers,\n\t\twhich will be used even if shorter OIDs would still\n\t\tbe unique." - } - ], - "argline": "size_t min_length", - "sig": "size_t", - "return": { - "type": "git_oid_shorten *", - "comment": " a `git_oid_shorten` instance, NULL if OOM" - }, - "description": "

Create a new OID shortener.

\n", - "comments": "

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.

\n\n

E.g. look at the result of git log --abbrev.

\n", - "group": "oid" - }, - "git_oid_shorten_add": { - "type": "function", - "file": "git2/oid.h", - "line": 362, - "lineto": 362, - "args": [ - { - "name": "os", - "type": "git_oid_shorten *", - "comment": "a `git_oid_shorten` instance" - }, - { - "name": "text_id", - "type": "const char *", - "comment": "an OID in text form" - } - ], - "argline": "git_oid_shorten *os, const char *text_id", - "sig": "git_oid_shorten *::const char *", - "return": { - "type": "int", - "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." - }, - "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", - "comments": "

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.

\n\n

For performance reasons, there is a hard-limit of how many OIDs can be added to a single set (around ~32000, assuming a mostly randomized distribution), which should be enough for any kind of program, and keeps the algorithm fast and memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a GIT_ERROR_INVALID error

\n", - "group": "oid" - }, - "git_oid_shorten_free": { - "type": "function", - "file": "git2/oid.h", - "line": 369, - "lineto": 369, - "args": [ - { - "name": "os", - "type": "git_oid_shorten *", - "comment": "a `git_oid_shorten` instance" - } - ], - "argline": "git_oid_shorten *os", - "sig": "git_oid_shorten *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an OID shortener instance

\n", - "comments": "", - "group": "oid" - }, - "git_oidarray_dispose": { - "type": "function", - "file": "git2/oidarray.h", - "line": 31, - "lineto": 31, - "args": [ - { - "name": "array", - "type": "git_oidarray *", - "comment": "git_oidarray from which to free oid data" - } - ], - "argline": "git_oidarray *array", - "sig": "git_oidarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the object IDs contained in an oid_array. This method should\n be called on git_oidarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", - "comments": "

This does not free the git_oidarray itself, since the library will never allocate that object directly itself.

\n", - "group": "oidarray" - }, - "git_packbuilder_new": { - "type": "function", - "file": "git2/pack.h", - "line": 65, - "lineto": 65, - "args": [ - { - "name": "out", - "type": "git_packbuilder **", - "comment": "The new packbuilder object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - } - ], - "argline": "git_packbuilder **out, git_repository *repo", - "sig": "git_packbuilder **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Initialize a new packbuilder

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_set_threads": { - "type": "function", - "file": "git2/pack.h", - "line": 78, - "lineto": 78, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "n", - "type": "unsigned int", - "comment": "Number of threads to spawn" - } - ], - "argline": "git_packbuilder *pb, unsigned int n", - "sig": "git_packbuilder *::unsigned int", - "return": { - "type": "unsigned int", - "comment": " number of actual threads to be used" - }, - "description": "

Set number of threads to spawn

\n", - "comments": "

By default, libgit2 won't spawn any threads at all; when set to 0, libgit2 will autodetect the number of CPUs.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert": { - "type": "function", - "file": "git2/pack.h", - "line": 92, - "lineto": 92, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The oid of the commit" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name; might be NULL" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id, const char *name", - "sig": "git_packbuilder *::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert a single object

\n", - "comments": "

For an optimal pack it's mandatory to insert objects in recency order, commits followed by trees and blobs.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_tree": { - "type": "function", - "file": "git2/pack.h", - "line": 104, - "lineto": 104, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The oid of the root tree" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id", - "sig": "git_packbuilder *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert a root tree object

\n", - "comments": "

This will add the tree as well as all referenced trees and blobs.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_commit": { - "type": "function", - "file": "git2/pack.h", - "line": 116, - "lineto": 116, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The oid of the commit" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id", - "sig": "git_packbuilder *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert a commit object

\n", - "comments": "

This will add a commit as well as the completed referenced tree.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_walk": { - "type": "function", - "file": "git2/pack.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - }, - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the revwalk to use to fill the packbuilder" - } - ], - "argline": "git_packbuilder *pb, git_revwalk *walk", - "sig": "git_packbuilder *::git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Insert objects as given by the walk

\n", - "comments": "

Those commits and all objects they reference will be inserted into the packbuilder.

\n", - "group": "packbuilder" - }, - "git_packbuilder_insert_recur": { - "type": "function", - "file": "git2/pack.h", - "line": 141, - "lineto": 141, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the id of the root object to insert" - }, - { - "name": "name", - "type": "const char *", - "comment": "optional name for the object" - } - ], - "argline": "git_packbuilder *pb, const git_oid *id, const char *name", - "sig": "git_packbuilder *::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Recursively insert an object and its referenced objects

\n", - "comments": "

Insert the object as well as any object it references.

\n", - "group": "packbuilder" - }, - "git_packbuilder_write_buf": { - "type": "function", - "file": "git2/pack.h", - "line": 153, - "lineto": 153, - "args": [ - { - "name": "buf", - "type": "git_buf *", - "comment": "Buffer where to write the packfile" - }, - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - } - ], - "argline": "git_buf *buf, git_packbuilder *pb", - "sig": "git_buf *::git_packbuilder *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write the contents of the packfile to an in-memory buffer

\n", - "comments": "

The contents of the buffer will become a valid packfile, even though there will be no attached index

\n", - "group": "packbuilder" - }, - "git_packbuilder_write": { - "type": "function", - "file": "git2/pack.h", - "line": 166, - "lineto": 171, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to the directory where the packfile and index should be stored, or NULL for default location" - }, - { - "name": "mode", - "type": "unsigned int", - "comment": "permissions to use creating a packfile or 0 for defaults" - }, - { - "name": "progress_cb", - "type": "git_indexer_progress_cb", - "comment": "function to call with progress information from the indexer (optional)" - }, - { - "name": "progress_cb_payload", - "type": "void *", - "comment": "payload for the progress callback (optional)" - } - ], - "argline": "git_packbuilder *pb, const char *path, unsigned int mode, git_indexer_progress_cb progress_cb, void *progress_cb_payload", - "sig": "git_packbuilder *::const char *::unsigned int::git_indexer_progress_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write the new pack and corresponding index file to path.

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_hash": { - "type": "function", - "file": "git2/pack.h", - "line": 184, - "lineto": 184, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder object" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "const git_oid *", - "comment": " 0 or an error code" - }, - "description": "

Get the packfile's hash

\n", - "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the packfile has been written.

\n", - "group": "packbuilder" - }, - "git_packbuilder_name": { - "type": "function", - "file": "git2/pack.h", - "line": 196, - "lineto": 196, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder instance" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "const char *", - "comment": " a NUL terminated string for the packfile name" - }, - "description": "

Get the unique name for the resulting packfile.

\n", - "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the packfile has been written.

\n", - "group": "packbuilder" - }, - "git_packbuilder_foreach": { - "type": "function", - "file": "git2/pack.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - }, - { - "name": "cb", - "type": "git_packbuilder_foreach_cb", - "comment": "the callback to call with each packed object's buffer" - }, - { - "name": "payload", - "type": "void *", - "comment": "the callback's data" - } - ], - "argline": "git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload", - "sig": "git_packbuilder *::git_packbuilder_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create the new pack and pass each object to the callback

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_object_count": { - "type": "function", - "file": "git2/pack.h", - "line": 226, - "lineto": 226, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "size_t", - "comment": " the number of objects in the packfile" - }, - "description": "

Get the total number of objects the packbuilder will write out

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_written": { - "type": "function", - "file": "git2/pack.h", - "line": 234, - "lineto": 234, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "the packbuilder" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "size_t", - "comment": " the number of objects which have already been written" - }, - "description": "

Get the number of objects the packbuilder has already written out

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_set_callbacks": { - "type": "function", - "file": "git2/pack.h", - "line": 253, - "lineto": 256, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder object" - }, - { - "name": "progress_cb", - "type": "git_packbuilder_progress", - "comment": "Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected." - }, - { - "name": "progress_cb_payload", - "type": "void *", - "comment": "Payload for progress callback." - } - ], - "argline": "git_packbuilder *pb, git_packbuilder_progress progress_cb, void *progress_cb_payload", - "sig": "git_packbuilder *::git_packbuilder_progress::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the callbacks for a packbuilder

\n", - "comments": "", - "group": "packbuilder" - }, - "git_packbuilder_free": { - "type": "function", - "file": "git2/pack.h", - "line": 263, - "lineto": 263, - "args": [ - { - "name": "pb", - "type": "git_packbuilder *", - "comment": "The packbuilder" - } - ], - "argline": "git_packbuilder *pb", - "sig": "git_packbuilder *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the packbuilder and all associated data

\n", - "comments": "", - "group": "packbuilder" - }, - "git_patch_owner": { - "type": "function", - "file": "git2/patch.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": "the patch" - } - ], - "argline": "const git_patch *patch", - "sig": "const git_patch *", - "return": { - "type": "git_repository *", - "comment": " a pointer to the repository" - }, - "description": "

Get the repository associated with this patch. May be NULL.

\n", - "comments": "", - "group": "patch" - }, - "git_patch_from_diff": { - "type": "function", - "file": "git2/patch.h", - "line": 59, - "lineto": 60, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "Output parameter for the delta patch object" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "Diff list object" - }, - { - "name": "idx", - "type": "size_t", - "comment": "Index into diff list" - } - ], - "argline": "git_patch **out, git_diff *diff, size_t idx", - "sig": "git_patch **::git_diff *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, other value \n<\n 0 on error" - }, - "description": "

Return a patch for an entry in the diff list.

\n", - "comments": "

The git_patch is a newly created object contains the text diffs for the delta. You have to call git_patch_free() when you are done with it. You can use the patch object to loop over all the hunks and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be created, the output will be set to NULL, and the binary flag will be set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass NULL for the git_patch, then the text diff will not be calculated.

\n", - "group": "patch" - }, - "git_patch_from_blobs": { - "type": "function", - "file": "git2/patch.h", - "line": 78, - "lineto": 84, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "The generated patch; NULL on error" - }, - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "new_blob", - "type": "const git_blob *", - "comment": "Blob for new side of diff, or NULL for empty blob" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat new blob as if it had this filename; can be NULL" - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - } - ], - "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *opts", - "sig": "git_patch **::const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code \n<\n 0" - }, - "description": "

Directly generate a patch from the difference between two blobs.

\n", - "comments": "

This is just like git_diff_blobs() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", - "group": "patch" - }, - "git_patch_from_blob_and_buffer": { - "type": "function", - "file": "git2/patch.h", - "line": 103, - "lineto": 110, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "The generated patch; NULL on error" - }, - { - "name": "old_blob", - "type": "const git_blob *", - "comment": "Blob for old side of diff, or NULL for empty blob" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old blob as if it had this filename; can be NULL" - }, - { - "name": "buffer", - "type": "const void *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "buffer_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "buffer_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - } - ], - "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const void *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *opts", - "sig": "git_patch **::const git_blob *::const char *::const void *::size_t::const char *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code \n<\n 0" - }, - "description": "

Directly generate a patch from the difference between a blob and a buffer.

\n", - "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", - "group": "patch" - }, - "git_patch_from_buffers": { - "type": "function", - "file": "git2/patch.h", - "line": 130, - "lineto": 138, - "args": [ - { - "name": "out", - "type": "git_patch **", - "comment": "The generated patch; NULL on error" - }, - { - "name": "old_buffer", - "type": "const void *", - "comment": "Raw data for old side of diff, or NULL for empty" - }, - { - "name": "old_len", - "type": "size_t", - "comment": "Length of the raw data for old side of the diff" - }, - { - "name": "old_as_path", - "type": "const char *", - "comment": "Treat old buffer as if it had this filename; can be NULL" - }, - { - "name": "new_buffer", - "type": "const void *", - "comment": "Raw data for new side of diff, or NULL for empty" - }, - { - "name": "new_len", - "type": "size_t", - "comment": "Length of raw data for new side of diff" - }, - { - "name": "new_as_path", - "type": "const char *", - "comment": "Treat buffer as if it had this filename; can be NULL" - }, - { - "name": "opts", - "type": "const git_diff_options *", - "comment": "Options for diff, or NULL for default options" - } - ], - "argline": "git_patch **out, const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *opts", - "sig": "git_patch **::const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code \n<\n 0" - }, - "description": "

Directly generate a patch from the difference between two buffers.

\n", - "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", - "group": "patch", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_patch_from_buffers-16" - ] - } - }, - "git_patch_free": { - "type": "function", - "file": "git2/patch.h", - "line": 145, - "lineto": 145, - "args": [ - { - "name": "patch", - "type": "git_patch *", - "comment": "The patch to free." - } - ], - "argline": "git_patch *patch", - "sig": "git_patch *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a git_patch object.

\n", - "comments": "", - "group": "patch", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_patch_free-17" - ] - } - }, - "git_patch_get_delta": { - "type": "function", - "file": "git2/patch.h", - "line": 154, - "lineto": 154, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": "The patch in which to get the delta." - } - ], - "argline": "const git_patch *patch", - "sig": "const git_patch *", - "return": { - "type": "const git_diff_delta *", - "comment": " The delta associated with the patch." - }, - "description": "

Get the delta associated with a patch. This delta points to internal\n data and you do not have to release it when you are done with it.

\n", - "comments": "", - "group": "patch" - }, - "git_patch_num_hunks": { - "type": "function", - "file": "git2/patch.h", - "line": 162, - "lineto": 162, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": "The patch in which to get the number of hunks." - } - ], - "argline": "const git_patch *patch", - "sig": "const git_patch *", - "return": { - "type": "size_t", - "comment": " The number of hunks of the patch." - }, - "description": "

Get the number of hunks in a patch

\n", - "comments": "", - "group": "patch" - }, - "git_patch_line_stats": { - "type": "function", - "file": "git2/patch.h", - "line": 180, - "lineto": 184, - "args": [ - { - "name": "total_context", - "type": "size_t *", - "comment": "Count of context lines in output, can be NULL." - }, - { - "name": "total_additions", - "type": "size_t *", - "comment": "Count of addition lines in output, can be NULL." - }, - { - "name": "total_deletions", - "type": "size_t *", - "comment": "Count of deletion lines in output, can be NULL." - }, - { - "name": "patch", - "type": "const git_patch *", - "comment": "The git_patch object" - } - ], - "argline": "size_t *total_context, size_t *total_additions, size_t *total_deletions, const git_patch *patch", - "sig": "size_t *::size_t *::size_t *::const git_patch *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Get line counts of each type in a patch.

\n", - "comments": "

This helps imitate a diff --numstat type of output. For that purpose, you only need the total_additions and total_deletions values, but we include the total_context line count in case you want the total number of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", - "group": "patch" - }, - "git_patch_get_hunk": { - "type": "function", - "file": "git2/patch.h", - "line": 199, - "lineto": 203, - "args": [ - { - "name": "out", - "type": "const git_diff_hunk **", - "comment": "Output pointer to git_diff_hunk of hunk" - }, - { - "name": "lines_in_hunk", - "type": "size_t *", - "comment": "Output count of total lines in this hunk" - }, - { - "name": "patch", - "type": "git_patch *", - "comment": "Input pointer to patch object" - }, - { - "name": "hunk_idx", - "type": "size_t", - "comment": "Input index of hunk to get information about" - } - ], - "argline": "const git_diff_hunk **out, size_t *lines_in_hunk, git_patch *patch, size_t hunk_idx", - "sig": "const git_diff_hunk **::size_t *::git_patch *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error" - }, - "description": "

Get the information about a hunk in a patch

\n", - "comments": "

Given a patch and a hunk index into the patch, this returns detailed information about that hunk. Any of the output pointers can be passed as NULL if you don't care about that particular piece of information.

\n", - "group": "patch" - }, - "git_patch_num_lines_in_hunk": { - "type": "function", - "file": "git2/patch.h", - "line": 212, - "lineto": 214, - "args": [ - { - "name": "patch", - "type": "const git_patch *", - "comment": "The git_patch object" - }, - { - "name": "hunk_idx", - "type": "size_t", - "comment": "Index of the hunk" - } - ], - "argline": "const git_patch *patch, size_t hunk_idx", - "sig": "const git_patch *::size_t", - "return": { - "type": "int", - "comment": " Number of lines in hunk or GIT_ENOTFOUND if invalid hunk index" - }, - "description": "

Get the number of lines in a hunk.

\n", - "comments": "", - "group": "patch" - }, - "git_patch_get_line_in_hunk": { - "type": "function", - "file": "git2/patch.h", - "line": 230, - "lineto": 234, - "args": [ - { - "name": "out", - "type": "const git_diff_line **", - "comment": "The git_diff_line data for this line" - }, - { - "name": "patch", - "type": "git_patch *", - "comment": "The patch to look in" - }, - { - "name": "hunk_idx", - "type": "size_t", - "comment": "The index of the hunk" - }, - { - "name": "line_of_hunk", - "type": "size_t", - "comment": "The index of the line in the hunk" - } - ], - "argline": "const git_diff_line **out, git_patch *patch, size_t hunk_idx, size_t line_of_hunk", - "sig": "const git_diff_line **::git_patch *::size_t::size_t", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Get data about a line in a hunk of a patch.

\n", - "comments": "

Given a patch, a hunk index, and a line index in the hunk, this will return a lot of details about that line. If you pass a hunk index larger than the number of hunks or a line index larger than the number of lines in the hunk, this will return -1.

\n", - "group": "patch" - }, - "git_patch_size": { - "type": "function", - "file": "git2/patch.h", - "line": 252, - "lineto": 256, - "args": [ - { - "name": "patch", - "type": "git_patch *", - "comment": "A git_patch representing changes to one file" - }, - { - "name": "include_context", - "type": "int", - "comment": "Include context lines in size if non-zero" - }, - { - "name": "include_hunk_headers", - "type": "int", - "comment": "Include hunk header lines if non-zero" - }, - { - "name": "include_file_headers", - "type": "int", - "comment": "Include file header lines if non-zero" - } - ], - "argline": "git_patch *patch, int include_context, int include_hunk_headers, int include_file_headers", - "sig": "git_patch *::int::int::int", - "return": { - "type": "size_t", - "comment": " The number of bytes of data" - }, - "description": "

Look up size of patch diff data in bytes

\n", - "comments": "

This returns the raw size of the patch data. This only includes the actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size of all of the diff output; if you pass it as false (zero), this will only include the actual changed lines (as if context_lines was 0).

\n", - "group": "patch" - }, - "git_patch_print": { - "type": "function", - "file": "git2/patch.h", - "line": 270, - "lineto": 273, - "args": [ - { - "name": "patch", - "type": "git_patch *", - "comment": "A git_patch representing changes to one file" - }, - { - "name": "print_cb", - "type": "git_diff_line_cb", - "comment": "Callback function to output lines of the patch. Will be\n called for file headers, hunk headers, and diff lines." - }, - { - "name": "payload", - "type": "void *", - "comment": "Reference pointer that will be passed to your callbacks." - } - ], - "argline": "git_patch *patch, git_diff_line_cb print_cb, void *payload", - "sig": "git_patch *::git_diff_line_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Serialize the patch to text via callback.

\n", - "comments": "

Returning a non-zero value from the callback will terminate the iteration and return that value to the caller.

\n", - "group": "patch" - }, - "git_patch_to_buf": { - "type": "function", - "file": "git2/patch.h", - "line": 282, - "lineto": 284, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "The git_buf to be filled in" - }, - { - "name": "patch", - "type": "git_patch *", - "comment": "A git_patch representing changes to one file" - } - ], - "argline": "git_buf *out, git_patch *patch", - "sig": "git_buf *::git_patch *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure." - }, - "description": "

Get the content of a patch as a single diff text.

\n", - "comments": "", - "group": "patch", - "examples": { - "diff.c": [ - "ex/v1.7.2/diff.html#git_patch_to_buf-18" - ] - } - }, - "git_pathspec_new": { - "type": "function", - "file": "git2/pathspec.h", - "line": 82, - "lineto": 83, - "args": [ - { - "name": "out", - "type": "git_pathspec **", - "comment": "Output of the compiled pathspec" - }, - { - "name": "pathspec", - "type": "const git_strarray *", - "comment": "A git_strarray of the paths to match" - } - ], - "argline": "git_pathspec **out, const git_strarray *pathspec", - "sig": "git_pathspec **::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Compile a pathspec

\n", - "comments": "", - "group": "pathspec", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_pathspec_new-40" - ] - } - }, - "git_pathspec_free": { - "type": "function", - "file": "git2/pathspec.h", - "line": 90, - "lineto": 90, - "args": [ - { - "name": "ps", - "type": "git_pathspec *", - "comment": "The compiled pathspec" - } - ], - "argline": "git_pathspec *ps", - "sig": "git_pathspec *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a pathspec

\n", - "comments": "", - "group": "pathspec", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_pathspec_free-41" - ] - } - }, - "git_pathspec_matches_path": { - "type": "function", - "file": "git2/pathspec.h", - "line": 105, - "lineto": 106, - "args": [ - { - "name": "ps", - "type": "const git_pathspec *", - "comment": "The compiled pathspec" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "path", - "type": "const char *", - "comment": "The pathname to attempt to match" - } - ], - "argline": "const git_pathspec *ps, uint32_t flags, const char *path", - "sig": "const git_pathspec *::uint32_t::const char *", - "return": { - "type": "int", - "comment": " 1 is path matches spec, 0 if it does not" - }, - "description": "

Try to match a path against a pathspec

\n", - "comments": "

Unlike most of the other pathspec matching functions, this will not fall back on the native case-sensitivity for your platform. You must explicitly pass flags to control case sensitivity or else this will fall back on being case sensitive.

\n", - "group": "pathspec" - }, - "git_pathspec_match_workdir": { - "type": "function", - "file": "git2/pathspec.h", - "line": 130, - "lineto": 134, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository in which to match; bare repo is an error" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" - }, - "description": "

Match a pathspec against the working directory of a repository.

\n", - "comments": "

This matches the pathspec against the current files in the working directory of the repository. It is an error to invoke this on a bare repo. This handles git ignores (i.e. ignored files will not be considered to match the pathspec unless the file is tracked in the index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec" - }, - "git_pathspec_match_index": { - "type": "function", - "file": "git2/pathspec.h", - "line": 159, - "lineto": 163, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "index", - "type": "git_index *", - "comment": "The index to match against" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" - }, - "description": "

Match a pathspec against entries in an index.

\n", - "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled by the current case-sensitivity of the index object itself and the USE_CASE and IGNORE_CASE flags will have no effect. This behavior will be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec" - }, - "git_pathspec_match_tree": { - "type": "function", - "file": "git2/pathspec.h", - "line": 183, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "tree", - "type": "git_tree *", - "comment": "The root-level tree to match against" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" - }, - "description": "

Match a pathspec against files in a tree.

\n", - "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_pathspec_match_tree-42" - ] - } - }, - "git_pathspec_match_diff": { - "type": "function", - "file": "git2/pathspec.h", - "line": 207, - "lineto": 211, - "args": [ - { - "name": "out", - "type": "git_pathspec_match_list **", - "comment": "Output list of matches; pass NULL to just get return value" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "A generated diff list" - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Combination of git_pathspec_flag_t options to control match" - }, - { - "name": "ps", - "type": "git_pathspec *", - "comment": "Pathspec to be matched" - } - ], - "argline": "git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps", - "sig": "git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" - }, - "description": "

Match a pathspec against files in a diff list.

\n", - "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_free": { - "type": "function", - "file": "git2/pathspec.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "m", - "type": "git_pathspec_match_list *", - "comment": "The git_pathspec_match_list to be freed" - } - ], - "argline": "git_pathspec_match_list *m", - "sig": "git_pathspec_match_list *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free memory associates with a git_pathspec_match_list

\n", - "comments": "", - "group": "pathspec" - }, - "git_pathspec_match_list_entrycount": { - "type": "function", - "file": "git2/pathspec.h", - "line": 226, - "lineto": 227, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - } - ], - "argline": "const git_pathspec_match_list *m", - "sig": "const git_pathspec_match_list *", - "return": { - "type": "size_t", - "comment": " Number of items in match list" - }, - "description": "

Get the number of items in a match list.

\n", - "comments": "", - "group": "pathspec" - }, - "git_pathspec_match_list_entry": { - "type": "function", - "file": "git2/pathspec.h", - "line": 239, - "lineto": 240, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - }, - { - "name": "pos", - "type": "size_t", - "comment": "The index into the list" - } - ], - "argline": "const git_pathspec_match_list *m, size_t pos", - "sig": "const git_pathspec_match_list *::size_t", - "return": { - "type": "const char *", - "comment": " The filename of the match" - }, - "description": "

Get a matching filename by position.

\n", - "comments": "

This routine cannot be used if the match list was generated by git_pathspec_match_diff. If so, it will always return NULL.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_diff_entry": { - "type": "function", - "file": "git2/pathspec.h", - "line": 252, - "lineto": 253, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - }, - { - "name": "pos", - "type": "size_t", - "comment": "The index into the list" - } - ], - "argline": "const git_pathspec_match_list *m, size_t pos", - "sig": "const git_pathspec_match_list *::size_t", - "return": { - "type": "const git_diff_delta *", - "comment": " The filename of the match" - }, - "description": "

Get a matching diff delta by position.

\n", - "comments": "

This routine can only be used if the match list was generated by git_pathspec_match_diff. Otherwise it will always return NULL.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_failed_entrycount": { - "type": "function", - "file": "git2/pathspec.h", - "line": 264, - "lineto": 265, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - } - ], - "argline": "const git_pathspec_match_list *m", - "sig": "const git_pathspec_match_list *", - "return": { - "type": "size_t", - "comment": " Number of items in original pathspec that had no matches" - }, - "description": "

Get the number of pathspec items that did not match.

\n", - "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when generating the git_pathspec_match_list.

\n", - "group": "pathspec" - }, - "git_pathspec_match_list_failed_entry": { - "type": "function", - "file": "git2/pathspec.h", - "line": 276, - "lineto": 277, - "args": [ - { - "name": "m", - "type": "const git_pathspec_match_list *", - "comment": "The git_pathspec_match_list object" - }, - { - "name": "pos", - "type": "size_t", - "comment": "The index into the failed items" - } - ], - "argline": "const git_pathspec_match_list *m, size_t pos", - "sig": "const git_pathspec_match_list *::size_t", - "return": { - "type": "const char *", - "comment": " The pathspec pattern that didn't match anything" - }, - "description": "

Get an original pathspec string that had no matches.

\n", - "comments": "

This will be return NULL for positions out of range.

\n", - "group": "pathspec" - }, - "git_proxy_options_init": { - "type": "function", - "file": "git2/proxy.h", - "line": 94, - "lineto": 94, - "args": [ - { - "name": "opts", - "type": "git_proxy_options *", - "comment": "The `git_proxy_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_PROXY_OPTIONS_VERSION`." - } - ], - "argline": "git_proxy_options *opts, unsigned int version", - "sig": "git_proxy_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_proxy_options structure

\n", - "comments": "

Initializes a git_proxy_options with default values. Equivalent to creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", - "group": "proxy" - }, - "git_rebase_options_init": { - "type": "function", - "file": "git2/rebase.h", - "line": 199, - "lineto": 201, - "args": [ - { - "name": "opts", - "type": "git_rebase_options *", - "comment": "The `git_rebase_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REBASE_OPTIONS_VERSION`." - } - ], - "argline": "git_rebase_options *opts, unsigned int version", - "sig": "git_rebase_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_rebase_options structure

\n", - "comments": "

Initializes a git_rebase_options with default values. Equivalent to creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", - "group": "rebase" - }, - "git_rebase_init": { - "type": "function", - "file": "git2/rebase.h", - "line": 220, - "lineto": 226, - "args": [ - { - "name": "out", - "type": "git_rebase **", - "comment": "Pointer to store the rebase object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository to perform the rebase" - }, - { - "name": "branch", - "type": "const git_annotated_commit *", - "comment": "The terminal commit to rebase, or NULL to rebase the\n current branch" - }, - { - "name": "upstream", - "type": "const git_annotated_commit *", - "comment": "The commit to begin rebasing from, or NULL to rebase all\n reachable commits" - }, - { - "name": "onto", - "type": "const git_annotated_commit *", - "comment": "The branch to rebase onto, or NULL to rebase onto the given\n upstream" - }, - { - "name": "opts", - "type": "const git_rebase_options *", - "comment": "Options to specify how rebase is performed, or NULL" - } - ], - "argline": "git_rebase **out, git_repository *repo, const git_annotated_commit *branch, const git_annotated_commit *upstream, const git_annotated_commit *onto, const git_rebase_options *opts", - "sig": "git_rebase **::git_repository *::const git_annotated_commit *::const git_annotated_commit *::const git_annotated_commit *::const git_rebase_options *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a rebase operation to rebase the changes in branch\n relative to upstream onto another branch. To begin the rebase\n process, call git_rebase_next. When you have finished with this\n object, call git_rebase_free.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_open": { - "type": "function", - "file": "git2/rebase.h", - "line": 237, - "lineto": 240, - "args": [ - { - "name": "out", - "type": "git_rebase **", - "comment": "Pointer to store the rebase object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository that has a rebase in-progress" - }, - { - "name": "opts", - "type": "const git_rebase_options *", - "comment": "Options to specify how rebase is performed" - } - ], - "argline": "git_rebase **out, git_repository *repo, const git_rebase_options *opts", - "sig": "git_rebase **::git_repository *::const git_rebase_options *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Opens an existing rebase that was previously started by either an\n invocation of git_rebase_init or by another client.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_orig_head_name": { - "type": "function", - "file": "git2/rebase.h", - "line": 248, - "lineto": 248, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase." - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const char *", - "comment": " The original `HEAD` ref name" - }, - "description": "

Gets the original HEAD ref name for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_orig_head_id": { - "type": "function", - "file": "git2/rebase.h", - "line": 256, - "lineto": 256, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase." - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const git_oid *", - "comment": " The original `HEAD` id" - }, - "description": "

Gets the original HEAD id for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_onto_name": { - "type": "function", - "file": "git2/rebase.h", - "line": 264, - "lineto": 264, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase." - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const char *", - "comment": " The `onto` ref name" - }, - "description": "

Gets the onto ref name for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_onto_id": { - "type": "function", - "file": "git2/rebase.h", - "line": 272, - "lineto": 272, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase." - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "const git_oid *", - "comment": " The `onto` id" - }, - "description": "

Gets the onto id for merge rebases.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_operation_entrycount": { - "type": "function", - "file": "git2/rebase.h", - "line": 280, - "lineto": 280, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "size_t", - "comment": " The number of rebase operations in total" - }, - "description": "

Gets the count of rebase operations that are to be applied.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_operation_current": { - "type": "function", - "file": "git2/rebase.h", - "line": 291, - "lineto": 291, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "size_t", - "comment": " The index of the rebase operation currently being applied." - }, - "description": "

Gets the index of the rebase operation that is currently being applied.\n If the first operation has not yet been applied (because you have\n called init but not yet next) then this returns\n GIT_REBASE_NO_OPERATION.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_operation_byindex": { - "type": "function", - "file": "git2/rebase.h", - "line": 300, - "lineto": 302, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase" - }, - { - "name": "idx", - "type": "size_t", - "comment": "The index of the rebase operation to retrieve" - } - ], - "argline": "git_rebase *rebase, size_t idx", - "sig": "git_rebase *::size_t", - "return": { - "type": "git_rebase_operation *", - "comment": " The rebase operation or NULL if `idx` was out of bounds" - }, - "description": "

Gets the rebase operation specified by the given index.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_next": { - "type": "function", - "file": "git2/rebase.h", - "line": 315, - "lineto": 317, - "args": [ - { - "name": "operation", - "type": "git_rebase_operation **", - "comment": "Pointer to store the rebase operation that is to be performed next" - }, - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase in progress" - } - ], - "argline": "git_rebase_operation **operation, git_rebase *rebase", - "sig": "git_rebase_operation **::git_rebase *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Performs the next rebase operation and returns the information about it.\n If the operation is one that applies a patch (which is any operation except\n GIT_REBASE_OPERATION_EXEC) then the patch will be applied and the index and\n working directory will be updated with the changes. If there are conflicts,\n you will need to address those before committing the changes.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_inmemory_index": { - "type": "function", - "file": "git2/rebase.h", - "line": 334, - "lineto": 336, - "args": [ - { - "name": "index", - "type": "git_index **", - "comment": "The result index of the last operation." - }, - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The in-progress rebase." - } - ], - "argline": "git_index **index, git_rebase *rebase", - "sig": "git_index **::git_rebase *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Gets the index produced by the last operation, which is the result\n of git_rebase_next and which will be committed by the next\n invocation of git_rebase_commit. This is useful for resolving\n conflicts in an in-memory rebase before committing them. You must\n call git_index_free when you are finished with this.

\n", - "comments": "

This is only applicable for in-memory rebases; for rebases within a working directory, the changes were applied to the repository's index.

\n", - "group": "rebase" - }, - "git_rebase_commit": { - "type": "function", - "file": "git2/rebase.h", - "line": 360, - "lineto": 366, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "Pointer in which to store the OID of the newly created commit" - }, - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase that is in-progress" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "The author of the updated commit, or NULL to keep the\n author from the original commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "The committer of the rebase" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "The encoding for the message in the commit,\n represented with a standard encoding name. If message is NULL,\n this should also be NULL, and the encoding from the original\n commit will be maintained. If message is specified, this may be\n NULL to indicate that \"UTF-8\" is to be used." - }, - { - "name": "message", - "type": "const char *", - "comment": "The message for this commit, or NULL to use the message\n from the original commit." - } - ], - "argline": "git_oid *id, git_rebase *rebase, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message", - "sig": "git_oid *::git_rebase *::const git_signature *::const git_signature *::const char *::const char *", - "return": { - "type": "int", - "comment": " Zero on success, GIT_EUNMERGED if there are unmerged changes in\n the index, GIT_EAPPLIED if the current commit has already\n been applied to the upstream and there is nothing to commit,\n -1 on failure." - }, - "description": "

Commits the current patch. You must have resolved any conflicts that\n were introduced during the patch application from the git_rebase_next\n invocation.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_abort": { - "type": "function", - "file": "git2/rebase.h", - "line": 376, - "lineto": 376, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase that is in-progress" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "int", - "comment": " Zero on success; GIT_ENOTFOUND if a rebase is not in progress,\n -1 on other errors." - }, - "description": "

Aborts a rebase that is currently in progress, resetting the repository\n and working directory to their state before rebase began.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_finish": { - "type": "function", - "file": "git2/rebase.h", - "line": 386, - "lineto": 388, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase that is in-progress" - }, - { - "name": "signature", - "type": "const git_signature *", - "comment": "The identity that is finishing the rebase (optional)" - } - ], - "argline": "git_rebase *rebase, const git_signature *signature", - "sig": "git_rebase *::const git_signature *", - "return": { - "type": "int", - "comment": " Zero on success; -1 on error" - }, - "description": "

Finishes a rebase that is currently in progress once all patches have\n been applied.

\n", - "comments": "", - "group": "rebase" - }, - "git_rebase_free": { - "type": "function", - "file": "git2/rebase.h", - "line": 395, - "lineto": 395, - "args": [ - { - "name": "rebase", - "type": "git_rebase *", - "comment": "The rebase object" - } - ], - "argline": "git_rebase *rebase", - "sig": "git_rebase *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Frees the git_rebase object.

\n", - "comments": "", - "group": "rebase" - }, - "git_refdb_new": { - "type": "function", - "file": "git2/refdb.h", - "line": 35, - "lineto": 35, - "args": [ - { - "name": "out", - "type": "git_refdb **", - "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_refdb **out, git_repository *repo", - "sig": "git_refdb **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new reference database with no backends.

\n", - "comments": "

Before the Ref DB can be used for read/writing, a custom database backend must be manually set using git_refdb_set_backend()

\n", - "group": "refdb" - }, - "git_refdb_open": { - "type": "function", - "file": "git2/refdb.h", - "line": 49, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_refdb **", - "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_refdb **out, git_repository *repo", - "sig": "git_refdb **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new reference database and automatically add\n the default backends:

\n", - "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs from disk, assuming the repository dir as the folder
  • \n
\n", - "group": "refdb" - }, - "git_refdb_compress": { - "type": "function", - "file": "git2/refdb.h", - "line": 59, - "lineto": 59, - "args": [ - { - "name": "refdb", - "type": "git_refdb *", - "comment": "The reference database to optimize." - } - ], - "argline": "git_refdb *refdb", - "sig": "git_refdb *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. For on-disk reference\n databases, for example, this may pack all loose references.

\n", - "comments": "", - "group": "refdb" - }, - "git_refdb_free": { - "type": "function", - "file": "git2/refdb.h", - "line": 66, - "lineto": 66, - "args": [ - { - "name": "refdb", - "type": "git_refdb *", - "comment": "reference database pointer or NULL" - } - ], - "argline": "git_refdb *refdb", - "sig": "git_refdb *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open reference database.

\n", - "comments": "", - "group": "refdb" - }, - "git_reflog_read": { - "type": "function", - "file": "git2/reflog.h", - "line": 38, - "lineto": 38, - "args": [ - { - "name": "out", - "type": "git_reflog **", - "comment": "pointer to reflog" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "name", - "type": "const char *", - "comment": "reference to look up" - } - ], - "argline": "git_reflog **out, git_repository *repo, const char *name", - "sig": "git_reflog **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Read the reflog for the given reference

\n", - "comments": "

If there is no reflog file for the given reference yet, an empty reflog object will be returned.

\n\n

The reflog must be freed manually by using git_reflog_free().

\n", - "group": "reflog" - }, - "git_reflog_write": { - "type": "function", - "file": "git2/reflog.h", - "line": 47, - "lineto": 47, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "an existing reflog object" - } - ], - "argline": "git_reflog *reflog", - "sig": "git_reflog *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write an existing in-memory reflog object back to disk\n using an atomic file lock.

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_append": { - "type": "function", - "file": "git2/reflog.h", - "line": 60, - "lineto": 60, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "an existing reflog object" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the OID the reference is now pointing to" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "the signature of the committer" - }, - { - "name": "msg", - "type": "const char *", - "comment": "the reflog message" - } - ], - "argline": "git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg", - "sig": "git_reflog *::const git_oid *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a new entry to the in-memory reflog.

\n", - "comments": "

msg is optional and can be NULL.

\n", - "group": "reflog" - }, - "git_reflog_rename": { - "type": "function", - "file": "git2/reflog.h", - "line": 75, - "lineto": 75, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "old_name", - "type": "const char *", - "comment": "the old name of the reference" - }, - { - "name": "name", - "type": "const char *", - "comment": "the new name of the reference" - } - ], - "argline": "git_repository *repo, const char *old_name, const char *name", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Rename a reflog

\n", - "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity. See git_reference_create_symbolic() for rules about valid names.

\n", - "group": "reflog" - }, - "git_reflog_delete": { - "type": "function", - "file": "git2/reflog.h", - "line": 84, - "lineto": 84, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "name", - "type": "const char *", - "comment": "the reflog to delete" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Delete the reflog for the given reference

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entrycount": { - "type": "function", - "file": "git2/reflog.h", - "line": 92, - "lineto": 92, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "the previously loaded reflog" - } - ], - "argline": "git_reflog *reflog", - "sig": "git_reflog *", - "return": { - "type": "size_t", - "comment": " the number of log entries" - }, - "description": "

Get the number of log entries in a reflog

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_byindex": { - "type": "function", - "file": "git2/reflog.h", - "line": 105, - "lineto": 105, - "args": [ - { - "name": "reflog", - "type": "const git_reflog *", - "comment": "a previously loaded reflog" - }, - { - "name": "idx", - "type": "size_t", - "comment": "the position of the entry to lookup. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." - } - ], - "argline": "const git_reflog *reflog, size_t idx", - "sig": "const git_reflog *::size_t", - "return": { - "type": "const git_reflog_entry *", - "comment": " the entry; NULL if not found" - }, - "description": "

Lookup an entry by its index

\n", - "comments": "

Requesting the reflog entry with an index of 0 (zero) will return the most recently created entry.

\n", - "group": "reflog" - }, - "git_reflog_drop": { - "type": "function", - "file": "git2/reflog.h", - "line": 124, - "lineto": 127, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "a previously loaded reflog." - }, - { - "name": "idx", - "type": "size_t", - "comment": "the position of the entry to remove. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." - }, - { - "name": "rewrite_previous_entry", - "type": "int", - "comment": "1 to rewrite the history; 0 otherwise." - } - ], - "argline": "git_reflog *reflog, size_t idx, int rewrite_previous_entry", - "sig": "git_reflog *::size_t::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code." - }, - "description": "

Remove an entry from the reflog by its index

\n", - "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry param value to 1. When deleting entry n, member old_oid of entry n-1 (if any) will be updated with the value of member new_oid of entry n+1.

\n", - "group": "reflog" - }, - "git_reflog_entry_id_old": { - "type": "function", - "file": "git2/reflog.h", - "line": 135, - "lineto": 135, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const git_oid *", - "comment": " the old oid" - }, - "description": "

Get the old oid

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_id_new": { - "type": "function", - "file": "git2/reflog.h", - "line": 143, - "lineto": 143, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const git_oid *", - "comment": " the new oid at this time" - }, - "description": "

Get the new oid

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_committer": { - "type": "function", - "file": "git2/reflog.h", - "line": 151, - "lineto": 151, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const git_signature *", - "comment": " the committer" - }, - "description": "

Get the committer of this entry

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_entry_message": { - "type": "function", - "file": "git2/reflog.h", - "line": 159, - "lineto": 159, - "args": [ - { - "name": "entry", - "type": "const git_reflog_entry *", - "comment": "a reflog entry" - } - ], - "argline": "const git_reflog_entry *entry", - "sig": "const git_reflog_entry *", - "return": { - "type": "const char *", - "comment": " the log msg" - }, - "description": "

Get the log message

\n", - "comments": "", - "group": "reflog" - }, - "git_reflog_free": { - "type": "function", - "file": "git2/reflog.h", - "line": 166, - "lineto": 166, - "args": [ - { - "name": "reflog", - "type": "git_reflog *", - "comment": "reflog to free" - } - ], - "argline": "git_reflog *reflog", - "sig": "git_reflog *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the reflog

\n", - "comments": "", - "group": "reflog" - }, - "git_reference_lookup": { - "type": "function", - "file": "git2/refs.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the looked-up reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to look up the reference" - }, - { - "name": "name", - "type": "const char *", - "comment": "the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name", - "sig": "git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." - }, - "description": "

Lookup a reference by name in a repository.

\n", - "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_reference_lookup-15", - "ex/v1.7.2/checkout.html#git_reference_lookup-16" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_reference_lookup-53" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_lookup-21" - ] - } - }, - "git_reference_name_to_id": { - "type": "function", - "file": "git2/refs.h", - "line": 54, - "lineto": 55, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer to oid to be filled in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository in which to look up the reference" - }, - { - "name": "name", - "type": "const char *", - "comment": "The long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" - } - ], - "argline": "git_oid *out, git_repository *repo, const char *name", - "sig": "git_oid *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." - }, - "description": "

Lookup a reference by name and resolve immediately to OID.

\n", - "comments": "

This function provides a quick way to resolve a reference name straight through to the object id that it refers to. This avoids having to allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference" - }, - "git_reference_dwim": { - "type": "function", - "file": "git2/refs.h", - "line": 68, - "lineto": 68, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer in which to store the reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "shorthand", - "type": "const char *", - "comment": "the short name for the reference" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *shorthand", - "sig": "git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a reference by DWIMing its short name

\n", - "comments": "

Apply the git precedence rules to the given shorthand to determine which reference the user is referring to.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_dwim-22" - ] - } - }, - "git_reference_symbolic_create_matching": { - "type": "function", - "file": "git2/refs.h", - "line": 112, - "lineto": 112, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "target", - "type": "const char *", - "comment": "The target of the reference" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "current_value", - "type": "const char *", - "comment": "The expected value of the reference when updating" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *current_value, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" - }, - "description": "

Conditionally create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n\n

If current_value is all zeros, this function will return GIT_EMODIFIED if the ref already exists.

\n", - "group": "reference" - }, - "git_reference_symbolic_create": { - "type": "function", - "file": "git2/refs.h", - "line": 148, - "lineto": 148, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "target", - "type": "const char *", - "comment": "The target of the reference" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Create a new symbolic reference.

\n", - "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", - "group": "reference" - }, - "git_reference_create": { - "type": "function", - "file": "git2/refs.h", - "line": 185, - "lineto": 185, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The object id pointed to by the reference." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Create a new direct reference.

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_create-23" - ] - } - }, - "git_reference_create_matching": { - "type": "function", - "file": "git2/refs.h", - "line": 228, - "lineto": 228, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where that reference will live" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of the reference" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The object id pointed to by the reference." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - }, - { - "name": "current_id", - "type": "const git_oid *", - "comment": "The expected value of the reference at the time of update" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_oid *current_id, const char *log_message", - "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Conditionally create new direct reference

\n", - "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", - "group": "reference" - }, - "git_reference_target": { - "type": "function", - "file": "git2/refs.h", - "line": 243, - "lineto": 243, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the oid if available, NULL otherwise" - }, - "description": "

Get the OID pointed to by a direct reference.

\n", - "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_reference_target-54" - ] - } - }, - "git_reference_target_peel": { - "type": "function", - "file": "git2/refs.h", - "line": 254, - "lineto": 254, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const git_oid *", - "comment": " a pointer to the oid if available, NULL otherwise" - }, - "description": "

Return the peeled OID target of this reference.

\n", - "comments": "

This peeled OID only applies to direct references that point to a hard Tag object: it is the result of peeling such Tag.

\n", - "group": "reference" - }, - "git_reference_symbolic_target": { - "type": "function", - "file": "git2/refs.h", - "line": 264, - "lineto": 264, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const char *", - "comment": " a pointer to the name if available, NULL otherwise" - }, - "description": "

Get full name to the reference pointed to by a symbolic reference.

\n", - "comments": "

Only available if the reference is symbolic.

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_reference_symbolic_target-55" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_symbolic_target-24" - ] - } - }, - "git_reference_type": { - "type": "function", - "file": "git2/refs.h", - "line": 274, - "lineto": 274, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "git_reference_t", - "comment": " the type" - }, - "description": "

Get the type of a reference.

\n", - "comments": "

Either direct (GIT_REFERENCE_DIRECT) or symbolic (GIT_REFERENCE_SYMBOLIC)

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_reference_type-56" - ] - } - }, - "git_reference_name": { - "type": "function", - "file": "git2/refs.h", - "line": 284, - "lineto": 284, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const char *", - "comment": " the full name for the ref" - }, - "description": "

Get the full name of a reference.

\n", - "comments": "

See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_reference_name-17" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_name-25" - ] - } - }, - "git_reference_resolve": { - "type": "function", - "file": "git2/refs.h", - "line": 302, - "lineto": 302, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the peeled reference" - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "git_reference **out, const git_reference *ref", - "sig": "git_reference **::const git_reference *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Resolve a symbolic reference to a direct reference.

\n", - "comments": "

This method iteratively peels a symbolic reference until it resolves to a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that reference is returned. This copy must be manually freed too.

\n", - "group": "reference" - }, - "git_reference_owner": { - "type": "function", - "file": "git2/refs.h", - "line": 310, - "lineto": 310, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "git_repository *", - "comment": " a pointer to the repo" - }, - "description": "

Get the repository where a reference resides.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_symbolic_set_target": { - "type": "function", - "file": "git2/refs.h", - "line": 332, - "lineto": 336, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference" - }, - { - "name": "target", - "type": "const char *", - "comment": "The new target for the reference" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_reference *ref, const char *target, const char *log_message", - "sig": "git_reference **::git_reference *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", - "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", - "group": "reference" - }, - "git_reference_set_target": { - "type": "function", - "file": "git2/refs.h", - "line": 352, - "lineto": 356, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "Pointer to the newly created reference" - }, - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "The new target OID for the reference" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **out, git_reference *ref, const git_oid *id, const char *log_message", - "sig": "git_reference **::git_reference *::const git_oid *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed since it was read, or an error code" - }, - "description": "

Conditionally create a new reference with the same name as the given reference but a\n different OID target. The reference must be a direct reference, otherwise\n this will fail.

\n", - "comments": "

The new reference will be written to disk, overwriting the given reference.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_set_target-26" - ] - } - }, - "git_reference_rename": { - "type": "function", - "file": "git2/refs.h", - "line": 381, - "lineto": 386, - "args": [ - { - "name": "new_ref", - "type": "git_reference **", - "comment": null - }, - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference to rename" - }, - { - "name": "new_name", - "type": "const char *", - "comment": "The new name for the reference" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite an existing reference" - }, - { - "name": "log_message", - "type": "const char *", - "comment": "The one line long message to be appended to the reflog" - } - ], - "argline": "git_reference **new_ref, git_reference *ref, const char *new_name, int force, const char *log_message", - "sig": "git_reference **::git_reference *::const char *::int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Rename an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already a reference with the given name, the renaming will fail.

\n\n

IMPORTANT: The user needs to write a proper reflog entry if the reflog is enabled for the repository. We only rename the reflog if it exists.

\n", - "group": "reference" - }, - "git_reference_delete": { - "type": "function", - "file": "git2/refs.h", - "line": 401, - "lineto": 401, - "args": [ - { - "name": "ref", - "type": "git_reference *", - "comment": "The reference to remove" - } - ], - "argline": "git_reference *ref", - "sig": "git_reference *", - "return": { - "type": "int", - "comment": " 0, GIT_EMODIFIED or an error code" - }, - "description": "

Delete an existing reference.

\n", - "comments": "

This method works for both direct and symbolic references. The reference will be immediately removed on disk but the memory will not be freed. Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed from the time it was looked up.

\n", - "group": "reference" - }, - "git_reference_remove": { - "type": "function", - "file": "git2/refs.h", - "line": 412, - "lineto": 412, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "name", - "type": "const char *", - "comment": "The reference to remove" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Delete an existing reference by name

\n", - "comments": "

This method removes the named reference from the repository without looking at its old value.

\n", - "group": "reference" - }, - "git_reference_list": { - "type": "function", - "file": "git2/refs.h", - "line": 426, - "lineto": 426, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "Pointer to a git_strarray structure where\n\t\tthe reference names will be stored" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - } - ], - "argline": "git_strarray *array, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Fill a list with all the references that can be found in a repository.

\n", - "comments": "

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().

\n", - "group": "reference", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_reference_list-57" - ] - } - }, - "git_reference_foreach": { - "type": "function", - "file": "git2/refs.h", - "line": 466, - "lineto": 469, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - }, - { - "name": "callback", - "type": "git_reference_foreach_cb", - "comment": "Function which will be called for every listed ref" - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback" - } - ], - "argline": "git_repository *repo, git_reference_foreach_cb callback, void *payload", - "sig": "git_repository *::git_reference_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Perform a callback on each reference in the repository.

\n", - "comments": "

The callback function will be called for each reference in the repository, receiving the reference object and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free on each reference passed to it.

\n", - "group": "reference" - }, - "git_reference_foreach_name": { - "type": "function", - "file": "git2/refs.h", - "line": 484, - "lineto": 487, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - }, - { - "name": "callback", - "type": "git_reference_foreach_name_cb", - "comment": "Function which will be called for every listed ref name" - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback" - } - ], - "argline": "git_repository *repo, git_reference_foreach_name_cb callback, void *payload", - "sig": "git_repository *::git_reference_foreach_name_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Perform a callback on the fully-qualified name of each reference.

\n", - "comments": "

The callback function will be called for each reference in the repository, receiving the name of the reference and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n", - "group": "reference" - }, - "git_reference_dup": { - "type": "function", - "file": "git2/refs.h", - "line": 498, - "lineto": 498, - "args": [ - { - "name": "dest", - "type": "git_reference **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "git_reference *", - "comment": "object to copy" - } - ], - "argline": "git_reference **dest, git_reference *source", - "sig": "git_reference **::git_reference *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an existing reference.

\n", - "comments": "

Call git_reference_free to free the data.

\n", - "group": "reference" - }, - "git_reference_free": { - "type": "function", - "file": "git2/refs.h", - "line": 505, - "lineto": 505, - "args": [ - { - "name": "ref", - "type": "git_reference *", - "comment": "git_reference" - } - ], - "argline": "git_reference *ref", - "sig": "git_reference *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the given reference.

\n", - "comments": "", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_reference_free-18", - "ex/v1.7.2/checkout.html#git_reference_free-19", - "ex/v1.7.2/checkout.html#git_reference_free-20" - ], - "commit.c": [ - "ex/v1.7.2/commit.html#git_reference_free-7" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_reference_free-58" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_free-27", - "ex/v1.7.2/merge.html#git_reference_free-28", - "ex/v1.7.2/merge.html#git_reference_free-29" - ], - "status.c": [ - "ex/v1.7.2/status.html#git_reference_free-1" - ] - } - }, - "git_reference_cmp": { - "type": "function", - "file": "git2/refs.h", - "line": 514, - "lineto": 516, - "args": [ - { - "name": "ref1", - "type": "const git_reference *", - "comment": "The first git_reference" - }, - { - "name": "ref2", - "type": "const git_reference *", - "comment": "The second git_reference" - } - ], - "argline": "const git_reference *ref1, const git_reference *ref2", - "sig": "const git_reference *::const git_reference *", - "return": { - "type": "int", - "comment": " 0 if the same, else a stable but meaningless ordering." - }, - "description": "

Compare two references.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_iterator_new": { - "type": "function", - "file": "git2/refs.h", - "line": 525, - "lineto": 527, - "args": [ - { - "name": "out", - "type": "git_reference_iterator **", - "comment": "pointer in which to store the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_reference_iterator **out, git_repository *repo", - "sig": "git_reference_iterator **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an iterator for the repo's references

\n", - "comments": "", - "group": "reference" - }, - "git_reference_iterator_glob_new": { - "type": "function", - "file": "git2/refs.h", - "line": 538, - "lineto": 541, - "args": [ - { - "name": "out", - "type": "git_reference_iterator **", - "comment": "pointer in which to store the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "glob", - "type": "const char *", - "comment": "the glob to match against the reference names" - } - ], - "argline": "git_reference_iterator **out, git_repository *repo, const char *glob", - "sig": "git_reference_iterator **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an iterator for the repo's references that match the\n specified glob

\n", - "comments": "", - "group": "reference" - }, - "git_reference_next": { - "type": "function", - "file": "git2/refs.h", - "line": 550, - "lineto": 550, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer in which to store the reference" - }, - { - "name": "iter", - "type": "git_reference_iterator *", - "comment": "the iterator" - } - ], - "argline": "git_reference **out, git_reference_iterator *iter", - "sig": "git_reference **::git_reference_iterator *", - "return": { - "type": "int", - "comment": " 0, GIT_ITEROVER if there are no more; or an error code" - }, - "description": "

Get the next reference

\n", - "comments": "", - "group": "reference" - }, - "git_reference_next_name": { - "type": "function", - "file": "git2/refs.h", - "line": 563, - "lineto": 563, - "args": [ - { - "name": "out", - "type": "const char **", - "comment": "pointer in which to store the string" - }, - { - "name": "iter", - "type": "git_reference_iterator *", - "comment": "the iterator" - } - ], - "argline": "const char **out, git_reference_iterator *iter", - "sig": "const char **::git_reference_iterator *", - "return": { - "type": "int", - "comment": " 0, GIT_ITEROVER if there are no more; or an error code" - }, - "description": "

Get the next reference's name

\n", - "comments": "

This function is provided for convenience in case only the names are interesting as it avoids the allocation of the git_reference object which git_reference_next() needs.

\n", - "group": "reference" - }, - "git_reference_iterator_free": { - "type": "function", - "file": "git2/refs.h", - "line": 570, - "lineto": 570, - "args": [ - { - "name": "iter", - "type": "git_reference_iterator *", - "comment": "the iterator to free" - } - ], - "argline": "git_reference_iterator *iter", - "sig": "git_reference_iterator *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the iterator and its associated resources

\n", - "comments": "", - "group": "reference" - }, - "git_reference_foreach_glob": { - "type": "function", - "file": "git2/refs.h", - "line": 590, - "lineto": 594, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the refs" - }, - { - "name": "glob", - "type": "const char *", - "comment": "Pattern to match (fnmatch-style) against reference name." - }, - { - "name": "callback", - "type": "git_reference_foreach_name_cb", - "comment": "Function which will be called for every listed ref" - }, - { - "name": "payload", - "type": "void *", - "comment": "Additional data to pass to the callback" - } - ], - "argline": "git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload", - "sig": "git_repository *::const char *::git_reference_foreach_name_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUSER on non-zero callback, or error code" - }, - "description": "

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n", - "comments": "

This function acts like git_reference_foreach() with an additional pattern match being applied to the reference name before issuing the callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches any sequence of letters, a '?' matches any letter, and square brackets can be used to define character ranges (such as "[0-9]" for digits).

\n", - "group": "reference" - }, - "git_reference_has_log": { - "type": "function", - "file": "git2/refs.h", - "line": 604, - "lineto": 604, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference's name" - } - ], - "argline": "git_repository *repo, const char *refname", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 when no reflog can be found, 1 when it exists;\n otherwise an error code." - }, - "description": "

Check if a reflog exists for the specified reference.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_ensure_log": { - "type": "function", - "file": "git2/refs.h", - "line": 616, - "lineto": 616, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference's name" - } - ], - "argline": "git_repository *repo, const char *refname", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Ensure there is a reflog for a particular reference.

\n", - "comments": "

Make sure that successive updates to the reference will append to its log.

\n", - "group": "reference" - }, - "git_reference_is_branch": { - "type": "function", - "file": "git2/refs.h", - "line": 626, - "lineto": 626, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/heads\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a local branch.

\n", - "comments": "", - "group": "reference" - }, - "git_reference_is_remote": { - "type": "function", - "file": "git2/refs.h", - "line": 636, - "lineto": 636, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/remotes\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a remote tracking branch

\n", - "comments": "", - "group": "reference", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_reference_is_remote-21" - ] - } - }, - "git_reference_is_tag": { - "type": "function", - "file": "git2/refs.h", - "line": 646, - "lineto": 646, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/tags\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a tag

\n", - "comments": "", - "group": "reference" - }, - "git_reference_is_note": { - "type": "function", - "file": "git2/refs.h", - "line": 656, - "lineto": 656, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "A git reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "int", - "comment": " 1 when the reference lives in the refs/notes\n namespace; 0 otherwise." - }, - "description": "

Check if a reference is a note

\n", - "comments": "", - "group": "reference" - }, - "git_reference_normalize_name": { - "type": "function", - "file": "git2/refs.h", - "line": 712, - "lineto": 716, - "args": [ - { - "name": "buffer_out", - "type": "char *", - "comment": "User allocated buffer to store normalized name" - }, - { - "name": "buffer_size", - "type": "size_t", - "comment": "Size of buffer_out" - }, - { - "name": "name", - "type": "const char *", - "comment": "Reference name to be checked." - }, - { - "name": "flags", - "type": "unsigned int", - "comment": "Flags to constrain name validation rules - see the\n GIT_REFERENCE_FORMAT constants above." - } - ], - "argline": "char *buffer_out, size_t buffer_size, const char *name, unsigned int flags", - "sig": "char *::size_t::const char *::unsigned int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code." - }, - "description": "

Normalize reference name and check validity.

\n", - "comments": "

This will normalize the reference name by removing any leading slash '/' characters and collapsing runs of adjacent slashes between name components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", - "group": "reference" - }, - "git_reference_peel": { - "type": "function", - "file": "git2/refs.h", - "line": 733, - "lineto": 736, - "args": [ - { - "name": "out", - "type": "git_object **", - "comment": "Pointer to the peeled git_object" - }, - { - "name": "ref", - "type": "const git_reference *", - "comment": "The reference to be processed" - }, - { - "name": "type", - "type": "git_object_t", - "comment": "The type of the requested object (GIT_OBJECT_COMMIT,\n GIT_OBJECT_TAG, GIT_OBJECT_TREE, GIT_OBJECT_BLOB or GIT_OBJECT_ANY)." - } - ], - "argline": "git_object **out, const git_reference *ref, git_object_t type", - "sig": "git_object **::const git_reference *::git_object_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" - }, - "description": "

Recursively peel reference until object of the specified type is found.

\n", - "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", - "group": "reference", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_reference_peel-30" - ] - } - }, - "git_reference_name_is_valid": { - "type": "function", - "file": "git2/refs.h", - "line": 753, - "lineto": 753, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given reference name" - }, - { - "name": "refname", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "int *valid, const char *refname", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Ensure the reference name is well-formed.

\n", - "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", - "group": "reference" - }, - "git_reference_shorthand": { - "type": "function", - "file": "git2/refs.h", - "line": 767, - "lineto": 767, - "args": [ - { - "name": "ref", - "type": "const git_reference *", - "comment": "a reference" - } - ], - "argline": "const git_reference *ref", - "sig": "const git_reference *", - "return": { - "type": "const char *", - "comment": " the human-readable version of the name" - }, - "description": "

Get the reference's short name

\n", - "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", - "group": "reference", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_reference_shorthand-2" - ] - } - }, - "git_refspec_parse": { - "type": "function", - "file": "git2/refspec.h", - "line": 32, - "lineto": 32, - "args": [ - { - "name": "refspec", - "type": "git_refspec **", - "comment": "a pointer to hold the refspec handle" - }, - { - "name": "input", - "type": "const char *", - "comment": "the refspec string" - }, - { - "name": "is_fetch", - "type": "int", - "comment": "is this a refspec for a fetch" - } - ], - "argline": "git_refspec **refspec, const char *input, int is_fetch", - "sig": "git_refspec **::const char *::int", - "return": { - "type": "int", - "comment": " 0 if the refspec string could be parsed, -1 otherwise" - }, - "description": "

Parse a given refspec string

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_free": { - "type": "function", - "file": "git2/refspec.h", - "line": 39, - "lineto": 39, - "args": [ - { - "name": "refspec", - "type": "git_refspec *", - "comment": "the refspec object" - } - ], - "argline": "git_refspec *refspec", - "sig": "git_refspec *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a refspec object which has been created by git_refspec_parse

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_src": { - "type": "function", - "file": "git2/refspec.h", - "line": 47, - "lineto": 47, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "const char *", - "comment": " the refspec's source specifier" - }, - "description": "

Get the source specifier

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_dst": { - "type": "function", - "file": "git2/refspec.h", - "line": 55, - "lineto": 55, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "const char *", - "comment": " the refspec's destination specifier" - }, - "description": "

Get the destination specifier

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_string": { - "type": "function", - "file": "git2/refspec.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "const char *", - "comment": null - }, - "description": "

Get the refspec's string

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_force": { - "type": "function", - "file": "git2/refspec.h", - "line": 71, - "lineto": 71, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - } - ], - "argline": "const git_refspec *refspec", - "sig": "const git_refspec *", - "return": { - "type": "int", - "comment": " 1 if force update has been set, 0 otherwise" - }, - "description": "

Get the force update setting

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_direction": { - "type": "function", - "file": "git2/refspec.h", - "line": 79, - "lineto": 79, - "args": [ - { - "name": "spec", - "type": "const git_refspec *", - "comment": "refspec" - } - ], - "argline": "const git_refspec *spec", - "sig": "const git_refspec *", - "return": { - "type": "git_direction", - "comment": " GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" - }, - "description": "

Get the refspec's direction.

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_src_matches": { - "type": "function", - "file": "git2/refspec.h", - "line": 88, - "lineto": 88, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the name of the reference to check" - } - ], - "argline": "const git_refspec *refspec, const char *refname", - "sig": "const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 1 if the refspec matches, 0 otherwise" - }, - "description": "

Check if a refspec's source descriptor matches a reference

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_dst_matches": { - "type": "function", - "file": "git2/refspec.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "refspec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the name of the reference to check" - } - ], - "argline": "const git_refspec *refspec, const char *refname", - "sig": "const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 1 if the refspec matches, 0 otherwise" - }, - "description": "

Check if a refspec's destination descriptor matches a reference

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_transform": { - "type": "function", - "file": "git2/refspec.h", - "line": 107, - "lineto": 107, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "where to store the target name" - }, - { - "name": "spec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the reference to transform" - } - ], - "argline": "git_buf *out, const git_refspec *spec, const char *name", - "sig": "git_buf *::const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EBUFS or another error" - }, - "description": "

Transform a reference to its target following the refspec's rules

\n", - "comments": "", - "group": "refspec" - }, - "git_refspec_rtransform": { - "type": "function", - "file": "git2/refspec.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "where to store the source reference name" - }, - { - "name": "spec", - "type": "const git_refspec *", - "comment": "the refspec" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the reference to transform" - } - ], - "argline": "git_buf *out, const git_refspec *spec, const char *name", - "sig": "git_buf *::const git_refspec *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EBUFS or another error" - }, - "description": "

Transform a target reference to its source reference following the refspec's rules

\n", - "comments": "", - "group": "refspec" - }, - "git_remote_create": { - "type": "function", - "file": "git2/remote.h", - "line": 38, - "lineto": 42, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the remote" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name, const char *url", - "sig": "git_remote **::git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Add a remote with the default fetch refspec to the repository's configuration.

\n", - "comments": "", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_create-1" - ] - } - }, - "git_remote_create_options_init": { - "type": "function", - "file": "git2/remote.h", - "line": 121, - "lineto": 123, - "args": [ - { - "name": "opts", - "type": "git_remote_create_options *", - "comment": "The `git_remote_create_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REMOTE_CREATE_OPTIONS_VERSION`." - } - ], - "argline": "git_remote_create_options *opts, unsigned int version", - "sig": "git_remote_create_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_remote_create_options structure

\n", - "comments": "

Initializes a git_remote_create_options with default values. Equivalent to creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", - "group": "remote" - }, - "git_remote_create_with_opts": { - "type": "function", - "file": "git2/remote.h", - "line": 137, - "lineto": 140, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - }, - { - "name": "opts", - "type": "const git_remote_create_options *", - "comment": "the remote creation options" - } - ], - "argline": "git_remote **out, const char *url, const git_remote_create_options *opts", - "sig": "git_remote **::const char *::const git_remote_create_options *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Create a remote, with options.

\n", - "comments": "

This function allows more fine-grained control over the remote creation.

\n\n

Passing NULL as the opts argument will result in a detached remote.

\n", - "group": "remote" - }, - "git_remote_create_with_fetchspec": { - "type": "function", - "file": "git2/remote.h", - "line": 153, - "lineto": 158, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the remote" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - }, - { - "name": "fetch", - "type": "const char *", - "comment": "the remote fetch value" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch", - "sig": "git_remote **::git_repository *::const char *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Add a remote with the provided fetch refspec (or default if NULL) to the repository's\n configuration.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_create_anonymous": { - "type": "function", - "file": "git2/remote.h", - "line": 171, - "lineto": 174, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "pointer to the new remote objects" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the associated repository" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote repository's URL" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *url", - "sig": "git_remote **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create an anonymous remote

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.7.2/fetch.html#git_remote_create_anonymous-4" - ], - "ls-remote.c": [ - "ex/v1.7.2/ls-remote.html#git_remote_create_anonymous-2" - ] - } - }, - "git_remote_create_detached": { - "type": "function", - "file": "git2/remote.h", - "line": 190, - "lineto": 192, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "pointer to the new remote objects" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote repository's URL" - } - ], - "argline": "git_remote **out, const char *url", - "sig": "git_remote **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a remote without a connected local repo

\n", - "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote will not consider any repo configuration values (such as insteadof url substitutions).

\n", - "group": "remote" - }, - "git_remote_lookup": { - "type": "function", - "file": "git2/remote.h", - "line": 205, - "lineto": 205, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "pointer to the new remote object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the associated repository" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name", - "sig": "git_remote **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Get the information for a particular remote

\n", - "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.7.2/fetch.html#git_remote_lookup-5" - ], - "ls-remote.c": [ - "ex/v1.7.2/ls-remote.html#git_remote_lookup-3" - ], - "push.c": [ - "ex/v1.7.2/push.html#git_remote_lookup-1" - ], - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_lookup-2" - ] - } - }, - "git_remote_dup": { - "type": "function", - "file": "git2/remote.h", - "line": 217, - "lineto": 217, - "args": [ - { - "name": "dest", - "type": "git_remote **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "git_remote *", - "comment": "object to copy" - } - ], - "argline": "git_remote **dest, git_remote *source", - "sig": "git_remote **::git_remote *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an existing remote. All internal strings are also\n duplicated. Callbacks are not duplicated.

\n", - "comments": "

Call git_remote_free to free the data.

\n", - "group": "remote" - }, - "git_remote_owner": { - "type": "function", - "file": "git2/remote.h", - "line": 225, - "lineto": 225, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "git_repository *", - "comment": " a pointer to the repository" - }, - "description": "

Get the remote's repository

\n", - "comments": "", - "group": "remote" - }, - "git_remote_name": { - "type": "function", - "file": "git2/remote.h", - "line": 233, - "lineto": 233, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "const char *", - "comment": " a pointer to the name or NULL for in-memory remotes" - }, - "description": "

Get the remote's name

\n", - "comments": "", - "group": "remote" - }, - "git_remote_url": { - "type": "function", - "file": "git2/remote.h", - "line": 245, - "lineto": 245, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "const char *", - "comment": " a pointer to the url" - }, - "description": "

Get the remote's url

\n", - "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_url-3" - ] - } - }, - "git_remote_pushurl": { - "type": "function", - "file": "git2/remote.h", - "line": 257, - "lineto": 257, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "const char *", - "comment": " a pointer to the url or NULL if no special url for pushing is set" - }, - "description": "

Get the remote's url for pushing.

\n", - "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_pushurl-4" - ] - } - }, - "git_remote_set_url": { - "type": "function", - "file": "git2/remote.h", - "line": 270, - "lineto": 270, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the change" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_repository *repo, const char *remote, const char *url", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error value" - }, - "description": "

Set the remote's url in the configuration

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_set_url-5" - ] - } - }, - "git_remote_set_pushurl": { - "type": "function", - "file": "git2/remote.h", - "line": 284, - "lineto": 284, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to perform the change" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_repository *repo, const char *remote, const char *url", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Set the remote's url for pushing in the configuration.

\n", - "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_set_pushurl-6" - ] - } - }, - "git_remote_set_instance_url": { - "type": "function", - "file": "git2/remote.h", - "line": 294, - "lineto": 294, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_remote *remote, const char *url", - "sig": "git_remote *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error value" - }, - "description": "

Set the url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_set_instance_pushurl": { - "type": "function", - "file": "git2/remote.h", - "line": 304, - "lineto": 304, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the url to set" - } - ], - "argline": "git_remote *remote, const char *url", - "sig": "git_remote *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error value" - }, - "description": "

Set the push url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_add_fetch": { - "type": "function", - "file": "git2/remote.h", - "line": 317, - "lineto": 317, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to change the configuration" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the name of the remote to change" - }, - { - "name": "refspec", - "type": "const char *", - "comment": "the new fetch refspec" - } - ], - "argline": "git_repository *repo, const char *remote, const char *refspec", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" - }, - "description": "

Add a fetch refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the fetch list in the configuration. No loaded remote instances will be affected.

\n", - "group": "remote" - }, - "git_remote_get_fetch_refspecs": { - "type": "function", - "file": "git2/remote.h", - "line": 329, - "lineto": 329, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "pointer to the array in which to store the strings" - }, - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "git_strarray *array, const git_remote *remote", - "sig": "git_strarray *::const git_remote *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Get the remote's list of fetch refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", - "group": "remote" - }, - "git_remote_add_push": { - "type": "function", - "file": "git2/remote.h", - "line": 342, - "lineto": 342, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to change the configuration" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the name of the remote to change" - }, - { - "name": "refspec", - "type": "const char *", - "comment": "the new push refspec" - } - ], - "argline": "git_repository *repo, const char *remote, const char *refspec", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" - }, - "description": "

Add a push refspec to the remote's configuration

\n", - "comments": "

Add the given refspec to the push list in the configuration. No loaded remote instances will be affected.

\n", - "group": "remote" - }, - "git_remote_get_push_refspecs": { - "type": "function", - "file": "git2/remote.h", - "line": 354, - "lineto": 354, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "pointer to the array in which to store the strings" - }, - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "git_strarray *array, const git_remote *remote", - "sig": "git_strarray *::const git_remote *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Get the remote's list of push refspecs

\n", - "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", - "group": "remote" - }, - "git_remote_refspec_count": { - "type": "function", - "file": "git2/remote.h", - "line": 362, - "lineto": 362, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "size_t", - "comment": " the amount of refspecs configured in this remote" - }, - "description": "

Get the number of refspecs for a remote

\n", - "comments": "", - "group": "remote" - }, - "git_remote_get_refspec": { - "type": "function", - "file": "git2/remote.h", - "line": 371, - "lineto": 371, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - }, - { - "name": "n", - "type": "size_t", - "comment": "the refspec to get" - } - ], - "argline": "const git_remote *remote, size_t n", - "sig": "const git_remote *::size_t", - "return": { - "type": "const git_refspec *", - "comment": " the nth refspec" - }, - "description": "

Get a refspec from the remote

\n", - "comments": "", - "group": "remote" - }, - "git_remote_ls": { - "type": "function", - "file": "git2/remote.h", - "line": 393, - "lineto": 393, - "args": [ - { - "name": "out", - "type": "const git_remote_head ***", - "comment": "pointer to the array" - }, - { - "name": "size", - "type": "size_t *", - "comment": "the number of remote heads" - }, - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote_head ***out, size_t *size, git_remote *remote", - "sig": "const git_remote_head ***::size_t *::git_remote *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Get the remote repository's reference advertisement list

\n", - "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", - "group": "remote", - "examples": { - "ls-remote.c": [ - "ex/v1.7.2/ls-remote.html#git_remote_ls-4" - ] - } - }, - "git_remote_connected": { - "type": "function", - "file": "git2/remote.h", - "line": 404, - "lineto": 404, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "int", - "comment": " 1 if it's connected, 0 otherwise." - }, - "description": "

Check whether the remote is connected

\n", - "comments": "

Check whether the remote's underlying transport is connected to the remote host.

\n", - "group": "remote" - }, - "git_remote_stop": { - "type": "function", - "file": "git2/remote.h", - "line": 415, - "lineto": 415, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Cancel the operation

\n", - "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", - "group": "remote" - }, - "git_remote_disconnect": { - "type": "function", - "file": "git2/remote.h", - "line": 425, - "lineto": 425, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to disconnect from" - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Disconnect from the remote

\n", - "comments": "

Close the connection to the remote.

\n", - "group": "remote" - }, - "git_remote_free": { - "type": "function", - "file": "git2/remote.h", - "line": 435, - "lineto": 435, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to free" - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the memory associated with a remote

\n", - "comments": "

This also disconnects from the remote, if the connection has not been closed yet (using git_remote_disconnect).

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.7.2/fetch.html#git_remote_free-6", - "ex/v1.7.2/fetch.html#git_remote_free-7" - ], - "ls-remote.c": [ - "ex/v1.7.2/ls-remote.html#git_remote_free-5" - ], - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_free-7" - ] - } - }, - "git_remote_list": { - "type": "function", - "file": "git2/remote.h", - "line": 446, - "lineto": 446, - "args": [ - { - "name": "out", - "type": "git_strarray *", - "comment": "a string array which receives the names of the remotes" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to query" - } - ], - "argline": "git_strarray *out, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get a list of the configured remotes for a repo

\n", - "comments": "

The string array must be freed by the user.

\n", - "group": "remote", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_remote_list-22" - ], - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_list-8" - ] - } - }, - "git_remote_init_callbacks": { - "type": "function", - "file": "git2/remote.h", - "line": 660, - "lineto": 662, - "args": [ - { - "name": "opts", - "type": "git_remote_callbacks *", - "comment": "the `git_remote_callbacks` struct to initialize" - }, - { - "name": "version", - "type": "unsigned int", - "comment": "Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION`" - } - ], - "argline": "git_remote_callbacks *opts, unsigned int version", - "sig": "git_remote_callbacks *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initializes a git_remote_callbacks with default values. Equivalent to\n creating an instance with GIT_REMOTE_CALLBACKS_INIT.

\n", - "comments": "", - "group": "remote" - }, - "git_fetch_options_init": { - "type": "function", - "file": "git2/remote.h", - "line": 791, - "lineto": 793, - "args": [ - { - "name": "opts", - "type": "git_fetch_options *", - "comment": "The `git_fetch_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_FETCH_OPTIONS_VERSION`." - } - ], - "argline": "git_fetch_options *opts, unsigned int version", - "sig": "git_fetch_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_fetch_options structure

\n", - "comments": "

Initializes a git_fetch_options with default values. Equivalent to creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", - "group": "fetch" - }, - "git_push_options_init": { - "type": "function", - "file": "git2/remote.h", - "line": 848, - "lineto": 850, - "args": [ - { - "name": "opts", - "type": "git_push_options *", - "comment": "The `git_push_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_PUSH_OPTIONS_VERSION`." - } - ], - "argline": "git_push_options *opts, unsigned int version", - "sig": "git_push_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_push_options structure

\n", - "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", - "group": "push", - "examples": { - "push.c": [ - "ex/v1.7.2/push.html#git_push_options_init-2" - ] - } - }, - "git_remote_connect_options_init": { - "type": "function", - "file": "git2/remote.h", - "line": 896, - "lineto": 898, - "args": [ - { - "name": "opts", - "type": "git_remote_connect_options *", - "comment": "The `git_remote_connect_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REMOTE_CONNECT_OPTIONS_VERSION`." - } - ], - "argline": "git_remote_connect_options *opts, unsigned int version", - "sig": "git_remote_connect_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_remote_connect_options structure.

\n", - "comments": "

Initializes a git_remote_connect_options with default values. Equivalent to creating an instance with GIT_REMOTE_CONNECT_OPTIONS_INIT.

\n", - "group": "remote" - }, - "git_remote_connect": { - "type": "function", - "file": "git2/remote.h", - "line": 915, - "lineto": 920, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to connect to" - }, - { - "name": "direction", - "type": "git_direction", - "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" - }, - { - "name": "callbacks", - "type": "const git_remote_callbacks *", - "comment": "the callbacks to use for this connection" - }, - { - "name": "proxy_opts", - "type": "const git_proxy_options *", - "comment": "proxy settings" - }, - { - "name": "custom_headers", - "type": "const git_strarray *", - "comment": "extra HTTP headers to use in this connection" - } - ], - "argline": "git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_proxy_options *proxy_opts, const git_strarray *custom_headers", - "sig": "git_remote *::git_direction::const git_remote_callbacks *::const git_proxy_options *::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open a connection to a remote.

\n", - "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n", - "group": "remote", - "examples": { - "ls-remote.c": [ - "ex/v1.7.2/ls-remote.html#git_remote_connect-6" - ] - } - }, - "git_remote_connect_ext": { - "type": "function", - "file": "git2/remote.h", - "line": 940, - "lineto": 943, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to connect to" - }, - { - "name": "direction", - "type": "git_direction", - "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" - }, - { - "name": "opts", - "type": "const git_remote_connect_options *", - "comment": "the remote connection options" - } - ], - "argline": "git_remote *remote, git_direction direction, const git_remote_connect_options *opts", - "sig": "git_remote *::git_direction::const git_remote_connect_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open a connection to a remote with extended options.

\n", - "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n\n

The given options structure will form the defaults for connection options and callback setup. Callers may override these defaults by specifying git_fetch_options or git_push_options in subsequent calls.

\n", - "group": "remote" - }, - "git_remote_download": { - "type": "function", - "file": "git2/remote.h", - "line": 965, - "lineto": 968, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for this negotiation and\n download. Use NULL or an empty array to use the base refspecs" - }, - { - "name": "opts", - "type": "const git_fetch_options *", - "comment": "the options to use for this fetch or NULL" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts", - "sig": "git_remote *::const git_strarray *::const git_fetch_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Download and index the packfile.

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, download and index the packfile.

\n\n

The .idx file will be created and both it and the packfile with be renamed to their final name.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", - "group": "remote" - }, - "git_remote_upload": { - "type": "function", - "file": "git2/remote.h", - "line": 987, - "lineto": 990, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for this negotiation and\n upload. Use NULL or an empty array to use the base refspecs" - }, - { - "name": "opts", - "type": "const git_push_options *", - "comment": "the options to use for this push" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", - "sig": "git_remote *::const git_strarray *::const git_push_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a packfile and send it to the server

\n", - "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, create a packfile with the missing objects and send it.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", - "group": "remote" - }, - "git_remote_update_tips": { - "type": "function", - "file": "git2/remote.h", - "line": 1009, - "lineto": 1014, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to update" - }, - { - "name": "callbacks", - "type": "const git_remote_callbacks *", - "comment": "pointer to the callback structure to use or NULL" - }, - { - "name": "update_fetchhead", - "type": "int", - "comment": "whether to write to FETCH_HEAD. Pass 1 to behave like git." - }, - { - "name": "download_tags", - "type": "git_remote_autotag_option_t", - "comment": "what the behaviour for downloading tags is for this fetch. This is\n ignored for push. This must be the same value passed to `git_remote_download()`." - }, - { - "name": "reflog_message", - "type": "const char *", - "comment": "The message to insert into the reflogs. If\n NULL and fetching, the default is \"fetch \n\", where \n is\n the name of the remote (or its url, for in-memory remotes). This\n parameter is ignored when pushing." - } - ], - "argline": "git_remote *remote, const git_remote_callbacks *callbacks, int update_fetchhead, git_remote_autotag_option_t download_tags, const char *reflog_message", - "sig": "git_remote *::const git_remote_callbacks *::int::git_remote_autotag_option_t::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Update the tips to the new state.

\n", - "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", - "group": "remote" - }, - "git_remote_fetch": { - "type": "function", - "file": "git2/remote.h", - "line": 1034, - "lineto": 1038, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to fetch from" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for this fetch. Pass NULL or an\n empty array to use the base refspecs." - }, - { - "name": "opts", - "type": "const git_fetch_options *", - "comment": "options to use for this fetch or NULL" - }, - { - "name": "reflog_message", - "type": "const char *", - "comment": "The message to insert into the reflogs. If NULL, the\n\t\t\t\t\t\t\t\t default is \"fetch\"" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts, const char *reflog_message", - "sig": "git_remote *::const git_strarray *::const git_fetch_options *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Download new data and update tips.

\n", - "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.7.2/fetch.html#git_remote_fetch-8" - ] - } - }, - "git_remote_prune": { - "type": "function", - "file": "git2/remote.h", - "line": 1050, - "lineto": 1052, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to prune" - }, - { - "name": "callbacks", - "type": "const git_remote_callbacks *", - "comment": "callbacks to use for this prune" - } - ], - "argline": "git_remote *remote, const git_remote_callbacks *callbacks", - "sig": "git_remote *::const git_remote_callbacks *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Prune tracking refs that are no longer present on remote.

\n", - "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", - "group": "remote" - }, - "git_remote_push": { - "type": "function", - "file": "git2/remote.h", - "line": 1067, - "lineto": 1070, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote to push to" - }, - { - "name": "refspecs", - "type": "const git_strarray *", - "comment": "the refspecs to use for pushing. If NULL or an empty\n array, the configured refspecs will be used" - }, - { - "name": "opts", - "type": "const git_push_options *", - "comment": "options to use for this push" - } - ], - "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", - "sig": "git_remote *::const git_strarray *::const git_push_options *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Perform a push.

\n", - "comments": "

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", - "group": "remote", - "examples": { - "push.c": [ - "ex/v1.7.2/push.html#git_remote_push-3" - ] - } - }, - "git_remote_stats": { - "type": "function", - "file": "git2/remote.h", - "line": 1075, - "lineto": 1075, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": null - } - ], - "argline": "git_remote *remote", - "sig": "git_remote *", - "return": { - "type": "const git_indexer_progress *", - "comment": null - }, - "description": "

Get the statistics structure that is filled in by the fetch operation.

\n", - "comments": "", - "group": "remote", - "examples": { - "fetch.c": [ - "ex/v1.7.2/fetch.html#git_remote_stats-9" - ] - } - }, - "git_remote_autotag": { - "type": "function", - "file": "git2/remote.h", - "line": 1083, - "lineto": 1083, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "git_remote_autotag_option_t", - "comment": " the auto-follow setting" - }, - "description": "

Retrieve the tag auto-follow setting

\n", - "comments": "", - "group": "remote" - }, - "git_remote_set_autotag": { - "type": "function", - "file": "git2/remote.h", - "line": 1096, - "lineto": 1096, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to make the change" - }, - { - "name": "remote", - "type": "const char *", - "comment": "the name of the remote" - }, - { - "name": "value", - "type": "git_remote_autotag_option_t", - "comment": "the new value to take." - } - ], - "argline": "git_repository *repo, const char *remote, git_remote_autotag_option_t value", - "sig": "git_repository *::const char *::git_remote_autotag_option_t", - "return": { - "type": "int", - "comment": " 0, or an error code." - }, - "description": "

Set the remote's tag following setting.

\n", - "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", - "group": "remote" - }, - "git_remote_prune_refs": { - "type": "function", - "file": "git2/remote.h", - "line": 1104, - "lineto": 1104, - "args": [ - { - "name": "remote", - "type": "const git_remote *", - "comment": "the remote to query" - } - ], - "argline": "const git_remote *remote", - "sig": "const git_remote *", - "return": { - "type": "int", - "comment": " the ref-prune setting" - }, - "description": "

Retrieve the ref-prune setting

\n", - "comments": "", - "group": "remote" - }, - "git_remote_rename": { - "type": "function", - "file": "git2/remote.h", - "line": 1126, - "lineto": 1130, - "args": [ - { - "name": "problems", - "type": "git_strarray *", - "comment": "non-default refspecs cannot be renamed and will be\n stored here for further processing by the caller. Always free this\n strarray on successful return." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to rename" - }, - { - "name": "name", - "type": "const char *", - "comment": "the current name of the remote" - }, - { - "name": "new_name", - "type": "const char *", - "comment": "the new name the remote should bear" - } - ], - "argline": "git_strarray *problems, git_repository *repo, const char *name, const char *new_name", - "sig": "git_strarray *::git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

Give the remote a new name

\n", - "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_rename-9" - ] - } - }, - "git_remote_name_is_valid": { - "type": "function", - "file": "git2/remote.h", - "line": 1139, - "lineto": 1139, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given remote name" - }, - { - "name": "remote_name", - "type": "const char *", - "comment": "name to be checked." - } - ], - "argline": "int *valid, const char *remote_name", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Ensure the remote name is well-formed.

\n", - "comments": "", - "group": "remote" - }, - "git_remote_delete": { - "type": "function", - "file": "git2/remote.h", - "line": 1151, - "lineto": 1151, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to act" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the remote to delete" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code." - }, - "description": "

Delete an existing persisted remote.

\n", - "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", - "group": "remote", - "examples": { - "remote.c": [ - "ex/v1.7.2/remote.html#git_remote_delete-10" - ] - } - }, - "git_remote_default_branch": { - "type": "function", - "file": "git2/remote.h", - "line": 1169, - "lineto": 1169, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer in which to store the reference name" - }, - { - "name": "remote", - "type": "git_remote *", - "comment": "the remote" - } - ], - "argline": "git_buf *out, git_remote *remote", - "sig": "git_buf *::git_remote *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message." - }, - "description": "

Retrieve the name of the remote's default branch

\n", - "comments": "

The default branch of a repository is the branch which HEAD points to. If the remote does not support reporting this information directly, it performs the guess as git does; that is, if there are multiple branches which point to the same commit, the first one is chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", - "group": "remote" - }, - "git_repository_open": { - "type": "function", - "file": "git2/repository.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "pointer to the repo which will be opened" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path to the repository" - } - ], - "argline": "git_repository **out, const char *path", - "sig": "git_repository **::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open a git repository.

\n", - "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n", - "group": "repository", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_repository_open-59" - ] - } - }, - "git_repository_open_from_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 48, - "lineto": 48, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Output pointer containing opened repository" - }, - { - "name": "wt", - "type": "git_worktree *", - "comment": "Working tree to open" - } - ], - "argline": "git_repository **out, git_worktree *wt", - "sig": "git_repository **::git_worktree *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open working tree as a repository

\n", - "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", - "group": "repository" - }, - "git_repository_discover": { - "type": "function", - "file": "git2/repository.h", - "line": 99, - "lineto": 103, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "A pointer to a user-allocated git_buf which will contain\n the found path." - }, - { - "name": "start_path", - "type": "const char *", - "comment": "The base path where the lookup starts." - }, - { - "name": "across_fs", - "type": "int", - "comment": "If true, then the lookup will not stop when a\n filesystem device change is detected while exploring parent directories." - }, - { - "name": "ceiling_dirs", - "type": "const char *", - "comment": "A GIT_PATH_LIST_SEPARATOR separated list of\n absolute symbolic link free paths. The lookup will stop when any\n of this paths is reached. Note that the lookup always performs on\n start_path no matter start_path appears in ceiling_dirs ceiling_dirs\n might be NULL (which is equivalent to an empty string)" - } - ], - "argline": "git_buf *out, const char *start_path, int across_fs, const char *ceiling_dirs", - "sig": "git_buf *::const char *::int::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", - "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n", - "group": "repository" - }, - "git_repository_open_ext": { - "type": "function", - "file": "git2/repository.h", - "line": 175, - "lineto": 179, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Pointer to the repo which will be opened. This can\n actually be NULL if you only want to use the error code to\n see if a repo at this path could be opened." - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to open as git repository. If the flags\n permit \"searching\", then this can be a path to a subdirectory\n inside the working directory of the repository. May be NULL if\n flags is GIT_REPOSITORY_OPEN_FROM_ENV." - }, - { - "name": "flags", - "type": "unsigned int", - "comment": "A combination of the GIT_REPOSITORY_OPEN flags above." - }, - { - "name": "ceiling_dirs", - "type": "const char *", - "comment": "A GIT_PATH_LIST_SEPARATOR delimited list of path\n prefixes at which the search for a containing repository should\n terminate." - } - ], - "argline": "git_repository **out, const char *path, unsigned int flags, const char *ceiling_dirs", - "sig": "git_repository **::const char *::unsigned int::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if no repository could be found,\n or -1 if there was a repository but open failed for some reason\n (such as repo corruption or system errors)." - }, - "description": "

Find and open a repository with extended controls.

\n", - "comments": "", - "group": "repository", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_repository_open_ext-43" - ] - } - }, - "git_repository_open_bare": { - "type": "function", - "file": "git2/repository.h", - "line": 192, - "lineto": 192, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Pointer to the repo which will be opened." - }, - { - "name": "bare_path", - "type": "const char *", - "comment": "Direct path to the bare repository" - } - ], - "argline": "git_repository **out, const char *bare_path", - "sig": "git_repository **::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Open a bare repository on the serverside.

\n", - "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n", - "group": "repository" - }, - "git_repository_free": { - "type": "function", - "file": "git2/repository.h", - "line": 205, - "lineto": 205, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository handle to close. If NULL nothing occurs." - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a previously allocated repository

\n", - "comments": "

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_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", - "group": "repository", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_repository_free-60" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_repository_free-4" - ] - } - }, - "git_repository_init": { - "type": "function", - "file": "git2/repository.h", - "line": 222, - "lineto": 225, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "pointer to the repo which will be created or reinitialized" - }, - { - "name": "path", - "type": "const char *", - "comment": "the path to the repository" - }, - { - "name": "is_bare", - "type": "unsigned int", - "comment": "if true, a Git repository without a working directory is\n\t\tcreated at the pointed path. If false, provided path will be\n\t\tconsidered as the working directory into which the .git directory\n\t\twill be created." - } - ], - "argline": "git_repository **out, const char *path, unsigned int is_bare", - "sig": "git_repository **::const char *::unsigned int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Creates a new Git repository in the given folder.

\n", - "comments": "

TODO: - Reinit the repository

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.7.2/init.html#git_repository_init-5" - ] - } - }, - "git_repository_init_options_init": { - "type": "function", - "file": "git2/repository.h", - "line": 388, - "lineto": 390, - "args": [ - { - "name": "opts", - "type": "git_repository_init_options *", - "comment": "The `git_repository_init_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`." - } - ], - "argline": "git_repository_init_options *opts, unsigned int version", - "sig": "git_repository_init_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_repository_init_options structure

\n", - "comments": "

Initializes a git_repository_init_options with default values. Equivalent to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", - "group": "repository" - }, - "git_repository_init_ext": { - "type": "function", - "file": "git2/repository.h", - "line": 405, - "lineto": 408, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Pointer to the repo which will be created or reinitialized." - }, - { - "name": "repo_path", - "type": "const char *", - "comment": "The path to the repository." - }, - { - "name": "opts", - "type": "git_repository_init_options *", - "comment": "Pointer to git_repository_init_options struct." - } - ], - "argline": "git_repository **out, const char *repo_path, git_repository_init_options *opts", - "sig": "git_repository **::const char *::git_repository_init_options *", - "return": { - "type": "int", - "comment": " 0 or an error code on failure." - }, - "description": "

Create a new Git repository in the given folder with extended controls.

\n", - "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.7.2/init.html#git_repository_init_ext-6" - ] - } - }, - "git_repository_head": { - "type": "function", - "file": "git2/repository.h", - "line": 423, - "lineto": 423, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the reference which will be retrieved" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - } - ], - "argline": "git_reference **out, git_repository *repo", - "sig": "git_reference **::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise" - }, - "description": "

Retrieve and resolve the reference pointed at by HEAD.

\n", - "comments": "

The returned git_reference will be owned by caller and git_reference_free() must be called when done with it to release the allocated memory and prevent a leak.

\n", - "group": "repository", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_repository_head-31", - "ex/v1.7.2/merge.html#git_repository_head-32" - ], - "status.c": [ - "ex/v1.7.2/status.html#git_repository_head-3" - ] - } - }, - "git_repository_head_for_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 433, - "lineto": 434, - "args": [ - { - "name": "out", - "type": "git_reference **", - "comment": "pointer to the reference which will be retrieved" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the worktree to retrieve HEAD for" - } - ], - "argline": "git_reference **out, git_repository *repo, const char *name", - "sig": "git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 when successful, error-code otherwise" - }, - "description": "

Retrieve the referenced HEAD for the worktree

\n", - "comments": "", - "group": "repository" - }, - "git_repository_head_detached": { - "type": "function", - "file": "git2/repository.h", - "line": 446, - "lineto": 446, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repo to test" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if HEAD is detached, 0 if it's not; error code if there\n was an error." - }, - "description": "

Check if a repository's HEAD is detached

\n", - "comments": "

A repository's HEAD is detached when it points directly to a commit instead of a branch.

\n", - "group": "repository" - }, - "git_repository_head_detached_for_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 459, - "lineto": 460, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "a repository object" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the worktree to retrieve HEAD for" - } - ], - "argline": "git_repository *repo, const char *name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 1 if HEAD is detached, 0 if its not; error code if\n there was an error" - }, - "description": "

Check if a worktree's HEAD is detached

\n", - "comments": "

A worktree's HEAD is detached when it points directly to a commit instead of a branch.

\n", - "group": "repository" - }, - "git_repository_head_unborn": { - "type": "function", - "file": "git2/repository.h", - "line": 472, - "lineto": 472, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repo to test" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error" - }, - "description": "

Check if the current branch is unborn

\n", - "comments": "

An unborn 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.

\n", - "group": "repository" - }, - "git_repository_is_empty": { - "type": "function", - "file": "git2/repository.h", - "line": 486, - "lineto": 486, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repo to test" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted" - }, - "description": "

Check if a repository is empty

\n", - "comments": "

An empty repository has just been initialized and contains no references apart from HEAD, which must be pointing to the unborn master branch, or the branch specified for the repository in the init.defaultBranch configuration variable.

\n", - "group": "repository" - }, - "git_repository_item_path": { - "type": "function", - "file": "git2/repository.h", - "line": 523, - "lineto": 523, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "Buffer to store the path at" - }, - { - "name": "repo", - "type": "const git_repository *", - "comment": "Repository to get path for" - }, - { - "name": "item", - "type": "git_repository_item_t", - "comment": "The repository item for which to retrieve the path" - } - ], - "argline": "git_buf *out, const git_repository *repo, git_repository_item_t item", - "sig": "git_buf *::const git_repository *::git_repository_item_t", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the path cannot exist or an error code" - }, - "description": "

Get the location of a specific repository file or directory

\n", - "comments": "

This function will retrieve the path of a specific repository item. It will thereby honor things like the repository's common directory, gitdir, etc. In case a file path cannot exist for a given item (e.g. the working directory of a bare repository), GIT_ENOTFOUND is returned.

\n", - "group": "repository" - }, - "git_repository_path": { - "type": "function", - "file": "git2/repository.h", - "line": 534, - "lineto": 534, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "A repository object" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "const char *", - "comment": " the path to the repository" - }, - "description": "

Get the path of this repository

\n", - "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.7.2/init.html#git_repository_path-7" - ], - "status.c": [ - "ex/v1.7.2/status.html#git_repository_path-4" - ] - } - }, - "git_repository_workdir": { - "type": "function", - "file": "git2/repository.h", - "line": 545, - "lineto": 545, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "A repository object" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "const char *", - "comment": " the path to the working dir, if it exists" - }, - "description": "

Get the path of the working directory for this repository

\n", - "comments": "

If the repository is bare, this function will always return NULL.

\n", - "group": "repository", - "examples": { - "init.c": [ - "ex/v1.7.2/init.html#git_repository_workdir-8" - ] - } - }, - "git_repository_commondir": { - "type": "function", - "file": "git2/repository.h", - "line": 557, - "lineto": 557, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "A repository object" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "const char *", - "comment": " the path to the common dir" - }, - "description": "

Get the path of the shared common directory for this repository.

\n", - "comments": "

If the repository is bare, it is the root directory for the repository. If the repository is a worktree, it is the parent repo's gitdir. Otherwise, it is the gitdir.

\n", - "group": "repository" - }, - "git_repository_set_workdir": { - "type": "function", - "file": "git2/repository.h", - "line": 576, - "lineto": 577, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "workdir", - "type": "const char *", - "comment": "The path to a working directory" - }, - { - "name": "update_gitlink", - "type": "int", - "comment": "Create/update gitlink in workdir and set config\n \"core.worktree\" (if workdir is not the parent of the .git directory)" - } - ], - "argline": "git_repository *repo, const char *workdir, int update_gitlink", - "sig": "git_repository *::const char *::int", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Set the path to the working directory for this repository

\n", - "comments": "

The working directory doesn't need to be the same one that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory will turn it into a normal repository, capable of performing all the common workdir operations (checkout, status, index manipulation, etc).

\n", - "group": "repository" - }, - "git_repository_is_bare": { - "type": "function", - "file": "git2/repository.h", - "line": 585, - "lineto": 585, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "Repo to test" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "int", - "comment": " 1 if the repository is bare, 0 otherwise." - }, - "description": "

Check if a repository is bare

\n", - "comments": "", - "group": "repository", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_repository_is_bare-5" - ] - } - }, - "git_repository_is_worktree": { - "type": "function", - "file": "git2/repository.h", - "line": 593, - "lineto": 593, - "args": [ - { - "name": "repo", - "type": "const git_repository *", - "comment": "Repo to test" - } - ], - "argline": "const git_repository *repo", - "sig": "const git_repository *", - "return": { - "type": "int", - "comment": " 1 if the repository is a linked work tree, 0 otherwise." - }, - "description": "

Check if a repository is a linked work tree

\n", - "comments": "", - "group": "repository" - }, - "git_repository_config": { - "type": "function", - "file": "git2/repository.h", - "line": 609, - "lineto": 609, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "Pointer to store the loaded configuration" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_config **out, git_repository *repo", - "sig": "git_config **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the configuration file for this repository.

\n", - "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "config.c": [ - "ex/v1.7.2/config.html#git_repository_config-9" - ] - } - }, - "git_repository_config_snapshot": { - "type": "function", - "file": "git2/repository.h", - "line": 625, - "lineto": 625, - "args": [ - { - "name": "out", - "type": "git_config **", - "comment": "Pointer to store the loaded configuration" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_config **out, git_repository *repo", - "sig": "git_config **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get a snapshot of the repository's configuration

\n", - "comments": "

Convenience function to take a snapshot from the repository's configuration. The contents of this snapshot will not change, even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_repository_config_snapshot-61", - "ex/v1.7.2/general.html#git_repository_config_snapshot-62" - ] - } - }, - "git_repository_odb": { - "type": "function", - "file": "git2/repository.h", - "line": 641, - "lineto": 641, - "args": [ - { - "name": "out", - "type": "git_odb **", - "comment": "Pointer to store the loaded ODB" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_odb **out, git_repository *repo", - "sig": "git_odb **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the Object Database for this repository.

\n", - "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_repository_odb-29" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_repository_odb-63" - ] - } - }, - "git_repository_refdb": { - "type": "function", - "file": "git2/repository.h", - "line": 657, - "lineto": 657, - "args": [ - { - "name": "out", - "type": "git_refdb **", - "comment": "Pointer to store the loaded refdb" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_refdb **out, git_repository *repo", - "sig": "git_refdb **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the Reference Database Backend for this repository.

\n", - "comments": "

If a custom refsdb has not been set, the default database for the repository will be returned (the one that manipulates loose and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by the user.

\n", - "group": "repository" - }, - "git_repository_index": { - "type": "function", - "file": "git2/repository.h", - "line": 673, - "lineto": 673, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "Pointer to store the loaded index" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_index **out, git_repository *repo", - "sig": "git_index **::git_repository *", - "return": { - "type": "int", - "comment": " 0, or an error code" - }, - "description": "

Get the Index file for this repository.

\n", - "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", - "group": "repository", - "examples": { - "add.c": [ - "ex/v1.7.2/add.html#git_repository_index-5" - ], - "commit.c": [ - "ex/v1.7.2/commit.html#git_repository_index-8" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_repository_index-64" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_repository_index-9" - ], - "ls-files.c": [ - "ex/v1.7.2/ls-files.html#git_repository_index-5" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_repository_index-33" - ] - } - }, - "git_repository_message": { - "type": "function", - "file": "git2/repository.h", - "line": 691, - "lineto": 691, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "git_buf to write data into" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository to read prepared message from" - } - ], - "argline": "git_buf *out, git_repository *repo", - "sig": "git_buf *::git_repository *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if no message exists or an error code" - }, - "description": "

Retrieve git's prepared message

\n", - "comments": "

Operations such as git revert/cherry-pick/merge with the -n option stop just short of creating a commit with the changes and save their prepared message in .git/MERGE_MSG so the next git-commit execution can present it to the user for them to amend if they wish.

\n\n

Use this function to get the contents of this file. Don't forget to remove the file after you create the commit.

\n", - "group": "repository" - }, - "git_repository_message_remove": { - "type": "function", - "file": "git2/repository.h", - "line": 701, - "lineto": 701, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository to remove prepared message from." - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Remove git's prepared message.

\n", - "comments": "

Remove the message that git_repository_message retrieves.

\n", - "group": "repository" - }, - "git_repository_state_cleanup": { - "type": "function", - "file": "git2/repository.h", - "line": 710, - "lineto": 710, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, or error" - }, - "description": "

Remove all the metadata associated with an ongoing command like merge,\n revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc.

\n", - "comments": "", - "group": "repository", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_repository_state_cleanup-34" - ] - } - }, - "git_repository_fetchhead_foreach": { - "type": "function", - "file": "git2/repository.h", - "line": 741, - "lineto": 744, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "callback", - "type": "git_repository_fetchhead_foreach_cb", - "comment": "Callback function" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to callback data (optional)" - } - ], - "argline": "git_repository *repo, git_repository_fetchhead_foreach_cb callback, void *payload", - "sig": "git_repository *::git_repository_fetchhead_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no FETCH_HEAD file, or other error code." - }, - "description": "

Invoke 'callback' for each entry in the given FETCH_HEAD file.

\n", - "comments": "

Return a non-zero value from the callback to stop the loop.

\n", - "group": "repository" - }, - "git_repository_mergehead_foreach": { - "type": "function", - "file": "git2/repository.h", - "line": 770, - "lineto": 773, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "callback", - "type": "git_repository_mergehead_foreach_cb", - "comment": "Callback function" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to callback data (optional)" - } - ], - "argline": "git_repository *repo, git_repository_mergehead_foreach_cb callback, void *payload", - "sig": "git_repository *::git_repository_mergehead_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no MERGE_HEAD file, or other error code." - }, - "description": "

If a merge is in progress, invoke 'callback' for each commit ID in the\n MERGE_HEAD file.

\n", - "comments": "

Return a non-zero value from the callback to stop the loop.

\n", - "group": "repository" - }, - "git_repository_hashfile": { - "type": "function", - "file": "git2/repository.h", - "line": 800, - "lineto": 805, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Output value of calculated SHA" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to file on disk whose contents should be hashed. This\n may be an absolute path or a relative path, in which case it\n will be treated as a path within the working directory." - }, - { - "name": "type", - "type": "git_object_t", - "comment": "The object type to hash as (e.g. GIT_OBJECT_BLOB)" - }, - { - "name": "as_path", - "type": "const char *", - "comment": "The path to use to look up filtering rules. If this is\n an empty string then no filters will be applied when\n calculating the hash. If this is `NULL` and the `path`\n parameter is a file within the repository's working\n directory, then the `path` will be used." - } - ], - "argline": "git_oid *out, git_repository *repo, const char *path, git_object_t type, const char *as_path", - "sig": "git_oid *::git_repository *::const char *::git_object_t::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Calculate hash of file using repository filtering rules.

\n", - "comments": "

If you simply want to calculate the hash of a file on disk with no filters, you can just use the git_odb_hashfile() API. However, if you want to hash a file in the repository and you want to apply filtering rules (e.g. crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the filtering triggers that failure, then this function will return an error and not calculate the hash of the file.

\n", - "group": "repository" - }, - "git_repository_set_head": { - "type": "function", - "file": "git2/repository.h", - "line": 825, - "lineto": 827, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - }, - { - "name": "refname", - "type": "const char *", - "comment": "Canonical name of the reference the HEAD should point at" - } - ], - "argline": "git_repository *repo, const char *refname", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Make the repository HEAD point to the specified reference.

\n", - "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", - "group": "repository", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_repository_set_head-23" - ] - } - }, - "git_repository_set_head_detached": { - "type": "function", - "file": "git2/repository.h", - "line": 845, - "lineto": 847, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - }, - { - "name": "committish", - "type": "const git_oid *", - "comment": "Object id of the Commit the HEAD should point to" - } - ], - "argline": "git_repository *repo, const git_oid *committish", - "sig": "git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 on success, or an error code" - }, - "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

If the provided committish cannot be found in the repository, the HEAD is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided committish cannot be peeled into a commit, the HEAD is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to the peeled Commit.

\n", - "group": "repository" - }, - "git_repository_set_head_detached_from_annotated": { - "type": "function", - "file": "git2/repository.h", - "line": 861, - "lineto": 863, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "committish", - "type": "const git_annotated_commit *", - "comment": null - } - ], - "argline": "git_repository *repo, const git_annotated_commit *committish", - "sig": "git_repository *::const git_annotated_commit *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Make the repository HEAD directly point to the Commit.

\n", - "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", - "group": "repository", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_repository_set_head_detached_from_annotated-24" - ] - } - }, - "git_repository_detach_head": { - "type": "function", - "file": "git2/repository.h", - "line": 882, - "lineto": 883, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code" - }, - "description": "

Detach the HEAD.

\n", - "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non committish, the HEAD is unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", - "group": "repository" - }, - "git_repository_state": { - "type": "function", - "file": "git2/repository.h", - "line": 913, - "lineto": 913, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository pointer" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " The state of the repository" - }, - "description": "

Determines the status of a git repository - ie, whether an operation\n (merge, cherry-pick, etc) is in progress.

\n", - "comments": "", - "group": "repository", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_repository_state-25" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_repository_state-35" - ] - } - }, - "git_repository_set_namespace": { - "type": "function", - "file": "git2/repository.h", - "line": 927, - "lineto": 927, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repo" - }, - { - "name": "nmspace", - "type": "const char *", - "comment": "The namespace. This should not include the refs\n\tfolder, e.g. to namespace all references under `refs/namespaces/foo/`,\n\tuse `foo` as the namespace." - } - ], - "argline": "git_repository *repo, const char *nmspace", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error" - }, - "description": "

Sets the active namespace for this Git Repository

\n", - "comments": "

This namespace affects all reference operations for the repo. See man gitnamespaces

\n", - "group": "repository" - }, - "git_repository_get_namespace": { - "type": "function", - "file": "git2/repository.h", - "line": 935, - "lineto": 935, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repo" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "const char *", - "comment": " the active namespace, or NULL if there isn't one" - }, - "description": "

Get the currently active namespace for this repository

\n", - "comments": "", - "group": "repository" - }, - "git_repository_is_shallow": { - "type": "function", - "file": "git2/repository.h", - "line": 944, - "lineto": 944, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "int", - "comment": " 1 if shallow, zero if not" - }, - "description": "

Determine if the repository was a shallow clone

\n", - "comments": "", - "group": "repository" - }, - "git_repository_ident": { - "type": "function", - "file": "git2/repository.h", - "line": 957, - "lineto": 957, - "args": [ - { - "name": "name", - "type": "const char **", - "comment": "where to store the pointer to the name" - }, - { - "name": "email", - "type": "const char **", - "comment": "where to store the pointer to the email" - }, - { - "name": "repo", - "type": "const git_repository *", - "comment": "the repository" - } - ], - "argline": "const char **name, const char **email, const git_repository *repo", - "sig": "const char **::const char **::const git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Retrieve the configured identity to use for reflogs

\n", - "comments": "

The memory is owned by the repository and must not be freed by the user.

\n", - "group": "repository" - }, - "git_repository_set_ident": { - "type": "function", - "file": "git2/repository.h", - "line": 971, - "lineto": 971, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to configure" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name to use for the reflog entries" - }, - { - "name": "email", - "type": "const char *", - "comment": "the email to use for the reflog entries" - } - ], - "argline": "git_repository *repo, const char *name, const char *email", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Set the identity to be used for writing reflogs

\n", - "comments": "

If both are set, this name and email will be used to write to the reflog. Pass NULL to unset. When unset, the identity will be taken from the repository's configuration.

\n", - "group": "repository" - }, - "git_repository_oid_type": { - "type": "function", - "file": "git2/repository.h", - "line": 979, - "lineto": 979, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository" - } - ], - "argline": "git_repository *repo", - "sig": "git_repository *", - "return": { - "type": "git_oid_t", - "comment": " the object id type" - }, - "description": "

Gets the object type used by this repository.

\n", - "comments": "", - "group": "repository" - }, - "git_reset": { - "type": "function", - "file": "git2/reset.h", - "line": 62, - "lineto": 66, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to perform the reset operation." - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Committish to which the Head should be moved to. This object\n must belong to the given `repo` and can either be a git_commit or a\n git_tag. When a git_tag is being passed, it should be dereferenceable\n to a git_commit which oid will be used as the target of the branch." - }, - { - "name": "reset_type", - "type": "git_reset_t", - "comment": "Kind of reset operation to perform." - }, - { - "name": "checkout_opts", - "type": "const git_checkout_options *", - "comment": "Optional checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks." - } - ], - "argline": "git_repository *repo, const git_object *target, git_reset_t reset_type, const git_checkout_options *checkout_opts", - "sig": "git_repository *::const git_object *::git_reset_t::const git_checkout_options *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be replaced with the content of the index. (Untracked and ignored files will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", - "group": "reset" - }, - "git_reset_from_annotated": { - "type": "function", - "file": "git2/reset.h", - "line": 80, - "lineto": 84, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": null - }, - { - "name": "commit", - "type": "const git_annotated_commit *", - "comment": null - }, - { - "name": "reset_type", - "type": "git_reset_t", - "comment": null - }, - { - "name": "checkout_opts", - "type": "const git_checkout_options *", - "comment": null - } - ], - "argline": "git_repository *repo, const git_annotated_commit *commit, git_reset_t reset_type, const git_checkout_options *checkout_opts", - "sig": "git_repository *::const git_annotated_commit *::git_reset_t::const git_checkout_options *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", - "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", - "group": "reset" - }, - "git_reset_default": { - "type": "function", - "file": "git2/reset.h", - "line": 104, - "lineto": 107, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to perform the reset operation." - }, - { - "name": "target", - "type": "const git_object *", - "comment": "The committish which content will be used to reset the content\n of the index." - }, - { - "name": "pathspecs", - "type": "const git_strarray *", - "comment": "List of pathspecs to operate on." - } - ], - "argline": "git_repository *repo, const git_object *target, const git_strarray *pathspecs", - "sig": "git_repository *::const git_object *::const git_strarray *", - "return": { - "type": "int", - "comment": " 0 on success or an error code \n<\n 0" - }, - "description": "

Updates some entries in the index from the target commit tree.

\n", - "comments": "

The scope of the updated entries is determined by the paths being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing entries in the index matching the provided pathspecs.

\n", - "group": "reset" - }, - "git_revert_options_init": { - "type": "function", - "file": "git2/revert.h", - "line": 49, - "lineto": 51, - "args": [ - { - "name": "opts", - "type": "git_revert_options *", - "comment": "The `git_revert_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_REVERT_OPTIONS_VERSION`." - } - ], - "argline": "git_revert_options *opts, unsigned int version", - "sig": "git_revert_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_revert_options structure

\n", - "comments": "

Initializes a git_revert_options with default values. Equivalent to creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", - "group": "revert" - }, - "git_revert_commit": { - "type": "function", - "file": "git2/revert.h", - "line": 67, - "lineto": 73, - "args": [ - { - "name": "out", - "type": "git_index **", - "comment": "pointer to store the index result in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository that contains the given commits" - }, - { - "name": "revert_commit", - "type": "git_commit *", - "comment": "the commit to revert" - }, - { - "name": "our_commit", - "type": "git_commit *", - "comment": "the commit to revert against (eg, HEAD)" - }, - { - "name": "mainline", - "type": "unsigned int", - "comment": "the parent of the revert commit, if it is a merge" - }, - { - "name": "merge_options", - "type": "const git_merge_options *", - "comment": "the merge options (or null for defaults)" - } - ], - "argline": "git_index **out, git_repository *repo, git_commit *revert_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", - "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Reverts the given commit against the given "our" commit, producing an\n index that reflects the result of the revert.

\n", - "comments": "

The returned index must be freed explicitly with git_index_free.

\n", - "group": "revert" - }, - "git_revert": { - "type": "function", - "file": "git2/revert.h", - "line": 83, - "lineto": 86, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to revert" - }, - { - "name": "commit", - "type": "git_commit *", - "comment": "the commit to revert" - }, - { - "name": "given_opts", - "type": "const git_revert_options *", - "comment": "the revert options (or null for defaults)" - } - ], - "argline": "git_repository *repo, git_commit *commit, const git_revert_options *given_opts", - "sig": "git_repository *::git_commit *::const git_revert_options *", - "return": { - "type": "int", - "comment": " zero on success, -1 on failure." - }, - "description": "

Reverts the given commit, producing changes in the index and working directory.

\n", - "comments": "", - "group": "revert" - }, - "git_revparse_single": { - "type": "function", - "file": "git2/revparse.h", - "line": 37, - "lineto": 38, - "args": [ - { - "name": "out", - "type": "git_object **", - "comment": "pointer to output object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to search in" - }, - { - "name": "spec", - "type": "const char *", - "comment": "the textual specification for an object" - } - ], - "argline": "git_object **out, git_repository *repo, const char *spec", - "sig": "git_object **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Find a single object, as specified by a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", - "group": "revparse", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_revparse_single-22" - ], - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_revparse_single-30" - ], - "describe.c": [ - "ex/v1.7.2/describe.html#git_revparse_single-6" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_revparse_single-44" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_revparse_single-9", - "ex/v1.7.2/tag.html#git_revparse_single-10", - "ex/v1.7.2/tag.html#git_revparse_single-11", - "ex/v1.7.2/tag.html#git_revparse_single-12" - ] - } - }, - "git_revparse_ext": { - "type": "function", - "file": "git2/revparse.h", - "line": 61, - "lineto": 65, - "args": [ - { - "name": "object_out", - "type": "git_object **", - "comment": "pointer to output object" - }, - { - "name": "reference_out", - "type": "git_reference **", - "comment": "pointer to output reference or NULL" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to search in" - }, - { - "name": "spec", - "type": "const char *", - "comment": "the textual specification for an object" - } - ], - "argline": "git_object **object_out, git_reference **reference_out, git_repository *repo, const char *spec", - "sig": "git_object **::git_reference **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code" - }, - "description": "

Find a single object and intermediate reference by a revision string.

\n", - "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", - "group": "revparse", - "examples": { - "commit.c": [ - "ex/v1.7.2/commit.html#git_revparse_ext-9" - ] - } - }, - "git_revparse": { - "type": "function", - "file": "git2/revparse.h", - "line": 105, - "lineto": 108, - "args": [ - { - "name": "revspec", - "type": "git_revspec *", - "comment": "Pointer to an user-allocated git_revspec struct where\n\t the result of the rev-parse will be stored" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to search in" - }, - { - "name": "spec", - "type": "const char *", - "comment": "the rev-parse spec to parse" - } - ], - "argline": "git_revspec *revspec, git_repository *repo, const char *spec", - "sig": "git_revspec *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code" - }, - "description": "

Parse a revision string for from, to, and intent.

\n", - "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", - "group": "revparse", - "examples": { - "blame.c": [ - "ex/v1.7.2/blame.html#git_revparse-23" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_revparse-45" - ], - "rev-parse.c": [ - "ex/v1.7.2/rev-parse.html#git_revparse-14", - "ex/v1.7.2/rev-parse.html#git_revparse-15" - ] - } - }, - "git_revwalk_new": { - "type": "function", - "file": "git2/revwalk.h", - "line": 73, - "lineto": 73, - "args": [ - { - "name": "out", - "type": "git_revwalk **", - "comment": "pointer to the new revision walker" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to walk through" - } - ], - "argline": "git_revwalk **out, git_repository *repo", - "sig": "git_revwalk **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Allocate a new revision walker to iterate through a repo.

\n", - "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

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.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_revwalk_new-65" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_revwalk_new-46", - "ex/v1.7.2/log.html#git_revwalk_new-47" - ] - } - }, - "git_revwalk_reset": { - "type": "function", - "file": "git2/revwalk.h", - "line": 89, - "lineto": 89, - "args": [ - { - "name": "walker", - "type": "git_revwalk *", - "comment": "handle to reset." - } - ], - "argline": "git_revwalk *walker", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Reset the revision walker for reuse.

\n", - "comments": "

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.

\n\n

The revision walk is automatically reset when a walk is over.

\n", - "group": "revwalk" - }, - "git_revwalk_push": { - "type": "function", - "file": "git2/revwalk.h", - "line": 108, - "lineto": 108, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the oid of the commit to start from." - } - ], - "argline": "git_revwalk *walk, const git_oid *id", - "sig": "git_revwalk *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a new root for the traversal

\n", - "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_revwalk_push-66" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_revwalk_push-48" - ] - } - }, - "git_revwalk_push_glob": { - "type": "function", - "file": "git2/revwalk.h", - "line": 126, - "lineto": 126, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "glob", - "type": "const char *", - "comment": "the glob pattern references should match" - } - ], - "argline": "git_revwalk *walk, const char *glob", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push matching references

\n", - "comments": "

The OIDs pointed to by the references that match the given glob pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", - "group": "revwalk" - }, - "git_revwalk_push_head": { - "type": "function", - "file": "git2/revwalk.h", - "line": 134, - "lineto": 134, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push the repository's HEAD

\n", - "comments": "", - "group": "revwalk", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_revwalk_push_head-49" - ] - } - }, - "git_revwalk_hide": { - "type": "function", - "file": "git2/revwalk.h", - "line": 149, - "lineto": 149, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal." - }, - { - "name": "commit_id", - "type": "const git_oid *", - "comment": "the oid of commit that will be ignored during the traversal" - } - ], - "argline": "git_revwalk *walk, const git_oid *commit_id", - "sig": "git_revwalk *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", - "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", - "group": "revwalk", - "examples": { - "log.c": [ - "ex/v1.7.2/log.html#git_revwalk_hide-50" - ] - } - }, - "git_revwalk_hide_glob": { - "type": "function", - "file": "git2/revwalk.h", - "line": 168, - "lineto": 168, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "glob", - "type": "const char *", - "comment": "the glob pattern references should match" - } - ], - "argline": "git_revwalk *walk, const char *glob", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Hide matching references.

\n", - "comments": "

The OIDs pointed to by the references that match the given glob pattern and their ancestors will be hidden from the output on the revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", - "group": "revwalk" - }, - "git_revwalk_hide_head": { - "type": "function", - "file": "git2/revwalk.h", - "line": 176, - "lineto": 176, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Hide the repository's HEAD

\n", - "comments": "", - "group": "revwalk" - }, - "git_revwalk_push_ref": { - "type": "function", - "file": "git2/revwalk.h", - "line": 187, - "lineto": 187, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to push" - } - ], - "argline": "git_revwalk *walk, const char *refname", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push the OID pointed to by a reference

\n", - "comments": "

The reference must point to a committish.

\n", - "group": "revwalk" - }, - "git_revwalk_hide_ref": { - "type": "function", - "file": "git2/revwalk.h", - "line": 198, - "lineto": 198, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to hide" - } - ], - "argline": "git_revwalk *walk, const char *refname", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Hide the OID pointed to by a reference

\n", - "comments": "

The reference must point to a committish.

\n", - "group": "revwalk" - }, - "git_revwalk_next": { - "type": "function", - "file": "git2/revwalk.h", - "line": 218, - "lineto": 218, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Pointer where to store the oid of the next commit" - }, - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker to pop the commit from." - } - ], - "argline": "git_oid *out, git_revwalk *walk", - "sig": "git_oid *::git_revwalk *", - "return": { - "type": "int", - "comment": " 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate" - }, - "description": "

Get the next commit from the revision walk.

\n", - "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

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).

\n\n

The revision walker is reset when the walk is over.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_revwalk_next-67" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_revwalk_next-51" - ] - } - }, - "git_revwalk_sorting": { - "type": "function", - "file": "git2/revwalk.h", - "line": 230, - "lineto": 230, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal." - }, - { - "name": "sort_mode", - "type": "unsigned int", - "comment": "combination of GIT_SORT_XXX flags" - } - ], - "argline": "git_revwalk *walk, unsigned int sort_mode", - "sig": "git_revwalk *::unsigned int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Change the sorting mode when iterating through the\n repository's contents.

\n", - "comments": "

Changing the sorting mode resets the walker.

\n", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_revwalk_sorting-68" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_revwalk_sorting-52", - "ex/v1.7.2/log.html#git_revwalk_sorting-53" - ] - } - }, - "git_revwalk_push_range": { - "type": "function", - "file": "git2/revwalk.h", - "line": 245, - "lineto": 245, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the walker being used for the traversal" - }, - { - "name": "range", - "type": "const char *", - "comment": "the range" - } - ], - "argline": "git_revwalk *walk, const char *range", - "sig": "git_revwalk *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Push and hide the respective endpoints of the given range.

\n", - "comments": "

The range should be of the form .. where each is in the form accepted by 'git_revparse_single'. The left-hand commit will be hidden and the right-hand commit pushed.

\n", - "group": "revwalk" - }, - "git_revwalk_simplify_first_parent": { - "type": "function", - "file": "git2/revwalk.h", - "line": 255, - "lineto": 255, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "The revision walker." - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Simplify the history by first-parent

\n", - "comments": "

No parents other than the first for each commit will be enqueued.

\n", - "group": "revwalk" - }, - "git_revwalk_free": { - "type": "function", - "file": "git2/revwalk.h", - "line": 263, - "lineto": 263, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "traversal handle to close. If NULL nothing occurs." - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a revision walker previously allocated.

\n", - "comments": "", - "group": "revwalk", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_revwalk_free-69" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_revwalk_free-54" - ] - } - }, - "git_revwalk_repository": { - "type": "function", - "file": "git2/revwalk.h", - "line": 272, - "lineto": 272, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the revision walker" - } - ], - "argline": "git_revwalk *walk", - "sig": "git_revwalk *", - "return": { - "type": "git_repository *", - "comment": " the repository being walked" - }, - "description": "

Return the repository on which this walker\n is operating.

\n", - "comments": "", - "group": "revwalk" - }, - "git_revwalk_add_hide_cb": { - "type": "function", - "file": "git2/revwalk.h", - "line": 295, - "lineto": 298, - "args": [ - { - "name": "walk", - "type": "git_revwalk *", - "comment": "the revision walker" - }, - { - "name": "hide_cb", - "type": "git_revwalk_hide_cb", - "comment": "callback function to hide a commit and its parents" - }, - { - "name": "payload", - "type": "void *", - "comment": "data payload to be passed to callback function" - } - ], - "argline": "git_revwalk *walk, git_revwalk_hide_cb hide_cb, void *payload", - "sig": "git_revwalk *::git_revwalk_hide_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Adds, changes or removes a callback function to hide a commit and its parents

\n", - "comments": "", - "group": "revwalk" - }, - "git_signature_new": { - "type": "function", - "file": "git2/signature.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature, in case of error NULL" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the person" - }, - { - "name": "email", - "type": "const char *", - "comment": "email of the person" - }, - { - "name": "time", - "type": "git_time_t", - "comment": "time (in seconds from epoch) when the action happened" - }, - { - "name": "offset", - "type": "int", - "comment": "timezone offset (in minutes) for the time" - } - ], - "argline": "git_signature **out, const char *name, const char *email, git_time_t time, int offset", - "sig": "git_signature **::const char *::const char *::git_time_t::int", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new action signature.

\n", - "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('<' and '>') characters are not allowed to be used in either the name or the email parameter.

\n", - "group": "signature", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_signature_new-70", - "ex/v1.7.2/general.html#git_signature_new-71" - ] - } - }, - "git_signature_now": { - "type": "function", - "file": "git2/signature.h", - "line": 49, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature, in case of error NULL" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the person" - }, - { - "name": "email", - "type": "const char *", - "comment": "email of the person" - } - ], - "argline": "git_signature **out, const char *name, const char *email", - "sig": "git_signature **::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new action signature with a timestamp of 'now'.

\n", - "comments": "

Call git_signature_free() to free the data.

\n", - "group": "signature", - "examples": { - "merge.c": [ - "ex/v1.7.2/merge.html#git_signature_now-36" - ] - } - }, - "git_signature_default": { - "type": "function", - "file": "git2/signature.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository pointer" - } - ], - "argline": "git_signature **out, git_repository *repo", - "sig": "git_signature **::git_repository *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" - }, - "description": "

Create a new action signature with default user and now timestamp.

\n", - "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", - "group": "signature", - "examples": { - "commit.c": [ - "ex/v1.7.2/commit.html#git_signature_default-10" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_signature_default-10" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_signature_default-13" - ] - } - }, - "git_signature_from_buffer": { - "type": "function", - "file": "git2/signature.h", - "line": 76, - "lineto": 76, - "args": [ - { - "name": "out", - "type": "git_signature **", - "comment": "new signature" - }, - { - "name": "buf", - "type": "const char *", - "comment": "signature string" - } - ], - "argline": "git_signature **out, const char *buf", - "sig": "git_signature **::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALID if the signature is not parseable, or an error code" - }, - "description": "

Create a new signature by parsing the given buffer, which is\n expected to be in the format "Real Name \n<email

\n\n
\n

timestamp tzoffset",\n where timestamp is the number of seconds since the Unix epoch and\n tzoffset is the timezone offset in hhmm format (note the lack\n of a colon separator).

\n
\n", - "comments": "", - "group": "signature" - }, - "git_signature_dup": { - "type": "function", - "file": "git2/signature.h", - "line": 88, - "lineto": 88, - "args": [ - { - "name": "dest", - "type": "git_signature **", - "comment": "pointer where to store the copy" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to duplicate" - } - ], - "argline": "git_signature **dest, const git_signature *sig", - "sig": "git_signature **::const git_signature *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a copy of an existing signature. All internal strings are also\n duplicated.

\n", - "comments": "

Call git_signature_free() to free the data.

\n", - "group": "signature" - }, - "git_signature_free": { - "type": "function", - "file": "git2/signature.h", - "line": 99, - "lineto": 99, - "args": [ - { - "name": "sig", - "type": "git_signature *", - "comment": "signature to free" - } - ], - "argline": "git_signature *sig", - "sig": "git_signature *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an existing signature.

\n", - "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", - "group": "signature", - "examples": { - "commit.c": [ - "ex/v1.7.2/commit.html#git_signature_free-11" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_signature_free-72", - "ex/v1.7.2/general.html#git_signature_free-73" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_signature_free-11" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_signature_free-14" - ] - } - }, - "git_stash_save": { - "type": "function", - "file": "git2/stash.h", - "line": 67, - "lineto": 72, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "stasher", - "type": "const git_signature *", - "comment": "The identity of the person performing the stashing." - }, - { - "name": "message", - "type": "const char *", - "comment": "Optional description along with the stashed state." - }, - { - "name": "flags", - "type": "uint32_t", - "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" - } - ], - "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", - "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." - }, - "description": "

Save the local modifications to a new stash.

\n", - "comments": "", - "group": "stash" - }, - "git_stash_save_options_init": { - "type": "function", - "file": "git2/stash.h", - "line": 110, - "lineto": 111, - "args": [ - { - "name": "opts", - "type": "git_stash_save_options *", - "comment": "The `git_stash_save_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_STASH_SAVE_OPTIONS_VERSION`." - } - ], - "argline": "git_stash_save_options *opts, unsigned int version", - "sig": "git_stash_save_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_stash_save_options structure

\n", - "comments": "

Initializes a git_stash_save_options with default values. Equivalent to creating an instance with GIT_STASH_SAVE_OPTIONS_INIT.

\n", - "group": "stash" - }, - "git_stash_save_with_opts": { - "type": "function", - "file": "git2/stash.h", - "line": 123, - "lineto": 126, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "opts", - "type": "const git_stash_save_options *", - "comment": "The stash options." - } - ], - "argline": "git_oid *out, git_repository *repo, const git_stash_save_options *opts", - "sig": "git_oid *::git_repository *::const git_stash_save_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." - }, - "description": "

Save the local modifications to a new stash, with options.

\n", - "comments": "", - "group": "stash" - }, - "git_stash_apply_options_init": { - "type": "function", - "file": "git2/stash.h", - "line": 210, - "lineto": 211, - "args": [ - { - "name": "opts", - "type": "git_stash_apply_options *", - "comment": "The `git_stash_apply_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_STASH_APPLY_OPTIONS_VERSION`." - } - ], - "argline": "git_stash_apply_options *opts, unsigned int version", - "sig": "git_stash_apply_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_stash_apply_options structure

\n", - "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", - "group": "stash" - }, - "git_stash_apply": { - "type": "function", - "file": "git2/stash.h", - "line": 239, - "lineto": 242, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - }, - { - "name": "options", - "type": "const git_stash_apply_options *", - "comment": "Optional options to control how stashes are applied." - } - ], - "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", - "sig": "git_repository *::size_t::const git_stash_apply_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" - }, - "description": "

Apply a single stashed state from the stash list.

\n", - "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", - "group": "stash" - }, - "git_stash_foreach": { - "type": "function", - "file": "git2/stash.h", - "line": 275, - "lineto": 278, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the stash." - }, - { - "name": "callback", - "type": "git_stash_cb", - "comment": "Callback to invoke per found stashed state. The most\n recent stash state will be enumerated first." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra parameter to callback function." - } - ], - "argline": "git_repository *repo, git_stash_cb callback, void *payload", - "sig": "git_repository *::git_stash_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code." - }, - "description": "

Loop over all the stashed states and issue a callback for each one.

\n", - "comments": "

If the callback returns a non-zero value, this will stop looping.

\n", - "group": "stash" - }, - "git_stash_drop": { - "type": "function", - "file": "git2/stash.h", - "line": 291, - "lineto": 293, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - } - ], - "argline": "git_repository *repo, size_t index", - "sig": "git_repository *::size_t", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code." - }, - "description": "

Remove a single stashed state from the stash list.

\n", - "comments": "", - "group": "stash" - }, - "git_stash_pop": { - "type": "function", - "file": "git2/stash.h", - "line": 307, - "lineto": 310, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The owning repository." - }, - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - }, - { - "name": "options", - "type": "const git_stash_apply_options *", - "comment": "Optional options to control how stashes are applied." - } - ], - "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", - "sig": "git_repository *::size_t::const git_stash_apply_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code. (see git_stash_apply() above for details)" - }, - "description": "

Apply a single stashed state from the stash list and remove it from the list\n if successful.

\n", - "comments": "", - "group": "stash" - }, - "git_status_options_init": { - "type": "function", - "file": "git2/status.h", - "line": 277, - "lineto": 279, - "args": [ - { - "name": "opts", - "type": "git_status_options *", - "comment": "The `git_status_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." - } - ], - "argline": "git_status_options *opts, unsigned int version", - "sig": "git_status_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_status_options structure

\n", - "comments": "

Initializes a git_status_options with default values. Equivalent to creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", - "group": "status" - }, - "git_status_foreach": { - "type": "function", - "file": "git2/status.h", - "line": 317, - "lineto": 320, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "callback", - "type": "git_status_cb", - "comment": "The function to call on each file" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to pass through to callback function" - } - ], - "argline": "git_repository *repo, git_status_cb callback, void *payload", - "sig": "git_repository *::git_status_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Gather file statuses and run a callback for each one.

\n", - "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_status_foreach-6" - ] - } - }, - "git_status_foreach_ext": { - "type": "function", - "file": "git2/status.h", - "line": 341, - "lineto": 345, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object" - }, - { - "name": "opts", - "type": "const git_status_options *", - "comment": "Status options structure" - }, - { - "name": "callback", - "type": "git_status_cb", - "comment": "The function to call on each file" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to pass through to callback function" - } - ], - "argline": "git_repository *repo, const git_status_options *opts, git_status_cb callback, void *payload", - "sig": "git_repository *::const git_status_options *::git_status_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Gather file status information and run callbacks as requested.

\n", - "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_status_foreach_ext-7" - ] - } - }, - "git_status_file": { - "type": "function", - "file": "git2/status.h", - "line": 373, - "lineto": 376, - "args": [ - { - "name": "status_flags", - "type": "unsigned int *", - "comment": "Output combination of git_status_t values for file" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "path", - "type": "const char *", - "comment": "The exact path to retrieve status for relative to the\n repository working directory" - } - ], - "argline": "unsigned int *status_flags, git_repository *repo, const char *path", - "sig": "unsigned int *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors." - }, - "description": "

Get file status for a single file.

\n", - "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", - "group": "status", - "examples": { - "add.c": [ - "ex/v1.7.2/add.html#git_status_file-6" - ] - } - }, - "git_status_list_new": { - "type": "function", - "file": "git2/status.h", - "line": 391, - "lineto": 394, - "args": [ - { - "name": "out", - "type": "git_status_list **", - "comment": "Pointer to store the status results in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository object" - }, - { - "name": "opts", - "type": "const git_status_options *", - "comment": "Status options structure" - } - ], - "argline": "git_status_list **out, git_repository *repo, const git_status_options *opts", - "sig": "git_status_list **::git_repository *::const git_status_options *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Gather file status information and populate the git_status_list.

\n", - "comments": "

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_status_list_new-8", - "ex/v1.7.2/status.html#git_status_list_new-9" - ] - } - }, - "git_status_list_entrycount": { - "type": "function", - "file": "git2/status.h", - "line": 405, - "lineto": 406, - "args": [ - { - "name": "statuslist", - "type": "git_status_list *", - "comment": "Existing status list object" - } - ], - "argline": "git_status_list *statuslist", - "sig": "git_status_list *", - "return": { - "type": "size_t", - "comment": " the number of status entries" - }, - "description": "

Gets the count of status entries in this list.

\n", - "comments": "

If there are no changes in status (at least according the options given when the status list was created), this can return 0.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_status_list_entrycount-10", - "ex/v1.7.2/status.html#git_status_list_entrycount-11" - ] - } - }, - "git_status_byindex": { - "type": "function", - "file": "git2/status.h", - "line": 417, - "lineto": 419, - "args": [ - { - "name": "statuslist", - "type": "git_status_list *", - "comment": "Existing status list object" - }, - { - "name": "idx", - "type": "size_t", - "comment": "Position of the entry" - } - ], - "argline": "git_status_list *statuslist, size_t idx", - "sig": "git_status_list *::size_t", - "return": { - "type": "const git_status_entry *", - "comment": " Pointer to the entry; NULL if out of bounds" - }, - "description": "

Get a pointer to one of the entries in the status list.

\n", - "comments": "

The entry is not modifiable and should not be freed.

\n", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_status_byindex-12", - "ex/v1.7.2/status.html#git_status_byindex-13", - "ex/v1.7.2/status.html#git_status_byindex-14", - "ex/v1.7.2/status.html#git_status_byindex-15", - "ex/v1.7.2/status.html#git_status_byindex-16", - "ex/v1.7.2/status.html#git_status_byindex-17" - ] - } - }, - "git_status_list_free": { - "type": "function", - "file": "git2/status.h", - "line": 426, - "lineto": 427, - "args": [ - { - "name": "statuslist", - "type": "git_status_list *", - "comment": "Existing status list object" - } - ], - "argline": "git_status_list *statuslist", - "sig": "git_status_list *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free an existing status list

\n", - "comments": "", - "group": "status", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_status_list_free-18" - ] - } - }, - "git_status_should_ignore": { - "type": "function", - "file": "git2/status.h", - "line": 445, - "lineto": 448, - "args": [ - { - "name": "ignored", - "type": "int *", - "comment": "Boolean returning 0 if the file is not ignored, 1 if it is" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "A repository object" - }, - { - "name": "path", - "type": "const char *", - "comment": "The file to check ignores for, rooted at the repo's workdir." - } - ], - "argline": "int *ignored, git_repository *repo, const char *path", - "sig": "int *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." - }, - "description": "

Test if the ignore rules apply to a given file.

\n", - "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", - "group": "status" - }, - "git_strarray_dispose": { - "type": "function", - "file": "git2/strarray.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "array", - "type": "git_strarray *", - "comment": "The git_strarray that contains strings to free" - } - ], - "argline": "git_strarray *array", - "sig": "git_strarray *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the strings contained in a string array. This method should\n be called on git_strarray objects that were provided by the\n library. Not doing so, will result in a memory leak.

\n", - "comments": "

This does not free the git_strarray itself, since the library will never allocate that object directly itself.

\n", - "group": "strarray", - "examples": { - "checkout.c": [ - "ex/v1.7.2/checkout.html#git_strarray_dispose-26" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_strarray_dispose-74" - ], - "remote.c": [ - "ex/v1.7.2/remote.html#git_strarray_dispose-11", - "ex/v1.7.2/remote.html#git_strarray_dispose-12" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_strarray_dispose-15" - ] - } - }, - "git_submodule_update_options_init": { - "type": "function", - "file": "git2/submodule.h", - "line": 171, - "lineto": 172, - "args": [ - { - "name": "opts", - "type": "git_submodule_update_options *", - "comment": "The `git_submodule_update_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`." - } - ], - "argline": "git_submodule_update_options *opts, unsigned int version", - "sig": "git_submodule_update_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_submodule_update_options structure

\n", - "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", - "group": "submodule" - }, - "git_submodule_update": { - "type": "function", - "file": "git2/submodule.h", - "line": 192, - "lineto": 192, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule object" - }, - { - "name": "init", - "type": "int", - "comment": "If the submodule is not initialized, setting this flag to true\n will initialize the submodule before updating. Otherwise, this will\n return an error if attempting to update an uninitialized repository.\n but setting this to true forces them to be updated." - }, - { - "name": "options", - "type": "git_submodule_update_options *", - "comment": "configuration options for the update. If NULL, the\n function works as though GIT_SUBMODULE_UPDATE_OPTIONS_INIT was passed." - } - ], - "argline": "git_submodule *submodule, int init, git_submodule_update_options *options", - "sig": "git_submodule *::int::git_submodule_update_options *", - "return": { - "type": "int", - "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)." - }, - "description": "

Update a submodule. This will clone a missing submodule and\n checkout the subrepository to the commit specified in the index of\n the containing repository. If the submodule repository doesn't contain\n the target commit (e.g. because fetchRecurseSubmodules isn't set), then\n the submodule is fetched using the fetch options supplied in options.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_lookup": { - "type": "function", - "file": "git2/submodule.h", - "line": 221, - "lineto": 224, - "args": [ - { - "name": "out", - "type": "git_submodule **", - "comment": "Output ptr to submodule; pass NULL to just get return code" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The parent repository" - }, - { - "name": "name", - "type": "const char *", - "comment": "The name of or path to the submodule; trailing slashes okay" - } - ], - "argline": "git_submodule **out, git_repository *repo, const char *name", - "sig": "git_submodule **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors." - }, - "description": "

Lookup submodule information by name or path.

\n", - "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config, but does "exist" in the working directory (i.e. there is a subdirectory that appears to be a Git repository). In this case, this function returns GIT_EEXISTS to indicate a sub-repository exists but not in a state where a git_submodule can be instantiated. - The submodule is not mentioned in the HEAD, index, or config and the working directory doesn't contain a value git repo at that path. There may or may not be anything else at that path, but nothing that looks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", - "group": "submodule" - }, - "git_submodule_dup": { - "type": "function", - "file": "git2/submodule.h", - "line": 234, - "lineto": 234, - "args": [ - { - "name": "out", - "type": "git_submodule **", - "comment": "Pointer to store the copy of the submodule." - }, - { - "name": "source", - "type": "git_submodule *", - "comment": "Original submodule to copy." - } - ], - "argline": "git_submodule **out, git_submodule *source", - "sig": "git_submodule **::git_submodule *", - "return": { - "type": "int", - "comment": " 0" - }, - "description": "

Create an in-memory copy of a submodule. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_free": { - "type": "function", - "file": "git2/submodule.h", - "line": 241, - "lineto": 241, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Release a submodule

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_foreach": { - "type": "function", - "file": "git2/submodule.h", - "line": 261, - "lineto": 264, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository" - }, - { - "name": "callback", - "type": "git_submodule_cb", - "comment": "Function to be called with the name of each submodule.\n Return a non-zero value to terminate the iteration." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra data to pass to callback" - } - ], - "argline": "git_repository *repo, git_submodule_cb callback, void *payload", - "sig": "git_repository *::git_submodule_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on error, or non-zero return value of callback" - }, - "description": "

Iterate over all tracked submodules of a repository.

\n", - "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_submodule_foreach-19" - ] - } - }, - "git_submodule_add_setup": { - "type": "function", - "file": "git2/submodule.h", - "line": 292, - "lineto": 297, - "args": [ - { - "name": "out", - "type": "git_submodule **", - "comment": "The newly created submodule ready to open for clone" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository in which you want to create the submodule" - }, - { - "name": "url", - "type": "const char *", - "comment": "URL for the submodule's remote" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path at which the submodule should be created" - }, - { - "name": "use_gitlink", - "type": "int", - "comment": "Should workdir contain a gitlink to the repo in\n .git/modules vs. repo directly in workdir." - } - ], - "argline": "git_submodule **out, git_repository *repo, const char *url, const char *path, int use_gitlink", - "sig": "git_submodule **::git_repository *::const char *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." - }, - "description": "

Set up a new git submodule for checkout.

\n", - "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed (if you don't need anything custom see git_submodule_add_clone()). Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", - "group": "submodule" - }, - "git_submodule_clone": { - "type": "function", - "file": "git2/submodule.h", - "line": 310, - "lineto": 313, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "The newly created repository object. Optional." - }, - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule currently waiting for its clone." - }, - { - "name": "opts", - "type": "const git_submodule_update_options *", - "comment": "The options to use." - } - ], - "argline": "git_repository **out, git_submodule *submodule, const git_submodule_update_options *opts", - "sig": "git_repository **::git_submodule *::const git_submodule_update_options *", - "return": { - "type": "int", - "comment": " 0 on success, -1 on other errors (see git_clone)." - }, - "description": "

Perform the clone step for a newly created submodule.

\n", - "comments": "

This performs the necessary git_clone to setup a newly-created submodule.

\n", - "group": "submodule" - }, - "git_submodule_add_finalize": { - "type": "function", - "file": "git2/submodule.h", - "line": 326, - "lineto": 326, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to finish adding." - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Resolve the setup of a new git submodule.

\n", - "comments": "

This should be called on a submodule once you have called add setup and done the clone of the submodule. This adds the .gitmodules file and the newly cloned submodule to the index to be ready to be committed (but doesn't actually do the commit).

\n", - "group": "submodule" - }, - "git_submodule_add_to_index": { - "type": "function", - "file": "git2/submodule.h", - "line": 338, - "lineto": 340, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to add to the index" - }, - { - "name": "write_index", - "type": "int", - "comment": "Boolean if this should immediately write the index\n file. If you pass this as false, you will have to get the\n git_index and explicitly call `git_index_write()` on it to\n save the change." - } - ], - "argline": "git_submodule *submodule, int write_index", - "sig": "git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Add current submodule HEAD commit to index of superproject.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_owner": { - "type": "function", - "file": "git2/submodule.h", - "line": 353, - "lineto": 353, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_repository *", - "comment": " Pointer to `git_repository`" - }, - "description": "

Get the containing repository for a submodule.

\n", - "comments": "

This returns a pointer to the repository that contains the submodule. This is a just a reference to the repository that was passed to the original git_submodule_lookup() call, so if that repository has been freed, then this may be a dangling reference.

\n", - "group": "submodule" - }, - "git_submodule_name": { - "type": "function", - "file": "git2/submodule.h", - "line": 361, - "lineto": 361, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule name" - }, - "description": "

Get the name of submodule.

\n", - "comments": "", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_submodule_name-20" - ] - } - }, - "git_submodule_path": { - "type": "function", - "file": "git2/submodule.h", - "line": 372, - "lineto": 372, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule path" - }, - "description": "

Get the path to the submodule.

\n", - "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_submodule_path-21" - ] - } - }, - "git_submodule_url": { - "type": "function", - "file": "git2/submodule.h", - "line": 380, - "lineto": 380, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule url" - }, - "description": "

Get the URL for the submodule.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_resolve_url": { - "type": "function", - "file": "git2/submodule.h", - "line": 390, - "lineto": 390, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer to store the absolute submodule url in" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Pointer to repository object" - }, - { - "name": "url", - "type": "const char *", - "comment": "Relative url" - } - ], - "argline": "git_buf *out, git_repository *repo, const char *url", - "sig": "git_buf *::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Resolve a submodule url relative to the given repository.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_branch": { - "type": "function", - "file": "git2/submodule.h", - "line": 398, - "lineto": 398, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const char *", - "comment": " Pointer to the submodule branch" - }, - "description": "

Get the branch for the submodule.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_set_branch": { - "type": "function", - "file": "git2/submodule.h", - "line": 411, - "lineto": 411, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submodule to configure" - }, - { - "name": "branch", - "type": "const char *", - "comment": "Branch that should be used for the submodule" - } - ], - "argline": "git_repository *repo, const char *name, const char *branch", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Set the branch for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", - "group": "submodule" - }, - "git_submodule_set_url": { - "type": "function", - "file": "git2/submodule.h", - "line": 425, - "lineto": 425, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submodule to configure" - }, - { - "name": "url", - "type": "const char *", - "comment": "URL that should be used for the submodule" - } - ], - "argline": "git_repository *repo, const char *name, const char *url", - "sig": "git_repository *::const char *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure" - }, - "description": "

Set the URL for the submodule in the configuration

\n", - "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", - "group": "submodule" - }, - "git_submodule_index_id": { - "type": "function", - "file": "git2/submodule.h", - "line": 433, - "lineto": 433, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const git_oid *", - "comment": " Pointer to git_oid or NULL if submodule is not in index." - }, - "description": "

Get the OID for the submodule in the index.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_head_id": { - "type": "function", - "file": "git2/submodule.h", - "line": 441, - "lineto": 441, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const git_oid *", - "comment": " Pointer to git_oid or NULL if submodule is not in the HEAD." - }, - "description": "

Get the OID for the submodule in the current HEAD tree.

\n", - "comments": "", - "group": "submodule" - }, - "git_submodule_wd_id": { - "type": "function", - "file": "git2/submodule.h", - "line": 454, - "lineto": 454, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Pointer to submodule object" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "const git_oid *", - "comment": " Pointer to git_oid or NULL if submodule is not checked out." - }, - "description": "

Get the OID for the submodule in the current working directory.

\n", - "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked out submodule. If there are pending changes in the index or anything else, this won't notice that. You should call git_submodule_status() for a more complete picture about the state of the working directory.

\n", - "group": "submodule" - }, - "git_submodule_ignore": { - "type": "function", - "file": "git2/submodule.h", - "line": 479, - "lineto": 480, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to check" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_submodule_ignore_t", - "comment": " The current git_submodule_ignore_t valyue what will be used for\n this submodule." - }, - "description": "

Get the ignore rule that will be used for the submodule.

\n", - "comments": "

These values control the behavior of git_submodule_status() for this submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents of the submodule from a clean checkout to be dirty, including the addition of untracked files. This is the default if unspecified. - GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the working tree (i.e. call git_status_foreach() on the submodule) but UNTRACKED files will not count as making the submodule dirty. - GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the submodule has moved for status. This is fast since it does not need to scan the working tree of the submodule at all. - GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo. The working directory will be consider clean so long as there is a checked out version present.
  • \n
\n", - "group": "submodule" - }, - "git_submodule_set_ignore": { - "type": "function", - "file": "git2/submodule.h", - "line": 492, - "lineto": 495, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submdule" - }, - { - "name": "ignore", - "type": "git_submodule_ignore_t", - "comment": "The new value for the ignore rule" - } - ], - "argline": "git_repository *repo, const char *name, git_submodule_ignore_t ignore", - "sig": "git_repository *::const char *::git_submodule_ignore_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the ignore rule for the submodule in the configuration

\n", - "comments": "

This does not affect any currently-loaded instances.

\n", - "group": "submodule" - }, - "git_submodule_update_strategy": { - "type": "function", - "file": "git2/submodule.h", - "line": 507, - "lineto": 508, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to check" - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_submodule_update_t", - "comment": " The current git_submodule_update_t value that will be used\n for this submodule." - }, - "description": "

Get the update rule that will be used for the submodule.

\n", - "comments": "

This value controls the behavior of the git submodule update command. There are four useful values documented with git_submodule_update_t.

\n", - "group": "submodule" - }, - "git_submodule_set_update": { - "type": "function", - "file": "git2/submodule.h", - "line": 520, - "lineto": 523, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the name of the submodule to configure" - }, - { - "name": "update", - "type": "git_submodule_update_t", - "comment": "The new value to use" - } - ], - "argline": "git_repository *repo, const char *name, git_submodule_update_t update", - "sig": "git_repository *::const char *::git_submodule_update_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Set the update rule for the submodule in the configuration

\n", - "comments": "

This setting won't affect any existing instances.

\n", - "group": "submodule" - }, - "git_submodule_fetch_recurse_submodules": { - "type": "function", - "file": "git2/submodule.h", - "line": 536, - "lineto": 537, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": null - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "git_submodule_recurse_t", - "comment": " 0 if fetchRecurseSubmodules is false, 1 if true" - }, - "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", - "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", - "group": "submodule" - }, - "git_submodule_set_fetch_recurse_submodules": { - "type": "function", - "file": "git2/submodule.h", - "line": 549, - "lineto": 552, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository to affect" - }, - { - "name": "name", - "type": "const char *", - "comment": "the submodule to configure" - }, - { - "name": "fetch_recurse_submodules", - "type": "git_submodule_recurse_t", - "comment": "Boolean value" - } - ], - "argline": "git_repository *repo, const char *name, git_submodule_recurse_t fetch_recurse_submodules", - "sig": "git_repository *::const char *::git_submodule_recurse_t", - "return": { - "type": "int", - "comment": " old value for fetchRecurseSubmodules" - }, - "description": "

Set the fetchRecurseSubmodules rule for a submodule in the configuration

\n", - "comments": "

This setting won't affect any existing instances.

\n", - "group": "submodule" - }, - "git_submodule_init": { - "type": "function", - "file": "git2/submodule.h", - "line": 567, - "lineto": 567, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to write into the superproject config" - }, - { - "name": "overwrite", - "type": "int", - "comment": "By default, existing entries will not be overwritten,\n but setting this to true forces them to be updated." - } - ], - "argline": "git_submodule *submodule, int overwrite", - "sig": "git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure." - }, - "description": "

Copy submodule info into ".git/config" file.

\n", - "comments": "

Just like "git submodule init", this copies information about the submodule into ".git/config". You can use the accessor functions above to alter the in-memory git_submodule object and control what is written to the config, overriding what is in .gitmodules.

\n", - "group": "submodule" - }, - "git_submodule_repo_init": { - "type": "function", - "file": "git2/submodule.h", - "line": 582, - "lineto": 585, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "Output pointer to the created git repository." - }, - { - "name": "sm", - "type": "const git_submodule *", - "comment": "The submodule to create a new subrepository from." - }, - { - "name": "use_gitlink", - "type": "int", - "comment": "Should the workdir contain a gitlink to\n the repo in .git/modules vs. repo directly in workdir." - } - ], - "argline": "git_repository **out, const git_submodule *sm, int use_gitlink", - "sig": "git_repository **::const git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on failure." - }, - "description": "

Set up the subrepository for a submodule in preparation for clone.

\n", - "comments": "

This function can be called to init and set up a submodule repository from a submodule in preparation to clone it from its remote.

\n", - "group": "submodule" - }, - "git_submodule_sync": { - "type": "function", - "file": "git2/submodule.h", - "line": 598, - "lineto": 598, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to copy." - } - ], - "argline": "git_submodule *submodule", - "sig": "git_submodule *", - "return": { - "type": "int", - "comment": " 0 or an error code." - }, - "description": "

Copy submodule remote info into submodule repo.

\n", - "comments": "

This copies the information about the submodules URL into the checked out submodule config, acting like "git submodule sync". This is useful if you have altered the URL for the submodule (or it has been altered by a fetch of upstream changes) and you need to update your local repo.

\n", - "group": "submodule" - }, - "git_submodule_open": { - "type": "function", - "file": "git2/submodule.h", - "line": 612, - "lineto": 614, - "args": [ - { - "name": "repo", - "type": "git_repository **", - "comment": "Pointer to the submodule repo which was opened" - }, - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule to be opened" - } - ], - "argline": "git_repository **repo, git_submodule *submodule", - "sig": "git_repository **::git_submodule *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 if submodule repo could not be opened." - }, - "description": "

Open the repository for a submodule.

\n", - "comments": "

This is a newly opened repository object. The caller is responsible for calling git_repository_free() on it when done. Multiple calls to this function will return distinct git_repository objects. This will only work if the submodule is checked out into the working directory.

\n", - "group": "submodule" - }, - "git_submodule_reload": { - "type": "function", - "file": "git2/submodule.h", - "line": 626, - "lineto": 626, - "args": [ - { - "name": "submodule", - "type": "git_submodule *", - "comment": "The submodule to reload" - }, - { - "name": "force", - "type": "int", - "comment": "Force reload even if the data doesn't seem out of date" - } - ], - "argline": "git_submodule *submodule, int force", - "sig": "git_submodule *::int", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Reread submodule info from config, index, and HEAD.

\n", - "comments": "

Call this to reread cached submodule information for this submodule if you have reason to believe that it has changed.

\n", - "group": "submodule" - }, - "git_submodule_status": { - "type": "function", - "file": "git2/submodule.h", - "line": 642, - "lineto": 646, - "args": [ - { - "name": "status", - "type": "unsigned int *", - "comment": "Combination of `GIT_SUBMODULE_STATUS` flags" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to look" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the submodule" - }, - { - "name": "ignore", - "type": "git_submodule_ignore_t", - "comment": "the ignore rules to follow" - } - ], - "argline": "unsigned int *status, git_repository *repo, const char *name, git_submodule_ignore_t ignore", - "sig": "unsigned int *::git_repository *::const char *::git_submodule_ignore_t", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Get the status for a submodule.

\n", - "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", - "group": "submodule", - "examples": { - "status.c": [ - "ex/v1.7.2/status.html#git_submodule_status-22" - ] - } - }, - "git_submodule_location": { - "type": "function", - "file": "git2/submodule.h", - "line": 662, - "lineto": 664, - "args": [ - { - "name": "location_status", - "type": "unsigned int *", - "comment": "Combination of first four `GIT_SUBMODULE_STATUS` flags" - }, - { - "name": "submodule", - "type": "git_submodule *", - "comment": "Submodule for which to get status" - } - ], - "argline": "unsigned int *location_status, git_submodule *submodule", - "sig": "unsigned int *::git_submodule *", - "return": { - "type": "int", - "comment": " 0 on success, \n<\n0 on error" - }, - "description": "

Get the locations of submodule information.

\n", - "comments": "

This is a bit like a very lightweight version of git_submodule_status. It just returns a made of the first four submodule status values (i.e. the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). This can be useful if you want to know if the submodule is present in the working directory at this point in time, etc.

\n", - "group": "submodule" - }, - "git_tag_lookup": { - "type": "function", - "file": "git2/tag.h", - "line": 33, - "lineto": 34, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "pointer to the looked up tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tag." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tag to locate." - } - ], - "argline": "git_tag **out, git_repository *repo, const git_oid *id", - "sig": "git_tag **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tag object from the repository.

\n", - "comments": "", - "group": "tag", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_tag_lookup-75" - ] - } - }, - "git_tag_lookup_prefix": { - "type": "function", - "file": "git2/tag.h", - "line": 48, - "lineto": 49, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "pointer to the looked up tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tag." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tag to locate." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_tag **out, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_tag **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n", - "comments": "", - "group": "tag" - }, - "git_tag_free": { - "type": "function", - "file": "git2/tag.h", - "line": 61, - "lineto": 61, - "args": [ - { - "name": "tag", - "type": "git_tag *", - "comment": "the tag to close" - } - ], - "argline": "git_tag *tag", - "sig": "git_tag *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open tag

\n", - "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", - "group": "tag", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_tag_free-76" - ] - } - }, - "git_tag_id": { - "type": "function", - "file": "git2/tag.h", - "line": 69, - "lineto": 69, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_oid *", - "comment": " object identity for the tag." - }, - "description": "

Get the id of a tag.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_owner": { - "type": "function", - "file": "git2/tag.h", - "line": 77, - "lineto": 77, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "A previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this tag." - }, - "description": "

Get the repository that contains the tag.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_target": { - "type": "function", - "file": "git2/tag.h", - "line": 89, - "lineto": 89, - "args": [ - { - "name": "target_out", - "type": "git_object **", - "comment": "pointer where to store the target" - }, - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "git_object **target_out, const git_tag *tag", - "sig": "git_object **::const git_tag *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Get the tagged object of a tag

\n", - "comments": "

This method performs a repository lookup for the given object and returns it

\n", - "group": "tag", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_tag_target-77" - ] - } - }, - "git_tag_target_id": { - "type": "function", - "file": "git2/tag.h", - "line": 97, - "lineto": 97, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_oid *", - "comment": " pointer to the OID" - }, - "description": "

Get the OID of the tagged object of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tag_target_id-31" - ] - } - }, - "git_tag_target_type": { - "type": "function", - "file": "git2/tag.h", - "line": 105, - "lineto": 105, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "git_object_t", - "comment": " type of the tagged object" - }, - "description": "

Get the type of a tag's tagged object

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tag_target_type-32" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tag_target_type-78" - ] - } - }, - "git_tag_name": { - "type": "function", - "file": "git2/tag.h", - "line": 113, - "lineto": 113, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const char *", - "comment": " name of the tag" - }, - "description": "

Get the name of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tag_name-33" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tag_name-79" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_tag_name-16" - ] - } - }, - "git_tag_tagger": { - "type": "function", - "file": "git2/tag.h", - "line": 121, - "lineto": 121, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const git_signature *", - "comment": " reference to the tag's author or NULL when unspecified" - }, - "description": "

Get the tagger (author) of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tag_tagger-34" - ] - } - }, - "git_tag_message": { - "type": "function", - "file": "git2/tag.h", - "line": 129, - "lineto": 129, - "args": [ - { - "name": "tag", - "type": "const git_tag *", - "comment": "a previously loaded tag." - } - ], - "argline": "const git_tag *tag", - "sig": "const git_tag *", - "return": { - "type": "const char *", - "comment": " message of the tag or NULL when unspecified" - }, - "description": "

Get the message of a tag

\n", - "comments": "", - "group": "tag", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tag_message-35", - "ex/v1.7.2/cat-file.html#git_tag_message-36" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tag_message-80" - ], - "tag.c": [ - "ex/v1.7.2/tag.html#git_tag_message-17" - ] - } - }, - "git_tag_create": { - "type": "function", - "file": "git2/tag.h", - "line": 171, - "lineto": 178, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the\n newly created tag. If the tag already exists, this parameter\n will be the oid of the existing tag, and the function will\n return a GIT_EEXISTS error code." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Object to which this tag points. This object\n must belong to the given `repo`." - }, - { - "name": "tagger", - "type": "const git_signature *", - "comment": "Signature of the tagger for this tag, and\n of the tagging time" - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this tag" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message, int force", - "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it" - }, - "description": "

Create a new tag in the repository from an object

\n", - "comments": "

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.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.7.2/tag.html#git_tag_create-18" - ] - } - }, - "git_tag_annotation_create": { - "type": "function", - "file": "git2/tag.h", - "line": 203, - "lineto": 209, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the\n newly created tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name for the tag" - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Object to which this tag points. This object\n must belong to the given `repo`." - }, - { - "name": "tagger", - "type": "const git_signature *", - "comment": "Signature of the tagger for this tag, and\n of the tagging time" - }, - { - "name": "message", - "type": "const char *", - "comment": "Full message for this tag" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message", - "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Create a new tag in the object database pointing to a git_object

\n", - "comments": "

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n", - "group": "tag" - }, - "git_tag_create_from_buffer": { - "type": "function", - "file": "git2/tag.h", - "line": 220, - "lineto": 224, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the newly created tag" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the tag" - }, - { - "name": "buffer", - "type": "const char *", - "comment": "Raw tag data" - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing tags" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *buffer, int force", - "sig": "git_oid *::git_repository *::const char *::int", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Create a new tag in the repository from a buffer

\n", - "comments": "", - "group": "tag" - }, - "git_tag_create_lightweight": { - "type": "function", - "file": "git2/tag.h", - "line": 256, - "lineto": 261, - "args": [ - { - "name": "oid", - "type": "git_oid *", - "comment": "Pointer where to store the OID of the provided\n target object. If the tag already exists, this parameter\n will be filled with the oid of the existing pointed object\n and the function will return a GIT_EEXISTS error code." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to store the lightweight tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" - }, - { - "name": "target", - "type": "const git_object *", - "comment": "Object to which this tag points. This object\n must belong to the given `repo`." - }, - { - "name": "force", - "type": "int", - "comment": "Overwrite existing references" - } - ], - "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, int force", - "sig": "git_oid *::git_repository *::const char *::const git_object *::int", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object" - }, - "description": "

Create a new lightweight tag pointing at a target object

\n", - "comments": "

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.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.7.2/tag.html#git_tag_create_lightweight-19" - ] - } - }, - "git_tag_delete": { - "type": "function", - "file": "git2/tag.h", - "line": 276, - "lineto": 278, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where lives the tag" - }, - { - "name": "tag_name", - "type": "const char *", - "comment": "Name of the tag to be deleted;\n this name is validated for consistency." - } - ], - "argline": "git_repository *repo, const char *tag_name", - "sig": "git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" - }, - "description": "

Delete an existing tag reference.

\n", - "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.7.2/tag.html#git_tag_delete-20" - ] - } - }, - "git_tag_list": { - "type": "function", - "file": "git2/tag.h", - "line": 293, - "lineto": 295, - "args": [ - { - "name": "tag_names", - "type": "git_strarray *", - "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the tags" - } - ], - "argline": "git_strarray *tag_names, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Fill a list with all the tags in the Repository

\n", - "comments": "

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.

\n", - "group": "tag" - }, - "git_tag_list_match": { - "type": "function", - "file": "git2/tag.h", - "line": 315, - "lineto": 318, - "args": [ - { - "name": "tag_names", - "type": "git_strarray *", - "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" - }, - { - "name": "pattern", - "type": "const char *", - "comment": "Standard fnmatch pattern" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the tags" - } - ], - "argline": "git_strarray *tag_names, const char *pattern, git_repository *repo", - "sig": "git_strarray *::const char *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", - "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

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.

\n", - "group": "tag", - "examples": { - "tag.c": [ - "ex/v1.7.2/tag.html#git_tag_list_match-21" - ] - } - }, - "git_tag_foreach": { - "type": "function", - "file": "git2/tag.h", - "line": 339, - "lineto": 342, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository" - }, - { - "name": "callback", - "type": "git_tag_foreach_cb", - "comment": "Callback function" - }, - { - "name": "payload", - "type": "void *", - "comment": "Pointer to callback data (optional)" - } - ], - "argline": "git_repository *repo, git_tag_foreach_cb callback, void *payload", - "sig": "git_repository *::git_tag_foreach_cb::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Call callback `cb' for each tag in the repository

\n", - "comments": "", - "group": "tag" - }, - "git_tag_peel": { - "type": "function", - "file": "git2/tag.h", - "line": 355, - "lineto": 357, - "args": [ - { - "name": "tag_target_out", - "type": "git_object **", - "comment": "Pointer to the peeled git_object" - }, - { - "name": "tag", - "type": "const git_tag *", - "comment": "The tag to be processed" - } - ], - "argline": "git_object **tag_target_out, const git_tag *tag", - "sig": "git_object **::const git_tag *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Recursively peel a tag until a non tag git_object is found

\n", - "comments": "

The retrieved tag_target object is owned by the repository and should be closed with the git_object_free method.

\n", - "group": "tag" - }, - "git_tag_dup": { - "type": "function", - "file": "git2/tag.h", - "line": 367, - "lineto": 367, - "args": [ - { - "name": "out", - "type": "git_tag **", - "comment": "Pointer to store the copy of the tag" - }, - { - "name": "source", - "type": "git_tag *", - "comment": "Original tag to copy" - } - ], - "argline": "git_tag **out, git_tag *source", - "sig": "git_tag **::git_tag *", - "return": { - "type": "int", - "comment": " 0" - }, - "description": "

Create an in-memory copy of a tag. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "tag" - }, - "git_tag_name_is_valid": { - "type": "function", - "file": "git2/tag.h", - "line": 379, - "lineto": 379, - "args": [ - { - "name": "valid", - "type": "int *", - "comment": "output pointer to set with validity of given tag name" - }, - { - "name": "name", - "type": "const char *", - "comment": "a tag name to test" - } - ], - "argline": "int *valid, const char *name", - "sig": "int *::const char *", - "return": { - "type": "int", - "comment": " 0 on success or an error code" - }, - "description": "

Determine whether a tag name is valid, meaning that (when prefixed\n with refs/tags/) that it is a valid reference name, and that any\n additional tag name restrictions are imposed (eg, it cannot start\n with a -).

\n", - "comments": "", - "group": "tag" - }, - "git_trace_set": { - "type": "function", - "file": "git2/trace.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "level", - "type": "git_trace_level_t", - "comment": "Level to set tracing to" - }, - { - "name": "cb", - "type": "git_trace_cb", - "comment": "Function to call with trace data" - } - ], - "argline": "git_trace_level_t level, git_trace_cb cb", - "sig": "git_trace_level_t::git_trace_cb", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Sets the system tracing configuration to the specified level with the\n specified callback. When system events occur at a level equal to, or\n lower than, the given level they will be reported to the given callback.

\n", - "comments": "", - "group": "trace" - }, - "git_transaction_new": { - "type": "function", - "file": "git2/transaction.h", - "line": 32, - "lineto": 32, - "args": [ - { - "name": "out", - "type": "git_transaction **", - "comment": "the resulting transaction" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to lock" - } - ], - "argline": "git_transaction **out, git_repository *repo", - "sig": "git_transaction **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a new transaction object

\n", - "comments": "

This does not lock anything, but sets up the transaction object to know from which repository to lock.

\n", - "group": "transaction" - }, - "git_transaction_lock_ref": { - "type": "function", - "file": "git2/transaction.h", - "line": 44, - "lineto": 44, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to lock" - } - ], - "argline": "git_transaction *tx, const char *refname", - "sig": "git_transaction *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error message" - }, - "description": "

Lock a reference

\n", - "comments": "

Lock the specified reference. This is the first step to updating a reference.

\n", - "group": "transaction" - }, - "git_transaction_set_target": { - "type": "function", - "file": "git2/transaction.h", - "line": 59, - "lineto": 59, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "reference to update" - }, - { - "name": "target", - "type": "const git_oid *", - "comment": "target to set the reference to" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to use in the reflog; pass NULL to read the identity from the config" - }, - { - "name": "msg", - "type": "const char *", - "comment": "message to use in the reflog" - } - ], - "argline": "git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg", - "sig": "git_transaction *::const char *::const git_oid *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Set the target of a reference

\n", - "comments": "

Set the target of the specified reference. This reference must be locked.

\n", - "group": "transaction" - }, - "git_transaction_set_symbolic_target": { - "type": "function", - "file": "git2/transaction.h", - "line": 74, - "lineto": 74, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "reference to update" - }, - { - "name": "target", - "type": "const char *", - "comment": "target to set the reference to" - }, - { - "name": "sig", - "type": "const git_signature *", - "comment": "signature to use in the reflog; pass NULL to read the identity from the config" - }, - { - "name": "msg", - "type": "const char *", - "comment": "message to use in the reflog" - } - ], - "argline": "git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg", - "sig": "git_transaction *::const char *::const char *::const git_signature *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Set the target of a reference

\n", - "comments": "

Set the target of the specified reference. This reference must be locked.

\n", - "group": "transaction" - }, - "git_transaction_set_reflog": { - "type": "function", - "file": "git2/transaction.h", - "line": 87, - "lineto": 87, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference whose reflog to set" - }, - { - "name": "reflog", - "type": "const git_reflog *", - "comment": "the reflog as it should be written out" - } - ], - "argline": "git_transaction *tx, const char *refname, const git_reflog *reflog", - "sig": "git_transaction *::const char *::const git_reflog *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Set the reflog of a reference

\n", - "comments": "

Set the specified reference's reflog. If this is combined with setting the target, that update won't be written to the reflog.

\n", - "group": "transaction" - }, - "git_transaction_remove": { - "type": "function", - "file": "git2/transaction.h", - "line": 96, - "lineto": 96, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - }, - { - "name": "refname", - "type": "const char *", - "comment": "the reference to remove" - } - ], - "argline": "git_transaction *tx, const char *refname", - "sig": "git_transaction *::const char *", - "return": { - "type": "int", - "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" - }, - "description": "

Remove a reference

\n", - "comments": "", - "group": "transaction" - }, - "git_transaction_commit": { - "type": "function", - "file": "git2/transaction.h", - "line": 107, - "lineto": 107, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - } - ], - "argline": "git_transaction *tx", - "sig": "git_transaction *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Commit the changes from the transaction

\n", - "comments": "

Perform the changes that have been queued. The updates will be made one by one, and the first failure will stop the processing.

\n", - "group": "transaction" - }, - "git_transaction_free": { - "type": "function", - "file": "git2/transaction.h", - "line": 117, - "lineto": 117, - "args": [ - { - "name": "tx", - "type": "git_transaction *", - "comment": "the transaction" - } - ], - "argline": "git_transaction *tx", - "sig": "git_transaction *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free the resources allocated by this transaction

\n", - "comments": "

If any references remain locked, they will be unlocked without any changes made to them.

\n", - "group": "transaction" - }, - "git_tree_lookup": { - "type": "function", - "file": "git2/tree.h", - "line": 32, - "lineto": 33, - "args": [ - { - "name": "out", - "type": "git_tree **", - "comment": "Pointer to the looked up tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repo to use when locating the tree." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "Identity of the tree to locate." - } - ], - "argline": "git_tree **out, git_repository *repo, const git_oid *id", - "sig": "git_tree **::git_repository *::const git_oid *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tree object from the repository.

\n", - "comments": "", - "group": "tree", - "examples": { - "commit.c": [ - "ex/v1.7.2/commit.html#git_tree_lookup-12" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tree_lookup-81", - "ex/v1.7.2/general.html#git_tree_lookup-82" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_tree_lookup-12" - ], - "merge.c": [ - "ex/v1.7.2/merge.html#git_tree_lookup-37" - ] - } - }, - "git_tree_lookup_prefix": { - "type": "function", - "file": "git2/tree.h", - "line": 47, - "lineto": 51, - "args": [ - { - "name": "out", - "type": "git_tree **", - "comment": "pointer to the looked up tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when locating the tree." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "identity of the tree to locate." - }, - { - "name": "len", - "type": "size_t", - "comment": "the length of the short identifier" - } - ], - "argline": "git_tree **out, git_repository *repo, const git_oid *id, size_t len", - "sig": "git_tree **::git_repository *::const git_oid *::size_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a tree object from the repository,\n given a prefix of its identifier (short id).

\n", - "comments": "", - "group": "tree" - }, - "git_tree_free": { - "type": "function", - "file": "git2/tree.h", - "line": 63, - "lineto": 63, - "args": [ - { - "name": "tree", - "type": "git_tree *", - "comment": "The tree to close" - } - ], - "argline": "git_tree *tree", - "sig": "git_tree *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Close an open tree

\n", - "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", - "group": "tree", - "examples": { - "commit.c": [ - "ex/v1.7.2/commit.html#git_tree_free-13" - ], - "diff.c": [ - "ex/v1.7.2/diff.html#git_tree_free-19", - "ex/v1.7.2/diff.html#git_tree_free-20" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tree_free-83", - "ex/v1.7.2/general.html#git_tree_free-84" - ], - "init.c": [ - "ex/v1.7.2/init.html#git_tree_free-13" - ], - "log.c": [ - "ex/v1.7.2/log.html#git_tree_free-55", - "ex/v1.7.2/log.html#git_tree_free-56", - "ex/v1.7.2/log.html#git_tree_free-57", - "ex/v1.7.2/log.html#git_tree_free-58", - "ex/v1.7.2/log.html#git_tree_free-59" - ] - } - }, - "git_tree_id": { - "type": "function", - "file": "git2/tree.h", - "line": 71, - "lineto": 71, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - } - ], - "argline": "const git_tree *tree", - "sig": "const git_tree *", - "return": { - "type": "const git_oid *", - "comment": " object identity for the tree." - }, - "description": "

Get the id of a tree.

\n", - "comments": "", - "group": "tree" - }, - "git_tree_owner": { - "type": "function", - "file": "git2/tree.h", - "line": 79, - "lineto": 79, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "A previously loaded tree." - } - ], - "argline": "const git_tree *tree", - "sig": "const git_tree *", - "return": { - "type": "git_repository *", - "comment": " Repository that contains this tree." - }, - "description": "

Get the repository that contains the tree.

\n", - "comments": "", - "group": "tree" - }, - "git_tree_entrycount": { - "type": "function", - "file": "git2/tree.h", - "line": 87, - "lineto": 87, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - } - ], - "argline": "const git_tree *tree", - "sig": "const git_tree *", - "return": { - "type": "size_t", - "comment": " the number of entries in the tree" - }, - "description": "

Get the number of entries listed in a tree

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tree_entrycount-37" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tree_entrycount-85" - ] - } - }, - "git_tree_entry_byname": { - "type": "function", - "file": "git2/tree.h", - "line": 99, - "lineto": 100, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - }, - { - "name": "filename", - "type": "const char *", - "comment": "the filename of the desired entry" - } - ], - "argline": "const git_tree *tree, const char *filename", - "sig": "const git_tree *::const char *", - "return": { - "type": "const git_tree_entry *", - "comment": " the tree entry; NULL if not found" - }, - "description": "

Lookup a tree entry by its filename

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", - "group": "tree", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_tree_entry_byname-86" - ] - } - }, - "git_tree_entry_byindex": { - "type": "function", - "file": "git2/tree.h", - "line": 112, - "lineto": 113, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - }, - { - "name": "idx", - "type": "size_t", - "comment": "the position in the entry list" - } - ], - "argline": "const git_tree *tree, size_t idx", - "sig": "const git_tree *::size_t", - "return": { - "type": "const git_tree_entry *", - "comment": " the tree entry; NULL if not found" - }, - "description": "

Lookup a tree entry by its position in the tree

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tree_entry_byindex-38" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tree_entry_byindex-87" - ] - } - }, - "git_tree_entry_byid": { - "type": "function", - "file": "git2/tree.h", - "line": 127, - "lineto": 128, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "a previously loaded tree." - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "the sha being looked for" - } - ], - "argline": "const git_tree *tree, const git_oid *id", - "sig": "const git_tree *::const git_oid *", - "return": { - "type": "const git_tree_entry *", - "comment": " the tree entry; NULL if not found" - }, - "description": "

Lookup a tree entry by SHA value.

\n", - "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", - "group": "tree" - }, - "git_tree_entry_bypath": { - "type": "function", - "file": "git2/tree.h", - "line": 142, - "lineto": 145, - "args": [ - { - "name": "out", - "type": "git_tree_entry **", - "comment": "Pointer where to store the tree entry" - }, - { - "name": "root", - "type": "const git_tree *", - "comment": "Previously loaded tree which is the root of the relative path" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to the contained entry" - } - ], - "argline": "git_tree_entry **out, const git_tree *root, const char *path", - "sig": "git_tree_entry **::const git_tree *::const char *", - "return": { - "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if the path does not exist" - }, - "description": "

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n", - "comments": "

Unlike the other lookup functions, the returned tree entry is owned by the user and must be freed explicitly with git_tree_entry_free().

\n", - "group": "tree" - }, - "git_tree_entry_dup": { - "type": "function", - "file": "git2/tree.h", - "line": 157, - "lineto": 157, - "args": [ - { - "name": "dest", - "type": "git_tree_entry **", - "comment": "pointer where to store the copy" - }, - { - "name": "source", - "type": "const git_tree_entry *", - "comment": "tree entry to duplicate" - } - ], - "argline": "git_tree_entry **dest, const git_tree_entry *source", - "sig": "git_tree_entry **::const git_tree_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Duplicate a tree entry

\n", - "comments": "

Create a copy of a tree entry. The returned copy is owned by the user, and must be freed explicitly with git_tree_entry_free().

\n", - "group": "tree" - }, - "git_tree_entry_free": { - "type": "function", - "file": "git2/tree.h", - "line": 168, - "lineto": 168, - "args": [ - { - "name": "entry", - "type": "git_tree_entry *", - "comment": "The entry to free" - } - ], - "argline": "git_tree_entry *entry", - "sig": "git_tree_entry *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a user-owned tree entry

\n", - "comments": "

IMPORTANT: This function is only needed for tree entries owned by the user, such as the ones returned by git_tree_entry_dup() or git_tree_entry_bypath().

\n", - "group": "tree" - }, - "git_tree_entry_name": { - "type": "function", - "file": "git2/tree.h", - "line": 176, - "lineto": 176, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "const char *", - "comment": " the name of the file" - }, - "description": "

Get the filename of a tree entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tree_entry_name-39" - ], - "general.c": [ - "ex/v1.7.2/general.html#git_tree_entry_name-88", - "ex/v1.7.2/general.html#git_tree_entry_name-89" - ] - } - }, - "git_tree_entry_id": { - "type": "function", - "file": "git2/tree.h", - "line": 184, - "lineto": 184, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "const git_oid *", - "comment": " the oid of the object" - }, - "description": "

Get the id of the object pointed by the entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tree_entry_id-40" - ] - } - }, - "git_tree_entry_type": { - "type": "function", - "file": "git2/tree.h", - "line": 192, - "lineto": 192, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "git_object_t", - "comment": " the type of the pointed object" - }, - "description": "

Get the type of the object pointed by the entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tree_entry_type-41" - ] - } - }, - "git_tree_entry_filemode": { - "type": "function", - "file": "git2/tree.h", - "line": 200, - "lineto": 200, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "git_filemode_t", - "comment": " filemode as an integer" - }, - "description": "

Get the UNIX file attributes of a tree entry

\n", - "comments": "", - "group": "tree", - "examples": { - "cat-file.c": [ - "ex/v1.7.2/cat-file.html#git_tree_entry_filemode-42" - ] - } - }, - "git_tree_entry_filemode_raw": { - "type": "function", - "file": "git2/tree.h", - "line": 212, - "lineto": 212, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "const git_tree_entry *entry", - "sig": "const git_tree_entry *", - "return": { - "type": "git_filemode_t", - "comment": " filemode as an integer" - }, - "description": "

Get the raw UNIX file attributes of a tree entry

\n", - "comments": "

This function does not perform any normalization and is only useful if you need to be able to recreate the original tree object.

\n", - "group": "tree" - }, - "git_tree_entry_cmp": { - "type": "function", - "file": "git2/tree.h", - "line": 220, - "lineto": 220, - "args": [ - { - "name": "e1", - "type": "const git_tree_entry *", - "comment": "first tree entry" - }, - { - "name": "e2", - "type": "const git_tree_entry *", - "comment": "second tree entry" - } - ], - "argline": "const git_tree_entry *e1, const git_tree_entry *e2", - "sig": "const git_tree_entry *::const git_tree_entry *", - "return": { - "type": "int", - "comment": " \n<\n0 if e1 is before e2, 0 if e1 == e2, >0 if e1 is after e2" - }, - "description": "

Compare two tree entries

\n", - "comments": "", - "group": "tree" - }, - "git_tree_entry_to_object": { - "type": "function", - "file": "git2/tree.h", - "line": 232, - "lineto": 235, - "args": [ - { - "name": "object_out", - "type": "git_object **", - "comment": "pointer to the converted object" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to lookup the pointed object" - }, - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": "a tree entry" - } - ], - "argline": "git_object **object_out, git_repository *repo, const git_tree_entry *entry", - "sig": "git_object **::git_repository *::const git_tree_entry *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Convert a tree entry to the git_object it points to.

\n", - "comments": "

You must call git_object_free() on the object when you are done with it.

\n", - "group": "tree", - "examples": { - "general.c": [ - "ex/v1.7.2/general.html#git_tree_entry_to_object-90" - ] - } - }, - "git_treebuilder_new": { - "type": "function", - "file": "git2/tree.h", - "line": 254, - "lineto": 255, - "args": [ - { - "name": "out", - "type": "git_treebuilder **", - "comment": "Pointer where to store the tree builder" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository in which to store the object" - }, - { - "name": "source", - "type": "const git_tree *", - "comment": "Source tree to initialize the builder (optional)" - } - ], - "argline": "git_treebuilder **out, git_repository *repo, const git_tree *source", - "sig": "git_treebuilder **::git_repository *::const git_tree *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Create a new tree builder.

\n", - "comments": "

The tree builder can be used to create or modify trees in memory and write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no entries and will have to be filled manually.

\n", - "group": "treebuilder" - }, - "git_treebuilder_clear": { - "type": "function", - "file": "git2/tree.h", - "line": 263, - "lineto": 263, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Builder to clear" - } - ], - "argline": "git_treebuilder *bld", - "sig": "git_treebuilder *", - "return": { - "type": "int", - "comment": " 0 on success; error code otherwise" - }, - "description": "

Clear all the entries in the builder

\n", - "comments": "", - "group": "treebuilder" - }, - "git_treebuilder_entrycount": { - "type": "function", - "file": "git2/tree.h", - "line": 271, - "lineto": 271, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "a previously loaded treebuilder." - } - ], - "argline": "git_treebuilder *bld", - "sig": "git_treebuilder *", - "return": { - "type": "size_t", - "comment": " the number of entries in the treebuilder" - }, - "description": "

Get the number of entries listed in a treebuilder

\n", - "comments": "", - "group": "treebuilder" - }, - "git_treebuilder_free": { - "type": "function", - "file": "git2/tree.h", - "line": 282, - "lineto": 282, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Builder to free" - } - ], - "argline": "git_treebuilder *bld", - "sig": "git_treebuilder *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a tree builder

\n", - "comments": "

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

\n", - "group": "treebuilder" - }, - "git_treebuilder_get": { - "type": "function", - "file": "git2/tree.h", - "line": 294, - "lineto": 295, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filename", - "type": "const char *", - "comment": "Name of the entry" - } - ], - "argline": "git_treebuilder *bld, const char *filename", - "sig": "git_treebuilder *::const char *", - "return": { - "type": "const git_tree_entry *", - "comment": " pointer to the entry; NULL if not found" - }, - "description": "

Get an entry from the builder from its filename

\n", - "comments": "

The returned entry is owned by the builder and should not be freed manually.

\n", - "group": "treebuilder" - }, - "git_treebuilder_insert": { - "type": "function", - "file": "git2/tree.h", - "line": 325, - "lineto": 330, - "args": [ - { - "name": "out", - "type": "const git_tree_entry **", - "comment": "Pointer to store the entry (optional)" - }, - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filename", - "type": "const char *", - "comment": "Filename of the entry" - }, - { - "name": "id", - "type": "const git_oid *", - "comment": "SHA1 oid of the entry" - }, - { - "name": "filemode", - "type": "git_filemode_t", - "comment": "Folder attributes of the entry. This parameter must\n\t\t\tbe valued with one of the following entries: 0040000, 0100644,\n\t\t\t0100755, 0120000 or 0160000." - } - ], - "argline": "const git_tree_entry **out, git_treebuilder *bld, const char *filename, const git_oid *id, git_filemode_t filemode", - "sig": "const git_tree_entry **::git_treebuilder *::const char *::const git_oid *::git_filemode_t", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add or update an entry to the builder

\n", - "comments": "

Insert a new entry for filename in the builder with the given attributes.

\n\n

If an entry named filename already exists, its attributes will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the newly created/updated entry. Pass NULL if you do not need it. The pointer may not be valid past the next operation in this builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for validity; that it exists in the object database and is of the correct type. If you do not want this behavior, set the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", - "group": "treebuilder" - }, - "git_treebuilder_remove": { - "type": "function", - "file": "git2/tree.h", - "line": 339, - "lineto": 340, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filename", - "type": "const char *", - "comment": "Filename of the entry to remove" - } - ], - "argline": "git_treebuilder *bld, const char *filename", - "sig": "git_treebuilder *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Remove an entry from the builder by its filename

\n", - "comments": "", - "group": "treebuilder" - }, - "git_treebuilder_filter": { - "type": "function", - "file": "git2/tree.h", - "line": 364, - "lineto": 367, - "args": [ - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder" - }, - { - "name": "filter", - "type": "git_treebuilder_filter_cb", - "comment": "Callback to filter entries" - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra data to pass to filter callback" - } - ], - "argline": "git_treebuilder *bld, git_treebuilder_filter_cb filter, void *payload", - "sig": "git_treebuilder *::git_treebuilder_filter_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Selectively remove entries in the tree

\n", - "comments": "

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 non-zero, the entry will be filtered (removed from the builder).

\n", - "group": "treebuilder" - }, - "git_treebuilder_write": { - "type": "function", - "file": "git2/tree.h", - "line": 379, - "lineto": 380, - "args": [ - { - "name": "id", - "type": "git_oid *", - "comment": "Pointer to store the OID of the newly written tree" - }, - { - "name": "bld", - "type": "git_treebuilder *", - "comment": "Tree builder to write" - } - ], - "argline": "git_oid *id, git_treebuilder *bld", - "sig": "git_oid *::git_treebuilder *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Write the contents of the tree builder as a tree object

\n", - "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", - "group": "treebuilder" - }, - "git_tree_walk": { - "type": "function", - "file": "git2/tree.h", - "line": 409, - "lineto": 413, - "args": [ - { - "name": "tree", - "type": "const git_tree *", - "comment": "The tree to walk" - }, - { - "name": "mode", - "type": "git_treewalk_mode", - "comment": "Traversal mode (pre or post-order)" - }, - { - "name": "callback", - "type": "git_treewalk_cb", - "comment": "Function to call on each tree entry" - }, - { - "name": "payload", - "type": "void *", - "comment": "Opaque pointer to be passed on each callback" - } - ], - "argline": "const git_tree *tree, git_treewalk_mode mode, git_treewalk_cb callback, void *payload", - "sig": "const git_tree *::git_treewalk_mode::git_treewalk_cb::void *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Traverse the entries in a tree and its subtrees in post or pre order.

\n", - "comments": "

The entries will be traversed in the specified order, children subtrees will be automatically loaded as required, and the callback will be called once per entry with the current (relative) root for the entry and the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be skipped on the traversal (in pre mode). A negative value stops the walk.

\n", - "group": "tree" - }, - "git_tree_dup": { - "type": "function", - "file": "git2/tree.h", - "line": 423, - "lineto": 423, - "args": [ - { - "name": "out", - "type": "git_tree **", - "comment": "Pointer to store the copy of the tree" - }, - { - "name": "source", - "type": "git_tree *", - "comment": "Original tree to copy" - } - ], - "argline": "git_tree **out, git_tree *source", - "sig": "git_tree **::git_tree *", - "return": { - "type": "int", - "comment": " 0" - }, - "description": "

Create an in-memory copy of a tree. The copy must be explicitly\n free'd or it will leak.

\n", - "comments": "", - "group": "tree" - }, - "git_tree_create_updated": { - "type": "function", - "file": "git2/tree.h", - "line": 470, - "lineto": 470, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "id of the new tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the tree, must be the\n same as for `baseline`" - }, - { - "name": "baseline", - "type": "git_tree *", - "comment": "the tree to base these changes on" - }, - { - "name": "nupdates", - "type": "size_t", - "comment": "the number of elements in the update list" - }, - { - "name": "updates", - "type": "const git_tree_update *", - "comment": "the list of updates to perform" - } - ], - "argline": "git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates", - "sig": "git_oid *::git_repository *::git_tree *::size_t::const git_tree_update *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Create a tree based on another one with the specified modifications

\n", - "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", - "group": "tree" - }, - "git_worktree_list": { - "type": "function", - "file": "git2/worktree.h", - "line": 34, - "lineto": 34, - "args": [ - { - "name": "out", - "type": "git_strarray *", - "comment": "pointer to the array of working tree names" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repo to use when listing working trees" - } - ], - "argline": "git_strarray *out, git_repository *repo", - "sig": "git_strarray *::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

List names of linked working trees

\n", - "comments": "

The returned list should be released with git_strarray_free when no longer needed.

\n", - "group": "worktree" - }, - "git_worktree_lookup": { - "type": "function", - "file": "git2/worktree.h", - "line": 44, - "lineto": 44, - "args": [ - { - "name": "out", - "type": "git_worktree **", - "comment": "Output pointer to looked up worktree or `NULL`" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The repository containing worktrees" - }, - { - "name": "name", - "type": "const char *", - "comment": "Name of the working tree to look up" - } - ], - "argline": "git_worktree **out, git_repository *repo, const char *name", - "sig": "git_worktree **::git_repository *::const char *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Lookup a working tree by its name for a given repository

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_open_from_repository": { - "type": "function", - "file": "git2/worktree.h", - "line": 57, - "lineto": 57, - "args": [ - { - "name": "out", - "type": "git_worktree **", - "comment": "Out-pointer for the newly allocated worktree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository to look up worktree for" - } - ], - "argline": "git_worktree **out, git_repository *repo", - "sig": "git_worktree **::git_repository *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Open a worktree of a given repository

\n", - "comments": "

If a repository is not the main tree but a worktree, this function will look up the worktree inside the parent repository and create a new git_worktree structure.

\n", - "group": "worktree" - }, - "git_worktree_free": { - "type": "function", - "file": "git2/worktree.h", - "line": 64, - "lineto": 64, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "worktree handle to close. If NULL nothing occurs." - } - ], - "argline": "git_worktree *wt", - "sig": "git_worktree *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Free a previously allocated worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_validate": { - "type": "function", - "file": "git2/worktree.h", - "line": 76, - "lineto": 76, - "args": [ - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to check" - } - ], - "argline": "const git_worktree *wt", - "sig": "const git_worktree *", - "return": { - "type": "int", - "comment": " 0 when worktree is valid, error-code otherwise" - }, - "description": "

Check if worktree is valid

\n", - "comments": "

A valid worktree requires both the git data structures inside the linked parent repository and the linked working copy to be present.

\n", - "group": "worktree" - }, - "git_worktree_add_options_init": { - "type": "function", - "file": "git2/worktree.h", - "line": 110, - "lineto": 111, - "args": [ - { - "name": "opts", - "type": "git_worktree_add_options *", - "comment": "The `git_worktree_add_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`." - } - ], - "argline": "git_worktree_add_options *opts, unsigned int version", - "sig": "git_worktree_add_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_worktree_add_options structure

\n", - "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", - "group": "worktree" - }, - "git_worktree_add": { - "type": "function", - "file": "git2/worktree.h", - "line": 127, - "lineto": 129, - "args": [ - { - "name": "out", - "type": "git_worktree **", - "comment": "Output pointer containing new working tree" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository to create working tree for" - }, - { - "name": "name", - "type": "const char *", - "comment": "Name of the working tree" - }, - { - "name": "path", - "type": "const char *", - "comment": "Path to create working tree at" - }, - { - "name": "opts", - "type": "const git_worktree_add_options *", - "comment": "Options to modify default behavior. May be NULL" - } - ], - "argline": "git_worktree **out, git_repository *repo, const char *name, const char *path, const git_worktree_add_options *opts", - "sig": "git_worktree **::git_repository *::const char *::const char *::const git_worktree_add_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Add a new working tree

\n", - "comments": "

Add a new working tree for the repository, that is create the required data structures inside the repository and check out the current HEAD at path

\n", - "group": "worktree" - }, - "git_worktree_lock": { - "type": "function", - "file": "git2/worktree.h", - "line": 141, - "lineto": 141, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "Worktree to lock" - }, - { - "name": "reason", - "type": "const char *", - "comment": "Reason why the working tree is being locked" - } - ], - "argline": "git_worktree *wt, const char *reason", - "sig": "git_worktree *::const char *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero otherwise" - }, - "description": "

Lock worktree if not already locked

\n", - "comments": "

Lock a worktree, optionally specifying a reason why the linked working tree is being locked.

\n", - "group": "worktree" - }, - "git_worktree_unlock": { - "type": "function", - "file": "git2/worktree.h", - "line": 150, - "lineto": 150, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "Worktree to unlock" - } - ], - "argline": "git_worktree *wt", - "sig": "git_worktree *", - "return": { - "type": "int", - "comment": " 0 on success, 1 if worktree was not locked, error-code\n otherwise" - }, - "description": "

Unlock a locked worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_is_locked": { - "type": "function", - "file": "git2/worktree.h", - "line": 164, - "lineto": 164, - "args": [ - { - "name": "reason", - "type": "git_buf *", - "comment": "Buffer to store reason in. If NULL no reason is stored." - }, - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to check" - } - ], - "argline": "git_buf *reason, const git_worktree *wt", - "sig": "git_buf *::const git_worktree *", - "return": { - "type": "int", - "comment": " 0 when the working tree not locked, a value greater\n than zero if it is locked, less than zero if there was an\n error" - }, - "description": "

Check if worktree is locked

\n", - "comments": "

A worktree may be locked if the linked working tree is stored on a portable device which is not available.

\n", - "group": "worktree" - }, - "git_worktree_name": { - "type": "function", - "file": "git2/worktree.h", - "line": 173, - "lineto": 173, - "args": [ - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to get the name for" - } - ], - "argline": "const git_worktree *wt", - "sig": "const git_worktree *", - "return": { - "type": "const char *", - "comment": " The worktree's name. The pointer returned is valid for the\n lifetime of the git_worktree" - }, - "description": "

Retrieve the name of the worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_path": { - "type": "function", - "file": "git2/worktree.h", - "line": 182, - "lineto": 182, - "args": [ - { - "name": "wt", - "type": "const git_worktree *", - "comment": "Worktree to get the path for" - } - ], - "argline": "const git_worktree *wt", - "sig": "const git_worktree *", - "return": { - "type": "const char *", - "comment": " The worktree's filesystem path. The pointer returned\n is valid for the lifetime of the git_worktree." - }, - "description": "

Retrieve the filesystem path for the worktree

\n", - "comments": "", - "group": "worktree" - }, - "git_worktree_prune_options_init": { - "type": "function", - "file": "git2/worktree.h", - "line": 224, - "lineto": 226, - "args": [ - { - "name": "opts", - "type": "git_worktree_prune_options *", - "comment": "The `git_worktree_prune_options` struct to initialize." - }, - { - "name": "version", - "type": "unsigned int", - "comment": "The struct version; pass `GIT_WORKTREE_PRUNE_OPTIONS_VERSION`." - } - ], - "argline": "git_worktree_prune_options *opts, unsigned int version", - "sig": "git_worktree_prune_options *::unsigned int", - "return": { - "type": "int", - "comment": " Zero on success; -1 on failure." - }, - "description": "

Initialize git_worktree_prune_options structure

\n", - "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", - "group": "worktree" - }, - "git_worktree_is_prunable": { - "type": "function", - "file": "git2/worktree.h", - "line": 248, - "lineto": 249, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "Worktree to check." - }, - { - "name": "opts", - "type": "git_worktree_prune_options *", - "comment": "The prunable options." - } - ], - "argline": "git_worktree *wt, git_worktree_prune_options *opts", - "sig": "git_worktree *::git_worktree_prune_options *", - "return": { - "type": "int", - "comment": " 1 if the worktree is prunable, 0 otherwise, or an error code." - }, - "description": "

Is the worktree prunable with the given options?

\n", - "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The valid member will cause this check to be ignored. - the worktree is locked. The locked flag will cause this check to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above flags have been passed in, this function will return a positive value. If the worktree is not prunable, an error message will be set (visible in giterr_last) with details about why.

\n", - "group": "worktree" - }, - "git_worktree_prune": { - "type": "function", - "file": "git2/worktree.h", - "line": 263, - "lineto": 264, - "args": [ - { - "name": "wt", - "type": "git_worktree *", - "comment": "Worktree to prune" - }, - { - "name": "opts", - "type": "git_worktree_prune_options *", - "comment": "Specifies which checks to override. See\n `git_worktree_is_prunable`. May be NULL" - } - ], - "argline": "git_worktree *wt, git_worktree_prune_options *opts", - "sig": "git_worktree *::git_worktree_prune_options *", - "return": { - "type": "int", - "comment": " 0 or an error code" - }, - "description": "

Prune working tree

\n", - "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", - "group": "worktree" - } - }, - "callbacks": { - "git_apply_delta_cb": { - "type": "callback", - "file": "git2/apply.h", - "line": 38, - "lineto": 40, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": "The delta to be applied" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified payload" - } - ], - "argline": "const git_diff_delta *delta, void *payload", - "sig": "const git_diff_delta *::void *", - "return": { - "type": "int", - "comment": " 0 if the delta is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the delta will not be applied." - }, - "description": "

When applying a patch, callback that will be made per delta (file).

\n", - "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the delta will not be applied, but the apply process continues - returns 0, the delta is applied, and the apply process continues.

\n" - }, - "git_apply_hunk_cb": { - "type": "callback", - "file": "git2/apply.h", - "line": 56, - "lineto": 58, - "args": [ - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": "The hunk to be applied" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified payload" - } - ], - "argline": "const git_diff_hunk *hunk, void *payload", - "sig": "const git_diff_hunk *::void *", - "return": { - "type": "int", - "comment": " 0 if the hunk is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the hunk will not be applied." - }, - "description": "

When applying a patch, callback that will be made per hunk.

\n", - "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n" - }, - "git_attr_foreach_cb": { - "type": "callback", - "file": "git2/attr.h", - "line": 291, - "lineto": 291, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The attribute name." - }, - { - "name": "value", - "type": "const char *", - "comment": "The attribute value. May be NULL if the attribute is explicitly\n set to UNSPECIFIED using the '!' sign." - }, - { - "name": "payload", - "type": "void *", - "comment": "A user-specified pointer." - } - ], - "argline": "const char *name, const char *value, void *payload", - "sig": "const char *::const char *::void *", - "return": { - "type": "int", - "comment": " 0 to continue looping, non-zero to stop. This value will be returned\n from git_attr_foreach." - }, - "description": "

The callback used with git_attr_foreach.

\n", - "comments": "

This callback will be invoked only once per attribute name, even if there are multiple rules for a given file. The highest priority rule will be used.

\n" - }, - "git_transport_certificate_check_cb": { - "type": "callback", - "file": "git2/cert.h", - "line": 72, - "lineto": 72, - "args": [ - { - "name": "cert", - "type": "git_cert *", - "comment": "The host certificate" - }, - { - "name": "valid", - "type": "int", - "comment": "Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid" - }, - { - "name": "host", - "type": "const char *", - "comment": "Hostname of the host libgit2 connected to" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "git_cert *cert, int valid, const char *host, void *payload", - "sig": "git_cert *::int::const char *::void *", - "return": { - "type": "int", - "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" - }, - "description": "

Callback for the user's custom certificate checks.

\n", - "comments": "" + "files": [ + { + "file": "git2/annotated_commit.h", + "functions": [ + "git_annotated_commit_from_ref", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_lookup", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_ref", + "git_annotated_commit_free" + ], + "meta": {}, + "lines": 121 + }, + { + "file": "git2/apply.h", + "functions": [ + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_options_init", + "git_apply_to_tree", + "git_apply" + ], + "meta": {}, + "lines": 161 + }, + { + "file": "git2/attr.h", + "functions": [ + "git_attr_value", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_attr_foreach_cb", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_cache_flush", + "git_attr_add_macro" + ], + "meta": {}, + "lines": 363 + }, + { + "file": "git2/blame.h", + "functions": [ + "git_blame_options_init", + "git_blame_get_hunk_count", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_file", + "git_blame_buffer", + "git_blame_free" + ], + "meta": {}, + "lines": 280 + }, + { + "file": "git2/blob.h", + "functions": [ + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_free", + "git_blob_id", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize", + "git_blob_filter_options_init", + "git_blob_filter", + "git_blob_create_from_workdir", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_buffer", + "git_blob_is_binary", + "git_blob_data_is_binary", + "git_blob_dup" + ], + "meta": {}, + "lines": 307 + }, + { + "file": "git2/branch.h", + "functions": [ + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_iterator_new", + "git_branch_next", + "git_branch_iterator_free", + "git_branch_move", + "git_branch_lookup", + "git_branch_name", + "git_branch_upstream", + "git_branch_set_upstream", + "git_branch_upstream_name", + "git_branch_is_head", + "git_branch_is_checked_out", + "git_branch_remote_name", + "git_branch_upstream_remote", + "git_branch_upstream_merge", + "git_branch_name_is_valid" + ], + "meta": {}, + "lines": 332 + }, + { + "file": "git2/buffer.h", + "functions": ["git_buf_dispose"], + "meta": {}, + "lines": 68 + }, + { + "file": "git2/cert.h", + "functions": ["git_transport_certificate_check_cb"], + "meta": {}, + "lines": 168 + }, + { + "file": "git2/checkout.h", + "functions": [ + "git_checkout_notify_cb", + "git_checkout_progress_cb", + "git_checkout_perfdata_cb", + "git_checkout_options_init", + "git_checkout_head", + "git_checkout_index", + "git_checkout_tree" + ], + "meta": {}, + "lines": 413 + }, + { + "file": "git2/cherrypick.h", + "functions": [ + "git_cherrypick_options_init", + "git_cherrypick_commit", + "git_cherrypick" + ], + "meta": {}, + "lines": 86 + }, + { + "file": "git2/clone.h", + "functions": [ + "git_remote_create_cb", + "git_repository_create_cb", + "git_clone_options_init", + "git_clone" + ], + "meta": {}, + "lines": 205 + }, + { + "file": "git2/commit.h", + "functions": [ + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_free", + "git_commit_id", + "git_commit_owner", + "git_commit_message_encoding", + "git_commit_message", + "git_commit_message_raw", + "git_commit_summary", + "git_commit_body", + "git_commit_time", + "git_commit_time_offset", + "git_commit_committer", + "git_commit_author", + "git_commit_committer_with_mailmap", + "git_commit_author_with_mailmap", + "git_commit_raw_header", + "git_commit_tree", + "git_commit_tree_id", + "git_commit_parentcount", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_nth_gen_ancestor", + "git_commit_header_field", + "git_commit_extract_signature", + "git_commit_create", + "git_commit_create_v", + "git_commit_create_from_stage", + "git_commit_amend", + "git_commit_create_buffer", + "git_commit_create_with_signature", + "git_commit_dup", + "git_commit_create_cb", + "git_commitarray_dispose" + ], + "meta": {}, + "lines": 603 + }, + { + "file": "git2/common.h", + "functions": [ + "git_libgit2_version", + "git_libgit2_prerelease", + "git_libgit2_features", + "git_libgit2_opts" + ], + "meta": {}, + "lines": 530 + }, + { + "file": "git2/config.h", + "functions": [ + "git_config_entry_free", + "git_config_foreach_cb", + "git_config_find_global", + "git_config_find_xdg", + "git_config_find_system", + "git_config_find_programdata", + "git_config_open_default", + "git_config_new", + "git_config_add_file_ondisk", + "git_config_open_ondisk", + "git_config_open_level", + "git_config_open_global", + "git_config_snapshot", + "git_config_free", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_bool", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_get_multivar_foreach", + "git_config_multivar_iterator_new", + "git_config_next", + "git_config_iterator_free", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_bool", + "git_config_set_string", + "git_config_set_multivar", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_foreach", + "git_config_iterator_new", + "git_config_iterator_glob_new", + "git_config_foreach_match", + "git_config_get_mapped", + "git_config_lookup_map_value", + "git_config_parse_bool", + "git_config_parse_int32", + "git_config_parse_int64", + "git_config_parse_path", + "git_config_backend_foreach_match", + "git_config_lock" + ], + "meta": {}, + "lines": 818 + }, + { + "file": "git2/credential.h", + "functions": [ + "git_credential_acquire_cb", + "git_credential_free", + "git_credential_has_username", + "git_credential_get_username", + "git_credential_userpass_plaintext_new", + "git_credential_default_new", + "git_credential_username_new", + "git_credential_ssh_key_new", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_custom_new" + ], + "meta": {}, + "lines": 311 + }, + { + "file": "git2/credential_helpers.h", + "functions": ["git_credential_userpass"], + "meta": {}, + "lines": 49 + }, + { + "file": "git2/deprecated.h", + "functions": [ + "git_blob_filtered_content", + "git_filter_list_stream_data", + "git_filter_list_apply_to_data", + "git_treebuilder_write_with_buffer", + "git_buf_grow", + "git_buf_set", + "git_buf_is_binary", + "git_buf_contains_nul", + "git_buf_free", + "git_commit_signing_cb", + "git_diff_format_email", + "git_diff_commit_as_email", + "git_diff_format_email_options_init", + "giterr_last", + "giterr_clear", + "giterr_set_str", + "giterr_set_oom", + "git_object__size", + "git_remote_is_valid_name", + "git_reference_is_valid_name", + "git_oidarray_free", + "git_headlist_cb", + "git_strarray_copy", + "git_strarray_free", + "git_blame_init_options" + ], + "meta": {}, + "lines": 905 + }, + { + "file": "git2/describe.h", + "functions": [ + "git_describe_options_init", + "git_describe_format_options_init", + "git_describe_commit", + "git_describe_workdir", + "git_describe_format", + "git_describe_result_free" + ], + "meta": {}, + "lines": 189 + }, + { + "file": "git2/diff.h", + "functions": [ + "git_diff_notify_cb", + "git_diff_progress_cb", + "git_diff_options_init", + "git_diff_file_cb", + "git_diff_binary_cb", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_diff_find_options_init", + "git_diff_free", + "git_diff_tree_to_tree", + "git_diff_tree_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_diff_index_to_index", + "git_diff_merge", + "git_diff_find_similar", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_get_delta", + "git_diff_is_sorted_icase", + "git_diff_foreach", + "git_diff_status_char", + "git_diff_print", + "git_diff_to_buf", + "git_diff_blobs", + "git_diff_blob_to_buffer", + "git_diff_buffers", + "git_diff_from_buffer", + "git_diff_get_stats", + "git_diff_stats_files_changed", + "git_diff_stats_insertions", + "git_diff_stats_deletions", + "git_diff_stats_to_buf", + "git_diff_stats_free", + "git_diff_patchid_options_init", + "git_diff_patchid" + ], + "meta": {}, + "lines": 1471 + }, + { + "file": "git2/email.h", + "functions": [ + "git_email_create_from_diff", + "git_email_create_from_commit" + ], + "meta": {}, + "lines": 122 + }, + { + "file": "git2/errors.h", + "functions": ["git_error_last"], + "meta": {}, + "lines": 139 + }, + { + "file": "git2/filter.h", + "functions": [ + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_contains", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_file", + "git_filter_list_apply_to_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_file", + "git_filter_list_stream_blob", + "git_filter_list_free" + ], + "meta": {}, + "lines": 269 + }, + { + "file": "git2/global.h", + "functions": ["git_libgit2_init", "git_libgit2_shutdown"], + "meta": {}, + "lines": 39 + }, + { + "file": "git2/graph.h", + "functions": [ + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any" + ], + "meta": {}, + "lines": 73 + }, + { + "file": "git2/ignore.h", + "functions": [ + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored" + ], + "meta": {}, + "lines": 74 + }, + { + "file": "git2/index.h", + "functions": [ + "git_index_matched_path_cb", + "git_index_free", + "git_index_owner", + "git_index_caps", + "git_index_set_caps", + "git_index_version", + "git_index_set_version", + "git_index_read", + "git_index_write", + "git_index_path", + "git_index_checksum", + "git_index_read_tree", + "git_index_write_tree", + "git_index_write_tree_to", + "git_index_entrycount", + "git_index_clear", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_remove", + "git_index_remove_directory", + "git_index_add", + "git_index_entry_stage", + "git_index_entry_is_conflict", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_iterator_free", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_remove_bypath", + "git_index_add_all", + "git_index_remove_all", + "git_index_update_all", + "git_index_find", + "git_index_find_prefix", + "git_index_conflict_add", + "git_index_conflict_get", + "git_index_conflict_remove", + "git_index_conflict_cleanup", + "git_index_has_conflicts", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_iterator_free" + ], + "meta": {}, + "lines": 844 + }, + { + "file": "git2/indexer.h", + "functions": [ + "git_indexer_progress_cb", + "git_indexer_options_init", + "git_indexer_new", + "git_indexer_append", + "git_indexer_commit", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_free" + ], + "meta": {}, + "lines": 191 + }, + { + "file": "git2/mailmap.h", + "functions": [ + "git_mailmap_new", + "git_mailmap_free", + "git_mailmap_add_entry", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ], + "meta": {}, + "lines": 111 + }, + { + "file": "git2/merge.h", + "functions": [ + "git_merge_file_input_init", + "git_merge_file_options_init", + "git_merge_options_init", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_bases", + "git_merge_base_many", + "git_merge_bases_many", + "git_merge_base_octopus", + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_result_free", + "git_merge_trees", + "git_merge_commits", + "git_merge" + ], + "meta": {}, + "lines": 622 + }, + { + "file": "git2/message.h", + "functions": [ + "git_message_prettify", + "git_message_trailers", + "git_message_trailer_array_free" + ], + "meta": {}, + "lines": 81 + }, + { "file": "git2/net.h", "functions": [], "meta": {}, "lines": 50 }, + { + "file": "git2/notes.h", + "functions": [ + "git_note_foreach_cb", + "git_note_iterator_new", + "git_note_commit_iterator_new", + "git_note_iterator_free", + "git_note_next", + "git_note_read", + "git_note_commit_read", + "git_note_author", + "git_note_committer", + "git_note_message", + "git_note_id", + "git_note_create", + "git_note_commit_create", + "git_note_remove", + "git_note_commit_remove", + "git_note_free", + "git_note_default_ref", + "git_note_foreach" + ], + "meta": {}, + "lines": 302 + }, + { + "file": "git2/object.h", + "functions": [ + "git_object_lookup", + "git_object_lookup_prefix", + "git_object_lookup_bypath", + "git_object_id", + "git_object_short_id", + "git_object_type", + "git_object_owner", + "git_object_free", + "git_object_type2string", + "git_object_string2type", + "git_object_typeisloose", + "git_object_peel", + "git_object_dup", + "git_object_rawcontent_is_valid" + ], + "meta": {}, + "lines": 273 + }, + { + "file": "git2/odb.h", + "functions": [ + "git_odb_foreach_cb", + "git_odb_add_disk_alternate", + "git_odb_free", + "git_odb_read", + "git_odb_read_prefix", + "git_odb_read_header", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_refresh", + "git_odb_foreach", + "git_odb_write", + "git_odb_open_wstream", + "git_odb_stream_write", + "git_odb_stream_finalize_write", + "git_odb_stream_read", + "git_odb_stream_free", + "git_odb_open_rstream", + "git_odb_write_pack", + "git_odb_write_multi_pack_index", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_data", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_add_backend", + "git_odb_add_alternate", + "git_odb_num_backends", + "git_odb_get_backend", + "git_odb_set_commit_graph" + ], + "meta": {}, + "lines": 650 + }, + { "file": "git2/odb_backend.h", "functions": [], "meta": {}, "lines": 219 }, + { + "file": "git2/oid.h", + "functions": [ + "git_oid_fmt", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_tostr_s", + "git_oid_tostr", + "git_oid_cpy", + "git_oid_cmp", + "git_oid_equal", + "git_oid_ncmp", + "git_oid_streq", + "git_oid_strcmp", + "git_oid_is_zero", + "git_oid_shorten_new", + "git_oid_shorten_add", + "git_oid_shorten_free" + ], + "meta": {}, + "lines": 369 + }, + { + "file": "git2/oidarray.h", + "functions": ["git_oidarray_dispose"], + "meta": {}, + "lines": 31 + }, + { + "file": "git2/pack.h", + "functions": [ + "git_packbuilder_new", + "git_packbuilder_set_threads", + "git_packbuilder_insert", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_walk", + "git_packbuilder_insert_recur", + "git_packbuilder_write_buf", + "git_packbuilder_write", + "git_packbuilder_hash", + "git_packbuilder_name", + "git_packbuilder_foreach_cb", + "git_packbuilder_foreach", + "git_packbuilder_object_count", + "git_packbuilder_written", + "git_packbuilder_progress", + "git_packbuilder_set_callbacks", + "git_packbuilder_free" + ], + "meta": {}, + "lines": 263 + }, + { + "file": "git2/patch.h", + "functions": [ + "git_patch_owner", + "git_patch_from_diff", + "git_patch_from_blobs", + "git_patch_from_blob_and_buffer", + "git_patch_from_buffers", + "git_patch_free", + "git_patch_get_delta", + "git_patch_num_hunks", + "git_patch_line_stats", + "git_patch_get_hunk", + "git_patch_num_lines_in_hunk", + "git_patch_get_line_in_hunk", + "git_patch_size", + "git_patch_print", + "git_patch_to_buf" + ], + "meta": {}, + "lines": 284 + }, + { + "file": "git2/pathspec.h", + "functions": [ + "git_pathspec_new", + "git_pathspec_free", + "git_pathspec_matches_path", + "git_pathspec_match_workdir", + "git_pathspec_match_index", + "git_pathspec_match_tree", + "git_pathspec_match_diff", + "git_pathspec_match_list_free", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_failed_entry" + ], + "meta": {}, + "lines": 277 + }, + { + "file": "git2/proxy.h", + "functions": ["git_proxy_options_init"], + "meta": {}, + "lines": 94 + }, + { + "file": "git2/rebase.h", + "functions": [ + "git_rebase_options_init", + "git_rebase_init", + "git_rebase_open", + "git_rebase_orig_head_name", + "git_rebase_orig_head_id", + "git_rebase_onto_name", + "git_rebase_onto_id", + "git_rebase_operation_entrycount", + "git_rebase_operation_current", + "git_rebase_operation_byindex", + "git_rebase_next", + "git_rebase_inmemory_index", + "git_rebase_commit", + "git_rebase_abort", + "git_rebase_finish", + "git_rebase_free" + ], + "meta": {}, + "lines": 395 + }, + { + "file": "git2/refdb.h", + "functions": [ + "git_refdb_new", + "git_refdb_open", + "git_refdb_compress", + "git_refdb_free" + ], + "meta": {}, + "lines": 66 + }, + { + "file": "git2/reflog.h", + "functions": [ + "git_reflog_read", + "git_reflog_write", + "git_reflog_append", + "git_reflog_rename", + "git_reflog_delete", + "git_reflog_entrycount", + "git_reflog_entry_byindex", + "git_reflog_drop", + "git_reflog_entry_id_old", + "git_reflog_entry_id_new", + "git_reflog_entry_committer", + "git_reflog_entry_message", + "git_reflog_free" + ], + "meta": {}, + "lines": 166 + }, + { + "file": "git2/refs.h", + "functions": [ + "git_reference_lookup", + "git_reference_name_to_id", + "git_reference_dwim", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_create", + "git_reference_create", + "git_reference_create_matching", + "git_reference_target", + "git_reference_target_peel", + "git_reference_symbolic_target", + "git_reference_type", + "git_reference_name", + "git_reference_resolve", + "git_reference_owner", + "git_reference_symbolic_set_target", + "git_reference_set_target", + "git_reference_rename", + "git_reference_delete", + "git_reference_remove", + "git_reference_list", + "git_reference_foreach_cb", + "git_reference_foreach_name_cb", + "git_reference_foreach", + "git_reference_foreach_name", + "git_reference_dup", + "git_reference_free", + "git_reference_cmp", + "git_reference_iterator_new", + "git_reference_iterator_glob_new", + "git_reference_next", + "git_reference_next_name", + "git_reference_iterator_free", + "git_reference_foreach_glob", + "git_reference_has_log", + "git_reference_ensure_log", + "git_reference_is_branch", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_is_note", + "git_reference_normalize_name", + "git_reference_peel", + "git_reference_name_is_valid", + "git_reference_shorthand" + ], + "meta": {}, + "lines": 767 + }, + { + "file": "git2/refspec.h", + "functions": [ + "git_refspec_parse", + "git_refspec_free", + "git_refspec_src", + "git_refspec_dst", + "git_refspec_string", + "git_refspec_force", + "git_refspec_direction", + "git_refspec_src_matches", + "git_refspec_dst_matches", + "git_refspec_transform", + "git_refspec_rtransform" + ], + "meta": {}, + "lines": 117 + }, + { + "file": "git2/remote.h", + "functions": [ + "git_remote_create", + "git_remote_create_options_init", + "git_remote_create_with_opts", + "git_remote_create_with_fetchspec", + "git_remote_create_anonymous", + "git_remote_create_detached", + "git_remote_lookup", + "git_remote_dup", + "git_remote_owner", + "git_remote_name", + "git_remote_url", + "git_remote_pushurl", + "git_remote_set_url", + "git_remote_set_pushurl", + "git_remote_set_instance_url", + "git_remote_set_instance_pushurl", + "git_remote_add_fetch", + "git_remote_get_fetch_refspecs", + "git_remote_add_push", + "git_remote_get_push_refspecs", + "git_remote_refspec_count", + "git_remote_get_refspec", + "git_remote_ls", + "git_remote_connected", + "git_remote_stop", + "git_remote_disconnect", + "git_remote_free", + "git_remote_list", + "git_push_transfer_progress_cb", + "git_push_negotiation", + "git_push_update_reference_cb", + "git_url_resolve_cb", + "git_remote_ready_cb", + "git_remote_init_callbacks", + "git_fetch_options_init", + "git_push_options_init", + "git_remote_connect_options_init", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_download", + "git_remote_upload", + "git_remote_update_tips", + "git_remote_fetch", + "git_remote_prune", + "git_remote_push", + "git_remote_stats", + "git_remote_autotag", + "git_remote_set_autotag", + "git_remote_prune_refs", + "git_remote_rename", + "git_remote_name_is_valid", + "git_remote_delete", + "git_remote_default_branch" + ], + "meta": {}, + "lines": 1189 + }, + { + "file": "git2/repository.h", + "functions": [ + "git_repository_open", + "git_repository_open_from_worktree", + "git_repository_discover", + "git_repository_open_ext", + "git_repository_open_bare", + "git_repository_free", + "git_repository_init", + "git_repository_init_options_init", + "git_repository_init_ext", + "git_repository_head", + "git_repository_head_for_worktree", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_unborn", + "git_repository_is_empty", + "git_repository_item_path", + "git_repository_path", + "git_repository_workdir", + "git_repository_commondir", + "git_repository_set_workdir", + "git_repository_is_bare", + "git_repository_is_worktree", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_odb", + "git_repository_refdb", + "git_repository_index", + "git_repository_message", + "git_repository_message_remove", + "git_repository_state_cleanup", + "git_repository_fetchhead_foreach_cb", + "git_repository_fetchhead_foreach", + "git_repository_mergehead_foreach_cb", + "git_repository_mergehead_foreach", + "git_repository_hashfile", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_detach_head", + "git_repository_state", + "git_repository_set_namespace", + "git_repository_get_namespace", + "git_repository_is_shallow", + "git_repository_ident", + "git_repository_set_ident", + "git_repository_oid_type", + "git_repository_commit_parents" + ], + "meta": {}, + "lines": 992 + }, + { + "file": "git2/reset.h", + "functions": [ + "git_reset", + "git_reset_from_annotated", + "git_reset_default" + ], + "meta": {}, + "lines": 107 + }, + { + "file": "git2/revert.h", + "functions": [ + "git_revert_options_init", + "git_revert_commit", + "git_revert" + ], + "meta": {}, + "lines": 86 + }, + { + "file": "git2/revparse.h", + "functions": ["git_revparse_single", "git_revparse_ext", "git_revparse"], + "meta": {}, + "lines": 108 + }, + { + "file": "git2/revwalk.h", + "functions": [ + "git_revwalk_new", + "git_revwalk_reset", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_push_ref", + "git_revwalk_hide_ref", + "git_revwalk_next", + "git_revwalk_sorting", + "git_revwalk_push_range", + "git_revwalk_simplify_first_parent", + "git_revwalk_free", + "git_revwalk_repository", + "git_revwalk_hide_cb", + "git_revwalk_add_hide_cb" + ], + "meta": {}, + "lines": 298 + }, + { + "file": "git2/signature.h", + "functions": [ + "git_signature_new", + "git_signature_now", + "git_signature_default", + "git_signature_from_buffer", + "git_signature_dup", + "git_signature_free" + ], + "meta": {}, + "lines": 99 + }, + { + "file": "git2/stash.h", + "functions": [ + "git_stash_save", + "git_stash_save_options_init", + "git_stash_save_with_opts", + "git_stash_apply_progress_cb", + "git_stash_apply_options_init", + "git_stash_apply", + "git_stash_cb", + "git_stash_foreach", + "git_stash_drop", + "git_stash_pop" + ], + "meta": {}, + "lines": 310 + }, + { + "file": "git2/status.h", + "functions": [ + "git_status_cb", + "git_status_options_init", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_file", + "git_status_list_new", + "git_status_list_entrycount", + "git_status_byindex", + "git_status_list_free", + "git_status_should_ignore" + ], + "meta": {}, + "lines": 448 + }, + { + "file": "git2/strarray.h", + "functions": ["git_strarray_dispose"], + "meta": {}, + "lines": 37 + }, + { + "file": "git2/submodule.h", + "functions": [ + "git_submodule_cb", + "git_submodule_update_options_init", + "git_submodule_update", + "git_submodule_lookup", + "git_submodule_dup", + "git_submodule_free", + "git_submodule_foreach", + "git_submodule_add_setup", + "git_submodule_clone", + "git_submodule_add_finalize", + "git_submodule_add_to_index", + "git_submodule_owner", + "git_submodule_name", + "git_submodule_path", + "git_submodule_url", + "git_submodule_resolve_url", + "git_submodule_branch", + "git_submodule_set_branch", + "git_submodule_set_url", + "git_submodule_index_id", + "git_submodule_head_id", + "git_submodule_wd_id", + "git_submodule_ignore", + "git_submodule_set_ignore", + "git_submodule_update_strategy", + "git_submodule_set_update", + "git_submodule_fetch_recurse_submodules", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_init", + "git_submodule_repo_init", + "git_submodule_sync", + "git_submodule_open", + "git_submodule_reload", + "git_submodule_status", + "git_submodule_location" + ], + "meta": {}, + "lines": 664 + }, + { + "file": "git2/sys/commit_graph.h", + "functions": [], + "meta": {}, + "lines": 108 + }, + { "file": "git2/sys/config.h", "functions": [], "meta": {}, "lines": 143 }, + { "file": "git2/sys/filter.h", "functions": [], "meta": {}, "lines": 95 }, + { "file": "git2/sys/hashsig.h", "functions": [], "meta": {}, "lines": 45 }, + { "file": "git2/sys/merge.h", "functions": [], "meta": {}, "lines": 41 }, + { "file": "git2/sys/path.h", "functions": [], "meta": {}, "lines": 41 }, + { "file": "git2/sys/stream.h", "functions": [], "meta": {}, "lines": 97 }, + { + "file": "git2/sys/transport.h", + "functions": [], + "meta": {}, + "lines": 318 + }, + { + "file": "git2/tag.h", + "functions": [ + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_free", + "git_tag_id", + "git_tag_owner", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type", + "git_tag_name", + "git_tag_tagger", + "git_tag_message", + "git_tag_create", + "git_tag_annotation_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_list", + "git_tag_list_match", + "git_tag_foreach_cb", + "git_tag_foreach", + "git_tag_peel", + "git_tag_dup", + "git_tag_name_is_valid" + ], + "meta": {}, + "lines": 379 + }, + { + "file": "git2/trace.h", + "functions": ["git_trace_cb", "git_trace_set"], + "meta": {}, + "lines": 63 + }, + { + "file": "git2/transaction.h", + "functions": [ + "git_transaction_new", + "git_transaction_lock_ref", + "git_transaction_set_target", + "git_transaction_set_symbolic_target", + "git_transaction_set_reflog", + "git_transaction_remove", + "git_transaction_commit", + "git_transaction_free" + ], + "meta": {}, + "lines": 117 + }, + { + "file": "git2/transport.h", + "functions": ["git_transport_message_cb", "git_transport_cb"], + "meta": {}, + "lines": 37 + }, + { + "file": "git2/tree.h", + "functions": [ + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_free", + "git_tree_id", + "git_tree_owner", + "git_tree_entrycount", + "git_tree_entry_byname", + "git_tree_entry_byindex", + "git_tree_entry_byid", + "git_tree_entry_bypath", + "git_tree_entry_dup", + "git_tree_entry_free", + "git_tree_entry_name", + "git_tree_entry_id", + "git_tree_entry_type", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_cmp", + "git_tree_entry_to_object", + "git_treebuilder_new", + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_remove", + "git_treebuilder_filter_cb", + "git_treebuilder_filter", + "git_treebuilder_write", + "git_treewalk_cb", + "git_tree_walk", + "git_tree_dup", + "git_tree_create_updated" + ], + "meta": {}, + "lines": 470 + }, + { "file": "git2/types.h", "functions": [], "meta": {}, "lines": 366 }, + { + "file": "git2/worktree.h", + "functions": [ + "git_worktree_list", + "git_worktree_lookup", + "git_worktree_open_from_repository", + "git_worktree_free", + "git_worktree_validate", + "git_worktree_add_options_init", + "git_worktree_add", + "git_worktree_lock", + "git_worktree_unlock", + "git_worktree_is_locked", + "git_worktree_name", + "git_worktree_path", + "git_worktree_prune_options_init", + "git_worktree_is_prunable", + "git_worktree_prune" + ], + "meta": {}, + "lines": 267 + } + ], + "functions": { + "git_annotated_commit_from_ref": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 33, + "lineto": 36, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given reference" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "reference to use to lookup the git_annotated_commit" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const git_reference *ref", + "sig": "git_annotated_commit **::git_repository *::const git_reference *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from the given reference.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.8.4/checkout.html#git_annotated_commit_from_ref-1" + ] + } + }, + "git_annotated_commit_from_fetchhead": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 50, + "lineto": 55, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "name of the (remote) branch" + }, + { + "name": "remote_url", + "type": "const char *", + "comment": "url of the remote" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the commit object id of the remote branch" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const char *branch_name, const char *remote_url, const git_oid *id", + "sig": "git_annotated_commit **::git_repository *::const char *::const char *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from the given fetch head data.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "", + "group": "annotated" + }, + "git_annotated_commit_lookup": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 75, + "lineto": 78, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the commit object id to lookup" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const git_oid *id", + "sig": "git_annotated_commit **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from the given commit id.\n The resulting git_annotated_commit must be freed with\n git_annotated_commit_free.

\n", + "comments": "

An annotated commit contains information about how it was looked up, which may be useful for functions like merge or rebase to provide context to the operation. For example, conflict files will include the name of the source or target branches being merged. It is therefore preferable to use the most specific function (eg git_annotated_commit_from_ref) instead of this one when that data is known.

\n", + "group": "annotated" + }, + "git_annotated_commit_from_revspec": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 92, + "lineto": 95, + "args": [ + { + "name": "out", + "type": "git_annotated_commit **", + "comment": "pointer to store the git_annotated_commit result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given commit" + }, + { + "name": "revspec", + "type": "const char *", + "comment": "the extended sha syntax string to use to lookup the commit" + } + ], + "argline": "git_annotated_commit **out, git_repository *repo, const char *revspec", + "sig": "git_annotated_commit **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Creates a git_annotated_commit from a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "group": "annotated" + }, + "git_annotated_commit_id": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 103, + "lineto": 104, + "args": [ + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": "the given annotated commit" + } + ], + "argline": "const git_annotated_commit *commit", + "sig": "const git_annotated_commit *", + "return": { "type": "const git_oid *", "comment": " commit id" }, + "description": "

Gets the commit ID that the given git_annotated_commit refers to.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_annotated_commit_id-2"], + "merge.c": [ + "ex/v1.8.4/merge.html#git_annotated_commit_id-1", + "ex/v1.8.4/merge.html#git_annotated_commit_id-2", + "ex/v1.8.4/merge.html#git_annotated_commit_id-3" + ] + } + }, + "git_annotated_commit_ref": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 112, + "lineto": 113, + "args": [ + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": "the given annotated commit" + } + ], + "argline": "const git_annotated_commit *commit", + "sig": "const git_annotated_commit *", + "return": { "type": "const char *", "comment": " ref name." }, + "description": "

Get the refname that the given git_annotated_commit refers to.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": [ + "ex/v1.8.4/checkout.html#git_annotated_commit_ref-3", + "ex/v1.8.4/checkout.html#git_annotated_commit_ref-4", + "ex/v1.8.4/checkout.html#git_annotated_commit_ref-5" + ] + } + }, + "git_annotated_commit_free": { + "type": "function", + "file": "git2/annotated_commit.h", + "line": 120, + "lineto": 121, + "args": [ + { + "name": "commit", + "type": "git_annotated_commit *", + "comment": "annotated commit to free" + } + ], + "argline": "git_annotated_commit *commit", + "sig": "git_annotated_commit *", + "return": { "type": "void", "comment": null }, + "description": "

Frees a git_annotated_commit.

\n", + "comments": "", + "group": "annotated", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_annotated_commit_free-6"] + } + }, + "git_apply_options_init": { + "type": "function", + "file": "git2/apply.h", + "line": 106, + "lineto": 106, + "args": [ + { + "name": "opts", + "type": "git_apply_options *", + "comment": "The `git_apply_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_APPLY_OPTIONS_VERSION`" + } + ], + "argline": "git_apply_options *opts, unsigned int version", + "sig": "git_apply_options *::unsigned int", + "return": { "type": "int", "comment": " 0 on success or -1 on failure." }, + "description": "

Initialize git_apply_options structure

\n", + "comments": "

Initialize a git_apply_options with default values. Equivalent to creating an instance with GIT_APPLY_OPTIONS_INIT.

\n", + "group": "apply" + }, + "git_apply_to_tree": { + "type": "function", + "file": "git2/apply.h", + "line": 119, + "lineto": 124, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "the postimage of the application" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply" + }, + { + "name": "preimage", + "type": "git_tree *", + "comment": "the tree to apply the diff to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_tree *preimage, git_diff *diff, const git_apply_options *options", + "sig": "git_index **::git_repository *::git_tree *::git_diff *::const git_apply_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Apply a git_diff to a git_tree, and return the resulting image\n as an index.

\n", + "comments": "", + "group": "apply" + }, + "git_apply": { + "type": "function", + "file": "git2/apply.h", + "line": 157, + "lineto": 161, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to apply to" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the diff to apply" + }, + { + "name": "location", + "type": "git_apply_location_t", + "comment": "the location to apply (workdir, index or both)" + }, + { + "name": "options", + "type": "const git_apply_options *", + "comment": "the options for the apply (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_diff *diff, git_apply_location_t location, const git_apply_options *options", + "sig": "git_repository *::git_diff *::git_apply_location_t::const git_apply_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Apply a git_diff to the given repository, making changes directly\n in the working directory, the index, or both.

\n", + "comments": "", + "group": "apply" + }, + "git_attr_value": { + "type": "function", + "file": "git2/attr.h", + "line": 102, + "lineto": 102, + "args": [ + { "name": "attr", "type": "const char *", "comment": "The attribute" } + ], + "argline": "const char *attr", + "sig": "const char *", + "return": { + "type": "git_attr_value_t", + "comment": " the value type for the attribute" + }, + "description": "

Return the value type for a given attribute.

\n", + "comments": "

This can be either TRUE, FALSE, UNSPECIFIED (if the attribute was not set at all), or VALUE, if the attribute was set to an actual string.

\n\n

If the attribute has a VALUE string, it can be accessed normally as a NULL-terminated C string.

\n", + "group": "attr" + }, + "git_attr_get": { + "type": "function", + "file": "git2/attr.h", + "line": 180, + "lineto": 185, + "args": [ + { + "name": "value_out", + "type": "const char **", + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the attribute to look up." + } + ], + "argline": "const char **value_out, git_repository *repo, uint32_t flags, const char *path, const char *name", + "sig": "const char **::git_repository *::uint32_t::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up the value of one git attribute for path.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_get_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 203, + "lineto": 208, + "args": [ + { + "name": "value_out", + "type": "const char **", + "comment": "Output of the value of the attribute. Use the GIT_ATTR_...\n macros to test for TRUE, FALSE, UNSPECIFIED, etc. or just\n use the string value for attributes set to a value. You\n should NOT modify or free this value." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path to check for attributes. Relative paths are\n interpreted relative to the repo root. The file does\n not have to exist, but if it does not, then it will be\n treated as a plain file (not a directory)." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the attribute to look up." + } + ], + "argline": "const char **value_out, git_repository *repo, git_attr_options *opts, const char *path, const char *name", + "sig": "const char **::git_repository *::git_attr_options *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up the value of one git attribute for path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_get_many": { + "type": "function", + "file": "git2/attr.h", + "line": 240, + "lineto": 246, + "args": [ + { + "name": "values_out", + "type": "const char **", + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + }, + { + "name": "num_attr", + "type": "size_t", + "comment": "The number of attributes being looked up" + }, + { + "name": "names", + "type": "const char **", + "comment": "An array of num_attr strings containing attribute names." + } + ], + "argline": "const char **values_out, git_repository *repo, uint32_t flags, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::uint32_t::const char *::size_t::const char **", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up a list of git attributes for path.

\n", + "comments": "

Use this if you have a known list of attributes that you want to look up in a single call. This is somewhat more efficient than calling git_attr_get() multiple times.

\n\n

For example, you might write:

\n\n
 const char *attrs[] = { "crlf", "diff", "foo" };     const char **values[3];     git_attr_get_many(values, repo, 0, "my/fun/file.c", 3, attrs);\n
\n\n

Then you could loop through the 3 values to get the settings for the three attributes you asked about.

\n", + "group": "attr" + }, + "git_attr_get_many_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 265, + "lineto": 271, + "args": [ + { + "name": "values_out", + "type": "const char **", + "comment": "An array of num_attr entries that will have string\n pointers written into it for the values of the attributes.\n You should not modify or free the values that are written\n into this array (although of course, you should free the\n array itself if you allocated it)." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "The path inside the repo to check attributes. This\n does not have to exist, but if it does not, then\n it will be treated as a plain file (i.e. not a directory)." + }, + { + "name": "num_attr", + "type": "size_t", + "comment": "The number of attributes being looked up" + }, + { + "name": "names", + "type": "const char **", + "comment": "An array of num_attr strings containing attribute names." + } + ], + "argline": "const char **values_out, git_repository *repo, git_attr_options *opts, const char *path, size_t num_attr, const char **names", + "sig": "const char **::git_repository *::git_attr_options *::const char *::size_t::const char **", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Look up a list of git attributes for path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_foreach": { + "type": "function", + "file": "git2/attr.h", + "line": 304, + "lineto": 309, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "A combination of GIT_ATTR_CHECK... flags." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + }, + { + "name": "callback", + "type": "git_attr_foreach_cb", + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + }, + { + "name": "payload", + "type": "void *", + "comment": "Passed on as extra parameter to callback function." + } + ], + "argline": "git_repository *repo, uint32_t flags, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::uint32_t::const char *::git_attr_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the git attributes for a path.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_foreach_ext": { + "type": "function", + "file": "git2/attr.h", + "line": 324, + "lineto": 329, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the path." + }, + { + "name": "opts", + "type": "git_attr_options *", + "comment": "The `git_attr_options` to use when querying these attributes." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path inside the repo to check attributes. This does not have\n to exist, but if it does not, then it will be treated as a\n plain file (i.e. not a directory)." + }, + { + "name": "callback", + "type": "git_attr_foreach_cb", + "comment": "Function to invoke on each attribute name and value.\n See git_attr_foreach_cb." + }, + { + "name": "payload", + "type": "void *", + "comment": "Passed on as extra parameter to callback function." + } + ], + "argline": "git_repository *repo, git_attr_options *opts, const char *path, git_attr_foreach_cb callback, void *payload", + "sig": "git_repository *::git_attr_options *::const char *::git_attr_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the git attributes for a path with extended options.

\n", + "comments": "", + "group": "attr" + }, + "git_attr_cache_flush": { + "type": "function", + "file": "git2/attr.h", + "line": 342, + "lineto": 343, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the gitattributes cache" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Flush the gitattributes cache.

\n", + "comments": "

Call this if you have reason to believe that the attributes files on disk no longer match the cached contents of memory. This will cause the attributes files to be reloaded the next time that an attribute access function is called.

\n", + "group": "attr" + }, + "git_attr_add_macro": { + "type": "function", + "file": "git2/attr.h", + "line": 360, + "lineto": 363, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to add the macro in." + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the macro." + }, + { + "name": "values", + "type": "const char *", + "comment": "The value for the macro." + } + ], + "argline": "git_repository *repo, const char *name, const char *values", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Add a macro definition.

\n", + "comments": "

Macros will automatically be loaded from the top level .gitattributes file of the repository (plus the built-in "binary" macro). This function allows you to add others. For example, to add the default macro, you would call:

\n\n
 git_attr_add_macro(repo, "binary", "-diff -crlf");\n
\n", + "group": "attr" + }, + "git_blame_options_init": { + "type": "function", + "file": "git2/blame.h", + "line": 138, + "lineto": 140, + "args": [ + { + "name": "opts", + "type": "git_blame_options *", + "comment": "The `git_blame_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_BLAME_OPTIONS_VERSION`." + } + ], + "argline": "git_blame_options *opts, unsigned int version", + "sig": "git_blame_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_blame_options structure

\n", + "comments": "

Initializes a git_blame_options with default values. Equivalent to creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", + "group": "blame" + }, + "git_blame_get_hunk_count": { + "type": "function", + "file": "git2/blame.h", + "line": 210, + "lineto": 210, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "The blame structure to query." + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "uint32_t", "comment": " The number of hunks." }, + "description": "

Gets the number of hunks that exist in the blame structure.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byindex": { + "type": "function", + "file": "git2/blame.h", + "line": 219, + "lineto": 221, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "index", + "type": "uint32_t", + "comment": "index of the hunk to retrieve" + } + ], + "argline": "git_blame *blame, uint32_t index", + "sig": "git_blame *::uint32_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk at the given index, or NULL on error" + }, + "description": "

Gets the blame hunk at the given index.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byline": { + "type": "function", + "file": "git2/blame.h", + "line": 230, + "lineto": 232, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" + }, + { + "name": "lineno", + "type": "size_t", + "comment": "the (1-based) line number to find a hunk for" + } + ], + "argline": "git_blame *blame, size_t lineno", + "sig": "git_blame *::size_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk that contains the given line, or NULL on error" + }, + "description": "

Gets the hunk that relates to the given line number in the newest commit.

\n", + "comments": "", + "group": "blame", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_blame_get_hunk_byline-1"] + } + }, + "git_blame_file": { + "type": "function", + "file": "git2/blame.h", + "line": 245, + "lineto": 249, + "args": [ + { + "name": "out", + "type": "git_blame **", + "comment": "pointer that will receive the blame object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository whose history is to be walked" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to file to consider" + }, + { + "name": "options", + "type": "git_blame_options *", + "comment": "options for the blame operation. If NULL, this is treated as\n though GIT_BLAME_OPTIONS_INIT were passed." + } + ], + "argline": "git_blame **out, git_repository *repo, const char *path, git_blame_options *options", + "sig": "git_blame **::git_repository *::const char *::git_blame_options *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error.)" + }, + "description": "

Get the blame for a single file.

\n", + "comments": "", + "group": "blame", + "examples": { "blame.c": ["ex/v1.8.4/blame.html#git_blame_file-2"] } + }, + "git_blame_buffer": { + "type": "function", + "file": "git2/blame.h", + "line": 269, + "lineto": 273, + "args": [ + { + "name": "out", + "type": "git_blame **", + "comment": "pointer that will receive the resulting blame data" + }, + { + "name": "reference", + "type": "git_blame *", + "comment": "cached blame from the history of the file (usually the output\n from git_blame_file)" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the (possibly) modified contents of the file" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "number of valid bytes in the buffer" + } + ], + "argline": "git_blame **out, git_blame *reference, const char *buffer, size_t buffer_len", + "sig": "git_blame **::git_blame *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" + }, + "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", + "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", + "group": "blame" + }, + "git_blame_free": { + "type": "function", + "file": "git2/blame.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to free" + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "void", "comment": null }, + "description": "

Free memory allocated by git_blame_file or git_blame_buffer.

\n", + "comments": "", + "group": "blame", + "examples": { "blame.c": ["ex/v1.8.4/blame.html#git_blame_free-3"] } + }, + "git_blob_lookup": { + "type": "function", + "file": "git2/blob.h", + "line": 33, + "lineto": 33, + "args": [ + { + "name": "blob", + "type": "git_blob **", + "comment": "pointer to the looked up blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the blob." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the blob to locate." + } + ], + "argline": "git_blob **blob, git_repository *repo, const git_oid *id", + "sig": "git_blob **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a blob object from a repository.

\n", + "comments": "", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_blob_lookup-4"], + "general.c": ["ex/v1.8.4/general.html#git_blob_lookup-1"] + } + }, + "git_blob_lookup_prefix": { + "type": "function", + "file": "git2/blob.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "blob", + "type": "git_blob **", + "comment": "pointer to the looked up blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the blob." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the blob to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_blob **blob, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_blob **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a blob object from a repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "blob" + }, + "git_blob_free": { + "type": "function", + "file": "git2/blob.h", + "line": 60, + "lineto": 60, + "args": [ + { "name": "blob", "type": "git_blob *", "comment": "the blob to close" } + ], + "argline": "git_blob *blob", + "sig": "git_blob *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open blob

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_blob_free-5"], + "general.c": ["ex/v1.8.4/general.html#git_blob_free-2"] + } + }, + "git_blob_id": { + "type": "function", + "file": "git2/blob.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "a previously loaded blob." + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "const git_oid *", + "comment": " SHA1 hash for this blob." + }, + "description": "

Get the id of a blob.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_owner": { + "type": "function", + "file": "git2/blob.h", + "line": 76, + "lineto": 76, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "A previously loaded blob." + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this blob." + }, + "description": "

Get the repository that contains the blob.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_rawcontent": { + "type": "function", + "file": "git2/blob.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "pointer to the blob" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "const void *", + "comment": " the pointer, or NULL on error" + }, + "description": "

Get a read-only buffer with the raw content of a blob.

\n", + "comments": "

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.

\n", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_blob_rawcontent-6"], + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_blob_rawcontent-1"], + "general.c": ["ex/v1.8.4/general.html#git_blob_rawcontent-3"] + } + }, + "git_blob_rawsize": { + "type": "function", + "file": "git2/blob.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "pointer to the blob" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { "type": "git_object_size_t", "comment": " size on bytes" }, + "description": "

Get the size in bytes of the contents of a blob

\n", + "comments": "", + "group": "blob", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_blob_rawsize-7"], + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_blob_rawsize-2"], + "general.c": [ + "ex/v1.8.4/general.html#git_blob_rawsize-4", + "ex/v1.8.4/general.html#git_blob_rawsize-5" + ] + } + }, + "git_blob_filter_options_init": { + "type": "function", + "file": "git2/blob.h", + "line": 164, + "lineto": 164, + "args": [ + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "The `git_blob_filter_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_BLOB_FILTER_OPTIONS_VERSION`." + } + ], + "argline": "git_blob_filter_options *opts, unsigned int version", + "sig": "git_blob_filter_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_blob_filter_options structure

\n", + "comments": "

Initializes a git_blob_filter_options with default values. Equivalent to creating an instance with GIT_BLOB_FILTER_OPTIONS_INIT.

\n", + "group": "blob" + }, + "git_blob_filter": { + "type": "function", + "file": "git2/blob.h", + "line": 188, + "lineto": 192, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The git_buf to be filled in" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "Pointer to the blob" + }, + { + "name": "as_path", + "type": "const char *", + "comment": "Path used for file attribute lookups, etc." + }, + { + "name": "opts", + "type": "git_blob_filter_options *", + "comment": "Options to use for filtering the blob" + } + ], + "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", + "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Get a buffer with the filtered content of a blob.

\n", + "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", + "group": "blob" + }, + "git_blob_create_from_workdir": { + "type": "function", + "file": "git2/blob.h", + "line": 205, + "lineto": 205, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written.\n\tthis repository cannot be bare" + }, + { + "name": "relative_path", + "type": "const char *", + "comment": "file from which the blob will be created,\n\trelative to the repository's working dir" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *relative_path", + "sig": "git_oid *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a file from the working folder of a repository\n and write it to the Object Database as a loose blob

\n", + "comments": "", + "group": "blob" + }, + "git_blob_create_from_disk": { + "type": "function", + "file": "git2/blob.h", + "line": 217, + "lineto": 217, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written.\n\tthis repository can be bare or not" + }, + { + "name": "path", + "type": "const char *", + "comment": "file from which the blob will be created" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *path", + "sig": "git_oid *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a file from the filesystem and write its content\n to the Object Database as a loose blob

\n", + "comments": "", + "group": "blob" + }, + "git_blob_create_from_stream": { + "type": "function", + "file": "git2/blob.h", + "line": 244, + "lineto": 247, + "args": [ + { + "name": "out", + "type": "git_writestream **", + "comment": "the stream into which to write" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where the blob will be written.\n This repository can be bare or not." + }, + { + "name": "hintpath", + "type": "const char *", + "comment": "If not NULL, will be used to select data filters\n to apply onto the content of the blob to be created." + } + ], + "argline": "git_writestream **out, git_repository *repo, const char *hintpath", + "sig": "git_writestream **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or error code" }, + "description": "

Create a stream to write a new blob into the object db

\n", + "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_from_buffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_from_stream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", + "group": "blob" + }, + "git_blob_create_from_stream_commit": { + "type": "function", + "file": "git2/blob.h", + "line": 258, + "lineto": 260, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the id of the new blob" + }, + { + "name": "stream", + "type": "git_writestream *", + "comment": "the stream to close" + } + ], + "argline": "git_oid *out, git_writestream *stream", + "sig": "git_oid *::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Close the stream and write the blob to the object db

\n", + "comments": "

The stream will be closed and freed.

\n", + "group": "blob" + }, + "git_blob_create_from_buffer": { + "type": "function", + "file": "git2/blob.h", + "line": 271, + "lineto": 272, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "return the id of the written blob" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the blob will be written" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "data to be written into the blob" + }, + { "name": "len", "type": "size_t", "comment": "length of the data" } + ], + "argline": "git_oid *id, git_repository *repo, const void *buffer, size_t len", + "sig": "git_oid *::git_repository *::const void *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an in-memory buffer to the ODB as a blob

\n", + "comments": "", + "group": "blob" + }, + "git_blob_is_binary": { + "type": "function", + "file": "git2/blob.h", + "line": 285, + "lineto": 285, + "args": [ + { + "name": "blob", + "type": "const git_blob *", + "comment": "The blob which content should be analyzed" + } + ], + "argline": "const git_blob *blob", + "sig": "const git_blob *", + "return": { + "type": "int", + "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." + }, + "description": "

Determine if the blob content is most certainly binary or not.

\n", + "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", + "group": "blob" + }, + "git_blob_data_is_binary": { + "type": "function", + "file": "git2/blob.h", + "line": 297, + "lineto": 297, + "args": [ + { + "name": "data", + "type": "const char *", + "comment": "The blob data which content should be analyzed" + }, + { "name": "len", "type": "size_t", "comment": "The length of the data" } + ], + "argline": "const char *data, size_t len", + "sig": "const char *::size_t", + "return": { + "type": "int", + "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." + }, + "description": "

Determine if the given content is most certainly binary or not;\n this is the same mechanism used by git_blob_is_binary but only\n looking at raw data.

\n", + "comments": "", + "group": "blob" + }, + "git_blob_dup": { + "type": "function", + "file": "git2/blob.h", + "line": 307, + "lineto": 307, + "args": [ + { + "name": "out", + "type": "git_blob **", + "comment": "Pointer to store the copy of the object" + }, + { + "name": "source", + "type": "git_blob *", + "comment": "Original object to copy" + } + ], + "argline": "git_blob **out, git_blob *source", + "sig": "git_blob **::git_blob *", + "return": { "type": "int", "comment": " 0." }, + "description": "

Create an in-memory copy of a blob. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "blob" + }, + "git_branch_create": { + "type": "function", + "file": "git2/branch.h", + "line": 52, + "lineto": 57, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer where to store the underlying reference." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the branch in." + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." + }, + { + "name": "target", + "type": "const git_commit *", + "comment": "Commit to which this branch should point. This object\n must belong to the given `repo`." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } + ], + "argline": "git_reference **out, git_repository *repo, const char *branch_name, const git_commit *target, int force", + "sig": "git_reference **::git_repository *::const char *::const git_commit *::int", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC or an error code.\n A proper reference is written in the refs/heads namespace\n pointing to the provided target commit." + }, + "description": "

Create a new branch pointing at a target commit

\n", + "comments": "

A new direct reference will be created pointing to this target commit. If force is true and a reference already exists with the given name, it'll be replaced.

\n\n

The returned reference must be freed by the user.

\n\n

The branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "branch" + }, + "git_branch_create_from_annotated": { + "type": "function", + "file": "git2/branch.h", + "line": 70, + "lineto": 75, + "args": [ + { "name": "ref_out", "type": "git_reference **", "comment": null }, + { "name": "repository", "type": "git_repository *", "comment": null }, + { "name": "branch_name", "type": "const char *", "comment": null }, + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": null + }, + { "name": "force", "type": "int", "comment": null } + ], + "argline": "git_reference **ref_out, git_repository *repository, const char *branch_name, const git_annotated_commit *commit, int force", + "sig": "git_reference **::git_repository *::const char *::const git_annotated_commit *::int", + "return": { "type": "int", "comment": null }, + "description": "

Create a new branch pointing at a target commit

\n", + "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", + "group": "branch", + "examples": { + "checkout.c": [ + "ex/v1.8.4/checkout.html#git_branch_create_from_annotated-7" + ] + } + }, + "git_branch_delete": { + "type": "function", + "file": "git2/branch.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "branch", + "type": "git_reference *", + "comment": "A valid reference representing a branch" + } + ], + "argline": "git_reference *branch", + "sig": "git_reference *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code." + }, + "description": "

Delete an existing branch reference.

\n", + "comments": "

Note that if the deletion succeeds, the reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", + "group": "branch" + }, + "git_branch_iterator_new": { + "type": "function", + "file": "git2/branch.h", + "line": 103, + "lineto": 106, + "args": [ + { + "name": "out", + "type": "git_branch_iterator **", + "comment": "the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the branches." + }, + { + "name": "list_flags", + "type": "git_branch_t", + "comment": "Filtering flags for the branch\n listing. Valid values are GIT_BRANCH_LOCAL, GIT_BRANCH_REMOTE\n or GIT_BRANCH_ALL." + } + ], + "argline": "git_branch_iterator **out, git_repository *repo, git_branch_t list_flags", + "sig": "git_branch_iterator **::git_repository *::git_branch_t", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Create an iterator which loops over the requested branches.

\n", + "comments": "", + "group": "branch" + }, + "git_branch_next": { + "type": "function", + "file": "git2/branch.h", + "line": 116, + "lineto": 116, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "the reference" + }, + { + "name": "out_type", + "type": "git_branch_t *", + "comment": "the type of branch (local or remote-tracking)" + }, + { + "name": "iter", + "type": "git_branch_iterator *", + "comment": "the branch iterator" + } + ], + "argline": "git_reference **out, git_branch_t *out_type, git_branch_iterator *iter", + "sig": "git_reference **::git_branch_t *::git_branch_iterator *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ITEROVER if there are no more branches or an error code." + }, + "description": "

Retrieve the next branch from the iterator

\n", + "comments": "", + "group": "branch" + }, + "git_branch_iterator_free": { + "type": "function", + "file": "git2/branch.h", + "line": 123, + "lineto": 123, + "args": [ + { + "name": "iter", + "type": "git_branch_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_branch_iterator *iter", + "sig": "git_branch_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free a branch iterator

\n", + "comments": "", + "group": "branch" + }, + "git_branch_move": { + "type": "function", + "file": "git2/branch.h", + "line": 146, + "lineto": 150, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "New reference object for the updated name." + }, + { + "name": "branch", + "type": "git_reference *", + "comment": "Current underlying reference of the branch." + }, + { + "name": "new_branch_name", + "type": "const char *", + "comment": "Target name of the branch once the move\n is performed; this name is validated for consistency." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } + ], + "argline": "git_reference **out, git_reference *branch, const char *new_branch_name, int force", + "sig": "git_reference **::git_reference *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Move/rename an existing local branch reference.

\n", + "comments": "

The new branch name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

Note that if the move succeeds, the old reference object will not be valid anymore, and should be freed immediately by the user using git_reference_free().

\n", + "group": "branch" + }, + "git_branch_lookup": { + "type": "function", + "file": "git2/branch.h", + "line": 170, + "lineto": 174, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the looked-up branch reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the branch" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name of the branch to be looked-up;\n this name is validated for consistency." + }, + { + "name": "branch_type", + "type": "git_branch_t", + "comment": "Type of the considered branch. This should\n be valued with either GIT_BRANCH_LOCAL or GIT_BRANCH_REMOTE." + } + ], + "argline": "git_reference **out, git_repository *repo, const char *branch_name, git_branch_t branch_type", + "sig": "git_reference **::git_repository *::const char *::git_branch_t", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND when no matching branch\n exists, GIT_EINVALIDSPEC, otherwise an error code." + }, + "description": "

Lookup a branch by its name in a repository.

\n", + "comments": "

The generated reference must be freed by the user. The branch name will be checked for validity.

\n", + "group": "branch" + }, + "git_branch_name": { + "type": "function", + "file": "git2/branch.h", + "line": 191, + "lineto": 193, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "Pointer to the abbreviated reference name.\n Owned by ref, do not free." + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "A reference object, ideally pointing to a branch" + } + ], + "argline": "const char **out, const git_reference *ref", + "sig": "const char **::const git_reference *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_EINVALID if the reference isn't either a local or\n remote branch, otherwise an error code." + }, + "description": "

Get the branch name

\n", + "comments": "

Given a reference object, this will check that it really is a branch (ie. it lives under "refs/heads/" or "refs/remotes/"), and return the branch part of it.

\n", + "group": "branch", + "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_branch_name-4"] } + }, + "git_branch_upstream": { + "type": "function", + "file": "git2/branch.h", + "line": 209, + "lineto": 211, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer where to store the retrieved reference." + }, + { + "name": "branch", + "type": "const git_reference *", + "comment": "Current underlying reference of the branch." + } + ], + "argline": "git_reference **out, const git_reference *branch", + "sig": "git_reference **::const git_reference *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND when no remote tracking\n reference exists, otherwise an error code." + }, + "description": "

Get the upstream of a branch

\n", + "comments": "

Given a reference, this will return a new reference object corresponding to its remote tracking branch. The reference must be a local branch.

\n", + "group": "branch" + }, + "git_branch_set_upstream": { + "type": "function", + "file": "git2/branch.h", + "line": 228, + "lineto": 230, + "args": [ + { + "name": "branch", + "type": "git_reference *", + "comment": "the branch to configure" + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "remote-tracking or local branch to set as upstream." + } + ], + "argline": "git_reference *branch, const char *branch_name", + "sig": "git_reference *::const char *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" + }, + "description": "

Set a branch's upstream branch

\n", + "comments": "

This will update the configuration to set the branch named branch_name as the upstream of branch. Pass a NULL name to unset the upstream information.

\n", + "group": "branch" + }, + "git_branch_upstream_name": { + "type": "function", + "file": "git2/branch.h", + "line": 246, + "lineto": 249, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer into which the name will be written." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the branches live." + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference name of the local branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND when no remote tracking reference exists,\n or an error code." + }, + "description": "

Get the upstream name of a branch

\n", + "comments": "

Given a local branch, this will return its remote-tracking branch information, as a full reference name, ie. "feature/nice" would become "refs/remote/origin/feature/nice", depending on that branch's configuration.

\n", + "group": "branch" + }, + "git_branch_is_head": { + "type": "function", + "file": "git2/branch.h", + "line": 259, + "lineto": 260, + "args": [ + { + "name": "branch", + "type": "const git_reference *", + "comment": "A reference to a local branch." + } + ], + "argline": "const git_reference *branch", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 if HEAD points at the branch, 0 if it isn't, or a negative value\n \t\t as an error code." + }, + "description": "

Determine if HEAD points to the given branch

\n", + "comments": "", + "group": "branch" + }, + "git_branch_is_checked_out": { + "type": "function", + "file": "git2/branch.h", + "line": 272, + "lineto": 273, + "args": [ + { + "name": "branch", + "type": "const git_reference *", + "comment": "A reference to a local branch." + } + ], + "argline": "const git_reference *branch", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 if branch is checked out, 0 if it isn't, an error code otherwise." + }, + "description": "

Determine if any HEAD points to the current branch

\n", + "comments": "

This will iterate over all known linked repositories (usually in the form of worktrees) and report whether any HEAD is pointing at the current branch.

\n", + "group": "branch" + }, + "git_branch_remote_name": { + "type": "function", + "file": "git2/branch.h", + "line": 291, + "lineto": 294, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The buffer into which the name will be written." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository where the branch lives." + }, + { + "name": "refname", + "type": "const char *", + "comment": "complete name of the remote tracking branch." + } + ], + "argline": "git_buf *out, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND when no matching remote was found,\n GIT_EAMBIGUOUS when the branch maps to several remotes,\n otherwise an error code." + }, + "description": "

Find the remote name of a remote-tracking branch

\n", + "comments": "

This will return the name of the remote whose fetch refspec is matching the given branch. E.g. given a branch "refs/remotes/test/master", it will extract the "test" part. If refspecs from multiple remotes match, the function will return GIT_EAMBIGUOUS.

\n", + "group": "branch" + }, + "git_branch_upstream_remote": { + "type": "function", + "file": "git2/branch.h", + "line": 307, + "lineto": 307, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Retrieve the upstream remote of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.remote" for a given branch. This branch must be local.

\n", + "group": "branch" + }, + "git_branch_upstream_merge": { + "type": "function", + "file": "git2/branch.h", + "line": 320, + "lineto": 320, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "the buffer into which to write the name" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the full name of the branch" + } + ], + "argline": "git_buf *buf, git_repository *repo, const char *refname", + "sig": "git_buf *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Retrieve the upstream merge of a local branch

\n", + "comments": "

This will return the currently configured "branch.*.merge" for a given branch. This branch must be local.

\n", + "group": "branch" + }, + "git_branch_name_is_valid": { + "type": "function", + "file": "git2/branch.h", + "line": 332, + "lineto": 332, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given branch name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a branch name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Determine whether a branch name is valid, meaning that (when prefixed\n with refs/heads/) that it is a valid reference name, and that any\n additional branch name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "branch" + }, + "git_buf_dispose": { + "type": "function", + "file": "git2/buffer.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to deallocate" + } + ], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_buf.

\n", + "comments": "

Note that this does not free the git_buf itself, just the memory pointed to by buffer->ptr.

\n", + "group": "buf", + "examples": { + "diff.c": [ + "ex/v1.8.4/diff.html#git_buf_dispose-1", + "ex/v1.8.4/diff.html#git_buf_dispose-2" + ], + "tag.c": ["ex/v1.8.4/tag.html#git_buf_dispose-1"] + } + }, + "git_checkout_options_init": { + "type": "function", + "file": "git2/checkout.h", + "line": 360, + "lineto": 362, + "args": [ + { + "name": "opts", + "type": "git_checkout_options *", + "comment": "The `git_checkout_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CHECKOUT_OPTIONS_VERSION`." + } + ], + "argline": "git_checkout_options *opts, unsigned int version", + "sig": "git_checkout_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_checkout_options structure

\n", + "comments": "

Initializes a git_checkout_options with default values. Equivalent to creating an instance with GIT_CHECKOUT_OPTIONS_INIT.

\n", + "group": "checkout" + }, + "git_checkout_head": { + "type": "function", + "file": "git2/checkout.h", + "line": 381, + "lineto": 383, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to check out (must be non-bare)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, const git_checkout_options *opts", + "sig": "git_repository *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH if HEAD points to a non\n existing branch, non-zero value returned by `notify_cb`, or\n other error code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the index and the working tree to match the content of\n the commit pointed at by HEAD.

\n", + "comments": "

Note that this is not the correct mechanism used to switch branches; do not change your HEAD and then call this method, that would leave you with checkout conflicts since your working directory would then appear to be dirty. Instead, checkout the target of the branch and then update HEAD using git_repository_set_head to point to the branch you checked out.

\n", + "group": "checkout" + }, + "git_checkout_index": { + "type": "function", + "file": "git2/checkout.h", + "line": 394, + "lineto": 397, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository into which to check out (must be non-bare)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "index to be checked out (or NULL to use repository index)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, git_index *index, const git_checkout_options *opts", + "sig": "git_repository *::git_index *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the working tree to match the content of the index.

\n", + "comments": "", + "group": "checkout" + }, + "git_checkout_tree": { + "type": "function", + "file": "git2/checkout.h", + "line": 410, + "lineto": 413, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to check out (must be non-bare)" + }, + { + "name": "treeish", + "type": "const git_object *", + "comment": "a commit, tag or tree which content will be used to update\n the working directory (or NULL to use HEAD)" + }, + { + "name": "opts", + "type": "const git_checkout_options *", + "comment": "specifies checkout options (may be NULL)" + } + ], + "argline": "git_repository *repo, const git_object *treeish, const git_checkout_options *opts", + "sig": "git_repository *::const git_object *::const git_checkout_options *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero return value from `notify_cb`, or error\n code \n<\n 0 (use git_error_last for error details)" + }, + "description": "

Updates files in the index and working tree to match the content of the\n tree pointed at by the treeish.

\n", + "comments": "", + "group": "checkout", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_checkout_tree-8"], + "merge.c": ["ex/v1.8.4/merge.html#git_checkout_tree-5"] + } + }, + "git_cherrypick_options_init": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 49, + "lineto": 51, + "args": [ + { + "name": "opts", + "type": "git_cherrypick_options *", + "comment": "The `git_cherrypick_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CHERRYPICK_OPTIONS_VERSION`." + } + ], + "argline": "git_cherrypick_options *opts, unsigned int version", + "sig": "git_cherrypick_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_cherrypick_options structure

\n", + "comments": "

Initializes a git_cherrypick_options with default values. Equivalent to creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.

\n", + "group": "cherrypick" + }, + "git_cherrypick_commit": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 67, + "lineto": 73, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository that contains the given commits" + }, + { + "name": "cherrypick_commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick" + }, + { + "name": "our_commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick against (eg, HEAD)" + }, + { + "name": "mainline", + "type": "unsigned int", + "comment": "the parent of the `cherrypick_commit`, if it is a merge" + }, + { + "name": "merge_options", + "type": "const git_merge_options *", + "comment": "the merge options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_commit *cherrypick_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", + "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Cherry-picks the given commit against the given "our" commit, producing an\n index that reflects the result of the cherry-pick.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "cherrypick" + }, + "git_cherrypick": { + "type": "function", + "file": "git2/cherrypick.h", + "line": 83, + "lineto": 86, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to cherry-pick" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to cherry-pick" + }, + { + "name": "cherrypick_options", + "type": "const git_cherrypick_options *", + "comment": "the cherry-pick options (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_commit *commit, const git_cherrypick_options *cherrypick_options", + "sig": "git_repository *::git_commit *::const git_cherrypick_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Cherry-pick the given commit, producing changes in the index and working directory.

\n", + "comments": "", + "group": "cherrypick" + }, + "git_clone_options_init": { + "type": "function", + "file": "git2/clone.h", + "line": 181, + "lineto": 183, + "args": [ + { + "name": "opts", + "type": "git_clone_options *", + "comment": "The `git_clone_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_CLONE_OPTIONS_VERSION`." + } + ], + "argline": "git_clone_options *opts, unsigned int version", + "sig": "git_clone_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_clone_options structure

\n", + "comments": "

Initializes a git_clone_options with default values. Equivalent to creating an instance with GIT_CLONE_OPTIONS_INIT.

\n", + "group": "clone" + }, + "git_clone": { + "type": "function", + "file": "git2/clone.h", + "line": 201, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer that will receive the resulting repository object" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository to clone" + }, + { + "name": "local_path", + "type": "const char *", + "comment": "local directory to clone to" + }, + { + "name": "options", + "type": "const git_clone_options *", + "comment": "configuration options for the clone. If NULL, the\n function works as though GIT_OPTIONS_INIT were passed." + } + ], + "argline": "git_repository **out, const char *url, const char *local_path, const git_clone_options *options", + "sig": "git_repository **::const char *::const char *::const git_clone_options *", + "return": { + "type": "int", + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" + }, + "description": "

Clone a remote repository.

\n", + "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n", + "group": "clone" + }, + "git_commit_lookup": { + "type": "function", + "file": "git2/commit.h", + "line": 36, + "lineto": 37, + "args": [ + { + "name": "commit", + "type": "git_commit **", + "comment": "pointer to the looked up commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the commit." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." + } + ], + "argline": "git_commit **commit, git_repository *repo, const git_oid *id", + "sig": "git_commit **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a commit object from a repository.

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "group": "commit", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_commit_lookup-9"], + "general.c": [ + "ex/v1.8.4/general.html#git_commit_lookup-6", + "ex/v1.8.4/general.html#git_commit_lookup-7", + "ex/v1.8.4/general.html#git_commit_lookup-8" + ], + "log.c": ["ex/v1.8.4/log.html#git_commit_lookup-1"], + "merge.c": ["ex/v1.8.4/merge.html#git_commit_lookup-6"] + } + }, + "git_commit_lookup_prefix": { + "type": "function", + "file": "git2/commit.h", + "line": 55, + "lineto": 56, + "args": [ + { + "name": "commit", + "type": "git_commit **", + "comment": "pointer to the looked up commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the commit." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the commit to locate. If the object is\n\t\tan annotated tag it will be peeled back to the commit." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_commit **commit, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_commit **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a commit object from a repository, given a prefix of its\n identifier (short id).

\n", + "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", + "group": "commit" + }, + "git_commit_free": { + "type": "function", + "file": "git2/commit.h", + "line": 70, + "lineto": 70, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to close" + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open commit

\n", + "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", + "group": "commit", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_commit_free-10"], + "general.c": [ + "ex/v1.8.4/general.html#git_commit_free-9", + "ex/v1.8.4/general.html#git_commit_free-10", + "ex/v1.8.4/general.html#git_commit_free-11", + "ex/v1.8.4/general.html#git_commit_free-12", + "ex/v1.8.4/general.html#git_commit_free-13" + ], + "log.c": [ + "ex/v1.8.4/log.html#git_commit_free-2", + "ex/v1.8.4/log.html#git_commit_free-3", + "ex/v1.8.4/log.html#git_commit_free-4", + "ex/v1.8.4/log.html#git_commit_free-5" + ] + } + }, + "git_commit_id": { + "type": "function", + "file": "git2/commit.h", + "line": 78, + "lineto": 78, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the commit." + }, + "description": "

Get the id of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_commit_id-14"], + "log.c": ["ex/v1.8.4/log.html#git_commit_id-6"] + } + }, + "git_commit_owner": { + "type": "function", + "file": "git2/commit.h", + "line": 86, + "lineto": 86, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "A previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this commit." + }, + "description": "

Get the repository that contains the commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "log.c": [ + "ex/v1.8.4/log.html#git_commit_owner-7", + "ex/v1.8.4/log.html#git_commit_owner-8" + ] + } + }, + "git_commit_message_encoding": { + "type": "function", + "file": "git2/commit.h", + "line": 98, + "lineto": 98, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { "type": "const char *", "comment": " NULL, or the encoding" }, + "description": "

Get the encoding for the message of a commit,\n as a string representing a standard encoding name.

\n", + "comments": "

The encoding may be NULL if the encoding header in the commit is missing; in that case UTF-8 is assumed.

\n", + "group": "commit" + }, + "git_commit_message": { + "type": "function", + "file": "git2/commit.h", + "line": 109, + "lineto": 109, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the message of a commit" + }, + "description": "

Get the full message of a commit.

\n", + "comments": "

The returned message will be slightly prettified by removing any potential leading newlines.

\n", + "group": "commit", + "examples": { + "cat-file.c": [ + "ex/v1.8.4/cat-file.html#git_commit_message-3", + "ex/v1.8.4/cat-file.html#git_commit_message-4" + ], + "general.c": [ + "ex/v1.8.4/general.html#git_commit_message-15", + "ex/v1.8.4/general.html#git_commit_message-16", + "ex/v1.8.4/general.html#git_commit_message-17" + ], + "log.c": [ + "ex/v1.8.4/log.html#git_commit_message-9", + "ex/v1.8.4/log.html#git_commit_message-10", + "ex/v1.8.4/log.html#git_commit_message-11" + ], + "tag.c": ["ex/v1.8.4/tag.html#git_commit_message-2"] + } + }, + "git_commit_message_raw": { + "type": "function", + "file": "git2/commit.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the raw message of a commit" + }, + "description": "

Get the full raw message of a commit.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_summary": { + "type": "function", + "file": "git2/commit.h", + "line": 128, + "lineto": 128, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { + "type": "const char *", + "comment": " the summary of a commit or NULL on error" + }, + "description": "

Get the short "summary" of the git commit message.

\n", + "comments": "

The returned message is the summary of the commit, comprising the first paragraph of the message with whitespace trimmed and squashed.

\n", + "group": "commit" + }, + "git_commit_body": { + "type": "function", + "file": "git2/commit.h", + "line": 141, + "lineto": 141, + "args": [ + { + "name": "commit", + "type": "git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_commit *commit", + "sig": "git_commit *", + "return": { + "type": "const char *", + "comment": " the body of a commit or NULL when no the message only\n consists of a summary" + }, + "description": "

Get the long "body" of the git commit message.

\n", + "comments": "

The returned message is the body of the commit, comprising everything but the first paragraph of the message. Leading and trailing whitespaces are trimmed.

\n", + "group": "commit" + }, + "git_commit_time": { + "type": "function", + "file": "git2/commit.h", + "line": 149, + "lineto": 149, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { "type": "git_time_t", "comment": " the time of a commit" }, + "description": "

Get the commit time (i.e. committer time) of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": [ + "ex/v1.8.4/general.html#git_commit_time-18", + "ex/v1.8.4/general.html#git_commit_time-19" + ] + } + }, + "git_commit_time_offset": { + "type": "function", + "file": "git2/commit.h", + "line": 157, + "lineto": 157, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "int", + "comment": " positive or negative timezone offset, in minutes from UTC" + }, + "description": "

Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_committer": { + "type": "function", + "file": "git2/commit.h", + "line": 165, + "lineto": 165, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_signature *", + "comment": " the committer of a commit" + }, + "description": "

Get the committer of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_committer-5"], + "general.c": ["ex/v1.8.4/general.html#git_commit_committer-20"], + "log.c": ["ex/v1.8.4/log.html#git_commit_committer-12"] + } + }, + "git_commit_author": { + "type": "function", + "file": "git2/commit.h", + "line": 173, + "lineto": 173, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_signature *", + "comment": " the author of a commit" + }, + "description": "

Get the author of a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_author-6"], + "general.c": [ + "ex/v1.8.4/general.html#git_commit_author-21", + "ex/v1.8.4/general.html#git_commit_author-22" + ], + "log.c": [ + "ex/v1.8.4/log.html#git_commit_author-13", + "ex/v1.8.4/log.html#git_commit_author-14" + ] + } + }, + "git_commit_committer_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 186, + "lineto": 187, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the committer of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, + "git_commit_author_with_mailmap": { + "type": "function", + "file": "git2/commit.h", + "line": 200, + "lineto": 201, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "a pointer to store the resolved signature." + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "mailmap", + "type": "const git_mailmap *", + "comment": "the mailmap to resolve with. (may be NULL)" + } + ], + "argline": "git_signature **out, const git_commit *commit, const git_mailmap *mailmap", + "sig": "git_signature **::const git_commit *::const git_mailmap *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the author of a commit, using the mailmap to map names and email\n addresses to canonical real names and email addresses.

\n", + "comments": "

Call git_signature_free to free the signature.

\n", + "group": "commit" + }, + "git_commit_raw_header": { + "type": "function", + "file": "git2/commit.h", + "line": 209, + "lineto": 209, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit" + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const char *", + "comment": " the header text of the commit" + }, + "description": "

Get the full raw text of the commit header.

\n", + "comments": "", + "group": "commit" + }, + "git_commit_tree": { + "type": "function", + "file": "git2/commit.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "tree_out", + "type": "git_tree **", + "comment": "pointer where to store the tree object" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "git_tree **tree_out, const git_commit *commit", + "sig": "git_tree **::const git_commit *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the tree pointed to by a commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "log.c": [ + "ex/v1.8.4/log.html#git_commit_tree-15", + "ex/v1.8.4/log.html#git_commit_tree-16", + "ex/v1.8.4/log.html#git_commit_tree-17", + "ex/v1.8.4/log.html#git_commit_tree-18", + "ex/v1.8.4/log.html#git_commit_tree-19" + ] + } + }, + "git_commit_tree_id": { + "type": "function", + "file": "git2/commit.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "const git_oid *", + "comment": " the id of tree pointed to by commit." + }, + "description": "

Get the id of the tree pointed to by a commit. This differs from\n git_commit_tree in that no attempts are made to fetch an object\n from the ODB.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_tree_id-7"] + } + }, + "git_commit_parentcount": { + "type": "function", + "file": "git2/commit.h", + "line": 236, + "lineto": 236, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + } + ], + "argline": "const git_commit *commit", + "sig": "const git_commit *", + "return": { + "type": "unsigned int", + "comment": " integer of count of parents" + }, + "description": "

Get the number of parents of this commit

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_parentcount-8"], + "general.c": ["ex/v1.8.4/general.html#git_commit_parentcount-23"], + "log.c": [ + "ex/v1.8.4/log.html#git_commit_parentcount-20", + "ex/v1.8.4/log.html#git_commit_parentcount-21" + ] + } + }, + "git_commit_parent": { + "type": "function", + "file": "git2/commit.h", + "line": 246, + "lineto": 249, + "args": [ + { + "name": "out", + "type": "git_commit **", + "comment": "Pointer where to store the parent commit" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the position of the parent (from 0 to `parentcount`)" + } + ], + "argline": "git_commit **out, const git_commit *commit, unsigned int n", + "sig": "git_commit **::const git_commit *::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the specified parent of the commit.

\n", + "comments": "", + "group": "commit", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_commit_parent-24"], + "log.c": [ + "ex/v1.8.4/log.html#git_commit_parent-22", + "ex/v1.8.4/log.html#git_commit_parent-23" + ] + } + }, + "git_commit_parent_id": { + "type": "function", + "file": "git2/commit.h", + "line": 260, + "lineto": 262, + "args": [ + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the position of the parent (from 0 to `parentcount`)" + } + ], + "argline": "const git_commit *commit, unsigned int n", + "sig": "const git_commit *::unsigned int", + "return": { + "type": "const git_oid *", + "comment": " the id of the parent, NULL on error." + }, + "description": "

Get the oid of a specified parent for a commit. This is different from\n git_commit_parent, which will attempt to load the parent commit from\n the ODB.

\n", + "comments": "", + "group": "commit", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_parent_id-9"], + "log.c": ["ex/v1.8.4/log.html#git_commit_parent_id-24"] + } + }, + "git_commit_nth_gen_ancestor": { + "type": "function", + "file": "git2/commit.h", + "line": 278, + "lineto": 281, + "args": [ + { + "name": "ancestor", + "type": "git_commit **", + "comment": "Pointer where to store the ancestor commit" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "a previously loaded commit." + }, + { + "name": "n", + "type": "unsigned int", + "comment": "the requested generation" + } + ], + "argline": "git_commit **ancestor, const git_commit *commit, unsigned int n", + "sig": "git_commit **::const git_commit *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if no matching ancestor exists\n or an error code" + }, + "description": "

Get the commit object that is the \n<n

\n\n
\n

th generation ancestor\n of the named commit object, following only the first parents.\n The returned commit has to be freed by the caller.

\n
\n", + "comments": "

Passing 0 as the generation number returns another instance of the base commit itself.

\n", + "group": "commit" + }, + "git_commit_header_field": { + "type": "function", + "file": "git2/commit.h", + "line": 293, + "lineto": 293, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer to fill; existing content will be\n overwritten" + }, + { + "name": "commit", + "type": "const git_commit *", + "comment": "the commit to look in" + }, + { + "name": "field", + "type": "const char *", + "comment": "the header field to return" + } + ], + "argline": "git_buf *out, const git_commit *commit, const char *field", + "sig": "git_buf *::const git_commit *::const char *", + "return": { + "type": "int", + "comment": " 0 on succeess, GIT_ENOTFOUND if the field does not exist,\n or an error code" + }, + "description": "

Get an arbitrary header field

\n", + "comments": "", + "group": "commit" + }, + "git_commit_extract_signature": { + "type": "function", + "file": "git2/commit.h", + "line": 313, + "lineto": 313, + "args": [ + { + "name": "signature", + "type": "git_buf *", + "comment": "the signature block; existing content will be\n overwritten" + }, + { + "name": "signed_data", + "type": "git_buf *", + "comment": "signed data; this is the commit contents minus the signature block;\n existing content will be overwritten" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which the commit exists" + }, + { + "name": "commit_id", + "type": "git_oid *", + "comment": "the commit from which to extract the data" + }, + { + "name": "field", + "type": "const char *", + "comment": "the name of the header field containing the signature\n block; pass `NULL` to extract the default 'gpgsig'" + } + ], + "argline": "git_buf *signature, git_buf *signed_data, git_repository *repo, git_oid *commit_id, const char *field", + "sig": "git_buf *::git_buf *::git_repository *::git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the id is not for a commit\n or the commit does not have a signature." + }, + "description": "

Extract the signature from a commit

\n", + "comments": "

If the id is not for a commit, the error class will be GIT_ERROR_INVALID. If the commit does not have a signature, the error class will be GIT_ERROR_OBJECT.

\n", + "group": "commit" + }, + "git_commit_create": { + "type": "function", + "file": "git2/commit.h", + "line": 359, + "lineto": 369, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the commit" + }, + { + "name": "update_ref", + "type": "const char *", + "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." + } + ], + "argline": "git_oid *id, 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, size_t parent_count, const git_commit *[] parents", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", + "return": { + "type": "int", + "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" + }, + "description": "

Create new commit in the repository from a list of git_object pointers

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", + "group": "commit", + "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_commit_create-7"] } + }, + "git_commit_create_v": { + "type": "function", + "file": "git2/commit.h", + "line": 385, + "lineto": 395, + "args": [ + { "name": "id", "type": "git_oid *", "comment": null }, + { "name": "repo", "type": "git_repository *", "comment": null }, + { "name": "update_ref", "type": "const char *", "comment": null }, + { "name": "author", "type": "const git_signature *", "comment": null }, + { + "name": "committer", + "type": "const git_signature *", + "comment": null + }, + { "name": "message_encoding", "type": "const char *", "comment": null }, + { "name": "message", "type": "const char *", "comment": null }, + { "name": "tree", "type": "const git_tree *", "comment": null }, + { "name": "parent_count", "type": "size_t", "comment": null } + ], + "argline": "git_oid *id, 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, size_t parent_count", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t", + "return": { "type": "int", "comment": null }, + "description": "

Create new commit in the repository using a variable argument list.

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", + "group": "commit", + "examples": { + "commit.c": ["ex/v1.8.4/commit.html#git_commit_create_v-1"], + "general.c": ["ex/v1.8.4/general.html#git_commit_create_v-25"], + "init.c": ["ex/v1.8.4/init.html#git_commit_create_v-1"] + } + }, + "git_commit_create_from_stage": { + "type": "function", + "file": "git2/commit.h", + "line": 434, + "lineto": 438, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "pointer to store the new commit's object id" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to commit changes in" + }, + { + "name": "message", + "type": "const char *", + "comment": "the commit message" + }, + { + "name": "opts", + "type": "const git_commit_create_options *", + "comment": "options for creating the commit" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *message, const git_commit_create_options *opts", + "sig": "git_oid *::git_repository *::const char *::const git_commit_create_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNCHANGED if there were no changes to commit, or an error code" + }, + "description": "

Commits the staged changes in the repository; this is a near analog to\n git commit -m message.

\n", + "comments": "

By default, empty commits are not allowed.

\n", + "group": "commit" + }, + "git_commit_amend": { + "type": "function", + "file": "git2/commit.h", + "line": 461, + "lineto": 469, + "args": [ + { "name": "id", "type": "git_oid *", "comment": null }, + { + "name": "commit_to_amend", + "type": "const git_commit *", + "comment": null + }, + { "name": "update_ref", "type": "const char *", "comment": null }, + { "name": "author", "type": "const git_signature *", "comment": null }, + { + "name": "committer", + "type": "const git_signature *", + "comment": null + }, + { "name": "message_encoding", "type": "const char *", "comment": null }, + { "name": "message", "type": "const char *", "comment": null }, + { "name": "tree", "type": "const git_tree *", "comment": null } + ], + "argline": "git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree", + "sig": "git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *", + "return": { "type": "int", "comment": null }, + "description": "

Amend an existing commit by replacing only non-NULL values.

\n", + "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", + "group": "commit" + }, + "git_commit_create_buffer": { + "type": "function", + "file": "git2/commit.h", + "line": 506, + "lineto": 515, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer into which to write the commit object content" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where the referenced tree and parents live" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "Array of `parent_count` pointers to `git_commit`\n objects that will be used as the parents for this commit. This\n array may be NULL if `parent_count` is 0 (root commit). All the\n given commits must be owned by the `repo`." + } + ], + "argline": "git_buf *out, git_repository *repo, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents", + "sig": "git_buf *::git_repository *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a commit and write it into a buffer

\n", + "comments": "

Create a commit as with git_commit_create() but instead of writing it to the objectdb, write the contents of the object into a buffer.

\n", + "group": "commit" + }, + "git_commit_create_with_signature": { + "type": "function", + "file": "git2/commit.h", + "line": 533, + "lineto": 538, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the resulting commit id" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the commit in." + }, + { + "name": "commit_content", + "type": "const char *", + "comment": "the content of the unsigned commit object" + }, + { + "name": "signature", + "type": "const char *", + "comment": "the signature to add to the commit. Leave `NULL`\n to create a commit without adding a signature field." + }, + { + "name": "signature_field", + "type": "const char *", + "comment": "which header field should contain this\n signature. Leave `NULL` for the default of \"gpgsig\"" + } + ], + "argline": "git_oid *out, git_repository *repo, const char *commit_content, const char *signature, const char *signature_field", + "sig": "git_oid *::git_repository *::const char *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a commit object from the given buffer and signature

\n", + "comments": "

Given the unsigned commit object's contents, its signature and the header field in which to store the signature, attach the signature to the commit and write it into the given repository.

\n", + "group": "commit" + }, + "git_commit_dup": { + "type": "function", + "file": "git2/commit.h", + "line": 548, + "lineto": 548, + "args": [ + { + "name": "out", + "type": "git_commit **", + "comment": "Pointer to store the copy of the commit" + }, + { + "name": "source", + "type": "git_commit *", + "comment": "Original commit to copy" + } + ], + "argline": "git_commit **out, git_commit *source", + "sig": "git_commit **::git_commit *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a commit. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "commit" + }, + "git_commitarray_dispose": { + "type": "function", + "file": "git2/commit.h", + "line": 603, + "lineto": 603, + "args": [ + { + "name": "array", + "type": "git_commitarray *", + "comment": "The git_commitarray that contains commits to free" + } + ], + "argline": "git_commitarray *array", + "sig": "git_commitarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the commits contained in a commit array. This method should\n be called on git_commitarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", + "comments": "

This does not free the git_commitarray itself, since the library will never allocate that object directly itself.

\n", + "group": "commitarray" + }, + "git_libgit2_version": { + "type": "function", + "file": "git2/common.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "major", + "type": "int *", + "comment": "Store the major version number" + }, + { + "name": "minor", + "type": "int *", + "comment": "Store the minor version number" + }, + { + "name": "rev", + "type": "int *", + "comment": "Store the revision (patch) number" + } + ], + "argline": "int *major, int *minor, int *rev", + "sig": "int *::int *::int *", + "return": { + "type": "int", + "comment": " 0 on success or an error code on failure" + }, + "description": "

Return the version of the libgit2 library\n being currently used.

\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_prerelease": { + "type": "function", + "file": "git2/common.h", + "line": 128, + "lineto": 128, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const char *", + "comment": " the name of the prerelease state or NULL" + }, + "description": "

Return the prerelease state of the libgit2 library currently being\n used. For nightly builds during active development, this will be\n "alpha". Releases may have a "beta" or release candidate ("rc1",\n "rc2", etc) prerelease. For a final release, this function returns\n NULL.

\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_features": { + "type": "function", + "file": "git2/common.h", + "line": 180, + "lineto": 180, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " A combination of GIT_FEATURE_* values." + }, + "description": "

Query compile time options for libgit2.

\n", + "comments": "
    \n
  • GIT_FEATURE_THREADS Libgit2 was compiled with thread support. Note that thread support is still to be seen as a 'work in progress' - basic object lookups are believed to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS Libgit2 supports the https:// protocol. This requires the openssl library to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH Libgit2 supports the SSH protocol for network operations. This requires the libssh2 library to be found when compiling libgit2

  • \n
  • GIT_FEATURE_NSEC Libgit2 supports the sub-second resolution in file modification times.

  • \n
\n", + "group": "libgit2" + }, + "git_libgit2_opts": { + "type": "function", + "file": "git2/common.h", + "line": 530, + "lineto": 530, + "args": [{ "name": "option", "type": "int", "comment": "Option key" }], + "argline": "int option", + "sig": "int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set or query a library global option

\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the comment section of the User-Agent header.        > This can be information about your product and its version.       > By default this is "libgit2" followed by the libgit2 version.     >       > This value will be appended to User-Agent _product_, which        > is typically set to "git/2.0".        >       > Set to the empty string ("") to not send any information in the       > comment section, or set to NULL to restore the default.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_USER_AGENT_PRODUCT, const char *user_agent_product)\n\n    > Set the value of the product portion of the User-Agent header.        > This defaults to "git/2.0", for compatibility with other git      > clients. It is recommended to keep this as git/<version> for      > compatibility with servers that do user-agent detection.      >       > Set to the empty string ("") to not send any user-agent string,       > or set to NULL to restore the default.\n\n* opts(GIT_OPT_GET_USER_AGENT_PRODUCT, git_buf *out)\n\n    > Get the value of the User-Agent product header.       > The User-Agent product is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n\n

opts(GIT_OPT_GET_HOMEDIR, git_buf *out) > Gets the current user's home directory, as it will be used > for file lookups. The path is written to the out buffer.

\n\n

opts(GIT_OPT_SET_HOMEDIR, const char *path) > Sets the directory used as the current user's home directory, > for file lookups. > > - path directory of home directory.

\n\n

opts(GIT_OPT_GET_SERVER_CONNECT_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) to attempt connections to > a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_CONNECT_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) to attempt connections to > a remote server. Set to 0 to use the system default. Note that > this may not be able to be configured longer than the system > default, typically 75 seconds.

\n\n

opts(GIT_OPT_GET_SERVER_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) for reading from and writing > to a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) for reading from and writing > to a remote server. Set to 0 to use the system default.

\n", + "group": "libgit2" + }, + "git_config_entry_free": { + "type": "function", + "file": "git2/config.h", + "line": 113, + "lineto": 113, + "args": [ + { + "name": "entry", + "type": "git_config_entry *", + "comment": "The entry to free." + } + ], + "argline": "git_config_entry *entry", + "sig": "git_config_entry *", + "return": { "type": "void", "comment": null }, + "description": "

Free a config entry

\n", + "comments": "", + "group": "config", + "examples": { + "config.c": [ + "ex/v1.8.4/config.html#git_config_entry_free-1", + "ex/v1.8.4/config.html#git_config_entry_free-2" + ] + } + }, + "git_config_find_global": { + "type": "function", + "file": "git2/config.h", + "line": 165, + "lineto": 165, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a global configuration file has been found. Its path will be stored in `out`." + }, + "description": "

Locate the path to the global configuration file

\n", + "comments": "

The user or global configuration file is usually located in $HOME/.gitconfig.

\n\n

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.

\n\n

This method will not guess the path to the xdg compatible config file (.config/git/config).

\n", + "group": "config" + }, + "git_config_find_xdg": { + "type": "function", + "file": "git2/config.h", + "line": 182, + "lineto": 182, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a xdg compatible configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the global xdg compatible configuration file

\n", + "comments": "

The xdg compatible configuration file is usually located in $HOME/.config/git/config.

\n\n

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 xdg compatible configuration file.

\n", + "group": "config" + }, + "git_config_find_system": { + "type": "function", + "file": "git2/config.h", + "line": 194, + "lineto": 194, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a system configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the system configuration file

\n", + "comments": "

If /etc/gitconfig doesn't exist, it will look for %PROGRAMFILES%.

\n", + "group": "config" + }, + "git_config_find_programdata": { + "type": "function", + "file": "git2/config.h", + "line": 205, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Pointer to a user-allocated git_buf in which to store the path" + } + ], + "argline": "git_buf *out", + "sig": "git_buf *", + "return": { + "type": "int", + "comment": " 0 if a ProgramData configuration file has been\n\tfound. Its path will be stored in `out`." + }, + "description": "

Locate the path to the configuration file in ProgramData

\n", + "comments": "

Look for the file in %PROGRAMDATA% used by portable git.

\n", + "group": "config" + }, + "git_config_open_default": { + "type": "function", + "file": "git2/config.h", + "line": 217, + "lineto": 217, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the config instance" + } + ], + "argline": "git_config **out", + "sig": "git_config **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open the global, XDG and system configuration files

\n", + "comments": "

Utility wrapper that finds the global, XDG and system configuration files and opens them into a single prioritized config object that can be used when accessing default config data outside a repository.

\n", + "group": "config" + }, + "git_config_new": { + "type": "function", + "file": "git2/config.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer to the new configuration" + } + ], + "argline": "git_config **out", + "sig": "git_config **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Allocate a new configuration object

\n", + "comments": "

This object is empty, so you have to add a file to it before you can do anything with it.

\n", + "group": "config" + }, + "git_config_add_file_ondisk": { + "type": "function", + "file": "git2/config.h", + "line": 257, + "lineto": 262, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to add the file to" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to the configuration file to add" + }, + { + "name": "level", + "type": "git_config_level_t", + "comment": "the priority level of the backend" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "optional repository to allow parsing of\n conditional includes" + }, + { + "name": "force", + "type": "int", + "comment": "replace config file at the given priority level" + } + ], + "argline": "git_config *cfg, const char *path, git_config_level_t level, const git_repository *repo, int force", + "sig": "git_config *::const char *::git_config_level_t::const git_repository *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS when adding more than one file\n for a given priority level (and force_replace set to 0),\n GIT_ENOTFOUND when the file doesn't exist or error code" + }, + "description": "

Add an on-disk config file instance to an existing config

\n", + "comments": "

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).

\n\n

If the file does not exist, the file will still be added and it will be created the first time we write to it.

\n\n

Note that the configuration object will free the file automatically.

\n\n

Further queries on this config object will access each of the config file instances in order (instances with a higher priority level will be accessed first).

\n", + "group": "config" + }, + "git_config_open_ondisk": { + "type": "function", + "file": "git2/config.h", + "line": 276, + "lineto": 276, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "The configuration instance to create" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the on-disk file to open" + } + ], + "argline": "git_config **out, const char *path", + "sig": "git_config **::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Create a new config instance containing a single on-disk file

\n", + "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", + "group": "config", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_config_open_ondisk-26"] + } + }, + "git_config_open_level": { + "type": "function", + "file": "git2/config.h", + "line": 294, + "lineto": 297, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "The configuration instance to create" + }, + { + "name": "parent", + "type": "const git_config *", + "comment": "Multi-level config to search for the given level" + }, + { + "name": "level", + "type": "git_config_level_t", + "comment": "Configuration level to search for" + } + ], + "argline": "git_config **out, const git_config *parent, git_config_level_t level", + "sig": "git_config **::const git_config *::git_config_level_t", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the passed level cannot be found in the\n multi-level parent config, or an error code" + }, + "description": "

Build a single-level focused config object from a multi-level one.

\n", + "comments": "

The returned config object can be used to perform get/set/delete operations on a single specific level.

\n\n

Getting several times the same level from the same parent multi-level config will return different config instances, but containing the same config_file instance.

\n", + "group": "config" + }, + "git_config_open_global": { + "type": "function", + "file": "git2/config.h", + "line": 312, + "lineto": 312, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer in which to store the config object" + }, + { + "name": "config", + "type": "git_config *", + "comment": "the config object in which to look" + } + ], + "argline": "git_config **out, git_config *config", + "sig": "git_config **::git_config *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Open the global/XDG configuration file according to git's rules

\n", + "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatibility, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", + "group": "config" + }, + "git_config_snapshot": { + "type": "function", + "file": "git2/config.h", + "line": 333, + "lineto": 333, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "pointer in which to store the snapshot config object" + }, + { + "name": "config", + "type": "git_config *", + "comment": "configuration to snapshot" + } + ], + "argline": "git_config **out, git_config *config", + "sig": "git_config **::git_config *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a snapshot of the configuration

\n", + "comments": "

Create a snapshot of the current state of a configuration, which allows you to look into a consistent view of the configuration for looking up complex values (e.g. a remote, submodule).

\n\n

The string returned when querying such a config object is valid until it is freed.

\n", + "group": "config" + }, + "git_config_free": { + "type": "function", + "file": "git2/config.h", + "line": 340, + "lineto": 340, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to free" + } + ], + "argline": "git_config *cfg", + "sig": "git_config *", + "return": { "type": "void", "comment": null }, + "description": "

Free the configuration and its associated memory and files

\n", + "comments": "", + "group": "config", + "examples": { + "config.c": ["ex/v1.8.4/config.html#git_config_free-3"], + "general.c": [ + "ex/v1.8.4/general.html#git_config_free-27", + "ex/v1.8.4/general.html#git_config_free-28" + ] + } + }, + "git_config_get_entry": { + "type": "function", + "file": "git2/config.h", + "line": 352, + "lineto": 355, + "args": [ + { + "name": "out", + "type": "git_config_entry **", + "comment": "pointer to the variable git_config_entry" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_config_entry **out, const git_config *cfg, const char *name", + "sig": "git_config_entry **::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the git_config_entry of a config variable.

\n", + "comments": "

Free the git_config_entry after use with git_config_entry_free().

\n", + "group": "config", + "examples": { + "config.c": ["ex/v1.8.4/config.html#git_config_get_entry-4"] + } + }, + "git_config_get_int32": { + "type": "function", + "file": "git2/config.h", + "line": 369, + "lineto": 369, + "args": [ + { + "name": "out", + "type": "int32_t *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int32_t *out, const git_config *cfg, const char *name", + "sig": "int32_t *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of an integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config", + "examples": { + "general.c": [ + "ex/v1.8.4/general.html#git_config_get_int32-29", + "ex/v1.8.4/general.html#git_config_get_int32-30" + ] + } + }, + "git_config_get_int64": { + "type": "function", + "file": "git2/config.h", + "line": 383, + "lineto": 383, + "args": [ + { + "name": "out", + "type": "int64_t *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int64_t *out, const git_config *cfg, const char *name", + "sig": "int64_t *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a long integer config variable.

\n", + "comments": "

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_bool": { + "type": "function", + "file": "git2/config.h", + "line": 400, + "lineto": 400, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "pointer to the variable where the value should be stored" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "int *out, const git_config *cfg, const char *name", + "sig": "int *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a boolean config variable.

\n", + "comments": "

This function uses the usual C convention of 0 being false and anything else true.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_path": { + "type": "function", + "file": "git2/config.h", + "line": 418, + "lineto": 418, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer in which to store the result" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_buf *out, const git_config *cfg, const char *name", + "sig": "git_buf *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a path config variable.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_string": { + "type": "function", + "file": "git2/config.h", + "line": 436, + "lineto": 436, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "pointer to the string" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "const char **out, const git_config *cfg, const char *name", + "sig": "const char **::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a string config variable.

\n", + "comments": "

This function can only be used on snapshot config objects. The string is owned by the config and should not be freed by the user. The pointer will be valid until the config is freed.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config", + "examples": { + "general.c": [ + "ex/v1.8.4/general.html#git_config_get_string-31", + "ex/v1.8.4/general.html#git_config_get_string-32" + ] + } + }, + "git_config_get_string_buf": { + "type": "function", + "file": "git2/config.h", + "line": 452, + "lineto": 452, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer in which to store the string" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + } + ], + "argline": "git_buf *out, const git_config *cfg, const char *name", + "sig": "git_buf *::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the value of a string config variable.

\n", + "comments": "

The value of the config will be copied into the buffer.

\n\n

All config files will be looked into, in the order of their defined level. A higher level means a higher priority. The first occurrence of the variable will be returned here.

\n", + "group": "config" + }, + "git_config_get_multivar_foreach": { + "type": "function", + "file": "git2/config.h", + "line": 471, + "lineto": 471, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to be called on each value of the variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "opaque pointer to pass to the callback" + } + ], + "argline": "const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::const char *::const char *::git_config_foreach_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get each value of a multivar in a foreach callback

\n", + "comments": "

The callback will be called on each variable found

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_multivar_iterator_new": { + "type": "function", + "file": "git2/config.h", + "line": 487, + "lineto": 487, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to filter which variables we're\n interested in. Use NULL to indicate all" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp", + "sig": "git_config_iterator **::const git_config *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get each value of a multivar

\n", + "comments": "

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_next": { + "type": "function", + "file": "git2/config.h", + "line": 499, + "lineto": 499, + "args": [ + { + "name": "entry", + "type": "git_config_entry **", + "comment": "pointer to store the entry" + }, + { + "name": "iter", + "type": "git_config_iterator *", + "comment": "the iterator" + } + ], + "argline": "git_config_entry **entry, git_config_iterator *iter", + "sig": "git_config_entry **::git_config_iterator *", + "return": { + "type": "int", + "comment": " 0 or an error code. GIT_ITEROVER if the iteration has completed" + }, + "description": "

Return the current entry and advance the iterator

\n", + "comments": "

The pointers returned by this function are valid until the next call to git_config_next or until the iterator is freed.

\n", + "group": "config" + }, + "git_config_iterator_free": { + "type": "function", + "file": "git2/config.h", + "line": 506, + "lineto": 506, + "args": [ + { + "name": "iter", + "type": "git_config_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_config_iterator *iter", + "sig": "git_config_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free a config iterator

\n", + "comments": "", + "group": "config" + }, + "git_config_set_int32": { + "type": "function", + "file": "git2/config.h", + "line": 517, + "lineto": 517, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "int32_t", + "comment": "Integer value for the variable" + } + ], + "argline": "git_config *cfg, const char *name, int32_t value", + "sig": "git_config *::const char *::int32_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of an integer config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_int64": { + "type": "function", + "file": "git2/config.h", + "line": 528, + "lineto": 528, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "int64_t", + "comment": "Long integer value for the variable" + } + ], + "argline": "git_config *cfg, const char *name, int64_t value", + "sig": "git_config *::const char *::int64_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of a long integer config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_bool": { + "type": "function", + "file": "git2/config.h", + "line": 539, + "lineto": 539, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { "name": "value", "type": "int", "comment": "the value to store" } + ], + "argline": "git_config *cfg, const char *name, int value", + "sig": "git_config *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of a boolean config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_set_string": { + "type": "function", + "file": "git2/config.h", + "line": 553, + "lineto": 553, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "value", + "type": "const char *", + "comment": "the string to store." + } + ], + "argline": "git_config *cfg, const char *name, const char *value", + "sig": "git_config *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the value of a string config variable in the config file\n with the highest level (usually the local one).

\n", + "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", + "group": "config", + "examples": { + "config.c": ["ex/v1.8.4/config.html#git_config_set_string-5"] + } + }, + "git_config_set_multivar": { + "type": "function", + "file": "git2/config.h", + "line": 566, + "lineto": 566, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variable" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "a regular expression to indicate which values to replace" + }, + { "name": "value", "type": "const char *", "comment": "the new value." } + ], + "argline": "git_config *cfg, const char *name, const char *regexp, const char *value", + "sig": "git_config *::const char *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Set a multivar in the local config file.

\n", + "comments": "

The regular expression is applied case-sensitively on the value.

\n", + "group": "config" + }, + "git_config_delete_entry": { + "type": "function", + "file": "git2/config.h", + "line": 576, + "lineto": 576, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable to delete" + } + ], + "argline": "git_config *cfg, const char *name", + "sig": "git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Delete a config variable from the config file\n with the highest level (usually the local one).

\n", + "comments": "", + "group": "config" + }, + "git_config_delete_multivar": { + "type": "function", + "file": "git2/config.h", + "line": 589, + "lineto": 589, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "where to look for the variables" + }, + { + "name": "name", + "type": "const char *", + "comment": "the variable's name" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "a regular expression to indicate which values to delete" + } + ], + "argline": "git_config *cfg, const char *name, const char *regexp", + "sig": "git_config *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Deletes one or several entries from a multivar in the local config file.

\n", + "comments": "

The regular expression is applied case-sensitively on the value.

\n", + "group": "config" + }, + "git_config_foreach": { + "type": "function", + "file": "git2/config.h", + "line": 607, + "lineto": 610, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "const git_config *cfg, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform an operation on each config variable.

\n", + "comments": "

The callback receives the normalized name and value of each variable in the config backend, and the data pointer passed to this function. If the callback returns a non-zero value, the function stops iterating and returns that value to the caller.

\n\n

The pointers passed to the callback are only valid as long as the iteration is ongoing.

\n", + "group": "config" + }, + "git_config_iterator_new": { + "type": "function", + "file": "git2/config.h", + "line": 622, + "lineto": 622, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg", + "sig": "git_config_iterator **::const git_config *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Iterate over all the config variables

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n", + "group": "config" + }, + "git_config_iterator_glob_new": { + "type": "function", + "file": "git2/config.h", + "line": 639, + "lineto": 639, + "args": [ + { + "name": "out", + "type": "git_config_iterator **", + "comment": "pointer to store the iterator" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to ge the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match the names" + } + ], + "argline": "git_config_iterator **out, const git_config *cfg, const char *regexp", + "sig": "git_config_iterator **::const git_config *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Iterate over all the config variables whose name matches a pattern

\n", + "comments": "

Use git_config_next to advance the iteration and git_config_iterator_free when done.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_foreach_match": { + "type": "function", + "file": "git2/config.h", + "line": 661, + "lineto": 665, + "args": [ + { + "name": "cfg", + "type": "const git_config *", + "comment": "where to get the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match against config names" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "const git_config *cfg, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "const git_config *::const char *::git_config_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 or the return value of the callback which didn't return 0" + }, + "description": "

Perform an operation on each config variable matching a regular expression.

\n", + "comments": "

This behaves like git_config_foreach with an additional filter of a regular expression that filters which config keys are passed to the callback.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the case-insensitive parts are lower-case.

\n", + "group": "config" + }, + "git_config_get_mapped": { + "type": "function", + "file": "git2/config.h", + "line": 701, + "lineto": 706, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the mapping" + }, + { + "name": "cfg", + "type": "const git_config *", + "comment": "config file to get the variables from" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the config variable to lookup" + }, + { + "name": "maps", + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" + }, + { + "name": "map_n", + "type": "size_t", + "comment": "number of mapping objects in `maps`" + } + ], + "argline": "int *out, const git_config *cfg, const char *name, const git_configmap *maps, size_t map_n", + "sig": "int *::const git_config *::const char *::const git_configmap *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Query the value of a config variable and return it mapped to\n an integer constant.

\n", + "comments": "

This is a helper method to easily map different possible values to a variable to integer constants that easily identify them.

\n\n

A mapping array looks as follows:

\n\n
git_configmap autocrlf_mapping[] = {        {GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},        {GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},      {GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},        {GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};\n
\n\n

On any "false" value for the variable (e.g. "false", "FALSE", "no"), the mapping will store GIT_AUTO_CRLF_FALSE in the out parameter.

\n\n

The same thing applies for any "true" value such as "true", "yes" or "1", storing the GIT_AUTO_CRLF_TRUE variable.

\n\n

Otherwise, if the value matches the string "input" (with case insensitive comparison), the given constant will be stored in out, and likewise for "default".

\n\n

If not a single match can be made to store in out, an error code will be returned.

\n", + "group": "config" + }, + "git_config_lookup_map_value": { + "type": "function", + "file": "git2/config.h", + "line": 717, + "lineto": 721, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the parsing" + }, + { + "name": "maps", + "type": "const git_configmap *", + "comment": "array of `git_configmap` objects specifying the possible mappings" + }, + { + "name": "map_n", + "type": "size_t", + "comment": "number of mapping objects in `maps`" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int *out, const git_configmap *maps, size_t map_n, const char *value", + "sig": "int *::const git_configmap *::size_t::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Maps a string value to an integer constant

\n", + "comments": "", + "group": "config" + }, + "git_config_parse_bool": { + "type": "function", + "file": "git2/config.h", + "line": 734, + "lineto": 734, + "args": [ + { + "name": "out", + "type": "int *", + "comment": "place to store the result of the parsing" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int *out, const char *value", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as a bool.

\n", + "comments": "

Valid values for true are: 'true', 'yes', 'on', 1 or any number different from 0 Valid values for false are: 'false', 'no', 'off', 0

\n", + "group": "config" + }, + "git_config_parse_int32": { + "type": "function", + "file": "git2/config.h", + "line": 747, + "lineto": 747, + "args": [ + { + "name": "out", + "type": "int32_t *", + "comment": "place to store the result of the parsing" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int32_t *out, const char *value", + "sig": "int32_t *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as an int32.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "group": "config" + }, + "git_config_parse_int64": { + "type": "function", + "file": "git2/config.h", + "line": 760, + "lineto": 760, + "args": [ + { + "name": "out", + "type": "int64_t *", + "comment": "place to store the result of the parsing" + }, + { "name": "value", "type": "const char *", "comment": "value to parse" } + ], + "argline": "int64_t *out, const char *value", + "sig": "int64_t *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as an int64.

\n", + "comments": "

An optional value suffix of 'k', 'm', or 'g' will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output.

\n", + "group": "config" + }, + "git_config_parse_path": { + "type": "function", + "file": "git2/config.h", + "line": 776, + "lineto": 776, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "placae to store the result of parsing" + }, + { + "name": "value", + "type": "const char *", + "comment": "the path to evaluate" + } + ], + "argline": "git_buf *out, const char *value", + "sig": "git_buf *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Parse a string value as a path.

\n", + "comments": "

A leading '~' will be expanded to the global search path (which defaults to the user's home directory but can be overridden via git_libgit2_opts().

\n\n

If the value does not begin with a tilde, the input will be returned.

\n", + "group": "config" + }, + "git_config_backend_foreach_match": { + "type": "function", + "file": "git2/config.h", + "line": 795, + "lineto": 799, + "args": [ + { + "name": "backend", + "type": "git_config_backend *", + "comment": "where to get the variables from" + }, + { + "name": "regexp", + "type": "const char *", + "comment": "regular expression to match against config names (can be NULL)" + }, + { + "name": "callback", + "type": "git_config_foreach_cb", + "comment": "the function to call on each variable" + }, + { + "name": "payload", + "type": "void *", + "comment": "the data to pass to the callback" + } + ], + "argline": "git_config_backend *backend, const char *regexp, git_config_foreach_cb callback, void *payload", + "sig": "git_config_backend *::const char *::git_config_foreach_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Perform an operation on each config variable in a given config backend,\n matching a regular expression.

\n", + "comments": "

This behaves like git_config_foreach_match except that only config entries from the given backend entry are enumerated.

\n\n

The regular expression is applied case-sensitively on the normalized form of the variable name: the section and variable parts are lower-cased. The subsection is left unchanged.

\n", + "group": "config" + }, + "git_config_lock": { + "type": "function", + "file": "git2/config.h", + "line": 818, + "lineto": 818, + "args": [ + { + "name": "tx", + "type": "git_transaction **", + "comment": "the resulting transaction, use this to commit or undo the\n changes" + }, + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration in which to lock" + } + ], + "argline": "git_transaction **tx, git_config *cfg", + "sig": "git_transaction **::git_config *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lock the backend with the highest priority

\n", + "comments": "

Locking disallows anybody else from writing to that backend. Any updates made after locking will not be visible to a reader until the file is unlocked.

\n\n

You can apply the changes by calling git_transaction_commit() before freeing the transaction. Either of these actions will unlock the config.

\n", + "group": "config" + }, + "git_credential_free": { + "type": "function", + "file": "git2/credential.h", + "line": 146, + "lineto": 146, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "the object to free" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { "type": "void", "comment": null }, + "description": "

Free a credential.

\n", + "comments": "

This is only necessary if you own the object; that is, if you are a transport.

\n", + "group": "credential" + }, + "git_credential_has_username": { + "type": "function", + "file": "git2/credential.h", + "line": 154, + "lineto": 154, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "object to check" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { + "type": "int", + "comment": " 1 if the credential object has non-NULL username, 0 otherwise" + }, + "description": "

Check whether a credential object contains username information.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_get_username": { + "type": "function", + "file": "git2/credential.h", + "line": 162, + "lineto": 162, + "args": [ + { + "name": "cred", + "type": "git_credential *", + "comment": "object to check" + } + ], + "argline": "git_credential *cred", + "sig": "git_credential *", + "return": { + "type": "const char *", + "comment": " the credential username, or NULL if not applicable" + }, + "description": "

Return the username associated with a credential object.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_userpass_plaintext_new": { + "type": "function", + "file": "git2/credential.h", + "line": 173, + "lineto": 176, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "The username of the credential." + }, + { + "name": "password", + "type": "const char *", + "comment": "The password of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *password", + "sig": "git_credential **::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new plain-text username and password credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_default_new": { + "type": "function", + "file": "git2/credential.h", + "line": 185, + "lineto": 185, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + } + ], + "argline": "git_credential **out", + "sig": "git_credential **", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a "default" credential usable for Negotiate mechanisms like NTLM\n or Kerberos authentication.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_username_new": { + "type": "function", + "file": "git2/credential.h", + "line": 197, + "lineto": 197, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "The username to authenticate with" + } + ], + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a credential to specify a username.

\n", + "comments": "

This is used with ssh authentication to query for the username if none is specified in the url.

\n", + "group": "credential" + }, + "git_credential_ssh_key_new": { + "type": "function", + "file": "git2/credential.h", + "line": 210, + "lineto": 215, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The path to the public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The path to the private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new passphrase-protected ssh key credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_key_memory_new": { + "type": "function", + "file": "git2/credential.h", + "line": 227, + "lineto": 232, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate." + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The public key of the credential." + }, + { + "name": "privatekey", + "type": "const char *", + "comment": "The private key of the credential." + }, + { + "name": "passphrase", + "type": "const char *", + "comment": "The passphrase of the credential." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, const char *privatekey, const char *passphrase", + "sig": "git_credential **::const char *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object reading the keys from memory.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_interactive_new": { + "type": "function", + "file": "git2/credential.h", + "line": 263, + "lineto": 267, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "Username to use to authenticate." + }, + { + "name": "prompt_callback", + "type": "git_credential_ssh_interactive_cb", + "comment": "The callback method used for prompts." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_credential **out, const char *username, git_credential_ssh_interactive_cb prompt_callback, void *payload", + "sig": "git_credential **::const char *::git_credential_ssh_interactive_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure." + }, + "description": "

Create a new ssh keyboard-interactive based credential object.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_key_from_agent": { + "type": "function", + "file": "git2/credential.h", + "line": 277, + "lineto": 279, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + } + ], + "argline": "git_credential **out, const char *username", + "sig": "git_credential **::const char *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create a new ssh key credential object used for querying an ssh-agent.\n The supplied credential parameter will be internally duplicated.

\n", + "comments": "", + "group": "credential" + }, + "git_credential_ssh_custom_new": { + "type": "function", + "file": "git2/credential.h", + "line": 305, + "lineto": 311, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "username", + "type": "const char *", + "comment": "username to use to authenticate" + }, + { + "name": "publickey", + "type": "const char *", + "comment": "The bytes of the public key." + }, + { + "name": "publickey_len", + "type": "size_t", + "comment": "The length of the public key in bytes." + }, + { + "name": "sign_callback", + "type": "git_credential_sign_cb", + "comment": "The callback method to sign the data during the challenge." + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback." + } + ], + "argline": "git_credential **out, const char *username, const char *publickey, size_t publickey_len, git_credential_sign_cb sign_callback, void *payload", + "sig": "git_credential **::const char *::const char *::size_t::git_credential_sign_cb::void *", + "return": { + "type": "int", + "comment": " 0 for success or an error code for failure" + }, + "description": "

Create an ssh key credential with a custom signing function.

\n", + "comments": "

This lets you use your own function to sign the challenge.

\n\n

This function and its credential type is provided for completeness and wraps libssh2_userauth_publickey(), which is undocumented.

\n\n

The supplied credential parameter will be internally duplicated.

\n", + "group": "credential" + }, + "git_credential_userpass": { + "type": "function", + "file": "git2/credential_helpers.h", + "line": 44, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "url", + "type": "const char *", + "comment": "The resource for which we are demanding a credential." + }, + { + "name": "user_from_url", + "type": "const char *", + "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." + }, + { + "name": "allowed_types", + "type": "unsigned int", + "comment": "A bitmask stating which credential types are OK to return." + }, + { + "name": "payload", + "type": "void *", + "comment": "The payload provided when specifying this callback. (This is\n interpreted as a `git_credential_userpass_payload*`.)" + } + ], + "argline": "git_credential **out, const char *url, const char *user_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Stock callback usable as a git_credential_acquire_cb. This calls\n git_cred_userpass_plaintext_new unless the protocol has not specified\n GIT_CREDENTIAL_USERPASS_PLAINTEXT as an allowed type.

\n", + "comments": "", + "group": "credential" + }, + "git_blob_filtered_content": { + "type": "function", + "file": "git2/deprecated.h", + "line": 115, + "lineto": 119, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "blob", "type": "git_blob *", "comment": null }, + { "name": "as_path", "type": "const char *", "comment": null }, + { "name": "check_for_binary_data", "type": "int", "comment": null } + ], + "argline": "git_buf *out, git_blob *blob, const char *as_path, int check_for_binary_data", + "sig": "git_buf *::git_blob *::const char *::int", + "return": { "type": "int", "comment": null }, + "description": "

Deprecated in favor of git_blob_filter.

\n", + "comments": "", + "group": "blob" + }, + "git_filter_list_stream_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 139, + "lineto": 142, + "args": [ + { "name": "filters", "type": "git_filter_list *", "comment": null }, + { "name": "data", "type": "git_buf *", "comment": null }, + { "name": "target", "type": "git_writestream *", "comment": null } + ], + "argline": "git_filter_list *filters, git_buf *data, git_writestream *target", + "sig": "git_filter_list *::git_buf *::git_writestream *", + "return": { "type": "int", "comment": null }, + "description": "

Deprecated in favor of git_filter_list_stream_buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_data": { + "type": "function", + "file": "git2/deprecated.h", + "line": 149, + "lineto": 152, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "filters", "type": "git_filter_list *", "comment": null }, + { "name": "in", "type": "git_buf *", "comment": null } + ], + "argline": "git_buf *out, git_filter_list *filters, git_buf *in", + "sig": "git_buf *::git_filter_list *::git_buf *", + "return": { "type": "int", "comment": null }, + "description": "

Deprecated in favor of git_filter_list_apply_to_buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_treebuilder_write_with_buffer": { + "type": "function", + "file": "git2/deprecated.h", + "line": 178, + "lineto": 179, + "args": [ + { "name": "oid", "type": "git_oid *", "comment": null }, + { "name": "bld", "type": "git_treebuilder *", "comment": null }, + { "name": "tree", "type": "git_buf *", "comment": null } + ], + "argline": "git_oid *oid, git_treebuilder *bld, git_buf *tree", + "sig": "git_oid *::git_treebuilder *::git_buf *", + "return": { "type": "int", "comment": null }, + "description": "

Write the contents of the tree builder as a tree object.\n This is an alias of git_treebuilder_write and is preserved\n for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "treebuilder" + }, + "git_buf_grow": { + "type": "function", + "file": "git2/deprecated.h", + "line": 220, + "lineto": 220, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to be resized; may or may not be allocated yet" + }, + { + "name": "target_size", + "type": "size_t", + "comment": "The desired available size" + } + ], + "argline": "git_buf *buffer, size_t target_size", + "sig": "git_buf *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, -1 on allocation failure" + }, + "description": "

Resize the buffer allocation to make more space.

\n", + "comments": "

This will attempt to grow the buffer to accommodate the target size.

\n\n

If the buffer refers to memory that was not allocated by libgit2 (i.e. the asize field is zero), then ptr will be replaced with a newly allocated block of data. Be careful so that memory allocated by the caller is not lost. As a special variant, if you pass target_size as 0 and the memory is not allocated by libgit2, this will allocate a new buffer of size size and copy the external data into it.

\n\n

Currently, this will never shrink a buffer, only expand it.

\n\n

If the allocation fails, this will return an error and the buffer will be marked as invalid for future operations, invaliding the contents.

\n", + "group": "buf" + }, + "git_buf_set": { + "type": "function", + "file": "git2/deprecated.h", + "line": 230, + "lineto": 231, + "args": [ + { + "name": "buffer", + "type": "git_buf *", + "comment": "The buffer to set" + }, + { + "name": "data", + "type": "const void *", + "comment": "The data to copy into the buffer" + }, + { + "name": "datalen", + "type": "size_t", + "comment": "The length of the data to copy into the buffer" + } + ], + "argline": "git_buf *buffer, const void *data, size_t datalen", + "sig": "git_buf *::const void *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, -1 on allocation failure" + }, + "description": "

Set buffer to a copy of some raw data.

\n", + "comments": "", + "group": "buf" + }, + "git_buf_is_binary": { + "type": "function", + "file": "git2/deprecated.h", + "line": 239, + "lineto": 239, + "args": [ + { + "name": "buf", + "type": "const git_buf *", + "comment": "Buffer to check" + } + ], + "argline": "const git_buf *buf", + "sig": "const git_buf *", + "return": { + "type": "int", + "comment": " 1 if buffer looks like non-text data" + }, + "description": "

Check quickly if buffer looks like it contains binary data

\n", + "comments": "", + "group": "buf" + }, + "git_buf_contains_nul": { + "type": "function", + "file": "git2/deprecated.h", + "line": 247, + "lineto": 247, + "args": [ + { + "name": "buf", + "type": "const git_buf *", + "comment": "Buffer to check" + } + ], + "argline": "const git_buf *buf", + "sig": "const git_buf *", + "return": { + "type": "int", + "comment": " 1 if buffer contains a NUL byte" + }, + "description": "

Check quickly if buffer contains a NUL byte

\n", + "comments": "", + "group": "buf" + }, + "git_buf_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 259, + "lineto": 259, + "args": [{ "name": "buffer", "type": "git_buf *", "comment": null }], + "argline": "git_buf *buffer", + "sig": "git_buf *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_buf. This is an alias of\n git_buf_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "buf" + }, + "git_diff_format_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 357, + "lineto": 360, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "diff", "type": "git_diff *", "comment": null }, + { + "name": "opts", + "type": "const git_diff_format_email_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_diff *diff, const git_diff_format_email_options *opts", + "sig": "git_buf *::git_diff *::const git_diff_format_email_options *", + "return": { "type": "int", "comment": null }, + "description": "

Create an e-mail ready patch from a diff.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_commit_as_email": { + "type": "function", + "file": "git2/deprecated.h", + "line": 368, + "lineto": 375, + "args": [ + { "name": "out", "type": "git_buf *", "comment": null }, + { "name": "repo", "type": "git_repository *", "comment": null }, + { "name": "commit", "type": "git_commit *", "comment": null }, + { "name": "patch_no", "type": "size_t", "comment": null }, + { "name": "total_patches", "type": "size_t", "comment": null }, + { "name": "flags", "type": "uint32_t", "comment": null }, + { + "name": "diff_opts", + "type": "const git_diff_options *", + "comment": null + } + ], + "argline": "git_buf *out, git_repository *repo, git_commit *commit, size_t patch_no, size_t total_patches, uint32_t flags, const git_diff_options *diff_opts", + "sig": "git_buf *::git_repository *::git_commit *::size_t::size_t::uint32_t::const git_diff_options *", + "return": { "type": "int", "comment": null }, + "description": "

Create an e-mail ready patch for a commit.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_format_email_options_init": { + "type": "function", + "file": "git2/deprecated.h", + "line": 387, + "lineto": 389, + "args": [ + { + "name": "opts", + "type": "git_diff_format_email_options *", + "comment": "The `git_blame_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_format_email_options *opts, unsigned int version", + "sig": "git_diff_format_email_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_format_email_options structure

\n", + "comments": "

Initializes a git_diff_format_email_options with default values. Equivalent to creating an instance with GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT.

\n", + "group": "diff" + }, + "giterr_last": { + "type": "function", + "file": "git2/deprecated.h", + "line": 452, + "lineto": 452, + "args": [], + "argline": "", + "sig": "", + "return": { "type": "const git_error *", "comment": null }, + "description": "

Return the last git_error object that was generated for the\n current thread. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_clear": { + "type": "function", + "file": "git2/deprecated.h", + "line": 464, + "lineto": 464, + "args": [], + "argline": "", + "sig": "", + "return": { "type": "void", "comment": null }, + "description": "

Clear the last error. This is an alias of git_error_last and is\n preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_set_str": { + "type": "function", + "file": "git2/deprecated.h", + "line": 476, + "lineto": 476, + "args": [ + { "name": "error_class", "type": "int", "comment": null }, + { "name": "string", "type": "const char *", "comment": null } + ], + "argline": "int error_class, const char *string", + "sig": "int::const char *", + "return": { "type": "void", "comment": null }, + "description": "

Sets the error message to the given string. This is an alias of\n git_error_set_str and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "giterr_set_oom": { + "type": "function", + "file": "git2/deprecated.h", + "line": 488, + "lineto": 488, + "args": [], + "argline": "", + "sig": "", + "return": { "type": "void", "comment": null }, + "description": "

Indicates that an out-of-memory situation occurred. This is an alias\n of git_error_set_oom and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "giterr" + }, + "git_object__size": { + "type": "function", + "file": "git2/deprecated.h", + "line": 578, + "lineto": 578, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to get its size" + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { "type": "size_t", "comment": " size in bytes of the object" }, + "description": "

Get the size in bytes for the structure which\n acts as an in-memory representation of any given\n object type.

\n", + "comments": "

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.

\n", + "group": "object" + }, + "git_remote_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 599, + "lineto": 599, + "args": [ + { + "name": "remote_name", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *remote_name", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the remote name is well-formed.

\n", + "comments": "", + "group": "remote" + }, + "git_reference_is_valid_name": { + "type": "function", + "file": "git2/deprecated.h", + "line": 643, + "lineto": 643, + "args": [ + { + "name": "refname", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "const char *refname", + "sig": "const char *", + "return": { + "type": "int", + "comment": " 1 if the reference name is acceptable; 0 if it isn't" + }, + "description": "

Ensure the reference name is well-formed.

\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "group": "reference" + }, + "git_oidarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 810, + "lineto": 810, + "args": [{ "name": "array", "type": "git_oidarray *", "comment": null }], + "argline": "git_oidarray *array", + "sig": "git_oidarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_oidarray. This is an alias of\n git_oidarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "oidarray" + }, + "git_strarray_copy": { + "type": "function", + "file": "git2/deprecated.h", + "line": 879, + "lineto": 879, + "args": [ + { "name": "tgt", "type": "git_strarray *", "comment": "target" }, + { "name": "src", "type": "const git_strarray *", "comment": "source" } + ], + "argline": "git_strarray *tgt, const git_strarray *src", + "sig": "git_strarray *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n 0 on allocation failure" + }, + "description": "

Copy a string array object from source to target.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "strarray" + }, + "git_strarray_free": { + "type": "function", + "file": "git2/deprecated.h", + "line": 891, + "lineto": 891, + "args": [{ "name": "array", "type": "git_strarray *", "comment": null }], + "argline": "git_strarray *array", + "sig": "git_strarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory referred to by the git_strarray. This is an alias of\n git_strarray_dispose and is preserved for backward compatibility.

\n", + "comments": "

This function is deprecated, but there is no plan to remove this function at this time.

\n", + "group": "strarray" + }, + "git_blame_init_options": { + "type": "function", + "file": "git2/deprecated.h", + "line": 905, + "lineto": 905, + "args": [ + { "name": "opts", "type": "git_blame_options *", "comment": null }, + { "name": "version", "type": "unsigned int", "comment": null } + ], + "argline": "git_blame_options *opts, unsigned int version", + "sig": "git_blame_options *::unsigned int", + "return": { "type": "int", "comment": null }, + "description": "", + "comments": "

These functions are retained for backward compatibility. The newer versions of these functions should be preferred in all new code.

\n\n

There is no plan to remove these backward compatibility functions at this time.

\n\n

@{

\n", + "group": "blame" + }, + "git_describe_options_init": { + "type": "function", + "file": "git2/describe.h", + "line": 82, + "lineto": 82, + "args": [ + { + "name": "opts", + "type": "git_describe_options *", + "comment": "The `git_describe_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_options *opts, unsigned int version", + "sig": "git_describe_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_options structure

\n", + "comments": "

Initializes a git_describe_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.8.4/describe.html#git_describe_options_init-1"] + } + }, + "git_describe_format_options_init": { + "type": "function", + "file": "git2/describe.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "opts", + "type": "git_describe_format_options *", + "comment": "The `git_describe_format_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DESCRIBE_FORMAT_OPTIONS_VERSION`." + } + ], + "argline": "git_describe_format_options *opts, unsigned int version", + "sig": "git_describe_format_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_describe_format_options structure

\n", + "comments": "

Initializes a git_describe_format_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_FORMAT_OPTIONS_INIT.

\n", + "group": "describe", + "examples": { + "describe.c": [ + "ex/v1.8.4/describe.html#git_describe_format_options_init-2" + ] + } + }, + "git_describe_commit": { + "type": "function", + "file": "git2/describe.h", + "line": 147, + "lineto": 150, + "args": [ + { + "name": "result", + "type": "git_describe_result **", + "comment": "pointer to store the result. You must free this once\n you're done with it." + }, + { + "name": "committish", + "type": "git_object *", + "comment": "a committish to describe" + }, + { + "name": "opts", + "type": "git_describe_options *", + "comment": "the lookup options (or NULL for defaults)" + } + ], + "argline": "git_describe_result **result, git_object *committish, git_describe_options *opts", + "sig": "git_describe_result **::git_object *::git_describe_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Describe a commit

\n", + "comments": "

Perform the describe operation on the given committish object.

\n", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.8.4/describe.html#git_describe_commit-3"] + } + }, + "git_describe_workdir": { + "type": "function", + "file": "git2/describe.h", + "line": 165, + "lineto": 168, + "args": [ + { + "name": "out", + "type": "git_describe_result **", + "comment": "pointer to store the result. You must free this once\n you're done with it." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the describe" + }, + { + "name": "opts", + "type": "git_describe_options *", + "comment": "the lookup options (or NULL for defaults)" + } + ], + "argline": "git_describe_result **out, git_repository *repo, git_describe_options *opts", + "sig": "git_describe_result **::git_repository *::git_describe_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Describe a commit

\n", + "comments": "

Perform the describe operation on the current commit and the worktree. After performing describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.8.4/describe.html#git_describe_workdir-4"] + } + }, + "git_describe_format": { + "type": "function", + "file": "git2/describe.h", + "line": 179, + "lineto": 182, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The buffer to store the result" + }, + { + "name": "result", + "type": "const git_describe_result *", + "comment": "the result from `git_describe_commit()` or\n `git_describe_workdir()`." + }, + { + "name": "opts", + "type": "const git_describe_format_options *", + "comment": "the formatting options (or NULL for defaults)" + } + ], + "argline": "git_buf *out, const git_describe_result *result, const git_describe_format_options *opts", + "sig": "git_buf *::const git_describe_result *::const git_describe_format_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Print the describe result to a buffer

\n", + "comments": "", + "group": "describe", + "examples": { + "describe.c": ["ex/v1.8.4/describe.html#git_describe_format-5"] + } + }, + "git_describe_result_free": { + "type": "function", + "file": "git2/describe.h", + "line": 189, + "lineto": 189, + "args": [ + { + "name": "result", + "type": "git_describe_result *", + "comment": "The result to free." + } + ], + "argline": "git_describe_result *result", + "sig": "git_describe_result *", + "return": { "type": "void", "comment": null }, + "description": "

Free the describe result.

\n", + "comments": "", + "group": "describe" + }, + "git_diff_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 485, + "lineto": 487, + "args": [ + { + "name": "opts", + "type": "git_diff_options *", + "comment": "The `git_diff_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_options *opts, unsigned int version", + "sig": "git_diff_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_options structure

\n", + "comments": "

Initializes a git_diff_options with default values. Equivalent to creating an instance with GIT_DIFF_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_find_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 818, + "lineto": 820, + "args": [ + { + "name": "opts", + "type": "git_diff_find_options *", + "comment": "The `git_diff_find_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_FIND_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_find_options *opts, unsigned int version", + "sig": "git_diff_find_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_find_options structure

\n", + "comments": "

Initializes a git_diff_find_options with default values. Equivalent to creating an instance with GIT_DIFF_FIND_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_free": { + "type": "function", + "file": "git2/diff.h", + "line": 834, + "lineto": 834, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "The previously created diff; cannot be used after free." + } + ], + "argline": "git_diff *diff", + "sig": "git_diff *", + "return": { "type": "void", "comment": null }, + "description": "

Deallocate a diff.

\n", + "comments": "", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.8.4/diff.html#git_diff_free-3"], + "log.c": [ + "ex/v1.8.4/log.html#git_diff_free-25", + "ex/v1.8.4/log.html#git_diff_free-26" + ] + } + }, + "git_diff_tree_to_tree": { + "type": "function", + "file": "git2/diff.h", + "line": 853, + "lineto": 858, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the trees." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "new_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff to, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_tree *new_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::git_tree *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff with the difference between two tree objects.

\n", + "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_tree-4"], + "log.c": [ + "ex/v1.8.4/log.html#git_diff_tree_to_tree-27", + "ex/v1.8.4/log.html#git_diff_tree_to_tree-28" + ] + } + }, + "git_diff_tree_to_index": { + "type": "function", + "file": "git2/diff.h", + "line": 880, + "lineto": 885, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree and index." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to diff with; repo index used if NULL." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, git_index *index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::git_index *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between a tree and repository index.

\n", + "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "group": "diff", + "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_index-5"] } + }, + "git_diff_index_to_workdir": { + "type": "function", + "file": "git2/diff.h", + "line": 908, + "lineto": 912, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository." + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to diff from; repo index used if NULL." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_index *index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_index *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between the repository index and the workdir directory.

\n", + "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.8.4/diff.html#git_diff_index_to_workdir-6"] + } + }, + "git_diff_tree_to_workdir": { + "type": "function", + "file": "git2/diff.h", + "line": 938, + "lineto": 942, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between a tree and the working directory.

\n", + "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_workdir-7"] + } + }, + "git_diff_tree_to_workdir_with_index": { + "type": "function", + "file": "git2/diff.h", + "line": 958, + "lineto": 962, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the tree." + }, + { + "name": "old_tree", + "type": "git_tree *", + "comment": "A git_tree object to diff from, or NULL for empty tree." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_tree *old_tree, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_tree *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff between a tree and the working directory using index data\n to account for staged deletes, tracked files, etc.

\n", + "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_workdir_with_index-8"] + } + }, + "git_diff_index_to_index": { + "type": "function", + "file": "git2/diff.h", + "line": 977, + "lineto": 982, + "args": [ + { + "name": "diff", + "type": "git_diff **", + "comment": "Output pointer to a git_diff pointer to be allocated." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing the indexes." + }, + { + "name": "old_index", + "type": "git_index *", + "comment": "A git_index object to diff from." + }, + { + "name": "new_index", + "type": "git_index *", + "comment": "A git_index object to diff to." + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Structure with options to influence diff or NULL for defaults." + } + ], + "argline": "git_diff **diff, git_repository *repo, git_index *old_index, git_index *new_index, const git_diff_options *opts", + "sig": "git_diff **::git_repository *::git_index *::git_index *::const git_diff_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a diff with the difference between two index objects.

\n", + "comments": "

The first index will be used for the "old_file" side of the delta and the second index will be used for the "new_file" side of the delta.

\n", + "group": "diff" + }, + "git_diff_merge": { + "type": "function", + "file": "git2/diff.h", + "line": 998, + "lineto": 1000, + "args": [ + { + "name": "onto", + "type": "git_diff *", + "comment": "Diff to merge into." + }, + { + "name": "from", + "type": "const git_diff *", + "comment": "Diff to merge." + } + ], + "argline": "git_diff *onto, const git_diff *from", + "sig": "git_diff *::const git_diff *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Merge one diff into another.

\n", + "comments": "

This merges items from the "from" list into the "onto" list. The resulting diff will have all items that appear in either list. If an item appears in both lists, then it will be "merged" to appear as if the old version was from the "onto" list and the new version is from the "from" list (with the exception that if the item has a pending DELETE in the middle, then it will show as deleted).

\n", + "group": "diff" + }, + "git_diff_find_similar": { + "type": "function", + "file": "git2/diff.h", + "line": 1014, + "lineto": 1016, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "diff to run detection algorithms on" + }, + { + "name": "options", + "type": "const git_diff_find_options *", + "comment": "Control how detection should be run, NULL for defaults" + } + ], + "argline": "git_diff *diff, const git_diff_find_options *options", + "sig": "git_diff *::const git_diff_find_options *", + "return": { "type": "int", "comment": " 0 on success, -1 on failure" }, + "description": "

Transform a diff marking file renames, copies, etc.

\n", + "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", + "group": "diff", + "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_find_similar-9"] } + }, + "git_diff_num_deltas": { + "type": "function", + "file": "git2/diff.h", + "line": 1034, + "lineto": 1034, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "A git_diff generated by one of the above functions" + } + ], + "argline": "const git_diff *diff", + "sig": "const git_diff *", + "return": { + "type": "size_t", + "comment": " Count of number of deltas in the list" + }, + "description": "

Query how many diff records are there in a diff.

\n", + "comments": "", + "group": "diff", + "examples": { "log.c": ["ex/v1.8.4/log.html#git_diff_num_deltas-29"] } + }, + "git_diff_num_deltas_of_type": { + "type": "function", + "file": "git2/diff.h", + "line": 1047, + "lineto": 1048, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "A git_diff generated by one of the above functions" + }, + { + "name": "type", + "type": "git_delta_t", + "comment": "A git_delta_t value to filter the count" + } + ], + "argline": "const git_diff *diff, git_delta_t type", + "sig": "const git_diff *::git_delta_t", + "return": { + "type": "size_t", + "comment": " Count of number of deltas matching delta_t type" + }, + "description": "

Query how many diff deltas are there in a diff filtered by type.

\n", + "comments": "

This works just like git_diff_num_deltas() with an extra parameter that is a git_delta_t and returns just the count of how many deltas match that particular type.

\n", + "group": "diff" + }, + "git_diff_get_delta": { + "type": "function", + "file": "git2/diff.h", + "line": 1067, + "lineto": 1068, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "Diff list object" + }, + { "name": "idx", "type": "size_t", "comment": "Index into diff list" } + ], + "argline": "const git_diff *diff, size_t idx", + "sig": "const git_diff *::size_t", + "return": { + "type": "const git_diff_delta *", + "comment": " Pointer to git_diff_delta (or NULL if `idx` out of range)" + }, + "description": "

Return the diff delta for an entry in the diff list.

\n", + "comments": "

The git_diff_delta pointer points to internal data and you do not have to release it when you are done with it. It will go away when the * git_diff (or any associated git_patch) goes away.

\n\n

Note that the flags on the delta related to whether it has binary content or not may not be set if there are no attributes set for the file and there has been no reason to load the file data at this point. For now, if you need those flags to be up to date, your only option is to either use git_diff_foreach or create a git_patch.

\n", + "group": "diff" + }, + "git_diff_is_sorted_icase": { + "type": "function", + "file": "git2/diff.h", + "line": 1076, + "lineto": 1076, + "args": [ + { + "name": "diff", + "type": "const git_diff *", + "comment": "diff to check" + } + ], + "argline": "const git_diff *diff", + "sig": "const git_diff *", + "return": { + "type": "int", + "comment": " 0 if case sensitive, 1 if case is ignored" + }, + "description": "

Check if deltas are sorted case sensitively or insensitively.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_foreach": { + "type": "function", + "file": "git2/diff.h", + "line": 1104, + "lineto": 1110, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback function to make per file in the diff." + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Optional callback to make for binary files." + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Optional callback to make per hunk of text diff. This\n callback is called to describe a range of lines in the\n diff. It will not be issued for binary files." + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Optional callback to make per line of diff text. This\n same callback will be made for context lines, added, and\n removed lines, and even for a deleted trailing newline." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callbacks." + } + ], + "argline": "git_diff *diff, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "git_diff *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all deltas in a diff issuing callbacks.

\n", + "comments": "

This will iterate through all of the files described in a diff. You should provide a file callback to learn about each file.

\n\n

The "hunk" and "line" callbacks are optional, and the text diff of the files will only be calculated if they are not NULL. Of course, these callbacks will not be invoked for binary files on the diff or for files whose only changed is a file mode change.

\n\n

Returning a non-zero value from any of the callbacks will terminate the iteration and return the value to the user.

\n", + "group": "diff" + }, + "git_diff_status_char": { + "type": "function", + "file": "git2/diff.h", + "line": 1123, + "lineto": 1123, + "args": [ + { + "name": "status", + "type": "git_delta_t", + "comment": "The git_delta_t value to look up" + } + ], + "argline": "git_delta_t status", + "sig": "git_delta_t", + "return": { + "type": "char", + "comment": " The single character label for that code" + }, + "description": "

Look up the single character abbreviation for a delta status code.

\n", + "comments": "

When you run git diff --name-status it uses single letter codes in the output such as 'A' for added, 'D' for deleted, 'M' for modified, etc. This function converts a git_delta_t value into these letters for your own purposes. GIT_DELTA_UNTRACKED will return a space (i.e. ' ').

\n", + "group": "diff" + }, + "git_diff_print": { + "type": "function", + "file": "git2/diff.h", + "line": 1149, + "lineto": 1153, + "args": [ + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_format_t", + "comment": "A git_diff_format_t value to pick the text format." + }, + { + "name": "print_cb", + "type": "git_diff_line_cb", + "comment": "Callback to make per line of diff text." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callback." + } + ], + "argline": "git_diff *diff, git_diff_format_t format, git_diff_line_cb print_cb, void *payload", + "sig": "git_diff *::git_diff_format_t::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Iterate over a diff generating formatted text output.

\n", + "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", + "group": "diff", + "examples": { + "diff.c": ["ex/v1.8.4/diff.html#git_diff_print-10"], + "log.c": ["ex/v1.8.4/log.html#git_diff_print-30"] + } + }, + "git_diff_to_buf": { + "type": "function", + "file": "git2/diff.h", + "line": 1165, + "lineto": 1168, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "A pointer to a user-allocated git_buf that will\n contain the diff text" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_format_t", + "comment": "A git_diff_format_t value to pick the text format." + } + ], + "argline": "git_buf *out, git_diff *diff, git_diff_format_t format", + "sig": "git_buf *::git_diff *::git_diff_format_t", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Produce the complete formatted text output from a diff into a\n buffer.

\n", + "comments": "", + "group": "diff" + }, + "git_diff_blobs": { + "type": "function", + "file": "git2/diff.h", + "line": 1204, + "lineto": 1214, + "args": [ + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "new_blob", + "type": "const git_blob *", + "comment": "Blob for new side of diff, or NULL for empty blob" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat new blob as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff on two blobs.

\n", + "comments": "

Compared to a file, a blob lacks some contextual information. As such, the git_diff_file given to the callback will have some fake data; i.e. mode will be 0 and path will be NULL.

\n\n

NULL is allowed for either old_blob or new_blob and will be treated as an empty blob, with the oid set to NULL in the git_diff_file data. Passing NULL for both blobs is a noop; no callbacks will be made at all.

\n\n

We do run a binary content check on the blob content and if either blob looks like binary data, the git_diff_delta binary attribute will be set to 1 and no call to the hunk_cb nor line_cb will be made (unless you pass GIT_DIFF_FORCE_TEXT of course).

\n", + "group": "diff" + }, + "git_diff_blob_to_buffer": { + "type": "function", + "file": "git2/diff.h", + "line": 1241, + "lineto": 1252, + "args": [ + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "buffer_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const git_blob *old_blob, const char *old_as_path, const char *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const git_blob *::const char *::const char *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff between a blob and a buffer.

\n", + "comments": "

As with git_diff_blobs, comparing a blob and buffer lacks some context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n\n

Passing NULL for old_blob will be treated as an empty blob (i.e. the file_cb will be invoked with GIT_DELTA_ADDED and the diff will be the entire content of the buffer added). Passing NULL to the buffer will do the reverse, with GIT_DELTA_REMOVED and blob content removed.

\n", + "group": "diff" + }, + "git_diff_buffers": { + "type": "function", + "file": "git2/diff.h", + "line": 1275, + "lineto": 1287, + "args": [ + { + "name": "old_buffer", + "type": "const void *", + "comment": "Raw data for old side of diff, or NULL for empty" + }, + { + "name": "old_len", + "type": "size_t", + "comment": "Length of the raw data for old side of the diff" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old buffer as if it had this filename; can be NULL" + }, + { + "name": "new_buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "new_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "options", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + }, + { + "name": "file_cb", + "type": "git_diff_file_cb", + "comment": "Callback for \"file\"; made once if there is a diff; can be NULL" + }, + { + "name": "binary_cb", + "type": "git_diff_binary_cb", + "comment": "Callback for binary files; can be NULL" + }, + { + "name": "hunk_cb", + "type": "git_diff_hunk_cb", + "comment": "Callback for each hunk in diff; can be NULL" + }, + { + "name": "line_cb", + "type": "git_diff_line_cb", + "comment": "Callback for each line in diff; can be NULL" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to each callback function" + } + ], + "argline": "const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *options, git_diff_file_cb file_cb, git_diff_binary_cb binary_cb, git_diff_hunk_cb hunk_cb, git_diff_line_cb line_cb, void *payload", + "sig": "const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *::git_diff_file_cb::git_diff_binary_cb::git_diff_hunk_cb::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Directly run a diff between two buffers.

\n", + "comments": "

Even more than with git_diff_blobs, comparing two buffer lacks context, so the git_diff_file parameters to the callbacks will be faked a la the rules for git_diff_blobs().

\n", + "group": "diff" + }, + "git_diff_from_buffer": { + "type": "function", + "file": "git2/diff.h", + "line": 1327, + "lineto": 1334, + "args": [ + { + "name": "out", + "type": "git_diff **", + "comment": "A pointer to a git_diff pointer that will be allocated." + }, + { + "name": "content", + "type": "const char *", + "comment": "The contents of a patch file" + }, + { + "name": "content_len", + "type": "size_t", + "comment": "The length of the patch file contents" + } + ], + "argline": "git_diff **out, const char *content, size_t content_len", + "sig": "git_diff **::const char *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read the contents of a git patch file into a git_diff object.

\n", + "comments": "

The diff object produced is similar to the one that would be produced if you actually produced it computationally by comparing two trees, however there may be subtle differences. For example, a patch file likely contains abbreviated object IDs, so the object IDs in a git_diff_delta produced by this function will also be abbreviated.

\n\n

This function will only read patch files created by a git implementation, it will not read unified diffs produced by the diff program, nor any other types of patch files.

\n", + "group": "diff", + "examples": { + "diff.c": [ + "ex/v1.8.4/diff.html#git_diff_from_buffer-11", + "ex/v1.8.4/diff.html#git_diff_from_buffer-12" + ] + } + }, + "git_diff_get_stats": { + "type": "function", + "file": "git2/diff.h", + "line": 1370, + "lineto": 1372, + "args": [ + { + "name": "out", + "type": "git_diff_stats **", + "comment": "Structure containing the diff statistics." + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A git_diff generated by one of the above functions." + } + ], + "argline": "git_diff_stats **out, git_diff *diff", + "sig": "git_diff_stats **::git_diff *", + "return": { + "type": "int", + "comment": " 0 on success; non-zero on error" + }, + "description": "

Accumulate diff statistics for all patches.

\n", + "comments": "", + "group": "diff", + "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_get_stats-13"] } + }, + "git_diff_stats_files_changed": { + "type": "function", + "file": "git2/diff.h", + "line": 1380, + "lineto": 1381, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of files changed in the diff" + }, + "description": "

Get the total number of files changed in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_insertions": { + "type": "function", + "file": "git2/diff.h", + "line": 1389, + "lineto": 1390, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of insertions in the diff" + }, + "description": "

Get the total number of insertions in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_deletions": { + "type": "function", + "file": "git2/diff.h", + "line": 1398, + "lineto": 1399, + "args": [ + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + } + ], + "argline": "const git_diff_stats *stats", + "sig": "const git_diff_stats *", + "return": { + "type": "size_t", + "comment": " total number of deletions in the diff" + }, + "description": "

Get the total number of deletions in a diff

\n", + "comments": "", + "group": "diff" + }, + "git_diff_stats_to_buf": { + "type": "function", + "file": "git2/diff.h", + "line": 1410, + "lineto": 1414, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the formatted diff statistics in." + }, + { + "name": "stats", + "type": "const git_diff_stats *", + "comment": "A `git_diff_stats` generated by one of the above functions." + }, + { + "name": "format", + "type": "git_diff_stats_format_t", + "comment": "Formatting option." + }, + { + "name": "width", + "type": "size_t", + "comment": "Target width for output (only affects GIT_DIFF_STATS_FULL)" + } + ], + "argline": "git_buf *out, const git_diff_stats *stats, git_diff_stats_format_t format, size_t width", + "sig": "git_buf *::const git_diff_stats *::git_diff_stats_format_t::size_t", + "return": { + "type": "int", + "comment": " 0 on success; non-zero on error" + }, + "description": "

Print diff statistics to a git_buf.

\n", + "comments": "", + "group": "diff", + "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_stats_to_buf-14"] } + }, + "git_diff_stats_free": { + "type": "function", + "file": "git2/diff.h", + "line": 1422, + "lineto": 1422, + "args": [ + { + "name": "stats", + "type": "git_diff_stats *", + "comment": "The previously created statistics object;\n cannot be used after free." + } + ], + "argline": "git_diff_stats *stats", + "sig": "git_diff_stats *", + "return": { "type": "void", "comment": null }, + "description": "

Deallocate a git_diff_stats.

\n", + "comments": "", + "group": "diff", + "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_stats_free-15"] } + }, + "git_diff_patchid_options_init": { + "type": "function", + "file": "git2/diff.h", + "line": 1448, + "lineto": 1450, + "args": [ + { + "name": "opts", + "type": "git_diff_patchid_options *", + "comment": "The `git_diff_patchid_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_DIFF_PATCHID_OPTIONS_VERSION`." + } + ], + "argline": "git_diff_patchid_options *opts, unsigned int version", + "sig": "git_diff_patchid_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_diff_patchid_options structure

\n", + "comments": "

Initializes a git_diff_patchid_options with default values. Equivalent to creating an instance with GIT_DIFF_PATCHID_OPTIONS_INIT.

\n", + "group": "diff" + }, + "git_diff_patchid": { + "type": "function", + "file": "git2/diff.h", + "line": 1471, + "lineto": 1471, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where the calculated patch ID should be stored" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "The diff to calculate the ID for" + }, + { + "name": "opts", + "type": "git_diff_patchid_options *", + "comment": "Options for how to calculate the patch ID. This is\n intended for future changes, as currently no options are\n available." + } + ], + "argline": "git_oid *out, git_diff *diff, git_diff_patchid_options *opts", + "sig": "git_oid *::git_diff *::git_diff_patchid_options *", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise." + }, + "description": "

Calculate the patch ID for the given patch.

\n", + "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", + "group": "diff" + }, + "git_email_create_from_diff": { + "type": "function", + "file": "git2/email.h", + "line": 100, + "lineto": 109, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the e-mail patch in" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "the changes to include in the email" + }, + { "name": "patch_idx", "type": "size_t", "comment": "the patch index" }, + { + "name": "patch_count", + "type": "size_t", + "comment": "the total number of patches that will be included" + }, + { + "name": "commit_id", + "type": "const git_oid *", + "comment": "the commit id for this change" + }, + { + "name": "summary", + "type": "const char *", + "comment": "the commit message for this change" + }, + { + "name": "body", + "type": "const char *", + "comment": "optional text to include above the diffstat" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "the person who authored this commit" + }, + { + "name": "opts", + "type": "const git_email_create_options *", + "comment": "email creation options" + } + ], + "argline": "git_buf *out, git_diff *diff, size_t patch_idx, size_t patch_count, const git_oid *commit_id, const char *summary, const char *body, const git_signature *author, const git_email_create_options *opts", + "sig": "git_buf *::git_diff *::size_t::size_t::const git_oid *::const char *::const char *::const git_signature *::const git_email_create_options *", + "return": { "type": "int", "comment": null }, + "description": "

Create a diff for a commit in mbox format for sending via email.

\n", + "comments": "", + "group": "email" + }, + "git_email_create_from_commit": { + "type": "function", + "file": "git2/email.h", + "line": 119, + "lineto": 122, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the e-mail patch in" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "commit to create a patch for" + }, + { + "name": "opts", + "type": "const git_email_create_options *", + "comment": "email creation options" + } + ], + "argline": "git_buf *out, git_commit *commit, const git_email_create_options *opts", + "sig": "git_buf *::git_commit *::const git_email_create_options *", + "return": { "type": "int", "comment": null }, + "description": "

Create a diff for a commit in mbox format for sending via email.\n The commit must not be a merge commit.

\n", + "comments": "", + "group": "email" + }, + "git_error_last": { + "type": "function", + "file": "git2/errors.h", + "line": 139, + "lineto": 139, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "const git_error *", + "comment": " A git_error object." + }, + "description": "

Return the last git_error object that was generated for the\n current thread.

\n", + "comments": "

This function will never return NULL.

\n\n

Callers should not rely on this to determine whether an error has occurred. For error checking, callers should examine the return codes of libgit2 functions.

\n\n

This call can only reliably report error messages when an error has occurred. (It may contain stale information if it is called after a different function that succeeds.)

\n\n

The memory for this object is managed by libgit2. It should not be freed.

\n", + "group": "error", + "examples": { + "checkout.c": [ + "ex/v1.8.4/checkout.html#git_error_last-11", + "ex/v1.8.4/checkout.html#git_error_last-12", + "ex/v1.8.4/checkout.html#git_error_last-13", + "ex/v1.8.4/checkout.html#git_error_last-14" + ], + "commit.c": ["ex/v1.8.4/commit.html#git_error_last-2"], + "config.c": [ + "ex/v1.8.4/config.html#git_error_last-6", + "ex/v1.8.4/config.html#git_error_last-7", + "ex/v1.8.4/config.html#git_error_last-8" + ], + "general.c": ["ex/v1.8.4/general.html#git_error_last-33"], + "merge.c": [ + "ex/v1.8.4/merge.html#git_error_last-8", + "ex/v1.8.4/merge.html#git_error_last-9" + ] + } + }, + "git_filter_list_load": { + "type": "function", + "file": "git2/filter.h", + "line": 129, + "lineto": 135, + "args": [ + { + "name": "filters", + "type": "git_filter_list **", + "comment": "Output newly created git_filter_list (or NULL)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object that contains `path`" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "The blob to which the filter will be applied (if known)" + }, + { + "name": "path", + "type": "const char *", + "comment": "Relative path of the file to be filtered" + }, + { + "name": "mode", + "type": "git_filter_mode_t", + "comment": "Filtering direction (WT->ODB or ODB->WT)" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of `git_filter_flag_t` flags" + } + ], + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, uint32_t flags", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::uint32_t", + "return": { + "type": "int", + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + }, + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "group": "filter" + }, + "git_filter_list_load_ext": { + "type": "function", + "file": "git2/filter.h", + "line": 152, + "lineto": 158, + "args": [ + { + "name": "filters", + "type": "git_filter_list **", + "comment": "Output newly created git_filter_list (or NULL)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object that contains `path`" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "The blob to which the filter will be applied (if known)" + }, + { + "name": "path", + "type": "const char *", + "comment": "Relative path of the file to be filtered" + }, + { + "name": "mode", + "type": "git_filter_mode_t", + "comment": "Filtering direction (WT->ODB or ODB->WT)" + }, + { + "name": "opts", + "type": "git_filter_options *", + "comment": "The `git_filter_options` to use when loading filters" + } + ], + "argline": "git_filter_list **filters, git_repository *repo, git_blob *blob, const char *path, git_filter_mode_t mode, git_filter_options *opts", + "sig": "git_filter_list **::git_repository *::git_blob *::const char *::git_filter_mode_t::git_filter_options *", + "return": { + "type": "int", + "comment": " 0 on success (which could still return NULL if no filters are\n needed for the requested file), \n<\n0 on error" + }, + "description": "

Load the filter list for a given path.

\n", + "comments": "

This will return 0 (success) but set the output git_filter_list to NULL if no filters are requested for the given file.

\n", + "group": "filter" + }, + "git_filter_list_contains": { + "type": "function", + "file": "git2/filter.h", + "line": 172, + "lineto": 174, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A loaded git_filter_list (or NULL)" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the filter to query" + } + ], + "argline": "git_filter_list *filters, const char *name", + "sig": "git_filter_list *::const char *", + "return": { + "type": "int", + "comment": " 1 if the filter is in the list, 0 otherwise" + }, + "description": "

Query the filter list to see if a given filter (by name) will run.\n The built-in filters "crlf" and "ident" can be queried, otherwise this\n is the name of the filter specified by the filter attribute.

\n", + "comments": "

This will return 0 if the given filter is not in the list, or 1 if the filter will be applied.

\n", + "group": "filter" + }, + "git_filter_list_apply_to_buffer": { + "type": "function", + "file": "git2/filter.h", + "line": 185, + "lineto": 189, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to store the result of the filtering" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A loaded git_filter_list (or NULL)" + }, + { + "name": "in", + "type": "const char *", + "comment": "Buffer containing the data to filter" + }, + { + "name": "in_len", + "type": "size_t", + "comment": "The length of the input buffer" + } + ], + "argline": "git_buf *out, git_filter_list *filters, const char *in, size_t in_len", + "sig": "git_buf *::git_filter_list *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise" + }, + "description": "

Apply filter list to a data buffer.

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_file": { + "type": "function", + "file": "git2/filter.h", + "line": 201, + "lineto": 205, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer into which to store the filtered file" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the filtering" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_repository *repo, const char *path", + "sig": "git_buf *::git_filter_list *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to the contents of a file on disk

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_apply_to_blob": { + "type": "function", + "file": "git2/filter.h", + "line": 215, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer into which to store the filtered file" + }, + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "the blob to filter" + } + ], + "argline": "git_buf *out, git_filter_list *filters, git_blob *blob", + "sig": "git_buf *::git_filter_list *::git_blob *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to the contents of a blob

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_buffer": { + "type": "function", + "file": "git2/filter.h", + "line": 229, + "lineto": 233, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the buffer to filter" + }, + { + "name": "len", + "type": "size_t", + "comment": "the size of the buffer" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, const char *buffer, size_t len, git_writestream *target", + "sig": "git_filter_list *::const char *::size_t::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to an arbitrary buffer as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_file": { + "type": "function", + "file": "git2/filter.h", + "line": 245, + "lineto": 249, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the filtering" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path of the file to filter, a relative path will be\n taken as relative to the workdir" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, git_repository *repo, const char *path, git_writestream *target", + "sig": "git_filter_list *::git_repository *::const char *::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to a file as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_stream_blob": { + "type": "function", + "file": "git2/filter.h", + "line": 259, + "lineto": 262, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "the list of filters to apply" + }, + { + "name": "blob", + "type": "git_blob *", + "comment": "the blob to filter" + }, + { + "name": "target", + "type": "git_writestream *", + "comment": "the stream into which the data will be written" + } + ], + "argline": "git_filter_list *filters, git_blob *blob, git_writestream *target", + "sig": "git_filter_list *::git_blob *::git_writestream *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Apply a filter list to a blob as a stream

\n", + "comments": "", + "group": "filter" + }, + "git_filter_list_free": { + "type": "function", + "file": "git2/filter.h", + "line": 269, + "lineto": 269, + "args": [ + { + "name": "filters", + "type": "git_filter_list *", + "comment": "A git_filter_list created by `git_filter_list_load`" + } + ], + "argline": "git_filter_list *filters", + "sig": "git_filter_list *", + "return": { "type": "void", "comment": null }, + "description": "

Free a git_filter_list

\n", + "comments": "", + "group": "filter" + }, + "git_libgit2_init": { + "type": "function", + "file": "git2/global.h", + "line": 26, + "lineto": 26, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " the number of initializations of the library, or an error code." + }, + "description": "

Init the global state

\n", + "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", + "group": "libgit2", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_libgit2_init-34"] + } + }, + "git_libgit2_shutdown": { + "type": "function", + "file": "git2/global.h", + "line": 39, + "lineto": 39, + "args": [], + "argline": "", + "sig": "", + "return": { + "type": "int", + "comment": " the number of remaining initializations of the library, or an\n error code." + }, + "description": "

Shutdown the global state

\n", + "comments": "

Clean up the global state and threading context after calling it as many times as git_libgit2_init() was called - it will return the number of remainining initializations that have not been shutdown (after this one).

\n", + "group": "libgit2" + }, + "git_graph_ahead_behind": { + "type": "function", + "file": "git2/graph.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "ahead", + "type": "size_t *", + "comment": "number of unique from commits in `upstream`" + }, + { + "name": "behind", + "type": "size_t *", + "comment": "number of unique from commits in `local`" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "local", + "type": "const git_oid *", + "comment": "the commit for local" + }, + { + "name": "upstream", + "type": "const git_oid *", + "comment": "the commit for upstream" + } + ], + "argline": "size_t *ahead, size_t *behind, git_repository *repo, const git_oid *local, const git_oid *upstream", + "sig": "size_t *::size_t *::git_repository *::const git_oid *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Count the number of unique commits between two commit objects

\n", + "comments": "

There is no need for branches containing the commits to have any upstream relationship, but it helps to think of one as a branch and the other as its upstream, the ahead and behind values will be what git would report for the branches.

\n", + "group": "graph" + }, + "git_graph_descendant_of": { + "type": "function", + "file": "git2/graph.h", + "line": 53, + "lineto": 56, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "commit", + "type": "const git_oid *", + "comment": "a previously loaded commit" + }, + { + "name": "ancestor", + "type": "const git_oid *", + "comment": "a potential ancestor commit" + } + ], + "argline": "git_repository *repo, const git_oid *commit, const git_oid *ancestor", + "sig": "git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 1 if the given commit is a descendant of the potential ancestor,\n 0 if not, error code otherwise." + }, + "description": "

Determine if a commit is the descendant of another commit.

\n", + "comments": "

Note that a commit is not considered a descendant of itself, in contrast to git merge-base --is-ancestor.

\n", + "group": "graph" + }, + "git_graph_reachable_from_any": { + "type": "function", + "file": "git2/graph.h", + "line": 69, + "lineto": 73, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "commit", + "type": "const git_oid *", + "comment": "a previously loaded commit" + }, + { + "name": "descendant_array", + "type": "const git_oid []", + "comment": "oids of the commits" + }, + { + "name": "length", + "type": "size_t", + "comment": "the number of commits in the provided `descendant_array`" + } + ], + "argline": "git_repository *repo, const git_oid *commit, const git_oid [] descendant_array, size_t length", + "sig": "git_repository *::const git_oid *::const git_oid []::size_t", + "return": { + "type": "int", + "comment": " 1 if the given commit is an ancestor of any of the given potential\n descendants, 0 if not, error code otherwise." + }, + "description": "

Determine if a commit is reachable from any of a list of commits by\n following parent edges.

\n", + "comments": "", + "group": "graph" + }, + "git_ignore_add_rule": { + "type": "function", + "file": "git2/ignore.h", + "line": 37, + "lineto": 39, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to add ignore rules to." + }, + { + "name": "rules", + "type": "const char *", + "comment": "Text of rules, the contents to add on a .gitignore file.\n It is okay to have multiple rules in the text; if so,\n each rule should be terminated with a newline." + } + ], + "argline": "git_repository *repo, const char *rules", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success" }, + "description": "

Add ignore rules for a repository.

\n", + "comments": "

Excludesfile rules (i.e. .gitignore rules) are generally read from .gitignore files in the repository tree or from a shared system file only if a "core.excludesfile" config value is set. The library also keeps a set of per-repository internal ignores that can be configured in-memory and will not persist. This function allows you to add to that internal rules list.

\n\n

Example usage:

\n\n
 error = git_ignore_add_rule(myrepo, "*.c/ with space");\n
\n\n

This would add three rules to the ignores.

\n", + "group": "ignore" + }, + "git_ignore_clear_internal_rules": { + "type": "function", + "file": "git2/ignore.h", + "line": 52, + "lineto": 53, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to remove ignore rules from." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 on success" }, + "description": "

Clear ignore rules that were explicitly added.

\n", + "comments": "

Resets to the default internal ignore rules. This will not turn off rules in .gitignore files that actually exist in the filesystem.

\n\n

The default internal ignores ignore ".", ".." and ".git" entries.

\n", + "group": "ignore" + }, + "git_ignore_path_is_ignored": { + "type": "function", + "file": "git2/ignore.h", + "line": 71, + "lineto": 74, + "args": [ + { + "name": "ignored", + "type": "int *", + "comment": "boolean returning 0 if the file is not ignored, 1 if it is" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "the file to check ignores for, relative to the repo's workdir." + } + ], + "argline": "int *ignored, git_repository *repo, const char *path", + "sig": "int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." + }, + "description": "

Test if the ignore rules apply to a given path.

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index" on the given file, would it be shown or not?

\n", + "group": "ignore" + }, + "git_index_free": { + "type": "function", + "file": "git2/index.h", + "line": 216, + "lineto": 216, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "void", "comment": null }, + "description": "

Free an existing index object.

\n", + "comments": "", + "group": "index", + "examples": { + "add.c": ["ex/v1.8.4/add.html#git_index_free-1"], + "commit.c": ["ex/v1.8.4/commit.html#git_index_free-3"], + "general.c": ["ex/v1.8.4/general.html#git_index_free-35"], + "init.c": ["ex/v1.8.4/init.html#git_index_free-2"], + "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_free-1"] + } + }, + "git_index_owner": { + "type": "function", + "file": "git2/index.h", + "line": 224, + "lineto": 224, + "args": [ + { "name": "index", "type": "const git_index *", "comment": "The index" } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "git_repository *", + "comment": " A pointer to the repository" + }, + "description": "

Get the repository this index relates to

\n", + "comments": "", + "group": "index" + }, + "git_index_caps": { + "type": "function", + "file": "git2/index.h", + "line": 232, + "lineto": 232, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "An existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "int", + "comment": " A combination of GIT_INDEX_CAPABILITY values" + }, + "description": "

Read index capabilities flags.

\n", + "comments": "", + "group": "index" + }, + "git_index_set_caps": { + "type": "function", + "file": "git2/index.h", + "line": 245, + "lineto": 245, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "caps", + "type": "int", + "comment": "A combination of GIT_INDEX_CAPABILITY values" + } + ], + "argline": "git_index *index, int caps", + "sig": "git_index *::int", + "return": { "type": "int", "comment": " 0 on success, -1 on failure" }, + "description": "

Set index capabilities flags.

\n", + "comments": "

If you pass GIT_INDEX_CAPABILITY_FROM_OWNER for the caps, then capabilities will be read from the config of the owner object, looking at core.ignorecase, core.filemode, core.symlinks.

\n", + "group": "index" + }, + "git_index_version": { + "type": "function", + "file": "git2/index.h", + "line": 257, + "lineto": 257, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "unsigned int", "comment": " the index version" }, + "description": "

Get index on-disk version.

\n", + "comments": "

Valid return values are 2, 3, or 4. If 3 is returned, an index with version 2 may be written instead, if the extension data in version 3 is not necessary.

\n", + "group": "index" + }, + "git_index_set_version": { + "type": "function", + "file": "git2/index.h", + "line": 270, + "lineto": 270, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The new version number" + } + ], + "argline": "git_index *index, unsigned int version", + "sig": "git_index *::unsigned int", + "return": { "type": "int", "comment": " 0 on success, -1 on failure" }, + "description": "

Set index on-disk version.

\n", + "comments": "

Valid values are 2, 3, or 4. If 2 is given, git_index_write may write an index with version 3 instead, if necessary to accurately represent the index.

\n", + "group": "index" + }, + "git_index_read": { + "type": "function", + "file": "git2/index.h", + "line": 289, + "lineto": 289, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "force", + "type": "int", + "comment": "if true, always reload, vs. only read if file has changed" + } + ], + "argline": "git_index *index, int force", + "sig": "git_index *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Update the contents of an existing index object in memory by reading\n from the hard disk.

\n", + "comments": "

If force is true, this performs a "hard" read that discards in-memory changes and always reloads the on-disk index data. If there is no on-disk version, the index will be cleared.

\n\n

If force is false, this does a "soft" read that reloads the index data from disk only if it has changed since the last time it was loaded. Purely in-memory index data will be untouched. Be aware: if there are changes on disk, unwritten in-memory changes are discarded.

\n", + "group": "index" + }, + "git_index_write": { + "type": "function", + "file": "git2/index.h", + "line": 298, + "lineto": 298, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an existing index object from memory back to disk\n using an atomic file lock.

\n", + "comments": "", + "group": "index", + "examples": { + "add.c": ["ex/v1.8.4/add.html#git_index_write-2"], + "commit.c": ["ex/v1.8.4/commit.html#git_index_write-4"] + } + }, + "git_index_path": { + "type": "function", + "file": "git2/index.h", + "line": 306, + "lineto": 306, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "an existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "const char *", + "comment": " path to index file or NULL for in-memory index" + }, + "description": "

Get the full path to the index file on disk.

\n", + "comments": "", + "group": "index" + }, + "git_index_checksum": { + "type": "function", + "file": "git2/index.h", + "line": 320, + "lineto": 320, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the checksum of the index" + }, + "description": "

Get the checksum of the index

\n", + "comments": "

This checksum is the SHA-1 hash over the index file (except the last 20 bytes which are the checksum itself). In cases where the index does not exist on-disk, it will be zeroed out.

\n", + "group": "index" + }, + "git_index_read_tree": { + "type": "function", + "file": "git2/index.h", + "line": 332, + "lineto": 332, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "tree to read" + } + ], + "argline": "git_index *index, const git_tree *tree", + "sig": "git_index *::const git_tree *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a tree into the index file with stats

\n", + "comments": "

The current index contents will be replaced by the specified tree.

\n", + "group": "index" + }, + "git_index_write_tree": { + "type": "function", + "file": "git2/index.h", + "line": 353, + "lineto": 353, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the written tree" + }, + { "name": "index", "type": "git_index *", "comment": "Index to write" } + ], + "argline": "git_oid *out, git_index *index", + "sig": "git_oid *::git_index *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" + }, + "description": "

Write the index as a tree

\n", + "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", + "group": "index", + "examples": { + "commit.c": ["ex/v1.8.4/commit.html#git_index_write_tree-5"], + "init.c": ["ex/v1.8.4/init.html#git_index_write_tree-3"], + "merge.c": ["ex/v1.8.4/merge.html#git_index_write_tree-10"] + } + }, + "git_index_write_tree_to": { + "type": "function", + "file": "git2/index.h", + "line": 370, + "lineto": 370, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store OID of the written tree" + }, + { "name": "index", "type": "git_index *", "comment": "Index to write" }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to write the tree" + } + ], + "argline": "git_oid *out, git_index *index, git_repository *repo", + "sig": "git_oid *::git_index *::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNMERGED when the index is not clean\n or an error code" + }, + "description": "

Write the index as a tree to the given repository

\n", + "comments": "

This method will do the same as git_index_write_tree, but letting the user choose the repository where the tree will be written.

\n\n

The index must not contain any file in conflict.

\n", + "group": "index" + }, + "git_index_entrycount": { + "type": "function", + "file": "git2/index.h", + "line": 389, + "lineto": 389, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "an existing index object" + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "size_t", + "comment": " integer of count of current entries" + }, + "description": "

Get the count of entries currently in the index

\n", + "comments": "", + "group": "index", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_index_entrycount-36"], + "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_entrycount-2"] + } + }, + "git_index_clear": { + "type": "function", + "file": "git2/index.h", + "line": 400, + "lineto": 400, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { + "type": "int", + "comment": " 0 on success, error code \n<\n 0 on failure" + }, + "description": "

Clear the contents (all the entries) of an index object.

\n", + "comments": "

This clears the index object in memory; changes must be explicitly written to disk for them to take effect persistently.

\n", + "group": "index" + }, + "git_index_get_byindex": { + "type": "function", + "file": "git2/index.h", + "line": 413, + "lineto": 414, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "n", + "type": "size_t", + "comment": "the position of the entry" + } + ], + "argline": "git_index *index, size_t n", + "sig": "git_index *::size_t", + "return": { + "type": "const git_index_entry *", + "comment": " a pointer to the entry; NULL if out of bounds" + }, + "description": "

Get a pointer to one of the entries in the index

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_index_get_byindex-37"], + "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_get_byindex-3"] + } + }, + "git_index_get_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 428, + "lineto": 429, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" }, + { "name": "stage", "type": "int", "comment": "stage to search" } + ], + "argline": "git_index *index, const char *path, int stage", + "sig": "git_index *::const char *::int", + "return": { + "type": "const git_index_entry *", + "comment": " a pointer to the entry; NULL if it was not found" + }, + "description": "

Get a pointer to one of the entries in the index

\n", + "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index", + "examples": { + "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_get_bypath-4"] + } + }, + "git_index_remove": { + "type": "function", + "file": "git2/index.h", + "line": 439, + "lineto": 439, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" }, + { "name": "stage", "type": "int", "comment": "stage to search" } + ], + "argline": "git_index *index, const char *path, int stage", + "sig": "git_index *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove an entry from the index

\n", + "comments": "", + "group": "index" + }, + "git_index_remove_directory": { + "type": "function", + "file": "git2/index.h", + "line": 449, + "lineto": 450, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "dir", + "type": "const char *", + "comment": "container directory path" + }, + { "name": "stage", "type": "int", "comment": "stage to search" } + ], + "argline": "git_index *index, const char *dir, int stage", + "sig": "git_index *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove all entries from the index under a given directory

\n", + "comments": "", + "group": "index" + }, + "git_index_add": { + "type": "function", + "file": "git2/index.h", + "line": 466, + "lineto": 466, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "source_entry", + "type": "const git_index_entry *", + "comment": "new entry object" + } + ], + "argline": "git_index *index, const git_index_entry *source_entry", + "sig": "git_index *::const git_index_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an index entry from an in-memory struct

\n", + "comments": "

If a previous index entry exists that has the same path and stage as the given 'source_entry', it will be replaced. Otherwise, the 'source_entry' will be added.

\n\n

A full copy (including the 'path' string) of the given 'source_entry' will be inserted on the index.

\n", + "group": "index" + }, + "git_index_entry_stage": { + "type": "function", + "file": "git2/index.h", + "line": 478, + "lineto": 478, + "args": [ + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "The entry" + } + ], + "argline": "const git_index_entry *entry", + "sig": "const git_index_entry *", + "return": { "type": "int", "comment": " the stage number" }, + "description": "

Return the stage number from a git index entry

\n", + "comments": "

This entry is calculated from the entry's flag attribute like this:

\n\n
(entry->flags & GIT_INDEX_ENTRY_STAGEMASK) >> GIT_INDEX_ENTRY_STAGESHIFT\n
\n", + "group": "index" + }, + "git_index_entry_is_conflict": { + "type": "function", + "file": "git2/index.h", + "line": 487, + "lineto": 487, + "args": [ + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "The entry" + } + ], + "argline": "const git_index_entry *entry", + "sig": "const git_index_entry *", + "return": { + "type": "int", + "comment": " 1 if the entry is a conflict entry, 0 otherwise" + }, + "description": "

Return whether the given index entry is a conflict (has a high stage\n entry). This is simply shorthand for git_index_entry_stage > 0.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_new": { + "type": "function", + "file": "git2/index.h", + "line": 508, + "lineto": 510, + "args": [ + { + "name": "iterator_out", + "type": "git_index_iterator **", + "comment": "The newly created iterator" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to iterate" + } + ], + "argline": "git_index_iterator **iterator_out, git_index *index", + "sig": "git_index_iterator **::git_index *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create an iterator that will return every entry contained in the\n index at the time of creation. Entries are returned in order,\n sorted by path. This iterator is backed by a snapshot that allows\n callers to modify the index while iterating without affecting the\n iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_next": { + "type": "function", + "file": "git2/index.h", + "line": 519, + "lineto": 521, + "args": [ + { + "name": "out", + "type": "const git_index_entry **", + "comment": "Pointer to store the index entry in" + }, + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator" + } + ], + "argline": "const git_index_entry **out, git_index_iterator *iterator", + "sig": "const git_index_entry **::git_index_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER on iteration completion or an error code" + }, + "description": "

Return the next index entry in-order from the iterator.

\n", + "comments": "", + "group": "index" + }, + "git_index_iterator_free": { + "type": "function", + "file": "git2/index.h", + "line": 528, + "lineto": 528, + "args": [ + { + "name": "iterator", + "type": "git_index_iterator *", + "comment": "The iterator to free" + } + ], + "argline": "git_index_iterator *iterator", + "sig": "git_index_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free the index iterator

\n", + "comments": "", + "group": "index" + }, + "git_index_add_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 559, + "lineto": 559, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "filename to add" } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an index entry from a file on disk

\n", + "comments": "

The file path must be relative to the repository's working folder and must be readable.

\n\n

This method will fail in bare index instances.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_add_from_buffer": { + "type": "function", + "file": "git2/index.h", + "line": 587, + "lineto": 590, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "entry", + "type": "const git_index_entry *", + "comment": "filename to add" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "data to be written into the blob" + }, + { "name": "len", "type": "size_t", "comment": "length of the data" } + ], + "argline": "git_index *index, const git_index_entry *entry, const void *buffer, size_t len", + "sig": "git_index *::const git_index_entry *::const void *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an index entry from a buffer in memory

\n", + "comments": "

This method will create a blob in the repository that owns the index and then add the index entry to the index. The path of the entry represents the position of the blob relative to the repository's root folder.

\n\n

If a previous index entry exists that has the same path as the given 'entry', it will be replaced. Otherwise, the 'entry' will be added.

\n\n

This forces the file to be added to the index, not looking at gitignore rules. Those rules can be evaluated through the git_status APIs (in status.h) before calling this.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_remove_bypath": { + "type": "function", + "file": "git2/index.h", + "line": 606, + "lineto": 606, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "filename to remove" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove an index entry corresponding to a file on disk

\n", + "comments": "

The file path must be relative to the repository's working folder. It may exist.

\n\n

If this file currently is the result of a merge conflict, this file will no longer be marked as conflicting. The data about the conflict will be moved to the "resolve undo" (REUC) section.

\n", + "group": "index" + }, + "git_index_add_all": { + "type": "function", + "file": "git2/index.h", + "line": 654, + "lineto": 659, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "combination of git_index_add_option_t flags" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each added/updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, unsigned int flags, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::unsigned int::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Add or update index entries matching files in the working directory.

\n", + "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", + "group": "index", + "examples": { "add.c": ["ex/v1.8.4/add.html#git_index_add_all-3"] } + }, + "git_index_remove_all": { + "type": "function", + "file": "git2/index.h", + "line": 676, + "lineto": 680, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each removed path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Remove all matching index entries.

\n", + "comments": "

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is removed. Return 0 to remove the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "group": "index" + }, + "git_index_update_all": { + "type": "function", + "file": "git2/index.h", + "line": 705, + "lineto": 709, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "An existing index object" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "array of path patterns" + }, + { + "name": "callback", + "type": "git_index_matched_path_cb", + "comment": "notification callback for each updated path (also\n gets index of matching pathspec entry); can be NULL;\n return 0 to add, >0 to skip, \n<\n0 to abort scan." + }, + { + "name": "payload", + "type": "void *", + "comment": "payload passed through to callback function" + } + ], + "argline": "git_index *index, const git_strarray *pathspec, git_index_matched_path_cb callback, void *payload", + "sig": "git_index *::const git_strarray *::git_index_matched_path_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, negative callback return value, or error code" + }, + "description": "

Update all index entries to match the working directory

\n", + "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", + "group": "index", + "examples": { "add.c": ["ex/v1.8.4/add.html#git_index_update_all-4"] } + }, + "git_index_find": { + "type": "function", + "file": "git2/index.h", + "line": 720, + "lineto": 720, + "args": [ + { + "name": "at_pos", + "type": "size_t *", + "comment": "the address to which the position of the index entry is written (optional)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" } + ], + "argline": "size_t *at_pos, git_index *index, const char *path", + "sig": "size_t *::git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Find the first position of any entries which point to given\n path in the Git index.

\n", + "comments": "", + "group": "index" + }, + "git_index_find_prefix": { + "type": "function", + "file": "git2/index.h", + "line": 731, + "lineto": 731, + "args": [ + { + "name": "at_pos", + "type": "size_t *", + "comment": "the address to which the position of the index entry is written (optional)" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "prefix", + "type": "const char *", + "comment": "the prefix to search for" + } + ], + "argline": "size_t *at_pos, git_index *index, const char *prefix", + "sig": "size_t *::git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Find the first position of any entries matching a prefix. To find the first position\n of a path inside a given folder, suffix the prefix with a '/'.

\n", + "comments": "", + "group": "index" + }, + "git_index_conflict_add": { + "type": "function", + "file": "git2/index.h", + "line": 756, + "lineto": 760, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "ancestor_entry", + "type": "const git_index_entry *", + "comment": "the entry data for the ancestor of the conflict" + }, + { + "name": "our_entry", + "type": "const git_index_entry *", + "comment": "the entry data for our side of the merge conflict" + }, + { + "name": "their_entry", + "type": "const git_index_entry *", + "comment": "the entry data for their side of the merge conflict" + } + ], + "argline": "git_index *index, const git_index_entry *ancestor_entry, const git_index_entry *our_entry, const git_index_entry *their_entry", + "sig": "git_index *::const git_index_entry *::const git_index_entry *::const git_index_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update index entries to represent a conflict. Any staged\n entries that exist at the given paths will be removed.

\n", + "comments": "

The entries are the entries from the tree included in the merge. Any entry may be null to indicate that that file was not present in the trees during the merge. For example, ancestor_entry may be NULL to indicate that a file was added in both branches and must be resolved.

\n", + "group": "index" + }, + "git_index_conflict_get": { + "type": "function", + "file": "git2/index.h", + "line": 776, + "lineto": 781, + "args": [ + { + "name": "ancestor_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the ancestor entry" + }, + { + "name": "our_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the our entry" + }, + { + "name": "their_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the their entry" + }, + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { "name": "path", "type": "const char *", "comment": "path to search" } + ], + "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index *index, const char *path", + "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the index entries that represent a conflict of a single file.

\n", + "comments": "

The entries are not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", + "group": "index" + }, + "git_index_conflict_remove": { + "type": "function", + "file": "git2/index.h", + "line": 790, + "lineto": 790, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to remove conflicts for" + } + ], + "argline": "git_index *index, const char *path", + "sig": "git_index *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Removes the index entries that represent a conflict of a single file.

\n", + "comments": "", + "group": "index" + }, + "git_index_conflict_cleanup": { + "type": "function", + "file": "git2/index.h", + "line": 798, + "lineto": 798, + "args": [ + { + "name": "index", + "type": "git_index *", + "comment": "an existing index object" + } + ], + "argline": "git_index *index", + "sig": "git_index *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove all conflicts in the index (entries with a stage greater than 0).

\n", + "comments": "", + "group": "index" + }, + "git_index_has_conflicts": { + "type": "function", + "file": "git2/index.h", + "line": 806, + "lineto": 806, + "args": [ + { + "name": "index", + "type": "const git_index *", + "comment": "An existing index object." + } + ], + "argline": "const git_index *index", + "sig": "const git_index *", + "return": { + "type": "int", + "comment": " 1 if at least one conflict is found, 0 otherwise." + }, + "description": "

Determine if the index contains entries representing file conflicts.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": ["ex/v1.8.4/merge.html#git_index_has_conflicts-11"] + } + }, + "git_index_conflict_iterator_new": { + "type": "function", + "file": "git2/index.h", + "line": 817, + "lineto": 819, + "args": [ + { + "name": "iterator_out", + "type": "git_index_conflict_iterator **", + "comment": "The newly created conflict iterator" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to scan" + } + ], + "argline": "git_index_conflict_iterator **iterator_out, git_index *index", + "sig": "git_index_conflict_iterator **::git_index *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an iterator for the conflicts in the index.

\n", + "comments": "

The index must not be modified while iterating; the results are undefined.

\n", + "group": "index", + "examples": { + "merge.c": ["ex/v1.8.4/merge.html#git_index_conflict_iterator_new-12"] + } + }, + "git_index_conflict_next": { + "type": "function", + "file": "git2/index.h", + "line": 832, + "lineto": 836, + "args": [ + { + "name": "ancestor_out", + "type": "const git_index_entry **", + "comment": "Pointer to store the ancestor side of the conflict" + }, + { + "name": "our_out", + "type": "const git_index_entry **", + "comment": "Pointer to store our side of the conflict" + }, + { + "name": "their_out", + "type": "const git_index_entry **", + "comment": "Pointer to store their side of the conflict" + }, + { + "name": "iterator", + "type": "git_index_conflict_iterator *", + "comment": "The conflict iterator." + } + ], + "argline": "const git_index_entry **ancestor_out, const git_index_entry **our_out, const git_index_entry **their_out, git_index_conflict_iterator *iterator", + "sig": "const git_index_entry **::const git_index_entry **::const git_index_entry **::git_index_conflict_iterator *", + "return": { + "type": "int", + "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" + }, + "description": "

Returns the current conflict (ancestor, ours and theirs entry) and\n advance the iterator internally to the next value.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": ["ex/v1.8.4/merge.html#git_index_conflict_next-13"] + } + }, + "git_index_conflict_iterator_free": { + "type": "function", + "file": "git2/index.h", + "line": 843, + "lineto": 844, + "args": [ + { + "name": "iterator", + "type": "git_index_conflict_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_index_conflict_iterator *iterator", + "sig": "git_index_conflict_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Frees a git_index_conflict_iterator.

\n", + "comments": "", + "group": "index", + "examples": { + "merge.c": ["ex/v1.8.4/merge.html#git_index_conflict_iterator_free-14"] + } + }, + "git_indexer_options_init": { + "type": "function", + "file": "git2/indexer.h", + "line": 99, + "lineto": 101, + "args": [ + { + "name": "opts", + "type": "git_indexer_options *", + "comment": "the `git_indexer_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION`" + } + ], + "argline": "git_indexer_options *opts, unsigned int version", + "sig": "git_indexer_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_indexer_options with default values. Equivalent to\n creating an instance with GIT_INDEXER_OPTIONS_INIT.

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_new": { + "type": "function", + "file": "git2/indexer.h", + "line": 131, + "lineto": 136, + "args": [ + { + "name": "out", + "type": "git_indexer **", + "comment": "where to store the indexer instance" + }, + { + "name": "path", + "type": "const char *", + "comment": "to the directory where the packfile should be stored" + }, + { + "name": "mode", + "type": "unsigned int", + "comment": "permissions to use creating packfile or 0 for defaults" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "object database from which to read base objects when\n fixing thin packs. Pass NULL if no thin pack is expected (an error\n will be returned if there are bases missing)" + }, + { + "name": "opts", + "type": "git_indexer_options *", + "comment": "Optional structure containing additional options. See\n `git_indexer_options` above." + } + ], + "argline": "git_indexer **out, const char *path, unsigned int mode, git_odb *odb, git_indexer_options *opts", + "sig": "git_indexer **::const char *::unsigned int::git_odb *::git_indexer_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Create a new indexer instance

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_append": { + "type": "function", + "file": "git2/indexer.h", + "line": 148, + "lineto": 148, + "args": [ + { "name": "idx", "type": "git_indexer *", "comment": "the indexer" }, + { + "name": "data", + "type": "const void *", + "comment": "the data to add" + }, + { + "name": "size", + "type": "size_t", + "comment": "the size of the data in bytes" + }, + { + "name": "stats", + "type": "git_indexer_progress *", + "comment": "stat storage" + } + ], + "argline": "git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats", + "sig": "git_indexer *::const void *::size_t::git_indexer_progress *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Add data to the indexer

\n", + "comments": "", + "group": "indexer" + }, + "git_indexer_commit": { + "type": "function", + "file": "git2/indexer.h", + "line": 159, + "lineto": 159, + "args": [ + { "name": "idx", "type": "git_indexer *", "comment": "the indexer" }, + { + "name": "stats", + "type": "git_indexer_progress *", + "comment": "Stat storage." + } + ], + "argline": "git_indexer *idx, git_indexer_progress *stats", + "sig": "git_indexer *::git_indexer_progress *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Finalize the pack and index

\n", + "comments": "

Resolve any pending deltas and write out the index file

\n", + "group": "indexer" + }, + "git_indexer_hash": { + "type": "function", + "file": "git2/indexer.h", + "line": 172, + "lineto": 172, + "args": [ + { + "name": "idx", + "type": "const git_indexer *", + "comment": "the indexer instance" + } + ], + "argline": "const git_indexer *idx", + "sig": "const git_indexer *", + "return": { + "type": "const git_oid *", + "comment": " the packfile's hash" + }, + "description": "

Get the packfile's hash

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the index has been finalized.

\n", + "group": "indexer" + }, + "git_indexer_name": { + "type": "function", + "file": "git2/indexer.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "idx", + "type": "const git_indexer *", + "comment": "the indexer instance" + } + ], + "argline": "const git_indexer *idx", + "sig": "const git_indexer *", + "return": { + "type": "const char *", + "comment": " a NUL terminated string for the packfile name" + }, + "description": "

Get the unique name for the resulting packfile.

\n", + "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the index has been finalized.

\n", + "group": "indexer" + }, + "git_indexer_free": { + "type": "function", + "file": "git2/indexer.h", + "line": 191, + "lineto": 191, + "args": [ + { + "name": "idx", + "type": "git_indexer *", + "comment": "the indexer to free" + } + ], + "argline": "git_indexer *idx", + "sig": "git_indexer *", + "return": { "type": "void", "comment": null }, + "description": "

Free the indexer and its resources

\n", + "comments": "", + "group": "indexer" + }, + "git_mailmap_new": { + "type": "function", + "file": "git2/mailmap.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + } + ], + "argline": "git_mailmap **out", + "sig": "git_mailmap **", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Allocate a new mailmap object.

\n", + "comments": "

This object is empty, so you'll have to add a mailmap file before you can do anything with it. The mailmap must be freed with 'git_mailmap_free'.

\n", + "group": "mailmap" + }, + "git_mailmap_free": { + "type": "function", + "file": "git2/mailmap.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "the mailmap to free" + } + ], + "argline": "git_mailmap *mm", + "sig": "git_mailmap *", + "return": { "type": "void", "comment": null }, + "description": "

Free the mailmap and its associated memory.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_add_entry": { + "type": "function", + "file": "git2/mailmap.h", + "line": 52, + "lineto": 54, + "args": [ + { + "name": "mm", + "type": "git_mailmap *", + "comment": "mailmap to add the entry to" + }, + { + "name": "real_name", + "type": "const char *", + "comment": "the real name to use, or NULL" + }, + { + "name": "real_email", + "type": "const char *", + "comment": "the real email to use, or NULL" + }, + { + "name": "replace_name", + "type": "const char *", + "comment": "the name to replace, or NULL" + }, + { + "name": "replace_email", + "type": "const char *", + "comment": "the email to replace" + } + ], + "argline": "git_mailmap *mm, const char *real_name, const char *real_email, const char *replace_name, const char *replace_email", + "sig": "git_mailmap *::const char *::const char *::const char *::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Add a single entry to the given mailmap object. If the entry already exists,\n it will be replaced with the new entry.

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_buffer": { + "type": "function", + "file": "git2/mailmap.h", + "line": 64, + "lineto": 65, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "buf", + "type": "const char *", + "comment": "buffer to parse the mailmap from" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the input buffer" + } + ], + "argline": "git_mailmap **out, const char *buf, size_t len", + "sig": "git_mailmap **::const char *::size_t", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Create a new mailmap instance containing a single mailmap file

\n", + "comments": "", + "group": "mailmap" + }, + "git_mailmap_from_repository": { + "type": "function", + "file": "git2/mailmap.h", + "line": 81, + "lineto": 82, + "args": [ + { + "name": "out", + "type": "git_mailmap **", + "comment": "pointer to store the new mailmap" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to load mailmap information from" + } + ], + "argline": "git_mailmap **out, git_repository *repo", + "sig": "git_mailmap **::git_repository *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Create a new mailmap instance from a repository, loading mailmap files based\n on the repository's configuration.

\n", + "comments": "

Mailmaps are loaded in the following order: 1. '.mailmap' in the root of the repository's working directory, if present. 2. The blob object identified by the 'mailmap.blob' config entry, if set. [NOTE: 'mailmap.blob' defaults to 'HEAD:.mailmap' in bare repositories] 3. The path in the 'mailmap.file' config entry, if set.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve": { + "type": "function", + "file": "git2/mailmap.h", + "line": 96, + "lineto": 98, + "args": [ + { + "name": "real_name", + "type": "const char **", + "comment": "pointer to store the real name" + }, + { + "name": "real_email", + "type": "const char **", + "comment": "pointer to store the real email" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "the mailmap to perform a lookup with (may be NULL)" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name to look up" + }, + { + "name": "email", + "type": "const char *", + "comment": "the email to look up" + } + ], + "argline": "const char **real_name, const char **real_email, const git_mailmap *mm, const char *name, const char *email", + "sig": "const char **::const char **::const git_mailmap *::const char *::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Resolve a name and email to the corresponding real name and email.

\n", + "comments": "

The lifetime of the strings are tied to mm, name, and email parameters.

\n", + "group": "mailmap" + }, + "git_mailmap_resolve_signature": { + "type": "function", + "file": "git2/mailmap.h", + "line": 110, + "lineto": 111, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "mm", + "type": "const git_mailmap *", + "comment": "mailmap to resolve with" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to resolve" + } + ], + "argline": "git_signature **out, const git_mailmap *mm, const git_signature *sig", + "sig": "git_signature **::const git_mailmap *::const git_signature *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Resolve a signature to use real names and emails with a mailmap.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "mailmap" + }, + "git_merge_file_input_init": { + "type": "function", + "file": "git2/merge.h", + "line": 60, + "lineto": 62, + "args": [ + { + "name": "opts", + "type": "git_merge_file_input *", + "comment": "the `git_merge_file_input` instance to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "the version of the struct; you should pass\n `GIT_MERGE_FILE_INPUT_VERSION` here." + } + ], + "argline": "git_merge_file_input *opts, unsigned int version", + "sig": "git_merge_file_input *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_merge_file_input with default values. Equivalent to\n creating an instance with GIT_MERGE_FILE_INPUT_INIT.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file_options_init": { + "type": "function", + "file": "git2/merge.h", + "line": 233, + "lineto": 233, + "args": [ + { + "name": "opts", + "type": "git_merge_file_options *", + "comment": "The `git_merge_file_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_MERGE_FILE_OPTIONS_VERSION`." + } + ], + "argline": "git_merge_file_options *opts, unsigned int version", + "sig": "git_merge_file_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_merge_file_options structure

\n", + "comments": "

Initializes a git_merge_file_options with default values. Equivalent to creating an instance with GIT_MERGE_FILE_OPTIONS_INIT.

\n", + "group": "merge" + }, + "git_merge_options_init": { + "type": "function", + "file": "git2/merge.h", + "line": 329, + "lineto": 329, + "args": [ + { + "name": "opts", + "type": "git_merge_options *", + "comment": "The `git_merge_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_MERGE_OPTIONS_VERSION`." + } + ], + "argline": "git_merge_options *opts, unsigned int version", + "sig": "git_merge_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_merge_options structure

\n", + "comments": "

Initializes a git_merge_options with default values. Equivalent to creating an instance with GIT_MERGE_OPTIONS_INIT.

\n", + "group": "merge" + }, + "git_merge_analysis": { + "type": "function", + "file": "git2/merge.h", + "line": 399, + "lineto": 404, + "args": [ + { + "name": "analysis_out", + "type": "git_merge_analysis_t *", + "comment": "analysis enumeration that the result is written into" + }, + { + "name": "preference_out", + "type": "git_merge_preference_t *", + "comment": "One of the `git_merge_preference_t` flag." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + } + ], + "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len", + "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::const git_annotated_commit **::size_t", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into the HEAD of the repository.

\n", + "comments": "", + "group": "merge", + "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_merge_analysis-15"] } + }, + "git_merge_analysis_for_ref": { + "type": "function", + "file": "git2/merge.h", + "line": 418, + "lineto": 424, + "args": [ + { + "name": "analysis_out", + "type": "git_merge_analysis_t *", + "comment": "analysis enumeration that the result is written into" + }, + { + "name": "preference_out", + "type": "git_merge_preference_t *", + "comment": "One of the `git_merge_preference_t` flag." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "our_ref", + "type": "git_reference *", + "comment": "the reference to perform the analysis from" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + } + ], + "argline": "git_merge_analysis_t *analysis_out, git_merge_preference_t *preference_out, git_repository *repo, git_reference *our_ref, const git_annotated_commit **their_heads, size_t their_heads_len", + "sig": "git_merge_analysis_t *::git_merge_preference_t *::git_repository *::git_reference *::const git_annotated_commit **::size_t", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into a reference.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base": { + "type": "function", + "file": "git2/merge.h", + "line": 435, + "lineto": 439, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base between 'one' and 'two'" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "one", + "type": "const git_oid *", + "comment": "one of the commits" + }, + { + "name": "two", + "type": "const git_oid *", + "comment": "the other commit" + } + ], + "argline": "git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two", + "sig": "git_oid *::git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" + }, + "description": "

Find a merge base between two commits

\n", + "comments": "", + "group": "merge", + "examples": { + "log.c": ["ex/v1.8.4/log.html#git_merge_base-31"], + "rev-parse.c": ["ex/v1.8.4/rev-parse.html#git_merge_base-1"] + } + }, + "git_merge_bases": { + "type": "function", + "file": "git2/merge.h", + "line": 450, + "lineto": 454, + "args": [ + { + "name": "out", + "type": "git_oidarray *", + "comment": "array in which to store the resulting ids" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "one", + "type": "const git_oid *", + "comment": "one of the commits" + }, + { + "name": "two", + "type": "const git_oid *", + "comment": "the other commit" + } + ], + "argline": "git_oidarray *out, git_repository *repo, const git_oid *one, const git_oid *two", + "sig": "git_oidarray *::git_repository *::const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if not found or error code" + }, + "description": "

Find merge bases between two commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base_many": { + "type": "function", + "file": "git2/merge.h", + "line": 465, + "lineto": 469, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base considering all the commits" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oid *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find a merge base given a list of commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_bases_many": { + "type": "function", + "file": "git2/merge.h", + "line": 480, + "lineto": 484, + "args": [ + { + "name": "out", + "type": "git_oidarray *", + "comment": "array in which to store the resulting ids" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oidarray *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oidarray *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find all merge bases given a list of commits

\n", + "comments": "", + "group": "merge" + }, + "git_merge_base_octopus": { + "type": "function", + "file": "git2/merge.h", + "line": 495, + "lineto": 499, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "the OID of a merge base considering all the commits" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository where the commits exist" + }, + { + "name": "length", + "type": "size_t", + "comment": "The number of commits in the provided `input_array`" + }, + { + "name": "input_array", + "type": "const git_oid []", + "comment": "oids of the commits" + } + ], + "argline": "git_oid *out, git_repository *repo, size_t length, const git_oid [] input_array", + "sig": "git_oid *::git_repository *::size_t::const git_oid []", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." + }, + "description": "

Find a merge base in preparation for an octopus merge

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file": { + "type": "function", + "file": "git2/merge.h", + "line": 517, + "lineto": 522, + "args": [ + { + "name": "out", + "type": "git_merge_file_result *", + "comment": "The git_merge_file_result to be filled in" + }, + { + "name": "ancestor", + "type": "const git_merge_file_input *", + "comment": "The contents of the ancestor file" + }, + { + "name": "ours", + "type": "const git_merge_file_input *", + "comment": "The contents of the file in \"our\" side" + }, + { + "name": "theirs", + "type": "const git_merge_file_input *", + "comment": "The contents of the file in \"their\" side" + }, + { + "name": "opts", + "type": "const git_merge_file_options *", + "comment": "The merge file options or `NULL` for defaults" + } + ], + "argline": "git_merge_file_result *out, const git_merge_file_input *ancestor, const git_merge_file_input *ours, const git_merge_file_input *theirs, const git_merge_file_options *opts", + "sig": "git_merge_file_result *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_input *::const git_merge_file_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two files as they exist in the in-memory data structures, using\n the given common ancestor as the baseline, producing a\n git_merge_file_result that reflects the merge result. The\n git_merge_file_result must be freed with git_merge_file_result_free.

\n", + "comments": "

Note that this function does not reference a repository and any configuration must be passed as git_merge_file_options.

\n", + "group": "merge" + }, + "git_merge_file_from_index": { + "type": "function", + "file": "git2/merge.h", + "line": 538, + "lineto": 544, + "args": [ + { + "name": "out", + "type": "git_merge_file_result *", + "comment": "The git_merge_file_result to be filled in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + }, + { + "name": "ancestor", + "type": "const git_index_entry *", + "comment": "The index entry for the ancestor file (stage level 1)" + }, + { + "name": "ours", + "type": "const git_index_entry *", + "comment": "The index entry for our file (stage level 2)" + }, + { + "name": "theirs", + "type": "const git_index_entry *", + "comment": "The index entry for their file (stage level 3)" + }, + { + "name": "opts", + "type": "const git_merge_file_options *", + "comment": "The merge file options or NULL" + } + ], + "argline": "git_merge_file_result *out, git_repository *repo, const git_index_entry *ancestor, const git_index_entry *ours, const git_index_entry *theirs, const git_merge_file_options *opts", + "sig": "git_merge_file_result *::git_repository *::const git_index_entry *::const git_index_entry *::const git_index_entry *::const git_merge_file_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two files as they exist in the index, using the given common\n ancestor as the baseline, producing a git_merge_file_result that\n reflects the merge result. The git_merge_file_result must be freed with\n git_merge_file_result_free.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_file_result_free": { + "type": "function", + "file": "git2/merge.h", + "line": 551, + "lineto": 551, + "args": [ + { + "name": "result", + "type": "git_merge_file_result *", + "comment": "The result to free or `NULL`" + } + ], + "argline": "git_merge_file_result *result", + "sig": "git_merge_file_result *", + "return": { "type": "void", "comment": null }, + "description": "

Frees a git_merge_file_result.

\n", + "comments": "", + "group": "merge" + }, + "git_merge_trees": { + "type": "function", + "file": "git2/merge.h", + "line": 569, + "lineto": 575, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given trees" + }, + { + "name": "ancestor_tree", + "type": "const git_tree *", + "comment": "the common ancestor between the trees (or null if none)" + }, + { + "name": "our_tree", + "type": "const git_tree *", + "comment": "the tree that reflects the destination tree" + }, + { + "name": "their_tree", + "type": "const git_tree *", + "comment": "the tree to merge in to `our_tree`" + }, + { + "name": "opts", + "type": "const git_merge_options *", + "comment": "the merge tree options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, const git_tree *ancestor_tree, const git_tree *our_tree, const git_tree *their_tree, const git_merge_options *opts", + "sig": "git_index **::git_repository *::const git_tree *::const git_tree *::const git_tree *::const git_merge_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two trees, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "merge" + }, + "git_merge_commits": { + "type": "function", + "file": "git2/merge.h", + "line": 592, + "lineto": 597, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository that contains the given trees" + }, + { + "name": "our_commit", + "type": "const git_commit *", + "comment": "the commit that reflects the destination tree" + }, + { + "name": "their_commit", + "type": "const git_commit *", + "comment": "the commit to merge in to `our_commit`" + }, + { + "name": "opts", + "type": "const git_merge_options *", + "comment": "the merge tree options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, const git_commit *our_commit, const git_commit *their_commit, const git_merge_options *opts", + "sig": "git_index **::git_repository *::const git_commit *::const git_commit *::const git_merge_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merge two commits, producing a git_index that reflects the result of\n the merge. The index may be written as-is to the working directory\n or checked out. If the index is to be converted to a tree, the caller\n should resolve any conflicts that arose as part of the merge.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "merge" + }, + "git_merge": { + "type": "function", + "file": "git2/merge.h", + "line": 617, + "lineto": 622, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to merge" + }, + { + "name": "their_heads", + "type": "const git_annotated_commit **", + "comment": "the heads to merge into" + }, + { + "name": "their_heads_len", + "type": "size_t", + "comment": "the number of heads to merge" + }, + { + "name": "merge_opts", + "type": "const git_merge_options *", + "comment": "merge options" + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": "checkout options" + } + ], + "argline": "git_repository *repo, const git_annotated_commit **their_heads, size_t their_heads_len, const git_merge_options *merge_opts, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_annotated_commit **::size_t::const git_merge_options *::const git_checkout_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", + "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the user wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", + "group": "merge", + "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_merge-16"] } + }, + "git_message_prettify": { + "type": "function", + "file": "git2/message.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The user-allocated git_buf which will be filled with the\n cleaned up message." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message to be prettified." + }, + { + "name": "strip_comments", + "type": "int", + "comment": "Non-zero to remove comment lines, 0 to leave them in." + }, + { + "name": "comment_char", + "type": "char", + "comment": "Comment character. Lines starting with this character\n are considered to be comments and removed if `strip_comments` is non-zero." + } + ], + "argline": "git_buf *out, const char *message, int strip_comments, char comment_char", + "sig": "git_buf *::const char *::int::char", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Clean up excess whitespace and make sure there is a trailing newline in the message.

\n", + "comments": "

Optionally, it can remove lines which start with the comment character.

\n", + "group": "message" + }, + "git_message_trailers": { + "type": "function", + "file": "git2/message.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "arr", + "type": "git_message_trailer_array *", + "comment": "A pre-allocated git_message_trailer_array struct to be filled in\n with any trailers found during parsing." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message to be parsed" + } + ], + "argline": "git_message_trailer_array *arr, const char *message", + "sig": "git_message_trailer_array *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or non-zero on error." + }, + "description": "

Parse trailers out of a message, filling the array pointed to by +arr+.

\n", + "comments": "

Trailers are key/value pairs in the last paragraph of a message, not including any patches or conflicts that may be present.

\n", + "group": "message" + }, + "git_message_trailer_array_free": { + "type": "function", + "file": "git2/message.h", + "line": 81, + "lineto": 81, + "args": [ + { + "name": "arr", + "type": "git_message_trailer_array *", + "comment": "The trailer to free." + } + ], + "argline": "git_message_trailer_array *arr", + "sig": "git_message_trailer_array *", + "return": { "type": "void", "comment": null }, + "description": "

Clean's up any allocated memory in the git_message_trailer_array filled by\n a call to git_message_trailers.

\n", + "comments": "", + "group": "message" + }, + "git_note_iterator_new": { + "type": "function", + "file": "git2/notes.h", + "line": 49, + "lineto": 52, + "args": [ + { + "name": "out", + "type": "git_note_iterator **", + "comment": "pointer to the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to look up the note" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" + } + ], + "argline": "git_note_iterator **out, git_repository *repo, const char *notes_ref", + "sig": "git_note_iterator **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Creates a new iterator for notes

\n", + "comments": "

The iterator must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_commit_iterator_new": { + "type": "function", + "file": "git2/notes.h", + "line": 64, + "lineto": 66, + "args": [ + { + "name": "out", + "type": "git_note_iterator **", + "comment": "pointer to the iterator" + }, + { + "name": "notes_commit", + "type": "git_commit *", + "comment": "a pointer to the notes commit object" + } + ], + "argline": "git_note_iterator **out, git_commit *notes_commit", + "sig": "git_note_iterator **::git_commit *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Creates a new iterator for notes from a commit

\n", + "comments": "

The iterator must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_iterator_free": { + "type": "function", + "file": "git2/notes.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "it", + "type": "git_note_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_note_iterator *it", + "sig": "git_note_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Frees an git_note_iterator

\n", + "comments": "", + "group": "note" + }, + "git_note_next": { + "type": "function", + "file": "git2/notes.h", + "line": 86, + "lineto": 89, + "args": [ + { + "name": "note_id", + "type": "git_oid *", + "comment": "id of blob containing the message" + }, + { + "name": "annotated_id", + "type": "git_oid *", + "comment": "id of the git object being annotated" + }, + { + "name": "it", + "type": "git_note_iterator *", + "comment": "pointer to the iterator" + } + ], + "argline": "git_oid *note_id, git_oid *annotated_id, git_note_iterator *it", + "sig": "git_oid *::git_oid *::git_note_iterator *", + "return": { + "type": "int", + "comment": " 0 (no error), GIT_ITEROVER (iteration is done) or an error code\n (negative value)" + }, + "description": "

Return the current item (note_id and annotated_id) and advance the iterator\n internally to the next value

\n", + "comments": "", + "group": "note" + }, + "git_note_read": { + "type": "function", + "file": "git2/notes.h", + "line": 105, + "lineto": 109, + "args": [ + { + "name": "out", + "type": "git_note **", + "comment": "pointer to the read note; NULL in case of error" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to look up the note" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to read the note from" + } + ], + "argline": "git_note **out, git_repository *repo, const char *notes_ref, const git_oid *oid", + "sig": "git_note **::git_repository *::const char *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read the note for an object

\n", + "comments": "

The note must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_commit_read": { + "type": "function", + "file": "git2/notes.h", + "line": 124, + "lineto": 128, + "args": [ + { + "name": "out", + "type": "git_note **", + "comment": "pointer to the read note; NULL in case of error" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to look up the note" + }, + { + "name": "notes_commit", + "type": "git_commit *", + "comment": "a pointer to the notes commit object" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to read the note from" + } + ], + "argline": "git_note **out, git_repository *repo, git_commit *notes_commit, const git_oid *oid", + "sig": "git_note **::git_repository *::git_commit *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read the note for an object from a note commit

\n", + "comments": "

The note must be freed manually by the user.

\n", + "group": "note" + }, + "git_note_author": { + "type": "function", + "file": "git2/notes.h", + "line": 136, + "lineto": 136, + "args": [ + { "name": "note", "type": "const git_note *", "comment": "the note" } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { "type": "const git_signature *", "comment": " the author" }, + "description": "

Get the note author

\n", + "comments": "", + "group": "note" + }, + "git_note_committer": { + "type": "function", + "file": "git2/notes.h", + "line": 144, + "lineto": 144, + "args": [ + { "name": "note", "type": "const git_note *", "comment": "the note" } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { + "type": "const git_signature *", + "comment": " the committer" + }, + "description": "

Get the note committer

\n", + "comments": "", + "group": "note" + }, + "git_note_message": { + "type": "function", + "file": "git2/notes.h", + "line": 153, + "lineto": 153, + "args": [ + { "name": "note", "type": "const git_note *", "comment": "the note" } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { "type": "const char *", "comment": " the note message" }, + "description": "

Get the note message

\n", + "comments": "", + "group": "note" + }, + "git_note_id": { + "type": "function", + "file": "git2/notes.h", + "line": 162, + "lineto": 162, + "args": [ + { "name": "note", "type": "const git_note *", "comment": "the note" } + ], + "argline": "const git_note *note", + "sig": "const git_note *", + "return": { + "type": "const git_oid *", + "comment": " the note object's id" + }, + "description": "

Get the note object's id

\n", + "comments": "", + "group": "note" + }, + "git_note_create": { + "type": "function", + "file": "git2/notes.h", + "line": 179, + "lineto": 187, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the OID (optional); NULL in case of error" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to store the note" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to decorate" + }, + { + "name": "note", + "type": "const char *", + "comment": "Content of the note to add for object oid" + }, + { "name": "force", "type": "int", "comment": "Overwrite existing note" } + ], + "argline": "git_oid *out, git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int force", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a note for an object

\n", + "comments": "", + "group": "note" + }, + "git_note_commit_create": { + "type": "function", + "file": "git2/notes.h", + "line": 209, + "lineto": 218, + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *", + "comment": "pointer to store the commit (optional);\n\t\t\t\t\tNULL in case of error" + }, + { + "name": "notes_blob_out", + "type": "git_oid *", + "comment": "a point to the id of a note blob (optional)" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the note will live" + }, + { + "name": "parent", + "type": "git_commit *", + "comment": "Pointer to parent note\n\t\t\t\t\tor NULL if this shall start a new notes tree" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to decorate" + }, + { + "name": "note", + "type": "const char *", + "comment": "Content of the note to add for object oid" + }, + { + "name": "allow_note_overwrite", + "type": "int", + "comment": "Overwrite existing note" + } + ], + "argline": "git_oid *notes_commit_out, git_oid *notes_blob_out, git_repository *repo, git_commit *parent, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int allow_note_overwrite", + "sig": "git_oid *::git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *::const char *::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a note for an object from a commit

\n", + "comments": "

This function will create a notes commit for a given object, the commit is a dangling commit, no reference is created.

\n", + "group": "note" + }, + "git_note_remove": { + "type": "function", + "file": "git2/notes.h", + "line": 232, + "lineto": 237, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the note lives" + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to remove the note from" + } + ], + "argline": "git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid", + "sig": "git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove the note for an object

\n", + "comments": "", + "group": "note" + }, + "git_note_commit_remove": { + "type": "function", + "file": "git2/notes.h", + "line": 257, + "lineto": 263, + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *", + "comment": "pointer to store the new notes commit (optional);\n\t\t\t\t\tNULL in case of error.\n\t\t\t\t\tWhen removing a note a new tree containing all notes\n\t\t\t\t\tsans the note to be removed is created and a new commit\n\t\t\t\t\tpointing to that tree is also created.\n\t\t\t\t\tIn the case where the resulting tree is an empty tree\n\t\t\t\t\ta new commit pointing to this empty tree will be returned." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where the note lives" + }, + { + "name": "notes_commit", + "type": "git_commit *", + "comment": "a pointer to the notes commit object" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "signature of the notes commit author" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "signature of the notes commit committer" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "OID of the git object to remove the note from" + } + ], + "argline": "git_oid *notes_commit_out, git_repository *repo, git_commit *notes_commit, const git_signature *author, const git_signature *committer, const git_oid *oid", + "sig": "git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove the note for an object

\n", + "comments": "", + "group": "note" + }, + "git_note_free": { + "type": "function", + "file": "git2/notes.h", + "line": 270, + "lineto": 270, + "args": [ + { "name": "note", "type": "git_note *", "comment": "git_note object" } + ], + "argline": "git_note *note", + "sig": "git_note *", + "return": { "type": "void", "comment": null }, + "description": "

Free a git_note object

\n", + "comments": "", + "group": "note" + }, + "git_note_default_ref": { + "type": "function", + "file": "git2/notes.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer in which to store the name of the default notes reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The Git repository" + } + ], + "argline": "git_buf *out, git_repository *repo", + "sig": "git_buf *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the default notes reference for a repository

\n", + "comments": "", + "group": "note" + }, + "git_note_foreach": { + "type": "function", + "file": "git2/notes.h", + "line": 298, + "lineto": 302, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the notes." + }, + { + "name": "notes_ref", + "type": "const char *", + "comment": "Reference to read from (optional); defaults to\n \"refs/notes/commits\"." + }, + { + "name": "note_cb", + "type": "git_note_foreach_cb", + "comment": "Callback to invoke per found annotation. Return non-zero\n to stop looping." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "git_repository *repo, const char *notes_ref, git_note_foreach_cb note_cb, void *payload", + "sig": "git_repository *::const char *::git_note_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Loop over all the notes within a specified namespace\n and issue a callback for each one.

\n", + "comments": "", + "group": "note" + }, + "git_object_lookup": { + "type": "function", + "file": "git2/object.h", + "line": 44, + "lineto": 48, + "args": [ + { + "name": "object", + "type": "git_object **", + "comment": "pointer to the looked-up object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the unique identifier for the object" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "the type of the object" + } + ], + "argline": "git_object **object, git_repository *repo, const git_oid *id, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a reference to one of the objects in a repository.

\n", + "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", + "group": "object", + "examples": { + "log.c": ["ex/v1.8.4/log.html#git_object_lookup-32"], + "merge.c": ["ex/v1.8.4/merge.html#git_object_lookup-17"] + } + }, + "git_object_lookup_prefix": { + "type": "function", + "file": "git2/object.h", + "line": 77, + "lineto": 82, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer where to store the looked-up object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "a short identifier for the object" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "the type of the object" + } + ], + "argline": "git_object **object_out, git_repository *repo, const git_oid *id, size_t len, git_object_t type", + "sig": "git_object **::git_repository *::const git_oid *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", + "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", + "group": "object" + }, + "git_object_lookup_bypath": { + "type": "function", + "file": "git2/object.h", + "line": 95, + "lineto": 99, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "buffer that receives a pointer to the object (which must be freed\n by the caller)" + }, + { + "name": "treeish", + "type": "const git_object *", + "comment": "root object that can be peeled to a tree" + }, + { + "name": "path", + "type": "const char *", + "comment": "relative path from the root object to the desired object" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of object desired" + } + ], + "argline": "git_object **out, const git_object *treeish, const char *path, git_object_t type", + "sig": "git_object **::const git_object *::const char *::git_object_t", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Lookup an object that represents a tree entry.

\n", + "comments": "", + "group": "object" + }, + "git_object_id": { + "type": "function", + "file": "git2/object.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "obj", + "type": "const git_object *", + "comment": "the repository object" + } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { "type": "const git_oid *", "comment": " the SHA1 id" }, + "description": "

Get the id (SHA1) of a repository object

\n", + "comments": "", + "group": "object", + "examples": { + "blame.c": [ + "ex/v1.8.4/blame.html#git_object_id-8", + "ex/v1.8.4/blame.html#git_object_id-9", + "ex/v1.8.4/blame.html#git_object_id-10", + "ex/v1.8.4/blame.html#git_object_id-11" + ], + "cat-file.c": [ + "ex/v1.8.4/cat-file.html#git_object_id-10", + "ex/v1.8.4/cat-file.html#git_object_id-11" + ], + "log.c": [ + "ex/v1.8.4/log.html#git_object_id-33", + "ex/v1.8.4/log.html#git_object_id-34", + "ex/v1.8.4/log.html#git_object_id-35", + "ex/v1.8.4/log.html#git_object_id-36" + ], + "rev-parse.c": [ + "ex/v1.8.4/rev-parse.html#git_object_id-2", + "ex/v1.8.4/rev-parse.html#git_object_id-3", + "ex/v1.8.4/rev-parse.html#git_object_id-4", + "ex/v1.8.4/rev-parse.html#git_object_id-5", + "ex/v1.8.4/rev-parse.html#git_object_id-6" + ] + } + }, + "git_object_short_id": { + "type": "function", + "file": "git2/object.h", + "line": 121, + "lineto": 121, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to write string into" + }, + { + "name": "obj", + "type": "const git_object *", + "comment": "The object to get an ID for" + } + ], + "argline": "git_buf *out, const git_object *obj", + "sig": "git_buf *::const git_object *", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 for error" }, + "description": "

Get a short abbreviated OID string for the object

\n", + "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", + "group": "object", + "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_object_short_id-3"] } + }, + "git_object_type": { + "type": "function", + "file": "git2/object.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "obj", + "type": "const git_object *", + "comment": "the repository object" + } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { "type": "git_object_t", "comment": " the object's type" }, + "description": "

Get the object type of an object

\n", + "comments": "", + "group": "object", + "examples": { + "cat-file.c": [ + "ex/v1.8.4/cat-file.html#git_object_type-12", + "ex/v1.8.4/cat-file.html#git_object_type-13", + "ex/v1.8.4/cat-file.html#git_object_type-14" + ], + "tag.c": ["ex/v1.8.4/tag.html#git_object_type-4"] + } + }, + "git_object_owner": { + "type": "function", + "file": "git2/object.h", + "line": 143, + "lineto": 143, + "args": [ + { "name": "obj", "type": "const git_object *", "comment": "the object" } + ], + "argline": "const git_object *obj", + "sig": "const git_object *", + "return": { + "type": "git_repository *", + "comment": " the repository who owns this object" + }, + "description": "

Get the repository that owns this object

\n", + "comments": "

Freeing or calling git_repository_close on the returned pointer will invalidate the actual object.

\n\n

Any other operation may be run on the repository without affecting the object.

\n", + "group": "object" + }, + "git_object_free": { + "type": "function", + "file": "git2/object.h", + "line": 160, + "lineto": 160, + "args": [ + { + "name": "object", + "type": "git_object *", + "comment": "the object to close" + } + ], + "argline": "git_object *object", + "sig": "git_object *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open object

\n", + "comments": "

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 aggressive is the caching mechanism used by the repository.

\n\n

IMPORTANT: It is necessary to call this method when you stop using an object. Failure to do so will cause a memory leak.

\n", + "group": "object", + "examples": { + "blame.c": [ + "ex/v1.8.4/blame.html#git_object_free-12", + "ex/v1.8.4/blame.html#git_object_free-13", + "ex/v1.8.4/blame.html#git_object_free-14", + "ex/v1.8.4/blame.html#git_object_free-15" + ], + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_object_free-15"], + "commit.c": ["ex/v1.8.4/commit.html#git_object_free-6"], + "general.c": ["ex/v1.8.4/general.html#git_object_free-38"], + "log.c": ["ex/v1.8.4/log.html#git_object_free-37"], + "merge.c": ["ex/v1.8.4/merge.html#git_object_free-18"], + "rev-parse.c": [ + "ex/v1.8.4/rev-parse.html#git_object_free-7", + "ex/v1.8.4/rev-parse.html#git_object_free-8", + "ex/v1.8.4/rev-parse.html#git_object_free-9" + ], + "tag.c": [ + "ex/v1.8.4/tag.html#git_object_free-5", + "ex/v1.8.4/tag.html#git_object_free-6", + "ex/v1.8.4/tag.html#git_object_free-7", + "ex/v1.8.4/tag.html#git_object_free-8" + ] + } + }, + "git_object_type2string": { + "type": "function", + "file": "git2/object.h", + "line": 171, + "lineto": 171, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to convert." + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "const char *", + "comment": " the corresponding string representation." + }, + "description": "

Convert an object type to its string representation.

\n", + "comments": "

The result is a pointer to a string in static memory and should not be free()'ed.

\n", + "group": "object", + "examples": { + "cat-file.c": [ + "ex/v1.8.4/cat-file.html#git_object_type2string-16", + "ex/v1.8.4/cat-file.html#git_object_type2string-17", + "ex/v1.8.4/cat-file.html#git_object_type2string-18", + "ex/v1.8.4/cat-file.html#git_object_type2string-19" + ], + "general.c": [ + "ex/v1.8.4/general.html#git_object_type2string-39", + "ex/v1.8.4/general.html#git_object_type2string-40" + ] + } + }, + "git_object_string2type": { + "type": "function", + "file": "git2/object.h", + "line": 179, + "lineto": 179, + "args": [ + { + "name": "str", + "type": "const char *", + "comment": "the string to convert." + } + ], + "argline": "const char *str", + "sig": "const char *", + "return": { + "type": "git_object_t", + "comment": " the corresponding git_object_t." + }, + "description": "

Convert a string object type representation to it's git_object_t.

\n", + "comments": "", + "group": "object" + }, + "git_object_typeisloose": { + "type": "function", + "file": "git2/object.h", + "line": 188, + "lineto": 188, + "args": [ + { + "name": "type", + "type": "git_object_t", + "comment": "object type to test." + } + ], + "argline": "git_object_t type", + "sig": "git_object_t", + "return": { + "type": "int", + "comment": " true if the type represents a valid loose object type,\n false otherwise." + }, + "description": "

Determine if the given git_object_t is a valid loose object type.

\n", + "comments": "", + "group": "object" + }, + "git_object_peel": { + "type": "function", + "file": "git2/object.h", + "line": 213, + "lineto": 216, + "args": [ + { + "name": "peeled", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "object", + "type": "const git_object *", + "comment": "The object to be processed" + }, + { + "name": "target_type", + "type": "git_object_t", + "comment": "The type of the requested object (a GIT_OBJECT_ value)" + } + ], + "argline": "git_object **peeled, const git_object *object, git_object_t target_type", + "sig": "git_object **::const git_object *::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code" + }, + "description": "

Recursively peel an object until an object of the specified type is met.

\n", + "comments": "

If the query cannot be satisfied due to the object model, GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a tree).

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until the type changes. A tag will be peeled until the referenced object is no longer a tag, and a commit will be peeled to a tree. Any other object type will return GIT_EINVALIDSPEC.

\n\n

If peeling a tag we discover an object which cannot be peeled to the target type due to the object model, GIT_EPEEL will be returned.

\n\n

You must free the returned object.

\n", + "group": "object" + }, + "git_object_dup": { + "type": "function", + "file": "git2/object.h", + "line": 226, + "lineto": 226, + "args": [ + { + "name": "dest", + "type": "git_object **", + "comment": "Pointer to store the copy of the object" + }, + { + "name": "source", + "type": "git_object *", + "comment": "Original object to copy" + } + ], + "argline": "git_object **dest, git_object *source", + "sig": "git_object **::git_object *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an in-memory copy of a Git object. The copy must be\n explicitly free'd or it will leak.

\n", + "comments": "", + "group": "object" + }, + "git_object_rawcontent_is_valid": { + "type": "function", + "file": "git2/object.h", + "line": 269, + "lineto": 273, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "Output pointer to set with validity of the object content" + }, + { + "name": "buf", + "type": "const char *", + "comment": "The contents to validate" + }, + { + "name": "len", + "type": "size_t", + "comment": "The length of the buffer" + }, + { + "name": "object_type", + "type": "git_object_t", + "comment": "The type of the object in the buffer" + } + ], + "argline": "int *valid, const char *buf, size_t len, git_object_t object_type", + "sig": "int *::const char *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Analyzes a buffer of raw object content and determines its validity.\n Tree, commit, and tag objects will be parsed and ensured that they\n are valid, parseable content. (Blobs are always valid by definition.)\n An error message will be set with an informative message if the object\n is not valid.

\n", + "comments": "", + "group": "object" + }, + "git_odb_add_disk_alternate": { + "type": "function", + "file": "git2/odb.h", + "line": 118, + "lineto": 118, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "path", + "type": "const char *", + "comment": "path to the objects folder for the alternate" + } + ], + "argline": "git_odb *odb, const char *path", + "sig": "git_odb *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add an on-disk alternate to an existing Object DB.

\n", + "comments": "

Note that the added path must point to an objects, not to a full repository, to use it as an alternate store.

\n\n

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

Writing is disabled on alternate backends.

\n", + "group": "odb" + }, + "git_odb_free": { + "type": "function", + "file": "git2/odb.h", + "line": 125, + "lineto": 125, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database pointer to close. If NULL no action is taken." + } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open object database.

\n", + "comments": "", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_free-20"], + "general.c": ["ex/v1.8.4/general.html#git_odb_free-41"] + } + }, + "git_odb_read": { + "type": "function", + "file": "git2/odb.h", + "line": 143, + "lineto": 143, + "args": [ + { + "name": "out", + "type": "git_odb_object **", + "comment": "pointer where to store the read object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the object to read." + } + ], + "argline": "git_odb_object **out, git_odb *db, const git_oid *id", + "sig": "git_odb_object **::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is\n not in the database." + }, + "description": "

Read an object from the database.

\n", + "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_read-21"], + "general.c": ["ex/v1.8.4/general.html#git_odb_read-42"] + } + }, + "git_odb_read_prefix": { + "type": "function", + "file": "git2/odb.h", + "line": 171, + "lineto": 171, + "args": [ + { + "name": "out", + "type": "git_odb_object **", + "comment": "pointer where to store the read object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "short_id", + "type": "const git_oid *", + "comment": "a prefix of the id of the object to read." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the prefix" + } + ], + "argline": "git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len", + "sig": "git_odb_object **::git_odb *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not in the\n database. GIT_EAMBIGUOUS if the prefix is ambiguous\n (several objects match the prefix)" + }, + "description": "

Read an object from the database, given a prefix\n of its identifier.

\n", + "comments": "

This method queries all available ODB backends trying to match the 'len' first hexadecimal characters of the 'short_id'. The remaining (GIT_OID_SHA1_HEXSIZE-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.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", + "group": "odb" + }, + "git_odb_read_header": { + "type": "function", + "file": "git2/odb.h", + "line": 190, + "lineto": 190, + "args": [ + { + "name": "len_out", + "type": "size_t *", + "comment": "pointer where to store the length" + }, + { + "name": "type_out", + "type": "git_object_t *", + "comment": "pointer where to store the type" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "database to search for the object in." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the object to read." + } + ], + "argline": "size_t *len_out, git_object_t *type_out, git_odb *db, const git_oid *id", + "sig": "size_t *::git_object_t *::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the object was read, GIT_ENOTFOUND if the object is not\n in the database." + }, + "description": "

Read the header of an object from the database, without\n reading its full contents.

\n", + "comments": "

The header includes the length and the type of an object.

\n\n

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.

\n", + "group": "odb" + }, + "git_odb_exists": { + "type": "function", + "file": "git2/odb.h", + "line": 199, + "lineto": 199, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database to be searched for the given object." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the object to search for." + } + ], + "argline": "git_odb *db, const git_oid *id", + "sig": "git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 1 if the object was found, 0 otherwise" + }, + "description": "

Determine if the given object can be found in the object database.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_exists_ext": { + "type": "function", + "file": "git2/odb.h", + "line": 210, + "lineto": 210, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "database to be searched for the given object." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the object to search for." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "flags affecting the lookup (see `git_odb_lookup_flags_t`)" + } + ], + "argline": "git_odb *db, const git_oid *id, unsigned int flags", + "sig": "git_odb *::const git_oid *::unsigned int", + "return": { + "type": "int", + "comment": " 1 if the object was found, 0 otherwise" + }, + "description": "

Determine if the given object can be found in the object database, with\n extended options.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_exists_prefix": { + "type": "function", + "file": "git2/odb.h", + "line": 223, + "lineto": 224, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "The full OID of the found object if just one is found." + }, + { + "name": "db", + "type": "git_odb *", + "comment": "The database to be searched for the given object." + }, + { + "name": "short_id", + "type": "const git_oid *", + "comment": "A prefix of the id of the object to read." + }, + { + "name": "len", + "type": "size_t", + "comment": "The length of the prefix." + } + ], + "argline": "git_oid *out, git_odb *db, const git_oid *short_id, size_t len", + "sig": "git_oid *::git_odb *::const git_oid *::size_t", + "return": { + "type": "int", + "comment": " 0 if found, GIT_ENOTFOUND if not found, GIT_EAMBIGUOUS if multiple\n matches were found, other value \n<\n 0 if there was a read error." + }, + "description": "

Determine if an object can be found in the object database by an\n abbreviated object ID.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_expand_ids": { + "type": "function", + "file": "git2/odb.h", + "line": 266, + "lineto": 269, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "The database to be searched for the given objects." + }, + { + "name": "ids", + "type": "git_odb_expand_id *", + "comment": "An array of short object IDs to search for" + }, + { + "name": "count", + "type": "size_t", + "comment": "The length of the `ids` array" + } + ], + "argline": "git_odb *db, git_odb_expand_id *ids, size_t count", + "sig": "git_odb *::git_odb_expand_id *::size_t", + "return": { + "type": "int", + "comment": " 0 on success or an error code on failure" + }, + "description": "

Determine if one or more objects can be found in the object database\n by their abbreviated object ID and type.

\n", + "comments": "

The given array will be updated in place: for each abbreviated ID that is unique in the database, and of the given type (if specified), the full object ID, object ID length (GIT_OID_SHA1_HEXSIZE) and type will be written back to the array. For IDs that are not found (or are ambiguous), the array entry will be zeroed.

\n\n

Note that since this function operates on multiple objects, the underlying database will not be asked to be reloaded if an object is not found (which is unlike other object database operations.)

\n", + "group": "odb" + }, + "git_odb_refresh": { + "type": "function", + "file": "git2/odb.h", + "line": 289, + "lineto": 289, + "args": [ + { + "name": "db", + "type": "struct git_odb *", + "comment": "database to refresh" + } + ], + "argline": "struct git_odb *db", + "sig": "struct git_odb *", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Refresh the object database to load newly added files.

\n", + "comments": "

If the object databases have changed on disk while the library is running, this function will force a reload of the underlying indexes.

\n\n

Use this function when you're confident that an external application has tampered with the ODB.

\n\n

NOTE that it is not necessary to call this function at all. The library will automatically attempt to refresh the ODB when a lookup fails, to see if the looked up object exists on disk but hasn't been loaded yet.

\n", + "group": "odb" + }, + "git_odb_foreach": { + "type": "function", + "file": "git2/odb.h", + "line": 304, + "lineto": 304, + "args": [ + { "name": "db", "type": "git_odb *", "comment": "database to use" }, + { + "name": "cb", + "type": "git_odb_foreach_cb", + "comment": "the callback to call for each object" + }, + { + "name": "payload", + "type": "void *", + "comment": "data to pass to the callback" + } + ], + "argline": "git_odb *db, git_odb_foreach_cb cb, void *payload", + "sig": "git_odb *::git_odb_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

List all objects available in the database

\n", + "comments": "

The callback will be called for each object available in the database. Note that the objects are likely to be returned in the index order, which would make accessing the objects in that order inefficient. Return a non-zero value from the callback to stop looping.

\n", + "group": "odb" + }, + "git_odb_write": { + "type": "function", + "file": "git2/odb.h", + "line": 324, + "lineto": 324, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the OID result of the write" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "object database where to store the object" + }, + { + "name": "data", + "type": "const void *", + "comment": "buffer with the data to store" + }, + { "name": "len", "type": "size_t", "comment": "size of the buffer" }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of the data to store" + } + ], + "argline": "git_oid *out, git_odb *odb, const void *data, size_t len, git_object_t type", + "sig": "git_oid *::git_odb *::const void *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an object directly into the ODB

\n", + "comments": "

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.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", + "group": "odb", + "examples": { "general.c": ["ex/v1.8.4/general.html#git_odb_write-43"] } + }, + "git_odb_open_wstream": { + "type": "function", + "file": "git2/odb.h", + "line": 347, + "lineto": 347, + "args": [ + { + "name": "out", + "type": "git_odb_stream **", + "comment": "pointer where to store the stream" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will write" + }, + { + "name": "size", + "type": "git_object_size_t", + "comment": "final size of the object that will be written" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "type of the object that will be written" + } + ], + "argline": "git_odb_stream **out, git_odb *db, git_object_size_t size, git_object_t type", + "sig": "git_odb_stream **::git_odb *::git_object_size_t::git_object_t", + "return": { + "type": "int", + "comment": " 0 if the stream was created; error code otherwise" + }, + "description": "

Open a stream to write an object into the ODB

\n", + "comments": "

The type and final length of the object must be specified when opening the stream.

\n\n

The returned stream will be of type GIT_STREAM_WRONLY, and it won't be effective until git_odb_stream_finalize_write is called and returns without an error

\n\n

The stream must always be freed when done with git_odb_stream_free or will leak memory.

\n", + "group": "odb" + }, + "git_odb_stream_write": { + "type": "function", + "file": "git2/odb.h", + "line": 360, + "lineto": 360, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + }, + { + "name": "buffer", + "type": "const char *", + "comment": "the data to write" + }, + { "name": "len", "type": "size_t", "comment": "the buffer's length" } + ], + "argline": "git_odb_stream *stream, const char *buffer, size_t len", + "sig": "git_odb_stream *::const char *::size_t", + "return": { + "type": "int", + "comment": " 0 if the write succeeded, error code otherwise" + }, + "description": "

Write to an odb stream

\n", + "comments": "

This method will fail if the total number of received bytes exceeds the size declared with git_odb_open_wstream()

\n", + "group": "odb" + }, + "git_odb_stream_finalize_write": { + "type": "function", + "file": "git2/odb.h", + "line": 375, + "lineto": 375, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer to store the resulting object's id" + }, + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + } + ], + "argline": "git_oid *out, git_odb_stream *stream", + "sig": "git_oid *::git_odb_stream *", + "return": { + "type": "int", + "comment": " 0 on success, an error code otherwise" + }, + "description": "

Finish writing to an odb stream

\n", + "comments": "

The object will take its final name and will be available to the odb.

\n\n

This method will fail if the total number of received bytes differs from the size declared with git_odb_open_wstream()

\n", + "group": "odb" + }, + "git_odb_stream_read": { + "type": "function", + "file": "git2/odb.h", + "line": 387, + "lineto": 387, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream" + }, + { + "name": "buffer", + "type": "char *", + "comment": "a user-allocated buffer to store the data in." + }, + { "name": "len", "type": "size_t", "comment": "the buffer's length" } + ], + "argline": "git_odb_stream *stream, char *buffer, size_t len", + "sig": "git_odb_stream *::char *::size_t", + "return": { + "type": "int", + "comment": " 0 if the read succeeded, error code otherwise" + }, + "description": "

Read from an odb stream

\n", + "comments": "

Most backends don't implement streaming reads

\n", + "group": "odb" + }, + "git_odb_stream_free": { + "type": "function", + "file": "git2/odb.h", + "line": 394, + "lineto": 394, + "args": [ + { + "name": "stream", + "type": "git_odb_stream *", + "comment": "the stream to free" + } + ], + "argline": "git_odb_stream *stream", + "sig": "git_odb_stream *", + "return": { "type": "void", "comment": null }, + "description": "

Free an odb stream

\n", + "comments": "", + "group": "odb" + }, + "git_odb_open_rstream": { + "type": "function", + "file": "git2/odb.h", + "line": 422, + "lineto": 427, + "args": [ + { + "name": "out", + "type": "git_odb_stream **", + "comment": "pointer where to store the stream" + }, + { + "name": "len", + "type": "size_t *", + "comment": "pointer where to store the length of the object" + }, + { + "name": "type", + "type": "git_object_t *", + "comment": "pointer where to store the type of the object" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will read from" + }, + { + "name": "oid", + "type": "const git_oid *", + "comment": "oid of the object the stream will read from" + } + ], + "argline": "git_odb_stream **out, size_t *len, git_object_t *type, git_odb *db, const git_oid *oid", + "sig": "git_odb_stream **::size_t *::git_object_t *::git_odb *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 if the stream was created, error code otherwise" + }, + "description": "

Open a stream to read an object from the ODB

\n", + "comments": "

Note that most backends do not support streaming reads because they store their objects as compressed/delta'ed blobs.

\n\n

It's recommended to use git_odb_read instead, which is assured to work on all backends.

\n\n

The returned stream will be of type GIT_STREAM_RDONLY and will have the following methods:

\n\n
    - stream->read: read `n` bytes from the stream      - stream->free: free the stream\n
\n\n

The stream must always be free'd or will leak memory.

\n", + "group": "odb" + }, + "git_odb_write_pack": { + "type": "function", + "file": "git2/odb.h", + "line": 448, + "lineto": 452, + "args": [ + { + "name": "out", + "type": "git_odb_writepack **", + "comment": "pointer to the writepack functions" + }, + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the stream will read from" + }, + { + "name": "progress_cb", + "type": "git_indexer_progress_cb", + "comment": "function to call with progress information.\n Be aware that this is called inline with network and indexing operations,\n so performance may be affected." + }, + { + "name": "progress_payload", + "type": "void *", + "comment": "payload for the progress callback" + } + ], + "argline": "git_odb_writepack **out, git_odb *db, git_indexer_progress_cb progress_cb, void *progress_payload", + "sig": "git_odb_writepack **::git_odb *::git_indexer_progress_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Open a stream for writing a pack file to the ODB.

\n", + "comments": "

If the ODB layer understands pack files, then the given packfile will likely be streamed directly to disk (and a corresponding index created). If the ODB layer does not understand pack files, the objects will be stored in whatever format the ODB layer uses.

\n", + "group": "odb" + }, + "git_odb_write_multi_pack_index": { + "type": "function", + "file": "git2/odb.h", + "line": 466, + "lineto": 467, + "args": [ + { + "name": "db", + "type": "git_odb *", + "comment": "object database where the `multi-pack-index` file will be written." + } + ], + "argline": "git_odb *db", + "sig": "git_odb *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Write a multi-pack-index file from all the .pack files in the ODB.

\n", + "comments": "

If the ODB layer understands pack files, then this will create a file called multi-pack-index next to the .pack and .idx files, which will contain an index of all objects stored in .pack files. This will allow for O(log n) lookup for n objects (regardless of how many packfiles there exist).

\n", + "group": "odb" + }, + "git_odb_object_dup": { + "type": "function", + "file": "git2/odb.h", + "line": 529, + "lineto": 529, + "args": [ + { + "name": "dest", + "type": "git_odb_object **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_odb_object *", + "comment": "object to copy" + } + ], + "argline": "git_odb_object **dest, git_odb_object *source", + "sig": "git_odb_object **::git_odb_object *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an odb_object

\n", + "comments": "

The returned copy must be manually freed with git_odb_object_free. Note that because of an implementation detail, the returned copy will be the same pointer as source: the object is internally refcounted, so the copy still needs to be freed twice.

\n", + "group": "odb" + }, + "git_odb_object_free": { + "type": "function", + "file": "git2/odb.h", + "line": 539, + "lineto": 539, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "object to close" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { "type": "void", "comment": null }, + "description": "

Close an ODB object

\n", + "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_object_free-22"], + "general.c": ["ex/v1.8.4/general.html#git_odb_object_free-44"] + } + }, + "git_odb_object_id": { + "type": "function", + "file": "git2/odb.h", + "line": 549, + "lineto": 549, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the OID" + }, + "description": "

Return the OID of an ODB object

\n", + "comments": "

This is the OID from which the object was read from

\n", + "group": "odb" + }, + "git_odb_object_data": { + "type": "function", + "file": "git2/odb.h", + "line": 562, + "lineto": 562, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { "type": "const void *", "comment": " a pointer to the data" }, + "description": "

Return the data of an ODB object

\n", + "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", + "group": "odb", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_odb_object_data-45"] + } + }, + "git_odb_object_size": { + "type": "function", + "file": "git2/odb.h", + "line": 573, + "lineto": 573, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { "type": "size_t", "comment": " the size" }, + "description": "

Return the size of an ODB object

\n", + "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", + "group": "odb", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_object_size-23"], + "general.c": ["ex/v1.8.4/general.html#git_odb_object_size-46"] + } + }, + "git_odb_object_type": { + "type": "function", + "file": "git2/odb.h", + "line": 581, + "lineto": 581, + "args": [ + { + "name": "object", + "type": "git_odb_object *", + "comment": "the object" + } + ], + "argline": "git_odb_object *object", + "sig": "git_odb_object *", + "return": { "type": "git_object_t", "comment": " the type" }, + "description": "

Return the type of an ODB object

\n", + "comments": "", + "group": "odb", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_odb_object_type-47"] + } + }, + "git_odb_add_backend": { + "type": "function", + "file": "git2/odb.h", + "line": 596, + "lineto": 596, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "backend", + "type": "git_odb_backend *", + "comment": "pointer to a git_odb_backend instance" + }, + { + "name": "priority", + "type": "int", + "comment": "Value for ordering the backends queue" + } + ], + "argline": "git_odb *odb, git_odb_backend *backend, int priority", + "sig": "git_odb *::git_odb_backend *::int", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add a custom backend to an existing Object DB

\n", + "comments": "

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Read for more information.

\n", + "group": "odb" + }, + "git_odb_add_alternate": { + "type": "function", + "file": "git2/odb.h", + "line": 617, + "lineto": 617, + "args": [ + { + "name": "odb", + "type": "git_odb *", + "comment": "database to add the backend to" + }, + { + "name": "backend", + "type": "git_odb_backend *", + "comment": "pointer to a git_odb_backend instance" + }, + { + "name": "priority", + "type": "int", + "comment": "Value for ordering the backends queue" + } + ], + "argline": "git_odb *odb, git_odb_backend *backend, int priority", + "sig": "git_odb *::git_odb_backend *::int", + "return": { + "type": "int", + "comment": " 0 on success, error code otherwise" + }, + "description": "

Add a custom backend to an existing Object DB; this\n backend will work as an alternate.

\n", + "comments": "

Alternate backends are always checked for objects after all the main backends have been exhausted.

\n\n

The backends are checked in relative ordering, based on the value of the priority parameter.

\n\n

Writing is disabled on alternate backends.

\n\n

Read for more information.

\n", + "group": "odb" + }, + "git_odb_num_backends": { + "type": "function", + "file": "git2/odb.h", + "line": 625, + "lineto": 625, + "args": [ + { "name": "odb", "type": "git_odb *", "comment": "object database" } + ], + "argline": "git_odb *odb", + "sig": "git_odb *", + "return": { + "type": "size_t", + "comment": " number of backends in the ODB" + }, + "description": "

Get the number of ODB backend objects

\n", + "comments": "", + "group": "odb" + }, + "git_odb_get_backend": { + "type": "function", + "file": "git2/odb.h", + "line": 635, + "lineto": 635, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "output pointer to ODB backend at pos" + }, + { "name": "odb", "type": "git_odb *", "comment": "object database" }, + { + "name": "pos", + "type": "size_t", + "comment": "index into object database backend list" + } + ], + "argline": "git_odb_backend **out, git_odb *odb, size_t pos", + "sig": "git_odb_backend **::git_odb *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if pos is invalid, other errors \n<\n 0" + }, + "description": "

Lookup an ODB backend object by index

\n", + "comments": "", + "group": "odb" + }, + "git_odb_set_commit_graph": { + "type": "function", + "file": "git2/odb.h", + "line": 650, + "lineto": 650, + "args": [ + { "name": "odb", "type": "git_odb *", "comment": "object database" }, + { + "name": "cgraph", + "type": "git_commit_graph *", + "comment": "the git commit-graph" + } + ], + "argline": "git_odb *odb, git_commit_graph *cgraph", + "sig": "git_odb *::git_commit_graph *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Set the git commit-graph for the ODB.

\n", + "comments": "

After a successful call, the ownership of the cgraph parameter will be transferred to libgit2, and the caller should not free it.

\n\n

The commit-graph can also be unset by explicitly passing NULL as the cgraph parameter.

\n", + "group": "odb" + }, + "git_oid_fmt": { + "type": "function", + "file": "git2/oid.h", + "line": 188, + "lineto": 188, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes for SHA1,\n\t\t64 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it is\n\t\trequired." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, const git_oid *id", + "sig": "char *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Format a git_oid into a hex string.

\n", + "comments": "", + "group": "oid", + "examples": { + "fetch.c": [ + "ex/v1.8.4/fetch.html#git_oid_fmt-1", + "ex/v1.8.4/fetch.html#git_oid_fmt-2" + ], + "general.c": [ + "ex/v1.8.4/general.html#git_oid_fmt-48", + "ex/v1.8.4/general.html#git_oid_fmt-49", + "ex/v1.8.4/general.html#git_oid_fmt-50", + "ex/v1.8.4/general.html#git_oid_fmt-51", + "ex/v1.8.4/general.html#git_oid_fmt-52" + ], + "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_oid_fmt-1"] + } + }, + "git_oid_nfmt": { + "type": "function", + "file": "git2/oid.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; you say how many bytes to write.\n\t\tIf the number of bytes is > GIT_OID_SHA1_HEXSIZE, extra bytes\n\t\twill be zeroed; if not, a '\n\\\n0' terminator is NOT added." + }, + { + "name": "n", + "type": "size_t", + "comment": "number of characters to write into out string" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, size_t n, const git_oid *id", + "sig": "char *::size_t::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Format a git_oid into a partial hex string.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_pathfmt": { + "type": "function", + "file": "git2/oid.h", + "line": 217, + "lineto": 217, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "output hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (41 bytes for SHA1,\n\t\t65 bytes for SHA256). Only the oid digits are written;\n\t\ta '\n\\\n0' terminator must be added by the caller if it\n\t\tis required." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure to format." + } + ], + "argline": "char *out, const git_oid *id", + "sig": "char *::const git_oid *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Format a git_oid into a loose-object path string.

\n", + "comments": "

The resulting string is "aa/...", where "aa" is the first two hex digits of the oid and "..." is the remaining 38 digits.

\n", + "group": "oid" + }, + "git_oid_tostr_s": { + "type": "function", + "file": "git2/oid.h", + "line": 230, + "lineto": 230, + "args": [ + { + "name": "oid", + "type": "const git_oid *", + "comment": "The oid structure to format" + } + ], + "argline": "const git_oid *oid", + "sig": "const git_oid *", + "return": { + "type": "char *", + "comment": " the c-string or NULL on failure" + }, + "description": "

Format a git_oid into a statically allocated c-string.

\n", + "comments": "

The c-string is owned by the library and should not be freed by the user. If libgit2 is built with thread support, the string will be stored in TLS (i.e. one buffer per thread) to allow for concurrent calls of the function.

\n", + "group": "oid", + "examples": { + "merge.c": [ + "ex/v1.8.4/merge.html#git_oid_tostr_s-19", + "ex/v1.8.4/merge.html#git_oid_tostr_s-20" + ] + } + }, + "git_oid_tostr": { + "type": "function", + "file": "git2/oid.h", + "line": 251, + "lineto": 251, + "args": [ + { + "name": "out", + "type": "char *", + "comment": "the buffer into which the oid string is output." + }, + { + "name": "n", + "type": "size_t", + "comment": "the size of the out buffer." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the oid structure to format." + } + ], + "argline": "char *out, size_t n, const git_oid *id", + "sig": "char *::size_t::const git_oid *", + "return": { + "type": "char *", + "comment": " the out buffer pointer, assuming no input parameter\n\t\t\terrors, otherwise a pointer to an empty string." + }, + "description": "

Format a git_oid into a buffer as a hex format c-string.

\n", + "comments": "

If the buffer is smaller than the size of a hex-formatted oid string plus an additional byte (GIT_OID_SHA_HEXSIZE + 1 for SHA1 or GIT_OID_SHA256_HEXSIZE + 1 for SHA256), then the resulting oid c-string will be truncated to n-1 characters (but will still be NUL-byte terminated).

\n\n

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.

\n", + "group": "oid", + "examples": { + "blame.c": [ + "ex/v1.8.4/blame.html#git_oid_tostr-16", + "ex/v1.8.4/blame.html#git_oid_tostr-17" + ], + "cat-file.c": [ + "ex/v1.8.4/cat-file.html#git_oid_tostr-24", + "ex/v1.8.4/cat-file.html#git_oid_tostr-25", + "ex/v1.8.4/cat-file.html#git_oid_tostr-26", + "ex/v1.8.4/cat-file.html#git_oid_tostr-27", + "ex/v1.8.4/cat-file.html#git_oid_tostr-28" + ], + "log.c": [ + "ex/v1.8.4/log.html#git_oid_tostr-38", + "ex/v1.8.4/log.html#git_oid_tostr-39" + ], + "rev-parse.c": [ + "ex/v1.8.4/rev-parse.html#git_oid_tostr-10", + "ex/v1.8.4/rev-parse.html#git_oid_tostr-11", + "ex/v1.8.4/rev-parse.html#git_oid_tostr-12", + "ex/v1.8.4/rev-parse.html#git_oid_tostr-13" + ] + } + }, + "git_oid_cpy": { + "type": "function", + "file": "git2/oid.h", + "line": 260, + "lineto": 260, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "src", + "type": "const git_oid *", + "comment": "oid structure to copy from." + } + ], + "argline": "git_oid *out, const git_oid *src", + "sig": "git_oid *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Copy an oid from one structure to another.

\n", + "comments": "", + "group": "oid", + "examples": { + "blame.c": [ + "ex/v1.8.4/blame.html#git_oid_cpy-18", + "ex/v1.8.4/blame.html#git_oid_cpy-19", + "ex/v1.8.4/blame.html#git_oid_cpy-20" + ] + } + }, + "git_oid_cmp": { + "type": "function", + "file": "git2/oid.h", + "line": 269, + "lineto": 269, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + } + ], + "argline": "const git_oid *a, const git_oid *b", + "sig": "const git_oid *::const git_oid *", + "return": { + "type": "int", + "comment": " \n<\n0, 0, >0 if a \n<\n b, a == b, a > b." + }, + "description": "

Compare two oid structures.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_equal": { + "type": "function", + "file": "git2/oid.h", + "line": 278, + "lineto": 278, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + } + ], + "argline": "const git_oid *a, const git_oid *b", + "sig": "const git_oid *::const git_oid *", + "return": { "type": "int", "comment": " true if equal, false otherwise" }, + "description": "

Compare two oid structures for equality

\n", + "comments": "", + "group": "oid" + }, + "git_oid_ncmp": { + "type": "function", + "file": "git2/oid.h", + "line": 289, + "lineto": 289, + "args": [ + { + "name": "a", + "type": "const git_oid *", + "comment": "first oid structure." + }, + { + "name": "b", + "type": "const git_oid *", + "comment": "second oid structure." + }, + { + "name": "len", + "type": "size_t", + "comment": "the number of hex chars to compare" + } + ], + "argline": "const git_oid *a, const git_oid *b, size_t len", + "sig": "const git_oid *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 in case of a match" }, + "description": "

Compare the first 'len' hexadecimal characters (packets of 4 bits)\n of two oid structures.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_streq": { + "type": "function", + "file": "git2/oid.h", + "line": 298, + "lineto": 298, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of an object id." + } + ], + "argline": "const git_oid *id, const char *str", + "sig": "const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 in case of a match, -1 otherwise." + }, + "description": "

Check if an oid equals an hex formatted object id.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_strcmp": { + "type": "function", + "file": "git2/oid.h", + "line": 308, + "lineto": 308, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "oid structure." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of an object id." + } + ], + "argline": "const git_oid *id, const char *str", + "sig": "const git_oid *::const char *", + "return": { + "type": "int", + "comment": " -1 if str is not valid, \n<\n0 if id sorts before str,\n 0 if id matches str, >0 if id sorts after str." + }, + "description": "

Compare an oid to an hex formatted object id.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_is_zero": { + "type": "function", + "file": "git2/oid.h", + "line": 315, + "lineto": 315, + "args": [{ "name": "id", "type": "const git_oid *", "comment": null }], + "argline": "const git_oid *id", + "sig": "const git_oid *", + "return": { "type": "int", "comment": " 1 if all zeros, 0 otherwise." }, + "description": "

Check is an oid is all zeros.

\n", + "comments": "", + "group": "oid", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_oid_is_zero-21"], + "fetch.c": ["ex/v1.8.4/fetch.html#git_oid_is_zero-3"] + } + }, + "git_oid_shorten_new": { + "type": "function", + "file": "git2/oid.h", + "line": 336, + "lineto": 336, + "args": [ + { + "name": "min_length", + "type": "size_t", + "comment": "The minimal length for all identifiers,\n\t\twhich will be used even if shorter OIDs would still\n\t\tbe unique." + } + ], + "argline": "size_t min_length", + "sig": "size_t", + "return": { + "type": "git_oid_shorten *", + "comment": " a `git_oid_shorten` instance, NULL if OOM" + }, + "description": "

Create a new OID shortener.

\n", + "comments": "

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.

\n\n

E.g. look at the result of git log --abbrev.

\n", + "group": "oid" + }, + "git_oid_shorten_add": { + "type": "function", + "file": "git2/oid.h", + "line": 362, + "lineto": 362, + "args": [ + { + "name": "os", + "type": "git_oid_shorten *", + "comment": "a `git_oid_shorten` instance" + }, + { + "name": "text_id", + "type": "const char *", + "comment": "an OID in text form" + } + ], + "argline": "git_oid_shorten *os, const char *text_id", + "sig": "git_oid_shorten *::const char *", + "return": { + "type": "int", + "comment": " the minimal length to uniquely identify all OIDs\n\t\tadded so far to the set; or an error code (\n<\n0) if an\n\t\terror occurs." + }, + "description": "

Add a new OID to set of shortened OIDs and calculate\n the minimal length to uniquely identify all the OIDs in\n the set.

\n", + "comments": "

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.

\n\n

For performance reasons, there is a hard-limit of how many OIDs can be added to a single set (around ~32000, assuming a mostly randomized distribution), which should be enough for any kind of program, and keeps the algorithm fast and memory-efficient.

\n\n

Attempting to add more than those OIDs will result in a GIT_ERROR_INVALID error

\n", + "group": "oid" + }, + "git_oid_shorten_free": { + "type": "function", + "file": "git2/oid.h", + "line": 369, + "lineto": 369, + "args": [ + { + "name": "os", + "type": "git_oid_shorten *", + "comment": "a `git_oid_shorten` instance" + } + ], + "argline": "git_oid_shorten *os", + "sig": "git_oid_shorten *", + "return": { "type": "void", "comment": null }, + "description": "

Free an OID shortener instance

\n", + "comments": "", + "group": "oid" + }, + "git_oidarray_dispose": { + "type": "function", + "file": "git2/oidarray.h", + "line": 31, + "lineto": 31, + "args": [ + { + "name": "array", + "type": "git_oidarray *", + "comment": "git_oidarray from which to free oid data" + } + ], + "argline": "git_oidarray *array", + "sig": "git_oidarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the object IDs contained in an oid_array. This method should\n be called on git_oidarray objects that were provided by the\n library. Not doing so will result in a memory leak.

\n", + "comments": "

This does not free the git_oidarray itself, since the library will never allocate that object directly itself.

\n", + "group": "oidarray" + }, + "git_packbuilder_new": { + "type": "function", + "file": "git2/pack.h", + "line": 65, + "lineto": 65, + "args": [ + { + "name": "out", + "type": "git_packbuilder **", + "comment": "The new packbuilder object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + } + ], + "argline": "git_packbuilder **out, git_repository *repo", + "sig": "git_packbuilder **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Initialize a new packbuilder

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_set_threads": { + "type": "function", + "file": "git2/pack.h", + "line": 78, + "lineto": 78, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "n", + "type": "unsigned int", + "comment": "Number of threads to spawn" + } + ], + "argline": "git_packbuilder *pb, unsigned int n", + "sig": "git_packbuilder *::unsigned int", + "return": { + "type": "unsigned int", + "comment": " number of actual threads to be used" + }, + "description": "

Set number of threads to spawn

\n", + "comments": "

By default, libgit2 won't spawn any threads at all; when set to 0, libgit2 will autodetect the number of CPUs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert": { + "type": "function", + "file": "git2/pack.h", + "line": 92, + "lineto": 92, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the commit" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name; might be NULL" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id, const char *name", + "sig": "git_packbuilder *::const git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert a single object

\n", + "comments": "

For an optimal pack it's mandatory to insert objects in recency order, commits followed by trees and blobs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_tree": { + "type": "function", + "file": "git2/pack.h", + "line": 104, + "lineto": 104, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the root tree" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id", + "sig": "git_packbuilder *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert a root tree object

\n", + "comments": "

This will add the tree as well as all referenced trees and blobs.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_commit": { + "type": "function", + "file": "git2/pack.h", + "line": 116, + "lineto": 116, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The oid of the commit" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id", + "sig": "git_packbuilder *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert a commit object

\n", + "comments": "

This will add a commit as well as the completed referenced tree.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_walk": { + "type": "function", + "file": "git2/pack.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revwalk to use to fill the packbuilder" + } + ], + "argline": "git_packbuilder *pb, git_revwalk *walk", + "sig": "git_packbuilder *::git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Insert objects as given by the walk

\n", + "comments": "

Those commits and all objects they reference will be inserted into the packbuilder.

\n", + "group": "packbuilder" + }, + "git_packbuilder_insert_recur": { + "type": "function", + "file": "git2/pack.h", + "line": 141, + "lineto": 141, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the id of the root object to insert" + }, + { + "name": "name", + "type": "const char *", + "comment": "optional name for the object" + } + ], + "argline": "git_packbuilder *pb, const git_oid *id, const char *name", + "sig": "git_packbuilder *::const git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Recursively insert an object and its referenced objects

\n", + "comments": "

Insert the object as well as any object it references.

\n", + "group": "packbuilder" + }, + "git_packbuilder_write_buf": { + "type": "function", + "file": "git2/pack.h", + "line": 153, + "lineto": 153, + "args": [ + { + "name": "buf", + "type": "git_buf *", + "comment": "Buffer where to write the packfile" + }, + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + } + ], + "argline": "git_buf *buf, git_packbuilder *pb", + "sig": "git_buf *::git_packbuilder *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write the contents of the packfile to an in-memory buffer

\n", + "comments": "

The contents of the buffer will become a valid packfile, even though there will be no attached index

\n", + "group": "packbuilder" + }, + "git_packbuilder_write": { + "type": "function", + "file": "git2/pack.h", + "line": 166, + "lineto": 171, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the directory where the packfile and index should be stored, or NULL for default location" + }, + { + "name": "mode", + "type": "unsigned int", + "comment": "permissions to use creating a packfile or 0 for defaults" + }, + { + "name": "progress_cb", + "type": "git_indexer_progress_cb", + "comment": "function to call with progress information from the indexer (optional)" + }, + { + "name": "progress_cb_payload", + "type": "void *", + "comment": "payload for the progress callback (optional)" + } + ], + "argline": "git_packbuilder *pb, const char *path, unsigned int mode, git_indexer_progress_cb progress_cb, void *progress_cb_payload", + "sig": "git_packbuilder *::const char *::unsigned int::git_indexer_progress_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write the new pack and corresponding index file to path.

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_hash": { + "type": "function", + "file": "git2/pack.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder object" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { "type": "const git_oid *", "comment": " 0 or an error code" }, + "description": "

Get the packfile's hash

\n", + "comments": "

A packfile's name is derived from the sorted hashing of all object names. This is only correct after the packfile has been written.

\n", + "group": "packbuilder" + }, + "git_packbuilder_name": { + "type": "function", + "file": "git2/pack.h", + "line": 196, + "lineto": 196, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder instance" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "const char *", + "comment": " a NUL terminated string for the packfile name" + }, + "description": "

Get the unique name for the resulting packfile.

\n", + "comments": "

The packfile's name is derived from the packfile's content. This is only correct after the packfile has been written.

\n", + "group": "packbuilder" + }, + "git_packbuilder_foreach": { + "type": "function", + "file": "git2/pack.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + }, + { + "name": "cb", + "type": "git_packbuilder_foreach_cb", + "comment": "the callback to call with each packed object's buffer" + }, + { + "name": "payload", + "type": "void *", + "comment": "the callback's data" + } + ], + "argline": "git_packbuilder *pb, git_packbuilder_foreach_cb cb, void *payload", + "sig": "git_packbuilder *::git_packbuilder_foreach_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create the new pack and pass each object to the callback

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_object_count": { + "type": "function", + "file": "git2/pack.h", + "line": 226, + "lineto": 226, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "size_t", + "comment": " the number of objects in the packfile" + }, + "description": "

Get the total number of objects the packbuilder will write out

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_written": { + "type": "function", + "file": "git2/pack.h", + "line": 234, + "lineto": 234, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "the packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { + "type": "size_t", + "comment": " the number of objects which have already been written" + }, + "description": "

Get the number of objects the packbuilder has already written out

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_set_callbacks": { + "type": "function", + "file": "git2/pack.h", + "line": 253, + "lineto": 256, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder object" + }, + { + "name": "progress_cb", + "type": "git_packbuilder_progress", + "comment": "Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected." + }, + { + "name": "progress_cb_payload", + "type": "void *", + "comment": "Payload for progress callback." + } + ], + "argline": "git_packbuilder *pb, git_packbuilder_progress progress_cb, void *progress_cb_payload", + "sig": "git_packbuilder *::git_packbuilder_progress::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the callbacks for a packbuilder

\n", + "comments": "", + "group": "packbuilder" + }, + "git_packbuilder_free": { + "type": "function", + "file": "git2/pack.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "pb", + "type": "git_packbuilder *", + "comment": "The packbuilder" + } + ], + "argline": "git_packbuilder *pb", + "sig": "git_packbuilder *", + "return": { "type": "void", "comment": null }, + "description": "

Free the packbuilder and all associated data

\n", + "comments": "", + "group": "packbuilder" + }, + "git_patch_owner": { + "type": "function", + "file": "git2/patch.h", + "line": 37, + "lineto": 37, + "args": [ + { "name": "patch", "type": "const git_patch *", "comment": "the patch" } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repository" + }, + "description": "

Get the repository associated with this patch. May be NULL.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_from_diff": { + "type": "function", + "file": "git2/patch.h", + "line": 59, + "lineto": 60, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "Output parameter for the delta patch object" + }, + { "name": "diff", "type": "git_diff *", "comment": "Diff list object" }, + { "name": "idx", "type": "size_t", "comment": "Index into diff list" } + ], + "argline": "git_patch **out, git_diff *diff, size_t idx", + "sig": "git_patch **::git_diff *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, other value \n<\n 0 on error" + }, + "description": "

Return a patch for an entry in the diff list.

\n", + "comments": "

The git_patch is a newly created object contains the text diffs for the delta. You have to call git_patch_free() when you are done with it. You can use the patch object to loop over all the hunks and lines in the diff of the one delta.

\n\n

For an unchanged file or a binary file, no git_patch will be created, the output will be set to NULL, and the binary flag will be set true in the git_diff_delta structure.

\n\n

It is okay to pass NULL for either of the output parameters; if you pass NULL for the git_patch, then the text diff will not be calculated.

\n", + "group": "patch" + }, + "git_patch_from_blobs": { + "type": "function", + "file": "git2/patch.h", + "line": 78, + "lineto": 84, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "new_blob", + "type": "const git_blob *", + "comment": "Blob for new side of diff, or NULL for empty blob" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat new blob as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const git_blob *new_blob, const char *new_as_path, const git_diff_options *opts", + "sig": "git_patch **::const git_blob *::const char *::const git_blob *::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between two blobs.

\n", + "comments": "

This is just like git_diff_blobs() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch" + }, + "git_patch_from_blob_and_buffer": { + "type": "function", + "file": "git2/patch.h", + "line": 103, + "lineto": 110, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_blob", + "type": "const git_blob *", + "comment": "Blob for old side of diff, or NULL for empty blob" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old blob as if it had this filename; can be NULL" + }, + { + "name": "buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "buffer_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "buffer_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const git_blob *old_blob, const char *old_as_path, const void *buffer, size_t buffer_len, const char *buffer_as_path, const git_diff_options *opts", + "sig": "git_patch **::const git_blob *::const char *::const void *::size_t::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between a blob and a buffer.

\n", + "comments": "

This is just like git_diff_blob_to_buffer() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch" + }, + "git_patch_from_buffers": { + "type": "function", + "file": "git2/patch.h", + "line": 130, + "lineto": 138, + "args": [ + { + "name": "out", + "type": "git_patch **", + "comment": "The generated patch; NULL on error" + }, + { + "name": "old_buffer", + "type": "const void *", + "comment": "Raw data for old side of diff, or NULL for empty" + }, + { + "name": "old_len", + "type": "size_t", + "comment": "Length of the raw data for old side of the diff" + }, + { + "name": "old_as_path", + "type": "const char *", + "comment": "Treat old buffer as if it had this filename; can be NULL" + }, + { + "name": "new_buffer", + "type": "const void *", + "comment": "Raw data for new side of diff, or NULL for empty" + }, + { + "name": "new_len", + "type": "size_t", + "comment": "Length of raw data for new side of diff" + }, + { + "name": "new_as_path", + "type": "const char *", + "comment": "Treat buffer as if it had this filename; can be NULL" + }, + { + "name": "opts", + "type": "const git_diff_options *", + "comment": "Options for diff, or NULL for default options" + } + ], + "argline": "git_patch **out, const void *old_buffer, size_t old_len, const char *old_as_path, const void *new_buffer, size_t new_len, const char *new_as_path, const git_diff_options *opts", + "sig": "git_patch **::const void *::size_t::const char *::const void *::size_t::const char *::const git_diff_options *", + "return": { + "type": "int", + "comment": " 0 on success or error code \n<\n 0" + }, + "description": "

Directly generate a patch from the difference between two buffers.

\n", + "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", + "group": "patch", + "examples": { + "diff.c": ["ex/v1.8.4/diff.html#git_patch_from_buffers-16"] + } + }, + "git_patch_free": { + "type": "function", + "file": "git2/patch.h", + "line": 145, + "lineto": 145, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "The patch to free." + } + ], + "argline": "git_patch *patch", + "sig": "git_patch *", + "return": { "type": "void", "comment": null }, + "description": "

Free a git_patch object.

\n", + "comments": "", + "group": "patch", + "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_patch_free-17"] } + }, + "git_patch_get_delta": { + "type": "function", + "file": "git2/patch.h", + "line": 154, + "lineto": 154, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The patch in which to get the delta." + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "const git_diff_delta *", + "comment": " The delta associated with the patch." + }, + "description": "

Get the delta associated with a patch. This delta points to internal\n data and you do not have to release it when you are done with it.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_num_hunks": { + "type": "function", + "file": "git2/patch.h", + "line": 162, + "lineto": 162, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The patch in which to get the number of hunks." + } + ], + "argline": "const git_patch *patch", + "sig": "const git_patch *", + "return": { + "type": "size_t", + "comment": " The number of hunks of the patch." + }, + "description": "

Get the number of hunks in a patch

\n", + "comments": "", + "group": "patch" + }, + "git_patch_line_stats": { + "type": "function", + "file": "git2/patch.h", + "line": 180, + "lineto": 184, + "args": [ + { + "name": "total_context", + "type": "size_t *", + "comment": "Count of context lines in output, can be NULL." + }, + { + "name": "total_additions", + "type": "size_t *", + "comment": "Count of addition lines in output, can be NULL." + }, + { + "name": "total_deletions", + "type": "size_t *", + "comment": "Count of deletion lines in output, can be NULL." + }, + { + "name": "patch", + "type": "const git_patch *", + "comment": "The git_patch object" + } + ], + "argline": "size_t *total_context, size_t *total_additions, size_t *total_deletions, const git_patch *patch", + "sig": "size_t *::size_t *::size_t *::const git_patch *", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Get line counts of each type in a patch.

\n", + "comments": "

This helps imitate a diff --numstat type of output. For that purpose, you only need the total_additions and total_deletions values, but we include the total_context line count in case you want the total number of lines of diff output that will be generated.

\n\n

All outputs are optional. Pass NULL if you don't need a particular count.

\n", + "group": "patch" + }, + "git_patch_get_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 199, + "lineto": 203, + "args": [ + { + "name": "out", + "type": "const git_diff_hunk **", + "comment": "Output pointer to git_diff_hunk of hunk" + }, + { + "name": "lines_in_hunk", + "type": "size_t *", + "comment": "Output count of total lines in this hunk" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "Input pointer to patch object" + }, + { + "name": "hunk_idx", + "type": "size_t", + "comment": "Input index of hunk to get information about" + } + ], + "argline": "const git_diff_hunk **out, size_t *lines_in_hunk, git_patch *patch, size_t hunk_idx", + "sig": "const git_diff_hunk **::size_t *::git_patch *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if hunk_idx out of range, \n<\n0 on error" + }, + "description": "

Get the information about a hunk in a patch

\n", + "comments": "

Given a patch and a hunk index into the patch, this returns detailed information about that hunk. Any of the output pointers can be passed as NULL if you don't care about that particular piece of information.

\n", + "group": "patch" + }, + "git_patch_num_lines_in_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 212, + "lineto": 214, + "args": [ + { + "name": "patch", + "type": "const git_patch *", + "comment": "The git_patch object" + }, + { "name": "hunk_idx", "type": "size_t", "comment": "Index of the hunk" } + ], + "argline": "const git_patch *patch, size_t hunk_idx", + "sig": "const git_patch *::size_t", + "return": { + "type": "int", + "comment": " Number of lines in hunk or GIT_ENOTFOUND if invalid hunk index" + }, + "description": "

Get the number of lines in a hunk.

\n", + "comments": "", + "group": "patch" + }, + "git_patch_get_line_in_hunk": { + "type": "function", + "file": "git2/patch.h", + "line": 230, + "lineto": 234, + "args": [ + { + "name": "out", + "type": "const git_diff_line **", + "comment": "The git_diff_line data for this line" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "The patch to look in" + }, + { + "name": "hunk_idx", + "type": "size_t", + "comment": "The index of the hunk" + }, + { + "name": "line_of_hunk", + "type": "size_t", + "comment": "The index of the line in the hunk" + } + ], + "argline": "const git_diff_line **out, git_patch *patch, size_t hunk_idx, size_t line_of_hunk", + "sig": "const git_diff_line **::git_patch *::size_t::size_t", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Get data about a line in a hunk of a patch.

\n", + "comments": "

Given a patch, a hunk index, and a line index in the hunk, this will return a lot of details about that line. If you pass a hunk index larger than the number of hunks or a line index larger than the number of lines in the hunk, this will return -1.

\n", + "group": "patch" + }, + "git_patch_size": { + "type": "function", + "file": "git2/patch.h", + "line": 252, + "lineto": 256, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + }, + { + "name": "include_context", + "type": "int", + "comment": "Include context lines in size if non-zero" + }, + { + "name": "include_hunk_headers", + "type": "int", + "comment": "Include hunk header lines if non-zero" + }, + { + "name": "include_file_headers", + "type": "int", + "comment": "Include file header lines if non-zero" + } + ], + "argline": "git_patch *patch, int include_context, int include_hunk_headers, int include_file_headers", + "sig": "git_patch *::int::int::int", + "return": { "type": "size_t", "comment": " The number of bytes of data" }, + "description": "

Look up size of patch diff data in bytes

\n", + "comments": "

This returns the raw size of the patch data. This only includes the actual data from the lines of the diff, not the file or hunk headers.

\n\n

If you pass include_context as true (non-zero), this will be the size of all of the diff output; if you pass it as false (zero), this will only include the actual changed lines (as if context_lines was 0).

\n", + "group": "patch" + }, + "git_patch_print": { + "type": "function", + "file": "git2/patch.h", + "line": 270, + "lineto": 273, + "args": [ + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + }, + { + "name": "print_cb", + "type": "git_diff_line_cb", + "comment": "Callback function to output lines of the patch. Will be\n called for file headers, hunk headers, and diff lines." + }, + { + "name": "payload", + "type": "void *", + "comment": "Reference pointer that will be passed to your callbacks." + } + ], + "argline": "git_patch *patch, git_diff_line_cb print_cb, void *payload", + "sig": "git_patch *::git_diff_line_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Serialize the patch to text via callback.

\n", + "comments": "

Returning a non-zero value from the callback will terminate the iteration and return that value to the caller.

\n", + "group": "patch" + }, + "git_patch_to_buf": { + "type": "function", + "file": "git2/patch.h", + "line": 282, + "lineto": 284, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "The git_buf to be filled in" + }, + { + "name": "patch", + "type": "git_patch *", + "comment": "A git_patch representing changes to one file" + } + ], + "argline": "git_buf *out, git_patch *patch", + "sig": "git_buf *::git_patch *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Get the content of a patch as a single diff text.

\n", + "comments": "", + "group": "patch", + "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_patch_to_buf-18"] } + }, + "git_pathspec_new": { + "type": "function", + "file": "git2/pathspec.h", + "line": 82, + "lineto": 83, + "args": [ + { + "name": "out", + "type": "git_pathspec **", + "comment": "Output of the compiled pathspec" + }, + { + "name": "pathspec", + "type": "const git_strarray *", + "comment": "A git_strarray of the paths to match" + } + ], + "argline": "git_pathspec **out, const git_strarray *pathspec", + "sig": "git_pathspec **::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Compile a pathspec

\n", + "comments": "", + "group": "pathspec", + "examples": { "log.c": ["ex/v1.8.4/log.html#git_pathspec_new-40"] } + }, + "git_pathspec_free": { + "type": "function", + "file": "git2/pathspec.h", + "line": 90, + "lineto": 90, + "args": [ + { + "name": "ps", + "type": "git_pathspec *", + "comment": "The compiled pathspec" + } + ], + "argline": "git_pathspec *ps", + "sig": "git_pathspec *", + "return": { "type": "void", "comment": null }, + "description": "

Free a pathspec

\n", + "comments": "", + "group": "pathspec", + "examples": { "log.c": ["ex/v1.8.4/log.html#git_pathspec_free-41"] } + }, + "git_pathspec_matches_path": { + "type": "function", + "file": "git2/pathspec.h", + "line": 105, + "lineto": 106, + "args": [ + { + "name": "ps", + "type": "const git_pathspec *", + "comment": "The compiled pathspec" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "path", + "type": "const char *", + "comment": "The pathname to attempt to match" + } + ], + "argline": "const git_pathspec *ps, uint32_t flags, const char *path", + "sig": "const git_pathspec *::uint32_t::const char *", + "return": { + "type": "int", + "comment": " 1 is path matches spec, 0 if it does not" + }, + "description": "

Try to match a path against a pathspec

\n", + "comments": "

Unlike most of the other pathspec matching functions, this will not fall back on the native case-sensitivity for your platform. You must explicitly pass flags to control case sensitivity or else this will fall back on being case sensitive.

\n", + "group": "pathspec" + }, + "git_pathspec_match_workdir": { + "type": "function", + "file": "git2/pathspec.h", + "line": 130, + "lineto": 134, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which to match; bare repo is an error" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_repository *repo, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_repository *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag was given" + }, + "description": "

Match a pathspec against the working directory of a repository.

\n", + "comments": "

This matches the pathspec against the current files in the working directory of the repository. It is an error to invoke this on a bare repo. This handles git ignores (i.e. ignored files will not be considered to match the pathspec unless the file is tracked in the index).

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_index": { + "type": "function", + "file": "git2/pathspec.h", + "line": 159, + "lineto": 163, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "index", + "type": "git_index *", + "comment": "The index to match against" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_index *index, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_index *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against entries in an index.

\n", + "comments": "

This matches the pathspec against the files in the repository index.

\n\n

NOTE: At the moment, the case sensitivity of this match is controlled by the current case-sensitivity of the index object itself and the USE_CASE and IGNORE_CASE flags will have no effect. This behavior will be corrected in a future release.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_tree": { + "type": "function", + "file": "git2/pathspec.h", + "line": 183, + "lineto": 187, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "tree", + "type": "git_tree *", + "comment": "The root-level tree to match against" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_tree *tree, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_tree *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against files in a tree.

\n", + "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec", + "examples": { "log.c": ["ex/v1.8.4/log.html#git_pathspec_match_tree-42"] } + }, + "git_pathspec_match_diff": { + "type": "function", + "file": "git2/pathspec.h", + "line": 207, + "lineto": 211, + "args": [ + { + "name": "out", + "type": "git_pathspec_match_list **", + "comment": "Output list of matches; pass NULL to just get return value" + }, + { + "name": "diff", + "type": "git_diff *", + "comment": "A generated diff list" + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Combination of git_pathspec_flag_t options to control match" + }, + { + "name": "ps", + "type": "git_pathspec *", + "comment": "Pathspec to be matched" + } + ], + "argline": "git_pathspec_match_list **out, git_diff *diff, uint32_t flags, git_pathspec *ps", + "sig": "git_pathspec_match_list **::git_diff *::uint32_t::git_pathspec *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, GIT_ENOTFOUND if no matches and\n the GIT_PATHSPEC_NO_MATCH_ERROR flag is used" + }, + "description": "

Match a pathspec against files in a diff list.

\n", + "comments": "

This matches the pathspec against the files in the given diff list.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_free": { + "type": "function", + "file": "git2/pathspec.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "m", + "type": "git_pathspec_match_list *", + "comment": "The git_pathspec_match_list to be freed" + } + ], + "argline": "git_pathspec_match_list *m", + "sig": "git_pathspec_match_list *", + "return": { "type": "void", "comment": null }, + "description": "

Free memory associates with a git_pathspec_match_list

\n", + "comments": "", + "group": "pathspec" + }, + "git_pathspec_match_list_entrycount": { + "type": "function", + "file": "git2/pathspec.h", + "line": 226, + "lineto": 227, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + } + ], + "argline": "const git_pathspec_match_list *m", + "sig": "const git_pathspec_match_list *", + "return": { + "type": "size_t", + "comment": " Number of items in match list" + }, + "description": "

Get the number of items in a match list.

\n", + "comments": "", + "group": "pathspec" + }, + "git_pathspec_match_list_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 239, + "lineto": 240, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the list" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const char *", + "comment": " The filename of the match" + }, + "description": "

Get a matching filename by position.

\n", + "comments": "

This routine cannot be used if the match list was generated by git_pathspec_match_diff. If so, it will always return NULL.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_diff_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 252, + "lineto": 253, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the list" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const git_diff_delta *", + "comment": " The filename of the match" + }, + "description": "

Get a matching diff delta by position.

\n", + "comments": "

This routine can only be used if the match list was generated by git_pathspec_match_diff. Otherwise it will always return NULL.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_failed_entrycount": { + "type": "function", + "file": "git2/pathspec.h", + "line": 264, + "lineto": 265, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + } + ], + "argline": "const git_pathspec_match_list *m", + "sig": "const git_pathspec_match_list *", + "return": { + "type": "size_t", + "comment": " Number of items in original pathspec that had no matches" + }, + "description": "

Get the number of pathspec items that did not match.

\n", + "comments": "

This will be zero unless you passed GIT_PATHSPEC_FIND_FAILURES when generating the git_pathspec_match_list.

\n", + "group": "pathspec" + }, + "git_pathspec_match_list_failed_entry": { + "type": "function", + "file": "git2/pathspec.h", + "line": 276, + "lineto": 277, + "args": [ + { + "name": "m", + "type": "const git_pathspec_match_list *", + "comment": "The git_pathspec_match_list object" + }, + { + "name": "pos", + "type": "size_t", + "comment": "The index into the failed items" + } + ], + "argline": "const git_pathspec_match_list *m, size_t pos", + "sig": "const git_pathspec_match_list *::size_t", + "return": { + "type": "const char *", + "comment": " The pathspec pattern that didn't match anything" + }, + "description": "

Get an original pathspec string that had no matches.

\n", + "comments": "

This will be return NULL for positions out of range.

\n", + "group": "pathspec" + }, + "git_proxy_options_init": { + "type": "function", + "file": "git2/proxy.h", + "line": 94, + "lineto": 94, + "args": [ + { + "name": "opts", + "type": "git_proxy_options *", + "comment": "The `git_proxy_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_PROXY_OPTIONS_VERSION`." + } + ], + "argline": "git_proxy_options *opts, unsigned int version", + "sig": "git_proxy_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_proxy_options structure

\n", + "comments": "

Initializes a git_proxy_options with default values. Equivalent to creating an instance with GIT_PROXY_OPTIONS_INIT.

\n", + "group": "proxy" + }, + "git_rebase_options_init": { + "type": "function", + "file": "git2/rebase.h", + "line": 199, + "lineto": 201, + "args": [ + { + "name": "opts", + "type": "git_rebase_options *", + "comment": "The `git_rebase_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REBASE_OPTIONS_VERSION`." + } + ], + "argline": "git_rebase_options *opts, unsigned int version", + "sig": "git_rebase_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_rebase_options structure

\n", + "comments": "

Initializes a git_rebase_options with default values. Equivalent to creating an instance with GIT_REBASE_OPTIONS_INIT.

\n", + "group": "rebase" + }, + "git_rebase_init": { + "type": "function", + "file": "git2/rebase.h", + "line": 220, + "lineto": 226, + "args": [ + { + "name": "out", + "type": "git_rebase **", + "comment": "Pointer to store the rebase object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to perform the rebase" + }, + { + "name": "branch", + "type": "const git_annotated_commit *", + "comment": "The terminal commit to rebase, or NULL to rebase the\n current branch" + }, + { + "name": "upstream", + "type": "const git_annotated_commit *", + "comment": "The commit to begin rebasing from, or NULL to rebase all\n reachable commits" + }, + { + "name": "onto", + "type": "const git_annotated_commit *", + "comment": "The branch to rebase onto, or NULL to rebase onto the given\n upstream" + }, + { + "name": "opts", + "type": "const git_rebase_options *", + "comment": "Options to specify how rebase is performed, or NULL" + } + ], + "argline": "git_rebase **out, git_repository *repo, const git_annotated_commit *branch, const git_annotated_commit *upstream, const git_annotated_commit *onto, const git_rebase_options *opts", + "sig": "git_rebase **::git_repository *::const git_annotated_commit *::const git_annotated_commit *::const git_annotated_commit *::const git_rebase_options *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a rebase operation to rebase the changes in branch\n relative to upstream onto another branch. To begin the rebase\n process, call git_rebase_next. When you have finished with this\n object, call git_rebase_free.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_open": { + "type": "function", + "file": "git2/rebase.h", + "line": 237, + "lineto": 240, + "args": [ + { + "name": "out", + "type": "git_rebase **", + "comment": "Pointer to store the rebase object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository that has a rebase in-progress" + }, + { + "name": "opts", + "type": "const git_rebase_options *", + "comment": "Options to specify how rebase is performed" + } + ], + "argline": "git_rebase **out, git_repository *repo, const git_rebase_options *opts", + "sig": "git_rebase **::git_repository *::const git_rebase_options *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Opens an existing rebase that was previously started by either an\n invocation of git_rebase_init or by another client.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_orig_head_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 248, + "lineto": 248, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const char *", + "comment": " The original `HEAD` ref name" + }, + "description": "

Gets the original HEAD ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_orig_head_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 256, + "lineto": 256, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "const git_oid *", + "comment": " The original `HEAD` id" + }, + "description": "

Gets the original HEAD id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_name": { + "type": "function", + "file": "git2/rebase.h", + "line": 264, + "lineto": 264, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { "type": "const char *", "comment": " The `onto` ref name" }, + "description": "

Gets the onto ref name for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_onto_id": { + "type": "function", + "file": "git2/rebase.h", + "line": 272, + "lineto": 272, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { "type": "const git_oid *", "comment": " The `onto` id" }, + "description": "

Gets the onto id for merge rebases.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_entrycount": { + "type": "function", + "file": "git2/rebase.h", + "line": 280, + "lineto": 280, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "size_t", + "comment": " The number of rebase operations in total" + }, + "description": "

Gets the count of rebase operations that are to be applied.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_current": { + "type": "function", + "file": "git2/rebase.h", + "line": 291, + "lineto": 291, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "size_t", + "comment": " The index of the rebase operation currently being applied." + }, + "description": "

Gets the index of the rebase operation that is currently being applied.\n If the first operation has not yet been applied (because you have\n called init but not yet next) then this returns\n GIT_REBASE_NO_OPERATION.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_operation_byindex": { + "type": "function", + "file": "git2/rebase.h", + "line": 300, + "lineto": 302, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase" + }, + { + "name": "idx", + "type": "size_t", + "comment": "The index of the rebase operation to retrieve" + } + ], + "argline": "git_rebase *rebase, size_t idx", + "sig": "git_rebase *::size_t", + "return": { + "type": "git_rebase_operation *", + "comment": " The rebase operation or NULL if `idx` was out of bounds" + }, + "description": "

Gets the rebase operation specified by the given index.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_next": { + "type": "function", + "file": "git2/rebase.h", + "line": 315, + "lineto": 317, + "args": [ + { + "name": "operation", + "type": "git_rebase_operation **", + "comment": "Pointer to store the rebase operation that is to be performed next" + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase in progress" + } + ], + "argline": "git_rebase_operation **operation, git_rebase *rebase", + "sig": "git_rebase_operation **::git_rebase *", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Performs the next rebase operation and returns the information about it.\n If the operation is one that applies a patch (which is any operation except\n GIT_REBASE_OPERATION_EXEC) then the patch will be applied and the index and\n working directory will be updated with the changes. If there are conflicts,\n you will need to address those before committing the changes.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_inmemory_index": { + "type": "function", + "file": "git2/rebase.h", + "line": 334, + "lineto": 336, + "args": [ + { + "name": "index", + "type": "git_index **", + "comment": "The result index of the last operation." + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The in-progress rebase." + } + ], + "argline": "git_index **index, git_rebase *rebase", + "sig": "git_index **::git_rebase *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Gets the index produced by the last operation, which is the result\n of git_rebase_next and which will be committed by the next\n invocation of git_rebase_commit. This is useful for resolving\n conflicts in an in-memory rebase before committing them. You must\n call git_index_free when you are finished with this.

\n", + "comments": "

This is only applicable for in-memory rebases; for rebases within a working directory, the changes were applied to the repository's index.

\n", + "group": "rebase" + }, + "git_rebase_commit": { + "type": "function", + "file": "git2/rebase.h", + "line": 360, + "lineto": 366, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "The author of the updated commit, or NULL to keep the\n author from the original commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "The committer of the rebase" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the commit,\n represented with a standard encoding name. If message is NULL,\n this should also be NULL, and the encoding from the original\n commit will be maintained. If message is specified, this may be\n NULL to indicate that \"UTF-8\" is to be used." + }, + { + "name": "message", + "type": "const char *", + "comment": "The message for this commit, or NULL to use the message\n from the original commit." + } + ], + "argline": "git_oid *id, git_rebase *rebase, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message", + "sig": "git_oid *::git_rebase *::const git_signature *::const git_signature *::const char *::const char *", + "return": { + "type": "int", + "comment": " Zero on success, GIT_EUNMERGED if there are unmerged changes in\n the index, GIT_EAPPLIED if the current commit has already\n been applied to the upstream and there is nothing to commit,\n -1 on failure." + }, + "description": "

Commits the current patch. You must have resolved any conflicts that\n were introduced during the patch application from the git_rebase_next\n invocation.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_abort": { + "type": "function", + "file": "git2/rebase.h", + "line": 376, + "lineto": 376, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { + "type": "int", + "comment": " Zero on success; GIT_ENOTFOUND if a rebase is not in progress,\n -1 on other errors." + }, + "description": "

Aborts a rebase that is currently in progress, resetting the repository\n and working directory to their state before rebase began.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_finish": { + "type": "function", + "file": "git2/rebase.h", + "line": 386, + "lineto": 388, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase that is in-progress" + }, + { + "name": "signature", + "type": "const git_signature *", + "comment": "The identity that is finishing the rebase (optional)" + } + ], + "argline": "git_rebase *rebase, const git_signature *signature", + "sig": "git_rebase *::const git_signature *", + "return": { "type": "int", "comment": " Zero on success; -1 on error" }, + "description": "

Finishes a rebase that is currently in progress once all patches have\n been applied.

\n", + "comments": "", + "group": "rebase" + }, + "git_rebase_free": { + "type": "function", + "file": "git2/rebase.h", + "line": 395, + "lineto": 395, + "args": [ + { + "name": "rebase", + "type": "git_rebase *", + "comment": "The rebase object" + } + ], + "argline": "git_rebase *rebase", + "sig": "git_rebase *", + "return": { "type": "void", "comment": null }, + "description": "

Frees the git_rebase object.

\n", + "comments": "", + "group": "rebase" + }, + "git_refdb_new": { + "type": "function", + "file": "git2/refdb.h", + "line": 35, + "lineto": 35, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new reference database with no backends.

\n", + "comments": "

Before the Ref DB can be used for read/writing, a custom database backend must be manually set using git_refdb_set_backend()

\n", + "group": "refdb" + }, + "git_refdb_open": { + "type": "function", + "file": "git2/refdb.h", + "line": 49, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new reference database and automatically add\n the default backends:

\n", + "comments": "
    \n
  • git_refdb_dir: read and write loose and packed refs from disk, assuming the repository dir as the folder
  • \n
\n", + "group": "refdb" + }, + "git_refdb_compress": { + "type": "function", + "file": "git2/refdb.h", + "line": 59, + "lineto": 59, + "args": [ + { + "name": "refdb", + "type": "git_refdb *", + "comment": "The reference database to optimize." + } + ], + "argline": "git_refdb *refdb", + "sig": "git_refdb *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Suggests that the given refdb compress or optimize its references.\n This mechanism is implementation specific. For on-disk reference\n databases, for example, this may pack all loose references.

\n", + "comments": "", + "group": "refdb" + }, + "git_refdb_free": { + "type": "function", + "file": "git2/refdb.h", + "line": 66, + "lineto": 66, + "args": [ + { + "name": "refdb", + "type": "git_refdb *", + "comment": "reference database pointer or NULL" + } + ], + "argline": "git_refdb *refdb", + "sig": "git_refdb *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open reference database.

\n", + "comments": "", + "group": "refdb" + }, + "git_reflog_read": { + "type": "function", + "file": "git2/reflog.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_reflog **", + "comment": "pointer to reflog" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "reference to look up" + } + ], + "argline": "git_reflog **out, git_repository *repo, const char *name", + "sig": "git_reflog **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read the reflog for the given reference

\n", + "comments": "

If there is no reflog file for the given reference yet, an empty reflog object will be returned.

\n\n

The reflog must be freed manually by using git_reflog_free().

\n", + "group": "reflog" + }, + "git_reflog_write": { + "type": "function", + "file": "git2/reflog.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "an existing reflog object" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write an existing in-memory reflog object back to disk\n using an atomic file lock.

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_append": { + "type": "function", + "file": "git2/reflog.h", + "line": 60, + "lineto": 60, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "an existing reflog object" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the OID the reference is now pointing to" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "the signature of the committer" + }, + { + "name": "msg", + "type": "const char *", + "comment": "the reflog message" + } + ], + "argline": "git_reflog *reflog, const git_oid *id, const git_signature *committer, const char *msg", + "sig": "git_reflog *::const git_oid *::const git_signature *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a new entry to the in-memory reflog.

\n", + "comments": "

msg is optional and can be NULL.

\n", + "group": "reflog" + }, + "git_reflog_rename": { + "type": "function", + "file": "git2/reflog.h", + "line": 75, + "lineto": 75, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "old_name", + "type": "const char *", + "comment": "the old name of the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "the new name of the reference" + } + ], + "argline": "git_repository *repo, const char *old_name, const char *name", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Rename a reflog

\n", + "comments": "

The reflog to be renamed is expected to already exist

\n\n

The new name will be checked for validity. See git_reference_create_symbolic() for rules about valid names.

\n", + "group": "reflog" + }, + "git_reflog_delete": { + "type": "function", + "file": "git2/reflog.h", + "line": 84, + "lineto": 84, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "the reflog to delete" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Delete the reflog for the given reference

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entrycount": { + "type": "function", + "file": "git2/reflog.h", + "line": 92, + "lineto": 92, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "the previously loaded reflog" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { "type": "size_t", "comment": " the number of log entries" }, + "description": "

Get the number of log entries in a reflog

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_byindex": { + "type": "function", + "file": "git2/reflog.h", + "line": 105, + "lineto": 105, + "args": [ + { + "name": "reflog", + "type": "const git_reflog *", + "comment": "a previously loaded reflog" + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position of the entry to lookup. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." + } + ], + "argline": "const git_reflog *reflog, size_t idx", + "sig": "const git_reflog *::size_t", + "return": { + "type": "const git_reflog_entry *", + "comment": " the entry; NULL if not found" + }, + "description": "

Lookup an entry by its index

\n", + "comments": "

Requesting the reflog entry with an index of 0 (zero) will return the most recently created entry.

\n", + "group": "reflog" + }, + "git_reflog_drop": { + "type": "function", + "file": "git2/reflog.h", + "line": 124, + "lineto": 127, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "a previously loaded reflog." + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position of the entry to remove. Should be greater than or\n equal to 0 (zero) and less than `git_reflog_entrycount()`." + }, + { + "name": "rewrite_previous_entry", + "type": "int", + "comment": "1 to rewrite the history; 0 otherwise." + } + ], + "argline": "git_reflog *reflog, size_t idx, int rewrite_previous_entry", + "sig": "git_reflog *::size_t::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the entry doesn't exist\n or an error code." + }, + "description": "

Remove an entry from the reflog by its index

\n", + "comments": "

To ensure there's no gap in the log history, set rewrite_previous_entry param value to 1. When deleting entry n, member old_oid of entry n-1 (if any) will be updated with the value of member new_oid of entry n+1.

\n", + "group": "reflog" + }, + "git_reflog_entry_id_old": { + "type": "function", + "file": "git2/reflog.h", + "line": 135, + "lineto": 135, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { "type": "const git_oid *", "comment": " the old oid" }, + "description": "

Get the old oid

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_id_new": { + "type": "function", + "file": "git2/reflog.h", + "line": 143, + "lineto": 143, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const git_oid *", + "comment": " the new oid at this time" + }, + "description": "

Get the new oid

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_committer": { + "type": "function", + "file": "git2/reflog.h", + "line": 151, + "lineto": 151, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { + "type": "const git_signature *", + "comment": " the committer" + }, + "description": "

Get the committer of this entry

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_entry_message": { + "type": "function", + "file": "git2/reflog.h", + "line": 159, + "lineto": 159, + "args": [ + { + "name": "entry", + "type": "const git_reflog_entry *", + "comment": "a reflog entry" + } + ], + "argline": "const git_reflog_entry *entry", + "sig": "const git_reflog_entry *", + "return": { "type": "const char *", "comment": " the log msg" }, + "description": "

Get the log message

\n", + "comments": "", + "group": "reflog" + }, + "git_reflog_free": { + "type": "function", + "file": "git2/reflog.h", + "line": 166, + "lineto": 166, + "args": [ + { + "name": "reflog", + "type": "git_reflog *", + "comment": "reflog to free" + } + ], + "argline": "git_reflog *reflog", + "sig": "git_reflog *", + "return": { "type": "void", "comment": null }, + "description": "

Free the reflog

\n", + "comments": "", + "group": "reflog" + }, + "git_reference_lookup": { + "type": "function", + "file": "git2/refs.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the looked-up reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to look up the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "the long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name", + "sig": "git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Lookup a reference by name in a repository.

\n", + "comments": "

The returned reference must be freed by the user.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.8.4/checkout.html#git_reference_lookup-15", + "ex/v1.8.4/checkout.html#git_reference_lookup-16" + ], + "general.c": ["ex/v1.8.4/general.html#git_reference_lookup-53"], + "merge.c": ["ex/v1.8.4/merge.html#git_reference_lookup-21"] + } + }, + "git_reference_name_to_id": { + "type": "function", + "file": "git2/refs.h", + "line": 54, + "lineto": 55, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer to oid to be filled in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which to look up the reference" + }, + { + "name": "name", + "type": "const char *", + "comment": "The long name for the reference (e.g. HEAD, refs/heads/master, refs/tags/v0.1.0, ...)" + } + ], + "argline": "git_oid *out, git_repository *repo, const char *name", + "sig": "git_oid *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code." + }, + "description": "

Lookup a reference by name and resolve immediately to OID.

\n", + "comments": "

This function provides a quick way to resolve a reference name straight through to the object id that it refers to. This avoids having to allocate or free any git_reference objects for simple situations.

\n\n

The name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference" + }, + "git_reference_dwim": { + "type": "function", + "file": "git2/refs.h", + "line": 68, + "lineto": 68, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer in which to store the reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "shorthand", + "type": "const char *", + "comment": "the short name for the reference" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *shorthand", + "sig": "git_reference **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a reference by DWIMing its short name

\n", + "comments": "

Apply the git precedence rules to the given shorthand to determine which reference the user is referring to.

\n", + "group": "reference", + "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_reference_dwim-22"] } + }, + "git_reference_symbolic_create_matching": { + "type": "function", + "file": "git2/refs.h", + "line": 112, + "lineto": 112, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The target of the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "current_value", + "type": "const char *", + "comment": "The expected value of the reference when updating" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *current_value, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC, GIT_EMODIFIED or an error code" + }, + "description": "

Conditionally create a new symbolic reference.

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_value (i.e. if the ref has changed since the user read it).

\n\n

If current_value is all zeros, this function will return GIT_EMODIFIED if the ref already exists.

\n", + "group": "reference" + }, + "git_reference_symbolic_create": { + "type": "function", + "file": "git2/refs.h", + "line": 148, + "lineto": 148, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The target of the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const char *target, int force, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const char *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new symbolic reference.

\n", + "comments": "

A symbolic reference is a reference name that refers to another reference name. If the other name moves, the symbolic name will move, too. As a simple example, the "HEAD" reference might refer to "refs/heads/master" while on the "master" branch of a repository.

\n\n

The symbolic reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference" + }, + "git_reference_create": { + "type": "function", + "file": "git2/refs.h", + "line": 185, + "lineto": 185, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The object id pointed to by the reference." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new direct reference.

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference", + "examples": { + "merge.c": ["ex/v1.8.4/merge.html#git_reference_create-23"] + } + }, + "git_reference_create_matching": { + "type": "function", + "file": "git2/refs.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where that reference will live" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of the reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The object id pointed to by the reference." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + }, + { + "name": "current_id", + "type": "const git_oid *", + "comment": "The expected value of the reference at the time of update" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_oid *current_id, const char *log_message", + "sig": "git_reference **::git_repository *::const char *::const git_oid *::int::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Conditionally create new direct reference

\n", + "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n\n

It will return GIT_EMODIFIED if the reference's value at the time of updating does not match the one passed through current_id (i.e. if the ref has changed since the user read it).

\n", + "group": "reference" + }, + "git_reference_target": { + "type": "function", + "file": "git2/refs.h", + "line": 243, + "lineto": 243, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the oid if available, NULL otherwise" + }, + "description": "

Get the OID pointed to by a direct reference.

\n", + "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", + "group": "reference", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_reference_target-54"] + } + }, + "git_reference_target_peel": { + "type": "function", + "file": "git2/refs.h", + "line": 254, + "lineto": 254, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const git_oid *", + "comment": " a pointer to the oid if available, NULL otherwise" + }, + "description": "

Return the peeled OID target of this reference.

\n", + "comments": "

This peeled OID only applies to direct references that point to a hard Tag object: it is the result of peeling such Tag.

\n", + "group": "reference" + }, + "git_reference_symbolic_target": { + "type": "function", + "file": "git2/refs.h", + "line": 264, + "lineto": 264, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " a pointer to the name if available, NULL otherwise" + }, + "description": "

Get full name to the reference pointed to by a symbolic reference.

\n", + "comments": "

Only available if the reference is symbolic.

\n", + "group": "reference", + "examples": { + "general.c": [ + "ex/v1.8.4/general.html#git_reference_symbolic_target-55" + ], + "merge.c": ["ex/v1.8.4/merge.html#git_reference_symbolic_target-24"] + } + }, + "git_reference_type": { + "type": "function", + "file": "git2/refs.h", + "line": 274, + "lineto": 274, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { "type": "git_reference_t", "comment": " the type" }, + "description": "

Get the type of a reference.

\n", + "comments": "

Either direct (GIT_REFERENCE_DIRECT) or symbolic (GIT_REFERENCE_SYMBOLIC)

\n", + "group": "reference", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_reference_type-56"] + } + }, + "git_reference_name": { + "type": "function", + "file": "git2/refs.h", + "line": 284, + "lineto": 284, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " the full name for the ref" + }, + "description": "

Get the full name of a reference.

\n", + "comments": "

See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_reference_name-17"], + "merge.c": ["ex/v1.8.4/merge.html#git_reference_name-25"] + } + }, + "git_reference_resolve": { + "type": "function", + "file": "git2/refs.h", + "line": 302, + "lineto": 302, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the peeled reference" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "git_reference **out, const git_reference *ref", + "sig": "git_reference **::const git_reference *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Resolve a symbolic reference to a direct reference.

\n", + "comments": "

This method iteratively peels a symbolic reference until it resolves to a direct reference to an OID.

\n\n

The peeled reference is returned in the resolved_ref argument, and must be freed manually once it's no longer needed.

\n\n

If a direct reference is passed as an argument, a copy of that reference is returned. This copy must be manually freed too.

\n", + "group": "reference" + }, + "git_reference_owner": { + "type": "function", + "file": "git2/refs.h", + "line": 310, + "lineto": 310, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repo" + }, + "description": "

Get the repository where a reference resides.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_symbolic_set_target": { + "type": "function", + "file": "git2/refs.h", + "line": 332, + "lineto": 336, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference" + }, + { + "name": "target", + "type": "const char *", + "comment": "The new target for the reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_reference *ref, const char *target, const char *log_message", + "sig": "git_reference **::git_reference *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Create a new reference with the same name as the given reference but a\n different symbolic target. The reference must be a symbolic reference,\n otherwise this will fail.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n\n

The target name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", + "group": "reference" + }, + "git_reference_set_target": { + "type": "function", + "file": "git2/refs.h", + "line": 352, + "lineto": 356, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "Pointer to the newly created reference" + }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "The new target OID for the reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **out, git_reference *ref, const git_oid *id, const char *log_message", + "sig": "git_reference **::git_reference *::const git_oid *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EMODIFIED if the value of the reference\n has changed since it was read, or an error code" + }, + "description": "

Conditionally create a new reference with the same name as the given reference but a\n different OID target. The reference must be a direct reference, otherwise\n this will fail.

\n", + "comments": "

The new reference will be written to disk, overwriting the given reference.

\n", + "group": "reference", + "examples": { + "merge.c": ["ex/v1.8.4/merge.html#git_reference_set_target-26"] + } + }, + "git_reference_rename": { + "type": "function", + "file": "git2/refs.h", + "line": 381, + "lineto": 386, + "args": [ + { "name": "new_ref", "type": "git_reference **", "comment": null }, + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference to rename" + }, + { + "name": "new_name", + "type": "const char *", + "comment": "The new name for the reference" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite an existing reference" + }, + { + "name": "log_message", + "type": "const char *", + "comment": "The one line long message to be appended to the reflog" + } + ], + "argline": "git_reference **new_ref, git_reference *ref, const char *new_name, int force, const char *log_message", + "sig": "git_reference **::git_reference *::const char *::int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Rename an existing reference.

\n", + "comments": "

This method works for both direct and symbolic references.

\n\n

The new name will be checked for validity. See git_reference_symbolic_create() for rules about valid names.

\n\n

If the force flag is not enabled, and there's already a reference with the given name, the renaming will fail.

\n\n

IMPORTANT: The user needs to write a proper reflog entry if the reflog is enabled for the repository. We only rename the reflog if it exists.

\n", + "group": "reference" + }, + "git_reference_delete": { + "type": "function", + "file": "git2/refs.h", + "line": 401, + "lineto": 401, + "args": [ + { + "name": "ref", + "type": "git_reference *", + "comment": "The reference to remove" + } + ], + "argline": "git_reference *ref", + "sig": "git_reference *", + "return": { + "type": "int", + "comment": " 0, GIT_EMODIFIED or an error code" + }, + "description": "

Delete an existing reference.

\n", + "comments": "

This method works for both direct and symbolic references. The reference will be immediately removed on disk but the memory will not be freed. Callers must call git_reference_free.

\n\n

This function will return an error if the reference has changed from the time it was looked up.

\n", + "group": "reference" + }, + "git_reference_remove": { + "type": "function", + "file": "git2/refs.h", + "line": 412, + "lineto": 412, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": null }, + { + "name": "name", + "type": "const char *", + "comment": "The reference to remove" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Delete an existing reference by name

\n", + "comments": "

This method removes the named reference from the repository without looking at its old value.

\n", + "group": "reference" + }, + "git_reference_list": { + "type": "function", + "file": "git2/refs.h", + "line": 426, + "lineto": 426, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe reference names will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + } + ], + "argline": "git_strarray *array, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Fill a list with all the references that can be found in a repository.

\n", + "comments": "

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().

\n", + "group": "reference", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_reference_list-57"] + } + }, + "git_reference_foreach": { + "type": "function", + "file": "git2/refs.h", + "line": 466, + "lineto": 469, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "callback", + "type": "git_reference_foreach_cb", + "comment": "Function which will be called for every listed ref" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, git_reference_foreach_cb callback, void *payload", + "sig": "git_repository *::git_reference_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform a callback on each reference in the repository.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the reference object and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n\n

Note that the callback function is responsible to call git_reference_free on each reference passed to it.

\n", + "group": "reference" + }, + "git_reference_foreach_name": { + "type": "function", + "file": "git2/refs.h", + "line": 484, + "lineto": 487, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "callback", + "type": "git_reference_foreach_name_cb", + "comment": "Function which will be called for every listed ref name" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, git_reference_foreach_name_cb callback, void *payload", + "sig": "git_repository *::git_reference_foreach_name_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Perform a callback on the fully-qualified name of each reference.

\n", + "comments": "

The callback function will be called for each reference in the repository, receiving the name of the reference and the payload value passed to this method. Returning a non-zero value from the callback will terminate the iteration.

\n", + "group": "reference" + }, + "git_reference_dup": { + "type": "function", + "file": "git2/refs.h", + "line": 498, + "lineto": 498, + "args": [ + { + "name": "dest", + "type": "git_reference **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_reference *", + "comment": "object to copy" + } + ], + "argline": "git_reference **dest, git_reference *source", + "sig": "git_reference **::git_reference *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an existing reference.

\n", + "comments": "

Call git_reference_free to free the data.

\n", + "group": "reference" + }, + "git_reference_free": { + "type": "function", + "file": "git2/refs.h", + "line": 505, + "lineto": 505, + "args": [ + { "name": "ref", "type": "git_reference *", "comment": "git_reference" } + ], + "argline": "git_reference *ref", + "sig": "git_reference *", + "return": { "type": "void", "comment": null }, + "description": "

Free the given reference.

\n", + "comments": "", + "group": "reference", + "examples": { + "checkout.c": [ + "ex/v1.8.4/checkout.html#git_reference_free-18", + "ex/v1.8.4/checkout.html#git_reference_free-19", + "ex/v1.8.4/checkout.html#git_reference_free-20" + ], + "commit.c": ["ex/v1.8.4/commit.html#git_reference_free-7"], + "general.c": ["ex/v1.8.4/general.html#git_reference_free-58"], + "merge.c": [ + "ex/v1.8.4/merge.html#git_reference_free-27", + "ex/v1.8.4/merge.html#git_reference_free-28", + "ex/v1.8.4/merge.html#git_reference_free-29" + ], + "status.c": ["ex/v1.8.4/status.html#git_reference_free-1"] + } + }, + "git_reference_cmp": { + "type": "function", + "file": "git2/refs.h", + "line": 514, + "lineto": 516, + "args": [ + { + "name": "ref1", + "type": "const git_reference *", + "comment": "The first git_reference" + }, + { + "name": "ref2", + "type": "const git_reference *", + "comment": "The second git_reference" + } + ], + "argline": "const git_reference *ref1, const git_reference *ref2", + "sig": "const git_reference *::const git_reference *", + "return": { + "type": "int", + "comment": " 0 if the same, else a stable but meaningless ordering." + }, + "description": "

Compare two references.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_iterator_new": { + "type": "function", + "file": "git2/refs.h", + "line": 525, + "lineto": 527, + "args": [ + { + "name": "out", + "type": "git_reference_iterator **", + "comment": "pointer in which to store the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_reference_iterator **out, git_repository *repo", + "sig": "git_reference_iterator **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an iterator for the repo's references

\n", + "comments": "", + "group": "reference" + }, + "git_reference_iterator_glob_new": { + "type": "function", + "file": "git2/refs.h", + "line": 538, + "lineto": 541, + "args": [ + { + "name": "out", + "type": "git_reference_iterator **", + "comment": "pointer in which to store the iterator" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob to match against the reference names" + } + ], + "argline": "git_reference_iterator **out, git_repository *repo, const char *glob", + "sig": "git_reference_iterator **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an iterator for the repo's references that match the\n specified glob

\n", + "comments": "", + "group": "reference" + }, + "git_reference_next": { + "type": "function", + "file": "git2/refs.h", + "line": 550, + "lineto": 550, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer in which to store the reference" + }, + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator" + } + ], + "argline": "git_reference **out, git_reference_iterator *iter", + "sig": "git_reference **::git_reference_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER if there are no more; or an error code" + }, + "description": "

Get the next reference

\n", + "comments": "", + "group": "reference" + }, + "git_reference_next_name": { + "type": "function", + "file": "git2/refs.h", + "line": 563, + "lineto": 563, + "args": [ + { + "name": "out", + "type": "const char **", + "comment": "pointer in which to store the string" + }, + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator" + } + ], + "argline": "const char **out, git_reference_iterator *iter", + "sig": "const char **::git_reference_iterator *", + "return": { + "type": "int", + "comment": " 0, GIT_ITEROVER if there are no more; or an error code" + }, + "description": "

Get the next reference's name

\n", + "comments": "

This function is provided for convenience in case only the names are interesting as it avoids the allocation of the git_reference object which git_reference_next() needs.

\n", + "group": "reference" + }, + "git_reference_iterator_free": { + "type": "function", + "file": "git2/refs.h", + "line": 570, + "lineto": 570, + "args": [ + { + "name": "iter", + "type": "git_reference_iterator *", + "comment": "the iterator to free" + } + ], + "argline": "git_reference_iterator *iter", + "sig": "git_reference_iterator *", + "return": { "type": "void", "comment": null }, + "description": "

Free the iterator and its associated resources

\n", + "comments": "", + "group": "reference" + }, + "git_reference_foreach_glob": { + "type": "function", + "file": "git2/refs.h", + "line": 590, + "lineto": 594, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the refs" + }, + { + "name": "glob", + "type": "const char *", + "comment": "Pattern to match (fnmatch-style) against reference name." + }, + { + "name": "callback", + "type": "git_reference_foreach_name_cb", + "comment": "Function which will be called for every listed ref" + }, + { + "name": "payload", + "type": "void *", + "comment": "Additional data to pass to the callback" + } + ], + "argline": "git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload", + "sig": "git_repository *::const char *::git_reference_foreach_name_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUSER on non-zero callback, or error code" + }, + "description": "

Perform a callback on each reference in the repository whose name\n matches the given pattern.

\n", + "comments": "

This function acts like git_reference_foreach() with an additional pattern match being applied to the reference name before issuing the callback function. See that function for more information.

\n\n

The pattern is matched using fnmatch or "glob" style where a '*' matches any sequence of letters, a '?' matches any letter, and square brackets can be used to define character ranges (such as "[0-9]" for digits).

\n", + "group": "reference" + }, + "git_reference_has_log": { + "type": "function", + "file": "git2/refs.h", + "line": 604, + "lineto": 604, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference's name" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 when no reflog can be found, 1 when it exists;\n otherwise an error code." + }, + "description": "

Check if a reflog exists for the specified reference.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_ensure_log": { + "type": "function", + "file": "git2/refs.h", + "line": 616, + "lineto": 616, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference's name" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Ensure there is a reflog for a particular reference.

\n", + "comments": "

Make sure that successive updates to the reference will append to its log.

\n", + "group": "reference" + }, + "git_reference_is_branch": { + "type": "function", + "file": "git2/refs.h", + "line": 626, + "lineto": 626, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/heads\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a local branch.

\n", + "comments": "", + "group": "reference" + }, + "git_reference_is_remote": { + "type": "function", + "file": "git2/refs.h", + "line": 636, + "lineto": 636, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/remotes\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a remote tracking branch

\n", + "comments": "", + "group": "reference", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_reference_is_remote-21"] + } + }, + "git_reference_is_tag": { + "type": "function", + "file": "git2/refs.h", + "line": 646, + "lineto": 646, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/tags\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a tag

\n", + "comments": "", + "group": "reference" + }, + "git_reference_is_note": { + "type": "function", + "file": "git2/refs.h", + "line": 656, + "lineto": 656, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "A git reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "int", + "comment": " 1 when the reference lives in the refs/notes\n namespace; 0 otherwise." + }, + "description": "

Check if a reference is a note

\n", + "comments": "", + "group": "reference" + }, + "git_reference_normalize_name": { + "type": "function", + "file": "git2/refs.h", + "line": 712, + "lineto": 716, + "args": [ + { + "name": "buffer_out", + "type": "char *", + "comment": "User allocated buffer to store normalized name" + }, + { + "name": "buffer_size", + "type": "size_t", + "comment": "Size of buffer_out" + }, + { + "name": "name", + "type": "const char *", + "comment": "Reference name to be checked." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "Flags to constrain name validation rules - see the\n GIT_REFERENCE_FORMAT constants above." + } + ], + "argline": "char *buffer_out, size_t buffer_size, const char *name, unsigned int flags", + "sig": "char *::size_t::const char *::unsigned int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EBUFS if buffer is too small, GIT_EINVALIDSPEC\n or an error code." + }, + "description": "

Normalize reference name and check validity.

\n", + "comments": "

This will normalize the reference name by removing any leading slash '/' characters and collapsing runs of adjacent slashes between name components into a single slash.

\n\n

Once normalized, if the reference name is valid, it will be returned in the user allocated buffer.

\n\n

See git_reference_symbolic_create() for rules about valid names.

\n", + "group": "reference" + }, + "git_reference_peel": { + "type": "function", + "file": "git2/refs.h", + "line": 733, + "lineto": 736, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "ref", + "type": "const git_reference *", + "comment": "The reference to be processed" + }, + { + "name": "type", + "type": "git_object_t", + "comment": "The type of the requested object (GIT_OBJECT_COMMIT,\n GIT_OBJECT_TAG, GIT_OBJECT_TREE, GIT_OBJECT_BLOB or GIT_OBJECT_ANY)." + } + ], + "argline": "git_object **out, const git_reference *ref, git_object_t type", + "sig": "git_object **::const git_reference *::git_object_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code" + }, + "description": "

Recursively peel reference until object of the specified type is found.

\n", + "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", + "group": "reference", + "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_reference_peel-30"] } + }, + "git_reference_name_is_valid": { + "type": "function", + "file": "git2/refs.h", + "line": 753, + "lineto": 753, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given reference name" + }, + { + "name": "refname", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "int *valid, const char *refname", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Ensure the reference name is well-formed.

\n", + "comments": "

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n", + "group": "reference" + }, + "git_reference_shorthand": { + "type": "function", + "file": "git2/refs.h", + "line": 767, + "lineto": 767, + "args": [ + { + "name": "ref", + "type": "const git_reference *", + "comment": "a reference" + } + ], + "argline": "const git_reference *ref", + "sig": "const git_reference *", + "return": { + "type": "const char *", + "comment": " the human-readable version of the name" + }, + "description": "

Get the reference's short name

\n", + "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", + "group": "reference", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_reference_shorthand-2"] + } + }, + "git_refspec_parse": { + "type": "function", + "file": "git2/refspec.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "refspec", + "type": "git_refspec **", + "comment": "a pointer to hold the refspec handle" + }, + { + "name": "input", + "type": "const char *", + "comment": "the refspec string" + }, + { + "name": "is_fetch", + "type": "int", + "comment": "is this a refspec for a fetch" + } + ], + "argline": "git_refspec **refspec, const char *input, int is_fetch", + "sig": "git_refspec **::const char *::int", + "return": { + "type": "int", + "comment": " 0 if the refspec string could be parsed, -1 otherwise" + }, + "description": "

Parse a given refspec string

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_free": { + "type": "function", + "file": "git2/refspec.h", + "line": 39, + "lineto": 39, + "args": [ + { + "name": "refspec", + "type": "git_refspec *", + "comment": "the refspec object" + } + ], + "argline": "git_refspec *refspec", + "sig": "git_refspec *", + "return": { "type": "void", "comment": null }, + "description": "

Free a refspec object which has been created by git_refspec_parse

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_src": { + "type": "function", + "file": "git2/refspec.h", + "line": 47, + "lineto": 47, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's source specifier" + }, + "description": "

Get the source specifier

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_dst": { + "type": "function", + "file": "git2/refspec.h", + "line": 55, + "lineto": 55, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's destination specifier" + }, + "description": "

Get the destination specifier

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_string": { + "type": "function", + "file": "git2/refspec.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "const char *", + "comment": " the refspec's original string" + }, + "description": "

Get the refspec's string

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_force": { + "type": "function", + "file": "git2/refspec.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + } + ], + "argline": "const git_refspec *refspec", + "sig": "const git_refspec *", + "return": { + "type": "int", + "comment": " 1 if force update has been set, 0 otherwise" + }, + "description": "

Get the force update setting

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_direction": { + "type": "function", + "file": "git2/refspec.h", + "line": 79, + "lineto": 79, + "args": [ + { "name": "spec", "type": "const git_refspec *", "comment": "refspec" } + ], + "argline": "const git_refspec *spec", + "sig": "const git_refspec *", + "return": { + "type": "git_direction", + "comment": " GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" + }, + "description": "

Get the refspec's direction.

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_src_matches": { + "type": "function", + "file": "git2/refspec.h", + "line": 88, + "lineto": 88, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, + "description": "

Check if a refspec's source descriptor matches a reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_dst_matches": { + "type": "function", + "file": "git2/refspec.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, + "description": "

Check if a refspec's destination descriptor matches a reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_transform": { + "type": "function", + "file": "git2/refspec.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "where to store the target name" + }, + { + "name": "spec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the reference to transform" + } + ], + "argline": "git_buf *out, const git_refspec *spec, const char *name", + "sig": "git_buf *::const git_refspec *::const char *", + "return": { "type": "int", "comment": " 0, GIT_EBUFS or another error" }, + "description": "

Transform a reference to its target following the refspec's rules

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_rtransform": { + "type": "function", + "file": "git2/refspec.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "where to store the source reference name" + }, + { + "name": "spec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the reference to transform" + } + ], + "argline": "git_buf *out, const git_refspec *spec, const char *name", + "sig": "git_buf *::const git_refspec *::const char *", + "return": { "type": "int", "comment": " 0, GIT_EBUFS or another error" }, + "description": "

Transform a target reference to its source reference following the refspec's rules

\n", + "comments": "", + "group": "refspec" + }, + "git_remote_create": { + "type": "function", + "file": "git2/remote.h", + "line": 38, + "lineto": 42, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the remote's url" } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url", + "sig": "git_remote **::git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Add a remote with the default fetch refspec to the repository's configuration.

\n", + "comments": "", + "group": "remote", + "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_create-1"] } + }, + "git_remote_create_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 132, + "lineto": 134, + "args": [ + { + "name": "opts", + "type": "git_remote_create_options *", + "comment": "The `git_remote_create_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REMOTE_CREATE_OPTIONS_VERSION`." + } + ], + "argline": "git_remote_create_options *opts, unsigned int version", + "sig": "git_remote_create_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_remote_create_options structure

\n", + "comments": "

Initializes a git_remote_create_options with default values. Equivalent to creating an instance with GIT_REMOTE_CREATE_OPTIONS_INIT.

\n", + "group": "remote" + }, + "git_remote_create_with_opts": { + "type": "function", + "file": "git2/remote.h", + "line": 148, + "lineto": 151, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "opts", + "type": "const git_remote_create_options *", + "comment": "the remote creation options" + } + ], + "argline": "git_remote **out, const char *url, const git_remote_create_options *opts", + "sig": "git_remote **::const char *::const git_remote_create_options *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Create a remote, with options.

\n", + "comments": "

This function allows more fine-grained control over the remote creation.

\n\n

Passing NULL as the opts argument will result in a detached remote.

\n", + "group": "remote" + }, + "git_remote_create_with_fetchspec": { + "type": "function", + "file": "git2/remote.h", + "line": 164, + "lineto": 169, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { + "name": "fetch", + "type": "const char *", + "comment": "the remote fetch value" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch", + "sig": "git_remote **::git_repository *::const char *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Add a remote with the provided fetch refspec (or default if NULL) to the repository's\n configuration.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_create_anonymous": { + "type": "function", + "file": "git2/remote.h", + "line": 182, + "lineto": 185, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote objects" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the associated repository" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository's URL" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *url", + "sig": "git_remote **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an anonymous remote

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", + "group": "remote", + "examples": { + "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_create_anonymous-4"], + "ls-remote.c": [ + "ex/v1.8.4/ls-remote.html#git_remote_create_anonymous-2" + ] + } + }, + "git_remote_create_detached": { + "type": "function", + "file": "git2/remote.h", + "line": 201, + "lineto": 203, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote objects" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote repository's URL" + } + ], + "argline": "git_remote **out, const char *url", + "sig": "git_remote **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a remote without a connected local repo

\n", + "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n\n

Contrasted with git_remote_create_anonymous, a detached remote will not consider any repo configuration values (such as insteadof url substitutions).

\n", + "group": "remote" + }, + "git_remote_lookup": { + "type": "function", + "file": "git2/remote.h", + "line": 216, + "lineto": 216, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "pointer to the new remote object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the associated repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + } + ], + "argline": "git_remote **out, git_repository *repo, const char *name", + "sig": "git_remote **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Get the information for a particular remote

\n", + "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "remote", + "examples": { + "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_lookup-5"], + "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_lookup-3"], + "push.c": ["ex/v1.8.4/push.html#git_remote_lookup-1"], + "remote.c": ["ex/v1.8.4/remote.html#git_remote_lookup-2"] + } + }, + "git_remote_dup": { + "type": "function", + "file": "git2/remote.h", + "line": 228, + "lineto": 228, + "args": [ + { + "name": "dest", + "type": "git_remote **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "git_remote *", + "comment": "object to copy" + } + ], + "argline": "git_remote **dest, git_remote *source", + "sig": "git_remote **::git_remote *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an existing remote. All internal strings are also\n duplicated. Callbacks are not duplicated.

\n", + "comments": "

Call git_remote_free to free the data.

\n", + "group": "remote" + }, + "git_remote_owner": { + "type": "function", + "file": "git2/remote.h", + "line": 236, + "lineto": 236, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "git_repository *", + "comment": " a pointer to the repository" + }, + "description": "

Get the remote's repository

\n", + "comments": "", + "group": "remote" + }, + "git_remote_name": { + "type": "function", + "file": "git2/remote.h", + "line": 244, + "lineto": 244, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "const char *", + "comment": " a pointer to the name or NULL for in-memory remotes" + }, + "description": "

Get the remote's name

\n", + "comments": "", + "group": "remote" + }, + "git_remote_url": { + "type": "function", + "file": "git2/remote.h", + "line": 256, + "lineto": 256, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { "type": "const char *", "comment": " a pointer to the url" }, + "description": "

Get the remote's url

\n", + "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_url-3"] } + }, + "git_remote_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 268, + "lineto": 268, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "const char *", + "comment": " a pointer to the url or NULL if no special url for pushing is set" + }, + "description": "

Get the remote's url for pushing.

\n", + "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_pushurl-4"] } + }, + "git_remote_set_url": { + "type": "function", + "file": "git2/remote.h", + "line": 281, + "lineto": 281, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_repository *repo, const char *remote, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error value" }, + "description": "

Set the remote's url in the configuration

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_set_url-5"] } + }, + "git_remote_set_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 295, + "lineto": 295, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to perform the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_repository *repo, const char *remote, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Set the remote's url for pushing in the configuration.

\n", + "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", + "group": "remote", + "examples": { + "remote.c": ["ex/v1.8.4/remote.html#git_remote_set_pushurl-6"] + } + }, + "git_remote_set_instance_url": { + "type": "function", + "file": "git2/remote.h", + "line": 305, + "lineto": 305, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { "type": "int", "comment": " 0 or an error value" }, + "description": "

Set the url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_set_instance_pushurl": { + "type": "function", + "file": "git2/remote.h", + "line": 315, + "lineto": 315, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote's name" + }, + { "name": "url", "type": "const char *", "comment": "the url to set" } + ], + "argline": "git_remote *remote, const char *url", + "sig": "git_remote *::const char *", + "return": { "type": "int", "comment": " 0 or an error value" }, + "description": "

Set the push url for this particular url instance. The URL in the\n configuration will be ignored, and will not be changed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_add_fetch": { + "type": "function", + "file": "git2/remote.h", + "line": 328, + "lineto": 328, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to change the configuration" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote to change" + }, + { + "name": "refspec", + "type": "const char *", + "comment": "the new fetch refspec" + } + ], + "argline": "git_repository *repo, const char *remote, const char *refspec", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" + }, + "description": "

Add a fetch refspec to the remote's configuration

\n", + "comments": "

Add the given refspec to the fetch list in the configuration. No loaded remote instances will be affected.

\n", + "group": "remote" + }, + "git_remote_get_fetch_refspecs": { + "type": "function", + "file": "git2/remote.h", + "line": 340, + "lineto": 340, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "pointer to the array in which to store the strings" + }, + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "git_strarray *array, const git_remote *remote", + "sig": "git_strarray *::const git_remote *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get the remote's list of fetch refspecs

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "group": "remote" + }, + "git_remote_add_push": { + "type": "function", + "file": "git2/remote.h", + "line": 353, + "lineto": 353, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to change the configuration" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote to change" + }, + { + "name": "refspec", + "type": "const char *", + "comment": "the new push refspec" + } + ], + "argline": "git_repository *repo, const char *remote, const char *refspec", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC if refspec is invalid or an error value" + }, + "description": "

Add a push refspec to the remote's configuration

\n", + "comments": "

Add the given refspec to the push list in the configuration. No loaded remote instances will be affected.

\n", + "group": "remote" + }, + "git_remote_get_push_refspecs": { + "type": "function", + "file": "git2/remote.h", + "line": 365, + "lineto": 365, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "pointer to the array in which to store the strings" + }, + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "git_strarray *array, const git_remote *remote", + "sig": "git_strarray *::const git_remote *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Get the remote's list of push refspecs

\n", + "comments": "

The memory is owned by the user and should be freed with git_strarray_free.

\n", + "group": "remote" + }, + "git_remote_refspec_count": { + "type": "function", + "file": "git2/remote.h", + "line": 373, + "lineto": 373, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "size_t", + "comment": " the amount of refspecs configured in this remote" + }, + "description": "

Get the number of refspecs for a remote

\n", + "comments": "", + "group": "remote" + }, + "git_remote_get_refspec": { + "type": "function", + "file": "git2/remote.h", + "line": 382, + "lineto": 382, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + }, + { "name": "n", "type": "size_t", "comment": "the refspec to get" } + ], + "argline": "const git_remote *remote, size_t n", + "sig": "const git_remote *::size_t", + "return": { + "type": "const git_refspec *", + "comment": " the nth refspec" + }, + "description": "

Get a refspec from the remote

\n", + "comments": "", + "group": "remote" + }, + "git_remote_ls": { + "type": "function", + "file": "git2/remote.h", + "line": 404, + "lineto": 404, + "args": [ + { + "name": "out", + "type": "const git_remote_head ***", + "comment": "pointer to the array" + }, + { + "name": "size", + "type": "size_t *", + "comment": "the number of remote heads" + }, + { "name": "remote", "type": "git_remote *", "comment": "the remote" } + ], + "argline": "const git_remote_head ***out, size_t *size, git_remote *remote", + "sig": "const git_remote_head ***::size_t *::git_remote *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Get the remote repository's reference advertisement list

\n", + "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", + "group": "remote", + "examples": { + "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_ls-4"] + } + }, + "git_remote_connected": { + "type": "function", + "file": "git2/remote.h", + "line": 415, + "lineto": 415, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "int", + "comment": " 1 if it's connected, 0 otherwise." + }, + "description": "

Check whether the remote is connected

\n", + "comments": "

Check whether the remote's underlying transport is connected to the remote host.

\n", + "group": "remote" + }, + "git_remote_stop": { + "type": "function", + "file": "git2/remote.h", + "line": 426, + "lineto": 426, + "args": [ + { "name": "remote", "type": "git_remote *", "comment": "the remote" } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Cancel the operation

\n", + "comments": "

At certain points in its operation, the network code checks whether the operation has been cancelled and if so stops the operation.

\n", + "group": "remote" + }, + "git_remote_disconnect": { + "type": "function", + "file": "git2/remote.h", + "line": 436, + "lineto": 436, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to disconnect from" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Disconnect from the remote

\n", + "comments": "

Close the connection to the remote.

\n", + "group": "remote" + }, + "git_remote_free": { + "type": "function", + "file": "git2/remote.h", + "line": 446, + "lineto": 446, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to free" + } + ], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { "type": "void", "comment": null }, + "description": "

Free the memory associated with a remote

\n", + "comments": "

This also disconnects from the remote, if the connection has not been closed yet (using git_remote_disconnect).

\n", + "group": "remote", + "examples": { + "fetch.c": [ + "ex/v1.8.4/fetch.html#git_remote_free-6", + "ex/v1.8.4/fetch.html#git_remote_free-7" + ], + "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_free-5"], + "remote.c": ["ex/v1.8.4/remote.html#git_remote_free-7"] + } + }, + "git_remote_list": { + "type": "function", + "file": "git2/remote.h", + "line": 457, + "lineto": 457, + "args": [ + { + "name": "out", + "type": "git_strarray *", + "comment": "a string array which receives the names of the remotes" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to query" + } + ], + "argline": "git_strarray *out, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get a list of the configured remotes for a repo

\n", + "comments": "

The string array must be freed by the user.

\n", + "group": "remote", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_remote_list-22"], + "remote.c": ["ex/v1.8.4/remote.html#git_remote_list-8"] + } + }, + "git_remote_init_callbacks": { + "type": "function", + "file": "git2/remote.h", + "line": 671, + "lineto": 673, + "args": [ + { + "name": "opts", + "type": "git_remote_callbacks *", + "comment": "the `git_remote_callbacks` struct to initialize" + }, + { + "name": "version", + "type": "unsigned int", + "comment": "Version of struct; pass `GIT_REMOTE_CALLBACKS_VERSION`" + } + ], + "argline": "git_remote_callbacks *opts, unsigned int version", + "sig": "git_remote_callbacks *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initializes a git_remote_callbacks with default values. Equivalent to\n creating an instance with GIT_REMOTE_CALLBACKS_INIT.

\n", + "comments": "", + "group": "remote", + "examples": { + "push.c": ["ex/v1.8.4/push.html#git_remote_init_callbacks-2"] + } + }, + "git_fetch_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 806, + "lineto": 808, + "args": [ + { + "name": "opts", + "type": "git_fetch_options *", + "comment": "The `git_fetch_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_FETCH_OPTIONS_VERSION`." + } + ], + "argline": "git_fetch_options *opts, unsigned int version", + "sig": "git_fetch_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_fetch_options structure

\n", + "comments": "

Initializes a git_fetch_options with default values. Equivalent to creating an instance with GIT_FETCH_OPTIONS_INIT.

\n", + "group": "fetch" + }, + "git_push_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 868, + "lineto": 870, + "args": [ + { + "name": "opts", + "type": "git_push_options *", + "comment": "The `git_push_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_PUSH_OPTIONS_VERSION`." + } + ], + "argline": "git_push_options *opts, unsigned int version", + "sig": "git_push_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_push_options structure

\n", + "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", + "group": "push", + "examples": { "push.c": ["ex/v1.8.4/push.html#git_push_options_init-3"] } + }, + "git_remote_connect_options_init": { + "type": "function", + "file": "git2/remote.h", + "line": 916, + "lineto": 918, + "args": [ + { + "name": "opts", + "type": "git_remote_connect_options *", + "comment": "The `git_remote_connect_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REMOTE_CONNECT_OPTIONS_VERSION`." + } + ], + "argline": "git_remote_connect_options *opts, unsigned int version", + "sig": "git_remote_connect_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_remote_connect_options structure.

\n", + "comments": "

Initializes a git_remote_connect_options with default values. Equivalent to creating an instance with GIT_REMOTE_CONNECT_OPTIONS_INIT.

\n", + "group": "remote" + }, + "git_remote_connect": { + "type": "function", + "file": "git2/remote.h", + "line": 935, + "lineto": 940, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to connect to" + }, + { + "name": "direction", + "type": "git_direction", + "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "the callbacks to use for this connection" + }, + { + "name": "proxy_opts", + "type": "const git_proxy_options *", + "comment": "proxy settings" + }, + { + "name": "custom_headers", + "type": "const git_strarray *", + "comment": "extra HTTP headers to use in this connection" + } + ], + "argline": "git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_proxy_options *proxy_opts, const git_strarray *custom_headers", + "sig": "git_remote *::git_direction::const git_remote_callbacks *::const git_proxy_options *::const git_strarray *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a connection to a remote.

\n", + "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n", + "group": "remote", + "examples": { + "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_connect-6"] + } + }, + "git_remote_connect_ext": { + "type": "function", + "file": "git2/remote.h", + "line": 960, + "lineto": 963, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to connect to" + }, + { + "name": "direction", + "type": "git_direction", + "comment": "GIT_DIRECTION_FETCH if you want to fetch or\n GIT_DIRECTION_PUSH if you want to push" + }, + { + "name": "opts", + "type": "const git_remote_connect_options *", + "comment": "the remote connection options" + } + ], + "argline": "git_remote *remote, git_direction direction, const git_remote_connect_options *opts", + "sig": "git_remote *::git_direction::const git_remote_connect_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a connection to a remote with extended options.

\n", + "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n\n

The given options structure will form the defaults for connection options and callback setup. Callers may override these defaults by specifying git_fetch_options or git_push_options in subsequent calls.

\n", + "group": "remote" + }, + "git_remote_download": { + "type": "function", + "file": "git2/remote.h", + "line": 985, + "lineto": 988, + "args": [ + { "name": "remote", "type": "git_remote *", "comment": "the remote" }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this negotiation and\n download. Use NULL or an empty array to use the base refspecs" + }, + { + "name": "opts", + "type": "const git_fetch_options *", + "comment": "the options to use for this fetch or NULL" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts", + "sig": "git_remote *::const git_strarray *::const git_fetch_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Download and index the packfile.

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, download and index the packfile.

\n\n

The .idx file will be created and both it and the packfile with be renamed to their final name.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote" + }, + "git_remote_upload": { + "type": "function", + "file": "git2/remote.h", + "line": 1007, + "lineto": 1010, + "args": [ + { "name": "remote", "type": "git_remote *", "comment": "the remote" }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this negotiation and\n upload. Use NULL or an empty array to use the base refspecs" + }, + { + "name": "opts", + "type": "const git_push_options *", + "comment": "the options to use for this push" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", + "sig": "git_remote *::const git_strarray *::const git_push_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a packfile and send it to the server

\n", + "comments": "

Connect to the remote if it hasn't been done yet, negotiate with the remote git which objects are missing, create a packfile with the missing objects and send it.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote" + }, + "git_remote_update_tips": { + "type": "function", + "file": "git2/remote.h", + "line": 1029, + "lineto": 1034, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to update" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "pointer to the callback structure to use or NULL" + }, + { + "name": "update_flags", + "type": "unsigned int", + "comment": "the git_remote_update_flags for these tips." + }, + { + "name": "download_tags", + "type": "git_remote_autotag_option_t", + "comment": "what the behaviour for downloading tags is for this fetch. This is\n ignored for push. This must be the same value passed to `git_remote_download()`." + }, + { + "name": "reflog_message", + "type": "const char *", + "comment": "The message to insert into the reflogs. If\n NULL and fetching, the default is \"fetch \n\", where \n is\n the name of the remote (or its url, for in-memory remotes). This\n parameter is ignored when pushing." + } + ], + "argline": "git_remote *remote, const git_remote_callbacks *callbacks, unsigned int update_flags, git_remote_autotag_option_t download_tags, const char *reflog_message", + "sig": "git_remote *::const git_remote_callbacks *::unsigned int::git_remote_autotag_option_t::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Update the tips to the new state.

\n", + "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", + "group": "remote" + }, + "git_remote_fetch": { + "type": "function", + "file": "git2/remote.h", + "line": 1054, + "lineto": 1058, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to fetch from" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for this fetch. Pass NULL or an\n empty array to use the base refspecs." + }, + { + "name": "opts", + "type": "const git_fetch_options *", + "comment": "options to use for this fetch or NULL" + }, + { + "name": "reflog_message", + "type": "const char *", + "comment": "The message to insert into the reflogs. If NULL, the\n\t\t\t\t\t\t\t\t default is \"fetch\"" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_fetch_options *opts, const char *reflog_message", + "sig": "git_remote *::const git_strarray *::const git_fetch_options *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Download new data and update tips.

\n", + "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote", + "examples": { "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_fetch-8"] } + }, + "git_remote_prune": { + "type": "function", + "file": "git2/remote.h", + "line": 1070, + "lineto": 1072, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to prune" + }, + { + "name": "callbacks", + "type": "const git_remote_callbacks *", + "comment": "callbacks to use for this prune" + } + ], + "argline": "git_remote *remote, const git_remote_callbacks *callbacks", + "sig": "git_remote *::const git_remote_callbacks *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Prune tracking refs that are no longer present on remote.

\n", + "comments": "

If callbacks are not specified then the callbacks specified to git_remote_connect will be used (if it was called).

\n", + "group": "remote" + }, + "git_remote_push": { + "type": "function", + "file": "git2/remote.h", + "line": 1087, + "lineto": 1090, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to push to" + }, + { + "name": "refspecs", + "type": "const git_strarray *", + "comment": "the refspecs to use for pushing. If NULL or an empty\n array, the configured refspecs will be used" + }, + { + "name": "opts", + "type": "const git_push_options *", + "comment": "options to use for this push" + } + ], + "argline": "git_remote *remote, const git_strarray *refspecs, const git_push_options *opts", + "sig": "git_remote *::const git_strarray *::const git_push_options *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Perform a push.

\n", + "comments": "

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", + "group": "remote", + "examples": { "push.c": ["ex/v1.8.4/push.html#git_remote_push-4"] } + }, + "git_remote_stats": { + "type": "function", + "file": "git2/remote.h", + "line": 1095, + "lineto": 1095, + "args": [{ "name": "remote", "type": "git_remote *", "comment": null }], + "argline": "git_remote *remote", + "sig": "git_remote *", + "return": { "type": "const git_indexer_progress *", "comment": null }, + "description": "

Get the statistics structure that is filled in by the fetch operation.

\n", + "comments": "", + "group": "remote", + "examples": { "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_stats-9"] } + }, + "git_remote_autotag": { + "type": "function", + "file": "git2/remote.h", + "line": 1103, + "lineto": 1103, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { + "type": "git_remote_autotag_option_t", + "comment": " the auto-follow setting" + }, + "description": "

Retrieve the tag auto-follow setting

\n", + "comments": "", + "group": "remote" + }, + "git_remote_set_autotag": { + "type": "function", + "file": "git2/remote.h", + "line": 1116, + "lineto": 1116, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to make the change" + }, + { + "name": "remote", + "type": "const char *", + "comment": "the name of the remote" + }, + { + "name": "value", + "type": "git_remote_autotag_option_t", + "comment": "the new value to take." + } + ], + "argline": "git_repository *repo, const char *remote, git_remote_autotag_option_t value", + "sig": "git_repository *::const char *::git_remote_autotag_option_t", + "return": { "type": "int", "comment": " 0, or an error code." }, + "description": "

Set the remote's tag following setting.

\n", + "comments": "

The change will be made in the configuration. No loaded remotes will be affected.

\n", + "group": "remote" + }, + "git_remote_prune_refs": { + "type": "function", + "file": "git2/remote.h", + "line": 1124, + "lineto": 1124, + "args": [ + { + "name": "remote", + "type": "const git_remote *", + "comment": "the remote to query" + } + ], + "argline": "const git_remote *remote", + "sig": "const git_remote *", + "return": { "type": "int", "comment": " the ref-prune setting" }, + "description": "

Retrieve the ref-prune setting

\n", + "comments": "", + "group": "remote" + }, + "git_remote_rename": { + "type": "function", + "file": "git2/remote.h", + "line": 1146, + "lineto": 1150, + "args": [ + { + "name": "problems", + "type": "git_strarray *", + "comment": "non-default refspecs cannot be renamed and will be\n stored here for further processing by the caller. Always free this\n strarray on successful return." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to rename" + }, + { + "name": "name", + "type": "const char *", + "comment": "the current name of the remote" + }, + { + "name": "new_name", + "type": "const char *", + "comment": "the new name the remote should bear" + } + ], + "argline": "git_strarray *problems, git_repository *repo, const char *name, const char *new_name", + "sig": "git_strarray *::git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

Give the remote a new name

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_rename-9"] } + }, + "git_remote_name_is_valid": { + "type": "function", + "file": "git2/remote.h", + "line": 1159, + "lineto": 1159, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given remote name" + }, + { + "name": "remote_name", + "type": "const char *", + "comment": "name to be checked." + } + ], + "argline": "int *valid, const char *remote_name", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Ensure the remote name is well-formed.

\n", + "comments": "", + "group": "remote" + }, + "git_remote_delete": { + "type": "function", + "file": "git2/remote.h", + "line": 1171, + "lineto": 1171, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to act" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the remote to delete" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, or an error code." + }, + "description": "

Delete an existing persisted remote.

\n", + "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", + "group": "remote", + "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_delete-10"] } + }, + "git_remote_default_branch": { + "type": "function", + "file": "git2/remote.h", + "line": 1189, + "lineto": 1189, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer in which to store the reference name" + }, + { "name": "remote", "type": "git_remote *", "comment": "the remote" } + ], + "argline": "git_buf *out, git_remote *remote", + "sig": "git_buf *::git_remote *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the remote does not have any references\n or none of them point to HEAD's commit, or an error message." + }, + "description": "

Retrieve the name of the remote's default branch

\n", + "comments": "

The default branch of a repository is the branch which HEAD points to. If the remote does not support reporting this information directly, it performs the guess as git does; that is, if there are multiple branches which point to the same commit, the first one is chosen. If the master branch is a candidate, it wins.

\n\n

This function must only be called after connecting.

\n", + "group": "remote" + }, + "git_repository_open": { + "type": "function", + "file": "git2/repository.h", + "line": 38, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo which will be opened" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the repository" + } + ], + "argline": "git_repository **out, const char *path", + "sig": "git_repository **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a git repository.

\n", + "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n", + "group": "repository", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_repository_open-59"] + } + }, + "git_repository_open_from_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 49, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Output pointer containing opened repository" + }, + { + "name": "wt", + "type": "git_worktree *", + "comment": "Working tree to open" + } + ], + "argline": "git_repository **out, git_worktree *wt", + "sig": "git_repository **::git_worktree *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open working tree as a repository

\n", + "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", + "group": "repository" + }, + "git_repository_discover": { + "type": "function", + "file": "git2/repository.h", + "line": 100, + "lineto": 104, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "A pointer to a user-allocated git_buf which will contain\n the found path." + }, + { + "name": "start_path", + "type": "const char *", + "comment": "The base path where the lookup starts." + }, + { + "name": "across_fs", + "type": "int", + "comment": "If true, then the lookup will not stop when a\n filesystem device change is detected while exploring parent directories." + }, + { + "name": "ceiling_dirs", + "type": "const char *", + "comment": "A GIT_PATH_LIST_SEPARATOR separated list of\n absolute symbolic link free paths. The lookup will stop when any\n of this paths is reached. Note that the lookup always performs on\n start_path no matter start_path appears in ceiling_dirs ceiling_dirs\n might be NULL (which is equivalent to an empty string)" + } + ], + "argline": "git_buf *out, const char *start_path, int across_fs, const char *ceiling_dirs", + "sig": "git_buf *::const char *::int::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", + "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n", + "group": "repository" + }, + "git_repository_open_ext": { + "type": "function", + "file": "git2/repository.h", + "line": 176, + "lineto": 180, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be opened. This can\n actually be NULL if you only want to use the error code to\n see if a repo at this path could be opened." + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to open as git repository. If the flags\n permit \"searching\", then this can be a path to a subdirectory\n inside the working directory of the repository. May be NULL if\n flags is GIT_REPOSITORY_OPEN_FROM_ENV." + }, + { + "name": "flags", + "type": "unsigned int", + "comment": "A combination of the GIT_REPOSITORY_OPEN flags above." + }, + { + "name": "ceiling_dirs", + "type": "const char *", + "comment": "A GIT_PATH_LIST_SEPARATOR delimited list of path\n prefixes at which the search for a containing repository should\n terminate." + } + ], + "argline": "git_repository **out, const char *path, unsigned int flags, const char *ceiling_dirs", + "sig": "git_repository **::const char *::unsigned int::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if no repository could be found,\n or -1 if there was a repository but open failed for some reason\n (such as repo corruption or system errors)." + }, + "description": "

Find and open a repository with extended controls.

\n", + "comments": "", + "group": "repository", + "examples": { "log.c": ["ex/v1.8.4/log.html#git_repository_open_ext-43"] } + }, + "git_repository_open_bare": { + "type": "function", + "file": "git2/repository.h", + "line": 193, + "lineto": 193, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be opened." + }, + { + "name": "bare_path", + "type": "const char *", + "comment": "Direct path to the bare repository" + } + ], + "argline": "git_repository **out, const char *bare_path", + "sig": "git_repository **::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Open a bare repository on the serverside.

\n", + "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n", + "group": "repository" + }, + "git_repository_free": { + "type": "function", + "file": "git2/repository.h", + "line": 206, + "lineto": 206, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "repository handle to close. If NULL nothing occurs." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "void", "comment": null }, + "description": "

Free a previously allocated repository

\n", + "comments": "

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_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", + "group": "repository", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_repository_free-60"], + "init.c": ["ex/v1.8.4/init.html#git_repository_free-4"] + } + }, + "git_repository_init": { + "type": "function", + "file": "git2/repository.h", + "line": 223, + "lineto": 226, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo which will be created or reinitialized" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the repository" + }, + { + "name": "is_bare", + "type": "unsigned int", + "comment": "if true, a Git repository without a working directory is\n\t\tcreated at the pointed path. If false, provided path will be\n\t\tconsidered as the working directory into which the .git directory\n\t\twill be created." + } + ], + "argline": "git_repository **out, const char *path, unsigned int is_bare", + "sig": "git_repository **::const char *::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Creates a new Git repository in the given folder.

\n", + "comments": "

TODO: - Reinit the repository

\n", + "group": "repository", + "examples": { "init.c": ["ex/v1.8.4/init.html#git_repository_init-5"] } + }, + "git_repository_init_options_init": { + "type": "function", + "file": "git2/repository.h", + "line": 389, + "lineto": 391, + "args": [ + { + "name": "opts", + "type": "git_repository_init_options *", + "comment": "The `git_repository_init_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REPOSITORY_INIT_OPTIONS_VERSION`." + } + ], + "argline": "git_repository_init_options *opts, unsigned int version", + "sig": "git_repository_init_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_repository_init_options structure

\n", + "comments": "

Initializes a git_repository_init_options with default values. Equivalent to creating an instance with GIT_REPOSITORY_INIT_OPTIONS_INIT.

\n", + "group": "repository" + }, + "git_repository_init_ext": { + "type": "function", + "file": "git2/repository.h", + "line": 406, + "lineto": 409, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Pointer to the repo which will be created or reinitialized." + }, + { + "name": "repo_path", + "type": "const char *", + "comment": "The path to the repository." + }, + { + "name": "opts", + "type": "git_repository_init_options *", + "comment": "Pointer to git_repository_init_options struct." + } + ], + "argline": "git_repository **out, const char *repo_path, git_repository_init_options *opts", + "sig": "git_repository **::const char *::git_repository_init_options *", + "return": { "type": "int", "comment": " 0 or an error code on failure." }, + "description": "

Create a new Git repository in the given folder with extended controls.

\n", + "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n", + "group": "repository", + "examples": { + "init.c": ["ex/v1.8.4/init.html#git_repository_init_ext-6"] + } + }, + "git_repository_head": { + "type": "function", + "file": "git2/repository.h", + "line": 424, + "lineto": 424, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the reference which will be retrieved" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + } + ], + "argline": "git_reference **out, git_repository *repo", + "sig": "git_reference **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch, GIT_ENOTFOUND when HEAD is missing; an error code otherwise" + }, + "description": "

Retrieve and resolve the reference pointed at by HEAD.

\n", + "comments": "

The returned git_reference will be owned by caller and git_reference_free() must be called when done with it to release the allocated memory and prevent a leak.

\n", + "group": "repository", + "examples": { + "merge.c": [ + "ex/v1.8.4/merge.html#git_repository_head-31", + "ex/v1.8.4/merge.html#git_repository_head-32" + ], + "status.c": ["ex/v1.8.4/status.html#git_repository_head-3"] + } + }, + "git_repository_head_for_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 434, + "lineto": 435, + "args": [ + { + "name": "out", + "type": "git_reference **", + "comment": "pointer to the reference which will be retrieved" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the worktree to retrieve HEAD for" + } + ], + "argline": "git_reference **out, git_repository *repo, const char *name", + "sig": "git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 when successful, error-code otherwise" + }, + "description": "

Retrieve the referenced HEAD for the worktree

\n", + "comments": "", + "group": "repository" + }, + "git_repository_head_detached": { + "type": "function", + "file": "git2/repository.h", + "line": 447, + "lineto": 447, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if HEAD is detached, 0 if it's not; error code if there\n was an error." + }, + "description": "

Check if a repository's HEAD is detached

\n", + "comments": "

A repository's HEAD is detached when it points directly to a commit instead of a branch.

\n", + "group": "repository" + }, + "git_repository_head_detached_for_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 460, + "lineto": 461, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "a repository object" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the worktree to retrieve HEAD for" + } + ], + "argline": "git_repository *repo, const char *name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 1 if HEAD is detached, 0 if its not; error code if\n there was an error" + }, + "description": "

Check if a worktree's HEAD is detached

\n", + "comments": "

A worktree's HEAD is detached when it points directly to a commit instead of a branch.

\n", + "group": "repository" + }, + "git_repository_head_unborn": { + "type": "function", + "file": "git2/repository.h", + "line": 473, + "lineto": 473, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if the current branch is unborn, 0 if it's not; error\n code if there was an error" + }, + "description": "

Check if the current branch is unborn

\n", + "comments": "

An unborn 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.

\n", + "group": "repository" + }, + "git_repository_is_empty": { + "type": "function", + "file": "git2/repository.h", + "line": 487, + "lineto": 487, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repo to test" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is empty, 0 if it isn't, error code\n if the repository is corrupted" + }, + "description": "

Check if a repository is empty

\n", + "comments": "

An empty repository has just been initialized and contains no references apart from HEAD, which must be pointing to the unborn master branch, or the branch specified for the repository in the init.defaultBranch configuration variable.

\n", + "group": "repository" + }, + "git_repository_item_path": { + "type": "function", + "file": "git2/repository.h", + "line": 525, + "lineto": 525, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "Buffer to store the path at" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repository to get path for" + }, + { + "name": "item", + "type": "git_repository_item_t", + "comment": "The repository item for which to retrieve the path" + } + ], + "argline": "git_buf *out, const git_repository *repo, git_repository_item_t item", + "sig": "git_buf *::const git_repository *::git_repository_item_t", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the path cannot exist or an error code" + }, + "description": "

Get the location of a specific repository file or directory

\n", + "comments": "

This function will retrieve the path of a specific repository item. It will thereby honor things like the repository's common directory, gitdir, etc. In case a file path cannot exist for a given item (e.g. the working directory of a bare repository), GIT_ENOTFOUND is returned.

\n", + "group": "repository" + }, + "git_repository_path": { + "type": "function", + "file": "git2/repository.h", + "line": 536, + "lineto": 536, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the repository" + }, + "description": "

Get the path of this repository

\n", + "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", + "group": "repository", + "examples": { + "init.c": ["ex/v1.8.4/init.html#git_repository_path-7"], + "status.c": ["ex/v1.8.4/status.html#git_repository_path-4"] + } + }, + "git_repository_workdir": { + "type": "function", + "file": "git2/repository.h", + "line": 547, + "lineto": 547, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the working dir, if it exists" + }, + "description": "

Get the path of the working directory for this repository

\n", + "comments": "

If the repository is bare, this function will always return NULL.

\n", + "group": "repository", + "examples": { "init.c": ["ex/v1.8.4/init.html#git_repository_workdir-8"] } + }, + "git_repository_commondir": { + "type": "function", + "file": "git2/repository.h", + "line": 559, + "lineto": 559, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "A repository object" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "const char *", + "comment": " the path to the common dir" + }, + "description": "

Get the path of the shared common directory for this repository.

\n", + "comments": "

If the repository is bare, it is the root directory for the repository. If the repository is a worktree, it is the parent repo's gitdir. Otherwise, it is the gitdir.

\n", + "group": "repository" + }, + "git_repository_set_workdir": { + "type": "function", + "file": "git2/repository.h", + "line": 578, + "lineto": 579, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "workdir", + "type": "const char *", + "comment": "The path to a working directory" + }, + { + "name": "update_gitlink", + "type": "int", + "comment": "Create/update gitlink in workdir and set config\n \"core.worktree\" (if workdir is not the parent of the .git directory)" + } + ], + "argline": "git_repository *repo, const char *workdir, int update_gitlink", + "sig": "git_repository *::const char *::int", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Set the path to the working directory for this repository

\n", + "comments": "

The working directory doesn't need to be the same one that contains the .git folder for this repository.

\n\n

If this repository is bare, setting its working directory will turn it into a normal repository, capable of performing all the common workdir operations (checkout, status, index manipulation, etc).

\n", + "group": "repository" + }, + "git_repository_is_bare": { + "type": "function", + "file": "git2/repository.h", + "line": 587, + "lineto": 587, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repo to test" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is bare, 0 otherwise." + }, + "description": "

Check if a repository is bare

\n", + "comments": "", + "group": "repository", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_repository_is_bare-5"] + } + }, + "git_repository_is_worktree": { + "type": "function", + "file": "git2/repository.h", + "line": 595, + "lineto": 595, + "args": [ + { + "name": "repo", + "type": "const git_repository *", + "comment": "Repo to test" + } + ], + "argline": "const git_repository *repo", + "sig": "const git_repository *", + "return": { + "type": "int", + "comment": " 1 if the repository is a linked work tree, 0 otherwise." + }, + "description": "

Check if a repository is a linked work tree

\n", + "comments": "", + "group": "repository" + }, + "git_repository_config": { + "type": "function", + "file": "git2/repository.h", + "line": 611, + "lineto": 611, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the loaded configuration" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_config **out, git_repository *repo", + "sig": "git_config **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the configuration file for this repository.

\n", + "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "config.c": ["ex/v1.8.4/config.html#git_repository_config-9"] + } + }, + "git_repository_config_snapshot": { + "type": "function", + "file": "git2/repository.h", + "line": 627, + "lineto": 627, + "args": [ + { + "name": "out", + "type": "git_config **", + "comment": "Pointer to store the loaded configuration" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_config **out, git_repository *repo", + "sig": "git_config **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get a snapshot of the repository's configuration

\n", + "comments": "

Convenience function to take a snapshot from the repository's configuration. The contents of this snapshot will not change, even if the underlying config files are modified.

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "general.c": [ + "ex/v1.8.4/general.html#git_repository_config_snapshot-61", + "ex/v1.8.4/general.html#git_repository_config_snapshot-62" + ] + } + }, + "git_repository_odb": { + "type": "function", + "file": "git2/repository.h", + "line": 643, + "lineto": 643, + "args": [ + { + "name": "out", + "type": "git_odb **", + "comment": "Pointer to store the loaded ODB" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_odb **out, git_repository *repo", + "sig": "git_odb **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the Object Database for this repository.

\n", + "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_repository_odb-29"], + "general.c": ["ex/v1.8.4/general.html#git_repository_odb-63"] + } + }, + "git_repository_refdb": { + "type": "function", + "file": "git2/repository.h", + "line": 659, + "lineto": 659, + "args": [ + { + "name": "out", + "type": "git_refdb **", + "comment": "Pointer to store the loaded refdb" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_refdb **out, git_repository *repo", + "sig": "git_refdb **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the Reference Database Backend for this repository.

\n", + "comments": "

If a custom refsdb has not been set, the default database for the repository will be returned (the one that manipulates loose and packed references in the .git directory).

\n\n

The refdb must be freed once it's no longer being used by the user.

\n", + "group": "repository" + }, + "git_repository_index": { + "type": "function", + "file": "git2/repository.h", + "line": 675, + "lineto": 675, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "Pointer to store the loaded index" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_index **out, git_repository *repo", + "sig": "git_index **::git_repository *", + "return": { "type": "int", "comment": " 0, or an error code" }, + "description": "

Get the Index file for this repository.

\n", + "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", + "group": "repository", + "examples": { + "add.c": ["ex/v1.8.4/add.html#git_repository_index-5"], + "commit.c": ["ex/v1.8.4/commit.html#git_repository_index-8"], + "general.c": ["ex/v1.8.4/general.html#git_repository_index-64"], + "init.c": ["ex/v1.8.4/init.html#git_repository_index-9"], + "ls-files.c": ["ex/v1.8.4/ls-files.html#git_repository_index-5"], + "merge.c": ["ex/v1.8.4/merge.html#git_repository_index-33"] + } + }, + "git_repository_message": { + "type": "function", + "file": "git2/repository.h", + "line": 693, + "lineto": 693, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "git_buf to write data into" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to read prepared message from" + } + ], + "argline": "git_buf *out, git_repository *repo", + "sig": "git_buf *::git_repository *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if no message exists or an error code" + }, + "description": "

Retrieve git's prepared message

\n", + "comments": "

Operations such as git revert/cherry-pick/merge with the -n option stop just short of creating a commit with the changes and save their prepared message in .git/MERGE_MSG so the next git-commit execution can present it to the user for them to amend if they wish.

\n\n

Use this function to get the contents of this file. Don't forget to remove the file after you create the commit.

\n", + "group": "repository" + }, + "git_repository_message_remove": { + "type": "function", + "file": "git2/repository.h", + "line": 703, + "lineto": 703, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to remove prepared message from." + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Remove git's prepared message.

\n", + "comments": "

Remove the message that git_repository_message retrieves.

\n", + "group": "repository" + }, + "git_repository_state_cleanup": { + "type": "function", + "file": "git2/repository.h", + "line": 712, + "lineto": 712, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 0 on success, or error" }, + "description": "

Remove all the metadata associated with an ongoing command like merge,\n revert, cherry-pick, etc. For example: MERGE_HEAD, MERGE_MSG, etc.

\n", + "comments": "", + "group": "repository", + "examples": { + "merge.c": ["ex/v1.8.4/merge.html#git_repository_state_cleanup-34"] + } + }, + "git_repository_fetchhead_foreach": { + "type": "function", + "file": "git2/repository.h", + "line": 743, + "lineto": 746, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_repository_fetchhead_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_repository_fetchhead_foreach_cb callback, void *payload", + "sig": "git_repository *::git_repository_fetchhead_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no FETCH_HEAD file, or other error code." + }, + "description": "

Invoke 'callback' for each entry in the given FETCH_HEAD file.

\n", + "comments": "

Return a non-zero value from the callback to stop the loop.

\n", + "group": "repository" + }, + "git_repository_mergehead_foreach": { + "type": "function", + "file": "git2/repository.h", + "line": 772, + "lineto": 775, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_repository_mergehead_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_repository_mergehead_foreach_cb callback, void *payload", + "sig": "git_repository *::git_repository_mergehead_foreach_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, GIT_ENOTFOUND if\n there is no MERGE_HEAD file, or other error code." + }, + "description": "

If a merge is in progress, invoke 'callback' for each commit ID in the\n MERGE_HEAD file.

\n", + "comments": "

Return a non-zero value from the callback to stop the loop.

\n", + "group": "repository" + }, + "git_repository_hashfile": { + "type": "function", + "file": "git2/repository.h", + "line": 802, + "lineto": 807, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Output value of calculated SHA" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to file on disk whose contents should be hashed. This\n may be an absolute path or a relative path, in which case it\n will be treated as a path within the working directory." + }, + { + "name": "type", + "type": "git_object_t", + "comment": "The object type to hash as (e.g. GIT_OBJECT_BLOB)" + }, + { + "name": "as_path", + "type": "const char *", + "comment": "The path to use to look up filtering rules. If this is\n an empty string then no filters will be applied when\n calculating the hash. If this is `NULL` and the `path`\n parameter is a file within the repository's working\n directory, then the `path` will be used." + } + ], + "argline": "git_oid *out, git_repository *repo, const char *path, git_object_t type, const char *as_path", + "sig": "git_oid *::git_repository *::const char *::git_object_t::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Calculate hash of file using repository filtering rules.

\n", + "comments": "

If you simply want to calculate the hash of a file on disk with no filters, you can just use the git_odb_hashfile() API. However, if you want to hash a file in the repository and you want to apply filtering rules (e.g. crlf filters) before generating the SHA, then use this function.

\n\n

Note: if the repository has core.safecrlf set to fail and the filtering triggers that failure, then this function will return an error and not calculate the hash of the file.

\n", + "group": "repository" + }, + "git_repository_set_head": { + "type": "function", + "file": "git2/repository.h", + "line": 827, + "lineto": 829, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "refname", + "type": "const char *", + "comment": "Canonical name of the reference the HEAD should point at" + } + ], + "argline": "git_repository *repo, const char *refname", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Make the repository HEAD point to the specified reference.

\n", + "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", + "group": "repository", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_repository_set_head-23"] + } + }, + "git_repository_set_head_detached": { + "type": "function", + "file": "git2/repository.h", + "line": 847, + "lineto": 849, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, + { + "name": "committish", + "type": "const git_oid *", + "comment": "Object id of the Commit the HEAD should point to" + } + ], + "argline": "git_repository *repo, const git_oid *committish", + "sig": "git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Make the repository HEAD directly point to the Commit.

\n", + "comments": "

If the provided committish cannot be found in the repository, the HEAD is unaltered and GIT_ENOTFOUND is returned.

\n\n

If the provided committish cannot be peeled into a commit, the HEAD is unaltered and -1 is returned.

\n\n

Otherwise, the HEAD will eventually be detached and will directly point to the peeled Commit.

\n", + "group": "repository" + }, + "git_repository_set_head_detached_from_annotated": { + "type": "function", + "file": "git2/repository.h", + "line": 863, + "lineto": 865, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": null }, + { + "name": "committish", + "type": "const git_annotated_commit *", + "comment": null + } + ], + "argline": "git_repository *repo, const git_annotated_commit *committish", + "sig": "git_repository *::const git_annotated_commit *", + "return": { "type": "int", "comment": null }, + "description": "

Make the repository HEAD directly point to the Commit.

\n", + "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", + "group": "repository", + "examples": { + "checkout.c": [ + "ex/v1.8.4/checkout.html#git_repository_set_head_detached_from_annotated-24" + ] + } + }, + "git_repository_detach_head": { + "type": "function", + "file": "git2/repository.h", + "line": 884, + "lineto": 885, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNBORNBRANCH when HEAD points to a non existing\n branch or an error code" + }, + "description": "

Detach the HEAD.

\n", + "comments": "

If the HEAD is already detached and points to a Commit, 0 is returned.

\n\n

If the HEAD is already detached and points to a Tag, the HEAD is updated into making it point to the peeled Commit, and 0 is returned.

\n\n

If the HEAD is already detached and points to a non committish, the HEAD is unaltered, and -1 is returned.

\n\n

Otherwise, the HEAD will be detached and point to the peeled Commit.

\n", + "group": "repository" + }, + "git_repository_state": { + "type": "function", + "file": "git2/repository.h", + "line": 915, + "lineto": 915, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " The state of the repository" }, + "description": "

Determines the status of a git repository - ie, whether an operation\n (merge, cherry-pick, etc) is in progress.

\n", + "comments": "", + "group": "repository", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_repository_state-25"], + "merge.c": ["ex/v1.8.4/merge.html#git_repository_state-35"] + } + }, + "git_repository_set_namespace": { + "type": "function", + "file": "git2/repository.h", + "line": 929, + "lineto": 929, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": "The repo" }, + { + "name": "nmspace", + "type": "const char *", + "comment": "The namespace. This should not include the refs\n\tfolder, e.g. to namespace all references under `refs/namespaces/foo/`,\n\tuse `foo` as the namespace." + } + ], + "argline": "git_repository *repo, const char *nmspace", + "sig": "git_repository *::const char *", + "return": { "type": "int", "comment": " 0 on success, -1 on error" }, + "description": "

Sets the active namespace for this Git Repository

\n", + "comments": "

This namespace affects all reference operations for the repo. See man gitnamespaces

\n", + "group": "repository" + }, + "git_repository_get_namespace": { + "type": "function", + "file": "git2/repository.h", + "line": 937, + "lineto": 937, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": "The repo" } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { + "type": "const char *", + "comment": " the active namespace, or NULL if there isn't one" + }, + "description": "

Get the currently active namespace for this repository

\n", + "comments": "", + "group": "repository" + }, + "git_repository_is_shallow": { + "type": "function", + "file": "git2/repository.h", + "line": 946, + "lineto": 946, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "int", "comment": " 1 if shallow, zero if not" }, + "description": "

Determine if the repository was a shallow clone

\n", + "comments": "", + "group": "repository" + }, + "git_repository_ident": { + "type": "function", + "file": "git2/repository.h", + "line": 959, + "lineto": 959, + "args": [ + { + "name": "name", + "type": "const char **", + "comment": "where to store the pointer to the name" + }, + { + "name": "email", + "type": "const char **", + "comment": "where to store the pointer to the email" + }, + { + "name": "repo", + "type": "const git_repository *", + "comment": "the repository" + } + ], + "argline": "const char **name, const char **email, const git_repository *repo", + "sig": "const char **::const char **::const git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Retrieve the configured identity to use for reflogs

\n", + "comments": "

The memory is owned by the repository and must not be freed by the user.

\n", + "group": "repository" + }, + "git_repository_set_ident": { + "type": "function", + "file": "git2/repository.h", + "line": 973, + "lineto": 973, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to configure" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name to use for the reflog entries" + }, + { + "name": "email", + "type": "const char *", + "comment": "the email to use for the reflog entries" + } + ], + "argline": "git_repository *repo, const char *name, const char *email", + "sig": "git_repository *::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Set the identity to be used for writing reflogs

\n", + "comments": "

If both are set, this name and email will be used to write to the reflog. Pass NULL to unset. When unset, the identity will be taken from the repository's configuration.

\n", + "group": "repository" + }, + "git_repository_oid_type": { + "type": "function", + "file": "git2/repository.h", + "line": 981, + "lineto": 981, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_repository *repo", + "sig": "git_repository *", + "return": { "type": "git_oid_t", "comment": " the object id type" }, + "description": "

Gets the object type used by this repository.

\n", + "comments": "", + "group": "repository" + }, + "git_repository_commit_parents": { + "type": "function", + "file": "git2/repository.h", + "line": 992, + "lineto": 992, + "args": [ + { + "name": "commits", + "type": "git_commitarray *", + "comment": "a `git_commitarray` that will contain the commit parents" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository" + } + ], + "argline": "git_commitarray *commits, git_repository *repo", + "sig": "git_commitarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Gets the parents of the next commit, given the current repository state.\n Generally, this is the HEAD commit, except when performing a merge, in\n which case it is two or more commits.

\n", + "comments": "", + "group": "repository" + }, + "git_reset": { + "type": "function", + "file": "git2/reset.h", + "line": 62, + "lineto": 66, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Committish to which the Head should be moved to. This object\n must belong to the given `repo` and can either be a git_commit or a\n git_tag. When a git_tag is being passed, it should be dereferenceable\n to a git_commit which oid will be used as the target of the branch." + }, + { + "name": "reset_type", + "type": "git_reset_t", + "comment": "Kind of reset operation to perform." + }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": "Optional checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks." + } + ], + "argline": "git_repository *repo, const git_object *target, git_reset_t reset_type, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_object *::git_reset_t::const git_checkout_options *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", + "comments": "

SOFT reset means the Head will be moved to the commit.

\n\n

MIXED reset will trigger a SOFT reset, plus the index will be replaced with the content of the commit tree.

\n\n

HARD reset will trigger a MIXED reset and the working directory will be replaced with the content of the index. (Untracked and ignored files will be left alone, however.)

\n\n

TODO: Implement remaining kinds of resets.

\n", + "group": "reset" + }, + "git_reset_from_annotated": { + "type": "function", + "file": "git2/reset.h", + "line": 80, + "lineto": 84, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": null }, + { + "name": "commit", + "type": "const git_annotated_commit *", + "comment": null + }, + { "name": "reset_type", "type": "git_reset_t", "comment": null }, + { + "name": "checkout_opts", + "type": "const git_checkout_options *", + "comment": null + } + ], + "argline": "git_repository *repo, const git_annotated_commit *commit, git_reset_t reset_type, const git_checkout_options *checkout_opts", + "sig": "git_repository *::const git_annotated_commit *::git_reset_t::const git_checkout_options *", + "return": { "type": "int", "comment": null }, + "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", + "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", + "group": "reset" + }, + "git_reset_default": { + "type": "function", + "file": "git2/reset.h", + "line": 104, + "lineto": 107, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", + "type": "const git_object *", + "comment": "The committish which content will be used to reset the content\n of the index." + }, + { + "name": "pathspecs", + "type": "const git_strarray *", + "comment": "List of pathspecs to operate on." + } + ], + "argline": "git_repository *repo, const git_object *target, const git_strarray *pathspecs", + "sig": "git_repository *::const git_object *::const git_strarray *", + "return": { + "type": "int", + "comment": " 0 on success or an error code \n<\n 0" + }, + "description": "

Updates some entries in the index from the target commit tree.

\n", + "comments": "

The scope of the updated entries is determined by the paths being passed in the pathspec parameters.

\n\n

Passing a NULL target will result in removing entries in the index matching the provided pathspecs.

\n", + "group": "reset" + }, + "git_revert_options_init": { + "type": "function", + "file": "git2/revert.h", + "line": 49, + "lineto": 51, + "args": [ + { + "name": "opts", + "type": "git_revert_options *", + "comment": "The `git_revert_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_REVERT_OPTIONS_VERSION`." + } + ], + "argline": "git_revert_options *opts, unsigned int version", + "sig": "git_revert_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_revert_options structure

\n", + "comments": "

Initializes a git_revert_options with default values. Equivalent to creating an instance with GIT_REVERT_OPTIONS_INIT.

\n", + "group": "revert" + }, + "git_revert_commit": { + "type": "function", + "file": "git2/revert.h", + "line": 67, + "lineto": 73, + "args": [ + { + "name": "out", + "type": "git_index **", + "comment": "pointer to store the index result in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository that contains the given commits" + }, + { + "name": "revert_commit", + "type": "git_commit *", + "comment": "the commit to revert" + }, + { + "name": "our_commit", + "type": "git_commit *", + "comment": "the commit to revert against (eg, HEAD)" + }, + { + "name": "mainline", + "type": "unsigned int", + "comment": "the parent of the revert commit, if it is a merge" + }, + { + "name": "merge_options", + "type": "const git_merge_options *", + "comment": "the merge options (or null for defaults)" + } + ], + "argline": "git_index **out, git_repository *repo, git_commit *revert_commit, git_commit *our_commit, unsigned int mainline, const git_merge_options *merge_options", + "sig": "git_index **::git_repository *::git_commit *::git_commit *::unsigned int::const git_merge_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Reverts the given commit against the given "our" commit, producing an\n index that reflects the result of the revert.

\n", + "comments": "

The returned index must be freed explicitly with git_index_free.

\n", + "group": "revert" + }, + "git_revert": { + "type": "function", + "file": "git2/revert.h", + "line": 83, + "lineto": 86, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to revert" + }, + { + "name": "commit", + "type": "git_commit *", + "comment": "the commit to revert" + }, + { + "name": "given_opts", + "type": "const git_revert_options *", + "comment": "the revert options (or null for defaults)" + } + ], + "argline": "git_repository *repo, git_commit *commit, const git_revert_options *given_opts", + "sig": "git_repository *::git_commit *::const git_revert_options *", + "return": { + "type": "int", + "comment": " zero on success, -1 on failure." + }, + "description": "

Reverts the given commit, producing changes in the index and working directory.

\n", + "comments": "", + "group": "revert" + }, + "git_revparse_single": { + "type": "function", + "file": "git2/revparse.h", + "line": 37, + "lineto": 38, + "args": [ + { + "name": "out", + "type": "git_object **", + "comment": "pointer to output object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the textual specification for an object" + } + ], + "argline": "git_object **out, git_repository *repo, const char *spec", + "sig": "git_object **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Find a single object, as specified by a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", + "group": "revparse", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_revparse_single-22"], + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_revparse_single-30"], + "describe.c": ["ex/v1.8.4/describe.html#git_revparse_single-6"], + "log.c": ["ex/v1.8.4/log.html#git_revparse_single-44"], + "tag.c": [ + "ex/v1.8.4/tag.html#git_revparse_single-9", + "ex/v1.8.4/tag.html#git_revparse_single-10", + "ex/v1.8.4/tag.html#git_revparse_single-11", + "ex/v1.8.4/tag.html#git_revparse_single-12" + ] + } + }, + "git_revparse_ext": { + "type": "function", + "file": "git2/revparse.h", + "line": 61, + "lineto": 65, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer to output object" + }, + { + "name": "reference_out", + "type": "git_reference **", + "comment": "pointer to output reference or NULL" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the textual specification for an object" + } + ], + "argline": "git_object **object_out, git_reference **reference_out, git_repository *repo, const char *spec", + "sig": "git_object **::git_reference **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND, GIT_EAMBIGUOUS, GIT_EINVALIDSPEC\n or an error code" + }, + "description": "

Find a single object and intermediate reference by a revision string.

\n", + "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", + "group": "revparse", + "examples": { "commit.c": ["ex/v1.8.4/commit.html#git_revparse_ext-9"] } + }, + "git_revparse": { + "type": "function", + "file": "git2/revparse.h", + "line": 105, + "lineto": 108, + "args": [ + { + "name": "revspec", + "type": "git_revspec *", + "comment": "Pointer to an user-allocated git_revspec struct where\n\t the result of the rev-parse will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to search in" + }, + { + "name": "spec", + "type": "const char *", + "comment": "the rev-parse spec to parse" + } + ], + "argline": "git_revspec *revspec, git_repository *repo, const char *spec", + "sig": "git_revspec *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code" + }, + "description": "

Parse a revision string for from, to, and intent.

\n", + "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", + "group": "revparse", + "examples": { + "blame.c": ["ex/v1.8.4/blame.html#git_revparse-23"], + "log.c": ["ex/v1.8.4/log.html#git_revparse-45"], + "rev-parse.c": [ + "ex/v1.8.4/rev-parse.html#git_revparse-14", + "ex/v1.8.4/rev-parse.html#git_revparse-15" + ] + } + }, + "git_revwalk_new": { + "type": "function", + "file": "git2/revwalk.h", + "line": 73, + "lineto": 73, + "args": [ + { + "name": "out", + "type": "git_revwalk **", + "comment": "pointer to the new revision walker" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to walk through" + } + ], + "argline": "git_revwalk **out, git_repository *repo", + "sig": "git_revwalk **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Allocate a new revision walker to iterate through a repo.

\n", + "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

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.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_revwalk_new-65"], + "log.c": [ + "ex/v1.8.4/log.html#git_revwalk_new-46", + "ex/v1.8.4/log.html#git_revwalk_new-47" + ] + } + }, + "git_revwalk_reset": { + "type": "function", + "file": "git2/revwalk.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "walker", + "type": "git_revwalk *", + "comment": "handle to reset." + } + ], + "argline": "git_revwalk *walker", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Reset the revision walker for reuse.

\n", + "comments": "

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.

\n\n

The revision walk is automatically reset when a walk is over.

\n", + "group": "revwalk" + }, + "git_revwalk_push": { + "type": "function", + "file": "git2/revwalk.h", + "line": 108, + "lineto": 108, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the oid of the commit to start from." + } + ], + "argline": "git_revwalk *walk, const git_oid *id", + "sig": "git_revwalk *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a new root for the traversal

\n", + "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_revwalk_push-66"], + "log.c": ["ex/v1.8.4/log.html#git_revwalk_push-48"] + } + }, + "git_revwalk_push_glob": { + "type": "function", + "file": "git2/revwalk.h", + "line": 126, + "lineto": 126, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob pattern references should match" + } + ], + "argline": "git_revwalk *walk, const char *glob", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push matching references

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern will be pushed to the revision walker.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "group": "revwalk" + }, + "git_revwalk_push_head": { + "type": "function", + "file": "git2/revwalk.h", + "line": 134, + "lineto": 134, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push the repository's HEAD

\n", + "comments": "", + "group": "revwalk", + "examples": { "log.c": ["ex/v1.8.4/log.html#git_revwalk_push_head-49"] } + }, + "git_revwalk_hide": { + "type": "function", + "file": "git2/revwalk.h", + "line": 149, + "lineto": 149, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "commit_id", + "type": "const git_oid *", + "comment": "the oid of commit that will be ignored during the traversal" + } + ], + "argline": "git_revwalk *walk, const git_oid *commit_id", + "sig": "git_revwalk *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", + "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", + "group": "revwalk", + "examples": { "log.c": ["ex/v1.8.4/log.html#git_revwalk_hide-50"] } + }, + "git_revwalk_hide_glob": { + "type": "function", + "file": "git2/revwalk.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "glob", + "type": "const char *", + "comment": "the glob pattern references should match" + } + ], + "argline": "git_revwalk *walk, const char *glob", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Hide matching references.

\n", + "comments": "

The OIDs pointed to by the references that match the given glob pattern and their ancestors will be hidden from the output on the revision walk.

\n\n

A leading 'refs/' is implied if not present as well as a trailing '/*' if the glob lacks '?', '*' or '['.

\n\n

Any references matching this glob which do not point to a committish will be ignored.

\n", + "group": "revwalk" + }, + "git_revwalk_hide_head": { + "type": "function", + "file": "git2/revwalk.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Hide the repository's HEAD

\n", + "comments": "", + "group": "revwalk" + }, + "git_revwalk_push_ref": { + "type": "function", + "file": "git2/revwalk.h", + "line": 187, + "lineto": 187, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to push" + } + ], + "argline": "git_revwalk *walk, const char *refname", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push the OID pointed to by a reference

\n", + "comments": "

The reference must point to a committish.

\n", + "group": "revwalk" + }, + "git_revwalk_hide_ref": { + "type": "function", + "file": "git2/revwalk.h", + "line": 198, + "lineto": 198, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to hide" + } + ], + "argline": "git_revwalk *walk, const char *refname", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Hide the OID pointed to by a reference

\n", + "comments": "

The reference must point to a committish.

\n", + "group": "revwalk" + }, + "git_revwalk_next": { + "type": "function", + "file": "git2/revwalk.h", + "line": 218, + "lineto": 218, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Pointer where to store the oid of the next commit" + }, + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker to pop the commit from." + } + ], + "argline": "git_oid *out, git_revwalk *walk", + "sig": "git_oid *::git_revwalk *", + "return": { + "type": "int", + "comment": " 0 if the next commit was found;\n\tGIT_ITEROVER if there are no commits left to iterate" + }, + "description": "

Get the next commit from the revision walk.

\n", + "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

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).

\n\n

The revision walker is reset when the walk is over.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_revwalk_next-67"], + "log.c": ["ex/v1.8.4/log.html#git_revwalk_next-51"] + } + }, + "git_revwalk_sorting": { + "type": "function", + "file": "git2/revwalk.h", + "line": 230, + "lineto": 230, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal." + }, + { + "name": "sort_mode", + "type": "unsigned int", + "comment": "combination of GIT_SORT_XXX flags" + } + ], + "argline": "git_revwalk *walk, unsigned int sort_mode", + "sig": "git_revwalk *::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Change the sorting mode when iterating through the\n repository's contents.

\n", + "comments": "

Changing the sorting mode resets the walker.

\n", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_revwalk_sorting-68"], + "log.c": [ + "ex/v1.8.4/log.html#git_revwalk_sorting-52", + "ex/v1.8.4/log.html#git_revwalk_sorting-53" + ] + } + }, + "git_revwalk_push_range": { + "type": "function", + "file": "git2/revwalk.h", + "line": 245, + "lineto": 245, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the walker being used for the traversal" + }, + { "name": "range", "type": "const char *", "comment": "the range" } + ], + "argline": "git_revwalk *walk, const char *range", + "sig": "git_revwalk *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Push and hide the respective endpoints of the given range.

\n", + "comments": "

The range should be of the form .. where each is in the form accepted by 'git_revparse_single'. The left-hand commit will be hidden and the right-hand commit pushed.

\n", + "group": "revwalk" + }, + "git_revwalk_simplify_first_parent": { + "type": "function", + "file": "git2/revwalk.h", + "line": 255, + "lineto": 255, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "The revision walker." + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Simplify the history by first-parent

\n", + "comments": "

No parents other than the first for each commit will be enqueued.

\n", + "group": "revwalk" + }, + "git_revwalk_free": { + "type": "function", + "file": "git2/revwalk.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "traversal handle to close. If NULL nothing occurs." + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { "type": "void", "comment": null }, + "description": "

Free a revision walker previously allocated.

\n", + "comments": "", + "group": "revwalk", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_revwalk_free-69"], + "log.c": ["ex/v1.8.4/log.html#git_revwalk_free-54"] + } + }, + "git_revwalk_repository": { + "type": "function", + "file": "git2/revwalk.h", + "line": 272, + "lineto": 272, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revision walker" + } + ], + "argline": "git_revwalk *walk", + "sig": "git_revwalk *", + "return": { + "type": "git_repository *", + "comment": " the repository being walked" + }, + "description": "

Return the repository on which this walker\n is operating.

\n", + "comments": "", + "group": "revwalk" + }, + "git_revwalk_add_hide_cb": { + "type": "function", + "file": "git2/revwalk.h", + "line": 295, + "lineto": 298, + "args": [ + { + "name": "walk", + "type": "git_revwalk *", + "comment": "the revision walker" + }, + { + "name": "hide_cb", + "type": "git_revwalk_hide_cb", + "comment": "callback function to hide a commit and its parents" + }, + { + "name": "payload", + "type": "void *", + "comment": "data payload to be passed to callback function" + } + ], + "argline": "git_revwalk *walk, git_revwalk_hide_cb hide_cb, void *payload", + "sig": "git_revwalk *::git_revwalk_hide_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Adds, changes or removes a callback function to hide a commit and its parents

\n", + "comments": "", + "group": "revwalk" + }, + "git_signature_new": { + "type": "function", + "file": "git2/signature.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature, in case of error NULL" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the person" + }, + { + "name": "email", + "type": "const char *", + "comment": "email of the person" + }, + { + "name": "time", + "type": "git_time_t", + "comment": "time (in seconds from epoch) when the action happened" + }, + { + "name": "offset", + "type": "int", + "comment": "timezone offset (in minutes) for the time" + } + ], + "argline": "git_signature **out, const char *name, const char *email, git_time_t time, int offset", + "sig": "git_signature **::const char *::const char *::git_time_t::int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new action signature.

\n", + "comments": "

Call git_signature_free() to free the data.

\n\n

Note: angle brackets ('<' and '>') characters are not allowed to be used in either the name or the email parameter.

\n", + "group": "signature", + "examples": { + "general.c": [ + "ex/v1.8.4/general.html#git_signature_new-70", + "ex/v1.8.4/general.html#git_signature_new-71" + ] + } + }, + "git_signature_now": { + "type": "function", + "file": "git2/signature.h", + "line": 49, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature, in case of error NULL" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the person" + }, + { + "name": "email", + "type": "const char *", + "comment": "email of the person" + } + ], + "argline": "git_signature **out, const char *name, const char *email", + "sig": "git_signature **::const char *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new action signature with a timestamp of 'now'.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "signature", + "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_signature_now-36"] } + }, + "git_signature_default": { + "type": "function", + "file": "git2/signature.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository pointer" + } + ], + "argline": "git_signature **out, git_repository *repo", + "sig": "git_signature **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" + }, + "description": "

Create a new action signature with default user and now timestamp.

\n", + "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", + "group": "signature", + "examples": { + "commit.c": ["ex/v1.8.4/commit.html#git_signature_default-10"], + "init.c": ["ex/v1.8.4/init.html#git_signature_default-10"], + "tag.c": ["ex/v1.8.4/tag.html#git_signature_default-13"] + } + }, + "git_signature_from_buffer": { + "type": "function", + "file": "git2/signature.h", + "line": 76, + "lineto": 76, + "args": [ + { + "name": "out", + "type": "git_signature **", + "comment": "new signature" + }, + { "name": "buf", "type": "const char *", "comment": "signature string" } + ], + "argline": "git_signature **out, const char *buf", + "sig": "git_signature **::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALID if the signature is not parseable, or an error code" + }, + "description": "

Create a new signature by parsing the given buffer, which is\n expected to be in the format "Real Name \n<email

\n\n
\n

timestamp tzoffset",\n where timestamp is the number of seconds since the Unix epoch and\n tzoffset is the timezone offset in hhmm format (note the lack\n of a colon separator).

\n
\n", + "comments": "", + "group": "signature" + }, + "git_signature_dup": { + "type": "function", + "file": "git2/signature.h", + "line": 88, + "lineto": 88, + "args": [ + { + "name": "dest", + "type": "git_signature **", + "comment": "pointer where to store the copy" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to duplicate" + } + ], + "argline": "git_signature **dest, const git_signature *sig", + "sig": "git_signature **::const git_signature *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a copy of an existing signature. All internal strings are also\n duplicated.

\n", + "comments": "

Call git_signature_free() to free the data.

\n", + "group": "signature" + }, + "git_signature_free": { + "type": "function", + "file": "git2/signature.h", + "line": 99, + "lineto": 99, + "args": [ + { + "name": "sig", + "type": "git_signature *", + "comment": "signature to free" + } + ], + "argline": "git_signature *sig", + "sig": "git_signature *", + "return": { "type": "void", "comment": null }, + "description": "

Free an existing signature.

\n", + "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", + "group": "signature", + "examples": { + "commit.c": ["ex/v1.8.4/commit.html#git_signature_free-11"], + "general.c": [ + "ex/v1.8.4/general.html#git_signature_free-72", + "ex/v1.8.4/general.html#git_signature_free-73" + ], + "init.c": ["ex/v1.8.4/init.html#git_signature_free-11"], + "tag.c": ["ex/v1.8.4/tag.html#git_signature_free-14"] + } + }, + "git_stash_save": { + "type": "function", + "file": "git2/stash.h", + "line": 67, + "lineto": 72, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "stasher", + "type": "const git_signature *", + "comment": "The identity of the person performing the stashing." + }, + { + "name": "message", + "type": "const char *", + "comment": "Optional description along with the stashed state." + }, + { + "name": "flags", + "type": "uint32_t", + "comment": "Flags to control the stashing process. (see GIT_STASH_* above)" + } + ], + "argline": "git_oid *out, git_repository *repo, const git_signature *stasher, const char *message, uint32_t flags", + "sig": "git_oid *::git_repository *::const git_signature *::const char *::uint32_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_save_options_init": { + "type": "function", + "file": "git2/stash.h", + "line": 110, + "lineto": 111, + "args": [ + { + "name": "opts", + "type": "git_stash_save_options *", + "comment": "The `git_stash_save_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STASH_SAVE_OPTIONS_VERSION`." + } + ], + "argline": "git_stash_save_options *opts, unsigned int version", + "sig": "git_stash_save_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_stash_save_options structure

\n", + "comments": "

Initializes a git_stash_save_options with default values. Equivalent to creating an instance with GIT_STASH_SAVE_OPTIONS_INIT.

\n", + "group": "stash" + }, + "git_stash_save_with_opts": { + "type": "function", + "file": "git2/stash.h", + "line": 123, + "lineto": 126, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "Object id of the commit containing the stashed state.\n This commit is also the target of the direct reference refs/stash." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "opts", + "type": "const git_stash_save_options *", + "comment": "The stash options." + } + ], + "argline": "git_oid *out, git_repository *repo, const git_stash_save_options *opts", + "sig": "git_oid *::git_repository *::const git_stash_save_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND where there's nothing to stash,\n or error code." + }, + "description": "

Save the local modifications to a new stash, with options.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_apply_options_init": { + "type": "function", + "file": "git2/stash.h", + "line": 210, + "lineto": 211, + "args": [ + { + "name": "opts", + "type": "git_stash_apply_options *", + "comment": "The `git_stash_apply_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STASH_APPLY_OPTIONS_VERSION`." + } + ], + "argline": "git_stash_apply_options *opts, unsigned int version", + "sig": "git_stash_apply_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_stash_apply_options structure

\n", + "comments": "

Initializes a git_stash_apply_options with default values. Equivalent to creating an instance with GIT_STASH_APPLY_OPTIONS_INIT.

\n", + "group": "stash" + }, + "git_stash_apply": { + "type": "function", + "file": "git2/stash.h", + "line": 239, + "lineto": 242, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "options", + "type": "const git_stash_apply_options *", + "comment": "Optional options to control how stashes are applied." + } + ], + "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", + "sig": "git_repository *::size_t::const git_stash_apply_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" + }, + "description": "

Apply a single stashed state from the stash list.

\n", + "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", + "group": "stash" + }, + "git_stash_foreach": { + "type": "function", + "file": "git2/stash.h", + "line": 275, + "lineto": 278, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the stash." + }, + { + "name": "callback", + "type": "git_stash_cb", + "comment": "Callback to invoke per found stashed state. The most\n recent stash state will be enumerated first." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "git_repository *repo, git_stash_cb callback, void *payload", + "sig": "git_repository *::git_stash_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code." + }, + "description": "

Loop over all the stashed states and issue a callback for each one.

\n", + "comments": "

If the callback returns a non-zero value, this will stop looping.

\n", + "group": "stash" + }, + "git_stash_drop": { + "type": "function", + "file": "git2/stash.h", + "line": 291, + "lineto": 293, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + } + ], + "argline": "git_repository *repo, size_t index", + "sig": "git_repository *::size_t", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code." + }, + "description": "

Remove a single stashed state from the stash list.

\n", + "comments": "", + "group": "stash" + }, + "git_stash_pop": { + "type": "function", + "file": "git2/stash.h", + "line": 307, + "lineto": 310, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The owning repository." + }, + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." + }, + { + "name": "options", + "type": "const git_stash_apply_options *", + "comment": "Optional options to control how stashes are applied." + } + ], + "argline": "git_repository *repo, size_t index, const git_stash_apply_options *options", + "sig": "git_repository *::size_t::const git_stash_apply_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the given\n index, or error code. (see git_stash_apply() above for details)" + }, + "description": "

Apply a single stashed state from the stash list and remove it from the list\n if successful.

\n", + "comments": "", + "group": "stash" + }, + "git_status_options_init": { + "type": "function", + "file": "git2/status.h", + "line": 277, + "lineto": 279, + "args": [ + { + "name": "opts", + "type": "git_status_options *", + "comment": "The `git_status_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." + } + ], + "argline": "git_status_options *opts, unsigned int version", + "sig": "git_status_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_status_options structure

\n", + "comments": "

Initializes a git_status_options with default values. Equivalent to creating an instance with GIT_STATUS_OPTIONS_INIT.

\n", + "group": "status" + }, + "git_status_foreach": { + "type": "function", + "file": "git2/status.h", + "line": 317, + "lineto": 320, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "callback", + "type": "git_status_cb", + "comment": "The function to call on each file" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to pass through to callback function" + } + ], + "argline": "git_repository *repo, git_status_cb callback, void *payload", + "sig": "git_repository *::git_status_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Gather file statuses and run a callback for each one.

\n", + "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", + "group": "status", + "examples": { "status.c": ["ex/v1.8.4/status.html#git_status_foreach-6"] } + }, + "git_status_foreach_ext": { + "type": "function", + "file": "git2/status.h", + "line": 341, + "lineto": 345, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object" + }, + { + "name": "opts", + "type": "const git_status_options *", + "comment": "Status options structure" + }, + { + "name": "callback", + "type": "git_status_cb", + "comment": "The function to call on each file" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to pass through to callback function" + } + ], + "argline": "git_repository *repo, const git_status_options *opts, git_status_cb callback, void *payload", + "sig": "git_repository *::const git_status_options *::git_status_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Gather file status information and run callbacks as requested.

\n", + "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "group": "status", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_status_foreach_ext-7"] + } + }, + "git_status_file": { + "type": "function", + "file": "git2/status.h", + "line": 373, + "lineto": 376, + "args": [ + { + "name": "status_flags", + "type": "unsigned int *", + "comment": "Output combination of git_status_t values for file" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "The exact path to retrieve status for relative to the\n repository working directory" + } + ], + "argline": "unsigned int *status_flags, git_repository *repo, const char *path", + "sig": "unsigned int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if the file is not found in the HEAD,\n index, and work tree, GIT_EAMBIGUOUS if `path` matches multiple files\n or if it refers to a folder, and -1 on other errors." + }, + "description": "

Get file status for a single file.

\n", + "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", + "group": "status", + "examples": { "add.c": ["ex/v1.8.4/add.html#git_status_file-6"] } + }, + "git_status_list_new": { + "type": "function", + "file": "git2/status.h", + "line": 391, + "lineto": 394, + "args": [ + { + "name": "out", + "type": "git_status_list **", + "comment": "Pointer to store the status results in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository object" + }, + { + "name": "opts", + "type": "const git_status_options *", + "comment": "Status options structure" + } + ], + "argline": "git_status_list **out, git_repository *repo, const git_status_options *opts", + "sig": "git_status_list **::git_repository *::const git_status_options *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Gather file status information and populate the git_status_list.

\n", + "comments": "

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.8.4/status.html#git_status_list_new-8", + "ex/v1.8.4/status.html#git_status_list_new-9" + ] + } + }, + "git_status_list_entrycount": { + "type": "function", + "file": "git2/status.h", + "line": 405, + "lineto": 406, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + } + ], + "argline": "git_status_list *statuslist", + "sig": "git_status_list *", + "return": { + "type": "size_t", + "comment": " the number of status entries" + }, + "description": "

Gets the count of status entries in this list.

\n", + "comments": "

If there are no changes in status (at least according the options given when the status list was created), this can return 0.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.8.4/status.html#git_status_list_entrycount-10", + "ex/v1.8.4/status.html#git_status_list_entrycount-11" + ] + } + }, + "git_status_byindex": { + "type": "function", + "file": "git2/status.h", + "line": 417, + "lineto": 419, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + }, + { "name": "idx", "type": "size_t", "comment": "Position of the entry" } + ], + "argline": "git_status_list *statuslist, size_t idx", + "sig": "git_status_list *::size_t", + "return": { + "type": "const git_status_entry *", + "comment": " Pointer to the entry; NULL if out of bounds" + }, + "description": "

Get a pointer to one of the entries in the status list.

\n", + "comments": "

The entry is not modifiable and should not be freed.

\n", + "group": "status", + "examples": { + "status.c": [ + "ex/v1.8.4/status.html#git_status_byindex-12", + "ex/v1.8.4/status.html#git_status_byindex-13", + "ex/v1.8.4/status.html#git_status_byindex-14", + "ex/v1.8.4/status.html#git_status_byindex-15", + "ex/v1.8.4/status.html#git_status_byindex-16", + "ex/v1.8.4/status.html#git_status_byindex-17" + ] + } + }, + "git_status_list_free": { + "type": "function", + "file": "git2/status.h", + "line": 426, + "lineto": 427, + "args": [ + { + "name": "statuslist", + "type": "git_status_list *", + "comment": "Existing status list object" + } + ], + "argline": "git_status_list *statuslist", + "sig": "git_status_list *", + "return": { "type": "void", "comment": null }, + "description": "

Free an existing status list

\n", + "comments": "", + "group": "status", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_status_list_free-18"] + } + }, + "git_status_should_ignore": { + "type": "function", + "file": "git2/status.h", + "line": 445, + "lineto": 448, + "args": [ + { + "name": "ignored", + "type": "int *", + "comment": "Boolean returning 0 if the file is not ignored, 1 if it is" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "A repository object" + }, + { + "name": "path", + "type": "const char *", + "comment": "The file to check ignores for, rooted at the repo's workdir." + } + ], + "argline": "int *ignored, git_repository *repo, const char *path", + "sig": "int *::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 if ignore rules could be processed for the file (regardless\n of whether it exists or not), or an error \n<\n 0 if they could not." + }, + "description": "

Test if the ignore rules apply to a given file.

\n", + "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git add ." on the directory containing the file, would it be added or not?

\n", + "group": "status" + }, + "git_strarray_dispose": { + "type": "function", + "file": "git2/strarray.h", + "line": 37, + "lineto": 37, + "args": [ + { + "name": "array", + "type": "git_strarray *", + "comment": "The git_strarray that contains strings to free" + } + ], + "argline": "git_strarray *array", + "sig": "git_strarray *", + "return": { "type": "void", "comment": null }, + "description": "

Free the strings contained in a string array. This method should\n be called on git_strarray objects that were provided by the\n library. Not doing so, will result in a memory leak.

\n", + "comments": "

This does not free the git_strarray itself, since the library will never allocate that object directly itself.

\n", + "group": "strarray", + "examples": { + "checkout.c": ["ex/v1.8.4/checkout.html#git_strarray_dispose-26"], + "general.c": ["ex/v1.8.4/general.html#git_strarray_dispose-74"], + "remote.c": [ + "ex/v1.8.4/remote.html#git_strarray_dispose-11", + "ex/v1.8.4/remote.html#git_strarray_dispose-12" + ], + "tag.c": ["ex/v1.8.4/tag.html#git_strarray_dispose-15"] + } + }, + "git_submodule_update_options_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 171, + "lineto": 172, + "args": [ + { + "name": "opts", + "type": "git_submodule_update_options *", + "comment": "The `git_submodule_update_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_SUBMODULE_UPDATE_OPTIONS_VERSION`." + } + ], + "argline": "git_submodule_update_options *opts, unsigned int version", + "sig": "git_submodule_update_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_submodule_update_options structure

\n", + "comments": "

Initializes a git_submodule_update_options with default values. Equivalent to creating an instance with GIT_SUBMODULE_UPDATE_OPTIONS_INIT.

\n", + "group": "submodule" + }, + "git_submodule_update": { + "type": "function", + "file": "git2/submodule.h", + "line": 192, + "lineto": 192, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule object" + }, + { + "name": "init", + "type": "int", + "comment": "If the submodule is not initialized, setting this flag to true\n will initialize the submodule before updating. Otherwise, this will\n return an error if attempting to update an uninitialized repository.\n but setting this to true forces them to be updated." + }, + { + "name": "options", + "type": "git_submodule_update_options *", + "comment": "configuration options for the update. If NULL, the\n function works as though GIT_SUBMODULE_UPDATE_OPTIONS_INIT was passed." + } + ], + "argline": "git_submodule *submodule, int init, git_submodule_update_options *options", + "sig": "git_submodule *::int::git_submodule_update_options *", + "return": { + "type": "int", + "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)." + }, + "description": "

Update a submodule. This will clone a missing submodule and\n checkout the subrepository to the commit specified in the index of\n the containing repository. If the submodule repository doesn't contain\n the target commit (e.g. because fetchRecurseSubmodules isn't set), then\n the submodule is fetched using the fetch options supplied in options.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_lookup": { + "type": "function", + "file": "git2/submodule.h", + "line": 221, + "lineto": 224, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "Output ptr to submodule; pass NULL to just get return code" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The parent repository" + }, + { + "name": "name", + "type": "const char *", + "comment": "The name of or path to the submodule; trailing slashes okay" + } + ], + "argline": "git_submodule **out, git_repository *repo, const char *name", + "sig": "git_submodule **::git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if submodule does not exist,\n GIT_EEXISTS if a repository is found in working directory only,\n -1 on other errors." + }, + "description": "

Lookup submodule information by name or path.

\n", + "comments": "

Given either the submodule name or path (they are usually the same), this returns a structure describing the submodule.

\n\n

There are two expected error scenarios:

\n\n
    \n
  • The submodule is not mentioned in the HEAD, the index, and the config, but does "exist" in the working directory (i.e. there is a subdirectory that appears to be a Git repository). In this case, this function returns GIT_EEXISTS to indicate a sub-repository exists but not in a state where a git_submodule can be instantiated. - The submodule is not mentioned in the HEAD, index, or config and the working directory doesn't contain a value git repo at that path. There may or may not be anything else at that path, but nothing that looks like a submodule. In this case, this returns GIT_ENOTFOUND.
  • \n
\n\n

You must call git_submodule_free when done with the submodule.

\n", + "group": "submodule" + }, + "git_submodule_dup": { + "type": "function", + "file": "git2/submodule.h", + "line": 234, + "lineto": 234, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "Pointer to store the copy of the submodule." + }, + { + "name": "source", + "type": "git_submodule *", + "comment": "Original submodule to copy." + } + ], + "argline": "git_submodule **out, git_submodule *source", + "sig": "git_submodule **::git_submodule *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a submodule. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_free": { + "type": "function", + "file": "git2/submodule.h", + "line": 241, + "lineto": 241, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { "type": "void", "comment": null }, + "description": "

Release a submodule

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_foreach": { + "type": "function", + "file": "git2/submodule.h", + "line": 261, + "lineto": 264, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository" + }, + { + "name": "callback", + "type": "git_submodule_cb", + "comment": "Function to be called with the name of each submodule.\n Return a non-zero value to terminate the iteration." + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra data to pass to callback" + } + ], + "argline": "git_repository *repo, git_submodule_cb callback, void *payload", + "sig": "git_repository *::git_submodule_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on error, or non-zero return value of callback" + }, + "description": "

Iterate over all tracked submodules of a repository.

\n", + "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_submodule_foreach-19"] + } + }, + "git_submodule_add_setup": { + "type": "function", + "file": "git2/submodule.h", + "line": 292, + "lineto": 297, + "args": [ + { + "name": "out", + "type": "git_submodule **", + "comment": "The newly created submodule ready to open for clone" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository in which you want to create the submodule" + }, + { + "name": "url", + "type": "const char *", + "comment": "URL for the submodule's remote" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path at which the submodule should be created" + }, + { + "name": "use_gitlink", + "type": "int", + "comment": "Should workdir contain a gitlink to the repo in\n .git/modules vs. repo directly in workdir." + } + ], + "argline": "git_submodule **out, git_repository *repo, const char *url, const char *path, int use_gitlink", + "sig": "git_submodule **::git_repository *::const char *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EEXISTS if submodule already exists,\n -1 on other errors." + }, + "description": "

Set up a new git submodule for checkout.

\n", + "comments": "

This does "git submodule add" up to the fetch and checkout of the submodule contents. It preps a new submodule, creates an entry in .gitmodules and creates an empty initialized repository either at the given path in the working directory or in .git/modules with a gitlink from the working directory to the new repo.

\n\n

To fully emulate "git submodule add" call this function, then open the submodule repo and perform the clone step as needed (if you don't need anything custom see git_submodule_add_clone()). Lastly, call git_submodule_add_finalize() to wrap up adding the new submodule and .gitmodules to the index to be ready to commit.

\n\n

You must call git_submodule_free on the submodule object when done.

\n", + "group": "submodule" + }, + "git_submodule_clone": { + "type": "function", + "file": "git2/submodule.h", + "line": 310, + "lineto": 313, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "The newly created repository object. Optional." + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule currently waiting for its clone." + }, + { + "name": "opts", + "type": "const git_submodule_update_options *", + "comment": "The options to use." + } + ], + "argline": "git_repository **out, git_submodule *submodule, const git_submodule_update_options *opts", + "sig": "git_repository **::git_submodule *::const git_submodule_update_options *", + "return": { + "type": "int", + "comment": " 0 on success, -1 on other errors (see git_clone)." + }, + "description": "

Perform the clone step for a newly created submodule.

\n", + "comments": "

This performs the necessary git_clone to setup a newly-created submodule.

\n", + "group": "submodule" + }, + "git_submodule_add_finalize": { + "type": "function", + "file": "git2/submodule.h", + "line": 326, + "lineto": 326, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to finish adding." + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Resolve the setup of a new git submodule.

\n", + "comments": "

This should be called on a submodule once you have called add setup and done the clone of the submodule. This adds the .gitmodules file and the newly cloned submodule to the index to be ready to be committed (but doesn't actually do the commit).

\n", + "group": "submodule" + }, + "git_submodule_add_to_index": { + "type": "function", + "file": "git2/submodule.h", + "line": 338, + "lineto": 340, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to add to the index" + }, + { + "name": "write_index", + "type": "int", + "comment": "Boolean if this should immediately write the index\n file. If you pass this as false, you will have to get the\n git_index and explicitly call `git_index_write()` on it to\n save the change." + } + ], + "argline": "git_submodule *submodule, int write_index", + "sig": "git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Add current submodule HEAD commit to index of superproject.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_owner": { + "type": "function", + "file": "git2/submodule.h", + "line": 353, + "lineto": 353, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_repository *", + "comment": " Pointer to `git_repository`" + }, + "description": "

Get the containing repository for a submodule.

\n", + "comments": "

This returns a pointer to the repository that contains the submodule. This is a just a reference to the repository that was passed to the original git_submodule_lookup() call, so if that repository has been freed, then this may be a dangling reference.

\n", + "group": "submodule" + }, + "git_submodule_name": { + "type": "function", + "file": "git2/submodule.h", + "line": 361, + "lineto": 361, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule name" + }, + "description": "

Get the name of submodule.

\n", + "comments": "", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_submodule_name-20"] + } + }, + "git_submodule_path": { + "type": "function", + "file": "git2/submodule.h", + "line": 372, + "lineto": 372, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule path" + }, + "description": "

Get the path to the submodule.

\n", + "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_submodule_path-21"] + } + }, + "git_submodule_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 380, + "lineto": 380, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule url" + }, + "description": "

Get the URL for the submodule.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_resolve_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 390, + "lineto": 390, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "buffer to store the absolute submodule url in" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Pointer to repository object" + }, + { "name": "url", "type": "const char *", "comment": "Relative url" } + ], + "argline": "git_buf *out, git_repository *repo, const char *url", + "sig": "git_buf *::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Resolve a submodule url relative to the given repository.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_branch": { + "type": "function", + "file": "git2/submodule.h", + "line": 398, + "lineto": 398, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const char *", + "comment": " Pointer to the submodule branch" + }, + "description": "

Get the branch for the submodule.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_set_branch": { + "type": "function", + "file": "git2/submodule.h", + "line": 411, + "lineto": 411, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "branch", + "type": "const char *", + "comment": "Branch that should be used for the submodule" + } + ], + "argline": "git_repository *repo, const char *name, const char *branch", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set the branch for the submodule in the configuration

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "group": "submodule" + }, + "git_submodule_set_url": { + "type": "function", + "file": "git2/submodule.h", + "line": 425, + "lineto": 425, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "url", + "type": "const char *", + "comment": "URL that should be used for the submodule" + } + ], + "argline": "git_repository *repo, const char *name, const char *url", + "sig": "git_repository *::const char *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure" + }, + "description": "

Set the URL for the submodule in the configuration

\n", + "comments": "

After calling this, you may wish to call git_submodule_sync() to write the changes to the checked out submodule repository.

\n", + "group": "submodule" + }, + "git_submodule_index_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 433, + "lineto": 433, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not in index." + }, + "description": "

Get the OID for the submodule in the index.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_head_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 441, + "lineto": 441, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not in the HEAD." + }, + "description": "

Get the OID for the submodule in the current HEAD tree.

\n", + "comments": "", + "group": "submodule" + }, + "git_submodule_wd_id": { + "type": "function", + "file": "git2/submodule.h", + "line": 454, + "lineto": 454, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Pointer to submodule object" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "const git_oid *", + "comment": " Pointer to git_oid or NULL if submodule is not checked out." + }, + "description": "

Get the OID for the submodule in the current working directory.

\n", + "comments": "

This returns the OID that corresponds to looking up 'HEAD' in the checked out submodule. If there are pending changes in the index or anything else, this won't notice that. You should call git_submodule_status() for a more complete picture about the state of the working directory.

\n", + "group": "submodule" + }, + "git_submodule_ignore": { + "type": "function", + "file": "git2/submodule.h", + "line": 479, + "lineto": 480, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to check" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_ignore_t", + "comment": " The current git_submodule_ignore_t valyue what will be used for\n this submodule." + }, + "description": "

Get the ignore rule that will be used for the submodule.

\n", + "comments": "

These values control the behavior of git_submodule_status() for this submodule. There are four ignore values:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_NONE will consider any change to the contents of the submodule from a clean checkout to be dirty, including the addition of untracked files. This is the default if unspecified. - GIT_SUBMODULE_IGNORE_UNTRACKED examines the contents of the working tree (i.e. call git_status_foreach() on the submodule) but UNTRACKED files will not count as making the submodule dirty. - GIT_SUBMODULE_IGNORE_DIRTY means to only check if the HEAD of the submodule has moved for status. This is fast since it does not need to scan the working tree of the submodule at all. - GIT_SUBMODULE_IGNORE_ALL means not to open the submodule repo. The working directory will be consider clean so long as there is a checked out version present.
  • \n
\n", + "group": "submodule" + }, + "git_submodule_set_ignore": { + "type": "function", + "file": "git2/submodule.h", + "line": 492, + "lineto": 495, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submdule" + }, + { + "name": "ignore", + "type": "git_submodule_ignore_t", + "comment": "The new value for the ignore rule" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_ignore_t ignore", + "sig": "git_repository *::const char *::git_submodule_ignore_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the ignore rule for the submodule in the configuration

\n", + "comments": "

This does not affect any currently-loaded instances.

\n", + "group": "submodule" + }, + "git_submodule_update_strategy": { + "type": "function", + "file": "git2/submodule.h", + "line": 507, + "lineto": 508, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to check" + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_update_t", + "comment": " The current git_submodule_update_t value that will be used\n for this submodule." + }, + "description": "

Get the update rule that will be used for the submodule.

\n", + "comments": "

This value controls the behavior of the git submodule update command. There are four useful values documented with git_submodule_update_t.

\n", + "group": "submodule" + }, + "git_submodule_set_update": { + "type": "function", + "file": "git2/submodule.h", + "line": 520, + "lineto": 523, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the name of the submodule to configure" + }, + { + "name": "update", + "type": "git_submodule_update_t", + "comment": "The new value to use" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_update_t update", + "sig": "git_repository *::const char *::git_submodule_update_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the update rule for the submodule in the configuration

\n", + "comments": "

This setting won't affect any existing instances.

\n", + "group": "submodule" + }, + "git_submodule_fetch_recurse_submodules": { + "type": "function", + "file": "git2/submodule.h", + "line": 536, + "lineto": 537, + "args": [ + { "name": "submodule", "type": "git_submodule *", "comment": null } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { + "type": "git_submodule_recurse_t", + "comment": " 0 if fetchRecurseSubmodules is false, 1 if true" + }, + "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", + "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", + "group": "submodule" + }, + "git_submodule_set_fetch_recurse_submodules": { + "type": "function", + "file": "git2/submodule.h", + "line": 549, + "lineto": 552, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to affect" + }, + { + "name": "name", + "type": "const char *", + "comment": "the submodule to configure" + }, + { + "name": "fetch_recurse_submodules", + "type": "git_submodule_recurse_t", + "comment": "Boolean value" + } + ], + "argline": "git_repository *repo, const char *name, git_submodule_recurse_t fetch_recurse_submodules", + "sig": "git_repository *::const char *::git_submodule_recurse_t", + "return": { + "type": "int", + "comment": " old value for fetchRecurseSubmodules" + }, + "description": "

Set the fetchRecurseSubmodules rule for a submodule in the configuration

\n", + "comments": "

This setting won't affect any existing instances.

\n", + "group": "submodule" + }, + "git_submodule_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 567, + "lineto": 567, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to write into the superproject config" + }, + { + "name": "overwrite", + "type": "int", + "comment": "By default, existing entries will not be overwritten,\n but setting this to true forces them to be updated." + } + ], + "argline": "git_submodule *submodule, int overwrite", + "sig": "git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Copy submodule info into ".git/config" file.

\n", + "comments": "

Just like "git submodule init", this copies information about the submodule into ".git/config". You can use the accessor functions above to alter the in-memory git_submodule object and control what is written to the config, overriding what is in .gitmodules.

\n", + "group": "submodule" + }, + "git_submodule_repo_init": { + "type": "function", + "file": "git2/submodule.h", + "line": 582, + "lineto": 585, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "Output pointer to the created git repository." + }, + { + "name": "sm", + "type": "const git_submodule *", + "comment": "The submodule to create a new subrepository from." + }, + { + "name": "use_gitlink", + "type": "int", + "comment": "Should the workdir contain a gitlink to\n the repo in .git/modules vs. repo directly in workdir." + } + ], + "argline": "git_repository **out, const git_submodule *sm, int use_gitlink", + "sig": "git_repository **::const git_submodule *::int", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 on failure." + }, + "description": "

Set up the subrepository for a submodule in preparation for clone.

\n", + "comments": "

This function can be called to init and set up a submodule repository from a submodule in preparation to clone it from its remote.

\n", + "group": "submodule" + }, + "git_submodule_sync": { + "type": "function", + "file": "git2/submodule.h", + "line": 598, + "lineto": 598, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to copy." + } + ], + "argline": "git_submodule *submodule", + "sig": "git_submodule *", + "return": { "type": "int", "comment": " 0 or an error code." }, + "description": "

Copy submodule remote info into submodule repo.

\n", + "comments": "

This copies the information about the submodules URL into the checked out submodule config, acting like "git submodule sync". This is useful if you have altered the URL for the submodule (or it has been altered by a fetch of upstream changes) and you need to update your local repo.

\n", + "group": "submodule" + }, + "git_submodule_open": { + "type": "function", + "file": "git2/submodule.h", + "line": 612, + "lineto": 614, + "args": [ + { + "name": "repo", + "type": "git_repository **", + "comment": "Pointer to the submodule repo which was opened" + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule to be opened" + } + ], + "argline": "git_repository **repo, git_submodule *submodule", + "sig": "git_repository **::git_submodule *", + "return": { + "type": "int", + "comment": " 0 on success, \n<\n0 if submodule repo could not be opened." + }, + "description": "

Open the repository for a submodule.

\n", + "comments": "

This is a newly opened repository object. The caller is responsible for calling git_repository_free() on it when done. Multiple calls to this function will return distinct git_repository objects. This will only work if the submodule is checked out into the working directory.

\n", + "group": "submodule" + }, + "git_submodule_reload": { + "type": "function", + "file": "git2/submodule.h", + "line": 626, + "lineto": 626, + "args": [ + { + "name": "submodule", + "type": "git_submodule *", + "comment": "The submodule to reload" + }, + { + "name": "force", + "type": "int", + "comment": "Force reload even if the data doesn't seem out of date" + } + ], + "argline": "git_submodule *submodule, int force", + "sig": "git_submodule *::int", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Reread submodule info from config, index, and HEAD.

\n", + "comments": "

Call this to reread cached submodule information for this submodule if you have reason to believe that it has changed.

\n", + "group": "submodule" + }, + "git_submodule_status": { + "type": "function", + "file": "git2/submodule.h", + "line": 642, + "lineto": 646, + "args": [ + { + "name": "status", + "type": "unsigned int *", + "comment": "Combination of `GIT_SUBMODULE_STATUS` flags" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to look" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the submodule" + }, + { + "name": "ignore", + "type": "git_submodule_ignore_t", + "comment": "the ignore rules to follow" + } + ], + "argline": "unsigned int *status, git_repository *repo, const char *name, git_submodule_ignore_t ignore", + "sig": "unsigned int *::git_repository *::const char *::git_submodule_ignore_t", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Get the status for a submodule.

\n", + "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", + "group": "submodule", + "examples": { + "status.c": ["ex/v1.8.4/status.html#git_submodule_status-22"] + } + }, + "git_submodule_location": { + "type": "function", + "file": "git2/submodule.h", + "line": 662, + "lineto": 664, + "args": [ + { + "name": "location_status", + "type": "unsigned int *", + "comment": "Combination of first four `GIT_SUBMODULE_STATUS` flags" + }, + { + "name": "submodule", + "type": "git_submodule *", + "comment": "Submodule for which to get status" + } + ], + "argline": "unsigned int *location_status, git_submodule *submodule", + "sig": "unsigned int *::git_submodule *", + "return": { "type": "int", "comment": " 0 on success, \n<\n0 on error" }, + "description": "

Get the locations of submodule information.

\n", + "comments": "

This is a bit like a very lightweight version of git_submodule_status. It just returns a made of the first four submodule status values (i.e. the ones like GIT_SUBMODULE_STATUS_IN_HEAD, etc) that tell you where the submodule data comes from (i.e. the HEAD commit, gitmodules file, etc.). This can be useful if you want to know if the submodule is present in the working directory at this point in time, etc.

\n", + "group": "submodule" + }, + "git_tag_lookup": { + "type": "function", + "file": "git2/tag.h", + "line": 33, + "lineto": 34, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tag." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tag to locate." + } + ], + "argline": "git_tag **out, git_repository *repo, const git_oid *id", + "sig": "git_tag **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tag object from the repository.

\n", + "comments": "", + "group": "tag", + "examples": { "general.c": ["ex/v1.8.4/general.html#git_tag_lookup-75"] } + }, + "git_tag_lookup_prefix": { + "type": "function", + "file": "git2/tag.h", + "line": 48, + "lineto": 49, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "pointer to the looked up tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tag." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tag to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_tag **out, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_tag **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tag object from the repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "tag" + }, + "git_tag_free": { + "type": "function", + "file": "git2/tag.h", + "line": 61, + "lineto": 61, + "args": [ + { "name": "tag", "type": "git_tag *", "comment": "the tag to close" } + ], + "argline": "git_tag *tag", + "sig": "git_tag *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open tag

\n", + "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", + "group": "tag", + "examples": { "general.c": ["ex/v1.8.4/general.html#git_tag_free-76"] } + }, + "git_tag_id": { + "type": "function", + "file": "git2/tag.h", + "line": 69, + "lineto": 69, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the tag." + }, + "description": "

Get the id of a tag.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_owner": { + "type": "function", + "file": "git2/tag.h", + "line": 77, + "lineto": 77, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "A previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this tag." + }, + "description": "

Get the repository that contains the tag.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_target": { + "type": "function", + "file": "git2/tag.h", + "line": 89, + "lineto": 89, + "args": [ + { + "name": "target_out", + "type": "git_object **", + "comment": "pointer where to store the target" + }, + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "git_object **target_out, const git_tag *tag", + "sig": "git_object **::const git_tag *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Get the tagged object of a tag

\n", + "comments": "

This method performs a repository lookup for the given object and returns it

\n", + "group": "tag", + "examples": { "general.c": ["ex/v1.8.4/general.html#git_tag_target-77"] } + }, + "git_tag_target_id": { + "type": "function", + "file": "git2/tag.h", + "line": 97, + "lineto": 97, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { "type": "const git_oid *", "comment": " pointer to the OID" }, + "description": "

Get the OID of the tagged object of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_target_id-31"] + } + }, + "git_tag_target_type": { + "type": "function", + "file": "git2/tag.h", + "line": 105, + "lineto": 105, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "git_object_t", + "comment": " type of the tagged object" + }, + "description": "

Get the type of a tag's tagged object

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_target_type-32"], + "general.c": ["ex/v1.8.4/general.html#git_tag_target_type-78"] + } + }, + "git_tag_name": { + "type": "function", + "file": "git2/tag.h", + "line": 113, + "lineto": 113, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { "type": "const char *", "comment": " name of the tag" }, + "description": "

Get the name of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_name-33"], + "general.c": ["ex/v1.8.4/general.html#git_tag_name-79"], + "tag.c": ["ex/v1.8.4/tag.html#git_tag_name-16"] + } + }, + "git_tag_tagger": { + "type": "function", + "file": "git2/tag.h", + "line": 121, + "lineto": 121, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const git_signature *", + "comment": " reference to the tag's author or NULL when unspecified" + }, + "description": "

Get the tagger (author) of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_tagger-34"] + } + }, + "git_tag_message": { + "type": "function", + "file": "git2/tag.h", + "line": 129, + "lineto": 129, + "args": [ + { + "name": "tag", + "type": "const git_tag *", + "comment": "a previously loaded tag." + } + ], + "argline": "const git_tag *tag", + "sig": "const git_tag *", + "return": { + "type": "const char *", + "comment": " message of the tag or NULL when unspecified" + }, + "description": "

Get the message of a tag

\n", + "comments": "", + "group": "tag", + "examples": { + "cat-file.c": [ + "ex/v1.8.4/cat-file.html#git_tag_message-35", + "ex/v1.8.4/cat-file.html#git_tag_message-36" + ], + "general.c": ["ex/v1.8.4/general.html#git_tag_message-80"], + "tag.c": ["ex/v1.8.4/tag.html#git_tag_message-17"] + } + }, + "git_tag_create": { + "type": "function", + "file": "git2/tag.h", + "line": 171, + "lineto": 178, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the\n newly created tag. If the tag already exists, this parameter\n will be the oid of the existing tag, and the function will\n return a GIT_EEXISTS error code." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "tagger", + "type": "const git_signature *", + "comment": "Signature of the tagger for this tag, and\n of the tagging time" + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this tag" + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message, int force", + "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA tag object is written to the ODB, and a proper reference\n\tis written in the /refs/tags folder, pointing to it" + }, + "description": "

Create a new tag in the repository from an object

\n", + "comments": "

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.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", + "group": "tag", + "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_tag_create-18"] } + }, + "git_tag_annotation_create": { + "type": "function", + "file": "git2/tag.h", + "line": 203, + "lineto": 209, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the\n newly created tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "tagger", + "type": "const git_signature *", + "comment": "Signature of the tagger for this tag, and\n of the tagging time" + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this tag" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, const git_signature *tagger, const char *message", + "sig": "git_oid *::git_repository *::const char *::const git_object *::const git_signature *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Create a new tag in the object database pointing to a git_object

\n", + "comments": "

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n", + "group": "tag" + }, + "git_tag_create_from_buffer": { + "type": "function", + "file": "git2/tag.h", + "line": 220, + "lineto": 224, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the newly created tag" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the tag" + }, + { "name": "buffer", "type": "const char *", "comment": "Raw tag data" }, + { "name": "force", "type": "int", "comment": "Overwrite existing tags" } + ], + "argline": "git_oid *oid, git_repository *repo, const char *buffer, int force", + "sig": "git_oid *::git_repository *::const char *::int", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Create a new tag in the repository from a buffer

\n", + "comments": "", + "group": "tag" + }, + "git_tag_create_lightweight": { + "type": "function", + "file": "git2/tag.h", + "line": 256, + "lineto": 261, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "Pointer where to store the OID of the provided\n target object. If the tag already exists, this parameter\n will be filled with the oid of the existing pointed object\n and the function will return a GIT_EEXISTS error code." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to store the lightweight tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name for the tag; this name is validated\n for consistency. It should also not conflict with an\n already existing tag name" + }, + { + "name": "target", + "type": "const git_object *", + "comment": "Object to which this tag points. This object\n must belong to the given `repo`." + }, + { + "name": "force", + "type": "int", + "comment": "Overwrite existing references" + } + ], + "argline": "git_oid *oid, git_repository *repo, const char *tag_name, const git_object *target, int force", + "sig": "git_oid *::git_repository *::const char *::const git_object *::int", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code\n\tA proper reference is written in the /refs/tags folder,\n pointing to the provided target object" + }, + "description": "

Create a new lightweight tag pointing at a target object

\n", + "comments": "

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.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "tag", + "examples": { + "tag.c": ["ex/v1.8.4/tag.html#git_tag_create_lightweight-19"] + } + }, + "git_tag_delete": { + "type": "function", + "file": "git2/tag.h", + "line": 276, + "lineto": 278, + "args": [ + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where lives the tag" + }, + { + "name": "tag_name", + "type": "const char *", + "comment": "Name of the tag to be deleted;\n this name is validated for consistency." + } + ], + "argline": "git_repository *repo, const char *tag_name", + "sig": "git_repository *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EINVALIDSPEC or an error code" + }, + "description": "

Delete an existing tag reference.

\n", + "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", + "group": "tag", + "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_tag_delete-20"] } + }, + "git_tag_list": { + "type": "function", + "file": "git2/tag.h", + "line": 293, + "lineto": 295, + "args": [ + { + "name": "tag_names", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the tags" + } + ], + "argline": "git_strarray *tag_names, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Fill a list with all the tags in the Repository

\n", + "comments": "

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.

\n", + "group": "tag" + }, + "git_tag_list_match": { + "type": "function", + "file": "git2/tag.h", + "line": 315, + "lineto": 318, + "args": [ + { + "name": "tag_names", + "type": "git_strarray *", + "comment": "Pointer to a git_strarray structure where\n\t\tthe tag names will be stored" + }, + { + "name": "pattern", + "type": "const char *", + "comment": "Standard fnmatch pattern" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to find the tags" + } + ], + "argline": "git_strarray *tag_names, const char *pattern, git_repository *repo", + "sig": "git_strarray *::const char *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", + "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

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.

\n", + "group": "tag", + "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_tag_list_match-21"] } + }, + "git_tag_foreach": { + "type": "function", + "file": "git2/tag.h", + "line": 339, + "lineto": 342, + "args": [ + { "name": "repo", "type": "git_repository *", "comment": "Repository" }, + { + "name": "callback", + "type": "git_tag_foreach_cb", + "comment": "Callback function" + }, + { + "name": "payload", + "type": "void *", + "comment": "Pointer to callback data (optional)" + } + ], + "argline": "git_repository *repo, git_tag_foreach_cb callback, void *payload", + "sig": "git_repository *::git_tag_foreach_cb::void *", + "return": { "type": "int", "comment": null }, + "description": "

Call callback `cb' for each tag in the repository

\n", + "comments": "", + "group": "tag" + }, + "git_tag_peel": { + "type": "function", + "file": "git2/tag.h", + "line": 355, + "lineto": 357, + "args": [ + { + "name": "tag_target_out", + "type": "git_object **", + "comment": "Pointer to the peeled git_object" + }, + { + "name": "tag", + "type": "const git_tag *", + "comment": "The tag to be processed" + } + ], + "argline": "git_object **tag_target_out, const git_tag *tag", + "sig": "git_object **::const git_tag *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Recursively peel a tag until a non tag git_object is found

\n", + "comments": "

The retrieved tag_target object is owned by the repository and should be closed with the git_object_free method.

\n", + "group": "tag" + }, + "git_tag_dup": { + "type": "function", + "file": "git2/tag.h", + "line": 367, + "lineto": 367, + "args": [ + { + "name": "out", + "type": "git_tag **", + "comment": "Pointer to store the copy of the tag" + }, + { + "name": "source", + "type": "git_tag *", + "comment": "Original tag to copy" + } + ], + "argline": "git_tag **out, git_tag *source", + "sig": "git_tag **::git_tag *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a tag. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "tag" + }, + "git_tag_name_is_valid": { + "type": "function", + "file": "git2/tag.h", + "line": 379, + "lineto": 379, + "args": [ + { + "name": "valid", + "type": "int *", + "comment": "output pointer to set with validity of given tag name" + }, + { + "name": "name", + "type": "const char *", + "comment": "a tag name to test" + } + ], + "argline": "int *valid, const char *name", + "sig": "int *::const char *", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Determine whether a tag name is valid, meaning that (when prefixed\n with refs/tags/) that it is a valid reference name, and that any\n additional tag name restrictions are imposed (eg, it cannot start\n with a -).

\n", + "comments": "", + "group": "tag" + }, + "git_trace_set": { + "type": "function", + "file": "git2/trace.h", + "line": 63, + "lineto": 63, + "args": [ + { + "name": "level", + "type": "git_trace_level_t", + "comment": "Level to set tracing to" + }, + { + "name": "cb", + "type": "git_trace_cb", + "comment": "Function to call with trace data" + } + ], + "argline": "git_trace_level_t level, git_trace_cb cb", + "sig": "git_trace_level_t::git_trace_cb", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Sets the system tracing configuration to the specified level with the\n specified callback. When system events occur at a level equal to, or\n lower than, the given level they will be reported to the given callback.

\n", + "comments": "", + "group": "trace" + }, + "git_transaction_new": { + "type": "function", + "file": "git2/transaction.h", + "line": 32, + "lineto": 32, + "args": [ + { + "name": "out", + "type": "git_transaction **", + "comment": "the resulting transaction" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to lock" + } + ], + "argline": "git_transaction **out, git_repository *repo", + "sig": "git_transaction **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new transaction object

\n", + "comments": "

This does not lock anything, but sets up the transaction object to know from which repository to lock.

\n", + "group": "transaction" + }, + "git_transaction_lock_ref": { + "type": "function", + "file": "git2/transaction.h", + "line": 44, + "lineto": 44, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to lock" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { "type": "int", "comment": " 0 or an error message" }, + "description": "

Lock a reference

\n", + "comments": "

Lock the specified reference. This is the first step to updating a reference.

\n", + "group": "transaction" + }, + "git_transaction_set_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 59, + "lineto": 59, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const git_oid *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_oid *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const git_oid *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", + "group": "transaction" + }, + "git_transaction_set_symbolic_target": { + "type": "function", + "file": "git2/transaction.h", + "line": 74, + "lineto": 74, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "reference to update" + }, + { + "name": "target", + "type": "const char *", + "comment": "target to set the reference to" + }, + { + "name": "sig", + "type": "const git_signature *", + "comment": "signature to use in the reflog; pass NULL to read the identity from the config" + }, + { + "name": "msg", + "type": "const char *", + "comment": "message to use in the reflog" + } + ], + "argline": "git_transaction *tx, const char *refname, const char *target, const git_signature *sig, const char *msg", + "sig": "git_transaction *::const char *::const char *::const git_signature *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the target of a reference

\n", + "comments": "

Set the target of the specified reference. This reference must be locked.

\n", + "group": "transaction" + }, + "git_transaction_set_reflog": { + "type": "function", + "file": "git2/transaction.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference whose reflog to set" + }, + { + "name": "reflog", + "type": "const git_reflog *", + "comment": "the reflog as it should be written out" + } + ], + "argline": "git_transaction *tx, const char *refname, const git_reflog *reflog", + "sig": "git_transaction *::const char *::const git_reflog *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Set the reflog of a reference

\n", + "comments": "

Set the specified reference's reflog. If this is combined with setting the target, that update won't be written to the reflog.

\n", + "group": "transaction" + }, + "git_transaction_remove": { + "type": "function", + "file": "git2/transaction.h", + "line": 96, + "lineto": 96, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the reference to remove" + } + ], + "argline": "git_transaction *tx, const char *refname", + "sig": "git_transaction *::const char *", + "return": { + "type": "int", + "comment": " 0, GIT_ENOTFOUND if the reference is not among the locked ones, or an error code" + }, + "description": "

Remove a reference

\n", + "comments": "", + "group": "transaction" + }, + "git_transaction_commit": { + "type": "function", + "file": "git2/transaction.h", + "line": 107, + "lineto": 107, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Commit the changes from the transaction

\n", + "comments": "

Perform the changes that have been queued. The updates will be made one by one, and the first failure will stop the processing.

\n", + "group": "transaction" + }, + "git_transaction_free": { + "type": "function", + "file": "git2/transaction.h", + "line": 117, + "lineto": 117, + "args": [ + { + "name": "tx", + "type": "git_transaction *", + "comment": "the transaction" + } + ], + "argline": "git_transaction *tx", + "sig": "git_transaction *", + "return": { "type": "void", "comment": null }, + "description": "

Free the resources allocated by this transaction

\n", + "comments": "

If any references remain locked, they will be unlocked without any changes made to them.

\n", + "group": "transaction" + }, + "git_tree_lookup": { + "type": "function", + "file": "git2/tree.h", + "line": 32, + "lineto": 33, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "Pointer to the looked up tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repo to use when locating the tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "Identity of the tree to locate." + } + ], + "argline": "git_tree **out, git_repository *repo, const git_oid *id", + "sig": "git_tree **::git_repository *::const git_oid *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tree object from the repository.

\n", + "comments": "", + "group": "tree", + "examples": { + "commit.c": ["ex/v1.8.4/commit.html#git_tree_lookup-12"], + "general.c": [ + "ex/v1.8.4/general.html#git_tree_lookup-81", + "ex/v1.8.4/general.html#git_tree_lookup-82" + ], + "init.c": ["ex/v1.8.4/init.html#git_tree_lookup-12"], + "merge.c": ["ex/v1.8.4/merge.html#git_tree_lookup-37"] + } + }, + "git_tree_lookup_prefix": { + "type": "function", + "file": "git2/tree.h", + "line": 47, + "lineto": 51, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "pointer to the looked up tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when locating the tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "identity of the tree to locate." + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the short identifier" + } + ], + "argline": "git_tree **out, git_repository *repo, const git_oid *id, size_t len", + "sig": "git_tree **::git_repository *::const git_oid *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a tree object from the repository,\n given a prefix of its identifier (short id).

\n", + "comments": "", + "group": "tree" + }, + "git_tree_free": { + "type": "function", + "file": "git2/tree.h", + "line": 63, + "lineto": 63, + "args": [ + { "name": "tree", "type": "git_tree *", "comment": "The tree to close" } + ], + "argline": "git_tree *tree", + "sig": "git_tree *", + "return": { "type": "void", "comment": null }, + "description": "

Close an open tree

\n", + "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", + "group": "tree", + "examples": { + "commit.c": ["ex/v1.8.4/commit.html#git_tree_free-13"], + "diff.c": [ + "ex/v1.8.4/diff.html#git_tree_free-19", + "ex/v1.8.4/diff.html#git_tree_free-20" + ], + "general.c": [ + "ex/v1.8.4/general.html#git_tree_free-83", + "ex/v1.8.4/general.html#git_tree_free-84" + ], + "init.c": ["ex/v1.8.4/init.html#git_tree_free-13"], + "log.c": [ + "ex/v1.8.4/log.html#git_tree_free-55", + "ex/v1.8.4/log.html#git_tree_free-56", + "ex/v1.8.4/log.html#git_tree_free-57", + "ex/v1.8.4/log.html#git_tree_free-58", + "ex/v1.8.4/log.html#git_tree_free-59" + ] + } + }, + "git_tree_id": { + "type": "function", + "file": "git2/tree.h", + "line": 71, + "lineto": 71, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "const git_oid *", + "comment": " object identity for the tree." + }, + "description": "

Get the id of a tree.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_owner": { + "type": "function", + "file": "git2/tree.h", + "line": 79, + "lineto": 79, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "A previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "git_repository *", + "comment": " Repository that contains this tree." + }, + "description": "

Get the repository that contains the tree.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_entrycount": { + "type": "function", + "file": "git2/tree.h", + "line": 87, + "lineto": 87, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + } + ], + "argline": "const git_tree *tree", + "sig": "const git_tree *", + "return": { + "type": "size_t", + "comment": " the number of entries in the tree" + }, + "description": "

Get the number of entries listed in a tree

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entrycount-37"], + "general.c": ["ex/v1.8.4/general.html#git_tree_entrycount-85"] + } + }, + "git_tree_entry_byname": { + "type": "function", + "file": "git2/tree.h", + "line": 99, + "lineto": 100, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "filename", + "type": "const char *", + "comment": "the filename of the desired entry" + } + ], + "argline": "const git_tree *tree, const char *filename", + "sig": "const git_tree *::const char *", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by its filename

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "group": "tree", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_tree_entry_byname-86"] + } + }, + "git_tree_entry_byindex": { + "type": "function", + "file": "git2/tree.h", + "line": 112, + "lineto": 113, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "idx", + "type": "size_t", + "comment": "the position in the entry list" + } + ], + "argline": "const git_tree *tree, size_t idx", + "sig": "const git_tree *::size_t", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by its position in the tree

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_byindex-38"], + "general.c": ["ex/v1.8.4/general.html#git_tree_entry_byindex-87"] + } + }, + "git_tree_entry_byid": { + "type": "function", + "file": "git2/tree.h", + "line": 127, + "lineto": 128, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "a previously loaded tree." + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "the sha being looked for" + } + ], + "argline": "const git_tree *tree, const git_oid *id", + "sig": "const git_tree *::const git_oid *", + "return": { + "type": "const git_tree_entry *", + "comment": " the tree entry; NULL if not found" + }, + "description": "

Lookup a tree entry by SHA value.

\n", + "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n\n

Warning: this must examine every entry in the tree, so it is not fast.

\n", + "group": "tree" + }, + "git_tree_entry_bypath": { + "type": "function", + "file": "git2/tree.h", + "line": 142, + "lineto": 145, + "args": [ + { + "name": "out", + "type": "git_tree_entry **", + "comment": "Pointer where to store the tree entry" + }, + { + "name": "root", + "type": "const git_tree *", + "comment": "Previously loaded tree which is the root of the relative path" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to the contained entry" + } + ], + "argline": "git_tree_entry **out, const git_tree *root, const char *path", + "sig": "git_tree_entry **::const git_tree *::const char *", + "return": { + "type": "int", + "comment": " 0 on success; GIT_ENOTFOUND if the path does not exist" + }, + "description": "

Retrieve a tree entry contained in a tree or in any of its subtrees,\n given its relative path.

\n", + "comments": "

Unlike the other lookup functions, the returned tree entry is owned by the user and must be freed explicitly with git_tree_entry_free().

\n", + "group": "tree" + }, + "git_tree_entry_dup": { + "type": "function", + "file": "git2/tree.h", + "line": 157, + "lineto": 157, + "args": [ + { + "name": "dest", + "type": "git_tree_entry **", + "comment": "pointer where to store the copy" + }, + { + "name": "source", + "type": "const git_tree_entry *", + "comment": "tree entry to duplicate" + } + ], + "argline": "git_tree_entry **dest, const git_tree_entry *source", + "sig": "git_tree_entry **::const git_tree_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Duplicate a tree entry

\n", + "comments": "

Create a copy of a tree entry. The returned copy is owned by the user, and must be freed explicitly with git_tree_entry_free().

\n", + "group": "tree" + }, + "git_tree_entry_free": { + "type": "function", + "file": "git2/tree.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "entry", + "type": "git_tree_entry *", + "comment": "The entry to free" + } + ], + "argline": "git_tree_entry *entry", + "sig": "git_tree_entry *", + "return": { "type": "void", "comment": null }, + "description": "

Free a user-owned tree entry

\n", + "comments": "

IMPORTANT: This function is only needed for tree entries owned by the user, such as the ones returned by git_tree_entry_dup() or git_tree_entry_bypath().

\n", + "group": "tree" + }, + "git_tree_entry_name": { + "type": "function", + "file": "git2/tree.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { "type": "const char *", "comment": " the name of the file" }, + "description": "

Get the filename of a tree entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_name-39"], + "general.c": [ + "ex/v1.8.4/general.html#git_tree_entry_name-88", + "ex/v1.8.4/general.html#git_tree_entry_name-89" + ] + } + }, + "git_tree_entry_id": { + "type": "function", + "file": "git2/tree.h", + "line": 184, + "lineto": 184, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "const git_oid *", + "comment": " the oid of the object" + }, + "description": "

Get the id of the object pointed by the entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_id-40"] + } + }, + "git_tree_entry_type": { + "type": "function", + "file": "git2/tree.h", + "line": 192, + "lineto": 192, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_object_t", + "comment": " the type of the pointed object" + }, + "description": "

Get the type of the object pointed by the entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_type-41"] + } + }, + "git_tree_entry_filemode": { + "type": "function", + "file": "git2/tree.h", + "line": 200, + "lineto": 200, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_filemode_t", + "comment": " filemode as an integer" + }, + "description": "

Get the UNIX file attributes of a tree entry

\n", + "comments": "", + "group": "tree", + "examples": { + "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_filemode-42"] + } + }, + "git_tree_entry_filemode_raw": { + "type": "function", + "file": "git2/tree.h", + "line": 212, + "lineto": 212, + "args": [ + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "const git_tree_entry *entry", + "sig": "const git_tree_entry *", + "return": { + "type": "git_filemode_t", + "comment": " filemode as an integer" + }, + "description": "

Get the raw UNIX file attributes of a tree entry

\n", + "comments": "

This function does not perform any normalization and is only useful if you need to be able to recreate the original tree object.

\n", + "group": "tree" + }, + "git_tree_entry_cmp": { + "type": "function", + "file": "git2/tree.h", + "line": 220, + "lineto": 220, + "args": [ + { + "name": "e1", + "type": "const git_tree_entry *", + "comment": "first tree entry" + }, + { + "name": "e2", + "type": "const git_tree_entry *", + "comment": "second tree entry" + } + ], + "argline": "const git_tree_entry *e1, const git_tree_entry *e2", + "sig": "const git_tree_entry *::const git_tree_entry *", + "return": { + "type": "int", + "comment": " \n<\n0 if e1 is before e2, 0 if e1 == e2, >0 if e1 is after e2" + }, + "description": "

Compare two tree entries

\n", + "comments": "", + "group": "tree" + }, + "git_tree_entry_to_object": { + "type": "function", + "file": "git2/tree.h", + "line": 232, + "lineto": 235, + "args": [ + { + "name": "object_out", + "type": "git_object **", + "comment": "pointer to the converted object" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository where to lookup the pointed object" + }, + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "a tree entry" + } + ], + "argline": "git_object **object_out, git_repository *repo, const git_tree_entry *entry", + "sig": "git_object **::git_repository *::const git_tree_entry *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Convert a tree entry to the git_object it points to.

\n", + "comments": "

You must call git_object_free() on the object when you are done with it.

\n", + "group": "tree", + "examples": { + "general.c": ["ex/v1.8.4/general.html#git_tree_entry_to_object-90"] + } + }, + "git_treebuilder_new": { + "type": "function", + "file": "git2/tree.h", + "line": 254, + "lineto": 255, + "args": [ + { + "name": "out", + "type": "git_treebuilder **", + "comment": "Pointer where to store the tree builder" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository in which to store the object" + }, + { + "name": "source", + "type": "const git_tree *", + "comment": "Source tree to initialize the builder (optional)" + } + ], + "argline": "git_treebuilder **out, git_repository *repo, const git_tree *source", + "sig": "git_treebuilder **::git_repository *::const git_tree *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Create a new tree builder.

\n", + "comments": "

The tree builder can be used to create or modify trees in memory and write them as tree objects to the database.

\n\n

If the source parameter is not NULL, the tree builder will be initialized with the entries of the given tree.

\n\n

If the source parameter is NULL, the tree builder will start with no entries and will have to be filled manually.

\n", + "group": "treebuilder" + }, + "git_treebuilder_clear": { + "type": "function", + "file": "git2/tree.h", + "line": 263, + "lineto": 263, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Builder to clear" + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { + "type": "int", + "comment": " 0 on success; error code otherwise" + }, + "description": "

Clear all the entries in the builder

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_entrycount": { + "type": "function", + "file": "git2/tree.h", + "line": 271, + "lineto": 271, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "a previously loaded treebuilder." + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { + "type": "size_t", + "comment": " the number of entries in the treebuilder" + }, + "description": "

Get the number of entries listed in a treebuilder

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_free": { + "type": "function", + "file": "git2/tree.h", + "line": 282, + "lineto": 282, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Builder to free" + } + ], + "argline": "git_treebuilder *bld", + "sig": "git_treebuilder *", + "return": { "type": "void", "comment": null }, + "description": "

Free a tree builder

\n", + "comments": "

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

\n", + "group": "treebuilder" + }, + "git_treebuilder_get": { + "type": "function", + "file": "git2/tree.h", + "line": 294, + "lineto": 295, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Name of the entry" + } + ], + "argline": "git_treebuilder *bld, const char *filename", + "sig": "git_treebuilder *::const char *", + "return": { + "type": "const git_tree_entry *", + "comment": " pointer to the entry; NULL if not found" + }, + "description": "

Get an entry from the builder from its filename

\n", + "comments": "

The returned entry is owned by the builder and should not be freed manually.

\n", + "group": "treebuilder" + }, + "git_treebuilder_insert": { + "type": "function", + "file": "git2/tree.h", + "line": 325, + "lineto": 330, + "args": [ + { + "name": "out", + "type": "const git_tree_entry **", + "comment": "Pointer to store the entry (optional)" + }, + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Filename of the entry" + }, + { + "name": "id", + "type": "const git_oid *", + "comment": "SHA1 oid of the entry" + }, + { + "name": "filemode", + "type": "git_filemode_t", + "comment": "Folder attributes of the entry. This parameter must\n\t\t\tbe valued with one of the following entries: 0040000, 0100644,\n\t\t\t0100755, 0120000 or 0160000." + } + ], + "argline": "const git_tree_entry **out, git_treebuilder *bld, const char *filename, const git_oid *id, git_filemode_t filemode", + "sig": "const git_tree_entry **::git_treebuilder *::const char *::const git_oid *::git_filemode_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add or update an entry to the builder

\n", + "comments": "

Insert a new entry for filename in the builder with the given attributes.

\n\n

If an entry named filename already exists, its attributes will be updated with the given ones.

\n\n

The optional pointer out can be used to retrieve a pointer to the newly created/updated entry. Pass NULL if you do not need it. The pointer may not be valid past the next operation in this builder. Duplicate the entry if you want to keep it.

\n\n

By default the entry that you are inserting will be checked for validity; that it exists in the object database and is of the correct type. If you do not want this behavior, set the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION library option to false.

\n", + "group": "treebuilder" + }, + "git_treebuilder_remove": { + "type": "function", + "file": "git2/tree.h", + "line": 339, + "lineto": 340, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filename", + "type": "const char *", + "comment": "Filename of the entry to remove" + } + ], + "argline": "git_treebuilder *bld, const char *filename", + "sig": "git_treebuilder *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Remove an entry from the builder by its filename

\n", + "comments": "", + "group": "treebuilder" + }, + "git_treebuilder_filter": { + "type": "function", + "file": "git2/tree.h", + "line": 364, + "lineto": 367, + "args": [ + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder" + }, + { + "name": "filter", + "type": "git_treebuilder_filter_cb", + "comment": "Callback to filter entries" + }, + { + "name": "payload", + "type": "void *", + "comment": "Extra data to pass to filter callback" + } + ], + "argline": "git_treebuilder *bld, git_treebuilder_filter_cb filter, void *payload", + "sig": "git_treebuilder *::git_treebuilder_filter_cb::void *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero callback return value, or error code" + }, + "description": "

Selectively remove entries in the tree

\n", + "comments": "

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 non-zero, the entry will be filtered (removed from the builder).

\n", + "group": "treebuilder" + }, + "git_treebuilder_write": { + "type": "function", + "file": "git2/tree.h", + "line": 379, + "lineto": 380, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer to store the OID of the newly written tree" + }, + { + "name": "bld", + "type": "git_treebuilder *", + "comment": "Tree builder to write" + } + ], + "argline": "git_oid *id, git_treebuilder *bld", + "sig": "git_oid *::git_treebuilder *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Write the contents of the tree builder as a tree object

\n", + "comments": "

The tree builder will be written to the given repo, and its identifying SHA1 hash will be stored in the id pointer.

\n", + "group": "treebuilder" + }, + "git_tree_walk": { + "type": "function", + "file": "git2/tree.h", + "line": 409, + "lineto": 413, + "args": [ + { + "name": "tree", + "type": "const git_tree *", + "comment": "The tree to walk" + }, + { + "name": "mode", + "type": "git_treewalk_mode", + "comment": "Traversal mode (pre or post-order)" + }, + { + "name": "callback", + "type": "git_treewalk_cb", + "comment": "Function to call on each tree entry" + }, + { + "name": "payload", + "type": "void *", + "comment": "Opaque pointer to be passed on each callback" + } + ], + "argline": "const git_tree *tree, git_treewalk_mode mode, git_treewalk_cb callback, void *payload", + "sig": "const git_tree *::git_treewalk_mode::git_treewalk_cb::void *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Traverse the entries in a tree and its subtrees in post or pre order.

\n", + "comments": "

The entries will be traversed in the specified order, children subtrees will be automatically loaded as required, and the callback will be called once per entry with the current (relative) root for the entry and the entry data itself.

\n\n

If the callback returns a positive value, the passed entry will be skipped on the traversal (in pre mode). A negative value stops the walk.

\n", + "group": "tree" + }, + "git_tree_dup": { + "type": "function", + "file": "git2/tree.h", + "line": 423, + "lineto": 423, + "args": [ + { + "name": "out", + "type": "git_tree **", + "comment": "Pointer to store the copy of the tree" + }, + { + "name": "source", + "type": "git_tree *", + "comment": "Original tree to copy" + } + ], + "argline": "git_tree **out, git_tree *source", + "sig": "git_tree **::git_tree *", + "return": { "type": "int", "comment": " 0" }, + "description": "

Create an in-memory copy of a tree. The copy must be explicitly\n free'd or it will leak.

\n", + "comments": "", + "group": "tree" + }, + "git_tree_create_updated": { + "type": "function", + "file": "git2/tree.h", + "line": 470, + "lineto": 470, + "args": [ + { "name": "out", "type": "git_oid *", "comment": "id of the new tree" }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the tree, must be the\n same as for `baseline`" + }, + { + "name": "baseline", + "type": "git_tree *", + "comment": "the tree to base these changes on" + }, + { + "name": "nupdates", + "type": "size_t", + "comment": "the number of elements in the update list" + }, + { + "name": "updates", + "type": "const git_tree_update *", + "comment": "the list of updates to perform" + } + ], + "argline": "git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates", + "sig": "git_oid *::git_repository *::git_tree *::size_t::const git_tree_update *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a tree based on another one with the specified modifications

\n", + "comments": "

Given the baseline perform the changes described in the list of updates and create a new tree.

\n\n

This function is optimized for common file/directory addition, removal and replacement in trees. It is much more efficient than reading the tree into a git_index and modifying that, but in exchange it is not as flexible.

\n\n

Deleting and adding the same entry is undefined behaviour, changing a tree to a blob or viceversa is not supported.

\n", + "group": "tree" + }, + "git_worktree_list": { + "type": "function", + "file": "git2/worktree.h", + "line": 35, + "lineto": 35, + "args": [ + { + "name": "out", + "type": "git_strarray *", + "comment": "pointer to the array of working tree names" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repo to use when listing working trees" + } + ], + "argline": "git_strarray *out, git_repository *repo", + "sig": "git_strarray *::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

List names of linked working trees

\n", + "comments": "

The returned list should be released with git_strarray_free when no longer needed.

\n", + "group": "worktree" + }, + "git_worktree_lookup": { + "type": "function", + "file": "git2/worktree.h", + "line": 45, + "lineto": 45, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Output pointer to looked up worktree or `NULL`" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository containing worktrees" + }, + { + "name": "name", + "type": "const char *", + "comment": "Name of the working tree to look up" + } + ], + "argline": "git_worktree **out, git_repository *repo, const char *name", + "sig": "git_worktree **::git_repository *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Lookup a working tree by its name for a given repository

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_open_from_repository": { + "type": "function", + "file": "git2/worktree.h", + "line": 58, + "lineto": 58, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Out-pointer for the newly allocated worktree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to look up worktree for" + } + ], + "argline": "git_worktree **out, git_repository *repo", + "sig": "git_worktree **::git_repository *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Open a worktree of a given repository

\n", + "comments": "

If a repository is not the main tree but a worktree, this function will look up the worktree inside the parent repository and create a new git_worktree structure.

\n", + "group": "worktree" + }, + "git_worktree_free": { + "type": "function", + "file": "git2/worktree.h", + "line": 65, + "lineto": 65, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "worktree handle to close. If NULL nothing occurs." + } + ], + "argline": "git_worktree *wt", + "sig": "git_worktree *", + "return": { "type": "void", "comment": null }, + "description": "

Free a previously allocated worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_validate": { + "type": "function", + "file": "git2/worktree.h", + "line": 77, + "lineto": 77, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to check" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "int", + "comment": " 0 when worktree is valid, error-code otherwise" + }, + "description": "

Check if worktree is valid

\n", + "comments": "

A valid worktree requires both the git data structures inside the linked parent repository and the linked working copy to be present.

\n", + "group": "worktree" + }, + "git_worktree_add_options_init": { + "type": "function", + "file": "git2/worktree.h", + "line": 113, + "lineto": 114, + "args": [ + { + "name": "opts", + "type": "git_worktree_add_options *", + "comment": "The `git_worktree_add_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`." + } + ], + "argline": "git_worktree_add_options *opts, unsigned int version", + "sig": "git_worktree_add_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_worktree_add_options structure

\n", + "comments": "

Initializes a git_worktree_add_options with default values. Equivalent to creating an instance with GIT_WORKTREE_ADD_OPTIONS_INIT.

\n", + "group": "worktree" + }, + "git_worktree_add": { + "type": "function", + "file": "git2/worktree.h", + "line": 130, + "lineto": 132, + "args": [ + { + "name": "out", + "type": "git_worktree **", + "comment": "Output pointer containing new working tree" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository to create working tree for" + }, + { + "name": "name", + "type": "const char *", + "comment": "Name of the working tree" + }, + { + "name": "path", + "type": "const char *", + "comment": "Path to create working tree at" + }, + { + "name": "opts", + "type": "const git_worktree_add_options *", + "comment": "Options to modify default behavior. May be NULL" + } + ], + "argline": "git_worktree **out, git_repository *repo, const char *name, const char *path, const git_worktree_add_options *opts", + "sig": "git_worktree **::git_repository *::const char *::const char *::const git_worktree_add_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Add a new working tree

\n", + "comments": "

Add a new working tree for the repository, that is create the required data structures inside the repository and check out the current HEAD at path

\n", + "group": "worktree" + }, + "git_worktree_lock": { + "type": "function", + "file": "git2/worktree.h", + "line": 144, + "lineto": 144, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to lock" + }, + { + "name": "reason", + "type": "const char *", + "comment": "Reason why the working tree is being locked" + } + ], + "argline": "git_worktree *wt, const char *reason", + "sig": "git_worktree *::const char *", + "return": { + "type": "int", + "comment": " 0 on success, non-zero otherwise" + }, + "description": "

Lock worktree if not already locked

\n", + "comments": "

Lock a worktree, optionally specifying a reason why the linked working tree is being locked.

\n", + "group": "worktree" + }, + "git_worktree_unlock": { + "type": "function", + "file": "git2/worktree.h", + "line": 153, + "lineto": 153, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to unlock" + } + ], + "argline": "git_worktree *wt", + "sig": "git_worktree *", + "return": { + "type": "int", + "comment": " 0 on success, 1 if worktree was not locked, error-code\n otherwise" + }, + "description": "

Unlock a locked worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_is_locked": { + "type": "function", + "file": "git2/worktree.h", + "line": 167, + "lineto": 167, + "args": [ + { + "name": "reason", + "type": "git_buf *", + "comment": "Buffer to store reason in. If NULL no reason is stored." + }, + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to check" + } + ], + "argline": "git_buf *reason, const git_worktree *wt", + "sig": "git_buf *::const git_worktree *", + "return": { + "type": "int", + "comment": " 0 when the working tree not locked, a value greater\n than zero if it is locked, less than zero if there was an\n error" + }, + "description": "

Check if worktree is locked

\n", + "comments": "

A worktree may be locked if the linked working tree is stored on a portable device which is not available.

\n", + "group": "worktree" + }, + "git_worktree_name": { + "type": "function", + "file": "git2/worktree.h", + "line": 176, + "lineto": 176, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the name for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's name. The pointer returned is valid for the\n lifetime of the git_worktree" + }, + "description": "

Retrieve the name of the worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_path": { + "type": "function", + "file": "git2/worktree.h", + "line": 185, + "lineto": 185, + "args": [ + { + "name": "wt", + "type": "const git_worktree *", + "comment": "Worktree to get the path for" + } + ], + "argline": "const git_worktree *wt", + "sig": "const git_worktree *", + "return": { + "type": "const char *", + "comment": " The worktree's filesystem path. The pointer returned\n is valid for the lifetime of the git_worktree." + }, + "description": "

Retrieve the filesystem path for the worktree

\n", + "comments": "", + "group": "worktree" + }, + "git_worktree_prune_options_init": { + "type": "function", + "file": "git2/worktree.h", + "line": 227, + "lineto": 229, + "args": [ + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "The `git_worktree_prune_options` struct to initialize." + }, + { + "name": "version", + "type": "unsigned int", + "comment": "The struct version; pass `GIT_WORKTREE_PRUNE_OPTIONS_VERSION`." + } + ], + "argline": "git_worktree_prune_options *opts, unsigned int version", + "sig": "git_worktree_prune_options *::unsigned int", + "return": { + "type": "int", + "comment": " Zero on success; -1 on failure." + }, + "description": "

Initialize git_worktree_prune_options structure

\n", + "comments": "

Initializes a git_worktree_prune_options with default values. Equivalent to creating an instance with GIT_WORKTREE_PRUNE_OPTIONS_INIT.

\n", + "group": "worktree" + }, + "git_worktree_is_prunable": { + "type": "function", + "file": "git2/worktree.h", + "line": 251, + "lineto": 252, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to check." + }, + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "The prunable options." + } + ], + "argline": "git_worktree *wt, git_worktree_prune_options *opts", + "sig": "git_worktree *::git_worktree_prune_options *", + "return": { + "type": "int", + "comment": " 1 if the worktree is prunable, 0 otherwise, or an error code." + }, + "description": "

Is the worktree prunable with the given options?

\n", + "comments": "

A worktree is not prunable in the following scenarios:

\n\n
    \n
  • the worktree is linking to a valid on-disk worktree. The valid member will cause this check to be ignored. - the worktree is locked. The locked flag will cause this check to be ignored.
  • \n
\n\n

If the worktree is not valid and not locked or if the above flags have been passed in, this function will return a positive value. If the worktree is not prunable, an error message will be set (visible in giterr_last) with details about why.

\n", + "group": "worktree" + }, + "git_worktree_prune": { + "type": "function", + "file": "git2/worktree.h", + "line": 266, + "lineto": 267, + "args": [ + { + "name": "wt", + "type": "git_worktree *", + "comment": "Worktree to prune" + }, + { + "name": "opts", + "type": "git_worktree_prune_options *", + "comment": "Specifies which checks to override. See\n `git_worktree_is_prunable`. May be NULL" + } + ], + "argline": "git_worktree *wt, git_worktree_prune_options *opts", + "sig": "git_worktree *::git_worktree_prune_options *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Prune working tree

\n", + "comments": "

Prune the working tree, that is remove the git data structures on disk. The repository will only be pruned of git_worktree_is_prunable succeeds.

\n", + "group": "worktree" + } + }, + "callbacks": { + "git_apply_delta_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 38, + "lineto": 40, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "The delta to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_delta *delta, void *payload", + "sig": "const git_diff_delta *::void *", + "return": { + "type": "int", + "comment": " 0 if the delta is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the delta will not be applied." + }, + "description": "

When applying a patch, callback that will be made per delta (file).

\n", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the delta will not be applied, but the apply process continues - returns 0, the delta is applied, and the apply process continues.

\n" + }, + "git_apply_hunk_cb": { + "type": "callback", + "file": "git2/apply.h", + "line": 56, + "lineto": 58, + "args": [ + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "The hunk to be applied" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified payload" + } + ], + "argline": "const git_diff_hunk *hunk, void *payload", + "sig": "const git_diff_hunk *::void *", + "return": { + "type": "int", + "comment": " 0 if the hunk is applied, \n<\n 0 if the apply process will be aborted\n\tor > 0 if the hunk will not be applied." + }, + "description": "

When applying a patch, callback that will be made per hunk.

\n", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n" + }, + "git_attr_foreach_cb": { + "type": "callback", + "file": "git2/attr.h", + "line": 289, + "lineto": 289, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The attribute name." + }, + { + "name": "value", + "type": "const char *", + "comment": "The attribute value. May be NULL if the attribute is explicitly\n set to UNSPECIFIED using the '!' sign." + }, + { + "name": "payload", + "type": "void *", + "comment": "A user-specified pointer." + } + ], + "argline": "const char *name, const char *value, void *payload", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to continue looping, non-zero to stop. This value will be returned\n from git_attr_foreach." + }, + "description": "

The callback used with git_attr_foreach.

\n", + "comments": "

This callback will be invoked only once per attribute name, even if there are multiple rules for a given file. The highest priority rule will be used.

\n" + }, + "git_transport_certificate_check_cb": { + "type": "callback", + "file": "git2/cert.h", + "line": 72, + "lineto": 72, + "args": [ + { + "name": "cert", + "type": "git_cert *", + "comment": "The host certificate" + }, + { + "name": "valid", + "type": "int", + "comment": "Whether the libgit2 checks (OpenSSL or WinHTTP) think\n this certificate is valid" + }, + { + "name": "host", + "type": "const char *", + "comment": "Hostname of the host libgit2 connected to" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_cert *cert, int valid, const char *host, void *payload", + "sig": "git_cert *::int::const char *::void *", + "return": { + "type": "int", + "comment": " 0 to proceed with the connection, \n<\n 0 to fail the connection\n or > 0 to indicate that the callback refused to act and that\n the existing validity determination should be honored" + }, + "description": "

Callback for the user's custom certificate checks.

\n", + "comments": "" + }, + "git_checkout_notify_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 255, + "lineto": 261, + "args": [ + { "name": "why", "type": "git_checkout_notify_t", "comment": null }, + { "name": "path", "type": "const char *", "comment": null }, + { + "name": "baseline", + "type": "const git_diff_file *", + "comment": null + }, + { "name": "target", "type": "const git_diff_file *", "comment": null }, + { "name": "workdir", "type": "const git_diff_file *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload", + "sig": "git_checkout_notify_t::const char *::const git_diff_file *::const git_diff_file *::const git_diff_file *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Checkout notification callback function

\n", + "comments": "" + }, + "git_checkout_progress_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 264, + "lineto": 268, + "args": [ + { "name": "path", "type": "const char *", "comment": null }, + { "name": "completed_steps", "type": "size_t", "comment": null }, + { "name": "total_steps", "type": "size_t", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const char *path, size_t completed_steps, size_t total_steps, void *payload", + "sig": "const char *::size_t::size_t::void *", + "return": { "type": "void", "comment": null }, + "description": "

Checkout progress notification function

\n", + "comments": "" + }, + "git_checkout_perfdata_cb": { + "type": "callback", + "file": "git2/checkout.h", + "line": 271, + "lineto": 273, + "args": [ + { + "name": "perfdata", + "type": "const git_checkout_perfdata *", + "comment": null + }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_checkout_perfdata *perfdata, void *payload", + "sig": "const git_checkout_perfdata *::void *", + "return": { "type": "void", "comment": null }, + "description": "

Checkout perfdata notification function

\n", + "comments": "" + }, + "git_remote_create_cb": { + "type": "callback", + "file": "git2/clone.h", + "line": 69, + "lineto": 74, + "args": [ + { + "name": "out", + "type": "git_remote **", + "comment": "the resulting remote" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository in which to create the remote" + }, + { + "name": "name", + "type": "const char *", + "comment": "the remote's name" + }, + { + "name": "url", + "type": "const char *", + "comment": "the remote's url" + }, + { "name": "payload", "type": "void *", "comment": "an opaque payload" } + ], + "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, void *payload", + "sig": "git_remote **::git_repository *::const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" + }, + "description": "

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n", + "comments": "

Callers of git_clone may provide a function matching this signature to override the remote creation and customization process during a clone operation.

\n" + }, + "git_repository_create_cb": { + "type": "callback", + "file": "git2/clone.h", + "line": 90, + "lineto": 94, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "the resulting repository" + }, + { + "name": "path", + "type": "const char *", + "comment": "path in which to create the repository" + }, + { + "name": "bare", + "type": "int", + "comment": "whether the repository is bare. This is the value from the clone options" + }, + { + "name": "payload", + "type": "void *", + "comment": "payload specified by the options" + } + ], + "argline": "git_repository **out, const char *path, int bare, void *payload", + "sig": "git_repository **::const char *::int::void *", + "return": { + "type": "int", + "comment": " 0, or a negative value to indicate error" + }, + "description": "

The signature of a function matching git_repository_init, with an\n additional void * as callback payload.

\n", + "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" + }, + "git_commit_create_cb": { + "type": "callback", + "file": "git2/commit.h", + "line": 576, + "lineto": 585, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "pointer that this callback will populate with the object\n id of the commit that is created" + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "the author name and time of the commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "the committer name and time of the commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "the encoding of the given message, or NULL\n to assume UTF8" + }, + { + "name": "message", + "type": "const char *", + "comment": "the commit message" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "the tree to be committed" + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "the number of parents for this commit" + }, + { + "name": "parents", + "type": "const git_commit *[]", + "comment": "the commit parents" + }, + { + "name": "payload", + "type": "void *", + "comment": "the payload pointer in the rebase options" + } + ], + "argline": "git_oid *out, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents, void *payload", + "sig": "git_oid *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]::void *", + "return": { + "type": "int", + "comment": " 0 if this callback has created the commit and populated the out\n parameter, GIT_PASSTHROUGH if the callback has not created a\n commit and wants the calling function to create the commit as\n if no callback had been specified, any other value to stop\n and return a failure" + }, + "description": "

Commit creation callback: used when a function is going to create\n commits (for example, in git_rebase_commit) to allow callers to\n override the commit creation behavior. For example, users may\n wish to sign commits by providing this information to\n git_commit_create_buffer, signing that buffer, then calling\n git_commit_create_with_signature. The resultant commit id\n should be set in the out object id parameter.

\n", + "comments": "" + }, + "git_config_foreach_cb": { + "type": "callback", + "file": "git2/config.h", + "line": 122, + "lineto": 122, + "args": [ + { + "name": "entry", + "type": "const git_config_entry *", + "comment": "the entry currently being enumerated" + }, + { + "name": "payload", + "type": "void *", + "comment": "a user-specified pointer" + } + ], + "argline": "const git_config_entry *entry, void *payload", + "sig": "const git_config_entry *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration." + }, + "description": "

A config enumeration callback

\n", + "comments": "" + }, + "git_credential_acquire_cb": { + "type": "callback", + "file": "git2/credential.h", + "line": 131, + "lineto": 136, + "args": [ + { + "name": "out", + "type": "git_credential **", + "comment": "The newly created credential object." + }, + { + "name": "url", + "type": "const char *", + "comment": "The resource for which we are demanding a credential." + }, + { + "name": "username_from_url", + "type": "const char *", + "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." + }, + { + "name": "allowed_types", + "type": "unsigned int", + "comment": "A bitmask stating which credential types are OK to return." + }, + { + "name": "payload", + "type": "void *", + "comment": "The payload provided when specifying this callback." + } + ], + "argline": "git_credential **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", + "sig": "git_credential **::const char *::const char *::unsigned int::void *", + "return": { + "type": "int", + "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" + }, + "description": "

Credential acquisition callback.

\n", + "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" + }, + "git_commit_signing_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 276, + "lineto": 280, + "args": [ + { "name": "signature", "type": "git_buf *", "comment": null }, + { "name": "signature_field", "type": "git_buf *", "comment": null }, + { "name": "commit_content", "type": "const char *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", + "sig": "git_buf *::git_buf *::const char *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Provide a commit signature during commit creation.

\n", + "comments": "

Callers should instead define a git_commit_create_cb that generates a commit buffer using git_commit_create_buffer, sign that buffer and call git_commit_create_with_signature.

\n" + }, + "git_headlist_cb": { + "type": "callback", + "file": "git2/deprecated.h", + "line": 855, + "lineto": 855, + "args": [ + { "name": "rhead", "type": "git_remote_head *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "git_remote_head *rhead, void *payload", + "sig": "git_remote_head *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback for listing the remote heads

\n", + "comments": "" + }, + "git_diff_notify_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 346, + "lineto": 350, + "args": [ + { "name": "diff_so_far", "type": "const git_diff *", "comment": null }, + { + "name": "delta_to_add", + "type": "const git_diff_delta *", + "comment": null + }, + { "name": "matched_pathspec", "type": "const char *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_diff *diff_so_far, const git_diff_delta *delta_to_add, const char *matched_pathspec, void *payload", + "sig": "const git_diff *::const git_diff_delta *::const char *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Diff notification callback function.

\n", + "comments": "

The callback will be called for each file, just before the git_diff_delta gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" + }, + "git_diff_progress_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 362, + "lineto": 366, + "args": [ + { + "name": "diff_so_far", + "type": "const git_diff *", + "comment": "The diff being generated." + }, + { + "name": "old_path", + "type": "const char *", + "comment": "The path to the old file or NULL." + }, + { + "name": "new_path", + "type": "const char *", + "comment": "The path to the new file or NULL." + }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_diff *diff_so_far, const char *old_path, const char *new_path, void *payload", + "sig": "const git_diff *::const char *::const char *::void *", + "return": { "type": "int", "comment": " Non-zero to abort the diff." }, + "description": "

Diff progress callback.

\n", + "comments": "

Called before each file comparison.

\n" + }, + "git_diff_file_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 496, + "lineto": 499, + "args": [ + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "A pointer to the delta data for the file" + }, + { + "name": "progress", + "type": "float", + "comment": "Goes from 0 to 1 over the diff" + }, + { + "name": "payload", + "type": "void *", + "comment": "User-specified pointer from foreach function" + } + ], + "argline": "const git_diff_delta *delta, float progress, void *payload", + "sig": "const git_diff_delta *::float::void *", + "return": { "type": "int", "comment": null }, + "description": "

When iterating over a diff, callback that will be made per file.

\n", + "comments": "" + }, + "git_diff_binary_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 562, + "lineto": 565, + "args": [ + { "name": "delta", "type": "const git_diff_delta *", "comment": null }, + { + "name": "binary", + "type": "const git_diff_binary *", + "comment": null + }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_diff_delta *delta, const git_diff_binary *binary, void *payload", + "sig": "const git_diff_delta *::const git_diff_binary *::void *", + "return": { "type": "int", "comment": null }, + "description": "

When iterating over a diff, callback that will be made for\n binary content within the diff.

\n", + "comments": "" + }, + "git_diff_hunk_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 588, + "lineto": 591, + "args": [ + { "name": "delta", "type": "const git_diff_delta *", "comment": null }, + { "name": "hunk", "type": "const git_diff_hunk *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload", + "sig": "const git_diff_delta *::const git_diff_hunk *::void *", + "return": { "type": "int", "comment": null }, + "description": "

When iterating over a diff, callback that will be made per hunk.

\n", + "comments": "" + }, + "git_diff_line_cb": { + "type": "callback", + "file": "git2/diff.h", + "line": 649, + "lineto": 653, + "args": [ + { "name": "delta", "type": "const git_diff_delta *", "comment": null }, + { "name": "hunk", "type": "const git_diff_hunk *", "comment": null }, + { "name": "line", "type": "const git_diff_line *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", + "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", + "return": { "type": "int", "comment": null }, + "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", + "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" + }, + "git_index_matched_path_cb": { + "type": "callback", + "file": "git2/index.h", + "line": 135, + "lineto": 136, + "args": [ + { "name": "path", "type": "const char *", "comment": null }, + { "name": "matched_pathspec", "type": "const char *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const char *path, const char *matched_pathspec, void *payload", + "sig": "const char *::const char *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", + "comments": "" + }, + "git_indexer_progress_cb": { + "type": "callback", + "file": "git2/indexer.h", + "line": 57, + "lineto": 57, + "args": [ + { + "name": "stats", + "type": "const git_indexer_progress *", + "comment": "Structure containing information about the state of the transfer" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by caller" + } + ], + "argline": "const git_indexer_progress *stats, void *payload", + "sig": "const git_indexer_progress *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Type for progress callbacks during indexing. Return a value less\n than zero to cancel the indexing or download.

\n", + "comments": "" + }, + "git_note_foreach_cb": { + "type": "callback", + "file": "git2/notes.h", + "line": 29, + "lineto": 30, + "args": [ + { "name": "blob_id", "type": "const git_oid *", "comment": null }, + { + "name": "annotated_object_id", + "type": "const git_oid *", + "comment": null + }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_oid *blob_id, const git_oid *annotated_object_id, void *payload", + "sig": "const git_oid *::const git_oid *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback for git_note_foreach.

\n", + "comments": "

Receives: - blob_id: Oid of the blob containing the message - annotated_object_id: Oid of the git object being annotated - payload: Payload data passed to git_note_foreach

\n" + }, + "git_odb_foreach_cb": { + "type": "callback", + "file": "git2/odb.h", + "line": 39, + "lineto": 39, + "args": [ + { "name": "id", "type": "const git_oid *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_oid *id, void *payload", + "sig": "const git_oid *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Function type for callbacks from git_odb_foreach.

\n", + "comments": "" + }, + "git_packbuilder_foreach_cb": { + "type": "callback", + "file": "git2/pack.h", + "line": 208, + "lineto": 208, + "args": [ + { + "name": "buf", + "type": "void *", + "comment": "A pointer to the object's data" + }, + { + "name": "size", + "type": "size_t", + "comment": "The size of the underlying object" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_packbuilder_foreach" + } + ], + "argline": "void *buf, size_t size, void *payload", + "sig": "void *::size_t::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over packed objects

\n", + "comments": "" + }, + "git_packbuilder_progress": { + "type": "callback", + "file": "git2/pack.h", + "line": 237, + "lineto": 241, + "args": [ + { "name": "stage", "type": "int", "comment": null }, + { "name": "current", "type": "uint32_t", "comment": null }, + { "name": "total", "type": "uint32_t", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "int stage, uint32_t current, uint32_t total, void *payload", + "sig": "int::uint32_t::uint32_t::void *", + "return": { "type": "int", "comment": null }, + "description": "

Packbuilder progress notification function

\n", + "comments": "" + }, + "git_reference_foreach_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 437, + "lineto": 437, + "args": [ + { + "name": "reference", + "type": "git_reference *", + "comment": "The reference object" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_reference_foreach" + } + ], + "argline": "git_reference *reference, void *payload", + "sig": "git_reference *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over references

\n", + "comments": "" + }, + "git_reference_foreach_name_cb": { + "type": "callback", + "file": "git2/refs.h", + "line": 448, + "lineto": 448, + "args": [ + { + "name": "name", + "type": "const char *", + "comment": "The reference name" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_reference_foreach_name" + } + ], + "argline": "const char *name, void *payload", + "sig": "const char *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over reference names

\n", + "comments": "" + }, + "git_push_transfer_progress_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 470, + "lineto": 474, + "args": [ + { "name": "current", "type": "unsigned int", "comment": null }, + { "name": "total", "type": "unsigned int", "comment": null }, + { "name": "bytes", "type": "size_t", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "unsigned int current, unsigned int total, size_t bytes, void *payload", + "sig": "unsigned int::unsigned int::size_t::void *", + "return": { "type": "int", "comment": null }, + "description": "

Push network progress notification function

\n", + "comments": "" + }, + "git_push_negotiation": { + "type": "callback", + "file": "git2/remote.h", + "line": 506, + "lineto": 506, + "args": [ + { + "name": "updates", + "type": "const git_push_update **", + "comment": "an array containing the updates which will be sent\n as commands to the destination." + }, + { + "name": "len", + "type": "size_t", + "comment": "number of elements in `updates`" + }, + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "const git_push_update **updates, size_t len, void *payload", + "sig": "const git_push_update **::size_t::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback used to inform of upcoming updates.

\n", + "comments": "" + }, + "git_push_update_reference_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 520, + "lineto": 520, + "args": [ + { + "name": "refname", + "type": "const char *", + "comment": "refname specifying to the remote ref" + }, + { + "name": "status", + "type": "const char *", + "comment": "status message sent from the remote" + }, + { + "name": "data", + "type": "void *", + "comment": "data provided by the caller" + } + ], + "argline": "const char *refname, const char *status, void *data", + "sig": "const char *::const char *::void *", + "return": { + "type": "int", + "comment": " 0 on success, otherwise an error" + }, + "description": "

Callback used to inform of the update status from the remote.

\n", + "comments": "

Called for each updated reference on push. If status is not NULL, the update was rejected by the remote server and status contains the reason given.

\n" + }, + "git_url_resolve_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 536, + "lineto": 536, + "args": [ + { + "name": "url_resolved", + "type": "git_buf *", + "comment": "The buffer to write the resolved URL to" + }, + { + "name": "url", + "type": "const char *", + "comment": "The URL to resolve" }, - "git_checkout_notify_cb": { - "type": "callback", - "file": "git2/checkout.h", - "line": 255, - "lineto": 261, - "args": [ - { - "name": "why", - "type": "git_checkout_notify_t", - "comment": null - }, - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "baseline", - "type": "const git_diff_file *", - "comment": null - }, - { - "name": "target", - "type": "const git_diff_file *", - "comment": null - }, - { - "name": "workdir", - "type": "const git_diff_file *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload", - "sig": "git_checkout_notify_t::const char *::const git_diff_file *::const git_diff_file *::const git_diff_file *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Checkout notification callback function

\n", - "comments": "" + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" }, - "git_checkout_progress_cb": { - "type": "callback", - "file": "git2/checkout.h", - "line": 264, - "lineto": 268, - "args": [ - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "completed_steps", - "type": "size_t", - "comment": null - }, - { - "name": "total_steps", - "type": "size_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *path, size_t completed_steps, size_t total_steps, void *payload", - "sig": "const char *::size_t::size_t::void *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Checkout progress notification function

\n", - "comments": "" + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_buf *url_resolved, const char *url, int direction, void *payload", + "sig": "git_buf *::const char *::int::void *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_PASSTHROUGH or an error\n " + }, + "description": "

Callback to resolve URLs before connecting to remote

\n", + "comments": "

If you return GIT_PASSTHROUGH, you don't need to write anything to url_resolved.

\n" + }, + "git_remote_ready_cb": { + "type": "callback", + "file": "git2/remote.h", + "line": 549, + "lineto": 549, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "The remote to be connected" }, - "git_checkout_perfdata_cb": { - "type": "callback", - "file": "git2/checkout.h", - "line": 271, - "lineto": 273, - "args": [ - { - "name": "perfdata", - "type": "const git_checkout_perfdata *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_checkout_perfdata *perfdata, void *payload", - "sig": "const git_checkout_perfdata *::void *", - "return": { - "type": "void", - "comment": null - }, - "description": "

Checkout perfdata notification function

\n", - "comments": "" + { + "name": "direction", + "type": "int", + "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" }, - "git_remote_create_cb": { - "type": "callback", - "file": "git2/clone.h", - "line": 69, - "lineto": 74, - "args": [ - { - "name": "out", - "type": "git_remote **", - "comment": "the resulting remote" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "the repository in which to create the remote" - }, - { - "name": "name", - "type": "const char *", - "comment": "the remote's name" - }, - { - "name": "url", - "type": "const char *", - "comment": "the remote's url" - }, - { - "name": "payload", - "type": "void *", - "comment": "an opaque payload" - } - ], - "argline": "git_remote **out, git_repository *repo, const char *name, const char *url, void *payload", - "sig": "git_remote **::git_repository *::const char *::const char *::void *", - "return": { - "type": "int", - "comment": " 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code" - }, - "description": "

The signature of a function matching git_remote_create, with an additional\n void* as a callback payload.

\n", - "comments": "

Callers of git_clone may provide a function matching this signature to override the remote creation and customization process during a clone operation.

\n" - }, - "git_repository_create_cb": { - "type": "callback", - "file": "git2/clone.h", - "line": 90, - "lineto": 94, - "args": [ - { - "name": "out", - "type": "git_repository **", - "comment": "the resulting repository" - }, - { - "name": "path", - "type": "const char *", - "comment": "path in which to create the repository" - }, - { - "name": "bare", - "type": "int", - "comment": "whether the repository is bare. This is the value from the clone options" - }, - { - "name": "payload", - "type": "void *", - "comment": "payload specified by the options" - } - ], - "argline": "git_repository **out, const char *path, int bare, void *payload", - "sig": "git_repository **::const char *::int::void *", - "return": { - "type": "int", - "comment": " 0, or a negative value to indicate error" - }, - "description": "

The signature of a function matching git_repository_init, with an\n additional void * as callback payload.

\n", - "comments": "

Callers of git_clone my provide a function matching this signature to override the repository creation and customization process during a clone operation.

\n" - }, - "git_commit_create_cb": { - "type": "callback", - "file": "git2/commit.h", - "line": 533, - "lineto": 542, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer that this callback will populate with the object\n id of the commit that is created" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "the author name and time of the commit" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "the committer name and time of the commit" - }, - { - "name": "message_encoding", - "type": "const char *", - "comment": "the encoding of the given message, or NULL\n to assume UTF8" - }, - { - "name": "message", - "type": "const char *", - "comment": "the commit message" - }, - { - "name": "tree", - "type": "const git_tree *", - "comment": "the tree to be committed" - }, - { - "name": "parent_count", - "type": "size_t", - "comment": "the number of parents for this commit" - }, - { - "name": "parents", - "type": "const git_commit *[]", - "comment": "the commit parents" - }, - { - "name": "payload", - "type": "void *", - "comment": "the payload pointer in the rebase options" - } - ], - "argline": "git_oid *out, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree, size_t parent_count, const git_commit *[] parents, void *payload", - "sig": "git_oid *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t::const git_commit *[]::void *", - "return": { - "type": "int", - "comment": " 0 if this callback has created the commit and populated the out\n parameter, GIT_PASSTHROUGH if the callback has not created a\n commit and wants the calling function to create the commit as\n if no callback had been specified, any other value to stop\n and return a failure" - }, - "description": "

Commit creation callback: used when a function is going to create\n commits (for example, in git_rebase_commit) to allow callers to\n override the commit creation behavior. For example, users may\n wish to sign commits by providing this information to\n git_commit_create_buffer, signing that buffer, then calling\n git_commit_create_with_signature. The resultant commit id\n should be set in the out object id parameter.

\n", - "comments": "" + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "git_remote *remote, int direction, void *payload", + "sig": "git_remote *::int::void *", + "return": { "type": "int", "comment": " 0 on success, or an error" }, + "description": "

Callback invoked immediately before we attempt to connect to the\n given url. Callers may change the URL before the connection by\n calling git_remote_set_instance_url in the callback.

\n", + "comments": "" + }, + "git_repository_fetchhead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 726, + "lineto": 730, + "args": [ + { + "name": "ref_name", + "type": "const char *", + "comment": "The reference name" }, - "git_config_foreach_cb": { - "type": "callback", - "file": "git2/config.h", - "line": 87, - "lineto": 87, - "args": [ - { - "name": "entry", - "type": "const git_config_entry *", - "comment": "the entry currently being enumerated" - }, - { - "name": "payload", - "type": "void *", - "comment": "a user-specified pointer" - } - ], - "argline": "const git_config_entry *entry, void *payload", - "sig": "const git_config_entry *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration." - }, - "description": "

A config enumeration callback

\n", - "comments": "" + { + "name": "remote_url", + "type": "const char *", + "comment": "The remote URL" }, - "git_credential_acquire_cb": { - "type": "callback", - "file": "git2/credential.h", - "line": 131, - "lineto": 136, - "args": [ - { - "name": "out", - "type": "git_credential **", - "comment": "The newly created credential object." - }, - { - "name": "url", - "type": "const char *", - "comment": "The resource for which we are demanding a credential." - }, - { - "name": "username_from_url", - "type": "const char *", - "comment": "The username that was embedded in a \"user\n@\nhost\"\n remote url, or NULL if not included." - }, - { - "name": "allowed_types", - "type": "unsigned int", - "comment": "A bitmask stating which credential types are OK to return." - }, - { - "name": "payload", - "type": "void *", - "comment": "The payload provided when specifying this callback." - } - ], - "argline": "git_credential **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload", - "sig": "git_credential **::const char *::const char *::unsigned int::void *", - "return": { - "type": "int", - "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" - }, - "description": "

Credential acquisition callback.

\n", - "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" - }, - "git_commit_signing_cb": { - "type": "callback", - "file": "git2/deprecated.h", - "line": 276, - "lineto": 280, - "args": [ - { - "name": "signature", - "type": "git_buf *", - "comment": null - }, - { - "name": "signature_field", - "type": "git_buf *", - "comment": null - }, - { - "name": "commit_content", - "type": "const char *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_buf *signature, git_buf *signature_field, const char *commit_content, void *payload", - "sig": "git_buf *::git_buf *::const char *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Provide a commit signature during commit creation.

\n", - "comments": "

Callers should instead define a git_commit_create_cb that generates a commit buffer using git_commit_create_buffer, sign that buffer and call git_commit_create_with_signature.

\n" - }, - "git_headlist_cb": { - "type": "callback", - "file": "git2/deprecated.h", - "line": 855, - "lineto": 855, - "args": [ - { - "name": "rhead", - "type": "git_remote_head *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_remote_head *rhead, void *payload", - "sig": "git_remote_head *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for listing the remote heads

\n", - "comments": "" + { + "name": "oid", + "type": "const git_oid *", + "comment": "The reference target OID" }, - "git_diff_notify_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 346, - "lineto": 350, - "args": [ - { - "name": "diff_so_far", - "type": "const git_diff *", - "comment": null - }, - { - "name": "delta_to_add", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "matched_pathspec", - "type": "const char *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff *diff_so_far, const git_diff_delta *delta_to_add, const char *matched_pathspec, void *payload", - "sig": "const git_diff *::const git_diff_delta *::const char *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Diff notification callback function.

\n", - "comments": "

The callback will be called for each file, just before the git_diff_delta gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" - }, - "git_diff_progress_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 362, - "lineto": 366, - "args": [ - { - "name": "diff_so_far", - "type": "const git_diff *", - "comment": "The diff being generated." - }, - { - "name": "old_path", - "type": "const char *", - "comment": "The path to the old file or NULL." - }, - { - "name": "new_path", - "type": "const char *", - "comment": "The path to the new file or NULL." - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff *diff_so_far, const char *old_path, const char *new_path, void *payload", - "sig": "const git_diff *::const char *::const char *::void *", - "return": { - "type": "int", - "comment": " Non-zero to abort the diff." - }, - "description": "

Diff progress callback.

\n", - "comments": "

Called before each file comparison.

\n" - }, - "git_diff_file_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 496, - "lineto": 499, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": "A pointer to the delta data for the file" - }, - { - "name": "progress", - "type": "float", - "comment": "Goes from 0 to 1 over the diff" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified pointer from foreach function" - } - ], - "argline": "const git_diff_delta *delta, float progress, void *payload", - "sig": "const git_diff_delta *::float::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made per file.

\n", - "comments": "" + { + "name": "is_merge", + "type": "unsigned int", + "comment": "Was the reference the result of a merge" }, - "git_diff_binary_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 562, - "lineto": 565, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "binary", - "type": "const git_diff_binary *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff_delta *delta, const git_diff_binary *binary, void *payload", - "sig": "const git_diff_delta *::const git_diff_binary *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made for\n binary content within the diff.

\n", - "comments": "" + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_repository_fetchhead_foreach" + } + ], + "argline": "const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload", + "sig": "const char *::const char *::const git_oid *::unsigned int::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over each FETCH_HEAD entry

\n", + "comments": "" + }, + "git_repository_mergehead_foreach_cb": { + "type": "callback", + "file": "git2/repository.h", + "line": 757, + "lineto": 758, + "args": [ + { + "name": "oid", + "type": "const git_oid *", + "comment": "The merge OID" }, - "git_diff_hunk_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 588, - "lineto": 591, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload", - "sig": "const git_diff_delta *::const git_diff_hunk *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made per hunk.

\n", - "comments": "" + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_repository_mergehead_foreach" + } + ], + "argline": "const git_oid *oid, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over each MERGE_HEAD entry

\n", + "comments": "" + }, + "git_revwalk_hide_cb": { + "type": "callback", + "file": "git2/revwalk.h", + "line": 283, + "lineto": 285, + "args": [ + { + "name": "commit_id", + "type": "const git_oid *", + "comment": "oid of Commit" }, - "git_diff_line_cb": { - "type": "callback", - "file": "git2/diff.h", - "line": 649, - "lineto": 653, - "args": [ - { - "name": "delta", - "type": "const git_diff_delta *", - "comment": null - }, - { - "name": "hunk", - "type": "const git_diff_hunk *", - "comment": null - }, - { - "name": "line", - "type": "const git_diff_line *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", - "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", - "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" - }, - "git_index_matched_path_cb": { - "type": "callback", - "file": "git2/index.h", - "line": 135, - "lineto": 136, - "args": [ - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "matched_pathspec", - "type": "const char *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *path, const char *matched_pathspec, void *payload", - "sig": "const char *::const char *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", - "comments": "" + { + "name": "payload", + "type": "void *", + "comment": "User-specified pointer to data to be passed as data payload" + } + ], + "argline": "const git_oid *commit_id, void *payload", + "sig": "const git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to hide the commmit and it parent." + }, + "description": "

This is a callback function that user can provide to hide a\n commit and its parents. If the callback function returns non-zero value,\n then this commit and its parents will be hidden.

\n", + "comments": "" + }, + "git_stash_apply_progress_cb": { + "type": "callback", + "file": "git2/stash.h", + "line": 169, + "lineto": 171, + "args": [ + { + "name": "progress", + "type": "git_stash_apply_progress_t", + "comment": null + }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "git_stash_apply_progress_t progress, void *payload", + "sig": "git_stash_apply_progress_t::void *", + "return": { "type": "int", "comment": null }, + "description": "

Stash application progress notification function.\n Return 0 to continue processing, or a negative value to\n abort the stash application.

\n", + "comments": "" + }, + "git_stash_cb": { + "type": "callback", + "file": "git2/stash.h", + "line": 255, + "lineto": 259, + "args": [ + { + "name": "index", + "type": "size_t", + "comment": "The position within the stash list. 0 points to the\n most recent stashed state." }, - "git_indexer_progress_cb": { - "type": "callback", - "file": "git2/indexer.h", - "line": 57, - "lineto": 57, - "args": [ - { - "name": "stats", - "type": "const git_indexer_progress *", - "comment": "Structure containing information about the state of the transfer" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by caller" - } - ], - "argline": "const git_indexer_progress *stats, void *payload", - "sig": "const git_indexer_progress *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Type for progress callbacks during indexing. Return a value less\n than zero to cancel the indexing or download.

\n", - "comments": "" + { + "name": "message", + "type": "const char *", + "comment": "The stash message." }, - "git_note_foreach_cb": { - "type": "callback", - "file": "git2/notes.h", - "line": 29, - "lineto": 30, - "args": [ - { - "name": "blob_id", - "type": "const git_oid *", - "comment": null - }, - { - "name": "annotated_object_id", - "type": "const git_oid *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_oid *blob_id, const git_oid *annotated_object_id, void *payload", - "sig": "const git_oid *::const git_oid *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for git_note_foreach.

\n", - "comments": "

Receives: - blob_id: Oid of the blob containing the message - annotated_object_id: Oid of the git object being annotated - payload: Payload data passed to git_note_foreach

\n" - }, - "git_odb_foreach_cb": { - "type": "callback", - "file": "git2/odb.h", - "line": 39, - "lineto": 39, - "args": [ - { - "name": "id", - "type": "const git_oid *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_oid *id, void *payload", - "sig": "const git_oid *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Function type for callbacks from git_odb_foreach.

\n", - "comments": "" + { + "name": "stash_id", + "type": "const git_oid *", + "comment": "The commit oid of the stashed state." }, - "git_packbuilder_foreach_cb": { - "type": "callback", - "file": "git2/pack.h", - "line": 208, - "lineto": 208, - "args": [ - { - "name": "buf", - "type": "void *", - "comment": "A pointer to the object's data" - }, - { - "name": "size", - "type": "size_t", - "comment": "The size of the underlying object" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_packbuilder_foreach" - } - ], - "argline": "void *buf, size_t size, void *payload", - "sig": "void *::size_t::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over packed objects

\n", - "comments": "" + { + "name": "payload", + "type": "void *", + "comment": "Extra parameter to callback function." + } + ], + "argline": "size_t index, const char *message, const git_oid *stash_id, void *payload", + "sig": "size_t::const char *::const git_oid *::void *", + "return": { + "type": "int", + "comment": " 0 to continue iterating or non-zero to stop." + }, + "description": "

This is a callback function you can provide to iterate over all the\n stashed states that will be invoked per entry.

\n", + "comments": "" + }, + "git_status_cb": { + "type": "callback", + "file": "git2/status.h", + "line": 63, + "lineto": 64, + "args": [ + { "name": "path", "type": "const char *", "comment": null }, + { "name": "status_flags", "type": "unsigned int", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const char *path, unsigned int status_flags, void *payload", + "sig": "const char *::unsigned int::void *", + "return": { "type": "int", "comment": null }, + "description": "

Function pointer to receive status on individual files

\n", + "comments": "

path is the relative path to the file from the root of the repository.

\n\n

status_flags is a combination of git_status_t values that apply.

\n\n

payload is the value you passed to the foreach function as payload.

\n" + }, + "git_submodule_cb": { + "type": "callback", + "file": "git2/submodule.h", + "line": 118, + "lineto": 119, + "args": [ + { + "name": "sm", + "type": "git_submodule *", + "comment": "git_submodule currently being visited" + }, + { + "name": "name", + "type": "const char *", + "comment": "name of the submodule" + }, + { + "name": "payload", + "type": "void *", + "comment": "value you passed to the foreach function as payload" + } + ], + "argline": "git_submodule *sm, const char *name, void *payload", + "sig": "git_submodule *::const char *::void *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Function pointer to receive each submodule

\n", + "comments": "" + }, + "git_tag_foreach_cb": { + "type": "callback", + "file": "git2/tag.h", + "line": 330, + "lineto": 330, + "args": [ + { "name": "name", "type": "const char *", "comment": "The tag name" }, + { "name": "oid", "type": "git_oid *", "comment": "The tag's OID" }, + { + "name": "payload", + "type": "void *", + "comment": "Payload passed to git_tag_foreach" + } + ], + "argline": "const char *name, git_oid *oid, void *payload", + "sig": "const char *::git_oid *::void *", + "return": { + "type": "int", + "comment": " non-zero to terminate the iteration" + }, + "description": "

Callback used to iterate over tag names

\n", + "comments": "" + }, + "git_trace_cb": { + "type": "callback", + "file": "git2/trace.h", + "line": 52, + "lineto": 52, + "args": [ + { "name": "level", "type": "git_trace_level_t", "comment": null }, + { "name": "msg", "type": "const char *", "comment": null } + ], + "argline": "git_trace_level_t level, const char *msg", + "sig": "git_trace_level_t::const char *", + "return": { "type": "void", "comment": null }, + "description": "

An instance for a tracing function

\n", + "comments": "" + }, + "git_transport_message_cb": { + "type": "callback", + "file": "git2/transport.h", + "line": 34, + "lineto": 34, + "args": [ + { + "name": "str", + "type": "const char *", + "comment": "The message from the transport" + }, + { + "name": "len", + "type": "int", + "comment": "The length of the message" }, - "git_packbuilder_progress": { - "type": "callback", - "file": "git2/pack.h", - "line": 237, - "lineto": 241, - "args": [ - { - "name": "stage", - "type": "int", - "comment": null - }, - { - "name": "current", - "type": "uint32_t", - "comment": null - }, - { - "name": "total", - "type": "uint32_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "int stage, uint32_t current, uint32_t total, void *payload", - "sig": "int::uint32_t::uint32_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Packbuilder progress notification function

\n", + { + "name": "payload", + "type": "void *", + "comment": "Payload provided by the caller" + } + ], + "argline": "const char *str, int len, void *payload", + "sig": "const char *::int::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback for messages received by the transport.

\n", + "comments": "

Return a negative value to cancel the network operation.

\n" + }, + "git_transport_cb": { + "type": "callback", + "file": "git2/transport.h", + "line": 37, + "lineto": 37, + "args": [ + { "name": "out", "type": "git_transport **", "comment": null }, + { "name": "owner", "type": "git_remote *", "comment": null }, + { "name": "param", "type": "void *", "comment": null } + ], + "argline": "git_transport **out, git_remote *owner, void *param", + "sig": "git_transport **::git_remote *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Signature of a function which creates a transport

\n", + "comments": "" + }, + "git_treebuilder_filter_cb": { + "type": "callback", + "file": "git2/tree.h", + "line": 349, + "lineto": 350, + "args": [ + { "name": "entry", "type": "const git_tree_entry *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const git_tree_entry *entry, void *payload", + "sig": "const git_tree_entry *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback for git_treebuilder_filter

\n", + "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" + }, + "git_treewalk_cb": { + "type": "callback", + "file": "git2/tree.h", + "line": 383, + "lineto": 384, + "args": [ + { "name": "root", "type": "const char *", "comment": null }, + { "name": "entry", "type": "const git_tree_entry *", "comment": null }, + { "name": "payload", "type": "void *", "comment": null } + ], + "argline": "const char *root, const git_tree_entry *entry, void *payload", + "sig": "const char *::const git_tree_entry *::void *", + "return": { "type": "int", "comment": null }, + "description": "

Callback for the tree traversal method

\n", + "comments": "" + } + }, + "globals": {}, + "types": [ + [ + "git_annotated_commit", + { + "decl": "git_annotated_commit", + "type": "struct", + "value": "git_annotated_commit", + "file": "git2/types.h", + "line": 198, + "lineto": 198, + "tdef": "typedef", + "description": " Annotated commits, the input to merge and rebase. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_annotated_commit_free", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_lookup", + "git_annotated_commit_ref", + "git_branch_create_from_annotated", + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_rebase_init", + "git_repository_set_head_detached_from_annotated", + "git_reset_from_annotated" + ] + } + } + ], + [ + "git_apply_flags_t", + { + "decl": ["GIT_APPLY_CHECK"], + "type": "enum", + "file": "git2/apply.h", + "line": 61, + "lineto": 67, + "block": "GIT_APPLY_CHECK", + "tdef": "typedef", + "description": " Flags controlling the behavior of git_apply ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_CHECK", + "comments": "

Don't actually make changes, just test that the patch applies.\n This is the equivalent of git apply --check.

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_apply_location_t", + { + "decl": [ + "GIT_APPLY_LOCATION_WORKDIR", + "GIT_APPLY_LOCATION_INDEX", + "GIT_APPLY_LOCATION_BOTH" + ], + "type": "enum", + "file": "git2/apply.h", + "line": 127, + "lineto": 145, + "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", + "tdef": "typedef", + "description": " Possible application locations for git_apply ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_APPLY_LOCATION_WORKDIR", + "comments": "

Apply the patch to the workdir, leaving the index untouched.\n This is the equivalent of git apply with no location argument.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_INDEX", + "comments": "

Apply the patch to the index, leaving the working directory\n untouched. This is the equivalent of git apply --cached.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_APPLY_LOCATION_BOTH", + "comments": "

Apply the patch to both the working directory and the index.\n This is the equivalent of git apply --index.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": ["git_apply"] } + } + ], + [ + "git_apply_options", + { + "decl": [ + "unsigned int version", + "git_apply_delta_cb delta_cb", + "git_apply_hunk_cb hunk_cb", + "void * payload", + "unsigned int flags" + ], + "type": "struct", + "value": "git_apply_options", + "file": "git2/apply.h", + "line": 77, + "lineto": 91, + "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload\nunsigned int flags", + "tdef": "typedef", + "description": " Apply options structure", + "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "git_apply_delta_cb", + "name": "delta_cb", + "comments": " When applying a patch, callback that will be made per delta (file). " + }, + { + "type": "git_apply_hunk_cb", + "name": "hunk_cb", + "comments": " When applying a patch, callback that will be made per hunk. " + }, + { + "type": "void *", + "name": "payload", + "comments": " Payload passed to both delta_cb \n&\n hunk_cb. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Bitmask of git_apply_flags_t " + } + ], + "used": { + "returns": [], + "needs": ["git_apply", "git_apply_options_init", "git_apply_to_tree"] + } + } + ], + [ + "git_attr_options", + { + "decl": [ + "unsigned int version", + "unsigned int flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_attr_options", + "file": "git2/attr.h", + "line": 142, + "lineto": 159, + "block": "unsigned int version\nunsigned int flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " An options structure for querying attributes.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "flags", + "comments": " A combination of GIT_ATTR_CHECK flags " + }, + { "type": "git_oid *", "name": "commit_id", "comments": "" }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_ATTR_CHECK_INCLUDE_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": [ + "git_attr_foreach_ext", + "git_attr_get_ext", + "git_attr_get_many_ext" + ] + } + } + ], + [ + "git_attr_value_t", + { + "decl": [ + "GIT_ATTR_VALUE_UNSPECIFIED", + "GIT_ATTR_VALUE_TRUE", + "GIT_ATTR_VALUE_FALSE", + "GIT_ATTR_VALUE_STRING" + ], + "type": "enum", + "file": "git2/attr.h", + "line": 82, + "lineto": 87, + "block": "GIT_ATTR_VALUE_UNSPECIFIED\nGIT_ATTR_VALUE_TRUE\nGIT_ATTR_VALUE_FALSE\nGIT_ATTR_VALUE_STRING", + "tdef": "typedef", + "description": " Possible states for an attribute", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ATTR_VALUE_UNSPECIFIED", + "comments": "

The attribute has been left unspecified

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_TRUE", + "comments": "

The attribute has been set

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_FALSE", + "comments": "

The attribute has been unset

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_ATTR_VALUE_STRING", + "comments": "

This attribute has a value

\n", + "value": 3 + } + ], + "used": { "returns": ["git_attr_value"], "needs": [] } + } + ], + [ + "git_blame", + { + "decl": "git_blame", + "type": "struct", + "value": "git_blame", + "file": "git2/blame.h", + "line": 202, + "lineto": 202, + "tdef": "typedef", + "description": " Opaque structure to hold blame results ", + "comments": "", + "used": { + "returns": [ + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline" + ], + "needs": [ + "git_blame_buffer", + "git_blame_file", + "git_blame_free", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_get_hunk_count", + "git_blame_init_options", + "git_blame_options_init" + ] + } + } + ], + [ + "git_blame_flag_t", + { + "decl": [ + "GIT_BLAME_NORMAL", + "GIT_BLAME_TRACK_COPIES_SAME_FILE", + "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", + "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", + "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", + "GIT_BLAME_FIRST_PARENT", + "GIT_BLAME_USE_MAILMAP", + "GIT_BLAME_IGNORE_WHITESPACE" + ], + "type": "enum", + "file": "git2/blame.h", + "line": 26, + "lineto": 77, + "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", + "tdef": "typedef", + "description": " Flags for indicating option behavior for git_blame APIs.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BLAME_NORMAL", + "comments": "

Normal blame, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_FILE", + "comments": "

Track lines that have moved within a file (like git blame -M).

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", + "comments": "

Track lines that have moved across files in the same commit\n (like git blame -C).

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", + "comments": "

Track lines that have been copied from another file that exists\n in the same commit (like git blame -CC). Implies SAME_FILE.

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", + "comments": "

Track lines that have been copied from another file that exists in\n any commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.

\n\n

This is not yet implemented and reserved for future use.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_BLAME_FIRST_PARENT", + "comments": "

Restrict the search of commits to those reachable following only\n the first parents.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_BLAME_USE_MAILMAP", + "comments": "

Use mailmap file to map author and committer names and email\n addresses to canonical real names and email addresses. The\n mailmap will be read from the working directory, or HEAD in a\n bare repository.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_BLAME_IGNORE_WHITESPACE", + "comments": "

Ignore whitespace differences

\n", + "value": 64 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_blame_hunk", + { + "decl": [ + "size_t lines_in_hunk", + "git_oid final_commit_id", + "size_t final_start_line_number", + "git_signature * final_signature", + "git_oid orig_commit_id", + "const char * orig_path", + "size_t orig_start_line_number", + "git_signature * orig_signature", + "char boundary" + ], + "type": "struct", + "value": "git_blame_hunk", + "file": "git2/blame.h", + "line": 145, + "lineto": 198, + "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", + "tdef": "typedef", + "description": " Structure that represents a blame hunk.", + "comments": "", + "fields": [ + { + "type": "size_t", + "name": "lines_in_hunk", + "comments": " The number of lines in this hunk." + }, + { + "type": "git_oid", + "name": "final_commit_id", + "comments": " The OID of the commit where this line was last changed." + }, + { + "type": "size_t", + "name": "final_start_line_number", + "comments": " The 1-based line number where this hunk begins, in the final version\n of the file." + }, + { + "type": "git_signature *", + "name": "final_signature", + "comments": " The author of `final_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." + }, + { + "type": "git_oid", + "name": "orig_commit_id", + "comments": " The OID of the commit where this hunk was found.\n This will usually be the same as `final_commit_id`, except when\n `GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES` has been specified." + }, + { + "type": "const char *", + "name": "orig_path", + "comments": " The path to the file where this hunk originated, as of the commit\n specified by `orig_commit_id`." + }, + { + "type": "size_t", + "name": "orig_start_line_number", + "comments": " The 1-based line number where this hunk begins in the file named by\n `orig_path` in the commit specified by `orig_commit_id`." + }, + { + "type": "git_signature *", + "name": "orig_signature", + "comments": " The author of `orig_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." + }, + { + "type": "char", + "name": "boundary", + "comments": " The 1 iff the hunk has been tracked to a boundary commit (the root,\n or the commit specified in git_blame_options.oldest_commit)" + } + ], + "used": { + "returns": [ + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline" + ], + "needs": [] + } + } + ], + [ + "git_blame_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint16_t min_match_characters", + "git_oid newest_commit", + "git_oid oldest_commit", + "size_t min_line", + "size_t max_line" + ], + "type": "struct", + "value": "git_blame_options", + "file": "git2/blame.h", + "line": 86, + "lineto": 123, + "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", + "tdef": "typedef", + "description": " Blame options structure", + "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can use git_blame_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_blame_flag_t` " + }, + { + "type": "uint16_t", + "name": "min_match_characters", + "comments": " The lower bound on the number of alphanumeric characters that\n must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value\n is 20.\n\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." + }, + { + "type": "git_oid", + "name": "newest_commit", + "comments": " The id of the newest commit to consider. The default is HEAD. " + }, + { + "type": "git_oid", + "name": "oldest_commit", + "comments": " The id of the oldest commit to consider.\n The default is the first commit encountered with a NULL parent." + }, + { + "type": "size_t", + "name": "min_line", + "comments": " The first line in the file to blame.\n The default is 1 (line numbers start with 1)." + }, + { + "type": "size_t", + "name": "max_line", + "comments": " The last line in the file to blame.\n The default is the last line of the file." + } + ], + "used": { + "returns": [], + "needs": [ + "git_blame_file", + "git_blame_init_options", + "git_blame_options_init" + ] + } + } + ], + [ + "git_blob", + { + "decl": "git_blob", + "type": "struct", + "value": "git_blob", + "file": "git2/types.h", + "line": 133, + "lineto": 133, + "tdef": "typedef", + "description": " In-memory representation of a blob object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_blob_dup", + "git_blob_filter", + "git_blob_filter_options_init", + "git_blob_filtered_content", + "git_blob_free", + "git_blob_id", + "git_blob_is_binary", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_filter_list_apply_to_blob", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs" + ] + } + } + ], + [ + "git_blob_filter_flag_t", + { + "decl": [ + "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT" + ], + "type": "enum", + "file": "git2/blob.h", + "line": 102, + "lineto": 123, + "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", + "tdef": "typedef", + "description": " Flags to control the functionality of `git_blob_filter`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BLOB_FILTER_CHECK_FOR_BINARY", + "comments": "

When set, filters will not be applied to binary files.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

When set, filters will not load configuration from the\n system-wide gitattributes in /etc (or system equivalent).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

When set, filters will be loaded from a .gitattributes file\n in the specified commit.

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_blob_filter_options", + { + "decl": [ + "int version", + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_blob_filter_options", + "file": "git2/blob.h", + "line": 132, + "lineto": 149, + "block": "int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " The options used when applying filter options to a file.", + "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n", + "fields": [ + { "type": "int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above " + }, + { "type": "git_oid *", "name": "commit_id", "comments": "" }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." + } + ], + "used": { + "returns": [], + "needs": ["git_blob_filter", "git_blob_filter_options_init"] + } + } + ], + [ + "git_branch_iterator", + { + "decl": "git_branch_iterator", + "type": "struct", + "value": "git_branch_iterator", + "file": "git2/branch.h", + "line": 90, + "lineto": 90, + "tdef": "typedef", + "description": " Iterator type for branches ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_branch_iterator_free", + "git_branch_iterator_new", + "git_branch_next" + ] + } + } + ], + [ + "git_branch_t", + { + "decl": ["GIT_BRANCH_LOCAL", "GIT_BRANCH_REMOTE", "GIT_BRANCH_ALL"], + "type": "enum", + "file": "git2/types.h", + "line": 215, + "lineto": 219, + "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", + "tdef": "typedef", + "description": " Basic type of any Git branch. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_BRANCH_LOCAL", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_BRANCH_REMOTE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_BRANCH_ALL", + "comments": "", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": [ + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_next" + ] + } + } + ], + [ + "git_buf", + { + "decl": ["char * ptr", "size_t reserved", "size_t size"], + "type": "struct", + "value": "git_buf", + "file": "git2/buffer.h", + "line": 33, + "lineto": 52, + "block": "char * ptr\nsize_t reserved\nsize_t size", + "tdef": "typedef", + "description": " A data buffer for exporting data from libgit2", + "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. To make ownership clear in these cases, libgit2 uses git_buf to return this data. Callers should use git_buf_dispose() to release the memory when they are done.

\n\n

A git_buf contains a pointer to a NUL-terminated C string, and the length of the string (not including the NUL terminator).

\n", + "fields": [ + { + "type": "char *", + "name": "ptr", + "comments": " The buffer contents. `ptr` points to the start of the buffer\n being returned. The buffer's length (in bytes) is specified\n by the `size` member of the structure, and contains a NUL\n terminator at position `(size + 1)`." + }, + { + "type": "size_t", + "name": "reserved", + "comments": " This field is reserved and unused." + }, + { + "type": "size_t", + "name": "size", + "comments": " The length (in bytes) of the buffer pointed to by `ptr`,\n not including a NUL terminator." + } + ], + "used": { + "returns": [], + "needs": [ + "git_blob_filter", + "git_blob_filtered_content", + "git_branch_remote_name", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote", + "git_buf_contains_nul", + "git_buf_dispose", + "git_buf_free", + "git_buf_grow", + "git_buf_is_binary", + "git_buf_set", + "git_commit_create_buffer", + "git_commit_extract_signature", + "git_commit_header_field", + "git_commit_signing_cb", + "git_config_find_global", + "git_config_find_programdata", + "git_config_find_system", + "git_config_find_xdg", + "git_config_get_path", + "git_config_get_string_buf", + "git_config_parse_path", + "git_describe_format", + "git_diff_commit_as_email", + "git_diff_format_email", + "git_diff_stats_to_buf", + "git_diff_to_buf", + "git_email_create_from_commit", + "git_email_create_from_diff", + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_stream_data", + "git_message_prettify", + "git_note_default_ref", + "git_object_short_id", + "git_packbuilder_write_buf", + "git_patch_to_buf", + "git_refspec_rtransform", + "git_refspec_transform", + "git_remote_default_branch", + "git_repository_discover", + "git_repository_item_path", + "git_repository_message", + "git_submodule_resolve_url", + "git_treebuilder_write_with_buffer", + "git_url_resolve_cb", + "git_worktree_is_locked" + ] + } + } + ], + [ + "git_cert", + { + "decl": "git_cert", + "type": "struct", + "value": "git_cert", + "file": "git2/types.h", + "line": 262, + "lineto": 262, + "block": "git_cert_t cert_type", + "tdef": "typedef", + "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", + "comments": "", + "fields": [ + { + "type": "git_cert_t", + "name": "cert_type", + "comments": " Type of certificate. A `GIT_CERT_` value." + } + ], + "used": { + "returns": [], + "needs": ["git_transport_certificate_check_cb"] + } + } + ], + [ + "git_cert_hostkey", + { + "decl": [ + "git_cert parent", + "git_cert_ssh_t type", + "unsigned char [16] hash_md5", + "unsigned char [20] hash_sha1", + "unsigned char [32] hash_sha256", + "git_cert_ssh_raw_type_t raw_type", + "const char * hostkey", + "size_t hostkey_len" + ], + "type": "struct", + "value": "git_cert_hostkey", + "file": "git2/cert.h", + "line": 108, + "lineto": 151, + "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", + "tdef": "typedef", + "description": " Hostkey information taken from libssh2", + "comments": "", + "fields": [ + { + "type": "git_cert", + "name": "parent", + "comments": " The parent cert " + }, + { + "type": "git_cert_ssh_t", + "name": "type", + "comments": " A bitmask containing the available fields." + }, + { + "type": "unsigned char [16]", + "name": "hash_md5", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey." + }, + { + "type": "unsigned char [20]", + "name": "hash_sha1", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." + }, + { + "type": "unsigned char [32]", + "name": "hash_sha256", + "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." + }, + { + "type": "git_cert_ssh_raw_type_t", + "name": "raw_type", + "comments": " Raw hostkey type. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the type of the raw hostkey." + }, + { + "type": "const char *", + "name": "hostkey", + "comments": " Pointer to the raw hostkey. If `type` has `GIT_CERT_SSH_RAW` set,\n this will have the raw contents of the hostkey." + }, + { + "type": "size_t", + "name": "hostkey_len", + "comments": " Raw hostkey length. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the length of the raw contents of the hostkey." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cert_ssh_t", + { + "decl": [ + "GIT_CERT_SSH_MD5", + "GIT_CERT_SSH_SHA1", + "GIT_CERT_SSH_SHA256", + "GIT_CERT_SSH_RAW" + ], + "type": "enum", + "file": "git2/cert.h", + "line": 77, + "lineto": 86, + "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256\nGIT_CERT_SSH_RAW", + "tdef": "typedef", + "description": " Type of SSH host fingerprint", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CERT_SSH_MD5", + "comments": "

MD5 is available

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_SHA1", + "comments": "

SHA-1 is available

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_SHA256", + "comments": "

SHA-256 is available

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CERT_SSH_RAW", + "comments": "

Raw hostkey is available

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cert_t", + { + "decl": [ + "GIT_CERT_NONE", + "GIT_CERT_X509", + "GIT_CERT_HOSTKEY_LIBSSH2", + "GIT_CERT_STRARRAY" + ], + "type": "enum", + "file": "git2/cert.h", + "line": 25, + "lineto": 48, + "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", + "tdef": "typedef", + "description": " Type of host certificate structure that is passed to the check callback", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CERT_NONE", + "comments": "

No information about the certificate is available. This may\n happen when using curl.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CERT_X509", + "comments": "

The data argument to the callback will be a pointer to\n the DER-encoded data.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CERT_HOSTKEY_LIBSSH2", + "comments": "

The data argument to the callback will be a pointer to a\n git_cert_hostkey structure.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CERT_STRARRAY", + "comments": "

The data argument to the callback will be a pointer to a\n git_strarray with name:content strings containing\n information about the certificate. This is used when using\n curl.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cert_x509", + { + "decl": ["git_cert parent", "void * data", "size_t len"], + "type": "struct", + "value": "git_cert_x509", + "file": "git2/cert.h", + "line": 156, + "lineto": 168, + "block": "git_cert parent\nvoid * data\nsize_t len", + "tdef": "typedef", + "description": " X.509 certificate information", + "comments": "", + "fields": [ + { + "type": "git_cert", + "name": "parent", + "comments": " The parent cert " + }, + { + "type": "void *", + "name": "data", + "comments": " Pointer to the X.509 certificate data" + }, + { + "type": "size_t", + "name": "len", + "comments": " Length of the memory block pointed to by `data`." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_checkout_notify_t", + { + "decl": [ + "GIT_CHECKOUT_NOTIFY_NONE", + "GIT_CHECKOUT_NOTIFY_CONFLICT", + "GIT_CHECKOUT_NOTIFY_DIRTY", + "GIT_CHECKOUT_NOTIFY_UPDATED", + "GIT_CHECKOUT_NOTIFY_UNTRACKED", + "GIT_CHECKOUT_NOTIFY_IGNORED", + "GIT_CHECKOUT_NOTIFY_ALL" + ], + "type": "enum", + "file": "git2/checkout.h", + "line": 214, + "lineto": 245, + "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", + "tdef": "typedef", + "description": " Checkout notification flags", + "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_CONFLICT", + "comments": "

Invokes checkout on conflicting paths.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_DIRTY", + "comments": "

Notifies about "dirty" files, i.e. those that do not need an update\n but no longer match the baseline. Core git displays these files when\n checkout runs, but won't stop the checkout.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_UPDATED", + "comments": "

Sends notification for any file changed.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_UNTRACKED", + "comments": "

Notifies about untracked files.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_IGNORED", + "comments": "

Notifies about ignored files.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NOTIFY_ALL", + "comments": "

Notifies about ignored files.

\n", + "value": 65535 + } + ], + "used": { "returns": [], "needs": ["git_checkout_notify_cb"] } + } + ], + [ + "git_checkout_options", + { + "decl": [ + "unsigned int version", + "unsigned int checkout_strategy", + "int disable_filters", + "unsigned int dir_mode", + "unsigned int file_mode", + "int file_open_flags", + "unsigned int notify_flags", + "git_checkout_notify_cb notify_cb", + "void * notify_payload", + "git_checkout_progress_cb progress_cb", + "void * progress_payload", + "git_strarray paths", + "git_tree * baseline", + "git_index * baseline_index", + "const char * target_directory", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_checkout_perfdata_cb perfdata_cb", + "void * perfdata_payload" + ], + "type": "struct", + "value": "git_checkout_options", + "file": "git2/checkout.h", + "line": 282, + "lineto": 345, + "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", + "tdef": "typedef", + "description": " Checkout options structure", + "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "unsigned int", + "name": "checkout_strategy", + "comments": " default will be a safe checkout " + }, + { + "type": "int", + "name": "disable_filters", + "comments": " don't apply filters like CRLF conversion " + }, + { + "type": "unsigned int", + "name": "dir_mode", + "comments": " default is 0755 " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " default is 0644 or 0755 as dictated by blob " + }, + { + "type": "int", + "name": "file_open_flags", + "comments": " default is O_CREAT | O_TRUNC | O_WRONLY " + }, + { + "type": "unsigned int", + "name": "notify_flags", + "comments": " see `git_checkout_notify_t` above " + }, + { + "type": "git_checkout_notify_cb", + "name": "notify_cb", + "comments": " Optional callback to get notifications on specific file states.\n " + }, + { + "type": "void *", + "name": "notify_payload", + "comments": " Payload passed to notify_cb " + }, + { + "type": "git_checkout_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of checkout progress. " + }, + { + "type": "void *", + "name": "progress_payload", + "comments": " Payload passed to progress_cb " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." + }, + { + "type": "git_index *", + "name": "baseline_index", + "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." + }, + { + "type": "const char *", + "name": "target_directory", + "comments": " alternative checkout path to workdir " + }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " the name of the common ancestor side of conflicts " + }, + { + "type": "const char *", + "name": "our_label", + "comments": " the name of the \"our\" side of conflicts " + }, + { + "type": "const char *", + "name": "their_label", + "comments": " the name of the \"their\" side of conflicts " + }, + { + "type": "git_checkout_perfdata_cb", + "name": "perfdata_cb", + "comments": " Optional callback to notify the consumer of performance data. " + }, + { + "type": "void *", + "name": "perfdata_payload", + "comments": " Payload passed to perfdata_cb " + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_head", + "git_checkout_index", + "git_checkout_options_init", + "git_checkout_tree", + "git_merge", + "git_reset", + "git_reset_from_annotated" + ] + } + } + ], + [ + "git_checkout_perfdata", + { + "decl": [ + "size_t mkdir_calls", + "size_t stat_calls", + "size_t chmod_calls" + ], + "type": "struct", + "value": "git_checkout_perfdata", + "file": "git2/checkout.h", + "line": 248, + "lineto": 252, + "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", + "tdef": "typedef", + "description": " Checkout performance-reporting structure ", + "comments": "", + "fields": [ + { "type": "size_t", "name": "mkdir_calls", "comments": "" }, + { "type": "size_t", "name": "stat_calls", "comments": "" }, + { "type": "size_t", "name": "chmod_calls", "comments": "" } + ], + "used": { "returns": [], "needs": ["git_checkout_perfdata_cb"] } + } + ], + [ + "git_checkout_strategy_t", + { + "decl": [ + "GIT_CHECKOUT_NONE", + "GIT_CHECKOUT_SAFE", + "GIT_CHECKOUT_FORCE", + "GIT_CHECKOUT_RECREATE_MISSING", + "GIT_CHECKOUT_ALLOW_CONFLICTS", + "GIT_CHECKOUT_REMOVE_UNTRACKED", + "GIT_CHECKOUT_REMOVE_IGNORED", + "GIT_CHECKOUT_UPDATE_ONLY", + "GIT_CHECKOUT_DONT_UPDATE_INDEX", + "GIT_CHECKOUT_NO_REFRESH", + "GIT_CHECKOUT_SKIP_UNMERGED", + "GIT_CHECKOUT_USE_OURS", + "GIT_CHECKOUT_USE_THEIRS", + "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", + "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", + "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", + "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", + "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", + "GIT_CHECKOUT_DONT_REMOVE_EXISTING", + "GIT_CHECKOUT_DONT_WRITE_INDEX", + "GIT_CHECKOUT_DRY_RUN", + "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", + "GIT_CHECKOUT_UPDATE_SUBMODULES", + "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" + ], + "type": "enum", + "file": "git2/checkout.h", + "line": 106, + "lineto": 198, + "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "tdef": "typedef", + "description": " Checkout behavior flags", + "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_CHECKOUT_NONE", + "comments": "

default is a dry run, no actual updates

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SAFE", + "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked out files,\n the checkout will still proceed, leaving the changes intact.

\n\n

Mutually exclusive with GIT_CHECKOUT_FORCE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_FORCE", + "comments": "

Allow all updates to force working directory to look like index.

\n\n

Mutually exclusive with GIT_CHECKOUT_SAFE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_RECREATE_MISSING", + "comments": "

Allow checkout to recreate missing files

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_ALLOW_CONFLICTS", + "comments": "

Allow checkout to make safe updates even if conflicts are found

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_REMOVE_UNTRACKED", + "comments": "

Remove untracked files not in index (that are not ignored)

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_REMOVE_IGNORED", + "comments": "

Remove ignored files not in index

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_ONLY", + "comments": "

Only update existing files, don't create new ones

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_UPDATE_INDEX", + "comments": "

Normally checkout updates index entries as it goes; this stops that.\n Implies GIT_CHECKOUT_DONT_WRITE_INDEX.

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_NO_REFRESH", + "comments": "

Don't refresh index/config/etc before doing checkout

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SKIP_UNMERGED", + "comments": "

Allow checkout to skip unmerged files

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_USE_OURS", + "comments": "

For unmerged files, checkout stage 2 from index

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_USE_THEIRS", + "comments": "

For unmerged files, checkout stage 3 from index

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", + "comments": "

Treat pathspec as simple list of exact match file paths

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", + "comments": "

Ignore directories in use, they will be left empty

\n", + "value": 262144 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", + "comments": "

Don't overwrite ignored files that exist in the checkout target

\n", + "value": 524288 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", + "comments": "

Write normal merge files for conflicts

\n", + "value": 1048576 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", + "comments": "

Include common ancestor data in diff3 format files for conflicts

\n", + "value": 2097152 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_REMOVE_EXISTING", + "comments": "

Don't overwrite existing files or folders

\n", + "value": 4194304 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DONT_WRITE_INDEX", + "comments": "

Normally checkout writes the index upon completion; this prevents that.

\n", + "value": 8388608 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_DRY_RUN", + "comments": "

Show what would be done by a checkout. Stop after sending\n notifications; don't update the working directory or index.

\n", + "value": 16777216 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", + "comments": "

Include common ancestor data in zdiff3 format for conflicts

\n", + "value": 33554432 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_SUBMODULES", + "comments": "

Recursively checkout submodules with same options (NOT IMPLEMENTED)

\n", + "value": 65536 + }, + { + "type": "int", + "name": "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "comments": "

Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED)

\n", + "value": 131072 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_cherrypick_options", + { + "decl": [ + "unsigned int version", + "unsigned int mainline", + "git_merge_options merge_opts", + "git_checkout_options checkout_opts" + ], + "type": "struct", + "value": "git_cherrypick_options", + "file": "git2/cherrypick.h", + "line": 26, + "lineto": 34, + "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", + "tdef": "typedef", + "description": " Cherry-pick options", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "mainline", + "comments": " For merge commits, the \"mainline\" is treated as the parent. " + }, + { + "type": "git_merge_options", + "name": "merge_opts", + "comments": " Options for the merging " + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " Options for the checkout " + } + ], + "used": { + "returns": [], + "needs": ["git_cherrypick", "git_cherrypick_options_init"] + } + } + ], + [ + "git_clone_local_t", + { + "decl": [ + "GIT_CLONE_LOCAL_AUTO", + "GIT_CLONE_LOCAL", + "GIT_CLONE_NO_LOCAL", + "GIT_CLONE_LOCAL_NO_LINKS" + ], + "type": "enum", + "file": "git2/clone.h", + "line": 33, + "lineto": 53, + "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", + "tdef": "typedef", + "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CLONE_LOCAL_AUTO", + "comments": "

Auto-detect (default), libgit2 will bypass the git-aware\n transport for local paths, but use a normal fetch for\n file:// urls.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CLONE_LOCAL", + "comments": "

Bypass the git-aware transport even for a file:// url.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CLONE_NO_LOCAL", + "comments": "

Do no bypass the git-aware transport

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CLONE_LOCAL_NO_LINKS", + "comments": "

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_clone_options", + { + "decl": [ + "unsigned int version", + "git_checkout_options checkout_opts", + "git_fetch_options fetch_opts", + "int bare", + "git_clone_local_t local", + "const char * checkout_branch", + "git_repository_create_cb repository_cb", + "void * repository_cb_payload", + "git_remote_create_cb remote_cb", + "void * remote_cb_payload" + ], + "type": "struct", + "value": "git_clone_options", + "file": "git2/clone.h", + "line": 103, + "lineto": 164, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", + "tdef": "typedef", + "description": " Clone options structure", + "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`." + }, + { + "type": "git_fetch_options", + "name": "fetch_opts", + "comments": " Options which control the fetch, including callbacks.\n\n The callbacks are used for reporting fetch progress, and for acquiring\n credentials in the event they are needed." + }, + { + "type": "int", + "name": "bare", + "comments": " Set to zero (false) to create a standard repo, or non-zero\n for a bare repo" + }, + { + "type": "git_clone_local_t", + "name": "local", + "comments": " Whether to use a fetch or copy the object database." + }, + { + "type": "const char *", + "name": "checkout_branch", + "comments": " The name of the branch to checkout. NULL means use the\n remote's default branch." + }, + { + "type": "git_repository_create_cb", + "name": "repository_cb", + "comments": " A callback used to create the new repository into which to\n clone. If NULL, the 'bare' field will be used to determine\n whether to create a bare repository." + }, + { + "type": "void *", + "name": "repository_cb_payload", + "comments": " An opaque payload to pass to the git_repository creation callback.\n This parameter is ignored unless repository_cb is non-NULL." + }, + { + "type": "git_remote_create_cb", + "name": "remote_cb", + "comments": " A callback used to create the git_remote, prior to its being\n used to perform the clone operation. See the documentation for\n git_remote_create_cb for details. This parameter may be NULL,\n indicating that git_clone should provide default behavior." + }, + { + "type": "void *", + "name": "remote_cb_payload", + "comments": " An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL." + } + ], + "used": { + "returns": [], + "needs": ["git_clone", "git_clone_options_init"] + } + } + ], + [ + "git_commit", + { + "decl": "git_commit", + "type": "struct", + "value": "git_commit", + "file": "git2/types.h", + "line": 136, + "lineto": 136, + "tdef": "typedef", + "description": " Parsed representation of a commit object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_branch_create", + "git_cherrypick", + "git_cherrypick_commit", + "git_commit_amend", + "git_commit_author", + "git_commit_author_with_mailmap", + "git_commit_body", + "git_commit_committer", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_from_stage", + "git_commit_dup", + "git_commit_free", + "git_commit_header_field", + "git_commit_id", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_message", + "git_commit_message_encoding", + "git_commit_message_raw", + "git_commit_nth_gen_ancestor", + "git_commit_owner", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_parentcount", + "git_commit_raw_header", + "git_commit_summary", + "git_commit_time", + "git_commit_time_offset", + "git_commit_tree", + "git_commit_tree_id", + "git_commitarray_dispose", + "git_diff_commit_as_email", + "git_email_create_from_commit", + "git_merge_commits", + "git_note_commit_create", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_commit_remove", + "git_odb_set_commit_graph", + "git_repository_commit_parents", + "git_revert", + "git_revert_commit" + ] + } + } + ], + [ + "git_commit_graph", + { + "decl": "git_commit_graph", + "type": "struct", + "value": "git_commit_graph", + "file": "git2/types.h", + "line": 109, + "lineto": 109, + "tdef": "typedef", + "description": " A git commit-graph ", + "comments": "", + "used": { "returns": [], "needs": ["git_odb_set_commit_graph"] } + } + ], + [ + "git_commit_graph_split_strategy_t", + { + "decl": ["GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE"], + "type": "enum", + "file": "git2/sys/commit_graph.h", + "line": 102, + "lineto": 108, + "block": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "tdef": "typedef", + "description": " The strategy to use when adding a new set of commits to a pre-existing\n commit-graph chain.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", + "comments": "

Do not split commit-graph files. The other split strategy-related option\n fields are ignored.

\n", + "value": 0 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_commit_graph_writer", + { + "decl": "git_commit_graph_writer", + "type": "struct", + "value": "git_commit_graph_writer", + "file": "git2/types.h", + "line": 112, + "lineto": 112, + "tdef": "typedef", + "description": " a writer for commit-graph files. ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_commitarray", + { + "decl": ["git_commit *const * commits", "size_t count"], + "type": "struct", + "value": "git_commitarray", + "file": "git2/commit.h", + "line": 588, + "lineto": 591, + "block": "git_commit *const * commits\nsize_t count", + "tdef": "typedef", + "description": " An array of commits returned from the library ", + "comments": "", + "fields": [ + { "type": "git_commit *const *", "name": "commits", "comments": "" }, + { "type": "size_t", "name": "count", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_commitarray_dispose", "git_repository_commit_parents"] + } + } + ], + [ + "git_config", + { + "decl": "git_config", + "type": "struct", + "value": "git_config", + "file": "git2/types.h", + "line": 157, + "lineto": 157, + "tdef": "typedef", + "description": " Memory representation of a set of config files ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_add_file_ondisk", + "git_config_backend_foreach_match", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_entry_free", + "git_config_foreach", + "git_config_foreach_cb", + "git_config_foreach_match", + "git_config_free", + "git_config_get_bool", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_mapped", + "git_config_get_multivar_foreach", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_lock", + "git_config_lookup_map_value", + "git_config_multivar_iterator_new", + "git_config_new", + "git_config_next", + "git_config_open_default", + "git_config_open_global", + "git_config_open_level", + "git_config_open_ondisk", + "git_config_set_bool", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_multivar", + "git_config_set_string", + "git_config_snapshot", + "git_repository_config", + "git_repository_config_snapshot" + ] + } + } + ], + [ + "git_config_backend", + { + "decl": "git_config_backend", + "type": "struct", + "value": "git_config_backend", + "file": "git2/types.h", + "line": 160, + "lineto": 160, + "tdef": "typedef", + "description": " Interface to access a configuration file ", + "comments": "", + "used": { "returns": [], "needs": ["git_config_backend_foreach_match"] } + } + ], + [ + "git_config_backend_memory_options", + { + "decl": [ + "unsigned int version", + "const char * backend_type", + "const char * origin_path" + ], + "type": "struct", + "value": "git_config_backend_memory_options", + "file": "git2/sys/config.h", + "line": 129, + "lineto": 143, + "block": "unsigned int version\nconst char * backend_type\nconst char * origin_path", + "tdef": "typedef", + "description": " Options for in-memory configuration backends. ", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "const char *", + "name": "backend_type", + "comments": " The type of this backend (eg, \"command line\"). If this is\n NULL, then this will be \"in-memory\"." + }, + { + "type": "const char *", + "name": "origin_path", + "comments": " The path to the origin; if this is NULL then it will be\n left unset in the resulting configuration entries." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_config_entry", + { + "decl": [ + "const char * name", + "const char * value", + "const char * backend_type", + "const char * origin_path", + "unsigned int include_depth", + "git_config_level_t level", + "void (*)(struct git_config_entry *) free" + ], + "type": "struct", + "value": "git_config_entry", + "file": "git2/config.h", + "line": 79, + "lineto": 106, + "block": "const char * name\nconst char * value\nconst char * backend_type\nconst char * origin_path\nunsigned int include_depth\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free", + "tdef": "typedef", + "description": " An entry in a configuration file", + "comments": "", + "fields": [ + { + "type": "const char *", + "name": "name", + "comments": " Name of the configuration entry (normalized) " + }, + { + "type": "const char *", + "name": "value", + "comments": " Literal (string) value of the entry " + }, + { + "type": "const char *", + "name": "backend_type", + "comments": " The type of backend that this entry exists in (eg, \"file\") " + }, + { + "type": "const char *", + "name": "origin_path", + "comments": " The path to the origin of this entry. For config files, this is\n the path to the file." + }, + { + "type": "unsigned int", + "name": "include_depth", + "comments": " Depth of includes where this variable was found " + }, + { + "type": "git_config_level_t", + "name": "level", + "comments": " Configuration level for the file this was found in " + }, + { + "type": "void (*)(struct git_config_entry *)", + "name": "free", + "comments": "" + } + ], + "used": { + "returns": [], + "needs": [ + "git_config_entry_free", + "git_config_foreach_cb", + "git_config_get_entry", + "git_config_next" + ] + } + } + ], + [ + "git_config_iterator", + { + "decl": "git_config_iterator", + "type": "struct", + "value": "git_config_iterator", + "file": "git2/config.h", + "line": 127, + "lineto": 127, + "tdef": "typedef", + "description": " An opaque structure for a configuration iterator", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_multivar_iterator_new", + "git_config_next" + ] + } + } + ], + [ + "git_config_level_t", + { + "decl": [ + "GIT_CONFIG_LEVEL_PROGRAMDATA", + "GIT_CONFIG_LEVEL_SYSTEM", + "GIT_CONFIG_LEVEL_XDG", + "GIT_CONFIG_LEVEL_GLOBAL", + "GIT_CONFIG_LEVEL_LOCAL", + "GIT_CONFIG_LEVEL_WORKTREE", + "GIT_CONFIG_LEVEL_APP", + "GIT_CONFIG_HIGHEST_LEVEL" + ], + "type": "enum", + "file": "git2/config.h", + "line": 42, + "lineto": 74, + "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_WORKTREE\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", + "tdef": "typedef", + "description": " Priority level of a config file.", + "comments": "

These priority levels correspond to the natural escalation logic (from higher to lower) when reading or searching for config entries in git.git. Meaning that for the same key, the configuration in the local configuration is preferred over the configuration in the system configuration file.

\n\n

Callers can add their own custom configuration, beginning at the GIT_CONFIG_LEVEL_APP level.

\n\n

Writes, by default, occur in the highest priority level backend that is writable. This ordering can be overridden with git_config_set_writeorder.

\n\n

git_config_open_default() and git_repository_config() honor those priority levels as well.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_PROGRAMDATA", + "comments": "

System-wide on Windows, for compatibility with portable git

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_SYSTEM", + "comments": "

System-wide configuration file; /etc/gitconfig on Linux systems

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_XDG", + "comments": "

XDG compatible configuration file; typically ~/.config/git/config

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_GLOBAL", + "comments": "

User-specific configuration file (also called Global configuration\n file); typically ~/.gitconfig

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_LOCAL", + "comments": "

Repository specific configuration file; $WORK_DIR/.git/config on\n non-bare repos

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_WORKTREE", + "comments": "

Worktree specific configuration file; $GIT_DIR/config.worktree

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_CONFIG_LEVEL_APP", + "comments": "

Application specific configuration file; freely defined by applications

\n", + "value": 7 + }, + { + "type": "int", + "name": "GIT_CONFIG_HIGHEST_LEVEL", + "comments": "

Represents the highest level available config file (i.e. the most\n specific config file available that actually is loaded)

\n", + "value": -1 + } + ], + "used": { + "returns": [], + "needs": ["git_config_add_file_ondisk", "git_config_open_level"] + } + } + ], + [ + "git_configmap", + { + "decl": [ + "git_configmap_t type", + "const char * str_match", + "int map_value" + ], + "type": "struct", + "value": "git_configmap", + "file": "git2/config.h", + "line": 142, + "lineto": 146, + "block": "git_configmap_t type\nconst char * str_match\nint map_value", + "tdef": "typedef", + "description": " Mapping from config variables to values.", + "comments": "", + "fields": [ + { "type": "git_configmap_t", "name": "type", "comments": "" }, + { "type": "const char *", "name": "str_match", "comments": "" }, + { "type": "int", "name": "map_value", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_config_get_mapped", "git_config_lookup_map_value"] + } + } + ], + [ + "git_configmap_t", + { + "decl": [ + "GIT_CONFIGMAP_FALSE", + "GIT_CONFIGMAP_TRUE", + "GIT_CONFIGMAP_INT32", + "GIT_CONFIGMAP_STRING" + ], + "type": "enum", + "file": "git2/config.h", + "line": 132, + "lineto": 137, + "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", + "tdef": "typedef", + "description": " Config var type", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_CONFIGMAP_FALSE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_TRUE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_INT32", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CONFIGMAP_STRING", + "comments": "", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential", + { + "decl": "git_credential", + "type": "struct", + "value": "git_credential", + "file": "git2/credential.h", + "line": 84, + "lineto": 84, + "tdef": "typedef", + "description": " The base structure for all credential types", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_credential_acquire_cb", + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" + ] + } + } + ], + [ + "git_credential_default", + { + "decl": "git_credential_default", + "type": "struct", + "value": "git_credential_default", + "file": "git2/credential.h", + "line": 92, + "lineto": 92, + "tdef": "typedef", + "description": " A key for NTLM/Kerberos \"default\" credentials ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_ssh_custom", + { + "decl": "git_credential_ssh_custom", + "type": "struct", + "value": "git_credential_ssh_custom", + "file": "git2/credential.h", + "line": 107, + "lineto": 107, + "tdef": "typedef", + "description": " A key with a custom signature function", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_ssh_interactive", + { + "decl": "git_credential_ssh_interactive", + "type": "struct", + "value": "git_credential_ssh_interactive", + "file": "git2/credential.h", + "line": 102, + "lineto": 102, + "tdef": "typedef", + "description": " Keyboard-interactive based ssh authentication", + "comments": "", + "used": { + "returns": [], + "needs": ["git_credential_ssh_interactive_new"] + } + } + ], + [ + "git_credential_ssh_key", + { + "decl": "git_credential_ssh_key", + "type": "struct", + "value": "git_credential_ssh_key", + "file": "git2/credential.h", + "line": 97, + "lineto": 97, + "tdef": "typedef", + "description": " A ssh key from disk", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_t", + { + "decl": [ + "GIT_CREDENTIAL_USERPASS_PLAINTEXT", + "GIT_CREDENTIAL_SSH_KEY", + "GIT_CREDENTIAL_SSH_CUSTOM", + "GIT_CREDENTIAL_DEFAULT", + "GIT_CREDENTIAL_SSH_INTERACTIVE", + "GIT_CREDENTIAL_USERNAME", + "GIT_CREDENTIAL_SSH_MEMORY" + ], + "type": "enum", + "file": "git2/credential.h", + "line": 27, + "lineto": 79, + "block": "GIT_CREDENTIAL_USERPASS_PLAINTEXT\nGIT_CREDENTIAL_SSH_KEY\nGIT_CREDENTIAL_SSH_CUSTOM\nGIT_CREDENTIAL_DEFAULT\nGIT_CREDENTIAL_SSH_INTERACTIVE\nGIT_CREDENTIAL_USERNAME\nGIT_CREDENTIAL_SSH_MEMORY", + "tdef": "typedef", + "description": " Supported credential types", + "comments": "

This represents the various types of authentication methods supported by the library.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_CREDENTIAL_USERPASS_PLAINTEXT", + "comments": "

A vanilla user/password request

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_KEY", + "comments": "

An SSH key-based authentication request

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_CUSTOM", + "comments": "

An SSH key-based authentication request, with a custom signature

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_DEFAULT", + "comments": "

An NTLM/Negotiate-based authentication request.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_INTERACTIVE", + "comments": "

An SSH interactive authentication request

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_USERNAME", + "comments": "

Username-only authentication request

\n\n

Used as a pre-authentication step if the underlying transport\n (eg. SSH, with no username in its URL) does not know which username\n to use.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_CREDENTIAL_SSH_MEMORY", + "comments": "

An SSH key-based authentication request

\n\n

Allows credentials to be read from memory instead of files.\n Note that because of differences in crypto backend support, it might\n not be functional.

\n", + "value": 64 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_username", + { + "decl": "git_credential_username", + "type": "struct", + "value": "git_credential_username", + "file": "git2/credential.h", + "line": 89, + "lineto": 89, + "tdef": "typedef", + "description": " Username-only credential information ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_credential_userpass_payload", + { + "decl": ["const char * username", "const char * password"], + "type": "struct", + "value": "git_credential_userpass_payload", + "file": "git2/credential_helpers.h", + "line": 24, + "lineto": 27, + "block": "const char * username\nconst char * password", + "tdef": "typedef", + "description": " Payload for git_credential_userpass_plaintext.", + "comments": "", + "fields": [ + { "type": "const char *", "name": "username", "comments": "" }, + { "type": "const char *", "name": "password", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_delta_t", + { + "decl": [ + "GIT_DELTA_UNMODIFIED", + "GIT_DELTA_ADDED", + "GIT_DELTA_DELETED", + "GIT_DELTA_MODIFIED", + "GIT_DELTA_RENAMED", + "GIT_DELTA_COPIED", + "GIT_DELTA_IGNORED", + "GIT_DELTA_UNTRACKED", + "GIT_DELTA_TYPECHANGE", + "GIT_DELTA_UNREADABLE", + "GIT_DELTA_CONFLICTED" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 224, + "lineto": 236, + "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", + "tdef": "typedef", + "description": " What type of change is described by a git_diff_delta?", + "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE in the option flags (otherwise type changes will be split into ADDED / DELETED pairs).

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DELTA_UNMODIFIED", + "comments": "

no changes

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DELTA_ADDED", + "comments": "

entry does not exist in old version

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DELTA_DELETED", + "comments": "

entry does not exist in new version

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DELTA_MODIFIED", + "comments": "

entry content changed between old and new

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_DELTA_RENAMED", + "comments": "

entry was renamed between old and new

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DELTA_COPIED", + "comments": "

entry was copied from another old entry

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_DELTA_IGNORED", + "comments": "

entry is ignored item in workdir

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_DELTA_UNTRACKED", + "comments": "

entry is untracked item in workdir

\n", + "value": 7 + }, + { + "type": "int", + "name": "GIT_DELTA_TYPECHANGE", + "comments": "

type of entry changed between old and new

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DELTA_UNREADABLE", + "comments": "

entry is unreadable

\n", + "value": 9 + }, + { + "type": "int", + "name": "GIT_DELTA_CONFLICTED", + "comments": "

entry in the index is conflicted

\n", + "value": 10 + } + ], + "used": { + "returns": [], + "needs": ["git_diff_num_deltas_of_type", "git_diff_status_char"] + } + } + ], + [ + "git_describe_format_options", + { + "decl": [ + "unsigned int version", + "unsigned int abbreviated_size", + "int always_use_long_format", + "const char * dirty_suffix" + ], + "type": "struct", + "value": "git_describe_format_options", + "file": "git2/describe.h", + "line": 91, + "lineto": 111, + "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", + "tdef": "typedef", + "description": " Describe format options structure", + "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "abbreviated_size", + "comments": " Size of the abbreviated commit id to use. This value is the\n lower bound for the length of the abbreviated string. The\n default is 7." + }, + { + "type": "int", + "name": "always_use_long_format", + "comments": " Set to use the long format even when a shorter name could be used." + }, + { + "type": "const char *", + "name": "dirty_suffix", + "comments": " If the workdir is dirty and this is set, this string will\n be appended to the description string." + } + ], + "used": { + "returns": [], + "needs": ["git_describe_format", "git_describe_format_options_init"] + } + } + ], + [ + "git_describe_options", + { + "decl": [ + "unsigned int version", + "unsigned int max_candidates_tags", + "unsigned int describe_strategy", + "const char * pattern", + "int only_follow_first_parent", + "int show_commit_oid_as_fallback" + ], + "type": "struct", + "value": "git_describe_options", + "file": "git2/describe.h", + "line": 43, + "lineto": 61, + "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", + "tdef": "typedef", + "description": " Describe options structure", + "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can use git_describe_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "max_candidates_tags", + "comments": " default: 10 " + }, + { + "type": "unsigned int", + "name": "describe_strategy", + "comments": " default: GIT_DESCRIBE_DEFAULT " + }, + { "type": "const char *", "name": "pattern", "comments": "" }, + { + "type": "int", + "name": "only_follow_first_parent", + "comments": " When calculating the distance from the matching tag or\n reference, only walk down the first-parent ancestry." + }, + { + "type": "int", + "name": "show_commit_oid_as_fallback", + "comments": " If no matching tag or reference is found, the describe\n operation would normally fail. If this option is set, it\n will instead fall back to showing the full id of the\n commit." + } + ], + "used": { + "returns": [], + "needs": [ + "git_describe_commit", + "git_describe_options_init", + "git_describe_workdir" + ] + } + } + ], + [ + "git_describe_result", + { + "decl": "git_describe_result", + "type": "struct", + "value": "git_describe_result", + "file": "git2/describe.h", + "line": 134, + "lineto": 134, + "tdef": "typedef", + "description": " A struct that stores the result of a describe operation.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_describe_commit", + "git_describe_format", + "git_describe_result_free", + "git_describe_workdir" + ] + } + } + ], + [ + "git_describe_strategy_t", + { + "decl": [ + "GIT_DESCRIBE_DEFAULT", + "GIT_DESCRIBE_TAGS", + "GIT_DESCRIBE_ALL" + ], + "type": "enum", + "file": "git2/describe.h", + "line": 30, + "lineto": 34, + "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", + "tdef": "typedef", + "description": " Reference lookup strategy", + "comments": "

These behave like the --tags and --all options to git-describe, namely they say to look for any reference in either refs/tags/ or refs/ respectively.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DESCRIBE_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DESCRIBE_TAGS", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DESCRIBE_ALL", + "comments": "", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff", + { + "decl": "git_diff", + "type": "struct", + "value": "git_diff", + "file": "git2/diff.h", + "line": 196, + "lineto": 196, + "tdef": "typedef", + "description": " The diff object that contains all individual file deltas.", + "comments": "

A diff represents the cumulative list of differences between two snapshots of a repository (possibly filtered by a set of file name patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of diffs then traversing it. This makes is easier to share logic across the various types of diffs (tree vs tree, workdir vs index, etc.), and also allows you to insert optional diff post-processing phases, such as rename detection, in between the steps. When you are done with a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", + "used": { + "returns": [ + "git_diff_get_delta", + "git_patch_get_delta", + "git_pathspec_match_list_diff_entry" + ], + "needs": [ + "git_apply", + "git_apply_delta_cb", + "git_apply_hunk_cb", + "git_apply_to_tree", + "git_checkout_notify_cb", + "git_diff_binary_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_file_cb", + "git_diff_find_options_init", + "git_diff_find_similar", + "git_diff_foreach", + "git_diff_format_email", + "git_diff_format_email_options_init", + "git_diff_free", + "git_diff_from_buffer", + "git_diff_get_delta", + "git_diff_get_stats", + "git_diff_hunk_cb", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_is_sorted_icase", + "git_diff_line_cb", + "git_diff_merge", + "git_diff_notify_cb", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_options_init", + "git_diff_patchid", + "git_diff_patchid_options_init", + "git_diff_print", + "git_diff_progress_cb", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf", + "git_diff_to_buf", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_email_create_from_diff", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_print", + "git_pathspec_match_diff" + ] + } + } + ], + [ + "git_diff_binary", + { + "decl": [ + "unsigned int contains_data", + "git_diff_binary_file old_file", + "git_diff_binary_file new_file" + ], + "type": "struct", + "value": "git_diff_binary", + "file": "git2/diff.h", + "line": 544, + "lineto": 556, + "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", + "tdef": "typedef", + "description": " Structure describing the binary contents of a diff.", + "comments": "

A binary file / delta is a file (or pair) for which no text diffs should be generated. A diff can contain delta entries that are binary, but no diff content will be output for those files. There is a base heuristic for binary detection and you can further tune the behavior with git attributes or diff flags and option settings.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "contains_data", + "comments": " Whether there is data in this binary structure or not.\n\n If this is `1`, then this was produced and included binary content.\n If this is `0` then this was generated knowing only that a binary\n file changed but without providing the data, probably from a patch\n that said `Binary files a/file.txt and b/file.txt differ`." + }, + { + "type": "git_diff_binary_file", + "name": "old_file", + "comments": " The contents of the old file. " + }, + { + "type": "git_diff_binary_file", + "name": "new_file", + "comments": " The contents of the new file. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_binary_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach" + ] + } + } + ], + [ + "git_diff_binary_file", + { + "decl": [ + "git_diff_binary_t type", + "const char * data", + "size_t datalen", + "size_t inflatedlen" + ], + "type": "struct", + "value": "git_diff_binary_file", + "file": "git2/diff.h", + "line": 521, + "lineto": 533, + "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", + "tdef": "typedef", + "description": " The contents of one of the files in a binary diff. ", + "comments": "", + "fields": [ + { + "type": "git_diff_binary_t", + "name": "type", + "comments": " The type of binary data for this file. " + }, + { + "type": "const char *", + "name": "data", + "comments": " The binary data, deflated. " + }, + { + "type": "size_t", + "name": "datalen", + "comments": " The length of the binary data. " + }, + { + "type": "size_t", + "name": "inflatedlen", + "comments": " The length of the binary data after inflation. " + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_binary_t", + { + "decl": [ + "GIT_DIFF_BINARY_NONE", + "GIT_DIFF_BINARY_LITERAL", + "GIT_DIFF_BINARY_DELTA" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 509, + "lineto": 518, + "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", + "tdef": "typedef", + "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_BINARY_NONE", + "comments": "

There is no binary delta.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_BINARY_LITERAL", + "comments": "

The binary data is the literal contents of the file.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_BINARY_DELTA", + "comments": "

The binary data is the delta from one side to the other.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_delta", + { + "decl": [ + "git_delta_t status", + "uint32_t flags", + "uint16_t similarity", + "uint16_t nfiles", + "git_diff_file old_file", + "git_diff_file new_file" + ], + "type": "struct", + "value": "git_diff_delta", + "file": "git2/diff.h", + "line": 324, + "lineto": 331, + "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", + "tdef": "typedef", + "description": " Description of changes to one entry.", + "comments": "

A delta is a file pair with an old and new revision. The old version may be absent if the file was just created and the new version may be absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file represents to "to" side of the diff. What those means depend on the function that was used to generate the diff and will be documented below. You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file", they actually may correspond to entries that represent a file, a symbolic link, a submodule commit id, or even a tree (if you are tracking type changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will be filled in, but we generally try to fill in as much as possible. One example is that the "flags" field may not have either the BINARY or the NOT_BINARY flag set to avoid examining file contents if you do not pass in hunk and/or line callbacks to the diff foreach iteration function. It will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar() which does a similarity analysis of files in the diff. Use that function to do rename and copy detection, and to split heavily modified files in add/delete pairs. After that call, deltas with a status of GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to break, but to not actually break the records, then GIT_DELTA_MODIFIED records may have a non-zero similarity score if the self-similarity is below the split threshold. To display this value like core Git, invert the score (a la printf("M%03d", 100 - delta->similarity)).

\n", + "fields": [ + { "type": "git_delta_t", "name": "status", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " git_diff_flag_t values " + }, + { + "type": "uint16_t", + "name": "similarity", + "comments": " for RENAMED and COPIED, value 0-100 " + }, + { + "type": "uint16_t", + "name": "nfiles", + "comments": " number of files in this delta " + }, + { "type": "git_diff_file", "name": "old_file", "comments": "" }, + { "type": "git_diff_file", "name": "new_file", "comments": "" } + ], + "used": { + "returns": [ + "git_diff_get_delta", + "git_patch_get_delta", + "git_pathspec_match_list_diff_entry" + ], + "needs": [ + "git_apply_delta_cb", + "git_diff_binary_cb", + "git_diff_file_cb", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_diff_notify_cb" + ] + } + } + ], + [ + "git_diff_file", + { + "decl": [ + "git_oid id", + "const char * path", + "git_object_size_t size", + "uint32_t flags", + "uint16_t mode", + "uint16_t id_abbrev" + ], + "type": "struct", + "value": "git_diff_file", + "file": "git2/diff.h", + "line": 245, + "lineto": 282, + "block": "git_oid id\nconst char * path\ngit_object_size_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", + "tdef": "typedef", + "description": " Description of one side of a delta.", + "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n", + "fields": [ + { + "type": "git_oid", + "name": "id", + "comments": " The `git_oid` of the item. If the entry represents an\n absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta),\n then the oid will be zeroes." + }, + { + "type": "const char *", + "name": "path", + "comments": " The NUL-terminated path to the entry relative to the working\n directory of the repository." + }, + { + "type": "git_object_size_t", + "name": "size", + "comments": " The size of the entry in bytes." + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of the `git_diff_flag_t` types" + }, + { + "type": "uint16_t", + "name": "mode", + "comments": " Roughly, the stat() `st_mode` value for the item. This will\n be restricted to one of the `git_filemode_t` values." + }, + { + "type": "uint16_t", + "name": "id_abbrev", + "comments": " Represents the known length of the `id` field, when\n converted to a hex string. It is generally `GIT_OID_SHA1_HEXSIZE`, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters." + } + ], + "used": { + "returns": [], + "needs": [ + "git_checkout_notify_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach" + ] + } + } + ], + [ + "git_diff_find_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint16_t rename_threshold", + "uint16_t rename_from_rewrite_threshold", + "uint16_t copy_threshold", + "uint16_t break_rewrite_threshold", + "size_t rename_limit", + "git_diff_similarity_metric * metric" + ], + "type": "struct", + "value": "git_diff_find_options", + "file": "git2/diff.h", + "line": 749, + "lineto": 803, + "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", + "tdef": "typedef", + "description": " Control behavior of rename and copy detection", + "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing." + }, + { + "type": "uint16_t", + "name": "rename_threshold", + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "rename_from_rewrite_threshold", + "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "copy_threshold", + "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." + }, + { + "type": "uint16_t", + "name": "break_rewrite_threshold", + "comments": " Threshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." + }, + { + "type": "size_t", + "name": "rename_limit", + "comments": " Maximum number of matches to consider for a particular file.\n\n This is a little different from the `-l` option from Git because we\n will still process up to this many matches before abandoning the search.\n Defaults to 1000." + }, + { + "type": "git_diff_similarity_metric *", + "name": "metric", + "comments": " The `metric` option allows you to plug in a custom similarity metric.\n\n Set it to NULL to use the default internal metric.\n\n The default metric is based on sampling hashes of ranges of data in\n the file, which is a pretty good similarity approximation that should\n work fairly well for both text and binary data while still being\n pretty fast with a fixed memory overhead." + } + ], + "used": { + "returns": [], + "needs": ["git_diff_find_options_init", "git_diff_find_similar"] + } + } + ], + [ + "git_diff_find_t", + { + "decl": [ + "GIT_DIFF_FIND_BY_CONFIG", + "GIT_DIFF_FIND_RENAMES", + "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", + "GIT_DIFF_FIND_COPIES", + "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", + "GIT_DIFF_FIND_REWRITES", + "GIT_DIFF_BREAK_REWRITES", + "GIT_DIFF_FIND_AND_BREAK_REWRITES", + "GIT_DIFF_FIND_FOR_UNTRACKED", + "GIT_DIFF_FIND_ALL", + "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", + "GIT_DIFF_FIND_IGNORE_WHITESPACE", + "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", + "GIT_DIFF_FIND_EXACT_MATCH_ONLY", + "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", + "GIT_DIFF_FIND_REMOVE_UNMODIFIED" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 658, + "lineto": 727, + "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", + "tdef": "typedef", + "description": " Flags to control the behavior of diff rename/copy detection.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FIND_BY_CONFIG", + "comments": "

Obey diff.renames. Overridden by any other GIT_DIFF_FIND_... flag.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_RENAMES", + "comments": "

Look for renames? (--find-renames)

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", + "comments": "

Consider old side of MODIFIED for renames? (--break-rewrites=N)

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_COPIES", + "comments": "

Look for copies? (a la --find-copies).

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", + "comments": "

Consider UNMODIFIED as copy sources? (--find-copies-harder).

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNMODIFIED when\n the initial git_diff is being generated.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_REWRITES", + "comments": "

Mark significant rewrites for split (--break-rewrites=/M)

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_DIFF_BREAK_REWRITES", + "comments": "

Actually split large rewrites into delete/add pairs

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_AND_BREAK_REWRITES", + "comments": "

Mark rewrites for split and break into delete/add pairs

\n", + "value": 48 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_FOR_UNTRACKED", + "comments": "

Find renames/copies for UNTRACKED items in working directory.

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNTRACKED when the\n initial git_diff is being generated (and obviously the diff must\n be against the working directory for this to make sense).

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_ALL", + "comments": "

Turn on all finding features.

\n", + "value": 255 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", + "comments": "

Measure similarity ignoring leading whitespace (default)

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_IGNORE_WHITESPACE", + "comments": "

Measure similarity ignoring all whitespace

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", + "comments": "

Measure similarity including all data

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_EXACT_MATCH_ONLY", + "comments": "

Measure similarity only by comparing SHAs (fast and cheap)

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", + "comments": "

Do not break rewrites unless they contribute to a rename.

\n\n

Normally, GIT_DIFF_FIND_AND_BREAK_REWRITES will measure the self-\n similarity of modified files and split the ones that have changed a\n lot into a DELETE / ADD pair. Then the sides of that pair will be\n considered candidates for rename and copy detection.

\n\n

If you add this flag in and the split pair is not used for an\n actual rename or copy, then the modified record will be restored to\n a regular MODIFIED record instead of being split.

\n", + "value": 32768 + }, + { + "type": "int", + "name": "GIT_DIFF_FIND_REMOVE_UNMODIFIED", + "comments": "

Remove any UNMODIFIED deltas after find_similar is done.

\n\n

Using GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED to emulate the\n --find-copies-harder behavior requires building a diff with the\n GIT_DIFF_INCLUDE_UNMODIFIED flag. If you do not want UNMODIFIED\n records in the final result, pass this flag to have them removed.

\n", + "value": 65536 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_flag_t", + { + "decl": [ + "GIT_DIFF_FLAG_BINARY", + "GIT_DIFF_FLAG_NOT_BINARY", + "GIT_DIFF_FLAG_VALID_ID", + "GIT_DIFF_FLAG_EXISTS", + "GIT_DIFF_FLAG_VALID_SIZE" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 206, + "lineto": 212, + "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS\nGIT_DIFF_FLAG_VALID_SIZE", + "tdef": "typedef", + "description": " Flags for the delta object and the file objects on each side.", + "comments": "

These flags are used for both the flags value of the git_diff_delta and the flags for the git_diff_file objects representing the old and new sides of the delta. Values outside of this public range should be considered reserved for internal or future use.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FLAG_BINARY", + "comments": "

file(s) treated as binary data

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_NOT_BINARY", + "comments": "

file(s) treated as text data

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_VALID_ID", + "comments": "

id value is known correct

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_EXISTS", + "comments": "

file exists at this side of the delta

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_FLAG_VALID_SIZE", + "comments": "

file size value is known correct

\n", + "value": 16 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_format_email_flags_t", + { + "decl": [ + "GIT_DIFF_FORMAT_EMAIL_NONE", + "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER" + ], + "type": "enum", + "file": "git2/deprecated.h", + "line": 311, + "lineto": 318, + "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", + "tdef": "typedef", + "description": " Formatting options for diff e-mail generation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FORMAT_EMAIL_NONE", + "comments": "

Normal patch, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", + "comments": "

Don't insert "[PATCH]" in the subject header

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_format_email_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "size_t patch_no", + "size_t total_patches", + "const git_oid * id", + "const char * summary", + "const char * body", + "const git_signature * author" + ], + "type": "struct", + "value": "git_diff_format_email_options", + "file": "git2/deprecated.h", + "line": 323, + "lineto": 346, + "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", + "tdef": "typedef", + "description": " Options for controlling the formatting of the generated e-mail.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_diff_format_email_flags_t` above " + }, + { + "type": "size_t", + "name": "patch_no", + "comments": " This patch number " + }, + { + "type": "size_t", + "name": "total_patches", + "comments": " Total number of patches in this series " + }, + { + "type": "const git_oid *", + "name": "id", + "comments": " id to use for the commit " + }, + { + "type": "const char *", + "name": "summary", + "comments": " Summary of the change " + }, + { + "type": "const char *", + "name": "body", + "comments": " Commit message's body " + }, + { + "type": "const git_signature *", + "name": "author", + "comments": " Author of the change " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_format_email", + "git_diff_format_email_options_init" + ] + } + } + ], + [ + "git_diff_format_t", + { + "decl": [ + "GIT_DIFF_FORMAT_PATCH", + "GIT_DIFF_FORMAT_PATCH_HEADER", + "GIT_DIFF_FORMAT_RAW", + "GIT_DIFF_FORMAT_NAME_ONLY", + "GIT_DIFF_FORMAT_NAME_STATUS", + "GIT_DIFF_FORMAT_PATCH_ID" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 1128, + "lineto": 1135, + "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", + "tdef": "typedef", + "description": " Possible output formats for diff data", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH", + "comments": "

full git diff

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH_HEADER", + "comments": "

just the file headers of patch

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_RAW", + "comments": "

like git diff --raw

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_NAME_ONLY", + "comments": "

like git diff --name-only

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_NAME_STATUS", + "comments": "

like git diff --name-status

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_DIFF_FORMAT_PATCH_ID", + "comments": "

git diff as used by git patch-id

\n", + "value": 6 + } + ], + "used": { + "returns": [], + "needs": ["git_diff_print", "git_diff_to_buf"] + } + } + ], + [ + "git_diff_hunk", + { + "decl": [ + "int old_start", + "int old_lines", + "int new_start", + "int new_lines", + "size_t header_len", + "char [128] header" + ], + "type": "struct", + "value": "git_diff_hunk", + "file": "git2/diff.h", + "line": 576, + "lineto": 583, + "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", + "tdef": "typedef", + "description": " Structure describing a hunk of a diff.", + "comments": "

A hunk is a span of modified lines in a delta along with some stable surrounding context. You can configure the amount of context and other properties of how hunks are generated. Each hunk also comes with a header that described where it starts and ends in both the old and new versions in the delta.

\n", + "fields": [ + { + "type": "int", + "name": "old_start", + "comments": " Starting line number in old_file " + }, + { + "type": "int", + "name": "old_lines", + "comments": " Number of lines in old_file " + }, + { + "type": "int", + "name": "new_start", + "comments": " Starting line number in new_file " + }, + { + "type": "int", + "name": "new_lines", + "comments": " Number of lines in new_file " + }, + { + "type": "size_t", + "name": "header_len", + "comments": " Number of bytes in header text " + }, + { + "type": "char [128]", + "name": "header", + "comments": " Header text, NUL-byte terminated " + } + ], + "used": { + "returns": [], + "needs": [ + "git_apply_hunk_cb", + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach", + "git_diff_hunk_cb", + "git_diff_line_cb", + "git_patch_get_hunk" + ] + } + } + ], + [ + "git_diff_line", + { + "decl": [ + "char origin", + "int old_lineno", + "int new_lineno", + "int num_lines", + "size_t content_len", + "git_off_t content_offset", + "const char * content" + ], + "type": "struct", + "value": "git_diff_line", + "file": "git2/diff.h", + "line": 631, + "lineto": 639, + "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", + "tdef": "typedef", + "description": " Structure describing a line (or data span) of a diff.", + "comments": "

A line is a range of characters inside a hunk. It could be a context line (i.e. in both old and new versions), an added line (i.e. only in the new version), or a removed line (i.e. only in the old version). Unfortunately, we don't know anything about the encoding of data in the file being diffed, so we cannot tell you much about the line content. Line data will not be NUL-byte terminated, however, because it will be just a span of bytes inside the larger file.

\n", + "fields": [ + { + "type": "char", + "name": "origin", + "comments": " A git_diff_line_t value " + }, + { + "type": "int", + "name": "old_lineno", + "comments": " Line number in old file or -1 for added line " + }, + { + "type": "int", + "name": "new_lineno", + "comments": " Line number in new file or -1 for deleted line " + }, + { + "type": "int", + "name": "num_lines", + "comments": " Number of newline characters in content " + }, + { + "type": "size_t", + "name": "content_len", + "comments": " Number of bytes of data " + }, + { + "type": "git_off_t", + "name": "content_offset", + "comments": " Offset in the original file to the content " + }, + { + "type": "const char *", + "name": "content", + "comments": " Pointer to diff text, not NUL-byte terminated " + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_foreach", + "git_diff_line_cb", + "git_diff_print", + "git_patch_get_line_in_hunk", + "git_patch_print" + ] + } + } + ], + [ + "git_diff_line_t", + { + "decl": [ + "GIT_DIFF_LINE_CONTEXT", + "GIT_DIFF_LINE_ADDITION", + "GIT_DIFF_LINE_DELETION", + "GIT_DIFF_LINE_CONTEXT_EOFNL", + "GIT_DIFF_LINE_ADD_EOFNL", + "GIT_DIFF_LINE_DEL_EOFNL", + "GIT_DIFF_LINE_FILE_HDR", + "GIT_DIFF_LINE_HUNK_HDR", + "GIT_DIFF_LINE_BINARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 602, + "lineto": 618, + "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", + "tdef": "typedef", + "description": " Line origin constants.", + "comments": "

These values describe where a line came from and will be passed to the git_diff_line_cb when iterating over a diff. There are some special origin constants at the end that are used for the text output callbacks to demarcate lines that are actually part of the file or hunk headers.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_LINE_CONTEXT", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_ADDITION", + "comments": "", + "value": 43 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_DELETION", + "comments": "", + "value": 45 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_CONTEXT_EOFNL", + "comments": "

Both files have no LF at end

\n", + "value": 61 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_ADD_EOFNL", + "comments": "

Old has no LF at end, new does

\n", + "value": 62 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_DEL_EOFNL", + "comments": "

Old has LF at end, new does not

\n", + "value": 60 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_FILE_HDR", + "comments": "", + "value": 70 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_HUNK_HDR", + "comments": "", + "value": 72 + }, + { + "type": "int", + "name": "GIT_DIFF_LINE_BINARY", + "comments": "

For "Binary files x and y differ"

\n", + "value": 66 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_option_t", + { + "decl": [ + "GIT_DIFF_NORMAL", + "GIT_DIFF_REVERSE", + "GIT_DIFF_INCLUDE_IGNORED", + "GIT_DIFF_RECURSE_IGNORED_DIRS", + "GIT_DIFF_INCLUDE_UNTRACKED", + "GIT_DIFF_RECURSE_UNTRACKED_DIRS", + "GIT_DIFF_INCLUDE_UNMODIFIED", + "GIT_DIFF_INCLUDE_TYPECHANGE", + "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", + "GIT_DIFF_IGNORE_FILEMODE", + "GIT_DIFF_IGNORE_SUBMODULES", + "GIT_DIFF_IGNORE_CASE", + "GIT_DIFF_INCLUDE_CASECHANGE", + "GIT_DIFF_DISABLE_PATHSPEC_MATCH", + "GIT_DIFF_SKIP_BINARY_CHECK", + "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", + "GIT_DIFF_UPDATE_INDEX", + "GIT_DIFF_INCLUDE_UNREADABLE", + "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", + "GIT_DIFF_INDENT_HEURISTIC", + "GIT_DIFF_IGNORE_BLANK_LINES", + "GIT_DIFF_FORCE_TEXT", + "GIT_DIFF_FORCE_BINARY", + "GIT_DIFF_IGNORE_WHITESPACE", + "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", + "GIT_DIFF_IGNORE_WHITESPACE_EOL", + "GIT_DIFF_SHOW_UNTRACKED_CONTENT", + "GIT_DIFF_SHOW_UNMODIFIED", + "GIT_DIFF_PATIENCE", + "GIT_DIFF_MINIMAL", + "GIT_DIFF_SHOW_BINARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 28, + "lineto": 174, + "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_IGNORE_BLANK_LINES\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", + "tdef": "typedef", + "description": " Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_NORMAL", + "comments": "

Normal diff, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_REVERSE", + "comments": "

Reverse the sides of the diff

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_IGNORED", + "comments": "

Include ignored files in the diff

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_RECURSE_IGNORED_DIRS", + "comments": "

Even with GIT_DIFF_INCLUDE_IGNORED, an entire ignored directory\n will be marked with only a single entry in the diff; this flag\n adds all files under the directory as IGNORED entries, too.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNTRACKED", + "comments": "

Include untracked files in the diff

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_DIFF_RECURSE_UNTRACKED_DIRS", + "comments": "

Even with GIT_DIFF_INCLUDE_UNTRACKED, an entire untracked\n directory will be marked with only a single entry in the diff\n (a la what core Git does in git status); this flag adds all\n files under untracked directories as UNTRACKED entries, too.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNMODIFIED", + "comments": "

Include unmodified files in the diff

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_TYPECHANGE", + "comments": "

Normally, a type change between files will be converted into a\n DELETED record for the old and an ADDED record for the new; this\n options enabled the generation of TYPECHANGE delta records.

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", + "comments": "

Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still\n generally show as a DELETED blob. This flag tries to correctly\n label blob->tree transitions as TYPECHANGE records with new_file's\n mode set to tree. Note: the tree SHA will not be available.

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_FILEMODE", + "comments": "

Ignore file mode changes

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_SUBMODULES", + "comments": "

Treat all submodules as unmodified

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_CASE", + "comments": "

Use case insensitive filename comparisons

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_CASECHANGE", + "comments": "

May be combined with GIT_DIFF_IGNORE_CASE to specify that a file\n that has changed case will be returned as an add/delete pair.

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_DIFF_DISABLE_PATHSPEC_MATCH", + "comments": "

If the pathspec is set in the diff options, this flags indicates\n that the paths will be treated as literal paths instead of\n fnmatch patterns. Each path in the list must either be a full\n path to a file or a directory. (A trailing slash indicates that\n the path will only match a directory). If a directory is\n specified, all children will be included.

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_DIFF_SKIP_BINARY_CHECK", + "comments": "

Disable updating of the binary flag in delta records. This is\n useful when iterating over a diff if you don't need hunk and data\n callbacks and want to avoid having to load file completely.

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", + "comments": "

When diff finds an untracked directory, to match the behavior of\n core Git, it scans the contents for IGNORED and UNTRACKED files.\n If all contents are IGNORED, then the directory is IGNORED; if\n any contents are not IGNORED, then the directory is UNTRACKED.\n This is extra work that may not matter in many cases. This flag\n turns off that scan and immediately labels an untracked directory\n as UNTRACKED (changing the behavior to not match core Git).

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_DIFF_UPDATE_INDEX", + "comments": "

When diff finds a file in the working directory with stat\n information different from the index, but the OID ends up being the\n same, write the correct stat information into the index. Note:\n without this flag, diff will always leave the index untouched.

\n", + "value": 32768 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNREADABLE", + "comments": "

Include unreadable files in the diff

\n", + "value": 65536 + }, + { + "type": "int", + "name": "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", + "comments": "

Include unreadable files in the diff

\n", + "value": 131072 + }, + { + "type": "int", + "name": "GIT_DIFF_INDENT_HEURISTIC", + "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", + "value": 262144 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_BLANK_LINES", + "comments": "

Ignore blank lines

\n", + "value": 524288 + }, + { + "type": "int", + "name": "GIT_DIFF_FORCE_TEXT", + "comments": "

Treat all files as text, disabling binary attributes \n&\n detection

\n", + "value": 1048576 + }, + { + "type": "int", + "name": "GIT_DIFF_FORCE_BINARY", + "comments": "

Treat all files as binary, disabling text diffs

\n", + "value": 2097152 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE", + "comments": "

Ignore all whitespace

\n", + "value": 4194304 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", + "comments": "

Ignore changes in amount of whitespace

\n", + "value": 8388608 + }, + { + "type": "int", + "name": "GIT_DIFF_IGNORE_WHITESPACE_EOL", + "comments": "

Ignore whitespace at end of line

\n", + "value": 16777216 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_UNTRACKED_CONTENT", + "comments": "

When generating patch text, include the content of untracked\n files. This automatically turns on GIT_DIFF_INCLUDE_UNTRACKED but\n it does not turn on GIT_DIFF_RECURSE_UNTRACKED_DIRS. Add that\n flag if you want the content of every single UNTRACKED file.

\n", + "value": 33554432 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_UNMODIFIED", + "comments": "

When generating output, include the names of unmodified files if\n they are included in the git_diff. Normally these are skipped in\n the formats that list files (e.g. name-only, name-status, raw).\n Even with this, these will not be included in patch format.

\n", + "value": 67108864 + }, + { + "type": "int", + "name": "GIT_DIFF_PATIENCE", + "comments": "

Use the "patience diff" algorithm

\n", + "value": 268435456 + }, + { + "type": "int", + "name": "GIT_DIFF_MINIMAL", + "comments": "

Take extra time to find minimal diff

\n", + "value": 536870912 + }, + { + "type": "int", + "name": "GIT_DIFF_SHOW_BINARY", + "comments": "

Include the necessary deflate / delta information so that git-apply\n can apply given diff information to binary files.

\n", + "value": 1073741824 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_submodule_ignore_t ignore_submodules", + "git_strarray pathspec", + "git_diff_notify_cb notify_cb", + "git_diff_progress_cb progress_cb", + "void * payload", + "uint32_t context_lines", + "uint32_t interhunk_lines", + "git_oid_t oid_type", + "uint16_t id_abbrev", + "git_off_t max_size", + "const char * old_prefix", + "const char * new_prefix" + ], + "type": "struct", + "value": "git_diff_options", + "file": "git2/diff.h", + "line": 376, + "lineto": 464, + "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\ngit_oid_t oid_type\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", + "tdef": "typedef", + "description": " Structure describing options about how the diff should be executed.", + "comments": "

Setting all values of the structure to zero will yield the default values. Similarly, passing NULL for the options structure will give the defaults. The default values are marked below.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" + }, + { + "type": "git_submodule_ignore_t", + "name": "ignore_submodules", + "comments": " Overrides the submodule ignore setting for all submodules in the diff. " + }, + { + "type": "git_strarray", + "name": "pathspec", + "comments": " An array of paths / fnmatch patterns to constrain diff.\n All paths are included by default." + }, + { + "type": "git_diff_notify_cb", + "name": "notify_cb", + "comments": " An optional callback function, notifying the consumer of changes to\n the diff as new deltas are added." + }, + { + "type": "git_diff_progress_cb", + "name": "progress_cb", + "comments": " An optional callback function, notifying the consumer of which files\n are being examined as the diff is generated." + }, + { + "type": "void *", + "name": "payload", + "comments": " The payload to pass to the callback functions. " + }, + { + "type": "uint32_t", + "name": "context_lines", + "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." + }, + { + "type": "uint32_t", + "name": "interhunk_lines", + "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " The object ID type to emit in diffs; this is used by functions\n that operate without a repository - namely `git_diff_buffers`,\n or `git_diff_blobs` and `git_diff_blob_to_buffer` when one blob\n is `NULL`.\n\n This may be omitted (set to `0`). If a repository is available,\n the object ID format of the repository will be used. If no\n repository is available then the default is `GIT_OID_SHA`.\n\n If this is specified and a repository is available, then the\n specified `oid_type` must match the repository's object ID\n format." + }, + { + "type": "uint16_t", + "name": "id_abbrev", + "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." + }, + { + "type": "git_off_t", + "name": "max_size", + "comments": " A size (in bytes) above which a blob will be marked as binary\n automatically; pass a negative value to disable.\n Defaults to 512MB." + }, + { + "type": "const char *", + "name": "old_prefix", + "comments": " The virtual \"directory\" prefix for old file names in hunk headers.\n Default is \"a\"." + }, + { + "type": "const char *", + "name": "new_prefix", + "comments": " The virtual \"directory\" prefix for new file names in hunk headers.\n Defaults to \"b\"." + } + ], + "used": { + "returns": [], + "needs": [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_options_init", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers" + ] + } + } + ], + [ + "git_diff_parse_options", + { + "decl": ["unsigned int version", "git_oid_t oid_type"], + "type": "struct", + "value": "git_diff_parse_options", + "file": "git2/diff.h", + "line": 1294, + "lineto": 1297, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for parsing a diff / patch file.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { "type": "git_oid_t", "name": "oid_type", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_patchid_options", + { + "decl": ["unsigned int version"], + "type": "struct", + "value": "git_diff_patchid_options", + "file": "git2/diff.h", + "line": 1431, + "lineto": 1433, + "block": "unsigned int version", + "tdef": "typedef", + "description": " Patch ID options structure", + "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_diff_patchid", "git_diff_patchid_options_init"] + } + } + ], + [ + "git_diff_similarity_metric", + { + "decl": [ + "int (*)(void **, const git_diff_file *, const char *, void *) file_signature", + "int (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature", + "void (*)(void *, void *) free_signature", + "int (*)(int *, void *, void *, void *) similarity", + "void * payload" + ], + "type": "struct", + "value": "git_diff_similarity_metric", + "file": "git2/diff.h", + "line": 732, + "lineto": 742, + "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", + "tdef": "typedef", + "description": " Pluggable similarity metric", + "comments": "", + "fields": [ + { + "type": "int (*)(void **, const git_diff_file *, const char *, void *)", + "name": "file_signature", + "comments": "" + }, + { + "type": "int (*)(void **, const git_diff_file *, const char *, size_t, void *)", + "name": "buffer_signature", + "comments": "" + }, + { + "type": "void (*)(void *, void *)", + "name": "free_signature", + "comments": "" + }, + { + "type": "int (*)(int *, void *, void *, void *)", + "name": "similarity", + "comments": "" + }, + { "type": "void *", "name": "payload", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_diff_stats", + { + "decl": "git_diff_stats", + "type": "struct", + "value": "git_diff_stats", + "file": "git2/diff.h", + "line": 1341, + "lineto": 1341, + "tdef": "typedef", + "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_diff_get_stats", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf" + ] + } + } + ], + [ + "git_diff_stats_format_t", + { + "decl": [ + "GIT_DIFF_STATS_NONE", + "GIT_DIFF_STATS_FULL", + "GIT_DIFF_STATS_SHORT", + "GIT_DIFF_STATS_NUMBER", + "GIT_DIFF_STATS_INCLUDE_SUMMARY" + ], + "type": "enum", + "file": "git2/diff.h", + "line": 1346, + "lineto": 1361, + "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", + "tdef": "typedef", + "description": " Formatting options for diff stats", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_DIFF_STATS_NONE", + "comments": "

No stats

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_FULL", + "comments": "

Full statistics, equivalent of --stat

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_SHORT", + "comments": "

Short statistics, equivalent of --shortstat

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_NUMBER", + "comments": "

Number statistics, equivalent of --numstat

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_DIFF_STATS_INCLUDE_SUMMARY", + "comments": "

Extended header information such as creations, renames and mode changes, equivalent of --summary

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": ["git_diff_stats_to_buf"] } + } + ], + [ + "git_direction", + { + "decl": ["GIT_DIRECTION_FETCH", "GIT_DIRECTION_PUSH"], + "type": "enum", + "file": "git2/net.h", + "line": 31, + "lineto": 34, + "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", + "tdef": "typedef", + "description": " Direction of the connection.", + "comments": "

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.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_DIRECTION_FETCH", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_DIRECTION_PUSH", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": ["git_refspec_direction"], + "needs": ["git_remote_connect", "git_remote_connect_ext"] + } + } + ], + [ + "git_email_create_flags_t", + { + "decl": [ + "GIT_EMAIL_CREATE_DEFAULT", + "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "GIT_EMAIL_CREATE_NO_RENAMES" + ], + "type": "enum", + "file": "git2/email.h", + "line": 24, + "lineto": 39, + "block": "GIT_EMAIL_CREATE_DEFAULT\nGIT_EMAIL_CREATE_OMIT_NUMBERS\nGIT_EMAIL_CREATE_ALWAYS_NUMBER\nGIT_EMAIL_CREATE_NO_RENAMES", + "tdef": "typedef", + "description": " Formatting options for diff e-mail generation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_EMAIL_CREATE_DEFAULT", + "comments": "

Normal patch, the default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_OMIT_NUMBERS", + "comments": "

Do not include patch numbers in the subject prefix.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_ALWAYS_NUMBER", + "comments": "

Include numbers in the subject prefix even when the\n patch is for a single commit (1/1).

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_EMAIL_CREATE_NO_RENAMES", + "comments": "

Do not perform rename or similarity detection.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_email_create_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_diff_options diff_opts", + "git_diff_find_options diff_find_opts", + "const char * subject_prefix", + "size_t start_number", + "size_t reroll_number" + ], + "type": "struct", + "value": "git_email_create_options", + "file": "git2/email.h", + "line": 44, + "lineto": 72, + "block": "unsigned int version\nuint32_t flags\ngit_diff_options diff_opts\ngit_diff_find_options diff_find_opts\nconst char * subject_prefix\nsize_t start_number\nsize_t reroll_number", + "tdef": "typedef", + "description": " Options for controlling the formatting of the generated e-mail.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_email_create_flags_t` above " + }, + { + "type": "git_diff_options", + "name": "diff_opts", + "comments": " Options to use when creating diffs " + }, + { + "type": "git_diff_find_options", + "name": "diff_find_opts", + "comments": " Options for finding similarities within diffs " + }, + { + "type": "const char *", + "name": "subject_prefix", + "comments": " The subject prefix, by default \"PATCH\". If set to an empty\n string (\"\") then only the patch numbers will be shown in the\n prefix. If the subject_prefix is empty and patch numbers\n are not being shown, the prefix will be omitted entirely." + }, + { + "type": "size_t", + "name": "start_number", + "comments": " The starting patch number; this cannot be 0. By default,\n this is 1." + }, + { + "type": "size_t", + "name": "reroll_number", + "comments": " The \"re-roll\" number. By default, there is no re-roll. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_email_create_from_commit", + "git_email_create_from_diff" + ] + } + } + ], + [ + "git_error", + { + "decl": ["char * message", "int klass"], + "type": "struct", + "value": "git_error", + "file": "git2/errors.h", + "line": 74, + "lineto": 77, + "block": "char * message\nint klass", + "tdef": "typedef", + "description": " Structure to store extra details of the last error that occurred.", + "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", + "fields": [ + { "type": "char *", "name": "message", "comments": "" }, + { "type": "int", "name": "klass", "comments": "" } + ], + "used": { "returns": ["git_error_last", "giterr_last"], "needs": [] } + } + ], + [ + "git_error_code", + { + "decl": [ + "GIT_OK", + "GIT_ERROR", + "GIT_ENOTFOUND", + "GIT_EEXISTS", + "GIT_EAMBIGUOUS", + "GIT_EBUFS", + "GIT_EUSER", + "GIT_EBAREREPO", + "GIT_EUNBORNBRANCH", + "GIT_EUNMERGED", + "GIT_ENONFASTFORWARD", + "GIT_EINVALIDSPEC", + "GIT_ECONFLICT", + "GIT_ELOCKED", + "GIT_EMODIFIED", + "GIT_EAUTH", + "GIT_ECERTIFICATE", + "GIT_EAPPLIED", + "GIT_EPEEL", + "GIT_EEOF", + "GIT_EINVALID", + "GIT_EUNCOMMITTED", + "GIT_EDIRECTORY", + "GIT_EMERGECONFLICT", + "GIT_PASSTHROUGH", + "GIT_ITEROVER", + "GIT_RETRY", + "GIT_EMISMATCH", + "GIT_EINDEXDIRTY", + "GIT_EAPPLYFAIL", + "GIT_EOWNER", + "GIT_TIMEOUT", + "GIT_EUNCHANGED", + "GIT_ENOTSUPPORTED", + "GIT_EREADONLY" + ], + "type": "enum", + "file": "git2/errors.h", + "line": 21, + "lineto": 66, + "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL\nGIT_EOWNER\nGIT_TIMEOUT\nGIT_EUNCHANGED\nGIT_ENOTSUPPORTED\nGIT_EREADONLY", + "tdef": "typedef", + "description": " Generic return codes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OK", + "comments": "

No error

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ERROR", + "comments": "

Generic error

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_ENOTFOUND", + "comments": "

Requested object could not be found

\n", + "value": -3 + }, + { + "type": "int", + "name": "GIT_EEXISTS", + "comments": "

Object exists preventing operation

\n", + "value": -4 + }, + { + "type": "int", + "name": "GIT_EAMBIGUOUS", + "comments": "

More than one object matches

\n", + "value": -5 + }, + { + "type": "int", + "name": "GIT_EBUFS", + "comments": "

Output buffer too short to hold data

\n", + "value": -6 + }, + { + "type": "int", + "name": "GIT_EUSER", + "comments": "

GIT_EUSER is a special error that is never generated by libgit2\n code. You can return it from a callback (e.g to stop an iteration)\n to know that it was generated by the callback and not by libgit2.

\n", + "value": -7 + }, + { + "type": "int", + "name": "GIT_EBAREREPO", + "comments": "

Operation not allowed on bare repository

\n", + "value": -8 + }, + { + "type": "int", + "name": "GIT_EUNBORNBRANCH", + "comments": "

HEAD refers to branch with no commits

\n", + "value": -9 + }, + { + "type": "int", + "name": "GIT_EUNMERGED", + "comments": "

Merge in progress prevented operation

\n", + "value": -10 + }, + { + "type": "int", + "name": "GIT_ENONFASTFORWARD", + "comments": "

Reference was not fast-forwardable

\n", + "value": -11 + }, + { + "type": "int", + "name": "GIT_EINVALIDSPEC", + "comments": "

Name/ref spec was not in a valid format

\n", + "value": -12 + }, + { + "type": "int", + "name": "GIT_ECONFLICT", + "comments": "

Checkout conflicts prevented operation

\n", + "value": -13 + }, + { + "type": "int", + "name": "GIT_ELOCKED", + "comments": "

Lock file prevented operation

\n", + "value": -14 + }, + { + "type": "int", + "name": "GIT_EMODIFIED", + "comments": "

Reference value does not match expected

\n", + "value": -15 + }, + { + "type": "int", + "name": "GIT_EAUTH", + "comments": "

Authentication error

\n", + "value": -16 + }, + { + "type": "int", + "name": "GIT_ECERTIFICATE", + "comments": "

Server certificate is invalid

\n", + "value": -17 + }, + { + "type": "int", + "name": "GIT_EAPPLIED", + "comments": "

Patch/merge has already been applied

\n", + "value": -18 + }, + { + "type": "int", + "name": "GIT_EPEEL", + "comments": "

The requested peel operation is not possible

\n", + "value": -19 + }, + { + "type": "int", + "name": "GIT_EEOF", + "comments": "

Unexpected EOF

\n", + "value": -20 + }, + { + "type": "int", + "name": "GIT_EINVALID", + "comments": "

Invalid operation or input

\n", + "value": -21 + }, + { + "type": "int", + "name": "GIT_EUNCOMMITTED", + "comments": "

Uncommitted changes in index prevented operation

\n", + "value": -22 + }, + { + "type": "int", + "name": "GIT_EDIRECTORY", + "comments": "

The operation is not valid for a directory

\n", + "value": -23 + }, + { + "type": "int", + "name": "GIT_EMERGECONFLICT", + "comments": "

A merge conflict exists and cannot continue

\n", + "value": -24 + }, + { + "type": "int", + "name": "GIT_PASSTHROUGH", + "comments": "

A user-configured callback refused to act

\n", + "value": -30 + }, + { + "type": "int", + "name": "GIT_ITEROVER", + "comments": "

Signals end of iteration with iterator

\n", + "value": -31 + }, + { + "type": "int", + "name": "GIT_RETRY", + "comments": "

Internal only

\n", + "value": -32 + }, + { + "type": "int", + "name": "GIT_EMISMATCH", + "comments": "

Hashsum mismatch in object

\n", + "value": -33 + }, + { + "type": "int", + "name": "GIT_EINDEXDIRTY", + "comments": "

Unsaved changes in the index would be overwritten

\n", + "value": -34 + }, + { + "type": "int", + "name": "GIT_EAPPLYFAIL", + "comments": "

Patch application failed

\n", + "value": -35 + }, + { + "type": "int", + "name": "GIT_EOWNER", + "comments": "

The object is not owned by the current user

\n", + "value": -36 + }, + { + "type": "int", + "name": "GIT_TIMEOUT", + "comments": "

The operation timed out

\n", + "value": -37 + }, + { + "type": "int", + "name": "GIT_EUNCHANGED", + "comments": "

There were no changes

\n", + "value": -38 + }, + { + "type": "int", + "name": "GIT_ENOTSUPPORTED", + "comments": "

An option is not supported

\n", + "value": -39 + }, + { + "type": "int", + "name": "GIT_EREADONLY", + "comments": "

The subject is read-only

\n", + "value": -40 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_error_t", + { + "decl": [ + "GIT_ERROR_NONE", + "GIT_ERROR_NOMEMORY", + "GIT_ERROR_OS", + "GIT_ERROR_INVALID", + "GIT_ERROR_REFERENCE", + "GIT_ERROR_ZLIB", + "GIT_ERROR_REPOSITORY", + "GIT_ERROR_CONFIG", + "GIT_ERROR_REGEX", + "GIT_ERROR_ODB", + "GIT_ERROR_INDEX", + "GIT_ERROR_OBJECT", + "GIT_ERROR_NET", + "GIT_ERROR_TAG", + "GIT_ERROR_TREE", + "GIT_ERROR_INDEXER", + "GIT_ERROR_SSL", + "GIT_ERROR_SUBMODULE", + "GIT_ERROR_THREAD", + "GIT_ERROR_STASH", + "GIT_ERROR_CHECKOUT", + "GIT_ERROR_FETCHHEAD", + "GIT_ERROR_MERGE", + "GIT_ERROR_SSH", + "GIT_ERROR_FILTER", + "GIT_ERROR_REVERT", + "GIT_ERROR_CALLBACK", + "GIT_ERROR_CHERRYPICK", + "GIT_ERROR_DESCRIBE", + "GIT_ERROR_REBASE", + "GIT_ERROR_FILESYSTEM", + "GIT_ERROR_PATCH", + "GIT_ERROR_WORKTREE", + "GIT_ERROR_SHA", + "GIT_ERROR_HTTP", + "GIT_ERROR_INTERNAL", + "GIT_ERROR_GRAFTS" + ], + "type": "enum", + "file": "git2/errors.h", + "line": 80, + "lineto": 118, + "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL\nGIT_ERROR_GRAFTS", + "tdef": "typedef", + "description": " Error classes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ERROR_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_ERROR_NOMEMORY", + "comments": "", + "value": 1 + }, + { "type": "int", "name": "GIT_ERROR_OS", "comments": "", "value": 2 }, + { + "type": "int", + "name": "GIT_ERROR_INVALID", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_ERROR_REFERENCE", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_ERROR_ZLIB", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_ERROR_REPOSITORY", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_ERROR_CONFIG", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_ERROR_REGEX", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_ERROR_ODB", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_ERROR_INDEX", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_ERROR_OBJECT", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_ERROR_NET", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_ERROR_TAG", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_ERROR_TREE", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_ERROR_INDEXER", + "comments": "", + "value": 15 + }, + { + "type": "int", + "name": "GIT_ERROR_SSL", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_ERROR_SUBMODULE", + "comments": "", + "value": 17 + }, + { + "type": "int", + "name": "GIT_ERROR_THREAD", + "comments": "", + "value": 18 + }, + { + "type": "int", + "name": "GIT_ERROR_STASH", + "comments": "", + "value": 19 + }, + { + "type": "int", + "name": "GIT_ERROR_CHECKOUT", + "comments": "", + "value": 20 + }, + { + "type": "int", + "name": "GIT_ERROR_FETCHHEAD", + "comments": "", + "value": 21 + }, + { + "type": "int", + "name": "GIT_ERROR_MERGE", + "comments": "", + "value": 22 + }, + { + "type": "int", + "name": "GIT_ERROR_SSH", + "comments": "", + "value": 23 + }, + { + "type": "int", + "name": "GIT_ERROR_FILTER", + "comments": "", + "value": 24 + }, + { + "type": "int", + "name": "GIT_ERROR_REVERT", + "comments": "", + "value": 25 + }, + { + "type": "int", + "name": "GIT_ERROR_CALLBACK", + "comments": "", + "value": 26 + }, + { + "type": "int", + "name": "GIT_ERROR_CHERRYPICK", + "comments": "", + "value": 27 + }, + { + "type": "int", + "name": "GIT_ERROR_DESCRIBE", + "comments": "", + "value": 28 + }, + { + "type": "int", + "name": "GIT_ERROR_REBASE", + "comments": "", + "value": 29 + }, + { + "type": "int", + "name": "GIT_ERROR_FILESYSTEM", + "comments": "", + "value": 30 + }, + { + "type": "int", + "name": "GIT_ERROR_PATCH", + "comments": "", + "value": 31 + }, + { + "type": "int", + "name": "GIT_ERROR_WORKTREE", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_ERROR_SHA", + "comments": "", + "value": 33 + }, + { + "type": "int", + "name": "GIT_ERROR_HTTP", + "comments": "", + "value": 34 + }, + { + "type": "int", + "name": "GIT_ERROR_INTERNAL", + "comments": "", + "value": 35 + }, + { + "type": "int", + "name": "GIT_ERROR_GRAFTS", + "comments": "", + "value": 36 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_feature_t", + { + "decl": [ + "GIT_FEATURE_THREADS", + "GIT_FEATURE_HTTPS", + "GIT_FEATURE_SSH", + "GIT_FEATURE_NSEC" + ], + "type": "enum", + "file": "git2/common.h", + "line": 134, + "lineto": 157, + "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", + "tdef": "typedef", + "description": " Combinations of these values describe the features with which libgit2\n was compiled", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FEATURE_THREADS", + "comments": "

If set, libgit2 was built thread-aware and can be safely used from multiple\n threads.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FEATURE_HTTPS", + "comments": "

If set, libgit2 was built with and linked against a TLS implementation.\n Custom TLS streams may still be added by the user to support HTTPS\n regardless of this.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_FEATURE_SSH", + "comments": "

If set, libgit2 was built with and linked against libssh2. A custom\n transport may still be added by the user to support libssh2 regardless of\n this.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_FEATURE_NSEC", + "comments": "

If set, libgit2 was built with support for sub-second resolution in file\n modification times.

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_fetch_depth_t", + { + "decl": ["GIT_FETCH_DEPTH_FULL", "GIT_FETCH_DEPTH_UNSHALLOW"], + "type": "enum", + "file": "git2/remote.h", + "line": 717, + "lineto": 723, + "block": "GIT_FETCH_DEPTH_FULL\nGIT_FETCH_DEPTH_UNSHALLOW", + "tdef": "typedef", + "description": " Constants for fetch depth (shallowness of fetch). ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FETCH_DEPTH_FULL", + "comments": "

The fetch is "full" (not shallow). This is the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FETCH_DEPTH_UNSHALLOW", + "comments": "

The fetch should "unshallow" and fetch missing data.

\n", + "value": 2147483647 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_fetch_options", + { + "decl": [ + "int version", + "git_remote_callbacks callbacks", + "git_fetch_prune_t prune", + "unsigned int update_fetchhead", + "git_remote_autotag_option_t download_tags", + "git_proxy_options proxy_opts", + "int depth", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers" + ], + "type": "struct", + "value": "git_fetch_options", + "file": "git2/remote.h", + "line": 733, + "lineto": 785, + "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nunsigned int update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\nint depth\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", + "tdef": "typedef", + "description": " Fetch options structure.", + "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", + "fields": [ + { "type": "int", "name": "version", "comments": "" }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this fetch operation" + }, + { + "type": "git_fetch_prune_t", + "name": "prune", + "comments": " Whether to perform a prune after the fetch" + }, + { + "type": "unsigned int", + "name": "update_fetchhead", + "comments": " How to handle reference updates; see `git_remote_update_flags`." + }, + { + "type": "git_remote_autotag_option_t", + "name": "download_tags", + "comments": " Determines how to behave regarding tags on the remote, such\n as auto-downloading tags for objects we're downloading or\n downloading all of them.\n\n The default is to auto-follow tags." + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " Proxy options to use, by default no proxy is used." + }, + { + "type": "int", + "name": "depth", + "comments": " Depth of the fetch to perform, or `GIT_FETCH_DEPTH_FULL`\n (or `0`) for full history, or `GIT_FETCH_DEPTH_UNSHALLOW`\n to \"unshallow\" a shallow repository.\n\n The default is full (`GIT_FETCH_DEPTH_FULL` or `0`)." + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra headers for this fetch operation" + } + ], + "used": { + "returns": [], + "needs": [ + "git_fetch_options_init", + "git_remote_download", + "git_remote_fetch" + ] + } + } + ], + [ + "git_fetch_prune_t", + { + "decl": [ + "GIT_FETCH_PRUNE_UNSPECIFIED", + "GIT_FETCH_PRUNE", + "GIT_FETCH_NO_PRUNE" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 676, + "lineto": 689, + "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", + "tdef": "typedef", + "description": " Acceptable prune settings when fetching ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FETCH_PRUNE_UNSPECIFIED", + "comments": "

Use the setting from the configuration

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FETCH_PRUNE", + "comments": "

Force pruning on

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FETCH_NO_PRUNE", + "comments": "

Force pruning off

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_filemode_t", + { + "decl": [ + "GIT_FILEMODE_UNREADABLE", + "GIT_FILEMODE_TREE", + "GIT_FILEMODE_BLOB", + "GIT_FILEMODE_BLOB_EXECUTABLE", + "GIT_FILEMODE_LINK", + "GIT_FILEMODE_COMMIT" + ], + "type": "enum", + "file": "git2/types.h", + "line": 222, + "lineto": 229, + "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", + "tdef": "typedef", + "description": " Valid modes for index and tree entries. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILEMODE_UNREADABLE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILEMODE_TREE", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_FILEMODE_BLOB", + "comments": "", + "value": 33188 + }, + { + "type": "int", + "name": "GIT_FILEMODE_BLOB_EXECUTABLE", + "comments": "", + "value": 33261 + }, + { + "type": "int", + "name": "GIT_FILEMODE_LINK", + "comments": "", + "value": 40960 + }, + { + "type": "int", + "name": "GIT_FILEMODE_COMMIT", + "comments": "", + "value": 57344 + } + ], + "used": { + "returns": ["git_tree_entry_filemode", "git_tree_entry_filemode_raw"], + "needs": ["git_treebuilder_insert"] + } + } + ], + [ + "git_filter", + { + "decl": "git_filter", + "type": "struct", + "value": "git_filter", + "file": "git2/filter.h", + "line": 100, + "lineto": 100, + "tdef": "typedef", + "description": " A filter that can transform file data", + "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", + "used": { + "returns": [], + "needs": [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ], + [ + "git_filter_flag_t", + { + "decl": [ + "GIT_FILTER_DEFAULT", + "GIT_FILTER_ALLOW_UNSAFE", + "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "GIT_FILTER_ATTRIBUTES_FROM_COMMIT" + ], + "type": "enum", + "file": "git2/filter.h", + "line": 41, + "lineto": 58, + "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_FILTER_ATTRIBUTES_FROM_COMMIT", + "tdef": "typedef", + "description": " Filter option flags.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILTER_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_ALLOW_UNSAFE", + "comments": "

Don't error for safecrlf violations, allow them to continue.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", + "comments": "

Don't load /etc/gitattributes (or the system equivalent)

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_HEAD", + "comments": "

Load attributes from .gitattributes in the root of HEAD

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_FILTER_ATTRIBUTES_FROM_COMMIT", + "comments": "

Load attributes from .gitattributes in a given commit.\n This can only be specified in a git_filter_options.

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_filter_list", + { + "decl": "git_filter_list", + "type": "struct", + "value": "git_filter_list", + "file": "git2/filter.h", + "line": 112, + "lineto": 112, + "tdef": "typedef", + "description": " List of filters to be applied", + "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", + "used": { + "returns": [], + "needs": [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + } + } + ], + [ + "git_filter_mode_t", + { + "decl": [ + "GIT_FILTER_TO_WORKTREE", + "GIT_FILTER_SMUDGE", + "GIT_FILTER_TO_ODB", + "GIT_FILTER_CLEAN" + ], + "type": "enum", + "file": "git2/filter.h", + "line": 31, + "lineto": 36, + "block": "GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN", + "tdef": "typedef", + "description": " Filters are applied in one of two directions: smudging - which is\n exporting a file from the Git object database to the working directory,\n and cleaning - which is importing a file from the working directory to\n the Git object database. These values control which direction of\n change is being applied.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_FILTER_TO_WORKTREE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_SMUDGE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_FILTER_TO_ODB", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_FILTER_CLEAN", + "comments": "", + "value": 1 + } + ], + "used": { + "returns": [], + "needs": ["git_filter_list_load", "git_filter_list_load_ext"] + } + } + ], + [ + "git_filter_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_oid * commit_id", + "git_oid attr_commit_id" + ], + "type": "struct", + "value": "git_filter_options", + "file": "git2/filter.h", + "line": 63, + "lineto": 80, + "block": "unsigned int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", + "tdef": "typedef", + "description": " Filtering options", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_filter_flag_t` above " + }, + { "type": "git_oid *", "name": "commit_id", "comments": "" }, + { + "type": "git_oid", + "name": "attr_commit_id", + "comments": " The commit to load attributes from, when\n `GIT_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." + } + ], + "used": { "returns": [], "needs": ["git_filter_list_load_ext"] } + } + ], + [ + "git_filter_source", + { + "decl": "git_filter_source", + "type": "struct", + "value": "git_filter_source", + "file": "git2/sys/filter.h", + "line": 95, + "lineto": 95, + "tdef": "typedef", + "description": " A filter source represents a file/blob to be processed", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_hashsig_option_t", + { + "decl": [ + "GIT_HASHSIG_NORMAL", + "GIT_HASHSIG_IGNORE_WHITESPACE", + "GIT_HASHSIG_SMART_WHITESPACE", + "GIT_HASHSIG_ALLOW_SMALL_FILES" + ], + "type": "enum", + "file": "git2/sys/hashsig.h", + "line": 25, + "lineto": 45, + "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", + "tdef": "typedef", + "description": " Options for hashsig computation", + "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_HASHSIG_NORMAL", + "comments": "

Use all data

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_HASHSIG_IGNORE_WHITESPACE", + "comments": "

Ignore whitespace

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_HASHSIG_SMART_WHITESPACE", + "comments": "

Ignore

\n\n

and all space after

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_HASHSIG_ALLOW_SMALL_FILES", + "comments": "

Allow hashing of small files

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index", + { + "decl": "git_index", + "type": "struct", + "value": "git_index", + "file": "git2/types.h", + "line": 148, + "lineto": 148, + "tdef": "typedef", + "description": " Memory representation of an index file. ", + "comments": "", + "used": { + "returns": [ + "git_index_get_byindex", + "git_index_get_bypath", + "git_remote_stats" + ], + "needs": [ + "git_apply_to_tree", + "git_checkout_index", + "git_cherrypick_commit", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_index", + "git_index_add", + "git_index_add_all", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_caps", + "git_index_checksum", + "git_index_clear", + "git_index_conflict_add", + "git_index_conflict_cleanup", + "git_index_conflict_get", + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_remove", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_entrycount", + "git_index_find", + "git_index_find_prefix", + "git_index_free", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_owner", + "git_index_path", + "git_index_read", + "git_index_read_tree", + "git_index_remove", + "git_index_remove_all", + "git_index_remove_bypath", + "git_index_remove_directory", + "git_index_set_caps", + "git_index_set_version", + "git_index_update_all", + "git_index_version", + "git_index_write", + "git_index_write_tree", + "git_index_write_tree_to", + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", + "git_merge_commits", + "git_merge_file_from_index", + "git_merge_trees", + "git_odb_write_pack", + "git_packbuilder_write", + "git_pathspec_match_index", + "git_rebase_inmemory_index", + "git_repository_index", + "git_revert_commit" + ] + } + } + ], + [ + "git_index_add_option_t", + { + "decl": [ + "GIT_INDEX_ADD_DEFAULT", + "GIT_INDEX_ADD_FORCE", + "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", + "GIT_INDEX_ADD_CHECK_PATHSPEC" + ], + "type": "enum", + "file": "git2/index.h", + "line": 139, + "lineto": 144, + "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", + "tdef": "typedef", + "description": " Flags for APIs that add files matching pathspec ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ADD_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_FORCE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_ADD_CHECK_PATHSPEC", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_capability_t", + { + "decl": [ + "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "GIT_INDEX_CAPABILITY_FROM_OWNER" + ], + "type": "enum", + "file": "git2/index.h", + "line": 126, + "lineto": 131, + "block": "GIT_INDEX_CAPABILITY_IGNORE_CASE\nGIT_INDEX_CAPABILITY_NO_FILEMODE\nGIT_INDEX_CAPABILITY_NO_SYMLINKS\nGIT_INDEX_CAPABILITY_FROM_OWNER", + "tdef": "typedef", + "description": " Capabilities of system that affect index actions. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_IGNORE_CASE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_FILEMODE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_NO_SYMLINKS", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_INDEX_CAPABILITY_FROM_OWNER", + "comments": "", + "value": -1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_conflict_iterator", + { + "decl": "git_index_conflict_iterator", + "type": "struct", + "value": "git_index_conflict_iterator", + "file": "git2/types.h", + "line": 154, + "lineto": 154, + "tdef": "typedef", + "description": " An iterator for conflicts in the index. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next" + ] + } + } + ], + [ + "git_index_entry", + { + "decl": [ + "git_index_time ctime", + "git_index_time mtime", + "uint32_t dev", + "uint32_t ino", + "uint32_t mode", + "uint32_t uid", + "uint32_t gid", + "uint32_t file_size", + "git_oid id", + "uint16_t flags", + "uint16_t flags_extended", + "const char * path" + ], + "type": "struct", + "value": "git_index_entry", + "file": "git2/index.h", + "line": 53, + "lineto": 70, + "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", + "tdef": "typedef", + "description": " In-memory representation of a file entry in the index.", + "comments": "

This is a public structure that represents a file entry in the index. The meaning of the fields corresponds to core Git's documentation (in "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be accessed via the first set of GIT_INDEX_ENTRY_... bitmasks below. These flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be accessed via the later GIT_INDEX_ENTRY_... bitmasks below. Some of these flags are read from and written to disk, but some are set aside for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This is enough to detect changes, which is enough for the index to function as a cache, but it should not be taken as an authoritative source for that data.

\n", + "fields": [ + { "type": "git_index_time", "name": "ctime", "comments": "" }, + { "type": "git_index_time", "name": "mtime", "comments": "" }, + { "type": "uint32_t", "name": "dev", "comments": "" }, + { "type": "uint32_t", "name": "ino", "comments": "" }, + { "type": "uint32_t", "name": "mode", "comments": "" }, + { "type": "uint32_t", "name": "uid", "comments": "" }, + { "type": "uint32_t", "name": "gid", "comments": "" }, + { "type": "uint32_t", "name": "file_size", "comments": "" }, + { "type": "git_oid", "name": "id", "comments": "" }, + { "type": "uint16_t", "name": "flags", "comments": "" }, + { "type": "uint16_t", "name": "flags_extended", "comments": "" }, + { "type": "const char *", "name": "path", "comments": "" } + ], + "used": { + "returns": ["git_index_get_byindex", "git_index_get_bypath"], + "needs": [ + "git_index_add", + "git_index_add_from_buffer", + "git_index_conflict_add", + "git_index_conflict_get", + "git_index_conflict_next", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_iterator_next", + "git_merge_file_from_index" + ] + } + } + ], + [ + "git_index_entry_extended_flag_t", + { + "decl": [ + "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "GIT_INDEX_ENTRY_UPTODATE" + ], + "type": "enum", + "file": "git2/index.h", + "line": 116, + "lineto": 123, + "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", + "tdef": "typedef", + "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", + "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_INTENT_TO_ADD", + "comments": "", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_SKIP_WORKTREE", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED_FLAGS", + "comments": "", + "value": 24576 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_UPTODATE", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_entry_flag_t", + { + "decl": ["GIT_INDEX_ENTRY_EXTENDED", "GIT_INDEX_ENTRY_VALID"], + "type": "enum", + "file": "git2/index.h", + "line": 87, + "lineto": 90, + "block": "GIT_INDEX_ENTRY_EXTENDED\nGIT_INDEX_ENTRY_VALID", + "tdef": "typedef", + "description": " Flags for index entries", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_ENTRY_EXTENDED", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_INDEX_ENTRY_VALID", + "comments": "", + "value": 32768 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_iterator", + { + "decl": "git_index_iterator", + "type": "struct", + "value": "git_index_iterator", + "file": "git2/types.h", + "line": 151, + "lineto": 151, + "tdef": "typedef", + "description": " An iterator for entries in the index. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next" + ] + } + } + ], + [ + "git_index_stage_t", + { + "decl": [ + "GIT_INDEX_STAGE_ANY", + "GIT_INDEX_STAGE_NORMAL", + "GIT_INDEX_STAGE_ANCESTOR", + "GIT_INDEX_STAGE_OURS", + "GIT_INDEX_STAGE_THEIRS" + ], + "type": "enum", + "file": "git2/index.h", + "line": 147, + "lineto": 167, + "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", + "tdef": "typedef", + "description": " Git index stage states ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANY", + "comments": "

Match any index stage.

\n\n

Some index APIs take a stage to match; pass this value to match\n any entry matching the path regardless of stage.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_NORMAL", + "comments": "

A normal staged file in the index.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_ANCESTOR", + "comments": "

The ancestor side of a conflict.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_OURS", + "comments": "

The "ours" side of a conflict.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_INDEX_STAGE_THEIRS", + "comments": "

The "theirs" side of a conflict.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_index_time", + { + "decl": ["int32_t seconds", "uint32_t nanoseconds"], + "type": "struct", + "value": "git_index_time", + "file": "git2/index.h", + "line": 26, + "lineto": 30, + "block": "int32_t seconds\nuint32_t nanoseconds", + "tdef": "typedef", + "description": " Time structure used in a git index entry ", + "comments": "", + "fields": [ + { "type": "int32_t", "name": "seconds", "comments": "" }, + { "type": "uint32_t", "name": "nanoseconds", "comments": "" } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_indexer", + { + "decl": "git_indexer", + "type": "struct", + "value": "git_indexer", + "file": "git2/indexer.h", + "line": 17, + "lineto": 17, + "tdef": "typedef", + "description": " A git indexer object ", + "comments": "", + "used": { + "returns": ["git_remote_stats"], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + } + } + ], + [ + "git_indexer_options", + { + "decl": [ + "unsigned int version", + "git_indexer_progress_cb progress_cb", + "void * progress_cb_payload", + "unsigned char verify" + ], + "type": "struct", + "value": "git_indexer_options", + "file": "git2/indexer.h", + "line": 62, + "lineto": 86, + "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", + "tdef": "typedef", + "description": " Options for indexer configuration", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_indexer_progress_cb", + "name": "progress_cb", + "comments": " progress_cb function to call with progress information " + }, + { + "type": "void *", + "name": "progress_cb_payload", + "comments": " progress_cb_payload payload for the progress callback " + }, + { + "type": "unsigned char", + "name": "verify", + "comments": " Do connectivity checks for the received pack " + } + ], + "used": { + "returns": [], + "needs": ["git_indexer_new", "git_indexer_options_init"] + } + } + ], + [ + "git_indexer_progress", + { + "decl": [ + "unsigned int total_objects", + "unsigned int indexed_objects", + "unsigned int received_objects", + "unsigned int local_objects", + "unsigned int total_deltas", + "unsigned int indexed_deltas", + "size_t received_bytes" + ], + "type": "struct", + "value": "git_indexer_progress", + "file": "git2/indexer.h", + "line": 24, + "lineto": 48, + "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", + "tdef": "typedef", + "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "total_objects", + "comments": " number of objects in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_objects", + "comments": " received objects that have been hashed " + }, + { + "type": "unsigned int", + "name": "received_objects", + "comments": " received_objects: objects which have been downloaded " + }, + { + "type": "unsigned int", + "name": "local_objects", + "comments": " locally-available objects that have been injected in order\n to fix a thin pack" + }, + { + "type": "unsigned int", + "name": "total_deltas", + "comments": " number of deltas in the packfile being indexed " + }, + { + "type": "unsigned int", + "name": "indexed_deltas", + "comments": " received deltas that have been indexed " + }, + { + "type": "size_t", + "name": "received_bytes", + "comments": " size of the packfile received up to now " + } + ], + "used": { + "returns": ["git_remote_stats"], + "needs": [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_progress_cb", + "git_odb_write_pack", + "git_packbuilder_write" + ] + } + } + ], + [ + "git_libgit2_opt_t", + { + "decl": [ + "GIT_OPT_GET_MWINDOW_SIZE", + "GIT_OPT_SET_MWINDOW_SIZE", + "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", + "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", + "GIT_OPT_GET_SEARCH_PATH", + "GIT_OPT_SET_SEARCH_PATH", + "GIT_OPT_SET_CACHE_OBJECT_LIMIT", + "GIT_OPT_SET_CACHE_MAX_SIZE", + "GIT_OPT_ENABLE_CACHING", + "GIT_OPT_GET_CACHED_MEMORY", + "GIT_OPT_GET_TEMPLATE_PATH", + "GIT_OPT_SET_TEMPLATE_PATH", + "GIT_OPT_SET_SSL_CERT_LOCATIONS", + "GIT_OPT_SET_USER_AGENT", + "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", + "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", + "GIT_OPT_SET_SSL_CIPHERS", + "GIT_OPT_GET_USER_AGENT", + "GIT_OPT_ENABLE_OFS_DELTA", + "GIT_OPT_ENABLE_FSYNC_GITDIR", + "GIT_OPT_GET_WINDOWS_SHAREMODE", + "GIT_OPT_SET_WINDOWS_SHAREMODE", + "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "GIT_OPT_SET_ALLOCATOR", + "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "GIT_OPT_GET_PACK_MAX_OBJECTS", + "GIT_OPT_SET_PACK_MAX_OBJECTS", + "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "GIT_OPT_GET_EXTENSIONS", + "GIT_OPT_SET_EXTENSIONS", + "GIT_OPT_GET_OWNER_VALIDATION", + "GIT_OPT_SET_OWNER_VALIDATION", + "GIT_OPT_GET_HOMEDIR", + "GIT_OPT_SET_HOMEDIR", + "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", + "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", + "GIT_OPT_SET_SERVER_TIMEOUT", + "GIT_OPT_GET_SERVER_TIMEOUT", + "GIT_OPT_SET_USER_AGENT_PRODUCT", + "GIT_OPT_GET_USER_AGENT_PRODUCT" + ], + "type": "enum", + "file": "git2/common.h", + "line": 188, + "lineto": 234, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION\nGIT_OPT_GET_HOMEDIR\nGIT_OPT_SET_HOMEDIR\nGIT_OPT_SET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_GET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_SET_SERVER_TIMEOUT\nGIT_OPT_GET_SERVER_TIMEOUT\nGIT_OPT_SET_USER_AGENT_PRODUCT\nGIT_OPT_GET_USER_AGENT_PRODUCT", + "tdef": "typedef", + "description": " Global library options", + "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", + "fields": [ + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_SIZE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_SIZE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SEARCH_PATH", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SEARCH_PATH", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_OPT_SET_CACHE_OBJECT_LIMIT", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_OPT_SET_CACHE_MAX_SIZE", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_CACHING", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_OPT_GET_CACHED_MEMORY", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_OPT_GET_TEMPLATE_PATH", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_OPT_SET_TEMPLATE_PATH", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SSL_CERT_LOCATIONS", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_OPT_SET_USER_AGENT", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", + "comments": "", + "value": 15 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SSL_CIPHERS", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_OPT_GET_USER_AGENT", + "comments": "", + "value": 17 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_OFS_DELTA", + "comments": "", + "value": 18 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_FSYNC_GITDIR", + "comments": "", + "value": 19 + }, + { + "type": "int", + "name": "GIT_OPT_GET_WINDOWS_SHAREMODE", + "comments": "", + "value": 20 + }, + { + "type": "int", + "name": "GIT_OPT_SET_WINDOWS_SHAREMODE", + "comments": "", + "value": 21 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", + "comments": "", + "value": 22 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ALLOCATOR", + "comments": "", + "value": 23 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", + "comments": "", + "value": 24 + }, + { + "type": "int", + "name": "GIT_OPT_GET_PACK_MAX_OBJECTS", + "comments": "", + "value": 25 + }, + { + "type": "int", + "name": "GIT_OPT_SET_PACK_MAX_OBJECTS", + "comments": "", + "value": 26 + }, + { + "type": "int", + "name": "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", + "comments": "", + "value": 27 + }, + { + "type": "int", + "name": "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", + "comments": "", + "value": 28 + }, + { + "type": "int", + "name": "GIT_OPT_GET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 29 + }, + { + "type": "int", + "name": "GIT_OPT_SET_MWINDOW_FILE_LIMIT", + "comments": "", + "value": 30 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_PACKED_PRIORITY", + "comments": "", + "value": 31 + }, + { + "type": "int", + "name": "GIT_OPT_SET_ODB_LOOSE_PRIORITY", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_OPT_GET_EXTENSIONS", + "comments": "", + "value": 33 + }, + { + "type": "int", + "name": "GIT_OPT_SET_EXTENSIONS", + "comments": "", + "value": 34 + }, + { + "type": "int", + "name": "GIT_OPT_GET_OWNER_VALIDATION", + "comments": "", + "value": 35 + }, + { + "type": "int", + "name": "GIT_OPT_SET_OWNER_VALIDATION", + "comments": "", + "value": 36 + }, + { + "type": "int", + "name": "GIT_OPT_GET_HOMEDIR", + "comments": "", + "value": 37 + }, + { + "type": "int", + "name": "GIT_OPT_SET_HOMEDIR", + "comments": "", + "value": 38 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", + "comments": "", + "value": 39 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", + "comments": "", + "value": 40 + }, + { + "type": "int", + "name": "GIT_OPT_SET_SERVER_TIMEOUT", + "comments": "", + "value": 41 + }, + { + "type": "int", + "name": "GIT_OPT_GET_SERVER_TIMEOUT", + "comments": "", + "value": 42 + }, + { + "type": "int", + "name": "GIT_OPT_SET_USER_AGENT_PRODUCT", + "comments": "", + "value": 43 + }, + { + "type": "int", + "name": "GIT_OPT_GET_USER_AGENT_PRODUCT", + "comments": "", + "value": 44 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_mailmap", + { + "decl": "git_mailmap", + "type": "struct", + "value": "git_mailmap", + "file": "git2/types.h", + "line": 366, + "lineto": 366, + "tdef": "typedef", + "description": " Representation of .mailmap file state. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + } + } + ], + [ + "git_merge_analysis_t", + { + "decl": [ + "GIT_MERGE_ANALYSIS_NONE", + "GIT_MERGE_ANALYSIS_NORMAL", + "GIT_MERGE_ANALYSIS_UP_TO_DATE", + "GIT_MERGE_ANALYSIS_FASTFORWARD", + "GIT_MERGE_ANALYSIS_UNBORN" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 334, + "lineto": 363, + "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", + "tdef": "typedef", + "description": " The results of `git_merge_analysis` indicate the merge opportunities.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_NONE", + "comments": "

No merge is possible. (Unused.)

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_NORMAL", + "comments": "

A "normal" merge; both HEAD and the given merge input have diverged\n from their common ancestor. The divergent commits must be merged.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_UP_TO_DATE", + "comments": "

All given merge inputs are reachable from HEAD, meaning the\n repository is up-to-date and no merge needs to be performed.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_FASTFORWARD", + "comments": "

The given merge input is a fast-forward from HEAD and no merge\n needs to be performed. Instead, the client can check out the\n given merge input.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_ANALYSIS_UNBORN", + "comments": "

The HEAD of the current repository is "unborn" and does not point to\n a valid commit. No merge can be performed, but the caller may wish\n to simply set HEAD to the target commit(s).

\n", + "value": 8 + } + ], + "used": { + "returns": [], + "needs": ["git_merge_analysis", "git_merge_analysis_for_ref"] + } + } + ], + [ + "git_merge_driver_source", + { + "decl": "git_merge_driver_source", + "type": "struct", + "value": "git_merge_driver_source", + "file": "git2/sys/merge.h", + "line": 41, + "lineto": 41, + "tdef": "typedef", + "description": " A merge driver source represents the file to be merged", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_file_favor_t", + { + "decl": [ + "GIT_MERGE_FILE_FAVOR_NORMAL", + "GIT_MERGE_FILE_FAVOR_OURS", + "GIT_MERGE_FILE_FAVOR_THEIRS", + "GIT_MERGE_FILE_FAVOR_UNION" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 109, + "lineto": 139, + "block": "GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION", + "tdef": "typedef", + "description": " Merge file favor options for `git_merge_options` instruct the file-level\n merging functionality how to deal with conflicting regions of the files.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_NORMAL", + "comments": "

When a region of a file is changed in both branches, a conflict\n will be recorded in the index so that git_checkout can produce\n a merge file with conflict markers in the working directory.\n This is the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_OURS", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "ours" side of any conflicting\n region. The index will not record a conflict.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_THEIRS", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "theirs" side of any conflicting\n region. The index will not record a conflict.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_FAVOR_UNION", + "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain each unique line from each side,\n which has the result of combining both files. The index will not\n record a conflict.

\n", + "value": 3 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_file_flag_t", + { + "decl": [ + "GIT_MERGE_FILE_DEFAULT", + "GIT_MERGE_FILE_STYLE_MERGE", + "GIT_MERGE_FILE_STYLE_DIFF3", + "GIT_MERGE_FILE_SIMPLIFY_ALNUM", + "GIT_MERGE_FILE_IGNORE_WHITESPACE", + "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", + "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", + "GIT_MERGE_FILE_DIFF_PATIENCE", + "GIT_MERGE_FILE_DIFF_MINIMAL", + "GIT_MERGE_FILE_STYLE_ZDIFF3", + "GIT_MERGE_FILE_ACCEPT_CONFLICTS" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 144, + "lineto": 181, + "block": "GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL\nGIT_MERGE_FILE_STYLE_ZDIFF3\nGIT_MERGE_FILE_ACCEPT_CONFLICTS", + "tdef": "typedef", + "description": " File merging flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FILE_DEFAULT", + "comments": "

Defaults

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_MERGE", + "comments": "

Create standard conflicted merge files

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_DIFF3", + "comments": "

Create diff3-style files

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_SIMPLIFY_ALNUM", + "comments": "

Condense non-alphanumeric regions for simplified diff file

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE", + "comments": "

Ignore all whitespace

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", + "comments": "

Ignore changes in amount of whitespace

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", + "comments": "

Ignore whitespace at end of line

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_DIFF_PATIENCE", + "comments": "

Use the "patience diff" algorithm

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_DIFF_MINIMAL", + "comments": "

Take extra time to find minimal diff

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_STYLE_ZDIFF3", + "comments": "

Create zdiff3 ("zealous diff3")-style files

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_MERGE_FILE_ACCEPT_CONFLICTS", + "comments": "

Do not produce file conflicts when common regions have\n changed; keep the conflict markers in the file and accept\n that as the merge result.

\n", + "value": 512 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_file_input", + { + "decl": [ + "unsigned int version", + "const char * ptr", + "size_t size", + "const char * path", + "unsigned int mode" + ], + "type": "struct", + "value": "git_merge_file_input", + "file": "git2/merge.h", + "line": 32, + "lineto": 46, + "block": "unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode", + "tdef": "typedef", + "description": " The file inputs to `git_merge_file`. Callers should populate the\n `git_merge_file_input` structure with descriptions of the files in\n each side of the conflict for use in producing the merge file.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "const char *", + "name": "ptr", + "comments": " Pointer to the contents of the file. " + }, + { + "type": "size_t", + "name": "size", + "comments": " Size of the contents pointed to in `ptr`. " + }, + { + "type": "const char *", + "name": "path", + "comments": " File name of the conflicted file, or `NULL` to not merge the path. " + }, + { + "type": "unsigned int", + "name": "mode", + "comments": " File mode of the conflicted file, or `0` to not merge the mode. " + } + ], + "used": { + "returns": [], + "needs": ["git_merge_file", "git_merge_file_input_init"] + } + } + ], + [ + "git_merge_file_options", + { + "decl": [ + "unsigned int version", + "const char * ancestor_label", + "const char * our_label", + "const char * their_label", + "git_merge_file_favor_t favor", + "uint32_t flags", + "unsigned short marker_size" + ], + "type": "struct", + "value": "git_merge_file_options", + "file": "git2/merge.h", + "line": 188, + "lineto": 218, + "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nuint32_t flags\nunsigned short marker_size", + "tdef": "typedef", + "description": " Options for merging a file", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "const char *", + "name": "ancestor_label", + "comments": " Label for the ancestor file side of the conflict which will be prepended\n to labels in diff3-format merge files." + }, + { + "type": "const char *", + "name": "our_label", + "comments": " Label for our file side of the conflict which will be prepended\n to labels in merge files." + }, + { + "type": "const char *", + "name": "their_label", + "comments": " Label for their file side of the conflict which will be prepended\n to labels in merge files." + }, + { + "type": "git_merge_file_favor_t", + "name": "favor", + "comments": " The file to favor in region conflicts. " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " see `git_merge_file_flag_t` above " + }, + { + "type": "unsigned short", + "name": "marker_size", + "comments": " The size of conflict markers (eg, \"\n<\n<\n<\n<\n<\n<\n<\n\"). Default is\n GIT_MERGE_CONFLICT_MARKER_SIZE. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_options_init" + ] + } + } + ], + [ + "git_merge_file_result", + { + "decl": [ + "unsigned int automergeable", + "const char * path", + "unsigned int mode", + "const char * ptr", + "size_t len" + ], + "type": "struct", + "value": "git_merge_file_result", + "file": "git2/merge.h", + "line": 238, + "lineto": 259, + "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", + "tdef": "typedef", + "description": " Information about file-level merging", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "automergeable", + "comments": " True if the output was automerged, false if the output contains\n conflict markers." + }, + { + "type": "const char *", + "name": "path", + "comments": " The path that the resultant merge file should use, or NULL if a\n filename conflict would occur." + }, + { + "type": "unsigned int", + "name": "mode", + "comments": " The mode that the resultant merge file should use. " + }, + { + "type": "const char *", + "name": "ptr", + "comments": " The contents of the merge. " + }, + { + "type": "size_t", + "name": "len", + "comments": " The length of the merge contents. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_result_free" + ] + } + } + ], + [ + "git_merge_flag_t", + { + "decl": [ + "GIT_MERGE_FIND_RENAMES", + "GIT_MERGE_FAIL_ON_CONFLICT", + "GIT_MERGE_SKIP_REUC", + "GIT_MERGE_NO_RECURSIVE", + "GIT_MERGE_VIRTUAL_BASE" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 68, + "lineto": 103, + "block": "GIT_MERGE_FIND_RENAMES\nGIT_MERGE_FAIL_ON_CONFLICT\nGIT_MERGE_SKIP_REUC\nGIT_MERGE_NO_RECURSIVE\nGIT_MERGE_VIRTUAL_BASE", + "tdef": "typedef", + "description": " Flags for `git_merge` options. A combination of these flags can be\n passed in via the `flags` value in the `git_merge_options`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_FIND_RENAMES", + "comments": "

Detect renames that occur between the common ancestor and the "ours"\n side or the common ancestor and the "theirs" side. This will enable\n the ability to merge between a modified and renamed file.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_FAIL_ON_CONFLICT", + "comments": "

If a conflict occurs, exit immediately instead of attempting to\n continue resolving conflicts. The merge operation will fail with\n GIT_EMERGECONFLICT and no index will be returned.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_MERGE_SKIP_REUC", + "comments": "

Do not write the REUC extension on the generated index

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_MERGE_NO_RECURSIVE", + "comments": "

If the commits being merged have multiple merge bases, do not build\n a recursive merge base (by merging the multiple merge bases),\n instead simply use the first base. This flag provides a similar\n merge base to git-merge-resolve.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_MERGE_VIRTUAL_BASE", + "comments": "

Treat this merge as if it is to produce the virtual base\n of a recursive merge. This will ensure that there are\n no conflicts, any conflicting regions will keep conflict\n markers in the merge result.

\n", + "value": 16 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_merge_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "unsigned int rename_threshold", + "unsigned int target_limit", + "git_diff_similarity_metric * metric", + "unsigned int recursion_limit", + "const char * default_driver", + "git_merge_file_favor_t file_favor", + "uint32_t file_flags" + ], + "type": "struct", + "value": "git_merge_options", + "file": "git2/merge.h", + "line": 264, + "lineto": 313, + "block": "unsigned int version\nuint32_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\nuint32_t file_flags", + "tdef": "typedef", + "description": " Merging options", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_merge_flag_t` above " + }, + { + "type": "unsigned int", + "name": "rename_threshold", + "comments": " Similarity to consider a file renamed (default 50). If\n `GIT_MERGE_FIND_RENAMES` is enabled, added files will be compared\n with deleted files to determine their similarity. Files that are\n more similar than the rename threshold (percentage-wise) will be\n treated as a rename." + }, + { + "type": "unsigned int", + "name": "target_limit", + "comments": " Maximum similarity sources to examine for renames (default 200).\n If the number of rename candidates (add / delete pairs) is greater\n than this value, inexact rename detection is aborted.\n\n This setting overrides the `merge.renameLimit` configuration value." + }, + { + "type": "git_diff_similarity_metric *", + "name": "metric", + "comments": " Pluggable similarity metric; pass NULL to use internal metric " + }, + { + "type": "unsigned int", + "name": "recursion_limit", + "comments": " Maximum number of times to merge common ancestors to build a\n virtual merge base when faced with criss-cross merges. When this\n limit is reached, the next ancestor will simply be used instead of\n attempting to merge it. The default is unlimited." + }, + { + "type": "const char *", + "name": "default_driver", + "comments": " Default merge driver to be used when both sides of a merge have\n changed. The default is the `text` driver." + }, + { + "type": "git_merge_file_favor_t", + "name": "file_favor", + "comments": " Flags for handling conflicting content, to be used with the standard\n (`text`) merge driver." + }, + { + "type": "uint32_t", + "name": "file_flags", + "comments": " see `git_merge_file_flag_t` above " + } + ], + "used": { + "returns": [], + "needs": [ + "git_cherrypick_commit", + "git_merge", + "git_merge_commits", + "git_merge_options_init", + "git_merge_trees", + "git_revert_commit" + ] + } + } + ], + [ + "git_merge_preference_t", + { + "decl": [ + "GIT_MERGE_PREFERENCE_NONE", + "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", + "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY" + ], + "type": "enum", + "file": "git2/merge.h", + "line": 368, + "lineto": 386, + "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", + "tdef": "typedef", + "description": " The user's stated preference for merges.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_NONE", + "comments": "

No configuration was found that suggests a preferred behavior for\n merge.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", + "comments": "

There is a merge.ff=false configuration setting, suggesting that\n the user does not want to allow a fast-forward merge.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", + "comments": "

There is a merge.ff=only configuration setting, suggesting that\n the user only wants fast-forward merges.

\n", + "value": 2 + } + ], + "used": { + "returns": [], + "needs": ["git_merge_analysis", "git_merge_analysis_for_ref"] + } + } + ], + [ + "git_message_trailer", + { + "decl": ["const char * key", "const char * value"], + "type": "struct", + "value": "git_message_trailer", + "file": "git2/message.h", + "line": 43, + "lineto": 46, + "block": "const char * key\nconst char * value", + "tdef": "typedef", + "description": " Represents a single git message trailer.", + "comments": "", + "fields": [ + { "type": "const char *", "name": "key", "comments": "" }, + { "type": "const char *", "name": "value", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_message_trailer_array_free", "git_message_trailers"] + } + } + ], + [ + "git_message_trailer_array", + { + "decl": [ + "git_message_trailer * trailers", + "size_t count", + "char * _trailer_block" + ], + "type": "struct", + "value": "git_message_trailer_array", + "file": "git2/message.h", + "line": 54, + "lineto": 60, + "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", + "tdef": "typedef", + "description": " Represents an array of git message trailers.", + "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", + "fields": [ + { + "type": "git_message_trailer *", + "name": "trailers", + "comments": "" + }, + { "type": "size_t", "name": "count", "comments": "" }, + { "type": "char *", "name": "_trailer_block", "comments": "" } + ], + "used": { + "returns": [], + "needs": ["git_message_trailer_array_free", "git_message_trailers"] + } + } + ], + [ + "git_midx_writer", + { + "decl": "git_midx_writer", + "type": "struct", + "value": "git_midx_writer", + "file": "git2/types.h", + "line": 100, + "lineto": 100, + "tdef": "typedef", + "description": " a writer for multi-pack-index files. ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_note", + { + "decl": "git_note", + "type": "struct", + "value": "git_note", + "file": "git2/types.h", + "line": 169, + "lineto": 169, + "tdef": "typedef", + "description": " Representation of a git note ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_note_author", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_committer", + "git_note_foreach", + "git_note_free", + "git_note_id", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_message", + "git_note_next", + "git_note_read" + ] + } + } + ], + [ + "git_note_iterator", + { + "decl": "git_note_iterator", + "type": "struct", + "value": "git_note_iterator", + "file": "git2/notes.h", + "line": 35, + "lineto": 35, + "tdef": "typedef", + "description": " note iterator", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_note_commit_iterator_new", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_next" + ] + } + } + ], + [ + "git_object", + { + "decl": "git_object", + "type": "struct", + "value": "git_object", + "file": "git2/types.h", + "line": 124, + "lineto": 124, + "tdef": "typedef", + "description": " Representation of a generic object in a repository ", + "comments": "", + "used": { + "returns": [ + "git_blob_rawsize", + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_checkout_tree", + "git_describe_commit", + "git_object__size", + "git_object_dup", + "git_object_free", + "git_object_id", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_owner", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_short_id", + "git_object_type", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile", + "git_reset", + "git_reset_default", + "git_revparse_ext", + "git_revparse_single", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_lightweight", + "git_tag_peel", + "git_tag_target", + "git_tree_entry_to_object" + ] + } + } + ], + [ + "git_object_t", + { + "decl": [ + "GIT_OBJECT_ANY", + "GIT_OBJECT_INVALID", + "GIT_OBJECT_COMMIT", + "GIT_OBJECT_TREE", + "GIT_OBJECT_BLOB", + "GIT_OBJECT_TAG", + "GIT_OBJECT_OFS_DELTA", + "GIT_OBJECT_REF_DELTA" + ], + "type": "enum", + "file": "git2/types.h", + "line": 73, + "lineto": 82, + "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", + "tdef": "typedef", + "description": " Basic type (loose or packed) of any Git object. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OBJECT_ANY", + "comments": "

Object can be any of the following

\n", + "value": -2 + }, + { + "type": "int", + "name": "GIT_OBJECT_INVALID", + "comments": "

Object is invalid.

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_OBJECT_COMMIT", + "comments": "

A commit object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_OBJECT_TREE", + "comments": "

A tree (directory listing) object.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_OBJECT_BLOB", + "comments": "

A file revision object.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_OBJECT_TAG", + "comments": "

An annotated tag object.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_OBJECT_OFS_DELTA", + "comments": "

A delta, base is given by an offset.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_OBJECT_REF_DELTA", + "comments": "

A delta, base is given by object id.

\n", + "value": 7 + } + ], + "used": { + "returns": [ + "git_object_string2type", + "git_object_type", + "git_odb_object_type", + "git_tag_target_type", + "git_tree_entry_type" + ], + "needs": [ + "git_object__size", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_type2string", + "git_object_typeisloose", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read_header", + "git_odb_write", + "git_reference_peel", + "git_repository_hashfile" + ] + } + } + ], + [ + "git_odb", + { + "decl": "git_odb", + "type": "struct", + "value": "git_odb", + "file": "git2/types.h", + "line": 85, + "lineto": 85, + "tdef": "typedef", + "description": " An open object database handle. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_indexer_new", + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_add_disk_alternate", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_foreach", + "git_odb_free", + "git_odb_get_backend", + "git_odb_num_backends", + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_refresh", + "git_odb_set_commit_graph", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write", + "git_odb_write", + "git_odb_write_multi_pack_index", + "git_odb_write_pack", + "git_repository_odb" + ] + } + } + ], + [ + "git_odb_backend", + { + "decl": "git_odb_backend", + "type": "struct", + "value": "git_odb_backend", + "file": "git2/types.h", + "line": 88, + "lineto": 88, + "tdef": "typedef", + "description": " A custom backend in an ODB ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_get_backend" + ] + } + } + ], + [ + "git_odb_backend_loose_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "int compression_level", + "unsigned int dir_mode", + "unsigned int file_mode", + "git_oid_t oid_type" + ], + "type": "struct", + "value": "git_odb_backend_loose_options", + "file": "git2/odb_backend.h", + "line": 93, + "lineto": 119, + "block": "unsigned int version\nuint32_t flags\nint compression_level\nunsigned int dir_mode\nunsigned int file_mode\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a loose object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of the `git_odb_backend_loose_flag_t` types. " + }, + { + "type": "int", + "name": "compression_level", + "comments": " zlib compression level to use (0-9), where 1 is the fastest\n at the expense of larger files, and 9 produces the best\n compression at the expense of speed. 0 indicates that no\n compression should be performed. -1 is the default (currently\n optimizing for speed)." + }, + { + "type": "unsigned int", + "name": "dir_mode", + "comments": " Permissions to use creating a directory or 0 for defaults " + }, + { + "type": "unsigned int", + "name": "file_mode", + "comments": " Permissions to use creating a file or 0 for defaults " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_backend_pack_options", + { + "decl": ["unsigned int version", "git_oid_t oid_type"], + "type": "struct", + "value": "git_odb_backend_pack_options", + "file": "git2/odb_backend.h", + "line": 28, + "lineto": 36, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a packfile object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_expand_id", + { + "decl": ["git_oid id", "unsigned short length", "git_object_t type"], + "type": "struct", + "value": "git_odb_expand_id", + "file": "git2/odb.h", + "line": 230, + "lineto": 245, + "block": "git_oid id\nunsigned short length\ngit_object_t type", + "tdef": "typedef", + "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", + "comments": "", + "fields": [ + { + "type": "git_oid", + "name": "id", + "comments": " The object ID to expand " + }, + { + "type": "unsigned short", + "name": "length", + "comments": " The length of the object ID (in nibbles, or packets of 4 bits; the\n number of hex characters)" + }, + { + "type": "git_object_t", + "name": "type", + "comments": " The (optional) type of the object to search for; leave as `0` or set\n to `GIT_OBJECT_ANY` to query for any object matching the ID." + } + ], + "used": { "returns": [], "needs": ["git_odb_expand_ids"] } + } + ], + [ + "git_odb_lookup_flags_t", + { + "decl": ["GIT_ODB_LOOKUP_NO_REFRESH"], + "type": "enum", + "file": "git2/odb.h", + "line": 26, + "lineto": 34, + "block": "GIT_ODB_LOOKUP_NO_REFRESH", + "tdef": "typedef", + "description": " Flags controlling the behavior of ODB lookup operations ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_ODB_LOOKUP_NO_REFRESH", + "comments": "

Don't call git_odb_refresh if the lookup fails. Useful when doing\n a batch of lookup operations for objects that may legitimately not\n exist. When using this flag, you may wish to manually call\n git_odb_refresh before processing a batch of objects.

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_object", + { + "decl": "git_odb_object", + "type": "struct", + "value": "git_odb_object", + "file": "git2/types.h", + "line": 91, + "lineto": 91, + "tdef": "typedef", + "description": " An object read from the ODB ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_read", + "git_odb_read_prefix" + ] + } + } + ], + [ + "git_odb_options", + { + "decl": ["unsigned int version", "git_oid_t oid_type"], + "type": "struct", + "value": "git_odb_options", + "file": "git2/odb.h", + "line": 42, + "lineto": 50, + "block": "unsigned int version\ngit_oid_t oid_type", + "tdef": "typedef", + "description": " Options for configuring a loose object backend. ", + "comments": "", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " version for the struct " + }, + { + "type": "git_oid_t", + "name": "oid_type", + "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_stream", + { + "decl": "git_odb_stream", + "type": "struct", + "value": "git_odb_stream", + "file": "git2/types.h", + "line": 94, + "lineto": 94, + "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_object_size_t declared_size\ngit_object_size_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", + "tdef": "typedef", + "description": " A stream to read/write from the ODB ", + "comments": "", + "fields": [ + { "type": "git_odb_backend *", "name": "backend", "comments": "" }, + { "type": "unsigned int", "name": "mode", "comments": "" }, + { "type": "void *", "name": "hash_ctx", "comments": "" }, + { + "type": "git_object_size_t", + "name": "declared_size", "comments": "" - }, - "git_reference_foreach_cb": { - "type": "callback", - "file": "git2/refs.h", - "line": 437, - "lineto": 437, - "args": [ - { - "name": "reference", - "type": "git_reference *", - "comment": "The reference object" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_reference_foreach" - } - ], - "argline": "git_reference *reference, void *payload", - "sig": "git_reference *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over references

\n", + }, + { + "type": "git_object_size_t", + "name": "received_bytes", "comments": "" - }, - "git_reference_foreach_name_cb": { - "type": "callback", - "file": "git2/refs.h", - "line": 448, - "lineto": 448, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The reference name" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_reference_foreach_name" - } - ], - "argline": "const char *name, void *payload", - "sig": "const char *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over reference names

\n", + }, + { + "type": "int (*)(git_odb_stream *, char *, size_t)", + "name": "read", "comments": "" - }, - "git_push_transfer_progress_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 459, - "lineto": 463, - "args": [ - { - "name": "current", - "type": "unsigned int", - "comment": null - }, - { - "name": "total", - "type": "unsigned int", - "comment": null - }, - { - "name": "bytes", - "type": "size_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "unsigned int current, unsigned int total, size_t bytes, void *payload", - "sig": "unsigned int::unsigned int::size_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Push network progress notification function

\n", + }, + { + "type": "int (*)(git_odb_stream *, const char *, size_t)", + "name": "write", "comments": "" - }, - "git_push_negotiation": { - "type": "callback", - "file": "git2/remote.h", - "line": 495, - "lineto": 495, - "args": [ - { - "name": "updates", - "type": "const git_push_update **", - "comment": "an array containing the updates which will be sent\n as commands to the destination." - }, - { - "name": "len", - "type": "size_t", - "comment": "number of elements in `updates`" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "const git_push_update **updates, size_t len, void *payload", - "sig": "const git_push_update **::size_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback used to inform of upcoming updates.

\n", + }, + { + "type": "int (*)(git_odb_stream *, const git_oid *)", + "name": "finalize_write", "comments": "" - }, - "git_push_update_reference_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 509, - "lineto": 509, - "args": [ - { - "name": "refname", - "type": "const char *", - "comment": "refname specifying to the remote ref" - }, - { - "name": "status", - "type": "const char *", - "comment": "status message sent from the remote" - }, - { - "name": "data", - "type": "void *", - "comment": "data provided by the caller" - } - ], - "argline": "const char *refname, const char *status, void *data", - "sig": "const char *::const char *::void *", - "return": { - "type": "int", - "comment": " 0 on success, otherwise an error" - }, - "description": "

Callback used to inform of the update status from the remote.

\n", - "comments": "

Called for each updated reference on push. If status is not NULL, the update was rejected by the remote server and status contains the reason given.

\n" - }, - "git_url_resolve_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 525, - "lineto": 525, - "args": [ - { - "name": "url_resolved", - "type": "git_buf *", - "comment": "The buffer to write the resolved URL to" - }, - { - "name": "url", - "type": "const char *", - "comment": "The URL to resolve" - }, - { - "name": "direction", - "type": "int", - "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "git_buf *url_resolved, const char *url, int direction, void *payload", - "sig": "git_buf *::const char *::int::void *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_PASSTHROUGH or an error\n " - }, - "description": "

Callback to resolve URLs before connecting to remote

\n", - "comments": "

If you return GIT_PASSTHROUGH, you don't need to write anything to url_resolved.

\n" - }, - "git_remote_ready_cb": { - "type": "callback", - "file": "git2/remote.h", - "line": 538, - "lineto": 538, - "args": [ - { - "name": "remote", - "type": "git_remote *", - "comment": "The remote to be connected" - }, - { - "name": "direction", - "type": "int", - "comment": "GIT_DIRECTION_FETCH or GIT_DIRECTION_PUSH" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "git_remote *remote, int direction, void *payload", - "sig": "git_remote *::int::void *", - "return": { - "type": "int", - "comment": " 0 on success, or an error" - }, - "description": "

Callback invoked immediately before we attempt to connect to the\n given url. Callers may change the URL before the connection by\n calling git_remote_set_instance_url in the callback.

\n", + }, + { + "type": "void (*)(git_odb_stream *)", + "name": "free", "comments": "" - }, - "git_repository_fetchhead_foreach_cb": { - "type": "callback", - "file": "git2/repository.h", - "line": 724, - "lineto": 728, - "args": [ - { - "name": "ref_name", - "type": "const char *", - "comment": "The reference name" - }, - { - "name": "remote_url", - "type": "const char *", - "comment": "The remote URL" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "The reference target OID" - }, - { - "name": "is_merge", - "type": "unsigned int", - "comment": "Was the reference the result of a merge" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_repository_fetchhead_foreach" - } - ], - "argline": "const char *ref_name, const char *remote_url, const git_oid *oid, unsigned int is_merge, void *payload", - "sig": "const char *::const char *::const git_oid *::unsigned int::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over each FETCH_HEAD entry

\n", + } + ], + "used": { + "returns": [], + "needs": [ + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write" + ] + } + } + ], + [ + "git_odb_stream_t", + { + "decl": ["GIT_STREAM_RDONLY", "GIT_STREAM_WRONLY", "GIT_STREAM_RW"], + "type": "enum", + "file": "git2/odb_backend.h", + "line": 155, + "lineto": 159, + "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", + "tdef": "typedef", + "description": " Streaming mode ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STREAM_RDONLY", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STREAM_WRONLY", + "comments": "", + "value": 4 + }, + { "type": "int", "name": "GIT_STREAM_RW", "comments": "", "value": 6 } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_odb_writepack", + { + "decl": "git_odb_writepack", + "type": "struct", + "value": "git_odb_writepack", + "file": "git2/types.h", + "line": 97, + "lineto": 97, + "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", + "tdef": "typedef", + "description": " A stream to write a packfile to the ODB ", + "comments": "", + "fields": [ + { "type": "git_odb_backend *", "name": "backend", "comments": "" }, + { + "type": "int (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *)", + "name": "append", "comments": "" - }, - "git_repository_mergehead_foreach_cb": { - "type": "callback", - "file": "git2/repository.h", - "line": 755, - "lineto": 756, - "args": [ - { - "name": "oid", - "type": "const git_oid *", - "comment": "The merge OID" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_repository_mergehead_foreach" - } - ], - "argline": "const git_oid *oid, void *payload", - "sig": "const git_oid *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over each MERGE_HEAD entry

\n", + }, + { + "type": "int (*)(git_odb_writepack *, git_indexer_progress *)", + "name": "commit", "comments": "" - }, - "git_revwalk_hide_cb": { - "type": "callback", - "file": "git2/revwalk.h", - "line": 283, - "lineto": 285, - "args": [ - { - "name": "commit_id", - "type": "const git_oid *", - "comment": "oid of Commit" - }, - { - "name": "payload", - "type": "void *", - "comment": "User-specified pointer to data to be passed as data payload" - } - ], - "argline": "const git_oid *commit_id, void *payload", - "sig": "const git_oid *::void *", - "return": { - "type": "int", - "comment": " non-zero to hide the commmit and it parent." - }, - "description": "

This is a callback function that user can provide to hide a\n commit and its parents. If the callback function returns non-zero value,\n then this commit and its parents will be hidden.

\n", + }, + { + "type": "void (*)(git_odb_writepack *)", + "name": "free", "comments": "" - }, - "git_stash_apply_progress_cb": { - "type": "callback", - "file": "git2/stash.h", - "line": 169, - "lineto": 171, - "args": [ - { - "name": "progress", - "type": "git_stash_apply_progress_t", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "git_stash_apply_progress_t progress, void *payload", - "sig": "git_stash_apply_progress_t::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Stash application progress notification function.\n Return 0 to continue processing, or a negative value to\n abort the stash application.

\n", + } + ], + "used": { "returns": [], "needs": ["git_odb_write_pack"] } + } + ], + [ + "git_oid", + { + "decl": ["unsigned char [20] id"], + "type": "struct", + "value": "git_oid", + "file": "git2/oid.h", + "line": 99, + "lineto": 108, + "block": "unsigned char [20] id", + "tdef": "typedef", + "description": " Unique identity of any object (commit, tree, blob, tag). ", + "comments": "", + "fields": [ + { + "type": "unsigned char [20]", + "name": "id", + "comments": " raw binary formatted id " + } + ], + "used": { + "returns": [ + "git_annotated_commit_id", + "git_blob_id", + "git_commit_id", + "git_commit_parent_id", + "git_commit_tree_id", + "git_index_checksum", + "git_indexer_hash", + "git_note_id", + "git_object_id", + "git_odb_object_id", + "git_oid_shorten_new", + "git_packbuilder_hash", + "git_rebase_onto_id", + "git_rebase_orig_head_id", + "git_reference_target", + "git_reference_target_peel", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_repository_oid_type", + "git_submodule_head_id", + "git_submodule_index_id", + "git_submodule_wd_id", + "git_tag_id", + "git_tag_target_id", + "git_tree_entry_id", + "git_tree_id" + ], + "needs": [ + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_lookup", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_commit_amend", + "git_commit_create", + "git_commit_create_cb", + "git_commit_create_from_stage", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_extract_signature", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_diff_patchid", + "git_email_create_from_diff", + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any", + "git_index_write_tree", + "git_index_write_tree_to", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_note_commit_create", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_create", + "git_note_foreach_cb", + "git_note_next", + "git_note_read", + "git_note_remove", + "git_object_lookup", + "git_object_lookup_prefix", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_foreach_cb", + "git_odb_open_rstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_stream_finalize_write", + "git_odb_write", + "git_oid_cmp", + "git_oid_cpy", + "git_oid_equal", + "git_oid_fmt", + "git_oid_is_zero", + "git_oid_ncmp", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_strcmp", + "git_oid_streq", + "git_oid_tostr", + "git_oid_tostr_s", + "git_oidarray_dispose", + "git_oidarray_free", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_rebase_commit", + "git_reference_create", + "git_reference_create_matching", + "git_reference_name_to_id", + "git_reference_set_target", + "git_reflog_append", + "git_repository_fetchhead_foreach_cb", + "git_repository_hashfile", + "git_repository_mergehead_foreach_cb", + "git_repository_set_head_detached", + "git_revwalk_hide", + "git_revwalk_hide_cb", + "git_revwalk_next", + "git_revwalk_push", + "git_stash_cb", + "git_stash_save", + "git_stash_save_with_opts", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_foreach_cb", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_transaction_set_target", + "git_tree_create_updated", + "git_tree_entry_byid", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_treebuilder_insert", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + } + } + ], + [ + "git_oid_shorten", + { + "decl": "git_oid_shorten", + "type": "struct", + "value": "git_oid_shorten", + "file": "git2/oid.h", + "line": 320, + "lineto": 320, + "tdef": "typedef", + "description": " OID Shortener object", + "comments": "", + "used": { + "returns": ["git_oid_shorten_new"], + "needs": ["git_oid_shorten_add", "git_oid_shorten_free"] + } + } + ], + [ + "git_oid_t", + { + "decl": ["GIT_OID_SHA1"], + "type": "enum", + "file": "git2/oid.h", + "line": 24, + "lineto": 33, + "block": "GIT_OID_SHA1", + "tdef": "typedef", + "description": " The type of object id. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_OID_SHA1", + "comments": "

SHA1

\n", + "value": 1 + } + ], + "used": { "returns": ["git_repository_oid_type"], "needs": [] } + } + ], + [ + "git_oidarray", + { + "decl": ["git_oid * ids", "size_t count"], + "type": "struct", + "value": "git_oidarray", + "file": "git2/oidarray.h", + "line": 16, + "lineto": 19, + "block": "git_oid * ids\nsize_t count", + "tdef": "typedef", + "description": " Array of object ids ", + "comments": "", + "fields": [ + { "type": "git_oid *", "name": "ids", "comments": "" }, + { "type": "size_t", "name": "count", "comments": "" } + ], + "used": { + "returns": [], + "needs": [ + "git_merge_bases", + "git_merge_bases_many", + "git_oidarray_dispose", + "git_oidarray_free" + ] + } + } + ], + [ + "git_packbuilder", + { + "decl": "git_packbuilder", + "type": "struct", + "value": "git_packbuilder", + "file": "git2/types.h", + "line": 172, + "lineto": 172, + "tdef": "typedef", + "description": " Representation of a git packbuilder ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_packbuilder_foreach", + "git_packbuilder_free", + "git_packbuilder_hash", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_walk", + "git_packbuilder_name", + "git_packbuilder_new", + "git_packbuilder_object_count", + "git_packbuilder_set_callbacks", + "git_packbuilder_set_threads", + "git_packbuilder_write", + "git_packbuilder_write_buf", + "git_packbuilder_written" + ] + } + } + ], + [ + "git_packbuilder_stage_t", + { + "decl": [ + "GIT_PACKBUILDER_ADDING_OBJECTS", + "GIT_PACKBUILDER_DELTAFICATION" + ], + "type": "enum", + "file": "git2/pack.h", + "line": 52, + "lineto": 55, + "block": "GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION", + "tdef": "typedef", + "description": " Stages that are reported by the packbuilder progress callback.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PACKBUILDER_ADDING_OBJECTS", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PACKBUILDER_DELTAFICATION", + "comments": "", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_patch", + { + "decl": "git_patch", + "type": "struct", + "value": "git_patch", + "file": "git2/patch.h", + "line": 29, + "lineto": 29, + "tdef": "typedef", + "description": " The diff patch is used to store all the text diffs for a delta.", + "comments": "

You can easily loop over the content of patches and get information about them.

\n", + "used": { + "returns": [], + "needs": [ + "git_patch_free", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_delta", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_line_stats", + "git_patch_num_hunks", + "git_patch_num_lines_in_hunk", + "git_patch_owner", + "git_patch_print", + "git_patch_size", + "git_patch_to_buf" + ] + } + } + ], + [ + "git_path_fs", + { + "decl": ["GIT_PATH_FS_GENERIC", "GIT_PATH_FS_NTFS", "GIT_PATH_FS_HFS"], + "type": "enum", + "file": "git2/sys/path.h", + "line": 34, + "lineto": 41, + "block": "GIT_PATH_FS_GENERIC\nGIT_PATH_FS_NTFS\nGIT_PATH_FS_HFS", + "tdef": "typedef", + "description": " The kinds of checks to perform according to which filesystem we are trying to\n protect.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PATH_FS_GENERIC", + "comments": "

Do both NTFS- and HFS-specific checks

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATH_FS_NTFS", + "comments": "

Do NTFS-specific checks only

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATH_FS_HFS", + "comments": "

Do HFS-specific checks only

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_pathspec", + { + "decl": "git_pathspec", + "type": "struct", + "value": "git_pathspec", + "file": "git2/pathspec.h", + "line": 20, + "lineto": 20, + "tdef": "typedef", + "description": " Compiled pathspec", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_pathspec_free", + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir", + "git_pathspec_matches_path", + "git_pathspec_new" + ] + } + } + ], + [ + "git_pathspec_flag_t", + { + "decl": [ + "GIT_PATHSPEC_DEFAULT", + "GIT_PATHSPEC_IGNORE_CASE", + "GIT_PATHSPEC_USE_CASE", + "GIT_PATHSPEC_NO_GLOB", + "GIT_PATHSPEC_NO_MATCH_ERROR", + "GIT_PATHSPEC_FIND_FAILURES", + "GIT_PATHSPEC_FAILURES_ONLY" + ], + "type": "enum", + "file": "git2/pathspec.h", + "line": 30, + "lineto": 73, + "block": "GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY", + "tdef": "typedef", + "description": " Options controlling how pathspec match should be executed", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PATHSPEC_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_IGNORE_CASE", + "comments": "

GIT_PATHSPEC_IGNORE_CASE forces match to ignore case; otherwise\n match will use native case sensitivity of platform filesystem

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_USE_CASE", + "comments": "

GIT_PATHSPEC_USE_CASE forces case sensitive match; otherwise\n match will use native case sensitivity of platform filesystem

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_NO_GLOB", + "comments": "

GIT_PATHSPEC_NO_GLOB disables glob patterns and just uses simple\n string comparison for matching

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_NO_MATCH_ERROR", + "comments": "

GIT_PATHSPEC_NO_MATCH_ERROR means the match functions return error\n code GIT_ENOTFOUND if no matches are found; otherwise no matches is\n still success (return 0) but git_pathspec_match_list_entrycount\n will indicate 0 matches.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_FIND_FAILURES", + "comments": "

GIT_PATHSPEC_FIND_FAILURES means that the git_pathspec_match_list\n should track which patterns matched which files so that at the end of\n the match we can identify patterns that did not match any files.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_PATHSPEC_FAILURES_ONLY", + "comments": "

GIT_PATHSPEC_FAILURES_ONLY means that the git_pathspec_match_list\n does not need to keep the actual matching filenames. Use this to\n just test if there were any matches at all or in combination with\n GIT_PATHSPEC_FIND_FAILURES to validate a pathspec.

\n", + "value": 32 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_pathspec_match_list", + { + "decl": "git_pathspec_match_list", + "type": "struct", + "value": "git_pathspec_match_list", + "file": "git2/pathspec.h", + "line": 25, + "lineto": 25, + "tdef": "typedef", + "description": " List of filenames matching a pathspec", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir" + ] + } + } + ], + [ + "git_proxy_options", + { + "decl": [ + "unsigned int version", + "git_proxy_t type", + "const char * url", + "git_credential_acquire_cb credentials", + "git_transport_certificate_check_cb certificate_check", + "void * payload" + ], + "type": "struct", + "value": "git_proxy_options", + "file": "git2/proxy.h", + "line": 44, + "lineto": 79, + "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", + "tdef": "typedef", + "description": " Options for connecting through a proxy", + "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_proxy_t", + "name": "type", + "comments": " The type of proxy to use, by URL, auto-detect." + }, + { + "type": "const char *", + "name": "url", + "comments": " The URL of the proxy." + }, + { + "type": "git_credential_acquire_cb", + "name": "credentials", + "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." + }, + { + "type": "git_transport_certificate_check_cb", + "name": "certificate_check", + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." + }, + { + "type": "void *", + "name": "payload", + "comments": " Payload to be provided to the credentials and certificate\n check callbacks." + } + ], + "used": { + "returns": [], + "needs": ["git_proxy_options_init", "git_remote_connect"] + } + } + ], + [ + "git_proxy_t", + { + "decl": ["GIT_PROXY_NONE", "GIT_PROXY_AUTO", "GIT_PROXY_SPECIFIED"], + "type": "enum", + "file": "git2/proxy.h", + "line": 20, + "lineto": 36, + "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", + "tdef": "typedef", + "description": " The type of proxy to use.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_PROXY_NONE", + "comments": "

Do not attempt to connect through a proxy

\n\n

If built against libcurl, it itself may attempt to connect\n to a proxy if the environment variables specify it.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_PROXY_AUTO", + "comments": "

Try to auto-detect the proxy from the git configuration.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_PROXY_SPECIFIED", + "comments": "

Connect via the URL given in the options

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_push", + { + "decl": "git_push", + "type": "struct", + "value": "git_push", + "file": "git2/types.h", + "line": 253, + "lineto": 253, + "tdef": "typedef", + "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_push_negotiation", + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + } + } + ], + [ + "git_push_options", + { + "decl": [ + "unsigned int version", + "unsigned int pb_parallelism", + "git_remote_callbacks callbacks", + "git_proxy_options proxy_opts", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers", + "git_strarray remote_push_options" + ], + "type": "struct", + "value": "git_push_options", + "file": "git2/remote.h", + "line": 814, + "lineto": 853, + "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers\ngit_strarray remote_push_options", + "tdef": "typedef", + "description": " Controls the behavior of a git_push object.", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "pb_parallelism", + "comments": " If the transport being used to push to the remote requires the creation\n of a pack file, this controls the number of worker threads used by\n the packbuilder when creating that pack file to be sent to the remote.\n\n If set to 0, the packbuilder will auto-detect the number of threads\n to create. The default value is 1." + }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this push operation" + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " Proxy options to use, by default no proxy is used." + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra headers for this push operation" + }, + { + "type": "git_strarray", + "name": "remote_push_options", + "comments": " \"Push options\" to deliver to the remote." + } + ], + "used": { + "returns": [], + "needs": [ + "git_push_options_init", + "git_remote_push", + "git_remote_upload" + ] + } + } + ], + [ + "git_push_update", + { + "decl": [ + "char * src_refname", + "char * dst_refname", + "git_oid src", + "git_oid dst" + ], + "type": "struct", + "value": "git_push_update", + "file": "git2/remote.h", + "line": 479, + "lineto": 496, + "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", + "tdef": "typedef", + "description": " Represents an update which will be performed on the remote during push", + "comments": "", + "fields": [ + { + "type": "char *", + "name": "src_refname", + "comments": " The source name of the reference" + }, + { + "type": "char *", + "name": "dst_refname", + "comments": " The name of the reference to update on the server" + }, + { + "type": "git_oid", + "name": "src", + "comments": " The current target of the reference" + }, + { + "type": "git_oid", + "name": "dst", + "comments": " The new target for the reference" + } + ], + "used": { "returns": [], "needs": ["git_push_negotiation"] } + } + ], + [ + "git_rebase", + { + "decl": "git_rebase", + "type": "struct", + "value": "git_rebase", + "file": "git2/types.h", + "line": 204, + "lineto": 204, + "tdef": "typedef", + "description": " Representation of a rebase ", + "comments": "", + "used": { + "returns": ["git_rebase_operation_byindex"], + "needs": [ + "git_rebase_abort", + "git_rebase_commit", + "git_rebase_finish", + "git_rebase_free", + "git_rebase_init", + "git_rebase_inmemory_index", + "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", + "git_rebase_open", + "git_rebase_operation_byindex", + "git_rebase_operation_current", + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" + ] + } + } + ], + [ + "git_rebase_operation", + { + "decl": [ + "git_rebase_operation_t type", + "const git_oid id", + "const char * exec" + ], + "type": "struct", + "value": "git_rebase_operation", + "file": "git2/rebase.h", + "line": 172, + "lineto": 187, + "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", + "tdef": "typedef", + "description": " A rebase operation", + "comments": "

Describes a single instruction/operation to be performed during the rebase.

\n", + "fields": [ + { + "type": "git_rebase_operation_t", + "name": "type", + "comments": " The type of rebase operation. " + }, + { + "type": "const git_oid", + "name": "id", + "comments": " The commit ID being cherry-picked. This will be populated for\n all operations except those of type `GIT_REBASE_OPERATION_EXEC`." + }, + { + "type": "const char *", + "name": "exec", + "comments": " The executable the user has requested be run. This will only\n be populated for operations of type `GIT_REBASE_OPERATION_EXEC`." + } + ], + "used": { + "returns": ["git_rebase_operation_byindex"], + "needs": ["git_rebase_next"] + } + } + ], + [ + "git_rebase_operation_t", + { + "decl": [ + "GIT_REBASE_OPERATION_PICK", + "GIT_REBASE_OPERATION_REWORD", + "GIT_REBASE_OPERATION_EDIT", + "GIT_REBASE_OPERATION_SQUASH", + "GIT_REBASE_OPERATION_FIXUP", + "GIT_REBASE_OPERATION_EXEC" + ], + "type": "enum", + "file": "git2/rebase.h", + "line": 120, + "lineto": 156, + "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", + "tdef": "typedef", + "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REBASE_OPERATION_PICK", + "comments": "

The given commit is to be cherry-picked. The client should commit\n the changes and continue if there are no conflicts.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_REWORD", + "comments": "

The given commit is to be cherry-picked, but the client should prompt\n the user to provide an updated commit message.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_EDIT", + "comments": "

The given commit is to be cherry-picked, but the client should stop\n to allow the user to edit the changes before committing them.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_SQUASH", + "comments": "

The given commit is to be squashed into the previous commit. The\n commit message will be merged with the previous message.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_FIXUP", + "comments": "

The given commit is to be squashed into the previous commit. The\n commit message from this commit will be discarded.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REBASE_OPERATION_EXEC", + "comments": "

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n", + "value": 5 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_rebase_options", + { + "decl": [ + "unsigned int version", + "int quiet", + "int inmemory", + "const char * rewrite_notes_ref", + "git_merge_options merge_options", + "git_checkout_options checkout_options", + "git_commit_create_cb commit_create_cb", + "int (*)(git_buf *, git_buf *, const char *, void *) signing_cb", + "void * payload" + ], + "type": "struct", + "value": "git_rebase_options", + "file": "git2/rebase.h", + "line": 32, + "lineto": 115, + "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_create_cb commit_create_cb\nint (*)(git_buf *, git_buf *, const char *, void *) signing_cb\nvoid * payload", + "tdef": "typedef", + "description": " Rebase options", + "comments": "

Use to tell the rebase machinery how to operate.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "int", + "name": "quiet", + "comments": " Used by `git_rebase_init`, this will instruct other clients working\n on this rebase that you want a quiet rebase experience, which they\n may choose to provide in an application-specific manner. This has no\n effect upon libgit2 directly, but is provided for interoperability\n between Git tools." + }, + { + "type": "int", + "name": "inmemory", + "comments": " Used by `git_rebase_init`, this will begin an in-memory rebase,\n which will allow callers to step through the rebase operations and\n commit the rebased changes, but will not rewind HEAD or update the\n repository to be in a rebasing state. This will not interfere with\n the working directory (if there is one)." + }, + { + "type": "const char *", + "name": "rewrite_notes_ref", + "comments": " Used by `git_rebase_finish`, this is the name of the notes reference\n used to rewrite notes for rebased commits when finishing the rebase;\n if NULL, the contents of the configuration option `notes.rewriteRef`\n is examined, unless the configuration option `notes.rewrite.rebase`\n is set to false. If `notes.rewriteRef` is also NULL, notes will\n not be rewritten." + }, + { + "type": "git_merge_options", + "name": "merge_options", + "comments": " Options to control how trees are merged during `git_rebase_next`." + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." + }, + { + "type": "git_commit_create_cb", + "name": "commit_create_cb", + "comments": " Optional callback that allows users to override commit\n creation in `git_rebase_commit`. If specified, users can\n create their own commit and provide the commit ID, which\n may be useful for signing commits or otherwise customizing\n the commit creation.\n\n If this callback returns `GIT_PASSTHROUGH`, then\n `git_rebase_commit` will continue to create the commit." + }, + { + "type": "int (*)(git_buf *, git_buf *, const char *, void *)", + "name": "signing_cb", + "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n\n This field is only used when performing git_rebase_commit.\n\n This callback is not invoked if a `git_commit_create_cb` is\n specified.\n\n This callback is deprecated; users should provide a\n creation callback as `commit_create_cb` that produces a\n commit buffer, signs it, and commits it." + }, + { + "type": "void *", + "name": "payload", + "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." + } + ], + "used": { + "returns": [], + "needs": [ + "git_rebase_init", + "git_rebase_open", + "git_rebase_options_init" + ] + } + } + ], + [ + "git_refdb", + { + "decl": "git_refdb", + "type": "struct", + "value": "git_refdb", + "file": "git2/types.h", + "line": 103, + "lineto": 103, + "tdef": "typedef", + "description": " An open refs database handle. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_refdb_compress", + "git_refdb_free", + "git_refdb_new", + "git_refdb_open", + "git_repository_refdb" + ] + } + } + ], + [ + "git_refdb_backend", + { + "decl": "git_refdb_backend", + "type": "struct", + "value": "git_refdb_backend", + "file": "git2/types.h", + "line": 106, + "lineto": 106, + "tdef": "typedef", + "description": " A custom backend for refs ", + "comments": "", + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_reference", + { + "decl": "git_reference", + "type": "struct", + "value": "git_reference", + "file": "git2/types.h", + "line": 189, + "lineto": 189, + "tdef": "typedef", + "description": " In-memory representation of a reference. ", + "comments": "", + "used": { + "returns": ["git_reference_type"], + "needs": [ + "git_annotated_commit_from_ref", + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_is_checked_out", + "git_branch_is_head", + "git_branch_lookup", + "git_branch_move", + "git_branch_name", + "git_branch_next", + "git_branch_set_upstream", + "git_branch_upstream", + "git_merge_analysis_for_ref", + "git_reference_cmp", + "git_reference_create", + "git_reference_create_matching", + "git_reference_delete", + "git_reference_dup", + "git_reference_dwim", + "git_reference_foreach", + "git_reference_foreach_cb", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_free", + "git_reference_is_branch", + "git_reference_is_note", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_lookup", + "git_reference_name", + "git_reference_next", + "git_reference_next_name", + "git_reference_owner", + "git_reference_peel", + "git_reference_rename", + "git_reference_resolve", + "git_reference_set_target", + "git_reference_shorthand", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_set_target", + "git_reference_symbolic_target", + "git_reference_target", + "git_reference_target_peel", + "git_reference_type", + "git_repository_head", + "git_repository_head_for_worktree", + "git_revparse_ext" + ] + } + } + ], + [ + "git_reference_format_t", + { + "decl": [ + "GIT_REFERENCE_FORMAT_NORMAL", + "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND" + ], + "type": "enum", + "file": "git2/refs.h", + "line": 661, + "lineto": 690, + "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "tdef": "typedef", + "description": " Normalization options for reference lookup", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_NORMAL", + "comments": "

No particular normalization.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", + "comments": "

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", + "comments": "

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", + "comments": "

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_reference_iterator", + { + "decl": "git_reference_iterator", + "type": "struct", + "value": "git_reference_iterator", + "file": "git2/types.h", + "line": 192, + "lineto": 192, + "tdef": "typedef", + "description": " Iterator for references ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_next", + "git_reference_next_name" + ] + } + } + ], + [ + "git_reference_t", + { + "decl": [ + "GIT_REFERENCE_INVALID", + "GIT_REFERENCE_DIRECT", + "GIT_REFERENCE_SYMBOLIC", + "GIT_REFERENCE_ALL" + ], + "type": "enum", + "file": "git2/types.h", + "line": 207, + "lineto": 212, + "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", + "tdef": "typedef", + "description": " Basic type of any Git reference. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REFERENCE_INVALID", + "comments": "

Invalid reference

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REFERENCE_DIRECT", + "comments": "

A reference that points at an object id

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REFERENCE_SYMBOLIC", + "comments": "

A reference that points at another reference

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REFERENCE_ALL", + "comments": "", + "value": 3 + } + ], + "used": { "returns": ["git_reference_type"], "needs": [] } + } + ], + [ + "git_reflog", + { + "decl": "git_reflog", + "type": "struct", + "value": "git_reflog", + "file": "git2/types.h", + "line": 166, + "lineto": 166, + "tdef": "typedef", + "description": " Representation of a reference log ", + "comments": "", + "used": { + "returns": ["git_reflog_entry_byindex"], + "needs": [ + "git_reflog_append", + "git_reflog_drop", + "git_reflog_entry_byindex", + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message", + "git_reflog_entrycount", + "git_reflog_free", + "git_reflog_read", + "git_reflog_write", + "git_transaction_set_reflog" + ] + } + } + ], + [ + "git_reflog_entry", + { + "decl": "git_reflog_entry", + "type": "struct", + "value": "git_reflog_entry", + "file": "git2/types.h", + "line": 163, + "lineto": 163, + "tdef": "typedef", + "description": " Representation of a reference log entry ", + "comments": "", + "used": { + "returns": ["git_reflog_entry_byindex"], + "needs": [ + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message" + ] + } + } + ], + [ + "git_refspec", + { + "decl": "git_refspec", + "type": "struct", + "value": "git_refspec", + "file": "git2/types.h", + "line": 235, + "lineto": 235, + "tdef": "typedef", + "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", + "comments": "", + "used": { + "returns": ["git_remote_get_refspec"], + "needs": [ + "git_refspec_direction", + "git_refspec_dst", + "git_refspec_dst_matches", + "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", + "git_refspec_rtransform", + "git_refspec_src", + "git_refspec_src_matches", + "git_refspec_string", + "git_refspec_transform" + ] + } + } + ], + [ + "git_remote", + { + "decl": "git_remote", + "type": "struct", + "value": "git_remote", + "file": "git2/types.h", + "line": 241, + "lineto": 241, + "tdef": "typedef", + "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entries).", + "comments": "", + "used": { + "returns": ["git_remote_autotag"], + "needs": [ + "git_headlist_cb", + "git_remote_autotag", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_connect_options_init", + "git_remote_connected", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_cb", + "git_remote_create_detached", + "git_remote_create_options_init", + "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", + "git_remote_default_branch", + "git_remote_disconnect", + "git_remote_download", + "git_remote_dup", + "git_remote_fetch", + "git_remote_free", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_get_refspec", + "git_remote_init_callbacks", + "git_remote_lookup", + "git_remote_ls", + "git_remote_name", + "git_remote_owner", + "git_remote_prune", + "git_remote_prune_refs", + "git_remote_push", + "git_remote_pushurl", + "git_remote_ready_cb", + "git_remote_refspec_count", + "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", + "git_remote_stats", + "git_remote_stop", + "git_remote_update_tips", + "git_remote_upload", + "git_remote_url", + "git_transport_cb" + ] + } + } + ], + [ + "git_remote_autotag_option_t", + { + "decl": [ + "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", + "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", + "GIT_REMOTE_DOWNLOAD_TAGS_NONE", + "GIT_REMOTE_DOWNLOAD_TAGS_ALL" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 696, + "lineto": 714, + "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", + "tdef": "typedef", + "description": " Automatic tag following option", + "comments": "

Lets us select the --tags option to use.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", + "comments": "

Use the setting from the configuration.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", + "comments": "

Ask the server for tags pointing to objects we're already\n downloading.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_NONE", + "comments": "

Don't ask for any tags beyond the refspecs.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REMOTE_DOWNLOAD_TAGS_ALL", + "comments": "

Ask for the all the tags.

\n", + "value": 3 + } + ], + "used": { + "returns": ["git_remote_autotag"], + "needs": ["git_remote_set_autotag", "git_remote_update_tips"] + } + } + ], + [ + "git_remote_callbacks", + { + "decl": [ + "unsigned int version", + "git_transport_message_cb sideband_progress", + "int (*)(git_remote_completion_t, void *) completion", + "git_credential_acquire_cb credentials", + "git_transport_certificate_check_cb certificate_check", + "git_indexer_progress_cb transfer_progress", + "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", + "git_packbuilder_progress pack_progress", + "git_push_transfer_progress_cb push_transfer_progress", + "git_push_update_reference_cb push_update_reference", + "git_push_negotiation push_negotiation", + "git_transport_cb transport", + "git_remote_ready_cb remote_ready", + "void * payload", + "git_url_resolve_cb resolve_url" + ], + "type": "struct", + "value": "git_remote_callbacks", + "file": "git2/remote.h", + "line": 557, + "lineto": 658, + "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url", + "tdef": null, + "description": " The callback settings structure", + "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The version " + }, + { + "type": "git_transport_message_cb", + "name": "sideband_progress", + "comments": " Textual progress from the remote. Text send over the\n progress side-band will be passed to this function (this is\n the 'counting objects' output)." + }, + { + "type": "int (*)(git_remote_completion_t, void *)", + "name": "completion", "comments": "" - }, - "git_stash_cb": { - "type": "callback", - "file": "git2/stash.h", - "line": 255, - "lineto": 259, - "args": [ - { - "name": "index", - "type": "size_t", - "comment": "The position within the stash list. 0 points to the\n most recent stashed state." - }, - { - "name": "message", - "type": "const char *", - "comment": "The stash message." - }, - { - "name": "stash_id", - "type": "const git_oid *", - "comment": "The commit oid of the stashed state." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra parameter to callback function." - } - ], - "argline": "size_t index, const char *message, const git_oid *stash_id, void *payload", - "sig": "size_t::const char *::const git_oid *::void *", - "return": { - "type": "int", - "comment": " 0 to continue iterating or non-zero to stop." - }, - "description": "

This is a callback function you can provide to iterate over all the\n stashed states that will be invoked per entry.

\n", + }, + { + "type": "git_credential_acquire_cb", + "name": "credentials", + "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." + }, + { + "type": "git_transport_certificate_check_cb", + "name": "certificate_check", + "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." + }, + { + "type": "git_indexer_progress_cb", + "name": "transfer_progress", + "comments": " During the download of new data, this will be regularly\n called with the current count of progress done by the\n indexer." + }, + { + "type": "int (*)(const char *, const git_oid *, const git_oid *, void *)", + "name": "update_tips", "comments": "" - }, - "git_status_cb": { - "type": "callback", - "file": "git2/status.h", - "line": 63, - "lineto": 64, - "args": [ - { - "name": "path", - "type": "const char *", - "comment": null - }, - { - "name": "status_flags", - "type": "unsigned int", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *path, unsigned int status_flags, void *payload", - "sig": "const char *::unsigned int::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Function pointer to receive status on individual files

\n", - "comments": "

path is the relative path to the file from the root of the repository.

\n\n

status_flags is a combination of git_status_t values that apply.

\n\n

payload is the value you passed to the foreach function as payload.

\n" - }, - "git_submodule_cb": { - "type": "callback", - "file": "git2/submodule.h", - "line": 118, - "lineto": 119, - "args": [ - { - "name": "sm", - "type": "git_submodule *", - "comment": "git_submodule currently being visited" - }, - { - "name": "name", - "type": "const char *", - "comment": "name of the submodule" - }, - { - "name": "payload", - "type": "void *", - "comment": "value you passed to the foreach function as payload" - } - ], - "argline": "git_submodule *sm, const char *name, void *payload", - "sig": "git_submodule *::const char *::void *", - "return": { - "type": "int", - "comment": " 0 on success or error code" - }, - "description": "

Function pointer to receive each submodule

\n", + }, + { + "type": "git_packbuilder_progress", + "name": "pack_progress", + "comments": " Function to call with progress information during pack\n building. Be aware that this is called inline with pack\n building operations, so performance may be affected." + }, + { + "type": "git_push_transfer_progress_cb", + "name": "push_transfer_progress", + "comments": " Function to call with progress information during the\n upload portion of a push. Be aware that this is called\n inline with pack building operations, so performance may be\n affected." + }, + { + "type": "git_push_update_reference_cb", + "name": "push_update_reference", + "comments": " See documentation of git_push_update_reference_cb" + }, + { + "type": "git_push_negotiation", + "name": "push_negotiation", + "comments": " Called once between the negotiation step and the upload. It\n provides information about what updates will be performed." + }, + { + "type": "git_transport_cb", + "name": "transport", + "comments": " Create the transport to use for this operation. Leave NULL\n to auto-detect." + }, + { + "type": "git_remote_ready_cb", + "name": "remote_ready", + "comments": " Callback when the remote is ready to connect." + }, + { + "type": "void *", + "name": "payload", + "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." + }, + { + "type": "git_url_resolve_cb", + "name": "resolve_url", + "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead.\n\n This callback is deprecated; users should use\n git_remote_ready_cb and configure the instance URL instead." + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_connect", + "git_remote_init_callbacks", + "git_remote_prune", + "git_remote_update_tips" + ] + } + } + ], + [ + "git_remote_completion_t", + { + "decl": [ + "GIT_REMOTE_COMPLETION_DOWNLOAD", + "GIT_REMOTE_COMPLETION_INDEXING", + "GIT_REMOTE_COMPLETION_ERROR" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 463, + "lineto": 467, + "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", + "tdef": "typedef", + "description": " Argument to the completion callback which tells it which operation\n finished.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_DOWNLOAD", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_INDEXING", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_COMPLETION_ERROR", + "comments": "", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_remote_connect_options", + { + "decl": [ + "unsigned int version", + "git_remote_callbacks callbacks", + "git_proxy_options proxy_opts", + "git_remote_redirect_t follow_redirects", + "git_strarray custom_headers" + ], + "type": "struct", + "value": "git_remote_connect_options", + "file": "git2/remote.h", + "line": 879, + "lineto": 897, + "block": "unsigned int version\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", + "tdef": "typedef", + "description": " Remote creation options structure", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_remote_callbacks", + "name": "callbacks", + "comments": " Callbacks to use for this connection " + }, + { + "type": "git_proxy_options", + "name": "proxy_opts", + "comments": " HTTP Proxy settings " + }, + { + "type": "git_remote_redirect_t", + "name": "follow_redirects", + "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." + }, + { + "type": "git_strarray", + "name": "custom_headers", + "comments": " Extra HTTP headers to use in this connection " + } + ], + "used": { + "returns": [], + "needs": ["git_remote_connect_ext", "git_remote_connect_options_init"] + } + } + ], + [ + "git_remote_create_flags", + { + "decl": [ + "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 71, + "lineto": 77, + "block": "GIT_REMOTE_CREATE_SKIP_INSTEADOF\nGIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "tdef": "typedef", + "description": " Remote creation options flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_INSTEADOF", + "comments": "

Ignore the repository apply.insteadOf configuration

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", + "comments": "

Don't build a fetchspec from the name if none is set

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_remote_create_options", + { + "decl": [ + "unsigned int version", + "git_repository * repository", + "const char * name", + "const char * fetchspec", + "unsigned int flags" + ], + "type": "struct", + "value": "git_remote_create_options", + "file": "git2/remote.h", + "line": 97, + "lineto": 117, + "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", + "tdef": "typedef", + "description": " Remote creation options structure", + "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_repository *", + "name": "repository", + "comments": " The repository that should own the remote.\n Setting this to NULL results in a detached remote." + }, + { + "type": "const char *", + "name": "name", + "comments": " The remote's name.\n Setting this to NULL results in an in-memory/anonymous remote." + }, + { + "type": "const char *", + "name": "fetchspec", + "comments": " The fetchspec the remote should use. " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " Additional flags for the remote. See git_remote_create_flags. " + } + ], + "used": { + "returns": [], + "needs": [ + "git_remote_create_options_init", + "git_remote_create_with_opts" + ] + } + } + ], + [ + "git_remote_head", + { + "decl": [ + "int local", + "git_oid oid", + "git_oid loid", + "char * name", + "char * symref_target" + ], + "type": "struct", + "value": "git_remote_head", + "file": "git2/net.h", + "line": 40, + "lineto": 50, + "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", + "tdef": null, + "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", + "comments": "", + "fields": [ + { "type": "int", "name": "local", "comments": "" }, + { "type": "git_oid", "name": "oid", "comments": "" }, + { "type": "git_oid", "name": "loid", "comments": "" }, + { "type": "char *", "name": "name", "comments": "" }, + { + "type": "char *", + "name": "symref_target", + "comments": " If the server send a symref mapping for this ref, this will\n point to the target." + } + ], + "used": { "returns": [], "needs": ["git_headlist_cb", "git_remote_ls"] } + } + ], + [ + "git_remote_redirect_t", + { + "decl": [ + "GIT_REMOTE_REDIRECT_NONE", + "GIT_REMOTE_REDIRECT_INITIAL", + "GIT_REMOTE_REDIRECT_ALL" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 49, + "lineto": 66, + "block": "GIT_REMOTE_REDIRECT_NONE\nGIT_REMOTE_REDIRECT_INITIAL\nGIT_REMOTE_REDIRECT_ALL", + "tdef": "typedef", + "description": " Remote redirection settings; whether redirects to another host\n are permitted. By default, git will follow a redirect on the\n initial request (`/info/refs`), but not subsequent requests.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_NONE", + "comments": "

Do not follow any off-site redirects at any stage of\n the fetch or push.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_INITIAL", + "comments": "

Allow off-site redirects only upon the initial request.\n This is the default.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REMOTE_REDIRECT_ALL", + "comments": "

Allow redirects at any stage in the fetch or push.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_remote_update_flags", + { + "decl": [ + "GIT_REMOTE_UPDATE_FETCHHEAD", + "GIT_REMOTE_UPDATE_REPORT_UNCHANGED" + ], + "type": "enum", + "file": "git2/remote.h", + "line": 82, + "lineto": 88, + "block": "GIT_REMOTE_UPDATE_FETCHHEAD\nGIT_REMOTE_UPDATE_REPORT_UNCHANGED", + "tdef": "typedef", + "description": " How to handle reference updates.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REMOTE_UPDATE_FETCHHEAD", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REMOTE_UPDATE_REPORT_UNCHANGED", + "comments": "", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository", + { + "decl": "git_repository", + "type": "struct", + "value": "git_repository", + "file": "git2/types.h", + "line": 118, + "lineto": 118, + "tdef": "typedef", + "description": " Representation of an existing git repository,\n including all its object contents", + "comments": "", + "used": { + "returns": [ + "git_blob_owner", + "git_commit_owner", + "git_index_owner", + "git_object_owner", + "git_patch_owner", + "git_reference_owner", + "git_remote_owner", + "git_revwalk_repository", + "git_submodule_owner", + "git_tag_owner", + "git_tree_owner" + ], + "needs": [ + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_lookup", + "git_apply", + "git_apply_to_tree", + "git_attr_add_macro", + "git_attr_cache_flush", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_blame_file", + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_workdir", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_remote_name", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote", + "git_checkout_head", + "git_checkout_index", + "git_checkout_tree", + "git_cherrypick", + "git_cherrypick_commit", + "git_clone", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_from_stage", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_extract_signature", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_config_add_file_ondisk", + "git_describe_workdir", + "git_diff_commit_as_email", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_filter_list_apply_to_file", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_file", + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any", + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored", + "git_index_write_tree_to", + "git_mailmap_from_repository", + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_merge_commits", + "git_merge_file_from_index", + "git_merge_trees", + "git_note_commit_create", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_create", + "git_note_default_ref", + "git_note_foreach", + "git_note_iterator_new", + "git_note_read", + "git_note_remove", + "git_object_lookup", + "git_object_lookup_prefix", + "git_packbuilder_new", + "git_pathspec_match_workdir", + "git_rebase_init", + "git_rebase_open", + "git_refdb_new", + "git_refdb_open", + "git_reference_create", + "git_reference_create_matching", + "git_reference_dwim", + "git_reference_ensure_log", + "git_reference_foreach", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_has_log", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_list", + "git_reference_lookup", + "git_reference_name_to_id", + "git_reference_remove", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reflog_delete", + "git_reflog_read", + "git_reflog_rename", + "git_remote_add_fetch", + "git_remote_add_push", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_cb", + "git_remote_create_with_fetchspec", + "git_remote_delete", + "git_remote_list", + "git_remote_lookup", + "git_remote_rename", + "git_remote_set_autotag", + "git_remote_set_pushurl", + "git_remote_set_url", + "git_repository_commit_parents", + "git_repository_commondir", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_create_cb", + "git_repository_detach_head", + "git_repository_fetchhead_foreach", + "git_repository_free", + "git_repository_get_namespace", + "git_repository_hashfile", + "git_repository_head", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_for_worktree", + "git_repository_head_unborn", + "git_repository_ident", + "git_repository_index", + "git_repository_init", + "git_repository_init_ext", + "git_repository_init_options_init", + "git_repository_is_bare", + "git_repository_is_empty", + "git_repository_is_shallow", + "git_repository_is_worktree", + "git_repository_item_path", + "git_repository_mergehead_foreach", + "git_repository_message", + "git_repository_message_remove", + "git_repository_odb", + "git_repository_oid_type", + "git_repository_open", + "git_repository_open_bare", + "git_repository_open_ext", + "git_repository_open_from_worktree", + "git_repository_path", + "git_repository_refdb", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_set_ident", + "git_repository_set_namespace", + "git_repository_set_workdir", + "git_repository_state", + "git_repository_state_cleanup", + "git_repository_workdir", + "git_reset", + "git_reset_default", + "git_reset_from_annotated", + "git_revert", + "git_revert_commit", + "git_revparse", + "git_revparse_ext", + "git_revparse_single", + "git_revwalk_new", + "git_signature_default", + "git_stash_apply", + "git_stash_drop", + "git_stash_foreach", + "git_stash_pop", + "git_stash_save", + "git_stash_save_with_opts", + "git_status_file", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_list_new", + "git_status_should_ignore", + "git_submodule_add_setup", + "git_submodule_clone", + "git_submodule_foreach", + "git_submodule_lookup", + "git_submodule_open", + "git_submodule_repo_init", + "git_submodule_resolve_url", + "git_submodule_set_branch", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_set_url", + "git_submodule_status", + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_foreach", + "git_tag_list", + "git_tag_list_match", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_transaction_new", + "git_tree_create_updated", + "git_tree_entry_to_object", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_treebuilder_new", + "git_worktree_add", + "git_worktree_list", + "git_worktree_lookup", + "git_worktree_open_from_repository" + ] + } + } + ], + [ + "git_repository_init_flag_t", + { + "decl": [ + "GIT_REPOSITORY_INIT_BARE", + "GIT_REPOSITORY_INIT_NO_REINIT", + "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", + "GIT_REPOSITORY_INIT_MKDIR", + "GIT_REPOSITORY_INIT_MKPATH", + "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", + "GIT_REPOSITORY_INIT_RELATIVE_GITLINK" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 236, + "lineto": 282, + "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", + "tdef": "typedef", + "description": " Option flags for `git_repository_init_ext`.", + "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_BARE", + "comments": "

Create a bare repository with no working directory.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_NO_REINIT", + "comments": "

Return an GIT_EEXISTS error if the repo_path appears to already be\n an git repository.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", + "comments": "

Normally a "/.git/" will be appended to the repo path for\n non-bare repos (if it is not already there), but passing this flag\n prevents that behavior.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_MKDIR", + "comments": "

Make the repo_path (and workdir_path) as needed. Init is always willing\n to create the ".git" directory even without this flag. This flag tells\n init to create the trailing component of the repo and workdir paths\n as needed.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_MKPATH", + "comments": "

Recursively make all components of the repo and workdir paths as\n necessary.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", + "comments": "

libgit2 normally uses internal templates to initialize a new repo.\n This flags enables external templates, looking the "template_path" from\n the options if set, or the init.templatedir global config if not,\n or falling back on "/usr/share/git-core/templates" if it exists.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_RELATIVE_GITLINK", + "comments": "

If an alternate workdir is specified, use relative paths for the gitdir\n and core.worktree.

\n", + "value": 64 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository_init_mode_t", + { + "decl": [ + "GIT_REPOSITORY_INIT_SHARED_UMASK", + "GIT_REPOSITORY_INIT_SHARED_GROUP", + "GIT_REPOSITORY_INIT_SHARED_ALL" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 291, + "lineto": 307, + "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", + "tdef": "typedef", + "description": " Mode options for `git_repository_init_ext`.", + "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the defined modes.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_UMASK", + "comments": "

Use permissions configured by umask - the default.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_GROUP", + "comments": "

Use "--shared=group" behavior, chmod'ing the new repo to be group\n writable and "g+sx" for sticky group assignment.

\n", + "value": 1533 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_INIT_SHARED_ALL", + "comments": "

Use "--shared=all" behavior, adding world readability.

\n", + "value": 1535 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository_init_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "uint32_t mode", + "const char * workdir_path", + "const char * description", + "const char * template_path", + "const char * initial_head", + "const char * origin_url" + ], + "type": "struct", + "value": "git_repository_init_options", + "file": "git2/repository.h", + "line": 315, + "lineto": 374, + "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", + "tdef": "typedef", + "description": " Extended options structure for `git_repository_init_ext`.", + "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Combination of GIT_REPOSITORY_INIT flags above." + }, + { + "type": "uint32_t", + "name": "mode", + "comments": " Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants\n above, or to a custom value that you would like." + }, + { + "type": "const char *", + "name": "workdir_path", + "comments": " The path to the working dir or NULL for default (i.e. repo_path parent\n on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED\n RELATIVE TO THE REPO_PATH. If this is not the \"natural\" working\n directory, a .git gitlink file will be created here linking to the\n repo_path." + }, + { + "type": "const char *", + "name": "description", + "comments": " If set, this will be used to initialize the \"description\" file in the\n repository, instead of using the template content." + }, + { + "type": "const char *", + "name": "template_path", + "comments": " When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains\n the path to use for the template directory. If this is NULL, the config\n or default directory options will be used instead." + }, + { + "type": "const char *", + "name": "initial_head", + "comments": " The name of the head to point HEAD at. If NULL, then this will be\n treated as \"master\" and the HEAD ref will be set to \"refs/heads/master\".\n If this begins with \"refs/\" it will be used verbatim;\n otherwise \"refs/heads/\" will be prefixed." + }, + { + "type": "const char *", + "name": "origin_url", + "comments": " If this is non-NULL, then after the rest of the repository\n initialization is completed, an \"origin\" remote will be added\n pointing to this URL." + } + ], + "used": { + "returns": [], + "needs": [ + "git_repository_init_ext", + "git_repository_init_options_init" + ] + } + } + ], + [ + "git_repository_item_t", + { + "decl": [ + "GIT_REPOSITORY_ITEM_GITDIR", + "GIT_REPOSITORY_ITEM_WORKDIR", + "GIT_REPOSITORY_ITEM_COMMONDIR", + "GIT_REPOSITORY_ITEM_INDEX", + "GIT_REPOSITORY_ITEM_OBJECTS", + "GIT_REPOSITORY_ITEM_REFS", + "GIT_REPOSITORY_ITEM_PACKED_REFS", + "GIT_REPOSITORY_ITEM_REMOTES", + "GIT_REPOSITORY_ITEM_CONFIG", + "GIT_REPOSITORY_ITEM_INFO", + "GIT_REPOSITORY_ITEM_HOOKS", + "GIT_REPOSITORY_ITEM_LOGS", + "GIT_REPOSITORY_ITEM_MODULES", + "GIT_REPOSITORY_ITEM_WORKTREES", + "GIT_REPOSITORY_ITEM_WORKTREE_CONFIG", + "GIT_REPOSITORY_ITEM__LAST" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 492, + "lineto": 509, + "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM_WORKTREE_CONFIG\nGIT_REPOSITORY_ITEM__LAST", + "tdef": "typedef", + "description": " List of items which belong to the git repository layout", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_GITDIR", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKDIR", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_COMMONDIR", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_INDEX", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_OBJECTS", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_REFS", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_PACKED_REFS", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_REMOTES", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_CONFIG", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_INFO", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_HOOKS", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_LOGS", + "comments": "", + "value": 11 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_MODULES", + "comments": "", + "value": 12 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKTREES", + "comments": "", + "value": 13 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM_WORKTREE_CONFIG", + "comments": "", + "value": 14 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_ITEM__LAST", + "comments": "", + "value": 15 + } + ], + "used": { "returns": [], "needs": ["git_repository_item_path"] } + } + ], + [ + "git_repository_open_flag_t", + { + "decl": [ + "GIT_REPOSITORY_OPEN_NO_SEARCH", + "GIT_REPOSITORY_OPEN_CROSS_FS", + "GIT_REPOSITORY_OPEN_BARE", + "GIT_REPOSITORY_OPEN_NO_DOTGIT", + "GIT_REPOSITORY_OPEN_FROM_ENV" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 109, + "lineto": 156, + "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", + "tdef": "typedef", + "description": " Option flags for `git_repository_open_ext`.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_NO_SEARCH", + "comments": "

Only open the repository if it can be immediately found in the\n start_path. Do not walk up from the start_path looking at parent\n directories.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_CROSS_FS", + "comments": "

Unless this flag is set, open will not continue searching across\n filesystem boundaries (i.e. when st_dev changes from the stat\n system call). For example, searching in a user's home directory at\n "/home/user/source/" will not return "/.git/" as the found repo if\n "/" is a different filesystem than "/home".

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_BARE", + "comments": "

Open repository as a bare repo regardless of core.bare config, and\n defer loading config file for faster setup.\n Unlike git_repository_open_bare, this can follow gitlinks.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_NO_DOTGIT", + "comments": "

Do not check for a repository by appending /.git to the start_path;\n only open the repository if start_path itself points to the git\n directory.

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_OPEN_FROM_ENV", + "comments": "

Find and open a git repository, respecting the environment variables\n used by the git command-line tools.\n If set, git_repository_open_ext will ignore the other flags and\n the ceiling_dirs argument, and will allow a NULL path to use\n GIT_DIR or search from the current directory.\n The search for a repository will respect $GIT_CEILING_DIRECTORIES and\n $GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\n respect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n $GIT_ALTERNATE_OBJECT_DIRECTORIES.\n In the future, this flag will also cause git_repository_open_ext\n to respect $GIT_WORK_TREE and $GIT_COMMON_DIR; currently,\n git_repository_open_ext with this flag will error out if either\n $GIT_WORK_TREE or $GIT_COMMON_DIR is set.

\n", + "value": 16 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_repository_state_t", + { + "decl": [ + "GIT_REPOSITORY_STATE_NONE", + "GIT_REPOSITORY_STATE_MERGE", + "GIT_REPOSITORY_STATE_REVERT", + "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", + "GIT_REPOSITORY_STATE_CHERRYPICK", + "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", + "GIT_REPOSITORY_STATE_BISECT", + "GIT_REPOSITORY_STATE_REBASE", + "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", + "GIT_REPOSITORY_STATE_REBASE_MERGE", + "GIT_REPOSITORY_STATE_APPLY_MAILBOX", + "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE" + ], + "type": "enum", + "file": "git2/repository.h", + "line": 893, + "lineto": 906, + "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", + "tdef": "typedef", + "description": " Repository state", + "comments": "

These values represent possible states for the repository to be in, based on the current operation which is ongoing.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_MERGE", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REVERT", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_CHERRYPICK", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", + "comments": "", + "value": 5 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_BISECT", + "comments": "", + "value": 6 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE", + "comments": "", + "value": 7 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_REBASE_MERGE", + "comments": "", + "value": 9 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX", + "comments": "", + "value": 10 + }, + { + "type": "int", + "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", + "comments": "", + "value": 11 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_reset_t", + { + "decl": ["GIT_RESET_SOFT", "GIT_RESET_MIXED", "GIT_RESET_HARD"], + "type": "enum", + "file": "git2/reset.h", + "line": 26, + "lineto": 30, + "block": "GIT_RESET_SOFT\nGIT_RESET_MIXED\nGIT_RESET_HARD", + "tdef": "typedef", + "description": " Kinds of reset operation", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_RESET_SOFT", + "comments": "

Move the head to the given commit

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_RESET_MIXED", + "comments": "

SOFT plus reset index to the commit

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_RESET_HARD", + "comments": "

MIXED plus changes in working tree discarded

\n", + "value": 3 + } + ], + "used": { + "returns": [], + "needs": ["git_reset", "git_reset_from_annotated"] + } + } + ], + [ + "git_revert_options", + { + "decl": [ + "unsigned int version", + "unsigned int mainline", + "git_merge_options merge_opts", + "git_checkout_options checkout_opts" + ], + "type": "struct", + "value": "git_revert_options", + "file": "git2/revert.h", + "line": 26, + "lineto": 34, + "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", + "tdef": "typedef", + "description": " Options for revert", + "comments": "", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "unsigned int", + "name": "mainline", + "comments": " For merge commits, the \"mainline\" is treated as the parent. " + }, + { + "type": "git_merge_options", + "name": "merge_opts", + "comments": " Options for the merging " + }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " Options for the checkout " + } + ], + "used": { + "returns": [], + "needs": ["git_revert", "git_revert_options_init"] + } + } + ], + [ + "git_revspec", + { + "decl": ["git_object * from", "git_object * to", "unsigned int flags"], + "type": "struct", + "value": "git_revspec", + "file": "git2/revparse.h", + "line": 83, + "lineto": 90, + "block": "git_object * from\ngit_object * to\nunsigned int flags", + "tdef": "typedef", + "description": " Git Revision Spec: output of a `git_revparse` operation", + "comments": "", + "fields": [ + { + "type": "git_object *", + "name": "from", + "comments": " The left element of the revspec; must be freed by the user " + }, + { + "type": "git_object *", + "name": "to", + "comments": " The right element of the revspec; must be freed by the user " + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " The intent of the revspec (i.e. `git_revspec_mode_t` flags) " + } + ], + "used": { "returns": [], "needs": ["git_revparse"] } + } + ], + [ + "git_revspec_t", + { + "decl": [ + "GIT_REVSPEC_SINGLE", + "GIT_REVSPEC_RANGE", + "GIT_REVSPEC_MERGE_BASE" + ], + "type": "enum", + "file": "git2/revparse.h", + "line": 71, + "lineto": 78, + "block": "GIT_REVSPEC_SINGLE\nGIT_REVSPEC_RANGE\nGIT_REVSPEC_MERGE_BASE", + "tdef": "typedef", + "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_REVSPEC_SINGLE", + "comments": "

The spec targeted a single object.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_REVSPEC_RANGE", + "comments": "

The spec targeted a range of commits.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_REVSPEC_MERGE_BASE", + "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_revwalk", + { + "decl": "git_revwalk", + "type": "struct", + "value": "git_revwalk", + "file": "git2/types.h", + "line": 127, + "lineto": 127, + "tdef": "typedef", + "description": " Representation of an in-progress walk through the commits in a repo ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_packbuilder_insert_walk", + "git_revwalk_add_hide_cb", + "git_revwalk_free", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_hide_ref", + "git_revwalk_new", + "git_revwalk_next", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_push_range", + "git_revwalk_push_ref", + "git_revwalk_repository", + "git_revwalk_reset", + "git_revwalk_simplify_first_parent", + "git_revwalk_sorting" + ] + } + } + ], + [ + "git_signature", + { + "decl": ["char * name", "char * email", "git_time when"], + "type": "struct", + "value": "git_signature", + "file": "git2/types.h", + "line": 182, + "lineto": 186, + "block": "char * name\nchar * email\ngit_time when", + "tdef": "typedef", + "description": " An action signature (e.g. for committers, taggers, etc) ", + "comments": "", + "fields": [ + { + "type": "char *", + "name": "name", + "comments": " full name of the author " + }, + { + "type": "char *", + "name": "email", + "comments": " email of the author " + }, + { + "type": "git_time", + "name": "when", + "comments": " time when the action happened " + } + ], + "used": { + "returns": [ + "git_commit_author", + "git_commit_committer", + "git_note_author", + "git_note_committer", + "git_reflog_entry_committer", + "git_tag_tagger" + ], + "needs": [ + "git_commit_amend", + "git_commit_author_with_mailmap", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_v", + "git_email_create_from_diff", + "git_mailmap_resolve_signature", + "git_note_commit_create", + "git_note_commit_remove", + "git_note_create", + "git_note_remove", + "git_rebase_commit", + "git_rebase_finish", + "git_reflog_append", + "git_signature_default", + "git_signature_dup", + "git_signature_free", + "git_signature_from_buffer", + "git_signature_new", + "git_signature_now", + "git_stash_save", + "git_tag_annotation_create", + "git_tag_create", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + } + } + ], + [ + "git_smart_service_t", + { + "decl": [ + "GIT_SERVICE_UPLOADPACK_LS", + "GIT_SERVICE_UPLOADPACK", + "GIT_SERVICE_RECEIVEPACK_LS", + "GIT_SERVICE_RECEIVEPACK" + ], + "type": "enum", + "file": "git2/sys/transport.h", + "line": 313, + "lineto": 318, + "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", + "tdef": "typedef", + "description": " Actions that the smart transport can ask a subtransport to perform ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK_LS", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SERVICE_UPLOADPACK", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK_LS", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SERVICE_RECEIVEPACK", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_sort_t", + { + "decl": [ + "GIT_SORT_NONE", + "GIT_SORT_TOPOLOGICAL", + "GIT_SORT_TIME", + "GIT_SORT_REVERSE" + ], + "type": "enum", + "file": "git2/revwalk.h", + "line": 26, + "lineto": 53, + "block": "GIT_SORT_NONE\nGIT_SORT_TOPOLOGICAL\nGIT_SORT_TIME\nGIT_SORT_REVERSE", + "tdef": "typedef", + "description": " Flags to specify the sorting which a revwalk should perform.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_SORT_NONE", + "comments": "

Sort the output with the same default method from git: reverse\n chronological order. This is the default sorting for new walkers.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_SORT_TOPOLOGICAL", + "comments": "

Sort the repository contents in topological order (no parents before\n all of its children are shown); this sorting mode can be combined\n with time sorting to produce git's --date-order`.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SORT_TIME", + "comments": "

Sort the repository contents by commit time;\n this sorting mode can be combined with\n topological sorting.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SORT_REVERSE", + "comments": "

Iterate through the repository contents in reverse\n order; this sorting mode can be combined with\n any of the above.

\n", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_stash_apply_flags", + { + "decl": ["GIT_STASH_APPLY_DEFAULT", "GIT_STASH_APPLY_REINSTATE_INDEX"], + "type": "enum", + "file": "git2/stash.h", + "line": 129, + "lineto": 136, + "block": "GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX", + "tdef": "typedef", + "description": " Stash application flags. ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_DEFAULT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_REINSTATE_INDEX", + "comments": "", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_stash_apply_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "git_checkout_options checkout_options", + "git_stash_apply_progress_cb progress_cb", + "void * progress_payload" + ], + "type": "struct", + "value": "git_stash_apply_options", + "file": "git2/stash.h", + "line": 180, + "lineto": 192, + "block": "unsigned int version\nuint32_t flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", + "tdef": "typedef", + "description": " Stash application options structure", + "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can use git_stash_apply_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " See `git_stash_apply_flags`, above. " + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options to use when writing files to the working directory. " + }, + { + "type": "git_stash_apply_progress_cb", + "name": "progress_cb", + "comments": " Optional callback to notify the consumer of application progress. " + }, + { "type": "void *", "name": "progress_payload", "comments": "" } + ], + "used": { + "returns": [], + "needs": [ + "git_stash_apply", + "git_stash_apply_options_init", + "git_stash_pop" + ] + } + } + ], + [ + "git_stash_apply_progress_t", + { + "decl": [ + "GIT_STASH_APPLY_PROGRESS_NONE", + "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "GIT_STASH_APPLY_PROGRESS_DONE" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 139, + "lineto": 162, + "block": "GIT_STASH_APPLY_PROGRESS_NONE\nGIT_STASH_APPLY_PROGRESS_LOADING_STASH\nGIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX\nGIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED\nGIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED\nGIT_STASH_APPLY_PROGRESS_DONE", + "tdef": "typedef", + "description": " Stash apply progression states ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_NONE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", + "comments": "

Loading the stashed data from the object database.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", + "comments": "

The stored index is being analyzed.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", + "comments": "

The modified files are being analyzed.

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", + "comments": "

The untracked and ignored files are being analyzed.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", + "comments": "

The untracked files are being written to disk.

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", + "comments": "

The modified files are being written to disk.

\n", + "value": 6 + }, + { + "type": "int", + "name": "GIT_STASH_APPLY_PROGRESS_DONE", + "comments": "

The stash was applied successfully.

\n", + "value": 7 + } + ], + "used": { "returns": [], "needs": ["git_stash_apply_progress_cb"] } + } + ], + [ + "git_stash_flags", + { + "decl": [ + "GIT_STASH_DEFAULT", + "GIT_STASH_KEEP_INDEX", + "GIT_STASH_INCLUDE_UNTRACKED", + "GIT_STASH_INCLUDE_IGNORED", + "GIT_STASH_KEEP_ALL" + ], + "type": "enum", + "file": "git2/stash.h", + "line": 25, + "lineto": 53, + "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED\nGIT_STASH_KEEP_ALL", + "tdef": "typedef", + "description": " Stash flags", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STASH_DEFAULT", + "comments": "

No option, default

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STASH_KEEP_INDEX", + "comments": "

All changes already added to the index are left intact in\n the working directory

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STASH_INCLUDE_UNTRACKED", + "comments": "

All untracked files are also stashed and then cleaned up\n from the working directory

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STASH_INCLUDE_IGNORED", + "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STASH_KEEP_ALL", + "comments": "

All changes in the index and working directory are left intact

\n", + "value": 8 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_stash_save_options", + { + "decl": [ + "unsigned int version", + "uint32_t flags", + "const git_signature * stasher", + "const char * message", + "git_strarray paths" + ], + "type": "struct", + "value": "git_stash_save_options", + "file": "git2/stash.h", + "line": 81, + "lineto": 95, + "block": "unsigned int version\nuint32_t flags\nconst git_signature * stasher\nconst char * message\ngit_strarray paths", + "tdef": "typedef", + "description": " Stash save options structure", + "comments": "

Initialize with GIT_STASH_SAVE_OPTIONS_INIT. Alternatively, you can use git_stash_save_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " Flags to control the stashing process. (see GIT_STASH_* above) " + }, + { + "type": "const git_signature *", + "name": "stasher", + "comments": " The identity of the person performing the stashing. " + }, + { + "type": "const char *", + "name": "message", + "comments": " Optional description along with the stashed state. " + }, + { + "type": "git_strarray", + "name": "paths", + "comments": " Optional paths that control which files are stashed. " + } + ], + "used": { + "returns": [], + "needs": ["git_stash_save_options_init", "git_stash_save_with_opts"] + } + } + ], + [ + "git_status_entry", + { + "decl": [ + "git_status_t status", + "git_diff_delta * head_to_index", + "git_diff_delta * index_to_workdir" + ], + "type": "struct", + "value": "git_status_entry", + "file": "git2/status.h", + "line": 295, + "lineto": 299, + "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", + "tdef": "typedef", + "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", + "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the differences between the file in the index and the file in the working directory.

\n", + "fields": [ + { "type": "git_status_t", "name": "status", "comments": "" }, + { + "type": "git_diff_delta *", + "name": "head_to_index", "comments": "" - }, - "git_tag_foreach_cb": { - "type": "callback", - "file": "git2/tag.h", - "line": 330, - "lineto": 330, - "args": [ - { - "name": "name", - "type": "const char *", - "comment": "The tag name" - }, - { - "name": "oid", - "type": "git_oid *", - "comment": "The tag's OID" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload passed to git_tag_foreach" - } - ], - "argline": "const char *name, git_oid *oid, void *payload", - "sig": "const char *::git_oid *::void *", - "return": { - "type": "int", - "comment": " non-zero to terminate the iteration" - }, - "description": "

Callback used to iterate over tag names

\n", + }, + { + "type": "git_diff_delta *", + "name": "index_to_workdir", "comments": "" - }, - "git_trace_cb": { - "type": "callback", - "file": "git2/trace.h", - "line": 52, - "lineto": 52, - "args": [ - { - "name": "level", - "type": "git_trace_level_t", - "comment": null - }, - { - "name": "msg", - "type": "const char *", - "comment": null - } - ], - "argline": "git_trace_level_t level, const char *msg", - "sig": "git_trace_level_t::const char *", - "return": { - "type": "void", - "comment": null - }, - "description": "

An instance for a tracing function

\n", + } + ], + "used": { "returns": ["git_status_byindex"], "needs": [] } + } + ], + [ + "git_status_list", + { + "decl": "git_status_list", + "type": "struct", + "value": "git_status_list", + "file": "git2/types.h", + "line": 201, + "lineto": 201, + "tdef": "typedef", + "description": " Representation of a status collection ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_status_byindex", + "git_status_list_entrycount", + "git_status_list_free", + "git_status_list_new" + ] + } + } + ], + [ + "git_status_opt_t", + { + "decl": [ + "GIT_STATUS_OPT_INCLUDE_UNTRACKED", + "GIT_STATUS_OPT_INCLUDE_IGNORED", + "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", + "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", + "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", + "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", + "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", + "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", + "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", + "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", + "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", + "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", + "GIT_STATUS_OPT_NO_REFRESH", + "GIT_STATUS_OPT_UPDATE_INDEX", + "GIT_STATUS_OPT_INCLUDE_UNREADABLE", + "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED" + ], + "type": "enum", + "file": "git2/status.h", + "line": 101, + "lineto": 208, + "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", + "tdef": "typedef", + "description": " Flags to control status callbacks", + "comments": "

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNTRACKED", + "comments": "

Says that callbacks should be made on untracked files.\n These will only be made if the workdir files are included in the status\n "show" option.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_IGNORED", + "comments": "

Says that ignored files get callbacks.\n Again, these callbacks will only be made if the workdir files are\n included in the status "show" option.

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", + "comments": "

Indicates that callback should be made even on unmodified files.

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", + "comments": "

Indicates that submodules should be skipped.\n This only applies if there are no pending typechanges to the submodule\n (either from or to another type).

\n", + "value": 8 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", + "comments": "

Indicates that all files in untracked directories should be included.\n Normally if an entire directory is new, then just the top-level\n directory is included (with a trailing slash on the entry name).\n This flag says to include all of the individual files in the directory\n instead.

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", + "comments": "

Indicates that the given path should be treated as a literal path,\n and not as a pathspec pattern.

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", + "comments": "

Indicates that the contents of ignored directories should be included\n in the status. This is like doing git ls-files -o -i --exclude-standard\n with core git.

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", + "comments": "

Indicates that rename detection should be processed between the head and\n the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status\n flag.

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", + "comments": "

Indicates that rename detection should be run between the index and the\n working directory and enabled GIT_STATUS_WT_RENAMED as a possible status\n flag.

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-sensitive order.

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", + "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-insensitive order.

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", + "comments": "

Iindicates that rename detection should include rewritten files.

\n", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_NO_REFRESH", + "comments": "

Bypasses the default status behavior of doing a "soft" index reload\n (i.e. reloading the index data if the file on disk has been modified\n outside libgit2).

\n", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_UPDATE_INDEX", + "comments": "

Tells libgit2 to refresh the stat cache in the index for files that are\n unchanged but have out of date stat einformation in the index.\n It will result in less work being done on subsequent calls to get status.\n This is mutually exclusive with the NO_REFRESH option.

\n", + "value": 8192 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE", + "comments": "

Normally files that cannot be opened or read are ignored as\n these are often transient files; this option will return\n unreadable files as GIT_STATUS_WT_UNREADABLE.

\n", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", + "comments": "

Unreadable files will be detected and given the status\n untracked instead of unreadable.

\n", + "value": 32768 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_status_options", + { + "decl": [ + "unsigned int version", + "git_status_show_t show", + "unsigned int flags", + "git_strarray pathspec", + "git_tree * baseline", + "uint16_t rename_threshold" + ], + "type": "struct", + "value": "git_status_options", + "file": "git2/status.h", + "line": 222, + "lineto": 262, + "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline\nuint16_t rename_threshold", + "tdef": "typedef", + "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", + "comments": "

Initialize with GIT_STATUS_OPTIONS_INIT. Alternatively, you can use git_status_options_init.

\n", + "fields": [ + { + "type": "unsigned int", + "name": "version", + "comments": " The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." + }, + { + "type": "git_status_show_t", + "name": "show", + "comments": " The `show` value is one of the `git_status_show_t` constants that\n control which files to scan and in what order. The default is\n `GIT_STATUS_SHOW_INDEX_AND_WORKDIR`." + }, + { + "type": "unsigned int", + "name": "flags", + "comments": " The `flags` value is an OR'ed combination of the\n `git_status_opt_t` values above. The default is\n `GIT_STATUS_OPT_DEFAULTS`, which matches git's default\n behavior." + }, + { + "type": "git_strarray", + "name": "pathspec", + "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match\n exactly if `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified\n in the flags." + }, + { + "type": "git_tree *", + "name": "baseline", + "comments": " The `baseline` is the tree to be used for comparison to the\n working directory and index; defaults to HEAD." + }, + { + "type": "uint16_t", + "name": "rename_threshold", + "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." + } + ], + "used": { + "returns": [], + "needs": [ + "git_status_foreach_ext", + "git_status_list_new", + "git_status_options_init" + ] + } + } + ], + [ + "git_status_show_t", + { + "decl": [ + "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", + "GIT_STATUS_SHOW_INDEX_ONLY", + "GIT_STATUS_SHOW_WORKDIR_ONLY" + ], + "type": "enum", + "file": "git2/status.h", + "line": 73, + "lineto": 91, + "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", + "tdef": "typedef", + "description": " Select the files on which to report status.", + "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", + "comments": "

The default. This roughly matches git status --porcelain regarding\n which files are included and in what order.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STATUS_SHOW_INDEX_ONLY", + "comments": "

Only gives status based on HEAD to index comparison, not looking at\n working directory changes.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_SHOW_WORKDIR_ONLY", + "comments": "

Only gives status based on index to working directory comparison,\n not comparing the index to the HEAD.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_status_t", + { + "decl": [ + "GIT_STATUS_CURRENT", + "GIT_STATUS_INDEX_NEW", + "GIT_STATUS_INDEX_MODIFIED", + "GIT_STATUS_INDEX_DELETED", + "GIT_STATUS_INDEX_RENAMED", + "GIT_STATUS_INDEX_TYPECHANGE", + "GIT_STATUS_WT_NEW", + "GIT_STATUS_WT_MODIFIED", + "GIT_STATUS_WT_DELETED", + "GIT_STATUS_WT_TYPECHANGE", + "GIT_STATUS_WT_RENAMED", + "GIT_STATUS_WT_UNREADABLE", + "GIT_STATUS_IGNORED", + "GIT_STATUS_CONFLICTED" + ], + "type": "enum", + "file": "git2/status.h", + "line": 34, + "lineto": 52, + "block": "GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED", + "tdef": "typedef", + "description": " Status flags for a single file.", + "comments": "

A combination of these values will be returned to indicate the status of a file. Status compares the working directory, the index, and the current HEAD of the repository. The GIT_STATUS_INDEX set of flags represents the status of file in the index relative to the HEAD, and the GIT_STATUS_WT set of flags represent the status of the file in the working directory relative to the index.

\n", + "fields": [ + { + "type": "int", + "name": "GIT_STATUS_CURRENT", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_NEW", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_MODIFIED", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_DELETED", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_RENAMED", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_STATUS_INDEX_TYPECHANGE", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_NEW", + "comments": "", + "value": 128 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_MODIFIED", + "comments": "", + "value": 256 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_DELETED", + "comments": "", + "value": 512 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_TYPECHANGE", + "comments": "", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_RENAMED", + "comments": "", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_STATUS_WT_UNREADABLE", + "comments": "", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_STATUS_IGNORED", + "comments": "", + "value": 16384 + }, + { + "type": "int", + "name": "GIT_STATUS_CONFLICTED", + "comments": "", + "value": 32768 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_strarray", + { + "decl": ["char ** strings", "size_t count"], + "type": "struct", + "value": "git_strarray", + "file": "git2/strarray.h", + "line": 22, + "lineto": 25, + "block": "char ** strings\nsize_t count", + "tdef": "typedef", + "description": " Array of strings ", + "comments": "", + "fields": [ + { "type": "char **", "name": "strings", "comments": "" }, + { "type": "size_t", "name": "count", "comments": "" } + ], + "used": { + "returns": [], + "needs": [ + "git_index_add_all", + "git_index_remove_all", + "git_index_update_all", + "git_pathspec_new", + "git_reference_list", + "git_remote_connect", + "git_remote_download", + "git_remote_fetch", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_list", + "git_remote_push", + "git_remote_rename", + "git_remote_upload", + "git_reset_default", + "git_strarray_copy", + "git_strarray_dispose", + "git_strarray_free", + "git_tag_list", + "git_tag_list_match", + "git_worktree_list" + ] + } + } + ], + [ + "git_stream_t", + { + "decl": ["GIT_STREAM_STANDARD", "GIT_STREAM_TLS"], + "type": "enum", + "file": "git2/sys/stream.h", + "line": 91, + "lineto": 97, + "block": "GIT_STREAM_STANDARD\nGIT_STREAM_TLS", + "tdef": "typedef", + "description": " The type of stream to register.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_STREAM_STANDARD", + "comments": "

A standard (non-TLS) socket.

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_STREAM_TLS", + "comments": "

A TLS-encrypted socket.

\n", + "value": 2 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_submodule", + { + "decl": "git_submodule", + "type": "struct", + "value": "git_submodule", + "file": "git2/types.h", + "line": 267, + "lineto": 267, + "tdef": "typedef", + "description": " Opaque structure representing a submodule.", + "comments": "", + "used": { + "returns": [ + "git_submodule_fetch_recurse_submodules", + "git_submodule_ignore", + "git_submodule_update_strategy" + ], + "needs": [ + "git_submodule_add_finalize", + "git_submodule_add_setup", + "git_submodule_add_to_index", + "git_submodule_branch", + "git_submodule_cb", + "git_submodule_clone", + "git_submodule_dup", + "git_submodule_fetch_recurse_submodules", + "git_submodule_foreach", + "git_submodule_free", + "git_submodule_head_id", + "git_submodule_ignore", + "git_submodule_index_id", + "git_submodule_init", + "git_submodule_location", + "git_submodule_lookup", + "git_submodule_name", + "git_submodule_open", + "git_submodule_owner", + "git_submodule_path", + "git_submodule_reload", + "git_submodule_repo_init", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_status", + "git_submodule_sync", + "git_submodule_update", + "git_submodule_update_options_init", + "git_submodule_update_strategy", + "git_submodule_url", + "git_submodule_wd_id" + ] + } + } + ], + [ + "git_submodule_ignore_t", + { + "decl": [ + "GIT_SUBMODULE_IGNORE_UNSPECIFIED", + "GIT_SUBMODULE_IGNORE_NONE", + "GIT_SUBMODULE_IGNORE_UNTRACKED", + "GIT_SUBMODULE_IGNORE_DIRTY", + "GIT_SUBMODULE_IGNORE_ALL" + ], + "type": "enum", + "file": "git2/types.h", + "line": 331, + "lineto": 338, + "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", + "tdef": "typedef", + "description": " Submodule ignore values", + "comments": "

These values represent settings for the submodule.$name.ignore configuration value which says how deeply to look at the working directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with git_submodule_set_ignore() and can write the changed value to disk with git_submodule_save(). If you have overwritten the value, you can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an untracked file, will mark the submodule as dirty. Ignored files are still ignored, of course. - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes to tracked files, or the index or the HEAD commit will matter. - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory, only considering changes if the HEAD of submodule has moved from the value in the superproject. - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer when we don't want any particular ignore rule to be specified.
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_UNSPECIFIED", + "comments": "

use the submodule's configuration

\n", + "value": -1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_NONE", + "comments": "

any change or untracked == dirty

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_UNTRACKED", + "comments": "

dirty if tracked files change

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_DIRTY", + "comments": "

only dirty if HEAD moved

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_IGNORE_ALL", + "comments": "

never dirty

\n", + "value": 4 + } + ], + "used": { + "returns": ["git_submodule_ignore"], + "needs": ["git_submodule_set_ignore", "git_submodule_status"] + } + } + ], + [ + "git_submodule_recurse_t", + { + "decl": [ + "GIT_SUBMODULE_RECURSE_NO", + "GIT_SUBMODULE_RECURSE_YES", + "GIT_SUBMODULE_RECURSE_ONDEMAND" + ], + "type": "enum", + "file": "git2/types.h", + "line": 350, + "lineto": 354, + "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", + "tdef": "typedef", + "description": " Options for submodule recurse.", + "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules * GIT_SUBMODULE_RECURSE_YES - recurse into submodules * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when commit not already in local clone
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_NO", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_YES", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_RECURSE_ONDEMAND", + "comments": "", + "value": 2 + } + ], + "used": { + "returns": ["git_submodule_fetch_recurse_submodules"], + "needs": ["git_submodule_set_fetch_recurse_submodules"] + } + } + ], + [ + "git_submodule_status_t", + { + "decl": [ + "GIT_SUBMODULE_STATUS_IN_HEAD", + "GIT_SUBMODULE_STATUS_IN_INDEX", + "GIT_SUBMODULE_STATUS_IN_CONFIG", + "GIT_SUBMODULE_STATUS_IN_WD", + "GIT_SUBMODULE_STATUS_INDEX_ADDED", + "GIT_SUBMODULE_STATUS_INDEX_DELETED", + "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", + "GIT_SUBMODULE_STATUS_WD_ADDED", + "GIT_SUBMODULE_STATUS_WD_DELETED", + "GIT_SUBMODULE_STATUS_WD_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", + "GIT_SUBMODULE_STATUS_WD_UNTRACKED" + ], + "type": "enum", + "file": "git2/submodule.h", + "line": 74, + "lineto": 89, + "block": "GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED", + "tdef": "typedef", + "description": " Return codes for submodule status.", + "comments": "

A combination of these flags will be returned to describe the status of a submodule. Depending on the "ignore" property of the submodule, some of the flags may never be returned because they indicate changes that are supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config files (both .git/config and .gitmodules), and the working directory. Any or all of those places might be missing information about the submodule depending on what state the repo is in. We consider all four places to build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info about what sources of submodule data are available. These will be returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule * IN_INDEX - superproject index contains submodule * IN_CONFIG - superproject gitmodules has submodule * IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head * INDEX_DELETED - in head, not in index * INDEX_MODIFIED - index and head don't match * WD_UNINITIALIZED - workdir contains empty directory * WD_ADDED - in workdir, not index * WD_DELETED - in index, not workdir * WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty * WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_HEAD", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_INDEX", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_CONFIG", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_IN_WD", + "comments": "", + "value": 8 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_ADDED", + "comments": "", + "value": 16 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_DELETED", + "comments": "", + "value": 32 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", + "comments": "", + "value": 64 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", + "comments": "", + "value": 128 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_ADDED", + "comments": "", + "value": 256 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_DELETED", + "comments": "", + "value": 512 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_MODIFIED", + "comments": "", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", + "comments": "", + "value": 2048 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", + "comments": "", + "value": 4096 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_STATUS_WD_UNTRACKED", + "comments": "", + "value": 8192 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_submodule_update_options", + { + "decl": [ + "unsigned int version", + "git_checkout_options checkout_opts", + "git_fetch_options fetch_opts", + "int allow_fetch" + ], + "type": "struct", + "value": "git_submodule_update_options", + "file": "git2/submodule.h", + "line": 128, + "lineto": 153, + "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", + "tdef": "typedef", + "description": " Submodule update options structure", + "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "git_checkout_options", + "name": "checkout_opts", + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory." + }, + { + "type": "git_fetch_options", + "name": "fetch_opts", + "comments": " Options which control the fetch, including callbacks.\n\n The callbacks to use for reporting fetch progress, and for acquiring\n credentials in the event they are needed." + }, + { + "type": "int", + "name": "allow_fetch", + "comments": " Allow fetching from the submodule's default remote if the target\n commit isn't found. Enabled by default." + } + ], + "used": { + "returns": [], + "needs": [ + "git_submodule_clone", + "git_submodule_update", + "git_submodule_update_options_init" + ] + } + } + ], + [ + "git_submodule_update_t", + { + "decl": [ + "GIT_SUBMODULE_UPDATE_CHECKOUT", + "GIT_SUBMODULE_UPDATE_REBASE", + "GIT_SUBMODULE_UPDATE_MERGE", + "GIT_SUBMODULE_UPDATE_NONE", + "GIT_SUBMODULE_UPDATE_DEFAULT" + ], + "type": "enum", + "file": "git2/types.h", + "line": 295, + "lineto": 302, + "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", + "tdef": "typedef", + "description": " Submodule update values", + "comments": "

These values represent settings for the submodule.$name.update configuration value which says how to handle git submodule update for this submodule. The value is usually set in the ".gitmodules" file and copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with git_submodule_set_update() and write the changed value to disk using git_submodule_save(). If you have overwritten the value, you can revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is updated, checkout the new detached HEAD to the submodule directory. - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked out branch onto the commit from the superproject. - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the superproject into the current checkout out branch of the submodule. - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when the commit in the superproject is updated. - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer when we don't want any particular update rule to be specified.
  • \n
\n", + "fields": [ + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_CHECKOUT", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_REBASE", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_MERGE", + "comments": "", + "value": 3 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_NONE", + "comments": "", + "value": 4 + }, + { + "type": "int", + "name": "GIT_SUBMODULE_UPDATE_DEFAULT", + "comments": "", + "value": 0 + } + ], + "used": { + "returns": ["git_submodule_update_strategy"], + "needs": ["git_submodule_set_update"] + } + } + ], + [ + "git_tag", + { + "decl": "git_tag", + "type": "struct", + "value": "git_tag", + "file": "git2/types.h", + "line": 130, + "lineto": 130, + "tdef": "typedef", + "description": " Parsed representation of a tag object. ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_tag_dup", + "git_tag_foreach", + "git_tag_free", + "git_tag_id", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_message", + "git_tag_name", + "git_tag_owner", + "git_tag_peel", + "git_tag_tagger", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type" + ] + } + } + ], + [ + "git_time", + { + "decl": ["git_time_t time", "int offset", "char sign"], + "type": "struct", + "value": "git_time", + "file": "git2/types.h", + "line": 175, + "lineto": 179, + "block": "git_time_t time\nint offset\nchar sign", + "tdef": "typedef", + "description": " Time in a signature ", + "comments": "", + "fields": [ + { + "type": "git_time_t", + "name": "time", + "comments": " time in seconds from epoch " + }, + { + "type": "int", + "name": "offset", + "comments": " timezone offset, in minutes " + }, + { + "type": "char", + "name": "sign", + "comments": " indicator for questionable '-0000' offsets in signature " + } + ], + "used": { + "returns": ["git_commit_time"], + "needs": ["git_signature_new"] + } + } + ], + [ + "git_trace_level_t", + { + "decl": [ + "GIT_TRACE_NONE", + "GIT_TRACE_FATAL", + "GIT_TRACE_ERROR", + "GIT_TRACE_WARN", + "GIT_TRACE_INFO", + "GIT_TRACE_DEBUG", + "GIT_TRACE_TRACE" + ], + "type": "enum", + "file": "git2/trace.h", + "line": 26, + "lineto": 47, + "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", + "tdef": "typedef", + "description": " Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TRACE_NONE", + "comments": "

No tracing will be performed.

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TRACE_FATAL", + "comments": "

Severe errors that may impact the program's execution

\n", + "value": 1 + }, + { + "type": "int", + "name": "GIT_TRACE_ERROR", + "comments": "

Errors that do not impact the program's execution

\n", + "value": 2 + }, + { + "type": "int", + "name": "GIT_TRACE_WARN", + "comments": "

Warnings that suggest abnormal data

\n", + "value": 3 + }, + { + "type": "int", + "name": "GIT_TRACE_INFO", + "comments": "

Informational messages about program execution

\n", + "value": 4 + }, + { + "type": "int", + "name": "GIT_TRACE_DEBUG", + "comments": "

Detailed data that allows for debugging

\n", + "value": 5 + }, + { + "type": "int", + "name": "GIT_TRACE_TRACE", + "comments": "

Exceptionally detailed debugging data

\n", + "value": 6 + } + ], + "used": { "returns": [], "needs": ["git_trace_cb", "git_trace_set"] } + } + ], + [ + "git_transaction", + { + "decl": "git_transaction", + "type": "struct", + "value": "git_transaction", + "file": "git2/types.h", + "line": 195, + "lineto": 195, + "tdef": "typedef", + "description": " Transactional interface to references ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_config_lock", + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + } + } + ], + [ + "git_transport", + { + "decl": "git_transport", + "type": "struct", + "value": "git_transport", + "file": "git2/types.h", + "line": 247, + "lineto": 247, + "tdef": "typedef", + "description": " Interface which represents a transport to communicate with a\n remote.", + "comments": "", + "used": { "returns": [], "needs": ["git_transport_cb"] } + } + ], + [ + "git_tree", + { + "decl": "git_tree", + "type": "struct", + "value": "git_tree", + "file": "git2/types.h", + "line": 142, + "lineto": 142, + "tdef": "typedef", + "description": " Representation of a tree object. ", + "comments": "", + "used": { + "returns": [ + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_treebuilder_get" + ], + "needs": [ + "git_apply_to_tree", + "git_commit_amend", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_cb", + "git_commit_create_v", + "git_commit_tree", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index", + "git_index_read_tree", + "git_merge_trees", + "git_pathspec_match_tree", + "git_tree_create_updated", + "git_tree_dup", + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_tree_entrycount", + "git_tree_free", + "git_tree_id", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_owner", + "git_tree_walk", + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_filter_cb", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer", + "git_treewalk_cb" + ] + } + } + ], + [ + "git_tree_entry", + { + "decl": "git_tree_entry", + "type": "struct", + "value": "git_tree_entry", + "file": "git2/types.h", + "line": 139, + "lineto": 139, + "tdef": "typedef", + "description": " Representation of each one of the entries in a tree object. ", + "comments": "", + "used": { + "returns": [ + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_treebuilder_get" + ], + "needs": [ + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_treebuilder_filter_cb", + "git_treebuilder_insert", + "git_treewalk_cb" + ] + } + } + ], + [ + "git_tree_update", + { + "decl": [ + "git_tree_update_t action", + "git_oid id", + "git_filemode_t filemode", + "const char * path" + ], + "type": "struct", + "value": "git_tree_update", + "file": "git2/tree.h", + "line": 438, + "lineto": 447, + "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", + "tdef": "typedef", + "description": " An action to perform during the update of a tree", + "comments": "", + "fields": [ + { + "type": "git_tree_update_t", + "name": "action", + "comments": " Update action. If it's an removal, only the path is looked at " + }, + { "type": "git_oid", "name": "id", "comments": " The entry's id " }, + { + "type": "git_filemode_t", + "name": "filemode", + "comments": " The filemode/kind of object " + }, + { + "type": "const char *", + "name": "path", + "comments": " The full path from the root tree " + } + ], + "used": { "returns": [], "needs": ["git_tree_create_updated"] } + } + ], + [ + "git_tree_update_t", + { + "decl": ["GIT_TREE_UPDATE_UPSERT", "GIT_TREE_UPDATE_REMOVE"], + "type": "enum", + "file": "git2/tree.h", + "line": 428, + "lineto": 433, + "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", + "tdef": "typedef", + "description": " The kind of update to perform", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TREE_UPDATE_UPSERT", + "comments": "

Update or insert an entry at the specified path

\n", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TREE_UPDATE_REMOVE", + "comments": "

Remove an entry from the specified path

\n", + "value": 1 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_treebuilder", + { + "decl": "git_treebuilder", + "type": "struct", + "value": "git_treebuilder", + "file": "git2/types.h", + "line": 145, + "lineto": 145, + "tdef": "typedef", + "description": " Constructor for in-memory trees ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + } + } + ], + [ + "git_treewalk_mode", + { + "decl": ["GIT_TREEWALK_PRE", "GIT_TREEWALK_POST"], + "type": "enum", + "file": "git2/tree.h", + "line": 387, + "lineto": 390, + "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", + "tdef": "typedef", + "description": " Tree traversal modes ", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_TREEWALK_PRE", + "comments": "", + "value": 0 + }, + { + "type": "int", + "name": "GIT_TREEWALK_POST", + "comments": "", + "value": 1 + } + ], + "used": { "returns": [], "needs": ["git_tree_walk"] } + } + ], + [ + "git_worktree", + { + "decl": "git_worktree", + "type": "struct", + "value": "git_worktree", + "file": "git2/types.h", + "line": 121, + "lineto": 121, + "tdef": "typedef", + "description": " Representation of a working tree ", + "comments": "", + "used": { + "returns": [], + "needs": [ + "git_repository_open_from_worktree", + "git_worktree_add", + "git_worktree_add_options_init", + "git_worktree_free", + "git_worktree_is_locked", + "git_worktree_is_prunable", + "git_worktree_lock", + "git_worktree_lookup", + "git_worktree_name", + "git_worktree_open_from_repository", + "git_worktree_path", + "git_worktree_prune", + "git_worktree_prune_options_init", + "git_worktree_unlock", + "git_worktree_validate" + ] + } + } + ], + [ + "git_worktree_add_options", + { + "decl": [ + "unsigned int version", + "int lock", + "int checkout_existing", + "git_reference * ref", + "git_checkout_options checkout_options" + ], + "type": "struct", + "value": "git_worktree_add_options", + "file": "git2/worktree.h", + "line": 86, + "lineto": 97, + "block": "unsigned int version\nint lock\nint checkout_existing\ngit_reference * ref\ngit_checkout_options checkout_options", + "tdef": "typedef", + "description": " Worktree add options structure", + "comments": "

Initialize with GIT_WORKTREE_ADD_OPTIONS_INIT. Alternatively, you can use git_worktree_add_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "int", + "name": "lock", + "comments": " lock newly created worktree " + }, + { + "type": "int", + "name": "checkout_existing", + "comments": " allow checkout of existing branch matching worktree name " + }, + { + "type": "git_reference *", + "name": "ref", + "comments": " reference to use for the new worktree HEAD " + }, + { + "type": "git_checkout_options", + "name": "checkout_options", + "comments": " Options for the checkout." + } + ], + "used": { + "returns": [], + "needs": ["git_worktree_add", "git_worktree_add_options_init"] + } + } + ], + [ + "git_worktree_prune_options", + { + "decl": ["unsigned int version", "uint32_t flags"], + "type": "struct", + "value": "git_worktree_prune_options", + "file": "git2/worktree.h", + "line": 207, + "lineto": 212, + "block": "unsigned int version\nuint32_t flags", + "tdef": "typedef", + "description": " Worktree prune options structure", + "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", + "fields": [ + { "type": "unsigned int", "name": "version", "comments": "" }, + { + "type": "uint32_t", + "name": "flags", + "comments": " A combination of `git_worktree_prune_t` " + } + ], + "used": { + "returns": [], + "needs": [ + "git_worktree_is_prunable", + "git_worktree_prune", + "git_worktree_prune_options_init" + ] + } + } + ], + [ + "git_worktree_prune_t", + { + "decl": [ + "GIT_WORKTREE_PRUNE_VALID", + "GIT_WORKTREE_PRUNE_LOCKED", + "GIT_WORKTREE_PRUNE_WORKING_TREE" + ], + "type": "enum", + "file": "git2/worktree.h", + "line": 191, + "lineto": 198, + "block": "GIT_WORKTREE_PRUNE_VALID\nGIT_WORKTREE_PRUNE_LOCKED\nGIT_WORKTREE_PRUNE_WORKING_TREE", + "tdef": "typedef", + "description": " Flags which can be passed to git_worktree_prune to alter its\n behavior.", + "comments": "", + "fields": [ + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_VALID", + "comments": "", + "value": 1 + }, + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_LOCKED", + "comments": "", + "value": 2 + }, + { + "type": "int", + "name": "GIT_WORKTREE_PRUNE_WORKING_TREE", + "comments": "", + "value": 4 + } + ], + "used": { "returns": [], "needs": [] } + } + ], + [ + "git_writestream", + { + "decl": [ + "int (*)(git_writestream *, const char *, size_t) write", + "int (*)(git_writestream *) close", + "void (*)(git_writestream *) free" + ], + "type": "struct", + "value": "git_writestream", + "file": "git2/types.h", + "line": 359, + "lineto": 363, + "tdef": null, + "description": " A type to write in a streaming fashion, for example, for filters. ", + "comments": "", + "fields": [ + { + "type": "int (*)(git_writestream *, const char *, size_t)", + "name": "write", "comments": "" - }, - "git_transport_message_cb": { - "type": "callback", - "file": "git2/transport.h", - "line": 34, - "lineto": 34, - "args": [ - { - "name": "str", - "type": "const char *", - "comment": "The message from the transport" - }, - { - "name": "len", - "type": "int", - "comment": "The length of the message" - }, - { - "name": "payload", - "type": "void *", - "comment": "Payload provided by the caller" - } - ], - "argline": "const char *str, int len, void *payload", - "sig": "const char *::int::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for messages received by the transport.

\n", - "comments": "

Return a negative value to cancel the network operation.

\n" - }, - "git_transport_cb": { - "type": "callback", - "file": "git2/transport.h", - "line": 37, - "lineto": 37, - "args": [ - { - "name": "out", - "type": "git_transport **", - "comment": null - }, - { - "name": "owner", - "type": "git_remote *", - "comment": null - }, - { - "name": "param", - "type": "void *", - "comment": null - } - ], - "argline": "git_transport **out, git_remote *owner, void *param", - "sig": "git_transport **::git_remote *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Signature of a function which creates a transport

\n", + }, + { + "type": "int (*)(git_writestream *)", + "name": "close", "comments": "" - }, - "git_treebuilder_filter_cb": { - "type": "callback", - "file": "git2/tree.h", - "line": 349, - "lineto": 350, - "args": [ - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const git_tree_entry *entry, void *payload", - "sig": "const git_tree_entry *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for git_treebuilder_filter

\n", - "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" - }, - "git_treewalk_cb": { - "type": "callback", - "file": "git2/tree.h", - "line": 383, - "lineto": 384, - "args": [ - { - "name": "root", - "type": "const char *", - "comment": null - }, - { - "name": "entry", - "type": "const git_tree_entry *", - "comment": null - }, - { - "name": "payload", - "type": "void *", - "comment": null - } - ], - "argline": "const char *root, const git_tree_entry *entry, void *payload", - "sig": "const char *::const git_tree_entry *::void *", - "return": { - "type": "int", - "comment": null - }, - "description": "

Callback for the tree traversal method

\n", + }, + { + "type": "void (*)(git_writestream *)", + "name": "free", "comments": "" + } + ], + "block": "int (*)(git_writestream *, const char *, size_t) write\nint (*)(git_writestream *) close\nvoid (*)(git_writestream *) free", + "used": { + "returns": [], + "needs": [ + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] } - }, - "globals": {}, - "types": [ - [ - "git_annotated_commit", - { - "decl": "git_annotated_commit", - "type": "struct", - "value": "git_annotated_commit", - "file": "git2/types.h", - "line": 198, - "lineto": 198, - "tdef": "typedef", - "description": " Annotated commits, the input to merge and rebase. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_annotated_commit_free", - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_from_ref", - "git_annotated_commit_from_revspec", - "git_annotated_commit_id", - "git_annotated_commit_lookup", - "git_annotated_commit_ref", - "git_branch_create_from_annotated", - "git_merge", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_rebase_init", - "git_repository_set_head_detached_from_annotated", - "git_reset_from_annotated" - ] - } - } - ], - [ - "git_apply_flags_t", - { - "decl": [ - "GIT_APPLY_CHECK" - ], - "type": "enum", - "file": "git2/apply.h", - "line": 61, - "lineto": 67, - "block": "GIT_APPLY_CHECK", - "tdef": "typedef", - "description": " Flags controlling the behavior of git_apply ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_APPLY_CHECK", - "comments": "

Don't actually make changes, just test that the patch applies.\n This is the equivalent of git apply --check.

\n", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_apply_location_t", - { - "decl": [ - "GIT_APPLY_LOCATION_WORKDIR", - "GIT_APPLY_LOCATION_INDEX", - "GIT_APPLY_LOCATION_BOTH" - ], - "type": "enum", - "file": "git2/apply.h", - "line": 127, - "lineto": 145, - "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", - "tdef": "typedef", - "description": " Possible application locations for git_apply ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_APPLY_LOCATION_WORKDIR", - "comments": "

Apply the patch to the workdir, leaving the index untouched.\n This is the equivalent of git apply with no location argument.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_APPLY_LOCATION_INDEX", - "comments": "

Apply the patch to the index, leaving the working directory\n untouched. This is the equivalent of git apply --cached.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_APPLY_LOCATION_BOTH", - "comments": "

Apply the patch to both the working directory and the index.\n This is the equivalent of git apply --index.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [ - "git_apply" - ] - } - } - ], - [ - "git_apply_options", - { - "decl": [ - "unsigned int version", - "git_apply_delta_cb delta_cb", - "git_apply_hunk_cb hunk_cb", - "void * payload", - "unsigned int flags" - ], - "type": "struct", - "value": "git_apply_options", - "file": "git2/apply.h", - "line": 77, - "lineto": 91, - "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload\nunsigned int flags", - "tdef": "typedef", - "description": " Apply options structure", - "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The version " - }, - { - "type": "git_apply_delta_cb", - "name": "delta_cb", - "comments": " When applying a patch, callback that will be made per delta (file). " - }, - { - "type": "git_apply_hunk_cb", - "name": "hunk_cb", - "comments": " When applying a patch, callback that will be made per hunk. " - }, - { - "type": "void *", - "name": "payload", - "comments": " Payload passed to both delta_cb \n&\n hunk_cb. " - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " Bitmask of git_apply_flags_t " - } - ], - "used": { - "returns": [], - "needs": [ - "git_apply", - "git_apply_options_init", - "git_apply_to_tree" - ] - } - } - ], - [ - "git_attr_options", - { - "decl": [ - "unsigned int version", - "unsigned int flags", - "git_oid * commit_id", - "git_oid attr_commit_id" - ], - "type": "struct", - "value": "git_attr_options", - "file": "git2/attr.h", - "line": 144, - "lineto": 161, - "block": "unsigned int version\nunsigned int flags\ngit_oid * commit_id\ngit_oid attr_commit_id", - "tdef": "typedef", - "description": " An options structure for querying attributes.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " A combination of GIT_ATTR_CHECK flags " - }, - { - "type": "git_oid *", - "name": "commit_id", - "comments": "" - }, - { - "type": "git_oid", - "name": "attr_commit_id", - "comments": " The commit to load attributes from, when\n `GIT_ATTR_CHECK_INCLUDE_COMMIT` is specified." - } - ], - "used": { - "returns": [], - "needs": [ - "git_attr_foreach_ext", - "git_attr_get_ext", - "git_attr_get_many_ext" - ] - } - } - ], - [ - "git_attr_value_t", - { - "decl": [ - "GIT_ATTR_VALUE_UNSPECIFIED", - "GIT_ATTR_VALUE_TRUE", - "GIT_ATTR_VALUE_FALSE", - "GIT_ATTR_VALUE_STRING" - ], - "type": "enum", - "file": "git2/attr.h", - "line": 82, - "lineto": 87, - "block": "GIT_ATTR_VALUE_UNSPECIFIED\nGIT_ATTR_VALUE_TRUE\nGIT_ATTR_VALUE_FALSE\nGIT_ATTR_VALUE_STRING", - "tdef": "typedef", - "description": " Possible states for an attribute", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_ATTR_VALUE_UNSPECIFIED", - "comments": "

The attribute has been left unspecified

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_ATTR_VALUE_TRUE", - "comments": "

The attribute has been set

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_ATTR_VALUE_FALSE", - "comments": "

The attribute has been unset

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_ATTR_VALUE_STRING", - "comments": "

This attribute has a value

\n", - "value": 3 - } - ], - "used": { - "returns": [ - "git_attr_value" - ], - "needs": [] - } - } - ], - [ - "git_blame", - { - "decl": "git_blame", - "type": "struct", - "value": "git_blame", - "file": "git2/blame.h", - "line": 202, - "lineto": 202, - "tdef": "typedef", - "description": " Opaque structure to hold blame results ", - "comments": "", - "used": { - "returns": [ - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline" - ], - "needs": [ - "git_blame_buffer", - "git_blame_file", - "git_blame_free", - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline", - "git_blame_get_hunk_count", - "git_blame_init_options", - "git_blame_options_init" - ] - } - } - ], - [ - "git_blame_flag_t", - { - "decl": [ - "GIT_BLAME_NORMAL", - "GIT_BLAME_TRACK_COPIES_SAME_FILE", - "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", - "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", - "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", - "GIT_BLAME_FIRST_PARENT", - "GIT_BLAME_USE_MAILMAP", - "GIT_BLAME_IGNORE_WHITESPACE" - ], - "type": "enum", - "file": "git2/blame.h", - "line": 26, - "lineto": 77, - "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", - "tdef": "typedef", - "description": " Flags for indicating option behavior for git_blame APIs.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_BLAME_NORMAL", - "comments": "

Normal blame, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_SAME_FILE", - "comments": "

Track lines that have moved within a file (like git blame -M).

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES", - "comments": "

Track lines that have moved across files in the same commit\n (like git blame -C).

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES", - "comments": "

Track lines that have been copied from another file that exists\n in the same commit (like git blame -CC). Implies SAME_FILE.

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES", - "comments": "

Track lines that have been copied from another file that exists in\n any commit (like git blame -CCC). Implies SAME_COMMIT_COPIES.

\n\n

This is not yet implemented and reserved for future use.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_BLAME_FIRST_PARENT", - "comments": "

Restrict the search of commits to those reachable following only\n the first parents.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_BLAME_USE_MAILMAP", - "comments": "

Use mailmap file to map author and committer names and email\n addresses to canonical real names and email addresses. The\n mailmap will be read from the working directory, or HEAD in a\n bare repository.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_BLAME_IGNORE_WHITESPACE", - "comments": "

Ignore whitespace differences

\n", - "value": 64 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_blame_hunk", - { - "decl": [ - "size_t lines_in_hunk", - "git_oid final_commit_id", - "size_t final_start_line_number", - "git_signature * final_signature", - "git_oid orig_commit_id", - "const char * orig_path", - "size_t orig_start_line_number", - "git_signature * orig_signature", - "char boundary" - ], - "type": "struct", - "value": "git_blame_hunk", - "file": "git2/blame.h", - "line": 145, - "lineto": 198, - "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", - "tdef": "typedef", - "description": " Structure that represents a blame hunk.", - "comments": "", - "fields": [ - { - "type": "size_t", - "name": "lines_in_hunk", - "comments": " The number of lines in this hunk." - }, - { - "type": "git_oid", - "name": "final_commit_id", - "comments": " The OID of the commit where this line was last changed." - }, - { - "type": "size_t", - "name": "final_start_line_number", - "comments": " The 1-based line number where this hunk begins, in the final version\n of the file." - }, - { - "type": "git_signature *", - "name": "final_signature", - "comments": " The author of `final_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." - }, - { - "type": "git_oid", - "name": "orig_commit_id", - "comments": " The OID of the commit where this hunk was found.\n This will usually be the same as `final_commit_id`, except when\n `GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES` has been specified." - }, - { - "type": "const char *", - "name": "orig_path", - "comments": " The path to the file where this hunk originated, as of the commit\n specified by `orig_commit_id`." - }, - { - "type": "size_t", - "name": "orig_start_line_number", - "comments": " The 1-based line number where this hunk begins in the file named by\n `orig_path` in the commit specified by `orig_commit_id`." - }, - { - "type": "git_signature *", - "name": "orig_signature", - "comments": " The author of `orig_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." - }, - { - "type": "char", - "name": "boundary", - "comments": " The 1 iff the hunk has been tracked to a boundary commit (the root,\n or the commit specified in git_blame_options.oldest_commit)" - } - ], - "used": { - "returns": [ - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline" - ], - "needs": [] - } - } - ], - [ - "git_blame_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "uint16_t min_match_characters", - "git_oid newest_commit", - "git_oid oldest_commit", - "size_t min_line", - "size_t max_line" - ], - "type": "struct", - "value": "git_blame_options", - "file": "git2/blame.h", - "line": 86, - "lineto": 123, - "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", - "tdef": "typedef", - "description": " Blame options structure", - "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can use git_blame_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of `git_blame_flag_t` " - }, - { - "type": "uint16_t", - "name": "min_match_characters", - "comments": " The lower bound on the number of alphanumeric characters that\n must be detected as moving/copying within a file for it to\n associate those lines with the parent commit. The default value\n is 20.\n\n This value only takes effect if any of the `GIT_BLAME_TRACK_COPIES_*`\n flags are specified." - }, - { - "type": "git_oid", - "name": "newest_commit", - "comments": " The id of the newest commit to consider. The default is HEAD. " - }, - { - "type": "git_oid", - "name": "oldest_commit", - "comments": " The id of the oldest commit to consider.\n The default is the first commit encountered with a NULL parent." - }, - { - "type": "size_t", - "name": "min_line", - "comments": " The first line in the file to blame.\n The default is 1 (line numbers start with 1)." - }, - { - "type": "size_t", - "name": "max_line", - "comments": " The last line in the file to blame.\n The default is the last line of the file." - } - ], - "used": { - "returns": [], - "needs": [ - "git_blame_file", - "git_blame_init_options", - "git_blame_options_init" - ] - } - } - ], - [ - "git_blob", - { - "decl": "git_blob", - "type": "struct", - "value": "git_blob", - "file": "git2/types.h", - "line": 133, - "lineto": 133, - "tdef": "typedef", - "description": " In-memory representation of a blob object. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_blob_dup", - "git_blob_filter", - "git_blob_filter_options_init", - "git_blob_filtered_content", - "git_blob_free", - "git_blob_id", - "git_blob_is_binary", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_blob_owner", - "git_blob_rawcontent", - "git_blob_rawsize", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_filter_list_apply_to_blob", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs" - ] - } - } - ], - [ - "git_blob_filter_flag_t", - { - "decl": [ - "GIT_BLOB_FILTER_CHECK_FOR_BINARY", - "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", - "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", - "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT" - ], - "type": "enum", - "file": "git2/blob.h", - "line": 102, - "lineto": 123, - "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", - "tdef": "typedef", - "description": " Flags to control the functionality of `git_blob_filter`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_BLOB_FILTER_CHECK_FOR_BINARY", - "comments": "

When set, filters will not be applied to binary files.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES", - "comments": "

When set, filters will not load configuration from the\n system-wide gitattributes in /etc (or system equivalent).

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD", - "comments": "

When set, filters will be loaded from a .gitattributes file\n in the HEAD commit.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", - "comments": "

When set, filters will be loaded from a .gitattributes file\n in the specified commit.

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_blob_filter_options", - { - "decl": [ - "int version", - "uint32_t flags", - "git_oid * commit_id", - "git_oid attr_commit_id" - ], - "type": "struct", - "value": "git_blob_filter_options", - "file": "git2/blob.h", - "line": 132, - "lineto": 149, - "block": "int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", - "tdef": "typedef", - "description": " The options used when applying filter options to a file.", - "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n", - "fields": [ - { - "type": "int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above " - }, - { - "type": "git_oid *", - "name": "commit_id", - "comments": "" - }, - { - "type": "git_oid", - "name": "attr_commit_id", - "comments": " The commit to load attributes from, when\n `GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." - } - ], - "used": { - "returns": [], - "needs": [ - "git_blob_filter", - "git_blob_filter_options_init" - ] - } - } - ], - [ - "git_branch_iterator", - { - "decl": "git_branch_iterator", - "type": "struct", - "value": "git_branch_iterator", - "file": "git2/branch.h", - "line": 90, - "lineto": 90, - "tdef": "typedef", - "description": " Iterator type for branches ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_branch_iterator_free", - "git_branch_iterator_new", - "git_branch_next" - ] - } - } - ], - [ - "git_branch_t", - { - "decl": [ - "GIT_BRANCH_LOCAL", - "GIT_BRANCH_REMOTE", - "GIT_BRANCH_ALL" - ], - "type": "enum", - "file": "git2/types.h", - "line": 215, - "lineto": 219, - "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", - "tdef": "typedef", - "description": " Basic type of any Git branch. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_BRANCH_LOCAL", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_BRANCH_REMOTE", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_BRANCH_ALL", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [ - "git_branch_iterator_new", - "git_branch_lookup", - "git_branch_next" - ] - } - } - ], - [ - "git_buf", - { - "decl": [ - "char * ptr", - "size_t reserved", - "size_t size" - ], - "type": "struct", - "value": "git_buf", - "file": "git2/buffer.h", - "line": 33, - "lineto": 52, - "block": "char * ptr\nsize_t reserved\nsize_t size", - "tdef": "typedef", - "description": " A data buffer for exporting data from libgit2", - "comments": "

Sometimes libgit2 wants to return an allocated data buffer to the caller and have the caller take responsibility for freeing that memory. To make ownership clear in these cases, libgit2 uses git_buf to return this data. Callers should use git_buf_dispose() to release the memory when they are done.

\n\n

A git_buf contains a pointer to a NUL-terminated C string, and the length of the string (not including the NUL terminator).

\n", - "fields": [ - { - "type": "char *", - "name": "ptr", - "comments": " The buffer contents. `ptr` points to the start of the buffer\n being returned. The buffer's length (in bytes) is specified\n by the `size` member of the structure, and contains a NUL\n terminator at position `(size + 1)`." - }, - { - "type": "size_t", - "name": "reserved", - "comments": " This field is reserved and unused." - }, - { - "type": "size_t", - "name": "size", - "comments": " The length (in bytes) of the buffer pointed to by `ptr`,\n not including a NUL terminator." - } - ], - "used": { - "returns": [], - "needs": [ - "git_blob_filter", - "git_blob_filtered_content", - "git_branch_remote_name", - "git_branch_upstream_merge", - "git_branch_upstream_name", - "git_branch_upstream_remote", - "git_buf_contains_nul", - "git_buf_dispose", - "git_buf_free", - "git_buf_grow", - "git_buf_is_binary", - "git_buf_set", - "git_commit_create_buffer", - "git_commit_extract_signature", - "git_commit_header_field", - "git_commit_signing_cb", - "git_config_find_global", - "git_config_find_programdata", - "git_config_find_system", - "git_config_find_xdg", - "git_config_get_path", - "git_config_get_string_buf", - "git_config_parse_path", - "git_describe_format", - "git_diff_commit_as_email", - "git_diff_format_email", - "git_diff_stats_to_buf", - "git_diff_to_buf", - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_stream_data", - "git_message_prettify", - "git_note_default_ref", - "git_object_short_id", - "git_packbuilder_write_buf", - "git_patch_to_buf", - "git_refspec_rtransform", - "git_refspec_transform", - "git_remote_default_branch", - "git_repository_discover", - "git_repository_item_path", - "git_repository_message", - "git_submodule_resolve_url", - "git_treebuilder_write_with_buffer", - "git_url_resolve_cb", - "git_worktree_is_locked" - ] - } - } - ], - [ - "git_cert", - { - "decl": "git_cert", - "type": "struct", - "value": "git_cert", - "file": "git2/types.h", - "line": 262, - "lineto": 262, - "block": "git_cert_t cert_type", - "tdef": "typedef", - "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", - "comments": "", - "fields": [ - { - "type": "git_cert_t", - "name": "cert_type", - "comments": " Type of certificate. A `GIT_CERT_` value." - } - ], - "used": { - "returns": [], - "needs": [ - "git_transport_certificate_check_cb" - ] - } - } - ], - [ - "git_cert_hostkey", - { - "decl": [ - "git_cert parent", - "git_cert_ssh_t type", - "unsigned char [16] hash_md5", - "unsigned char [20] hash_sha1", - "unsigned char [32] hash_sha256", - "git_cert_ssh_raw_type_t raw_type", - "const char * hostkey", - "size_t hostkey_len" - ], - "type": "struct", - "value": "git_cert_hostkey", - "file": "git2/cert.h", - "line": 108, - "lineto": 151, - "block": "git_cert parent\ngit_cert_ssh_t type\nunsigned char [16] hash_md5\nunsigned char [20] hash_sha1\nunsigned char [32] hash_sha256\ngit_cert_ssh_raw_type_t raw_type\nconst char * hostkey\nsize_t hostkey_len", - "tdef": "typedef", - "description": " Hostkey information taken from libssh2", - "comments": "", - "fields": [ - { - "type": "git_cert", - "name": "parent", - "comments": " The parent cert " - }, - { - "type": "git_cert_ssh_t", - "name": "type", - "comments": " A bitmask containing the available fields." - }, - { - "type": "unsigned char [16]", - "name": "hash_md5", - "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_MD5` set, this will\n have the MD5 hash of the hostkey." - }, - { - "type": "unsigned char [20]", - "name": "hash_sha1", - "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA1` set, this will\n have the SHA-1 hash of the hostkey." - }, - { - "type": "unsigned char [32]", - "name": "hash_sha256", - "comments": " Hostkey hash. If `type` has `GIT_CERT_SSH_SHA256` set, this will\n have the SHA-256 hash of the hostkey." - }, - { - "type": "git_cert_ssh_raw_type_t", - "name": "raw_type", - "comments": " Raw hostkey type. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the type of the raw hostkey." - }, - { - "type": "const char *", - "name": "hostkey", - "comments": " Pointer to the raw hostkey. If `type` has `GIT_CERT_SSH_RAW` set,\n this will have the raw contents of the hostkey." - }, - { - "type": "size_t", - "name": "hostkey_len", - "comments": " Raw hostkey length. If `type` has `GIT_CERT_SSH_RAW` set, this will\n have the length of the raw contents of the hostkey." - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cert_ssh_t", - { - "decl": [ - "GIT_CERT_SSH_MD5", - "GIT_CERT_SSH_SHA1", - "GIT_CERT_SSH_SHA256", - "GIT_CERT_SSH_RAW" - ], - "type": "enum", - "file": "git2/cert.h", - "line": 77, - "lineto": 86, - "block": "GIT_CERT_SSH_MD5\nGIT_CERT_SSH_SHA1\nGIT_CERT_SSH_SHA256\nGIT_CERT_SSH_RAW", - "tdef": "typedef", - "description": " Type of SSH host fingerprint", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CERT_SSH_MD5", - "comments": "

MD5 is available

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CERT_SSH_SHA1", - "comments": "

SHA-1 is available

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CERT_SSH_SHA256", - "comments": "

SHA-256 is available

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CERT_SSH_RAW", - "comments": "

Raw hostkey is available

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cert_t", - { - "decl": [ - "GIT_CERT_NONE", - "GIT_CERT_X509", - "GIT_CERT_HOSTKEY_LIBSSH2", - "GIT_CERT_STRARRAY" - ], - "type": "enum", - "file": "git2/cert.h", - "line": 25, - "lineto": 48, - "block": "GIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY\nGIT_CERT_NONE\nGIT_CERT_X509\nGIT_CERT_HOSTKEY_LIBSSH2\nGIT_CERT_STRARRAY", - "tdef": "typedef", - "description": " Type of host certificate structure that is passed to the check callback", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CERT_NONE", - "comments": "

No information about the certificate is available. This may\n happen when using curl.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CERT_X509", - "comments": "

The data argument to the callback will be a pointer to\n the DER-encoded data.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CERT_HOSTKEY_LIBSSH2", - "comments": "

The data argument to the callback will be a pointer to a\n git_cert_hostkey structure.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CERT_STRARRAY", - "comments": "

The data argument to the callback will be a pointer to a\n git_strarray with name:content strings containing\n information about the certificate. This is used when using\n curl.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cert_x509", - { - "decl": [ - "git_cert parent", - "void * data", - "size_t len" - ], - "type": "struct", - "value": "git_cert_x509", - "file": "git2/cert.h", - "line": 156, - "lineto": 168, - "block": "git_cert parent\nvoid * data\nsize_t len", - "tdef": "typedef", - "description": " X.509 certificate information", - "comments": "", - "fields": [ - { - "type": "git_cert", - "name": "parent", - "comments": " The parent cert " - }, - { - "type": "void *", - "name": "data", - "comments": " Pointer to the X.509 certificate data" - }, - { - "type": "size_t", - "name": "len", - "comments": " Length of the memory block pointed to by `data`." - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_checkout_notify_t", - { - "decl": [ - "GIT_CHECKOUT_NOTIFY_NONE", - "GIT_CHECKOUT_NOTIFY_CONFLICT", - "GIT_CHECKOUT_NOTIFY_DIRTY", - "GIT_CHECKOUT_NOTIFY_UPDATED", - "GIT_CHECKOUT_NOTIFY_UNTRACKED", - "GIT_CHECKOUT_NOTIFY_IGNORED", - "GIT_CHECKOUT_NOTIFY_ALL" - ], - "type": "enum", - "file": "git2/checkout.h", - "line": 214, - "lineto": 245, - "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", - "tdef": "typedef", - "description": " Checkout notification flags", - "comments": "

Checkout will invoke an options notification callback (notify_cb) for certain cases - you pick which ones via notify_flags:

\n\n

Returning a non-zero value from this callback will cancel the checkout. The non-zero return value will be propagated back and returned by the git_checkout_... call.

\n\n

Notification callbacks are made prior to modifying any files on disk, so canceling on any notification will still happen prior to any files being modified.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_CONFLICT", - "comments": "

Invokes checkout on conflicting paths.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_DIRTY", - "comments": "

Notifies about "dirty" files, i.e. those that do not need an update\n but no longer match the baseline. Core git displays these files when\n checkout runs, but won't stop the checkout.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_UPDATED", - "comments": "

Sends notification for any file changed.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_UNTRACKED", - "comments": "

Notifies about untracked files.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_IGNORED", - "comments": "

Notifies about ignored files.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NOTIFY_ALL", - "comments": "

Notifies about ignored files.

\n", - "value": 65535 - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_notify_cb" - ] - } - } - ], - [ - "git_checkout_options", - { - "decl": [ - "unsigned int version", - "unsigned int checkout_strategy", - "int disable_filters", - "unsigned int dir_mode", - "unsigned int file_mode", - "int file_open_flags", - "unsigned int notify_flags", - "git_checkout_notify_cb notify_cb", - "void * notify_payload", - "git_checkout_progress_cb progress_cb", - "void * progress_payload", - "git_strarray paths", - "git_tree * baseline", - "git_index * baseline_index", - "const char * target_directory", - "const char * ancestor_label", - "const char * our_label", - "const char * their_label", - "git_checkout_perfdata_cb perfdata_cb", - "void * perfdata_payload" - ], - "type": "struct", - "value": "git_checkout_options", - "file": "git2/checkout.h", - "line": 282, - "lineto": 345, - "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", - "tdef": "typedef", - "description": " Checkout options structure", - "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The version " - }, - { - "type": "unsigned int", - "name": "checkout_strategy", - "comments": " default will be a safe checkout " - }, - { - "type": "int", - "name": "disable_filters", - "comments": " don't apply filters like CRLF conversion " - }, - { - "type": "unsigned int", - "name": "dir_mode", - "comments": " default is 0755 " - }, - { - "type": "unsigned int", - "name": "file_mode", - "comments": " default is 0644 or 0755 as dictated by blob " - }, - { - "type": "int", - "name": "file_open_flags", - "comments": " default is O_CREAT | O_TRUNC | O_WRONLY " - }, - { - "type": "unsigned int", - "name": "notify_flags", - "comments": " see `git_checkout_notify_t` above " - }, - { - "type": "git_checkout_notify_cb", - "name": "notify_cb", - "comments": " Optional callback to get notifications on specific file states.\n " - }, - { - "type": "void *", - "name": "notify_payload", - "comments": " Payload passed to notify_cb " - }, - { - "type": "git_checkout_progress_cb", - "name": "progress_cb", - "comments": " Optional callback to notify the consumer of checkout progress. " - }, - { - "type": "void *", - "name": "progress_payload", - "comments": " Payload passed to progress_cb " - }, - { - "type": "git_strarray", - "name": "paths", - "comments": " A list of wildmatch patterns or paths.\n\n By default, all paths are processed. If you pass an array of wildmatch\n patterns, those will be used to filter which paths should be taken into\n account.\n\n Use GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH to treat as a simple list." - }, - { - "type": "git_tree *", - "name": "baseline", - "comments": " The expected content of the working directory; defaults to HEAD.\n\n If the working directory does not match this baseline information,\n that will produce a checkout conflict." - }, - { - "type": "git_index *", - "name": "baseline_index", - "comments": " Like `baseline` above, though expressed as an index. This\n option overrides `baseline`." - }, - { - "type": "const char *", - "name": "target_directory", - "comments": " alternative checkout path to workdir " - }, - { - "type": "const char *", - "name": "ancestor_label", - "comments": " the name of the common ancestor side of conflicts " - }, - { - "type": "const char *", - "name": "our_label", - "comments": " the name of the \"our\" side of conflicts " - }, - { - "type": "const char *", - "name": "their_label", - "comments": " the name of the \"their\" side of conflicts " - }, - { - "type": "git_checkout_perfdata_cb", - "name": "perfdata_cb", - "comments": " Optional callback to notify the consumer of performance data. " - }, - { - "type": "void *", - "name": "perfdata_payload", - "comments": " Payload passed to perfdata_cb " - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_head", - "git_checkout_index", - "git_checkout_options_init", - "git_checkout_tree", - "git_merge", - "git_reset", - "git_reset_from_annotated" - ] - } - } - ], - [ - "git_checkout_perfdata", - { - "decl": [ - "size_t mkdir_calls", - "size_t stat_calls", - "size_t chmod_calls" - ], - "type": "struct", - "value": "git_checkout_perfdata", - "file": "git2/checkout.h", - "line": 248, - "lineto": 252, - "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", - "tdef": "typedef", - "description": " Checkout performance-reporting structure ", - "comments": "", - "fields": [ - { - "type": "size_t", - "name": "mkdir_calls", - "comments": "" - }, - { - "type": "size_t", - "name": "stat_calls", - "comments": "" - }, - { - "type": "size_t", - "name": "chmod_calls", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_perfdata_cb" - ] - } - } - ], - [ - "git_checkout_strategy_t", - { - "decl": [ - "GIT_CHECKOUT_NONE", - "GIT_CHECKOUT_SAFE", - "GIT_CHECKOUT_FORCE", - "GIT_CHECKOUT_RECREATE_MISSING", - "GIT_CHECKOUT_ALLOW_CONFLICTS", - "GIT_CHECKOUT_REMOVE_UNTRACKED", - "GIT_CHECKOUT_REMOVE_IGNORED", - "GIT_CHECKOUT_UPDATE_ONLY", - "GIT_CHECKOUT_DONT_UPDATE_INDEX", - "GIT_CHECKOUT_NO_REFRESH", - "GIT_CHECKOUT_SKIP_UNMERGED", - "GIT_CHECKOUT_USE_OURS", - "GIT_CHECKOUT_USE_THEIRS", - "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", - "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", - "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", - "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", - "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", - "GIT_CHECKOUT_DONT_REMOVE_EXISTING", - "GIT_CHECKOUT_DONT_WRITE_INDEX", - "GIT_CHECKOUT_DRY_RUN", - "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", - "GIT_CHECKOUT_UPDATE_SUBMODULES", - "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" - ], - "type": "enum", - "file": "git2/checkout.h", - "line": 106, - "lineto": 198, - "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", - "tdef": "typedef", - "description": " Checkout behavior flags", - "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_CHECKOUT_NONE", - "comments": "

default is a dry run, no actual updates

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_SAFE", - "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked out files,\n the checkout will still proceed, leaving the changes intact.

\n\n

Mutually exclusive with GIT_CHECKOUT_FORCE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_FORCE", - "comments": "

Allow all updates to force working directory to look like index.

\n\n

Mutually exclusive with GIT_CHECKOUT_SAFE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_RECREATE_MISSING", - "comments": "

Allow checkout to recreate missing files

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_ALLOW_CONFLICTS", - "comments": "

Allow checkout to make safe updates even if conflicts are found

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_REMOVE_UNTRACKED", - "comments": "

Remove untracked files not in index (that are not ignored)

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_REMOVE_IGNORED", - "comments": "

Remove ignored files not in index

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_UPDATE_ONLY", - "comments": "

Only update existing files, don't create new ones

\n", - "value": 128 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_UPDATE_INDEX", - "comments": "

Normally checkout updates index entries as it goes; this stops that.\n Implies GIT_CHECKOUT_DONT_WRITE_INDEX.

\n", - "value": 256 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_NO_REFRESH", - "comments": "

Don't refresh index/config/etc before doing checkout

\n", - "value": 512 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_SKIP_UNMERGED", - "comments": "

Allow checkout to skip unmerged files

\n", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_USE_OURS", - "comments": "

For unmerged files, checkout stage 2 from index

\n", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_USE_THEIRS", - "comments": "

For unmerged files, checkout stage 3 from index

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH", - "comments": "

Treat pathspec as simple list of exact match file paths

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES", - "comments": "

Ignore directories in use, they will be left empty

\n", - "value": 262144 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_OVERWRITE_IGNORED", - "comments": "

Don't overwrite ignored files that exist in the checkout target

\n", - "value": 524288 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_CONFLICT_STYLE_MERGE", - "comments": "

Write normal merge files for conflicts

\n", - "value": 1048576 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_CONFLICT_STYLE_DIFF3", - "comments": "

Include common ancestor data in diff3 format files for conflicts

\n", - "value": 2097152 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_REMOVE_EXISTING", - "comments": "

Don't overwrite existing files or folders

\n", - "value": 4194304 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DONT_WRITE_INDEX", - "comments": "

Normally checkout writes the index upon completion; this prevents that.

\n", - "value": 8388608 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_DRY_RUN", - "comments": "

Show what would be done by a checkout. Stop after sending\n notifications; don't update the working directory or index.

\n", - "value": 16777216 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", - "comments": "

Include common ancestor data in zdiff3 format for conflicts

\n", - "value": 33554432 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_UPDATE_SUBMODULES", - "comments": "

Recursively checkout submodules with same options (NOT IMPLEMENTED)

\n", - "value": 65536 - }, - { - "type": "int", - "name": "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", - "comments": "

Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED)

\n", - "value": 131072 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_cherrypick_options", - { - "decl": [ - "unsigned int version", - "unsigned int mainline", - "git_merge_options merge_opts", - "git_checkout_options checkout_opts" - ], - "type": "struct", - "value": "git_cherrypick_options", - "file": "git2/cherrypick.h", - "line": 26, - "lineto": 34, - "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", - "tdef": "typedef", - "description": " Cherry-pick options", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "mainline", - "comments": " For merge commits, the \"mainline\" is treated as the parent. " - }, - { - "type": "git_merge_options", - "name": "merge_opts", - "comments": " Options for the merging " - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " Options for the checkout " - } - ], - "used": { - "returns": [], - "needs": [ - "git_cherrypick", - "git_cherrypick_options_init" - ] - } - } - ], - [ - "git_clone_local_t", - { - "decl": [ - "GIT_CLONE_LOCAL_AUTO", - "GIT_CLONE_LOCAL", - "GIT_CLONE_NO_LOCAL", - "GIT_CLONE_LOCAL_NO_LINKS" - ], - "type": "enum", - "file": "git2/clone.h", - "line": 33, - "lineto": 53, - "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", - "tdef": "typedef", - "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CLONE_LOCAL_AUTO", - "comments": "

Auto-detect (default), libgit2 will bypass the git-aware\n transport for local paths, but use a normal fetch for\n file:// urls.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CLONE_LOCAL", - "comments": "

Bypass the git-aware transport even for a file:// url.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CLONE_NO_LOCAL", - "comments": "

Do no bypass the git-aware transport

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CLONE_LOCAL_NO_LINKS", - "comments": "

Bypass the git-aware transport, but do not try to use\n hardlinks.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_clone_options", - { - "decl": [ - "unsigned int version", - "git_checkout_options checkout_opts", - "git_fetch_options fetch_opts", - "int bare", - "git_clone_local_t local", - "const char * checkout_branch", - "git_repository_create_cb repository_cb", - "void * repository_cb_payload", - "git_remote_create_cb remote_cb", - "void * remote_cb_payload" - ], - "type": "struct", - "value": "git_clone_options", - "file": "git2/clone.h", - "line": 103, - "lineto": 164, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", - "tdef": "typedef", - "description": " Clone options structure", - "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`." - }, - { - "type": "git_fetch_options", - "name": "fetch_opts", - "comments": " Options which control the fetch, including callbacks.\n\n The callbacks are used for reporting fetch progress, and for acquiring\n credentials in the event they are needed." - }, - { - "type": "int", - "name": "bare", - "comments": " Set to zero (false) to create a standard repo, or non-zero\n for a bare repo" - }, - { - "type": "git_clone_local_t", - "name": "local", - "comments": " Whether to use a fetch or copy the object database." - }, - { - "type": "const char *", - "name": "checkout_branch", - "comments": " The name of the branch to checkout. NULL means use the\n remote's default branch." - }, - { - "type": "git_repository_create_cb", - "name": "repository_cb", - "comments": " A callback used to create the new repository into which to\n clone. If NULL, the 'bare' field will be used to determine\n whether to create a bare repository." - }, - { - "type": "void *", - "name": "repository_cb_payload", - "comments": " An opaque payload to pass to the git_repository creation callback.\n This parameter is ignored unless repository_cb is non-NULL." - }, - { - "type": "git_remote_create_cb", - "name": "remote_cb", - "comments": " A callback used to create the git_remote, prior to its being\n used to perform the clone operation. See the documentation for\n git_remote_create_cb for details. This parameter may be NULL,\n indicating that git_clone should provide default behavior." - }, - { - "type": "void *", - "name": "remote_cb_payload", - "comments": " An opaque payload to pass to the git_remote creation callback.\n This parameter is ignored unless remote_cb is non-NULL." - } - ], - "used": { - "returns": [], - "needs": [ - "git_clone", - "git_clone_options_init" - ] - } - } - ], - [ - "git_commit", - { - "decl": "git_commit", - "type": "struct", - "value": "git_commit", - "file": "git2/types.h", - "line": 136, - "lineto": 136, - "tdef": "typedef", - "description": " Parsed representation of a commit object. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_branch_create", - "git_cherrypick", - "git_cherrypick_commit", - "git_commit_amend", - "git_commit_author", - "git_commit_author_with_mailmap", - "git_commit_body", - "git_commit_committer", - "git_commit_committer_with_mailmap", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_cb", - "git_commit_dup", - "git_commit_free", - "git_commit_header_field", - "git_commit_id", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_commit_message", - "git_commit_message_encoding", - "git_commit_message_raw", - "git_commit_nth_gen_ancestor", - "git_commit_owner", - "git_commit_parent", - "git_commit_parent_id", - "git_commit_parentcount", - "git_commit_raw_header", - "git_commit_summary", - "git_commit_time", - "git_commit_time_offset", - "git_commit_tree", - "git_commit_tree_id", - "git_diff_commit_as_email", - "git_merge_commits", - "git_note_commit_create", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_commit_remove", - "git_odb_set_commit_graph", - "git_revert", - "git_revert_commit" - ] - } - } - ], - [ - "git_commit_graph", - { - "decl": "git_commit_graph", - "type": "struct", - "value": "git_commit_graph", - "file": "git2/types.h", - "line": 109, - "lineto": 109, - "tdef": "typedef", - "description": " A git commit-graph ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_odb_set_commit_graph" - ] - } - } - ], - [ - "git_commit_graph_split_strategy_t", - { - "decl": [ - "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE" - ], - "type": "enum", - "file": "git2/sys/commit_graph.h", - "line": 102, - "lineto": 108, - "block": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", - "tdef": "typedef", - "description": " The strategy to use when adding a new set of commits to a pre-existing\n commit-graph chain.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", - "comments": "

Do not split commit-graph files. The other split strategy-related option\n fields are ignored.

\n", - "value": 0 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_commit_graph_writer", - { - "decl": "git_commit_graph_writer", - "type": "struct", - "value": "git_commit_graph_writer", - "file": "git2/types.h", - "line": 112, - "lineto": 112, - "tdef": "typedef", - "description": " a writer for commit-graph files. ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_config", - { - "decl": "git_config", - "type": "struct", - "value": "git_config", - "file": "git2/types.h", - "line": 157, - "lineto": 157, - "tdef": "typedef", - "description": " Memory representation of a set of config files ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_add_file_ondisk", - "git_config_backend_foreach_match", - "git_config_delete_entry", - "git_config_delete_multivar", - "git_config_entry_free", - "git_config_foreach", - "git_config_foreach_cb", - "git_config_foreach_match", - "git_config_free", - "git_config_get_bool", - "git_config_get_entry", - "git_config_get_int32", - "git_config_get_int64", - "git_config_get_mapped", - "git_config_get_multivar_foreach", - "git_config_get_path", - "git_config_get_string", - "git_config_get_string_buf", - "git_config_iterator_free", - "git_config_iterator_glob_new", - "git_config_iterator_new", - "git_config_lock", - "git_config_lookup_map_value", - "git_config_multivar_iterator_new", - "git_config_new", - "git_config_next", - "git_config_open_default", - "git_config_open_global", - "git_config_open_level", - "git_config_open_ondisk", - "git_config_set_bool", - "git_config_set_int32", - "git_config_set_int64", - "git_config_set_multivar", - "git_config_set_string", - "git_config_snapshot", - "git_repository_config", - "git_repository_config_snapshot" - ] - } - } - ], - [ - "git_config_backend", - { - "decl": "git_config_backend", - "type": "struct", - "value": "git_config_backend", - "file": "git2/types.h", - "line": 160, - "lineto": 160, - "tdef": "typedef", - "description": " Interface to access a configuration file ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_backend_foreach_match" - ] - } - } - ], - [ - "git_config_entry", - { - "decl": [ - "const char * name", - "const char * value", - "unsigned int include_depth", - "git_config_level_t level", - "void (*)(struct git_config_entry *) free", - "void * payload" - ], - "type": "struct", - "value": "git_config_entry", - "file": "git2/config.h", - "line": 64, - "lineto": 71, - "block": "const char * name\nconst char * value\nunsigned int include_depth\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free\nvoid * payload", - "tdef": "typedef", - "description": " An entry in a configuration file", - "comments": "", - "fields": [ - { - "type": "const char *", - "name": "name", - "comments": " Name of the entry (normalised) " - }, - { - "type": "const char *", - "name": "value", - "comments": " String value of the entry " - }, - { - "type": "unsigned int", - "name": "include_depth", - "comments": " Depth of includes where this variable was found " - }, - { - "type": "git_config_level_t", - "name": "level", - "comments": " Which config file this was found in " - }, - { - "type": "void (*)(struct git_config_entry *)", - "name": "free", - "comments": "" - }, - { - "type": "void *", - "name": "payload", - "comments": " Opaque value for the free function. Do not read or write " - } - ], - "used": { - "returns": [], - "needs": [ - "git_config_entry_free", - "git_config_foreach_cb", - "git_config_get_entry", - "git_config_next" - ] - } - } - ], - [ - "git_config_iterator", - { - "decl": "git_config_iterator", - "type": "struct", - "value": "git_config_iterator", - "file": "git2/config.h", - "line": 92, - "lineto": 92, - "tdef": "typedef", - "description": " An opaque structure for a configuration iterator", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_iterator_free", - "git_config_iterator_glob_new", - "git_config_iterator_new", - "git_config_multivar_iterator_new", - "git_config_next" - ] - } - } - ], - [ - "git_config_level_t", - { - "decl": [ - "GIT_CONFIG_LEVEL_PROGRAMDATA", - "GIT_CONFIG_LEVEL_SYSTEM", - "GIT_CONFIG_LEVEL_XDG", - "GIT_CONFIG_LEVEL_GLOBAL", - "GIT_CONFIG_LEVEL_LOCAL", - "GIT_CONFIG_LEVEL_APP", - "GIT_CONFIG_HIGHEST_LEVEL" - ], - "type": "enum", - "file": "git2/config.h", - "line": 31, - "lineto": 59, - "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", - "tdef": "typedef", - "description": " Priority level of a config file.\n These priority levels correspond to the natural escalation logic\n (from higher to lower) when searching for config entries in git.git.", - "comments": "

git_config_open_default() and git_repository_config() honor those priority levels as well.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_PROGRAMDATA", - "comments": "

System-wide on Windows, for compatibility with portable git

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_SYSTEM", - "comments": "

System-wide configuration file; /etc/gitconfig on Linux systems

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_XDG", - "comments": "

XDG compatible configuration file; typically ~/.config/git/config

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_GLOBAL", - "comments": "

User-specific configuration file (also called Global configuration\n file); typically ~/.gitconfig

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_LOCAL", - "comments": "

Repository specific configuration file; $WORK_DIR/.git/config on\n non-bare repos

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_CONFIG_LEVEL_APP", - "comments": "

Application specific configuration file; freely defined by applications

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_CONFIG_HIGHEST_LEVEL", - "comments": "

Represents the highest level available config file (i.e. the most\n specific config file available that actually is loaded)

\n", - "value": -1 - } - ], - "used": { - "returns": [], - "needs": [ - "git_config_add_file_ondisk", - "git_config_open_level" - ] - } - } - ], - [ - "git_configmap", - { - "decl": [ - "git_configmap_t type", - "const char * str_match", - "int map_value" - ], - "type": "struct", - "value": "git_configmap", - "file": "git2/config.h", - "line": 107, - "lineto": 111, - "block": "git_configmap_t type\nconst char * str_match\nint map_value", - "tdef": "typedef", - "description": " Mapping from config variables to values.", - "comments": "", - "fields": [ - { - "type": "git_configmap_t", - "name": "type", - "comments": "" - }, - { - "type": "const char *", - "name": "str_match", - "comments": "" - }, - { - "type": "int", - "name": "map_value", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_config_get_mapped", - "git_config_lookup_map_value" - ] - } - } - ], - [ - "git_configmap_t", - { - "decl": [ - "GIT_CONFIGMAP_FALSE", - "GIT_CONFIGMAP_TRUE", - "GIT_CONFIGMAP_INT32", - "GIT_CONFIGMAP_STRING" - ], - "type": "enum", - "file": "git2/config.h", - "line": 97, - "lineto": 102, - "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", - "tdef": "typedef", - "description": " Config var type", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_CONFIGMAP_FALSE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_CONFIGMAP_TRUE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CONFIGMAP_INT32", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CONFIGMAP_STRING", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential", - { - "decl": "git_credential", - "type": "struct", - "value": "git_credential", - "file": "git2/credential.h", - "line": 84, - "lineto": 84, - "tdef": "typedef", - "description": " The base structure for all credential types", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_credential_acquire_cb", - "git_credential_default_new", - "git_credential_free", - "git_credential_get_username", - "git_credential_has_username", - "git_credential_ssh_custom_new", - "git_credential_ssh_interactive_new", - "git_credential_ssh_key_from_agent", - "git_credential_ssh_key_memory_new", - "git_credential_ssh_key_new", - "git_credential_username_new", - "git_credential_userpass", - "git_credential_userpass_plaintext_new" - ] - } - } - ], - [ - "git_credential_default", - { - "decl": "git_credential_default", - "type": "struct", - "value": "git_credential_default", - "file": "git2/credential.h", - "line": 92, - "lineto": 92, - "tdef": "typedef", - "description": " A key for NTLM/Kerberos \"default\" credentials ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_ssh_custom", - { - "decl": "git_credential_ssh_custom", - "type": "struct", - "value": "git_credential_ssh_custom", - "file": "git2/credential.h", - "line": 107, - "lineto": 107, - "tdef": "typedef", - "description": " A key with a custom signature function", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_ssh_interactive", - { - "decl": "git_credential_ssh_interactive", - "type": "struct", - "value": "git_credential_ssh_interactive", - "file": "git2/credential.h", - "line": 102, - "lineto": 102, - "tdef": "typedef", - "description": " Keyboard-interactive based ssh authentication", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_credential_ssh_interactive_new" - ] - } - } - ], - [ - "git_credential_ssh_key", - { - "decl": "git_credential_ssh_key", - "type": "struct", - "value": "git_credential_ssh_key", - "file": "git2/credential.h", - "line": 97, - "lineto": 97, - "tdef": "typedef", - "description": " A ssh key from disk", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_t", - { - "decl": [ - "GIT_CREDENTIAL_USERPASS_PLAINTEXT", - "GIT_CREDENTIAL_SSH_KEY", - "GIT_CREDENTIAL_SSH_CUSTOM", - "GIT_CREDENTIAL_DEFAULT", - "GIT_CREDENTIAL_SSH_INTERACTIVE", - "GIT_CREDENTIAL_USERNAME", - "GIT_CREDENTIAL_SSH_MEMORY" - ], - "type": "enum", - "file": "git2/credential.h", - "line": 27, - "lineto": 79, - "block": "GIT_CREDENTIAL_USERPASS_PLAINTEXT\nGIT_CREDENTIAL_SSH_KEY\nGIT_CREDENTIAL_SSH_CUSTOM\nGIT_CREDENTIAL_DEFAULT\nGIT_CREDENTIAL_SSH_INTERACTIVE\nGIT_CREDENTIAL_USERNAME\nGIT_CREDENTIAL_SSH_MEMORY", - "tdef": "typedef", - "description": " Supported credential types", - "comments": "

This represents the various types of authentication methods supported by the library.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_CREDENTIAL_USERPASS_PLAINTEXT", - "comments": "

A vanilla user/password request

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_KEY", - "comments": "

An SSH key-based authentication request

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_CUSTOM", - "comments": "

An SSH key-based authentication request, with a custom signature

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_DEFAULT", - "comments": "

An NTLM/Negotiate-based authentication request.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_INTERACTIVE", - "comments": "

An SSH interactive authentication request

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_USERNAME", - "comments": "

Username-only authentication request

\n\n

Used as a pre-authentication step if the underlying transport\n (eg. SSH, with no username in its URL) does not know which username\n to use.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_CREDENTIAL_SSH_MEMORY", - "comments": "

An SSH key-based authentication request

\n\n

Allows credentials to be read from memory instead of files.\n Note that because of differences in crypto backend support, it might\n not be functional.

\n", - "value": 64 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_username", - { - "decl": "git_credential_username", - "type": "struct", - "value": "git_credential_username", - "file": "git2/credential.h", - "line": 89, - "lineto": 89, - "tdef": "typedef", - "description": " Username-only credential information ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_credential_userpass_payload", - { - "decl": [ - "const char * username", - "const char * password" - ], - "type": "struct", - "value": "git_credential_userpass_payload", - "file": "git2/credential_helpers.h", - "line": 24, - "lineto": 27, - "block": "const char * username\nconst char * password", - "tdef": "typedef", - "description": " Payload for git_credential_userpass_plaintext.", - "comments": "", - "fields": [ - { - "type": "const char *", - "name": "username", - "comments": "" - }, - { - "type": "const char *", - "name": "password", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_delta_t", - { - "decl": [ - "GIT_DELTA_UNMODIFIED", - "GIT_DELTA_ADDED", - "GIT_DELTA_DELETED", - "GIT_DELTA_MODIFIED", - "GIT_DELTA_RENAMED", - "GIT_DELTA_COPIED", - "GIT_DELTA_IGNORED", - "GIT_DELTA_UNTRACKED", - "GIT_DELTA_TYPECHANGE", - "GIT_DELTA_UNREADABLE", - "GIT_DELTA_CONFLICTED" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 224, - "lineto": 236, - "block": "GIT_DELTA_UNMODIFIED\nGIT_DELTA_ADDED\nGIT_DELTA_DELETED\nGIT_DELTA_MODIFIED\nGIT_DELTA_RENAMED\nGIT_DELTA_COPIED\nGIT_DELTA_IGNORED\nGIT_DELTA_UNTRACKED\nGIT_DELTA_TYPECHANGE\nGIT_DELTA_UNREADABLE\nGIT_DELTA_CONFLICTED", - "tdef": "typedef", - "description": " What type of change is described by a git_diff_delta?", - "comments": "

GIT_DELTA_RENAMED and GIT_DELTA_COPIED will only show up if you run git_diff_find_similar() on the diff object.

\n\n

GIT_DELTA_TYPECHANGE only shows up given GIT_DIFF_INCLUDE_TYPECHANGE in the option flags (otherwise type changes will be split into ADDED / DELETED pairs).

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DELTA_UNMODIFIED", - "comments": "

no changes

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DELTA_ADDED", - "comments": "

entry does not exist in old version

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DELTA_DELETED", - "comments": "

entry does not exist in new version

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DELTA_MODIFIED", - "comments": "

entry content changed between old and new

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_DELTA_RENAMED", - "comments": "

entry was renamed between old and new

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DELTA_COPIED", - "comments": "

entry was copied from another old entry

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_DELTA_IGNORED", - "comments": "

entry is ignored item in workdir

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_DELTA_UNTRACKED", - "comments": "

entry is untracked item in workdir

\n", - "value": 7 - }, - { - "type": "int", - "name": "GIT_DELTA_TYPECHANGE", - "comments": "

type of entry changed between old and new

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_DELTA_UNREADABLE", - "comments": "

entry is unreadable

\n", - "value": 9 - }, - { - "type": "int", - "name": "GIT_DELTA_CONFLICTED", - "comments": "

entry in the index is conflicted

\n", - "value": 10 - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_num_deltas_of_type", - "git_diff_status_char" - ] - } - } - ], - [ - "git_describe_format_options", - { - "decl": [ - "unsigned int version", - "unsigned int abbreviated_size", - "int always_use_long_format", - "const char * dirty_suffix" - ], - "type": "struct", - "value": "git_describe_format_options", - "file": "git2/describe.h", - "line": 91, - "lineto": 111, - "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", - "tdef": "typedef", - "description": " Describe format options structure", - "comments": "

Initialize with GIT_DESCRIBE_FORMAT_OPTIONS_INIT. Alternatively, you can use git_describe_format_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "abbreviated_size", - "comments": " Size of the abbreviated commit id to use. This value is the\n lower bound for the length of the abbreviated string. The\n default is 7." - }, - { - "type": "int", - "name": "always_use_long_format", - "comments": " Set to use the long format even when a shorter name could be used." - }, - { - "type": "const char *", - "name": "dirty_suffix", - "comments": " If the workdir is dirty and this is set, this string will\n be appended to the description string." - } - ], - "used": { - "returns": [], - "needs": [ - "git_describe_format", - "git_describe_format_options_init" - ] - } - } - ], - [ - "git_describe_options", - { - "decl": [ - "unsigned int version", - "unsigned int max_candidates_tags", - "unsigned int describe_strategy", - "const char * pattern", - "int only_follow_first_parent", - "int show_commit_oid_as_fallback" - ], - "type": "struct", - "value": "git_describe_options", - "file": "git2/describe.h", - "line": 43, - "lineto": 61, - "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", - "tdef": "typedef", - "description": " Describe options structure", - "comments": "

Initialize with GIT_DESCRIBE_OPTIONS_INIT. Alternatively, you can use git_describe_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "max_candidates_tags", - "comments": " default: 10 " - }, - { - "type": "unsigned int", - "name": "describe_strategy", - "comments": " default: GIT_DESCRIBE_DEFAULT " - }, - { - "type": "const char *", - "name": "pattern", - "comments": "" - }, - { - "type": "int", - "name": "only_follow_first_parent", - "comments": " When calculating the distance from the matching tag or\n reference, only walk down the first-parent ancestry." - }, - { - "type": "int", - "name": "show_commit_oid_as_fallback", - "comments": " If no matching tag or reference is found, the describe\n operation would normally fail. If this option is set, it\n will instead fall back to showing the full id of the\n commit." - } - ], - "used": { - "returns": [], - "needs": [ - "git_describe_commit", - "git_describe_options_init", - "git_describe_workdir" - ] - } - } - ], - [ - "git_describe_result", - { - "decl": "git_describe_result", - "type": "struct", - "value": "git_describe_result", - "file": "git2/describe.h", - "line": 134, - "lineto": 134, - "tdef": "typedef", - "description": " A struct that stores the result of a describe operation.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_describe_commit", - "git_describe_format", - "git_describe_result_free", - "git_describe_workdir" - ] - } - } - ], - [ - "git_describe_strategy_t", - { - "decl": [ - "GIT_DESCRIBE_DEFAULT", - "GIT_DESCRIBE_TAGS", - "GIT_DESCRIBE_ALL" - ], - "type": "enum", - "file": "git2/describe.h", - "line": 30, - "lineto": 34, - "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", - "tdef": "typedef", - "description": " Reference lookup strategy", - "comments": "

These behave like the --tags and --all options to git-describe, namely they say to look for any reference in either refs/tags/ or refs/ respectively.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DESCRIBE_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DESCRIBE_TAGS", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DESCRIBE_ALL", - "comments": "", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff", - { - "decl": "git_diff", - "type": "struct", - "value": "git_diff", - "file": "git2/diff.h", - "line": 196, - "lineto": 196, - "tdef": "typedef", - "description": " The diff object that contains all individual file deltas.", - "comments": "

A diff represents the cumulative list of differences between two snapshots of a repository (possibly filtered by a set of file name patterns).

\n\n

Calculating diffs is generally done in two phases: building a list of diffs then traversing it. This makes is easier to share logic across the various types of diffs (tree vs tree, workdir vs index, etc.), and also allows you to insert optional diff post-processing phases, such as rename detection, in between the steps. When you are done with a diff object, it must be freed.

\n\n

This is an opaque structure which will be allocated by one of the diff generator functions below (such as git_diff_tree_to_tree). You are responsible for releasing the object memory when done, using the git_diff_free() function.

\n", - "used": { - "returns": [ - "git_diff_get_delta", - "git_patch_get_delta", - "git_pathspec_match_list_diff_entry" - ], - "needs": [ - "git_apply", - "git_apply_delta_cb", - "git_apply_hunk_cb", - "git_apply_to_tree", - "git_checkout_notify_cb", - "git_diff_binary_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_commit_as_email", - "git_diff_file_cb", - "git_diff_find_options_init", - "git_diff_find_similar", - "git_diff_foreach", - "git_diff_format_email", - "git_diff_format_email_options_init", - "git_diff_free", - "git_diff_from_buffer", - "git_diff_get_delta", - "git_diff_get_stats", - "git_diff_hunk_cb", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_is_sorted_icase", - "git_diff_line_cb", - "git_diff_merge", - "git_diff_notify_cb", - "git_diff_num_deltas", - "git_diff_num_deltas_of_type", - "git_diff_options_init", - "git_diff_patchid", - "git_diff_patchid_options_init", - "git_diff_print", - "git_diff_progress_cb", - "git_diff_stats_deletions", - "git_diff_stats_files_changed", - "git_diff_stats_free", - "git_diff_stats_insertions", - "git_diff_stats_to_buf", - "git_diff_to_buf", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers", - "git_patch_from_diff", - "git_patch_get_hunk", - "git_patch_get_line_in_hunk", - "git_patch_print", - "git_pathspec_match_diff" - ] - } - } - ], - [ - "git_diff_binary", - { - "decl": [ - "unsigned int contains_data", - "git_diff_binary_file old_file", - "git_diff_binary_file new_file" - ], - "type": "struct", - "value": "git_diff_binary", - "file": "git2/diff.h", - "line": 544, - "lineto": 556, - "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", - "tdef": "typedef", - "description": " Structure describing the binary contents of a diff.", - "comments": "

A binary file / delta is a file (or pair) for which no text diffs should be generated. A diff can contain delta entries that are binary, but no diff content will be output for those files. There is a base heuristic for binary detection and you can further tune the behavior with git attributes or diff flags and option settings.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "contains_data", - "comments": " Whether there is data in this binary structure or not.\n\n If this is `1`, then this was produced and included binary content.\n If this is `0` then this was generated knowing only that a binary\n file changed but without providing the data, probably from a patch\n that said `Binary files a/file.txt and b/file.txt differ`." - }, - { - "type": "git_diff_binary_file", - "name": "old_file", - "comments": " The contents of the old file. " - }, - { - "type": "git_diff_binary_file", - "name": "new_file", - "comments": " The contents of the new file. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_binary_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach" - ] - } - } - ], - [ - "git_diff_binary_file", - { - "decl": [ - "git_diff_binary_t type", - "const char * data", - "size_t datalen", - "size_t inflatedlen" - ], - "type": "struct", - "value": "git_diff_binary_file", - "file": "git2/diff.h", - "line": 521, - "lineto": 533, - "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", - "tdef": "typedef", - "description": " The contents of one of the files in a binary diff. ", - "comments": "", - "fields": [ - { - "type": "git_diff_binary_t", - "name": "type", - "comments": " The type of binary data for this file. " - }, - { - "type": "const char *", - "name": "data", - "comments": " The binary data, deflated. " - }, - { - "type": "size_t", - "name": "datalen", - "comments": " The length of the binary data. " - }, - { - "type": "size_t", - "name": "inflatedlen", - "comments": " The length of the binary data after inflation. " - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_binary_t", - { - "decl": [ - "GIT_DIFF_BINARY_NONE", - "GIT_DIFF_BINARY_LITERAL", - "GIT_DIFF_BINARY_DELTA" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 509, - "lineto": 518, - "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", - "tdef": "typedef", - "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_BINARY_NONE", - "comments": "

There is no binary delta.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_BINARY_LITERAL", - "comments": "

The binary data is the literal contents of the file.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_BINARY_DELTA", - "comments": "

The binary data is the delta from one side to the other.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_delta", - { - "decl": [ - "git_delta_t status", - "uint32_t flags", - "uint16_t similarity", - "uint16_t nfiles", - "git_diff_file old_file", - "git_diff_file new_file" - ], - "type": "struct", - "value": "git_diff_delta", - "file": "git2/diff.h", - "line": 324, - "lineto": 331, - "block": "git_delta_t status\nuint32_t flags\nuint16_t similarity\nuint16_t nfiles\ngit_diff_file old_file\ngit_diff_file new_file", - "tdef": "typedef", - "description": " Description of changes to one entry.", - "comments": "

A delta is a file pair with an old and new revision. The old version may be absent if the file was just created and the new version may be absent if the file was deleted. A diff is mostly just a list of deltas.

\n\n

When iterating over a diff, this will be passed to most callbacks and you can use the contents to understand exactly what has changed.

\n\n

The old_file represents the "from" side of the diff and the new_file represents to "to" side of the diff. What those means depend on the function that was used to generate the diff and will be documented below. You can also use the GIT_DIFF_REVERSE flag to flip it around.

\n\n

Although the two sides of the delta are named "old_file" and "new_file", they actually may correspond to entries that represent a file, a symbolic link, a submodule commit id, or even a tree (if you are tracking type changes or ignored/untracked directories).

\n\n

Under some circumstances, in the name of efficiency, not all fields will be filled in, but we generally try to fill in as much as possible. One example is that the "flags" field may not have either the BINARY or the NOT_BINARY flag set to avoid examining file contents if you do not pass in hunk and/or line callbacks to the diff foreach iteration function. It will just use the git attributes for those files.

\n\n

The similarity score is zero unless you call git_diff_find_similar() which does a similarity analysis of files in the diff. Use that function to do rename and copy detection, and to split heavily modified files in add/delete pairs. After that call, deltas with a status of GIT_DELTA_RENAMED or GIT_DELTA_COPIED will have a similarity score between 0 and 100 indicating how similar the old and new sides are.

\n\n

If you ask git_diff_find_similar to find heavily modified files to break, but to not actually break the records, then GIT_DELTA_MODIFIED records may have a non-zero similarity score if the self-similarity is below the split threshold. To display this value like core Git, invert the score (a la printf("M%03d", 100 - delta->similarity)).

\n", - "fields": [ - { - "type": "git_delta_t", - "name": "status", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " git_diff_flag_t values " - }, - { - "type": "uint16_t", - "name": "similarity", - "comments": " for RENAMED and COPIED, value 0-100 " - }, - { - "type": "uint16_t", - "name": "nfiles", - "comments": " number of files in this delta " - }, - { - "type": "git_diff_file", - "name": "old_file", - "comments": "" - }, - { - "type": "git_diff_file", - "name": "new_file", - "comments": "" - } - ], - "used": { - "returns": [ - "git_diff_get_delta", - "git_patch_get_delta", - "git_pathspec_match_list_diff_entry" - ], - "needs": [ - "git_apply_delta_cb", - "git_diff_binary_cb", - "git_diff_file_cb", - "git_diff_hunk_cb", - "git_diff_line_cb", - "git_diff_notify_cb" - ] - } - } - ], - [ - "git_diff_file", - { - "decl": [ - "git_oid id", - "const char * path", - "git_object_size_t size", - "uint32_t flags", - "uint16_t mode", - "uint16_t id_abbrev" - ], - "type": "struct", - "value": "git_diff_file", - "file": "git2/diff.h", - "line": 245, - "lineto": 282, - "block": "git_oid id\nconst char * path\ngit_object_size_t size\nuint32_t flags\nuint16_t mode\nuint16_t id_abbrev", - "tdef": "typedef", - "description": " Description of one side of a delta.", - "comments": "

Although this is called a "file", it could represent a file, a symbolic link, a submodule commit id, or even a tree (although that only if you are tracking type changes or ignored/untracked directories).

\n", - "fields": [ - { - "type": "git_oid", - "name": "id", - "comments": " The `git_oid` of the item. If the entry represents an\n absent side of a diff (e.g. the `old_file` of a `GIT_DELTA_ADDED` delta),\n then the oid will be zeroes." - }, - { - "type": "const char *", - "name": "path", - "comments": " The NUL-terminated path to the entry relative to the working\n directory of the repository." - }, - { - "type": "git_object_size_t", - "name": "size", - "comments": " The size of the entry in bytes." - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of the `git_diff_flag_t` types" - }, - { - "type": "uint16_t", - "name": "mode", - "comments": " Roughly, the stat() `st_mode` value for the item. This will\n be restricted to one of the `git_filemode_t` values." - }, - { - "type": "uint16_t", - "name": "id_abbrev", - "comments": " Represents the known length of the `id` field, when\n converted to a hex string. It is generally `GIT_OID_SHA1_HEXSIZE`, unless this\n delta was created from reading a patch file, in which case it may be\n abbreviated to something reasonable, like 7 characters." - } - ], - "used": { - "returns": [], - "needs": [ - "git_checkout_notify_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach" - ] - } - } - ], - [ - "git_diff_find_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "uint16_t rename_threshold", - "uint16_t rename_from_rewrite_threshold", - "uint16_t copy_threshold", - "uint16_t break_rewrite_threshold", - "size_t rename_limit", - "git_diff_similarity_metric * metric" - ], - "type": "struct", - "value": "git_diff_find_options", - "file": "git2/diff.h", - "line": 749, - "lineto": 803, - "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", - "tdef": "typedef", - "description": " Control behavior of rename and copy detection", - "comments": "

These options mostly mimic parameters that can be passed to git-diff.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " Combination of git_diff_find_t values (default GIT_DIFF_FIND_BY_CONFIG).\n NOTE: if you don't explicitly set this, `diff.renames` could be set\n to false, resulting in `git_diff_find_similar` doing nothing." - }, - { - "type": "uint16_t", - "name": "rename_threshold", - "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." - }, - { - "type": "uint16_t", - "name": "rename_from_rewrite_threshold", - "comments": " Threshold below which similar files will be eligible to be a rename source.\n This is equivalent to the first part of the -B option. Defaults to 50." - }, - { - "type": "uint16_t", - "name": "copy_threshold", - "comments": " Threshold above which similar files will be considered copies.\n This is equivalent to the -C option. Defaults to 50." - }, - { - "type": "uint16_t", - "name": "break_rewrite_threshold", - "comments": " Threshold below which similar files will be split into a delete/add pair.\n This is equivalent to the last part of the -B option. Defaults to 60." - }, - { - "type": "size_t", - "name": "rename_limit", - "comments": " Maximum number of matches to consider for a particular file.\n\n This is a little different from the `-l` option from Git because we\n will still process up to this many matches before abandoning the search.\n Defaults to 1000." - }, - { - "type": "git_diff_similarity_metric *", - "name": "metric", - "comments": " The `metric` option allows you to plug in a custom similarity metric.\n\n Set it to NULL to use the default internal metric.\n\n The default metric is based on sampling hashes of ranges of data in\n the file, which is a pretty good similarity approximation that should\n work fairly well for both text and binary data while still being\n pretty fast with a fixed memory overhead." - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_find_options_init", - "git_diff_find_similar" - ] - } - } - ], - [ - "git_diff_find_t", - { - "decl": [ - "GIT_DIFF_FIND_BY_CONFIG", - "GIT_DIFF_FIND_RENAMES", - "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", - "GIT_DIFF_FIND_COPIES", - "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", - "GIT_DIFF_FIND_REWRITES", - "GIT_DIFF_BREAK_REWRITES", - "GIT_DIFF_FIND_AND_BREAK_REWRITES", - "GIT_DIFF_FIND_FOR_UNTRACKED", - "GIT_DIFF_FIND_ALL", - "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", - "GIT_DIFF_FIND_IGNORE_WHITESPACE", - "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", - "GIT_DIFF_FIND_EXACT_MATCH_ONLY", - "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", - "GIT_DIFF_FIND_REMOVE_UNMODIFIED" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 658, - "lineto": 727, - "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", - "tdef": "typedef", - "description": " Flags to control the behavior of diff rename/copy detection.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FIND_BY_CONFIG", - "comments": "

Obey diff.renames. Overridden by any other GIT_DIFF_FIND_... flag.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_RENAMES", - "comments": "

Look for renames? (--find-renames)

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_RENAMES_FROM_REWRITES", - "comments": "

Consider old side of MODIFIED for renames? (--break-rewrites=N)

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_COPIES", - "comments": "

Look for copies? (a la --find-copies).

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED", - "comments": "

Consider UNMODIFIED as copy sources? (--find-copies-harder).

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNMODIFIED when\n the initial git_diff is being generated.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_REWRITES", - "comments": "

Mark significant rewrites for split (--break-rewrites=/M)

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_DIFF_BREAK_REWRITES", - "comments": "

Actually split large rewrites into delete/add pairs

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_AND_BREAK_REWRITES", - "comments": "

Mark rewrites for split and break into delete/add pairs

\n", - "value": 48 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_FOR_UNTRACKED", - "comments": "

Find renames/copies for UNTRACKED items in working directory.

\n\n

For this to work correctly, use GIT_DIFF_INCLUDE_UNTRACKED when the\n initial git_diff is being generated (and obviously the diff must\n be against the working directory for this to make sense).

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_ALL", - "comments": "

Turn on all finding features.

\n", - "value": 255 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE", - "comments": "

Measure similarity ignoring leading whitespace (default)

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_IGNORE_WHITESPACE", - "comments": "

Measure similarity ignoring all whitespace

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE", - "comments": "

Measure similarity including all data

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_EXACT_MATCH_ONLY", - "comments": "

Measure similarity only by comparing SHAs (fast and cheap)

\n", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY", - "comments": "

Do not break rewrites unless they contribute to a rename.

\n\n

Normally, GIT_DIFF_FIND_AND_BREAK_REWRITES will measure the self-\n similarity of modified files and split the ones that have changed a\n lot into a DELETE / ADD pair. Then the sides of that pair will be\n considered candidates for rename and copy detection.

\n\n

If you add this flag in and the split pair is not used for an\n actual rename or copy, then the modified record will be restored to\n a regular MODIFIED record instead of being split.

\n", - "value": 32768 - }, - { - "type": "int", - "name": "GIT_DIFF_FIND_REMOVE_UNMODIFIED", - "comments": "

Remove any UNMODIFIED deltas after find_similar is done.

\n\n

Using GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED to emulate the\n --find-copies-harder behavior requires building a diff with the\n GIT_DIFF_INCLUDE_UNMODIFIED flag. If you do not want UNMODIFIED\n records in the final result, pass this flag to have them removed.

\n", - "value": 65536 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_flag_t", - { - "decl": [ - "GIT_DIFF_FLAG_BINARY", - "GIT_DIFF_FLAG_NOT_BINARY", - "GIT_DIFF_FLAG_VALID_ID", - "GIT_DIFF_FLAG_EXISTS", - "GIT_DIFF_FLAG_VALID_SIZE" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 206, - "lineto": 212, - "block": "GIT_DIFF_FLAG_BINARY\nGIT_DIFF_FLAG_NOT_BINARY\nGIT_DIFF_FLAG_VALID_ID\nGIT_DIFF_FLAG_EXISTS\nGIT_DIFF_FLAG_VALID_SIZE", - "tdef": "typedef", - "description": " Flags for the delta object and the file objects on each side.", - "comments": "

These flags are used for both the flags value of the git_diff_delta and the flags for the git_diff_file objects representing the old and new sides of the delta. Values outside of this public range should be considered reserved for internal or future use.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FLAG_BINARY", - "comments": "

file(s) treated as binary data

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_FLAG_NOT_BINARY", - "comments": "

file(s) treated as text data

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_FLAG_VALID_ID", - "comments": "

id value is known correct

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_FLAG_EXISTS", - "comments": "

file exists at this side of the delta

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_DIFF_FLAG_VALID_SIZE", - "comments": "

file size value is known correct

\n", - "value": 16 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_format_email_flags_t", - { - "decl": [ - "GIT_DIFF_FORMAT_EMAIL_NONE", - "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER" - ], - "type": "enum", - "file": "git2/deprecated.h", - "line": 311, - "lineto": 318, - "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", - "tdef": "typedef", - "description": " Formatting options for diff e-mail generation", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FORMAT_EMAIL_NONE", - "comments": "

Normal patch, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", - "comments": "

Don't insert "[PATCH]" in the subject header

\n", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_format_email_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "size_t patch_no", - "size_t total_patches", - "const git_oid * id", - "const char * summary", - "const char * body", - "const git_signature * author" - ], - "type": "struct", - "value": "git_diff_format_email_options", - "file": "git2/deprecated.h", - "line": 323, - "lineto": 346, - "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", - "tdef": "typedef", - "description": " Options for controlling the formatting of the generated e-mail.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " see `git_diff_format_email_flags_t` above " - }, - { - "type": "size_t", - "name": "patch_no", - "comments": " This patch number " - }, - { - "type": "size_t", - "name": "total_patches", - "comments": " Total number of patches in this series " - }, - { - "type": "const git_oid *", - "name": "id", - "comments": " id to use for the commit " - }, - { - "type": "const char *", - "name": "summary", - "comments": " Summary of the change " - }, - { - "type": "const char *", - "name": "body", - "comments": " Commit message's body " - }, - { - "type": "const git_signature *", - "name": "author", - "comments": " Author of the change " - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_format_email", - "git_diff_format_email_options_init" - ] - } - } - ], - [ - "git_diff_format_t", - { - "decl": [ - "GIT_DIFF_FORMAT_PATCH", - "GIT_DIFF_FORMAT_PATCH_HEADER", - "GIT_DIFF_FORMAT_RAW", - "GIT_DIFF_FORMAT_NAME_ONLY", - "GIT_DIFF_FORMAT_NAME_STATUS", - "GIT_DIFF_FORMAT_PATCH_ID" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 1128, - "lineto": 1135, - "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", - "tdef": "typedef", - "description": " Possible output formats for diff data", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_FORMAT_PATCH", - "comments": "

full git diff

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_PATCH_HEADER", - "comments": "

just the file headers of patch

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_RAW", - "comments": "

like git diff --raw

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_NAME_ONLY", - "comments": "

like git diff --name-only

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_NAME_STATUS", - "comments": "

like git diff --name-status

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_DIFF_FORMAT_PATCH_ID", - "comments": "

git diff as used by git patch-id

\n", - "value": 6 - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_print", - "git_diff_to_buf" - ] - } - } - ], - [ - "git_diff_hunk", - { - "decl": [ - "int old_start", - "int old_lines", - "int new_start", - "int new_lines", - "size_t header_len", - "char [128] header" - ], - "type": "struct", - "value": "git_diff_hunk", - "file": "git2/diff.h", - "line": 576, - "lineto": 583, - "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", - "tdef": "typedef", - "description": " Structure describing a hunk of a diff.", - "comments": "

A hunk is a span of modified lines in a delta along with some stable surrounding context. You can configure the amount of context and other properties of how hunks are generated. Each hunk also comes with a header that described where it starts and ends in both the old and new versions in the delta.

\n", - "fields": [ - { - "type": "int", - "name": "old_start", - "comments": " Starting line number in old_file " - }, - { - "type": "int", - "name": "old_lines", - "comments": " Number of lines in old_file " - }, - { - "type": "int", - "name": "new_start", - "comments": " Starting line number in new_file " - }, - { - "type": "int", - "name": "new_lines", - "comments": " Number of lines in new_file " - }, - { - "type": "size_t", - "name": "header_len", - "comments": " Number of bytes in header text " - }, - { - "type": "char [128]", - "name": "header", - "comments": " Header text, NUL-byte terminated " - } - ], - "used": { - "returns": [], - "needs": [ - "git_apply_hunk_cb", - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach", - "git_diff_hunk_cb", - "git_diff_line_cb", - "git_patch_get_hunk" - ] - } - } - ], - [ - "git_diff_line", - { - "decl": [ - "char origin", - "int old_lineno", - "int new_lineno", - "int num_lines", - "size_t content_len", - "git_off_t content_offset", - "const char * content" - ], - "type": "struct", - "value": "git_diff_line", - "file": "git2/diff.h", - "line": 631, - "lineto": 639, - "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", - "tdef": "typedef", - "description": " Structure describing a line (or data span) of a diff.", - "comments": "

A line is a range of characters inside a hunk. It could be a context line (i.e. in both old and new versions), an added line (i.e. only in the new version), or a removed line (i.e. only in the old version). Unfortunately, we don't know anything about the encoding of data in the file being diffed, so we cannot tell you much about the line content. Line data will not be NUL-byte terminated, however, because it will be just a span of bytes inside the larger file.

\n", - "fields": [ - { - "type": "char", - "name": "origin", - "comments": " A git_diff_line_t value " - }, - { - "type": "int", - "name": "old_lineno", - "comments": " Line number in old file or -1 for added line " - }, - { - "type": "int", - "name": "new_lineno", - "comments": " Line number in new file or -1 for deleted line " - }, - { - "type": "int", - "name": "num_lines", - "comments": " Number of newline characters in content " - }, - { - "type": "size_t", - "name": "content_len", - "comments": " Number of bytes of data " - }, - { - "type": "git_off_t", - "name": "content_offset", - "comments": " Offset in the original file to the content " - }, - { - "type": "const char *", - "name": "content", - "comments": " Pointer to diff text, not NUL-byte terminated " - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_foreach", - "git_diff_line_cb", - "git_diff_print", - "git_patch_get_line_in_hunk", - "git_patch_print" - ] - } - } - ], - [ - "git_diff_line_t", - { - "decl": [ - "GIT_DIFF_LINE_CONTEXT", - "GIT_DIFF_LINE_ADDITION", - "GIT_DIFF_LINE_DELETION", - "GIT_DIFF_LINE_CONTEXT_EOFNL", - "GIT_DIFF_LINE_ADD_EOFNL", - "GIT_DIFF_LINE_DEL_EOFNL", - "GIT_DIFF_LINE_FILE_HDR", - "GIT_DIFF_LINE_HUNK_HDR", - "GIT_DIFF_LINE_BINARY" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 602, - "lineto": 618, - "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", - "tdef": "typedef", - "description": " Line origin constants.", - "comments": "

These values describe where a line came from and will be passed to the git_diff_line_cb when iterating over a diff. There are some special origin constants at the end that are used for the text output callbacks to demarcate lines that are actually part of the file or hunk headers.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_LINE_CONTEXT", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_ADDITION", - "comments": "", - "value": 43 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_DELETION", - "comments": "", - "value": 45 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_CONTEXT_EOFNL", - "comments": "

Both files have no LF at end

\n", - "value": 61 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_ADD_EOFNL", - "comments": "

Old has no LF at end, new does

\n", - "value": 62 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_DEL_EOFNL", - "comments": "

Old has LF at end, new does not

\n", - "value": 60 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_FILE_HDR", - "comments": "", - "value": 70 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_HUNK_HDR", - "comments": "", - "value": 72 - }, - { - "type": "int", - "name": "GIT_DIFF_LINE_BINARY", - "comments": "

For "Binary files x and y differ"

\n", - "value": 66 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_option_t", - { - "decl": [ - "GIT_DIFF_NORMAL", - "GIT_DIFF_REVERSE", - "GIT_DIFF_INCLUDE_IGNORED", - "GIT_DIFF_RECURSE_IGNORED_DIRS", - "GIT_DIFF_INCLUDE_UNTRACKED", - "GIT_DIFF_RECURSE_UNTRACKED_DIRS", - "GIT_DIFF_INCLUDE_UNMODIFIED", - "GIT_DIFF_INCLUDE_TYPECHANGE", - "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", - "GIT_DIFF_IGNORE_FILEMODE", - "GIT_DIFF_IGNORE_SUBMODULES", - "GIT_DIFF_IGNORE_CASE", - "GIT_DIFF_INCLUDE_CASECHANGE", - "GIT_DIFF_DISABLE_PATHSPEC_MATCH", - "GIT_DIFF_SKIP_BINARY_CHECK", - "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", - "GIT_DIFF_UPDATE_INDEX", - "GIT_DIFF_INCLUDE_UNREADABLE", - "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", - "GIT_DIFF_INDENT_HEURISTIC", - "GIT_DIFF_IGNORE_BLANK_LINES", - "GIT_DIFF_FORCE_TEXT", - "GIT_DIFF_FORCE_BINARY", - "GIT_DIFF_IGNORE_WHITESPACE", - "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", - "GIT_DIFF_IGNORE_WHITESPACE_EOL", - "GIT_DIFF_SHOW_UNTRACKED_CONTENT", - "GIT_DIFF_SHOW_UNMODIFIED", - "GIT_DIFF_PATIENCE", - "GIT_DIFF_MINIMAL", - "GIT_DIFF_SHOW_BINARY" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 28, - "lineto": 174, - "block": "GIT_DIFF_NORMAL\nGIT_DIFF_REVERSE\nGIT_DIFF_INCLUDE_IGNORED\nGIT_DIFF_RECURSE_IGNORED_DIRS\nGIT_DIFF_INCLUDE_UNTRACKED\nGIT_DIFF_RECURSE_UNTRACKED_DIRS\nGIT_DIFF_INCLUDE_UNMODIFIED\nGIT_DIFF_INCLUDE_TYPECHANGE\nGIT_DIFF_INCLUDE_TYPECHANGE_TREES\nGIT_DIFF_IGNORE_FILEMODE\nGIT_DIFF_IGNORE_SUBMODULES\nGIT_DIFF_IGNORE_CASE\nGIT_DIFF_INCLUDE_CASECHANGE\nGIT_DIFF_DISABLE_PATHSPEC_MATCH\nGIT_DIFF_SKIP_BINARY_CHECK\nGIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS\nGIT_DIFF_UPDATE_INDEX\nGIT_DIFF_INCLUDE_UNREADABLE\nGIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED\nGIT_DIFF_INDENT_HEURISTIC\nGIT_DIFF_IGNORE_BLANK_LINES\nGIT_DIFF_FORCE_TEXT\nGIT_DIFF_FORCE_BINARY\nGIT_DIFF_IGNORE_WHITESPACE\nGIT_DIFF_IGNORE_WHITESPACE_CHANGE\nGIT_DIFF_IGNORE_WHITESPACE_EOL\nGIT_DIFF_SHOW_UNTRACKED_CONTENT\nGIT_DIFF_SHOW_UNMODIFIED\nGIT_DIFF_PATIENCE\nGIT_DIFF_MINIMAL\nGIT_DIFF_SHOW_BINARY", - "tdef": "typedef", - "description": " Flags for diff options. A combination of these flags can be passed\n in via the `flags` value in the `git_diff_options`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_NORMAL", - "comments": "

Normal diff, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_REVERSE", - "comments": "

Reverse the sides of the diff

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_IGNORED", - "comments": "

Include ignored files in the diff

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_RECURSE_IGNORED_DIRS", - "comments": "

Even with GIT_DIFF_INCLUDE_IGNORED, an entire ignored directory\n will be marked with only a single entry in the diff; this flag\n adds all files under the directory as IGNORED entries, too.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNTRACKED", - "comments": "

Include untracked files in the diff

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_DIFF_RECURSE_UNTRACKED_DIRS", - "comments": "

Even with GIT_DIFF_INCLUDE_UNTRACKED, an entire untracked\n directory will be marked with only a single entry in the diff\n (a la what core Git does in git status); this flag adds all\n files under untracked directories as UNTRACKED entries, too.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNMODIFIED", - "comments": "

Include unmodified files in the diff

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_TYPECHANGE", - "comments": "

Normally, a type change between files will be converted into a\n DELETED record for the old and an ADDED record for the new; this\n options enabled the generation of TYPECHANGE delta records.

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_TYPECHANGE_TREES", - "comments": "

Even with GIT_DIFF_INCLUDE_TYPECHANGE, blob->tree changes still\n generally show as a DELETED blob. This flag tries to correctly\n label blob->tree transitions as TYPECHANGE records with new_file's\n mode set to tree. Note: the tree SHA will not be available.

\n", - "value": 128 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_FILEMODE", - "comments": "

Ignore file mode changes

\n", - "value": 256 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_SUBMODULES", - "comments": "

Treat all submodules as unmodified

\n", - "value": 512 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_CASE", - "comments": "

Use case insensitive filename comparisons

\n", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_CASECHANGE", - "comments": "

May be combined with GIT_DIFF_IGNORE_CASE to specify that a file\n that has changed case will be returned as an add/delete pair.

\n", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_DIFF_DISABLE_PATHSPEC_MATCH", - "comments": "

If the pathspec is set in the diff options, this flags indicates\n that the paths will be treated as literal paths instead of\n fnmatch patterns. Each path in the list must either be a full\n path to a file or a directory. (A trailing slash indicates that\n the path will only match a directory). If a directory is\n specified, all children will be included.

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_DIFF_SKIP_BINARY_CHECK", - "comments": "

Disable updating of the binary flag in delta records. This is\n useful when iterating over a diff if you don't need hunk and data\n callbacks and want to avoid having to load file completely.

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS", - "comments": "

When diff finds an untracked directory, to match the behavior of\n core Git, it scans the contents for IGNORED and UNTRACKED files.\n If all contents are IGNORED, then the directory is IGNORED; if\n any contents are not IGNORED, then the directory is UNTRACKED.\n This is extra work that may not matter in many cases. This flag\n turns off that scan and immediately labels an untracked directory\n as UNTRACKED (changing the behavior to not match core Git).

\n", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_DIFF_UPDATE_INDEX", - "comments": "

When diff finds a file in the working directory with stat\n information different from the index, but the OID ends up being the\n same, write the correct stat information into the index. Note:\n without this flag, diff will always leave the index untouched.

\n", - "value": 32768 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNREADABLE", - "comments": "

Include unreadable files in the diff

\n", - "value": 65536 - }, - { - "type": "int", - "name": "GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED", - "comments": "

Include unreadable files in the diff

\n", - "value": 131072 - }, - { - "type": "int", - "name": "GIT_DIFF_INDENT_HEURISTIC", - "comments": "

Use a heuristic that takes indentation and whitespace into account\n which generally can produce better diffs when dealing with ambiguous\n diff hunks.

\n", - "value": 262144 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_BLANK_LINES", - "comments": "

Ignore blank lines

\n", - "value": 524288 - }, - { - "type": "int", - "name": "GIT_DIFF_FORCE_TEXT", - "comments": "

Treat all files as text, disabling binary attributes \n&\n detection

\n", - "value": 1048576 - }, - { - "type": "int", - "name": "GIT_DIFF_FORCE_BINARY", - "comments": "

Treat all files as binary, disabling text diffs

\n", - "value": 2097152 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_WHITESPACE", - "comments": "

Ignore all whitespace

\n", - "value": 4194304 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_WHITESPACE_CHANGE", - "comments": "

Ignore changes in amount of whitespace

\n", - "value": 8388608 - }, - { - "type": "int", - "name": "GIT_DIFF_IGNORE_WHITESPACE_EOL", - "comments": "

Ignore whitespace at end of line

\n", - "value": 16777216 - }, - { - "type": "int", - "name": "GIT_DIFF_SHOW_UNTRACKED_CONTENT", - "comments": "

When generating patch text, include the content of untracked\n files. This automatically turns on GIT_DIFF_INCLUDE_UNTRACKED but\n it does not turn on GIT_DIFF_RECURSE_UNTRACKED_DIRS. Add that\n flag if you want the content of every single UNTRACKED file.

\n", - "value": 33554432 - }, - { - "type": "int", - "name": "GIT_DIFF_SHOW_UNMODIFIED", - "comments": "

When generating output, include the names of unmodified files if\n they are included in the git_diff. Normally these are skipped in\n the formats that list files (e.g. name-only, name-status, raw).\n Even with this, these will not be included in patch format.

\n", - "value": 67108864 - }, - { - "type": "int", - "name": "GIT_DIFF_PATIENCE", - "comments": "

Use the "patience diff" algorithm

\n", - "value": 268435456 - }, - { - "type": "int", - "name": "GIT_DIFF_MINIMAL", - "comments": "

Take extra time to find minimal diff

\n", - "value": 536870912 - }, - { - "type": "int", - "name": "GIT_DIFF_SHOW_BINARY", - "comments": "

Include the necessary deflate / delta information so that git-apply\n can apply given diff information to binary files.

\n", - "value": 1073741824 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "git_submodule_ignore_t ignore_submodules", - "git_strarray pathspec", - "git_diff_notify_cb notify_cb", - "git_diff_progress_cb progress_cb", - "void * payload", - "uint32_t context_lines", - "uint32_t interhunk_lines", - "git_oid_t oid_type", - "uint16_t id_abbrev", - "git_off_t max_size", - "const char * old_prefix", - "const char * new_prefix" - ], - "type": "struct", - "value": "git_diff_options", - "file": "git2/diff.h", - "line": 376, - "lineto": 464, - "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\ngit_oid_t oid_type\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", - "tdef": "typedef", - "description": " Structure describing options about how the diff should be executed.", - "comments": "

Setting all values of the structure to zero will yield the default values. Similarly, passing NULL for the options structure will give the defaults. The default values are marked below.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " version for the struct " - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of `git_diff_option_t` values above.\n Defaults to GIT_DIFF_NORMAL" - }, - { - "type": "git_submodule_ignore_t", - "name": "ignore_submodules", - "comments": " Overrides the submodule ignore setting for all submodules in the diff. " - }, - { - "type": "git_strarray", - "name": "pathspec", - "comments": " An array of paths / fnmatch patterns to constrain diff.\n All paths are included by default." - }, - { - "type": "git_diff_notify_cb", - "name": "notify_cb", - "comments": " An optional callback function, notifying the consumer of changes to\n the diff as new deltas are added." - }, - { - "type": "git_diff_progress_cb", - "name": "progress_cb", - "comments": " An optional callback function, notifying the consumer of which files\n are being examined as the diff is generated." - }, - { - "type": "void *", - "name": "payload", - "comments": " The payload to pass to the callback functions. " - }, - { - "type": "uint32_t", - "name": "context_lines", - "comments": " The number of unchanged lines that define the boundary of a hunk\n (and to display before and after). Defaults to 3." - }, - { - "type": "uint32_t", - "name": "interhunk_lines", - "comments": " The maximum number of unchanged lines between hunk boundaries before\n the hunks will be merged into one. Defaults to 0." - }, - { - "type": "git_oid_t", - "name": "oid_type", - "comments": " The object ID type to emit in diffs; this is used by functions\n that operate without a repository - namely `git_diff_buffers`,\n or `git_diff_blobs` and `git_diff_blob_to_buffer` when one blob\n is `NULL`.\n\n This may be omitted (set to `0`). If a repository is available,\n the object ID format of the repository will be used. If no\n repository is available then the default is `GIT_OID_SHA`.\n\n If this is specified and a repository is available, then the\n specified `oid_type` must match the repository's object ID\n format." - }, - { - "type": "uint16_t", - "name": "id_abbrev", - "comments": " The abbreviation length to use when formatting object ids.\n Defaults to the value of 'core.abbrev' from the config, or 7 if unset." - }, - { - "type": "git_off_t", - "name": "max_size", - "comments": " A size (in bytes) above which a blob will be marked as binary\n automatically; pass a negative value to disable.\n Defaults to 512MB." - }, - { - "type": "const char *", - "name": "old_prefix", - "comments": " The virtual \"directory\" prefix for old file names in hunk headers.\n Default is \"a\"." - }, - { - "type": "const char *", - "name": "new_prefix", - "comments": " The virtual \"directory\" prefix for new file names in hunk headers.\n Defaults to \"b\"." - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_commit_as_email", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_options_init", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers" - ] - } - } - ], - [ - "git_diff_parse_options", - { - "decl": [ - "unsigned int version", - "git_oid_t oid_type" - ], - "type": "struct", - "value": "git_diff_parse_options", - "file": "git2/diff.h", - "line": 1294, - "lineto": 1297, - "block": "unsigned int version\ngit_oid_t oid_type", - "tdef": "typedef", - "description": " Options for parsing a diff / patch file.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_oid_t", - "name": "oid_type", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_patchid_options", - { - "decl": [ - "unsigned int version" - ], - "type": "struct", - "value": "git_diff_patchid_options", - "file": "git2/diff.h", - "line": 1431, - "lineto": 1433, - "block": "unsigned int version", - "tdef": "typedef", - "description": " Patch ID options structure", - "comments": "

Initialize with GIT_PATCHID_OPTIONS_INIT. Alternatively, you can use git_diff_patchid_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_patchid", - "git_diff_patchid_options_init" - ] - } - } - ], - [ - "git_diff_similarity_metric", - { - "decl": [ - "int (*)(void **, const git_diff_file *, const char *, void *) file_signature", - "int (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature", - "void (*)(void *, void *) free_signature", - "int (*)(int *, void *, void *, void *) similarity", - "void * payload" - ], - "type": "struct", - "value": "git_diff_similarity_metric", - "file": "git2/diff.h", - "line": 732, - "lineto": 742, - "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", - "tdef": "typedef", - "description": " Pluggable similarity metric", - "comments": "", - "fields": [ - { - "type": "int (*)(void **, const git_diff_file *, const char *, void *)", - "name": "file_signature", - "comments": "" - }, - { - "type": "int (*)(void **, const git_diff_file *, const char *, size_t, void *)", - "name": "buffer_signature", - "comments": "" - }, - { - "type": "void (*)(void *, void *)", - "name": "free_signature", - "comments": "" - }, - { - "type": "int (*)(int *, void *, void *, void *)", - "name": "similarity", - "comments": "" - }, - { - "type": "void *", - "name": "payload", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_diff_stats", - { - "decl": "git_diff_stats", - "type": "struct", - "value": "git_diff_stats", - "file": "git2/diff.h", - "line": 1341, - "lineto": 1341, - "tdef": "typedef", - "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_diff_get_stats", - "git_diff_stats_deletions", - "git_diff_stats_files_changed", - "git_diff_stats_free", - "git_diff_stats_insertions", - "git_diff_stats_to_buf" - ] - } - } - ], - [ - "git_diff_stats_format_t", - { - "decl": [ - "GIT_DIFF_STATS_NONE", - "GIT_DIFF_STATS_FULL", - "GIT_DIFF_STATS_SHORT", - "GIT_DIFF_STATS_NUMBER", - "GIT_DIFF_STATS_INCLUDE_SUMMARY" - ], - "type": "enum", - "file": "git2/diff.h", - "line": 1346, - "lineto": 1361, - "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", - "tdef": "typedef", - "description": " Formatting options for diff stats", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_DIFF_STATS_NONE", - "comments": "

No stats

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_FULL", - "comments": "

Full statistics, equivalent of --stat

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_SHORT", - "comments": "

Short statistics, equivalent of --shortstat

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_NUMBER", - "comments": "

Number statistics, equivalent of --numstat

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_DIFF_STATS_INCLUDE_SUMMARY", - "comments": "

Extended header information such as creations, renames and mode changes, equivalent of --summary

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [ - "git_diff_stats_to_buf" - ] - } - } - ], - [ - "git_direction", - { - "decl": [ - "GIT_DIRECTION_FETCH", - "GIT_DIRECTION_PUSH" - ], - "type": "enum", - "file": "git2/net.h", - "line": 31, - "lineto": 34, - "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", - "tdef": "typedef", - "description": " Direction of the connection.", - "comments": "

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.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_DIRECTION_FETCH", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_DIRECTION_PUSH", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [ - "git_refspec_direction" - ], - "needs": [ - "git_remote_connect", - "git_remote_connect_ext" - ] - } - } - ], - [ - "git_email_create_flags_t", - { - "decl": [ - "GIT_EMAIL_CREATE_DEFAULT", - "GIT_EMAIL_CREATE_OMIT_NUMBERS", - "GIT_EMAIL_CREATE_ALWAYS_NUMBER", - "GIT_EMAIL_CREATE_NO_RENAMES" - ], - "type": "enum", - "file": "git2/email.h", - "line": 23, - "lineto": 38, - "block": "GIT_EMAIL_CREATE_DEFAULT\nGIT_EMAIL_CREATE_OMIT_NUMBERS\nGIT_EMAIL_CREATE_ALWAYS_NUMBER\nGIT_EMAIL_CREATE_NO_RENAMES", - "tdef": "typedef", - "description": " Formatting options for diff e-mail generation", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_EMAIL_CREATE_DEFAULT", - "comments": "

Normal patch, the default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_EMAIL_CREATE_OMIT_NUMBERS", - "comments": "

Do not include patch numbers in the subject prefix.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_EMAIL_CREATE_ALWAYS_NUMBER", - "comments": "

Include numbers in the subject prefix even when the\n patch is for a single commit (1/1).

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_EMAIL_CREATE_NO_RENAMES", - "comments": "

Do not perform rename or similarity detection.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_error", - { - "decl": [ - "char * message", - "int klass" - ], - "type": "struct", - "value": "git_error", - "file": "git2/errors.h", - "line": 71, - "lineto": 74, - "block": "char * message\nint klass", - "tdef": "typedef", - "description": " Structure to store extra details of the last error that occurred.", - "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", - "fields": [ - { - "type": "char *", - "name": "message", - "comments": "" - }, - { - "type": "int", - "name": "klass", - "comments": "" - } - ], - "used": { - "returns": [ - "git_error_last", - "giterr_last" - ], - "needs": [] - } - } - ], - [ - "git_error_code", - { - "decl": [ - "GIT_OK", - "GIT_ERROR", - "GIT_ENOTFOUND", - "GIT_EEXISTS", - "GIT_EAMBIGUOUS", - "GIT_EBUFS", - "GIT_EUSER", - "GIT_EBAREREPO", - "GIT_EUNBORNBRANCH", - "GIT_EUNMERGED", - "GIT_ENONFASTFORWARD", - "GIT_EINVALIDSPEC", - "GIT_ECONFLICT", - "GIT_ELOCKED", - "GIT_EMODIFIED", - "GIT_EAUTH", - "GIT_ECERTIFICATE", - "GIT_EAPPLIED", - "GIT_EPEEL", - "GIT_EEOF", - "GIT_EINVALID", - "GIT_EUNCOMMITTED", - "GIT_EDIRECTORY", - "GIT_EMERGECONFLICT", - "GIT_PASSTHROUGH", - "GIT_ITEROVER", - "GIT_RETRY", - "GIT_EMISMATCH", - "GIT_EINDEXDIRTY", - "GIT_EAPPLYFAIL", - "GIT_EOWNER", - "GIT_TIMEOUT" - ], - "type": "enum", - "file": "git2/errors.h", - "line": 21, - "lineto": 63, - "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL\nGIT_EOWNER\nGIT_TIMEOUT", - "tdef": "typedef", - "description": " Generic return codes ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_OK", - "comments": "

No error

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_ERROR", - "comments": "

Generic error

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_ENOTFOUND", - "comments": "

Requested object could not be found

\n", - "value": -3 - }, - { - "type": "int", - "name": "GIT_EEXISTS", - "comments": "

Object exists preventing operation

\n", - "value": -4 - }, - { - "type": "int", - "name": "GIT_EAMBIGUOUS", - "comments": "

More than one object matches

\n", - "value": -5 - }, - { - "type": "int", - "name": "GIT_EBUFS", - "comments": "

Output buffer too short to hold data

\n", - "value": -6 - }, - { - "type": "int", - "name": "GIT_EUSER", - "comments": "

GIT_EUSER is a special error that is never generated by libgit2\n code. You can return it from a callback (e.g to stop an iteration)\n to know that it was generated by the callback and not by libgit2.

\n", - "value": -7 - }, - { - "type": "int", - "name": "GIT_EBAREREPO", - "comments": "

Operation not allowed on bare repository

\n", - "value": -8 - }, - { - "type": "int", - "name": "GIT_EUNBORNBRANCH", - "comments": "

HEAD refers to branch with no commits

\n", - "value": -9 - }, - { - "type": "int", - "name": "GIT_EUNMERGED", - "comments": "

Merge in progress prevented operation

\n", - "value": -10 - }, - { - "type": "int", - "name": "GIT_ENONFASTFORWARD", - "comments": "

Reference was not fast-forwardable

\n", - "value": -11 - }, - { - "type": "int", - "name": "GIT_EINVALIDSPEC", - "comments": "

Name/ref spec was not in a valid format

\n", - "value": -12 - }, - { - "type": "int", - "name": "GIT_ECONFLICT", - "comments": "

Checkout conflicts prevented operation

\n", - "value": -13 - }, - { - "type": "int", - "name": "GIT_ELOCKED", - "comments": "

Lock file prevented operation

\n", - "value": -14 - }, - { - "type": "int", - "name": "GIT_EMODIFIED", - "comments": "

Reference value does not match expected

\n", - "value": -15 - }, - { - "type": "int", - "name": "GIT_EAUTH", - "comments": "

Authentication error

\n", - "value": -16 - }, - { - "type": "int", - "name": "GIT_ECERTIFICATE", - "comments": "

Server certificate is invalid

\n", - "value": -17 - }, - { - "type": "int", - "name": "GIT_EAPPLIED", - "comments": "

Patch/merge has already been applied

\n", - "value": -18 - }, - { - "type": "int", - "name": "GIT_EPEEL", - "comments": "

The requested peel operation is not possible

\n", - "value": -19 - }, - { - "type": "int", - "name": "GIT_EEOF", - "comments": "

Unexpected EOF

\n", - "value": -20 - }, - { - "type": "int", - "name": "GIT_EINVALID", - "comments": "

Invalid operation or input

\n", - "value": -21 - }, - { - "type": "int", - "name": "GIT_EUNCOMMITTED", - "comments": "

Uncommitted changes in index prevented operation

\n", - "value": -22 - }, - { - "type": "int", - "name": "GIT_EDIRECTORY", - "comments": "

The operation is not valid for a directory

\n", - "value": -23 - }, - { - "type": "int", - "name": "GIT_EMERGECONFLICT", - "comments": "

A merge conflict exists and cannot continue

\n", - "value": -24 - }, - { - "type": "int", - "name": "GIT_PASSTHROUGH", - "comments": "

A user-configured callback refused to act

\n", - "value": -30 - }, - { - "type": "int", - "name": "GIT_ITEROVER", - "comments": "

Signals end of iteration with iterator

\n", - "value": -31 - }, - { - "type": "int", - "name": "GIT_RETRY", - "comments": "

Internal only

\n", - "value": -32 - }, - { - "type": "int", - "name": "GIT_EMISMATCH", - "comments": "

Hashsum mismatch in object

\n", - "value": -33 - }, - { - "type": "int", - "name": "GIT_EINDEXDIRTY", - "comments": "

Unsaved changes in the index would be overwritten

\n", - "value": -34 - }, - { - "type": "int", - "name": "GIT_EAPPLYFAIL", - "comments": "

Patch application failed

\n", - "value": -35 - }, - { - "type": "int", - "name": "GIT_EOWNER", - "comments": "

The object is not owned by the current user

\n", - "value": -36 - }, - { - "type": "int", - "name": "GIT_TIMEOUT", - "comments": "

The operation timed out

\n", - "value": -37 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_error_t", - { - "decl": [ - "GIT_ERROR_NONE", - "GIT_ERROR_NOMEMORY", - "GIT_ERROR_OS", - "GIT_ERROR_INVALID", - "GIT_ERROR_REFERENCE", - "GIT_ERROR_ZLIB", - "GIT_ERROR_REPOSITORY", - "GIT_ERROR_CONFIG", - "GIT_ERROR_REGEX", - "GIT_ERROR_ODB", - "GIT_ERROR_INDEX", - "GIT_ERROR_OBJECT", - "GIT_ERROR_NET", - "GIT_ERROR_TAG", - "GIT_ERROR_TREE", - "GIT_ERROR_INDEXER", - "GIT_ERROR_SSL", - "GIT_ERROR_SUBMODULE", - "GIT_ERROR_THREAD", - "GIT_ERROR_STASH", - "GIT_ERROR_CHECKOUT", - "GIT_ERROR_FETCHHEAD", - "GIT_ERROR_MERGE", - "GIT_ERROR_SSH", - "GIT_ERROR_FILTER", - "GIT_ERROR_REVERT", - "GIT_ERROR_CALLBACK", - "GIT_ERROR_CHERRYPICK", - "GIT_ERROR_DESCRIBE", - "GIT_ERROR_REBASE", - "GIT_ERROR_FILESYSTEM", - "GIT_ERROR_PATCH", - "GIT_ERROR_WORKTREE", - "GIT_ERROR_SHA", - "GIT_ERROR_HTTP", - "GIT_ERROR_INTERNAL", - "GIT_ERROR_GRAFTS" - ], - "type": "enum", - "file": "git2/errors.h", - "line": 77, - "lineto": 115, - "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL\nGIT_ERROR_GRAFTS", - "tdef": "typedef", - "description": " Error classes ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_ERROR_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_ERROR_NOMEMORY", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_ERROR_OS", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_ERROR_INVALID", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_ERROR_REFERENCE", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_ERROR_ZLIB", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_ERROR_REPOSITORY", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_ERROR_CONFIG", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_ERROR_REGEX", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_ERROR_ODB", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_ERROR_INDEX", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_ERROR_OBJECT", - "comments": "", - "value": 11 - }, - { - "type": "int", - "name": "GIT_ERROR_NET", - "comments": "", - "value": 12 - }, - { - "type": "int", - "name": "GIT_ERROR_TAG", - "comments": "", - "value": 13 - }, - { - "type": "int", - "name": "GIT_ERROR_TREE", - "comments": "", - "value": 14 - }, - { - "type": "int", - "name": "GIT_ERROR_INDEXER", - "comments": "", - "value": 15 - }, - { - "type": "int", - "name": "GIT_ERROR_SSL", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_ERROR_SUBMODULE", - "comments": "", - "value": 17 - }, - { - "type": "int", - "name": "GIT_ERROR_THREAD", - "comments": "", - "value": 18 - }, - { - "type": "int", - "name": "GIT_ERROR_STASH", - "comments": "", - "value": 19 - }, - { - "type": "int", - "name": "GIT_ERROR_CHECKOUT", - "comments": "", - "value": 20 - }, - { - "type": "int", - "name": "GIT_ERROR_FETCHHEAD", - "comments": "", - "value": 21 - }, - { - "type": "int", - "name": "GIT_ERROR_MERGE", - "comments": "", - "value": 22 - }, - { - "type": "int", - "name": "GIT_ERROR_SSH", - "comments": "", - "value": 23 - }, - { - "type": "int", - "name": "GIT_ERROR_FILTER", - "comments": "", - "value": 24 - }, - { - "type": "int", - "name": "GIT_ERROR_REVERT", - "comments": "", - "value": 25 - }, - { - "type": "int", - "name": "GIT_ERROR_CALLBACK", - "comments": "", - "value": 26 - }, - { - "type": "int", - "name": "GIT_ERROR_CHERRYPICK", - "comments": "", - "value": 27 - }, - { - "type": "int", - "name": "GIT_ERROR_DESCRIBE", - "comments": "", - "value": 28 - }, - { - "type": "int", - "name": "GIT_ERROR_REBASE", - "comments": "", - "value": 29 - }, - { - "type": "int", - "name": "GIT_ERROR_FILESYSTEM", - "comments": "", - "value": 30 - }, - { - "type": "int", - "name": "GIT_ERROR_PATCH", - "comments": "", - "value": 31 - }, - { - "type": "int", - "name": "GIT_ERROR_WORKTREE", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_ERROR_SHA", - "comments": "", - "value": 33 - }, - { - "type": "int", - "name": "GIT_ERROR_HTTP", - "comments": "", - "value": 34 - }, - { - "type": "int", - "name": "GIT_ERROR_INTERNAL", - "comments": "", - "value": 35 - }, - { - "type": "int", - "name": "GIT_ERROR_GRAFTS", - "comments": "", - "value": 36 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_feature_t", - { - "decl": [ - "GIT_FEATURE_THREADS", - "GIT_FEATURE_HTTPS", - "GIT_FEATURE_SSH", - "GIT_FEATURE_NSEC" - ], - "type": "enum", - "file": "git2/common.h", - "line": 134, - "lineto": 157, - "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", - "tdef": "typedef", - "description": " Combinations of these values describe the features with which libgit2\n was compiled", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FEATURE_THREADS", - "comments": "

If set, libgit2 was built thread-aware and can be safely used from multiple\n threads.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FEATURE_HTTPS", - "comments": "

If set, libgit2 was built with and linked against a TLS implementation.\n Custom TLS streams may still be added by the user to support HTTPS\n regardless of this.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_FEATURE_SSH", - "comments": "

If set, libgit2 was built with and linked against libssh2. A custom\n transport may still be added by the user to support libssh2 regardless of\n this.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_FEATURE_NSEC", - "comments": "

If set, libgit2 was built with support for sub-second resolution in file\n modification times.

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_fetch_depth_t", - { - "decl": [ - "GIT_FETCH_DEPTH_FULL", - "GIT_FETCH_DEPTH_UNSHALLOW" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 706, - "lineto": 712, - "block": "GIT_FETCH_DEPTH_FULL\nGIT_FETCH_DEPTH_UNSHALLOW", - "tdef": "typedef", - "description": " Constants for fetch depth (shallowness of fetch). ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FETCH_DEPTH_FULL", - "comments": "

The fetch is "full" (not shallow). This is the default.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FETCH_DEPTH_UNSHALLOW", - "comments": "

The fetch should "unshallow" and fetch missing data.

\n", - "value": 2147483647 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_fetch_options", - { - "decl": [ - "int version", - "git_remote_callbacks callbacks", - "git_fetch_prune_t prune", - "int update_fetchhead", - "git_remote_autotag_option_t download_tags", - "git_proxy_options proxy_opts", - "int depth", - "git_remote_redirect_t follow_redirects", - "git_strarray custom_headers" - ], - "type": "struct", - "value": "git_fetch_options", - "file": "git2/remote.h", - "line": 722, - "lineto": 775, - "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nint update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\nint depth\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", - "tdef": "typedef", - "description": " Fetch options structure.", - "comments": "

Zero out for defaults. Initialize with GIT_FETCH_OPTIONS_INIT macro to correctly set the version field. E.g.

\n\n
    git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;\n
\n", - "fields": [ - { - "type": "int", - "name": "version", - "comments": "" - }, - { - "type": "git_remote_callbacks", - "name": "callbacks", - "comments": " Callbacks to use for this fetch operation" - }, - { - "type": "git_fetch_prune_t", - "name": "prune", - "comments": " Whether to perform a prune after the fetch" - }, - { - "type": "int", - "name": "update_fetchhead", - "comments": " Whether to write the results to FETCH_HEAD. Defaults to\n on. Leave this default in order to behave like git." - }, - { - "type": "git_remote_autotag_option_t", - "name": "download_tags", - "comments": " Determines how to behave regarding tags on the remote, such\n as auto-downloading tags for objects we're downloading or\n downloading all of them.\n\n The default is to auto-follow tags." - }, - { - "type": "git_proxy_options", - "name": "proxy_opts", - "comments": " Proxy options to use, by default no proxy is used." - }, - { - "type": "int", - "name": "depth", - "comments": " Depth of the fetch to perform, or `GIT_FETCH_DEPTH_FULL`\n (or `0`) for full history, or `GIT_FETCH_DEPTH_UNSHALLOW`\n to \"unshallow\" a shallow repository.\n\n The default is full (`GIT_FETCH_DEPTH_FULL` or `0`)." - }, - { - "type": "git_remote_redirect_t", - "name": "follow_redirects", - "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." - }, - { - "type": "git_strarray", - "name": "custom_headers", - "comments": " Extra headers for this fetch operation" - } - ], - "used": { - "returns": [], - "needs": [ - "git_fetch_options_init", - "git_remote_download", - "git_remote_fetch" - ] - } - } - ], - [ - "git_fetch_prune_t", - { - "decl": [ - "GIT_FETCH_PRUNE_UNSPECIFIED", - "GIT_FETCH_PRUNE", - "GIT_FETCH_NO_PRUNE" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 665, - "lineto": 678, - "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", - "tdef": "typedef", - "description": " Acceptable prune settings when fetching ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FETCH_PRUNE_UNSPECIFIED", - "comments": "

Use the setting from the configuration

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FETCH_PRUNE", - "comments": "

Force pruning on

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FETCH_NO_PRUNE", - "comments": "

Force pruning off

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_filemode_t", - { - "decl": [ - "GIT_FILEMODE_UNREADABLE", - "GIT_FILEMODE_TREE", - "GIT_FILEMODE_BLOB", - "GIT_FILEMODE_BLOB_EXECUTABLE", - "GIT_FILEMODE_LINK", - "GIT_FILEMODE_COMMIT" - ], - "type": "enum", - "file": "git2/types.h", - "line": 222, - "lineto": 229, - "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", - "tdef": "typedef", - "description": " Valid modes for index and tree entries. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FILEMODE_UNREADABLE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILEMODE_TREE", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_FILEMODE_BLOB", - "comments": "", - "value": 33188 - }, - { - "type": "int", - "name": "GIT_FILEMODE_BLOB_EXECUTABLE", - "comments": "", - "value": 33261 - }, - { - "type": "int", - "name": "GIT_FILEMODE_LINK", - "comments": "", - "value": 40960 - }, - { - "type": "int", - "name": "GIT_FILEMODE_COMMIT", - "comments": "", - "value": 57344 - } - ], - "used": { - "returns": [ - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw" - ], - "needs": [ - "git_treebuilder_insert" - ] - } - } - ], - [ - "git_filter", - { - "decl": "git_filter", - "type": "struct", - "value": "git_filter", - "file": "git2/filter.h", - "line": 100, - "lineto": 100, - "tdef": "typedef", - "description": " A filter that can transform file data", - "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", - "used": { - "returns": [], - "needs": [ - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_contains", - "git_filter_list_free", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] - } - } - ], - [ - "git_filter_flag_t", - { - "decl": [ - "GIT_FILTER_DEFAULT", - "GIT_FILTER_ALLOW_UNSAFE", - "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", - "GIT_FILTER_ATTRIBUTES_FROM_HEAD", - "GIT_FILTER_ATTRIBUTES_FROM_COMMIT" - ], - "type": "enum", - "file": "git2/filter.h", - "line": 41, - "lineto": 58, - "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_FILTER_ATTRIBUTES_FROM_COMMIT", - "tdef": "typedef", - "description": " Filter option flags.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FILTER_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILTER_ALLOW_UNSAFE", - "comments": "

Don't error for safecrlf violations, allow them to continue.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FILTER_NO_SYSTEM_ATTRIBUTES", - "comments": "

Don't load /etc/gitattributes (or the system equivalent)

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_FILTER_ATTRIBUTES_FROM_HEAD", - "comments": "

Load attributes from .gitattributes in the root of HEAD

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_FILTER_ATTRIBUTES_FROM_COMMIT", - "comments": "

Load attributes from .gitattributes in a given commit.\n This can only be specified in a git_filter_options.

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_filter_list", - { - "decl": "git_filter_list", - "type": "struct", - "value": "git_filter_list", - "file": "git2/filter.h", - "line": 112, - "lineto": 112, - "tdef": "typedef", - "description": " List of filters to be applied", - "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", - "used": { - "returns": [], - "needs": [ - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_contains", - "git_filter_list_free", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] - } - } - ], - [ - "git_filter_mode_t", - { - "decl": [ - "GIT_FILTER_TO_WORKTREE", - "GIT_FILTER_SMUDGE", - "GIT_FILTER_TO_ODB", - "GIT_FILTER_CLEAN" - ], - "type": "enum", - "file": "git2/filter.h", - "line": 31, - "lineto": 36, - "block": "GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN", - "tdef": "typedef", - "description": " Filters are applied in one of two directions: smudging - which is\n exporting a file from the Git object database to the working directory,\n and cleaning - which is importing a file from the working directory to\n the Git object database. These values control which direction of\n change is being applied.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_FILTER_TO_WORKTREE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILTER_SMUDGE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_FILTER_TO_ODB", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_FILTER_CLEAN", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [ - "git_filter_list_load", - "git_filter_list_load_ext" - ] - } - } - ], - [ - "git_filter_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "git_oid * commit_id", - "git_oid attr_commit_id" - ], - "type": "struct", - "value": "git_filter_options", - "file": "git2/filter.h", - "line": 63, - "lineto": 80, - "block": "unsigned int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", - "tdef": "typedef", - "description": " Filtering options", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " See `git_filter_flag_t` above " - }, - { - "type": "git_oid *", - "name": "commit_id", - "comments": "" - }, - { - "type": "git_oid", - "name": "attr_commit_id", - "comments": " The commit to load attributes from, when\n `GIT_FILTER_ATTRIBUTES_FROM_COMMIT` is specified." - } - ], - "used": { - "returns": [], - "needs": [ - "git_filter_list_load_ext" - ] - } - } - ], - [ - "git_filter_source", - { - "decl": "git_filter_source", - "type": "struct", - "value": "git_filter_source", - "file": "git2/sys/filter.h", - "line": 95, - "lineto": 95, - "tdef": "typedef", - "description": " A filter source represents a file/blob to be processed", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_hashsig_option_t", - { - "decl": [ - "GIT_HASHSIG_NORMAL", - "GIT_HASHSIG_IGNORE_WHITESPACE", - "GIT_HASHSIG_SMART_WHITESPACE", - "GIT_HASHSIG_ALLOW_SMALL_FILES" - ], - "type": "enum", - "file": "git2/sys/hashsig.h", - "line": 25, - "lineto": 45, - "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", - "tdef": "typedef", - "description": " Options for hashsig computation", - "comments": "

The options GIT_HASHSIG_NORMAL, GIT_HASHSIG_IGNORE_WHITESPACE, GIT_HASHSIG_SMART_WHITESPACE are exclusive and should not be combined.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_HASHSIG_NORMAL", - "comments": "

Use all data

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_HASHSIG_IGNORE_WHITESPACE", - "comments": "

Ignore whitespace

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_HASHSIG_SMART_WHITESPACE", - "comments": "

Ignore

\n\n

and all space after

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_HASHSIG_ALLOW_SMALL_FILES", - "comments": "

Allow hashing of small files

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index", - { - "decl": "git_index", - "type": "struct", - "value": "git_index", - "file": "git2/types.h", - "line": 148, - "lineto": 148, - "tdef": "typedef", - "description": " Memory representation of an index file. ", - "comments": "", - "used": { - "returns": [ - "git_index_get_byindex", - "git_index_get_bypath", - "git_remote_stats" - ], - "needs": [ - "git_apply_to_tree", - "git_checkout_index", - "git_cherrypick_commit", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_tree_to_index", - "git_index_add", - "git_index_add_all", - "git_index_add_bypath", - "git_index_add_from_buffer", - "git_index_caps", - "git_index_checksum", - "git_index_clear", - "git_index_conflict_add", - "git_index_conflict_cleanup", - "git_index_conflict_get", - "git_index_conflict_iterator_free", - "git_index_conflict_iterator_new", - "git_index_conflict_next", - "git_index_conflict_remove", - "git_index_entry_is_conflict", - "git_index_entry_stage", - "git_index_entrycount", - "git_index_find", - "git_index_find_prefix", - "git_index_free", - "git_index_get_byindex", - "git_index_get_bypath", - "git_index_has_conflicts", - "git_index_iterator_free", - "git_index_iterator_new", - "git_index_iterator_next", - "git_index_owner", - "git_index_path", - "git_index_read", - "git_index_read_tree", - "git_index_remove", - "git_index_remove_all", - "git_index_remove_bypath", - "git_index_remove_directory", - "git_index_set_caps", - "git_index_set_version", - "git_index_update_all", - "git_index_version", - "git_index_write", - "git_index_write_tree", - "git_index_write_tree_to", - "git_indexer_append", - "git_indexer_commit", - "git_indexer_free", - "git_indexer_hash", - "git_indexer_name", - "git_indexer_new", - "git_indexer_options_init", - "git_indexer_progress_cb", - "git_merge_commits", - "git_merge_file_from_index", - "git_merge_trees", - "git_odb_write_pack", - "git_packbuilder_write", - "git_pathspec_match_index", - "git_rebase_inmemory_index", - "git_repository_index", - "git_revert_commit" - ] - } - } - ], - [ - "git_index_add_option_t", - { - "decl": [ - "GIT_INDEX_ADD_DEFAULT", - "GIT_INDEX_ADD_FORCE", - "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", - "GIT_INDEX_ADD_CHECK_PATHSPEC" - ], - "type": "enum", - "file": "git2/index.h", - "line": 139, - "lineto": 144, - "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", - "tdef": "typedef", - "description": " Flags for APIs that add files matching pathspec ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_ADD_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_INDEX_ADD_FORCE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_INDEX_ADD_CHECK_PATHSPEC", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_capability_t", - { - "decl": [ - "GIT_INDEX_CAPABILITY_IGNORE_CASE", - "GIT_INDEX_CAPABILITY_NO_FILEMODE", - "GIT_INDEX_CAPABILITY_NO_SYMLINKS", - "GIT_INDEX_CAPABILITY_FROM_OWNER" - ], - "type": "enum", - "file": "git2/index.h", - "line": 126, - "lineto": 131, - "block": "GIT_INDEX_CAPABILITY_IGNORE_CASE\nGIT_INDEX_CAPABILITY_NO_FILEMODE\nGIT_INDEX_CAPABILITY_NO_SYMLINKS\nGIT_INDEX_CAPABILITY_FROM_OWNER", - "tdef": "typedef", - "description": " Capabilities of system that affect index actions. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_IGNORE_CASE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_NO_FILEMODE", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_NO_SYMLINKS", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_INDEX_CAPABILITY_FROM_OWNER", - "comments": "", - "value": -1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_conflict_iterator", - { - "decl": "git_index_conflict_iterator", - "type": "struct", - "value": "git_index_conflict_iterator", - "file": "git2/types.h", - "line": 154, - "lineto": 154, - "tdef": "typedef", - "description": " An iterator for conflicts in the index. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_index_conflict_iterator_free", - "git_index_conflict_iterator_new", - "git_index_conflict_next" - ] - } - } - ], - [ - "git_index_entry", - { - "decl": [ - "git_index_time ctime", - "git_index_time mtime", - "uint32_t dev", - "uint32_t ino", - "uint32_t mode", - "uint32_t uid", - "uint32_t gid", - "uint32_t file_size", - "git_oid id", - "uint16_t flags", - "uint16_t flags_extended", - "const char * path" - ], - "type": "struct", - "value": "git_index_entry", - "file": "git2/index.h", - "line": 53, - "lineto": 70, - "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", - "tdef": "typedef", - "description": " In-memory representation of a file entry in the index.", - "comments": "

This is a public structure that represents a file entry in the index. The meaning of the fields corresponds to core Git's documentation (in "Documentation/technical/index-format.txt").

\n\n

The flags field consists of a number of bit fields which can be accessed via the first set of GIT_INDEX_ENTRY_... bitmasks below. These flags are all read from and persisted to disk.

\n\n

The flags_extended field also has a number of bit fields which can be accessed via the later GIT_INDEX_ENTRY_... bitmasks below. Some of these flags are read from and written to disk, but some are set aside for in-memory only reference.

\n\n

Note that the time and size fields are truncated to 32 bits. This is enough to detect changes, which is enough for the index to function as a cache, but it should not be taken as an authoritative source for that data.

\n", - "fields": [ - { - "type": "git_index_time", - "name": "ctime", - "comments": "" - }, - { - "type": "git_index_time", - "name": "mtime", - "comments": "" - }, - { - "type": "uint32_t", - "name": "dev", - "comments": "" - }, - { - "type": "uint32_t", - "name": "ino", - "comments": "" - }, - { - "type": "uint32_t", - "name": "mode", - "comments": "" - }, - { - "type": "uint32_t", - "name": "uid", - "comments": "" - }, - { - "type": "uint32_t", - "name": "gid", - "comments": "" - }, - { - "type": "uint32_t", - "name": "file_size", - "comments": "" - }, - { - "type": "git_oid", - "name": "id", - "comments": "" - }, - { - "type": "uint16_t", - "name": "flags", - "comments": "" - }, - { - "type": "uint16_t", - "name": "flags_extended", - "comments": "" - }, - { - "type": "const char *", - "name": "path", - "comments": "" - } - ], - "used": { - "returns": [ - "git_index_get_byindex", - "git_index_get_bypath" - ], - "needs": [ - "git_index_add", - "git_index_add_from_buffer", - "git_index_conflict_add", - "git_index_conflict_get", - "git_index_conflict_next", - "git_index_entry_is_conflict", - "git_index_entry_stage", - "git_index_iterator_next", - "git_merge_file_from_index" - ] - } - } - ], - [ - "git_index_entry_extended_flag_t", - { - "decl": [ - "GIT_INDEX_ENTRY_INTENT_TO_ADD", - "GIT_INDEX_ENTRY_SKIP_WORKTREE", - "GIT_INDEX_ENTRY_EXTENDED_FLAGS", - "GIT_INDEX_ENTRY_UPTODATE" - ], - "type": "enum", - "file": "git2/index.h", - "line": 116, - "lineto": 123, - "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", - "tdef": "typedef", - "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", - "comments": "

In memory, the flags_extended fields are divided into two parts: the fields that are read from and written to disk, and other fields that in-memory only and used by libgit2. Only the flags in GIT_INDEX_ENTRY_EXTENDED_FLAGS will get saved on-disk.

\n\n

Thee first three bitmasks match the three fields in the git_index_entry flags_extended value that belong on disk. You can use them to interpret the data in the flags_extended.

\n\n

The rest of the bitmasks match the other fields in the git_index_entry flags_extended value that are only used in-memory by libgit2. You can use them to interpret the data in the flags_extended.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_ENTRY_INTENT_TO_ADD", - "comments": "", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_SKIP_WORKTREE", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_EXTENDED_FLAGS", - "comments": "", - "value": 24576 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_UPTODATE", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_entry_flag_t", - { - "decl": [ - "GIT_INDEX_ENTRY_EXTENDED", - "GIT_INDEX_ENTRY_VALID" - ], - "type": "enum", - "file": "git2/index.h", - "line": 87, - "lineto": 90, - "block": "GIT_INDEX_ENTRY_EXTENDED\nGIT_INDEX_ENTRY_VALID", - "tdef": "typedef", - "description": " Flags for index entries", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_ENTRY_EXTENDED", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_INDEX_ENTRY_VALID", - "comments": "", - "value": 32768 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_iterator", - { - "decl": "git_index_iterator", - "type": "struct", - "value": "git_index_iterator", - "file": "git2/types.h", - "line": 151, - "lineto": 151, - "tdef": "typedef", - "description": " An iterator for entries in the index. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_index_iterator_free", - "git_index_iterator_new", - "git_index_iterator_next" - ] - } - } - ], - [ - "git_index_stage_t", - { - "decl": [ - "GIT_INDEX_STAGE_ANY", - "GIT_INDEX_STAGE_NORMAL", - "GIT_INDEX_STAGE_ANCESTOR", - "GIT_INDEX_STAGE_OURS", - "GIT_INDEX_STAGE_THEIRS" - ], - "type": "enum", - "file": "git2/index.h", - "line": 147, - "lineto": 167, - "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", - "tdef": "typedef", - "description": " Git index stage states ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_INDEX_STAGE_ANY", - "comments": "

Match any index stage.

\n\n

Some index APIs take a stage to match; pass this value to match\n any entry matching the path regardless of stage.

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_NORMAL", - "comments": "

A normal staged file in the index.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_ANCESTOR", - "comments": "

The ancestor side of a conflict.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_OURS", - "comments": "

The "ours" side of a conflict.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_INDEX_STAGE_THEIRS", - "comments": "

The "theirs" side of a conflict.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_index_time", - { - "decl": [ - "int32_t seconds", - "uint32_t nanoseconds" - ], - "type": "struct", - "value": "git_index_time", - "file": "git2/index.h", - "line": 26, - "lineto": 30, - "block": "int32_t seconds\nuint32_t nanoseconds", - "tdef": "typedef", - "description": " Time structure used in a git index entry ", - "comments": "", - "fields": [ - { - "type": "int32_t", - "name": "seconds", - "comments": "" - }, - { - "type": "uint32_t", - "name": "nanoseconds", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_indexer", - { - "decl": "git_indexer", - "type": "struct", - "value": "git_indexer", - "file": "git2/indexer.h", - "line": 17, - "lineto": 17, - "tdef": "typedef", - "description": " A git indexer object ", - "comments": "", - "used": { - "returns": [ - "git_remote_stats" - ], - "needs": [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_free", - "git_indexer_hash", - "git_indexer_name", - "git_indexer_new", - "git_indexer_options_init", - "git_indexer_progress_cb", - "git_odb_write_pack", - "git_packbuilder_write" - ] - } - } - ], - [ - "git_indexer_options", - { - "decl": [ - "unsigned int version", - "git_indexer_progress_cb progress_cb", - "void * progress_cb_payload", - "unsigned char verify" - ], - "type": "struct", - "value": "git_indexer_options", - "file": "git2/indexer.h", - "line": 62, - "lineto": 86, - "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", - "tdef": "typedef", - "description": " Options for indexer configuration", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_indexer_progress_cb", - "name": "progress_cb", - "comments": " progress_cb function to call with progress information " - }, - { - "type": "void *", - "name": "progress_cb_payload", - "comments": " progress_cb_payload payload for the progress callback " - }, - { - "type": "unsigned char", - "name": "verify", - "comments": " Do connectivity checks for the received pack " - } - ], - "used": { - "returns": [], - "needs": [ - "git_indexer_new", - "git_indexer_options_init" - ] - } - } - ], - [ - "git_indexer_progress", - { - "decl": [ - "unsigned int total_objects", - "unsigned int indexed_objects", - "unsigned int received_objects", - "unsigned int local_objects", - "unsigned int total_deltas", - "unsigned int indexed_deltas", - "size_t received_bytes" - ], - "type": "struct", - "value": "git_indexer_progress", - "file": "git2/indexer.h", - "line": 24, - "lineto": 48, - "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", - "tdef": "typedef", - "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "total_objects", - "comments": " number of objects in the packfile being indexed " - }, - { - "type": "unsigned int", - "name": "indexed_objects", - "comments": " received objects that have been hashed " - }, - { - "type": "unsigned int", - "name": "received_objects", - "comments": " received_objects: objects which have been downloaded " - }, - { - "type": "unsigned int", - "name": "local_objects", - "comments": " locally-available objects that have been injected in order\n to fix a thin pack" - }, - { - "type": "unsigned int", - "name": "total_deltas", - "comments": " number of deltas in the packfile being indexed " - }, - { - "type": "unsigned int", - "name": "indexed_deltas", - "comments": " received deltas that have been indexed " - }, - { - "type": "size_t", - "name": "received_bytes", - "comments": " size of the packfile received up to now " - } - ], - "used": { - "returns": [ - "git_remote_stats" - ], - "needs": [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_progress_cb", - "git_odb_write_pack", - "git_packbuilder_write" - ] - } - } - ], - [ - "git_libgit2_opt_t", - { - "decl": [ - "GIT_OPT_GET_MWINDOW_SIZE", - "GIT_OPT_SET_MWINDOW_SIZE", - "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", - "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", - "GIT_OPT_GET_SEARCH_PATH", - "GIT_OPT_SET_SEARCH_PATH", - "GIT_OPT_SET_CACHE_OBJECT_LIMIT", - "GIT_OPT_SET_CACHE_MAX_SIZE", - "GIT_OPT_ENABLE_CACHING", - "GIT_OPT_GET_CACHED_MEMORY", - "GIT_OPT_GET_TEMPLATE_PATH", - "GIT_OPT_SET_TEMPLATE_PATH", - "GIT_OPT_SET_SSL_CERT_LOCATIONS", - "GIT_OPT_SET_USER_AGENT", - "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", - "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", - "GIT_OPT_SET_SSL_CIPHERS", - "GIT_OPT_GET_USER_AGENT", - "GIT_OPT_ENABLE_OFS_DELTA", - "GIT_OPT_ENABLE_FSYNC_GITDIR", - "GIT_OPT_GET_WINDOWS_SHAREMODE", - "GIT_OPT_SET_WINDOWS_SHAREMODE", - "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", - "GIT_OPT_SET_ALLOCATOR", - "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", - "GIT_OPT_GET_PACK_MAX_OBJECTS", - "GIT_OPT_SET_PACK_MAX_OBJECTS", - "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", - "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", - "GIT_OPT_GET_MWINDOW_FILE_LIMIT", - "GIT_OPT_SET_MWINDOW_FILE_LIMIT", - "GIT_OPT_SET_ODB_PACKED_PRIORITY", - "GIT_OPT_SET_ODB_LOOSE_PRIORITY", - "GIT_OPT_GET_EXTENSIONS", - "GIT_OPT_SET_EXTENSIONS", - "GIT_OPT_GET_OWNER_VALIDATION", - "GIT_OPT_SET_OWNER_VALIDATION", - "GIT_OPT_GET_HOMEDIR", - "GIT_OPT_SET_HOMEDIR", - "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", - "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", - "GIT_OPT_SET_SERVER_TIMEOUT", - "GIT_OPT_GET_SERVER_TIMEOUT" - ], - "type": "enum", - "file": "git2/common.h", - "line": 188, - "lineto": 232, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION\nGIT_OPT_GET_HOMEDIR\nGIT_OPT_SET_HOMEDIR\nGIT_OPT_SET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_GET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_SET_SERVER_TIMEOUT\nGIT_OPT_GET_SERVER_TIMEOUT", - "tdef": "typedef", - "description": " Global library options", - "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", - "fields": [ - { - "type": "int", - "name": "GIT_OPT_GET_MWINDOW_SIZE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_OPT_SET_MWINDOW_SIZE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_OPT_GET_MWINDOW_MAPPED_LIMIT", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_OPT_SET_MWINDOW_MAPPED_LIMIT", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_OPT_GET_SEARCH_PATH", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SEARCH_PATH", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_OPT_SET_CACHE_OBJECT_LIMIT", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_OPT_SET_CACHE_MAX_SIZE", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_CACHING", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_OPT_GET_CACHED_MEMORY", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_OPT_GET_TEMPLATE_PATH", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_OPT_SET_TEMPLATE_PATH", - "comments": "", - "value": 11 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SSL_CERT_LOCATIONS", - "comments": "", - "value": 12 - }, - { - "type": "int", - "name": "GIT_OPT_SET_USER_AGENT", - "comments": "", - "value": 13 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_STRICT_OBJECT_CREATION", - "comments": "", - "value": 14 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION", - "comments": "", - "value": 15 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SSL_CIPHERS", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_OPT_GET_USER_AGENT", - "comments": "", - "value": 17 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_OFS_DELTA", - "comments": "", - "value": 18 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_FSYNC_GITDIR", - "comments": "", - "value": 19 - }, - { - "type": "int", - "name": "GIT_OPT_GET_WINDOWS_SHAREMODE", - "comments": "", - "value": 20 - }, - { - "type": "int", - "name": "GIT_OPT_SET_WINDOWS_SHAREMODE", - "comments": "", - "value": 21 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION", - "comments": "", - "value": 22 - }, - { - "type": "int", - "name": "GIT_OPT_SET_ALLOCATOR", - "comments": "", - "value": 23 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY", - "comments": "", - "value": 24 - }, - { - "type": "int", - "name": "GIT_OPT_GET_PACK_MAX_OBJECTS", - "comments": "", - "value": 25 - }, - { - "type": "int", - "name": "GIT_OPT_SET_PACK_MAX_OBJECTS", - "comments": "", - "value": 26 - }, - { - "type": "int", - "name": "GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS", - "comments": "", - "value": 27 - }, - { - "type": "int", - "name": "GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE", - "comments": "", - "value": 28 - }, - { - "type": "int", - "name": "GIT_OPT_GET_MWINDOW_FILE_LIMIT", - "comments": "", - "value": 29 - }, - { - "type": "int", - "name": "GIT_OPT_SET_MWINDOW_FILE_LIMIT", - "comments": "", - "value": 30 - }, - { - "type": "int", - "name": "GIT_OPT_SET_ODB_PACKED_PRIORITY", - "comments": "", - "value": 31 - }, - { - "type": "int", - "name": "GIT_OPT_SET_ODB_LOOSE_PRIORITY", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_OPT_GET_EXTENSIONS", - "comments": "", - "value": 33 - }, - { - "type": "int", - "name": "GIT_OPT_SET_EXTENSIONS", - "comments": "", - "value": 34 - }, - { - "type": "int", - "name": "GIT_OPT_GET_OWNER_VALIDATION", - "comments": "", - "value": 35 - }, - { - "type": "int", - "name": "GIT_OPT_SET_OWNER_VALIDATION", - "comments": "", - "value": 36 - }, - { - "type": "int", - "name": "GIT_OPT_GET_HOMEDIR", - "comments": "", - "value": 37 - }, - { - "type": "int", - "name": "GIT_OPT_SET_HOMEDIR", - "comments": "", - "value": 38 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SERVER_CONNECT_TIMEOUT", - "comments": "", - "value": 39 - }, - { - "type": "int", - "name": "GIT_OPT_GET_SERVER_CONNECT_TIMEOUT", - "comments": "", - "value": 40 - }, - { - "type": "int", - "name": "GIT_OPT_SET_SERVER_TIMEOUT", - "comments": "", - "value": 41 - }, - { - "type": "int", - "name": "GIT_OPT_GET_SERVER_TIMEOUT", - "comments": "", - "value": 42 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_mailmap", - { - "decl": "git_mailmap", - "type": "struct", - "value": "git_mailmap", - "file": "git2/types.h", - "line": 366, - "lineto": 366, - "tdef": "typedef", - "description": " Representation of .mailmap file state. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_commit_author_with_mailmap", - "git_commit_committer_with_mailmap", - "git_mailmap_add_entry", - "git_mailmap_free", - "git_mailmap_from_buffer", - "git_mailmap_from_repository", - "git_mailmap_new", - "git_mailmap_resolve", - "git_mailmap_resolve_signature" - ] - } - } - ], - [ - "git_merge_analysis_t", - { - "decl": [ - "GIT_MERGE_ANALYSIS_NONE", - "GIT_MERGE_ANALYSIS_NORMAL", - "GIT_MERGE_ANALYSIS_UP_TO_DATE", - "GIT_MERGE_ANALYSIS_FASTFORWARD", - "GIT_MERGE_ANALYSIS_UNBORN" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 334, - "lineto": 363, - "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", - "tdef": "typedef", - "description": " The results of `git_merge_analysis` indicate the merge opportunities.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_NONE", - "comments": "

No merge is possible. (Unused.)

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_NORMAL", - "comments": "

A "normal" merge; both HEAD and the given merge input have diverged\n from their common ancestor. The divergent commits must be merged.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_UP_TO_DATE", - "comments": "

All given merge inputs are reachable from HEAD, meaning the\n repository is up-to-date and no merge needs to be performed.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_FASTFORWARD", - "comments": "

The given merge input is a fast-forward from HEAD and no merge\n needs to be performed. Instead, the client can check out the\n given merge input.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_MERGE_ANALYSIS_UNBORN", - "comments": "

The HEAD of the current repository is "unborn" and does not point to\n a valid commit. No merge can be performed, but the caller may wish\n to simply set HEAD to the target commit(s).

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_analysis", - "git_merge_analysis_for_ref" - ] - } - } - ], - [ - "git_merge_driver_source", - { - "decl": "git_merge_driver_source", - "type": "struct", - "value": "git_merge_driver_source", - "file": "git2/sys/merge.h", - "line": 41, - "lineto": 41, - "tdef": "typedef", - "description": " A merge driver source represents the file to be merged", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_file_favor_t", - { - "decl": [ - "GIT_MERGE_FILE_FAVOR_NORMAL", - "GIT_MERGE_FILE_FAVOR_OURS", - "GIT_MERGE_FILE_FAVOR_THEIRS", - "GIT_MERGE_FILE_FAVOR_UNION" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 109, - "lineto": 139, - "block": "GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION", - "tdef": "typedef", - "description": " Merge file favor options for `git_merge_options` instruct the file-level\n merging functionality how to deal with conflicting regions of the files.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_NORMAL", - "comments": "

When a region of a file is changed in both branches, a conflict\n will be recorded in the index so that git_checkout can produce\n a merge file with conflict markers in the working directory.\n This is the default.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_OURS", - "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "ours" side of any conflicting\n region. The index will not record a conflict.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_THEIRS", - "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain the "theirs" side of any conflicting\n region. The index will not record a conflict.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_FAVOR_UNION", - "comments": "

When a region of a file is changed in both branches, the file\n created in the index will contain each unique line from each side,\n which has the result of combining both files. The index will not\n record a conflict.

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_file_flag_t", - { - "decl": [ - "GIT_MERGE_FILE_DEFAULT", - "GIT_MERGE_FILE_STYLE_MERGE", - "GIT_MERGE_FILE_STYLE_DIFF3", - "GIT_MERGE_FILE_SIMPLIFY_ALNUM", - "GIT_MERGE_FILE_IGNORE_WHITESPACE", - "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", - "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", - "GIT_MERGE_FILE_DIFF_PATIENCE", - "GIT_MERGE_FILE_DIFF_MINIMAL", - "GIT_MERGE_FILE_STYLE_ZDIFF3", - "GIT_MERGE_FILE_ACCEPT_CONFLICTS" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 144, - "lineto": 181, - "block": "GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL\nGIT_MERGE_FILE_STYLE_ZDIFF3\nGIT_MERGE_FILE_ACCEPT_CONFLICTS", - "tdef": "typedef", - "description": " File merging flags", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_FILE_DEFAULT", - "comments": "

Defaults

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_STYLE_MERGE", - "comments": "

Create standard conflicted merge files

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_STYLE_DIFF3", - "comments": "

Create diff3-style files

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_SIMPLIFY_ALNUM", - "comments": "

Condense non-alphanumeric regions for simplified diff file

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE", - "comments": "

Ignore all whitespace

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE", - "comments": "

Ignore changes in amount of whitespace

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL", - "comments": "

Ignore whitespace at end of line

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_DIFF_PATIENCE", - "comments": "

Use the "patience diff" algorithm

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_DIFF_MINIMAL", - "comments": "

Take extra time to find minimal diff

\n", - "value": 128 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_STYLE_ZDIFF3", - "comments": "

Create zdiff3 ("zealous diff3")-style files

\n", - "value": 256 - }, - { - "type": "int", - "name": "GIT_MERGE_FILE_ACCEPT_CONFLICTS", - "comments": "

Do not produce file conflicts when common regions have\n changed; keep the conflict markers in the file and accept\n that as the merge result.

\n", - "value": 512 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_file_input", - { - "decl": [ - "unsigned int version", - "const char * ptr", - "size_t size", - "const char * path", - "unsigned int mode" - ], - "type": "struct", - "value": "git_merge_file_input", - "file": "git2/merge.h", - "line": 32, - "lineto": 46, - "block": "unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode", - "tdef": "typedef", - "description": " The file inputs to `git_merge_file`. Callers should populate the\n `git_merge_file_input` structure with descriptions of the files in\n each side of the conflict for use in producing the merge file.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "const char *", - "name": "ptr", - "comments": " Pointer to the contents of the file. " - }, - { - "type": "size_t", - "name": "size", - "comments": " Size of the contents pointed to in `ptr`. " - }, - { - "type": "const char *", - "name": "path", - "comments": " File name of the conflicted file, or `NULL` to not merge the path. " - }, - { - "type": "unsigned int", - "name": "mode", - "comments": " File mode of the conflicted file, or `0` to not merge the mode. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_file", - "git_merge_file_input_init" - ] - } - } - ], - [ - "git_merge_file_options", - { - "decl": [ - "unsigned int version", - "const char * ancestor_label", - "const char * our_label", - "const char * their_label", - "git_merge_file_favor_t favor", - "uint32_t flags", - "unsigned short marker_size" - ], - "type": "struct", - "value": "git_merge_file_options", - "file": "git2/merge.h", - "line": 188, - "lineto": 218, - "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nuint32_t flags\nunsigned short marker_size", - "tdef": "typedef", - "description": " Options for merging a file", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "const char *", - "name": "ancestor_label", - "comments": " Label for the ancestor file side of the conflict which will be prepended\n to labels in diff3-format merge files." - }, - { - "type": "const char *", - "name": "our_label", - "comments": " Label for our file side of the conflict which will be prepended\n to labels in merge files." - }, - { - "type": "const char *", - "name": "their_label", - "comments": " Label for their file side of the conflict which will be prepended\n to labels in merge files." - }, - { - "type": "git_merge_file_favor_t", - "name": "favor", - "comments": " The file to favor in region conflicts. " - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " see `git_merge_file_flag_t` above " - }, - { - "type": "unsigned short", - "name": "marker_size", - "comments": " The size of conflict markers (eg, \"\n<\n<\n<\n<\n<\n<\n<\n\"). Default is\n GIT_MERGE_CONFLICT_MARKER_SIZE. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_options_init" - ] - } - } - ], - [ - "git_merge_file_result", - { - "decl": [ - "unsigned int automergeable", - "const char * path", - "unsigned int mode", - "const char * ptr", - "size_t len" - ], - "type": "struct", - "value": "git_merge_file_result", - "file": "git2/merge.h", - "line": 238, - "lineto": 259, - "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", - "tdef": "typedef", - "description": " Information about file-level merging", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "automergeable", - "comments": " True if the output was automerged, false if the output contains\n conflict markers." - }, - { - "type": "const char *", - "name": "path", - "comments": " The path that the resultant merge file should use, or NULL if a\n filename conflict would occur." - }, - { - "type": "unsigned int", - "name": "mode", - "comments": " The mode that the resultant merge file should use. " - }, - { - "type": "const char *", - "name": "ptr", - "comments": " The contents of the merge. " - }, - { - "type": "size_t", - "name": "len", - "comments": " The length of the merge contents. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_result_free" - ] - } - } - ], - [ - "git_merge_flag_t", - { - "decl": [ - "GIT_MERGE_FIND_RENAMES", - "GIT_MERGE_FAIL_ON_CONFLICT", - "GIT_MERGE_SKIP_REUC", - "GIT_MERGE_NO_RECURSIVE", - "GIT_MERGE_VIRTUAL_BASE" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 68, - "lineto": 103, - "block": "GIT_MERGE_FIND_RENAMES\nGIT_MERGE_FAIL_ON_CONFLICT\nGIT_MERGE_SKIP_REUC\nGIT_MERGE_NO_RECURSIVE\nGIT_MERGE_VIRTUAL_BASE", - "tdef": "typedef", - "description": " Flags for `git_merge` options. A combination of these flags can be\n passed in via the `flags` value in the `git_merge_options`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_FIND_RENAMES", - "comments": "

Detect renames that occur between the common ancestor and the "ours"\n side or the common ancestor and the "theirs" side. This will enable\n the ability to merge between a modified and renamed file.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_FAIL_ON_CONFLICT", - "comments": "

If a conflict occurs, exit immediately instead of attempting to\n continue resolving conflicts. The merge operation will fail with\n GIT_EMERGECONFLICT and no index will be returned.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_MERGE_SKIP_REUC", - "comments": "

Do not write the REUC extension on the generated index

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_MERGE_NO_RECURSIVE", - "comments": "

If the commits being merged have multiple merge bases, do not build\n a recursive merge base (by merging the multiple merge bases),\n instead simply use the first base. This flag provides a similar\n merge base to git-merge-resolve.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_MERGE_VIRTUAL_BASE", - "comments": "

Treat this merge as if it is to produce the virtual base\n of a recursive merge. This will ensure that there are\n no conflicts, any conflicting regions will keep conflict\n markers in the merge result.

\n", - "value": 16 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_merge_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "unsigned int rename_threshold", - "unsigned int target_limit", - "git_diff_similarity_metric * metric", - "unsigned int recursion_limit", - "const char * default_driver", - "git_merge_file_favor_t file_favor", - "uint32_t file_flags" - ], - "type": "struct", - "value": "git_merge_options", - "file": "git2/merge.h", - "line": 264, - "lineto": 313, - "block": "unsigned int version\nuint32_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\nuint32_t file_flags", - "tdef": "typedef", - "description": " Merging options", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " See `git_merge_flag_t` above " - }, - { - "type": "unsigned int", - "name": "rename_threshold", - "comments": " Similarity to consider a file renamed (default 50). If\n `GIT_MERGE_FIND_RENAMES` is enabled, added files will be compared\n with deleted files to determine their similarity. Files that are\n more similar than the rename threshold (percentage-wise) will be\n treated as a rename." - }, - { - "type": "unsigned int", - "name": "target_limit", - "comments": " Maximum similarity sources to examine for renames (default 200).\n If the number of rename candidates (add / delete pairs) is greater\n than this value, inexact rename detection is aborted.\n\n This setting overrides the `merge.renameLimit` configuration value." - }, - { - "type": "git_diff_similarity_metric *", - "name": "metric", - "comments": " Pluggable similarity metric; pass NULL to use internal metric " - }, - { - "type": "unsigned int", - "name": "recursion_limit", - "comments": " Maximum number of times to merge common ancestors to build a\n virtual merge base when faced with criss-cross merges. When this\n limit is reached, the next ancestor will simply be used instead of\n attempting to merge it. The default is unlimited." - }, - { - "type": "const char *", - "name": "default_driver", - "comments": " Default merge driver to be used when both sides of a merge have\n changed. The default is the `text` driver." - }, - { - "type": "git_merge_file_favor_t", - "name": "file_favor", - "comments": " Flags for handling conflicting content, to be used with the standard\n (`text`) merge driver." - }, - { - "type": "uint32_t", - "name": "file_flags", - "comments": " see `git_merge_file_flag_t` above " - } - ], - "used": { - "returns": [], - "needs": [ - "git_cherrypick_commit", - "git_merge", - "git_merge_commits", - "git_merge_options_init", - "git_merge_trees", - "git_revert_commit" - ] - } - } - ], - [ - "git_merge_preference_t", - { - "decl": [ - "GIT_MERGE_PREFERENCE_NONE", - "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", - "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY" - ], - "type": "enum", - "file": "git2/merge.h", - "line": 368, - "lineto": 386, - "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", - "tdef": "typedef", - "description": " The user's stated preference for merges.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_MERGE_PREFERENCE_NONE", - "comments": "

No configuration was found that suggests a preferred behavior for\n merge.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_MERGE_PREFERENCE_NO_FASTFORWARD", - "comments": "

There is a merge.ff=false configuration setting, suggesting that\n the user does not want to allow a fast-forward merge.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", - "comments": "

There is a merge.ff=only configuration setting, suggesting that\n the user only wants fast-forward merges.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_analysis", - "git_merge_analysis_for_ref" - ] - } - } - ], - [ - "git_message_trailer", - { - "decl": [ - "const char * key", - "const char * value" - ], - "type": "struct", - "value": "git_message_trailer", - "file": "git2/message.h", - "line": 43, - "lineto": 46, - "block": "const char * key\nconst char * value", - "tdef": "typedef", - "description": " Represents a single git message trailer.", - "comments": "", - "fields": [ - { - "type": "const char *", - "name": "key", - "comments": "" - }, - { - "type": "const char *", - "name": "value", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - } - } - ], - [ - "git_message_trailer_array", - { - "decl": [ - "git_message_trailer * trailers", - "size_t count", - "char * _trailer_block" - ], - "type": "struct", - "value": "git_message_trailer_array", - "file": "git2/message.h", - "line": 54, - "lineto": 60, - "block": "git_message_trailer * trailers\nsize_t count\nchar * _trailer_block", - "tdef": "typedef", - "description": " Represents an array of git message trailers.", - "comments": "

Struct members under the private comment are private, subject to change and should not be used by callers.

\n", - "fields": [ - { - "type": "git_message_trailer *", - "name": "trailers", - "comments": "" - }, - { - "type": "size_t", - "name": "count", - "comments": "" - }, - { - "type": "char *", - "name": "_trailer_block", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_message_trailer_array_free", - "git_message_trailers" - ] - } - } - ], - [ - "git_midx_writer", - { - "decl": "git_midx_writer", - "type": "struct", - "value": "git_midx_writer", - "file": "git2/types.h", - "line": 100, - "lineto": 100, - "tdef": "typedef", - "description": " a writer for multi-pack-index files. ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_note", - { - "decl": "git_note", - "type": "struct", - "value": "git_note", - "file": "git2/types.h", - "line": 169, - "lineto": 169, - "tdef": "typedef", - "description": " Representation of a git note ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_note_author", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_committer", - "git_note_foreach", - "git_note_free", - "git_note_id", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_message", - "git_note_next", - "git_note_read" - ] - } - } - ], - [ - "git_note_iterator", - { - "decl": "git_note_iterator", - "type": "struct", - "value": "git_note_iterator", - "file": "git2/notes.h", - "line": 35, - "lineto": 35, - "tdef": "typedef", - "description": " note iterator", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_note_commit_iterator_new", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_next" - ] - } - } - ], - [ - "git_object", - { - "decl": "git_object", - "type": "struct", - "value": "git_object", - "file": "git2/types.h", - "line": 124, - "lineto": 124, - "tdef": "typedef", - "description": " Representation of a generic object in a repository ", - "comments": "", - "used": { - "returns": [ - "git_blob_rawsize", - "git_object_string2type", - "git_object_type", - "git_odb_object_type", - "git_tag_target_type", - "git_tree_entry_type" - ], - "needs": [ - "git_checkout_tree", - "git_describe_commit", - "git_object__size", - "git_object_dup", - "git_object_free", - "git_object_id", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_owner", - "git_object_peel", - "git_object_rawcontent_is_valid", - "git_object_short_id", - "git_object_type", - "git_object_type2string", - "git_object_typeisloose", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read_header", - "git_odb_write", - "git_reference_peel", - "git_repository_hashfile", - "git_reset", - "git_reset_default", - "git_revparse_ext", - "git_revparse_single", - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_lightweight", - "git_tag_peel", - "git_tag_target", - "git_tree_entry_to_object" - ] - } - } - ], - [ - "git_object_t", - { - "decl": [ - "GIT_OBJECT_ANY", - "GIT_OBJECT_INVALID", - "GIT_OBJECT_COMMIT", - "GIT_OBJECT_TREE", - "GIT_OBJECT_BLOB", - "GIT_OBJECT_TAG", - "GIT_OBJECT_OFS_DELTA", - "GIT_OBJECT_REF_DELTA" - ], - "type": "enum", - "file": "git2/types.h", - "line": 73, - "lineto": 82, - "block": "GIT_OBJECT_ANY\nGIT_OBJECT_INVALID\nGIT_OBJECT_COMMIT\nGIT_OBJECT_TREE\nGIT_OBJECT_BLOB\nGIT_OBJECT_TAG\nGIT_OBJECT_OFS_DELTA\nGIT_OBJECT_REF_DELTA", - "tdef": "typedef", - "description": " Basic type (loose or packed) of any Git object. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_OBJECT_ANY", - "comments": "

Object can be any of the following

\n", - "value": -2 - }, - { - "type": "int", - "name": "GIT_OBJECT_INVALID", - "comments": "

Object is invalid.

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_OBJECT_COMMIT", - "comments": "

A commit object.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_OBJECT_TREE", - "comments": "

A tree (directory listing) object.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_OBJECT_BLOB", - "comments": "

A file revision object.

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_OBJECT_TAG", - "comments": "

An annotated tag object.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_OBJECT_OFS_DELTA", - "comments": "

A delta, base is given by an offset.

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_OBJECT_REF_DELTA", - "comments": "

A delta, base is given by object id.

\n", - "value": 7 - } - ], - "used": { - "returns": [ - "git_object_string2type", - "git_object_type", - "git_odb_object_type", - "git_tag_target_type", - "git_tree_entry_type" - ], - "needs": [ - "git_object__size", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_peel", - "git_object_rawcontent_is_valid", - "git_object_type2string", - "git_object_typeisloose", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read_header", - "git_odb_write", - "git_reference_peel", - "git_repository_hashfile" - ] - } - } - ], - [ - "git_odb", - { - "decl": "git_odb", - "type": "struct", - "value": "git_odb", - "file": "git2/types.h", - "line": 85, - "lineto": 85, - "tdef": "typedef", - "description": " An open object database handle. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_indexer_new", - "git_odb_add_alternate", - "git_odb_add_backend", - "git_odb_add_disk_alternate", - "git_odb_exists", - "git_odb_exists_ext", - "git_odb_exists_prefix", - "git_odb_expand_ids", - "git_odb_foreach", - "git_odb_free", - "git_odb_get_backend", - "git_odb_num_backends", - "git_odb_object_data", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read", - "git_odb_read_header", - "git_odb_read_prefix", - "git_odb_refresh", - "git_odb_set_commit_graph", - "git_odb_stream_finalize_write", - "git_odb_stream_free", - "git_odb_stream_read", - "git_odb_stream_write", - "git_odb_write", - "git_odb_write_multi_pack_index", - "git_odb_write_pack", - "git_repository_odb" - ] - } - } - ], - [ - "git_odb_backend", - { - "decl": "git_odb_backend", - "type": "struct", - "value": "git_odb_backend", - "file": "git2/types.h", - "line": 88, - "lineto": 88, - "tdef": "typedef", - "description": " A custom backend in an ODB ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_odb_add_alternate", - "git_odb_add_backend", - "git_odb_get_backend" - ] - } - } - ], - [ - "git_odb_backend_loose_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "int compression_level", - "unsigned int dir_mode", - "unsigned int file_mode", - "git_oid_t oid_type" - ], - "type": "struct", - "value": "git_odb_backend_loose_options", - "file": "git2/odb_backend.h", - "line": 93, - "lineto": 119, - "block": "unsigned int version\nuint32_t flags\nint compression_level\nunsigned int dir_mode\nunsigned int file_mode\ngit_oid_t oid_type", - "tdef": "typedef", - "description": " Options for configuring a loose object backend. ", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " version for the struct " - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of the `git_odb_backend_loose_flag_t` types. " - }, - { - "type": "int", - "name": "compression_level", - "comments": " zlib compression level to use (0-9), where 1 is the fastest\n at the expense of larger files, and 9 produces the best\n compression at the expense of speed. 0 indicates that no\n compression should be performed. -1 is the default (currently\n optimizing for speed)." - }, - { - "type": "unsigned int", - "name": "dir_mode", - "comments": " Permissions to use creating a directory or 0 for defaults " - }, - { - "type": "unsigned int", - "name": "file_mode", - "comments": " Permissions to use creating a file or 0 for defaults " - }, - { - "type": "git_oid_t", - "name": "oid_type", - "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_odb_backend_pack_options", - { - "decl": [ - "unsigned int version", - "git_oid_t oid_type" - ], - "type": "struct", - "value": "git_odb_backend_pack_options", - "file": "git2/odb_backend.h", - "line": 28, - "lineto": 36, - "block": "unsigned int version\ngit_oid_t oid_type", - "tdef": "typedef", - "description": " Options for configuring a packfile object backend. ", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " version for the struct " - }, - { - "type": "git_oid_t", - "name": "oid_type", - "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_odb_expand_id", - { - "decl": [ - "git_oid id", - "unsigned short length", - "git_object_t type" - ], - "type": "struct", - "value": "git_odb_expand_id", - "file": "git2/odb.h", - "line": 230, - "lineto": 245, - "block": "git_oid id\nunsigned short length\ngit_object_t type", - "tdef": "typedef", - "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", - "comments": "", - "fields": [ - { - "type": "git_oid", - "name": "id", - "comments": " The object ID to expand " - }, - { - "type": "unsigned short", - "name": "length", - "comments": " The length of the object ID (in nibbles, or packets of 4 bits; the\n number of hex characters)" - }, - { - "type": "git_object_t", - "name": "type", - "comments": " The (optional) type of the object to search for; leave as `0` or set\n to `GIT_OBJECT_ANY` to query for any object matching the ID." - } - ], - "used": { - "returns": [], - "needs": [ - "git_odb_expand_ids" - ] - } - } - ], - [ - "git_odb_lookup_flags_t", - { - "decl": [ - "GIT_ODB_LOOKUP_NO_REFRESH" - ], - "type": "enum", - "file": "git2/odb.h", - "line": 26, - "lineto": 34, - "block": "GIT_ODB_LOOKUP_NO_REFRESH", - "tdef": "typedef", - "description": " Flags controlling the behavior of ODB lookup operations ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_ODB_LOOKUP_NO_REFRESH", - "comments": "

Don't call git_odb_refresh if the lookup fails. Useful when doing\n a batch of lookup operations for objects that may legitimately not\n exist. When using this flag, you may wish to manually call\n git_odb_refresh before processing a batch of objects.

\n", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_odb_object", - { - "decl": "git_odb_object", - "type": "struct", - "value": "git_odb_object", - "file": "git2/types.h", - "line": 91, - "lineto": 91, - "tdef": "typedef", - "description": " An object read from the ODB ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_odb_object_data", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_read", - "git_odb_read_prefix" - ] - } - } - ], - [ - "git_odb_options", - { - "decl": [ - "unsigned int version", - "git_oid_t oid_type" - ], - "type": "struct", - "value": "git_odb_options", - "file": "git2/odb.h", - "line": 42, - "lineto": 50, - "block": "unsigned int version\ngit_oid_t oid_type", - "tdef": "typedef", - "description": " Options for configuring a loose object backend. ", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " version for the struct " - }, - { - "type": "git_oid_t", - "name": "oid_type", - "comments": " Type of object IDs to use for this object database, or\n 0 for default (currently SHA1)." - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_odb_stream", - { - "decl": "git_odb_stream", - "type": "struct", - "value": "git_odb_stream", - "file": "git2/types.h", - "line": 94, - "lineto": 94, - "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_object_size_t declared_size\ngit_object_size_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", - "tdef": "typedef", - "description": " A stream to read/write from the ODB ", - "comments": "", - "fields": [ - { - "type": "git_odb_backend *", - "name": "backend", - "comments": "" - }, - { - "type": "unsigned int", - "name": "mode", - "comments": "" - }, - { - "type": "void *", - "name": "hash_ctx", - "comments": "" - }, - { - "type": "git_object_size_t", - "name": "declared_size", - "comments": "" - }, - { - "type": "git_object_size_t", - "name": "received_bytes", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream *, char *, size_t)", - "name": "read", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream *, const char *, size_t)", - "name": "write", - "comments": "" - }, - { - "type": "int (*)(git_odb_stream *, const git_oid *)", - "name": "finalize_write", - "comments": "" - }, - { - "type": "void (*)(git_odb_stream *)", - "name": "free", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_stream_finalize_write", - "git_odb_stream_free", - "git_odb_stream_read", - "git_odb_stream_write" - ] - } - } - ], - [ - "git_odb_stream_t", - { - "decl": [ - "GIT_STREAM_RDONLY", - "GIT_STREAM_WRONLY", - "GIT_STREAM_RW" - ], - "type": "enum", - "file": "git2/odb_backend.h", - "line": 155, - "lineto": 159, - "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", - "tdef": "typedef", - "description": " Streaming mode ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STREAM_RDONLY", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STREAM_WRONLY", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STREAM_RW", - "comments": "", - "value": 6 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_odb_writepack", - { - "decl": "git_odb_writepack", - "type": "struct", - "value": "git_odb_writepack", - "file": "git2/types.h", - "line": 97, - "lineto": 97, - "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", - "tdef": "typedef", - "description": " A stream to write a packfile to the ODB ", - "comments": "", - "fields": [ - { - "type": "git_odb_backend *", - "name": "backend", - "comments": "" - }, - { - "type": "int (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *)", - "name": "append", - "comments": "" - }, - { - "type": "int (*)(git_odb_writepack *, git_indexer_progress *)", - "name": "commit", - "comments": "" - }, - { - "type": "void (*)(git_odb_writepack *)", - "name": "free", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_odb_write_pack" - ] - } - } - ], - [ - "git_oid", - { - "decl": [ - "unsigned char [20] id" - ], - "type": "struct", - "value": "git_oid", - "file": "git2/oid.h", - "line": 99, - "lineto": 108, - "block": "unsigned char [20] id", - "tdef": "typedef", - "description": " Unique identity of any object (commit, tree, blob, tag). ", - "comments": "", - "fields": [ - { - "type": "unsigned char [20]", - "name": "id", - "comments": " raw binary formatted id " - } - ], - "used": { - "returns": [ - "git_annotated_commit_id", - "git_blob_id", - "git_commit_id", - "git_commit_parent_id", - "git_commit_tree_id", - "git_index_checksum", - "git_indexer_hash", - "git_note_id", - "git_object_id", - "git_odb_object_id", - "git_oid_shorten_new", - "git_packbuilder_hash", - "git_rebase_onto_id", - "git_rebase_orig_head_id", - "git_reference_target", - "git_reference_target_peel", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_repository_oid_type", - "git_submodule_head_id", - "git_submodule_index_id", - "git_submodule_wd_id", - "git_tag_id", - "git_tag_target_id", - "git_tree_entry_id", - "git_tree_id" - ], - "needs": [ - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_lookup", - "git_blob_create_from_buffer", - "git_blob_create_from_disk", - "git_blob_create_from_stream_commit", - "git_blob_create_from_workdir", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_commit_amend", - "git_commit_create", - "git_commit_create_cb", - "git_commit_create_v", - "git_commit_create_with_signature", - "git_commit_extract_signature", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_diff_patchid", - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any", - "git_index_write_tree", - "git_index_write_tree_to", - "git_merge_base", - "git_merge_base_many", - "git_merge_base_octopus", - "git_merge_bases", - "git_merge_bases_many", - "git_note_commit_create", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_create", - "git_note_foreach_cb", - "git_note_next", - "git_note_read", - "git_note_remove", - "git_object_lookup", - "git_object_lookup_prefix", - "git_odb_exists", - "git_odb_exists_ext", - "git_odb_exists_prefix", - "git_odb_foreach_cb", - "git_odb_open_rstream", - "git_odb_read", - "git_odb_read_header", - "git_odb_read_prefix", - "git_odb_stream_finalize_write", - "git_odb_write", - "git_oid_cmp", - "git_oid_cpy", - "git_oid_equal", - "git_oid_fmt", - "git_oid_is_zero", - "git_oid_ncmp", - "git_oid_nfmt", - "git_oid_pathfmt", - "git_oid_shorten_add", - "git_oid_shorten_free", - "git_oid_strcmp", - "git_oid_streq", - "git_oid_tostr", - "git_oid_tostr_s", - "git_oidarray_dispose", - "git_oidarray_free", - "git_packbuilder_insert", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_recur", - "git_packbuilder_insert_tree", - "git_rebase_commit", - "git_reference_create", - "git_reference_create_matching", - "git_reference_name_to_id", - "git_reference_set_target", - "git_reflog_append", - "git_repository_fetchhead_foreach_cb", - "git_repository_hashfile", - "git_repository_mergehead_foreach_cb", - "git_repository_set_head_detached", - "git_revwalk_hide", - "git_revwalk_hide_cb", - "git_revwalk_next", - "git_revwalk_push", - "git_stash_cb", - "git_stash_save", - "git_stash_save_with_opts", - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_foreach_cb", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_transaction_set_target", - "git_tree_create_updated", - "git_tree_entry_byid", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_treebuilder_insert", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer" - ] - } - } - ], - [ - "git_oid_shorten", - { - "decl": "git_oid_shorten", - "type": "struct", - "value": "git_oid_shorten", - "file": "git2/oid.h", - "line": 320, - "lineto": 320, - "tdef": "typedef", - "description": " OID Shortener object", - "comments": "", - "used": { - "returns": [ - "git_oid_shorten_new" - ], - "needs": [ - "git_oid_shorten_add", - "git_oid_shorten_free" - ] - } - } - ], - [ - "git_oid_t", - { - "decl": [ - "GIT_OID_SHA1" - ], - "type": "enum", - "file": "git2/oid.h", - "line": 24, - "lineto": 33, - "block": "GIT_OID_SHA1", - "tdef": "typedef", - "description": " The type of object id. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_OID_SHA1", - "comments": "

SHA1

\n", - "value": 1 - } - ], - "used": { - "returns": [ - "git_repository_oid_type" - ], - "needs": [] - } - } - ], - [ - "git_oidarray", - { - "decl": [ - "git_oid * ids", - "size_t count" - ], - "type": "struct", - "value": "git_oidarray", - "file": "git2/oidarray.h", - "line": 16, - "lineto": 19, - "block": "git_oid * ids\nsize_t count", - "tdef": "typedef", - "description": " Array of object ids ", - "comments": "", - "fields": [ - { - "type": "git_oid *", - "name": "ids", - "comments": "" - }, - { - "type": "size_t", - "name": "count", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_merge_bases", - "git_merge_bases_many", - "git_oidarray_dispose", - "git_oidarray_free" - ] - } - } - ], - [ - "git_packbuilder", - { - "decl": "git_packbuilder", - "type": "struct", - "value": "git_packbuilder", - "file": "git2/types.h", - "line": 172, - "lineto": 172, - "tdef": "typedef", - "description": " Representation of a git packbuilder ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_packbuilder_foreach", - "git_packbuilder_free", - "git_packbuilder_hash", - "git_packbuilder_insert", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_recur", - "git_packbuilder_insert_tree", - "git_packbuilder_insert_walk", - "git_packbuilder_name", - "git_packbuilder_new", - "git_packbuilder_object_count", - "git_packbuilder_set_callbacks", - "git_packbuilder_set_threads", - "git_packbuilder_write", - "git_packbuilder_write_buf", - "git_packbuilder_written" - ] - } - } - ], - [ - "git_packbuilder_stage_t", - { - "decl": [ - "GIT_PACKBUILDER_ADDING_OBJECTS", - "GIT_PACKBUILDER_DELTAFICATION" - ], - "type": "enum", - "file": "git2/pack.h", - "line": 52, - "lineto": 55, - "block": "GIT_PACKBUILDER_ADDING_OBJECTS\nGIT_PACKBUILDER_DELTAFICATION", - "tdef": "typedef", - "description": " Stages that are reported by the packbuilder progress callback.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PACKBUILDER_ADDING_OBJECTS", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PACKBUILDER_DELTAFICATION", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_patch", - { - "decl": "git_patch", - "type": "struct", - "value": "git_patch", - "file": "git2/patch.h", - "line": 29, - "lineto": 29, - "tdef": "typedef", - "description": " The diff patch is used to store all the text diffs for a delta.", - "comments": "

You can easily loop over the content of patches and get information about them.

\n", - "used": { - "returns": [], - "needs": [ - "git_patch_free", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers", - "git_patch_from_diff", - "git_patch_get_delta", - "git_patch_get_hunk", - "git_patch_get_line_in_hunk", - "git_patch_line_stats", - "git_patch_num_hunks", - "git_patch_num_lines_in_hunk", - "git_patch_owner", - "git_patch_print", - "git_patch_size", - "git_patch_to_buf" - ] - } - } - ], - [ - "git_path_fs", - { - "decl": [ - "GIT_PATH_FS_GENERIC", - "GIT_PATH_FS_NTFS", - "GIT_PATH_FS_HFS" - ], - "type": "enum", - "file": "git2/sys/path.h", - "line": 34, - "lineto": 41, - "block": "GIT_PATH_FS_GENERIC\nGIT_PATH_FS_NTFS\nGIT_PATH_FS_HFS", - "tdef": "typedef", - "description": " The kinds of checks to perform according to which filesystem we are trying to\n protect.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PATH_FS_GENERIC", - "comments": "

Do both NTFS- and HFS-specific checks

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PATH_FS_NTFS", - "comments": "

Do NTFS-specific checks only

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_PATH_FS_HFS", - "comments": "

Do HFS-specific checks only

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_pathspec", - { - "decl": "git_pathspec", - "type": "struct", - "value": "git_pathspec", - "file": "git2/pathspec.h", - "line": 20, - "lineto": 20, - "tdef": "typedef", - "description": " Compiled pathspec", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_pathspec_free", - "git_pathspec_match_diff", - "git_pathspec_match_index", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_failed_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_free", - "git_pathspec_match_tree", - "git_pathspec_match_workdir", - "git_pathspec_matches_path", - "git_pathspec_new" - ] - } - } - ], - [ - "git_pathspec_flag_t", - { - "decl": [ - "GIT_PATHSPEC_DEFAULT", - "GIT_PATHSPEC_IGNORE_CASE", - "GIT_PATHSPEC_USE_CASE", - "GIT_PATHSPEC_NO_GLOB", - "GIT_PATHSPEC_NO_MATCH_ERROR", - "GIT_PATHSPEC_FIND_FAILURES", - "GIT_PATHSPEC_FAILURES_ONLY" - ], - "type": "enum", - "file": "git2/pathspec.h", - "line": 30, - "lineto": 73, - "block": "GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY", - "tdef": "typedef", - "description": " Options controlling how pathspec match should be executed", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PATHSPEC_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_IGNORE_CASE", - "comments": "

GIT_PATHSPEC_IGNORE_CASE forces match to ignore case; otherwise\n match will use native case sensitivity of platform filesystem

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_USE_CASE", - "comments": "

GIT_PATHSPEC_USE_CASE forces case sensitive match; otherwise\n match will use native case sensitivity of platform filesystem

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_NO_GLOB", - "comments": "

GIT_PATHSPEC_NO_GLOB disables glob patterns and just uses simple\n string comparison for matching

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_NO_MATCH_ERROR", - "comments": "

GIT_PATHSPEC_NO_MATCH_ERROR means the match functions return error\n code GIT_ENOTFOUND if no matches are found; otherwise no matches is\n still success (return 0) but git_pathspec_match_list_entrycount\n will indicate 0 matches.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_FIND_FAILURES", - "comments": "

GIT_PATHSPEC_FIND_FAILURES means that the git_pathspec_match_list\n should track which patterns matched which files so that at the end of\n the match we can identify patterns that did not match any files.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_PATHSPEC_FAILURES_ONLY", - "comments": "

GIT_PATHSPEC_FAILURES_ONLY means that the git_pathspec_match_list\n does not need to keep the actual matching filenames. Use this to\n just test if there were any matches at all or in combination with\n GIT_PATHSPEC_FIND_FAILURES to validate a pathspec.

\n", - "value": 32 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_pathspec_match_list", - { - "decl": "git_pathspec_match_list", - "type": "struct", - "value": "git_pathspec_match_list", - "file": "git2/pathspec.h", - "line": 25, - "lineto": 25, - "tdef": "typedef", - "description": " List of filenames matching a pathspec", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_pathspec_match_diff", - "git_pathspec_match_index", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_failed_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_free", - "git_pathspec_match_tree", - "git_pathspec_match_workdir" - ] - } - } - ], - [ - "git_proxy_options", - { - "decl": [ - "unsigned int version", - "git_proxy_t type", - "const char * url", - "git_credential_acquire_cb credentials", - "git_transport_certificate_check_cb certificate_check", - "void * payload" - ], - "type": "struct", - "value": "git_proxy_options", - "file": "git2/proxy.h", - "line": 44, - "lineto": 79, - "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", - "tdef": "typedef", - "description": " Options for connecting through a proxy", - "comments": "

Note that not all types may be supported, depending on the platform and compilation options.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_proxy_t", - "name": "type", - "comments": " The type of proxy to use, by URL, auto-detect." - }, - { - "type": "const char *", - "name": "url", - "comments": " The URL of the proxy." - }, - { - "type": "git_credential_acquire_cb", - "name": "credentials", - "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." - }, - { - "type": "git_transport_certificate_check_cb", - "name": "certificate_check", - "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." - }, - { - "type": "void *", - "name": "payload", - "comments": " Payload to be provided to the credentials and certificate\n check callbacks." - } - ], - "used": { - "returns": [], - "needs": [ - "git_proxy_options_init", - "git_remote_connect" - ] - } - } - ], - [ - "git_proxy_t", - { - "decl": [ - "GIT_PROXY_NONE", - "GIT_PROXY_AUTO", - "GIT_PROXY_SPECIFIED" - ], - "type": "enum", - "file": "git2/proxy.h", - "line": 20, - "lineto": 36, - "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", - "tdef": "typedef", - "description": " The type of proxy to use.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_PROXY_NONE", - "comments": "

Do not attempt to connect through a proxy

\n\n

If built against libcurl, it itself may attempt to connect\n to a proxy if the environment variables specify it.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_PROXY_AUTO", - "comments": "

Try to auto-detect the proxy from the git configuration.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_PROXY_SPECIFIED", - "comments": "

Connect via the URL given in the options

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_push", - { - "decl": "git_push", - "type": "struct", - "value": "git_push", - "file": "git2/types.h", - "line": 253, - "lineto": 253, - "tdef": "typedef", - "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_push_negotiation", - "git_push_options_init", - "git_remote_push", - "git_remote_upload" - ] - } - } - ], - [ - "git_push_options", - { - "decl": [ - "unsigned int version", - "unsigned int pb_parallelism", - "git_remote_callbacks callbacks", - "git_proxy_options proxy_opts", - "git_remote_redirect_t follow_redirects", - "git_strarray custom_headers" - ], - "type": "struct", - "value": "git_push_options", - "file": "git2/remote.h", - "line": 799, - "lineto": 833, - "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", - "tdef": "typedef", - "description": " Controls the behavior of a git_push object.", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "pb_parallelism", - "comments": " If the transport being used to push to the remote requires the creation\n of a pack file, this controls the number of worker threads used by\n the packbuilder when creating that pack file to be sent to the remote.\n\n If set to 0, the packbuilder will auto-detect the number of threads\n to create. The default value is 1." - }, - { - "type": "git_remote_callbacks", - "name": "callbacks", - "comments": " Callbacks to use for this push operation" - }, - { - "type": "git_proxy_options", - "name": "proxy_opts", - "comments": " Proxy options to use, by default no proxy is used." - }, - { - "type": "git_remote_redirect_t", - "name": "follow_redirects", - "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." - }, - { - "type": "git_strarray", - "name": "custom_headers", - "comments": " Extra headers for this push operation" - } - ], - "used": { - "returns": [], - "needs": [ - "git_push_options_init", - "git_remote_push", - "git_remote_upload" - ] - } - } - ], - [ - "git_push_update", - { - "decl": [ - "char * src_refname", - "char * dst_refname", - "git_oid src", - "git_oid dst" - ], - "type": "struct", - "value": "git_push_update", - "file": "git2/remote.h", - "line": 468, - "lineto": 485, - "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", - "tdef": "typedef", - "description": " Represents an update which will be performed on the remote during push", - "comments": "", - "fields": [ - { - "type": "char *", - "name": "src_refname", - "comments": " The source name of the reference" - }, - { - "type": "char *", - "name": "dst_refname", - "comments": " The name of the reference to update on the server" - }, - { - "type": "git_oid", - "name": "src", - "comments": " The current target of the reference" - }, - { - "type": "git_oid", - "name": "dst", - "comments": " The new target for the reference" - } - ], - "used": { - "returns": [], - "needs": [ - "git_push_negotiation" - ] - } - } - ], - [ - "git_rebase", - { - "decl": "git_rebase", - "type": "struct", - "value": "git_rebase", - "file": "git2/types.h", - "line": 204, - "lineto": 204, - "tdef": "typedef", - "description": " Representation of a rebase ", - "comments": "", - "used": { - "returns": [ - "git_rebase_operation_byindex" - ], - "needs": [ - "git_rebase_abort", - "git_rebase_commit", - "git_rebase_finish", - "git_rebase_free", - "git_rebase_init", - "git_rebase_inmemory_index", - "git_rebase_next", - "git_rebase_onto_id", - "git_rebase_onto_name", - "git_rebase_open", - "git_rebase_operation_byindex", - "git_rebase_operation_current", - "git_rebase_operation_entrycount", - "git_rebase_options_init", - "git_rebase_orig_head_id", - "git_rebase_orig_head_name" - ] - } - } - ], - [ - "git_rebase_operation", - { - "decl": [ - "git_rebase_operation_t type", - "const git_oid id", - "const char * exec" - ], - "type": "struct", - "value": "git_rebase_operation", - "file": "git2/rebase.h", - "line": 172, - "lineto": 187, - "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", - "tdef": "typedef", - "description": " A rebase operation", - "comments": "

Describes a single instruction/operation to be performed during the rebase.

\n", - "fields": [ - { - "type": "git_rebase_operation_t", - "name": "type", - "comments": " The type of rebase operation. " - }, - { - "type": "const git_oid", - "name": "id", - "comments": " The commit ID being cherry-picked. This will be populated for\n all operations except those of type `GIT_REBASE_OPERATION_EXEC`." - }, - { - "type": "const char *", - "name": "exec", - "comments": " The executable the user has requested be run. This will only\n be populated for operations of type `GIT_REBASE_OPERATION_EXEC`." - } - ], - "used": { - "returns": [ - "git_rebase_operation_byindex" - ], - "needs": [ - "git_rebase_next" - ] - } - } - ], - [ - "git_rebase_operation_t", - { - "decl": [ - "GIT_REBASE_OPERATION_PICK", - "GIT_REBASE_OPERATION_REWORD", - "GIT_REBASE_OPERATION_EDIT", - "GIT_REBASE_OPERATION_SQUASH", - "GIT_REBASE_OPERATION_FIXUP", - "GIT_REBASE_OPERATION_EXEC" - ], - "type": "enum", - "file": "git2/rebase.h", - "line": 120, - "lineto": 156, - "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", - "tdef": "typedef", - "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REBASE_OPERATION_PICK", - "comments": "

The given commit is to be cherry-picked. The client should commit\n the changes and continue if there are no conflicts.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_REWORD", - "comments": "

The given commit is to be cherry-picked, but the client should prompt\n the user to provide an updated commit message.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_EDIT", - "comments": "

The given commit is to be cherry-picked, but the client should stop\n to allow the user to edit the changes before committing them.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_SQUASH", - "comments": "

The given commit is to be squashed into the previous commit. The\n commit message will be merged with the previous message.

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_FIXUP", - "comments": "

The given commit is to be squashed into the previous commit. The\n commit message from this commit will be discarded.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REBASE_OPERATION_EXEC", - "comments": "

No commit will be cherry-picked. The client should run the given\n command and (if successful) continue.

\n", - "value": 5 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_rebase_options", - { - "decl": [ - "unsigned int version", - "int quiet", - "int inmemory", - "const char * rewrite_notes_ref", - "git_merge_options merge_options", - "git_checkout_options checkout_options", - "git_commit_create_cb commit_create_cb", - "int (*)(git_buf *, git_buf *, const char *, void *) signing_cb", - "void * payload" - ], - "type": "struct", - "value": "git_rebase_options", - "file": "git2/rebase.h", - "line": 32, - "lineto": 115, - "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_create_cb commit_create_cb\nint (*)(git_buf *, git_buf *, const char *, void *) signing_cb\nvoid * payload", - "tdef": "typedef", - "description": " Rebase options", - "comments": "

Use to tell the rebase machinery how to operate.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "int", - "name": "quiet", - "comments": " Used by `git_rebase_init`, this will instruct other clients working\n on this rebase that you want a quiet rebase experience, which they\n may choose to provide in an application-specific manner. This has no\n effect upon libgit2 directly, but is provided for interoperability\n between Git tools." - }, - { - "type": "int", - "name": "inmemory", - "comments": " Used by `git_rebase_init`, this will begin an in-memory rebase,\n which will allow callers to step through the rebase operations and\n commit the rebased changes, but will not rewind HEAD or update the\n repository to be in a rebasing state. This will not interfere with\n the working directory (if there is one)." - }, - { - "type": "const char *", - "name": "rewrite_notes_ref", - "comments": " Used by `git_rebase_finish`, this is the name of the notes reference\n used to rewrite notes for rebased commits when finishing the rebase;\n if NULL, the contents of the configuration option `notes.rewriteRef`\n is examined, unless the configuration option `notes.rewrite.rebase`\n is set to false. If `notes.rewriteRef` is also NULL, notes will\n not be rewritten." - }, - { - "type": "git_merge_options", - "name": "merge_options", - "comments": " Options to control how trees are merged during `git_rebase_next`." - }, - { - "type": "git_checkout_options", - "name": "checkout_options", - "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." - }, - { - "type": "git_commit_create_cb", - "name": "commit_create_cb", - "comments": " Optional callback that allows users to override commit\n creation in `git_rebase_commit`. If specified, users can\n create their own commit and provide the commit ID, which\n may be useful for signing commits or otherwise customizing\n the commit creation.\n\n If this callback returns `GIT_PASSTHROUGH`, then\n `git_rebase_commit` will continue to create the commit." - }, - { - "type": "int (*)(git_buf *, git_buf *, const char *, void *)", - "name": "signing_cb", - "comments": " If provided, this will be called with the commit content, allowing\n a signature to be added to the rebase commit. Can be skipped with\n GIT_PASSTHROUGH. If GIT_PASSTHROUGH is returned, a commit will be made\n without a signature.\n\n This field is only used when performing git_rebase_commit.\n\n This callback is not invoked if a `git_commit_create_cb` is\n specified.\n\n This callback is deprecated; users should provide a\n creation callback as `commit_create_cb` that produces a\n commit buffer, signs it, and commits it." - }, - { - "type": "void *", - "name": "payload", - "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." - } - ], - "used": { - "returns": [], - "needs": [ - "git_rebase_init", - "git_rebase_open", - "git_rebase_options_init" - ] - } - } - ], - [ - "git_refdb", - { - "decl": "git_refdb", - "type": "struct", - "value": "git_refdb", - "file": "git2/types.h", - "line": 103, - "lineto": 103, - "tdef": "typedef", - "description": " An open refs database handle. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_refdb_compress", - "git_refdb_free", - "git_refdb_new", - "git_refdb_open", - "git_repository_refdb" - ] - } - } - ], - [ - "git_refdb_backend", - { - "decl": "git_refdb_backend", - "type": "struct", - "value": "git_refdb_backend", - "file": "git2/types.h", - "line": 106, - "lineto": 106, - "tdef": "typedef", - "description": " A custom backend for refs ", - "comments": "", - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_reference", - { - "decl": "git_reference", - "type": "struct", - "value": "git_reference", - "file": "git2/types.h", - "line": 189, - "lineto": 189, - "tdef": "typedef", - "description": " In-memory representation of a reference. ", - "comments": "", - "used": { - "returns": [ - "git_reference_type" - ], - "needs": [ - "git_annotated_commit_from_ref", - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_delete", - "git_branch_is_checked_out", - "git_branch_is_head", - "git_branch_lookup", - "git_branch_move", - "git_branch_name", - "git_branch_next", - "git_branch_set_upstream", - "git_branch_upstream", - "git_merge_analysis_for_ref", - "git_reference_cmp", - "git_reference_create", - "git_reference_create_matching", - "git_reference_delete", - "git_reference_dup", - "git_reference_dwim", - "git_reference_foreach", - "git_reference_foreach_cb", - "git_reference_foreach_glob", - "git_reference_foreach_name", - "git_reference_free", - "git_reference_is_branch", - "git_reference_is_note", - "git_reference_is_remote", - "git_reference_is_tag", - "git_reference_iterator_free", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_lookup", - "git_reference_name", - "git_reference_next", - "git_reference_next_name", - "git_reference_owner", - "git_reference_peel", - "git_reference_rename", - "git_reference_resolve", - "git_reference_set_target", - "git_reference_shorthand", - "git_reference_symbolic_create", - "git_reference_symbolic_create_matching", - "git_reference_symbolic_set_target", - "git_reference_symbolic_target", - "git_reference_target", - "git_reference_target_peel", - "git_reference_type", - "git_repository_head", - "git_repository_head_for_worktree", - "git_revparse_ext" - ] - } - } - ], - [ - "git_reference_format_t", - { - "decl": [ - "GIT_REFERENCE_FORMAT_NORMAL", - "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", - "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", - "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND" - ], - "type": "enum", - "file": "git2/refs.h", - "line": 661, - "lineto": 690, - "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", - "tdef": "typedef", - "description": " Normalization options for reference lookup", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_NORMAL", - "comments": "

No particular normalization.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL", - "comments": "

Control whether one-level refnames are accepted\n (i.e., refnames that do not contain multiple /-separated\n components). Those are expected to be written only using\n uppercase letters and underscore (FETCH_HEAD, ...)

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_REFSPEC_PATTERN", - "comments": "

Interpret the provided name as a reference pattern for a\n refspec (as used with remote repositories). If this option\n is enabled, the name is allowed to contain a single * (\n<star

\n\n
\n

)\n in place of a one full pathname component\n (e.g., foo/\n<star\n/bar but not foo/bar\n<star\n).

\n
\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", - "comments": "

Interpret the name as part of a refspec in shorthand form\n so the ONELEVEL naming rules aren't enforced and 'master'\n becomes a valid name.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_reference_iterator", - { - "decl": "git_reference_iterator", - "type": "struct", - "value": "git_reference_iterator", - "file": "git2/types.h", - "line": 192, - "lineto": 192, - "tdef": "typedef", - "description": " Iterator for references ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_reference_iterator_free", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_next", - "git_reference_next_name" - ] - } - } - ], - [ - "git_reference_t", - { - "decl": [ - "GIT_REFERENCE_INVALID", - "GIT_REFERENCE_DIRECT", - "GIT_REFERENCE_SYMBOLIC", - "GIT_REFERENCE_ALL" - ], - "type": "enum", - "file": "git2/types.h", - "line": 207, - "lineto": 212, - "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", - "tdef": "typedef", - "description": " Basic type of any Git reference. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REFERENCE_INVALID", - "comments": "

Invalid reference

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REFERENCE_DIRECT", - "comments": "

A reference that points at an object id

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REFERENCE_SYMBOLIC", - "comments": "

A reference that points at another reference

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REFERENCE_ALL", - "comments": "", - "value": 3 - } - ], - "used": { - "returns": [ - "git_reference_type" - ], - "needs": [] - } - } - ], - [ - "git_reflog", - { - "decl": "git_reflog", - "type": "struct", - "value": "git_reflog", - "file": "git2/types.h", - "line": 166, - "lineto": 166, - "tdef": "typedef", - "description": " Representation of a reference log ", - "comments": "", - "used": { - "returns": [ - "git_reflog_entry_byindex" - ], - "needs": [ - "git_reflog_append", - "git_reflog_drop", - "git_reflog_entry_byindex", - "git_reflog_entry_committer", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_reflog_entry_message", - "git_reflog_entrycount", - "git_reflog_free", - "git_reflog_read", - "git_reflog_write", - "git_transaction_set_reflog" - ] - } - } - ], - [ - "git_reflog_entry", - { - "decl": "git_reflog_entry", - "type": "struct", - "value": "git_reflog_entry", - "file": "git2/types.h", - "line": 163, - "lineto": 163, - "tdef": "typedef", - "description": " Representation of a reference log entry ", - "comments": "", - "used": { - "returns": [ - "git_reflog_entry_byindex" - ], - "needs": [ - "git_reflog_entry_committer", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_reflog_entry_message" - ] - } - } - ], - [ - "git_refspec", - { - "decl": "git_refspec", - "type": "struct", - "value": "git_refspec", - "file": "git2/types.h", - "line": 235, - "lineto": 235, - "tdef": "typedef", - "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", - "comments": "", - "used": { - "returns": [ - "git_remote_get_refspec" - ], - "needs": [ - "git_refspec_direction", - "git_refspec_dst", - "git_refspec_dst_matches", - "git_refspec_force", - "git_refspec_free", - "git_refspec_parse", - "git_refspec_rtransform", - "git_refspec_src", - "git_refspec_src_matches", - "git_refspec_string", - "git_refspec_transform" - ] - } - } - ], - [ - "git_remote", - { - "decl": "git_remote", - "type": "struct", - "value": "git_remote", - "file": "git2/types.h", - "line": 241, - "lineto": 241, - "tdef": "typedef", - "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entries).", - "comments": "", - "used": { - "returns": [ - "git_remote_autotag" - ], - "needs": [ - "git_headlist_cb", - "git_remote_autotag", - "git_remote_connect", - "git_remote_connect_ext", - "git_remote_connect_options_init", - "git_remote_connected", - "git_remote_create", - "git_remote_create_anonymous", - "git_remote_create_cb", - "git_remote_create_detached", - "git_remote_create_options_init", - "git_remote_create_with_fetchspec", - "git_remote_create_with_opts", - "git_remote_default_branch", - "git_remote_disconnect", - "git_remote_download", - "git_remote_dup", - "git_remote_fetch", - "git_remote_free", - "git_remote_get_fetch_refspecs", - "git_remote_get_push_refspecs", - "git_remote_get_refspec", - "git_remote_init_callbacks", - "git_remote_lookup", - "git_remote_ls", - "git_remote_name", - "git_remote_owner", - "git_remote_prune", - "git_remote_prune_refs", - "git_remote_push", - "git_remote_pushurl", - "git_remote_ready_cb", - "git_remote_refspec_count", - "git_remote_set_autotag", - "git_remote_set_instance_pushurl", - "git_remote_set_instance_url", - "git_remote_stats", - "git_remote_stop", - "git_remote_update_tips", - "git_remote_upload", - "git_remote_url", - "git_transport_cb" - ] - } - } - ], - [ - "git_remote_autotag_option_t", - { - "decl": [ - "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", - "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", - "GIT_REMOTE_DOWNLOAD_TAGS_NONE", - "GIT_REMOTE_DOWNLOAD_TAGS_ALL" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 685, - "lineto": 703, - "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", - "tdef": "typedef", - "description": " Automatic tag following option", - "comments": "

Lets us select the --tags option to use.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED", - "comments": "

Use the setting from the configuration.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_AUTO", - "comments": "

Ask the server for tags pointing to objects we're already\n downloading.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_NONE", - "comments": "

Don't ask for any tags beyond the refspecs.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REMOTE_DOWNLOAD_TAGS_ALL", - "comments": "

Ask for the all the tags.

\n", - "value": 3 - } - ], - "used": { - "returns": [ - "git_remote_autotag" - ], - "needs": [ - "git_remote_set_autotag", - "git_remote_update_tips" - ] - } - } - ], - [ - "git_remote_callbacks", - { - "decl": [ - "unsigned int version", - "git_transport_message_cb sideband_progress", - "int (*)(git_remote_completion_t, void *) completion", - "git_credential_acquire_cb credentials", - "git_transport_certificate_check_cb certificate_check", - "git_indexer_progress_cb transfer_progress", - "int (*)(const char *, const git_oid *, const git_oid *, void *) update_tips", - "git_packbuilder_progress pack_progress", - "git_push_transfer_progress_cb push_transfer_progress", - "git_push_update_reference_cb push_update_reference", - "git_push_negotiation push_negotiation", - "git_transport_cb transport", - "git_remote_ready_cb remote_ready", - "void * payload", - "git_url_resolve_cb resolve_url" - ], - "type": "struct", - "value": "git_remote_callbacks", - "file": "git2/remote.h", - "line": 546, - "lineto": 647, - "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url", - "tdef": null, - "description": " The callback settings structure", - "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The version " - }, - { - "type": "git_transport_message_cb", - "name": "sideband_progress", - "comments": " Textual progress from the remote. Text send over the\n progress side-band will be passed to this function (this is\n the 'counting objects' output)." - }, - { - "type": "int (*)(git_remote_completion_t, void *)", - "name": "completion", - "comments": "" - }, - { - "type": "git_credential_acquire_cb", - "name": "credentials", - "comments": " This will be called if the remote host requires\n authentication in order to connect to it.\n\n Returning GIT_PASSTHROUGH will make libgit2 behave as\n though this field isn't set." - }, - { - "type": "git_transport_certificate_check_cb", - "name": "certificate_check", - "comments": " If cert verification fails, this will be called to let the\n user make the final decision of whether to allow the\n connection to proceed. Returns 0 to allow the connection\n or a negative value to indicate an error." - }, - { - "type": "git_indexer_progress_cb", - "name": "transfer_progress", - "comments": " During the download of new data, this will be regularly\n called with the current count of progress done by the\n indexer." - }, - { - "type": "int (*)(const char *, const git_oid *, const git_oid *, void *)", - "name": "update_tips", - "comments": "" - }, - { - "type": "git_packbuilder_progress", - "name": "pack_progress", - "comments": " Function to call with progress information during pack\n building. Be aware that this is called inline with pack\n building operations, so performance may be affected." - }, - { - "type": "git_push_transfer_progress_cb", - "name": "push_transfer_progress", - "comments": " Function to call with progress information during the\n upload portion of a push. Be aware that this is called\n inline with pack building operations, so performance may be\n affected." - }, - { - "type": "git_push_update_reference_cb", - "name": "push_update_reference", - "comments": " See documentation of git_push_update_reference_cb" - }, - { - "type": "git_push_negotiation", - "name": "push_negotiation", - "comments": " Called once between the negotiation step and the upload. It\n provides information about what updates will be performed." - }, - { - "type": "git_transport_cb", - "name": "transport", - "comments": " Create the transport to use for this operation. Leave NULL\n to auto-detect." - }, - { - "type": "git_remote_ready_cb", - "name": "remote_ready", - "comments": " Callback when the remote is ready to connect." - }, - { - "type": "void *", - "name": "payload", - "comments": " This will be passed to each of the callbacks in this struct\n as the last parameter." - }, - { - "type": "git_url_resolve_cb", - "name": "resolve_url", - "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead.\n\n This callback is deprecated; users should use\n git_remote_ready_cb and configure the instance URL instead." - } - ], - "used": { - "returns": [], - "needs": [ - "git_remote_connect", - "git_remote_init_callbacks", - "git_remote_prune", - "git_remote_update_tips" - ] - } - } - ], - [ - "git_remote_completion_t", - { - "decl": [ - "GIT_REMOTE_COMPLETION_DOWNLOAD", - "GIT_REMOTE_COMPLETION_INDEXING", - "GIT_REMOTE_COMPLETION_ERROR" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 452, - "lineto": 456, - "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", - "tdef": "typedef", - "description": " Argument to the completion callback which tells it which operation\n finished.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REMOTE_COMPLETION_DOWNLOAD", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REMOTE_COMPLETION_INDEXING", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REMOTE_COMPLETION_ERROR", - "comments": "", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_remote_connect_options", - { - "decl": [ - "unsigned int version", - "git_remote_callbacks callbacks", - "git_proxy_options proxy_opts", - "git_remote_redirect_t follow_redirects", - "git_strarray custom_headers" - ], - "type": "struct", - "value": "git_remote_connect_options", - "file": "git2/remote.h", - "line": 859, - "lineto": 877, - "block": "unsigned int version\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", - "tdef": "typedef", - "description": " Remote creation options structure", - "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_remote_callbacks", - "name": "callbacks", - "comments": " Callbacks to use for this connection " - }, - { - "type": "git_proxy_options", - "name": "proxy_opts", - "comments": " HTTP Proxy settings " - }, - { - "type": "git_remote_redirect_t", - "name": "follow_redirects", - "comments": " Whether to allow off-site redirects. If this is not\n specified, the `http.followRedirects` configuration setting\n will be consulted." - }, - { - "type": "git_strarray", - "name": "custom_headers", - "comments": " Extra HTTP headers to use in this connection " - } - ], - "used": { - "returns": [], - "needs": [ - "git_remote_connect_ext", - "git_remote_connect_options_init" - ] - } - } - ], - [ - "git_remote_create_flags", - { - "decl": [ - "GIT_REMOTE_CREATE_SKIP_INSTEADOF", - "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 71, - "lineto": 77, - "block": "GIT_REMOTE_CREATE_SKIP_INSTEADOF\nGIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", - "tdef": "typedef", - "description": " Remote creation options flags", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REMOTE_CREATE_SKIP_INSTEADOF", - "comments": "

Ignore the repository apply.insteadOf configuration

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REMOTE_CREATE_SKIP_DEFAULT_FETCHSPEC", - "comments": "

Don't build a fetchspec from the name if none is set

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_remote_create_options", - { - "decl": [ - "unsigned int version", - "git_repository * repository", - "const char * name", - "const char * fetchspec", - "unsigned int flags" - ], - "type": "struct", - "value": "git_remote_create_options", - "file": "git2/remote.h", - "line": 86, - "lineto": 106, - "block": "unsigned int version\ngit_repository * repository\nconst char * name\nconst char * fetchspec\nunsigned int flags", - "tdef": "typedef", - "description": " Remote creation options structure", - "comments": "

Initialize with GIT_REMOTE_CREATE_OPTIONS_INIT. Alternatively, you can use git_remote_create_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_repository *", - "name": "repository", - "comments": " The repository that should own the remote.\n Setting this to NULL results in a detached remote." - }, - { - "type": "const char *", - "name": "name", - "comments": " The remote's name.\n Setting this to NULL results in an in-memory/anonymous remote." - }, - { - "type": "const char *", - "name": "fetchspec", - "comments": " The fetchspec the remote should use. " - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " Additional flags for the remote. See git_remote_create_flags. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_remote_create_options_init", - "git_remote_create_with_opts" - ] - } - } - ], - [ - "git_remote_head", - { - "decl": [ - "int local", - "git_oid oid", - "git_oid loid", - "char * name", - "char * symref_target" - ], - "type": "struct", - "value": "git_remote_head", - "file": "git2/net.h", - "line": 40, - "lineto": 50, - "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", - "tdef": null, - "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "local", - "comments": "" - }, - { - "type": "git_oid", - "name": "oid", - "comments": "" - }, - { - "type": "git_oid", - "name": "loid", - "comments": "" - }, - { - "type": "char *", - "name": "name", - "comments": "" - }, - { - "type": "char *", - "name": "symref_target", - "comments": " If the server send a symref mapping for this ref, this will\n point to the target." - } - ], - "used": { - "returns": [], - "needs": [ - "git_headlist_cb", - "git_remote_ls" - ] - } - } - ], - [ - "git_remote_redirect_t", - { - "decl": [ - "GIT_REMOTE_REDIRECT_NONE", - "GIT_REMOTE_REDIRECT_INITIAL", - "GIT_REMOTE_REDIRECT_ALL" - ], - "type": "enum", - "file": "git2/remote.h", - "line": 49, - "lineto": 66, - "block": "GIT_REMOTE_REDIRECT_NONE\nGIT_REMOTE_REDIRECT_INITIAL\nGIT_REMOTE_REDIRECT_ALL", - "tdef": "typedef", - "description": " Remote redirection settings; whether redirects to another host\n are permitted. By default, git will follow a redirect on the\n initial request (`/info/refs`), but not subsequent requests.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REMOTE_REDIRECT_NONE", - "comments": "

Do not follow any off-site redirects at any stage of\n the fetch or push.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REMOTE_REDIRECT_INITIAL", - "comments": "

Allow off-site redirects only upon the initial request.\n This is the default.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REMOTE_REDIRECT_ALL", - "comments": "

Allow redirects at any stage in the fetch or push.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_repository", - { - "decl": "git_repository", - "type": "struct", - "value": "git_repository", - "file": "git2/types.h", - "line": 118, - "lineto": 118, - "tdef": "typedef", - "description": " Representation of an existing git repository,\n including all its object contents", - "comments": "", - "used": { - "returns": [ - "git_blob_owner", - "git_commit_owner", - "git_index_owner", - "git_object_owner", - "git_patch_owner", - "git_reference_owner", - "git_remote_owner", - "git_revwalk_repository", - "git_submodule_owner", - "git_tag_owner", - "git_tree_owner" - ], - "needs": [ - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_from_ref", - "git_annotated_commit_from_revspec", - "git_annotated_commit_lookup", - "git_apply", - "git_apply_to_tree", - "git_attr_add_macro", - "git_attr_cache_flush", - "git_attr_foreach", - "git_attr_foreach_ext", - "git_attr_get", - "git_attr_get_ext", - "git_attr_get_many", - "git_attr_get_many_ext", - "git_blame_file", - "git_blob_create_from_buffer", - "git_blob_create_from_disk", - "git_blob_create_from_stream", - "git_blob_create_from_workdir", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_iterator_new", - "git_branch_lookup", - "git_branch_remote_name", - "git_branch_upstream_merge", - "git_branch_upstream_name", - "git_branch_upstream_remote", - "git_checkout_head", - "git_checkout_index", - "git_checkout_tree", - "git_cherrypick", - "git_cherrypick_commit", - "git_clone", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_v", - "git_commit_create_with_signature", - "git_commit_extract_signature", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_config_add_file_ondisk", - "git_describe_workdir", - "git_diff_commit_as_email", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_filter_list_apply_to_file", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_file", - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any", - "git_ignore_add_rule", - "git_ignore_clear_internal_rules", - "git_ignore_path_is_ignored", - "git_index_write_tree_to", - "git_mailmap_from_repository", - "git_merge", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_merge_base", - "git_merge_base_many", - "git_merge_base_octopus", - "git_merge_bases", - "git_merge_bases_many", - "git_merge_commits", - "git_merge_file_from_index", - "git_merge_trees", - "git_note_commit_create", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_create", - "git_note_default_ref", - "git_note_foreach", - "git_note_iterator_new", - "git_note_read", - "git_note_remove", - "git_object_lookup", - "git_object_lookup_prefix", - "git_packbuilder_new", - "git_pathspec_match_workdir", - "git_rebase_init", - "git_rebase_open", - "git_refdb_new", - "git_refdb_open", - "git_reference_create", - "git_reference_create_matching", - "git_reference_dwim", - "git_reference_ensure_log", - "git_reference_foreach", - "git_reference_foreach_glob", - "git_reference_foreach_name", - "git_reference_has_log", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_list", - "git_reference_lookup", - "git_reference_name_to_id", - "git_reference_remove", - "git_reference_symbolic_create", - "git_reference_symbolic_create_matching", - "git_reflog_delete", - "git_reflog_read", - "git_reflog_rename", - "git_remote_add_fetch", - "git_remote_add_push", - "git_remote_create", - "git_remote_create_anonymous", - "git_remote_create_cb", - "git_remote_create_with_fetchspec", - "git_remote_delete", - "git_remote_list", - "git_remote_lookup", - "git_remote_rename", - "git_remote_set_autotag", - "git_remote_set_pushurl", - "git_remote_set_url", - "git_repository_commondir", - "git_repository_config", - "git_repository_config_snapshot", - "git_repository_create_cb", - "git_repository_detach_head", - "git_repository_fetchhead_foreach", - "git_repository_free", - "git_repository_get_namespace", - "git_repository_hashfile", - "git_repository_head", - "git_repository_head_detached", - "git_repository_head_detached_for_worktree", - "git_repository_head_for_worktree", - "git_repository_head_unborn", - "git_repository_ident", - "git_repository_index", - "git_repository_init", - "git_repository_init_ext", - "git_repository_init_options_init", - "git_repository_is_bare", - "git_repository_is_empty", - "git_repository_is_shallow", - "git_repository_is_worktree", - "git_repository_item_path", - "git_repository_mergehead_foreach", - "git_repository_message", - "git_repository_message_remove", - "git_repository_odb", - "git_repository_oid_type", - "git_repository_open", - "git_repository_open_bare", - "git_repository_open_ext", - "git_repository_open_from_worktree", - "git_repository_path", - "git_repository_refdb", - "git_repository_set_head", - "git_repository_set_head_detached", - "git_repository_set_head_detached_from_annotated", - "git_repository_set_ident", - "git_repository_set_namespace", - "git_repository_set_workdir", - "git_repository_state", - "git_repository_state_cleanup", - "git_repository_workdir", - "git_reset", - "git_reset_default", - "git_reset_from_annotated", - "git_revert", - "git_revert_commit", - "git_revparse", - "git_revparse_ext", - "git_revparse_single", - "git_revwalk_new", - "git_signature_default", - "git_stash_apply", - "git_stash_drop", - "git_stash_foreach", - "git_stash_pop", - "git_stash_save", - "git_stash_save_with_opts", - "git_status_file", - "git_status_foreach", - "git_status_foreach_ext", - "git_status_list_new", - "git_status_should_ignore", - "git_submodule_add_setup", - "git_submodule_clone", - "git_submodule_foreach", - "git_submodule_lookup", - "git_submodule_open", - "git_submodule_repo_init", - "git_submodule_resolve_url", - "git_submodule_set_branch", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_set_ignore", - "git_submodule_set_update", - "git_submodule_set_url", - "git_submodule_status", - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_delete", - "git_tag_foreach", - "git_tag_list", - "git_tag_list_match", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_transaction_new", - "git_tree_create_updated", - "git_tree_entry_to_object", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_treebuilder_new", - "git_worktree_add", - "git_worktree_list", - "git_worktree_lookup", - "git_worktree_open_from_repository" - ] - } - } - ], - [ - "git_repository_init_flag_t", - { - "decl": [ - "GIT_REPOSITORY_INIT_BARE", - "GIT_REPOSITORY_INIT_NO_REINIT", - "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", - "GIT_REPOSITORY_INIT_MKDIR", - "GIT_REPOSITORY_INIT_MKPATH", - "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", - "GIT_REPOSITORY_INIT_RELATIVE_GITLINK" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 235, - "lineto": 281, - "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", - "tdef": "typedef", - "description": " Option flags for `git_repository_init_ext`.", - "comments": "

These flags configure extra behaviors to git_repository_init_ext. In every case, the default behavior is the zero value (i.e. flag is not set). Just OR the flag values together for the flags parameter when initializing a new repo.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_BARE", - "comments": "

Create a bare repository with no working directory.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_NO_REINIT", - "comments": "

Return an GIT_EEXISTS error if the repo_path appears to already be\n an git repository.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_NO_DOTGIT_DIR", - "comments": "

Normally a "/.git/" will be appended to the repo path for\n non-bare repos (if it is not already there), but passing this flag\n prevents that behavior.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_MKDIR", - "comments": "

Make the repo_path (and workdir_path) as needed. Init is always willing\n to create the ".git" directory even without this flag. This flag tells\n init to create the trailing component of the repo and workdir paths\n as needed.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_MKPATH", - "comments": "

Recursively make all components of the repo and workdir paths as\n necessary.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE", - "comments": "

libgit2 normally uses internal templates to initialize a new repo.\n This flags enables external templates, looking the "template_path" from\n the options if set, or the init.templatedir global config if not,\n or falling back on "/usr/share/git-core/templates" if it exists.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_RELATIVE_GITLINK", - "comments": "

If an alternate workdir is specified, use relative paths for the gitdir\n and core.worktree.

\n", - "value": 64 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_repository_init_mode_t", - { - "decl": [ - "GIT_REPOSITORY_INIT_SHARED_UMASK", - "GIT_REPOSITORY_INIT_SHARED_GROUP", - "GIT_REPOSITORY_INIT_SHARED_ALL" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 290, - "lineto": 306, - "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", - "tdef": "typedef", - "description": " Mode options for `git_repository_init_ext`.", - "comments": "

Set the mode field of the git_repository_init_options structure either to the custom mode that you would like, or to one of the defined modes.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_SHARED_UMASK", - "comments": "

Use permissions configured by umask - the default.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_SHARED_GROUP", - "comments": "

Use "--shared=group" behavior, chmod'ing the new repo to be group\n writable and "g+sx" for sticky group assignment.

\n", - "value": 1533 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_INIT_SHARED_ALL", - "comments": "

Use "--shared=all" behavior, adding world readability.

\n", - "value": 1535 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_repository_init_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "uint32_t mode", - "const char * workdir_path", - "const char * description", - "const char * template_path", - "const char * initial_head", - "const char * origin_url" - ], - "type": "struct", - "value": "git_repository_init_options", - "file": "git2/repository.h", - "line": 314, - "lineto": 373, - "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", - "tdef": "typedef", - "description": " Extended options structure for `git_repository_init_ext`.", - "comments": "

This contains extra options for git_repository_init_ext that enable additional initialization features.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " Combination of GIT_REPOSITORY_INIT flags above." - }, - { - "type": "uint32_t", - "name": "mode", - "comments": " Set to one of the standard GIT_REPOSITORY_INIT_SHARED_... constants\n above, or to a custom value that you would like." - }, - { - "type": "const char *", - "name": "workdir_path", - "comments": " The path to the working dir or NULL for default (i.e. repo_path parent\n on non-bare repos). IF THIS IS RELATIVE PATH, IT WILL BE EVALUATED\n RELATIVE TO THE REPO_PATH. If this is not the \"natural\" working\n directory, a .git gitlink file will be created here linking to the\n repo_path." - }, - { - "type": "const char *", - "name": "description", - "comments": " If set, this will be used to initialize the \"description\" file in the\n repository, instead of using the template content." - }, - { - "type": "const char *", - "name": "template_path", - "comments": " When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set, this contains\n the path to use for the template directory. If this is NULL, the config\n or default directory options will be used instead." - }, - { - "type": "const char *", - "name": "initial_head", - "comments": " The name of the head to point HEAD at. If NULL, then this will be\n treated as \"master\" and the HEAD ref will be set to \"refs/heads/master\".\n If this begins with \"refs/\" it will be used verbatim;\n otherwise \"refs/heads/\" will be prefixed." - }, - { - "type": "const char *", - "name": "origin_url", - "comments": " If this is non-NULL, then after the rest of the repository\n initialization is completed, an \"origin\" remote will be added\n pointing to this URL." - } - ], - "used": { - "returns": [], - "needs": [ - "git_repository_init_ext", - "git_repository_init_options_init" - ] - } - } - ], - [ - "git_repository_item_t", - { - "decl": [ - "GIT_REPOSITORY_ITEM_GITDIR", - "GIT_REPOSITORY_ITEM_WORKDIR", - "GIT_REPOSITORY_ITEM_COMMONDIR", - "GIT_REPOSITORY_ITEM_INDEX", - "GIT_REPOSITORY_ITEM_OBJECTS", - "GIT_REPOSITORY_ITEM_REFS", - "GIT_REPOSITORY_ITEM_PACKED_REFS", - "GIT_REPOSITORY_ITEM_REMOTES", - "GIT_REPOSITORY_ITEM_CONFIG", - "GIT_REPOSITORY_ITEM_INFO", - "GIT_REPOSITORY_ITEM_HOOKS", - "GIT_REPOSITORY_ITEM_LOGS", - "GIT_REPOSITORY_ITEM_MODULES", - "GIT_REPOSITORY_ITEM_WORKTREES", - "GIT_REPOSITORY_ITEM__LAST" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 491, - "lineto": 507, - "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM__LAST", - "tdef": "typedef", - "description": " List of items which belong to the git repository layout", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_GITDIR", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_WORKDIR", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_COMMONDIR", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_INDEX", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_OBJECTS", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_REFS", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_PACKED_REFS", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_REMOTES", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_CONFIG", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_INFO", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_HOOKS", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_LOGS", - "comments": "", - "value": 11 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_MODULES", - "comments": "", - "value": 12 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM_WORKTREES", - "comments": "", - "value": 13 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_ITEM__LAST", - "comments": "", - "value": 14 - } - ], - "used": { - "returns": [], - "needs": [ - "git_repository_item_path" - ] - } - } - ], - [ - "git_repository_open_flag_t", - { - "decl": [ - "GIT_REPOSITORY_OPEN_NO_SEARCH", - "GIT_REPOSITORY_OPEN_CROSS_FS", - "GIT_REPOSITORY_OPEN_BARE", - "GIT_REPOSITORY_OPEN_NO_DOTGIT", - "GIT_REPOSITORY_OPEN_FROM_ENV" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 108, - "lineto": 155, - "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", - "tdef": "typedef", - "description": " Option flags for `git_repository_open_ext`.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_NO_SEARCH", - "comments": "

Only open the repository if it can be immediately found in the\n start_path. Do not walk up from the start_path looking at parent\n directories.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_CROSS_FS", - "comments": "

Unless this flag is set, open will not continue searching across\n filesystem boundaries (i.e. when st_dev changes from the stat\n system call). For example, searching in a user's home directory at\n "/home/user/source/" will not return "/.git/" as the found repo if\n "/" is a different filesystem than "/home".

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_BARE", - "comments": "

Open repository as a bare repo regardless of core.bare config, and\n defer loading config file for faster setup.\n Unlike git_repository_open_bare, this can follow gitlinks.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_NO_DOTGIT", - "comments": "

Do not check for a repository by appending /.git to the start_path;\n only open the repository if start_path itself points to the git\n directory.

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_OPEN_FROM_ENV", - "comments": "

Find and open a git repository, respecting the environment variables\n used by the git command-line tools.\n If set, git_repository_open_ext will ignore the other flags and\n the ceiling_dirs argument, and will allow a NULL path to use\n GIT_DIR or search from the current directory.\n The search for a repository will respect $GIT_CEILING_DIRECTORIES and\n $GIT_DISCOVERY_ACROSS_FILESYSTEM. The opened repository will\n respect $GIT_INDEX_FILE, $GIT_NAMESPACE, $GIT_OBJECT_DIRECTORY, and\n $GIT_ALTERNATE_OBJECT_DIRECTORIES.\n In the future, this flag will also cause git_repository_open_ext\n to respect $GIT_WORK_TREE and $GIT_COMMON_DIR; currently,\n git_repository_open_ext with this flag will error out if either\n $GIT_WORK_TREE or $GIT_COMMON_DIR is set.

\n", - "value": 16 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_repository_state_t", - { - "decl": [ - "GIT_REPOSITORY_STATE_NONE", - "GIT_REPOSITORY_STATE_MERGE", - "GIT_REPOSITORY_STATE_REVERT", - "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", - "GIT_REPOSITORY_STATE_CHERRYPICK", - "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", - "GIT_REPOSITORY_STATE_BISECT", - "GIT_REPOSITORY_STATE_REBASE", - "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", - "GIT_REPOSITORY_STATE_REBASE_MERGE", - "GIT_REPOSITORY_STATE_APPLY_MAILBOX", - "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE" - ], - "type": "enum", - "file": "git2/repository.h", - "line": 891, - "lineto": 904, - "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", - "tdef": "typedef", - "description": " Repository state", - "comments": "

These values represent possible states for the repository to be in, based on the current operation which is ongoing.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_MERGE", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REVERT", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REVERT_SEQUENCE", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_CHERRYPICK", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE", - "comments": "", - "value": 5 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_BISECT", - "comments": "", - "value": 6 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REBASE", - "comments": "", - "value": 7 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REBASE_INTERACTIVE", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_REBASE_MERGE", - "comments": "", - "value": 9 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX", - "comments": "", - "value": 10 - }, - { - "type": "int", - "name": "GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", - "comments": "", - "value": 11 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_reset_t", - { - "decl": [ - "GIT_RESET_SOFT", - "GIT_RESET_MIXED", - "GIT_RESET_HARD" - ], - "type": "enum", - "file": "git2/reset.h", - "line": 26, - "lineto": 30, - "block": "GIT_RESET_SOFT\nGIT_RESET_MIXED\nGIT_RESET_HARD", - "tdef": "typedef", - "description": " Kinds of reset operation", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_RESET_SOFT", - "comments": "

Move the head to the given commit

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_RESET_MIXED", - "comments": "

SOFT plus reset index to the commit

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_RESET_HARD", - "comments": "

MIXED plus changes in working tree discarded

\n", - "value": 3 - } - ], - "used": { - "returns": [], - "needs": [ - "git_reset", - "git_reset_from_annotated" - ] - } - } - ], - [ - "git_revert_options", - { - "decl": [ - "unsigned int version", - "unsigned int mainline", - "git_merge_options merge_opts", - "git_checkout_options checkout_opts" - ], - "type": "struct", - "value": "git_revert_options", - "file": "git2/revert.h", - "line": 26, - "lineto": 34, - "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", - "tdef": "typedef", - "description": " Options for revert", - "comments": "", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "unsigned int", - "name": "mainline", - "comments": " For merge commits, the \"mainline\" is treated as the parent. " - }, - { - "type": "git_merge_options", - "name": "merge_opts", - "comments": " Options for the merging " - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " Options for the checkout " - } - ], - "used": { - "returns": [], - "needs": [ - "git_revert", - "git_revert_options_init" - ] - } - } - ], - [ - "git_revspec", - { - "decl": [ - "git_object * from", - "git_object * to", - "unsigned int flags" - ], - "type": "struct", - "value": "git_revspec", - "file": "git2/revparse.h", - "line": 83, - "lineto": 90, - "block": "git_object * from\ngit_object * to\nunsigned int flags", - "tdef": "typedef", - "description": " Git Revision Spec: output of a `git_revparse` operation", - "comments": "", - "fields": [ - { - "type": "git_object *", - "name": "from", - "comments": " The left element of the revspec; must be freed by the user " - }, - { - "type": "git_object *", - "name": "to", - "comments": " The right element of the revspec; must be freed by the user " - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " The intent of the revspec (i.e. `git_revspec_mode_t` flags) " - } - ], - "used": { - "returns": [], - "needs": [ - "git_revparse" - ] - } - } - ], - [ - "git_revspec_t", - { - "decl": [ - "GIT_REVSPEC_SINGLE", - "GIT_REVSPEC_RANGE", - "GIT_REVSPEC_MERGE_BASE" - ], - "type": "enum", - "file": "git2/revparse.h", - "line": 71, - "lineto": 78, - "block": "GIT_REVSPEC_SINGLE\nGIT_REVSPEC_RANGE\nGIT_REVSPEC_MERGE_BASE", - "tdef": "typedef", - "description": " Revparse flags. These indicate the intended behavior of the spec passed to\n git_revparse.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_REVSPEC_SINGLE", - "comments": "

The spec targeted a single object.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_REVSPEC_RANGE", - "comments": "

The spec targeted a range of commits.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_REVSPEC_MERGE_BASE", - "comments": "

The spec used the '...' operator, which invokes special semantics.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_revwalk", - { - "decl": "git_revwalk", - "type": "struct", - "value": "git_revwalk", - "file": "git2/types.h", - "line": 127, - "lineto": 127, - "tdef": "typedef", - "description": " Representation of an in-progress walk through the commits in a repo ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_packbuilder_insert_walk", - "git_revwalk_add_hide_cb", - "git_revwalk_free", - "git_revwalk_hide", - "git_revwalk_hide_glob", - "git_revwalk_hide_head", - "git_revwalk_hide_ref", - "git_revwalk_new", - "git_revwalk_next", - "git_revwalk_push", - "git_revwalk_push_glob", - "git_revwalk_push_head", - "git_revwalk_push_range", - "git_revwalk_push_ref", - "git_revwalk_repository", - "git_revwalk_reset", - "git_revwalk_simplify_first_parent", - "git_revwalk_sorting" - ] - } - } - ], - [ - "git_signature", - { - "decl": [ - "char * name", - "char * email", - "git_time when" - ], - "type": "struct", - "value": "git_signature", - "file": "git2/types.h", - "line": 182, - "lineto": 186, - "block": "char * name\nchar * email\ngit_time when", - "tdef": "typedef", - "description": " An action signature (e.g. for committers, taggers, etc) ", - "comments": "", - "fields": [ - { - "type": "char *", - "name": "name", - "comments": " full name of the author " - }, - { - "type": "char *", - "name": "email", - "comments": " email of the author " - }, - { - "type": "git_time", - "name": "when", - "comments": " time when the action happened " - } - ], - "used": { - "returns": [ - "git_commit_author", - "git_commit_committer", - "git_note_author", - "git_note_committer", - "git_reflog_entry_committer", - "git_tag_tagger" - ], - "needs": [ - "git_commit_amend", - "git_commit_author_with_mailmap", - "git_commit_committer_with_mailmap", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_cb", - "git_commit_create_v", - "git_mailmap_resolve_signature", - "git_note_commit_create", - "git_note_commit_remove", - "git_note_create", - "git_note_remove", - "git_rebase_commit", - "git_rebase_finish", - "git_reflog_append", - "git_signature_default", - "git_signature_dup", - "git_signature_free", - "git_signature_from_buffer", - "git_signature_new", - "git_signature_now", - "git_stash_save", - "git_tag_annotation_create", - "git_tag_create", - "git_transaction_set_symbolic_target", - "git_transaction_set_target" - ] - } - } - ], - [ - "git_smart_service_t", - { - "decl": [ - "GIT_SERVICE_UPLOADPACK_LS", - "GIT_SERVICE_UPLOADPACK", - "GIT_SERVICE_RECEIVEPACK_LS", - "GIT_SERVICE_RECEIVEPACK" - ], - "type": "enum", - "file": "git2/sys/transport.h", - "line": 313, - "lineto": 318, - "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", - "tdef": "typedef", - "description": " Actions that the smart transport can ask a subtransport to perform ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_SERVICE_UPLOADPACK_LS", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SERVICE_UPLOADPACK", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SERVICE_RECEIVEPACK_LS", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_SERVICE_RECEIVEPACK", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_sort_t", - { - "decl": [ - "GIT_SORT_NONE", - "GIT_SORT_TOPOLOGICAL", - "GIT_SORT_TIME", - "GIT_SORT_REVERSE" - ], - "type": "enum", - "file": "git2/revwalk.h", - "line": 26, - "lineto": 53, - "block": "GIT_SORT_NONE\nGIT_SORT_TOPOLOGICAL\nGIT_SORT_TIME\nGIT_SORT_REVERSE", - "tdef": "typedef", - "description": " Flags to specify the sorting which a revwalk should perform.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_SORT_NONE", - "comments": "

Sort the output with the same default method from git: reverse\n chronological order. This is the default sorting for new walkers.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_SORT_TOPOLOGICAL", - "comments": "

Sort the repository contents in topological order (no parents before\n all of its children are shown); this sorting mode can be combined\n with time sorting to produce git's --date-order`.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SORT_TIME", - "comments": "

Sort the repository contents by commit time;\n this sorting mode can be combined with\n topological sorting.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SORT_REVERSE", - "comments": "

Iterate through the repository contents in reverse\n order; this sorting mode can be combined with\n any of the above.

\n", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_stash_apply_flags", - { - "decl": [ - "GIT_STASH_APPLY_DEFAULT", - "GIT_STASH_APPLY_REINSTATE_INDEX" - ], - "type": "enum", - "file": "git2/stash.h", - "line": 129, - "lineto": 136, - "block": "GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX", - "tdef": "typedef", - "description": " Stash application flags. ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STASH_APPLY_DEFAULT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_REINSTATE_INDEX", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_stash_apply_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "git_checkout_options checkout_options", - "git_stash_apply_progress_cb progress_cb", - "void * progress_payload" - ], - "type": "struct", - "value": "git_stash_apply_options", - "file": "git2/stash.h", - "line": 180, - "lineto": 192, - "block": "unsigned int version\nuint32_t flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", - "tdef": "typedef", - "description": " Stash application options structure", - "comments": "

Initialize with GIT_STASH_APPLY_OPTIONS_INIT. Alternatively, you can use git_stash_apply_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " See `git_stash_apply_flags`, above. " - }, - { - "type": "git_checkout_options", - "name": "checkout_options", - "comments": " Options to use when writing files to the working directory. " - }, - { - "type": "git_stash_apply_progress_cb", - "name": "progress_cb", - "comments": " Optional callback to notify the consumer of application progress. " - }, - { - "type": "void *", - "name": "progress_payload", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_stash_apply", - "git_stash_apply_options_init", - "git_stash_pop" - ] - } - } - ], - [ - "git_stash_apply_progress_t", - { - "decl": [ - "GIT_STASH_APPLY_PROGRESS_NONE", - "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", - "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", - "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", - "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", - "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", - "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", - "GIT_STASH_APPLY_PROGRESS_DONE" - ], - "type": "enum", - "file": "git2/stash.h", - "line": 139, - "lineto": 162, - "block": "GIT_STASH_APPLY_PROGRESS_NONE\nGIT_STASH_APPLY_PROGRESS_LOADING_STASH\nGIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX\nGIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED\nGIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED\nGIT_STASH_APPLY_PROGRESS_DONE", - "tdef": "typedef", - "description": " Stash apply progression states ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_NONE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_LOADING_STASH", - "comments": "

Loading the stashed data from the object database.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX", - "comments": "

The stored index is being analyzed.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED", - "comments": "

The modified files are being analyzed.

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED", - "comments": "

The untracked and ignored files are being analyzed.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED", - "comments": "

The untracked files are being written to disk.

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED", - "comments": "

The modified files are being written to disk.

\n", - "value": 6 - }, - { - "type": "int", - "name": "GIT_STASH_APPLY_PROGRESS_DONE", - "comments": "

The stash was applied successfully.

\n", - "value": 7 - } - ], - "used": { - "returns": [], - "needs": [ - "git_stash_apply_progress_cb" - ] - } - } - ], - [ - "git_stash_flags", - { - "decl": [ - "GIT_STASH_DEFAULT", - "GIT_STASH_KEEP_INDEX", - "GIT_STASH_INCLUDE_UNTRACKED", - "GIT_STASH_INCLUDE_IGNORED", - "GIT_STASH_KEEP_ALL" - ], - "type": "enum", - "file": "git2/stash.h", - "line": 25, - "lineto": 53, - "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED\nGIT_STASH_KEEP_ALL", - "tdef": "typedef", - "description": " Stash flags", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STASH_DEFAULT", - "comments": "

No option, default

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STASH_KEEP_INDEX", - "comments": "

All changes already added to the index are left intact in\n the working directory

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STASH_INCLUDE_UNTRACKED", - "comments": "

All untracked files are also stashed and then cleaned up\n from the working directory

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STASH_INCLUDE_IGNORED", - "comments": "

All ignored files are also stashed and then cleaned up from\n the working directory

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STASH_KEEP_ALL", - "comments": "

All changes in the index and working directory are left intact

\n", - "value": 8 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_stash_save_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags", - "const git_signature * stasher", - "const char * message", - "git_strarray paths" - ], - "type": "struct", - "value": "git_stash_save_options", - "file": "git2/stash.h", - "line": 81, - "lineto": 95, - "block": "unsigned int version\nuint32_t flags\nconst git_signature * stasher\nconst char * message\ngit_strarray paths", - "tdef": "typedef", - "description": " Stash save options structure", - "comments": "

Initialize with GIT_STASH_SAVE_OPTIONS_INIT. Alternatively, you can use git_stash_save_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " Flags to control the stashing process. (see GIT_STASH_* above) " - }, - { - "type": "const git_signature *", - "name": "stasher", - "comments": " The identity of the person performing the stashing. " - }, - { - "type": "const char *", - "name": "message", - "comments": " Optional description along with the stashed state. " - }, - { - "type": "git_strarray", - "name": "paths", - "comments": " Optional paths that control which files are stashed. " - } - ], - "used": { - "returns": [], - "needs": [ - "git_stash_save_options_init", - "git_stash_save_with_opts" - ] - } - } - ], - [ - "git_status_entry", - { - "decl": [ - "git_status_t status", - "git_diff_delta * head_to_index", - "git_diff_delta * index_to_workdir" - ], - "type": "struct", - "value": "git_status_entry", - "file": "git2/status.h", - "line": 295, - "lineto": 299, - "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", - "tdef": "typedef", - "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", - "comments": "

The status value provides the status flags for this file.

\n\n

The head_to_index value provides detailed information about the differences between the file in HEAD and the file in the index.

\n\n

The index_to_workdir value provides detailed information about the differences between the file in the index and the file in the working directory.

\n", - "fields": [ - { - "type": "git_status_t", - "name": "status", - "comments": "" - }, - { - "type": "git_diff_delta *", - "name": "head_to_index", - "comments": "" - }, - { - "type": "git_diff_delta *", - "name": "index_to_workdir", - "comments": "" - } - ], - "used": { - "returns": [ - "git_status_byindex" - ], - "needs": [] - } - } - ], - [ - "git_status_list", - { - "decl": "git_status_list", - "type": "struct", - "value": "git_status_list", - "file": "git2/types.h", - "line": 201, - "lineto": 201, - "tdef": "typedef", - "description": " Representation of a status collection ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_status_byindex", - "git_status_list_entrycount", - "git_status_list_free", - "git_status_list_new" - ] - } - } - ], - [ - "git_status_opt_t", - { - "decl": [ - "GIT_STATUS_OPT_INCLUDE_UNTRACKED", - "GIT_STATUS_OPT_INCLUDE_IGNORED", - "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", - "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", - "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", - "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", - "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", - "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", - "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", - "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", - "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", - "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", - "GIT_STATUS_OPT_NO_REFRESH", - "GIT_STATUS_OPT_UPDATE_INDEX", - "GIT_STATUS_OPT_INCLUDE_UNREADABLE", - "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED" - ], - "type": "enum", - "file": "git2/status.h", - "line": 101, - "lineto": 208, - "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", - "tdef": "typedef", - "description": " Flags to control status callbacks", - "comments": "

Calling git_status_foreach() is like calling the extended version with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED, and GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS. Those options are bundled together as GIT_STATUS_OPT_DEFAULTS if you want them as a baseline.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNTRACKED", - "comments": "

Says that callbacks should be made on untracked files.\n These will only be made if the workdir files are included in the status\n "show" option.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_IGNORED", - "comments": "

Says that ignored files get callbacks.\n Again, these callbacks will only be made if the workdir files are\n included in the status "show" option.

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNMODIFIED", - "comments": "

Indicates that callback should be made even on unmodified files.

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_EXCLUDE_SUBMODULES", - "comments": "

Indicates that submodules should be skipped.\n This only applies if there are no pending typechanges to the submodule\n (either from or to another type).

\n", - "value": 8 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS", - "comments": "

Indicates that all files in untracked directories should be included.\n Normally if an entire directory is new, then just the top-level\n directory is included (with a trailing slash on the entry name).\n This flag says to include all of the individual files in the directory\n instead.

\n", - "value": 16 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH", - "comments": "

Indicates that the given path should be treated as a literal path,\n and not as a pathspec pattern.

\n", - "value": 32 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RECURSE_IGNORED_DIRS", - "comments": "

Indicates that the contents of ignored directories should be included\n in the status. This is like doing git ls-files -o -i --exclude-standard\n with core git.

\n", - "value": 64 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX", - "comments": "

Indicates that rename detection should be processed between the head and\n the index and enables the GIT_STATUS_INDEX_RENAMED as a possible status\n flag.

\n", - "value": 128 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR", - "comments": "

Indicates that rename detection should be run between the index and the\n working directory and enabled GIT_STATUS_WT_RENAMED as a possible status\n flag.

\n", - "value": 256 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_SORT_CASE_SENSITIVELY", - "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-sensitive order.

\n", - "value": 512 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY", - "comments": "

Overrides the native case sensitivity for the file system and forces\n the output to be in case-insensitive order.

\n", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_RENAMES_FROM_REWRITES", - "comments": "

Iindicates that rename detection should include rewritten files.

\n", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_NO_REFRESH", - "comments": "

Bypasses the default status behavior of doing a "soft" index reload\n (i.e. reloading the index data if the file on disk has been modified\n outside libgit2).

\n", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_UPDATE_INDEX", - "comments": "

Tells libgit2 to refresh the stat cache in the index for files that are\n unchanged but have out of date stat einformation in the index.\n It will result in less work being done on subsequent calls to get status.\n This is mutually exclusive with the NO_REFRESH option.

\n", - "value": 8192 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE", - "comments": "

Normally files that cannot be opened or read are ignored as\n these are often transient files; this option will return\n unreadable files as GIT_STATUS_WT_UNREADABLE.

\n", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", - "comments": "

Unreadable files will be detected and given the status\n untracked instead of unreadable.

\n", - "value": 32768 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_status_options", - { - "decl": [ - "unsigned int version", - "git_status_show_t show", - "unsigned int flags", - "git_strarray pathspec", - "git_tree * baseline", - "uint16_t rename_threshold" - ], - "type": "struct", - "value": "git_status_options", - "file": "git2/status.h", - "line": 222, - "lineto": 262, - "block": "unsigned int version\ngit_status_show_t show\nunsigned int flags\ngit_strarray pathspec\ngit_tree * baseline\nuint16_t rename_threshold", - "tdef": "typedef", - "description": " Options to control how `git_status_foreach_ext()` will issue callbacks.", - "comments": "

Initialize with GIT_STATUS_OPTIONS_INIT. Alternatively, you can use git_status_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": " The struct version; pass `GIT_STATUS_OPTIONS_VERSION`." - }, - { - "type": "git_status_show_t", - "name": "show", - "comments": " The `show` value is one of the `git_status_show_t` constants that\n control which files to scan and in what order. The default is\n `GIT_STATUS_SHOW_INDEX_AND_WORKDIR`." - }, - { - "type": "unsigned int", - "name": "flags", - "comments": " The `flags` value is an OR'ed combination of the\n `git_status_opt_t` values above. The default is\n `GIT_STATUS_OPT_DEFAULTS`, which matches git's default\n behavior." - }, - { - "type": "git_strarray", - "name": "pathspec", - "comments": " The `pathspec` is an array of path patterns to match (using\n fnmatch-style matching), or just an array of paths to match\n exactly if `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified\n in the flags." - }, - { - "type": "git_tree *", - "name": "baseline", - "comments": " The `baseline` is the tree to be used for comparison to the\n working directory and index; defaults to HEAD." - }, - { - "type": "uint16_t", - "name": "rename_threshold", - "comments": " Threshold above which similar files will be considered renames.\n This is equivalent to the -M option. Defaults to 50." - } - ], - "used": { - "returns": [], - "needs": [ - "git_status_foreach_ext", - "git_status_list_new", - "git_status_options_init" - ] - } - } - ], - [ - "git_status_show_t", - { - "decl": [ - "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", - "GIT_STATUS_SHOW_INDEX_ONLY", - "GIT_STATUS_SHOW_WORKDIR_ONLY" - ], - "type": "enum", - "file": "git2/status.h", - "line": 73, - "lineto": 91, - "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", - "tdef": "typedef", - "description": " Select the files on which to report status.", - "comments": "

With git_status_foreach_ext, this will control which changes get callbacks. With git_status_list_new, these will control which changes are included in the list.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR", - "comments": "

The default. This roughly matches git status --porcelain regarding\n which files are included and in what order.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STATUS_SHOW_INDEX_ONLY", - "comments": "

Only gives status based on HEAD to index comparison, not looking at\n working directory changes.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STATUS_SHOW_WORKDIR_ONLY", - "comments": "

Only gives status based on index to working directory comparison,\n not comparing the index to the HEAD.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_status_t", - { - "decl": [ - "GIT_STATUS_CURRENT", - "GIT_STATUS_INDEX_NEW", - "GIT_STATUS_INDEX_MODIFIED", - "GIT_STATUS_INDEX_DELETED", - "GIT_STATUS_INDEX_RENAMED", - "GIT_STATUS_INDEX_TYPECHANGE", - "GIT_STATUS_WT_NEW", - "GIT_STATUS_WT_MODIFIED", - "GIT_STATUS_WT_DELETED", - "GIT_STATUS_WT_TYPECHANGE", - "GIT_STATUS_WT_RENAMED", - "GIT_STATUS_WT_UNREADABLE", - "GIT_STATUS_IGNORED", - "GIT_STATUS_CONFLICTED" - ], - "type": "enum", - "file": "git2/status.h", - "line": 34, - "lineto": 52, - "block": "GIT_STATUS_CURRENT\nGIT_STATUS_INDEX_NEW\nGIT_STATUS_INDEX_MODIFIED\nGIT_STATUS_INDEX_DELETED\nGIT_STATUS_INDEX_RENAMED\nGIT_STATUS_INDEX_TYPECHANGE\nGIT_STATUS_WT_NEW\nGIT_STATUS_WT_MODIFIED\nGIT_STATUS_WT_DELETED\nGIT_STATUS_WT_TYPECHANGE\nGIT_STATUS_WT_RENAMED\nGIT_STATUS_WT_UNREADABLE\nGIT_STATUS_IGNORED\nGIT_STATUS_CONFLICTED", - "tdef": "typedef", - "description": " Status flags for a single file.", - "comments": "

A combination of these values will be returned to indicate the status of a file. Status compares the working directory, the index, and the current HEAD of the repository. The GIT_STATUS_INDEX set of flags represents the status of file in the index relative to the HEAD, and the GIT_STATUS_WT set of flags represent the status of the file in the working directory relative to the index.

\n", - "fields": [ - { - "type": "int", - "name": "GIT_STATUS_CURRENT", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_NEW", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_MODIFIED", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_DELETED", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_RENAMED", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_STATUS_INDEX_TYPECHANGE", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_NEW", - "comments": "", - "value": 128 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_MODIFIED", - "comments": "", - "value": 256 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_DELETED", - "comments": "", - "value": 512 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_TYPECHANGE", - "comments": "", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_RENAMED", - "comments": "", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_STATUS_WT_UNREADABLE", - "comments": "", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_STATUS_IGNORED", - "comments": "", - "value": 16384 - }, - { - "type": "int", - "name": "GIT_STATUS_CONFLICTED", - "comments": "", - "value": 32768 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_strarray", - { - "decl": [ - "char ** strings", - "size_t count" - ], - "type": "struct", - "value": "git_strarray", - "file": "git2/strarray.h", - "line": 22, - "lineto": 25, - "block": "char ** strings\nsize_t count", - "tdef": "typedef", - "description": " Array of strings ", - "comments": "", - "fields": [ - { - "type": "char **", - "name": "strings", - "comments": "" - }, - { - "type": "size_t", - "name": "count", - "comments": "" - } - ], - "used": { - "returns": [], - "needs": [ - "git_index_add_all", - "git_index_remove_all", - "git_index_update_all", - "git_pathspec_new", - "git_reference_list", - "git_remote_connect", - "git_remote_download", - "git_remote_fetch", - "git_remote_get_fetch_refspecs", - "git_remote_get_push_refspecs", - "git_remote_list", - "git_remote_push", - "git_remote_rename", - "git_remote_upload", - "git_reset_default", - "git_strarray_copy", - "git_strarray_dispose", - "git_strarray_free", - "git_tag_list", - "git_tag_list_match", - "git_worktree_list" - ] - } - } - ], - [ - "git_stream_t", - { - "decl": [ - "GIT_STREAM_STANDARD", - "GIT_STREAM_TLS" - ], - "type": "enum", - "file": "git2/sys/stream.h", - "line": 91, - "lineto": 97, - "block": "GIT_STREAM_STANDARD\nGIT_STREAM_TLS", - "tdef": "typedef", - "description": " The type of stream to register.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_STREAM_STANDARD", - "comments": "

A standard (non-TLS) socket.

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_STREAM_TLS", - "comments": "

A TLS-encrypted socket.

\n", - "value": 2 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_submodule", - { - "decl": "git_submodule", - "type": "struct", - "value": "git_submodule", - "file": "git2/types.h", - "line": 267, - "lineto": 267, - "tdef": "typedef", - "description": " Opaque structure representing a submodule.", - "comments": "", - "used": { - "returns": [ - "git_submodule_fetch_recurse_submodules", - "git_submodule_ignore", - "git_submodule_update_strategy" - ], - "needs": [ - "git_submodule_add_finalize", - "git_submodule_add_setup", - "git_submodule_add_to_index", - "git_submodule_branch", - "git_submodule_cb", - "git_submodule_clone", - "git_submodule_dup", - "git_submodule_fetch_recurse_submodules", - "git_submodule_foreach", - "git_submodule_free", - "git_submodule_head_id", - "git_submodule_ignore", - "git_submodule_index_id", - "git_submodule_init", - "git_submodule_location", - "git_submodule_lookup", - "git_submodule_name", - "git_submodule_open", - "git_submodule_owner", - "git_submodule_path", - "git_submodule_reload", - "git_submodule_repo_init", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_set_ignore", - "git_submodule_set_update", - "git_submodule_status", - "git_submodule_sync", - "git_submodule_update", - "git_submodule_update_options_init", - "git_submodule_update_strategy", - "git_submodule_url", - "git_submodule_wd_id" - ] - } - } - ], - [ - "git_submodule_ignore_t", - { - "decl": [ - "GIT_SUBMODULE_IGNORE_UNSPECIFIED", - "GIT_SUBMODULE_IGNORE_NONE", - "GIT_SUBMODULE_IGNORE_UNTRACKED", - "GIT_SUBMODULE_IGNORE_DIRTY", - "GIT_SUBMODULE_IGNORE_ALL" - ], - "type": "enum", - "file": "git2/types.h", - "line": 331, - "lineto": 338, - "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", - "tdef": "typedef", - "description": " Submodule ignore values", - "comments": "

These values represent settings for the submodule.$name.ignore configuration value which says how deeply to look at the working directory when getting submodule status.

\n\n

You can override this value in memory on a per-submodule basis with git_submodule_set_ignore() and can write the changed value to disk with git_submodule_save(). If you have overwritten the value, you can revert to the on disk value by using GIT_SUBMODULE_IGNORE_RESET.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an untracked file, will mark the submodule as dirty. Ignored files are still ignored, of course. - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes to tracked files, or the index or the HEAD commit will matter. - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory, only considering changes if the HEAD of submodule has moved from the value in the superproject. - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer when we don't want any particular ignore rule to be specified.
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_UNSPECIFIED", - "comments": "

use the submodule's configuration

\n", - "value": -1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_NONE", - "comments": "

any change or untracked == dirty

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_UNTRACKED", - "comments": "

dirty if tracked files change

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_DIRTY", - "comments": "

only dirty if HEAD moved

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_IGNORE_ALL", - "comments": "

never dirty

\n", - "value": 4 - } - ], - "used": { - "returns": [ - "git_submodule_ignore" - ], - "needs": [ - "git_submodule_set_ignore", - "git_submodule_status" - ] - } - } - ], - [ - "git_submodule_recurse_t", - { - "decl": [ - "GIT_SUBMODULE_RECURSE_NO", - "GIT_SUBMODULE_RECURSE_YES", - "GIT_SUBMODULE_RECURSE_ONDEMAND" - ], - "type": "enum", - "file": "git2/types.h", - "line": 350, - "lineto": 354, - "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", - "tdef": "typedef", - "description": " Options for submodule recurse.", - "comments": "

Represent the value of submodule.$name.fetchRecurseSubmodules

\n\n
    \n
  • GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules * GIT_SUBMODULE_RECURSE_YES - recurse into submodules * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when commit not already in local clone
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_RECURSE_NO", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_RECURSE_YES", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_RECURSE_ONDEMAND", - "comments": "", - "value": 2 - } - ], - "used": { - "returns": [ - "git_submodule_fetch_recurse_submodules" - ], - "needs": [ - "git_submodule_set_fetch_recurse_submodules" - ] - } - } - ], - [ - "git_submodule_status_t", - { - "decl": [ - "GIT_SUBMODULE_STATUS_IN_HEAD", - "GIT_SUBMODULE_STATUS_IN_INDEX", - "GIT_SUBMODULE_STATUS_IN_CONFIG", - "GIT_SUBMODULE_STATUS_IN_WD", - "GIT_SUBMODULE_STATUS_INDEX_ADDED", - "GIT_SUBMODULE_STATUS_INDEX_DELETED", - "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", - "GIT_SUBMODULE_STATUS_WD_ADDED", - "GIT_SUBMODULE_STATUS_WD_DELETED", - "GIT_SUBMODULE_STATUS_WD_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", - "GIT_SUBMODULE_STATUS_WD_UNTRACKED" - ], - "type": "enum", - "file": "git2/submodule.h", - "line": 74, - "lineto": 89, - "block": "GIT_SUBMODULE_STATUS_IN_HEAD\nGIT_SUBMODULE_STATUS_IN_INDEX\nGIT_SUBMODULE_STATUS_IN_CONFIG\nGIT_SUBMODULE_STATUS_IN_WD\nGIT_SUBMODULE_STATUS_INDEX_ADDED\nGIT_SUBMODULE_STATUS_INDEX_DELETED\nGIT_SUBMODULE_STATUS_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNINITIALIZED\nGIT_SUBMODULE_STATUS_WD_ADDED\nGIT_SUBMODULE_STATUS_WD_DELETED\nGIT_SUBMODULE_STATUS_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED\nGIT_SUBMODULE_STATUS_WD_WD_MODIFIED\nGIT_SUBMODULE_STATUS_WD_UNTRACKED", - "tdef": "typedef", - "description": " Return codes for submodule status.", - "comments": "

A combination of these flags will be returned to describe the status of a submodule. Depending on the "ignore" property of the submodule, some of the flags may never be returned because they indicate changes that are supposed to be ignored.

\n\n

Submodule info is contained in 4 places: the HEAD tree, the index, config files (both .git/config and .gitmodules), and the working directory. Any or all of those places might be missing information about the submodule depending on what state the repo is in. We consider all four places to build the combination of status flags.

\n\n

There are four values that are not really status, but give basic info about what sources of submodule data are available. These will be returned even if ignore is set to "ALL".

\n\n
    \n
  • IN_HEAD - superproject head contains submodule * IN_INDEX - superproject index contains submodule * IN_CONFIG - superproject gitmodules has submodule * IN_WD - superproject workdir has submodule
  • \n
\n\n

The following values will be returned so long as ignore is not "ALL".

\n\n
    \n
  • INDEX_ADDED - in index, not in head * INDEX_DELETED - in head, not in index * INDEX_MODIFIED - index and head don't match * WD_UNINITIALIZED - workdir contains empty directory * WD_ADDED - in workdir, not index * WD_DELETED - in index, not workdir * WD_MODIFIED - index and workdir head don't match
  • \n
\n\n

The following can only be returned if ignore is "NONE" or "UNTRACKED".

\n\n
    \n
  • WD_INDEX_MODIFIED - submodule workdir index is dirty * WD_WD_MODIFIED - submodule workdir has modified files
  • \n
\n\n

Lastly, the following will only be returned for ignore "NONE".

\n\n
    \n
  • WD_UNTRACKED - wd contains untracked files
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_HEAD", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_INDEX", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_CONFIG", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_IN_WD", - "comments": "", - "value": 8 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_INDEX_ADDED", - "comments": "", - "value": 16 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_INDEX_DELETED", - "comments": "", - "value": 32 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_INDEX_MODIFIED", - "comments": "", - "value": 64 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_UNINITIALIZED", - "comments": "", - "value": 128 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_ADDED", - "comments": "", - "value": 256 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_DELETED", - "comments": "", - "value": 512 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_MODIFIED", - "comments": "", - "value": 1024 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED", - "comments": "", - "value": 2048 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_WD_MODIFIED", - "comments": "", - "value": 4096 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_STATUS_WD_UNTRACKED", - "comments": "", - "value": 8192 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_submodule_update_options", - { - "decl": [ - "unsigned int version", - "git_checkout_options checkout_opts", - "git_fetch_options fetch_opts", - "int allow_fetch" - ], - "type": "struct", - "value": "git_submodule_update_options", - "file": "git2/submodule.h", - "line": 128, - "lineto": 153, - "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", - "tdef": "typedef", - "description": " Submodule update options structure", - "comments": "

Initialize with GIT_SUBMODULE_UPDATE_OPTIONS_INIT. Alternatively, you can use git_submodule_update_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "git_checkout_options", - "name": "checkout_opts", - "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory." - }, - { - "type": "git_fetch_options", - "name": "fetch_opts", - "comments": " Options which control the fetch, including callbacks.\n\n The callbacks to use for reporting fetch progress, and for acquiring\n credentials in the event they are needed." - }, - { - "type": "int", - "name": "allow_fetch", - "comments": " Allow fetching from the submodule's default remote if the target\n commit isn't found. Enabled by default." - } - ], - "used": { - "returns": [], - "needs": [ - "git_submodule_clone", - "git_submodule_update", - "git_submodule_update_options_init" - ] - } - } - ], - [ - "git_submodule_update_t", - { - "decl": [ - "GIT_SUBMODULE_UPDATE_CHECKOUT", - "GIT_SUBMODULE_UPDATE_REBASE", - "GIT_SUBMODULE_UPDATE_MERGE", - "GIT_SUBMODULE_UPDATE_NONE", - "GIT_SUBMODULE_UPDATE_DEFAULT" - ], - "type": "enum", - "file": "git2/types.h", - "line": 295, - "lineto": 302, - "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", - "tdef": "typedef", - "description": " Submodule update values", - "comments": "

These values represent settings for the submodule.$name.update configuration value which says how to handle git submodule update for this submodule. The value is usually set in the ".gitmodules" file and copied to ".git/config" when the submodule is initialized.

\n\n

You can override this setting on a per-submodule basis with git_submodule_set_update() and write the changed value to disk using git_submodule_save(). If you have overwritten the value, you can revert it by passing GIT_SUBMODULE_UPDATE_RESET to the set function.

\n\n

The values are:

\n\n
    \n
  • GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is updated, checkout the new detached HEAD to the submodule directory. - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked out branch onto the commit from the superproject. - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the superproject into the current checkout out branch of the submodule. - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when the commit in the superproject is updated. - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer when we don't want any particular update rule to be specified.
  • \n
\n", - "fields": [ - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_CHECKOUT", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_REBASE", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_MERGE", - "comments": "", - "value": 3 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_NONE", - "comments": "", - "value": 4 - }, - { - "type": "int", - "name": "GIT_SUBMODULE_UPDATE_DEFAULT", - "comments": "", - "value": 0 - } - ], - "used": { - "returns": [ - "git_submodule_update_strategy" - ], - "needs": [ - "git_submodule_set_update" - ] - } - } - ], - [ - "git_tag", - { - "decl": "git_tag", - "type": "struct", - "value": "git_tag", - "file": "git2/types.h", - "line": 130, - "lineto": 130, - "tdef": "typedef", - "description": " Parsed representation of a tag object. ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_tag_dup", - "git_tag_foreach", - "git_tag_free", - "git_tag_id", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_tag_message", - "git_tag_name", - "git_tag_owner", - "git_tag_peel", - "git_tag_tagger", - "git_tag_target", - "git_tag_target_id", - "git_tag_target_type" - ] - } - } - ], - [ - "git_time", - { - "decl": [ - "git_time_t time", - "int offset", - "char sign" - ], - "type": "struct", - "value": "git_time", - "file": "git2/types.h", - "line": 175, - "lineto": 179, - "block": "git_time_t time\nint offset\nchar sign", - "tdef": "typedef", - "description": " Time in a signature ", - "comments": "", - "fields": [ - { - "type": "git_time_t", - "name": "time", - "comments": " time in seconds from epoch " - }, - { - "type": "int", - "name": "offset", - "comments": " timezone offset, in minutes " - }, - { - "type": "char", - "name": "sign", - "comments": " indicator for questionable '-0000' offsets in signature " - } - ], - "used": { - "returns": [ - "git_commit_time" - ], - "needs": [ - "git_signature_new" - ] - } - } - ], - [ - "git_trace_level_t", - { - "decl": [ - "GIT_TRACE_NONE", - "GIT_TRACE_FATAL", - "GIT_TRACE_ERROR", - "GIT_TRACE_WARN", - "GIT_TRACE_INFO", - "GIT_TRACE_DEBUG", - "GIT_TRACE_TRACE" - ], - "type": "enum", - "file": "git2/trace.h", - "line": 26, - "lineto": 47, - "block": "GIT_TRACE_NONE\nGIT_TRACE_FATAL\nGIT_TRACE_ERROR\nGIT_TRACE_WARN\nGIT_TRACE_INFO\nGIT_TRACE_DEBUG\nGIT_TRACE_TRACE", - "tdef": "typedef", - "description": " Available tracing levels. When tracing is set to a particular level,\n callers will be provided tracing at the given level and all lower levels.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_TRACE_NONE", - "comments": "

No tracing will be performed.

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_TRACE_FATAL", - "comments": "

Severe errors that may impact the program's execution

\n", - "value": 1 - }, - { - "type": "int", - "name": "GIT_TRACE_ERROR", - "comments": "

Errors that do not impact the program's execution

\n", - "value": 2 - }, - { - "type": "int", - "name": "GIT_TRACE_WARN", - "comments": "

Warnings that suggest abnormal data

\n", - "value": 3 - }, - { - "type": "int", - "name": "GIT_TRACE_INFO", - "comments": "

Informational messages about program execution

\n", - "value": 4 - }, - { - "type": "int", - "name": "GIT_TRACE_DEBUG", - "comments": "

Detailed data that allows for debugging

\n", - "value": 5 - }, - { - "type": "int", - "name": "GIT_TRACE_TRACE", - "comments": "

Exceptionally detailed debugging data

\n", - "value": 6 - } - ], - "used": { - "returns": [], - "needs": [ - "git_trace_cb", - "git_trace_set" - ] - } - } - ], - [ - "git_transaction", - { - "decl": "git_transaction", - "type": "struct", - "value": "git_transaction", - "file": "git2/types.h", - "line": 195, - "lineto": 195, - "tdef": "typedef", - "description": " Transactional interface to references ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_config_lock", - "git_transaction_commit", - "git_transaction_free", - "git_transaction_lock_ref", - "git_transaction_new", - "git_transaction_remove", - "git_transaction_set_reflog", - "git_transaction_set_symbolic_target", - "git_transaction_set_target" - ] - } - } - ], - [ - "git_transport", - { - "decl": "git_transport", - "type": "struct", - "value": "git_transport", - "file": "git2/types.h", - "line": 247, - "lineto": 247, - "tdef": "typedef", - "description": " Interface which represents a transport to communicate with a\n remote.", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_transport_cb" - ] - } - } - ], - [ - "git_tree", - { - "decl": "git_tree", - "type": "struct", - "value": "git_tree", - "file": "git2/types.h", - "line": 142, - "lineto": 142, - "tdef": "typedef", - "description": " Representation of a tree object. ", - "comments": "", - "used": { - "returns": [ - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_treebuilder_get" - ], - "needs": [ - "git_apply_to_tree", - "git_commit_amend", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_cb", - "git_commit_create_v", - "git_commit_tree", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index", - "git_index_read_tree", - "git_merge_trees", - "git_pathspec_match_tree", - "git_tree_create_updated", - "git_tree_dup", - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_tree_entry_bypath", - "git_tree_entry_cmp", - "git_tree_entry_dup", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_free", - "git_tree_entry_id", - "git_tree_entry_name", - "git_tree_entry_to_object", - "git_tree_entry_type", - "git_tree_entrycount", - "git_tree_free", - "git_tree_id", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_tree_owner", - "git_tree_walk", - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_filter", - "git_treebuilder_filter_cb", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_new", - "git_treebuilder_remove", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer", - "git_treewalk_cb" - ] - } - } - ], - [ - "git_tree_entry", - { - "decl": "git_tree_entry", - "type": "struct", - "value": "git_tree_entry", - "file": "git2/types.h", - "line": 139, - "lineto": 139, - "tdef": "typedef", - "description": " Representation of each one of the entries in a tree object. ", - "comments": "", - "used": { - "returns": [ - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_treebuilder_get" - ], - "needs": [ - "git_tree_entry_bypath", - "git_tree_entry_cmp", - "git_tree_entry_dup", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_free", - "git_tree_entry_id", - "git_tree_entry_name", - "git_tree_entry_to_object", - "git_tree_entry_type", - "git_treebuilder_filter_cb", - "git_treebuilder_insert", - "git_treewalk_cb" - ] - } - } - ], - [ - "git_tree_update", - { - "decl": [ - "git_tree_update_t action", - "git_oid id", - "git_filemode_t filemode", - "const char * path" - ], - "type": "struct", - "value": "git_tree_update", - "file": "git2/tree.h", - "line": 438, - "lineto": 447, - "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", - "tdef": "typedef", - "description": " An action to perform during the update of a tree", - "comments": "", - "fields": [ - { - "type": "git_tree_update_t", - "name": "action", - "comments": " Update action. If it's an removal, only the path is looked at " - }, - { - "type": "git_oid", - "name": "id", - "comments": " The entry's id " - }, - { - "type": "git_filemode_t", - "name": "filemode", - "comments": " The filemode/kind of object " - }, - { - "type": "const char *", - "name": "path", - "comments": " The full path from the root tree " - } - ], - "used": { - "returns": [], - "needs": [ - "git_tree_create_updated" - ] - } - } - ], - [ - "git_tree_update_t", - { - "decl": [ - "GIT_TREE_UPDATE_UPSERT", - "GIT_TREE_UPDATE_REMOVE" - ], - "type": "enum", - "file": "git2/tree.h", - "line": 428, - "lineto": 433, - "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", - "tdef": "typedef", - "description": " The kind of update to perform", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_TREE_UPDATE_UPSERT", - "comments": "

Update or insert an entry at the specified path

\n", - "value": 0 - }, - { - "type": "int", - "name": "GIT_TREE_UPDATE_REMOVE", - "comments": "

Remove an entry from the specified path

\n", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_treebuilder", - { - "decl": "git_treebuilder", - "type": "struct", - "value": "git_treebuilder", - "file": "git2/types.h", - "line": 145, - "lineto": 145, - "tdef": "typedef", - "description": " Constructor for in-memory trees ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_filter", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_new", - "git_treebuilder_remove", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer" - ] - } - } - ], - [ - "git_treewalk_mode", - { - "decl": [ - "GIT_TREEWALK_PRE", - "GIT_TREEWALK_POST" - ], - "type": "enum", - "file": "git2/tree.h", - "line": 387, - "lineto": 390, - "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", - "tdef": "typedef", - "description": " Tree traversal modes ", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_TREEWALK_PRE", - "comments": "", - "value": 0 - }, - { - "type": "int", - "name": "GIT_TREEWALK_POST", - "comments": "", - "value": 1 - } - ], - "used": { - "returns": [], - "needs": [ - "git_tree_walk" - ] - } - } - ], - [ - "git_worktree", - { - "decl": "git_worktree", - "type": "struct", - "value": "git_worktree", - "file": "git2/types.h", - "line": 121, - "lineto": 121, - "tdef": "typedef", - "description": " Representation of a working tree ", - "comments": "", - "used": { - "returns": [], - "needs": [ - "git_repository_open_from_worktree", - "git_worktree_add", - "git_worktree_add_options_init", - "git_worktree_free", - "git_worktree_is_locked", - "git_worktree_is_prunable", - "git_worktree_lock", - "git_worktree_lookup", - "git_worktree_name", - "git_worktree_open_from_repository", - "git_worktree_path", - "git_worktree_prune", - "git_worktree_prune_options_init", - "git_worktree_unlock", - "git_worktree_validate" - ] - } - } - ], - [ - "git_worktree_prune_options", - { - "decl": [ - "unsigned int version", - "uint32_t flags" - ], - "type": "struct", - "value": "git_worktree_prune_options", - "file": "git2/worktree.h", - "line": 204, - "lineto": 209, - "block": "unsigned int version\nuint32_t flags", - "tdef": "typedef", - "description": " Worktree prune options structure", - "comments": "

Initialize with GIT_WORKTREE_PRUNE_OPTIONS_INIT. Alternatively, you can use git_worktree_prune_options_init.

\n", - "fields": [ - { - "type": "unsigned int", - "name": "version", - "comments": "" - }, - { - "type": "uint32_t", - "name": "flags", - "comments": " A combination of `git_worktree_prune_t` " - } - ], - "used": { - "returns": [], - "needs": [ - "git_worktree_is_prunable", - "git_worktree_prune", - "git_worktree_prune_options_init" - ] - } - } - ], - [ - "git_worktree_prune_t", - { - "decl": [ - "GIT_WORKTREE_PRUNE_VALID", - "GIT_WORKTREE_PRUNE_LOCKED", - "GIT_WORKTREE_PRUNE_WORKING_TREE" - ], - "type": "enum", - "file": "git2/worktree.h", - "line": 188, - "lineto": 195, - "block": "GIT_WORKTREE_PRUNE_VALID\nGIT_WORKTREE_PRUNE_LOCKED\nGIT_WORKTREE_PRUNE_WORKING_TREE", - "tdef": "typedef", - "description": " Flags which can be passed to git_worktree_prune to alter its\n behavior.", - "comments": "", - "fields": [ - { - "type": "int", - "name": "GIT_WORKTREE_PRUNE_VALID", - "comments": "", - "value": 1 - }, - { - "type": "int", - "name": "GIT_WORKTREE_PRUNE_LOCKED", - "comments": "", - "value": 2 - }, - { - "type": "int", - "name": "GIT_WORKTREE_PRUNE_WORKING_TREE", - "comments": "", - "value": 4 - } - ], - "used": { - "returns": [], - "needs": [] - } - } - ], - [ - "git_writestream", - { - "decl": [ - "int (*)(git_writestream *, const char *, size_t) write", - "int (*)(git_writestream *) close", - "void (*)(git_writestream *) free" - ], - "type": "struct", - "value": "git_writestream", - "file": "git2/types.h", - "line": 359, - "lineto": 363, - "tdef": null, - "description": " A type to write in a streaming fashion, for example, for filters. ", - "comments": "", - "fields": [ - { - "type": "int (*)(git_writestream *, const char *, size_t)", - "name": "write", - "comments": "" - }, - { - "type": "int (*)(git_writestream *)", - "name": "close", - "comments": "" - }, - { - "type": "void (*)(git_writestream *)", - "name": "free", - "comments": "" - } - ], - "block": "int (*)(git_writestream *, const char *, size_t) write\nint (*)(git_writestream *) close\nvoid (*)(git_writestream *) free", - "used": { - "returns": [], - "needs": [ - "git_blob_create_from_stream", - "git_blob_create_from_stream_commit", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] - } - } - ] + } + ] + ], + "prefix": "include", + "groups": [ + [ + "annotated", + [ + "git_annotated_commit_free", + "git_annotated_commit_from_fetchhead", + "git_annotated_commit_from_ref", + "git_annotated_commit_from_revspec", + "git_annotated_commit_id", + "git_annotated_commit_lookup", + "git_annotated_commit_ref" + ] ], - "prefix": "include", - "groups": [ - [ - "annotated", - [ - "git_annotated_commit_free", - "git_annotated_commit_from_fetchhead", - "git_annotated_commit_from_ref", - "git_annotated_commit_from_revspec", - "git_annotated_commit_id", - "git_annotated_commit_lookup", - "git_annotated_commit_ref" - ] - ], - [ - "apply", - [ - "git_apply", - "git_apply_options_init", - "git_apply_to_tree" - ] - ], - [ - "attr", - [ - "git_attr_add_macro", - "git_attr_cache_flush", - "git_attr_foreach", - "git_attr_foreach_ext", - "git_attr_get", - "git_attr_get_ext", - "git_attr_get_many", - "git_attr_get_many_ext", - "git_attr_value" - ] - ], - [ - "blame", - [ - "git_blame_buffer", - "git_blame_file", - "git_blame_free", - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline", - "git_blame_get_hunk_count", - "git_blame_init_options", - "git_blame_options_init" - ] - ], - [ - "blob", - [ - "git_blob_create_from_buffer", - "git_blob_create_from_disk", - "git_blob_create_from_stream", - "git_blob_create_from_stream_commit", - "git_blob_create_from_workdir", - "git_blob_data_is_binary", - "git_blob_dup", - "git_blob_filter", - "git_blob_filter_options_init", - "git_blob_filtered_content", - "git_blob_free", - "git_blob_id", - "git_blob_is_binary", - "git_blob_lookup", - "git_blob_lookup_prefix", - "git_blob_owner", - "git_blob_rawcontent", - "git_blob_rawsize" - ] - ], - [ - "branch", - [ - "git_branch_create", - "git_branch_create_from_annotated", - "git_branch_delete", - "git_branch_is_checked_out", - "git_branch_is_head", - "git_branch_iterator_free", - "git_branch_iterator_new", - "git_branch_lookup", - "git_branch_move", - "git_branch_name", - "git_branch_name_is_valid", - "git_branch_next", - "git_branch_remote_name", - "git_branch_set_upstream", - "git_branch_upstream", - "git_branch_upstream_merge", - "git_branch_upstream_name", - "git_branch_upstream_remote" - ] - ], - [ - "buf", - [ - "git_buf_contains_nul", - "git_buf_dispose", - "git_buf_free", - "git_buf_grow", - "git_buf_is_binary", - "git_buf_set" - ] - ], - [ - "checkout", - [ - "git_checkout_head", - "git_checkout_index", - "git_checkout_options_init", - "git_checkout_tree" - ] - ], - [ - "cherrypick", - [ - "git_cherrypick", - "git_cherrypick_commit", - "git_cherrypick_options_init" - ] - ], - [ - "clone", - [ - "git_clone", - "git_clone_options_init" - ] - ], - [ - "commit", - [ - "git_commit_amend", - "git_commit_author", - "git_commit_author_with_mailmap", - "git_commit_body", - "git_commit_committer", - "git_commit_committer_with_mailmap", - "git_commit_create", - "git_commit_create_buffer", - "git_commit_create_v", - "git_commit_create_with_signature", - "git_commit_dup", - "git_commit_extract_signature", - "git_commit_free", - "git_commit_header_field", - "git_commit_id", - "git_commit_lookup", - "git_commit_lookup_prefix", - "git_commit_message", - "git_commit_message_encoding", - "git_commit_message_raw", - "git_commit_nth_gen_ancestor", - "git_commit_owner", - "git_commit_parent", - "git_commit_parent_id", - "git_commit_parentcount", - "git_commit_raw_header", - "git_commit_summary", - "git_commit_time", - "git_commit_time_offset", - "git_commit_tree", - "git_commit_tree_id" - ] - ], - [ - "config", - [ - "git_config_add_file_ondisk", - "git_config_backend_foreach_match", - "git_config_delete_entry", - "git_config_delete_multivar", - "git_config_entry_free", - "git_config_find_global", - "git_config_find_programdata", - "git_config_find_system", - "git_config_find_xdg", - "git_config_foreach", - "git_config_foreach_match", - "git_config_free", - "git_config_get_bool", - "git_config_get_entry", - "git_config_get_int32", - "git_config_get_int64", - "git_config_get_mapped", - "git_config_get_multivar_foreach", - "git_config_get_path", - "git_config_get_string", - "git_config_get_string_buf", - "git_config_iterator_free", - "git_config_iterator_glob_new", - "git_config_iterator_new", - "git_config_lock", - "git_config_lookup_map_value", - "git_config_multivar_iterator_new", - "git_config_new", - "git_config_next", - "git_config_open_default", - "git_config_open_global", - "git_config_open_level", - "git_config_open_ondisk", - "git_config_parse_bool", - "git_config_parse_int32", - "git_config_parse_int64", - "git_config_parse_path", - "git_config_set_bool", - "git_config_set_int32", - "git_config_set_int64", - "git_config_set_multivar", - "git_config_set_string", - "git_config_snapshot" - ] - ], - [ - "credential", - [ - "git_credential_default_new", - "git_credential_free", - "git_credential_get_username", - "git_credential_has_username", - "git_credential_ssh_custom_new", - "git_credential_ssh_interactive_new", - "git_credential_ssh_key_from_agent", - "git_credential_ssh_key_memory_new", - "git_credential_ssh_key_new", - "git_credential_username_new", - "git_credential_userpass", - "git_credential_userpass_plaintext_new" - ] - ], - [ - "describe", - [ - "git_describe_commit", - "git_describe_format", - "git_describe_format_options_init", - "git_describe_options_init", - "git_describe_result_free", - "git_describe_workdir" - ] - ], - [ - "diff", - [ - "git_diff_blob_to_buffer", - "git_diff_blobs", - "git_diff_buffers", - "git_diff_commit_as_email", - "git_diff_find_options_init", - "git_diff_find_similar", - "git_diff_foreach", - "git_diff_format_email", - "git_diff_format_email_options_init", - "git_diff_free", - "git_diff_from_buffer", - "git_diff_get_delta", - "git_diff_get_stats", - "git_diff_index_to_index", - "git_diff_index_to_workdir", - "git_diff_is_sorted_icase", - "git_diff_merge", - "git_diff_num_deltas", - "git_diff_num_deltas_of_type", - "git_diff_options_init", - "git_diff_patchid", - "git_diff_patchid_options_init", - "git_diff_print", - "git_diff_stats_deletions", - "git_diff_stats_files_changed", - "git_diff_stats_free", - "git_diff_stats_insertions", - "git_diff_stats_to_buf", - "git_diff_status_char", - "git_diff_to_buf", - "git_diff_tree_to_index", - "git_diff_tree_to_tree", - "git_diff_tree_to_workdir", - "git_diff_tree_to_workdir_with_index" - ] - ], - [ - "error", - [ - "git_error_clear", - "git_error_last", - "git_error_set", - "git_error_set_oom", - "git_error_set_str" - ] - ], - [ - "fetch", - [ - "git_fetch_options_init" - ] - ], - [ - "filter", - [ - "git_filter_list_apply_to_blob", - "git_filter_list_apply_to_buffer", - "git_filter_list_apply_to_data", - "git_filter_list_apply_to_file", - "git_filter_list_contains", - "git_filter_list_free", - "git_filter_list_load", - "git_filter_list_load_ext", - "git_filter_list_stream_blob", - "git_filter_list_stream_buffer", - "git_filter_list_stream_data", - "git_filter_list_stream_file" - ] - ], - [ - "giterr", - [ - "giterr_clear", - "giterr_last", - "giterr_set_oom", - "giterr_set_str" - ] - ], - [ - "graph", - [ - "git_graph_ahead_behind", - "git_graph_descendant_of", - "git_graph_reachable_from_any" - ] - ], - [ - "ignore", - [ - "git_ignore_add_rule", - "git_ignore_clear_internal_rules", - "git_ignore_path_is_ignored" - ] - ], - [ - "index", - [ - "git_index_add", - "git_index_add_all", - "git_index_add_bypath", - "git_index_add_from_buffer", - "git_index_caps", - "git_index_checksum", - "git_index_clear", - "git_index_conflict_add", - "git_index_conflict_cleanup", - "git_index_conflict_get", - "git_index_conflict_iterator_free", - "git_index_conflict_iterator_new", - "git_index_conflict_next", - "git_index_conflict_remove", - "git_index_entry_is_conflict", - "git_index_entry_stage", - "git_index_entrycount", - "git_index_find", - "git_index_find_prefix", - "git_index_free", - "git_index_get_byindex", - "git_index_get_bypath", - "git_index_has_conflicts", - "git_index_iterator_free", - "git_index_iterator_new", - "git_index_iterator_next", - "git_index_owner", - "git_index_path", - "git_index_read", - "git_index_read_tree", - "git_index_remove", - "git_index_remove_all", - "git_index_remove_bypath", - "git_index_remove_directory", - "git_index_set_caps", - "git_index_set_version", - "git_index_update_all", - "git_index_version", - "git_index_write", - "git_index_write_tree", - "git_index_write_tree_to" - ] - ], - [ - "indexer", - [ - "git_indexer_append", - "git_indexer_commit", - "git_indexer_free", - "git_indexer_hash", - "git_indexer_name", - "git_indexer_new", - "git_indexer_options_init" - ] - ], - [ - "libgit2", - [ - "git_libgit2_features", - "git_libgit2_init", - "git_libgit2_opts", - "git_libgit2_prerelease", - "git_libgit2_shutdown", - "git_libgit2_version" - ] - ], - [ - "mailmap", - [ - "git_mailmap_add_entry", - "git_mailmap_free", - "git_mailmap_from_buffer", - "git_mailmap_from_repository", - "git_mailmap_new", - "git_mailmap_resolve", - "git_mailmap_resolve_signature" - ] - ], - [ - "merge", - [ - "git_merge", - "git_merge_analysis", - "git_merge_analysis_for_ref", - "git_merge_base", - "git_merge_base_many", - "git_merge_base_octopus", - "git_merge_bases", - "git_merge_bases_many", - "git_merge_commits", - "git_merge_file", - "git_merge_file_from_index", - "git_merge_file_input_init", - "git_merge_file_options_init", - "git_merge_file_result_free", - "git_merge_options_init", - "git_merge_trees" - ] - ], - [ - "message", - [ - "git_message_prettify", - "git_message_trailer_array_free", - "git_message_trailers" - ] - ], - [ - "note", - [ - "git_note_author", - "git_note_commit_create", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_committer", - "git_note_create", - "git_note_default_ref", - "git_note_foreach", - "git_note_free", - "git_note_id", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_message", - "git_note_next", - "git_note_read", - "git_note_remove" - ] - ], - [ - "object", - [ - "git_object__size", - "git_object_dup", - "git_object_free", - "git_object_id", - "git_object_lookup", - "git_object_lookup_bypath", - "git_object_lookup_prefix", - "git_object_owner", - "git_object_peel", - "git_object_rawcontent_is_valid", - "git_object_short_id", - "git_object_string2type", - "git_object_type", - "git_object_type2string", - "git_object_typeisloose" - ] - ], - [ - "odb", - [ - "git_odb_add_alternate", - "git_odb_add_backend", - "git_odb_add_disk_alternate", - "git_odb_exists", - "git_odb_exists_ext", - "git_odb_exists_prefix", - "git_odb_expand_ids", - "git_odb_foreach", - "git_odb_free", - "git_odb_get_backend", - "git_odb_num_backends", - "git_odb_object_data", - "git_odb_object_dup", - "git_odb_object_free", - "git_odb_object_id", - "git_odb_object_size", - "git_odb_object_type", - "git_odb_open_rstream", - "git_odb_open_wstream", - "git_odb_read", - "git_odb_read_header", - "git_odb_read_prefix", - "git_odb_refresh", - "git_odb_set_commit_graph", - "git_odb_stream_finalize_write", - "git_odb_stream_free", - "git_odb_stream_read", - "git_odb_stream_write", - "git_odb_write", - "git_odb_write_multi_pack_index", - "git_odb_write_pack" - ] - ], - [ - "oid", - [ - "git_oid_cmp", - "git_oid_cpy", - "git_oid_equal", - "git_oid_fmt", - "git_oid_is_zero", - "git_oid_ncmp", - "git_oid_nfmt", - "git_oid_pathfmt", - "git_oid_shorten_add", - "git_oid_shorten_free", - "git_oid_shorten_new", - "git_oid_strcmp", - "git_oid_streq", - "git_oid_tostr", - "git_oid_tostr_s" - ] - ], - [ - "oidarray", - [ - "git_oidarray_dispose", - "git_oidarray_free" - ] - ], - [ - "packbuilder", - [ - "git_packbuilder_foreach", - "git_packbuilder_free", - "git_packbuilder_hash", - "git_packbuilder_insert", - "git_packbuilder_insert_commit", - "git_packbuilder_insert_recur", - "git_packbuilder_insert_tree", - "git_packbuilder_insert_walk", - "git_packbuilder_name", - "git_packbuilder_new", - "git_packbuilder_object_count", - "git_packbuilder_set_callbacks", - "git_packbuilder_set_threads", - "git_packbuilder_write", - "git_packbuilder_write_buf", - "git_packbuilder_written" - ] - ], - [ - "patch", - [ - "git_patch_free", - "git_patch_from_blob_and_buffer", - "git_patch_from_blobs", - "git_patch_from_buffers", - "git_patch_from_diff", - "git_patch_get_delta", - "git_patch_get_hunk", - "git_patch_get_line_in_hunk", - "git_patch_line_stats", - "git_patch_num_hunks", - "git_patch_num_lines_in_hunk", - "git_patch_owner", - "git_patch_print", - "git_patch_size", - "git_patch_to_buf" - ] - ], - [ - "pathspec", - [ - "git_pathspec_free", - "git_pathspec_match_diff", - "git_pathspec_match_index", - "git_pathspec_match_list_diff_entry", - "git_pathspec_match_list_entry", - "git_pathspec_match_list_entrycount", - "git_pathspec_match_list_failed_entry", - "git_pathspec_match_list_failed_entrycount", - "git_pathspec_match_list_free", - "git_pathspec_match_tree", - "git_pathspec_match_workdir", - "git_pathspec_matches_path", - "git_pathspec_new" - ] - ], - [ - "proxy", - [ - "git_proxy_options_init" - ] - ], - [ - "push", - [ - "git_push_options_init" - ] - ], - [ - "rebase", - [ - "git_rebase_abort", - "git_rebase_commit", - "git_rebase_finish", - "git_rebase_free", - "git_rebase_init", - "git_rebase_inmemory_index", - "git_rebase_next", - "git_rebase_onto_id", - "git_rebase_onto_name", - "git_rebase_open", - "git_rebase_operation_byindex", - "git_rebase_operation_current", - "git_rebase_operation_entrycount", - "git_rebase_options_init", - "git_rebase_orig_head_id", - "git_rebase_orig_head_name" - ] - ], - [ - "refdb", - [ - "git_refdb_compress", - "git_refdb_free", - "git_refdb_new", - "git_refdb_open" - ] - ], - [ - "reference", - [ - "git_reference_cmp", - "git_reference_create", - "git_reference_create_matching", - "git_reference_delete", - "git_reference_dup", - "git_reference_dwim", - "git_reference_ensure_log", - "git_reference_foreach", - "git_reference_foreach_glob", - "git_reference_foreach_name", - "git_reference_free", - "git_reference_has_log", - "git_reference_is_branch", - "git_reference_is_note", - "git_reference_is_remote", - "git_reference_is_tag", - "git_reference_is_valid_name", - "git_reference_iterator_free", - "git_reference_iterator_glob_new", - "git_reference_iterator_new", - "git_reference_list", - "git_reference_lookup", - "git_reference_name", - "git_reference_name_is_valid", - "git_reference_name_to_id", - "git_reference_next", - "git_reference_next_name", - "git_reference_normalize_name", - "git_reference_owner", - "git_reference_peel", - "git_reference_remove", - "git_reference_rename", - "git_reference_resolve", - "git_reference_set_target", - "git_reference_shorthand", - "git_reference_symbolic_create", - "git_reference_symbolic_create_matching", - "git_reference_symbolic_set_target", - "git_reference_symbolic_target", - "git_reference_target", - "git_reference_target_peel", - "git_reference_type" - ] - ], - [ - "reflog", - [ - "git_reflog_append", - "git_reflog_delete", - "git_reflog_drop", - "git_reflog_entry_byindex", - "git_reflog_entry_committer", - "git_reflog_entry_id_new", - "git_reflog_entry_id_old", - "git_reflog_entry_message", - "git_reflog_entrycount", - "git_reflog_free", - "git_reflog_read", - "git_reflog_rename", - "git_reflog_write" - ] - ], - [ - "refspec", - [ - "git_refspec_direction", - "git_refspec_dst", - "git_refspec_dst_matches", - "git_refspec_force", - "git_refspec_free", - "git_refspec_parse", - "git_refspec_rtransform", - "git_refspec_src", - "git_refspec_src_matches", - "git_refspec_string", - "git_refspec_transform" - ] - ], - [ - "remote", - [ - "git_remote_add_fetch", - "git_remote_add_push", - "git_remote_autotag", - "git_remote_connect", - "git_remote_connect_ext", - "git_remote_connect_options_init", - "git_remote_connected", - "git_remote_create", - "git_remote_create_anonymous", - "git_remote_create_detached", - "git_remote_create_options_init", - "git_remote_create_with_fetchspec", - "git_remote_create_with_opts", - "git_remote_default_branch", - "git_remote_delete", - "git_remote_disconnect", - "git_remote_download", - "git_remote_dup", - "git_remote_fetch", - "git_remote_free", - "git_remote_get_fetch_refspecs", - "git_remote_get_push_refspecs", - "git_remote_get_refspec", - "git_remote_init_callbacks", - "git_remote_is_valid_name", - "git_remote_list", - "git_remote_lookup", - "git_remote_ls", - "git_remote_name", - "git_remote_name_is_valid", - "git_remote_owner", - "git_remote_prune", - "git_remote_prune_refs", - "git_remote_push", - "git_remote_pushurl", - "git_remote_refspec_count", - "git_remote_rename", - "git_remote_set_autotag", - "git_remote_set_instance_pushurl", - "git_remote_set_instance_url", - "git_remote_set_pushurl", - "git_remote_set_url", - "git_remote_stats", - "git_remote_stop", - "git_remote_update_tips", - "git_remote_upload", - "git_remote_url" - ] - ], - [ - "repository", - [ - "git_repository_commondir", - "git_repository_config", - "git_repository_config_snapshot", - "git_repository_detach_head", - "git_repository_discover", - "git_repository_fetchhead_foreach", - "git_repository_free", - "git_repository_get_namespace", - "git_repository_hashfile", - "git_repository_head", - "git_repository_head_detached", - "git_repository_head_detached_for_worktree", - "git_repository_head_for_worktree", - "git_repository_head_unborn", - "git_repository_ident", - "git_repository_index", - "git_repository_init", - "git_repository_init_ext", - "git_repository_init_options_init", - "git_repository_is_bare", - "git_repository_is_empty", - "git_repository_is_shallow", - "git_repository_is_worktree", - "git_repository_item_path", - "git_repository_mergehead_foreach", - "git_repository_message", - "git_repository_message_remove", - "git_repository_odb", - "git_repository_oid_type", - "git_repository_open", - "git_repository_open_bare", - "git_repository_open_ext", - "git_repository_open_from_worktree", - "git_repository_path", - "git_repository_refdb", - "git_repository_set_head", - "git_repository_set_head_detached", - "git_repository_set_head_detached_from_annotated", - "git_repository_set_ident", - "git_repository_set_namespace", - "git_repository_set_workdir", - "git_repository_state", - "git_repository_state_cleanup", - "git_repository_workdir" - ] - ], - [ - "reset", - [ - "git_reset", - "git_reset_default", - "git_reset_from_annotated" - ] - ], - [ - "revert", - [ - "git_revert", - "git_revert_commit", - "git_revert_options_init" - ] - ], - [ - "revparse", - [ - "git_revparse", - "git_revparse_ext", - "git_revparse_single" - ] - ], - [ - "revwalk", - [ - "git_revwalk_add_hide_cb", - "git_revwalk_free", - "git_revwalk_hide", - "git_revwalk_hide_glob", - "git_revwalk_hide_head", - "git_revwalk_hide_ref", - "git_revwalk_new", - "git_revwalk_next", - "git_revwalk_push", - "git_revwalk_push_glob", - "git_revwalk_push_head", - "git_revwalk_push_range", - "git_revwalk_push_ref", - "git_revwalk_repository", - "git_revwalk_reset", - "git_revwalk_simplify_first_parent", - "git_revwalk_sorting" - ] - ], - [ - "signature", - [ - "git_signature_default", - "git_signature_dup", - "git_signature_free", - "git_signature_from_buffer", - "git_signature_new", - "git_signature_now" - ] - ], - [ - "stash", - [ - "git_stash_apply", - "git_stash_apply_options_init", - "git_stash_drop", - "git_stash_foreach", - "git_stash_pop", - "git_stash_save", - "git_stash_save_options_init", - "git_stash_save_with_opts" - ] - ], - [ - "status", - [ - "git_status_byindex", - "git_status_file", - "git_status_foreach", - "git_status_foreach_ext", - "git_status_list_entrycount", - "git_status_list_free", - "git_status_list_new", - "git_status_options_init", - "git_status_should_ignore" - ] - ], - [ - "strarray", - [ - "git_strarray_copy", - "git_strarray_dispose", - "git_strarray_free" - ] - ], - [ - "submodule", - [ - "git_submodule_add_finalize", - "git_submodule_add_setup", - "git_submodule_add_to_index", - "git_submodule_branch", - "git_submodule_clone", - "git_submodule_dup", - "git_submodule_fetch_recurse_submodules", - "git_submodule_foreach", - "git_submodule_free", - "git_submodule_head_id", - "git_submodule_ignore", - "git_submodule_index_id", - "git_submodule_init", - "git_submodule_location", - "git_submodule_lookup", - "git_submodule_name", - "git_submodule_open", - "git_submodule_owner", - "git_submodule_path", - "git_submodule_reload", - "git_submodule_repo_init", - "git_submodule_resolve_url", - "git_submodule_set_branch", - "git_submodule_set_fetch_recurse_submodules", - "git_submodule_set_ignore", - "git_submodule_set_update", - "git_submodule_set_url", - "git_submodule_status", - "git_submodule_sync", - "git_submodule_update", - "git_submodule_update_options_init", - "git_submodule_update_strategy", - "git_submodule_url", - "git_submodule_wd_id" - ] - ], - [ - "tag", - [ - "git_tag_annotation_create", - "git_tag_create", - "git_tag_create_from_buffer", - "git_tag_create_lightweight", - "git_tag_delete", - "git_tag_dup", - "git_tag_foreach", - "git_tag_free", - "git_tag_id", - "git_tag_list", - "git_tag_list_match", - "git_tag_lookup", - "git_tag_lookup_prefix", - "git_tag_message", - "git_tag_name", - "git_tag_name_is_valid", - "git_tag_owner", - "git_tag_peel", - "git_tag_tagger", - "git_tag_target", - "git_tag_target_id", - "git_tag_target_type" - ] - ], - [ - "trace", - [ - "git_trace_set" - ] - ], - [ - "transaction", - [ - "git_transaction_commit", - "git_transaction_free", - "git_transaction_lock_ref", - "git_transaction_new", - "git_transaction_remove", - "git_transaction_set_reflog", - "git_transaction_set_symbolic_target", - "git_transaction_set_target" - ] - ], - [ - "tree", - [ - "git_tree_create_updated", - "git_tree_dup", - "git_tree_entry_byid", - "git_tree_entry_byindex", - "git_tree_entry_byname", - "git_tree_entry_bypath", - "git_tree_entry_cmp", - "git_tree_entry_dup", - "git_tree_entry_filemode", - "git_tree_entry_filemode_raw", - "git_tree_entry_free", - "git_tree_entry_id", - "git_tree_entry_name", - "git_tree_entry_to_object", - "git_tree_entry_type", - "git_tree_entrycount", - "git_tree_free", - "git_tree_id", - "git_tree_lookup", - "git_tree_lookup_prefix", - "git_tree_owner", - "git_tree_walk" - ] - ], - [ - "treebuilder", - [ - "git_treebuilder_clear", - "git_treebuilder_entrycount", - "git_treebuilder_filter", - "git_treebuilder_free", - "git_treebuilder_get", - "git_treebuilder_insert", - "git_treebuilder_new", - "git_treebuilder_remove", - "git_treebuilder_write", - "git_treebuilder_write_with_buffer" - ] - ], - [ - "worktree", - [ - "git_worktree_add", - "git_worktree_add_options_init", - "git_worktree_free", - "git_worktree_is_locked", - "git_worktree_is_prunable", - "git_worktree_list", - "git_worktree_lock", - "git_worktree_lookup", - "git_worktree_name", - "git_worktree_open_from_repository", - "git_worktree_path", - "git_worktree_prune", - "git_worktree_prune_options_init", - "git_worktree_unlock", - "git_worktree_validate" - ] - ] + ["apply", ["git_apply", "git_apply_options_init", "git_apply_to_tree"]], + [ + "attr", + [ + "git_attr_add_macro", + "git_attr_cache_flush", + "git_attr_foreach", + "git_attr_foreach_ext", + "git_attr_get", + "git_attr_get_ext", + "git_attr_get_many", + "git_attr_get_many_ext", + "git_attr_value" + ] ], - "examples": [ - [ - "add.c", - "ex/v1.7.2/add.html" - ], - [ - "args.c", - "ex/v1.7.2/args.html" - ], - [ - "blame.c", - "ex/v1.7.2/blame.html" - ], - [ - "cat-file.c", - "ex/v1.7.2/cat-file.html" - ], - [ - "checkout.c", - "ex/v1.7.2/checkout.html" - ], - [ - "clone.c", - "ex/v1.7.2/clone.html" - ], - [ - "commit.c", - "ex/v1.7.2/commit.html" - ], - [ - "common.c", - "ex/v1.7.2/common.html" - ], - [ - "config.c", - "ex/v1.7.2/config.html" - ], - [ - "describe.c", - "ex/v1.7.2/describe.html" - ], - [ - "diff.c", - "ex/v1.7.2/diff.html" - ], - [ - "fetch.c", - "ex/v1.7.2/fetch.html" - ], - [ - "for-each-ref.c", - "ex/v1.7.2/for-each-ref.html" - ], - [ - "general.c", - "ex/v1.7.2/general.html" - ], - [ - "index-pack.c", - "ex/v1.7.2/index-pack.html" - ], - [ - "init.c", - "ex/v1.7.2/init.html" - ], - [ - "lg2.c", - "ex/v1.7.2/lg2.html" - ], - [ - "log.c", - "ex/v1.7.2/log.html" - ], - [ - "ls-files.c", - "ex/v1.7.2/ls-files.html" - ], - [ - "ls-remote.c", - "ex/v1.7.2/ls-remote.html" - ], - [ - "merge.c", - "ex/v1.7.2/merge.html" - ], - [ - "push.c", - "ex/v1.7.2/push.html" - ], - [ - "remote.c", - "ex/v1.7.2/remote.html" - ], - [ - "rev-list.c", - "ex/v1.7.2/rev-list.html" - ], - [ - "rev-parse.c", - "ex/v1.7.2/rev-parse.html" - ], - [ - "show-index.c", - "ex/v1.7.2/show-index.html" - ], - [ - "stash.c", - "ex/v1.7.2/stash.html" - ], - [ - "status.c", - "ex/v1.7.2/status.html" - ], - [ - "tag.c", - "ex/v1.7.2/tag.html" - ] + [ + "blame", + [ + "git_blame_buffer", + "git_blame_file", + "git_blame_free", + "git_blame_get_hunk_byindex", + "git_blame_get_hunk_byline", + "git_blame_get_hunk_count", + "git_blame_init_options", + "git_blame_options_init" + ] + ], + [ + "blob", + [ + "git_blob_create_from_buffer", + "git_blob_create_from_disk", + "git_blob_create_from_stream", + "git_blob_create_from_stream_commit", + "git_blob_create_from_workdir", + "git_blob_data_is_binary", + "git_blob_dup", + "git_blob_filter", + "git_blob_filter_options_init", + "git_blob_filtered_content", + "git_blob_free", + "git_blob_id", + "git_blob_is_binary", + "git_blob_lookup", + "git_blob_lookup_prefix", + "git_blob_owner", + "git_blob_rawcontent", + "git_blob_rawsize" + ] + ], + [ + "branch", + [ + "git_branch_create", + "git_branch_create_from_annotated", + "git_branch_delete", + "git_branch_is_checked_out", + "git_branch_is_head", + "git_branch_iterator_free", + "git_branch_iterator_new", + "git_branch_lookup", + "git_branch_move", + "git_branch_name", + "git_branch_name_is_valid", + "git_branch_next", + "git_branch_remote_name", + "git_branch_set_upstream", + "git_branch_upstream", + "git_branch_upstream_merge", + "git_branch_upstream_name", + "git_branch_upstream_remote" + ] + ], + [ + "buf", + [ + "git_buf_contains_nul", + "git_buf_dispose", + "git_buf_free", + "git_buf_grow", + "git_buf_is_binary", + "git_buf_set" + ] + ], + [ + "checkout", + [ + "git_checkout_head", + "git_checkout_index", + "git_checkout_options_init", + "git_checkout_tree" + ] + ], + [ + "cherrypick", + ["git_cherrypick", "git_cherrypick_commit", "git_cherrypick_options_init"] + ], + ["clone", ["git_clone", "git_clone_options_init"]], + [ + "commit", + [ + "git_commit_amend", + "git_commit_author", + "git_commit_author_with_mailmap", + "git_commit_body", + "git_commit_committer", + "git_commit_committer_with_mailmap", + "git_commit_create", + "git_commit_create_buffer", + "git_commit_create_from_stage", + "git_commit_create_v", + "git_commit_create_with_signature", + "git_commit_dup", + "git_commit_extract_signature", + "git_commit_free", + "git_commit_header_field", + "git_commit_id", + "git_commit_lookup", + "git_commit_lookup_prefix", + "git_commit_message", + "git_commit_message_encoding", + "git_commit_message_raw", + "git_commit_nth_gen_ancestor", + "git_commit_owner", + "git_commit_parent", + "git_commit_parent_id", + "git_commit_parentcount", + "git_commit_raw_header", + "git_commit_summary", + "git_commit_time", + "git_commit_time_offset", + "git_commit_tree", + "git_commit_tree_id" + ] + ], + ["commitarray", ["git_commitarray_dispose"]], + [ + "config", + [ + "git_config_add_file_ondisk", + "git_config_backend_foreach_match", + "git_config_delete_entry", + "git_config_delete_multivar", + "git_config_entry_free", + "git_config_find_global", + "git_config_find_programdata", + "git_config_find_system", + "git_config_find_xdg", + "git_config_foreach", + "git_config_foreach_match", + "git_config_free", + "git_config_get_bool", + "git_config_get_entry", + "git_config_get_int32", + "git_config_get_int64", + "git_config_get_mapped", + "git_config_get_multivar_foreach", + "git_config_get_path", + "git_config_get_string", + "git_config_get_string_buf", + "git_config_iterator_free", + "git_config_iterator_glob_new", + "git_config_iterator_new", + "git_config_lock", + "git_config_lookup_map_value", + "git_config_multivar_iterator_new", + "git_config_new", + "git_config_next", + "git_config_open_default", + "git_config_open_global", + "git_config_open_level", + "git_config_open_ondisk", + "git_config_parse_bool", + "git_config_parse_int32", + "git_config_parse_int64", + "git_config_parse_path", + "git_config_set_bool", + "git_config_set_int32", + "git_config_set_int64", + "git_config_set_multivar", + "git_config_set_string", + "git_config_snapshot" + ] + ], + [ + "credential", + [ + "git_credential_default_new", + "git_credential_free", + "git_credential_get_username", + "git_credential_has_username", + "git_credential_ssh_custom_new", + "git_credential_ssh_interactive_new", + "git_credential_ssh_key_from_agent", + "git_credential_ssh_key_memory_new", + "git_credential_ssh_key_new", + "git_credential_username_new", + "git_credential_userpass", + "git_credential_userpass_plaintext_new" + ] + ], + [ + "describe", + [ + "git_describe_commit", + "git_describe_format", + "git_describe_format_options_init", + "git_describe_options_init", + "git_describe_result_free", + "git_describe_workdir" + ] + ], + [ + "diff", + [ + "git_diff_blob_to_buffer", + "git_diff_blobs", + "git_diff_buffers", + "git_diff_commit_as_email", + "git_diff_find_options_init", + "git_diff_find_similar", + "git_diff_foreach", + "git_diff_format_email", + "git_diff_format_email_options_init", + "git_diff_free", + "git_diff_from_buffer", + "git_diff_get_delta", + "git_diff_get_stats", + "git_diff_index_to_index", + "git_diff_index_to_workdir", + "git_diff_is_sorted_icase", + "git_diff_merge", + "git_diff_num_deltas", + "git_diff_num_deltas_of_type", + "git_diff_options_init", + "git_diff_patchid", + "git_diff_patchid_options_init", + "git_diff_print", + "git_diff_stats_deletions", + "git_diff_stats_files_changed", + "git_diff_stats_free", + "git_diff_stats_insertions", + "git_diff_stats_to_buf", + "git_diff_status_char", + "git_diff_to_buf", + "git_diff_tree_to_index", + "git_diff_tree_to_tree", + "git_diff_tree_to_workdir", + "git_diff_tree_to_workdir_with_index" + ] + ], + ["email", ["git_email_create_from_commit", "git_email_create_from_diff"]], + ["error", ["git_error_last"]], + ["fetch", ["git_fetch_options_init"]], + [ + "filter", + [ + "git_filter_list_apply_to_blob", + "git_filter_list_apply_to_buffer", + "git_filter_list_apply_to_data", + "git_filter_list_apply_to_file", + "git_filter_list_contains", + "git_filter_list_free", + "git_filter_list_load", + "git_filter_list_load_ext", + "git_filter_list_stream_blob", + "git_filter_list_stream_buffer", + "git_filter_list_stream_data", + "git_filter_list_stream_file" + ] + ], + [ + "giterr", + ["giterr_clear", "giterr_last", "giterr_set_oom", "giterr_set_str"] + ], + [ + "graph", + [ + "git_graph_ahead_behind", + "git_graph_descendant_of", + "git_graph_reachable_from_any" + ] + ], + [ + "ignore", + [ + "git_ignore_add_rule", + "git_ignore_clear_internal_rules", + "git_ignore_path_is_ignored" + ] + ], + [ + "index", + [ + "git_index_add", + "git_index_add_all", + "git_index_add_bypath", + "git_index_add_from_buffer", + "git_index_caps", + "git_index_checksum", + "git_index_clear", + "git_index_conflict_add", + "git_index_conflict_cleanup", + "git_index_conflict_get", + "git_index_conflict_iterator_free", + "git_index_conflict_iterator_new", + "git_index_conflict_next", + "git_index_conflict_remove", + "git_index_entry_is_conflict", + "git_index_entry_stage", + "git_index_entrycount", + "git_index_find", + "git_index_find_prefix", + "git_index_free", + "git_index_get_byindex", + "git_index_get_bypath", + "git_index_has_conflicts", + "git_index_iterator_free", + "git_index_iterator_new", + "git_index_iterator_next", + "git_index_owner", + "git_index_path", + "git_index_read", + "git_index_read_tree", + "git_index_remove", + "git_index_remove_all", + "git_index_remove_bypath", + "git_index_remove_directory", + "git_index_set_caps", + "git_index_set_version", + "git_index_update_all", + "git_index_version", + "git_index_write", + "git_index_write_tree", + "git_index_write_tree_to" + ] + ], + [ + "indexer", + [ + "git_indexer_append", + "git_indexer_commit", + "git_indexer_free", + "git_indexer_hash", + "git_indexer_name", + "git_indexer_new", + "git_indexer_options_init" + ] + ], + [ + "libgit2", + [ + "git_libgit2_features", + "git_libgit2_init", + "git_libgit2_opts", + "git_libgit2_prerelease", + "git_libgit2_shutdown", + "git_libgit2_version" + ] + ], + [ + "mailmap", + [ + "git_mailmap_add_entry", + "git_mailmap_free", + "git_mailmap_from_buffer", + "git_mailmap_from_repository", + "git_mailmap_new", + "git_mailmap_resolve", + "git_mailmap_resolve_signature" + ] + ], + [ + "merge", + [ + "git_merge", + "git_merge_analysis", + "git_merge_analysis_for_ref", + "git_merge_base", + "git_merge_base_many", + "git_merge_base_octopus", + "git_merge_bases", + "git_merge_bases_many", + "git_merge_commits", + "git_merge_file", + "git_merge_file_from_index", + "git_merge_file_input_init", + "git_merge_file_options_init", + "git_merge_file_result_free", + "git_merge_options_init", + "git_merge_trees" + ] + ], + [ + "message", + [ + "git_message_prettify", + "git_message_trailer_array_free", + "git_message_trailers" + ] + ], + [ + "note", + [ + "git_note_author", + "git_note_commit_create", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_committer", + "git_note_create", + "git_note_default_ref", + "git_note_foreach", + "git_note_free", + "git_note_id", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_message", + "git_note_next", + "git_note_read", + "git_note_remove" + ] + ], + [ + "object", + [ + "git_object__size", + "git_object_dup", + "git_object_free", + "git_object_id", + "git_object_lookup", + "git_object_lookup_bypath", + "git_object_lookup_prefix", + "git_object_owner", + "git_object_peel", + "git_object_rawcontent_is_valid", + "git_object_short_id", + "git_object_string2type", + "git_object_type", + "git_object_type2string", + "git_object_typeisloose" + ] + ], + [ + "odb", + [ + "git_odb_add_alternate", + "git_odb_add_backend", + "git_odb_add_disk_alternate", + "git_odb_exists", + "git_odb_exists_ext", + "git_odb_exists_prefix", + "git_odb_expand_ids", + "git_odb_foreach", + "git_odb_free", + "git_odb_get_backend", + "git_odb_num_backends", + "git_odb_object_data", + "git_odb_object_dup", + "git_odb_object_free", + "git_odb_object_id", + "git_odb_object_size", + "git_odb_object_type", + "git_odb_open_rstream", + "git_odb_open_wstream", + "git_odb_read", + "git_odb_read_header", + "git_odb_read_prefix", + "git_odb_refresh", + "git_odb_set_commit_graph", + "git_odb_stream_finalize_write", + "git_odb_stream_free", + "git_odb_stream_read", + "git_odb_stream_write", + "git_odb_write", + "git_odb_write_multi_pack_index", + "git_odb_write_pack" + ] + ], + [ + "oid", + [ + "git_oid_cmp", + "git_oid_cpy", + "git_oid_equal", + "git_oid_fmt", + "git_oid_is_zero", + "git_oid_ncmp", + "git_oid_nfmt", + "git_oid_pathfmt", + "git_oid_shorten_add", + "git_oid_shorten_free", + "git_oid_shorten_new", + "git_oid_strcmp", + "git_oid_streq", + "git_oid_tostr", + "git_oid_tostr_s" + ] + ], + ["oidarray", ["git_oidarray_dispose", "git_oidarray_free"]], + [ + "packbuilder", + [ + "git_packbuilder_foreach", + "git_packbuilder_free", + "git_packbuilder_hash", + "git_packbuilder_insert", + "git_packbuilder_insert_commit", + "git_packbuilder_insert_recur", + "git_packbuilder_insert_tree", + "git_packbuilder_insert_walk", + "git_packbuilder_name", + "git_packbuilder_new", + "git_packbuilder_object_count", + "git_packbuilder_set_callbacks", + "git_packbuilder_set_threads", + "git_packbuilder_write", + "git_packbuilder_write_buf", + "git_packbuilder_written" + ] + ], + [ + "patch", + [ + "git_patch_free", + "git_patch_from_blob_and_buffer", + "git_patch_from_blobs", + "git_patch_from_buffers", + "git_patch_from_diff", + "git_patch_get_delta", + "git_patch_get_hunk", + "git_patch_get_line_in_hunk", + "git_patch_line_stats", + "git_patch_num_hunks", + "git_patch_num_lines_in_hunk", + "git_patch_owner", + "git_patch_print", + "git_patch_size", + "git_patch_to_buf" + ] + ], + [ + "pathspec", + [ + "git_pathspec_free", + "git_pathspec_match_diff", + "git_pathspec_match_index", + "git_pathspec_match_list_diff_entry", + "git_pathspec_match_list_entry", + "git_pathspec_match_list_entrycount", + "git_pathspec_match_list_failed_entry", + "git_pathspec_match_list_failed_entrycount", + "git_pathspec_match_list_free", + "git_pathspec_match_tree", + "git_pathspec_match_workdir", + "git_pathspec_matches_path", + "git_pathspec_new" + ] + ], + ["proxy", ["git_proxy_options_init"]], + ["push", ["git_push_options_init"]], + [ + "rebase", + [ + "git_rebase_abort", + "git_rebase_commit", + "git_rebase_finish", + "git_rebase_free", + "git_rebase_init", + "git_rebase_inmemory_index", + "git_rebase_next", + "git_rebase_onto_id", + "git_rebase_onto_name", + "git_rebase_open", + "git_rebase_operation_byindex", + "git_rebase_operation_current", + "git_rebase_operation_entrycount", + "git_rebase_options_init", + "git_rebase_orig_head_id", + "git_rebase_orig_head_name" + ] + ], + [ + "refdb", + [ + "git_refdb_compress", + "git_refdb_free", + "git_refdb_new", + "git_refdb_open" + ] + ], + [ + "reference", + [ + "git_reference_cmp", + "git_reference_create", + "git_reference_create_matching", + "git_reference_delete", + "git_reference_dup", + "git_reference_dwim", + "git_reference_ensure_log", + "git_reference_foreach", + "git_reference_foreach_glob", + "git_reference_foreach_name", + "git_reference_free", + "git_reference_has_log", + "git_reference_is_branch", + "git_reference_is_note", + "git_reference_is_remote", + "git_reference_is_tag", + "git_reference_is_valid_name", + "git_reference_iterator_free", + "git_reference_iterator_glob_new", + "git_reference_iterator_new", + "git_reference_list", + "git_reference_lookup", + "git_reference_name", + "git_reference_name_is_valid", + "git_reference_name_to_id", + "git_reference_next", + "git_reference_next_name", + "git_reference_normalize_name", + "git_reference_owner", + "git_reference_peel", + "git_reference_remove", + "git_reference_rename", + "git_reference_resolve", + "git_reference_set_target", + "git_reference_shorthand", + "git_reference_symbolic_create", + "git_reference_symbolic_create_matching", + "git_reference_symbolic_set_target", + "git_reference_symbolic_target", + "git_reference_target", + "git_reference_target_peel", + "git_reference_type" + ] + ], + [ + "reflog", + [ + "git_reflog_append", + "git_reflog_delete", + "git_reflog_drop", + "git_reflog_entry_byindex", + "git_reflog_entry_committer", + "git_reflog_entry_id_new", + "git_reflog_entry_id_old", + "git_reflog_entry_message", + "git_reflog_entrycount", + "git_reflog_free", + "git_reflog_read", + "git_reflog_rename", + "git_reflog_write" + ] + ], + [ + "refspec", + [ + "git_refspec_direction", + "git_refspec_dst", + "git_refspec_dst_matches", + "git_refspec_force", + "git_refspec_free", + "git_refspec_parse", + "git_refspec_rtransform", + "git_refspec_src", + "git_refspec_src_matches", + "git_refspec_string", + "git_refspec_transform" + ] + ], + [ + "remote", + [ + "git_remote_add_fetch", + "git_remote_add_push", + "git_remote_autotag", + "git_remote_connect", + "git_remote_connect_ext", + "git_remote_connect_options_init", + "git_remote_connected", + "git_remote_create", + "git_remote_create_anonymous", + "git_remote_create_detached", + "git_remote_create_options_init", + "git_remote_create_with_fetchspec", + "git_remote_create_with_opts", + "git_remote_default_branch", + "git_remote_delete", + "git_remote_disconnect", + "git_remote_download", + "git_remote_dup", + "git_remote_fetch", + "git_remote_free", + "git_remote_get_fetch_refspecs", + "git_remote_get_push_refspecs", + "git_remote_get_refspec", + "git_remote_init_callbacks", + "git_remote_is_valid_name", + "git_remote_list", + "git_remote_lookup", + "git_remote_ls", + "git_remote_name", + "git_remote_name_is_valid", + "git_remote_owner", + "git_remote_prune", + "git_remote_prune_refs", + "git_remote_push", + "git_remote_pushurl", + "git_remote_refspec_count", + "git_remote_rename", + "git_remote_set_autotag", + "git_remote_set_instance_pushurl", + "git_remote_set_instance_url", + "git_remote_set_pushurl", + "git_remote_set_url", + "git_remote_stats", + "git_remote_stop", + "git_remote_update_tips", + "git_remote_upload", + "git_remote_url" + ] + ], + [ + "repository", + [ + "git_repository_commit_parents", + "git_repository_commondir", + "git_repository_config", + "git_repository_config_snapshot", + "git_repository_detach_head", + "git_repository_discover", + "git_repository_fetchhead_foreach", + "git_repository_free", + "git_repository_get_namespace", + "git_repository_hashfile", + "git_repository_head", + "git_repository_head_detached", + "git_repository_head_detached_for_worktree", + "git_repository_head_for_worktree", + "git_repository_head_unborn", + "git_repository_ident", + "git_repository_index", + "git_repository_init", + "git_repository_init_ext", + "git_repository_init_options_init", + "git_repository_is_bare", + "git_repository_is_empty", + "git_repository_is_shallow", + "git_repository_is_worktree", + "git_repository_item_path", + "git_repository_mergehead_foreach", + "git_repository_message", + "git_repository_message_remove", + "git_repository_odb", + "git_repository_oid_type", + "git_repository_open", + "git_repository_open_bare", + "git_repository_open_ext", + "git_repository_open_from_worktree", + "git_repository_path", + "git_repository_refdb", + "git_repository_set_head", + "git_repository_set_head_detached", + "git_repository_set_head_detached_from_annotated", + "git_repository_set_ident", + "git_repository_set_namespace", + "git_repository_set_workdir", + "git_repository_state", + "git_repository_state_cleanup", + "git_repository_workdir" + ] + ], + ["reset", ["git_reset", "git_reset_default", "git_reset_from_annotated"]], + ["revert", ["git_revert", "git_revert_commit", "git_revert_options_init"]], + ["revparse", ["git_revparse", "git_revparse_ext", "git_revparse_single"]], + [ + "revwalk", + [ + "git_revwalk_add_hide_cb", + "git_revwalk_free", + "git_revwalk_hide", + "git_revwalk_hide_glob", + "git_revwalk_hide_head", + "git_revwalk_hide_ref", + "git_revwalk_new", + "git_revwalk_next", + "git_revwalk_push", + "git_revwalk_push_glob", + "git_revwalk_push_head", + "git_revwalk_push_range", + "git_revwalk_push_ref", + "git_revwalk_repository", + "git_revwalk_reset", + "git_revwalk_simplify_first_parent", + "git_revwalk_sorting" + ] + ], + [ + "signature", + [ + "git_signature_default", + "git_signature_dup", + "git_signature_free", + "git_signature_from_buffer", + "git_signature_new", + "git_signature_now" + ] + ], + [ + "stash", + [ + "git_stash_apply", + "git_stash_apply_options_init", + "git_stash_drop", + "git_stash_foreach", + "git_stash_pop", + "git_stash_save", + "git_stash_save_options_init", + "git_stash_save_with_opts" + ] + ], + [ + "status", + [ + "git_status_byindex", + "git_status_file", + "git_status_foreach", + "git_status_foreach_ext", + "git_status_list_entrycount", + "git_status_list_free", + "git_status_list_new", + "git_status_options_init", + "git_status_should_ignore" + ] + ], + [ + "strarray", + ["git_strarray_copy", "git_strarray_dispose", "git_strarray_free"] + ], + [ + "submodule", + [ + "git_submodule_add_finalize", + "git_submodule_add_setup", + "git_submodule_add_to_index", + "git_submodule_branch", + "git_submodule_clone", + "git_submodule_dup", + "git_submodule_fetch_recurse_submodules", + "git_submodule_foreach", + "git_submodule_free", + "git_submodule_head_id", + "git_submodule_ignore", + "git_submodule_index_id", + "git_submodule_init", + "git_submodule_location", + "git_submodule_lookup", + "git_submodule_name", + "git_submodule_open", + "git_submodule_owner", + "git_submodule_path", + "git_submodule_reload", + "git_submodule_repo_init", + "git_submodule_resolve_url", + "git_submodule_set_branch", + "git_submodule_set_fetch_recurse_submodules", + "git_submodule_set_ignore", + "git_submodule_set_update", + "git_submodule_set_url", + "git_submodule_status", + "git_submodule_sync", + "git_submodule_update", + "git_submodule_update_options_init", + "git_submodule_update_strategy", + "git_submodule_url", + "git_submodule_wd_id" + ] + ], + [ + "tag", + [ + "git_tag_annotation_create", + "git_tag_create", + "git_tag_create_from_buffer", + "git_tag_create_lightweight", + "git_tag_delete", + "git_tag_dup", + "git_tag_foreach", + "git_tag_free", + "git_tag_id", + "git_tag_list", + "git_tag_list_match", + "git_tag_lookup", + "git_tag_lookup_prefix", + "git_tag_message", + "git_tag_name", + "git_tag_name_is_valid", + "git_tag_owner", + "git_tag_peel", + "git_tag_tagger", + "git_tag_target", + "git_tag_target_id", + "git_tag_target_type" + ] + ], + ["trace", ["git_trace_set"]], + [ + "transaction", + [ + "git_transaction_commit", + "git_transaction_free", + "git_transaction_lock_ref", + "git_transaction_new", + "git_transaction_remove", + "git_transaction_set_reflog", + "git_transaction_set_symbolic_target", + "git_transaction_set_target" + ] + ], + [ + "tree", + [ + "git_tree_create_updated", + "git_tree_dup", + "git_tree_entry_byid", + "git_tree_entry_byindex", + "git_tree_entry_byname", + "git_tree_entry_bypath", + "git_tree_entry_cmp", + "git_tree_entry_dup", + "git_tree_entry_filemode", + "git_tree_entry_filemode_raw", + "git_tree_entry_free", + "git_tree_entry_id", + "git_tree_entry_name", + "git_tree_entry_to_object", + "git_tree_entry_type", + "git_tree_entrycount", + "git_tree_free", + "git_tree_id", + "git_tree_lookup", + "git_tree_lookup_prefix", + "git_tree_owner", + "git_tree_walk" + ] + ], + [ + "treebuilder", + [ + "git_treebuilder_clear", + "git_treebuilder_entrycount", + "git_treebuilder_filter", + "git_treebuilder_free", + "git_treebuilder_get", + "git_treebuilder_insert", + "git_treebuilder_new", + "git_treebuilder_remove", + "git_treebuilder_write", + "git_treebuilder_write_with_buffer" + ] + ], + [ + "worktree", + [ + "git_worktree_add", + "git_worktree_add_options_init", + "git_worktree_free", + "git_worktree_is_locked", + "git_worktree_is_prunable", + "git_worktree_list", + "git_worktree_lock", + "git_worktree_lookup", + "git_worktree_name", + "git_worktree_open_from_repository", + "git_worktree_path", + "git_worktree_prune", + "git_worktree_prune_options_init", + "git_worktree_unlock", + "git_worktree_validate" + ] ] -} \ No newline at end of file + ], + "examples": [ + ["add.c", "ex/v1.8.4/add.html"], + ["args.c", "ex/v1.8.4/args.html"], + ["blame.c", "ex/v1.8.4/blame.html"], + ["cat-file.c", "ex/v1.8.4/cat-file.html"], + ["checkout.c", "ex/v1.8.4/checkout.html"], + ["clone.c", "ex/v1.8.4/clone.html"], + ["commit.c", "ex/v1.8.4/commit.html"], + ["common.c", "ex/v1.8.4/common.html"], + ["config.c", "ex/v1.8.4/config.html"], + ["describe.c", "ex/v1.8.4/describe.html"], + ["diff.c", "ex/v1.8.4/diff.html"], + ["fetch.c", "ex/v1.8.4/fetch.html"], + ["for-each-ref.c", "ex/v1.8.4/for-each-ref.html"], + ["general.c", "ex/v1.8.4/general.html"], + ["index-pack.c", "ex/v1.8.4/index-pack.html"], + ["init.c", "ex/v1.8.4/init.html"], + ["lg2.c", "ex/v1.8.4/lg2.html"], + ["log.c", "ex/v1.8.4/log.html"], + ["ls-files.c", "ex/v1.8.4/ls-files.html"], + ["ls-remote.c", "ex/v1.8.4/ls-remote.html"], + ["merge.c", "ex/v1.8.4/merge.html"], + ["push.c", "ex/v1.8.4/push.html"], + ["remote.c", "ex/v1.8.4/remote.html"], + ["rev-list.c", "ex/v1.8.4/rev-list.html"], + ["rev-parse.c", "ex/v1.8.4/rev-parse.html"], + ["show-index.c", "ex/v1.8.4/show-index.html"], + ["stash.c", "ex/v1.8.4/stash.html"], + ["status.c", "ex/v1.8.4/status.html"], + ["tag.c", "ex/v1.8.4/tag.html"] + ] +} diff --git a/generate/templates/templates/class_header.h b/generate/templates/templates/class_header.h index d74bd0ca2..911234782 100644 --- a/generate/templates/templates/class_header.h +++ b/generate/templates/templates/class_header.h @@ -20,6 +20,7 @@ extern "C" { #include +#include {%each cDependencies as dependency %} #include <{{ dependency }}> {%endeach%} diff --git a/generate/templates/templates/struct_header.h b/generate/templates/templates/struct_header.h index 1c2495f44..ac05fb354 100644 --- a/generate/templates/templates/struct_header.h +++ b/generate/templates/templates/struct_header.h @@ -16,6 +16,7 @@ extern "C" { #include + #include {% each cDependencies as dependency %} #include <{{ dependency }}> {% endeach %} diff --git a/vendor/libgit2 b/vendor/libgit2 index efdaa4ac7..6bfd2b901 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit efdaa4ac71e067f0c178e94a0c7d4e197bded48d +Subproject commit 6bfd2b9011897a30494451e75a95cff5b88b93b9 diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index b2ea9471b..78d6eb054 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -22,8 +22,11 @@ "GIT_SSH", "GIT_SSH_MEMORY_CREDENTIALS", "LIBGIT2_NO_FEATURES_H", + "GIT_HTTPPARSER_HTTPPARSER", "GIT_SHA1_COLLISIONDETECT", "GIT_SHA256_OPENSSL", + "GIT_SSH_LIBSSH2", + "GIT_SSH_LIBSSH2_MEMORY_CREDENTIALS", "GIT_USE_NSEC", "GIT_HTTPS", # Node's util.h may be accidentally included so use this to guard @@ -55,13 +58,14 @@ "libgit2/src/libgit2/commit_list.c", "libgit2/src/libgit2/config.c", "libgit2/src/libgit2/config_cache.c", - "libgit2/src/libgit2/config_entries.c", "libgit2/src/libgit2/config_file.c", + "libgit2/src/libgit2/config_list.c", "libgit2/src/libgit2/config_mem.c", "libgit2/src/libgit2/config_parse.c", "libgit2/src/libgit2/config_snapshot.c", "libgit2/src/libgit2/crlf.c", "libgit2/src/libgit2/delta.c", + "libgit2/src/libgit2/describe.c", "libgit2/src/libgit2/diff.c", "libgit2/src/libgit2/diff_driver.c", "libgit2/src/libgit2/diff_file.c", @@ -72,12 +76,11 @@ "libgit2/src/libgit2/diff_tform.c", "libgit2/src/libgit2/diff_xdiff.c", "libgit2/src/libgit2/email.c", - "libgit2/src/libgit2/errors.c", "libgit2/src/libgit2/fetch.c", "libgit2/src/libgit2/fetchhead.c", "libgit2/src/libgit2/filter.c", - "libgit2/src/libgit2/graph.c", "libgit2/src/libgit2/grafts.c", + "libgit2/src/libgit2/graph.c", "libgit2/src/libgit2/hashsig.c", "libgit2/src/libgit2/ident.c", "libgit2/src/libgit2/idxmap.c", @@ -127,19 +130,20 @@ "libgit2/src/libgit2/revert.c", "libgit2/src/libgit2/revparse.c", "libgit2/src/libgit2/revwalk.c", + "libgit2/src/libgit2/settings.c", "libgit2/src/libgit2/signature.c", "libgit2/src/libgit2/stash.c", "libgit2/src/libgit2/status.c", "libgit2/src/libgit2/strarray.c", "libgit2/src/libgit2/streams/mbedtls.c", "libgit2/src/libgit2/streams/openssl.c", + # "libgit2/src/libgit2/streams/openssl_dynamic.c", "libgit2/src/libgit2/streams/openssl_legacy.c", "libgit2/src/libgit2/streams/registry.c", "libgit2/src/libgit2/streams/socket.c", "libgit2/src/libgit2/submodule.c", "libgit2/src/libgit2/sysdir.c", "libgit2/src/libgit2/tag.c", - "libgit2/src/libgit2/threadstate.c", "libgit2/src/libgit2/trace.c", "libgit2/src/libgit2/trailer.c", "libgit2/src/libgit2/transaction.c", @@ -148,11 +152,14 @@ "libgit2/src/libgit2/transports/credential_helpers.c", "libgit2/src/libgit2/transports/git.c", "libgit2/src/libgit2/transports/httpclient.c", + "libgit2/src/libgit2/transports/httpparser.c", "libgit2/src/libgit2/transports/local.c", "libgit2/src/libgit2/transports/smart.c", "libgit2/src/libgit2/transports/smart_pkt.c", "libgit2/src/libgit2/transports/smart_protocol.c", "libgit2/src/libgit2/transports/ssh.c", + # "libgit2/src/libgit2/transports/ssh_exec.c", + "libgit2/src/libgit2/transports/ssh_libssh2.c", "libgit2/src/libgit2/tree-cache.c", "libgit2/src/libgit2/tree.c", "libgit2/src/libgit2/worktree.c", @@ -168,6 +175,7 @@ "libgit2/src/util/allocators/stdalloc.c", "libgit2/src/util/custom_tls.c", "libgit2/src/util/date.c", + "libgit2/src/util/errors.c", "libgit2/src/util/filebuf.c", "libgit2/src/util/fs_path.c", "libgit2/src/util/futils.c", @@ -185,6 +193,7 @@ "libgit2/src/util/runtime.c", "libgit2/src/util/sortedcache.c", "libgit2/src/util/str.c", + "libgit2/src/util/strlist.c", "libgit2/src/util/strmap.c", "libgit2/src/util/thread.c", "libgit2/src/util/tsort.c", @@ -330,6 +339,7 @@ 4013, ], "sources": [ + # "libgit2/src/libgit2/streams/schannel.c", "libgit2/src/libgit2/transports/winhttp.c", "libgit2/src/util/allocators/win32_leakcheck.c", "libgit2/src/util/win32/dir.c", @@ -338,6 +348,7 @@ "libgit2/src/util/win32/path_w32.c", "libgit2/src/util/win32/posix_w32.c", "libgit2/src/util/win32/precompiled.c", + "libgit2/src/util/win32/process.c", "libgit2/src/util/win32/thread.c", "libgit2/src/util/win32/utf-conv.c", "libgit2/src/util/win32/w32_buffer.c", @@ -350,6 +361,7 @@ ], "sources": [ "libgit2/src/util/unix/map.c", + "libgit2/src/util/unix/process.c", "libgit2/src/util/unix/pthread.c", "libgit2/src/util/unix/realpath.c", ], From 2c8929bb008be3207e4f83fa5d3b9cbe1ea177f3 Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 20 May 2025 09:50:36 -0700 Subject: [PATCH 486/545] support new options structs --- generate/input/descriptor.json | 15 ++++++++++++ generate/input/libgit2-supplement.json | 34 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 828a20311..189805946 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1063,6 +1063,7 @@ "selfFreeing": true }, "config_iterator": { + "needsForwardDeclaration": false, "selfFreeing": true, "fields": { "backend": { @@ -1127,6 +1128,12 @@ } } }, + "config_backend_memory_options": { + "selfFreeing": true, + "cDependencies": [ + "git2/sys/config.h" + ] + }, "credential": { "needsForwardDeclaration": false, "selfFreeing": true, @@ -1509,6 +1516,9 @@ } } }, + "email_create_options": { + "hasConstructor": true + }, "fetch": { "functions": { "git_fetch_init_options": { @@ -4022,6 +4032,11 @@ } } }, + "stash_save_options": { + "dependencies": [ + "../include/str_array_converter.h" + ] + }, "stdalloc": { "ignore": true }, diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 4f1ddf864..d94be9ba0 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1406,6 +1406,40 @@ ] } ], + [ + "git_commit_create_options", + { + "decl": [ + "unsigned int version", + "unsigned int allow_empty_commit : 1", + "const git_signature *author", + "const git_signature *committer", + "const char *message_encoding" + ], + "fields": [ + { + "name": "version", + "type": "unsigned int" + }, + { + "name": "allow_empty_commit", + "type": "unsigned int" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "message_encoding", + "type": "const char *" + } + ] + } + ], [ "git_describe_format_options", { From c425a4c0bec20d32c5d47aba22c0dd37c18a3530 Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 20 May 2025 09:51:09 -0700 Subject: [PATCH 487/545] fix new commit array structs --- generate/input/descriptor.json | 29 ++++++++++++++++++++ generate/templates/partials/convert_to_v8.cc | 16 +++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 189805946..3e305900d 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -799,6 +799,16 @@ } } }, + "commitarray": { + "fields": { + "commits": { + "ignore": true + }, + "count": { + "ignore": true + } + } + }, "config": { "selfFreeing": true, "functions": { @@ -3667,6 +3677,7 @@ "isSingleton": true, "dependencies": [ "git2/sys/repository.h", + "../include/commit.h", "../include/submodule.h", "../include/remote.h" ], @@ -3677,6 +3688,24 @@ "isErrorCode": true } }, + "git_repository_commit_parents": { + "isAsync": true, + "args": { + "commits": { + "shouldAlloc": true, + "selfFreeing": true, + "isReturn": true, + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitCommit", + "size": "count", + "key": "commits" + } + }, + "return": { + "isErrorCode": true + } + }, "git_repository_config": { "args": { "out": { diff --git a/generate/templates/partials/convert_to_v8.cc b/generate/templates/partials/convert_to_v8.cc index 6addc3a1d..ccba9b330 100644 --- a/generate/templates/partials/convert_to_v8.cc +++ b/generate/templates/partials/convert_to_v8.cc @@ -28,7 +28,7 @@ {% if isCppClassIntType %} element = Nan::New<{{ cppClassName }}>(({{ parsedClassName }}){{= parsedName =}}[i]); {% else %} - element = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}[i]); + element = Nan::New<{{ cppClassName }}>({% if needsDereference %}*{% endif %}{{= parsedName =}}[i]); {% endif %} Nan::Set(tmpArray, Nan::New(i), element); } @@ -49,7 +49,19 @@ {% if size %} v8::Local tmpArray = Nan::New({{= parsedName =}}->{{ size }}); for (unsigned int i = 0; i < {{= parsedName =}}->{{ size }}; i++) { - Nan::Set(tmpArray, Nan::New(i), Nan::New({{= parsedName =}}->{{ key }}[i]).ToLocalChecked()); + v8::Local element; + {% if arrayElementCppClassName %} + element = {{ arrayElementCppClassName }}::New( + {{ cType|asElementPointer parsedName }}->{{ key }}[i], + {{ selfFreeing|toBool }} + {% if hasOwner %} + , owners + {% endif %} + ); + {% else %} + element = Nan::New({{= parsedName =}}->{{ key }}[i]).ToLocalChecked(); + {% endif %} + Nan::Set(tmpArray, Nan::New(i), element); } {% else %} v8::Local tmpArray = Nan::New({{= parsedName =}}); From 80bda82c6a5354937362dd9dc6a18573d615a277 Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 20 May 2025 16:06:22 -0700 Subject: [PATCH 488/545] drop win32http --- generate/templates/templates/binding.gyp | 4 ++-- vendor/libgit2.gyp | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 09ca6713c..0f9f49835 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -169,9 +169,9 @@ } }, "libraries": [ - "winhttp.lib", "crypt32.lib", - "rpcrt4.lib" + "rpcrt4.lib", + "secur32.lib" ] } ], diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 78d6eb054..cd3b1c7b3 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -141,6 +141,7 @@ "libgit2/src/libgit2/streams/openssl_legacy.c", "libgit2/src/libgit2/streams/registry.c", "libgit2/src/libgit2/streams/socket.c", + "libgit2/src/libgit2/streams/tls.c", "libgit2/src/libgit2/submodule.c", "libgit2/src/libgit2/sysdir.c", "libgit2/src/libgit2/tag.c", @@ -148,9 +149,11 @@ "libgit2/src/libgit2/trailer.c", "libgit2/src/libgit2/transaction.c", "libgit2/src/libgit2/transport.c", + "libgit2/src/libgit2/transports/auth.c", "libgit2/src/libgit2/transports/credential.c", "libgit2/src/libgit2/transports/credential_helpers.c", "libgit2/src/libgit2/transports/git.c", + "libgit2/src/libgit2/transports/http.c", "libgit2/src/libgit2/transports/httpclient.c", "libgit2/src/libgit2/transports/httpparser.c", "libgit2/src/libgit2/transports/local.c", @@ -256,11 +259,8 @@ "GIT_IO_POLL" # theres a chance this breaks bsd ], "sources": [ - "libgit2/src/libgit2/streams/tls.c", - "libgit2/src/libgit2/transports/auth.c", "libgit2/src/libgit2/transports/auth_gssapi.c", "libgit2/src/libgit2/transports/auth_ntlmclient.c", - "libgit2/src/libgit2/transports/http.c", ], "cflags": [ " Date: Wed, 21 May 2025 12:16:29 -0700 Subject: [PATCH 489/545] drop node 16, 18, test on node 24 and update some dependencies --- .github/workflows/tests.yml | 6 +- package-lock.json | 1476 +++++------------------------------ package.json | 8 +- 3 files changed, 207 insertions(+), 1283 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a9ef00d07..e5e54e3e9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,7 @@ jobs: name: "Linux Tests" strategy: matrix: - node: [16, 18, 20, 22] + node: [20, 22, 24] fail-fast: false runs-on: ubuntu-20.04 steps: @@ -71,7 +71,7 @@ jobs: name: "macOS Tests" strategy: matrix: - node: [16, 18, 20, 22] + node: [20, 22, 24] fail-fast: false runs-on: macOS-13 # This is mostly the same as the Linux steps, waiting for anchor support @@ -122,7 +122,7 @@ jobs: name: Windows Tests strategy: matrix: - node: [16, 18, 20, 22] + node: [20, 22, 24] arch: [x86, x64] fail-fast: false runs-on: windows-2019 diff --git a/package-lock.json b/package-lock.json index c4e3f1604..b619fde28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,15 +17,12 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^10.0.1", - "ramda": "^0.25.0", - "tar-fs": "^2.1.1" + "tar-fs": "^3.0.8" }, "devDependencies": { "aws-sdk": "^2.1095.0", - "cheerio": "^1.0.0-rc.2", "clean-for-publish": "~1.0.2", "combyne": "~0.8.1", - "coveralls": "^3.0.2", "js-beautify": "~1.5.10", "jshint": "^2.10.0", "lcov-result-merger": "^3.1.0", @@ -34,7 +31,7 @@ "walk": "^2.3.9" }, "engines": { - "node": ">= 16" + "node": ">= 20" } }, "node_modules/@ampproject/remapping": { @@ -682,22 +679,6 @@ "node": ">=8" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -778,30 +759,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "node_modules/aws-sdk": { "version": "2.1096.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1096.0.tgz", @@ -822,68 +779,94 @@ "node": ">= 10.0.0" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", + "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true } - ] + } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "tweetnacl": "^0.14.3" + "bare-os": "^3.0.1" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -897,17 +880,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + ] }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -1153,49 +1126,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "dependencies": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1485,18 +1415,6 @@ "color-support": "bin.js" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/combyne": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", @@ -1566,25 +1484,6 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "node_modules/coveralls": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", - "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", - "dev": true, - "dependencies": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" - }, - "bin": { - "coveralls": "bin/coveralls.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1612,46 +1511,6 @@ "node": ">= 8" } }, - "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1733,15 +1592,6 @@ "node": ">= 0.4" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -1767,61 +1617,6 @@ "node": ">=0.3.1" } }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -1869,16 +1664,6 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.90", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", @@ -1908,15 +1693,6 @@ "once": "^1.4.0" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -1985,26 +1761,11 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -2111,29 +1872,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -2155,11 +1893,6 @@ ], "license": "MIT" }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -2284,15 +2017,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -2438,29 +2162,6 @@ "node": ">=4.x" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2523,25 +2224,6 @@ "dev": true, "license": "MIT" }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -2570,21 +2252,6 @@ "node": ">= 14" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -2624,7 +2291,8 @@ "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true }, "node_modules/imurmurhash": { "version": "0.1.4", @@ -2816,12 +2484,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -3083,12 +2745,6 @@ "node": ">=4" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3236,30 +2892,12 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3279,21 +2917,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/keyv": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", @@ -3365,15 +2988,6 @@ "node": ">=0.10.0" } }, - "node_modules/lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", - "dev": true, - "bin": { - "lcov-parse": "bin/cli.js" - } - }, "node_modules/lcov-result-merger": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.3.0.tgz", @@ -3484,15 +3098,6 @@ "dev": true, "license": "MIT" }, - "node_modules/log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true, - "engines": { - "node": ">=0.8.6" - } - }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -3552,27 +3157,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -3715,11 +3299,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "node_modules/mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", @@ -4060,18 +3639,6 @@ "set-blocking": "^2.0.0" } }, - "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -4239,15 +3806,6 @@ "node": ">=6" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4419,21 +3977,6 @@ "node": ">=8" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -4497,12 +4040,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -4568,12 +4105,6 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -4604,24 +4135,6 @@ "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -4643,11 +4156,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -4716,38 +4224,6 @@ "node": ">= 0.10" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4863,7 +4339,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "optional": true }, "node_modules/sax": { "version": "1.2.1", @@ -5012,31 +4488,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", @@ -5062,6 +4513,19 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -5159,34 +4623,28 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "node_modules/tar/node_modules/mkdirp": { @@ -5237,6 +4695,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -5312,48 +4779,11 @@ "node": ">= 0.10" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -5454,15 +4884,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -5503,20 +4924,6 @@ "node": ">= 0.10" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", @@ -6293,18 +5700,6 @@ "indent-string": "^4.0.0" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -6365,27 +5760,6 @@ "sprintf-js": "~1.0.2" } }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "aws-sdk": { "version": "2.1096.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1096.0.tgz", @@ -6403,62 +5777,61 @@ "xml2js": "0.4.19" } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true + "b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "optional": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, + "bare-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", + "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", + "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" } }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "optional": true + }, + "bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "optional": true, "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } + "bare-os": "^3.0.1" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "optional": true, + "requires": { + "streamx": "^2.21.0" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "brace-expansion": { @@ -6625,40 +5998,6 @@ "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - } - }, - "cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - } - }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -6903,15 +6242,6 @@ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "combyne": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", @@ -6982,19 +6312,6 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "coveralls": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", - "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", - "dev": true, - "requires": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" - } - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -7015,34 +6332,6 @@ } } }, - "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -7094,12 +6383,6 @@ "object-keys": "^1.0.12" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -7116,43 +6399,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -7202,16 +6448,6 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "electron-to-chromium": { "version": "1.5.90", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", @@ -7240,12 +6476,6 @@ "once": "^1.4.0" } }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -7297,23 +6527,10 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "find-cache-dir": { "version": "3.3.2", @@ -7400,34 +6617,12 @@ } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -7520,15 +6715,6 @@ "pump": "^3.0.0" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -7651,22 +6837,6 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -7709,18 +6879,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -7745,17 +6903,6 @@ } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -7786,7 +6933,8 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true }, "imurmurhash": { "version": "0.1.4", @@ -7935,12 +7083,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -8127,12 +7269,6 @@ } } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -8262,30 +7398,12 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -8299,18 +7417,6 @@ "graceful-fs": "^4.1.6" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "keyv": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", @@ -8378,12 +7484,6 @@ "invert-kv": "^1.0.0" } }, - "lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", - "dev": true - }, "lcov-result-merger": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.3.0.tgz", @@ -8470,12 +7570,6 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -8521,21 +7615,6 @@ } } }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, "mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -8638,11 +7717,6 @@ "minimist": "^1.2.5" } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", @@ -8885,15 +7959,6 @@ "set-blocking": "^2.0.0" } }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -9023,12 +8088,6 @@ } } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -9159,21 +8218,6 @@ "release-zalgo": "^1.0.0" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -9217,12 +8261,6 @@ } } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9273,12 +8311,6 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -9311,18 +8343,6 @@ } } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -9334,11 +8354,6 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, - "ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -9391,34 +8406,6 @@ "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9496,7 +8483,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "optional": true }, "sax": { "version": "1.2.1", @@ -9607,23 +8594,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", @@ -9645,6 +8615,16 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "requires": { + "bare-events": "^2.2.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -9722,33 +8702,24 @@ } }, "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0", "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - } + "tar-stream": "^3.1.5" } }, "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "test-exclude": { @@ -9778,6 +8749,14 @@ } } }, + "text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "requires": { + "b4a": "^1.6.4" + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -9849,42 +8828,11 @@ "through2": "^2.0.3" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -9947,15 +8895,6 @@ "picocolors": "^1.1.1" } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -9991,17 +8930,6 @@ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", diff --git a/package.json b/package.json index 2406899fa..24f9818b5 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "lib": "./lib" }, "engines": { - "node": ">= 16" + "node": ">= 20" }, "dependencies": { "@axosoft/nan": "^2.22.0-gk.1", @@ -45,15 +45,12 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^10.0.1", - "ramda": "^0.25.0", - "tar-fs": "^2.1.1" + "tar-fs": "^3.0.8" }, "devDependencies": { "aws-sdk": "^2.1095.0", - "cheerio": "^1.0.0-rc.2", "clean-for-publish": "~1.0.2", "combyne": "~0.8.1", - "coveralls": "^3.0.2", "js-beautify": "~1.5.10", "jshint": "^2.10.0", "lcov-result-merger": "^3.1.0", @@ -68,7 +65,6 @@ }, "scripts": { "cov": "npm run cppcov && npm run filtercov && npm run mergecov", - "coveralls": "cat ./test/coverage/merged.lcov | coveralls", "cppcov": "mkdir -p test/coverage/cpp && ./lcov-1.10/bin/lcov --gcov-tool /usr/bin/gcov-4.9 --capture --directory build/Release/obj.target/nodegit/src --output-file test/coverage/cpp/lcov_full.info", "filtercov": "./lcov-1.10/bin/lcov --extract test/coverage/cpp/lcov_full.info $(pwd)/src/* $(pwd)/src/**/* $(pwd)/include/* $(pwd)/include/**/* --output-file test/coverage/cpp/lcov.info && rm test/coverage/cpp/lcov_full.info", "generateJson": "node generate/scripts/generateJson", From 086b2945c5bcb6c619ed34e8a6afa6bfc2564ba5 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 21 May 2025 19:00:04 -0700 Subject: [PATCH 490/545] stop null-checking git_error_last git_errror_last will now return a "no-error" object instead of returning a null pointer --- generate/templates/manual/clone/clone.cc | 2 +- generate/templates/manual/commit/extract_signature.cc | 4 ++-- generate/templates/manual/filter_list/load.cc | 2 +- generate/templates/manual/filter_source/repo.cc | 2 +- generate/templates/manual/patches/convenient_patches.cc | 4 ++-- generate/templates/manual/repository/statistics.cc | 2 +- generate/templates/manual/src/filter_registry.cc | 4 ++-- generate/templates/manual/tree/get_all_filepaths.cc | 2 +- generate/templates/partials/async_function.cc | 4 ++-- generate/templates/partials/convert_from_v8.cc | 8 ++------ generate/templates/partials/sync_function.cc | 2 +- 11 files changed, 16 insertions(+), 20 deletions(-) diff --git a/generate/templates/manual/clone/clone.cc b/generate/templates/manual/clone/clone.cc index e3b0bbc14..02c47ff58 100644 --- a/generate/templates/manual/clone/clone.cc +++ b/generate/templates/manual/clone/clone.cc @@ -120,7 +120,7 @@ void GitClone::CloneWorker::Execute() { baton->error_code = result; - if (result != GIT_OK && git_error_last() != NULL) { + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/commit/extract_signature.cc b/generate/templates/manual/commit/extract_signature.cc index b42e8f188..82a214111 100644 --- a/generate/templates/manual/commit/extract_signature.cc +++ b/generate/templates/manual/commit/extract_signature.cc @@ -31,7 +31,7 @@ NAN_METHOD(GitCommit::ExtractSignature) if (git_oid_fromstr(baton->commit_id, (const char *)strdup(*oidString)) != GIT_OK) { free(baton->commit_id); - if (git_error_last()) { + if (git_error_last()->klass != GIT_ERROR_NONE) { return Nan::ThrowError(git_error_last()->message); } else { return Nan::ThrowError("Unknown Error"); @@ -79,7 +79,7 @@ void GitCommit::ExtractSignatureWorker::Execute() (const char *)baton->field ); - if (baton->error_code != GIT_OK && git_error_last() != NULL) { + if (baton->error_code != GIT_OK) { baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/filter_list/load.cc b/generate/templates/manual/filter_list/load.cc index de15daabb..22e2f1f4f 100644 --- a/generate/templates/manual/filter_list/load.cc +++ b/generate/templates/manual/filter_list/load.cc @@ -119,7 +119,7 @@ void GitFilterList::LoadWorker::Execute() { baton->error_code = result; - if (result != GIT_OK && git_error_last() != NULL) { + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/filter_source/repo.cc b/generate/templates/manual/filter_source/repo.cc index f7cb98bf4..78903d86b 100644 --- a/generate/templates/manual/filter_source/repo.cc +++ b/generate/templates/manual/filter_source/repo.cc @@ -42,7 +42,7 @@ void GitFilterSource::RepoWorker::Execute() { if (baton->error_code == GIT_OK) { baton->out = repo; - } else if (git_error_last() != NULL) { + } else if (git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/patches/convenient_patches.cc b/generate/templates/manual/patches/convenient_patches.cc index e183afb75..8873fe07c 100644 --- a/generate/templates/manual/patches/convenient_patches.cc +++ b/generate/templates/manual/patches/convenient_patches.cc @@ -69,7 +69,7 @@ void GitPatch::ConvenientFromDiffWorker::Execute() { baton->error_code = result; - if (git_error_last() != NULL) { + if (git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } @@ -103,7 +103,7 @@ void GitPatch::ConvenientFromDiffWorker::Execute() { baton->error_code = result; - if (git_error_last() != NULL) { + if (git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } diff --git a/generate/templates/manual/repository/statistics.cc b/generate/templates/manual/repository/statistics.cc index 8b04cc31a..f438bb5f8 100644 --- a/generate/templates/manual/repository/statistics.cc +++ b/generate/templates/manual/repository/statistics.cc @@ -1808,7 +1808,7 @@ void GitRepository::StatisticsWorker::Execute() RepoAnalysis *repoAnalysis = static_cast(baton->out); if ((baton->error_code = repoAnalysis->Analyze()) != GIT_OK) { - if (git_error_last() != NULL) { + if (git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } diff --git a/generate/templates/manual/src/filter_registry.cc b/generate/templates/manual/src/filter_registry.cc index 3cdc89feb..21a7cfbb8 100644 --- a/generate/templates/manual/src/filter_registry.cc +++ b/generate/templates/manual/src/filter_registry.cc @@ -99,7 +99,7 @@ void GitFilterRegistry::RegisterWorker::Execute() { int result = git_filter_register(baton->filter_name, baton->filter, baton->filter_priority); baton->error_code = result; - if (result != GIT_OK && git_error_last() != NULL) { + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } } @@ -204,7 +204,7 @@ void GitFilterRegistry::UnregisterWorker::Execute() { int result = git_filter_unregister(baton->filter_name); baton->error_code = result; - if (result != GIT_OK && git_error_last() != NULL) { + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/manual/tree/get_all_filepaths.cc b/generate/templates/manual/tree/get_all_filepaths.cc index 53334a127..758383980 100644 --- a/generate/templates/manual/tree/get_all_filepaths.cc +++ b/generate/templates/manual/tree/get_all_filepaths.cc @@ -67,7 +67,7 @@ void GitTree::GetAllFilepathsWorker::Execute() std::string buffer; buffer.reserve(4096); baton->error_code = TreeFilepathsHelpers::iterateTreePaths(baton->repo, baton->tree, baton->out, &buffer); - if (baton->error_code != GIT_OK && git_error_last() != NULL) { + if (baton->error_code != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } } diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index 1f3b1eaa3..a294043fa 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -162,14 +162,14 @@ void {{ cppClassName }}::{{ cppFunctionName }}Worker::Execute() { {% if return.isResultOrError %} baton->error_code = result; - if (result < GIT_OK && git_error_last() != NULL) { + if (result < GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } {% elsif return.isErrorCode %} baton->error_code = result; - if (result != GIT_OK && git_error_last() != NULL) { + if (result != GIT_OK && git_error_last()->klass != GIT_ERROR_NONE) { baton->error = git_error_dup(git_error_last()); } diff --git a/generate/templates/partials/convert_from_v8.cc b/generate/templates/partials/convert_from_v8.cc index 8b928e7f4..f33eddd0f 100644 --- a/generate/templates/partials/convert_from_v8.cc +++ b/generate/templates/partials/convert_from_v8.cc @@ -60,11 +60,7 @@ Nan::Utf8String oidString(Nan::To(arrayVal).ToLocalChecked()); if (git_oid_fromstr(&from_{{ name }}[i], (const char *) strdup(*oidString)) != GIT_OK) { - if (git_error_last()) { - return Nan::ThrowError(git_error_last()->message); - } else { - return Nan::ThrowError("Unknown Error"); - } + return Nan::ThrowError(git_error_last()->message); } } else { @@ -94,7 +90,7 @@ if (git_oid_fromstr(oidOut, (const char *) strdup(*oidString)) != GIT_OK) { free(oidOut); - if (git_error_last()) { + if (git_error_last()->klass != GIT_ERROR_NONE) { return Nan::ThrowError(git_error_last()->message); } else { return Nan::ThrowError("Unknown Error"); diff --git a/generate/templates/partials/sync_function.cc b/generate/templates/partials/sync_function.cc index 8868bb5ca..cf6febe67 100644 --- a/generate/templates/partials/sync_function.cc +++ b/generate/templates/partials/sync_function.cc @@ -79,7 +79,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {%endif%} {%endeach%} - if (git_error_last()) { + if (git_error_last()->klass != GIT_ERROR_NONE) { return Nan::ThrowError(git_error_last()->message); } else { return Nan::ThrowError("Unknown Error"); From 0d0622f433de2112bc31fe3f681a02d427d9a88e Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 22 May 2025 11:40:11 -0700 Subject: [PATCH 491/545] update node-gyp --- package-lock.json | 1184 ++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 737 insertions(+), 449 deletions(-) diff --git a/package-lock.json b/package-lock.json index b619fde28..9bf5dc8c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "got": "^11.8.6", "json5": "^2.1.0", "lodash": "^4.17.14", - "node-gyp": "^10.0.1", + "node-gyp": "^11.2.0", "tar-fs": "^3.0.8" }, "devDependencies": { @@ -332,6 +332,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -345,9 +346,10 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -359,6 +361,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -369,12 +372,14 @@ "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -391,6 +396,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -405,6 +411,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -417,6 +424,27 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -527,66 +555,60 @@ } }, "node_modules/@npmcli/agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { "node": ">= 14" } }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -671,6 +693,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -951,11 +974,12 @@ } }, "node_modules/cacache": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", - "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", @@ -963,27 +987,38 @@ "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/cacache/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/cacache/node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -992,19 +1027,33 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { "node": ">=16 || 14 >=14.17" }, @@ -1012,34 +1061,66 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "node_modules/cacache/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { - "node": "14 || >=16.14" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/cacache/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 18" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/cacheable-lookup": { @@ -1206,6 +1287,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, "engines": { "node": ">=6" } @@ -1662,7 +1744,8 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.90", @@ -1704,7 +1787,8 @@ "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT" }, "node_modules/es6-error": { "version": "4.1.1", @@ -1767,6 +1851,20 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "license": "MIT" }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -2230,9 +2328,10 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -2242,12 +2341,10 @@ } }, "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -2306,6 +2403,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "engines": { "node": ">=8" } @@ -2339,10 +2437,24 @@ "node": ">=0.10.0" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" }, "node_modules/is-absolute": { "version": "1.0.0", @@ -2392,11 +2504,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" - }, "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -2659,15 +2766,13 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -2745,6 +2850,12 @@ "node": ">=4" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3106,6 +3217,12 @@ "node": ">=8" } }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -3129,30 +3246,32 @@ } }, "node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", + "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -3203,6 +3322,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -3211,41 +3331,57 @@ } }, "node_modules/minipass-collect/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^3.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, + "node_modules/minipass-fetch/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3257,6 +3393,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3268,6 +3405,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3415,9 +3553,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3442,121 +3581,122 @@ } }, "node_modules/node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", + "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-gyp/node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, + "node_modules/node-gyp/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/node-gyp/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, "engines": { - "node": ">=16" + "node": ">= 18" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/node-gyp/node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/node-gyp/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/node-preload": { @@ -3938,14 +4078,12 @@ } }, "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3977,6 +4115,12 @@ "node": ">=8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -4010,32 +4154,26 @@ } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4047,6 +4185,18 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -4061,11 +4211,12 @@ } }, "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/process-nextick-args": { @@ -4091,6 +4242,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -4279,6 +4431,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -4392,44 +4545,45 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -4489,20 +4643,22 @@ "dev": true }, "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4552,6 +4708,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4577,6 +4734,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4754,6 +4912,22 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", @@ -4814,25 +4988,27 @@ } }, "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "license": "ISC", "dependencies": { - "unique-slug": "^4.0.0" + "unique-slug": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/unique-stream": { @@ -5040,6 +5216,21 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -5047,6 +5238,15 @@ "dev": true, "license": "ISC" }, + "node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -5085,6 +5285,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5452,9 +5653,9 @@ }, "dependencies": { "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" }, "ansi-styles": { "version": "6.2.1", @@ -5496,6 +5697,21 @@ } } }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "requires": { + "minipass": "^7.0.4" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -5579,45 +5795,37 @@ } }, "@npmcli/agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "requires": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "dependencies": { "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "requires": { - "debug": "^4.3.4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" }, "https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "requires": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" } - }, - "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" } } }, "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "requires": { "semver": "^7.3.5" } @@ -5695,6 +5903,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5879,11 +6088,11 @@ "dev": true }, "cacache": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", - "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", "requires": { - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", @@ -5891,10 +6100,10 @@ "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "dependencies": { "brace-expansion": { @@ -5905,6 +6114,11 @@ "balanced-match": "^1.0.0" } }, + "chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + }, "fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -5914,34 +6128,61 @@ } }, "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "requires": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" } }, - "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" - }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "requires": { "brace-expansion": "^2.0.1" } }, "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "requires": { + "minipass": "^7.1.2" + } + }, + "mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" + }, + "tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "requires": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + } + }, + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" } } }, @@ -6066,7 +6307,8 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true }, "cli": { "version": "1.0.1", @@ -6532,6 +6774,12 @@ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, + "fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "requires": {} + }, "find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -6885,21 +7133,18 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "requires": { "agent-base": "^7.1.0", "debug": "^4.3.4" }, "dependencies": { "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "requires": { - "debug": "^4.3.4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" } } }, @@ -6944,7 +7189,8 @@ "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, "inflight": { "version": "1.0.6", @@ -6972,10 +7218,21 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + } + } }, "is-absolute": { "version": "1.0.0", @@ -7013,11 +7270,6 @@ "is-extglob": "^2.1.0" } }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" - }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -7209,9 +7461,9 @@ } }, "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "requires": { "@isaacs/cliui": "^8.0.2", "@pkgjs/parseargs": "^0.11.0" @@ -7269,6 +7521,11 @@ } } }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, "jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -7575,6 +7832,11 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -7591,27 +7853,27 @@ } }, "make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "requires": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", + "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "ssri": "^12.0.0" }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" } } }, @@ -7651,27 +7913,35 @@ }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" } } }, "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", "requires": { "encoding": "^0.1.13", "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^3.0.1" }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "requires": { + "minipass": "^7.1.2" + } } } }, @@ -7812,9 +8082,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" }, "node-fetch": { "version": "2.6.7", @@ -7825,80 +8095,75 @@ } }, "node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", + "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", "requires": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" }, "dependencies": { "abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==" - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } + "chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" }, - "isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "requires": { - "brace-expansion": "^2.0.1" + "minipass": "^7.1.2" } }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + "mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" }, "nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "requires": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" } }, - "which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "requires": { - "isexe": "^3.1.1" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" } + }, + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" } } }, @@ -8193,12 +8458,9 @@ } }, "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==" }, "p-try": { "version": "2.2.0", @@ -8218,6 +8480,11 @@ "release-zalgo": "^1.0.0" } }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -8241,23 +8508,18 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { - "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" - }, "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" } } }, @@ -8267,6 +8529,11 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -8277,9 +8544,9 @@ } }, "proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==" }, "process-nextick-args": { "version": "2.0.1", @@ -8525,31 +8792,28 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "requires": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "requires": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "dependencies": { "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "requires": { - "debug": "^4.3.4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" } } }, @@ -8595,17 +8859,17 @@ "dev": true }, "ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", "requires": { "minipass": "^7.0.3" }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" } } }, @@ -8809,6 +9073,15 @@ "xtend": "~4.0.0" } }, + "tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "requires": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + } + }, "to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", @@ -8855,17 +9128,17 @@ "dev": true }, "unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", "requires": { - "unique-slug": "^4.0.0" + "unique-slug": "^5.0.0" } }, "unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", "requires": { "imurmurhash": "^0.1.4" } @@ -9039,6 +9312,21 @@ "webidl-conversions": "^3.0.0" } }, + "which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "requires": { + "isexe": "^3.1.1" + }, + "dependencies": { + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + } + } + }, "which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", diff --git a/package.json b/package.json index 24f9818b5..7abe3fa73 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "got": "^11.8.6", "json5": "^2.1.0", "lodash": "^4.17.14", - "node-gyp": "^10.0.1", + "node-gyp": "^11.2.0", "tar-fs": "^3.0.8" }, "devDependencies": { From 5ffcfba88189f4e177ba29dc0f715808b16289ba Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 22 May 2025 11:42:07 -0700 Subject: [PATCH 492/545] update linux runner, don't try to build x86 node 24 --- .github/workflows/tests.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e5e54e3e9..806614d0c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,7 +16,7 @@ jobs: matrix: node: [20, 22, 24] fail-fast: false - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Install Dependencies for Ubuntu run: sudo apt-get update && sudo apt-get install -y software-properties-common git build-essential clang libssl-dev libkrb5-dev libc++-dev wget zlib1g-dev @@ -37,7 +37,7 @@ jobs: - uses: actions/setup-python@v5 with: - python-version: "3.6" + python-version: "3.11" - name: Use Node.js uses: actions/setup-node@v4 @@ -124,6 +124,9 @@ jobs: matrix: node: [20, 22, 24] arch: [x86, x64] + exclude: + - node: 24 + arch: x86 fail-fast: false runs-on: windows-2019 steps: From 81daff15381a43615dcffa35cf62156f5282e436 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 22 May 2025 21:17:46 -0700 Subject: [PATCH 493/545] bump got --- package-lock.json | 1617 ++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 1151 insertions(+), 468 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bf5dc8c7..0b7abfc4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@axosoft/nan": "^2.22.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", - "got": "^11.8.6", + "got": "^14.4.7", "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^11.2.0", @@ -55,15 +55,15 @@ "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -221,9 +221,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -231,9 +231,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -251,27 +251,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -281,15 +281,15 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -315,14 +315,14 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -614,64 +614,41 @@ "node": ">=14" } }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", + "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "node": ">=14.16" } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" }, "node_modules/abbrev": { "version": "1.0.9", @@ -782,11 +759,29 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sdk": { - "version": "2.1096.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1096.0.tgz", - "integrity": "sha512-q+hotU57U8bGpz1pf5CkO4z630ay0xGJ9HedahKPZ0Xk3/X0GH+QFYPBWJ5IMTtO30bjfPH0zTaL2vJmMXLBrQ==", + "version": "2.1692.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz", + "integrity": "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==", "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -795,8 +790,9 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" }, "engines": { "node": ">= 10.0.0" @@ -1124,28 +1120,42 @@ } }, "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", + "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", + "license": "MIT", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.4", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.1", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/cacheable-request/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caching-transform": { @@ -1165,13 +1175,50 @@ } }, "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1401,22 +1448,6 @@ "node": ">= 0.10" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", @@ -1507,7 +1538,8 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commondir": { "version": "1.0.1", @@ -1567,9 +1599,10 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1600,11 +1633,12 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1658,10 +1692,29 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1695,10 +1748,26 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -1790,6 +1859,39 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "license": "MIT" }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -1810,8 +1912,9 @@ "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -1937,6 +2040,22 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreachasync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", @@ -1970,6 +2089,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data-encoder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", + "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -2034,10 +2162,14 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gauge": { "version": "3.0.2", @@ -2078,14 +2210,25 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2101,15 +2244,43 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2222,30 +2393,56 @@ "node": ">=4" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", + "version": "14.4.7", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.7.tgz", + "integrity": "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^7.0.1", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^12.0.1", "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^4.0.1", + "responselike": "^3.0.0", + "type-fest": "^4.26.1" }, "engines": { - "node": ">=10.19.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/got/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -2256,27 +2453,56 @@ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.x" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">= 0.4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -2306,11 +2532,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } @@ -2350,12 +2590,13 @@ } }, "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" }, "engines": { "node": ">=10.19.0" @@ -2469,12 +2710,42 @@ "node": ">=0.10.0" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2492,6 +2763,25 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", @@ -2513,6 +2803,25 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -2538,6 +2847,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2687,16 +3012,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -3001,7 +3316,8 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -3029,9 +3345,10 @@ } }, "node_modules/keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -3210,11 +3527,15 @@ "license": "MIT" }, "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru-cache": { @@ -3238,9 +3559,10 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3276,6 +3598,16 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -3442,6 +3774,7 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, + "license": "MIT", "dependencies": { "browser-stdout": "1.3.1", "commander": "2.15.1", @@ -3468,6 +3801,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -3476,7 +3810,9 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3489,20 +3825,12 @@ "node": "*" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/mocha/node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3514,7 +3842,8 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mocha/node_modules/mkdirp": { "version": "0.5.1", @@ -3522,6 +3851,7 @@ "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", "dev": true, + "license": "MIT", "dependencies": { "minimist": "0.0.8" }, @@ -3532,25 +3862,15 @@ "node_modules/mocha/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/negotiator": { "version": "1.0.0", @@ -3746,11 +4066,12 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4041,11 +4362,12 @@ } }, "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/p-limit": { @@ -4210,6 +4532,16 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/proc-log": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", @@ -4301,6 +4633,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4395,7 +4728,8 @@ "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" }, "node_modules/resolve-from": { "version": "5.0.0", @@ -4420,11 +4754,18 @@ } }, "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { @@ -4488,6 +4829,24 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4497,8 +4856,9 @@ "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "dev": true, + "license": "ISC" }, "node_modules/semver": { "version": "7.7.0", @@ -4517,6 +4877,24 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4761,23 +5139,47 @@ "strip-json-comments": "cli.js" }, "engines": { - "node": ">=0.8.0" + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, "node_modules/tar-fs": { @@ -4805,6 +5207,15 @@ "streamx": "^2.15.0" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -5076,19 +5487,33 @@ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true, + "license": "MIT", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/value-or-function": { @@ -5238,6 +5663,28 @@ "dev": true, "license": "ISC" }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -5364,20 +5811,25 @@ } }, "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dev": true, + "license": "MIT", "dependencies": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0" } @@ -5443,14 +5895,14 @@ "integrity": "sha512-C4xrZ5HQoWwoq/WZnKDhf/Jd/czIaa0gsjHV792qUp7b7H+4Xtw1Um10BiiU/zrgmGhQuA92dedU2/rGvKErNg==" }, "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -5567,15 +6019,15 @@ } }, "@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true }, "@babel/helper-validator-option": { @@ -5585,33 +6037,33 @@ "dev": true }, "@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "requires": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "requires": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.27.1" } }, "@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "requires": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" } }, "@babel/traverse": { @@ -5630,13 +6082,13 @@ } }, "@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" } }, "@isaacs/cliui": { @@ -5836,55 +6288,28 @@ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "optional": true }, + "@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" + }, "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", + "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==" }, "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "defer-to-connect": "^2.0.1" } }, "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, "abbrev": { "version": "1.0.9", @@ -5969,10 +6394,19 @@ "sprintf-js": "~1.0.2" } }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "aws-sdk": { - "version": "2.1096.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1096.0.tgz", - "integrity": "sha512-q+hotU57U8bGpz1pf5CkO4z630ay0xGJ9HedahKPZ0Xk3/X0GH+QFYPBWJ5IMTtO30bjfPH0zTaL2vJmMXLBrQ==", + "version": "2.1692.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz", + "integrity": "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==", "dev": true, "requires": { "buffer": "4.9.2", @@ -5982,8 +6416,9 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.6.2" } }, "b4a": { @@ -6187,22 +6622,29 @@ } }, "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==" }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", + "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.4", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.1", + "responselike": "^3.0.0" + }, + "dependencies": { + "mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" + } } }, "caching-transform": { @@ -6218,13 +6660,35 @@ } }, "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" } }, "camelcase": { @@ -6396,21 +6860,6 @@ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - } - } - }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", @@ -6555,9 +7004,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6581,11 +7030,11 @@ "dev": true }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "decamelize": { @@ -6616,6 +7065,17 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -6641,6 +7101,17 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -6728,6 +7199,27 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -6743,7 +7235,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "events": { @@ -6843,6 +7335,15 @@ } } }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "requires": { + "is-callable": "^1.2.7" + } + }, "foreachasync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", @@ -6865,6 +7366,11 @@ } } }, + "form-data-encoder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", + "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==" + }, "fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -6905,9 +7411,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "gauge": { @@ -6939,14 +7445,21 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" } }, "get-package-type": { @@ -6955,12 +7468,30 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "requires": { - "pump": "^3.0.0" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "dependencies": { + "is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==" + } } }, "glob": { @@ -7056,22 +7587,35 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true + }, "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", + "version": "14.4.7", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.7.tgz", + "integrity": "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==", + "requires": { + "@sindresorhus/is": "^7.0.1", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^12.0.1", "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^4.0.1", + "responselike": "^3.0.0", + "type-fest": "^4.26.1" + }, + "dependencies": { + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==" + } } }, "graceful-fs": { @@ -7085,21 +7629,36 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "es-define-property": "^1.0.0" } }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -7115,10 +7674,19 @@ "type-fest": "^0.8.0" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", "dev": true }, "html-escaper": { @@ -7149,12 +7717,12 @@ } }, "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "requires": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" } }, "https-proxy-agent": { @@ -7244,12 +7812,28 @@ "is-windows": "^1.0.1" } }, + "is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7261,6 +7845,18 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + } + }, "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", @@ -7276,6 +7872,18 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, + "is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -7291,6 +7899,15 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.16" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -7405,12 +8022,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -7675,9 +8286,9 @@ } }, "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "requires": { "json-buffer": "3.0.1" } @@ -7828,9 +8439,9 @@ "dev": true }, "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" }, "lru-cache": { "version": "10.4.3", @@ -7846,9 +8457,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -7877,6 +8488,12 @@ } } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, "mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -8029,12 +8646,6 @@ "path-is-absolute": "^1.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -8062,24 +8673,15 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "negotiator": { "version": "1.0.0", @@ -8200,9 +8802,9 @@ } }, "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==" }, "now-and-later": { "version": "2.0.1", @@ -8435,9 +9037,9 @@ } }, "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==" }, "p-limit": { "version": "2.3.0", @@ -8543,6 +9145,12 @@ "find-up": "^4.0.0" } }, + "possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true + }, "proc-log": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", @@ -8706,11 +9314,11 @@ } }, "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "requires": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" } }, "retry": { @@ -8746,6 +9354,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -8755,7 +9374,7 @@ "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "dev": true }, "semver": { @@ -8768,6 +9387,20 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8945,19 +9578,41 @@ "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + } + } + }, "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -9186,15 +9841,28 @@ } } }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true }, "value-or-function": { @@ -9333,6 +10001,21 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -9422,19 +10105,19 @@ } }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dev": true, "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, "xtend": { diff --git a/package.json b/package.json index 7abe3fa73..7391610fc 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@axosoft/nan": "^2.22.0-gk.1", "@mapbox/node-pre-gyp": "^1.0.8", "fs-extra": "^7.0.0", - "got": "^11.8.6", + "got": "^14.4.7", "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^11.2.0", From 1ad275d016675110559a4f5e77b71a5bf80b3240 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 22 May 2025 21:18:06 -0700 Subject: [PATCH 494/545] bump mocha --- package-lock.json | 928 +++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 746 insertions(+), 184 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b7abfc4a..510d0fb90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "js-beautify": "~1.5.10", "jshint": "^2.10.0", "lcov-result-merger": "^3.1.0", - "mocha": "^5.2.0", + "mocha": "^11.4.0", "nyc": "^17.1.0", "walk": "^2.3.9" }, @@ -1254,6 +1254,52 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1534,13 +1580,6 @@ "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", "dev": true }, - "node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true, - "license": "MIT" - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1744,9 +1783,9 @@ } }, "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -1910,13 +1949,16 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/events": { @@ -2000,6 +2042,16 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, "node_modules/flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -2448,16 +2500,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2546,9 +2588,9 @@ } }, "node_modules/he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { @@ -2803,6 +2845,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -2881,6 +2933,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -3526,6 +3591,23 @@ "dev": true, "license": "MIT" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -3770,101 +3852,280 @@ } }, "node_modules/mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.4.0.tgz", + "integrity": "sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 4.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/mocha/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mocha/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/mocha/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "node_modules/mocha/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/mocha/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "0.0.8" + "yocto-queue": "^0.1.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } }, "node_modules/ms": { "version": "2.1.3", @@ -4641,6 +4902,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -4654,6 +4925,20 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -4872,6 +5157,16 @@ "node": ">=10" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5143,26 +5438,19 @@ } }, "node_modules/supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/tar": { @@ -5714,6 +6002,13 @@ "node": ">= 0.10.0" } }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -5876,6 +6171,61 @@ "engines": { "node": ">=10" } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -6703,6 +7053,36 @@ "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", "dev": true }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -6939,12 +7319,6 @@ "integrity": "sha1-WJ3kcEXVcVbcHs4YXWTDidzLR9g=", "dev": true }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -7096,9 +7470,9 @@ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true }, "dunder-proto": { @@ -7233,9 +7607,9 @@ "dev": true }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "events": { @@ -7293,6 +7667,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -7623,12 +8003,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7684,9 +8058,9 @@ } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "html-escaper": { @@ -7872,6 +8246,12 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -7923,6 +8303,12 @@ "unc-path-regex": "^0.1.2" } }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -8438,6 +8824,16 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, "lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -8605,75 +9001,187 @@ } }, "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.4.0.tgz", + "integrity": "sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A==", + "dev": true, + "requires": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "ms": "2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "dependencies": { + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "yocto-queue": "^0.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } @@ -9229,6 +9737,15 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -9239,6 +9756,12 @@ "util-deprecate": "^1.0.1" } }, + "readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -9382,6 +9905,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==" }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -9579,20 +10111,12 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - } + "has-flag": "^4.0.0" } }, "tar": { @@ -10030,6 +10554,12 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, + "workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -10156,6 +10686,38 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 7391610fc..acd56f33b 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "js-beautify": "~1.5.10", "jshint": "^2.10.0", "lcov-result-merger": "^3.1.0", - "mocha": "^5.2.0", + "mocha": "^11.4.0", "nyc": "^17.1.0", "walk": "^2.3.9" }, From 2a1fb8882e7ed10964541a3c61c6dc7182c780b4 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 22 May 2025 21:24:48 -0700 Subject: [PATCH 495/545] bump node-pre-gyp --- package-lock.json | 922 ++++++++++++---------------------------------- package.json | 2 +- 2 files changed, 229 insertions(+), 695 deletions(-) diff --git a/package-lock.json b/package-lock.json index 510d0fb90..39c9bf6cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "@axosoft/nan": "^2.22.0-gk.1", - "@mapbox/node-pre-gyp": "^1.0.8", + "@mapbox/node-pre-gyp": "^2.0.0", "fs-extra": "^7.0.0", "got": "^14.4.7", "json5": "^2.1.0", @@ -536,22 +536,24 @@ } }, "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "dependencies": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" } }, "node_modules/@npmcli/agent": { @@ -570,28 +572,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@npmcli/fs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", @@ -653,17 +633,16 @@ "node_modules/abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/aggregate-error": { @@ -726,11 +705,6 @@ "node": ">=8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -738,18 +712,6 @@ "dev": true, "license": "MIT" }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -905,6 +867,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1001,15 +964,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/cacache/node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -1066,59 +1020,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/cacache/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -1301,11 +1202,12 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/clean-for-publish": { @@ -1566,14 +1468,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/combyne": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", @@ -1590,7 +1484,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "node_modules/config-chain": { "version": "1.1.13", @@ -1602,6 +1497,15 @@ "proto-list": "~1.2.1" } }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -1611,11 +1515,6 @@ "date-now": "^0.1.4" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1766,20 +1665,13 @@ "node": ">= 0.4" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/diff": { @@ -2184,17 +2076,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -2211,7 +2092,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "node_modules/function-bind": { "version": "1.1.2", @@ -2223,25 +2105,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2552,11 +2415,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -2622,15 +2480,6 @@ "node": ">= 14" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", @@ -2645,15 +2494,16 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/iconv-lite": { @@ -2695,6 +2545,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2703,7 +2554,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", @@ -3630,6 +3482,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -3644,6 +3497,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3705,6 +3559,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3779,18 +3634,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minipass-fetch/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -3828,15 +3671,24 @@ } }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">= 8" + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { @@ -4185,101 +4037,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/node-gyp/node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/node-gyp/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -4301,17 +4058,27 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", "dependencies": { - "abbrev": "1" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nopt/node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/normalize-path": { @@ -4350,17 +4117,6 @@ "node": ">= 0.10" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -4528,14 +4284,6 @@ "node": ">=6" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4724,6 +4472,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4912,19 +4661,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -5066,6 +4802,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -5080,6 +4817,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5099,6 +4837,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -5170,7 +4909,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "node_modules/set-function-length": { "version": "1.2.2", @@ -5212,7 +4952,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/smart-buffer": { "version": "4.2.0", @@ -5252,15 +4993,6 @@ "node": ">= 14" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -5355,14 +5087,6 @@ "bare-events": "^2.2.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5454,20 +5178,20 @@ } }, "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "license": "ISC", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tar-fs": { @@ -5496,23 +5220,36 @@ } }, "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", "bin": { - "mkdirp": "bin/cmd.js" + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/test-exclude": { @@ -5792,7 +5529,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "node_modules/uuid": { "version": "8.0.0", @@ -5982,14 +5720,6 @@ "node": ">=16" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/window-size": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", @@ -6581,19 +6311,17 @@ } }, "@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", + "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", + "requires": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" } }, "@npmcli/agent": { @@ -6606,22 +6334,6 @@ "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.3" - }, - "dependencies": { - "agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" - }, - "https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "requires": { - "agent-base": "^7.1.2", - "debug": "4" - } - } } }, "@npmcli/fs": { @@ -6664,15 +6376,13 @@ "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" }, "aggregate-error": { "version": "3.1.0", @@ -6715,26 +6425,12 @@ "default-require-extensions": "^3.0.0" } }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -6832,6 +6528,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6899,11 +6596,6 @@ "balanced-match": "^1.0.0" } }, - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, "fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -6937,37 +6629,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" - }, - "minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "requires": { - "minipass": "^7.1.2" - } - }, - "mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" - }, - "tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - } - }, - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" } } }, @@ -7084,9 +6745,9 @@ } }, "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" }, "clean-for-publish": { "version": "1.0.4", @@ -7308,11 +6969,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, "combyne": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/combyne/-/combyne-0.8.1.tgz", @@ -7328,7 +6984,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "config-chain": { "version": "1.1.13", @@ -7340,6 +6997,11 @@ "proto-list": "~1.2.1" } }, + "consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -7349,11 +7011,6 @@ "date-now": "^0.1.4" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -7459,15 +7116,10 @@ "object-keys": "^1.0.12" } }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" }, "diff": { "version": "7.0.0", @@ -7767,14 +7419,6 @@ "universalify": "^0.1.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -7788,7 +7432,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "function-bind": { "version": "1.1.2", @@ -7796,22 +7441,6 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8033,11 +7662,6 @@ "has-symbols": "^1.0.3" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -8081,13 +7705,6 @@ "requires": { "agent-base": "^7.1.0", "debug": "^4.3.4" - }, - "dependencies": { - "agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" - } } }, "http2-wrapper": { @@ -8100,11 +7717,11 @@ } }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "requires": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" } }, @@ -8138,6 +7755,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -8146,7 +7764,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "1.3.8", @@ -8848,6 +8467,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "requires": { "semver": "^6.0.0" }, @@ -8855,7 +8475,8 @@ "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, @@ -8899,6 +8520,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -8947,14 +8569,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" - }, - "minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "requires": { - "minipass": "^7.1.2" - } } } }, @@ -8983,12 +8597,18 @@ } }, "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } } }, "mkdirp": { @@ -9219,62 +8839,6 @@ "tar": "^7.4.3", "tinyglobby": "^0.2.12", "which": "^5.0.0" - }, - "dependencies": { - "abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" - }, - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" - }, - "minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "requires": { - "minipass": "^7.1.2" - } - }, - "mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" - }, - "nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "requires": { - "abbrev": "^3.0.0" - } - }, - "tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - } - }, - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" - } } }, "node-preload": { @@ -9293,11 +8857,18 @@ "dev": true }, "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "requires": { - "abbrev": "1" + "abbrev": "^3.0.0" + }, + "dependencies": { + "abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" + } } }, "normalize-path": { @@ -9323,17 +8894,6 @@ "once": "^1.3.2" } }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -9463,11 +9023,6 @@ } } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -9610,7 +9165,8 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", @@ -9746,16 +9302,6 @@ "safe-buffer": "^5.1.0" } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -9853,6 +9399,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { "glob": "^7.1.3" }, @@ -9861,6 +9408,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9875,7 +9423,8 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, "safe-regex-test": { "version": "1.1.0", @@ -9917,7 +9466,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "set-function-length": { "version": "1.2.2", @@ -9949,7 +9499,8 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "smart-buffer": { "version": "4.2.0", @@ -9973,13 +9524,6 @@ "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" - }, - "dependencies": { - "agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" - } } }, "spawn-wrap": { @@ -10054,14 +9598,6 @@ "text-decoder": "^1.1.0" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -10120,27 +9656,32 @@ } }, "tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "requires": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "dependencies": { "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" + }, + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" } } }, @@ -10381,7 +9922,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "8.0.0", @@ -10540,14 +10082,6 @@ "has-tostringtag": "^1.0.2" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "window-size": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", diff --git a/package.json b/package.json index acd56f33b..54e40fcc9 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "dependencies": { "@axosoft/nan": "^2.22.0-gk.1", - "@mapbox/node-pre-gyp": "^1.0.8", + "@mapbox/node-pre-gyp": "^2.0.0", "fs-extra": "^7.0.0", "got": "^14.4.7", "json5": "^2.1.0", From 7ffbed53f74a161ef9c98c13f91ee40a054d0399 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 23 May 2025 08:58:47 -0700 Subject: [PATCH 496/545] esm-ify acquireOpenSSL --- generate/templates/templates/binding.gyp | 2 +- .../{acquireOpenSSL.js => acquireOpenSSL.mjs} | 63 +++++++++---------- 2 files changed, 30 insertions(+), 35 deletions(-) rename utils/{acquireOpenSSL.js => acquireOpenSSL.mjs} (90%) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 0f9f49835..23accc310 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -22,7 +22,7 @@ ["<(is_electron) == 1 and (digest) => { // currently this only needs to be done on linux const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { try { - for (const patchFilename of await fse.readdir(opensslPatchPath)) { + for (const patchFilename of await fs.readdir(opensslPatchPath)) { const patchTarget = patchFilename.split("-")[1]; if (patchFilename.split(".").pop() === "patch" && (patchTarget === operatingSystem || patchTarget === "all")) { console.log(`applying ${patchFilename}`); @@ -78,7 +76,7 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { throw new Error("Expected macOsDeploymentTarget to be specified"); } - const arguments = [ + const configureArgs = [ process.arch === "x64" ? "darwin64-x86_64-cc" : "darwin64-arm64-cc", // speed up ecdh on little-endian platforms with 128bit int support "enable-ec_nistp_64_gcc_128", @@ -95,7 +93,7 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { `-mmacosx-version-min=${macOsDeploymentTarget}` ]; - await execPromise(`./Configure ${arguments.join(" ")}`, { + await execPromise(`./Configure ${configureArgs.join(" ")}`, { cwd: buildCwd }, { pipeOutput: true }); @@ -117,7 +115,7 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { }; const buildLinux = async (buildCwd) => { - const arguments = [ + const configureArgs = [ "linux-x86_64", // Electron(at least on centos7) imports the libcups library at runtime, which has a // dependency on the system libssl/libcrypto which causes symbol conflicts and segfaults. @@ -134,7 +132,7 @@ const buildLinux = async (buildCwd) => { `--prefix="${extractPath}"`, `--openssldir="${extractPath}"` ]; - await execPromise(`./Configure ${arguments.join(" ")}`, { + await execPromise(`./Configure ${configureArgs.join(" ")}`, { cwd: buildCwd }, { pipeOutput: true }); @@ -217,7 +215,7 @@ const removeOpenSSLIfOudated = async (openSSLVersion) => { } console.log("Removing outdated OpenSSL at: ", extractPath); - await fse.remove(extractPath); + await fs.rm(extractPath, { recursive: true, force: true }); console.log("Outdated OpenSSL removed."); } catch (err) { console.log("Remove outdated OpenSSL failed: ", err); @@ -361,14 +359,14 @@ const buildPackage = async () => { return path.extname(name) === ".pc" || path.basename(name) === "pkgconfig"; }, - dmode: 0755, - fmode: 0644 + dmode: 0o0755, + fmode: 0o0644 }), zlib.createGzip(), new HashVerify("sha256", (digest) => { resolve(digest); }), - fsNonPromise.createWriteStream(getOpenSSLPackageName()) + createWriteStream(getOpenSSLPackageName()) ); const digest = await promise; await fs.writeFile(`${getOpenSSLPackageName()}.sha256`, digest); @@ -422,15 +420,12 @@ const acquireOpenSSL = async () => { } }; -module.exports = { - acquireOpenSSL, - getOpenSSLPackageName, - OPENSSL_VERSION -}; - -if (require.main === module) { - acquireOpenSSL().catch((error) => { +if (process.argv[1] === import.meta.filename) { + try { + await acquireOpenSSL(); + } + catch(error) { console.error("Acquire OpenSSL failed: ", error); process.exit(1); - }); + }; } From 523b698e03f7be461d35b0bdacb09efe70770a0f Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 23 May 2025 09:22:52 -0700 Subject: [PATCH 497/545] fix dependency graph fix dependency graph --- generate/templates/templates/binding.gyp | 32 -------------------- vendor/libgit2.gyp | 5 ++-- vendor/libssh2.gyp | 38 ++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 34 deletions(-) create mode 100644 vendor/libssh2.gyp diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 23accc310..61cad0cb5 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -15,41 +15,9 @@ }, "targets": [ - { - "target_name": "acquireOpenSSL", - "type": "none", - "conditions": [ - ["<(is_electron) == 1 and Date: Tue, 27 May 2025 10:30:12 -0700 Subject: [PATCH 498/545] bump to v0.28.0-alpha.31 --- CHANGELOG.md | 22 ++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af39f9095..4a7ad1d86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Change Log +## v0.28.0-alpha.31 [(2025-05-27)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.31) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.30...v0.28.0-alpha.31) + +#### Summary of Changes +- bump libgit2 from v1.7.2 to v1.8.4 +- update several npm dependencies for deprecations and vulnerabilities + +#### Merged PRs into NodeGit +- [Dependency/Process Updates](https://github.com/nodegit/nodegit/pull/2019) +- [Bump libgit2 to 1.8.4, CI Updates](https://github.com/nodegit/nodegit/pull/2018) + +## v0.28.0-alpha.30 [(2025-02-13)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.30) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.29...v0.28.0-alpha.30) + +#### Summary of Changes +- Fix windows build + +#### Merged PRs into NodeGit +- [define NOMINMAX on windows](https://github.com/nodegit/nodegit/pull/2016) + ## v0.28.0-alpha.29 [(2025-02-11)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.29) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.28...v0.28.0-alpha.29) diff --git a/package-lock.json b/package-lock.json index 39c9bf6cc..88ca39784 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.30", + "version": "0.28.0-alpha.31", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.30", + "version": "0.28.0-alpha.31", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 54e40fcc9..f41fd06bb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.30", + "version": "0.28.0-alpha.31", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 70a33c483dec44b38613f909d65a98597076fdfc Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 28 May 2025 08:46:39 -0700 Subject: [PATCH 499/545] fix electron dependencies again --- vendor/libgit2.gyp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index c2deffca9..36dc305e5 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -242,13 +242,15 @@ ["OS=='mac' or OS=='linux' or OS.endswith('bsd') or <(is_IBMi) == 1", { "conditions": [ ["<(is_electron) == 1 and <(electron_openssl_static) == 1", { + "dependencies": [ + "./libssh2.gyp:acquireOpenSSL", + ], "include_dirs": [ "<(electron_openssl_root)/include" ] }] ], "dependencies": [ - "./libssh2.gyp:acquireOpenSSL", "ntlmclient" ], "include_dirs": [ @@ -299,6 +301,9 @@ ], "conditions": [ ["<(is_electron) == 1", { + "dependencies": [ + "./libssh2.gyp:acquireOpenSSL", + ], "include_dirs": [ "<(electron_openssl_root)/include" ] From 0ac2964e9af791d59c5f4c2f72e89930555c8910 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 28 May 2025 13:03:47 -0700 Subject: [PATCH 500/545] bump to v0.28.0-alpha.32 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a7ad1d86..cc2936029 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.32 [(2025-05-28)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.32) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.31...v0.28.0-alpha.32) + +#### Summary of Changes + - fix windows build on electron + +#### Merged PRs into NodeGit +- [fix electron dependencies again](https://github.com/nodegit/nodegit/pull/2020) + ## v0.28.0-alpha.31 [(2025-05-27)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.31) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.30...v0.28.0-alpha.31) diff --git a/package-lock.json b/package-lock.json index 88ca39784..0f666729a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.31", + "version": "0.28.0-alpha.32", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.31", + "version": "0.28.0-alpha.32", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index f41fd06bb..f592e17fb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.31", + "version": "0.28.0-alpha.32", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 7b34e820a95705cc7abc92769bb014a5b33b663e Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 3 Jun 2025 10:57:16 -0700 Subject: [PATCH 501/545] fix non-standard import assertion --- utils/acquireOpenSSL.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index 9a8c66254..1d83f540b 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -12,7 +12,7 @@ import { promisify } from "util"; const pipeline = promisify(stream.pipeline); -import packageJson from '../package.json' assert { type: "json" }; +import packageJson from '../package.json' with { type: "json" }; const OPENSSL_VERSION = "1.1.1t"; const win32BatPath = path.join(import.meta.dirname, "build-openssl.bat"); From f200f22a13c34272b614afa6a64f6c38d375aeb3 Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 3 Jun 2025 10:57:39 -0700 Subject: [PATCH 502/545] bump tar-fs to address vulnerability --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f666729a..4543c3720 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^11.2.0", - "tar-fs": "^3.0.8" + "tar-fs": "^3.0.9" }, "devDependencies": { "aws-sdk": "^2.1095.0", @@ -5195,9 +5195,9 @@ } }, "node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", + "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -9686,9 +9686,9 @@ } }, "tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", + "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", "requires": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0", diff --git a/package.json b/package.json index f592e17fb..e6f32a5e4 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "json5": "^2.1.0", "lodash": "^4.17.14", "node-gyp": "^11.2.0", - "tar-fs": "^3.0.8" + "tar-fs": "^3.0.9" }, "devDependencies": { "aws-sdk": "^2.1095.0", From 3914838700dfb9051abb5144721b6585d18e8583 Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 3 Jun 2025 11:04:17 -0700 Subject: [PATCH 503/545] update windows runner --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 806614d0c..3a2f8cc7a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -128,7 +128,7 @@ jobs: - node: 24 arch: x86 fail-fast: false - runs-on: windows-2019 + runs-on: windows-2022 steps: - name: Setup Environment run: | From 6d3d13b0b49af9645cdd5b114ee7479285fdb833 Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 3 Jun 2025 13:24:45 -0700 Subject: [PATCH 504/545] bump to 0.28.0-alpha.33 --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc2936029..6144c3cf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## v0.28.0-alpha.33 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.33) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.32...v0.28.0-alpha.33) + +#### Summary of Changes + - fix non-standard import assertion + - update tar-fs + +#### Merged PRs into NodeGit +- [Fix Invalid Import Assertion, Bump tar-fs](https://github.com/nodegit/nodegit/pull/2022) + ## v0.28.0-alpha.32 [(2025-05-28)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.32) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.31...v0.28.0-alpha.32) diff --git a/package-lock.json b/package-lock.json index 4543c3720..3252303b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.32", + "version": "0.28.0-alpha.33", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.32", + "version": "0.28.0-alpha.33", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e6f32a5e4..9aee7445e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.32", + "version": "0.28.0-alpha.33", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 51650c7b4b7d65b35c80d4c62ead63072c54fbcc Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 23 Jul 2025 09:28:20 -0700 Subject: [PATCH 505/545] bump to 0.28.0-alpha.34 --- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6144c3cf3..12d3a9dce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## v0.28.0-alpha.34 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.34) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.33...v0.28.0-alpha.34) + +#### Summary of Changes + - Empty release to fix downstream issues + +#### Merged PRs into NodeGit +- None + ## v0.28.0-alpha.33 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.33) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.32...v0.28.0-alpha.33) diff --git a/package-lock.json b/package-lock.json index 3252303b3..25edeaf61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.33", + "version": "0.28.0-alpha.34", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.33", + "version": "0.28.0-alpha.34", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 9aee7445e..e8bcaa4f2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.33", + "version": "0.28.0-alpha.34", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 8b09425f00b7401e8df4fe457710161fdc2e655d Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 10:10:09 -0700 Subject: [PATCH 506/545] add workflow for building openssl packages --- .github/workflows/build-openssl-packages.yml | 40 ++++++++++++++++++++ package.json | 1 + utils/uploadOpenSSL.mjs | 29 ++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 .github/workflows/build-openssl-packages.yml create mode 100644 utils/uploadOpenSSL.mjs diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml new file mode 100644 index 000000000..f9b8ab7b0 --- /dev/null +++ b/.github/workflows/build-openssl-packages.yml @@ -0,0 +1,40 @@ +name: Build and Publish OpenSSL Packages + +on: + workflow_dispatch: + push: + branches: + - master + +jobs: + build-openssl: + name: Build OpenSSL package for (${{ matrix.os }} ${{ matrix.arch }}) + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-13, windows-2022] + arch: [x64, arm64] + fail-fast: false + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + architecture: ${{ matrix.arch }} + + - name: Install dependencies + run: npm install + + - name: Build OpenSSL packages + run: node utils/acquireOpenSSL.js + + - name: Push OpenSSL package to S3 + env: + node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} + AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} + run: node utils/uploadOpenSSL.js \ No newline at end of file diff --git a/package.json b/package.json index e8bcaa4f2..fe1273285 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "walk": "^2.3.9" }, "binary": { + "bucket_name": "axonodegit", "module_name": "nodegit", "module_path": "./build/Release/", "host": "https://axonodegit.s3.amazonaws.com/nodegit/nodegit/" diff --git a/utils/uploadOpenSSL.mjs b/utils/uploadOpenSSL.mjs new file mode 100644 index 000000000..784379cb6 --- /dev/null +++ b/utils/uploadOpenSSL.mjs @@ -0,0 +1,29 @@ +import aws from 'aws-sdk'; +import fs from "fs"; +import path from "path"; + +import pkgJson from './package.json' assert { type: "json" }; +import { getOpenSSLPackageName } from './acquireOpenSSL'; + +const s3 = new aws.S3(); + +const uploadBinaryToS3 = (binaryName, bucketName, pathToFile) => + s3.upload({ + Body: fs.createReadStream(pathToFile), + Bucket: bucketName, + Key: binaryName, + ACL: "public-read" + }).promise(); + +export const uploadOpenSSL = async () => { + const binaryName = getOpenSSLPackageName(); + const pathToFile = path.join(import.meta.dirname, binaryName); + return uploadBinaryToS3(binaryName, pkgJson.binary.bucket_name, pathToFile); +}; + +if (require.main === module) { + uploadOpenSSL().catch((error) => { + console.error('Push to S3 failed: ', error); + process.exit(1); + }); +} From ccb0c580aedff9c2886e0778228f450ef69d23db Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 14:16:58 -0700 Subject: [PATCH 507/545] update submodule, docs, and build-script --- generate/input/libgit2-docs.json | 7051 ++++++++++++++++-------------- vendor/libgit2 | 2 +- vendor/libgit2.gyp | 5 +- 3 files changed, 3785 insertions(+), 3273 deletions(-) diff --git a/generate/input/libgit2-docs.json b/generate/input/libgit2-docs.json index 5870c608a..e1969402e 100644 --- a/generate/input/libgit2-docs.json +++ b/generate/input/libgit2-docs.json @@ -12,7 +12,7 @@ "git_annotated_commit_free" ], "meta": {}, - "lines": 121 + "lines": 128 }, { "file": "git2/apply.h", @@ -24,7 +24,7 @@ "git_apply" ], "meta": {}, - "lines": 161 + "lines": 182 }, { "file": "git2/attr.h", @@ -41,21 +41,25 @@ "git_attr_add_macro" ], "meta": {}, - "lines": 363 + "lines": 378 }, { "file": "git2/blame.h", "functions": [ "git_blame_options_init", + "git_blame_linecount", + "git_blame_hunkcount", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_line_byindex", "git_blame_get_hunk_count", "git_blame_get_hunk_byindex", "git_blame_get_hunk_byline", - "git_blame_file", "git_blame_buffer", "git_blame_free" ], "meta": {}, - "lines": 280 + "lines": 385 }, { "file": "git2/blob.h", @@ -79,7 +83,7 @@ "git_blob_dup" ], "meta": {}, - "lines": 307 + "lines": 350 }, { "file": "git2/branch.h", @@ -104,13 +108,13 @@ "git_branch_name_is_valid" ], "meta": {}, - "lines": 332 + "lines": 339 }, { "file": "git2/buffer.h", "functions": ["git_buf_dispose"], "meta": {}, - "lines": 68 + "lines": 71 }, { "file": "git2/cert.h", @@ -130,7 +134,7 @@ "git_checkout_tree" ], "meta": {}, - "lines": 413 + "lines": 463 }, { "file": "git2/cherrypick.h", @@ -140,7 +144,7 @@ "git_cherrypick" ], "meta": {}, - "lines": 86 + "lines": 94 }, { "file": "git2/clone.h", @@ -151,7 +155,7 @@ "git_clone" ], "meta": {}, - "lines": 205 + "lines": 220 }, { "file": "git2/commit.h", @@ -192,7 +196,7 @@ "git_commitarray_dispose" ], "meta": {}, - "lines": 603 + "lines": 670 }, { "file": "git2/common.h", @@ -200,10 +204,11 @@ "git_libgit2_version", "git_libgit2_prerelease", "git_libgit2_features", + "git_libgit2_feature_backend", "git_libgit2_opts" ], "meta": {}, - "lines": 530 + "lines": 569 }, { "file": "git2/config.h", @@ -220,6 +225,7 @@ "git_config_open_ondisk", "git_config_open_level", "git_config_open_global", + "git_config_set_writeorder", "git_config_snapshot", "git_config_free", "git_config_get_entry", @@ -254,7 +260,7 @@ "git_config_lock" ], "meta": {}, - "lines": 818 + "lines": 847 }, { "file": "git2/credential.h", @@ -268,12 +274,14 @@ "git_credential_username_new", "git_credential_ssh_key_new", "git_credential_ssh_key_memory_new", + "git_credential_ssh_interactive_cb", "git_credential_ssh_interactive_new", "git_credential_ssh_key_from_agent", + "git_credential_sign_cb", "git_credential_ssh_custom_new" ], "meta": {}, - "lines": 311 + "lines": 338 }, { "file": "git2/credential_helpers.h", @@ -311,7 +319,7 @@ "git_blame_init_options" ], "meta": {}, - "lines": 905 + "lines": 1035 }, { "file": "git2/describe.h", @@ -324,7 +332,7 @@ "git_describe_result_free" ], "meta": {}, - "lines": 189 + "lines": 201 }, { "file": "git2/diff.h", @@ -368,22 +376,19 @@ "git_diff_patchid" ], "meta": {}, - "lines": 1471 + "lines": 1502 }, { "file": "git2/email.h", - "functions": [ - "git_email_create_from_diff", - "git_email_create_from_commit" - ], + "functions": ["git_email_create_from_commit"], "meta": {}, - "lines": 122 + "lines": 102 }, { "file": "git2/errors.h", "functions": ["git_error_last"], "meta": {}, - "lines": 139 + "lines": 149 }, { "file": "git2/filter.h", @@ -400,13 +405,13 @@ "git_filter_list_free" ], "meta": {}, - "lines": 269 + "lines": 278 }, { "file": "git2/global.h", "functions": ["git_libgit2_init", "git_libgit2_shutdown"], "meta": {}, - "lines": 39 + "lines": 45 }, { "file": "git2/graph.h", @@ -426,12 +431,14 @@ "git_ignore_path_is_ignored" ], "meta": {}, - "lines": 74 + "lines": 83 }, { "file": "git2/index.h", "functions": [ "git_index_matched_path_cb", + "git_index_open", + "git_index_new", "git_index_free", "git_index_owner", "git_index_caps", @@ -475,7 +482,7 @@ "git_index_conflict_iterator_free" ], "meta": {}, - "lines": 844 + "lines": 928 }, { "file": "git2/indexer.h", @@ -490,7 +497,7 @@ "git_indexer_free" ], "meta": {}, - "lines": 191 + "lines": 207 }, { "file": "git2/mailmap.h", @@ -504,7 +511,7 @@ "git_mailmap_resolve_signature" ], "meta": {}, - "lines": 111 + "lines": 116 }, { "file": "git2/merge.h", @@ -527,7 +534,7 @@ "git_merge" ], "meta": {}, - "lines": 622 + "lines": 666 }, { "file": "git2/message.h", @@ -539,31 +546,16 @@ "meta": {}, "lines": 81 }, - { "file": "git2/net.h", "functions": [], "meta": {}, "lines": 50 }, + { "file": "git2/net.h", "functions": [], "meta": {}, "lines": 51 }, { "file": "git2/notes.h", "functions": [ "git_note_foreach_cb", - "git_note_iterator_new", - "git_note_commit_iterator_new", "git_note_iterator_free", - "git_note_next", - "git_note_read", - "git_note_commit_read", - "git_note_author", - "git_note_committer", - "git_note_message", - "git_note_id", - "git_note_create", - "git_note_commit_create", - "git_note_remove", - "git_note_commit_remove", - "git_note_free", - "git_note_default_ref", - "git_note_foreach" + "git_note_next" ], "meta": {}, - "lines": 302 + "lines": 91 }, { "file": "git2/object.h", @@ -584,12 +576,14 @@ "git_object_rawcontent_is_valid" ], "meta": {}, - "lines": 273 + "lines": 274 }, { "file": "git2/odb.h", "functions": [ "git_odb_foreach_cb", + "git_odb_new", + "git_odb_open", "git_odb_add_disk_alternate", "git_odb_free", "git_odb_read", @@ -610,6 +604,8 @@ "git_odb_open_rstream", "git_odb_write_pack", "git_odb_write_multi_pack_index", + "git_odb_hash", + "git_odb_hashfile", "git_odb_object_dup", "git_odb_object_free", "git_odb_object_id", @@ -623,12 +619,25 @@ "git_odb_set_commit_graph" ], "meta": {}, - "lines": 650 + "lines": 691 + }, + { + "file": "git2/odb_backend.h", + "functions": [ + "git_odb_backend_pack", + "git_odb_backend_one_pack", + "git_odb_backend_loose" + ], + "meta": {}, + "lines": 246 }, - { "file": "git2/odb_backend.h", "functions": [], "meta": {}, "lines": 219 }, { "file": "git2/oid.h", "functions": [ + "git_oid_fromstr", + "git_oid_fromstrp", + "git_oid_fromstrn", + "git_oid_fromraw", "git_oid_fmt", "git_oid_nfmt", "git_oid_pathfmt", @@ -646,13 +655,13 @@ "git_oid_shorten_free" ], "meta": {}, - "lines": 369 + "lines": 366 }, { "file": "git2/oidarray.h", "functions": ["git_oidarray_dispose"], "meta": {}, - "lines": 31 + "lines": 38 }, { "file": "git2/pack.h", @@ -677,7 +686,7 @@ "git_packbuilder_free" ], "meta": {}, - "lines": 263 + "lines": 274 }, { "file": "git2/patch.h", @@ -719,13 +728,13 @@ "git_pathspec_match_list_failed_entry" ], "meta": {}, - "lines": 277 + "lines": 284 }, { "file": "git2/proxy.h", "functions": ["git_proxy_options_init"], "meta": {}, - "lines": 94 + "lines": 103 }, { "file": "git2/rebase.h", @@ -748,7 +757,7 @@ "git_rebase_free" ], "meta": {}, - "lines": 395 + "lines": 397 }, { "file": "git2/refdb.h", @@ -829,7 +838,7 @@ "git_reference_shorthand" ], "meta": {}, - "lines": 767 + "lines": 769 }, { "file": "git2/refspec.h", @@ -841,13 +850,14 @@ "git_refspec_string", "git_refspec_force", "git_refspec_direction", + "git_refspec_src_matches_negative", "git_refspec_src_matches", "git_refspec_dst_matches", "git_refspec_transform", "git_refspec_rtransform" ], "meta": {}, - "lines": 117 + "lines": 126 }, { "file": "git2/remote.h", @@ -907,13 +917,14 @@ "git_remote_default_branch" ], "meta": {}, - "lines": 1189 + "lines": 1244 }, { "file": "git2/repository.h", "functions": [ "git_repository_open", "git_repository_open_from_worktree", + "git_repository_wrap_odb", "git_repository_discover", "git_repository_open_ext", "git_repository_open_bare", @@ -961,7 +972,7 @@ "git_repository_commit_parents" ], "meta": {}, - "lines": 992 + "lines": 1014 }, { "file": "git2/reset.h", @@ -971,7 +982,7 @@ "git_reset_default" ], "meta": {}, - "lines": 107 + "lines": 119 }, { "file": "git2/revert.h", @@ -981,7 +992,7 @@ "git_revert" ], "meta": {}, - "lines": 86 + "lines": 91 }, { "file": "git2/revparse.h", @@ -1019,13 +1030,14 @@ "functions": [ "git_signature_new", "git_signature_now", + "git_signature_default_from_env", "git_signature_default", "git_signature_from_buffer", "git_signature_dup", "git_signature_free" ], "meta": {}, - "lines": 99 + "lines": 143 }, { "file": "git2/stash.h", @@ -1042,7 +1054,7 @@ "git_stash_pop" ], "meta": {}, - "lines": 310 + "lines": 323 }, { "file": "git2/status.h", @@ -1059,7 +1071,7 @@ "git_status_should_ignore" ], "meta": {}, - "lines": 448 + "lines": 451 }, { "file": "git2/strarray.h", @@ -1107,25 +1119,25 @@ "git_submodule_location" ], "meta": {}, - "lines": 664 + "lines": 674 }, { "file": "git2/sys/commit_graph.h", "functions": [], "meta": {}, - "lines": 108 + "lines": 99 }, - { "file": "git2/sys/config.h", "functions": [], "meta": {}, "lines": 143 }, - { "file": "git2/sys/filter.h", "functions": [], "meta": {}, "lines": 95 }, - { "file": "git2/sys/hashsig.h", "functions": [], "meta": {}, "lines": 45 }, - { "file": "git2/sys/merge.h", "functions": [], "meta": {}, "lines": 41 }, - { "file": "git2/sys/path.h", "functions": [], "meta": {}, "lines": 41 }, - { "file": "git2/sys/stream.h", "functions": [], "meta": {}, "lines": 97 }, + { "file": "git2/sys/config.h", "functions": [], "meta": {}, "lines": 162 }, + { "file": "git2/sys/filter.h", "functions": [], "meta": {}, "lines": 109 }, + { "file": "git2/sys/hashsig.h", "functions": [], "meta": {}, "lines": 55 }, + { "file": "git2/sys/merge.h", "functions": [], "meta": {}, "lines": 49 }, + { "file": "git2/sys/path.h", "functions": [], "meta": {}, "lines": 51 }, + { "file": "git2/sys/stream.h", "functions": [], "meta": {}, "lines": 105 }, { "file": "git2/sys/transport.h", "functions": [], "meta": {}, - "lines": 318 + "lines": 328 }, { "file": "git2/tag.h", @@ -1155,13 +1167,13 @@ "git_tag_name_is_valid" ], "meta": {}, - "lines": 379 + "lines": 380 }, { "file": "git2/trace.h", "functions": ["git_trace_cb", "git_trace_set"], "meta": {}, - "lines": 63 + "lines": 68 }, { "file": "git2/transaction.h", @@ -1182,7 +1194,7 @@ "file": "git2/transport.h", "functions": ["git_transport_message_cb", "git_transport_cb"], "meta": {}, - "lines": 37 + "lines": 45 }, { "file": "git2/tree.h", @@ -1222,9 +1234,9 @@ "git_tree_create_updated" ], "meta": {}, - "lines": 470 + "lines": 481 }, - { "file": "git2/types.h", "functions": [], "meta": {}, "lines": 366 }, + { "file": "git2/types.h", "functions": [], "meta": {}, "lines": 382 }, { "file": "git2/worktree.h", "functions": [ @@ -1245,15 +1257,15 @@ "git_worktree_prune" ], "meta": {}, - "lines": 267 + "lines": 273 } ], "functions": { "git_annotated_commit_from_ref": { "type": "function", "file": "git2/annotated_commit.h", - "line": 33, - "lineto": 36, + "line": 40, + "lineto": 43, "args": [ { "name": "out", @@ -1279,15 +1291,15 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v1.8.4/checkout.html#git_annotated_commit_from_ref-1" + "ex/v1.9.1/checkout.html#git_annotated_commit_from_ref-1" ] } }, "git_annotated_commit_from_fetchhead": { "type": "function", "file": "git2/annotated_commit.h", - "line": 50, - "lineto": 55, + "line": 57, + "lineto": 62, "args": [ { "name": "out", @@ -1325,8 +1337,8 @@ "git_annotated_commit_lookup": { "type": "function", "file": "git2/annotated_commit.h", - "line": 75, - "lineto": 78, + "line": 82, + "lineto": 85, "args": [ { "name": "out", @@ -1354,8 +1366,8 @@ "git_annotated_commit_from_revspec": { "type": "function", "file": "git2/annotated_commit.h", - "line": 92, - "lineto": 95, + "line": 99, + "lineto": 102, "args": [ { "name": "out", @@ -1383,8 +1395,8 @@ "git_annotated_commit_id": { "type": "function", "file": "git2/annotated_commit.h", - "line": 103, - "lineto": 104, + "line": 110, + "lineto": 111, "args": [ { "name": "commit", @@ -1399,19 +1411,19 @@ "comments": "", "group": "annotated", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_annotated_commit_id-2"], + "checkout.c": ["ex/v1.9.1/checkout.html#git_annotated_commit_id-2"], "merge.c": [ - "ex/v1.8.4/merge.html#git_annotated_commit_id-1", - "ex/v1.8.4/merge.html#git_annotated_commit_id-2", - "ex/v1.8.4/merge.html#git_annotated_commit_id-3" + "ex/v1.9.1/merge.html#git_annotated_commit_id-1", + "ex/v1.9.1/merge.html#git_annotated_commit_id-2", + "ex/v1.9.1/merge.html#git_annotated_commit_id-3" ] } }, "git_annotated_commit_ref": { "type": "function", "file": "git2/annotated_commit.h", - "line": 112, - "lineto": 113, + "line": 119, + "lineto": 120, "args": [ { "name": "commit", @@ -1427,17 +1439,17 @@ "group": "annotated", "examples": { "checkout.c": [ - "ex/v1.8.4/checkout.html#git_annotated_commit_ref-3", - "ex/v1.8.4/checkout.html#git_annotated_commit_ref-4", - "ex/v1.8.4/checkout.html#git_annotated_commit_ref-5" + "ex/v1.9.1/checkout.html#git_annotated_commit_ref-3", + "ex/v1.9.1/checkout.html#git_annotated_commit_ref-4", + "ex/v1.9.1/checkout.html#git_annotated_commit_ref-5" ] } }, "git_annotated_commit_free": { "type": "function", "file": "git2/annotated_commit.h", - "line": 120, - "lineto": 121, + "line": 127, + "lineto": 128, "args": [ { "name": "commit", @@ -1452,14 +1464,14 @@ "comments": "", "group": "annotated", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_annotated_commit_free-6"] + "checkout.c": ["ex/v1.9.1/checkout.html#git_annotated_commit_free-6"] } }, "git_apply_options_init": { "type": "function", "file": "git2/apply.h", - "line": 106, - "lineto": 106, + "line": 127, + "lineto": 127, "args": [ { "name": "opts", @@ -1482,8 +1494,8 @@ "git_apply_to_tree": { "type": "function", "file": "git2/apply.h", - "line": 119, - "lineto": 124, + "line": 140, + "lineto": 145, "args": [ { "name": "out", @@ -1521,8 +1533,8 @@ "git_apply": { "type": "function", "file": "git2/apply.h", - "line": 157, - "lineto": 161, + "line": 178, + "lineto": 182, "args": [ { "name": "repo", @@ -1555,8 +1567,8 @@ "git_attr_value": { "type": "function", "file": "git2/attr.h", - "line": 102, - "lineto": 102, + "line": 106, + "lineto": 106, "args": [ { "name": "attr", "type": "const char *", "comment": "The attribute" } ], @@ -1573,8 +1585,8 @@ "git_attr_get": { "type": "function", "file": "git2/attr.h", - "line": 180, - "lineto": 185, + "line": 195, + "lineto": 200, "args": [ { "name": "value_out", @@ -1612,8 +1624,8 @@ "git_attr_get_ext": { "type": "function", "file": "git2/attr.h", - "line": 203, - "lineto": 208, + "line": 218, + "lineto": 223, "args": [ { "name": "value_out", @@ -1651,8 +1663,8 @@ "git_attr_get_many": { "type": "function", "file": "git2/attr.h", - "line": 240, - "lineto": 246, + "line": 255, + "lineto": 261, "args": [ { "name": "values_out", @@ -1695,8 +1707,8 @@ "git_attr_get_many_ext": { "type": "function", "file": "git2/attr.h", - "line": 265, - "lineto": 271, + "line": 280, + "lineto": 286, "args": [ { "name": "values_out", @@ -1739,8 +1751,8 @@ "git_attr_foreach": { "type": "function", "file": "git2/attr.h", - "line": 304, - "lineto": 309, + "line": 319, + "lineto": 324, "args": [ { "name": "repo", @@ -1781,8 +1793,8 @@ "git_attr_foreach_ext": { "type": "function", "file": "git2/attr.h", - "line": 324, - "lineto": 329, + "line": 339, + "lineto": 344, "args": [ { "name": "repo", @@ -1823,8 +1835,8 @@ "git_attr_cache_flush": { "type": "function", "file": "git2/attr.h", - "line": 342, - "lineto": 343, + "line": 357, + "lineto": 358, "args": [ { "name": "repo", @@ -1842,8 +1854,8 @@ "git_attr_add_macro": { "type": "function", "file": "git2/attr.h", - "line": 360, - "lineto": 363, + "line": 375, + "lineto": 378, "args": [ { "name": "repo", @@ -1871,8 +1883,8 @@ "git_blame_options_init": { "type": "function", "file": "git2/blame.h", - "line": 138, - "lineto": 140, + "line": 146, + "lineto": 148, "args": [ { "name": "opts", @@ -1895,11 +1907,11 @@ "comments": "

Initializes a git_blame_options with default values. Equivalent to creating an instance with GIT_BLAME_OPTIONS_INIT.

\n", "group": "blame" }, - "git_blame_get_hunk_count": { + "git_blame_linecount": { "type": "function", "file": "git2/blame.h", - "line": 210, - "lineto": 210, + "line": 244, + "lineto": 244, "args": [ { "name": "blame", @@ -1909,16 +1921,35 @@ ], "argline": "git_blame *blame", "sig": "git_blame *", - "return": { "type": "uint32_t", "comment": " The number of hunks." }, + "return": { "type": "size_t", "comment": " The number of line." }, + "description": "

Gets the number of lines that exist in the blame structure.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_hunkcount": { + "type": "function", + "file": "git2/blame.h", + "line": 252, + "lineto": 252, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "The blame structure to query." + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "size_t", "comment": " The number of hunks." }, "description": "

Gets the number of hunks that exist in the blame structure.

\n", "comments": "", "group": "blame" }, - "git_blame_get_hunk_byindex": { + "git_blame_hunk_byindex": { "type": "function", "file": "git2/blame.h", - "line": 219, - "lineto": 221, + "line": 261, + "lineto": 263, "args": [ { "name": "blame", @@ -1927,12 +1958,12 @@ }, { "name": "index", - "type": "uint32_t", + "type": "size_t", "comment": "index of the hunk to retrieve" } ], - "argline": "git_blame *blame, uint32_t index", - "sig": "git_blame *::uint32_t", + "argline": "git_blame *blame, size_t index", + "sig": "git_blame *::size_t", "return": { "type": "const git_blame_hunk *", "comment": " the hunk at the given index, or NULL on error" @@ -1941,11 +1972,11 @@ "comments": "", "group": "blame" }, - "git_blame_get_hunk_byline": { + "git_blame_hunk_byline": { "type": "function", "file": "git2/blame.h", - "line": 230, - "lineto": 232, + "line": 273, + "lineto": 275, "args": [ { "name": "blame", @@ -1964,56 +1995,118 @@ "type": "const git_blame_hunk *", "comment": " the hunk that contains the given line, or NULL on error" }, - "description": "

Gets the hunk that relates to the given line number in the newest commit.

\n", + "description": "

Gets the hunk that relates to the given line number in the newest\n commit.

\n", "comments": "", "group": "blame", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_blame_get_hunk_byline-1"] + "blame.c": ["ex/v1.9.1/blame.html#git_blame_hunk_byline-1"] } }, - "git_blame_file": { + "git_blame_line_byindex": { "type": "function", "file": "git2/blame.h", - "line": 245, - "lineto": 249, + "line": 284, + "lineto": 286, "args": [ { - "name": "out", - "type": "git_blame **", - "comment": "pointer that will receive the blame object" + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" }, { - "name": "repo", - "type": "git_repository *", - "comment": "repository whose history is to be walked" + "name": "idx", + "type": "size_t", + "comment": "the (1-based) line number" + } + ], + "argline": "git_blame *blame, size_t idx", + "sig": "git_blame *::size_t", + "return": { + "type": "const git_blame_line *", + "comment": " the blamed line, or NULL on error" + }, + "description": "

Gets the information about the line in the blame.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_count": { + "type": "function", + "file": "git2/blame.h", + "line": 296, + "lineto": 296, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "The blame structure to query." + } + ], + "argline": "git_blame *blame", + "sig": "git_blame *", + "return": { "type": "uint32_t", "comment": " The number of hunks." }, + "description": "

Gets the number of hunks that exist in the blame structure.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byindex": { + "type": "function", + "file": "git2/blame.h", + "line": 305, + "lineto": 307, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" }, { - "name": "path", - "type": "const char *", - "comment": "path to file to consider" + "name": "index", + "type": "uint32_t", + "comment": "index of the hunk to retrieve" + } + ], + "argline": "git_blame *blame, uint32_t index", + "sig": "git_blame *::uint32_t", + "return": { + "type": "const git_blame_hunk *", + "comment": " the hunk at the given index, or NULL on error" + }, + "description": "

Gets the blame hunk at the given index.

\n", + "comments": "", + "group": "blame" + }, + "git_blame_get_hunk_byline": { + "type": "function", + "file": "git2/blame.h", + "line": 316, + "lineto": 318, + "args": [ + { + "name": "blame", + "type": "git_blame *", + "comment": "the blame structure to query" }, { - "name": "options", - "type": "git_blame_options *", - "comment": "options for the blame operation. If NULL, this is treated as\n though GIT_BLAME_OPTIONS_INIT were passed." + "name": "lineno", + "type": "size_t", + "comment": "the (1-based) line number to find a hunk for" } ], - "argline": "git_blame **out, git_repository *repo, const char *path, git_blame_options *options", - "sig": "git_blame **::git_repository *::const char *::git_blame_options *", + "argline": "git_blame *blame, size_t lineno", + "sig": "git_blame *::size_t", "return": { - "type": "int", - "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error.)" + "type": "const git_blame_hunk *", + "comment": " the hunk that contains the given line, or NULL on error" }, - "description": "

Get the blame for a single file.

\n", + "description": "

Gets the hunk that relates to the given line number in the newest commit.

\n", "comments": "", - "group": "blame", - "examples": { "blame.c": ["ex/v1.8.4/blame.html#git_blame_file-2"] } + "group": "blame" }, "git_blame_buffer": { "type": "function", "file": "git2/blame.h", - "line": 269, - "lineto": 273, + "line": 374, + "lineto": 378, "args": [ { "name": "out", @@ -2021,7 +2114,7 @@ "comment": "pointer that will receive the resulting blame data" }, { - "name": "reference", + "name": "base", "type": "git_blame *", "comment": "cached blame from the history of the file (usually the output\n from git_blame_file)" }, @@ -2036,21 +2129,21 @@ "comment": "number of valid bytes in the buffer" } ], - "argline": "git_blame **out, git_blame *reference, const char *buffer, size_t buffer_len", + "argline": "git_blame **out, git_blame *base, const char *buffer, size_t buffer_len", "sig": "git_blame **::git_blame *::const char *::size_t", "return": { "type": "int", "comment": " 0 on success, or an error code. (use git_error_last for information\n about the error)" }, - "description": "

Get blame data for a file that has been modified in memory. The reference\n parameter is a pre-calculated blame for the in-odb history of the file. This\n means that once a file blame is completed (which can be expensive), updating\n the buffer blame is very fast.

\n", + "description": "

Get blame data for a file that has been modified in memory. The blame\n parameter is a pre-calculated blame for the in-odb history of the file.\n This means that once a file blame is completed (which can be expensive),\n updating the buffer blame is very fast.

\n", "comments": "

Lines that differ between the buffer and the committed version are marked as having a zero OID for their final_commit_id.

\n", "group": "blame" }, "git_blame_free": { "type": "function", "file": "git2/blame.h", - "line": 280, - "lineto": 280, + "line": 385, + "lineto": 385, "args": [ { "name": "blame", @@ -2064,13 +2157,13 @@ "description": "

Free memory allocated by git_blame_file or git_blame_buffer.

\n", "comments": "", "group": "blame", - "examples": { "blame.c": ["ex/v1.8.4/blame.html#git_blame_free-3"] } + "examples": { "blame.c": ["ex/v1.9.1/blame.html#git_blame_free-2"] } }, "git_blob_lookup": { "type": "function", "file": "git2/blob.h", - "line": 33, - "lineto": 33, + "line": 37, + "lineto": 40, "args": [ { "name": "blob", @@ -2095,15 +2188,15 @@ "comments": "", "group": "blob", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_blob_lookup-4"], - "general.c": ["ex/v1.8.4/general.html#git_blob_lookup-1"] + "blame.c": ["ex/v1.9.1/blame.html#git_blob_lookup-3"], + "general.c": ["ex/v1.9.1/general.html#git_blob_lookup-1"] } }, "git_blob_lookup_prefix": { "type": "function", "file": "git2/blob.h", - "line": 47, - "lineto": 47, + "line": 54, + "lineto": 54, "args": [ { "name": "blob", @@ -2136,8 +2229,8 @@ "git_blob_free": { "type": "function", "file": "git2/blob.h", - "line": 60, - "lineto": 60, + "line": 67, + "lineto": 67, "args": [ { "name": "blob", "type": "git_blob *", "comment": "the blob to close" } ], @@ -2148,15 +2241,15 @@ "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a blob. Failure to do so will cause a memory leak.

\n", "group": "blob", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_blob_free-5"], - "general.c": ["ex/v1.8.4/general.html#git_blob_free-2"] + "blame.c": ["ex/v1.9.1/blame.html#git_blob_free-4"], + "general.c": ["ex/v1.9.1/general.html#git_blob_free-2"] } }, "git_blob_id": { "type": "function", "file": "git2/blob.h", - "line": 68, - "lineto": 68, + "line": 75, + "lineto": 75, "args": [ { "name": "blob", @@ -2177,8 +2270,8 @@ "git_blob_owner": { "type": "function", "file": "git2/blob.h", - "line": 76, - "lineto": 76, + "line": 83, + "lineto": 83, "args": [ { "name": "blob", @@ -2199,8 +2292,8 @@ "git_blob_rawcontent": { "type": "function", "file": "git2/blob.h", - "line": 89, - "lineto": 89, + "line": 96, + "lineto": 96, "args": [ { "name": "blob", @@ -2212,22 +2305,22 @@ "sig": "const git_blob *", "return": { "type": "const void *", - "comment": " the pointer, or NULL on error" + "comment": " \n\n `unsigned char *` the pointer, or NULL on error" }, "description": "

Get a read-only buffer with the raw content of a blob.

\n", "comments": "

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.

\n", "group": "blob", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_blob_rawcontent-6"], - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_blob_rawcontent-1"], - "general.c": ["ex/v1.8.4/general.html#git_blob_rawcontent-3"] + "blame.c": ["ex/v1.9.1/blame.html#git_blob_rawcontent-5"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_blob_rawcontent-1"], + "general.c": ["ex/v1.9.1/general.html#git_blob_rawcontent-3"] } }, "git_blob_rawsize": { "type": "function", "file": "git2/blob.h", - "line": 97, - "lineto": 97, + "line": 104, + "lineto": 104, "args": [ { "name": "blob", @@ -2237,24 +2330,24 @@ ], "argline": "const git_blob *blob", "sig": "const git_blob *", - "return": { "type": "git_object_size_t", "comment": " size on bytes" }, + "return": { "type": "git_object_size_t", "comment": " size in bytes" }, "description": "

Get the size in bytes of the contents of a blob

\n", "comments": "", "group": "blob", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_blob_rawsize-7"], - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_blob_rawsize-2"], + "blame.c": ["ex/v1.9.1/blame.html#git_blob_rawsize-6"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_blob_rawsize-2"], "general.c": [ - "ex/v1.8.4/general.html#git_blob_rawsize-4", - "ex/v1.8.4/general.html#git_blob_rawsize-5" + "ex/v1.9.1/general.html#git_blob_rawsize-4", + "ex/v1.9.1/general.html#git_blob_rawsize-5" ] } }, "git_blob_filter_options_init": { "type": "function", "file": "git2/blob.h", - "line": 164, - "lineto": 164, + "line": 201, + "lineto": 203, "args": [ { "name": "opts", @@ -2264,7 +2357,7 @@ { "name": "version", "type": "unsigned int", - "comment": "The struct version; pass `GIT_BLOB_FILTER_OPTIONS_VERSION`." + "comment": "The struct version; pass GIT_BLOB_FILTER_OPTIONS_VERSION" } ], "argline": "git_blob_filter_options *opts, unsigned int version", @@ -2280,8 +2373,8 @@ "git_blob_filter": { "type": "function", "file": "git2/blob.h", - "line": 188, - "lineto": 192, + "line": 227, + "lineto": 231, "args": [ { "name": "out", @@ -2306,16 +2399,19 @@ ], "argline": "git_buf *out, git_blob *blob, const char *as_path, git_blob_filter_options *opts", "sig": "git_buf *::git_blob *::const char *::git_blob_filter_options *", - "return": { "type": "int", "comment": " 0 on success or an error code" }, + "return": { + "type": "int", + "comment": " \n\n[enum] git_error_code 0 on success or an error code" + }, "description": "

Get a buffer with the filtered content of a blob.

\n", - "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must free when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", + "comments": "

This applies filters as if the blob was being checked out to the working directory under the specified filename. This may apply CRLF filtering or other types of changes depending on the file attributes set for the blob and the content detected in it.

\n\n

The output is written into a git_buf which the caller must dispose when done (via git_buf_dispose).

\n\n

If no filters need to be applied, then the out buffer will just be populated with a pointer to the raw content of the blob. In that case, be careful to not free the blob until done with the buffer or copy it into memory you own.

\n", "group": "blob" }, "git_blob_create_from_workdir": { "type": "function", "file": "git2/blob.h", - "line": 205, - "lineto": 205, + "line": 244, + "lineto": 244, "args": [ { "name": "id", @@ -2336,15 +2432,15 @@ "argline": "git_oid *id, git_repository *repo, const char *relative_path", "sig": "git_oid *::git_repository *::const char *", "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Read a file from the working folder of a repository\n and write it to the Object Database as a loose blob

\n", + "description": "

Read a file from the working folder of a repository and write it\n to the object database.

\n", "comments": "", "group": "blob" }, "git_blob_create_from_disk": { "type": "function", "file": "git2/blob.h", - "line": 217, - "lineto": 217, + "line": 257, + "lineto": 260, "args": [ { "name": "id", @@ -2365,15 +2461,15 @@ "argline": "git_oid *id, git_repository *repo, const char *path", "sig": "git_oid *::git_repository *::const char *", "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Read a file from the filesystem and write its content\n to the Object Database as a loose blob

\n", + "description": "

Read a file from the filesystem (not necessarily inside the\n working folder of the repository) and write it to the object\n database.

\n", "comments": "", "group": "blob" }, "git_blob_create_from_stream": { "type": "function", "file": "git2/blob.h", - "line": 244, - "lineto": 247, + "line": 287, + "lineto": 290, "args": [ { "name": "out", @@ -2394,15 +2490,15 @@ "argline": "git_writestream **out, git_repository *repo, const char *hintpath", "sig": "git_writestream **::git_repository *::const char *", "return": { "type": "int", "comment": " 0 or error code" }, - "description": "

Create a stream to write a new blob into the object db

\n", + "description": "

Create a stream to write a new blob into the object database.

\n", "comments": "

This function may need to buffer the data on disk and will in general not be the right choice if you know the size of the data to write. If you have data in memory, use git_blob_create_from_buffer(). If you do not, but know the size of the contents (and don't want/need to perform filtering), use git_odb_open_wstream().

\n\n

Don't close this stream yourself but pass it to git_blob_create_from_stream_commit() to commit the write to the object db and get the object id.

\n\n

If the hintpath parameter is filled, it will be used to determine what git filters should be applied to the object before it is written to the object database.

\n", "group": "blob" }, "git_blob_create_from_stream_commit": { "type": "function", "file": "git2/blob.h", - "line": 258, - "lineto": 260, + "line": 301, + "lineto": 303, "args": [ { "name": "out", @@ -2418,15 +2514,15 @@ "argline": "git_oid *out, git_writestream *stream", "sig": "git_oid *::git_writestream *", "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Close the stream and write the blob to the object db

\n", + "description": "

Close the stream and finalize writing the blob to the object database.

\n", "comments": "

The stream will be closed and freed.

\n", "group": "blob" }, "git_blob_create_from_buffer": { "type": "function", "file": "git2/blob.h", - "line": 271, - "lineto": 272, + "line": 314, + "lineto": 315, "args": [ { "name": "id", @@ -2448,15 +2544,15 @@ "argline": "git_oid *id, git_repository *repo, const void *buffer, size_t len", "sig": "git_oid *::git_repository *::const void *::size_t", "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Write an in-memory buffer to the ODB as a blob

\n", + "description": "

Write an in-memory buffer to the object database as a blob.

\n", "comments": "", "group": "blob" }, "git_blob_is_binary": { "type": "function", "file": "git2/blob.h", - "line": 285, - "lineto": 285, + "line": 328, + "lineto": 328, "args": [ { "name": "blob", @@ -2468,17 +2564,17 @@ "sig": "const git_blob *", "return": { "type": "int", - "comment": " 1 if the content of the blob is detected\n as binary; 0 otherwise." + "comment": " \n\n bool 1 if the content of the blob is detected\n as binary; 0 otherwise." }, - "description": "

Determine if the blob content is most certainly binary or not.

\n", + "description": "

Determine if the blob content is most likely binary or not.

\n", "comments": "

The heuristic used to guess if a file is binary is taken from core git: Searching for NUL bytes and looking for a reasonable ratio of printable to non-printable characters among the first 8000 bytes.

\n", "group": "blob" }, "git_blob_data_is_binary": { "type": "function", "file": "git2/blob.h", - "line": 297, - "lineto": 297, + "line": 340, + "lineto": 340, "args": [ { "name": "data", @@ -2500,8 +2596,8 @@ "git_blob_dup": { "type": "function", "file": "git2/blob.h", - "line": 307, - "lineto": 307, + "line": 350, + "lineto": 350, "args": [ { "name": "out", @@ -2524,8 +2620,8 @@ "git_branch_create": { "type": "function", "file": "git2/branch.h", - "line": 52, - "lineto": 57, + "line": 53, + "lineto": 58, "args": [ { "name": "out", @@ -2540,12 +2636,12 @@ { "name": "branch_name", "type": "const char *", - "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." + "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." }, { "name": "target", "type": "const git_commit *", - "comment": "Commit to which this branch should point. This object\n must belong to the given `repo`." + "comment": "Commit to which this branch should point. This object\n must belong to the given `repo`." }, { "name": "force", @@ -2566,36 +2662,55 @@ "git_branch_create_from_annotated": { "type": "function", "file": "git2/branch.h", - "line": 70, - "lineto": 75, + "line": 77, + "lineto": 82, "args": [ - { "name": "ref_out", "type": "git_reference **", "comment": null }, - { "name": "repository", "type": "git_repository *", "comment": null }, - { "name": "branch_name", "type": "const char *", "comment": null }, { - "name": "commit", + "name": "ref_out", + "type": "git_reference **", + "comment": "Pointer where to store the underlying reference." + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "the repository to create the branch in." + }, + { + "name": "branch_name", + "type": "const char *", + "comment": "Name for the branch; this name is\n validated for consistency. It should also not conflict with\n an already existing branch name." + }, + { + "name": "target", "type": "const git_annotated_commit *", - "comment": null + "comment": "Annotated commit to which this branch should point. This\n object must belong to the given `repo`." }, - { "name": "force", "type": "int", "comment": null } + { + "name": "force", + "type": "int", + "comment": "Overwrite existing branch." + } ], - "argline": "git_reference **ref_out, git_repository *repository, const char *branch_name, const git_annotated_commit *commit, int force", + "argline": "git_reference **ref_out, git_repository *repo, const char *branch_name, const git_annotated_commit *target, int force", "sig": "git_reference **::git_repository *::const char *::const git_annotated_commit *::int", - "return": { "type": "int", "comment": null }, + "return": { + "type": "int", + "comment": " 0, GIT_EINVALIDSPEC or an error code." + }, "description": "

Create a new branch pointing at a target commit

\n", - "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_branch_create().

\n", + "comments": "

This behaves like git_branch_create() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n", "group": "branch", "examples": { "checkout.c": [ - "ex/v1.8.4/checkout.html#git_branch_create_from_annotated-7" + "ex/v1.9.1/checkout.html#git_branch_create_from_annotated-7" ] } }, "git_branch_delete": { "type": "function", "file": "git2/branch.h", - "line": 87, - "lineto": 87, + "line": 94, + "lineto": 94, "args": [ { "name": "branch", @@ -2616,8 +2731,8 @@ "git_branch_iterator_new": { "type": "function", "file": "git2/branch.h", - "line": 103, - "lineto": 106, + "line": 110, + "lineto": 113, "args": [ { "name": "out", @@ -2645,8 +2760,8 @@ "git_branch_next": { "type": "function", "file": "git2/branch.h", - "line": 116, - "lineto": 116, + "line": 123, + "lineto": 123, "args": [ { "name": "out", @@ -2677,8 +2792,8 @@ "git_branch_iterator_free": { "type": "function", "file": "git2/branch.h", - "line": 123, - "lineto": 123, + "line": 130, + "lineto": 130, "args": [ { "name": "iter", @@ -2696,8 +2811,8 @@ "git_branch_move": { "type": "function", "file": "git2/branch.h", - "line": 146, - "lineto": 150, + "line": 153, + "lineto": 157, "args": [ { "name": "out", @@ -2733,8 +2848,8 @@ "git_branch_lookup": { "type": "function", "file": "git2/branch.h", - "line": 170, - "lineto": 174, + "line": 177, + "lineto": 181, "args": [ { "name": "out", @@ -2770,8 +2885,8 @@ "git_branch_name": { "type": "function", "file": "git2/branch.h", - "line": 191, - "lineto": 193, + "line": 198, + "lineto": 200, "args": [ { "name": "out", @@ -2793,13 +2908,13 @@ "description": "

Get the branch name

\n", "comments": "

Given a reference object, this will check that it really is a branch (ie. it lives under "refs/heads/" or "refs/remotes/"), and return the branch part of it.

\n", "group": "branch", - "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_branch_name-4"] } + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_branch_name-4"] } }, "git_branch_upstream": { "type": "function", "file": "git2/branch.h", - "line": 209, - "lineto": 211, + "line": 216, + "lineto": 218, "args": [ { "name": "out", @@ -2825,8 +2940,8 @@ "git_branch_set_upstream": { "type": "function", "file": "git2/branch.h", - "line": 228, - "lineto": 230, + "line": 235, + "lineto": 237, "args": [ { "name": "branch", @@ -2843,7 +2958,7 @@ "sig": "git_reference *::const char *", "return": { "type": "int", - "comment": " 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" + "comment": " \n\n git_error_t 0 on success; GIT_ENOTFOUND if there's no branch named `branch_name`\n or an error code" }, "description": "

Set a branch's upstream branch

\n", "comments": "

This will update the configuration to set the branch named branch_name as the upstream of branch. Pass a NULL name to unset the upstream information.

\n", @@ -2852,8 +2967,8 @@ "git_branch_upstream_name": { "type": "function", "file": "git2/branch.h", - "line": 246, - "lineto": 249, + "line": 253, + "lineto": 256, "args": [ { "name": "out", @@ -2884,8 +2999,8 @@ "git_branch_is_head": { "type": "function", "file": "git2/branch.h", - "line": 259, - "lineto": 260, + "line": 266, + "lineto": 267, "args": [ { "name": "branch", @@ -2906,8 +3021,8 @@ "git_branch_is_checked_out": { "type": "function", "file": "git2/branch.h", - "line": 272, - "lineto": 273, + "line": 279, + "lineto": 280, "args": [ { "name": "branch", @@ -2928,8 +3043,8 @@ "git_branch_remote_name": { "type": "function", "file": "git2/branch.h", - "line": 291, - "lineto": 294, + "line": 298, + "lineto": 301, "args": [ { "name": "out", @@ -2960,8 +3075,8 @@ "git_branch_upstream_remote": { "type": "function", "file": "git2/branch.h", - "line": 307, - "lineto": 307, + "line": 314, + "lineto": 314, "args": [ { "name": "buf", @@ -2989,8 +3104,8 @@ "git_branch_upstream_merge": { "type": "function", "file": "git2/branch.h", - "line": 320, - "lineto": 320, + "line": 327, + "lineto": 327, "args": [ { "name": "buf", @@ -3018,8 +3133,8 @@ "git_branch_name_is_valid": { "type": "function", "file": "git2/branch.h", - "line": 332, - "lineto": 332, + "line": 339, + "lineto": 339, "args": [ { "name": "valid", @@ -3042,8 +3157,8 @@ "git_buf_dispose": { "type": "function", "file": "git2/buffer.h", - "line": 68, - "lineto": 68, + "line": 71, + "lineto": 71, "args": [ { "name": "buffer", @@ -3059,17 +3174,17 @@ "group": "buf", "examples": { "diff.c": [ - "ex/v1.8.4/diff.html#git_buf_dispose-1", - "ex/v1.8.4/diff.html#git_buf_dispose-2" + "ex/v1.9.1/diff.html#git_buf_dispose-1", + "ex/v1.9.1/diff.html#git_buf_dispose-2" ], - "tag.c": ["ex/v1.8.4/tag.html#git_buf_dispose-1"] + "tag.c": ["ex/v1.9.1/tag.html#git_buf_dispose-1"] } }, "git_checkout_options_init": { "type": "function", "file": "git2/checkout.h", - "line": 360, - "lineto": 362, + "line": 410, + "lineto": 412, "args": [ { "name": "opts", @@ -3095,8 +3210,8 @@ "git_checkout_head": { "type": "function", "file": "git2/checkout.h", - "line": 381, - "lineto": 383, + "line": 431, + "lineto": 433, "args": [ { "name": "repo", @@ -3122,8 +3237,8 @@ "git_checkout_index": { "type": "function", "file": "git2/checkout.h", - "line": 394, - "lineto": 397, + "line": 444, + "lineto": 447, "args": [ { "name": "repo", @@ -3154,8 +3269,8 @@ "git_checkout_tree": { "type": "function", "file": "git2/checkout.h", - "line": 410, - "lineto": 413, + "line": 460, + "lineto": 463, "args": [ { "name": "repo", @@ -3183,15 +3298,15 @@ "comments": "", "group": "checkout", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_checkout_tree-8"], - "merge.c": ["ex/v1.8.4/merge.html#git_checkout_tree-5"] + "checkout.c": ["ex/v1.9.1/checkout.html#git_checkout_tree-8"], + "merge.c": ["ex/v1.9.1/merge.html#git_checkout_tree-5"] } }, "git_cherrypick_options_init": { "type": "function", "file": "git2/cherrypick.h", - "line": 49, - "lineto": 51, + "line": 57, + "lineto": 59, "args": [ { "name": "opts", @@ -3217,8 +3332,8 @@ "git_cherrypick_commit": { "type": "function", "file": "git2/cherrypick.h", - "line": 67, - "lineto": 73, + "line": 75, + "lineto": 81, "args": [ { "name": "out", @@ -3264,8 +3379,8 @@ "git_cherrypick": { "type": "function", "file": "git2/cherrypick.h", - "line": 83, - "lineto": 86, + "line": 91, + "lineto": 94, "args": [ { "name": "repo", @@ -3296,8 +3411,8 @@ "git_clone_options_init": { "type": "function", "file": "git2/clone.h", - "line": 181, - "lineto": 183, + "line": 192, + "lineto": 194, "args": [ { "name": "opts", @@ -3323,8 +3438,8 @@ "git_clone": { "type": "function", "file": "git2/clone.h", - "line": 201, - "lineto": 205, + "line": 216, + "lineto": 220, "args": [ { "name": "out", @@ -3354,14 +3469,14 @@ "comment": " 0 on success, any non-zero return value from a callback\n function, or a negative value to indicate an error (use\n `git_error_last` for a detailed error message)" }, "description": "

Clone a remote repository.

\n", - "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n", + "comments": "

By default this creates its repository and initial remote to match git's defaults. You can use the options in the callback to customize how these are created.

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", "group": "clone" }, "git_commit_lookup": { "type": "function", "file": "git2/commit.h", - "line": 36, - "lineto": 37, + "line": 40, + "lineto": 41, "args": [ { "name": "commit", @@ -3386,21 +3501,21 @@ "comments": "

The returned object should be released with git_commit_free when no longer needed.

\n", "group": "commit", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_commit_lookup-9"], + "checkout.c": ["ex/v1.9.1/checkout.html#git_commit_lookup-9"], "general.c": [ - "ex/v1.8.4/general.html#git_commit_lookup-6", - "ex/v1.8.4/general.html#git_commit_lookup-7", - "ex/v1.8.4/general.html#git_commit_lookup-8" + "ex/v1.9.1/general.html#git_commit_lookup-6", + "ex/v1.9.1/general.html#git_commit_lookup-7", + "ex/v1.9.1/general.html#git_commit_lookup-8" ], - "log.c": ["ex/v1.8.4/log.html#git_commit_lookup-1"], - "merge.c": ["ex/v1.8.4/merge.html#git_commit_lookup-6"] + "log.c": ["ex/v1.9.1/log.html#git_commit_lookup-1"], + "merge.c": ["ex/v1.9.1/merge.html#git_commit_lookup-6"] } }, "git_commit_lookup_prefix": { "type": "function", "file": "git2/commit.h", - "line": 55, - "lineto": 56, + "line": 59, + "lineto": 60, "args": [ { "name": "commit", @@ -3433,8 +3548,8 @@ "git_commit_free": { "type": "function", "file": "git2/commit.h", - "line": 70, - "lineto": 70, + "line": 74, + "lineto": 74, "args": [ { "name": "commit", @@ -3449,27 +3564,27 @@ "comments": "

This is a wrapper around git_object_free()

\n\n

IMPORTANT: It is necessary to call this method when you stop using a commit. Failure to do so will cause a memory leak.

\n", "group": "commit", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_commit_free-10"], + "checkout.c": ["ex/v1.9.1/checkout.html#git_commit_free-10"], "general.c": [ - "ex/v1.8.4/general.html#git_commit_free-9", - "ex/v1.8.4/general.html#git_commit_free-10", - "ex/v1.8.4/general.html#git_commit_free-11", - "ex/v1.8.4/general.html#git_commit_free-12", - "ex/v1.8.4/general.html#git_commit_free-13" + "ex/v1.9.1/general.html#git_commit_free-9", + "ex/v1.9.1/general.html#git_commit_free-10", + "ex/v1.9.1/general.html#git_commit_free-11", + "ex/v1.9.1/general.html#git_commit_free-12", + "ex/v1.9.1/general.html#git_commit_free-13" ], "log.c": [ - "ex/v1.8.4/log.html#git_commit_free-2", - "ex/v1.8.4/log.html#git_commit_free-3", - "ex/v1.8.4/log.html#git_commit_free-4", - "ex/v1.8.4/log.html#git_commit_free-5" + "ex/v1.9.1/log.html#git_commit_free-2", + "ex/v1.9.1/log.html#git_commit_free-3", + "ex/v1.9.1/log.html#git_commit_free-4", + "ex/v1.9.1/log.html#git_commit_free-5" ] } }, "git_commit_id": { "type": "function", "file": "git2/commit.h", - "line": 78, - "lineto": 78, + "line": 82, + "lineto": 82, "args": [ { "name": "commit", @@ -3487,15 +3602,15 @@ "comments": "", "group": "commit", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_commit_id-14"], - "log.c": ["ex/v1.8.4/log.html#git_commit_id-6"] + "general.c": ["ex/v1.9.1/general.html#git_commit_id-14"], + "log.c": ["ex/v1.9.1/log.html#git_commit_id-6"] } }, "git_commit_owner": { "type": "function", "file": "git2/commit.h", - "line": 86, - "lineto": 86, + "line": 90, + "lineto": 90, "args": [ { "name": "commit", @@ -3514,16 +3629,16 @@ "group": "commit", "examples": { "log.c": [ - "ex/v1.8.4/log.html#git_commit_owner-7", - "ex/v1.8.4/log.html#git_commit_owner-8" + "ex/v1.9.1/log.html#git_commit_owner-7", + "ex/v1.9.1/log.html#git_commit_owner-8" ] } }, "git_commit_message_encoding": { "type": "function", "file": "git2/commit.h", - "line": 98, - "lineto": 98, + "line": 102, + "lineto": 102, "args": [ { "name": "commit", @@ -3541,8 +3656,8 @@ "git_commit_message": { "type": "function", "file": "git2/commit.h", - "line": 109, - "lineto": 109, + "line": 113, + "lineto": 113, "args": [ { "name": "commit", @@ -3561,27 +3676,27 @@ "group": "commit", "examples": { "cat-file.c": [ - "ex/v1.8.4/cat-file.html#git_commit_message-3", - "ex/v1.8.4/cat-file.html#git_commit_message-4" + "ex/v1.9.1/cat-file.html#git_commit_message-3", + "ex/v1.9.1/cat-file.html#git_commit_message-4" ], "general.c": [ - "ex/v1.8.4/general.html#git_commit_message-15", - "ex/v1.8.4/general.html#git_commit_message-16", - "ex/v1.8.4/general.html#git_commit_message-17" + "ex/v1.9.1/general.html#git_commit_message-15", + "ex/v1.9.1/general.html#git_commit_message-16", + "ex/v1.9.1/general.html#git_commit_message-17" ], "log.c": [ - "ex/v1.8.4/log.html#git_commit_message-9", - "ex/v1.8.4/log.html#git_commit_message-10", - "ex/v1.8.4/log.html#git_commit_message-11" + "ex/v1.9.1/log.html#git_commit_message-9", + "ex/v1.9.1/log.html#git_commit_message-10", + "ex/v1.9.1/log.html#git_commit_message-11" ], - "tag.c": ["ex/v1.8.4/tag.html#git_commit_message-2"] + "tag.c": ["ex/v1.9.1/tag.html#git_commit_message-2"] } }, "git_commit_message_raw": { "type": "function", "file": "git2/commit.h", - "line": 117, - "lineto": 117, + "line": 121, + "lineto": 121, "args": [ { "name": "commit", @@ -3602,8 +3717,8 @@ "git_commit_summary": { "type": "function", "file": "git2/commit.h", - "line": 128, - "lineto": 128, + "line": 132, + "lineto": 132, "args": [ { "name": "commit", @@ -3624,8 +3739,8 @@ "git_commit_body": { "type": "function", "file": "git2/commit.h", - "line": 141, - "lineto": 141, + "line": 145, + "lineto": 145, "args": [ { "name": "commit", @@ -3646,8 +3761,8 @@ "git_commit_time": { "type": "function", "file": "git2/commit.h", - "line": 149, - "lineto": 149, + "line": 153, + "lineto": 153, "args": [ { "name": "commit", @@ -3663,16 +3778,16 @@ "group": "commit", "examples": { "general.c": [ - "ex/v1.8.4/general.html#git_commit_time-18", - "ex/v1.8.4/general.html#git_commit_time-19" + "ex/v1.9.1/general.html#git_commit_time-18", + "ex/v1.9.1/general.html#git_commit_time-19" ] } }, "git_commit_time_offset": { "type": "function", "file": "git2/commit.h", - "line": 157, - "lineto": 157, + "line": 161, + "lineto": 161, "args": [ { "name": "commit", @@ -3693,8 +3808,8 @@ "git_commit_committer": { "type": "function", "file": "git2/commit.h", - "line": 165, - "lineto": 165, + "line": 169, + "lineto": 169, "args": [ { "name": "commit", @@ -3712,16 +3827,16 @@ "comments": "", "group": "commit", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_committer-5"], - "general.c": ["ex/v1.8.4/general.html#git_commit_committer-20"], - "log.c": ["ex/v1.8.4/log.html#git_commit_committer-12"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_committer-5"], + "general.c": ["ex/v1.9.1/general.html#git_commit_committer-20"], + "log.c": ["ex/v1.9.1/log.html#git_commit_committer-12"] } }, "git_commit_author": { "type": "function", "file": "git2/commit.h", - "line": 173, - "lineto": 173, + "line": 177, + "lineto": 177, "args": [ { "name": "commit", @@ -3739,22 +3854,22 @@ "comments": "", "group": "commit", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_author-6"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_author-6"], "general.c": [ - "ex/v1.8.4/general.html#git_commit_author-21", - "ex/v1.8.4/general.html#git_commit_author-22" + "ex/v1.9.1/general.html#git_commit_author-21", + "ex/v1.9.1/general.html#git_commit_author-22" ], "log.c": [ - "ex/v1.8.4/log.html#git_commit_author-13", - "ex/v1.8.4/log.html#git_commit_author-14" + "ex/v1.9.1/log.html#git_commit_author-13", + "ex/v1.9.1/log.html#git_commit_author-14" ] } }, "git_commit_committer_with_mailmap": { "type": "function", "file": "git2/commit.h", - "line": 186, - "lineto": 187, + "line": 190, + "lineto": 191, "args": [ { "name": "out", @@ -3782,8 +3897,8 @@ "git_commit_author_with_mailmap": { "type": "function", "file": "git2/commit.h", - "line": 200, - "lineto": 201, + "line": 204, + "lineto": 205, "args": [ { "name": "out", @@ -3811,8 +3926,8 @@ "git_commit_raw_header": { "type": "function", "file": "git2/commit.h", - "line": 209, - "lineto": 209, + "line": 213, + "lineto": 213, "args": [ { "name": "commit", @@ -3833,8 +3948,8 @@ "git_commit_tree": { "type": "function", "file": "git2/commit.h", - "line": 218, - "lineto": 218, + "line": 222, + "lineto": 222, "args": [ { "name": "tree_out", @@ -3855,19 +3970,19 @@ "group": "commit", "examples": { "log.c": [ - "ex/v1.8.4/log.html#git_commit_tree-15", - "ex/v1.8.4/log.html#git_commit_tree-16", - "ex/v1.8.4/log.html#git_commit_tree-17", - "ex/v1.8.4/log.html#git_commit_tree-18", - "ex/v1.8.4/log.html#git_commit_tree-19" + "ex/v1.9.1/log.html#git_commit_tree-15", + "ex/v1.9.1/log.html#git_commit_tree-16", + "ex/v1.9.1/log.html#git_commit_tree-17", + "ex/v1.9.1/log.html#git_commit_tree-18", + "ex/v1.9.1/log.html#git_commit_tree-19" ] } }, "git_commit_tree_id": { "type": "function", "file": "git2/commit.h", - "line": 228, - "lineto": 228, + "line": 232, + "lineto": 232, "args": [ { "name": "commit", @@ -3885,14 +4000,14 @@ "comments": "", "group": "commit", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_tree_id-7"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_tree_id-7"] } }, "git_commit_parentcount": { "type": "function", "file": "git2/commit.h", - "line": 236, - "lineto": 236, + "line": 240, + "lineto": 240, "args": [ { "name": "commit", @@ -3910,19 +4025,19 @@ "comments": "", "group": "commit", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_parentcount-8"], - "general.c": ["ex/v1.8.4/general.html#git_commit_parentcount-23"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_parentcount-8"], + "general.c": ["ex/v1.9.1/general.html#git_commit_parentcount-23"], "log.c": [ - "ex/v1.8.4/log.html#git_commit_parentcount-20", - "ex/v1.8.4/log.html#git_commit_parentcount-21" + "ex/v1.9.1/log.html#git_commit_parentcount-20", + "ex/v1.9.1/log.html#git_commit_parentcount-21" ] } }, "git_commit_parent": { "type": "function", "file": "git2/commit.h", - "line": 246, - "lineto": 249, + "line": 250, + "lineto": 253, "args": [ { "name": "out", @@ -3947,18 +4062,18 @@ "comments": "", "group": "commit", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_commit_parent-24"], + "general.c": ["ex/v1.9.1/general.html#git_commit_parent-24"], "log.c": [ - "ex/v1.8.4/log.html#git_commit_parent-22", - "ex/v1.8.4/log.html#git_commit_parent-23" + "ex/v1.9.1/log.html#git_commit_parent-22", + "ex/v1.9.1/log.html#git_commit_parent-23" ] } }, "git_commit_parent_id": { "type": "function", "file": "git2/commit.h", - "line": 260, - "lineto": 262, + "line": 264, + "lineto": 266, "args": [ { "name": "commit", @@ -3981,15 +4096,15 @@ "comments": "", "group": "commit", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_commit_parent_id-9"], - "log.c": ["ex/v1.8.4/log.html#git_commit_parent_id-24"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_commit_parent_id-9"], + "log.c": ["ex/v1.9.1/log.html#git_commit_parent_id-24"] } }, "git_commit_nth_gen_ancestor": { "type": "function", "file": "git2/commit.h", - "line": 278, - "lineto": 281, + "line": 282, + "lineto": 285, "args": [ { "name": "ancestor", @@ -4020,8 +4135,8 @@ "git_commit_header_field": { "type": "function", "file": "git2/commit.h", - "line": 293, - "lineto": 293, + "line": 297, + "lineto": 297, "args": [ { "name": "out", @@ -4052,8 +4167,8 @@ "git_commit_extract_signature": { "type": "function", "file": "git2/commit.h", - "line": 313, - "lineto": 313, + "line": 317, + "lineto": 317, "args": [ { "name": "signature", @@ -4094,8 +4209,8 @@ "git_commit_create": { "type": "function", "file": "git2/commit.h", - "line": 359, - "lineto": 369, + "line": 363, + "lineto": 373, "args": [ { "name": "id", @@ -4157,122 +4272,184 @@ "description": "

Create new commit in the repository from a list of git_object pointers

\n", "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n", "group": "commit", - "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_commit_create-7"] } + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_commit_create-7"] } }, "git_commit_create_v": { "type": "function", "file": "git2/commit.h", - "line": 385, - "lineto": 395, - "args": [ - { "name": "id", "type": "git_oid *", "comment": null }, - { "name": "repo", "type": "git_repository *", "comment": null }, - { "name": "update_ref", "type": "const char *", "comment": null }, - { "name": "author", "type": "const git_signature *", "comment": null }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { "name": "message_encoding", "type": "const char *", "comment": null }, - { "name": "message", "type": "const char *", "comment": null }, - { "name": "tree", "type": "const git_tree *", "comment": null }, - { "name": "parent_count", "type": "size_t", "comment": null } - ], - "argline": "git_oid *id, 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, size_t parent_count", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t", - "return": { "type": "int", "comment": null }, - "description": "

Create new commit in the repository using a variable argument list.

\n", - "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", - "group": "commit", - "examples": { - "commit.c": ["ex/v1.8.4/commit.html#git_commit_create_v-1"], - "general.c": ["ex/v1.8.4/general.html#git_commit_create_v-25"], - "init.c": ["ex/v1.8.4/init.html#git_commit_create_v-1"] - } - }, - "git_commit_create_from_stage": { - "type": "function", - "file": "git2/commit.h", - "line": 434, - "lineto": 438, + "line": 420, + "lineto": 430, "args": [ { "name": "id", "type": "git_oid *", - "comment": "pointer to store the new commit's object id" + "comment": "Pointer in which to store the OID of the newly created commit" }, { "name": "repo", "type": "git_repository *", - "comment": "repository to commit changes in" + "comment": "Repository where to store the commit" }, { - "name": "message", + "name": "update_ref", "type": "const char *", - "comment": "the commit message" - }, - { - "name": "opts", - "type": "const git_commit_create_options *", - "comment": "options for creating the commit" - } - ], - "argline": "git_oid *id, git_repository *repo, const char *message, const git_commit_create_options *opts", - "sig": "git_oid *::git_repository *::const char *::const git_commit_create_options *", - "return": { - "type": "int", - "comment": " 0 on success, GIT_EUNCHANGED if there were no changes to commit, or an error code" - }, - "description": "

Commits the staged changes in the repository; this is a near analog to\n git commit -m message.

\n", - "comments": "

By default, empty commits are not allowed.

\n", - "group": "commit" - }, - "git_commit_amend": { - "type": "function", - "file": "git2/commit.h", - "line": 461, - "lineto": 469, - "args": [ - { "name": "id", "type": "git_oid *", "comment": null }, - { - "name": "commit_to_amend", - "type": "const git_commit *", - "comment": null - }, - { "name": "update_ref", "type": "const char *", "comment": null }, - { "name": "author", "type": "const git_signature *", "comment": null }, - { - "name": "committer", - "type": "const git_signature *", - "comment": null - }, - { "name": "message_encoding", "type": "const char *", "comment": null }, - { "name": "message", "type": "const char *", "comment": null }, - { "name": "tree", "type": "const git_tree *", "comment": null } - ], - "argline": "git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree", - "sig": "git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *", - "return": { "type": "int", "comment": null }, - "description": "

Amend an existing commit by replacing only non-NULL values.

\n", - "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", - "group": "commit" - }, - "git_commit_create_buffer": { - "type": "function", - "file": "git2/commit.h", - "line": 506, - "lineto": 515, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "the buffer into which to write the commit object content" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where the referenced tree and parents live" + "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + }, + { + "name": "parent_count", + "type": "size_t", + "comment": "Number of parents for this commit" + } + ], + "argline": "git_oid *id, 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, size_t parent_count", + "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *::size_t", + "return": { + "type": "int", + "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" + }, + "description": "

Create new commit in the repository using a variable argument list.

\n", + "comments": "

The message will not be cleaned up automatically. You can do that with the git_message_prettify() function.

\n\n

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

\n\n

All other parameters remain the same as git_commit_create().

\n", + "group": "commit", + "examples": { + "commit.c": ["ex/v1.9.1/commit.html#git_commit_create_v-1"], + "general.c": ["ex/v1.9.1/general.html#git_commit_create_v-25"], + "init.c": ["ex/v1.9.1/init.html#git_commit_create_v-1"] + } + }, + "git_commit_create_from_stage": { + "type": "function", + "file": "git2/commit.h", + "line": 472, + "lineto": 476, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "pointer to store the new commit's object id" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository to commit changes in" + }, + { + "name": "message", + "type": "const char *", + "comment": "the commit message" + }, + { + "name": "opts", + "type": "const git_commit_create_options *", + "comment": "options for creating the commit" + } + ], + "argline": "git_oid *id, git_repository *repo, const char *message, const git_commit_create_options *opts", + "sig": "git_oid *::git_repository *::const char *::const git_commit_create_options *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_EUNCHANGED if there were no changes to commit, or an error code" + }, + "description": "

Commits the staged changes in the repository; this is a near analog to\n git commit -m message.

\n", + "comments": "

By default, empty commits are not allowed.

\n", + "group": "commit" + }, + "git_commit_amend": { + "type": "function", + "file": "git2/commit.h", + "line": 528, + "lineto": 536, + "args": [ + { + "name": "id", + "type": "git_oid *", + "comment": "Pointer in which to store the OID of the newly created commit" + }, + { + "name": "commit_to_amend", + "type": "const git_commit *", + "comment": "The commit to amend" + }, + { + "name": "update_ref", + "type": "const char *", + "comment": "If not NULL, name of the reference that\n\twill be updated to point to this commit. If the reference\n\tis not direct, it will be resolved to a direct reference.\n\tUse \"HEAD\" to update the HEAD of the current branch and\n\tmake it point to this commit. If the reference doesn't\n\texist yet, it will be created. If it does exist, the first\n\tparent must be the tip of this branch." + }, + { + "name": "author", + "type": "const git_signature *", + "comment": "Signature with author and author time of commit" + }, + { + "name": "committer", + "type": "const git_signature *", + "comment": "Signature with committer and * commit time of commit" + }, + { + "name": "message_encoding", + "type": "const char *", + "comment": "The encoding for the message in the\n commit, represented with a standard encoding name.\n E.g. \"UTF-8\". If NULL, no encoding header is written and\n UTF-8 is assumed." + }, + { + "name": "message", + "type": "const char *", + "comment": "Full message for this commit" + }, + { + "name": "tree", + "type": "const git_tree *", + "comment": "An instance of a `git_tree` object that will\n be used as the tree for the commit. This tree object must\n also be owned by the given `repo`." + } + ], + "argline": "git_oid *id, const git_commit *commit_to_amend, const char *update_ref, const git_signature *author, const git_signature *committer, const char *message_encoding, const char *message, const git_tree *tree", + "sig": "git_oid *::const git_commit *::const char *::const git_signature *::const git_signature *::const char *::const char *::const git_tree *", + "return": { + "type": "int", + "comment": " 0 or an error code\n\tThe created commit will be written to the Object Database and\n\tthe given reference will be updated to point to it" + }, + "description": "

Amend an existing commit by replacing only non-NULL values.

\n", + "comments": "

This creates a new commit that is exactly the same as the old commit, except that any non-NULL values will be updated. The new commit has the same parents as the old commit.

\n\n

The update_ref value works as in the regular git_commit_create(), updating the ref to point to the newly rewritten commit. If you want to amend a commit that is not currently the tip of the branch and then rewrite the following commits to reach a ref, pass this as NULL and update the rest of the commit chain and ref separately.

\n\n

Unlike git_commit_create(), the author, committer, message, message_encoding, and tree parameters can be NULL in which case this will use the values from the original commit_to_amend.

\n\n

All parameters have the same meanings as in git_commit_create().

\n", + "group": "commit" + }, + "git_commit_create_buffer": { + "type": "function", + "file": "git2/commit.h", + "line": 573, + "lineto": 582, + "args": [ + { + "name": "out", + "type": "git_buf *", + "comment": "the buffer into which to write the commit object content" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository where the referenced tree and parents live" }, { "name": "author", @@ -4320,8 +4497,8 @@ "git_commit_create_with_signature": { "type": "function", "file": "git2/commit.h", - "line": 533, - "lineto": 538, + "line": 600, + "lineto": 605, "args": [ { "name": "out", @@ -4359,8 +4536,8 @@ "git_commit_dup": { "type": "function", "file": "git2/commit.h", - "line": 548, - "lineto": 548, + "line": 615, + "lineto": 615, "args": [ { "name": "out", @@ -4383,8 +4560,8 @@ "git_commitarray_dispose": { "type": "function", "file": "git2/commit.h", - "line": 603, - "lineto": 603, + "line": 670, + "lineto": 670, "args": [ { "name": "array", @@ -4402,8 +4579,8 @@ "git_libgit2_version": { "type": "function", "file": "git2/common.h", - "line": 117, - "lineto": 117, + "line": 119, + "lineto": 119, "args": [ { "name": "major", @@ -4434,8 +4611,8 @@ "git_libgit2_prerelease": { "type": "function", "file": "git2/common.h", - "line": 128, - "lineto": 128, + "line": 130, + "lineto": 130, "args": [], "argline": "", "sig": "", @@ -4450,8 +4627,8 @@ "git_libgit2_features": { "type": "function", "file": "git2/common.h", - "line": 180, - "lineto": 180, + "line": 184, + "lineto": 184, "args": [], "argline": "", "sig": "", @@ -4460,14 +4637,36 @@ "comment": " A combination of GIT_FEATURE_* values." }, "description": "

Query compile time options for libgit2.

\n", - "comments": "
    \n
  • GIT_FEATURE_THREADS Libgit2 was compiled with thread support. Note that thread support is still to be seen as a 'work in progress' - basic object lookups are believed to be threadsafe, but other operations may not be.

  • \n
  • GIT_FEATURE_HTTPS Libgit2 supports the https:// protocol. This requires the openssl library to be found when compiling libgit2.

  • \n
  • GIT_FEATURE_SSH Libgit2 supports the SSH protocol for network operations. This requires the libssh2 library to be found when compiling libgit2

  • \n
  • GIT_FEATURE_NSEC Libgit2 supports the sub-second resolution in file modification times.

  • \n
\n", + "comments": "", + "group": "libgit2" + }, + "git_libgit2_feature_backend": { + "type": "function", + "file": "git2/common.h", + "line": 205, + "lineto": 206, + "args": [ + { + "name": "feature", + "type": "git_feature_t", + "comment": "the feature to query details for" + } + ], + "argline": "git_feature_t feature", + "sig": "git_feature_t", + "return": { + "type": "const char *", + "comment": " the provider details, or NULL if the feature is not supported" + }, + "description": "

Query the backend details for the compile-time feature in libgit2.

\n", + "comments": "

This will return the "backend" for the feature, which is useful for things like HTTPS or SSH support, that can have multiple backends that could be compiled in.

\n\n

For example, when libgit2 is compiled with dynamic OpenSSL support, the feature backend will be openssl-dynamic. The feature backend names reflect the compilation options specified to the build system (though in all lower case). The backend may be "builtin" for features that are provided by libgit2 itself.

\n\n

If the feature is not supported by the library, this API returns NULL.

\n", "group": "libgit2" }, "git_libgit2_opts": { "type": "function", "file": "git2/common.h", - "line": 530, - "lineto": 530, + "line": 569, + "lineto": 569, "args": [{ "name": "option", "type": "int", "comment": "Option key" }], "argline": "int option", "sig": "int", @@ -4476,14 +4675,14 @@ "comment": " 0 on success, \n<\n0 on failure" }, "description": "

Set or query a library global option

\n", - "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Either parameter may be `NULL`, but not both.\n\n* opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)\n\n    > Set the value of the comment section of the User-Agent header.        > This can be information about your product and its version.       > By default this is "libgit2" followed by the libgit2 version.     >       > This value will be appended to User-Agent _product_, which        > is typically set to "git/2.0".        >       > Set to the empty string ("") to not send any information in the       > comment section, or set to NULL to restore the default.\n\n* opts(GIT_OPT_GET_USER_AGENT, git_buf *out)\n\n    > Get the value of the User-Agent header.       > The User-Agent is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_USER_AGENT_PRODUCT, const char *user_agent_product)\n\n    > Set the value of the product portion of the User-Agent header.        > This defaults to "git/2.0", for compatibility with other git      > clients. It is recommended to keep this as git/<version> for      > compatibility with servers that do user-agent detection.      >       > Set to the empty string ("") to not send any user-agent string,       > or set to NULL to restore the default.\n\n* opts(GIT_OPT_GET_USER_AGENT_PRODUCT, git_buf *out)\n\n    > Get the value of the User-Agent product header.       > The User-Agent product is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)\n\n    > Set the share mode used when opening files on Windows.        > For more information, see the documentation for CreateFile.       > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE.  This is      > ignored and unused on non-Windows platforms.\n\n* opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)\n\n    > Get the share mode used when opening files on Windows.\n\n* opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)\n\n    > Enable strict input validation when creating new objects      > to ensure that all inputs to the new objects are valid.  For      > example, when this is enabled, the parent(s) and tree inputs      > will be validated when creating a new commit.  This defaults      > to enabled.\n\n* opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)\n\n    > Validate the target of a symbolic ref when creating it.  For      > example, `foobar` is not a valid ref, therefore `foobar` is       > not a valid target for a symbolic ref by default, whereas     > `refs/heads/foobar` is.  Disabling this bypasses validation       > so that an arbitrary strings such as `foobar` can be used     > for a symbolic ref target.  This defaults to enabled.\n\n* opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)\n\n    > Set the SSL ciphers use for HTTPS connections.        >       > - `ciphers` is the list of ciphers that are eanbled.\n\n* opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)\n\n    > Enable or disable the use of "offset deltas" when creating packfiles,     > and the negotiation of them when talking to a remote server.      > Offset deltas store a delta base location as an offset into the       > packfile from the current location, which provides a shorter encoding     > and thus smaller resultant packfiles.     > Packfiles containing offset deltas can still be read.     > This defaults to enabled.\n\n* opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)\n\n    > Enable synchronized writes of files in the gitdir using `fsync`       > (or the platform equivalent) to ensure that new object data       > is written to permanent storage, not simply cached.  This     > defaults to disabled.\n\n opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)\n\n    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n\n opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)\n\n    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n\n opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)\n\n    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n\n opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)\n\n    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n\n opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)\n\n    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n\n opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled)       > This will cause .keep file existence checks to be skipped when        > accessing packfiles, which can help performance with remote filesystems.\n\n opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled)     > When connecting to a server using NTLM or Negotiate       > authentication, use expect/continue when POSTing data.        > This option is not available on Windows.\n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n\n

opts(GIT_OPT_GET_HOMEDIR, git_buf *out) > Gets the current user's home directory, as it will be used > for file lookups. The path is written to the out buffer.

\n\n

opts(GIT_OPT_SET_HOMEDIR, const char *path) > Sets the directory used as the current user's home directory, > for file lookups. > > - path directory of home directory.

\n\n

opts(GIT_OPT_GET_SERVER_CONNECT_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) to attempt connections to > a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_CONNECT_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) to attempt connections to > a remote server. Set to 0 to use the system default. Note that > this may not be able to be configured longer than the system > default, typically 75 seconds.

\n\n

opts(GIT_OPT_GET_SERVER_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) for reading from and writing > to a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) for reading from and writing > to a remote server. Set to 0 to use the system default.

\n", + "comments": "

Available options:

\n\n
* opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):\n\n    > Get the maximum mmap window size\n\n* opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):\n\n    > Set the maximum mmap window size\n\n* opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):\n\n    > Get the maximum memory that will be mapped in total by the library\n\n* opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):\n\n    > Set the maximum amount of memory that can be mapped at any time       > by the library\n\n* opts(GIT_OPT_GET_MWINDOW_FILE_LIMIT, size_t *):\n\n    > Get the maximum number of files that will be mapped at any time by the        > library\n\n* opts(GIT_OPT_SET_MWINDOW_FILE_LIMIT, size_t):\n\n    > Set the maximum number of files that can be mapped at any time        > by the library. The default (0) is unlimited.\n\n* opts(GIT_OPT_GET_SEARCH_PATH, int level, git_buf *buf)\n\n    > Get the search path for a given level of config data.  "level" must       > be one of `GIT_CONFIG_LEVEL_SYSTEM`, `GIT_CONFIG_LEVEL_GLOBAL`,       > `GIT_CONFIG_LEVEL_XDG`, or `GIT_CONFIG_LEVEL_PROGRAMDATA`.        > The search path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_SEARCH_PATH, int level, const char *path)\n\n    > Set the search path for a level of config data.  The search path      > applied to shared attributes and ignore files, too.       >       > - `path` lists directories delimited by GIT_PATH_LIST_SEPARATOR.      >   Pass NULL to reset to the default (generally based on environment       >   variables).  Use magic path `$PATH` to include the old value        >   of the path (if you want to prepend or append, for instance).       >       > - `level` must be `GIT_CONFIG_LEVEL_SYSTEM`,      >   `GIT_CONFIG_LEVEL_GLOBAL`, `GIT_CONFIG_LEVEL_XDG`, or       >   `GIT_CONFIG_LEVEL_PROGRAMDATA`.\n\n* opts(GIT_OPT_SET_CACHE_OBJECT_LIMIT, git_object_t type, size_t size)\n\n    > Set the maximum data size for the given type of object to be      > considered eligible for caching in memory.  Setting to value to       > zero means that that type of object will not be cached.       > Defaults to 0 for GIT_OBJECT_BLOB (i.e. won't cache blobs) and 4k     > for GIT_OBJECT_COMMIT, GIT_OBJECT_TREE, and GIT_OBJECT_TAG.\n\n* opts(GIT_OPT_SET_CACHE_MAX_SIZE, ssize_t max_storage_bytes)\n\n    > Set the maximum total data size that will be cached in memory     > across all repositories before libgit2 starts evicting objects        > from the cache.  This is a soft limit, in that the library might      > briefly exceed it, but will start aggressively evicting objects       > from cache when that happens.  The default cache size is 256MB.\n\n* opts(GIT_OPT_ENABLE_CACHING, int enabled)\n\n    > Enable or disable caching completely.     >       > Because caches are repository-specific, disabling the cache       > cannot immediately clear all cached objects, but each cache will      > be cleared on the next attempt to update anything in it.\n\n* opts(GIT_OPT_GET_CACHED_MEMORY, ssize_t *current, ssize_t *allowed)\n\n    > Get the current bytes in cache and the maximum that would be      > allowed in the cache.\n\n* opts(GIT_OPT_GET_TEMPLATE_PATH, git_buf *out)\n\n    > Get the default template path.        > The path is written to the `out` buffer.\n\n* opts(GIT_OPT_SET_TEMPLATE_PATH, const char *path)\n\n    > Set the default template path.        >       > - `path` directory of template.\n\n* opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, const char *file, const char *path)\n\n    > Set the SSL certificate-authority locations.      >       > - `file` is the location of a file containing several     >   certificates concatenated together.     > - `path` is the location of a directory holding several       >   certificates, one per file.     >       > Calling `GIT_OPT_ADD_SSL_X509_CERT` may override the      > data in `path`.       >       > Either parameter may be `NULL`, but not both.\n
\n\n
    \n
  • opts(GIT_OPT_ADD_SSL_X509_CERT, const X509 *cert)

    \n\n
    > Add a raw X509 certificate into the SSL certs store.      > This certificate is only used by libgit2 invocations      > during the application lifetime and is not persisted      > to disk. This certificate cannot be removed from the      > application once is has been added.       >       > - `cert` is the raw X509 cert will be added to cert store.\n
    \n\n
      \n
    • opts(GIT_OPT_SET_USER_AGENT, const char *user_agent)

      \n\n
      \n

      Set the value of the comment section of the User-Agent header. > This can be information about your product and its version. > By default this is "libgit2" followed by the libgit2 version. > > This value will be appended to User-Agent product, which > is typically set to "git/2.0". > > Set to the empty string ("") to not send any information in the > comment section, or set to NULL to restore the default.

      \n
    • \n
    • opts(GIT_OPT_GET_USER_AGENT, git_buf *out)

      \n\n
      \n

      Get the value of the User-Agent header. > The User-Agent is written to the out buffer.

      \n
    • \n
    • opts(GIT_OPT_SET_USER_AGENT_PRODUCT, const char *user_agent_product)

      \n\n
      \n

      Set the value of the product portion of the User-Agent header. > This defaults to "git/2.0", for compatibility with other git > clients. It is recommended to keep this as git/ for > compatibility with servers that do user-agent detection. > > Set to the empty string ("") to not send any user-agent string, > or set to NULL to restore the default.

      \n
    • \n
    • opts(GIT_OPT_GET_USER_AGENT_PRODUCT, git_buf *out)

      \n\n
      \n

      Get the value of the User-Agent product header. > The User-Agent product is written to the out buffer.

      \n
    • \n
    • opts(GIT_OPT_SET_WINDOWS_SHAREMODE, unsigned long value)

      \n\n
      \n

      Set the share mode used when opening files on Windows. > For more information, see the documentation for CreateFile. > The default is: FILE_SHARE_READ | FILE_SHARE_WRITE. This is > ignored and unused on non-Windows platforms.

      \n
    • \n
    • opts(GIT_OPT_GET_WINDOWS_SHAREMODE, unsigned long *value)

      \n\n
      \n

      Get the share mode used when opening files on Windows.

      \n
    • \n
    • opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, int enabled)

      \n\n
      \n

      Enable strict input validation when creating new objects > to ensure that all inputs to the new objects are valid. For > example, when this is enabled, the parent(s) and tree inputs > will be validated when creating a new commit. This defaults > to enabled.

      \n
    • \n
    • opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled)

      \n\n
      \n

      Validate the target of a symbolic ref when creating it. For > example, foobar is not a valid ref, therefore foobar is > not a valid target for a symbolic ref by default, whereas > refs/heads/foobar is. Disabling this bypasses validation > so that an arbitrary strings such as foobar can be used > for a symbolic ref target. This defaults to enabled.

      \n
    • \n
    • opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers)

      \n\n
      \n

      Set the SSL ciphers use for HTTPS connections. > > - ciphers is the list of ciphers that are eanbled.

      \n
    • \n
    • opts(GIT_OPT_ENABLE_OFS_DELTA, int enabled)

      \n\n
      \n

      Enable or disable the use of "offset deltas" when creating packfiles, > and the negotiation of them when talking to a remote server. > Offset deltas store a delta base location as an offset into the > packfile from the current location, which provides a shorter encoding > and thus smaller resultant packfiles. > Packfiles containing offset deltas can still be read. > This defaults to enabled.

      \n
    • \n
    • opts(GIT_OPT_ENABLE_FSYNC_GITDIR, int enabled)

      \n\n
      \n

      Enable synchronized writes of files in the gitdir using fsync > (or the platform equivalent) to ensure that new object data > is written to permanent storage, not simply cached. This > defaults to disabled.

      \n
    • \n
    \n\n

    opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, int enabled)

    \n\n
    > Enable strict verification of object hashsums when reading        > objects from disk. This may impact performance due to an      > additional checksum calculation on each object. This defaults     > to enabled.\n
    \n\n

    opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)

    \n\n
    > Set the memory allocator to a different memory allocator. This        > allocator will then be used to make all memory allocations for        > libgit2 operations.  If the given `allocator` is NULL, then the       > system default will be restored.\n
    \n\n

    opts(GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, int enabled)

    \n\n
    > Ensure that there are no unsaved changes in the index before      > beginning any operation that reloads the index from disk (eg,     > checkout).  If there are unsaved changes, the instruction will        > fail.  (Using the FORCE flag to checkout will still overwrite     > these changes.)\n
    \n\n

    opts(GIT_OPT_GET_PACK_MAX_OBJECTS, size_t *out)

    \n\n
    > Get the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote. This can be      > used to limit maximum memory usage when fetching from an untrusted        > remote.\n
    \n\n

    opts(GIT_OPT_SET_PACK_MAX_OBJECTS, size_t objects)

    \n\n
    > Set the maximum number of objects libgit2 will allow in a pack        > file when downloading a pack file from a remote.\n
    \n\n

    opts(GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, int enabled) > This will cause .keep file existence checks to be skipped when > accessing packfiles, which can help performance with remote filesystems.

    \n\n

    opts(GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, int enabled) > When connecting to a server using NTLM or Negotiate > authentication, use expect/continue when POSTing data. > This option is not available on Windows.

  • \n
\n\n

opts(GIT_OPT_SET_ODB_PACKED_PRIORITY, int priority) > Override the default priority of the packed ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_SET_ODB_LOOSE_PRIORITY, int priority) > Override the default priority of the loose ODB backend which > is added when default backends are assigned to a repository

\n\n

opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) > Returns the list of git extensions that are supported. This > is the list of built-in extensions supported by libgit2 and > custom extensions that have been added with > GIT_OPT_SET_EXTENSIONS. Extensions that have been negated > will not be returned. The returned list should be released > with git_strarray_dispose.

\n\n

opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) > Set that the given git extensions are supported by the caller. > Extensions supported by libgit2 may be negated by prefixing > them with a !. For example: setting extensions to > { "!noop", "newext" } indicates that the caller does not want > to support repositories with the noop extension but does want > to support repositories with the newext extension.

\n\n

opts(GIT_OPT_GET_OWNER_VALIDATION, int *enabled) > Gets the owner validation setting for repository > directories.

\n\n

opts(GIT_OPT_SET_OWNER_VALIDATION, int enabled) > Set that repository directories should be owned by the current > user. The default is to validate ownership.

\n\n

opts(GIT_OPT_GET_HOMEDIR, git_buf *out) > Gets the current user's home directory, as it will be used > for file lookups. The path is written to the out buffer.

\n\n

opts(GIT_OPT_SET_HOMEDIR, const char *path) > Sets the directory used as the current user's home directory, > for file lookups. > > - path directory of home directory.

\n\n

opts(GIT_OPT_GET_SERVER_CONNECT_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) to attempt connections to > a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_CONNECT_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) to attempt connections to > a remote server. Set to 0 to use the system default. Note that > this may not be able to be configured longer than the system > default, typically 75 seconds.

\n\n

opts(GIT_OPT_GET_SERVER_TIMEOUT, int *timeout) > Gets the timeout (in milliseconds) for reading from and writing > to a remote server.

\n\n

opts(GIT_OPT_SET_SERVER_TIMEOUT, int timeout) > Sets the timeout (in milliseconds) for reading from and writing > to a remote server. Set to 0 to use the system default.

\n", "group": "libgit2" }, "git_config_entry_free": { "type": "function", "file": "git2/config.h", - "line": 113, - "lineto": 113, + "line": 131, + "lineto": 131, "args": [ { "name": "entry", @@ -4494,21 +4693,21 @@ "argline": "git_config_entry *entry", "sig": "git_config_entry *", "return": { "type": "void", "comment": null }, - "description": "

Free a config entry

\n", + "description": "

Free a config entry.

\n", "comments": "", "group": "config", "examples": { "config.c": [ - "ex/v1.8.4/config.html#git_config_entry_free-1", - "ex/v1.8.4/config.html#git_config_entry_free-2" + "ex/v1.9.1/config.html#git_config_entry_free-1", + "ex/v1.9.1/config.html#git_config_entry_free-2" ] } }, "git_config_find_global": { "type": "function", "file": "git2/config.h", - "line": 165, - "lineto": 165, + "line": 183, + "lineto": 183, "args": [ { "name": "out", @@ -4529,8 +4728,8 @@ "git_config_find_xdg": { "type": "function", "file": "git2/config.h", - "line": 182, - "lineto": 182, + "line": 200, + "lineto": 200, "args": [ { "name": "out", @@ -4551,8 +4750,8 @@ "git_config_find_system": { "type": "function", "file": "git2/config.h", - "line": 194, - "lineto": 194, + "line": 212, + "lineto": 212, "args": [ { "name": "out", @@ -4573,8 +4772,8 @@ "git_config_find_programdata": { "type": "function", "file": "git2/config.h", - "line": 205, - "lineto": 205, + "line": 223, + "lineto": 223, "args": [ { "name": "out", @@ -4595,8 +4794,8 @@ "git_config_open_default": { "type": "function", "file": "git2/config.h", - "line": 217, - "lineto": 217, + "line": 235, + "lineto": 235, "args": [ { "name": "out", @@ -4614,8 +4813,8 @@ "git_config_new": { "type": "function", "file": "git2/config.h", - "line": 228, - "lineto": 228, + "line": 246, + "lineto": 246, "args": [ { "name": "out", @@ -4633,8 +4832,8 @@ "git_config_add_file_ondisk": { "type": "function", "file": "git2/config.h", - "line": 257, - "lineto": 262, + "line": 275, + "lineto": 280, "args": [ { "name": "cfg", @@ -4675,8 +4874,8 @@ "git_config_open_ondisk": { "type": "function", "file": "git2/config.h", - "line": 276, - "lineto": 276, + "line": 294, + "lineto": 294, "args": [ { "name": "out", @@ -4696,14 +4895,14 @@ "comments": "

This method is a simple utility wrapper for the following sequence of calls: - git_config_new - git_config_add_file_ondisk

\n", "group": "config", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_config_open_ondisk-26"] + "general.c": ["ex/v1.9.1/general.html#git_config_open_ondisk-26"] } }, "git_config_open_level": { "type": "function", "file": "git2/config.h", - "line": 294, - "lineto": 297, + "line": 312, + "lineto": 315, "args": [ { "name": "out", @@ -4734,8 +4933,8 @@ "git_config_open_global": { "type": "function", "file": "git2/config.h", - "line": 312, - "lineto": 312, + "line": 330, + "lineto": 330, "args": [ { "name": "out", @@ -4755,11 +4954,40 @@ "comments": "

Git allows you to store your global configuration at $HOME/.gitconfig or $XDG_CONFIG_HOME/git/config. For backwards compatibility, the XDG file shouldn't be used unless the use has created it explicitly. With this function you'll open the correct one to write to.

\n", "group": "config" }, + "git_config_set_writeorder": { + "type": "function", + "file": "git2/config.h", + "line": 343, + "lineto": 346, + "args": [ + { + "name": "cfg", + "type": "git_config *", + "comment": "the configuration to change write order of" + }, + { + "name": "levels", + "type": "git_config_level_t *", + "comment": "the ordering of levels for writing" + }, + { + "name": "len", + "type": "size_t", + "comment": "the length of the levels array" + } + ], + "argline": "git_config *cfg, git_config_level_t *levels, size_t len", + "sig": "git_config *::git_config_level_t *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Set the write order for configuration backends. By default, the\n write ordering does not match the read ordering; for example, the\n worktree configuration is a high-priority for reading, but is not\n written to unless explicitly chosen.

\n", + "comments": "", + "group": "config" + }, "git_config_snapshot": { "type": "function", "file": "git2/config.h", - "line": 333, - "lineto": 333, + "line": 362, + "lineto": 362, "args": [ { "name": "out", @@ -4782,8 +5010,8 @@ "git_config_free": { "type": "function", "file": "git2/config.h", - "line": 340, - "lineto": 340, + "line": 369, + "lineto": 369, "args": [ { "name": "cfg", @@ -4798,18 +5026,18 @@ "comments": "", "group": "config", "examples": { - "config.c": ["ex/v1.8.4/config.html#git_config_free-3"], + "config.c": ["ex/v1.9.1/config.html#git_config_free-3"], "general.c": [ - "ex/v1.8.4/general.html#git_config_free-27", - "ex/v1.8.4/general.html#git_config_free-28" + "ex/v1.9.1/general.html#git_config_free-27", + "ex/v1.9.1/general.html#git_config_free-28" ] } }, "git_config_get_entry": { "type": "function", "file": "git2/config.h", - "line": 352, - "lineto": 355, + "line": 381, + "lineto": 384, "args": [ { "name": "out", @@ -4834,14 +5062,14 @@ "comments": "

Free the git_config_entry after use with git_config_entry_free().

\n", "group": "config", "examples": { - "config.c": ["ex/v1.8.4/config.html#git_config_get_entry-4"] + "config.c": ["ex/v1.9.1/config.html#git_config_get_entry-4"] } }, "git_config_get_int32": { "type": "function", "file": "git2/config.h", - "line": 369, - "lineto": 369, + "line": 398, + "lineto": 398, "args": [ { "name": "out", @@ -4867,16 +5095,16 @@ "group": "config", "examples": { "general.c": [ - "ex/v1.8.4/general.html#git_config_get_int32-29", - "ex/v1.8.4/general.html#git_config_get_int32-30" + "ex/v1.9.1/general.html#git_config_get_int32-29", + "ex/v1.9.1/general.html#git_config_get_int32-30" ] } }, "git_config_get_int64": { "type": "function", "file": "git2/config.h", - "line": 383, - "lineto": 383, + "line": 412, + "lineto": 412, "args": [ { "name": "out", @@ -4904,8 +5132,8 @@ "git_config_get_bool": { "type": "function", "file": "git2/config.h", - "line": 400, - "lineto": 400, + "line": 429, + "lineto": 429, "args": [ { "name": "out", @@ -4933,8 +5161,8 @@ "git_config_get_path": { "type": "function", "file": "git2/config.h", - "line": 418, - "lineto": 418, + "line": 447, + "lineto": 447, "args": [ { "name": "out", @@ -4962,8 +5190,8 @@ "git_config_get_string": { "type": "function", "file": "git2/config.h", - "line": 436, - "lineto": 436, + "line": 465, + "lineto": 465, "args": [ { "name": "out", @@ -4989,16 +5217,16 @@ "group": "config", "examples": { "general.c": [ - "ex/v1.8.4/general.html#git_config_get_string-31", - "ex/v1.8.4/general.html#git_config_get_string-32" + "ex/v1.9.1/general.html#git_config_get_string-31", + "ex/v1.9.1/general.html#git_config_get_string-32" ] } }, "git_config_get_string_buf": { "type": "function", "file": "git2/config.h", - "line": 452, - "lineto": 452, + "line": 481, + "lineto": 481, "args": [ { "name": "out", @@ -5026,8 +5254,8 @@ "git_config_get_multivar_foreach": { "type": "function", "file": "git2/config.h", - "line": 471, - "lineto": 471, + "line": 500, + "lineto": 500, "args": [ { "name": "cfg", @@ -5065,8 +5293,8 @@ "git_config_multivar_iterator_new": { "type": "function", "file": "git2/config.h", - "line": 487, - "lineto": 487, + "line": 516, + "lineto": 516, "args": [ { "name": "out", @@ -5099,8 +5327,8 @@ "git_config_next": { "type": "function", "file": "git2/config.h", - "line": 499, - "lineto": 499, + "line": 528, + "lineto": 528, "args": [ { "name": "entry", @@ -5126,8 +5354,8 @@ "git_config_iterator_free": { "type": "function", "file": "git2/config.h", - "line": 506, - "lineto": 506, + "line": 535, + "lineto": 535, "args": [ { "name": "iter", @@ -5145,8 +5373,8 @@ "git_config_set_int32": { "type": "function", "file": "git2/config.h", - "line": 517, - "lineto": 517, + "line": 546, + "lineto": 546, "args": [ { "name": "cfg", @@ -5174,8 +5402,8 @@ "git_config_set_int64": { "type": "function", "file": "git2/config.h", - "line": 528, - "lineto": 528, + "line": 557, + "lineto": 557, "args": [ { "name": "cfg", @@ -5203,8 +5431,8 @@ "git_config_set_bool": { "type": "function", "file": "git2/config.h", - "line": 539, - "lineto": 539, + "line": 568, + "lineto": 568, "args": [ { "name": "cfg", @@ -5228,8 +5456,8 @@ "git_config_set_string": { "type": "function", "file": "git2/config.h", - "line": 553, - "lineto": 553, + "line": 582, + "lineto": 582, "args": [ { "name": "cfg", @@ -5254,14 +5482,14 @@ "comments": "

A copy of the string is made and the user is free to use it afterwards.

\n", "group": "config", "examples": { - "config.c": ["ex/v1.8.4/config.html#git_config_set_string-5"] + "config.c": ["ex/v1.9.1/config.html#git_config_set_string-5"] } }, "git_config_set_multivar": { "type": "function", "file": "git2/config.h", - "line": 566, - "lineto": 566, + "line": 595, + "lineto": 595, "args": [ { "name": "cfg", @@ -5290,8 +5518,8 @@ "git_config_delete_entry": { "type": "function", "file": "git2/config.h", - "line": 576, - "lineto": 576, + "line": 605, + "lineto": 605, "args": [ { "name": "cfg", @@ -5314,8 +5542,8 @@ "git_config_delete_multivar": { "type": "function", "file": "git2/config.h", - "line": 589, - "lineto": 589, + "line": 618, + "lineto": 618, "args": [ { "name": "cfg", @@ -5343,8 +5571,8 @@ "git_config_foreach": { "type": "function", "file": "git2/config.h", - "line": 607, - "lineto": 610, + "line": 636, + "lineto": 639, "args": [ { "name": "cfg", @@ -5375,8 +5603,8 @@ "git_config_iterator_new": { "type": "function", "file": "git2/config.h", - "line": 622, - "lineto": 622, + "line": 651, + "lineto": 651, "args": [ { "name": "out", @@ -5399,8 +5627,8 @@ "git_config_iterator_glob_new": { "type": "function", "file": "git2/config.h", - "line": 639, - "lineto": 639, + "line": 668, + "lineto": 668, "args": [ { "name": "out", @@ -5428,8 +5656,8 @@ "git_config_foreach_match": { "type": "function", "file": "git2/config.h", - "line": 661, - "lineto": 665, + "line": 690, + "lineto": 694, "args": [ { "name": "cfg", @@ -5465,8 +5693,8 @@ "git_config_get_mapped": { "type": "function", "file": "git2/config.h", - "line": 701, - "lineto": 706, + "line": 730, + "lineto": 735, "args": [ { "name": "out", @@ -5507,8 +5735,8 @@ "git_config_lookup_map_value": { "type": "function", "file": "git2/config.h", - "line": 717, - "lineto": 721, + "line": 746, + "lineto": 750, "args": [ { "name": "out", @@ -5537,8 +5765,8 @@ "git_config_parse_bool": { "type": "function", "file": "git2/config.h", - "line": 734, - "lineto": 734, + "line": 763, + "lineto": 763, "args": [ { "name": "out", @@ -5557,8 +5785,8 @@ "git_config_parse_int32": { "type": "function", "file": "git2/config.h", - "line": 747, - "lineto": 747, + "line": 776, + "lineto": 776, "args": [ { "name": "out", @@ -5577,8 +5805,8 @@ "git_config_parse_int64": { "type": "function", "file": "git2/config.h", - "line": 760, - "lineto": 760, + "line": 789, + "lineto": 789, "args": [ { "name": "out", @@ -5597,8 +5825,8 @@ "git_config_parse_path": { "type": "function", "file": "git2/config.h", - "line": 776, - "lineto": 776, + "line": 805, + "lineto": 805, "args": [ { "name": "out", @@ -5621,8 +5849,8 @@ "git_config_backend_foreach_match": { "type": "function", "file": "git2/config.h", - "line": 795, - "lineto": 799, + "line": 824, + "lineto": 828, "args": [ { "name": "backend", @@ -5655,8 +5883,8 @@ "git_config_lock": { "type": "function", "file": "git2/config.h", - "line": 818, - "lineto": 818, + "line": 847, + "lineto": 847, "args": [ { "name": "tx", @@ -5679,8 +5907,8 @@ "git_credential_free": { "type": "function", "file": "git2/credential.h", - "line": 146, - "lineto": 146, + "line": 149, + "lineto": 149, "args": [ { "name": "cred", @@ -5698,8 +5926,8 @@ "git_credential_has_username": { "type": "function", "file": "git2/credential.h", - "line": 154, - "lineto": 154, + "line": 157, + "lineto": 157, "args": [ { "name": "cred", @@ -5720,8 +5948,8 @@ "git_credential_get_username": { "type": "function", "file": "git2/credential.h", - "line": 162, - "lineto": 162, + "line": 165, + "lineto": 165, "args": [ { "name": "cred", @@ -5742,8 +5970,8 @@ "git_credential_userpass_plaintext_new": { "type": "function", "file": "git2/credential.h", - "line": 173, - "lineto": 176, + "line": 176, + "lineto": 179, "args": [ { "name": "out", @@ -5774,8 +6002,8 @@ "git_credential_default_new": { "type": "function", "file": "git2/credential.h", - "line": 185, - "lineto": 185, + "line": 188, + "lineto": 188, "args": [ { "name": "out", @@ -5796,8 +6024,8 @@ "git_credential_username_new": { "type": "function", "file": "git2/credential.h", - "line": 197, - "lineto": 197, + "line": 200, + "lineto": 200, "args": [ { "name": "out", @@ -5823,8 +6051,8 @@ "git_credential_ssh_key_new": { "type": "function", "file": "git2/credential.h", - "line": 210, - "lineto": 215, + "line": 213, + "lineto": 218, "args": [ { "name": "out", @@ -5865,8 +6093,8 @@ "git_credential_ssh_key_memory_new": { "type": "function", "file": "git2/credential.h", - "line": 227, - "lineto": 232, + "line": 230, + "lineto": 235, "args": [ { "name": "out", @@ -5907,8 +6135,8 @@ "git_credential_ssh_interactive_new": { "type": "function", "file": "git2/credential.h", - "line": 263, - "lineto": 267, + "line": 278, + "lineto": 282, "args": [ { "name": "out", @@ -5944,8 +6172,8 @@ "git_credential_ssh_key_from_agent": { "type": "function", "file": "git2/credential.h", - "line": 277, - "lineto": 279, + "line": 292, + "lineto": 294, "args": [ { "name": "out", @@ -5971,8 +6199,8 @@ "git_credential_ssh_custom_new": { "type": "function", "file": "git2/credential.h", - "line": 305, - "lineto": 311, + "line": 332, + "lineto": 338, "args": [ { "name": "out", @@ -6057,8 +6285,8 @@ "git_blob_filtered_content": { "type": "function", "file": "git2/deprecated.h", - "line": 115, - "lineto": 119, + "line": 124, + "lineto": 128, "args": [ { "name": "out", "type": "git_buf *", "comment": null }, { "name": "blob", "type": "git_blob *", "comment": null }, @@ -6075,8 +6303,8 @@ "git_filter_list_stream_data": { "type": "function", "file": "git2/deprecated.h", - "line": 139, - "lineto": 142, + "line": 148, + "lineto": 151, "args": [ { "name": "filters", "type": "git_filter_list *", "comment": null }, { "name": "data", "type": "git_buf *", "comment": null }, @@ -6092,8 +6320,8 @@ "git_filter_list_apply_to_data": { "type": "function", "file": "git2/deprecated.h", - "line": 149, - "lineto": 152, + "line": 158, + "lineto": 161, "args": [ { "name": "out", "type": "git_buf *", "comment": null }, { "name": "filters", "type": "git_filter_list *", "comment": null }, @@ -6109,8 +6337,8 @@ "git_treebuilder_write_with_buffer": { "type": "function", "file": "git2/deprecated.h", - "line": 178, - "lineto": 179, + "line": 187, + "lineto": 188, "args": [ { "name": "oid", "type": "git_oid *", "comment": null }, { "name": "bld", "type": "git_treebuilder *", "comment": null }, @@ -6126,8 +6354,8 @@ "git_buf_grow": { "type": "function", "file": "git2/deprecated.h", - "line": 220, - "lineto": 220, + "line": 229, + "lineto": 229, "args": [ { "name": "buffer", @@ -6153,8 +6381,8 @@ "git_buf_set": { "type": "function", "file": "git2/deprecated.h", - "line": 230, - "lineto": 231, + "line": 239, + "lineto": 240, "args": [ { "name": "buffer", @@ -6185,8 +6413,8 @@ "git_buf_is_binary": { "type": "function", "file": "git2/deprecated.h", - "line": 239, - "lineto": 239, + "line": 248, + "lineto": 248, "args": [ { "name": "buf", @@ -6207,8 +6435,8 @@ "git_buf_contains_nul": { "type": "function", "file": "git2/deprecated.h", - "line": 247, - "lineto": 247, + "line": 256, + "lineto": 256, "args": [ { "name": "buf", @@ -6229,8 +6457,8 @@ "git_buf_free": { "type": "function", "file": "git2/deprecated.h", - "line": 259, - "lineto": 259, + "line": 268, + "lineto": 268, "args": [{ "name": "buffer", "type": "git_buf *", "comment": null }], "argline": "git_buf *buffer", "sig": "git_buf *", @@ -6242,8 +6470,8 @@ "git_diff_format_email": { "type": "function", "file": "git2/deprecated.h", - "line": 357, - "lineto": 360, + "line": 374, + "lineto": 377, "args": [ { "name": "out", "type": "git_buf *", "comment": null }, { "name": "diff", "type": "git_diff *", "comment": null }, @@ -6263,8 +6491,8 @@ "git_diff_commit_as_email": { "type": "function", "file": "git2/deprecated.h", - "line": 368, - "lineto": 375, + "line": 385, + "lineto": 392, "args": [ { "name": "out", "type": "git_buf *", "comment": null }, { "name": "repo", "type": "git_repository *", "comment": null }, @@ -6288,8 +6516,8 @@ "git_diff_format_email_options_init": { "type": "function", "file": "git2/deprecated.h", - "line": 387, - "lineto": 389, + "line": 404, + "lineto": 406, "args": [ { "name": "opts", @@ -6315,8 +6543,8 @@ "giterr_last": { "type": "function", "file": "git2/deprecated.h", - "line": 452, - "lineto": 452, + "line": 503, + "lineto": 503, "args": [], "argline": "", "sig": "", @@ -6328,8 +6556,8 @@ "giterr_clear": { "type": "function", "file": "git2/deprecated.h", - "line": 464, - "lineto": 464, + "line": 515, + "lineto": 515, "args": [], "argline": "", "sig": "", @@ -6341,8 +6569,8 @@ "giterr_set_str": { "type": "function", "file": "git2/deprecated.h", - "line": 476, - "lineto": 476, + "line": 527, + "lineto": 527, "args": [ { "name": "error_class", "type": "int", "comment": null }, { "name": "string", "type": "const char *", "comment": null } @@ -6357,8 +6585,8 @@ "giterr_set_oom": { "type": "function", "file": "git2/deprecated.h", - "line": 488, - "lineto": 488, + "line": 539, + "lineto": 539, "args": [], "argline": "", "sig": "", @@ -6370,8 +6598,8 @@ "git_object__size": { "type": "function", "file": "git2/deprecated.h", - "line": 578, - "lineto": 578, + "line": 666, + "lineto": 666, "args": [ { "name": "type", @@ -6389,8 +6617,8 @@ "git_remote_is_valid_name": { "type": "function", "file": "git2/deprecated.h", - "line": 599, - "lineto": 599, + "line": 687, + "lineto": 687, "args": [ { "name": "remote_name", @@ -6411,8 +6639,8 @@ "git_reference_is_valid_name": { "type": "function", "file": "git2/deprecated.h", - "line": 643, - "lineto": 643, + "line": 741, + "lineto": 741, "args": [ { "name": "refname", @@ -6433,8 +6661,8 @@ "git_oidarray_free": { "type": "function", "file": "git2/deprecated.h", - "line": 810, - "lineto": 810, + "line": 922, + "lineto": 922, "args": [{ "name": "array", "type": "git_oidarray *", "comment": null }], "argline": "git_oidarray *array", "sig": "git_oidarray *", @@ -6446,8 +6674,8 @@ "git_strarray_copy": { "type": "function", "file": "git2/deprecated.h", - "line": 879, - "lineto": 879, + "line": 991, + "lineto": 991, "args": [ { "name": "tgt", "type": "git_strarray *", "comment": "target" }, { "name": "src", "type": "const git_strarray *", "comment": "source" } @@ -6465,8 +6693,8 @@ "git_strarray_free": { "type": "function", "file": "git2/deprecated.h", - "line": 891, - "lineto": 891, + "line": 1003, + "lineto": 1003, "args": [{ "name": "array", "type": "git_strarray *", "comment": null }], "argline": "git_strarray *array", "sig": "git_strarray *", @@ -6478,8 +6706,8 @@ "git_blame_init_options": { "type": "function", "file": "git2/deprecated.h", - "line": 905, - "lineto": 905, + "line": 1035, + "lineto": 1035, "args": [ { "name": "opts", "type": "git_blame_options *", "comment": null }, { "name": "version", "type": "unsigned int", "comment": null } @@ -6494,8 +6722,8 @@ "git_describe_options_init": { "type": "function", "file": "git2/describe.h", - "line": 82, - "lineto": 82, + "line": 91, + "lineto": 91, "args": [ { "name": "opts", @@ -6518,14 +6746,14 @@ "comments": "

Initializes a git_describe_options with default values. Equivalent to creating an instance with GIT_DESCRIBE_OPTIONS_INIT.

\n", "group": "describe", "examples": { - "describe.c": ["ex/v1.8.4/describe.html#git_describe_options_init-1"] + "describe.c": ["ex/v1.9.1/describe.html#git_describe_options_init-1"] } }, "git_describe_format_options_init": { "type": "function", "file": "git2/describe.h", - "line": 129, - "lineto": 129, + "line": 141, + "lineto": 141, "args": [ { "name": "opts", @@ -6549,15 +6777,15 @@ "group": "describe", "examples": { "describe.c": [ - "ex/v1.8.4/describe.html#git_describe_format_options_init-2" + "ex/v1.9.1/describe.html#git_describe_format_options_init-2" ] } }, "git_describe_commit": { "type": "function", "file": "git2/describe.h", - "line": 147, - "lineto": 150, + "line": 159, + "lineto": 162, "args": [ { "name": "result", @@ -6582,14 +6810,14 @@ "comments": "

Perform the describe operation on the given committish object.

\n", "group": "describe", "examples": { - "describe.c": ["ex/v1.8.4/describe.html#git_describe_commit-3"] + "describe.c": ["ex/v1.9.1/describe.html#git_describe_commit-3"] } }, "git_describe_workdir": { "type": "function", "file": "git2/describe.h", - "line": 165, - "lineto": 168, + "line": 177, + "lineto": 180, "args": [ { "name": "out", @@ -6614,14 +6842,14 @@ "comments": "

Perform the describe operation on the current commit and the worktree. After performing describe on HEAD, a status is run and the description is considered to be dirty if there are.

\n", "group": "describe", "examples": { - "describe.c": ["ex/v1.8.4/describe.html#git_describe_workdir-4"] + "describe.c": ["ex/v1.9.1/describe.html#git_describe_workdir-4"] } }, "git_describe_format": { "type": "function", "file": "git2/describe.h", - "line": 179, - "lineto": 182, + "line": 191, + "lineto": 194, "args": [ { "name": "out", @@ -6646,14 +6874,14 @@ "comments": "", "group": "describe", "examples": { - "describe.c": ["ex/v1.8.4/describe.html#git_describe_format-5"] + "describe.c": ["ex/v1.9.1/describe.html#git_describe_format-5"] } }, "git_describe_result_free": { "type": "function", "file": "git2/describe.h", - "line": 189, - "lineto": 189, + "line": 201, + "lineto": 201, "args": [ { "name": "result", @@ -6671,8 +6899,8 @@ "git_diff_options_init": { "type": "function", "file": "git2/diff.h", - "line": 485, - "lineto": 487, + "line": 492, + "lineto": 494, "args": [ { "name": "opts", @@ -6698,8 +6926,8 @@ "git_diff_find_options_init": { "type": "function", "file": "git2/diff.h", - "line": 818, - "lineto": 820, + "line": 846, + "lineto": 848, "args": [ { "name": "opts", @@ -6725,8 +6953,8 @@ "git_diff_free": { "type": "function", "file": "git2/diff.h", - "line": 834, - "lineto": 834, + "line": 862, + "lineto": 862, "args": [ { "name": "diff", @@ -6741,18 +6969,18 @@ "comments": "", "group": "diff", "examples": { - "diff.c": ["ex/v1.8.4/diff.html#git_diff_free-3"], + "diff.c": ["ex/v1.9.1/diff.html#git_diff_free-3"], "log.c": [ - "ex/v1.8.4/log.html#git_diff_free-25", - "ex/v1.8.4/log.html#git_diff_free-26" + "ex/v1.9.1/log.html#git_diff_free-25", + "ex/v1.9.1/log.html#git_diff_free-26" ] } }, "git_diff_tree_to_tree": { "type": "function", "file": "git2/diff.h", - "line": 853, - "lineto": 858, + "line": 881, + "lineto": 886, "args": [ { "name": "diff", @@ -6787,18 +7015,18 @@ "comments": "

This is equivalent to git diff <old-tree> <new-tree>

\n\n

The first tree will be used for the "old_file" side of the delta and the second tree will be used for the "new_file" side of the delta. You can pass NULL to indicate an empty tree, although it is an error to pass NULL for both the old_tree and new_tree.

\n", "group": "diff", "examples": { - "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_tree-4"], + "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_tree-4"], "log.c": [ - "ex/v1.8.4/log.html#git_diff_tree_to_tree-27", - "ex/v1.8.4/log.html#git_diff_tree_to_tree-28" + "ex/v1.9.1/log.html#git_diff_tree_to_tree-27", + "ex/v1.9.1/log.html#git_diff_tree_to_tree-28" ] } }, "git_diff_tree_to_index": { "type": "function", "file": "git2/diff.h", - "line": 880, - "lineto": 885, + "line": 908, + "lineto": 913, "args": [ { "name": "diff", @@ -6832,13 +7060,13 @@ "description": "

Create a diff between a tree and repository index.

\n", "comments": "

This is equivalent to git diff --cached <treeish> or if you pass the HEAD tree, then like git diff --cached.

\n\n

The tree you pass will be used for the "old_file" side of the delta, and the index will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", "group": "diff", - "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_index-5"] } + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_index-5"] } }, "git_diff_index_to_workdir": { "type": "function", "file": "git2/diff.h", - "line": 908, - "lineto": 912, + "line": 936, + "lineto": 940, "args": [ { "name": "diff", @@ -6868,14 +7096,14 @@ "comments": "

This matches the git diff command. See the note below on git_diff_tree_to_workdir for a discussion of the difference between git diff and git diff HEAD and how to emulate a git diff <treeish> using libgit2.

\n\n

The index will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side of the delta.

\n\n

If you pass NULL for the index, then the existing index of the repo will be used. In this case, the index will be refreshed from disk (if it has changed) before the diff is generated.

\n", "group": "diff", "examples": { - "diff.c": ["ex/v1.8.4/diff.html#git_diff_index_to_workdir-6"] + "diff.c": ["ex/v1.9.1/diff.html#git_diff_index_to_workdir-6"] } }, "git_diff_tree_to_workdir": { "type": "function", "file": "git2/diff.h", - "line": 938, - "lineto": 942, + "line": 966, + "lineto": 970, "args": [ { "name": "diff", @@ -6905,14 +7133,14 @@ "comments": "

The tree you provide will be used for the "old_file" side of the delta, and the working directory will be used for the "new_file" side.

\n\n

This is not the same as git diff <treeish> or git diff-index <treeish>. Those commands use information from the index, whereas this function strictly returns the differences between the tree and the files in the working directory, regardless of the state of the index. Use git_diff_tree_to_workdir_with_index to emulate those commands.

\n\n

To see difference between this and git_diff_tree_to_workdir_with_index, consider the example of a staged file deletion where the file has then been put back into the working dir and further modified. The tree-to-workdir diff for that file is 'modified', but git diff would show status 'deleted' since there is a staged delete.

\n", "group": "diff", "examples": { - "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_workdir-7"] + "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_workdir-7"] } }, "git_diff_tree_to_workdir_with_index": { "type": "function", "file": "git2/diff.h", - "line": 958, - "lineto": 962, + "line": 986, + "lineto": 990, "args": [ { "name": "diff", @@ -6942,14 +7170,14 @@ "comments": "

This emulates git diff <tree> by diffing the tree to the index and the index to the working directory and blending the results into a single diff that includes staged deleted, etc.

\n", "group": "diff", "examples": { - "diff.c": ["ex/v1.8.4/diff.html#git_diff_tree_to_workdir_with_index-8"] + "diff.c": ["ex/v1.9.1/diff.html#git_diff_tree_to_workdir_with_index-8"] } }, "git_diff_index_to_index": { "type": "function", "file": "git2/diff.h", - "line": 977, - "lineto": 982, + "line": 1005, + "lineto": 1010, "args": [ { "name": "diff", @@ -6987,8 +7215,8 @@ "git_diff_merge": { "type": "function", "file": "git2/diff.h", - "line": 998, - "lineto": 1000, + "line": 1026, + "lineto": 1028, "args": [ { "name": "onto", @@ -7011,8 +7239,8 @@ "git_diff_find_similar": { "type": "function", "file": "git2/diff.h", - "line": 1014, - "lineto": 1016, + "line": 1042, + "lineto": 1044, "args": [ { "name": "diff", @@ -7031,13 +7259,13 @@ "description": "

Transform a diff marking file renames, copies, etc.

\n", "comments": "

This modifies a diff in place, replacing old entries that look like renames or copies with new entries reflecting those changes. This also will, if requested, break modified files into add/remove pairs if the amount of change is above a threshold.

\n", "group": "diff", - "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_find_similar-9"] } + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_find_similar-9"] } }, "git_diff_num_deltas": { "type": "function", "file": "git2/diff.h", - "line": 1034, - "lineto": 1034, + "line": 1062, + "lineto": 1062, "args": [ { "name": "diff", @@ -7054,13 +7282,13 @@ "description": "

Query how many diff records are there in a diff.

\n", "comments": "", "group": "diff", - "examples": { "log.c": ["ex/v1.8.4/log.html#git_diff_num_deltas-29"] } + "examples": { "log.c": ["ex/v1.9.1/log.html#git_diff_num_deltas-29"] } }, "git_diff_num_deltas_of_type": { "type": "function", "file": "git2/diff.h", - "line": 1047, - "lineto": 1048, + "line": 1075, + "lineto": 1076, "args": [ { "name": "diff", @@ -7086,8 +7314,8 @@ "git_diff_get_delta": { "type": "function", "file": "git2/diff.h", - "line": 1067, - "lineto": 1068, + "line": 1095, + "lineto": 1096, "args": [ { "name": "diff", @@ -7109,8 +7337,8 @@ "git_diff_is_sorted_icase": { "type": "function", "file": "git2/diff.h", - "line": 1076, - "lineto": 1076, + "line": 1104, + "lineto": 1104, "args": [ { "name": "diff", @@ -7131,8 +7359,8 @@ "git_diff_foreach": { "type": "function", "file": "git2/diff.h", - "line": 1104, - "lineto": 1110, + "line": 1132, + "lineto": 1138, "args": [ { "name": "diff", @@ -7178,8 +7406,8 @@ "git_diff_status_char": { "type": "function", "file": "git2/diff.h", - "line": 1123, - "lineto": 1123, + "line": 1151, + "lineto": 1151, "args": [ { "name": "status", @@ -7200,8 +7428,8 @@ "git_diff_print": { "type": "function", "file": "git2/diff.h", - "line": 1149, - "lineto": 1153, + "line": 1177, + "lineto": 1181, "args": [ { "name": "diff", @@ -7234,15 +7462,15 @@ "comments": "

Returning a non-zero value from the callbacks will terminate the iteration and return the non-zero value to the caller.

\n", "group": "diff", "examples": { - "diff.c": ["ex/v1.8.4/diff.html#git_diff_print-10"], - "log.c": ["ex/v1.8.4/log.html#git_diff_print-30"] + "diff.c": ["ex/v1.9.1/diff.html#git_diff_print-10"], + "log.c": ["ex/v1.9.1/log.html#git_diff_print-30"] } }, "git_diff_to_buf": { "type": "function", "file": "git2/diff.h", - "line": 1165, - "lineto": 1168, + "line": 1193, + "lineto": 1196, "args": [ { "name": "out", @@ -7270,8 +7498,8 @@ "git_diff_blobs": { "type": "function", "file": "git2/diff.h", - "line": 1204, - "lineto": 1214, + "line": 1232, + "lineto": 1242, "args": [ { "name": "old_blob", @@ -7337,8 +7565,8 @@ "git_diff_blob_to_buffer": { "type": "function", "file": "git2/diff.h", - "line": 1241, - "lineto": 1252, + "line": 1269, + "lineto": 1280, "args": [ { "name": "old_blob", @@ -7409,8 +7637,8 @@ "git_diff_buffers": { "type": "function", "file": "git2/diff.h", - "line": 1275, - "lineto": 1287, + "line": 1303, + "lineto": 1315, "args": [ { "name": "old_buffer", @@ -7486,8 +7714,8 @@ "git_diff_from_buffer": { "type": "function", "file": "git2/diff.h", - "line": 1327, - "lineto": 1334, + "line": 1355, + "lineto": 1362, "args": [ { "name": "out", @@ -7513,16 +7741,16 @@ "group": "diff", "examples": { "diff.c": [ - "ex/v1.8.4/diff.html#git_diff_from_buffer-11", - "ex/v1.8.4/diff.html#git_diff_from_buffer-12" + "ex/v1.9.1/diff.html#git_diff_from_buffer-11", + "ex/v1.9.1/diff.html#git_diff_from_buffer-12" ] } }, "git_diff_get_stats": { "type": "function", "file": "git2/diff.h", - "line": 1370, - "lineto": 1372, + "line": 1398, + "lineto": 1400, "args": [ { "name": "out", @@ -7544,13 +7772,13 @@ "description": "

Accumulate diff statistics for all patches.

\n", "comments": "", "group": "diff", - "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_get_stats-13"] } + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_get_stats-13"] } }, "git_diff_stats_files_changed": { "type": "function", "file": "git2/diff.h", - "line": 1380, - "lineto": 1381, + "line": 1408, + "lineto": 1409, "args": [ { "name": "stats", @@ -7571,8 +7799,8 @@ "git_diff_stats_insertions": { "type": "function", "file": "git2/diff.h", - "line": 1389, - "lineto": 1390, + "line": 1417, + "lineto": 1418, "args": [ { "name": "stats", @@ -7593,8 +7821,8 @@ "git_diff_stats_deletions": { "type": "function", "file": "git2/diff.h", - "line": 1398, - "lineto": 1399, + "line": 1426, + "lineto": 1427, "args": [ { "name": "stats", @@ -7615,8 +7843,8 @@ "git_diff_stats_to_buf": { "type": "function", "file": "git2/diff.h", - "line": 1410, - "lineto": 1414, + "line": 1438, + "lineto": 1442, "args": [ { "name": "out", @@ -7648,13 +7876,13 @@ "description": "

Print diff statistics to a git_buf.

\n", "comments": "", "group": "diff", - "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_stats_to_buf-14"] } + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_stats_to_buf-14"] } }, "git_diff_stats_free": { "type": "function", "file": "git2/diff.h", - "line": 1422, - "lineto": 1422, + "line": 1450, + "lineto": 1450, "args": [ { "name": "stats", @@ -7668,13 +7896,13 @@ "description": "

Deallocate a git_diff_stats.

\n", "comments": "", "group": "diff", - "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_diff_stats_free-15"] } + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_diff_stats_free-15"] } }, "git_diff_patchid_options_init": { "type": "function", "file": "git2/diff.h", - "line": 1448, - "lineto": 1450, + "line": 1479, + "lineto": 1481, "args": [ { "name": "opts", @@ -7700,8 +7928,8 @@ "git_diff_patchid": { "type": "function", "file": "git2/diff.h", - "line": 1471, - "lineto": 1471, + "line": 1502, + "lineto": 1502, "args": [ { "name": "out", @@ -7729,66 +7957,11 @@ "comments": "

Calculate a stable patch ID for the given patch by summing the hash of the file diffs, ignoring whitespace and line numbers. This can be used to derive whether two diffs are the same with a high probability.

\n\n

Currently, this function only calculates stable patch IDs, as defined in git-patch-id(1), and should in fact generate the same IDs as the upstream git project does.

\n", "group": "diff" }, - "git_email_create_from_diff": { - "type": "function", - "file": "git2/email.h", - "line": 100, - "lineto": 109, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer to store the e-mail patch in" - }, - { - "name": "diff", - "type": "git_diff *", - "comment": "the changes to include in the email" - }, - { "name": "patch_idx", "type": "size_t", "comment": "the patch index" }, - { - "name": "patch_count", - "type": "size_t", - "comment": "the total number of patches that will be included" - }, - { - "name": "commit_id", - "type": "const git_oid *", - "comment": "the commit id for this change" - }, - { - "name": "summary", - "type": "const char *", - "comment": "the commit message for this change" - }, - { - "name": "body", - "type": "const char *", - "comment": "optional text to include above the diffstat" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "the person who authored this commit" - }, - { - "name": "opts", - "type": "const git_email_create_options *", - "comment": "email creation options" - } - ], - "argline": "git_buf *out, git_diff *diff, size_t patch_idx, size_t patch_count, const git_oid *commit_id, const char *summary, const char *body, const git_signature *author, const git_email_create_options *opts", - "sig": "git_buf *::git_diff *::size_t::size_t::const git_oid *::const char *::const char *::const git_signature *::const git_email_create_options *", - "return": { "type": "int", "comment": null }, - "description": "

Create a diff for a commit in mbox format for sending via email.

\n", - "comments": "", - "group": "email" - }, "git_email_create_from_commit": { "type": "function", "file": "git2/email.h", - "line": 119, - "lineto": 122, + "line": 99, + "lineto": 102, "args": [ { "name": "out", @@ -7808,7 +7981,7 @@ ], "argline": "git_buf *out, git_commit *commit, const git_email_create_options *opts", "sig": "git_buf *::git_commit *::const git_email_create_options *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Create a diff for a commit in mbox format for sending via email.\n The commit must not be a merge commit.

\n", "comments": "", "group": "email" @@ -7816,43 +7989,43 @@ "git_error_last": { "type": "function", "file": "git2/errors.h", - "line": 139, - "lineto": 139, + "line": 149, + "lineto": 149, "args": [], "argline": "", "sig": "", "return": { "type": "const git_error *", - "comment": " A git_error object." + "comment": " A pointer to a `git_error` object that describes the error." }, "description": "

Return the last git_error object that was generated for the\n current thread.

\n", "comments": "

This function will never return NULL.

\n\n

Callers should not rely on this to determine whether an error has occurred. For error checking, callers should examine the return codes of libgit2 functions.

\n\n

This call can only reliably report error messages when an error has occurred. (It may contain stale information if it is called after a different function that succeeds.)

\n\n

The memory for this object is managed by libgit2. It should not be freed.

\n", "group": "error", "examples": { "checkout.c": [ - "ex/v1.8.4/checkout.html#git_error_last-11", - "ex/v1.8.4/checkout.html#git_error_last-12", - "ex/v1.8.4/checkout.html#git_error_last-13", - "ex/v1.8.4/checkout.html#git_error_last-14" + "ex/v1.9.1/checkout.html#git_error_last-11", + "ex/v1.9.1/checkout.html#git_error_last-12", + "ex/v1.9.1/checkout.html#git_error_last-13", + "ex/v1.9.1/checkout.html#git_error_last-14" ], - "commit.c": ["ex/v1.8.4/commit.html#git_error_last-2"], + "commit.c": ["ex/v1.9.1/commit.html#git_error_last-2"], "config.c": [ - "ex/v1.8.4/config.html#git_error_last-6", - "ex/v1.8.4/config.html#git_error_last-7", - "ex/v1.8.4/config.html#git_error_last-8" + "ex/v1.9.1/config.html#git_error_last-6", + "ex/v1.9.1/config.html#git_error_last-7", + "ex/v1.9.1/config.html#git_error_last-8" ], - "general.c": ["ex/v1.8.4/general.html#git_error_last-33"], + "general.c": ["ex/v1.9.1/general.html#git_error_last-33"], "merge.c": [ - "ex/v1.8.4/merge.html#git_error_last-8", - "ex/v1.8.4/merge.html#git_error_last-9" + "ex/v1.9.1/merge.html#git_error_last-8", + "ex/v1.9.1/merge.html#git_error_last-9" ] } }, "git_filter_list_load": { "type": "function", "file": "git2/filter.h", - "line": 129, - "lineto": 135, + "line": 138, + "lineto": 144, "args": [ { "name": "filters", @@ -7898,8 +8071,8 @@ "git_filter_list_load_ext": { "type": "function", "file": "git2/filter.h", - "line": 152, - "lineto": 158, + "line": 161, + "lineto": 167, "args": [ { "name": "filters", @@ -7945,8 +8118,8 @@ "git_filter_list_contains": { "type": "function", "file": "git2/filter.h", - "line": 172, - "lineto": 174, + "line": 181, + "lineto": 183, "args": [ { "name": "filters", @@ -7972,8 +8145,8 @@ "git_filter_list_apply_to_buffer": { "type": "function", "file": "git2/filter.h", - "line": 185, - "lineto": 189, + "line": 194, + "lineto": 198, "args": [ { "name": "out", @@ -8009,8 +8182,8 @@ "git_filter_list_apply_to_file": { "type": "function", "file": "git2/filter.h", - "line": 201, - "lineto": 205, + "line": 210, + "lineto": 214, "args": [ { "name": "out", @@ -8043,8 +8216,8 @@ "git_filter_list_apply_to_blob": { "type": "function", "file": "git2/filter.h", - "line": 215, - "lineto": 218, + "line": 224, + "lineto": 227, "args": [ { "name": "out", @@ -8072,8 +8245,8 @@ "git_filter_list_stream_buffer": { "type": "function", "file": "git2/filter.h", - "line": 229, - "lineto": 233, + "line": 238, + "lineto": 242, "args": [ { "name": "filters", @@ -8106,8 +8279,8 @@ "git_filter_list_stream_file": { "type": "function", "file": "git2/filter.h", - "line": 245, - "lineto": 249, + "line": 254, + "lineto": 258, "args": [ { "name": "filters", @@ -8140,8 +8313,8 @@ "git_filter_list_stream_blob": { "type": "function", "file": "git2/filter.h", - "line": 259, - "lineto": 262, + "line": 268, + "lineto": 271, "args": [ { "name": "filters", @@ -8169,8 +8342,8 @@ "git_filter_list_free": { "type": "function", "file": "git2/filter.h", - "line": 269, - "lineto": 269, + "line": 278, + "lineto": 278, "args": [ { "name": "filters", @@ -8188,8 +8361,8 @@ "git_libgit2_init": { "type": "function", "file": "git2/global.h", - "line": 26, - "lineto": 26, + "line": 32, + "lineto": 32, "args": [], "argline": "", "sig": "", @@ -8201,14 +8374,14 @@ "comments": "

This function must be called before any other libgit2 function in order to set up global state and threading.

\n\n

This function may be called multiple times - it will return the number of times the initialization has been called (including this one) that have not subsequently been shutdown.

\n", "group": "libgit2", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_libgit2_init-34"] + "general.c": ["ex/v1.9.1/general.html#git_libgit2_init-34"] } }, "git_libgit2_shutdown": { "type": "function", "file": "git2/global.h", - "line": 39, - "lineto": 39, + "line": 45, + "lineto": 45, "args": [], "argline": "", "sig": "", @@ -8331,8 +8504,8 @@ "git_ignore_add_rule": { "type": "function", "file": "git2/ignore.h", - "line": 37, - "lineto": 39, + "line": 46, + "lineto": 48, "args": [ { "name": "repo", @@ -8355,8 +8528,8 @@ "git_ignore_clear_internal_rules": { "type": "function", "file": "git2/ignore.h", - "line": 52, - "lineto": 53, + "line": 61, + "lineto": 62, "args": [ { "name": "repo", @@ -8374,8 +8547,8 @@ "git_ignore_path_is_ignored": { "type": "function", "file": "git2/ignore.h", - "line": 71, - "lineto": 74, + "line": 80, + "lineto": 83, "args": [ { "name": "ignored", @@ -8403,11 +8576,54 @@ "comments": "

This function checks the ignore rules to see if they would apply to the given file. This indicates if the file would be ignored regardless of whether the file is already in the index or committed to the repository.

\n\n

One way to think of this is if you were to do "git check-ignore --no-index" on the given file, would it be shown or not?

\n", "group": "ignore" }, + "git_index_open": { + "type": "function", + "file": "git2/index.h", + "line": 278, + "lineto": 278, + "args": [ + { + "name": "index_out", + "type": "git_index **", + "comment": "the pointer for the new index" + }, + { + "name": "index_path", + "type": "const char *", + "comment": "the path to the index file in disk" + } + ], + "argline": "git_index **index_out, const char *index_path", + "sig": "git_index **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new bare Git index object as a memory representation\n of the Git index file in 'index_path', without a repository\n to back it.

\n", + "comments": "

Since there is no ODB or working directory behind this index, any Index methods which rely on these (e.g. index_add_bypath) will fail with the GIT_ERROR error code.

\n\n

If you need to access the index of an actual repository, use the git_repository_index wrapper.

\n\n

The index must be freed once it's no longer in use.

\n", + "group": "index" + }, + "git_index_new": { + "type": "function", + "file": "git2/index.h", + "line": 291, + "lineto": 291, + "args": [ + { + "name": "index_out", + "type": "git_index **", + "comment": "the pointer for the new index" + } + ], + "argline": "git_index **index_out", + "sig": "git_index **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create an in-memory index object.

\n", + "comments": "

This index object cannot be read/written to the filesystem, but may be used to perform in-memory index operations.

\n\n

The index must be freed once it's no longer in use.

\n", + "group": "index" + }, "git_index_free": { "type": "function", "file": "git2/index.h", - "line": 216, - "lineto": 216, + "line": 300, + "lineto": 300, "args": [ { "name": "index", @@ -8422,18 +8638,18 @@ "comments": "", "group": "index", "examples": { - "add.c": ["ex/v1.8.4/add.html#git_index_free-1"], - "commit.c": ["ex/v1.8.4/commit.html#git_index_free-3"], - "general.c": ["ex/v1.8.4/general.html#git_index_free-35"], - "init.c": ["ex/v1.8.4/init.html#git_index_free-2"], - "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_free-1"] + "add.c": ["ex/v1.9.1/add.html#git_index_free-1"], + "commit.c": ["ex/v1.9.1/commit.html#git_index_free-3"], + "general.c": ["ex/v1.9.1/general.html#git_index_free-35"], + "init.c": ["ex/v1.9.1/init.html#git_index_free-2"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_free-1"] } }, "git_index_owner": { "type": "function", "file": "git2/index.h", - "line": 224, - "lineto": 224, + "line": 308, + "lineto": 308, "args": [ { "name": "index", "type": "const git_index *", "comment": "The index" } ], @@ -8450,8 +8666,8 @@ "git_index_caps": { "type": "function", "file": "git2/index.h", - "line": 232, - "lineto": 232, + "line": 316, + "lineto": 316, "args": [ { "name": "index", @@ -8472,8 +8688,8 @@ "git_index_set_caps": { "type": "function", "file": "git2/index.h", - "line": 245, - "lineto": 245, + "line": 329, + "lineto": 329, "args": [ { "name": "index", @@ -8496,8 +8712,8 @@ "git_index_version": { "type": "function", "file": "git2/index.h", - "line": 257, - "lineto": 257, + "line": 341, + "lineto": 341, "args": [ { "name": "index", @@ -8515,8 +8731,8 @@ "git_index_set_version": { "type": "function", "file": "git2/index.h", - "line": 270, - "lineto": 270, + "line": 354, + "lineto": 354, "args": [ { "name": "index", @@ -8539,8 +8755,8 @@ "git_index_read": { "type": "function", "file": "git2/index.h", - "line": 289, - "lineto": 289, + "line": 373, + "lineto": 373, "args": [ { "name": "index", @@ -8563,8 +8779,8 @@ "git_index_write": { "type": "function", "file": "git2/index.h", - "line": 298, - "lineto": 298, + "line": 382, + "lineto": 382, "args": [ { "name": "index", @@ -8579,15 +8795,15 @@ "comments": "", "group": "index", "examples": { - "add.c": ["ex/v1.8.4/add.html#git_index_write-2"], - "commit.c": ["ex/v1.8.4/commit.html#git_index_write-4"] + "add.c": ["ex/v1.9.1/add.html#git_index_write-2"], + "commit.c": ["ex/v1.9.1/commit.html#git_index_write-4"] } }, "git_index_path": { "type": "function", "file": "git2/index.h", - "line": 306, - "lineto": 306, + "line": 390, + "lineto": 390, "args": [ { "name": "index", @@ -8608,8 +8824,8 @@ "git_index_checksum": { "type": "function", "file": "git2/index.h", - "line": 320, - "lineto": 320, + "line": 404, + "lineto": 404, "args": [ { "name": "index", @@ -8630,8 +8846,8 @@ "git_index_read_tree": { "type": "function", "file": "git2/index.h", - "line": 332, - "lineto": 332, + "line": 416, + "lineto": 416, "args": [ { "name": "index", @@ -8654,8 +8870,8 @@ "git_index_write_tree": { "type": "function", "file": "git2/index.h", - "line": 353, - "lineto": 353, + "line": 437, + "lineto": 437, "args": [ { "name": "out", @@ -8674,16 +8890,16 @@ "comments": "

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.

\n\n

The index instance cannot be bare, and needs to be associated to an existing repository.

\n\n

The index must not contain any file in conflict.

\n", "group": "index", "examples": { - "commit.c": ["ex/v1.8.4/commit.html#git_index_write_tree-5"], - "init.c": ["ex/v1.8.4/init.html#git_index_write_tree-3"], - "merge.c": ["ex/v1.8.4/merge.html#git_index_write_tree-10"] + "commit.c": ["ex/v1.9.1/commit.html#git_index_write_tree-5"], + "init.c": ["ex/v1.9.1/init.html#git_index_write_tree-3"], + "merge.c": ["ex/v1.9.1/merge.html#git_index_write_tree-10"] } }, "git_index_write_tree_to": { "type": "function", "file": "git2/index.h", - "line": 370, - "lineto": 370, + "line": 454, + "lineto": 454, "args": [ { "name": "out", @@ -8710,8 +8926,8 @@ "git_index_entrycount": { "type": "function", "file": "git2/index.h", - "line": 389, - "lineto": 389, + "line": 473, + "lineto": 473, "args": [ { "name": "index", @@ -8729,15 +8945,15 @@ "comments": "", "group": "index", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_index_entrycount-36"], - "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_entrycount-2"] + "general.c": ["ex/v1.9.1/general.html#git_index_entrycount-36"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_entrycount-2"] } }, "git_index_clear": { "type": "function", "file": "git2/index.h", - "line": 400, - "lineto": 400, + "line": 484, + "lineto": 484, "args": [ { "name": "index", @@ -8758,8 +8974,8 @@ "git_index_get_byindex": { "type": "function", "file": "git2/index.h", - "line": 413, - "lineto": 414, + "line": 497, + "lineto": 498, "args": [ { "name": "index", @@ -8782,15 +8998,15 @@ "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", "group": "index", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_index_get_byindex-37"], - "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_get_byindex-3"] + "general.c": ["ex/v1.9.1/general.html#git_index_get_byindex-37"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_get_byindex-3"] } }, "git_index_get_bypath": { "type": "function", "file": "git2/index.h", - "line": 428, - "lineto": 429, + "line": 512, + "lineto": 513, "args": [ { "name": "index", @@ -8810,14 +9026,14 @@ "comments": "

The entry is not modifiable and should not be freed. Because the git_index_entry struct is a publicly defined struct, you should be able to make your own permanent copy of the data if necessary.

\n", "group": "index", "examples": { - "ls-files.c": ["ex/v1.8.4/ls-files.html#git_index_get_bypath-4"] + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_index_get_bypath-4"] } }, "git_index_remove": { "type": "function", "file": "git2/index.h", - "line": 439, - "lineto": 439, + "line": 523, + "lineto": 523, "args": [ { "name": "index", @@ -8837,8 +9053,8 @@ "git_index_remove_directory": { "type": "function", "file": "git2/index.h", - "line": 449, - "lineto": 450, + "line": 533, + "lineto": 534, "args": [ { "name": "index", @@ -8862,8 +9078,8 @@ "git_index_add": { "type": "function", "file": "git2/index.h", - "line": 466, - "lineto": 466, + "line": 550, + "lineto": 550, "args": [ { "name": "index", @@ -8886,8 +9102,8 @@ "git_index_entry_stage": { "type": "function", "file": "git2/index.h", - "line": 478, - "lineto": 478, + "line": 562, + "lineto": 562, "args": [ { "name": "entry", @@ -8905,8 +9121,8 @@ "git_index_entry_is_conflict": { "type": "function", "file": "git2/index.h", - "line": 487, - "lineto": 487, + "line": 571, + "lineto": 571, "args": [ { "name": "entry", @@ -8927,8 +9143,8 @@ "git_index_iterator_new": { "type": "function", "file": "git2/index.h", - "line": 508, - "lineto": 510, + "line": 592, + "lineto": 594, "args": [ { "name": "iterator_out", @@ -8951,8 +9167,8 @@ "git_index_iterator_next": { "type": "function", "file": "git2/index.h", - "line": 519, - "lineto": 521, + "line": 603, + "lineto": 605, "args": [ { "name": "out", @@ -8978,8 +9194,8 @@ "git_index_iterator_free": { "type": "function", "file": "git2/index.h", - "line": 528, - "lineto": 528, + "line": 612, + "lineto": 612, "args": [ { "name": "iterator", @@ -8997,8 +9213,8 @@ "git_index_add_bypath": { "type": "function", "file": "git2/index.h", - "line": 559, - "lineto": 559, + "line": 643, + "lineto": 643, "args": [ { "name": "index", @@ -9017,8 +9233,8 @@ "git_index_add_from_buffer": { "type": "function", "file": "git2/index.h", - "line": 587, - "lineto": 590, + "line": 671, + "lineto": 674, "args": [ { "name": "index", @@ -9047,8 +9263,8 @@ "git_index_remove_bypath": { "type": "function", "file": "git2/index.h", - "line": 606, - "lineto": 606, + "line": 690, + "lineto": 690, "args": [ { "name": "index", @@ -9071,8 +9287,8 @@ "git_index_add_all": { "type": "function", "file": "git2/index.h", - "line": 654, - "lineto": 659, + "line": 738, + "lineto": 743, "args": [ { "name": "index", @@ -9109,13 +9325,13 @@ "description": "

Add or update index entries matching files in the working directory.

\n", "comments": "

This method will fail in bare index instances.

\n\n

The pathspec is a list of file names or shell glob patterns that will be matched against files in the repository's working directory. Each file that matches will be added to the index (either updating an existing entry or adding a new entry). You can disable glob expansion and force exact matching with the GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH flag.

\n\n

Files that are ignored will be skipped (unlike git_index_add_bypath). If a file is already tracked in the index, then it will be updated even if it is ignored. Pass the GIT_INDEX_ADD_FORCE flag to skip the checking of ignore rules.

\n\n

To emulate git add -A and generate an error if the pathspec contains the exact path of an ignored file (when not using FORCE), add the GIT_INDEX_ADD_CHECK_PATHSPEC flag. This checks that each entry in the pathspec that is an exact match to a filename on disk is either not ignored or already in the index. If this check fails, the function will return GIT_EINVALIDSPEC.

\n\n

To emulate git add -A with the "dry-run" option, just use a callback function that always returns a positive value. See below for details.

\n\n

If any files are currently the result of a merge conflict, those files will no longer be marked as conflicting. The data about the conflicts will be moved to the "resolve undo" (REUC) section.

\n\n

If you provide a callback function, it will be invoked on each matching item in the working directory immediately before it is added to / updated in the index. Returning zero will add the item to the index, greater than zero will skip the item, and less than zero will abort the scan and return that value to the caller.

\n", "group": "index", - "examples": { "add.c": ["ex/v1.8.4/add.html#git_index_add_all-3"] } + "examples": { "add.c": ["ex/v1.9.1/add.html#git_index_add_all-3"] } }, "git_index_remove_all": { "type": "function", "file": "git2/index.h", - "line": 676, - "lineto": 680, + "line": 760, + "lineto": 764, "args": [ { "name": "index", @@ -9151,8 +9367,8 @@ "git_index_update_all": { "type": "function", "file": "git2/index.h", - "line": 705, - "lineto": 709, + "line": 789, + "lineto": 793, "args": [ { "name": "index", @@ -9184,13 +9400,13 @@ "description": "

Update all index entries to match the working directory

\n", "comments": "

This method will fail in bare index instances.

\n\n

This scans the existing index entries and synchronizes them with the working directory, deleting them if the corresponding working directory file no longer exists otherwise updating the information (including adding the latest version of file to the ODB if needed).

\n\n

If you provide a callback function, it will be invoked on each matching item in the index immediately before it is updated (either refreshed or removed depending on working directory state). Return 0 to proceed with updating the item, > 0 to skip the item, and < 0 to abort the scan.

\n", "group": "index", - "examples": { "add.c": ["ex/v1.8.4/add.html#git_index_update_all-4"] } + "examples": { "add.c": ["ex/v1.9.1/add.html#git_index_update_all-4"] } }, "git_index_find": { "type": "function", "file": "git2/index.h", - "line": 720, - "lineto": 720, + "line": 804, + "lineto": 804, "args": [ { "name": "at_pos", @@ -9214,8 +9430,8 @@ "git_index_find_prefix": { "type": "function", "file": "git2/index.h", - "line": 731, - "lineto": 731, + "line": 815, + "lineto": 815, "args": [ { "name": "at_pos", @@ -9243,8 +9459,8 @@ "git_index_conflict_add": { "type": "function", "file": "git2/index.h", - "line": 756, - "lineto": 760, + "line": 840, + "lineto": 844, "args": [ { "name": "index", @@ -9277,8 +9493,8 @@ "git_index_conflict_get": { "type": "function", "file": "git2/index.h", - "line": 776, - "lineto": 781, + "line": 860, + "lineto": 865, "args": [ { "name": "ancestor_out", @@ -9312,8 +9528,8 @@ "git_index_conflict_remove": { "type": "function", "file": "git2/index.h", - "line": 790, - "lineto": 790, + "line": 874, + "lineto": 874, "args": [ { "name": "index", @@ -9336,8 +9552,8 @@ "git_index_conflict_cleanup": { "type": "function", "file": "git2/index.h", - "line": 798, - "lineto": 798, + "line": 882, + "lineto": 882, "args": [ { "name": "index", @@ -9355,8 +9571,8 @@ "git_index_has_conflicts": { "type": "function", "file": "git2/index.h", - "line": 806, - "lineto": 806, + "line": 890, + "lineto": 890, "args": [ { "name": "index", @@ -9374,14 +9590,14 @@ "comments": "", "group": "index", "examples": { - "merge.c": ["ex/v1.8.4/merge.html#git_index_has_conflicts-11"] + "merge.c": ["ex/v1.9.1/merge.html#git_index_has_conflicts-11"] } }, "git_index_conflict_iterator_new": { "type": "function", "file": "git2/index.h", - "line": 817, - "lineto": 819, + "line": 901, + "lineto": 903, "args": [ { "name": "iterator_out", @@ -9401,14 +9617,14 @@ "comments": "

The index must not be modified while iterating; the results are undefined.

\n", "group": "index", "examples": { - "merge.c": ["ex/v1.8.4/merge.html#git_index_conflict_iterator_new-12"] + "merge.c": ["ex/v1.9.1/merge.html#git_index_conflict_iterator_new-12"] } }, "git_index_conflict_next": { "type": "function", "file": "git2/index.h", - "line": 832, - "lineto": 836, + "line": 916, + "lineto": 920, "args": [ { "name": "ancestor_out", @@ -9441,14 +9657,14 @@ "comments": "", "group": "index", "examples": { - "merge.c": ["ex/v1.8.4/merge.html#git_index_conflict_next-13"] + "merge.c": ["ex/v1.9.1/merge.html#git_index_conflict_next-13"] } }, "git_index_conflict_iterator_free": { "type": "function", "file": "git2/index.h", - "line": 843, - "lineto": 844, + "line": 927, + "lineto": 928, "args": [ { "name": "iterator", @@ -9463,14 +9679,14 @@ "comments": "", "group": "index", "examples": { - "merge.c": ["ex/v1.8.4/merge.html#git_index_conflict_iterator_free-14"] + "merge.c": ["ex/v1.9.1/merge.html#git_index_conflict_iterator_free-14"] } }, "git_indexer_options_init": { "type": "function", "file": "git2/indexer.h", - "line": 99, - "lineto": 101, + "line": 116, + "lineto": 118, "args": [ { "name": "opts", @@ -9496,8 +9712,8 @@ "git_indexer_new": { "type": "function", "file": "git2/indexer.h", - "line": 131, - "lineto": 136, + "line": 147, + "lineto": 152, "args": [ { "name": "out", @@ -9535,8 +9751,8 @@ "git_indexer_append": { "type": "function", "file": "git2/indexer.h", - "line": 148, - "lineto": 148, + "line": 164, + "lineto": 164, "args": [ { "name": "idx", "type": "git_indexer *", "comment": "the indexer" }, { @@ -9565,8 +9781,8 @@ "git_indexer_commit": { "type": "function", "file": "git2/indexer.h", - "line": 159, - "lineto": 159, + "line": 175, + "lineto": 175, "args": [ { "name": "idx", "type": "git_indexer *", "comment": "the indexer" }, { @@ -9585,8 +9801,8 @@ "git_indexer_hash": { "type": "function", "file": "git2/indexer.h", - "line": 172, - "lineto": 172, + "line": 188, + "lineto": 188, "args": [ { "name": "idx", @@ -9607,8 +9823,8 @@ "git_indexer_name": { "type": "function", "file": "git2/indexer.h", - "line": 184, - "lineto": 184, + "line": 200, + "lineto": 200, "args": [ { "name": "idx", @@ -9629,8 +9845,8 @@ "git_indexer_free": { "type": "function", "file": "git2/indexer.h", - "line": 191, - "lineto": 191, + "line": 207, + "lineto": 207, "args": [ { "name": "idx", @@ -9648,8 +9864,8 @@ "git_mailmap_new": { "type": "function", "file": "git2/mailmap.h", - "line": 32, - "lineto": 32, + "line": 37, + "lineto": 37, "args": [ { "name": "out", @@ -9667,8 +9883,8 @@ "git_mailmap_free": { "type": "function", "file": "git2/mailmap.h", - "line": 39, - "lineto": 39, + "line": 44, + "lineto": 44, "args": [ { "name": "mm", @@ -9686,8 +9902,8 @@ "git_mailmap_add_entry": { "type": "function", "file": "git2/mailmap.h", - "line": 52, - "lineto": 54, + "line": 57, + "lineto": 59, "args": [ { "name": "mm", @@ -9725,8 +9941,8 @@ "git_mailmap_from_buffer": { "type": "function", "file": "git2/mailmap.h", - "line": 64, - "lineto": 65, + "line": 69, + "lineto": 70, "args": [ { "name": "out", @@ -9754,8 +9970,8 @@ "git_mailmap_from_repository": { "type": "function", "file": "git2/mailmap.h", - "line": 81, - "lineto": 82, + "line": 86, + "lineto": 87, "args": [ { "name": "out", @@ -9778,8 +9994,8 @@ "git_mailmap_resolve": { "type": "function", "file": "git2/mailmap.h", - "line": 96, - "lineto": 98, + "line": 101, + "lineto": 103, "args": [ { "name": "real_name", @@ -9817,8 +10033,8 @@ "git_mailmap_resolve_signature": { "type": "function", "file": "git2/mailmap.h", - "line": 110, - "lineto": 111, + "line": 115, + "lineto": 116, "args": [ { "name": "out", @@ -9846,8 +10062,8 @@ "git_merge_file_input_init": { "type": "function", "file": "git2/merge.h", - "line": 60, - "lineto": 62, + "line": 66, + "lineto": 68, "args": [ { "name": "opts", @@ -9873,8 +10089,8 @@ "git_merge_file_options_init": { "type": "function", "file": "git2/merge.h", - "line": 233, - "lineto": 233, + "line": 243, + "lineto": 243, "args": [ { "name": "opts", @@ -9900,8 +10116,8 @@ "git_merge_options_init": { "type": "function", "file": "git2/merge.h", - "line": 329, - "lineto": 329, + "line": 342, + "lineto": 342, "args": [ { "name": "opts", @@ -9927,8 +10143,8 @@ "git_merge_analysis": { "type": "function", "file": "git2/merge.h", - "line": 399, - "lineto": 404, + "line": 412, + "lineto": 417, "args": [ { "name": "analysis_out", @@ -9962,13 +10178,13 @@ "description": "

Analyzes the given branch(es) and determines the opportunities for\n merging them into the HEAD of the repository.

\n", "comments": "", "group": "merge", - "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_merge_analysis-15"] } + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_merge_analysis-15"] } }, "git_merge_analysis_for_ref": { "type": "function", "file": "git2/merge.h", - "line": 418, - "lineto": 424, + "line": 431, + "lineto": 437, "args": [ { "name": "analysis_out", @@ -10011,8 +10227,8 @@ "git_merge_base": { "type": "function", "file": "git2/merge.h", - "line": 435, - "lineto": 439, + "line": 448, + "lineto": 452, "args": [ { "name": "out", @@ -10045,15 +10261,15 @@ "comments": "", "group": "merge", "examples": { - "log.c": ["ex/v1.8.4/log.html#git_merge_base-31"], - "rev-parse.c": ["ex/v1.8.4/rev-parse.html#git_merge_base-1"] + "log.c": ["ex/v1.9.1/log.html#git_merge_base-31"], + "rev-parse.c": ["ex/v1.9.1/rev-parse.html#git_merge_base-1"] } }, "git_merge_bases": { "type": "function", "file": "git2/merge.h", - "line": 450, - "lineto": 454, + "line": 463, + "lineto": 467, "args": [ { "name": "out", @@ -10089,8 +10305,8 @@ "git_merge_base_many": { "type": "function", "file": "git2/merge.h", - "line": 465, - "lineto": 469, + "line": 478, + "lineto": 482, "args": [ { "name": "out", @@ -10126,8 +10342,8 @@ "git_merge_bases_many": { "type": "function", "file": "git2/merge.h", - "line": 480, - "lineto": 484, + "line": 524, + "lineto": 528, "args": [ { "name": "out", @@ -10157,14 +10373,14 @@ "comment": " Zero on success; GIT_ENOTFOUND or -1 on failure." }, "description": "

Find all merge bases given a list of commits

\n", - "comments": "", + "comments": "

This behaves similar to git merge-base.

\n\n

Given three commits a, b, and c, merge_base_many will compute a hypothetical commit m, which is a merge between b and c.

\n\n

For example, with the following topology: text o---o---o---o---C / / o---o---o---B / / ---2---1---o---o---o---A

\n\n

the result of merge_base_many given a, b, and c is 1. This is because the equivalent topology with the imaginary merge commit m between b and c is: text o---o---o---o---o / \\ / o---o---o---o---M / / ---2---1---o---o---o---A

\n\n

and the result of merge_base_many given a and m is 1.

\n\n

If you're looking to recieve the common ancestor between all the given commits, use merge_base_octopus.

\n", "group": "merge" }, "git_merge_base_octopus": { "type": "function", "file": "git2/merge.h", - "line": 495, - "lineto": 499, + "line": 539, + "lineto": 543, "args": [ { "name": "out", @@ -10200,8 +10416,8 @@ "git_merge_file": { "type": "function", "file": "git2/merge.h", - "line": 517, - "lineto": 522, + "line": 561, + "lineto": 566, "args": [ { "name": "out", @@ -10239,8 +10455,8 @@ "git_merge_file_from_index": { "type": "function", "file": "git2/merge.h", - "line": 538, - "lineto": 544, + "line": 582, + "lineto": 588, "args": [ { "name": "out", @@ -10283,8 +10499,8 @@ "git_merge_file_result_free": { "type": "function", "file": "git2/merge.h", - "line": 551, - "lineto": 551, + "line": 595, + "lineto": 595, "args": [ { "name": "result", @@ -10302,8 +10518,8 @@ "git_merge_trees": { "type": "function", "file": "git2/merge.h", - "line": 569, - "lineto": 575, + "line": 613, + "lineto": 619, "args": [ { "name": "out", @@ -10346,8 +10562,8 @@ "git_merge_commits": { "type": "function", "file": "git2/merge.h", - "line": 592, - "lineto": 597, + "line": 636, + "lineto": 641, "args": [ { "name": "out", @@ -10385,8 +10601,8 @@ "git_merge": { "type": "function", "file": "git2/merge.h", - "line": 617, - "lineto": 622, + "line": 661, + "lineto": 666, "args": [ { "name": "repo", @@ -10420,7 +10636,7 @@ "description": "

Merges the given commit(s) into HEAD, writing the results into the working\n directory. Any changes are staged for commit and any conflicts are written\n to the index. Callers should inspect the repository's index after this\n completes, resolve any conflicts and prepare a commit.

\n", "comments": "

For compatibility with git, the repository is put into a merging state. Once the commit is done (or if the user wishes to abort), you should clear this state by calling git_repository_state_cleanup().

\n", "group": "merge", - "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_merge-16"] } + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_merge-16"] } }, "git_message_prettify": { "type": "function", @@ -10502,64 +10718,11 @@ "comments": "", "group": "message" }, - "git_note_iterator_new": { - "type": "function", - "file": "git2/notes.h", - "line": 49, - "lineto": 52, - "args": [ - { - "name": "out", - "type": "git_note_iterator **", - "comment": "pointer to the iterator" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" - } - ], - "argline": "git_note_iterator **out, git_repository *repo, const char *notes_ref", - "sig": "git_note_iterator **::git_repository *::const char *", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Creates a new iterator for notes

\n", - "comments": "

The iterator must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_commit_iterator_new": { - "type": "function", - "file": "git2/notes.h", - "line": 64, - "lineto": 66, - "args": [ - { - "name": "out", - "type": "git_note_iterator **", - "comment": "pointer to the iterator" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - } - ], - "argline": "git_note_iterator **out, git_commit *notes_commit", - "sig": "git_note_iterator **::git_commit *", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Creates a new iterator for notes from a commit

\n", - "comments": "

The iterator must be freed manually by the user.

\n", - "group": "note" - }, "git_note_iterator_free": { "type": "function", "file": "git2/notes.h", - "line": 73, - "lineto": 73, + "line": 75, + "lineto": 75, "args": [ { "name": "it", @@ -10577,8 +10740,8 @@ "git_note_next": { "type": "function", "file": "git2/notes.h", - "line": 86, - "lineto": 89, + "line": 88, + "lineto": 91, "args": [ { "name": "note_id", @@ -10606,413 +10769,11 @@ "comments": "", "group": "note" }, - "git_note_read": { - "type": "function", - "file": "git2/notes.h", - "line": 105, - "lineto": 109, - "args": [ - { - "name": "out", - "type": "git_note **", - "comment": "pointer to the read note; NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional); defaults to\n \"refs/notes/commits\"" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to read the note from" - } - ], - "argline": "git_note **out, git_repository *repo, const char *notes_ref, const git_oid *oid", - "sig": "git_note **::git_repository *::const char *::const git_oid *", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Read the note for an object

\n", - "comments": "

The note must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_commit_read": { - "type": "function", - "file": "git2/notes.h", - "line": 124, - "lineto": 128, - "args": [ - { - "name": "out", - "type": "git_note **", - "comment": "pointer to the read note; NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to look up the note" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to read the note from" - } - ], - "argline": "git_note **out, git_repository *repo, git_commit *notes_commit, const git_oid *oid", - "sig": "git_note **::git_repository *::git_commit *::const git_oid *", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Read the note for an object from a note commit

\n", - "comments": "

The note must be freed manually by the user.

\n", - "group": "note" - }, - "git_note_author": { - "type": "function", - "file": "git2/notes.h", - "line": 136, - "lineto": 136, - "args": [ - { "name": "note", "type": "const git_note *", "comment": "the note" } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { "type": "const git_signature *", "comment": " the author" }, - "description": "

Get the note author

\n", - "comments": "", - "group": "note" - }, - "git_note_committer": { - "type": "function", - "file": "git2/notes.h", - "line": 144, - "lineto": 144, - "args": [ - { "name": "note", "type": "const git_note *", "comment": "the note" } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_signature *", - "comment": " the committer" - }, - "description": "

Get the note committer

\n", - "comments": "", - "group": "note" - }, - "git_note_message": { - "type": "function", - "file": "git2/notes.h", - "line": 153, - "lineto": 153, - "args": [ - { "name": "note", "type": "const git_note *", "comment": "the note" } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { "type": "const char *", "comment": " the note message" }, - "description": "

Get the note message

\n", - "comments": "", - "group": "note" - }, - "git_note_id": { - "type": "function", - "file": "git2/notes.h", - "line": 162, - "lineto": 162, - "args": [ - { "name": "note", "type": "const git_note *", "comment": "the note" } - ], - "argline": "const git_note *note", - "sig": "const git_note *", - "return": { - "type": "const git_oid *", - "comment": " the note object's id" - }, - "description": "

Get the note object's id

\n", - "comments": "", - "group": "note" - }, - "git_note_create": { - "type": "function", - "file": "git2/notes.h", - "line": 179, - "lineto": 187, - "args": [ - { - "name": "out", - "type": "git_oid *", - "comment": "pointer to store the OID (optional); NULL in case of error" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where to store the note" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to decorate" - }, - { - "name": "note", - "type": "const char *", - "comment": "Content of the note to add for object oid" - }, - { "name": "force", "type": "int", "comment": "Overwrite existing note" } - ], - "argline": "git_oid *out, git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int force", - "sig": "git_oid *::git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *::const char *::int", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Add a note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_commit_create": { - "type": "function", - "file": "git2/notes.h", - "line": 209, - "lineto": 218, - "args": [ - { - "name": "notes_commit_out", - "type": "git_oid *", - "comment": "pointer to store the commit (optional);\n\t\t\t\t\tNULL in case of error" - }, - { - "name": "notes_blob_out", - "type": "git_oid *", - "comment": "a point to the id of a note blob (optional)" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note will live" - }, - { - "name": "parent", - "type": "git_commit *", - "comment": "Pointer to parent note\n\t\t\t\t\tor NULL if this shall start a new notes tree" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to decorate" - }, - { - "name": "note", - "type": "const char *", - "comment": "Content of the note to add for object oid" - }, - { - "name": "allow_note_overwrite", - "type": "int", - "comment": "Overwrite existing note" - } - ], - "argline": "git_oid *notes_commit_out, git_oid *notes_blob_out, git_repository *repo, git_commit *parent, const git_signature *author, const git_signature *committer, const git_oid *oid, const char *note, int allow_note_overwrite", - "sig": "git_oid *::git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *::const char *::int", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Add a note for an object from a commit

\n", - "comments": "

This function will create a notes commit for a given object, the commit is a dangling commit, no reference is created.

\n", - "group": "note" - }, - "git_note_remove": { - "type": "function", - "file": "git2/notes.h", - "line": 232, - "lineto": 237, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note lives" - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "canonical name of the reference to use (optional);\n\t\t\t\t\tdefaults to \"refs/notes/commits\"" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to remove the note from" - } - ], - "argline": "git_repository *repo, const char *notes_ref, const git_signature *author, const git_signature *committer, const git_oid *oid", - "sig": "git_repository *::const char *::const git_signature *::const git_signature *::const git_oid *", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Remove the note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_commit_remove": { - "type": "function", - "file": "git2/notes.h", - "line": 257, - "lineto": 263, - "args": [ - { - "name": "notes_commit_out", - "type": "git_oid *", - "comment": "pointer to store the new notes commit (optional);\n\t\t\t\t\tNULL in case of error.\n\t\t\t\t\tWhen removing a note a new tree containing all notes\n\t\t\t\t\tsans the note to be removed is created and a new commit\n\t\t\t\t\tpointing to that tree is also created.\n\t\t\t\t\tIn the case where the resulting tree is an empty tree\n\t\t\t\t\ta new commit pointing to this empty tree will be returned." - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "repository where the note lives" - }, - { - "name": "notes_commit", - "type": "git_commit *", - "comment": "a pointer to the notes commit object" - }, - { - "name": "author", - "type": "const git_signature *", - "comment": "signature of the notes commit author" - }, - { - "name": "committer", - "type": "const git_signature *", - "comment": "signature of the notes commit committer" - }, - { - "name": "oid", - "type": "const git_oid *", - "comment": "OID of the git object to remove the note from" - } - ], - "argline": "git_oid *notes_commit_out, git_repository *repo, git_commit *notes_commit, const git_signature *author, const git_signature *committer, const git_oid *oid", - "sig": "git_oid *::git_repository *::git_commit *::const git_signature *::const git_signature *::const git_oid *", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Remove the note for an object

\n", - "comments": "", - "group": "note" - }, - "git_note_free": { - "type": "function", - "file": "git2/notes.h", - "line": 270, - "lineto": 270, - "args": [ - { "name": "note", "type": "git_note *", "comment": "git_note object" } - ], - "argline": "git_note *note", - "sig": "git_note *", - "return": { "type": "void", "comment": null }, - "description": "

Free a git_note object

\n", - "comments": "", - "group": "note" - }, - "git_note_default_ref": { - "type": "function", - "file": "git2/notes.h", - "line": 280, - "lineto": 280, - "args": [ - { - "name": "out", - "type": "git_buf *", - "comment": "buffer in which to store the name of the default notes reference" - }, - { - "name": "repo", - "type": "git_repository *", - "comment": "The Git repository" - } - ], - "argline": "git_buf *out, git_repository *repo", - "sig": "git_buf *::git_repository *", - "return": { "type": "int", "comment": " 0 or an error code" }, - "description": "

Get the default notes reference for a repository

\n", - "comments": "", - "group": "note" - }, - "git_note_foreach": { - "type": "function", - "file": "git2/notes.h", - "line": 298, - "lineto": 302, - "args": [ - { - "name": "repo", - "type": "git_repository *", - "comment": "Repository where to find the notes." - }, - { - "name": "notes_ref", - "type": "const char *", - "comment": "Reference to read from (optional); defaults to\n \"refs/notes/commits\"." - }, - { - "name": "note_cb", - "type": "git_note_foreach_cb", - "comment": "Callback to invoke per found annotation. Return non-zero\n to stop looping." - }, - { - "name": "payload", - "type": "void *", - "comment": "Extra parameter to callback function." - } - ], - "argline": "git_repository *repo, const char *notes_ref, git_note_foreach_cb note_cb, void *payload", - "sig": "git_repository *::const char *::git_note_foreach_cb::void *", - "return": { - "type": "int", - "comment": " 0 on success, non-zero callback return value, or error code" - }, - "description": "

Loop over all the notes within a specified namespace\n and issue a callback for each one.

\n", - "comments": "", - "group": "note" - }, "git_object_lookup": { "type": "function", "file": "git2/object.h", - "line": 44, - "lineto": 48, + "line": 45, + "lineto": 49, "args": [ { "name": "object", @@ -11042,15 +10803,15 @@ "comments": "

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", "group": "object", "examples": { - "log.c": ["ex/v1.8.4/log.html#git_object_lookup-32"], - "merge.c": ["ex/v1.8.4/merge.html#git_object_lookup-17"] + "log.c": ["ex/v1.9.1/log.html#git_object_lookup-32"], + "merge.c": ["ex/v1.9.1/merge.html#git_object_lookup-17"] } }, "git_object_lookup_prefix": { "type": "function", "file": "git2/object.h", - "line": 77, - "lineto": 82, + "line": 78, + "lineto": 83, "args": [ { "name": "object_out", @@ -11082,14 +10843,14 @@ "sig": "git_object **::git_repository *::const git_oid *::size_t::git_object_t", "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Lookup a reference to one of the objects in a repository,\n given a prefix of its identifier (short id).

\n", - "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The 'type' parameter must match the type of the object in the odb; the method will fail otherwise. The special value 'GIT_OBJECT_ANY' may be passed to let the method guess the object's type.

\n", + "comments": "

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.

\n\n

The generated reference is owned by the repository and should be closed with the git_object_free method instead of free'd manually.

\n\n

The type parameter must match the type of the object in the odb; the method will fail otherwise. The special value GIT_OBJECT_ANY may be passed to let the method guess the object's type.

\n", "group": "object" }, "git_object_lookup_bypath": { "type": "function", "file": "git2/object.h", - "line": 95, - "lineto": 99, + "line": 96, + "lineto": 100, "args": [ { "name": "out", @@ -11122,8 +10883,8 @@ "git_object_id": { "type": "function", "file": "git2/object.h", - "line": 107, - "lineto": 107, + "line": 108, + "lineto": 108, "args": [ { "name": "obj", @@ -11139,35 +10900,35 @@ "group": "object", "examples": { "blame.c": [ - "ex/v1.8.4/blame.html#git_object_id-8", - "ex/v1.8.4/blame.html#git_object_id-9", - "ex/v1.8.4/blame.html#git_object_id-10", - "ex/v1.8.4/blame.html#git_object_id-11" + "ex/v1.9.1/blame.html#git_object_id-7", + "ex/v1.9.1/blame.html#git_object_id-8", + "ex/v1.9.1/blame.html#git_object_id-9", + "ex/v1.9.1/blame.html#git_object_id-10" ], "cat-file.c": [ - "ex/v1.8.4/cat-file.html#git_object_id-10", - "ex/v1.8.4/cat-file.html#git_object_id-11" + "ex/v1.9.1/cat-file.html#git_object_id-10", + "ex/v1.9.1/cat-file.html#git_object_id-11" ], "log.c": [ - "ex/v1.8.4/log.html#git_object_id-33", - "ex/v1.8.4/log.html#git_object_id-34", - "ex/v1.8.4/log.html#git_object_id-35", - "ex/v1.8.4/log.html#git_object_id-36" + "ex/v1.9.1/log.html#git_object_id-33", + "ex/v1.9.1/log.html#git_object_id-34", + "ex/v1.9.1/log.html#git_object_id-35", + "ex/v1.9.1/log.html#git_object_id-36" ], "rev-parse.c": [ - "ex/v1.8.4/rev-parse.html#git_object_id-2", - "ex/v1.8.4/rev-parse.html#git_object_id-3", - "ex/v1.8.4/rev-parse.html#git_object_id-4", - "ex/v1.8.4/rev-parse.html#git_object_id-5", - "ex/v1.8.4/rev-parse.html#git_object_id-6" + "ex/v1.9.1/rev-parse.html#git_object_id-2", + "ex/v1.9.1/rev-parse.html#git_object_id-3", + "ex/v1.9.1/rev-parse.html#git_object_id-4", + "ex/v1.9.1/rev-parse.html#git_object_id-5", + "ex/v1.9.1/rev-parse.html#git_object_id-6" ] } }, "git_object_short_id": { "type": "function", "file": "git2/object.h", - "line": 121, - "lineto": 121, + "line": 122, + "lineto": 122, "args": [ { "name": "out", @@ -11186,13 +10947,13 @@ "description": "

Get a short abbreviated OID string for the object

\n", "comments": "

This starts at the "core.abbrev" length (default 7 characters) and iteratively extends to a longer string if that length is ambiguous. The result will be unambiguous (at least until new objects are added to the repository).

\n", "group": "object", - "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_object_short_id-3"] } + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_object_short_id-3"] } }, "git_object_type": { "type": "function", "file": "git2/object.h", - "line": 129, - "lineto": 129, + "line": 130, + "lineto": 130, "args": [ { "name": "obj", @@ -11208,18 +10969,18 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/v1.8.4/cat-file.html#git_object_type-12", - "ex/v1.8.4/cat-file.html#git_object_type-13", - "ex/v1.8.4/cat-file.html#git_object_type-14" + "ex/v1.9.1/cat-file.html#git_object_type-12", + "ex/v1.9.1/cat-file.html#git_object_type-13", + "ex/v1.9.1/cat-file.html#git_object_type-14" ], - "tag.c": ["ex/v1.8.4/tag.html#git_object_type-4"] + "tag.c": ["ex/v1.9.1/tag.html#git_object_type-4"] } }, "git_object_owner": { "type": "function", "file": "git2/object.h", - "line": 143, - "lineto": 143, + "line": 144, + "lineto": 144, "args": [ { "name": "obj", "type": "const git_object *", "comment": "the object" } ], @@ -11236,8 +10997,8 @@ "git_object_free": { "type": "function", "file": "git2/object.h", - "line": 160, - "lineto": 160, + "line": 161, + "lineto": 161, "args": [ { "name": "object", @@ -11253,34 +11014,34 @@ "group": "object", "examples": { "blame.c": [ - "ex/v1.8.4/blame.html#git_object_free-12", - "ex/v1.8.4/blame.html#git_object_free-13", - "ex/v1.8.4/blame.html#git_object_free-14", - "ex/v1.8.4/blame.html#git_object_free-15" - ], - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_object_free-15"], - "commit.c": ["ex/v1.8.4/commit.html#git_object_free-6"], - "general.c": ["ex/v1.8.4/general.html#git_object_free-38"], - "log.c": ["ex/v1.8.4/log.html#git_object_free-37"], - "merge.c": ["ex/v1.8.4/merge.html#git_object_free-18"], + "ex/v1.9.1/blame.html#git_object_free-11", + "ex/v1.9.1/blame.html#git_object_free-12", + "ex/v1.9.1/blame.html#git_object_free-13", + "ex/v1.9.1/blame.html#git_object_free-14" + ], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_object_free-15"], + "commit.c": ["ex/v1.9.1/commit.html#git_object_free-6"], + "general.c": ["ex/v1.9.1/general.html#git_object_free-38"], + "log.c": ["ex/v1.9.1/log.html#git_object_free-37"], + "merge.c": ["ex/v1.9.1/merge.html#git_object_free-18"], "rev-parse.c": [ - "ex/v1.8.4/rev-parse.html#git_object_free-7", - "ex/v1.8.4/rev-parse.html#git_object_free-8", - "ex/v1.8.4/rev-parse.html#git_object_free-9" + "ex/v1.9.1/rev-parse.html#git_object_free-7", + "ex/v1.9.1/rev-parse.html#git_object_free-8", + "ex/v1.9.1/rev-parse.html#git_object_free-9" ], "tag.c": [ - "ex/v1.8.4/tag.html#git_object_free-5", - "ex/v1.8.4/tag.html#git_object_free-6", - "ex/v1.8.4/tag.html#git_object_free-7", - "ex/v1.8.4/tag.html#git_object_free-8" + "ex/v1.9.1/tag.html#git_object_free-5", + "ex/v1.9.1/tag.html#git_object_free-6", + "ex/v1.9.1/tag.html#git_object_free-7", + "ex/v1.9.1/tag.html#git_object_free-8" ] } }, "git_object_type2string": { "type": "function", "file": "git2/object.h", - "line": 171, - "lineto": 171, + "line": 172, + "lineto": 172, "args": [ { "name": "type", @@ -11299,22 +11060,22 @@ "group": "object", "examples": { "cat-file.c": [ - "ex/v1.8.4/cat-file.html#git_object_type2string-16", - "ex/v1.8.4/cat-file.html#git_object_type2string-17", - "ex/v1.8.4/cat-file.html#git_object_type2string-18", - "ex/v1.8.4/cat-file.html#git_object_type2string-19" + "ex/v1.9.1/cat-file.html#git_object_type2string-16", + "ex/v1.9.1/cat-file.html#git_object_type2string-17", + "ex/v1.9.1/cat-file.html#git_object_type2string-18", + "ex/v1.9.1/cat-file.html#git_object_type2string-19" ], "general.c": [ - "ex/v1.8.4/general.html#git_object_type2string-39", - "ex/v1.8.4/general.html#git_object_type2string-40" + "ex/v1.9.1/general.html#git_object_type2string-39", + "ex/v1.9.1/general.html#git_object_type2string-40" ] } }, "git_object_string2type": { "type": "function", "file": "git2/object.h", - "line": 179, - "lineto": 179, + "line": 180, + "lineto": 180, "args": [ { "name": "str", @@ -11335,8 +11096,8 @@ "git_object_typeisloose": { "type": "function", "file": "git2/object.h", - "line": 188, - "lineto": 188, + "line": 189, + "lineto": 189, "args": [ { "name": "type", @@ -11357,8 +11118,8 @@ "git_object_peel": { "type": "function", "file": "git2/object.h", - "line": 213, - "lineto": 216, + "line": 214, + "lineto": 217, "args": [ { "name": "peeled", @@ -11389,8 +11150,8 @@ "git_object_dup": { "type": "function", "file": "git2/object.h", - "line": 226, - "lineto": 226, + "line": 227, + "lineto": 227, "args": [ { "name": "dest", @@ -11413,8 +11174,8 @@ "git_object_rawcontent_is_valid": { "type": "function", "file": "git2/object.h", - "line": 269, - "lineto": 273, + "line": 270, + "lineto": 274, "args": [ { "name": "valid", @@ -11444,11 +11205,54 @@ "comments": "", "group": "object" }, + "git_odb_new": { + "type": "function", + "file": "git2/odb.h", + "line": 102, + "lineto": 102, + "args": [ + { + "name": "odb", + "type": "git_odb **", + "comment": "location to store the database pointer, if opened." + } + ], + "argline": "git_odb **odb", + "sig": "git_odb **", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new object database with no backends.

\n", + "comments": "

Before the ODB can be used for read/writing, a custom database backend must be manually added using git_odb_add_backend()

\n", + "group": "odb" + }, + "git_odb_open": { + "type": "function", + "file": "git2/odb.h", + "line": 120, + "lineto": 120, + "args": [ + { + "name": "odb_out", + "type": "git_odb **", + "comment": "location to store the database pointer, if opened.\n\t\t\tSet to NULL if the open failed." + }, + { + "name": "objects_dir", + "type": "const char *", + "comment": "path of the backends' \"objects\" directory." + } + ], + "argline": "git_odb **odb_out, const char *objects_dir", + "sig": "git_odb **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a new object database and automatically add\n the two default backends:

\n", + "comments": "
- git_odb_backend_loose: read and write loose object files      from disk, assuming `objects_dir` as the Objects folder\n\n- git_odb_backend_pack: read objects from packfiles,        assuming `objects_dir` as the Objects folder which      contains a 'pack/' folder with the corresponding data\n
\n", + "group": "odb" + }, "git_odb_add_disk_alternate": { "type": "function", "file": "git2/odb.h", - "line": 118, - "lineto": 118, + "line": 138, + "lineto": 138, "args": [ { "name": "odb", @@ -11474,8 +11278,8 @@ "git_odb_free": { "type": "function", "file": "git2/odb.h", - "line": 125, - "lineto": 125, + "line": 145, + "lineto": 145, "args": [ { "name": "db", @@ -11490,18 +11294,18 @@ "comments": "", "group": "odb", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_free-20"], - "general.c": ["ex/v1.8.4/general.html#git_odb_free-41"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_free-20"], + "general.c": ["ex/v1.9.1/general.html#git_odb_free-41"] } }, "git_odb_read": { "type": "function", "file": "git2/odb.h", - "line": 143, - "lineto": 143, + "line": 163, + "lineto": 163, "args": [ { - "name": "out", + "name": "obj", "type": "git_odb_object **", "comment": "pointer where to store the read object" }, @@ -11516,7 +11320,7 @@ "comment": "identity of the object to read." } ], - "argline": "git_odb_object **out, git_odb *db, const git_oid *id", + "argline": "git_odb_object **obj, git_odb *db, const git_oid *id", "sig": "git_odb_object **::git_odb *::const git_oid *", "return": { "type": "int", @@ -11526,18 +11330,18 @@ "comments": "

This method queries all available ODB backends trying to read the given OID.

\n\n

The returned object is reference counted and internally cached, so it should be closed by the user once it's no longer in use.

\n", "group": "odb", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_read-21"], - "general.c": ["ex/v1.8.4/general.html#git_odb_read-42"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_read-21"], + "general.c": ["ex/v1.9.1/general.html#git_odb_read-42"] } }, "git_odb_read_prefix": { "type": "function", "file": "git2/odb.h", - "line": 171, - "lineto": 171, + "line": 191, + "lineto": 191, "args": [ { - "name": "out", + "name": "obj", "type": "git_odb_object **", "comment": "pointer where to store the read object" }, @@ -11557,7 +11361,7 @@ "comment": "the length of the prefix" } ], - "argline": "git_odb_object **out, git_odb *db, const git_oid *short_id, size_t len", + "argline": "git_odb_object **obj, git_odb *db, const git_oid *short_id, size_t len", "sig": "git_odb_object **::git_odb *::const git_oid *::size_t", "return": { "type": "int", @@ -11570,8 +11374,8 @@ "git_odb_read_header": { "type": "function", "file": "git2/odb.h", - "line": 190, - "lineto": 190, + "line": 210, + "lineto": 210, "args": [ { "name": "len_out", @@ -11607,8 +11411,8 @@ "git_odb_exists": { "type": "function", "file": "git2/odb.h", - "line": 199, - "lineto": 199, + "line": 219, + "lineto": 219, "args": [ { "name": "db", @@ -11634,8 +11438,8 @@ "git_odb_exists_ext": { "type": "function", "file": "git2/odb.h", - "line": 210, - "lineto": 210, + "line": 230, + "lineto": 230, "args": [ { "name": "db", @@ -11666,8 +11470,8 @@ "git_odb_exists_prefix": { "type": "function", "file": "git2/odb.h", - "line": 223, - "lineto": 224, + "line": 243, + "lineto": 244, "args": [ { "name": "out", @@ -11703,8 +11507,8 @@ "git_odb_expand_ids": { "type": "function", "file": "git2/odb.h", - "line": 266, - "lineto": 269, + "line": 286, + "lineto": 289, "args": [ { "name": "db", @@ -11735,17 +11539,13 @@ "git_odb_refresh": { "type": "function", "file": "git2/odb.h", - "line": 289, - "lineto": 289, + "line": 309, + "lineto": 309, "args": [ - { - "name": "db", - "type": "struct git_odb *", - "comment": "database to refresh" - } + { "name": "db", "type": "git_odb *", "comment": "database to refresh" } ], - "argline": "struct git_odb *db", - "sig": "struct git_odb *", + "argline": "git_odb *db", + "sig": "git_odb *", "return": { "type": "int", "comment": " 0 on success, error code otherwise" @@ -11757,8 +11557,8 @@ "git_odb_foreach": { "type": "function", "file": "git2/odb.h", - "line": 304, - "lineto": 304, + "line": 324, + "lineto": 327, "args": [ { "name": "db", "type": "git_odb *", "comment": "database to use" }, { @@ -11785,8 +11585,8 @@ "git_odb_write": { "type": "function", "file": "git2/odb.h", - "line": 324, - "lineto": 324, + "line": 347, + "lineto": 347, "args": [ { "name": "out", @@ -11801,7 +11601,7 @@ { "name": "data", "type": "const void *", - "comment": "buffer with the data to store" + "comment": "`const unsigned char *` buffer with the data to store" }, { "name": "len", "type": "size_t", "comment": "size of the buffer" }, { @@ -11816,13 +11616,13 @@ "description": "

Write an object directly into the ODB

\n", "comments": "

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.

\n\n

This method is provided for compatibility with custom backends which are not able to support streaming writes

\n", "group": "odb", - "examples": { "general.c": ["ex/v1.8.4/general.html#git_odb_write-43"] } + "examples": { "general.c": ["ex/v1.9.1/general.html#git_odb_write-43"] } }, "git_odb_open_wstream": { "type": "function", "file": "git2/odb.h", - "line": 347, - "lineto": 347, + "line": 370, + "lineto": 370, "args": [ { "name": "out", @@ -11858,8 +11658,8 @@ "git_odb_stream_write": { "type": "function", "file": "git2/odb.h", - "line": 360, - "lineto": 360, + "line": 383, + "lineto": 383, "args": [ { "name": "stream", @@ -11886,8 +11686,8 @@ "git_odb_stream_finalize_write": { "type": "function", "file": "git2/odb.h", - "line": 375, - "lineto": 375, + "line": 398, + "lineto": 398, "args": [ { "name": "out", @@ -11913,8 +11713,8 @@ "git_odb_stream_read": { "type": "function", "file": "git2/odb.h", - "line": 387, - "lineto": 387, + "line": 410, + "lineto": 410, "args": [ { "name": "stream", @@ -11932,7 +11732,7 @@ "sig": "git_odb_stream *::char *::size_t", "return": { "type": "int", - "comment": " 0 if the read succeeded, error code otherwise" + "comment": " the number of bytes read if succeeded, error code otherwise" }, "description": "

Read from an odb stream

\n", "comments": "

Most backends don't implement streaming reads

\n", @@ -11941,8 +11741,8 @@ "git_odb_stream_free": { "type": "function", "file": "git2/odb.h", - "line": 394, - "lineto": 394, + "line": 417, + "lineto": 417, "args": [ { "name": "stream", @@ -11960,8 +11760,8 @@ "git_odb_open_rstream": { "type": "function", "file": "git2/odb.h", - "line": 422, - "lineto": 427, + "line": 445, + "lineto": 450, "args": [ { "name": "out", @@ -12002,8 +11802,8 @@ "git_odb_write_pack": { "type": "function", "file": "git2/odb.h", - "line": 448, - "lineto": 452, + "line": 471, + "lineto": 475, "args": [ { "name": "out", @@ -12036,8 +11836,8 @@ "git_odb_write_multi_pack_index": { "type": "function", "file": "git2/odb.h", - "line": 466, - "lineto": 467, + "line": 489, + "lineto": 490, "args": [ { "name": "db", @@ -12052,11 +11852,66 @@ "comments": "

If the ODB layer understands pack files, then this will create a file called multi-pack-index next to the .pack and .idx files, which will contain an index of all objects stored in .pack files. This will allow for O(log n) lookup for n objects (regardless of how many packfiles there exist).

\n", "group": "odb" }, + "git_odb_hash": { + "type": "function", + "file": "git2/odb.h", + "line": 539, + "lineto": 539, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "the resulting object-ID." + }, + { "name": "data", "type": "const void *", "comment": "data to hash" }, + { "name": "len", "type": "size_t", "comment": "size of the data" }, + { + "name": "object_type", + "type": "git_object_t", + "comment": "of the data to hash" + } + ], + "argline": "git_oid *oid, const void *data, size_t len, git_object_t object_type", + "sig": "git_oid *::const void *::size_t::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Determine the object-ID (sha1 or sha256 hash) of a data buffer

\n", + "comments": "

The resulting OID will be the identifier for the data buffer as if the data buffer it were to written to the ODB.

\n", + "group": "odb" + }, + "git_odb_hashfile": { + "type": "function", + "file": "git2/odb.h", + "line": 554, + "lineto": 554, + "args": [ + { + "name": "oid", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "path", + "type": "const char *", + "comment": "file to read and determine object id for" + }, + { + "name": "object_type", + "type": "git_object_t", + "comment": "of the data to hash" + } + ], + "argline": "git_oid *oid, const char *path, git_object_t object_type", + "sig": "git_oid *::const char *::git_object_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Read a file from disk and fill a git_oid with the object id\n that the file would have if it were written to the Object\n Database as an object of the given type (w/o applying filters).\n Similar functionality to git.git's git hash-object without\n the -w flag, however, with the --no-filters flag.\n If you need filters, see git_repository_hashfile.

\n", + "comments": "", + "group": "odb" + }, "git_odb_object_dup": { "type": "function", "file": "git2/odb.h", - "line": 529, - "lineto": 529, + "line": 570, + "lineto": 570, "args": [ { "name": "dest", @@ -12079,8 +11934,8 @@ "git_odb_object_free": { "type": "function", "file": "git2/odb.h", - "line": 539, - "lineto": 539, + "line": 580, + "lineto": 580, "args": [ { "name": "object", @@ -12095,15 +11950,15 @@ "comments": "

This method must always be called once a git_odb_object is no longer needed, otherwise memory will leak.

\n", "group": "odb", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_object_free-22"], - "general.c": ["ex/v1.8.4/general.html#git_odb_object_free-44"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_object_free-22"], + "general.c": ["ex/v1.9.1/general.html#git_odb_object_free-44"] } }, "git_odb_object_id": { "type": "function", "file": "git2/odb.h", - "line": 549, - "lineto": 549, + "line": 590, + "lineto": 590, "args": [ { "name": "object", @@ -12124,8 +11979,8 @@ "git_odb_object_data": { "type": "function", "file": "git2/odb.h", - "line": 562, - "lineto": 562, + "line": 603, + "lineto": 603, "args": [ { "name": "object", @@ -12135,19 +11990,22 @@ ], "argline": "git_odb_object *object", "sig": "git_odb_object *", - "return": { "type": "const void *", "comment": " a pointer to the data" }, + "return": { + "type": "const void *", + "comment": " \n\n `const unsigned char *` a pointer to the data" + }, "description": "

Return the data of an ODB object

\n", "comments": "

This is the uncompressed, raw data as read from the ODB, without the leading header.

\n\n

This pointer is owned by the object and shall not be free'd.

\n", "group": "odb", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_odb_object_data-45"] + "general.c": ["ex/v1.9.1/general.html#git_odb_object_data-45"] } }, "git_odb_object_size": { "type": "function", "file": "git2/odb.h", - "line": 573, - "lineto": 573, + "line": 614, + "lineto": 614, "args": [ { "name": "object", @@ -12162,15 +12020,15 @@ "comments": "

This is the real size of the data buffer, not the actual size of the object.

\n", "group": "odb", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_odb_object_size-23"], - "general.c": ["ex/v1.8.4/general.html#git_odb_object_size-46"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_odb_object_size-23"], + "general.c": ["ex/v1.9.1/general.html#git_odb_object_size-46"] } }, "git_odb_object_type": { "type": "function", "file": "git2/odb.h", - "line": 581, - "lineto": 581, + "line": 622, + "lineto": 622, "args": [ { "name": "object", @@ -12185,14 +12043,14 @@ "comments": "", "group": "odb", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_odb_object_type-47"] + "general.c": ["ex/v1.9.1/general.html#git_odb_object_type-47"] } }, "git_odb_add_backend": { "type": "function", "file": "git2/odb.h", - "line": 596, - "lineto": 596, + "line": 637, + "lineto": 637, "args": [ { "name": "odb", @@ -12223,8 +12081,8 @@ "git_odb_add_alternate": { "type": "function", "file": "git2/odb.h", - "line": 617, - "lineto": 617, + "line": 658, + "lineto": 658, "args": [ { "name": "odb", @@ -12255,8 +12113,8 @@ "git_odb_num_backends": { "type": "function", "file": "git2/odb.h", - "line": 625, - "lineto": 625, + "line": 666, + "lineto": 666, "args": [ { "name": "odb", "type": "git_odb *", "comment": "object database" } ], @@ -12273,8 +12131,8 @@ "git_odb_get_backend": { "type": "function", "file": "git2/odb.h", - "line": 635, - "lineto": 635, + "line": 676, + "lineto": 676, "args": [ { "name": "out", @@ -12301,8 +12159,8 @@ "git_odb_set_commit_graph": { "type": "function", "file": "git2/odb.h", - "line": 650, - "lineto": 650, + "line": 691, + "lineto": 691, "args": [ { "name": "odb", "type": "git_odb *", "comment": "object database" }, { @@ -12321,11 +12179,224 @@ "comments": "

After a successful call, the ownership of the cgraph parameter will be transferred to libgit2, and the caller should not free it.

\n\n

The commit-graph can also be unset by explicitly passing NULL as the cgraph parameter.

\n", "group": "odb" }, + "git_odb_backend_pack": { + "type": "function", + "file": "git2/odb_backend.h", + "line": 142, + "lineto": 144, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "location to store the odb backend pointer" + }, + { + "name": "objects_dir", + "type": "const char *", + "comment": "the Git repository's objects directory" + } + ], + "argline": "git_odb_backend **out, const char *objects_dir", + "sig": "git_odb_backend **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a backend for a directory containing packfiles.

\n", + "comments": "", + "group": "odb" + }, + "git_odb_backend_one_pack": { + "type": "function", + "file": "git2/odb_backend.h", + "line": 156, + "lineto": 158, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "location to store the odb backend pointer" + }, + { + "name": "index_file", + "type": "const char *", + "comment": "path to the packfile's .idx file" + } + ], + "argline": "git_odb_backend **out, const char *index_file", + "sig": "git_odb_backend **::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a backend out of a single packfile

\n", + "comments": "

This can be useful for inspecting the contents of a single packfile.

\n", + "group": "odb" + }, + "git_odb_backend_loose": { + "type": "function", + "file": "git2/odb_backend.h", + "line": 171, + "lineto": 177, + "args": [ + { + "name": "out", + "type": "git_odb_backend **", + "comment": "location to store the odb backend pointer" + }, + { + "name": "objects_dir", + "type": "const char *", + "comment": "the Git repository's objects directory" + }, + { + "name": "compression_level", + "type": "int", + "comment": "zlib compression level (0-9), or -1 for the default" + }, + { + "name": "do_fsync", + "type": "int", + "comment": "if non-zero, perform an fsync on write" + }, + { + "name": "dir_mode", + "type": "unsigned int", + "comment": "permission to use when creating directories, or 0 for default" + }, + { + "name": "file_mode", + "type": "unsigned int", + "comment": "permission to use when creating directories, or 0 for default" + } + ], + "argline": "git_odb_backend **out, const char *objects_dir, int compression_level, int do_fsync, unsigned int dir_mode, unsigned int file_mode", + "sig": "git_odb_backend **::const char *::int::int::unsigned int::unsigned int", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a backend for loose objects

\n", + "comments": "", + "group": "odb" + }, + "git_oid_fromstr": { + "type": "function", + "file": "git2/oid.h", + "line": 137, + "lineto": 137, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string; must be pointing at the start of\n\t\tthe hex sequence and have at least the number of bytes\n\t\tneeded for an oid encoded in hex (40 bytes for sha1,\n\t\t256 bytes for sha256)." + } + ], + "argline": "git_oid *out, const char *str", + "sig": "git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Parse a hex formatted object id into a git_oid.

\n", + "comments": "

The appropriate number of bytes for the given object ID type will be read from the string - 40 bytes for SHA1, 64 bytes for SHA256. The given string need not be NUL terminated.

\n", + "group": "oid", + "examples": { + "general.c": [ + "ex/v1.9.1/general.html#git_oid_fromstr-48", + "ex/v1.9.1/general.html#git_oid_fromstr-49", + "ex/v1.9.1/general.html#git_oid_fromstr-50", + "ex/v1.9.1/general.html#git_oid_fromstr-51", + "ex/v1.9.1/general.html#git_oid_fromstr-52", + "ex/v1.9.1/general.html#git_oid_fromstr-53", + "ex/v1.9.1/general.html#git_oid_fromstr-54", + "ex/v1.9.1/general.html#git_oid_fromstr-55", + "ex/v1.9.1/general.html#git_oid_fromstr-56", + "ex/v1.9.1/general.html#git_oid_fromstr-57", + "ex/v1.9.1/general.html#git_oid_fromstr-58", + "ex/v1.9.1/general.html#git_oid_fromstr-59", + "ex/v1.9.1/general.html#git_oid_fromstr-60", + "ex/v1.9.1/general.html#git_oid_fromstr-61", + "ex/v1.9.1/general.html#git_oid_fromstr-62", + "ex/v1.9.1/general.html#git_oid_fromstr-63" + ] + } + }, + "git_oid_fromstrp": { + "type": "function", + "file": "git2/oid.h", + "line": 146, + "lineto": 146, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string; must be null-terminated." + } + ], + "argline": "git_oid *out, const char *str", + "sig": "git_oid *::const char *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Parse a hex formatted NUL-terminated string into a git_oid.

\n", + "comments": "", + "group": "oid" + }, + "git_oid_fromstrn": { + "type": "function", + "file": "git2/oid.h", + "line": 159, + "lineto": 159, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "str", + "type": "const char *", + "comment": "input hex string of at least size `length`" + }, + { + "name": "length", + "type": "size_t", + "comment": "length of the input string" + } + ], + "argline": "git_oid *out, const char *str, size_t length", + "sig": "git_oid *::const char *::size_t", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Parse N characters of a hex formatted object id into a git_oid.

\n", + "comments": "

If N is odd, the last byte's high nibble will be read in and the low nibble set to zero.

\n", + "group": "oid" + }, + "git_oid_fromraw": { + "type": "function", + "file": "git2/oid.h", + "line": 168, + "lineto": 168, + "args": [ + { + "name": "out", + "type": "git_oid *", + "comment": "oid structure the result is written into." + }, + { + "name": "raw", + "type": "const unsigned char *", + "comment": "the raw input bytes to be copied." + } + ], + "argline": "git_oid *out, const unsigned char *raw", + "sig": "git_oid *::const unsigned char *", + "return": { "type": "int", "comment": " 0 on success or error code" }, + "description": "

Copy an already raw oid into a git_oid structure.

\n", + "comments": "", + "group": "oid" + }, "git_oid_fmt": { "type": "function", "file": "git2/oid.h", - "line": 188, - "lineto": 188, + "line": 184, + "lineto": 184, "args": [ { "name": "out", @@ -12346,24 +12417,24 @@ "group": "oid", "examples": { "fetch.c": [ - "ex/v1.8.4/fetch.html#git_oid_fmt-1", - "ex/v1.8.4/fetch.html#git_oid_fmt-2" + "ex/v1.9.1/fetch.html#git_oid_fmt-1", + "ex/v1.9.1/fetch.html#git_oid_fmt-2" ], "general.c": [ - "ex/v1.8.4/general.html#git_oid_fmt-48", - "ex/v1.8.4/general.html#git_oid_fmt-49", - "ex/v1.8.4/general.html#git_oid_fmt-50", - "ex/v1.8.4/general.html#git_oid_fmt-51", - "ex/v1.8.4/general.html#git_oid_fmt-52" + "ex/v1.9.1/general.html#git_oid_fmt-64", + "ex/v1.9.1/general.html#git_oid_fmt-65", + "ex/v1.9.1/general.html#git_oid_fmt-66", + "ex/v1.9.1/general.html#git_oid_fmt-67", + "ex/v1.9.1/general.html#git_oid_fmt-68" ], - "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_oid_fmt-1"] + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_oid_fmt-1"] } }, "git_oid_nfmt": { "type": "function", "file": "git2/oid.h", - "line": 200, - "lineto": 200, + "line": 196, + "lineto": 196, "args": [ { "name": "out", @@ -12391,8 +12462,8 @@ "git_oid_pathfmt": { "type": "function", "file": "git2/oid.h", - "line": 217, - "lineto": 217, + "line": 213, + "lineto": 213, "args": [ { "name": "out", @@ -12418,8 +12489,8 @@ "git_oid_tostr_s": { "type": "function", "file": "git2/oid.h", - "line": 230, - "lineto": 230, + "line": 226, + "lineto": 226, "args": [ { "name": "oid", @@ -12438,16 +12509,16 @@ "group": "oid", "examples": { "merge.c": [ - "ex/v1.8.4/merge.html#git_oid_tostr_s-19", - "ex/v1.8.4/merge.html#git_oid_tostr_s-20" + "ex/v1.9.1/merge.html#git_oid_tostr_s-19", + "ex/v1.9.1/merge.html#git_oid_tostr_s-20" ] } }, "git_oid_tostr": { "type": "function", "file": "git2/oid.h", - "line": 251, - "lineto": 251, + "line": 247, + "lineto": 247, "args": [ { "name": "out", @@ -12476,33 +12547,33 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v1.8.4/blame.html#git_oid_tostr-16", - "ex/v1.8.4/blame.html#git_oid_tostr-17" + "ex/v1.9.1/blame.html#git_oid_tostr-15", + "ex/v1.9.1/blame.html#git_oid_tostr-16" ], "cat-file.c": [ - "ex/v1.8.4/cat-file.html#git_oid_tostr-24", - "ex/v1.8.4/cat-file.html#git_oid_tostr-25", - "ex/v1.8.4/cat-file.html#git_oid_tostr-26", - "ex/v1.8.4/cat-file.html#git_oid_tostr-27", - "ex/v1.8.4/cat-file.html#git_oid_tostr-28" + "ex/v1.9.1/cat-file.html#git_oid_tostr-24", + "ex/v1.9.1/cat-file.html#git_oid_tostr-25", + "ex/v1.9.1/cat-file.html#git_oid_tostr-26", + "ex/v1.9.1/cat-file.html#git_oid_tostr-27", + "ex/v1.9.1/cat-file.html#git_oid_tostr-28" ], "log.c": [ - "ex/v1.8.4/log.html#git_oid_tostr-38", - "ex/v1.8.4/log.html#git_oid_tostr-39" + "ex/v1.9.1/log.html#git_oid_tostr-38", + "ex/v1.9.1/log.html#git_oid_tostr-39" ], "rev-parse.c": [ - "ex/v1.8.4/rev-parse.html#git_oid_tostr-10", - "ex/v1.8.4/rev-parse.html#git_oid_tostr-11", - "ex/v1.8.4/rev-parse.html#git_oid_tostr-12", - "ex/v1.8.4/rev-parse.html#git_oid_tostr-13" + "ex/v1.9.1/rev-parse.html#git_oid_tostr-10", + "ex/v1.9.1/rev-parse.html#git_oid_tostr-11", + "ex/v1.9.1/rev-parse.html#git_oid_tostr-12", + "ex/v1.9.1/rev-parse.html#git_oid_tostr-13" ] } }, "git_oid_cpy": { "type": "function", "file": "git2/oid.h", - "line": 260, - "lineto": 260, + "line": 256, + "lineto": 256, "args": [ { "name": "out", @@ -12523,17 +12594,17 @@ "group": "oid", "examples": { "blame.c": [ - "ex/v1.8.4/blame.html#git_oid_cpy-18", - "ex/v1.8.4/blame.html#git_oid_cpy-19", - "ex/v1.8.4/blame.html#git_oid_cpy-20" + "ex/v1.9.1/blame.html#git_oid_cpy-17", + "ex/v1.9.1/blame.html#git_oid_cpy-18", + "ex/v1.9.1/blame.html#git_oid_cpy-19" ] } }, "git_oid_cmp": { "type": "function", "file": "git2/oid.h", - "line": 269, - "lineto": 269, + "line": 265, + "lineto": 265, "args": [ { "name": "a", @@ -12559,8 +12630,8 @@ "git_oid_equal": { "type": "function", "file": "git2/oid.h", - "line": 278, - "lineto": 278, + "line": 274, + "lineto": 274, "args": [ { "name": "a", @@ -12583,8 +12654,8 @@ "git_oid_ncmp": { "type": "function", "file": "git2/oid.h", - "line": 289, - "lineto": 289, + "line": 285, + "lineto": 285, "args": [ { "name": "a", @@ -12612,8 +12683,8 @@ "git_oid_streq": { "type": "function", "file": "git2/oid.h", - "line": 298, - "lineto": 298, + "line": 294, + "lineto": 294, "args": [ { "name": "id", @@ -12639,8 +12710,8 @@ "git_oid_strcmp": { "type": "function", "file": "git2/oid.h", - "line": 308, - "lineto": 308, + "line": 304, + "lineto": 304, "args": [ { "name": "id", @@ -12666,9 +12737,15 @@ "git_oid_is_zero": { "type": "function", "file": "git2/oid.h", - "line": 315, - "lineto": 315, - "args": [{ "name": "id", "type": "const git_oid *", "comment": null }], + "line": 312, + "lineto": 312, + "args": [ + { + "name": "id", + "type": "const git_oid *", + "comment": "the object ID to check" + } + ], "argline": "const git_oid *id", "sig": "const git_oid *", "return": { "type": "int", "comment": " 1 if all zeros, 0 otherwise." }, @@ -12676,15 +12753,15 @@ "comments": "", "group": "oid", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_oid_is_zero-21"], - "fetch.c": ["ex/v1.8.4/fetch.html#git_oid_is_zero-3"] + "blame.c": ["ex/v1.9.1/blame.html#git_oid_is_zero-20"], + "fetch.c": ["ex/v1.9.1/fetch.html#git_oid_is_zero-3"] } }, "git_oid_shorten_new": { "type": "function", "file": "git2/oid.h", - "line": 336, - "lineto": 336, + "line": 333, + "lineto": 333, "args": [ { "name": "min_length", @@ -12705,8 +12782,8 @@ "git_oid_shorten_add": { "type": "function", "file": "git2/oid.h", - "line": 362, - "lineto": 362, + "line": 359, + "lineto": 359, "args": [ { "name": "os", @@ -12732,8 +12809,8 @@ "git_oid_shorten_free": { "type": "function", "file": "git2/oid.h", - "line": 369, - "lineto": 369, + "line": 366, + "lineto": 366, "args": [ { "name": "os", @@ -12751,8 +12828,8 @@ "git_oidarray_dispose": { "type": "function", "file": "git2/oidarray.h", - "line": 31, - "lineto": 31, + "line": 38, + "lineto": 38, "args": [ { "name": "array", @@ -13128,8 +13205,8 @@ "git_packbuilder_set_callbacks": { "type": "function", "file": "git2/pack.h", - "line": 253, - "lineto": 256, + "line": 264, + "lineto": 267, "args": [ { "name": "pb", @@ -13139,7 +13216,7 @@ { "name": "progress_cb", "type": "git_packbuilder_progress", - "comment": "Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected." + "comment": "Function to call with progress information during\n pack building. Be aware that this is called inline with pack building\n operations, so performance may be affected.\n When progress_cb returns an error, the pack building process will be\n aborted and the error will be returned from the invoked function.\n `pb` must then be freed." }, { "name": "progress_cb_payload", @@ -13157,8 +13234,8 @@ "git_packbuilder_free": { "type": "function", "file": "git2/pack.h", - "line": 263, - "lineto": 263, + "line": 274, + "lineto": 274, "args": [ { "name": "pb", @@ -13371,7 +13448,7 @@ "comments": "

This is just like git_diff_buffers() except it generates a patch object for the difference instead of directly making callbacks. You can use the standard git_patch accessor functions to read the patch data, and you must call git_patch_free() on the patch when done.

\n", "group": "patch", "examples": { - "diff.c": ["ex/v1.8.4/diff.html#git_patch_from_buffers-16"] + "diff.c": ["ex/v1.9.1/diff.html#git_patch_from_buffers-16"] } }, "git_patch_free": { @@ -13392,7 +13469,7 @@ "description": "

Free a git_patch object.

\n", "comments": "", "group": "patch", - "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_patch_free-17"] } + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_patch_free-17"] } }, "git_patch_get_delta": { "type": "function", @@ -13661,13 +13738,13 @@ "description": "

Get the content of a patch as a single diff text.

\n", "comments": "", "group": "patch", - "examples": { "diff.c": ["ex/v1.8.4/diff.html#git_patch_to_buf-18"] } + "examples": { "diff.c": ["ex/v1.9.1/diff.html#git_patch_to_buf-18"] } }, "git_pathspec_new": { "type": "function", "file": "git2/pathspec.h", - "line": 82, - "lineto": 83, + "line": 89, + "lineto": 90, "args": [ { "name": "out", @@ -13689,13 +13766,13 @@ "description": "

Compile a pathspec

\n", "comments": "", "group": "pathspec", - "examples": { "log.c": ["ex/v1.8.4/log.html#git_pathspec_new-40"] } + "examples": { "log.c": ["ex/v1.9.1/log.html#git_pathspec_new-40"] } }, "git_pathspec_free": { "type": "function", "file": "git2/pathspec.h", - "line": 90, - "lineto": 90, + "line": 97, + "lineto": 97, "args": [ { "name": "ps", @@ -13709,13 +13786,13 @@ "description": "

Free a pathspec

\n", "comments": "", "group": "pathspec", - "examples": { "log.c": ["ex/v1.8.4/log.html#git_pathspec_free-41"] } + "examples": { "log.c": ["ex/v1.9.1/log.html#git_pathspec_free-41"] } }, "git_pathspec_matches_path": { "type": "function", "file": "git2/pathspec.h", - "line": 105, - "lineto": 106, + "line": 112, + "lineto": 113, "args": [ { "name": "ps", @@ -13746,8 +13823,8 @@ "git_pathspec_match_workdir": { "type": "function", "file": "git2/pathspec.h", - "line": 130, - "lineto": 134, + "line": 137, + "lineto": 141, "args": [ { "name": "out", @@ -13783,8 +13860,8 @@ "git_pathspec_match_index": { "type": "function", "file": "git2/pathspec.h", - "line": 159, - "lineto": 163, + "line": 166, + "lineto": 170, "args": [ { "name": "out", @@ -13820,8 +13897,8 @@ "git_pathspec_match_tree": { "type": "function", "file": "git2/pathspec.h", - "line": 183, - "lineto": 187, + "line": 190, + "lineto": 194, "args": [ { "name": "out", @@ -13853,13 +13930,13 @@ "description": "

Match a pathspec against files in a tree.

\n", "comments": "

This matches the pathspec against the files in the given tree.

\n\n

If out is not NULL, this returns a git_patchspec_match_list. That contains the list of all matched filenames (unless you pass the GIT_PATHSPEC_FAILURES_ONLY flag) and may also contain the list of pathspecs with no match (if you used the GIT_PATHSPEC_FIND_FAILURES flag). You must call git_pathspec_match_list_free() on this object.

\n", "group": "pathspec", - "examples": { "log.c": ["ex/v1.8.4/log.html#git_pathspec_match_tree-42"] } + "examples": { "log.c": ["ex/v1.9.1/log.html#git_pathspec_match_tree-42"] } }, "git_pathspec_match_diff": { "type": "function", "file": "git2/pathspec.h", - "line": 207, - "lineto": 211, + "line": 214, + "lineto": 218, "args": [ { "name": "out", @@ -13895,8 +13972,8 @@ "git_pathspec_match_list_free": { "type": "function", "file": "git2/pathspec.h", - "line": 218, - "lineto": 218, + "line": 225, + "lineto": 225, "args": [ { "name": "m", @@ -13914,8 +13991,8 @@ "git_pathspec_match_list_entrycount": { "type": "function", "file": "git2/pathspec.h", - "line": 226, - "lineto": 227, + "line": 233, + "lineto": 234, "args": [ { "name": "m", @@ -13936,8 +14013,8 @@ "git_pathspec_match_list_entry": { "type": "function", "file": "git2/pathspec.h", - "line": 239, - "lineto": 240, + "line": 246, + "lineto": 247, "args": [ { "name": "m", @@ -13963,8 +14040,8 @@ "git_pathspec_match_list_diff_entry": { "type": "function", "file": "git2/pathspec.h", - "line": 252, - "lineto": 253, + "line": 259, + "lineto": 260, "args": [ { "name": "m", @@ -13990,8 +14067,8 @@ "git_pathspec_match_list_failed_entrycount": { "type": "function", "file": "git2/pathspec.h", - "line": 264, - "lineto": 265, + "line": 271, + "lineto": 272, "args": [ { "name": "m", @@ -14012,8 +14089,8 @@ "git_pathspec_match_list_failed_entry": { "type": "function", "file": "git2/pathspec.h", - "line": 276, - "lineto": 277, + "line": 283, + "lineto": 284, "args": [ { "name": "m", @@ -14039,8 +14116,8 @@ "git_proxy_options_init": { "type": "function", "file": "git2/proxy.h", - "line": 94, - "lineto": 94, + "line": 103, + "lineto": 103, "args": [ { "name": "opts", @@ -14066,8 +14143,8 @@ "git_rebase_options_init": { "type": "function", "file": "git2/rebase.h", - "line": 199, - "lineto": 201, + "line": 201, + "lineto": 203, "args": [ { "name": "opts", @@ -14093,8 +14170,8 @@ "git_rebase_init": { "type": "function", "file": "git2/rebase.h", - "line": 220, - "lineto": 226, + "line": 222, + "lineto": 228, "args": [ { "name": "out", @@ -14140,8 +14217,8 @@ "git_rebase_open": { "type": "function", "file": "git2/rebase.h", - "line": 237, - "lineto": 240, + "line": 239, + "lineto": 242, "args": [ { "name": "out", @@ -14172,8 +14249,8 @@ "git_rebase_orig_head_name": { "type": "function", "file": "git2/rebase.h", - "line": 248, - "lineto": 248, + "line": 250, + "lineto": 250, "args": [ { "name": "rebase", @@ -14194,8 +14271,8 @@ "git_rebase_orig_head_id": { "type": "function", "file": "git2/rebase.h", - "line": 256, - "lineto": 256, + "line": 258, + "lineto": 258, "args": [ { "name": "rebase", @@ -14216,8 +14293,8 @@ "git_rebase_onto_name": { "type": "function", "file": "git2/rebase.h", - "line": 264, - "lineto": 264, + "line": 266, + "lineto": 266, "args": [ { "name": "rebase", @@ -14235,8 +14312,8 @@ "git_rebase_onto_id": { "type": "function", "file": "git2/rebase.h", - "line": 272, - "lineto": 272, + "line": 274, + "lineto": 274, "args": [ { "name": "rebase", @@ -14254,8 +14331,8 @@ "git_rebase_operation_entrycount": { "type": "function", "file": "git2/rebase.h", - "line": 280, - "lineto": 280, + "line": 282, + "lineto": 282, "args": [ { "name": "rebase", @@ -14276,8 +14353,8 @@ "git_rebase_operation_current": { "type": "function", "file": "git2/rebase.h", - "line": 291, - "lineto": 291, + "line": 293, + "lineto": 293, "args": [ { "name": "rebase", @@ -14298,8 +14375,8 @@ "git_rebase_operation_byindex": { "type": "function", "file": "git2/rebase.h", - "line": 300, - "lineto": 302, + "line": 302, + "lineto": 304, "args": [ { "name": "rebase", @@ -14325,8 +14402,8 @@ "git_rebase_next": { "type": "function", "file": "git2/rebase.h", - "line": 315, - "lineto": 317, + "line": 317, + "lineto": 319, "args": [ { "name": "operation", @@ -14352,8 +14429,8 @@ "git_rebase_inmemory_index": { "type": "function", "file": "git2/rebase.h", - "line": 334, - "lineto": 336, + "line": 336, + "lineto": 338, "args": [ { "name": "index", @@ -14376,8 +14453,8 @@ "git_rebase_commit": { "type": "function", "file": "git2/rebase.h", - "line": 360, - "lineto": 366, + "line": 362, + "lineto": 368, "args": [ { "name": "id", @@ -14423,8 +14500,8 @@ "git_rebase_abort": { "type": "function", "file": "git2/rebase.h", - "line": 376, - "lineto": 376, + "line": 378, + "lineto": 378, "args": [ { "name": "rebase", @@ -14445,8 +14522,8 @@ "git_rebase_finish": { "type": "function", "file": "git2/rebase.h", - "line": 386, - "lineto": 388, + "line": 388, + "lineto": 390, "args": [ { "name": "rebase", @@ -14469,8 +14546,8 @@ "git_rebase_free": { "type": "function", "file": "git2/rebase.h", - "line": 395, - "lineto": 395, + "line": 397, + "lineto": 397, "args": [ { "name": "rebase", @@ -14921,11 +14998,11 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v1.8.4/checkout.html#git_reference_lookup-15", - "ex/v1.8.4/checkout.html#git_reference_lookup-16" + "ex/v1.9.1/checkout.html#git_reference_lookup-15", + "ex/v1.9.1/checkout.html#git_reference_lookup-16" ], - "general.c": ["ex/v1.8.4/general.html#git_reference_lookup-53"], - "merge.c": ["ex/v1.8.4/merge.html#git_reference_lookup-21"] + "general.c": ["ex/v1.9.1/general.html#git_reference_lookup-69"], + "merge.c": ["ex/v1.9.1/merge.html#git_reference_lookup-21"] } }, "git_reference_name_to_id": { @@ -14988,7 +15065,7 @@ "description": "

Lookup a reference by DWIMing its short name

\n", "comments": "

Apply the git precedence rules to the given shorthand to determine which reference the user is referring to.

\n", "group": "reference", - "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_reference_dwim-22"] } + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_reference_dwim-22"] } }, "git_reference_symbolic_create_matching": { "type": "function", @@ -15136,7 +15213,7 @@ "comments": "

A direct reference (also called an object id reference) refers directly to a specific object id (a.k.a. OID or SHA) in the repository. The id permanently refers to the object (although the reference itself can be moved). For example, in libgit2 the direct ref "refs/tags/v0.17.0" refers to OID 5b9fac39d8a76b9139667c26a63e6b3f204b3977.

\n\n

The direct reference will be created in the repository and written to the disk. The generated reference object must be freed by the user.

\n\n

Valid reference names must follow one of two patterns:

\n\n
    \n
  1. Top-level names must contain only capital letters and underscores, and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD"). 2. Names prefixed with "refs/" can be almost anything. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.
  2. \n
\n\n

This function will return an error if a reference already exists with the given name unless force is true, in which case it will be overwritten.

\n\n

The message for the reflog will be ignored if the reference does not belong in the standard set (HEAD, branches and remote-tracking branches) and it does not have a reflog.

\n", "group": "reference", "examples": { - "merge.c": ["ex/v1.8.4/merge.html#git_reference_create-23"] + "merge.c": ["ex/v1.9.1/merge.html#git_reference_create-23"] } }, "git_reference_create_matching": { @@ -15213,7 +15290,7 @@ "comments": "

Only available if the reference is direct (i.e. an object id reference, not a symbolic one).

\n\n

To find the OID of a symbolic ref, call git_reference_resolve() and then this function (or maybe use git_reference_name_to_id() to directly resolve a reference name all the way through to an OID).

\n", "group": "reference", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_reference_target-54"] + "general.c": ["ex/v1.9.1/general.html#git_reference_target-70"] } }, "git_reference_target_peel": { @@ -15261,9 +15338,9 @@ "group": "reference", "examples": { "general.c": [ - "ex/v1.8.4/general.html#git_reference_symbolic_target-55" + "ex/v1.9.1/general.html#git_reference_symbolic_target-71" ], - "merge.c": ["ex/v1.8.4/merge.html#git_reference_symbolic_target-24"] + "merge.c": ["ex/v1.9.1/merge.html#git_reference_symbolic_target-24"] } }, "git_reference_type": { @@ -15285,7 +15362,7 @@ "comments": "

Either direct (GIT_REFERENCE_DIRECT) or symbolic (GIT_REFERENCE_SYMBOLIC)

\n", "group": "reference", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_reference_type-56"] + "general.c": ["ex/v1.9.1/general.html#git_reference_type-72"] } }, "git_reference_name": { @@ -15310,8 +15387,8 @@ "comments": "

See git_reference_symbolic_create() for rules about valid names.

\n", "group": "reference", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_reference_name-17"], - "merge.c": ["ex/v1.8.4/merge.html#git_reference_name-25"] + "checkout.c": ["ex/v1.9.1/checkout.html#git_reference_name-17"], + "merge.c": ["ex/v1.9.1/merge.html#git_reference_name-25"] } }, "git_reference_resolve": { @@ -15434,16 +15511,20 @@ "comments": "

The new reference will be written to disk, overwriting the given reference.

\n", "group": "reference", "examples": { - "merge.c": ["ex/v1.8.4/merge.html#git_reference_set_target-26"] + "merge.c": ["ex/v1.9.1/merge.html#git_reference_set_target-26"] } }, "git_reference_rename": { "type": "function", "file": "git2/refs.h", - "line": 381, - "lineto": 386, + "line": 382, + "lineto": 387, "args": [ - { "name": "new_ref", "type": "git_reference **", "comment": null }, + { + "name": "new_ref", + "type": "git_reference **", + "comment": "The new reference" + }, { "name": "ref", "type": "git_reference *", @@ -15478,8 +15559,8 @@ "git_reference_delete": { "type": "function", "file": "git2/refs.h", - "line": 401, - "lineto": 401, + "line": 402, + "lineto": 402, "args": [ { "name": "ref", @@ -15500,10 +15581,14 @@ "git_reference_remove": { "type": "function", "file": "git2/refs.h", - "line": 412, - "lineto": 412, + "line": 414, + "lineto": 414, "args": [ - { "name": "repo", "type": "git_repository *", "comment": null }, + { + "name": "repo", + "type": "git_repository *", + "comment": "The repository to remove the reference from" + }, { "name": "name", "type": "const char *", @@ -15520,8 +15605,8 @@ "git_reference_list": { "type": "function", "file": "git2/refs.h", - "line": 426, - "lineto": 426, + "line": 428, + "lineto": 428, "args": [ { "name": "array", @@ -15541,14 +15626,14 @@ "comments": "

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().

\n", "group": "reference", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_reference_list-57"] + "general.c": ["ex/v1.9.1/general.html#git_reference_list-73"] } }, "git_reference_foreach": { "type": "function", "file": "git2/refs.h", - "line": 466, - "lineto": 469, + "line": 468, + "lineto": 471, "args": [ { "name": "repo", @@ -15579,8 +15664,8 @@ "git_reference_foreach_name": { "type": "function", "file": "git2/refs.h", - "line": 484, - "lineto": 487, + "line": 486, + "lineto": 489, "args": [ { "name": "repo", @@ -15611,8 +15696,8 @@ "git_reference_dup": { "type": "function", "file": "git2/refs.h", - "line": 498, - "lineto": 498, + "line": 500, + "lineto": 500, "args": [ { "name": "dest", @@ -15635,8 +15720,8 @@ "git_reference_free": { "type": "function", "file": "git2/refs.h", - "line": 505, - "lineto": 505, + "line": 507, + "lineto": 507, "args": [ { "name": "ref", "type": "git_reference *", "comment": "git_reference" } ], @@ -15648,25 +15733,25 @@ "group": "reference", "examples": { "checkout.c": [ - "ex/v1.8.4/checkout.html#git_reference_free-18", - "ex/v1.8.4/checkout.html#git_reference_free-19", - "ex/v1.8.4/checkout.html#git_reference_free-20" + "ex/v1.9.1/checkout.html#git_reference_free-18", + "ex/v1.9.1/checkout.html#git_reference_free-19", + "ex/v1.9.1/checkout.html#git_reference_free-20" ], - "commit.c": ["ex/v1.8.4/commit.html#git_reference_free-7"], - "general.c": ["ex/v1.8.4/general.html#git_reference_free-58"], + "commit.c": ["ex/v1.9.1/commit.html#git_reference_free-7"], + "general.c": ["ex/v1.9.1/general.html#git_reference_free-74"], "merge.c": [ - "ex/v1.8.4/merge.html#git_reference_free-27", - "ex/v1.8.4/merge.html#git_reference_free-28", - "ex/v1.8.4/merge.html#git_reference_free-29" + "ex/v1.9.1/merge.html#git_reference_free-27", + "ex/v1.9.1/merge.html#git_reference_free-28", + "ex/v1.9.1/merge.html#git_reference_free-29" ], - "status.c": ["ex/v1.8.4/status.html#git_reference_free-1"] + "status.c": ["ex/v1.9.1/status.html#git_reference_free-1"] } }, "git_reference_cmp": { "type": "function", "file": "git2/refs.h", - "line": 514, - "lineto": 516, + "line": 516, + "lineto": 518, "args": [ { "name": "ref1", @@ -15692,8 +15777,8 @@ "git_reference_iterator_new": { "type": "function", "file": "git2/refs.h", - "line": 525, - "lineto": 527, + "line": 527, + "lineto": 529, "args": [ { "name": "out", @@ -15716,8 +15801,8 @@ "git_reference_iterator_glob_new": { "type": "function", "file": "git2/refs.h", - "line": 538, - "lineto": 541, + "line": 540, + "lineto": 543, "args": [ { "name": "out", @@ -15745,8 +15830,8 @@ "git_reference_next": { "type": "function", "file": "git2/refs.h", - "line": 550, - "lineto": 550, + "line": 552, + "lineto": 552, "args": [ { "name": "out", @@ -15772,8 +15857,8 @@ "git_reference_next_name": { "type": "function", "file": "git2/refs.h", - "line": 563, - "lineto": 563, + "line": 565, + "lineto": 565, "args": [ { "name": "out", @@ -15799,8 +15884,8 @@ "git_reference_iterator_free": { "type": "function", "file": "git2/refs.h", - "line": 570, - "lineto": 570, + "line": 572, + "lineto": 572, "args": [ { "name": "iter", @@ -15818,8 +15903,8 @@ "git_reference_foreach_glob": { "type": "function", "file": "git2/refs.h", - "line": 590, - "lineto": 594, + "line": 592, + "lineto": 596, "args": [ { "name": "repo", @@ -15855,8 +15940,8 @@ "git_reference_has_log": { "type": "function", "file": "git2/refs.h", - "line": 604, - "lineto": 604, + "line": 606, + "lineto": 606, "args": [ { "name": "repo", @@ -15882,8 +15967,8 @@ "git_reference_ensure_log": { "type": "function", "file": "git2/refs.h", - "line": 616, - "lineto": 616, + "line": 618, + "lineto": 618, "args": [ { "name": "repo", @@ -15906,8 +15991,8 @@ "git_reference_is_branch": { "type": "function", "file": "git2/refs.h", - "line": 626, - "lineto": 626, + "line": 628, + "lineto": 628, "args": [ { "name": "ref", @@ -15928,8 +16013,8 @@ "git_reference_is_remote": { "type": "function", "file": "git2/refs.h", - "line": 636, - "lineto": 636, + "line": 638, + "lineto": 638, "args": [ { "name": "ref", @@ -15947,14 +16032,14 @@ "comments": "", "group": "reference", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_reference_is_remote-21"] + "checkout.c": ["ex/v1.9.1/checkout.html#git_reference_is_remote-21"] } }, "git_reference_is_tag": { "type": "function", "file": "git2/refs.h", - "line": 646, - "lineto": 646, + "line": 648, + "lineto": 648, "args": [ { "name": "ref", @@ -15975,8 +16060,8 @@ "git_reference_is_note": { "type": "function", "file": "git2/refs.h", - "line": 656, - "lineto": 656, + "line": 658, + "lineto": 658, "args": [ { "name": "ref", @@ -15997,8 +16082,8 @@ "git_reference_normalize_name": { "type": "function", "file": "git2/refs.h", - "line": 712, - "lineto": 716, + "line": 714, + "lineto": 718, "args": [ { "name": "buffer_out", @@ -16034,8 +16119,8 @@ "git_reference_peel": { "type": "function", "file": "git2/refs.h", - "line": 733, - "lineto": 736, + "line": 735, + "lineto": 738, "args": [ { "name": "out", @@ -16062,13 +16147,13 @@ "description": "

Recursively peel reference until object of the specified type is found.

\n", "comments": "

The retrieved peeled object is owned by the repository and should be closed with the git_object_free method.

\n\n

If you pass GIT_OBJECT_ANY as the target type, then the object will be peeled until a non-tag object is met.

\n", "group": "reference", - "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_reference_peel-30"] } + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_reference_peel-30"] } }, "git_reference_name_is_valid": { "type": "function", "file": "git2/refs.h", - "line": 753, - "lineto": 753, + "line": 755, + "lineto": 755, "args": [ { "name": "valid", @@ -16091,8 +16176,8 @@ "git_reference_shorthand": { "type": "function", "file": "git2/refs.h", - "line": 767, - "lineto": 767, + "line": 769, + "lineto": 769, "args": [ { "name": "ref", @@ -16110,7 +16195,7 @@ "comments": "

This will transform the reference name into a name "human-readable" version. If no shortname is appropriate, it will return the full name.

\n\n

The memory is owned by the reference and must not be freed.

\n", "group": "reference", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_reference_shorthand-2"] + "status.c": ["ex/v1.9.1/status.html#git_reference_shorthand-2"] } }, "git_refspec_parse": { @@ -16270,7 +16355,7 @@ "comments": "", "group": "refspec" }, - "git_refspec_src_matches": { + "git_refspec_src_matches_negative": { "type": "function", "file": "git2/refspec.h", "line": 88, @@ -16293,11 +16378,11 @@ "type": "int", "comment": " 1 if the refspec matches, 0 otherwise" }, - "description": "

Check if a refspec's source descriptor matches a reference

\n", + "description": "

Check if a refspec's source descriptor matches a negative reference

\n", "comments": "", "group": "refspec" }, - "git_refspec_dst_matches": { + "git_refspec_src_matches": { "type": "function", "file": "git2/refspec.h", "line": 97, @@ -16320,6 +16405,33 @@ "type": "int", "comment": " 1 if the refspec matches, 0 otherwise" }, + "description": "

Check if a refspec's source descriptor matches a reference

\n", + "comments": "", + "group": "refspec" + }, + "git_refspec_dst_matches": { + "type": "function", + "file": "git2/refspec.h", + "line": 106, + "lineto": 106, + "args": [ + { + "name": "refspec", + "type": "const git_refspec *", + "comment": "the refspec" + }, + { + "name": "refname", + "type": "const char *", + "comment": "the name of the reference to check" + } + ], + "argline": "const git_refspec *refspec, const char *refname", + "sig": "const git_refspec *::const char *", + "return": { + "type": "int", + "comment": " 1 if the refspec matches, 0 otherwise" + }, "description": "

Check if a refspec's destination descriptor matches a reference

\n", "comments": "", "group": "refspec" @@ -16327,8 +16439,8 @@ "git_refspec_transform": { "type": "function", "file": "git2/refspec.h", - "line": 107, - "lineto": 107, + "line": 116, + "lineto": 116, "args": [ { "name": "out", @@ -16356,8 +16468,8 @@ "git_refspec_rtransform": { "type": "function", "file": "git2/refspec.h", - "line": 117, - "lineto": 117, + "line": 126, + "lineto": 126, "args": [ { "name": "out", @@ -16380,7 +16492,10 @@ "return": { "type": "int", "comment": " 0, GIT_EBUFS or another error" }, "description": "

Transform a target reference to its source reference following the refspec's rules

\n", "comments": "", - "group": "refspec" + "group": "refspec", + "examples": { + "fetch.c": ["ex/v1.9.1/fetch.html#git_refspec_rtransform-4"] + } }, "git_remote_create": { "type": "function", @@ -16414,13 +16529,13 @@ "description": "

Add a remote with the default fetch refspec to the repository's configuration.

\n", "comments": "", "group": "remote", - "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_create-1"] } + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_create-1"] } }, "git_remote_create_options_init": { "type": "function", "file": "git2/remote.h", - "line": 132, - "lineto": 134, + "line": 135, + "lineto": 137, "args": [ { "name": "opts", @@ -16446,8 +16561,8 @@ "git_remote_create_with_opts": { "type": "function", "file": "git2/remote.h", - "line": 148, - "lineto": 151, + "line": 151, + "lineto": 154, "args": [ { "name": "out", @@ -16478,8 +16593,8 @@ "git_remote_create_with_fetchspec": { "type": "function", "file": "git2/remote.h", - "line": 164, - "lineto": 169, + "line": 167, + "lineto": 172, "args": [ { "name": "out", @@ -16520,8 +16635,8 @@ "git_remote_create_anonymous": { "type": "function", "file": "git2/remote.h", - "line": 182, - "lineto": 185, + "line": 185, + "lineto": 188, "args": [ { "name": "out", @@ -16546,17 +16661,17 @@ "comments": "

Create a remote with the given url in-memory. You can use this when you have a URL instead of a remote's name.

\n", "group": "remote", "examples": { - "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_create_anonymous-4"], + "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_create_anonymous-5"], "ls-remote.c": [ - "ex/v1.8.4/ls-remote.html#git_remote_create_anonymous-2" + "ex/v1.9.1/ls-remote.html#git_remote_create_anonymous-2" ] } }, "git_remote_create_detached": { "type": "function", "file": "git2/remote.h", - "line": 201, - "lineto": 203, + "line": 204, + "lineto": 206, "args": [ { "name": "out", @@ -16579,8 +16694,8 @@ "git_remote_lookup": { "type": "function", "file": "git2/remote.h", - "line": 216, - "lineto": 216, + "line": 219, + "lineto": 219, "args": [ { "name": "out", @@ -16608,17 +16723,17 @@ "comments": "

The name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "remote", "examples": { - "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_lookup-5"], - "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_lookup-3"], - "push.c": ["ex/v1.8.4/push.html#git_remote_lookup-1"], - "remote.c": ["ex/v1.8.4/remote.html#git_remote_lookup-2"] + "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_lookup-6"], + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_lookup-3"], + "push.c": ["ex/v1.9.1/push.html#git_remote_lookup-1"], + "remote.c": ["ex/v1.9.1/remote.html#git_remote_lookup-2"] } }, "git_remote_dup": { "type": "function", "file": "git2/remote.h", - "line": 228, - "lineto": 228, + "line": 231, + "lineto": 231, "args": [ { "name": "dest", @@ -16641,8 +16756,8 @@ "git_remote_owner": { "type": "function", "file": "git2/remote.h", - "line": 236, - "lineto": 236, + "line": 239, + "lineto": 239, "args": [ { "name": "remote", @@ -16663,8 +16778,8 @@ "git_remote_name": { "type": "function", "file": "git2/remote.h", - "line": 244, - "lineto": 244, + "line": 247, + "lineto": 247, "args": [ { "name": "remote", @@ -16685,8 +16800,8 @@ "git_remote_url": { "type": "function", "file": "git2/remote.h", - "line": 256, - "lineto": 256, + "line": 259, + "lineto": 259, "args": [ { "name": "remote", @@ -16698,15 +16813,15 @@ "sig": "const git_remote *", "return": { "type": "const char *", "comment": " a pointer to the url" }, "description": "

Get the remote's url

\n", - "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", + "comments": "

If url.*.insteadOf has been configured for this URL, it will return the modified URL. This function does not consider if a push url has been configured for this remote (use git_remote_pushurl if needed).

\n", "group": "remote", - "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_url-3"] } + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_url-3"] } }, "git_remote_pushurl": { "type": "function", "file": "git2/remote.h", - "line": 268, - "lineto": 268, + "line": 271, + "lineto": 271, "args": [ { "name": "remote", @@ -16723,13 +16838,13 @@ "description": "

Get the remote's url for pushing.

\n", "comments": "

If url.*.pushInsteadOf has been configured for this URL, it will return the modified URL. If git_remote_set_instance_pushurl has been called for this remote, then that URL will be returned.

\n", "group": "remote", - "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_pushurl-4"] } + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_pushurl-4"] } }, "git_remote_set_url": { "type": "function", "file": "git2/remote.h", - "line": 281, - "lineto": 281, + "line": 284, + "lineto": 284, "args": [ { "name": "repo", @@ -16749,13 +16864,13 @@ "description": "

Set the remote's url in the configuration

\n", "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", "group": "remote", - "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_set_url-5"] } + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_set_url-5"] } }, "git_remote_set_pushurl": { "type": "function", "file": "git2/remote.h", - "line": 295, - "lineto": 295, + "line": 298, + "lineto": 298, "args": [ { "name": "repo", @@ -16776,14 +16891,14 @@ "comments": "

Remote objects already in memory will not be affected. This assumes the common case of a single-url remote and will otherwise return an error.

\n", "group": "remote", "examples": { - "remote.c": ["ex/v1.8.4/remote.html#git_remote_set_pushurl-6"] + "remote.c": ["ex/v1.9.1/remote.html#git_remote_set_pushurl-6"] } }, "git_remote_set_instance_url": { "type": "function", "file": "git2/remote.h", - "line": 305, - "lineto": 305, + "line": 308, + "lineto": 308, "args": [ { "name": "remote", @@ -16802,8 +16917,8 @@ "git_remote_set_instance_pushurl": { "type": "function", "file": "git2/remote.h", - "line": 315, - "lineto": 315, + "line": 318, + "lineto": 318, "args": [ { "name": "remote", @@ -16822,8 +16937,8 @@ "git_remote_add_fetch": { "type": "function", "file": "git2/remote.h", - "line": 328, - "lineto": 328, + "line": 331, + "lineto": 331, "args": [ { "name": "repo", @@ -16854,8 +16969,8 @@ "git_remote_get_fetch_refspecs": { "type": "function", "file": "git2/remote.h", - "line": 340, - "lineto": 340, + "line": 343, + "lineto": 343, "args": [ { "name": "array", @@ -16878,8 +16993,8 @@ "git_remote_add_push": { "type": "function", "file": "git2/remote.h", - "line": 353, - "lineto": 353, + "line": 356, + "lineto": 356, "args": [ { "name": "repo", @@ -16910,8 +17025,8 @@ "git_remote_get_push_refspecs": { "type": "function", "file": "git2/remote.h", - "line": 365, - "lineto": 365, + "line": 368, + "lineto": 368, "args": [ { "name": "array", @@ -16934,8 +17049,8 @@ "git_remote_refspec_count": { "type": "function", "file": "git2/remote.h", - "line": 373, - "lineto": 373, + "line": 376, + "lineto": 376, "args": [ { "name": "remote", @@ -16956,8 +17071,8 @@ "git_remote_get_refspec": { "type": "function", "file": "git2/remote.h", - "line": 382, - "lineto": 382, + "line": 385, + "lineto": 385, "args": [ { "name": "remote", @@ -16979,8 +17094,8 @@ "git_remote_ls": { "type": "function", "file": "git2/remote.h", - "line": 404, - "lineto": 404, + "line": 407, + "lineto": 407, "args": [ { "name": "out", @@ -17001,14 +17116,14 @@ "comments": "

Get the list of references with which the server responds to a new connection.

\n\n

The remote (or more exactly its transport) must have connected to the remote repository. This list is available as soon as the connection to the remote is initiated and it remains available after disconnecting.

\n\n

The memory belongs to the remote. The pointer will be valid as long as a new connection is not initiated, but it is recommended that you make a copy in order to make use of the data.

\n", "group": "remote", "examples": { - "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_ls-4"] + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_ls-4"] } }, "git_remote_connected": { "type": "function", "file": "git2/remote.h", - "line": 415, - "lineto": 415, + "line": 418, + "lineto": 418, "args": [ { "name": "remote", @@ -17029,8 +17144,8 @@ "git_remote_stop": { "type": "function", "file": "git2/remote.h", - "line": 426, - "lineto": 426, + "line": 429, + "lineto": 429, "args": [ { "name": "remote", "type": "git_remote *", "comment": "the remote" } ], @@ -17044,8 +17159,8 @@ "git_remote_disconnect": { "type": "function", "file": "git2/remote.h", - "line": 436, - "lineto": 436, + "line": 439, + "lineto": 439, "args": [ { "name": "remote", @@ -17063,8 +17178,8 @@ "git_remote_free": { "type": "function", "file": "git2/remote.h", - "line": 446, - "lineto": 446, + "line": 449, + "lineto": 449, "args": [ { "name": "remote", @@ -17080,18 +17195,18 @@ "group": "remote", "examples": { "fetch.c": [ - "ex/v1.8.4/fetch.html#git_remote_free-6", - "ex/v1.8.4/fetch.html#git_remote_free-7" + "ex/v1.9.1/fetch.html#git_remote_free-7", + "ex/v1.9.1/fetch.html#git_remote_free-8" ], - "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_free-5"], - "remote.c": ["ex/v1.8.4/remote.html#git_remote_free-7"] + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_free-5"], + "remote.c": ["ex/v1.9.1/remote.html#git_remote_free-7"] } }, "git_remote_list": { "type": "function", "file": "git2/remote.h", - "line": 457, - "lineto": 457, + "line": 460, + "lineto": 460, "args": [ { "name": "out", @@ -17111,15 +17226,15 @@ "comments": "

The string array must be freed by the user.

\n", "group": "remote", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_remote_list-22"], - "remote.c": ["ex/v1.8.4/remote.html#git_remote_list-8"] + "checkout.c": ["ex/v1.9.1/checkout.html#git_remote_list-22"], + "remote.c": ["ex/v1.9.1/remote.html#git_remote_list-8"] } }, "git_remote_init_callbacks": { "type": "function", "file": "git2/remote.h", - "line": 671, - "lineto": 673, + "line": 714, + "lineto": 716, "args": [ { "name": "opts", @@ -17142,14 +17257,14 @@ "comments": "", "group": "remote", "examples": { - "push.c": ["ex/v1.8.4/push.html#git_remote_init_callbacks-2"] + "push.c": ["ex/v1.9.1/push.html#git_remote_init_callbacks-2"] } }, "git_fetch_options_init": { "type": "function", "file": "git2/remote.h", - "line": 806, - "lineto": 808, + "line": 852, + "lineto": 854, "args": [ { "name": "opts", @@ -17175,8 +17290,8 @@ "git_push_options_init": { "type": "function", "file": "git2/remote.h", - "line": 868, - "lineto": 870, + "line": 917, + "lineto": 919, "args": [ { "name": "opts", @@ -17198,13 +17313,13 @@ "description": "

Initialize git_push_options structure

\n", "comments": "

Initializes a git_push_options with default values. Equivalent to creating an instance with GIT_PUSH_OPTIONS_INIT.

\n", "group": "push", - "examples": { "push.c": ["ex/v1.8.4/push.html#git_push_options_init-3"] } + "examples": { "push.c": ["ex/v1.9.1/push.html#git_push_options_init-3"] } }, "git_remote_connect_options_init": { "type": "function", "file": "git2/remote.h", - "line": 916, - "lineto": 918, + "line": 968, + "lineto": 970, "args": [ { "name": "opts", @@ -17230,8 +17345,8 @@ "git_remote_connect": { "type": "function", "file": "git2/remote.h", - "line": 935, - "lineto": 940, + "line": 987, + "lineto": 992, "args": [ { "name": "remote", @@ -17266,14 +17381,14 @@ "comments": "

The transport is selected based on the URL; the direction argument is due to a limitation of the git protocol which starts up a specific binary which can only do the one or the other.

\n", "group": "remote", "examples": { - "ls-remote.c": ["ex/v1.8.4/ls-remote.html#git_remote_connect-6"] + "ls-remote.c": ["ex/v1.9.1/ls-remote.html#git_remote_connect-6"] } }, "git_remote_connect_ext": { "type": "function", "file": "git2/remote.h", - "line": 960, - "lineto": 963, + "line": 1012, + "lineto": 1015, "args": [ { "name": "remote", @@ -17301,8 +17416,8 @@ "git_remote_download": { "type": "function", "file": "git2/remote.h", - "line": 985, - "lineto": 988, + "line": 1037, + "lineto": 1040, "args": [ { "name": "remote", "type": "git_remote *", "comment": "the remote" }, { @@ -17326,8 +17441,8 @@ "git_remote_upload": { "type": "function", "file": "git2/remote.h", - "line": 1007, - "lineto": 1010, + "line": 1059, + "lineto": 1062, "args": [ { "name": "remote", "type": "git_remote *", "comment": "the remote" }, { @@ -17351,8 +17466,8 @@ "git_remote_update_tips": { "type": "function", "file": "git2/remote.h", - "line": 1029, - "lineto": 1034, + "line": 1081, + "lineto": 1086, "args": [ { "name": "remote", @@ -17390,8 +17505,8 @@ "git_remote_fetch": { "type": "function", "file": "git2/remote.h", - "line": 1054, - "lineto": 1058, + "line": 1106, + "lineto": 1110, "args": [ { "name": "remote", @@ -17420,13 +17535,13 @@ "description": "

Download new data and update tips.

\n", "comments": "

Convenience function to connect to a remote, download the data, disconnect and update the remote-tracking branches.

\n\n

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", "group": "remote", - "examples": { "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_fetch-8"] } + "examples": { "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_fetch-9"] } }, "git_remote_prune": { "type": "function", "file": "git2/remote.h", - "line": 1070, - "lineto": 1072, + "line": 1122, + "lineto": 1124, "args": [ { "name": "remote", @@ -17449,8 +17564,8 @@ "git_remote_push": { "type": "function", "file": "git2/remote.h", - "line": 1087, - "lineto": 1090, + "line": 1139, + "lineto": 1142, "args": [ { "name": "remote", @@ -17474,27 +17589,36 @@ "description": "

Perform a push.

\n", "comments": "

If options are specified and this remote is already connected then the existing remote connection options will be discarded and the remote will now use the new options.

\n", "group": "remote", - "examples": { "push.c": ["ex/v1.8.4/push.html#git_remote_push-4"] } + "examples": { "push.c": ["ex/v1.9.1/push.html#git_remote_push-4"] } }, "git_remote_stats": { "type": "function", "file": "git2/remote.h", - "line": 1095, - "lineto": 1095, - "args": [{ "name": "remote", "type": "git_remote *", "comment": null }], + "line": 1150, + "lineto": 1150, + "args": [ + { + "name": "remote", + "type": "git_remote *", + "comment": "the remote to get statistics for" + } + ], "argline": "git_remote *remote", "sig": "git_remote *", - "return": { "type": "const git_indexer_progress *", "comment": null }, + "return": { + "type": "const git_indexer_progress *", + "comment": " the git_indexer_progress for the remote" + }, "description": "

Get the statistics structure that is filled in by the fetch operation.

\n", "comments": "", "group": "remote", - "examples": { "fetch.c": ["ex/v1.8.4/fetch.html#git_remote_stats-9"] } + "examples": { "fetch.c": ["ex/v1.9.1/fetch.html#git_remote_stats-10"] } }, "git_remote_autotag": { "type": "function", "file": "git2/remote.h", - "line": 1103, - "lineto": 1103, + "line": 1158, + "lineto": 1158, "args": [ { "name": "remote", @@ -17515,8 +17639,8 @@ "git_remote_set_autotag": { "type": "function", "file": "git2/remote.h", - "line": 1116, - "lineto": 1116, + "line": 1171, + "lineto": 1171, "args": [ { "name": "repo", @@ -17544,8 +17668,8 @@ "git_remote_prune_refs": { "type": "function", "file": "git2/remote.h", - "line": 1124, - "lineto": 1124, + "line": 1179, + "lineto": 1179, "args": [ { "name": "remote", @@ -17563,8 +17687,8 @@ "git_remote_rename": { "type": "function", "file": "git2/remote.h", - "line": 1146, - "lineto": 1150, + "line": 1201, + "lineto": 1205, "args": [ { "name": "problems", @@ -17596,13 +17720,13 @@ "description": "

Give the remote a new name

\n", "comments": "

All remote-tracking branches and configuration settings for the remote are updated.

\n\n

The new name will be checked for validity. See git_tag_create() for rules about valid names.

\n\n

No loaded instances of a the remote with the old name will change their name or their list of refspecs.

\n", "group": "remote", - "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_rename-9"] } + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_rename-9"] } }, "git_remote_name_is_valid": { "type": "function", "file": "git2/remote.h", - "line": 1159, - "lineto": 1159, + "line": 1214, + "lineto": 1214, "args": [ { "name": "valid", @@ -17625,8 +17749,8 @@ "git_remote_delete": { "type": "function", "file": "git2/remote.h", - "line": 1171, - "lineto": 1171, + "line": 1226, + "lineto": 1226, "args": [ { "name": "repo", @@ -17648,13 +17772,13 @@ "description": "

Delete an existing persisted remote.

\n", "comments": "

All remote-tracking branches and configuration settings for the remote will be removed.

\n", "group": "remote", - "examples": { "remote.c": ["ex/v1.8.4/remote.html#git_remote_delete-10"] } + "examples": { "remote.c": ["ex/v1.9.1/remote.html#git_remote_delete-10"] } }, "git_remote_default_branch": { "type": "function", "file": "git2/remote.h", - "line": 1189, - "lineto": 1189, + "line": 1244, + "lineto": 1244, "args": [ { "name": "out", @@ -17676,8 +17800,8 @@ "git_repository_open": { "type": "function", "file": "git2/repository.h", - "line": 38, - "lineto": 38, + "line": 43, + "lineto": 43, "args": [ { "name": "out", @@ -17694,17 +17818,17 @@ "sig": "git_repository **::const char *", "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Open a git repository.

\n", - "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n", + "comments": "

The 'path' argument must point to either a git repository folder, or an existing work dir.

\n\n

The method will automatically detect if 'path' is a normal or bare repository or fail is 'path' is neither.

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", "group": "repository", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_repository_open-59"] + "general.c": ["ex/v1.9.1/general.html#git_repository_open-75"] } }, "git_repository_open_from_worktree": { "type": "function", "file": "git2/repository.h", - "line": 49, - "lineto": 49, + "line": 54, + "lineto": 54, "args": [ { "name": "out", @@ -17724,11 +17848,35 @@ "comments": "

Open the working directory of the working tree as a normal repository that can then be worked on.

\n", "group": "repository" }, + "git_repository_wrap_odb": { + "type": "function", + "file": "git2/repository.h", + "line": 67, + "lineto": 69, + "args": [ + { + "name": "out", + "type": "git_repository **", + "comment": "pointer to the repo" + }, + { + "name": "odb", + "type": "git_odb *", + "comment": "the object database to wrap" + } + ], + "argline": "git_repository **out, git_odb *odb", + "sig": "git_repository **::git_odb *", + "return": { "type": "int", "comment": " 0 or an error code" }, + "description": "

Create a "fake" repository to wrap an object database

\n", + "comments": "

Create a repository object to wrap an object database to be used with the API when all you have is an object database. This doesn't have any paths associated with it, so use with care.

\n", + "group": "repository" + }, "git_repository_discover": { "type": "function", "file": "git2/repository.h", - "line": 100, - "lineto": 104, + "line": 101, + "lineto": 105, "args": [ { "name": "out", @@ -17755,14 +17903,14 @@ "sig": "git_buf *::const char *::int::const char *", "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Look for a git repository and copy its path in the given buffer.\n The lookup start from base_path and walk across parent directories\n if nothing has been found. The lookup ends when the first repository\n is found, or when reaching a directory referenced in ceiling_dirs\n or when the filesystem changes (in case across_fs is true).

\n", - "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n", + "comments": "

The method will automatically detect if the repository is bare (if there is a repository).

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", "group": "repository" }, "git_repository_open_ext": { "type": "function", "file": "git2/repository.h", - "line": 176, - "lineto": 180, + "line": 181, + "lineto": 185, "args": [ { "name": "out", @@ -17792,15 +17940,15 @@ "comment": " 0 on success, GIT_ENOTFOUND if no repository could be found,\n or -1 if there was a repository but open failed for some reason\n (such as repo corruption or system errors)." }, "description": "

Find and open a repository with extended controls.

\n", - "comments": "", + "comments": "

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", "group": "repository", - "examples": { "log.c": ["ex/v1.8.4/log.html#git_repository_open_ext-43"] } + "examples": { "log.c": ["ex/v1.9.1/log.html#git_repository_open_ext-43"] } }, "git_repository_open_bare": { "type": "function", "file": "git2/repository.h", - "line": 193, - "lineto": 193, + "line": 202, + "lineto": 202, "args": [ { "name": "out", @@ -17817,14 +17965,14 @@ "sig": "git_repository **::const char *", "return": { "type": "int", "comment": " 0 on success, or an error code" }, "description": "

Open a bare repository on the serverside.

\n", - "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n", + "comments": "

This is a fast open for bare repositories that will come in handy if you're e.g. hosting git repositories and need to access them efficiently

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", "group": "repository" }, "git_repository_free": { "type": "function", "file": "git2/repository.h", - "line": 206, - "lineto": 206, + "line": 215, + "lineto": 215, "args": [ { "name": "repo", @@ -17839,15 +17987,15 @@ "comments": "

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_free, but accessing any of the attributes of an object without a backing repository will result in undefined behavior

\n", "group": "repository", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_repository_free-60"], - "init.c": ["ex/v1.8.4/init.html#git_repository_free-4"] + "general.c": ["ex/v1.9.1/general.html#git_repository_free-76"], + "init.c": ["ex/v1.9.1/init.html#git_repository_free-4"] } }, "git_repository_init": { "type": "function", "file": "git2/repository.h", - "line": 223, - "lineto": 226, + "line": 236, + "lineto": 239, "args": [ { "name": "out", @@ -17869,15 +18017,15 @@ "sig": "git_repository **::const char *::unsigned int", "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Creates a new Git repository in the given folder.

\n", - "comments": "

TODO: - Reinit the repository

\n", + "comments": "

TODO: - Reinit the repository

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", "group": "repository", - "examples": { "init.c": ["ex/v1.8.4/init.html#git_repository_init-5"] } + "examples": { "init.c": ["ex/v1.9.1/init.html#git_repository_init-5"] } }, "git_repository_init_options_init": { "type": "function", "file": "git2/repository.h", - "line": 389, - "lineto": 391, + "line": 405, + "lineto": 407, "args": [ { "name": "opts", @@ -17903,8 +18051,8 @@ "git_repository_init_ext": { "type": "function", "file": "git2/repository.h", - "line": 406, - "lineto": 409, + "line": 426, + "lineto": 429, "args": [ { "name": "out", @@ -17926,17 +18074,17 @@ "sig": "git_repository **::const char *::git_repository_init_options *", "return": { "type": "int", "comment": " 0 or an error code on failure." }, "description": "

Create a new Git repository in the given folder with extended controls.

\n", - "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n", + "comments": "

This will initialize a new git repository (creating the repo_path if requested by flags) and working directory as needed. It will auto-detect the case sensitivity of the file system and if the file system supports file mode bits correctly.

\n\n

Note that the libgit2 library must be initialized using git_libgit2_init before any APIs can be called, including this one.

\n", "group": "repository", "examples": { - "init.c": ["ex/v1.8.4/init.html#git_repository_init_ext-6"] + "init.c": ["ex/v1.9.1/init.html#git_repository_init_ext-6"] } }, "git_repository_head": { "type": "function", "file": "git2/repository.h", - "line": 424, - "lineto": 424, + "line": 444, + "lineto": 444, "args": [ { "name": "out", @@ -17960,17 +18108,17 @@ "group": "repository", "examples": { "merge.c": [ - "ex/v1.8.4/merge.html#git_repository_head-31", - "ex/v1.8.4/merge.html#git_repository_head-32" + "ex/v1.9.1/merge.html#git_repository_head-31", + "ex/v1.9.1/merge.html#git_repository_head-32" ], - "status.c": ["ex/v1.8.4/status.html#git_repository_head-3"] + "status.c": ["ex/v1.9.1/status.html#git_repository_head-3"] } }, "git_repository_head_for_worktree": { "type": "function", "file": "git2/repository.h", - "line": 434, - "lineto": 435, + "line": 454, + "lineto": 455, "args": [ { "name": "out", @@ -18001,8 +18149,8 @@ "git_repository_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 447, - "lineto": 447, + "line": 467, + "lineto": 467, "args": [ { "name": "repo", @@ -18023,8 +18171,8 @@ "git_repository_head_detached_for_worktree": { "type": "function", "file": "git2/repository.h", - "line": 460, - "lineto": 461, + "line": 480, + "lineto": 481, "args": [ { "name": "repo", @@ -18050,8 +18198,8 @@ "git_repository_head_unborn": { "type": "function", "file": "git2/repository.h", - "line": 473, - "lineto": 473, + "line": 493, + "lineto": 493, "args": [ { "name": "repo", @@ -18072,8 +18220,8 @@ "git_repository_is_empty": { "type": "function", "file": "git2/repository.h", - "line": 487, - "lineto": 487, + "line": 507, + "lineto": 507, "args": [ { "name": "repo", @@ -18094,8 +18242,8 @@ "git_repository_item_path": { "type": "function", "file": "git2/repository.h", - "line": 525, - "lineto": 525, + "line": 545, + "lineto": 545, "args": [ { "name": "out", @@ -18126,8 +18274,8 @@ "git_repository_path": { "type": "function", "file": "git2/repository.h", - "line": 536, - "lineto": 536, + "line": 556, + "lineto": 556, "args": [ { "name": "repo", @@ -18145,15 +18293,15 @@ "comments": "

This is the path of the .git folder for normal repositories, or of the repository itself for bare repositories.

\n", "group": "repository", "examples": { - "init.c": ["ex/v1.8.4/init.html#git_repository_path-7"], - "status.c": ["ex/v1.8.4/status.html#git_repository_path-4"] + "init.c": ["ex/v1.9.1/init.html#git_repository_path-7"], + "status.c": ["ex/v1.9.1/status.html#git_repository_path-4"] } }, "git_repository_workdir": { "type": "function", "file": "git2/repository.h", - "line": 547, - "lineto": 547, + "line": 567, + "lineto": 567, "args": [ { "name": "repo", @@ -18170,13 +18318,13 @@ "description": "

Get the path of the working directory for this repository

\n", "comments": "

If the repository is bare, this function will always return NULL.

\n", "group": "repository", - "examples": { "init.c": ["ex/v1.8.4/init.html#git_repository_workdir-8"] } + "examples": { "init.c": ["ex/v1.9.1/init.html#git_repository_workdir-8"] } }, "git_repository_commondir": { "type": "function", "file": "git2/repository.h", - "line": 559, - "lineto": 559, + "line": 579, + "lineto": 579, "args": [ { "name": "repo", @@ -18197,8 +18345,8 @@ "git_repository_set_workdir": { "type": "function", "file": "git2/repository.h", - "line": 578, - "lineto": 579, + "line": 598, + "lineto": 599, "args": [ { "name": "repo", @@ -18226,8 +18374,8 @@ "git_repository_is_bare": { "type": "function", "file": "git2/repository.h", - "line": 587, - "lineto": 587, + "line": 607, + "lineto": 607, "args": [ { "name": "repo", @@ -18245,14 +18393,14 @@ "comments": "", "group": "repository", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_repository_is_bare-5"] + "status.c": ["ex/v1.9.1/status.html#git_repository_is_bare-5"] } }, "git_repository_is_worktree": { "type": "function", "file": "git2/repository.h", - "line": 595, - "lineto": 595, + "line": 615, + "lineto": 615, "args": [ { "name": "repo", @@ -18273,8 +18421,8 @@ "git_repository_config": { "type": "function", "file": "git2/repository.h", - "line": 611, - "lineto": 611, + "line": 631, + "lineto": 631, "args": [ { "name": "out", @@ -18294,14 +18442,14 @@ "comments": "

If a configuration file has not been set, the default config set for the repository will be returned, including global and system configurations (if they are available).

\n\n

The configuration file must be freed once it's no longer being used by the user.

\n", "group": "repository", "examples": { - "config.c": ["ex/v1.8.4/config.html#git_repository_config-9"] + "config.c": ["ex/v1.9.1/config.html#git_repository_config-9"] } }, "git_repository_config_snapshot": { "type": "function", "file": "git2/repository.h", - "line": 627, - "lineto": 627, + "line": 647, + "lineto": 647, "args": [ { "name": "out", @@ -18322,16 +18470,16 @@ "group": "repository", "examples": { "general.c": [ - "ex/v1.8.4/general.html#git_repository_config_snapshot-61", - "ex/v1.8.4/general.html#git_repository_config_snapshot-62" + "ex/v1.9.1/general.html#git_repository_config_snapshot-77", + "ex/v1.9.1/general.html#git_repository_config_snapshot-78" ] } }, "git_repository_odb": { "type": "function", "file": "git2/repository.h", - "line": 643, - "lineto": 643, + "line": 663, + "lineto": 663, "args": [ { "name": "out", @@ -18351,15 +18499,15 @@ "comments": "

If a custom ODB has not been set, the default database for the repository will be returned (the one located in .git/objects).

\n\n

The ODB must be freed once it's no longer being used by the user.

\n", "group": "repository", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_repository_odb-29"], - "general.c": ["ex/v1.8.4/general.html#git_repository_odb-63"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_repository_odb-29"], + "general.c": ["ex/v1.9.1/general.html#git_repository_odb-79"] } }, "git_repository_refdb": { "type": "function", "file": "git2/repository.h", - "line": 659, - "lineto": 659, + "line": 679, + "lineto": 679, "args": [ { "name": "out", @@ -18382,8 +18530,8 @@ "git_repository_index": { "type": "function", "file": "git2/repository.h", - "line": 675, - "lineto": 675, + "line": 695, + "lineto": 695, "args": [ { "name": "out", @@ -18403,19 +18551,19 @@ "comments": "

If a custom index has not been set, the default index for the repository will be returned (the one located in .git/index).

\n\n

The index must be freed once it's no longer being used by the user.

\n", "group": "repository", "examples": { - "add.c": ["ex/v1.8.4/add.html#git_repository_index-5"], - "commit.c": ["ex/v1.8.4/commit.html#git_repository_index-8"], - "general.c": ["ex/v1.8.4/general.html#git_repository_index-64"], - "init.c": ["ex/v1.8.4/init.html#git_repository_index-9"], - "ls-files.c": ["ex/v1.8.4/ls-files.html#git_repository_index-5"], - "merge.c": ["ex/v1.8.4/merge.html#git_repository_index-33"] + "add.c": ["ex/v1.9.1/add.html#git_repository_index-5"], + "commit.c": ["ex/v1.9.1/commit.html#git_repository_index-8"], + "general.c": ["ex/v1.9.1/general.html#git_repository_index-80"], + "init.c": ["ex/v1.9.1/init.html#git_repository_index-9"], + "ls-files.c": ["ex/v1.9.1/ls-files.html#git_repository_index-5"], + "merge.c": ["ex/v1.9.1/merge.html#git_repository_index-33"] } }, "git_repository_message": { "type": "function", "file": "git2/repository.h", - "line": 693, - "lineto": 693, + "line": 713, + "lineto": 713, "args": [ { "name": "out", @@ -18441,8 +18589,8 @@ "git_repository_message_remove": { "type": "function", "file": "git2/repository.h", - "line": 703, - "lineto": 703, + "line": 723, + "lineto": 723, "args": [ { "name": "repo", @@ -18460,8 +18608,8 @@ "git_repository_state_cleanup": { "type": "function", "file": "git2/repository.h", - "line": 712, - "lineto": 712, + "line": 732, + "lineto": 732, "args": [ { "name": "repo", @@ -18476,14 +18624,14 @@ "comments": "", "group": "repository", "examples": { - "merge.c": ["ex/v1.8.4/merge.html#git_repository_state_cleanup-34"] + "merge.c": ["ex/v1.9.1/merge.html#git_repository_state_cleanup-34"] } }, "git_repository_fetchhead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 743, - "lineto": 746, + "line": 763, + "lineto": 766, "args": [ { "name": "repo", @@ -18514,8 +18662,8 @@ "git_repository_mergehead_foreach": { "type": "function", "file": "git2/repository.h", - "line": 772, - "lineto": 775, + "line": 792, + "lineto": 795, "args": [ { "name": "repo", @@ -18546,8 +18694,8 @@ "git_repository_hashfile": { "type": "function", "file": "git2/repository.h", - "line": 802, - "lineto": 807, + "line": 822, + "lineto": 827, "args": [ { "name": "out", @@ -18585,8 +18733,8 @@ "git_repository_set_head": { "type": "function", "file": "git2/repository.h", - "line": 827, - "lineto": 829, + "line": 847, + "lineto": 849, "args": [ { "name": "repo", @@ -18606,14 +18754,14 @@ "comments": "

If the provided reference points to a Tree or a Blob, the HEAD is unaltered and -1 is returned.

\n\n

If the provided reference points to a branch, the HEAD will point to that branch, staying attached, or become attached if it isn't yet. If the branch doesn't exist yet, no error will be return. The HEAD will then be attached to an unborn branch.

\n\n

Otherwise, the HEAD will be detached and will directly point to the Commit.

\n", "group": "repository", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_repository_set_head-23"] + "checkout.c": ["ex/v1.9.1/checkout.html#git_repository_set_head-23"] } }, "git_repository_set_head_detached": { "type": "function", "file": "git2/repository.h", - "line": 847, - "lineto": 849, + "line": 867, + "lineto": 869, "args": [ { "name": "repo", @@ -18636,33 +18784,37 @@ "git_repository_set_head_detached_from_annotated": { "type": "function", "file": "git2/repository.h", - "line": 863, - "lineto": 865, + "line": 885, + "lineto": 887, "args": [ - { "name": "repo", "type": "git_repository *", "comment": null }, + { + "name": "repo", + "type": "git_repository *", + "comment": "Repository pointer" + }, { "name": "committish", "type": "const git_annotated_commit *", - "comment": null + "comment": "annotated commit to point HEAD to" } ], "argline": "git_repository *repo, const git_annotated_commit *committish", "sig": "git_repository *::const git_annotated_commit *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 on success, or an error code" }, "description": "

Make the repository HEAD directly point to the Commit.

\n", "comments": "

This behaves like git_repository_set_head_detached() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_repository_set_head_detached().

\n", "group": "repository", "examples": { "checkout.c": [ - "ex/v1.8.4/checkout.html#git_repository_set_head_detached_from_annotated-24" + "ex/v1.9.1/checkout.html#git_repository_set_head_detached_from_annotated-24" ] } }, "git_repository_detach_head": { "type": "function", "file": "git2/repository.h", - "line": 884, - "lineto": 885, + "line": 906, + "lineto": 907, "args": [ { "name": "repo", @@ -18683,8 +18835,8 @@ "git_repository_state": { "type": "function", "file": "git2/repository.h", - "line": 915, - "lineto": 915, + "line": 937, + "lineto": 937, "args": [ { "name": "repo", @@ -18699,15 +18851,15 @@ "comments": "", "group": "repository", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_repository_state-25"], - "merge.c": ["ex/v1.8.4/merge.html#git_repository_state-35"] + "checkout.c": ["ex/v1.9.1/checkout.html#git_repository_state-25"], + "merge.c": ["ex/v1.9.1/merge.html#git_repository_state-35"] } }, "git_repository_set_namespace": { "type": "function", "file": "git2/repository.h", - "line": 929, - "lineto": 929, + "line": 951, + "lineto": 951, "args": [ { "name": "repo", "type": "git_repository *", "comment": "The repo" }, { @@ -18726,8 +18878,8 @@ "git_repository_get_namespace": { "type": "function", "file": "git2/repository.h", - "line": 937, - "lineto": 937, + "line": 959, + "lineto": 959, "args": [ { "name": "repo", "type": "git_repository *", "comment": "The repo" } ], @@ -18744,8 +18896,8 @@ "git_repository_is_shallow": { "type": "function", "file": "git2/repository.h", - "line": 946, - "lineto": 946, + "line": 968, + "lineto": 968, "args": [ { "name": "repo", @@ -18763,8 +18915,8 @@ "git_repository_ident": { "type": "function", "file": "git2/repository.h", - "line": 959, - "lineto": 959, + "line": 981, + "lineto": 981, "args": [ { "name": "name", @@ -18792,8 +18944,8 @@ "git_repository_set_ident": { "type": "function", "file": "git2/repository.h", - "line": 973, - "lineto": 973, + "line": 995, + "lineto": 995, "args": [ { "name": "repo", @@ -18821,8 +18973,8 @@ "git_repository_oid_type": { "type": "function", "file": "git2/repository.h", - "line": 981, - "lineto": 981, + "line": 1003, + "lineto": 1003, "args": [ { "name": "repo", @@ -18840,8 +18992,8 @@ "git_repository_commit_parents": { "type": "function", "file": "git2/repository.h", - "line": 992, - "lineto": 992, + "line": 1014, + "lineto": 1014, "args": [ { "name": "commits", @@ -18898,25 +19050,33 @@ "git_reset_from_annotated": { "type": "function", "file": "git2/reset.h", - "line": 80, - "lineto": 84, + "line": 92, + "lineto": 96, "args": [ - { "name": "repo", "type": "git_repository *", "comment": null }, { - "name": "commit", + "name": "repo", + "type": "git_repository *", + "comment": "Repository where to perform the reset operation." + }, + { + "name": "target", "type": "const git_annotated_commit *", - "comment": null + "comment": "Annotated commit to which the Head should be moved to.\n This object must belong to the given `repo`, it will be dereferenced\n to a git_commit which oid will be used as the target of the branch." + }, + { + "name": "reset_type", + "type": "git_reset_t", + "comment": "Kind of reset operation to perform." }, - { "name": "reset_type", "type": "git_reset_t", "comment": null }, { "name": "checkout_opts", "type": "const git_checkout_options *", - "comment": null + "comment": "Optional checkout options to be used for a HARD reset.\n The checkout_strategy field will be overridden (based on reset_type).\n This parameter can be used to propagate notify and progress callbacks." } ], - "argline": "git_repository *repo, const git_annotated_commit *commit, git_reset_t reset_type, const git_checkout_options *checkout_opts", + "argline": "git_repository *repo, const git_annotated_commit *target, git_reset_t reset_type, const git_checkout_options *checkout_opts", "sig": "git_repository *::const git_annotated_commit *::git_reset_t::const git_checkout_options *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 on success or an error code" }, "description": "

Sets the current head to the specified commit oid and optionally\n resets the index and working tree to match.

\n", "comments": "

This behaves like git_reset() but takes an annotated commit, which lets you specify which extended sha syntax string was specified by a user, allowing for more exact reflog messages.

\n\n

See the documentation for git_reset().

\n", "group": "reset" @@ -18924,8 +19084,8 @@ "git_reset_default": { "type": "function", "file": "git2/reset.h", - "line": 104, - "lineto": 107, + "line": 116, + "lineto": 119, "args": [ { "name": "repo", @@ -18956,8 +19116,8 @@ "git_revert_options_init": { "type": "function", "file": "git2/revert.h", - "line": 49, - "lineto": 51, + "line": 54, + "lineto": 56, "args": [ { "name": "opts", @@ -18983,8 +19143,8 @@ "git_revert_commit": { "type": "function", "file": "git2/revert.h", - "line": 67, - "lineto": 73, + "line": 72, + "lineto": 78, "args": [ { "name": "out", @@ -19030,8 +19190,8 @@ "git_revert": { "type": "function", "file": "git2/revert.h", - "line": 83, - "lineto": 86, + "line": 88, + "lineto": 91, "args": [ { "name": "repo", @@ -19091,15 +19251,15 @@ "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

The returned object should be released with git_object_free when no longer needed.

\n", "group": "revparse", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_revparse_single-22"], - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_revparse_single-30"], - "describe.c": ["ex/v1.8.4/describe.html#git_revparse_single-6"], - "log.c": ["ex/v1.8.4/log.html#git_revparse_single-44"], + "blame.c": ["ex/v1.9.1/blame.html#git_revparse_single-21"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_revparse_single-30"], + "describe.c": ["ex/v1.9.1/describe.html#git_revparse_single-6"], + "log.c": ["ex/v1.9.1/log.html#git_revparse_single-44"], "tag.c": [ - "ex/v1.8.4/tag.html#git_revparse_single-9", - "ex/v1.8.4/tag.html#git_revparse_single-10", - "ex/v1.8.4/tag.html#git_revparse_single-11", - "ex/v1.8.4/tag.html#git_revparse_single-12" + "ex/v1.9.1/tag.html#git_revparse_single-9", + "ex/v1.9.1/tag.html#git_revparse_single-10", + "ex/v1.9.1/tag.html#git_revparse_single-11", + "ex/v1.9.1/tag.html#git_revparse_single-12" ] } }, @@ -19139,7 +19299,7 @@ "description": "

Find a single object and intermediate reference by a revision string.

\n", "comments": "

See man gitrevisions, or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n\n

In some cases (@{<-n>} or <branchname>@{upstream}), the expression may point to an intermediate reference. When such expressions are being passed in, reference_out will be valued as well.

\n\n

The returned object should be released with git_object_free and the returned reference with git_reference_free when no longer needed.

\n", "group": "revparse", - "examples": { "commit.c": ["ex/v1.8.4/commit.html#git_revparse_ext-9"] } + "examples": { "commit.c": ["ex/v1.9.1/commit.html#git_revparse_ext-9"] } }, "git_revparse": { "type": "function", @@ -19173,11 +19333,11 @@ "comments": "

See man gitrevisions or http://git-scm.com/docs/git-rev-parse.html#_specifying_revisions for information on the syntax accepted.

\n", "group": "revparse", "examples": { - "blame.c": ["ex/v1.8.4/blame.html#git_revparse-23"], - "log.c": ["ex/v1.8.4/log.html#git_revparse-45"], + "blame.c": ["ex/v1.9.1/blame.html#git_revparse-22"], + "log.c": ["ex/v1.9.1/log.html#git_revparse-45"], "rev-parse.c": [ - "ex/v1.8.4/rev-parse.html#git_revparse-14", - "ex/v1.8.4/rev-parse.html#git_revparse-15" + "ex/v1.9.1/rev-parse.html#git_revparse-14", + "ex/v1.9.1/rev-parse.html#git_revparse-15" ] } }, @@ -19205,10 +19365,10 @@ "comments": "

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

\n\n

For maximum performance, this revision walker should be reused for different walks.

\n\n

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.

\n", "group": "revwalk", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_revwalk_new-65"], + "general.c": ["ex/v1.9.1/general.html#git_revwalk_new-81"], "log.c": [ - "ex/v1.8.4/log.html#git_revwalk_new-46", - "ex/v1.8.4/log.html#git_revwalk_new-47" + "ex/v1.9.1/log.html#git_revwalk_new-46", + "ex/v1.9.1/log.html#git_revwalk_new-47" ] } }, @@ -19255,8 +19415,8 @@ "comments": "

The pushed commit will be marked as one of the roots from which to start the walk. This commit may not be walked if it or a child is hidden.

\n\n

At least one commit must be pushed onto the walker before a walk can be started.

\n\n

The given id must belong to a committish on the walked repository.

\n", "group": "revwalk", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_revwalk_push-66"], - "log.c": ["ex/v1.8.4/log.html#git_revwalk_push-48"] + "general.c": ["ex/v1.9.1/general.html#git_revwalk_push-82"], + "log.c": ["ex/v1.9.1/log.html#git_revwalk_push-48"] } }, "git_revwalk_push_glob": { @@ -19301,7 +19461,7 @@ "description": "

Push the repository's HEAD

\n", "comments": "", "group": "revwalk", - "examples": { "log.c": ["ex/v1.8.4/log.html#git_revwalk_push_head-49"] } + "examples": { "log.c": ["ex/v1.9.1/log.html#git_revwalk_push_head-49"] } }, "git_revwalk_hide": { "type": "function", @@ -19326,7 +19486,7 @@ "description": "

Mark a commit (and its ancestors) uninteresting for the output.

\n", "comments": "

The given id must belong to a committish on the walked repository.

\n\n

The resolved commit and all its parents will be hidden from the output on the revision walk.

\n", "group": "revwalk", - "examples": { "log.c": ["ex/v1.8.4/log.html#git_revwalk_hide-50"] } + "examples": { "log.c": ["ex/v1.9.1/log.html#git_revwalk_hide-50"] } }, "git_revwalk_hide_glob": { "type": "function", @@ -19446,8 +19606,8 @@ "comments": "

The initial call to this method is not blocking when iterating through a repo with a time-sorting mode.

\n\n

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).

\n\n

The revision walker is reset when the walk is over.

\n", "group": "revwalk", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_revwalk_next-67"], - "log.c": ["ex/v1.8.4/log.html#git_revwalk_next-51"] + "general.c": ["ex/v1.9.1/general.html#git_revwalk_next-83"], + "log.c": ["ex/v1.9.1/log.html#git_revwalk_next-51"] } }, "git_revwalk_sorting": { @@ -19474,10 +19634,10 @@ "comments": "

Changing the sorting mode resets the walker.

\n", "group": "revwalk", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_revwalk_sorting-68"], + "general.c": ["ex/v1.9.1/general.html#git_revwalk_sorting-84"], "log.c": [ - "ex/v1.8.4/log.html#git_revwalk_sorting-52", - "ex/v1.8.4/log.html#git_revwalk_sorting-53" + "ex/v1.9.1/log.html#git_revwalk_sorting-52", + "ex/v1.9.1/log.html#git_revwalk_sorting-53" ] } }, @@ -19539,8 +19699,8 @@ "comments": "", "group": "revwalk", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_revwalk_free-69"], - "log.c": ["ex/v1.8.4/log.html#git_revwalk_free-54"] + "general.c": ["ex/v1.9.1/general.html#git_revwalk_free-85"], + "log.c": ["ex/v1.9.1/log.html#git_revwalk_free-54"] } }, "git_revwalk_repository": { @@ -19597,8 +19757,8 @@ "git_signature_new": { "type": "function", "file": "git2/signature.h", - "line": 37, - "lineto": 37, + "line": 41, + "lineto": 41, "args": [ { "name": "out", @@ -19634,16 +19794,16 @@ "group": "signature", "examples": { "general.c": [ - "ex/v1.8.4/general.html#git_signature_new-70", - "ex/v1.8.4/general.html#git_signature_new-71" + "ex/v1.9.1/general.html#git_signature_new-86", + "ex/v1.9.1/general.html#git_signature_new-87" ] } }, "git_signature_now": { "type": "function", "file": "git2/signature.h", - "line": 49, - "lineto": 49, + "line": 53, + "lineto": 53, "args": [ { "name": "out", @@ -19667,13 +19827,50 @@ "description": "

Create a new action signature with a timestamp of 'now'.

\n", "comments": "

Call git_signature_free() to free the data.

\n", "group": "signature", - "examples": { "merge.c": ["ex/v1.8.4/merge.html#git_signature_now-36"] } + "examples": { "merge.c": ["ex/v1.9.1/merge.html#git_signature_now-36"] } + }, + "git_signature_default_from_env": { + "type": "function", + "file": "git2/signature.h", + "line": 86, + "lineto": 89, + "args": [ + { + "name": "author_out", + "type": "git_signature **", + "comment": "pointer to set the author signature, or NULL" + }, + { + "name": "committer_out", + "type": "git_signature **", + "comment": "pointer to set the committer signature, or NULL" + }, + { + "name": "repo", + "type": "git_repository *", + "comment": "repository pointer" + } + ], + "argline": "git_signature **author_out, git_signature **committer_out, git_repository *repo", + "sig": "git_signature **::git_signature **::git_repository *", + "return": { + "type": "int", + "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" + }, + "description": "

Create a new author and/or committer signatures with default\n information based on the configuration and environment variables.

\n", + "comments": "

If author_out is set, it will be populated with the author information. The GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL environment variables will be honored, and user.name and user.email configuration options will be honored if the environment variables are unset. For timestamps, GIT_AUTHOR_DATE will be used, otherwise the current time will be used.

\n\n

If committer_out is set, it will be populated with the committer information. The GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL environment variables will be honored, and user.name and user.email configuration options will be honored if the environment variables are unset. For timestamps, GIT_COMMITTER_DATE will be used, otherwise the current time will be used.

\n\n

If neither GIT_AUTHOR_DATE nor GIT_COMMITTER_DATE are set, both timestamps will be set to the same time.

\n\n

It will return GIT_ENOTFOUND if either the user.name or user.email are not set and there is no fallback from an environment variable. One of author_out or committer_out must be set.

\n", + "group": "signature", + "examples": { + "commit.c": ["ex/v1.9.1/commit.html#git_signature_default_from_env-10"], + "init.c": ["ex/v1.9.1/init.html#git_signature_default_from_env-10"], + "tag.c": ["ex/v1.9.1/tag.html#git_signature_default_from_env-13"] + } }, "git_signature_default": { "type": "function", "file": "git2/signature.h", - "line": 63, - "lineto": 63, + "line": 107, + "lineto": 107, "args": [ { "name": "out", @@ -19693,19 +19890,14 @@ "comment": " 0 on success, GIT_ENOTFOUND if config is missing, or error code" }, "description": "

Create a new action signature with default user and now timestamp.

\n", - "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n", - "group": "signature", - "examples": { - "commit.c": ["ex/v1.8.4/commit.html#git_signature_default-10"], - "init.c": ["ex/v1.8.4/init.html#git_signature_default-10"], - "tag.c": ["ex/v1.8.4/tag.html#git_signature_default-13"] - } + "comments": "

This looks up the user.name and user.email from the configuration and uses the current time as the timestamp, and creates a new signature based on that information. It will return GIT_ENOTFOUND if either the user.name or user.email are not set.

\n\n

Note that these do not examine environment variables, only the configuration files. Use git_signature_default_from_env to consider the environment variables.

\n", + "group": "signature" }, "git_signature_from_buffer": { "type": "function", "file": "git2/signature.h", - "line": 76, - "lineto": 76, + "line": 120, + "lineto": 120, "args": [ { "name": "out", @@ -19727,8 +19919,8 @@ "git_signature_dup": { "type": "function", "file": "git2/signature.h", - "line": 88, - "lineto": 88, + "line": 132, + "lineto": 132, "args": [ { "name": "dest", @@ -19751,8 +19943,8 @@ "git_signature_free": { "type": "function", "file": "git2/signature.h", - "line": 99, - "lineto": 99, + "line": 143, + "lineto": 143, "args": [ { "name": "sig", @@ -19767,20 +19959,26 @@ "comments": "

Because the signature is not an opaque structure, it is legal to free it manually, but be sure to free the "name" and "email" strings in addition to the structure itself.

\n", "group": "signature", "examples": { - "commit.c": ["ex/v1.8.4/commit.html#git_signature_free-11"], + "commit.c": [ + "ex/v1.9.1/commit.html#git_signature_free-11", + "ex/v1.9.1/commit.html#git_signature_free-12" + ], "general.c": [ - "ex/v1.8.4/general.html#git_signature_free-72", - "ex/v1.8.4/general.html#git_signature_free-73" + "ex/v1.9.1/general.html#git_signature_free-88", + "ex/v1.9.1/general.html#git_signature_free-89" + ], + "init.c": [ + "ex/v1.9.1/init.html#git_signature_free-11", + "ex/v1.9.1/init.html#git_signature_free-12" ], - "init.c": ["ex/v1.8.4/init.html#git_signature_free-11"], - "tag.c": ["ex/v1.8.4/tag.html#git_signature_free-14"] + "tag.c": ["ex/v1.9.1/tag.html#git_signature_free-14"] } }, "git_stash_save": { "type": "function", "file": "git2/stash.h", - "line": 67, - "lineto": 72, + "line": 72, + "lineto": 77, "args": [ { "name": "out", @@ -19821,8 +20019,8 @@ "git_stash_save_options_init": { "type": "function", "file": "git2/stash.h", - "line": 110, - "lineto": 111, + "line": 118, + "lineto": 119, "args": [ { "name": "opts", @@ -19848,8 +20046,8 @@ "git_stash_save_with_opts": { "type": "function", "file": "git2/stash.h", - "line": 123, - "lineto": 126, + "line": 131, + "lineto": 134, "args": [ { "name": "out", @@ -19880,8 +20078,8 @@ "git_stash_apply_options_init": { "type": "function", "file": "git2/stash.h", - "line": 210, - "lineto": 211, + "line": 225, + "lineto": 226, "args": [ { "name": "opts", @@ -19907,8 +20105,8 @@ "git_stash_apply": { "type": "function", "file": "git2/stash.h", - "line": 239, - "lineto": 242, + "line": 252, + "lineto": 255, "args": [ { "name": "repo", @@ -19933,14 +20131,14 @@ "comment": " 0 on success, GIT_ENOTFOUND if there's no stashed state for the\n given index, GIT_EMERGECONFLICT if changes exist in the working\n directory, or an error code" }, "description": "

Apply a single stashed state from the stash list.

\n", - "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n\n

Note that a minimum checkout strategy of GIT_CHECKOUT_SAFE is implied.

\n", + "comments": "

If local changes in the working directory conflict with changes in the stash then GIT_EMERGECONFLICT will be returned. In this case, the index will always remain unmodified and all files in the working directory will remain unmodified. However, if you are restoring untracked files or ignored files and there is a conflict when applying the modified files, then those files will remain in the working directory.

\n\n

If passing the GIT_STASH_APPLY_REINSTATE_INDEX flag and there would be conflicts when reinstating the index, the function will return GIT_EMERGECONFLICT and both the working directory and index will be left unmodified.

\n", "group": "stash" }, "git_stash_foreach": { "type": "function", "file": "git2/stash.h", - "line": 275, - "lineto": 278, + "line": 288, + "lineto": 291, "args": [ { "name": "repo", @@ -19971,8 +20169,8 @@ "git_stash_drop": { "type": "function", "file": "git2/stash.h", - "line": 291, - "lineto": 293, + "line": 304, + "lineto": 306, "args": [ { "name": "repo", @@ -19998,8 +20196,8 @@ "git_stash_pop": { "type": "function", "file": "git2/stash.h", - "line": 307, - "lineto": 310, + "line": 320, + "lineto": 323, "args": [ { "name": "repo", @@ -20030,8 +20228,8 @@ "git_status_options_init": { "type": "function", "file": "git2/status.h", - "line": 277, - "lineto": 279, + "line": 280, + "lineto": 282, "args": [ { "name": "opts", @@ -20057,8 +20255,8 @@ "git_status_foreach": { "type": "function", "file": "git2/status.h", - "line": 317, - "lineto": 320, + "line": 320, + "lineto": 323, "args": [ { "name": "repo", @@ -20085,13 +20283,13 @@ "description": "

Gather file statuses and run a callback for each one.

\n", "comments": "

The callback is passed the path of the file, the status (a combination of the git_status_t values above) and the payload data pointer passed into this function.

\n\n

If the callback returns a non-zero value, this function will stop looping and return that value to caller.

\n", "group": "status", - "examples": { "status.c": ["ex/v1.8.4/status.html#git_status_foreach-6"] } + "examples": { "status.c": ["ex/v1.9.1/status.html#git_status_foreach-6"] } }, "git_status_foreach_ext": { "type": "function", "file": "git2/status.h", - "line": 341, - "lineto": 345, + "line": 344, + "lineto": 348, "args": [ { "name": "repo", @@ -20124,14 +20322,14 @@ "comments": "

This is an extended version of the git_status_foreach() API that allows for more granular control over which paths will be processed and in what order. See the git_status_options structure for details about the additional controls that this makes available.

\n\n

Note that if a pathspec is given in the git_status_options to filter the status, then the results from rename detection (if you enable it) may not be accurate. To do rename detection properly, this must be called with no pathspec so that all files can be considered.

\n", "group": "status", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_status_foreach_ext-7"] + "status.c": ["ex/v1.9.1/status.html#git_status_foreach_ext-7"] } }, "git_status_file": { "type": "function", "file": "git2/status.h", - "line": 373, - "lineto": 376, + "line": 376, + "lineto": 379, "args": [ { "name": "status_flags", @@ -20158,13 +20356,13 @@ "description": "

Get file status for a single file.

\n", "comments": "

This tries to get status for the filename that you give. If no files match that name (in either the HEAD, index, or working directory), this returns GIT_ENOTFOUND.

\n\n

If the name matches multiple files (for example, if the path names a directory or if running on a case- insensitive filesystem and yet the HEAD has two entries that both match the path), then this returns GIT_EAMBIGUOUS because it cannot give correct results.

\n\n

This does not do any sort of rename detection. Renames require a set of targets and because of the path filtering, there is not enough information to check renames correctly. To check file status with rename detection, there is no choice but to do a full git_status_list_new and scan through looking for the path that you are interested in.

\n", "group": "status", - "examples": { "add.c": ["ex/v1.8.4/add.html#git_status_file-6"] } + "examples": { "add.c": ["ex/v1.9.1/add.html#git_status_file-6"] } }, "git_status_list_new": { "type": "function", "file": "git2/status.h", - "line": 391, - "lineto": 394, + "line": 394, + "lineto": 397, "args": [ { "name": "out", @@ -20190,16 +20388,16 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.8.4/status.html#git_status_list_new-8", - "ex/v1.8.4/status.html#git_status_list_new-9" + "ex/v1.9.1/status.html#git_status_list_new-8", + "ex/v1.9.1/status.html#git_status_list_new-9" ] } }, "git_status_list_entrycount": { "type": "function", "file": "git2/status.h", - "line": 405, - "lineto": 406, + "line": 408, + "lineto": 409, "args": [ { "name": "statuslist", @@ -20218,16 +20416,16 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.8.4/status.html#git_status_list_entrycount-10", - "ex/v1.8.4/status.html#git_status_list_entrycount-11" + "ex/v1.9.1/status.html#git_status_list_entrycount-10", + "ex/v1.9.1/status.html#git_status_list_entrycount-11" ] } }, "git_status_byindex": { "type": "function", "file": "git2/status.h", - "line": 417, - "lineto": 419, + "line": 420, + "lineto": 422, "args": [ { "name": "statuslist", @@ -20247,20 +20445,20 @@ "group": "status", "examples": { "status.c": [ - "ex/v1.8.4/status.html#git_status_byindex-12", - "ex/v1.8.4/status.html#git_status_byindex-13", - "ex/v1.8.4/status.html#git_status_byindex-14", - "ex/v1.8.4/status.html#git_status_byindex-15", - "ex/v1.8.4/status.html#git_status_byindex-16", - "ex/v1.8.4/status.html#git_status_byindex-17" + "ex/v1.9.1/status.html#git_status_byindex-12", + "ex/v1.9.1/status.html#git_status_byindex-13", + "ex/v1.9.1/status.html#git_status_byindex-14", + "ex/v1.9.1/status.html#git_status_byindex-15", + "ex/v1.9.1/status.html#git_status_byindex-16", + "ex/v1.9.1/status.html#git_status_byindex-17" ] } }, "git_status_list_free": { "type": "function", "file": "git2/status.h", - "line": 426, - "lineto": 427, + "line": 429, + "lineto": 430, "args": [ { "name": "statuslist", @@ -20275,14 +20473,14 @@ "comments": "", "group": "status", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_status_list_free-18"] + "status.c": ["ex/v1.9.1/status.html#git_status_list_free-18"] } }, "git_status_should_ignore": { "type": "function", "file": "git2/status.h", - "line": 445, - "lineto": 448, + "line": 448, + "lineto": 451, "args": [ { "name": "ignored", @@ -20329,20 +20527,20 @@ "comments": "

This does not free the git_strarray itself, since the library will never allocate that object directly itself.

\n", "group": "strarray", "examples": { - "checkout.c": ["ex/v1.8.4/checkout.html#git_strarray_dispose-26"], - "general.c": ["ex/v1.8.4/general.html#git_strarray_dispose-74"], + "checkout.c": ["ex/v1.9.1/checkout.html#git_strarray_dispose-26"], + "general.c": ["ex/v1.9.1/general.html#git_strarray_dispose-90"], "remote.c": [ - "ex/v1.8.4/remote.html#git_strarray_dispose-11", - "ex/v1.8.4/remote.html#git_strarray_dispose-12" + "ex/v1.9.1/remote.html#git_strarray_dispose-11", + "ex/v1.9.1/remote.html#git_strarray_dispose-12" ], - "tag.c": ["ex/v1.8.4/tag.html#git_strarray_dispose-15"] + "tag.c": ["ex/v1.9.1/tag.html#git_strarray_dispose-15"] } }, "git_submodule_update_options_init": { "type": "function", "file": "git2/submodule.h", - "line": 171, - "lineto": 172, + "line": 180, + "lineto": 181, "args": [ { "name": "opts", @@ -20368,8 +20566,8 @@ "git_submodule_update": { "type": "function", "file": "git2/submodule.h", - "line": 192, - "lineto": 192, + "line": 201, + "lineto": 201, "args": [ { "name": "submodule", @@ -20400,8 +20598,8 @@ "git_submodule_lookup": { "type": "function", "file": "git2/submodule.h", - "line": 221, - "lineto": 224, + "line": 230, + "lineto": 233, "args": [ { "name": "out", @@ -20432,8 +20630,8 @@ "git_submodule_dup": { "type": "function", "file": "git2/submodule.h", - "line": 234, - "lineto": 234, + "line": 243, + "lineto": 243, "args": [ { "name": "out", @@ -20456,8 +20654,8 @@ "git_submodule_free": { "type": "function", "file": "git2/submodule.h", - "line": 241, - "lineto": 241, + "line": 250, + "lineto": 250, "args": [ { "name": "submodule", @@ -20475,8 +20673,8 @@ "git_submodule_foreach": { "type": "function", "file": "git2/submodule.h", - "line": 261, - "lineto": 264, + "line": 270, + "lineto": 273, "args": [ { "name": "repo", @@ -20504,14 +20702,14 @@ "comments": "

See the note on git_submodule above. This iterates over the tracked submodules as described therein.

\n\n

If you are concerned about items in the working directory that look like submodules but are not tracked, the diff API will generate a diff record for workdir items that look like submodules but are not tracked, showing them as added in the workdir. Also, the status API will treat the entire subdirectory of a contained git repo as a single GIT_STATUS_WT_NEW item.

\n", "group": "submodule", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_submodule_foreach-19"] + "status.c": ["ex/v1.9.1/status.html#git_submodule_foreach-19"] } }, "git_submodule_add_setup": { "type": "function", "file": "git2/submodule.h", - "line": 292, - "lineto": 297, + "line": 301, + "lineto": 306, "args": [ { "name": "out", @@ -20552,8 +20750,8 @@ "git_submodule_clone": { "type": "function", "file": "git2/submodule.h", - "line": 310, - "lineto": 313, + "line": 319, + "lineto": 322, "args": [ { "name": "out", @@ -20584,8 +20782,8 @@ "git_submodule_add_finalize": { "type": "function", "file": "git2/submodule.h", - "line": 326, - "lineto": 326, + "line": 335, + "lineto": 335, "args": [ { "name": "submodule", @@ -20603,8 +20801,8 @@ "git_submodule_add_to_index": { "type": "function", "file": "git2/submodule.h", - "line": 338, - "lineto": 340, + "line": 347, + "lineto": 349, "args": [ { "name": "submodule", @@ -20630,8 +20828,8 @@ "git_submodule_owner": { "type": "function", "file": "git2/submodule.h", - "line": 353, - "lineto": 353, + "line": 362, + "lineto": 362, "args": [ { "name": "submodule", @@ -20652,8 +20850,8 @@ "git_submodule_name": { "type": "function", "file": "git2/submodule.h", - "line": 361, - "lineto": 361, + "line": 370, + "lineto": 370, "args": [ { "name": "submodule", @@ -20671,14 +20869,14 @@ "comments": "", "group": "submodule", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_submodule_name-20"] + "status.c": ["ex/v1.9.1/status.html#git_submodule_name-20"] } }, "git_submodule_path": { "type": "function", "file": "git2/submodule.h", - "line": 372, - "lineto": 372, + "line": 381, + "lineto": 381, "args": [ { "name": "submodule", @@ -20696,14 +20894,14 @@ "comments": "

The path is almost always the same as the submodule name, but the two are actually not required to match.

\n", "group": "submodule", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_submodule_path-21"] + "status.c": ["ex/v1.9.1/status.html#git_submodule_path-21"] } }, "git_submodule_url": { "type": "function", "file": "git2/submodule.h", - "line": 380, - "lineto": 380, + "line": 389, + "lineto": 389, "args": [ { "name": "submodule", @@ -20724,8 +20922,8 @@ "git_submodule_resolve_url": { "type": "function", "file": "git2/submodule.h", - "line": 390, - "lineto": 390, + "line": 399, + "lineto": 399, "args": [ { "name": "out", @@ -20749,8 +20947,8 @@ "git_submodule_branch": { "type": "function", "file": "git2/submodule.h", - "line": 398, - "lineto": 398, + "line": 407, + "lineto": 407, "args": [ { "name": "submodule", @@ -20771,8 +20969,8 @@ "git_submodule_set_branch": { "type": "function", "file": "git2/submodule.h", - "line": 411, - "lineto": 411, + "line": 420, + "lineto": 420, "args": [ { "name": "repo", @@ -20803,8 +21001,8 @@ "git_submodule_set_url": { "type": "function", "file": "git2/submodule.h", - "line": 425, - "lineto": 425, + "line": 434, + "lineto": 434, "args": [ { "name": "repo", @@ -20835,8 +21033,8 @@ "git_submodule_index_id": { "type": "function", "file": "git2/submodule.h", - "line": 433, - "lineto": 433, + "line": 442, + "lineto": 442, "args": [ { "name": "submodule", @@ -20857,8 +21055,8 @@ "git_submodule_head_id": { "type": "function", "file": "git2/submodule.h", - "line": 441, - "lineto": 441, + "line": 450, + "lineto": 450, "args": [ { "name": "submodule", @@ -20879,8 +21077,8 @@ "git_submodule_wd_id": { "type": "function", "file": "git2/submodule.h", - "line": 454, - "lineto": 454, + "line": 463, + "lineto": 463, "args": [ { "name": "submodule", @@ -20901,8 +21099,8 @@ "git_submodule_ignore": { "type": "function", "file": "git2/submodule.h", - "line": 479, - "lineto": 480, + "line": 488, + "lineto": 489, "args": [ { "name": "submodule", @@ -20923,8 +21121,8 @@ "git_submodule_set_ignore": { "type": "function", "file": "git2/submodule.h", - "line": 492, - "lineto": 495, + "line": 501, + "lineto": 504, "args": [ { "name": "repo", @@ -20952,8 +21150,8 @@ "git_submodule_update_strategy": { "type": "function", "file": "git2/submodule.h", - "line": 507, - "lineto": 508, + "line": 516, + "lineto": 517, "args": [ { "name": "submodule", @@ -20974,8 +21172,8 @@ "git_submodule_set_update": { "type": "function", "file": "git2/submodule.h", - "line": 520, - "lineto": 523, + "line": 529, + "lineto": 532, "args": [ { "name": "repo", @@ -21003,16 +21201,20 @@ "git_submodule_fetch_recurse_submodules": { "type": "function", "file": "git2/submodule.h", - "line": 536, - "lineto": 537, + "line": 546, + "lineto": 547, "args": [ - { "name": "submodule", "type": "git_submodule *", "comment": null } + { + "name": "submodule", + "type": "git_submodule *", + "comment": "the submodule to examine" + } ], "argline": "git_submodule *submodule", "sig": "git_submodule *", "return": { "type": "git_submodule_recurse_t", - "comment": " 0 if fetchRecurseSubmodules is false, 1 if true" + "comment": " the submodule recursion configuration" }, "description": "

Read the fetchRecurseSubmodules rule for a submodule.

\n", "comments": "

This accesses the submodule..fetchRecurseSubmodules value for the submodule that controls fetching behavior for the submodule.

\n\n

Note that at this time, libgit2 does not honor this setting and the fetch functionality current ignores submodules.

\n", @@ -21021,8 +21223,8 @@ "git_submodule_set_fetch_recurse_submodules": { "type": "function", "file": "git2/submodule.h", - "line": 549, - "lineto": 552, + "line": 559, + "lineto": 562, "args": [ { "name": "repo", @@ -21037,7 +21239,7 @@ { "name": "fetch_recurse_submodules", "type": "git_submodule_recurse_t", - "comment": "Boolean value" + "comment": "the submodule recursion configuration" } ], "argline": "git_repository *repo, const char *name, git_submodule_recurse_t fetch_recurse_submodules", @@ -21053,8 +21255,8 @@ "git_submodule_init": { "type": "function", "file": "git2/submodule.h", - "line": 567, - "lineto": 567, + "line": 577, + "lineto": 577, "args": [ { "name": "submodule", @@ -21080,8 +21282,8 @@ "git_submodule_repo_init": { "type": "function", "file": "git2/submodule.h", - "line": 582, - "lineto": 585, + "line": 592, + "lineto": 595, "args": [ { "name": "out", @@ -21112,8 +21314,8 @@ "git_submodule_sync": { "type": "function", "file": "git2/submodule.h", - "line": 598, - "lineto": 598, + "line": 608, + "lineto": 608, "args": [ { "name": "submodule", @@ -21131,8 +21333,8 @@ "git_submodule_open": { "type": "function", "file": "git2/submodule.h", - "line": 612, - "lineto": 614, + "line": 622, + "lineto": 624, "args": [ { "name": "repo", @@ -21158,8 +21360,8 @@ "git_submodule_reload": { "type": "function", "file": "git2/submodule.h", - "line": 626, - "lineto": 626, + "line": 636, + "lineto": 636, "args": [ { "name": "submodule", @@ -21182,8 +21384,8 @@ "git_submodule_status": { "type": "function", "file": "git2/submodule.h", - "line": 642, - "lineto": 646, + "line": 652, + "lineto": 656, "args": [ { "name": "status", @@ -21213,14 +21415,14 @@ "comments": "

This looks at a submodule and tries to determine the status. It will return a combination of the GIT_SUBMODULE_STATUS values above. How deeply it examines the working directory to do this will depend on the git_submodule_ignore_t value for the submodule.

\n", "group": "submodule", "examples": { - "status.c": ["ex/v1.8.4/status.html#git_submodule_status-22"] + "status.c": ["ex/v1.9.1/status.html#git_submodule_status-22"] } }, "git_submodule_location": { "type": "function", "file": "git2/submodule.h", - "line": 662, - "lineto": 664, + "line": 672, + "lineto": 674, "args": [ { "name": "location_status", @@ -21268,7 +21470,7 @@ "description": "

Lookup a tag object from the repository.

\n", "comments": "", "group": "tag", - "examples": { "general.c": ["ex/v1.8.4/general.html#git_tag_lookup-75"] } + "examples": { "general.c": ["ex/v1.9.1/general.html#git_tag_lookup-91"] } }, "git_tag_lookup_prefix": { "type": "function", @@ -21318,7 +21520,7 @@ "description": "

Close an open tag

\n", "comments": "

You can no longer use the git_tag pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you are through with a tag to release memory. Failure to do so will cause a memory leak.

\n", "group": "tag", - "examples": { "general.c": ["ex/v1.8.4/general.html#git_tag_free-76"] } + "examples": { "general.c": ["ex/v1.9.1/general.html#git_tag_free-92"] } }, "git_tag_id": { "type": "function", @@ -21387,7 +21589,7 @@ "description": "

Get the tagged object of a tag

\n", "comments": "

This method performs a repository lookup for the given object and returns it

\n", "group": "tag", - "examples": { "general.c": ["ex/v1.8.4/general.html#git_tag_target-77"] } + "examples": { "general.c": ["ex/v1.9.1/general.html#git_tag_target-93"] } }, "git_tag_target_id": { "type": "function", @@ -21408,7 +21610,7 @@ "comments": "", "group": "tag", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_target_id-31"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_target_id-31"] } }, "git_tag_target_type": { @@ -21433,8 +21635,8 @@ "comments": "", "group": "tag", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_target_type-32"], - "general.c": ["ex/v1.8.4/general.html#git_tag_target_type-78"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_target_type-32"], + "general.c": ["ex/v1.9.1/general.html#git_tag_target_type-94"] } }, "git_tag_name": { @@ -21456,9 +21658,9 @@ "comments": "", "group": "tag", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_name-33"], - "general.c": ["ex/v1.8.4/general.html#git_tag_name-79"], - "tag.c": ["ex/v1.8.4/tag.html#git_tag_name-16"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_name-33"], + "general.c": ["ex/v1.9.1/general.html#git_tag_name-95"], + "tag.c": ["ex/v1.9.1/tag.html#git_tag_name-16"] } }, "git_tag_tagger": { @@ -21483,7 +21685,7 @@ "comments": "", "group": "tag", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tag_tagger-34"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tag_tagger-34"] } }, "git_tag_message": { @@ -21509,11 +21711,11 @@ "group": "tag", "examples": { "cat-file.c": [ - "ex/v1.8.4/cat-file.html#git_tag_message-35", - "ex/v1.8.4/cat-file.html#git_tag_message-36" + "ex/v1.9.1/cat-file.html#git_tag_message-35", + "ex/v1.9.1/cat-file.html#git_tag_message-36" ], - "general.c": ["ex/v1.8.4/general.html#git_tag_message-80"], - "tag.c": ["ex/v1.8.4/tag.html#git_tag_message-17"] + "general.c": ["ex/v1.9.1/general.html#git_tag_message-96"], + "tag.c": ["ex/v1.9.1/tag.html#git_tag_message-17"] } }, "git_tag_create": { @@ -21567,7 +21769,7 @@ "description": "

Create a new tag in the repository from an object

\n", "comments": "

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.

\n\n

The message will not be cleaned up. This can be achieved through git_message_prettify().

\n\n

The tag name will be checked for validity. You must avoid the characters '~', '^', ':', '\\', '?', '[', and '*', and the sequences ".." and "@{" which have special meaning to revparse.

\n", "group": "tag", - "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_tag_create-18"] } + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_tag_create-18"] } }, "git_tag_annotation_create": { "type": "function", @@ -21684,7 +21886,7 @@ "comments": "

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.

\n\n

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "tag", "examples": { - "tag.c": ["ex/v1.8.4/tag.html#git_tag_create_lightweight-19"] + "tag.c": ["ex/v1.9.1/tag.html#git_tag_create_lightweight-19"] } }, "git_tag_delete": { @@ -21713,7 +21915,7 @@ "description": "

Delete an existing tag reference.

\n", "comments": "

The tag name will be checked for validity. See git_tag_create() for rules about valid names.

\n", "group": "tag", - "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_tag_delete-20"] } + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_tag_delete-20"] } }, "git_tag_list": { "type": "function", @@ -21767,13 +21969,13 @@ "description": "

Fill a list with all the tags in the Repository\n which name match a defined pattern

\n", "comments": "

If an empty pattern is provided, all the tags will be returned.

\n\n

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.

\n", "group": "tag", - "examples": { "tag.c": ["ex/v1.8.4/tag.html#git_tag_list_match-21"] } + "examples": { "tag.c": ["ex/v1.9.1/tag.html#git_tag_list_match-21"] } }, "git_tag_foreach": { "type": "function", "file": "git2/tag.h", - "line": 339, - "lineto": 342, + "line": 340, + "lineto": 343, "args": [ { "name": "repo", "type": "git_repository *", "comment": "Repository" }, { @@ -21789,7 +21991,7 @@ ], "argline": "git_repository *repo, git_tag_foreach_cb callback, void *payload", "sig": "git_repository *::git_tag_foreach_cb::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 on success or an error code" }, "description": "

Call callback `cb' for each tag in the repository

\n", "comments": "", "group": "tag" @@ -21797,8 +21999,8 @@ "git_tag_peel": { "type": "function", "file": "git2/tag.h", - "line": 355, - "lineto": 357, + "line": 356, + "lineto": 358, "args": [ { "name": "tag_target_out", @@ -21821,8 +22023,8 @@ "git_tag_dup": { "type": "function", "file": "git2/tag.h", - "line": 367, - "lineto": 367, + "line": 368, + "lineto": 368, "args": [ { "name": "out", @@ -21845,8 +22047,8 @@ "git_tag_name_is_valid": { "type": "function", "file": "git2/tag.h", - "line": 379, - "lineto": 379, + "line": 380, + "lineto": 380, "args": [ { "name": "valid", @@ -21869,8 +22071,8 @@ "git_trace_set": { "type": "function", "file": "git2/trace.h", - "line": 63, - "lineto": 63, + "line": 68, + "lineto": 68, "args": [ { "name": "level", @@ -22148,13 +22350,13 @@ "comments": "", "group": "tree", "examples": { - "commit.c": ["ex/v1.8.4/commit.html#git_tree_lookup-12"], + "commit.c": ["ex/v1.9.1/commit.html#git_tree_lookup-13"], "general.c": [ - "ex/v1.8.4/general.html#git_tree_lookup-81", - "ex/v1.8.4/general.html#git_tree_lookup-82" + "ex/v1.9.1/general.html#git_tree_lookup-97", + "ex/v1.9.1/general.html#git_tree_lookup-98" ], - "init.c": ["ex/v1.8.4/init.html#git_tree_lookup-12"], - "merge.c": ["ex/v1.8.4/merge.html#git_tree_lookup-37"] + "init.c": ["ex/v1.9.1/init.html#git_tree_lookup-13"], + "merge.c": ["ex/v1.9.1/merge.html#git_tree_lookup-37"] } }, "git_tree_lookup_prefix": { @@ -22206,22 +22408,22 @@ "comments": "

You can no longer use the git_tree pointer after this call.

\n\n

IMPORTANT: You MUST call this method when you stop using a tree to release memory. Failure to do so will cause a memory leak.

\n", "group": "tree", "examples": { - "commit.c": ["ex/v1.8.4/commit.html#git_tree_free-13"], + "commit.c": ["ex/v1.9.1/commit.html#git_tree_free-14"], "diff.c": [ - "ex/v1.8.4/diff.html#git_tree_free-19", - "ex/v1.8.4/diff.html#git_tree_free-20" + "ex/v1.9.1/diff.html#git_tree_free-19", + "ex/v1.9.1/diff.html#git_tree_free-20" ], "general.c": [ - "ex/v1.8.4/general.html#git_tree_free-83", - "ex/v1.8.4/general.html#git_tree_free-84" + "ex/v1.9.1/general.html#git_tree_free-99", + "ex/v1.9.1/general.html#git_tree_free-100" ], - "init.c": ["ex/v1.8.4/init.html#git_tree_free-13"], + "init.c": ["ex/v1.9.1/init.html#git_tree_free-14"], "log.c": [ - "ex/v1.8.4/log.html#git_tree_free-55", - "ex/v1.8.4/log.html#git_tree_free-56", - "ex/v1.8.4/log.html#git_tree_free-57", - "ex/v1.8.4/log.html#git_tree_free-58", - "ex/v1.8.4/log.html#git_tree_free-59" + "ex/v1.9.1/log.html#git_tree_free-55", + "ex/v1.9.1/log.html#git_tree_free-56", + "ex/v1.9.1/log.html#git_tree_free-57", + "ex/v1.9.1/log.html#git_tree_free-58", + "ex/v1.9.1/log.html#git_tree_free-59" ] } }, @@ -22291,8 +22493,8 @@ "comments": "", "group": "tree", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entrycount-37"], - "general.c": ["ex/v1.8.4/general.html#git_tree_entrycount-85"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entrycount-37"], + "general.c": ["ex/v1.9.1/general.html#git_tree_entrycount-101"] } }, "git_tree_entry_byname": { @@ -22322,7 +22524,7 @@ "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", "group": "tree", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_tree_entry_byname-86"] + "general.c": ["ex/v1.9.1/general.html#git_tree_entry_byname-102"] } }, "git_tree_entry_byindex": { @@ -22352,8 +22554,8 @@ "comments": "

This returns a git_tree_entry that is owned by the git_tree. You don't have to free it, but you must not use it after the git_tree is released.

\n", "group": "tree", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_byindex-38"], - "general.c": ["ex/v1.8.4/general.html#git_tree_entry_byindex-87"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_byindex-38"], + "general.c": ["ex/v1.9.1/general.html#git_tree_entry_byindex-103"] } }, "git_tree_entry_byid": { @@ -22477,10 +22679,10 @@ "comments": "", "group": "tree", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_name-39"], + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_name-39"], "general.c": [ - "ex/v1.8.4/general.html#git_tree_entry_name-88", - "ex/v1.8.4/general.html#git_tree_entry_name-89" + "ex/v1.9.1/general.html#git_tree_entry_name-104", + "ex/v1.9.1/general.html#git_tree_entry_name-105" ] } }, @@ -22506,7 +22708,7 @@ "comments": "", "group": "tree", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_id-40"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_id-40"] } }, "git_tree_entry_type": { @@ -22531,7 +22733,7 @@ "comments": "", "group": "tree", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_type-41"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_type-41"] } }, "git_tree_entry_filemode": { @@ -22556,7 +22758,7 @@ "comments": "", "group": "tree", "examples": { - "cat-file.c": ["ex/v1.8.4/cat-file.html#git_tree_entry_filemode-42"] + "cat-file.c": ["ex/v1.9.1/cat-file.html#git_tree_entry_filemode-42"] } }, "git_tree_entry_filemode_raw": { @@ -22637,7 +22839,7 @@ "comments": "

You must call git_object_free() on the object when you are done with it.

\n", "group": "tree", "examples": { - "general.c": ["ex/v1.8.4/general.html#git_tree_entry_to_object-90"] + "general.c": ["ex/v1.9.1/general.html#git_tree_entry_to_object-106"] } }, "git_treebuilder_new": { @@ -22828,8 +23030,8 @@ "git_treebuilder_filter": { "type": "function", "file": "git2/tree.h", - "line": 364, - "lineto": 367, + "line": 368, + "lineto": 371, "args": [ { "name": "bld", @@ -22860,8 +23062,8 @@ "git_treebuilder_write": { "type": "function", "file": "git2/tree.h", - "line": 379, - "lineto": 380, + "line": 383, + "lineto": 384, "args": [ { "name": "id", @@ -22884,8 +23086,8 @@ "git_tree_walk": { "type": "function", "file": "git2/tree.h", - "line": 409, - "lineto": 413, + "line": 420, + "lineto": 424, "args": [ { "name": "tree", @@ -22918,8 +23120,8 @@ "git_tree_dup": { "type": "function", "file": "git2/tree.h", - "line": 423, - "lineto": 423, + "line": 434, + "lineto": 434, "args": [ { "name": "out", @@ -22942,8 +23144,8 @@ "git_tree_create_updated": { "type": "function", "file": "git2/tree.h", - "line": 470, - "lineto": 470, + "line": 481, + "lineto": 481, "args": [ { "name": "out", "type": "git_oid *", "comment": "id of the new tree" }, { @@ -23095,8 +23297,8 @@ "git_worktree_add_options_init": { "type": "function", "file": "git2/worktree.h", - "line": 113, - "lineto": 114, + "line": 116, + "lineto": 117, "args": [ { "name": "opts", @@ -23122,8 +23324,8 @@ "git_worktree_add": { "type": "function", "file": "git2/worktree.h", - "line": 130, - "lineto": 132, + "line": 133, + "lineto": 135, "args": [ { "name": "out", @@ -23161,8 +23363,8 @@ "git_worktree_lock": { "type": "function", "file": "git2/worktree.h", - "line": 144, - "lineto": 144, + "line": 147, + "lineto": 147, "args": [ { "name": "wt", @@ -23188,8 +23390,8 @@ "git_worktree_unlock": { "type": "function", "file": "git2/worktree.h", - "line": 153, - "lineto": 153, + "line": 156, + "lineto": 156, "args": [ { "name": "wt", @@ -23210,8 +23412,8 @@ "git_worktree_is_locked": { "type": "function", "file": "git2/worktree.h", - "line": 167, - "lineto": 167, + "line": 170, + "lineto": 170, "args": [ { "name": "reason", @@ -23237,8 +23439,8 @@ "git_worktree_name": { "type": "function", "file": "git2/worktree.h", - "line": 176, - "lineto": 176, + "line": 179, + "lineto": 179, "args": [ { "name": "wt", @@ -23259,8 +23461,8 @@ "git_worktree_path": { "type": "function", "file": "git2/worktree.h", - "line": 185, - "lineto": 185, + "line": 188, + "lineto": 188, "args": [ { "name": "wt", @@ -23281,8 +23483,8 @@ "git_worktree_prune_options_init": { "type": "function", "file": "git2/worktree.h", - "line": 227, - "lineto": 229, + "line": 233, + "lineto": 235, "args": [ { "name": "opts", @@ -23308,8 +23510,8 @@ "git_worktree_is_prunable": { "type": "function", "file": "git2/worktree.h", - "line": 251, - "lineto": 252, + "line": 257, + "lineto": 258, "args": [ { "name": "wt", @@ -23335,8 +23537,8 @@ "git_worktree_prune": { "type": "function", "file": "git2/worktree.h", - "line": 266, - "lineto": 267, + "line": 272, + "lineto": 273, "args": [ { "name": "wt", @@ -23361,8 +23563,8 @@ "git_apply_delta_cb": { "type": "callback", "file": "git2/apply.h", - "line": 38, - "lineto": 40, + "line": 41, + "lineto": 43, "args": [ { "name": "delta", @@ -23387,8 +23589,8 @@ "git_apply_hunk_cb": { "type": "callback", "file": "git2/apply.h", - "line": 56, - "lineto": 58, + "line": 59, + "lineto": 61, "args": [ { "name": "hunk", @@ -23413,8 +23615,8 @@ "git_attr_foreach_cb": { "type": "callback", "file": "git2/attr.h", - "line": 289, - "lineto": 289, + "line": 304, + "lineto": 304, "args": [ { "name": "name", @@ -23480,67 +23682,107 @@ "git_checkout_notify_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 255, - "lineto": 261, + "line": 275, + "lineto": 281, "args": [ - { "name": "why", "type": "git_checkout_notify_t", "comment": null }, - { "name": "path", "type": "const char *", "comment": null }, + { + "name": "why", + "type": "git_checkout_notify_t", + "comment": "the notification reason" + }, + { + "name": "path", + "type": "const char *", + "comment": "the path to the file being checked out" + }, { "name": "baseline", "type": "const git_diff_file *", - "comment": null + "comment": "the baseline's diff file information" }, - { "name": "target", "type": "const git_diff_file *", "comment": null }, - { "name": "workdir", "type": "const git_diff_file *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "target", + "type": "const git_diff_file *", + "comment": "the checkout target diff file information" + }, + { + "name": "workdir", + "type": "const git_diff_file *", + "comment": "the working directory diff file information" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-supplied callback payload" + } ], "argline": "git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload", "sig": "git_checkout_notify_t::const char *::const git_diff_file *::const git_diff_file *::const git_diff_file *::void *", - "return": { "type": "int", "comment": null }, - "description": "

Checkout notification callback function

\n", + "return": { "type": "int", "comment": " 0 on success, or an error code" }, + "description": "

Checkout notification callback function.

\n", "comments": "" }, "git_checkout_progress_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 264, - "lineto": 268, + "line": 291, + "lineto": 295, "args": [ - { "name": "path", "type": "const char *", "comment": null }, - { "name": "completed_steps", "type": "size_t", "comment": null }, - { "name": "total_steps", "type": "size_t", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "path", + "type": "const char *", + "comment": "the path to the file being checked out" + }, + { + "name": "completed_steps", + "type": "size_t", + "comment": "number of checkout steps completed" + }, + { + "name": "total_steps", + "type": "size_t", + "comment": "number of total steps in the checkout process" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-supplied callback payload" + } ], "argline": "const char *path, size_t completed_steps, size_t total_steps, void *payload", "sig": "const char *::size_t::size_t::void *", "return": { "type": "void", "comment": null }, - "description": "

Checkout progress notification function

\n", + "description": "

Checkout progress notification function.

\n", "comments": "" }, "git_checkout_perfdata_cb": { "type": "callback", "file": "git2/checkout.h", - "line": 271, - "lineto": 273, + "line": 303, + "lineto": 305, "args": [ { "name": "perfdata", "type": "const git_checkout_perfdata *", - "comment": null + "comment": "the performance data for the checkout" }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "payload", + "type": "void *", + "comment": "the user-supplied callback payload" + } ], "argline": "const git_checkout_perfdata *perfdata, void *payload", "sig": "const git_checkout_perfdata *::void *", "return": { "type": "void", "comment": null }, - "description": "

Checkout perfdata notification function

\n", + "description": "

Checkout performance data reporting function.

\n", "comments": "" }, "git_remote_create_cb": { "type": "callback", "file": "git2/clone.h", - "line": 69, - "lineto": 74, + "line": 73, + "lineto": 78, "args": [ { "name": "out", @@ -23576,8 +23818,8 @@ "git_repository_create_cb": { "type": "callback", "file": "git2/clone.h", - "line": 90, - "lineto": 94, + "line": 94, + "lineto": 98, "args": [ { "name": "out", @@ -23612,8 +23854,8 @@ "git_commit_create_cb": { "type": "callback", "file": "git2/commit.h", - "line": 576, - "lineto": 585, + "line": 643, + "lineto": 652, "args": [ { "name": "out", @@ -23673,8 +23915,8 @@ "git_config_foreach_cb": { "type": "callback", "file": "git2/config.h", - "line": 122, - "lineto": 122, + "line": 140, + "lineto": 140, "args": [ { "name": "entry", @@ -23693,14 +23935,14 @@ "type": "int", "comment": " non-zero to terminate the iteration." }, - "description": "

A config enumeration callback

\n", + "description": "

A config enumeration callback.

\n", "comments": "" }, "git_credential_acquire_cb": { "type": "callback", "file": "git2/credential.h", - "line": 131, - "lineto": 136, + "line": 134, + "lineto": 139, "args": [ { "name": "out", @@ -23737,11 +23979,98 @@ "description": "

Credential acquisition callback.

\n", "comments": "

This callback is usually involved any time another system might need authentication. As such, you are expected to provide a valid git_credential object back, depending on allowed_types (a git_credential_t bitmask).

\n\n

Note that most authentication details are your responsibility - this callback will be called until the authentication succeeds, or you report an error. As such, it's easy to get in a loop if you fail to stop providing the same incorrect credentials.

\n" }, + "git_credential_ssh_interactive_cb": { + "type": "callback", + "file": "git2/credential.h", + "line": 259, + "lineto": 265, + "args": [ + { "name": "name", "type": "const char *", "comment": "the name" }, + { + "name": "name_len", + "type": "int", + "comment": "the length of the name" + }, + { + "name": "instruction", + "type": "const char *", + "comment": "the authentication instruction" + }, + { + "name": "instruction_len", + "type": "int", + "comment": "the length of the instruction" + }, + { + "name": "num_prompts", + "type": "int", + "comment": "the number of prompts" + }, + { + "name": "prompts", + "type": "const LIBSSH2_USERAUTH_KBDINT_PROMPT *", + "comment": "the prompts" + }, + { + "name": "responses", + "type": "LIBSSH2_USERAUTH_KBDINT_RESPONSE *", + "comment": "the responses" + }, + { "name": "abstract", "type": "void **", "comment": "the abstract" } + ], + "argline": "const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract", + "sig": "const char *::int::const char *::int::int::const LIBSSH2_USERAUTH_KBDINT_PROMPT *::LIBSSH2_USERAUTH_KBDINT_RESPONSE *::void **", + "return": { "type": "void", "comment": null }, + "description": "

Callback for interactive SSH credentials.

\n", + "comments": "" + }, + "git_credential_sign_cb": { + "type": "callback", + "file": "git2/credential.h", + "line": 308, + "lineto": 312, + "args": [ + { + "name": "session", + "type": "LIBSSH2_SESSION *", + "comment": "the libssh2 session" + }, + { + "name": "sig", + "type": "unsigned char **", + "comment": "the signature" + }, + { + "name": "sig_len", + "type": "size_t *", + "comment": "the length of the signature" + }, + { + "name": "data", + "type": "const unsigned char *", + "comment": "the data" + }, + { + "name": "data_len", + "type": "size_t", + "comment": "the length of the data" + }, + { "name": "abstract", "type": "void **", "comment": "the abstract" } + ], + "argline": "LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, const unsigned char *data, size_t data_len, void **abstract", + "sig": "LIBSSH2_SESSION *::unsigned char **::size_t *::const unsigned char *::size_t::void **", + "return": { + "type": "int", + "comment": " 0 for success, \n<\n 0 to indicate an error, > 0 to indicate\n no credential was acquired" + }, + "description": "

Callback for credential signing.

\n", + "comments": "" + }, "git_commit_signing_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 276, - "lineto": 280, + "line": 285, + "lineto": 289, "args": [ { "name": "signature", "type": "git_buf *", "comment": null }, { "name": "signature_field", "type": "git_buf *", "comment": null }, @@ -23757,8 +24086,8 @@ "git_headlist_cb": { "type": "callback", "file": "git2/deprecated.h", - "line": 855, - "lineto": 855, + "line": 967, + "lineto": 967, "args": [ { "name": "rhead", "type": "git_remote_head *", "comment": null }, { "name": "payload", "type": "void *", "comment": null } @@ -23772,29 +24101,44 @@ "git_diff_notify_cb": { "type": "callback", "file": "git2/diff.h", - "line": 346, - "lineto": 350, + "line": 352, + "lineto": 356, "args": [ - { "name": "diff_so_far", "type": "const git_diff *", "comment": null }, + { + "name": "diff_so_far", + "type": "const git_diff *", + "comment": "the diff structure as it currently exists" + }, { "name": "delta_to_add", "type": "const git_diff_delta *", - "comment": null + "comment": "the delta that is to be added" }, - { "name": "matched_pathspec", "type": "const char *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "matched_pathspec", + "type": "const char *", + "comment": "the pathspec" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } ], "argline": "const git_diff *diff_so_far, const git_diff_delta *delta_to_add, const char *matched_pathspec, void *payload", "sig": "const git_diff *::const git_diff_delta *::const char *::void *", - "return": { "type": "int", "comment": null }, + "return": { + "type": "int", + "comment": " 0 on success, 1 to skip this delta, or an error code" + }, "description": "

Diff notification callback function.

\n", "comments": "

The callback will be called for each file, just before the git_diff_delta gets inserted into the diff.

\n\n

When the callback: - returns < 0, the diff process will be aborted. - returns > 0, the delta will not be inserted into the diff, but the diff process continues. - returns 0, the delta is inserted into the diff, and the diff process continues.

\n" }, "git_diff_progress_cb": { "type": "callback", "file": "git2/diff.h", - "line": 362, - "lineto": 366, + "line": 369, + "lineto": 373, "args": [ { "name": "diff_so_far", @@ -23811,19 +24155,23 @@ "type": "const char *", "comment": "The path to the new file or NULL." }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } ], "argline": "const git_diff *diff_so_far, const char *old_path, const char *new_path, void *payload", "sig": "const git_diff *::const char *::const char *::void *", - "return": { "type": "int", "comment": " Non-zero to abort the diff." }, + "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

Diff progress callback.

\n", "comments": "

Called before each file comparison.

\n" }, "git_diff_file_cb": { "type": "callback", "file": "git2/diff.h", - "line": 496, - "lineto": 499, + "line": 504, + "lineto": 507, "args": [ { "name": "delta", @@ -23843,84 +24191,131 @@ ], "argline": "const git_diff_delta *delta, float progress, void *payload", "sig": "const git_diff_delta *::float::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

When iterating over a diff, callback that will be made per file.

\n", "comments": "" }, "git_diff_binary_cb": { "type": "callback", "file": "git2/diff.h", - "line": 562, - "lineto": 565, + "line": 576, + "lineto": 579, "args": [ - { "name": "delta", "type": "const git_diff_delta *", "comment": null }, + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "the delta" + }, { "name": "binary", "type": "const git_diff_binary *", - "comment": null + "comment": "the binary content" }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } ], "argline": "const git_diff_delta *delta, const git_diff_binary *binary, void *payload", "sig": "const git_diff_delta *::const git_diff_binary *::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

When iterating over a diff, callback that will be made for\n binary content within the diff.

\n", "comments": "" }, "git_diff_hunk_cb": { "type": "callback", "file": "git2/diff.h", - "line": 588, - "lineto": 591, + "line": 607, + "lineto": 610, "args": [ - { "name": "delta", "type": "const git_diff_delta *", "comment": null }, - { "name": "hunk", "type": "const git_diff_hunk *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "the delta" + }, + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "the hunk" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } ], "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload", "sig": "const git_diff_delta *::const git_diff_hunk *::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

When iterating over a diff, callback that will be made per hunk.

\n", "comments": "" }, "git_diff_line_cb": { "type": "callback", "file": "git2/diff.h", - "line": 649, - "lineto": 653, + "line": 674, + "lineto": 678, "args": [ - { "name": "delta", "type": "const git_diff_delta *", "comment": null }, - { "name": "hunk", "type": "const git_diff_hunk *", "comment": null }, - { "name": "line", "type": "const git_diff_line *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "delta", + "type": "const git_diff_delta *", + "comment": "the delta that contains the line" + }, + { + "name": "hunk", + "type": "const git_diff_hunk *", + "comment": "the hunk that contains the line" + }, + { + "name": "line", + "type": "const git_diff_line *", + "comment": "the line in the diff" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified callback payload" + } ], "argline": "const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload", "sig": "const git_diff_delta *::const git_diff_hunk *::const git_diff_line *::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 or an error code" }, "description": "

When iterating over a diff, callback that will be made per text diff\n line. In this context, the provided range will be NULL.

\n", "comments": "

When printing a diff, callback that will be made to output each line of text. This uses some extra GIT_DIFF_LINE_... constants for output of lines of file and hunk headers.

\n" }, "git_index_matched_path_cb": { "type": "callback", "file": "git2/index.h", - "line": 135, - "lineto": 136, + "line": 158, + "lineto": 159, "args": [ - { "name": "path", "type": "const char *", "comment": null }, - { "name": "matched_pathspec", "type": "const char *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { "name": "path", "type": "const char *", "comment": "the path" }, + { + "name": "matched_pathspec", + "type": "const char *", + "comment": "the given pathspec" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified payload" + } ], "argline": "const char *path, const char *matched_pathspec, void *payload", "sig": "const char *::const char *::void *", - "return": { "type": "int", "comment": null }, - "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", + "return": { + "type": "int", + "comment": " 0 to continue with the index operation, positive number to skip this file for the index operation, negative number on failure" + }, + "description": "

Callback for APIs that add/remove/update files matching pathspec

\n", "comments": "" }, "git_indexer_progress_cb": { "type": "callback", "file": "git2/indexer.h", - "line": 57, - "lineto": 57, + "line": 68, + "lineto": 68, "args": [ { "name": "stats", @@ -23935,7 +24330,7 @@ ], "argline": "const git_indexer_progress *stats, void *payload", "sig": "const git_indexer_progress *::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 on success or an error code" }, "description": "

Type for progress callbacks during indexing. Return a value less\n than zero to cancel the indexing or download.

\n", "comments": "" }, @@ -23943,34 +24338,53 @@ "type": "callback", "file": "git2/notes.h", "line": 29, - "lineto": 30, + "lineto": 32, "args": [ - { "name": "blob_id", "type": "const git_oid *", "comment": null }, + { + "name": "blob_id", + "type": "const git_oid *", + "comment": "object id of the blob containing the message" + }, { "name": "annotated_object_id", "type": "const git_oid *", - "comment": null + "comment": "the id of the object being annotated" }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "payload", + "type": "void *", + "comment": "user-specified data to the foreach function" + } ], "argline": "const git_oid *blob_id, const git_oid *annotated_object_id, void *payload", "sig": "const git_oid *::const git_oid *::void *", - "return": { "type": "int", "comment": null }, + "return": { + "type": "int", + "comment": " 0 on success, or a negative number on failure" + }, "description": "

Callback for git_note_foreach.

\n", - "comments": "

Receives: - blob_id: Oid of the blob containing the message - annotated_object_id: Oid of the git object being annotated - payload: Payload data passed to git_note_foreach

\n" + "comments": "" }, "git_odb_foreach_cb": { "type": "callback", "file": "git2/odb.h", - "line": 39, - "lineto": 39, + "line": 43, + "lineto": 43, "args": [ - { "name": "id", "type": "const git_oid *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "id", + "type": "const git_oid *", + "comment": "an id of an object in the object database" + }, + { + "name": "payload", + "type": "void *", + "comment": "the payload from the initial call to git_odb_foreach" + } ], "argline": "const git_oid *id, void *payload", "sig": "const git_oid *::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 on success, or an error code" }, "description": "

Function type for callbacks from git_odb_foreach.

\n", "comments": "" }, @@ -24008,25 +24422,41 @@ "git_packbuilder_progress": { "type": "callback", "file": "git2/pack.h", - "line": 237, - "lineto": 241, + "line": 245, + "lineto": 249, "args": [ - { "name": "stage", "type": "int", "comment": null }, - { "name": "current", "type": "uint32_t", "comment": null }, - { "name": "total", "type": "uint32_t", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "stage", + "type": "int", + "comment": "the stage of the packbuilder" + }, + { + "name": "current", + "type": "uint32_t", + "comment": "the current object" + }, + { + "name": "total", + "type": "uint32_t", + "comment": "the total number of objects" + }, + { + "name": "payload", + "type": "void *", + "comment": "the callback payload" + } ], "argline": "int stage, uint32_t current, uint32_t total, void *payload", "sig": "int::uint32_t::uint32_t::void *", - "return": { "type": "int", "comment": null }, - "description": "

Packbuilder progress notification function

\n", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Packbuilder progress notification function.

\n", "comments": "" }, "git_reference_foreach_cb": { "type": "callback", "file": "git2/refs.h", - "line": 437, - "lineto": 437, + "line": 439, + "lineto": 439, "args": [ { "name": "reference", @@ -24051,8 +24481,8 @@ "git_reference_foreach_name_cb": { "type": "callback", "file": "git2/refs.h", - "line": 448, - "lineto": 448, + "line": 450, + "lineto": 450, "args": [ { "name": "name", @@ -24077,25 +24507,44 @@ "git_push_transfer_progress_cb": { "type": "callback", "file": "git2/remote.h", - "line": 470, - "lineto": 474, + "line": 481, + "lineto": 485, "args": [ - { "name": "current", "type": "unsigned int", "comment": null }, - { "name": "total", "type": "unsigned int", "comment": null }, - { "name": "bytes", "type": "size_t", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "current", + "type": "unsigned int", + "comment": "The number of objects pushed so far" + }, + { + "name": "total", + "type": "unsigned int", + "comment": "The total number of objects to push" + }, + { + "name": "bytes", + "type": "size_t", + "comment": "The number of bytes pushed" + }, + { + "name": "payload", + "type": "void *", + "comment": "The user-specified payload callback" + } ], "argline": "unsigned int current, unsigned int total, size_t bytes, void *payload", "sig": "unsigned int::unsigned int::size_t::void *", - "return": { "type": "int", "comment": null }, - "description": "

Push network progress notification function

\n", + "return": { + "type": "int", + "comment": " 0 or an error code to stop the transfer" + }, + "description": "

Push network progress notification callback.

\n", "comments": "" }, "git_push_negotiation": { "type": "callback", "file": "git2/remote.h", - "line": 506, - "lineto": 506, + "line": 518, + "lineto": 521, "args": [ { "name": "updates", @@ -24115,15 +24564,18 @@ ], "argline": "const git_push_update **updates, size_t len, void *payload", "sig": "const git_push_update **::size_t::void *", - "return": { "type": "int", "comment": null }, + "return": { + "type": "int", + "comment": " 0 or an error code to stop the push" + }, "description": "

Callback used to inform of upcoming updates.

\n", "comments": "" }, "git_push_update_reference_cb": { "type": "callback", "file": "git2/remote.h", - "line": 520, - "lineto": 520, + "line": 535, + "lineto": 535, "args": [ { "name": "refname", @@ -24153,8 +24605,8 @@ "git_url_resolve_cb": { "type": "callback", "file": "git2/remote.h", - "line": 536, - "lineto": 536, + "line": 551, + "lineto": 551, "args": [ { "name": "url_resolved", @@ -24189,8 +24641,8 @@ "git_remote_ready_cb": { "type": "callback", "file": "git2/remote.h", - "line": 549, - "lineto": 549, + "line": 564, + "lineto": 564, "args": [ { "name": "remote", @@ -24217,8 +24669,8 @@ "git_repository_fetchhead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 726, - "lineto": 730, + "line": 746, + "lineto": 750, "args": [ { "name": "ref_name", @@ -24258,8 +24710,8 @@ "git_repository_mergehead_foreach_cb": { "type": "callback", "file": "git2/repository.h", - "line": 757, - "lineto": 758, + "line": 777, + "lineto": 778, "args": [ { "name": "oid", @@ -24310,27 +24762,31 @@ "git_stash_apply_progress_cb": { "type": "callback", "file": "git2/stash.h", - "line": 169, - "lineto": 171, + "line": 181, + "lineto": 183, "args": [ { "name": "progress", "type": "git_stash_apply_progress_t", - "comment": null + "comment": "the progress information" }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "payload", + "type": "void *", + "comment": "the user-specified payload to the apply function" + } ], "argline": "git_stash_apply_progress_t progress, void *payload", "sig": "git_stash_apply_progress_t::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 on success, -1 on error" }, "description": "

Stash application progress notification function.\n Return 0 to continue processing, or a negative value to\n abort the stash application.

\n", "comments": "" }, "git_stash_cb": { "type": "callback", "file": "git2/stash.h", - "line": 255, - "lineto": 259, + "line": 268, + "lineto": 272, "args": [ { "name": "index", @@ -24365,24 +24821,39 @@ "git_status_cb": { "type": "callback", "file": "git2/status.h", - "line": 63, - "lineto": 64, + "line": 62, + "lineto": 63, "args": [ - { "name": "path", "type": "const char *", "comment": null }, - { "name": "status_flags", "type": "unsigned int", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "path", + "type": "const char *", + "comment": "is the path to the file" + }, + { + "name": "status_flags", + "type": "unsigned int", + "comment": "the `git_status_t` values for file's status" + }, + { + "name": "payload", + "type": "void *", + "comment": "the user-specified payload to the foreach function" + } ], "argline": "const char *path, unsigned int status_flags, void *payload", "sig": "const char *::unsigned int::void *", - "return": { "type": "int", "comment": null }, + "return": { + "type": "int", + "comment": " 0 on success, or a negative number on failure" + }, "description": "

Function pointer to receive status on individual files

\n", - "comments": "

path is the relative path to the file from the root of the repository.

\n\n

status_flags is a combination of git_status_t values that apply.

\n\n

payload is the value you passed to the foreach function as payload.

\n" + "comments": "" }, "git_submodule_cb": { "type": "callback", "file": "git2/submodule.h", - "line": 118, - "lineto": 119, + "line": 125, + "lineto": 126, "args": [ { "name": "sm", @@ -24432,11 +24903,19 @@ "git_trace_cb": { "type": "callback", "file": "git2/trace.h", - "line": 52, - "lineto": 52, + "line": 55, + "lineto": 57, "args": [ - { "name": "level", "type": "git_trace_level_t", "comment": null }, - { "name": "msg", "type": "const char *", "comment": null } + { + "name": "level", + "type": "git_trace_level_t", + "comment": "the trace level" + }, + { + "name": "msg", + "type": "const char *", + "comment": "the trace message" + } ], "argline": "git_trace_level_t level, const char *msg", "sig": "git_trace_level_t::const char *", @@ -24447,8 +24926,8 @@ "git_transport_message_cb": { "type": "callback", "file": "git2/transport.h", - "line": 34, - "lineto": 34, + "line": 35, + "lineto": 35, "args": [ { "name": "str", @@ -24468,55 +24947,93 @@ ], "argline": "const char *str, int len, void *payload", "sig": "const char *::int::void *", - "return": { "type": "int", "comment": null }, + "return": { "type": "int", "comment": " 0 on success or an error code" }, "description": "

Callback for messages received by the transport.

\n", "comments": "

Return a negative value to cancel the network operation.

\n" }, "git_transport_cb": { "type": "callback", "file": "git2/transport.h", - "line": 37, - "lineto": 37, + "line": 45, + "lineto": 45, "args": [ - { "name": "out", "type": "git_transport **", "comment": null }, - { "name": "owner", "type": "git_remote *", "comment": null }, - { "name": "param", "type": "void *", "comment": null } + { + "name": "out", + "type": "git_transport **", + "comment": "the transport generate" + }, + { + "name": "owner", + "type": "git_remote *", + "comment": "the owner for the transport" + }, + { + "name": "param", + "type": "void *", + "comment": "the param to the transport creation" + } ], "argline": "git_transport **out, git_remote *owner, void *param", "sig": "git_transport **::git_remote *::void *", - "return": { "type": "int", "comment": null }, - "description": "

Signature of a function which creates a transport

\n", + "return": { "type": "int", "comment": " 0 on success or an error code" }, + "description": "

Signature of a function which creates a transport.

\n", "comments": "" }, "git_treebuilder_filter_cb": { "type": "callback", "file": "git2/tree.h", - "line": 349, - "lineto": 350, + "line": 353, + "lineto": 354, "args": [ - { "name": "entry", "type": "const git_tree_entry *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "the tree entry for the callback to examine" + }, + { + "name": "payload", + "type": "void *", + "comment": "the payload from the caller" + } ], "argline": "const git_tree_entry *entry, void *payload", "sig": "const git_tree_entry *::void *", - "return": { "type": "int", "comment": null }, + "return": { + "type": "int", + "comment": " 0 to do nothing, non-zero to remove the entry" + }, "description": "

Callback for git_treebuilder_filter

\n", "comments": "

The return value is treated as a boolean, with zero indicating that the entry should be left alone and any non-zero value meaning that the entry should be removed from the treebuilder list (i.e. filtered out).

\n" }, "git_treewalk_cb": { "type": "callback", "file": "git2/tree.h", - "line": 383, - "lineto": 384, + "line": 394, + "lineto": 395, "args": [ - { "name": "root", "type": "const char *", "comment": null }, - { "name": "entry", "type": "const git_tree_entry *", "comment": null }, - { "name": "payload", "type": "void *", "comment": null } + { + "name": "root", + "type": "const char *", + "comment": "the current (relative) root to the entry" + }, + { + "name": "entry", + "type": "const git_tree_entry *", + "comment": "the tree entry" + }, + { + "name": "payload", + "type": "void *", + "comment": "the caller-provided callback payload" + } ], "argline": "const char *root, const git_tree_entry *entry, void *payload", "sig": "const char *::const git_tree_entry *::void *", - "return": { "type": "int", "comment": null }, - "description": "

Callback for the tree traversal method

\n", + "return": { + "type": "int", + "comment": " a positive value to skip the entry, a negative value to stop the walk" + }, + "description": "

Callback for the tree traversal method.

\n", "comments": "" } }, @@ -24529,11 +25046,11 @@ "type": "struct", "value": "git_annotated_commit", "file": "git2/types.h", - "line": 198, - "lineto": 198, + "line": 214, + "lineto": 214, "tdef": "typedef", - "description": " Annotated commits, the input to merge and rebase. ", - "comments": "", + "description": " Annotated commits are commits with additional metadata about how the\n commit was resolved, which can be used for maintaining the user's\n \"intent\" through commands like merge and rebase.", + "comments": "

For example, if a user wants to conceptually "merge HEAD", then the commit portion of an annotated commit will point to the HEAD commit, but the annotation will denote the ref HEAD. This allows git to perform the internal bookkeeping so that the system knows both the content of what is being merged but also how the content was looked up so that it can be recorded in the reflog appropriately.

\n", "used": { "returns": [], "needs": [ @@ -24561,12 +25078,12 @@ "decl": ["GIT_APPLY_CHECK"], "type": "enum", "file": "git2/apply.h", - "line": 61, - "lineto": 67, + "line": 72, + "lineto": 78, "block": "GIT_APPLY_CHECK", "tdef": "typedef", - "description": " Flags controlling the behavior of git_apply ", - "comments": "", + "description": " Flags controlling the behavior of `git_apply`.", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n", "fields": [ { "type": "int", @@ -24588,8 +25105,8 @@ ], "type": "enum", "file": "git2/apply.h", - "line": 127, - "lineto": 145, + "line": 148, + "lineto": 166, "block": "GIT_APPLY_LOCATION_WORKDIR\nGIT_APPLY_LOCATION_INDEX\nGIT_APPLY_LOCATION_BOTH", "tdef": "typedef", "description": " Possible application locations for git_apply ", @@ -24630,12 +25147,12 @@ "type": "struct", "value": "git_apply_options", "file": "git2/apply.h", - "line": 77, - "lineto": 91, + "line": 95, + "lineto": 109, "block": "unsigned int version\ngit_apply_delta_cb delta_cb\ngit_apply_hunk_cb hunk_cb\nvoid * payload\nunsigned int flags", "tdef": "typedef", - "description": " Apply options structure", - "comments": "

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", + "description": " Apply options structure.", + "comments": "

When the callback: - returns < 0, the apply process will be aborted. - returns > 0, the hunk will not be applied, but the apply process continues - returns 0, the hunk is applied, and the apply process continues.

\n\n

Initialize with GIT_APPLY_OPTIONS_INIT. Alternatively, you can use git_apply_options_init.

\n", "fields": [ { "type": "unsigned int", @@ -24655,12 +25172,12 @@ { "type": "void *", "name": "payload", - "comments": " Payload passed to both delta_cb \n&\n hunk_cb. " + "comments": " Payload passed to both `delta_cb` \n&\n `hunk_cb`. " }, { "type": "unsigned int", "name": "flags", - "comments": " Bitmask of git_apply_flags_t " + "comments": " Bitmask of `git_apply_flags_t` " } ], "used": { @@ -24681,8 +25198,8 @@ "type": "struct", "value": "git_attr_options", "file": "git2/attr.h", - "line": 142, - "lineto": 159, + "line": 154, + "lineto": 171, "block": "unsigned int version\nunsigned int flags\ngit_oid * commit_id\ngit_oid attr_commit_id", "tdef": "typedef", "description": " An options structure for querying attributes.", @@ -24722,8 +25239,8 @@ ], "type": "enum", "file": "git2/attr.h", - "line": 82, - "lineto": 87, + "line": 86, + "lineto": 91, "block": "GIT_ATTR_VALUE_UNSPECIFIED\nGIT_ATTR_VALUE_TRUE\nGIT_ATTR_VALUE_FALSE\nGIT_ATTR_VALUE_STRING", "tdef": "typedef", "description": " Possible states for an attribute", @@ -24764,24 +25281,31 @@ "type": "struct", "value": "git_blame", "file": "git2/blame.h", - "line": 202, - "lineto": 202, + "line": 236, + "lineto": 236, "tdef": "typedef", "description": " Opaque structure to hold blame results ", "comments": "", "used": { "returns": [ "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline" + "git_blame_get_hunk_byline", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_line_byindex" ], "needs": [ "git_blame_buffer", - "git_blame_file", "git_blame_free", "git_blame_get_hunk_byindex", "git_blame_get_hunk_byline", "git_blame_get_hunk_count", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_hunkcount", "git_blame_init_options", + "git_blame_line_byindex", + "git_blame_linecount", "git_blame_options_init" ] } @@ -24802,8 +25326,8 @@ ], "type": "enum", "file": "git2/blame.h", - "line": 26, - "lineto": 77, + "line": 31, + "lineto": 82, "block": "GIT_BLAME_NORMAL\nGIT_BLAME_TRACK_COPIES_SAME_FILE\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES\nGIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES\nGIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES\nGIT_BLAME_FIRST_PARENT\nGIT_BLAME_USE_MAILMAP\nGIT_BLAME_IGNORE_WHITESPACE", "tdef": "typedef", "description": " Flags for indicating option behavior for git_blame APIs.", @@ -24862,82 +25386,23 @@ } ], [ - "git_blame_hunk", + "git_blame_line", { - "decl": [ - "size_t lines_in_hunk", - "git_oid final_commit_id", - "size_t final_start_line_number", - "git_signature * final_signature", - "git_oid orig_commit_id", - "const char * orig_path", - "size_t orig_start_line_number", - "git_signature * orig_signature", - "char boundary" - ], + "decl": ["const char * ptr", "size_t len"], "type": "struct", - "value": "git_blame_hunk", + "value": "git_blame_line", "file": "git2/blame.h", - "line": 145, - "lineto": 198, - "block": "size_t lines_in_hunk\ngit_oid final_commit_id\nsize_t final_start_line_number\ngit_signature * final_signature\ngit_oid orig_commit_id\nconst char * orig_path\nsize_t orig_start_line_number\ngit_signature * orig_signature\nchar boundary", + "line": 230, + "lineto": 233, + "block": "const char * ptr\nsize_t len", "tdef": "typedef", - "description": " Structure that represents a blame hunk.", + "description": " Structure that represents a line in a blamed file.", "comments": "", "fields": [ - { - "type": "size_t", - "name": "lines_in_hunk", - "comments": " The number of lines in this hunk." - }, - { - "type": "git_oid", - "name": "final_commit_id", - "comments": " The OID of the commit where this line was last changed." - }, - { - "type": "size_t", - "name": "final_start_line_number", - "comments": " The 1-based line number where this hunk begins, in the final version\n of the file." - }, - { - "type": "git_signature *", - "name": "final_signature", - "comments": " The author of `final_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." - }, - { - "type": "git_oid", - "name": "orig_commit_id", - "comments": " The OID of the commit where this hunk was found.\n This will usually be the same as `final_commit_id`, except when\n `GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES` has been specified." - }, - { - "type": "const char *", - "name": "orig_path", - "comments": " The path to the file where this hunk originated, as of the commit\n specified by `orig_commit_id`." - }, - { - "type": "size_t", - "name": "orig_start_line_number", - "comments": " The 1-based line number where this hunk begins in the file named by\n `orig_path` in the commit specified by `orig_commit_id`." - }, - { - "type": "git_signature *", - "name": "orig_signature", - "comments": " The author of `orig_commit_id`. If `GIT_BLAME_USE_MAILMAP` has been\n specified, it will contain the canonical real name and email address." - }, - { - "type": "char", - "name": "boundary", - "comments": " The 1 iff the hunk has been tracked to a boundary commit (the root,\n or the commit specified in git_blame_options.oldest_commit)" - } + { "type": "const char *", "name": "ptr", "comments": "" }, + { "type": "size_t", "name": "len", "comments": "" } ], - "used": { - "returns": [ - "git_blame_get_hunk_byindex", - "git_blame_get_hunk_byline" - ], - "needs": [] - } + "used": { "returns": ["git_blame_line_byindex"], "needs": [] } } ], [ @@ -24945,7 +25410,7 @@ { "decl": [ "unsigned int version", - "uint32_t flags", + "unsigned int flags", "uint16_t min_match_characters", "git_oid newest_commit", "git_oid oldest_commit", @@ -24955,16 +25420,16 @@ "type": "struct", "value": "git_blame_options", "file": "git2/blame.h", - "line": 86, - "lineto": 123, - "block": "unsigned int version\nuint32_t flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", + "line": 91, + "lineto": 128, + "block": "unsigned int version\nunsigned int flags\nuint16_t min_match_characters\ngit_oid newest_commit\ngit_oid oldest_commit\nsize_t min_line\nsize_t max_line", "tdef": "typedef", "description": " Blame options structure", "comments": "

Initialize with GIT_BLAME_OPTIONS_INIT. Alternatively, you can use git_blame_options_init.

\n", "fields": [ { "type": "unsigned int", "name": "version", "comments": "" }, { - "type": "uint32_t", + "type": "unsigned int", "name": "flags", "comments": " A combination of `git_blame_flag_t` " }, @@ -24996,11 +25461,7 @@ ], "used": { "returns": [], - "needs": [ - "git_blame_file", - "git_blame_init_options", - "git_blame_options_init" - ] + "needs": ["git_blame_init_options", "git_blame_options_init"] } } ], @@ -25011,8 +25472,8 @@ "type": "struct", "value": "git_blob", "file": "git2/types.h", - "line": 133, - "lineto": 133, + "line": 138, + "lineto": 138, "tdef": "typedef", "description": " In-memory representation of a blob object. ", "comments": "", @@ -25054,8 +25515,8 @@ ], "type": "enum", "file": "git2/blob.h", - "line": 102, - "lineto": 123, + "line": 111, + "lineto": 132, "block": "GIT_BLOB_FILTER_CHECK_FOR_BINARY\nGIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT", "tdef": "typedef", "description": " Flags to control the functionality of `git_blob_filter`.", @@ -25101,20 +25562,28 @@ "type": "struct", "value": "git_blob_filter_options", "file": "git2/blob.h", - "line": 132, - "lineto": 149, + "line": 144, + "lineto": 176, "block": "int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", "tdef": "typedef", "description": " The options used when applying filter options to a file.", - "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n", + "comments": "

Initialize with GIT_BLOB_FILTER_OPTIONS_INIT. Alternatively, you can use git_blob_filter_options_init.

\n\n

[version] GIT_BLOB_FILTER_OPTIONS_VERSION [init_macro] GIT_BLOB_FILTER_OPTIONS_INIT [init_function] git_blob_filter_options_init

\n", "fields": [ - { "type": "int", "name": "version", "comments": "" }, + { + "type": "int", + "name": "version", + "comments": " Version number of the options structure. " + }, { "type": "uint32_t", "name": "flags", - "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above " + "comments": " Flags to control the filtering process, see `git_blob_filter_flag_t` above.\n\n \n\n[flags] git_blob_filter_flag_t" + }, + { + "type": "git_oid *", + "name": "commit_id", + "comments": " This value is unused and reserved for API compatibility.\n\n " }, - { "type": "git_oid *", "name": "commit_id", "comments": "" }, { "type": "git_oid", "name": "attr_commit_id", @@ -25134,8 +25603,8 @@ "type": "struct", "value": "git_branch_iterator", "file": "git2/branch.h", - "line": 90, - "lineto": 90, + "line": 97, + "lineto": 97, "tdef": "typedef", "description": " Iterator type for branches ", "comments": "", @@ -25155,8 +25624,8 @@ "decl": ["GIT_BRANCH_LOCAL", "GIT_BRANCH_REMOTE", "GIT_BRANCH_ALL"], "type": "enum", "file": "git2/types.h", - "line": 215, - "lineto": 219, + "line": 231, + "lineto": 235, "block": "GIT_BRANCH_LOCAL\nGIT_BRANCH_REMOTE\nGIT_BRANCH_ALL", "tdef": "typedef", "description": " Basic type of any Git branch. ", @@ -25198,8 +25667,8 @@ "type": "struct", "value": "git_buf", "file": "git2/buffer.h", - "line": 33, - "lineto": 52, + "line": 36, + "lineto": 55, "block": "char * ptr\nsize_t reserved\nsize_t size", "tdef": "typedef", "description": " A data buffer for exporting data from libgit2", @@ -25253,14 +25722,12 @@ "git_diff_stats_to_buf", "git_diff_to_buf", "git_email_create_from_commit", - "git_email_create_from_diff", "git_filter_list_apply_to_blob", "git_filter_list_apply_to_buffer", "git_filter_list_apply_to_data", "git_filter_list_apply_to_file", "git_filter_list_stream_data", "git_message_prettify", - "git_note_default_ref", "git_object_short_id", "git_packbuilder_write_buf", "git_patch_to_buf", @@ -25285,8 +25752,8 @@ "type": "struct", "value": "git_cert", "file": "git2/types.h", - "line": 262, - "lineto": 262, + "line": 278, + "lineto": 278, "block": "git_cert_t cert_type", "tdef": "typedef", "description": " Parent type for `git_cert_hostkey` and `git_cert_x509`.", @@ -25510,8 +25977,8 @@ ], "type": "enum", "file": "git2/checkout.h", - "line": 214, - "lineto": 245, + "line": 224, + "lineto": 255, "block": "GIT_CHECKOUT_NOTIFY_NONE\nGIT_CHECKOUT_NOTIFY_CONFLICT\nGIT_CHECKOUT_NOTIFY_DIRTY\nGIT_CHECKOUT_NOTIFY_UPDATED\nGIT_CHECKOUT_NOTIFY_UNTRACKED\nGIT_CHECKOUT_NOTIFY_IGNORED\nGIT_CHECKOUT_NOTIFY_ALL", "tdef": "typedef", "description": " Checkout notification flags", @@ -25591,12 +26058,12 @@ "type": "struct", "value": "git_checkout_options", "file": "git2/checkout.h", - "line": 282, - "lineto": 345, + "line": 317, + "lineto": 391, "block": "unsigned int version\nunsigned int checkout_strategy\nint disable_filters\nunsigned int dir_mode\nunsigned int file_mode\nint file_open_flags\nunsigned int notify_flags\ngit_checkout_notify_cb notify_cb\nvoid * notify_payload\ngit_checkout_progress_cb progress_cb\nvoid * progress_payload\ngit_strarray paths\ngit_tree * baseline\ngit_index * baseline_index\nconst char * target_directory\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_checkout_perfdata_cb perfdata_cb\nvoid * perfdata_payload", "tdef": "typedef", "description": " Checkout options structure", - "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n", + "comments": "

Initialize with GIT_CHECKOUT_OPTIONS_INIT. Alternatively, you can use git_checkout_options_init.

\n\n

[version] GIT_CHECKOUT_OPTIONS_VERSION [init_macro] GIT_CHECKOUT_OPTIONS_INIT [init_function] git_checkout_options_init

\n", "fields": [ { "type": "unsigned int", @@ -25631,7 +26098,7 @@ { "type": "unsigned int", "name": "notify_flags", - "comments": " see `git_checkout_notify_t` above " + "comments": " Checkout notification flags specify what operations the notify\n callback is invoked for.\n\n \n\n[flags] git_checkout_notify_t" }, { "type": "git_checkout_notify_cb", @@ -25724,8 +26191,8 @@ "type": "struct", "value": "git_checkout_perfdata", "file": "git2/checkout.h", - "line": 248, - "lineto": 252, + "line": 258, + "lineto": 262, "block": "size_t mkdir_calls\nsize_t stat_calls\nsize_t chmod_calls", "tdef": "typedef", "description": " Checkout performance-reporting structure ", @@ -25742,7 +26209,6 @@ "git_checkout_strategy_t", { "decl": [ - "GIT_CHECKOUT_NONE", "GIT_CHECKOUT_SAFE", "GIT_CHECKOUT_FORCE", "GIT_CHECKOUT_RECREATE_MISSING", @@ -25764,34 +26230,29 @@ "GIT_CHECKOUT_DONT_WRITE_INDEX", "GIT_CHECKOUT_DRY_RUN", "GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3", + "GIT_CHECKOUT_NONE", "GIT_CHECKOUT_UPDATE_SUBMODULES", "GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED" ], "type": "enum", "file": "git2/checkout.h", - "line": 106, - "lineto": 198, - "block": "GIT_CHECKOUT_NONE\nGIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", + "line": 113, + "lineto": 206, + "block": "GIT_CHECKOUT_SAFE\nGIT_CHECKOUT_FORCE\nGIT_CHECKOUT_RECREATE_MISSING\nGIT_CHECKOUT_ALLOW_CONFLICTS\nGIT_CHECKOUT_REMOVE_UNTRACKED\nGIT_CHECKOUT_REMOVE_IGNORED\nGIT_CHECKOUT_UPDATE_ONLY\nGIT_CHECKOUT_DONT_UPDATE_INDEX\nGIT_CHECKOUT_NO_REFRESH\nGIT_CHECKOUT_SKIP_UNMERGED\nGIT_CHECKOUT_USE_OURS\nGIT_CHECKOUT_USE_THEIRS\nGIT_CHECKOUT_DISABLE_PATHSPEC_MATCH\nGIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES\nGIT_CHECKOUT_DONT_OVERWRITE_IGNORED\nGIT_CHECKOUT_CONFLICT_STYLE_MERGE\nGIT_CHECKOUT_CONFLICT_STYLE_DIFF3\nGIT_CHECKOUT_DONT_REMOVE_EXISTING\nGIT_CHECKOUT_DONT_WRITE_INDEX\nGIT_CHECKOUT_DRY_RUN\nGIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3\nGIT_CHECKOUT_NONE\nGIT_CHECKOUT_UPDATE_SUBMODULES\nGIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED", "tdef": "typedef", "description": " Checkout behavior flags", - "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of three strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_NONE is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_FORCE is at the opposite extreme, taking any action to make the working directory match the target (including potentially discarding modified files).

  • \n
  • GIT_CHECKOUT_SAFE is between these two options, it will only make modifications that will not lose changes.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", + "comments": "

In libgit2, checkout is used to update the working directory and index to match a target tree. Unlike git checkout, it does not move the HEAD commit for you - use git_repository_set_head or the like to do that.

\n\n

Checkout looks at (up to) four things: the "target" tree you want to check out, the "baseline" tree of what was checked out previously, the working directory for actual files, and the index for staged changes.

\n\n

You give checkout one of two strategies for update:

\n\n
    \n
  • GIT_CHECKOUT_SAFE is the default, and similar to git's default, which will make modifications that will not lose changes in the working directory.

    \n\n
                     |  target == baseline   |  target != baseline  |    ---------------------|-----------------------|----------------------|     workdir == baseline |       no action       |  create, update, or  |                         |                       |     delete file      |    ---------------------|-----------------------|----------------------|     workdir exists and  |       no action       |   conflict (notify   |       is != baseline    | notify dirty MODIFIED | and cancel checkout) |    ---------------------|-----------------------|----------------------|      workdir missing,   | notify dirty DELETED  |     create file      |      baseline present   |                       |                      |    ---------------------|-----------------------|----------------------|\n
  • \n
  • GIT_CHECKOUT_FORCE will take any action to make the working directory match the target (including potentially discarding modified files).

  • \n
\n\n

To emulate git checkout, use GIT_CHECKOUT_SAFE with a checkout notification callback (see below) that displays information about dirty files. The default behavior will cancel checkout on conflicts.

\n\n

To emulate git checkout-index, use GIT_CHECKOUT_SAFE with a notification callback that cancels the operation if a dirty-but-existing file is found in the working directory. This core git command isn't quite "force" but is sensitive about some types of changes.

\n\n

To emulate git checkout -f, use GIT_CHECKOUT_FORCE.

\n\n

There are some additional flags to modify the behavior of checkout:

\n\n
    \n
  • GIT_CHECKOUT_DRY_RUN is a dry-run strategy that checks for conflicts, etc., but doesn't make any actual changes.

  • \n
  • GIT_CHECKOUT_ALLOW_CONFLICTS makes SAFE mode apply safe file updates even if there are conflicts (instead of cancelling the checkout).

  • \n
  • GIT_CHECKOUT_REMOVE_UNTRACKED means remove untracked files (i.e. not in target, baseline, or index, and not ignored) from the working dir.

  • \n
  • GIT_CHECKOUT_REMOVE_IGNORED means remove ignored files (that are also untracked) from the working directory as well.

  • \n
  • GIT_CHECKOUT_UPDATE_ONLY means to only update the content of files that already exist. Files will not be created nor deleted. This just skips applying adds, deletes, and typechanges.

  • \n
  • GIT_CHECKOUT_DONT_UPDATE_INDEX prevents checkout from writing the updated files' information to the index.

  • \n
  • Normally, checkout will reload the index and git attributes from disk before any operations. GIT_CHECKOUT_NO_REFRESH prevents this reload.

  • \n
  • Unmerged index entries are conflicts. GIT_CHECKOUT_SKIP_UNMERGED skips files with unmerged index entries instead. GIT_CHECKOUT_USE_OURS and GIT_CHECKOUT_USE_THEIRS to proceed with the checkout using either the stage 2 ("ours") or stage 3 ("theirs") version of files in the index.

  • \n
  • GIT_CHECKOUT_DONT_OVERWRITE_IGNORED prevents ignored files from being overwritten. Normally, files that are ignored in the working directory are not considered "precious" and may be overwritten if the checkout target contains that file.

  • \n
  • GIT_CHECKOUT_DONT_REMOVE_EXISTING prevents checkout from removing files or folders that fold to the same name on case insensitive filesystems. This can cause files to retain their existing names and write through existing symbolic links.

  • \n
\n", "fields": [ - { - "type": "int", - "name": "GIT_CHECKOUT_NONE", - "comments": "

default is a dry run, no actual updates

\n", - "value": 0 - }, { "type": "int", "name": "GIT_CHECKOUT_SAFE", - "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked out files,\n the checkout will still proceed, leaving the changes intact.

\n\n

Mutually exclusive with GIT_CHECKOUT_FORCE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", - "value": 1 + "comments": "

Allow safe updates that cannot overwrite uncommitted data.\n If the uncommitted changes don't conflict with the checked\n out files, the checkout will still proceed, leaving the\n changes intact.

\n", + "value": 0 }, { "type": "int", "name": "GIT_CHECKOUT_FORCE", - "comments": "

Allow all updates to force working directory to look like index.

\n\n

Mutually exclusive with GIT_CHECKOUT_SAFE.\n GIT_CHECKOUT_FORCE takes precedence over GIT_CHECKOUT_SAFE.

\n", + "comments": "

Allow all updates to force working directory to look like\n the index, potentially losing data in the process.

\n", "value": 2 }, { @@ -25899,7 +26360,7 @@ { "type": "int", "name": "GIT_CHECKOUT_DRY_RUN", - "comments": "

Show what would be done by a checkout. Stop after sending\n notifications; don't update the working directory or index.

\n", + "comments": "

Perform a "dry run", reporting what would be done but\n without actually making changes in the working directory\n or the index.

\n", "value": 16777216 }, { @@ -25908,6 +26369,12 @@ "comments": "

Include common ancestor data in zdiff3 format for conflicts

\n", "value": 33554432 }, + { + "type": "int", + "name": "GIT_CHECKOUT_NONE", + "comments": "

Do not do a checkout and do not fire callbacks; this is primarily\n useful only for internal functions that will perform the\n checkout themselves but need to pass checkout options into\n another function, for example, git_clone.

\n", + "value": 1073741824 + }, { "type": "int", "name": "GIT_CHECKOUT_UPDATE_SUBMODULES", @@ -25936,8 +26403,8 @@ "type": "struct", "value": "git_cherrypick_options", "file": "git2/cherrypick.h", - "line": 26, - "lineto": 34, + "line": 29, + "lineto": 37, "block": "unsigned int version\nunsigned int mainline\ngit_merge_options merge_opts\ngit_checkout_options checkout_opts", "tdef": "typedef", "description": " Cherry-pick options", @@ -25977,8 +26444,8 @@ ], "type": "enum", "file": "git2/clone.h", - "line": 33, - "lineto": 53, + "line": 37, + "lineto": 57, "block": "GIT_CLONE_LOCAL_AUTO\nGIT_CLONE_LOCAL\nGIT_CLONE_NO_LOCAL\nGIT_CLONE_LOCAL_NO_LINKS", "tdef": "typedef", "description": " Options for bypassing the git-aware transport on clone. Bypassing\n it means that instead of a fetch, libgit2 will copy the object\n database directory instead of figuring out what it needs, which is\n faster. If possible, it will hardlink the files to save space.", @@ -26030,18 +26497,18 @@ "type": "struct", "value": "git_clone_options", "file": "git2/clone.h", - "line": 103, - "lineto": 164, + "line": 110, + "lineto": 171, "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint bare\ngit_clone_local_t local\nconst char * checkout_branch\ngit_repository_create_cb repository_cb\nvoid * repository_cb_payload\ngit_remote_create_cb remote_cb\nvoid * remote_cb_payload", "tdef": "typedef", "description": " Clone options structure", - "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n", + "comments": "

Initialize with GIT_CLONE_OPTIONS_INIT. Alternatively, you can use git_clone_options_init.

\n\n

[version] GIT_CLONE_OPTIONS_VERSION [init_macro] GIT_CLONE_OPTIONS_INIT [init_function] git_clone_options_init

\n", "fields": [ { "type": "unsigned int", "name": "version", "comments": "" }, { "type": "git_checkout_options", "name": "checkout_opts", - "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`." + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to `GIT_CHECKOUT_NONE`\n or `GIT_CHECKOUT_DRY_RUN`." }, { "type": "git_fetch_options", @@ -26097,8 +26564,8 @@ "type": "struct", "value": "git_commit", "file": "git2/types.h", - "line": 136, - "lineto": 136, + "line": 141, + "lineto": 141, "tdef": "typedef", "description": " Parsed representation of a commit object. ", "comments": "", @@ -26142,10 +26609,6 @@ "git_diff_commit_as_email", "git_email_create_from_commit", "git_merge_commits", - "git_note_commit_create", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_commit_remove", "git_odb_set_commit_graph", "git_repository_commit_parents", "git_revert", @@ -26161,8 +26624,8 @@ "type": "struct", "value": "git_commit_graph", "file": "git2/types.h", - "line": 109, - "lineto": 109, + "line": 114, + "lineto": 114, "tdef": "typedef", "description": " A git commit-graph ", "comments": "", @@ -26175,8 +26638,8 @@ "decl": ["GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE"], "type": "enum", "file": "git2/sys/commit_graph.h", - "line": 102, - "lineto": 108, + "line": 93, + "lineto": 99, "block": "GIT_COMMIT_GRAPH_SPLIT_STRATEGY_SINGLE_FILE", "tdef": "typedef", "description": " The strategy to use when adding a new set of commits to a pre-existing\n commit-graph chain.", @@ -26199,8 +26662,8 @@ "type": "struct", "value": "git_commit_graph_writer", "file": "git2/types.h", - "line": 112, - "lineto": 112, + "line": 117, + "lineto": 117, "tdef": "typedef", "description": " a writer for commit-graph files. ", "comments": "", @@ -26214,8 +26677,8 @@ "type": "struct", "value": "git_commitarray", "file": "git2/commit.h", - "line": 588, - "lineto": 591, + "line": 655, + "lineto": 658, "block": "git_commit *const * commits\nsize_t count", "tdef": "typedef", "description": " An array of commits returned from the library ", @@ -26237,8 +26700,8 @@ "type": "struct", "value": "git_config", "file": "git2/types.h", - "line": 157, - "lineto": 157, + "line": 162, + "lineto": 162, "tdef": "typedef", "description": " Memory representation of a set of config files ", "comments": "", @@ -26280,6 +26743,7 @@ "git_config_set_int64", "git_config_set_multivar", "git_config_set_string", + "git_config_set_writeorder", "git_config_snapshot", "git_repository_config", "git_repository_config_snapshot" @@ -26294,8 +26758,8 @@ "type": "struct", "value": "git_config_backend", "file": "git2/types.h", - "line": 160, - "lineto": 160, + "line": 165, + "lineto": 165, "tdef": "typedef", "description": " Interface to access a configuration file ", "comments": "", @@ -26313,8 +26777,8 @@ "type": "struct", "value": "git_config_backend_memory_options", "file": "git2/sys/config.h", - "line": 129, - "lineto": 143, + "line": 148, + "lineto": 162, "block": "unsigned int version\nconst char * backend_type\nconst char * origin_path", "tdef": "typedef", "description": " Options for in-memory configuration backends. ", @@ -26344,15 +26808,14 @@ "const char * backend_type", "const char * origin_path", "unsigned int include_depth", - "git_config_level_t level", - "void (*)(struct git_config_entry *) free" + "git_config_level_t level" ], "type": "struct", "value": "git_config_entry", "file": "git2/config.h", - "line": 79, - "lineto": 106, - "block": "const char * name\nconst char * value\nconst char * backend_type\nconst char * origin_path\nunsigned int include_depth\ngit_config_level_t level\nvoid (*)(struct git_config_entry *) free", + "line": 103, + "lineto": 124, + "block": "const char * name\nconst char * value\nconst char * backend_type\nconst char * origin_path\nunsigned int include_depth\ngit_config_level_t level", "tdef": "typedef", "description": " An entry in a configuration file", "comments": "", @@ -26360,17 +26823,17 @@ { "type": "const char *", "name": "name", - "comments": " Name of the configuration entry (normalized) " + "comments": " Name of the configuration entry (normalized). " }, { "type": "const char *", "name": "value", - "comments": " Literal (string) value of the entry " + "comments": " Literal (string) value of the entry. " }, { "type": "const char *", "name": "backend_type", - "comments": " The type of backend that this entry exists in (eg, \"file\") " + "comments": " The type of backend that this entry exists in (eg, \"file\"). " }, { "type": "const char *", @@ -26380,17 +26843,12 @@ { "type": "unsigned int", "name": "include_depth", - "comments": " Depth of includes where this variable was found " + "comments": " Depth of includes where this variable was found. " }, { "type": "git_config_level_t", "name": "level", - "comments": " Configuration level for the file this was found in " - }, - { - "type": "void (*)(struct git_config_entry *)", - "name": "free", - "comments": "" + "comments": " Configuration level for the file this was found in. " } ], "used": { @@ -26411,10 +26869,10 @@ "type": "struct", "value": "git_config_iterator", "file": "git2/config.h", - "line": 127, - "lineto": 127, + "line": 145, + "lineto": 145, "tdef": "typedef", - "description": " An opaque structure for a configuration iterator", + "description": " An opaque structure for a configuration iterator.", "comments": "", "used": { "returns": [], @@ -26443,8 +26901,8 @@ ], "type": "enum", "file": "git2/config.h", - "line": 42, - "lineto": 74, + "line": 49, + "lineto": 98, "block": "GIT_CONFIG_LEVEL_PROGRAMDATA\nGIT_CONFIG_LEVEL_SYSTEM\nGIT_CONFIG_LEVEL_XDG\nGIT_CONFIG_LEVEL_GLOBAL\nGIT_CONFIG_LEVEL_LOCAL\nGIT_CONFIG_LEVEL_WORKTREE\nGIT_CONFIG_LEVEL_APP\nGIT_CONFIG_HIGHEST_LEVEL", "tdef": "typedef", "description": " Priority level of a config file.", @@ -26453,55 +26911,59 @@ { "type": "int", "name": "GIT_CONFIG_LEVEL_PROGRAMDATA", - "comments": "

System-wide on Windows, for compatibility with portable git

\n", + "comments": "

System-wide on Windows, for compatibility with "Portable Git".

\n", "value": 1 }, { "type": "int", "name": "GIT_CONFIG_LEVEL_SYSTEM", - "comments": "

System-wide configuration file; /etc/gitconfig on Linux systems

\n", + "comments": "

System-wide configuration file; /etc/gitconfig on Linux.

\n", "value": 2 }, { "type": "int", "name": "GIT_CONFIG_LEVEL_XDG", - "comments": "

XDG compatible configuration file; typically ~/.config/git/config

\n", + "comments": "

XDG compatible configuration file; typically\n ~/.config/git/config.

\n", "value": 3 }, { "type": "int", "name": "GIT_CONFIG_LEVEL_GLOBAL", - "comments": "

User-specific configuration file (also called Global configuration\n file); typically ~/.gitconfig

\n", + "comments": "

Global configuration file is the user-specific configuration;\n typically ~/.gitconfig.

\n", "value": 4 }, { "type": "int", "name": "GIT_CONFIG_LEVEL_LOCAL", - "comments": "

Repository specific configuration file; $WORK_DIR/.git/config on\n non-bare repos

\n", + "comments": "

Local configuration, the repository-specific configuration file;\n typically $GIT_DIR/config.

\n", "value": 5 }, { "type": "int", "name": "GIT_CONFIG_LEVEL_WORKTREE", - "comments": "

Worktree specific configuration file; $GIT_DIR/config.worktree

\n", + "comments": "

Worktree-specific configuration; typically\n $GIT_DIR/config.worktree.

\n", "value": 6 }, { "type": "int", "name": "GIT_CONFIG_LEVEL_APP", - "comments": "

Application specific configuration file; freely defined by applications

\n", + "comments": "

Application-specific configuration file. Callers into libgit2\n can add their own configuration beginning at this level.

\n", "value": 7 }, { "type": "int", "name": "GIT_CONFIG_HIGHEST_LEVEL", - "comments": "

Represents the highest level available config file (i.e. the most\n specific config file available that actually is loaded)

\n", + "comments": "

Not a configuration level; callers can use this value when\n querying configuration levels to specify that they want to\n have data from the highest-level currently configuration.\n This can be used to indicate that callers want the most\n specific config file available that actually is loaded.

\n", "value": -1 } ], "used": { "returns": [], - "needs": ["git_config_add_file_ondisk", "git_config_open_level"] + "needs": [ + "git_config_add_file_ondisk", + "git_config_open_level", + "git_config_set_writeorder" + ] } } ], @@ -26516,8 +26978,8 @@ "type": "struct", "value": "git_configmap", "file": "git2/config.h", - "line": 142, - "lineto": 146, + "line": 160, + "lineto": 164, "block": "git_configmap_t type\nconst char * str_match\nint map_value", "tdef": "typedef", "description": " Mapping from config variables to values.", @@ -26544,8 +27006,8 @@ ], "type": "enum", "file": "git2/config.h", - "line": 132, - "lineto": 137, + "line": 150, + "lineto": 155, "block": "GIT_CONFIGMAP_FALSE\nGIT_CONFIGMAP_TRUE\nGIT_CONFIGMAP_INT32\nGIT_CONFIGMAP_STRING", "tdef": "typedef", "description": " Config var type", @@ -26586,8 +27048,8 @@ "type": "struct", "value": "git_credential", "file": "git2/credential.h", - "line": 84, - "lineto": 84, + "line": 87, + "lineto": 87, "tdef": "typedef", "description": " The base structure for all credential types", "comments": "", @@ -26618,8 +27080,8 @@ "type": "struct", "value": "git_credential_default", "file": "git2/credential.h", - "line": 92, - "lineto": 92, + "line": 95, + "lineto": 95, "tdef": "typedef", "description": " A key for NTLM/Kerberos \"default\" credentials ", "comments": "", @@ -26633,8 +27095,8 @@ "type": "struct", "value": "git_credential_ssh_custom", "file": "git2/credential.h", - "line": 107, - "lineto": 107, + "line": 110, + "lineto": 110, "tdef": "typedef", "description": " A key with a custom signature function", "comments": "", @@ -26648,8 +27110,8 @@ "type": "struct", "value": "git_credential_ssh_interactive", "file": "git2/credential.h", - "line": 102, - "lineto": 102, + "line": 105, + "lineto": 105, "tdef": "typedef", "description": " Keyboard-interactive based ssh authentication", "comments": "", @@ -26666,8 +27128,8 @@ "type": "struct", "value": "git_credential_ssh_key", "file": "git2/credential.h", - "line": 97, - "lineto": 97, + "line": 100, + "lineto": 100, "tdef": "typedef", "description": " A ssh key from disk", "comments": "", @@ -26688,8 +27150,8 @@ ], "type": "enum", "file": "git2/credential.h", - "line": 27, - "lineto": 79, + "line": 30, + "lineto": 82, "block": "GIT_CREDENTIAL_USERPASS_PLAINTEXT\nGIT_CREDENTIAL_SSH_KEY\nGIT_CREDENTIAL_SSH_CUSTOM\nGIT_CREDENTIAL_DEFAULT\nGIT_CREDENTIAL_SSH_INTERACTIVE\nGIT_CREDENTIAL_USERNAME\nGIT_CREDENTIAL_SSH_MEMORY", "tdef": "typedef", "description": " Supported credential types", @@ -26748,8 +27210,8 @@ "type": "struct", "value": "git_credential_username", "file": "git2/credential.h", - "line": 89, - "lineto": 89, + "line": 92, + "lineto": 92, "tdef": "typedef", "description": " Username-only credential information ", "comments": "", @@ -26886,8 +27348,8 @@ "type": "struct", "value": "git_describe_format_options", "file": "git2/describe.h", - "line": 91, - "lineto": 111, + "line": 100, + "lineto": 120, "block": "unsigned int version\nunsigned int abbreviated_size\nint always_use_long_format\nconst char * dirty_suffix", "tdef": "typedef", "description": " Describe format options structure", @@ -26930,8 +27392,8 @@ "type": "struct", "value": "git_describe_options", "file": "git2/describe.h", - "line": 43, - "lineto": 61, + "line": 47, + "lineto": 65, "block": "unsigned int version\nunsigned int max_candidates_tags\nunsigned int describe_strategy\nconst char * pattern\nint only_follow_first_parent\nint show_commit_oid_as_fallback", "tdef": "typedef", "description": " Describe options structure", @@ -26977,8 +27439,8 @@ "type": "struct", "value": "git_describe_result", "file": "git2/describe.h", - "line": 134, - "lineto": 134, + "line": 146, + "lineto": 146, "tdef": "typedef", "description": " A struct that stores the result of a describe operation.", "comments": "", @@ -27003,8 +27465,8 @@ ], "type": "enum", "file": "git2/describe.h", - "line": 30, - "lineto": 34, + "line": 34, + "lineto": 38, "block": "GIT_DESCRIBE_DEFAULT\nGIT_DESCRIBE_TAGS\nGIT_DESCRIBE_ALL", "tdef": "typedef", "description": " Reference lookup strategy", @@ -27095,7 +27557,6 @@ "git_diff_tree_to_tree", "git_diff_tree_to_workdir", "git_diff_tree_to_workdir_with_index", - "git_email_create_from_diff", "git_patch_from_blob_and_buffer", "git_patch_from_blobs", "git_patch_from_buffers", @@ -27119,8 +27580,8 @@ "type": "struct", "value": "git_diff_binary", "file": "git2/diff.h", - "line": 544, - "lineto": 556, + "line": 553, + "lineto": 565, "block": "unsigned int contains_data\ngit_diff_binary_file old_file\ngit_diff_binary_file new_file", "tdef": "typedef", "description": " Structure describing the binary contents of a diff.", @@ -27166,8 +27627,8 @@ "type": "struct", "value": "git_diff_binary_file", "file": "git2/diff.h", - "line": 521, - "lineto": 533, + "line": 530, + "lineto": 542, "block": "git_diff_binary_t type\nconst char * data\nsize_t datalen\nsize_t inflatedlen", "tdef": "typedef", "description": " The contents of one of the files in a binary diff. ", @@ -27207,8 +27668,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 509, - "lineto": 518, + "line": 518, + "lineto": 527, "block": "GIT_DIFF_BINARY_NONE\nGIT_DIFF_BINARY_LITERAL\nGIT_DIFF_BINARY_DELTA", "tdef": "typedef", "description": " When producing a binary diff, the binary data returned will be\n either the deflated full (\"literal\") contents of the file, or\n the deflated binary delta between the two sides (whichever is\n smaller).", @@ -27373,8 +27834,8 @@ "type": "struct", "value": "git_diff_find_options", "file": "git2/diff.h", - "line": 749, - "lineto": 803, + "line": 774, + "lineto": 828, "block": "unsigned int version\nuint32_t flags\nuint16_t rename_threshold\nuint16_t rename_from_rewrite_threshold\nuint16_t copy_threshold\nuint16_t break_rewrite_threshold\nsize_t rename_limit\ngit_diff_similarity_metric * metric", "tdef": "typedef", "description": " Control behavior of rename and copy detection", @@ -27446,8 +27907,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 658, - "lineto": 727, + "line": 683, + "lineto": 752, "block": "GIT_DIFF_FIND_BY_CONFIG\nGIT_DIFF_FIND_RENAMES\nGIT_DIFF_FIND_RENAMES_FROM_REWRITES\nGIT_DIFF_FIND_COPIES\nGIT_DIFF_FIND_COPIES_FROM_UNMODIFIED\nGIT_DIFF_FIND_REWRITES\nGIT_DIFF_BREAK_REWRITES\nGIT_DIFF_FIND_AND_BREAK_REWRITES\nGIT_DIFF_FIND_FOR_UNTRACKED\nGIT_DIFF_FIND_ALL\nGIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE\nGIT_DIFF_FIND_IGNORE_WHITESPACE\nGIT_DIFF_FIND_DONT_IGNORE_WHITESPACE\nGIT_DIFF_FIND_EXACT_MATCH_ONLY\nGIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY\nGIT_DIFF_FIND_REMOVE_UNMODIFIED", "tdef": "typedef", "description": " Flags to control the behavior of diff rename/copy detection.", @@ -27615,8 +28076,8 @@ ], "type": "enum", "file": "git2/deprecated.h", - "line": 311, - "lineto": 318, + "line": 325, + "lineto": 331, "block": "GIT_DIFF_FORMAT_EMAIL_NONE\nGIT_DIFF_FORMAT_EMAIL_EXCLUDE_SUBJECT_PATCH_MARKER", "tdef": "typedef", "description": " Formatting options for diff e-mail generation", @@ -27654,8 +28115,8 @@ "type": "struct", "value": "git_diff_format_email_options", "file": "git2/deprecated.h", - "line": 323, - "lineto": 346, + "line": 338, + "lineto": 361, "block": "unsigned int version\nuint32_t flags\nsize_t patch_no\nsize_t total_patches\nconst git_oid * id\nconst char * summary\nconst char * body\nconst git_signature * author", "tdef": "typedef", "description": " Options for controlling the formatting of the generated e-mail.", @@ -27720,8 +28181,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 1128, - "lineto": 1135, + "line": 1156, + "lineto": 1163, "block": "GIT_DIFF_FORMAT_PATCH\nGIT_DIFF_FORMAT_PATCH_HEADER\nGIT_DIFF_FORMAT_RAW\nGIT_DIFF_FORMAT_NAME_ONLY\nGIT_DIFF_FORMAT_NAME_STATUS\nGIT_DIFF_FORMAT_PATCH_ID", "tdef": "typedef", "description": " Possible output formats for diff data", @@ -27784,8 +28245,8 @@ "type": "struct", "value": "git_diff_hunk", "file": "git2/diff.h", - "line": 576, - "lineto": 583, + "line": 590, + "lineto": 597, "block": "int old_start\nint old_lines\nint new_start\nint new_lines\nsize_t header_len\nchar [128] header", "tdef": "typedef", "description": " Structure describing a hunk of a diff.", @@ -27852,8 +28313,8 @@ "type": "struct", "value": "git_diff_line", "file": "git2/diff.h", - "line": 631, - "lineto": 639, + "line": 650, + "lineto": 658, "block": "char origin\nint old_lineno\nint new_lineno\nint num_lines\nsize_t content_len\ngit_off_t content_offset\nconst char * content", "tdef": "typedef", "description": " Structure describing a line (or data span) of a diff.", @@ -27926,8 +28387,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 602, - "lineto": 618, + "line": 621, + "lineto": 637, "block": "GIT_DIFF_LINE_CONTEXT\nGIT_DIFF_LINE_ADDITION\nGIT_DIFF_LINE_DELETION\nGIT_DIFF_LINE_CONTEXT_EOFNL\nGIT_DIFF_LINE_ADD_EOFNL\nGIT_DIFF_LINE_DEL_EOFNL\nGIT_DIFF_LINE_FILE_HDR\nGIT_DIFF_LINE_HUNK_HDR\nGIT_DIFF_LINE_BINARY", "tdef": "typedef", "description": " Line origin constants.", @@ -28248,8 +28709,8 @@ "type": "struct", "value": "git_diff_options", "file": "git2/diff.h", - "line": 376, - "lineto": 464, + "line": 383, + "lineto": 471, "block": "unsigned int version\nuint32_t flags\ngit_submodule_ignore_t ignore_submodules\ngit_strarray pathspec\ngit_diff_notify_cb notify_cb\ngit_diff_progress_cb progress_cb\nvoid * payload\nuint32_t context_lines\nuint32_t interhunk_lines\ngit_oid_t oid_type\nuint16_t id_abbrev\ngit_off_t max_size\nconst char * old_prefix\nconst char * new_prefix", "tdef": "typedef", "description": " Structure describing options about how the diff should be executed.", @@ -28354,8 +28815,8 @@ "type": "struct", "value": "git_diff_parse_options", "file": "git2/diff.h", - "line": 1294, - "lineto": 1297, + "line": 1322, + "lineto": 1325, "block": "unsigned int version\ngit_oid_t oid_type", "tdef": "typedef", "description": " Options for parsing a diff / patch file.", @@ -28374,8 +28835,8 @@ "type": "struct", "value": "git_diff_patchid_options", "file": "git2/diff.h", - "line": 1431, - "lineto": 1433, + "line": 1459, + "lineto": 1461, "block": "unsigned int version", "tdef": "typedef", "description": " Patch ID options structure", @@ -28402,8 +28863,8 @@ "type": "struct", "value": "git_diff_similarity_metric", "file": "git2/diff.h", - "line": 732, - "lineto": 742, + "line": 757, + "lineto": 767, "block": "int (*)(void **, const git_diff_file *, const char *, void *) file_signature\nint (*)(void **, const git_diff_file *, const char *, size_t, void *) buffer_signature\nvoid (*)(void *, void *) free_signature\nint (*)(int *, void *, void *, void *) similarity\nvoid * payload", "tdef": "typedef", "description": " Pluggable similarity metric", @@ -28441,8 +28902,8 @@ "type": "struct", "value": "git_diff_stats", "file": "git2/diff.h", - "line": 1341, - "lineto": 1341, + "line": 1369, + "lineto": 1369, "tdef": "typedef", "description": " This is an opaque structure which is allocated by `git_diff_get_stats`.\n You are responsible for releasing the object memory when done, using the\n `git_diff_stats_free()` function.", "comments": "", @@ -28471,8 +28932,8 @@ ], "type": "enum", "file": "git2/diff.h", - "line": 1346, - "lineto": 1361, + "line": 1374, + "lineto": 1389, "block": "GIT_DIFF_STATS_NONE\nGIT_DIFF_STATS_FULL\nGIT_DIFF_STATS_SHORT\nGIT_DIFF_STATS_NUMBER\nGIT_DIFF_STATS_INCLUDE_SUMMARY", "tdef": "typedef", "description": " Formatting options for diff stats", @@ -28518,8 +28979,8 @@ "decl": ["GIT_DIRECTION_FETCH", "GIT_DIRECTION_PUSH"], "type": "enum", "file": "git2/net.h", - "line": 31, - "lineto": 34, + "line": 32, + "lineto": 35, "block": "GIT_DIRECTION_FETCH\nGIT_DIRECTION_PUSH", "tdef": "typedef", "description": " Direction of the connection.", @@ -28644,13 +29105,7 @@ "comments": " The \"re-roll\" number. By default, there is no re-roll. " } ], - "used": { - "returns": [], - "needs": [ - "git_email_create_from_commit", - "git_email_create_from_diff" - ] - } + "used": { "returns": [], "needs": ["git_email_create_from_commit"] } } ], [ @@ -28660,15 +29115,23 @@ "type": "struct", "value": "git_error", "file": "git2/errors.h", - "line": 74, - "lineto": 77, + "line": 125, + "lineto": 128, "block": "char * message\nint klass", "tdef": "typedef", "description": " Structure to store extra details of the last error that occurred.", "comments": "

This is kept on a per-thread basis if GIT_THREADS was defined when the library was build, otherwise one is kept globally for the library

\n", "fields": [ - { "type": "char *", "name": "message", "comments": "" }, - { "type": "int", "name": "klass", "comments": "" } + { + "type": "char *", + "name": "message", + "comments": " The error message for the last error. " + }, + { + "type": "int", + "name": "klass", + "comments": " The category of the last error. \n\n git_error_t " + } ], "used": { "returns": ["git_error_last", "giterr_last"], "needs": [] } } @@ -28716,7 +29179,7 @@ "type": "enum", "file": "git2/errors.h", "line": 21, - "lineto": 66, + "lineto": 73, "block": "GIT_OK\nGIT_ERROR\nGIT_ENOTFOUND\nGIT_EEXISTS\nGIT_EAMBIGUOUS\nGIT_EBUFS\nGIT_EUSER\nGIT_EBAREREPO\nGIT_EUNBORNBRANCH\nGIT_EUNMERGED\nGIT_ENONFASTFORWARD\nGIT_EINVALIDSPEC\nGIT_ECONFLICT\nGIT_ELOCKED\nGIT_EMODIFIED\nGIT_EAUTH\nGIT_ECERTIFICATE\nGIT_EAPPLIED\nGIT_EPEEL\nGIT_EEOF\nGIT_EINVALID\nGIT_EUNCOMMITTED\nGIT_EDIRECTORY\nGIT_EMERGECONFLICT\nGIT_PASSTHROUGH\nGIT_ITEROVER\nGIT_RETRY\nGIT_EMISMATCH\nGIT_EINDEXDIRTY\nGIT_EAPPLYFAIL\nGIT_EOWNER\nGIT_TIMEOUT\nGIT_EUNCHANGED\nGIT_ENOTSUPPORTED\nGIT_EREADONLY", "tdef": "typedef", "description": " Generic return codes ", @@ -28725,37 +29188,37 @@ { "type": "int", "name": "GIT_OK", - "comments": "

No error

\n", + "comments": "

No error occurred; the call was successful.

\n", "value": 0 }, { "type": "int", "name": "GIT_ERROR", - "comments": "

Generic error

\n", + "comments": "

An error occurred; call git_error_last for more information.

\n", "value": -1 }, { "type": "int", "name": "GIT_ENOTFOUND", - "comments": "

Requested object could not be found

\n", + "comments": "

Requested object could not be found.

\n", "value": -3 }, { "type": "int", "name": "GIT_EEXISTS", - "comments": "

Object exists preventing operation

\n", + "comments": "

Object exists preventing operation.

\n", "value": -4 }, { "type": "int", "name": "GIT_EAMBIGUOUS", - "comments": "

More than one object matches

\n", + "comments": "

More than one object matches.

\n", "value": -5 }, { "type": "int", "name": "GIT_EBUFS", - "comments": "

Output buffer too short to hold data

\n", + "comments": "

Output buffer too short to hold data.

\n", "value": -6 }, { @@ -28767,13 +29230,13 @@ { "type": "int", "name": "GIT_EBAREREPO", - "comments": "

Operation not allowed on bare repository

\n", + "comments": "

Operation not allowed on bare repository.

\n", "value": -8 }, { "type": "int", "name": "GIT_EUNBORNBRANCH", - "comments": "

HEAD refers to branch with no commits

\n", + "comments": "

HEAD refers to branch with no commits.

\n", "value": -9 }, { @@ -28980,11 +29443,11 @@ ], "type": "enum", "file": "git2/errors.h", - "line": 80, - "lineto": 118, + "line": 79, + "lineto": 117, "block": "GIT_ERROR_NONE\nGIT_ERROR_NOMEMORY\nGIT_ERROR_OS\nGIT_ERROR_INVALID\nGIT_ERROR_REFERENCE\nGIT_ERROR_ZLIB\nGIT_ERROR_REPOSITORY\nGIT_ERROR_CONFIG\nGIT_ERROR_REGEX\nGIT_ERROR_ODB\nGIT_ERROR_INDEX\nGIT_ERROR_OBJECT\nGIT_ERROR_NET\nGIT_ERROR_TAG\nGIT_ERROR_TREE\nGIT_ERROR_INDEXER\nGIT_ERROR_SSL\nGIT_ERROR_SUBMODULE\nGIT_ERROR_THREAD\nGIT_ERROR_STASH\nGIT_ERROR_CHECKOUT\nGIT_ERROR_FETCHHEAD\nGIT_ERROR_MERGE\nGIT_ERROR_SSH\nGIT_ERROR_FILTER\nGIT_ERROR_REVERT\nGIT_ERROR_CALLBACK\nGIT_ERROR_CHERRYPICK\nGIT_ERROR_DESCRIBE\nGIT_ERROR_REBASE\nGIT_ERROR_FILESYSTEM\nGIT_ERROR_PATCH\nGIT_ERROR_WORKTREE\nGIT_ERROR_SHA\nGIT_ERROR_HTTP\nGIT_ERROR_INTERNAL\nGIT_ERROR_GRAFTS", "tdef": "typedef", - "description": " Error classes ", + "description": " Error classes are the category of error. They reflect the area of the\n code where an error occurred.", "comments": "", "fields": [ { @@ -29215,43 +29678,99 @@ "GIT_FEATURE_THREADS", "GIT_FEATURE_HTTPS", "GIT_FEATURE_SSH", - "GIT_FEATURE_NSEC" + "GIT_FEATURE_NSEC", + "GIT_FEATURE_HTTP_PARSER", + "GIT_FEATURE_REGEX", + "GIT_FEATURE_I18N", + "GIT_FEATURE_AUTH_NTLM", + "GIT_FEATURE_AUTH_NEGOTIATE", + "GIT_FEATURE_COMPRESSION", + "GIT_FEATURE_SHA1", + "GIT_FEATURE_SHA256" ], "type": "enum", "file": "git2/common.h", - "line": 134, - "lineto": 157, - "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC", + "line": 138, + "lineto": 177, + "block": "GIT_FEATURE_THREADS\nGIT_FEATURE_HTTPS\nGIT_FEATURE_SSH\nGIT_FEATURE_NSEC\nGIT_FEATURE_HTTP_PARSER\nGIT_FEATURE_REGEX\nGIT_FEATURE_I18N\nGIT_FEATURE_AUTH_NTLM\nGIT_FEATURE_AUTH_NEGOTIATE\nGIT_FEATURE_COMPRESSION\nGIT_FEATURE_SHA1\nGIT_FEATURE_SHA256", "tdef": "typedef", - "description": " Combinations of these values describe the features with which libgit2\n was compiled", + "description": " Configurable features of libgit2; either optional settings (like\n threading), or features that can be enabled by one of a number of\n different backend \"providers\" (like HTTPS, which can be provided by\n OpenSSL, mbedTLS, or system libraries).", "comments": "", "fields": [ { "type": "int", "name": "GIT_FEATURE_THREADS", - "comments": "

If set, libgit2 was built thread-aware and can be safely used from multiple\n threads.

\n", + "comments": "

libgit2 is thread-aware and can be used from multiple threads\n (as described in the documentation).

\n", "value": 1 }, { "type": "int", "name": "GIT_FEATURE_HTTPS", - "comments": "

If set, libgit2 was built with and linked against a TLS implementation.\n Custom TLS streams may still be added by the user to support HTTPS\n regardless of this.

\n", + "comments": "

HTTPS remotes

\n", "value": 2 }, { "type": "int", "name": "GIT_FEATURE_SSH", - "comments": "

If set, libgit2 was built with and linked against libssh2. A custom\n transport may still be added by the user to support libssh2 regardless of\n this.

\n", + "comments": "

SSH remotes

\n", "value": 4 }, { "type": "int", "name": "GIT_FEATURE_NSEC", - "comments": "

If set, libgit2 was built with support for sub-second resolution in file\n modification times.

\n", + "comments": "

Sub-second resolution in index timestamps

\n", "value": 8 + }, + { + "type": "int", + "name": "GIT_FEATURE_HTTP_PARSER", + "comments": "

HTTP parsing; always available

\n", + "value": 16 + }, + { + "type": "int", + "name": "GIT_FEATURE_REGEX", + "comments": "

Regular expression support; always available

\n", + "value": 32 + }, + { + "type": "int", + "name": "GIT_FEATURE_I18N", + "comments": "

Internationalization support for filename translation

\n", + "value": 64 + }, + { + "type": "int", + "name": "GIT_FEATURE_AUTH_NTLM", + "comments": "

NTLM support over HTTPS

\n", + "value": 128 + }, + { + "type": "int", + "name": "GIT_FEATURE_AUTH_NEGOTIATE", + "comments": "

Kerberos (SPNEGO) authentication support over HTTPS

\n", + "value": 256 + }, + { + "type": "int", + "name": "GIT_FEATURE_COMPRESSION", + "comments": "

zlib support; always available

\n", + "value": 512 + }, + { + "type": "int", + "name": "GIT_FEATURE_SHA1", + "comments": "

SHA1 object support; always available

\n", + "value": 1024 + }, + { + "type": "int", + "name": "GIT_FEATURE_SHA256", + "comments": "

SHA256 object support

\n", + "value": 2048 } ], - "used": { "returns": [], "needs": [] } + "used": { "returns": [], "needs": ["git_libgit2_feature_backend"] } } ], [ @@ -29260,8 +29779,8 @@ "decl": ["GIT_FETCH_DEPTH_FULL", "GIT_FETCH_DEPTH_UNSHALLOW"], "type": "enum", "file": "git2/remote.h", - "line": 717, - "lineto": 723, + "line": 760, + "lineto": 766, "block": "GIT_FETCH_DEPTH_FULL\nGIT_FETCH_DEPTH_UNSHALLOW", "tdef": "typedef", "description": " Constants for fetch depth (shallowness of fetch). ", @@ -29300,8 +29819,8 @@ "type": "struct", "value": "git_fetch_options", "file": "git2/remote.h", - "line": 733, - "lineto": 785, + "line": 776, + "lineto": 828, "block": "int version\ngit_remote_callbacks callbacks\ngit_fetch_prune_t prune\nunsigned int update_fetchhead\ngit_remote_autotag_option_t download_tags\ngit_proxy_options proxy_opts\nint depth\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", "tdef": "typedef", "description": " Fetch options structure.", @@ -29369,8 +29888,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 676, - "lineto": 689, + "line": 719, + "lineto": 732, "block": "GIT_FETCH_PRUNE_UNSPECIFIED\nGIT_FETCH_PRUNE\nGIT_FETCH_NO_PRUNE", "tdef": "typedef", "description": " Acceptable prune settings when fetching ", @@ -29411,8 +29930,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 222, - "lineto": 229, + "line": 238, + "lineto": 245, "block": "GIT_FILEMODE_UNREADABLE\nGIT_FILEMODE_TREE\nGIT_FILEMODE_BLOB\nGIT_FILEMODE_BLOB_EXECUTABLE\nGIT_FILEMODE_LINK\nGIT_FILEMODE_COMMIT", "tdef": "typedef", "description": " Valid modes for index and tree entries. ", @@ -29468,8 +29987,8 @@ "type": "struct", "value": "git_filter", "file": "git2/filter.h", - "line": 100, - "lineto": 100, + "line": 109, + "lineto": 109, "tdef": "typedef", "description": " A filter that can transform file data", "comments": "

This represents a filter that can be used to transform or even replace file data. Libgit2 includes one built in filter and it is possible to write your own (see git2/sys/filter.h for information on that).

\n\n

The two builtin filters are:

\n\n
    \n
  • "crlf" which uses the complex rules with the "text", "eol", and "crlf" file attributes to decide how to convert between LF and CRLF line endings * "ident" which replaces "$Id$" in a blob with "$Id: $" upon checkout and replaced "$Id: $" with "$Id$" on checkin.
  • \n
\n", @@ -29504,8 +30023,8 @@ ], "type": "enum", "file": "git2/filter.h", - "line": 41, - "lineto": 58, + "line": 47, + "lineto": 64, "block": "GIT_FILTER_DEFAULT\nGIT_FILTER_ALLOW_UNSAFE\nGIT_FILTER_NO_SYSTEM_ATTRIBUTES\nGIT_FILTER_ATTRIBUTES_FROM_HEAD\nGIT_FILTER_ATTRIBUTES_FROM_COMMIT", "tdef": "typedef", "description": " Filter option flags.", @@ -29552,8 +30071,8 @@ "type": "struct", "value": "git_filter_list", "file": "git2/filter.h", - "line": 112, - "lineto": 112, + "line": 121, + "lineto": 121, "tdef": "typedef", "description": " List of filters to be applied", "comments": "

This represents a list of filters to be applied to a file / blob. You can build the list with one call, apply it with another, and dispose it with a third. In typical usage, there are not many occasions where a git_filter_list is needed directly since the library will generally handle conversions for you, but it can be convenient to be able to build and apply the list sometimes.

\n", @@ -29587,8 +30106,8 @@ ], "type": "enum", "file": "git2/filter.h", - "line": 31, - "lineto": 36, + "line": 37, + "lineto": 42, "block": "GIT_FILTER_TO_WORKTREE\nGIT_FILTER_SMUDGE\nGIT_FILTER_TO_ODB\nGIT_FILTER_CLEAN", "tdef": "typedef", "description": " Filters are applied in one of two directions: smudging - which is\n exporting a file from the Git object database to the working directory,\n and cleaning - which is importing a file from the working directory to\n the Git object database. These values control which direction of\n change is being applied.", @@ -29637,8 +30156,8 @@ "type": "struct", "value": "git_filter_options", "file": "git2/filter.h", - "line": 63, - "lineto": 80, + "line": 69, + "lineto": 86, "block": "unsigned int version\nuint32_t flags\ngit_oid * commit_id\ngit_oid attr_commit_id", "tdef": "typedef", "description": " Filtering options", @@ -29667,8 +30186,8 @@ "type": "struct", "value": "git_filter_source", "file": "git2/sys/filter.h", - "line": 95, - "lineto": 95, + "line": 109, + "lineto": 109, "tdef": "typedef", "description": " A filter source represents a file/blob to be processed", "comments": "", @@ -29686,8 +30205,8 @@ ], "type": "enum", "file": "git2/sys/hashsig.h", - "line": 25, - "lineto": 45, + "line": 35, + "lineto": 55, "block": "GIT_HASHSIG_NORMAL\nGIT_HASHSIG_IGNORE_WHITESPACE\nGIT_HASHSIG_SMART_WHITESPACE\nGIT_HASHSIG_ALLOW_SMALL_FILES", "tdef": "typedef", "description": " Options for hashsig computation", @@ -29728,8 +30247,8 @@ "type": "struct", "value": "git_index", "file": "git2/types.h", - "line": 148, - "lineto": 148, + "line": 153, + "lineto": 153, "tdef": "typedef", "description": " Memory representation of an index file. ", "comments": "", @@ -29772,6 +30291,8 @@ "git_index_iterator_free", "git_index_iterator_new", "git_index_iterator_next", + "git_index_new", + "git_index_open", "git_index_owner", "git_index_path", "git_index_read", @@ -29819,8 +30340,8 @@ ], "type": "enum", "file": "git2/index.h", - "line": 139, - "lineto": 144, + "line": 162, + "lineto": 167, "block": "GIT_INDEX_ADD_DEFAULT\nGIT_INDEX_ADD_FORCE\nGIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH\nGIT_INDEX_ADD_CHECK_PATHSPEC", "tdef": "typedef", "description": " Flags for APIs that add files matching pathspec ", @@ -29865,8 +30386,8 @@ ], "type": "enum", "file": "git2/index.h", - "line": 126, - "lineto": 131, + "line": 142, + "lineto": 147, "block": "GIT_INDEX_CAPABILITY_IGNORE_CASE\nGIT_INDEX_CAPABILITY_NO_FILEMODE\nGIT_INDEX_CAPABILITY_NO_SYMLINKS\nGIT_INDEX_CAPABILITY_FROM_OWNER", "tdef": "typedef", "description": " Capabilities of system that affect index actions. ", @@ -29907,8 +30428,8 @@ "type": "struct", "value": "git_index_conflict_iterator", "file": "git2/types.h", - "line": 154, - "lineto": 154, + "line": 159, + "lineto": 159, "tdef": "typedef", "description": " An iterator for conflicts in the index. ", "comments": "", @@ -29942,8 +30463,8 @@ "type": "struct", "value": "git_index_entry", "file": "git2/index.h", - "line": 53, - "lineto": 70, + "line": 58, + "lineto": 75, "block": "git_index_time ctime\ngit_index_time mtime\nuint32_t dev\nuint32_t ino\nuint32_t mode\nuint32_t uid\nuint32_t gid\nuint32_t file_size\ngit_oid id\nuint16_t flags\nuint16_t flags_extended\nconst char * path", "tdef": "typedef", "description": " In-memory representation of a file entry in the index.", @@ -29989,8 +30510,8 @@ ], "type": "enum", "file": "git2/index.h", - "line": 116, - "lineto": 123, + "line": 132, + "lineto": 139, "block": "GIT_INDEX_ENTRY_INTENT_TO_ADD\nGIT_INDEX_ENTRY_SKIP_WORKTREE\nGIT_INDEX_ENTRY_EXTENDED_FLAGS\nGIT_INDEX_ENTRY_UPTODATE", "tdef": "typedef", "description": " Bitmasks for on-disk fields of `git_index_entry`'s `flags_extended`", @@ -30030,8 +30551,8 @@ "decl": ["GIT_INDEX_ENTRY_EXTENDED", "GIT_INDEX_ENTRY_VALID"], "type": "enum", "file": "git2/index.h", - "line": 87, - "lineto": 90, + "line": 95, + "lineto": 98, "block": "GIT_INDEX_ENTRY_EXTENDED\nGIT_INDEX_ENTRY_VALID", "tdef": "typedef", "description": " Flags for index entries", @@ -30060,8 +30581,8 @@ "type": "struct", "value": "git_index_iterator", "file": "git2/types.h", - "line": 151, - "lineto": 151, + "line": 156, + "lineto": 156, "tdef": "typedef", "description": " An iterator for entries in the index. ", "comments": "", @@ -30087,8 +30608,8 @@ ], "type": "enum", "file": "git2/index.h", - "line": 147, - "lineto": 167, + "line": 170, + "lineto": 190, "block": "GIT_INDEX_STAGE_ANY\nGIT_INDEX_STAGE_NORMAL\nGIT_INDEX_STAGE_ANCESTOR\nGIT_INDEX_STAGE_OURS\nGIT_INDEX_STAGE_THEIRS", "tdef": "typedef", "description": " Git index stage states ", @@ -30135,8 +30656,8 @@ "type": "struct", "value": "git_index_time", "file": "git2/index.h", - "line": 26, - "lineto": 30, + "line": 31, + "lineto": 35, "block": "int32_t seconds\nuint32_t nanoseconds", "tdef": "typedef", "description": " Time structure used in a git index entry ", @@ -30155,8 +30676,8 @@ "type": "struct", "value": "git_indexer", "file": "git2/indexer.h", - "line": 17, - "lineto": 17, + "line": 27, + "lineto": 27, "tdef": "typedef", "description": " A git indexer object ", "comments": "", @@ -30189,8 +30710,8 @@ "type": "struct", "value": "git_indexer_options", "file": "git2/indexer.h", - "line": 62, - "lineto": 86, + "line": 73, + "lineto": 100, "block": "unsigned int version\ngit_indexer_progress_cb progress_cb\nvoid * progress_cb_payload\nunsigned char verify", "tdef": "typedef", "description": " Options for indexer configuration", @@ -30234,8 +30755,8 @@ "type": "struct", "value": "git_indexer_progress", "file": "git2/indexer.h", - "line": 24, - "lineto": 48, + "line": 34, + "lineto": 58, "block": "unsigned int total_objects\nunsigned int indexed_objects\nunsigned int received_objects\nunsigned int local_objects\nunsigned int total_deltas\nunsigned int indexed_deltas\nsize_t received_bytes", "tdef": "typedef", "description": " This structure is used to provide callers information about the\n progress of indexing a packfile, either directly or part of a\n fetch or clone that downloads a packfile.", @@ -30337,13 +30858,14 @@ "GIT_OPT_SET_SERVER_TIMEOUT", "GIT_OPT_GET_SERVER_TIMEOUT", "GIT_OPT_SET_USER_AGENT_PRODUCT", - "GIT_OPT_GET_USER_AGENT_PRODUCT" + "GIT_OPT_GET_USER_AGENT_PRODUCT", + "GIT_OPT_ADD_SSL_X509_CERT" ], "type": "enum", "file": "git2/common.h", - "line": 188, - "lineto": 234, - "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION\nGIT_OPT_GET_HOMEDIR\nGIT_OPT_SET_HOMEDIR\nGIT_OPT_SET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_GET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_SET_SERVER_TIMEOUT\nGIT_OPT_GET_SERVER_TIMEOUT\nGIT_OPT_SET_USER_AGENT_PRODUCT\nGIT_OPT_GET_USER_AGENT_PRODUCT", + "line": 214, + "lineto": 261, + "block": "GIT_OPT_GET_MWINDOW_SIZE\nGIT_OPT_SET_MWINDOW_SIZE\nGIT_OPT_GET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_SET_MWINDOW_MAPPED_LIMIT\nGIT_OPT_GET_SEARCH_PATH\nGIT_OPT_SET_SEARCH_PATH\nGIT_OPT_SET_CACHE_OBJECT_LIMIT\nGIT_OPT_SET_CACHE_MAX_SIZE\nGIT_OPT_ENABLE_CACHING\nGIT_OPT_GET_CACHED_MEMORY\nGIT_OPT_GET_TEMPLATE_PATH\nGIT_OPT_SET_TEMPLATE_PATH\nGIT_OPT_SET_SSL_CERT_LOCATIONS\nGIT_OPT_SET_USER_AGENT\nGIT_OPT_ENABLE_STRICT_OBJECT_CREATION\nGIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION\nGIT_OPT_SET_SSL_CIPHERS\nGIT_OPT_GET_USER_AGENT\nGIT_OPT_ENABLE_OFS_DELTA\nGIT_OPT_ENABLE_FSYNC_GITDIR\nGIT_OPT_GET_WINDOWS_SHAREMODE\nGIT_OPT_SET_WINDOWS_SHAREMODE\nGIT_OPT_ENABLE_STRICT_HASH_VERIFICATION\nGIT_OPT_SET_ALLOCATOR\nGIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY\nGIT_OPT_GET_PACK_MAX_OBJECTS\nGIT_OPT_SET_PACK_MAX_OBJECTS\nGIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS\nGIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE\nGIT_OPT_GET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_MWINDOW_FILE_LIMIT\nGIT_OPT_SET_ODB_PACKED_PRIORITY\nGIT_OPT_SET_ODB_LOOSE_PRIORITY\nGIT_OPT_GET_EXTENSIONS\nGIT_OPT_SET_EXTENSIONS\nGIT_OPT_GET_OWNER_VALIDATION\nGIT_OPT_SET_OWNER_VALIDATION\nGIT_OPT_GET_HOMEDIR\nGIT_OPT_SET_HOMEDIR\nGIT_OPT_SET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_GET_SERVER_CONNECT_TIMEOUT\nGIT_OPT_SET_SERVER_TIMEOUT\nGIT_OPT_GET_SERVER_TIMEOUT\nGIT_OPT_SET_USER_AGENT_PRODUCT\nGIT_OPT_GET_USER_AGENT_PRODUCT\nGIT_OPT_ADD_SSL_X509_CERT", "tdef": "typedef", "description": " Global library options", "comments": "

These are used to select which global option to set or get and are used in git_libgit2_opts().

\n", @@ -30617,6 +31139,12 @@ "name": "GIT_OPT_GET_USER_AGENT_PRODUCT", "comments": "", "value": 44 + }, + { + "type": "int", + "name": "GIT_OPT_ADD_SSL_X509_CERT", + "comments": "", + "value": 45 } ], "used": { "returns": [], "needs": [] } @@ -30629,8 +31157,8 @@ "type": "struct", "value": "git_mailmap", "file": "git2/types.h", - "line": 366, - "lineto": 366, + "line": 382, + "lineto": 382, "tdef": "typedef", "description": " Representation of .mailmap file state. ", "comments": "", @@ -30662,8 +31190,8 @@ ], "type": "enum", "file": "git2/merge.h", - "line": 334, - "lineto": 363, + "line": 347, + "lineto": 376, "block": "GIT_MERGE_ANALYSIS_NONE\nGIT_MERGE_ANALYSIS_NORMAL\nGIT_MERGE_ANALYSIS_UP_TO_DATE\nGIT_MERGE_ANALYSIS_FASTFORWARD\nGIT_MERGE_ANALYSIS_UNBORN", "tdef": "typedef", "description": " The results of `git_merge_analysis` indicate the merge opportunities.", @@ -30713,8 +31241,8 @@ "type": "struct", "value": "git_merge_driver_source", "file": "git2/sys/merge.h", - "line": 41, - "lineto": 41, + "line": 49, + "lineto": 49, "tdef": "typedef", "description": " A merge driver source represents the file to be merged", "comments": "", @@ -30732,8 +31260,8 @@ ], "type": "enum", "file": "git2/merge.h", - "line": 109, - "lineto": 139, + "line": 115, + "lineto": 145, "block": "GIT_MERGE_FILE_FAVOR_NORMAL\nGIT_MERGE_FILE_FAVOR_OURS\nGIT_MERGE_FILE_FAVOR_THEIRS\nGIT_MERGE_FILE_FAVOR_UNION", "tdef": "typedef", "description": " Merge file favor options for `git_merge_options` instruct the file-level\n merging functionality how to deal with conflicting regions of the files.", @@ -30785,8 +31313,8 @@ ], "type": "enum", "file": "git2/merge.h", - "line": 144, - "lineto": 181, + "line": 150, + "lineto": 187, "block": "GIT_MERGE_FILE_DEFAULT\nGIT_MERGE_FILE_STYLE_MERGE\nGIT_MERGE_FILE_STYLE_DIFF3\nGIT_MERGE_FILE_SIMPLIFY_ALNUM\nGIT_MERGE_FILE_IGNORE_WHITESPACE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE\nGIT_MERGE_FILE_IGNORE_WHITESPACE_EOL\nGIT_MERGE_FILE_DIFF_PATIENCE\nGIT_MERGE_FILE_DIFF_MINIMAL\nGIT_MERGE_FILE_STYLE_ZDIFF3\nGIT_MERGE_FILE_ACCEPT_CONFLICTS", "tdef": "typedef", "description": " File merging flags", @@ -30875,8 +31403,8 @@ "type": "struct", "value": "git_merge_file_input", "file": "git2/merge.h", - "line": 32, - "lineto": 46, + "line": 35, + "lineto": 49, "block": "unsigned int version\nconst char * ptr\nsize_t size\nconst char * path\nunsigned int mode", "tdef": "typedef", "description": " The file inputs to `git_merge_file`. Callers should populate the\n `git_merge_file_input` structure with descriptions of the files in\n each side of the conflict for use in producing the merge file.", @@ -30925,8 +31453,8 @@ "type": "struct", "value": "git_merge_file_options", "file": "git2/merge.h", - "line": 188, - "lineto": 218, + "line": 195, + "lineto": 225, "block": "unsigned int version\nconst char * ancestor_label\nconst char * our_label\nconst char * their_label\ngit_merge_file_favor_t favor\nuint32_t flags\nunsigned short marker_size", "tdef": "typedef", "description": " Options for merging a file", @@ -30987,8 +31515,8 @@ "type": "struct", "value": "git_merge_file_result", "file": "git2/merge.h", - "line": 238, - "lineto": 259, + "line": 248, + "lineto": 269, "block": "unsigned int automergeable\nconst char * path\nunsigned int mode\nconst char * ptr\nsize_t len", "tdef": "typedef", "description": " Information about file-level merging", @@ -31042,8 +31570,8 @@ ], "type": "enum", "file": "git2/merge.h", - "line": 68, - "lineto": 103, + "line": 74, + "lineto": 109, "block": "GIT_MERGE_FIND_RENAMES\nGIT_MERGE_FAIL_ON_CONFLICT\nGIT_MERGE_SKIP_REUC\nGIT_MERGE_NO_RECURSIVE\nGIT_MERGE_VIRTUAL_BASE", "tdef": "typedef", "description": " Flags for `git_merge` options. A combination of these flags can be\n passed in via the `flags` value in the `git_merge_options`.", @@ -31100,8 +31628,8 @@ "type": "struct", "value": "git_merge_options", "file": "git2/merge.h", - "line": 264, - "lineto": 313, + "line": 274, + "lineto": 323, "block": "unsigned int version\nuint32_t flags\nunsigned int rename_threshold\nunsigned int target_limit\ngit_diff_similarity_metric * metric\nunsigned int recursion_limit\nconst char * default_driver\ngit_merge_file_favor_t file_favor\nuint32_t file_flags", "tdef": "typedef", "description": " Merging options", @@ -31172,8 +31700,8 @@ ], "type": "enum", "file": "git2/merge.h", - "line": 368, - "lineto": 386, + "line": 381, + "lineto": 399, "block": "GIT_MERGE_PREFERENCE_NONE\nGIT_MERGE_PREFERENCE_NO_FASTFORWARD\nGIT_MERGE_PREFERENCE_FASTFORWARD_ONLY", "tdef": "typedef", "description": " The user's stated preference for merges.", @@ -31266,8 +31794,8 @@ "type": "struct", "value": "git_midx_writer", "file": "git2/types.h", - "line": 100, - "lineto": 100, + "line": 105, + "lineto": 105, "tdef": "typedef", "description": " a writer for multi-pack-index files. ", "comments": "", @@ -31281,27 +31809,14 @@ "type": "struct", "value": "git_note", "file": "git2/types.h", - "line": 169, - "lineto": 169, + "line": 174, + "lineto": 174, "tdef": "typedef", "description": " Representation of a git note ", "comments": "", "used": { "returns": [], - "needs": [ - "git_note_author", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_committer", - "git_note_foreach", - "git_note_free", - "git_note_id", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_message", - "git_note_next", - "git_note_read" - ] + "needs": ["git_note_iterator_free", "git_note_next"] } } ], @@ -31312,19 +31827,14 @@ "type": "struct", "value": "git_note_iterator", "file": "git2/notes.h", - "line": 35, - "lineto": 35, + "line": 37, + "lineto": 37, "tdef": "typedef", "description": " note iterator", "comments": "", "used": { "returns": [], - "needs": [ - "git_note_commit_iterator_new", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_next" - ] + "needs": ["git_note_iterator_free", "git_note_next"] } } ], @@ -31335,8 +31845,8 @@ "type": "struct", "value": "git_object", "file": "git2/types.h", - "line": 124, - "lineto": 124, + "line": 129, + "lineto": 129, "tdef": "typedef", "description": " Representation of a generic object in a repository ", "comments": "", @@ -31366,6 +31876,8 @@ "git_object_type", "git_object_type2string", "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", "git_odb_open_rstream", "git_odb_open_wstream", "git_odb_read_header", @@ -31474,6 +31986,8 @@ "git_object_rawcontent_is_valid", "git_object_type2string", "git_object_typeisloose", + "git_odb_hash", + "git_odb_hashfile", "git_odb_open_rstream", "git_odb_open_wstream", "git_odb_read_header", @@ -31491,10 +32005,10 @@ "type": "struct", "value": "git_odb", "file": "git2/types.h", - "line": 85, - "lineto": 85, + "line": 88, + "lineto": 88, "tdef": "typedef", - "description": " An open object database handle. ", + "description": " An object database stores the objects (commit, trees, blobs, tags,\n etc) for a repository.", "comments": "", "used": { "returns": [], @@ -31503,6 +32017,9 @@ "git_odb_add_alternate", "git_odb_add_backend", "git_odb_add_disk_alternate", + "git_odb_backend_loose", + "git_odb_backend_one_pack", + "git_odb_backend_pack", "git_odb_exists", "git_odb_exists_ext", "git_odb_exists_prefix", @@ -31510,6 +32027,7 @@ "git_odb_foreach", "git_odb_free", "git_odb_get_backend", + "git_odb_new", "git_odb_num_backends", "git_odb_object_data", "git_odb_object_dup", @@ -31517,6 +32035,7 @@ "git_odb_object_id", "git_odb_object_size", "git_odb_object_type", + "git_odb_open", "git_odb_open_rstream", "git_odb_open_wstream", "git_odb_read", @@ -31531,7 +32050,8 @@ "git_odb_write", "git_odb_write_multi_pack_index", "git_odb_write_pack", - "git_repository_odb" + "git_repository_odb", + "git_repository_wrap_odb" ] } } @@ -31543,8 +32063,8 @@ "type": "struct", "value": "git_odb_backend", "file": "git2/types.h", - "line": 88, - "lineto": 88, + "line": 91, + "lineto": 91, "tdef": "typedef", "description": " A custom backend in an ODB ", "comments": "", @@ -31553,6 +32073,9 @@ "needs": [ "git_odb_add_alternate", "git_odb_add_backend", + "git_odb_backend_loose", + "git_odb_backend_one_pack", + "git_odb_backend_pack", "git_odb_get_backend" ] } @@ -31572,8 +32095,8 @@ "type": "struct", "value": "git_odb_backend_loose_options", "file": "git2/odb_backend.h", - "line": 93, - "lineto": 119, + "line": 49, + "lineto": 75, "block": "unsigned int version\nuint32_t flags\nint compression_level\nunsigned int dir_mode\nunsigned int file_mode\ngit_oid_t oid_type", "tdef": "typedef", "description": " Options for configuring a loose object backend. ", @@ -31620,8 +32143,8 @@ "type": "struct", "value": "git_odb_backend_pack_options", "file": "git2/odb_backend.h", - "line": 28, - "lineto": 36, + "line": 24, + "lineto": 32, "block": "unsigned int version\ngit_oid_t oid_type", "tdef": "typedef", "description": " Options for configuring a packfile object backend. ", @@ -31648,8 +32171,8 @@ "type": "struct", "value": "git_odb_expand_id", "file": "git2/odb.h", - "line": 230, - "lineto": 245, + "line": 250, + "lineto": 265, "block": "git_oid id\nunsigned short length\ngit_object_t type", "tdef": "typedef", "description": " The information about object IDs to query in `git_odb_expand_ids`,\n which will be populated upon return.", @@ -31704,10 +32227,10 @@ "type": "struct", "value": "git_odb_object", "file": "git2/types.h", - "line": 91, - "lineto": 91, + "line": 96, + "lineto": 96, "tdef": "typedef", - "description": " An object read from the ODB ", + "description": " A \"raw\" object read from the object database.", "comments": "", "used": { "returns": [], @@ -31731,8 +32254,8 @@ "type": "struct", "value": "git_odb_options", "file": "git2/odb.h", - "line": 42, - "lineto": 50, + "line": 46, + "lineto": 54, "block": "unsigned int version\ngit_oid_t oid_type", "tdef": "typedef", "description": " Options for configuring a loose object backend. ", @@ -31759,8 +32282,8 @@ "type": "struct", "value": "git_odb_stream", "file": "git2/types.h", - "line": 94, - "lineto": 94, + "line": 99, + "lineto": 99, "block": "git_odb_backend * backend\nunsigned int mode\nvoid * hash_ctx\ngit_object_size_t declared_size\ngit_object_size_t received_bytes\nint (*)(git_odb_stream *, char *, size_t) read\nint (*)(git_odb_stream *, const char *, size_t) write\nint (*)(git_odb_stream *, const git_oid *) finalize_write\nvoid (*)(git_odb_stream *) free", "tdef": "typedef", "description": " A stream to read/write from the ODB ", @@ -31819,8 +32342,8 @@ "decl": ["GIT_STREAM_RDONLY", "GIT_STREAM_WRONLY", "GIT_STREAM_RW"], "type": "enum", "file": "git2/odb_backend.h", - "line": 155, - "lineto": 159, + "line": 182, + "lineto": 186, "block": "GIT_STREAM_RDONLY\nGIT_STREAM_WRONLY\nGIT_STREAM_RW", "tdef": "typedef", "description": " Streaming mode ", @@ -31850,8 +32373,8 @@ "type": "struct", "value": "git_odb_writepack", "file": "git2/types.h", - "line": 97, - "lineto": 97, + "line": 102, + "lineto": 102, "block": "git_odb_backend * backend\nint (*)(git_odb_writepack *, const void *, size_t, git_indexer_progress *) append\nint (*)(git_odb_writepack *, git_indexer_progress *) commit\nvoid (*)(git_odb_writepack *) free", "tdef": "typedef", "description": " A stream to write a packfile to the ODB ", @@ -31884,8 +32407,8 @@ "type": "struct", "value": "git_oid", "file": "git2/oid.h", - "line": 99, - "lineto": 108, + "line": 103, + "lineto": 112, "block": "unsigned char [20] id", "tdef": "typedef", "description": " Unique identity of any object (commit, tree, blob, tag). ", @@ -31906,7 +32429,6 @@ "git_commit_tree_id", "git_index_checksum", "git_indexer_hash", - "git_note_id", "git_object_id", "git_odb_object_id", "git_oid_shorten_new", @@ -31945,7 +32467,6 @@ "git_commit_lookup", "git_commit_lookup_prefix", "git_diff_patchid", - "git_email_create_from_diff", "git_graph_ahead_behind", "git_graph_descendant_of", "git_graph_reachable_from_any", @@ -31956,20 +32477,16 @@ "git_merge_base_octopus", "git_merge_bases", "git_merge_bases_many", - "git_note_commit_create", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_create", "git_note_foreach_cb", "git_note_next", - "git_note_read", - "git_note_remove", "git_object_lookup", "git_object_lookup_prefix", "git_odb_exists", "git_odb_exists_ext", "git_odb_exists_prefix", "git_odb_foreach_cb", + "git_odb_hash", + "git_odb_hashfile", "git_odb_open_rstream", "git_odb_read", "git_odb_read_header", @@ -31980,6 +32497,10 @@ "git_oid_cpy", "git_oid_equal", "git_oid_fmt", + "git_oid_fromraw", + "git_oid_fromstr", + "git_oid_fromstrn", + "git_oid_fromstrp", "git_oid_is_zero", "git_oid_ncmp", "git_oid_nfmt", @@ -32039,8 +32560,8 @@ "type": "struct", "value": "git_oid_shorten", "file": "git2/oid.h", - "line": 320, - "lineto": 320, + "line": 317, + "lineto": 317, "tdef": "typedef", "description": " OID Shortener object", "comments": "", @@ -32056,8 +32577,8 @@ "decl": ["GIT_OID_SHA1"], "type": "enum", "file": "git2/oid.h", - "line": 24, - "lineto": 33, + "line": 23, + "lineto": 32, "block": "GIT_OID_SHA1", "tdef": "typedef", "description": " The type of object id. ", @@ -32080,8 +32601,8 @@ "type": "struct", "value": "git_oidarray", "file": "git2/oidarray.h", - "line": 16, - "lineto": 19, + "line": 23, + "lineto": 26, "block": "git_oid * ids\nsize_t count", "tdef": "typedef", "description": " Array of object ids ", @@ -32108,8 +32629,8 @@ "type": "struct", "value": "git_packbuilder", "file": "git2/types.h", - "line": 172, - "lineto": 172, + "line": 177, + "lineto": 177, "tdef": "typedef", "description": " Representation of a git packbuilder ", "comments": "", @@ -32208,8 +32729,8 @@ "decl": ["GIT_PATH_FS_GENERIC", "GIT_PATH_FS_NTFS", "GIT_PATH_FS_HFS"], "type": "enum", "file": "git2/sys/path.h", - "line": 34, - "lineto": 41, + "line": 44, + "lineto": 51, "block": "GIT_PATH_FS_GENERIC\nGIT_PATH_FS_NTFS\nGIT_PATH_FS_HFS", "tdef": "typedef", "description": " The kinds of checks to perform according to which filesystem we are trying to\n protect.", @@ -32244,8 +32765,8 @@ "type": "struct", "value": "git_pathspec", "file": "git2/pathspec.h", - "line": 20, - "lineto": 20, + "line": 27, + "lineto": 27, "tdef": "typedef", "description": " Compiled pathspec", "comments": "", @@ -32283,8 +32804,8 @@ ], "type": "enum", "file": "git2/pathspec.h", - "line": 30, - "lineto": 73, + "line": 37, + "lineto": 80, "block": "GIT_PATHSPEC_DEFAULT\nGIT_PATHSPEC_IGNORE_CASE\nGIT_PATHSPEC_USE_CASE\nGIT_PATHSPEC_NO_GLOB\nGIT_PATHSPEC_NO_MATCH_ERROR\nGIT_PATHSPEC_FIND_FAILURES\nGIT_PATHSPEC_FAILURES_ONLY", "tdef": "typedef", "description": " Options controlling how pathspec match should be executed", @@ -32343,8 +32864,8 @@ "type": "struct", "value": "git_pathspec_match_list", "file": "git2/pathspec.h", - "line": 25, - "lineto": 25, + "line": 32, + "lineto": 32, "tdef": "typedef", "description": " List of filenames matching a pathspec", "comments": "", @@ -32379,8 +32900,8 @@ "type": "struct", "value": "git_proxy_options", "file": "git2/proxy.h", - "line": 44, - "lineto": 79, + "line": 50, + "lineto": 85, "block": "unsigned int version\ngit_proxy_t type\nconst char * url\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\nvoid * payload", "tdef": "typedef", "description": " Options for connecting through a proxy", @@ -32425,8 +32946,8 @@ "decl": ["GIT_PROXY_NONE", "GIT_PROXY_AUTO", "GIT_PROXY_SPECIFIED"], "type": "enum", "file": "git2/proxy.h", - "line": 20, - "lineto": 36, + "line": 26, + "lineto": 42, "block": "GIT_PROXY_NONE\nGIT_PROXY_AUTO\nGIT_PROXY_SPECIFIED", "tdef": "typedef", "description": " The type of proxy to use.", @@ -32461,8 +32982,8 @@ "type": "struct", "value": "git_push", "file": "git2/types.h", - "line": 253, - "lineto": 253, + "line": 269, + "lineto": 269, "tdef": "typedef", "description": " Preparation for a push operation. Can be used to configure what to\n push and the level of parallelism of the packfile builder.", "comments": "", @@ -32492,8 +33013,8 @@ "type": "struct", "value": "git_push_options", "file": "git2/remote.h", - "line": 814, - "lineto": 853, + "line": 860, + "lineto": 899, "block": "unsigned int version\nunsigned int pb_parallelism\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers\ngit_strarray remote_push_options", "tdef": "typedef", "description": " Controls the behavior of a git_push object.", @@ -32553,8 +33074,8 @@ "type": "struct", "value": "git_push_update", "file": "git2/remote.h", - "line": 479, - "lineto": 496, + "line": 490, + "lineto": 507, "block": "char * src_refname\nchar * dst_refname\ngit_oid src\ngit_oid dst", "tdef": "typedef", "description": " Represents an update which will be performed on the remote during push", @@ -32591,8 +33112,8 @@ "type": "struct", "value": "git_rebase", "file": "git2/types.h", - "line": 204, - "lineto": 204, + "line": 220, + "lineto": 220, "tdef": "typedef", "description": " Representation of a rebase ", "comments": "", @@ -32630,8 +33151,8 @@ "type": "struct", "value": "git_rebase_operation", "file": "git2/rebase.h", - "line": 172, - "lineto": 187, + "line": 174, + "lineto": 189, "block": "git_rebase_operation_t type\nconst git_oid id\nconst char * exec", "tdef": "typedef", "description": " A rebase operation", @@ -32672,8 +33193,8 @@ ], "type": "enum", "file": "git2/rebase.h", - "line": 120, - "lineto": 156, + "line": 119, + "lineto": 155, "block": "GIT_REBASE_OPERATION_PICK\nGIT_REBASE_OPERATION_REWORD\nGIT_REBASE_OPERATION_EDIT\nGIT_REBASE_OPERATION_SQUASH\nGIT_REBASE_OPERATION_FIXUP\nGIT_REBASE_OPERATION_EXEC", "tdef": "typedef", "description": " Type of rebase operation in-progress after calling `git_rebase_next`.", @@ -32737,7 +33258,7 @@ "value": "git_rebase_options", "file": "git2/rebase.h", "line": 32, - "lineto": 115, + "lineto": 114, "block": "unsigned int version\nint quiet\nint inmemory\nconst char * rewrite_notes_ref\ngit_merge_options merge_options\ngit_checkout_options checkout_options\ngit_commit_create_cb commit_create_cb\nint (*)(git_buf *, git_buf *, const char *, void *) signing_cb\nvoid * payload", "tdef": "typedef", "description": " Rebase options", @@ -32767,7 +33288,7 @@ { "type": "git_checkout_options", "name": "checkout_options", - "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that a minimum\n strategy of `GIT_CHECKOUT_SAFE` is defaulted in `init` and `next`,\n and a minimum strategy of `GIT_CHECKOUT_FORCE` is defaulted in\n `abort` to match git semantics." + "comments": " Options to control how files are written during `git_rebase_init`,\n `git_rebase_next` and `git_rebase_abort`. Note that during\n `abort`, these options will add an implied `GIT_CHECKOUT_FORCE`\n to match git semantics." }, { "type": "git_commit_create_cb", @@ -32802,8 +33323,8 @@ "type": "struct", "value": "git_refdb", "file": "git2/types.h", - "line": 103, - "lineto": 103, + "line": 108, + "lineto": 108, "tdef": "typedef", "description": " An open refs database handle. ", "comments": "", @@ -32826,8 +33347,8 @@ "type": "struct", "value": "git_refdb_backend", "file": "git2/types.h", - "line": 106, - "lineto": 106, + "line": 111, + "lineto": 111, "tdef": "typedef", "description": " A custom backend for refs ", "comments": "", @@ -32841,8 +33362,8 @@ "type": "struct", "value": "git_reference", "file": "git2/types.h", - "line": 189, - "lineto": 189, + "line": 194, + "lineto": 194, "tdef": "typedef", "description": " In-memory representation of a reference. ", "comments": "", @@ -32915,8 +33436,8 @@ ], "type": "enum", "file": "git2/refs.h", - "line": 661, - "lineto": 690, + "line": 663, + "lineto": 692, "block": "GIT_REFERENCE_FORMAT_NORMAL\nGIT_REFERENCE_FORMAT_ALLOW_ONELEVEL\nGIT_REFERENCE_FORMAT_REFSPEC_PATTERN\nGIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND", "tdef": "typedef", "description": " Normalization options for reference lookup", @@ -32957,8 +33478,8 @@ "type": "struct", "value": "git_reference_iterator", "file": "git2/types.h", - "line": 192, - "lineto": 192, + "line": 197, + "lineto": 197, "tdef": "typedef", "description": " Iterator for references ", "comments": "", @@ -32985,8 +33506,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 207, - "lineto": 212, + "line": 223, + "lineto": 228, "block": "GIT_REFERENCE_INVALID\nGIT_REFERENCE_DIRECT\nGIT_REFERENCE_SYMBOLIC\nGIT_REFERENCE_ALL", "tdef": "typedef", "description": " Basic type of any Git reference. ", @@ -33027,8 +33548,8 @@ "type": "struct", "value": "git_reflog", "file": "git2/types.h", - "line": 166, - "lineto": 166, + "line": 171, + "lineto": 171, "tdef": "typedef", "description": " Representation of a reference log ", "comments": "", @@ -33058,8 +33579,8 @@ "type": "struct", "value": "git_reflog_entry", "file": "git2/types.h", - "line": 163, - "lineto": 163, + "line": 168, + "lineto": 168, "tdef": "typedef", "description": " Representation of a reference log entry ", "comments": "", @@ -33081,8 +33602,8 @@ "type": "struct", "value": "git_refspec", "file": "git2/types.h", - "line": 235, - "lineto": 235, + "line": 251, + "lineto": 251, "tdef": "typedef", "description": " A refspec specifies the mapping between remote and local reference\n names when fetch or pushing.", "comments": "", @@ -33098,6 +33619,7 @@ "git_refspec_rtransform", "git_refspec_src", "git_refspec_src_matches", + "git_refspec_src_matches_negative", "git_refspec_string", "git_refspec_transform" ] @@ -33111,8 +33633,8 @@ "type": "struct", "value": "git_remote", "file": "git2/types.h", - "line": 241, - "lineto": 241, + "line": 257, + "lineto": 257, "tdef": "typedef", "description": " Git's idea of a remote repository. A remote can be anonymous (in\n which case it does not have backing configuration entries).", "comments": "", @@ -33176,8 +33698,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 696, - "lineto": 714, + "line": 739, + "lineto": 757, "block": "GIT_REMOTE_DOWNLOAD_TAGS_UNSPECIFIED\nGIT_REMOTE_DOWNLOAD_TAGS_AUTO\nGIT_REMOTE_DOWNLOAD_TAGS_NONE\nGIT_REMOTE_DOWNLOAD_TAGS_ALL", "tdef": "typedef", "description": " Automatic tag following option", @@ -33232,14 +33754,15 @@ "git_transport_cb transport", "git_remote_ready_cb remote_ready", "void * payload", - "git_url_resolve_cb resolve_url" + "git_url_resolve_cb resolve_url", + "int (*)(const char *, const git_oid *, const git_oid *, git_refspec *, void *) update_refs" ], "type": "struct", "value": "git_remote_callbacks", "file": "git2/remote.h", - "line": 557, - "lineto": 658, - "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url", + "line": 572, + "lineto": 698, + "block": "unsigned int version\ngit_transport_message_cb sideband_progress\nint (*)(git_remote_completion_t, void *) completion\ngit_credential_acquire_cb credentials\ngit_transport_certificate_check_cb certificate_check\ngit_indexer_progress_cb transfer_progress\nint (*)(const char *, const git_oid *, const git_oid *, void *) update_tips\ngit_packbuilder_progress pack_progress\ngit_push_transfer_progress_cb push_transfer_progress\ngit_push_update_reference_cb push_update_reference\ngit_push_negotiation push_negotiation\ngit_transport_cb transport\ngit_remote_ready_cb remote_ready\nvoid * payload\ngit_url_resolve_cb resolve_url\nint (*)(const char *, const git_oid *, const git_oid *, git_refspec *, void *) update_refs", "tdef": null, "description": " The callback settings structure", "comments": "

Set the callbacks to be called by the remote when informing the user about the progress of the network operations.

\n", @@ -33318,6 +33841,11 @@ "type": "git_url_resolve_cb", "name": "resolve_url", "comments": " Resolve URL before connecting to remote.\n The returned URL will be used to connect to the remote instead.\n\n This callback is deprecated; users should use\n git_remote_ready_cb and configure the instance URL instead." + }, + { + "type": "int (*)(const char *, const git_oid *, const git_oid *, git_refspec *, void *)", + "name": "update_refs", + "comments": "" } ], "used": { @@ -33341,8 +33869,8 @@ ], "type": "enum", "file": "git2/remote.h", - "line": 463, - "lineto": 467, + "line": 466, + "lineto": 470, "block": "GIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR\nGIT_REMOTE_COMPLETION_DOWNLOAD\nGIT_REMOTE_COMPLETION_INDEXING\nGIT_REMOTE_COMPLETION_ERROR", "tdef": "typedef", "description": " Argument to the completion callback which tells it which operation\n finished.", @@ -33383,8 +33911,8 @@ "type": "struct", "value": "git_remote_connect_options", "file": "git2/remote.h", - "line": 879, - "lineto": 897, + "line": 928, + "lineto": 946, "block": "unsigned int version\ngit_remote_callbacks callbacks\ngit_proxy_options proxy_opts\ngit_remote_redirect_t follow_redirects\ngit_strarray custom_headers", "tdef": "typedef", "description": " Remote creation options structure", @@ -33514,8 +34042,8 @@ "type": "struct", "value": "git_remote_head", "file": "git2/net.h", - "line": 40, - "lineto": 50, + "line": 41, + "lineto": 51, "block": "int local\ngit_oid oid\ngit_oid loid\nchar * name\nchar * symref_target", "tdef": null, "description": " Description of a reference advertised by a remote server, given out\n on `ls` calls.", @@ -33612,8 +34140,8 @@ "type": "struct", "value": "git_repository", "file": "git2/types.h", - "line": 118, - "lineto": 118, + "line": 123, + "lineto": 123, "tdef": "typedef", "description": " Representation of an existing git repository,\n including all its object contents", "comments": "", @@ -33646,7 +34174,6 @@ "git_attr_get_ext", "git_attr_get_many", "git_attr_get_many_ext", - "git_blame_file", "git_blob_create_from_buffer", "git_blob_create_from_disk", "git_blob_create_from_stream", @@ -33707,15 +34234,6 @@ "git_merge_commits", "git_merge_file_from_index", "git_merge_trees", - "git_note_commit_create", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_create", - "git_note_default_ref", - "git_note_foreach", - "git_note_iterator_new", - "git_note_read", - "git_note_remove", "git_object_lookup", "git_object_lookup_prefix", "git_packbuilder_new", @@ -33801,6 +34319,7 @@ "git_repository_state", "git_repository_state_cleanup", "git_repository_workdir", + "git_repository_wrap_odb", "git_reset", "git_reset_default", "git_reset_from_annotated", @@ -33811,6 +34330,7 @@ "git_revparse_single", "git_revwalk_new", "git_signature_default", + "git_signature_default_from_env", "git_stash_apply", "git_stash_drop", "git_stash_foreach", @@ -33873,8 +34393,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 236, - "lineto": 282, + "line": 249, + "lineto": 295, "block": "GIT_REPOSITORY_INIT_BARE\nGIT_REPOSITORY_INIT_NO_REINIT\nGIT_REPOSITORY_INIT_NO_DOTGIT_DIR\nGIT_REPOSITORY_INIT_MKDIR\nGIT_REPOSITORY_INIT_MKPATH\nGIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE\nGIT_REPOSITORY_INIT_RELATIVE_GITLINK", "tdef": "typedef", "description": " Option flags for `git_repository_init_ext`.", @@ -33936,8 +34456,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 291, - "lineto": 307, + "line": 304, + "lineto": 320, "block": "GIT_REPOSITORY_INIT_SHARED_UMASK\nGIT_REPOSITORY_INIT_SHARED_GROUP\nGIT_REPOSITORY_INIT_SHARED_ALL", "tdef": "typedef", "description": " Mode options for `git_repository_init_ext`.", @@ -33981,8 +34501,8 @@ "type": "struct", "value": "git_repository_init_options", "file": "git2/repository.h", - "line": 315, - "lineto": 374, + "line": 328, + "lineto": 387, "block": "unsigned int version\nuint32_t flags\nuint32_t mode\nconst char * workdir_path\nconst char * description\nconst char * template_path\nconst char * initial_head\nconst char * origin_url", "tdef": "typedef", "description": " Extended options structure for `git_repository_init_ext`.", @@ -34057,8 +34577,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 492, - "lineto": 509, + "line": 512, + "lineto": 529, "block": "GIT_REPOSITORY_ITEM_GITDIR\nGIT_REPOSITORY_ITEM_WORKDIR\nGIT_REPOSITORY_ITEM_COMMONDIR\nGIT_REPOSITORY_ITEM_INDEX\nGIT_REPOSITORY_ITEM_OBJECTS\nGIT_REPOSITORY_ITEM_REFS\nGIT_REPOSITORY_ITEM_PACKED_REFS\nGIT_REPOSITORY_ITEM_REMOTES\nGIT_REPOSITORY_ITEM_CONFIG\nGIT_REPOSITORY_ITEM_INFO\nGIT_REPOSITORY_ITEM_HOOKS\nGIT_REPOSITORY_ITEM_LOGS\nGIT_REPOSITORY_ITEM_MODULES\nGIT_REPOSITORY_ITEM_WORKTREES\nGIT_REPOSITORY_ITEM_WORKTREE_CONFIG\nGIT_REPOSITORY_ITEM__LAST", "tdef": "typedef", "description": " List of items which belong to the git repository layout", @@ -34176,8 +34696,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 109, - "lineto": 156, + "line": 110, + "lineto": 157, "block": "GIT_REPOSITORY_OPEN_NO_SEARCH\nGIT_REPOSITORY_OPEN_CROSS_FS\nGIT_REPOSITORY_OPEN_BARE\nGIT_REPOSITORY_OPEN_NO_DOTGIT\nGIT_REPOSITORY_OPEN_FROM_ENV", "tdef": "typedef", "description": " Option flags for `git_repository_open_ext`.", @@ -34236,8 +34756,8 @@ ], "type": "enum", "file": "git2/repository.h", - "line": 893, - "lineto": 906, + "line": 915, + "lineto": 928, "block": "GIT_REPOSITORY_STATE_NONE\nGIT_REPOSITORY_STATE_MERGE\nGIT_REPOSITORY_STATE_REVERT\nGIT_REPOSITORY_STATE_REVERT_SEQUENCE\nGIT_REPOSITORY_STATE_CHERRYPICK\nGIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE\nGIT_REPOSITORY_STATE_BISECT\nGIT_REPOSITORY_STATE_REBASE\nGIT_REPOSITORY_STATE_REBASE_INTERACTIVE\nGIT_REPOSITORY_STATE_REBASE_MERGE\nGIT_REPOSITORY_STATE_APPLY_MAILBOX\nGIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE", "tdef": "typedef", "description": " Repository state", @@ -34478,8 +34998,8 @@ "type": "struct", "value": "git_revwalk", "file": "git2/types.h", - "line": 127, - "lineto": 127, + "line": 132, + "lineto": 132, "tdef": "typedef", "description": " Representation of an in-progress walk through the commits in a repo ", "comments": "", @@ -34515,8 +35035,8 @@ "type": "struct", "value": "git_signature", "file": "git2/types.h", - "line": 182, - "lineto": 186, + "line": 187, + "lineto": 191, "block": "char * name\nchar * email\ngit_time when", "tdef": "typedef", "description": " An action signature (e.g. for committers, taggers, etc) ", @@ -34542,8 +35062,6 @@ "returns": [ "git_commit_author", "git_commit_committer", - "git_note_author", - "git_note_committer", "git_reflog_entry_committer", "git_tag_tagger" ], @@ -34555,16 +35073,12 @@ "git_commit_create_buffer", "git_commit_create_cb", "git_commit_create_v", - "git_email_create_from_diff", "git_mailmap_resolve_signature", - "git_note_commit_create", - "git_note_commit_remove", - "git_note_create", - "git_note_remove", "git_rebase_commit", "git_rebase_finish", "git_reflog_append", "git_signature_default", + "git_signature_default_from_env", "git_signature_dup", "git_signature_free", "git_signature_from_buffer", @@ -34590,8 +35104,8 @@ ], "type": "enum", "file": "git2/sys/transport.h", - "line": 313, - "lineto": 318, + "line": 323, + "lineto": 328, "block": "GIT_SERVICE_UPLOADPACK_LS\nGIT_SERVICE_UPLOADPACK\nGIT_SERVICE_RECEIVEPACK_LS\nGIT_SERVICE_RECEIVEPACK", "tdef": "typedef", "description": " Actions that the smart transport can ask a subtransport to perform ", @@ -34677,8 +35191,8 @@ "decl": ["GIT_STASH_APPLY_DEFAULT", "GIT_STASH_APPLY_REINSTATE_INDEX"], "type": "enum", "file": "git2/stash.h", - "line": 129, - "lineto": 136, + "line": 137, + "lineto": 144, "block": "GIT_STASH_APPLY_DEFAULT\nGIT_STASH_APPLY_REINSTATE_INDEX", "tdef": "typedef", "description": " Stash application flags. ", @@ -34713,8 +35227,8 @@ "type": "struct", "value": "git_stash_apply_options", "file": "git2/stash.h", - "line": 180, - "lineto": 192, + "line": 192, + "lineto": 204, "block": "unsigned int version\nuint32_t flags\ngit_checkout_options checkout_options\ngit_stash_apply_progress_cb progress_cb\nvoid * progress_payload", "tdef": "typedef", "description": " Stash application options structure", @@ -34763,8 +35277,8 @@ ], "type": "enum", "file": "git2/stash.h", - "line": 139, - "lineto": 162, + "line": 147, + "lineto": 170, "block": "GIT_STASH_APPLY_PROGRESS_NONE\nGIT_STASH_APPLY_PROGRESS_LOADING_STASH\nGIT_STASH_APPLY_PROGRESS_ANALYZE_INDEX\nGIT_STASH_APPLY_PROGRESS_ANALYZE_MODIFIED\nGIT_STASH_APPLY_PROGRESS_ANALYZE_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_UNTRACKED\nGIT_STASH_APPLY_PROGRESS_CHECKOUT_MODIFIED\nGIT_STASH_APPLY_PROGRESS_DONE", "tdef": "typedef", "description": " Stash apply progression states ", @@ -34834,8 +35348,8 @@ ], "type": "enum", "file": "git2/stash.h", - "line": 25, - "lineto": 53, + "line": 30, + "lineto": 58, "block": "GIT_STASH_DEFAULT\nGIT_STASH_KEEP_INDEX\nGIT_STASH_INCLUDE_UNTRACKED\nGIT_STASH_INCLUDE_IGNORED\nGIT_STASH_KEEP_ALL", "tdef": "typedef", "description": " Stash flags", @@ -34888,8 +35402,8 @@ "type": "struct", "value": "git_stash_save_options", "file": "git2/stash.h", - "line": 81, - "lineto": 95, + "line": 86, + "lineto": 100, "block": "unsigned int version\nuint32_t flags\nconst git_signature * stasher\nconst char * message\ngit_strarray paths", "tdef": "typedef", "description": " Stash save options structure", @@ -34934,8 +35448,8 @@ "type": "struct", "value": "git_status_entry", "file": "git2/status.h", - "line": 295, - "lineto": 299, + "line": 298, + "lineto": 302, "block": "git_status_t status\ngit_diff_delta * head_to_index\ngit_diff_delta * index_to_workdir", "tdef": "typedef", "description": " A status entry, providing the differences between the file as it exists\n in HEAD and the index, and providing the differences between the index\n and the working directory.", @@ -34963,8 +35477,8 @@ "type": "struct", "value": "git_status_list", "file": "git2/types.h", - "line": 201, - "lineto": 201, + "line": 217, + "lineto": 217, "tdef": "typedef", "description": " Representation of a status collection ", "comments": "", @@ -35002,8 +35516,8 @@ ], "type": "enum", "file": "git2/status.h", - "line": 101, - "lineto": 208, + "line": 100, + "lineto": 207, "block": "GIT_STATUS_OPT_INCLUDE_UNTRACKED\nGIT_STATUS_OPT_INCLUDE_IGNORED\nGIT_STATUS_OPT_INCLUDE_UNMODIFIED\nGIT_STATUS_OPT_EXCLUDE_SUBMODULES\nGIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS\nGIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH\nGIT_STATUS_OPT_RECURSE_IGNORED_DIRS\nGIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX\nGIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR\nGIT_STATUS_OPT_SORT_CASE_SENSITIVELY\nGIT_STATUS_OPT_SORT_CASE_INSENSITIVELY\nGIT_STATUS_OPT_RENAMES_FROM_REWRITES\nGIT_STATUS_OPT_NO_REFRESH\nGIT_STATUS_OPT_UPDATE_INDEX\nGIT_STATUS_OPT_INCLUDE_UNREADABLE\nGIT_STATUS_OPT_INCLUDE_UNREADABLE_AS_UNTRACKED", "tdef": "typedef", "description": " Flags to control status callbacks", @@ -35181,8 +35695,8 @@ ], "type": "enum", "file": "git2/status.h", - "line": 73, - "lineto": 91, + "line": 72, + "lineto": 90, "block": "GIT_STATUS_SHOW_INDEX_AND_WORKDIR\nGIT_STATUS_SHOW_INDEX_ONLY\nGIT_STATUS_SHOW_WORKDIR_ONLY", "tdef": "typedef", "description": " Select the files on which to report status.", @@ -35377,8 +35891,8 @@ "decl": ["GIT_STREAM_STANDARD", "GIT_STREAM_TLS"], "type": "enum", "file": "git2/sys/stream.h", - "line": 91, - "lineto": 97, + "line": 99, + "lineto": 105, "block": "GIT_STREAM_STANDARD\nGIT_STREAM_TLS", "tdef": "typedef", "description": " The type of stream to register.", @@ -35407,8 +35921,8 @@ "type": "struct", "value": "git_submodule", "file": "git2/types.h", - "line": 267, - "lineto": 267, + "line": 283, + "lineto": 283, "tdef": "typedef", "description": " Opaque structure representing a submodule.", "comments": "", @@ -35467,8 +35981,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 331, - "lineto": 338, + "line": 347, + "lineto": 354, "block": "GIT_SUBMODULE_IGNORE_UNSPECIFIED\nGIT_SUBMODULE_IGNORE_NONE\nGIT_SUBMODULE_IGNORE_UNTRACKED\nGIT_SUBMODULE_IGNORE_DIRTY\nGIT_SUBMODULE_IGNORE_ALL", "tdef": "typedef", "description": " Submodule ignore values", @@ -35521,8 +36035,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 350, - "lineto": 354, + "line": 366, + "lineto": 370, "block": "GIT_SUBMODULE_RECURSE_NO\nGIT_SUBMODULE_RECURSE_YES\nGIT_SUBMODULE_RECURSE_ONDEMAND", "tdef": "typedef", "description": " Options for submodule recurse.", @@ -35681,8 +36195,8 @@ "type": "struct", "value": "git_submodule_update_options", "file": "git2/submodule.h", - "line": 128, - "lineto": 153, + "line": 135, + "lineto": 158, "block": "unsigned int version\ngit_checkout_options checkout_opts\ngit_fetch_options fetch_opts\nint allow_fetch", "tdef": "typedef", "description": " Submodule update options structure", @@ -35692,7 +36206,7 @@ { "type": "git_checkout_options", "name": "checkout_opts", - "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to\n `GIT_CHECKOUT_NONE`. Generally you will want the use\n GIT_CHECKOUT_SAFE to update files in the working\n directory." + "comments": " These options are passed to the checkout step. To disable\n checkout, set the `checkout_strategy` to `GIT_CHECKOUT_NONE`\n or `GIT_CHECKOUT_DRY_RUN`." }, { "type": "git_fetch_options", @@ -35727,8 +36241,8 @@ ], "type": "enum", "file": "git2/types.h", - "line": 295, - "lineto": 302, + "line": 311, + "lineto": 318, "block": "GIT_SUBMODULE_UPDATE_CHECKOUT\nGIT_SUBMODULE_UPDATE_REBASE\nGIT_SUBMODULE_UPDATE_MERGE\nGIT_SUBMODULE_UPDATE_NONE\nGIT_SUBMODULE_UPDATE_DEFAULT", "tdef": "typedef", "description": " Submodule update values", @@ -35778,8 +36292,8 @@ "type": "struct", "value": "git_tag", "file": "git2/types.h", - "line": 130, - "lineto": 130, + "line": 135, + "lineto": 135, "tdef": "typedef", "description": " Parsed representation of a tag object. ", "comments": "", @@ -35811,8 +36325,8 @@ "type": "struct", "value": "git_time", "file": "git2/types.h", - "line": 175, - "lineto": 179, + "line": 180, + "lineto": 184, "block": "git_time_t time\nint offset\nchar sign", "tdef": "typedef", "description": " Time in a signature ", @@ -35914,8 +36428,8 @@ "type": "struct", "value": "git_transaction", "file": "git2/types.h", - "line": 195, - "lineto": 195, + "line": 200, + "lineto": 200, "tdef": "typedef", "description": " Transactional interface to references ", "comments": "", @@ -35942,8 +36456,8 @@ "type": "struct", "value": "git_transport", "file": "git2/types.h", - "line": 247, - "lineto": 247, + "line": 263, + "lineto": 263, "tdef": "typedef", "description": " Interface which represents a transport to communicate with a\n remote.", "comments": "", @@ -35957,8 +36471,8 @@ "type": "struct", "value": "git_tree", "file": "git2/types.h", - "line": 142, - "lineto": 142, + "line": 147, + "lineto": 147, "tdef": "typedef", "description": " Representation of a tree object. ", "comments": "", @@ -36029,8 +36543,8 @@ "type": "struct", "value": "git_tree_entry", "file": "git2/types.h", - "line": 139, - "lineto": 139, + "line": 144, + "lineto": 144, "tdef": "typedef", "description": " Representation of each one of the entries in a tree object. ", "comments": "", @@ -36071,8 +36585,8 @@ "type": "struct", "value": "git_tree_update", "file": "git2/tree.h", - "line": 438, - "lineto": 447, + "line": 449, + "lineto": 458, "block": "git_tree_update_t action\ngit_oid id\ngit_filemode_t filemode\nconst char * path", "tdef": "typedef", "description": " An action to perform during the update of a tree", @@ -36104,8 +36618,8 @@ "decl": ["GIT_TREE_UPDATE_UPSERT", "GIT_TREE_UPDATE_REMOVE"], "type": "enum", "file": "git2/tree.h", - "line": 428, - "lineto": 433, + "line": 439, + "lineto": 444, "block": "GIT_TREE_UPDATE_UPSERT\nGIT_TREE_UPDATE_REMOVE", "tdef": "typedef", "description": " The kind of update to perform", @@ -36134,8 +36648,8 @@ "type": "struct", "value": "git_treebuilder", "file": "git2/types.h", - "line": 145, - "lineto": 145, + "line": 150, + "lineto": 150, "tdef": "typedef", "description": " Constructor for in-memory trees ", "comments": "", @@ -36162,8 +36676,8 @@ "decl": ["GIT_TREEWALK_PRE", "GIT_TREEWALK_POST"], "type": "enum", "file": "git2/tree.h", - "line": 387, - "lineto": 390, + "line": 398, + "lineto": 401, "block": "GIT_TREEWALK_PRE\nGIT_TREEWALK_POST", "tdef": "typedef", "description": " Tree traversal modes ", @@ -36192,8 +36706,8 @@ "type": "struct", "value": "git_worktree", "file": "git2/types.h", - "line": 121, - "lineto": 121, + "line": 126, + "lineto": 126, "tdef": "typedef", "description": " Representation of a working tree ", "comments": "", @@ -36274,8 +36788,8 @@ "type": "struct", "value": "git_worktree_prune_options", "file": "git2/worktree.h", - "line": 207, - "lineto": 212, + "line": 210, + "lineto": 215, "block": "unsigned int version\nuint32_t flags", "tdef": "typedef", "description": " Worktree prune options structure", @@ -36308,8 +36822,8 @@ ], "type": "enum", "file": "git2/worktree.h", - "line": 191, - "lineto": 198, + "line": 194, + "lineto": 201, "block": "GIT_WORKTREE_PRUNE_VALID\nGIT_WORKTREE_PRUNE_LOCKED\nGIT_WORKTREE_PRUNE_WORKING_TREE", "tdef": "typedef", "description": " Flags which can be passed to git_worktree_prune to alter its\n behavior.", @@ -36348,8 +36862,8 @@ "type": "struct", "value": "git_writestream", "file": "git2/types.h", - "line": 359, - "lineto": 363, + "line": 375, + "lineto": 379, "tdef": null, "description": " A type to write in a streaming fashion, for example, for filters. ", "comments": "", @@ -36418,12 +36932,16 @@ "blame", [ "git_blame_buffer", - "git_blame_file", "git_blame_free", "git_blame_get_hunk_byindex", "git_blame_get_hunk_byline", "git_blame_get_hunk_count", + "git_blame_hunk_byindex", + "git_blame_hunk_byline", + "git_blame_hunkcount", "git_blame_init_options", + "git_blame_line_byindex", + "git_blame_linecount", "git_blame_options_init" ] ], @@ -36581,6 +37099,7 @@ "git_config_set_int64", "git_config_set_multivar", "git_config_set_string", + "git_config_set_writeorder", "git_config_snapshot" ] ], @@ -36651,7 +37170,7 @@ "git_diff_tree_to_workdir_with_index" ] ], - ["email", ["git_email_create_from_commit", "git_email_create_from_diff"]], + ["email", ["git_email_create_from_commit"]], ["error", ["git_error_last"]], ["fetch", ["git_fetch_options_init"]], [ @@ -36720,6 +37239,8 @@ "git_index_iterator_free", "git_index_iterator_new", "git_index_iterator_next", + "git_index_new", + "git_index_open", "git_index_owner", "git_index_path", "git_index_read", @@ -36752,6 +37273,7 @@ [ "libgit2", [ + "git_libgit2_feature_backend", "git_libgit2_features", "git_libgit2_init", "git_libgit2_opts", @@ -36801,28 +37323,7 @@ "git_message_trailers" ] ], - [ - "note", - [ - "git_note_author", - "git_note_commit_create", - "git_note_commit_iterator_new", - "git_note_commit_read", - "git_note_commit_remove", - "git_note_committer", - "git_note_create", - "git_note_default_ref", - "git_note_foreach", - "git_note_free", - "git_note_id", - "git_note_iterator_free", - "git_note_iterator_new", - "git_note_message", - "git_note_next", - "git_note_read", - "git_note_remove" - ] - ], + ["note", ["git_note_iterator_free", "git_note_next"]], [ "object", [ @@ -36849,6 +37350,9 @@ "git_odb_add_alternate", "git_odb_add_backend", "git_odb_add_disk_alternate", + "git_odb_backend_loose", + "git_odb_backend_one_pack", + "git_odb_backend_pack", "git_odb_exists", "git_odb_exists_ext", "git_odb_exists_prefix", @@ -36856,6 +37360,9 @@ "git_odb_foreach", "git_odb_free", "git_odb_get_backend", + "git_odb_hash", + "git_odb_hashfile", + "git_odb_new", "git_odb_num_backends", "git_odb_object_data", "git_odb_object_dup", @@ -36863,6 +37370,7 @@ "git_odb_object_id", "git_odb_object_size", "git_odb_object_type", + "git_odb_open", "git_odb_open_rstream", "git_odb_open_wstream", "git_odb_read", @@ -36886,6 +37394,10 @@ "git_oid_cpy", "git_oid_equal", "git_oid_fmt", + "git_oid_fromraw", + "git_oid_fromstr", + "git_oid_fromstrn", + "git_oid_fromstrp", "git_oid_is_zero", "git_oid_ncmp", "git_oid_nfmt", @@ -37068,6 +37580,7 @@ "git_refspec_rtransform", "git_refspec_src", "git_refspec_src_matches", + "git_refspec_src_matches_negative", "git_refspec_string", "git_refspec_transform" ] @@ -37171,7 +37684,8 @@ "git_repository_set_workdir", "git_repository_state", "git_repository_state_cleanup", - "git_repository_workdir" + "git_repository_workdir", + "git_repository_wrap_odb" ] ], ["reset", ["git_reset", "git_reset_default", "git_reset_from_annotated"]], @@ -37203,6 +37717,7 @@ "signature", [ "git_signature_default", + "git_signature_default_from_env", "git_signature_dup", "git_signature_free", "git_signature_from_buffer", @@ -37385,34 +37900,34 @@ ] ], "examples": [ - ["add.c", "ex/v1.8.4/add.html"], - ["args.c", "ex/v1.8.4/args.html"], - ["blame.c", "ex/v1.8.4/blame.html"], - ["cat-file.c", "ex/v1.8.4/cat-file.html"], - ["checkout.c", "ex/v1.8.4/checkout.html"], - ["clone.c", "ex/v1.8.4/clone.html"], - ["commit.c", "ex/v1.8.4/commit.html"], - ["common.c", "ex/v1.8.4/common.html"], - ["config.c", "ex/v1.8.4/config.html"], - ["describe.c", "ex/v1.8.4/describe.html"], - ["diff.c", "ex/v1.8.4/diff.html"], - ["fetch.c", "ex/v1.8.4/fetch.html"], - ["for-each-ref.c", "ex/v1.8.4/for-each-ref.html"], - ["general.c", "ex/v1.8.4/general.html"], - ["index-pack.c", "ex/v1.8.4/index-pack.html"], - ["init.c", "ex/v1.8.4/init.html"], - ["lg2.c", "ex/v1.8.4/lg2.html"], - ["log.c", "ex/v1.8.4/log.html"], - ["ls-files.c", "ex/v1.8.4/ls-files.html"], - ["ls-remote.c", "ex/v1.8.4/ls-remote.html"], - ["merge.c", "ex/v1.8.4/merge.html"], - ["push.c", "ex/v1.8.4/push.html"], - ["remote.c", "ex/v1.8.4/remote.html"], - ["rev-list.c", "ex/v1.8.4/rev-list.html"], - ["rev-parse.c", "ex/v1.8.4/rev-parse.html"], - ["show-index.c", "ex/v1.8.4/show-index.html"], - ["stash.c", "ex/v1.8.4/stash.html"], - ["status.c", "ex/v1.8.4/status.html"], - ["tag.c", "ex/v1.8.4/tag.html"] + ["add.c", "ex/v1.9.1/add.html"], + ["args.c", "ex/v1.9.1/args.html"], + ["blame.c", "ex/v1.9.1/blame.html"], + ["cat-file.c", "ex/v1.9.1/cat-file.html"], + ["checkout.c", "ex/v1.9.1/checkout.html"], + ["clone.c", "ex/v1.9.1/clone.html"], + ["commit.c", "ex/v1.9.1/commit.html"], + ["common.c", "ex/v1.9.1/common.html"], + ["config.c", "ex/v1.9.1/config.html"], + ["describe.c", "ex/v1.9.1/describe.html"], + ["diff.c", "ex/v1.9.1/diff.html"], + ["fetch.c", "ex/v1.9.1/fetch.html"], + ["for-each-ref.c", "ex/v1.9.1/for-each-ref.html"], + ["general.c", "ex/v1.9.1/general.html"], + ["index-pack.c", "ex/v1.9.1/index-pack.html"], + ["init.c", "ex/v1.9.1/init.html"], + ["lg2.c", "ex/v1.9.1/lg2.html"], + ["log.c", "ex/v1.9.1/log.html"], + ["ls-files.c", "ex/v1.9.1/ls-files.html"], + ["ls-remote.c", "ex/v1.9.1/ls-remote.html"], + ["merge.c", "ex/v1.9.1/merge.html"], + ["push.c", "ex/v1.9.1/push.html"], + ["remote.c", "ex/v1.9.1/remote.html"], + ["rev-list.c", "ex/v1.9.1/rev-list.html"], + ["rev-parse.c", "ex/v1.9.1/rev-parse.html"], + ["show-index.c", "ex/v1.9.1/show-index.html"], + ["stash.c", "ex/v1.9.1/stash.html"], + ["status.c", "ex/v1.9.1/status.html"], + ["tag.c", "ex/v1.9.1/tag.html"] ] } diff --git a/vendor/libgit2 b/vendor/libgit2 index 6bfd2b901..2644628ed 160000 --- a/vendor/libgit2 +++ b/vendor/libgit2 @@ -1 +1 @@ -Subproject commit 6bfd2b9011897a30494451e75a95cff5b88b93b9 +Subproject commit 2644628edb8742338a952d40f5e9549b17480e3a diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index 36dc305e5..a155fb67f 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -83,9 +83,9 @@ "libgit2/src/libgit2/graph.c", "libgit2/src/libgit2/hashsig.c", "libgit2/src/libgit2/ident.c", - "libgit2/src/libgit2/idxmap.c", "libgit2/src/libgit2/ignore.c", "libgit2/src/libgit2/index.c", + "libgit2/src/libgit2/index_map.c", "libgit2/src/libgit2/indexer.c", "libgit2/src/libgit2/iterator.c", "libgit2/src/libgit2/libgit2.c", @@ -103,10 +103,8 @@ "libgit2/src/libgit2/odb_loose.c", "libgit2/src/libgit2/odb_mempack.c", "libgit2/src/libgit2/odb_pack.c", - "libgit2/src/libgit2/offmap.c", "libgit2/src/libgit2/oid.c", "libgit2/src/libgit2/oidarray.c", - "libgit2/src/libgit2/oidmap.c", "libgit2/src/libgit2/pack-objects.c", "libgit2/src/libgit2/pack.c", "libgit2/src/libgit2/parse.c", @@ -197,7 +195,6 @@ "libgit2/src/util/sortedcache.c", "libgit2/src/util/str.c", "libgit2/src/util/strlist.c", - "libgit2/src/util/strmap.c", "libgit2/src/util/thread.c", "libgit2/src/util/tsort.c", "libgit2/src/util/utf8.c", From c3ab6082b7c9a7478a3c382f881d4d0fe8654ead Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 16:46:03 -0700 Subject: [PATCH 508/545] remove special-case for git_oid_fromstrp --- generate/input/libgit2-supplement.json | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index d94be9ba0..f9de5700d 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -667,25 +667,6 @@ }, "group": "index_reuc_entry" }, - "git_oid_fromstrp": { - "type": "function", - "file": "oid.h", - "args": [ - { - "name": "out", - "type": "git_oid *" - }, - { - "name": "str", - "type": "const char *" - } - ], - "return": { - "type": "int" - }, - "isAsync": false, - "group": "oid" - }, "git_patch_convenient_from_diff": { "args": [ { @@ -1171,12 +1152,6 @@ "git_merge_file_result_free" ] ], - [ - "oid", - [ - "git_oid_fromstrp" - ] - ], [ "odb_object", [ From 6b546f47f025ccab591b1b16b675510369c7ac2b Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 17 Oct 2025 19:17:57 -0700 Subject: [PATCH 509/545] fix missing blame functions and struct --- generate/input/libgit2-supplement.json | 114 ++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 4 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index f9de5700d..732f27923 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -216,7 +216,7 @@ ] } }, - "new" : { + "new": { "functions": { "git_libgit2_opts": { "type": "function", @@ -226,6 +226,33 @@ "isPrototypeMethod": false, "group": "libgit2" }, + "git_blame_file": { + "type": "function", + "file": "blame.h", + "args": [ + { + "name": "out", + "type": "git_blame **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "path", + "type": "const char *" + }, + { + "name": "options", + "type": "git_blame_options *" + } + ], + "group": "blame", + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_clone": { "isManual": true, "cFile": "generate/templates/manual/clone/clone.cc", @@ -1298,6 +1325,62 @@ } } ], + [ + "git_blame_hunk", + { + "type": "struct", + "fields": [ + { + "name": "lines_in_hunk", + "type": "int" + }, + { + "name": "final_commit_id", + "type": "git_oid" + }, + { + "name": "final_start_line_number", + "type": "size_t" + }, + { + "name": "final_signature", + "type": "git_signature *" + }, + { + "name": "final_committer", + "type": "git_signature *" + }, + { + "name": "orig_commit_id", + "type": "git_oid" + }, + { + "name": "orig_path", + "type": "const char *" + }, + { + "name": "orig_start_line_number", + "type": "size_t" + }, + { + "name": "orig_signature", + "type": "git_signature *" + }, + { + "name": "orig_committer", + "type": "git_signature *" + }, + { + "name": "summary", + "type": "const char *" + }, + { + "name": "boundary", + "type": "char" + } + ] + } + ], [ "git_blob_filter_options", { @@ -1383,7 +1466,7 @@ ], [ "git_commit_create_options", - { + { "decl": [ "unsigned int version", "unsigned int allow_empty_commit : 1", @@ -2138,5 +2221,28 @@ ] } }, - "groups": {} -} + "groups": { + "blame": [ + "git_blame_file" + ], + "note": [ + "git_note_author", + "git_note_commit_create", + "git_note_commit_iterator_new", + "git_note_commit_read", + "git_note_commit_remove", + "git_note_committer", + "git_note_create", + "git_note_default_ref", + "git_note_foreach", + "git_note_free", + "git_note_id", + "git_note_iterator_free", + "git_note_iterator_new", + "git_note_message", + "git_note_next", + "git_note_read", + "git_note_remove" + ] + } +} \ No newline at end of file From 4ce9820deeca62fb02bcf1cde3a8c13aecda97ef Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 17 Oct 2025 19:19:39 -0700 Subject: [PATCH 510/545] fix missing note functions --- generate/input/libgit2-supplement.json | 394 +++++++++++++++++++++++++ 1 file changed, 394 insertions(+) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 732f27923..09433e7fa 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -694,6 +694,400 @@ }, "group": "index_reuc_entry" }, + "git_note_author": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const git_signature *" + }, + "group": "note" + }, + "git_note_commit_create": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *" + }, + { + "name": "notes_blob_out", + "type": "git_oid *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "parent", + "type": "git_commit *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + }, + { + "name": "note", + "type": "const char *" + }, + { + "name": "allow_note_overwrite", + "type": "int" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_commit_iterator_new": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note_iterator **" + }, + { + "name": "notes_commit", + "type": "git_commit *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_commit_read": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_commit", + "type": "git_commit *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_commit_remove": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "notes_commit_out", + "type": "git_oid *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_commit", + "type": "git_commit *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_committer": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const git_signature *" + }, + "group": "note" + }, + "git_note_create": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_oid *" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + }, + { + "name": "note", + "type": "const char *" + }, + { + "name": "force", + "type": "int" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_default_ref": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_buf *" + }, + { + "name": "repo", + "type": "git_repository *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_foreach": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "note_cb", + "type": "git_note_foreach_cb" + }, + { + "name": "payload", + "type": "void *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_free": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "git_note *" + } + ], + "return": { + "type": "void" + }, + "group": "note" + }, + "git_note_id": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const git_oid *" + }, + "group": "note" + }, + "git_note_iterator_free": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "it", + "type": "git_note_iterator *" + } + ], + "return": { + "type": "void" + }, + "group": "note" + }, + "git_note_iterator_new": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note_iterator **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_message": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note", + "type": "const git_note *" + } + ], + "return": { + "type": "const char *" + }, + "group": "note" + }, + "git_note_next": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "note_id", + "type": "git_oid *" + }, + { + "name": "annotated_id", + "type": "git_oid *" + }, + { + "name": "it", + "type": "git_note_iterator *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_read": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "out", + "type": "git_note **" + }, + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, + "git_note_remove": { + "type": "function", + "file": "note.h", + "args": [ + { + "name": "repo", + "type": "git_repository *" + }, + { + "name": "notes_ref", + "type": "const char *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "committer", + "type": "const git_signature *" + }, + { + "name": "oid", + "type": "const git_oid *" + } + ], + "return": { + "type": "int" + }, + "group": "note" + }, "git_patch_convenient_from_diff": { "args": [ { From 676a56753dfc23dbf7221ac5e35530704a29bc25 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 17 Oct 2025 19:22:13 -0700 Subject: [PATCH 511/545] fix odb.read mis-classification first parameter had it's name changed so it's no longer treated as an output parameter --- generate/input/descriptor.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 3e305900d..889b792e7 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2602,9 +2602,11 @@ "ignore": true }, "git_odb_read": { + "isAsync": true, "cppFunctionName": "OdbRead", "args": { - "out": { + "obj": { + "isReturn": true, "ownedByThis": true } } From 295bf46512c346e35ea0ffd13889aa92f30fd500 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 5 Nov 2025 21:02:13 -0700 Subject: [PATCH 512/545] don't run openssl workflow automatically --- .github/workflows/build-openssl-packages.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index f9b8ab7b0..426ca0652 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -2,9 +2,6 @@ name: Build and Publish OpenSSL Packages on: workflow_dispatch: - push: - branches: - - master jobs: build-openssl: From d8700c9777b4324cd06b9751aa446a4f278da244 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 9 Oct 2025 08:26:58 -0700 Subject: [PATCH 513/545] upgrade to openssl 3.0 --- generate/templates/templates/binding.gyp | 5 ++-- utils/acquireOpenSSL.mjs | 13 ++++++++--- ...01-linux-force_getentropy_dso_lookup.patch | 23 ------------------- 3 files changed, 12 insertions(+), 29 deletions(-) delete mode 100644 vendor/patches/openssl/001-linux-force_getentropy_dso_lookup.patch diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 61cad0cb5..b5e189c32 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -160,9 +160,8 @@ "<(electron_openssl_root)/include" ], "libraries": [ - # this order is significant on centos7 apparently... - "<(electron_openssl_root)/lib/libssl.a", - "<(electron_openssl_root)/lib/libcrypto.a" + "<(electron_openssl_root)/lib64/libssl.a", + "<(electron_openssl_root)/lib64/libcrypto.a" ] }], ["<(is_electron) == 1 and <(electron_openssl_static) != 1", { diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index 1d83f540b..f16c62e15 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -14,7 +14,7 @@ const pipeline = promisify(stream.pipeline); import packageJson from '../package.json' with { type: "json" }; -const OPENSSL_VERSION = "1.1.1t"; +const OPENSSL_VERSION = "3.0.18"; const win32BatPath = path.join(import.meta.dirname, "build-openssl.bat"); const vendorPath = path.resolve(import.meta.dirname, "..", "vendor"); const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); @@ -56,6 +56,8 @@ const makeHashVerifyOnFinal = (expected) => (digest) => { // currently this only needs to be done on linux const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { try { + await fs.access(opensslPatchPath); + for (const patchFilename of await fs.readdir(opensslPatchPath)) { const patchTarget = patchFilename.split("-")[1]; if (patchFilename.split(".").pop() === "patch" && (patchTarget === operatingSystem || patchTarget === "all")) { @@ -66,6 +68,11 @@ const applyOpenSSLPatches = async (buildCwd, operatingSystem) => { } } } catch(e) { + if (e.code === "ENOENT") { + // no patches to apply + return; + } + console.log("Patch application failed: ", e); throw e; } @@ -121,7 +128,7 @@ const buildLinux = async (buildCwd) => { // dependency on the system libssl/libcrypto which causes symbol conflicts and segfaults. // To fix this we need to hide all the openssl symbols to prevent them from being overridden // by the runtime linker. - "-fvisibility=hidden", + // "-fvisibility=hidden", // compile static libraries "no-shared", // disable ssl2, ssl3, and compression @@ -259,7 +266,7 @@ const buildOpenSSLIfNecessary = async ({ const openSSLUrl = getOpenSSLSourceUrl(openSSLVersion); const openSSLSha256Url = getOpenSSLSourceSha256Url(openSSLVersion); - const openSSLSha256 = (await got(openSSLSha256Url)).body.trim(); + const openSSLSha256 = (await got(openSSLSha256Url)).body.trim().split(' ')[0]; const downloadStream = got.stream(openSSLUrl); downloadStream.on("downloadProgress", makeOnStreamDownloadProgress()); diff --git a/vendor/patches/openssl/001-linux-force_getentropy_dso_lookup.patch b/vendor/patches/openssl/001-linux-force_getentropy_dso_lookup.patch deleted file mode 100644 index 6802c7fa5..000000000 --- a/vendor/patches/openssl/001-linux-force_getentropy_dso_lookup.patch +++ /dev/null @@ -1,23 +0,0 @@ -openssl doesn't have any sort of guard around this section of code other than -checking if we're compiling an elf binary on gnu linux. the syscall wrapper -`getentropy` is only available on glibc >= 2.25 which is a problem if we want -to support platforms like centos7 which ships with glibc 2.17. Attempting to -load this code on centos7 causes a runtime "undefined symbol error since glibc -doesn't provide it. -luckily openssl provides a backup lookup method in form of a dlopen call but -theres no way to configure for it, hence this patch. -Note further that centos7 doesn't have this function or the syscall it wraps -so the symbol lookup will fail and it will fallback to reading from /dev/random. -hence this patch just fixes compilation. -author: JZA ---- crypto/rand/rand_unix.c -+++ crypto/rand/rand_unix.c -@@ -372,7 +372,7 @@ static ssize_t syscall_random(void *buf, size_t buflen) - * Note: Sometimes getentropy() can be provided but not implemented - * internally. So we need to check errno for ENOSYS - */ --# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux) -+# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux) && 0 - extern int getentropy(void *buffer, size_t length) __attribute__((weak)); - - if (getentropy != NULL) { From 453920ae867565fe7ba8ffeab1c515dac4082bef Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 10:34:12 -0700 Subject: [PATCH 514/545] fix workflow matrix windows arm64 will be done in a follow-up pr --- .github/workflows/build-openssl-packages.yml | 24 +++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index 426ca0652..1ecb3366b 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -9,8 +9,15 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macos-13, windows-2022] - arch: [x64, arm64] + include: + - os: windows-latest + arch: x64 + # - os: windows-latest + # arch: arm64 + - os: macos-15 + arch: x64 + - os: macos-15-intel + arch: arm64 fail-fast: false steps: @@ -21,12 +28,23 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - architecture: ${{ matrix.arch }} + + - name: Install Toolchain + if: matrix.os == 'windows-latest' && matrix.arch == 'arm64' + uses: msys2/setup-msys2@v2 + with: + update: true + install: > + mingw-w64-aarch64-toolchain + mingw-w64-aarch64-cmake + mingw-w64-aarch64-ninja - name: Install dependencies run: npm install - name: Build OpenSSL packages + env: + TARGET_ARCH: ${{ matrix.arch }} run: node utils/acquireOpenSSL.js - name: Push OpenSSL package to S3 From a83b09864c180433957fdcda403308ce088bc3cf Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 10:57:55 -0700 Subject: [PATCH 515/545] woops --- .github/workflows/build-openssl-packages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index 1ecb3366b..6df004d63 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -14,9 +14,9 @@ jobs: arch: x64 # - os: windows-latest # arch: arm64 - - os: macos-15 - arch: x64 - os: macos-15-intel + arch: x64 + - os: macos-15 arch: arm64 fail-fast: false From 4c6a8a6ce0638d4cbb1a8711f140da2fb9ca6e0b Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 11:48:42 -0700 Subject: [PATCH 516/545] downgrade runners for now --- .github/workflows/build-openssl-packages.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index 6df004d63..fb6613b9d 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -14,9 +14,9 @@ jobs: arch: x64 # - os: windows-latest # arch: arm64 - - os: macos-15-intel + - os: macos-13 arch: x64 - - os: macos-15 + - os: macos-14 arch: arm64 fail-fast: false @@ -45,11 +45,11 @@ jobs: - name: Build OpenSSL packages env: TARGET_ARCH: ${{ matrix.arch }} - run: node utils/acquireOpenSSL.js + run: node utils/acquireOpenSSL.mjs - name: Push OpenSSL package to S3 env: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} - run: node utils/uploadOpenSSL.js \ No newline at end of file + run: node utils/uploadOpenSSL.mjs \ No newline at end of file From f5e83808a440ecbd2eb23d757777ebe362952c71 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 12:00:02 -0700 Subject: [PATCH 517/545] force build openssl package --- .github/workflows/build-openssl-packages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index fb6613b9d..bfb2e0088 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -45,6 +45,7 @@ jobs: - name: Build OpenSSL packages env: TARGET_ARCH: ${{ matrix.arch }} + NODEGIT_OPENSSL_BUILD_PACKAGE: 1 run: node utils/acquireOpenSSL.mjs - name: Push OpenSSL package to S3 From fc1aecff96465166ec8dc1fb8458a5fc4bf2d349 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 24 Oct 2025 11:54:30 -0700 Subject: [PATCH 518/545] set macos deployment target --- .github/workflows/build-openssl-packages.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index bfb2e0088..b3d3cc67c 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -46,6 +46,7 @@ jobs: env: TARGET_ARCH: ${{ matrix.arch }} NODEGIT_OPENSSL_BUILD_PACKAGE: 1 + OPENSSL_MACOS_DEPLOYMENT_TARGET: "11.0" run: node utils/acquireOpenSSL.mjs - name: Push OpenSSL package to S3 @@ -53,4 +54,4 @@ jobs: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} - run: node utils/uploadOpenSSL.mjs \ No newline at end of file + run: node utils/uploadOpenSSL.mjs From 1689cb8aca22fab2464837e0702becdbbe8bac3e Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 5 Nov 2025 21:06:21 -0700 Subject: [PATCH 519/545] update macos runner images --- .github/workflows/build-openssl-packages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index b3d3cc67c..bd584002d 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -14,9 +14,9 @@ jobs: arch: x64 # - os: windows-latest # arch: arm64 - - os: macos-13 + - os: macos-15 arch: x64 - - os: macos-14 + - os: macos-15-intel arch: arm64 fail-fast: false From d51bb6f98f5f074d4299460c65ffa03f51524282 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 6 Nov 2025 10:00:44 -0700 Subject: [PATCH 520/545] disable ui on macos --- utils/acquireOpenSSL.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index f16c62e15..bc6b93264 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -93,6 +93,8 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { "no-ssl2", "no-ssl3", "no-comp", + // disable tty ui since it fails a bunch of tests on GHA runners and we're just gonna link anyways + "no-ui-console", // set install directory `--prefix="${extractPath}"`, `--openssldir="${extractPath}"`, From bfffac9f9dfdf3646d119961c81684a52ba5b094 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 24 Oct 2025 12:09:03 -0700 Subject: [PATCH 521/545] update visual studio version selection --- utils/acquireOpenSSL.mjs | 65 ++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index bc6b93264..dd76021a8 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -7,7 +7,6 @@ import tar from "tar-fs"; import zlib from "zlib"; import { createWriteStream, promises as fs } from "fs"; import { performance } from "perf_hooks"; -import { fileURLToPath } from 'url'; import { promisify } from "util"; const pipeline = promisify(stream.pipeline); @@ -168,18 +167,60 @@ const buildWin32 = async (buildCwd, vsBuildArch) => { throw new Error("Expected vsBuildArch to be specified"); } - const programFilesPath = (process.arch === "x64" - ? process.env["ProgramFiles(x86)"] - : process.env.ProgramFiles) || "C:\\Program Files"; - const vcvarsallPath = process.env.npm_config_vcvarsall_path || `${ - programFilesPath - }\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Auxiliary\\Build\\vcvarsall.bat`; - try { - await fs.stat(vcvarsallPath); - } catch { - throw new Error(`vcvarsall.bat not found at ${vcvarsallPath}`); + const exists = (filePath) => fs.stat(filePath).then(() => true).catch(() => false); + + let vcvarsallPath = undefined; + + if (process.env.npm_config_vcvarsall_path && await exists(process.env.npm_config_vcvarsall_path)) { + vcvarsallPath = process.env.npm_config_vcvarsall_path; + } else { + const potentialMsvsPaths = []; + + // GYP_MSVS_OVERRIDE_PATH is set by node-gyp so this should cover most cases + if (process.env.GYP_MSVS_OVERRIDE_PATH) { + potentialMsvsPaths.push(process.env.GYP_MSVS_OVERRIDE_PATH); + } + + const packageTypes = ["BuildTools", "Community", "Professional", "Enterprise"]; + const versions = ["2022", "2019"] + + const computePossiblePaths = (parentPath) => { + let possiblePaths = [] + for (const packageType of packageTypes) { + for (const version of versions) { + possiblePaths.push(path.join(parentPath, version, packageType)); + } + } + + return possiblePaths; + } + + if (process.env["ProgramFiles(x86)"]) { + const parentPath = path.join(process.env["ProgramFiles(x86)"], 'Microsoft Visual Studio'); + potentialMsvsPaths.push(...computePossiblePaths(parentPath)); + } + + if (process.env.ProgramFiles) { + const parentPath = path.join(process.env.ProgramFiles, 'Microsoft Visual Studio'); + potentialMsvsPaths.push(...computePossiblePaths(parentPath)); + } + + for (const potentialPath of potentialMsvsPaths) { + const wholePath = path.join(potentialPath, 'VC', 'Auxiliary', 'Build', 'vcvarsall.bat'); + console.log("checking", wholePath); + if (await exists(wholePath)) { + vcvarsallPath = wholePath; + break; + } + } + + if (!vcvarsallPath) { + throw new Error(`vcvarsall.bat not found`); + } } + console.log('using', vcvarsallPath); + let vcTarget; switch (vsBuildArch) { case "x64": { @@ -401,7 +442,7 @@ const acquireOpenSSL = async () => { let macOsDeploymentTarget; if (process.platform === "darwin") { - macOsDeploymentTarget = process.argv[2]; + macOsDeploymentTarget = process.argv[2] ?? process.env.OPENSSL_MACOS_DEPLOYMENT_TARGET if (!macOsDeploymentTarget || !macOsDeploymentTarget.match(/\d+\.\d+/)) { throw new Error(`Invalid macOsDeploymentTarget: ${macOsDeploymentTarget}`); } From 424cad31238c1fafc9eb7d0386d5ce9a5e28ed72 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 6 Nov 2025 11:55:33 -0700 Subject: [PATCH 522/545] fix upload --- utils/acquireOpenSSL.mjs | 8 +++++--- utils/uploadOpenSSL.mjs | 17 +++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index dd76021a8..047b95cb7 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -382,7 +382,7 @@ const downloadOpenSSLIfNecessary = async ({ console.log("Download finished."); } -const getOpenSSLPackageName = () => { +export const getOpenSSLPackageName = () => { let arch = process.arch; if (process.platform === "win32" && ( process.arch === "ia32" || process.env.NODEGIT_VS_BUILD_ARCH === "x86" @@ -393,6 +393,8 @@ const getOpenSSLPackageName = () => { return `openssl-${OPENSSL_VERSION}-${process.platform}-${arch}.tar.gz`; } +export const getOpenSSLPackagePath = () => path.join(import.meta.dirname, getOpenSSLPackageName()); + const getOpenSSLPackageUrl = () => `${packageJson.binary.host}${getOpenSSLPackageName()}`; const buildPackage = async () => { @@ -416,7 +418,7 @@ const buildPackage = async () => { new HashVerify("sha256", (digest) => { resolve(digest); }), - createWriteStream(getOpenSSLPackageName()) + createWriteStream(getOpenSSLPackagePath()) ); const digest = await promise; await fs.writeFile(`${getOpenSSLPackageName()}.sha256`, digest); @@ -477,5 +479,5 @@ if (process.argv[1] === import.meta.filename) { catch(error) { console.error("Acquire OpenSSL failed: ", error); process.exit(1); - }; + } } diff --git a/utils/uploadOpenSSL.mjs b/utils/uploadOpenSSL.mjs index 784379cb6..86495e98e 100644 --- a/utils/uploadOpenSSL.mjs +++ b/utils/uploadOpenSSL.mjs @@ -2,26 +2,27 @@ import aws from 'aws-sdk'; import fs from "fs"; import path from "path"; -import pkgJson from './package.json' assert { type: "json" }; -import { getOpenSSLPackageName } from './acquireOpenSSL'; +import pkgJson from '../package.json' with { type: "json" }; +import { getOpenSSLPackagePath, getOpenSSLPackageName } from './acquireOpenSSL.mjs'; const s3 = new aws.S3(); -const uploadBinaryToS3 = (binaryName, bucketName, pathToFile) => +const uploadBinaryToS3 = (fileName, bucketName, pathToFile) => s3.upload({ Body: fs.createReadStream(pathToFile), Bucket: bucketName, - Key: binaryName, + Key: fileName, ACL: "public-read" }).promise(); export const uploadOpenSSL = async () => { - const binaryName = getOpenSSLPackageName(); - const pathToFile = path.join(import.meta.dirname, binaryName); - return uploadBinaryToS3(binaryName, pkgJson.binary.bucket_name, pathToFile); + const packageName = path.basename(getOpenSSLPackageName()); + const packagePath = getOpenSSLPackagePath(); + console.log(`Uploading ${packagePath} to s3://${pkgJson.binary.bucket_name}/${packageName}`); + return uploadBinaryToS3(packageName, pkgJson.binary.bucket_name, packagePath); }; -if (require.main === module) { +if (process.argv[1] === import.meta.filename) { uploadOpenSSL().catch((error) => { console.error('Push to S3 failed: ', error); process.exit(1); From c60718c1e22542ec056936ed6b15ba0a8730d9ee Mon Sep 17 00:00:00 2001 From: Bill Mill Date: Sun, 9 Nov 2025 09:37:24 -0500 Subject: [PATCH 523/545] fix: correct macos arch labels macos-15-intel is x64 and macos-15 is arm64, per the docs: https://github.com/actions/runner-images#available-images --- .github/workflows/build-openssl-packages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index bd584002d..79cd94ade 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -15,9 +15,9 @@ jobs: # - os: windows-latest # arch: arm64 - os: macos-15 - arch: x64 - - os: macos-15-intel arch: arm64 + - os: macos-15-intel + arch: x64 fail-fast: false steps: From 9bc5b39616e8180f96014645a68de556185e7589 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 10 Nov 2025 20:55:51 -0700 Subject: [PATCH 524/545] fix missing git_email_create_from_diff not sure why this error only happened when building for electron --- generate/input/descriptor.json | 5 +++ generate/input/libgit2-supplement.json | 51 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 889b792e7..99837534d 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -1526,6 +1526,11 @@ } } }, + "email": { + "cDependencies": [ + "git2/sys/email.h" + ] + }, "email_create_options": { "hasConstructor": true }, diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 09433e7fa..742216f03 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -294,6 +294,54 @@ "isErrorCode": true } }, + "git_email_create_from_diff": { + "file": "sys/email.h", + "type": "function", + "isAsync": true, + "group": "email", + "args": [ + { + "name": "out", + "type": "git_buf *" + }, + { + "name": "diff", + "type": "git_diff *" + }, + { + "name": "patch_idx", + "type": "size_t" + }, + { + "name": "patch_count", + "type": "size_t" + }, + { + "name": "commit_id", + "type": "const git_oid *" + }, + { + "name": "summary", + "type": "const char *" + }, + { + "name": "body", + "type": "const char *" + }, + { + "name": "author", + "type": "const git_signature *" + }, + { + "name": "opts", + "type": "git_email_create_options *" + } + ], + "return": { + "type": "int", + "isErrorCode": true + } + }, "git_diff_get_perfdata": { "file": "sys/diff.h", "args": [ @@ -2619,6 +2667,9 @@ "blame": [ "git_blame_file" ], + "email": [ + "git_email_create_from_diff" + ], "note": [ "git_note_author", "git_note_commit_create", From ad00c9a86319660a06f10d5da6b67b7c1f22a3d4 Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 16 Oct 2025 11:21:07 -0700 Subject: [PATCH 525/545] natively compile for arm64 --- lifecycleScripts/install.js | 4 ++- utils/acquireOpenSSL.mjs | 58 +++++++++++++++++++++++-------------- vendor/libgit2.gyp | 21 ++++++++++---- 3 files changed, 54 insertions(+), 29 deletions(-) diff --git a/lifecycleScripts/install.js b/lifecycleScripts/install.js index ddbb90e9c..e7f90ee90 100755 --- a/lifecycleScripts/install.js +++ b/lifecycleScripts/install.js @@ -30,7 +30,9 @@ module.exports = function install() { return new Promise(function(resolve, reject) { const gypPath = path.join(__dirname, "..", "node_modules", "node-gyp", "bin", "node-gyp.js"); - var spawnedNodePreGyp = spawn(nodePreGyp, args, { + + const nodePreGypPath = path.resolve(path.join(__dirname, "..", "node_modules", "@mapbox", "node-pre-gyp", "bin", nodePreGyp)); + var spawnedNodePreGyp = spawn(nodePreGypPath, args, { env: { ...process.env, npm_config_node_gyp: gypPath diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index 047b95cb7..124860506 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -19,6 +19,26 @@ const vendorPath = path.resolve(import.meta.dirname, "..", "vendor"); const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); const extractPath = path.join(vendorPath, "openssl"); +const convertArch = (archStr) => { + const convertedArch = { + 'ia32': 'x86', + 'x86': 'x86', + 'x64': 'x64', + 'arm64': 'arm64' + }[archStr]; + + if (!convertedArch) { + throw new Error('unsupported architecture'); + } + + return convertedArch; +} + +const hostArch = convertArch(process.arch); +const targetArch = process.env.npm_config_arch + ? convertArch(process.env.npm_config_arch) + : hostArch; + const pathsToIncludeForPackage = [ "include", "lib" ]; @@ -82,8 +102,10 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { throw new Error("Expected macOsDeploymentTarget to be specified"); } + const buildConfig = targetArch === "x64" ? "darwin64-x86_64-cc" : "darwin64-arm64-cc"; + const configureArgs = [ - process.arch === "x64" ? "darwin64-x86_64-cc" : "darwin64-arm64-cc", + buildConfig, // speed up ecdh on little-endian platforms with 128bit int support "enable-ec_nistp_64_gcc_128", // compile static libraries @@ -107,7 +129,7 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { await applyOpenSSLPatches(buildCwd, "darwin"); - // only build the libraries, not the tests/fuzzer or apps + // only build the libraries, not the fuzzer or apps await execPromise("make build_libs", { cwd: buildCwd }, { pipeOutput: true }); @@ -123,8 +145,10 @@ const buildDarwin = async (buildCwd, macOsDeploymentTarget) => { }; const buildLinux = async (buildCwd) => { + const buildConfig = targetArch === "x64" ? "linux-x86_64" : "linux-aarch64"; + const configureArgs = [ - "linux-x86_64", + buildConfig, // Electron(at least on centos7) imports the libcups library at runtime, which has a // dependency on the system libssl/libcrypto which causes symbol conflicts and segfaults. // To fix this we need to hide all the openssl symbols to prevent them from being overridden @@ -146,7 +170,7 @@ const buildLinux = async (buildCwd) => { await applyOpenSSLPatches(buildCwd, "linux"); - // only build the libraries, not the tests/fuzzer or apps + // only build the libraries, not the fuzzer or apps await execPromise("make build_libs", { cwd: buildCwd }, { pipeOutput: true }); @@ -232,6 +256,11 @@ const buildWin32 = async (buildCwd, vsBuildArch) => { vcTarget = "VC-WIN32"; break; } + + case "arm64": { + vcTarget = "VC-WIN64-ARM"; + break; + } default: { throw new Error(`Unknown vsBuildArch: ${vsBuildArch}`); @@ -382,15 +411,8 @@ const downloadOpenSSLIfNecessary = async ({ console.log("Download finished."); } -export const getOpenSSLPackageName = () => { - let arch = process.arch; - if (process.platform === "win32" && ( - process.arch === "ia32" || process.env.NODEGIT_VS_BUILD_ARCH === "x86" - )) { - arch = "x86"; - } - - return `openssl-${OPENSSL_VERSION}-${process.platform}-${arch}.tar.gz`; +const getOpenSSLPackageName = () => { + return `openssl-${OPENSSL_VERSION}-${process.platform}-${targetArch}.tar.gz`; } export const getOpenSSLPackagePath = () => path.join(import.meta.dirname, getOpenSSLPackageName()); @@ -450,18 +472,10 @@ const acquireOpenSSL = async () => { } } - let vsBuildArch; - if (process.platform === "win32") { - vsBuildArch = process.env.NODEGIT_VS_BUILD_ARCH || (process.arch === "x64" ? "x64" : "x86"); - if (!["x64", "x86"].includes(vsBuildArch)) { - throw new Error(`Invalid vsBuildArch: ${vsBuildArch}`); - } - } - await buildOpenSSLIfNecessary({ openSSLVersion: OPENSSL_VERSION, macOsDeploymentTarget, - vsBuildArch + vsBuildArch: process.platform === "win32" ? targetArch : undefined }); if (process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { await buildPackage(); diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index a155fb67f..f141e4d2d 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -315,13 +315,22 @@ # Workaround of a strange bug: # TargetMachine + static_library + x64 = nothing. "conditions": [ - ["target_arch=='x64'", { - "VCLibrarianTool": { - "AdditionalOptions": [ - "/MACHINE:X64", - ], + [ + "target_arch=='x64'", { + "VCLibrarianTool": { + "AdditionalOptions": [ + "/MACHINE:X64", + ], + }, + }, + "target_arch=='arm64'", { + "VCLibrarianTool": { + "AdditionalOptions": [ + "/MACHINE:ARM64", + ], + }, }, - }, { + { "VCLibrarianTool": { "AdditionalOptions": [ "/MACHINE:x86", From cd1c5dba01b4e928d79c0225b844bc412ef943c8 Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 10 Nov 2025 19:16:38 -0700 Subject: [PATCH 526/545] better node-pre-gyp path detection --- lifecycleScripts/install.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lifecycleScripts/install.js b/lifecycleScripts/install.js index e7f90ee90..96e47afbe 100755 --- a/lifecycleScripts/install.js +++ b/lifecycleScripts/install.js @@ -2,6 +2,8 @@ var buildFlags = require("../utils/buildFlags"); var spawn = require("child_process").spawn; var path = require("path"); +const nodePreGypModulePath = require.resolve("@mapbox/node-pre-gyp"); + module.exports = function install() { console.log("[nodegit] Running install script"); @@ -31,7 +33,8 @@ module.exports = function install() { return new Promise(function(resolve, reject) { const gypPath = path.join(__dirname, "..", "node_modules", "node-gyp", "bin", "node-gyp.js"); - const nodePreGypPath = path.resolve(path.join(__dirname, "..", "node_modules", "@mapbox", "node-pre-gyp", "bin", nodePreGyp)); + const nodePreGypPath = path.resolve(path.dirname(nodePreGypModulePath), path.join("..", "bin", nodePreGyp)); + console.log("node-pre-gyp path", nodePreGypPath); var spawnedNodePreGyp = spawn(nodePreGypPath, args, { env: { ...process.env, From 4978cbb51646b8818d88a943fa31205b08a35534 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 12 Nov 2025 21:18:24 -0700 Subject: [PATCH 527/545] allow cross-compiling openssl for windows --- utils/acquireOpenSSL.mjs | 76 +++++++++++++++++++++++++--------------- utils/build-openssl.bat | 11 +++++- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index 124860506..6a3d26252 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -1,4 +1,5 @@ import crypto from "crypto"; +import { spawn } from "child_process"; import execPromise from "./execPromise.js"; import got from "got"; import path from "path"; @@ -19,6 +20,8 @@ const vendorPath = path.resolve(import.meta.dirname, "..", "vendor"); const opensslPatchPath = path.join(vendorPath, "patches", "openssl"); const extractPath = path.join(vendorPath, "openssl"); +const exists = (filePath) => fs.stat(filePath).then(() => true).catch(() => false); + const convertArch = (archStr) => { const convertedArch = { 'ia32': 'x86', @@ -186,13 +189,7 @@ const buildLinux = async (buildCwd) => { }, { pipeOutput: true }); }; -const buildWin32 = async (buildCwd, vsBuildArch) => { - if (!vsBuildArch) { - throw new Error("Expected vsBuildArch to be specified"); - } - - const exists = (filePath) => fs.stat(filePath).then(() => true).catch(() => false); - +const buildWin32 = async (buildCwd) => { let vcvarsallPath = undefined; if (process.env.npm_config_vcvarsall_path && await exists(process.env.npm_config_vcvarsall_path)) { @@ -243,34 +240,57 @@ const buildWin32 = async (buildCwd, vsBuildArch) => { } } - console.log('using', vcvarsallPath); - let vcTarget; - switch (vsBuildArch) { - case "x64": { + switch (targetArch) { + case "x64": vcTarget = "VC-WIN64A"; break; - } - case "x86": { + case "x86": vcTarget = "VC-WIN32"; break; - } - case "arm64": { + case "arm64": vcTarget = "VC-WIN64-ARM"; break; - } - - default: { - throw new Error(`Unknown vsBuildArch: ${vsBuildArch}`); - } } - await execPromise(`"${win32BatPath}" "${vcvarsallPath}" ${vsBuildArch} ${vcTarget}`, { - cwd: buildCwd, - maxBuffer: 10 * 1024 * 1024 // we should really just use spawn - }, { pipeOutput: true }); + let vsBuildArch = hostArch === targetArch + ? hostArch + : `${hostArch}_${targetArch}`; + + console.log("Using vcvarsall.bat at: ", vcvarsallPath); + console.log("Using vsBuildArch: ", vsBuildArch); + console.log("Using vcTarget: ", vcTarget); + + await new Promise((resolve, reject) => { + const buildProcess = spawn(`"${win32BatPath}" "${vcvarsallPath}" ${vsBuildArch} ${vcTarget}`, { + cwd: buildCwd, + shell: process.platform === "win32", + env: { + ...process.env, + NODEGIT_SKIP_TESTS: targetArch !== hostArch ? "1" : undefined + } + }); + + buildProcess.stdout.on("data", function(data) { + console.info(data.toString().trim()); + }); + + buildProcess.stderr.on("data", function(data) { + console.error(data.toString().trim()); + }); + + buildProcess.on("close", function(code) { + if (!code) { + resolve(); + } else { + reject(code); + } + }); + }); + + }; const removeOpenSSLIfOudated = async (openSSLVersion) => { @@ -314,8 +334,7 @@ const makeOnStreamDownloadProgress = () => { const buildOpenSSLIfNecessary = async ({ macOsDeploymentTarget, - openSSLVersion, - vsBuildArch + openSSLVersion }) => { if (process.platform !== "darwin" && process.platform !== "win32" && process.platform !== "linux") { console.log(`Skipping OpenSSL build, not required on ${process.platform}`); @@ -359,7 +378,7 @@ const buildOpenSSLIfNecessary = async ({ } else if (process.platform === "linux") { await buildLinux(buildCwd); } else if (process.platform === "win32") { - await buildWin32(buildCwd, vsBuildArch); + await buildWin32(buildCwd); } else { throw new Error(`Unknown platform: ${process.platform}`); } @@ -474,8 +493,7 @@ const acquireOpenSSL = async () => { await buildOpenSSLIfNecessary({ openSSLVersion: OPENSSL_VERSION, - macOsDeploymentTarget, - vsBuildArch: process.platform === "win32" ? targetArch : undefined + macOsDeploymentTarget }); if (process.env.NODEGIT_OPENSSL_BUILD_PACKAGE) { await buildPackage(); diff --git a/utils/build-openssl.bat b/utils/build-openssl.bat index 6e146cf89..af8063d7c 100644 --- a/utils/build-openssl.bat +++ b/utils/build-openssl.bat @@ -1,9 +1,18 @@ +rem Build OpenSSL for Windows +rem %1 - path to vcvarsall.bat +rem %2 - architecture argument for vcvarsall.bat +rem %3 - OpenSSL Configure target + @call %1 %2 perl .\Configure %3 no-shared no-ssl2 no-ssl3 no-comp --prefix="%cd%\.." --openssldir="%cd%\.." || goto :error nmake || goto :error -nmake test || goto :error + +if "%NODEGIT_SKIP_TESTS%" NEQ "1" ( + nmake test || goto :error +) + nmake install || goto :error goto :EOF From 972a08333578e8988a0badb91109310afa793bd9 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 12 Nov 2025 21:19:23 -0700 Subject: [PATCH 528/545] add windows arm64 to openssl package workflow --- .github/workflows/build-openssl-packages.yml | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index 79cd94ade..1437e6d91 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -10,10 +10,10 @@ jobs: strategy: matrix: include: + - os: windows-latest + arch: arm64 - os: windows-latest arch: x64 - # - os: windows-latest - # arch: arm64 - os: macos-15 arch: arm64 - os: macos-15-intel @@ -29,22 +29,12 @@ jobs: with: node-version: 22 - - name: Install Toolchain - if: matrix.os == 'windows-latest' && matrix.arch == 'arm64' - uses: msys2/setup-msys2@v2 - with: - update: true - install: > - mingw-w64-aarch64-toolchain - mingw-w64-aarch64-cmake - mingw-w64-aarch64-ninja - - name: Install dependencies run: npm install - name: Build OpenSSL packages env: - TARGET_ARCH: ${{ matrix.arch }} + npm_config_arch: ${{ matrix.arch }} NODEGIT_OPENSSL_BUILD_PACKAGE: 1 OPENSSL_MACOS_DEPLOYMENT_TARGET: "11.0" run: node utils/acquireOpenSSL.mjs From f856f0fde4d50a45e8a4d17ee1c78d866d1a9b72 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 12 Nov 2025 21:43:38 -0700 Subject: [PATCH 529/545] fix package upload --- .github/workflows/build-openssl-packages.yml | 1 + utils/acquireOpenSSL.mjs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-openssl-packages.yml b/.github/workflows/build-openssl-packages.yml index 1437e6d91..7b7a5dea3 100644 --- a/.github/workflows/build-openssl-packages.yml +++ b/.github/workflows/build-openssl-packages.yml @@ -41,6 +41,7 @@ jobs: - name: Push OpenSSL package to S3 env: + npm_config_arch: ${{ matrix.arch }} node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index 6a3d26252..9eb4c73f7 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -430,7 +430,7 @@ const downloadOpenSSLIfNecessary = async ({ console.log("Download finished."); } -const getOpenSSLPackageName = () => { +export const getOpenSSLPackageName = () => { return `openssl-${OPENSSL_VERSION}-${process.platform}-${targetArch}.tar.gz`; } From abc5a6655968f5b3652b216d8b026128558bf1ac Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 13 Nov 2025 19:59:52 -0700 Subject: [PATCH 530/545] upload sha256 files aswell --- utils/uploadOpenSSL.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/uploadOpenSSL.mjs b/utils/uploadOpenSSL.mjs index 86495e98e..5de760462 100644 --- a/utils/uploadOpenSSL.mjs +++ b/utils/uploadOpenSSL.mjs @@ -19,7 +19,9 @@ export const uploadOpenSSL = async () => { const packageName = path.basename(getOpenSSLPackageName()); const packagePath = getOpenSSLPackagePath(); console.log(`Uploading ${packagePath} to s3://${pkgJson.binary.bucket_name}/${packageName}`); - return uploadBinaryToS3(packageName, pkgJson.binary.bucket_name, packagePath); + await uploadBinaryToS3(packageName, pkgJson.binary.bucket_name, packagePath); + const sha256PackageName = `${packageName}.sha256`; + await uploadBinaryToS3(sha256PackageName, pkgJson.binary.bucket_name, `${packagePath}.sha256`); }; if (process.argv[1] === import.meta.filename) { From 637d2eb53ff9c21533ad3c3566a15ebd490e50df Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 14 Nov 2025 11:33:43 -0700 Subject: [PATCH 531/545] readd openssl fixes missing from PR - give full path to openssl package hash - fix package download url --- utils/acquireOpenSSL.mjs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index 9eb4c73f7..044454026 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -436,7 +436,11 @@ export const getOpenSSLPackageName = () => { export const getOpenSSLPackagePath = () => path.join(import.meta.dirname, getOpenSSLPackageName()); -const getOpenSSLPackageUrl = () => `${packageJson.binary.host}${getOpenSSLPackageName()}`; +const getOpenSSLPackageUrl = () => { + const hostUrl = new URL(packageJson.binary.host); + hostUrl.pathname = getOpenSSLPackageName(); + return hostUrl.toString(); +}; const buildPackage = async () => { let resolve, reject; @@ -462,7 +466,7 @@ const buildPackage = async () => { createWriteStream(getOpenSSLPackagePath()) ); const digest = await promise; - await fs.writeFile(`${getOpenSSLPackageName()}.sha256`, digest); + await fs.writeFile(`${getOpenSSLPackagePath()}.sha256`, digest); }; const acquireOpenSSL = async () => { From 3806c58561103dffb3c9b3909cecbabbe53072fb Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 14 Nov 2025 15:36:00 -0700 Subject: [PATCH 532/545] add arm64 to test/release workflow --- .github/workflows/tests.yml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3a2f8cc7a..444a3e960 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -123,7 +123,7 @@ jobs: strategy: matrix: node: [20, 22, 24] - arch: [x86, x64] + arch: [x86, x64, arm64] exclude: - node: 24 arch: x86 @@ -141,16 +141,27 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js + if: matrix.arch == 'x86' uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} check-latest: true - architecture: ${{ matrix.arch }} + architecture: x86 + + - name: Use Node.js + uses: actions/setup-node@v4 + if: matrix.arch != 'x86' + with: + node-version: ${{ matrix.node }} + check-latest: true - name: Install + env: + npm_config_arch: ${{ matrix.arch == 'x86' && 'ia32' || matrix.arch }} run: npm install - name: Test + if: matrix.arch != 'arm64' env: GIT_SSH: ${{ github.workspace }}\vendor\plink.exe run: | @@ -170,7 +181,7 @@ jobs: - name: Deploy (Package) if: startsWith(github.ref, 'refs/tags/v') - run: node-pre-gyp package + run: node-pre-gyp package --target_arch=${{ matrix.arch }} - name: Deploy (Publish) if: startsWith(github.ref, 'refs/tags/v') @@ -178,4 +189,4 @@ jobs: node_pre_gyp_bucket: ${{ secrets.node_pre_gyp_bucket }} AWS_ACCESS_KEY_ID: ${{ secrets.node_pre_gyp_accessKeyId }} AWS_SECRET_ACCESS_KEY: ${{ secrets.node_pre_gyp_secretAccessKey }} - run: node-pre-gyp publish + run: node-pre-gyp publish --target_arch=${{ matrix.arch }} From 03b3c8844c3092cad9a7c79ddb1038bb2c3fedba Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 14 Nov 2025 18:42:03 -0700 Subject: [PATCH 533/545] bump to v0.28.0-alpha.35 --- CHANGELOG.md | 16 ++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12d3a9dce..57d0616de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Change Log +## v0.28.0-alpha.35 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.35) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.34...v0.28.0-alpha.35) + +#### Summary of Changes + - Bump libgit2 to 1.9.1 + - Bump OpenSSL to 3.0 + - Move OpenSSL Packaging to Github Actions + - Add arm64 build Support + +#### Merged PRs into NodeGit +- [Bump libgit2 to 1.9.1](https://github.com/nodegit/nodegit/pull/2025) +- [Bump OpenSSL to 3.0, Move OpenSSL package generation to Github Actions](https://github.com/nodegit/nodegit/pull/2026) +- [fix: correct macos arch labels](github.com/nodegit/nodegit/pull/2027) +- [Add Ability to compile for arm64](https://github.com/nodegit/nodegit/pull/2028) + ## v0.28.0-alpha.34 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.34) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.33...v0.28.0-alpha.34) diff --git a/package-lock.json b/package-lock.json index 25edeaf61..64454026d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.34", + "version": "0.28.0-alpha.35", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.34", + "version": "0.28.0-alpha.35", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index fe1273285..ca97223da 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.34", + "version": "0.28.0-alpha.35", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From c2962d5d3080c4e16cb107021daae7c0a6e9640d Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 19 Nov 2025 11:30:24 -0700 Subject: [PATCH 534/545] always use custom openssl for linux electron builds --- generate/templates/templates/binding.gyp | 29 +++++++++++++++--------- guides/install/from-source/README.md | 2 +- utils/acquireOpenSSL.mjs | 29 ++++++------------------ vendor/libgit2.gyp | 7 +++--- 4 files changed, 29 insertions(+), 38 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index b5e189c32..741d964cc 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -155,21 +155,28 @@ "-std=c++<(cxx_version)" ], }], - ["<(is_electron) == 1 and <(electron_openssl_static) == 1", { + ["<(is_electron) == 1", { + "conditions": [ + ["<(electron_openssl_static) == 1", { + "libraries": [ + "<(electron_openssl_root)/lib/libssl.a", + "<(electron_openssl_root)/lib/libcrypto.a" + ] + }], + ["<(electron_openssl_static) != 1", { + "library_dirs": [ + "<(electron_openssl_root)/lib" + ], + "libraries": [ + "-lcrypto", + "-lssl" + ] + }] + ], "include_dirs": [ "<(electron_openssl_root)/include" ], - "libraries": [ - "<(electron_openssl_root)/lib64/libssl.a", - "<(electron_openssl_root)/lib64/libcrypto.a" - ] }], - ["<(is_electron) == 1 and <(electron_openssl_static) != 1", { - "libraries": [ - "-lcrypto", - "-lssl" - ] - }] ], }], [ diff --git a/guides/install/from-source/README.md b/guides/install/from-source/README.md index eadd8306d..64bfce18b 100644 --- a/guides/install/from-source/README.md +++ b/guides/install/from-source/README.md @@ -65,7 +65,7 @@ npm install nodegit --msvs_version=2013 ``` ### Electron and OpenSSL ### -A local version of OpenSSL is required when building for Electron on Windows and macOS. This is due to Electron using BoringSSL, as we are not able to link to it like we are OpenSSL in Node. Additionally, OpenSSL can be statically linked on Linux by setting the `NODEGIT_OPENSSL_STATIC_LINK` environment variable to `1`. +A local version of OpenSSL is required when building for Electron. This is due to Electron using BoringSSL, as we are not able to link to it like we are OpenSSL in Node. `acquireOpenSSL.js` will attempt to download OpenSSL prebuilts from S3. If preferred, it can also be built locally by setting the environment variable `npm_config_openssl_bin_url=skip`. On macOS, this should Just Work(tm). On Windows, things are a little trickier. diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index 044454026..c8be56060 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -152,20 +152,13 @@ const buildLinux = async (buildCwd) => { const configureArgs = [ buildConfig, - // Electron(at least on centos7) imports the libcups library at runtime, which has a - // dependency on the system libssl/libcrypto which causes symbol conflicts and segfaults. - // To fix this we need to hide all the openssl symbols to prevent them from being overridden - // by the runtime linker. - // "-fvisibility=hidden", - // compile static libraries - "no-shared", - // disable ssl2, ssl3, and compression - "no-ssl2", + // disable ssl3, and compression "no-ssl3", "no-comp", // set install directory `--prefix="${extractPath}"`, - `--openssldir="${extractPath}"` + `--openssldir="${extractPath}"`, + "--libdir=lib", ]; await execPromise(`./Configure ${configureArgs.join(" ")}`, { cwd: buildCwd @@ -175,11 +168,13 @@ const buildLinux = async (buildCwd) => { // only build the libraries, not the fuzzer or apps await execPromise("make build_libs", { - cwd: buildCwd + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 }, { pipeOutput: true }); await execPromise("make test", { - cwd: buildCwd + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 }, { pipeOutput: true }); // only install software, not the docs @@ -341,11 +336,6 @@ const buildOpenSSLIfNecessary = async ({ return; } - if (process.platform === "linux" && process.env.NODEGIT_OPENSSL_STATIC_LINK !== "1") { - console.log(`Skipping OpenSSL build, NODEGIT_OPENSSL_STATIC_LINK !== 1`); - return; - } - await removeOpenSSLIfOudated(openSSLVersion); try { @@ -396,11 +386,6 @@ const downloadOpenSSLIfNecessary = async ({ return; } - if (process.platform === "linux" && process.env.NODEGIT_OPENSSL_STATIC_LINK !== "1") { - console.log(`Skipping OpenSSL download, NODEGIT_OPENSSL_STATIC_LINK !== 1`); - return; - } - try { await fs.stat(extractPath); console.log("Skipping OpenSSL download, dir exists"); diff --git a/vendor/libgit2.gyp b/vendor/libgit2.gyp index f141e4d2d..aff29d76a 100644 --- a/vendor/libgit2.gyp +++ b/vendor/libgit2.gyp @@ -11,7 +11,6 @@ "is_clang%": 0, "is_IBMi%": " Date: Wed, 19 Nov 2025 11:32:44 -0700 Subject: [PATCH 535/545] cross-compilation fixes for openssl and libss2 --- utils/acquireOpenSSL.mjs | 32 ++++++++------------------------ utils/buildFlags.js | 22 ++++++++++++++++++++++ utils/configureLibssh2.js | 23 +++++++++++++---------- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/utils/acquireOpenSSL.mjs b/utils/acquireOpenSSL.mjs index c8be56060..930b5ab33 100644 --- a/utils/acquireOpenSSL.mjs +++ b/utils/acquireOpenSSL.mjs @@ -10,6 +10,8 @@ import { createWriteStream, promises as fs } from "fs"; import { performance } from "perf_hooks"; import { promisify } from "util"; +import { hostArch, targetArch } from "./buildFlags.js"; + const pipeline = promisify(stream.pipeline); import packageJson from '../package.json' with { type: "json" }; @@ -22,26 +24,6 @@ const extractPath = path.join(vendorPath, "openssl"); const exists = (filePath) => fs.stat(filePath).then(() => true).catch(() => false); -const convertArch = (archStr) => { - const convertedArch = { - 'ia32': 'x86', - 'x86': 'x86', - 'x64': 'x64', - 'arm64': 'arm64' - }[archStr]; - - if (!convertedArch) { - throw new Error('unsupported architecture'); - } - - return convertedArch; -} - -const hostArch = convertArch(process.arch); -const targetArch = process.env.npm_config_arch - ? convertArch(process.env.npm_config_arch) - : hostArch; - const pathsToIncludeForPackage = [ "include", "lib" ]; @@ -172,10 +154,12 @@ const buildLinux = async (buildCwd) => { maxBuffer: 10 * 1024 * 1024 }, { pipeOutput: true }); - await execPromise("make test", { - cwd: buildCwd, - maxBuffer: 10 * 1024 * 1024 - }, { pipeOutput: true }); + if (hostArch === targetArch) { + await execPromise("make test", { + cwd: buildCwd, + maxBuffer: 10 * 1024 * 1024 + }, { pipeOutput: true }); + } // only install software, not the docs await execPromise("make install_sw", { diff --git a/utils/buildFlags.js b/utils/buildFlags.js index 3c3d9d9b2..7ea87428b 100644 --- a/utils/buildFlags.js +++ b/utils/buildFlags.js @@ -10,7 +10,29 @@ try { isGitRepo = false; } +const convertArch = (archStr) => { + const convertedArch = { + 'ia32': 'x86', + 'x86': 'x86', + 'x64': 'x64', + 'arm64': 'arm64' + }[archStr]; + + if (!convertedArch) { + throw new Error('unsupported architecture'); + } + + return convertedArch; +} + +const hostArch = convertArch(process.arch); +const targetArch = process.env.npm_config_arch + ? convertArch(process.env.npm_config_arch) + : hostArch; + module.exports = { + hostArch, + targetArch, debugBuild: !!process.env.BUILD_DEBUG, isElectron: process.env.npm_config_runtime === "electron", isGitRepo: isGitRepo, diff --git a/utils/configureLibssh2.js b/utils/configureLibssh2.js index 95328ebdb..95fd5d364 100644 --- a/utils/configureLibssh2.js +++ b/utils/configureLibssh2.js @@ -2,6 +2,8 @@ var cp = require("child_process"); var fse = require("fs-extra"); var path = require("path"); +const { hostArch, targetArch } = require("./buildFlags"); + const opensslVendorDirectory = path.resolve(__dirname, "..", "vendor", "openssl"); const libssh2VendorDirectory = path.resolve(__dirname, "..", "vendor", "libssh2"); const libssh2ConfigureScript = path.join(libssh2VendorDirectory, "configure"); @@ -19,20 +21,21 @@ module.exports = function retrieveExternalDependencies() { } // Run the `configure` script on Linux + let cpArgs = ` --with-libssl-prefix=${opensslVendorDirectory}`; + + const archConfigMap = { + 'x64': 'x86_64-linux-gnu', + 'arm64': 'aarch64-linux-gnu' + }; + + cpArgs += ` --build=${archConfigMap[hostArch]}`; + cpArgs += ` --host=${archConfigMap[targetArch]}`; + return new Promise(function(resolve, reject) { - var newEnv = {}; - Object.keys(process.env).forEach(function(key) { - newEnv[key] = process.env[key]; - }); - - let cpArgs = process.env.NODEGIT_OPENSSL_STATIC_LINK === '1' - ? ` --with-libssl-prefix=${opensslVendorDirectory}` - : ''; cp.exec( `${libssh2ConfigureScript}${cpArgs}`, { - cwd: libssh2VendorDirectory, - env: newEnv + cwd: libssh2VendorDirectory }, function(err, stdout, stderr) { if (err) { From 9977abb761c1a251176b81825ffc65e97ee6556e Mon Sep 17 00:00:00 2001 From: John Alden Date: Thu, 20 Nov 2025 10:56:29 -0700 Subject: [PATCH 536/545] fix ssh-key-related tests - replace private.ppk since github killed it - encode private.ppk so github won't flag it again - drop win32 sha1 rsa test since we don't a have a key that github allows this - update pageant because why not - add docs on test keys because I just had figure all this out myself --- .github/workflows/tests.yml | 7 +++- .gitignore | 1 + test/README.md | 19 ++++++++-- test/index.js | 2 ++ test/private.ppk.enc | 47 +++++++++++++++++++++++++ test/tests/clone.js | 58 ------------------------------- vendor/pageant.exe | Bin 679128 -> 0 bytes vendor/pageant/pageant_arm64.exe | Bin 0 -> 900696 bytes vendor/pageant/pageant_x64.exe | Bin 0 -> 936024 bytes vendor/pageant/pageant_x86.exe | Bin 0 -> 850520 bytes vendor/pageant_sha1.exe | Bin 147456 -> 0 bytes vendor/private.ppk | 26 -------------- 12 files changed, 73 insertions(+), 87 deletions(-) create mode 100644 test/private.ppk.enc delete mode 100644 vendor/pageant.exe create mode 100644 vendor/pageant/pageant_arm64.exe create mode 100644 vendor/pageant/pageant_x64.exe create mode 100644 vendor/pageant/pageant_x86.exe delete mode 100644 vendor/pageant_sha1.exe delete mode 100644 vendor/private.ppk diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 444a3e960..218fca650 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -161,11 +161,16 @@ jobs: run: npm install - name: Test + # need arm64 runners or an emulator to run tests if: matrix.arch != 'arm64' env: GIT_SSH: ${{ github.workspace }}\vendor\plink.exe run: | - powershell -command "Start-Process ${{ github.workspace }}\vendor\pageant.exe ${{ github.workspace }}\vendor\private.ppk" + $encodedKey = Get-Content -Path test\private.ppk.enc + $finalPath = Join-Path -Path $HOME -ChildPath .ssh_tests\private.ppk + mkdir ~\.ssh_tests + Set-Content -Value $([System.Convert]::FromBase64String($encodedKey)) -Path $finalPath -AsByteStream + powershell -command "Start-Process .\vendor\pageant\pageant_${{ matrix.arch }}.exe $finalPath" node utils/retry npm test # You're probably wondering why this isn't a single `run: |` step, it certainly is for *nix, diff --git a/.gitignore b/.gitignore index feb22eaa2..7d1f15f04 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ jsconfig.json test/id_rsa test/nodegit-test-rsa +test/private.ppk diff --git a/test/README.md b/test/README.md index e96c79217..e6bdccbc4 100644 --- a/test/README.md +++ b/test/README.md @@ -17,5 +17,20 @@ Unit tests for NodeGit. Test utilities with garbage collector, index, and repository setup, that can be used in tests. -## Note -\*.enc are encrypted in base64 and unencrypted before the test suite runs as \*. +## Keys + +Note: all files are encoded in base64 in `\*.enc` and decoded before the test suite runs. + +### encrypted_rsa + - passphrase "test-password" + - registered as deploy key on [nodegit/test](https://github.com/nodegit/test) repo named "Encrypted test key" + +### id_rsa + - registered as deploy key on [nodegit/test](https://github.com/nodegit/test) repo named "Unencrypted Test Key" + +### private.ppk + - same key as id_rsa + - ppk format is used by putty/pageant and converted/generated by puttygen + +### nodegit-test-rsa + - registered as deploy key on [nodegit/private](https://github.com/nodegit/private) repo named "Tests" diff --git a/test/index.js b/test/index.js index b138525e1..abd2fc217 100644 --- a/test/index.js +++ b/test/index.js @@ -40,6 +40,8 @@ function unencryptKey(fileName) { .toString('ascii'); fs.writeFileSync(path.join(__dirname, fileName), asciiContents, 'utf8'); } + +unencryptKey('private.ppk'); unencryptKey('id_rsa'); unencryptKey('nodegit-test-rsa'); diff --git a/test/private.ppk.enc b/test/private.ppk.enc new file mode 100644 index 000000000..c388d98d8 --- /dev/null +++ b/test/private.ppk.enc @@ -0,0 +1,47 @@ +UHVUVFktVXNlci1LZXktRmlsZS0zOiBzc2gtcnNhCkVuY3J5cHRpb246IG5vbmUKQ29tbWVudDog +bm9uYW1lClB1YmxpYy1MaW5lczogMTIKQUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQ0FRQ3dP +Y0VONis1Vkx2VXBQSGp3WnNiMHZIUEJBRzcxUmV5YwovQzAyMkhDWENJV05mOUwxSWduR25nSWU0 +OXdxdGUvWXFyYm5xMHVqOXlrSjE4Nm1GZHdoeUtBNUR2dm5SM1FmClQ5OG12VE94bnpDTUJ1QlU3 +M002UEpDYTZVekpoeXhtTjNVTU1uanEvU25oN3hycVdkYW1YQ2ROS3hRL0QxUlkKVXEzVGdLbnBI +bGxhSEI0dnoydHZvRXpBY0dzZ014aFZ4NWdoZ1YxT1Y1NzNYNFVDRXA1UVJNNHJ2WE9KMDRDLwpn +Mzl5KzFNQnladUpveno4OHBaUFg4UFVISGJOemFWd2JCeDFVRnVJdFVGeGo3WkRGK3hubDdTTDBl +RW0vc0dxClh3akhVenJlSmgwQXpZQUNYRVYwd3czZ0xSQ1pmSDEwa3RLMVlTcTFhQ0Vld1Z3MHNu +TUl3cjNSMkFjZkR5K0QKM1dhMXd0WGxNb3lDaTFhRUhwdmd1OFVOQWhteDdJVy9pcEdEZHcyaGQ0 +OVh1ZUh2MjVwaHI4S1ROdVRnWmdMNgpXYkVQckFSM3dieHp6QXJ5dmJEbWJ4N1RSbUNRQVJxZlA5 +MTlDQmF5MmwyUGgvNDFDNFJZV3pPeUxHS1F3bzFXCnRwbk9FVnBPRTRLYmRNK3g5dzBxQndEdTVa +TnRqcGd6WlBrbVBSSzhZU2NtUkRkSDRmNU1lT1dPd3Y3YTVoTUgKZHg2Q0JheGF3bUt1VFZLL2Q3 +VU9wRmRQRnhLbjJzU0l1RzZwWUlyOHJFTHF0ZU1EUnRVa2ZYUUtBWFl4NlJRVAphYmgvSlZ3ODB2 +OFJkaEs1YVRQTld3dlZ6RFpHek9VcTBjQkV2dmdjbG5PQzFqYnE4bEFyMzJlZzQvWXkyRWJpCjV2 +MkoydVBlNlE9PQpQcml2YXRlLUxpbmVzOiAyOApBQUFDQUYvalRSU1NKK0RaNkRSRDMxcVAwZm9o +QUtzbjNUaEFqL3Jyakg2blRyd2Z1dXUvZmI0OGd5MDdsTlBTCkVGNTlHTURBUXozVGl4and4N2Uv +WVlZbHB0NExHSU56ajhYTXIzYktNeFlWSlNlbEF2bHVWR3BpMEVRRDZIc2kKTHRJSlp6TkhRYjBk +U1lZenNySnBOREFJS2kvalBNOVVmWFBDbDVabmhvWHJJSWprSnFKTlltK0pZV0FmelNONQpDQkZC +UENDUXRrcWs1V3hYYVB3WlVYcExQekZWL3dqMTBRUlJ2V0IzNE1WajAwckp0SVF6K2w5NGNDbEla +bm5uCjh3MFF0TkJ6UXhqaVhLd0tWRTNDY040WkNsMWp3cTNCeWMwNkdZN21ueFEyU1hYUEwwRGNr +S2E0Sm1MZUw1S24KY3J6UmJFSWVFZUQzdWhGelUzSTByRU5RUmg2NjlJcHJhamZSekxjRnhuQzcz +QlMxUlR5Y2ZwZFNHRk9QWFQvMgpOZDM2MlhTZXA2Vk54U3Q1YTZ3a1dnSEpoMkg4ZFBjbmlESDFE +bXJBZFA5N0FrZWkxbG1YcWJ6Q0lWOXBpZDNtCmZNQUpiSm00UmhRcFREdmV1RThOaUJnSTYyVGt3 +dWNvVzJ5M0xkU3YxMzdpSkJuSlNjMTFHOUE1YkcyeVFYRTIKYWlYUXhIeW9UMlF0VmY1WklYUmFW +THViUW5jU2dMQmpnQ2QxQ2xqQjVqbFJZTXRTYzhiRmEvVEo1b1hPVk10QwpYNHhhcVo3Z3JHS05C +cUJsRFRXblRnWk1tdndQVnVjbGU3MjgzNk9KUFhvMUxqM0sza21yeEMxdU5HMDc2My96CmJLOWl2 +QWF1SFRMMnQ0cHkra0k0NC9ZcERvR2sybnhsV01kRDNMM0pVeDNRejlMeEFBQUJBUURiVG94anFO +UHIKRk9aYlg5M3g2TjU1SVdOQ1VLdXFMMVZLNjFESGFLWGZpaXdIRHlRYjEzUnhPREk2RlNXMElI +eVpqMDh5ZjBTVApJRjlzWU1BcDcvRktRTkRJalVWcjFSNmdERWdBdytjeS9naXlqMFVscUhNc2dU +UnNnSmEvSjJQYnViRDRWMzdZClJEOHpwdmtLZjhTSjBiUWpRMGlMdGFDVWJvQVA1ZmFhWGxJS3Zl +Mnh6S3VYM09Jdk0zTyt1UTBJMDZqZGtMc2IKQUcxL2dBOXpiZmltcEx3SUJCZFVJenY3aEUyajhi +aGpPR201U0lOa3M0WWVUTlRWV2R4ZnI3Yi8wVlFPSXJDdwpEUCsrQmhjOTdkK1g3WVVVZFFIM1Bw +U1dyVm9KTnNITXB1VFpoaXdDZ0ZNTU9UWEhHVmxqRThyZ2RlU2xQc2dCCjFzUWh4clJTTUIrZkFB +QUJBUUROdGU0KzFubFlLVjZFUVl4cnlKVUFLT3RNS0pmQTVYUlRzc1hoc0V5UjAwcS8KV2N3dHJm +ZjM1dzdmQVhCVndlTnplZWl5cGV2SnNZZ1JwQXU5T01ZdHdYRUJWNUYreUlCUWtpRzE3YlNlei9z +YgpueW9pV1U2QkFYR2JkQ2pmYTRlVUVURnpiY2xqdEtsZ0FCUkdqV0Q3UEZPNldmcEFqUXBjamFR +cElUNlh6WGZ1CmZXZ3RsbkZrV3lQZFd6Skw0MldZQ3pjYVNySlNGS2Z6TkR2bVIzc25ZTmRwdWxN +WlBLZUZ2bWUyVFpqdVRSUkUKN3U4S1pGeFBqUGQrQThHYW5Cck5QaWpQY0lxNUphQ1p6TDM1ZGhp +WHBiQkMyUzJYeXJLcG1jK1hKUTgycWVPdwpkNmU5b0pWMTNQN0pTc1lhRWp2UVR5TnI2QTZuNDgy +L3FtUmR1MVIzQUFBQkFRQ1c4emFSOU9lTzFwM1hpMTRYCjkwM245Y2NjUlVwZEw4RlJQNnkxaStU +WmY3ZFJaZWt5bVg2Rm1Pam0wL25vVzNIcGVaMmJiRGlBUERadVc0ZlEKbWdaMGd6bG9kRENlSnZQ +cXZTUXNRZUhKNGMyR3NUbjFUczMzWFNUVnhVS3d3amxGdkxqbzJCQXZpQWhmd2FDdwpSbFRoaWtH +L0J0LzBtWE5tMXpwcVlucUFzWldvcmo5VVZBNjJPVzgxQ1VYMS9kVTFrY1JBaWNjbFFsak5TRFhi +CnppYlU3am91enNDM0VVRURwbUdkbVRRWHhYc0I1MVVOaHl5VmgyZ0FWcUMwMDJtSndnRVVzanBx +c2FMNk03M2EKejgzODhvRHBYYnAxQ0tMRHloOHZKcElOSDBqTk5kRDF3V29BUlFlSHMvTmJRRktR +OElOSXZQc1p6MFpHZkc3Lwp1UytKClByaXZhdGUtTUFDOiBmMjY3ZTM0MzYwOTViZDc5OWYwNzQw +NDExZmJhMDM0YzZjOWNiN2VhYzk1ZDg4NDk3ZGVlYmMxNGZjZWQ0ZDU2Cg== diff --git a/test/tests/clone.js b/test/tests/clone.js index 4f2b58d27..f256e85f5 100644 --- a/test/tests/clone.js +++ b/test/tests/clone.js @@ -3,8 +3,6 @@ var assert = require("assert"); var fse = require("fs-extra"); var local = path.join.bind(path, __dirname); var _ = require("lodash"); -const util = require("util"); -const exec = util.promisify(require("child_process").exec); const generatePathWithLength = (base, length) => { @@ -237,62 +235,6 @@ describe("Clone", function() { }); }); - if (process.platform === "win32") { - it("can clone with ssh using old agent with sha1 signing support only", - async function () { - var pageant = local("../../vendor/pageant.exe"); - var old_pageant = local("../../vendor/pageant_sha1.exe"); - var privateKey = local("../../vendor/private.ppk"); - var test = this; - var url = "git@github.com:nodegit/test.git"; - var opts = { - fetchOpts: { - callbacks: { - certificateCheck: () => 0, - credentials: function(url, userName) { - return NodeGit.Credential.sshKeyFromAgent(userName); - } - } - } - }; - - try { - await exec("taskkill /im pageant.exe /f /t"); - } catch (e) { - try { - await exec("taskkill /im pageant_sha1.exe /f /t"); - } catch(e) {} - } - try { - await exec(`powershell -command "Start-Process ${old_pageant} ${privateKey}`); - } catch (e) { - try { - await exec(`powershell -command "Start-Process ${pageant} ${privateKey}`); - } catch (e) {} - return assert.fail("Cannot run old pageant"); - } - - try { - const repo = await Clone(url, clonePath, opts); - test.repository = repo; - } catch(e) { - return assert.fail("Clone error: " + e.message); - } - - try { - await exec("taskkill /im pageant_sha1.exe /f /t"); - } catch(e) {} - - try { - await exec(`powershell -command "Start-Process ${pageant} ${privateKey}`); - } catch (e) { - return assert.fail("Cannot run pageant"); - } - - return assert.ok(test.repository instanceof Repository); - }); - } - it("can clone with ssh", function() { var test = this; var url = "git@github.com:nodegit/test.git"; diff --git a/vendor/pageant.exe b/vendor/pageant.exe deleted file mode 100644 index a57f2a466b1dd44a9b04d76714d305922da294b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679128 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%0DK$gD?z zuHP=;330_$v$AfT*k_M5%Yb3zsdeI)F4?w-Ajae^zFkD22zOKKH*3AdN=Y#y{hg{R zF?ntP2r<$7ARf@y@>0(Nn#<@@f?V&*E@ojrv=N|GM_7;m?DoS24&qwguhxS-dlJow>? zt=b<2iEjaC-4(V#sve({ZzX{7(FWx!=<*E(FfAKey)-zr9j4pe5e9l=uhA=SLx+VWjB?r2 zdd_QJU;zz`=I_o@Gdv(i|DvtI{`VZbSLq){e`%D9lKJN>CXVj3SiuivdKXzLdaukH z`hNX+f3yOILr~phTcCe6+~<0UUx0l+$AzPOOK0;V&D1ZFg&nJq;cUBAo1JK_Ko-{e zYOHuW*Xl(Grif8msiZ^m&4pg6S-w z8X)L#Qr@L?F43P~?_tknyvf-0i8ZOumd(_0nNvgOI%R3e5M)^xHG_m04|Rws29lRH9ep zgp2a-z#1!DG|`siw9TzzKke2b(pt6m`#aiEZEAl}h<0!0j;|?lAEa|xHnxcSELsh_ zH|^6~%=14KyYl|l_DA%ly1UZsHvAue>CiNLxqDM9&0}#{ZCRztnlyKd6yVWYz2+a| zWwoixCtc=Ch_Y4YQ&woDxxq5kq0Ws85_`B@#?@cUGS)ffdTjKq?VRsh>8R9)QgGBT zgrQz<)XK4z*bFiodE5;T(X;{?CV_7ksMVyhy!QQF7V+0A+>7z?3+Oq$zU_Dp@I5Jt z$s?OAm@%InWL5UG5Rq6Js}WsQX`W3lG4bIrXq2Kj@E)DcIK;bDtQO}|OGh)XZVF81 zSsT1?{84{@^hN`yM{TN5&IuU-gTpCG)C9@|^^4IOG6wA^SV$78++XE;d`Pja(kHs@ z1cQ~;KO8HzpM1h~qHR^m{#aJ`IJou%^6QVQcAr~+TpAu6=lfJ@mv%s+!j}Z(v%sRq zy?Mt>j#Vu0r_7PcGn%FN&n0=R&l5nM)>aT89RG5Fy=?VmVt@8 zx199#GWB!8-45N!L^Mg}4>O}sC5XjmbUB%gJ(wj{<^l5zm~}~?`EXo;8>rVzQ@yyK zSFO9!-FSdWl*C@yU!3ufcD(=cK~F4qAc$>v&V6^7R0-Y_`4cHs$GaPTB{X1l{)2>a z%#0Q?va-T|s-h01;=Oxbv;a{ClP2S?GUONS`zRPnY;xkU6ihlB}0K`wo80&zb7@OYlPI zViv&o1A}yuUSF@W~^1dMI0M2H~&SLC+^v+%suBS z-dJt6TQB+nnHDLbzEgGutr@XHxAa-&uNWO-8^%L&v-3 zF%?l08A)Zrk?K2h7@I8I3*~2P&NO~{Va?`Cw7F^lV>3GiCnAu0&Dlz0j%ChMbhYSl zI8XFg&ScV8nNh0}4v!besYk3V#+b_{8-wf-zgRlva3B(9o_wn;VuOcBc1rD>P)S4D zrzF~z8eI%fC47kEq`A^+q$m+tI}{eEEyW`AisV|}OKqm8x~qHG1N5+=tD^j0;MZGpW>(8B~_vJB{3;~}zc7v&JU zAM%?866Hc|*`rU_{~ldse(S%%)w3bA-t-R%aid3_QiSEK#NBW$9j{09!ywCJE~Nkv zfhfEik2s>i6K81i%()aJ2)a)Z5f03)Zq+a6j<)v_J*vhkC5yonY* z-Fi-f{y+)?BHJn&8jvA`?=42UyeQKYqCQ~1=a!>Yl_K#)#1=E=m51-sY$ci0kLD8qTUj#I1EV`cHNa-#|jTb`_| zqc~58A1(7JA7ZX5^PW#tyz-vKIsJ#BJMqV~o?rYisZZaX7*Lq6AskTrhF`}i^BYi- zZwAW^xSJf0+VDs`Vh|DQ6RBk9$Tzu9sz1b2nMCxY`lF;;HMh5{jqz05`lk9fNmbe> z)noBgB0R^-3as+=mz}OSOxC~(tWLy!$M^HzSiNO~3^Q>W&(dI^0(nQk<(qYL3FmLE zMm1Yi;Am=EI7MKWf6DFUH-9~n*&IMn-D;S{M+y<=)4rOQ8DR4IH~QeAE!C%R6U*r9N>y6I z=<6^(9>iwWGG5j{i*B~?cOwI>0mzwK>g4AXhhNuYpEg$iras2J9x@aR4(FGOSFlRe z54i^yx%kWCZybNq_?xBMpKwr)Ug6Mhaq73EvyTS0^xL!aqU>-{4%uz`ExGzF6OBpI zN&4;6^rAw&qC~%ChJMR6>tB$tqJ`C1#3jcvgkGLnitd+ox?pGmsFJ9dZsMPT<-PNO zo=iF%1A!5j;#z?sRtBmbL3OSbHj%JP=?X$}tdKFt30Y?;hG03sN7z{O)RnVXUk!aK zC_k>J-n)vQl&7-zN+_rwvv$HbsPn`lGMb&tdji2g>X&Y?Ly%#sO{njf$^TV!K(`tII6OndaV{Qisr2i=Z)i{aw8AGLgW0;(>YV@3sQR$tno) zQU}d&GawaU{s-#NMcD zd!u&EBI@kks4IG-!lH`4;y)>cfdNLRfzbgVSTI_MKM-U(t#ejFgk!OZp7oGEUZfy% zU7RC`5=1mEET6eH8EP(snhV)T`(%L2_Bg9u8%FWsNs@b9G883yv%-bhDd`9hg%&l> z$kmsi(^b?wV;Z7_gM(gTU?9}{v_-waYnXH$Xt!n=lZ5XXBP2QNPR21?U)2?r{uHhb zRF)9uwx#SQQk=QXphZ(sWmcXgGOaN&CpzKj`xy@j5*+`mnnuvWUHVlvHZ(aRZx z4y$~BknNN8dt7$~Sb@Iab+*n{(^%sg-nvAAQ{J{!u&X^@k^Qc>`Clnlq%xw-Kr26dw zx*DBK7!oD>H`thf1yqEsk+*qQbS9UP%mBOAM%gtOU~@CNF+yqo-bBXCh0Jq-*%(m> zW(jcW1qb8}x?rGW@5?Ff889q96gfrTkw zhO(PAP=JnaS;bB5J+kv>e0y5Q~(mLpETTu4J zj1i*xfL!+J;Vq&KQLnA_?{G3QR{v&<-5ld0(FIqlZw zl23JzHJ|l$KOiStUq@+ck%u;k*y_7yniuctMev6o{L@mxE!Qh z%sHyeMmEyvYEXf1dCavBnZIXM@_Fxg;=Ndm?Z-8x(L-mspKkV=S74~1sincBrgD3E z^dI6L%$i*&X=39JXk{`Xkd(Ekk!^ho+(ps)WM$`Q%i$B^*3kZSJySo}{-~ zn|RIWASzevLrb;ZDinrX$!3r@~Gj* zaSErY0Nt7o9@A%e}#V`J%)GxoNV*IE&*Cz=q>FZCy)Kz{;~G#NnrM%{IIta z>8_kHuOk;_(z$J=wvnZ>s=fZ$zNo8wZKdm%e;u<;`y}bEY^gF? zYdg8;eJnz~{*m*zF0_c6*xlrY#E(ml?yY;n9?hKRUx?u3tTaaxCoxgl^f&#mLRRC; zjE@-Dre0fVQ(EK~e5<~zgl-TuWehDGXmw$@QrX>@v*O>})=VSvAiyO2r!!6S=Flfc z`&FBMl|AboXyoX*`d1zDM|GT(P{CZ)@VwXQg!W-O|B#I_fj|_C1U^W6Ibu-e%j@=oIDhjZ6@+ zAcqL+c=1V9*4)k9aVsILNjc5Edj&d*Z>NZj)=TobWh!NKnO73xx9h3qLtqf%sDVe^ zdhiYNM~EuENfV0kHVDM#1uEmxTWz)l3z&GXG|wZzyp0Fw9^m`kH%WLaB`z>8k%;l~ z7$A>#fz@kX`5lQm#yiEQnBxP)?B*-Kxz(R$?jYd{=1J?@{Ig_xRAu|lO0u>3(|r%` zqSdv4#02*v@U%eqL?M7pIJkDvJK9YrZ00zE*OtDvKJ#daEq_PR)E0Ncc_aYXnfgEp z^gZ?zkB4}eLzhtm?FbAGm&*JQ+agP`NQ8&)K}oevQvEO}slq9eS^6fL()22|#e%Py zA5!uH^ZNj4bmhmUTpk!+Wu7l#G|yA*PpUR9F?M1VVJpQh&s?C=k!om_`6&fSD%2h3 zwKq#CGl}KMFE>Uk1y!PFDMZ!uA`?@Wc|CC?zP{lgXEp|sycz^NClxJ-LvFN1CmFLl z4Lif4w1YjgyA;%|#!aR<(#oA%x9S}m`CqGr@~rk6r5)xXL^r|yRixtl3z4y4hxsFZ zUoiiJ_C^}O3={@snf-zK*ntHM$OAJJ*(tfzXwOeM@i8LSq4P+zuN_efZK|CGi*Z3?_Nz*pkBeM3d;*b(^H#a=n zgKNym7IYV&$RBBSz=bkmX@uM7B%e9l`V5p!XpUZ``Y;qcQmu8I_l$IxKYPL0cC9_O zkA4-=P%k~AbHjJ(iQoL@H_u3ZD}XFk*kT+X5o!lH!j1eXW{ggG0X)%DRmO~I$?fjV zMd_i6%;ep?q<*I>H~H|?S8$ax+cot{*HXFgC%M=)wS6h~BL}>qk zgUjXmbI*WwUFAHsXR)q0s_Ih|mD){5;N(ZNo4Q4t^b(S}QQDm^tv_KYfXB;=oRs4w zRN6_R$uL%|{~v*wLbz z`F_Q1=^49>!7yOI&}zO~z-Gq`hvsBa=TL)AeI@bLx+Ra&D1Ayw4qby7(7I)sgls94 zr#8BTA6%6fomyv!za&(;6;n+!|6)}QUx2(FK#rE0_CTt8b7^NZ+24P@>Na59NEBo} z@o{T7I@wc_-m9OYhT(`U)-Wu}3=Yv&1_mv2X^)#g%=L`4YeI9YuYEkW{AwN&2(0P2 zlKJ=#Kd|Ow?!bI;j6d0&2d`zR@j?>Y6>7#5An(6O0jW3M$1a&3l8d7CA2-PJ=XLV@ zpS$Gw)C!)p_xL>J|`uTZ4{WLC7Kfk$E{ru6#&qF_Ge25>T)S)*%z)MJ89_A&i z>XkW~lfHhh-ndT1J|d7ffP@@OgW=Lg;NFGdQaMNq-Q)0~8yul`pC3EMWvGuZFsv4w za}X*y*=n^uRN4)qWg4buU2ttDjmADCw&1$>d<`KRw))B6zT>+c!O_|ZPjc`)qcFW7 zJLTWb4h%0iUw+aHM#|5?0$brv>8$+bMcW*hm!T4Up|a}f2VkF1%46zBcbr|VZn)@g z?26Ad`?WU5)Q^@%7K?(R>gk6htvtReZ9?#h|N06i727yoDt(Lu=fU{jgTo@v*pAAo zYD;AS#XsxSZ!%-SZf-Y<^HxDhY1fS#B;VmyV|Le#`apSKuo!?qK*eE2prdC9t>W3e zGXLQ8ek1arXMcaQE+n+#ZnzbUYd3Wv8)yS1Dk*^SPey?^H5r%41oD$cV6qJ_ zO9iulN!w-D)k`!r9N=@r5B=F{{#8CVs{9&3`T@`g)~s6ig= zf@I8fu&5a4Wq1$?0lbdG8j8C;sPX>43nC#+c zHr3M=w&*Y^?_8gUo~n96gi_;q^CL1>F~rPI2tdVQlpe80QY)avxyWR#V9O*CAHM06 zU-QpBYy08GBndHgqED9PfhCR_L3A*b#2w2nW49Tg3a(9_vceS@VpVSJH`>jWRdgzf@oHF4XVeZuqj-e%&N zV1)+X)lA3IA=SpGEpIxLUzZkrxN_WD4FapeihA2lHwIJ+g{;nl@!QnY@G zcB(ZF=(9UpKFBnN7|*ptGWFS}{Cf1+UGnQ}iE_8#k*V7Pce*#VyEknc+a4H{&t4QB z?Lw|np*Y?fpFzx~hw&WX-t_!GPx6pT(nVLORC~sXth$5SkAK+`a?O^4qGubs#?Cea zLryI}3LBL=u2Thc8-)%F?rs6`fHC_7zyqaG;fOcjNW1}^ssS|UtDv{5lFidW|Mz~< zKw(v{vzuj=IhhZ%xWs3(X=zi z`d?H5(0XPM);mubshOX{y2Wa&k-Fk^e5Tq04JHHP|2fS}R7qemyIJH&s@;J>U*s}h zI!-?p_6VgHX7#{+DwoOn9PIyVF7q>0@@Xk%g-Y@-P|T%L!0c{g)d_$0{IOlh?aAF! zyY$)J`l=IdEtP}z$vcxzTHo5q^W68QkUp04KZoXW`n~8aqsyp%%W5{0LYMIgO?^L8 zO$Jsg8PW`RtDjb$uAlzw_{!07pGtDtwq_bT$L{*Fp*>6TuR0;EEiwgi^J{_pVRDfaYS^hTBB%(0!*2l68V`H`;$@)r@jzXI~#t0ZR*xnJ_f zDZE=C@BUgKANtjhi#^X*NIR#cmW`4>4*3azyjRrx3a)bdmvfciqSNAAl&oip>mVZL zVx#4{$QX8JjG1qqIw;>f&7i#P%Lirfk6%6@gFmD#XFM1y5SA0@eMivy&euX1vQj%O zirtO-RgyDBv%B%%C4ZdtMNh?Y^fXvLE$hPw($5X(lz5$Hun1 z8$Lu(Jar8o`8z>I(HqhsZ+tBs5|RQ>KlA%lk~1g&3nhQNL;i7Uhy3GAJLDA(ew?mD zHWB}?kpD8tA1D8J1>5g_E!aNK0_$|-f1+C;KXYtvmHcsRzke#W-#=4q`zZ5t*q)(a zK6CPS_QG6rSg?KgYr*zkaBcJzw0*xya^~2cBl+XlK6)y)kDe*EKRJ4OZ2y(`e}%UH zL-NOI`xC+TCtnM;r(0m1j<&N^k~7D4$HxiC-J55gbZ@RcS!=Y^wwU-W@2WMnS#RC7 zQ=h{}BuP<|x;LTVv>YcHVPj|HH;R8Al2#x3T3S6@Ksr7Dyig@M^H#r$@4-ZWy)BTx z{k1^;Z&K{(Azz}BoH^uqy^zn0oH{xpXF57wV{hhkylAUz=llyo{aunjKBC_{73TNO z6z1HofZ6#k!rXqi7v>L7h55rXg*iZ(r^E9#Qs=*b=kz`>e|##;AD=1A&79*u9n23C z|F6J&z2uK`&f_u?kAE#Av7ZIj={V;CmsZxs|-W=B1oD%D3flbM3clAZko*+V^4D1)RW7cQ@h=Fi`z8qc((iQ zy{Jy>kJq83xnrpNiP5sdZg<~(KcSH~Q4SF#<^lFQ`hE0k*&mggX2SVxzjKozIH)&6 zhv*!wv^KZ)J8~XVM|0ebKbQA5qB+zeW+?6_-buP+ARFKjM`)QtPYbPa5R`n!;E&v^ z2Wb&!XqmIt{faxZ#(9k618lzDre zvOMj$eDAAuU*>+*RqI}J9$y{uwN1XtJ$$|>pPlmgz3kAMyj7b+%UsGm6mfI9L(96^ z2j}(lWdmTJvgNB!+49*_wli8K1)m5lJMq7O*>Os_^3|tY`RpkdmwTSOhT`B5jCn%K zXxSPt=82l_Ck}lPyNCW6b`3}9rFqypbyyu07}}J&Hf^TXX4k@YD=7G$u}9I!pCFc& zNYY2Y(cVao<@{J>%L%m)iJ;L8s{t|UIl_jq&PwoSo`aTsdD~%O)N?VSFWheyP zGv{0_ZL&UtA6i3dsjvS1I-=`8kSE=h%HJFhkE(1QHF-R03whk;<+1E~9;=t&%Px(- zt4X$|nq+GhlWfh+BwO=6lC4=zvNda#)JLSuV=Z+k0E6pj{?bv}``OwDAw+*tPfV(iAOX4}KWON;Dacf}uf& z8{4MFH>nuXIJBna-Lyb$=+`-X+Z27L3bo5PtCB%k!*E=a#^2RKpw$G?7Q$-_dEDmZ zvFv&ttCtXQGhwuk$8y4GUuaVurG}o7=as99*cu7_AeIg_O#~-6u`EzyT?9P zVQe#0u6|8ttsSOvwU|km?@%&43=TFU_|bw$1m$917W{wwm(K0@KmPl~m+{|gt~(?C ztFq;UZY1|QdECn13jXfnuZO4o|BL_H76Pk>M<#!{{7vJp2iE`NzrvLNkN`-S-*1_mOsg4|O_>Pg;9KT*cY; zn&J}EImZBE!DpjAviKdB_tYtKd=_)RNC)K}Eu77~PS_ot$6C$b1p%MSikbeI8ASp>`x)cbR||A&e#Jbw+@Xb?2<28h0-=Qz zYnH?Pw=4~oF1C=oyQRZ9U^meI^{{)%L7V%mgV<3z9vAV5(-@?fMA|k_^fmX^mgH@mHkVo#W|#SGJ%*RT z^G7TD%YE`=4?4vsl&vnfokM<{f>5@XM)8TuS_7AGfa%@K-VA)B;jO?Mn7t8{LC}7J zQVH4>{b5aysV14lR@3@9AwLRXm~2+Zapu1JGwLx`IhSJ-H_v5kYkA{yxKnr=wM)*i zbc{WozZcB8PsNhf)Rg?@xCEQw-sDDUSwb;^?DDuA8>Kt9Q67`{x68WJh0J&vHD|QH>J^i}c)g@03Nty@E`Z z^TuBVjr-gU5x)BpqJUw1sO>^Ab2hbckMM|NEouq-J|fCs;D>Ja|Fx0xY0pToP~Vd= z-bNj$|FnzW<=+7Rtn5yq+~)+vG>qc*y0;$GOiwas&E(UsHQO)S7u;&>4$ZNvf*N-P zr;Pe*ys&Rt!$4I`AyRpuJw6l!2q)t}Yw<*%rPSno$=J7@O`)F4&T%(>3-n@&Oe3QI zIiu#f#S9L4)=jYmjv2=-m|u-oBa01tbmWuLBJ?NZp&PT?Afr1D*sluoWN=YOy1c6-Co zz&zuaC@`ARh`wxFU>HMgU{k8~(H~3vk7zvu)e340MnbD&O*bSlAaf-s>9Xy?r<;nB z$(7ku8^g%|vh9J_qyMFl*0e412wR?^@|a-I2+K2^^1=yjfPT9~yqfw}9K#U(Pm?%r z=*Vf1_h0djS%0fJ^)lu6R2?GW781^Pfkk> zYiLx^d=>OCLAr`C%T>UyRe%JWmk^-gA9Rw0NsYetft(7R!Na_UxCQa5<@^FiDhggA znT>O;!*u~*QQzc`sN@0>pvoZz2Ck9XX&nXVVi>` zA*sLo0Nj@OOdnQ}a!3%*cd-Q<77`Y(2OV4dQCZ~A2hi4LZDU@2wq~r>{u`> z7R=`Q9{D#)nYI!)qvdo>RNPw!lcjn@^iI(iW!{ zNwCR*WMY1wMA~oV)wY29jT2Poemd1_{$vqx-8V&DTy4+iE!W6d)&;>2Rpd${7iirp zf_M~20!2+{88)MCE#(-tCfnN7vZmCg=hmK8*0j4}2h5{~(p+?WWuK&(O?H^Z;HKS8 z+u(uyikj@?Xbyf@MCh1kziBrG223jrq!BKm#-5o?_Gx*6%lf!=_2mBYtPJOHL;lv3|r2;%_K_@;)s7C-3q%JpP-A zQ+TQGYyeHYV?bM#iM^hOV?ya16@k^Cjq=8Mo$OGf6l6gXYOLek3q&CW8I)Av4TXM9pxKUZNp*nL`uvzrqYH82DyThw zht^>q&=SaEZgeo7zh^W`g;QID7d9SUF=pyV%SK19Gc3Sb0<&pWM&r?yjfbPhs(WfJuQqfzs@d9lHRu)_Z8eHBTxVYJw8a@jCeU`qqOFONf}8v& zYu3&>FBaYSzs7%Veh>bCyUN19IQjZ#_+JWG|6kyLmJC%nKy2avmw47!_^$x}U|(zJ z7-1a!%X(08G3d_&{o|tFvd}NdDrwem@Sm37T&t%=J&Du-Z~l&2-Blj%g@F*-SN6ig zTfeLq9;Fwgf|A82qkmK#QIX%Q&px5s^&*E}J={XOfXt-0j^i1>lK-LMV4NX ztykpe6}f9G^7M+yYb&PdKUAgtP?eS_3x;OmJBwX2j?3!zh*MBu+o^K?uFN6aoHKu= z={O37%j;$7kl&(h3}4}Q9FvzZZ0xDhIh~ac*}Ke+JPP2eOV2kJIpySADtuJVtGcd| zlUc6@uHk4GUZ;}{oXp<=*MkdPKn;eRvnDOg~5?fy8jAuwn`On#L}Y4 znw!106IyH1)I~>vk6YiR-HWx$ZNXF+1?*ZKfW?6|ch3ihnqJ_EPdPj9#EnI>oDf&g zbE>S+)ndB14c5h+w!&cxI&f+*EH++E^_-Giu;6iV!(5Atiyy1A!Jp5U9?u7B20bpj zT`neE6nR}tIAdTobid%!Tnc_^WeQBKrj?_(Q))aYscDq?-{0(kE)VF0>v7E9rq@i? zYqBB;Wj3wMlQg9!(|zAMK4Qzb;l6BwvD0g=8$hzMEd2fl9@o0lmT!k~U->;WRy)o0 zq>Pqob8=&PP0reyJiR7cuNk+tW?FPIu`fvMH+WgWaEhL**W^ae=S#diFc5Z{kI73K zFPY5o;{D@hp^h?o3&6KX}fE>e-e)1HH!G!8i>(LqCbyJWS!UFs z&B=_3#E8Fx37VN5xJWaT10yxl85lN0jzA9JJD8=-%yvf4;^~Nbc-o`=d1jM)W_D77 z5GpupjaaqZ1p)Ur&jTE&ce%?r7oP*rE>}8;0}ahg^7qH>$Lmbya6b(v$98pD0)j^L zB08horA;1*F2D4|)N;>K6cZk(DQQBpMVbd8&2z0IrASh>+R6zRhAMIbX>(0kS+r_J z=?Q9OYwS|ku4df>x z1@X=qH(LbPBQ~P~qDs=b^MhyCYIi102o4DqbD6<7jyK}`(Gz)qU#tL= zYTbbV!)7^$!ST|WPjsq8U&xC~Ue4!5Fc!^>H>$tYD8GZNLzCz0MdK25gFlO2nTG2_ zKFmMpFS^!0U&wX=&@KOtbx+yUmgScRE&)|?^)W4)9=Jm5E?G80>n?ZSqsDl5Wzfxt z+hn<6SfF;I2Jh)UbMyVdZX=&&tRRJSW%Wxf_dt#duy{bfi{a)SbWAsL3uy z#l@Md7SrL+Ufi&aovzjvGnE&I|DtGW!(Rh~{A1@E&((^fli6L-!A9#Ilh}T>`YO)D zvTAT|uA1OqvAA~X{(#dze}3)M-NAuUMhfiOfn(032?w=LZV0&iMG_al@k^A!5-#n8 z-{a9Q=zvj-#uUUqp9y&O5tYd4FS@RF>b_u-(Os+GHTx)wZ8l9LQf9Enak+F}n5 zmNb>IU?(?^lb4Ks;mNb0!O)yc=A^rZ8D-h*&5>sy{vN60=-DdWVpi0%Pt@eUc%3=x zG0INN(6A@t!)jrGq1A<28GNEFJ+^F|d-MDgLTUIN<_bDoD62x?s1uAIIB3V(MJLvl ze#WvZ$=JoYeXn7QEpdcOPvFt#Y7wyI63UesZDo1(sN1+#axnj*&#Kik6Q2PPrLUg2 z(Y`obHkmHASyQX5niWiOV2l+fkb?6K7NiFQ;}mE;V7UQHubCK{Gugd)7+X&gA(7+7{R7IJv>a<*60ao zAC746eCCDCEPYo`tW;Pt->Q?TJena=f4n|!z@$@zK`hqGCNqslm9oB;nIQk5@sUwI zampg+>T{ctC=`R9cB35m$iPKX){Is5;^MNYLFZj>h%nB|*lCGF6>1{+Fn_QA=Ii|B zGQ5h7vfRa>`5fset^0;RKdrlnA&?3y88}}r%Z&~TX1F)cnNU0R`G5$c_|r+zt8$HP zDT}~2{p~e&nP=fOiGFqS+QjQc5=GubFG;6~Lmio<^s@iQ-rImzRb2`H_bbT-0yjW_ zD5z0Tu@MahD)9zQkc3nXCZr^!8qgU`(`Y*g_X1V|NiSe-j<>ZPJGE0g)zWr!#<3;xAr;r1JF+A|IYvaJpbo;c^-1l*=K*Qz4qE` zt-bbIGnf>dG-Mh@NZs5u95nWzbx;))G=3tpY;1=|b{TKt$J+No$u$~#qARDCS5W

oUnfTS|GjPO95}eHv*o5`N0vPy6paj6)ame|8F{5 zhtEL_K9zG2EDTr8(iqrjRAi%%*0f+)^G>FhT`U{t$zF*?jjt_;W_Qt4*=Qifq7qkz=?uNqPkLm2p-P`X zpSwqN20Z}w%~0c@=$L}(vIJQw!C}O({u)`#)N1vqWEJ9+Mq3w#*3KgC@>c?0qhtn~ zdthX!WX6y&e@0z+bX3-i&CCe$3xP@y12yJBO-wS?fhlnaR{VoN(3~rPH$DLH!lUKL zp9}Q9l7aV$;BL6bA9AKsjXsMXK&2J;wp8^6QqXT z@`;ZK$gijkVY!7$w>3@0LwJNSqN~ARAW}PDq0O$*J=x+#8VTAh?*mstNv`V zTclc2F*2OiTfneKb1lV2xlxiH%>@w9e@PQ9Nx6!G{7J%e86&ZzUYy~LBaUIy^P<1d z+6QUI);?56pAoHzx`&?Bh=$VWS|UoyAN?|E!@|?TaHGiUFG74w4`ynup(pAK8H)z~-V(*d@$Zr`vL#`aPO25$h}tfUUU1+d6+b!Yfx4>$F{#(*w(|yxp!s7i*#@Pa3vao1n)v{vwXJoZy#nz(f1!qW#!obHQ#eAOG zhtCic1+_#_bkTKNP;B~|o>WUv#P_erir*0_(YO8={1sWTL}bO8A}dZI&Y*9@5z-N= znr77p(+h1m@g>rb6QAdYy;{qOQVGvmPJB{|RAj(2uzUkCLqRZaZMM!KRL%|n= zk$XnYH{$}O*+XE2PN9HEX$vehB&y5IjBS$td2{ARazQ6wt%($OFo+W zd6*%K9ADqd)|H8v`PH>&34+g($It#^{+x$7m{gdL3a7e23xeW5)qIc-?NUpKhpS2H zSp_C(DNyu2dbi%Ir9gRI(DOC^Hm%LYU0Z8sk9dMLsoF6f#&doY*G_Q$7J<8X1&qL#U{KMi%ejFKsl#aTHe_NJZF&DP(yH9a`Cvb-T1 zNr-tB*-ldu+2Sj!MMP5iUZV(iM&p1b-%YgTyRqcZTGEExa+P5f*Am_`AQkdE)?A=D zC=u@xS+mR4UqDJ)im^@5H`&)kj1l4oqi>0E(^vsoOhU(EiF%b5+b+DK#kdQD{w*3t z8l448)3scexDB4?QZ3D0WXXS)ns&7Hi(+uZwi_((Ym_ZU4U| z(j{7%Vu2Q>?7Ytq=|-bCHpl7@B0g$aPdyb7rsPb4uA)L#;{G|+g5*eJ2xAjkOQsjx z2{AZR5*r`P)R^~G5yYBK&HD^NEW*xg3t~>D^KTQxD$kO{x~b%|B(dpdNMc*aB@_Ka z`L!gme-BbHCW+l9_;rRT_RY6N6qB)i6(Tq9GbFIz=^X#H1m+b9tgB@Diq8wJ;E zwCL3|D>slHoj(J~tIL^tw&bNxVKNfJf?mWT5D|Py3q;k%+8KF=Ar4>lZRR42D}=+( z@`hBDSfEvJxq9FmntY)9xjetPH*iT@&I$JFJQj~t#|_0B{flP>fB#qIp&R5PW7(h( zIZ z)EJIxW3?xLb&_x~+sw;Z?e%|xaPdi1WX27)fKmCf9vKpb;Y7x8E_SZ=8qS1}k%f@) zNleI?wL}Yq8J1*hOA25A%V$Um?QHGpm*e7?o^uDY@wXoWVT=$x`w-~X@ZWF<)cp<{ zzZ?Rsc$bH`sPJ8R6H(#E^h+NCIV~RK|KTA}cMCVo`2QFFzt8`E{txm$g+7kre?nS# zGBXZ?%a>@z5@`W{)?Gyf&IP{B71uO(h;nv;`cTUU|3{}CvlDIoVQ~@@`+rY6IKuh= z?zAK8Jy{Tc<7vl73e1$#j^-X7{+82@Luf_xX-6&EjO5dfKKUT09rNfw?6hMCiU0Ss zL!vH!_G!n9;t=4ko^~97WWc#rN}ryYxbq_+u6rzbWA!WnC&UVIOm zk5UgiGPbd$u=D4t_BfaQW}R-I10_^@*_^<{bbBw#K~33!yX@pVst~2#i{^!)5uc~i z`xDvE*6CH{_2maM)?SRo@(Z=;*e_%v(^prjrQ{9W5Dlbq9FVcbTyk5?TFWjlDV7z5 zt2#=^qeNyrhufA{cHZ1GDz8+F-qb3|)M%QKW~O5Hz`h_Mwyd^}B-(<*6_3rQnmHYh zu3PC-wOG@3JKaZ8kfx9nXtNyVaA96rNxnH|kepiXT!}Kb3a48&p@u0-%IA6q{ zh(174?;Qeg#e=_fhIQ_8)v^c%yS4MSC32M*nIW`A4iqrFXmhYlbQ;Z4={{x4HpUC` zRiT*^dn=E-%XGQBW2##WKC~cNAR6GjkQx@aD%6-cGB8!!@_0C%Zg4INcv`n}(6^&5 z)R^)2fi(G9fh5>|O-C(O9JM&aj~lO9wOu5&jhEU+>)L#+#Tf;E539c-z)+J4oB^{N zfY}wJl3?~_VAk=D>#qatr!b|T0kmgC6PXOO%IY(LrZtZ-EJs0aXdnV1mvKtX2aYf( zk%D=l?jgKja(J_L24?6+)zl69*QE+48Mv{MP&B~|4F4;uIR;YO5qmgxy)D#{E5`-I zpU+>J-ddbF!`Xf`#gpdRF8X`l3m7(eZ4EwVVU2@1r}jm|YiE(E&`D@RHON-aytj*0D zBETbBGUIOmhfDXxD}6Z=7P)7@qDf%UbXvE21}IuG>~>$uITdeIAkdIrf0Qr+>g}IE zEbcmnzFXAW>99mKa=wQ>l{yHMhQcv;%#H=1L}_MpsXmGb41?l3okAwOO-*Og8f6OY zHOld`MQu4V)6q{te1o^OmlLTjq!ab^SSkl<;xb+i9?2!=Yc5{r+pl`ovB?*tg0p*UMxU#oH)^Ky$C@OGwG|$p8 zGTyO6)s$ut5PdZt$y<`(2pI>tGDh2A_GndZ6kIEMqxc( zb~yCJ0vR{(64sF@6%ras#=ZnfSff9b@?n?mYhHVEqgP^75NE`O2tLyxbP~PuJ0_ndW}|4P^>?g%BjOn)(Tkr#9|;rKtG-gM zsf8Gf##lQs`Szm4M8no2QP-jC!)Q$?7y|IeiJ?^scegB7^1Z;1SP8B2Wf<)oMx-*OFca z$CF;V=}}rVx{Ur!a)rfs)4YjA7j7INlH>yN8ixp$b(r)2;sNtAW8nZh<<|V`0^UfW zrzn3GL0r1SBc%qW+juiPPUZnpvvueT3E{Zr@ovtHx+QK^Ynt3FNF&VQ5QjD8 z>hK!cp>%rE=XtHgL!xjca0Z8H&lF^%NE{aYCB->-=K$Avt56>+^rM{H*cnphwWgUT z5arfCEuAV$=U$38%w;Z581vua%%}qetX!6xSJ>)nIz`CGrc;*$r$Z($)GY;kkz1Wj z`IiJe#wl|INqPI%@9;fb9K}RvL@BL%x>9d1p`To1kj4YEn;N5zpqJ+J3Wf!)W&vI* zL(~J*gB!Zv9^Aa7(M8?!dR8#;R)r2K?3pfjP?ip`>9RX?F%YG%bo&<3hFj?Jb2ax1n++?wdV8`~?5 z3%UP<-qDkH$XMyk8_4TDu;;+;126lBd>eiThUA>k@h5dD7DCi$r zenA75C)Ev2fK%9Om3fPx)F6^2T*1@^Ph_opzbO9w0%eat7+ z%R8`q45z7W-vf1O2aFNMu&^^S&jW>#lo3_D7kSjr^$We0SEdbdEol}eB^VUZMXG8* zIZIA61eE_t|0}JK!N!3q<61UdW1T1Ogt0U46TrBK2*vAV^@WC_zV*-XAaUDvhJ$oC z+}O+3+zD3TJOyCZ8$LGZ6L~LVQ-kCAopkuX%f`!gfSLp1<4cDoHV#N5n70|k#_*86 zY#^_b9ldPez;;Au!twaaP6kK#i+kC41DkZvrCx*$cHs{(>NmejUjiem)K_Jr)HOoF z^7h9-eqg6jrt%Kx(1{uPZ@I_%@p3`pHqBTq0SLg)+Uf3)o$e@{R)PgyJcpGQV}T_Y z*=Mo9Cn%E40^__&!dj-+H%W!xIitdn$rUbzkNB(#e|lDh9~4Q2>NhuP1EfFC=s!aPqgSP1C0N@TX`V}ghEX+s0<})=2(=U5(eS)v*l zV$aywb1g_!|L{-dIJP`2S4#g$UO$l6N96SZUZXP~lgESl@lko)#Ur;hL$jp_@#?to z%2qv@j;SxOUkiT?rP~uVr&Osuk{4>O-_tiqRe8}(QV^+Paw#9H)Fk=g;-PKo1jbK)`r>Y`RBD(FIQjl^o}51QbaHdcDSMI+i)kHzKK zRm&)(Y6y9}Y9aa1@QaMpYGcSuFIOAqL0i^&j5O(fZ;fFA(v^ZcJ6j{3HZ~Yh9kBsrgPBb~yk#9Z3oMI$C3eG7% zA0yljLScgJFSF~X8TWaiyuy(RPZf%$1V=zfYrKU$y_58gZEEZ5!k#rLC18c!u%@Zvvz>;l*AvBYLlg5hhXvQDj`(qnun>*N%5= zu%_zqpRq11TE;@zByTn!!0T*BA!~i|Y)2D6lV(fEO(dY#(G}Yg&~3%S7D2t})~JM^4Xmw9Xwr zwe|M#S74sq{1#nsa4QaWuKASiRyn`YuR?yMV^ieUML*@2%U*NRn_8&A@aVd_=4M>s zG_N`*&1IfHWu4?R$JpP}?fj#!K)4{5qa%RpE$WQR(h#~B2AIz z?Irg36UpFYy__%VgK_FfG|4v1E}sk9ZI1#o$txjmW5QS_G*kq!uLBU)##pt2QWn?w z5!(-3rx;FVKua=Nnah1u$UXo3E0K`XDfLAdQi;9UvPGwW^uyFOx&kwu>?_8qDe`uS zh+vzn>fFp-oVuNHwfd3mY{6nrs`@*mx-7ewC?(28rKIm)zXZL31+qV#eLH($yo!9T zxN`>^+YGlJxE^n$I8)aYyUg9DE6Yqk!_(ka53YiK2?Qq#tx&hpDGg5qw^+GbWmRv> zV7E=AwSgtA-r`9%xs^j=5U$bNa56e>yXby;g~RzeboXoQE02;A8gK<` zMGd<_?j%=M*Gp~ng)YoBRDtel7I6su)|KVFXr#hb$HlA;SDn8*_;EG-+ViU^7ug_x z_nqQaiLM8UbKE0VP*e6Wn`&PFEo&*N2T~JsIWd^)gsQvLA$Tw0Hw)9BY-cdR2?!`2 z(d4NY_)^1-LAGHsK=oa^gmBlJ_yk##Swn>2znA|U03Z@r60=J+k)>Q!u_c7IO;MhB z7n;wy)Gb?|H3+DACcuO1q91~B<2Off6A^<|b)^j^R1=Q+G1*RsRjmH$HW7sfFmnlQ z%VoXDg}!Xj=%?`~INEgX(zHok)ojCK6)US@ygCW8)_@F!oZ(s97S~p>ct)1v52{e8 zw)_!oP_(~fOI20n>iuV=bLrt{ zj_^*+IZ^k9qjczY zP;QRZW8dc6ONZ+GKbB;cdti=E2>faMNz99u|Xg-`su9oCN3!06IWT8yPo-^T-v(q@pJPT|E zrRy-3iNjVBxRiG~r=wwbdBjsKE)i5JqP|SzSnpa;IXDJr4+%}6}Y5fLUi1qrbB_0hO`=@kvr>=#0nwM-=!o7 z!PEEu5+l{Z+;N^XyrRO`)!+!->4Ec8VITmNj%!Sy%T>N-k;U2roJbfjx9TF6vTw6z z+2rE%gdmNMC@@~%$#q>^SBPBteGBrdx|m92b+yBoTXtWW@)%*%bev6WT=a| z4r23RKe^7~h~Mf79iJL0L;g{}cu^nAU(6l{H;@||a;-@T4NX~lnRxP&A?k1Vo)yPZ`10t({lq z77Sa(ML(1jd(Fwb-&t^;{r;pmmiMCg`wosMw#(Hiylw?&Hw<5F&eHngUaG}#eqzBQ z?w|Fcr}HjGEe9ki7hZ_(p5DmKdz((_P8kI$ihtqpl|aBF5b*kbz1zJL9aOw+^E+bt zLGLC??`jA7I=#W+Xu3GiDo!_xjK-7b58Gj5YHHApOjTFEFVl7j7}wY7v{Vx3_jS4g zX@4N8$;|izGqBDaCP}XTH;p%&8jm@a_|{(}wHF_k$g3!I!M^sPu(J*Urw(i! zSC=nnwG$g88#hX4oq<-91g%v0^EOr$XEFg-!(4(@15?&ssvb&|97V}9vC2j&cq@?V zn0gidL6E91Of2c*lNzafo6!ik8oX7EUQHM&!v>k&@jY9cRb3Yvn#PDTA1Y9 zd@W}4F-(H}@oj#EbEESBMnkTsjJU#z_lj%TPU`$0`o8rz)Ux3^u2=W281CELmDADF zO3IcD$fbM_-7Rl-0B)Uo1#gj};pASve@kyHRo`{BQlHyWH_XmEFOl~bk%MiSf3*MO(Ge~>KNWGI-gFUfbU%4qnCOw=lGWX?}~ zo41?kkrMf>L&LplOv8D`)~^r~W|ceCel*k`rv^SOX&k|ux{EW1Gbpo2%!qI0-h8_F zTHw;kBHZsujx=(3$$@jOboJpNHg@CV=?n^D&54jMr-?%_(->&T#aF^^J@|#-lZ{3r zK%yBrL(g?Oi$+iSGX3lB0d8Ff|``OtF`=(p9e^mRifZ)Xge4?X)N zi-o;3wEe6s@}cKfl4Y+(aIy&MC)Xk$dIam+vVC?#-%4Z=$}mknn0L2X7~Z?Q&MvOM zNuqgcn}z4S%Wq2lCW&TVTSk_ycllNJx67nXNi-+KkX}=uX@W9(E5lkYIL$_VuZ8+6 zhk^1M-|^F6J-9<1MK~JH zkO%IkaL^kL9%bJir>@dH8czZB6zY0thUw?ZFrJaBo^S@dDvJaC8dJ$pj0(Zn=u?;~ zh2k02ak3o}7>f={eS_*du|kRlkE*Xq{8fJ~2^w+SSw)ara2 z6c((WaQZfE;A53~{}%ZGCS`{Ph5{3fy&b1h(OtfK!`*M@x+i^K6qj3CFxD_f>mTFQ zM2@EWuW$s>2u8)7%}`+Y-FtG~>AFN;(KIK_%D3Q~ZP+>JQNvKAthb_GjC0gmFxfD+ zJylHhUzwe~_a$a$2MmQhJD9g@*w5r#oM_-D0#(sNh8n!i`-Ux0Hw$cmn~STqVPem8 z*f4G=v^j0mG13JM&!Ym*3up{@GVPhF`&hi|#ng;KvQAjlXy7kRH#h=En{ePYQvEcZ z$$TS%qeoT1q}POCx%jw2e`Liw%#P4qN43L?sNh)!hAstQ3fLhCc{FC{Vk6}1tM!lt z+cBj&rsheV@~{Iei;q8D4|C)K5g9sye6WUE=EX+P8m!n&?PFB)s85?!T_YP@;7TKy zMb*8s)ZmxLdAuh04lAFs%mUfF0h0a_GPalc%GV> z=-O|mN!M&0wNXYBV#G0m>4%R$;qP5}X$arjqpK}z!IDi(YgrakO{TVZrd7X;;L%Pj zv$O`1+e`ShgAIi^5}Htr&pQW2GAYIKtRYjghRM1io8yOBlSe2SnbK>f7d27 z&wprTik6dfEuqGf5DYP2!awOi&Q^+vOtE##2D4-4vm@vaFoF=4BP?x^Kwzv085@9Z~NJZ0B#j32z1fP!Amw0w<2|wmcN#F8J(ww#@su7>Xe|mxhjd>;;Tj2xto_ zQ9pPRUKLxA27uvJ5)F$@laJptn6t!554od>Kd38Fi1aEkW4!Ku0)&=d)DZuf02##hts$sGwJklLO* zXEJlrTV@hloPFBEFz%vTCT1 zB`s%Ujp@b>zV(j+RTjOF-ot_VYHWSfJ`LzhQSEaov?kF8*bD033d3W!lY^z(%Dm3z_At3w3xSBM`S+oVx`7 zs9NLYaX4c80O~Y9)`LgV#W0 z^~Zwy4JNtMl(o15A|<#N%~`!ikT0)scx&Z@e*xp zK`=DeOP|E(G_PG-A@GNwdJ>1rHC(g~Tb;gt_e?QA1gY`tO*&P#rs_{!PTwZalof>W z#iVob4r@)+_DrEkjUiR)c0>~j`g513DLkQJxTbEDAJ5YQ z_&7F!k3|~Gb2>UBMMKh_e)=^2BGVB77di=?6l)sOz=JH z8GW5ASPDtHZVp6X<&3_qZd}}ZMqeti31$!SXVq&4+Iv^>A`hw5YHW&}szmBHe>&C9ieePV)j zJ45*J$^pTywsHplV!TSe;GLnjbyO`}^XqKnxK;?4gbc~Jjj(}sn7Q$>N_^`dp;JU@x>6Y`V2zgWJLr%&g`= z3w`Hl6i+nBlZV?h5)q8>6V%J;y&VOGRvCnEgLveK^*RPC`TajxKg-WtKNVsvoq<|@ zo5kJZ#+<%^@KEPMPFj=o^XKNB9nbqbyxN(0A@XO`J35~CyJzJUj!_)Tr-w7brQ+`1 z6&|fk;j@JgzoCc~`KR+)138UO zcJdj$IKmH?9p%^r$tE*gdkns3mJo^W&@YaPut{y~4Gnl!pcKcu=y5Z}*c}cYM{!w+ z^UE*602qguE1XFND&evHU4e}J+KlDXE3x3e8zWSi$HRePk@UQ#``F4aL?6z(n@XuX zr_+7Hs67@g&M+S}ihE7ij>x^Zq*gh>qhXAh%>tegiC~w*!_BMn`ZyhF52Q7%Njc#N zT;T4dGTjkcQCw+8r0qJz%b6K zYM2UFeb*YsX_-KdA@qn;q3UD##^fEYw9`bNiqlVz@kU->mD>3cYi%(N-;Qz35{^we z<)}up(xYa}n8ot*=aNZS#j5HTGX^A%NdqUo>|oVOPLTET4vdSYOyygsD=XBU6&lJ~ zewaJ7X-f9yYY?D2iSHrbp-0(wcV$&a+6JhdhG)r$N9v*%V{*R;O z-jn=!BsFd7KayAoTD;2E`w2O7Lr?kg5sfp z>fp?VwEE}dj9+c%oZLd9i%EM*r~NLTHnOTJUIYFi`&iz~vR8V0>rTmZxw#B(%cU5%_#`yS!j18I=B^oFSFwBBIdmeh7?>byxNCC<57 zT#59f%p1SRc~SC3&M}FLoM~;~4_X3I%OUHn-pISbAPN;pV|G;vk0dj7A4MX*X`jD+`IiuqdzWsKPhrhI$WuKg3=Var>}cC0BFUHO7fQ22n0)VFkN=~U zS4C#5jNJa)3}ZyNG(B`bhOxWqolJ*uqgUm#KW&kzk(Zl!F`r)g9U*n#aTX)#q*_mZ zkr)L!^c3O+nx>hGyzT0Nnkd?h`mE@(^yspT=(0?8y@pYGt49dK)s=Cs6kC-oq^Y-WUF1yKad zD0a+#=ju6*z(q@qk-{SiH`=s~2Y-=wc?#}LS8_iC0~bwClk!hW%3qjqPG%iNOI?6M zv|L@t__;OFH2V(Ljw4vmogyK&Bv@5<$|9ax-j=5?^VIZbHoBisNEb)H)bOcVNoi<( zSBjLzFRmr{p200uiZU8amO3I+dWf5e!BJIe4x2;`7Vn!$#FC#Yirs`(%75gcV`#P3 z%XwiDr^+PF?&W#;JI$Xc^s(&ay!keFLKqytP=sy(9mOE-MOrq}aT734d zofKZn&6dd8bi(uW%%LgG_p%8I^=c0UHJahc6MfXl2Q}=&i#?%6<+3UXwl_7tPnq`v z7q^x=vCugm7obG6H&dH#8Fikg$iH)CAEpg*>GRD<$@yD`=t`5d#WEKX(@&gX|xTG(84jxCKR9 z#`eI>)*?|0hV_P3+A)9yZ`19uYo-K0v_pba4iVe|C?S`G7$Gsh@ z2t_^1+bS7ocZrt{IMl6r5Xfltp& zUM9)oLIZ}~6XlhJW6dFg&p5QU+`-Ed8PKmnI_vu2Xa=jWCBad@tBgZzX z8pL9qsa22=1XidB(wFh2QfP$UXDcB<_1Qo{-6L!|N6S&U@pBcN{1(I!hq1Es#LtZZ zjKfZbE_bMzSWgI#>pu~^Kz)Y`ht>g-aiUtKNQbrCd71Pk&Uu3=>LyI^MeZpqWqesT z2gmW!yt-5ma#(a(soFD!Qr%(@gB2zpSrw(F{Pr~o3|+y0?Mo4mI)ndWI~CwgX$l7T z)}2xe)UXhj3!-wT6wC1MF%oIoxBhO%&6$Sb*d)>BdTy6jacrq)yF%Ot&?z?S@`~t8 zp<-$};RKCTtxK=aA5&!J<+G4GHAX&j5oKGpMDN4Wj{yPXxeoAxuokg0eUClZDl3G0V3Id}=f;us_MSRNmQedA}q`Vq#| z7T%kWXQ#!sQwiIrZ$4Ewuk{G6^Q{+0Ns$d|KnyzxzhILz-}-(aoOk#|L1d$|WqryZ z2vO+oUVgH5!~0~8MC5PR21(8q0l2~`6lA2od&S5uD|dDw<^~@?H+0yx*DI+$vSCmf zs^*t+kp4<_a0Yrv>l4-o)$woD(Pw3`RjMmj3C$~{2)HCU6M5<#bePK;ev)@MvQfT# zC1)?eK)!#J+B78G9oQH15^B$OZx!XraNR(pD4WPb`iqrKe;XMoInUkE+o;)$>DUMy(x1^Dv#ozbNXCbqmucc?D% z#T_7wm#h{a`}@LEbMZ_d@iOIR?e?}dFq5#EJFLK&{=F0ThyMIVXzL|KmY}gS*k?Jc zhHHok8}$_Vd|^W>MA#6IMAq?5Lc39=nqj6i%bhH`AvYH?U~#pcTW$^aoRalR!Rh+j z<&PF4-RgIcv6x)N!E}-sDYBr*kanF%Zq;?dV4Yj*JyM~rT1%K7wU}D}x`b)hy78~n z8jxCb)mr#WQQp5=s|cU5@&A=t*GR3pYAu(hs{iGQ_x1DTQoG`V^DQ96qIo1uO8w8I z;z#9=7FowA@su0`?SCz@+ARd_7HmgHXIx$UnXZs+>hfrCstCYSJ~LirTqMpuE8b;7 zl?iv|Nr1~~w>jn9sZ}?{+8l$lCv7GqZtZjC?)!zzT4=YW>~o=`EA1*W9P0Ufu}w4?2=&_q!rSD}pr|A!sgEF4F))wT7~F6=4uX`nOXdEf)xY!X z%0CN*cS()9?w^T%ub0*}!XFncN}3YG#Tcv#tC@yz`u_7PhJ>`fs{TRA zuL~XjC-M*15#Q|mc;4tXMeRFrA>d z|4wNw9+*Pd4Xc+IB=_&x%ti~d|MWyY%+ zu`kcb7yWsSe92Ph$G+&ru0NlYrFotbJ8EeMHnRFf*@=_1uuD(ly@ha0(UgZUqO(-6 z%|qp&l-9xyr<&f(e8^oGj%^51%HQ? zTfH<*@;+|o2#hROO~NCMlmsGR004vrOO0p@#Iv1Wu6|86i58^#+-!`T_^rZ7Y&Y1WP6m9D)V5y zxR5D7mG^uOq|F`e{-i3O#@TkOEE$)5@Uq0fs zXkZa0gK|wsOP97AA_+Yl*J?=3$1@CX^C{_3V0eWRTO?9zqRR@@3F|q!ELVx|4w9qG zW~kR=kF(VN*yB{y9ecb|$z4>Pw^02i_BdDl!hU@E4j$Aa{NZ>r(c={QI-vWSLgjIdSvWKPDndiZEqbM0wy7D6&4dE>0JDS7i98;|w|F zLNdqYly69W5p~+7p67+>(e>OAuLqY~1YW{9p5a6U`V&%5P0a6}(sIvk3dQTYFjn7D zsqgFY`aXcvp3$$;Qg&xsh2lhoa>`PnRHzm3DQ7kywZt2EUMi9fJNDB+dc1*e#~Q#_ zoD7}5UU6<;FG;Ryxm8tqeYRB90Sg7!QzD6Zhg)jj#b05iYUPTdTyXNKDqyaLfk(e} z@-YTcbUBXJPPLQ5ovpR+Qo$r$E89(8pRrMlvsoJ)cBWHN=oj*i2q`B-A~i36Juc~m zj+aJ?+t?+xu?^sv_C2%$KcI5-VaGQd_N~X{2MhMR$c;F@MSsxd$VNxnyT)bUHRdl^ z#XtTCRJF$6yOtDGu#hU&=AhvXor(tLhE5FyZfO1TMV`K`&cGM@w&I^2y|uU$GqvGkLKpTeV%*v-!XY`d z9VvSeXIIicPOjSN<0RA?;l)|vBthycG_ME^xPw!8^qLn+LU&0Pd`k53KZ?(ycFwdt zZQX@(i7q-X6ve=$nkPA6h>lxLt((NPQFPoId3=h;xT;$SZ#Zh>us~DJB(X#MJaCGp+0p7MqaXie3}{q>=|tD-4Rv|78yfi| zUX!mRq}XMluEEe+Y-7jj5_p75l&J~5?~RmraQ5)}HSHJ*38T711q$g>>{LIg3(#>~ zaCie3VsR$1G^MINHvfK5sv_EC@R%^=PdkMzztXP9HkDJ~0?o0p={)1^Z3;&dRSnJ; zCU_j}RUGf4Ih387alePU|C%33v|c>+<1G}W(mO3N&g7UIxEVHI$gi^DaZOwX3U=kC}h#io&lx3aT($kx>&l*je z9u123LZP!Y%)i`LfK_?zBrwpMmEA8nPM#^*4`5&uzp5ZK7Ik?Y1?3(P1>2;cweSR7 z&rxDiyZqTEf41|-hMssrCB`z_=eeFx?*rvz@u)vj8;2>K4O8pykRDz;5yZah2>*9E ze&cK@dmFB(!F!wk#JVheQHh)(D-%u zLI0&*Mjm6pyk7187^rXo;|OS=-ST~tkI`!}CE-^arHoN0e-l&9tL0#nc_^~lD^57y z4mTbO-L==jnbio4BQ~92^sQxYhwl2LqpSGO`re9hgIqZ`M#}sO6t(zuU=O*%jeiuU zQxCVd6#rSmBgjTVAMokv+aUZ?Pn19Y6Vme$a?RUAq_*NCMk&rV_lEB9@F{q`Is{U% z9~AFWyLsw%JSbCAe1vb8+&ywq##~3b+k1CPwtm3EdplkNFO|Cwc*Zh&H5rKc?n}6G zHp&i#V+Yy_xq>5rKRbd;sq-pzD?`LetTKsenUk3VX2NLvV^ibX4m<_8)ze~OgNaOn zww*B$*v=zH*U!XSD4e}cJ(7}Aa_#5*QE-6D}NqCdoW5*E&<>@#6-gR zJIemlBxQe_U|DTvn_wJ27P_?w62_#vky!!>_z?GYV%Ykyx5_W~AYb9qt3&)MYMa9* z!L^&`TC2h0x^{d>XUxHB@Yfd0EbOydYcCNbKRIr*D;FsN0dQEAIxcmY zS5+xQ0qy@!`yRbe-(VYo=6_6;%H?WBxvHq=yYNwOCOnQ}$Wc`txi=lRYFnqc3tYjH zzOC(nA|oGuGiM;|6#Ur`U7K5tk==Xfp140VcD~+n`~$3mj77b}QbSxW9BriHI*!&- z8$MmsdvU7RY1k7%6Gn%wdstsbd%!cay|%NXXGGIm&eoVMCV;0~=zu6viX&3%%3yDW zWljm4(wN4m!+ayIUFSU9_5!ZsoeE(&s=4)Jz^(zVT|sbQ*#V`9DMu|)<-0&gwD|x! zh;xRM_6fsdf&?XVKupbc%YAkW0U*dLJw_^Q>_V1;w(FdZ$7(s99%-FTrSDS=8b^8L z5r31~;x3I7EP9*D6cC^^#-(aL{W4mKv(e&T6*l_H`gZBSOGU8`%=;jYfx=2XF3z7L zlQv=&6Au27#dWLror|3h5nepjV1AS#3lHvjF69KCMMw#8tiBpWx1@7fHmagZyZ;Tdhj={|bH-P>~wkG|7s%=N+{!(Yf< zPi%@LI=NGM?alY86x#sAMRCWKgFm2M=8pDH4 zlmJ8Q44J9WPCRcbEB!sTjG9Uzvqo<@+#hk$owHS{Aa z=+fZ2&EFeLd+`WOm>HESAc>@W?Zu;{L{kp&7kdT6X}KI*(Dp4r+&j!^q*2|pdb#wc zzDbSvrA$*d(G47DN=suR^D}Wo7@qG5k3vj3Jb15^LOhTk^Dn6K;z3np zIR>s2Ubz~h5+kic4P!x_SEXu2h;3U3PW4`l)pwZ4(O9COma;KLMjIMBx++)HU?paz zTKTlr>SR}`&OVC56OAJ-ZA^qX3J6Jh)f}nD{G05a=?o!32j!&2KH$)1pJ*%XcFT)`4iP%hAdGjIF23{PolS#t9O%@%bGsfyxJ>A%=qv+ z25_;Jg#~{F698LN?+gDso$1-cpHSNq{FQ3Omtr8*_iP%LB6)o!Iwq>@3#62*MHSZc z2Id%87p(O-*IwaY>{)YpUVDDA7sX{cEy($B!!TmHs}P7T`L<;-O(V#-Jhy2b&J(|2 ztn`?9u`+pmQi|S|U|5BP0mfmJvkHw;uRkF`L$~Az?T(&fIMTJ)%m`g7gL8x~Rr13I zkg)X@=q6o-Mc*ZoO&q{-nN7a3({`}A4u-Y&aYa1S^cl{Mf+;(hmGjLX4-NH z@OUY1@~f&t11Y`-H!~QJqp!mmxLA}dA4W2Z{2v8IacLl5MEVYwe`oMy&hDNDLDqdC ziSB@hvi{d5;s%=n``+_!UEwnJvV0;16*wvG52VLS?vaxFPWgBGHi#oFvPTN$U^;=WYE|5K7R~7zk)=G)>QTKp= z-rpS<`_jh&XB_e!+5SBm@&sW@#UL$^QiKECzMS0xZsBwQ_nPI2=93}#Uo;b#tn&pDAnVAWaRJ%cjhpAk0Oj6_ci!Pi9ov}%AtCs9$G4Q)6ToN7{Hs~C z(!n$}0fsf9*NJ5oGs?iZnVVig-w;;R8_wa#ni``W#E*Y2*sI`yYMdPH$F1D zoALkPbByQ;x(m%K+Z-Ge`uD9HyT;=`wPGY_FpQlrg}@zV#^k*tb_P5RF7rf#+x#Gj zp(XsR+{s0L8?U;!HE+?OVpt^tT#RPfh#!HK$Fv`TH$shBj+KXuAcAQTg3M5HU{q+R zBrvRtTi&6ec|i{kPNR5A=qLiIC>p)N{7Q8VST8%+Re3w|Z}zN9U*pLiu_Cprc))48 zTgo_ll8eP`BdDQYlbPO@+4BQgS5i*~_0VrOIz88-(9oUhrXp6pUxZlszQ;tf<(b>`EpAvW!8k0!Pkx;x$7Q9drHP^US&V)I!759?cx z1PSHS_hXgscuWF@?+`S@@$XtW$VaskY9E$goW5#;s(3uMP3$!V>2&C}PWHel!gD_;VK$h={lrU+vPmd!qrRWCms3OjG;|PdY<+|HCliMRWQ5f*iYFN-LbIj?Q@h;L zA}gGsn3+%|&P_NV7&6TI^Q96UC?arJocX4|C0D$AF)y3Ap z2wWXp8JX{zRh$`cccm5^3nv+KkehM?R~rjF7=qrH+W%TtiE~=R(k1?bYq<9Q!~UqF z#MLl7`PJ>H!gM&x70hhP&kgz-+=3z%YSL{Qcs3JK+-v*K!SwkABZ@)trS}q$Ob6X2 z!Cw;7!R0T`TFyqE1q`^Lf3lp(t&VD^$3wS)tvi^Pto*VJp)(mktns9PEN44F>;s57 z+og;w|BAdF*2fO}lY5W5qgDvbC{Db{1J(iqi1dW17ny`t-aX6Az1Tf zoeCbGMR;|iangq9eJ*1_EEDnFu$|H^sp=KjgUGxQ`NbKlGS!!VB9l*G8+D)u9^pln z7*lQB>>;lCSSa14LilFOpCB_X&6Yzb?4=Ih(<6J?fL!q7#!OeLqem8L!(CPCPj^Cd zgy@WEEz55D(AoZ0N>fL9i?^%Ljm33O71`hxwyzrrt=zjJtt)j}39YskXGf}>GteRR z$^l+WakTj@#D#U76?7a;3ALw%7b1Qh%WEIefoHJbg)OPZjUHpfrJ4wDCmwfMuQ`gs zLqdT-mFamqBFmiwzJR=XT06{wiHsl)nwqU~P5G`YP zq1+Dyg=-A=`;T5qCz{H~t=*$q5O19hPRFSjsCqOIPhQ*{#ezJ$f) z$SpPB_ZJ@tj3#bfFqM0gO&$3|9W7qdJyb|Q#kFIr=@!dqi$ww5{j`MsOcV|&;sxhq zYjN~9Gb99HIe>ICICT}R8QVGMLdZ;f2RMxyHgHm}!0! z$L;>p$PT@0E?JinI<<89#LDu9rR3dX<@Mx}Tk@vOi|4#Rat>cUo}9zU`EzpKCi$#P z1n_I|wajxG15J&8bS%D2SnusI*1LO&P;h%?i21viO#~;YT}we;HUKsc;wRqZ`BD?x zYar9VJ1A@QI!)a=>bgC%avi)GZvykQX^|yPV-BMDx^Y<9LiwuIa-47EwRgF5S*eBY zLmT?m&X0Yn<`bY4qL`q2?iguWOiAP^X-HiDmH}l&8c#xoFrSA;u=taR(Y@8l#E47G$;3#AgC<=A?rs*j(4h(; z>|N#RK8{FZ^e5F}j%T;F=nu_hRH-Lf{Sde_C{Kn4E&*7v(Teq^_srhBO|3vBZwG=J z#Y2s~fV!iUqe%9F$c*zKO%fa{Bd3G8s;CBoKU|pThudK?vXiA;LRgdI?`|Y0`C#L4 zdv|Op!5IiNvX@vG(#J}bV)fCcosw?RPV4KN*otV{nGi48Dii#H&}L&^I-btZBM6V= zwbZ6HJtmZbp{h$@(f%OLy0o$`w^|9$#`92M3byz>b9mb^l&VgXzXs(_jn?iwBge7s z4%20HwiaGd;PS2iHs1?~B(ag-YAaTXXnwA$R_(eZ6<$)Uw7g?gDDE1JNxCAbR_b-X z+I0U^M`H=ylxa#qKS%ubZtXaSO(b}k1gY&^d!Fxwxie34r)J7CLZqb`#I0cOns>#w zjX9=GoDE>?C!>`k!I~Owq*=$4f0_(J#}*R|d#KPmbRTAy_`$(3ym}UqUVFt_m@ZWr z!%;VcTrPX@kwPbkfA@$;|1jkaRm;_1CY=n0q9W0U9iZS2Xa30JgIG;H+|pM0yl%YAP@U0XU$=}`JT5RlYlk5+8&#vU8RY|c`2|1Ih8K$dQ zLN%QE%SjjEZ!zJQKb{5;jJ+m=nZ%ObO1pK zSM{D$Uy|-mnTt+SERU`~3T_%D8UB<~JLO6%CDWgBi=A@5m6GL8DYsL+R>~xQ%9rhw zzBhF}+5VJ8cFHj;Wr{!Lb~|Oil`_kpvdm6tw^9oHDFHj>S5``)KV`L@@~D+E*PpV+ zPHDALO8qHKcFJliT&M&W@iP5*hdfT?F|=)J z44C*nsO)&lB``(T9`Q`aql>>wM<05XJMv#t=IhvwL{@rgh&a@%uZ~%U9_qKq{6^_5 z#D)<<-j3b>xF|8#dk-V`ZXmiwZK)3SYPdeRvygjtINLz zyOXUhxgmD~4dLFL*YG$twl1vi1d7xkUykG2VW(BoT~gB}=I`{lQLTv2hw&M(-P%d$ep3znr7YrLI1kw}yPDlB6J0huLB#VC*yF&z3JM!AGmB$V zk(}2HB4#=wH+jPg2mJdakXm5oY=;N`L}S&=uR@ z+%>kJlem)L;eF+}*;mQW zg4xsg3EVt8Pk!by3FZ~EA9;o6Nwc3siMsMXXa81yzA#%15CfBE>w^W{7p8~a!W|y+ zrY-7KaBehJTQ%qHFyFDK*4rB`OgBo`fO+oTsMBa!&)DKGP0240CSIzzyIMMRar1ox zt2qthV&-U&kn*n3eK=nnZd8b$ME%~8AzmV2jmOZojOeo(!0jZ}G^8$y z{L5oJ!Hq}OPHkRi&C&&OUKhxe=6vPqr&2|p`Vl{L2Bu;iGdJFtH%Ojz$-`P*D<9=s zrzg}c27*)=e7Z{2NxEQj9EbJU)cEF8a#==H;f37jY<`+96k>`&L+k7nZyjRAGr~5; zGM1j1(I(Z|1Ui-~vy6>W8+3?!?Q*-aO1*VZdJa+JFxqi|)7yW#1W0fgt)AG+Mz;DE zLx*49pzWFoC~+-Rel~7MKG{P#Ii-%y6qEOAl}E*ZAlb+9FlnnVFy2fT%O;O{L(0hI z;MKIzss8e4Op`=6@mz+FLkpQ_8ndv(#2Ve4Rz-ZRM+Pazj_^UX8vZGrTbJ&r3I4e` zsx7u(t5z#XtTAzn7FTT6_Rz9*hf6r~<5Q~`a;CaB65Bm`8FkMez+y00qTYqGj88B; zco|!yaM_V??NO%hPIkaL__r_IP(gHwA@!*~`ZY#T)p$AWudJ+4qeV;93*rz&z#JP{ zcnBX8>enQqgcJoQ9`bw}w3-j{-sK5%W|2zypBs%(mLvF!tR2khHu?=TpaUJJU3g!d zBf(X7qZXOi*Z<1oUi5n1u-ACn0&99>krB&!5u69yucD@%Lo@zYg0G`rp|ZTg;$drW zf%@78A;|QC=^D$)BK7xd5STO`>XD_0*hmCr!ZsV*(Zz~KgOj2^xy^Vb=b&gDaH=Ur z9&>c7t~pxWy0DjbWJWPSXGh8DaKq78s64+6S2ni*oiZqlBdK)8;&J2FiDx=kd?ff3 zGl6&7aISHpQr!&;&XPD{935I%V&cBIDO7K5(SI+evQCBl7ExK;i+m#rqPr9KJcIkDmo>8j=N3!A6 zNP1hu^N5_u6K5FLN9u=ETVr&glD9VH3f5?(A{Lwyo+g6;Lfu9Edtt5o+i`|L%d0A@ z(4n|rmCf*{oUQB2C(*zdHfV{S@)}OFEx@7-8O(Vz;<+96QfE;`SShMbpeRYvTc_bJC9;+WplfApDvyZ)ok2hy8cC1=XhV$fai@~qyY z6+&XHD5m*H_&G{M!!Pldp}G)XGQ;Mx#PWImi{_5YH^MreJxq?P*@~6w8)ie;%V9ku zet#ASCDAI{!~`;3q9$hn6v4FfodvGg*_251X-d>@Q~bRqIIcM=3|#aKr_`UlCg_^B z=}$ZcCJ>6q?2lxFPms%xIVb;W^{GO&EC&YR7PCWDEOeX;I1OEW!OmD;im$_T_O{}) zV`ke35#>Z2(_E@1F4fc9g?7Dp0c3;t{4U(*3m0HQOYcz&+c%u@f>DOdi{BO1fz1SM z>X2nZlUU)*MkaN*|FenNW)F-OIxiVC?ay2)So)fNTB=5kwm>3Oq{P2td9jpDHG&~} z8c=3Xl-=s*rSN*UAYkoH5}3N{AsZRNqeUr-MM|!mnE@ z9LNE8$b)`(QD3ciy{`ZG+i(JkZV*Yl=bI0KnqZgo!w@@IxkH4APu>!^!t?xryjNmx zJD+r-yRgUgq)UFBPkQAi<;mPYO6Dur-KS)}>iHExru~GzY=MyV{0f${zmE#07#(^0 zV{e(|cbnyRo8@<#<@f9IFK6yCV$0$)h)09tzn<7FfotJo=e5N;ojoyWy94zAX}p7H zX}u$*Cnn9e^~6#Fsc2=nY=ayPxMx2+R@cXH`e2KP-m?EUJ#fJ1p$lm^3Z{;-3eWT1 zFN!9O@d{92^79S{F2i$*6UsE3U(iv&?K>PCMSkJ$XJoz{m$K}ihIi!+UweZiq&7QR zT=JWO#}F^T4evBtadH&6IeGjpj+qbg+B3TeK-2hh;E#KFTCBpYVgIrF`WZsM%m_US zy=#xXYXWh<3B>&-5cj7r369Wya|ruo2uzu=CvR`yO5%q~uO*JC+3UT*u?_omuSf7p zOZ0EQ?)lrg=U&FgTY67Ly7&BE(0iVpw$MyjG3Y&fLk9icB!|nv?02)$M9tBGxVASY z_2^k6DV>msBPsomxeM=+AN&YQ>(=xc2Vb<^t>Jw+{mAA0cz%od%>>?~hwF~JhwFYb z;S{VbZg{J>9u|DTUh;OeY>>PKdnGUZkCT_Mrg2#uwiM&#ygHYhaG5U)QV=G=LiH6Y zDP_GX1!}9RViZV9&is!@LHC*0PaDY&J(5=gpB%}npE?qA9RHJHbQHE_?*9cax0#E{ zR&NLc7lG*o#H?{J_9tiPZM(5kwoMv)*7H2ccE1aCV;rq4c;nzXG7w&!CJ@h>RML&5Y6N!xqKR{{xL9P{kXV&v6$JD?r;qqt zPOvoN&B6rGJYK0@*u!bc5`UA~5aMD5ts(3&;=#bfwSZ3J`{r#lkYdARwYp06K}6Wk!0 z09sBUr}mJW4&KYOm5wk{@vPg*0LELry&ia}*AxYb{;Rcc=BaP!$CThr>gU^aJhf}o z>>ZK_jz!=Ey2=&Vx|_wKZrTRzH%2`{K8OiMjpsjmKv*!pnWb#fWd!B>axQbxW)-?cUv}_J&3H(=*341qFA}@Wo)|%?)PxUHrD& zq`bNn;OimR=B&t-JL-oJE?6V3i7_d-hl*66l-PiT^gGg!VDs4O=2(HMQ8s~Szg>O6 zu8o+ns{zYpp;YNhvGHc?owPDFjvZWOw9+T5Lv6)V?9`c5-xfKP(W+W$v^Cl!m)!=Qe?arSKg2yer#yqbmT+=XG&khL?AeG5?^2F`G-r)_%!% zgN7~qP~$ujFp2wp6zJ;M+dXp}bZAa!odc`InW`$JS3xkZu%)0IHU=t5XffI0$zZWa z`18NU9i_EBi7|Ie@68%Q3n&UDiT~sE19LKsB-6~aT(A*k@%60zvelt4(4jY^L+8@8 ztZ$P{Hy5DLIy>C7*_CQ9s0=zpym?$2`U?{0!TwZAe=4Ovm4p4!6+oRusDS%EUD{MP z(4{9xnq3-l3@s#rZ0*$AVl@k`4x^7qQ+0jdLzEzlbMg7nhh;i3xwyF^x+WL>5beS? zI=2&v;BTqzj=n_X;^^wBk)=m?**^EE&6bhTHupqEea-8AO-tXvWO1KS*SEAxeZP%) zA(qnM0ci1FCYMEjER9qe=P@xDVYyTYwNHih{$Yjsf|S#0+r(8Wmc>10WFpak_I55N zwByvabu9H^5@vixI|FD_Gx*%9ox8Cbf^13czU{m=k&V=KqNluWQjr<*J$S9^JC6=u za^VNFYTby#1{OAUC${)6b;(dm@y}!p&5OS%yqa`%oz!fhD8!c?GK<*IwoG+6wGr$m zObI?Ui)mS)5gk!CvND1h7ztw6)o))X3VK{P(3l&d!Hk*(_md&9OiSDq@YF}EEe|GH zH#Yz@J}UMdSTjr+lJ(N~DB|}-=bjJsUAlU-S~F0*=Xbie zr>ug51gWmo;=mz@4|kM*OYm_jLCN|NSx>9Z4tQ#>{#^8aoC|tqBTno+20MidHlb!> zy*TkXPskeNpRfrlQbK*hxWTnl5>%~aDta%o3G4wrg%_M=eCRv6axW|lekRb0R%=%$ zzAoLB30`7$ZK4(+)EH@==RF7*LhsY;2*QT=dROAib0~>51o;cQLGVEqY_#BTKsLOn z#2uW(uDyz;$I%*i&nvQ&p1>uD1au>IwM-hJ0 zAU3IWl)&RqZD~#9u36_7YpkbdRc(7fz|&PF2+$OE-@t zXB+dJp?A(>(sNXd6y`Ze{ZUBQdCsb;-%f%bYY->U-F=D6nCI%TIk9=X)42lL6?ve9 zO3fmqQ~YL>FbrYgUQwn#yC2{{^{5Fu*{$NZB-6Ar5kO4T{FJhac>0QZj=!=}v%%>C z@m*eKT3Eh!3Gn^yz&NBbZ!O#36k^xYzGAIj5}dkk1;3q{15DQSB2loT@2Md(!i zAg=<>6>3JE>fU1Nsdixjziw>9Ig~1F8{iq7^laIy*#`5mM!*&SN$raNgz1WZ-z2#X zF?qP+KhcEoK}#*J_&;d!e+Xksyzh4x?r!pbFpH~`xZtNY?R+0~kJ5#r?LkO1R9w`t zlQP~M05*D>|CDGBbq**t#>b(oafYbK^>wGTjY4NqQAz|%OCTHQH9R9z{*TOGTmySE zJNWAk4&&L``xZJ6Wxa1%Y8R+bI7|hMw;YF;B-J6{1ju24H({1+Vm1ANK03*-N#Df3 zz>(>1R^fW#J$-DvI@NINW20@($SEQda95~d ztEGJwD(Z5=xo0)j>+>&T=xY4>S;>W*LC`X;sZ6q|4G0a|hMC~OOYKBfDrx}1=Nr_e4zafiFe3|(z{L-E zB5PfdwKJB=$toP@7f_oB$IbSy)e9OTczm z1H*u3l(QRKJ&k^O1AdkumTq2zuOE1EP&KyliQsSEDifpYD6u-JaeA>Ca8IHky42Z4 zGX2zq1v#Fgu?5Sf<9P9Xjh>gPW_Sg3SU9ZYDJ4pzr}0;;23*K{8lRA5QS5#)Ex1go zI&)0Gj>6eZ^7O9xbUtu}KnMp?JR=5&l2?26r=+@^rs&vzZ8k_M!5VZmkDL{8p@$y7xNtZ9 z-Wa2`6qi8T7Oz2P>eu!NE| zd|Hk#I1`|zWR4P-W{Vnj_@cTOnLCFz0l8v-ve^6rbLQipexYG(^`2vT$aj=7L=zQ# zQUY`SvrK(AYM@nBPdxF27{o1Gs%_NE_0cS6q#r`Ko0Wj0Db^S?Fsu6w2o~!+Z-FK~ zBlFJVi=}ewh(v4?em(` zXXFOX&iF#$+8HYYm&{lb7^4>5Kd_Y!ynuYPlj&_wvvWI+k0SI#`&=h4Z1LgkY2qn} zM;4f^Y+jo`VY}{loBzD+y2Nkn&FT1IXnc(?p6xB6zOoH9fy$7|^)znbRY+wL$4=P; z*M?MfAU~usM6Jc?2`{I@#^V_CjPS-k(=ei*yuYz`h4`sZE5Qfxwa?qH+Z_)^{pZnv zZGwWUir+(lcxXiKv-ak_@g*U3SD+-MMg)qb{?ABD7mH_uk-C2Ad4-xSHGvp6Q9gcI z)SsZP!;*f+Og|y%pJO5`ziAcf7{67`m?+>*Vq=S=PrOQ?bCPIG1nl$bZ^;dO)R+j4 zoOX*R{5U;r!$*0S7@XERRut!mNId>s5R#5_6qcdjK(O6WrC~ok2JB}B@1Hl#6F66! zx}AzaJ&bR0vJtyrMH9=Y&q3T63qFQf88?h^&%;2w?*BP z;`UjH?3n1r79HzWef6sYb9@So0z`pBbTF&C^wDMVl|}+Gy}4x-tGQZWi{?_Fahtmb zzu=Qpo~}w5G;IF?>?sKNu=&nJw;=c7s`ox=_EO%*56M9e8YDt5DIt>07clLg#9+%E zc+Nzw)OlXxGpJ#|yA12NMl4Yj>asy&hT-*!-@yW>vB~OeJM%?UoHQCX7j^D%i8JG|v1_$0Wh|BUZR)lpF z_7qRa4Yby#R8}rhpFzt%ZztCrp>KaZwC|YDkCmvSuF^&7ry07%`MpQSx185Bs7a*g z3BK#l$A|LWj}3)*3dzBQx>C&HHOaFC+m2+$t?!vB0UyUfvi0V{!l(LDXJ z(Tu50F-LQll?VKABL>VgK~11;A!m0HsD{~;>qoY#uLUP@{kVr;^ZKFJCVDDOqVsCr zLOh{g$XMTiZ)aGfwy->%n*G)@$36w^{D;ZWQ0E05Zdg4=U13!_LRTva?eTRLYTKWI zA%0j1&8$gyvjUi+x(?BQ|8lYy>OGQlEN*dwD%3nG(d*%pft`g&(t({fNCU0vDYLA4 zWU#ss&uL;%4QKGld+8J{D+!$wIIOjbR1XyC+Q3PN3xcL){Q4#eH_Q_%BW<)Ad*OY_ zm7|Y1AAN?&0mJOcUM_h{kZ)+1WUDb&6CbURK?+Q|gw-s;*ZMd* zdv>OH!tawH7Pc*L(70<_cBEWU*%eLYi3-nlVzyw=7r0aYjF7N?a4X7Bb+u3rY$qY! zbJR0beF+*;11+er&vJ4f5ZqmdE{;{mV&s~dKe}vS7q++uySO|1I##Ai;My~#s(+is zPT2PwNvPlP!we7(4$i^^b)9YnR;Eo&*GZubyX5F5zzS|F%GBX9fdEEuUhBFSnd8Yt z{vEl?laH}BQcaWNZ*X@{V6Y^->G_~uPvZ_5Rdsjs9LJSB&&cpJ{ugfqRGMtA?w;3_ zaw|1qn3S*q2Kt+1)>9;dGJy?zrV8sdH5KTZ0$+jw_C-DnR$#Bii0hPQ^j{T~PGL^VQbr7a0V7EX-d<}H3K8{*gNo0mbdF+p@0?JRlByhU)|lI&k0Q4FhMuxBas>=)9Jz_^2560Z={ zcdAT@WK!6$eerJ|e80Y~6Gy!6b&vkwj{i}8hm{;ZWA?B%bs3ECacU&}v_v)+ zk&I01n#WcM_1)(Q-$VjqM`1p}lboQ=-lKQBdV^o9$mbaw)WZ-CI-ES=Rk#Vm(HqU0 zhjIPlGSBn&P~Z5#^`XAu!Hc3*DZbZMjjGL9TvNnxWDlm3#E>Hu#w&-TV=v6t=+YG9 zv~SPKHZ1750VNsP2a+6#`UNAWq%0}u4ZV9_h#~7ZLu>$5j#U;vE+z4JC<$T4f}AQ3 z)Ku;=*))}c6<`3Hern)E)vrsx0>w{aQ3}}^bzW2vy+6@BqH*`ybfdfLhk&r~kY`Km z*7yhsT0P2ldgX{a2!fMVzx5{=EZ72F%_I2i*%nUg+ce&B|=O$*Ym41JWclDLQcSb$mkuW62_AoP(#2%3Jwt)*>zr+P}Yu1>;iVN@dQy!r(m(PrjmzYrTkn)g}%?@j{+0UPO{hasfTk%o`58e%~7y zt)1U(Wa$R#-%4qoGw$mAzh!hpofDcCjJw+M_n{A0?nMH;1E69z@T-8&Wde}>ta)9= z0`OpoV$HJW-1WYUV0!(6X;YZg`sLH6oQpa$MT-y(#M8c`o)Ba%_*slW$9o!)&e)3U z&khe{HjS9eM0CBx3!lGx)s*Hb+H(9<{ogWzDb2r!dk9@9PaKuS4q*WIb$y%6usFn0 z=Om8QNlNY#I?C*_Jlk%F?u8 z+LZ*&gd=qwn=At-2&aRoZD|?tOTm~4j!NME7-Tz@0(!|37#4T%L=|(HT>9>LXcBuS zKEZHn=rqqMn(}0E(B)2PA{BSGrH!9ka9S4bpx_C8SH02)Kz!B&@xaN|?mr4~Vl(ba z=fvqmkb)e=Q=750rl?SWoo)gu|K(ZEU+FwNBSzkuif#{ z8oQve?GZnF6h{=p48^a}Q;6uorA|OHn^S1z4UEvUXf`MLOZt4}OyxegfaY3z^J7yv ztaiL~j@$*OEnK9h6tQ5ZP;uwa458v)xZ6aZkMV0!anAw>q2h!}O;T|}qy1efPK54X zu22`jAOAZv8abfRd;@K$*=DodXAVsvX}h~*0rQ$H@&(@< zVVVF3#NQDrNls|ZF0Wtb<%ITowzrZqq;M^z&4&0B{EAg8WtYKvitikJo{k1*{F%Y$ zf0DEM-;D)c?4plQQDF-qBg8gZD3ViU;w{;vIEI<%9Y-C};1LD}v&!m@|0E#)9I_Mm z-ubnuOY!=Wr7l@IFqK!3gjrmO*&3;;cyeF$%<)bs4h*aJjo19H3F^<)QYJ?x>#ro4 zKhFHPqrk5?_(kfnR6U5U?S(9?3iWulc}0cS7GDfMEA+0`a_E_Ak+${grUIx*>hxnA zR>cdF?!HD1e&$G)!s7*(SZ@=7so6<-3Gma~xPs?Su2?*a__LiVKM+SCsQOLIK!MJ!SY07+~`wo{%i1Vq6C{e@5h+sNVZK zn(lkcIy##djJ{g*&n{}7GyaKHsjG&3 zZZSU>?w+@BVR3CLT@){watjs^Y$j&@j$h9B2yM_1lcU-wo<@M?__{hjDr$>NjBJ1;1CW2o+^edV;oTvq~r z&~-;V4;>Mdc{wf&EO0m7<+vufITkpsc9JhnB%YrDaWK0CeqE+R{oVNP&_$$GWs;0g zp(y=cdI#mwx9S$p^OMTdbMskWHNMv1ln{K)(7BA@nA+h>%G8gN@4Ylcx5WQeUH{6x zgKb`T_HK1&v9b^S@qA*)`hiOn!@I(O-jiHIt;+%Q?Kx3=0@pbXM#6n@p^u-6Y&=8a zsi%Bgi!+U=|D3OT<;iGRazskJ1>I3y4_bZ| z=1c7VtsRa>P5sS28$Syx#TAR8n}R;xG%zHGfU(sCM{*M^ps}>~mI19LV6Old|7C>=ae)>@5 z!wmJ|PaUfBf}v*1P%}PlsNTVOtgvR0{Rd7m=P@f1mS!B-nMR`KG(Kf~|kH15i3p7=<{9y?ZM(JaR}ZPHuMLvzVI0JEXH?7-VYmPd8h>#fux?Bk(IJ*G{kb+1Ac z&Mi}n3953*i{C_$8c5})5w~KGU6YI%P#Pi)Sco$#yXUHL6D>OJ9ybb(!R2Yov& zlU69DRvtI1JAJLICNPQ`jeSpCDOwgSk+D3cb^Q%&ih48`rIoIRj}jaSt7r0?@Y>eg zKoR@})l)4Fw?vB8?(Y*Zg72=dS~(8Tq(sI^1n?TCO*=h241BSlA4LK2^={&e9i2lK z1h)`5-|u$XR8P4a`*MTjxVP4VY3Pm03XJ%Mr-W+A7v?>4IjmCM#z9_%^UL#{t0$|i zy0mbf@GJ_)S-p+k5Ucy$3iX+PCm+e<616yKW3D(2cy|8jj1gRV-s9a|If_oNe6LGnZDp0HIfwyu?XZRF6v{wyU2pM( zWp$Z{W2o=z!MjCX5fiPp!zhGb-|V^_^KML@E|)W&>Bs-6HnnWwPG1#BD;AmVRhV%@ zuV9HBe3{~9l?Aa<#)+>$){UIGNPU8PHKP#Z(LsH&t7&XqjzO_oo4>I%bP&15+o) zoc@#emSgfV!3uJD2&CxCL$6Jv`ikA z9%b^riEgGjc}JLZnY_pNwT3)hChsMl@%HgTf?n1Xjr2VHRbDjPo18b9CmwfVP>`qb zQC`nwHjj5TlM1bM+Jj$UieRpsG!EAkO+^i_B?U$>z6}oHEdZ}=F5_rH^~rLkvfZazTAvHQ&BD%dD)%|meSJmFs2uU~glf}~v4@94_ouT@gm5K`13Md97% z0f5>QkMu#LGX9gkbDoEgPbT64_25EgX}^Vi;#Vj47SqBU z0R6ytqtBcm-$!e1f()6V-b19c8APJ^M*CtRn8Y8W| zY_(EfcR(-NUCBk;u5z8YE0^vFqvF|ye?8oo96(#u6n z^8>gK`v+bP>Sp2?gZ6`twiK4}vY;VFQI~YrmcrUj*cQj1q)m0Lv~_9xI~F4k6spYv zznu-BwL3o3pVUxm4Ny|48Yh#wEC27F?F)wl;}A+c8zt8DS>h=|mCodJ@wHV&@3%`h zAfpcVdcjO#Z`lmAuj=x}%kmT4>o48MjI!8t4yL_<= zJz9J*pH*~%{dRG?Bk9qi`*BK32zWeNIJ8HLR@0*eWEBfu_>PMtUVIjJDfM-lGBK`3 z&4^wsZ;7%k<)l&545|}raJ}YVu(2A#*iB9|{H!ETqn!S}ZqK(x?8dEXAqJf|R!kN? z*K8FI8+_MNoT&50!GV0nw-dh{oAMY%Kb!aN_VnZ^u9Q(|8<)?vr|VI)yTm+*T+;<; za57-+_az(p4h^x$P#Z2S#ZyRdMrmn9C0)r^@9vc@XuJ}{5!dn;Iduzr%G44`7;Vve zPKnZ(+~3tp#M6-LyY^?A6W?B`Zj?;cS&V*lxe#t%Ou;o>mGpXd}`;ZB!LN=Q)8<%S*% zLaR)|g zf}s!2RyhUOP|(n#%`E*4-E+zox#wi$K9%fJN7Ub8whehpYrw%A2B+ia(enS|5neT(6vJD8h5(U ztY79u6&{`68}E&wMecI6N*uG>a1jtvS+^Cf?I&Yh29LgJq}Jo?F@ZFxy#Eee>H!pJ zvQX8Np?iIm?loTDo;7Z2TDH_-nxiS#N=*7`7ZB30D>6d;5Hi!4pO3!+^$5wx{rOtd zMV<<^LB8Feuhz(KiOaWtDa6HX&dB_Hh~m=x&`xJO9fSVNC@!B}zI2p;H(iRQ3ZljrTro)v=XH2X(;7l_iA)(wy^(exPF9;VRs(nqc#QixR7|606-N zdA{1qQdMHlnBMDrGig}hXzrV0U)f_$#I#}T~N~bJhRu(Dv69Cm!t+mqc!W&)6 zR&b`Rl_q%QEibJ-zhWV+SZK|}W5g*zY28|&bMmL)70S5Z&1oN)9$J@wRU(k)3*=w5 z`s(QQs}1+F5!Box^WC9!&pK_vaVvzJH0C_(Qg_mhPKY=-{=9VCLS`I-jHR`(Wx1h| zTf+lR=>w9~g>GY!yJ(>+n5u`?8okX{w(!ND-~=i@VlXX=^^woIBDk%%*ImA_ba7R6 z)e=CLIMAw`Uxzog8>;Wom=UwY1sD?rCdxXwh@Nl_T<|L0pg&mSr{5V$ma z=mDI#;G^S=;D|HPDl7~!1oC`q4R~Hy;OU0*_j71Bxfb-rb=4q9)R7#zA1Ex}x zh*pa}h>-BRacz!4KDbF7n-5cKrNpK2efn+@*j^U>oZV;@M>%aNQ^`EGc@jb^$GmvT zvs0V0i*F0>-tcF#a66;ZW9x6ZVckevNaJK#lt^PNhS`N%CdP+`M)Rw~%##v6X@S`N6;ji!)S=cS$7o84u zPO6$QDLAYx9N-JeVaY7}$Wmp#wF^64AF#E#%fdYyGS@l7$5*A+UcFehrV-UmY?S(i zo`@_Yz+b~#;z~O+7QD&WZ?r;AO5}oA@Crlsr||fSe!Q+jfiH?IcB-GF*2z$Wo$@`H zU0q+{k7(SfKmM2*XL$`b+i0I9>K^Dgqa1fNd30i8GBG@vI5Sdc4zGkuNNfl_u};QS z90}qZ$@RM5_4>vpUKpFdDS!7z!j1gKy0VOzc0V5Kumy(|9(r;AIc~Q2I)1^1Pl6YJ z&y%rD%9$}39DR{(kMlJ8Lq?X4JbiB@x|L@YzZriM3t!L4R|kvbTv8eQ-~cN6J-z}w zQ*$ixQoQiE5teGhJ(2L#^MGt)Yh?5FBtlPoo)gnHJF@92p5zw) z3MWzMiAP{8+SOcu*Gb<^`hPYB#>o^87$;U`JqZAo`I zkjk=@{SeJ6B>LL6U-B)oQ9^cyK3YXI(QQ)kYUgjrbKP!Uc^>{V-4u22Kk^&;XywXb zwJSeomN522qCe3k;rD3m)@{-q<3oHaY?M(%v!3z2yz)!F)2pDDq|r$DX)@rm9L8*_ zacjT4%hUY|{RuxoG74jpWXankoj$A#Jza<2F?2(jt&zs4RD9bVR?AR}E<=wvzR}Rb zF!YcN4H(RTMj88~+oVWg%ju`gZ!hixwAMf~#jjUbCM#YT*{FXD3R`rJ(ukfV^J_FL zlT#Yi(~bE0ryy|nU7;uRloswrg>Y6x=ZQpRZX;1y2;{el-OUrlYRzI@ud^y>`R`4t zK!8b=C8ic~8TqtH6$9PolgvdsLY&<>mg#6l|tJqoySg7NW5tetvWQqOh;#g-&=7ES=<~F%xCAZD9 zhOS>iww+s*Df(OHc1VkCmhDimNf3g$j*WA%_fw7D*t;p(Z^{}(D7fW*XHv1T_i$&V z@dkkbF3(J(heo|C2gcR%|7Tp294((dtmn*OVaE9>gTfK8p4oW?8r|XiBA#lTPLAub zem$=D7}v{#5}TgNZm=5c5lP z#vE4Hk67^%OSbVTNo>O|;}ZLYBg-LR8g zPs^V9W>`KabeXPY19jO=v7e#K80~{ljBFO9L7$~qM7Imhym6M^m2k(#OFuPs)m2)9 z>pCMF@I2k^mqfC=@AHuCuCYxj{zskGGb?JX&kYm}^{w(ebUkDE^p^iZMxSmlx=~>1 z`A*BqwCG0NeN8AtqmssqCM_D343VhpNLbJr#>CJz}5&n^6KV-8v>JnD*L$+d0JE_UnZjl1! z`q}tR-Ua`KtKaoB>1o_b+cY~e*`WCDG#lJmcxa$b>Hg?Lv*I1POe1B?=v(v>dD;&ARvLPL73l3??ln*N$IOCZ?l+)00;Mn%XZqPEk?=Zd zLcUQgGyJ2TWGkid=^uL$4gZ9%gKa)`vu+bTs^-uWQjkMH?-WtR7?QQ?U)l8%mag&N zNSKo?QySr^kTsdyMD5llGIWphR{F^Ifk^B;jnz_8uX$OJA>=EG$V)>v*9n2zLKFxaHq^2XTvJ`}?@%zEcbHE7`%y>Cs}%8>#L1wLJ? zl4#~ZjT+>W&C~c*jb`Lw2$~TBPNNw~45FEV9a}U|NCT*YN3f4%PUzFDD|?^`uur|L zu+8%ILhK_;fzHW?$TsN#OKa;4J^!Ue~UKsfhK4} zI{mx3vCG4hM*0X;MM;n+7R?-Xv)>>#t^h2fH6-Q3vCFbncEZ7_1p^D z@HEDxyxu+q`f_D%B~N&VMjd)Pv1<=Yt|aP6?y>LjQt$B1x)0Kv>~KN6)(+PzL3X$# zjIb0Oy2CNp(aV&@yXp>hw&XGwZu}nD$VtQ`6%XJRYYf@u7zn{Db|nLtNV39QjeB%) zc`_^cc=2QCDu~>E+oLiYz1E`IEc1w@bzN;nVNYRViP5O9P`&SPUYJRGKMyB9XM-mr z`hp(rF?1olBMBL+7boa^)ktHfb!W2%blE=`&^)V0=cCC(UV2}uWQ$8!nha0)Ujb}F z6IjtTb`vkQrC%E{d(Bif^PQf3N7lk}S(AMTt=_nOkpXOl64bjgS|3UFK2W|%yN zH7O2+Ksoc#a7!^_4$b{BnH?PUjr(Lp>9rxqTs)gFtfO+5&?w>s+nyizdf(PVlLcW7 zZEx^R6E!9R#e*wL1~p`5{iBK4&VpiTd~6z?p$o9_^&o0p%L?`v9_rN>i29vVx$8Tc zvTnK)ziL4hIy(%4c373;1K(yDF`gz^phSa<7p=G(o>H8kfjS^zynIEDJiAxq%TMZx zyG)Lg5tTK$P+hx3`XPqk`|Gy_cqM${!0;sdtNtoFWQto$UgQ`;pkn&LzWhNXGS+`u zOy6)Shc#rf$O<7RGnPVR9nvBT1hEFX68m6b{izZyhUgurkM@BE!&3ykFLEL{4}D}0 ze#ThkjD{7`kIK^MXPuF4CrPdle!{|tPkoaULN-%d;USB4jh=q-KoPVKA9O~d14Sw$ znW~B+5N&O}K`|99-0j;F88>0~vfg8bhn7Y%b>9l{rg8?TBlSBWKao0Mn+VLG6?GdZ z&7c~D{GishsIVo|j-K-e|H@vkR)ki22~SHUX9^EF4&Xx_-KEe$WRfRP_6T)3DJZV) z+Tj-py&@xO4@=Lah0^FMXFGI*&8CM|p`N_~fZp;EHtyx<6qg)< zukiBWdpZxln~9UA1EF&%t34uAD>-7!`ElQ2H4I(r9%5=z)E3%_$))l%UBh~aI>!S9 zVstW}QTM+@N_Is*+aGl|L`t6X`TN$S8nZ-Apv73|G=`z@oty+5Oh^Pk80u#+#4b6) zp*(C@lkp^k$Zvk~;A2)vvCkxbKyf zSFB0(`TJL2DnaF1>BUwmchnuA2chy4h_PS7Z5{l<9imR!O%rs+B}yP#F{xyq9Cw@> z6(SU=-i6-4|WdrzN;ytne}IOymz9LCF|KQzu4_V{9}QbXzZ0CX%7fvaC>NUNh8LHUZ9Zbf_~O^sMB8^iM=PyEB-4SG{x@uD9U?W+PWiL6Tz@k>n?z)j_;^IQz#G|S6AG#)IGLHaM1`&t zIg-|Jv}@76rJ|cd^>Sdak5Od`yxJZyVj@VznwJvwAD5uNZf$zTa3+-Q6=j1Rj+M3?Q7 zq_J7xXY4h?0@s7@dwzZ1(TDoe7@N&+OAY~r;Dj!s{)^?$5uMnqA+^_hdtv4=73No~ zgue0(mcT0G!kW#@m8#6F*$C^JkD9|XHcIbI(3tqlcYgIvjt?W7yXmd3chzJgs#gN8 zXLYq3<;g5%LjSPu{F<3or5bvU4}INhCRGlZrXktQjO&jZn*{!5E5>H2GoEI)Z)P@H z3tqEk{ms>rD$9)hR{O8$RyQ28vYGR(I~&ne`rcSs71@Y|1xr|>E8rdV`hwF0JJ}@f zSWnHw?y@&87^`RAn)kS&YcM;NtXaT>!e=;6Ipchn6vwdV26KrN?6i87`I$tyZ625UVd5T3ip#T*QG_txj#!^R>s=ChMnQe?hx1wr-Z0 zhyG+6QCWMDba#?V*Fc6V0n|saNS08vnw}Eo4W%(eaw(moV>ctyj*+w4K%eL5D z&ekr{3)0${-JXz3aCS%6Gzwd!p#IVLghNUck#KpdV}&DEm@8B443lp&s=dWuOrh+G+PZ<;+Jh2-TrPa~kj5p*FkcXU_ap zA0Q(^`Df|wq=hH$S}RJ?4Z~!b6BdOC&ZQ=Nr=o){njFswA`;3Mr=9x~@$nziCKWGP zW9~ww!06Wcq`2|vRyqHSBo-|jL2G)HqQ-L#q%btHD`FQ%;-StnXwg}pQIYvTT`S0} z&Q%e0-clN!i#!)4bd%=BX=#lce@x#_9IT!J0?$z#6N*7QXf`st#QUvuWQ7c-FW|2k$1BF}^5NX7Z z)xG(w4rn!WHJ2)I+@P&x!>O-;d4`-d5@_U?EGChzON^1lT9w1peuXQ_m*0xa8^gQs z)3RtW_X|I#6E32m=!6??hfa8naEnf48R1O@j*qg>_jN*Z+fsF8eE6B~f!w<^AB7$-%MrrTHPNI=Ppy z=#tfpuJ$O3S_H=Gew zASS>Q9j4xcHF+idczmtN?5N?kd+ffx3-kVv@)x`jWu8;GJVU$d_|^G0%&{G>?*F00 zitzsM%}(>p>(ys|$b-a$AC5k93u(&Npub`s&uLi;u60ZbDe7Am#JsHQ#^lGRRvtN#Z`DL zjF0@S4Mshw=-ezE@62^Bi>%K!h`CkcvMr0GCDnsMrjb@faK2tn<5cUUfey~1gInpr zhWO3eS<*Y(<)J9(U7e+VG?;BX*>DX$era`=m%FnpSoA#gniZW&(C0v7vS__F(~$%k zlk5>$gui=_MOf$3wL>0{K+h8jIUT&}+rN60x^}RsUo+JB9WVoumgXM(%&Q+DWcw1U)(IMHm|lq+hI`{bybftFxj~SHP`W77Nb>d|=l> znJ%!g92%2JPUlY^&T10?$7WlOXs^0vm>y>Gh@NC>`X~FLlG`t|AWH5{y%u%xsZDRZptjmQ6?EFSEIDY7n}o8>NI-X4=7@o)mteu<6k65iV-Q}8cLGwT%#roDZ$90A1J5?1w2_YC8x4Av=W8Ds#yw+7E6JO-*w~ULidoW(WPd_aN`J?;$;x-s|R!ygJ`LmA^gy#QfkSy5|a9bU}}k@LJ%S zl4}Hy{#NGJXv>TFVxDlA2R*MFFpV*NTU!(Su1qktfAo6j1ZOcOZPSKlzutHq~>S*=&c+jpk{K~tB zD%#>zp%H{u=j=Qgs>`tjhV}ZhHc)x+573s{lo(c=CZ-4DEmVkYn-Yy4(cb7A;%E=* z5lb+lF^xc6s5)pDSJv71+!LF(z+^sMWQ-Vq|3I(JReYm*j}4hrhV|!W`twoS(EA%? zoWryW8XGfZ@PJ`+zFj|nEOZdxOTaG^XNsX!VAM=;v>WivlweE2Nwq2QG&5ZL z;_B9!SPt0&`7>>x_`pTJoq>x~gq>p@ZRyJyn;dPmsqsS`lNO@HssR zq91K0qa8BVX}Tnbwnya?kD>*!z|H)-fqz%=4-dG-G;=I_pud$?Gf0mKVu@#@xVP4U z#d6BxIOeNbNh(y6#cAtqpX;rsrN-kAIO<1uci4CczZtxkeif$^Vpq%-)OPS68mhss z7uEF#$X5Sb0cZGFV9ZamF}adROIeLAYtyNV_qLwa;=rheJF-YR8}48y+HIjb+)k?G zpbt2P-QgvfOETTel+x3h8yIG$U2%6$t2g<@tIsYWbgT=b`qn>j8P$iBc1o<>N^18! zgKpfLQGtGPz7E`3*x2$wAAws^#7kC%dQhWb<2C%r@ABsD6@!?uYRfp((WZsyZ14_t z$`VZjYNsk7@P08lRnA|@$`&cgxSCL1|M;M{4By)2*dy{*l)uO5?p3JqG%(;{^BFat zsv)SKGW*NoG@ZSbadV!6S8?r{ziE=?vx#q4%yXN5oGIymAGJq2HrG7yGnuCpTcCg^epunqQGs-xu*R6! zmTr${XLiST{MIhO(Won!-jX+7ptRIH7srT4~-FY9#JbZ@x2JK^a+~)|E zHk^I`#T{7I$`}_DfpO+}*pnRWzZo;IPkv64)4vLYJTq~guM^5}5iCuJcZY!vy($11 zV|De0pRQ!KsRXr#Bq$+D=YWBDZnbz`}qP&{LLQ+rh*MKsYyVU>}VDkI=vUii*|5v-9gOk;~`Oqh-c|=#U zTvroM)fc}cU93^F*COC@%??^9^MX(5=2`%)X0LcsPNut`)Rc25A-+{}s5+EuQ+9qW z?_|5F3&~>BFZlJ%G<~aXB5l0P(T-fsG$J{GBSqZIYS&ldIm#YbSE<(i8>7}HB1erk z5D}TdAWm8*xOOIMIx73l=wx&12PEl1+&pV!KyX#f;Yc)-qsD7gl(gg!(#SX*zXr5#BfOs`v>OJMs?p$VR!TaTBxqgj<0?u(0K%V$9~+aM_Kr9p9$0N$YvD!M2^5OU?eyaM z8C(j_3|#ks2&^tH{UAQ1m6(EiFY#Vd%7tA{&=UM$!l3Ybn=&Fqt8m6uZ>*lRkNd-n z_=&QL-k7bAr}V;}XItjR3weZfP1w(~mgAAL+VRM&+LUKIaYD)0&P1?K6a#QWQc&x7 zwtFewbedzauC)AH-1SY)aU#rmpY}5LHf3Bg?UJ=l6abgS*(P4~-4}tG7`^Wki^tF@ zXW2sT2d2R+<1Hr-NC_)h6~%yvo8AEc_j)z&%8fWZVj%}pf1AR17pi;7fxX#o%#Nr_ zmvkk{-POrw7;N0Wy!w?_vcU3*&ULn@6?5fhxrwKfQW`~wSE{}a;0H|qFqmX|Qnz~l z4a@(J6)aWHkX4Kat4yQ8wOmaGN`}4w(=jHo7qBnMr+B-40j;%0XF1#L(r&3*B`xV% z+4V3sAt4g&X_9Nu@X+cNrApOvKR=)7Jz6!srRsc(@HF8?WdDIZ{G-R&!{va>P2i_G zr*RfW{{wEv*IjzY;SzMwLd1Y&>hTPXxRP{I@Ou1s!9Pu`%2pFbOV>*Yi&3d|g978( z$uIUHUmoL2a`W9sqe=dSy7MM*CE#Jzi5cUq04=Z@JNNn`Ti~lbDfM{n3Z(X=dxKvv zmJzka*BY1_o$YGAXnJ;VJQhr&nyc*77u$m)#Ftb{3h@C>LKmmP{Ozz)ldzi#deZUw z*OTJH>x19hLmW;X@KE1FBu-LF|9o5a}CI`>GW16gthyGpe9YVu4taa9tXG5B2`)U{R@YO^lI;mz90g2*lStq_= zR$vJRrJiqngM7j{`I@tCJ^BPjRyW9O<4x5^o2nBH8=UpjB_k@95sCG8A2f;Qn_{cvo9FaI zdq^<+hMQ%6J>h@hF|^+6zV9QM*x`1@A$Kj3z#tO$D!%W`g<2CPpQj7-lsQ946H_R!D_g z**isxa{@K$SEP($jNv=g&q$){P!U<2qsDPT(!TuX7=#I&Q0F=)(6Yc zSm1K1m(PjPr6>FrlY$GX*`XFMHTfp3JJuzd-^?gJS&`qu&+_*rLDIk%6C`U$CHwm+ zAQ2}VMa$ftZ*We*sXBstm{a2HBDYc75tvI;d);IRweN!Z|bGK5=0u`KPiyi>;Z z(ACUJ;qiL8rf1aJE7Sx?kgBSBT$=|!Z=_G=>m+mA-x1o7V+*=_=CS8*4b|n^f-@u? z{8C~~PKEMwMUxo~RL3VXFTi#6#A($z!P`tfEV%s(X0f}mL*K$wBZO1my+JRM;N?li z0*(JzA2-pGm((L1!7Fw_&cTf*JR;}L#PXeBmiOaTY;Ckt*x{03Z^O+%V^(HiqpmK0dZW*~<>H%67TG)RTm2q|E zU8$N%ZCs}kH=3NmN_8I&YUBXtp4t*&w1$sKpO07#u7TWzS zv}{w%xJ0@=_9MZifCqxue0iwb4n`y%tbYMxGZ0E32G1Th9nLmR+W zw>NAs5#lHk8X*oNAqWvg!fNs=7 z^-1maVWCK@8*bsATW|V9V~6d&j*e7kht|UI@{3Tccqa&~Tm6RjMfbY`*EZZza_8*M zz!eR*ESk;lCFY*s&T6s0DpmMJ0SA!*&GI+LYQMi`*nm9kfMS=P`vWz%nG#;sL^z?+bV)pC%eLS3 zeN5YqL%a}EMz|6gppR))1f38ABfN=lnQ;|md!ir8sJ$YwJhV17)aG`4Aj7W9YCQBn zE<|Tw!cTKxnz5Z(upXl$DTh62bi_01K+jGW?p1HgmL`5pRRYNW;5RZNI?q+QFn&`{ zx;-#6^guSNOpYk|{xH9ZHCc(TWfPT(z<0t)*pTH6R^SLJuu#e+Zq%a$DW%1Wsl8}f zc2J^GltSn&ps21}{R}`rcUP#zW+m}4WVxCwSM;PiYi&!g)t=2kZxK&Ms|3*0BEvYh zK-Kj<_PaWSCV}8+!N+l z$zlJ<6k$ukX=bj1(MB4|rCc0wEQ&vMA;*Qx9wNJ4ctOealoaHUN~ZV~Kp1si(HfoQ zr1Hqf(4I-9Xeg_InJsusJ@KGOon?b)jg`>MT;>ZeD!8Zd{Oa@hP89x}lj}FwY%}X8 zaqaUQn~`5*IP+^lof~RGeH+ke#63yZUpb7C_`aT%uU5ha*N*NPKx_1_eAv0XS@c5+ z1{P48yQX1A{)Q9;yH_{eG{**WqkBVOsqi@JgR_pEI=1`R2ceny(g{y^1|_4z@4jJ< z?FEsHbrtb!<{TG4@(cJ-vZ&YPa}6ImSt0-H|likN!j-jsk=DK|En_oet zle8#dGLtjj=)w=m#m92;4R?OS2Qtit7}K{wR94Z|M3X;$mG#wpf7E>c8m=ECL$Ao8 zHw3pH`+R=3{M((>O_B+>=G)VFjWBrs=X34}{|zn4xb3uOJqx79Gi6LYv&3%)|N3e? zs}5XW<5}NQ*{Jer}xaf4pM4EW{u|+JmS1g zU9B~qYZ4FUzi^793)w76tZw5-Xs2kpy7=deu*Sa3TtWKi?8zRS-b2erYdkw+X*0!} z*}BOyuY-cx@U-;de){mCXEB`{Xy*0Qr+Ga zi3;0g4<0PsJ-st9?6*utVr5G2F(bBQ>9PR@ucXgZDBFrkwIdFC?m*KkZx0&zj8wSy zZuQ3mw3w~yE>Li7isbt@osaK%dqmU!4Uy0kKxca=aH{lsn&fJ_!9}Q%Z|o;kYhNKk z33czi)J|AML}Fg`FVxvCvDR%}!g*d{s~7!*KcbZfNhhcSY_e|T23Ny5DZ4U#tNb9T zX~oN(TKAa7Q^JkD?fcSjziwEr0pd_3xC>!mrTQL~Rj6Oi*Le$jZ~({&PPp4+f5Or~ z8E|ZaO4p-{uT>*Sgr=niGu0V9qL^Y>)kU(xn5OQb8lw5c7y8;ZY+mQ|y|L=oR0vfJ zx3XzSg@IoK9I`7jZng>DPuw8+6Jx$dBjT+vc(uuz4E3c2FIBUsK~3b3)yYp35Ox!|q_niw z!T&4BS-j%J^HQOR`hF&LxBgW32p}VWIUh)8L?Wzitx$ban92K{oLL!zDx_*Am!W+y zsBEurke~Y(q2Ey?4g@Tk=PR1#srmaf&u5MKIUI#^uw=kKcaj`Qi*O32ZlQD5X&Ap8 zMyTH{0O_%Nk!u!b8_)zqOSdnCp)#a1G1?b?g!+$si~NEgDEvX~cTe3YBPixNgyKkv zs|c+NoRdNQ{FU=-fX)&%q;lNV*p072FX6{&xN#f2k+Ft5!?E8H1AuH(p}8RIG~s%2 z!!%9Ej-3x)gn(Ozhg5=_#NUgNcK9UX8i`(Eb|Qy!?`uOaKKB? zp0WxYP?f32a`f&2<`*Syf~bD+GM=$w*w1-~CAO=r*vSR)1tiU|ScS-O8|e{y+bpLI ztx%c}`Dr~0KLHmMz;`7Z4x-!UI&J1KLZ@=I;ZbF+t7`j8;3GmxoPGkd1C2aUD5`7& zbmCkHFz&}Msj-%53|edP74gqiC%!D*J?XAMy4V60f1hXpXQ0WuaaXH@!OUQln)g^H zpeu{!O?llyv{WmJt45- z$SbQ#oi?k~$<(~|OytBnr9me-W3f(GW?QV&n;Bb{IYfI^;KmJ^AOU-0UE*#YQ=fwe zp{KbX&CP4edxhe$w^MQYEhFM(9+f!EMdMP>$)*TxJua8aJg(O-4? zsbj%TETho!--#RXLQFnR9=oSA7S9g7bBhGMJE-#Zo8{lqu;?&ahqk952iwz+W_y_( z_?94KW?q}4Wm#rN(G3E9lI5QuxBDnt3qx_K3`#9|yhWBpi}@YSVG}2E^!(2`j9r4m7+iohjr{>ZEf*EI%U5 z6}>?0Ri5WNmaUs$4b$w@4|5;JQ~w`(?*SLp z(e@3`!U9X(RZtPzDxj#K*sj5fBzZqY*@7K@G+djU`y3*iB-=4uXmu zte~Q(s7tV5$IAP^PLYiLh4?MV(CQ3Hzh-du4?pf0F}bT6tXzr`6=a2&vrS09hG|Co>FEZ>FBu z#{xLxad#U<(bmQNY!Df5%^PoVn2KL*|5XjX&4dD+z*Aa60i-Y*UQ;RnwR^bDP=NC& zPIj3&SAy&(7KSHN9-t(g`J>EpFqtph&!>+*qnZY#V&H<;q+z(7#ggx`EW88^4|WY5 zhDOdk+lb?|+zM@!-xaPfQ{MHwR*IKGn;zk8G)R4$nqz;I?$o2MsVuM@WjRV^p^89R zs0y$zPzBf*IR!dR6VxqN=LSu(L$mMD5fh4Hgz`JWh@!JX4YLHlA@4`YgaB!iA__W9 zQszfP(dUGkXNO|Ew;$mk~aj|O$=rAzG zM^yx~gxbf+FZF1Fj$Xy+*(684ry`TGmG7wFx>5>(eK1JAgYQY3)hxMqh`dP!GKIx`=adKkD@gvv)850(4B06)Vx|0CSF zkV7iJ<9NhSj?Sh`lKkcalFMfuhEd67AJLi(Pd$^jcnafQ;jPGq+50fGWt`0^l}zqc zKz63{_Ta+8sn$-;?T@Pn|Lf397aX;+5cZ7oJGm(N_?HOZ?8>o51*P-%SuMmG4mpkyH$RtuL3kAsrjsqt`<<_WAx+=kFU#MNkS_W|0AI(E8 z9LvVL1z3U)T?vdze)AD!O^D?814)V%?#mlS6?^oV{AfO7g$ULq~sC?K- zq&~SH^BcI9tB*qT!An<#D>`z>Xbwxbs9TJCEhr#XY}BU$A{4(UFs>t!f7}Hn90l~e zD7|-(>`mtl-5^{|mm8u@9-kQlb3U3qitj};3FY<0OKtv&J57jh`>5!TnUGH%g}whJiV+O zk!71uTg8PmsZfF{;WIGEDS8B%(iO#r0-$*XpMfU+LebM4K|-8`$T2$^KPac@VYvY% zfoD5p%IJQX?mViEG$YWe=rLX#5pT>}CFzYuM%Yxe1bZ zxoGL1R7uM$xKv^!Z=@j^w?hoe!5qcy>nmuv|l-&f~0cL~*K(aFNwpTdf6 z7gdmo_k~4x@PBo@T~XEz%bGZVDGUk`rnTf>beoBSv+_!Af~NfG(3FST)ED@bp_Ac% zR}^C*(P}g@%r6&*%8HFsa21yS-{;n#Q zh8|E^ht63wifr6QzXzhokb85MM8YGKjjsc?V(xq@OaATrH~HE4fQ|gB{BTzCZ7Dk3 z)N6)?DLD#X+~hashvEKT`&HThH)L9LlFzm1o?r|DwsB_M%m0vnZ0<3bF}Fm|ru@?U zQnTEDvP>tZ7JpJaD852F5#9U&lB0V>Rj;FFSM)e1jprHMv5-?-2!D|-M@$mzz^)&{ zGm2H$x6$vbnGyI^Yh^;k39XdfFdBu*&EbyE>b&{-#APx~$V6gxlHRY(AIO7YFMoKLoz%*TjY8qSc@hT$bqRW{ z>&zKyyEks*P%kN}pq`}YLvc|KX5FO8cWAhja%x&A`ZwdENC)E_%v|Eei!s-@b8Z+V zK`HOXLmL=RRZPS4g_sL9EH=nNNXkPqOseA1X)gz3cvH>f>+{UBZ=1s}onzr}-Ps`} z*Ni4Z8DeuVSt!%fA>jgYgsE1;B4>xMbGT_+cg(yt#6+Z0TMGvq=dj46PF+VY8T>kj zlcZzJ#(`#jv0{_cT5j{#Fs(ap@90m8Tado^#-d_dPI1cH23ix{H=K6e$m&drjkcl! zP;;m;)Z*Q!+ z3_9deDy`(-Z-lk-84K_`)_|UBPNb)S#-`|uv_s*N&s+h)6W%2ic&iCbW}L?dAMg?h z1hQfTSQL*eEygW^8^t3Z790CwQIv4uf0cVqmcEgw%f)Km6Ra^(lzjz1?%WIdxUVY1 zeQ+5nYAqj5?y`rFMJ7~{h}JDd5H*Apom@L0MQ5t@IQSIzw$8mo2ag>tv~Fk|2mWDQ4xz zp+x&5nTZhx+<8mjKFhmp$eqo*$<{Kg--65yoDx1a{~zqe43xQUB9_;kU`>#?*!x8> zzM}JfG%f#B#A8NHTwO#TjyOyY5DpDj;TDDNNM2PHUP+9vpy0B$uT^HnG+emlaW4=K z#fz#s>AK;bj}N_`$RNRL=pfzqygcsQ2GN_0jq=cv2Vopom|Z-=fzEehEyl{qRk{Z# zL-CMG$l#DHzKw-*xn7fN4lOPkR9vX*#VM(Tl7@J?Jid$+6rHSApwJyga*V6=u5)0L zw~T+W@jdR=aYkBvuTMdVlpX9rM*jZAMU+{~8OFA2Pfa6t<=s)3MW>ew6f6hkmT+rxuQ)_{gz}a;vd5 zaZOr7SpOj#Jz#zhTRbsv9S1eKJ2ds4sl8<>ZxmYGW~hxXG`(q{HBJf1`dD5QA0jR8 zp-3sYo04Z(JaQ)<*r25Jc;bLz^Jh}_xaXhbtD8!vx?J0EIuNRMQ@C!=F>e5kHJTUEP9Xb8r?B}wEbK4 zgUV6P_p}{06pvQQbd{((zKBh!K)#3p6o|8!@2P|YZ+;5QM>-rJlqdj+{8KA+saU`R ztD9p+)v?&q7UNG_98wDGayl|S6*vf>XP9mscWgP7uEzYijOfrZlv*iP+0@C9ad&J-=440_fTcPac*t_BA(rZ3$|9x2z!1~Z{IkXA z04izUW_<+XX^;YZHkI$B@Q6b$=V=Tp1aWi(+-!0xK9Ai9t8TQlUwLBzrDCi^HwfnW zr`&&CwhH?JGcw)^{%Xmlj{pK@urwZM1A0}rTZbN z-mmr?xHE zraZ-`G%Sw2M*v1gxbZOrdzT(p!RH3>bc#5XqFWcV*wb6dAL;Q<+$}-}d_e*;e!84& zEZL>SaS>a%r!sJy<6D>BA5aP$#G}gViK%qUAxX2q%@J4ZjRVi((+L#^MZ1%OFwuo) zx{S{`y7PmE@k0>$$xcJLJOm1DPLJAULBRfjicGef_n-^a7$ku z#ey(C+~Czwtbd2w)XyT-SUlD`@W&eFu`z7NQiN=Lf&pq|hUJaPUP(&H$CNySITG~V zy!V57PB{j`_^jxA(t^GY)8I;e+Le+w;o|O=+X?ayQu3tS!#Sj@JS7h=1Azp_%a}H8 zCriFvQYB$+Xn&acDe3V_turYIP~Jv6DWXwYkslsPL~H=Ds%*vRLyvfNJ0MBg>sjc;+i(Vynm2cTuk_j+65tmi0C!f*#4xt~K* zlyoQpQF-V>Wh2S0W~AC1ZB*EpQe zY@Gs6vzVux#6oG_Yj~j__FoCD{ilHXHc$MxLQcf z4z)judo1zopqM`+tcDH@&apRb>4zIf(W6vYw1q{2_;$m{oJ`uWI4|!#i5moD7%IFW zSDB~+>||Wx%W08b%I&oI$%uz6SD`deruwwtBTMFMpq1Row`J%J=O@$ckdZm_`{tIt z#9|Z7A;{)?SfuvKYL};56^?*j^hv8laAivIxN+IOMd(sQp@)b{q^N_J5w#joRgN@U zPnX31|Mq`T4WKzv`}q@SSV3XL1d9wEIg$S>wux!}j>WwGE?z(UOZJGi=<5;P#QOCj%8EKg zIU~r4vSOGh^Ep#I*+KX`PTw!;A=VGqcZ+fQvZ8LWtY6AUjMFch7^bi5-*M~PL+&r- zNA)8@w3+1opWa0K|1KYj|F3TUP8urP{~P7|uiF0qW%+;FFaH$(U#Xk_u6_Go(R0aF z%^m=sZ$@p@%o3oj=trK(ZLv(v3_ZNK<8J$4FJ_OhQD8^#3~+Ps1%aC`Q8Ra>9S-af zbbPy9&F%uK6>3Q0t~po@d<5uNrp<08pLgpxHMGsAj=a)olH@YIX%^Hw|I1BMw*!Yybj(QL~AFxLpkNqK8^p z5sGO%VC|tm!lP!AZ}kuFVibWw?a=g1^B0O zd`VB)B;JmLNH3P-@AgNTus^b3m@Pp2W5K`JA8eDF?F7W_OX+{tD~GhmlX(IESdK5) zu};_@Gmu^^$KUObDq(+Q!7wTZZEjyEhqyodHmeyy+`g2)pI$l6zy^zJ|6GnQ>FFSp zqYu)H<@me(aZ{)V+7U_^NBbl83*``xk8WGgE&*}-Qu-hC%CQ(WT>3Z4@g+UegmTzi zuP(>m?T;72{t(MS_St=*9OC}?ZL69Q#O+JzTk4f#1Z-Fd{8PL7k{-EGjvGi{3e*RD zZg{f6sF!)z&$&2m-lGpNfiVsU|HnN1_`X2Dton5&F_6j>N_A4bj$-L}ma{+qZDxP| zJ97q$QuR=QjZ%s%x3aV_H#3!)7#m3q4J2G!(a+%w?r{&}(WWW|M*^K@9FMac$|HS$bnaW3-sFBJ?o9O?XO%XuHv$#=Z>W_uY;nyFB z=up-YK$NFRZ6nbGwgT`R*Qf0TWFP9u*F{W?Pq8@u;I66X$30YLt>>>q+6uk&4G>pL zFP`d8A7c9v`BVE5+7Vwn)xUi0RR4H z1e8Vc=RA=S#AGKAJ`cNZI=1V^Q!{364?EDZa`DI5=TY6Bc5E=Z%gg@16imOrZQ4Mq z0gWQNx11Mlv|`*L&ATl{DUBvI{?@wg*^=Q*VqhpWGB%N!nweWzTFI@vrLn|< z8JL?G8Jf#1n2~|p(#*=x*hFF~H8C}m;E1#`Fg7xiGP%r@8JQSJ&E!@Ra|>gcp{0R^ zu^BU$8A>fpj1XvQVI;vJEHz^$#)hT_GIL9F6Dtdep{Ws*OJ&9eX2xy+}za4&;qUDAMDeaYnZu(hP48E0O7zZOAS>Gx1GkhMh2G~KumQV z5K=vc`KR>ugZ_1TcH5Jw0czt(;Q4Y5+X;|87s18~4Le_>+MZK_JsFS}$07st>=Dzi zwdT_ofC=JOf^!a)LrhQMk-^pF$%hSTf<1~mp6qQc4Qo&vZ3wsySk=+67q->Tej=!;M~4jtCnpXy5i**j?G=&nqZl|Tw2%KR8m!CVN!$DHpCKfrAx%@_3M2D6n7cHyGPbE_%O4kH57q6L@K14UCQD&IvRAAX`vyx3tyl?5 zW2NjG+r>6A9oxn_G8J2eF5@i2i4k&}SQ$IUb})bTjJdNQX2T}2c=nvlVQZN$4#98O z6?TcO!9jTunl7@fI7DaRy96s)8`h0&hrT`RSC)_TKd@-l9fSX-Y%c4|df~aO$dxmMs$$yTs8_`<|6_8OL_v7IQXAAWt;;e?Uo+*%(-+!u~Bm`ZV^4 zeT{On_n-ZJcDk&Rq4n$kby8|r%f=cO+eE`^*=x9K-9)gpqlW#|Ov9c4#!edM4{QN? zG}o{)A20R@5VySU8s_@kQ}i;QBtGuz78>T#Qo~jPh0eTga~BQU*IL6Sw9&9NKnZZZ ztp?|L4J!xEhIw&Ve2>>RSgm0dud8(%LN}db{}bJ>!}0n_phD2S$xFkgJn>{Rbe>$F zAQqq!b{ubydg-8HSpZ%CKL=-Y(y;fPHO#$>h9v-d0K2Zd-Cf3cF+!jFysgc8XxIqU z$vo)RKfnJcx^r+xO(_d*OeBZkK2;Mvy+>?bi69JV5GK8nyzE_tLO_C>L$i zCsBO`K=wW6Ha-uV-}|p=7erOdQ5#u_v{dh%`e@j6;0ItQ(Co83av?``__^G#!kB<; zq56FYIjWD(IM!*{bm96DGr@&5@3pq3=vNQ zwk-H5-xlBboO3snn6ylmvL^In&)19C?z{EXuy6a}H~}8_*DwQL4OdZ8O& z9F`$ZT^X)ZgyZG!(zQXEE0B)nRtWh>H~ZB;r^`a!o8o+q#oiob$cxf7AIsOx-{q%7 z{BGojd!$@CwUCbNTsz#0{arfBk2cDW>`c_l?_Z^({Ai>6DBVt^+lu-s0$u=h2549% zKyhlIi_iu{PFz3sstLkr8@l&|j`UzxvFkBP2O2BWK6`xbP&O9abNh0Ke9B9bmjW%0 z&+19?bc|Z}aLpijY7denJ!pYGcfDA+EGdHIY22{mwO1<1)42cF;Z;>6PyNy1t0U%+ zJdO98)JPjg@+7xt!m}gh4i51|&~5B;Q|CNb;mJ@7=`*Bu{0$fA)4`k|nt- zCY^GKNp65n;h%Jk?Lg(5<;7Pv!Dz()(j3dQaC)RK^_t z;UOeXW&h!f#rGsnHcWl-gjPy%HW!SXF_Yw}jQzjOh$eZelal++A4#6%Y&<3Fh$(JO z4Ou^ur!r3ecF=1IqcU`O*5we%QyC6ixY~l`$>xO@zbhwsDx<{SJ8aIDvrj(W*uQMz z;I<0a$DS+^$O3$EuG8<=w!$w%A4loL`5-0SR4;Y?y*PW}P(fEy48bO*eEUVtw!6c_=}wt6Pq-)UIGSsIoHlmhc+V{9`=!v>^k z*j(T|;5tvkG{8W>eGDGsLSN>L`lJ0ob?~3)S&jal^k|`nHrk*6iJl$ML3$1fdiu~g z7$Cc(VCLG`)zsLirIn$9oe`7TFxNJ&md2(5-}y*F45bDVgejTp0R1pSgsB6Bb1v;u zI#Z3u^8kh!MzvA3*LYRkZy+Ff812cgPpw;&p zrY}2Xlo#79%pLYe+-cw`&?F6GLO@@3E@UqW^MuP<&-Ga7)oH@{cUilCxxTw>_|c)A zpVoNlzka&vhs&etZ&|k4q);+ErRL$8Z5(o@S`5*SJRJM+*PBTjjc=^bK3$QW9kHVH zyPk)i9AA|!KeNWdA=gs+da4=qeWo8Gf7cuE$6}7Y1*Of(fYS<^ir`hgtC;XbNE@}gyS^#LGvCo z=RxxwG}l4%95ly4^Bd%*Fp?oz3ZpoZr8G3RNOO$XW!y${j5OEyxnGp~pI+ZI_V-$$ zVFADtU>TrBWhDWtajbkd&5ND?mOp0LPa5U{&|KC`u>M>Y$x@rYhBiMNYr)3v-vnE>vbes!|J%b2e0KM2vfb$_wav33Pwc5bXx+8%L+TR_UZ0ap{es(W zpXby!)Xg{AL;b^w{&jayA7Pt3{u=cY9tMW%sINF29pg>?#k}82`%#~9XIIr_>Nle2 zeDjR@j$fD7?n?bfhngoGsSjD)G~zt0^;xcm2OCqr zWjpZ673#Ybn?iRLLvZubU?9lX^)c@6*bo@8!16vM?y-WSz%D|?7oa^4~l*!So#wRkrD`;3=a`wv9 zYkwpbL_MC?f9lKq(RE@shgBGFSeCc;*wi4i?Urv2OP8r?)azN_x`X+IdNZa9QsI z^yoT%J$uco>lNvg@z>*u#=~@My~edC9V^XnT+x;a*-YRDPzB7~q~Wit1X((6p9$x} zb%<-UnLihLgXvtTub0k+Pla>g=i|PL+ZS?Z{72(J8V^!DXMpfS@uk0NSnJ<3Y%mZ9 z^!#1J>LWf4cp+R@iTov5CFEuUvxKpO$X}ABz9Sqc5%h}uC0RA(e1HwY_(Nop9Sa-v z?Tv*TZP9`aB2$tv1Z3s^yhJ73( zJD#YAmTe9i zJY?uFKmV@-#{>n3gocGjj2#y_J}Nq9LTsEiequu6q{*&r+O})op<^ev&MjLrY`Fy* zHtYiCg#d4$8_*7D0W=0|0Xbj{e1Pl=pd7dZ6afQ6B0~b>LX@tpI(1|&g3pEXwFwRG zG$t^xQ@i%<$Bb#`7TmFIpljRqAsvFp1hxz8)YdhqW2a!(4nd*ZPL9ToPLVS99WWc1 z11!V^+9BYGfNbzlAQw0WoDe__zz|RXwSeBhC?H0_6>ur=0MG${0FMAUE({4Z1h|5G z0ULmwKsoRnkl+G~F3h_L(13k_z5)h-2Loe(ARt-5K`hY6QBYUG=L}2SHMs( zVY+}UFyX9#?igXJfgXSl&thnxBy%N zt_Wy@gOku6=mPWv`T@TR*ahAP8~_didB9n~79Bucpo4%;U_xgB6TsgBNx%%?J75-& z2K)#t2Mz+q1-K}1IR>;9&=K4T=q$hw><%Q-KtAvUXyM9OYhXF>6JVUd z!yHU-1eyX3-|=7{p%+jB_5gh%hwugyvhM(inS>bvMu0J30muP2pbMZ95LO^z5kMR; z9heEE0-J$tfX4+1^8zI3z-I6k;1F;a$OVo8=LB2=6aEnJ4E!8;Dc~)b@Iio4Gt5;1 zW`H^1B%lwN&`-c1@DN~_fF=5fC=?l;v5P13K#+=B(=i61Xcjg0oIza%RmM2 z4q({F-2n}-6rlZH1sJt~D9{F20HgtTfeN5uTkLP3C*TVl=?gvm7@M~qa=>vQU=!vn z0Nf*E>#l;|K<``h=V%*s0asukFc=60!hvys1Z^e&C;{#hM@v{KPysvzSd4_do&}yQ zVVCED=S!FjU^^wO;ja?r3k(E;fiNHjc=wxxNh^4q2NM=N<*^X_6TqHHm;s;wx&msz z2k-?300BS;(1zS-?>sAGiY0NbUoDEQ1+> z4cQvF2xuA{HiFTO;OQ$K+rZm_oxm<&53nCN2pj>93&;l(s7Vz9H-X#0eE~Y~AHYN4 z5l|uE8TdKy8bC9|U05Dya@2(}2}~x`5MT`^)DzGY+ze`8!ghBz=zyx}224MiIm=Gu+7fd)I;3W7oa8^J* zm{15@2Z{yU0u!*i7>(N&0&9SE0KEX}S0Ee60ZsxEDGvp>KQKUmLWyG>um)-awm@B= zKF|PA0!;u1pc&vQpe?u^&_O^~Frm8uEtoJ(Kr(m+uvLIzW0(#Y2`~i{tOe8t6B+|e zfTjXkf(e6w!N71}6c7N617d(lz#IW-;N?Ijun)K(;1ZbdKmcpPkP(gozz{G2WPrH< zIhasGKrJxAPCx^&60jHG2qrWGoPkyX+Jid*-2ivMM?fDiVW5Bja3By2gaKoLaX=Ih z4NM18fbW1=z!Cw=!GvD~903z*+Vco-z&REu2YTat>I=jHNx=8O55N*29asab12zG_ z0lx!#fW5#$;1G}nWCO>6Jm9o|bKnBt4sZ{6BESgeQ)9qXfE8E{)ECeYOi&B(022a$ zKp+SR0m6W>KqN38h!(IK{4;Pwz;W%Ybs=DeywTEASiO9q=Cb z2vh;?ICm2!0@Hw@IA{9h%oblX%sqpN8UaZ) zRvVyo8Job>*QWfHt-j7LxFsVWX;=(!2XKF^VMl=Xfd3N>3j{X)p<(;~0S@Iz_YX41 zg!t3{Ag7;K0c5WN#lT&l40r;(1l|D>h6Zi_~4-5f@ z1C&=FI81Ppe>~iAf`1YiTb5XF=!V&&7YKXFg^R%)ha-&UuJI_NT80p6GISFWY5wHr z?guJygHTB~2$jPEW1}LX!kB+_yfQF0L>U!mPEu+E$H#=k#>7TPhqhAoh}Xu$20?2a)SB_;jt`uqjMGNP zDC6Q|VxnWUWTBSy>s!ZX>}(bntxO0}#)bq%j~^cr6->D+gQBCLRr|>jr8b(gI4UH; zOfcBYjOri=1&2Wt#^=DNX7(o%sUqM(SgF)SnswGvEPqm*%h6UoE~tuiny zFd~YE;k2ESdvI)S?ZLT?;7i1u868*RvlE@X@IGq~FXjV~Tg2@F)ouzSKW)Ll3{oI$ z1=)Kf%O<{S1^D@wf)}ZJ+`$lzHI&9f-H_U<+$`u#vSr*d!ngAV0Z9kPNr+ zx~VEZdG&27dFF*@;k;P75dWW$q6GJh58=KHm)QG1QSpyy)&=wBxgc=WRS(v+(1RUq z&13E@4|W=8QG#%QHhG8#^M-o@um~jOs%c5FUUH4LK$e zo6H2ECQK$n9|Sj}e@e}@aeBVSK!DhGr0`>EgwYPP1YigEECi*(bQ3qvON^;D&W|ZE zPNTVA9Ow(} z_^SZL+oGbVeo%i|PmctKwPAO&vVm3R4o4yXju5Y`8;yDMDb#Rh}@egcq&o^i_p z#{lzybinp!FZO;hp1)g;7eYXOHjocoO7~*x!FfOh(znOk|K`DMi!>HMokZjfRsd%p zYXfFLKHQfew-rbO(g7L52Lm@2!6xV`1?NGo1bh(jnZPb!Cy)!Q1TuguU@@=^aE81O z;0t?a05Nd;fo)bHKj_{H_X}_({5w~Bv0$J*!fe6$z-%B5{$Rit`rHW6aR&YyWD}r; zy8^I4csIyb0DYkE46qepvjHc#(*Z3o82&=Q4RuU)o45z%019`bF0fJCqU}p85yE%w z^kVgY^I~3L-F7}*)_z_WgRVrl*#XqmJ}(x&m)GxxaA&wHz!`|E1OfoxgI??*@}~Ur zH=(aa+B~@F_@(^*6;pesa}ymO#8#g%^&ym=+Mzy+@*<1<1F;NkF$S0oA19l?L z86bHFIQg^_NSvZ2pOs$+VVCa-;HP!TTqW%QK##$?>Bof z<$C0~7Ucn)05`w}NCNr*TQi_{8}j}I`v9_O2+N1ALWEC&t``WmMR+N~A3|^D8XRAM zn&PmpNM4Qb5`?Wpo{5kj3|S_CPqLAwbuq9ejJ?E&reUt7M=5IWh6?^O!IB zebA!+)!z*E*S|l@C*#~C{?R=9zw@WBffi1Pe+K9;{+&NDz4CwVju%Rvlsr9U#?0?# z&7Lzib>931-={77VbS6xOMhIp{HGNwSFQdzea+f+>wnp>F=Nx_EnBy3-?8)8-+te< zd(Ym?eftj_JaqU-R`$`H++)X2zj*oTb>*A4@7{m-Sj9eD*QTgZ)7qw1?K-w~?dsKU(6EuR zaT9w7$EMAknzv}_?9!@r^>uxhuHD?btJHsgdwTeYk)uWj{C)g4Q>K19?f-Q7|4--t zzg_=-|KI>$|9>CK<<(C?ZrK<5|C$og@A@gm2G7eV7$2&DTXd1sKb7>)@t@28d!?>Gzdqe=q(zI~-#l2aK2MV_dWnV;%*@N@|2@ z;m(44Fx*O@6n1;^>)uR^i|D%dJ;q`*W=+GGimuaaFovV+r+FBU(Y54G$Z^+v&_mZ( zeV~`du)&b0v2QTOU~+IcJ65PrI5dgG(7`xGPRDIy5XRCI>PuHZG zkf&>L8N%@>0&|7m4(yD4@Q4BPfjxAMdkKDAW3n3<|23p|*wcvo$X5x@12+ce!>%Ua z_DE+B-U+`0xCG^K1S=rd6f8qN&A^3Vx)y!`ds~2)Asy8xLq5(RH;f@&z*@-Bt?U@Y zcLX0q{++<3NJs4`3HEmepFwjd zOpM*p0K9giU4VD}j&=c7;(AI7rfVuAZ~)jCdGUk|(zzx8Ku%jW^2iyqk3^^ruC*m7}=fVCaU^kT89-NEvIe<$L?+Erq zd{c0J=ot zR_N&gmcovn;Mwqh1%3$b1ug;i2B(AjfHT4Uz>C5C!IfZN@D%Vs@EPPY6l?=~hJkYt z{xx_8>PHh2p1u>&WeybZuo$T@=pHle=2FW~PEc0xX$U>}5!1Fwf32|B6_ z#7n_>WCtfnaf9$}Cq!-)`>BfN-qz4^ZChV1h(-3X~?n8RONl0e~ zJ_x@BI1=%8;CTq|3cdvW5_EWjDLvQ%^<@ICggvHUSA?5^lgJLR8hY%&%TV5~;8N(5 zpkoY&K2xw8>@fq6fZqbV41PQCPLc<|r~J@S#vmV4unpM`6 zK43HO8RSRz!WERS1NslJDY%sK1$Tp@9Kz0Q~$r2N4#RL|gL zWS1-SA>I^xgXF=xNWMMxBk2JThF&x9JlG>~L%mSG;6%hrx}p71JUE^FY8(etKCmD1 zGxK6tlnM5M{ZyVlX#d2%s5j&K9y!ev$e@46}ShCe9g! z;26YT1KXhQ{uR6u{&esS$YK7Hg`>|u56)fdg=PQ98+tB)A3}Z;xDft*;9WTPyj1LGE|3*E%n@1x)7{I=4N9U8!IiLzsZuqn_v-Mq>#Xcnaj!ft`{6 zS+D~3Z3TBj{wKjs;2*$#$Y(z|3+ax5E7CDG0=I`9SHQEOC!hSVuQxan>9WA#0Nft-o&&#t{B3X^%6A={5BZzmDexDOANC&y(-_1aoQQNGU>aM{*dqzy zkzg8&GzHthzHqQD(wTu7xDSZN8m+)ua2%M%Wai*y(6<;YMZNw4_JjO(up04w!EVTB z54Z$!2f;LEps~s_f%s1Gfe#%Snzm;>_L z0an6KV-Fe=T7vz+{lPSrasr(}y0KsyqcsBOf&;-ccC-SI0OOG5#*lJwAK1SHTmn4< zC>-^o0PB#?KyWGiF5pP$i3QVGs|{F&`c4GXn5hd`fqbWfX)Ia;Ok*S!xIMz>fMw7( z2ux$Nw%|16I|)okj_y+hp zFhf3FK~lue0Mi)J6`T(LD)1%bp8(E6KJj2T*gFJFW9ORS^(g03@Im+ogB6JX5lmxh zYw%#y$9yo2B|Cz((EBZz#@aUE4De8JCiK?=Z-qU>h~ZxbPKTa(;1|f}XRre}159J{ z+Tiz)_XE=yy$;wG><^}~Xg6>;@|y{^K>ck5J0smhunc-uf@v&Y7u*dz986>KCg61V zgTY>qKMb~kd=9ui{5!#w(3c6WfZS6)ZISP32l4uE_Vn66P8fb+ql!8GRY0CoUR0n@dL5}XG4F<`ouX$ba3cmSBL z71|RcpVi<()XO(ux>jihJ_vsVI1%Zi!7)g02z~+mcfgC0E)ARn`8D9dkpB%l19ol( z??kzKfPIiY2Fyy$2OAJGMUcy=6XT3HH&g%dNZTWSrSs2RpAh(R-)-vMy;1IkS)o6?sns>oi%+8{N())+>@nu5#JkB)b(%KoPwh%=u*4*L&QOQ?8{Zxa z8=n_)-K}wrpSA`f)Sgpyd-zZm3<>Yk^ZMS)J&p zuk51gQf;f-HdSwv`o=bVbGcw~^8;sxhc0c^b?x=3Z$q{Yx|y(It#ap}H%E?daa`QH z?_DWNcFB47BEQK%UnlwA=g+K%S=)Hrm^!lamF0E)E9<-cz^>T*{@uQWUnU2B+*@;O zAkGe@H5$wh%NeR{w75%ZN7EIuh?ql%LnbQAbDOSMr3RP~OIvRq8(Fb4{`mDxHv5Y1+=`Wl^y%%CP`l*S_@fIw2b@2-q}h-y zcdj(MpRsboukKWl>R$N|UsTMtpLT4#nP0T@h-c17mr5U5jmP!<)89H(yf~}+rB&VZ z30Drz@`{)$iF%`0HPmiW{QB?lpxbZzy2a0)zNoh9?6@ww=G>gMTGqq6Z@9&V>mL>_ za=2yvFx<77*RJJ{HOYH&P8s+;9S~l$)^Xz0`4jq~1qHvmpYruH`Lb#uK_e|HUHj2{-9Ch9R=C-)z@{#-lFo&Mv;%NsvyH}u|6>ukp#ua-N_C|`Opq3c%- zx4SgzsdU@6wBX#^x!2F$?Dt((_>eUtBYvCHt){~SZ+z8@Y3euYRVQlL_Aw7P&uQ|c z_}$t)rB80xd3GqYUDE7bow_?`9$9#EYh79Ji%b2+R&}r%J2cE@-*xq=t}PP7SF{~h zbZp1VgAu_^QJ&Hlqm$n4C>Zi6L)mLZ<**;On0?$X`DTN2uZSf_8aA(=dt&p2%Y_q9 zbS$tKa&1xCsuMqDobK&tJF&vjbauvTt)fwv_ceU(ZCeoJuXu3!M_t6#rrl#pcYU`x zZFrN;?N-K{Ozyp~tfx!Do2Z{2sLgBVR{mh2s2KgMMr4koN9voCs}`Ea?U+(!G}Fa% zXGDBU7v~wnHYlDn%4h1yC+>~O)Qz28sJOT6Y~HaUa}-1N_~&0b{LZh<^i0FL-hB)^ zpX^(AD?8TcPF9~uYm!cOEpYj@tg^}YQ9sRb`=+q&q;s(ok0<`T@7|<-hKozNt^<#L zmR%YV89lXh#e<@*Z`MSQNf^*R^|;Qzy$!d+&Vo^7gfU zYrc=WZd$tXasM#OpKEQpvU~R{tEFyn3y*$Pe&)xPqnD`MX3)zN#V-b$dXK#Av1@y)_P?)-UUya%HQ8y` z>xAsy`FR(@N-8t9hjl%;ybEn(R{!`l2POuK&g~*}K=+ z!p&Ew^tmlt`OAuUHoIFXotJU={cuU~RC+iz*w!Mu;GuXyl)=vJJ(npdWogf zT5~`C?wM!JThB-)^GoX_1iyQEaf18A^s?4AQ$zc_XxHj#=JN%Xa_fl2ed03YO#{@{ zl5S?RC!A^Q@=K>DC$G)j)#iYQrq7!zkw&R`nG&NrQy%>|FgGw~%;v&tvu^&;E;BH^ zV)3D$&RCDVoIT%#YcL9HUB}7CS2wTy!c6tm^Ya^iNmyrpc>VO@YtOWfRdkrd`tF~vYyYE`~F{WeDhyyc!wDI_0ccw>WvD^I%vrHoD z6d2fje7d{)_AUEzq94oZ(+2~wsW%^0Cl@7DI=f%JJz-hv2bWEQ2E-QE&Dhc7>lRne z-7skJvAD;%`3~02wq3B_Tlau8x8)h*y{F25?RlfO>8eu(H;yeBaKBB`(3}Msey!Vk zG?b>=+&l8o`hAs=d{R)@hmMy+C;HyrH^vw_1?~*9Gm~7%x^0x-HLm7$RjZ%Z-C6Zp z;GG*mEe=YXE?#jtCUB|a-J|>B&21VxH)s?v);e=-*9&vvrale0b@kNombW5|JI%^; zcx1dNv^?soy3yC?FN&Y89o6xtsAFyRrgc2#;gq*v(sqZNG+1ZBn(UuuUtaF)S!DMh zX>BX_SL56#eKp;4(}PL9?tf_VQ_Pi;C+ANYU0px_P$Ub!`}>W4zeLG0)~xpaUYj>~ z!TVvywP!BnWO_se6%9Kxe0PVkkJgca19I)I?_aWeRllced>_2IF=1MeNz0#G-(1y% z@?(lQhemZ9+9~0#+q%>4{a0T|c3%B@z4pYLoF5<5AL~{+dh5#6=O%9-&c3`g`|IxK z&g_^OqiVG3;&>OGh3(Wj(TgKS-F99O?9+M8k{TuQ_I};!>{|TFr`e%lO{cWFmKvX) zmekdH&vlnHpY!9tm6kdz_vP|5z%ImlQkc|~Nu-ucVpNk!jBS~LaYJTc;>ZkSF3eEY zff<^1#|ktbCN&$#q~;@;)FOfzS;R9V%jwL>DvcS*e`dz=?aWwlm>JhN&rE8RFq4|k zn2EKKL}qO(k=1gM$ZC5^Ol$i~OzXr*Ol@aN%xu#oW_9;T%mk9Q7B6QMK z8ZDyBf=?SgM@k<<5}Aw0y3XehR?rJ=tG@RT8SzO7nD&VifA+QZx~TH|y=J2}Pa1Ip z64JrztNx|1>aDtb)nWQBS5Mw2azz#Iub9S{r<&iK`|-HVoDORDv zbkZ^FLWiX{4931!yN(iTsawH$`%|l3Ep_*nOrs}TdYxT)AK2jmbEX(2@ z%hWv6C!;>!#GLfQOU*J2r>N?^9^m3;)E)cp=AKo?H2b8|;SzqvhTv8uuC zg%*kLJ0rgPf>zglQrX2stuCmCZ@Xprzb@RCu3Cdf0SC0Ghxnl5uivgysa_^O9n(>U z_$U4i>ugkAAADYAcc?bvPZ*?i->mxXVt(GR3ys~GI>)75+ij{wUPYDHCnJ6Om6#e% zJ5>{XcQ~a!hdbCyd*xnjDp0Q)gHo=}Y^WU&&NW@6+$hJ%;kA z9h&TFw_nv^SXld*ryY@g{r2|b`N?gmKDTza%vNo$ zNIC62x1l@B*Va;HW~(k$EqYqlTmpZ8qmKiQsbt%^s?r46S)O?5 z>dt&8$zvAhsDfkdCaKDBe5LOiq-~z7YTx_dG1GHYA0OX3oXS-V2*2;)schxWTup1n zk2$7tsk8a_hqsWPy|S}=c1&d**xjYx6BYbvwb#x+uF7A&^u6=qN8NBmAL*w&p*lNQ zJtjkmFJ$}HuUfL}gz8wkh2hQ;lrQ~U=vq~t>Sy~|-(??Hy0eO*7FK8SRJYR4ui14M z^_BnN$u0krs(U3>lMR#(u;)V0Mr9{eN{45WR_)L})P||+qfV)&4R5(`Yk51QA9!pp zJFSY_9NZ`31@en|Gv)s5)2i6?#3uGts4sP^{dbMesHPkma<YSz=_w3p?GPg^|EuhDrGORMuo`3@80f4x!C^7E?jrO#eZjl)L@^G&^n zo8_yfIS#TPJ`VM*d)Fz+Ctr2E=DvN4#-crDG#=V!R=#Tc^CMHQ1;W0}u?;31&sVk0 zcAej=4CT$ZaJHx_UzN1#=_{)aXzz(f54Tnqs8aVg@lbYyJ!uhjf1F&PT0X+1@uX*H z|9)FtC+{v$eLJISO!xDskIXK$u2&SOZdqB_xAJS|j)emKt(sm?y=k=GN%3th=&P|| z%$N(RnsqH&+3l?9&I&!VCM>(4n$&6a)`-q6(SFS*W?#ObIwF%FzWGNNw1)#5f48`( zYFoIc?(!dSJb$Ub*6Z)No?(E{{|j89yT! zd3c$V7g@29_lxWl!uv&5+w*>r^Gh#r=|v9M!23lGAIJMeu5{-8A}7AQ$fXxKX+Q55 znWgZ4kt_T0evuRF2xkH96r@qUpDzvcZR`}E`eB4;+>{UWEMeNsCSd3Fx( z7dd7r?-$uGg7=G@sp9=2r`P2DBD1o5PQS>7M|r=^ZKl6T(+1I>ZTpc>gD6B`TW3*5Nsr z2E>c`x!;4!__^E)Jg3|U;py>Fd!?L-Cc!Z>63dTsN_;@Mr4j zA{nxiHho=`u7A9imh_De86O=xiFw9OiqZPUMr%WYw0-#?;U%DgZ$f+s#QKG36QX0s zDMMmoqhq@$HNnBLA#ria(7^E#Sm#G8{)EMQA;C(lq{EUwyjL+gQV?JPUjQ7*9|X zi(szy!=vN0f7!3d9IuzvG8fuaoGUgYCUR02s`<8~H9fui4IVvch^MFbph3!(oT;49 z_`sMLT4@rY{36q0kTh;xtD_qd22s?os6*pR?rYVRR&AyHbfxK&3etn($Bf1C zAoL%!4mm6;f?5%`2dbAyvzV|L1jR88?GR;fbVyuOvroOG59hJi(P?ZUBVv`yl9ULDSAIJJ9MB#uzHy;&9 z2W?CQO3}K^i$I@%#&`V&?#WCNWzE}bt z6-Mj1u`oLB^Lp$5sd~kO0=pH7!{|iu_rg)p3AF$JPOxWeU{DAalPlxGv4AM|n?aZ;>>{2 zCo{pct*NGxrchiH5JV+Yz@Qz2S<>bYifJ?+qZtip!+vCjy8;9&Li3Ou|EX0)gi-ZC zB^0fyIGI=%*dMc6qw1-NS}jR(-B2u2Qkh9(;9y|l8QfdY6-l?D?sR2BT6ix?HR0NZ zAi6v}BkX6^8H1<|eGPR(Z%gUHOfr)00b`X4CL;;7zsMpxdZn+T_LIfNTn+?+jt`x2 zBo-lp!uUFFWZAZoF9jNCn$zjl3prvhRdW!+Opr0;<+Lg)nWT}LnpD(pmBCK50v(od z)POq@Z5s9A2Xk7WAI33Vm5-}5ZU|F08)Sj29DXkrPBbmgFD;6kQx~Q1 zUn@qRwqseM`Sq03RjRBmk5^fpWiDZ@kzH}4u9~~j7!I_mib_mcAstL#2l{L(O=~1I zVa1aQ7BSd>^|R9iVN3PI(*ADloto$(+?%A2gx@C6Z{$$zPh;$5KTJ)dVG)c^F1t}- za`=Kn6iZZHPht`i_usT^&@w5su04pWa$}iDpHuMtkt$NFb7Vujw z2{41&>PRXB$ePlbP$W*XrUH$6g_hGxG=H=evuL`l!f|ywuEFZw5gn?H% zni+ghZi3}lau9PzJW_6$;+a)&6?2^!wv3e;?jqJP{)N=)hQd@b1kjLA>=HT@Gsp1+ zand{o<<6|y3M_ppb%9!ngvvM5DuggWw+E5mY4sQyB?qM~N-bSlgvq}x-4Q*9LzaxlKQVtHKy_~e5`@w(TkNQzrs?oYLWrI9VSOcY-T>Y}w(sxS>k(x1$v z3ggLEGnO4SJZMbG_8l}1O`>*8KzLfmA|Y-)^h=%{KDg;_vc;YE{k2se3)Hm8NY z8XuWApalr!Dj7*z7q0OF)zcyqytl&{{{Q?3F#bUp^nWm2*ixi}e@^)w^%<`SOBUlr zIfTCfeQud59f}AP7du^He~IoY*7XwIT~=DEJ3QWiUK}oUg`8#1QfH_v=*1Xa>U2Au zE=RG`?I~)rebhp3E z>+-sS-moWBrk9ll!ey>9S19Nz3zvr7&QKuaDlPLn-6cW2EaWeCI*S9Iup>|!bU6H8 zN5C1>ouLu{Q5GukyNh8DmN|64L-&L+0VdO!0WTnNG00FZ%4h`}#hMN5YY0;}uVaZr zYsD;pW$Z>hx7YZjXjydtaK~WOFh64sOhObuvKH{aBqoLA*%VaB-evKCh$p0D$sJN6 zVJb3caETagNF+rJo!^>IGID7woQ3iwmH*UeZzNC7IP0UPFcJsjz#(pVyx3sNR#k$TBWj~iKKA3%f0 z7&nKEOFWOj;1Q%HRTNKF{zv2>9WrE!-d z1cKnd#I(agT*$&hpsPRzTq_6}Y!zhTS}4=ef!h>C9w36wG>OD>yI7;1;>AA+W#dVI zlJ;-_VJFreW5tJjKadH7LA0e35XafZk0^JEfE%I`f3QttmqjsYY;LMj9Bilv#bP9P+%AgIWSqfT+Wcwn#vhBnvv&0V@a{L5Kw1F z1QUpj1_(_=SR9vD%Doe34tV00O`=&bDiXzlicJBM9@6Ca!=q+ypk0Zm5iy5FmB3jT z8MHI)vK%Zb)xwMhf`niVVma!+TGMi$y}m}s+LTwbKh+-aCo9BadK3g%Yd$e;sMU%r zLd*uyIOdaF;IXpBTA%j{z*7R9DPUzo2GY-vmQ49uu=%{}6Aw+AodfGW?fPA(h8i8O8L`mY7nvm=YA#I7RrLL)>Wp!2Krx%52 z5r@B@S(Lh%zLF1Js@AvIZkEh2?WZ8Z{|crw2rv|q6=rhTH04(Da=z9qa)Lgo^H3Zj z74c8fL{Lh40zpI4!&V{bk-jA9fz=+=k^vM+Y-OyeD5b}6RykJkg z0q~s8ki#3m;OQw2IKtlIKu|9Z7VEB(kjv|E2T0CjM{hw^E~mE)Lv}GJP4^Us^`OJ= z2Cs|fheF;^&=d5Qxq`tGucOT4^7u;vu3(wR>k4@trD2yRo$t#K;C4Fo%dpS!Knt)33bhyqbF3%7&_Xz-DV` ztXb`AuClGDT8m9&yWPgY1h%bVRe5bqg$Ob_inTsXHRsi%QWvbMYHA*pxT?OQacx6$ zRi!KfwN-oR+1os0qd{h?YFJa%G+sP`Q(tZEcu_5Q6OdX_lAEn1u92+;gA^Si+XNIk zDyy1oO_deRjh1>T9Rb86CxHW1XEwqUQv!mU(HIAlZ1}4&g4|m5zH4_a~t-u z#jV|R9kq4mmBa?*$G2zGzHFTzdmc%#NlaIB(}a#YyfIy?)eDc`JOG^qY#TO9iS1}3@dWb5%17)*f!^mYo+hsVH!EO+-~#n?Ih>`o0#L{jo7({~ z9+>pSOQ+dvE_apFR_?6u*h)NAK3j1`S+%XY#N)Erd}S_|t;7p8=#uIxx2>wYy3*#V zEUQ8hNxd@?&!jA9vK62J&l2Lga|&>~9hJ7K;&P9zyu|0URrpF_E3T-p*_7>~h5lSB*U^7p@F8uojf zrQXt#(&9ka6)pqAUJ?dJ?R1xhOB`i>PsmXm2zY{Jfzr~lvY@-fk9ou!4wN|cGKep{ zXkSbbYMT8Azm$ddpZa-98CPz1sl*i7szUVF(e3w_mIVD+dgxd_c#2C(bqGUHgK)9S z;SZI#y%3BP2fVJ*fWM?HP*&$L-M} zym4XL^9M@)c?|qLh{Mvy?hzX)yqX>iwFx1y zoi@J`=!4{y^5^)Ck|@(+!sT$6N&z$V-xXDqnme*s^hjqh?N=E17P}XenoFRdf2s?W zc)`jc3wKyAcDr;JknS%DqsNjsGT`=?1RY_lx4l>`qXEDI28x{?D5C|@lidz)X>kb% z+ZpySfY?CM>MA||97ul;J*&8$+?FUVb&qNZ@}t$H{1yvKc`ac+VE2kJAlu~z_~2T@ z80MW`JphK+beV~GCEyxDR^pN=p5d#or4ukXP)+z!G*Bm$*Wq zFxH=bM<@Uc2ORzq%n%?gXPFlQfFOp;l48+OSl){9n26rvbct4!-(ovij1EB#N4L}H zFHQ<_;%!q(>a+l?C?~f9G!BOS{*b@KNk{;q0%bve&=tm-h-S`QLc>5diqOdKpX!wa z+lBC;1v{Ok#n>V6`a#!zEbtr-H#Qdho^ZhJ3S#OAgv!c5Rc^Pt%!7H) z?e>;BOZ;I_IVQGZ9ix5_!?RxEDl7BoVYdr|MG#YApbQ%qVSmU`;sp^ELjqUo^@B*! z#jvdr(97IdWQIdd$n6{ggAb!~Cz|iIKI?FHvIrU(PUWVby>GimRjsPa@fHM$wlweRR4uwlgi$ktp zF+`7m76V$y?G1Pw#bJj-YfGmSsij3lU0q$+(T(_%?S)Wngic;8L_30onf9V9QmtvQ z)&7nmv7cE)Jbdm(9&2dWEIS#rpH2KVq(+6>Dnsc=YL$r%V$#0yHPoaE&0W7pG&+ss zWe{*LAz6J8;(mIPM(8wS`_NRF3J5`Lp|;=VEGsLqyD%i!gm$Bi)f)?iLTNJ6+6GN? z$hvfFdxi?7+BgJw!FZxagpQYxAlZ zBQ)E(@bK{xTcsY2zyqIPo8Gy^=8Hkvh7~|lunnuLjYy;?jvH4DA3aZ@K;CLu?uCZ%(S<~J7W<-Cf0J$u}D$mT0fMi%b}Hv&~SK(c&Vsj zWn&fA(KWWFLSLb1Ayd+bWL!2idV#In$s5cOe2cyuf0SvT!q~K@-jmafYa!J8hVq(?1M8LTOE7cGrwfO3y zT4EQMwlV*@2hIbgA-R@(|XMlVVMZcx5N5$Wne zO%MC>Sv3KQ!q85|!kc$3vG`5JMTw;7Kxrs?I1ZIa9E)j1k=U{q9cd}GSu+B0BmoO( zvlF7z16a|<{79DBt}+Ny9H7VQpHYUAfnf4d6+-9X*xKsDL{Q3y?|P*s(ot+L8ji@eY% z^;wY%wQf6)<#rNF*jGR|s~Y{$K1!}=3MFkMujKG5pfX2f$)Ql^)^vXo8;7IBkJY}K z+EpNz0uZhks+I76iB0ZLFUl;|3QU0-%aNAas)amBsm&NV1Qc6oyA-g{%b!8N0r_HY zm$q@RpBPIo77AkkR_$9`-nJ_s-ES`DpwZ~ryN0SdBPw#UXYCpnsEvA++2|OJ)fF~3 z)(l1_kd0wL;ll%qwNdC&2cHTSWrzo$IoRA+TVjJR?IPjnywqYG1cHt$?bFe*IE)<_ zUud(bV9}^Bso7`-k1E$_CQ9t9YO+HClqIjWf-$#|ITqHMpCA_0Mn6d`lnA-!A%TQQ8kb7!80efwUCFYUniD>0E(mMpC;- zh7Oh*tRzNzBdM*SVFk@GdN*b}nqG)jR4&l7Vd5~NFUB>)7Do+ zj1{VyevB|`D$$%{gc(hp6J|8=82(u4+i1A4!cXxFMr^=U+OR?0gz0!b#}$qK3F6uc zu(4y&bP_tF;-%0SMEg+u$HAx5v!l>i8ZeNo-p(4*)9BD0#(Z(S$9mqiqNVCWKuUl? z%O80yu&n)fH%9L8%-0SHt%mbWHjQ$zVOL)7$l&l4^>_AK6taoQTy9WmODU3Oo2Jc} zrqOh1*{K9?#e7elui54-bmIQ2rbsIb!8N%g%+*W+XMaW^PFpS3#7Fai(PaDQu33yBhJxWkxorV?@E44{Y^B_|Ls4nH#-hpG*i z4bTyM-M9_ej4>Z~MaP9ZfqEu!gEZAs7dP~d4vQhATio&-!=1D}0uw3Zd5*|A4E%H> zMhN%WCIkl4;wI|(xF0w21Am+DM02?t5|7mBoP zfQiaT!o@Ka?kMNcp$u;fB~W{$keYDQ0(&R&jDs5d0uJ0b1vj^!s-YigS_KRN*y4!M zE^;C0RGjQqRxnU}KVs{kxBwt;GtzMz;h>E4QItt=;AB2v*@#r=XfQ-C3^$cX?b`*& zvr7yB>tO*S`%^vIB+L{NMk>Y?=gV!S;`)()2r-C$nF0yx^!_QON&-76agX+Vv<6W# zwNp&^Fg*}e#}G%iPy_e0F451Z)dGkU0?t+4@QS*nUSro^#ZhU-i#!4XvrZ;W_yjYJIOsh=NlyE^OS>l4iR6k{0m?^2A7|l@% z#mE3I&Yea`l{?ur=});Tf3jBNq6Z8!~nt)WfpN;{ME|)}dj*F(^P}jh8`wL>Jk?2xf@VXEYL!J1D15VwfdCMvOpjGYhRBRifSy&;AE63g*t z2#F@L;!<`l*kS=b(=l-sIRPS1j*9Ka& zm3WJw8U2&~(u_s@ckGxocr8N3%bv$`<5%Gwloq@}P=$9zs3n4a~)XD}|3Llv#~3>+w~XpfNHo%qLGtoKX^VN8@k-S|S2Nvw~lYVK%%eVZ-|Z zOYrw}yl=1$f3eDtGiyECp;o*Gf&-v{nz%U{%d^LI8pDYbG-IpzybUGM>@hk9K}DP| zjlin324LtsVAqG7h!%Wkw`O2`CEP?AD+C@GcVW~fF8B`OSGoLZ;CCh72B|`PHM_JS zf1;tW;y2?R8Xww)+Vni+O|x7O_@RCpMP1e0Of*q|H!cd07tgaTfP67{VZu}qj1w62 zA_tSR=|oJ5%`?227xOaoE`vGanyFNY=O9mdi-GXhodpTu`QWfnx@?*pi?3BYwhOVD zgX}_2b)bI|=BP&W0zA#<8Q_6hiLf|2P5^bJUd}zofxNJJD*vgRc{M|Ia*Ua4c6b8u zR9xaFh)%5d<6MXbp>h@PsZuB&*Mw^k@+*a5UXdUmeuQ|TgT>+cnro64)Sc&K<~&E| z%B@J0&)j*70bKzws_2kL8k*J8z%19z>}>=a_g0!~IuLJkf2Dr9K=f1UtA)a*`ZW10 z5Iwof(ucXm#NAQJihs08>ZTE=KydxU5z;J5eKG+%^)KeYS^y36%+wY5@$)Z zpjsCqgjTIg;RHR+yF@*duQeu(9yAlu%uFTF+PDW$5N@~!Q0_F|WOKJnV;qCwHsdh% zDcyYJ#2hU3V&X(;Mk0PMjep#Fiu2TgCrZK4GR}!hO(74OHEARusAyzJ3e1K?3e``U zTUS)bFfrxO$~j3jaRA!4bPVafRx5#PSJuAshw$jIaE3vMKEI0Si@XD^;hc( z$$>ar=LML5+CVU#v}Sh~Eu6ttg{t4GJNQ+2CgbTxu;zc10K5Zgk&Z7_o?B zq*b6QCjdVxfmX|ef1(rHsC6)5*M^kD>$pT~(Q2+mVw~h7L?ygpNr}4+4^|e(v!Ntf z?+`SczgqDqe;U8z$d`NDcr{oF{(|Nb;uDr5woh;+D+Rn(91`!q>wBA^8p0y2Z~n1T z72dLENRkuLIBeD_3e3{VIxg_6aHQ6BM8z~lGWCyF!`v~;2FR(LC|a3n(T-Y}wA3YN zf@q(7V*k78SRM*DYLqAHBzXs~7}J2S1359p*#xKO zgS!EoLj~IKRLo5TohII^`YawrqIZ!(_(3xPKO0$k@YCw*ibA0xSnyL9Kk-$Mbd?*f zgv72^2B%kPci)CR^N_q8iW1aAGsSQ5sYzuywQ4<(%=mGyB!1_UUOBAiXQIO0+?GkE zLbyp0zh>NLNY*ua2)A3YXA@n4D8rj@xe>*z!@fCvtCJCS!(rZ7Qh}>BuvHjs!k#;} z3#+=d+6vtB(gY2FSSwr@XX9O@xa~uDr_NWZY2uDVgw@A8p~#cbe3@2gm|%9=fGYy= zYia9A#9^z+y{!*nIOK_AYd}gc-s10q)(FLKNp(fSkkGX#y#`HNiJRn5AC2UtyiJ2k zxg=gg&|1evKQfVL(2$4q$}$xXB6m8Ng}uRK6)wz^=d|#~)bgbr9ZL~_pFbEEU-}pq zkwML+9lpp1`b^mPlo{#pGvXMhRq0x*fXJgI$QEBBDc}+9k6SS0-B3o|soa_vG@**1 ztbvcb*F~$sQ3JU*s=NpWakQ1vtl}F{43Ek(l(;D z(&>Mr8?{%DB5^cU@4i*poA0}b&6u7ROEw3eQj208>B}hPEee7oqmVIg>GO9>GgWs2Rn<6_xaXJJA4Ds$dTg!k9pB ztHaq|gd%@jqe<{2`~(8UujwG{K+THilH9UirF5N~)VC2|_Xi><1L{xY2ONnn@FTux z+aOucS2et?K}Qvl9ge$*dkE+b4&;NrCbn=aemKjbK~*SBc~(bLII6MQAI<1w2lQ;m zSfoLljjrI(%K2JNy1kC*f&_!W`yozMBM#^sm!Gv`G&IgyQ#v|HB%mSXE6PiZ2NoZ| zQ4I|(tp@j?wnAqo&?D|o!>&>+NC}WHAI*;HVH`V;0Ztk`gg=eZ(rLnIgri&XL3)v% z$_@h&^tHC1BtIkHA`R3H`7TVGIb1N3a=)w3rL1U9im*Cy`+moK0=( z5r1n8*CIuN8v4K10)hx2KIR_rW+094pSc)sqHvp%Rii&r|D-(Ly+$48St;)PwA^2` z263IIHr4y;>3f0r(w~Mpzyq_svAMa1U`y)Ml)gkHg#&9f+WM;Hh!4digwbEJSHfOP zR|@L&*jQ|i*H+Y!mjw==cFsAPW{1Il?X#cOv`b*l!SfIJui@1I?d-EZt>M3hGeDXh z1}_0^24_(S}8K`axE!a{zykd(YM;G=*rL=Li}roz7ff7J|FfUuSp zx~d{XRt>tGP-CrtR%Z&@jcQ7<`O~(7tT0~^S1q58_#Ab41k){gevc&)LJ{6f$BoUL z$a6gpb=>TwG8CFZpCqy>mq9vcw$}0w8C~T&PF1XVjTdE%dW?w{qdgQ*W5u%I?qJc3 zyv!!Gwm?=Jj2R^t_hUvPx~jmH8#EKxcxZr1FjUc)fYx{NO*o`uid#&B$7q zKqqJ`db+lrv`=HLOmCS`8d^DYVUF-xAMc1opvN7J;!-C{L$^4@!yI>169;jF0d&JC zo;s6iZ4onATaWP)Q%7f*k9m$6YrP3DkBYbv)yO|L>@yczLaA3qaV+88$~j=D8;BX|iJ zdKxbL$A5AE|9pIz<3h>>3v6&=B}cE&YFLBCFy6(4i=-vW-i}qE9fo4jirpPrD^)VNZ#_3RmsI#pzOzRDgFBe=#?qOmfp6d8fb(xkwL$T=bXikxkQm+C;_^q1`vPLd0|_{(a&hP8u6sQ*(q$=(QV zveSMNwWG4b3s4bkqjodUc zS>v&bcAxC%y|jSlafZh`a&s#FOHyat=MP_kgL31)R)3-q8hvpmELzu$k4sMALlU`c ze~v%epG#bY{W&{!6wQ3NMBgZX&Zh~|yX^Q}ZaHW++n?i)_NTTdx~E$57)$+-+LHdV zo$B8%@j&AW(Kv@uTDDWTvIi{o4ngxOP8|8DSkyjdBo}wkv5F=V4crO)pn#-td$)D#vDp!aevgjd*cuDDRr3b6O zl^#a>bGuvpt?gbhDt~TwtG~6~NBeX8TKy9O|MZu}0j?A6BT=s-7yqR%?YWU`o5x}5 zMXVW7X!!FuNZK#dcHCZMr!kj)G`{hda32&d8dC_j6p}&f(+@Y&!;k*5o&0DVra6lI zsPEIa1AmDQm7U@dzePW8>o(ycE`j(i3ZcGDKWaZJgIvrjsPTa$^J-oq-3F#Zd=Q)F zb=o5!JIzMQ#crY)4yEyjXjjE0T(Dh*leC@s70I0VucA59`BLLB&82FtWjpf+Y-j#} z?c7fTB0kUW3J0vuM|>I0L#@b<S6{f~u+GU|1m%%RTXT$~4kN7cyom|{6Nz;^RjKbSR z`_f(@g%e*w8at{D2}^9p2Q?!)qWO|(TiMx1;f6G|2=5`prN3;)2l@`gpQ?OV*Nx{_ zb55bzmVR6xb}`OrXNY(VYKvB3=lZan`Egappa|axJlH|aexxJqL1m{AS=l)cj?)ba zQ2x}8%1(WY)&!If?L*U#VWJU~aBTJ4AY7_FD1^pV`f(bXml^NmM?3)ih`*s9^*8z{ zS|u05NE{c{pTn64qA^c}*JB=|eocLc?Yw?kA^f@QN@3^qQ-!c|-sRFxI9jExMLufn z(y8bk>9OSJ{#%UCgJhMmef3&BD(7S)H&mKSnxQ)UOCXY-fIq?aYs< zID}6XhxsvfDSnJy%#SHM)t2qdkFlNkF}8D^mJ2u(y)aBfALYWo0dz_~#?eaQVwyW& z*qIOW2|NE~o(0ELg_a%jE%n0A{6~$jD}2@>Z{|0A!k_t!CZQR}`~~fGE54#m*csO4 z!p?j|rLZ&q(1cp6HmMhO)mO=%`GsoXulNOaQ5d(9ax=f6;?lUocIFdE*N(~|T5J$@ z?!VM$)i}#`E}!j;$8r&e>(L}M^_Uk}A?zHdO4ykfD7W~pMbB0BTP^HdrzUCVbsW1? ze=x&{DpZ)FW6}wsAGZm+cz!2+QB_CMG*$CD=`@l*jbl~9&ULI5b{;3og`L}1#omYQ8>C*trd?_6p(8^YlenSE+fL?L1Gj zozt?N=V`X{Jk55Vr&o!57=|W`{Q_ZExTCT-4(Z&gx>d+HL@R9P@sfCd+QT9F1fTDr z6^#uvMPH?rLgNDI*~i3=5%Jx`ttFxT>_Td46LJw}7B&1xQ;9TeNRv**V;6Df)W2C< zoOpg-H83|!x-hi*r4vvtVW>Wo%lPSNPA9IN&kUEiHr9HNs5H|woG`?X|7z+Lor*Khv{f`VFSU^#k=&o= z_iE`lGhKHs_Fia@ggmgBBD6;eF{eb(veYx^JVh9|wt+t*=_2vWQMf9whe_Jrjqst> zFljnduOUcDc1Ass<>3TZwV-qx!kAK(4xc)~M)kLWlBloQkdCwhld$FXPU4d&CVjat z+N2L_l2dO~Sf6HKo$}Jf-T}1>K}quneaEg7$;U|RnQBCJBRb87)LI(JQ4dA4Tn~~u zQhQVB1QCrC+5L`3mGSbUQWAiQG^trSO8l~keJe$CPKSbvH8H70N%z^Tr^<=Op-(av z5HCP|S zW*Hj{&98ipfwiBh^$tB|(m1yWIi^G}rdf+MM@>J1gXUq17ZT&(GS39f@zMnC)6EmL z7|aE$CTfeHnW)vn(C^>RAZ~_#%V7UCOl)<9_R{<1+SB`(2cpmoyUR7tZ57(}zc=HP zf9;p^=_7s(FXd~0c_v@G#^QG|{2X7+*BZWJ#%qJ$hwxix@k_&R%Cq@eo5gQ4{EmX( zSiifzmajbn^8(C|VBUcF0OpwI^0kF9ZkTeI2AB}cCK&qNg75t>&%(S6^DCG?!c6`; z%7R${<|{2FzOcLfAm>XdphItm|`!K(N`8^E%CVvz4g`wXW z_?{!}jrgvINyA(NvlC_?%o8v#z`P3cHq3-?XdpgLxL_`!H|8d<1jUxAV0E7&pxMFzaAq zFq>eu!`uP$6wLQweg*S;n2%tleJ5W#7G@z#EldEW6J{sOT`-TqdqZ zq=6}bDTS$r3BV*^dSPyZc?9NJm=|GQh50?qgcngam<2E{m~xo)FiDtRn4K_tVGh7N z1@j8b8!#WhOb5-L4C98WgrVPIT0Kmw|5s?$MmKJV7j=EHkg4?E6bWhC7HEYhddPZw zUeyL%-!6PtG^IVJTq6CG%Ec+PFW{^Ml@Ik%3Bs4*1Layg^d&V*k>mSXmAL3r zCer>0cZd^e^YW^pLdhXM%|~s6OWafOWCQ8&SCJdw;6BKNN?j}bqOCPT0lePgYKDru zPwOEcf)*8{R|`1aWy+VFxL7O(<&Dd&ex&aTSg&S3@qCL<`vtkU;9BTYBm6DXrx8lz z+S~~>xJof83Z$%k+G!JNQd~I`1D}SUf`8?NTHN$Q$n|MM6O{g~4&D1q((#irRi;_;874>PZtD^$tM7ls0!_6DYHi8^wt9DdB54 zwNv2EK6TZz=hpHhOE4UX_y-ttQ`5ZJH)ujv-s8%k&ZS(?5}Pq!qUAnAnV$ znA^?npzR}{7%n4Cqap$^n)XOuQyVVCq=Or{Fw>_!!|oQW&T+XWx7(4VD^2~J^quRW z$P8S~AipNueroaS)x^ND9QP#QVX~VrK8a_cD1~@zNJ9_e9$D21y-DQqtaJ-SYVB(l z7tZh`pfZU#FIarnXs=3_ktt%lFa4T@zM-Zakq4b{97bq}N9at0HWO|VD&(9M(q>D4 zF8$2Bs+cuZ5!^%^*$0d?ZC#%AC{9ZBXi;yiOW3O;$yA!NMDL{jZunF|?OYoae)Z_R z6lsmNL%7um1D|$tUUf8+YNNn%@iH4mhP(1WBzTX*q^^B=bZDR|28GmktOM9=5?ZIJ zHQIg=QX2_CZMsK$n0m0UqCwNXLbi$q>iOC$!p>J()#8CRpZ3EXpEca~(S)gZRHyWR z5SfjnjJ|Wp%v>&jWbcd;SDEX(t zN1Xk!p!YYXZ*v5FF(vQ;oAy41G~)zc11@DoJ4~EN?ntm*&H%oN1dHG(v?^g22T!!+ z!rrKJ$oaz6M9+6>7fm#|g`AE6hNKBSl(W9X60fNigDMJw7VSjL4LV*iY}J!^s09yR zr?t)SlQa=eR)evCg0l+iMHqO8NT`B3FZATK`zO|#r}==9rzY0w7;|z!(X=m4q*+GN zJZk=Bt6Q|}v%*L9GEMtB+>kMHm9=lNOQ7QwvbUQte>@Rm(dvlawK7bY*4~;Z=ALpK z(`k;c!NHXZ+^ekpZK4_=&5>(zKKZF0FgJgtI4dVG!o3wWs?HZI6AsEiof)SCg1W#c zMy=1}H~J$fJTzk*M~mb)0ZT_V4aLJICa;;) zEDsr>$@yTTwtG^uao*>8vWqs@LpBgEpU%30TqufNcTXC(NNpd&pp9>7t#3@SK3=P7 zFHMpRL=*a%Vjr|03SaA-^1&q4w9Rp&y|t;6*I+t86Nyo9jW&(lq6vJJt8tIJeAOHG z_clsv)AFj?T4}FXSyx$mo^-6JYOJqPA!2Eo_2;9HKmM3Jz9YZnK4nR{Rt!Tw75)=T zc#*waD~GX$zhVg||F7-j@Lx-RYxutF%C)Cptm&=!lmB0G!ma5k{P&Pe(NDpb8~%-( z4<7!hTe8Dn&Vj$?$%BW#`P9L~Uwt||JQuz@KF{G};pe+wFW0^YW38VRKam&9wa>y> z!*lbW`AT-UH9e*K!;cRhe$%fH9{$@ygxCJ&;OVc=3D1T9okN6Q@LSGb;qR%O_N#j* zyZqezL+@sX=i+DAd)eWS<>c>ytn^^`?>|KNnX_5Ws_6H*oc!abWQXU{=a1)Shv(LB z;%NsDf41P@;R_dMhv$}mnfu`3r<_xvp-Lamf2KlPFlpCuc|g{OKd2Nq%l$)P3Jr^70C81crVp|J-`~?&|FDZ|1ba%Yz(#`BwhE@=B#P0r~v`-w$Ev z_m{W$OZ6r9beItt|JZ*U9rp2Xg#nKh-t$K)w0ao&jR)_}?Hs-i-!P1dw=W0o*RSJv z#rS?2W|_#9|Mc$Rwjq~-Sp`#Dkm>(nrD!**>mJz2Zy&zapS9hrc>U5171~!}=%?Vb z*7IA~Q}_Vp@bCZs7$6!s6^8VwmcUW}#-Q(%Y=>6c5d z?EByGclNkHF3mRX@4o|@|M@)q0o_0}?6pjOAOD2$eKP(Ni2u?ZzrN#m?KgM4 zb;oDM&;N?sMT!e1;ZEIGFL~9bwY+-it4eFeOt$$4KY9HZ|A9Ltu3*RxHD2b1Z_=hs zBVDS}qj}D!oULQB)ozxGI||=0hIHZm&$?CKrEi+~KJ}?et@OA`?d7?qpNglxPyMD+ zTmOqntwMQNzIir_gT=FkEj^y=){lDs<-y@l_w_@WbTdie-VI~HGZn!hQce>&hl0iMh8rTo_8n~!fdz9L_IC&RrD zUu1*bMr{*K{y)JNAIoo&_IEQrpNfk8f-0N!%hSmJy>a{nlE;WYn~;_D<9ux6 z_&dh&Up9_^!#Muy$MH{$nZ#;Eu5we8ljrzKzVfbQvKSH{{rQ}clM%e_?8t+ zBXvgechn^9oh7uNjI;li_t^uNy*%fZ>Dq1ITJXld&&hF9 zeENy;0AFkriC=RAf4?KYAIZ8}%cK}6w}FD_B%?SRfB}ZkKt@4Fa1sAYV+Qr7OLtDV zxN!c!`TdrTTd3PaVH?74ZQ#j;yyBm(?mAJ3%!n|*NwPy3z9m3sEQ_+<7 z?cSbe$hoSq78&Gy`_C6Vy=gMLo6BqSzWw~-hYOJT8r+Jua!pg-x4v@u=GrMm!M2XV zU@DdO)W@?oUvWZFFdhp>TJ7@wPkR_wAVqr$+tMA;ydA%a4EyF9F{0_Pn*&C^ab$1L zQI-IDKTZbyXmYRbXiJc|^G}9-H-BKlv1VA8zXvbBLdi%5zjodh`=^ZHSc=}>jc1Y^ zy8Tz{`iiWfU3xMAy%G)`e1F++`!Pn^L?S5EnK*Fh7ncmwnn|%^4#h3(aB}F@zbx!u zVolnv_ayuwne^>5hOacMlS#+Bl70#A;C+ta^NfT9i>0nZPh7EWt{JGe`8y*u6tn^8y>My6drls>)W9qG$2(Qf7pL#6vgC)GyV5;TS%u*{ri?Tjh^2ICf2uv; zm#7%@~)*&+ZBMh9_sY}D*#TYq=-z^qeLq%f;Zr0l2~V&b84 zE@SvVss@(N9~~=^z*Vi{qFNd6^?3i><445{L_!gcu=Pu)53N3FRD>*A+q&P?f92@H zf>CsG24CiNlfCy`+o-%kIsJC)?a{t!gLI7=cEs`EvxNH1yy2-Qj>>35I+9lXaqEC@ zM|5-)sGdL*LFV#@X}xESt{U#>vt)Dij9&NXICy)RRMKR%9&rwK8UvJqSC;YO1=~+H z=q3!M3iiKgbNTje(;q`H`;YV=J>WAaJ&fx%t*tup%XHsG22q7GF^rS4V-3Az-{CZZ z@Ip06K@Fham_2Zk0bd(*A!AU(>Jh^_=C7-<@&8 z1x7O?OQ2m(D>UpFnB2FA)ULiNfoxwdP_qJH;tD+<%t_Mfj2a1gmj`NUs z+_Gxm7-RUc^r~$?42{$pI1mB2K9&=W>{#7r0xZH(ZMf!~L%03fF>;JiQ#^RzW^e^V ze_lMe!3?5%q5X=t`R>{Miwz`T=F1u-Z``wBYsf%?AQF2JW4N7$9xitK{gVe{2Ee$N z8c#*5PC0aa)wXgY^F%V<-D9Wcq&elTZPg=l4D@lReAZJ&xOvUa3Zr2;LMSF_Y3Ijh zZ9g(6HN-=Bw_eim&UcR6xgaM(7TxT6`1qk&Ina?{iVNTQFTPzD8Z9IWmjU1I*xGC~ zY9f_M`Q>rxG|D1nYCL<7zZ|;l_tk@S#sG(Ryg}S{ z(ep6cN<82A!Ua1v8pU!PnfG&%Ep0}z$#j@5F6E%@FRkvk8HrNhy;Rc-?D6h3XY*0> z+pjJkKGvAu7*tI4)Oc}A?jy4XwFPPhFk=xL;}_TeD~4mwtX*BkWMYYE0{TR{*Jm`f z5ksQqg>^$y3@QXhp!IL3ZWxHDk>!T>=WdA@Ba4iJ+v{aVys>xb!0EZcH1=@;H~ie$ zA2UcrrcU^wS|;&$!-q8k8;&z;Dj-NDbX|__H@tO9e<~Nk6gYYdgdbeCrQU1`Q3+Z4 z504x?&1gUQdN~L6|25pV!Ymgf5VSC3>2Q}UclWLf`zud3;G%GJFFVF6OpSKBR<_l` zXYBsgx!dfgjTbvAG?XKXt=;{T=(e-XDrINQ(CvQWxLv0iU7rR&vvXhf`J&+~41%Yy zfFIiDl9;c1-acSyQ3}np(x8G@fH!dFdtRPBGQlK483p4yW=70{E{VJCvj)yKTTaGm z>+lCXccMM5qP#wLVEw2l z7*JdFZWZPCYX;6WSWAHuz>;VeO&*ewZrD;k=rhIwBT^LaG962H23q$G=!0I(cA_UvfA@yM*yL@2GgIX3Rzd*X0*YPz?8bKdpi z$$fLOQp*>vjit+VcTL{CI4g$iKka%q=W*=;*DhC9!x0w&Y}@fjyrSuA-#%gIr?PM= zBgs5|UOBjCp|$fNdpk6YaZ=1KW6BC&*FW{9%d?u7qFRf(e&Mc}qas+^|JpBwZeMQ> zDL}Ycmw{78CYj?91<6&$?!iwFoRHOJV{uD|e%Uk9kX1e0_fJPvB$~fnK2({7B0NQa zzKWsRlE=>{U3Y2LaFvK-zUm5%DR$X&b^b`uoL&H_iY=x_laagr&+~>hWPv6lGHBO- z_qhEVvxdDyQV;7%dwVS270bc>wI8~M)@0{}S{NN`_r9jB)md~3&OpxMyI%j)@PaI) z$vJR{(Ofq^;_fdqnu`Ntl45WCe8<3NEn(uh4H-6g%jLtx2DH$g@32hvJ0HDp zcyd-k3)gse{z$XIHCooNBM+?J-eO=pEzf-!W6;RI)eriOzK16gAjGi9{63i4>orSE z_u$zOW1jx=mHX!!9goIDT2R@;$#{nyygawd&KnwsTt)^ek__85qqoYSuuM8!suqPD zzU}ktwrd9DUH)V&9t)Bvii1bK?CD!=pbBGpz%o#c+;I9p!e}-+452u(t>3)7KhGde zgqR|MtuJ5E>oE)DAar>ttlRqI;-T}6;BIQ1EL^>P*w zn)g0`e&2i}A4E%ob;q+n1`*!#OknG$PcZU{B-$|c5FU;Gf6vb9f#Z)gVnDR!2Nv;u z3&Vf!o^!SpW(8yXLL;i+M^Ep&Zl0LU<-h=KY09!w|Je zECiE5_P*!c!Vw5Lq<5=7i3bH_argXf%0Sqtj+zMZP8CqgiSK@=Wf<(VOsryb;b5E` z@9zF<-B9po6+s*djQM5PyXUD1{p;tcFusXM!nE(SZR-q}VsQ(%dC!~k`c5!{vaoZ{ zi>GY$8wjAWl}7A1NJi$`>li-9KrY?^!j#-&4u$vJw0^kSKrTi}O5QDp^?Q3`I~t}- zSY_S6w{q|7ql?1+4fbLexPQCXjlUdr-;ea+^ehqP58-hi_I>b63$E=viGAsy4&MCH zdGTk?a1T7wI;71IaRN$SfBzS>!8!AUU$9Mw&^^;3De~b55<4SvI0WLqm>Pp0+(vE= zmvOyAaeg34X7bRUlee8IGf7F=@Pqrp!*-5MuabpAMyETlYi4g^rpR7T#3kJyxGL0l zDc2b9l%WsWgE(Hz1wY((B}q{T8@V#UeSf)p%M3<_BzFnY{-HU$licJu3Y?Zwv;*%f z+Ik+ND1xK8MrXYLrDek!1B; z2?04`!F|6h8C=J?3*m(<^RLl?)toyPWP*F+fc<}2Ja`t90^XZL0j>0KnB+|!>RZ_l zsSlN636!g&hqlk{pU#-;0A(AE`S1_*zUd5a2Oe7EVjg~GZQm)M;+!HFxMQt$9JW@x z$^+kS9bCp)#c?dq;9(wqzPmS|{OL70*_8J^?jKmnwLyc$!x);lnEUrE-MB`#DyMWPxyzQ~z8^qq4@8e}n+@C+UGlrerfYjERU(Q?ySUF_VCy47hNt*yMco;P;R1pC)so5WLW+I`;i*XE44} zk!aM4uZLf}sP9N_Nqzzlbl$4K{@aAXI&MkyW;vYfd$poBEfb{LT*Q`zJLHJI?+5ey z78nU+r``A63%Ar9FPag#xDek?xzPm3U_WqURewf;O$W#!29iW`UC)-&xYh8g5~$ta z5%0U{l)f%Y5@WEr@6Ka-t9h_VWfIg0IIDe6bzSS13B-YOoKY3J2oJo6`HVp}iQ>TL z7Y$s%xe#|}&L=-zHWHQoxX=PToCNe=*WRr25R0WoDs2Z-Ym7< zZIavB|61vAh>NBG&T9YnjvhL7y1-UvfV~dfaYlb5w>Hi)hvKreAKsa`N#ll)uXdR{ z{ezFs>z~C9-lYd<3N=Rd2Y++YHFBEnYV#}fJapQ?1>9?}bSRchz5m_xfXDDveA51Z zJ8=sH`P3~D*RmwL|4)|=Oy}n6PIS@xpc&P||2DnvqN$XGYjp36?XOJ+z98?VZBiwz z;J`<|)3gOkQzOt6Tz&4|hWplml2kHrnI_stEI~-IJ}56K_I2|um3>Xq ziil}Lzi4aE`^vUs2OrjtR6f+$+I#urHkh~f@_Ub+QH1$}-W6qdAKNu|`<#=C5|HoE zGBVf^!hEWO_qJ$g-1T0fe~dU7rih2)eD3;>ye-Q{=R?a<#FKH}JZHeQU{qO{ZXmV` zrm-NFGyh#5`3B}4of}bR^4k2Nlja*?I0c18pB}<8I+*MckM?rByKg)Bx;8Tp&=A(Y zay@x>U-O>xPc-rX&quc=P#-g4{gyV=V%A4R$*%L0^LMn2&IbIHnawLLedQ(;G8yq+kDu+cGGoHGz^-v~o&gH;luc zy85CmV53x62Q8cA`1sVo(StQ+5O@m%@F!pH*?o+eV-ov1hQ7*^e>c0X@wikDx_$eGYfFyJj$+C8wja6s z8-WpP4l?uGem=Rk`GlMxtOt<2>`S+Oc*(W%a`Gmjs|x8Tx7kpPSbY20be@WQKkx+7B%kYbbWBB#4g$1|U=gS%61BT5;`p(#s{2zw6z8^i+x^tMI)wBlhEqh}XAEvcwL)g>v?Oe`TesXFcSC5eBLhXoq{&VElh@fbJgu@ zZPrjmPYU!KY&SHS_I~B8o%LD3n9&R}-}^+ke--+tS(1vR#6f#^rw3-sW?3%4x%%7~0!9JB_1)XwF>=IgORz-4{)$`YP7~hJW9QOA zFvN)ztphP9+k>+2-10=>pbbQ82DCvi&xvlmI(9Ske=T9A$o!W57xzvjf>9Y_qh6-E zy{LalR!BtF<(B_k++Sr4G1~o>7qsD03`It6*p!nfyyc;A?{aIRr~&#j^#d-V1O-9| z^24%}!MNpD4Z{#w)9`9*dC3kF{)b(( z7MDr0#GN<)?1JlQP#3u}HQMEx=H`9%TaQyYsvs$5y7}?ek-FS4InCVsoVzzk{eS?K z>9R+gn}0Z|zgFSXI_cl~ofEdtREXJ-!To;ocTXSH2o{lAnJ{rJ(|Kb--< z{6tvb2Hg98;ts4WxV{hy30W{M2MtN?^v>UI+`9l+5yLOIcY|xb{U>X0I~t&KfDoi$ z#lxB2{+HObItG8sn0@>6XY42fk3#|%#1pKvu}^Ww8;-#%F~XREF-&$OJ(Cm6oj>&L zF0(`kqY3n+&~f7u@A%0%Ta)NUDhFPCDHXyyUN~!HB2`irE<=rWykl$A&IK0WFq@h? ziFe$Z8LCC|tHi{-bD?*>P&zc#k}ZiA6K$pj^BwOO?Y06XWb+0udFO4b2a|+A2^4D6 zp_YSpJYI0!JWG8^kOXNSZg*7(xo>&@y3@?WGJ-1K-UjKaQN26Am_OnMEvk|@GPnbY zWLcZX7WS>Tppaq_Yav7X=MT-cph$#fWT(7ymviePYf`*T5o=ZIg?HTN8)!YMNXXCZ zBrAcsi5zCHez0u_L6E}GUMV*J&@zfaf8)G8HOH7iq-qjV!}C+mpFF(I5-2rE7}TeJ zzOlD%u9?!%xOnOZ8;7--Mu3d{<%Rtl5nF7LTLqan{`QK&&m64+NX||&XijwFZ%*p< z&rx9=P+^k(AFSO1O?sJ`RonZ<5A(O2Gp8sMN?;?((d{mEaEix&qz&Ml2>Fv#0uli` zc6DWTPu`xnwu}?CM&kj$nzA4J-Q2Bfj}nQ9sYIV_SCsSk3r7#NA1i`7{Ov4a5ZZ#W zxSzLQ3)YZ|>!6EbvpI^#ep#_~rA#bBB}j6{d3;xD$7(JXB8D)uCJlr<`9xv=Sx1X} zNp=Q>z^Jikd+d=74?+w@WhNlmw9C=@u@BovFy4}P_HyX)p_2ZykK+K)FfhXJrK^3< z$Ddfat9llPclgyN)#G>9?3m23gPed&$k{Mb8+iHS@?F?orP8qHZ>TFi(LZDJ4Q*4& zpAq!fou_WAKfWj*Qef|D*JbCbh*??k_e9lNhgC5(fiU#yDLu30R#KhQXk5)Z{0WG>^nOb zkSx8b-se^fHs%5%iKcgW#=w%?mdA=cEW`WmDCpgon>+OrLw|J3@AU1hxlNY6b+YCA zRU=o95v98atgvkO7d|uKM(@sQF+=yM_Y1Cp<1o}@hsyP2?{#JU&92xco z0qRw6tQwrAP@20Jef8&84jifa2(uhfVm)O)-g2k=PV6yrw#d;uM{)JnE*d&nqw zve0++&Q(J-3OhtYBnT!Uo-y5D{qDTSdQ`?ZZerr?n#WJru@FP9sEJi`{hF6f9Qd>< zF;@rus_)beLwAc)K}P*qCxq#(M_a5-1~%cQLhDv4Dc?V4|#+fOr{C}xzJ*VQj} z4@OnnbdN^izl5$WI+7F1a;}-NWA3b?uC_=Jr%%*o{^pU3x3$hJ>WOEtJEQhQJ~(lY z@2I6qE1?(P1oeBps2;ox-TjNRvu77r1Dev1;kW8Vbxjp=h}T0!6|5Yk-JaNa&xK1q zQFO=}sWiNx(s|%@T&Tq!16df|UxEdWa)=?ztu=AVCPmBB=i7qRtu5gu> zxgGYh%3`P8>8ymU+*M+CIDC$ZGG|p;MM=fwMYujcO-Ep<9z~6$Hr4FMHkr2bTXU~j zE|xEc{~X4^VGIBR<BfiR&l+X2O~Y z`|>`Ow-K*fL;t_#=~?2;zoFJk>@l4}fZ*Ct`yZtfFu^J%kOG9m*guSc!x%V>fx{R$ zjDf=#IE;bA7&wf9!x%V>fx{R$jDf=#_+N;De4+0@Rhy?R$3;egOnQl}e&y<_#-^H; z^?0U$FBP06zZ12&T0^F}d97^~1p2l*aUdQ_14n97n-;pWsN)Qc^e7<&hs?Guh(iU_ zRCrsvHVOYon-f_s)acGc`pN4Kg}t(P!JPiC@G9ZJpCb|T$>|?GdIY{F{P^QzaoAyY z^QldB-K*Vm#d!r%TELI=7TA`3zajbO{wSWcOqK5N_b>(yW8g3b4rAaj1`cE3Fa{1| z;4lUbW8g3b4rAaj1`cE3e-8#uhR|WUwn~d>K`pLzXbCN;=~@c^bS(rhr)zau6JE<2 zD{S`cd~LN>QRzJuuioqF8-97tn(J2&OrBmo!BhU#o-gFJ-re@6*fF>M?u4VB-kQ8- z=UMfR``-Te<{w-+anJlSj=w?MboGSGmJB&xI%mhDUtDy>uevWe`*&~Fy|Lx1e|Y!g zg7CY4TKINVyyL|D=MLAHo>KJ%5gA9x{i z+jA|i9#}T%jGBe>e?0HeFRcFwUS6qwp?}J4uYY^*pTF|v&-I?Ce|F2ae`ee7Ynb>- z?Xu_G-b-Wq?%DD2sh|Gcf0VrZ(!yu!2Bs|h`Oem>oL%pnbz1zlo8Ns=>x#erpHDnJ zP`zo}$scUHXW_q|+WN*7;nPcOC!KRe`#HyDh9A6O`Q0`D8f<$j*cRH?cjt-o-~H^T zKd70%t7_r4{5zVL%}st|`{Nxy|Nft6KKt@V6%~tZ1+RVf-0u3{9kJ-x{Tnt-AKVtW z{iqF&k2k%&`Kam-Pwqaj>>bzXZzZM$Fp%Y~nxd_mr=LwVJ2pFiW7Z`u}K;$DB(QCGje>|b8FYj|PjguBo0 z{o1k@?)>W`Hs7raXWzSG;d>`NcJq~wg?{wbd#jr-f9$zc-*|8B=YQ&b|Kh3NTc$0m zyxRYC%gr|xoISCB`?3H2^1tV~ro1&Lzb5e3al=!V*+P5wKJ%vwHuW8yKT`kpBJaL? zM`kbGeC#DhE!_ISUw*YJ`+dhw_{KHK@}p*6)4H|fv@h>?`~ClXvE!XLS{!pv zcy{C7JCkkG)9-A2Y-{YRJAZn2U(8WZdeqlSzA|;=gn{RFU-!#xN8NVJ{<6)h^3OQx zv`v+^*|$G)deIsG4PDj2J++B!o+|kQOqb+dj`;`~NCH(+DIYkRl9_lOU~> z!yyEKk|%+Nxz4D-)^Xwdvt$XO18fhVm`lhXEpGZNFRb_*vO_ALab)BarQvQB?pLpc-CJ(wGtgG!Y`f0xG|4o9uhc;;wlcs5^(_lMPq2~fu0WQ zlxl;lf;}Z=qSZDDMncA-#MZ4~A?W;E10NRaLf?ih+<&UP3}(zE*n`Op8OfBe4iSbZu4UvaeFM4uWH7m+OG>YNDMrVq!w&ApNNH@bg&nEY z;gGy0Cwq_NNQ|hflm%1PF)8lq#}VmfB}`c<6Q;=Q5*89K?@!5>*I5Kp8o>nU44YkO zv_b^U3W!KlSsj!S#s%mxiDE24As$) z`pq+(eCo|*FkB?&+H|b|ar=0-an9^67=H;!dZcc88W&P}$y_2Rk zi`euf2FFJ@K((rqok>$|N3$uSv~=6x?IrePI@2jXFbk4o|Jw_>y9d_*QmxRRBK+vLpL%cxPogRsb2{~Hb7=U2 zzKg*Ii%4Vor(8WK8EU?Bp_Yio5KmQK^kwBU^c93qoQ%+^(t?cWpQM+w0Hm={fzAk6 z&=_kzMgOtZ+vxQ=Wp*+?@7eiC^S(?Zl5R02lUkVf={_|tQ8@IA^RrC*HSNddcW^k4 zz9VK)Rttf@KK*d)uE)ph%gd`}(f6y`&tC8=D@eN{ge-!8srwm8UL2mGFTfe=H`NhG z{CMr3_gNKD*9$3MB!0Yo*IdJ4U-U7S-@i=#Xy2|6iS-%7q4ngl^HpSab znY^jf2IK+@)f@96ZonhIoZErMb(@+|x`$ivNLn!Y!q*_0YAy5Rz!iOLnm*7b%Ss z$LoBtb>P!tkV0RmsJ0QQXLzn$oTVehzB|Kqu?5+yH`=djoY9_|{aoy-G8BE^_pTK3 z=)NNM$468|WkO!>8Vah{Tpdogm!h&@jP0 z@BzYbS8;Lr>n6-wd^v+| zPl-}x`Gi#*Oj5Q=zVV;P&-3FH!N7x*ppCCYDMdezvbz;6WbY_qWr<=O5 zHjam$QD<{4XVXo?lEVn+%0qyGlz>@q{&F%%{gxe_&Bzha`YxwY-4$+}4RUPP3-Rb9 z;Ksx4huKsJ+MFo|A@=Oq2EbyNw|;!u7qk&Oq5?xSZ&X%qEgxXqIrJvlzkyjgQ@i=( zlT`wzoP?6pAcQSx6U$$VX>^U^<}oNj9=!Jn=t>*g`&>+xgRk=i2@KuagbcwpSwfVC zjg&cifrQ+DHUskSL&|2__&Qr3?SM=zpK+V`$|jFKh`Ny_h2E*+i-ySGiG^vYs5ZAW zK6=uRNC?4AN3cyUyLI zgYU~P7@L)`JV)*%;-}-xM5szY0&|h!GH7c9a+F6DL_lCKtExuOKs%5RU~A?DD93vb zOkZNUd)=GNdb`Km&DQL8>R)aNaH+}mjcxXhk9*%QHR~}7{;{6Eb5h_YwO#%FjFB zHSO|*5yx2il_fg#l8ppYp;faS< zCAzBD$j077_4c$kRp_y?LpS#&wmI#W!Cy1%vdaKVxuBQi6|C1e9@wISN^~;vaYLOE zY6Q`*AZwI~Nsa?zRJpFIrG-3=3NPET&o}o`c75KG&+7}UHprmBI9D1|%2U>x+)w$h zs?jQxv_S+ECn>6v%kpGmxZWC&#XL04igVwPyM8-Gf!Mq&qfA z3c~yREmtu@S%E-Xby!ga4ta|H8ev+jhm($*xVUTDMedbWz$JSF1PtRd$40RhmfWTnR-;d7| z??EM%2q35+k;&=zxEUs_DB>h^;Ij)P%6F` zMDzDAuNg0wwj|Jb=~P_RoBo$?W=~{jPa%b zl*{}4z3WVuztwPqDe!sK`|#-Ul%@*MxsEUj^`+LlBpT!>SOME9Z3=godcP*?bE+bo zdpZWl=)DMrF7OK~2uq_C8%!`|{HMTXPv7~~N zNcOT7R|fqYdtf)az+-#9EejtA`==3pZ(HHm^~>AKS?%SH?ZK4ky;hNYu|P>toF$87 zV(zDEtQg3dnES$Gdpd=7UeZ7d_K-+H6om~Y`@YuhAVb!+w^Kg1EkzJF z{D1bKYOu)WxOiI3Fj`U;o)a>Ad(~x5FlT(FmVI0fp@VsCahdJG6bI~#J%qJ(!OOCj zyJ0rnWe{=gX`SuC)J!hJGAE<~pDrAYt3)XRIa<1iv0_v4f14b1kF4&~QBXqgWh<-{ zc6CU==t%ePFMp6iPtXycnV&?9!dBrS(Yf3GwiEDFPrgXQ2U{+a$-8|NGhs@{tND4B zGh5N2)XEg<{GL$B9sup=fwTp-#h6lmH&?ZHUSJ>I&nffeD|2(HT&T90~V& zSBsd00GHr*u5V@g13EOh6{h!YQATLSzzBzU>S>pDmZo(fv{-P9c|~Y$Fong@R+%aE z^$8YrYZ5D{l^L|bnKvRLAHAyR#7=X(Tp`!je37^va$Tm0&Gv0dsYc{>x*A@rW~uId z!QH`IJHWXnQjt}X=jpnBgk2AV3)yv9%~SE`2I=B8m!$k>%?=8ko6AgdaJ_Iw+w&+I z!AS%_t1@MC&CS!m{UyKVFkzNq5^8cJXlC1*SjL>CnZduBP9n4fQ)|S7=lC%n|2-p9 zI%*P)(9ldc3JKVTL0Wh$)D7c_pr?#y+S4?q7-QZYLU^9UdCs}tAf)eZ)hM9?QB8fy zG=iz&b8PicJ>Wk!!_Si#a-N~UdO`vc>`jwuF?ev1GM>igrDzN6=KEALVQHFEfii|1 zA7RH*+2SbZ=zL+nr(LEbGPUrHJCm~CknG7A_h+E3faOjC=Xx`* znPS!SaC<$bDMsuThO3NW7{dyS6qi*T6L2p@h9 zwyH=Ub82p44-G^#NfG$x``>JTx6Na?b~$ewbL6DvE-!(~VBwaEkf|fn+#BG4?}M2S zWwpfNSGXws$OvV*?UBoDrV>V}{=JI(>dueP*lwQvSf9&Q_@Q}i-WPRpS9Pi7)YRmwsxNbrN0*q-G&nKRUjEo%aCH z^xk>kF@4#dou$JoiKd{a35|jB8{Furd6yD-+Q4oWvC1ZwV0g=ft`^M3&@mv51Eeyu|}n4nFq2M@YzWaVS-S zzcPjm`S&el3cAqSF5o(?_{@vKzF7M}yB-GrG4yGg-kfOM3d{Iyo|rm&aVF-EH#e_x zyA(M@7r_IVa1<9BuJOuK&y(XRE;5+$`SXmG_Yy)nj0g!L`I_YM%}mHttlrc-BpJl7 zbjl@%`Dw%W*<(XL-6P!KK;s42APxR^Qdx4;G4RW+QEWob3l|r+(?KNCC2heedA!@$ zO~CCZgT~*a=nXRD+)-@%Y{_|-pAk0euN>yrG#=0%7+Mtk-gZa4jELMREwTSsxosqz zW(vywBqg3g__V~{S;mC4dG0}}R9T=)(Va!^n-6EYOgYC&5MA`V%U4%lVh$^4X&+4E zfmeq?E5D4Px1b&jx5Vt~`A38hP0jNaH^-);qPFJ zAd}U4;+Vp;68Ek6O86_a^vcE>6%492I*0npe}U>*WUDhiY_t)c-3!kU_8M)>-#}yv z9nG8$54%K^Z$`{`_o&nnFnE+4x;lVYeZk**2h=!dtz|Du`j{48GQd3@e^h!T8hnzq zoz~(!=4ahZjr^5?;~TqoLZSK#an-6p$HocuV0AM6C6DTnG_Ac-m@5eg3q_IDJc+Vv zP#yk3Qlhb$IQl0$Y)dTAwL=8Rs}!HRr#w9CR$`J&p8&wWons4@YoeliG6JxVZ_OXX zJbuMvQ?QU;?eHou>&uxovz?W#T&^~=S~dQ7+qjj#h(@dJfcy;1jriQvb@)6JC=rTi zAE+J~2cf@=m5=s@0_3~y6lPt-uyEN33iw$!NX2x0@gNmWX_oJ1`d11+-9vRUvCy4a zPs64|wV@+813W~ra5HNu*k#g&ehg5xq55lfWyC^H!}QL|{Vs%f$P`6q!zyI8lo9K% z6qqOzK&FFR(h4vv^8kVE>1wID!ClKWnxyp0d>}g^8#g2774pkx?ingOH}*MAWt;9% z_6)SF%X$SiO&cFPa6u`J>)kGNTZXR>eBAh;B0G6gS}@@exeyCab7u8G^t z*Pwo5?W!t@vTj`T2^9Y6$GQZ+T~?mzRH2rT9S(oZevBTDCn&lb!QN=yff;zy{>=CxV(v*DCi z6gUeF+WOTT%8O$v-w)u|gQnG1j!TFXs*0>*s`O)`$NrVpHs+q#Xx)Vr(2Mdx{7j%{ zTh92QmhQN}hcxamu33_`woeY{ueueHjU634r&CR6+y-d^3rIJA&la#Z;V*0!wkcbp zQlW;Y)p|Xvk`38~@3+pxQe1ZDS)5m~`+qH&9ozeb-eD?uE^@XkAw{S73#~4-GFMbA ze~x0J?O_GA)_StE`7Jb7WR$B8C|y_F58x}|us4sD*)Oh&%KkKuguY_4IMLX=7FBud z2=^9&p-?r?mt&o=d0CCshB%}R-^~Whxx_E*%8fxIKnxLivV~E7f@K_bEn@cu6)2tC zObjUckWxf8$%w(MG9d2rOw_qKi`u}i&ox*Fvo(wN_wjU#Si_pdq6oQ@;VcVO4IlI? zrB4AXZo4icVi=;m{eWk!Ar5uRCJzxI41SSVjoa&pMXFKiDDN(-p|%S&@=Rr(c*3MuL7*Q7#A3H8LQRUX`Qy0 zwJ_e=;vG0OH)Urv+KaxTX-xiFzAmg~95lBu)a)J8l%{BL0pKr`+LH@G3p`J=Hlc3wLZ{?%$_(ACh59y9Cw<&0F~dTvHcnW)`b;_m0b60H<1-rZ$nE#+twEA_oOq_A#Tz$U6QF% z@Tt>{NbyOd)U#L!yMf5rvaV))U;!H!o}8Yvi3$({ysx{Ca)XRjh=l|>^k(D5B^Q)u ztng#0W1a|otyJg*JP)Aijv7w3Ard;ab~dQK7su3U5nJ;3i4#3L-qm3ROgIsh^F`)k zCDtqS#dUoL|K3;EM+>cA%&0ySx1sePs@9+a;TPLluQ;yDeqEWaekr~xP@1%a)uYPE z9-wH9=WGxJ>r?D^vrd!|*#)!g#&P*+JBU;EuK5aLfqgP~5QaGEqLwo9~N({>sf`S=Iz-@+Z>9`6{}Z*k(ejsW=StJIrfSv3x*tMY_A zd(EDNepWvipI0s6RUIoySQ&uSIjfRR5|cSge?sGZ#5i0Eb0q1L`=|~2&eWIDZ~xfb z{pK|eH2vjk&|d8;cpO^a!_$Nt|HtB~v$E1&$=4P_=SjDU9zq>Yvr|Tq%zTo20o!9$ zxTCl&!oZ-R2w|ZXAPLi%#=5M(*Ni?elpDERt=E`oWBkmB%{hje_!kf5Z*~t=xrcxp z)N38+-KyK*?Jz1ZvwlH-iBmAwv#33h0Ii+C7r>4f4!0Gwe!eqNWGuaVCnKa5ezIE| za%ATi;7mBXXPiaE%37KDd90PpX)JAK&5RCJM2gV)o)WVOL#K13D1`>j!Xt#|FFxHQ#ZKP!${`CTBF5J_zuDnQR0zLi_jurjE!t=;GzWglCV->ES>?OaK1jE+W*) zD`Rg&4G#%(i%0_y%NDH1PU&+=WFWG202APt>e6t;KOtlS4TM32gRqem9N6C%5Nfm{ zLD|ODXSNzb8@o$69VVh&ofv7O8Cmfxfv7fCdCy2pMMJBAfJFG%wKiL5_4At-T>z$L z{}4X*mHNd-Kfw6ne))gw2KOhnS~oB>KoWa9>Lq9;35VP{;cv}315>}FIKFf5_3>F& zqzSC&9}tTm9Vy%Z1{|C~FC2ya>@OU=`uU8rRxj_`6?75bOD2 zGd)0S`bboe)AB-Unl$Y%WRSldUMQP2mN2)$%n9XzIIi4o?mir5{zvf-r%7vdZql85 z#%<0U3Qjs2&s^3BvfjqDWEB7^-RT`ygY-1tn^q26VFWBZRtWwfECbcxGd=hpYxTRJ z2at-UeV7-&ViXqoE~U==xvqtM%^sKm*F>G?S6o5-LbJaHXrJpkSMMlh8Y4{nJ=@8x z*bA5Y2Cd2+r`hg^T{0z!0qw8ZSj9zYy>_pT{1vymC+r-xgJI8h!*3ONa_(9)e6U-> zf2|%(XpEt->Z!NUqshMHbr*4Gt3q>1+gl7l+u1bGKa)1S)MvN#T2K3#|E(mdiRQ22 z0<8QSj~;WT^U>kcvORAo1_3fN+35Mty=D^~d^AEz+JGMV+xe|Rms`BhR zNLHi|2KIh(wf>LDXAn`3%I*`iDwJ^UUPNZ_2jME^EpO9*!#S-~^_Ioi+0IAsEn_xz zLhdN)ac8NnoU4QIN$q}V-e{cz>sLw80G+M|EHxEL^1x15=g=G%<_^`Z@P%8D!RG7a z#33D$sl|3O8jMv0h4NCSaSF_`;AlLTtDyJ)ttt4 zeHov=21&9(h3^nR9tNQ5yvs@$9LF0=^)0IIChwu12==l9gOQ;$1EfdH5r>@%)>(Le z(?QV|G$vUkl9ydyyK=tx@@tUSsn~0BQfH`kr74@GP<18T9BZ`hYQ4Xdy8#(C6{HRDb#LsT0LWn5}@tA0T zPIY>>#qM!IN+R;5n@e8Dz;VE_AlPpj-~(dz1hU-$q}Nh-Ywfm$%{V~1ke!Q(?6C;< z&GD!X8tOX+Gj(dAZaHA8?$-k3+6J+DXlpyL7CgBksZT2M6KM9)X7Pz|x1Z8rS+Tgw{wBvh_}oO;Q`x9l$DR%J7|#N`4#Wov@Yc zIw7yp?!UQ5$({L-=`1M}Y@6qW-`PDwRWQA5&xg2;EuG-kw*eXl=13TYUdlA}2VW5cJ1JzES+QVlhq1 z9W^SwXci(9F9uMqiav4n7Zefqww)?ixga(|HqLFXlIA330hAuI)3ZkTVF}$t%~yRo z$aY9GH^Ar%b*-k-7bc7>*lNbigIyi;P3Bot!?~T~sKK(l^)qZGQyjAS*fF14pVngB z=qDr$F0Vth-Wl8K7eJ19R>Wni@jdp=r5d`G99#cvF2uO;+C$1bvBTr&4Igihd*i*# z+!vg@-;)9u1Pq{XAz@J&LogeMPn_m)&9iV;iUo)4MQ)Y`Q1NSB#~s6=xCV`{upe%O z4|uxTWShrr-GewqA2bNOnV`XLuDSL_j_2$?{wwmT2ARl*2h%+lrs^f(x6|#R`k*^; z0zFg-KP6zdtHd$5B(hO(0bZoX&a^c~GFW|Dq8Wtv9~oA&h!$G(b&g?xY_FBn^I`>~ zf{}R0y<+B3^&hx%gor@5dTQ9iG@wyo8e*50BK}BUl~_0`-Er3fO^6NntIg$wa}K)X z|8kORdEMrEjM}+ZbM3b~RpYs_Zh-)S1ebDgSgpQFBw4^(y%?wnJ5L@$>x~#`^XvPY zSmcQRKIeCraqNpTFs9T6w~4z;ItC8O)L zJ@fQ~)i{r};d(7&)=1}a^Y6xO;Af!ye}^P&X}-G1yJgw`;y3AK0QcsnfWty~Hyxzn zPK{E^GjXL%3K|yAC2bLCTjJ!uT^&+rx^(my-Q9uy6z9EPf)DsQ{-OF!aA~7@$ z(mq61r{7BUgrr}%`~L?FKkl%Fb$9(a$}0>2?vfA)h{&M_j*zf`F+fsCz))mB1`rbf zIwZ+JGIXE-V61qGafD47LH@db1KS&j`!#;(sFo)5N|~I#X@A1Kxst$DiRqpekoUTPdq6=AxRX# z@F9@Ykvc^fZZRlKLvfG-gM)FV-vJGwK}Qv|)FGlMLLOi`veImtw8zO@8NhILK!fQG z8K8R{Ar1q+R}J(qPLH)=Dg=@VNOUNJ$;Lxd(lQRF9@FD4gjG`itHt_qO(D1dloEav zAax<@@xP_x0jt2iUfeV?$?Li#8!lET6(giJrQ=$x$H#^a&qswMzbGl=zb5!|cfJ$y z)*fi?ym05{4R8CKxCEH!VgL9_Vm@MKK4*4vGhx$BPhv=F;YCigagJ0 z{urryP^t2@;{*Z_fn`XWdc*1S(i4+(b12t^LTwLTzSL7%n)N?)-J-BR4X0ZeseqUS z=s6vLF+fPYXv9dKWY4vxj%D2RBlGCOALCVj4`oRtT<}-)WxHoIcH)*%O37tmAd>OV zwKT1&1fU0&NZ~uRE64gpdmmCT+w&e@5|HG@ByL%il5+(|?d#UIGpLMLK80fAP3XzGDLj<_m1AVWXs zWLH7f%ozgl0STOtlXRIe(bcwFKU*wE#8Y6*@Wx5HZOLnr)~X7fEvZ-!)wpLXCIWpK zgyayoCGJlrXgah_6l1X~>+s`A&ND};4P}BAIWFhlR@5rISSZp2b}P#^<@1%M15Huf z3Ivl@Ns9AR$68XAJ{|lBh*2DZXFfr!S^|#~L{OYE^j67P=eU8u*L@osC1Jh~*=v_jVI*Cr@ctEK|Vq*#D(nFt;mV70d)$CO zg*r_HFvje@@-&x>!`(`TSivY?miDu1_C}fu$HhB^)`yZfK((rIos94v2%FMMJG(6| z-h1$!5)?9->3I-v3j%5G_I-1iyl>yTC`ur|hG*G8m-a*b>;CEX0VA{$Gbx`{#&|_& zTAW)VD6KmuI3jvW2ky{prk7QE4J;#9VwQ%fh67{|q5N%H8udT)5`2$%P{njx66jjc z*j3xez<^lg^zA*2gCtC1)c-wix|GPVZEp^9A}Fxt-!@FyW?{eHHCeoE`}2*R1ZI~g z=_}AC{z&Ch=^hF~{9lv}SkMDNPUwzgTWc2>f@3kefjV%-I0aJQKpYA1iR9dHt~5?M zkZE-2J*gs1^j)(u8dweGMI==g0-Jg~rZ;e|L8`mQMTU2{ ze1A-;_=eiJ{48`%qH-;P8c(_)OXSTPV@Lk%`d4paDEyga3z&T&T5T9y(*{g*;I(Sg zW!5rDYAiG^!6zve!A#dRB3;7kLez@8?a9lQ9t<~HQuZc50(AQTsS*~^W4 z);ki!l8${(uXXyFRw%L67Nz1T$x80k15TsbeXy5}P1lZ{Brdb%}4tl(sjf z{>Wx#(65oa0gU24B;9-Ivqe5lCtfn>l3YZJ>WZ@ibOhrXFv)!s3Lt{>Nlcgw)T>pe zSU0*9RyS}`4^cuZ$;u!G7E~IM?#MwwYJlk2#us{P%>xsnOdq&-js-e>wWU*vnBVoM z)Vb>9UZl7hkIGym)!RwWS^2P&9Mk*Yk-Q*A5d*yH9YPM}dR|-bi3$lt_6D$f`z5$h z=rF=Vs05xA@p`!E-RIvnCl8NtyfOKQH}}7EB}nLvS4i?)vUEEbr?+45P@+6I2}Y%a zn&%3@%}5fa7`X^V^+J^_k}Qyjf{2xIsMo+HzK@;2Z9yauB?3_#swQxE3>^SL3dZj+ zJ}se7CVzqNulMTLzz!|LcfSePj%)%xV2hCMMGM8QH)Rb~hcAAe%#U#(3ss-CEaf~J zih&~B&`#+?>MonX0v-=W4j|Y-Ld{DA`8Xxx7eU{P%vSlffKf%^j;N?QFRXEz46nAi zZFSEs^63axgu1FnbJ_#YID=6U`3Z0uEN2h5kRXcFQ-l`0f2G}<5}g=tt)A$30|?M2 zi*m5ZW7-GU#Y?sd+wB)1hpghw_}!xC(#ayZ&=`4BvUQ>J>~WY@0K#Es?#_JmxEOX2 zWa6Dd-de#fZwu3U_^T>~d{Oo)b{`^+X^quqeJn?{xL3N@3k1ov$=t5*4a0ECJbUo#59xLyT^~^?R2m9a4*blY>gC_3VL~7%Oj8^{M=J1)NtRNUS2<(Qtrj zE&e>i-;uMjKiAq1kka&5o9JdHEonvg(+upm9;6iAOTNJ_nQ@FpH)HiY?0}<*1~V66 zObwV<79TC*?m%{pED=ma``{{y!2fZ-*}U#h-VT@&Q$rl38OeBz0n5O%0M)^8_0F1r zq_wa39T5vC6Tw5t2)nGU2sFw-jm%sPWx>!IJ}r)MZKerOdXL{xswldN@Hs{ao;@bQ zT5dzGGsAZ@02Ctny@-~=N4_rw-rkHL?Hu4{XB!y@GlF^2mEP^7o+{~JN|BhASaL%3 z8dSlj!jUEFPoU0zz5xTPXv zpPLmL!xJkE_0K6JB_Gv;lvwK9F$e>0_POKzV&Zo?LT7$3Pt7_VsQ6%^WgnTjR)bWz z-l-aaqlwSrg#P)2 z&q9E=Z(rB|DKGFHb!=@LUrqSde*N&R za1x!qfBB`fE3Ox@FJ-X(mr>fsYy@X?EDql}CIW?Ku))$z4Se6O0LK%JGRnLVLv<90 zwd^uuc3nDh8226QMTTPugP*;4QA5+=)y$M_V?F_1X7dhS-R{N7s-Hsf4wA`$FIBWh zZw;JX##9XC9PI$BRKYZ_8eyHLB1W19C7K1dHMejFRM|#kAFT2RHh0uko!`u&l9iMu ze2j#&)q%C!>p8iJY_P+{t%LwG4$)IxO->a%etU4+;1O_s0OQ>@A2ZK{TsMqz{YCou z`0@eU6WfaAn^c>zvxd;FC?0uE!jwCULY=h(h&?QUHjhkFf5C31cwfQ`Wn$uN6mmxW zJ$485#=mR46I4~eZ$BwkTfHvR-I3sJZ`^j^3e>b}ssb1$)PLZNxn03ccAbAZ%HD%EoGubLW1+{3prW~^vu_zsZg+S)Bll#O1{{9aBT@T% zS8@=fd5>UQWM4={BcVIB0wH|_7@IO2G@?R2Nv@alu`L}imQE!V*IUce0L>dlQz3Mw zn0c6pLX$OUa$VRhkkPdh2sI5?sSZSVQ8b@{K^K|ZJD^tEWcZHA)w&4xotaf58p$GH za%)R9Gg^~I?Zf9Y4SP7n!oNP)H6d2@wgWnJ!$pUw-fuw#9{_fM4s@KN%?C9QjZGFt zTL+jpNYw zA*6usbPYLtk99z8y>1IjT-k?9$omS$|fEBfZScE!8?V z{J>K%o!0ncxEX{Jpj7+KcE^)dS3qHqk&uvo#1dIdrdCgy9p8HuI;-@1?pbStTKun= zK{Sy)(1?luL$L1_?*eE!6(7wSE1`m3ic>ELKFMWssL7#x4 zOH%FHVOaJ?T1h|>V#-Hoi&0((7%Eb94$tk|SC_?{C1>!x2NuZ$4j>@sNsyxPH|Fpk z9r8V#l~-HyqsS8wXpS9=uYbx-@F?4yGx^9`rGLQRU?9UX2gtTw-qKtG_ls*Hzr}Vk zZWA+2=wGxiO1Hgf{Gc*#!?OlUynjax6grdpHgVdQ7=TP_<5oBABHN}uNX?PYWj|4xo~+aHMMIY+f*#GM{FX!f%j>&feUR6L?*iu><;ZdJI3kf|!mQxMWRBbm*U#5vEG zl-*}Z)0L^}ZrhIfqTZV`8nKa|Bd&dWNmy3}poGg4^ZS{*%#cdkPvi^Hrc?tIEGspS z9AbnUsxv-DHV7fQpoj&BN9SWTlq$AUa#F$o9ZAURlYt{*F^3~>pAj#*tfvoqJx`_r zjS$t(iN!n|k|JUuG-cPtG2;rwiBM=E!2t?%8MW(nBhCFuP*S6i7OY(5MUg7JcA zu(gj-$L~ODR~xQ@RT1tno5M3iZU z&Q1J5#^GMtJc0ytt<^o>k=~^sA|=nH?4Y5+BQtbJxkx$Pp+X#YhUet)T6)@j^F&h% zpOvk{hy?%JQTC-0R6KFf^4QIwzfBH3Mi>`#F#9A7sd46(`%;5iwrGaxoed-^d@<(M zTYnCq=_Rq5XR)bY5D$ns;u_?yB|!~NyGCh-x$1X?_85;m{58I@%g>QBgIvWj^YZ1c z0tKM#u)9}`7IJH{c{v;zFnrRicr{2c?5(@L#yjj_X7+C+k(+%8O)$N8t~*y$v2;X& zw6EpBJAnR#H_@Oi4@Z)H@h4|`67D9>N62Y1y*}q zN_r>H0~O4;em7>Dj}rgb?EP<-)9RlP`<2SEMLOQI)sG8jt#7i9t61P9Sz5g)7uW@4 z>5g!alqJ`E3gQjvpFGnjQg%b+12DSLlzc0>^)~-@KGKMdlZ$I?0C-F8RzncH2>u!p z!zzrf`)VG821X;oTu84PbR5o+7zXC%6R&z6v0LyOda4;h$FI$%now>TW2#jnVndPW zB0IEY=JyNmVAn8R0Qb*Q0?u@7J{07B@N=*$NJ;F>T2~-WJsV))zMecI<0UEbb}h8~ z`ozj|#@27$o3~D;5^4Rd+2rn&0bzstU7X@KV-A#Yh=Xyvd7GSY_Vomt)H|z;!!tar zx(bi#$4Z#&sipXoVBCfu52!a+Kl;6HR8Bz>hVjb^ujW*MP+rze`h$aPQUP3XTF5|f z62NaJ3&MydK{+%6ibkXLvXc?nwrrSO`p}_`P4K%8A+EW^k2&Vx@bzC?JlS*-xJWx^ z5EZ`i?xE1A{)hVoTlFRM-^2P}f=dX#q_R7qyOP*(2XC-q?jy8chPqJdEZ#Xu@t=Ne zqH@|Nlaea!{LQ$1=x51(Ycme>(qV+M?Cjq`uV+lL6RIs&CD+&J{l~w$b*O6EU2h=b zU<`RcFGbLozgK-|gA&Szy+{h`PGXY-5Du9n)6-WfEDn!X2`BP6FSj*7{FG%_WDIasDN6Ml9)mtjGMGo30$#g9L z%cpKib+$ zL4ubk&uUi_BjRkQlMY;*%Y<}IRQs|mq5PPdJ3$6JZWmo~{|#KI_x;YaL*~zVd=}6% zNuSe1CuY*3R)VtN$;K6gL&7-@|9w3`{f!G{a@xcN{v(hIS~AJ|=mVJyL$>^H2mi4UTs%`~3gJj5jP zDyjI3ozj>MPAl4G?$Vni7QNCK*kv_`9ovjFw;=cr_Ql^$$8UU|KdS9to=lS=q(iqT$ zjZh1GVycy{w9ER!vpQsE4)(BiQgqz0v8!=8`1sV}&wX-7o68teSbS>-$Hfw7(206& zygW0pYH2KbX0}yLG@`N1vNfnvp0?(3W2_CT(jc<3^5h5!&IUyO_dGd1fvwHcG2m+4miHq6bOJSHvQL+M`v8v3S7gSZ8pWz&JVXGv2_IeP*Oo_qmSAs=7N(NEthwz_O6PZVer_431|>4gX&Un0uhDuS?=APXN^TE z!`a^1YSnjbBvxscz#kL2#8_q~7?HH)4ww1m2i2YMq!w`qroc(>AZ+wJNN#WxOri3| z3(ng%3W09V73fF%Jy>!ktU3$(@AiyS2oy0O%U#~{iJTgyY^tB1@!&b9>4xGPhTTls zPOhPCzg=HTs8t{LlMQQ%K9bga5Vv0=7TE=s=8r|iCWq?#ee&;6=%3FerZj9_&Uj-6 zkac-8;+ad->7tZMX{;(osfBXne2Vy4fj*|d55ENg(=lWOQ;jsVBY4I2Fy?+nzFR3- zESrbQX>}vy2=B&rr^_L3(daoufr0h?z1#^3V&?4}?Y8!%#v!V;JL(tLx9&U6M&>~V z`k@mVT$42&lJkmeIFPl_^u0xHMf~EqfOx_cEUvVPRsyZk@>+#rq-p(PHY~XO2xIgy zRiYLp9?0}YUJ>1EwvmVyd64&YHRn&%tN*Xq;@h~{Dzm<~ra?}7@T8k(N{fcp3(&6RADOJAUHGu4c@41B|X&N8t0q8Xp!>HC+H2Nnx z`Z*Ik=Y2nNPcb_FK+a|U5IBvd18V>RfY%xC9rviVU_Rptu+ z?!7h#F=yud&qwrcxyVAjEC?KO1s_6rxGTdBpNREGj!5;I6Uvv5qoU@G)yf_Fgc0rR z=%0Tm%!Nd7GQaG{kh`pPErQMnksZf!=r@NFX9{I=d&xlWP*n38_55d|A6m>j(j!D4 zOmY^g){ueM7}s`cs`1pT{+ec*&h|z*&&9e}W7r`G0bPon4D~FQ{6MmfHQg`EkpVuE zIkNIt81H;y6zZOI7P~Xcd|Rum&gkoNVJ3g|cUGe1z##Zk#F0zWKMO(^I2abdas&%L`ko8c}vAN=cg z*-IM!2TJueuA_XpvzIxyZQy+J7mA%f@6i18sUp0#@F%t0KMo;5zNp>C@fgBe-9eMcUn%-mTNfg=Y?YM*_(u!Fn7 z-sjaZR(l?yn*<(rt`O3L?+zsPUA!jE%NJpucdabi$;2D|J1$NgBGkXpWW=I1lU?j~ zR~l?N<-mqb^Cbo5ssnhtovlP`G&bf}WT!&Fh?r38`$ZV{MtZ|xKm-=@G4prJB@tGD z8N3>YUiW|e1Yg~dmG$$Nb1qS`E+YOjs-TgOx(zLiaoMhZnBprh=w)fV_ZhZ%1i$3| z;n=R-J^)HUwZGtb=_fEIUc@nRHSyd1>6PN?+JNTxtZq8U*h!Ir+-*k87@i{jU8*W~=6+REqAxo2C`LYJrVGlN(b^Pc{y(fIi&3w#>FlmI%>9J? zf^-(lqck9Ytda|Ixc&7i>=}l(+MTa6Ag4BMhY0sCG1+!n;2B;>H(?Bue3BPY2m0m$ zz(u>I;*<>8!;9G-u(H{$66u7Mw=6p!+c>Y5R{A4;H#GE-irt=XdOXk_ zBMk!F!S&0hgZ=rO&~q)9@ZOd5lj3eIf?b>qakIzMK@F3Km-nO3op06P`vW8nK5UbS znRCq+Ls?Rrx`vyouNPDLQ?1o`H9oc39*X`XV-j4ea8p)J)+yvqtb4H@rms%jg$_zR5D=<$ zaS&ycb6Rr(BJPw{W5R#2UM;|)L3)>f5s>}6+oeXCf(m>Q9(}I-ADhr+Rv#hYpXTOF#(;nS08|hV0{{g8GekBs003WQblF}v!i)*tQX}d&lx1TzVMS3x@kzKg z8A-sow=5;;WygH8IIcSf|NbzkWB?*WU_}K0l?7KJRmn(SJV`qH_q94pU1c(K?yHx9 zS9R_(>#tRS6Wb!p8#u!dDmKLi7y}%rg^$(jW&<0jbvNb@8=}NFP~>AXoT`b6e6vAL z+3;-WGtBNW02mPfqM0bOsselO|MSc~X3dwiZP{$gIkmQ9LSxE=BH0Hx#03d~QATkm zIs%G=hji~GZulZJi9tk<#1u$E0HQL7*&y`H%j_;qb$WoI&eB+n(%{do*5_KQUb#Sj z-6G-?)8%uEYT_7+L{eF335T~dm}FxXOi^$ji^B=e#{aa11~hQYpdOT*Qk)Rq`R*a*b4vKRo0Q^%>c2vBEfFqrf|>`{Q%3&CkC2xehT^HaXc zH7aM3IFbmAdMFfY2;o6EHA)PqYBxhwag2m5-4s6C@E?4@s^yBH7?VYL4_7ZzN7knS zP!JKPOtKlp1(9F@1(ZgJNYG9+8yg1Te%?x&4XzA4_n9}|7wh)xC}0YO z9?Y?{2^wf;>4M>Rae#^!7Bx81Pevwj6!Vd5X!wS%YW~hXmZ}vf5J$msODM;!iIJaB zdDc^>HW3xF|4rd9uF;`eb@gVTz*%4a>P29Pk)y}`b(|eNyCrsXU*;Dnk!brvppSTX zg1;`Wl9Q*T2BQG9FvN0qDvxs6oT>olE;IkLjn_flnds9b(%PHPh#H}zxYsmD%0s0d zbL*z-5BYvA9$H6ZGh-eLJrSTaz;W0zjJ`DjwiP_=&e2PCD5BTjvdkrp3$TN;*<2PK zcDy9p!a!?Kzb61442_X4yR(8td1~zN`Q7HKy<9iq-;)mG1t9oN8A$1u#mZKyfy1$d zRxsLTh2+H?K7QyekGQ)E=$Q>PcJg2lGK1PJr^+qsd-E@j1%i%6kkjCjE8V8LPV-p! zmCv>r*08H1T-1Daz?fF5@0>9$;-`5lndNzTTvbjUf#_7aL#yitU{{nPsM@XCE65Lu zs_0WBy~cr;t6spq3<)es55Ti9my|8`Y~yi4@-=LjnHy`vRvjU;A8dnj00;!@ZT8+b z?Gn8n7pT05+QRzT0d!*ooa}PLhV_XDq+|6PwqQMaUUAL-Z%R!WFbo|U=w2|ee71ppfER6230e`sNzb6K z_MojgoXQq;EkARRcDhRfr_}{;X|(<4UOX#XxyM3mX-hGPnd^Y*I^zq5Fcd(v9@(xW z7CkauOu8OkmQIp%hB!A~QFmWOPOk_~04ZCICQD}U^oF*kxOlktD=D=&G<@H9!Yky` zF%l=#8tW2g#;1Dy3W3oNL8caFgobzd!13S;kcs=Z&_vo@^B^{<#)k5VDyzSrteE zBtGgL_!E`?Gi?RS#nBG zG}~$*#lhMWe2G+A)}m0Z(FQ(T;`aA#vyEV7!pRkP?CrJ0iFWg6^?#+-8?Pkp7`spR zd1LO>vsBt&ZCMyE&)tRHDY^~0TX|_YK1tZSdI4!yS9FJ|{3-bV6SOUw0w>2SpKrMv znvE$}y~)gf@Jo%6XWI4gI-_-{Sb(d(?8ZKD3Sd>xplt|1TVGs8_d?4N= zk)x2gFOrlrb~7SW1X@kwuVid#jv5t^XcuJ=4cZ*$>Kk);AW6l#xBXQN7an&5j01b@ z->FocIM^RnGDD zt#qvC8(5gC=BuTCzc)dhfT+^i@eKvp;3a_HP$PFELG>-V*sitNyNH3`MkV4#K_*(f z>3P84Sgo9vWt-{L6XNIF<}6nL`D>c>4lP=Fk-PF5ZO2yrKkoS5`ZVgvav#@!*c0}l zLUrp;pTDV95}sUH&&)NoGd-s>)1kxvS({s*Gc)Szv*pavIgaF{%gn7-HC9-fj9F-A zwRM{iG?@tFX6xp zWP}JVJ5txyD^O6=YEL_LoQuRkOM@3Yi)8K5=sjX1|B^c&|1)+sl}cho)+@o5v_BSP zvU#A~`c}6#-b!v4nLxX33Dw_oyD9}fEhVbd+pSE-traEMeoN*wfW$!7G6j8C)Wck3 z#)i#gz-JL*uQ*NlE!o4;S_Y*Fot|3# zI7Zj5L@QGT#e)P1^c@El2+-S!MM79@nnSRRa8FAha2BD|-;L#_0TIJNd==N@y8SqP;8bzyl3i_-rkS;TTr{ms zd$WPIETm+@-9c8If0)x!l6_Y4V7{gfT#A#2$Q#q8b)6i?(H6WhTZ_6!yLgulDPHvV zEF8x4IO*?G2!t~X*sj4lC0HHK=7A1#*r9&;+IKJY3WbMNKUCoS!p&?BqVBTo*z5^Y zpODVW%>#}__Pm6+o}rEQ(FbetohAzdR}}e{HP{00=fYq&Tu`Y?(UkKIrXmH5pTP@+ z3<6GeAkM2MdklD$ni2e6WM`sl>n{$;^pj|rF?-3!QM7o$b=^MRKGpyS#XackLSZ0m z069knFk+Y#%GdPz<9`xgz_V{+k=q2{oPXgD5e&kBH>PBLt$o?;I*iQsM{e&4Qqm_} z(Vtl&m{8s(dQe2ruiAhm5H%U%9^mB^y5s!3MJobi8d{0z<)XUkAfqFEiYZ5&y z9137YHFw6r6~r=$tI~{8ic2FmX{i8M1)&KMKGtL*(x;tbfV_6TPrUD*2{4|f*ikN{ zGuI3lilT8}%Dc<{$#CRL`-oUKgXom7(=)Q^OKu9KxqSChCm@&r(tzk)CkEKDapFZm z4m?mHNk_6irWJOG8$n$~A;ygq>!D0RLmeP-Jo^)2FK%=caX8kH{gk~0LCo5gwf>HK zK)P@|h*RiRnmzFu`y~cFQ1KTwCxS;*^N<_nF|f7=SFhu+Ki5{3P?DP(dNDVb#3_Ch z4#ghBZoaiAxq}K?7{mfGj4_(932sH)R>NiF&YFC`0*ZkWf1tQjzg4HChyv2$MAJdQ z4<;wR=qg{j=*V(}_4&{nP=j!>m(QJKTC&m&bc|Z=bc%OlNpK@{6D&|z;+p%f)INq+ z`Dv&Q04Z#1&=u6r8tq>m)z9zOUSVI;24LQFqRH}{&4nt|zltM$z}C441u&@Y!+`fE zm&RC4REy@_($(`lyYOPeh!Qz$<|NuzIC!gtQ}j#P!O#w8o}0T>q@Wbuoi6a2_iof` zY)3l{jY4P^2X34&pub?sg7LF#z2tAjp)C&c9L8xam2?cG=u8zQsC#M$og*6C4shWZ0z+ zLNW0JL6(WUmwhv4vRuVkN>v*(mME)tuhj8B|2?|GS`ROdDI{oi3^1gOV-u1L`$y0t zUf>pcxjP>X$X?`%;f)o=TFDsU%0y(2uIP1u9#t#d3b<+oTlk?xKYc8@15itL5E78< zbQFCNmSq(vb?uxg+!YCxZIr5qHs39uA!S8j;;a6jp*9{gS7xm=k}f>K3X4&Hjj##= zyi3Tjo5n;OjdZ0-HTs=AACB+T&eD^^p_p&CHstoV4knQOJ#z)OIFt{PD7&%Bg+0KL z_O{9Iu)=^F@Lv`t<2n3YpZaW?4q`vX08^o>ed&fzvpR}r2&}|}s^1?b>wLYrWjfRS zjRt>gU;lz;Q}G>8@$HF?F#0SDyJX1Nu%XR%A|MbIR|RcJw%Ea3fMWtlq9$!Y8Tu9j zCoAHbys$ft;+BQDH#<%b!to8n$A;c$L(7n+-@CFMIcFG?L`j()Q86|0{k$3 zNYN5dOa09M*H28+1@^)B6sij+t_ZHr%+E3h4f=VlyBC-am$=;Fc3wH^HtqQxKZ5$HJUxM_IEvm#2E$nv+tF+zX!wTEdL%af-_LAGY~`1cVX6lrG`U6l zD8KJ$=*O(<_*h|yTU;H|gu>~_TbwTT83{sqsQ!eSL{g4xSg(zrFvU1y(THVyVNwWx z$*ld-fvV&#RqZ^@o(~*i=+_1{f4Z(uOP`L^tR?r&40m|U)X?lb=?;H?9-tC-K{d*- zcb3OtAM$Qbe;HIkltz5-v7YHq)#q!~jcmoL%1ek8^Bf*HIK(W77I8G`1zL1#Oq#*^ zA|H!y#d*3am!6KmKk!G5Z}3@f6duN#ppYnALnuGKL|O=sgZIORAK{|*{P=!^hS{V4 zHL?8wEz`PL4;xmSAn}P_fOkH|Ji?8OVH<|$Rea6ExK~Tl&|_bZ|L*ZR(WvB%gjUW< zGA3&;R-6-i23l7Ma=Fp;bhW1R4v)!g7;9N_OdI~n8tSdYZTt1Dy8&4ijrrE2cj)bl zTLf*sO;_Zkhy_)&G30fMz)z_NI5dvpBZk{tq%7!9q7aV)F$vpy*(lJa3$(m#b81$1Il+a(Yn6?y9$6FEADZoO3x9=zi7{{QLL%VO z#aJU|7Q~7@0>84?sPS?)Wp4Cwk$UUiV6*es7!IQIZ=1L(SENR0)*-(`lMRxq`L|HQ zSYv^^a_>XGG!JBAyNPB{iks>&LFp7j_jUZwNE&u$Bl}EM>iYLSM;=_v#gbqjg6Q|&wt@H2&iOt>MX-WhUyMHzav3u|)*HX{A}(Y+`F_D6 zzDb361csdRn(L1W`#9*)1{^==sWvql z$=06`8I4Z=xzl(l83TSwofEUF2Xj#99~w-d7|b<|+0UJaSyb zv_}m{<`+hvqx}$|nd4jybV3bi<{#B)g~ktJ8wZO|3UO07WX>JpK%_ru*EU`qMTzGA zos;Q3gqJq z8$!1_YKCVZp@fD_8?9S}b3t6=d~>{O#I+^(wBqC;&QSXYw>RxSB|E{~?VB3RPEkX5 zL6X%Km^oy^LhBPHM9v;r<$GP{p#q~n(1o<%3ML}7wG77P23KOk&9PA2cF)&CPCKU| z4#)syx|oR2-^6{p8VactIkqbF13cD`Ak`I+_RM$L|Qs1FyPoJVnouly}2PtHXHp zVI=+iX41PFLf#?eiA+Crx_R$EX6~DS@x zZ9r1kZ&>~5e|yyGC~=yY?P-)#ZC*(mL2B?%DNBL$`lMVFiF|*`Y*GhJ{$!B}X<{cc z6ZFy!oqC8)b+RBj)OmX7ROf7^sm`NHQk`*(i~6YW4iyts0QZ+Zuw8S_V(cUisR zL{ti6c|-+Al%^%)u!`t=x$iLNCcC`q{1i++nUUaY`6L(Cchb)LFADw;r7|+*9_Hv9 zUq~B?vn0Bq6eXP@;4f=uCNhZl@~n~$CpCn>()e9p)vae`Iaz5bxA3M#Gh@nc*4dR* zlF}l~OsR=WoQL02-!g6JzZi0+udbQuc6r{X$uaCDVk0L(p0(G?R~&G}3@~2H)@W5x z_P#^qgg#o{i9Yr(w)gOb+@XnpVF5ugSG+FgZ|)xj$*>hP0Q1$Ho+9$m^5G7)v09WC`IBIh@(A4zP@@=%7C`8O!p=;4{kkW64Lsj^Bad ze#ms<3euWCM<<7j+i2KrHSv$+K*Ei+{8AdGSdzOrR>>(}14{ECkFAh3vU14h%TUYC zgDf34+VEE2=6kkvCD7<2ecwV}ZLQIgKFoAnw7Vm z{7=mBfRtsJmWHEV%vt z1YLK@`+LudNoh9TnJ7pzag?I6-p*{0_KRwiBrr>e6w0s>dE9@^is7fAr#zB>$p%ZRP{GM@uccv6SJD4@uEA z97`=OZx zEMmORo}1!$B*;G=W@zQzUeh979=|3*7eVo|hKQfI?k@BTD<@RloXOrJ=KDk&;WBCPJugs=SR>Aa(Z_eDlZ$>Y?2(*DdR18%`1Q$rPxGN2~RH`DgNYr6%`<%2vcfMP(l2X2vxz~em-Eag?1zfo_@8#)Tf55WcKEH^aQ!18e zvnqWWVb%qc7GvhANd27Tq}Vr?%N0K8=e$Y!98bJ^v*y*dFM93l4H^k@OWee8JW058 z&YZ7kN#O&)SA?vpb6y=gVn0Sfv2Cs(<9hltZ-PX|P49E45{|MVo)erMf73WSy`;Ak z&hD8sy#;e>bK|zF!8aToYe>*U*Jn;mZ8PQAX?Sh3l7j@zgb6L?M*>mID!*S&(W%=5%My&!?fG1os3mQ-CHwW_?48R-Q|*D@+~B`L~Wt zPiB7hJ`H-Z+=um__QZWCP@Vdd=kIFOglAWlGc!%?Oi$^|bm;K^*5=k{%*^`wY`L@a zjw3l~GBc~yja8OrV-}hjZ5<{=P3FQlIR@uoEf3vK8R<~~EA|{PnJ#)Sh?hI2Vb7l?FLm*UB7)c0n>L z1)0YgDXn`a{|03+7JJeCU5 ztYTwk)a=>{VHO(9vW~f|yKM>8-*b>E;83NcmAWfhGkmzWa~eQmAZwWdN323|YmDfS znaudCmJY|we-b+?x+T$BC`5EtLC>)?)oM$VJ2V$b{!2>WWKjQSPU2XMG4^IBKYvO& zZjm3o<)Yb8*Xh)7fGjcHjdKt#hqh8$0W=GYnK9?IhBOjnf+;*Ozo9s04zX{i{_+|f zy5&_Lq`AM=dxEtE*8^Ks*TY!h8YyX0%e4TnNQ?oayH!{c zlfnmO`htC{4kD=$lLXn#c;no%A#?anpNnJV+RNr38bUBzXb83p68)fE9Hz%WQP{90 z;+mw0))1V=W(F$Eu@Q)8wJ=pm(29ifd1eqN`_m>Z;>{pH^WD80kb)lrv0-MJtOA5G zrz}2%O_-E>h5`kx;Mg^yU1U2pt;&`gW>uwT7*!bmF{V{KP4%$T=T*a-spgAf#X1oO z2XJ1ov(&06AY_NTq3|YHtETa~t0Ht3qWQKc38e-)T6)fO?9AY1Y)uSO4g;$eVh$OQ z0Iz}LJK+7?hEOw}1tH=!o5i{15YNSEVTc2EhpItz*HFqe@6*GTMvJ^F_T_m3){)Lr zQZQhRDg!KMH8jA4DIbHnwVCri%%c1PIXgZ&s7g1)TwN<->^j!sa_GQs@7< z%$hWdmE~vNa+*>NT;!=dPxB&M`Vx`58pO|0?xKndi@?bPxwfdE7wo{7p)Ehv3{cH3 zP=6JHrUrKqOB>yoKFIH}4&q{*+LTS3$pYelw@wsds+U+Drh{xdVb;TBAP)o^4{!F? zwyVgl?`2*NSKWT7=1M}1@#;2Bh!MMVaAm6fSiz9i=P3^|&w_(S(CDMZ?NB0GbR#;J zxNGb(YLWCSVu7$$FKw1eyZwiFgALkU291mEwJ z5ZX2@dXGRD#6^u=r!1_nwI4mkyY7czLbI{nmtA~M2$c=gHp%RwL)1jt7ga!#=*nAx znT<0m4J3Kazvw;Ie5+}nXN%|D>q*WF8sHd2(ZrzGSgd$=5~L23W`Rd25qYG`EJCZQ z(5_-5u`=o&#ku8zr-5Wh7KUSSN)|N1)91U~2);CX)UL2e%y_tiSs=I-s`y(I3CP@f zYtZzk>H5q2@A>Mchz55#XNVLXuLY3tqB|I&A3|E0_TFmBi?Uw-BXDxLux&r}k??PJ zAZR#@X%DFNfqy>utp^VxL!`tS0eUvJQ$z2!FTRBUJwno5y1Mh>gwOLhjxD#!3~M=r z8`1OAT$5|*dvcib47M^Lnk{jDDPZTIvvftLuRPWZrw^yHL*c>TeE&rcqygzb6%c?% z;KvHm>cHRkj(>hF89rT+a~e`hqp|oXki_YP5s&n|_Ln zJ~le4={Dc)A55VUki1+jKNPLxgEYqQBXPr5pP!_w+I&u0es=Eh=p-7^62U@sNVb*A z03l%r(FU4RvW((r_!lrqUhBt8S z{XdZC5}oG^=~u?)>k#ht6fz=#ZU4|}ar^tpC)so}&p)*kS_nRd9NLJqqjAAaBfdl1 z-d@u>{IxH1=L1L}ikJ(yuo$xld|Dy+^Qn&(pswWjOgqfP@N-b6#tn%n^EQjkNb zHk;BMdnh&g3mt6Y(9k&^GkC_F6=a`Ax*80=`*}h)o_hW2COaTlv-OJHVyi8J4Xe9 zgDbjfjF}#ihQh_1RQA(R#d6s`l13f*N!UneVWYZoK~dfI$eu)h}}5A$ClcV!fdFgwc#9A$v{GVgK82q8XF|{J==qM`Z00TRqkVpu4w9< z$y^Wl12?l;(=b^U#hXKlz|l#b$hol0a!4iH%M8M!FQ=Wb!3gv%z^B#yt*geRe#*xAu>g z;J%U>^SkLo9u7{EVAWyEMw3Z}tuOBlczb0TNFn5_OF&|TYyecoSxq!EkArWzM7B0q z$q?V)vr^ltR%gC*te(b5>x}-VbhrM`P{Y4;4#K1+z2w$_JLKDURM4!0 zu=8rL%t>^u>N4_dudQu~gUSn96J_KyMzBKd@D@S!tj0_erAZB{6pC%!9PNTCl>KlT zd5~@Sg?7oY_d9uHKh7k3ea9@+gjtow=kW4?e;3%0~NRIKHIO=NM`T!39&LXKG zv5p@Qpc~n9xd=+UoK)b})LIUpDhxRqvmWMrjLBnS2Pa!qvVbYc~$;sw4%EQnzwV}Y)xM6ML=nLdf zQnrySa^fux)F7#uqo07Ay-)BLFjG-%uGtWWUnfSA z1C3tTh)YvB7V8@6MZ^Lbu9EdnRY+m7mLbW>$RUCbj1|lZaKv@``3 zcEbp+D!5Bxr!G%<34Gw~id1y*ZN1(4@I-o(ktp)Rv&Ja|{MbL?TrtvJp=N_PW)N58 zg%?YLQ}B;#lOo?r%+&u9I~5hVd|0-{Nrqa9Db$bEaS}yb&?Wd}@|J8bJ}-vyBn+R_ zTqOz}uY1y#yr!2KntUfjA4nL_av4TWU84%8M()o|#)p9fNwEl4_+XIew)$jg2i(hk z_`Lib50|QjElk<6Ejcr~BaDu4LG1@T@5Q&jq$V+4#8)7IZgM$-=MQvtyxRLy$0bdi zU7(P0Y7COSa6lpuMVoICw72@fR&@Ji&;3*+52hhzU5WLv40qq)q+%5797VW5Lv6kl z9DNhg95p5?o2*Gkw&yHCz6Ia;Jae`rW<(CwU^5ktp1Q1{%1b_bOW)^KD@*t8ldjAO z47swnvXYgio(Tt&&|T1wvu`M>T95E5c zBxfJ&U;0}V`3SF!NZ7_B#;#o*yY0D%mfb+UcgoE4j?6g#FAUSvpJUxK4!1s${;0C{ zb&y+V<*kPaHg2X}@~a%Gkeozf^A*0F|2o|znaYh}0^Ox-QDrKC@k~Vj7FhP_-Bc3- z2%uvTFYGx2&31o~_aLV|;Uqpvf8>G{L76-ez}E`)?HYoMOBVDWPVVfiim#Eu$3msB*r=$WUt& z1jdI0q2}th!MqRQ3ETZY?-Lj(duYiLE@bY+2@}q>usAD z$(5u%54ZXaV4uY6pBsR11e3YCxC|nZFw~_*tiCg9_Hk~AcIu*Yg;SHyPHJz${5txA zqv55HxS|-hVB3=*qBxW*(>b!={^>TYKZ97g$^6{UqkuB!cwq29UzY80Ouv`Y2 zDT%2Nd&j8n_%3wvX|`&-!S37zSb4lJ7;>EWLHprt$)wz%pTf?|n2Hr;U-i>AfqNm; zXh*6Qno(eB05Dd%=qP{rF3M&1$jv`QJ=ocCjd9DfBM<0o#mgJXbkVm4@q*xoW+A{U zL}L;p5IR%G%<2n9oEjc;gcJkX5EVvLmqK|UQwfo|=m)U8cHILJoChij5ix`V^`LkN}MKxL~zN%o3F47|Kbv#NdjW5weCcdmH z^8wWj!$@wfXB`axr$zk3xSkeNB@vxamqOf{lhnoPrNdbH;i-7|U+BF%Q=}>v=JFJy@#sIu&>AI`T&Li`xF^mJt#tk&DHy=@^%`eq&jwj#F zd}UN84c5oWL5S3U4O%?ni8r%CYaV9O?Rz;k@gj=cR!2V?9{ZWGzQz7a$TlAKMCt2F zjKQO>?{Kv;P9S|OH+0<8k=GD)_le9-NYwE6>F^z?yI>zdg@`bs%?Cu)2!1-(3+dp} z8AyO`Y1S{xI{?PLI6mvOeVvN#^&MUgrwcq#j zyz?e+P|38^82`^}k2A&-VNE_Zn&F9;ePX7+2}C4WC|0=A)gF;@>)OkZLXGD=I=ZK8 zTA+$}xHm2^c4ED?ywrM+CWmKrcjxG%t^cg$9`S?>SMh>EWSl$G3f@SOE3`Lnn*$ekAhKOm@4pvm9u=X_`{)wS6qn zaD=Y)z&YR{Qlue08FJ4e6@t77)KHGT!J53#_m{(;Y4TwvR7fC?dW-bJL~^IH8gFcU z>sKeL?WcWtF#h@Q<-wx%{5=^v8uCGEsTFIKwk!KRU;g;NTRnO)qWs8DS*5|Mjct>U z+4~`I`)e50T{hw$j+j^WM)YZS*3%TpKTOwf3qdDe@62gPClwR|HId}^onqbwm4R>c zfnMZ~ie`L!acORwg)!JZa0_0V9DDUsE9n=kMb^9K>{)n>INRSrhguQ?@WWNJrin3r z*qN|f$nxutseT&YM`%^feTC;L>kV~B4ypnMY5mUr*dzz@r^3p+`c=m*eMK%whv)Z* z05{`}ZCWXVcJLkv)sPZeE8~g5f#*%b>tgEOhXWh=JgCH3p;~XVyWCl3F zfO#Ts%8_=qkK!inET~}H>vX6b>L8(n+%cz#h_4@+E^3fdBKLDv+qGAs%H48MO=z7? z(i}P8{=;jLdtjUgQcEuS`$$8RjVRMFIpc7;c#byND)|C~<*092F2mm-$XleaTv!tJ z;F|ZVi7SzhxCm3r0ho)@zi;ax3;hc!WhyDgfRyk2&B{?CIN2t5<^jT9w=?}El;8(p zw7JB@x<+Pam93%f=P~~sZ>ja$ike&q<>ELw0eFLC3Dk(sd5&;~{2Mr74<6~6A}~A* z*$of5bMaWm18FRfnr zUbn5Cmv;QZ`<~C@G~u~<5y9lRsGb|~)R&w2<%L6@ea3=IVcL3PcMmiT4uUElbO5W9 zs@4X))8j&3R23KQctxci+=5URM`^qj`!4J_JYbC~Eq{yFp9oSE$n0_)EPV2PIeycm!| z7KLP)_s3D^_87*Ic9YXF7Y~F(VI1S4M<%1Vw)ZtemslP}cuVPxycb`)Ww9w1jxp0) zR+}x~q9=Z?b$4mcb2BV6JPi{uK94*JDA{B0s(T>RwP$Up z5sCPk&DP6uE;ich<>%43kDVTl*pH*xe%A3+SA0x;+BmS!^w0%c*P&(T8cMS^V$;pS z+qWCPWWW_H?p!nw{aU~iN`tQ+`~UBH(z#)x8K7;E^w#})OBnAu+A)4Rj;hfWxb*Y8 z;;rkrY3~D;?b}uEh0?RQm0o`fC!EOJcQwDj*{r4RI0l-WZ6o~);8W=EhvpdY0%$PID$A{m^{Einn@R@U7gNzuu{tJJ4VcMP!%GBIOY1jWmf=s4og$}3{%2AMLyKS?tfRFE2%tqZK#CCI z^{+#Zpy5EKWy>BOWzR4kJ-f?B?A8f`AZcJ$(kcKKhyxm8`ki`~+%^bE#4%S2a@JAI zj+%h25A>us@;CGhBXKJB<{o!K7+z|IYjCR9NnjI1Qo;EtneqVgEYi!rrm-><^!Z~m{tqEcf^Jy@7D zgvCKADhOb;10)ibNU|4PKeRj{*DOqIk4!OO@0kHGFovg7TI0PGw||1P7+xCSx{Z~M z+7TjLWQ(LRwvJlO`E`~#eF09GR~696TDxY}7C=)O0W&bT+ge#Q;@7_vk-CHG*r;-~hvN=k? zlH$9RLZ_fiE$qf zuTvBSQp7FQb9ve#H|&Eh%ZDK6xh+_zx~1|+aaOC-s%pE&hKO+?B}~6voSFJnnhYFl zoNJ)>c`4QdsE^Am`d0uLOqNve12Cv22Pq6Aw3T(PRc+n<(znG0Fw=)%v)64UojglS z1rSRXum`7E|2MV@g5-nRalpyW*e6GGZLla)?KuSS#D%#)U<_$b&ZsFcYiOqEu<4d{ zT9_2W$)sQoRaKMRg=H!5N1P}yn1b%W4hRil5(AJ6%F!?f3gYonWP>($g7twBe|_ir z&yB%K?Qp8iIwS3VvvqYg=?S}Jw!^Q1y$%WEe|g4E-Te7P7(Wn%u0>(Cp-xMBdP5+) z2qB6I577HbXF&_NI%L!u2N%R-i#OE?HwS0Iq65|D&F*js~JPSa-`y#cc3(&}+USQP}P~{2kz;}v1M40nC|{Jz1bVY|uLXRz#HH)|kR9Ld#zgA7}6 z#SVh~69%XB^Wm&2Yl5eXmHPBX_s*`2#6-OwgH78rb6_dR%lx<}O_!0i%W1;LVY`Lc zbg(6E6qy%TxCF2R{;?h~hg#%J2cnS~H;J4g!Rx*BgBO7q07pQ$zd7d(F;$UBv|?V! zZ91=X|K+GXJ*OOL+>fQq5^B9(*hq~hL%6U`DiXi5ws!Ayy-kf|D|hBmXU=X61!#mA z*SJ?8JARon8F#NCAw~tvvU)nTvPuLRV1n{J+(EB&5tN-sWEHi$s!Yxmy?{m`Au+Kd zn>xU^9t~xlxYLEfP+YG#qj)h!ZfMMS>p%%qkoH39R}`l#zRv^#v+LDc+m|%*Izmvu z9MPll+o;QH)_wTd3Kn*s#RjH?A_U_=!KU5F4{dxkjvoDZAA6?3~DH_uaG`*>HGWrZ34Z> z3q*65-U(9676B)*Ue`eWui%9$R6(}xNw%eQ;c*b`e^4W9Wkb~HAaJ^5Ye>`X z(~`l(LXF{Cd!`%~64H^(4Eda1uFPK&&wwdngSz;H-5*TqeMpswNc?ptsTo!K8CJcea=VVE`VqwQ%MM_kgt&`Z4}oMDWj_8%f_ zk|GP&rGFqB2@iSGe~x%y+B6R$V=KWx#MigYMo*^h!kjgSxgUVPS_W1SahL0?v_VZ~ zm<{T2kzc}ZiGWYW5P=P~ZvUCOy#k!!I8+%@9AHkiCXU2NcHcnnd17sv!jXag>l1t! zOae@jWOFarAsicwarAu5lNVk?LG=yf!xLDBYKvglJ?g~@ zdiPg7`V6nolEWMJnG+<7Gbs#~5^KzO&76Z+jKalsdUL$&7(hlI%wb@*EhrE3fo4dC z@U_4&rVOk_ynU~$V~2TAm5mVBH`5LdF7YBUN}P%m^wPD}J1+OF0XSFQYp?dVx5f2H z^7m%rxszBWd&L-fX5&RiUI9K0L!&4QQf!NnJ}oUmw)p&x+33O5(`a!p6~pXz2i_V# z^g06VxH+!9-dl>Y5sZqR9v(f{9+j+e>U3Q#)k-MmuR!;~6XV2xY~u5#@oY3TC(*}2 z`RrEtqbMY9{hY}OYnO!UU_XJo@j3{o! zgam6p$a)hJ2*13f7AP>G-iDtaO}Frf5|4ZBZIXO9yAFvBOiY>K9dbQSEya!8K-UFD zTQnXc)5MU8e=KJXW}f?{o;PT5vKz%>l=!s0g>OHmR`*Q5AfV(oCHy&*p`XD zt>Dm69hWTrpqR3eRsK#@P(kYk5t@d3pcIk*^oA)Pw2LtETQHlJ8|J2*GNBb9Jy^S% zQRlSpGQWnSAOLbOcjOqBHHrOF>RU^S(B(3NUP30tzXK#QG9RN;IEF%#F^8N%0)w({ zwp9pEW-vvmRABoi7kUj@2!kvLSjmaODN|oF(oDZ@mJNjv8odU(oWL_2CAn$*p2Q>$5T5l(nK1p$V%i*Bt{nF4?Gh4w z`kJ6y3$X(GUM4DKH?|`vsF}z`VHHKBb~+n!DDvw|OYceNHZ5{dv;a+k3`k_EOJ;EN zTvTi)=V}d73F@1neT)m53I?EH7Q&ZE@+ldg!Pk?Jcuov%+v(Ei(Z>&O8iiTimbOE~ zInSUY%)xlkURcc~x$Zw_r9x>sA<@gA@DMQAgvm)29&F*tpi$Eqyglu;Uf*L$s*45V z!i;)>o0{EQ4t z1?UFVv>NfjH~IzQ^nt&-&e66oL+o;)9zzBNn{vr|ZaN85MP!1g=LgiGSr$rBU{k86 zcE|0n9pWhDhT_**!V(!1oIO$6crTw^X?n?;bR6cj-54ftEH1Aw5O>Axq5Vs92O^HF zAMSL96iMX7f@;`_Q(8(^FOpYabQYyEk+cl)yvBu~XzaML>{>3J-ytB3__qZksIj+ip9?q1L z#fzfcH>4UR-et9hZAenW6bJQK7=wB>;#oW`1%h#A>#j2gSH3p3WVY{W&H_noo%i~n zdWg8@DiRP@bgoXv*duY%I(ZJz7`d^hK-wDxhtSC$F2DI!hp9d?A$vQI(-z??Z z1g2*=>1L8~clAu>^|ilq7w`A7b~2K&H^w*94i{{d|!)-+vQ}{FFMnFu^rAR0Sr-Hc#O$MYuZfr(lrHh@ z`@FW2D@cQ-#APu?+{+IaP}Z3TA24$Fy~3RR?ua#yct|$=dv+l zgbf3UGOmqr4p{>Bg=p7naWfd*xQ=sC4Z9@ZlnKQL>3c$Dv2I}-_vugFm0f=KzPfjP z%BGrL2VPp6*4|i(!qv`&@E;TmH}qB|R^aIBk)zQ~ zz~(#&;?sJ-ckWAAmI=|4EY!;V zntM7t^|?1Ca`ru(ip{u(yFCgGGgu+sg(NUM-fRY8lz`G2aUP}$lWK}uPCvP8vesnz zA}!5cQAbNZuPsv*3Ac4c!K`h6+8g!zB}YBgxEjQ-@O`KI^$y?zW)q7M!Q6BF6nfOh z8d!24#+vKIp<}PV5M2(42C*AtZ^3n9e1wRY@DuVtMx5T#E`fZ%CT6?AF*3vX+>2>$ z<5l8R(4E|dn%-+1vSspMEk&#gffZ5r5|%L$VB8uwV`xXkeHb&@whrsw(Q%}0KGzSw zCNl5l#aL`Si#KDC4GE)+^>O4m(6 zxE?QNcsPq34L$A+NqFTlpV;22SRsmH2U;Ilf7yQODO3?Bj@@)nAeMi$Op1C$lq|gX z;`7^n8oVPIP+hZS{l2X%@XH(I9gI{ElapD2V#TMJ!C4$?O+M$bZOXIG13ENTo{+X zz%%1zXEji#-WY-nI&Y{ht@eo1@}wgYyy}Z*rD>-Ls*tZcqC(Tu^J3=fztB^34jTL z{C|9&HP9Qv*s&oF%^5?wbxTW=EVw z6>|3#fCugYB@Gb%p>(j3cXKEa#ZAxOp+*%tXE7curIgBxE4>>HLe!Iyo7d^egfcpE zWO>=4GxHSfZVtawb_>PWE;ri_;}4q@jIWax87ve4g0zdlHFGPlCDQgc+*-;3L;8fnSOsk>ef)iS zzFd~S926%<*WOSN16S#yhQPhbQa&8{Slm=7p5rts= ziLSs(*F|WD$DY2<0`FFblT!gZ-m`heEh`~ZcbeuF#K9p@p5uIDpBRZCOQHyRFHL5Rs<)kM%R23KwDnbsL_RU2 z*ImZgz(Hd?8P?WxRV8R?9q60t^jq*Nj>i@dC!m{(Bf&z}VfZd0b|khDS^>I$tZ7TI zHGh0lS($0W#!N~Mt?&TweRj)sf_IV4US#ta<8G*lH0{C)^~15$=D_;6Npw?~FMz(} z2lP~3Lb;b@jo2c~Y|#nM;21}9`tyPk9m~b#fB@=cf@kM#wZnw;K{!M++a`{W`{$tu z)%WXdCXG4LKPutZ8)@TeXA?{GeGsz3OD`bp!O}3PBzGKHpbS-2mU>XUnHzX=m9s%X$+z7r zqyOoqOndv4y-VFr|62NcS4--AJ+H-jaKe%xu5fv*>v|V3m#Oy)^)hM}k@Sg0OIWZt zffrt)%eNT{X|nNk{c5Lc_4ZnEz6wQAI8-)Fgdyux3iPAdKkc&}adi--)50%Vg1wBco9U&K(IneP@#0YZov=A-p7pA>e` zh|{m;kpHpmSDSDY^;nLL!&ekDp&_AfGNOZ7&TqjrYS+*<?C1YhZldGKMaeMaCF{n2rgf`gAQGml6*@WFP2(@P5(AwldI9?A zNejER-)-5ZJFOjZ2<7t_Y5dr_J;t@;@%Bf-ZvdaFg~{YX*>Y-=9<5`C&>2^|RB9o2 zb*)EYP!CYyIf%aB%P}17)doE?vY6Tn4Yn-$MhDxPpkMY_cd1N zK^hwiEHj`w;`B47L6QspO8M+&RO2x`2emh@KOxb#_Q8d-YlYw8)r&Y>C4WD7m5~Sm z_vct`gy9~Og6F@y0&zzuZP<-cy6x8a&Mj?;?Tci7=fa%?LSFgVB5@{=x{#++bYs5S8s z)yHM@cRWKl0RH`k+y~i2)9e`0i+<%pH@|fB^K&jax>r38mobZg#-_ok=&aU!Y z1CfUKp5gN9$OW6WSfBKEtDo-E0xxwbD;R0PT>cCsIU-mOD<=B{f> z4nZ`77TG5$4vbcQtcu57BWstyAnNnr;qt&@_ z1*#(T2?eq5QMrU!>*pt#p0Ry#of!|m?~V5}oaUQ*69L90xQK#v@tj=|O`sl}zO7?8 zHXTivo4ch~n&s!W0B$}15w}UzDD~p+hu#g?F7?E6h1kog2_10SaY@4;1_0w)wWYRr zas<)wt+=Pav9Dc+h#q$4*hszdP^Q_`%1MG4VV;q9hRrRYcnUI9jtKRZ9$HF0(`XyW zGDT!A&wFtbS&X}YT)O^{ zuyOn6Tj87n5Fh5wW?6Mog)QbY%YxK<5?{iW0ADkv;nr9>3A@_~@Z7{9#h*GNp&HB-o>V-?49~f6*?h@M?e!u5`5&4DQ z7$+mwK;V6prbUNKgW^yh4ZLG!43dv;Z<07T9$!TcBp}BBjKJ*~GnOtiPi4P(Be`QK z;7v%;%EXYlAGmnPKUt(DMy&zic2YKh@x}#ZJL=C!=tNl9LNK(G;cunF(&N^f9Z$Ax zs?->%Xv=Q}!zW(mnIDEo_9F7c#(4EZ1Q!g7sXsC`nD)!UIPYJyK^wb<8>u)IQ9y+8 zrZQlfG$69^*9oNPt;PS9QKT0b*cLFi{0g}Wm0(m_@ca}Ts89lMde26(Vbddt`Ool~ z@mlf>v`wEYcf6u;gJu;HX5k`3qX$B97@qN$qRVGt9V}_H zPyl>ewYF_@=PfO|t6xNm7nJ{)+q_~j<7`jT&sH%EpW*YbLqelv8u8YopSfn32IIMq zv2r^-$0zziR*sXzf2wRR7dG)s+lf=D_2c_jaq6A=IWKoQdp-4TYO8(tfB&*~0R;V( z{nP2~LtfmijQCE9OkH{qJ$2h6s*9ga<|8F4jfde0br<@5CnoQ#Qz+JJ*6UO#)2vbJ z*A#Ztu5(bu0kWIE`JUS?AKc-RV4+ZzGQ>X$aJD~5B>q$Mnl?WExwO3Ev;QMKH=F_E zACZ)(&OrS~3dBx5FX$=5r~}@h${XM23*M$rV1n3IYy@{&pd@oE)|3UF=HSWJm$X!|0EuR=N4@l_3_0T&x%Rt{G9xaPBF0FF(0|E#aUJWN)Ttjr}$_;aDV z$d@;1h$0ut8~=$~RO&pt6Hp7LyW~4XFNa_lcmPIyuSDNhqMJ9I1B_!Mi-b#LdwXnX z)`Cauu(-|gnvzE!YhB2~=^6AyeLbkcoiwgMMlVY0`bKAv0tQ;Z7AzG)zc~gn8p^)8 zFoW2!>_9gOvBw#j+~8$cN26*=x4eov*ZK!Dlgs!lyD@;bfEw~ks1PwZp_&RLsX57V z{{_Fl_{0hYMPi%T7-eG(QQz>17GGbZ_X$|+$hyCeUBgtHXZSkmEuSKD@{8e}YT|=9 zv1@q_QUx={V^NxnKGXijZ+k%tTB{%6^CN8GQ~aSn8>eal%3Z@)KOBw$Dy>$a_ywIs z#h$M;txSYd&7ZH2zB}-=5tW=Riwd;z6VToJ2@4VYYxV7aXK;2lTv5+jvcv#aov;8} z!fROr(=haF7Szums=#t-Ib@3(yuXn1XeIS*g7vtrrD7YU5|W_{Q1|o6(&eN!rG5Jn zO%zLkvHr8eZ&I&IqPJsE9R$o&00E`1Kep>AJ9YmXwS^&M9zY_WH(seGNFjw2PHqK)4nP?Jpy2|j)a6V z2&bwyhC(sDj&y+|VoIM#@<>>UYY3u*Wdk81{shAC+Ab<>l4(~P_4+7!pqGtI;3=3A zpjcJDU9ZqlJ7K&pFZJnwnEXEzYozN5wN;akF~#|2_HQS&!OGqGOUZk-Q2Wxroy}XJ z_uIGy%1x;sA4us(O6|w?CBdJk$SBs2kKL7ZYML6K|2{g4Jt-E**dQm7mHYBY+Q&#) zl&T^)Es2F^UL(%hue)pS>mn$Ns;r7tRi$sXr7yu$4GYNXtE;lFTmNy(Qr54SfWn2n zmamJC;%2R(b!i(^=QdmJ)rg9XE7WYfs~JZ@kYBG?I`L^a)eSAy!9$~qkuM1Z{fn#$ zDdhpRLqtPMLQ@rk0gEO81%+~1ECir}yw-UWR=@$GIxkttEjDjNZn8)XaAbiFE>wtQ zPQVaYRyjl=KseM2CpwtPZbS!bK}6VnqCk~$3#f#cGB5^^LzGjBvbop@`O7kQrO34~ zU@U=wa(e9ZD`^EN)X3_bCM`$F%5Wi?KoqvP)mE6Lz{pNh;!v2NT39DKo`IS>)=@He z85CuL#MML>x-6{5iLDpLRX?=Y!=2uzMzyhkI&!<*J%#%@GDi#!FhHmf285$Jyjj;4;)>NXwPTshpZsEpNyOb_h{cb|hRJ(e9<7 z&~SL#t(7$s=%If=wJTFs|0;kbxk(MqxWoT>mTG6gd1=! zAl2C`{~u+Y>$%FJqPB1`#ME{=CXbh*)OU-jv2;n*PZU>xbNU7BcljBdCvG28M^M`n z_f*I32sWO*;Rnj4&ur%a5wrzkN4V^Z563%^7LCZh|+ zM^9n^T-xsffn}JgTsEv01JQ>&OH^li?+me#$JX6YZVDG;IQ$)om9bf!`(vlOQJfh3 zl(dsquvOw$vVdc|7Xb?5Tl_M!9CG_u732ri8YfnL?pLrY5Dsq!I5vFB%Oh_@txfhF z;%G8GYgT{Qp4$CjeF6Q!ewZ+)vR^C-){FpJ6#$e%5m5gXFL0M7CvO+hUFyaR<{bo< z*Xti$wf#$%5n6}WsY7*Z@^{^TR4oL zfsLlSxFq4od;|QMx8@H+OprQqf5j<(goMnGiT94X-qYm`=*#0@>>}UD7u)hN;>Gg% z4h`R#y<9*6t{dPM(2!^h7IX{r`ROVZ8`5Gv(}ZC{asaV=nS!{zNjWGskR`BD^0RtO zLDf$tyD(b((&fxC;!bxXC2udVS8Yn+i28j9+6%4BvseV_}jqL9^aqi#$)zV#QZ>Q#Y$?6A7(_QFINbZ-|@nj|L~lp76#g z8N4`uDyei}m*z z)PGX}vEJBFfK_z|=syq62+x9+;Z<`?arY{xjP^U0x@mPRR36n^6<#B8P2oCCL`>n2 z;ZK`N*-GaL=NDipZbia~j$wJd%qvm^R|*7kxpmc}MMpCB@V?MLODUP*9OvW(bbnGx zg4-juLw&-g!~>MYvCwtp?m6~sR)kL1YHOni2S!l-s?Qj(wqK?ohOBsScSvMkF59zk zeTBy@Gk7L0aMH^wz9_bGFmbU$#ui98TUU7Pdl;`tHrm2k)UXMC-|3cC3(TECJk2rH zQ(i^hioFwVgSF^)|NV%Ozb(rh-Q92qrVKA!_Bj=84t1r#LB)Z)9Cp~+t_nQ|=N)WD zg^i)mMQ9=Gy+_$v&w1YU?UlwCczOq@N)w3OU9c?CLq%`a-2~T+HhT^1-L^Y?M{h-G zg0}c+#To?%I zz@%&`GGHpcsN+q$I+Q zaj;5@E?Sn-2e{M6+7~>oV(W7p4^a&1EEmD0imYh1V3r!dnfq)9e3!nzWH$>Hjs$+8 z;AunQRThvgoqFK9QOsn zg&Di1^cy6SJ$$F0ol?{-O4JttwS9k_B~+b3bvqpU1HRKfsciN6qve8@%MI`HJcLzC z5Z%AKa(09l8@;?R(Fm?>^{A}ld1AYv$L`WRfV&9mX!Oitp2^CnB2tB&Rz zL-_8GG&=^DBO_85ZSdR@Dwc?ZG!&>u-{XgQh|Lfek7z6#!-IKS0 zf4~lvRPw)pxr2A-g3qtWf z%sNSP0tuvDv61KwTq9S!-3lA?`9MIrCU0NH%B{HofrpryXOXb-Fv7?`ZFZByDy*?)J6FB8%()>iMIOAg+rRzrUo z+>14Z&0OkgJ${z?S@vhrMyC!s^OhlvLWS(0u@5wQ@Me-sV~=62BP1$NxJ+f* z_N(1Z^Whdxxm)LoBsrrTeRqh5^yer? zBr=+PkX!tZH7d_bbsiwQx9Yh}BNk2)>ddu*SoOj}Sab-aXJo-cy7b&YI8dvI%3sr-tQL~FFKGdnQ9qjIR#6tq)_dv#h6(QiM}|7D`+da`qR&EbV0_2L zAZnb3!p=%k%&ULHYb47tKfyWx80ifWDBp$ob`!3&U6MUB|M~T=hwn9KtGt2fT(_?B zD9Y`&=#C6;s8QZA`QqiUV$jC`E0k6*BC4)(jQT=7N!1T7M$f_E1|oq*oy52MIsfCS z*qUjzVuk_6C=atKPd;i3w5>|yKfOs@WFZ$n;3>~`gAwy5XF@w))&BSY==94;)m&Kx zHD(Y1CHdaO`&OU-f5tY^vS8zgWXx##&z_B^OYxj$uk3X;?%Bh`z|9|UBP797fR}}u zb2-^CMT5&{Jjj(-GQ}~+s4tTXwEOKdQU~d8ig^k7$`y*=_NfYdmNPK2UqkAS{R`P- z+W_gZgs~4&krFK)SCk_8-nou`&B|XoOoJ6+M!}UfD9@Nb2bxj?Lxk0=?jmo2JTz>| zzHBcx$6bJlYU#VhV@WYz0t=70Xq^Eu8XbU4+fVbzPfj6~(A#)WrNT^n_p^AQA^Q(E zRS#0{#$S@&a{TTT48e1|e|tTGIM=HAWnuq7e&ODM>9Bm{6KAL-ocu1UDY=7#N$TdN zYE^9WKmeLCQ#(+_RRzOF5LCzRxAME(caDF4YJL>6tGttpf{Mn6M$&!F>vO8WysW?0 zXr})}cSF8HHh6b)PMLxs-Ub_BXIamZxOXJgg&phDj1*#av?#b4xG7pf{g+&;_>!G1 zM{%N8XooTFOWFAci@tweu}MSf}OurLQ6$)?p-SyiKSQB+L!qLZa4r+N>wh-I{MSDC12j5v3z(%vNrOY$)@>kQCenX;_W554} zI(Juq&q65PnSJMav?jksHTBNVoAw#6XN}2$R@h?BYES)149=_&3_vPuy?@4pq>a(W zv1baQ;gIR|?TD!)6R)JuVR=0sXFSRCN<(QiWgTa)7ep(?# z0Bg|=Q=R8LoR&879jd;`)x!*VSs;P!d1X;0ts~?+m7}oVSM$1(r)lDJ0r}=7!9vfCK6#CaTBQ+ zWZp>cEJQGP-w@j^boT@jV_kgBm)55|#CV>JAsaoAZjyWO=OQ5)(5y-3Nk zKGTk!Cv37gB(L~kS`C(a@9UXgt^Zq(sb};^j5JuILjHwv(oPgg8@#a8gzO~lE?6f% z^T@}!IT-<(G5IG8=W3L(9Mue*LlPYsriWTqfMc(x^hJ3HuA^^DQg&4Og?z=!qR0YY z-9y=JE}yz^jp4;2&|&-VJHY{>%|mm0fD5)%-KwL8;W@&;y7a3%;Hvp2G!A%bhyy(( zUXGYg+YtZJGfeM3XXgl`zcPD;Z$DAq?G#2L)wU6cfz#d@+@lEkv>T9U*&a|Syn}C2 z4A0@iJN6)+W$tQjelbED+t3#KgTntl zO**+>j)vk~i9hiEW1`+Ey=f6M?5Go|e@9}>NT_oFS=~Y3gq~hcm}a8aNuz_BZ520VLT7!&ET|dS>Oc>R^UXxBGeQR;yhH2A-0Myd!%oe_y>_z2 zAQKH*KINBaENAJQC-R{uQ=M+0m*JOY0Q|yEW)m&WK^wdty%{PGxFx7;x_MzE9nLy$ zp&qg5HthvLyk)W~r^G+g2r);}kxVlb>ejD;Pe|r$;w{tTl#L6@rzDH~Y&1>LT0}EK zj4Otw2gH4*Wc33J%DMD?2Kk}RG_+{~|2pVJ!(a|MdU^Nf&b=_052hQUOSg9PK^x*% zCB%WZYrQ8*r=~G01(<*XJwx9Eekf5P)qRw|b(T*A+Uwh{VSonp#k~6Ht=wygh7^i| z>wVRcuc*>j(@Q1(I9`1maAWb82a3mpx(gV`T7L!{wL#|x509ssq_jZ76X&N z0QXaZZFrhU%Rz!*b3eO&M#&m4BAP0c4UzlS5Dc0fX0z>vQw*ueK&@;?Wa^U;ognp} zK|*Em-)Y}Z!d4y*`J(ykYYjKlagbE%Cf zAi{kp^j)l_IB!(ocnHRz)wm@6Lkbb0M%|=%(SyQDruF?8>TmhYzNNF={lA2qQASAE zyQ6&Q`&O_An?2i{@O{}Jmj>p6y0chSd11i)#W}n=7!q#a@7KNJVE2swwitute|2$% z^=y5Y)myR?m(cJ3``cuAXnHWo<*fb zMnl^Yr}`uOsoD0bH;R|^oVUUJJ`u;XEVf*5w7Y7*C(RjegWU-jc5jP_wNNS9RA8c4 zmuS!-zwaA#KG;2M6oD!F9Q~mv^TRgdIUGzKh4)~F2EEwy7Bk+{OTUTrqJt8?ncPf& z(X3J56vLPWWr6o&%-`-@$dL;#2SH3;nL1WFh-Kut%~`=&qA;U&EDh9^(k4eY<)2cl zLO56uLdOBgS%Ps|RxeOd=sOsV$MfXNH6WKYd@Qoi={RxKMmj{%9&7_uW;7Yt?#i<* zb>q;S&O{f_fn!D*X)oS?YLmuu+L0}_Rb5pFFEy`s!fWiC)|eJ4?`ihg9Nf{!)cR(< z^MR1%7x2#0rZfatOWQ%AeT2iR6x?1r3cd*&lPX!f#RG%@%3+$O zJy*a*@a<(|YgG&M-=Im{6~AiSKPfgQUvy-BkgD9s)345nj!B`0EufYo3Y$xqO)1oV z>Yi%e0({Bq(8*cXwpk>*+cw_b(pm14xPfgTz8Wq^|IynVU(%SN7No@B{#gBZ_>G`D za?^dG5&0qHWtw%8&O6@XmJKE<+V;}JuP3dl2;U&Kij3LVy8v?iGX~vfT{B<*4!lQQ zCN$5>bZ$z!%mOE@<2yiFmp_1mGeZ89%(-dGQ4_w9In!i)7J4>Ty%1w6XiSJqBbjlk zX9sCoQT&*%EdL{BFos<9EX9Aq#7LoDM1D*`R#z@uQh-25?ZrQTKPh4zQ5bhQys=u( zL?3$rME`yqykTij-&E$9Bb@pq`P9CM=Xi#YL_(Fxgq6Ap#=~hE&vsM+$Ho}&2j+#1 zm~n>8M0e~N47WC(zIg1?*U?fn$t1%KjrD`};Q@!;mJb*Y+G(=xI_lZ&-7OvF1xN0q zosBD_EUU38RFz{54-*bz=M>+hiXWlJvYfH=H+7lS-VtLpe*K15h-#V6bY&do9hzNZ zQC$~Hu6++-c-|5dQ$!tQ%9CQG=&dmskd7kB;N+ zb8nx;fId3cQO7@)mSgLGUD0$;g?}Og^8vQ*3%>i_wjO@;;6U}n;NxccS0T8q2CkZi zc0)B)zzBD-b-wy(ZU1?V%zhzosbRshwD;xd0>M~s*RW~)>8-|6nhFv4oHT!a-5kX@ z8<+iGA zb?v7}`kKh_57T!62uzInNKG7b#BIJEurJKckPZ>e&X>94?IicYiH7>T@-f?^k?IRf zA3q8m-~c(>TX*~IOy6o0K9LTtUFcAF?n5TE!Vf8(X9<-DwlkCE$PHja3BTqx?tuob zBZac8zRbu>n0F6mmB_Ew0s!KPM59RaD~>g-K%bKUHBi-cqS%KPt0{xX0WqNo`F05&MW>Pzg*KH%Y7;?L#y9)8W6 z7sSQ!n2Gbs~d5TBg#wH_3 z0uoC|LWAfsts^mYtTYe(_ryWR4ACkS2pF)(5vm706BQwVQbEEHN&>EF(jtZokX}iM z0gC|w0$Rih5J53uRFK5v1uz&P|AhqmL?xiI0EAYX#T)8^cAi;1<=3LFPw3a*wdk$9 zlN4YJ5s4(N+E@&P6&FJglt2 zX?nF1tqp~rAV^YwtgvLG#gG26!Kn59Xr_%G$RCyIscD1swLLuuooY1aC))NIdj0tx zjrYeyy_WWVf@Oc`>RR-MHMLSI6 z!09f~Zf`(9xs`oWtLxCg*+3j{f!b8h0hLG zX9ja{F!t*RM0=z{AY%ievN%wo)CmPwD_;{Rb?aF7r=pWo*DXDdfJQ%{xD3G7GpqN0z1y&F3~gntpD!-r-e$-{;b1L)3s`es-#*1 zV!SVUb#B|7Hob~pRn~xgq*M}-uve8{x5OU@C-@af4H{J`wJQ(wkMVy3t$erJ!L^9t zaC4o>fxsdi7xDn)3GcQ0@1FieJ2<}&|DXL$htsEjYc-M_H2X?#H3g9xSx8a}g_Gf6 za5>v0pJsu2uf}b1!N%buR6q7`J~zf?5*JGvXFeZ{-+^ZzuwsW=DkGSY@55co?OGTN zw)D%;{(k0}GO~dCUnNv&b)jztf$Q_YIJsvbRRwP!)$$JWZBTK!)Q&{Dq2I?w;jUJs z0RV%dtn*fLA)RgQ)Tg!Q4pa4{0*iN9t94E{fbpRF(ib+r+^r}H9akJefn=$IfVfN$ zgwyE3+Oxz~OoD!oafbmC`SO1XPva2`75NHcF!( zHsufz@<>*a-<#_8OMKKN^kwUdOTdG=xM8{%y&)4oZ9t<9Fi8zfPeka;qaAantTQD^WvO66y zc{yO}`Y3>_LCH8C|96rXj(Jk>aIFH%q0;RX{_)uK$!;qxE-ZT4JKO2^{J~Cu2Q65M z{ayKlfE`}E4JYqOf&A8Lh9l0Y=Mj7;Si0;4zLR(WAA{TQEHCR7wrw2Cd)+);Law)Z zrf3p|G@J58{;Lo-gFmxeAs+uXA7N&7D{lt5FpMKPDYX3U_M?X8s zTOFoensJ{#r%#6aC`26=xseCPa>AhILo^7X}fO3t!cj^4jl|cBY zClC&uC+8u|7#}#|q%87sivwv)!B!#93U^x9T4LiWRUm|HIp`4i4G-5cr@*!)r~mgv&)kg16)wU&lq%>+^^4++vG?SyNjmA$rT&KgFp2oaFnb0ba)U z3v+|vkLGxN%it>z<32S7?5g(ZNRT4>HW3@j`?(ks&>It8g+ay6Kd`N^jA?}?e2@Pp zz(r!GwQ$jJNR`t)ixYXJ+>f@VyLQ~0479(%Xrv2Z^%ZI`dKCRAn9&d}fnDcWp_6=P z5nvl8;mi`X>0l6%usQn`2L0dF)gg{BYbYDUT;M#gNUpuHZAJrYVIi=sE$(u@PQ^(T zgF<|?p#h01#Ps=s{W}0fEIZ9hX5XX}4}!?cLB*lGs8P83-vY*$ zAvgkx_TRh+HURN~w^c6KdJ!$$^L7%yVcu_~Rxw8VAC5PA_+ax>Vt=T#-;rAugzMKk zkVWy;fsjOp?Pgu3CNH8}^s9z=Hd{^H^n)DN{UgB`A88;IQfUw|2jOhwor|V72Dgw) zj$Pduz~l^&%Rnzil?)5l$9{rN1(HN=ev&8$BxXbgU&|p((0Vt4HY)K8)UIihYD(7GrrWp;H=!w&mF|TdM}SZ zFBT9tM&=TjS*=>S#3la?9eTkLz1|v{a}4db9B!Q@w&T;&FO&|~5uUBQbnXb-Ds`aT zg#rLZ6eUbd1i>7GFof0Zu}UGSLIxO6rGWJIsZIA0TAenn^6;^%Ow0+cZOEVUc9ZCz0)ri5XNotd+Zh5%u9)VbjC!>-lRuV{?k31?WdgYg!FT5 zz8IXM1lg}ek(KK54~sHL3w1MaeX^K1NU}W+RpNlk6=J^*2qSU;?Mx|8|2TZu$UV^o zP6omt%}dD-=T`0dlqWD6Wt#xV^>yK&7xg3*-7fl!^)4%{1Q5@1BM^4cz%{FUGO##7 z=?P!OMip{=Ke9+n@xrr+EFB(L>}$j~;L_XeFR`-#r{ms=E*nB!j5`7j$gQ?e7{9_s zz&S+85xkS7`O^cW2DH_eUQLoivb_BI}ZM-I+gET;+Tu|FR1{5Rf$sA5H%DhwZ zfKj0JK8$HQ?qQH+8eI8`sT=-;qGgnT2af0AdEPPXTbL?h>?Z5lAefiK0p}!SNy_Gj zs6MfXj&a}Zz9~+*lKjY8HA8TwUD1YKr%JvtT%#1(msM>G8M(@-SHFnw&u2i)!Krl{ zK1E}mCDm6UM%Bx+p{R%JJ#^Hhf zh^sI;gvF?kbKA>46Fc0hfok3BEusk>dS@EtOj$d3K$VmYDcqzZ_GT!ny=Jww-dBKZ z4Un_`!Q9Sw;aWBob!JkZl=T!oR7saXna50rr_o*9+-!JZhYnNcpV2SkT3Y~$U|fp$B@)YeFj9G7>}M&D>Z zk8}(nz&|)U59tQ@9H|HM(YPsoBA>%vUxB`fW6l&zg5_*DGv2wO11)Bg)C%9#TuBoe zwOiV18K|D?_wrFI8c%4C;(kP|gasnnsmi)YUu~NB6&=hN{ z(yZ++bu}^|g0TxP#@=BQ5*5l++b7V=&?b_NK@8ZXV!9jIu0U(%GCbbSU4E1lgFHtk zA`&o|LJ{kvr(9dB&S}2CCAVpwu$mq@>_k`G1E@(3!m147_?9g$~4QbPzE;Dx89Xirab#)o#|?m=E(W zqM?I=2;3(>9|bwOUW|_M?yqhd42B~ALy)aucC{ILo*Pi zc(**qJ@e@NO8U;bW8^#Y{m(k;swCjNsEa74Q0gTw+C1yMdZ*%;uB#?r!#}Db(cQ;t zOUbLQ<`}V?WrO=;j)?PCOQNUM|y6pw@8XCxVx=};h%(x~hh;!hNc>$!k; zJyEgbky?1$M`HFVzFmkdb3YsgH{c*y5O<_xh_L}1>3TtD_>4_(ai|mijYIS3ORNs+ z>jD7d!?(Nf-s)dVFKU;Kdzfc*Jrrr8rETqP$H4@*VFg6E&*iCh{$~?f4P&lN2La{zEz1ePYvDtZ!$P{2^aJj?&3C zWDf@)WRrt;*(3Zr<}sWF{YG@MO|Q|#VErd^9xUoV_J81(2mk%?%ev=zvVjg(oLABg zO*RcI&0D5t`9zq@ygK;7HOMkgtMb52r3XhAxNS|wUnP+y$5BRO)7a$w$U z@Ew3iOaH}0Go?xw1VfXPBM?=(#xZTJZdZ&kxItP!WRE5T0Rxa`ZzOSb?lMFiO6|4S zr0jYzSUTn>VU<8q@C%U`I(aks!IQ%m9j#JfmVsO{V4vp1YjVer;*TEK*x^^F6Wg{7 z^u>bt@$q<{GG+AIj+skbhC~PTJ4qwmhl_AUZx(UJ{R!JSP;97XUY5*CQ^VKNP$h0Z z7O4&DAuG2MXF3u_-xu(&b#&&{&2WhY zSAmOi%SnGfd~-yBemn+u?7peJK@MrGg+OwfR(I~Wd~23hNs&QO=Vjbs2ey)YR+Kg! zBVWrkgPJ0K^q8m}d`{3&5#oe?5AXZaua5s@bm&2+KVs2=GBi86jL13py^S2o|KOm< z8Zo9qszv5k;^qYwCc=F_^bd#^>SrFJ4|`AN(-Yizet0dv&<{;0>mdiuLerDL_Jk&R z;^wZ~>T@pSNh^Gr)0vk{CFYZ+gL2_bmm|OZq~&0FN{sJ=Yi-l2&a>6Q{GA`{@4VO) zATNSh4-feWK@)aFn9uCWe-PL{rW$ zYp}SOHlhB2*b3Xxje~%Lx}0E~l_FW)5f2uTp^?tmL4e{>|H*nv;hc8o9jtdt8lJO> z?$CL7=d^>(i0P^uJrdU}!8UT)9W4{hS`Yi-=A4Z%mJ$ITI#@a5HOhiCbu#w~gnlKD z!2Nfev*+mbc3{_c1f(s{9j}%t&sQ3Rrv3Kf(WXjWF3nBLFAtf=xz8<{OU_Tl-7rqg zwTUdI7G~-*470DH!Ch^(Z^f9ucO%4G7Vl$gYrgTJ<_D!_@~T5T2c(-X zL!i8S<-AK&Zj33XXy5ziSOoex@D8Rov@Qnj4a&qRo7x)VnRRX>bYA-x+;HT-&sGK8 zeLwdT57g-gi&lUc*?3sr4Ozgb6{Ixost?jZ?+o@?L3^k;brAi|5%fXik>Fo`6f3{G z+Q^Sp^k-ym|g;Y$G0;^AgvhgDMj%;-EB}MCR{viqUCxuHPx2 z@F=)|5vfeh$i(NYWfw$&z~$39C3KWE#hASmNOOT_qv2B4Hos>cLCYd5tJ`~6ZS(~+ zin9bsyFtSOM2J^T5+7_jzAY1umGg0$UzHQmdHy+*rp+pY4Dv@$>wld|^ z1qGvm@4TKLkY+ny{tybtj6RiaV(^h<9H z^&R*!L7O*{S+K=V)Xp~}1+yJ7zB`Gx9VKT{6{H0vl7@}nd&@vU{7bhfwt6DVW0ks$ z%-i&=+~X~ajlkVX2ZE0o4Jq7-G<*8|e|qcUc})1&Yk4PHQS>mR>-sS{3Ay={=Ihf; z>YYLE%(SC-GpmpV`#D+~u78hh!uHOTEX|fbJLtjP{h4XQs}W$epfhdpc-QrO1-aAv}zH~yvY zhh~7Cq#I`&Jmsm1Ml@-@{#?jh&x#RQX+9pB_jR9cdnCkPr}t|auB3DOOOW>~e4VE| zS{4^=RQSK&Z81^CVnL=^2u+y{k@j8}!=#0_&Cff41osLZzJo~tL55f!mBQ&&sJVwZ zX0x0N&`~;)r1jkwm;%mWcJ@m7-u3^OK$Sqx`QMBkk6(=f99Y?vu7u|EQ2636Y;^)M z>WDu{30DY$^`M>& zj3O(gS(b=-1~rVznb#qEH)&u}r>jMiE%iv{L9iS--=h_N5igDkDJXB=^NOpl2ahJg zu-PNelcHud|3b3p8rdz+yg7(j-gpr@S1Si!b6F1hlLS67@GKK2j&DfJ=>O3#)8o+1AFWgg&r(nVTLZK@!Ko1EDiFPZ<(9S5Sf;1xhoIZc`n zz*~{bbs+C7|Mzm^+`<=`ekRSCKe*Z-<}Y z)P)Xrz(l9~&DoRdchF@gzsh?lwn^q^q0pqtgcw|+i({MM$ zBC}t$5c9>To~QMg@2A}wlk}iyvi_%MLjb7#&$uXVoiu9q;Bv<_x%a!O?Q{mMyg|FR}SQi zpS4*ic>lr#R%4RP3li^RiCpV}gFVRGj{a(>BZ)X@nf1>48Z!^!3yH5|h*!8FX zkH|=1w1akJysqONc^J486LOyMTy0sy{z$7OF|u{r(`1bui!UoQ)eq~2^{M9bo>Jt& z`mG=CvL7Xk{^d;K3&`nmw zSPbLYBJ`jP`?K4?emu`c)V$CaxH@8Hv>CpBV5fBO+oMnGrTZ^G!hV(J9ivbEi%HfX z+yJ5k=gon7K2mVssd3_Nd^j*~dbC7-G1^(9@rOzGw(qVphOeIbUq`?f*^Wt|oA~vo zX-s*I8fk*8Qi%rV8 zvrx%tyZp4Jg}Z?6Nm7JDbgi2Bbp7M_^lRx_Ad#&7z{8^&(l>B{Uom+hQWNI3bRoe z!jmqTtBz8<2rTY`p_M=|xo>?y#$X)|4Sf_y<48q}3?L9#xd=pXLMQ|ks|2F=<)up&e|2an)wN3- zM_|#6_6c%+AE5(r-B17s~G|&fpGHQNk7;!^^-nXRM=`<>prLEf=vv7_W z))F-Y$tCRnQQ1mu7OQU0jLX>k2OTI2`ZWOIi$Gp#QH!iSpq|+He@#H`Id1@twDB#! zl=E-Zu0^k1QPDrte)eV^gPN^X{h^Z8?mxX+320?pNTV>}F|c?gcsVF9uO={HDUcv& zjufg&&{;qTw--}(gGUNF+Ps)pp)v*sPw!y^-@Hnss6wHYeJ@&J#<)@-+)fq@js(~t z5I6u!Ne&8im8{E4v(~e6jI;%X!z3&Mu=CATW2Y`kzHN1AP&PIT)__Zi7FBP{0g^%R z6$nMYz;jrmU@=KxrBrW#v4j+LS|FiFjxWw@_BbHMSYEJ2yIllkqov{y-52M@e^v`K z*UxV)fec|>JWup<=hRP4CNJLfFLt{Qj+nTWj)M+M)2&sy2}_E0Xze*eXW-px2k#h? z-&oz5V&!J7(ix@|4?6-RT8zZu$760&B4>dL+q9l|2E7y@#40~tH4iYUaTpEXp53Yh zMD~QOt7m2Pwi3Iyfl}eNLluPqWihsPh09QxC>0e?OROs}KxfZbzn@3jr9r6Ds^@oV z?pVf_cIblZsH!sJ&z)uin6GE3nyEg$twO308(s!33tJTmkM3(!4h$*yD1;PY6^@1r zS20^2+<_M8z!Lc`c_+ECa$4ZAY#9j7e)Pu?fb$qPsn7Iv^xWvn=oNE^DxoDL=qk93 z%OlBRQvXFT!cA3y%T;lmW~^_LapkE*3uq7!k4YqJzS6NpAq9#g#R<$SrvewYu*~0j zrIJV*+FKfbA)QR#kUpe8p)m0S7bxEne7lNwE4CS}l`VuiAicVSCz&DQy`9jG*?aE* zMi!i&!09DxSUUBFxwds@f~B!VpL>Jjs&mQ~w3T|@y_2mm4w5S@&4s#9536vFH8*g7 zw?In4u~6~sVnjRkW!5FONhJ($g27YW-+L_SSDcWkX1lzg`IR0y3_v+CL35a$+vy;3x*akHr5At z+L-*`ga0>Ex~NC!Lw%$DkwVzls9-_jg84B~$fvnb*iQlE3kWlkd%!ak-%Re{Heo_zLTf3598QH2JvdD6PlcieMo(K!)qSXgU>L zcK2_+oNk9aU#V~X;zsa;O!9w_w7qc8k@E237- zBl`96k77cjNzWX_dc|mleLCX7+aIxUA+Ex^umR}wdenwGK3#Avn~EARsE>#`Hy{ui zcYA*!0$?7@eT(|6NmQ`|lV;qhX=+~i1gq*D^?!wI7B-3EnJen18n@H0BC_lNt0(0X z*qAE`^qE>Mu=v;`NKln#+^hd;qfg*aN8W1Kl#Tf~NSz&z{ShJW?dYSlyYzSHuf4J< z!gqvy&-*BQMUFePSb@Iv0cLtzOXJ2p#D^(&c7GKJ! zSo3B{)_dqU=B%#@ugA2A*+Cq8SA`7;1|w9tt$Qr5J0+kC{+@aQfD#-9b!h+7A|eYD zBLU%?w<1@Plg!kVI@LOOQOG!VmdX@hZs4tWb#HfmBpA`0hD97-4>mi2;K27}rg)~E3T zw;F4_(q>v~t)kqy*tD?^H#X8M6tA`Kb-%4}jMv6MBnZ*0dF(RwqtPhiP2h`r_qAMg220(YK>l-({prBpumf+?dXZx6BE$6qev9*YDs>1W zZgG0}amyw+MTJL}=a`^fmy3)KRAKy@YY}Vr&wqz!9g!sruLXPG3zSGa1>jP{;}FZA zt2~x@q@DGQ$K21TL2XeQ{D(u5@4_S0D8S7l{T-r5rqLn{3Ee`OEV^QRa1J-Ky~PF( zve?KA{ly-Wt{%HQqwl&9F;&~tL88Hh6RPSAs#{nicUap*wvb_6EIYM~jX0sR>G<=L zaU`TjPfqZxS38RP{+71PdT|7h&F0KmSbp^5Rfc+D&rjX3=2nI-W*n$FcJ^_k%XWw7 zwI|e&C!&b7+5Z2808i0=47D?sjrX4?{%jfpi$RGYl_a5dCAgVJ4hzBZ^}h{6d^v^j zTl&%5W_&wlz98fda$=B|;zjN?}TuM0%L88dQC={B`htX$3c-SMeP0dp47;{;5Bo! zs;qXDE;+Hrk3A6>RYx_~CXP$6jqK&n(Y<2a)ek)PZTEGcoQIM(u?Qd?MY0X~XK6!mTpPuA=J+j&B0mBRa>4Q(}$i6a1d5rzA|I_68c^%VfLaj1s zA?L)j-u%&6#zwz4Lasf&=;%Br?DLNHBGhd293(HH&pm|5^VsTx^+1`T$y+yUuN4#} zzS^#WB?gZY-6raazU*xYlyi5+PvEjog|b$pJEJd>MHQ|Wgz3cgD=9RkyUG!*IYhSX zjBy}H#wd+`Ren(M7DTddp`sQAVbiihJnb$oE#-X(sN{nio(IID4kMnufQM|R^lF;9t~-;e<+Sh8lI}Q+^0Cu48n0dL)j6M?-mK?kOZQ2CDscpM>KJjksTSHC z3Q;-^wT?FUs*EXt(J^D59>~8<)aJ|Zw@TRK`5!?3&2Qv;F$4IHRUhFLXFLq6W=hk|Nc%5`B0|C9=IH>f!kJiHSSa?CG71-< zEgx8_q0h|?QUqXxo6Yv9ij(_r8p)#&b-w5u>ow1o#ne5*vzqE?t$mzLB`zLwHi^Fc z0=%)Gig}Ioo36!GtG+n&CRt}KyA*$DRyedaihg5_lr+u!^Kaz5OH283Q9pOk(S2*> z;SNlDQJZGnoV&$-YkVjJE(GY3nWT>fp!Ccvoj0>EcOsIFH%;{K zGq`@2G{#Nx^XrwRZnZsv`%)L$YcKZUO4(=y9tW+MRF>oYYGT$qQGk~WmC<#2D@iUU z7J|NC7uQs43h78#DdMTB{Jw9qt(IqQm}PBl70@}6zTU9$b(`;!({qIwe*1f1NmSg3 zfhT?G%EA%{b_wJYMso}q*D2l?cq22L+H$Na$ z+pqb~0gmZT5r0Oco^^}PQP$S1d}`U+<^~h4<_BCLThL>5g2i6xI;Qac=3p$w9y0hw zBO{(g1&R34?gDc3i@6f8*Vt9T*408$60g3K{f{e~QChKy^P>&wr#97YaHr}5Wck!D zQ5lv*vr67FyJ#MAjyHBGT|429(4o9}zc^pv^g}GzKX2R3K@5|_ImA@OPEb(GNoD&V ziMKjiYf6 zGpUggoMav9Q>BM{H7S}lK~AF8-(xm8cB26F#-cZ|`|G}%yx}BRiok}h4C?h==3<`= zI-T&z`N)*q13&!?g0CG6)N~5za6H0h)^09n_&S3>sW>xo$Jl1FqvaV? z_Yiyfm#t=%E^1FN@9O>M%@BpTv-N0Bq}+Ofgx5oNdzf1q)TZ9WVdeX@X^kH6f80IT zu6q*hO2{N}W@}j=nRiyoGr?t2m{o$<6OK}!pjst`#(a7Ac2N%WSxGqLqs#9SK16#C zFS7NTmHB$P;|q)2HsEjyoJxLJj0( zYPVCZ!F-N*wBze`9Qw()@Y}h_J6en5)6+Vwidkxt>F67-xs+M1;BJ`-+(M$?eIgBr z6s_0(VDhRMhee8>TNDGKIpJW2!$DDTV)V;T&w5?7XcL+~+f7Tf$WhzlQB` zZHgp`wp)&}wh&LW`;^IFh&TT(KSDosyLpL4KTk5A%qI9e>gCcYY>Y#=;J?0u7#1j1)?#?gT{SJRI9(M zXr5HyGNe!xW6DdRfW>OjXygvJhpCsw0Wuj#RYrdaqmpCqp-I>i+z$bE8WIh?iVGOi z=P+uMi@0wJ=*FinBt2D_bmvheIt10@EVYO80Hrk&;vw8A;Lt5&2|+MKteib86<*lG z#dQZ;mAOTyPT1R9rRU$fIEqR3OHWK=V>CNY;xW1d) zHhQ4}ztf7{u>c=u$T@S_S+|!M^OxLowKR9Y0iE8@&WOnXiPXQ9B!+60fsIj%DhcP#ht8e zGkW~BtILN?MXTtu`kgP^LQ}6RurpMM{`>-C%28mx5lCfbH#SVO94lCNMfErQ@H&U2 zAHQmuXv?jknwlzEgb1}8A`rvZv_11y%b3m$=v>76iiq}OZxmiBesFhspGw<20SAM- zhE^HkIEm3c?L3&!^y4TI=A z?Kz<*aQ-&}ZBdvk`N7hUWlZ{73*L^PUsvpekbkXvG5Kf?Zd)=aEH;-KYcs?~_Q#)n zmuAk8cV-#iPZ&V-u3`CEoh4Yr2eTi|b7T*B#Xg1QUe!tNDuY-+sOQNpkvDbv@q)cU z!BpQbNplWx|M^}GZ@QoJCi{NX(cJP%<90k8Ap2lV9}NDxQCg7J`eF=buYi126uyq^ z+3=jYPVdB&u052K-(zpAoG49yUM4KTBU`Nf12?yy_}a1wifaXJddK*<`9?GbrKEwcjiCLdzpm+1|JIpb3ATwebW^1l&# z4_>`#x(qwGlg`RT{2)5cbgELHCcAdA&D6CxWSNf9-j&a(G_|`t6O?_&mcEwDd9pGM(Ve;9WVpuV)rEd~4c z$>-ut=7Ty*<@z+TOwulBtAJ?y@-Po*uoN=kPqEQAVqzxSXLSBBWq_gfM<-!MqgxTCSNJ}f3oOR&tL9E zh`SQDxR2Mj=gRltbLz0le%sl&?gA zyen@wIm7Q@9~*2_&NvsFh{<-x730L3Wr#AerG2M!??OnIBy@I}60V?EvTPQ<1kRji z=QBMc#k2oJ)fFgB=D8m@zFNZq{PQ zy!mL^$Yfjl;7oW-*ZjlnVzXiHQ@xA@&U-HuiZdM|n2g8NMIt}JhRfNh^fK!VPa403 zCf_2a8wUvY+9|4cK)|53+DzZo`b>p{(G*GOft`mO3ZnksXu4h;DG-oV_u=G%Kl&GLWpKdjvCRbE)Qyb|1@a-~ zd@5x`-L6dQkX;M=P5lGk)g9^Ke(C=eX(Q)xvOmbSu^M{TH4P{YCXwW7?adTszy1f5 zqV93jG&ur!G}DIO%q(MT_RXt*GzJGF7}nygCR zl6p>g&oo8D5Geyox8jVI6cO7vUY*-?YGZ(MuVJ>C7eog=xA5WCqe8*P_rEULPghy?-iBgRYgi9-nwpgp z@Jsy8=23Ts;@F`<;y#4{g;=yS6alt%8H#yGD{w$o4^TZlb3=znrtdyt1;vmDJ@ zd@rZRMVt9aXKZD^{^N1w=ycXx*y*1GGsKF zXo~AQ(gNqsGF&3_h_%xz+iWiTJfL&J zygiZMV5Bh20r)dKMG^zeV)1%l5EJ0Jib+_`QE^-(3NWab`?}n5`xBB?(vmI*cOcbY zWO{)GwQtdT6o$@4uY0H)yEy-qd$OEycz?dFT65>C&naP0e@K82sMD)@AnB{MJ+TzH zOZgLc;-&)4KG=y<{}YeG&$^RJd8~Z~)QQB_cF*^Ikg%drzDm5Px}!VnQnUO`)y~Sh zyHzq#pJFE&BJ{b@=&r2_|Hh~49V|8v(N)>HQ%Uy%EuURh_;nAq%F_qqnfSrP4z`*m zq0Wh_EXq-)N}HqE{xWGjOi3M*heg_&?C?__w_hG7Ya=}s2UeP zXWCKcmC`M{51&8vVBzM1_e)LHbpsk9f!=7k!6x&$lZaxpPau1dHR&C~Y^TRLz9o*k z^B5ZI#tyeU260fUF9(~eqr*<1_85{f=#cgEaw0D{L5J41wLduYm*dX$W9wFZ{K>Ma zUd!99)Ct0!ILQFsykn$dn;Vw7&e;x?zyNKrzL^nM1ONm8Gc-3d004hwc$twm3(zEEHjVP1q6Ja2aA^T6tSFvM z<{-g$pJbGyEj!zSQyhJBfB!JaQ~)wV05t^wTm_F=`(ibTm&80XNj#5l;yKTm^A66L zH6`Na=1pqmH0q!l?kwvj$L8r6u78CAj0|r5_@1u2`B(ou@$BWK@05Z z2TG{~1f{W)SqW7D?CC31n^>Ln;?7uUQv(D{spG?8%~f~qgaK>wPZkjZ08SmV~ zjQ{8sM3NYys6pm}AoxS2I@zy!f{ z3@Ao!sEj2_NZeSx6^e=S6U-1Y0e?au0E!O5YDKAGI|;V{sOx=bM8Bz!AOqJy%Mw!{ zH*8B2ihkpIP?AMUr3{cml&}bafifvq^Q#crBW2>RVO4U{A~2kI1W*b~tYuGR7fdj) zD@7myWT+I@(h{TxND-$AD*#hbGRjeuz$l;+2-Jlrt1xKwSqPU}wKp2U=Oj(-tl
K4yryFEDn=+FbJM@URej10)ArCS3-`F*_M`ku_UW$V~ z1Jzip);Q`dQ=3J~2ylJU29lPv`)>+2QU}frf&cZrT=#DeHE|B_`m((Bsj3ss`cK{4 zssC>58@N=y^w{T@`K9vBj-@?(Br>T~v<`}RAGt19D7W<_Lph($DMZrHE9Bv5-15v1~ zGsO!xjV^>_I@fF_I6(A2TB`AWzX#8_0a#U+1zOvLQO|;b0Ma!{B{_q0eu@;b)!oV` zR3PlLUF7Vi@>`E~8#cm)_}u56_-?RPTS;_-IHu4;-n(oj|6#WCx+~h^nOk7_UEj3# zY6~?@#!`qr=G$Ffy;wLWa6#bV)d?>oduIgOrDD=GVW0fCQb|aK2?BuP z-CI7{!9{Rcum}O5bT}^?H}-)9ghK)f58{374YTAW8*A zQYM>H=h{osV)+!n*U*w9`hy9VUPX;HFRwKaYj`bk`aj6kMEYY;52D{|4bf*)%<@ z>o>x}-5gZg0xL9%@Z(;2c8)S(`_g^N0+kd8Et4*LcUN2Y=W0cU41!JS-rp@3(u?*r zxy1bG_Y4&5UZjuu6{we`yGm;?4MC3_v8x?_WQJ(hf2 z0_WkJo;iiO0_5J<+UPDo>4R2y#3#MLlg@3Lac2>a$V=Q&WW>0`fdUQJ|8k!+DHHaB zPyFQz=I2JaG3YBnaaEFsEZ?w(@YYX0U}xlCmaEUqCLHTW zNBFr=tUyIY-X%?Av1Ix-r%PnEFx@Zx_~?^nH6RNPTD@Z`wkX74!+OL{RO=% z8u|xxQlx9i3Coj*Sv}V1N(;cu38s1YzIIIf$%Hw3}HlDL2fui zl8=IDp$~!idR!g~ZPgq%30KEWkOODU5*~IP;i`>~)pvDHkFaarA4R;WUiYl<9TJg} zTJ)lRzZMgt%a+J;(&l(Sh!Y-CxiJ|WEu?Pe-@8Z_)p$i5OaS8-hHMB9?RKvg0_~Jo zA`Ckl!3rlX+r6lgJ1)gXIkc*}98Q2$-**!h6@UhfGQt4oHfMy)eb+EN;(meE;ux_MKp7H+XQ9cF*K`YA7HfZBh-W z9abYy8Z|&J!Xxiv3am%WvVU(kMlX5w*j<(%;x(o#Zsp;>xu*z5%>Cst zhdoY~one;rkh~W^z;arN0tG`lpHk-~#D=)-F${!X6!I0k+g}F3<>PSfz^Y0LKjv<< zsU;XocbunzgS}PRv2)vN-W1Po>uVB!c#eOTn~Xan!IW(fP99xf3_Bn>z*mYPnGTIl`Tq5$F-J~u7ckYMA!EQRyAsyLz3&qH)oxxmwJso$iG)$bY{*YuF zn4{?ZI-O5L%>qRYE*Zf9mlpT#w4No)1Es?d3do@(-PU^V@qq44+GVF$21|V=O??l_ zNg{%GbMP*EcPjx)cCD>T3VdEkeQZ4VjKiCBUDlQKxcg{Cd zo3abw=F-ts+qGdM@ISUtR9Gj$CfxTl&jECPI={LNSGnX(nPj0gmX4u+)v6549qZe0hL&I6WbTVDAW@+Rj#6I^%os3u<{Y$x9gc?f+P?#FLmY1 zboflA^3^2o31Dr6GJz||m2>BQfRCPdjs&X```8EBB@n%TLI5mSJWjZgD;yd*xKM^VZ#g6aZ&R8e?EL6L+S#sQYzi;tMIz`V&{{By`5W;36#aUC4xaih%bw^8N3DL1PeKf6X{?2NY)vJITFK1Q^L1ooEqjW5H1k&H7roF2N!0 z9AShgIUZR>WI8U6c5=e+Bn;bE>>Fp?7YQFwt4UV8$x9+QR}1p}2X_7>w(cZs5FXID z+K{@h_k-epdy^I!x0{|(TiT^f0zv9=RHVcoD1ZjY03nVee`(;`JDAfnwrRF$5UBbW zK%Pttsu%b={ci`zH7rw5)6GS!PAMh@*BArZ$e)3sQh3xXK#L;4qk~*P76EK5hOZ%5 zp8mT@^drK0?fl808KQ)*g@Oat5>7C?yd$wsFgWX=8_)!SR>A z9D~9T;yE?Lqvwj@Z6IW8eo8wg7#KGQ@%VAA;L$A94!>4!qQa$O?fj;OLZYnnS;!yB zL0wVMU5aaA!1u2?pS}?|+;J+!S5_oo2Gb&ECnO61v{MER=Ec8BZ-9Nn3(z0K0* zuSxcTM1DgL!jy-iDsQO0?XbXBP_=L79-F#_faW>eNU-U3b zvgY2aE^+Nyb|T`A@(7L-AavIP*mlhYl8*f$c;lYnXmdMPNs8D4zit3} ziFBaTLyHpCIEG;lB*c31;UZ1^@IGfWI_jK+4AEhl8QMJ3{1XiY-J3lJ!G^uRMUK7y zr0r4css9ih+`Z4|^s$9byFB+yZqu4qo)rh*TvAxB=IEN|gx>kzx#U@XR4eJYLo(ZJ zrmd!XBb(=23$If-x+fBO#XViS(YaaKetJ%wht5ec8M}AM^M{mJZ&i2^k|Iysryzz< zBRZ4*p9AA8=KLXAE?$iwCEmfa^EwMctDB3fP5Y7VAyqVcf0W*tIF(!I5uD`$vp4;rsYD`)OIq^t+ zd7y(>sOh&ZUU9F`1^pv@!52tj{7_5jEkWD>JM+IzxUT=7AgMx3r(oQ~cltzp8$4iM zA>D>qAPXOy(1o1?gW(gKq^1urRb{Dao8M?9M2rCIb2=9FF$!341df)L9KU9r?*O89 z_F;dp|Io_djn+G@g*-Tpj3X!kAd&nkJLf!evTAMB(pVWNv(H2WsF;Q1?0g9ZKP&X{ zg`NBtC&;^<<;9&ZsrdU?Ic+KK+5M!FYEWyDVa!@Zdi7zz$#4FvQ+7rQf)2ROeD)3= zX#?+@c6e@`n@2s$yZTZ4lYhhL_Iqfob*I}UI6nh(G8}IUFX&u07|7(F=1Fy%S5b84 zs)=1(nYNh6d!ELsWzMO{ypGvUJDp=cNOF!i|0=zSEsw_RSiTEGxX~OE4^d?6!1u+Z zjOX3HdR`{popYghyJtVh_UbFDgsE^6jj_&+zn$1qq2S|M7XfCbls}?L% zPkxx@fB*Y(7!UTp1-Y5^plSi(KMpnhnR=+N9z^(q4pybj2`CFH>#`H9bsxePumAKy zkoWpObD;a}Sgb-fN&s9w@}bXW?h|GCWx?Q}lT8wRypfw$`D%AiY+a=hxP%HiWa%lt&Kja=ip`v_-+MbGCpHmip} zvWb$Pk^hbP>$?7DKq&%JyL)uF`LOqL1|lM)d0G9+2(<&((ow*v_2gt2-=SzuLIuMQ zIh#p(P8HEXx`3H((|~FYkly9Hqlv^bUm@RHMV&HeROW|Crg3DVx1e;_cd~fCPSV#4 zQbY;Vh$Z%CnMVbHd<*K+&uXDvC8l8N&u27IWSBuU>I5D2bI5;~%s|KlZG+^3(X{y@ z!#UvD^H@W3jWENl-9F+QAv=`vT-wZ%@MsR!oLmccl=rXjjlYx0we3uKaN-aAO2Q{1 zuXlUxfzLm+xy?30N8YXH2^i|r9gJU*@e(|E>Fbv{n40>})T<^)P0tn*-Nmsu>wz$G zP%)MlaalAA)-rfSE)w>yQV!I3skaKh!<-@-TLuptaH#1u7NgMpWc$5#l)N^SReOAC zL#q#o*{d`2+u@^Hl0fH~hSjjn&{_Y_e0B(A%J_QC?6Q9d{)RER?Bp-ogpzQJ9$k)_ zB}CIpSkoijsQ=)Q5($hcmXAdWVa*D^-rA~q6xm5oQt=sJ^I57=VrnB~d2mScjMZsk z6;1kC#hV1~KYYf^*P>Gw>h26W#8TIpvXLAdb-^ARj+I0sUZpslkYE$(d#@F-n%W4x zw!(S?&YGk~-K#IMk_9cJOm)QdhL9yfw*+M(oWl3kLLasMJgrfS-qBUulJ3CG&n7No z3XR+Jowjw#MTzkmsz;>Zt&>>6$8K{T=IU&|z)b?9J)hdi8_oAx9D1VRi<_sjDmEuc zo8wKI{p4*j;|!s~r1_4;L()E9!_b~~%6}Ju5s<1c;nZOGd8hD-FTnGR?Pw?HgUfuA ziG8e@tvHM$g}RJDZUOpTWfkliXrZ0_$eqJ68^iiG7!0s@ZhsiGG@d)u!2Va4GCMR% zGZ~Dw7bT_)>I$j5lL&pk=Y3HwmZ$M9jP$&aBk4-BvXf}br=tw_$oDgBEHeaX9%97( zp74|&z{K~3%JB4@q0?66frr6ux*m)slN*!jyq4M}8W?~f%R*bDxVck5s2e@YR5LIY zWqC3;YcD+{Cg6R4l!Hh>@b^(ML_51U)2QR7!LhrMbI&X^j)wC>XPj#>GE@-=up{0* zaA4UwiVw%wfeqY=OVz}V_*hXQXb5&9`mDjYD4o%Y%+LSX3$@6hbcpq1>l_n0&M`5= zE72U#(qqHN7}iK^ETFhVoz8ZZvuH=94V*udQ7$Y-k6RW^B54UI_0aYU*5`56X3i(k?V!zN_eQ-9!oP4jOc0 zn%sn~8Fi`Rswm%HoW7f&&b6uQ65fCp)Dq&7DMzih`9wY4<+lKXs=01nz1nF#EicjPum(q?vj^O{kRfg;p#&Z(xB)7;gRLX2N+?d*#ZgCV z)!n2cjVaLB_5+2JUe|E^Z__m5$FpbuC?h)6MJOOG4#&D5UP&st^#G$LG8y(?nXKEp9unbc4o<}K@I3)!+&ePasyX=j=@wp0f*KP}3#A_jmZwN^q_0h8&c zM-L+$c+lp^Y??ToI)XKh+T{>?llP)sWD*?mo@Ua!t*5}>Z8aceco1K^DtjJv`E~T# zQ3Gp;qyAyitaEC;E;V}^2BSjUU2oDcvZ_U#0HB(28;@0LsPM9NtCtO|V3cHXJkQl< zQ>7FhGW_8w0}5N`stVw9ebkmxSRI7~C#oHn@PiQAyux=0m(EeL#&&&iIR~V~fez^Q z^s;&hEJ-UdA0YZM{6k~AO*XhO_YB&+MC5@iIHji7*I-=`w}4e4yNvucryDWXC6sXn zX$(9v>e>n1%B$u9!cm=|c=>K&vryZ?4QFSE&ZjDo;Zcy+i=Lwv+Sj6ZL+qlZc44I; z7eo{`vDBNlgnZWfiPFwAU4xDmtzju`)6Jl^-j6!|z6I0m{O90cw$9M$r~I?67u4=i z`b*Kq>7#RYYAX`sUYB3B>mrd@mJBp3lse7>+tjez-Z~Ituj{9u;^RjZ?gAdk`}IMX z+qq2{bqD2{R75$-`KUlWD6>>fmfm#K1LMx)j~R{A9$5?u_(@X8R|;MMQnSd5PJ*|d zI!A?D5zEx;m}`-1{8kAwW^t8ya!Io}oGEIKc<5E#9Z8GHzITZPTW2u<9}BajUAqpl zeb0Hh(l^B+vZ#>_*9+y6;$~X4;&&>6<0* z4a_(JP1~UBq<)9?#e0`%TQhzA2{b?r?)!;E5b>^Wpu>AMxrp)~(k+3UI=Tke(F^3$Je%g2(wXh5^ z*q*Dq)hol}uj#G}B|4Y8nP%M)HUg%4>p^oY19E*XBcpJU_NY4UX%^=VSv>Q3z%5eA z@$`wGg`Vq;WL|2e-}o>E5+~}286dmh8e48+#~vFA2$glned+WcYbQEx%0knBJ`ZS_ z45Pl`9DW(IVjlW@Y3Bqm>br6b{KEVBqEQK;Kj(dPIcp@_k_*8z;_Q9zP%J$+0s)nF zm9ZfH`pD5}C8&WiMN!JzUh*RJo6C?UH{Z`qqB3xg`U;{jl5(9Pe_*fpSu*brSILTHd#p&7N2?%ysWmy4iUTwsc;IhWr8kDwYJ4>jkfl7$_RIW~&#MSL}Dv z^#c|KotDQvThpm|HN;W}OO&9O2US~Ym7iq-g0~=9PW6fEua^raGkU9|s-719P4;`E zyITf>_)2Dx!$WUp7^U`amUW4AFod{s_O+TSMzS~*p%nh61B^CU#NmUy#i{Ogmo+VU znU#2KuWH>y-%>T~ov6&PnpDNv|*EWr1HHlYtVEoGM6x7)D_YQd6&48Gf1KHDQ!TrF7rHWTd$hVKJpfPUG8n*~#+ppveTxOM_MQEpCvbBNKOQNApaSv^K zf>ru7_L0a~VMSVFN3;Xx56@tS+3Lz#__k8gqf&V3IXdlYzw$oI=HV4CQHa$nKSvGL zT#*J-G(;Mt_p$uh)^7IqDb2J0z(ZF$%%olNgynZsh+A10uPC^P^~b}(=j9OMIwIz~ zrRmp5jDzexM9=VAp7Tf!GKLI9WhXV+?oQ^U^=%w@N`8j<_Gr+%0~PdHPz6a{L)RAh zYEd>+?4 zv*9g%km^4DY*o;@bUw#f5)>NoWmCF6?w1@-lwv9Q@bqy+^vA>-f~_X^DQ8}59W4NV0lU_uJEgI@(<{3Re1jW7sPCPD>OIFL+=KtQE#$ch8WINpMyCfQ9Oh(XjJf48BVoX^@6Zln&C8;?UDNYV$KoNU<> zxAb0)<9OQ1Ae>{r|KcJlY>Zh<6$dBnXJl3-gbK3Mu)^7y-r1ZH*TiH4blyxBp*@gs zCGFO_0-eWr6A*(ftBRrFNDwKamBNN%rq&H8-~;MW<1Zm1R&|9GYZM2$ykofP?gu!t|ZvSWblayisJV6gPo0om7R1NMpQA0IdW zsmeqXurURHSp^^j5DJ7tPGa`2Ra^3cXebBEc4{5#-1*ixcy8DdKcQ62HrytAk0-m> z(gs}s2o0c~u{OzT+e)yq#= zD3UVll)Gt>^aEJKQvg=UrjA?>N?htEC9$U*u6^L4D>l%6A?cw?>;wl~u7YQ*Pzf?# z0kfZ%KtXlAKhxgS-g6_tjc^}c~cy=iZChqgP z9(E7uyKt{-p*W&$z*9Qx1uZSyhPjiDbq+UdrPaCj)H&&{zs*u*rQD z-s6Hb>G&Hs&^&}xmu)T0Jyf7700rkd@kz@}o6{g$xb^JO?MSh*nqRz%`SmxKPENuo z?D1bWl5&rw{PwnzHzxO#)|)VdFYH=*SKU=yJ*vvl2)u@*x`Yah0=Wm`bAdAw^YHN1 zP4edZ@DWT0Q+G_xNib?&6fZCze)$f3>4uhl_90%!O7vU~83dEKFnXy2ukd84RI7GLRwv+10JMb6j2nlO@&J~xnHu)U7A0G zg1>d)-oVPZ;2I|pi>z@qKtk2;*5`=+z($?zERx8jRZ`<3S`A5-Xv|~fbZL>)^b+PLhY4#ynO=dn&(S5w77MMgxQ@@Ix)Lm zRqgOkO~#wS_SE5mgIiZvM;`VG$(CzA1VJrjqzD8no&#oQRD0O96YoG?_QJ?|aHO(; z?*vKiRonG5sk+$Zzqvd6NAW~AV5&4*0|OfUw602pcLrfURLJc@A!T>1XaZyzi=JeV zUu<@1+tMJJ30le z_U0?cdNPyZyZh<}HDRAJ{&s)+Y+N7TC3x~~TPPO6FMN53nDee+t z1l8DFLU#sN{3WK^BiGS5AV~^(LP8ICk6Z@7YSMlXATmJ$Z^*vj);HsPKjPa|=)JMw z5^QP|*$f*9+ zQP>-~i_w3zc`?;u5~S;a@CP%^BeAnaHd{;0UtXZ@|%hneW2 z!m@VG_=7YT*~*zajZ?xeyjx2>A(yN{fDYdZT?I0dnZ6~$1F@pEKshLkDfkeEvVpz( zfkIVE?sudNQlN25;ASMZ#-E%>b@N@o(=f|Wprk`rF~Ei~u(WYEsE?pp4mde)W;s{+ z>qM??uqF%^NwxQ?$S?z9xH)K5)QZ6Q(lUgB3cE*wK`GYadrFvX9np5X?7J3 z7?rpb*&GMq^7Ooh+&piYQ7X-_z#QSByP!avDCMcc8;=PFTVI3$$=_`VW>?7M;pC^O z;c&!b4zU_jcBWg)nm7*>;E7C=?};w*LSlu|z`SwUzfst;vR zQNVrtS)|Y_lh!3CuuE81}{xri433+zr5#dr2z6ocjm)d(fWRv9l0` zIC1P)aPk?T3L2bE2tgUUW*OHSacBkmc)q1hHp@*T8bKJlkMitfF2V@m^@AaZ?O0t) z-{ZrDGq^a=psMa=08u-wU?uJlmrx;51YSdINhH=Ps4$PAE~GgJlu=x(fQN{sh>V!a z_wPI&sz^EZ`0-UTl<7SPb}9P)f(Sb@K#T9R&a~B$cwID1PTr>G-7 zjYAa0Xh4FLOPZa)wt?L$B?p?2kzy-^Y2AG-9*oEPibm2*#%Hx+dGugvPES-6B;PlTjf$%>!UG47s zsMLjB-G9O6vk#RQnU>nyKAKPh(2m;zWmajVBduaQj0<38Gz`zDN0l_iM!8{L1Do7& z3W_zzS~$G=V-{ia7XD9xv<4RO_PMCYU+WHd*xwB%3QwTMBU#`i?%*s(uyU2{xG z5;yY~}6TQyXdiwXWlb2hN>ZTqt+C1ZKTWDD(&nWT>$_dz=F(^3xh7OeE5^6y2V*-YZ@FAGwg_nb%AC0GDbfUw9 z2|6}Nu`NCj{MFE%?+;#PDiQwc4ERCn?}4$-HD+Ak2<`+e1NPbv6f@#_v6z0e`a3kZ z{v%_|(u+i6Nyh5i0r5n98O4joVGc6|2Rl^8_u*s}7T&>UrjWrXC+=360IyZWe2Qw8-~ z9@Hlw{kbP%{c#l6nII8w2j5@;GGQziC$Bi#AA3LGeoZ#(GkgQUFfm>j(4X0u#`z{E zoKHCU&wj4$xXk@zB-Wa0tS!$}sQMUuV`GdMo{PFlJcLLH^(%ePbsa`!`PW_2k3`jh zOqYKWOc5bMQ3?r>M(PriLzoVKRfQ-kL$NDAfjPgM=lb+j>oV|60^)Pb5gCur>WLz2 zi!+1Gq)0HLV?naxl!(QXvYe*?YE@MrYlrO59-$o#X7&*luER}^7K^^R>K=}V1uktD z-*G1|%j*NRBh2c7nEIR$yRc}ir0GDha) zl^D>0wgao2T>XFs=Hppk87Fi5HCsyR(b8Cy1m| zkmXE>3=CAh2oLEUUNcw{!BflcwMIW5%G#W&@N09@bHodq30?oYqXS4^d#D66e&|pQ zIQZmeqVI@8dx2S&hh zctpb1BI;}kSwowkgT#gXM|X|td;SXDMDThv2wqi42Z}f}e5cuVXS)U9p=A*kv=08h zgnO39f(oIIJSx+V4POidxqH@PD&_9?FwkhuJLx&6AZ85de;atFF+3y8|>Ry)8!0k1iESu-Cy>Fwc zy`tChkg+OPxiz0;x*A((`hLtPl>yL()a>)m_#KU-24+Kzg}ATBQJh*7HBxPyIW~fL zHrH-?kR;wDl*ujXFBiX>)e{kn;Zo_$;*HxA(6AU>TuT*XEkUy-wA1f*o^AAReLsz_ zWT86xM0jJ&8GpsNe7-gu@@A7=l!&Ajv$dMi0toFV3dh7=@|h$YRzd7{YtHUQxwd{k+`FU)RuXq#FJTMt4!{(=~|gsLaVSldmBgcIXV=? zCgDVFT9A@-=G_lXPDbw3kBzQJ@fJ_saPmk^C*`5;LN4W2%%8g^;n&+XC)1S`6Khcg zSEK?@ktMjVb?5pTlFg*e%uHM!P#LH^q1fJJSUTYGO-@gHiuA{}&9%SzC89n^+9aO&( zS`-uT>tx91D^+=xcPh$V+3 z^BV%%t?FO;NhA$gc2}S#eI>H@Wb?@=yrOmNGZ}-aXA7P+Ly*h0&Uws&mP}y&nLQuj z?1l49hQ>8@zGY^KnQ5Ua%>}D#IEkeoKW2}=LwN3VbN*@^v+l{LvM$e(NWk`TS@0`} ztfm>aVvt+_Hv&~f?qWn>z0~4ufERN@)a3fda|2)Ig(>dwl`BlJ)tEPi8jw@q-uwU* z;~&rM;Y?}&JjK_xC}LqOyQL<{v^2U%S5H5s6#%ctoW^5DsHl2M7l>F zFjqbD7f+ps$~2&|i}kUK{_d+$d=K>yL}g*fP^BmG5P5{uN4dI6>k z%>Am!m^+`M3H5(@;@vS?xx|qhz5ACG{~Y2BGSDo86C&n#O0e);-cOw7m{Z(?kLE=%WQlgHp!!gp# zW54E0y817j!W}$uj7j90%c3ilxr51MbFB!eSXw)GovxAifh!}VR*uvai&l^uCtQTk z!1WuSjbfNI8pyKk)?mHzhl-483;96xAuk}R$Vj^ROQlHR%GiC35;!U|KqP@sZnz?6 zSqfql1WaNoKVf-hE1~J?5jfU7EeX+fqY1UM@J?>1*-aC_^ZxSFY~=nTWRIUKWPJLC zFwDhPQVwg^c*s)~&U4x(-G{!9ZIAd7Ttk|z_n0U?ye?0f&n2(?6nc(|)&5r|NZ7Yb$cB+inGfNuiJxs9N zoPp6Fn}lX%Eu}dp=8={;P=2xjwSj09C9%ZC?}rW?eF3$ktG^U~>sE@AIYk)ix&ZA| zw}jTC%e7ibY(Vwizb4Q=Tg)M&RR~Ghg{bZ2H?bS?+uMz`G76k8){OFmhS-0hId}2q zF78=5*NZ;exjV`q4kQg%yGjcdgya>Vj@^t=@izn>SEq4e9WgS(ZX8I4o9OQiIeGIv zlpq{zbcH98ovB%O5L3MiI`F40IRnRWW0%Ow{*Ewpyty|&G6+zLH>PVthDm;;Tu4X2 z&PN+rV}w2Xl!^)#mWai>W8h9%bz}9pi_!Gi5;&_A6*OkNL<^M7PHzl|b_GY3%H0fw zEVoBo=r)DIq~Bd^>vJ}r!=nMpl#WC$}TSmr|S>{%6d_{|aTEVMCC(R2yiQxNb; zpoYdDA0c_0xh$c4lVahLFjqEpsBnV0cms@l`EzHdzGvv@()byPsFFa;46%TeEDwWP zXxj(XJr{l@pGE7bb{(RZm0;_2=KiRfiXcUBk277A{3e(4Z1{`TV@m^z7b@3nfyzv% zQtrOP;(kzHW@}-f)s19HFx9_5#O`&@fn+OVl}a$gm1kiYT`7^wFlNJ-8Y9oGZ?dgj zsd%qUcVEOQ9NPcw?HG%&ePm6o412FCN|#p2yLxdr8M9TfWDSZsZ^c^b%VEQ0^xk%v zMbY7p-WWSGvj^u;4>J;^thLM7zJ1`SM`*f_t88a_SywBN!zVX~R{9p&JV|n;@}d12 zWN8aIYV&h2+=gQD3^e6q^pext$BFt&vl3=lbnS@s!{@H*bOl;c>bA;?j|~lKZ*O zxAF|z)e#cE*7hwi4iEgCUH77VZwe87hXspDlNpCXUB|JZCd(rROkP&BP%%BgO!Vk! zO%~=x4ZDhz*`5U!#T#(E&p>Mcmh(dh*@amz)~taK%n+0zOF$fC!G*Tocd;^!M|$qV zbyoY~cD(*Ipo0vIhgt+4#N2YUjEa(AaCX)gvd(#|t}n4WLxboP=uR5UoLOjQ1n zh`N@j8cNQJaT6{UNOW=c)oIv-#8~8s5;xQT7)2dS@3!&8CfQVXh2Z^{C>yEeG6bF^7=-!R+YyHwTI0~gElL! za`Km{Z-@)v7N`m2p+r;8j7Rofki$po7`x2%k21~NKIu2R0hrT>y7QG8Rd^U>w~jZ_ zb?4JFHM{AY$T0|rq0z+sEElI{mi*xki)zUJM%)j>7@_z{{TIW==Uz8&s$j8NH(w~+ zhTGA+dpD7Fj-tk3>oV7jgCR3MoF_Y^EJ%5aFyeyg9W{Iu5ytoiiu^wT;PvCR_M@&r z>W@k|GA^^sTM%_ZW6&9dF;k{ko}-FkRGiP-nWt#kK5|o>JxTc29G*j{QeBrz+f>)Pra4u4dC^nL z8kfVACsS`_hVl75!MJ8do1jTC482TFw0$^h@CEZ2c%=pXTg=4BT({tyt5oN~^oefF z(aAsy{Hx5zRreQC!b&o?>X9i*?l|<$eXB=&d;;!7`vDWj%MSt;LvRuUHbbPP1;k#$ z7L~3JFK>)jB(CB3gq)(c`4b)B!S?c1*B{$5Xee$H{SaB@roWIHB5u{tUDwDj@w$6C zGccVAW#E7qv3+C?P9T>#8x&DW0jL&gcjR%;3bB#FzM_>QILr6gTQb4vqEs#O{6`SZ z-XUxIwsi}3M0a`r8BYS{m84x~{`}^QQ%gUocaX{dx!KRG*Y2(cl3J{X#4B3iGV`{& zWfhl+NC(}!5#8oHV@PmW5((N{ROE9$3xS2*^Z3t8?dE-`O$EI}x@k{(QjsUgF?g=W z*WxPA2uST;y}&H}6F%tAmcQsb4zyIDl{hI;>UgL91aD}i{CD~fP_hA*y_>ob+C*za z9RRm~wK<~?iHYueX68k=Hp6=DZQC$9~_hI(n0`kF9BXSaV3%^Ci)ry`v?{Nue9Edh^i^`O-_f;Y$wx zf%#u{QpQN&J)yOX!U<~`W3T%zo#lFAC8aG;v`QXC&@NLl`Zwar#|;w$6oxl&Na*al%)crc^r%l#n5n{^R(G*`*RyO zD|VGQHJvxVt`4p}qsGFuc%EjWYfWs~auvuc8Gr#|&>bs}sgtvOxHr5_}&pxzWhXX(RhG2yk9p8A_?kNi|>?t%{$?u=vDBnR`E}q$9jkBHg zQw2K?`f6D36;B?;GS#7^po09S_@9u_~rG(9Y0rf^&WI`47$v&RMG2fj*W` zR%Q)JXBL~c=&gvp71-^^#}!@iQFIAlb`SPmN4~7sz7P-t00aOtR5mjJ0AFQv*-6sZnz00VuWs6-t)kTICp#4iqTvl#XO0HF~pqXH;*D%ZXL{QI0-?Jl{s zr1e&=QfySEdO~wUpb1Gq0wRFZK_iXu1P~8B!BhOj6w(l)bY&B?6`P#x*`&gJBc%`+ z1Q5ky5vHYy0753!^dN)=6Jn?&_;6ZGh-nc}z(6V=93Lc+r&9&PDJ3k@ACW2*fT{{V zI-qzgic2zq03;?Ag%LieK}i4|NVG7Cs<8|lNP#LEMrE-|3uQPWfCmSPF#rnx)GPDV z=t@eEET9I*AR-XflNf>uMJPRL+yoABwK=b0QJ4zEB)JmEniz4!sv)aGP;r5T!E&Xg z;xJV6WM69TDWd>6a_$AbCL$;b$gz^IW6U5W0ZuAP2c{aT1Htm6Kv;@b1|ZASrBTY@ zh?*c9 zC@6ctG;gdc3rn2cThmKgTFxe{WfJgc%GabOZtj%Zb^DJ3s2xs|J;0=zBvR5b05tuDh(D;fkPQwx{ z9S6qt;yUQ0H;oEoKki$UR%|7F?wIKh{WNjs9)6v1yAk*bqg%bOaW|-KW!<&X zfHObxtoWU$FeTi=B z9)5~~g5|DQirm0=+ky3Nz8q|B1HLA%Pg&fsONH4%Vku6F3iQ`@^U*9)lznu&ni@PS z{u#ah6ADp)IB?&i@PV!^W(`a-@(>B}1f_7S78GCroL%DGg;FWJl%2j$Lhg)AZ7*7< z>o-qkxjRs|ey^pTqBlw5w0kJdpT-36LgIGj+Z1w1!6e9vyTd!dDs~}v9BH?^vj%Vl zrS{>$Wr}2+f?T;fTMVAA_R1-3usyu>%BrovIWm?c8(U9A<`N=QrEp8zJ^4y>dplNq zYh286+B*OneMhDM4wwcLu(vZ-a1v|K+zTrT4kh-#Y3Y8`9SIz6NpeJM4BVC{-rs>$ zNvz^H%`T#FA&b6{s!A7aDL{2~8I<`ekUg+`a0Nj^%Z0F|P@sh^$NsR4;{3a^*ugb< zd?$;)tIW``bs2h;1ZtIVOHy(0o-N){$qP==tw2dkQKkt32ms$)`BoTysc{4)K%92< zcX3>)GFk<6;z}P;oaey(TZ6M|ZIDyU-!`Bx9_2@tIIXvFa{6G%?fxE>fb`WDV8UW1 zQ1~&~R`8pl>_?EODDAn_@MPH3-bDgVAP9{gu10IJsN&AU_?g8NxB824)9CHT+$P!# zz#qtT(Q7Jh7Lb`QxB&l1u@`9VkuN8tQ+e35KXCHRuee)5xrz)=Tc~Rw*3@MP8(qN*1|Rlkp=_QK)VaXjHYrYPr!N zc}?7MRocA&!~XGvt*C-oE1YxA#O(!30YzD%y!Ut6LBei?@0n_E-h4OBV)-O&-y~hL z+h-Z>B#fLYcTeyJ`zl4_QsTf)X)W;I1>Id;-E!&EC%Gf1ngJq#LEOXt`%-%K`wQW2 zq}kl>(LzENsBZ!xR=89z={ge{=Bv@A73Jh6db8kpV6ZvGG#LL6vSKn~W9qVypT7fa zPi{_0Gq8xoEytp^D}>zXT)te3;K>``{er9QAK#q;A{B;-bTxSgrxXpp=M}qQGLJyu z)rZo7fD^XEyRn~%|1|n3q~*D5q6;>j5Go9pkESC79y!;Zup`=dq|zg))xmD|t#1lB zVZS|lL2rP5`Ej0>0PcV4riKCEelN53k-Jwn2}sFP7Q*7skP8s9pF>T>zUy z4ODj&Q@37-rkm3qrs3n+nIyR= zkF~ecBLhD)k+#Sojc1+@%A6Q~JR4XZ*(=n%Zo$`%^~{0u)L}PaEc|=JlbVuzLY)|_ z%aB*J`|J|JOOH+VEol(<0O2J%U!~^%BY=?O2a%d+pFEBOF>eLJ4IVuDxBiAPs(jHL zLtku+sI_lR&^f=$pKtzq_4~~RnGQSF8=b@^tofZ8#bKxUH^#9b!)epHsi@cOZ-lvs z+}Tb}OemO0>4+zUuuEwtVb4VgiNw`->Vwj@z&C6~_Xw6KSvezi5NXPHfMVj zqA6TR(s|*H;kY}c3&JB%MOE(AT*4FhBf>DW#ttDX0k2RR)BWstC2;dzs9(PqqYj1x z29XkYHylAegdlQ;qnq%Yfy}H02YU&>Ni0HyFN=cxf_x*8Aiy}M;m~x2fV_mx=hL5~ zUuU+UFO%UsrLq)YD%<7SrDA+MPKIhI1#M>X*xrBfv=~XVcj1olkG`u%48GvEpLj$Q zaF2&OFv|_p6HrFMGPq6Pn+Z+{DXV2c3mLsDKa5jiopeO@aFd9IIZ=rmWEpt-Aiz-# zN!3hpo3Q%{EG4|~6S!l5XCyXa3R)p=#$Fbw9>sX_WNk_vSY)b&!b9nl5i1r5xnzv=+m@CrbSh7YeY%{0Z?YnB4b-x-JD(|T-C>9M40DGRJMX!h!O%!J1-&IS{fBAu-E zgl$l}vpvROyp`F@>do*^os@PdS#r0}sG1@5lLzOdW+nu6i)ikyaNi0KYA`Q|>@w1< zWp$%F!Z#oI4zRcC9r{|dmkxI30f%{a_&?9u=H&eLZTB`TzYcYVo`?QeS%76 zIx7RoB40VNL-a)9?ogRH8KTZ=*>rHXJ4&?*l(As^z~?*P_J|!t3yiSXhhHir8WllK zG!P0~y&UJp&rDvxiYt|fCfMO%qXx*yogBvl&A>X*rCEvz{_GsF;u^fU<0+R~yp8s6 za9eX~IOl4+4r4hSn$jl6fP5b~?no(oZUVg|@c{iGB8=B?183=O=Rrv+A~_*<3OJ3kaVsTk4>fJn!8x`e8- zNb^U4l*>?{8w~*&UTv_%?)$xP^yr!h?VqnO;wa|0=TV#uuLaMW-e|m85t_?azC)3s zN6!Y6-ytR8zkoBxW=J2NB3ztl3JV1Jt^VLET>3he<;mpM%(7%EzgyIe@y075^7S{R z$idr&j)wVyjZwIaNV}?0=)X>90Ao$`Q#Ut|nYX|}l(EZNWioqFl zcxRa3CfMkTgv&ev$5~Rsg?(p6YMr%E_hrd$%ws}3r%Mf`%mT@?_b-SO4ESbcxgOOuc`xMHcRWlSy#IA!uy*XPNes=>A-&AdkU1OI%Nq|Cb7#K zV$wLf>^5#|T+DTEsH}%G1|}koDZE>Uc7Mm42|NL>QL*D@rx{CE{uEAIOah$guNBc@ z0i4hpt%fhd*jT|0P6W`CGj$G9!+7Mv)ScFeM1fvjmdvh?%WXD@e*H0%{OY|t3l{h7LV>cY@K zP_Z~2lx_>o)|MbnKnmlEtd}2=15#_*`3AX2ih)FeLc4;?w_@q*Hb(>07{M{E{lxuq zX1T3nUPoa!i2o|L&FvmR#wzlyxXS9N7jBZN7j9`+7kj+e0K~sd^(;WrQ>!Aq#>Wm; zU@ZI)Re*)+((%ym`kv7jH|0F zcU{5O;Ti3U^Vd>gN{fRXG3gRDQL?nXIzIGl*oIl$?TVhQL~edVc+VeYU@lbcGo zfI!XMZqvUevhz8(sjwJ@N{*OX3uMngAi2+{S7zQ zQZ4lvWBV?9N*j2e`jK;PBQ6`a_aQ&o;HsLJWnk(d)3Q}&KhZcedrDr6m@r8|JEOsM$8aYGW z$;328CoG+KaEqT~lG;rOX;u4P+e`O8x%Pj2g5s$ATig;MhR*%iS;|PV>^nCg5t`d5+Z^Y9zhPV?$*vtFnjM8+}bWQB*zUr3q}TJsUioCn&9Q7+#2nN)o%!Gu>nC^K(v{} z6B-i7AQ;IjQ735_>gHb*2>}}^IRVl2zlW@#v}v()+Y^z524bMXQ_<|#NnnHH$Zi)p z`z4wG^T!?uKM{#lbA!x3_O z*VYGc#yFk4L@^(+Q8?_qLka{P!6KprG(5yc`1ZT5gF)ABL7RvwmY^vMUg;LE@MfmHh1P zqXWFKJzhR4$;?vVbL3<)OoQ!eY>?3hj*VeZ8`LqgsfW_uvoW2hTk5L;0w~9be?|%@ zGJsiQ^~45qhtE-4J9)3^GHqkw2+tdS9lFr$m*V4O_?V&OV*HjJauIuoQ5Ml` zZ0V@Q)x=PU`ZDLAq%tr1)a)>jVyW{?(*_(s!aR(QZ*2L~RfAW>-XNBu+X2FwqHvt2 z84V|sP3{5Zb*T24|b!Lk2Bnr4C?Og?@sL0-y3;MAl)n#LVXmZM=pt#wHEUR zws@D$qUK^JV<#!U$2oa%Z*R02YUzL+&*7yF>`mjG zuFg4FkW{?vW02wlWaMyzPc9P#mc$T_Drk>VS2K2F!$7GV*)dNhU2j;On7Y&;2$sCC zQ9Fepx3VC?ef(-JZQI-8yigtHU(VV-eR{2|>9jdRRbQS%D>eD_VcRi!dCV1zqjWIm z2A@kyRx|vZkqBOcTjQdK2jCQ^2a-1Bbx;Y0wqpQJ?c3yLc7wKZ`Z@%m+E497#TuOv zZ{kSw>*IM{XuUr^Ww5Ud4Axllsj;Sl=3u3{B~Z><%AINbTEm8r`QaHXuV0OE43EW< z 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⪼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%0DmLA?|7c{${9lA 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

E+h8Kxrg48 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%0AWRg0fb^AQo_ss&VG6?`~mH> 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 z zxczjpDYLsN`$mCz3NR_2KsGIhxkOo#^pSgBl*9I*-!Yv`dhssetY-5~Q6DV*s+wn- zwVl64-|0W~N+xS5r7Q`oVAgo*`v3BX}D^1># zbfUJ#eonohwI&TuVOFzrWlVs`!SfDGWGET&p{$`q-e>n`q^SZtIJsSoy9>x(n@iXbivnBk}emVuUf|V%>D7c ziFL6PK}Tow=RBeUoyvqI89Y|eOmNB(4fOIi>V}_EtQ(a(nXx&Z5pQFcIrqolI5wJ_ zAXoBj^K+x|Q)aBJ0Vo_e;Ok_V6OG8i&M}G5CH9BxPvBelbkJ}};f~M%{K1DEBh0Xz z0{;#aqzxkyN-kjuGBieZbR&E}lj6P*2l` z*%Bg?>Bc!xg%_Ehp-Rjr?)Mq?Lps`0AsmRXL;qq&S|^>OQ;0oeADHT3@VerJHKnh8 zHe_tMxyQ^rOGt{WZ%_Ne3$P|0fmL6iv}_NHaFo5A&6lOUM_8RqYe9B=u$lQaTuP+D z8_oQj3z&m=qqA%}p?k>g>y1hb`ZM2xy~DI1@_sVPb~c)7cLRqO$r^GZ<0WT^)cfam z)my)UdS+%7U3@;xs|0Pn#%Si1+&f7o0YQoQ1Rd-j?t_~f`EM|i%D0h#0Z$^%DZ30D ze|=cvVO4OVJ>T1-7@q==l}SX=)ffgegx=SlBUqWzVe9FnY@LrpOsbEfwfJV;(!129 zXWjf&byUQ(Tp)V&xAMSAee$Kmtm$tANiAGq zu0@}3&B-tuaT@ISk|0Zm`mMT(uluaoJF9f<(k8%N!SLTq0XV07y zu@>;y4_=b&FE}v!Nf};zG^+HA#VUb+{dhAyK#VGW$sXE}fpgfL502&ztZaMd_qH^FcRGhwy|RUS#bjQI5GG~%2&BQ2g%3@T+=20 zg$Ntwb4}O$m)PgQ(3_pri}tC=Xcf)LSj*LmI?^zwobfr8o9&-+(pHht5~}bkRd|gm zEP%CI`ij8lI>b3gE_)L*8M>oW^X=|kQPTJG9jOL1h`&2spV{U+b-eEIIY^3 z|ASVrVi=If{E&sswh%`Tr5cllyo?(AL?en};exFAiM<|GryfCbjI7AaT=8mfs9iTn za?Ym5ieWRC1I2RTgZD#0L^3tNzLg??q?$<4NXKqUU=umTNw8(#_kg^Kl%~ig>>~Myo%nG z^LTprETPqPaOYaiq`{P$E!yf>PP_Khq`~3O2{m+}wIDq_T`Jv9CECo2|7-PhMrB?0 z7rSMrnj|8%{PSEF8>0-qOV|Fd%uZ;`JElTj_+JIhJSo> zByx+eP~44oKSAre64mG1u!LT7Vp=b-j9puPu;xeKX1MFyoCR}t^V_N{VQE3aF$l%=PCX$S&@U6Yxn+{SG1Za ze_PtXl43SA=ek#0G{gPxfsCFI-PUjJW!h@H zKQZZCe@Sb=oXErN!1#DSscVb0)pOkg;{D~iKwEu_dw~8F?Qe;XPE{sSm#xKfRZH1( z-REtMXHk+Jb^QxxV}^cTL(nC^wNF8G{587*= zr<*2ZrN>_8!iheC${pDvIe;@=9VwUrrh#Tp39 zP^EjCLi_Qpzdm#df9Hgb<1d&UJ_cszIG7Eh%Q_I|f?4^*SO2=V{u^KYo4)#Yt#E(x z%#YD(#9El<6^<|a6SbXyZF=FR9vn9Wk353o1%;cEXe5F3kAdRvOaBi;afzIBY!rVy zL#us^rw)ckS~8A6aRh2TDDLZ5oJ8@Z^2&Fj_zg#*ctr|p9TdO#J5jtKRoOxDK}i(P z^wz)GgX8sU4@dx`$a@(q z=qKFiAo^o(If(v89`be{*-)DCr0c7u{&S{#yjFX+^Dx;oDkizN@^<~qX=CMrZj3%I zUY?W^T6wP}A3x|k?gu^(vS#PT^Yv9pq+gw^G0&+nN-*Az5r=ZJKt?U9z=K$4^vUEEr>Ny;I4f*b|(P-R!;K?8>*Ru&yFX1~bpqT#j;? zHkm%PmFv+T8Kc+5&n`|>iIPKH%ZjSd2(X)?>$RpJ0co^r5P`tV_SIIh&Bj|D?yAJ; zL=XR%RQ_SJL|y=ayP5eFa&gD+svT$FN<2zhVMJT(NjD`DD9Vd>sTeBrbFh_Zb(C3m z#FrT6v{tjZu`^3oh7bh*7r)Zd;l`rex{3xr@rS&1iyG@@tc`Q-U4(vEpeL)n3J)9Mzr-4%J>Renvfk^OJB`i1Vxy1#_l~FB%y?kjTp%G+Oy*^RJzM zoz4lw-y$avTb)35!0tCFp8^SaY<7xLr=p>owQpBkyo{;AzW?Ob~B;Et&0-9!NSA#=5vO%$RogLc49~jI8k&1ot|g7sf`}49|22`fsRpiQ2hZ;KM4k~{A@df# zA?IvN2}q`eP>`c`c1siav+xte=A0O$8|}&GaiW6z&v5WeEtVv*u~&el*e(8Nda$yQ zBN@l5uJF*NawK)p%f>a87o|6sj}^&+vgATQG}GtF{1R2`+^Yg)>bCM?>>bD?C3KKV zsg*5aNn$-AXA9x>s}#y0z7L#Ppgbz%N`=i_Ai7`W)r9dSoTiE+9Um*-h6|R@7q6EN zh`ZC6WG}>oL6o>x|4|Kz6*C={|LC)b#4YAYoO2l>|t_j*%2SuYw-Bi5z6yYT04BFbbbZ#2$ zK3t8EGoQWb5htkO%QOo3CEQ}vg$0$Y_1^ga)LO@y2F0;b8H>Mp(>dJ)?-8W3F;P6J z=J}9Tqk`tj$M6}~Y9-f+3c1Rc2{s!ToEvLr*5oRkawl$NrhU96WMna5*koSI+3#X| z1jZsNZO3-31it2Q8O8V1NRJ%ECtP$v=B0xG`x+7nPjjeDu0P;f+|AFC zo42^ZIUJGUjt?MF<|gHJ-XK-Fz0P-opDl3|1bNTAl#y0nUQ%#Z*FtXIBNB6zElOJBrI$C;#}=Ha>D`1KJmPc9m5(TZCRKtw)dl(Rk>+& zRnc=fY>MDhaYuk!{P;m5PACqx6KO$m6iCE*xF<+-BCqogjTj-)I*yO%gR2Eds(= zg$xn}xJ%y8kgE=P$_vhffma*tC4X1S2Ig#|eK|)Q%<0fLcQx=Yjy$%Eh# z=kuO(Oz$zA(LII}jvRy9-{SL+9>u%8MsX9vN{#}U{CA^x{%<{_u?NDQ5UrP zLPM`vDl{~7iXuS3F_AZCi7J6Y%0agjLPV?v2^Hil%x)eUjG2Y7V0M0;;W!{E_kLS2 z;e(gJgh_*gm90cV)?`ahGd&`JzC4TA(3pEbxj01SCt6tVgp4}bi3^SF(4MMMw_T(^ zo(>Z96p?}DC%RQGX-npfB6K86jI%xCTi=HtjHuv>*uR>IK;u3(=$z+wvtPDd612uP5W)2z zyN=DS^J87?MF^miXSbi>G~B|kqdAUW$DaRtn_^tNt<3qfz^k3ktLziMRW)Ukwx4!h zj%$9iDPX?Adwz-)(@;kP$b^U4_a;AZbI)tuU(>jwnKqQZAZXs$E6ko_qbBt8a&oR* z(G8QC!OHg#Yl}yD(^M)>Gmz0zmzqV10Y|$ z)7#6;?9G=&eV-KxaBybed@&Vt*k5A!tgHHKHA`tpV0Mvy(b~{_Y+>f=b+Yf4VKxZr zY^ZQ`CSFG&ereqm?H6%g3|%gz<@LdKkABgH5bz7>dYz_QKkMwSE_FTri*|%hPt`4x zx+hXMOxu)1Z8!M^SSIp}CL>KF;B^|At1?h*z8hO2sEdr8`&pUD0T2gqR~k@w3x z6j}ZuK~#Uo7&5}}{yYs@_o#r0j=}&V>n)!UOf!);_)f(ek4)tKix**Fww(q-2oJE) zzT$rHy*ai7c$!YQMXPLLT*tD};PXc{N_(`M$Xow2X;Q1%&*y!me^;N?mVL;b>qVyz z@C*#&toFBM7``{tlH)K_eGXPOhfWQe_o!fs0j#ICh#v;faE?oIW;8ovKVZ2Bw%Aw~ z8fl?^6lJroQI~S|SMgaRowsSVl0XAz$Db?47P3-89U+LhJ+H-3 zvkF;>yfRaT5|NZ9Gg9$ahW7T$L7f?_JQ%b_9Qy1K)+AWz>=VAR@tZys*zueDD=?Z< z`tzFj?>_F!lDMLCjOgvMt1s#w?pqz~EOEy(t8eTq`D(J2jU@o=&~E)DAdNNIXIezU zUDfASA0m44dz2vnPp>|dBW4qgb;rj?1c-=oYISMs4cwT`Q%U*tu6&JD@;Vg#s=Ly}(0F!# zKC!X=P$F~=uf|X34+X0!hz|>x_b52k`wo^o?hR*UXVh^egE}eTdbe=5GN2T-SE^$5 z!h<-n^~E$t^5Ytn+YA?0(LYR7d(sxdc)lI`GlSR7H{-dHL+<%_YweyhI8gYmE*V^1 z<<&0^ow)(QPUw9Cin=CfYiiUzLV@G$^wEMvVl@RO#MbbeXz;A%Q$$4G5&!-H`el$c z%Jr^~E?yKllrd*e{QzzOm>NP|u+tMc!45b_c3keJu#WC z>KhM^|E6QdNeu-VS-ykgEjN;$hYG4`AEfSa7m?^v-pjiYTD0>=` zQ1aDf*5J$JY=t$TXTKIv!qn$aqBnl)N1r$r?(QH5kmj2J`7Enit~OxBp#Wcno`R^KXz zx_c9_JfD~$EDnPrXNp!J`Wf3m+^7xZ+L};{v+ge;aWM`j15=z# zhCP0<5D=ibsLc+XO`ptZw2}GOZ4L%W?kMKBwY+4ZU7}gy=u0}bF%kf9qkR)FNY?)u z^*M45HA+{NP$#UVUMkgUwkgERMj|?`{W3F1)P%eVKXsb_2amipSk*3-i>^)HYBE!*8&$BAsnP?%8f%3r1-xE843Fr+Wd0)Y0%8Y{vbu z(&9XkW?#Z%btTV-B${}P3nQZR3eVSCf@rHVNc=F}gkK|4NhlS0_TynFznTl)0?n3F5 zIkz5tcJs0x{AQc@{5r?C;c7AHk?Y5$sf8fRKnXct=38=F5q{M(J_o8XcQKZ;-N(1Q zL#=8da27`dh1>`Ne#jAaUdjIRHKwAvSj<|PTd2sxP9_o(xgR-a(7bI)FnZe) z7+FIHAj(Zj@Eaxknw96V4<$rg5v|x4w8}6;saY%AC`YbNXp4Wl-+Zsag){X{_a^e5 zxJ^*%5lo~?77>UPZp&WyTo<@dK_F5+8|$Gzio_IYX;!fGrj=Uc4-nCw&+Rd{*AK)P z%Nt!3(O+cMvQ>?E;p0OIeQBpklw6C7DNP)pJK!bONjKmPzqwc{x>^Eeqqn3aG%&GN z{Gk&Kfk;>8!cUad`I}P1oc7qHB+FKgZCK~UoE{%NQMepE@e12!;o7MG0T#f$xQ_)Z z8-j#>zn2xxLfEX=V~Li7)pTQk|2>-)ehR0$7&rckM8FB`eEuU6FnZc!bhtkqMwCCv zyhpKzB+qw@AMpUGy@V7Usm?Y&LVsb|btykR5-=1My)MPy*svi|C8zucV$=%J`UU zwm7s7XymYK86#&J0F3b%q|cB1!SYA&nXY)mZrGsKqU@m(&RFe?jDDFw!LBP5_xCiM?-QXQITMMhkoxioIZqK z&KLMOffRd4wg{DyypCX8v#M#j{pJ3N+k66s7?zQs_Gmyrwk7@XFeekivs2cDhTzlVQ?dFI56n{$Nvom zv(P(>9_zbdphfNy%t^uFTx})sneY!IVM{nSGBGQ|;b0tIn4^GVi2=&RNuXfwdSgL8 z4G8`wp#s0GpyDE8_$EM<$g2SZjscoF0Zs0#V}NGTvhM=T;rO8(6;{orL$;6C9Qf@0 zeK&k&@`}+3gqWgD>#?Nx zNxm2bg!TygzIBnUd3$e^fyvpt?Iv|L zPv-+j4w5XN#FVr$^M06~#)8be?P~dzKKJOkzBMk|g5!G3zo$low$mXxECJ$DYCL`iw88c6Pvd7(hLdNi_}5aLjE44a z=x^_6Xf9u!6AWz*Q>KEU4Mfa(VnW42yOuJ(Z@)Y!Y1pj{z|@+6%XRXfJI*`m@Hg9E z{9%RA#~l(|N8FCrhflEY;^n0O+11P&36@k`@!CY_Lr%V@FtpGv*qG^Tl{@TA97yoW zpDO-}2n~sPV?L>9w}>3Dp{{6!4=K`C9$zIf=0&wp6*+Wjh=7BHf#IR)$B>55f^Z$l zy7B8O_|y`iCVKrV@@C}F=&%H}!Cv3F^@sXUI3?Uy3Ms;hAM*fOv;0L81z`+Mdun&4 zi*2?XXKTPTe^Dr3eN&F^Y`?WtKud7xay6{NMMWexxkpMl+2W+tz28x*p^{s=T^Da zSNRID{g13Gq65e!)*;fxeCTc98;GW}??b{#JiRhtlJRV)7~5oUY{k$nN=&@HkSW4} zttI^P);a%nT~)U5~X7q zELTx7rB_^+BvQLV1>ezO-I~OH`F8wx{-EB~8^6jRdpmi;e6Af;<Z<>>HNp!9)`wiFi{+S1MRN)-kv9&7leo>;a3XNbsdT8PG zE2cuz?f<}##=c;;GbayUdQgC;Et`4ttLjC3PkE9S#}R+tVBNa=RyN1++UfGjSv(;5 z+;CEonO6?A_j2xM^=0abP4UbnE_?oIqA)JWhCWmc-SjOD%~1_$HB%Y#f8E#>-_qEr$;MpL z7(+Z6@|0ar1!<9v1tPCFtW>gN@2igept~)Boij`s;Z9Hs1#s>C15iT!3y2ED0k!tr zw3!Oh0u*`0et;UHDz>DOb?T~7fcSs^csEp~4TaRws@Y^4G#9UpEY4*ate|s7<>Xu< z-kSdDhPk4pmAPjhnrf7usMQ=oVaF_H$Si6#|KSdTEi_nWG7w28g5(+L;df(Oc@kMX zw9ovBG&Z!Sv6;Oa`^RC8J@T!M)$+vtO}`Xo*`c2$66ZCc&>X63Ct1)sTHs)y4L zYxJ^jZM29dk-f9E8cF;PNziIK>6^NEN?kx%ev&G=DOIAUF2wXKatQh4TxQ;W{}%D( zVEZnK66`$4oov_!k4mr24~^nMdvr#-?Mgnt>J8@1U*dE5+kH`gi6mR_m*~$&>+0&5 z&v)|S=go#+$u`hfyrFP|Yzd7*fqd4uL3(3XCS(I5?sI*ncYLZ_*+Uu+W=i(&k*=0o z8q0iz?JVQp&&mURyAyNUD+v<- zx#4Ru7mjM?2Uoq^9UE6q;|a13p?yE`rW1^#jYYw*SRIN}i{4l;MynNLL@4Cc z)d9Y!ERD(esu*6sSlW& zMSTas!=MF%3e#f04)~?vzcDh^oXnplbVb?|(YrdL30;x)-uKlnnz{ON8uZn{=?G0Z zvc)@-E&hNO!Lgc?g=Wytk=+!_X}K50l9o|T`=_s-ooZQ4nd)L}0%MlRQ!Zc543<(9 zS)6r(wyXkL#+9(x)0be#R=1qp0K-VLPBbpC<5Ok1qOAT4$IH~Vpw;|_J2gqp*5DA7 zGligtFkh=F;jjLZ08aP3sV%E!>1s8%s|9?jRzof)7VvO#3-b-d2!v7>V^bG1)B!6`^R>iQ0#b9b z)Q|m{%cFPsi8Rt{mv`bAwcqdYd#ZErKpiqe%pmEhb3Qf`Dhz@PDzltiDnD zEpok{roX-4`@T%|dm|&I-yaS8KlEEZ^{xG0LDSOjIW+v=^jih*2T6NC8@owO>k*`G zA#43uq>hu1P`Vxh96Meu0@+Iq-Z^|PEmFvz+)Muny7thg-*IubvIoTaK=!rcEup@iF&&o?J zue{X76t&LSLnWYwEV1j=f?S`xyHG8-3y%fq<0w>+?qS3gsgJdZELf-!-#}P>*xqqI z)6M!DDoJL{#e=bwkacJOV!v8(XY1CKg#A63G+*Jo;c_GAq}8&i=t~=fiPv3k**8&{ z)X4E{viK@D5}!7uHQAH(RUKQZBJbhnf?$hdSM1}@dp4_?e4NB!kskV{6X_2G2tPVZqWRP zxaDC4h60iw1W*-Ogl&OSJAp+K>K8CydJ>F}=W>C|vnr==pQyIZ_t_F>rUB++}kyL@vmP;U6j&ZZ1yZg0q`H zm+RqVzs?8`@*%Te*SQ8XXyoJ+A1v2Jy-MR#RMKGy>8#ZZqceu6QKi$)k$`6ns z50d!-u!uZ%egI>(l6?alN19)|i?C_HD48Z;h`nv0`c^VNT>oB~0;H-akW%Aj3^>%F zv6MmNimXk9FZuR2^cKamjG?DcV!fEH1iC|Tvvu+50aH1xk3@A}kl3KDR7NzgU4e+Z zAR~~#E~9Vl)+NN%>XkmA@zzA*NyHycwty+OGZ2%x@0BG$^7Nsba%K;FBQFMA9rEIE zR)yJDEdE~B>v!prT?;K!ho~@I8w|o?_(}(cK4W6GL=N4kEfYRQSG%t6K~j05x;>qd ztJ^2!!YV(BsInvcR{1G97nKy8#_y^8UPN%R+RtS!th}GW8!6vj^v1{_t~9Lq*y@P^ z2L9LSp;7W@kTS(s%L|sStJvYIZr~HK*C}~AeU)$$u|}??E;1p)HO1~zkLYhh>@hC+ z(1~X_A9|KxZhQzI$oYL%31=C*n+gh>Yc_<*=SKLhvWcjKNUK^8# zk-f9DnkIFTsntBLF8XLS_39!$bVlS*rdIo;+#wzVJ~*lWfjg`Gir7kiR|#Vg`v-sY z$j`C{EMXbn=kUN>2oDUD!WUrpQXr>kiCf|zRqXe?qJ}9{K?bHy*F9Lr$V39l;C99r z2)z3Wyxs9J%!3>N;<(Ot7amWcaLe)2rEr+k#Qjj(6j$1wM&svFQ5|eZdV!6)$SFun zt|SJE{0mE1iu<3FR(vEut&%(BO4P*D(gcUK+AA8~r zMzgUG#A1b5=n}IG<U^O+f>_m4fL})NtrgC|X4kxyUIf5pO>y$2)iIel^Mh zS?y9>|Bi~3=i9Ol&`A@hmSC(jo)mzmq~B0d@xuH-Vn`gFONGJ(8Q5l{o*1FMYX?O%+DN=i2F>;=_FhH~)U_p4Atl8-cGfeCW!VAcR7v{j@@{td* z}nFb_#yq0Cr#?EaGg-fOs|h(cyW4!)8Y@C_Y0q;3)UgcesYqqu4;3b#mlRu@4ni-q3@gi+0x>f6nfgVdnbK&%S8RHcukxarlz2%cfmWL9KJ zMw`FQQhSt_WC{ie7?7ddl$$bPfTM{eektzZJ-G?-D^0ru39$t1+lMO$guNa1%ogo{ zfCqoGjhJKQUri*ek)N}4lGmSKrsCfw{oQubOe1eA$6#9ehtpCO=Lh=~TA~fw%1*uf z*8ZM`{-qk~)y`6Bhou3>l6jlc&YI(CXD3BRwDUi`+L@!;QM#CvKA29G(SXE{$-9Ln zp63uGt&XJ77RrxFANWqs(Ds+pR=iIl?>yS+r56^R8S{mtW|9fAlODC?}N{r=I0uz=6kDCQs3x~$K1Z_)4@hf)8!nGJaRI)A5p)U;=U|O-gsJ>5{ zon0afPw0$0GOa}<)V5}%d-g1T#p#k)y2QehaHh#Fp`v#k2vpW|l<;zG!-BWQ%N)%m zTS$X$)-<;>2k}?LmcaI01uLAF{XIpe!2bQ3;@Ra8-G=tA!@{)|Bu1lTUX0uEPm*`>kg#_%oft z|gchLO2<-E@Ca%E4e4MCo^Sb-s__NRB3&KXj&Iojq zam-bmiz2lzIq|g;Y$D5Fkj2i*E%1z3_ScLwBK}r>#r7ZJnlmEX<@#_&{0hfAy?`9% z*m~UTJUeKw8O(rj%ylPxqH)fgoO+1>SBX5kT$;!!P1SyArVJ$W47raKbfytyaGBGQ zU&wBznjmC7JuVW|RCXg0M>WU3zdZ%xcsY}KwkId}7bf#GqmqMGp7&4kou2rqIMd=( zOE&M8l1Q63ew=+(_v>~MQJBF%g)@i8s&aJv-7!-u%+HeXtGsdZL8}mVDIYO4I6=@}_b`(#>nacz7W+ebLN`jVp1nUSuuLZ`-us3;@h;Zk%0Md9P(t|nKJk=R)8Dk}|r(bZ7r z(yK2ymt@(AOWpC40~qiS^J+r%!oKNgVFETc1gxttgxG8shPnjMpkQz6gFV75nO{YM z4v)E-TqBrxwPWUjpNxvsf2H7Go_*h^UEQei8!$q$2!Gi`IoCx0%GKVx)~xGJq;^Hj>Q#a)HgKs?GgL+{;USk}o|dFI~-_ z?zrMhjL|#9!WW8$n*xU*71a*Zf=m;}4X{lQ0FgByG%d9RMiaiE(dgJgBp>x3K?aBI z3XI-DGluJJqhsf=2LI@_KC7UQ-_>UC2C{YzfA(u*TcR^oSWB6;YQjlL915c`obJzDF$ zx$|$)tp(VhU5Pw)d&s~zPA_b*jD%}k zXp)O>)VIB-57<&3z2d$V82CsNndY?R@l{0IV2?j8a-+2ZY4T=qvi@9JI^c_jm;23+ zebJXh`Q2Q5BY%bI!w823ks9sm|34nB;9~4t{$kyKfmY)K0N;fpl4|s592qF3y>Uc) zXb3<~8V9 zr!6~8-QOo~+h_fxD-k<~0v-P`ou@UoL#og+_$;r&xJ%98eGbO?1Odwx0%jDiZ;YJ` zCR@_E0hj?alt-!Omj=$J0l~P{q#htRj37{?&COcKTyYpYbWh?4fXwp&s5R&RH^4ZR zUF&FI#MnK^BdA6adhWj(#mEWRz8x`wJCY+<1K2SRexB{he(_`BY(_C$`@ZP{Aq8ZF zHzliHhXoRkrH|-%$9r(9R^D^Z97;6WE(j3}A%DFhLV&=h>8nno2^OD8p67`TJn|)4 z%uemOd+xgH_kHjWdFHMNzns3U;R?8xd!X!^4pxxQOD1g$9m4efdwj%b{0NK9n&+!| z$*_Jt`$73p7=#AKaADau_%7SHwTlklC-3?_+vi_xDzXNDnuWn?Y^cn>B>Xsw3zc3Y ziQqw#aNX<6&3hE;Fvld)M$+37G#ksKP9dZ`-|yP&_q-O~9{UR;^LswlmQAA}^I^d^ zf+`DU`px%!(fg8E8S<_=3?m!n6LZeN#zznf#ZMw;JW!u72dH2AQ8&~_a+XL!T?lnK zbEJFrgzl8Q8S_|_)t%)r@D8rEjWZK5GT%mulb`wA{v}QSJeqf}m$p zcn=-YYI3L_S+snv7HNZlG5yP7QrJS$7cGzNr@-%d15gQIb@QF%JR8~s4oYf9iFxt1 zShi2qe$l`NT$ZdG&?dCjG)VBJBERN;gRasadYhK%?0I62TyBnwA`d);nbc|zGLhw{ zJY%`3;J2f zM|8_Q6w+u8z6&!{5-YuBxLVB`Rf{WmN^tJz3RM7T<&^+?x$apj@d4;|{9!S9t&r~! zysOfy`z9YV6)~FIb$6g4sM(V&axGP<-KR`~E!rf))RqXl?x^cJiif-J6Vt64C_dR(iQ5Y=nIrM-z^J=vp zvBkoQN>@rOceSgbutlr+2Qq7nC(W9>hWpn3*5n5Mdw(_@3I{8az&GSO)JX_4Q z+Qi0UiCBo$wArac>#Bv;aq&#G5WDXpb>rEeAazxI>%Ss(Gcft;Me3&YCUpm5UkF+X zsY?Up)dKCHL=g`MbU|yy5p<4{ZX&k{JD&&S1y6^zOiAx%tmvk2`+e}4q8_^_N!}_} zNEG{S+P1E$2S0AU4gC1=d)@dk;rjyL@Nyw+po$`FGwEOG>RyEHf9;!0=xIVd=H_)% z4jT2lI)t|%AW`uFpFKZU}my0JDj9p6b|nvO+bU`1RG zg-OvBhsp@Oaka|R-V{cC>o5v4^)L$aNs7X#ZyiNp9EzeS46XN27}f0I6vpdNn1>XF zsi;<`pcH|LD+1HxaBksmK^;X}>Tc{oow00@_BngHQ6~#!x6CGFlC;N}O zYY&QFrq%uo^%f*W#S`x)D_3%EhO8j3t4`6C4i>gr92fCSEsk^LqKB^hR|q)D*}ncN z0*1HLPpX6&Vz77`m%A+Zx5Q9Jb#&McrHOYvG-;V6I8=04E$l{n8b0 zfVT4RPAYytcr4k4ySuvkQ*p?Gqsr6^6Y(r}k#wp~d^_s^{q*PpcWq+9pryc*bP4^C z`-IZM8LrKSSu4kIp^M}rX*RU-PQ%sZJ?{WHC7k$2`kH=>%4b$A7Y%032dN=$<%D|Q z3gbsDX&Zj+fn=rFGMI3OTy6JzwuIl75niZB!ocp?fSHJoK4Mg|^m~JTAmix``X<#0 zd{!HLh1+x`3sh{c-qA)}!1@gh?`2r-K^YCcGaGcvKx?#?&(H5K;;aFBeMh_x_Q7@8 zLlHvxTrED1o{i$oR7hB#rhqmDMsr^xXjvo0kMc{AX*~;R{k#qi0Y})$gwQTdLyoyiV`@>52750<~`p=jrW> zV(}9|1jHFeWow|a(G1@0)=Pu;yXWFj(g3bHu~L9^@h5(HXiezyo7YfDd#TYEeW;+C zsS2I^@<_(5znIV8!cJcyO!}h*vw4CZd2(D+0=nqmRf*61w|ox=FY~o+d(F+;+I;2) zecK1V0WGQKB41_98){AXh8nu*yW73Z_6^vPdg!-i;|z5x(a+3xg(B8{&7vptfHNmS zz9NQ&erxQ>qI2+y3ZcmF**l+O@)iGdlaKSw=!$|ms$h`|4Q3#gzsn~h5;lDd^m#0u zE*6f@izrDVVU7uGvr$ZKYYPr&pr?A|8`qo@cuhLk-M@HdP^yZit0Bb5jaXB(Lqw&4`z<`a26Xy*K zFkgjhgD(8gn&*80kDQNySF3r8MuS-2neW1f-ySp{Em**)eCCS^%vkHYQ~0Qx?t%&n zVWzYmbhUE4E(UYxUgO?;89>0?8c3|wJy`xv*a|A>iFHxm|G0ggU2{m_=``rT*T-jM zUJ>XE43UY>t?-#|(t`;>^C8uPAR*%->)gH81K&GOPplPSbN0PkH(eFh)ouU~bb&(U zZlR7o&$c<+8L8izh7SuNIQ7KqfyNK=!4--02e@|Vkx$db`l>{W7P3zVO=qfg>-*{E z2G5YWgHz)*8xxJuTkm#z2G02+Is~J*fr$;Jx8Cm#_mR6WRwV0`4trOf`@N zNCxMA^VFb@miz%294)zc{f}$4TtX*b?};_!PAVuw8R<;yA)J1o-Ik!`i)n=h-m;wD zD~9E{RrQ2Y93{7)iRv+8i|e&8r~i#IM>uY-8F%tpTX79kdtO`H0GoXr;1AQOQ+30qULbpa0!&^1^kCb_~$4?nV zqzXM8#ejxC4H7P-$B^!ym&|}FXKWfwLE`Q?Ka#>D(wt!;ADx1MTz(Xd z**j~kNvR>Rzr2$3S}xLpM7`y<8dJME-at3ww6WdXppeDHTm!Ws-Q1ida}6dxq2O%}pe7h+IS>c)S8-f*MT{(F#TV7d-UFBiDjhOIOX8DYu%XQHZ4s!o_M8ng|H?GB)}s9qM!%EL;4%XR>##l1 zi$`}gd-TMjd-iEDV8_&I3jObtU+I)BLBB!gZzFA+m`T;M+GOlLs9BvP^aUj~>Kka@ zub^GC)2=b(lGU;{4oWj|RBHEW}MjqZ-;jDg?7ZTGSZ+BpkgefAXQaiWs z&h5ndUxzrpl~A!^{7`PKj0TG^tVkn7_v3!D;G0glCK+U`Wpo+GXf4abbK0Xkl#^hHVZWSsPt7 zk-sT29CuMn?s#>IE!AfJaX;^cpcQ?c>g`F|9OR9W5GG1;_zrBOZ$NQLWq=k5Ltgcw zBwEy;*lO@^y}Y7=_dtb(uIG&7<|fqFz8^$dIHX9uK!e* zEEpzEv;v5Gr-F_aPf|MQJ4qsU@b_pzGLe(?d|b zl=ZZ=Rwu{TYeDql2;G|ycyTWUPK?VIRjsp8z~%F4QSh#`FxPC&PRXg$({O<2EV;vy zXMEFz_bDEYe-g3tAkd5b6im=o2}%a-2XVkhX+*aK9;u$JG+S`rza_br*EsB_u@SqFn=&G@~OI;876m zmQ&P&uh(yE=_f>oLI25|V^TJ>Q$b4}G-)GBXc=qDGagYkoPZJ zYjS3taZSsdZ*uk0UcE-(x8atDkl1EevCD*NA!}Z8owCgWorTdX`4B|x{dL&EeF*~C z1nN6;YtV)q<}!DLSX}Xrj$i{BA*~0aiHs&FFWC_6GHnQPnO{M7V%R^LJ8_8C=^S#v zp_5Mr^sKZ#{vp##67jK}4+Nw^K8`4N(s$ejMUR;)O)e$BWTi>_3LP`ICOX6iHsyQS zDx|P5AFe=_SWHpbqwwZfm`qq8%pA36tO6=$AxP#!7PlocOM&bfELp3=Kxtc?Mx@l< zVf460qc&Do3M8^#gBC>EB%mMt+m3?h1OXe<(tG&bz81F8v#(xZ-5yd;0qY?OQztK!x61G|0-m0)<#=I13NP(DjS}n zfNE53&7Br)>un%Ds)O5zQS8WE8|zYXONwH(UR2YX2qX2EqjbyQpnFVi=9(n=>?oB~ zMGSO~AX8>GAB(@+I8KniJq6r*v4{M|gzzu@?5R{9rC|AOhC0sm^X%O7^9 zi96e$zheYRR&1eh^)oYe4JwDH)^kfL&`zVZH$cgfQmpY%U*x{mS#uYv1rq5;xuh1e zJ#&7nD?+o(2JOhGziO*5nL)$W@AIvMq z>4bYFh;K?Y+VS0c!y5B)8~CC7MG;< zAW?O4C+(;_@<%v0y$_{f@pu|W?NlG2#kKZt`^#~gWNDJgK~vt&z1ZV z{35NP$nTfW-Q7r8xMRB|zXF%`DCrG{DXB+9(izM(UV8{;B$A;mgMn|maBZPDgK0y7 zd+4%>p{-mnm_T&n^*+RIbKoCsy?~1;AboP`a6xE?Ucpy_Xa%AQ{u!ojB~TvO0tecs zWUh-)9^Ma>s~fjaooi&X06WOO7Wr1 zcncmIR35vTw|UMM(q)`YH*ON(0QoeMz&74#ftrEm@Q#ZOcbsq}f=%=}6csF4N*rl! zMmiVN?9JBd9E+AQk6LD0n$ufn!a@iITv*eU`xOrVWHEDgiLr?2xf@=?uSlV$iBGBoe+I$!`9os zd81rzg#uvGxQA|v7h$kG7UIRBVn7V`oF}PBI0zz?!(@ljwJm&wrNbjKV3_4xAOjXv zG=cVe;KLWeQ}u;%0F-;sfDZqG?5qdcmGw|D=vPAobwqTAvi=ehNBcq@xOV;?8r9P| ztuaKMs#6wVabc)obALn|3zikhwH$y`XMl~7$d)J3OM8iuAlhOoQfc-XMeo$AzZUUo z5D)6(Hi>;RZP6-`;^rEGk0y=>%p;p1sNy|{3E72xI%;MoYJ?~d#Gsn;;bYT`b1>CR z@UDws%g1?MqckuOe@R8#xCQ^wGimpn0Tp$GE8sU92_|9X7uYI5v9*y_6xh2mgJG&u z^R0AdG;0h$Gol%$+s1C*KH3}}*8VsdzG!*vHC!nN9ekCpgK&E$_D9+z==ynGJFdWw zo~mpn19r!YoYl@GZ7BC#h}S)^EbDYlUbQ{owT)upDc7L}&=^S58C|7Q@n8YHfkHT& zbQg{PN8_7$CEIC3O`B%0<6V#l!$jOn)TJ5hRU+T0`P4ZUHB;+*H(W|?kH{z8Nn&4* zZoCbet#8IvcsVmevj%Ex$ENAr+6dpa6ByP9wRIWdZB-n{5E zIyRyDpf?6n@ng}rI2WYSbhYt3Xghmgg`6UxQF+a?)VGv}ITg>-sexK(qH_6shlwTs zBW*npf;sOan)9}IoAb_B{tScfqil7}9?W-BQN-1;LS886#{U$91!z$N!z%_tg z3yRVP!HQi3$hCT+COp8f8wVy2tmrV>-Psa-&^Ub;j{FFVSf>gZ{uSVrG)zI5W`I>< zv%rSODHlR;lgM~E?WBWZpu`-0=wi>Gnw_=gys|zV6CHnlMsvL@`a9Q-_ecP2+LGjm?#N3RSIN#tr4B{PtmWD#WyCj#_4ho9M z44&|d;G)WeH|hzu(G@kK|G*4xCSDtOwWo5+}qS}$M)K_3qwnx!T zd}X_)UiofOf7}%nQt56JR6%aQIXh^N2x5ZSfU-=xqNW8jSe;-U;>h zb!)HLuXdt!MC!HMtBAK34$#qdvc0asbI|Vx*}<3RNBdlpZh!4-yzn90?Tr+fK^rmR z>6*_;G#-DL=Y2SUeiUu^Amo91wqXn=V0xqh6c|m#*i_x8G*y7T-lC)`)+X$r+0RNy5tsj6s7_w9sLT-kX7jH*J@F4CVI9g zXvVG=3UJv+v@1^A+(ry8lqsxx`_?$9d9!PBsd=-NsRv<03wJheIGyzb=aMGg{rg@Q z_dc;E6oA?WE&nR5q(sYahzA9T#qT7x_naGt;Yx!tM!N%VjmRb%o{ahBc`PKt<5njiY}l|Nn0GhT$;1#P#w zofp#?dSh<#f!y;Q&YD64bShh*Ym@pz)|KV%X*FX;q5Q1Vt^}y{&rd$84E6v^kXXmS-xkr!vB}h{TaC0HiGix*1>62I z;c0EUj-B%^F!qliu`YR*>!zpTJt}`$tuyP~^5k42USImKGOjBVF{$!QW{6Bq_=YKi z?F>QD3M&R(Giag=>QqnXCSP@CU0og+PPDK8B`Wti2q|4&21*me*LyC!C3-jyXt+-O zomuCJC$8imaC_SnYBeaoPpZvL{>qv4)$+jsXk>1!d-pz;pceSkN8g_<%ZzBytZYbGR>^%)HhSzCB>;_D!;LzYjr*4SgtF9H4s=&)WtR+vaHnZpPZN;}8-)?*d@V$=j zEqw3eJBd%jcN$*@zAN}lYs{<&-vjto<5ThdH@@HD`wPC^_zvNF7vCv-U*WriFL4ZG``>C`!l{B`1asy!1o5exAC38cM4w{zIJ@)@m@s&Dm_p!TsptgxWl8RWQqJj>jzH z#Vho{t*=e{SpwgPfTC|hC*?aBeuiqt)I#T{pgp6tum0RgVl)n=i{`#!l27`KE+Io? zOA_xZaf5@h0S9KLpU!8&semwJ)}<9;nD#reE&WXHuZYutk*~hxJ!x&45-6yqow=X z4-a=GJzr1Sha-YFU7t9sF7tLdfsV&-(9h`Ha4_5qAq;^y^3a|S?=j)Y9DbmrY{Pj{ zBa9JD-HW|c7?Q#p1d!Q#|C-&7-|D9W1>W(%y9uQ2w}p{3rn0TiKalmg{(aY{>>IF@ z)BY_3YaN6?h>eD`Qb?EN(4h#wg=WiE>l_gF1UoG}82!h~m2G_IIDO1rarFIN1vcdL zwp@j6HeOBJiCx7O>U!SN5Jnx=TdIH#IRn_2xOJbwFqp1VdP@_*A|~muhMbX1`wh-b zzzsR=;IF@AXF4O?eLQRY%ylbVKa<@D+8P#LrE_n0Y(|dXMT&xTFL4;+i{^2R02N-JPWQgg}yY}zQ)MQ!n{8Oca} zOnzT2dJssp8o`Ex9su>*peTA7rqehhA0=ea4z4d=;qyC2k4M<>?qR(al3V|k?R;}~xO=;|)zC<)IT*A>-5%ct4NnuBNb@_(%==t22NbT-|aREFjF?VH@crkUEoQehpoNM>l03%M2(?G&KH1;49(PG7FYj(7_wdRnlfy>JBVJOZ2T3lM?FED>vA0b>M{vctrQO>+e2>$ z99}lz#WWi3bttEJ8mbZkZUHJ>`TmKPngU&JhSrZ8wSmZ<>%W1Pp|2rYL-HrY<>8B- zHyo$?2VL(=i48PjsN;P7I&>s=1NgjlQuB~ar%xDasCYI_N4O~gDukFEU}W00l{jcn zFTf)kx0me9MHd%_I7=}7)r(iYVtz1BsA@u|azd?-sCKyaV{}G@HKGh^BiEQEXpU>t zq42q`I;8y{s6+F=ti!M7Ub7BIAv|@hI&k?iNCMMgdm327P$Hxr!ng^qk7UhY$p-mmf2OO+A ziO%35L3C#KnJK6T2VK)lyAYPe?R72SdVpLrxrQKD&IE>8*fox8UL+faoona>hUM2a z47aKKYTx{>Gyfxfk^eLkUN{}X}pr4=>7zX|kj z6#Yx^Ua`A+YrpAA^M^>&myq584Z0|)UHM6aukUV3z-Q$eUwomvXaso#A@Am(RG7r z4q6bzNbgOGd0POy9!f9_(lcHu(C5xBK?)G@xc`17GPaj!hFGLb>V2^9_77ZCHY=933HcWg|)R zIn)&c1LH z5=Q%Agor)<6RN0f3y?qu6k3zE!6_skuqU)jSlfjoC8p`eW>>OK$G$PheW(~d>T%8hFvM)VCkWjL`#$xk7HcO}f=*0C+7&#g2dNos z$HUvb)1vKojNIajX|I|V%?D7;dUW_TYb-(b_N=09?op@>$KO#U*kdf z=eQ$;KIW1rBq&gE{!&bb>(?#Ye^0+&*^b>DST-+O@?V#2$hFEA@lVRumW*^e&;R9K ztk_oVv~-FaVgvkdz4M)bNhRQ&@7}Yq7Pn%?x#m0H(epuLi+8@;X8jxQd>5nnAnAsl zb+(A8^#_d-3L8*{}UIpnEKIVFL zdzqZrK)ySndRHj1BmrG$mF)jD-%Q|LPA4W%6-?H*w2ogx@UWSm*HS9bqKAitYs~LK zV2-aiN4sq;nrLfrg*qKZ%o3dUgFnmHHoCg@EBvp! zhyT@e!vC}@e0lfqWj({I<_CDWc6cfp26+yXZ(Kps?8~6uQBJ3 z1E@CNBy7`#%?29|YWaD(YQ7OR&;zM8&S0$p&&k)S=5XN@p{)mL*X}o8z7vXlK@{@# zYkLiWc*SLZ)p=RCy#lU@W2X%P`Rz75JdX_lo)@~qrnQf!`55_(qoXBA!jmKyx(Ni| zi63M~9Q7!8FT}gk&fhK?5POzRUKC#ru&3wCfwmx$-_6JJ0BIsIDW_?eiqP&CwATUY zt%ZDB^*kGn)2insRnJS)NX(7M36iUTXOb2z9TJ5@nwBmdZXgFWvJTbO_CRI@RE!B` zXZ4^z0Qh6poi-4$q-@xWV&5P08D^gGHPZ}bnS&6@L z{JaezX2T0FQJe1p#IUj8O7s0K<8k->IX-d;R;3gVLi_qR_^wLA%qI?|K(bpi^4~pqzj;Or)T~tm8 zJzxUU+HXOdyh-S%!*a1lbfTeXE^>0l8u8U)z?3Xxt{if;>zuW5n&RW+e7_7xAPKIm z?#bnheKH#7=juLK{6T(a08fyET}aP6tBustCLw#hpFM`tak;9J5-v!t5yQ6|(SA_7 z5XMP%=+zgO^@z;nPkdtkc2PS7o-9@c?QUQSda}@~oY~c-&OG%3K!Mf=&Q#@iqU37w z3$&*Yo*bZy8;FUVkCliv+BUA;;;6FSiU%}I=n~EDP#kUr;fk#Lb8u`^owRbPM{wGT zXEWlbyCHiJk&iT(_9S+NbiWQEZvc_h3&ModR$P9KuAa@qtQL75^Sjnzfmih)9|=eM z8z`L>l+K+HJqAf}SUWXNl#N9Cb5(`+Lea@IoS5XQdMA6I+oHO4!Y1ybchX(3<*UK3 z5ILBu_9gsd)oj7pu!?7SGZS67B-@BB4CENvmF?r4IGZSgMp`Hkgn$E{HC8xBRC^jy z-it3-qcFLxah7?rl3kI?c4L`WOT!E3p)0_|-WTNi3?8?**YVra6c_3&cZ3mIN)cOK z=+n7(aOX-A6Q7>eHLMFPG* zkN~d@g?ssr#606S>XWoWUI3^>R*(AV8hRn+1quSg>LX{?1*ekzVOi!lpGHl$%4ggnn|05AYv{O6cR`x%m(fl;3qB9=#B&&lR4SM zPj}=Uo^EOJ*$f#1j_0kIq0yEM31DYH$75*N3@<)#B#qi?;T5Vq0z~7yvU_@1Lb;Y* zbjVrgSUVAve(UJ^Xn6J$9Y}-^0m;m-c}8!dZ+UwI9Ddq z{`Chq1$6b*_46{16Wc)x*X?WZO#w7#nhbc=1)1%HC>qyyJiLk1bkJf#50Rg5cE)kR zdl`#P6(gy&VJ|da#;;k`dPFxr$ zQ!WoukTYDhGG$ikTS%u&8JT(*P}#6i#A!aKe0r`-x$8^#98ew}$z4yxoJW|m%G`u? zJpRbBA!drxf{79-CCq^h7t5S+=8q6AFD_C8$USxv8dZ?R>-{#j+tA$*Xg zNNNRM2F>K|g^>e3sx> z-iv<;b3}+w5pzGjckm(Ca-bYty>K6d)$r5h9S|YL$s^1)7jRhEj3S~KMabTokjIN+ zObnZNqSwTkBZGXg6~84QKjnf!N03gXrce&NzaX`=Fs{%l8pHh zuPRY@LY*q#fuP8x)NoW1z2=*?Gg#ruYTY-Y6p>{JmaUq94L|KKeZjzVcEeBPBH_D{ ze1Af|!@Kb3%ra-f8v`iIY$L-FXSjJP4AhnC%4)lnQ5l>~^K#vRlafy+gQ;GVFB=V(pcA#y%*;9TKB^+D^pWO_qyEdk-ADl)9E`a0#7} zbd>V`;U0mSM7|4VBl@F)VrWCLjCD&_4ByW2OQD-Y=)WT|?Q1L_-9kg2()@FHyAomW zkb(N=voP?f4te~QV(msOA9Os~yT^T9`6K8UT5`Z^fDS5kuea3-J?KGraMYq6$_}sd zo(v*8d06UC8sS1lljE2c-sC-HFdnQwWy%h(&kn~%v#!217J7APDNv8qe;$i8DX`&u zi@JBfL2ql2_oVH73(pc-rCY7xO*}19{EpOx%_3|jVYBW)2gZp?o%fV2yy^V=6fg*0 zSiZciDBGm)dRoeqKcWWEBLjAzW0&1Sy9u5Pi8EOC5K9pf(716Bx7Sf~TU{B>lc8pa zMF1iFKrY(34FrKN9P-+Gfre})8^@LPj$N!6QD0#grHJcFoWN{AZ@&r54iJg3JL#}S z$vNbUf~s0yC_mD`zVVQQULC8i|2!xGO8!~gd*Ps6>f;*WKwJ-Ncr#3tLEJt^)kzNq zHn|v~^qv224u{6o1hCKjH4#rR{KD(&TW<*83&axL39cQ)^7!QzwH}DpZa`&F4qzOV z6_B3Z5#G#e&FhHrQyH4Fj^ZKati!I}Sxv5BY-*19ZgA{m9#lKZu@e=-OGALLt9xHT zhr!c-qTbL*nzhf>AGM__Lzn`&6(e*sAfovq0BwLKq}jmR+ZD2tSiU~c@khuZ$W4A9 zLg&(9-r#O{TrCSfN)`+Edl!C($ZB_8EC+y*FPLc3Gw54pr$SvdABsDBwc9O2Qn zqYeX&w{%%fIQC(2b<{HwCINM5@TTsa1AP()aljH+nE^h_5YT;15XpferCYh;CTuf@ zf*7s`ohYtDiQ^MHSWt&zC1KBr;g{mKpoDofF_Wj@{d3}KO!)Cq16}I^0fl>D`AQB{ zWxeUBx!-`D6GSzxz~urSNXQ@1kr#I+ABs*QoQ-vu4*dM|9rt7I4t6iXd$9@xgCHBX zvM*HI;lZwi%LB1Qw);_+KY(}4zY!}A2D;rOvaE`4| zxVNotC#YMN+@!wq)+xv4mgILFamReaayH*;a;Uu>o9_zbWhg zN^x&#QM|v0LD}ZZ%{rY8QE_GRQQwWCc*v!0yhqtcmtN3dCnwdn2CK)y!N7zF{{CFh zrSIisy-_)kvUdzWUgm(pHf7sBg29gJ-fc$e)!p=)Wmn;1V=q=Yo+5x5VDlhhzoA*Xf&`#k-l)qUEe~*|V;MT$$K0-s8 zb^xBp0L)YV`!4A{F4B9YXUv}Y2jnupXIPrQdxod0({?)ZcS3ay6*`q-01I}M{0?pw zC6~pH>P)a}4@+}NEI$Ibc_1Sx^k};BprDI(57|!dQ9pX7XFP6So_E$vH)y?ZzeBJ% zTm$o{KE z?9ZqG*iyN$6AIPFBCgXL#~LQXk#D>Zj>?Vc55%q%K!8x_nLRe#k|n9UK^;L>S1cmq z4hGUdxeBp?wcGtMUvCh*ZW~JFkD2lTsn9`(qb;QZ-34wl?UBtm^!&L&@XSemk#ta@ zcR++`C+RYwyfY}8J-g;sqd%tk1Z|-CA&_8KK|WFE!xwV?dRbPJvf(&7wb)>Owu7$c zV{eG*l}2>c%80frIP^=W6To7;o9aP?%7GA}1xYsa5JGfhJ8T4r@e>;l4pTFU?xLFr;H}Xm^>@PWkJ5>pmw>=8A3sB$#HNWRcP#i za@K=uqj2m2B{EvtQPGJ?HgIJobUnd?qTqH31~ev=qgoU~pmj!}0N}SRgwTp)9cG}9 zHjqmic%%NpU_31Y{ecj}%Es`x=B+8xVIun#csf|0 z1I`prr6aLxo+Fc;%x3Hjud;GC|(P%`rSD6Wz2@{ z>2GGMXV4=J+PaU4sf(u`p&kqlLE2I{I8~oBSi1*EKe>{VHBOvE$i=Jf1!Dx=h2sA96pDpp-Qhf7J_7piw9XOj!UQTWj@O>X_8&tS0$pwI z8d$@W48tBuw|dH$Zn^lP)BQXFvpOXOJQ%uIif0ef>u~R!QkzKGpr1e|70pjzU@qx8 zXtN0>uH-e@K^p8CgoB$CDA!f@2$~$y@GhYd5IPqk2OPkQWb{r0W*O36gE`3d4$V5| zYQ*A=@Weg{mw5Nvg+8(#dY5Q&vqN7*3mAJB^3^8wEGSb*bn|!YBBvq+f6N`IvD$(< z-{+6{21$D_1iR;hyF84ifAPu+JRZ5`ZDh%Z3W~I8KLRbpswxB(0!p`D2DM>$9i$^CDEoad+DsroDq-STt z=)NcZ5luxmKX=e<1`>Q9<_vHPA+=UkJ(%=t{1EO?eoYJ77%rsmufrAOfp#$5aeEFb zY(R1iaAq|umygCN{65-It;oh1dWoV?vrs5ecQiik5>OW@AZ2zWo(&d1S7r%jai@II zG!*u_`VP-%)`ua5`=#K|y6&MeKoIRPR@;4LnJGnBZJ~MtC3ZOJa1KWenJG>TSfj7ve+r#fg&%1*;3vRnuT4>^y$Oaynn~M722} z6mcN61OR34*f+^FO+Bpc!;Oej2HN0(XX|aUcus)UhuJiXoLROwn?x5;H-AdIV z+CBI}9O3W!g2LZ*RGp%|lEeGC-8INj^?BVoM2K*BFWKF_k!Y+h0udN9V#~ej^L{x{ zI1RyQ>_6i^$PV9!cbJq7ThLPpl_#y(S7Y;xEo1n**vnFp>(oO)Tv)t`7nXY+ix1Mh zu#bYKG^%c$dOZBY1bRtM$vzHi0+rDfm(}1J08K0|E3jH>g)szHVzmm&;CcML)*zHskhyDzxvFx8i$c_tjgeu%kl?$~E{jlx`= zj3a5^=mzsHa;B-%`|%z)N5h$;SvDI-uP;n^o=1zRhtagCKROz|CE3okJC?XCFd)bOvc1v)pHwK_U?0BLE{CidnBsUbjE z9B_hEvbjuO0WAqV&Y2*M0o4WSS?|Y#)r%eV7FRTs>#tHc<))FcXz$18eRuKKe(f7B z;zed<*QcSCVcI9$>#}b=q$3Tk8^}4VQrU@N!n7vtcNJ@LM`IAgu;CY8*@uf!hVd(r z+V6OXE8HoX{39wOciJfKqul2-&4U@~bsItKWBF5lQb%K*uLqoY!=E_}$5H}T46hui z#U%Xk)7v|73FIJ7&{~n8GOPkPGtUc^o9&#_r19(wN9Rt@U>Yr0BU-c#m>N_F`D0mi z(voYJIK%eL$q!NN+5zm_;Obt1rP1zPvo6TpOU>EiZT%Sj?mu~(jMX`NAS^zgXka@f zgykBsp+BP>GCR~T1)LVv>d>RLhpbnjO~*9`s|hAhy@XfP4Ps9#S(Jknt%%vwy+V97EDP$s2Ffp@087ny*V6h zRB%kO=Kn_g_~7xuIiQD;oC+(zCIEg;X1xdN$$oV0MQ9F9NrE8sG4Spkq-kt8o%N^6ymub*W8&_NGRA-4GPJ(Y}Mal`j?h3OlXDxPl9R+U{_I9A@+p+H?%1 z&?phQJdo2lP_T)j-O)wkwci65BT|9~=dAxeTF4 zx|_}q8lQaYae?22qpb&Y%<-+q%Q%(H+6QF;tAjw$1nw;4EA#5Rs=hOMgLe^FJ)PO! z`UdS@dhREW$jR+3B9X1$62%U|5wau)AJqgC-=4+z6rbyzhV(x;KfQuB*Poa6rAc8+z=WAOJnO$ImxNhe$_B&Q%aLDMY{^#md3!AN~{P8t-d!=;)ORZ+2v!5+!64k;)m zphi_Y3w%zhs$&OsjegZ(BZhKQP_=_cc8b{O7~P`JwyL)l%V4+ibRgdZol*rFaTU|w z#JwD=dX)C2{+Oo@5w`?(hvhlKma;27gv^9Sm_x}-_=P!)%t68&PG+z`$UQ^b*N4neWR3*ts^a{=#yI}T(o?!anK!;8dg#W3$C|FD@nKAsf54_i1YZCf=Qn6!C$()g>SO9a|<;qAj8w zqAK0IAo2!rTJkA6(!+-r+Mrsh^W)R&sxDH|LH0nFP-G$Tp<^qjP*0|B&t$x7Yz$jh zHQ%n)KtQmTn;tpc1F6^9ahaO{6&Ck##K%A0yMWE=H6j*9H&E%R+)2kj5gRnOY zd;o^Rzy}|g?9-C8hO<|Q?GP@sE@r@1tF7P7(O*Xx!?@IzaXTsi<%%do&oQX6bBLpt zO~;Tn5pm>86X`JGrHSrA?5H}Q%O`l(WHVP1TFyhcm7tOJ+l)VfI35nD=!&dUzs)Ga zVfNZRLSV$M4-Vk!b6uhu-SxghdJiWwbM6lcfFXECrw7HrY$#?tS436DAk2JRMRb>F z7gGQK`d8qdHEWJ-TInj=l*LO*ZFenLwsi5*dx0JKn^W$#Em&4+TT;GYAv|mgmfB{{ zbf%8BRV-V)e1WUfc0Z!7ShTogk!{g}N_dBrFIi|?Ub?JuarshPd6~_%sMJy-oA~%tPh{RY+kHUA&-0pl& zz>F3FD^3d7@`->K{w`qbX97NXO28c-3s~S2aOD>QZuwHcrmqBSKP_PF83FBQ1zdDa zK)nvfPYZlmW%+Cp>h@tD3;%1?kAe~ocw5;74i>_Gy|D1={LL;EJ!E!e>9SM|=TsWb zsp*XO!PG9-E))5WWXZ59KWr7 zWj{XBvp)-89BTx)H|`er(EIn?6T%)RBSc7hg0zp8_F>ZQ39#255c$>}6fo@#0h=Z4 zEMK#5uaL0QU8bA%mhdlrQ$UZj>*bWe*cR!|-WK6>_v=8zmh&RqRtbwQ2z#@H6}S>h z?Oi8f+9hGPOSsi9{Uy9kKAp~K%)ryr%QvHRN$G;hQd`=HjC7VNZK>SG%olKrgvG_e-o8LU>p}qw zB-|n)E0z8d7D#CSU681sp7C{Hu?*iVVXK7JGLf!lq=0(#4eg>Iruqdekn@c0uS0!a z{r_uy^>$B_c)DJFPhIX=U%Q-7^?K@14s-UOUf(scUG?@&lk0|FPaSSLF6Q?g66)=3 zlXjLiBrP=9oE&8g>JLqA(JXCLT4Zo&@xx9-snHZB>s6A z{L|j@2Bu|duaE2bE_#l zoeU4{ReL{$r*J=h@X0F#>74&ZlUMzY!sC7t8)A7Wm%@Wb#(t1+V+Z9=__Y7kUPozD z8Sc2d=q3tFY5u-(TN?yq`EQw4>&nP_A@zXa> z4xz9V?%j}a`v_9FME`PjS-8!0^1ar)Zl$|*eI zr1jI3s}!EXMNc+7O_2P4)5~%@g(sY^Upw8l^?dUE-!(N@+W#$(tGf^J0+{wqE$##ya|tXFTSt*-j?&yV=_M*@}jR<=GQLgm+vb-x7^SCLFPw& zgg*O+qJH}P_I>5|bBWJSWPUV`=-V2Q-(8mkzTw4x|8D!;F4I{i^P_%C`Pn|YcKtSe zD)Rkz^V91mN-gpteAWi!r`PZQZGL+F^!%uPlpkvq^=toH^kd!sdXR8JKRf@Ae+Dsr zekSn|uk;*GdN4tyPIczqHZ3pz_UQ$8%$PX~6554x?q2YNl7*#Z_bys|-~CG-SXy53 z;Ic}Wd-;l$tA5x;<0g;P(<$y9WT*M!U;S({fL+3Ua=hr}+#l7moYp=f-Lz-{Yhwho z-yrjo`-m;lUK}gjD+UPIEMcpJ_JP8^K*Bl+zbjqr8Pqdholb0(?tygiEeAz^oG78J z_H{vXhD=}1gMk6}pBL!`j_0}?MZDI*0(xu$+K0;YB%VCdUYj7pCkkjw5^$@8I-ab< zg}X<>?~12_WDzfro~{UR*Xy@K)=P)QlHZ{F>(G9SNVhno=lr7ke|tf=7fHSctv~ep zPsh($SuY)WBp*i9uIs;jlE9C?u0?z<<`G)I>9;9>ZWgYLd1SjZr%3#!3Rp2hK)oHe zO1mdbxTmEH=#j8lLcRak#t8pf3I9*^AD66`4!1}?mR>&{ZncZ@RLJoaE%8J2AN@vL zxpu$$PsdMxSuY*dN&cRwb=QB}tpYzf9o8=ZKew=+^RpiFKOH|e$$IIq^;0o!^!n+r zcCx@vUABPj5_)oky>*I!L{szMRAGNSVB7^sZ+)EN8Ckx5rb%dZig>pN>|6DCdi&_{ z7Rh+FToG@pgsl>?+k|^y`Skf>_P;3K7MXstg!(wT9KcW4%cqYoJ)Wga)KBkUAp!kJ zkEhp5k7t+hB)V9I%s)e~uk4>K(r%UEof6Vsgnk}rFOcCq5^j~SRYKag(63I<7etK* zALQovKFLphuv2-5KkPg*!Dt9ct}?Nq^e+y3-4i|M54~R3Yvq(3w3GKR_2|Bvd zl24o=&y93E>E}}ax8rH6YGgT>yqI^l%5zyAPx`s;{s26@F6}xU(<1G9yhkLSbb9+g9Z!0F z7D+m&rCqFRdVTeC@&7HJ-jsOiq`Uva*E_vFQTjefp6ly)(&YyJw|E-VBKoIJfB&cV zC%r!XC7qij2eiB!;u@&1^QU)ZYO#`rwPbikFSR(Kb_Wsu```OcRk*7v0p8KCk_)D2JZj^`KpPcqA;6`#7D?X_EZd_HV>IBZILE3IASx zX#x3V$nmM?_le}I76p#cGfo}MC4mFO& zNBD@o4n6|&t@w*bU(eU0+a=^k?DkJ@hxd<({zLfC^QB+|&h_k9dep)T0uQYL_-K~y zbuWu@v`c8)ChNUjz%4rjtlK5s^@JtV%cVPaFBjp%|IM|_rH2nu`VLMUIc`#L)D1V@ zG~(uo=E#^q38`Zzm?EMF;ueM95ZbHXkYS@TgTi|EA3A*WEynOZ1LBg?v*J_6jHfh4 zB#(;Ef~L=eVQCpd$KcwNsb8N^gWn$!(u>^yeJPo?)SDAW`~4|nha`=J&er}`b9i5< zp$v-(jvfGAqf|!v^f@vR{wqJWk$KtASO*)y9%4Qm$F{Os_6d8Ry~Lhn8v6sgnN4E9 zWc}G2Y%-gLaL=u2sy<&arCt6omggNabD3eZOHR*;`2IE%qY2 zi9Nz{*#EFmY&`oT(%Z)V%$gDZaaPVI;xOqZwwdL#+t?2FL!|N|^81DzVn0FXc7(7Z zl^TS-jU8bP>{0dr@}I*_u}f?v{#L=S7U}gt2To*t+0*PkHlG!;MwG0T)g#w-{Mpzq z*hRb|eHS~AlGn1WsA(bom!LL`9c6=1c4*9kO9o1|3bj9j|3AU^DlpKG#USQkb_Y9+ z@=*Q@*gn+$0^82&5Plod8pKk7p?r2Pa(x#y`I>!()ShQWD8VFl449jV5R2JCl)ae! z9pyg@Ebc&Q-$5=@*+=YimdCze6$oF9@DC#96R6iDl)as;$Dar34+19ZP=gBOdKRVF zjdZLC|6};}W>st{u=^tNf0~sd+#0mcQT8PKD^TahQIjh61C(qM+P4+)YuT6VZqyrd zp#{m{CL#U`_Fj9OP`Lli??^YfNe?1g@ljta3^+ft%k}*G%J-9Q`PLyneO}uVkZ51ys5sc1M>BJ&-s2V=TpM32OmND{V=j8AAHOAobSbM`PLyn!ZZCE0`jf< zp7Z^xTfT%~8_$)oEdlwqe$V+{eOIgl-SJFw?H4lN){%0ZsF(EF_cV@T=DTzkt~uPjbQu9H}@$~krClxp_Y(f zv&jf0p8ENIyewCpUd|?wzg@x#32g`edAXuwxei+8d=eze)me_CB7UuetXbwGVZkwJ zmk~S?=IZ)53;vmAW&+`XTM-k0_4p$!}Vc<(F87k+Ye*}0|T&)hs{{w?23|Lw8$ zpZ;OpjHo*XFPWJ9=pyqk?tjg3`Gw=&!K;R>?bGj#)_a&C$Y?SLhgd?x!XqN1l&CP1 zB~*zFHbk(X@DQ^x+!DdeK}uv;lrcEO5NZkuH5!1?sGwkTn29NtP-YGZGKDEohVY1B zi!m}NA~=kNTa2d25HlP@Bg_UgfhmlI1RFzxEa8#iAyE+qW2l)aCQEQoSg;Zm8g68k zh@i+2gDK1$7GyDn1RKmscxaR{B9i^9^6C97Nw#Ojae+_k`vU6y%r5PEKeI^$+9lNG zSoD52T=uhOW6$;^91=bW*MxV%A>os7O?aoiMtx2u%c##$-wU+s;hr41`PTo+9{1qU z%XKgR_QcC=_w2nh^GvTZbDmj0>G5}p2EOp*??YM)_jr5n-Z(0L-m$#DbcvKaowCf=fYbXrvBHn@7z&xDEQuC!=g8aZBNV?GGN5F52WPxiOiTet1_(g zm9YDkk2tuuYGcZ>$A6>kd1_i&|K}>yX?vf(V@YE_?eSyr!9Ra@TZOnmv(tz-TgF);JC-?!X8{m}p1bFO^EqOaCJ<|;4w?aJttO&cshjgMaP z@2>SNDR}1m(-(K2UHM>xJ|0tK`_+CV+O1teTdS}aOK3YO>^6x|yM%iC>Ep3Vj>lSa z&-SbBW3(5O%#s zMA$5#2gD+oJgTtMlE+O|(mhnTdp08w{q**PyNB#yGCbmQyGo95tM&+JlrTs_0hlLD z8f1Kro}WjC)5~EI>B`Vu`Rn|+twUr#XaD@ys)v*EWo0)#o)8)z5g!>J7QYo6toZow z_}Bz%LPSDz!uW(;aj(R&gjeHUiyN2_pD-pNB_Swb;n32db;jbMPh-1hW0T#b3-Bu` zEiGNVc(KEgGkkb?dAZxYYWnPw_&EiY3l^8Vm)^dhd{T1q@Zm$oPmGI;Ta90GGJW(* zOcbpKwo3rjT(9Zk<(-Q@P4Dod0repO8FpJR(gPF=B*m>FD9Mz}nh|l;n+= zvwG&x$qUA(rp{Pfo;*4|(Y<;^%Bb>*BS(&$I9!CW$Upsubtc|R|YI4pSf#3$viAH8(c&{Fk-WEtv zW5I+xcO;k#3h2pR*sAsc+aLxT^1h%e`+>PIfDOdv_C_`s7#_k>O>r!qC4e!IZ%Sgr z*l-qX8fBVgy4^H_rGbqwnx(TbY%Dgr@HuW;yX&PZl0bLbuiZu-}^)|(s ztfs*xn<>e3qiKLC+LU4%Y8qzhYwBm}Z%Q`BnEIFonr<>Bng*FhnsQ8cnQk)`F_Wp7 zWt%cg4%2AUWK)`HlF4pznkJgEOk+%Wrdv(9rg5fB(=DcHrm?1U(|FSq(^S(0({xjU zDa16~w3e-7!!C;XnDlyf|9uc4=_fcA)?7IJTv?!yDzYhy(C83FDEHwgEg zay>^9BK^L?-P)&TzRl8oNWGS3->Pr@@Fga;44g2BSRLGl;Z-$6cIzn@CEMRF;| zS6~z2f8U)SiAl*iM7a0q=1$?Qal$=WmgkfSj@^Fm%X)nr;O-0;c>W~7eW6U}?*Zq<)uE&@+LfEE1doeD@=Qa%}M<&n=|3JZ1w8jv6<7K zWiyB1OM8|L9r_%bJpFk#IqiAonE!h=e*6n8CG|y?n)(MeWBMOiYSEuqTG3XPocd=r zy67(~z38tjG4Ulfa`wxtV8}K$qG&ryN!h_h742lx=kH<@C%(c)jd_)g8vPneAG4cH zngs25jyjg;sAolvy=<*x9~D{asdA_#PWMy@eIeKF$(n zzt4(hpI}30f4~yw{EazheaI>+KVroTT3OWBsSDfL+NEb$ars%6SbmNbm4D6F zmVd*BmUpmQQqQyUkr!C8`yxwpUt&e>%WSCoTb8)$3R~p5%7(7;v+~lJhUqyo431Q0 zSdeNkOim0olq7~2CKp)@B}JizoYdZi($qeNsYL?~_ZAH@OidYTxHl!v;4F$aEGkMc z^koy>_u-cItfwck2Cy*~6C_+{4QacNMt|{||fb z0T#uwtqpfGFa&WN#ek^efDE7lf*4Sw8xR!{1rxyt0t%8wf`AdjR?L{QV#bVViy0La zGiJ=FY{j^Tq@W^SRrf0Q*n2pebI<+mcc16~du-o%d#zfvYE^Z0RdqQgj!2*bMvSME zM&trC$Yo<}Ol2Ns7P2riOPPnYl`PD(WPX;@Wr>zEWPWBdWr=3L$^6ac%aY6%$cBtalT8@0SQc-#QkK|e zl`Of7c%5 zroDRynfCS#HudctYTDaB%+$a4Skv(Eai-zp<4nhgCzysOC7C9LPcXH&3pcm7A8T&k zKEmAIA=2EwLzKCF$7pl=PBG^8ot5VHj^oVjyTqEew~I5kw@o!~Z#&1_!FH~B2itk( z9c|~Ecd}hz-r07cxufkO^Dee&<{?3`4z7da9AbPE9F)Q19h9yq4$-dD9HLxjI7GP4 zbm-&un?ql>Sq{D2W;-Z*&UJ|HInN<#%tD8VF^e2LCZsuxj#}*y9ks?GDr%iWaMXH- zh^P$?K0!MjlyR93(QyYHqT&uYD18q*MEf3bi1Iz^5aFBU(AW2vgVOJ~L$u!shbX^O z4iSE*9s2s6ac~=V-XS^Q&!Ee-4htZ>{Z==KMZ=)l% zzQx6hzX^NCbo44_GkPJgmD)yaN3V1;&`XJ3)Nb^eU@v+Zvmd>rI6xhw4x!gQN6?Fm zqv(~yG3q#V0=@V+ga?jvVy5;v#yjl8atpTtP2GuA$cvH_+>aJoK{S zHhRr-7rn^1Pd%XWsfXzG$z$pX^^|&sUTYMf7eOznSLl_)AJl8~QltpIK6!^;zkEP1 zA3mWMDk}7?g(y_cFyPoy&`9s04B8-18!=%Mr_tt={t9!ZDN6X>T}Q|L+bAR7CxMdwgmXfb_> zGNdn4#`IOngvS0$Xer&D?nPt&eQ4~zKOId!qLeiDe-!{{!e4`YSb##{LJ>54F-M3*Z;$+MNq3}AA^9YlkAGEl4rM^=A^(N(uc{{TmvjC%r%C)H>0!u! zKK@nJg;X6{ANenge^oV!zbWT`3!20~iXP7SuT4ABz9{}yv=hX?0c}Q)=Hidr501Yd zihpam8^qs;ZbgrwJ?SZQADZIgPuhvw{~oj#-HHCI{lud9MGu4Kl@1-Q#_0SxlKAI~Sq4_~0?Z#+!V9d=AnxVNt3p8)Q^9NHjZ)l}$j>h!CKn}%{SViIf6Z!D>$I}K}R$T>5S$Mcz)o7<_6Aa-hk&1u4vxSUE3YaG4O1` z1I-~k(fq+nyDys0cxyK{?XNvRdmx(K3`R2;KW%^Q0PP{#L$!x#@1RC#kJL^_tpI;; z`%(WGigEj?>C;TiOIji{6`P4$iOt0dv4z-DY$a|jZX<3hwiernZN=@xc4B*Rd$EJK zgSex(len|kQQSq`6;fjxE@D@)o4C8!UED+5Q`}4JA?_{q6!#H(iTjHCiM_=>;{M_R zYWhNt(kWwkQ~4IoSJMAfRrCE%75YhZ(*Mj9{U(|vI!dLA=7{EsPEhkjr>KRZMWQs( zV$l-OQqeNea?uLWO3^COYS9|eTG2YudeH{aMp3$Glc=hCi)gE8n`paehbTj|Q?yI8 zTeL^CSF}&GUz902AUY^IBswfQBKlo)RFow;COR%UAv!5KB|0rSBgz(?6`d2E7v+d9 zh%SmQiE>4kMOQ>uMb|{vMK_RT9DiZ|`QRV=&o4jwPhm9vUEV~Vr*li^w$2@$yE^xD z?(00z$=7+P^GN5h&J&%dI?r^T>lEm`(0QrzN~cig51rRKZ*+=u-s-&5!TCt!_2k(9 z|GWLaj3)h$u>Z&X9O-|^{rmU+rzK7LA7THG`$4|{$Nfzk+6wg&J18gAV+5k!XEN%4 z#-ct3_dmG5X-l_8y}(hb8|o2)Q13H^ZX}QR$NmRDzi|IUo?l^fK1KQ;{`vK<`yc%L z!u=0TD zyPU57>CMW(IYwf1+_-z6=emj81 zWNxUgTgdVFa|){Ardq^*GXBBiH!-bg{E5eJ{P+`(--gi2pW`26+C+==KY0A6OKTc` z;_(|l{>0%m98+8o0xf+;nm`F%CuD`8dV=f<3S%qf5iYrfAoAGq`=R2KZU;{KruuyRIyll zxMGB2q#{req@dCGBv^sRC!-Z(6k&>R#aKm}cBEn_)sGut^yJ1D?r5CR<8LDj@1J9g zPG}_Jg~k@0(I}%Y8fWxEBMn<_gk!;tZ_Lp+NAb52PP?CDoW^J*WR1o)P0%RE290wp z(MTs9%>d4!Q70brZ;a7tqkgk)rKv7r2DR_P5YjeiNEAY(?{p zZK$tULT^T6=XYpq{0+?l-l9?dS2P|iLgW2Psu0ZqKBH0E1vHAzM>C5*(0rf*%@A_X z%-}v6{ar?LgXd^eeiqF=UZGxEh2|UA&^+TdnrD=wJ0S>-5|hyV@eK8{N4dGnX{w1cFAg9kNzwp>(Lc5vL0O~EDxE|e=azdNeoYCes7Oh9SQf_GLoIBbA*As2@@}PR7t!#bJX0N_f zKgt_znd?stK%2t`QG+R8w9U*PZ4etm4Mn?vhodcEBhi{<5ZbgAOogB=U8B+VvM{uX zY%CQ)MWT&p(P%rG5^WWWrQ)b~v!BQk#ea$JVzk5+W4OiI6%@%Qg0*%#S+*+&_kzf{V~WlyOW zvP_!HAGgRv^q;cbGJgJYLWbv$t?A3M`gF03%pY&cuFL+A;rUBA{YF+ry^?*Bk?~Je z^)}QRcA&P&_n+hmNyeX5)qMY1RsGlex2pP|`_I4TU-^}+in)jxPorTWJT^&sjWJJf@ye;m;pE%lEJ>Os^$ zRC|71oa`$IgM9^gb|UV*znwjgDS+98w+A^a5TyW;efVTw!D`r7P@v%R$+rK`@^ca7 zNB*4w$?pK<=VQU=L-peQjD&K@fm2kJJOo`w#I+VR=0tmwz3fn)b04 z3F1>g{1N0Ub>;1oda(mekd%iYi9=2MSig~dXOQ4$z5GMIQa9cYf+RnJB;T6$vAPP% z`!oLkkT2C8;!BWZ2uSj+X&$&Vn(x2FBGzX|dsaTdJhVL?en);{S0)JAh`S=LyMFsJflKL40^#rI^CEQn1FE#Z~V+6ljM(X9iE8m*>r!9hf zN&Nr2@~x?V`c05;O>xd6afLWjgZVfUBylAu1$j;V(?iIY^iMU#`M;Vksdr)jR3F+E z$+xCB|5x*^sedXLl$XTWWeLQQI9y94zsE)pms8Ur{Jl%O$6Q?x?+M0xgYjNqyeAm% z6~=pp@g8BkSNQ+y`+Y6ocUDRY`2Hsd(Ci7%j{~=d{ViIszsC9vFaJ;XyXSAvIXis) ziL1KzCUt7ldd;XNPnC8<=zzst0wiDZKeTIPUnjeIjD^FP`i=ao^IiBq?g$~s|UCauZRBG3h&!)=hXKD-n)JB@tkRR|F+{1k5ascyJ?=z?|2{g zTJNU&@m_A@X;F{xer`7{(H6X?`*e)52j15`|6pN1ytn)1;p%&Me|OBBi6wZC_kk6S zo$x;Ijtwp;@Lum_7U4JXe(&3!#T)RR?^g(e&6T9Jk|5W+ey5yeDTVPJiNEu z?(`rr-d}D!;LrPbkGXVb=wQ6hyp4REAKq)8b?ZcXyx%-G?{*g6b3SmlYk$1&eD(W< z&+*>#43D)h@c#4QA(t=UJ?K~Gy1v5u(BobOC*r;6Te1$`$NSO0AN+GT-jg2Ku1R;i zFFkg*Y7^d@{-H~V3ErP>B@1qa_o%-;HT@ahr`{;};z7Juz3sr*S9rhrx*&^pHyFz+ zy63V@FJ;ZTC3|0R{r==f?~-msf12t&x%_xclh|EjRO0QcayMU?9Bi=lrJbk+hb!o>cCV(ySBoIve=@E}qN>fx9f@uiGu> zF%Zya1#rNWRXnFw^GNzXf}|hJ>%iZCWcwRIGS5yDB#4=-q+%>C>f7xq3`%4M>gmSw$l+YhyN-))rrqfn4aW^4dDEQoHLC6a;YJ` zx{vDl<8lp504lqMVW)ol=82;#D+mxtKG*GO4ZV29K%NsE!_|PD_seuJT}ed5{k-TTO?0elA`3a*{To zDUG_mdU>&~64H}$|GVik|AX{3)i?G*1$O_Pc;j>~T{ZU~SVoST;-T(O3fNI^1OHC? z?Ef%5&i9wRoqoNa)yqKq!ie`J-gB~uUu z!aT9aNbTRr5LHcji|_rKudof^vTHhOtB2F#e1&=cxcFq@$ow$(k7tW6y?O*@hKTUcUU;JH9Q+qxp zs9&59_EA``Q{X<5!?+Xcsh9WPZGU56Jp|h!ho<_7%>R2iH0jL}=wbiW%b@<9);~HQB@YsmHjs?XU)fWS%fHgY_Iw1-89hP&Lh@~>_3Qg= zkB`5$D{MgLOmr#`3mBUrC1Noo7E4e+`s!LZ2MT>ss=rETlo6|7#}Is z`e$rUSmxc(PBYc?aCuJ(;xN62=K{`4{TK`Biqz~0^ThgfYv}LQZQ<`%YS0tfwAJu@ z6Y5}lW*Wv#I4;7Y!zI2xtYAKj<(l+9!nnj=O;1z4BWoCM2=na;`Kn*nWbgaqzqc1n zdeVa0>6L1zUrqKNXlVDE^v-MO|1{}+hW8x*RNf(i_K5Y>>w|nB3guY!5A`9dWt_KZ zxPLX3<7h4QHr6nI6WZ*fVZ4iVgnH%QYgfObT8>YD2w($h2_ z^wKbI)Kre4HQXQSWx(I7H9SAm{UiGR@I1==hxi>XuU-37oz<)-tdH3m?l9f<o{Na zHEMjV8p@lbrl+YLeAW;bO?qZEv=?E0=wJPNT!cE#j*$Ix&kgu=|Sl76Qaj{VMsD^$L>j?GE z)lzRy4SK|Xg8gbaF0QMg9Jt%R5iQb3s@a*ye^B`ahB%!9z9J6WTm4xIg}#_-Se{sv5?V#IM@c$A5>Ox()U3 z#213XnV)u1QTy;XxA zwxND3t>yi@Lc_d5Q#tZAjEiwxg#I;x=T@p(Tr@ogU1}J=sFwkMAOG;L_!5~gPkeoj zKo6Hey-wA?6FUTj_Xxhe5Psh(L+w3|CcVsB>Yc2mUXxntmHy!4@=yMm)zV)3TI#*6 zWxj^Bv`5!cZxB2$|EauT@Z1;b3ENCJ7}wQ|^|4&y|j9&QWjN9;fNNAy_@<;8gl z^UcvPe$k}&vX<*Ko*Krx!aQ+#Y+-(+UN%kR;-wJ3f6|*(OT9%J^l;3CJ|@+&949qA zFE#aRZi45zi!ej=0{#cz<=MZk-~Tjar^jU}1^jvaf7us3@Xr`f4rm2v2gq%rQTr?F zFuzZd6vy!5uRKJ+r8Bg-cys_92J%2a;|07t5HJt$10cy~E9h6i^$rX9ba~5oG+fT3 z`$`@o0p|k}I|My0{p$Azf!}+8djNU?$^qR0VG|yHByuf{`%A=K6;tT9x6x0Q>fjGr zXn>DM2e;e5)*ZC;(C@M8A)y}kbF7p|SA?E)I=V=MyHU09m>SFYLr+YJ@yUJgC0#xA zf8px!A5M?g#rpg|d&Np%o6q5=EiCyD4>O&mO@$_K3{=~6DLDvmS+O3zZn&Kkgb$c8 z;&!#rD?oZypoi^{1AlLfPTaTP6UP=K9^c_L0-QJc6?d*e@E%B*wR6aN-C{=I7KYYIBCuhRghBgEHdpcC7fiB6n;F*;kLa|7^A z2(e#V(TVfffljP<6rI?w8|cLH2k6A|02IJB2#ry|aC|h?AG*vPazGj(igz|nPmUId zBU3+*6#~8harJj^3k7_UfTsyKD(5fhmk9V$0Y9wutNsxI$7RI_Zb$gQvBih<6hA)G zp3e6#{8e<_mwyhBGNkzMoV4;(;6!c*oYyJ!e10VUg9P$xz==QE0{LM9&l2e82zY^j=K?3~DN`UX6!3Kd z9uJ(v$6p{16Ua{r^m5=Cpx+XBAaD!dNrLnq!1419AC7`} z+X2VVQGD1zJcxc4q$mCvfko50CQ`pnIBw5a5BGcONYW9+^+-xer+a{B0L}!=0?Y+00?Y(V z2TTK`z+NuolLc4+@@s&^ei`r(z*T?+@Vw3i%mY*bT0=fofG&`a6<`L8U&!-~3gY7; z9mS*nXdVN{@R&B7N4-!UT}JS@Y8a0hfc}7CfG&VpfGL1_!F;+ru%ADY=M`W#m*|0C zKA^9H{H1}sz9Z<%!M`N1S1^>9=K`ifxzqt4xGqU0(qW5-WpAbe%3X<;o!jc zC_dyG=BK>m|Nr}cA_8(s`1$MCwS*E)+~b#D>r(&aF8=#WG~*S1e$|?W=E~$lQ?>i3 zTfqOhEBWBHnA&_udinoEi2qmTkuq)ijG4d9nw>gl?!5U67A{I#ykzOJJ2H0e+P!D*zWtd84jwvuGTir&6^|Ka1OKUKvgrDf%xzf@Fy z{r0`;M>Qq*{{^M>8yGcg)VPUpQn)XkY;U4ljhhlGwE6Ba%;A~GsEMma7vEOmE zF8}}Q{Qu+lySjCE@6ofDM{mzQUVZy{`}7|$aL{01KmULseEe&c|F4KY^|$^{uJ-$a zntD9pwf}}5ke>GQgMO^JRtM?9Fixlc`e@O$`;heNrLocw3w62X@BIILP3-a5fW~O| z^V!f4{eNXrioYsF-^n+uRjcCuR1)gfuC#w?NztPJuOFHlp5Rv~GSpLdMJHbCO++VJ z3q`-zOQB!?q|k5fqP0Y%*$$n3(HY65;`fK)bWZ3Tg3cs#u0-b%blyd0DLU&TT|0F4 zLuV8^gM;I!!Gn6*I3gKF`%Ydx2KVdT-P^qf`lZ@n^lP-}I{HQ1p6EAnu?{{6w@3eL zn-}^m+`;JAZ+oNP#r3A}FXQs-znr4lUnnao?4U0CKQZ_N&#gk>J6hM}4i{Me%K{7> z$d4Q4FiuYz!1FLzXUryY;JGlLb_7m=z8&bffSn59S-|xmKVw)=EdV>lkiG!02=p>w zT{R4@TR}Qwn0FKamx3QjkWK}5Ga>&Jz*UgW1MFo%x-7W93iN!yP7>Hj1q_4vOg8vM z?4=UBkUk0YQlZ=~pzjZQ{%}1Xt}EfX9bgg2(@1&1-xN|#kdyrLKrSWM!EQEOUq$9& zfUBT984y1T@=XCw?D|9c48TmVn+tmRkY5<7FH#PYFYs01H?gY%J9&^UpTr&fOB19g z>qd5Qe7hv;6J&h>H)^u>sR{8tL9Sz6%<*xuH*b%~B4K_-);XU5C+p^V5xhRWr|>Zo z(vx+yyP!|j)#n2z>oVrR$-3uvNKf7?Oae~UrG|k%S;smIa=iY5kC`AR>vq;4C-ba$ z;Q0L*K867&>smRGo~*4r0l5*cPBjEMS!cZqauMdq9$81r0XbQRZ3rCqz4!THHn*v`4`ewkbfs=L8Wx&Zg zrZ#W|=!bwkvToZPxFyI30Y~#+?zjf&$vUMMaMGT&LEjqm%V1t^1H2o^+Yt`wI{}Xe z-Wm8w;NpOLTTS5MYz_UQVE^rU9FCly^Z@(V!3gA-U8NllUC+nmQfRlAnBjAo;zaen{NZx)U z;8q}S3_KtFGX`!9`b~lBLH;JdSAl*r;7MSwIq)#xEl7HZpA5JM#HS^2f3PP9o(kzr zffqq~GvK*U->rx~)So$#LwW`9Rgm5Scm?QN5;>HwHSkpMrw#BTh(}xC#$ewXcsi_4 z+7LOUZwGu8=(h)+3jTKho&mfg@G#(=fM)^kOwvPn9D%O_|GEHAisI|LE76DYIRW2i_036>x9h8Nhvj>j57C+!5mIOE}b@AMh~HA4231uTbDcz$1X?LVP2E zCxQKG!1E!#Gz>s0AU|#3`H-J3@KlJuK5!4PX8?Q^Vbdyz>`330K5X~&yaACn*c8&_JN0y^1*# zZVcQ2xIgjNn%7SyKC{bq^G;_@>L`~aDO6q;pIgnUcmFAd@-WNUsZUyi44gfcX z_lD`fRq$SL5%4s4KY0^41>@Lzz|$eW+rZ`U{&6SpRPgs0kwd?g13V1mPk{RaC-Za)BLwnc*JRkhM3_Kh765s_;KgWUFLH%CiT82iUs^JOtv`3OEJjBlGBPASde{=}^8%(7y)lkF2A}!M`w&4+FUY@IWZ9 z7jUw!VGBGR;vEP4FyvncxE%aj27DF7Ya8%vu)hzu5BSp;xDw*?JMb{DcM>>RXCUh; z*-+k8kdt)}vQA?K^-ImJsiUl-)7pnTrIwLxwL+y(B>vB1}XKP`d#Ks2&eRpS2gG+e@F!57`oPIL z5(_*D^ydJVLc9k8C+leKf$M>P$-oDJeFg9esE;wgn}ggOxFg6%1J{G{ECk*S%G(xr zF0`j8;9=nJ4B%wl%o(^b$Y%lH3i&$$cLe!N;E^D=16~30^}s3UzY>8Lf&U4>1ED?# z18)faHvn!2?P~>aD=5z(B8T)Vf!_sxjDS}_`USubgZ)mxbHU#!zzsp(5V$eq=L_5m z>^CCmp}zfq=R^5c0nY>f<^xXwe>MV7hxU*G{2JJA3|tQB{ehcb(;)w0z}JEN74UTE&&~l?!g%l$@Klg*2krv$)xaBq zy=K7ez@Ih11Hu2{zzsp)0eBwBCjckw&@R9;;C`M9d@ID)k;tJwQ-Dtbc^BZTKt2t4 z2*{fQPXT{N0M~=(MKthb;BO1yMbICQ1nv&z~@7H8SqS~ zuR!4By+Q}z{!kwqfJ>o1CIa_@{49a1pgn~Hw}Sj*fTuxuM8J)KzXVn`s;#`nxyXT6ad2LzQL z+kIy1u=B;OgZX+0Ia1X@C+GI;(Mu{DIYqkjX`~O+LYG;)je0=$Fk92a!qOY}DK1*e zbxD5&ic$N3>+#tslt;qA>c$ z`Rij1PmXTivWu-qtH%&U#qDvvp6AX#(nb3q7TIR#bw9Xkl8Na;mm70S>)gnhX<6s} zr1Q%Zdwb)K+QsDQqd^<5oe2tfvU~TiONQ<``29E-K)Noa1!o|ls8yTz5mV2%Pj}*etF;Wb;i2w2b@tl%EdG9LzybI)zk}72L3VHXS$ysZd2i*SN~J< zfb_3cs9SVgnWBFV@OH8 zy?)E;A4#D`A89SWdHceH$x-aK=6#P|f2Lgj$l0~=(SBF*#;r0ce2~`F#rq|@yD}!R zuf^;A2Dp_;?FaAHzwK|h{i;Qf@9Y`P$DS>loiM)0-TG#)bk_|!dY2jT@${nHn{NhZ ze|>S#o&Ga(irhR-5qoP|Wme%nokqGYqnsvq58ryj!S$tgR8&3F5(nQue2va3Rz7%d zHS_(7JBd!cW&3Pe_L4j9U2*Hi*SU|cKkGLuJ8bZ#;o%48bZcNfuE%64`j?>1Ej^n= z`|TU`Vb>h9Kc9Zv{CnY_FPfB`8tsshdbl%VopomMvpr4qLdx#;8(ZB`GS+uY!()$K zt~j+x3R~Mg;^Bq;-cxlV7-|Kt)v3Fr`fb`APl||tX zEST8B!?Sj!4K?fHur5J&LZ8KNd)XvbMz49}Qm1iF#S%lQYGg_M$ny%fd6k#fFRl}} ze^Ry1Z#LaC!xP%tSkLs^F8#A*9_2FO(jTL;ipHkqOaEAPJ@>-kInu$u2jty7{mtKg zdX}hZ4=+)d%YB>fp)Rz1neCOlDdn=$Et>;xE6k!steN9DF~4c@jo9%QlQtgvBe|bw zSs~YTP}HWkcZWsBOfFpe=Al#NrkGKQ{X5LNSQOCqng6qHH~p)7nl+l_ml2Tg#$w=@ z#3sQk+E-#)8)N~d~+k~tY5#JI_ojidG2Y?vQ7^N^euWk?t*Fa zO8sd)JjdqmdN9fBh2FYtYZIu{ZiW1q%Vo)3X|eX{*brmGvz=yt+nv;~_5S|fyR3Y# zXk^#ctBypp$*J29tK;8O6aBky$l6-y9Cxmy=cHAm;uqC3ZTfiM?^|pSHuTxGV0V{y zZXH&v-1+=D{o_vQ?G&x#^v=k2dhI%&;=NBUS?_gr?A-TaT;7Nl^~r#u0SEu+_pOO;yX}2Xzj(0Q!29E<`4c}JyJ6}w z`Ytu2(Wci4udbD}ZZ~rpj!j{c#E@_0cg8u7Pk-C4;pEX?We&E*S)~i>)-wuU<`tJw z&mz#pi0)>PI_{dO&9=^eUVb$9u>A=)SFg(Zkvj8ovuK@{lRmB-kP~!%)UNzTv!A_l z$O;NmEjzX5n$g&MXBXIT4Mu8I)M>)S4XqoO8L+)eZ*Jd~xTV$Ut<#5YzSb^Q+HtD; z`qNoP=Q8@W_qx2-VZ+JeKlY4oZ|Y^+{<;x!c<~Qqr-#E%{I;^8Tb0SRo)u3WU*Dds z8{XuWmdTIeBh0?t$Ii!m(rbR2e~7y5I_EO&VPb`~^Me=TR<(O`Pd~VS?9-+h`+E*) zbN|K@tu{ZN_Pnvc+{kk8?N&#dp3u%|drf@w%KHPop7haQe?{xbg@yfJ+o$-RUzp+F zu7jIQdtSpo&ipX?UaeCvIe1J}r+cHv`@A?dN{r$blsU%4fWDpmLMP8DuEAs0cH@?p z>kkIKd=lK|q_)MfwfB@kD-^HJ9ZRUw(A2s`%fPWlS(}}1&xxB{9Qgdfm5Xhkhl@MU z&NBZfUOM`Hbnm7yj~6UWm>xf()0*fD_D9n?U2wC?U6{Pj{24cK4skuZCiUKG>+TOt z-lS}{b^aXToZNeQ_nmK&JzrOutx?`D`19r!od;VNoQkAEULAVUZ(Fop#-r@iCGpt;)V6X5RWdKme((+*TKJAlf%nCdsv?GvzTQ2XkJ2k zT8fj=?~iTLJZ?r!(JnM!?Zf3s{?bBKDMI5QZGDQ?u1nE64JcY{OlgT_l$Nf7($ce` zM0y=5kv>C-3_K`pg8`Iwo#B+WVK}8@m_X^&olfaU(kPvJ8!2(UeUw;wniAK)N$J)v zpmZCQP`XAsw4RYMt=Gtg)@$6I)^8j@>o-x-`o^iWfpI!*(DWE>U~-2xX!eP&(@bBh zPIHA;offzs!E=}*^yHGF!Dad^nsRZgN2RPlGrJe%I@Fal+>|&K{vG=KU>z6S^pgOo z)BL|r|J!x0)GD%kz%lf%%&XxG;ZuL*6#}{5PjNLre*4Lxzy8Vjp9&$XEpS;S;D4E; zB!5^mnt1i`Fa9N|@s7*KS#{o-!Tihs{gZJc_d7rJ70jq-?4KfaIaYO1(??&06MngJH4Z8$X)r&HeDAAvD&`LTG6>EoA8UZS%T5Wd*m{V)Ii-881v5WU5Qb(b--$j^2+ix7?tN&uEUrvcHDq5 z^TPd&9H)<`W0b#`y$NHs*5J(?jxpVWF|Gbb4pZo?t(X@$PTz)6daTcOj4m@8?!cJ6 z>IsK=U$9d3htk5=9Hvk1b_!olxwn`@>ceXe)6Y7c#@91_(>P4uUC3c} zw&NL2f5m(b?Q9A-Oh4B&o3roTox{LWksPKNuHcYzKEt8ZyNE-TTm7?GKi#-1hbeiZ zI7}Nmk3;F3Lmb-me8Tfo?Q>YaV2?G2d4~sasMF3Ng>#tlIgP_WI*Y>s)iVz5F6iWN<(Oj4VP5lrJWo&NQ9qqS%KsvVcJn`Q=(4>5 z*B{w!cjVA#{s<1!{AY6LQfC*3%B?qfZeGq|-dvN5I6t3!mcu;5P!3b9=JMEfKZga4 z?(*_C6&xxzwYbE^!_AFDmusUrOn08gq20>;97-SF;m}7^!J)iy^IV)Rt-cF~+2z3; z7Mz>SA(gzFL)88_OiwT2P}!g{*Z*clb>T4O;4luU7gIU(socz=^4kRtGv5?(s5({W z3eGQOiYtN)$9{;b(eoIY>06Nl+;Lpe-&IDtduh&3Fh-8#mhs{KO_)2CN(=u=Q9 zkIR32GY;*v+j1zK)0IOP9ZwDmk^(qXy$a({*)xg5l=RsgN=sI7Xy>$@L)FA19Qqv2 z;V`i94lg%+#bI{a5)P%^>03B|mjO~916p!u=Woj)E=T@REoxO=<_Iv zLzkViISf>;;4r=2HV#q$z+v`^a~x(ew>VTid(NRU@e_xEdQ}{zFRpVN`{QF|!l813 z6^Bx)GlzB&Jvhv}F_1&5?I@m4RdVQZeF}$xMhiHU4_M1#`kb8{792au#{2ZPSUvU&dp|Z|+zmKWKK+;Gpx}y0#AC z^$s}u-JViZclizH@TgHv?xlB}{g_VM-VG^pu5;!^x3KOx&h@ul47@(4(s`q8OL@$w zD(CB`9%aq*e(T)G&h5|qREpV~+;+Q>wjPsn=Tml*l{$=8@4I^wJ@-0G>^iI1@e=0z zXK}9wqh2^SJlVJ9HCoJ^`Qvl{g3@=+?@LW&btdRDm$b5#bGBqV_rHYRoY+bkN%Zwk z)X+xE{v#q~>sim8qqcN9bj(l6c)t^S=JqjS_MY6d;ZgU-Oq+LK4(}Mwye?HTXqc@`}9RpX+#Ugwd8o6b+a2YZBK3=LF-jJ zM~=C8-TC*{jP>rElh#^o8TZhqlk=KXI&bJK@(Xln!~`~*ux#EfLuSg(NtU5|n=m^^ zZoJSpwLUXFPaK$2zX?;JXWz|Mza7){McY>w8a83pc*j-kIAOuem|1XSQCXGq@;ZGl zt!>weF)~c{D2l6ej`qK(ck-HyS>-vP@@*qiCd=MFz@WUTnljyp*;wyw?}_uRnHB*n8>!y4W;#u@kKVqkDKl6c ztM40Y%M98x;k!d~3ueIPpqp(+w`S}tbL!`IH)c9r9a85+h@9CV8Gl@UUX#e zLK9}q`Vs3)ZQeSMt(sc*buh~`4DSC>veuR{>^Q1vTC3K~v=K>;sWI)D{o8kYjUDR5 zG#|h4$yhU$^GB1e_76O}F-;c4O)3g$#2AmBTl`^>12cMjV)=$8&P-PN0+o|T7skSW z*C)wSC+2u(t$?RFU6@N(-WR+rHDUJDwVXciMn~rOu{Hzay}K}jW~DB-?4Zl2`n;+` z4Kajzv}7vge>|+96ioWevw0JPTV+V*6_jP0*J+PW?YiP$5Ja=D~XH@LGJ>Z=rSgK&^KWJYs$<~6oSs^uf z$b5AE?RuXno}sN6)4eIZlZNUrA<+l!+O#ue49mMb+?&&x`JOUv)XXMUOi=F^mqzt} z=ghZ1dnR@KrnY^%b!MhHzb)8S)P~t_+E{flvkfzP=+pRlGCOA3pc5ZriKE~Gc9w`f#0rmVsbNNR8+4HOv^isH>9$inb~cU>q`9`n9p?3 zzT{g@%*)T`eWhCrnQwaQMk%e(KQJG2JH_#MS7!U<)>j=mSuHm6h1L7R*}En4YI$wNF zv(RNfoL5q;c#6LRW4y6})*Itaa36JIJOlM+Zr5cQ(?QD$&vfX<)Uk7ws17(X!OiZ^ zbnDJCo#MNU&=2m)JZpN)ca~cRX8Xf~^pY!`nC45{be-;K$=EGvB1x^^jrlPkYQYm{ zd#1@-vpM%Zp?3N-V&;;7*33Lh+mU@A*JW}#irW-#D|YVC%{o=(){`00>+_DapV}~m zfu1v__OW1Wle@oktJ|8Py^ZwbmR`)zoA(>rCV4U*qaP&?^KoZPulId-cc&L~^4_FT z&XZd+M!QZ{4m%)co{qm6EFWsmcv$W#eLbT!v+QkkS%??Q)EiPX>G;s z=We(%8`ruRjJ)p3D19t)eLMAF0?n*C=1=L&+&<=Fce05&Q}So>#6K6hFmL^ybcwmt zm+>nz+_6;Ki!t23?Z*8Xp3HH-3w4$E?HGeoMGYb^yEBbiy;|DT+L>{iKGMkak{L5O z{!w3MjV04|himx8ito<$dc|5hdYdwj6Q)h-v$r2(@Fw_&U3fpH-KU4A#V=f$CC!Vc zw+*vlCT)G3TCCfZ`5b%JrbDF*Q`35kyr3oeRI@7G@ATB{YPP{wdROyJ)vUZ?TFZ)Q z)$EbS>3gKX)$BMo&kdpOh#RzW|E#EH^;%9+oz<;owHEfMxb*f1oBe@4qwDmjdHuu{Q zi+SJK=9k8yKi}C|z3bju=Kq~lRh*|6vFLibZI>e!-`RrfX(C<8cXr-_S)XQoNe!*a`NrlQKijZ!&o{PJwQ*b7@^9=sheytllfSV#pH9De8TyU&ZdP=7 zTEB1X4ROAwN9S+s!<0yuPV#T;Rr%AO7$8~Ep{uWY~zyZ*1Ie`TXg^0w1aUs=z&VY;qtU5_b@sx#?S89dW3vn^3YC@YzQk8`P7JGL3*O%Up6OA^zP4UF^l>zTP*^~bCV_Sll_la}!ntnsWM^rwPtC{8*@c~`JcPamAHvReh4zI8h7*#^nE zqkC3f5&RU8Pg@g>B(Iq`%_j7q(1ivg^paFYF}RcFCdBU)b{>3iQnOeqrZz z`8{IS+AnPG)}(1(bHA{4FRrPtm;8l2u(LzqlQCb|s08}l72hvx&nCm;Z}s@XF8JYk zLDk_4d-7S&saED+Sp7-sqLPfhu*zw5h81XiVVeY&G!88J%wFo;J>tuY&umccG>h%G zKC?|C&o+)c`ejUZlBp_*>kge9X_)zqv*u1tv<8M_SuIWYWSHIH}(&l zrt_KoZqvF$$meqQO{2W5p>N9BZ7)BZACq6s`bn3zO}$*sF8qLXZ1xa3LT67o zyX#u3;-K~A>_`7;cDEOnvw=GPv~Nl|+cmq(E_J9TpzJ0|bot1ipS z*c1=iOeeLBo!D?+uNM=_*wKLj9d1OGv1@LYU%DDt#$FkJ>E*+LW$d?yqe3fsma%<5 z?Y6V*TE@<9c~3Fgri|?$Fv8-9yo_zg9VmUMF2UQF1v_~E@$_Ra2zTbExhWe2xz^)T>MDcjKLfRWRIQr0YYf}{DiQZ{(1v32v+ zrR+kz(Ra)iAi3i-Bgbi_?57@=Zw*Z-Wj%DCl`aS`Wh>fj9C>4SDSI}l?YHIwO4*)9 z1$&Zvma+#=`VB4YTFQQHG4|uIcBSkYXz1;CS~+cU z=~6bV-KJABKbNq5ZvEKQ?|lioGNn(pqM(FL_pzZ3?jf|E*7w`x61INlAqy){m#{8v z>Al*AOIV$=rAwOcEMYe^C~WPzp@iM0oi#LeX$fnTnc5&TwS?_^W0T|8$t7$@%V}9Y zaV4xJeSgxSuoAX-Ns7{JLCczN>?u#%G3EKiY>R1|_lj>8vjGLoznfhsW?O&k>Ed~!n0y$GOcB zM;Ehn`|myrLWtD<|T{n=7^eAS{dv#bKVT;-NxgF7;Vs=mV z$2s$?i&+P|;cxs~6|)u|JDS>=AUSswvnf*g^fz6^RX?PvA1ZdU;?UQRC;`<U z#a{f<%fKQ|#eQp$yza@$J5&RP3yT*z`{UDptG0gD)%ltJn)6jj#3YtzxCx zuILZa>oxu8MMo8DGNR>?#da$8ZR^DEAyz6@Pg`r6i(JKap3uLOxiQk`4i%e%e)vaQ zPleYp&_R%Ymrz~JcIV$yu;-(t51J%A`b!>wifwa`D)*>BDO&e^?b2i^+P>h50u90G?L@9h6BHA zaZ!`|qwm7JaZ+rH*jCSlrl6nDm>ms8J|oI42=yBiu4JJ4M(JBOmuwz zgrG?L-8&&(9y3}V6&e*2n@n|&O;*PH#Ky#j2FLg1FO5qGMS{W6L8Br=Y5NA6C9&Vrd%WAy`v+OseYmHi7~Me^3d4W znAomz*N~9d(6~7H=%A?Z$YgnROuRfUL8*+1jSmfxk4ly!$FYG(P@q7+C#Oy+gT{mg zMaSDj1%*c^hDY1PhDJq%qH+o@2Ze;-%fX?s@gswSM&j>W_Hj1BI5jST4VNw!-scZa@?TUpk&J5-rhYtP8o^54(jgHFUCC-f93ri88muycy#EqUJ6&@caw@XskIVMrq{h;`S z*ibnZ#mSwC0Nfi8idt%1Jg2LOQ`ognqU@3=KG+c`nxkW4qk`g53yzUThbH1*OLB}v zu7<=0B~r1W!Q(00#Gvt%A~G@oc^DIn8)EbEB@Q_g4-*I2uVj@F0@_*QS7x1`_ z>rAj31o!|SA}LBDB+9y^ObL_-u)ERS063PS2GAfO;?V*?QnDF?{kRRZ*ywKeg9H`F zV{7to6362xj^oMra~vh{+D_~!nk3_7Jqe?DW*x`Q@>8<;Jf3XA%_{kv+3bdPyiPL7 zm+b%7sk--eqe04#P~PwJB^!0C>eTDhsdG-9dR!7jrc`q?d9ob0jv;JW1o4dMflOA1 zT55IIs+BUq4AFZ2wx&*%K_DQUOl`TjO8C=Y6SJ9Bcd}MlO_eVeYn8GN$4Jxeyqj~2 z7l9ODx@Z#1P}Wq7R1U@;GV%bkwaNuo^BVA8bW34l7-kgp`uk>(k&cjywaZCe0YhqP zs@!mEL>W1%?v}ty z)Y*k(>LQ3^LA)Rl`-+%k{c<^HViua&rtz2|{ zKhzWszhvoB1_i8*B&fK6Kb*-lW z#8(8+4-M2691TnaZ_7>zJJ!LLzm43si7CvyJ*xC42F zNk@&BfLXFpC?H@oKyuiq#AP%8kkj{#KkeHAG!@>r{hIxh~+qCF()hRCaYAe(L+QDAPzs%8~{N$^9x#MBPCLQ zsjom%lHGzWlf6LwsQVQ|`whR$UBGxkHqsgjHci_$0L;2(0(@;@owC5uuyI}4ZJ_ZI zKo;D_gj>ioOO1(AX`%=o)2P&nj954cZDkHq5g@sa*+3pGs~>j`4?e^fr@sm*kJ$;N zS=l{e!=b<(u0w@8TtCV`>f}svd;p3am;}|ObDrV@{b+3v!RO8mp5vgkF$iPuShHBd zXf9IDnp&xI~wI^{YTk7cxx zT1}z2tg*q)L1wx8(SygSZw6H!Ew2%KxK3>wxWl|CSIU5gATTvPaZ)p7cP$6yYuR-! z6&ou~u2}<9L;SyTpm_kbs3CkU45{9zHFFJTVQPZR91}I5$*H6J26RtTF@jQC!K{oe zQH2bO&aT=u4Ti zJ00hD7pd2L7jGIqz|Pnfks@) zfKI_?$Q}HS(MnER-85V81QH-kjkJ#WOnRK9)+{^3Xs7IxlS{a&_(`MVI+&Y-1G8%6 zrFzP9ycdJPZ*P00HcDZp8#{Y$18wz9LVqkd5{8`Ji*5~SIjli& zC!3`b)CAWp&y}H)r*xn;nCa;&Y%+u*by2Rbudh~?6(-qZQ2hYZrpt``6MQ|P(xyEZ zaH7(UK?i_`HVjO`@iq>%uUO!GfGm`zN;7{{Gz!e>sicB-&{(40XcU~WOii6bM>dx+ z^(({vqwHk;E!4EN@t|2nBS7;5xe_dg@F8N{yo#DMSEe;fGKZE|h2@eng}L$~-jT;@ z^>kyksvaP#QUjP96{>0s+MZXK{|2sv8LzwamL<$7ma0$})tO=)hE`{x(aaYsW_Fuf zsVIzHwuG!%70?Zy2N4{1IwF91GA)HZw>_c#=MIO5Dk@W2hMv_}S#^wwYF%fDb`Em} z)Nb~x9dcIFZ%@Dp8+A?20@~wjN89N6$#G-V@XWCIh=L0tmABRz$Q@&gMK#gKr6t&D z7-;hXG=(*%1>klv5jG$lH7Kaqoc=$tSZtKsq@F7hH;Xij5HU3LF@LcOP+insYFnJW zFzSI>$ULL`OXa}OF#};7Y}hO5QggXjR!~!qAA=sb(pW7$N~^Px+j_d9$Zylao^{!r zlav}Vtb7{vhnj*opb5}9tab6jG<%;bgDY`<4GJLVgHaa(PMb~qDK?v=P(S?D++?b* zS(CLME-zLV8Mi{qb$ulh85m6rxQ*4v$T2aQqB+`&j1G`bb&Orj$2&(L&*(rr65TL1 zvM$E3#^qdVEfCD&+k?%FZ$MA~E`}p5HD_e4p4m9k%}3+$$Y^H(HJ>hDB(w4I$dI8XAdpF4N13IP2J^_N?O3NM}GTYO=Y1hIq1*r@5j$srKogU&rmc`TsEg8ivw~TnVP=nM%ngFg(;QhJ zq=7$EYt{!VwPhb_06lp_NH9yz$ZrV4dB}j~>X>fa5E68G(G?a#1`tm?hBZwNI95sv zr}_XnHW>4OHqf?9t{F%bXsnpma(%SCjDe&1^t?+JkKt%U(G0XOBQO})guMVfX$3^Q z3bRQu3!@PYs}*fwg?dYgjj0T26yWSst0ZBLZ$sOMz7iWUhB*>xYe3s<$kI--mdO@# zU>IET@pMQCc57CI_Rc&^<%JCCx9iGi+W5KFy|_VQSHr4)2?V5vxIXgQ+FWobY=8N#Nsbt)PRwLOOU^?(0Kj< z;}5TeBZb%efvxKstb_XvrYi)B49gQS?mB0qA_7@#1agybulDU_+H@!)J2VuD7Ba(b zbjWpw-Pq{Jh#QV4vhGk}B$|(mMn)p}(Od$G=SUG&x#3#wGY0bsR><5ujKT;VgRfr262w#; z8wwB}l%;ysvIK;*gl1jNY9%EH|By0CJvv2ojWQuD}4gEs(5Me7c;^xTS#{l*ZEKdIomT!BVj~h#G00DD!*4 z9gVR|Tx^sm{T67bUWW{dod;!^fvDB2+0qu~Te%f~1;V6j))tvHbqwe%CGCL_pyHw5 zp&@7&#N-+klv!bmSVxcK$OEzeL z7@}2&NCs_~NjhiMdOQlw0LNJ*Oo4QKPa$x1yGu&5Z!*rf1hjhPhGWEmsYN=p3;&63Oqc^S5eagK&NwP6RMZb?>x^)%{mf9mr`VLHa z+_%P6Z%2pEg9^n!C>uRM{dwe*ZNmBmW&uWx34_WvS645?$j1Expp}aaP9xe`8f28L zyKrYm1>5_$Sq}}l2+M9Kcx+V4HVZKOIGTq$8v~l{fY35YOkk}#J6V6KK+14eR2^1R zY&~+F)8(R$!IqL`un5?<+;S?9*A_y=`Xse)ZXSRUH}6tOR3=c1BG_#}1{hBbZq;Ir zwDDBV)-u%@dL~libG0IQDp7F;|C0DaWOvezT87tUW z4v4Hwc%qD(AQvdppkBlZkL;0ahED?)9O^IX*!_iDOk%&hkv7w>tNZ5^xWW(Xnp%E8KOCmE8 z&E`-@E*wV-xo2ncQeJo>gsfh9B~?v|$}Y>oTrq<_U#u9w88X?t=2;|C&COI6J0=wE zhYIWk+W@#42jap;Quy)^Y&6FKu@b78uxwcwH$i5cc*isZ z=0+OjZy<0$HHNEn0Fupt0TA6Q7?w-Ly!4Rl1zqy^9V5)#8Lh{rOta=kNh@<4un%p4 zCR;VroIs35apx$YxpTz4%&Dj$)SR~+8{{;zmJ4JWkiQVOSjp5TQ}7ci0CjLjvCTq{ zsldnz>y6#o$hx*B)}kIv-R@$zN#Zse3%W756;}%_Z+~Vx!+;Po`K$fgECNg9&X@AWbs50VJG^+NTx4PO#|0>Fz??Q!%6oWi!|AG-OGaW? zj2O+knP_2nG?!1rM{>UMRWllUCovZ}d&boXS1X74 zGkU1iXKt#PvV0`3jyg*-3*$?Zr>Ccv&ZOoaIqU@)AC?pl_NK%2@1|=^7snwD zWqYxeTbjTDAbd#g;25aofX{COQw6JGd($Giee!Po7Ou?=X3-Y)YP~nJ8?cCPlK66F zsW+SRmU`t?FAS;c!`P4+%8U-V!`UG>o6X1L!wJ|e5?L4{ zBKdG43qc(p%7zPxp={0_$_=^E;e0d^j%AIsYF#bkJU1gT-cpr>K~u$4iu^6E{p4FkGqD2Ha)AO^)Lf9gjy18EQ8L1 zD^-B<&Rq#mY8@Q=;%pnQvS>co+dm6s{y3{e3q5Q-<_uBYS-}jHde#aJK*$@G481uK z-FxszZ?81MZ-4`HJlYoxM~9q#P{dIu7RJIfHnbi&-s?Egk%^cyJRVCp@px+3NyL*0 zXJRBe>|i%kBH@fh;uFqjYI58G!y0qKiDU#tU>A$FFa}ELM*)$eoJAjXhQh;9uYlyp zaMYQIMJJs|A`x~*M#Ga%I2Deg=;%<&nV5(TvFIeqgSH+Sok*#%@f7BkoRV70EA$6$ zY2`XfTa4D=8GQJufy1iVQ5{rd;tthF04wcGJ@b5VP zewSLVW7AUmO4k6U!87rN(xrIn(#XtPE@Uo0oGC?@A9+NBdkf~WEcPmZxg-u?IycXm zi{1d{BKd~E;Yf5S7EcV1j3&p%CsLCqPEI|3YIqW~Dx%Yu-a-vYG@ z4IN30437+D3(>+TECIs>Ow}W?k-~6zG!xHldgTaNX}w)DN=~Kk!UU!jSUw@pz}fhO2D`i3m2lp!{MRfJZ2|(7i(Ra za3Pk742{O1M2?PN@hRbL-{IaK-Gp3XB#uQeP*FG*j=7lKjJjCOf^{f5G#bywVo@xJ z#YT_|a9PM=tYN8aBvVKrNi08<&t|ZUm5sZ@!&o&Nj*mu13cznJ5*@~5sgN0g^=T+J zk{!xLM&gMKa>G*CFxK9NBDts=&*l@X#;euU+u%Iay)FEP-o$V`p|EderFAn;%h+w- zRs%g<%}y;WI^6c7)^R^hf1}~ph|UoJn3kVP5mFY5^fcXghq!IZ>xHQHdE0y#^-Yb< z;RGfG$Rbv7hhkATimu2E7r+X*+L?`IhI8QpEQATz_s}hvNMwg1aU2}Xfkni^iIJgU z5PhT&mkMGZm%@tHH&>;vhsrH%oEFc?SbHx)8r-m#7%#oVH`+#wJEUL6rr9gmfrO4j zM?_<28YVG?SYkMmaI=_FMPnl)!wIbWf=F_sn7%|~SvNC0G(42ZWw7##)!<>skQ~@W zJQL1E^TR`#{7|8Q1>3}MZV3FgfVJJo5JsnqMca`~esly$Fpvt-p>P311w{h>8+wLw zU~5AdqA_Hijg4m9d}1gu3biGX%SDHyBbat!tvVhB&%P zz={fBmeG8^0GmlBoX-No*>GkUVhLmy8BM@;l>?g{9@5*6XfTTMZ36b0i#$KBeRHM! z33pAu&Scio7aIC?YPk%pQ@=t@NoVp=JrJ2ZeTthhrzUhHkNiX_r{Yl=yAUl#VbD|p z#ewb+w}W2Nixyx4pzhE<7QlyZI2IT$V}Wnq6jNc9zXe&?mcLpz!s*@s{$d>K z;vJob#0%M2GzY1e&5w?P{A01$XdHq)7E6pohBE~WM@a4= z7XmE@$>R=3M@QpsAr=M4%R$y>N3pr1kjaOK6QK4XEPRY4G8j$Z1=#wLbw^{cw-oZw z{o`ScNNf>}!xA%^h>Wdr!z#=_Wz9YsGzg`_NHzv#4Df|W z82mS$h>SwGM%>)6I|`l~NyMYMa28rgHj*ubhryYL@`aI+p?owqgcTpu7F;!Uof&%GgD!mM7m8&n^~oN07;0MoCyqfc5oa@2BAAHKzc+6r!OfVmkf z_-=mCT*UwzI`0S3u^Xl5nGJ5&)C(Ry^n3*e%CS`IVyAdx<*4&Gw!PP}Wu@%Q;|$s* zX#YnY>>Vj001h^7Ts-O|%P@Fj9=ecQ!7T0>BywvNtjuEmSkKgsI%nNyoXMu%c6QX6 z#cCtADwyK z$S}5c0sCN1HCKR493Me8XEV5>fW8%^$2kK|%5l5^2MCWk(_n|?XPgO~5p_{10bx5( zb`}e54c5C*u!W^D565Ze+U4ej3fc(HT3kh0&%nr6XTZY6%h>i&FJ&$=bhVg61=%*7 zd@cb!tEm2&;svh$PBbs9R4$f_L?$c>VBU2CPiJs&e+=tJh%FS3!ibP}#^>f!u+~gD z3xml)-9x^yAKifFxY!u9jHOyEa2$m_0=5Rs{;BaVqlwxSp_dwg1>F0~^JFw5WHdR5 z9R%6b?M)FZ5`9$36)|tX9+*l_U#B3;7zM144r6wV>LarMvn4_ciut5pRWY)$Y+aR>BnT1^nyS{*Zz2}uJFvcz0P)#+9CqYGXlZ$7Q zAg8GXSU%^@z}7e697-<0e+WZzYVqXU=|u++^T}DP%FazX$=RozQ&Y1ON1fD@X_(#? zoVj^tY9>8Bl|tCm?D+KQiK*EW&KT0o&Mi9AQ!`Vvt1iwtEYM^HQzSE+NzKDHH@lb| zo0^8H`KU8FwK&T>Cy{B=NhjwQr^ZiDC+A`0olnm#q)_|>vYnlpot#H0sTtU)2OSiP zKqqwuJ_o{XdRmt?K9_!Ke(J=@Md#$)^h9cY0ajzwCpk8qk^<0_@#*B$4474N23ND_ zw#=cL^BT<5>Fmjr4niSG{2yPOnuB3_62owIaUR~IXxscE(V&x_omxnN3(Ze05Dk-< z;vaR0M5G|5W|?j_CAkp6x~g730EB2dji%ZRorzR(8hN2pW?O&<)!KmY@&THs2B7K< zaQn%?I`g(~B6ny#m-rM=*=9hOSe)}#QwwtgBbe6@j2wq(8Fl)nF&fLqPPz~|myYo8 zSOhwi({BTCDgn#i>#XLJ$*JknAg_K9y6h-6t7=CbvrFo5^N8yA4Siz$Jnl?tE9eZw zWClBX>={v9_HzWLVSV+K(=S%e3^uW0e}%pG36bT-5q%&Cjbj4`TCRR_`gsOiin$>e z_CGl3)Qksea`N|K^<$-7Zx^$ft%tyoEGLGEk(UW9x?n(Z@xc+b4qf(Qp#H;6E}2ti z+iNw*$q~whU);P@KZ1iMIH1bqbbSq&x60mscwL-1i>DXib@aM&y>4P+EEV<3Nq2wG zCQpspUXMEcXTiO(eGirJK?0i&wVI;$y!v-E=vCBypekF$p<~$5v5SctFTfVD5xgl| z7Fsi;5W+1MU~;-TkWW$?0)QN+H8a~821d>=;&{GnItAN3;?r~_aXboz+z|CZBn*Wj zQ@W4=j1YF%=^qCf)xbhiORxPK3p=jFo1KpvbN;(cii!IL=g&xn^ysa z)4Z<+3MHNxpSfvyH-lkmH-$l2STVS1SvP}WSvP{=9F92J2#1WvZ03gXn1SCg9wTCd z9_sfQ5tn4pWtiFML1<1Bxq0cvKxen?vsu^49byBW+aXqWM2B#exKSJtwo#ndxf|rE zJEKD!^V}%T>%_KnUgvcP*PYfOTz6K7aCA~zD2I=3<@of>>FMBBrgeQn(AM2f>pEs5 zkU;Nj2x7ZpBLJ^IHUjWEWkUcv+%^L6x@RK*ua7zbcpb%;c0@4@*zXkObNg0?ID#pp zi}PeT%km*MAZm1gpGGrVk97}gY19f553=K9xHN&&M=w)U$`A6h4Y%;-gyzk8rt&}% zE!ie9#q~1S16L5 z_7<&W`QL0QILIrcoR&;c9C!ZlzKxb}ttvtJQLMkCUFyrVUJvzJC4cT^-c7#>VG${ApSRvZV;D)p*Ey~^oTJ9}wC4DP% zN3WCOa4D1Wv~I_w+>GyMh?_$ReKvWfGqgIWu!Bt1@b5Cp#gPy-pdM9K_>1ZyVsQJU zI)xu&>+mtQsLJ?GsH@hLqaMLON3Ez!Z81uP5&i}p>%-$)p&G6XcpDoW+m@SR93wu7>wlx*;!uWkuSLZ^! zumr#T_*^bR7~dXlv5C*Y1BVrzTNRkDsX>it7nsHeq0sh>ep?S!My_kXz5?!vH%Dbn zUzCvp`>%nV721{s_E@(%U>?=jFCfjDuGLZt>_LTdzKB~wYFE7l?@ZNzpZ!JH8tRI( z&pMpBub?E{WQUqsJW2^Uq^+Umu5KC2BaW~|)vF6>r-D8f>JmKFG_-wZ*>zo#qaMIN zrzHjJ<)TJ|$b)6o46bVi8yn?b_Tc>di9?@$iAz#%38AC|c^?D>TT3{$m94jUW}o2} zTZF9d?;0pMgLu+O9dFE$K9*Pj1{hvMS{%$k9z}$d5r&&!&~JogJJ^>(7aW0u2qVsy zG=6J%msFPWI>#!Vzl;;xYZ(Sc@Q_h4_#23kHZ?FRj-ln`xTK^CeC**2up3tijo;U@ z7IE;q=xbh!h^fIr-G3Zcbx^MYwum!wJo*j-Z*|?<6-_UK;U%QOl8F9Df4e z9wOY0l7MvRqSRLUx`dKBR@v(n>RNAYU1wHr(gFiO}1#BT|y$z$0oOkLKP=NQZDc8iQ6=cxjYoQ0`^X;#n@kr3>C zmfJ+{EaS&qSbvUB$^Qu*e+f0T{F3jikLVk?2opYXW9B11%c~i}w%L??hh~OS2+;(z zA zP^X~2PWkceQzy~hzrE^2`^mQljwngViAAQ7H&cSqcJf+DSI(-bQFA6tDaLt-$copl zPMmuzYk5x#(3-9vHAd?4w7uL)T(!%R&N7zNB^IdHwsx)DoR*qfiL0R2CUz0(kCbuc z*Q_35E0g)^YlREy(zF2)7o}T@iS^V=$!={%w-O)1@x(%K;WfoUP!bG)&(M~3D>2bY zyBNR-c`a)}`v7ea(o44z8|@St#pbbW>Znv^_!P*`IgZBl3D+MJ6!WRyCG-zC`n*%I3KtWAGPO{j55#ZxM!o>J3l zN-d~G`0d-6np00At*lYl9Bt~88g@>dhMU%ZZwxu5W<5CB!Qd!d6M_<^;GV{BNu7m% z%H%ty9!I^#;afl*T36`X>q0oDP9b$l&Fgl|BQIQ!g0yx|$g9aC1)Q)J^Kh9qxHh*8 ziD|9IT%EI+NC8iiD1R2N#Q|4zICqj&y;qk~^aIX#YN{W-C-zr6Uvw1L%0|^u{CyC8 zdJccFugdJ-m<0x>@sI0lTp#0VFjt;hSD_rNS8=zC4{g_)SAZq1b*+bBt!T;TdXX(H z4Gf(Crjy8t6qD5bG==uh!Z!zsA|3>H1+=E3SJBz)QvM|HJEz`=9A*(FYhgEnUsNYi z##!|4EXpM{a1Bk?+QXRN<18e4K>o=NmmIK1dCJ+6U2Eh{iGKAq{Oro&654eHX^F>U z_(g!<1o9Uhjq7I@kq@C|#nR79R^j6s-_)cC>!-3MK8ieJ8W-GW;HQ?F-?%PJ*GjRS z_NCZ8GEqQ({d+H%ij)?_(xYez*JL9aE5w;V`EBYH&v8L*k~^xTkK3_4fE?}asY~Ee zVelsQJ+ZFPSCqU>)P!_KY_5mNq917KV$VBBFa3@KsQ71dmOWRjA;Z?^+8SR4oQ37; zEh*jaB^yKAD9g2bL2S6x)8DVOr0wxstB@U3hmrdTezL=g^=Y?hEP1*10~2-x5SOwK zz}Cqh=gdX;L>bgUd)s^=-}zSpucwWz>e)m)bG+^?MD3`hxZM zVWfYV?jUlKJ!#}YvX6s%KuE!sKI|Rc5%-YDT?!;+D-As9B^qYVA+496!Jpu_aPs$ltF5c zeVmpn&~Cu|eQsJq2>WXzoZ8meo?5?h=J(#ld2nwiaV)aI!8^+=fin{K7f@%P|6T%| z>~~`*t$+N{;>9%NZluAD%aXCfvN$qie;?;GzWvOOEJx42l7LBL7BCK~xgYu+bGG_} z&zsYz3wb*2Zp>47uZ5#TCr`GP2=<8`BQpE4mc)ZP{|WSy%#|d+Y2=$l4MjdUm>mcP zm`^`;><^;F#22NT?^B>~hIWE~$iO0jepvrS{Cf(}X^jhe-oP;@4m#x`yL4@-cF*ps zFZC>1B(idSi)8=3&71SsGpOmS&--nFe(PKDgZp^1#3K{@G(bLsw;5b_Kz9-s_G>@> z@blY*nXO#J{V7dc`nimYJ(QZuHPk|;fh(YE3ioy3T19;Cvsp%-W#*&G8NBn?ED@&2 z{maN#EiJh?v4pZRwcHBAke|W@nrabW-a%S!#8hY9yqa)xYSPWBH^a|5ya{HG$o&hm z$yvHjXqSJ|GspwK^Ye>~Q-D36I*EAPHGp^i<@*HQAAMA*0sQb^z4Z~L-i+U)k3ORC zU*Wz+^@cY*qVQkg%0o4P-^2Jlgx>@B9mek**$KgZ1z=t|GpH<|{hg^aW`6Hj4ae117kDMrA zJ;c9iTv{{uQ2z1Zc;r)u2Fiz0kq`IL^5L#?K62WC<#V?^!^I`P<%92hYnQWEKGfRz zEE|`cpHCAh`QY>D+Fdp71>V$l<$dOM5F?`6C_)xa+p>Dt@YuqA2 z_;8lOhc%~7l z{JTxRAx}KG#0HPUm&KzqSEYIV(3BqNM>?ZsFx z%bSFQr!;E;INalkd%0b?TOzfl;OEDUJiq^0=y7x7_X66fFM-t=PLJbz-g2!gQY&1+ zfN#0fTrULq@f)}oU7Xa%Co~l9p}~hgod(Ll>3Q@qUho+~zUpVHEGPJIFOR-b#{~0M zGTes%gykwr8Gb6YOUBXSNAJ*^5pT=)#EHt9)83T7bN4O2bWi~xVkCFFA`nA%^|pSi9m}sp1}w} z{?IOcocIx2;GpUssY!C=-;f5XzIKW)A=U;`&A{IIbPgJ#HgKMVlmBro1VJ{R3p zzL*E{5?=@M10e5$UeftAZg~*eOjoM-__ls5-RQ4NBLw*HiZow+)^J`u*K#NcbRfx9 z7I<<4VJOG+r3?UEs->Z)%9$!MhUDhWvs1_BcbtV^cq`x|c50T-UwBYfzWhB7$9ULh7Yo~;UZUpS$ATDptZV9(vw9p?f zBwVSE8?4XhFBR%^r8-*R`^^_Wl^MhA3*6a))u9@{4eF5!&nq*z8msZU-%b@D<r zW%9T5-yVhf@uG2!J>HpSz!iF>X^^UeH6IN?`Q=Lrjt^5I9RPe!;?a`09R%@)Xc2@f_ z=y`$IT$VT2P5ECSkXZ5={kgkjwOGd&Ag1J#jP5Kr%wlDFd}_jEtNeVEI!N$QslDM5 z&XkC+YNLj`gO`@-mx_hP(vS{ixcH-Oey;TJ!Thhkjz34ltNqZhtXE;~*3a3T4WJ)0 zHS5Ja5fJmZY_Q*?Us~dK8S~bwaQhQ(*yQ)I>$rH)ihSP7ARxi`WUZFD{GeoHlAOdq z;SBV0AhCvU7WtJsKSz^Hofq*V-NO4CNNBYtRcZ}#oqsDn@1o)QI$MtYq(`u~0wCwX>oO(hVnM#4vH=vz^&6pw4DQryEvG&H zP2b%Dao&_*E8bcz+IbO|q(XJ^;xqWd8SQ#uF_bc^l_FkWz9>< z)_6bSeBRuf0(A-Vp}@fAEW)wHDi019w(@>Ye0sVTgs}Y9IdsTDbzosA!-iBgmLS?j zc;|!fr%i+B_Qhf(ww3`{7ObB(8=e`le#tNE`Dp>?Kd$D@n17BJav2sU{)2rE|BmVK zVP6Wh=LEG~9}PYW$?$)L-JwjbXIeHAUDjkc*{Y%16V;O7ZtvEAByt6sjeNe!U& zHpSzBrJdeBQjQ-&+spt;vJi{fD#n!`T3u`?Z7#CLVnfd&9X@A>zpao9NW~Ru-q8|F zzko1Wv2EB4Y*|4+zIcQl3&sm1^JjZ#gWx0m@{FmnO+Zq5eJPLBm+L0-oWz>fag@J`zg!iv4{f0=*M|7zN(gPN1Da|ih17$8<)Mu- z7*CsD&@bbL{Xo21%PR53)e(O@Sc3s=rX2UyPn#m^XZ^InvR|y9wo#s3uzu-ZYoUex zUgL>-2e`6j>4`fLY>2dD0rBj!_LvETaFw$iUhu$O81hJelLN>zgL?B_;N+b#LhnUm zF;p{3<+NDjI^edKR=$rUQK56}R)a>a%2-m-Y@w|m7=qEf&v^hwB zb9a$EQopA?KW*0oo(0>shc_C?WAR}9yu0Wbq~NXwJ`!(z3geZ0{vyhkNB9i+B>9c3 z5s>dP5ANY;7)Y)e48Y$WP8&V>aJ3CStLd66h^_eu{Q7Vy@iZ*e1K4}mUT$(-xa6|{ zn|3R_lsg9cZVeas_2GhV+e*qK@>y9cAiuD9;+hA?f%S7uBIxIuLeQUW^RMc0;-}|0 zqlC2~Tr==}9IvD!8%sYi>HE1B5cG3RAn2EVU-9Z|`HEkE@*UPv9+8uzd*16)#b0>@ zKiq8~kMOmpJwMluNEbF<S23qxIoJFTwC2y^OERU+5(m9;BD` z;X)U|aIOVWeprJX*MvA~eLv5Da(!1G>JeOhm%Z+GMcDFLt{2P0wI249_1p1l{ani; zK7Bu_#I86IucSM4IO+$CEjdr{=c>3&-F{L(((FY^FPM>!Af8O^_+LF?t=x%UA`GwY`W2>K;oKYmTqsqg0+ zZV;Yp!<3sgKfw#Rv^?T}i|4of*c#8im&ekz^-F#1iZ1nI@&WQic_e<;tn}LXobQ+U z+$k?!>NDZ_Wj;6V`6a)xfS>p}t)4RF+45gBLC_nNU6^ov2$M@k!OpZU-CQU`6c~=-nGIMcK$MBLO64whH%E@C-athv``+I zxA=bPk7+Mn#)?BS9} z(x*MY%rj1Tewk-Xd48eqlb&DZ87Dly^aoFW1oI#F{DR*x&oAZkG>$w%FH^XmOdgpB zJPv(Q9?|=GwnQG$`{i5?Lo6S+A;QP4k9?APzwftv-G)g2&3O4seIEDxqW4dFeyRUN zn}6K%TRzH@R(u5B`mEl61~rmL%3JjOBDH5czv#O>B_ogMyS`uaUEeSIuJ0Fp*Y{g} z*M^9`YkgMV4f-jke81?szF+iR-!JVw>DAYc55NB8Ut?apw0{ozzC1EM9{2pB*V>&j zv?oyRrNJ@e5ji;P`9-h8`iGYv%NzInqSqw@e#(mleZGlFM6cscM|nh_oALb8o|B$m z^tlPoFZ$d9FeZ=SW7hLqer4lDFPZe>NuR8-4WXYB(fUP?vp&*4`L*vCJ&vcVZ23%` z_WZ)X$gkv)@$37ge!gG&XUv0__Alr&Tg*Z9wNsv7;8UJo^tCb1FY!;Qlqp~EbH?)v zJ{AIgnb+G8X|MJ9dYTQfUtjhL6qBl?%`7yZlkOMbpz^e^8p`j_t){p+-szqEg$&HsewxBX-5Bk(*$Dvza4 z>zDeBd+{QlIB%5a4d4)z8MK6PHtb;Z(B-~kT2{y}c?)G(?+oR5Cq>n8Ixea+pvKPK z-js7Tj1k-~&Aq@pb=4Zq5NgyMwQ?^5?eQ`Ll^GV#1JL@yJEx-h$NX-bj(Qzug>px8 zFtx0>-Yh-&gjn`iFDaYl+x6O;rDyp(kH%S{U-PgaS>xlz_2*5?w3Uecq@>%;@@)<` zD_=0ld$4Tz!PKt?f7E=4Kh78Z_S^CYv0Ho)?U37|ZU43B%d?bRwXnO&v7Zofow@_h zNWUKGlW3<P52QmPQhkD=IAmlCg z*s~5i30MH$9q8oLPC1w2?)h=-P33vzc|DHUS{YTXyYg*)CXoxzxmXIeCv@yh;cUMH z>f%^*Kx;e)K=}62OMRA*bY-kMCPdCcbF^B__j;ITUansAV&BM_18N2vwTX6Ip3G&7 zcn*_3ekwXt@=~JaNy{v<}<~{!$O(+1Ow1(^ z+A)V<80$gK$*{cHN$+K^UjNZekA-}%_jc|h628yGpM0!G!!7<&w{~}bMcmR)Nch$N zD6W@*dHKGF1a9pGiEq3h{&qO)f6w=9v9Ic5@7tobK8xR5{jmRtu(u=Zu|U{wBkYq1 zdomFAd4yd>*#5WqX}^H5_k76qHznxT{G?v827!#{W;_QnsGmC+%FpUzZ>^!#_j$QDR-Z74;VLW+((U@ zHg3VV&lvaJ#{GbCKW5zDH16*k_nL9PYFza$DR+l)4;c3$lX53#f?iJ&{Y}{9j`!(b4c#o9-dgH#qxM|}SjQdvO zzT3DTG43ag`(KRvN5=gt<97X+vK}xA>$4j_qcIS8h6pSRpY+jxSufYOUC^Z<6bwe`f<}9%CI$-Nt>$xQ`n5N#mA`yJp-UFz!zo_eJA= z*0^6Z?pKYgenQIGXWXO4eS>kQjr+85-)h|V821Cl{jhO=#kemS_fL#_-M9+!gU_AD z?KkeD#+@~;9mj7p{<3kOHSYV`;Jzbw1h3zbJA#Mr$Q{AMcjS)X;X882jEnEc9W7eE zRdUDSw8Q0gr(v+2-NA)LvXcFW6+743h9exA|c zp_`;q|27oJ#?3WxT>0{ZcX9O}BPgpA2M>`brlL4&rchTfq|Nmu{1e;~CaCr)62$E_$ZjnH1^D}O_nZ!(fT%!hu zrf?BMI#bK6qJ?iUp@iX%XMxd&XLV51gvfbMBIU!lXQCip9Hx9p$$JEVf8wW7A4iE>07v5m+t!#eNv5S zoH0!|YDx8FKTNmz-ma-KMuM&Yi%P0U*Hm2^?PKZ$!fbn<>YB!PiKXu^b>R%Z0PEbI z?XsuVT--YHZ#-WGJ^F(I-&9#{FF32-(=~%5kv8ui>zb)ApT!w{+#)aoToiHeMkuwe zKH8PW30{*wHnsd>7f_FSo2IKzX#W$3mPMgz9~-V2cu{nTpHygr;M z6uJxJ09`Mg<^kQVLp`s$hohzCj)EbEm}JtsqYOc7+~pcN(GZY2!O(Sm{tQFg`s;0e zn5MMnHt}qt#n;bnTFhj#Zk}c7VXuC1(_$@?yWkHk^&&&cb$ra&HC0#Y-Ac2wlbLcJ zXNZ5c_3j1W_U90yPkE9<=F|EJ@~6!hO(0WN>f_<3$OsXiC*fhMXr(gc`42!x(h ze`Cj6it;TkXMNA&w-u~u(L0qRFvLsC5K`9U2v3)~avtonKFx93ok z>K8-)8PkvRU7uI}1m7?)uqk{S zH4rMafIt;zsDJASay-S5PN-1l8AD7i;A9tW7|B{c&ylJIeZ0pZRjX0*{UH5lYO|zI z=Nir6o$EtU=8yQHGJ-TUysJGFkRNB*Txy26`h>S+tw8_`N+K1`)ZX5>%Z~>e~s`!oo+`=^2J}QxiMgwW)W}C~) zZY_Fw22 zU))5wXvQ8e_{TxNrjTno#PSF5Klrh}E9g*P5}!uZSNVRyhy2@3;HhVd?xnc`drWQZ z*3xn8as!9P&*G5#_)4ax?&+r5NdTV%zg~ygu@>%@v8yp6Tmvo2cWZ?d2kUV_5^N#o zYK($&eoyy&rdY@5@vbWQq3(I0)vyMneV6v@N~zz)d&$LNYR%x4`pfS5Mrk}#C4P|t zOuwPN%&_T7AMP&WJL_n~3okEP zV3-WXmXUCl;Q=mFqko~{joY83|8#jp%i+9-X5Z$t^IwEL9-?jrMfm71#JP` z#;Rv(s}2oH@*|rqVJ=oYYE^I8d=_GuV16=zM5fkJ|Q9Pq@3f>3r8Ur9ykQVfOGk)f?WH-df#qe)E;?YhBk7PPpd- za7-UX`rCWe?Ve$*N>VbDYst&yW zy8!+|XDQN5v) zYE!tY8afZyE!}EMO?>)&-n?(#q&ANkn5{i(>r36?O=;uTZR(J>4j))wCd-JLe2J$q zTVs^JV~g7H{MPW6bf8^3x2T&xH1S#7WRnA3gx zob8+MS`W{*XH8poZ&SOo?Y)6|>$2`$pH}xtpWi1edp=M${m%vbd$*~*q5W!mI7l7H zpXL5phjN+z6quL*28|2RewauP6KDxj zsjVM+yH)R3Ogf$a4&;B&`uv&C^ClnC?n;;17VImw8}(k7Kk4Jo0)4uBtJ=NN-HJ29 zJR5*vS$}5AB7UL){ICtrwzq*}V9*}}x-WlpeH%#kV*$F??R^;SeQG_d&Z7e!_G|{f z*w$-v3GLddcGcSHxLa)t9aL;VNVm6BA8+nV52TalJM=yIPYwBnLQ41RZCllC(N-$c zG&a^D?cS|w?^oJjHJx>LE{kLM*|srE-2IttwV~%uG|Kjd`c$xoLVdleFI3suUb7JU z5@Tg^xF_xLW6jU@`+d1<6ZmAW!#48?@z=Xq^+x?vy4}yV=MFgHsMgkQw&VFgJ2q|d z%j)WqK4ZPI!4@E|o^GE9XxeyiJc+5_+ro7EBkR-a@Y~mi zvke&eg7cZKcB}}WyJLO2ZKT=n4{4g+wz;+c$Xi}EJc92pns?0`?`p%#ee3hqb-inS zxK6*vPtU%|2Kq+J$U9qQB>BOM0e--7@mwe@?HXENhAw-2eYnp1Kx^Kb_U`uSLF42> zpC+Dfr3p=sl>2)PP0j~sa!Z%mf^iVq8UoKj{I(GICE>ttV>?xEZF4oWwOehiY03|W zHg~DbQS_YVt>A|*1^6L(Otg*1?A)eyuIpXoKXQi}SqZ7=T9-Qd&Q0p@`@7ZaKGLJ^ z`s4=u=Kfvke(>_wt!+|$@9b84-`~@UUyZ-Wdi=fl9`$CVdlKp9k?s`IO?+gtdgPN^ zRN^yR)zL3(Q-{9PtM>ohc8uTst$5aX9$TNMmYol+A48g_+|^2x#L0XcPBc&3q;_}W z1-i@*a#QDhUu)j++f^Jg>eyP3I`YoV>d^bQsCzyFeFgejYl*Zg zx(jvOgT8Iivou_fr%yl%f|j?c-ucbdD=%(RT^JDgk8V;cAKRqP{AQ1Ke-iH>4fqY6 zr?+w398!wu$kXrtg-z^IaM zp--yKgwgfTGNBr}ZL_*9k6)}u-L`jom3i~ga^t`bbs)c69ay|g9f<8x2WtDT-+67{ z)xB4CSGVm9L9g)Z^W|UJq|~o&Qtv{2=!UjzQd`ELF^B#9Y`%26y1Lb-JJsf{^C4Yk zR|xokKU6hklTXDUyIH@+Ce@oa{@u{^LU$@~fiTo7dYIb z4m{`Mkac_vxR7!o%VH>-Ax+^zP;Zc}@o+jV6}b^CegGohWn=yr85{{eL{_V3lf z(0kS1>$|UMDBy#6z6VVY9qLtw8sI7Ut?JO?7Ig@1Iuw1~HOYGi^4_lY&hNU$y!!@r zsQVhXtNZeM)qSYreSRI&ULDDA=fQ7v8*f7!ccG0t)xPI|kAuCa4}QSKLEz$G^xo_D zTfSuu#qH|eSg*QwzVG^7*Y3F5cbnAv)1T{B zSI=)&zxiOd`e!_SuLGZt?NEE3>rFH6?-0lEe$XzTzvu@N@oY2gw)Hx4q+30U-&xe_ z^Kd)W{mTgdANW0D>%Jv~v7pqReZWE9Z@10!4<3Sk|8TeZJ_~>QR&_h-cKiH}>%G_X zEHEu?MB9Mpdx5)qfxCO7x{X&td%M)$+V=FG+e2!5Rw=f}$!ym3Zyb|$2rX|1ErXt8 zpy#O2a;N%#Z?s$eAbz&~onU?)@xK#*3Ei<(-O<1=zXiNzv$`X?=bF&$7V4hWJ>VDJ zrf#3iZU)W!eJ*vwoE?3)AAPrf-i$Mj{Z}yd8)od^*{$xJ-&@^tes?&uw@2;G?yBxQ zzazap3_fs>>cxau36ZN zk9Vtg;b&n(dpE1SjXfBP80#-@Plq(W1)p8q30eo=nD=>wz=9uu5AS^uu)Cq3fR=WH z4tCG)sP5T~xe3bSyQQnxliezb-|t$w5?W46f1)jD2Vv1X^(nwDKh>@N4+C4p`!fN* z(C!Y5S>UO*+e`P#8@ts{zo}dOgGu)hynim>-^01gE8vw4xTvq;mDg<@-*m29HSoLR ziW%pGM;pOUTSmFy266~|XB}?t=~DN+yw9{tc(={}YgzPDF2F~$eB7gUzD!97+6ex1 zAA=8rUy%=s%-F2nUhGznKi#c%d`x6U(BB8z>V95m?J?%1^8k&YUx?q({X5nDjr-L7 z`PZrYWB022A-lX@CGXltnE||l_APFajjmU_YwJ^ObgSb{zdk{KpRuc1ntSFM&>Vhj zr*fj@8L+N?J{)+{|BA!1D#R^^z|{n9jf=a z%~elkXnF=6qiqL3HwU6#%d4T@E>dwVI>Q0RNJ8PcwK2N-j0O?w1sda^g=lFVo?bDtQbgM=D z{*A4};ce=0enB0M&8x$qSp~UQ-3Qw0dw7ewyYW?ZckFMVBVAXNl`Nx*ty~@ts0j~X zAAk8n&>f!dRz;I<-yq~n{?m{(zk?O(-&9&#FnL^~Zl%Z4ZatRvwBhNW{-_`2B&cb3jH}n9aY`t!~H9 z=B4R2+7p&>zZ2trhq~=KjCy*5Z?D3bVNNSpbMh^51B zX|9L%L-z#V+mAf<*Y;hb1nj#Hd>{DS{hY5Oc;k+9fiU{#PSV*9(Ajo%XVj;&z5}!o z9nkXyrnyR*(|icy8Swi6PaeN*f0x?-^1iTbd;Rm>>c{cB4*by7I{vewKQ?*UOte{M&ALQZ0gglJ=pL6@weuDU#w1zlg4C9>*@#nX@c-`(na z{+|Gk*hjt3*MawF9Rd0Q*fP4_MI&PB)?^oy^DQ;!eu@cymf7yH!R=&QSd=exhMTkHR5ve;!H=Q`Er zbXSl1_xSw>Ti&ja+BJqWcWqU7p^bN;+`D31)LqfrF{c78BWypy_9F~5Qr&X^vfz>%VyY317aF=i(qd)8eO-8n>`xf8Vbzkhg zUH66F-Q|y3fjJKt%_ksl`eJvezL!0Sbco}lu^Bjr{c5orINzl1x(=RmUvPf6yJddY z_u%$aU+gY*$2hDeoNZjiie7coc{?`GqwX>m_FydRroFX_F@3saOfRe-(@!!TZF$+w zG_xn!qb}fQX-3BXHqSOfdGu3=-#^yl)A7dhyel%+|FNST;40)@=+15G&d{W~?KQP_%52E7*{Ti>}zjuKq?wY^-`krgIUEO&F zczE4b^}6}HukXKh=hb~zWL`pA;SBQmr5+VK-=jYKlDNz8zX|?N!O!P?c>h4a-$%Pz zYY%9?3s$7|WP4NszkdMT(WU{9n4?q0~oduuWu?z<1` zYM~!io3C|W?Ybi42Gb*Tu)kOJfA#y7)A#}KpdVDb7vHJ2#(qepVYmDR{QmG)rSF6O z(017R^04cH_iwMFK3Y!U3t6;B--ogKN}sx~u^+aRyVQNLJJo%meTuqQ=)s-p!Nx)L zVE#V!VC;43LA33_^}Da_zk25tt()n5L|?Xi`yYO&M;-d%9`&cTU&+^@6Zdt1{Vl-# zMG#iojA+;C_3S!&+=9<~b|r1k0v?(|4}b6zJ?bydnYk5s##S`j<`~g?rCd zbr0qq_h9aE59I7U(S7M{!MSPF*ZV*ApL*0UOlO7KL4i!|L$R>KL6d$ z%Y{Gu=YRgvSLIwi+s5Y$4{X-y)*cqurnBzKgA%^=Xy^F9Gx6`=Aiml!>2?ovPX8qn z|IQ8K&mS@A20N$!f{9<-ApSECNxGF|oztgH{Pni<#0~MuA87@c)qn9vyvDb~#MnTl z<70tett+YgbZ=L^z48^qSDV8(3%7g2M{;&He7@O|zdh1tviOo&VR@za^o7!Dxl(-# zwwpIEURt|sJ`s@|8=pu`o;W%6_^Iic*}3!+^9zfo&zybosW*Om)c;?q78{bqZYgm? zvT**TYV?}s`~Pz?33YXQjEs2vIVk(*pS}F-L4(u}|EawE%+HJaj-S5vk9>RVZEx4^ zM*#oZKl{a>btHP--*^0z1U+V4E=Ro@_@sgVHNgL`&%g5g-RjSu|I+hs+BpBW{ftiW z1jOW_>*gYk8dHrO=@<%Dsq5)osV_f-*w~-{=EM)B5yYW zd9CBy>-EC#cCK%=F8H|K5O;T}vz%1Ex-DEGHzZl?sel< zKPTbsx_7&u^v%ce3F}_Twer2e?@FG*H%^zlZva1r@8&-CnCb-A4nvf6g5xLTmWnts zhJ3zd545l|`0fA6E$Z!X{~UW09lT$M`;&Jn6~_CA;C}ore1jVASK$63eox~48r-vo zA^-7y9`4WMw}$r@;C^O6skh_(D%_K}i0~tLPs4o!MC_;V{utaJ!|!u={}9~Q$B-}H z!*DmpmAa1i-Egz`G0!U8?FqCRd+T^md+zQ4EJgLScfXyAH$DjeF*Ns#|7pwxYzNk0*3B1F1;p974EO&0`0dW{0iKA zaXB}`9k~A&e(xnb+;h0poB6*7?rps89Phi~K8hdVAA|e4w3Ow*{ZsRP4eo!&_4XeD z{8hMQC7;538tygxm=E3GI*We6`xUqkJt_4J!~Gb3uOR#dxO?!Sg0JG;f%{qfNHbUA z{zgHme`H#?_br<`!2O_k{}9}N#Bblf+rp1Hs4wH^@V%(iQ}{9bJlw*nQX_b;!u@0X zh}&y$3u{uh|Bt;lkBj1n`hJ^Da0A>?5pju{D1uAeMcg$}GqQ<_3c?`h0OQP{phnRM z3@|Jz?i(6+QE|s;lo%7&M8th3(HN6x#4XW8R?p6!F|0&KZ()fT|Az{!9!OF>~Gjvxl0YZ6`!3;X{4bQ{iW%Nd`mHm>35UPU~9JG~%tH96#NpeM+Fz`Ht`dAtG3PR;e+u*nDlH`sw$)Mj3);EY5 z5K5m9)+}V@dxG=!vbN`gTZ`COD+Dh=s19Xdmjg`q162nx=b(I|4nk>?!5fD$cObkB zY;uH!`+&zF)Q3wz*J3uG5OW|QNS_P-!*%H^j5|mq!iht_M!V=(U_9yM6L9P?Ny3(3rSxG8E`a=Zv*Y@J(;ze-=7TRGbS&2k zlC%Kw4C(X1dRK9-m!r>sS0V1u%fR>_c>lSJ`aQD@}{0r&HZ{UHyC220oECyY1mq}@eFJ9w3BHR^sdTZaHPLu}pl5FHL z#st} zsGgv@ij8z1x)yxSb*U=q2BGUnG58Xah`Qk=LTNaJbS>BpzhA#XUOzAqLhVWhH#VI%iXPjC!`(&U1UHMtMLG_L1@ zMI!xDs7a-)TGO$%$b}S!oJlD10VF=B) z#o+Heyd1Qxk7KRC`2|xT@|+Cbg~-PRw>Ct%NK*(-aOZUZUqYyjc!)@ffFz=xTCf~K zW02U>gQf8U^SE9NK7z>QgUuTAI)m3B{cx-@@TRAYJm;5zuOXCPYJzwO9ajb3hftp> z2g{lw4f3j**+|I{>Yv0T&26M;gcpOG-b34vz7YHeBGGQ$hFs6rrKZmpVtsHcTw2{}tuHX;|9ajY|;(9(Psad!y zIFRdM;28*wN6#qC6%#PlR^ohtuOW0?ZM2QlIfnH^KQIa+hl4j_*>TH2RUD2%#|583 zJW-AmZzD~C&~+gh+y$Y$#b9eKZzFgMBF}+f%w#s+^TGK#Ht*$w%k^9bk0-D`pqgSM zErrnBo)7Ms%I36UuyP^`cLnD`Xh{mw{8#Sej(8Af4qc1U)lYnZyNL&j)K|vg3M!>$qMBZa1;? zh2ZHd_=@TPuFGcrDFk=suxmsycr2IcCE%SU=zB&uHTJwMr$Xq!ya}lKk(TB=v22aFrOS`c~xM+Nj6s$f*IG* zcBIJ#d)?r9!H;h7z5zy+F_1}RVPFP?`g1P$5<=rnDz}jWAG5h48SMCkF8{0~ORA+Fqr>ztQJsIrP)K=0! z_X86kRG(yU_ItL{420)`w_4gtd6XBd--;c}6Wk1;@m>hpe*j<6_yuP|Xs$>GKW@$H zqXN~CL@FOFX=5uDpiJU$FI)K<9R^0VwUzs-7F-XZ`V@jmK6r)~{V*A9(ZN>klRn@y z2>B-&{EF)(U~N3}LE)ZYHiYVv3y%Jf)h7&W+R0WrggW?uZ96kx`G6g}*h*&*?gt)) z$a5Ols~e7sa{Ry@-I-npcIe64;s-YLW&ZR8d-Xy;L7n};HGVujSfdZqJ;B+1nVt(4 z^|O`N6~*8~2-UwFoYEg{r#6CD2cS&!lQK{m$oxsHI*8TN6>K<|>7L*Yt`~wgAylUH zk*%~3BKHk2> z9Y65$D4buUDFd5~W_f+U;VLi*LUl_9yRX5y!#w5( z{tlsevK(Bsmg)Imv(I^%;8CuZfaU9KrDBv%oV}j)fn2cJ2IdnL_$h>Zk_>LI0TS2g zUXj-md;y_w>8!1k29fm=%+CpsJH!93#$?tRYt2{`OermMhVFVN569~D^g7n`?<#s8o_ zXjcii`3<|46@tz1&NkiO`G5^HA27yvbnoHfSSsSMY(Con(Yw4w}5}qYwr?4$zdtw8*HPf`)(1#50*I{xh^`uCyaa)>>-?g#F~Hz72r^B(Y9 z2p#JLc$@2GV1uo!9CvUJWD}(aA3`X7Ias@Z9}67A^)N7<>n5JO(L2Iptv0 z?W~+Gpbl~a;Rf&<9$p5vE`&c3-UdvAJcDiok8zzS?PTG^f?crjEe3jqeE%Lh$sKwT z_}*Uh73lOnetQVjzY914LVk+|r}6L^U^dtHfDQJs^80}r2<0WFa6KP%-j9BW@;$+y zAzJ8C5x#{2Nu+Ra;bA*zF7!gM7-EE80)`w#-++DvtaS|M8hUN8%C|Vz&^^Jv5IXJ< zFqG?&;2H?kzW{u|b>hI|EPWWbkn62Z*hxc9+DU~dleqpg>H&Qd`0_iZTYkTSzH1Q; zxsNo&sgPIDlfgeA)z&#mk!S62jf9_}6aOwnpNIYm%s7wZK{tV&F51a!#V%l_Yj#o? z!kxfVkh##$fc>wtG6#WWTqg$IVBsNP(JlB2>4}=#=#$Wi#xnF#=)~4P*hyEQw*j}` zwZqy9J_mdL#OmV*9=pftL(KivPO@K*c@hlx4RbW~GhoC6=G#bc`|p^m5nc#JK4Qlu zRxZc+CE(bn>{wx7mFMhO)xhYNtnI`P{$g!!1FnaVKR1DXe>0u9m+M8K z+dr)B#4`|TJJIk4eFAmZ1Fp8g`?%2a!Av`*o4~2~einr%f@2(+9tQTW%=AH^S5>C_ zfDNlN-5qqqd#jY!34DqdUr2ujw!`-{=0fiXX1du+o1mM(9u4iKW6+8BAyl{KE$yZ8 z5P9r?*CAyHzX4Xmw=pQ3=nJ9#><2o$kMC$8jT3kt;<>?5x&T)Dz+Uo$?gq|=P{rWiOV#8hE-b>WuJbU=MH989H$m&z z0peK*rT6&|?e1hR4MO?EqR#Lq^kVRD2p#Jc*sF`Z6pe5{a5seJ$vt4xu1s$Z`a&qZ zA2^EZq2Nl=kvAXwf$Mj{r`_!3vHT2l>4EwojVpKxLVe&2SiL99>k5v5&~Zb+tG?{K zKLFqF#g5ws9L@Dmu$v#==SG?Rz<3DNO$+XZ6d-&LSgAMK4BZXPgiv3~11I*emrfvD z1G@FKm+n#;@CM`o^jBc@!T7${Cd~QZ50F;S?}FPt!uzn$3&Bbsv*S8}Ga*!dGUzkJ zUYdb4MAuL7%>(Gf#lftfF9CfJPo1qRRT_lWV#V-re^)HIanzQ?`I>u6F7SU>ks*$Pc-^J zzF*-7{t2;%?iz!62I2(W@|za)t&0(pFm@15RK+4cbYeNg4>~a`4spFsCXyK9hg=p|sIWQ>34KHwmT=T@{491dv? zJq!$ow1U0@yaS;=a2KpJoA*Po3D=v0cOWz;+y(9Cur&6dH$mgw499I7};P((JrvzM*%fgAl^Ozn2CX(Q|#M=<6XBoI{K74}k zLU8>8_zU_b@MlOa^!uP!o;}vf=nr5H*xb}fVAXGlF>mu|+ zg!cgZEk@g+6JsFMMlERKI`IM5iJO<<8#qW`0KUH**FNZNz+(_9pEzR$=3ayoe_Mq( z=nug2`ItkYUjWyxMSq6A4lIL^ABcv}nSY31K&Z?^;57)%Q8&P5>sURTgR|CS>~F)` z3>>k6^^FklD1_F2$3WMOtW4roNDrhh0DpqeIVuO6Z$f`Sct21Fp=-SXe6j^|D8iqC zUANjx>!9}l*Fva11>mOze2xXHY-96$H82Kp0_inirR^Bk(4D~hkY~_|t#+XP+a0Aq zP+!Q-1^yje=`2Lw#d`eP}z%=>aw>!ui5{?g_ddz}!dWgYCaS8{w0V;QcS*XM_`b9zi51VFS$HJ4_IIR5`Rl;3kC100`X1Q09O*GHd4k`Nj=U#8 zx5tc6IrD!3_zNT-j?DR%d$8dohIi$r8~14Z_hbVl~M@ zsF0toog5@B^ki@;zLzo=`U>z~bq8q=^!wmJR|n|?^h4kR zd_%7cdLG!O7OOw8M_mW$8N!L-_})piUD!7Oe{YC5=;h!OcN`1)GqAb`(_O)2e0w1m z;l#fnfbXy4pHIs={f2ZVh10=(G)-yT4C8Te-x z2Rw+1a4@^8gVY>)F1VuyzOwPDtzQaKrI@v)Q0$l|*(K$#O=*_{N2J~&{hd|o|)<%1<^%MswAK@Bs7lhir2eiYt zJ&LFtP<-cu=r_YbdVp}^ScvOBoL{h2GU@=G_$|bb?iaww*%-eFC$5B0`T5`@u9t&l zbI=cI-35Ao#?ttJHz719x0#D$L1=yp1Lt!+58RQ0bAj>;!Tfai3OX?Y-}y+Sn}Z)Mz}VZ5xey89qumfXUl%|-eB*=KZVz_gdPgvV>xaNskRHfOoUw?tooK%V6GDCL1?aYt>BLB`6ZddEc@_G=I()wdd0&9n)?;47 zxwrw=*@$oNAlwhEzZw3A?gMHe_n{|)TOj4o3&Bf}7tqVVmRm3$i{Nu`FNCgZMc_>c z)vXLn-imLrBMmX30Ck0)2!6PY_4zJf352c@#E2cxvG$7u_d#eZ7lBg>Q5O1JBA5pu zKd%56>_neLnR#HFU2IGdmqDlw>%j4Q9i%X%i3CqVOwiAOsr%TRvkpAHALSyv1oSI{ z@1PSeK@LH`0=|Gy|0K>j!1{A8m=8IDG-aUk7p!isU}s1P!n=U|zjQzum~TNfgz6Rz z-i16sIPp1z+VujgcbKK|0oy}du~t-p^gV1h=tTO)bw1`6B7I-_1au;O|11P)i1Zym zN<*Y?^O8=aZ|agxr0=ehPNZ+5l1`*=o<6{NA<}nDDV#{(B&Beo7uS72`ZgP-A=0-J zNhi|x7)dA6cMnM?(svC>C(^eCNhg+bok-uf>w)zfk-pnTX^8ZFEYgYe{WH>u^erCJ ziS%74swa`Y2}R*V`t}t0he+R@qHrR8Ux;)feXC~$<_aQx!-m3%^eq@FlbFlH@wUbP zb$<`G+4tFK)f8hUJ1-ffexyN~ou*syf5 zldySwRV&+B*gSm=Ve|C0h0WvZ37f|^5H^o*By1ka$v|kN8^>Qyn)(Dque&N&HA;6 zu*cu*GNNwK(t*PM;->C(+x)ddgLlgGY`KaLf4>no$i?l^EbT-Z-Wdz5!FZks9W z>p^ba>$bapLD;7P#x^fB>tUmHGZh)a+CPps@` z!mbezT&q%-l;^_c>Hn~@{}i^<2)BlZ+iZCuY@Ys&m0h_e_g}YLs;-@vm@W%@%elaO zm!us(3tQA**rNWz7WKEXp9%YEsDIn?0wzox?G z^=lz)e!P}e_WQ!-{{2AMJbh~`yN$59f4zjw(|5G8ONHJ0g4?T>$8KB|_Qdm3x>U+7 z`$^al7j;QHOqutr?4Pad2Uhk&EBkjV+nEn&Eid22%67G~eTDsatiONVl#I`X-Qj}2 zv}(rQ0xNsJuzCA#3;U~5-wU1HPLv5d>AKIG#UmH~AZ#B0qp*4W9bxnMyTa!2kA%(R z%Z1J39}AnuKM^*Me=2Mq|4i6CzFQsMzj%CiVe|MN!shWkh0WuAh0Wu837f|kv*IPK z{<3Ot>Q~=>Wo6^FQu$9i=vwe1-^VFut!%tf%Hj`>8vA(rSKpo!HlGi#3VZsfvCGqJ z)|LsI&(A*yo5%koY_}5Mm`XQG@w%w|r(IjpDQUx@y?7mz+4(oxzn7hViC#;fKT$tB zJnkpkiKT{Xhc9ldDQsT<;leJxS#!1T#V=2@uQ;wH0 za@t|vF&Ed1_~O#wjFuOZHwb&zIiK;JH2E8a&ExSpwfv_oy*BfUeT`1<7B-*X@H#S! z=k^I<9~{|nsN?_w24_2!4yK+6NF(R>jPRQOM5r1xkYSEE%5AX`V{HOhEbdS(QO-_Xf z+pnb4&)Y*zj1smnpi|u8%BC^G?o*Lu>c*y>MlLu>UHV z_Ih<*M!v8IU+8halUE^L4PxcZFLAxG*yc;T?!#<;d}V#|>p9;Gixy_OuxLs9#np~q z0k3V$8$wW`Mf^L`i1A$iu!g9n)#w-jpuq{j~eBF&v)dh>B9a+HS=OUua~og9evr* zVx!ai*}~4apjzDdhcnBC&EwZt*=vP;eQe!Ht8V^{*RU+1lvr*U~{();& zSH3++v`0J6*DYsFw$dMMh9~}AucSO!#1~)kZLqk`MWuhWD%JK~edQou9w_5GRFuDa zRNcr$ZOWAXwcvc0tc{UD4|qk4)sNeY#qpMnn&G%QeOr;R{~qbKbHk?816H;& zK6rX%{Bc_uZ`{ro`L_mpw5ZhYCuRH(4hlW(5%i*1#B*Em$BS{=72ZXMhKcy$qkKm7 zYEs}YY#v`#*nECHF6`O2I(@kR!m%^LZWt8kyFLHKLo54tVMhmP!_u_Zp9|aXc8_*0 z50aM)oAP4^wSH(sRoxzWk9#j!VfVe|9znXupY@7Abg z`5|RIeI77n!}i1%X9~O4xfvrp*8ea|*lR9#+THSu5wGUUf7<%~f$G$yXRC|z zJw3QnVhe}zHo}e$ax*P@aO!_L-gc4xv(ce`ZAs z|3j-jOw|c{_{eVkH@vq^X}?c!$gsxIj|?Jy^2M=VuU6et^8Xz;s#E8}pOp5`yVB8r zwREeJxL)z=rK7O<{Y({M^ZB8wu$_XYJ*#KjT3y(WLuUNpVlX-jn_mxHgncT+BiVWL zVOL?Rg6i5I9<#BAuzw96^`hnLFY5?<^a$0kx|`;^3Hw@UdzEkgoCd=FafE7o<285O zh28#2V6#d$e{C%6R#)pbPn&zFnXof&)~vqj^|SYcUG=tqpPa;}Erk7kNw>|7i*~mX zHupyxVK2F&d+%`GJ}+VO`0m0!b=x&y!_C)Cg#USbQ(<#|D)Vd67=M=y_rGo~;W z*gU_xuz7wD(O-CcV_}Q(h28#I-JUy6UTAJ*zh`B)6ZTg(rVTl~{!x2j^YPz7*nP&R zI(07I(o@(zAs$`YUi`kll^rbXkQ*I;Uc9qlw6F)2j{0=tp66l0-g+*ys^gG1YGEHJ zt$lf4&l{~odwKh;@0YzrJRcv*{V}%#MLf^1tT(uSl=*7pb^ovGJp zdEm@%TE3u9vB-Z~e!u^Nu+y&?Mz-|Xs;rNB`Mx6F^St|Qmxt$i3!9hUU)W!VOc|Y~ zdXp+_9-k@f%9ldE*|_j%uCTd(*9yDVRo_v*pO(1^|MBZz17Y*|sFARF{QJV@*IT8( zHoVkvxa0b{LqxpWb>F9LAFmxQ>@{O_Hy7_oSNd=AdAG-HW6bM`))#{PS_JM_iTZ81 z*6H}h&|ijI*-C%o^;6cb{Cq`=^bN;q`*hy?M~sy{QP{uv2Oi!2@_032^Xs9Hut!}B zboC8-q^#$zUz@o+r(kV+5x?e=q4)MpUw07p#G75d%PHHnRM`0ep=tX)SF9Fxz|ER7 zoWqyo3%lyI_JJFJS+1Oq;kR60bPnD8xmEl+VJ8LYzS+2Ug>wJW^m6EZ$BTa{_b`jKq-~C*d`<;fTHW4;IpL{z6@7b{ReSwHSJwnxFQM=1(VK-H&BCli z_uk*fi}=4v4Lv${{oYg92d*dnvp?}SWxaCZ*31X{j;(MN@l9@a8oI-9@jva4FSWPX zUj3#L&u!)Ued>~bYRfiPmGxonZC#=B!ta#%L09TlyzT4t`Blq^TvX$et8{J@`%ZWFGM10s4k2ZB$^Pg&n@3UGDVp1fD_mtSaNaNFlUPZjOq_os=% zF1t8mSm)}WDc8r}u8&nO@;ax?C)|z`^GB`GGk^0olqlu%`Aiv~QfZghjn|bb^Fx(O z-Dd7M_m|QidH+`WFVC;^-{Ny!&TZIvTA42@->mJQty!VW7gd83-H(*Knk4Ga^J|37 z_g`YIY-POh<16jgUY+q}y;ol;<2B%ldsMG6#(5$?w+{-t!Ic@d*@sH62%GOW+!gl0 zK-a%E4qB}h_Gx_4WJ65ZWMLolpK-Eo{S;+=%j2^}{L34@U0d3Jl_Tsh|G?&{Aq$lI zhpX2;ygDa7Q~JY#>)o!p)G;a7)5IG+682X=q|Ar>{!W>{xWAP7OBx$mvs3R=%KXLc zuf*|vg6lqAeD`=4Ve{*O;y*rrDedF;V@mtDt@OX>5M7yL`qpWpye{YcceN;5FO_!FZ?z3>=w zRJoseI$Zl`(N2@I7*BlvNtqAN-|lg$bNX_{|0hcmyVZTT@_SLLL?pD?}r8jjy?zFv+K@pnQ(t2bU)uwB>(0)lJQJGOX-uro?StEcTb zqs;$)!5$+w6#t{l|1U~AR`W=|*r?$PK9Ma8w<+m)yqm~BZFubty_Zu^gni;l=zGrJoOvzmD!00YvMz%Ni}LvVvqISC$4og~>Bh;eR<^Q!S`zC1I%mk8VG6@NvH z>Uh?}D@8BT^YN+l&!p?Vt@k_JO%U%LCu-^)hHwle?m z{oJ{tJU)Ju`ttSlWf9*ssEbYA`lproi^pFT@z<{O7_v`$MVZg8l-7Kcrv6@;&v<%e z{l)iFs)_tH&rg}uB4vGbVJ|r!Sl#3C@5+3a5ukhNeD{{pKY6@T-bdFGzjA!GLz$1x z2LxYQ9h7`glox%@e_P!(8Cwp1h?+H8e`jk6qADFlP(Suw!UQSiX(1Y8Vb8rkSck<<~w&`pT6khc(~1yM#ARt%Jt#YwFdj@6)ok_ z|JPy|-t+Ew0PiD%MtB`LXYrnLUmP4{2vmlcp5s)CrKuA{z{WU#e zCwV|xL+V2UA^jjNA$1_rAQK>3$Vi9^;sCznuaZQy_LHP!2QU|; z`St`z^Xz?4USHTq$t8~X{w|1Mi$5ocE~h>Sr`t+=Vl$b_!=7ZaJ(vi}<${%9Zvs(_ zR1DHO?+OT5{5eRau*wlm>jK>SCewWG3DP{-1*G{~1p*d-_$CajXoQ~xQJG|mNT@dW z51$76kMP2O38(g+_?Pg?XjmD)hc+Jr-;6{!K1XBq$HHYNSBPQZu5Wc27Vh~U;XeNn z?)M+zs{aTN`;Tz#e}pIhM|kdkgy;W9c;SD97yn0i$$x~G{YQ8?!i^rzQY*g3BbOI8 zcBan|DSu0vI!n>i8O7iG&QhV!!9v*R&&prf2e2)Ur)^uY{3YHM^J{&arG6Iqlksmq z;&YP9Ur{?}>Q~BNSSM%cAH|ZSu+Gj>hK22lm;QuqfyBI1_uTVpyq@@s9H5U1}9d=V03+LGh@s2k{YY3N%<$6-g{8P%BJ-6C(j39 zqHN*&9oWDHjxGT&c z{~;*A=E8;6-{m)Bc3__&HWyY+-|K_IM+_d;?~@S$Hs{`aGJA-dcX)y!TB}Kz5EJJW z6|aj8H|X0&8)7v!Uw+wcUYq)s(Xnd1K74{&#J_2`xKf4q_$g}Llo<6?p8sl#4OQz{ z=GUpCc-|vfos8{kSB#s?v(0b6*1LgaltC9Br`N{o3_QV}aHFb1wQ*Q|One-V{(elx zU{{O$Ecnpt!Fe%G-VxEUZ6ox0o8oQmvu8H+j);$oikaXQ9vP`a+q|N}V`DT)EW`XC zyiC1oDk(IEsE#Zm=h(2+q}mn{@o^$g&V|9Lz3W&+>9yezYM$-%z;s(TbKKPMBz=6G zAzsU)uUAR&s;5N9>0=_|HSq~L7CY|;&opn#*r{sW`0$8HEH?A3yJ=EgC9hT+k)YGZ z^Q@-t-O`7cvud^KaQIWyD*KNK#x|B&C#jRP;gPId)8$ChEOT=b4DnNS;k>??>D5dF zm5fvui?*5;`sLI#N2;U4r^G02$yqZhqgM@4+wp3Rh8-;{B_w^K;#UffpCY0*518NI zqCAa8Z%EQ`$7bd9$qrN;OZg1p`bp!%dHb_g)y?!#&f|DZOq}rAv6&ejietvdYa%On z{BJwcK&8}(=x|+xCS0!k*pY6A1& z{3Z2rnwzU7_aI*Eyi46OqAa3fW5eV4dCt2rHqA0utQN=QUEon*`bcwCJ@^&h% zRudBuZuVW)cQuVQ8@!cnd`x5vYe)9hk1{7Te>;H=V@+*PM{2|M27Z>Z_qWS+X!KUn z3f(e$agcG=+x3djU_M|i<%dmIrS|fCtE@Ve-o2DzZ(ZolDYt#|Z@$871Hykr0tH?+(b!Faj%xPdQI(`DV8Z(<-EIBexO*M8` zralczVD>}C7n5@~_Xmifr_tjPHfcl>SE#y%9+W0-Xy1wQn*$ZpP1xD%TbmyZ$)h0SjBxT7PGv? zb!+Fxi(Qlx%MwJ!@v)Yd=DKi^XpfAEgg zZo!qRDK<3g7^+NgI@A)2b$R4rw&i|anKyLaH07`?4J&(PwmKzRIjqhQ6%nuHXLsKB z4UC>jCOwvEV$h^N@4CW#;eYE=_=BIxO}P}Zs$x|@CokTjbW=cv)Kpvn%&BO_6D}_! z#M)$0z=EmD#l#|^xuSc!r1n-$wUUB0F!yBROedum!Xq)^8ZR1#<733kvf`j~N{lkI z@FY>1cs>wUlypjOX&p^-A3r;ry^L{6SK+y};kpl*5@__wHG@zj)I=2Iazf**agV@3<*{9y@dzS&8?9Fz93ISPYLCz@pXdQ3)l zbCobT;npqA5H*!oX-TGyv7g!J6pxYTg$tQjh%Q+@%lKYPrBNaUCOTYKy)Z|pCs?d! zmfUNY){hKo+$VDaI9VVSXq2HINhSdP;9~knzQ0`YJMBK?8ztD=1q`6E+*%f)kjp{ zTCG8~tg6qdjH_~{a<9tkoEkbUc6?aLt5ULqox=?KpX`F{PTO|1EwE{BlP&pSmxS*B z#r{9;?B%@#^RVH^#kB}mb6mOGv$`+8RyDncvKW=?j@m`);^d3ZS6pvKHLlI#`azjYMsH0W><5s zTfX6=OqU8Hiu{Be;*kF|O0Q|2M7X2%F?<=aeCNmvLxoOD*{8%$7C3dPIL;PKz< zHt3XlD{>UYV`Y(mD+e!$JATowsmm*NBuZ*gm4!PZSJ$o3(j7Qmu7mVo9{Bnc^L6nm-2DCa8A-H^F|3p8)A50Sp0`;W^jdWWzZ$bmsQrd#Sh%l z6Du6lpd2*CKGnTKRAM_mZ!G;XHgjl&RwBxLo|c~Mw(#Q$BPNj|hGyz()2RZbU+jN?0eE9b_f&#;Ko#bRFMaT%{hnmQ=8#q}-L zVr8{pm%GV)Pe_p#OZ3kNWd|xtbc+pxoPzqf;}nm}`^y@OrA*HK8X4ir*fZ!7u(@Qh z7yE2zYA1754N0-MU*euwnm2lLO=aNGoJn`DUQxRESTEc-vGcNEN!`r$N&zAfkDE6< zwZGEC5)4sY#2q+`&ppsMS5j&|HCz`L9~VJege*GeP-0rJ;woHQ##>BOIg2NzYn9W6 z$VjnP%s$@9SXJqqh%xWKWS{Mw`l0!NEDA%OZ=z;joRayG5}io?ui&fupJdLg#^)(k zMdK0s*-O;bDa?TNC>$3ZVN<-LL26mU2Ht9{Uv=10i-@4@c-(8oh!ymfFF(nw7ds9ua)h zY`);VU|2)tKrz~AOituzWrEoJtX6shHzfu3M8n}`?8vbyZ28M2r)`C3OmH~MJbG(h zV!CHt%iP%R61Ra{(|cxO(azlf7vW|(Rvj6iz-P6stK3Z3BNg$w2!6=3pJs>F7Qqw3 zb>lVSa9eJTOpj8UBd(<3DM z`BPI}#kq#~cwDoS%yZ@D*IuRpigPiIQuahqqx-$)sjBh1^5RxDT#2Rpnk+rr z4dDfC|F!!(EFY;c)N?9y%AJQ@jP5*Bg27@pZ%0m$$$=duQf&y2(TKv9j8E%PS1v3v zMvwKkfwpaUWWm+WDH_(mNb&Q{wl`CaZCqIfoE61iKX%H%MTjaD84qV+mw*?tdv${x zZ(fL=Z|d(_RoUdlQmbRft0NdpO-H8@7gTd+MhAuX194KodX=V85UTlqkv zA1{C|0xWdr-RW8VSiLcyS?u!`{vNU5Bjy}jF8I{E>q*1;-1AnOv<1h!E8x81024IWvgM1H-8o~7ecy`YH)^|=c&1Kco{L4# zR!-)g8xzv1vHD{2<*wLsd~{mldh!WFpdN|6^!Uk*Ps=-Zf0E(Hii+2&UI_TO9=Czmwmn$G#v zn_v&XtJ=1zO{*@fVqax^!Kq1XRN^UETSlm#GaqubA`W;uDnLxcA)Ar#SPf>am;+ z*GI(gyR2;sYNlbAQ+5?aRlL~j_@zZg0B;Dz%D-^)sba^r=DE#T7uF(<)pW=DUTJD^ zq$mS&C_9XWD{NDvSbx+e;8*AfF$3&MOH9YUpIn6m+%DkOl3#asmA+?m zc1@khW+%&ExOOgfp4XcPtML;qKes#onUr2#1ncln20wkqwi%J^*cD6PzBxXtI%}Uk zMx(K8-=2%1X?S*ooTA5r0}*QU-U*^}rnqJdWuC_@z^9>t;+Rwe&!CTPPwTy?SbiZd zI504+sgi*Y_JZ9rQwBF+M?eOo_oCA1!pW+=bB>oWfmfTh-LR9zBDVjnOKHKpEbqtB z))b4`G21O|sznxMlG>5(k~)A*Qu+ifb#0cRV0ELsaGoIvzvjkv;I-R%Wtho}RoQ$J zx95AL4`DSzY)1Vv~!RYJy&DEV1C(-}G9KMK6MJKWj0A&Bpt+?VKsxVqG-**M19{ zy6`|{fX$g3mEKh@xxx=JvtLK0;bA_pP@cW1ds;vhZ(1H=)I?9RIiB-jMtOs(B81Mi z^m01c$};ig^i;R%-nc?w>y(e$qV-dAYc%rKVylVnXd_}HX;%POL5m+lH!TP<{!1E6 zY_wWq?cQ`umD2O=a_9~j>3EuqX6fzUPE%pgwP|_O;@VB$st+zY*kz0`;QpPj5;mQx zo?ffLTM5mR$fjM><^|WWPQYri@pU&-OcNz8lC}x)>lC&HDsCxn`fcLEXmc63RN!`< zuL?Gu_gwOkyHW<-mteHhNL3oV@z?s9fle4Q@f+$ z{Alz%6g}k05BJLF$TV|g#a10W8=e+#5g8Y*)kllX*@Kr=*-g+eRxB@V!=MEXYk0F2 z<9PFa%;%3|G8($@@Q5jVhFX_7BV8{-Cx~12&tKW+B;qv5tIl}&R|hW)m>4`g8qXh1 z`}}76yv}YFlUN>YjcZ0H_{p*ae#pE|aK=hd<*o3@rk^sWY( zQ65$WP_*SEFrOcmG8>~eSX4k9KhMX6pAlG$+)I=z<=Wj|ra|?16rMMjpvKRg%8u6B z=OL>?(81**S**N?LqEZbr-;_xahi{(>@3o-v$FO`!soSW@^FkC^9fiOpQWqHB6!jb z-lm!Ly;Vbk1`ZxJu6I!2pm76w4;~Wa-=D=FNwrDCZ!(tg0YQEH_74bP@rVEEm)5g} zh#x#`a3Bv~)H!>!l8?eGmV0=IHmz9$%Y5Vf`v<5#85Y0~e0Y7$jIkaf!N-Hg1@!k1 z?(dIO!-M(W7}DX6_cLf>4%KK@Y=>pEPPucr&OY@r~Qo%Zzu8Z|55+GB1!S6j6`Q|t#%SEg?SI! zf8RE*5{4ZD@uMp{-2PWiDYY<=C@evlF7_L}cVclQhgNu~d*73wg`+T8AURee^izyi zq}aUKf3`~681zDmICX?M_R<97M61|HbL{QmMm)u4nHN88@+yAQDIMGR7IC6I2lSbJ ztH}{l_(HH~o=@ID9>mwuMY9{`)~QUXSaJLAzL)KTafIrJM%=?jxr?a%y8* z;5p?D9aiTf>!Y%;2sOvZPt|b`9l6#%d!#uMzf{CTDO>8r8(h-x6rjk7XOU=8#Y=tU zW3;Ppj*FK!r|5}A9{*>D^jVndczv+@5E&n<$J&cW|57#eJXZ%^=p+> zkAF?T@0wPXxB8C~L~~zuN$ZHd^;RW#drS4%j;yLv_Ms7b zPZlvTye(_K@iz9ij8V?}n!HM;E|`Xt((v;=cVYfZP3j=aOd6%?8G-5TsV9gk#G*Xx z3-M|c1e@$ED<3;4QmM$(@YE5O-iYPDMy{RHCmp}jn2V&9J}WQ($NCw*mgUj%fKQcc zO&%F`mUT4OBH!2KW?A6m1hGELe=s7g8l72DeVw{O{fkDL=w`qi9c!-tUtNq@~LbC|5qiVL{ax9swUH|9|lhn2-bE`MR0 z^l_rbQ)BSLiutXP{Bw+E zfW=$ffUes&AipIJ!y@EeN9-Q3Lf2i2UDOoUSBv>|-RI%+)o3v7P9mMfPcZ9$@3*Kw z9YMrs__phY-#nM~#N@9;;Cw2-N3K6JB4ZXN5OZW4f5D4iIyRJcS~AfhK@>WrT8E2; z_(gO5;n7($FiJ!TZ0|!nxV^qGB%3a6RUVK75kli%v{hD%c#l3(7%Re^u zsLvwM4>f8pLo`i9VzqeS+laj8E-XG4o5S20d&kVH#OjVNfpt1|`!Ja*4KE+Fpe?He z9^g?P^!{RQ)!ECODpO&sn4*17*^Ujo6XYKh*|Urle}?#MlTSuSEs?S32m=SKe)Z+;>nb+2Q(6IxNB4D;ibX={?wv9V+ojgy1{!iRtAKONHA zG_*=Ww+>zr{07Nr>XkP3-%=>kOWHw?^v2eQ!TX4`@69giC(p)ve)rM&8#*0Hs993By;do1j7!0DKX;%MiRFCmOu!t$E8`u7}qLu5=m{Tvso z6_4;6^BOJcYwbz%{F`#Eo2f<<>(btS$0+S?LfUj|XJNaSJj!}Z+HPB;yLBu14{51+ z{+Yd%-o(2^Tm(G=#xkegtGC3xnN>CL^b3Fd(&8zYw5=bdb+N8Ug~vEkulLXJx2_29 z)~Wfm((!h7#Z!R|wJ08+cC2UWH0#o7Br7ifq<%IjcY<}FsQ3eD%Ds=XXZ=f(#3Zbz zxw9T<(>vC)u7~JUsikewadT=_Oa9VD>gHaVgFLMw-`+z``=j|HJQ`N94BQ(jFTJLn z?wqB!Zfb>H`IKc*Id2!CkH%@|t+@I@ruc3T-K)R-=j<}c`Dk_L>LaS{sOnX9YZcEb zYbtwGp6hhOae(8|O1&y=c4+L7XJ5@e)y}~#$abSmE4%@aD&PO#;vWp6-~Q&-&i!#x_6MR#`XoKp!3pd*bMDm3Qi&{< z582Kw8E(Wr8#~Nf53hc9wMvFYoSVeAU3h0oo_AH2nI9*+@w}QY-czGvBJcvEcmiqm zlE9n^&fZD!3HTXU{P;RMxz>{2wYzoehj*(2=+g$?!?02tf?XA@Ipxea*_yS9k=|B-2W=K+1&cj?;E$E$0<4(+_!wd)71Py5bZK0dvD`gU#C zziZ#leLwXc9EY1d{FX=U@b;&NJp;q>gS?dYyIqR-xY^qi&byFz9(d=0cOH1>fp;Ew z=Ye+~c;|t49(d=0|Meb-vD<3vg)abj*yKu{bpJm%#YO(+-~ag9|9`$0U~B%FyuuR$ zcH&-HJP(L%Qss`=@&k+i>z($lg6}-=&I9i}@XiD8Jn+r~?>z9%1MfWW&I9i}@XiD8 zJn(<82OQ-0{VPiz(ja_+ZG3{EjVIoGlb^bwr|>=bvo%sR`Mm&1a^bX-YD%hvz`&87 zL3qx=bEy1TGQ2-fRpKua;)-X~n@XuVi1~v;Ani$-%Cgl_VtS3Ff zAo7s@|Mo}eERQMjz2iF%yz{_254`ihI}g0`z&j7T^T0a~yz{_254`ihI}g0`!2cc( zcwp0^niM3(NfA=K6f0>ZouroZ_)jfGqMFsDp;Ca<_g~{&UG1?2(YIfxW|9;aRKDw* znIjelZ+_KzuKmQh_CNnxsaI>ity6cGCTTwlkIQy9-Tfl^=Pi$p+qOv)!j=IRS&)cNI#-4|>8zUjMj zVZu(;X+Kr#wYx^w{o|!=(8SZH54U-_b>EQ(r|0jR=+Ja?a#YkW_uT%#KiFGyOMTl- z(_1~d_5JigQ|8@hcKmu`qnt56xw*C7;rCgCz~oA6=N%noxAje6)}JrC<)0l~HLsri z{1MxSJpL)J=g)Vybvm*9Y4OVCo%cPQ_+x|6$LA04G#%3%I;J^(_wKjNKELyMRK%#M zQ8(-FeXoC3-mt75E0e~5<<|d1*M?bN`VWZgJ^1t4t?IbWb?dfn`^^!%ZvEi)*Q`Og z59YN0&hhKx&;C&z{bHKk1(m6G#FiOrYWM!_>whj?^vK)t>S5w+sh?Z@n%l=}{@U~E z(2a{1PJOt>^;+LrkA@BNn_ly_RDbS`u=Wd6US#dMH9T;2B^#SxGY9+@wccru^NEYo zjhFhhtM9UMXtUV&c4nwr)p!27bF5-_a0i0-*f6~ z0sRajxgn>gAS#T;O4g;uS?3xmu1#|20fU1>FnsWvt|pmCSVPF2iZDV4#{2xtU#48;)`hZ1o))` zAfZS^1j^5TCTBu^Lpljy60tT^DsZHS1dO7vii5C(T0lTi7#e%Prb9ZV+R&@8O^KOo zwM~LCkYOmWb*xx`#XoBR!$P{Px8;lXpNcKVtuch!D3u{&nY3Op7ARAZ<&#{XfL4J) znLK_|I+Ik%&diCzEVYSY{QdTFWtN4}NNe&Dnt-DC$Q0--Z;w(_?ZOB}kLgvXlGC`k z%J`^O*n`vT!LZvsJkjV4qN8gN*_!sfWAeOxlK&XxTG|?yj7|tdtz8S$1e^u3TZ z9I*+aW4b(35+FAjwh!+YWJ;1__*5ly)qdJt-OD3O ziN*U!AaV}ehKnr`wT7hw!3!eiS@{ZXtp4<6|@ zg9sWgSCWbw=`{VEzSw1oo$P`gx=$n({ZW@cZudzK#n4VtUSUq7w`~^ZA>MIy&0#vjz8Ws`4rbqXG znsqYtGJ2<7e4lyiCZtJU7!ql>%#!piI{PS}_Luv(OnWu6(cAm>{PJHoGDoTryeP+o z+^)Bem)-gJRegGUwJiL0zkTWj!?K91C_>62ahKc2O!DDy2z>#{R==)}kK*IEeBNGF ziMm-v?IQc=_I+{fM19l4S$^#@`>4Nt9?ISSZ0wXtU8Encv2Sm;G9nTmXkQjNp~$gH zNY>jf;E;$*%#~kk1Zbt0JZ0^I4q3MZ7Y;%11oVXli+Q_{cGfsF4|fPSOHyk4l88z| zW+AuBIOMz@+}!fEzG!pN7Js`^LvDS6FD2W&`1m6FUb}!pyWM;DvD?Y>lG=hC$?XIV zX5#7$68xsltwddNA;;Um=5P%oc)9;9r&uhpJ9wCqmyngEQr-_7{Ou`w{Rq>Jhizjf znuAQioFjpNnZ=zXy-%|Sgo38Bv$3r=7D8YJ!SyC~8@ z3_Q6fGiS3#O4-mZk3OHmUwNd`tDFt-E-KN zT^fVk;-GW8{jK@Sp7WpDg9J?%h89Mo_}X04IQie&eLr`DV8gfRZ#rLCIJLdj`=Z!& zdN+9#@5w2?(P850*S<9NV@F*?OUHx{xfHChA3I}j6-BTBD#qYqJ@Gxue2pN=u--5B z5~-c0Nop1wD)xboP3G-7Jv)pMZ0E@B$SuinbcwwBJR?7{C+B2D%>95ei{}uAs|t&Q zbdTYc;xiiD`^j{2%TJstULvyPGIoDdewKGfgw769&ilqroizOr3O80f5bUF~pS()x zyd;S9)JvWmFBs@1{CahqdPEfBW?n%-Albu{@(oQA&SL7&VUcP(D8$he85#j=V{4{bt)1NDQ^`~nX&6WWIWFe(AB(ERUY zplYTyDjS+3Pa8l#rWPvPDjVeZrx#<gat~!=sBCbe|CZUeV;drkVb1;WTo=wp z?1&A_()?0~owa;GbLY<^Xa5Ci>qMvP6NIOPPbmnblR*@9Fr(ZNgdsmG+76s?XnZ`-r@DT{Ov+DOH)ulh|E`r0CAH>^$@EoM@ zDauxyxqNS%jF04HXB!yvJ`ebqu0s2~!=&C8$SKOen{Df7e@Lx_jN4?0TDq+|AD9a_U=Z32>RY_I+vgMu&UbEi<<- zRs6+TZU8dt2|?9JDi0$UjLdNT z?U^JRvC40`l>Q5JiD0+}P;m#IyoB#-2Z7b&!Sz^)U>`8@8jHe)9k=#^o<)TaK2Za6 zt8GmUSm%S!{nH_6pi*o*)@}g?(q)?wnkyN8MzpVvI#t-nWZR)-vUIk(HTLYV&3&2e zhk!Per zC*3ms=6=%d;ydy;dO@YlGRQR!l>#dJ?0U()l&?zqtn!k2ctXM?MU`S%9&HR*Swpha zat2uu4_R@Vv`TgM?5utH4BzM!fUp4K_8D8B%DNnC>9|6Ls5jwL6QX{*lt2{$3db%@ zap_@5nNAgas8~`=>qsoQ5p!=P@`GvLP5IKI23u;8zLG2L9RI9SAmO$^qqSjFy%e3d z2LoG1K#MHkE1DJKyibQA#y;a2`tIhjwhnga=_?D39^f$ow$SM8q!#+x)n9}xN)>%q z^JrcNWN5Slu=L!=OUoSBF@ORf9++g%;S+QA!hn&7FDatEPRXK+iU^kATQK~+m3$>r zU?!&i`Nilzmx@Umt%~hr9Bs<=x1}g}2J-_CdLa0^D48b+K`+?=Oh?a6Fv&@dUtgmP zPN8J=D%I89%%go3WzZZa{)r`M93b(exJZetAxqF~}iZ!|Wd=yokIr`3T zUp~?tZ-!lYlgrEo*V0((=xjt%v&+N-Zf@_Y^9SN}uqa9f7uCPzRhUms;s+O)_MRdDm0{)yd)Z=3rG!JoB(*UL;*h&^u1Nl&Akl+M08#RLw8656-1>;k&qKa z86PTc+tVl1YN6r09V1FP=Fh4h+aUe!&50M-2?uZw(*e;2M>B%gmK}3$z9|2CwzS80 z)+r;>MuAfZaqQYYj8u)c^$=JTi44$rs;o3yme-r2#Ur1AOI){(N*EY%z_8^@DAm|hm zW{yYVY%UCrVG(YkT-&HeSb|8HNWCOa4LQqUf&_^iw|#PqEAPLF~hM)-5}-ud0~CrbAbaIF7YtT2cm2>;~0brIWle; zY8$li0Tw6*sBepI2b$d6D|GWRqD;`-^;7PLj2f}+EYq{>czxkQay%UOAPS4!6bH}Y zST~kP`M6CLChnR;WyN`><_pAqP;0X7x9%^?O0@-7-4*pBGmCX= z_eCAtZOogyA_Y5TK9AUu5d??vTyoS6GiSwX8$^qrTBY*WD3cj{Y}YcQz%G*K?f0V) zgw7~vZ6=g~HA`vF+y?+F#PC_M$prm_U`bUVVyUufRvNy1s{Yt!M2Y7T&7OY=`N#5N{s!GU~Vm1;c!=08nMSj&55c+fN=fbY_$8i14rzQz~h5}w1 zpJhaSe-o?^;$i>a`30Xe(s>L;#`_YyKo^ z_$@o;%4~i=Pk#CRC0|dgMm*F<>s>F=QC?*4(vU(loqMGj9!8z}*yRrVg2%j# zJ^2-TFsl09h!>OJo^Wk0-j%2l8490s#$Js&0Fd}f!$qw-kynNpehNXVVIl3 zh-K`X(n!`9Z+Wr2Tow?;WlKiD7Tb4%vx~1y^iHAeUKzZ! zs5G{*wU}-YPjgJad;!9jlSRL@+NjH2h=TMN%YsN37cbM2(@WR<^11t~!EsfWPky97 z+&t#?ovogxZn964zF}n@8O;PRlGTn!;->P~Hue)dbu3hD)zxpbQy~)7z}oY_4E+vY z-&;18J+>f50}S$WMETiBo`^_()jaaE35@tquhE_BzE>l$SO5G)5&!S=WyP49Qzmc8 z8L%+mzMPtGj$HY$nE#i&rFR~T6ZOyXm)N|;G)wmdgDO$_Wd!aleVJXn05l5x^4HD)IIkkUmw>hd?gF?1L!EY7nHp; zrqa=ljFUum^gKRao-p8jg%f^5LI+GfCKG(S%Xkqf?_5ldd+|8`F)%kdgR2Hi4Z&iV zcz@kJ1$%nmPAN<7eVxr417d{!PC2V&e~+88iNX$*t6jdLQ<&F$4&2Okr^=Ne|P2`@go`K$xBFD6AlGq zA9qchkQUXbVMr$Po#^lW1*Bx5h^_bl+eUYG9X-L<=dpQf0Eq>5G^#B;?6y-r7BQz% zP^u$d@hCZLFb;{oLO@vit<*1O`ePOgG8m#dfVX@F9s2wOK%aH=$^@Ik@urfYoX0m{ zXk#CAE=Y7Cxtby9%P^+is7kxP=27<$Vqcy>RV0LA>^NfH#Mm{c4&NZEQP^}G{{8-1 z60^GPhyasz@d+{VaK&N86WEay1P?g^{noCXzgk{_E1{dnd)iI&VnWimWSBcE3RkAP zrV9#TwS7xxZ7Zg$|E#o<+npi~>MrlmW2-Gcw(cE1N3h+^VFDvU2e?tDPc}^GJJT2D zYv4hCFQj8O_Q{T z4n!d3!+N(%-B{r(#5~ag%7TK=Iy)JBBF~)}VUF+MnD#_fp|A=Imwh_{@bCfS)UM?% zew1Cy@AhPkAM$LrN>Ua-eSqyoc_^fd;1Ad(RErtNW#N$4?ZeLRU^!%~)`b|2c176T zi;zXME!I`K`pa!lka-JG$4*n^+YDDepC`uCS%cvvQKQ=)CB( z%kI(_f7OTXb%nsxBx(UZ^;%87TD@YZ6<4EZ+6ZO5`Q?GX(aLU=N0TTq?*r2#+6*Nq zVyGct&z2DGGk8U?BVZLc^)B_7nAiU9)KNC(ZxMO$(f9%uO3HS){_AcCO26ymkdQ3v z*R_|3I-b3*Oa$o{!q@P4Hwi&W0$?h`Aj=O~al4l{4BXkY^te?%D~16O!&Qti18G?V z-E}GD14g*{Sz#{8rwa{^udxQlY4A-m>}XoEZa@flSJ{Ez#Aq}V70aV=>s*atn!JCo6qZs?&rd(t|)I78?^PK50w{3 zRlFa;u?J17BN&s&$V{a<#@Ok{MKb&=^_EdPVxx5zry%~E48pMf$U{DF9dYhAz=u5U zgW#4VuT2Lt+_kpSvr(%==cJ~I|H^DAFky2e_sk*t(`}-5W&5gSDV2FBo0zvZDyopa zc;9PWOm#&^oyB=`y3f}V+436X>|RSLbqTe_29dc^V90erm5K7E2`m_6Yj-OUwJwwG z&D0F#aW%49dRIj2ibc}re&jCF?amN~zj>_8esRrq^d?t0@fn`Rh{nT&_s&4KzPAYs z)TXL0&2{_cM%CFGZ%7)xo(<2@-H4T-W8er-L%@G7;Z&bk8Aruf*tLX)rPH1Xz#R|C zM5Nm_7;p%J;(N}7J^Qmz4UGDvgZVID(|CJdPj_e)thp;XkXsp!AU-u{+EcnF3Rc*j zTUNk!qC^=r!w#fTGZC-uCvK?>6zqNN*nQkEuT=PGqml4O_i+AE#q6$V7Mp zW|a`R`QtOBaH6N-m8G_7*4Q}M7=J#rr3-7>_3y-uJ*3q&oymWVrq}l_ zwRzR$dpm2?y82*#}|KP7iLC`bwk-_3|^Q!`!Xc89~gAk+L&}p5vmo+fm zTH`%9F*j~!5$&*kqG0U(dVcP!V;nTgn%y6>Wh~n4%WsgP{K)~A&IVzV{db?t`eOBF z@#WDUCxj+KHzeXzx$v8?Q@-z`arOTfn+1$v3ER6D#pm^;FkWKVJVIAm`-RVAzdKCt zRZ?*`A>KoX`oeLqolho;--4m)O4LUv>b~{l1%IIP_hC34Jj7-=TpiazKTsh}){YNt zthjdiR!>;1)?X<%!c#kD4P^A~zk0nL3MlO&D&2>z8voY7X9ZD=s%dq18Ap*lBUYx| zYm~+_a0Ce8~#Ah-`bJI!CaW?nHE(jXF4I z(td5nC^@SY@@mdx`D0udJAygwYM#T@4aW(Lp({Rbhw<(gqNL`h%}$n zG#wgiUw01~TlUo~56oVJ!ZXg*a^Cf$I@b5P=qNbIP^Df-p2K1`S=@R-cFqPrVLHVV zy{|tBU;(NFBLRqpj%%HSx}}v3;_i53akb1Xi2nCv*iKTFMDaXMcjZZu%2wmzu1Wu* ztb-%(*XyW-eyO*R^)spApdZGImZV;9Ts8f0GM5jc7yVX7+mu@*AS=hDSg|-LA>*96 zyV@tpNNj@Hc;mTzww=YPdRKL&A_{FXE*2uSg~gG#wG3NbwC71&PPSTS(OMxNyK4Kicg*g(1$$RsLnn(1h=zD+c>i+W@2O9o#YpuMv zR_r;mzlWa*_WTT>p3at)@JhY*eOA$PA?GX6^fWwW3CW-ruot^M--150Z4o}A_+tIy zL9WI#E@|(#*v}QpBlqicd6L@DKXXzuj3Fj`#)J9W-9uHaAzsJ)uj9LWa~r!|Mg?XT zFAy)zb;!E5L+4zz=;-vl2zI=1x~-x1bDfPMVd>vG8zE)oC%V2NPL_iS#)h(cnXh$N zPb(1jl?rdMQ`aC*HoO+y~Z_&jTA-492r#=Hp{1lr)Bf#=Ue&fOu#pd6Q!B za8SU3i07~Q8}=1|lVs}nF*XA1IDVb3P)lsc8aDYoKd4>SArgHM^B<&Vr^hpkCy1$ujFU`_iEh8$S<}>T&c7) zX{p39=hfdwxsG&i+bb;hVO&|cfuq^%MSk#G;U}??-^b2xbyhAUI$k(RzV62jIU_|zTaQ&C2T4M3S2lL@6nk?o4=%kP1w*)fY6zM1+lWu2?V{I_} zoi=O;^?b6c9-uA#A-a&`^Hh?lH1RKFp}$?Aa2pktQn$i<1qlH?uG#MFKOAR{MFV`L z3F~ccO`Y?w+od%WEp;`nxr`B9ggxl(rE59_4?`yefBZbMl7yHHxp=cYgOB?DmgT8(rD+@lZ5({R72X6QHopsx-e z3_rf;ZoN<$@6=EAR{vc78%I;_mPR@<;$@Z?=660c!?+k_*2cMh_0xNirk!`_&JlB$ z8;M?7*S>9K@M&+&_bqrMV7yXD=_t@?6{GkQ+oi@<=qOssnT{XA+y6VRHZqP4WDs&AgI zr}f5XweCbekEz@`j*&3sgMYsI-LXF=HmhN%Y?*!Hp3TjV+Y89mU4*3d*A;TRaCo=P zn}%|Y5!?ch#Kz3Vu4_|;JP3ToDwug;kB&Clp1yi!wPBwuTyb~4V3^!nh7YA~yC6w4lW)xJ?3^MB=iJk*0TVFLbp-*xMU~oWQs}3;QcMa=03j0w?>C_& zKR7$x@(%A!jN9lPaGZR5SFg?Pe}k5iJhKq1Xf`r#Un}Q&Qh!zPr$O~&DGjS3!zIa` zz@PDbV`CJ@jxpbtU)!16Z&|~2>SpfEbs1>yckRPz^Y^=&Whi|l)O73d;okY%B-YXU z$01^UfU{0Yi zsq~sAn>EfaoTM@H#>Uh^$3#D~_hTAV2TLe_ZNtoh2x<#8{AI_$n`=@L=5&6e3(NA> zr7;#&bHwOl#w=~KUyER)oRDX@#tL&fc`pyQPuc|OKLO*5ZM~QX)?RkFThad$$p%*O zVr!<(L5zsaw-R{%?1EI#7Vo+@%N#1-12>NFHE2%{ZFQIiGm294?ean#f6SbI7EZ-m zOJfuaH_!VRROaib{6&jXTFX`mznk&pleLxxdI@TfyF;Gb=Nqa$PEcV^vMwPr;blqHRgolasr7i zR^s+IELOA*fL7B%#S)Sk<+S!unl=wk{4YUhhmfSdShf1IYGTJWz4|@ug3UGiA1vg) zu|E@VtZXWb!2oPMj6yv$j)O;+q_{Ck3e&ZRY+F0!Swl2so>x%c4v=7+m|fd}j1=Mo zJ2CV)Faeziqzu&IwqvvnlK{rc;DJUJsFFel*B+^o-&lavKXMOoCw}w$5a0Fe3WTPJ zf(Z+W_wq*vDmI6O3Q~jW=O;0B?)h9UCyB_kembO}jskeVi9%Tn1mK~V1k#956apSv z)!P4!Q)y7CZPE@|V`b}ofap}Y;_2Z6W1f->zs%DQEuSRvD@? zJR^*o3fA>gofM!DBnl$?L+A)DOJxNJ<}i#(M|R6Zl4^j4(4a$$t@Vf?icmTmR0y@% zU0(n@d$6qmvAY;di_4F$l_Rz9rlxKgDv@MZ5@AXLmmLp1NgFsyddQDE({?50zf!FK z*wlh6h8iI5;RKmbyX-FC=qc{awfES^!DnW4lTd>{UJ9{C)9&2vksSq;?Sr;@DZ2Tf zhFt&^ScrsRK?E6$fDC|b2LhQwwFR?vfFmF=ChZ~N2%rmOXJH6~%cQMh`L~RKtOs?- z!B^1%8~Q>=x(c{v$PkPVO5lW;W~)7kQ*ko(yurRpTpiMd#u4- zAvX%EX%NWaa!J{rP0(~~n<&Rp+12sm$jvgws10F)V>1z*s*ka$Bzf#mmWj$&D{aT+ zLrV%xlKe@8sa-?Gsi_+){z}9S4g|9(AfYXvLslSxz6mubBmy%8ar(VHLMbbSTM>X9$R!6_*3qf`B|NFyXkCt%6j~$(l~6jpWZNu3 z&?V!(0J2XjU=A3`YI3x0h0~HPTr)F3v2oI+Vo$q*H?UW63`|XK%MfihFQE zC3RFXk|`ju-SKFk_Tq2uynWx8C~u&;hDh1RmuE;|(*Ab;f`6=i%m}B%ampx`ORvjJ zWphUar)}>Da-LSLRre`Y!`+BZ*vjdZnWX}&{uYBR7Y%!ygTkfbk|@{O#%9`P2EM>T zp$982#x3+EF>3!FH`Pk!*flqYIFSVF-z1p0&1zq_Y9;ah?Q1u#fWu_gDCsNEM7g5Y z7p1ifzo8nitOpivE#wQT!L%3*fU&pT9UW-~aU`9BNo*w&0AuM1ri5TTK{vatMXPtee27f9_J7%{0Y2n#o>?tS z8iKNcOHa)pW90rD`$umKC{>wa3w(WLTeuh@(``&Vo&!#0xr|z7NloP~TK3J{`J43$ z*Irmir@?kIl5qkyx4Yi`kJc%B>E%LZks)b2d_|_xk}2xt5=aUDi|vCQis=Tek+itZ z^IPs=7i_j61zt36ipyCd+0lz{Z@!Zsa3?!t!2%Q)``C+(Th==g#4@gZPp) z-4?0hC&@|f)`L!?+RTeazgERkGZIa3d9Uwu?BuD;ue~$$Ml~~oca8GRRi|$9blIYw zs*^97Z;5Mj#j-dnGj7|Z3jE_qw%}H1|{u;CXg>x8*;TzwCYsNIe z9xz47_kxC2pJ}yL;#leYn3l5e^$E)~StA?@K=ItIPU=JI9-FZO9uFQ4K(c^@8XL)@ zWZB{^6o|Y0q1^@i(b=IXah@qRuuFMv9Otaam>fa!V%*#6uzbIptvo{l1-kYQ&+d296wylG6l;VvrY@~OEO&_#%-rhE1} z)ioU5;Af#dGAXBbTR_WA$Uo*eoWljCPTh6L3aXLLmFxVtRrlxhl` zA5>JaUXRnjV|lZxDCNQ{+Po(*wTg5{!2zhX`|}=uLds)5v9uo`r0S0L(2Y!5!-Dds z7+G>ZNGZ3Me}h{x-WWY@kJ9q00FLMz(_XI=bY9$8AGO5W0P7l8qnB#-xLn_Qwg20H zy?HO8rW`mVGlum_1CoIm0hU8&>Z~>8NtImzcf>5f=1GSz5rkcn8Fn68Xl2Hz-B1$@ z(BW(GifJ-UhSGibjZ#O+N`}lZ$?xhh8rE|gb)6W#p#h~3)Xze+89v;7R^ac=4HCw| zVOBDccQ7eft{mCjKI)`;38fW*RGA?sV6RFQVk#SHLIRG4neq$I(Q_XCrXBe>21}5K zyaAi`L#|rvHLZEH1$n35&>rq^+ay&&a&lEbxzAb3MICs?5?xwaf4IO*RELOZDnN+_^a@1a1 zU|Carql#@Zdle#BNXXxBxa#i_#y=h)Kq!JtO7?zrw2kdq-Fw>`P7SDs6?8Y{(c#}(Bh$4MY~b`P_&WdPHoDP-@E zO=>UL)D-PYd?7+ih>b(epuO1b4d3E-N_S1FCHU+og=)Lle7h|YuJwWA7F3mbLM>YG z+=TZJn-Q-(!#;OP@kn`feq9=@J$NNAE1!6e#L`c6Za)ONO}sh2HQOA!*P+{4yDO}M zF9tSXYihvigN%?A+1T=e5EWsVkeYZF0IIx4Q*B#pGt*K*SC|Ak zmKN-xlN?df3meF;JHEHUy+kcM-NR^%8iFv7RpZgzUGJ;##Mp_JPGu>vb|uDda@(}M zo+5-br!^z3Uks;&(>K)ajYzgN3S3KcVtdEN7%RcNYrA5JZ&v2lMvI;syd8k+wOaUm z#bnEX*jZXST5V8wvp#%xV*t5C_5l?9qD%aHQSLp`pYz7X)J4E&8hX13E2?2C`<8oh zs>9nEm>0t|;qb2>n%da9lY=76d-T>I`GP76h}|m{i02`^)s*6(4i)r?b-AF2E$M+V zW+JYb*IJW?#oT8z89`}^l!t>TS67WD(S_Oq5ZzFJUekn?;XsEMMD+O=a}g@M{nNP3 zjqiS3sf&f*kXbUKR}2g$ueMnut~GAlFnqGoyN6ROv+D(26Jk?uJfKQP=>6 zfL{aYZU9X_;~@n!R-?JG!U17Um}6#r_j8{#UvtQO+8uB!p;)Hjv{MUD3;s|2OSA8GA!-O@?OiQi|rw7C4)*kTb;-T<^;|B_@SYC z^TJ3N*fO;cH1t)&5>kFr#c>NIzr6Z5QHV9XRps{l_X~;kt5YdEVbwc| zODery(r27F(#zA>U$1q;={pb8V~se5nn5oCNA=lkbv#yc2^8oE?CAAZDv88mf%W*p zp4KaLSE=?~vK9xm_){>0XCir^5EK80U*9a<1khtDKAMg{I<@^iC5! zQN{Zj-wyxI?rXmo&ffW&pNw9=_-o`0j%fa8U~605?-Fr}1Cdvf{0>_VK7gPt zh#WZyhzSW}094rO>W@_q3>fSZYlX(!P0%m=n}BEn>N6Fe4W%(AxuHhkLGBan zpl*rxKd}PCg$NJS3E2Ac+Aa!{ve(kW0wN4aK9XBh?n1wakwSAwZlS(?OppmHy1QGvU&-mPN3r)G8ui@M1+$t(ataJ zoUXDjbe`b3xw_^1;~A`Aq;rhwiIPxW8cQ=hrB0z z7c}EYL5`Hi)rjwU8dA^LLWbtZLAU?Gq)RL%4Jsvx2@f+9%;%-&#qU$CA6PN0u1cC# z4bx!AfX7u|Q#KYVb#G zw13trMtX#Hmz!r6D4Ye_dgczpLP+gINr;zRguMpL74LnxcJL^#=erInu1*SMW6_K< z!XiGLL6FWF%50h>#C5l%@;*(PD^*l^-E`I$=-!mkfsOkda^1>H!MZL0CtMs@-p|?P zg4Ec2rCw+@u^PK{>D34yRK>hDY-U1?K@pZ#9wCn%P@Z4fP9nOEu`;j3#>`#QVSk6o#qlr9+)UPAS)GZr!u@fIe1dH`iO4 zp=>@35`y)DXt1@9N{8No)vY#K1F2(`U<0P7Eblt@fn<|V8uC$6s0gu+5JHVzngB>R zMud7?YgiYJC?!c?r9zGn+odBuyf|OqqU=u2$G`D0B`ctss_a*_2LX3nMhSd=`#n+a z??)EMKiT%6ci9SoW%JRJ0w7hEPCf$WoF_Cpy`n-Jj+nvc`Np+)d9F5!l6!f%vA>-K zC1E5(lxc>}8})(=!o0M31qtY4YkR&Uyh}kuOP)#DKtqB@&aEKnBH?s}%5dNrofE@5 zYia$>c}^cTDO-mP0RFb4?MovldE$fhp_@N{njCqIFV5&-_bC}v$5C3&N(E}#ni-;Z zHIQr2#h6xa|2cw|mBePA#HN5jJ|O3aXwbZt1|_-c8l@T5ug@0RV?6Tk*Z9URK1a_4 zbrs9Z$d|hc7J#$E=w2sU6Pr-Y!Qsk)u0e%ge%&`VTVeAuvwuT}+3ZE=h3UF; z-MT}I(hXG8evmhStb`HKP3$)x;S$l2d1Vf~P1*cYObfv|O4fI0te?tqMYq=+1L z&8&W-RZXW%h_-0WFg1ZczmL*=}sT@L4R|DyL?j=bLaItAc z5xOIg-{2O4kxYVy=t~oGM)hTl8|rN*FvIlOpSU(b&o+dB<|;qCm=nY2e}D1R)9v6^ z$4G-e@I800g_iUW+=tjXFDdt~*QXL3V%Q~J+wt9%zz#c*gPmJ{p%pS5V&1ao=cvVd z`z1slwA&@cRZRIMaoEtBlKa-qIC)FY5zexOKg+$cF$GMUw!oFFe?RnJ{-U=1n(243 zz;nRf^2FX3pn-pj`Yy)KlF{}`sT(>WCb1yJG6$v|uTWT|Mpe8WWE^elp+si>{}y>@ z-8&9}ZQb)uuOAxiddC-#H|_49&@jK;(H}+XbO(FXHX;N`cOC^o3PZ3~QaLT!&}vC^ zQ#oI%75l0?O;9}WJ|D+q^QUpadg2TxN>zs8@I>y@;_v@5I1mqJQacmgPs>R&Y zef-Q5&L-fE=hRLv6Jv@Ba5x(_2(cUp6DTL~S+(F7-X4=-0OrsramU^9!NeI2!#At2 z+#|Qve=gC0Koq#!D%l_L4E>NK<5tKq7!NgSpg{+IN`O(jQONW@Fgxz*hC%_sYF!n+ z({pFg#!k`ZE%o?o()3*_wh088y*#yKL)Xrc#`nAX-y%GSd64H@W*E8;TzK+Q|3dUfB6A7x-+b|)LF4yP@3~O3jko^c zOn_izhMk{ApCOF8$a~r}3|-*Kh1=Z3D17RCSR0RJuHi83;KFtm)=kD6P}=6l&(aUU zi8e|x{=8)>sA4B+?FRP|Ni%Zk6%uFfwNR>#J@}pu40p9PM?rhoOH+6f3t@FgIG!R#hE@LDm@@P{D7%IZ5bK}TtD3gD!neB@`DYcVEQ^1+WZS}TY`!2f1=BHB4C5r4 zHAE0TKgU_4Ls8v7n8-SN8D7ixu^(Amz7vLq)A*8Ec49|r#awBt>F+%fRo=r*ywnW+~5hA zoa7@fH*eV}1Ufxcpcn1;Vu{$W>n!ZQ*|Ym0;eZ_rbE(u&WyAe6j5nU@nhrRAUuey= z?aUgc2JG$Cg4*@5K6$Wq=##Xl4?^~jMB=(&(mb)a*yS+2zVH5h3Vrk$!}PI&kM1tNH6KmWJeK>CI(U?OpbR-~@j9>(0CNY^XG zjb-yNH!W^N9O2%W?{ql?EqXn_C=5`Xe{Xj}0vLI^N4u^)sWCijZYKew`&N4=*~m3W zfj;Pl23TZ`hvd9M8_uXGXnI~Ex1xTLTtGbG0v1@>L@NS|@$#)gFc&fpF>^4TnA1JxZAHt{3v;>*aQ_*!H1W-TQf=f-NdayGP)u_}P*TYh|V@g-J zvR+5+P2!#v1ga(KVIhx>{yQuiK@oaIC2hjIp^Pf(tqX|o350WJ8QHeyHry|HCY&-E zE~rJD@m8{xk>yPLctnH3tMUUn&N#){Pkyy=bjA9uKuH4@{`?uT_VhbaZPQom!3!|g zaai)-Lq|FU3ydAY8R3zi4Bcq@KRt0^?Tk03=yRTD(~lw|(=+@?FJnbbWVqGoq~@~S z49j3>IWT}==DdMVQMt2-7}7;`D>gE-*zg1J^B*Q7#}W?m&TD%e;Zcvy*ktpgqN>de ze%|_Rk73Wu`JZpt-g1zIdRh=T1Pd>O)o`v1JA5M7A2~pRRGf9be;gK7XsZiJiCrX!6H{$|m% zC`3F=6B-|ja)DwPkapLqw-jrB@>Z+PnnoJ0_VhU(yX4z|ibaHmE|N?FcUMauKz*3r zWj=o@0p}$!WVx^)-aW+})Me=Tc21X_x7R8EP^?$ziQ6^LO67c@_*6uZJJUZGCi{|p zhX?)RXzLYqqAO z)!uVBCF8&{k9Et@j0pJ!pmKWmi!f3!dz< z2aSGYj*&ylte<_m zw1dmR&garGPPZCDH~Ks8Tp^?eUmQs6yy{FfFI{~2-nX(`ClGHn@R&Guh|K?^$%#cZ zuwCqUh4vasnP7va`I3Tj-2pt`&Q_u}8X7YyvZuDdXqZsNdx|jLJ@^g6fCwbiW2o;f zmqa)KW)W*0dfETf6a4CTq)VieJ1$YOZX*6?nL#69bQ)L;_`$AznBqHLt;^bZ?jmf} z2>+7$hhVyO`vI#-KZY^#DyBc4m#boz;R8YYn(agY7hlvd*=&_r(b{E~yRnI_;P!%t z=*BBqz%c(GVLL?sD_@RJqOaVfp$1(LFTdYw>#>epC5|CN<6J12&e=XRg8d@vq2gC$ zUPow;pFfbW9ef0&oP>mQq`rHk>rEbJY&mNL7FvV#yYC$g2lakbUai+@yd}{ z@Quy_{jEwa$l&(mtFmVr)`)ke&ViiNv>YPeKgDcVX?M?sOYuox1RUsz3kT;} z@uDA#ZaA}}z5fl5(Fms-R5IGbb@V~Z{q&54i0PX{6+H#uu&>}|1LFHAydsF6KL`$x z%FO13IqR&Pzcpel=DqpyVV|Og476;#m?pjjaoom#HD`UZ;dw(%U#8HZ{?Oyl>b%h} zz#1ICY&qDM&j~%}8ePu#RKT0pEX2@(}>YP*}|Y0Fps`%&y+VVwr`J#KhvBx$!M$ zz6U%KGd;xS-S?(7kKI6r*mSQ9Qb2WzV+BY9Qmoi@fF3|()vE#(AYoZnJ{3aHUy|yo zFd^9_)zu*#{=h)^t8MDD?qJve0A@z+hzh{>tN-5i^XBg6?mSs@xg5)vmNXvbhHhhU zQs5g16;c|d6(BB9N5pW4bnhf(_)KUMq?;xaNC8%j!B~JmLNX6YcQQR!*Pf(SYI!IaFawH*K}luO*isRBw#KTq;9Ax)@K6k}zF;?0b-#F&hJ>tY^BL4UaRh8ZTZnG^IWeiWIO` zW_$92Ft>>cwhcJ;MoUoK?_2IdGttZ4mLj9pXmgylH8Kc7ZfE8zw9xG?&Zc42mhhb( zK(f#<w;uZJ)CW;GNJ>CzoG{AFU5D*-X`I2udlxg2J&eFn&fEE+uT)@=-BQEg;2M(txU zDrj+Yu&4^Z%wQ-+X=!O-<%cJLFmb(bYHV$LS97fy)a%u!=69xLMdj1}4Zx__pe@h` zo729Y3&2EC4nr>_9m0Ba2(ue)gU=nc4dr~|?ODxn3nGpG*0h~gGa8|e!$k zKP9NQA1{dmR0%7&HNY=C3F{51rN;m%TnV*8we4t>mF=@e+QKX}+_5o1(6?vTFbC!Q zp5?sHm5tHpUXR0bZh&P5w;vYZKoU~zX;rNzP12I^N7MD903x(D%!YZUKV}ECH5;I_ zHH=aYr>0>++QlhS(jDKm{hw)mxOxMSRDeOd*8yJ})KDFvRfF7JvB?z6wSLzEMERdZ z-&{-be{h5V&W&+=0^JoO998W)Ng(df)cNWxv8E=im%(1vYzvh0^cbwKP6nC*zMEJl zd#Yk)o*$5X`6h;)lT?eP>IFXAM7}zET?ZjFK)Yf=0mnb`gUC2Yo3K1X&nyP_<~=i3 z$z=}~xT=L}nI2MZnS!>AY87mN{TJqc0zZA=Dw$CC&2EA$fL!?hZ<4!o!MW;MTnbZ< z)~(ce;7?N0y6$m7@hZ8^PEEkbnm%Aub&;VWhE(2zTGg*Cwp6R?G%U!04Fe`IkJ_vF z2VDHF;T8FpZyNo|kq(ChINTV}yRh}I?h#3wj`HrE(Gzx&xC8;so1KZ{hGI19=&y?m zhVm3_N5)WEsQkikh!EVR_5)ZL!r}t=^1z znR>!d%Q@(B+d25-ro2MOa}_!vDem!XbKc|L)Eu0M>iy{)f)Q?lBV&j6KVYa#-f*ST z_BRU-qwmqqn#*+~{++q-{ea{5SdoPO*|coMYVcjkG)6OZXiT=GMIS-e7_$W{=Z?A{ zg)`qKVgJGPm>*`EkG+8y<5WQHR3Sm`{FZKR9UT7neFSX3qqv2v<1SJ@Q*3168fNvp zHE(rhxK>}NS3mRyrlq@>S^)=!2kQS)3Ukz60=?#YTO_cT(Lxp(BAEO1mjkX$QkZiU z!OqvV;fRhsKEeP*LT*@n*DmpU)WQu6#4$~$y@02N5QIE4p}?~i`NJ-#dYDZqhse)r zx`^?@e9g?YF*_Ta!ctekA6nV3K7-QDd!E>ZX`>~s7adgA8Crj~g*bG9~gAjyqiaxcG#c5q zcJ($E(5Kb(qdfT+w{n$)+!Lpj5#$tzIuQ$BoKfX^XGvGiOO?YYMBl)yDAR9(nLrX& zL(SGHyw{;zb3-SRip->8hnl9 zsfKA3uwpHTCls&Wq!jfoNdmdT$Sqh{DR#ym#K8Z4=%aG2ao(^iGA$M-w2tlSVQOdk zV(baecm|jt!dz=ITgM2i-*o%$!YbY3M}fFJN2#V*E9+Zkp2Hg8bbr3Pdl{=?W>xfomBU@Y2Z1c_)2KY$B~6XrV~DUkm|7AQ7|`9joWQXtY*>Q}WI`v~f> z!%B7uow0|U)3)LoE>J&HBU$B$1U?d= z<3rM-hX6@^m`x_IiuH!T=Vq!;%(Ix*Qe~@2oi*Cj8<`l*5$ou!c&PG{d7ny@Cu8 zNzxo3;%Q!?C+1!TE`9ja`k?^#!YwG6UpRFjjr!KH$xn>-#o{nqTF0+Qs+i`Caigo) zF?w@T)O+KPi-$gW-q7-HL?Lq$zq8&I-h;8!!~g79!%n+=xno;4@lL?vgi#5|ZaGiU7;4pQ5q#nAzNrq_Qq=e;LEbBir%*9Ui^!zAECkJ2)YZf{^@W z9ACx?P>ngJaRPqwgC?ArjgI{w!belL8DuSM%cttj`W9By@$^<5R;-)6n0_WWsh&UE z^teESwRV6@LpOj3;waSp)o);H3pVz4aVC}bV<`zYGBQ!*PSR6-PphSCLGQ`CE)-kg zo@qHcG65jQev;NCkJBEGsRgTZ^wOx3)~G z@yUqb|4*+=gH=znE-!aRlYVbg369snJvl)`m`l694@XVVId*IpZAN<&8UK)O<$lc| zuE#Q+Zwr0E*&&bLJwDvUb&)j32^}X!NxSlKi=4*LuBL4R{w5{^gc=`pSzLrjTV0I9 zK65{ePU9Qruc$X%;~7?W2g2DZ@@i9|!1&p9ZWk#T;XMPdTs068jwBej5SY*yAEzQp zZN(W5aWbZQ-~!^&Sfqw;>^BWXNQ27$_ckb*r!-j# zba4VP+IE;h7ZSVUf=u0rrkRa285b~qMl3Kji96|_NX(kv z>Hg4_V{(%Rq`Cng%nLp70I36|y=V-KO)dvyK+*igfWAmqSRbSq8=kcjBix1nk^Ccr zKx7Dpi!mANyHTUUU6{+vP@*A#G=&W^2iN&`XE+GD8pot zby<)!DyNv7Z=o+2ufOL6%)My~rY|I8eytB{Z6@D73V;~Z74s;##G$uQnhuHJ@>#;DfSp%?MZ=uP3 zPUj*DDX_vt-(V-f00l6V`T$MqyH^^-s-{*p|BB8(SHKNHHi#&aqi2t&g^q{DT6@ZR zDJ&q<tfwlK8BCN_KVE&}ga3bY zjkOCFdLQG9aGWCz5$Hf92wf-KdL&$!_i~)`r#aoFP0m?;YkFM}Kxl*hv zoeH*Z23r7;MnQcnz5`&(bx;z`>N*PF7-dNXl0AE?O7;ap<+HFi>gF<}tSBse)BjV{ z#)C%6&XwoVr6*WniRe!fHbEeFX*rhDn84YijhRx6ekad|LwDHY=|N&)%(qj``yIX? ziROOKoWW_1XK5y9_g0y(M>w5dV8!pHA>7j%@5O73xb&5BR>T zWtld>Dr}eKGVhf_sa2U*$vDrM0mvZE{+{7W-Ir`X?cPJJ(8s-*`0gW7dhhEU-nbt`6x^;d^8ow~Gx%gpgvlzf`kM zifE3u(c;SEkr6oglB5bf(_OK|ldt`kxi)j>tP7rEqL(Z!=*|vXgP^nLOA<%TylmT{ z9U&6Cs2$k;!chOrTxKL|gFKDbZugJwolx9_{*kEPDL?t3V$jyCE#1~%8<&zPl|vAC zW5u3{IDjzJFZAhGt99zrJ%B;qgnGLx1-&l;FaRDRf5(r#y?A7>VnP~z^VJwTQ0ml* zNIg2?;`g=fDe6TLa(4SZ9LSEz)%5ykwS4Gpe#T$DX!jJ20_02u$xv@zy|id;}tgdB>Ks|cb#*FDSn6DUNa zfJ{U7V6MuwX^9yUGLaQSrF4A;Sljqgm{Xvt71W<_b=uE|Y=_%?lumt zC$~HWpS}~lOuPWz2qh-(AanO_)O17?FgTgKw^`7)apnf6%JnxRY&e{DS=ri=Re}BB zU5WenOB9&2F`sQk-lc`Q!gh_sLrNKb6|W`ajH&nvd;mjQYII z;@PgA;SO=y`SgDNttgPJa?oA3_o82#2Qx2jHW}4dr#~hvUFAdLy$KFs82@~vwReV| za|AhT!C5v|&VSQ4-@#j7WQg&rx83KFPcGtvQMD04WXW%B;(obv9#662sM@Wcj7Ji3 zC1XAo9RA(jYLq;4d%-orN``m@h`jUjK`&u4hS1MwmBx)go_3qmj}8Xr41{c_01Tg= z-j{b?LxE{|{IR5-eD()-kfhdLMEcEPqabM5?sS+1Hz{9=QJb?kQAF^G+HoapFm*ec z_o|?e(;mUBmP=n( zwN}KWIXl7A^svn2>=AW;tI%nG8bHT;jesbxA{$b=)d+P*4Qk_s-!rn+%&WV|11=#z zxx2}prDHR?+4XS^D8^6L?Wj7L#g_WsPL1`G`TGo}go^(|XKP;gHOgqPF@#Fl5G958ja zd)Sf|gEypwobv{GoJD2|G$RydFt;e^n^n{J>iYLwHAZ;6 z6c$4DSp8!^d=#dMPDI-~ZE90foRF;%=YssRQ{s?u<2#6PFOw~3a)3ah%IHg{>NWe45nQe`Q zc$9D*aSP>dmcHl%)Yy~aYBWOPWqlOY%wOMkbH-^CM$Lh@Abbsqq%BuC6$EVTWE&7i z$h<&%J;kzN^RyN|;XtwQE4B49vJlB_#1OC^hrhL^AKo;_MZ z+eJxEh-Uu=3HPO~-5}zQ?_4axJAypB)oPw25kRoTb#IzdO2B{BUl&pR zu82kZPj?Qpj5+bt>VDk@s=b#E*b#~8QzGup>;_5fJ8!*N>o z@!aB!aSr;#rgLr$Xp-eO=oXzK1y)LNF4CF$i@)bt0fDQ~96w)@&QTl9*F&~jQi;I8 zCFzMAvD$=D_wvr_SSDWI-Aw`Nb-ni=mPP&$ zB)5+m#W(3UB+j41nNcZ{r91YI^5iRNceqOW3$VY3&cHy#9ku zKrb6KwexXfZr!wF)E_j4%l&Wuz!=%?=XQVE{R>Va45ib4PTrN9#Yhg+1 zq2Xumv+5EKC+?4Y>)@abk9&V}sfU6PW#wyyL%|sh?q*9|HPwT5yn6_t&N;fFXd_@w0DYMkX?RQ@0zRayCu zbNUVo7jEGzX|Fd$38YE)OTy!c&=lTmrSeJPNB#VjLw3Y1dryCF`fuq?3*Z=);aN>f z_e)MGMJXkw%xE9@o(C6dL;c0IvwyYAbhYa9KuHc&G$)ilf%UP~SH9@`MKig5FS2H) zsT(|zmXmc|ZsY+!zl-@O?6>=ppE44_V|jR8w%qJ;c{|6;$$5Qt!q@$1&k)aS=F(TLrVAwO2o59ycB~4vFDIHDdmZgQqXk2(anb&wgyb#lc+-ZlT`PJT*zi$ zIBgtTZd1Ld+_buuzt?^VrlJ(Yj(DH)KVQo_zB67)uh&6L;(K2@Cl8;_6>GA4C;X>3 zQ+;s}^hg!{qF6S7N&M29E%G%F9Z|Rp^#$yH8WAj5SqX%aD8jhW^A=8}Vyt7`rmTTSw*|ONsh6^7xm>P8HprWgKXN56MJmKvT~VZo|(XAgPCb4O4V4 zghtS9dYo63J@Cttp&=O=l9C}I85xq2At4zVl9C}I86T2Q*&WC%$leK)S%2sGNxJ`E zdu;mCaWMWy4L|#)l1%|cKBYclKL_;#h9{cQwj0N(4$bZEcza79^~%Xr8Oidl6685Y zju30x{$c*aYmy$f1-hGcIfEy0!XD!~Ryg{KBW74ER&L2ZrLT7k{2PNnUK4*ZY%A9p znVj?!c158-bxYB-cG#W6R@z~m;Y#PVePw+c&8Yc8IzOK9&XaFlnMqW{(G}UVG=Gg` zmdD>oX&3Ehe%E~XEbeEj%;!4>hB+xjI^ge;Yk!C40R?_4Cpa1n;-xG+ZSACj-#lSD zyvN9=lFy8hB|7}uM>11)1_jhlEaxWDcJi?Gdng%VPfD@E^$VpKm+ngUL8TN2{c6}P z@0mG4{{?(2lZO8PP{3avCFRYn*;n!{L(M4emtuTVuy?(tkK>0tcMliK&vV1KlgE)K zeepn>9(w8t_aW~*u79;L=IAp5YvQE9ej)(|CIbShc#=CLz+ZgMqj;*+pyKWKx5b)o zWIN0HhPbnfZ-zVV_q#!6ve=k)DwXLUGn;6%Nj#Ct2$e4UQ$B|Gs*UT{m+oFJ(hp2F z;jfQk)shMooSKrkVmpc?&qPDUzBGv_4{m@dw->4#yr*@PI3u)sqN|p+9IFVOvM5;S zC5Eqg`OUXdKvi_bW6vTY7$isA(S|hfeWW1g@AP8_hQ6Xst#E9W-8m;#icQMuNOLR3 zg$46LHGJe}?~@q5f?BYj#SN85YFIN0jOlz@&Y=>UE8bi(cIR7ohNbgfIOd#{hP=~X z_+~lo_~&x1&Zjf-VY&I04c(iF(QZ5HFIwi!w|cYkuRA3q&u6yWjc%dVE}$3jp_X4C z@k2rQ>7VUj&}6p4#(*kKrZ=bvRz>@spYRzY>JGj2jpSr%9#63-E33rg5UG}^^e2|4 zm|{NPF?>+IKh=_3Kc%`VZBI-B&ylvQOHRBLy6J4Y$~uOHCsrBU7;mjG6HlecHiL}; z3!^cz1#aF7R1FfSYlZI6nf4B1{y3^sxXU2a&J?Cb0(7V7Af&_3I3#<&I1PBc!LYu0 zv?;+=62pkZetGC~t(Tgvd=1gbyZ!aQ3_OBNgfE2RXRSCtfh$=041FCk@DdOst)`K_ZY+koWSsAEcAhiWtN)H)s0M^tHKd{|0r&0FtL`Vd;Trm`VdiGXlwc@SD`&_UvY;0a_1_JcW>V- z^OG$<9Fw$Z-_UAQJLGoSwWrgcbj=i)to3S_W+rNj^w(B0(Za-k98;a}?^^qe-532q zuLJ3#)OGcs;Q!gbW_A|5FEnK&4 z-iC3^(QMJMx0#&tI2=jD^+X;=wIp~EX7-4IR=z&powF^)t@pf^cHy37sQH1T$9ODH zX~*6HRE*idY0*E>+19PkP_^qf)ssAW%C7?jSRlJu3|jzutrH&Ez#6D&m}KCsVKm03 zhfgQ_Or+tqo^}h-KWdg~XfX-Wv5wr!wnuA4XoWIgX)WVqyfUKpe)xdnvP=lGggP`z2Ki3iU(OnW%VKaX+uarZYHAybnz^ zIAg1D&$m4a1N~es|c6qlwFwa5Z*yH zEx2n@@~cITIon_?VNK+QqfT(S!A_W) zu#88YqedtQA?fY7og#LlF zF`8}EK~SSnJSJ^nuU)79H7!lEWPY}onf7s59B~4!?o;GxC&2jZQ2u8M^)S}N*oOe# z9&sdPNNsOQ0X)`?l~!u61uc35{04AkVFNg+F$gfD#zi|GQi}r7Y)y!Vd1xIbCpxv0 zXJedzf&s5Wr~KBjE0%Oj0P5zq6tyhV1HyFO|2Ddl{kTLD4Lrf#}sc{kgxZcAqK;_aayeWQ?wuV1{@;}HSsYFpz_DYb#tqS{>X8UpIM8sQ>qSjOWQ*xqvt7`3+VJ9O z)NRlhIww%=q|hSSL@p=Ecm87G3N@`RKR!_(<(eGVZLIGQp&0Oi!GT3~e<4t5u_t_b z!%j^qng;bS{0tfyJ``%Omm}S^2^W}LS4&VE2WAJ_0)h|q*Xuek51P42d_5}r62S{9 z#PCt>9*Gkc*{@9?;BQa~d+p_T3y^gKRDX?sUyZc;3^%I}bbGD?`O=Va%iO!ZFj!!d z6W*eyc-n0+&4H-bM`9CpMn!O0QOiY#QgvJP%zW&wGDpDALP_yVgTXv0%r$Vat)7PL8M;I6FRx0W zxs4}-zUwQ%Dy?j=u-bB+9k&KRXM?kb-v9?Ng9|7NUQfXoNW_QaE>tr|k__NnUQ(#8 zTV_e~e~6tHD(;|A{bYObV#1H$F#KA@t^E7&!fNqtP#8)gS3WIA9uEONGU<-dR&1-l z-5VPdan^9n<%rRr;F_S;>c_X1!(@yW$~f)!bPXL5DlAdO2ndv_?2!0EU#*gO&EP=O ztn%)vJqBwHijqw)uI8x`kqIXZ`KnX%kkP-Ra|p9U`=8J$>o0{&sy@n^NAcmyscSw? z*T*Pu*Zq<$CDLVR7%v2Un36NtMN4l2M5irSYH=VAeCCVCgq2(?Jlf7_!3;T@DNP_6 z9ouwRR|77XLzo~ixWT_|TKNX62KIp$$5%%IQ?+yqJp=yW>dENf8pl8k=>@OE5+qei198Aqu+F}_K<6sQxcneA^Efidw5M*(G9ME%0f z)06>PZbH5jDl|_j=p>mv)V01s)D|ub7ha05gAYRuS*SFlal$Pl zu0q!1{jc>IY@2vW6XA!7=?9N`PU4nT>cuQdV&8Nwuk7>FAX;tQF9r}gX2Sevtw*7I$iEwB#1;u$CWs3vE`L2Mt4nf}?TbSecqw8cr1jTWe(WE>qe$y9nKn zE~*%xFI<(AvG_-EgF5U4m~@n47> zxjO~ViwLx!s~M{_6=gQ+Px=awf^{UJIw@Su<2-s}JEUbHL-HrszZFNL!3i5^L+v0_JO4MPnggqG!%VTWOBKHKCWFO6X2m?+~d> zBQUI+c30+Bd%U}OciZ=O?pR`t=IQ!SfRX%+Bu6dhSOefYL&4|qYc9^uW7u4SMN4&v)>zjiQub4cVhv+-GQFLnhV7U<-;;g|jVJp`d=|am8op z{cxF&H5SK`3S5jyZ=dnd+ZP5QKXoJ5AOt zTCUfI&q&wb*NGmM#Ce7$AV?w*ANzn_u4Qj@1?!&W)$p`+hg73=Ux%f0IN0H$5a7#G z9?mxVUxpYdG`e@Vw|EES7)5n{@rbyRJLFNIBwKXBDTqMQAL+asj6E^b#r~geP#3L^ z<-!>q68%0W%i@hs5BARfr?-QGnlO`F0LP zvn8d`G)0MV@>Pjx>MS=k6B8{-y~mpX zmtTRmid(fnm0}FzgO2nlaz8&=iDH^g{GPs$ffy{IbbOUl6K&wdyjB($Y3uf*6}$SZeI~9F(Utxhd%C3zCkW6I6WgAGBd9g zgA+$rh=)wNC54d}5v!1eq-HXLx^R+V9+n8~7*zbzD4Q<56xPMHdqz#aWn?lOK!Pp# zZeu~88e|eXGR#fq&$FpMs}Qj4h!^J~EnFN&VvQ1i8eg5rE4AE{Dl zEk4%T55NTryJ*Q&4i4PAyDd`5<<~Cci`U|cq`korl+a94i$xX2q-TLkIOE%sroH52 z!CYz5ur1}3jtyh_#|qcVYYz(Xy+N1qq{jerH`f?G!m60~|J!k7{3F|CeY(ypui9DI)H8!Aju3)R!Vk+^E}0_Q7q<3|wy%Yj2udtlzjx&D zPC}X~MxShm=j7`&yOS?8i!#|p7Zydezm%)Kc%y93l$t>=)MO@)cErK=(c`JOpGRi8 z7263)%|rnpt2clNmY8*YpC-pnRa>j6sI|hs-CFHQusRs33hPC9kt9tDC#dg*&;eX$ zK}APh$8yWAT82qAgB)g+z*cnb_Bw3AUqX4nr_lAjOs+M?$eJY5|GpR?QYvThL6uks z=}kvJrJQ1C;Q~=2z6D1b`~u0QFJRL!g!DrS6mn+=k0ore!>mboz_yM}K6}9LAxY7m zYt2#%5YKC?yL@?H7+VJ}3C!EY5WX1pAZAAwVFL8?@p1i)(K9ML9Oepj3HndaAtg&4 z8GBSNJK}2c)^oUxpLt5EPZW~vFoUP^->#$;PnYsg+Gz`=u&bSkdE{+^tKQ`B+gcK1 zD{970AQX6Qg2o6{(Ko@KXDU=+v==+d1D)$B;loA(+G+}6qxY;}P0SjDrhtu%EoVl-ahQDy<(=md$5vd)94RD`GQ zLiNe*hq5wwF+-C)l6&#E_Aa2HYBv>SGp_5w%**TA~ z17<|3#mf`bKzY@%&v`d9kC5XysaT|B)vF8%K47>pMmMy)2*O$+GGc&?QE)~4mfBC1 z1~6~(UvOsEh@?{8ZAeQ0Drkz8fxC*h^XyR)N@$jDSVIo(NyjprU@4V+wJxLBW(W)y zNQRQD;|BvjhL*$ae(3{w27&b~N!3LdcTL!p9k&?dr9HYsFgP2O5wlDwj!~z?y5ekO zH0ZA+N2`jG+_a00{(1ZXq>P;~-0yu>tA0kb!c_0uZ4a9Myf=fNwHk|tMvNMmPohKJ zo3r@q_x6@AOA_fQ9J>VoBWwCOJzQu1INs3^>!IH zBNQMP-S2)-V&)jA<7+bm(>klmAwkvc{3X5fLm&RB&AxR}0e{@+8$|ok>6wWVnF@h; zp!_~7kcutZ)$t}CM=m%@{P#Rig z^>k$z?p=VAI<1LXKie>>Lx_;Ie*wTCylC5nXboE3lAaZvnp{t;IkJ7h zjkY_rS!CcW?Y}1QcYzTETY5G1)LWmhWA&Lnwx^#PPeQUPyBR9_nHwrs8mF!6uXbpC zP%GPP5%9|dHS=eZg=9I%^j~0MsWdfEv$e3+i^*7&%-tvVU8T%LYpCxKHHryf$Hw_P z>-nL>&;PE7+xV;(pEa(A1^P*qRVmb_f6Zv}_86lyJ8`#Dyp^H^tzpS07H#&UeDed8 zt@EA14BA%+7Kvicwe!HP;y?a+iUiBdB@ithSan{3M4}2xfx0&8=2rLy^M=v#etPfa zMoJm)e&eZFAHigI=^vWH2Ipz=0gjc{1S9VV%-$GovCwF#hri*V)fBIJ%<}_ur5CKMYaUW4NggVdNLNo9WMKz>_ z-XVsB4@l`2%cr<^Ux*YVf$Wz-`NKaxO+b2M#@NB+?1QTV@#TV#`r|0+ght;k;Bw@Q zDhN!~_&{#W`H3Z$6P?N%*PMml(l%pha`e7EpQ&`*cpZt3ixJq+-@x%Do4Gvvldqx8 zM4m@mKfa;{efpJf#tN4M#ZGVjX{6aOTDS5+wXcE$$yAPhI?eQN%G=aWTQom^5bt`H}j}Vz>0JP@Sf~3 zzh{Xkw_O%}APJ?$N%|`%Rz=U3d|fE%7_=i~d7s@E`*$klgO&bncdJVGIrcQ^Q&AKV zhBVuQDaYUA1L+s_`SsiQ1cu_8c5l%+)w3uDN$ED!+lxUZ%^m!NWc!kOdCt!Ng-7o( z_4e2Be#-~WZ#1I*SKz7vltcCNe>4kze>({&I)OfGKJ_Q->4~l*V)m;%jY@OtEnhX* z?}{NbD{etli_H|<$X1l)G9&-~_L6rh%&+P`<5<5?Z5)!f{-MgtK9dE0wBMZln>^x} zU!T+U%`v_Y@h4m)S(K_tiy!a&4Nv-v%f-F&`sW{EYgBSyS_kDC54>HLh z{&c`s$V=+H_tV+7BVliF3D%U;pJc)Gkv|TfjEoGvlOEt|WbyPuKXWp@GrdK+^f}eW z7)+tMhOtyfZGw`ve!@xSgj-+Q^~cO;il4;9^iSw*JD!b=Z1FU8Be&gIe)yBFU`99) zouvQ`QK}Mt%aydDUSt8&H_s89I-GErZh_O^O1efd@Fl7a{SW!Qe)1wXZ7q-OqkaNO zw31pZ<*>gT;{VL0VKGkpkzcbSWbYt*>LFzR*?FLVBoGh-00jU;Q#LaI0AFNi*<@+r z4mm{e8j|{eSkqWfUDStb6L7c$3@wW}`m#%H*tM}ZI=?yT-vG=}6^#f0fPn#LXUk1F zI|c z7zaTZEEdE@U>GKZureG7%b}EE28n?XE(F9183w2#SV+PH0a#Mp0+p%vmAAN(2vi5; z5LnL4q!5r##?^F@v4z?KuYi3_X<7l#`1y!QXe@)wBBKl_08~oQMNn*plgK;(WeFiT zQh>A9GJqu(WlM(qK8x}ITS6%d5J+Jr0|G$LIHFQ?h0$Y-j6x~sXM@586dZ(V$fSZ{ z_!dpQN<5H;ff7nI7w;}RV1WK<1i+WDKW@f7-m8|L3D9{ zaTLaxpJ9ZDG=j_eeG&kKl@*c_Eu=3h2^b7Unz5D`Fww)0q_0U)jMA|FYsMDOqCeGS zS;oi;UCgn&Cgcau)<0L&vsc|YU`FLTSD$$|5 zi9V}3B^!3=BDPil;@Y%|IWj1iB_}fk>gfqD)qT}kL=*-GSk6nAifEsvuz+dFbt%;` z)8saV(hj*DSi^LXF>d2&g%?+!m5bGcq-r=3NF+5;z0~DOKPgcG?BVr5gu!XW?HvuU z6~@=F2UL`lS;~-Cm0BW+ltRGBo(s9vgR4^N%`EIiO;7@l)R)SNJM?dJdZjGdC(>Im zIHA5EX@jm5Mt-g8pNq7OpC+e}rc2|xf{Xtt^?*_Us-%kUNk~gC?T$e}+#6qIlnk{7 zn=LF6C?m_U2(JpRk`_Q^fs~RB%aVSBsjHX@5#?J!?ZE8B0APF!G5+V8F}i4gm~xzg z*qDW@w$2}dc1u^@)jbbw)x*h#>{#imMo4l10-Kft=Y=ZJPn9>7(MFM^10}b%1^W;k zR??-|PGc^LLzYsaL?%TZHagS{W;ffy`YLEJTI#*#u?5jBtdKXcA6?I5VK53RWgKZ` zpyioxq02ExXr)>GSUKyc-C&zb9)HA}CVN$Ub&5MrAXyEAIUs zK{lQ;GH*+y6-8t+fYyjCP^hhaVREz38lE#B_cpL z5sI^%1CCy}j3ch8{68`bO`t$<-coD@DQ{T>hhnfqDuP)`jIt`~#4QYiWyLHOPJoF7 z3L(=lsB0mjhE68rk7YF&^}D{KNep&;!g{3GIC0eD=#{nqss;XXnyb@`dZs-uc8G&F zR>yi3H`<{qXRJCJN}x%w++{ek23MJ!08v1$ztGk(hnS!M9mi4_5pJFI2=R4(Q7d8; z4%89Xbwt9h%v^Y=#H6;w07L<|+JYMC2EScN>~dhTqXG`y z77=7x;8G&qmf|0(l;KB^tQ#RmuocNJ7a&ya5zFp{2e}lyEymqAite=H5L=Lvv&Q4( z))3RCf!9K&Yn^$6wF3L;&$Y}Xw7cjU9Z7fORyts>9f_XGbD_G+X`SHSYDe#Q1LAz@ zq>JIK{T4c*9BbiHB|@HcCwc-OFf03$l;f|6W?pAl$3nhi<~kWUC*kN7ho05!MZg> zO_RI5<Gh!9y;}A0%9<`t_ovJFI++=5!si#gv(QrIa85T7z8DcO%B+X%ypfjyV;#)2)nw- zT`SzjPh;TaC<-=ZyNiM)@uXjGCF~1iu0`D=S6}_F_{D&dxZrG2H1%}!xwQJWi@ZfI zawj+UdBF42reC4zhTj`F9 zsT;G-JPtOyKEZ7P&hD!D3dsFn-m`^`ncgT&$#)?BmKrmLricV>z|hV1UlcS|h^?AB zPIS=}*|*wfw>(%e{DG~T!@=I+CzZGvHM8>;?bLR(xSFN8lDP!yBr(xsD_7e67W`Vo z5hsXu1tfCWRyDL&QcP8L6dz$^>TH4c4ZMLmfWTJ*ljkMjR(9WCT;11_Gi9~09BQ8W zZ<#>887P`XsB_w7!BD_LtClGu6qfe{qGo2)4hH|puzQ$RYc&dSDmi*Jq+9((6j?qC zI#Nz`f_v|+YMUxTta!fY}j+frnDpKswUW%o~BksplX9jnZFn7c)1qjQ?m+{E46zC z?8yjb&Hl`R-OCKvh1f&@X(kX_Vwo=nROZ{5y>f!YtFC)dG5PUstp$Fh>Eba^(2+d({8itzpcV`QRh7eF`K<`}Gl5|sVHKtW zlWGnEq^gsih7;)qTnK`1g>yEt7%t3nB3+qJ|C1@5>|nPV!a~Hk&-Cn*l9S-g`OV#B@KG zwU0q#+a8nq4g>GrJ;nrcTS$8d6gt1<(YB|@xj+cEnusMxPy2YIGnDN!~EjnO5 zWY6n9EP&vYQH6PRRSSxb1N9y~Vbcnn1+cZ}d+atb1lsJCd)_NtvnBtS#k5*PCHE!pO{HXJTSu-4Co6?r)@!cwGj;%;mms96 zS-17K9e#9Nr*67k=eaYQ&0kt|wBY2m=e*YR_52^1d)nn|1H&7%ve+w4OV_WN;nw}` z{!}@4lMt}>inKiQnN^42KgQd2jdrht^7^13RT?!WqYB&$QM?JEDT+Bf-VH*R!=|aD zIoca^B|&I*f3^RBO|(!W5IRS{Ui>%|6HV{^EF$m^XMaYr%0eO=H<$@#NI^ntVPoBs z6N2C9A{YTJk0d{&1PX2~t%ZkL5=|i-8E`JDQ{WZCo2>#A0Lakxx62lsw5P6s1gKji z0%3Vur#lJBDY)dlkQ%rh!y}wtZDIWB8&ZDy_AaY|6Z=jNmsxD2rEX^c0{jc@f+yu- z!tZe4zJOU%ID!bz;JY5rt-6tJW5FePhor=z;<@3OSZX{ZRbE4 z*2UMZ+F9elJ3btH)D|z8%Bc$jT3;X5aRJSGSqp-*Ne(7pl&{odjt-VT_81%^b?oA# zoQ>4*HE1yg1A(!0rmcHf(hoWohMf1;Jl4={C?SEv-izLjJ3(%-?~tqDf!+TjGcwz&pM-=0|IstyjIERjUk1_>3o{g*@cfhc2-hS zZXp>85P-(E#`{AdHKnQxnK6?q|A4q1JMz?~cRNt!U0W-gCFz+Fk0i(5T&wMlYIcsy zUFo#XZ2@czX?@dV_QNv5sC` zbLhah%X*=@fWe!?T#KiHr0v3K__$or>w*hKCh7Q?w_OPd!hfTA#q3zfet6+O+_&O- zY71s`yI!Zf$2@(3iqR1qf7kn;O`k|!c1%nT#_W%~Lk;q<)N<QB*|%;ZEdZ!8D(Vy!~`@`CW+6_?$y zX!<-8sLQV;bD}i)$7u6sR8wagGyEbh3b|0P6Ye&w73@Nq4B6XX(MonGo4;%y4t(z7 z(dOSh%&_W!2z!%epi|ASyybvDQM!j#y6}tdNl>ItH+!GLZwNK*RI6#Ouisr38$c6o z$Q#kM26w4p>VZm7RWt+>`#|rT1Zs$^eicFpc#+xEW@q)42r=BBLuRfO&~4mtdr%rTf}b^RVoPaI8!tXA!#jLalZKiT zV9f|xVGipI1QpkIav+h9`(g_0k-aMbHtQy18$BatIgOlz4?t7y4he~+WjnSW(5%Z| zsYVvPbPkO>fDSpwRbMt`e43^TjoHvR-k|>SVaGpy((=>Iq5W_anTx17f>2(PWh#w|`h*CAtF6AnPlO4!k4 z4SQWpeN_aHE(6atgO%*7np(M7`-X?*USA(h+cQAtP=l)~JIzk|hS$OdZnv?UvK9ul zVlS|&&uRuGEz>RTYO2Etoje7lgH2eptmTmV&G~{!&{Hc)*jF_1qpzyH8Sc)X$$gGZ zTWR&xG?$GRvUio?HPoH;nv8bEW;z|CgP?*afk@U{)h*Uvq9Ek_Ie72nDN#I+!tS#4 zpaxXcE7oi_aSkgODj#-DsIqdlFbk;j=8LxiPwUqloRRil*N&j^lk#r*%L*f&UQ(JD z3dG+tyXW#TL*ZC`Qjf$Vrq&LrKrDGz@T(WKAAoq{ED!;XI9ba|&i z+(;}$OCXwM+#s5E{v%WfyHasFb=n|=Dzd?fj@|pwiH_V0=2I!a%t6hX_>hMVnXlXj@Cp3oG5qCvdz*w0l5aWSjj%!e4UIxcz3CLJf0^W&GM_aJY<7z z7U*|;#2y>ZbmOQI2wRS!wov7WF-^RX-&$Y;6EZbfQM=5l>ZJc(4Q0ofPS5R=2YHj5 z7uvZq-{R_JHL6>&gv++{0$IeULr$ZLWgIIIYw6V*)45wv7#u9sJ41RG@y~HZF<>3L zxWe@c{JEXhgl?j1+zX!DLS`Tu5af)-Dn3KS<~QVL`P8V+QFOzXZ&X@_(nxpM6O|l1 zBPbgymg03&g=6!amgsR?l^BzHehB_lJX>e3L%~P2mxA~Q1wp2e=GJ{5Q-fI)Tjj1 z8nEp)0X{YWsJZBJHMA`mo*DdamG$!QrH@;ED7H_+3L|+LO%Ot#pASof z3Jr-rP2+6A%SEfY$4_q`t9Lhzc_$d3e$&6g)e7K|X@XM409-|3aq^#7Q`=wtfDnh^ zcyCh0|999)xX8zxqGJ9kkzKLoQLG^(nJu&cEr4>kfy1D}q^*vudgc3UA^vD5^9&ePPfeHHX>JyQ=PAS*AF)=D zy><+-@?&|-59oe!b)98T!Kd7%c(x`>G0T}mN$v?=|rT}ZO zbxX_&PB0Ced}jb-6ypJN9W^u0)=yK zJkEj72|Y29K92DtAU7BD?m)bA*M5d}-oPVc#(HSY5!RCAWZv5FNQ^u+6>s>{=iDZT zQfQ8c<(^W!Mh+1#o7u0LAu|)V6b`_*Tfp&n=(iz4L%bQBSi`1OM_6}LdJQoYi;34b z+YOCJEdasSY|f%MW0- zX2|EXo60ul1e!hvzw_As@L!GA7H!q3Qy^Bf=sd?PS<&G(pE<^OxNw+0pt;6I3NJJ@Nbi;KoM$5e;N z3?5Tvdjs4}QEP4EV^&?rwp}S9mm(-5`La2yuw)E4;oLhnlf4j*BE(~JDt`>HTdT$L6g1cxGxsPe#55~ma0=^dRv39gj7x%*#`$&NthAbvg8c_u35ZE60La|@Wy zKT~BdYL3!{lMeKP%M7lhMa*#A6j)A*D`+=1TP*xr#nO-)Kltxf@@L{?Kms}NL66Lv zWDD2e~nT1lVq(LWh_!u^0`KZlAwK=?)c_XsLf9 z3krmrO*8E1nF4q>f9Pl@oM`kkX_t;2iTcYFS2NX??;G5AWcm96#kS8ZDcBb734cs& zEV7{(Q9T#SE2^66DHz!lzMpna7g(_kVF=o(7Fy2%Cz;r=Uq?~@*2+B7C8Zqm%;nea zB6@+8e~OYfn2IbRe=)5&FI&}HFaO>#9*Q^DK>z6D87~@H&c?wPj^ri9&o<*|U4DjT-uyhrAX)QzxudzNb*#=x&f^UerqnXVX;Y4| zvAsl4-Cf6Aa;VM52Uy3dNqU*N^JNQx6v*1b+P^gp)T5T~A0tf!eCY`q4J^>%(^3@L z>-3(*ETE;9cth=7x^c+aNXRQb@SI!rzd%c_8}ez>hLf=&gOlJW+sjE_{AvB>IcA$S zjBNpoZz?E9%$G6WiA^(FVwgC99v_m`0~WGB6vA#czu(&>MplOo~LHi6@&!epluok>(K%eML1d0&;dY^Y+*{+@4e=kw#t zj(yk*|2>Nwo8Qft*_ZUf5dj1++syt_J0aT}OJ~;biDfOG@9)p@FpQ?jG0_4y37?w9 zA0N@=i){IHKC?JCRi{`AKf2r^%dBjQx`yQ zu`JhZ)p7w};kQ^V>n%yBmH>_W9I^*7wru73_MGF_E%H6e&04t|xSaXY!>uuTv<<%w z%T*DXj1VnyZr z;4^UK4EP`CmSMvnY%C&lS$Zt_zDK6>?)Oe6l5(k`h*Zc}!fsyY)(~wa2_pXe#V_2p zq;40#`{Itu54&ZvaTbF9N54bIO2}ZM)&gN&BR`VH{__`bAoS-uN`G^E_55Z&5y;~| z?ipAGosRx3tp0uaKk*W4IwInUR(^pqIxpn=S|Vtyh=s(TaMr+Ud%C9ndD^%-OFW3) zhZpn_k$?4fP;GZ^iN}LcH2qR$iny`B#v{u4y1w*Dp%(-Hs6T$$$vII@wJm9hZ6Zuw zRZq0Rx&N%J)1nv+pPCb&0pVo!r@39z*`jIf;_LiPZ0yl09=v~d9&!{i=b%LmGuH~| zuTHfekOjQY%MH)(0#e7PfJO9{-KWT@ptCJ8%#$uZSAg)r#&BJ zVS467SuyqUI8t53Jh%OzGAZkx4MZGI@3Co2#>kU%XcMH^KY5`(_Tadf-GCXoU!|08 zcWW0pa5D1NbJ5MB*Z7d?g&w?E;OXPA+srx2H+hH?e0$W{`$yc2jYjg1SHzhN;x3CH zhV^lAog^XW)$3&N_0sg1IcB_uW?J(}lWOGL%dowsy)@xfPg zf&MLUze}a4Ze0x#^vT~$wP9ojHEO5M7=R@pxOhflH|}E_#cj!$uGBPpgeZuEz&z-G z@!#Ql(4zJYiyV(8s95f1TW-VIO)n9cm&TZCZIjQv&y&e*4ua*)))%eL{^h+dA7qd{ltviq%J@3$;$`c(S{IBAo-|H3if`B%gecn9 zwGiBT`hM1`w8^i#mP6&Y8cp~2o(FeD*Nt!9f{AiRX+0lfAKgefca{qUBpusB=IEYA z+J4lS%vigO^^j4Hm)lU>spea?Hr!8Fu#d-?j}q6S`tJc^Ll=*0Q#!uj%l9)tDQ(z; z-Bw{IpTk<1y)uD1NOaM8rRhzOt_~e&Ng0oL)$%%=Xpn%T_fHA0)X_*1?xpU}F9STnmmCOF(8JW(dx; zA0*CMh3;W{ddaXpd!C8J96#<+Y^qHE>{WBlWBbZcam>Z_@tAv1{$v%jlx5L%_cA8K zo_oj3tk9nA!q)TmQNL3_kUm59@oXJtA2w4&PX@LTp`DPr%%qch6GSD}V=ouD-^u-s zd+O)8p&w@-%x0ar#8L*Y9P!n6HiM# z;RtVxb;x0q+i&0cn!|dGGpZEUdOdpb4ed`@La3h(Y)kv!D}@{DYi(;7ui$UBm%FeC z3@FT?NdP5EMmPW_AX^P3=13?73D)CuLf?+W&M=Bx|nF%!r0196j15sa$tvnwzP;5-lPGal!0Ez z@#r-&q)cy}BeU5V7zu=+QBoj4robHo3rGalVHtu_I#uPu8eb?rL{)j@mZY3No9Ya)u|MRF<`b)~kk zTIroJ%yEb>$xs+4gfs)p0Jk}u$9}bLhE_#_xu&1KE={imAaN@bOwKjo_G#uiqY`)R zfh9;1b^-PvQ;AI$NNTthfO())!|c-a^u@1-1333_EYk^^#oAWYziZ~%4HdDT+c{RH zp=92gOiZ5{ut?MypfA$_^v3A|orDBUK$oSIQBfKoX{XNMJPS76$2fvbbTY2sFnX#3 zgw`r4EK(#Neuk_)`sM;F0VemS*-V;pOU@L19AkSgQYDB%e3@+X6ifjM$nZ5d&zMNt zMr)cB)LJTA#3x3TWv@zFFEsj?nqnr zEvc`(-R4Qky>3VOnGZ>x`Mr}tM3Qx=33mPcnaW>T-+K%0BT)2(pbt7f+^z*M&k03=U>d9(n93%q13)H1c$fSLnw@^xnRDk8eoHK zfYpy;I}hKW0&5z!I6LcNdKzvGsR*=YIRR%hNhLZmowT#PdCDdr3{&Lcg3O8CC*|(! zSUe5HB25@$<5?#@Kc^K;aiLkskld=0J9WWSP`v8aXaVmKAX`iZQ<6cB0#Cr|?U3qa z`CLNSuq>YCeyLdf1m};&s8sDctiak4O4*Gpb0^i;sWnz#cPO;sY;&`{{?3kj+}IP= z0vlx7i@&y4mmblGH#6bHI+xTL(*5u#yn8P5IvY#XGNrmLP-IgiRmzBbs$;S(prEOe zOEJM&k~7SBDzL2Rm!D!X}-q|eA& z;86`DI(H=0En}4y-9Laq&SGVPbqUSZF)OW63F09z1qu|sT^N03&kSvY>Ii8Q)+KH3_b+rJ*TBtrtnf3xDYxa7ekF!}3aUy0CDkTw zZZIr8Z7l-tLKaz5N`(M7XLdSZLhl%iBSlq)Moo1#_3Nc_YACkq;^bk8IYCr#XQ$fZ zj%M60T0teZsI@Er1W?8$iD_C}GM&T@Tnpi3+1lVgrCn*~0#1l@{gDG}v@7UoZX4 z;xO_>UW}=l%zxWEKE6sT2GE5qmC~;$Sj$gAq48(d8UqtlKK9Ir$CT|CZ+wl+qD#>9 zM;Ll-Ncu9R?SfDAb?@@PdWZv+nf*{+$?5Jry%o_5$wC_FxtrsnQ9Uw&Y6F&nwCi(r zup{>>f+TkLtvi;y#LBCtX)l$Im}&>tWEEwRG_9*%{@*r;2vs$=wF6q!&K{iF%L4RF zkz4i1S`YZ$GR;-HcrVT+y;?9mQ3q#aOHO-s{l8_qV?FAVd5jrgSOSd*KIa$<0-8ZM zxP4^DGd3MflAF7OgCjREz*&zhWLw&Q$ZcRXLA|5M;L(d>c>YoKnRTJ z>RQ+5JJ`kIn^rT)mA9E5CknaU2R_B$1PO|ejhZsA z(5(Si&~U?+dpzVc8yH||?+I8rHG}?h1GRh1Gg$Pr0e2bf)ta=K9`C{|F4k{Hzhk>k zZd6IE#Mq>jh8CVXpaRCY95(m9XST)}E7Lhp1@%j$0Mgip?@5h~w=?qRA}-zj+nGgt}y+Kh~?+$WYwuI8OLd_$!Tr z-c>kwuccq+ttn=d{=2%rM~3Gz{m zdX3X6B)9eZde3ho;f1%K7&kgeEIBsd6B=N>u+jE#jF0#x=J?!i?ka`z;~^^GT;?Q| zxXY7?!Gb+5Q4Ul~@A(6}xQQs>Q;4C(U)^_w3yFgZRPkcH6T^;p%gxp&_BI+dISSzAtb&*)=h$Lyzqs(-y`?r5s~;l2 z;1o|i$OxeRsMC1YyM!as4c&u`3Lkn@hp^n#;SOsdMvk}~FJM|c9R4+dAC*+$3}Jgy zzcsgjyQQeWmO*;MhzRrqqz(QWa8P@2uxAmyeed@~{^vzHw(l6-I~CrVi7xwk8b$M2 zd)VRueZ#!6PcVt0aHwzZwpk_n3V5{cbf}nbRi$9y?#bdO-p1^4mlm{XZQCWK*EEX= z@v@Ra>pI@BxpB0oxmP7Ia`@4M_dM&+(8#oqCAo1KHN%2SBriXWdTs4f>@sfT?o}nkYBha^9#}k9JjvR-;Mxw|y9xuxzg)zY!i2Jz71wAe}&s)G0h+Fl)u} z(5!T@6UXmcDYeA4$vFS}7Y&3-=->USe_|K!*Y?m1>da(q=}35Y;!<597*riEhO;}C zvd1PB5><`h)CdcG-I3^qw4-?XKHWQ_idHu^t50jxohY58B;~vfQf%?OwcFWTVfc-y zMU5RD@f-C&6NUe{5U{&{KQJWBRzp8~h4qdH{zMwVX9xK`NDJ*9!U!jX-ni;;qM!}T z;gOtdxwOB;J}LYjbNn+uVKy2R;PECnOA~NtLl-efx{RMELKFpG3her@t+&aV!XXK3 zSd%2#irKhqUulOSwQsGuY@upL!A0#<7fxcDX`?lFbz?CYc}4i%bPwJMus}pWd>W1y z>FiBs;|OEguUe1zH#c*)G~({O5!d?h(!1-RVw&S+^P4ELfvj@OvWdab*i(?vFI>6) z;~pJ-TGWqz@BF=p*Xry}hA_bb7x+bm$6yB*$2g(Hfli@?Ga2c=9$_2ya0keA~cj- zo4~601y9+4vC{n*Gv{f1P>6tZ;+O9Y7QfXcrs1*Dn3fYn=Y7b1`1@{^iWLy`Lc42b zvhnIE$ndAcdgs~20*JVs=xMfO$BC`xoryBx5ThY`Fj$|Qgkei`2y7>DuF$thm} zhB>Ru+LlL^E9C{qwc+5$)^SZP1GYh z73wXN?d!HEBFAX>i^xcZ4XB8N)Md`%{VmQpYjyrVHf_>tv+ zF4+z%3K5WRaLjtpkl{<<;SIQR0pTi{A%H@uV*1BDgx? z6J_p-CDoj<@P6gyw+k`UyB6n`Ivj=_46V58h)JT=6k}k$3?4^ojx230O9V1C8&Dv| z(6p?$UwCos^}4d6?JU@^ z#sjDFcZ*-Y09HWC_nkW9`I`lKWglW!BP!?#FD)F`<^sV*!agd#WIMCq@3b)EAnV76 zi|tAv7MT$5bw08=A!zvjMYrZdU0s0ZU9omAY+2Ma08?t&EnO#x_2s%nd2}S^Xu<%w zk-Dbn{T}1T^|ba*53707=pD(k(r-;z?8kJ7Y?CZ?UHL1R%@qk>OgwhD$~NxE+hXwv`2Q2>9&v*J*))3z`e47LVGK$w z`bq|KgZ+Og`BZ1F!YY;SAeaUbO{K6jpkF)f|FC6quhbgZUmtahUcb@P-&&bNH7M^J zfar0OG2tG_d>gEEt~K_sfBZm#N>(|bW!+6Sy~Wp|tqy-2_KwlTKxW3>9_cZ8Gd6;Y zLqd^JuN!f)+#JJiN&F;Rji1F!ALQP}F^(aqfV+JFP z^j7JPL$MjcyY{y?>4kah-2$k82M5?xa!<~#SDCOrc^jT!NY`@DE=Do>cv zPWt)9DsEsIK!0g{QpSbfdos@(4hl7wr^#o4XF-U z%qp8vL^sGd^Gdy!hr4-!DFdH~-mo)n4=hbJL=SbG$N^UohA!^k9_dRWr}dp51(zY2 zoj9Hpsn~MHYyE=fvj}^aC@sg^T%hdWu!GbnsS&N0^H`wo$DgfFJY{w6O3eGayMquV z)0fa+Y!NhjYEwYkwP=I!y%)pXyW(^|=R~svZuBu_u_Ndc`8-z;79)*rRytuUQmvLp zaXP20#X*Dqdb%_b)^fFDpLNzQ>%dY@JQ**P4np~V+i%0UPHv{ZKOZE@Mfuo#f)T>N@z(-|*& zbf$V(ZO;^8sqo%_u(>hH3mkl_VdW!o_Q}f2;E*C@W*0nBqcuS|bcbXKhbECp&5I>N zO?$1n5`%7IVfhDbki^01(S5~mlle5yo{d7!&rzjT3#94%Tq#L)?9^;<^AEXFTIp2a zu1s&9@G27ocQ3nm{#0lji@wePxBkIGo1oS9uOFTl{^4T?m!S8By>MTqlc3?d%@E?M zNpjnxb4)P39%y$8By27*bI3dQ>i&}cs5=OQQ2b%iy^Dh0a(-@`OvP7d|u3YvhC#nZ}6=A+@4DDo6Hz|~c zW6yob^Pre-qYMU~xEi56y;rYmRbV!S?KW%*u`wbyd0l4BLjNixF;69tl5;ooem>Vl zuEhBx+U6!OMH;8?UStwsn4tqAJ^p~BgT{r?ytoaX0`SeqOfU@jRIf_sLsQrpF66cu z2Ps8BTY2k6IdG30@Nz1?f~m}xMtT^qqC4j= zW9#>o-B;sZSP!~7=)`$`9|{Y>z+pOQdhDyz<}l7MeX5mXHY7wv3Kz7?)cVX8gDVWe zZ+)Q}ZE<850YjMg@+6HJS$M|NqIMhl4ewskV%68VHEv?gch(}3TtA?(gU1aW(3~7U z>8g~6AQGcaAIK4!w!d#*9XgrB%p9Fzoq5qWiMbiR-t~Qw_`rI_yn{<6!=A{y_Z9wE z=wVY+jJ0%pM?_2AXtE;2^2{29u zLt!feP=I)Q#@=b8mXM|gY6-fr@rbd7eTiO>ZrS*3u)3co{E$EA33!HnokjjFXl(e! zWp~UoJUt4Lglfj7D#>PkXB0wb6sC%21#Q~d8!?4wsZ z;~i%dDT*mXa*S_XMzwf%_ZJTj`X}>d<4ff9dM9&26kP4j)(AQ)d&T8gfk+qLtQU!2 z!lq~`unhg^{91I^HL{y|IKAhssYnUt-+td78OAXF}^w#H7O<)>8QfAE>9&_^F;=Xm> zRvPog<(a3yo7OWT_x}HnTE8NJ{XC`*ws-8^X1#~Wvq5IN{pDg~?9wWIfGh8;@Kl(^ z;LAe63!%)0`Zod99>_Yy6lAM1!=#oF~-ZB ze_f)i0rz~@zv4H?%)xt|!gBuT?d1a?|Bj9Gy3>3)Kd4M~AB!CXmh95Ue|(kf-t%(? z`ICnDu{S<48a$O+`5EK``UA>e&g&k{MH}%BN?*y@!vy(P0D;?i{vtsAC-M|>yJ=q6 z@nlWhE&!pwGCP_z7}c53*XH2WB0k@Hm;xQ>-xotXtMXde-ZbYfBlw{|HoJK{K1u%w z24P)3B;d8;B2qBM5uHnWZe!DlvlGNi|4HSgRQWOU9}m!%ea3S~Wys*phEg)dS+BjR zV+6PB0#n2(yt0x_5YI2(_&!!8K@~rPb-HzlCEj4og2;VAfBzkT-;2Ea`1vEiZCXhX zj^2=0rcZ0!p^rcGDA0=`G{6(fH|4|_6au5rtvX{u&imRboSV1+DYWrza^X=5D)_Z1OPKr zMl%2aUuE>!SvraX%RzH&+tw#e)W8&NqVUC=C?X)N&0v1F>9Tj5^J;Wt9N_!!oc;m8 z3=!1G000{pbh)eTcQYk2Qj0EseSFRFh2P@tPR!*#zKKoVn|>0}#5Ok){!s)}ppq*6 zk)#s&!Z{Dng9|&7!^|F6_fxg2+M4?5rD!ANMx6z(eDULf>JRo#i)oL$ReUy zoSv>_Ptm1*qW}P|LtAJlnthIiK_M9k?qMRB0oWO+(jlp;;6fb7>Vm&I$lP{Pq(jDc(^1l1uy_c9^T6H}}@1&l4#7Fc1t zdbk@Xu7c#+Fh~Mn09qh~1aP0Vy)*ly;BbqC{9h~8Y60fRwG<$mD9TL*LhF7N0{s9S zrxJK3k#hZ z`zjEo!wX_CD8kFIB?lCJ-1o0mGp5^qfh~Sspo^M(hlO5NW|2*=R-(AB#Tf{s{Lcj@ z8?pWKhRuG?*@tY}^g@5=s0Y&)^w&*&_>?tTlXJ$NewuS~Lt+20r$?k&oSoR5y80G9 zfsL|d=kqBiX=zecmg!9p*PzU7IYHzov=^W5C*Z~dZs!J zKFtH|Zr6=44Y+kM{%7A7@J@+#%==+gR9Z9!%kB=M)d9%OZZQdflIO(Im zw)y=i8;IaJ98_JB^;v>t^InM2vtv;C2I@V=H-`|Xeln|h**?I0Z05E(cwM?xs6E3= zZBTnzOM&(REd>SYZn|xEj_cPhV&%oBxgNrZfYHBh7dJdyhPb?RPaq&JYd}7pdNH2F z_nhT}_|}=;f~CBU-;b`2W{GI})MKtvE@>80BVmHKx1Kz@fZjQu5i1n8FE(uI;-N7l zRlQYbv@ZLpm9BMXD+?=|&*Qk(>3k8znB_U6 zvh5IFnD1eoA$x#5%^sAh>cx+240PJc#oTG_mHi30et5sq_oV-e>-cKcPL_ZEz-U?( z>j&F^R?vFp2J<;Qd<+;)b6ppUA3E6UE3RrsvQjB@0ro|Y33cqNWj@k8AAN$7bE|r% zsB*6j0xN+S3(`Gg+b+{ePA>wQ7=dF8mHH`0!?rN5+kMvUZJTMPG?le}?!PxAARBGO z#j&kDMUvev_Gxz76q!}Py5-=xj&lQb$z+6aL6nj$8?{Akr=2HU-G(N63PahtKTSu# zLd;@)#H8v=$<|L^O|wdSquh2 z>-M%+y48Xx-3y_JHf-uM4c~;T3*c(L#YHfZ7GrDGwpm=(IvCX>#_Nc?7DTWUclAGb zo_lfA|0G?5RhUbHqDYgY8rHkdfM`?kdz1q7RzAV*vLQ zFwTXb_sZG;mv<h?pA`hog|d|E5#%m`eM z(n$~NPHql+2x8KPtHnyX+eNe3xqwom1AmB~t zb7){2!285y4pC7mKCz!k7KCOi;jJzae(i-raEfBB&W}gGp3DYAv#|>wLO{VjHcyaht{cQ>0*PY(W9VMHb=g; zUoIVOM35Kpv=Ocl=w+g}H1C_X7lz*K_pbuGoa(Qm`+uu?ruP!%#O*L&K+ez|s(#s* z7iNSEkWOPC98`m)>lpN_1ul_bNr2VG{>=-+sOxCn&nV>mCP+XuK&x+uK(DB>Z3KGZ zx5ScwXy>Xnd0TLf+xByR43wQ;jOLXRoWWb7k!JLts^g^njL7!=_@M}KpJJX65$-T` zc|`kuseMX??=Mx`8Z7=eZDohVl7V5u=sV^@Wb@t}LtD;#))*6MISKaq?41{$=yY8a zkx8I{mat;-{)%XK-dc4f^c$8W>JDgk9W4!`(#zao(Mky@{AzXsc0H;bKm&0dCjyc@4DTl*r(+Nqiqrh#}rHM zW*or{cgFTcjr!a#*lcPKXapTOSYj$lt<%!)#<(}^G>y$0dq-J=e^d50G4W)`2eTr_xDc~ApL zB>Ismy#pRL`KIM>ezFAzzYaMlY6+&x~egD1o^KV%XuP~wu+m~<| z%S%QF9x~S7wsAV`ND{s0zL?K?wvsy>FmKCn$zWemH}t;QM>K~~HL}NO^UnOO!^9%n z`Anwq9M0Y9{Z9^rZyUX=^R@fMyvgR#h)W0W!MzV|;C49f4_d^zQRG%LF7a*6?CY1E zM$8`}h%PHnrYl^G*l3BKxTWxwkw5(ny|piDB}@I1Kj~hD+RQ0?M3OzA@%gnAx%1WT z4tG(772*w=)_I(7sHd zW3vx834#a|*J0=}5Q@Rg`s{}9h|U)JT*{jI)}vZ}fb(<9cPZ1;KSwWj@m&4WYz;^y zTv5zuC5m%QSTK*VTr;!r^YBn=G1P!()N@p%8w5w)zuCFF#J&R0B{7Bs^024SLfKWW zrTs_X;a6oJL0{{B1!EKx8CfwqC^RMV0FA8m83oFt z1x7EIDst=|r=v3CeB8@_&|55X9rD5aYWLS6%M(? z6~af+*Gi?Wbx;q~cFKiYx`h|i*4Rc4MbCU)_GgN+8LpD%Vf##b>;gDlUw5i?Ym$K% zDo^9B*NfMKf{PME7eSr6sYFnf$gCHI!M`!4GL*MDkjGgM1rLp3^{jPhi*SyIxb3Tg zl?_MptY$f(EdZxpKxWy5+AKTa^_>&4$8kgmUZyO>0cip(vMq(|CWkYtQ&-kTk(T{u zf+I;+Slp2qNICHJ^>Gc$ z6v=pYO7oTy(vp0u5#Ds1jg)+fOLI|Zm{s8eOeu*Nb?*^``;VA(V+Zc5qLs}|-E7HV zPACd{BYsu_tMrI8f`?Ke%D?BETdP!MTq4Fs*=|g;fg>hOWz-;BIQRiAB%PXtYE|!= zKW^+qaiqeO;@hE{nIv~NLK?X`sUFHb_QFohKH%9Am!|;TNu5#|JW=SKUi-#6jAnqt zRnUiqd5KrZ9L!(J`IN%1JH^J@X?sp_>N)QEM>@AsxY<%>ZQA!y_LKQieOIQ4RL4C2 z*}ug;=+S<4iXVb+FMp^LZ7uuj$%SXCtnBlJF$p51uo@02<#;#ZvyYlmACYAEqNWbw zjLug~a;3>n-zY=vrk%hVP$*}$e9zTKH-2r9v!TA7;Tz%OJ%OrZo8W_Q)WBJbeXu?8 z-=FzQfN%f;&0>@G)?m0P@0Bj2g7Slm(H4qZZ43B=P^(VYtSm7Jc!1Gd+vVsBkWmWOkt>SHPd7u5fipmL+5}RZ0lYNt`id6_E z8sTA+rKuBx$&5{!`U_}qYy}=+-k~m0?@n=yx?jg9VW{t0)PGo|(>)&)AtLaNwj*Kx z4g#i1RF3&;{_0tR)j65mBNzlpV+u^Y!9FDc!|CYo!s6phO!4T+p6{|m!h{MW8Zq|1 zQW`|NTWL+!cveym{16N0m~muCg)rWnsq&`KdgAiIYTm;$PG2m47FmnES;C7GUuLY1`fy zrnrE*sMc~GE4PT0sy`boH7~SpG!F}EH`8t`i370trUh@1v}da%JL~$@ zik8GbXps6!neDQfjAob_$!U~avi0w@dds{HZVm^DbYvU$)3a%sQ{H(-*9Y>zwwZ?c zkG`_4knFLofjP2GjUg*f9yZ*a5>Rp0OQBo35ccT56f`Hu@lofRL9bGk=LvHkQ3EqN z(EuToM?%>1p?!#L(Yh`H+ajM8mFrPT6;y4C7*VfKK1w&OhO*R$L`o#xye8KaV}80! zk79#Wn?FZ&40tnVf=G*GSdeNNEOe^yxN$ct@|}ZLT6SkZ8I&4cjnA|5`GnW%6xSfZv8HC-P^YyY=9a? zZo$ZBnZ7M>7riig&BiXOA&b~KCo3R6o_6m;kKMwflHy&pCk=%I@mAvQcflyq?9bB! zxG*sqdB5NBe;Bs_@k3v*6cbgo{+dC4-kVbtHMQrT^11vSjsJaoA!qq{r**_Vu$Mji z8$HXN+=67)nqP8nwL;fb))DyggZcnP_-RXkWDS+;kL~4sRvq^n!Vtt|NGO()@NG)7 z+xUbq9}t&$q|Z8mBEjT3^mH4jcL!<)icLMP|A1wPX^OqvE9%Ih2QtoD5LL1lQ>1~4 zTT`D*(ZG=cJib*;^n3JUu&4aDj-F_P=@DYSmci>QHy5oy|HHA)@0yolRX-trL21vv zL2&{V1i-TX{TllC6lP-+4#*w($v=9vm)lCadD4e5{F5q zk0Plo$o-^)ajQ&tnbKg7IP&1hBgXQMzvI$rDFCclae9uC^BV0n?3)0*H|WiAWqyvW%jZ}oXax8h#sos*88v0X}%-pbYGip*o;4jQkz0?h^0A?J{F)ds9( z4}q26sVy{KFL4tePQzs^twJYyN+7Q0xqDYQ)Bw5oOyJfEin_)gO(HTyDRd=mdNSmD z3KJameKeb)qWHvby?MX$X>BU!NcJPXRmH}a@*_yE%QMGUwsc?|u}$mV6r_^~wC9cz z-ZtI&r*f!vpr`8%9|rZg?t?cCU+Ts0sCg?| zleQ*Qb+5U{I(rtgN7Z?*@#|`$m~trs1ghB}pc^sgN{`!bcwsfV_rY7te#k6))a>Z* zqY4wR*6p^%Uw2^TA4G>Hz6m*`f+aE|z^nOoPI@jgTB|TwKgoTV-4!uOgAdg~GFa%0 z@h)&Gs5nuprU|zJ6jNZwk>Dx-7-OLjF!)RIY*Pur3uXvesi~hL ztE|%|Gna-_OUetBp(!t%><6z4XR-nkN9HushoQy)Tyov_7Ecl)0nU$pqgMZ3p#+ne zAx-dRpj&Sv&l#4X<xwmS{{2Ly=rm8mqA~#aVzANrZHP_V?&O8Ym*3}Dqr^7M3+f^NKzrZ4yb;x-9R2O#2Q&Z zMY&M}luC3qi7C%=a=U2htv>XEFWyYz^$MQcp^G2!p_ZBx9e;wMNN3ilx(+Hnp{l{7 zZa%{t3^9coBEWwxveUtt(w=nZv9nJdCx>u_7>VY&{H!qHbT$ZfeJu4~8|1ei(OE}4 z{CdI!d2*mS5u;bkD3^3aw?KSt{)h0Qfv@atyBR0f9b@tDsQ=W(`tW6ixU3WP0PeN4 z3nHI!%+IbWu@W2u&+hf!;2Z8kQQroeSZ?p!%+jN0GPNDvvau%2v_Px4-{ zhbx^VVK*6=_MQG@cYK7>mo zHbJZ1Dc(`BcsN2 zJsG=>5emw~F*7GiQ%$>FkGx4M3zMdIpD)h!!rIlj)ArNyH)uvpOsCzp#g}WGd`EUdN%*?N7H`CjFIif}cGk7Z)518_#N{q$!#) z1_Hb?_~pT9EE?=xR`DxQa)=>ZCf?_BCJ-qT@6hkg*1V8ZrQze!$>Da>wN5UN537C5 z$!Ct$|7F+!an8hwZO6<;4#R@?6?Ibom0M8Bv9JMVO|{P~kWnq?2gYRc;>H)gyzLn&^BTIF zLg}f*^q?ixIU(MrQHFubj&e?)*Z|(YXL+MyR)pyjZ2pU15FmLVVr9e9sKSw@%a+k% zMyfo-$i>y+>t5JiF{Mpfu>d8FHTiPpr2D?{K)Jgha%p7vKjr#~6dgRiCpCQU8sRsj z$bX*VKO16G9}k@<81ZGxyU<;#b?1QPS5A>s=LRW}&Y4P-s+Wp?c zuso{!Cqs`?X;>9hYs+rBwH-xM7<=i#j6Xzro!bE3w(E&K0KBM3$rg0u!R{S0rX;?= zTKyzPBeX3hUQ*(b(ct<7GkO1zj2J`+@)r*X$h|aD!)U4uFv;=QJB~f&^yz-i25wwT zFYyU}3Gt)sqBf*yX)M=RO5Byx)w}oHaR$FkXrqA4o)sKzGv3q5u!gT-HVyvPrv5n| z8PUg8zUx*$f{Z-LfiFrh3XWCGkdFCu)-r#B{7b9hlXmO{Q|zURIh1}84g8S%r-$jE z`D|~DodAIg@_Q;xH&zgAN@HXRq|lkV*18>TvAikIqtK7AdDlPS`vK;@SFG_4wq6If z@mH4F0>AF0&u;Yd)9(gEMKGiGAh*zwp__CvNZwXKhTDehhg(SI9|lsnBNO{7k@PIR1DAR zC&YGMiEzM|9a#qomcPhTN*2 zFUUkgX*Tc4qF3}8Qw{5)x#y)ezJ`ZR3H)I0;6xK-y9bFOpWmU7X;{q_uUxWHxV-QT6OWv2pa3xMJ{&H& zRhh|+n+KL{36_R<$G6TzjI1r=PZMS1H{Oy10wK`%{5A#h@bu<#pSH=$w21UG9q-Ue zkjrO%ThF55XcnXLG*-F41-PvcDL|$O!yswEz?1?3IHCKL27~AlSf9hJ-EgE@{nlof zKuAfcBR~c;1~iD;H@&%FrDnxuwc^kepKaaf<>qU^A+m=U4k{tQ0){Dv$OTjq&Ua)4 zi+~<>I6#FcQA!~kp-Qs@V;7_}wS_yyH?#Nb)#)cX&_u0u8yW2(<6H@uJciU}iWCR{nKo1~SNl|J zM5TCY&lGl|gwF_|9R8K{IKue7C;cFr7Ek?uhkB(1&0yVDO{)SBF!a#_TB;PdBtQ|+ zXGS>%36#eOYUqZ9I?#Y0|36JN*mGa*+_k8I6LVyR>;}$r#H}OnqS|&Y7IMY^_gsV% zuw&vX3UQ^U%o4M-*>Xo&v;5k3J-F^bW1!tTzzXz~O8DzH>JM9#SKEUS?UtT&UX>Jn zt_J=~z;lx|kA^jAf=@@5>ZYnQ;_SqPdY)27DGm~R zNSp!7B!*l+WI{OU;u+hWTP?Bkk8S&3(b(172CfDYy$GvKsy?mp%obX7lV}k{*#u5F zxKV^rsv$+k$mqv$Ml-wTFq(#D$5wM@}(?yUecC$#d{qyB9t8Qbk@MU+dbA{cp_ zwfk;da5tsM!U=~BY^IqbBUsAZ=(aHdzyeH?=I5++HB6!^FfJ96?p6t_rV=uGZk*Qh zf0JsL(@3#yd0%flLj`CHTc>wwk|7x~hu=_-9f7r?)Y3$bb5l~x%$LQDcG*8ewe{x0)+4ZiVz z0F*K!5PL~RhBRH7*?kZ|m*d;g z<~*-zsD9_pOXx|3E!@5YdSSPtt*Zk59aR-5q||p|5mn6a-21ZE)8lPeY)EkydxDBK z$cs_=Yjz-o5qI7!PM-$dRX7O=#bAU^`*4W;?NDg>@Rf5@$Y62c6{7#+aecp|SYm7h z(86V&`EN9McY(?t!#)KxSYx{t1iXsI5%c8M{*Bv9kVcarSq~z&$2dy93zW8?(|-&v zB-|3;bJI#2*F_{d+dla0U*JjzEEUUg;AIe{Z(y{j%#;gIe^}>YZqVgl)=Pe_Y?MJ} zHAQYyEdXX#_R!M8Y|DQZoo@V$d+$U#)C`6Iyo3UKLNFv>+T&?FX#nDvzI`{ECLSqz zwa8}a7W=^TK>Zfq9`jnjV9=O14ym9onoEJ1MAzyBm2fia<;tZSNIIArKV20sLIif-7NgUy)H|1sLzk3=Plf@s*V<{UBS>omtN+hz5hrh zuEWl2uyBw=7P1h-U;m2G8WTeo<4PFNsapy>EJaG~B?|ExdbEhjEyAFt$H$>~4rnGu zRk2~F7E^+^Zc!GdTM+o=m0x+9_29mLXD?5!vv=2a^3*kV=Hfwf|Opp31Tz1sQ0Ty zxI`@T!85DMn93;=TKegNRJmK4_V|}~SVtE{(2I7OvCnxI=8(_;CikZf;trqhhBIv* zCUJFDG}a`E_ITrn_;A&nJx1M#P8k-SY3i>{C@sZI?PGo$R{pI`P$(CFz|}0bJ&s=>6o#6A#}77Xg(AZ0VgRRpWKrDSfUoyooR*Z~_Z{|- zORUHe8;?I?st46h0F&;+;7dZ=gtFsi?DsX7Aqb<{py#;O&7x@t#Fr?>1`mEa(0Zb_ zV3#0XFz`Jg%lpj9KhxbbS9~(0HO)7JwLrk#Si{~+Du@mJD9eAcSyvwV?mYHA)=+dS zjIy+6Sz>{*8}*VC%Bla2jsU4Mjx^%ZBpr;s?!ruQy0e!x)tBP}O+r=%!56x<+r! zZRHnhux;J*EG<1@yi;#5h|0-WAKG8f-n}NOKB~;}#O9({IuRqh>fUMV0`a>yXri5I z&|TF|`%=5Ox&|Q3{|9s1lvBom9aEIRl;7+2q9$>)yKtBhB(q?_M+)Qf+^*rjb&&fh zgod`^=a1usR8xdexO)PX?|ob}zOWELq4+x*oCA2W=S*n3hYUpwUW=df;+mSP-2@}f z5NJDY1B%-Z|9Hj;eLa}eJR{l@fbjh)cI_WJV>N_=38jn?!!FSb#g2>^8G&7`F3u3ymp<962%q{|>4LI@Mcq=vXX@2fW_&oq^~LG|ih{nCX`66TY3nkdWf}SQB2q z29y)=S+I5gKOROch~nGAR(l#kZ~MoeIDM0tHSjKQV+k|zSDjZyTNqxX{INP{DEd#Y zwR9~`ufcEU!L5*)aZu?svMn!cNB-yORm~2V(dBu5s?1W^GsX_YlWnfZ6-~&bA8_L`coick9Y;Jw7x_7vU4{!;tFP~y*8D1TB%34 zFHY$N;499q^k1$gF)bbRwAg&89oocRFnz5Zg>Wo}!I5K)^$SstOWaoG8OAN|(UUj&8d2#3zpaji{fbTm_gf*oL^AZJ*6 zi>FsxM7-7-KNRI`2MVn(xs zK%`)>+el~3>Qr2#(2rDn7PKun4GkhFwy}lG*n%m77Qz1}{~TsADrb~jG`p(#>nV(% z{zdrtTz^pR;lc-B`z<1%jp4kskOylkZKVjR!fHjxHs0@=N-^Mo&j8Hp-m1?UC>P{Clw3eRxNA zSE4syT#ZN&Mbgtdkkd4wfOQ4J{As#F_vA&EEA<>h9l{&M7f>K(`ua8He%R&vuB z({tziJQxXm$dwJ94$x(Kekzl47M8F3=>2q^cFW_7BX^{Vld&Jq(Cs=QUpg+wI$llS62D7PM z8gvLreCvrvThNSK3Jop5F5uS2_&{Q+bTHFn?Ua|y_t1OS3{-sGn=IE0bQz`+s-&iKn z>5^tWaAN~kLoeY*;fe}EA{u6m>oz_&*vNSnyoF1{yeVs=Uu)vZxl%fRCH;D1?#8De zS@x%S0mCBx2kDY6`7wJ8^w;a@U{tv*^j_z<>n$nROIjKB54i63NFT-4Mo;%SHf@`J z7S~sx^&t_Sow1FBOu)f5ap@QARF`ImI%h?R(T?xtfH!!R{Uley(Epk&+5d&gyefL6 zK~*dA4&_{rT41Am0 zWz*gPf2+eo$&R5*w54CrTY(W`)bPNZo72I?l$zlv-YlHT=x`2WHvdSUXCs4K{y^4c z_KLe&QUl#=gcdaVqZ&q2OG~O%2_c0X0ukZ#c}4Q^%wnNp0C@BF0krwCt&~tMy+wNz zdL<~C1W`PpFx^$yZZEaN82?y6wx^rbdG01{7aVvWE(0$Dc6Z0F%XIe9aAd7wu0TOh zKN!o>e^+%ql&Sk9vXB<~er7M#D7%BcKK6Gd3B4kmPu3&k;aH{C=(k8Bc7{?eG1WvI z;Y=Og8TYtQw40z30SCxOBxb4At-Xo!1wPH=DLIt&iTg?Mi2|jt{I@U?$z^pNm2A7n z{%-l0hT1~~Y&3jIJ{SAwk2|EJv>#eQ(4lg6C-+o5mCyl~p{CU!KBP{#ZRcYQm_<=> zLM(bZrwPn9Ylw#*ADY@aBN^qSt;?tu)K9oNgOCEdx}0$mF^{(sQx$ZY9WQ!I2lepp z-t}e>Mn1)6(TJ#qAUwdhhfLy`bvB0Yzimp&ovX!cONHs;!sxYD%Eh9>1>MStSdq#b zUvQAI>kFB~kCp60EtlLAX)MiViJ;e|EpIlH#!XvP*vKT7UYmHUt~mI9kEDs*XgWSP z{k;#Bw$PLTQb1-au(`bSe;N<3O_eV_=b?|V_WIC|s;2mjHvrBZgw7@o$P=e_Ws#aF zMtWu)1=ry4TRWzPJW6a10*ywsYZR}f_YhdR&9k$37vltLH*gbe6B3UQ3JPs<<;{q6 z!Vl<(lnRV!vRfr~>PZ9)9jI$RMy^=URYEzwFtcF@LD8TL`N`+`t9yukR6L3bq1e{{X=GH7QR(#9*s%vE01jnIV;ubauGlrF zDav7B?hJC;PPALi0!hk>BfInFvmuM(O=nBK+lD9xW8C-y3(@CgCSNL^y-t)Vd(WLF z(tv|?OtQd!?&{G^e|i05>eLT~B{({+UW$R z9cb%-*cYDAj~10jYn9>fbSZEQ+Y3 z{MQsZy!dlTt0pt3??oq1{;flJ4!PA zOp9_%O;+uAh*pBZ)td!xhg$HJ^x-mxZSa{o;YQWO$QPgNd=gmZte_9CaQQ-g)3WC) zmmw-26;lJrXrgUy#y?5mz){4a@ROE1i+JWOoVu;&3>1R{K^-tkyS> zFohlRX7~4S+KK|gs}FaS52s2W;Iax;K&$TBC~df!2xQI> zri!p-_eP?$ELb(od0W(5Wy?uFtqZ})lU#LPh|VQJV{!jolJQm&dP{hWUoZCGNX4|? z)h2)Yf!HVzr;HQf*OISUhUHCQszvai*=eh&hqzz=TixWsr;ARvv#sNk;(i- z2hYUdQsafHmTeZh7DYD9++MNY;T`Na(-Hn1W3X+u(Zs>3nD0~i_2Pf&lPwI$L=D`e z5gB|tld&}_OB{lKzq6d1;ZDW6%-mlt+~YzsK^+4)c++_o^jWt!s@kMTX<|QFR>;e*=e_+6aT7>mN4;)% zjo2w9Ovzw5Qc=G76VCaqhvso|e!L}=d94(Yb{`JJm#({Um?(zpOM5g{hDd4mCXZt# zoqi5AY;DX6ZL#@z=TZ?f9bWfL;Xn5D`}S)m_XK{A8Zv%b?UW)6XMs?QtHJ9|rWS+c z+18_S`P0OClF`PZK-<18lkLZ2A2G6i`Nr+bq3=WibTyw6*e|-3YqMd)Y-81Ucx4;^ zKJ48-A7zsk@LKRg`3^-;A>ZdTpA8^rEn8Dk4Zr1mvQY%8k5aTRn8=v3vucxU_WE z8O3ay`wB!7=x0~^KOo(R(t5Nzgk}D?JC4p@eEilO6v#9Uo&lpvsJ89X&MUjqV*#x_A8K0KCYGkc0LD;2Bn<#?4C_49tF6sMI)#v-#@9F6j|p#!aWtj-BWe<8`Q0roTc0@RSPXlq68zE}_>CASPHm7RS%1CreOzn+DqDDp0R*cE|=pgYEi z8F0lyK7+x|5pn9jcMjz`seX?a?#-WmkICgzJ3AR9!j85^e&tK5B*2PG+p*cRJ(Cl7 zr}nUP8FF}_xG4-y&7PB^{g1J&F;)v}oCj=Z!GFRkIkYQwbcAiC9{~0#LXHHku}05s zfgcFWpK0(=XodPvV8i&%(uh&FcxE&9zdl?>hxyK2Fb=xePqrseEX>W)xu-EkmD6u(IUgO< zKouH~(lJ>Ym`JFy3G!N-r&B|56>7C-lJ1TP2mIe;&5(nvBC@dL=(WYi*lLZa0jX>P z7ba5vA;M=0iyOcGKKOui9~tWagT{m4M0*>)w*-8g>#HGea`1fnhQP}09p z^q8Cnw7YY&dv2U6@GOSKT9q!$r2ga*nec+d?kMzjV1G}%&e?`c^0-}D%JEGVBcNwZ zvgehj*y1dK7#=@c(Az3y^^ZQ3)vlu@N;MDZX7J-t!}Zh`ZK}(YYATI?liD|z6nkA( zcksDf!drUoWGj9vbc^{%e+}KP0mt&8J%0ssqjIO`W{JY_Xc1e4)c#xmYed}BnCVaocF#?`Exr2KajI_v*& z7G*mC$*6OPk>P@PrrCatDcIc&_A5kf!|DS%^U~{ zRqvViH!T12p-jqx+qS!!RX%P8*sW=Lfs$#{ZJE5?H^11G!}yw1t{-oaSEpGR%jSgM z8)vIl;Ajw6dFBuM)E=pQ=lIHkRAgh~E}32*ofz73_fnc`C0&RE$u0_@$|x_pcwGWp zd^um!RaZ{aO-H649?iq7F>n11AD9QvNDlzW&?AwxI9#TgSX}I9W@|K4axSU(j+=ps z#n<8KF7>){uaAT>C**z#z^z8p+=g_m$yV`V)#KGDCfG>rHQzg$Lo^9w z*0sflS2s_8!1M$@#K?qTX#ER!z&;58fPerB00zJ$!tmdHq@C)11NzSJw#ja6B4T|+ z<=|O^!3xj*d-aAKI?cp|Q-i6owt3th^Y=iE&uho7>9#5O1TE$^k-DAc8xj;T zhN@&D7)@~swknDe-uK%yGK3a#469?9F(G6DK))fD9AGE{TtJD406+r3BqGA9g%~g- zVm50b=O!?l^_9O;5jKJV11gHQ;5?S=nQYg5jyyM`%b6Jp+h?;O2LM6{u>%lTiX??p zKWw{YKSp>;U^LQTnhJ0L22fmZ3r2N9lt3U91D3?glCqU=V4jeTa2P(U2%L8pD5A6BPy{Lc=mmWo%NJIGANJ91AT#ArqVH%P7Xy zMg&yBS@dBkQZYwZHEE8Y(L_mbAwP^`Y0*YS;X!M-6EF_TbFl}_fmH%@OaFufK>*SF z85%OVzj^q^Fm@Eya#X)S_n@SVN|`~q<^`H#k>;hu6IVxbpoR%mbj7lSm9;TirCh@j zGP8g@CZQZ`T3W>|b|`UxfZ*jpB?BouRIGy_F$uV=*()ecdqNyQ5qv_j>uF%E>-^cU z9P7DYrSKY>dKWI5H$uUWvnaETcHCH!L~>(J+>=tqtG3VVw$96MdbW4%{-a<4-tKns zeSw@{y*n@KDPLbNe{ZhZM&JD=>#^&yvTnDzUae#$k*w8aWwmIDT2(gTfmy|QMu&}C z^lAo?PC5}?DRWy9%>*X&%Y&#ANN_q1;5LA_)tEtI;-*s9gdPKr;-xj~49-OiX*IF1 zzfv?ezdkeLpd@({VK##b-NG%9An*s~{{VQ9s>Z@i8Q4MCOw`nKz)tAq=%TMp*X)7f zYOubJRV6@qa0RS7l&Gf^(6Dgr_|%kWlRJ-M6}|X#JSiO*EHxDQ!nT*#cm>fws6!z_ z3EAYl0L$?3oc{j|ne0wrA=6mpMhkV^Z-YC75nQ)F2A(?pW0_zbSkvP2NeQowh8{ z5U)AdNslN1v`t&tj1%;JNVIXcrFW}rt)jQT=;PJiT>75~+`{zV(}+PKYmu0IsFCI( z+mJD6s%W??AUQ`GNXi8bGre`~D>1_r7?_J7m7sy?6sU|Yn3m3tQxusV@1e-OZoPF# zwO211IeS$uRAc==qCx=V>W4NJt0@4HdqS5%QK-&d7l0}*iTXX85(cck z9UtrooIKc_Ul8x9p3(L85y zgwi13PCa8zsv7kTNQlQx>>AA7J0IX#yw8hW8+Qko3L1I*%F?(4NRt+x(8RpoP0D+3^Oka2*gZj>)rGhrX(Emu!Oee}{4zZgfd<+#-JnFva{1I|sM02q( zm7C*3Tb1)iT|byNE5!#{APfX00sxgSBD4XHpl@ig93JqWvCzZ0&0R{sx9#&BrtPCSWBhX1&pd zx&^B|xh$WzOnTNssIKd+HVpGj8?g0jJisO9n=xX^hJep=;?<44FRqAx93qmkzPEYt zv4O!GYzj!~_1xuY6!4UD4%N%7Zu&BMW~i0&ck`-*62N1$6<$iMb5w>bn~nq<4n8xs z^1PZK{I`%feAUN;1n&@-aEC8_j?o@dk!pWr^vBT;5`3M1+`qEJe+J53SeD)jn}#d& zj@j&Y_LZKef=e=;%+ORy7UXQfb8lw$D#!BCs8;sO{qB=aU&sJ}HYv%wIhd_gT3gXK zQ{yh(%sYqS?+$V~8xNo6$evpdv-4bYnK`+gb_9D*2N{{DQgH|GXQcD~CBx z7LmN`crp=$1R_Uy065FH{5jnk{Y>^_C)Yb%B89h}qOVY|z%9y`Di&cHmrd9ftdMq3 z96`ZgsO-Y%{}3O5m>O5*>DYQ;C~tq$x!8et)v5Kw*qeRz zb&RaATiIWjGWNO~^``m?E>HlF1Ci zcpYAY+x)^F>;mLL*%{e#=ig)WB>b5GI_<%1+DC=KKFrT!nEv{j1F69W`}FjA2i{%D zY5ikcBmh?c9TnqB^=i6-tC5jkcfY>{Up-S3D-eAn<9Yrt!E?-xHTlEsX^^%y=f$?~ z*{z;xdMmpncS#wg#ja6Zk+qUOFDwoHTUCOmP%{YTMQ>bh^e<8VSAX?Xdly$IQfGA! zHgnyO#Yg3r;K6@HK9YqJnjS4sXc@I5hH(tchn#LV?HU#AWQ&qxjNq%xDa)28^Pv|e z(b)d}usd@awn=BH;c-MILt`gmcF^P`6zpFP@4u_&+BfZvkHp7d+W0WL>*3x;-h!z2 z$_a&MQ+@54RM%;c#!GLf8%rMJv~JjC&i<0z4*q}I^Q{rus6?63VeOj3E{1d0-A$id ztP-Zj{BR^=}Wo5_b6u@3Yv`K=^fej4NJBuaaU4l;S5Ar zD)>q-^x~=%WCX#lwEzrMR`EmZoDgQo;ni7SAEhOU6?Q_q{mpD_>vmT zxA9zl+IzDa(uKUTz~5*)n{?j=xS1GdwNOa_TCD6GRK@|vJA08J?n${8r$H1Oc)X(q zXph`@D$fxC59thY7f7iKnoL!x{>@0j9tHAo96{H8HnIfd5ErdZ<6)+fajA|JX1CUc ziVN*2`CQXD1pD^;I`{z$s6JgEVk3%rFVdK6zcw4eYp}u0r}#meQ0{SP6Fw2$j4b8An4z7gR0s-oI&WgB}3aDSWQLvhCXZUIrKZ+_Pf zx>AR!+7d72_ueF#2M%Nd(h4Cs2aac-uASuevyj-xvSZr4Cq9}`7_>?SSClP9IB@eI zRc1`)X?fqb{PzPA*Y1Yr3hOca2Qp{^!s2tkn1avKQxy|Zh0MGGl%Eb@OaTtwAY-xB zyh{(Q0$x$|rgEO3dw8Mh8_qERPH*`?07gK$zvF`64RjK=Xap{Si%2Z`K$ynWgncc1 z_^;qKa&3)drx;w|4|}cb2CsFh^PU4t;YglIsyx=-Phs}tZ6a29mya*bL%e2M!IfE! zY>oVU;;L((h)+6b*D!$2%4<$EwfasduLgR5QOP8xBylx~Ut7&#!>%r?_3lfq zKyV{uc`^N}AG=`xe=8|AbbM$B7n^7HB1`*1NwiuE`$Bgd%bOQdCJDy#3V6zIl0)Rc z_pHY;4{nNs?^4Ikk2gablfl3&FCy}ooFCrAq+$xPJ`y~2qwNfu1IsJ5F)77kS6nza zrRh(fK+s~GRJoQuYyWHhM`1p^ugbR{sF_`j03T9eHs*#Uptgbe3Zb=Br$Hx9?PDX3 z6Ph6Lbq7d@pe0O--K++*9VU5xRB-k)Big2~qC8$>x4+v5*aRl95f4+*fbs$}XEH^u z3)~6T2ZOlR>vfke<#c(b#h9L6uJW1mFO=n%WeO-6++E&s&CX*BTa%!b{vEvqUx_SQ z3&eaXK~zkv8IMRcq%?6WZr+B+;nm+teAmxA_OziN%6IKKn0lJ#i_qq=^)lQp+;34V z!b|P(YYANl=ynHKpgtaaMvGwVQ&#o0B9Q(vW0SywBPIogtsPxfXr$qt*-`Frq>N$$ zOC9T8`jec|*mFA@3C7`)0E$*Er0MGpEs7gR?w* zJdkf()Vu95$T+vH8A>iDf4fx<4LIHRrY)4Ylj1d*7_3&k-|e`Tlm}~0I4{yhR7Th| zQUSFA%{|Bs0JSJRT?jB06N?PQ9Ja$zD;G*a7~$B)4zAbcq-5ZTJ?0n>#q>fkLt15> z!Y~#`Kl6>?me=ZC69b||$}{WVNj0**+?bpOm|LcU38ydWV>0ks*C(4|xyMHcqBMz; zkL7RCh3N!9+svqVAppqYY(was%$9;npMYq}5knfL;lG1iz`N*or6khKx!Hl2FfvGt z&Z*`~L58*X%IZ{zA8acji8J{XqtaIui=svTYR~gFNzn!CwzDETgA8Hkm5s>H|q!(t_G&hV<%K ztOvafv$A`aZMwGCCTgzzVe|gJGWA|5u{6n+JV@vIhD5~M^oS`6nzhuW^Q4^A~mhTAGd3*MSvzHcL-M_k5%A54X zMlZcZ)#!h1`a9QQhhg_{>$%|p$0EFH{2%IW#R*=ov5jI%f%k!3jc_!=!^afbdS zFC1T30{&dkTj%_u=P7dfd?Dv-fpdSTJ^?j8d?E6!p@{7t7w&(UL2mc!a(gBZ37>)S z5zM7C0TB(8<~1!_FJ#>MQG^$uwk*gn>lSgl#UlfAm)t72P%O71!o%^Ffb1i8cRX5B zZr8$vm*4lKV1wGI7fiIx6wC2bql}=90#q@W&jT73RnO?d!dJ9RfY!@`uki%T*x(}M zs@_jqQazG##kH7px!N+c7dc>3iRlHU&s9+<1*NZpyrl7at)j4Tb5c6hNJ9Gv=?GPf zM}uO+t?G6VSBK!d&4Kq6w!;^Nl*}qq_^1VX)HcD5gFD>H?dmZ{5e5&2ZTPReAVB8i z2xQ{Ss+zj!YJ-mJ>@a8yNHfHrUe~$*JZ^r>hSng@fZ%tdYYpYdtWEn6NJk9hn3xCf zN{kZVNJOA~OR9S|{cG~xaf9Bq*n97?xrDc1RgJ$n|7nAA?02^A&AS@6dNLkNh82r0 zJ#rIkSQns1Ojv^>+Qy1uAlgODPP1Jh3!6**4JP`OfK}H$i3HptUNu|5pA1f1jwC!h zd_005FKsi$Lpp#0LY|7Oh`ox>jXEq=uz=oOk60Ro63(M5EIc=(&LOl%lY8>Z43#dK zV-Qx^GrP9`hwE3E<0)X=5-#Mg(Gm?x z&i8>F0hrBd;L0z%Nd?*aG7!gyjI9&u>mh>@NVL`qh7e{Z_g_bWz+)O`c!ak(+(rwX zA9BA(h_~mNf?*$Iak*RytL&q093~UMp$!$T8i$EbC7-~yUU+;jL!U9}P}uIq{H~O# z>MzRt*h`dLb1`Ts__&hpcxE!;Up=|chf&em3efjN*`V08+5Cp7r{aX)oXx1;-PEi^ zoncPFj`#Pwqo7w7Y2_`yOZ>~Y~po3(n#o2|_2^1V-P3O1tQo@Nt|MI4&@ugZmuE9JmbUj7ycaDi+h-nj z6*taA{}~?J_j}Af2ki0+8EVh&>r{B8w05fonG76lkPDO#@B0cYa_k#|@>YEH8&xDy zZNQ^+Ctm0H){^zsI!KT%_}hu{UG-HgkeuVi?{|e}-`m zuDIWa7Ny0b7{jB0Y4K?ze4^8W$n8r}$gtIInf!dxo7-mMooL&?L(->q)eaizln=>V zhLj`~txyFa)_mt}p-Zv_EA55hSC7I}mPmuZVecSj7H^?+9^zO(N-R~1BG|RfCD9Lw zg%AEZ8QiZeYIZziL2_;Sj)LuD;Y143)>k=bo`etBoG!NQ;{HDj@$yELZ=u~)dhhUH zdydRSP%{^HtBC9qYHDdv%;%quHxJ^pp+PAGM+_@Zx}$UTCXBC74ZWucCCTbiAmlM3 zK8(Mr!90s{a^-`6W2~>A{XB;I6w2~6@Uj} zEVN1e4>EqwBSt_xw&-Y*LIKM@ya0!X{O?&M3rutV>>qhfI|U)W zN%bH7atKFMO@NO%xa?vP<37CesdMCptNk&PPybd>jT({m|A!?t(`NUZo*+ZKoLq#D z66r^eblYm&XJIhO4r3pC=$!_@Mjy{lNRWkze6pRC5#){eS%5>xwld?+$u!BcLl+>} z?{rss{(y!$F7viR6oYP?w+t0rQ9GB(br2a|E@1OGfBw2~$Vsn8#VNoFoy<6t7elO|Pe1e0z!3{I5VA7h?na^) z9E_0{8%fMQj`PI_+25yCN+TV)$8rf9Aq&~N2yxPFqTc<8b*Ec1yeYi^RelkDpO>il z>>6M??t>WyVdvhD}AIWt=mS3wVjU_L#&XCM+)1jqZIGFP9 z#}H1LA`t5J1P%Jsr#FQBi83PE814sX$wusJF<8BmmM^8iW-2$Qbj-SYwh3hlSAYZ3 zLOZuKR6l;P*ACF$VL1LP!Eycxfg;<% z)=p4IXJ#W_$O>SFX)FhV+eojKT8}?93JoZ^6!d}xxj5#@kI6-z|G493I5>csP5J^} zWVz2W^*{Yh-yNZ3L#LgQ*f;=bPxi2wXe-^7f(Qul4y`qX08!%}={8nq>tkC!6= zH0b|-E9jl7pYjHk&bo{XB?Eh_!FLVI>R9=C$YB|sq`)T1M4@^e6kB3>1O@icR;P#c!dD4k-Zmc{>GcHm>) z%t4U^P~7I}yXqO87dqGL3|dy8OJf`yk_`IoeZ0V4aGZQx=+YdsL6ETxj-E?`_Jz*V zy_xf$mk@^$g!SC@(~n1?UK15coPjWT*IE#;Froi!Mc7@=sy~ z1f&x%jyq=+N>HoQuk1+<_v3sF)voo*Vcif8qjA;Qtatf9C_CrXzvJFU06^HBZfuhI zQJDJbNHhZLzN<}jJ0BzI{MKiC=rzOAJnU6*i}2TyeZy5#FL0pquY*=Hmj8No_m98J zVX05m#xNvOS4kqmMhzIO-viphzNL5b=&O2!^2{X08^%v}>=Ar|1!aHtqwCn!4XgP-O78*8zJv+_K-Rkxs{Y zAv%fKE~wxScznI+?ENhw5&54~d&qjK|Huw5 zwP)Y-v5n`veS1u9)0$U)6$js3DXdp-XGOmWz4gLxTe6f2IWMZp!e-NIzBj&chg~mJ zIliL&4IfM46lBjgQ?{X=Qs>8VL+8`WgvoD*cvzBEP7zNv47o-=oWDH}hb7~0Dp`0n zmXyOR7G^VlRlB%3ko_L_VMWK|1JDD_7itGE|L;9smM-p2N?l1TZBd)|iHxVau)fW@ ze|aTS;wsEco`kD`0F44K1zLyP^B$58JW)qp=wFp7<|`wwwpZtZ|B*f*1Ek>lP|Ng{ z9IjxE`5&d(*Lz0}SgD57NN(UeJ))LP9!Q@IQ&TZU7rr^EMW|p^^oK3dHfJzZWvObL zkMcw#0wp;@t@ebDR(;r(C#*Rz%`9Mfv4QOuznqBw+1Ru)bR*ObI__G^%zP0PfMXu9bFgjr`I0no(1r0skO27fE`>xDY`FHVt%JIhu(zofy#!NzV&eb1^V z2B`+M>~;F<(Ls;W^x{qc}8E(*zsD87VoKmZ_#!v$h2!vGdmNVSw{)}-ca z?UkD~$Uj&1oB#kN5Uh8eVSU3X2~43ZT%|t1z(6nx{-`8|Rw@u9Z~|7yJs^U8*j5+? zF5$8QDFENMYE8+~2?!sK8W6;waRhJ|YsB0gkh}`T9R*52$RCmj7DEDz14cdiluh2` zdd8`X#{X%3pX#F03Fj76(hu^L<9baxDn8+(Du zQeD+#2DTtA2V@>nx}cxUM%=)U1v1zMUyt5dVuwILht!i?J7q?!jg3k3PDb*(Ny;Zw ze*N3#KXva#_HKLNTXb-b-VNFJDEGi8qt=?5XZPl3wx(Ou_iyxi>6)pzzO7s5)~qC{ zewEa`)zVU{oh>j(bM#wOM9%Xy5=3b@NQso3+WPa3rAVHhr~*MEi37sO*7r#VYwXc& z6vAYbR<5)bkPjMrjoygdSs$pr7NQklYZ-r!9_MlGIc}o2(~8p&+9M z2xk>Q+Jca5>xkLNam`s@5VLnN1=fwdv1+8kWejVCQb0;Lk1HKet{t&uN`iIKXS^Y5 z{-V8TP0^vv@Q$c{exSqrWEihCm^plPjdEK~OW=f6rwM4xR z+$2rvw1wy2D}Y97C#S_-w*sj(z!kaYCQTy%EVfVq=vI)y%cBO@U#CA&I+ zMZp@kkodq%vT2n@XU<2xICj*z_;;$AA51RAvTjk_4BQn#`o)m&fHKA?N~%TIqYnpq zOAtVSrz6F@-H=^;dXow&i!I-7zKt~lf(1*!DLRG$TasQE?``_lxc+UzY)%ki}jAJURt7k`kNZ_ z_icYI-yb>7iZX{kW4~L!3J}{x3DziCU+~)PC*f;>$OYL(_CiMC!zkO|ce)*{m!uwm z{nK8(O&dN(wyoz8nC#OX)n30x;X7WJ4Ck+^b0{_SoT)GWRP&@vas5CrU|oFHJ;oSI zww`FWfaN$H5Q}L{bc*Su-S;; z8@ZhX9w37AtXlmRcEh>IhqUe1Ojh>d==5azwt_OCeOfwn{Qdvyzr@A^Kh;>^bwR@X z->%9C6@zd2Q+%y2W(cyMYX4CTPJ8c5dP4Qv0P8we=`vL;yfi#W)wfRr@I7Vx5g@$; zUe+4Z5O>$DL(zSzDJXS`Tl)2GS@!s`ZnWyUSVn>K20F~Q!1x&|Uhus0;0aqVEgs1u zBO+#mz9adq%bf_eg5Psxt>D2&$r<;%BK!;Qf8MfRAO$QU>IzF%l>;TvAlfew3PixH zk!ZxJ6K4~!5cCE}W#qA__JM?pcXR|eid)X&q6107gnwJtbapG^)=%z409+09%IUH* zm?fP)Wq2v>#R`_7V*Pr@CpQ_OOkhyJ{N&=wCO}p$+73j}UwxefDcT~#)R4R332&an zYd$md!Wg_FwLnes06f+}`y0$1u}0VsMu8XYo`9=soJ?%kOcHXIsy$?FBH%wjK45-L z#!zXWu%UPlGTj1$yr@RJss@B3g}t;<1(hBDx0pEjRK8^R2*eKgG5)<$C zN9>7j1PtGEc_DI^%M>4`dS2ZTDyyVHwWk#=Iz_O2JV|qpl0U@8cttPq+dVAnlp)PK z-*H8JRoRmHO8oE|sR~i1x`&Kyiyo6Ez#G!)5|(@={}@x1ky@*s4aEb+`SjNeEsU&S zsW8ifxm|hbkyQft{7lYtlWz#->I+anGlU$koo>VL_^zKIK@0@azh|!-Vld$Kv=xmp zreGJab27U}L4|D*|M&_Tkv`8gvPd-!zMi7yd(94_GKW@m2j3hD)Hv7w3;shOY!S9FThr< zH*a3b#;QQl|z zL}|v-*eQW~1!T-(=56#uR*FLqGxtDdod%;`u&X3Y*scR$uZr>S)=mQP+rf?w6P{T5 z_CfJ}F668>`GmMm>wHtM4Wh@HzQpKVT&p2*j6&KK4Z7qW*G@@{7-Hi+B z2_CTM)tmU`xr8hPJ&K`MNydoKvinzX5O0euHh3bYl92~sIm&MN2gl;!i$#UXIfUIW zL-Ht$J@~KRX5z+A(u1>f$r5hC+N_l=rmXQm=poN@uwD-JiqeSIr0h(~nH*PkVG*>> zG<)_Q)I8)q`4`}h4)s<^ITeK!w~}IyaqDI>N$R2DyF1vEv$WVjT?U_7YYSX5Ktc4| zEF#IOx1n_SHsggB8={T}Ua_Dd1p6FkA@WnX7>;r~Q98?1$bu-FI_h+-v6{-D9~6mg z?otCMb`5arP<2i`C;Qs{+p=F><3YN3ReL z=sO=~&Fo|#8{BL)L`>C&vLT@A(RX~jiy{G7RT&mQs-mGT%dA@!*V*`>+R0{a%f@47REY`Y%)B@>$7Nc-Lg2W!(kMg|^6uJ-p(eQIeH zbzP^giUD_+MX$VR1v_FWN?S!%D|J4o^ANQ^#yu>ONh!UN7(z2gOl&FVK|0 zVGo44UE5IVT$@_Eo`7C9IfP)y>Jp&E{+-MC8SiRpZ|UwAk&NP8fF5 zbqTJ@>98UEzGub{>{@o9_8SoCa9O>VS|a_V;^GW{kZN180fFE*AZmVuaZk&}G(-k| zF7kqGD6hMBw!L@vDc%C!;I!Xi831kNd&R64JD|$Z$)@;yMrb9+S|$Qx^dlq((uvG5 zQvBRemF-cQU%`wGa3Y-Jfa_1>nRP}u3!v#O z1kDl&Fkbmfx~*x5tb=@TZJ#tDaosZuG5vu3V^Ev`-`et*CWrT|O=+C8j6Y;#Cm%)^%A^gKv zcgl}`=d^?_WQFjy@Iu^-sP6u@3BJY~@qmY2dhF6%jEc}oPy=OxVwAQ!<3!{)RIY}@ z0hMQy(eSt?HyJPfO3^2RVi|i<*w}nF7+rk+pkdYXQTBV_8c=*kQnt(z2b{JKjFC6t z9-IRcBzMJLz*d|p1O3%$deQRy+#py;S+{^+(tzJM zdG=c}NGB7-47J_6lx~L5VfsB59ir&G5RKRa>{Vb1BLi4b$AX3<7>bLl5m|t0W2x-z z&PVrirXDALw75EGE{lg)_G0ZLpMVX%O|vu?Bm9DhIn^g;qtzv&E|(8x0#*Bkc^dFH zxL9aTmcStX$!jD~&|3q<4EnzS)Fr~f3*sT!WMT-}%Hl(WNcc=gj%{kh;K95_r@k{_ z<%d}9i3+%R%#~)-BRC_wR8$~YDs+l`R10^Cks-qkkqp$`kl~;3&kW3XXc#qkw3Y&rsQ$cgt z0m_)`HD#!D8=pG^9di0ieziC7+N9kLye7Z><hoUqT> z_%5I7aTYs2Fcw&!rFyP38TjX!TogifW=@3Oyu~$g5ui42$;*SnSIc4VPJc%RQlBsE!imI^XM8ldZw=GpZQ9;Br{Lp+Z^pml0LBRlgCLl5= zZV00mcnXwKI|m;=m1ppUJoppT_KrgPvn{l%EyoqZk6>h;DA{+pvn6N*W*IZhE9@LS zVc9FNnzPsVlhW;aM!GqCIt`L<`?_M0rd{5OszRhTl1RJ>Zx@^G$sl-9^ z*xuEex7v_C_bd)apYMr9fLUbH@|tM67Dq1AyTP*-UPfA~^J{fhhJrLA7k~qpHG+I! z@S>6K;B|{$<<$a@Fg@`XM*YjbD11Q6RFvj3;@zYVO>ozU;I5Fk-$asp;9}2aa}T&C zoNZ|j2TpTOG|%!IVE+8S8BSl;$95k4qAx3|ZYeZq*#$l7`Y=)rP7d(|_%Jzdki8$l zQ83}?GS5ddL?8ZbGh62CtJqDlnDhfKo0!Ty$*fhbkATExiT;=6k}~NyPP>RcrECU| zRt@$INv{neVsGx*h{&R=`jl$F)7>6-Im_25x6NT7B?kKFWl=z5`?#cEGlh84u4{ zx*LneSC6oJ3)#5P#taEPNGX%;oUL<#6N}7nhM;rteDTL9u5n+9@Q}TWP3y<7+ zR}j@q&4v46bA_uym)PkE!gXu+i2MV7aN0KUzS?7EyJ8?fd1R%4&77u<=UOd%n0>tNN-8T*W7Ug_oS?gPdC6IlF2ZTSC`5iQLmGDXn&#&Y$sj+@x7Ly$N;ot zj0yS}&=m=S5oB(Ut0!h0PVfyeZjIPoEBOHAY})~-uqzJ$sovBMgt4uO4lkDX5~pC# zeFZ_i-@hs6(G5sdI_H3}hZPeC=iiTbp5IBqRHHQ92rqH}lBZ<`N7jzU$)Ms_AJL$1 z7`kBXDr}w)bN89N23GH`KuStCVauSjG82wTvYEP5C#VgVkm@OXXa1E471D1O`%189 z3ep6ACVNDS49BdG;gJ9B(XVyCgb^hzBU=^72|PXDetindTYu=UF6?Oez0TyREeUdj zXzQr6;r{Z~dJ|!py2Cr5UHX`fE$)C*vbOUkpgPJ=X5a%9a2@THQyVt(@K!c2zUF zpM%&iYj~=w<}A+Do@)Oqlk;SnL+tNCb?E4RKO$ zVC@t+`H$H(ti8qrDTq7gDkcZBKX9{B8lLXvi*tCl46VcOdAlWO%7cY}FDm0ZCw}vW zC<3r{Z82}!-N?WKXa?|v`wiQ<2OdpeoT{I}JY9h0GiMGOv7d8M0J?)-t2!iGd|(qu5sUL*63$Tz4TA?1Q{LaO7^VJPw(Yt2MX(pgmb zcwBh`B6x~FH{9Hw)h{=|v_jp#G|6S?!2)s!Lqo_9too;SpOKO!uKj;<;a%VW8@ z`6LU+?I3aji22f+e1!NX7|Y=M1@!4;)3#S+XwdxW`C@#IWi?%zJT2rNOf+oGpqK=n zEc9k@SRgo2oR&qOFAjZK+ddtXB4&}!F7=&kFBq3HF}MI`}#BF*0Tq{8CPx9&U6p^%B{ssWgaeid*e;Df%d z)|#pq{RaGaODI0%37a#STgJq{B8@_HSHZDoYq!-{x9^*vVzGeR78Ia!mY%b3P%M`z zGJ!H3jS_$53V#ZD<%aEzgI1r3d> zPZ9-E=jQ#ILofGb@lBR2OZbV(@Zq%hduW$c2sQ!^Fp^3<^%U?|SsGI96ZjcG^j>gV zT5-CcG5UZP?*p$(&=u{2Dn<=Uj@W(KCj;(y_x+?& zL_Jn&MhnN`R_I|J?9%B1w?iBdlIdW1@;r(jBU8$G@>T6;qR`-3zzcMKYB|k?81{cgZ0r3#@y1!UB^?9TeNa_!77 zYhDNACQoH5r_k+0E?1i0tKe*P?QxhLe6%}wD@*AYqp^AM9EcLpl>3ax)3oC3%TGab zzKTd@>dP296d4i-K)`Vy6{|LP8Ch^qpdrsMZ9)mGED1QFj|k!K)t21Y^RpQVO4 z;Z6bSB`+tO#mI*SMs*Z=Q8_JPrR~VGKPS}E3J43*wq^mPVp)D4rf$N z40Q!$OF^1Ouc~wFg=!WEPoOW^)&)0y|zW;E?5sWXrI6f%Et? zo(a$_gb1)HyrcBdRUUBWJzIJ7QfC)P=1<3E-juzz>a3kYBtF(s$LZ^ciX+GTRQco^ zIl0!@JJ?dNuTqQVqQM?C;V54T|9=?U{%k`c?c#FiGg=uJ2QQp)$fUc}M^v6_j99JS zq(cLr8uVsD5ef>&tmqeudMb-wZCYY>?sG(>JX$()~C=-VjU1dmuB&Mc;2ykgWeVmjpJgonx_=cug;<*lRlPAzBzZ8Lg^a3>D=wt?H^5+${M-?!7)R5dgx#QspUoF#9f{IoRf>Jpib3kF zS=hU!qQK11&$t+RhR*$^fK>{!GlGsiZE+y*aVSncyvI|3Di1I;GxtMtN3yDvs=kKB z$!#sS9=mpJH!>A|dU^7p`+4CDN#2lR2dJbTQkTnMuxap&!YT4EjOQR@^k zUIl@Gz0i({_Sj={(d}+gpTKV2J9qkdz%HP&cnt=rca!IplaRi_WJ{AVl9>(&;zynt zd}+!+F6=w&{2*%61W!6&i`>fr0&?p+sH2Ze_sfTIWw@WQdAl-v0uj5?21lVDD&Gt|M}rc_Iv*kOCJ+HG%#i3y@SiSRz)B9*_fH3-NZ0!JolV>;mPb1wf=rkK^+R_dSB`q)a}J z6N*?oD;}r!-yHJz*}34YFuhK8rI`6`qAA7?Ax%_}MIn_e`B$2NCA{dXAfHPsD(9N1 z&^&8H!Lh7vtlqn78UwWS&4h#~IHYFJt4k7SY#vB&-vkk++l3OpyeT-mv*!C(t#ver z4nXr@o~m6w4;}cwrptlfrDB?LOMz_Cg1cWGb4N-z!e#!>JBE~mF`-h`GC`3C*S%qrNm z*^5K;a$9Ew^Uq7nA&;EvjfTcId~V^bU5#{iS*iv+q3R)ZeDz2kvj6Bf@^H({=~vFL zsQ{#4LXwg!^DFmz_Pm_KX`^@f!GDimc^Pgz{l>a@Lsx(F>8lJ++KB}D_{Zer$cO7q zW0^RbOes^){Cf#w*(n%PmzRhBXXW=}RLr1j#4=pDxB-^0iBe|@ZIw70-8U}VnSf<* zUVW4c4wMsGw8XJhQDomO&5uMh;w7CVvoVG>EH_iJe$ zA8?yzdC5q>Ln^-7!v9{GQAf_~jhynctxFI_@_53Helu#8OS$bWc=}onxU_1PJ!!7! zaL#$Y?20V__UssfNf|tZQ1LX8g0Iq*0OXJ!-EnwWv6|kVt%fRJa%-C*sZ7m3e5_e~ z&fv{Wous4G?BTv>aZ3hfq(JjKPnja@b|+|0{?N;UuE}vhlskd=Gv{di;mAu#@(m?{ zQ#@Go{EVR*yRR*O>9V(RDA_Lsb2hEo^a;m$UiC{#K^z9{#Yaw(abqLFx6M<$RMik0 z)w%1{@XF>{OqR!W3PU5r-RIcYY(pc$>!A%OAa0}W_5C*6^YbK@7%b-_Z8xF0a_d_n zW+n<-kb2W#vg1g@~P|{-2fgE1K0S5;}f0jFgEeyT8~tWW!~XNwO^c zBR%Ytv~M65T)ySJoQGXBz;X}}0{{g8GekEt004hvaG9-ci5U{SzeYuxkrWJGw6rvo zP?Vf45Z`+=as`h5c3n1G9NPv{`}dRl1OPKcU?TtkRA5`PV&Uw~Es335=lZ$li=WT# z?!nAr?@j7<&Tk{t(S12dg6QfvjU-RiK_wOB6#|h2Xw_9oB?-`0DxZ}ELwS7VRwX{r zg-+K_MXt zE*b?_2AbA`%{9M6I@6#7iD-xcQAmI>8Hu(DnHyxJ4G8AeIceP>H*EJQ3R|Ki5R?cw zP{s-%j0)0%LWGMz07|2Sm?9DZ^cVx5unZlD5g3tF@IL~&90$t?ffNYJII=P5!w4i8 z6r@vF`X1o_X*d>uKjeDP5gU7UpcT3Y^W5V~4xjBg2q45U0{?`nesjdoo)9#Qp>%g| z2H}JtqJToCkPJ8kfGJ5xBgrU$Km@!O2nUc}|DM!UA$(eegn*t_1vvry!Z;M8m9dNj z%Yji0%J>kO(pz4_rc#2+I8f5UgoCAp2wnxdV3Zw7q%b5XBqbOqR89#=Y8d4TjKU^h z04ZuzOe!Iey?+W(N;pV3*wXk;8che*j1EU(3#9(}+TL$+xNAgTM4_1J;j0yFYy|EO z`8bB#UMPb2&cUvdr`#A=iV(1(Co-))`rg)t0&8G?b)Y4X2_y|YT8#^mhe%ZQ4k9E{ zrlsv0&(ND9qT1M;PIs>m9b)v{alNiZUMuFnh;b6e*~+7M4Z*7Ztv;6hTw1ik;H1cGi#pmfz5gF4Jno(d^!w&Xyp^#l>chS3hZ!6}o zkYE4|3)#_Zr)>y!+EAJ+AfsPJu$up?wNLfCD5#yi@cvFO)r$i4``?cqy{QYJhGJ`K zPVY_7ZcVr7t$!lV&Dl-OH*X!=#fD`m+ow&RQOE`&ejK52`!UqVuR@yh90oQ3vfr|&TyNoUPZBohC+sZ zdxNUIZMi{9-@1KRq+XPP23txg!qwW+Vf?`LX6`(`ZrE^H*i!ThEjIVf#Rghz(_*3A zZMM|d(L6yB$o}Fefdj$BTSvUQ8nDuWVAK{xV5pQ7;sAifpDxNMUR;?)TtupKdyC@bx~@ph2i!4itw2~{TC#jc6t=ytCQL0R)5AzSA^7(*0dR^5j6qp+9=i(2 zu2~s*Bz6SFAlGRzmJ)4d$r22`8hn+(z3NcAf+S#)v`BSF-iG?Dm#wE27t}gtQ2P=f zpa$k*JXgxALzL=qxm!N+h5Dp;TI={^?#+nPWI%EWLoAN;_uMErf@nvEh+%| zeW(v=w7VMjO&?SM89?ooE0=`VGtaEwMJipz2&Y`pU z>s>KN9h_YHJmr7Rzhe^d^X^EHg0%3C>%a>mkgO51sI@ROC`Fu3dxEH*uUV5?6+}r$ zpy)vz`gRXc)?<@n_Bn|~WJSpL%$G~yzkY;rPTT;v2~g9#PF0kfk-K8GhVAAH%~r9+ zZv`2>!d1xZ3WzM(axlpEYq~0G7dK5cF0V19ukEJ8Q6L06HJNL^n*j23-1>XXFPDYi z+C$P2tKFPX=4bPkWTtiNG!PT)F&6+_C({cU0m3EyKG#S3o2nh37;pg>=}lV|1tcY? zVZAkwPbK~yDZpPlK`ZtnO2D-gyBrg@A+men@K$Cx-4(J3U<8@R7L+o;)nFc4mnk}U za!o@1fkae#Gc^7CSLnx^!A0~@wW#|IC?#Mn^e^0jn-ThENl^e_X=o@4;xrGohVzZR z`Z(ppUXA`Eh8+Bsxq92bn<6$v@Y%|L6>{HTRN({AmN`p#|Hxc-Oo!}c9WMa39>vs} zKAR`TtevdO9J}2$I!iyrJAkvcg^f4?rfvmG76y=vZpo|QyR9s%lpRF}IgkQ3bQK;X zUJF7Ag>US?;WbjZ(6FB3SMlBuOY5A%?wg>qX?LoYeQ!OZr%vvv(7{$40`mgL_QWr7 zK#R^zyx~={2BBiWGrA!fp|1rP4<}{+{NMkHGHL)gw}ArRSg-HxXjQ)x@a@TLI%a^@ z-`hdv#kAtGzZ{MEB%!6JEH66c)RO~&bhQt!7<32Y#70Epb`9={n`8+6@E%28+lp`h zo{?$gfv+0~4=>l6=Bgp|DFwzIV{_kkd^-K4SK<;(-rR!9CI!nN58v0J_I-=}*u8Ey zkcz`s#sk)M*OV%ZnObf+^;Z^Spx1DBr{BF7K2u%=!WyLzwsOdPiuoe^phz!n`}ca4 z^{QFtyu&Qh`E5`s={C-&VCyW~c2|ljxl-EG(Qxr2`?9pxHA(90jotSiEm-#P_W6o29H%l z-EMNPpv|?6TpM}qfQf=7S30BYFuCun_Rjyf7P~hTyDwW=a_W>Cv@?B}ARoQ2;q?sU zR^v8M>(mU zzPImr#gsk3EHy0sX9RokXWQ7c@BobUV4J~cza3F-HRah{B*p6ld z6<>p#kfF~6z75rg*X1|qylwu$8VT#%cn7S#4IHQR5?rKo9NU^0Lx#i{sp3G%?P3o6 zsk_TF=YbH_3e_$?cYEhAeseY#0IZ|;7! ziWnY9CuP3}PHBO*^)NfFJ8dDVXSKEbn&b<(s^PAJy8suk_+wllh;Ehw4f$M=d-d1T zJVvFpiFOu>LW0U6l;6RDom~t53wS~uFlyZsz^AaSY#NGtL0=JcP(s$f(V=r64<9zX z`ZSpi(QTm4o_~bpqSbL7!%oX%t^a?6U0{adYm|u${ZKS&Pe)~AkDc=8r{lKJXvF|H zp+*Mh&>x^qh-)Wn+PK)AF{u|zp-PHSQJ5ry8EC5@x~z%q_uxCRN-4@HQB+J|9B{hV z+RqLS9d;~12$eJMu;Cf;>a2FMhw1ODz0(!w%WlW_u2>B0k+`S*fdJ@R zqrrhNMq6bobA~IvPq3o8?h9ErjNQsO$l7xyUF=>GIAOXt@Wmi|u*;5X7;|-5RJU~) z=iU0-eG9|Nrb}Xbd((Q0MWdIr3?PHTC{bdAmhol**fHxeG{u`~#L3?8CWhbM)re9U zL$2)D@S{BD2rJs_%_wr3i|ow~>hFu2Q)f7au?EkG2s%@58&wNDzsO+1y;v9&>@c6# zGj-pHLsQoaDr`vVkqUj8UQFYu5_J;lv`~kZfUmM2-2PZ(34^-Z;4XQc8u&~zsLH~@ z!3CURA)$(lnY&X7PX<>5^6<$~qJ{g;+v9y-`|+2f!7#d9@%;z(Q|M+Lt9RJD?BZ|k z?@+Smt5frHG>CLq?M`-z&4p);VH}HBpWhBPBJYkM0iq zol~+X+Oh?gZQIsfwr$(CZQHhO+qP}nHtzX(O?VBc&ly!QBS(%@(C-tWkIxyP!3rbu z2RpPBG9!0O-y0atoHtl2F3CS}q8(5S+A~8isg99&c4P!o7e~H38`Kdk0&U*U45R6T zenII*>W2`F-3HE)VBMaCi_ftfYiV7N=WJ6IfDiamoqD6eH0Zex( zMOF@5k$%jwkRe}f!0;2R0=Q3mncMeR(!SkoC9-~K(}NK~$K$hJc%P~ldGx@m8@9IE z>{Y!>y;V;VM_JqER?*tD?9XX3i9f(g8j&^;XA3jeof5}eBVKJO_uWqAB#1IwP zG$HFvLDZ-J3~l#Bskat;ld5ZN*KRIb947B4{&*-ApGcicrr=at;`fk|+4qpRbe&l) z>1(0t?xp6&wB0K~v*DE2AzR>L=o@UG>~diPflmYmt6srz8W{w#w?!TWXlY*(_@<^( zIb*$`v~;accTtWi-=UcjMJ_7_-I%%8e}J^@=%>GQee(%asF~ke-#>&mvqO_8JaklMh|YHIa^-eBoili#u9oH?C}3J z;b`V=1#)<#?O$+wD;TfqgsT!1&MH0q}*KwTrm+)|MQ`UY!Ia>p(pi>WA zJ^Nl>BX{@WH6b%>!rU81hcl%2?B0V|$sGaU^qjGU1^xco0{f%d`rUgcrCmE~W!KA= zB|cX%1EQ^Tq`weZq|gAX)8+VLr%v@zBV{C^xXyNpYt9Z-Ew=K!`4-YQ&dKiC1n8Ezq7NCzOkM{0QaRb&X_f`s0JJSFBucL)eDL zJg@_37Ubk+ay zrCu}7ftxh+C!YQSEk9R3h`ao@aXu|qUG63Y4@vK-A^i7soH!PSDwe$)FoeXgdPOsa zzro3l;f6C%9(7u(g{i%UHkcp7Kbh!xghM9Eu#$f++2&!KIlc5_`$NPl@C+k#d7TWU zm#LpFz%U|hXRge6+mVR^n9J?fCWaW0g_@zSVUd?WNf0m4^h7~zxR>vgL( z{y$+?*NA59{x9K6AOH%A?*GCO6=R9R7X;9VyJrkX<{n-xxHlsQ>*Ixsb`y=7)(5A9ZF%2$MkqQ0$|@iW}gA3+lK zABmf~BUECDEW*80C8Q-GctFXibaHmzDmZza=fc#rDU$3gyHuN1Xc4B=ETGZ`EhrkJ z915;??`K-z1y@jI@ScB!*XFdvEu&lzfA9NZRQqUy77@7d<11vsj8KHORr**q0yz$J zJJ*jjGZu>i`gs|gqSL9)Cx*Dd8w>!(@y|)H(ybyR`fiV4pp`6JYHSJ|%h~<153Nsd zo^@nv&|MQWTUnTNRH_0O)26ywF@#RdYz59w2^TFwT;WMH=Rfvj-9@_y+>nSgHpL^I zjgpO}u@&AbPnE?!iLU{2N~jgZ!*YY(^4$T+BuYCo_9D5xNbaml>MHy<`Di~wtZmIc zRHs~$lE}(sm|LCv@XgBeXLD@1$8D&9}wc9+^6j(C--M#cJwaiu8EES85X_#D#{?7I*b5E%Z{rW$Tdb_p71PNF@- zeM0bzYkcUIz;c;4U1k9NKLu~pH%ELilh_qbH0?VMGE=!EQJg>Mea z&l#IX-`P;EP!=ScZ+|5sKXl$qS(zA(?dm=_Pp`dL;avros&gd8MBR1RBN48?5V$32 z%1F5>5!s&2BmQjM+IcwtzHnd=e{CShvtTzF9_T|N0B=bPZCKbCV7B!OZnkL@bTbnDZix>F#^98qE{3zL2fw#S(V7;VoIvzA8u=wjND^=UL` zEd~^w7U~pSG{d6A#YjO)ImL#KD={M!vNSA|I437ds_(g1a2t0q+G&boT6p>ZD+ftJ z`|oY$n)5q0^O=`(yHj7n5dLUU&&9#$X|8(e72VEB7gDP(yAcGYXf_MU(Ok;|p5%`i zJU#c<#U8d}YS6d4Fs%~)|J+lFyp`dBQ8&DSORf%FnOS%0jmb9V(j4@p<&81r|O1dv5 z;C*ML<*={gSUkED`Ma>e!@UOn2T(3}Xr6xZt~Jt;)ft>OtbK4QdZ2I4fi}ITp8;#f z=O8_yJzD!Tky?i+aO=W6itteE-%!!a5xWm%)^ehreff9Sk0t1(umW9mB5KV0Tb$p) zT&o;!6e2_CWu_Z%+pX(iYU5TA^sv{k7qWn{zv2BhbNE5hyXQ%#nhxhTe&IO;Qiu6> z)sUW1K@XbSncsC))kW7cwc7qQkqMs8^W8VrG$?_tk_wwoR%#lOaMQNwT8lFk!mAMpYR?mWrI(*&pxnaM*bqvDgwf@gZtaft zpl(mTfYFeZdVWuxBW17-LpX2tP|C79#B($N3!`D4cTnSzg0-&biRELXN@`12sLzJ} zPJAJ`8+#|;{nHsbPUwKFvY44{np%GGnr13eE0B=|hT6Bq9{2k(RIhGz9Dz<*i-dIA zCAiW%9HkoHDp7D`myBL?$@3C_JzqrXtmN_}{PWg#<*CLl1)+I`ufE7C z>m?Iv!VhQ0=QDK=4q^fWw0Mv~47&)W3q-GipwT~s2A7EhZ~~t8qIx_$huDZ2sRVW# zG+?eBUr3(HTYkaBZ?BbWFxPA*ixopvdwyE^#wZqnVmrQHhk6TRQY^;JLXe6X9`e3S z9iwOR>sC;AzkHo5TCE z>2=BJce&=qiI;E7itkoVX_M>hsmV8;=@n$=WNgOcH9K!Jtp@Cj36nQJRS1rEZQP`W z{g%KK=-Ab!w(`Gkr5^kv4xEop+HIoO63gfjkUSZoF3HSL}VeGcawLk|eE4;k7CmJOZ|VNrH2 z1k(0+CEZ0r(rc@0l{$+f>wXq@I^2d4fK{(87Ix+%O+=$qltq=ym8O7)t9D7|UI?tt zVhYz4soxXn&xLAKc2wtziVXXqk{Vhh`VUviHuFxnv2R|*>W&bz+#m%D6W^JoyXP)2 z=F&Azn`2tDzSM*kjrb677B=mz+#!@ZD;8D}ul9Dk2+U|No*+z5_csioo^T}d$Kh6I z>uA(5NX)(k3Ide3_`ABZ@7UeteeL%in{BHU+lhQv6W%d4E&XCYm;6*n&EMQbo3dBnAu`$ni;1WnZd$HNt>;0!W3;R1> z#O}qQ8Ghj02|0`Ee#<}x0Q5R*M;Xrp3*_jh7~|?Un9IE^!KeKB+R~fay@~r2LmgqnsZg z@0ZjMWstoNomB?NN5+jOb?U|3!;NFM^U3ta2+De!e&bLy74vEG4pw~GUjc9Kj9I9; zJz|L{1#mnBEn=TWR2m+$T(<;{-`Umc;vcp6$wGDy!Ljo)#=)}MWJ1~4wR_v*n6)4b zTipw?R)g0e4u~QWBs)b%A2kV17>g~5fT9+^#9YEDEp9Wi6AiCUR*Wj6h@(bpWMibA zpK67TQbUYAz=)wU(q51vT_WAnUh~MB_?K6{Oo*r$Bib75!wh#mnOok1E8P0$Nq;tc zj!mGkzGX^-ye{ulBMhx%sot#S(Yz0v_X#;cV^(hI(NXZ`1gD9AU;1I1x`{Lu{5~Kq zGI$;69F^ro(rd$}zU?w7& zlm16^D*lPnzu4+LwkLacMq!X^c^u7aC44WvQHB~#EQk$z9Y`R{0C=ST>qgffxYOaN zjF%nU2%3z3Loao|al2G#l7LHyC7T9voZPt*Vk(*_(uJkRZ3)Cxrzfu zN!XhME&FQ=-BJDu8M@tuXegP+##FHql zFv;Zo{!U~ZoM{?;FU@wd?=N zS@=&F*Fl#92X8!+mNSe6TfRMAb=q!_-gy;O%45K5Qbbn7O9HJD92lQx^gCeOYlM1b zTId?fEKO_FCT6I^^!=g*57SYUMw$Qe;Y7>N{F$0*n7kb>f*jhY60y<`uuQ8H=8SaV z9uQ?-qbHjUYaMOR;4HQcZY41D0q}`1W#hi~rebbwK+%nJLi5;6-Z9o?+{{ynNsK1z zOpKvASca#?C;PaoSA?3WrXSyHXngx`ov&Un_Z$iBQ(c5A87THeN6mO#(2+{Ch@s=p zz35R8Lc!Y-0vN{r@$(An`N$vg6{8k|?t#s7pk#M=0xot-Zxb(B zFlJ=aAW~hn_B5R)>`Z$>+XhVs-FptorF5yv51NhVowP?mKg_*cG#~y@o6E9BHIbdv zr=$0U(sHvBkEKI)kD0(D*v)ulZIZOcY;2pJ7w|D+Y&TM;YfKMlzWq;* zWEq*~Dd&5}SQ>tg9tT^;!&^bkQ~>OHU#ywsG8rND)_G;=Q_53n66rsH)PK6B50g@k z@Ui)5Z@+s%FO_hthMfvQRAGDncXll6r*l!P;=EPr&X&_2o2xXS zksii)Ohal$E?h~>h8OFxUePzqmVMR$ElO9gQ|Dc{C#+HH3xS;It$|5*Lq(DEtFJj& z7kWD~vx1F-l;qe&CmG5=t9cB5QpbzXs%Vv~^D`%5RC@tu<`J-_b?Q<%^WOUwIvv@1 z-KY*5l)rl$1l}oWh7A1k5zDHb{-WWbTpTif223 zqGVJe06hZbaKeGOL^DZjfjGgz5Di_W{Mce!YrM7Mt zdQ3lgvqH|>fNUyKC?y<*P?C0r9A?uzlhvi`iIw1W&7P&7lHe2gE>FsOR6W){zw7yO zsN7mCL%DZ*r{MTMTR!czGw^2<5=6Ae=UX+bP2hv^j{umH*l&eB4+ z4-mjh8w%XeI*n$wJHZ`M#0N^m`76Uv#~B-2B7q12{eh))l;v~D5?(puGbM{x+8L(X zSK(lBOX2N9e@F_7asXr!oNE&g^2dXHiG}k;trClP1%W^z$#oFS8W&`xIkC{>`4OqU zIRQZEgE_616{Rf1Wv)UtUK(N9w0GBUwn9KWCljo z;_{o*f=zSQ{&>%sIj$%cKVI_bsWyN8%)tt7QUxRFW2kkpwKl?jMSlLH3NZr$&Tlnu zU1|mC(x6a?C5oS^qa|fzYO(wOqETR=+31=HY3&Qx^cpf;kQT{ThQSv9!SYx~cqDHl z#()@8042l!gc$z7fWdmbIjYc%*y__(+j{yzuDaR-0gPpAt<|C1mViIiuFsQ{4Wi`7 zhu26*$O0+qh(i|!7bJq0zycaamuXvCo8#q&8~-_=^aJW2))eU$NMcyF5N0J1$N(UT zS}J5^0+jTzuj!!3(V3JmMoH7|eae5;F2dZ-fMsEFDjoazX4&w68>dH#@!MYYL54jf zNkS<=(m`=Dl?#kpx(bTe>ZyU!@; z^ML)A8sH#F-|?BL*cgfBq9DzY1z+Bek!_u;R9dhEKzXJ<$JAZ1c-2e2ky)_0R!9wz znSX{kZ7k7ueyKIy7^~8o0YG9-jxX{nHYqTo@sbU2`n7YSJ-P&nGQHS-W;B)un8M&@ zY`a6}e5iWktmRR@byTI-)IA<=rHx|8p;l zvQJ=0Zgv)we(>i34L)e4u9dYGBvl@zBEER2_WVb^B9M8g=DWl3omgNlPoYzb}C)A9?%){wzh+LD~AG)2>D88%hu<6RF5}^vE*~2NTAn=LS--!i5?v z5hmka|A7D}ALOujq{KkJ3%iy+xJ9Xs9`_H4MptEPCj%^N#-efL?Ze+ZZ87ThqJ`5s zEC~7s!q3|fyr2HseHVcPa@7AdXN{BLO>wLAkV4l5tEUx?*Sn(2#gYLSmOTXV!zR@p9|0)#@XCm2Y^PKpqWfU zL^F^c=BrA(2y96MHI!ZqkgA3Nh-#v*@x?bC_|Id+%kGZbLRK@fmnV7WTE||`dB=rb z!`m^LO%poQpo~XF{B1E6VROw>zp+VWIMn@)+sCS)N3hUZ0lfz`5#frt_F7R}n{5U> z8c_?*4vGu0YKm2*`ZdBN@Mu5t! zD#_Eb&kzR9=Bly*MUq5kd58EW*4F~@QT1tm-LStI8sdqYGdP?d2xi$rOaGINJ|EFy zNL)n8YF`!f^pd#!q>-GO-tVLJL>ATJX9N234k4&bbgm|edlB(eA)4KdIT$lD-f=Un zBsWJDcpdzWv}!K-tHu`Nb67u%VX0Jv`(BvP`v6FA`4keKaXb#paFjr%UxB<(h9$?Y z_GU3%oHu@`Mfd1r<>1rUdU1zn-AmmC2^bNEkbvpv)H{0fnt@oVstrxA6>70n$_Z9H zPQr6%PCm^S^5b=%gL`UWjFO&L(>h$I>mVo7=J;)1Zx(@@I4X8N=l( z$da!h2jAO~jqJt;0ZLIQV6s?x;R4%bIYxm1-wx>S@>P|?WWm;O;Yb3|PAI>D<9rUG z$ui^8X8>>$X7!g)9MLECF#$tph;|H;w41(g6p_MnN;bE`ngJdyAlwT#->O-O*|tw0$+$o53(y2;K<{{lUP z5q*t}q+gcdu6@A`q-@8f<%87)AIp`r$z>wNBZvdWPXAtBX(3sX>J2BwPKVwoyQkhF zKVlOOk`1t=_FlL50s@DAd)4!m40RMVjgl78*SIcFqc%=ScJ~;7HYmZ#gia9q=WVU< zA|$O)gLGyRt54r4${?9Q%3xUj<1Ns&T?2GI*i>)M13qy%@Y2lp&E*!Je@A$aHC(cife11`hgVPHnE5IpnyK?ot`&v(h zX5jNErQnHeC&4VF>(vx>fS_v@q?N~Q202wyrkVw%gUA6^%@mQtUK4$_+Qm>HVbiSE zBq;_Rk5;KHV9NA3)6QwZ7TT528ff#R+c2H@^aF)ZsVGnP>nZz1KD?^(!pYFxFQ{d7 zxb#%Lio`J*#xt5hmy?K$mI=>-Lul%~ERd-Cks~?PTWap%fFZ@Az80$52ayesRc@4r zmKbAMJCDyLv|n7o6NO>@h6%OtG4vzP1pL^(V@DY)=C(&MdF&~z^ZCaut#RuvY#G4mTTS!35{t!~0%$?qB$k_ux*V{dg z!#X{SyQ+N`95l%~21LOKXSCt$Byi96U_5R|=P{7Bb0^AgSk61G1;!Q8tKL8XMo}?! z{izXpafJ+qP(Q1xPSkFa#_!WeIvJ!Bk4?h5237;g$d zcttPp2(A5i3M;tbMcc7xJ<-CUN<}(C9*P{n)cxAN-UuiK`cjGh(->{-RKQlzhoL>) z)!O!HbSCWyj>PBQ-q9HI#}e@}sX3*kltQ^5eJXx;RpXa_CP&LHnKewZEoK%8GnNAs z*B>iCD@7}!HmGuXqJ%Ps<&B*#vU(&;2%5btmX8w0Tx=%i5bfHY%lh-tkS%TQ za@rs!gx6+hmXP&2Llq--`96{17sn96C*fJl!{WNd^UitdZrFaVq&Xc^82ZBW^hEN-G5FT?s8<;(BRUJ2vp?&?@E;H zG^dYYGuq>gcvyu&@aSI@Y3+Qn&&Rt@`-OogN6-3Z!3!1gzd;5`3KrVsu0F>i=HB*cR6a1uLnoA=#fdWG3x%>Nk$~#P{gl3U`q>Od7&O`dwc>H z+rq~P5(gsx37POIq{~D1MPR<|gI3#9-cctH8|)!RG$=yB!A+Dzn!6*j2mlSD+hEV3 zBE16*ir6aEjf*WQ){z#guxpm|li`<3lkM@0jnRhh(PS;aAKbqC^TS_P;hkEu&c^5% z14*g$Z*2VwwUG8}xXhm$KLW%=Dpz7B0_BX7rh&bX-J@7;8*`4=kW-Fp)hn6kWf0uE z2KTqAh~1s`TONBVk_u#^*cOifkt0J|ainy|H1mD82LO$f+l4&<WNI_$^?^Ek6cxC3v4D$qrl(n zIUC@LMOlyzCbu3Brjw7>&;F|;G^mPJM9d<$`J+8pOxi4b)6PU-l*OAI9QT13;MS)1 zX67xx(x1t{S$sm=;Y97;F36WYuziOWc!1}_I+HGgNYKVMgs`|k`X?>5T=f_(>dEm; z6qvsI+4UL(lhF6T#7zj3Al;lvL`EPpYE-+a&B23sg+n@vgr)sH8St%p`mK8HjO~=; z9Hsk;&(*Hh;jfh{YA7%cnXI+I)%rU4-%DD^xtnJo#avQ)qVmb|8lq~Lg^DVAA#gjA zm=g}xvjK6i1SLL%jUAq+mo_+lO(JQpyYgmOogJOS#Gs~iW)c$6Ab9|oypaerjRVKz znyz6PJ*$EnCFx>f`u78$_{X-O$JF$ZNmdlPizT)|aqYZw_W=}7Ti7vv1!Uz|7;SA6 zYFY3I=Cf(@mPvvD|&0zAUutTrm_O0TW|x1oCFg#I!3T!qj>ANGUQnQT(H z74?4S^aj%pr5sF_95m7>PbHxn{Cg)E!DRD221>FkWV^l7gZ$DC zQK;V$ohl99p1eR`C3V|aLhKJ4Dd?!V#oS`2w!-XZ5qp9?0MUoJEJ6y({dFshfmDzLRLE-sP%n+qoEZYvirVj@AX zGG~>sIv=@>a&ANU)YziIuhue-=2p;Oc#crHpBL+Diw)R@e*_{w=*xG-*wj;)YfwFv zVP#k_OcM-_qsQ=2ohoVvH74-Z&gXb5vsLShetU^c9x>tS8p5L)2%4Ym^xmsgF2ybc zz33^oOA8=7Szt1^bz`U!tHWsJ%FiR>g_}8&=MmRt<&4lN-jAu(!N?UZO`SfdaRfM2 zKWMdn;BkoedI*TYmQU4*epGNS5aetTwICsAb|j=(wfOlIPI4mgt@s7aiU$(N>hal| z*$-A9d8g514p+kf_Xp4R^q;ho+z2FWA_UeCgwLS^SO1E?Z?`EdtFqPSSW*!yjLAZ5 z&%RXAANS`cqb1vmL?Q#W2D;bE;z1ajg*-R?UgOi!B3Q|}E2&XuMdTJtY>Za0E*OUL zPx6;w#Eqd-@pC&zZck$VM|PqnsOUWhk_}OoXJ)Z$CxfQYfIux}#WmellMkiLadJCv zfKYP4vHw}--Gyv?4y`pBkF-oLjHJPfLNaU*Wib{Hg+8{5Q?oqi08O4N>1ZtKQJ4-> zy@<+B*@<$fL*<{Y@}UR3y)CEXHTWN6%rj@t#0wl(EFPZqt_;Z6LzIRQ9obsTXu*U7 z|29&OEd-8y;<6>m(qSuJ*!6g3wXF%v6M4z%UpwvUyVwxHSrx=JF%|k>`Qh=l0fzaY6`U4of>p%wrUk#HH>%JZIGo;SJrmQc=**u$6R;1?gyjobb zy#mxMOaz98%pp(kKwOO*LDx zV2a)O*AVoY$u_*igoHRi+gH&sFjrS5ojLqFEUL#UdrYI>bkA$n`EK|xOMhn+IzV`O za^nATFXQ=2N%3j$Ov!|+L8b1P!-0%dftaH5Hp?;7=ktJvl-gi*Q6DnAIdP#%yQ|Ec zzYJL?51E{F>G36NvxP*mlu%~xG^w4$rE#MNxA2FM`>`^=^_}0-xdYx#P*Y7VM?%p! zy;mZYK_en|#MBghUR`LeImFeJongJ?k+Gr%L=MYR+Wm4Tg6#uxxz5lqlePzKj3%eD zlxwmnx|C8=^zjNEh~VD0LpJQMAB@Cp+SI1T1Uz|DIpu8rHEttAMG+;4I!)?ib5pF6 z`1cW@`Rn3b20dC|u%R!Cc$h^L=z>A~QXS#uVcs4oRc!{somNLpZ>8S8%@JIdUoDUL z5aSN}WyFk|g>IuW#sNm5lc<5-$nzn-N9RyEe*+&P*TFe^Tm{x>py9k;3?Hd4((CneT|KKjim!+fVS{aV^sD-yAQEd0W5v~a*i+@M^uf=ekB!8b z!;$t6r8_uo`%p_y2Rjb)%g@CUw@zF8_rQgr<6<+hy3P7$O0lv6H6oMle3Cf$DWQ6i znn~%ulg~{$xaI8Y>#d}fzlWpWJ*TsrFhSSIgX%6XS9eGr&pp4q%#Ji57 z0o1pr#TqL98UE!$x&zLd$_9}>EPuM?HyEZffkE4VeBaMz>lpz(I2e30+7C%3e{MIK zgF$;K`euv{c;O90XZm{cIg95cf2@N^#vf_qz%`x$jHua6blFe%F@V1&wekJAHF7JL z+Rt9lQ@GSS{`;Zqseh;YZuFr{oT=lsMqjlB{V_^>SkA>ZZX~SDwM-ibZQ}6x&96bZ zzcf-uV>Fw6q?8Nx(WlST&9Lj`4bb$Xn0=qO9=}t@yxlgR+kbOq&dq#B;*Hwu^7oCP zgyv>Q>e=_veb#&Yr3}`N8_+AjWabwiH}c+$h033^^Ujv3^_bNW>k=x=|9KI3n?Eo0 z1wRrQmcOX-Y~fCueZ(A9_}OECIe+OTr}kts^B3D;MwJ-7d#*?QQT*T(6RxFOYd~d0 zlc~y93x5%YL=Hfc^UmX(MX|1u}(>kgYY-Ct!Dr4SEF0FEUg+pmlfG?%&svm6`UFFyojU zqW2hE2b=7J7<8Yi-^7ES{5iYaP$MU;6^ZGTT5%V5VJF1w<7UudOg8$*(RF<)#uI{z=R0 z6W(-3-UPs5kbRW9z@z}>btg(H?8;Yv92^wb#oy@K%^hr=gZi_`9VYFO$Ve}6sV}V%sKqZHb$j=g-~ilr|EmsWf{Iy>}xfYRcT;U4X0x1x&cqSVS~Xw3vKt# zT~*(M43ld1Hn5JXI*c!S2Y3HqP-0iS_N??31)F<*>K4Ft3w#(?Quf}8d>!l(;?&cz zOl=1lH+;yI&zABQlN8;Wg$P+Jk2}lEDbniWR{wk3;7Aee19#c4%w-d`)5O+;w3sG3 zvx;WrfJTl4BVU*N(S_=s)WF^w;@CCYWi>SIdFL8k%KL|J*i(Pa?K}I$5ei~7pOSk{OG|v#{{Gio=bffWCt5BI% z;56$>glV{PlLxJug{_c#PJgJ1P0V+?qjuLvGl ztg<~?k1?CclT;P2_$R=TaJwcj0l?Ex$Wyxnd(^J`kojuFKYXTg|40mS zKLd^1G1s~*ZNTJ6+}?x%l>9y>JDkYIo!k$JWv15i>FjvXvZmKmBttRnafs8;IVbx|2QlzSo#P|O|^9fZPZ<&7^|1Iz8DI2KAu~~Lo zN3v$U)J_wl2C`Iul=V@W6*@|_Zp%Rzoq3KfZm*5jZfFT@8|h&PgRidqb*dgrtluBq z7wpqQ8ZoS475RHEts7ddJoKrlWHXa9`J{wgw$AQ`%D`1trLtVJ-m^HPU_$oAX5c)G zO&(Y{tskV)*d;rtp<;+}y}bV%68YUdTyX`3VEu=CIVF=9;5kbT4{cfdX@O5pKPkPN z7jDi3+my2fgz+09jlxpy5G>*|q?&P2`+1XaQ{jfYQ&PmHu|N{I@rwGE*YW?fe!-?F zROUeJhO;Vmg=R{DV~Dx6aZ18Z0fw|R%Z@jKWwNP+dGk!-7D#<~WGFiR4Z?pFcXgIu zNQBXP^-SeyaxAELCn~hyMm$-w{a0zStI7spLQrXVlBb#ujucGyn$W=5K%~#%%|F&# zkVO<;k?h7qN`z_I1cN_`CR*~uoyaVD=32WJ?=ehP4c1AzKI}+`8$~eXi}YkQn$@;Z z)#WGQP#H2-pxF$b6YotkeP7oZ!{1GFI+2us8&NiLWKLAKN|HHN+=-55pdL>Qyawe9xV zQ(3egX$n&lEW=u0{wi&95%+K9O!8ozg{oX!LS_vd+#z?2Lucich#2Zw#VYPyFvA1dk=Iq~4?6(}w~r%gX)s|+7~63Knsien+WgNe zY)U&4v=wuAM)jhgI++&){Bcf6SuFf&00pl$ffC{~dh|m|HmsY2ytW2xagiTXVq+h;|!Ygi&U)ph2 zFKFj2f?z9A0qmmCYc?o(u*ZSBx&-a9Q+KXVG*K6#M2=@h1Pmp8SEq0wu>c6R}T7d(dK6wbhB z6}nePt$qc^xibJy@(dEN)IK0#X;x>=ceYt9*plcZU#uR)^ROtRhmp(WsUrX_sVk zk4q98%_X=?S5s|gw`_fu+yh@gq67|y_4265K(VBwj(zXd0b7nEHD-f#gI2Wu#7qIC z<4pj}rH0jUwV1N8Q2Nw>kx=~2Qn#+ze1q%4nWL`-S=my*As#%`=aW`%4JKlRMK5kI zzltOeX4V=Ci)#>qC*~n7m8w^$O0xTM82NMls7=G4D7-Gu@R!a{q%46e9Xk`18lKx| zt(z?3`#fe&Kb0v$U0@RCtqCPgiD;_`+WV@0D0yG2R~7Cvb}@cHJ2*o(Gv?g@zAGv5 zG6U{xT0Q^z$M%Rd?bH-|m;RnYY|h|x-{7+W;U9YX_wrc11KuV{3|}2yy%m5z0s;sC z2mqt9=zq=^J(Kfw7`Nd{S#)<%gzsL6A?6zdIEZXm9x2V1pVMs|HZMC<>@5|tH)1?`-KZwr_j5T}b*jFSglix1`Q4FD9_8ESU*0 z)n*ZiWn+@6#zHC^#m0o{7Tzd5%A+_t)sa_b*gi$owN3X!uSq7-<5`$L0Dx%-l?A|L zj}(vDw^ys4It^SW(hTv`=@aTUN!wCMXl00nQTQZghz_o+KB3tk!Tu77Py`VnDu0ql z1Oj2l1`2h5lu%GY2L%PBB=Y)jlM;k*33UE@<*LGRh-r#YMjY5ZDg;%iL4HaMZ9glnpDLa=q3L|`UM7$b!`n=FqVvxSHawtMY2%n(+8-7mf?pTVD98 z;S}o?g|F1*SCO+>Nj#wfLW5D@%v#*7oNr}8yT6G!LV&fOR*PHXp)Zt0JPX?u2;S7C zf%pOPtIB$iA{4p<3!3#L-RA#`?0zD5Nhh<~h96dn?^@XSPSfZN4yWB7e({Y$c&mpE z`K}vnfGus7bj@h80f717T;9FM_woh=3eIK*pn5rW=Z@n?humc~AsP00~_(P%)ER_c_dWmn}y z2F-(gv7P?uu#Z;=@+-fv6oCuY*0n-M6#Ukx`pO6h5=jacC}D{z`bW;nVTDjwK*X09 z+RwwKfT_duP;G*CLtudx2Op*gN@@@R_SYxVgHS_asE%X{VE=?OHQ@61$1Yl%)R(GC zXX{8;ZCNA%t-fC@w?p16ow!KhiW7S}i@e!la$lw7W60pGqa z`pI!?TDRtoMkrGBbc~MQVuX5H#oHN{k2UHu#D;KUDF%t4z!2-GP0U265s>ZQi^+u2|yQHHmOBfJEqG;iY6-wd+<}>asmMjgHc9hAk)6IFG zuNMJLlPe(ZgtifbZihaUHgjG^N+ImV-eqw@h*Yh?=@hhR9yia#+RW3X41^A(4;lH9BtM3T=jhfp!08B`*~Vf zv$j|fs)fRVlhnhY3O;J zRdd!AlifF`(Sx8i!Z3(OAuGN6S%*vQosmOo!U>b(@~|wG;TOB(vZt!?Fw|&sm2hBpt7=aL-=$e8tbLR*SNc}#*YBzm z!ECk1>pGJ*xt3Vwsi=lp2%EK`{gzo>x(D)th04M%t~^eF1qI-EHKzNA8Nwl6_Vp2T z(*NRR_dft%K%l>_s~OY;-m?S}2iX-qNF%bB9yy1E#uKjUxFMInThoR;p44^%lT`4u zEOn_n21V0fLDh#;5x@AGjz#BV@Uf|}>*%TjPTh&qqisOp9zqfe)cbQf7vw$IIxD`c zQgk>KU)noG0vCaxIb9P>x4=+;+$yka-aMUB-{-|rA z&ml~E=t;>g$Meo&yt@>9`DFS)_+Sx8dgLM^ddppsg1z{?+93FWR=K-2ZTVX5`8wY2 z6-@W=<{8haZqQ*4(*2#a>Mkhk7)eG-UFy9?OIMLu0iM*UY>( z*C6w4AGOPz?yX{SuZy6Q#(maA^TtgHRg(hsMz^bopK(e71%otEmRTw_iOu>aB5h66 zxEGNC22z@w<>8$2N*CnI>{An(S!#+?2KD$MmAmWHNaLRs8wN9XfyP|9s!Y4q)~Kkg z6dRQEHaG!BXn(zb6^1$uyq5t4f9q@!ZX3M);>8)q>SI|b(Y!Kikpo0in#wsfeAKVE z#5Fip7#OR<6jhC|EW}6fsU`WETB#a24J$%KiQ)F^qVQ1WNX;0+R!5<(FHMC_VYKp^ zxjZkp>I_E}JcASJu>8y$V6@$Z6TGQIO!Z22g*8(hAtcuv@!udn{{3D*1n@gL2loUk zv#X^jMZBJCHZl!z=0>sV=fULODFCP_{ga_PuAyF=_fa5y{L{~<8O zN~iLwlbKs121gxfT!4otguQ@e_n~U$cFs=uat1;`YgD*r=8Tm_vL+lytLZxdkJd@A z!6ih#1sRBNIG6VwNr#+ZcFlDso z(0V>IN;`%Vvp*wfP^dQp|AL{w%hXV>HyO(n#>Z1!2<6C_&oID(H^Ix|cpv9Z1yVoS zkHN~Tql)2{8z`y29W-PqhttbOzQL@F%*9G()HYCTQ1)9kT~ ziB46nIVscUtc^Y;9S{{1kiru}haO9n4wFQ3%zH{zzU)e7vr})JO|~#+U@df$8>m*N@G|my3=PM`m~Tf z8fqhsaytqy`zOW@l7;e@6o^D318$|k2=N6!BVWsz%?dNK(n}8KVbKyQ79E_NQM>jr z1D-MJw*ysm)!bj_W~va>OWHGxY-c$;k@+r-btsVsR=k)r&?fZ!eaJb`@7aJuNBu1F zs<>XVdVVEmlX>8evauu^v&Hl!oS&CDEJ(zts3QM{DTKU*YMS4K0B_4Gm3g{#wZ4Gs zM4Huw?qj*xRZ8v7>OIBd*A8M32}`BjoOkOk4%H9{huTg30L4|@StTIR)x1$f4jcH< znxo@`TP1#)^Wt3(1@jZWF8svi{CfV}Cmvje?EMb3+%SVh`4ox$oyWSQ9%UsL&~jty^2;1X>^%$Y1>ePjHDkTJtpBGy3ETgMEmfAt2hjy?jI zTJoyP(KBP6e!ktkaBz@wjt=6}utnS)x+xf`JcNtq?-n}M?|0+-m}@|aK*10>?(S*} z6K+*;HLibgH*J&QYjPo!&Z||s=r~Fo!qEe&7Ps#OU6K12dWyEQL~Na|gptCJC&rt3 zdy5N=+kC<-Fn3B*=jyEw9}H&UFstgSdSpm6my$cGv*S2*=#VJULu38sf)O4OOjt>{n34-*^nEi&(=_1TFYzR&3WPh;*1NWnjd%Tu^!Pc#00ycKu=Zj3&*)v-fE z{x_=}ZrTcc?6fUkBj27`i~*GaJ`Vci_Aj+j6srIDG7?}6K^V8h_E3&SeL4aW z&>d0Q3I+v*;pTk0a{gqpIcAOBjME~aZ35T7U&WJqdcxYdC&BQme=lh^Zayk?CWjX> zz=V1ma4%=!mlMsfVP1mjw0n#AXqA{GfWur>=DZTqH7*Q!MjQ?CcSj#)P*k9)XFzOg zIU`!-sBevd(FA_cTD?X*emx@5Ud}j>d+95+X=?pFOng7=gUCQ&{4QPu<$M9 zRv&JZaDC1T9iFPNe}RXII{*pbmZ`H4sdXHt(4vICeH zKpC;Sd}H2E^*mGM?mOZb{pMx;R?k68UX%l;Ig^?0Ac9yS%4;53gQXrXf?uRWJJ2-^ z1oqdeq%A<3^bYF0GBd{{Q)mgpbMqscSL=7WwsuZIIj%8A$7@buwbCqinqB{K4jj)` zsOTLk4~S7jBaL=GR5)i1dA5C#$um{K?$X5Oi$h@{pfmj zq8E|(yq<)L;^T9hr8IJ4bCEF^vHp5pz3i97_9 zWK%XZ0Uk6|c0uiy1M_JzK%2Q)J zxVKzlDbt;xjkXs~PJ*M-8}P!J=#$fxblE~v=(&SjNbWRBLCbh4)T9xM^1n9iZx8QT zfIrh97p_}&=SXtwn!xZ?917Z3Aqt(3-IO_v9vlMyj?-)Pv)>VB>-{5NeKCc1Fp-Mf z>9gGGXc()^&`GI7WG>vc)v9}F&BSCO6ESQZ=qX|Gqg@7}jUWQM38?KEi0X5lXduFJ z_VN~Dj+^WiwQB~ZHzOH5-JM>Y1@h{8@KrWmAuk@)rbQaY-FLV9?WsT1sgp;_YrVKH zcApmuARQCY@Wx|j1Vq&@h*P_yibKe%#j^%zhN?Wf%q`1jd8r8f;7}col6u}r7Q#|X z9yjRT5J95mi_mI@vkLEmk>4nfrt#MWZJv}1uBpyqGePhJ24pB~8v`4{ToZOmxLKl=93oPWkB?`nd5 zwX?^5g)qCuHhw(9@}ld`tPk$ut`)wRPoVDPG#khSuKwh|>p~$YN`0-BZ9%i211DfK zIDH?}Ch6!P?n&BZGVp>XE9b&o_pvy4li5S0qW5U?eY9{fxgRphSn}LUx@KGG*BqQ)F9mR2=Zp zF&A711whyD-{+^xy$pM}vzKHa|N=z1wE`=>2tUi&Hqi9>B~kSyhtxgg=bf`s4 z6y)-JXlLn&r1ka7jSF~bB85S-e7tHBv;U?kksnYpwDaY=o_ePDD8=3iW!{iyEPHpf z??Yofr#U;{y-sh<7}i?}XaUXu_>r~_{wFhwjFP0J%Nw2ta*`>k|9yBr7;)nTlMjFn z%|}V~y1x46!m~N}(5ZGzv$YO*VV2T+0R~D+V zDyPY4vIpG>w27$%q(J#;59mctCbX=JxI51|%+sz`_1e-U3$h3wvE<@pe$#brE-ow` z@YCKW_f(qb;xm#0PnWCUa@$;A=!>Dg^#2`AVS!H6k>@SVcb4uu3{g9vTun!>gjVv^x9*H3}gaUHiG#f}taz(0dmg|1Cw$AjHTUt$uR zMk&04vw0oW$ys&8;dB5X)j*8kXs9A$#YE|;oORX74$0fF4K7XaIL9!`8W;}dRFS`1 zZ?4E{Npom*rA*I`r4U#m@BaV#*DDD_tB(uMysOf46_+S&Qsj8+4nv}NyJQLj zrxRjg29gQ;|B`zs0{ltT;j#9H|5by{C{G){gv^Yk8u8^idIG{ZkLivm3P)xSP_R}| zQ7`7lbJE=R1p13X#P6eC=UldqR;~xjjRb0OtLfEse_!)RS(L8&+lD|JSHWKf92hl7 zpIjg1C2KVa{Y3Nx6*dSVig)gsmZp4dx!lXn^bdQIuYcmE=X)~=D))K3j!Ni%MO%+J zI{AvJ8eoh{y%W7_ajp$vGEk<9QY3CKw$2=dj3=EU32`bNFGo|JGZkqPgF$gnrYACu zpS9g?KG?PK=N$e5CtMF@PQ>mtT#%x=IybhIqhU3WDmp29jrN?ryjWUZ<3Jh=J;_Izunb9;hn-gP z%qbdcXFX6@xtDp^R&#S?gOP`@7KSjmI;GzI{mBYxSUTsew)%_vK<2^a37_*3`5Z|T zTb|lUpib=*d#TfRC-2*PW|4Go>71m<0c8(~5Va(Dm^IQL0Px&AI>vUG^IXp{s`~Rw zqyvL7)aO@%5Le?#yhe%rW~INenzg7QW5zfi+A_{%U95$G(@NV;PWU@ZliRVB&5jiWtKXFsXGjiljpkjUgQImfe0g$4VeC=wp!P|Npd;62sL`!+tC zVNJ~vzD+FJ9kvHivt3=52Hq z8HLh7`={-kVfw7*VL>+qZ1Okw%6OvBz}*WCOxEXs2TIHIVt`m&Y}_?} zslP!h$b{&YTq=}%r7;n}6b(nHP(=eFg-kf-dAiypwV3B`mw&5>XktD&;za|Kji31} zBNUCYwpQmtI;4|V8(LMPG7OM9GkM|(kz$m`^Z?cFqEO#_I7yG z{6dEZ7s?T@OT^Ra2Eqt&6r=K6BkYWz#$KK=K3J!_A%;vmkkGHcA zqi$3k&lH5vI;4RR%9F++d5jwYddRDzF+SxxF=NW25$PDvlbH$eA0mi9k`AJ;{M9H% zCk*(f7omuR#FK>3iZhL!2W`JBjBMJ5!OG)kJ% zjD`)-=(uJf^7uS5MyIG-OM(Is$)m9=`tW2jgT5Bl5Us;HQVs=KXGuKA!!j~oJ*Tai z<0UWBlGsP5__B3WrU~3#;j0?Lmen2s#wrpnhW9L`?j>$;vwSa>{F3L!POb%vU$5S7S=G17 z*DE&Zi@Rx(M_jZpA~?Z*4?6bgw2c}RlRjXfVE{*sS%immFU5!~qaE>)bhnEzed_vr z^&74}97~Y3{L|Jg3!{IAVr$~7X9Ddz*F6(17MO#vnfS$M>BEvYcO_-ulRcfTd_cWL zHElq&P>3S33I2G!j9qIks?WZf=20*9jy8fhA!ppsV4m`%h(1?&rm@NUtt7F{A$~LsCK5|{Z2eHibF{p zEPu{x%b2yM|7O-Ki~mPMbC zw>W`s;3slV{B*_<3(7|s-szy!Je@6uXY_^I=27a;&d5V!i*^#gBj5XJcQG^DvqA|9 zS4CJWg)k9_qyZ^HC>WJQIYEj93nl@v00%x4w?#q^Qd(Q9KisY5ZQR9gPZY$9VL||f zAwUQ);fMq>QBcAVtbi(XmK%sNm@QHUF;l1VXkA8CHaF1TA02+mc%C!p0WCrT<6 zEcY%V)xZ9#`K1cQ5QGC#N~4Qu4G4pQIja&2qmmz`P;J)L!K*eBD zO8Y*36v>^|_}lL z-P*MMAZvxnf|J{Ne3Ksy840tJX0pvcZq=o)-6TqT@&h7(009{41!3Q1Sgn$NsY%O7y*2%pZwyovDbC_mOjP(OR)J&_OqJ}H@8fq(1 zPL77-$UA4^L8{`%`6w~#nvs<-OUiT<$Y#0qjQKOlH&1{ZAo9nwBGHDVuoJ9{kw9Qs z3fBWvIWZ$uAHOaR?1Nq2Zc|4ByC4?xm~MW!6|)MwqpQ1JOk55G z!vY}vhfoC5o35c*84Y(heFPGLaRBu`KUp)TAl0!Z-r{eL>f&s=rxud14NN7$Ni{1dV zmf~*AVuBT`I7?>NZ&wPi37rt5f(2g1FqQBMsIx`MSWI=LQh}E5t^WFt)S*Ptg8k_x z%2g2c5LelB9rpQACFArf(F!ktVPW~5*%p!NF(;-wxSCP}RgJJU$%Y$0>cx1HLU1P`cIINw>@vN{ zz(gHSg6>~&2{=!0S+<)OARXz4ySG`1`*9M_!9#A=wb6A_mqH;n0d@&mlZnK|I8Z`A z%T_)8m*)O`=RrF+_@VoBH`X3a@CX0i*G^BZi7!d*FHX(N%V_RDH|FH*(j_MM<=tDe zZlGEf!)0yhCENBhjpKU#WX&K>*$+b9^0=w4W)}+s$oSvQJp21uo%!V6HU2}gl+Kwi-#I3DZ zR0kZRDZF1Y6KtyNPzJHhN$5_v~FDYs5`&dD!+7U5(n&VJf-=kk>3z;oRGG(+3J= z8&{xLRjLq%7k0Lf;GA2%&vS%1-mSc7uqajPTeF>kCaM)A>B5j7lAxH=taud_r3_}O zH#}%z=a`{>8BMJ2{3{3Up!iTd%4Rw-D4fyEhe}oRsdoaNjqgu=r}vrIEuYt`NL#AB zfEM&vVtavRl>g~jZhHP!$IUM0(iy}>3@-Lv3l&w4hQth-tj$oAkGux%P3bn=Yv4r3 z6z^!@z6E-4q;!V^MQXHTe9SJ7A@6I);QiWM6T5ngPieBkE+Fh#OYaO?x4QJd!<$dl zpF1o5?IE9^n+M`op|RiP4w>~wroymmb$YD1qy{0Op&X^h#--!SdAf4}rZnlgUTMX- zZ~g7tB=>GE?3iY?Y=`wpAbb}TV6EzR{a^LOI$S4r4>uFitp1j2tuwktIup3vONZscv9l!q_95>2j$YkwT%EqMi^oFD>RkrRq3SLfe7c$FLlJtwjsJ35;dTxs=)`1qT+T$yfVk_~28` zT9B7SD~68~!0`&M3UZVh*$*E~VyZkpldg&v2h}_<10brWUy0JGIP>t(f*)G1IlRf0 z94>rJ^x$xPlT5QLx8U8yv#u<@g-E4z%hy@oF$rXX<8|ZE)Trs8`*iiN_ZKZ1GTNA7 z1i)=^rvrb>+x+l#cW_t_A+9G!wZw7-2GEn?a%#5B+~#f7$9ll(0x&)-KWixmQ*P zZsD$OOYMK=KcxR*UG2HOrFq)-ITF-F4^>SrQ&oPOeN~aU*(J3zkMw?e=hTH5I<|c^ zcffp~=qb=Mb}Z240|KScvmbWOVtdM4%=m0#66*a?rMy9Q{;~IWe^7T(q~790N=sHR z1GdtFXy&TGh3aagUgMRK=gLBwSI$LwS84Oi03j-c%iI;k6W63r(VUb=!@Iya2d%^* z{1oOx6fE9C;UQ$XW}tQ(rpL;khSSmElevLu#4+wT*9rhA~o$t^9 zpJ7=jJ)xWbdIfxneev0J;b!Z=u&+IYRo^d9CoY7v+JJUig&&l$?CTil=n+qc$U@ch zR{l=Nd;Y)q7UeM3HL<>)NBvclM!QsM5x#q@<-CF1)j0TI#2GnPywW(ja(5`+|2Y36 zJoJcdUN?)j3H8cn%(Dk8z^U7rb{@ZxYZm$l%e4eODC{Ve%LwOw(W!e5&FN@xThl70 z%`UN(JA+-ks+Zbq;jR{3Y+Z2o=M;`Q5SL~4t{Mb^vV_`*;gjvLx~*_CZqi99D;5mo z-8bTPLU3wo08bY~nzNW@iRpSrb|;(f-!;aepIx`3IRpt?@<(l#Ktk3ujQqLx^nFTzlCh z+crQHjsVZ#urVOR<+MBPHzQikZl%h$+j5*q9w-SM-HznIz5CfV+kaXpW+Wol2D-B+ z_p`SQ)VrfcPeoW2NX!CEq@)OHlD04kzp)ojyJ>rS{etHL?{a>BUO9IsGF%$yH!X^C z;M}FhA~>v~N6}n;^;Pd>q33mP+G0?ps)OI?Vk8yi_M6xP&+LDL-(6Hz?{5K`Cs(cSN7I^C6K@(% zd|69*gW<5}tzp{Qb8q=JF)-(1vfrCS6(vV1RjugG^59_Lv<^m_D)42c$mv>fA2ul} zP?eG*r_u^R_Y2A@3DD1g1YRB90PF^4opi48z__H^U;fmrYkwKcF$TYwnLh7_&4 z=!w>$5{&Y{4lCkAJ3$Qs^Rz+5+{`pmQ}8KgRro?M3>HHFGylGkk0a}8Xu^;XHh5I} zFVGqhoxLXVG8sd;8uHkP06a%v9d6##0W4J`B|P&WXjfRIH$h3G~DB8WHg z2qe@QW};MD5l&zrLjV)V%>+PoKJ+H{ZZM^;JBGgWsT+6HGo8xM%E}PFXM)+a`V2oH z|5nw8L~zAtP(uW*tND3-=3rirmW8&T5w!2aCJVPh3VgM6ShU&@CrzS3L-3;bgVv`v zSPgT4$5OMZIU5dN+Ivyjb%8MQ+|i|$bfM2EQ0WhH+aizTNp5@uVNEP6bp6D)yhk`Z zAnOTJe+BZ64&BAqESPIHqaDHmd{Nj?YnWLqY^N15{thYDz$0exem&JhXHu?2g zUIwr;Dru0D@li0(u-g0Vec(V{DoMsfV*rbDY6pW1{_ zc`S}2j9y#(o%u51>hbr|sn2&025kt3psz5eu8uX`(%QgX7t|R3UUulx(H=w;E>vz; ze)La*p}b38eUO+wvW7eSh;j9F+%gC|p@x>3YVaYKaSPnIhrNWgx+dQQ>6nGTPVUl9 zQpRCFE*s&)Hf8gh@Eo=+f%$ok_))pD7tCLE^I|brSSgTkTP=lcSURU48)Gnf4|Zpq zlh|9ZS3!HmJ`FS$8dQY5tQ5zG1MC}k7|swoDfUQHv+?gnYAT`To2Snafm|SmOC{nF zdLr;;cs6lggmv?R5=j313Dij*sHVyxY|y%cMvv{DUP0R4obeT#KSn}g;245gy+v8> zymRiodvD#}JvqO;J@DXNH}7YHNk%rK-_`UO9f@%b^{?D&0wfTx;gqhr#IdGoJJ{%s z6yi0ck(vV98xV9Gg3`Ds0cmMOQ`hn@VtmV?FQ`Ih zs0wCQ86=T%R8<_3zddDmrge%A1JQetv<)IYKUjO^b1Cj}9?FjVM<*5|2OV!XY{zxK zE73NN(mg#Bxl$~ync2nBcs4*eDNg!zV)qUuJakV^4$62j;`~#lyp-wGPK!iBdwdRu znpdh%;!!iaPm@qPbGsRA!!K1sQ^1*4?nSUku>k^32x;Bq0FuWM)Mf?Gf3R+c|Il;q zmKT-9F;F0LKq(XJ1_qwU;c)slbodrV{)ZAth6@ID_G^&9u5UKE$Gr&4Gq1E z+nF*vA(*y!+#asKmbWkCH!99eI-6+w=^m+>rT8QQa-JDYEU}rg=|Vqo!_TiE4u#0I zOpuAD>f=RJpEO_ePE5!ZmhB5S}lxHA6Dnc+UU64j)GaIr88Uf7?MrN zcvv2;BF9@@Z^1l3Imu6?IJS#Jxk8yRl5rkjP4P{i14Aq7Y^ZcYa@LJ6As!xfQtz z&E-51<-ube-oDJH?URRg3!?x^Ydw&xGbI>)mFgmM-G@_iQ0rC{L@&BU63O;OR~WTg zlGOwJfiAK}L$Z;rvqv9#tTtd#uUrbs1O(Q2V3jdb+~%RUT#lOFsE{12)v3hCBvP8y zdq$$n<zlA^Mcva<)WQSK_ z+^<*CAaK96Wtmv|3P))BsNfDi?I%xo`EsM3DCNnfvi3+lshjf={_La4q_%~AY$a=6 zueXPvXC-_;Fra+H8}ETwqdbLvdYMdp)*R!Vu5-hZ+U8FvvM(Mo$i(BC#Gp$Pf@70{ z(NV?g1Db7#4DuBYj%yN9J-D44Nr6W7d*-&i2)HVo9!LC01rSjazFP3G>UMOvwXQ7B z5_!(k1T*1ratN##2(0_1AQTviBhpQ(J0;QN2rB%q@?(bwaq6wJ`mP?;#krII_JKJ?)azx)szD`UkHLxBt)4C{JP-Ac0!c})2q5=kchMicRa^4zw`?;q zK6qtNQ&(w29?Cj==y`(!tII~el*msO`gL8S)zLvJq z-)<50GRrO|-qMu<=F(#u1(%Y3rt#6{#qqbUs|>!dY*%lZR4QwLXLi3L3(v3)Ph{e0 zU>>QYb3;yXpZ#cRcj!Hi;3%5Nb0x`YBWyenEs~GJKUq6-CpKfLBDbF`F*ocW2KlIB z6V)J!-`R>t;$ITW1Cv{VMY3%3XK2jk2^KXZB&AI+T}G@dpVY&}F<#pqgdhzSQM2H7 z-Yr1sbgmb;l@3AZ7t4%Bg-&vu@8`ubJ4=Z@P%$cl>h;MMVBZG>Y*f*QP;A)b%M=^{ z8!s7mT1&;r!{l)^7eD?k&9Ypu`2;^G)Fe4hAD%B`fZ0?xeB-|~OG2jMG-Aw4&Z*kw z!NCRp)C1PJpKp#!+m6xQr@RmnFzDNKyrKQa3g&$yBT;}|hG18o3W31!SMBJD0@u_) zsIrEW;V?hEqR&hU=(#D#&V0?e8p23{g&eD2(mr?^K{jbIANbwosKo4cKt}_8r9M{p zoCVe=qM`|62jGg#uJ^%sDXb6p5G3yzzsg=(&ROzh!Xgoc_VI1e-%Jg!Pci(R6T+~B zDxdlOHfFw!FkS$C)PrwSQf)-gTW`Xy!9`b&_Tkn6kG3GdKjEv%yz=>BoyGqeAm>R7 z%&}Ep?J>8@>>x9-OhNMv$c?f1lX7w>joh9)GZSptrr7NsD_)MT>l9D4^q{{jpK+dO z*tr^HH||oZp@#bvz4iLYlqW$=KcB37Sm8N)xw*B+bK-p`7PUM|dnaWg?e?B|ipM$O z`B;18L!n~lFVbV!GbmESp*LnlZ%mM ziR>c^-JSO$ptJ&Ma~~n6TzMw*-3f+m>4Yo_ znwSqrgYq*=XhgfPS#RveEZhDF?OZoZd&s<13_i}(svkN?cJihh(AFw4Y{ z3{An&y@Q)fzV7M}HcLyD;1rQWz;Bchb3O7bKTyRIT$2@A&KU65o_+>XgW+Y!ib)0> z2Jn!R$Z(m)Ye;uZx_9JrCoPu`Q8&(oZjeu2^Knt?x+P;|sI%N;)<=_fSBvOAi=#St zC}VQEs~tP;cvg ziPNdPG%)cUHU(!beFlMwP$$mkog;%dDlQ7xzFzudRz1C0)36+y-cO>3Rl=Qq=%{Ko z?j{)y++XE;^#6mO+#ha4qecDt{*umyf|%{FN6Rhv%_MMu-5-K@5gl@^)C0$n4k?<* z1!0SHf{FkmbQDE9Lef=|(6`Hn&A5(d@k`jk>;JAbXO|p zwJp$&1+vOztiyv=GmTDTl6v#T7EdS`rz7~g``?{syBpj0j@x(6%_KLaKVJpOtkG_4 z`hyE$vTD=MlPBw3aHStR!}5xKOyBVY7QUBTc?^MHeV+*v^}^1B>G~10dgK0}j99Vd z6l3V6-cIOpcCe$f<;$_uK4R6@$L^aS$d4*6EM(1)K-ixR-MS4y_*Cn>1{aZvmA&(5 zAf^tg7oLHD=wBtWkaB#<$kF6j;M19^L$}qCl@L>RK=XJOw?IKt4IlnJjG)$=B1!kd0~(RrkJ20~3dMihTcQfPWzi#|q1 z5^4)xqST){gf|2g9eM?+UQT3CIbr#mpAkC)1feN}#l1=yV0!17-YCHe0rj3W=JjH| z#`61vi(1wlN*0x}o1s@H4WDqWpOvj^`!J{FcalKO)mkeKXBn+{j%dehoy;BWr%r}w zrP2MtQN8MWKJ>n`2j#^q$X5jDNv5+an2%^mG^C62dQLxa3Pn_rnwFu}2ph*f1#LdC zme~KY{l}32<$u#&nOK(Cqi4ow>-XML*rS6QT4`k_Z&u!?O8cf5s&REW>f~`y zZXI?r>_`_lm<5(V{;7AIzuwUeJvZoi-omfv27mRMss(@SD|S}JE`Ry_1H7{`uKc>(xo8(q0oZ&}KlDU6N za-2SMt#ixsQgI!-WL@mhuCBIRlz2oGOf|;qz+^R=Vv*=ND5zcH4$G4nv@_MFFJQwQj)K(5MTi_k6SvBp%Pv<@C?H+eSZ=$NSi-i^lW02Ih(_K zFf}>sH95=A&_9$9fB(`9Bcd_aNcM-v<+^Y-UiiMg8#Se&n7HET{C;K)?SjM6j>1Wb z(*9QBR9yXh+D2rC9$Ye4!wEt`blo8O-=vlBPWUg=SJXu+{Naq!5cEB!+Jj+W~}5yQ!=aoJ`fND00aOtQ#LaI0AFSF*%m(n zFxQ!0BN0CpX%>M6nG$c~O#*F{4l+1?%TSKCtScXLj(0cjzjFEn05e2jGXMZkV5Kq5 zO7h$$V>Z%-nzxZ7 zOP6l`$c-dfx_@Ly7A@6JvSf>vZYlY0 zR<0#vU&xPCa6A$fX@*5|h%$}}L<$QUe^NwFi3&XoLy=I_F%>Bw5US)VS3#9Xs;7~ld}}Ik z;TXw#G^xs?A#^pUc8tTF5P0QQ!xIn$6sR=CYVko$qy(s@pe`^{sMVM4I-+cdfc!TU z)6X(dMXoD|)2}!keWso$xCb<6xKh@q!%XR8XliLcwgh&+UCzSl4k`Sk# zJ}KY*=>&MyI3xkZ(a{hm%F5og_mD@b)=1ZsPdlWT;OG)rf)s#BLeMA?3<3zvu?0{_ z)PxiS!>XZ%_(Fh62#O61cCHL};(~N&5-sU+3!U`sfauW!f?sR?&!U4AdrG`+f7{;RMr~-uy zm2eG!pG$$o5LW=&P+36m?4SNAuSdC*z z0Zi%4;wuaHC@_UOKt+`fRCTKT%wh%lAJ2(MPoQEtip6o4tf|~@4UvQ^Ak^Sv$1<=( zX7%NupQ=QizOF7oUP>ZLit}?Vr9B728&23zO>=o*vuN^rHclXX?UsFL#wijdC8<2A zc}+6-1gELhqDO#O>tHCE>%Ku# zw(QpXsFSFY*aiW67)Cpcpupp%IfMi@{Rp9+Ysz61m8@Bs>{Wm4q1Kify1Mm9ytGl)w5Lw5zeh=dYU9{`k6l_WK0cED!RMYA6gJGNj zyikwSa%Gg2t%Rdnwb(`o3=s%cW11O2-B#7xig&=`zOk02QI=4pB0US=xrm~zaioRT zgq`Miy^G`39Cnhm_BqrF@kxAlZk?@1VW)49y3HJrKTasxP1!Ab_;0EyW*A!sb}5Md zx{1M_oXpgidIa-GRgJr~2Fb0^M1|{0DI21j&rbBiBsYhB;y>7u_-V-@_%mj5Xg<8~3Q(+pfW=XDx4(wAIbSZS(goCo5Kh|Nf+g6{kQ@b0v0+jYq8BT# z6;LaxI1f4EdC+H31Gx(jkM7bO=dMK7GH}%$Dp^&7WjkYRHK=m7HPtk4VHoo1bf?&r zy2;h1RTutb0y)UN+RMnZ35hbW(*b%51iz)d2 zxJ8KLTLLU%hM}NBIJ53U*P+iu_^Yk5kP7Optd#jpoL!k%LhBYOP&8SYu4aL>px*J*mP*Uhq;t#($@8mCZrg-&@$h_4x!cb#dee8*9_W!?{W`~) zo)bcTgWo9*W(6W_>iex`OwgP8i8Mu~s*2k%SvTF?l70;`i7kj)>S6)ri5X6BuqCkI z(nqS71gQXBK%&2>QvnCda$Jr9t3h)Pp)S>$PaN)vrp+%=#jV(feavQ}EfG7FgrqZE4&-a~!x-X&%@E)+G~wX3L^c=%mQfomJZ z>w`{9VXag#zjj@h%_>Q$HOHo_^s(^snxt(J*`1yfQhI``gJZqdl@e?Tvse)$ovV#* z0UcbrRD*RCg$h-`jJQWv_t0@BK87tWG1Vu7lxk;Ey-z&YgvwF4Q-265s++{?6LwFV zfDRKBSl%ZnwE>%-2L-W{1fTTm1m)D^$mT>I@Z^&=9(3eX^!I84X>*&jpqkFuCv7ME zHUf#|mlN7fu2?tK71efRZve2}wwei}^TRnZeW%s0^_O`@acMJNdW83DBdCfeUHn76-c6h+7OVTNgxMYPXd0We?SV5OBX!8fm`+ zxnRd_NG0Jvw$R8rfq=*LIL|f8NJ)XtMKgDx?x%eAivp~#S)mZfC->g=Xhd}>PVl-zE^E=O?mBwty| zA2*cq;5J7pdyIgiKcafJ!`Sa1C7(Q%56~gws-A}ZpYrSgP8>6mW#Lv(j|D}AP_HGV zt8W4deaQU|%NcUX`fInMsc%z&!-3GZ>yqggJF<`xhGLL#R(Wax!ogDtS&pxUTYTzq zZsSJK|>^U^aB?fX&srJ z20sv{fZ=lZgKvN(VkfgP-NC2AI`V-6sAAzJY3t@7s;!7|)3f58bn1EfN-(ncrQg+; zY0U5RK8RJLlcR;wy1DS>bT6a;5jmh*sPCdf6uphVTA^muEL4ORr1PKE_1(hGqaNb&% zHP1&2)ztT}{XpdgcMh^f7fae1z`+Elq?mhiokp7euuM(cCx=^es<${WZpSnMYku9& zR6bSXnoXOw);ipmovFVTNF0_Lt-z z45*fPFBTzYb$f}w#0r2|C6w4#@bl7T$^Ug4AEDy@-O-1ZJoIB6KXBc#bqs9a{4+6K zhfK|*Pjs8B-pC&{?9Aj|!9Ts^RM)p53`Ot5WpgzmhEdOkFg>miOsH6(i1h0H=|Y>U-=`}Jj0B>E zvW{1YF3C?{M~_TD;fVUIt=Q0p!3nZCe%QTf9X zuoG?ckKgyz;I}f-$pZ-uk4DXv01z#FyU3pLAsV+Ot$86(}o15 zBmNi?ag#&6hwwW1Gx|b(ZR6*2VWW>lIYRp^@wr24SrReF{!5x2H5EQJ+iQlAjzhCV z-52Xp0-Yu(Xb}C81fFN_HK>yPby%Q14U%HbyW^^Vk9uHuD zOb(@}a^MZ9?pv2-Iac9O#n*;RLa`aH_W3rs=>~_iXmP>=uXD`ZPZUwl| z#pY2v#C{gFQD;$Dy3I&{qWU+C9*J79P6yy7-geDx(kF*w1yMj8!`D-zF8K60$FjL)j2tcJ$U3OYKS9DE zg~4^u!|xA>6P2#vl#fHdebVB%A#r!L^*r7AZH0TsS)w6pHgp<>Dw~Y6ACYL4LRd+M z?%b2{d`o8~LZ(&=BFk|rrCp?`{SNh1_9>5ds8+$I9Lc(EnJGe}kik4NL~3kJxbATb z!w#KcOD5M*#Gq#Ox?Gl8mu6%gh|%T_(ZZpjIUIoHq`iWS5MyZ(wJLIIaA~jK-DgHs za`9l%Tw95ZX0BHh`EWkreOq8WaCr%%z343c+q9R7_}hiwgIImP9-QC1x-R&xW~&i2 zV)^s?QkRp&4S4|NWqL4dn8VZ{NLR|t!;iewI_9&%7Q>q+TqlIm#6D?asX0#3X8B8+ zV+XE2LbIA-e=}iZzGHMpa%x9-)i0bvVMxd`&-1D4M%#=Jm;=kqy{3#-KVi1Z7fONgEXRUmgFwQa@!^J*;?C#v_5EbA4>s{#HNXuLL^}^HqoP!pL7r%nYj(~Gt?XE3# zEU2CIhj~lOKZ14Ua!zmaiEDNg#Q*(_58wJ&`h3wgv`yrjlhu`E(f0FN#8(`8 zmBy~0nT#Nd29fYZ9BzQvW=ZlUU{~DPrB1o;0&^g`sGyRq*H*j)AOmX6G|=HAn9 z%YdEfJ>w~D*Y72V^rz759tn(y971M+=*-8Wm2^}hD+Aw^NKNd+qDe=_zdKd;!-jC3 zi+DQi6C0;>008NpLNih4W=PL4wDo6FRyRn9_>a*x&NvKIBB;|g@AJYIqt?QA@!YsF zG2WF?DeY7__D*NnPeD?Ew$K$5Ww7>nUYs$`MY=cj%8@ySPg7KvBPK<*CoRjM?`$tj zZJ+SZU3%*K&2JwNZvrP07Vk-Bbn$jm_rUGZQ-fCC!LWK0q>11pFICPFU#fU1%F*qRutVW zP!2;0!Jt|523%z_082r_mj@S5FOvzK-T7wl``r>STsUcL-3}+aZb0A8ia_Qgr1kv` zo)Qmd^4lhEo_7@JMCUoyn-_AVHLTSn+kkiTQ5e7j4HeYdm5n8GDfaA48p?$w#SfF` z-%!l_`l+hB zA>p^1(kj~%6%s**j7S)Fo^o&D&hs%Nqsw>*qvV(GgGHtx&*!OQZieK&gqbdB8ZF2z zRjNa7OL5 zF%?}=zSaUfUYpuc;sJj4y4Jk{xriX7(tARoxCsT$*R{QfKuE{yORvH(m_-R6$&T{( z&hh1P(MgytX`((Vi^+flOt*2|hih9I%00ZCO@oe)r+3V$nF~b!1J_>nS;egCRaogb zJ|raH*8X94owd?iqlZJ2`kXwzwD;<_@S!0;UltcFHzR?v7nJ+!L)6J%7QRE|$hQ^E zzIG>w@BhnBm8HhhPce$>?Z{c$9o@)|V2$_A?Mor%EBnE2ptq=5Lj=)&z20R9e)pH(t@JS~6L>vJ+3dXA?a+;y0am%Xc3R zm!U*CW<{2nrSmJ1f|B(m2*ht+U6-53<`g!T$BS=SKrrkNv@1t4%KI6QZB9Vw-Grl) zCUJa%;jn}TLp;Q!#u`n39e_Q<-F!4}6r@7U0Op45+13di^wGihwBWh16YhX~YUa!$ z=6Qlgcx#vkNJck4Eja!JNu#5McsRdC;$JrMJksW20QI2A%@VK?a^9=>WZqx%?@D7R zVaD1m3!ZkHNT;5J$JJo&!mx?^^)p*gaA~G-+w91(pYh&p;o`2i%Q+7&G(&@h>wX_7x)` z|K1@kUAzNE@8E(_zVPE(BoYr?jIsL%Z+ru9Ny-e6ipw#hWitm%-(zNAbIy|MD3i`4 zxE{7{F3-3zBJ|}*Z9!YYKZ&oE)L@Ln)PZ1+*hXDLVnR+n6pexLdhhrQegyhJr!d0x zxSDY$eaKc>Y7QafiDh#!%?!JNF4qn};& ztVQoXLtS({6@Ls-GY2aBH7I{7PJJOMI0TL~E2VtOx4gWSMC<(0nWRGM5dLOl>m%1- zQ?+CGx!ipR+@lnMICOEZ2h@^(P}y8=pFuOeGs3-3%xhD`Doz*2Ve1Qa-FK&9OpOjw zH_u1e@DDZXgp9+s(t`@Tm^TVz!G)WM_N15}c<+6o@IZ(02(+QhU|gf=kEjmDf3q$$`#8@5ay%OuU`|P&qJmvL0zee#tR@oVF_X7L3Ukp0@I9)#$P}C*8)- zugYIs%?9?JBCkC#CHOc-3ew=~DS}Z=t`aN8RoVAe zy(BK~c#lX@pQ(-9-u_N0tqZ=&CATPy?LP-JB{QIY?M`!R<4fr43p-C1{{+4wY?i4} zPqviMb4PS*zgxM9(^#$n;2AXGmNIc&)M$G@aFG(5A8da6d4s7 z81^)-vbCoPL32rEJm$o&eTF=v!SBV$v>)*HK1hF*-ZGMN5bn$&tE5UUotmk3;qRK8 zXY!c=63X!flmfPZHx3KDQJ)k0=H(|Tvb0z`iW1HJ7!8nC<-~Lq50d&P{3gx6wKble z+M9k*_HHNO)3zt&TQzUBK5ddZpow$uMKo?Z=|@TdvQ%T7D+2!-80H^MerNN=T0?97 zo@YYK$j@dp`bTw$`51kQa$o|^l4U(x*tDJ{{F@+6-LPX|C-GL>{T-t8zXkh)m&}H0 z1b;|7az;R2BYt8uiq*+qUMO(nu>Tmw&kk{I35QOYP#6MC@lPp!=W`_eTN~UcdXe*NgOp zdkAXgGR;8bf;zCnAlm4zowY4X$H$pHOSGhsaxbj3wfpg(g6g|CjeAiPt9;Sn2jNb` z4+-lbZ)=@}nxD0uh%AvY-XTHUVF-EDIyK%GbqL81?JfT!gE8D8%|oen*5jBfJr)(} zgUlOiS0>Q1u#X`~@-Q%)&YoOyy#MI1zi|)CNp6GN{sE7K8c*-lyTKu&H+(V}gRdqs zs&!-kqFWK7zdS$T`>rh;*)5`?6soAo*(oCbc7kX;sCwqaoc7mj=6L*~weXlVCS-P= z7oJDl*6iPk042B7Q0On_Kpb>q+o8UWf#;rdw}S|S`1f{ID6RKX^`}D+p|^5;_w$x> z6%vQ*KYA{#J@j+7eW-m=L=S6IO6^~5zlS2R3}I6o5*Ng9Jc57UY~N@YB@N*Dlesp- z`K;T|XIHf|i%QVHe?Rx-`4R(o{-W8XsL0XeyU4a_`(rw$+d}%HOVHSnbie=K`CxRE zeL?@R*78Ey{RB5Ou9xdaG@g$-%{`;`_O?}<;Hhn9?GR|&tv~t)36DP9&oA-6n!oYp zcG~`PZzOUl;N?&@2tw?**|Csycf((xzhyN%IpXs_L`Q>Xo=ZV}KQlHbA{D&n%$p0b&JHGhbHY07+=Hri%Q!SeTr0Grlc3i6p+O(1 z{%YAt@Hhzd!k=Fgbvhr<1?9q?5&J0qfP~-zw281r`<*=&6L|Z|vKS6R-fECy!feq= zXHuV)cXS>P0@zZ);d{xPE{EvZG;#gyuW|CAiefH;rYO&T{2R#Ar2DD@Tz@!W{$4Wh zCFDf}YQqk1Q-Jqb59z$`T)`*g zCyL;C2ths_rgdiF^o)~##~kPs`6ivDGHCi$`ns=igPsIWGsm#JGEJSS>fhV^KPF)T zU48!C<2V%VXKurTWIFqxWQb21V$mWl*qENdL>fB^(~7lUoS^)hbCaP+OD~c`2PqT{ zmB5~E9_ZdeVgUzReUs~O=8yCna~QsHLoY@?_u~)_dq(V!xj!KvrzJeDz?|9k__)e{ zu}P^lP_%I!KV3^y^@=&KjIR=iXeh4HBN(U0)9qP54h_h~Yszs(2i>TKD12v@yU%Z} zQ=*p)?*n_64~!mHK4Z_E@J&ycnWKJFB+7);A^M&h1^>DUCC(2L1~4b2E}BB#ka^F0 zU*_M%9+X04{Fs(MwI!HLlGcMEUI@)+1IRT0FY&x_@z14_x=N=7ZHi2{?6Aa98)b0975dIAbs5Fke399 z!zz7TO6imL?GQ2o{El#y2XJWfZFS~xvI^Z4PgaJf)Ujd+Dl!Zl? z@8?=iZMq@^y#1uB3PM40jKqs9`gk(cI`=t|FD>MBhH10JEt{rKe}?rfADP(R68QYa$+k+vZ^4vV{jY zOS75<6y;`5E$5+ExGQfbWFR@ySS0{b&?I315zGNG#sLKc1Sgc}5Fuof1OSnqU`R;- zUfz_1(vYIZLL3MZs&Pv_=KVsWNt6^J4$u>v{_`nFq85sSqajF?I1EBjj1l+-ETpQb zjDl`AfE5Guxs0UdPC|gBs2GkSV4Vd7(kC=vM9KtM0l`#Z4H41^Ema{*sG=L<4#xnX zlN?w=nt~8Ls6dpmG^&`-1jBPAFh>k2U^HEplq`l%3}}U`D^N5|h_b2xECeUOzom#} z!bmU{UN?17s3#hgRKZG(Y6`CKHGn+u+&?hQ|!S{N9nHVt3H{IqjZo74VThCDSV_g2d3TP%(c$bX%n(Wwfh8&MazjoW6- zF}Fc6Pz5-F2jr6VSHv{z^Zx(p0EbO5au6geU=`s{(*0T$vI;lHko=X3lm+ritE(YU zQJ^!sEIrgDgEJ(y2um!3XaF+DcEM1#hElr@C|j_or0c3R(zR(C)7mpUi$27OjI983 z>!hR)w+|Tz1G`9SVD$Ue#MbzBO20daB`O_-mfVxtlNRNPwJ+VXuZr9M_a=YI0w|q#Qo|_7TnmOmHztk_E>&j)j9Nj`RLg*U8 ze@w@0{hgxUjFK;OIoqvD){v(uM$Qvhwx8+PzGFf%Iv19H%M$2D4*D~sZpKolp;6$o zmN7h%Dir5l;o=`+Xrx*;+l~56S<8P?(7 z;Ig+psxS5PQCw17#6e_I#_@x^NP*)_4{$GlZ9OKq35!Cs!4T(*OTBo4oF*Vy0o|^_ zvd)vE13595={W$inA$fvQ%ew&t~exvMk4&%$u1)-e{+P#Ad#6aQijJ)WMG8M)af1+ zH(LUtfF(MuTwQ{^lth@smZ6${FR<|I6Sh>7Tprl$nmnEj6Ubk?WgnWciUdhXDo<)& zQ&K@;{jg!Ko-R^WZ&D*^A|cbDOjSzCRx2v4bh#I$DMLL$guSK24(X{WG)5X}{EktC z8g*6lST|EJKys3`@uGR8Yh_4Z#cGj3>jyL*p@}!69eeR*6Oe6u`mB6S*8F3~b5k@& z>wqPkuaEUBx07b$NynmLqa2ZpK50j;9f|$pQvvN>NDiaHRo<&fMOK)`JXOOSH&&>f zX$XyX%rB^~bIP-qe%O84o>Y2gGYSmLAe4^E> zypdxOQlrz?yy8uuQWnmnqXB({a3uH2G$<)zKvcO>Pd=j!i7n~=ET?}Xs+{<8S){R@ zQlV|DOTI{a|5yr2E70LgM~92L0tR-%1W%H-&{#H?2RsV)nQ{T zTg)q(zs%A$v89`W6dvAJDEk;ePNCLP%`|edWQsY@>{}*(h7wh&R4H|zbu3{XtZC0` z)_o6E)#Xtjya`xR5|oGA$b`qNudZ=Yj|SUOM&!)uw*dRct1qzVCol5YF^BhtB3?>g zPGL_yB*09AACVbH5l^)!^)PkC@?%y?1RKN7c~V=gUD#K?-C)--frbVi@5WqXL1Gd= z!dw+tfw9tZSb>v;#!a&bCH3n!^e8{hgP&^erR6$xanFC|FoXMV(4Z@93>38$Vd2&4 zk05+ze;tIFBeivt7iV+k8g^!_>=LrBG;f&TLhqejA|3_lHYoWiaEP`S3`E(T0{1M! zDhDi~xIxv)^v0wH1D3oKRhC!sySQUG%Lt><B_ zK>xVaiPy&{>U`Ye=p$v_V;?erUSi-(y`_}vbqp!g+Q z^-MsUcQLKbObb-Xk0dI94ou_eYtU`tmF($PwVaBC3+e>qORTqkVtV73d+AfzB(Sk1 z(1O}wU^9f}&XuZdhWV+KseE7U+LEcz4A*u#6}M}yJ!Sks!Zpgam=l|BCraytpFXup zv(lOS?d%5KGQfF|2sR@nsL;jais5s3uW>i{wO^c|{F`%=d`W$M;sHum5OySNR}m1+ zoaL-#R&|2XdVDPR2c4ZErDtrN5r(merkXlQ6J#TxZ$YxaM!QkIw6Burg}?YDWLdDNrG4cGuS{3u%PNiu9& zm{y~x9Si{L^^^4w3}AUs-kmPE-dtY5G0gIyKu+z7`E@I6G03->ljra^aCE8pE534= zMWuBYti}9N;|xd|$$1=CqaG-!-85ryHOJOCI#T(G^D|fQ)>Wg}K$BCYh>b-fxu_ukM(EEBjy*^^Jvn#Yx zYA4sbRRZQ;ppQc73ipHc_WVu1GZ8@7jm~+(CR-&0!exX@&Yk(jM6Cq_cao-60tv8* z^sQhOxk8#yYTN{Cg8&^}jo!qvZKw^ZYgbZIxg!Bra}_Z?`!4~Rf2SoN#c(7mgo16hf3p&9{Hxzm@a_y-R~FhD z&9Gh3w?o!h^Q}6D)$|=Uz~ni3Ha$NiX3_P&!2BYVP+MHAYY9Lu^_4ox*W8rMYrI99 zb-Tkwz3qdr2(KTGmBtY&kr1rp?5OLbf`36j&bLPxYLvdBKf2tQ9B4gvxae)(eULd2 zI@}OjKy+;|ZpgxxDy|=IK}&M~j+D0K`WkJuEHh^y!km;~)=gbzuoA;v9?GurzD>SN z@dZHNhW)u2ovtYPFDI2{WN+lEDwJWLzHx$8mBPH3{R(Y-3iA#6dTzmyw#Wze(w^Ri zG6Gb~O0yq%OJ7A~3(>Ytc#>%r#=9>^G+w)|G=00TzEg>cAQzfGgSz^ZFj+Re7Sb_YqJYMnIW=g=E0OsbnDWd7lK8bqpt&~HkBIN}hL+@FLzmmr0dMxNnzw9qjXp|OXSonwaET)!v zx)iYPFJnMc>M#+N%zf|#Oh~g73!xVzaF9p0|_L>N@!l0rS*SIQON5b@c-EPT`#is$~mTT$3&f?>h zywrb;3q)bdq3#d22v$$*{=tJHPCxH;fANFYbxq&z>*nl@m>xhb7iOW{v2*#D+}Tl)J0=Y)>OE$0|snR(i4No0g(L}52cf68pgO#Kaq9y zKK9Oi7`M;f?)|9PPgZmAEzB=Z+&l&@k1Ke#DKy+{9MyJ-5fD(KPkC>++E1Pp9>%^s z?v=8|k7(wcdX5LfU3xCQCXj0+sqH}=^)^1VkEmxCXaS-%)V+33V-tv9+cUe_H#$nq zc~Ghq9^zcc)=f^)(oo8j3ne_!5@1xL0UO+Y@h!KO?n^hG1=O@QE~c)~2d4g&%)D#0 ziwoi^EeCUhi*a+)98XZJY{xuy9e@lR33{gzK zi4+6^024#eCz6EoV?+*L{WX9Z(KjVrk^96+y+T{2OI4Mn6?O1pT@R^o9KmwL7~ncA z{rCuYr9CE3GUzU>N4;mWnXYcT$b4upaWB->B|otYhoZqq)6K@LRsTt& zaJ}1a#~!stLhKXU#0YqgCx@P6EuQ-(J(lhAh^EJ~T=IQl+mzBKszpQcJ)_rdVYasQ*=iyC>uCDx6wwg&S zG;^`#%ALqzNnAy-KGjVKc?oI$-Xgwe>yLR#d#fFu|8&9x^DTlO(XTmr*}+Wnda~k& zwVKEmcYu=nH2;#2geoJ!$ssBg7eaSMed_zHB z=sx+(aqr5^F#%vl7kN`i3 z94{42Spt_ve4gyMA{yfjg9JRFLB}7?%x3k4(T3k7K~Yc#>L|to%Oa+KXTu|TB$3w zMsdj<0tx%5AAC)>Vra#)`r)VJ;;y z!3Lr05X~%@2=BLxX^o(>>*ZOUSKR655coCsI|8PC6gxR1T{K;mq|!|80}^1mJp%d7 zBhJzp5L=^nU6Mq%N9SN(Roso5vun3rPQ$Js2V{{>W0u813SzdYln#xhy+;O%4WgQ8grF6?IUwo|${!&|Yvthv5#GnY_&K3K(Rs$gsSezbCPHs+svdvO*c#dIdc zt18Jn=qrKaAFkNl-`Wti4XO=4kp_()vnI*zXjBF-;XX>dC+Y5WD2mxvW}KpfW-uJs zbA-1d;|#2Dy@&#_m@OgE(dt+o`IkM1lyODv!h@-twh=@vZs5e5hd0`u^VG~Ci)HAx zk+gVih{Y@ zSeMQ4h?mrY#ZSH*%S!bg_MP;*ogpgIPzpkV!5%oq+m6PTnLa5fJzlG4VDfKX~ zkXfhJW5*$Uqu`cmQmvudWqR=!2m_4Hw`&+FE7#a@BBGLoGodJ|j&L#r=-Mp1WLqTl@9a-9F+&h0x-x}Uhan{W`9CtYJK z-B}j$$KW7qWk#j}a%Ed*f#;Y}7rA58X*EbXX3pG1opH`O@n9%ob(T_#e2>^SXSzEd z170Guci2>ML*uMMVw6PQs9GN&%LAqBTYube{^Pi0Q}Fy*2Le%=^%J9pv$8(7O!y&% z2~~kIuLy-6%KmNV<|Skc^xWk1%J%VZ?9C3F;1s9+V>hy_x$2Pwh2FwL@FCsKfCGgc zAU47@7eWKT1W4Ne4$41#9g~&EA=$&QP4)4ltp>t8=Sq z)Uu{~vfc8)&1~c^KwEYy^N_^%x@4iE$^kt>Kq2*%I>)ko}fG@ed6b@+sHe>G> z-X&5We;>Dc|9FM}(~aM=wE2B=;j=Z{$l|W+DuNE8iqDeUY|0#yi{}377LN3SO8Ti0@8tOdlm<-)6@KO~WKB5M$_;rZXW9DA5%kYJ8rz9mV<%OtNK) zrTNeluN;ANS!|IN#>FG00E(9o9e0_jt2J_D(CT#iS{>`8Bl2ts=zIG0i{U8BW2hmr zT&!ky2*F~V9U?5lXxB}J!*esWU??&(m(nq?KB3XV0~#?!8P(gJPz4@^NG`w4}pUq*mws z8wQ$(+2`^UyKP+HsS*`Y$3k+^ z7`M}|b)`()K`#t++jF#dmC*UWwS~(F9m5;DEb|856%ih!$AslijW}uvyBG@kxY@t{_s! zBc%9c8P+tXATEs^KXWl35X9C_&?kR_F89TBwSJe_KoH!f@tqdqOtyB2o6-3HcFInX zc>SkY&nfIOBWv}FS3za95w~K4@Fq$}C}x$ECh!s$nH*1uv4BToOg#z7rNc|fj-x9!3U0ns2F(a7Qi)eX^-;R+|iw9O=wGLwQ!+d#yE1Xl6g9C(7zLDFmny*wFFB1f)o{zexFB8y~fr;s@=2s z5BAQDMGT03Kg8_?P7PAyskM9&o8R^5UAgWNnU!I-#qH~MFT?6)8n@)C$Jj8}Wvs2T zBDxO%v6RJ~yJ&jUD7F@f5gLObtEFn(vDPdM44J7k9;DF^Bm2vj8CL(|ig%o~>M{+) z98P11%D9imS8t{0+0*N?^wTuE+UqIKnHd+xhp`kSmcMIiUq$sBG7Ofx;!+~*6_@hT zm4Sz)@hF?%2@Mt&P81>KEh}xgFx`)$3qmUk!46Xnve*w?4dXK?U@f_eN@tm#rTdw& z+!&mEM%eEtAx~|3O3U0w|1y^!U4D$8?vm2UZbXX+|@ zX8zl$jk1?(sU*wkdb?NZ0*6RG)1XbW>MF)pF85REztih>edj3rJ-29Ts+Y7}PbC#i zOEezm>;p@*Ldjk>(3=ur6%MUjPbFVVx(b|6Atd9)^d94X}`OFwS+(@ zjaTUPlD82F9^SI>L=eY%$BQ8zihHM~&ATkG#fi5-$B=-}{xj+{oft*S`u_27Wo;by zT=5SWc;p2pqu$Gvd{9hA8;72w-|p6p$;FdU`nn|#eGxsP`vo4I_~bSS+ZBr##`Do* z4+o0lfcd>7g&7hPV4@sam(A$W{`;K6eMrQe(acxhM{AP`n!zf_<84e$wCzz6G`6*^ zG}N2b0cK}iq~F#!4Rb81`GeLx(!yuomk;~a=rh@KjJDhnxw3sOeyo2ahCV*o$LQTQ z%!?9MuHG?|u5O1tONGv66gS4(f{BEj>$ z>24XcQwAV+gjK7>EDk<`h0utv{(b z*wL25yZ_i7V(~oI{RAd7O)R@F!udaPjq1(BMY-TmVVq-Ub|^y6@uAS3_Gx53A9J0o zM;JY6Bdvu9GzoJJks1V-{j0;LLXP32j?a3F3 zEBchf1FxCo?lbJpMgf%uSyf8!-CjzDcz*YH^dN(ki1Q|;vSJJ9EvfYnJ4n3|`djkO zp+TK&kjZ|2C%}vP7xs)om>A3LJM6r`*vs=CA^2&>ywN7Ip`3Gmx(N- z41n7iB%#=vH7h6YQ1@pGVCyI^;>yMz$8F1a|==+cr# zPuQaxwQ1W(l1`mA@gz3Vh0?c?BT1HSKKYF-TRNX)MiwpQeDWK4vZp_Mq$4$Q-9@jv zF#G@jGb3e11yJW@y*c0S*1WT3xjdCDv*mFuamCw?Z6ts(Fvbl!9knNt(?k*y(?RTi z{r{+=NHHo=Gor6!sst)^+tGgxddMc$FAUo*N%dal{@Jszl1NB{ZBG zOx7v`@()BFp{bkNj=Ku14A+8Sk#C)}u20vUcI>M=L7Io8om#n44#1c|GZHEw)flO3 zy@thjAPyi5xEg>gfiZ^xtQGH5rYw@Mp9+Bi$R}WxXkaV|O5t&VS%D$yr!2N;kOoOv zDAfVsN-I3)zh3e74h5|plpTJmVVcq)1lS^LB|;6sRU`R>Ryx5ZYh|dHPW4!~m#0w? zvSX#ItuYMNh5|@my7Lp2CJLBnZ*4*63hkptI@x8#$&ajO`BNOnx2}}SFxJY}E>9W= z08PH*i2)`w3)?+XrC%xz;y%Yz8Dq;gw3p!$0*8d4aIV2YEl|%8 zl7+^ibugU(1S}&I0Bf}X5P(uct3ecqrsPery-}27UaovC-sg+@)lI$gVSyikuIolD zM)NuWKdvfE%80p60pSz`N>4)TFPX;w030s)l*uf>`Qlq$&b zv=Lr#>d_%dpj0vDnA%3f+9&#h_@;hk|6~8h#>{4-6Kr6iY5+QYZgL7_>^=NXKGQra zb!K`KY@n6^LSd5D3I1rnpdZ1z+6ng+jwfF05vuI6AJh4JOA5;NMkZ|g*1Zd zSz~2(pPp(k&0tf0lnSTlN>+`m(qFU4ynw5P&YU#_8okz4Tm2D!+3$cv-sat{pZ(z0 zeBm{XgVZ&p5}x36c%XXO*y9}R?1Y}q`<{1?7-0rMMxkn|I#DBcZEC7=cYcL$*|6tp z=Dx|#P3wEMu}{C{H2==UC|O<8$k~PcbsuZuHEW0rVV)n~En!YOga^V8VC4rJ*skmTC$bK5Pwh za@Sx162y2fuvaf6Vh>+AEcB8%C|Pi}W$WQS{NZQBj*IjdxRMNJmNy@JcKvt3L)UhP zxba+jhg)(WL%iu}AAkwcr5hB~l}Q;|q5!AOBCITP3z#qq+5y6i<4@labo}(@0GtKX zJdm0Ji~_SVph(#b?}XaQKNN7CiXjSfJ0$6AWw&jnRh}Je$A%jkSoJ-&I}20;LmrZ7 z(uGzrW(aNpgX-24y2ApsMk7g7T>=PmltC$qTJ|cMu>qO6eqWs_f8qd442Ey1AmRb4 zAc<~w2?!%-M}4P!L~C-Nhm`fn&f&q#1^58KK0U;&(YqQ%tKp9Oh%m&ab`Mpc6IPW) zW?`{{6o%#@Ld$CpoMT5_Q+q&9=lKPoH1NUohb0{;ib1%7=xQk==rP(@YL#!Y0mL+p z!=-z^H?I+)W=R>~sovRPe=gR1__5PTH;XS_Y*je?K zXWH1MWd8{9K!j|N6b58qXJK3|J$y)B9!i8Bh@Y2BjDQ)w_KX0dO?dcwbe5$xlgtkW z+(7GIUX^2AMFq~E&h&$@Y6Mz|3C9&M zw{MY65s7|wG|~QIWn@!C%G?3v{&~qcQ8e{f6}&x*P%KAXN|Xsf$cxj0h~NMPxAHFT zubeAV13GRqJ!OpilqR# z-wKLUk1b>vEKBpTkO`#=zwqW%F_>9GXkg;7>#Nj7>7_tkqezW7Ecd9DZ679J4edh^ zxQ(%t`TcIm^S!*Hk{DQr8h<724=GvrS1UIoYIds{)ooARw(B)`4|(Hj`kGpS_R1N?6pFgN!Lhyi zPPH%>6&!?n^TITV$%}+HoA^j-w!n6(38|WixE0l=z)-!mr&#EGatK=9oKM?AgTU63 zUCcVG_F(O2w$^QgJs za7RNfWR+h-6Z?oq--Za;P;meINQ9Xa;6~#jRh3cjM&`bceAK;Ph*(2JAo{9kT$v~{ z@ZH@f-&MIth1sN8gEv^L`-VKqAU$D0tPglMFi{K}b}RfZvKc#?w|02o3s8F`%ND{X z$AWJBq^Tf1VTjDhLpa*o3=F0t$lM>${PtF}=`Lsy*45MkjiTZIc*)-Y%&#ei1KOqs zV+(70ygyhd67K+RXhAO>8WFLR{HB0eg(xV3#5gGP**zKo4jx__jIH7%z0g-+Gs85B zDq{3A1Lwv@L8_3IZEzv>?5$Tl;EjroPCOx~m$-e0rs`)oFkZ-&zF}Z&g0^M_#waOr zjYKP0S|nR5Z6#+WXNe=Skk>WG4r(i7)x#;321T#fib}ZhVT$UhF2Ci}fKhLc_B7eJ zss4C-&IZuSjleXTnjVD*+r!Tr9{q4ziVo+)e}?}5QGAU$BlG@=)_ zk1rHB0A)a$zn^Y@U>3uE<^;sGu_pKZc+64aHwo#4_DGkTA1Zq1#TnYZyJrcQpMKn< z%xeJ5Stj&;QTsyE2j8Fu;-b*JHg*42D=k6*kDU>SOAcjlT+2l!x)dGzAE$d!Qo07! zak)kLJgYVpQ-0mldEJxr%i)LX#4ACR(57Z{mz)@+KYc_%%t4iKhFW8yJ`I#zz7Gb)NKGgfoR+b- z?ytyC9oLMONV{4Lr`6b2NeUd<^STvJ!Vby&yS{3a{GC9Tpg&^E~xbJ;uydrxAq%bhtYkKWA5Rv-5@$ zfrl}zX|?JO?#HKwjUbMx;XKNV8%JdXE6C;US zwFaM7EIF-vR!V$nfy6$ev{^uUdoW9^hq?!twEV;9$}ZEFN4LH%!oML$RYcXiQa3s| zY#pYqxD>-j;vnnt{ir@+Ua`){&2`ET68Yui3m}%l(QqP(Sp$@7tD;TC7cj-djgct! zY`arFA1IXWrTE9aXr*epryA`g;BVUkILSdx`0b{H^>9~LG9p0(t+<_i6* z69|1ra2Ef3b5{5OZ0_Bl^)3DGuc?gRU-6}{ecuAAM#|g2H+Pq1CMJ}Ej72bM^}(jP zsmFiZ_f=eZsX!TJl;!wE+n;IO_`g&?g5JPu=2bH#SS`EO3XQi{x!8ag^z_?+JgeEB zrQeO>3xfcs?zI{1kI+YCE+E4tFTTCfPimpXQ&%%b@HFsHx~K=e2+l%siu8}aF>M26 z0r@CUyaRuuJY<1r>UrN{02wOyTo{R^OOxC-JZC{&+2h`fDxEoFHzCs_uO(}*?#TW| z&k`H*+^^{y4$3wp6`4pi#eG1soOm%H&iSz@21;f`y3j5>m~7wh*oj5XfYFOLAYEjZ zT{~)qiqX{1Y9J(99wV87^GSXa?9XtHcW|zVsue!?!H2QaJ=(^PGEv=2ArE;UlNcnj zh8-<6B$5s|HdIZCJHyWAFgIsjoiK$329H9KKc1WIDVXuQIp1`_L>!RiD&X!{g>>2;r@gjL7 zNcVJM(LB8tUTi5Q$HvADPL`Zd`zVT$JVeARjE4x5jXmZ5gi7-wj01U|G_$C*>*Jq$ zo&Jr+uTq0j2=_LPb9gdlCe&XZ)pt9fCLZyvz;=o2iBW8#jXk2A59m3 z)`G~(kJ-AEWTp-=<`2V>9FZG^$ptKPm8CE;#(7bLN*ohSF@LN0mL{>LC8h5OntV7p$iv9D4XBKtE=;E5y<*( zX?EV`c}ka%UJv!ll1AyOKNDnS>(ve+#R!Y?-``VL1Pb!s$4&z8yXTIMuc~DbSiLid zl0jnhPzj{pjh|%9iqfShW!Xp!vLDZE_fW)*P2Ykeu~8zzCkPg;z~w|yhuZd^<&K@H z-e_i*Ss+1%II#)eIbL|rPmI=L=`NH7_RK$jOr6x<9TVVYsrga~7lPbV5JZC=gwG%# zB6JB~8KNY&ue6jq$KhR8U)oWDXNEkKBB|7pz@#}e{nROY7f`!fV&l(|5v-8S z=&Q5;CZ@c`Jsnf4xuioKx!%PW#)kOxT@$eWwlkiWGK=qPWL)vbR$ErEp&Gu4eIvri zGzDhibV+u0=F7krN(8q2D<1Q;uX{G|OssGW8%PqPT03M}5|UL1ro_GRb2{aBh-XcF zrUWK&pf!-WtCCZ5SzPw?KHSo1q%#B0tmN%T{PO6{n((GSld7I@wwv>&I^!<)BXcK- zA2Fypu=gXSrtzk_pLyL&ClBJ)o3o7xdf{xaGgmwHkCb<$Yf5AHTEu5r8{w=>fDQ0* zVRR=Uqx4~N2m|F}?HL!X7#&n|9pwAkM9IiRKP-^~_%Vk$1YG|!hbR{{d&*2!U!S5y zvcaygW#(4SY^>t*qqB-43EIii?5e$F*FCTIEp23N#L9SH*B9qqp~C;gMBKj6rupdb zb8okQ7If!F$xv=$q0C{d%tshu@nfBS!g^OsT;2KGiTqeb%j%gA;cX}WyTWx3$VTcH z__3c!M9Ke|N3`&sJu^GdBeE(R1$`D)R7D?H64Jx=<7{w7cip#qn!AdAJvRUXcdPA2 z402NZ6#ZG;(Wv+`D#-MOkzu^P0@76Q4PuqJwtJl;D)h17lqA)A%p@84UKDUfVmN$7 z;+b=eQOS;f#6e0Ep8-en{7Bq@%rVQMxG&=Xj<_w1W9>dIlzy$+Q#41gp$MsXTO?Z% z2>hXRK|98or&EqUaT~C1GDQB7x1(%QkK~Y|^P}t#)B$18d*7T2#j{RU1hkdU{4~6=wZ4Z51 z+e0yF*MH>;@ShUDvfM&RxV9-DsSEPXImzGuL`IZ#{ZniE$DKn*1la#pH-yH9ethVg zZvWj4_o`6g9}&s9Lua0Nw^CN<_ajNfRoK5jD6I}m559-~S4^R6h9601cF1)rjq7iGA@!giD^*b(`qq>CKukS?Z2prx*kVb^8PbQdy@ zxkzwr^pxaJ@_il5aQSuH;LxY7VJ8!@W06*^w%B~`=i}|+mst(fjQkVN zdg^@8e1NU7yI=FY=R+RY&W~eGM#N3;9CzY`92jv9pRyi-fA6Q?tGRP|jw`JG!X;m1 ztBcqLuE^?T=AISwRsB^|b?g^^=L=;vvVr{SJG9iq?iZlFo?TIMq$C@jtfW>`NnL91 zv$S|G>3?d*B50c3I<{J6*SUgG0Q;Y|KumR0v;coOdG^6z{|pJ2y&(PXZa>KY^&@1H z<0IB|$8l+-p6hk?hUKFI%8B7+?gb>iv#ZIIK~>*-x!Sn<6^Pq(KwwtUfpQ9dEkK{V z%TP0WUMo?FOZKfB>*$X*)QI61{@#e=!Op6#(&f1;DRnfiLO_0pM?R{1>8g5kr%dcV z?q2jfG*dLnA#m)?_&Q)le8{2BkT-Cgs8I9@z0HQoK6hdqrdCKdVu$6?$$6jxvbao} z@JS%LRdW7G%g4o}0rxBJ^e5uh3y7PK>Eg3~0Lmp&00AxPpX)XW`|-hDb-X~1&@F~= z!L5AK=0yDniKJ&g>iWx^3%Xf5DFW_(+qERB3IuE&JvKFD z#9y;eLx^5?1|r&>$I00;k!}W9qlaGi;3vmjN)#M%wSnKm03y|Ls7?cxeec>0p4-BV zhYSr)(oDxQ^JDoPx@X&AT%Ff4kDyW!F+t9E6s5(X(L*> zYqVb}jbk+~(`68ILVIh7i3>H0BMskfejw9~C1vT5X_Jtsju2t(u9AMC1#8e*^uN7C zQ07G*K{I<0WkCG&fd6SU-sF+cnr!6cFKFVi0A}&fGk#dn+ z4Ai3f5IC|e@jop^(#N!BeIGASZuC0()cg3;Jm? z3-f-%$?vGi7?OT8T-G<^Fwe8BmXq9DGc$-Gbe(6&GC;|aC8T%npXXM)Pgxr7FI8Up z(~$Ehs%0@=?#C9&(kfivpj-;%8Zk-OjZ-s<(`JrVbd{AtuhdLlB~`D;oj$XZu(F1*`}rgn;P+(sVXjv+tv?7ioW^K?!Tb zJ3rfP@*-A`?{W~_-KKYYIOk^GOPI~adH-i!)!c;jvw37z5eu~y%Yxo|zrdZa)SI|1 z>7xz&It>*Og3%%**?ps}i;IqBwt)UTp+vk09}xM&A;P6gsdZiqN^B{E9tYU%tA6`|BvGw zNsz!QjxO1CrH`MK_zKzN^m_bD7wLKqd>AO#l)>(i( zf_o@VbvSt8SkrRFZb}g3_Jd5yufMQRac)3xuT~e9ME%xM$+0oO?=Pm6t$0*>*TrFd z4|09 zEU}#SVWSQ6oZO(Y(I-k7J6u!r%O6vj*^~TbO}!Mt!P~vvtQ0XbKhymE$J$tZ2NJ7# z7CrdA0BPIi_l<}0t44>yli?rdn|}I5;dSr&9!Kpa@_xufIaB~NF4PjSi!$?4P-YNl!vrKqP$8ONgiW#h7wSHAqi7O!Rdo}|^fcjaU^saZe^A5{c_F{eiNIvMGQ5UUiM2y_H&`96 z6~P$a1Zg9mIy+t1uXpS;S4o4m4ybziVn+(RUWZ}_oM|i6Lr`YJ%m2yER0LsKgg(Ve z^9gIIAhP;Iz5}a317|^03ablx8cT@VDZEzZbgVCcngCm6jrvZ8;Hr`Q!YiI&6Scb3%cpu+Ta~}%8@ha3V;HP86%zTnvlEpjDpWN# zPW!i2;MSllE9-F3R}^b@|I6Y6TBwl$-tWcExBIUzo_LuGU_zm^eU}62Dwv*bf{iin zXD(c~56&u?GW!O)+irri8H!*Z3+ZU9&VkAN)&UidWSH&ISf@1G1lxQL$GOjdU}CH> zfC)Biyj(Y2_pE~K6BcC;ET;@NW=n)3m;096!ca zK!Bo^BLp_JCNeuUY$Xt@j`ZR>B#g0`9zTmzoIHw&yY)ad%{4|H=(C{6dkf_LDaRD% z=Kd6CW=!(8{#5n!D}YNwp`?2mbOX93J@u;d&!kTB{#jo2lZ+nHtn+xe3W!mF)#`*N zXSeq!yvSyp!+_@1l1Pl(KIy|nY<&K9{`%tn1Iw0`1BFlhk#DV<9og{+uQmEfd81Fp zNv$oGnytbp(9!Rv18e&ITuxCI$$}Cw+&N|0*9XGF{mAvv#zhHZoA}oyZ2E0(UAA9{ zzwF{h!DAh?;6#X3!8j_oW7;*qvzPsk3u+ZYf9ZV5d>+65abXFb)TOwTfM#s$yHX6MOsCD! z@hWp-eVjZ|f4XUSuoh2Vpnl5~<^RV}74p+%l!Vqa+SGdf;HKavPlYTO0G7X;fFVagXn3(>Hb*YKE2r|psDw@Az2IxN2AGM zb-3OW2=ulpykyC@)slEI^fd(114W3tT_6Pl16M}cVGFRWp*yue2}>ukb|g6E>Q0=n zwze+LQ^|QG`R9Zh7zUPdYb=3&Di%*OM+nQGTDxvGV_~ApMEWydO>mi9F||Sj(Z)UU z?jl)#gSQ%L7P!_+5YdxfXTN{ROw8{~{aWFDfauF0CLx%%S_{*(xVmatCOwi#aI$v= zWVJ>9;%?pXX+T@5UakKsR$ROLo4FDb@Qqd$MV-g*Cblp0&AKx0b8MPMQ>k;#X^_1qz0x;pdf_pXB z`4J!vrnT&zS7{82p{qRIhQHe~X4lZZC;r6MfH+>LqSS#fAr(03Q!w zqo&kZVvfW&&rp)6j;#sPUyQb0L`2cdP|AAbH`9Sm%W%8kEgIvf4k%|eO{+>uUJi%j zXsb*5hFQ~i?0%&;17^iJ;}s4!rjkp$oQ;zbv@7UedDSr}p*|*7-?gN6$8?p~=M7zIRB2SaC{paT9lyXOdUFU02*?NbkFwj`j3}SzIA&ms=0~;(iPv>K8+qwkA`^E;H%Y=P{ z&4Nw#cy?@ariVU9QYCJ%u-`#ekcR`cK4I7zFQ$HftxoY}fZl3pc6{0_17AeSn+9}N z!V38HByJae4c91ZjK&)vW+ESmNR+*73c9D_W6GPVchG=mKP5*(G4L&njm0mh*blQ5 zJUhFp?%`SZ&iK|wAKwYO*h5)QYvwK~l6b;stW^ck8$CU$O7q=6%N8&5#8yPL; z{M(HK=Bru>7K-*S$4I%>BS<@b{?GcH2K& zN6o!`Hax2vZrrleZ)PRH5Zl(R`_>>6gOY!nZ4<)DezXQM-UhmV=lT~`Jg{}4D|6n_ zRH>7i{B@RKhlVsfT>l>fw9UEVKNB$s6aIzU(%rM}6RewD(C6HS+==VdAJZoqTXhCy zbgY|#*fF2#={X$(+#`b1PV3vuzJ z#ikX!47)(@{~nESae;Z~D7EQCQ93?oGpV`B`9~A8BeJr_*J}qS5X`X&SPmGfo>BPe z2>}YkoAvD9(;#ZCHvYkO@O;i2aD!YLL&b-Y5?#@9v4R*Tk4qE9-~g?t5-|Gi@oGok z>I~gwQKfF7zyfO*X=~R;o+cK~3W9>1x==+CzVS`;rhqLucBm?turo%QtcY(Ve?G#> zXt%G{Nd{KIYpSng&?X$vn*GkalVgG~({hA$4LLAvmfEgtPoKQWKd9Fl`|jz~K=_nN zl*YsEEW`&nXN(E(p8hzM-n>OUaYN>E{!Ki~BBK5jg5Q5j`V^fhWJge18NS8i*)NAE z;DgFjj0}|(A_9xC1l&Di=vPT0@O%>14>0g83icyKMed7ydrM0BT7)CVxPlpaW_Wckh%w$?x5x^O zXsv?e;iclNkK-K>`!-nmYl+;M$Wz@QjjEVaLUzu3(2+_3r&qkX-Tu-(_+sq!>;3+6 z`Mdl5*+BX3e^*+m_2*cs!!<{)ikB?elre8iIsYWR#bh*Y3*`nytBr~bT1YhHZY@}` zU^9dJvphRx7xIVwj8r&Ot`Hw%U+-9`z*e!Mg-oKEM2f>C{mX+y{TSPIaqYET+{4Pi zytAH98EHPR%=D3%q44^cFY}~-4WQ~Ur`Mc4nD}A2A~dmOwY`&is&&#srk3d?{vG<4aJNN=xatD3wP1~V4?mL$Q~mI0_E+Ma+9OeORRR! zqLWT{%cMFJk3aVF62|R*Uvle&L~F$$F>OqCd>a53d2O-^ma2s@0lwoVmnPLTDR07E zKK`R5b-XEU@o^y^r!BCO{UQ0Vrb)8kEp07p^aOH&4NHjZ1lsS_hJyAo2ROj zY~0)v*jegh*Pye5n|hR{RyB&l{23p7u4-NbPb~6a)_Mdhhkkb42JuDZrZ397kH>J> z2NFAdiE6_~GbmK{w3G<|7Wav*EwWaD5n%5%lw$`43;o0Gz1Wnxi*fVBlZ z8Ym~_kM2)tb4Sb9hgCN8ogYMZ1oMObuX0T8#9I@Vkdj|f1&*N+BcTEV6q5%Eg@D?4jj`*b9AwyonymFWWIW&tY;_}?N57#jWw2Hr78|E(65 zq|^C0iGtg?#H;mF*3bIgt9*;cGjb0r7NrTdA7n_3i6Bh>-=3$xu$PjN=8b=DR~!zI zM_FYr3){e*!j@k}StoXTLkHH$`Ubg7x7{0O{JBf>KaoJ7TxEm<|5oCKre9<0jD*TH zSBgatZyIz*8%Kxlqwc|(GuiewwdR`i7Tvzw^U61IniLMdO(_w%+r?a$K1}gLP1oJq z0qx#Zye-vyUbV;nPek!W&8z3*ut}=NX%XqtQWq_x#heEt++6#H4!7dgV!v0%+bp(f$0negp{Yuz1#F2z^fa z8^sB_xO>N&KnNHzqm!x`a+SG|6f_+Ncn&8S1+;YJp;A&{Q$!U^JfHn&H_NA^AfUE4 zw(lWp=&b6wQ#lI7;B z+UR7kb{sWJLqEd!BwTwNt3#2_DU>8#@nEpgp$p1MfJrQyuc8Sh?=^5Q$C^q-^C7wL zkJu;m3h$;Ewv*%Ps?p_TVKef^*7~QHkcQ!N=w!5nC8O9*;&IU-+h&M6?m%wjjH6Pb z07n5pTn~`m#Hg}0qcBHCz|{T%#-T;_1th|(WEGHN$D{}*WLzse3T`mHGE;W}>@bep zov|YvSL?`JWOKNbFE zwjnJ?)RVRM!?d{~FG?l8tnxGTDxe>!P#32^Kw5NA*Mfd+ntdG^fS3V*A8f_MmFFz3YUm&qriF z(l|mA#sBf;`bhp1l?wa~y$q|2M(ogIR{@rm6T9d84QvO=`Q9@L%{_uUlQ+uaa|7a+`LFEKJUGDPdC)B zD16-5UBv5>~56edxZ#25PC z_&lb|Nr$An2+(||YD40iJ7WO)+`mVKh&3Wu?}XYnQQL2DC832YR~Ib3Je!X{{Mqu` z`RyscmgQwq#}itJu@WK8q$SG3JP6uQ=X2T6CO;QJR7TL(RVJmV0-P2xDAXq-%B?Hy zObu8u0$R@b%0s8fT}=LD$I45FK(4MVswuK}esvEK(jY`nUBWgJk*>kYu;yj}2L;rW zk+o9ZauFKNxFTV%!J%?i&W0X&Myfis{iD1tkXzbjL;%TpKpsS@BiWDNCM4XC7$(SQ z5B9cujxvyG7v4&u9BJ; zKJ?4;o^r4B`Ezj)NlOfcMSA)3ml!gp;LdYJ0t@1yp?v~@S7qlutPH!PQ2rGoye2IG zTRML3e2?UjzNO>3_OAcm*hZ$%A!4gfSC@;k-&YR8W#g{>pv}>zI6=jaHS=eHUAXr3 zop!T;(i}45q3=*zWT;Sm2^0Qcm#>tvnEv~WZG3hzHg|GHq|3b(=sy~ zg_((Io38t}Da%hZ@&|vD==kNdH1IB5Bua510cGhLCX~1_IBYlI9K-qlUvYpv(rSzB zc<q;og)(MEIiCRP|S6Wktwm`dP1kUA5i?%WLI$bT)_jLrnJjr73UfO+I=aMPCT z#-N+?hL%|4g>PNO^~@q8eSzri8Z=%;bz*Y6YjUo&QAnAfn(rhD)hN<;z8I$PYa$R^77f(H=R?vYqG)CB%*FHn|Ni9kOhsMJbvhU zQqtf?9=*d>5JepVPUNpeqhITDYN#VbS#uhiZaUyUW!@?XCEEuvD^$Mr)!{K& z!`>Tv6U24;+|oqZysWs#NgC> zSdi1SK$@gOgr&Fwtv;wC23-VW>M=kMB;g%B%6bM%UZp=w1BUSe$(dXki^)?DTzHfP z?G^^{cAwRD$#0WQ^i*&cm~Rf~2H(sXxWms-S!G~i#QfsYSR-l>lrM`5J)EIq!7VNp z_HX^uWqO?Z(ofW3i{&t_K`7a8#ZDP`<>5zHEoB}!kYfPm@~m?_MLba9emC7|A#pCs z2T*>`1zn{4lZb`BnHw@VilXi3Ez1OTW7>!6#0@BR` zYjf<5LO1U^ABLkJi6XlzbokI$wF`fpK#ct^h~LSotzjdCm)o9CG)Xb$Aq$J?$7XCf z-;$;l^29XgSNCDzv*<7e%cr7b=R}o_?P(#e&__{y&T+FCHk6#_CyaFAVwcqm1(uw=U;Lc~vj=h|os#hqb7ZiS)c`!g#rSRM=V?-(h)*+lD(? zb}-o0Xn7#Y{3`uJ`nvum% z{unCfp8ff;C_fYC*Jhh+)6w^T+Plv^#_8d*iNLbG7uMMNgn_t?vhwW@rtN;M*140i zv6T|5-R@6X58q>ru>V6y%=Z5|g5O^U?&~u|$Hs7&cH@+U@$2qq{>dqe|MNxsq4Z6ql{8xr$ ztE01WK#2Y--CP-%_}*qvrbd?PlwrmXAuhUJ_{Txk2=bTyG>NbOpFed;P4+B`8lZ+vlk=@5bDbT`liflR|=@Eg3!t09rJfsH6-tFZ?KVCT9n z%;uMrelIP178%yj)B4607mWl}1&u|qPSvhmS9MZIM9U{UUp2qrq}iX#A95Bi(^@Z2 za`1uOHjP>AABw)h0u~r^3x=#LgQ63rb?t4 z_2f!5S&AfVvp40*`~|bTqyCmjicJ^bF~)hkfE{@eDqYi+hps}{=!JY@Rk@Zek2cg~ zI=+)D8M_+*)^}QePrV0m!qP5KtffI+S{x;q9u^6%1u^d<;RO_#71>mSS-ZGDK|Jqy z#QS%ww|0CSElb~7J~1uz19m#N{oi3{3dDVLp*vT(4DrEu<16k_F)s*Xbf|jAKNxfc&9gK)~1`cwGG%Z2L zi=*s=E1Yzb)%7w`+||)d`KlyD+9u`kiS09v?9r1(67rKS{)P2)7j$@2*9%K=he-$2 zQh2-_rA)q5{QEnRlaNlDz92N{OLuyKf#BDeC<20D->{t6J43XXez_PQzjGhXh^hRh zXhi2w^Qa+8P5!*O6l_U!VvnE0y2D)-sPmL1$C+fXQ^E1_Z;8)%Wm4xrN)E%@K&1c$vG!umaoXnIq`51O+{6MZxq z*WcVB?;=c{|9{dH_Ydx*(}M$3Zf}ecHTsZvOfZR0XBF|V!2`;icW4L!$=S)!a^8Mj zr=IXLmR-U5eTetYAcJ>YWIHmC6$tASw8W7+yX@8EkEccw@dMR~G=i%1b1x zrxRhB1vey6(zzG9;H&rd>4D;cxy@fu6^R#CbqQ(NvHv~8Xk|pED8OCPFzV5N5eUSR zj=H=3ogGjR`|PE6X4h?gdXeA)p7w);O5C5Ex%Iipa(hY7naTuk`;)^dofW6^1wTw8l&Vy*J*Ta4%33G^vt`)Y-9;+hL=Uky10k(Mnyq-WD`kYt*tG^8;<5~XRizyPFXnC;U??Et zr)salURRWYCdOUhOB2>Uba@yr9SyDiuz+IeA!CPckD%a?l1QX!;;EAJO5GcB!O$QE zv;axTpRB2qP0B+OAm($B9YhSB|J5naQY(p3Kj0Nz+<$Zu+{rq0)vH= z{hS6xCZa+LMZkArN}cC^XS^v;&=^5iJeclS*CkgB@G8VIqnm-AW;{W<71c7I0?p%P zM^hlp+&jhC;F?Kw!0JDRa`_wie$iT|Kex7;u^E<6JrgF%f6iYBX{xr~k9$8{C~{%v z9Apx$`u{m}c&2$B-R}n@_Xk1mZSDvEj({idmvH^Rv=xlGf6s%!^o=9nqr9=CkCF>Y zCOl&XLmEB9?UcX(N)QkP00jUuLpL)30Doj~nMY`)*=)bBk&)&UNorOiEz$}oQOFiK zJ~V@pWs?5vPz$zgY~Mlh?*PnD5sl0MKtTb_dCbT27RM6A;Agext#gXNbIkdQS>0=! zTFlpxXo$VNjU0` zBvpRLyFI%Ah6DhJX6lZN0Qa8%xwD`1GIcpBRpqLs@+3!c8ycbskuD}8nobiMTs|VC z$&dA@zc_COg+tt03RD70kO;sN5hS3gDNV0SAY90R5(vi@plT5iz?}z@6j%q#0dxvQ zGB^zjz!-3bLmsfihFw|bjwo^G9-wdmf&01HyTiYKL^H$h>)W?muef*plp=r$$O35# z(eHy4#>9CI+oHtI-EqS`?+GFt2-W}?EdmKm6+STNY$XEWaMy3mO@8}9XQuw1QzAP7~oRk7%2oRVf7Cuo;);9C4lG}Qj6hY2nH0SSkez*eU+*ZmQaMHDEe&@ z2CxsFYNV<|uQOx(xAGfQNNY&+0vLsU1$PPpzlq-9;9~>(u%a##g)TZbR8my9T6?|_ z#S^f=$~#LGgK7$Bhf+Hjt_np_uqJ~Mng!Js`SL7t>yf+4!y!_MyZPKQ-blqiVP4F54AOYJ?mJ zY9qCu)L#A8W>;G0X@uCPrLTkbV>?gk&k6v@NwNy3K-ka$*!ZQ;&y|U=mNIY7Yb;G& znvpYr^5>(}Z;R~Qr00IQaB;QZcS`zKkF5W2?cm_0Edn^b4EC5?XLOEN%x}dMGM3|{ zaJ7^PXrRE>HBL1~#7PEPFk$8mS?7IDmSuFei; zgGoXrxAsRfl@}3e!`&8?&ot!Uc>%nAPZ)RgA;Ju6^!{*Vvjr5yQ z_oQNenqFMR8dt6f&+DUcp#+=pQBBScOGyvC{Z3*_XQYkfCWOM#cdiTqIH_W`Z-`>CJ1@FyJz5chO&+qC&W~JDa zl%@7%<~JpKbB(_y%u3lx$~|w6ZDPZ+tnJn%<)Y&n7R5vkkc63|;__U@9V zrn`4L+9{R;W9)NE_4V{xb^Xk(`KQFT$B!Fo*mFHdI7KIMAs1U%PrIrt7ap7RD-+qa zKY?6Jti+scq~`LCS%w75Yt^3!+ZBUUJo!ySSnk zVRvWXURB|jR|%*2van(hRm1LC1T+~ol_NLFfO_-4N5!juMC`+QO>}P??QfHh>F`6Z zTmgR?WQJII-O}yz%Fs8?sj~a}_wFh78b;pZ#?Y7>;wwKe2=TsCDF%6i340xY+$=@` z1PMw#6|Nvg5joGabG4z%<{TSpxu&v}qvbYaQfq4^!{J@bmM{F!SHqRUG^-sV0QZcfikVx{iHQb=5WV3NnQn`^=#Bb?}paUP2KS$0gcUK_*(omC|vbbmdi&<=dLJ z(WEy!!l>s1>Hdv5g$c8W7eCL;$1h0*@S3iFKa5CO017~sv``Qs#^6$%1OSdqO8k0w zLYS{YWBp*yT6Mt&{t56>fT4r6h|2}Khet&2dSzor_;hcT5 z!BHI23e5imy%XGk6=8APO6t-2Cqr zrI!%jKeK;o_{_JI;3-fvt_Sv9CwEyIFsi?A2I9=DrdJ={QwenSf*sra_fYlkG!=~u z^rkYgxn#ElFITN>0sPId$;JIx0VF9 z9=tekyML<*Li?kAEaBwMFHUqvVjI$hf_V1~pbk#z2{Jz((u28U79H@?zw0y7jX6uGCLv{7&Wumc^E5DYktc~x^4 z1DzLn?$ONIm-!~mp64;AeYj6qMzU(WOkObi+F6^$^~W?SxJv-vCdqBs-q0;`f}r*e zIGWS-7YaFnTi)R*$mgJ7c|YV7hq8Zvn}~o@DVUg!X)g1{PHBrPJ;Cnc zq{_#2MhDA?e9QW>+?JI)I7n>%Dw}b}mqf_x1--)a_6cGDbKxhawSQ8jK`2em>3WnjLm&nxxIjVfU;ZE!gZ(`&hS0SdhYW| zX~OJ)-HPH1037)Wnkt|5QcQy1_V7dI;cI z_g9&iZHk+M1JxHV0|juw?azJ!Vm9{~>)(-`1$Xc6+^B`Y{NEACN{Ms*hs}Wk`X<~3 z@u5Dai4$^%!06)&`3aUG$3@Ap_& zT#j+dDMWy1z(gRp%KlgR)s_)x#g?mA!S<%C%EiGXD;N$D z$W<4_3y_E8stWFs8}aIN;}l3@FvYA1D--e$p*bPSh;r6B{SX^H`1^*P`I zsgf|beIlGvm2uZOV7VE>qq6Uxz7R{$8kwJixarH^$AG!W8d1qaRjx}8D9#Y9U$$y2 z_FhBA+&vL~b+9s+?Dcpp^7R-$T5 zJN2;rt7&6ALh^IrU%m(r=Skz)lW%g+56Xm-F~P*#dg>~fI_=I`^7nDDGuNqALa3-e zs6GM0a5`iVHFA;BzpfpgxZ^{RjkDo8OyJ@;Kcq<(g5@Qu>}$_Y?91rgN<{;MAP(b% zSZRlh)$_YQ3tKpKiQGXTeSJ&lk+@V2z)<6|+lRBJt*9uP#LH8XWqB>WJPnPWZOggB zQCX>L4tds|qVI4eM$_*|7|Z&D;I40Qt*`jAy@lE?1nqz(MvqrE2Y02lQR!7naR-|< zFE#__ll>KZCBq`ZZRN22$ODbk8d0%e1O}E|p*&-s#tqEt{Iq8J64#NT6aransBr;o zQx8p$V-f2^TbWhx3{yaiw`>C&2ioTdmLrIPUL7v59}q^#QeX*|bBUYWUioS(M(Mi) z7p@39vi;n9n?PT~MHC7($K5J36)CdlF)z`9PgNznjBq+yK0>Bp6~Uq|1F)yzyt}33 z_pohh$L)ZcT2s|IF3x0HbcFH65APHZ9Xa0twjmg4nY-9Um{zFyIZ^gT`EE=IJwcdLb|uC&2p~ zyGdrlb&@z=+5%M3PTCQo3=7;ZHqbcD6NSA;1|3$!a?ADdt58Galoj;Qvm9m-h~;;D zvH&-Or}okxLovfDj#iKsubPC2fwL>p-oK?ve!EuHFdhD@a(d+rGQV=s+#TdPuIFnI z!-C0F-?YkO1n`uAlsE%H5B$Oinh9ZmI5KZ|AEOV@7)Ya9Lo3-CeVEW(Ql3w9 zs|yc=v4F@NbH-$6YW{zvXTLWA!UrQ@+@8YF zz%#hZBN^PArWmA+yKdyB$-q3K3Whm>R3|(YTa#%B-e2r7Qv9g{^c+#EDm(R!qnR0YgeUX3kH-J74;(!*i zb~u742}vhV;#|?eiug8x7AUNk0P_yIvKOZIdkF{4^StzTAE*i3L;@qM@-o7Hm!}RZ ze`Hy(w}Fl5@zElZp&BA0IkUHPj^8!+hqSeCY!fM$6M^UN$WF_nLR2_A$?6BYreXcs z+YE+&39A<^2CK}Rih_gK6x=K zUmgOFsexDn$%+6|K&-!wN3v3IGFm%t!~|H&Q13{B#O{OfYe$KMGS#*otWau;q50l! zDJOs+73zZbo?pn;58qeZu+}iGM^cNzl{;iMO4*t0Z$@4`^CHkCZ-3(k&78xO@lKRowPFaiKoD*$i@LZL#kh;(|{RP-bfv z>{6|SvtSU6%8p`T()9$SN5OEsv0HIGE1(az(?@_5Ay)pL*GZ#S_9MsfIb=j#!t z{pj$GTH>r`p6j2?he-)V_pBd4;>fG+_T%C?ZVfQK6!PdXvI!$Z1i2-RbIDq2yus?> zpjX*k{CXGIc^Ps%ari>VP|2mxa%UYEhIMm%wl%%7jt!J;<9`nl9N6g&&q{sicZct# zSY8x&^T1CKFXZX>qOT$cI$+Zf(M9ud&Sf#{ZukX+v9J!t7NAo5))x4N7vmd3ka<&KlGt<#`N774{Zq>IAQ%z@>qH*yQE< zPL>ppDdgZS*pp=BtfU=5FsR0$0#XnGvdIYR0N`~sUU!5O!UckTE(Nm`ZAXiXxgHJk zJ}b~OFdDd^^bC_s^3p1eab|~pbgfe4j7#hNsD|-oWZX4k4*prOUVb!qWE98#x=yJn z(G~VFc$p~bgq&ZDC68<_tsLPS|IYiFId8qaI@nX|`+KZMZ;Zqq`Mk+LAi!yy!N8F9 zZ5^>V!OV+l^3IH{=$dzh8pmsdVh-mGO+)%M1k;c&f@xeiUhsnFZRy68oYo&7cWBN- z-({sWi!Q=OW#gP&wUj<_z89uv&;V4kPxHR^#c{V?OSS8YUUQO4`((?Q{vOc0q@mIn z4BgG7)o8g%F=-m%XIn_Lz7%8D&6Bj8Nv~p>7?38NKW#5&_~3qykC0tzxAjxAf^V!$ zkK=@}X*NAoKkv3wR=myvw~JhZw|1Th=dV?Wj=Vx8lCx?I`MR0l!Jgo(i)KHErmny! zUjvP4q#Ej8>ie5_3J4n^*)dWoQ?o<84Xyq&c{2?T z-o#noH`{#_27tbQOnH48Qpg)c(@_>p|68#nwxF2=YD?k!F)H@rzM^*ySEhYt*WU!d|*VFiPi+L~maOFxk^UK8n2JusAAV0A(nB+>vR@UvQy%%!*3BmyJ*kd}?h)`C;y0Yl-Rpt%1^}T%lHdDQ~&v zjMbP9;TV!!Av3KDEldC+T`y|FXcTdrweinGZ;#5C@ouxsLDGdN&n0F?=*Ax){{{fm z@MRjcdE@B<&UHdppREHYT9)ze{ zbx4mI&CfU6h{ip)@T7q0KDhg;6RKm0rtO#ZTlH|pGhmjj3ehXI8aad_vH8=@oH|9T zIBSBQTx*#1mC|8(!&Va_<*r)u>>4@8&^kv@&A?w9#S@0xW=lHP?mQ1PKAU6E5aw51 z^C;@y1l)9L5b~+aKmrCWG1opS5zMQ!%I1P@`!?w9TJOy_!YOdGTz`&Dj0~P-D(fu& zyDX&k%2K~^UEAT#pfxzicWWw$?ITmWwheo3*di2PtGNHeAiS1*XExnRMk!=xnrWm! zBwx(1&WkHuAitIQr1{Vwf;Ski$R}NduFWLu19)B+Ts{4zIGJ5o?fbaiE5E&;mQgbN zO_*oezULP!Aao?V3%s3G_<;{V#ru*wKwS2csYux^ZPX9TSsh8bM+O?{vtz38kNAsN zHptEQ9d#7p(S4ET+oQZkeGdg1d~cktTtvv@XiHK17UpUaXR=1>`xCL;{@|O?Ac>SKt|1 zt9@LRwG5_C`p)PSB~fU3;ZF7O8W9LbsFPCDXRkKxo8BbMYI~ihIKmef-ZHnHK?pEzZ6ExIF>N zF?OF$xG&6*LJp|bv&kcSKO*1cx!NS2SBm_NCk7(=&4 z9Oq8_D@7!{&r|8~K^7}S5sFFvtpGsK1)o;(gu5U9JPv?_h!z5*^D-yo@=2;DwynM) z|JF92Ruut-^=nGOS2+*g96QJ=#4{AeE_H=(Tj=9?0K)*UWV(0ueFKk(iCL}#9Wf=l z3noG@D*P-a#v4!@jYi*65mm<0kcQZqy|;_f-V?r$h;h< z&ODt@ZMNsjC#+GxgM~--ffrM)ilUcRhxlG=e6z0QPXyE?&ftnTj=V${5@h>>wL~=q zO^rnlHhz16G)Z76YqS=GGia%?f`vr$r`N~2);hU_p1mb_kjMoMMED@!lX604hiIIl{Jv#W3xxqzR;M<$5vOG%vElu1bEYXRW%I;$xYvYAh=l5$OeauYGZ6RJ zHohZ^)aQ)U-7dv$8(Gd7vqj&u29}gQZ@v<4unrHJc&OF!yzyIa^I5GO8@&Sq(M;6A z@iikW{zGjvyyjAW2pqB9(+Uw zqJ+VjeDw;Ii?;ZHt$RSBTy< zZQc%e!VwQOWu5(eF=q%67J^7Jwqd|mc$kE5JjiCXK$rZ!>@Df56vzqkXadfr^^8ARWJmrGd)+>2HZir zi#t$onNzJcZwRt1SjfXLj_JOFs%AKV?OQf*x`7b(7qtlE2Zb=jA4OYfkOl3O+2&OD z2GDz;(Wz?Fgq?>`fVljcnOhtt~=;WE5!L!Ev6A8gLRFUIk{+wZ2x$C?^jAW@oK}`(aFZsM{$0^7e%6pqG~D3#>7)LF_urwC z5l#AvD;Dk$GyF^nt72n~R6bPhB1vw=%3udyEekoj$!Z13(myO)T@K|u)5xQniW3=v zKYIe{Yy9enL^*~4znSKeRM&VUviJs2-bISj5;fl4y%+}68S6TO--veH)|vENr$G~ZP#xP5Fs(J zwUU4K?5e5eS@(C=;1_*JPEs3DII|WrJ4@ZXY-*@nstmQ}5qS^{M`H?Ge6`AI`Jw6V zmf2Z>&rD-~1l3C(e=N>fr=*~6uW;LnXaizUJ)ap{h9afavc7^98PF3-c z&AnSj^Tjz3B;3-xM!P;2+AHnzBwcQU*s}|EDO9qI^!jaUk0+5e3x%+L=E8w$Ng+Oy zB*+LUXyM~)K(|`?60#Z$=(Uf_uN7>3xm!3M8&6+=_tQ?V2)^L4=$ux$AvMsUB3`^@ zudcx7ifb^Hj9#Qzjm&B-Q-xdWJC`s39~6ijV!LWZgY(J-fwg2O8h2RCOpgxf`f#zf zLTR6;p&R2cI5a@-hX_zXJ{fK81Xr1l*vzrAVo4bw`p4t3|N2!0=WxbxoOjDLCB;*| zQ9}~uGD7e`{CPL_8y)J_BogBCX_nq0{0V8iv*Ic-8Z=|(zU;AzxGuDQpiQ!!4A3@s~0AvwX zz-rPGokg$=I0gR&=GA3we5E|^79uH@gahFy*Kf^DVf$GM89-o4fTp(qgaMGO^eHMf z9SEvOl#;Yk0IF$8mX&X?YBDrovb1e!zsox9_Pd)~lGJv|r7PZEa15MBnv1R&j}rH}(v z2+_r`pd1Q=ahZx#p`xGUj6W(F7l3U>pQl{EVVrVQqy$2O8Cr@(syblMQV>qU07oJz zo2si-EsG+3@lq6o_C2+4EKOFLetrIxVNy^EfkeS*rKmc=R{GJCfgV;OV`2TSQo|ylOP7jCyRUHc(B_Xp0 zK~vzs6fF#z6_P+m0i9_wMk$yR;#zpdKUo_%q^KO-EVQ z+_1!bLaAw@B2{;9ZDkhrBq(5jPzKoo+9vGFr4p^KoG2H8o&O70{qo<$jFCdfvem1x0dj_Ven>Kt(C zmkJY*qC$O8HVgsgT6Qc1Tv>;5FhCWS8lM<*)l#-(NntD7jxa7w$UK47iDkr8G$yy0 zLhi82w(3+6ZVJ9J^4&>ec*=%Rp9wr0ELt&!tO~>Law_@KrOW*)djw-_-2r1jUj~yr z$ibo}@%l@)@gcJsZa-~ltUNrFYV{M5%xZi$!Smv+UFI+cNvl%3Quu{i2n5d!Q~VJ% z>xJLJ{qMw0?5BS6pM6XR1F4YpZFChJ>c(~r?w3Lt;#}()9s)}#c&an$V%i~I|)C{x=#wiv@I(sC`fk&2B(<*r{{0H#_ONFt2X#I zPUPfpcHdS?N`2FW+kuaK>9K`O=P~U{DFPH|ie7{PMQs-4U}8iv!E_i!<;H5V(`zhC zHO0`$xAvw`l&lFT0m5n959b;eGNL&I5!) zBuEoLozZ|oEG;M6g{Su}Pyy*frBn{2Hzlv8V6wfW1A3z*(~7O@^Z=y4^LT!%Nu}GJ z$CNHJ_Oq@#IWTFjuD7be0h`R!MAq&kUW%C21;8@wY|iiX*WUZ~%EuJ=LMGF2pPBBS z)PuDU5q@%zx%9$ki5Z)4Sb~KbO=ij9Lz6CaP?f+7-vF(Lqe3uWEA!Q1QhHF0j;Y)g zutK}#E^-F5B zM7CA^BelAi16c@9=#IK`DUTNJ%?GDC+uL%L@-Xl4^fX_imp8O3;NVB*?aRH_uGm9^ z;U?Qd?^**>rx;-Tqn6he$ZG2m9hGl$>p19yQMB}`)bVa0ZA;gPi&a&C zC^l9g=eKqhqdiXz5b=|R!vVQ^E<+G2aAwAWK;Av?OJ;8*nd<_2@}f>D!eCCVh(W;9 zAL5mx-`caEI`sV1NBfa@sEErMYz#^%@swieK*Q3VJu9}Fe~)O%!r#B?s&;k(Pee=V zHr#3m?hT!$z_ZskTTYiaRIYvBUQSDW(}aG+H{R=dUi^jJ> z{d+Z}R#D>Yu6o*UyD;;Ut^+?L5f~&x{eK7|$1CQ~6wFe_?22$V%kZlbrwn4)Fs5la zE%63$&uAWA0GR#-RV*syH&x0|3rX|ff0q)f3&Ej;7;)hG{BHS7ho+zu*h(QaLj(K< zTBEF>WHCv$>Ad2H5f{lZD|KSrg1nSyC`8UZLi`*8!h#E5luv583DPvZgzAgu^b_<9 zupoi>fh1%XIwH#|rEE{7J88i-SOPfkFpBv8eE7hA?_4C5uH+6Z@8zL@paAxj_jt&s z0EGOZMb^h)eqX7pVIYNw6;37^)Nf^aH}K7e-?={U$2WBc_UF5M>)`FbJHGF)1<@y& z3c1x_X?t6PZgA-7IG#SdQXuc{NN}Af>yE&5sN5W4+zTZOPh_$Lup1zr%$fbF(Sj7b z1^1Kr2X;g5hAXK+ktrZTVmH04V$y>v%oHR{NAbt4iPX~T0OuzTMjsc{G19d|L!|)& zv`}_VhI4*#pUO)2HL^G-Oq(1vfKZ+uuzX0JU>Xo=DiPSF>ja@RSe7ShHVWqi%_BXd zqBZ~01i5n?5V+30^TEs>$h!>Bu9O5Hpm!LK1a8?983KkP!GUYg?vhlA@<932yfD!+ zU>ZA(vaExPb$%(^}??c3@npg)NT0KGv$zDgHvIX?jc6a zS)iLqHh&`?1&9m00w^cld?LYCgYek$|5Rgv$tUZ>2c|3nG7A3|x0(*z>v0NZMmKhVNq@qkvIC{!6aPOe1Pz<^#)o{YN`?5_vf?jGPqwlL#_DJ8-&St3TD2?Yt>yKdWj~t9mL*t2K#Y*l zrUSfhGmhWIR2KbVnlRJ#&leM5ABhK6a5><>L|nKbh+N%s9vQ=ETGm`ulxHerJ+TQ| z&_`J?i%J@yS#qeplUUg~%;_=B;Y&pw8=W*`Au2LXa+anbQqSUZ8Hrd(XY4VF6@*5k ztBRq}LbZ}%Prjs>&I&Dr7;|}L8Nde5T5OVur)i9Xl(=U}TirM|n1uK8*sTQnM=}Zk z|E*3|{v_?KU`-b@8zbZa+`|oRo_MPydDxk>WE06Y1@(z4Ct@Una&c+k|8_VEBp!1f znbE-iu|x)|M{&J8A*sR|&02ZC>m6X;iZd-&u0;SA z{+N29uZmSNhw0qA#m4=2{mmp_e7HSC^L2`S>Ze5hn6}BKvEib@D1`&!lvIEAPlpPAVGEB_j4VeQY26H$5U*9EZUA`r7OLCfVhFkbatV26vPf7QSY08>ee4#iF-6$=t0p|qM`FD5EV1gmJhP~~o z<=jNdFb>Yb%p8)0;W`kte%K;n9_uH)n`J32G*7U#nSGE2HAZkdSzxi8Y!;Vg4pl<| zi)m)S@8?5$xW(@5&bzNd_ON!{%xD@HzNuo9!Om!R#tW6|;wfY+3#MFsmPG5N3o~-E z0JMp7sC{Cg{9{k0)SMU&ZwoN}u5!-_S9IRLl5Zg0>H5wjr3ngH1P~DQKzTU5 z3y{VB&sIKd3p%5q^U*uSOWl))7s0VNO>JE_n!p^6>pFU-^8KW}78l}0l_M0|AS>vL zraGOX9|fSSI?Yd8|GGFBf+;`q;RaLWA5sp2tVOq25Kq##VUewj^iIwkys! z^;ghukrsUzEc)<^rkWo=2C)r-3R{Th=&Vq&D9=M>R8Tvj-Eg8T7Z_}$-^JvEhw+-& zB;9ulumA7AeJ0fMSy5Mtyrg?K246?)JUCe+Pi85CQ}n;5NxeZcSJ+Lo39~VveI;Tw zY5$K|!4TwH_tnSL@HLBxT|RpOZo{X&3K}GZB&X5^oI^_QH0kVY?3>(~68yj^>kiIb zvRf=j1cjD$5(Z~G*YF^(%`8gWEzX)20)5Q7?Ah|rWdUau)fL~42WWk1QVUg(|{voTn0{>@*`*$W97f!sM($e z_*h&mDSsb}&$#o!h>dgPeK4NGebNGLy=nCU7C;Nz-^so}wv2Ev4xy0q#mqq>d_JK- z5uSj~@vVx1J{_~~L%qZi&F5vvHO(n%NTZ9MAaWhS(_zUfd8vmqqDS~(%AX$AaHWUV zh875QM~of)GmTao{O9QS3R(A{G%w3TFA*08UA38#2)`19g<93w3WJo+8GBhuf-doW zqxE?t@Z2!G(q;0#!Zq?+$_#KYCFBB zx0?MCBW>-Kp7Zi}>J51IxX^@1F>mtK8^EAW5b$f!l%-<|z02OtvO^=kQ3vZrqK(B7 zSH;z4cgOj=tk#J}VH`Z46Wo0*TKtnRt#KJF7OJ(skWYf*y zV+c^M*x_JV1JW{B=(~D-V2@;kY9roz#~Ldo#7^A|stiU0wOah0c`~5{+cHt;{MXFA zQl{mwd$v_aSSQUUDDQ&FsPVMb4K_nNyk5tLeVK3DkX~Fnqy1N+KSmGIN0kyo2e+Th zYv~_UGr4s{xGXzOcZXTiA)RljzSh7zKpbLuc!d1z#xjWDrOUaLS01YxIQD!^u zRVdtIfo5CGl9eQSM(J|yW!!&P;2^{@zX$e1kK%BI$gEJhYfIgAUgvRKi&x6y;x5K? z1C9>8*v!0`mj}s#n)*m7qG-fU+N zTROJXpZusoy8Dmm>j=;L&ICj1;GN{SP-}#=0u%5w$PC?@F7d$F=Df;Y@bzLRsN+(r zYWOzFg9j9a?hwKd4EcEP*Eghf%dMs>3M#OdBPjUC|3sAL$ETF({V2_f>mv^|{7=+; zz*n@a|CGk5b2PPqP!~!*X!Sb7a)M*YZDvzo3P*{X>kxJMK7s1)e|zcP?wL0$8^uZ- zl3PYkxzg{Lnu(gBjPPl6g_w^dHN(p!^@HM%5s9F2uO~A|qlEEdiVxrbw5q3%s0ZvV zZev5&5o?Ep=^g6E)BGxbqwnos8adfS3ktN=b7bFay4y$Cd?R)1yzIVx?KYVy`N#}w zXR9)Q5DCF^VwMB%QVZ|BIR%HFDtW+}L-k&2Qt_G30U*QO%E8jl(Ec-p?wK2PCEWk^34o2-$!7uhE4;Y=ZoT(hgtoq7d6Af72$Fsw<;THOf%MQ88Nm={QB-4j=?`$D2M&&UD8J(Af3Bt zAkkrn#@3G1Gr2VmTnkAiKAx%rXnBB#}s+GEZh=xvHY1c zz4r=d4MWD($N=C8<;h;GLX|kdm)yiN${C?Ag-<15dsD03XCoEs>y|;|OKYw-u7CNL zr5Kyvotee9K((=NLP9*-n*F+EloAhct`IGw@)MQAbXtWWGq8k875D5W~AR3N*4-6$qH--zFXPrFb-OcmaSA!`#-=!Ptbf-JX)Vjj*Y`)C zy1F!_qajZ7#(`940oJSRx+LB)3Ty#e{5ht_o5krp#h7VX!`{KeaGSQ~2t0AP40vWx z$vwS*g`W^54~vMxIZ+4X-oCu%ZN};~Dusi`P#s-X&o=#ul zi`;Yv=NF*q^bT*9Tv^$FcC_KzdmC8KCchN@x=wbx#C#llNn9Lm92!9wjr7~qpvy55 zEqIsrpS3|aB$ZUO$bKP@7V;8_A1p^72RN@q+7C3wP8EC}V)@4s%ijEBD+d4vYT-{w z9eITjpNST!Cv|Df&MlE-HfSsFjW=g@#7tUXh@pbeB!8c4qd22ePvSNBp*W*oO3ux# z%~DUZkj+aW309(5T|gl^HX<_I=}Ewx3rVkfIQ)-AI{P86NLXKWHjCM58IyHR#}x{E zK%@_d$Qt5BJFK6(-xo3$AAAf7S%c-=dZ9S~shz`#wPq6_8r1ZNPMz{n^Gz#!2z>}& zC`568sk(+Uc9>Spv3+uGqLl4H`*oawP|)mzQ1M4;z!W304B ziTw@0G9*{P2jp0(wQ9n3inti7r0O-q*`K;jAjtj|Qyk*1Y$(~G7RyA0l4jly9@Egn zbi`;}TjGv|hGZEm!Rg~72n^WdosK7F?UY+2vfY%9Qx&70d4+ZkX5~-N6^Y+@bUB&I zn)v*(SN}?+yj927{E=nSg?5)zxh8(Wh|~^q=Y4SN6!ZZ8 zxI9#eWm!tURk}0A@)O)-Rf0aPJ{kJhZL;C9*^o}`0hRMM3aNZxD_s8(rQ z+Vb`D=&t2$sXeJz*0WL2->-1qECub^+X6DP5i!iehnr1@7yuTQ^tb{`xyrW3^dkCR zQ=xY;4ic};V^**;T9Tz94`N$OYRFA9B}t7`d54$j?d>hqFC5)TKY~RcLO*w6P+pFH z??7E%=LNo_+uWuVxt~ZK+iJr&U)R$bmDT~HcS(b#L#p8v**j)QGVzur!i?fsfb!Go zW{29m`%p(@gmRs705}tWlY~j5b?ReEgJz|WwY)Jm;q9rldXH!_^B%V1a1mwDHLG3D zFyx9qU84?bEK%@gJB<`Cs&!S@%Peo3}v_^uD&_cgxE6 z^_Ycyq8qBWes|fn^lnjqw{P0A|888Z;`+m`rg%J-i)*MENeqIB*5vRLnX<$aHS?X^n!zL3#mKRiSte`*Fv zuj`ll%s>>9^|ni374h(u_@J%YlWL;~o4z*fx8|BwQIZwNZ@*XLDJnJjg#i4Th1tp} z?iPZ5u-ydnmik+tHG9c6j*|^3Wry>+I+*x6d|2?xW1B|^unA(|j3bQD4VUIOw2I2iQjo^?e6LH_#o73InBFE=(rXY=h_qXhmcm zh?ivTB-|{`!PIo*FLGWt)kr*OGlDUy+IXxV>;G2!jJdf4Ioas_qKRK0El81acK>pQ zec8vXamkjm$E{>ls*m#fX0uN7L+*g3Pw<-mcnKL}_^ev(mA<`Bybz+dlB^N9g_j2D zMbp?&!=zu2A?vsNj)OOxH6bM5G&&pespVyImXW-$)ffmzdbhsKJZexkA|lc2I`L!T zok8gmAW12yrNk4XYAHD5_%t@Op#2!vbS`LNALx72-tCXit`X<%f_i0<4D-4@`*aF* z{x-=IBSfHM%2A|`RM97Ic=bp^j$0>+!iN*fi{g;g=FM5Mo#Pikz*-`?B_e8!W`0gt zdpL;AA1x%h4_*EhD2iFuzXzdYFc@h6^T~Xo+*2_YBQ%JmtX9=xKH$W#@R{0k_=9E{ z`mA7i-ttimAh8&4_DUypaj+;q2Z!L=As_!hS6IC5u6E4%W@kRHT$V#q3lco|OAM-a zxUBXQ5rrc-AG-MLkW^X$s@MKg`LB;9Qvk=1_tvm=lS=S=| z%$g_JdYk_iN_h!r9*;T378n%=5B)DOp^}+eUM&95zy$8~qCau%LOo->T(0_u(33-o zss$c2cnn1uAcF9BWsej6h@0HVX!$$xs$d^CPt#y-Ox~9N?iZg5Ypv)TAM$je z(>F!qRGK~BdC7nB;RoMusoup!7CZKxP~F*vS0E+kLZQ@`R@TdwM4as=tsW7ZKh0}6 z)n2vH9&{z3&)UT8i^!q>ug?EDSSj7ZOQ+AG-yXo*))^jmS6%mS{&^(ahUq8k-^EJc zhXC1u1pj7YdROBzY`)w;g6PCZ<3_@(h&tiq5>gUWDn^wABT(9_t$bAi18sceRwX{r zLP6zKP$iWlk`UWfxzB|E004#rtY`r0{mg&wdA~g8Kj(S(+s(TzExQ<*uFaWk$OWK+ zh@goe2`wWoAn1r94;X&i>4PCZT0l3TASvZX)9gqG#{lvyq9iB`Jm3K_N{J^07Se5$ z@1DA4efC5sZ-8bmYEc1307>=&7GW@@y*yxt1z`%iaAnYsW-t;7-n zQv{?^yFmus;Sj5(EqeLEdC%Pg;nbv2TmV5EL_$O?Sgi(Z~QU2s0v0{e)k`Y@%z!C@-#8E*ZenCPXVumcR z4Dv&glO9t0RSF=HUJxrdF%2dpYXxD!e{?INpfmj8DV78wiI#jh3`lFf1M1K!3D6;C zmi=Yw!!;WlhrTSV#2Aa*5mLt~!yXoM)3-|z@bp1g2GZdu6eyOokYM1N5Gq0pP>YpQ z=wcInI!pg7nqvtvVM{QMQ-D#5DSeJ16NnB0Z$%t}777PY-7)Ew*EkodX@U9|J|E%j z^+A1tEp&A7TdUl?taPfNrthHtI$?NgsT&BJ*($DHRiE%p>gKX2K^V5$1du%4B&4b| z8n{5`6y?>EoKwI#N2nDn=&a~L`cv?^+A52RRn3XO7ROSZ?+kPfLoY|$ScK=YL_wt@ zWdU4IRjE-+!Fg36i@^;v#dCgAhtmqQ>x*6-I0wO=q6ntKp%jczTm?uBNEnEU!Lu2n zUQ&nG3$^&q>kH{hxi*L}6b1bhoCh+g@n&V``?`;ZOa)2;oLvqTsqmNWJp~^f&7=Ud z0Ln*G^Y$Z~tH-hlXVS`*?wdGo6cm?!dIy^qzDI)d`rv0CL!A~t^vuu9atdaGd1t&w zT=)6u6Qnyc{@rEINV92Krl(Y9P$)!w^5LWjqnY^go$$1o`0R*(7At2O*=_oTYlCLBLhg`6N-}-{p4&U zS|rP06u`|XG3v~4m{-D-aJT{_RbF#TJf1Ingh>D7(6ft@kw}Wb!?#5cvoAsE**y{r z-VG7y0|G&J={^14efp;#PQio#^qz^?rcX;vk^WpjAl#{Bo%TLytt)9=Ci}-eaRVF% z)>Z;h=m1iQx|v~4*;u1Ma}DzgVJC=b4E2+uB_yJQs@ARNhkq$a_mI&TvVnlgkF&lVdB@~3Oib(lI7duesrJ`RnP*n;Zn>+!H{VTAN!};n zBfWxV+jNET%C39Bpsz|810vcqQb(iss=9B(VZiIS020E;ZD>nbf!U{y^94W!W?zPz zM|EX?hV#@}kbcZGLN?94XP6Bk2FLM(I?;ai9hlcn{OWoe`CfIX0eVz`QoBcksv9>f zmqN-kFv341oP6!jGAwyOvtcpL0P>BEF!yXCL>C>{2ZTUIvCdrkwUGZJVdl%F^N%h& zk>^weIa#S?koUgH{uyRMQI zY>UqXObqC*PKIzMvoHuU_Fy&XD&u78Si`Kc{30hELl~fDHD_KlbVYRIOyP+=$GME> zPzp5x7@$k*UCY5R6}R&<4Wtxc$SsWaEer~3nKGEuQBMP$w?pcL9FH%Cz80N(JXeqT zwwAR{LBls8y`S|)RLmjFBZR!R7P3d-7AwNL#Nqbe#!FMY)I)4ctHgo8zwmVfDY#0* zV3-?n&W+eOyz~M&rQngi)GUy{p|H|CDZ&>zSytX@ENW3G5OGVOxVhQ95*9bwQ*bNv zS71b^QY!QZ`_IUAdqHi=yS-O@!Kt{2df8UwS#oJXwSs)jyQ6(}-6N6@zs~8zE^(O) ztp@7NfSL2#f;G$i3-PGM#yUhIQfR_wNdPFZnC(-_gF+!5pAS0%$Hj{Kb!W6O&D2=6Fs4=2)EW zbLJfeAhIiC&5WV9_N^%30oW^U3erVigS!kl9xS&+6_$af?jf9>l~hyf?imO|t1~O! zf(#S<=_P%!tL35r1O&#Z_iHs6qBe=(g>Ud5o$#B~n(L>Hrqw`DQ~r{32Vks9IARHS zgDEC01`ml{$yW{Cz{Db_X*o5&cNY{XI>7%l64Ng6%eC}kBC@A7iXlWVz(J@s=EZ(< zqFZaj?FbM&dLB1GiYH}Ya5Pr=UMghQAdC9TJwU85(i8=|gXvr(r!Wu9L&Nz;5+1rO zaMg#H6~1fvsxw{4GY@-u7S0FRfKsR^+q<92{yZYCII+>YJow@3ArN+ zu4pF3wuf#CrM1i|H=l_zxX=Fk=XCOVyqOnzwc1yIbKsL}`g__*cY?pOd>yh?zRfy2 zt^}g$K&`t%uNK4BP|vtnR)sE>p$&9FD}R&l39Mik@rz8Y%(7jR0iBBkD@a*@grZM$ zIAGs2!g-#KDV$wr&J)m`SAK^%_?dHgAJU`I2l z1ZJtv|1+9tr;J_3iD4N#HB8=AP!Ohf97UjMYNi?=Z+n44devcUfJ_ccNp=8Rb|G<1m!y2d77ySumvBE6GhNzC;IAenS16Lj8 z5qLDBbj`s|==CDAqU0n3ZtsXUt(mcQ?Y~;v*}(_amZM_f5EoFy)0*k^n6NR~l76}Z1Eibf@>c1Pd z2kP32#${EW39!i6Be5l|$@|;T&MdeghWH^BE(8$n^8r~vl+kUNZWAFoHCStu-C8s& zB?LlY5h`0o*J~4wLuTCpo+EHhJ(92p{zz$Y(ll~hy;z}l;zHByP@rKSb1<&|RkQvA8@6C2J29^IFkimOo z=KQhiJK94obU@7ZNs*x=vtj^nG*r77iWr9=RD-BC{Ojaz5pMhi4RD&(?Jsr1C>NLv zXMft>Hm@$yvm)}eu4US|#c@q1^8mOU+QHK$o)$S@^5KXBzMf8#fm>GWcL1}ASj7&V zw?C&bTna5l>EI0{a}IJ^WUYyj#GteeF&b|d=M44_nitO#LMq}x3BlL!?y;UUEo-D(6|{_n#dIJ6;P$|E zCwy8>#;QpZVY>r%XK{GcKI?z#NZfk^HpNNzF7$Y>yp5|^jmaUL%CeuJ08uOPpJezz64(kG4 z+GwYt_=da;T3{nb=HcoqECjW%j)lL=TJ^mLxx%yhB@e6hIN!K~qE zY4~L4q=_IR%4&~A46|#^muxgdSX=Ld}a zp&Q}|y?aP)fgI2Yv>}BQ>y}+;UikeL)bJP>0AdS3TRHg?s2$xSEmt-nZS&3nvptyb zeGS_`D=u0cAOglxe>)#9l|9xyHFC-wo%%LE{(!>R{ngzn^RsV{5sS?IyG3|7446tD z`|V)&OOI1YkaVY6>$ zOWyt3D?AXJZq##7&D6wXO6D!yvAtxDqyef}OEM%R&r@H21oXhjUqExveVoaZQ)%8z zdLNEHg8y%WKmDB5W<>k;#BIy&e~cq#8B7|o4Z5HDj)X#^`jKhYjd^jOC zb3F-JMkk~pnjtvyJ1-YJ2tqHnpw@Z>8k_$tvU8#T=kx3T5VBJUPtx^7c$!qzxRC%- zK&`*GB9)NWovMhP*zF1!OCEkgfbBh={Px`B&uQqL(5VD;axR%wQt3DupVoDd?`%^z zou~kf)AK!1>7<2tSGRj+I)!)*(x)1yZ>LK5Y5Uh7r5LXE8R(4yHmV9<34h(+)ss6g6K zVb!7XPSm`OA43R8sz$7P1duxc)^P@<3n3>8wnGjfV$RV=OpH>NAo%%puVa3_@1~J9 z1ZY3o(u3~-(wAjtCQ&(BC$Ck;=1{D!znwNG3MAzApzvGHXagxa0cLVCQp^Qdqp2o) z_bZ~eYWDO#%iG@ozSWcHS#K#6b-HouUNe{eVi7=4czJPI87wZTOsh1;3^Wbt3&z!; zFH1^{(oh*JgHu-O?gZz8SySq4j)_n;#|=B3%Qxca{Ew3pZ$`0~*4&X_U-ihz;Dp-l zJ2cVmtoyzp2nqFWIHXFHrG*?I_i}XNBK_6gp0}~0GBUsc|R4pMarTD^T23HZW zaWXj>?mbT);~L*%Ch?xyr+jMSg^WeLnR&3eA!XwWK6v-qC*9HU;9#?cm24UQ zc|&&hHps4lT*~m@44pu|q>L;r<7b6^p7xxB>kyz>a&oSqU9`H2AEmE`s`g8_f?26! zd1nFaB&~Aeyl+h{kQ@x}k>f%p^+ts%D*f_BJT;-)t=)(-B5H|sz7o7hpsx?qfCf5~ zJ|iuXy%WA;g%!-PD>oOY4#{`~uSnx-O%cotY!^Nlne%}5l(mlVtftqKD7aXK3Bq(k z@QwA_!pE>VH=eb7Ro%pumU|y9Dm7S|FqP3pbsD6Q%(Gk? z1Jo4UYJ|I(k)!152;1#b9Y|t&KRa%B7Yj`G3KQMF-N8)u&J`ndH?W9fOpC*n*~^(t zRVH+)y_QDmn{{>%2&|sR9BQkSO)+3JmXziCn%vQdk+(vktXI$NgtFN{$~X4UB1#^Y zm3{&*EsESuWBZ)Yq?=deb19CasR@#BZ*;HXp2eybDPT^~iT~_V5U!RxkNR20TCP(4 zmUqba+*P*&4-J1LuH=SP3n46&#%V1yt>@dxrnM%d&iuHvcO*dlm^JToNId zavqT!JOP)d@Eqc72ucBl3aK#&-2Q?91fjxsjwUdNF0BGU+=W{1$;d&I68GE9Z>TVw zuSQ67TOj}_c-M1t8pis>90U76NY24}hOA=0FUa0hbm%tcD=e!N#noJk?uY z_d+To3J*ImY>mXU@;KqhrFHQDsj6uv=a0|@RP-CCTiS2?=9(@L+D1vO{9*WQ+FL?K zq@+c0WxaXpM{udlAn+1X27K!A_g*Dp!bde~h?%Zu{0KFgGRM3uZbwDdC}Zx%ns=JK zXFJYrp~wVf;zh%hin1FQ}>Hj5FF8>|N)sLWm|=lb&Ye;P^sQxVu^(11yl zMZu_b7=^HlaR)|WKi#2Ae3k>np-?T3!_<1_5V;WGV4b=hz)X4q#AToGG19yc1{J`C zS2IVlBg9_wQm9(O_K{rPr?!}Q(hssWLD&2|-dv^2KfM-Lk{mejFg)$<)r6&KF^Bp` z(<0F}@MwN%S-DD(iR)TrfRuKkkTx-iGpA*Cb-FwIy8;k;TOB)FVJw z>$Hd*36CZNZuMcQyHB-LE;`ZH5$&yk=P+r@Z4tv1sXRu{UK3*MY6Ud*nC# z6Jc2DjQJf(yNN@pi=8|iR;32q(p?oG7hHjhS4b{mt)IFO)?Zw_5j`M-i?g{Ih*kN@ z@;Z}V?=J+%4famPyoUz6xYfp><|Zq=an>35tZJ>5oE5=;xn68e%UAI__uwT-(&D+7 zd!#wylS3X`d}Pxd~7-K zwv#hVh9i4|lv@AMEzxj9HG!r&ZAO_nsj02fH(>+tqDQJZ>$7CXhrOF}VGFMPcb z=M08XNA5KlQ*I9kV;Jhzoq`vK8hKO9>Wa+P=a_Lh`D+K>J$Ca!hu3WqW&>VBwlIy8 zG}e?HQPka=yr*1%DX#9e1x&$tv=F#frQvlNaj%y<#W~a84Yz%yyJ;TrG1Wk(O5PS7 zS@L_<&;upBlU%Dz<|Mkt>L8B_-jEjhel_8bR_K7H<`fK3XvGodA*S`+ux+Bcf%;J0 z-tuUyw9D3#tPj5WUm0Q*gQnLO86Hr9&0V%$ow-6rce-S{$3~1WBM(;BQee*~9^N%` z=J)ufz3x-Chv3jH-12#b%VAOqvWJ&rFlM0JK9tC#>kAjqpRpBYA&*y-w%1g18qNrwaF2)mX|W7DqmdlG1M5Q^tmey!6hui)OL484Qg*w z7}T07-jmy^T;s75SJL~RSC=F=HJ3*IBkZRbPE62cAx$Uc!m$+Zo0D5u4}DX&^t;D2 zvf*06^U0xK7u9YA%5W?lnOdJc~rP>S#-}i@foXDMxb20eHBbj-xBR!waE; zZJa}~?p9k-L39QKR`zTSL`2^ECKI8@qQSNYPge>^2X`5j#%6YH!jfaAWR?OQteyDl zy3RT9K)qr6{u~0;9s6=DGFtO@CWf>2K3#KkPLz#UoL;Ly6bggpjY<8_zn{YQ^E>py|5e@K!S7M@cQbTw{##TJ z+RsB>q2?+3dHUHm4=U~)-6WIU^IW&cH7b&vF(>tmEx^{}emlhi0tc?~h(ODxPKhnL z7qkLA*4>0v9Mi|vojgS1mXZ$Hz5eLqzAKYXIg|RHzd`{Ykg{W&4sJMPeb`!rW*erD z3q7Xre0*OyIag{N)5moPJg7={HrI zcFpVlcHgGZ^9TG_&S{gXif)AUqCaU^-EHC^hTgllS-9+OKUM@;R(jlto8TrfB|ARh zd;?v`ptf&DAa826YDHU7#e0SJG8HXi+D(#@H8IUs5 zFG`k5C3;N^$bB7La{rL9;NQp4Pgg*H0J4n7x7Oz~CCYNT?^WYGD2@8|YDh0J8F6K8 zTK%r-1Wu-I!5FzG!(#Co2m^+#f~V4fK+eF5oj^dSB3nzt6w<=?-!l+=5J{2xupKzm({NGH2)Bv zY|gx_%RZ3C`p;LsaI=Q`Dd6$>TCt5ezj&pOdfy=MA+Wdhq6tO68h#yTr9|C!IUPhA z7E7_taq5hP`Fi4ZX-3Rkk{a;67ms&xt<2^wm=9Tf8r=E&?=Rak5IHw%;m+#NsKmUlf zW+SpKudUjpc7F8<56Q8g0~2+*k+Mvfs&Vad5L!EI)hX~{}CPUH0}`5Ld4YT2Z)x4Umgf1gTgSEqm$%-DXEz1tSP)(%bZW)0j ztW5v_VxaBd*a?aNEWkfB_Pgmy&;e>mmQlmrbK-;7%G-)*l-qVyo#!}#xllR(AxTkz*(HBd)czd%GC+E^#+yur z&hwL`ZfMnIgt2CtiHO;gQrN3OX@*biC(c+Rza+XzULW>CY5HULgI(H5bAf>JU*Uva!ksEB?Z-o1f7svPD=R7pC=n^ymP` zdi^#85%(Kz7fQf~8^*2`1#Ph4?27(QEIf%xW;6(OsO@fZ%g7^nEh|L#RAsZ|rfxkM zon%&uNFaRAo;50lbW^5B9&5?OcpyVFP{ebTEQeKKJd)*GMM5~k+39lFmuq0;-?&uy zbj(vDUm5KDZ*?TT<21s4H0Kcstil<8+%Y4%&LAkq;Y*8Ei2DT96?fW3^n~y1XLrNm z^bhAK|8b~Z0zVveK!>cG5FP$Bnpja&&+c!y@iDfrBskSuUOeTkw$C)AYHSZNkVDV;1CfF==|S;Bm)2q< zSUld$bc{A^EaPP(8a3=OfW_{XYnmpoNf3Xtg;WvtX&X9acF*_if@i+;;}@g_ zEiqP3SOQd#Y*&6spH9AygbL#I=BGIWbGu_?M1qUn=sxG5cKb*NN6aD4l)h%;(NLml zd@m_ds=<(OFb!p$lXZj%J9fkzom6T%TQQ7MgaL`fRa#lmpgR>`Iyf30!(Md~yOV?D zy-jNiUxwq@QE<~~#?(}~+uA|9fQQ8mN56xAh}8{NU8Y&vwoX)_+Ds59ssxcCsqYE( zRWm6F67i+B<}5B%&u_;BiBVQ)xq!c4{<%-Dj%jPEMaw;qz!F?90Y-8ArkzleucKug zS5-r-+ZNyA->hK8ntBe9rp`OX4sh<01hQ?8n}ARD+uXspk-X{t;pSa?@005!$f}eV z(0UO=;-4cD*!dXHuk%YjYC?>jJRlPHK^OV&W9GZ^k>^`LJ=?bjc!4}9QVzs`drJEw zfjIcjxgoI?wK#pld68CFlPfi(+38cx7y`iWBFNJ1U3%y{K=oqs!>8tT4eW=3GFPGH z=y9g#+ok3*fArRsVr1Ra{lA)CZ37I=+ZOGyTa~&@NRm(fi6_?7!7NPCj!Xi&TKJ_I zTdBGHPNOM;vNXo#wEyQlX=0urUtQ*Lb6)FpS2bA9GF!2_Bbq(Gwb2ZK6AS=MYEhe6 zBKlwbp*e)oA53mn=>PzNBs@w~hycmuNspl@{VFDAgtEI3L_kSFQ3KMzhNL$px#wsksO_t7~LQK9EdtSW^Rd0yu%cFL)4{vWLwl06P9An zx60Om2vf#cFN5p6iLGks1_BXx0}j4^o~W-B$!-OIrn*J$6`1w>#2c62|2A`O+2Ovy z<0f9A^1MTPDsg3zfxwaqApU4`-gsoJ^(_+m?mSrKHrkRudV-3E zhUL0girv6)wij?P32QAdUVkB&YGl@e#8Q})6Xj$ei*AOc3x4KPkDv}X5*cIm^Qvvz z2AT6wbq8*J%m@)Dk%45oP_esnBb5z-O=BQJ3;^t}H4gHR);NHsr0hp(0a!*&R>-!{ zjqVaz*rsl5YV9fI=LaAtPFUbFEF6gDsVa4%l`{9Y^qp`GG3xMrOuSQHXp8$oJF!23V=w=Mg zOYWK8p$@2uWcJwgO<9h>Ml^_F<(zBSh_Hcec2LO`Npf!}IV*Qs=+7eIO@6R(S&Jr7 z@MiE&3}MHPpr9vU2uKfwTOtOtqe9!+3bf&$9A$B20G506cas;bn00#Zf)^FSrUsKa z-bdMG@@FwRBYTC=nbZGN8`ZLEbmiJPvI=C$K*vMat*&+qL`5Q05XMO^WHbnQxax(- zBDu?;<_24}Tv{{kPF%i@jk`b{)zV^TKK&e_zP?vq_dS3R@WR-72*si8L`wT4Br0m#0^2wNO?C?+99 z!6q^QfWnR&y#HBeGibXI^l)0tyw(bWWtc!-g89h;M2vC@Q&J)5iW`Yz4C(taGk&f6 z%7ANDbYxmUuIp?N9mL6y#GC@ZH-!=U)3-7SG3FE)c>%p1@@dyg-i~ep&)buNOa3*BWVxl!_E)G z9QEHLI2+@1(w!liEx@v?hc?DhRxP9EDMJd4 z(wN)y>Ljg87MBE0d1v-eu#$?WY^8t+>qwL=lFBs_%mtTpZ_E}_GGeZIn9L7DWa6%H ze$?ufzFCZM=Oa}o+F1Emxm+J4AAWDJiJ;a4gAV4ej?}UM@h0q3O+*Yq6aFn6T6O=Q^M}6NN{TbIeFV;g1R<*fxvl38 zoRL`)A-c9`72`~zDb89(sq8AOCd*}u$xl~i^Kv@Dlj@Px(|PG6&LQQ@s|j*-rS)SE zyHp+T6dC9bDT3CZCt^SW=-JH96zQ}}Lr=~FFsfSV@qve&f|>J`eZ@$tByKZ&RhB_$ zoOlu~2Ol7O&{)$y^)2V6mV-ly%BpkgG@k^33aNydeK3O!_{?pzU7N3y7h^zS1#hrO zB>Yem?^KXD)}EKHeq7bPQ+ByT=?su2-UO;S?n%+7@TcF4*)N#YAKmrc+!wO@B|N3j zL(fZs%i$#g<{3-7X7Vq!k`$e0U32L$UBQwMeFa^ic1gxT>|rn2Yf>!%VF^Rv2gT3FM}Z1E(!V$+1?B|)6_aQ z#Gy*&WznxNEMBps(S*WOuajok^M}I}= zIzokHK%0r(BakFT2amMA93em_)HE{LAe3UU#6F-H#+1ET#IJEt`ptM++uDiqvHqPA z$`H}KOD+8U^jZMLb580kJ1W91XkgVw0k$8LoEqbrXe%`;-%@6P==F^dyD zZmbS(^)MXN>g`r#0P+*4m!6f8r^XOZEwJmw3Ja z$B7v>03pq@uYeE$wXOl%`_RKyXbc>VnJwbP4??F^-fQV}@|)0O%*PVweg@*s01>F6 zu~CMvSk5p)G~OFz4CxyvzNSUyWKKDg;(D@TEc~-*!%P+`v<4<~3XV2eQfbj+9dk;n z^KHbv_zr*)?QOY26_H)|FL4rTAVsa|Ab81S&K&Ws;-iF&R;98nz-LjjxzFiW(MOxX zM~;_~8rU0gR0>T`!XhN0lgnY=AQ;ErJC{YpsxZYy2T_a=y5*GzCn(Jj0+Nu6Lh_Um z{qq(bFUC+uE70~0NoXsHn_BExf=6#1FWgWy)RACcBk0vk9HlZ_kx<<5XS)d`pE@(8}On;mE(DoBZdq zI~_+0Ae&U#FrOn)e7-?i5l7`j|GY3UIuJz5XDixUHYPY@^|fzvNX!E_t+fJ+4|(!D z2S1I@{vhrjG%Bdb#7@3aR1^(0mpqeauj=RNP)fzZ==ADeC<5xhz0%cEYCqLepW4m& za@TQg%&=(SK+hOQCx1EwMW-vKPT+VNe@vL(;#W8Og3GtT(4pbg%J2+ratXF%Cs?MzF;WB=)OTc#XIJV8(q-uCah0+J0j)SSYG~>;36b+(!LE&u*A?rC| z-Vp+6leer00i4gHrII98CN(hk^kxFT4df+Rc6q~)UZ3&~$84w++x%tU08<+uWaVHH zpC7I40g7!9P}NS1$9Yl7R&{9loV9Nsmqri_l!rd16lUj9?E9j`64HJD_~622U9%>8 ztrev&@~83?da2|Xa$THS!%HwZyq3$3-XVZy+@5xC`9073I81TvaiO~X81S(2EuB>a zbYUstfK}4Y%@V|6GG~D$FSY>Dl@C}R(9t9y>VE>B0#{k-??4u}Xve@gy9d`zDJyVB z=Vz?ye|$Me5caRk{lt1#m?mTi9yd)s4BNaVQfMK1!5Cx4L~kCu{2(N%YHtvlsSR)PPjXw*Nzn(HHEE-#juI5!0yA zoVJ5*l4Y>AC&y>ZXUmyrGl7%Pkf`bKKD{~_DSO?E(?<_!BtC_u7cC)V@Z7yL>5ql7 zU(DK)-uM23;b-5qgLPddHJOm33{x8Y`a0}C`VKEL-T3|Ih9D;5B7~W7%v~5;^?!-z z_HK19nx!L|t>h!n5~`F#s_#e4-G7*`a6rzhm%$S*QDAlqf5|YH2?}2E=ASsZV(%Lp zIe@XgSriAwlO#whj_zA)Vn3Y^;d;Eq&oE{stLnGk{0oJY7<6!$cgQ&G8doX?Mcz|T z{n~1-y`M_>w}sIV4}AK;FTCtSrn~-Eg1nvd8Fq z1Q{H}{dcO;!xTyEsOs@&K$vqST1jVDYAOpi*~zwVKZnKMh%S9B?{~$ib=UTAzyDIp z-44V(oNgp~SDjZKzj1Pn1@X&DmA>YoRwgm`?`)7A8~VzRECg)ufZZvYt|75REj{~6 zRd@>bguEpLq1sE;e6&Y~q=Ok)X|6j}vP(lIuhEi<0ntpg^`$@)05=9ida6ECD+LZ_ z>6$wR@CtlAOnU8%3o&BjY0|MV^@*uuiHFPoa|5qEw#v>BfJ^%U)(Y%Ay;Nr3>nO6F zl`+j~A?wPASRV*4PnH6lj0Fz0CUa`$8jFMfhM7(6qy}IJc^lCVCXFi2A=q;`q5|9T zN{PMw(d%ExQi<)3@!xwsX9|0uhp8~)un2B|2~Gm6>|}==4julVRBPTODC(cKL2n7u zYSy+W$H8jGbBsucQC4nHrNltEWa8wq&7y{{_01JOOw(ASP}i3QYXd$^&hKpR*9+o{ z;sd{|LEn=%1728{R56kZ0UXoSDBwRz=w0c;EIG>D1ALF4Zi_CbUqE7y)27!=BW*8N)>+H0ab_2Z7O##(&(;jt9uB z%-iKne0#{U-fO@)=qN92#3JV@ZBH;#A?a4iGXsqAXnAu%@l)t5uK`lGRCI{N<^Gq% zf`Lm~glF-8t?a$Xvq})+n&Uj+oSJ7Om=0;WBh=AaVZh~X6a|JHLnZpT;eVU>F-Ddg}er9@N3BN=5lrLL% zTCsVr6uF`e?zBYloE&u_#)YI6l2_=yx=jJ9oKRDiDxg@%>0OIlI19HB8 zQ5fYf8z~R5?k5F4R*JR!|k7dW>E0+O_t(82^d)b}EJaxk@yovF8mB-ME;jDs9W#!(UWqSTw#!j2hDu z_k?aO33z@8|HLH*h9ioA@HyCa8UIJ`XPWwa1~81<`0`6wkRw9_O;Hp<03A->vI@dprDY zbOIXfowv}b6T{x=RVVE#l^OJtjO*AUlk?ZPHBI4Cs&L(+o1_Afrk2V+`Lxs9D%tL!1N7bz^Zo&7@cKT5tuUM?^vN1kYMi&h z`66-}zZ1WlhfkUfA2lAmD%(BZr-}v~zXrrrbgk-@8m%vTr{KY5Tkz)`9!pA8ud--W zsW{~tykp3Dz+{^XNvAiF`a&oF-skCQ9H9NDLg2qw^kun7- zgr6ti^J!D$`@!JsIY*#w21-=~*e^A+_w19aNO8qmH%-L9 z>+m*o3o{yn=XDPjVhYC98z3WaX1hB6;q)i?7HyCl7Q9dg-j50wfR%5?vFTUr;@TKE z^?&WbJvV4%QgPJt#~a#izMcB&Kd+r@4+rWc9H_Mf_ff)Yn@6Q{uyWTP@qQh)OgsBP zszRwN^u=m0<@zBt?E+_Ow`eQ_x>v0wptN?FuRdKb)w`_P!=cD2AVwNgSmQ~TjX=vj zOSG;Zh zZw%(Y_L~q9{`~s;+YH+aLK}|M4&P`ekV^Jt0Q*?!8s1vyuqt)dqqcULBdwEaAC~%9 zl=be78W5USSFqTJb!!HNiCoRANB?EL+yz!+oe^XvOQQk0jZHf46@ybQ&6n9mc zPZQ`~X<6-hQ-LHKsJvlzJat$lZYC#+(Cu06tYb)~7Z;m?=E9=tB5jIXuiT>;F#$6LK7Z+`-!zN;K+Io>&+O4|?^! zF$mmcubSAQ4ohEb9|wwX*Q8pzqiO4-b{@90f<8%UiRNE1Y2QfV-yw#yLQUIBMQr-B zGDIv9zSc^zF6MnoUOKVK7u#dVHMrCpM!5BdBY*WI=ZiQbbg(kHYf@-L3!pgghnf!@=xDvX4mAVSw< z-&hGvu(}G^KY&(Ac+w91lai5wU+bW$qY$*3se7#E0I+(s(z#N|2pf0uIIIaeG@AR= zbj>iG*ux@fTr>sO1X7}77f+DmcJuW7O8lR2JKXIu5@ZuXAvcmL2FB;I#9_jt_Ys(Qu5s~)(+lXzZ!9O>~UTb|l= zf)CEO?>9)MvF9`P&+d#}IGxkp1{EJl{GpdHj%Yx5zaDi|W|OvgZfH5`_Ey@S)n)G@ z-%@#CMp5bBAVRI?1zoH}=Qu)#e)^g^Xw3=n z8V0Ub4mQ-p$ba{_S{EJiqM{9u)C~^5lz72DlxRQQJcm5ZUN-L_k`&k1BqsRu)v-?w zm8b78l#y??r%a9Kzsq6>-*mBD0+2*sTo;6y{3=-ZAVbG)S*1PV)hPleGQXVSHeyXvUOXnG@Z4Zd=8!{E&CJF~-=433yAfr%#0@}M) z2wa$Viny9>`4o?o>7_fbQ+aFHwzQdQ9rivxUal2uz8<94q)J{uUFgJwi6kBkttmy- z_6w>lMd*0bfcgweq_5W3tZ*9|Z^Ui&P z0*pty<2;x%EIv@o86)B&wJG1uL(l{V_E8jo3GZ~*kEa=TJ!dthoD&}(G#}T@w|qZD z=E{|w*3o-T5i-l`2vlo&XSbVL&lgTK-}Z-{PAC=SE&LRc#BrbE1A8dM_(qbPz$E;B z8+s3|VnoBk^XsxAJ~LaZKVC;voEo8j0DR_qn=zP=-_PUwJEdhH<+vO#bjV{3vhap> zl%vC;j6d!8_i-?^YQV#9KOhVNX<-WEhLf3v?|N^PDJr-*C}+G3_PDdC20GPYyo_N1 zH^@(AHFm4_%R1yw=|x0fYvL9s`@?aKxaEx_@d~AdHEi{lok$*=v|rqAS4BO~KMYF5 zK*j}|R$2Mx`*7X7o9Xp1;*O?)ImF%)+!+e1G#$387AV;&_Ainh-A|QV6X!VdEWWs@ z+~Gn)K>}NLli(_o;DK^af>DUR&QOL?9j>kwG`}{mB6cA|e=`e><^ApJOI%YJpP>d; zaqb-A4yqzn#+CD4Ce+EZzDkd++f4Fg<8{@gtdX9>MN8V$wt(_M+$sU>acCXYj1F&b z3J?$j0000pL^d-30AFNq*?MWD26BMfdK76}(zJ+{j>0oG@#(aI0Lh|`es*0CTgR0F zF#eq!{{g_v7}&@F02>%N&xFXi`?)A2cP{?VORkM_N%$j;XG-$l$Rjn)o%&lzRj6CA zEs{lG!Q{5E1*KR8xeKd{jej=Ml*3}>W_a6SqmZ|}l zgs3PWy&#JcDkTg&2nn(Wqub&KOWU{%OXDuKU48vwup}e42#E6agCq}83?7AHj4n$0 zVA3-94a+}&azDwGvwqw!#2Q7Aa6X2xyuzo%C?N$@B;)|J2nk??DV&xA^2#WV3#y=9 z*Hg0XH1)KBcA`&MtgaLTM~n)91ICccJt+~8VskxI*2p9;!&QXv)DDDB9b6Ui+h2Vz zB!nL!TSxg0B9O9kK%?&fB)GEaFOz8J+OIGMa^)xy7D7NZVF^+sDHtFv36Inb&FEbs zPm~~0iaztrvP0=npvP={bN`; z1d0U#go+Sqp5S}6b)XdeX0>S(a00f#O{Zf(R6TmPwAZs+o9!wLi;SWLRih2E*|+3) zWoP9VS$&OfVA7eQx9>g{qn?+d90L-`_0%q44Z79OrG%9O>FA^h4a5im6ci5|$x(FK zZ9Gjf1<_hUo=XC=QuUk_r^|!s9}-2Y!Jg5s9UMSNvb7o}{e^77a&vhU^i?5L*r7uH z{XN$E&QLlb4ygp-Mdn6fHcD<~T^V)?V^)A&M6XhO6DdBES zuSgcu*Zja?LLkNhF&#=67<$ADR*gd4m!kkkhA5zx`dF@+!TIP?idG&wGzgpsi=BS} z?l261V-ADOhAn6sVsYdPDh(0z48-#L&k2K8N=SN`J#Zz0Su3X0&du8JQm=lH+cb+_$! zkj?U0(x*N}_jPUF)&R*>z$u{nbFE3^aU|7&fcq196{o-5$P;>A)CQF=?29t<&Y(j1 z-fUj*{D)Gdr5U~HscmT%)!yr8bLQoxC4RT2d{Me(8QP^w%SMku&-dTuDqiOMi(l1ap;Dz#-f-Js5XN*Eh zGJ65-eeDSh&HVIT{S?cAv7fk6V#E+sH)%WHZ+)#v53XfV-XJLzr8H*ArOy#5{dmD5 zqT+kCHg1Y)4TL%vE1c(C8sr+&qOGm~M*eRu$tZDBNM=)NbZIzG zI30OFz=!U%Li>c*`pqw-4t6hnyHp3eJ4%5%XWyFL@JL+Zt!_En)mw-^>BJ~utZ_^F zLVAFU$OUUix+U9n+_Dq_S7n@Q=Ed~$`9G(2c;EGYJJRowYK(u$Q z8vyO%UO`NiG+8uA2%{JX>->^vz*zPCg$cy$t(G?IMvjP*8F5UKs)Ph`HwKDhBih_B zQUKP1mK!&JkWV^^_N0O~N)#T1RlodonwOf-@H}3=c6<4KuOpMS7x^h;-+JRHjiQRD1nz*)&Vy=@p*jDrq4;7n2i@@Eq1=>QY zS*Y^NV!%Q6hYP!aUk;|5t`;6g@0%9a`VK_L4awZOxZpnNUc?xzhq?o9LE~oDL3=}G z`Bsq^tA;lkE&DQc@jr6+DalHBJYw)=b*2!cn~F3Z-gqJ*1rmx3EQM<&yLuqB$wfDE z7i;GzvG7u>+6$}7dz6gIK(`dD3TO~BOUt2`;IbDVYz9yrD6B);`dEH(1KZud-SjP4 z#?S1)jWgSxN%_|1NPAn8BbGhL)R$J-ckyxy2g5Jd#pgX$ihgKfbp~D!(oA^yijSkl zi=nhAx|k4TFpGq|<~**93Cy9UpapyHk7Vmm1y9XHtqk}oPDFgm# z7!I#8`~gsJ(X@GBiObJ{u7HkR2QB6wd8t`wo*qfmQdpHt$o~)yPm-pA?;0-_dZ__lV}*PbVw8kZ)I0&JP;!sin}x|{Snj) zze4{a7P&ewvBjopgvO9=8)iI)iGD`F@6oR?;UlHSvd7>5qhH0cgU_@3o(t*s!&ij+ z=qS7ZZ%~C4210}Y)A>&Eeit2t(H`|~s-K@2#b0l?O_?j#GlV(km@*{=%;!JqGa=Nm zZlzS%?r-2SJ?HMJ-l@l(07nw+CjXg3#bsG(TDS!5oc^WY_Oa@xx7*)de)!lcEyLJc zTIGGSPBzVFVksVNsJAm&F$_l#LITEQ6f{<$@rT-3^^oxlrnTM9?^=sfreHPq#U5jNg3BUpsi?<=yBh|EKP2PV~p&Ub>0dCiW zvtWM_u2NTwh-Vl{nyqC?b0qSAsFhWFCV_@nBq}cw!I<$D2GHvXp%ek`&Yt&1H#p~; zhXC4uNR$7c3btJCNL0i{ILuL3w#X;-*+>6_TB;pQrXo6B3C z$vYay18>rje(JT5(Ix&rIn8~_!<9l^s*}C`+d;8CL&QKqALT<((cc6d5mltV z;md9C8Ee*;u(^Hur?<1_ScUnU-p|p1Uns3p7%qo# zM&Qy~%cTm(`bGfWi>4J@Wb|KP^EulzQ z7ZEr_zb%}LgU{Jmqa;wODPK00J_mm-lKxoUp2c;(k;ReD_1{o|CMyY4TxyCBko zUzqcYbA$1xn(i)J5#LBoF^u6fn6&Mi9d0pk0wHna%8K4(rOw*YDvCU>F6nT22b4>7 zA$g@kO8KGuzvoK=KN9n*>kf>a;1M-FSp3!$9c(7WeO|GbJpe>NyT1vz4=DmHRE8U} z<(tjfucWLy{%ygyO%;y5O|ioUaS=``d*mtEm4+TDofRXkrl5&F_0CtOL^j?D)IXR( zY%zt=!t>lCO^_kvVIoCjt|{hu0N{`^ik-5fKBaaZmGYG>g*f=z%z7121%nwdeW9Q- zv7|GV1>!$|4c?QEWaa!B^W%WxNCtU|fFPY#nzysC<(1=Y z&o!3r{7;N>h=>Ub=OFGJr&ET=TyzTarL#eZd9S>OA#y=$G$Buwi^y$0Dy$*WFBPv< z2c|J1-7}|N`6e4%@jGblvs);`ooqb&dvbCr{%8d___~4aZ<@4q4s&Ps2Cs@J?EneS3L2bNP9`_t>Xopzuh{QHpbFf5$&CvM3 zn(o6sw%>|z0Pi8#j|riC&&9yeY*~z3f_cA`1$50kmDTLrTslUO@0iu|D;l~~+z+8*#=TO+!`)qqE}(>P@#{tL{7KUzu99;- zI@8Caj&QkRxC(2e%sY;h^y@a-CZUay>bA5co(FdOr_))iYY^ z(KM;J^|{Q&6_T7Fd#eeZp9wz&UZ^LIxAfh`ab-eNJ>#{MRWdvL^}LUKBhF&C#1}-! zunb@4e1$k`C6&}z#HI3rS~Daxi&Vl-zZ$JQc5}_y&eZC(lNX zN3C&tDE(J+RpX~BB4XRK%1D*+kl<(wSLYtY(+YAMHZzgV(kX89NyK2@ZQ`+caL+f* z2yKcuY%@MiIZcQ=8-(gekgg(I8>i@T_|TkN!^S?}`o6*iw)>nmk?BK>$AYVCgL};) zmT>G`rUrR>bgl^bj?}i4=x`{}=2lqTo!rctEjlX_FRSl;EBqIfpL|w`rWhexM}pDd zaF*$mVoOTW)w@#Vj6xW4Q#uy1>aeun{(9**my=dGjh=C-<&$lYEiSkMFw@XvxZw1~oIx$;Bq((RwE zi8@%>r@4G{?~V<&C)Ioip_}C9jyL=3!||Ud=vym@1)zTeM%gaLEm&{;#Ar|L{2;pS zG(>B@r7CX0YLXr^reh5THW`ev^aEVBeLRf7K`xefppF^7!I0VmM!Kb{eZ~4zOU4Y| zsJtWA811xmdKIz+;1Ut6da9m!++P z5zt`aBz9CdKq@T(0P)!q)3$rCFuSuYEavP#>MBK z_!_5Vs5}Pq{yT!Dqm(Yu>|K%ID!@1RXcV$0^=>fw_q06Qc;P2mY6E%*2^*#E6?GKlTY|lh z&c)>6>P*XEwhuTIB6pc9+KD&X>R#i{B)s*_>>cH5_jV3+;HypCB4XAFZQkNleCCc= zv)KUS#^HI!8I}vh7%G4(;NEa|p*m->%K6h#+wzrGY*4v=Bd&{WOF;ZbVbwB_FvBpf z8FLS7LR6YApwWY;dZcPpY8eb!3X_S$5HfU!4bMKV8DdzY8OUpwK1A#h2#ul_OPQ|fgIIn_A`P&W(u;u z&4T^Vm4Z6&yemuwc|5 z_A!e(M)hCEXs#@{0gGM8h0J{B;3+Au5J#x4HL{)$WIW-$bOc@f6&0Cj$ioQY{kS8c zFMT!zXEMpIwfj^n_qe!j+Jl6cjI3J2>l2mV>UK`!(in^a{?#hoW*l|SWAOt_JYJ!& z_R7E0md*ctkww-X*+%F~*rrjW!(>Q%h8@ENpZFgcV^G;cO*J0Q?HS&svt3d5UydS8 z-0>`5Znd+g-aeY?vy{{{#NI*d3$O#8!2Xb!%~DDh-}9=FiR0f580_NBrbvsWVzWSe z5)-dI@Yeo&LY&*k@sAfI8%>cs^znK6^M_eD10|{ksFB2AZ1xMEVPS`^7XY7_VMcY? zKe@EAE=@6lI=_U&At5cI1hM7Ur|~u}>>(zrKcUEVF%V5&PPOf2Lhe!Z{z6==mLs6) z=t$xxzYK9sq`&o-4gU1*X5DC-Hy)W}Lvw#6ghp7G|KhR#yq^t+ zi3}?3$M-DuudaultH-(-`Z1>cFzoSZCRs4&ipAl1Ei4@H6U$H#<@Kn>aiv^TFOUn~ zLS=*VhC{9{)2AE;I)|rBn@8`i%R;7S6pQWsdtgkXZ6%8-6PONswT9+IM@B|hRG%xAv+b5Bqn%urLtuQDPS2$38s&Og-K$Aa0*P)`|sj= zTK>1+(8(IgJf~W9%%O8QBIfxFUQ9dA#5Xf2vINu>-4!5|7S-E)b`kO+=_Kyf%?R{ zMm)%J{BVkqcJZB&Zida%h_whguFqhl=ju3IL5ewVtV_lb#{+V`&fjW0^5f69hzH^g zdNh?7F!QX&jL_+0@lC{hS;hvcO{tWss@@*V?s(pBQNIDmbZsc0VCMYU5NMOto0@eCF0h%?*Zgh21hW2n{bnyw9jYd!e7at3xn4K(6;H%ob;gk208Hu=UxeWdQ6#YTH$OPWAlQmXXmw@sWl9!Eo)tki;b}2nTPcs<8j1Ul#c} zd;8ZY!{>8VCmKC`+uMBO@a-`CDPBHtNI{6jw;?_dErZhEQt2yN_Xt*O3&%O{!c}9a*CWC22?|K}w9<%q^B}x!iW=?Z5Q7M$X%ER2|!aK2CB5tF&p- zOWST;BNxH8q*cy>K>LF?GOt(;n=C0e@%&z8FnxIz43dY9dj|y_hM#lJic!Eh|1xzT zgb#ZTc+kt*ljfMEkd&|}0l10j5aD{-2%W99%#ZX7HcgW?yq;(U&)1M0E0XzR9 zeTc#*Dz=$7sr`wWsrYo=U6%Are>KUR(07mgESIka_cCuI+jsFuOE^(Dbt%yEZPsye#9sr>x`)|bM0^EKCs z*_9ee;~=K}Gy?YP2O*^SXEK~w#=~+SMPCMtODZK)&d3Ui>p$yt4@u0@x*ZT_9x;+W zx%pG8BI8xWuZA?2LMda|6*1OGUGTYE_d_QpqtQB8r5RR=v3}Xm#Q;>wg)zKva}a*x z>)Y5QnL`sC|K8q;B1TAc>a2UnSCKBML8L-bvb8cvD9&uDvunU>Zz@9n^C(k>EH#sH z(G2mja!YU+n426~VLA@lAtP*ga5z+pED5)|dL}R$fgMJfl;(^v&t%VO1nGM4kYK1xu2mLIe~S6Hm#<7aO)2ee6X&62qVM;v!FKXQ{=I zXBEmphTJt zHh3r-h`t;R!yqn|%IqG-S)4}kP!}Iu$8bzsV0eK)H)PnoVw-&uTcA8jif+!uA=0x^ z^D-d{AIkB)q~aZa_!qyipy+w&?`z!;Z1-=}KrKBAv;iC+=yZ|+S5(8IeI?;;M;i(* zBj$KkWYQ|f%lI{L1E{w|4!HO8P=3q55h1ZeKc$u1PY)js>=Qo@PMT zUMYJ-_sSP_x}iSwTEK=zMFW<4QTR?4LT$TInue5FdZSo`r3vfPA;ndZhXk>9Pfs>=jF0onmnr>Ruox zy{Aq>AsxgBJ9H2mKEIW+{gOoGY?w?+zA}8nhf~W$A9a<<(HA8>ZFGFmD!wG))`^a} zs0GWg*#ZtS+AJiO!p5%XforN4RThJ@yu$Gdzs_tfZNA8`hvCNj54#gQ9OkpA$(=o| z1!rGNlYhsYoolO~kqr zC2Syk{gG(;%th(0Z*ovG{-)5|NZxC#`^~)WDxKyEZ3LTB9;Xh! z$Uw95S=!+XZcXoxUer>NaGY-nT{9o5yuJ5b{EchgVtB(7=qlKLnz;QKc<0Nm&<}T@ zdhGz<%nS3P(7ZROSH3@+6g=snZ)s{qT6%R`x<#D#`PqqiZE2t1t|>;8X<4#%$*MB#R|f5T7Nn8aKD?y|n>^{)qs|VOa50df*F&w@X5ll?$iJqko1ZGfV@K~gD76$TP0Kr(NOh$v7$ z67T>Z3W6Cu@cKAqRE|$XT72Rtn*v&cqmIS8R2mu_qTGzrkpdflvi+U!5|V?IqY!^c zJKD63LAL_pPXsD!abpa&!y&>+@_(P)KbycY_h7XjUkRmv^;2Zqjk}(As6>`Rr4X+V z_$=j9n1lv{A`qm*3gJVIfhc_VgODr-5hA*8MPgDdk&v)fVzltqkboor6r{UQmHsgZ z2*gLB3qq&`q73w+N`fCr2%K7LKv@tO5JE)`RJfop0Hu#Y;a+S(NH`>%;gvZGhDE_J zDVBr-f{+kEBneM~FjZ`D9zw66!bnGgf{B;chnD?+05p|N;9fT)TAVF+kc z1B~G%s6>HDmBxjXod(K9s#sPKYMfi6>CwFQDj8Y%F$yL_{g5CTfUREQpD~g${ad37 zGAxGCS(1e*o|Z6KBc)OpmWyE!B9HYZP5_;=f0P6fT)Fp@TtzjpZ`<)8so+UKwpRCN zZAIO6Yc#DWfcSGMN&9iF%Hx(UKI>mgd1kL0dP35R-Jt%n--S|;42-;B%AgJv()_n2 zIl%dBHVE0`NBX5=&q8^qPBTJg_g814pOoL{Gf`3?8o<^?Dj?gjF@9EG<${vnNrs_f zU@!>D0dS#o;TQX=0v5oIv!I|90GCrFR~QUi7An?5kqr&PZ-+YmjMsuS@wOF4qaaF# z@Ox+-FiY%_AH><&Sxe23Kx|b}h#*Q*b}od&6Gq}xr&xXOBE-@2NQ0?xAqPk>TK}x6 zU}o|QN_m3Iu$g^I0uw-*16#U80dMVpXnQPd61KUqSD3`g(So?6IZ}v1R01k*0}==e z*1_Bp3{wTXLD_^)HiWQ94OsYM$tbM910XsV>8(hteXaG8e?MSLPA38qEej=95Ctk> z3Y>{W*y)NqpDj~ix6G=rtEw|=t^Ty`xc|adtBaUIrB?VYWn0B)3b&t;c_Bg0o;lG4 z2^C@#^_gZE%&AJyYyBqs0=hs*G{GdCQuhGJ($Ru}5a0QXWK*x)*lQw@)9UEkt-_-ne{8zdRIq5DpiJs-g+`uZoBz{Sp~sh9nq0WiQ_oqzxZpWB7`=pRy_Y zGffEL$QmYQe1z+`QXv>vZpC|s&+~Z|TCPYkjWS6XN=2*!9@Ij^xsjIz%p}M3ak=F4 zV>1)g(-P|vd=cdLv!Uoe!@(;>!0iT8D3M>l-`VTBv6|U|uh&%ezo0Ln!Q+>0zo;S% z8`|TSLw`TH?6T}$w1VB$ZscscuVsaSIox6vpO-N3YzRuR*q`WyHQl{?+@%U@+O7gH zuFG;)pa!WLPFCmkNAas-a~rHa`_ErBGuAJPFcda)r(RRmk|jl9D4srAW6WCcVu$_2 zSB>CPQsWLd-*~MRz}*bSZZf`@u*OluT(D{`lt`}yKVLcwE(}X}Kh3GJ&q_XTDmJor==X2J zBigIj-fRX_5h!2={l!BrcN{{8Ccb4d2e47k-kjtZ-xeXg+s}~z`x)ChK zTqRwFj9Mux(qnNW`H^^HK~Kp$DJ?T||1y|E6X&MVw)6+r!m0;iB0sl1u>*1wqxOSyu=)a9GM3wkaHPhCkDwHRPJqQ$1?-Bw z8fWoF{iP~k;d4JxXbV_HG5o|2eG{>lNF2T|&%E97U;2BRynAlm`uxo=p}p_jIz15* znHJx7LZ?D1q6hnYJAHKw!q-N%6{@V7oll+QvywrDle~@=A_JX8Jc17cH$mFXgdYvN z4r~~#f)*x@DT$dMZ@=I1WUtQx##1b8s;j5bR6`0J&_ebU`KkEa)M?Xm;-yKP^igAke49|> z5HpA?*nz6;GXpt#MyO<27RCWTkT8t7C`FYFN z%LO^<1s?_2j5du#WiQ5aX#3yR09feV)8eQz$Q4UgyJ@>>xhU@p|A1K1?)%vJS~?p+ zk$nE{dBp0qHkWPXR)_qES1u{39ED>0mjTs_MF{a4S} z9&*?umM}+Nx{4T(cSN$QIVk}xTnP;e*^$^B+I*hV)Ai~(}ogb~>@&9YL5XswcJP)_RdT)+QK--8J|6hxn{ z`{T70up*WGrh*wPqh^G@_So|BfhK}Q8rWabUSmb`3v_Sm_=fAM*y_}x)F8&os`*me z%hc&}5Tuf#C8Mi`@gm6dM%L_#(s^eKizt>8jai@7#k`GS`J@SN*(%pEYx7bZq3yIO z-^Og|Q{Q(35wWOuZO6HRAcPyT8g=O=zsWb8q;1~KA>+w{n|l9wfN$WCS_e*Ck4Ldw z8e-uhhDD&kprT$_QHTZN1W4~?9%MkbCd;VfwQ5|fj=qAll-r9ie~W+jAA-{gGr8Al z1fJd8WYrFDIE(|O+cCngJ9e*LDIPEM6GZZT+bUef+le6x-S$O zNnt}puLo^IKajkE)IeDo=+2j^p&vk8gcM?tJ1dbIJiA#*$8I;>rF@2jY6)S*5%l<_^s#lh$&CU%Y~pN{`e)ZMeC0P3&u> z-w=9_`dYlMuIYTLycCzhJ9S4j8eb8vYXqn)=~hE26Nm^=ulIzGP*ReZ z%iPQ98<8nG3NuntMF^(WpV>c|el%%u{;28> z^{T*oTMjvVXMX6RdeL_QQu%S4UF2%&VcWrwdOgYh-p+73Nh=O-TH3axVf1Cr=~4mD z!m+-XQZuv6l@2>mX*qlN)6_mRbN%W$KF%1Z*XDV?L!$r)jWX{fPN|RT-65E0(!os! z&|Fc44(A1O#dcr@u(J6ed8xo@%|ySHx=CQxDs>E;%u1h7}I=QUY9(9baN z>2uwu(%;Ava)$Z^2Yt_%z?&h4%U$qb#syh|wh`7=R=p}$98*DG8 zLzFgFTG!Y3YW5n zZbe<9&BdNf``d=61Y}XPYaP|q}zODC!On$BJ zZ5Uy@IvtcPCsogPuP_eLlS!);p}l@E_R8fmHD*FvSp81UxdORAt_m^DMWc@FKzlkG z$%8edokQJmIr8ut#PP(y{%Asgl`-`cn1q__wU6cPznB#BjuY^A^~1!SG&*EJA)sF` z3U8Pq8wkwvwK92roM#MD(I=`fs5o77;gENG(svJP!#*76I)WV- zgf847pU+P32RPvxZyw-Kt)F|dI4+r&T%RUUQCo-wK?_6=%k|HDNFMsyj;PEnysb5K z0`nM#a}|%c;(@G#MHKsC{MIwHz*@(BMSO5U>^|UaX=5@L%pbYnf#=?tbLV!SYCAcZ z^HN+q0OxUHLz1hJ;#X*5FKVn(MX2Yq1&5Xfg!u0%yMj>fc!rgGD+{Q>*4`rQ4!-1` z#YOp2LT6VOeAzQxcFPBb!%-YJ@0!;m0;`K4^7+x?&|A-RwXrfl1$F;)_(3tjZof4(pC1EsJP&X6Jfuim7W{cc9Y^ zG2xVIXF!{azXEu3kG~&5^EEQkB01K%DIe4zS&>|QyVQ~*Z-MX3S6amFYVZovNc#I)u>BY|J z4|s+Wl4gA^rBkWM_~1xzb~}3_l@OJKmUH12oRUQwwXC&V!Jdn7Z}gu zLLfivEjeNAbMKWwqI+}oO7A=Zfx&TyuODbN+}quZ9i%b7-AZ1P4A(T^wY_I_6(OJy zLXzH6EN1kK?GUU&e#5x?-irkLopI{)zJp~RbDZX7dilTXNc;GQRW0QG+4id(PVkwA z{DNUq;haDX(l#rU!SW$;$l6RJYf&3F4ZWBwb>{ciU8RnI`} zrt6;{ryO(sXXP<&w^pL#{vw~^#1PCYBdCQm94KsQHXAIW>}?!U`6XnCQehyVL^Au@ z`9+CN`D!LDI4cwsWbt~86@MpTQ}>$Ba)vz}Isrz6phRBzdmG`a$JaIfhXULGxpn8i z`2n&9e1KhtK#af84>k*i2IEoRlEzxC6d;mG4UgLnt8? zTdk#9;ChtvAWvF%1P(bO-NGx7zQ{XQx^pCHQM#tvP@N;LW2dK#DDam%E14M~Hiin@ z*}Kcmwa!QmFN|?S0N_~n;Nz&f#pkZ{UutWW9Nq^}eG8`uR;LH9>1%KH0n$13I$Oybr;(( z9B|<8%@+&U>0IPWDQ(~!ZMv(7PG|Q{hmC)1*QkMHeg5_a39kA9^)s%bx_915N5{{b z@J$<=Io?nu)>-99p5D0KJ?KcB9!Brb$=ediN3ha!H zR@u!xkd(klHqg-+VQ2Y7{^S28_DQC=Ok^U#>0~|TSSb;17kuW9vqjZ)sK~C(NQxL8 zVLOI%8?IBBb{M6_#Xx7-?%6{;%eckrfZo0^a8J&C!A&7-1e|6HY56gC+nvVm7A?^J zXXT@g+BX~ddlvtkJMxs=z20>0jM&`yCC6s~w~J0`_fG7usgSF9aDYH6YW!Mta@}{i z@!x0f)Z{+uJHH#%LL7MWnuH)TqKy%x%^}?2TJ8#j+Ow#9WDV!s2_ zi)V6rtX=8zckUEa=;&eS+QFTtt9g<&xwug_y0et~5JG6!z!`O4awl$g9fW@4wqu)V zqMZC{&MY2``1&;Y$>%zEU-jGCCb46=EwKxRN8thig@49^Imt3U`@E<1S0rcFC$Bm^RKQ!j!ro06)4gQ;VcU}MTsl>KNypRkmN1(6Gsu304V_yodv${EKh0G&L}vX^uUOUFpZt0DcCe z6j4SSp3JKrekw-g8}aI{YuKJt4KNcgA{`yph@QbZ$)erGr{P3J5z*hFl-Y&T`8D8Z zdquUeM>WdZ%v>Gfr>|)Eoy(fJ2r_Nq)4=BX7zNv>=(Wrx?HO(iJA8GtfN;R1I+-Z` z`t`ry5cA@ry$mDev+U6XAn`SSHD&DV&k2y^Qj@tjHK9>kFc_QG<#VQ#9HNBvea9$2 zy5~6!z|-c*hEL$C`&`*UbBUarePm!^faMG;XAhtK9NsdJWZs6uE=sBQ+^pdPWgIi-HG`!Rff?!` zQOuo-wxd}QbqA0=r=UsTFNNC*gU*_b{__+;*899>#X%n@2+nEAFcHDzd9I$HJ+6ba zrz>8u{KVmVKbN#Q+t~0dKGNhU-D^3{hL!#g;^_QlnFM#H82WcLt(e$KyJ;ZTK6#EH zB0;NjeV)HR(Hs%A^TB<^mVCvSc`(T6r0MWIU#< zg?M8gUMjGcm;hpzGXLFo0*0N^K_@d5R*CjKQ@8*c>a$!&VRWGLD@vuUIRORuR^lBxYcEC3 z{M^@<)B6>@-%+m+>!QH!gMD_Hhej>j365D<58q}6JE6jgMt@=1q`{18_ z?1phRQ`9_B_p>>6RjBFZFfkx)_g8$=cQ_Vm_3Z{GG*dp)oZbn^bIzU|BdhII(rMx( z`v(m_)a-dMf26|Ug*!{Fw?6m0m<|Ur(f}|`7d~GQm9WnG;a7MrcxpO>BSqqgA*%%w zmTEmlRQ+xtLUklt^$Zrh%e#I^qnUc*8)m6cvLOfh&_n2r^hH<{&JbFP#QyNS!c)q` zW|kN}_3T>;Nv0}&yyC81klNG9H>{1WKOjuruV13~L!U}Xx8Qjy?x=x_eAVXf^)z5OM18DnJzmAoxst(nC)5VsORv7?-q#1X| zdvp4W5k#!ls2ly{DoXzwYWU`8cbR(C+>+TLarmJ^MdpOo43qc+7Tlux+Cp%D>$d@^ zSYQPmuHug_)q`FLb8`Nm2aoxf07Gd4-O1?fN0Oh|O$?5!ys2jOU2VZmemo<*rQZxg zPadtTZ5SD%EDExJBQK+VVWf?RBMo+m*VG{rr%R|Zp*}fgU=8~lxlwLwihp^ce2|#U z_|ka{q^cPL+T*~&s|&KD?qq*xfsBSeyEPd+q_-L!UvFYo9eklzv&BEe{jH7 zs=6UO$b+FpGpWxrjqB3+ zNW*g4z~xhpfzO$%Vwc2$JWyUAWZq2=J)TO~SrjMyn)a>y9agOALMdN>jdxTsDb5yC zd8-VZ%uI;Ket-(XotGN!fL8`uyilpG1~Ndm)=j8cAyk@>t3hK01Suxm5%KzpUMfw` zPC3u4{C4e`G>W$Ik867|a|B=8(NFWAUiYJi=|lR^G*rJ^YC1_~L;9Z+$XHHDHHAukDu{8if8pNV+V=41Luyc9YQ^ zLJ}^_LP3QX<1qmnip4eaHyf=#JW9(GWsMq5HMrlCEnRV=k7t@92892wR+$Yxzpx+U z(?Cjk4IHl2aR=98Kk+ic9z;n3x zEL3ISjKZyp3kx1{emda2>MCpo-E>q>e(plIxe3!j$5h-OpGsJ1I<9?5eo-$e z4S@Uaocn>vkksbF)d#;(790$M=c3Pb|K3-VRvId84V>cK0c7ZyzH? zVsA!2aUcY-gp)QB1S$lTijkn7MyTz@RiH^|>Q}2Cl|Z3>Xi=?7dZ2~B$zO9<&wViL z001*$RW$@q?`6(=dvluK%eGuKV~|_6Z6vG3YdjIg;KZaMASB-x5GyBICxBvtjGy`c zS*Bo$RuU&RC5czXGqepi0iYdS(ViFc3 z2CGlRJkE*T;(*SX3 zIFN``A}LT%2zq&^B(sbOPFzc9;UQ=h`$TS^c6w`b;kjTMCxuWE6cyiEZErlc7_Nsw zQ2>(eQ*_<1IS^JfJQ9lC!Lm6>|Mr`XpQm_!Pqur#ZqW5;mJE1~;+a%=}i zlNXa(U0XaeOrt$1b5feTCioyNQUP)R!IE8)8!8j&o}+jmHTW-N;iA=^a&W^aHOP&YE?+U^+XAcEP^>w z_W&vo1XjJ{1yfgFO69G<(tHH130v(DPlz^?p(pQKAQ42wdbxSNI@Tl_^tj5y?RmGDjLJCM@mKQ=D zq=HDJ_8Wmx>gWKgl&Klm5~Y)_Tp^p^q3Ny??q?X_jTInU2a8HEDdvFFzq;^v%^gB( zD-2!~yrW8dLbL^m;FX$x0rmVVh$Tfq1W^YrKLa>oDo+87207#FhSO) zY5TX^t7IfwvH)Y(4@y3GrzE=^6*pdmos@9WRdK@EOkCEbX#tiW0AvQ0j99VmkW;H6 zPE6?vkmBA#71of0J4G}*&N$-FalosgmXhQo-P~4f5q{i>2S^oQC8LKTf45`5bA7=UyN$@LTUx*u3xa};PzVXbaLtAL<(0(DOOB;5()9;@jbHnDoHQmdh@2N%^S zdI~!27`$LnAnQa)2cmEkab zN2Jx|p$?u&^8R$)Q~uc(^u-Q4Z%vKjxifg~q}TJ964-hy)uCSiJbT&7Ohvt662Y_0 zZY3YmZ7ir)36bDS{IT7R`}}_gpihk);HPt9ny=KQ~mjyS6?4LDUON?d^!s$xH(m4z-K(UAgT78 zDF_uqrhs)URc9@{q2EAx0SWbDvr4Qy5z|Z7W~SI;wYA?y|EM)(gSf?C;Ms_^$rssv@$aU~2+{RDX~hNHpXiYY zLOtR~3a}#(v9`BUeT#7OlCO^%m2*#LlHv-sTy7*g?KSML@~eD>7U?#X6Ob?zXg7D) zORkf2BHIs4gU*%%ZOAU|Bb*Lr=;<@yjUEMwCKv^70y?qyfKBfk=69TBR_R>lhMSzPpp?%r zKs@Q5KIlEyk{`MNl)eYBthwu|UR{vZMD6Zh^sl({unQz) zEWk&>#BC5HlZFBSJ5;c5UlWE=^kJ^7)E6oo#bWjG#I|p{xP}1m6`aC)6{hYEp?82? zSaQ7f0G*FVFNEX|t0?8dhI$cVRMGgUaIX%C+VL&0G&8076R;C~$sAOyJq(#O*XeuA za2Oc;?r;ErygWxNjuRK5UsdS;Xf{mt!K_Qg*?#bJzD&DW#>rQgeu4JNY+>|N&a%fB zU1z|EDNY%r28v4hR=R$LfL+CMk1@N&bIrG~BHp*ibE{cc%CWMgz8&7>783 z8Z>NcscqN}{zaEVXsXu~dKL|H1(gKTj!7_8TB@Yd@y=|+5GPf!F8380?LF;cc0HM^ zk%lZl1;LfbCsC)V0nnRdlIO^G8(4fR!=IJ_7!=%Sa|2|F|joG*)dj?@eKgY9Ts*WV*)Zqm`)WgVNYa= z;9eYq7k4H^VekNCK%2jGmy`%+FNI7bqA|tqw861Z-o(;%jP)RR!Gz@gNs1T=g~HJq z#cr0r9n%L^3PLo1r3LNJj1o^0qFNCWzfkgr-uRRU;}I}j1@Yw^p`l`%sdH`|m&{lR zim%?m#o828lEOlB>Ailu5nP3OvSJf}v+I0LVBHRe22Y&iZPIBr==~z@ zqA!?o9eY1iU=WmdVX|Zo^smvb1rYxP%p#(bCX1UQdzfa~T`-JU(qF*8?EoTO?uT}& zsIKno=N>Z?=bUVZD)5B!dQ^g!ELYa2CVE&X?#%OzEhDy7R`GqLrfz;L#&o5}uSbFY z*@RkvFF674_yL%e_P@54iAgaIm@KeL_fZc0fPP$!NyEs{ci~ap`*cNM9_wvud^#-^ z#a!0YST(g66PJ5r{*1yFb35VSSfZ#O@}Kn^Qx4~kAB_=0rM*9Y3vcT?tfaSbJNOqj zrhT9lf7IAwP#1A2C2?T$vqG=HFrOd7yEFVK;UUFm`)y-I<}SV_SZ^Op+#WWS4AuS= z%>4I>U6h~@F^`j50M*U+3-C)p=_Li_bB;TPafV}x7E+Z*M4pyEo?)Q2+6Oe4@4k&_ z(!5Pa^&a@QbHBu-fF%myEMBu23c_;Kf z_}_Q2cl~`B_P%X+VnkU0P`}UPKz_r6YXA3(qx-)B```ptQ1`zA_;>L^?U)|W7@z{} ze5zC3oaQfcA_du%^1R-N!T(K#6YuFH*;%Vnu4<|a12DzbUP+$wz;UK`M}PuHPoo;W ziMO!IAP`eS(FdbUo{cD0cR^Jw*aCTy$sjbiElyA54lhbgPE()XIk*h7$<*o~sW|Vp!J}a>yt%YTgd>HJrKEEk z`9I{Hl23_B1mW@~T?QhPf$N;0c*I)$KNyd$3#m*RY;5z@eEX*KLK^$tRs#Ed%uy}+ zhSTe9lYY%_a$gyd-9(pH^8eMpTssx(ei|@20LB!8ZmduS3r7G#(&*aDM_s60W4ZW8uvg`qS%KBPW zU3TogkhEqDZBsKwEz7!STbSGbe&TUR$c5=TZs51W+ET>Uo%;Q1=UdD{+5vhuwux$; zX?_ym>-5s#IcY@$tw=jyr*?ZSl<+TyK^RY}zNl9T4oFiGFVIIZgJ-_>%joY23)#G>$=W-b;bAF)RT@AycX;poMHa=l3MtbvHQ@^xDH zfi6)e9-QD)(k5v){yO#CNuL{_5iqS60F%NKL~yY4*`S|4oJ@RpX(4PoQ}0#N_yUkk zYdM0=Nj7IMLXBxGC{vAJhu!NrDUrsIk)Zv?jQkB5U#kJw)@~Fydi2uWy+-eo^=~D~ zutHT>pjGu=njT`uG0!1LF9G!;7KjET`ag(fY{Y#+edJblF%^Hp;3Rk`_|t1mpID|8 zf=I8!GPVY)<+{fquit|oKB?rN z!>iT&9*8=ul@gZ|0kDwi0L9P-%0`WPwR=>IT8rvox3>p#K<1qSNkY3kMOB~RP|u-9 zjTDxMr+=nqJesLV_PL$L-AsGd{l=Ct&w24f(26T+9hOHZp_0Rr%ZQkXGrzG0S)SW6K1lION z#Qw{jX|ErG*&8$5X#BZ9_c+)- zTmcKjmKckiaB@Bvg$`!>*fS$tgJzRG2F4acr zc0dT7)=x9rF@9HjPf}K z@|IJX1Csy*MFV}DBAbjq!Y9MFTH>X39GOT&AyO}uzi#R@m-T$RV!Spbx1W5#eM z7LnwLXEDWStvbrU3LGbD(|M48tvbzBj?HgPM=nSL=f4}|i8D{lrRa6L3IIY<*8C6A zZh4l?_$H5`k-c9Qy&e!d?F%6iKmMJV>Gpr~(tH(c>x;N$9217K(CI%(4pF?3C!Wn` zG|5W5>OaImaShWOM|;F+OlHE}eV=`kX@(%1=8_HVlWk641Z#>(>iWxGFE^W?juj>{ zz6ry*zfxIUwRuu@UA1tww^Rk}gq%E#Bs3phsWFHWh;mH{M^iTf@= zW%D4!ll`7#Wb#mB+eymXSoUQsgPc#t0%Jy~UD|pgN_3jX?SxUl50D|!I1R9I43fo* zj9FgKPzV2j<6jz&;y{%~E}~mK)Cx&RWKC=Neuqjnr!S&s`*nA!Z1Z@B=7P^O$&aL+ zoi=jBDOHO6lwhSYPf>!zOZ81m;!vp{_Qp<8O3q-=HGJb)WglKahPG5JQf(NAC;6md z)FCQQ7ZuwMld~+R_^z(9DCBTp+cb{ySbj{onBPS)hb$M?r@0E7y~H(95UZM)Z#@^5 zQN-fFD2U<9D!W z5h1S!U8jqcB_@ab6J&Kgqs>rTyhL5MRvtb=F|;PVV+ygzWY3$=k6!GaW=g>pP^}dt zqeZYx|E;Ut#gM>~=+ZAVdxLSJNohvrBkbz^bh2PzjQk|A9snzVI+GTRp5t@g>nmF~ zEZ)yQe}Gk?n$^G*ogjlI0Pz7DLc%hJ>#UME5#_&{*=_!S!DRl_BxMGUgI>8cI!cxx z_hBU!%fM@5t#_SCJzW%fRI%MzH7%`^A8Aw*Exr<(#~+bP>The+D<;j*?L&oll>3^u z(Fj#c==`Nssxe&*Eem_VAAU3+F=5(o|7w%${dLexC@a3ik9RC&=T1;=Mo7;GJqHN0 zggZG$w)i)%(^a&wPlrli-s(wIVvK1`k4FnG>@KC80Djw#DlDMOzrb6(Y(88oqc%Q( zRYk3=CUsIen!Xm{4zU`6N#CMdQan5=wI`W7YpQ%xV?vi4#}qHgTEQa-qRNtEcBxEo z(4sfAMs}P_2q6Or(s~W}IHGPG`GM=5kk|+=&Z|ayDw2=ZH1VDSC@wkwaPllb&ZTVlJ}OUzBS(ZESrrfT6UZ_5e)Mp zd|{@po2F%Rd#~(E190!=9M3-la@jPLdCs_aa{fh)r=u)Fv-QF=86hjXveWsR6^W@^ zkdm#c7~IVzY-LSTHTP>g6z)kC8yc*y<>_Gr=wa>Scuv}!FsA=ucZkdv&Mb$3eQTui zp3KYoBW~MD8RVJLq-~`j)d|}zRqX9TZ#6R??K9OZ8i}&?==%2>jC-DzE1e3BefH>M z;podshNNNiDr)t8M}acw{>{q7={FC-tQM@~~zW zpLfTV0>)``8r#h+NvMpZ`Wl1vUn18?b zME{e(dR{~TmGcd5u^C9FM2t_cr`uB6vsXPjR2`)%9&<7X)jTMg%n!P$kPU^&}n z1RnElU*eTh#9mLH7qpGms}5+vvMeG6CwV(22+`&Arx$ULcoz#S30jdfom(1hs2NhPFQte}imH*ZIm{dbSB| z2>kp-j_jq=I)8L^CrpeBoXR~+n&mkuMxWRwsAnIx5V=oj06TcCiUDM7_?2yTuAoxc zi5IbJ(R6z8m%YCF3hHflW(8ek(+2DaKMwzCPTYyUHd3Y9)&TwzN%WV>Ulg`b-&mDr z?Xx<^7UJ@$IuXXLB0R0;^$@QNnZLj-eC=Tfjzd!HWH@w_(0XsIKof#0L4Lt#*k?q za(snbWsxny!EicbasL__J?!hJ^Q|WcJbYWsU(Y;?uw5K*Jsu}YO!9nwaiGrT#_>Fm zb&bh#^?QyzAW}N7GezsHmut1hpiSK)Wr*lq?!lUM#jqh&&!L#Lq=Tf( zR@m&Rgi6^bZUkrgUzgEjGlcz*C*^}Z<2ITdmIu=qB11&M5kwJKS80`S z6UcQI7eDLwc~TW{r(pHT^;GVgPC3re^_AJ_Jk zz#*ZMwTP*;&7*>jjL=Mm&+bXUvbEyDrI;0-w}wTU6hc!rhiO{s0hVcVz3NL}8yP=L zx!3w(_5etN5BhJ<4;|GZHG6LS0>{quPiuk>o!F*0@l9OLt`<PlQ z`aUxpsa7u~2rZrb2}z6u+q>m;?BK6N?rIlpN+1Sv$jWLlf}}Ab9JGbKnWneZ%>}7t z7qdN{oJ`yKQDL+_N13!Dib694=GQBHxSV)~#pf)R;<#S)1p<_9w>DIh<#XL(8G<-E zg7Pd*fAzdLUddO%wro>q{;aY*s(v85r5WUC!eaFS(S7xBMP!3JAoADUc1=62Mr=sm zt%CEp@RzsVv+MqAcy(TtHb?ID8~%%exKlGzL1~ zP^HT>+j2pE8rR|WyOMnW6H$^#g!!rk>#8a{DbD8ebEz_7lIKd?Y4 zX*o`}i`Pfcfl-Bt`pNl)Xlu?ih!FJzVGC|NAjiUo(XZRpl*+ zlsZ9oF8mElgO;$mfWl1B1@xruoh5_(vej>YCRqCI%TQVd)=K{R;8}-7 zj8f|7-U%vEANEh(<&K|L-k-YH8{M3|xS+r;I8)q0F$-e_Tt#LJA-+hb*Mm;I#H)e@xh*p5fC zBgH*3fB3rT5y>Co6J=8kQK-00%gT_`5}_Y1ke+L8qn4AxfAK$US;BltvGbK#53DUc z^f#jr`E4hGJiIqD`^@@ex(TLBg$!?llFMgz(LR)#&E5LnEMj7QQr$_5nAG`5Mi^i7 z4|-gm!R=7W;WlW?AG6#`d5Vt2FltyfOHJ7kb-1`z3!@%I@QuvWN4QBpdhxf}0C*X`QSkB;(=9wNPh`Ajh{$%FWw22Dk zFlt|~m97+`A`wUt|G$dABptm*6_8$^0C8Q`H1{)!kit)z(3qC%L*u~bYtO*~`Eza8 z)0^YhJAHa5XME26qgI3>mEGHFGxwb*lm)^te^8=Eba=dlTDF$88_SsQ=ZElE;#x_W z9RdGt&@*wNvL^sybOvn?Q#!A7xg*`a{QaB|RypPT`g=96T^9C;`>fcvG4it2sZIxT z{;0aukqe6&%Z?zG$CpUYA*|fh&A0jS`oqira*MjJ4|@J1QrMhU^Kg#vNjZoFg5Xp+5r{x2PlBZsCMS{S#6u{ERdXs`0M$@jH;Z7WQueZ3HWm2yT0};O@m5WutO(5d zo8%3P(0~*SkpWTx7Dp%*FpbzSV67rg5l1LCB&;1QLp2l)mpMinW&|mk6tRl49X9rF zVl;}0feiD86N)Mf*SWDwy1-EX-M>edo|xg?nf4?|_X=|*RtUCEwZ$-r2suCmD!^FE z80@|d+A12C%fncuG^K%HVN9$&ZKaJ(uo{3CFbWnFBCel%v^*oz0Z^1da?QQvbKmTLYv029P(Qp+IEO;% zfx`(m^_0H&{)$bBB%3($Et^Cg`s)8QdvkLViQIXP9b&`7r0x|Y60uk{VkDauWhJ4f z4~EVl%`8mDbQmM9!M-DXGRg~LfL!B5u3Qi3(ZJXdoF)OdBG{k#iP6W?P#=Btb+n(m z%D(RDG+kE1G{sMPSG-`fRx;>qGL`Q3?&lML4Fs$nj4?xDv{*Jui$gRt3os@)s>87( z-+dD4KNSPfaG3ta6kpS|{pk}+gUli6n)(qG&7zg@726tM?LMrzc|cY!w+WV3ghD8y zu$Ahb8~`@5{1B=Y!J!U}Nsek57)_an#mg(exqxZ_qJ(BVT-$#NW?iWkJC9O-rKC-g zqiZQtewi#1qnw78t4#zI(8+FeE7_9}PM{Q3v1wT)0iha^O$Mt%{va>HwR1M6jTT4a$PNNs; zV7z=V3DcAw1OwMVQa)w6s9q3TO$CHS<0F*SwoQGsS*vGlWdh_KP%bJ2td_!`x*a`g zS==-AbvGzlr%lH*MZog=(>G|$=b4{Bie4J_(u<$d=sr`BcHp0BFNcEXn|+z@jXhjq z`RE8PTt7>#O@OV|8q7Lb0xk{(D!&jZWr&Y@7#yb@fcjAP2u#9&d)z~_0Au8^93Qu( z%@}j|G1{Jrs~BZRoLFINo3*^8RZlSrEUADvD^hKe<1Kf-Pzv{^ltnl-foxQWdD0Xq zQ(USIAke}6S=*|g`+9D3cDZYf^{iAYLiSeM)*^BWaA#vm3t1J-TqFxX6K*kVgEi<{ zXb?FB1RDoIf9>UE*p*}Bg2&p5!J1At)~}U*I%j#&W1bk~t&_deLZ(<(m=i2?IL%g- z2r6qeN!M!PC{DwUnX zF1ZcxveocG8lrwqB90J4b@Q7vd8A*+~R;Lt6IQ=C%1qmn-FqBQ-Y2_vJtKXgPxpr zyg+!9iCzJ{Aofd9>3BjFq}7zRDq!HMlLTi9Q|IQrXN?1=q~H`{SH&;mJj}Tp2RTJv z%Jp(sOmw7g%E4KiHIqCxrK)4?sk|3fvh&w=x7!T4aC*UW1rn#|4x5#RS1WRv>rU5~FKs`7ZNoaW@VT>3`3BjUJJa0UAc2s2&~GR*9gagp88} zb${Q~tfUx&r*8}Jt(|tRXn0yd#m7&ZN|Md&>fAOxq(UrK#NOP^Sr%YnN~G#1M&b$Q zWj$@f<57N?6efsyz zK$zQx4_2Yf1c_dS8C$pu_S)eg!v?$GhwWdA@?hWF3@6@3hu^BBP)KL%VSb1QA<3v= zR%omanMckKK{r)9CGL+Y?38|q@y>hx9A^@tSC`Ex9-?e|VkN~VzG|wptZ-EqY)Il2 zfpCt~!)z^+- z%u4vc|2hp2!+QMdGWjpZ{iSVj;8aE}Ie;~kHXnwo2a!JfO1@0Ho`j8n<%$T3PP)*; zhv%%vYcbSt0pfF}el|X*rLchGHBpfHs*M~{iE&1kv}Eu}m`~!vz4-I*KWOwHJ$p;r z!+&~g{&#n4-1r8Fcm8nB6?8@_Y5W!ca+L#VU7OA_w3TA6trfbi2Zr2()R8`}Nm@ST zX0{?I)>%-}%QyTGEGuW{%G4%Yh{AELqYuCC;-C&1eDV}MbOWXM9&T9Is9IQLc)C*S z2AaG}geZtAs~g<%!}{hi|3^89N{*rVVUzBh%`I_uSZ#+7gV!C4M89T6%BWtiOm@7&X~rT>??< zRWbx_{YizSV;X$1Ly?F<Ma!$recOpO@)P|cO1}*dev6wwQI{Z|5#I)I32H1w-3r*dn#daDs~YMC`%<^yoJ(ZF;m3V{qO!$0@+`J4)CCyx}DNfq{Q9=^h}vMuz0IdTtb?l zF7JvJw^uDgw?JNG=%oyA%Tc~Kh}_%%ag5zRhdsNpS@c}$Au{*4sQ?c{RRqONw>RB) z^oh;qzWRR2=TJM`iZG*16C`JRw@*S&@woD#`zSApkFGR9B4Pl`YGs;KQ?S*sw!N87 zL&|?04ljPGpzD_re)zvSEezWQ?o{!PF>h;O4nWs0B~-#w5e?N;exN8yBRt3}m z52Jr>99NS*BZ>XtmYvZgjn5O|p9#>g&G6}KfA$Crym;Oe!(&}}7n~aj+kw2hjE#Zd zqmSZHeiOR?et8A!lK@D0d`7yu8Gpk@1W_af%XY6k&P|FFL^M?#X5{5^_8NLY8Z1&G z=Uu#?WT~vC-SyWv#1@0Wxi{dm-fh5108DtMYs#j%9Eu|+@P|g1Y7_o=!`poFQ!nFf zvES!liLb%`zqfIyK>RWHm6?x~;FlJ4-}4c4F~%h!_H1HQRF7BKA-|kZSV*<3?nVL9 zVEJHJ0y}&rmI1$>Y4o=q6gh-u?yT0iDX{PyuI*|Gb<8mZj{co&{;2!mrP0IaFfg;GT8&&QcWomi)s5uThS6sHBv1j$xK)viVmphFeal?7_t^3eZ8Un|J|A4vGQ#_zv5>;C z&nV(ZX~lPGzow{2fZwNWwU&B9;&))27<-hDk3Cgm%E(6+Plo=h$mre&8Lu550G=)J z&VwnkpKCG7vCm2P?uKs_WGUT*crtk$`p9u-Ggnp89X z<%vu>EeuTW8Qrlx@Fu+b_Zcm}-pBk#M`bwCaReBV=I!40Rd$*o1IGB)-Bw;a__UFz zzD#hnZlG~G2%H}t{2RjEQ(RR>ew-)k#yc_W+}DY90L;l0d9)pfWMWcOs=75w{_?;v zq#IJgDFUz~2g6vB#pD94FvTsiuVWqX!WHsLcILWQDHa_C?SEQ>SxKFk(44EH0uz2?ogUgiaJGWNme2Kzy|8`$~^h;Dk=O zYa!8phDzVWB^*;hlYNDZS-r!yWb%u+JkmLITj@sVpfZ;;NNhMY)<*DG@QNSbipJazKjX(Ll&Mqj-%Y5nVX^r)8jk&iKv(3T(>v ziCoR{zy$-zue`2lz9bzwg<+X*l$P`%$giWoi4Ouzk$+*SI1?&5+=G#0y_BJ7@1h)8 zw7$>ErMnDl+~bR+Mt20_R3q;u{PxCDlihq0XeZR(&0TRZf4}~ zI`D23N7|slPm|mS=&VS2u=I@UN64XzBlYlyx)L{)%XDM}*P^bR*OfE$a^+57*jVCZ zqsK(nze#~JTcc-q)}FS z3F44pvVtB*bJ)TurT~ycVE;~SLOFz+62KBC;liA%>rh2eHk0jY*sC2nHngYp#VD^3 z_rj}u$pvj7#LU@V|8>p!|C3Nt^Hf%0bg#|*QZyyq7E&*a;tf&>r*X^O+pa%^-^5iTT6iihXA`BlerDa@nS47L+B8Xmr4n4p4=UC$+tX?qOiy$69j>7y){qm-D!!=-F1ZA5*hkQwPUjbQn#Ut`Z)@H)33*LC^!z`sc>qDeMy?IM z(T!{XVKnWwz==HK^oYho&<#d{kmCpoe!M#KXSb6=KhJu8W%>SX5~mSgpFp+!ivb z%ONX$QmS=u1sS+Mb|bKR6F`+&>sw+YKpucMJHc#ytCh-!r07GG|--GG{h|f=52TJ=T?tv z(b&%;J(l2N%BSAeSruY0WbNw8s5c|~p^GCs6)sSHFW!Tsd@FMoHLt+eKfW#$ck=C(J+ph>l8qFG%RM-9`S(jxc!RN;I}C zQ)R6gID2$8DiLC%L1d6NIm3K|GGt}nXh_KraZ~&;xZN+IDYY#2IZeN3kU+dOM!`LB zC{8jUE{YxvoJSL-CZmSdxnZ+w5&WD4U#@x&*qwlq8|20lHMwc z#WH^#1d!q^({+R=L!O1h*@dK6Aw-y{6&1frLm}Eq;Zfb76(1jG>(5(Z9Q2u_0z z*US`&0k5~7B{tw}4Xv4+Kjc9w4&+f=gs;1Ip(0=;b`iO={W?3d8*_!p$%8fhZfTa| zz|$cr3?a^(aXzMVm&FLK zk4pB?;-eNYN=J%zmiNwiMpi69V!|}f&=CP=C{;iikJ=NTCtp(oEKur@AmQX~3(>9t z8x{5$ojaeySWC{bpmLe+^w+r%@h#n3>KSx2IZ|kF)ZEVNDbWBKY-+<4AQ%6T3j;iCYRD)Y+;bL|T^ChP9VvScX;@ zzE$262p7yKDdD@2P)a`c-vO@El#!r8Sw0ShgvtIN)pCzppgYmD<~Il3{Epv z18s&Yk@pViQ?1Aq#w+77e_ESq0BCFSaNTY4IEOivYOFw^RXj<}YNXll^!`vsO}y=3 zI0FM{xNFnYkd3C^A2Qy%irE{hJi_KM1o1yRBQ51W>-{h|ch!^+!CG7b_TkP~OuQv$PCG1? zL3+O{1h?d!0I@U$GJi|gGs%E+)MR*zPKd%Zf-xLP zt(!g^s1P*_I__1xw{^f23w0Z|ZfVNTIyX1?=ZOxk>M8y^0$!?m6*2`AGLyV44WYO= zMsK$7gdyd%^FBSKZx9ktC0G7>*hvlVY{@Z96@OWAHXa^hVJI@NB`xs)$qVX`pEL_6 z^=Flfd1rIG1+_}7>CJ%UdlXiQbS^xI!Vy#U6u<+7#&eb?cMupYC%PnAt0b?r!P&5M zr@Ghee=P%q(Xjso1z*{ac&W&Cpj92~vTVoYFbgTnQRj)E*^XK<*v?xIY4Uc>KD0aQ(quEA~~{fTg^8`_O-^jvtyYk z+54;9?)nG$<(P^s`wsOeQ_SS8? z#MQV(^v^@6U<2r}q#mb;d zEZ3=nN!l#4_k_RN?$0wP3#7*flf1-WVGd~GJ}xc7pM}aPm=kyeZv}oFRpY&klQ9zg z!TVmd+hEfx$2!p2prI=Y%kk=8E=qk-ce4osqzjYzVnBMg?=V6cM|oB0Q*t-qB%RsT|aiB0XQlrt?fC4$#qx3c2G#>pqcbCapM;^^Q~bz};kam6qfW{%H~ zURdPEkK^rp3M6f^EfzeXea-)4KKQl_v33D7;UX#dD#V_CcvG>bf%0wmlkk?ypB6gR zoY>b!g_@qY{8NjoPNfWz{G|98TMW1Y<1vB=8XQFY*#-?-$&TsI?jYR=?Wrh0P&vz%P3BIHU&ZA4_ za1eDXgVJiu)sdHlo!J3Eub~9cf4!vH-2|wq=sqc~vi6l(9cxAbIcI1VhYQy@^mJvEt;R7^w^sU%Yrbib>35|EDo7d0f zcZcz}Z_V3+f9&xTy`V8R*L@k}gc#_xX;o}j@C?eEq1svX3uCrT5h1teu*>=phVj2S zLxgPgrM))y{B0#5>ij_1JL3%(kwG2*t5ajPP8pr4{cp0Z!=Z}x_?fJVDjvEsy zqnC2jXj^(Cn|~^BzlgiGNI^hjfc4ix>G2EVaIF?0o;6*94OEQ$XQD@V%n%R+00aOt zQ#L~Y08eCS*+yY3s2fyxctW^W#15~4Bsf-Pmhjq}PJ+x(xdO0L%zg(ZQL&9q)U0 zp69*Kd6~J}a&4bdmPg3mSfLI=0t`+7G!;Q3D?cjPgp&>bcticfVpbv&0t1TyBtRAv zOPPv7ND!9QYAB4J3V{d!(|{#W*d>651YkKL5QfxBSW3W3p;9Oc2jg>qg-8itbfVaT z{l{Py*yII?q~X^F*&qy#Lb4JaMXE3W#tKEFq6nd5LIM@Cs0@oov071cH9jjG zB|sH4*8?yVC{u&2G!R8hN#rj(p1oC6(Hb36IWy=g#VGa#fIfeCxdGz93h+NN^|lg{ z%N7O0DE(Nhvb(J7LMF}9`OwN*l|l?PyB@V+40VxwxT@%7bRn$taBqKHlXB|k2{__| zN~WSQg9-b{%W?{Fe9KyB$V1682GZ^7-@Jiiv_Eg ztjLa*aYEG!SVQuKRXP*+%B^RYpnhDdW$1vME&-5RAaI@pCA2VhU68xgv}Y2_)is&h zK!G!{Qd@`w$LLJrM1ax)4jyZc9I0p=AixA$R+2@|Kz_)BWQXAZ=2~fnGGs7Gt#GmT zgW8Fpf#SHBU`)1D`ZF+E*N3H=Qbb`IvCGJ#4|D}_LsK$^i?TA2-8ieoW!iuyWm+L* z+k-J3Wy_2BK1p@RfqAE8Xm>r9!_vP%vZ)|7i;4+Q zA&?T=A{8mK_Tn#W6A=B2BJQ_fR#9?d3>ZLxl?A5# zSwBtdKj^DyySL)!#`9xQR?7);bwj(AI{-K+R|9&0-O1g;n}IJ@VXlSeVtuiJl4Ctk z#T2S|mu?X)R+5)8fPr)ddU+Q&p^pSzEqa&P?WyWRy-?RKB<( zMl=z&EllGNwy)aFNu$`E+=X`Nt3{N%t}=fHRn{lkpzU0+ELLk3uV(2B)5-mEqn#j? zr-y)^UMs-IJS8wK>P!9vEVA`0QXxHJOVx;3CTnXkj<#4P$MF>_VViG_opue#-;YL~ zw0R3Fxvp)`t(meU<+k(Wn%8KZh{v?$`l==S8;yLc&%Z%?{LtNwUeo`A^!nb1-n^v? zppIU5cG}lYQ0~tAcjBL^_N_eZlRv5&+G2Hy#cdW45{XLw-IM#Q4Mpj_ zl0o_t3rk<1-&ui`E#zJh0@OlUUw zCAI!J3L5(64Vvs zG5=$^cdhxI~ZN!LOeJX$C2;6-x=eBfWlqI2o0K$Z$ra7RRf|U*DZU zk;C#3Z#ZzM*wyvN)Akub2y8r}Y>d{F0u+G3f|`BBWE(D}Oixnoa9J7Qve4FLr`xy? zhN|Izq@U~fNo*3%yoV$IxF#sNKSfoyo4U~TcisL&hKVYw;D|IlbNN9Y=*j?9 zrwsL#R1V5@b3s9D>QHL1-GBs9yFw1a#~pC+s)yhVnV1k|ZWiIy0GnJen@Te!(Uk-R zvHtis=KR*lRKEFba4HsBs--I1(m43l6J8uR1gtUom@m|qm$NxM6Fl8HXpesfM%9j% z0W#?1wVIrIx+Ng%1CEyM@>F%oouFW5j7V5sUdrdT^2Kk(idSegO4dYDyfklp}lh+h{2nfLfprDCxN^e^@*Ay@ydr@Mv zyimIlzEoN1!jsfASh4bQP+}=1|tVrdmwx z;>d%BvIJRD481_xVH6gaY0m(H#8I6C-$3^BFAWbUFBC--`EkPL>Kayx-khll?Zt-3 z4)FUSQ5(PeoIUC_eV_dRIzYw0fT=U!zJ)lxZWZg-Cfq8#Fk;`S&Ar*z{0Cg75Q^bA z9J5#IqcE>}X*X>&4FT@@lnFI~MiD3~8{eCse!)y=C4Amqm|VBqAqA815{Qbwg51g* zT+((hpcWMHYPODHO)1LNXU3qe+||IFN=B@H^PV*(bZ1-%9|8 zFB!_%4q+BtC8$_x9s_3m0#@zr_8A>mR)O}gE8-&V2J&3XZ6ExuiI zQIbV$3@?hT@u0Jk-7TQk4k+0u@>C{J!VHe>8Nb`yvK zTP{HlaawC#M%11r6X@N6Wn(-XX7=sGt3Pp={B(g%)R~VZ9+}>$z2!Aowbs>J9^kcy zu0WkV!k_Xft?(m)siLWdWK}gj#S-8pJvq^_521mYbj4KO^%%$kc28}qH)JspN}0%5 z<+|0f#^i0dPQN?dz@E>YiCxbq$!3uX-Bmt6SwHuXBQY)7(u^HW)R;)He1jlj;?O2H zF{$Kt6>;*oLTS|moQBHIEGpqpe>wsBbEj}ICS!#>ek z2hO#~5Unqt8J7-*TkU-Tor)H3b+w7$!Pw9q#EwD5zgW(D*Ma#k{|>pKcd`TpJEW))sh|_9w_6eZpiI)>CNAhEekRBtIxNCT(rTv zbw%9mi7)mx@Ekg)qm1hEUjDS9xj`p?qiHN3g2Y1_IbOc1(Ow`r>3ca!};m2t6PIuNqk>-jf9yZ2;-h9i9J-qpO3aba1ynZ?g3v~H3@xHV`F!9)jGuHqrw$TV)GDIhM8E=HHh8i-HM?W*6Qat z=?%dy)P{abWUT=D`o?r&FS_&w^Qr6?xkW3*l_4`)p@aCtSg;D5_K=HEhDh2Mes-B( zc>ZS#E26yU2P`kqgFq@NM-FJ*O7E_uq($+;LsBpF>gSMCSNnISq3N#pcfR=rh0)#S z0x@v|htr+6rTyP~R(w5l81+~8G49)&GqRMFXJmVGS%%t>mu0*Ag>emFxp2xr_I2=l zbQP8-@&Zyhs@%*YQnYzFCU-9qvU=rk*Alj}F

hba`CC{cEB_k%! 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 Bnr#38 literal 0 HcmV?d00001 diff --git a/vendor/pageant/pageant_x86.exe b/vendor/pageant/pageant_x86.exe new file mode 100644 index 0000000000000000000000000000000000000000..baaa76c7f35327e62d917d04c4100c1a14aefa89 GIT binary patch literal 850520 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

mU86qsa~B!N1T@YF_dx&~Wp7^>EG9 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 z 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≠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�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

#;J2OwSiCT~;W65o1 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%0DmLA?|7c{${9lAR*T8&zGO{* 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ê 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 E0aJ?fAOHXW literal 0 HcmV?d00001 diff --git a/vendor/pageant_sha1.exe b/vendor/pageant_sha1.exe deleted file mode 100644 index f11c3780025ac6010753ca49a9fa029ecd658b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147456 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

9e)kJ^9)_>C#6xU(w1|Pwk$}yt_Om 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 Urs$DCT65;8wi;G7uyPIj5C2^W5dZ)H diff --git a/vendor/private.ppk b/vendor/private.ppk deleted file mode 100644 index e69837aaa..000000000 --- a/vendor/private.ppk +++ /dev/null @@ -1,26 +0,0 @@ -PuTTY-User-Key-File-2: ssh-rsa -Encryption: none -Comment: rsa-key-20141021 -Public-Lines: 6 -AAAAB3NzaC1yc2EAAAABJQAAAQEAkr6tlPb0QODfJJRhwsSsN88TSB6pgk/6x1KM -yVuDE6SeKz5sB4iaQfPleLSaWxuQEKkoa4sLAROy18lSk0PMioQHM6tgXbOcpTbS -Yf6uf1wtAMeFTO7vP0ZuIXbYmBmsK4DK1GWQq3Db5+Q/xbDp20dlCvCPMdokhYFr -N2B9G0C4AKgXRMS+loEXwOeQiupfYcUXfZiCOoviArCcLgRsUNZTeTbP03skLBDr -2xMdpaGx8QgSylz+yGeXRNjXaxE2mnwwVkBnNYsInZhw4/OdxddyilDealpcwp7x -enAwWsoLd9NlpskNCEQsznPMAe66/PKvRGl22+8tpNBzDbnZsw== -Private-Lines: 14 -AAABABPUk/9fpHd4VYF71dwMvVOmXI00k3J5gsD9UUuklSwrAJ4PWrTo8kBDjbZd -mFGAQ+aTZlO41/k6A2lEuCG9Dc2HdphHl2abuzjru5CztrdDzrrqh6Kc1Dj7rgSF -rpEYOdxdgzF1gkCuYuf8P/ge035/RQF6dDcrUQsfU62JlF2gwQpVbQZ97DC9uGtt -ktYY0pSVU36xty4uQ148mOC8TXWFOxaGPOFq14sxmBUFVhHsmHnytQULIkibRCze -bfkpJNAizNKTNCfupd3aub205kzG48blZ3eWxYtK3mreiSDvhdWNWiyVhTajkXGQ -r3a+AqE/8e5Qks7ekzbpKk388a0AAACBAOftyBzFLENp3ccimF7ctlS44H2hfas4 -2PQVbDpCKrY1u0XC+vn/GqgAVq/hcHeK6DrkaEK23Q30phNN7+8BDzR1VxO27TLg -UdwFE0z/0jnTuwkJcusO7bCb3dGGUX4ENSyRpNJVyu4X4iKuz03+ccPD3utkTIMI -zCskK5VQT0MBAAAAgQCh+ZsG6SfakMD76b3zF3xaw8bJmPe+q/YumlDDbM6sG9q+ -3Fp5trBBJbGjXhTCyUkOuWiUh8cmVBFYRHrtz9GLVCOXVd6yYOzHlTKSNRnu7Slt -jdX1s0QphmPlQ6/uyUIAhrIrOkVFKNrV10Kex/7jwwdfL8i1cecng+dxfE4AswAA -AIEAiWClSrfWJTIKa3CZtIxlbHFHNLAVEuDjGeyKIMZ96qDEM7jDQ4vUzAagw60D -qUsJQMyx9RFfSLDYE3TZaXGrGdSXcFBz9f9xLcWLe/2LH7NUmjpUf5GnlMSs7+Br -ET2wiPd6NDf1kka+4+zMOgFqJF44xgDuNLnM3ty4EFlfzlY= -Private-MAC: 6e0ff7c94a3253c5e45b3e06951e04d2b06e6262 From 9d6fed966b3d7570c8d216849b839b26c01f7d2c Mon Sep 17 00:00:00 2001 From: John Alden Date: Mon, 17 Nov 2025 15:44:00 -0700 Subject: [PATCH 537/545] add macos arm64 tests and prebuilts --- .github/workflows/tests.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 218fca650..3cd6aae10 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -72,10 +72,9 @@ jobs: strategy: matrix: node: [20, 22, 24] + arch: [x64, arm64] fail-fast: false - runs-on: macOS-13 - # This is mostly the same as the Linux steps, waiting for anchor support - # https://github.com/actions/runner/issues/1182 + runs-on: ${{ matrix.arch == 'x64' && 'macos-15-intel' || 'macos-15' }} steps: - uses: actions/checkout@v4 From 1818a7d5a93dab32e5b3f74e774c88664abf7acf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 18:34:31 +0000 Subject: [PATCH 538/545] Bump tar-fs from 3.0.9 to 3.1.1 Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 3.0.9 to 3.1.1. - [Commits](https://github.com/mafintosh/tar-fs/compare/v3.0.9...v3.1.1) --- updated-dependencies: - dependency-name: tar-fs dependency-version: 3.1.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64454026d..470a58606 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5195,10 +5195,9 @@ } }, "node_modules/tar-fs": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", - "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -9686,9 +9685,9 @@ } }, "tar-fs": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", - "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "requires": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0", From d8db070d7456768675ed9aa811d8e55523539ab8 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 21 Nov 2025 15:38:52 -0700 Subject: [PATCH 539/545] fix incorrect git_time_t narrowing --- generate/input/libgit2-supplement.json | 6 ------ generate/scripts/helpers.js | 3 ++- test/tests/commit.js | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 742216f03..12ee8945b 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -2444,12 +2444,6 @@ } } ], - [ - "git_time_t", - { - "type": "enum" - } - ], [ "git_trace_level_t", { diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index 15790983f..e278e1cc0 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -25,7 +25,8 @@ var cTypeMappings = { "uint32_t": "Number", "uint64_t": "Number", "double": "Number", - "git_object_size_t": "Number" + "git_object_size_t": "Number", + "git_time_t": "Number", } var collisionMappings = { diff --git a/test/tests/commit.js b/test/tests/commit.js index 69868333c..8ff9b8ea7 100644 --- a/test/tests/commit.js +++ b/test/tests/commit.js @@ -286,7 +286,7 @@ describe("Commit", function() { it("can amend commit", function(){ var commitToAmendId = "315e77328ef596f3bc065d8ac6dd2c72c09de8a5"; - var expectedAmendedCommitId = "57836e96555243666ea74ea888310cc7c41d4613"; + var expectedAmendedCommitId = "a41de0d1c3dc169c873dd03bd9240d9f88e60ffc"; var fileName = "newfile.txt"; var fileContent = "hello world"; var newFileName = "newerfile.txt"; From c999ce2f387f3fdc04dba21c3263997bc2b6af91 Mon Sep 17 00:00:00 2001 From: John Alden Date: Fri, 21 Nov 2025 22:05:34 -0700 Subject: [PATCH 540/545] Bump to v0.28.0-alpha.36 --- CHANGELOG.md | 20 ++++++++++++++++++-- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57d0616de..d7c020aac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,22 @@ # Change Log -## v0.28.0-alpha.35 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.35) +## v0.28.0-alpha.36 [(2025-11-21)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.36) + +[Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.35...v0.28.0-alpha.36) + +#### Summary of Changes + - Use openssl unconditionally for linux electron builds + - Fix cross-compiling libssh2 + - Fix Windows SSH keys, tests, documentation + - Add CI tests and Prebuilts for MacOS arm64 + - Bump tar-fsa to fix security vulnerabilities + +#### Merged PRs into NodeGit +- [Bump tar-fs from 3.0.9 to 3.1.1](https://github.com/nodegit/nodegit/pull/2034) +- [Use custom electron for non-static builds on linux and fix cross-compilation](https://github.com/nodegit/nodegit/pull/2033) +- [add macos arm64 tests and prebuilts](https://github.com/nodegit/nodegit/pull/2030) + +## v0.28.0-alpha.35 [(2025-11-14)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.35) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.34...v0.28.0-alpha.35) @@ -16,7 +32,7 @@ - [fix: correct macos arch labels](github.com/nodegit/nodegit/pull/2027) - [Add Ability to compile for arm64](https://github.com/nodegit/nodegit/pull/2028) -## v0.28.0-alpha.34 [(2025-06-03)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.34) +## v0.28.0-alpha.34 [(2025-07-23)](https://github.com/nodegit/nodegit/releases/tag/v0.28.0-alpha.34) [Full Changelog](https://github.com/nodegit/nodegit/compare/v0.28.0-alpha.33...v0.28.0-alpha.34) diff --git a/package-lock.json b/package-lock.json index 470a58606..9d9e87f01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodegit", - "version": "0.28.0-alpha.35", + "version": "0.28.0-alpha.36", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodegit", - "version": "0.28.0-alpha.35", + "version": "0.28.0-alpha.36", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index ca97223da..4ac0afddb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nodegit", "description": "Node.js libgit2 asynchronous native bindings", - "version": "0.28.0-alpha.35", + "version": "0.28.0-alpha.36", "homepage": "http://nodegit.org", "keywords": [ "libgit2", From 0e1f4de44045579a03e411cddfa1e61067a3a703 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 26 Nov 2025 12:01:27 -0700 Subject: [PATCH 541/545] switch back to upstream nan version --- generate/templates/templates/binding.gyp | 2 +- package-lock.json | 53 +++++++++--------------- package.json | 2 +- 3 files changed, 22 insertions(+), 35 deletions(-) diff --git a/generate/templates/templates/binding.gyp b/generate/templates/templates/binding.gyp index 741d964cc..4476c9236 100644 --- a/generate/templates/templates/binding.gyp +++ b/generate/templates/templates/binding.gyp @@ -56,7 +56,7 @@ "include_dirs": [ "vendor/libv8-convert", "vendor/libssh2/include", - "=6.0.0" } }, - "node_modules/@axosoft/nan": { - "version": "2.22.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.22.0-gk.1.tgz", - "integrity": "sha512-C4xrZ5HQoWwoq/WZnKDhf/Jd/czIaa0gsjHV792qUp7b7H+4Xtw1Um10BiiU/zrgmGhQuA92dedU2/rGvKErNg==", - "license": "MIT" - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -85,6 +79,7 @@ "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -899,6 +894,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -1759,15 +1755,6 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3985,6 +3972,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/nan": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.1.tgz", + "integrity": "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==", + "license": "MIT" + }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -4522,6 +4515,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -5968,11 +5962,6 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, - "@axosoft/nan": { - "version": "2.22.0-gk.1", - "resolved": "https://registry.npmjs.org/@axosoft/nan/-/nan-2.22.0-gk.1.tgz", - "integrity": "sha512-C4xrZ5HQoWwoq/WZnKDhf/Jd/czIaa0gsjHV792qUp7b7H+4Xtw1Um10BiiU/zrgmGhQuA92dedU2/rGvKErNg==" - }, "@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -5995,6 +5984,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, + "peer": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -6544,6 +6534,7 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, + "peer": true, "requires": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -7197,15 +7188,6 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -7725,8 +7707,7 @@ } }, "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "optional": true, "requires": { @@ -8810,6 +8791,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "nan": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.1.tgz", + "integrity": "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==" + }, "negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -9197,7 +9183,8 @@ "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "peer": true }, "pkg-dir": { "version": "4.2.0", diff --git a/package.json b/package.json index 4ac0afddb..41ccc32dc 100644 --- a/package.json +++ b/package.json @@ -38,12 +38,12 @@ "node": ">= 20" }, "dependencies": { - "@axosoft/nan": "^2.22.0-gk.1", "@mapbox/node-pre-gyp": "^2.0.0", "fs-extra": "^7.0.0", "got": "^14.4.7", "json5": "^2.1.0", "lodash": "^4.17.14", + "nan": "^2.23.1", "node-gyp": "^11.2.0", "tar-fs": "^3.0.9" }, From 03b5353ca55c67a1ffdb3c4dc42a5d6fb19cf7de Mon Sep 17 00:00:00 2001 From: John Alden Date: Sat, 15 Oct 2022 01:55:32 -0700 Subject: [PATCH 542/545] Fix Alloc-Dealloc Mismatches --- .../manual/repository/refresh_references.cc | 14 +++++++------- .../templates/manual/revwalk/file_history_walk.cc | 8 ++++++++ generate/templates/templates/struct_content.cc | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/generate/templates/manual/repository/refresh_references.cc b/generate/templates/manual/repository/refresh_references.cc index 5ddaec57f..5194f1c48 100644 --- a/generate/templates/manual/repository/refresh_references.cc +++ b/generate/templates/manual/repository/refresh_references.cc @@ -244,10 +244,10 @@ class RefreshedRefModel { } ~RefreshedRefModel() { - if (fullName != NULL) { delete[] fullName; } - if (message != NULL) { delete[] message; } + if (fullName != NULL) { free(fullName); } + if (message != NULL) { free(message); } delete[] sha; - if (shorthand != NULL) { delete[] shorthand; } + if (shorthand != NULL) { free(shorthand); } if (tagOdbBuffer != NULL) { delete[] tagOdbBuffer; } } @@ -344,8 +344,8 @@ class UpstreamModel { } ~UpstreamModel() { - if (downstreamFullName != NULL) { delete[] downstreamFullName; } - if (upstreamFullName != NULL) { delete[] upstreamFullName; } + if (downstreamFullName != NULL) { free(downstreamFullName); } + if (upstreamFullName != NULL) { free(upstreamFullName); } } char *downstreamFullName; @@ -375,7 +375,7 @@ class RefreshReferencesData { delete upstreamInfo.back(); upstreamInfo.pop_back(); } - if (headRefFullName != NULL) { delete[] headRefFullName; } + if (headRefFullName != NULL) { free(headRefFullName); } if (cherrypick != NULL) { delete cherrypick; } if (merge != NULL) { delete merge; } } @@ -573,7 +573,7 @@ void GitRepository::RefreshReferencesWorker::Execute() if (isRemote) { char *remoteNameOfRef = getRemoteNameOfReference(reference); bool isFromExistingRemote = gitStrArrayContains(&remoteNames, remoteNameOfRef); - delete[] remoteNameOfRef; + free(remoteNameOfRef); if (!isFromExistingRemote) { git_reference_free(reference); continue; diff --git a/generate/templates/manual/revwalk/file_history_walk.cc b/generate/templates/manual/revwalk/file_history_walk.cc index 714d6f5db..569bb022d 100644 --- a/generate/templates/manual/revwalk/file_history_walk.cc +++ b/generate/templates/manual/revwalk/file_history_walk.cc @@ -31,6 +31,14 @@ class FileHistoryEvent { if (commit != NULL) { git_commit_free(commit); } + + if(from != NULL) { + free((void *)from); + } + + if(to != NULL) { + free((void *)to); + } } v8::Local toJavascript() { diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index e2f01ca58..d79396f76 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -121,7 +121,7 @@ Configurable{{ cppClassName }}::Configurable{{ cppClassName }}(nodegit::Context this->raw = new {{ cType }}; {% else %} {{ cType }}{% if isExtendedStruct %}_extended{% endif %} wrappedValue = {{ cType|upper }}_INIT; - this->raw = ({{ cType }}*) malloc(sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); + this->raw = ({{ cType }}*) new {{ cType }}{% if isExtendedStruct %}_extended{% endif %}; memcpy(this->raw, &wrappedValue, sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); {% endif %} } @@ -132,7 +132,7 @@ Configurable{{ cppClassName }}::~Configurable{{ cppClassName }}() { {% if field.cppClassName == 'GitStrarray' %} if (this->raw->{{ field.name }}.count) { for (size_t i = 0; i < this->raw->{{ field.name }}.count; ++i) { - delete this->raw->{{ field.name }}.strings[i]; + free(this->raw->{{ field.name }}.strings[i]); } delete[] this->raw->{{ field.name }}.strings; } From 03ce68b5922364ec2d37767b633606ba49db403d Mon Sep 17 00:00:00 2001 From: John Alden Date: Tue, 18 Oct 2022 11:03:17 -0700 Subject: [PATCH 543/545] add a couple more fixes from julian --- .../templates/manual/include/configurable_class_wrapper.h | 2 +- generate/templates/manual/src/str_array_converter.cc | 4 ++-- generate/templates/templates/struct_content.cc | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/generate/templates/manual/include/configurable_class_wrapper.h b/generate/templates/manual/include/configurable_class_wrapper.h index 283eb7e44..ff83a3176 100644 --- a/generate/templates/manual/include/configurable_class_wrapper.h +++ b/generate/templates/manual/include/configurable_class_wrapper.h @@ -40,7 +40,7 @@ namespace nodegit { virtual ~ConfigurableClassWrapper() { if (raw != nullptr) { - delete raw; + free(raw); raw = nullptr; } } diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index 732f16cf2..5d04c6562 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -65,7 +65,7 @@ git_strarray *StrArrayConverter::ConstructStrArray(int argc, char** argv) { void StrArrayConverter::ConvertInto(git_strarray *out, v8::Local val) { out->count = val->Length(); - out->strings = new char *[out->count]; + out->strings = (char**) malloc(out->count * sizeof(char*)); for (uint32_t i = 0; i < out->count; ++i) { Nan::Utf8String utf8String(Nan::Get(val, i).ToLocalChecked().As()); out->strings[i] = strdup(*utf8String); @@ -75,6 +75,6 @@ void StrArrayConverter::ConvertInto(git_strarray *out, v8::Local val) void StrArrayConverter::ConvertInto(git_strarray *out, v8::Local val) { Nan::Utf8String utf8String(val); out->count = 1; - out->strings = new char *[1]; + out->strings = (char**) malloc(out->count * sizeof(char*)); out->strings[0] = strdup(*utf8String); } diff --git a/generate/templates/templates/struct_content.cc b/generate/templates/templates/struct_content.cc index d79396f76..d7355d2a2 100644 --- a/generate/templates/templates/struct_content.cc +++ b/generate/templates/templates/struct_content.cc @@ -118,10 +118,10 @@ Configurable{{ cppClassName }}::Configurable{{ cppClassName }}(nodegit::Context : nodegit::ConfigurableClassWrapper<{{ cppClassName }}Traits>(nodegitContext) { {% if ignoreInit == true %} - this->raw = new {{ cType }}; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }})); {% else %} {{ cType }}{% if isExtendedStruct %}_extended{% endif %} wrappedValue = {{ cType|upper }}_INIT; - this->raw = ({{ cType }}*) new {{ cType }}{% if isExtendedStruct %}_extended{% endif %}; + this->raw = ({{ cType }}*) malloc(sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); memcpy(this->raw, &wrappedValue, sizeof({{ cType }}{% if isExtendedStruct %}_extended{% endif %})); {% endif %} } @@ -134,10 +134,10 @@ Configurable{{ cppClassName }}::~Configurable{{ cppClassName }}() { for (size_t i = 0; i < this->raw->{{ field.name }}.count; ++i) { free(this->raw->{{ field.name }}.strings[i]); } - delete[] this->raw->{{ field.name }}.strings; + free(this->raw->{{ field.name }}.strings); } {% elsif field.cppClassName == 'String' %} - delete this->raw->{{ field.name }}; + free((void*)this->raw->{{ field.name }}); {% endif %} {% endif %} {% endeach %} From 231f4721dc97775c1a22ba267ced7e9885bcdf33 Mon Sep 17 00:00:00 2001 From: John Alden Date: Wed, 19 Oct 2022 10:08:49 -0700 Subject: [PATCH 544/545] add yet more fixes from Julian --- generate/templates/partials/async_function.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/generate/templates/partials/async_function.cc b/generate/templates/partials/async_function.cc index a294043fa..d23ec7f60 100644 --- a/generate/templates/partials/async_function.cc +++ b/generate/templates/partials/async_function.cc @@ -56,7 +56,7 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { {% if arg.cppClassName == 'Array' %} { v8::Local tempArray = v8::Local::Cast(info[{{ arg.jsArg }}]); - baton->{{ arg.name }} = new {{ arg.cType|unPointer }}[tempArray->Length()]; + baton->{{ arg.name }} = ({{ arg.cType|unPointer }}*)malloc(sizeof({{ arg.cType|unPointer }}) * tempArray->Length()); for (uint32_t i = 0; i < tempArray->Length(); ++i) { auto conversionResult = Configurable{{ arg.arrayElementCppClassName }}::fromJavascript( nodegitContext, @@ -64,12 +64,13 @@ NAN_METHOD({{ cppClassName }}::{{ cppFunctionName }}) { ); if (!conversionResult.result) { - delete[] baton->{{ arg.name }}; + // TODO free previously allocated memory + free(baton->{{ arg.name }}); return Nan::ThrowError(Nan::New(conversionResult.error).ToLocalChecked()); } auto convertedObject = conversionResult.result; - cleanupHandles["{{ arg.name }}"] = convertedObject; + cleanupHandles[std::string("{{ arg.name }}") + std::to_string(i)] = convertedObject; baton->{{ arg.name }}[i] = *convertedObject->GetValue(); } } From 40f7fa97161703600109928cdf7e5ee4584c12af Mon Sep 17 00:00:00 2001 From: Trevor McMaster Date: Fri, 3 Mar 2023 13:08:21 -0700 Subject: [PATCH 545/545] Added missing sshKeyMemoryNew to Cred Fixes https://github.com/nodegit/nodegit/issues/1962 --- lib/credential.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/credential.js b/lib/credential.js index db1f82a78..af1a59125 100644 --- a/lib/credential.js +++ b/lib/credential.js @@ -16,6 +16,7 @@ NodeGit.Cred = { defaultNew: deprecatedFn("defaultNew"), sshKeyFromAgent: deprecatedFn("sshKeyFromAgent"), sshKeyNew: deprecatedFn("sshKeyNew"), + sshKeyMemoryNew: deprecatedFn("sshKeyMemoryNew"), usernameNew: deprecatedFn("usernameNew"), userpassPlaintextNew: deprecatedFn("userpassPlaintextNew"), TYPE: Object.keys(Credential.TYPE).reduce(

v{)(xF3<(%5xkYR8GocSH}GuWH4ML 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 NhKK9I##U@>{{|rRDlPy3 diff --git a/vendor/pageant/pageant_arm64.exe b/vendor/pageant/pageant_arm64.exe new file mode 100644 index 0000000000000000000000000000000000000000..1f5516f6c5ea33f14ac0537f3cbb6332b952cdc2 GIT binary patch literal 900696 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